diff --git b/Base_core/AESLIB/AES/AES.c a/Base_core/AESLIB/AES/AES.c new file mode 100644 index 0000000..ca5b2b0 --- /dev/null +++ a/Base_core/AESLIB/AES/AES.c @@ -0,0 +1,848 @@ +#include +#include +#include +#include /* Standard I/O .h-file */ +#include /* Character functions */ +#include /* String and memory functions */ +#include +#include +#include +#include "AES.h" + +//#include "main.h" +//#include "stm32l4xx_hal.h" +//#include "stm32f10x.h" //要调用CRC硬件时钟使能 +//#include "stm32f4xx.h" + + +//extern uint8_t iKey; +//extern +//uint8_t AesMode;//加密模式 + +// The number of columns comprising a state in AES. This is a constant in AES. Value=4 +#define Nb 4 + +// The number of rounds in AES Cipher. It is simply initiated to zero. The actual value is recieved in the program. +int Nr=0; + +// The number of 32 bit words in the key. It is simply initiated to zero. The actual value is recieved in the program. +int Nk=0; + +//Nc: the length of Key(128, 192 or 256) only +#ifdef AES256MODE +int Nc = 256; +#else +int Nc = 128; +#endif + +// in - it is the array that holds the CipherText to be decrypted. +// out - it is the array that holds the output of the for decryption. +// state - the array that holds the intermediate results during decryption. +unsigned char in[16], out[32], state[4][4]; + +// The array that stores the round keys. +unsigned char RoundKey[RoundKeyLEN]; + +// The Key input to the AES Program +unsigned char Key[32]; + +#define AES_TEMP_BUFF_LEN 1024 + +unsigned char iKey;//测试验证用 + +const uint8_t rsbox[256] = +{ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb +, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb +, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e +, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25 +, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92 +, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84 +, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06 +, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b +, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73 +, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e +, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b +, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4 +, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f +, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef +, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61 +, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d }; +uint8_t getSBoxInvert(uint8_t num) +{ + return rsbox[num]; +} +const uint8_t sbox[256] = { + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; +uint8_t getSBoxValue(uint8_t num) +{ + return sbox[num]; +} + +// The round constant word array, Rcon[i], contains the values given by +// x to th e power (i-1) being powers of x (x is denoted as {02}) in the field GF(2^8) +// Note that i starts at 1, not 0). +const uint8_t Rcon[255] = { + 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, + 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, + 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, + 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, + 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, + 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, + 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, + 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, + 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, + 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, + 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, + 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, + 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, + 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, + 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, + 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb }; + +// This function produces Nb(Nr+1) round keys. The round keys are used in each round to decrypt the states. +void KeyExpansion() +{ + int i; + unsigned char temp[4],k; + unsigned char middlei=0,middlek=0; + + // The first round key is the key itself. +// for(i=0;i 6 && i % Nk == 4) + { + { + temp[0]=getSBoxValue(temp[0]); + temp[1]=getSBoxValue(temp[1]); + temp[2]=getSBoxValue(temp[2]); + temp[3]=getSBoxValue(temp[3]); + } + } + middlei=i<<2; + middlek=(i-Nk)<<2; + + *(RoundKey+middlei) = (*(RoundKey+middlek)) ^ (*temp); + *(RoundKey+middlei+1) = (*(RoundKey+middlek+1)) ^ (*(temp+1)); + *(RoundKey+middlei+2) = (*(RoundKey+middlek+2)) ^ (*(temp+2)); + *(RoundKey+middlei+3) = (*(RoundKey+middlek+3)) ^ (*(temp+3)); + i++; + } +} + +// This function adds the round key to state. +// The round key is added to the state by an XOR function. +void AddRoundKey(int round) +{ + int i,j,k; + k = round <<4; + for(i=0;i<4;i++) + { + for(j=0;j<4;j++) + { + *(*(state+j)+i) ^= *(RoundKey+k + (i<<2) + j); + } + } +} + +// The SubBytes Function Substitutes the values in the +// state matrix with values in an S-box. +void InvSubBytes() +{ + int i,j; + for(i=0;i<4;i++) + { + for(j=0;j<4;j++) + { + *(*(state+i)+j) = *(rsbox+*(*(state+i)+j)); + + } + } +} + +// The ShiftRows() function shifts the rows in the state to the left. +// Each row is shifted with different offset. +// Offset = Row number. So the first row is not shifted. +void InvShiftRows() +{ + unsigned char temp; + + temp=*(*(state+1)+3); + *(*(state+1)+3)=*(*(state+1)+2); + *(*(state+1)+2)=*(*(state+1)+1); + *(*(state+1)+1)=*(*(state+1)); + *(*(state+1))=temp; + + // Rotate second row 2 columns to right + temp=*(*(state+2)); + *(*(state+2))=*(*(state+2)+2); + *(*(state+2)+2)=temp; + + temp=*(*(state+2)+1); + *(*(state+2)+1)=*(*(state+2)+3); + *(*(state+2)+3)=temp; + + // Rotate third row 3 columns to right + temp=*(*(state+3)); + state[3][0]=*(*(state+3)+1); + *(*(state+3)+1)=*(*(state+3)+2); + *(*(state+3)+2)=*(*(state+3)+3); + *(*(state+3)+3)=temp; + +} + +typedef struct{ + unsigned char a:7; + unsigned char b:1; + }bits; + +union{ + bits bit; + unsigned char bytes; +}asBytes; + +// xtime is a macro that finds the product of {02} and the argument to xtime modulo {1b} +#define xtime(x) ((x<<1) ^ (((x>>7) & 1) * 0x1b)) +#define xtime1(x) (x<<1) +#define xtime2(x) ((x<<1) ^0x1b) +// Multiplty is a macro used to multiply numbers in the field GF(2^8) +//#define Multiply(x,y) (((y & 1) * x) ^ ((y>>1 & 1) * xtime(x)) ^ ((y>>2 & 1) * xtime(xtime(x))) ^ ((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ ((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))) +// MixColumns function mixes the columns of the state matrix. +// The method used to multiply may be difficult to understand for the inexperienced. +// Please use the references to gain more information. +void InvMixColumns() +{ + int i,j; + unsigned char at[4],bt[4],ct[4],dt[4]; + unsigned char at23,at03,bt23,bt03,ct23,ct03,dt23,dt03; + + for(i=0;i<4;i++) + { + *at = *(*state + i); + *bt = *(*(state+1) + i); + *ct = *(*(state+2) + i); + *dt = *(*(state+3) + i); + for(j=1;j<4;j++) + { + *(at+j)=xtime(*(at+j-1)); + *(bt+j)=xtime(*(bt+j-1)); + *(ct+j)=xtime(*(ct+j-1)); + *(dt+j)=xtime(*(dt+j-1)); + } + at23= at[2]^at[3]; + at03= at[0]^at[3]; + bt23= bt[2]^bt[3]; + bt03= bt[0]^bt[3]; + ct23= ct[2]^ct[3]; + ct03= ct[0]^ct[3]; + dt23= dt[2]^dt[3]; + dt03= dt[0]^dt[3]; + *(*(state) + i) = at[1]^at23 ^bt03^bt[1] ^ct[0]^ct23 ^dt03; + *(*(state+1) + i) = at03 ^bt[1]^bt23 ^ct03^ct[1] ^dt[0]^dt23; + *(*(state+2) + i) = at[0]^at23 ^bt03 ^ct[1]^ct23 ^dt03^dt[1]; + *(*(state+3) + i) = at03^at[1] ^bt[0]^bt23 ^ct03^dt[1] ^dt23; + } +} + +// InvCipher is the main function that decrypts the CipherText. +void InvCipher() +{ + int i,j,round=0; + + //Copy the input CipherText to state array. + for(i=0;i<4;i++) + { + for(j=0;j<4;j++) + { + *(*(state+j)+i) = in[(i<<2) + j]; + } + } + + // Add the First round key to the state before starting the rounds. + AddRoundKey(Nr); + + // There will be Nr rounds. + // The first Nr-1 rounds are identical. + // These Nr-1 rounds are executed in the loop below. + for(round=Nr-1;round>0;round--) + { + InvShiftRows(); + InvSubBytes(); + AddRoundKey(round); + InvMixColumns(); //这段代码太耗时间 + } + + // The last round is given below. + // The MixColumns function is not here in the last round. + InvShiftRows(); + InvSubBytes(); + AddRoundKey(0); + + // The decryption process is over. + // Copy the state array to output array. + for(i=0;i<4;i++) + { + for(j=0;j<4;j++) + { + *(out+(i<<2)+j)=*(*(state+j)+i); + } + } +} + +// The SubBytes Function Substitutes the values in the +// state matrix with values in an S-box. +void SubBytes() +{ + int i,j; + for(i=0;i<4;i++) + { + for(j=0;j<4;j++) + { + state[i][j] = sbox[state[i][j]]; + + } + } +} + +// The ShiftRows() function shifts the rows in the state to the left. +// Each row is shifted with different offset. +// Offset = Row number. So the first row is not shifted. +void ShiftRows() +{ + unsigned char temp; + + // Rotate first row 1 columns to left + temp=state[1][0]; + state[1][0]=state[1][1]; + state[1][1]=state[1][2]; + state[1][2]=state[1][3]; + state[1][3]=temp; + + // Rotate second row 2 columns to left + temp=state[2][0]; + state[2][0]=state[2][2]; + state[2][2]=temp; + + temp=state[2][1]; + state[2][1]=state[2][3]; + state[2][3]=temp; + + // Rotate third row 3 columns to left + temp=state[3][0]; + state[3][0]=state[3][3]; + state[3][3]=state[3][2]; + state[3][2]=state[3][1]; + state[3][1]=temp; +} + +// xtime is a macro that finds the product of {02} and the argument to xtime modulo {1b} +#define xtime(x) ((x<<1) ^ (((x>>7) & 1) * 0x1b)) + +// MixColumns function mixes the columns of the state matrix +void MixColumns() +{ + int i; + unsigned char Tmp,Tm,t; + for(i=0;i<4;i++) + { + t=state[0][i]; + Tmp = state[0][i] ^ state[1][i] ^ state[2][i] ^ state[3][i] ; + Tm = state[0][i] ^ state[1][i] ; Tm = xtime(Tm); state[0][i] ^= Tm ^ Tmp ; + Tm = state[1][i] ^ state[2][i] ; Tm = xtime(Tm); state[1][i] ^= Tm ^ Tmp ; + Tm = state[2][i] ^ state[3][i] ; Tm = xtime(Tm); state[2][i] ^= Tm ^ Tmp ; + Tm = state[3][i] ^ t ; Tm = xtime(Tm); state[3][i] ^= Tm ^ Tmp ; + } +} + +// Cipher is the main function that encrypts the PlainText. +void Cipher() +{ + int i,j,round=0; + + //Copy the input PlainText to state array. + for(i=0;i<4;i++) + { + for(j=0;j<4;j++) + { + state[j][i] = in[(i<<2) + j]; + } + } + + // Add the First round key to the state before starting the rounds. + AddRoundKey(0); + + // There will be Nr rounds. + // The first Nr-1 rounds are identical. + // These Nr-1 rounds are executed in the loop below. + for(round=1;round 0 ) + { + *Base64String ++ = Base64Encode[(OrgString[0] >> 2 ) & 0x3f]; + if( OrgStringLen > 2 ) + { + *Base64String ++ = Base64Encode[((OrgString[0] & 3) << 4) | (OrgString[1] >> 4)]; + *Base64String ++ = Base64Encode[((OrgString[1] & 0xF) << 2) | (OrgString[2] >> 6)]; + *Base64String ++ = Base64Encode[OrgString[2] & 0x3F]; + } + else + { + switch( OrgStringLen ) + { + case 1: + *Base64String ++ = Base64Encode[(OrgString[0] & 3) << 4 ]; + *Base64String ++ = '='; + *Base64String ++ = '='; + break; + case 2: + *Base64String ++ = Base64Encode[((OrgString[0] & 3) << 4) | (OrgString[1] >> 4)]; + *Base64String ++ = Base64Encode[((OrgString[1] & 0x0F) << 2) | (OrgString[2] >> 6)]; + *Base64String ++ = '='; + break; + } + } + + OrgString +=3; + OrgStringLen -=3; + Base64StringLen +=4; + } + + *Base64String = 0; + return Base64StringLen; +} +////////////////////////////////////////////////////////////////////////////////////////// +//Base64 ?? +char GetBase64Value(char ch) //????? +{ + if ((ch >= 'A') && (ch <= 'Z')) // A ~ Z + return ch - 'A'; + if ((ch >= 'a') && (ch <= 'z')) // a ~ z + return ch - 'a' + 26; + if ((ch >= '0') && (ch <= '9')) // 0 ~ 9 + return ch - '0' + 52; + switch (ch) // ???? + { + case '+': + return 62; + case '/': + return 63; + case '=': //Base64 ???? + return 0; + default: + return 0; + } +} +// ???? +int Base64Decode( char *OrgString, char *Base64String, int Base64StringLen, bool bForceDecode ) //???? +{ + // OrgString ??????????? + // Base64String ???????? + // Base64StringLen ???????? + // bForceDecode ????????????,?????? + // true ???? + // false ????? + unsigned char Base64Encode[4]; + unsigned char denghaoNum = 0; + unsigned char i; + int OrgStringLen=0; + if( Base64StringLen % 4 && !bForceDecode ) //???? 4 ???,? Base64 ????? + { + OrgString[0] = '\0'; + return -1; + } + for (i=Base64StringLen-1; i>0; i--) + { + if (Base64String[i] == '=') + denghaoNum++; + else + break; + } + + + while( Base64StringLen > 2 ) + { + Base64Encode[0] = GetBase64Value(Base64String[0]); + Base64Encode[1] = GetBase64Value(Base64String[1]); + Base64Encode[2] = GetBase64Value(Base64String[2]); + Base64Encode[3] = GetBase64Value(Base64String[3]); + + *OrgString ++ = (Base64Encode[0] << 2) | (Base64Encode[1] >> 4); + *OrgString ++ = (Base64Encode[1] << 4) | (Base64Encode[2] >> 2); + *OrgString ++ = (Base64Encode[2] << 6) | (Base64Encode[3]); + + Base64String += 4; + Base64StringLen -= 4; + OrgStringLen += 3; + } + + return OrgStringLen-denghaoNum; +} + + + + + + + + + + + + + + + +//####以上是纯软件加密实现底层,以下是软件加密接口层####################### + +void AES_Encrypt(char* pExpressText , char* pCipherText , char* pAeskey,unsigned char _256_mode) +{ + char* str=NULL; + + if (_256_mode==0) Nc=128;else Nc=256;//软件是AES128还是256 + + //pExpressText:待加密的明文数据,pkey:加密密钥 str:加密后的数据 + str = encrypt(pExpressText, pAeskey); //aesTempBuff[AES_TEMP_BUFF_LEN] + //memcpy(pCipherText,str,strlen(str));//不能用strlen,否则有数据0就错了 + memcpy(pCipherText,str,16); + + //str:待编码的数据 pCipherText:编码后的数据 aesDataLen:待编码的长度 +// Base64Encode(str, pCipherText,aesDataLen);//编码长度有变化 故这里不需要 + free(str); + +} + + +void AES_Decrypt(char* pExpressText , char* pCipherText , char* pAeskey,unsigned char _256_mode) +{ + char* str2; + if (_256_mode==0) Nc=128;else Nc=256; + //send_buff:待解密的数据 ,pkey:密钥 str2:解密后的数据 + str2 = decrypt(pCipherText, pAeskey , 16); + memcpy(pExpressText,str2,16); + free(str2); +} + + + +//#######STM官方演示函数接口################################ +//注意:要打开硬件CRC效验时钟,库使用了硬件CRC + +#define __CRC_CLK_ENABLE() RCC->AHBENR |= (RCC_AHBENR_CRCEN) + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + * @brief AES ECB Encryption example. + * @param InputMessage: pointer to input message to be encrypted. + * @param InputMessageLength: input data message length in byte. + * @param AES128_Key: pointer to the AES key to be used in the operation + * @param OutputMessage: pointer to output parameter that will handle the encrypted message + * @param OutputMessageLength: pointer to encrypted message length. + * @retval error status: can be AES_SUCCESS if success or one of + * AES_ERR_BAD_INPUT_SIZE, AES_ERR_BAD_OPERATION, AES_ERR_BAD_CONTEXT + * AES_ERR_BAD_PARAMETER if error occured. + */ +int32_t STM32_AES_ECB_Encrypt(uint8_t* InputMessage, + uint32_t InputMessageLength, + uint8_t *AES256_Key, + uint8_t *OutputMessage, + uint32_t *OutputMessageLength,unsigned char _256_mode) +{ + AESECBctx_stt AESctx; + + uint32_t error_status = AES_SUCCESS; + + int32_t outputLength = 0; + + /* Set flag field to default value */ + AESctx.mFlags = E_SK_DEFAULT; + + #ifndef AES256EN + /* Set key size to 32 (corresponding to AES-256) */ + AESctx.mKeySize = 16;//AES128使用16字节 + #else + if (_256_mode==0)//加密模式 + AESctx.mKeySize = 16;//AES128使用16字节 + else + AESctx.mKeySize = 32; + #endif + + /* Initialize the operation, by passing the key. + * Third parameter is NULL because ECB doesn't use any IV */ + error_status = AES_ECB_Encrypt_Init(&AESctx, AES256_Key, NULL ); + + /* check for initialization errors */ + if (error_status == AES_SUCCESS) + { + /* Encrypt Data */ + error_status = AES_ECB_Encrypt_Append(&AESctx, + InputMessage, + InputMessageLength, + OutputMessage, + &outputLength); + + if (error_status == AES_SUCCESS) + { + /* Write the number of data written*/ + *OutputMessageLength = outputLength; + /* Do the Finalization */ + error_status = AES_ECB_Encrypt_Finish(&AESctx, OutputMessage + *OutputMessageLength, &outputLength); + /* Add data written to the information to be returned */ + *OutputMessageLength += outputLength; + } + } + + return error_status; +} + + +/** + * @brief AES ECB Decryption example. + * @param InputMessage: pointer to input message to be decrypted. + * @param InputMessageLength: input data message length in byte. + * @param AES128_Key: pointer to the AES key to be used in the operation + * @param OutputMessage: pointer to output parameter that will handle the decrypted message + * @param OutputMessageLength: pointer to decrypted message length. + * @retval error status: can be AES_SUCCESS if success or one of + * AES_ERR_BAD_INPUT_SIZE, AES_ERR_BAD_OPERATION, AES_ERR_BAD_CONTEXT + * AES_ERR_BAD_PARAMETER if error occured. + */ +int32_t STM32_AES_ECB_Decrypt(uint8_t* InputMessage, + uint32_t InputMessageLength, + uint8_t *AES256_Key, + uint8_t *OutputMessage, + uint32_t *OutputMessageLength,unsigned char _256_mode) +{ + AESECBctx_stt AESctx; + + uint32_t error_status = AES_SUCCESS; + + int32_t outputLength = 0; + + /* Set flag field to default value */ + AESctx.mFlags = E_SK_DEFAULT; + + #ifndef AES256EN + /* Set key size to 32 (corresponding to AES-256) */ + AESctx.mKeySize = 16;//AES128使用16字节 + #else + if (_256_mode==0)//加密模式 + AESctx.mKeySize = 16;//AES128使用16字节 + else + AESctx.mKeySize = 32; + #endif + + /* Initialize the operation, by passing the key. + * Third parameter is NULL because ECB doesn't use any IV */ + error_status = AES_ECB_Decrypt_Init(&AESctx, AES256_Key, NULL ); + + /* check for initialization errors */ + if (error_status == AES_SUCCESS) + { + /* Decrypt Data */ + error_status = AES_ECB_Decrypt_Append(&AESctx, + InputMessage, + InputMessageLength, + OutputMessage, + &outputLength); + + if (error_status == AES_SUCCESS) + { + /* Write the number of data written*/ + *OutputMessageLength = outputLength; + /* Do the Finalization */ + error_status = AES_ECB_Decrypt_Finish(&AESctx, OutputMessage + *OutputMessageLength, &outputLength); + /* Add data written to the information to be returned */ + *OutputMessageLength += outputLength; + } + } + + return error_status; +} + +uint8_t Buffercmp(const uint8_t* pBuffer, uint8_t* pBuffer1, uint16_t BufferLength) +{ + while (BufferLength--) + { + if (*pBuffer != *pBuffer1) + { + return 1; + } + + pBuffer++; + pBuffer1++; + } + + return 0; +} + + + + +////########################################################################### +////测试函数--纯软和库函数比较 +//void AES_Test(void) +//{ +// uint8_t i,sText[16],sDec[16],sDec1[16],sKey[16],sCode[16],sCode1[16]; +// uint32_t iLen; +// volatile uint8_t bOk; +// +// //__CRC_CLK_ENABLE();//打开硬件CRC时钟,软件库加解密才正确 +// +// for (i=0;i<16;i++) +// { sKey[i]=i+iKey; +// sText[i]=i+iKey+'A'; +// } +// sKey[7]=0;sText[12]=0;//加0数据 +// iKey++; //外部变化--测试不同数据 +// +// //AES_Encrypt(sText,sCode,sKey); +// //AES_Decrypt(sDec,sCode,sKey); + +// STM32_AES_ECB_Encrypt(sText,16,sKey,sCode1,&iLen); +// STM32_AES_ECB_Decrypt(sCode1,16,sKey,sDec1,&iLen); +// +// /*bOk=0; +// bOk= bOk+Buffercmp(sText,sDec,16);//一样返回0 +// bOk= bOk+Buffercmp(sText,sDec1,16);//解密后数据正确 +// bOk= bOk+Buffercmp(sCode,sCode1,16);//加密后数据一致 +// if (bOk) +// { bOk=100; +// }*/ +// +//} + diff --git b/Base_core/AESLIB/AES/AES.h a/Base_core/AESLIB/AES/AES.h new file mode 100644 index 0000000..547f41c --- /dev/null +++ a/Base_core/AESLIB/AES/AES.h @@ -0,0 +1,59 @@ +#ifndef _AES_H +#define _AES_H + +#define RoundKeyLEN 300 +//#define AES256MODE //AES256 否则AES128 --纯软件实现的 +#define AES256EN //支持AES256 + +#include "crypto.h" //STM32的加密库接口 + +//void AES_Encrypt(char* pExpressText , char* pCipherText , char* pAeskey); +//void AES_Decrypt(char* pExpressText , char* pCipherText , char* pAeskey); + +//void AES_Test(void); + + +void AES_Encrypt(char* pExpressText , char* pCipherText , char* pAeskey,unsigned char _256_mode); + +void AES_Decrypt(char* pExpressText , char* pCipherText , char* pAeskey,unsigned char _256_mode); + +/** + * @brief AES ECB Decryption example. + * @param InputMessage: pointer to input message to be decrypted. + * @param InputMessageLength: input data message length in byte. + * @param AES128_Key: pointer to the AES key to be used in the operation + * @param OutputMessage: pointer to output parameter that will handle the decrypted message + * @param OutputMessageLength: pointer to decrypted message length. + * @retval error status: can be AES_SUCCESS if success or one of + * AES_ERR_BAD_INPUT_SIZE, AES_ERR_BAD_OPERATION, AES_ERR_BAD_CONTEXT + * AES_ERR_BAD_PARAMETER if error occured. + */ +int32_t STM32_AES_ECB_Decrypt(uint8_t* InputMessage, + uint32_t InputMessageLength, + uint8_t *AES256_Key, + uint8_t *OutputMessage, + uint32_t *OutputMessageLength,unsigned char _256_mode); + + +/** + * @brief AES ECB Encryption example. + * @param InputMessage: pointer to input message to be encrypted. + * @param InputMessageLength: input data message length in byte. + * @param AES128_Key: pointer to the AES key to be used in the operation + * @param OutputMessage: pointer to output parameter that will handle the encrypted message + * @param OutputMessageLength: pointer to encrypted message length. + * @retval error status: can be AES_SUCCESS if success or one of + * AES_ERR_BAD_INPUT_SIZE, AES_ERR_BAD_OPERATION, AES_ERR_BAD_CONTEXT + * AES_ERR_BAD_PARAMETER if error occured. + */ +int32_t STM32_AES_ECB_Encrypt(uint8_t* InputMessage, + uint32_t InputMessageLength, + uint8_t *AES256_Key, + uint8_t *OutputMessage, + uint32_t *OutputMessageLength,unsigned char _256_mode); + + +extern const uint8_t rsbox[256]; + + +#endif diff --git b/Base_core/AESLIB/AES/main.c a/Base_core/AESLIB/AES/main.c new file mode 100644 index 0000000..a442611 --- /dev/null +++ a/Base_core/AESLIB/AES/main.c @@ -0,0 +1,310 @@ + +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32l4xx_hal.h" +#include "AES.h" +#include +#include +#include +#include /* Standard I/O .h-file */ +#include /* Character functions */ +#include /* String and memory functions */ +#include +#include +#include +/* Private typedef -----------------------------------------------------------*/ +//typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus; +/* Private define ------------------------------------------------------------*/ + +#define Decryptmode 1 + +char expressText[16]="Hello!!!Are12345"; //存放待加密的明文数据,具体缓存大小根据用户待加密数据长度自己任意修改 + +char cipherText[16]={0x56,0xb0,0x5d,0xe0,0x3f,0xa7,0x86,0x08,0x43,0xe2,0xb4,0xf0,0x92,0x63,0x2f,0x16};//存放已加密的密文数据,具体缓存大小根据用户解密后的数据长度自己任意修改 +//char cipherText[16]={0xd7,0xcb,0xd2,0xc9,0xf5,0x50,0x6a,0x1b,0xcc,0xcf,0x9a,0x55,0x31,0x8a,0x7f,0x07};//32位密文 +char aesKey[32]= +{ + 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, + 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, + 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, + 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4, +}; + + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +TestStatus Buffercmp(const uint8_t* pBuffer, uint8_t* pBuffer1, uint16_t BufferLength); +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +uint32_t Example_Status = 0; + +/* Private function prototypes -----------------------------------------------*/ + +void _Error_Handler(char *file, int line); +/* USER CODE BEGIN PFP */ +/* Private function prototypes -----------------------------------------------*/ + +int32_t status = AES_SUCCESS; + +/* USER CODE END PFP */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * + * @retval None + */ + +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration----------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + __CRC_CLK_ENABLE(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ +// memcpy(aesKey , "1uweiIDAS7awOas8" , 16); //AES加密密钥,16字节(128bit) + while (1) + { +#ifdef Decryptmode + //加密 + AES_Encrypt(expressText , cipherText , aesKey); + HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); + +#else + //解密 + AES_Decrypt(expressText , cipherText , aesKey); + HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); + +#endif + + } + /* USER CODE END 3 */ + +} + +TestStatus Buffercmp(const uint8_t* pBuffer, uint8_t* pBuffer1, uint16_t BufferLength) +{ + while (BufferLength--) + { + if (*pBuffer != *pBuffer1) + { + return FAILED; + } + + pBuffer++; + pBuffer1++; + } + + return PASSED; +} +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; + RCC_OscInitStruct.MSIState = RCC_MSI_ON; + RCC_OscInitStruct.MSICalibrationValue = 0; + RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 40; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the Systick interrupt time + */ + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); + + /**Configure the Systick + */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} + +/** Configure pins as + * Analog + * Input + * Output + * EVENT_OUT + * EXTI +*/ +static void MX_GPIO_Init(void) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET); + + /*Configure GPIO pin : PB13 */ + GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @param file: The file name as string. + * @param line: The line in file as a number. + * @retval None + */ +void _Error_Handler(char *file, int line) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + while(1) + { + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET); + HAL_Delay(250); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET); + HAL_Delay(250); + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t* file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/AES/涓婃鍙戠殑绾蒋浠舵敼浜嗕竴鍙ヨ瘽.png a/Base_core/AESLIB/AES/涓婃鍙戠殑绾蒋浠舵敼浜嗕竴鍙ヨ瘽.png new file mode 100644 index 0000000..2e2ebca --- /dev/null +++ a/Base_core/AESLIB/AES/涓婃鍙戠殑绾蒋浠舵敼浜嗕竴鍙ヨ瘽.png diff --git b/Base_core/AESLIB/AES/浣跨敤璇存槑.txt a/Base_core/AESLIB/AES/浣跨敤璇存槑.txt new file mode 100644 index 0000000..175619b --- /dev/null +++ a/Base_core/AESLIB/AES/浣跨敤璇存槑.txt @@ -0,0 +1,20 @@ +工程添加 AES.H AES.C 即可 + +在 AES.H中添加 +#define AES256MODE //表示256位密码模式 不定义则为128为密码模式 + + +AES_Encrypt(expressText , cipherText , aesKey); //加密函数 +expressText: 明文16位 +cipherText : 加密后密文 16位 +aesKey: 密码 16位 + +AES_Decrypt(expressText , cipherText , aesKey);//解密函数 +expressText: 解密后明文16位 +cipherText : 密文 16位 +aesKey: 密码 16位 + +KEIL 优化等级选择 level3 optimize for time + +128位 加密耗时90US 解密耗时165us +256位密码 加密 125us 解密210us \ No newline at end of file diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CBC/aes_cbc.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CBC/aes_cbc.h new file mode 100644 index 0000000..5ef28f8 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CBC/aes_cbc.h @@ -0,0 +1,93 @@ +/** + ****************************************************************************** + * @file aes_cbc.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief AES in CBC Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_AES_CBC_H__ +#define __CRL_AES_CBC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup AESCBC + * @{ + */ + + /* Exported functions --------------------------------------------------------*/ +#ifdef INCLUDE_ENCRYPTION + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_CBC_Encrypt_Init (AESCBCctx_stt *P_pAESCBCctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times */ + int32_t AES_CBC_Encrypt_Append (AESCBCctx_stt *P_pAESCBCctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + \ + + /* Possible final output */ + int32_t AES_CBC_Encrypt_Finish (AESCBCctx_stt *P_pAESCBCctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif + +#ifdef INCLUDE_DECRYPTION + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_CBC_Decrypt_Init (AESCBCctx_stt *P_pAESCBCctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + \ + + /* launch crypto operation , can be called several times */ + int32_t AES_CBC_Decrypt_Append (AESCBCctx_stt *P_pAESCBCctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_CBC_Decrypt_Finish (AESCBCctx_stt *P_pAESCBCctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_AES_CBC_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CCM/aes_ccm.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CCM/aes_ccm.h new file mode 100644 index 0000000..42c94dd --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CCM/aes_ccm.h @@ -0,0 +1,131 @@ +/** + ****************************************************************************** + * @file aes_ccm.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief AES in CCM (Counter with CBC-MAC) Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_AES_CCM_H__ +#define __CRL_AES_CCM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup AESCCM + * @{ + */ + + /* Exported types ------------------------------------------------------------*/ + /** Structure used only for AES-GCM. Used to store the expanded key and, eventually, + * precomputed tables, according the the defined value of CRL_GFMUL in config.h */ + typedef struct + { + /** Unique ID of this AES-GCM Context. \b Not \b used in current implementation. */ + uint32_t mContextId; + /** 32 bit mFlags, used to perform keyschedule */ + SKflags_et mFlags; + /** Pointer to original Key buffer */ + const uint8_t *pmKey; + /** Pointer to original Nonce buffer */ + const uint8_t *pmNonce; + /** Size of the Nonce in bytes. This must be set by the caller prior to calling Init. + Possible values are {7,8,9,10,11,12,13} */ + int32_t mNonceSize; + /** This is the current IV value for encryption.*/ + uint32_t amIvCTR[4]; + /** This is the current IV value for authentication.*/ + uint32_t amIvCBC[4]; + /** AES Key length in bytes. This must be set by the caller prior to calling Init */ + int32_t mKeySize; + /** Pointer to Authentication TAG. This value must be set in decryption, and this TAG will be verified */ + const uint8_t *pmTag; + /** Size of the Tag to return. This must be set by the caller prior to calling Init. + Possible values are values are {4,6,8,10,12,14,16} */ + int32_t mTagSize; + /** Size of the associated data to be processed yet. This must be set by the caller prior to calling Init.*/ + int32_t mAssDataSize; + /** Size of the payload data to be processed yet size. This must be set by the caller prior to calling Init. */ + int32_t mPayloadSize; + /** AES Expanded key. For internal use. */ + uint32_t amExpKey[CRL_AES_MAX_EXPKEY_SIZE]; + /** Temp Buffer */ + uint32_t amTmpBuf[CRL_AES_BLOCK/sizeof(uint32_t)]; + /** Number of bytes actually in use */ + int32_t mTmpBufUse; + } + AESCCMctx_stt; + + /* Exported functions --------------------------------------------------------*/ + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_CCM_Encrypt_Init (AESCCMctx_stt *P_pAESCCMctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pNonce); + + /* Header Processing Function */ + int32_t AES_CCM_Header_Append (AESCCMctx_stt *P_pAESCCMctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize); + + /* launch crypto operation , can be called several times */ + int32_t AES_CCM_Encrypt_Append (AESCCMctx_stt *P_pAESCCMctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_CCM_Encrypt_Finish (AESCCMctx_stt *P_pAESCCMctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_CCM_Decrypt_Init (AESCCMctx_stt *P_pAESCCMctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pNonce); + + /* launch crypto operation , can be called several times */ + int32_t AES_CCM_Decrypt_Append (AESCCMctx_stt *P_pAESCCMctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_CCM_Decrypt_Finish (AESCCMctx_stt *P_pAESCCMctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_AES_CCM_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CFB/aes_cfb.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CFB/aes_cfb.h new file mode 100644 index 0000000..be30ff4 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CFB/aes_cfb.h @@ -0,0 +1,89 @@ +/** + ****************************************************************************** + * @file aes_cfb.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief AES in CFB Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + +#ifndef __CRL_AES_CFB_H__ +#define __CRL_AES_CFB_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup AESCFB + * @{ + */ + + /** CFB context = CBC context. AESCFBctx_stt is equal to AESCBCctx_stt */ + typedef AESCBCctx_stt AESCFBctx_stt; + +#ifdef INCLUDE_ENCRYPTION + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_CFB_Encrypt_Init (AESCFBctx_stt *P_pAESCFBctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times */ + int32_t AES_CFB_Encrypt_Append (AESCFBctx_stt *P_pAESCFBctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_CFB_Encrypt_Finish (AESCFBctx_stt *P_pAESCFBctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif +#ifdef INCLUDE_DECRYPTION + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_CFB_Decrypt_Init (AESCFBctx_stt *P_pAESCFBctx, const uint8_t *P_pKey, const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times */ + int32_t AES_CFB_Decrypt_Append (AESCFBctx_stt *P_pAESCFBctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_CFB_Decrypt_Finish (AESCFBctx_stt *P_pAESCFBctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_AES_CFB_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CMAC/aes_cmac.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CMAC/aes_cmac.h new file mode 100644 index 0000000..87abf97 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/CMAC/aes_cmac.h @@ -0,0 +1,93 @@ +/** + ****************************************************************************** + * @file aes_cmac.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief AES in CMAC Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ***************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_AES_CMAC_H__ +#define __CRL_AES_CMAC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup AESCMAC + * @{ + */ + + /* Exported types ------------------------------------------------------------*/ + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule and future use */ + const uint8_t *pmKey; /*!< Pointer to original Key buffer */ + const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */ + int32_t mIvSize; /*!< Size of the Initialization Vector in bytes */ + uint32_t amIv[4]; /*!< Temporary result/IV */ + int32_t mKeySize; /*!< Key length in bytes */ + uint32_t amExpKey[CRL_AES_MAX_EXPKEY_SIZE]; /*!< Expanded AES key */ + const uint8_t *pmTag; /*!< Pointer to Authentication TAG. This value must be set in decryption, and this TAG will be verified */ + int32_t mTagSize; /*!< Size of the Tag to return. This must be set by the caller prior to calling Init */ + } + AESCMACctx_stt; /*
© COPYRIGHT 2015 STMicroelectronics
+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + **************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_AES_CTR_H__ +#define __CRL_AES_CTR_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup AESCTR + * @{ + */ + + /* Exported types ------------------------------------------------------------*/ + /** CTR context = CBC context. AESCTRctx_stt is equal to AESCBCctx_stt */ + typedef AESCBCctx_stt AESCTRctx_stt; + /* Exported functions --------------------------------------------------------*/ + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_CTR_Encrypt_Init (AESCTRctx_stt *P_pAESCTRctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times */ + int32_t AES_CTR_Encrypt_Append (AESCTRctx_stt *P_pAESCTRctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_CTR_Encrypt_Finish (AESCTRctx_stt *P_pAESCTRctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_CTR_Decrypt_Init (AESCTRctx_stt *P_pAESCTRctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times */ + int32_t AES_CTR_Decrypt_Append (AESCTRctx_stt *P_pAESCTRctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_CTR_Decrypt_Finish (AESCTRctx_stt *P_pAESCTRctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_AES_CTR_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/Common/aes_common.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/Common/aes_common.h new file mode 100644 index 0000000..7b29c1a --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/Common/aes_common.h @@ -0,0 +1,126 @@ +/** + ****************************************************************************** + * @file aes_common.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief AES common functions and definitions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __AES_COMMON_H__ +#define __AES_COMMON_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + + /** @addtogroup AES + * @{ + */ + /* Exported constants --------------------------------------------------------*/ +#define CRL_AES128_KEY 16 /*!< Number of bytes (uint8_t) necessary to store an AES key of 128 bits. */ +#define CRL_AES128_EXPANDED_KEY 44 /*!< Number of ints (uint32_t) necessary to store an expanded AES key of 128 bits. */ +#define CRL_AES192_KEY 24 /*!< Number of bytes (uint8_t) necessary to store an AES key of 192 bits. */ +#define CRL_AES192_EXPANDED_KEY 52 /*!< Number of ints (uint32_t) necessary to store an expanded AES key of 192 bits. */ +#define CRL_AES256_KEY 32 /*!< Number of bytes (uint8_t) necessary to store an AES key of 256 bits. */ +#define CRL_AES256_EXPANDED_KEY 60 /*!< Number of ints (uint32_t) necessary to store an expanded AES key of 256 bits. */ + + +#define CRL_AES_BLOCK 16 /*!< Number of bytes (uint8_t) necessary to store an AES block. */ + +#ifdef INCLUDE_AES256 +# define CRL_AES_MAX_EXPKEY_SIZE 60 /*!< The max size of the AES expanded key (in uint32_t) according to the INCLUDE OPTIONS */ +# else +# ifdef INCLUDE_AES192 +# define CRL_AES_MAX_EXPKEY_SIZE 52 /*!< The max size of the AES expanded key (in uint32_t) according to the INCLUDE OPTIONS */ +# else +# define CRL_AES_MAX_EXPKEY_SIZE 44 /*!< The max size of the AES expanded key (in uint32_t) according to the INCLUDE OPTIONS */ +# endif +#endif /*include aes 256 */ + + /** + * @} + */ + + /* Exported types ------------------------------------------------------------*/ + /** @addtogroup AESCBC + * @{ + */ + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */ + const uint8_t *pmKey; /*!< Pointer to original Key buffer */ + const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */ + int32_t mIvSize; /*!< Size of the Initialization Vector in bytes */ + uint32_t amIv[4]; /*!< Temporary result/IV */ + int32_t mKeySize; /*!< Key length in bytes */ + uint32_t amExpKey[CRL_AES_MAX_EXPKEY_SIZE]; /*!< Expanded AES key */ + } + AESCBCctx_stt; /*!< AES context structure for CBC mode */ + + /** + * @} + */ + + /* Exported functions --------------------------------------------------------*/ +#ifdef INCLUDE_ENCRYPTION +void AES_keyschedule_enc (const uint8_t *P_pKey, \ + uint32_t *P_pExpKey, \ + int32_t P_keySize); + +void AES_general_SW_enc (const uint32_t* P_pInputBuffer,\ + uint32_t* P_pOutputBuffer, \ + const uint32_t* P_pExpKey, \ + int32_t P_keySize); +#endif + +#ifdef INCLUDE_DECRYPTION +void AES_keyschedule_dec (const uint8_t *P_pKey, \ + uint32_t *P_pExpKey, \ + int32_t P_keySize); + +void AES_general_SW_dec (const uint32_t* P_pInputBuffer,\ + uint32_t* P_pOutputBuffer, \ + const uint32_t* P_pExpKey, \ + int32_t P_keySize); +#endif + /** @addtogroup AESlowlevel AES + * @{ + */ + + + + /** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /*__AES_COMMON_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/Common/aes_low_level.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/Common/aes_low_level.h new file mode 100644 index 0000000..a495dd4 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/Common/aes_low_level.h @@ -0,0 +1,158 @@ +/** + ****************************************************************************** + * @file aes_low_level.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief AES low level functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __AES_LOW_LEVEL_H__ +#define __AES_LOW_LEVEL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @addtogroup AESlowlevel + * @{ + */ + + /*------------------------------------------------------------------------------ + AES - Advanced Encryption Standard + ------------------------------------------------------------------------------*/ + /* key size: 16 bytes (aes128), 24 bytes (aes192) or 32 bytes (aes256) + * block size: 16 bytes */ + +#define AES_BLOCK_SIZE 4 /*!< Number of (uint32_t) 32 bit words to store an AES block. */ + + /*---------------------------AES MACROS---------------------------------------*/ + + /** @defgroup AESmacros AES Macros + * @{ + */ + + /** Multiply for 2 each byte of a uint32_t working in parallel mode on each one. */ +#define Xtime(x) ((((x) & 0x7F7F7F7Fu) << 1) ^ ((((x) & 0x80808080u) >> 7) * 0x0000001Bu)) + + /** Right shift x of n bytes. */ +#define upr(x,n) ((x) >> (8*(n))) | ((x) << (32 - (8*(n)))) + + /** Develop of the matrix necessary for the MixColomn procedure. */ +#define fwd_mcol(x) (Xtime(x)^(upr(((x)^Xtime(x)),3)) ^ (upr((x),2)) ^ (upr((x),1))) + + /** Develop of the matrix necessary for the InvMixColomn procedure. */ +#define inv_mcol(x) (f2=Xtime(x),f4=Xtime(f2),f8=Xtime(f4),(x)^=f8, f2^=f4^f8^(upr((f2^(x)),3))^(upr((f4^(x)),2))^(upr((x),1))) + + + /** Defines right rotation of a uint32_t by 3.*/ +#define rot3(x) (((x) << 8 ) | ((x) >> 24)) + /** Defines right rotation of a uint32_t by 2.*/ +#define rot2(x) (((x) << 16) | ((x) >> 16)) + /** Defines right rotation of a uint32_t by 1.*/ +#define rot1(x) (((x) << 24) | ((x) >> 8 )) + + /** + * @} + */ + + + /** + * @} + */ + + + + /*----- AES 128 ---------------------------------------------------------------- */ + /** @ingroup AES128 + * @{ + */ + +#define AES_KEY_SIZE 4 /*!< Number of (uint32_t) 32 bit words to store an AES128 key. */ +#define AES_EXPKEY_SIZE 44 /*!< Number of (uint32_t) 32 bit words to store an AES128 expanded key. */ + + /* According to key computes the expanded key exp for AES128 encryption. */ + void AES128_keyschedule_enc(const uint32_t* key, uint32_t* expkey) ; + /* According to key computes the expanded key exp for AES128 decryption. */ + void AES128_keyschedule_dec(const uint32_t* key, uint32_t* expkey) ; + /* AES128 encryption of an AES128 block. */ + void AES128_encrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ; + /* AES128 decryption of an AES128 block. */ + void AES128_decrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ; + + /** + * @} + */ + + /*----- AES 192 ----------------------------------------------------------------*/ + /** @ingroup AES192 + * @{ + */ + +#define AES192_BLOCK_SIZE 4 /*!< Number of (uint32_t) 32 bit words to store an AES192 block. */ +#define AES192_KEY_SIZE 6 /*!< Number of (uint32_t) 32 bit words to store an AES192 key. */ +#define AES192_EXPKEY_SIZE 52 /*!< Number of (uint32_t) 32 bit words to store an AES192 expanded key. */ + + /* According to key computes the expanded key exp for AES192 encryption.*/ + void AES192_keyschedule_enc(const uint32_t* key, uint32_t* exp) ; + /* According to key computes the expanded key exp for AES192 decryption. */ + void AES192_keyschedule_dec(const uint32_t* key, uint32_t* exp) ; + /* AES192 encryption of an AES192 block. */ + void AES192_encrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ; + /* AES192 decryption of an AES192 block. */ + void AES192_decrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ; + + /** + * @} + */ + + /*----- AES 256 ----------------------------------------------------------------*/ + /** @ingroup AES256 + * @{ + */ + +#define AES256_BLOCK_SIZE 4 /*!< Number of (uint32_t) 32 bit words to store an AES256 block. */ +#define AES256_KEY_SIZE 8 /*!< Number of (uint32_t) 32 bit words to store an AES256 key. */ +#define AES256_EXPKEY_SIZE 60 /*!< Number of (uint32_t) 32 bit words to store an AES256 expanded key. */ + + /* According to key computes the expanded key exp for AES256 encryption. */ + void AES256_keyschedule_enc(const uint32_t* key, uint32_t* exp) ; + /* According to key computes the expanded key exp for AES256 decryption. */ + void AES256_keyschedule_dec(const uint32_t* key, uint32_t* exp) ; + /* AES256 encryption of an AES256 block. */ + void AES256_encrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ; + /* AES256 decryption of an AES256 block. */ + void AES256_decrypt(const uint32_t* input_pointer, uint32_t* output_pointer, const uint32_t* expkey) ; + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /*__AES_LOW_LEVEL_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/ECB/aes_ecb.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/ECB/aes_ecb.h new file mode 100644 index 0000000..4e39559 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/ECB/aes_ecb.h @@ -0,0 +1,91 @@ +/** + ****************************************************************************** + * @file aes_ecb.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief AES in ECB Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_AES_ECB_H__ +#define __CRL_AES_ECB_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup AESECB + * @{ + */ + + /* Exported types ------------------------------------------------------------*/ + /** ECB context = CBC context. AESECBctx_stt is equal to AESCBCctx_stt */ + typedef AESCBCctx_stt AESECBctx_stt; + + /* Exported functions --------------------------------------------------------*/ +#ifdef INCLUDE_ENCRYPTION + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_ECB_Encrypt_Init (AESECBctx_stt *P_pAESECBctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times */ + int32_t AES_ECB_Encrypt_Append (AESECBctx_stt *P_pAESECBctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_ECB_Encrypt_Finish (AESECBctx_stt *P_pAESECBctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif /* ECB Encryption */ + +#ifdef INCLUDE_DECRYPTION + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_ECB_Decrypt_Init (AESECBctx_stt *P_pAESECBctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times */ + int32_t AES_ECB_Decrypt_Append (AESECBctx_stt *P_pAESECBctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_ECB_Decrypt_Finish (AESECBctx_stt *P_pAESECBctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif /* ECB Decryption */ + + /** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_AES_ECB_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/GCM/aes_gcm.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/GCM/aes_gcm.h new file mode 100644 index 0000000..fc9bab4 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/GCM/aes_gcm.h @@ -0,0 +1,136 @@ +/** + ****************************************************************************** + * @file aes_gcm.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief AES in GCM Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_AES_GCM_H__ +#define __CRL_AES_GCM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup AESGCMlowlevel + * @{ + */ + /* Exported types ------------------------------------------------------------*/ + typedef uint32_t poly_t[4]; /*!< Definition of the way a polynomial of max degree 127 is represented */ + +#if CRL_GFMUL==1 + typedef poly_t table16_t[16]; /*!< Definition of the type used for the precomputed table */ +#elif CRL_GFMUL==2 + typedef poly_t table8x16_t[8][16]; /*!< Definition of the type used for the precomputed table */ +#elif CRL_GFMUL==0 +#else +#error "A value for CRL_GFMUL MUST be provided when INCLUDE_GCM is defined" +#endif + + /** @} */ + + /** @ingroup AESGCM + * @{ + */ + + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this AES-GCM Context. \b Not \b used in current implementation. */ + SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */ + const uint8_t *pmKey; /*!< Pointer to original Key buffer */ + const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */ + int32_t mIvSize; /*!< Size of the Initialization Vector in bytes. This must be set by the caller prior to calling Init */ + uint32_t amIv[4]; /*!< This is the current IV value.*/ + int32_t mKeySize; /*!< AES Key length in bytes. This must be set by the caller prior to calling Init */ + const uint8_t *pmTag; /*!< Pointer to Authentication TAG. This value must be set in decryption, and this TAG will be verified */ + int32_t mTagSize; /*!< Size of the Tag to return. This must be set by the caller prior to calling Init */ + int32_t mAADsize; /*!< Additional authenticated data size. For internal use. */ + int32_t mPayloadSize; /*!< Payload size. For internal use. */ + poly_t mPartialAuth; /*!< Partial authentication value. For internal use. */ + uint32_t amExpKey[CRL_AES_MAX_EXPKEY_SIZE]; /*!< AES Expanded key. For internal use. */ + +#if CRL_GFMUL==0 + poly_t mPrecomputedValues; /*!< (CRL_GFMUL==0) No precomputed tables, just the polynomial. For internal use. */ +#elif CRL_GFMUL==1 + table16_t mPrecomputedValues; /*!< (CRL_GFMUL==1) Precomputation of polynomial according to Shoup's 4-bit table\n (Requires 256 bytes of key-dependent data and 32 bytes of constant data). For internal use. */ +#elif CRL_GFMUL==2 + table8x16_t mPrecomputedValues; /*!< (CRL_GFMUL==2) Precomputation of polynomial according to Shoup's 8-bit table\n (Requires 4096 bytes of key-dependent data and 512 bytes of constant data). For internal use. */ +#endif + } + AESGCMctx_stt; /*!< Structure used only for AES-GCM. Used to store the expanded key and, eventually, + precomputed tables, according the the defined value of CRL_GFMUL in config.h */ + + /* Exported functions --------------------------------------------------------*/ + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_GCM_Encrypt_Init(AESGCMctx_stt *P_pAESGCMctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* Header Processing Function */ + int32_t AES_GCM_Header_Append(AESGCMctx_stt *P_pAESGCMctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize); + + /* launch crypto operation , can be called several times */ + int32_t AES_GCM_Encrypt_Append (AESGCMctx_stt *P_pAESGCMctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_GCM_Encrypt_Finish (AESGCMctx_stt *P_pAESGCMctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + \ + + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_GCM_Decrypt_Init (AESGCMctx_stt *P_pAESGCMctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + \ + + /* launch crypto operation , can be called several times */ + int32_t AES_GCM_Decrypt_Append (AESGCMctx_stt *P_pAESGCMctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + \ + + /* Possible final output */ + int32_t AES_GCM_Decrypt_Finish (AESGCMctx_stt *P_pAESGCMctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + + /** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_AES_GCM_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/KEYWRAP/aes_keywrap.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/KEYWRAP/aes_keywrap.h new file mode 100644 index 0000000..5fef0f9 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/KEYWRAP/aes_keywrap.h @@ -0,0 +1,91 @@ +/** + ****************************************************************************** + * @file aes_keywrap.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief AES in KeyWrap Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_AES_KEYWRAP_H__ +#define __CRL_AES_KEYWRAP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup AESKEYWRAP + * @{ + */ + + /* Exported types ------------------------------------------------------------*/ + /** AES context structure for Key Wrap mode */ + typedef AESCBCctx_stt AESKWctx_stt; + /* Exported constants --------------------------------------------------------*/ + /** Number of uint32_t words in a Key Wrap Block */ +#define CRL_KWRAP_BLOCK_SIZE 2 + /** Number of uint8_t bytes in a Key Wrap Block */ +#define CRL_AES_KWRAP_BLOCK 8 + + /* Exported functions --------------------------------------------------------*/ +#ifdef INCLUDE_ENCRYPTION + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_KeyWrap_Encrypt_Init (AESKWctx_stt *P_pAESKWctx, const uint8_t *P_pKey, const uint8_t *P_pIv); + + /* launch crypto operation , can be called just one times */ + int32_t AES_KeyWrap_Encrypt_Append (AESKWctx_stt *P_pAESKWctx, + const uint8_t *P_pInputBuffer, + int32_t P_inputSize, + uint8_t *P_pOutputBuffer, + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_KeyWrap_Encrypt_Finish (AESKWctx_stt *P_pAESKWctx, + uint8_t *P_pOutputBuffer, + int32_t *P_pOutputSize); +#endif /* ENC */ +#ifdef INCLUDE_DECRYPTION + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_KeyWrap_Decrypt_Init (AESKWctx_stt *P_pAESKWctx, const uint8_t *P_pKey, const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times */ + int32_t AES_KeyWrap_Decrypt_Append (AESKWctx_stt *P_pAESKWctx, + const uint8_t *P_pInputBuffer, + int32_t P_inputSize, + uint8_t *P_pOutputBuffer, + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_KeyWrap_Decrypt_Finish (AESKWctx_stt *P_pAESKWctx, + uint8_t *P_pOutputBuffer, + int32_t *P_pOutputSize); +#endif + + /** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_AES_KEYWRAP_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/OFB/aes_ofb.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/OFB/aes_ofb.h new file mode 100644 index 0000000..0df0b72 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/OFB/aes_ofb.h @@ -0,0 +1,90 @@ +/** + ****************************************************************************** + * @file aes_ofb.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief AES in OFB Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +#ifndef __CRL_AES_OFB_H__ +#define __CRL_AES_OFB_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup AESOFB + * @{ + */ + + /** OFB context = CBC context. AESOFBctx_stt is equal to AESCBCctx_stt */ + typedef AESCBCctx_stt AESOFBctx_stt; + +#ifdef INCLUDE_ENCRYPTION + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_OFB_Encrypt_Init (AESOFBctx_stt *P_pAESOFBctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times */ + int32_t AES_OFB_Encrypt_Append (AESOFBctx_stt *P_pAESOFBctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_OFB_Encrypt_Finish (AESOFBctx_stt *P_pAESOFBctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif +#ifdef INCLUDE_DECRYPTION + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_OFB_Decrypt_Init (AESOFBctx_stt *P_pAESOFBctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times */ + int32_t AES_OFB_Decrypt_Append (AESOFBctx_stt *P_pAESOFBctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_OFB_Decrypt_Finish (AESOFBctx_stt *P_pAESOFBctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_AES_OFB_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/XTS/aes_xts.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/XTS/aes_xts.h new file mode 100644 index 0000000..6615a1a --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/XTS/aes_xts.h @@ -0,0 +1,99 @@ +/** + ****************************************************************************** + * @file aes_xts.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief AES in XTS Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +#ifndef __CRL_AES_XTS_H__ +#define __CRL_AES_XTS_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup AESXTS + * @{ + */ + + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */ + const uint8_t *pmKey; /*!< Pointer to original XTS Key buffer */ + const uint8_t *pmTweak; /*!< Pointer to original Tweak buffer */ + int32_t mTweakSize; /*!< Size of the Tweak in bytes */ + uint32_t amTweak[4]; /*!< Temporary result/Tweak */ + int32_t mKeySize; /*!< Size of half of the XTS Key in bytes */ + uint32_t amExpKey[CRL_AES_MAX_EXPKEY_SIZE]; /*!< Expanded AES Key 1 */ + uint32_t amExpKey2[CRL_AES_MAX_EXPKEY_SIZE]; /*!< Expanded AES Key 2 */ + } + AESXTSctx_stt; /*!< AES context structure for CBC mode */ + + /* Exported functions --------------------------------------------------------*/ + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_XTS_Encrypt_Init (AESXTSctx_stt *P_pAESXTSctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pTweak); + + /* launch crypto operation , can be called several times */ + int32_t AES_XTS_Encrypt_Append (AESXTSctx_stt *P_pAESXTSctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_XTS_Encrypt_Finish (AESXTSctx_stt *P_pAESXTSctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + +#ifdef INCLUDE_DECRYPTION + /* load the key and ivec, eventually performs key schedule, etc. */ + int32_t AES_XTS_Decrypt_Init (AESXTSctx_stt *P_pAESXTSctx, const uint8_t *P_pKey, const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times */ + int32_t AES_XTS_Decrypt_Append (AESXTSctx_stt *P_pAESXTSctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output */ + int32_t AES_XTS_Decrypt_Finish (AESXTSctx_stt *P_pAESXTSctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_AES_XTS_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/aes.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/aes.h new file mode 100644 index 0000000..0abb0e9 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/AES/aes.h @@ -0,0 +1,74 @@ +/** + ****************************************************************************** + * @file aes.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Container for the AES functionalities + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "Common/aes_low_level.h" +#include "Common/aes_common.h" + + +#ifdef INCLUDE_ECB +#include "ECB/aes_ecb.h" +#endif + +#ifdef INCLUDE_CBC +#include "CBC/aes_cbc.h" +#endif + +#ifdef INCLUDE_CTR +#include "CTR/aes_ctr.h" +#endif + +#ifdef INCLUDE_CFB +#include "CFB/aes_cfb.h" +#endif + +#ifdef INCLUDE_OFB +#include "OFB/aes_ofb.h" +#endif + +#ifdef INCLUDE_XTS +#include "XTS/aes_xts.h" +#endif + +#ifdef INCLUDE_GCM +#include "GCM/aes_gcm.h" +#endif + +#ifdef INCLUDE_CCM +#include "CCM/aes_ccm.h" +#endif + +#ifdef INCLUDE_CMAC +#include "CMAC/aes_cmac.h" +#endif + +#ifdef INCLUDE_KEY_WRAP +#include "KEYWRAP/aes_keywrap.h" +#endif + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/ARC4/arc4.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/ARC4/arc4.h new file mode 100644 index 0000000..1e023bf --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/ARC4/arc4.h @@ -0,0 +1,95 @@ +/** + ****************************************************************************** + * @file arc4.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief ARC4 + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *****************************************************************************/ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_ARC4_H__ +#define __CRL_ARC4_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup ARC4 + * @{ + */ + + + /** + * @brief Structure describing an ARC4 context + */ + /* Exported types ------------------------------------------------------------*/ + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this AES-GCM Context. \b Not \b used in current implementation. */ + SKflags_et mFlags; /*!< 32 bit mFlags, for future use */ + const uint8_t *pmKey; /*!< Pointer to original Key buffer */ + int32_t mKeySize; /*!< ARC4 Key length in bytes. This must be set by the caller prior to calling Init */ + uint8_t mX; /*!< Internal members: This describe one of two index variables of the ARC4 state */ + uint8_t mY; /*!< Internal members: This describe one of two index variables of the ARC4 state */ + uint8_t amState[256]; /*!< Internal members: This describe the 256 bytes State Matrix */ + } + ARC4ctx_stt; + + + /* Exported functions --------------------------------------------------------*/ + + int32_t ARC4_Encrypt_Init(ARC4ctx_stt *P_pARC4ctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + int32_t ARC4_Encrypt_Append(ARC4ctx_stt *P_pARC4ctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + int32_t ARC4_Encrypt_Finish(ARC4ctx_stt *P_pARC4ctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + int32_t ARC4_Decrypt_Init(ARC4ctx_stt *P_pARC4ctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + int32_t ARC4_Decrypt_Append(ARC4ctx_stt *P_pARC4ctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + int32_t ARC4_Decrypt_Finish (ARC4ctx_stt *P_pARC4ctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_AES_ECB_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/C25519/c25519.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/C25519/c25519.h new file mode 100644 index 0000000..6d7b0f7 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/C25519/c25519.h @@ -0,0 +1,64 @@ +/** +****************************************************************************** +* @file c5519.h +* @author MCD Application Team +* @version V3.0.0 +* @date 05-June-2015 +* @brief Container for ed25519 functionalities +****************************************************************************** +* @attention +* +*

© COPYRIGHT 2015 STMicroelectronics

+* +* Licensed under MCD-ST Image SW License Agreement V2, (the "License"); +* You may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.st.com/software_license_agreement_liberty_v2 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +****************************************************************************** +*/ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __C25519_H__ +#define __C25519_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @addtogroup C25519 + * @{ + */ + /* Includes ------------------------------------------------------------------*/ +#include + /* Exported types ------------------------------------------------------------*/ + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + int32_t C25519keyGen (uint8_t *P_pPrivateKey, \ + uint8_t *P_pPublicKey); + \ + + int32_t C25519keyExchange (uint8_t *P_pSharedSecret, \ + const uint8_t *P_pPrivateKey, \ + const uint8_t *P_pPublicKey); + /** + * @} + */ + /* Lower level functionality. Useful for testing, might be used in real world if there is small NVM */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __C25519_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/CHACHA/chacha.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/CHACHA/chacha.h new file mode 100644 index 0000000..d10bea5 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/CHACHA/chacha.h @@ -0,0 +1,98 @@ +/** +****************************************************************************** +* @file chacha.h +* @author MCD Application Team +* @version V3.0.0 +* @date 05-June-2015 +* @brief ChaCha20 header file +****************************************************************************** +* @attention +* +*

© COPYRIGHT 2015 STMicroelectronics

+* +* Licensed under MCD-ST Image SW License Agreement V2, (the "License"); +* You may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.st.com/software_license_agreement_liberty_v2 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +****************************************************************************** +*/ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CHACHA_H__ +#define __CHACHA_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @addtogroup CHACHA + * @{ + */ + /* Includes ------------------------------------------------------------------*/ +#include + /* Exported types ------------------------------------------------------------*/ + + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule and future use */ + const uint8_t *pmKey; /*!< Pointer to original Key buffer */ + const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */ + int32_t mIvSize; /*!< Size of the Initialization Vector in bytes */ + int32_t mKeySize; /*!< Key length in bytes */ + uint64_t mCounter; /*!< Value for counter, will allow to process not contiguous data. Set flag E_SK_SET_COUNTER to use it, otherwise it's ignored */ + uint32_t amState[16]; /*!< ChaCha Internal State */ + } + CHACHActx_stt; /*!< Chacha context structure */ + + /* Exported constants --------------------------------------------------------*/ +#define CRL_CHACHA128_KEY 16 /*!< Number of bytes (uint8_t) necessary to store a ChaCha key of 128 bits. */ +#define CRL_CHACHA256_KEY 32 /*!< Number of bytes (uint8_t) necessary to store a Chacha key of 256 bits. */ +#define CRL_CHACHA_NONCE 8 /*!< Number of bytes (uint8_t) necessary to store a Chacha Nonce of 64 bits. */ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + int32_t CHACHA_Encrypt_Init(CHACHActx_stt *P_pCHACHActx, const uint8_t *P_pKey, const uint8_t *P_pIv); + + int32_t CHACHA_Encrypt_Append(CHACHActx_stt *P_pCHACHActx, + const uint8_t *P_pInputBuffer, + int32_t P_inputSize, + uint8_t *P_pOutputBuffer, + int32_t *P_pOutputSize); + + int32_t CHACHA_Encrypt_Finish(CHACHActx_stt *P_pCHACHActx, + uint8_t *P_pOutputBuffer, + int32_t *P_pOutputSize); + + int32_t CHACHA_Decrypt_Init(CHACHActx_stt *P_pCHACHActx, const uint8_t *P_pKey, const uint8_t *P_pIv); + + int32_t CHACHA_Decrypt_Append(CHACHActx_stt *P_pCHACHActx, + const uint8_t *P_pInputBuffer, + int32_t P_inputSize, + uint8_t *P_pOutputBuffer, + int32_t *P_pOutputSize); + + int32_t CHACHA_Decrypt_Finish(CHACHActx_stt *P_pCHACHActx, + uint8_t *P_pOutputBuffer, + int32_t *P_pOutputSize); + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CHACHA_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/CHACHA20-POLY1305/chacha20-poly1305.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/CHACHA20-POLY1305/chacha20-poly1305.h new file mode 100644 index 0000000..bf62cd4 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/CHACHA20-POLY1305/chacha20-poly1305.h @@ -0,0 +1,101 @@ +/** +****************************************************************************** +* @file chacha20-poly1305.h +* @author MCD Application Team +* @version V3.0.0 +* @date 05-June-2015 +* @brief Container for chacha20-poly1305 functionalities +****************************************************************************** +* @attention +* +*

© COPYRIGHT 2015 STMicroelectronics

+* +* Licensed under MCD-ST Image SW License Agreement V2, (the "License"); +* You may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.st.com/software_license_agreement_liberty_v2 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +****************************************************************************** +*/ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CHACHA20_POLY1305_H__ +#define __CHACHA20_POLY1305_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @addtogroup CHACHA20POLY1305 + * @{ + */ + /* Includes ------------------------------------------------------------------*/ +#include + /* Exported types ------------------------------------------------------------*/ + + /** + * @brief Structure for ChaCha20-Poly1305 context + */ + + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule and future use */ + const uint8_t *pmKey; /*!< Pointer to original 32 bytes Key buffer */ + const uint8_t *pmNonce; /*!< Pointer to original 12 bytes Nonce buffer */ + const uint8_t *pmTag; /*!< Pointer to Authentication TAG. This value must be set in decryption, and this TAG will be verified */ + uint32_t mAadSize; /*!< Size of the processed AAD */ + uint32_t mCipherSize; /*!< Size of the processed CipherText */ + uint32_t r[5]; /*!< Internal: value of r */ + uint32_t h[5]; /*!< Internal: value of h */ + uint32_t pad[4]; /*!< Internal: value of Poly nonce */ + uint32_t amState[16]; /*!< Internal: ChaCha Internal State */ + } + ChaCha20Poly1305ctx_stt; + + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + int32_t ChaCha20Poly1305_Encrypt_Init(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, const uint8_t *P_pKey, const uint8_t *P_pNonce); + + int32_t ChaCha20Poly1305_Encrypt_Append(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, + const uint8_t *P_pInputBuffer, + int32_t P_inputSize, + uint8_t *P_pOutputBuffer, + int32_t *P_pOutputSize); + + int32_t ChaCha20Poly1305_Header_Append(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize); + + int32_t ChaCha20Poly1305_Encrypt_Finish(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize); + + int32_t ChaCha20Poly1305_Decrypt_Init(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, const uint8_t *P_pKey, const uint8_t *P_pNonce); + + int32_t ChaCha20Poly1305_Decrypt_Append(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, + const uint8_t *P_pInputBuffer, + int32_t P_inputSize, + uint8_t *P_pOutputBuffer, + int32_t *P_pOutputSize); + + int32_t ChaCha20Poly1305_Decrypt_Finish(ChaCha20Poly1305ctx_stt *P_pChaCha20Poly1305ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize); + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CHACHA20_POLY1305_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/err_codes.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/err_codes.h new file mode 100644 index 0000000..bb4bf3c --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/err_codes.h @@ -0,0 +1,260 @@ +/** + ****************************************************************************** + * @file err_codes.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides defines for error codes + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_ERR_CODES_H__ +#define __CRL_ERR_CODES_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "config.h" +#include "types.h" +#include "err_codes.h" + + +/** @addtogroup UserAPI User Level API + * @{ + */ + +/** @addtogroup ErrCodes Error Codes Definitions + * @{ + */ + +/** @defgroup GenericError Generic Error Codes + * @{ + */ + +#define AUTHENTICATION_SUCCESSFUL (int32_t) (1003) /*!< Authentication successful */ +#define AUTHENTICATION_FAILED (int32_t) (1004) /*!< Authentication failed */ +#define SIGNATURE_VALID AUTHENTICATION_SUCCESSFUL /*!< Signature is valid */ +#define SIGNATURE_INVALID AUTHENTICATION_FAILED /*!< Signature is NOT valid */ +#define ERR_MEMORY_FAIL (int32_t) (1005) /*!< Problems with dynamic allocation (there's no more available memory) */ +/** + * @} + */ + +/** @defgroup AESError AES Error Codes + * @{ + */ +#define AES_SUCCESS (int32_t) (0) /*!< AES of PRIVKEY Success */ +#define AES_ERR_BAD_INPUT_SIZE (int32_t) (3101) /*!< AES of PRIVKEY Invalid input size */ +#define AES_ERR_BAD_OPERATION (int32_t) (3102) /*!< AES of PRIVKEY Invalid operation */ +#define AES_ERR_BAD_CONTEXT (int32_t) (3103) /*!< AES of PRIVKEY The AES context contains some invalid or uninitialized values */ +#define AES_ERR_BAD_PARAMETER (int32_t) (3104) /*!< AES of PRIVKEY One of the expected function parameters is invalid */ +/** + * @} + */ +/** @defgroup CHACHAError ChaCha Error Codes +* @{ +*/ +#define CHACHA_SUCCESS (int32_t) (0) /*!< ChaCha Success */ +#define CHACHA_ERR_BAD_INPUT_SIZE (int32_t) (3201) /*!< ChaCha Invalid input size */ +#define CHACHA_ERR_BAD_OPERATION (int32_t) (3202) /*!< ChaCha Invalid operation */ +#define CHACHA_ERR_BAD_CONTEXT (int32_t) (3203) /*!< ChaCha The AES context contains some invalid or uninitialized values */ +#define CHACHA_ERR_BAD_PARAMETER (int32_t) (3204) /*!< ChaCha One of the expected function parameters is invalid */ +/** +* @} +*/ + +/** @defgroup POLY1305Error POLY1305 Error Codes +* @{ +*/ +#define POLY1305_SUCCESS (int32_t) (0) /*!< POLY1305 Success */ +#define POLY1305_ERR_BAD_OPERATION (int32_t) (3102) /*!< POLY1305 Invalid operation */ +#define POLY1305_ERR_BAD_CONTEXT (int32_t) (3103) /*!< POLY1305 The context contains some invalid or uninitialized values */ +#define POLY1305_ERR_BAD_PARAMETER (int32_t) (3104) /*!< POLY1305 One of the expected function parameters is invalid */ +/** +* @} +*/ + + +/** @defgroup ARC4Error ARC4 Error Codes + * @{ + */ +#define ARC4_SUCCESS (int32_t) (0) /*!< ARC4 of PRIVKEY Success*/ +#define ARC4_ERR_BAD_OPERATION (int32_t) (3202) /*!< ARC4 of PRIVKEY Invalid operation */ +#define ARC4_ERR_BAD_CONTEXT (int32_t) (3203) /*!< ARC4 of PRIVKEY The ARC4 context contains some invalid or uninitialized values */ +#define ARC4_ERR_BAD_PARAMETER (int32_t) (3204) /*!< ARC4 of PRIVKEY One of the expected function parameters is invalid */ +/** + * @} + */ + +/** @defgroup DESError DES Error Codes + * @{ + */ +#define DES_SUCCESS (int32_t) (0) /*!< DES of PRIVKEY Success */ +#define DES_ERR_BAD_INPUT_SIZE (int32_t) (3301) /*!< DES of PRIVKEY Invalid input size, it must be multiple of 8 */ +#define DES_ERR_BAD_OPERATION (int32_t) (3302) /*!< DES of PRIVKEY Invalid operation */ +#define DES_ERR_BAD_CONTEXT (int32_t) (3303) /*!< DES of PRIVKEY The DES context contains some invalid or uninitialized values */ +#define DES_ERR_BAD_PARAMETER (int32_t) (3304) /*!< DES of PRIVKEY One of the expected function parameters is invalid*/ +/** + * @} + */ + +/** @defgroup TDESError TDES Error Codes + * @{ + */ +#define TDES_SUCCESS (int32_t) (0) /*!< TDES of PRIVKEY Success */ +#define TDES_ERR_BAD_INPUT_SIZE (int32_t) (3311) /*!< TDES of PRIVKEY Invalid input size, it must be multiple of 8 */ +#define TDES_ERR_BAD_OPERATION (int32_t) (3312) /*!< TDES of PRIVKEY Invalid operation */ +#define TDES_ERR_BAD_CONTEXT (int32_t) (3313) /*!< TDES of PRIVKEY The TDES context contains some invalid or uninitialized values */ +#define TDES_ERR_BAD_PARAMETER (int32_t) (3314) /*!< TDES of PRIVKEY One of the expected function parameters is invalid */ +/** + * @} + */ + +/** @defgroup HASHError HASH Error Codes + * @{ + */ +#define HASH_SUCCESS (int32_t) (0) /*!< hash Success */ +#define HASH_ERR_BAD_OPERATION (int32_t) (4001) /*!< hash Invalid operation */ +#define HASH_ERR_BAD_CONTEXT (int32_t) (4002) /*!< hash The HASH context contains some invalid or uninitialized values */ +#define HASH_ERR_BAD_PARAMETER (int32_t) (4003) /*!< hash One of the expected function parameters is invalid */ +#define HASH_ERR_INTERNAL (int32_t) (4011) /*!< hash Generic internal error */ +/** + * @} + */ + +/** @defgroup RSAError RSA Error Codes + * @{ + */ +#define RSA_SUCCESS (int32_t) (0) /*!< RSA Success */ +#define RSA_ERR_BAD_OPERATION (int32_t) (5102) /*!< RSA Invalid operation */ +#define RSA_ERR_BAD_KEY (int32_t) (5103) /*!< RSA Invalid Key */ +#define RSA_ERR_BAD_PARAMETER (int32_t) (5104) /*!< RSA One of the expected function parameters is invalid */ +#define RSA_ERR_UNSUPPORTED_HASH (int32_t) (5105) /*!< RSA The hash function is not supported */ +#define RSA_ERR_MESSAGE_TOO_LONG (int32_t) (5106) /*!< RSA Message too long */ +#define RSA_ERR_MODULUS_TOO_SHORT (int32_t) (5107) /*!< RSA modulus too short */ +#define RSA_ERR_GENERIC (int32_t) (5108) /*!< RSA Generic Error */ +/** + * @} + */ + +/** @defgroup ECCError ECC Error Codes + * @{ + */ +#define ECC_SUCCESS (int32_t) (0) /*!< ecc Success */ +#define ECC_ERR_BAD_OPERATION (int32_t) (5202) /*!< ecc Invalid operation */ +#define ECC_ERR_BAD_CONTEXT (int32_t) (5203) /*!< ecc The ECC context contains some invalid or initialized parameters */ +#define ECC_ERR_BAD_PARAMETER (int32_t) (5204) /*!< ecc One of the expected function parameters is invalid */ +#define ECC_ERR_BAD_PUBLIC_KEY (int32_t) (5205) /*!< ecc Invalid Public Key */ +#define ECC_ERR_BAD_PRIVATE_KEY (int32_t) (5206) /*!< ecc Invalid Private Key */ +#define ECC_ERR_MISSING_EC_PARAMETER (int32_t) (5207) /*!< ecc The EC parameters structure miss some parameter required by the function */ +#define ECC_WARN_POINT_AT_INFINITY (int32_t) (5208) /*!< ecc Returned Point is the point at infinity */ +/** + * @} + */ + +/** @defgroup RNGError Random Number Error Codes + * @{ + */ +#define RNG_SUCCESS (int32_t) (0) /*!< RNG Success */ +#define RNG_ERR_UNINIT_STATE (int32_t) (6001) /*!< RNG has not been correctly initialized */ +#define RNG_ERR_BAD_OPERATION (int32_t) (6002) /*!< RNG Invalid operation */ +#define RNG_ERR_RESEED_NEEDED (int32_t) (6003) /*!< RNG Reseed is needed */ +#define RNG_ERR_BAD_PARAMETER (int32_t) (6004) /*!< RNG One of the expected function parameters is invalid */ +#define RNG_ERR_BAD_ENTROPY_SIZE (int32_t) (6006) /*!< RNG Check the size of the entropy string */ +#define RNG_ERR_BAD_PERS_STRING_SIZE (int32_t) (6007) /*!< RNG Check the size of the personalization string */ +#define RNG_ERR_BAD_ADD_INPUT_SIZE (int32_t) (6008) /*!< RNG Check the size of the additional input string */ +#define RNG_ERR_BAD_REQUEST (int32_t) (6009) /*!< RNG Check the size of the random request */ +#define RNG_ERR_BAD_NONCE_SIZE (int32_t) (6010) /*!< RNG Check the size of the nocne */ +#define RNG_ERR_INTERNAL (int32_t) (6011) /*!< RNG Generic internal RNG error */ + + + + + +/** @defgroup ED25519Error Ed25519 Error Codes +* @{ +*/ +#define ED25519_SUCCESS (int32_t) (0) /*!< Ed25519 Success */ +#define ED25519_ERR_BAD_POINT (int32_t) (5505) /*!< Ed25519 Invalid Packet Point */ +#define ED25519_ERR_BAD_PARAMETER (int32_t) (5504) /*!< Ed25519 One of the expected function parameters is invalid */ + + +/** +* @} +*/ + +/** @defgroup C25519Error Curve25519 Error Codes +* @{ +*/ +#define C25519_SUCCESS (int32_t) (0) /*!< Curve25519 Success */ +#define C25519_ERR_BAD_POINT (int32_t) (5605) /*!< Curve25519 Invalid Packet Point */ +#define C25519_ERR_BAD_PARAMETER (int32_t) (5604) /*!< Curve25519 One of the expected function parameters is invalid */ + + +/** +* @} +*/ + +/** @defgroup MathError Mathemtical Error Codes + * @{ + */ +#define MATH_SUCCESS (int32_t) (0) /*!< Math Success */ +#define MATH_ERR_BIGNUM_OVERFLOW (int32_t) (5301) /*!< Math Overflow, the returned BigNum would be greater than its maximum size */ +#define MATH_ERR_EVEN_MODULUS (int32_t) (5302) /*!< Math This function can be used only with odd moduli */ +#define MATH_ERR_BAD_PARAMETER (int32_t) (5304) /*!< Math One of the expected function parameters is invalid */ +#define MATH_ERR_INTERNAL (int32_t) (5311) /*!< Math Generic internal error */ + +/** + * @} + */ + +/** @defgroup CHACHA20POLY1305Error ChaCha20-Poly1305 Error Codes +* @{ +*/ +#define CHACHA20POLY1305_SUCCESS (int32_t) (0) /*!< ChaCha20-Poly1305 Success */ +#define CHACHA20POLY1305_ERR_BAD_OPERATION (int32_t) (3102) /*!< ChaCha20-Poly1305 Invalid operation */ +#define CHACHA20POLY1305_ERR_BAD_CONTEXT (int32_t) (3103) /*!< ChaCha20-Poly1305 The context contains some invalid or uninitialized values */ +#define CHACHA20POLY1305_ERR_BAD_PARAMETER (int32_t) (3104) /*!< ChaCha20-Poly1305 One of the expected function parameters is invalid */ + +/** +* @} +*/ + + #ifdef __cplusplus +} +#endif + +#endif /* __CRL_ERR_CODES_H__ */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/macros.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/macros.h new file mode 100644 index 0000000..c35c74c --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/macros.h @@ -0,0 +1,303 @@ +/** + ****************************************************************************** + * @file macros.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Support Macros for functions of the Cryptolib + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_MACROS_H__ +#define __CRL_MACROS_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +/* Exported types --------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/** @addtogroup InternalAPI Internal functions + * @{ + */ + +/** @addtogroup Macros Macros + * @{ + */ + +/** + * @brief This macro returns the number of 32-bit words required + * to store a variable whose byte size is passed in input + * @param b Number of bytes + * @retval Number of words required to store a variable of size b + */ +#define WORD_COUNT(b) ((int32_t) ((uint32_t) b + 3u) / 4u) + +/** + * @brief This macro returns the maximum value between two inputs, + * the evaluation is done with the ">" operator + * @param a First input + * @param b Second input + * @retval Max(a,b) + */ +#define MAX(a,b) ((((uint32_t)(a)) > ((uint32_t)(b))) ? (a) : (b)) + +/** + * @brief This macro returns the minumum value between two inputs, + * the evaluation is done with the ">" operator + * @param a First input + * @param b Second input + * @retval Min(a,b) + */ +#define MIN(a,b) ((((uint32_t)(a)) > ((uint32_t)(b))) ? (b) : (a)) + + +/** + * @brief This macro is used to rotate left a 32bit variable by bits bits + * @param value The 32 bit value to rotate left + * @param bits The number of bits to rotate left + * @retval Roteted 32 bit value + */ +#ifdef CL_ON_STM32 +#define ROL(value, bits) (uint32_t) __ROR((value),32 - (bits)) +#else +#define ROL(value, bits) (uint32_t) (((value) << (bits)) | ((value) >> (32 - (bits)))) +#endif + +/** + * @brief This macro is used to rotate right a 32bit variable by bits bits + * @param value The 32 bit value to rotate right + * @param bits The number of bits to rotate right + * @retval Roteted 32 bit value + */ +#ifdef CL_ON_STM32 +#define ROR(value, bits) (uint32_t) __ROR((value),(bits)) +#else +#define ROR(value, bits) (uint32_t) (((value) >> (bits)) | ((value) << (32 - (bits)))) +#endif + +/** + * @brief This macro returns the least significant byte from an int32_t + * @param P_word The 32-bit from which the least significant byte is taken + * @retval Least significant byte of P_word + */ +#define BYTE_3(P_word) (uint8_t) (P_word & 0xFFu) + +/** + * @brief This macro returns the second least significant byte from an int32_t + * @param P_word The 32-bit from which the second least significant byte is taken + * @retval Second least significant byte of P_word + */ +#define BYTE_2(P_word) (uint8_t) ((P_word >> 8) & 0xFFu) + +/** + * @brief This macro returns the second most significant byte from an int32_t + * @param P_word The 32-bit from which the second most significant byte is taken + * @retval Second most significant byte of P_word + */ +#define BYTE_1(P_word) (uint8_t) ((P_word >> 16) & 0xFFu) + +/** + * @brief This macro returns the most significant byte from an int32_t + * @param P_word The 32-bit from which the most significant byte is taken + * @retval Most significant byte of x + */ +#define BYTE_0(P_word) (uint8_t) ((P_word >> 24) & 0xFFu) + +/** + * @brief This macro returns a byte within an word + * @param P_word The 32-bit from which the byte + * @param P_n The index of the byte to be taken, 0 = MSB, 3 = LSB + * @retval Selected P_n byte from P_word + */ +#define BYTE_X(P_word, P_n) (uint8_t) ((P_word >> (24 - (8 * (P_n)))) & 0xFFu) + + +/** + * @brief This macro outputs the 4 octects that form the input 32bit integer + * @param [in] P_x The input 32bit integer + * @param [out] P_a The least significant byte of P_x + * @param [out] P_b The second least significant byte of P_x + * @param [out] P_c The second most significant byte of P_x + * @param P_d The most significant byte of P_x + * @retval none + */ +#define WORD32_TO_WORD8(P_x,P_a,P_b,P_c,P_d) P_a=(uint8_t)BYTE_3(P_x),P_b=(uint8_t)BYTE_2(P_x),P_c=(uint8_t)BYTE_1(P_x),P_d=(uint8_t)BYTE_0(P_x) + + +/** + * @brief This macro returns an integer from 4 octects + * @param P_b0 The most significant byte of the resulting integer + * @param P_b1 The second most byte of the resulting integer + * @param P_b2 The second least byte of the resulting integer + * @param P_b3 The least byte of the resulting integer + * @retval The resulting 32bit integer formed by P_b0 || P_b1 || P_b2 || P_b3 + */ +#define WORD8_TO_WORD32(P_b0, P_b1, P_b2, P_b3) (uint32_t) ((uint32_t)(P_b0) << 24 | (uint32_t)(P_b1) << 16 | (uint32_t)(P_b2) << 8 | (P_b3)) + +#if CRL_ENDIANNESS==1 + +/** + * @brief This macro is used on little endian cpus to convert a + * 4 byte array into a 32 bit integer or viceversa. + * @param VariableToConvert The 32 bits value to be converted + * @retval The converted 32 bits value + */ +#ifdef CL_ON_STM32 +#define LE_CONVERT_W32(VariableToConvert) (uint32_t) (__REV(VariableToConvert)) +#else +#define LE_CONVERT_W32(VariableToConvert) (uint32_t) ((ROL( (uint32_t) VariableToConvert,24) & 0xFF00FF00u ) | (ROL( (uint32_t) VariableToConvert,8) & 0x00FF00FFu )) +#endif + +#elif CRL_ENDIANNESS==2 + +/** + * @brief This macro doesn't do anything. It exist for compatibility with + * little endian cpus. + * @param VariableToConvert The 32 bit value to be converted + * @retval VariableToConvert as it was passed + * @note This macro simply returns its argument as it is. + */ +#define LE_CONVERT_W32(VariableToConvert) (VariableToConvert) +#else /* CRL_ENDIANNESS NOT SET */ +#error "Please select endianness in config.h" +#endif /* #if CRL_ENDIANNESS */ + + +/* Support macro for rand.c for big endian cpus */ +#if CRL_ENDIANNESS==2 + +/** + * @brief This macro is used on big endian cpus to convert a + * a 32 bit integer into a little endian array of 4 bytes. + * @param VariableToConvert The 32 bits value to be converted + * @retval The converted 32 bits value + */ +#define BE_CONVERT_W32(VariableToConvert) ((ROL(VariableToConvert,24)&0xFF00FF00) | (ROL(VariableToConvert,8)&0x00FF00FF)) +#endif + +#ifdef CRL_CPU_SUPPORT_MISALIGNED + +/** + * @brief This macro is used to read a 4 bytes from a byte array and return + * it as a 32-bit word, taking care of system endianness + * @param P_pInputBuffer Pointer to the input byte buffer + * @param P_index Index of P_pInputBuffer where the reading should start + * @retval The 32 bits value + * @note This macro is for systems where unaligned reading is allowed + */ +#define BUFFER_2_W32(P_pInputBuffer,P_index) (LE_CONVERT_W32(*((const uint32_t *) ((P_pInputBuffer)+(P_index))))) +/** +* @brief This macro is used to read a 4 bytes from a byte array and return +* it as a 32-bit word with reversed endiannes +* @param P_pInputBuffer Pointer to the input byte buffer +* @param P_index Index of P_pInputBuffer where the reading should start +* @retval The 32 bits value +* @note This macro is for systems where unaligned reading is allowed +*/ +#define BUFFER_2_LEW32(P_pInputBuffer,P_index) ((*((const uint32_t *) ((P_pInputBuffer)+(P_index))))) + +/** + * @brief This macro is used to write a 32bit integer into a byte buffer, + * taking care of system endianness + * @param [out] P_pOutputBuffer Pointer to the output byte buffer + * @param [in] P_index Index of P_pOutputBuffer where the writing should start + * @param [in] P_word The 32-bit word that will be written + * @retval none + * @note This macro is for systems where unaligned writing is allowed + */ + +#define W32_2_BUFFER(P_pOutputBuffer,P_index,P_word) *((uint32_t*)(P_pOutputBuffer+(P_index)))=LE_CONVERT_W32(P_word) +/** +* @brief This macro is used to write a 32bit integer into a byte buffer, +* with reversed endiannes +* @param [out] P_pOutputBuffer Pointer to the output byte buffer +* @param [in] P_index Index of P_pOutputBuffer where the writing should start +* @param [in] P_word The 32-bit word that will be written +* @retval none +* @note This macro is for systems where unaligned writing is allowed +*/ +#define LEW32_2_BUFFER(P_pOutputBuffer,P_index,P_word) *((uint32_t*)(P_pOutputBuffer+(P_index)))=(P_word) +#else + +/** + * @brief This macro is used to read a 4 bytes from a byte array and return + * it as a 32-bit word + * @param P_pInputBuffer Pointer to the input byte buffer + * @param P_index Index of P_pInputBuffer where the reading should start + * @retval The 32 bits value + * @note This macro is for systems where unaligned reading is \b not allowed + */ +#define BUFFER_2_W32(P_pInputBuffer,P_index) (WORD8_TO_WORD32(P_pInputBuffer[(P_index)],P_pInputBuffer[(P_index)+1],P_pInputBuffer[(P_index)+2],P_pInputBuffer[(P_index)+3])) + +/** +* @brief This macro is used to read a 4 bytes from a byte array and return +* it as a 32-bit word with reversed endiannes +* @param P_pInputBuffer Pointer to the input byte buffer +* @param P_index Index of P_pInputBuffer where the reading should start +* @retval The 32 bits value +* @note This macro is for systems where unaligned reading is \b not allowed +*/ +#define BUFFER_2_LEW32(P_pInputBuffer,P_index) (WORD8_TO_WORD32((P_pInputBuffer)[(P_index)+3],(P_pInputBuffer)[(P_index)+2],(P_pInputBuffer)[(P_index)+1],(P_pInputBuffer)[(P_index)])) + +/** + * @brief This macro is used to write a 32bit integer into a byte buffer, + * taking care of system endianness + * @param [out] P_pOutputBuffer Pointer to the output byte buffer + * @param [in] P_index Index of P_pOutputBuffer where the writing should start + * @param [in] P_word The 32-bit word that will be written + * @retval none + * @note This macro is for systems where unaligned writing is \b not allowed + */ +#define W32_2_BUFFER(P_pOutputBuffer,P_index,P_word) WORD32_TO_WORD8((P_word),P_pOutputBuffer[(P_index)+3],P_pOutputBuffer[(P_index)+2],P_pOutputBuffer[(P_index)+1],P_pOutputBuffer[(P_index)]) + +/** +* @brief This macro is used to write a 32bit integer into a byte buffer, +* with reversed endiannes +* @param [out] P_pOutputBuffer Pointer to the output byte buffer +* @param [in] P_index Index of P_pOutputBuffer where the writing should start +* @param [in] P_word The 32-bit word that will be written +* @retval none +* @note This macro is for systems where unaligned writing is \b not allowed +*/ +#define LEW32_2_BUFFER(P_pOutputBuffer,P_index,P_word) WORD32_TO_WORD8((P_word),(P_pOutputBuffer)[(P_index)],(P_pOutputBuffer)[(P_index)+1],(P_pOutputBuffer)[(P_index)+2],(P_pOutputBuffer)[(P_index)+3]) + + +#endif + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif +/* Exported functions ------------------------------------------------------- */ + +#endif /*__CRL_MACROS_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/sk.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/sk.h new file mode 100644 index 0000000..46323d1 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/sk.h @@ -0,0 +1,114 @@ +/** + ****************************************************************************** + * @file sk.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Symmetric Key Common Definitions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_SK_H__ +#define __CRL_SK_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ + +/** @addtogroup SymKey + * @{ + */ +/* Exported types ----------------------------------------------------------- */ + +typedef enum { + E_SK_DEFAULT = (uint32_t) (0x00000000), /*!< User Flag: No flag specified. This is the default value that should be set to this flag */ + E_SK_DONT_PERFORM_KEY_SCHEDULE = (uint32_t) (0x00000001), /*!< User Flag: Used to force the init to not reperform key schedule.\n + The classic example is where the same key is used on a new message, in this case to redo key scheduling is + a useless waste of computation, could be particularly useful on GCM, where key schedule is very complicated. */ + E_SK_FINAL_APPEND = (uint32_t) (0x00000020), /*!< User Flag: Must be set in CMAC mode before the final Append call occurs. */ + E_SK_OPERATION_COMPLETED = (uint32_t) (0x00000002), /*!< Internal Flag (not to be set/read by user): used to check that the Finish function has been already called */ + E_SK_NO_MORE_APPEND_ALLOWED = (uint32_t) (0x00000004), /*!< Internal Flag (not to be set/read by user): it is set when the last append has been called. Used where the append is called with an InputSize not + multiple of the block size, which means that is the last input.*/ + E_SK_NO_MORE_HEADER_APPEND_ALLOWED = (uint32_t) (0x00000010), /*!< Internal Flag (not to be set/read by user): only for authenticated encryption modes. \n + It is set when the last header append has been called. Used where the header append is called with an InputSize not + multiple of the block size, which means that is the last input.*/ + E_SK_APPEND_DONE = (uint32_t) (0x00000040), /*!< Internal Flag (not to be set/read by user): only for CMAC.It is set when the first append has been called */ + E_SK_SET_COUNTER = (uint32_t)(0x00000080), /*!< User Flag: With ChaCha20 this is used to indicate a value for the counter, used to process non contiguous blocks (i.e. jump ahead)*/ + +} SKflags_et; /*!< Type definitation for Symmetric Key Flags */ + +/** + * @} + */ + +/** @addtogroup InternalAPI Internal functions + * @{ + */ + +/** @defgroup SymKeylowlevel Symmetric Key Low Level Flags + * @{ + */ + +#define C_ENC (uint32_t) (0x00000000) /*!< Internal contant indicating "Encryption" */ +#define C_DEC (uint32_t) (0x00000001) /*!< Internal contant indicating "Decryption" */ +#define C_DIR_MASK (uint32_t) (0x00000001) /*!< Internal mask for Encryption/Decryption */ +#define C_ECB (uint32_t) (0x00000002) /*!< Internal contant indicating "ECB" */ +#define C_CBC (uint32_t) (0x00000004) /*!< Internal contant indicating "CBC" */ +#define C_CTR (uint32_t) (0x00000006) /*!< Internal contant indicating "CTR" */ +#define C_MODE_MASK (uint32_t) (0x00000006) /*!< Internal mask for ECB/CBC/CTR */ +#define C_DES (uint32_t) (0x00000008) /*!< Internal contant indicating "DES" */ +#define C_TDES (uint32_t) (0x00000010) /*!< Internal contant indicating "TDES" */ +#define C_AES (uint32_t) (0x00000018) /*!< Internal contant indicating "AES" */ +#define C_ALGO_MASK (uint32_t) (0x00000018) /*!< Internal mask for DES/TDES/AES */ +#define C_AES128 (uint32_t) (0x10000000) /*!< Internal contant indicating "AES with key of 128" */ +#define C_AES192 (uint32_t) (0x18000000) /*!< Internal contant indicating "AES with key of 192" */ +#define C_AES256 (uint32_t) (0x20000000) /*!< Internal contant indicating "AES with key of 256" */ +#define C_AES_KEY_MASK (uint32_t) (0x00000038) /*!< Internal mask for AES128/AES192/AES256 */ + + +/* Directions of the operations */ +#define CRL_ENC 0 /*!< Used to specify an encryption operation. */ +#define CRL_DEC 1 /*!< Used to specify a decryption operation. */ + +/* Modes of operation */ +#define CRL_ECB 0 /*!< Used to specify the Electronic Code Book mode of operation. */ +#define CRL_CBC 1 /*!< Used to specify the Cipher Block Chaining mode of operation. */ +#define CRL_CTR 2 /*!< Used to specify the Counter mode of operation (for AES only). */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __CRL_SK_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/types.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/types.h new file mode 100644 index 0000000..8a90da6 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common/types.h @@ -0,0 +1,101 @@ +/** + ****************************************************************************** + * @file types.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Define the various basic types needed by the Library + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_TYPES_H__ +#define __CRL_TYPES_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ + +/** @addtogroup UserAPI User Level API + * @{ + */ + +/** @addtogroup TYPES Data Types Definitions + * @{ + */ + +#if !defined(_STDINT_H) && !defined(__stdint_h) && !defined(_STDINT) + +#ifndef __uint8_t_defined + +typedef unsigned int uint32_t; /*!< stdint.h defintion of uint32_t */ +typedef unsigned char uint8_t; /*!< stdint.h defintion of uint8_t */ +typedef unsigned short int uint16_t; /*!< stdint.h defintion of uint16_t */ +typedef unsigned long long uint64_t; /*!< stdint.h defintion of uint64_t */ + +#define __uint8_t_defined +#define __uint16_t_defined +#define __uint32_t_defined +#define __uint64_t_defined +#endif /*!< __uint8_t_defined */ + +#ifndef __int8_t_defined + +typedef signed long long int64_t; /*!< stdint.h defintion of int64_t */ +typedef signed int int32_t; /*!< stdint.h defintion of int32_t */ +typedef signed short int int16_t; /*!< stdint.h defintion of int16_t */ +typedef signed char int8_t; /*!< stdint.h defintion of int8_t */ +#define __int8_t_defined +#define __int16_t_defined +#define __int32_t_defined +#define __int64_t_defined +#endif /* __int8_t_defined */ + +#endif /* !defined(_STDINT_H) && !defined(__stdint_h) && !defined(_STDINT) */ + +/** @brief Type definitation for a pre-allocated memory buffer that is required by some functions */ +typedef struct +{ + uint8_t *pmBuf; /*!< Pointer to the pre-allocated memory buffer, this must be set by the user*/ + uint16_t mSize; /*!< Total size of the pre-allocated memory buffer */ + uint16_t mUsed; /*!< Currently used portion of the buffer, should be inititalized by user to zero */ +} +membuf_stt; + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __CRL_TYPES_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_chacha20_poly1305/chacha20_core.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_chacha20_poly1305/chacha20_core.h new file mode 100644 index 0000000..f3b5e9f --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_chacha20_poly1305/chacha20_core.h @@ -0,0 +1,64 @@ +/** +****************************************************************************** +* @file chacha20_core.h +* @author MCD Application Team +* @version V3.0.0 +* @date 05-June-2015 +* @brief Implements the core chacha functionality +****************************************************************************** +* @attention +* +*

© COPYRIGHT 2015 STMicroelectronics

+* +* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); +* You may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.st.com/software_license_agreement_liberty_v2 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +******************************************************************************/ +/* +* The implementation of chacha20 is just an adapatation (for consistency with +* the library) of code coming from: chacha-ref.c version 20080118 D. J. Bernstein +* Which was released in Public domain. +*/ + + +/* Includes ------------------------------------------------------------------*/ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ + +/** @addtogroup SymKeylowlevel +* @{ +*/ + +/** @defgroup CHACHAlowlevel ChaCha +* @brief Internal ChaCha Functions and Macros +* @{ +*/ + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +void salsa20_wordtobyte(uint8_t output[64],\ + const uint32_t input[16]); + +/** +* @} SymKeylowlevel +*/ + +/** +* @} CHACHAlowlevel +*/ + + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_chacha20_poly1305/poly1305_core.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_chacha20_poly1305/poly1305_core.h new file mode 100644 index 0000000..1a3fb46 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_chacha20_poly1305/poly1305_core.h @@ -0,0 +1,70 @@ +/** +****************************************************************************** +* @file poly1305_core.h +* @author MCD Application Team +* @version V3.0.0 +* @date 05-June-2015 +* @brief Implements the core poly1305 functionality +****************************************************************************** +* @attention +* +*

© COPYRIGHT 2015 STMicroelectronics

+* +* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); +* You may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.st.com/software_license_agreement_liberty_v2 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +******************************************************************************/ +/* The implementation of poly1305 is heavily based on the 32-bit version of the +* code available at https://github.com/floodyberry/poly1305-donna which was +* released by the author (Andrew Moon) in the public domain. +*/ + +/* Includes ------------------------------------------------------------------*/ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ + +/* Private variables ---------------------------------------------------------*/ + +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @addtogroup SymKeylowlevel +* @{ +*/ + +/** @defgroup POLY1305lowlevel Poly1305-AES +* @brief Internal Poly1305-AES Function +* @{ +*/ + +void Poly1305_Core_Update (uint32_t *P_h, \ + const uint32_t *P_r, \ + const uint8_t *P_pInput,\ + uint32_t P_LastBlock); + +void Poly1305_Core_Finish(uint32_t *P_h, \ + const uint32_t *P_pad,\ + uint32_t *P_pTag); + +/** +* @} +*/ + +/** +* @} +*/ + + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/arith.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/arith.h new file mode 100644 index 0000000..a992570 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/arith.h @@ -0,0 +1,100 @@ +/** + ****************************************************************************** + * @file arith.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Basic Arithmetic Functions for Big Numbers (Multi Precision Integers) + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_ARITH_H__ +#define __CRL_ARITH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ +#include "bn.h" + + /** @ingroup Arith + * @{ + */ + + /* Exported functions ------------------------------------------------------- */ + + /* z=x+y.**********************************************************************/ + int32_t AddBig (const BigNum_stt *P_pAddend1BN, \ + const BigNum_stt *P_pAddend2BN, \ + BigNum_stt *P_pSumBN, \ + membuf_stt *P_pMemBuf); + + /* z=x-y. *********************************************************************/ + int32_t SubBig (const BigNum_stt *P_pMinuendBN, \ + const BigNum_stt *P_pSubtrahendBN, \ + BigNum_stt * P_pDifferenceBN, \ + membuf_stt *P_pMemBuf); + + /* x=x<<1. + * Left shift of 1 bit. */ + int32_t FastMul2 (BigNum_stt *P_pBN); + + void FastDiv2 (BigNum_stt *P_pBN); + + /* x=x<<(esp words). Left shift of esp words. ********************************/ + int32_t FastMulInnerBase (BigNum_stt *P_pBN, \ + uint16_t P_exp); + + /* x=x>>(esp words). Right shift of esp words. *******************************/ + void FastDivInnerBase (BigNum_stt * P_pBN, \ + uint16_t P_exp); + + /* x=x<
© COPYRIGHT 2015 STMicroelectronics
+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_BN_H__ +#define __CRL_BN_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup BN + * @{ + */ + + /* Exported types ------------------------------------------------------------*/ + /** + * @brief Structure used to store a BigNum_stt * integer. + */ + typedef struct + { + uint32_t *pmDigit; /*!< Used to represent the BigNum_stt * integer value; pmDigit[0] = least significant word. */ + uint16_t mNumDigits; /*!< Number of significant words of the vector pmDigit used to represent the actual value. */ + uint8_t mSize; /*!< Number of words allocated for the integer */ + int8_t mSignFlag; /*!< Is the integer mSignFlag: SIGN_POSITIVE positive, SIGN_NEGATIVE negative. */ + } + BigNum_stt; + + /* Exported constants --------------------------------------------------------*/ + +#define NBIT_DIGIT 32u /*!< Bit Size of a BigNum digit (should equal to CPU word size, works for 32). */ +#define MSBIT_MASK 0x80000000u /*!< Mask for the most significant bit in a digit */ +#define MSBYTE_MASK 0xFF000000u /*!< Mask for the most significant byte in a digit */ +#define LSBIT_MASK 0x00000001u /*!< Mask for the least significant bit in a digit */ +#define MAX_DIGIT_VALUE 0xFFFFFFFFu /*!< Mask for all bit to 1 in a word */ +#define SIGN_POSITIVE 0 /*!< Used to denote a positive Big Number. */ +#define SIGN_NEGATIVE 1 /*!< Used to denote a negative Big Number. */ + + /* Exported functions ------------------------------------------------------- */ + /* Big Number Operations ******************************************************/ + + /* Alloc big *****************************************************************/ + int32_t StAllocBig(BigNum_stt **P_ppBignum, \ + int32_t P_wordSize, \ + membuf_stt *P_pMembuf); + + /* StFree big ****************************************************************/ + void StFreeBig (BigNum_stt **P_pBignum, \ + membuf_stt *P_pMembuf); + + /* x = initial_value. Sets the words x->pmDigit[1]_ _ _x->pmDigit[MAX_LEN_BIG-1] to 0. */ + void InitBig (BigNum_stt * P_pBN, \ + int32_t P_initialValue); + + /* y=x. ***********************************************************************/ + int32_t CopyBig (const BigNum_stt *P_pInputBN, \ + BigNum_stt *P_pOutputBN); + + /* Returns 1 if x==0, 0 otherwise. ********************************************/ + int32_t IsZeroBig (const BigNum_stt *P_pInputBN); + + /* x=0. ***********************************************************************/ + void SetZeroBig (BigNum_stt * P_pInputBN); + + /* Returns 1 if x>=0, returns 0 if x<0. ***************************************/ + int32_t SignBig (const BigNum_stt *P_pInputBN); + + int32_t EvenBig (const BigNum_stt *P_pBN); + + /* Compares two BigNum_stt * integer. *****************************************/ + int32_t CompareBig(const BigNum_stt *P_pInput1BN, \ + const BigNum_stt *P_pInput2BN); + + /* If x==0 returns 1. ********************************************************/ + int32_t CountBits (const BigNum_stt *P_pInputBN); + + int32_t CountBytes(const BigNum_stt * P_pInputBN); + + /* Returns the value of the pos-th bit of x. **********************************/ + uint16_t GiveBit (const BigNum_stt *P_pBN, \ + uint32_t P_pos); + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_BN_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/conv.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/conv.h new file mode 100644 index 0000000..0a818bb --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/conv.h @@ -0,0 +1,76 @@ +/** + ****************************************************************************** + * @file conv.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Functions used to convert data representation from/to + * Big Numbers and byte (octect) arrays + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_CONV_H__ +#define __CRL_CONV_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ +#include "bn.h" + + /** @ingroup Conv + * @{ + */ + + /* Exported functions ------------------------------------------------------- */ + /* Converts a vector of 32 bits words ("in") to a vector of 8 bits words ("out"). */ + void W32_to_W8 (const uint32_t *P_pArrayIn, \ + uint8_t *P_pArrayOut, \ + int32_t P_ReqW8); + + /* Converts a vector of 8 bits words ("in") to a BigNum_stt * ("out"). ********/ + int32_t W8_to_Big (const uint8_t *P_pArrayIn, \ + uint32_t P_ArrayInSize, \ + BigNum_stt * P_outBig); + + /* Converts a BigNum_stt * ("in") to a vector of 8 bits words ("out").*********/ + void Big_to_W8 (BigNum_stt * P_inBig, \ + uint8_t *P_pArrayOut, \ + int32_t *P_pArrayOutSize); + + /* Converts a BigNum_stt * ("in") to a vector of 8 bits words of fixed size("out") */ + int32_t Big_to_fixedW8 (BigNum_stt * P_pInBig, \ + uint8_t *P_pArrayOut, \ + int32_t P_pArrayOutSize); + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_CONV_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/modular.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/modular.h new file mode 100644 index 0000000..1aa0619 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/modular.h @@ -0,0 +1,92 @@ +/** + ****************************************************************************** + * @file modular.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides Base Modular Arithmetic Operations + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_MODULAR_H__ +#define __CRL_MODULAR_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup Modular + * @{ + */ + + /* Exported types ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + /* Modular addition ***********************************************************/ + int32_t ModularAddBig (const BigNum_stt * P_pAddend1BN, \ + const BigNum_stt * P_pAddend2BN, \ + BigNum_stt * P_pModSumBN, \ + const BigNum_stt * P_pModBN, \ + membuf_stt *P_pMemBuf); + \ + + /* Modular Subtraction ********************************************************/ + int32_t ModularSubBig (const BigNum_stt * P_pMinuendBN, \ + const BigNum_stt * P_pSubtrahendBN, \ + BigNum_stt * P_pModDiffBN, \ + const BigNum_stt * P_pModBN, \ + membuf_stt *P_pMemBuf); + \ + + /* Fast Modular multiplication by 2 *******************************************/ + int32_t ModularFastMul2 (BigNum_stt * P_pBN, \ + const BigNum_stt * P_pModBN, \ + membuf_stt *P_pMemBuf); + \ + + /* Modular inversion **********************************************************/ + int32_t ModularInvBig (const BigNum_stt *P_pInputBN, \ + BigNum_stt *P_pInverseBN, \ + const BigNum_stt *P_pModBN, \ + membuf_stt *P_pMemBuf ); + \ + + /* Modular exponentiation *****************************************************/ + int32_t ModularExpSlidWin(BigNum_stt * P_pBaseBN, \ + const BigNum_stt * P_pExpBN, \ + const BigNum_stt * P_pModulusBN, \ + BigNum_stt *P_pOutputBN, \ + membuf_stt *P_pMemBuf); + \ + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_MODULAR_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/monty.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/monty.h new file mode 100644 index 0000000..5f521ae --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/monty.h @@ -0,0 +1,107 @@ +/** + ****************************************************************************** + * @file monty.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides Montgomery Operations + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_MONTY_H__ +#define __CRL_MONTY_H__ + +/* When multiplications are required the routines called are: MultiplyBig() and SquareBig(). +* The implementation of these two functions depends by the value of the constant +* BASIC_MUL_BIG defined in MulDiv.h. */ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup Monty + * @{ + */ + + /* Exported types ------------------------------------------------------------*/ + + /** + * @brief Structure used to store Montgomery domain parameters. + */ + typedef struct + { + const BigNum_stt *pmModulusBN; /*!< The modulus on which are reffered the parameters. */ + BigNum_stt *pmR2; /*!< The Montgomery Parameter */ + uint32_t mModInvLSW; /*!< The least significant word of -(modulus^(-1)) (mod MontRadix). */ + membuf_stt *pmMemBuf; + } + montyParams_stt; + + /* Exported functions ------------------------------------------------------- */ + + /* Montgomery Modular Operations **********************************************/ + + /* Comment: given an integer x in Zm, the Montgomery residue (o M-residue) is: + * xR (mod m), get as: MontyExit(A = x*R^2,T) or + * MontyMul(x,R^2,Residuo_x). */ + + /* Initializes Montgomery parameters according to the modulus m. (different implementation) */ + int32_t MontyInit (const BigNum_stt *P_pModulusBN, \ + montyParams_stt *P_pMontyParams, \ + membuf_stt *P_pMemBuf); + \ + /* Free R^2 inside the montgomery parameters contained in a montyParams_stt structure */ + void MontyKillR2 (montyParams_stt * P_pMontyParams); + + /* Sets to zero all Montgomery parameters. ************************************/ + void MontyKillAll (montyParams_stt *P_pMontyParams); + + /* y=x(R^-1) (mod m); x from the Montgomery domain it is carried to integer modulo m. */ + int32_t MontyExit (const BigNum_stt *P_pMontyBN, \ + BigNum_stt *P_pNormalBN, \ + const montyParams_stt *P_pMontyParams); + \ + + /* Montgomery cios multiplication *********************************************/ + int32_t MontyMul (const BigNum_stt * P_pFactor1BN, \ + const BigNum_stt * P_pFactor2BN, \ + BigNum_stt * P_pProductBN, \ + const montyParams_stt *P_pMontyParams); + \ + + /* Exported macros ------------------------------------------------------- */ + /* Squaring in monty domain ***************************************************/ +#define MontySqr(P_Base,P_Square,P_pMontyParams) MontyMul((P_Base),(P_Base),(P_Square),(P_pMontyParams)) + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_MONTY_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/rng_bn.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/rng_bn.h new file mode 100644 index 0000000..16c93fb --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/BN/rng_bn.h @@ -0,0 +1,73 @@ +/* + ****************************************************************************** + * @file rng_bn.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Random Generation of BigNumers + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_RNG_BN_H__ +#define __CRL_RNG_BN_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ +#include "bn.h" +#include "../../../RNG/rng.h" + + /** @ingroup RNGBN + * @{ + */ + /* Exported types --------------------------------------------------------*/ + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + /* Generate random number of P_nBits bits */ + int32_t GenRndBN (int32_t P_nBits, \ + BigNum_stt *P_pRandBN, \ + RNGstate_stt *P_pRandomState); + \ + + + /* Generate random big number smaller than P_pModBN ********************************/ + int32_t GenRndBNmodN (BigNum_stt *P_pRandBN, \ + const BigNum_stt *P_pModBN, \ + RNGstate_stt *P_pRandomState); + \ + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_RNG_BN_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/math.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/math.h new file mode 100644 index 0000000..dfc6b9e --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ecc_rsa/MATH/math.h @@ -0,0 +1,49 @@ +/** + ****************************************************************************** + * @file math.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Container for the mathematical functionalities + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/** @ingroup Math + * @{ + */ +/* Includes ------------------------------------------------------------------*/ +#include "BN/bn.h" +#include "BN/conv.h" +#include "BN/arith.h" +#include "BN/monty.h" +#include "BN/modular.h" +#ifdef INCLUDE_RNG +#include "BN/rng_bn.h" +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +/** + * @} Math + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ed25519_c25519/internals/fe25519.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ed25519_c25519/internals/fe25519.h new file mode 100644 index 0000000..a862e50 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/Common_ed25519_c25519/internals/fe25519.h @@ -0,0 +1,101 @@ +/** +****************************************************************************** +* @file fe25519.h +* @author MCD Application Team +* @version V3.0.0 +* @date 05-June-2015 +* @brief fe25519 header file +****************************************************************************** +* @attention +* +*

© COPYRIGHT 2015 STMicroelectronics

+* +* Licensed under MCD-ST Image SW License Agreement V2, (the "License"); +* You may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.st.com/software_license_agreement_liberty_v2 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +****************************************************************************** +*/ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FE25519_H__ +#define __FE25519_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @addtogroup FE25519 fe25519 + * @brief Arithmetic in GF(2^255-19) + * @{ + */ + + /* Includes ------------------------------------------------------------------*/ + /* Exported types ------------------------------------------------------------*/ + + typedef struct + { + uint32_t v[8]; /*!< uint32_t array representing the number in low endian format */ + } + fe25519; /*!< Representation of a number in GF(2^255-19) */ + + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + void fe25519_freeze(fe25519 *r); + + void fe25519_unpack(fe25519 *r, const uint8_t x[32]); + + void fe25519_pack(uint8_t r[32], const fe25519 *x); + + int32_t fe25519_iszero(const fe25519 *x); + + int32_t fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y); + + void fe25519_cmov(fe25519 *r, const fe25519 *x, uint8_t b); + + void fe25519_copy(fe25519 *r, const fe25519 *x); + + void fe25519_setone(fe25519 *r); + + void fe25519_setzero(fe25519 *r); + + void fe25519_neg(fe25519 *r, const fe25519 *x); + + uint8_t fe25519_getparity(const fe25519 *x); + + void fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y); + + void fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y); + + void fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y); + + void fe25519_square(fe25519 *r, const fe25519 *x); + + void fe25519_invert(fe25519 *r, const fe25519 *x); + + void fe25519_pow2523(fe25519 *r, const fe25519 *x); + + void fe25519_mult121665(fe25519 *r, const fe25519 *x); + + /** + * @} fe25519 + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FE25519_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/CBC/des_cbc.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/CBC/des_cbc.h new file mode 100644 index 0000000..52504d4 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/CBC/des_cbc.h @@ -0,0 +1,90 @@ +/** + ****************************************************************************** + * @file des_cbc.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief DES in CBC Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_DES_CBC_H__ +#define __CRL_DES_CBC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup DESCBC + * @{ + */ + /* Exported types ------------------------------------------------------------*/ + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ +#ifdef INCLUDE_ENCRYPTION + /* load the key and ivec, eventually performs key schedule, etc. *****/ + int32_t DES_CBC_Encrypt_Init (DESCBCctx_stt *P_pDESCBCctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times **********************/ + int32_t DES_CBC_Encrypt_Append (DESCBCctx_stt *P_pDESCBCctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output ******************************************************/ + int32_t DES_CBC_Encrypt_Finish (DESCBCctx_stt *P_pDESCBCctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif +#ifdef INCLUDE_DECRYPTION + /* load the key and ivec, eventually performs key schedule, etc. *****/ + int32_t DES_CBC_Decrypt_Init (DESCBCctx_stt *P_pDESCBCctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times **********************/ + int32_t DES_CBC_Decrypt_Append (DESCBCctx_stt *P_pDESCBCctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output ******************************************************/ + int32_t DES_CBC_Decrypt_Finish (DESCBCctx_stt *P_pDESCBCctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif /* decryption */ + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_DES_CBC_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/Common/des_common.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/Common/des_common.h new file mode 100644 index 0000000..e8bc70d --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/Common/des_common.h @@ -0,0 +1,67 @@ +/** + ****************************************************************************** + * @file des_common.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief DES common functions and definitions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DES_COMMON_H__ +#define __DES_COMMON_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + + /** @addtogroup DES + * @{ + */ + /* Exported constants --------------------------------------------------------*/ +#define CRL_DES_BLOCK 8 /*!< Number of bytes (uint8_t) necessary to store a DES block. */ +#define CRL_DES_KEY 8 /*!< Number of bytes (uint8_t) necessary to store a DES key. */ + /* Exported types ------------------------------------------------------------*/ + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */ + const uint8_t *pmKey; /*!< Pointer to original Key buffer */ + const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */ + int32_t mIvSize; /*!< Size of the Initialization Vector in bytes */ + uint32_t amIv[2]; /*!< Temporary result/IV */ + uint32_t amExpKey[32]; /*!< Expanded DES key */ + } + DESCBCctx_stt; /*!< Structure for the context of a DES operation */ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__DES_COMMON_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/ECB/des_ecb.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/ECB/des_ecb.h new file mode 100644 index 0000000..5bdd411 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/ECB/des_ecb.h @@ -0,0 +1,91 @@ +/** + ****************************************************************************** + * @file des_ecb.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief DES in ECB Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_DES_ECB_H__ +#define __CRL_DES_ECB_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup DESECB + * @{ + */ + /* Exported types ------------------------------------------------------------*/ + typedef DESCBCctx_stt DESECBctx_stt; /*!< Structure for the context of a DES operation */ + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ +#ifdef INCLUDE_ENCRYPTION + /* load the key and ivec, eventually performs key schedule, etc. *****/ + int32_t DES_ECB_Encrypt_Init(DESECBctx_stt *P_pDESECBctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times **********************/ + int32_t DES_ECB_Encrypt_Append (DESECBctx_stt *P_pDESECBctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output ******************************************************/ + int32_t DES_ECB_Encrypt_Finish (DESECBctx_stt *P_pDESECBctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif /* ECB Encryption */ +#ifdef INCLUDE_DECRYPTION + /* load the key and ivec, eventually performs key schedule, etc. *****/ + int32_t DES_ECB_Decrypt_Init (DESECBctx_stt *P_pDESECBctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times **********************/ + int32_t DES_ECB_Decrypt_Append (DESECBctx_stt *P_pDESECBctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output ******************************************************/ + int32_t DES_ECB_Decrypt_Finish (DESECBctx_stt *P_pDESECBctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif /* ECB Decryption */ + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_DES_ECB_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/des.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/des.h new file mode 100644 index 0000000..d9617ee --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/DES/des.h @@ -0,0 +1,42 @@ +/** + ****************************************************************************** + * @file des.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Container for the DES functionalities + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ +/* Includes ------------------------------------------------------------------*/ +#include "Common/des_common.h" + +#ifdef INCLUDE_ECB +#include "ECB/des_ecb.h" +#endif + +#ifdef INCLUDE_CBC +#include "CBC/des_cbc.h" +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/ECC/LowLevel/elliptic.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/ECC/LowLevel/elliptic.h new file mode 100644 index 0000000..54c5701 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/ECC/LowLevel/elliptic.h @@ -0,0 +1,108 @@ +/** + ****************************************************************************** + * @file elliptic.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides Elliptic Curve Cryptography (ECC) primitives. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_ELLIPTIC_H__ +#define __CRL_ELLIPTIC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + + /** @addtogroup ECClowlevel + * @{ + */ + + + /* Exported types ------------------------------------------------------------*/ + /* Note: + * Elliptic curve equation over GF(p): y^2 = x^3+ax+b. + * All the NIST elliptic curves have a=-3 for performance reasons. + * The point number for an elliptic curve is given by n*h where + * h is the co-factor; it's usual for standard curves h=1. + * n is always a prime number and represents the curve order. + */ + + + /* Exported functions ------------------------------------------------------- */ + /* Computes the symmetric of the point P_Point ********************************/ + int32_t ECCsymmetricPoint(const ECpoint_stt *P_pECpnt, + ECpoint_stt *P_pECsymmetricPnt, + const EC_stt *P_pECctx, + membuf_stt *P_pMemBuf); + + /* PA=normalized PP. **********************************************************/ + int32_t Normalize(const ECpoint_stt *P_pECinputPnt, + ECpoint_stt *P_pECnormPnt, + const montyParams_stt* P_pMontyParams); + + /* Converts the x coordinates from integers modulo p to the Montgomery domain */ + int32_t ECCpoint2Monty(ECpoint_stt *P_pECpnt, const montyParams_stt *P_pMontyParams); + + /* Converts the x coordinates from the Montgomery domain to integers modulo p */ + int32_t ECCpointFromMonty(ECpoint_stt *P_pECpnt, const montyParams_stt *P_pMontyParams); + + /* Point addition in Jacobian Projective coordinates and in the Montgomery domain. */ + int32_t MontyJacProjAddPoints(const ECpoint_stt *P_pECpnt1, + const ECpoint_stt *P_pECpnt2, + ECpoint_stt *P_pECpntSum, + const EC_stt *P_pECctx, + const montyParams_stt *P_pMontyParams); + + /* Point doubling in Jacobian Projective coordinates and in the Montgomery domain. P2=2*P1*/ + int32_t MontyJacProjDoublePoint(const ECpoint_stt *P_pECpnt, + ECpoint_stt *P_pECpntDoubled, + const EC_stt *P_pECctx, + const montyParams_stt *P_pMontyParams); + + + int32_t NAF_Binary_PointMul(const BigNum_stt *P_pBNk, + const ECpoint_stt * P_pECbasePnt, + ECpoint_stt * P_pECresultPnt, + const EC_stt *P_pECctx, + const montyParams_stt *P_pMontyParams); + int32_t Binary_DoublePointMul(const BigNum_stt *P_pBNk1, + ECpoint_stt * P_pECbase1Pnt, + const BigNum_stt *P_pBNk2, + const ECpoint_stt * P_pECbase2Pnt, + ECpoint_stt * P_pECresultPnt, + const EC_stt *P_pECctx, + const montyParams_stt *P_pMontyParams); + +#ifdef __cplusplus +} +#endif + + +#endif /*__CRL_ELLIPTIC_H__ */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/ECC/ecc.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/ECC/ecc.h new file mode 100644 index 0000000..e4f7bf3 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/ECC/ecc.h @@ -0,0 +1,268 @@ +/** + ****************************************************************************** + * @file ecc.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides Elliptic Curve Cryptography (ECC) primitives + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_ECC_H__ +#define __CRL_ECC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ +#include "../Common_ecc_rsa/MATH/math.h" + + /** @addtogroup ECC + * @{ + */ + + /** + * @brief Structure continaing the BigNum_stt that describes the parameters of an Elliptic Curve and its generator + */ + typedef struct + { + BigNum_stt *pmA; /*!< Parameter a of the curve equation. */ + BigNum_stt *pmB; /*!< Parameter b of the curve equation. */ + BigNum_stt *pmP; /*!< Modulus p. */ + BigNum_stt *pmN; /*!< Order of the curve n. */ + BigNum_stt *pmGx; /*!< Coordinate pmX of curve's generator */ + BigNum_stt *pmGy; /*!< Coordinate pmY of curve's generator*/ + } + intEC_stt; + + + /** + * @brief Structure that keeps the Elliptic Curve Parameter + */ + typedef struct + { + const uint8_t *pmA; /*!< pointer to paramter "a" */ + + int32_t mAsize; /*!< size of paramter "a" */ + + const uint8_t *pmB; /*!< pointer to paramter "b" */ + + int32_t mBsize; /*!< size of paramter "b" */ + + const uint8_t *pmP; /*!
© COPYRIGHT 2015 STMicroelectronics
+* +* Licensed under MCD-ST Image SW License Agreement V2, (the "License"); +* You may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.st.com/software_license_agreement_liberty_v2 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +****************************************************************************** +*/ + +/*! +* \page Tutorial_ed25519 Ed25519 Tutorial +* +* This library supports ed25519 functions for: +* - Key Generation +* - Signature Generation +* - Signature Verification +* +* Please note that there are no special structures to handle private/public keys and signatures. \n +* Everything is handled as byte arrays. In particular: +* - A private key is a 64 byte array +* - A public key is a 32 byte array +* - A digital signature is a 64 byte array +* +* There are 3 functions, at user level, to handle the functionalities, these are: +* - \ref ED25519keyGen to generate both private and public keys +* - \ref ED25519sign to generate a signature of a message +* - \ref ED25519verify to verify a signature of a message +* +* The first example show how to call the ED25519keyGen in order to generate a key pair. \n +* The function requires the caller to fill P_pPrivateKey with 32 random bytes before calling . \n +* +* \code +* #include +* #include "crypto.h" +* int main() +* { +* uint8_t pubKey[32]; //Buffer that will store the public key +* uint8_t privKey[64]; //Buffer that will store the private key +* int32_t retval; // Used to check return values +* RNGstate_stt randState_st; //Used for the random generation +* RNGinitInput_stt RNGinit_st; //Structure required to call \ref RNGinit +* uint8_t entropy_data[32]={...}; //It should contain entropy +* +* //Let's Instantiate with entropy,nonce and no personalization string. +* RNGinit_st.pmEntropyData = entropy_data; +* RNGinit_st.mEntropyDataSize = sizeof(entropy_data); +* RNGinit_st.pmNonce = NULL; +* RNGinit_st.mNonceSize = 0; +* RNGinit_st.pmPersData = NULL; +* RNGinit_st.mPersDataSize = 0; +* +* //Initialize the random engine, using a DRBG Based on AES-128 +* retval = RNGinit(&RNGinit_st, C_DRBG_AES128, &randState_st); +* if (retval != RNG_SUCCESS) +* { ..handle error.. } +* // We have an initialized random state, now we can call the random bytes generation +* retval = RNGgenBytes(&RNGstate, NULL, privKey, 32); +* if (retval != RNG_SUCCESS) +* { ..handle error.. } +* // privKey has 32 random bytes, now we can call ED25519KeyGen +* retval = ED25519keyGen(privKey, pubKey); +* if (retval != ED25519_SUCCESS) +* { ..handle error.. } +* // Now privKey and pubKey have been generated! +* } +* \endcode +* +* The second example will demonstrate how to generate and verify a signature. \n +* We make the assumption that we already have a valid private and public key. \n +* Please note that the verification function \ref ED25519verify will return \ref SIGNATURE_VALID +* in case of success. \n With \b all other return values the signature \b must be considered \b invalid +* +* \code +* #include +* #include "crypto.h" +* int main() +* { +* uint8_t pubKey[32]={...}; //Buffer that contains a valid public key +* uint8_t privKey[64]={...}; //Buffer that contains a valid private key +* int32_t retval; // Used to check return values +* const uint8_t message[1024]={...}; //The message we want to sign +* uint8_t signature[64]; //Buffer that will store the signature +* +* //Sign the message +* retval = ED25519sign(signature, message, sizeof(message), privKey); +* if (retval != ED25519_SUCCESS) +* { ..handle error.. } +* //We have generated our signature! Let's verify it! +* retval = ED25519verify(message, sizeof(message), signature, pubKey); +* if (retval != SIGNATURE_VALID) +* { ..handle error.. } +* // Here the signature is good! +* } +* \endcode +*/ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __ED25519_H__ +#define __ED25519_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @addtogroup ED25519 + * @{ + */ + /* Includes ------------------------------------------------------------------*/ +#include + /* Exported types ------------------------------------------------------------*/ + + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + int32_t ED25519keyGen(uint8_t *P_pPrivateKey, uint8_t *P_pPublicKey); + int32_t ED25519sign(uint8_t *P_pSignature, const uint8_t *P_pInput, int32_t P_InputSize, const uint8_t *P_pPrivateKey); + int32_t ED25519verify(const uint8_t *P_pInput, int32_t P_InputSize, const uint8_t *P_pSignature, const uint8_t *P_pPublicKey); + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ED25519_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/ED25519/internals/ge25519.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/ED25519/internals/ge25519.h new file mode 100644 index 0000000..8b56ec6 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/ED25519/internals/ge25519.h @@ -0,0 +1,80 @@ +/** +****************************************************************************** +* @file ge25519.h +* @author MCD Application Team +* @version V3.0.0 +* @date 05-June-2015 +* @brief ge25519 header file +****************************************************************************** +* @attention +* +*

© COPYRIGHT 2015 STMicroelectronics

+* +* Licensed under MCD-ST Image SW License Agreement V2, (the "License"); +* You may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.st.com/software_license_agreement_liberty_v2 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +****************************************************************************** +*/ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __GE25519_H__ +#define __GE25519_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + + /* Includes ------------------------------------------------------------------*/ + +#include "../../Common_ed25519_c25519/internals/fe25519.h" +#include "sc25519.h" + + /** @addtogroup GE25519 + * @{ + */ + + /* Exported types ------------------------------------------------------------*/ + + typedef struct + { + fe25519 x; /*!< X Parameter of the representation */ + fe25519 y; /*!< Y Parameter of the representation */ + fe25519 z; /*!< Z Parameter of the representation */ + fe25519 t; /*!< T Parameter of the representation */ + } + ge25519; /*!< Point on Twisted Edwards Curve ed25519 represented in extended coordinates */ + + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + int32_t ge25519_unpackneg_vartime(ge25519 *r, const uint8_t p[32]); + + void ge25519_pack(uint8_t r[32], const ge25519 *p); + + void ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const sc25519 *s1, const ge25519 *p2, const sc25519 *s2); + + void ge25519_scalarmult_base(ge25519 *r, const sc25519 *s); + + /** + * @} ge25519 + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __GE25519_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/ED25519/internals/sc25519.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/ED25519/internals/sc25519.h new file mode 100644 index 0000000..52c1c49 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/ED25519/internals/sc25519.h @@ -0,0 +1,81 @@ +/** +****************************************************************************** +* @file sc25519.h +* @author MCD Application Team +* @version V3.0.0 +* @date 05-June-2015 +* @brief sc25519 header file +****************************************************************************** +* @attention +* +*

© COPYRIGHT 2015 STMicroelectronics

+* +* Licensed under MCD-ST Image SW License Agreement V2, (the "License"); +* You may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.st.com/software_license_agreement_liberty_v2 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +****************************************************************************** +*/ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SC25519_H__ +#define __SC25519_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @addtogroup sc25519 + * @{ + */ + + /* Includes ------------------------------------------------------------------*/ + /* Exported types ------------------------------------------------------------*/ + + typedef struct + { + uint32_t v[8]; /*!< uint32_t array representing the number in low endian format */ + } + sc25519; /*!< Representation of a number in GF(n = 2 ^ 252 + 27742317777372353535851937790883648493) */ + + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + void sc25519_from32bytes(sc25519 *r, const unsigned char x[32]); + + void sc25519_from64bytes(sc25519 *r, const unsigned char x[64]); + + void sc25519_to32bytes(unsigned char r[32], const sc25519 *x); + + void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y); + + void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y); + + +#ifdef FAST_GE_COMPUTATION + void sc25519_window3(signed char r[85], const sc25519 *s); + + void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, const sc25519 *s2); +#endif + + /** + * @} sc25519 + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SC25519_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/Common/hash_common.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/Common/hash_common.h new file mode 100644 index 0000000..622034b --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/Common/hash_common.h @@ -0,0 +1,146 @@ +/** + ****************************************************************************** + * @file hash_common.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides common HASH/HMAC definitions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_HASH_COMMON_H__ +#define __CRL_HASH_COMMON_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Exported types ------------------------------------------------------------*/ + /** @addtogroup HASH + * @{ + */ + + /** + * @brief Enumeration of possible hash functions + */ + typedef enum HashType_e + { + E_MD5, /*!< MD5 */ + E_SHA1, /*!< SHA-1 */ + E_SHA224, /*!< SHA-224 */ + E_SHA256, /*!< SHA-256 */ + E_SHA384, /*!< SHA-384 */ + E_SHA512, /*!< SHA-512 */ + } hashType_et; + + + /** + * @brief Type definitation for Hash/Hmac Flags + */ + + typedef enum HashFlags_e + { + E_HASH_DEFAULT = (uint32_t) (0x00000000), /*!< User Flag: No flag specified. + This is the default value that should be set to this flag */ + E_HASH_DONT_PERFORM_KEY_SCHEDULE = (uint32_t) (0x00000001), /*!< User Flag: Used to force the init to not reperform key processing in HMAC mode. */ + E_HASH_OPERATION_COMPLETED = (uint32_t) (0x00000002), /*!< Internal Flag: used to check that the Finish function has been already called */ + E_HASH_NO_MORE_APPEND_ALLOWED = (uint32_t) (0x00000004), /*!< Internal Flag: it is set when the last append has been called. + Used where the append is called with an InputSize not multiple of the block size, + which means that is the last input.*/ + } HashFlags_et; + + /** + * @brief Structure for HASH contextlags + */ + + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + HashFlags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */ + int32_t mTagSize; /*!< Size of the required Digest */ + uint8_t amBuffer[64]; /*!< Internal: It's a buffer with the data to be hashed */ + uint32_t amCount[2]; /*!< Internal: Keeps the count of processed bits */ + uint32_t amState[8]; /*!< Internal: Keeps the internal state */ + } + HASHctx_stt; + /** + * @brief Structure for Large (SHA-512 based) HASH contexts + */ + + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + HashFlags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */ + int32_t mTagSize; /*!< Size of the required Digest */ + uint8_t amBuffer[128]; /*!< Internal: It's a buffer with the data to be hashed */ + uint32_t amCount[2]; /*!< Internal: Keeps the count of processed bits */ + uint64_t amState[8]; /*!< Internal: Keeps the internal state */ + } + HASHLctx_stt; + + + /** + * @brief Structure for HMAC context + */ + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + HashFlags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */ + int32_t mTagSize; /*!< Size of the required Digest */ + const uint8_t *pmKey; /*!< Pointer for the HMAC key */ + int32_t mKeySize; /*!< Size, in uint8_t (bytes) of the HMAC key */ + uint8_t amKey[64]; /*!< Internal: The HMAC key */ + HASHctx_stt mHASHctx_st; /*!< Internal: Hash Context */ + } + HMACctx_stt; + /** + * @brief Structure for Large (SHA-512 based) HMAC context + */ + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + HashFlags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */ + int32_t mTagSize; /*!< Size of the required Digest */ + const uint8_t *pmKey; /*!< Pointer for the HMAC key */ + int32_t mKeySize; /*!< Size, in uint8_t (bytes) of the HMAC key */ + uint8_t amKey[128]; /*!< Internal: The HMAC key */ + HASHLctx_stt mHASHctx_st; /*!< Internal: Hash Context */ + } + HMACLctx_stt; + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_HASH_COMMON_H__*/ + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/Common/sha256_sha224_transform.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/Common/sha256_sha224_transform.h new file mode 100644 index 0000000..fde5cfc --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/Common/sha256_sha224_transform.h @@ -0,0 +1,49 @@ +/** + ****************************************************************************** + * @file sha256_sha224_transform.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief SHA-256 Update function + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SHA256_TRANSFORM_H__ +#define __SHA256_TRANSFORM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Exported functions ------------------------------------------------------- */ + /* SHA256 Update */ + void SHA256Update(HASHctx_stt* P_pSHA256ctx, \ + const uint8_t* P_pInput, \ + uint32_t P_inputSize); + +#ifdef __cplusplus +} +#endif + +#endif /*__SHA256_TRANSFORM_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/Common/sha512_sha384_transform.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/Common/sha512_sha384_transform.h new file mode 100644 index 0000000..06c23f6 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/Common/sha512_sha384_transform.h @@ -0,0 +1,47 @@ +/** + ****************************************************************************** + * @file sha512_sha384_transform.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief SHA-512 Update function + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SHA512_TRANSFORM_H__ +#define __SHA512_TRANSFORM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Exported functions ------------------------------------------------------- */ + /* SHA512 Update */ + void SHA512Update(HASHLctx_stt* P_pSHA512ctx, const uint8_t* P_pInput, uint32_t P_inputSize); + +#ifdef __cplusplus +} +#endif + +#endif /*__SHA256_TRANSFORM_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/MD5/hmac_md5.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/MD5/hmac_md5.h new file mode 100644 index 0000000..e2efa5f --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/MD5/hmac_md5.h @@ -0,0 +1,74 @@ +/** + ****************************************************************************** + * @file hmac_md5.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides HMAC-MD5 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_HMAC_MD5_H__ +#define __CRL_HMAC_MD5_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup HMAC_MD5 + * @{ + */ + + /** + * @brief HMAC-MD5 Context Structure + */ + /* Exported types ------------------------------------------------------------*/ + typedef HMACctx_stt HMAC_MD5ctx_stt; + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + int32_t HMAC_MD5_Init (HMAC_MD5ctx_stt *P_pHMAC_MD5ctx); + + int32_t HMAC_MD5_Append (HMAC_MD5ctx_stt *P_pHMAC_MD5ctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize); + + int32_t HMAC_MD5_Finish (HMAC_MD5ctx_stt *P_pHMAC_MD5ctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_HMAC_MD5_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/MD5/md5.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/MD5/md5.h new file mode 100644 index 0000000..740324c --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/MD5/md5.h @@ -0,0 +1,78 @@ +/** + ****************************************************************************** + * @file md5.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides MD5 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_MD5_H__ +#define __CRL_MD5_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup MD5 + * @{ + */ + + /* Exported constants --------------------------------------------------------*/ +#define CRL_MD5_SIZE 16 /*!< Number of bytes (uint8_t) to store a MD5 digest. */ + + /** + * @brief Structure for the MD5 context + */ + /* Exported types ------------------------------------------------------------*/ + + typedef HASHctx_stt MD5ctx_stt; + + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + /* Initialization of Context */ + int32_t MD5_Init (MD5ctx_stt *P_pMD5ctx); + /* Data processing function */ + int32_t MD5_Append (MD5ctx_stt *P_pMD5ctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize); + \ + /* Returns digest */ + int32_t MD5_Finish (MD5ctx_stt *P_pMD5ctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + \ + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_MD5_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/MD5/md5_low_level.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/MD5/md5_low_level.h new file mode 100644 index 0000000..c0cf5bc --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/MD5/md5_low_level.h @@ -0,0 +1,58 @@ +/** + ****************************************************************************** + * @file md5_low_level.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief MD5 core functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MD5_LOW_LEVEL_H__ +#define __MD5_LOW_LEVEL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Exported types ------------------------------------------------------------*/ + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + /* MD5 - Initialize new context */ + void crl_u_MD5_Init (MD5ctx_stt *P_pMD5ctx); + /* MD5 Update function */ + void crl_u_MD5_Update (MD5ctx_stt *P_pMD5ctx, \ + const uint8_t *P_pInput, \ + uint32_t P_inputSize); + /* MD5 finalization function */ + void crl_u_MD5_Finish (MD5ctx_stt *P_pMD5ctx, \ + uint8_t *P_pDigest); + + +#ifdef __cplusplus +} +#endif + +#endif /*__MD5_LOW_LEVEL_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA1/hmac_sha1.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA1/hmac_sha1.h new file mode 100644 index 0000000..5ec83bb --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA1/hmac_sha1.h @@ -0,0 +1,76 @@ +/** + ****************************************************************************** + * @file hmac_sha1.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides HMAC-SHA1 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_HMAC_SHA1_H__ +#define __CRL_HMAC_SHA1_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup HMAC_SHA1 + * @{ + */ + + /** + * @brief HMAC-SHA-1 Context Structure + */ + + /* Exported types ------------------------------------------------------------*/ + typedef HMACctx_stt HMAC_SHA1ctx_stt; + + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + int32_t HMAC_SHA1_Init (HMAC_SHA1ctx_stt *P_pHMAC_SHA1ctx); + + int32_t HMAC_SHA1_Append (HMAC_SHA1ctx_stt *P_pHMAC_SHA1ctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize); + + int32_t HMAC_SHA1_Finish (HMAC_SHA1ctx_stt *P_pHMAC_SHA1ctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_HMAC_SHA1_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA1/sha1.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA1/sha1.h new file mode 100644 index 0000000..c8dfaab --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA1/sha1.h @@ -0,0 +1,74 @@ +/** + ****************************************************************************** + * @file sha1.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides SHA1 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_SHA1_H__ +#define __CRL_SHA1_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup SHA1 + * @{ + */ + /* Exported constants --------------------------------------------------------*/ +#define CRL_SHA1_SIZE 20 /*!< Number of bytes (uint8_t) to store a SHA-1 digest. */ + + /* Exported types ------------------------------------------------------------*/ + /** + * @brief Structure for the SHA-1 context + */ + typedef HASHctx_stt SHA1ctx_stt; + /* Exported functions --------------------------------------------------------*/ + /* Initialization of Context */ + int32_t SHA1_Init(SHA1ctx_stt *P_pSHA1ctx); + /* Data processing function */ + int32_t SHA1_Append(SHA1ctx_stt *P_pSHA1ctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize); + /* Returns digest */ + int32_t SHA1_Finish(SHA1ctx_stt *P_pSHA1ctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_SHA1_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA1/sha1_low_level.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA1/sha1_low_level.h new file mode 100644 index 0000000..68e2d16 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA1/sha1_low_level.h @@ -0,0 +1,56 @@ +/** + ****************************************************************************** + * @file sha1_low_level.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief SHA-1 core functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SHA1_LOW_LEVEL_H__ +#define __SHA1_LOW_LEVEL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Exported functions ------------------------------------------------------- */ + /* SHA1Init - Initialize new context */ + void SHA1Init (SHA1ctx_stt *P_pHASHctx); + + /* SHA1 Update function */ + void SHA1Update(SHA1ctx_stt* P_pHASHctx, \ + const uint8_t* P_pInput, \ + uint32_t P_inputSize); + + /* SHA1: finalization function */ + void SHA1Final (SHA1ctx_stt* P_pHASHctx, \ + uint8_t *P_pDigest); + +#ifdef __cplusplus +} +#endif + +#endif /*__SHA1_LOW_LEVEL_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA224/hmac_sha224.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA224/hmac_sha224.h new file mode 100644 index 0000000..5cdcba2 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA224/hmac_sha224.h @@ -0,0 +1,76 @@ +/** + ****************************************************************************** + * @file hmac_sha224.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides HMAC-SHA224 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_HMAC_SHA224_H__ +#define __CRL_HMAC_SHA224_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup HMAC_SHA224 + * @{ + */ + + /** + * @brief HMAC-SHA-224 Context Structure + */ + /* Exported constants --------------------------------------------------------*/ + /* Exported types ------------------------------------------------------------*/ + typedef HMACctx_stt HMAC_SHA224ctx_stt; + + + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + int32_t HMAC_SHA224_Init (HMAC_SHA224ctx_stt *P_pHMAC_SHA224ctx); + + int32_t HMAC_SHA224_Append (HMAC_SHA224ctx_stt *P_pHMAC_SHA224ctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize); + + int32_t HMAC_SHA224_Finish (HMAC_SHA224ctx_stt *P_pHMAC_SHA224ctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_HMAC_SHA224_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA224/sha224.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA224/sha224.h new file mode 100644 index 0000000..00a9eb4 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA224/sha224.h @@ -0,0 +1,69 @@ +/** + ****************************************************************************** + * @file sha224.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides SHA224 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_SHA224_H__ +#define __CRL_SHA224_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup SHA224 + * @{ + */ + /* Exported constants --------------------------------------------------------*/ +#define CRL_SHA224_SIZE 28 /*!< Number of bytes (uint8_t) to store a SHA-224 digest. */ + + /* Exported functions --------------------------------------------------------*/ + /** Structure for the SHA-224 context */ + typedef HASHctx_stt SHA224ctx_stt; + /* Initialization of Context */ + int32_t SHA224_Init (SHA224ctx_stt *P_pSHA224ctx); + /* Data processing function */ + int32_t SHA224_Append (SHA224ctx_stt *P_pSHA224ctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize); + /* Returns digest */ + int32_t SHA224_Finish (SHA224ctx_stt *P_pSHA224ctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_SHA224_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA224/sha224_low_level.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA224/sha224_low_level.h new file mode 100644 index 0000000..20b55f0 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA224/sha224_low_level.h @@ -0,0 +1,52 @@ +/** + ****************************************************************************** + * @file sha224_low_level.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief SHA-224 core functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SHA224_LOW_LEVEL_H__ +#define __SHA224_LOW_LEVEL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Need this include for shared Update */ + + /* Exported functions ------------------------------------------------------- */ + /* SHA-224 Initialize new context */ + void SHA224Init(SHA224ctx_stt* P_pSHA224ctx); + /* SHA-224 finalization function */ + void SHA224Final(SHA224ctx_stt* P_pSHA224ctx, \ + uint8_t *P_pDigest); + +#ifdef __cplusplus +} +#endif + +#endif /*__SHA224_LOW_LEVEL_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA256/hmac_sha256.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA256/hmac_sha256.h new file mode 100644 index 0000000..7668f34 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA256/hmac_sha256.h @@ -0,0 +1,76 @@ +/** + ****************************************************************************** + * @file hmac_sha256.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides HMAC-SHA256 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_HMAC_SHA256_H__ +#define __CRL_HMAC_SHA256_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup HMAC_SHA256 + * @{ + */ + + /** + * @brief HMAC-SHA-256 Context Structure + */ + /* Exported types ------------------------------------------------------------*/ + typedef HMACctx_stt HMAC_SHA256ctx_stt; + + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + int32_t HMAC_SHA256_Init (HMAC_SHA256ctx_stt *P_pHMAC_SHA256ctx); + + int32_t HMAC_SHA256_Append (HMAC_SHA256ctx_stt *P_pHMAC_SHA256ctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize); + + int32_t HMAC_SHA256_Finish (HMAC_SHA256ctx_stt *P_pHMAC_SHA256ctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_HMAC_SHA256_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA256/sha256.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA256/sha256.h new file mode 100644 index 0000000..c80ffc6 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA256/sha256.h @@ -0,0 +1,72 @@ +/** + ****************************************************************************** + * @file sha256.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides SHA256 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_SHA256_H__ +#define __CRL_SHA256_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup SHA256 + * @{ + */ + /* Exported constants --------------------------------------------------------*/ +#define CRL_SHA256_SIZE 32 /*!< Number of bytes (uint8_t) to store a SHA-256 digest. */ + /* Exported types ------------------------------------------------------------*/ + /** Structure for the SHA-256 context */ + typedef HASHctx_stt SHA256ctx_stt; + + /* Exported functions --------------------------------------------------------*/ + + /* Initialization of Context */ + int32_t SHA256_Init(SHA256ctx_stt *P_pSHA256ctx); + /* Data processing function */ + int32_t SHA256_Append(SHA256ctx_stt *P_pSHA256ctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize); + /* Returns digest */ + int32_t SHA256_Finish(SHA256ctx_stt *P_pSHA256ctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_SHA256_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA256/sha256_low_level.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA256/sha256_low_level.h new file mode 100644 index 0000000..2441d8b --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA256/sha256_low_level.h @@ -0,0 +1,52 @@ +/** + ****************************************************************************** + * @file sha256_low_level.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief SHA-256 core functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SHA256_LOW_LEVEL_H__ +#define __SHA256_LOW_LEVEL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + + /* Exported functions ------------------------------------------------------- */ + /* SHA-256 Initialize new context */ + void SHA256Init (SHA256ctx_stt* P_pSHA256ctx); + /* SHA-256 finalization function */ + void SHA256Final (SHA256ctx_stt* P_pSHA256ctx, \ + uint8_t *P_pDigest); + + +#ifdef __cplusplus +} +#endif + +#endif /*__SHA256_LOW_LEVEL_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA384/hmac_sha384.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA384/hmac_sha384.h new file mode 100644 index 0000000..37d4e5b --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA384/hmac_sha384.h @@ -0,0 +1,73 @@ +/** + ****************************************************************************** + * @file hmac_sha384.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides HMAC-SHA384 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_HMAC_SHA384_H__ +#define __CRL_HMAC_SHA384_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup HMAC_SHA384 + * @{ + */ + + /** + * @brief HMAC-SHA-384 Context Structure + */ + typedef HMACLctx_stt HMAC_SHA384ctx_stt; + + + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + int32_t HMAC_SHA384_Init(HMAC_SHA384ctx_stt *P_pHMAC_SHA384ctx); + int32_t HMAC_SHA384_Append(HMAC_SHA384ctx_stt *P_pHMAC_SHA384ctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize); + int32_t HMAC_SHA384_Finish(HMAC_SHA384ctx_stt *P_pHMAC_SHA384ctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_HMAC_SHA384_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA384/sha384.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA384/sha384.h new file mode 100644 index 0000000..8450aea --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA384/sha384.h @@ -0,0 +1,110 @@ +/** + ****************************************************************************** + * @file sha384.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides SHA384 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +/*! \page Tutorial_SHA384 SHA384 Tutorial + * + * Here follows an example of SHA384 functionality. + * Please remember that before starting to call the Init function the context \b requires user + * initialization. The mFlags and mTagSize member must be initialized prior to calling the + * init function. Look at the each function documentation to see what is needed prior of calling. + * + * The API functions to be used are: + * - \ref SHA384_Init initialize an \ref SHA384ctx_stt context with required digest size and flags. + * - \ref SHA384_Append process input buffers. + * It can be called multiple times. + * - \ref SHA384_Finish can be called only one time for the digest generation process. + * + * The following code performs a SHA384 hash of a buffer of size 1024 in a single Append call + * \code + * #include + * #include "crypto.h" + * int32_t main() + * { + * uint8_t message[1024]={...}; + * uint8_t digest[CRL_SHA384_SIZE]; // 48 byte buffer + * // outSize is for digest output size, retval is for return value + * int32_t outSize, retval; + * SHA384ctx_stt context_st; // The SHA384 context + * + * // Initialize Context Flag with default value + * context_st.mFlags = E_HASH_DEFAULT; + * // Set the required digest size to be only of 4 bytes (while the maximum allowed by SHA384 is 48) + * context_st.mTagSize = 4; + * + * // call init function + * retval = SHA384_Init(&context_st); + * if (retval != HASH_SUCCESS) + * { ... } + * + * retval = SHA384_Append(&context_st, message, 1024); + * if (retval != HASH_SUCCESS) + * { ... } + * + * //Generate the message digest + * //Note that only the requested number of bytes of the digest will be written, in this case 4. + * retval = SHA384_Finish(&context_st, digest, &outSize ); + * if (retval != HASH_SUCCESS) + * { ... } + * } + * \endcode +*/ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_SHA384_H__ +#define __CRL_SHA384_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup SHA384 + * @{ + */ +#define CRL_SHA384_SIZE 48 /*!< Number of bytes (uint8_t) to store a SHA-384 digest. */ + + /** Structure for the SHA-384 context */ + typedef HASHLctx_stt SHA384ctx_stt; + /* Initialization of Context */ + int32_t SHA384_Init(SHA384ctx_stt *P_pSHA384ctx); + /* Data processing function */ + int32_t SHA384_Append(SHA384ctx_stt *P_pSHA384ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize); + /* Returns digest */ + int32_t SHA384_Finish(SHA384ctx_stt *P_pSHA384ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize); + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_SHA384_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA384/sha384_low_level.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA384/sha384_low_level.h new file mode 100644 index 0000000..a281beb --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA384/sha384_low_level.h @@ -0,0 +1,50 @@ +/** + ****************************************************************************** + * @file sha384_low_level.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief SHA-384 core functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SHA384_LOW_LEVEL_H__ +#define __SHA384_LOW_LEVEL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Exported functions ------------------------------------------------------- */ + /* SHA-384 Initialize new context */ + void SHA384Init(SHA384ctx_stt* P_pSHA384ctx); + /* SHA-384 finalization function */ + void SHA384Final(SHA384ctx_stt* P_pSHA384ctx, \ + uint8_t *P_pDigest); + +#ifdef __cplusplus +} +#endif + +#endif /*__SHA384_LOW_LEVEL_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/hkdf512.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/hkdf512.h new file mode 100644 index 0000000..1e71d43 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/hkdf512.h @@ -0,0 +1,76 @@ +/** + ****************************************************************************** + * @file hkdf512.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides HKDF-SHA512 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_HKDF_SHA512_H__ +#define __CRL_HKDF_SHA512_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ +#include "hmac_sha512.h" + + /** @ingroup HKDF_SHA512 + * @{ + */ + + + /** + * @brief Structure HKDF-SHA-512 input + */ + typedef struct + { + const uint8_t *pmKey; /*!< Pointer for the HKDF Key */ + int32_t mKeySize; /*!< Size of the HKDF Key */ + const uint8_t *pmSalt; /*!< Pointer for the HKDF Salt */ + int32_t mSaltSize; /*!< Size of the HKDF Salt */ + const uint8_t *pmInfo; /*!< Pointer for the HKDF Info */ + int32_t mInfoSize; /*!< Size of the HKDF Info */ + } + HKDFinput_stt; + + + + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + int32_t HKDF_SHA512(const HKDFinput_stt *P_pInputSt, uint8_t *P_pOutputBuffer, int32_t P_OutputSize); + /** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_HKDF_SHA512_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/hmac_sha512.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/hmac_sha512.h new file mode 100644 index 0000000..66a877f --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/hmac_sha512.h @@ -0,0 +1,123 @@ +/** + ****************************************************************************** + * @file hmac_sha512.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides HMAC-SHA512 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +/*! \page Tutorial_HMACSHA512 HMAC-SHA512 Tutorial + * + * Here follows an example of HMAC-SHA512 functionality. + * Please remember that before starting to call the Init function the context \b requires user + * initialization. \n + * The mFlags, mTagSize, pmKey and mKeySize members must be initialized prior to calling the + * init function. Look at the each function documentation to see what is needed prior of calling. + * + * The API functions to be used are: + * - \ref HMAC_SHA512_Init initialize an \ref HMAC_SHA512ctx_stt context with required tag size, pointer to the key, key size and flags. + * - \ref HMAC_SHA512_Append process input buffers. + * It can be called multiple times. + * - \ref HMAC_SHA512_Finish can be called only one time for the tag generation process. + * + * The following code performs a HMAC-SHA512 authentication of a buffer of size 1024 in 4 Append calls. + * \code + * #include + * #include "crypto.h" + * int32_t main() + * { + * uint8_t message[1024]={...}; + * uint8_t key[12]={...}; + * uint8_t tag[4]; // In this example we just need a 4 byte tag + * // outSize is for digest output size, retval is for return value + * int32_t outSize, retval; + * HMAC_SHA512ctx_stt context_st; // The HMAC-SHA512 context + * + * // Initialize Context Flag with default value + * context_st.mFlags = E_HASH_DEFAULT; + * // Set the required digest size to 4 + * context_st.mTagSize = 4; + * // Set the pointer to the Key to be used for the authentication + * context_st.pmKey = key; + * // Set the key size + * context_st.mKeySize = sizeof(key); + * + * // call init function + * retval = HMAC_SHA512_Init(&context_st); + * if (retval != HASH_SUCCESS) + * { ... } + * + * // Loop to perform four calls to SHA512_Append, each processing 256 bytes + * for (i = 0; i < 1024; i += 256) + * { //Process i bytes of the message. + * retval = HMAC_SHA512_Append(&context_st, message+i, 256); + * if (retval != HASH_SUCCESS) + * { ... } + * } + * //Generate the message digest + * retval = HMAC_SHA512_Finish(&context_st, tag, &outSize ); + * if (retval != HASH_SUCCESS) + * { ... } + * } + * \endcode +*/ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_HMAC_SHA512_H__ +#define __CRL_HMAC_SHA512_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup HMAC_SHA512 + * @{ + */ + + /** + * @brief HMAC-SHA-512 Context Structure + */ + typedef HMACLctx_stt HMAC_SHA512ctx_stt; + + + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + int32_t HMAC_SHA512_Init(HMAC_SHA512ctx_stt *P_pHMAC_SHA512ctx); + int32_t HMAC_SHA512_Append(HMAC_SHA512ctx_stt *P_pHMAC_SHA512ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize); + int32_t HMAC_SHA512_Finish(HMAC_SHA512ctx_stt *P_pHMAC_SHA512ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize); + + /** + * @} + */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_HMAC_SHA512_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/sha512.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/sha512.h new file mode 100644 index 0000000..c7111ed --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/sha512.h @@ -0,0 +1,109 @@ +/** + ****************************************************************************** + * @file sha512.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides SHA512 functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +/*! \page Tutorial_SHA512 SHA512 Tutorial + * + * Here follows an example of SHA512 functionality. + * Please remember that before starting to call the Init function the context \b requires user + * initialization. The mFlags and mTagSize member must be initialized prior to calling the + * init function. Look at the each function documentation to see what is needed prior of calling. + * + * The API functions to be used are: + * - \ref SHA512_Init initialize an \ref SHA512ctx_stt context with required digest size and flags. + * - \ref SHA512_Append process input buffers. + * It can be called multiple times. + * - \ref SHA512_Finish can be called only one time for the digest generation process. + * + * The following code performs a SHA512 hash of a zero-size buffer in a single Append call + * \code + * #include + * #include "crypto.h" + * int32_t main() + * { + * uint8_t message[1024]={...}; + * uint8_t digest[CRL_SHA512_SIZE]; // 64 byte buffer + * // outSize is for digest output size, retval is for return value + * int32_t outSize, retval; + * SHA512ctx_stt context_st; // The SHA512 context + * + * // Initialize Context Flag with default value + * context_st.mFlags = E_HASH_DEFAULT; + * // Set the required digest size to be of 32 byte + * context_st.mTagSize = 32; + * + * // call init function + * retval = SHA512_Init(&context_st); + * if (retval != HASH_SUCCESS) + * { ... } + * + * retval = SHA512_Append(&context_st, message, 0); + * if (retval != HASH_SUCCESS) + * { ... } + * + * //Generate the message digest + * retval = SHA512_Finish(&context_st, digest, &outSize ); + * if (retval != HASH_SUCCESS) + * { ... } + * } + * \endcode +*/ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_SHA512_H__ +#define __CRL_SHA512_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup SHA512 + * @{ + */ +#define CRL_SHA512_SIZE 64 /*!< Number of bytes (uint8_t) to store a SHA-512 digest. */ + + /** Structure for the SHA-512 context */ + typedef HASHLctx_stt SHA512ctx_stt; + + /* Initialization of Context */ + int32_t SHA512_Init(SHA512ctx_stt *P_pSHA512ctx); + /* Data processing function */ + int32_t SHA512_Append(SHA512ctx_stt *P_pSHA512ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize); + /* Returns digest */ + int32_t SHA512_Finish(SHA512ctx_stt *P_pSHA512ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize); + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__CRL_SHA512_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/sha512_low_level.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/sha512_low_level.h new file mode 100644 index 0000000..c7aa2fb --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/SHA512/sha512_low_level.h @@ -0,0 +1,51 @@ +/** + ****************************************************************************** + * @file sha512_low_level.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief SHA-512 core functions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SHA512_LOW_LEVEL_H__ +#define __SHA512_LOW_LEVEL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + + /* Exported functions ------------------------------------------------------- */ + /* SHA-512 Initialize new context */ + void SHA512Init(SHA512ctx_stt* P_pSHA512ctx); + /* SHA-512 finalization function */ + void SHA512Final(SHA512ctx_stt* P_pSHA512ctx, uint8_t *P_pDigest); + + +#ifdef __cplusplus +} +#endif + +#endif /*__SHA512_LOW_LEVEL_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/hash.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/hash.h new file mode 100644 index 0000000..3cf2d2f --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/HASH/hash.h @@ -0,0 +1,90 @@ +/** + ****************************************************************************** + * @file hash.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Container for the HASH functionalities + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.hom/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "Common/hash_common.h" + +/** @ingroup HASH + * @{ + */ + +#ifdef INCLUDE_MD5 +#include "MD5/md5.h" +#ifdef INCLUDE_HMAC +#include "MD5/hmac_md5.h" +#endif +#endif + +#ifdef INCLUDE_SHA1 +#include "SHA1/sha1.h" +#ifdef INCLUDE_HMAC +#include "SHA1/hmac_sha1.h" +#endif +#endif + +#ifdef INCLUDE_SHA224 +#include "SHA224/sha224.h" +#include "Common/sha256_sha224_transform.h" +#ifdef INCLUDE_HMAC +#include "SHA224/hmac_sha224.h" +#endif +#endif + +#ifdef INCLUDE_SHA256 +#include "SHA256/sha256.h" +#include "Common/sha256_sha224_transform.h" +#ifdef INCLUDE_HMAC +#include "SHA256/hmac_sha256.h" +#endif +#endif + + +#ifdef INCLUDE_SHA384 +#include "SHA384/sha384.h" +#include "Common/sha512_sha384_transform.h" +#ifdef INCLUDE_HMAC +#include "SHA384/hmac_sha384.h" +#endif +#endif + + +#ifdef INCLUDE_SHA512 +#include "SHA512/sha512.h" +#include "Common/sha512_sha384_transform.h" +#include "SHA512/hmac_sha512.h" +#include "SHA512/hkdf512.h" +#endif + +/** + * @} HASH + */ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/POLY1305/poly1305.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/POLY1305/poly1305.h new file mode 100644 index 0000000..99763d4 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/POLY1305/poly1305.h @@ -0,0 +1,104 @@ +/** +****************************************************************************** +* @file poly1305.h +* @author MCD Application Team +* @version V3.0.0 +* @date 05-June-2015 +* @brief Container for poly1305-AES functionalities +****************************************************************************** +* @attention +* +*

© COPYRIGHT 2015 STMicroelectronics

+* +* Licensed under MCD-ST Image SW License Agreement V2, (the "License"); +* You may not use this file except in compliance with the License. +* You may obtain a copy of the License at: +* +* http://www.st.com/software_license_agreement_liberty_v2 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +****************************************************************************** +*/ + + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __POLY1305_H__ +#define __POLY1305_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @addtogroup POLY1305 + * @{ + */ + /* Includes ------------------------------------------------------------------*/ +#include + /* Exported types ------------------------------------------------------------*/ + + /** + * @brief Type definitation for Poly1305-AES Flags + */ + typedef enum + { + E_POLY1305_DEFAULT = (uint32_t)(0x00000000), /*!< User Flag: No flag specified. + This is the default value that should be set to this flag */ + E_POLY1305_OPERATION_COMPLETED = (uint32_t)(0x00000002), /*!< Internal Flag: used to check that the Finish function has been already called */ + E_POLY1305_NO_MORE_APPEND_ALLOWED = (uint32_t)(0x00000004), /*!< Internal Flag: it is set when the last append has been called. + Used where the append is called with an InputSize not multiple of the block size, + which means that is the last input.*/ + } PolyFlags_et; + + /** + * @brief Structure for Poly1305-AES context + */ + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + PolyFlags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */ + const uint8_t *pmKey; /*!< Pointer to original 32 bytes Key buffer */ + const uint8_t *pmNonce; /*!< Pointer to original 16 bytes Nonce buffer */ + const uint8_t *pmTag; /*!< Pointer to Authentication TAG. This value must be set in decryption, and this TAG will be verified */ + int32_t mTagSize; /*!< Size of the required Authentication TAG */ + uint32_t r[5]; /*!< Internal: value of r */ + uint32_t h[5]; /*!< Internal: value of h */ + uint32_t pad[4]; /*!< Internal: value of encrypted nonce */ + } + Poly1305ctx_stt; + + + /* Exported constants --------------------------------------------------------*/ + /* Exported macro ------------------------------------------------------------*/ + /* Exported functions ------------------------------------------------------- */ + + int32_t Poly1305_Auth_Init(Poly1305ctx_stt *P_pPoly1305ctx, const uint8_t *P_pKey, const uint8_t *P_pNonce); + + int32_t Poly1305_Auth_Append(Poly1305ctx_stt *P_pPoly1305ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize); + + int32_t Poly1305_Auth_Finish(Poly1305ctx_stt *P_pPoly1305ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize); + + int32_t Poly1305_Verify_Init(Poly1305ctx_stt *P_pPoly1305ctx, const uint8_t *P_pKey, const uint8_t *P_pNonce); + + int32_t Poly1305_Verify_Append(Poly1305ctx_stt *P_pPoly1305ctx, const uint8_t *P_pInputBuffer, int32_t P_inputSize); + + int32_t Poly1305_Verify_Finish(Poly1305ctx_stt *P_pPoly1305ctx, uint8_t *P_pOutputBuffer, int32_t *P_pOutputSize); + /** + * @} + */ + /* Lower level functionality. Useful for testing, might be used in real world if there is small NVM */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __POLY1305_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/RNG/DRBG_AES128/drbg.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/RNG/DRBG_AES128/drbg.h new file mode 100644 index 0000000..d4c662a --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/RNG/DRBG_AES128/drbg.h @@ -0,0 +1,101 @@ +/** + ****************************************************************************** + * @file drbg.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Implements a pseudo random engine based on AES128-DRBG. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_DRGB_H__ +#define __CRL_DRGB_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup DRBG-AES128 + * @{ + */ + + /* Exported types ------------------------------------------------------------*/ + /** + * @brief Structure to store the state/context of the DRBG_AES128 + */ + typedef struct + { + uint32_t v[4]; /*!< V value, a 128 bit value */ + uint32_t key[4]; /*!< K value, a 128 bit value */ + uint32_t reseed_counter; /*!< Reseed counter 32-bit of data */ + } + drbg_aes128_state_stt; + + /* Exported constants --------------------------------------------------------*/ + + +#define CRL_DRBG_AES_MAX_BYTES_PER_REQUEST 65536u /*!< Maximum number of bytes (uint8_t) a generate request can output */ +#define CRL_DRBG_AES128_ENTROPY_MIN_LEN 16u /*!< Minimum number of bytes for the entropy input */ +#define CRL_DRBG_AES_ENTROPY_MAX_LEN 32u /*!< Maximum number of bytes for the entropy input */ +#define CRL_DRBG_AES_MAX_PERS_STR_LEN 32u /*!< Maximum number of bytes for the personalization string */ +#define CRL_DRBG_AES_MAX_ADD_INPUT_LEN CRL_DRBG_AES_MAX_PERS_STR_LEN /*!< Maximum number of bytes for the additional input */ +#define CRL_DRBG_AES_MAX_NONCE_LEN 16u /*!< Maximum number of bytes for the nonce */ +#define CRL_DRBG_AES_REQS_BTW_RESEEDS 0xFFFFFFFF /*!< Maximum number of request before a reseed is needed. Not supported. */ +#define CRL_DRBG_AES128_STATE_SIZE 36u /*!< Required size in bytes for a DRBG-AES128 state */ + + /* Exported functions ------------------------------------------------------- */ + /* DRBG functions *************************************************************/ + /* Instantiate function for DRBG_AES128 ***************************************/ + int32_t crl_DRBG_AES128_Instantiate (uint8_t *P_pState, \ + const uint8_t *P_pEntropyInput, \ + int32_t P_entropySize, \ + const uint8_t *P_pNonce, \ + int32_t P_nonceSize, \ + const uint8_t *P_pPersStr, \ + int32_t P_persStrSize); + \ + + /* Generate function for DRBG_AES128 ******************************************/ + int32_t crl_DRBG_AES128_Generate (uint8_t *P_pState, \ + uint8_t *P_pOutput, \ + const uint8_t *P_pAddInput, \ + int32_t P_addInputSize, \ + int32_t P_nBytes); + \ + /* Reseed *********************************************************************/ + int32_t crl_DRBG_AES128_Reseed (uint8_t *P_pState, \ + const uint8_t *P_pEntropyInput, \ + int32_t P_entropySize, \ + const uint8_t *P_pAddInput, \ + int32_t P_addInputSize); + \ + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__DRGB_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/RNG/rng.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/RNG/rng.h new file mode 100644 index 0000000..f189290 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/RNG/rng.h @@ -0,0 +1,145 @@ +/** + ****************************************************************************** + * @file rng.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides the random engine to the crypto library + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_RNG_H__ +#define __CRL_RNG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ +#include "DRBG_AES128/drbg.h" + + + /** @addtogroup RNG + * @{ + */ + /* Exported constants ------------------------------------------------------- */ + + /* Exported types ----------------------------------------------------------- */ + /** + * @brief Structure that contains the RNG stat + */ + typedef struct + { + uint8_t mRNGstate[CRL_DRBG_AES128_STATE_SIZE]; /*!< Underlying DRBG context. It is initialized by \ref RNGinit */ + + int32_t mDRBGtype; /*!< Used to check if the random state has been mFlag */ + + uint32_t mFlag; /*!< Used to check if the random state has been mFlag */ + } + RNGstate_stt; + + + /** + * @brief Structure used by RNGinit to initialize a DRBG + */ + typedef struct + { + + uint8_t* pmEntropyData; /*!< The entropy data input */ + + int32_t mEntropyDataSize; /*!< Size of the entropy data input */ + + uint8_t* pmNonce; /*!< The Nonce data */ + + int32_t mNonceSize; /*!< Size of the Nonce */ + + uint8_t* pmPersData; /*!< Personalization String */ + + int32_t mPersDataSize; /*!< Size of personalization string*/ + } + RNGinitInput_stt; + + + /** + * @brief Structure used by RNGreseed to reseed a DRBG + */ + typedef struct + { + + uint8_t* pmEntropyData; /*!< The entropy data input */ + + int32_t mEntropyDataSize; /*!< Size of the entropy data input */ + + uint8_t* pmAddInput; /*!< Additional input */ + + int32_t mAddInputSize; /*!< Size of additional input */ + } + RNGreInput_stt; + + /** + * @brief Structure used by RNGgenBytes or RNGgenWords to provide the optional additional input + */ + typedef struct + { + uint8_t* pmAddInput; /*!< Additional input */ + + int32_t mAddInputSize; /*!< Size of additional input */ + } + RNGaddInput_stt; + + + /* Exported functions ------------------------------------------------------- */ + /* Reseed random **************************************************************/ + int32_t RNGreseed (const RNGreInput_stt *P_pInputData, \ + RNGstate_stt *P_pRandomState); + + /* Initialize random **********************************************************/ + int32_t RNGinit (const RNGinitInput_stt *P_pInputData, \ + RNGstate_stt *P_pRandomState); + /* Free random ****************************************************************/ + int32_t RNGfree (RNGstate_stt *P_pRandomState ); + + /* Generate random octets to a buffer *****************************************/ + int32_t RNGgenBytes(RNGstate_stt *P_pRandomState, \ + const RNGaddInput_stt *P_pAddInput, \ + uint8_t *P_pOutput, \ + int32_t P_OutLen); + + /* Return a random int32_t ****************************************************/ + int32_t RNGgenWords(RNGstate_stt *P_pRandomState, \ + const RNGaddInput_stt *P_pAddInput, \ + uint32_t *P_pWordBuf, \ + int32_t P_BufSize); + +#ifdef __cplusplus +} +#endif + +/** + * @} + */ + + +#endif /* __CRL_RAND_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/RSA/LowLevel/rsa_low_level.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/RSA/LowLevel/rsa_low_level.h new file mode 100644 index 0000000..c1f3856 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/RSA/LowLevel/rsa_low_level.h @@ -0,0 +1,60 @@ +/** + ****************************************************************************** + * @file rsa_low_level.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides Low Level RSA operations + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_RSA_LOW_LEVEL_H__ +#define __CRL_RSA_LOW_LEVEL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup RSAlowlevel + * @{ + */ + +#define RSAEP(P_pPubKey, P_pInput, P_pOutput, P_pMemBuf) RSAVP1((P_pPubKey),(P_pInput),(P_pOutput), (P_pMemBuf)) /*!< Wrapper for RSAVP1*/ +#define RSADP(P_pPrivKey, P_pInput, P_pOutput, P_pMemBuf) RSASP1((P_pPrivKey),(P_pInput),(P_pOutput), (P_pMemBuf)) /*!< Wrapper for RSADP*/ + + + int32_t RSASP1(const RSAprivKey_stt *P_pPrivKey, const uint8_t * P_pEM, uint8_t *P_pOutput, membuf_stt *P_pMemBuf); + int32_t RSAVP1(const RSApubKey_stt *P_pPubKey, const uint8_t * P_pSignature, uint8_t *P_pOutput, membuf_stt *P_pMemBuf); + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_RSA_LOW_LEVEL_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/RSA/PKCS#1v15/rsa_pkcs1v15.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/RSA/PKCS#1v15/rsa_pkcs1v15.h new file mode 100644 index 0000000..89e8957 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/RSA/PKCS#1v15/rsa_pkcs1v15.h @@ -0,0 +1,102 @@ +/** + ****************************************************************************** + * @file rsa.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides RSA operations with support for PKCS#1v1.5 + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ******************************************************************************/ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_RSA_H__ +#define __CRL_RSA_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Includes ------------------------------------------------------------------*/ + + /** @ingroup RSA + * @{ + */ + + /** + * @brief Structure type for RSA public key + */ + typedef struct + { + uint8_t *pmModulus; /*!< RSA Modulus */ + int32_t mModulusSize; /*!< Size of RSA Modulus */ + uint8_t *pmExponent; /*!< RSA Public Exponent */ + int32_t mExponentSize; /*!< Size of RSA Public Exponent */ + } + RSApubKey_stt; + + /** + * @brief Structure type for RSA private key + */ + typedef struct + { + uint8_t *pmModulus; /*!< RSA Modulus */ + int32_t mModulusSize; /*!< Size of RSA Modulus */ + uint8_t *pmExponent; /*!< RSA Private Exponent */ + int32_t mExponentSize; /*!< Size of RSA Private Exponent */ + } + RSAprivKey_stt; + + /** + * @brief Structure type for input/output of PKCS#1 encryption/decryption operation + */ + typedef struct + { + const uint8_t *pmInput; /*!< Pointer to input buffer */ + int32_t mInputSize; /*!< Size of input buffer */ + uint8_t *pmOutput; /*!< Pointer to output buffer */ + } + RSAinOut_stt; + + int32_t RSA_PKCS1v15_Sign(const RSAprivKey_stt *P_pPrivKey, const uint8_t *P_pDigest, hashType_et P_hashType, uint8_t *P_pSignature, membuf_stt *P_pMemBuf); + + int32_t RSA_PKCS1v15_Verify(const RSApubKey_stt *P_pPubKey, const uint8_t *P_pDigest, hashType_et P_hashType, const uint8_t *P_pSignature, membuf_stt *P_pMemBuf); + + int32_t RSA_PKCS1v15_Encrypt (const RSApubKey_stt *P_pPubKey, + RSAinOut_stt *P_pInOut_st, + RNGstate_stt *P_pRandomState, + membuf_stt *P_pMemBuf); + + int32_t RSA_PKCS1v15_Decrypt (const RSAprivKey_stt *P_pPrivKey, + RSAinOut_stt *P_pInOut_st, + int32_t *P_pOutputSize, + membuf_stt *P_pMemBuf); + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_RSA_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/RSA/rsa.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/RSA/rsa.h new file mode 100644 index 0000000..804b2f0 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/RSA/rsa.h @@ -0,0 +1,39 @@ +/** + ****************************************************************************** + * @file rsa.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides RSA operations with support for PKCS#1v1.5 + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "PKCS#1v15/rsa_pkcs1v15.h" +#include "LowLevel/rsa_low_level.h" +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/CBC/tdes_cbc.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/CBC/tdes_cbc.h new file mode 100644 index 0000000..d0af08d --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/CBC/tdes_cbc.h @@ -0,0 +1,89 @@ +/** + ****************************************************************************** + * @file tdes_cbc.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief TDES in CBC Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_TDES_CBC_H__ +#define __CRL_TDES_CBC_H__ + + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Exported functions --------------------------------------------------------*/ + /** @ingroup TDESCBC + * @{ + */ +#ifdef INCLUDE_ENCRYPTION + /* load the key and ivec, eventually performs key schedule, etc. *****/ + int32_t TDES_CBC_Encrypt_Init (TDESCBCctx_stt *P_pTDESCBCctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times **********************/ + int32_t TDES_CBC_Encrypt_Append (TDESCBCctx_stt *P_pTDESCBCctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output ******************************************************/ + int32_t TDES_CBC_Encrypt_Finish (TDESCBCctx_stt *P_pTDESCBCctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif +#ifdef INCLUDE_DECRYPTION + /* load the key and ivec, eventually performs key schedule, etc. *****/ + int32_t TDES_CBC_Decrypt_Init (TDESCBCctx_stt *P_pTDESCBCctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times **********************/ + int32_t TDES_CBC_Decrypt_Append (TDESCBCctx_stt *P_pTDESCBCctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output ******************************************************/ + int32_t TDES_CBC_Decrypt_Finish (TDESCBCctx_stt *P_pTDESCBCctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif /* decryption */ + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_TDES_CBC_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/Common/tdes_common.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/Common/tdes_common.h new file mode 100644 index 0000000..e3c209c --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/Common/tdes_common.h @@ -0,0 +1,69 @@ +/** + ****************************************************************************** + * @file tdes_common.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief TDES common functions and definitions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __TDES_COMMON_H__ +#define __TDES_COMMON_H__ + + +#ifdef __cplusplus +extern "C" +{ +#endif + + + + /** @addtogroup TDES + * @{ + */ + /* Exported constants --------------------------------------------------------*/ +#define CRL_TDES_BLOCK 8 /*!< Number of bytes (uint8_t) necessary to store a Triple DES block. */ +#define CRL_TDES_KEY 24 /*!< Number of bytes (uint8_t) necessary to store a Triple DES key. */ + /* Exported types ------------------------------------------------------------*/ + typedef struct + { + uint32_t mContextId; /*!< Unique ID of this context. \b Not \b used in current implementation. */ + SKflags_et mFlags; /*!< 32 bit mFlags, used to perform keyschedule */ + const uint8_t *pmKey; /*!< Pointer to original Key buffer */ + const uint8_t *pmIv; /*!< Pointer to original Initialization Vector buffer */ + int32_t mIvSize; /*!< Size of the Initialization Vector in bytes */ + uint32_t amIv[2]; /*!< Temporary result/IV */ + uint32_t amExpKey[96]; /*!< Expanded DES key */ + } + TDESCBCctx_stt; /*!< TDES context structure for ECB and CBC modes */ + + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__TDES_COMMON_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/ECB/tdes_ecb.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/ECB/tdes_ecb.h new file mode 100644 index 0000000..cd5a22b --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/ECB/tdes_ecb.h @@ -0,0 +1,88 @@ +/** + ****************************************************************************** + * @file tdes_ecb.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief TDES in ECB Mode + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_TDES_ECB_H__ +#define __CRL_TDES_ECB_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** @ingroup TDESECB + * @{ + */ + /* Exported types ------------------------------------------------------------*/ + typedef TDESCBCctx_stt TDESECBctx_stt; /*!< TDES context structure for ECB and CBC modes */ + /* Exported functions --------------------------------------------------------*/ + /* load the key and ivec, eventually performs key schedule, etc. *****/ + int32_t TDES_ECB_Encrypt_Init (TDESECBctx_stt *P_pTDESECBctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times **********************/ + int32_t TDES_ECB_Encrypt_Append (TDESECBctx_stt *P_pTDESECBctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output ******************************************************/ + int32_t TDES_ECB_Encrypt_Finish (TDESECBctx_stt *P_pTDESECBctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + +#ifdef INCLUDE_DECRYPTION + /* load the key and ivec, eventually performs key schedule,, etc. *****/ + int32_t TDES_ECB_Decrypt_Init (TDESECBctx_stt *P_pTDESECBctx, \ + const uint8_t *P_pKey, \ + const uint8_t *P_pIv); + + /* launch crypto operation , can be called several times **********************/ + int32_t TDES_ECB_Decrypt_Append (TDESECBctx_stt *P_pTDESECBctx, \ + const uint8_t *P_pInputBuffer, \ + int32_t P_inputSize, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); + + /* Possible final output ******************************************************/ + int32_t TDES_ECB_Decrypt_Finish (TDESECBctx_stt *P_pTDESECBctx, \ + uint8_t *P_pOutputBuffer, \ + int32_t *P_pOutputSize); +#endif /* ECB Decryption */ + /** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRL_TDES_ECB_H__*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/tdes.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/tdes.h new file mode 100644 index 0000000..3474941 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/TDES/tdes.h @@ -0,0 +1,38 @@ +/** + ****************************************************************************** + * @file tdes.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Container for the TDES functionalities + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "Common/tdes_common.h" + +#ifdef INCLUDE_ECB +#include "ECB/tdes_ecb.h" +#endif + +#ifdef INCLUDE_CBC +#include "CBC/tdes_cbc.h" +#endif + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Inc/config.h a/Base_core/AESLIB/STM32_Cryptographic/Inc/config.h new file mode 100644 index 0000000..3cab2f0 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Inc/config.h @@ -0,0 +1,396 @@ +/** + ****************************************************************************** + * @file config.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief This file contains all the functions prototypes for the config firmware + * library. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_CONFIG_H__ +#define __CRL_CONFIG_H__ + +/* Includes ------------------------------------------------------------------*/ +#include + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief Structure that contains STM32 Cryptographic Library settings + */ +typedef struct +{ + uint8_t X; /*!< Used to get the X parametre of the current STM32 crypto library verion */ + uint8_t Y; /*!< Used to get the Y parametre of the current STM32 crypto library verion */ + uint8_t Z; /*!< Used to get the Z parametre of the current STM32 crypto library verion */ + uint8_t Type; /*!< Used to get the Type of the verion. + This parameter can be a value of @ref TypeConf */ + uint8_t CortexConf ; /*!< Used to get the Cortex. + This parameter can be a value of @ref CortexConf */ + uint8_t IdeConf ; /*!< Used to get the IDE used to compile the library. + This parameter can be a value of @ref IdeConf */ + uint8_t IdeOptimization ; /*!< Used to get the compiler optimization. + This parameter can be any combination of values of @ref IdeOptimization */ + uint8_t EndiannessConf ; /*!< Used to get the option value used to specify the memory representation of the platform. + This parameter can be a value of @ref EndiannessConf */ + uint8_t MisalignedConf ; /*!< Used to get if the CRL_CPU_SUPPORT_MISALIGNED is defined or not. + This parameter can be any combination of values of @ref MisalignedConf */ + uint8_t EncDecConf; /*!< Used to get which functionalities of encryption and decryptio functionalities are included. + This parameter can be any combination of values of @ref EncDecConf */ + uint16_t SymKeyConf ; /*!< Used to get the Symmetric algorithms included in the library + This parameter can be any combination of values of @ref SymKeyConf */ + uint16_t SymKeyModesConf ; /*!< Used to get the Modes of Operations for Symmetric Key Algorithms included in the library + This parameter can be any combination of values of @ref SymKeyModesConf */ + uint16_t AsymKeyConf ; /*!< Used to get the Asymmetric algorithms included in the library + This parameter can be any combination of values of @ref AsymKeyConf */ + uint16_t HashConf ; /*!< Used to get the Hash and Hmac algorithms included in the library + This parameter can be any combination of values of @ref HashConf */ + uint16_t MACConf; /*!< Used to get the MAC algorithms included in the library + This parameter can be any combination of values of @ref MACConf */ + uint8_t DrbgConf ; /*!< Used to get if the deterministic random bit generator is inculded. + This parameter can be any combination of values of @ref DRBGConf */ + uint8_t AesConf ; /*!< Used to get the AES algorithm version used. + This parameter can be a value of @ref AESConf */ + uint8_t RsaConf ; /*!< Used to get the Window size selected. + This parameter can be a value of @ref RSAConf*/ + uint8_t GcmConf ; /*!< Used to get the algorithm to be used for polynomial multiplication in AES-GCM. + This parameter can be a value of @ref GCMConf */ +}STM32CryptoLibVer_TypeDef; + +/* Exported constants --------------------------------------------------------*/ +/* Exported macros -----------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +int32_t STM32_GetCryptoLibrarySettings(STM32CryptoLibVer_TypeDef * LibVersion); + +/************************************************************************************************* +***-*-*-*-*--**- CONFIGURATION OPTIONS -**--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*** +*************************************************************************************************/ + +/** @defgroup CRYPTO_LIBRARY_VERSION + * This groupe is just used by the function STM32_GetCryptoLibrarySettings to get the current library settings + * This groupe has no impact on the algorithms implementation + * @{ + */ +#define VERSION_X 3 /*!< The X parametre of the current STM32 crypto library verion */ +#define VERSION_Y 0 /*!< The Y parametre of the current STM32 crypto library verion */ +#define VERSION_Z 0 /*!< The Z parametre of the current STM32 crypto library verion */ +/** + * @} End of CRYPTO_LIBRARY_VERSION + */ + +/** + * @defgroup TypeConf + * This groupe is just used by the function STM32_GetCryptoLibrarySettings to get the current library settings + * This groupe has no impact on the algorithms implementation + * Only one option should be enabled + * @{ + */ +#define SW ((uint8_t)0x01) /*!< This impelmentation is Full SW */ + /* #define HW ((uint8_t)0x02) */ /*!< This impelmentation support a HW accelerations*/ + +/** + * @} End of TypeConf + */ + +/** + * @defgroup CortexConf Compiler setting + * This groupe is just used by the function STM32_GetCryptoLibrarySettings to get the current library settings + * This groupe has no impact on the algorithms implementation + * Only one option should be enabled + * @{ + */ + /* #define CORTEX_M0 ((uint16_t)0x0001) */ /*!< Library is compiled for Cortex M0 */ + /* #define CORTEX_M0+ ((uint16_t)0x0002) */ /*!< Library is compiled for Cortex M0+ */ + /* #define CORTEX_M3 ((uint16_t)0x0003) */ /*!< Library is compiled for Cortex M3 */ +#define CORTEX_M4 ((uint16_t)0x0004) /*!< Library is compiled for Cortex M4 */ + /* #define CORTEX_M7 ((uint16_t)0x0005) */ /*!< Library is compiled for Cortex M7 */ +/** + * @} End of CortexConf + */ + +/** + * @defgroup IdeConf Compiler setting + * This groupe is just used by the function STM32_GetCryptoLibrarySettings to get the current library settings + * This groupe has no impact on the algorithms implementation + * Only one option should be enabled + * @{ + */ +#define IAR ((uint8_t)0x01) /*!< Library is compiled with Iar */ + /* #define KEIL ((uint8_t)0x02) */ /*!< Library is compiled with Keil */ + /* #define GCC ((uint8_t)0x03) */ /*!< Library is compiled with GCC */ + +/** + * @} End of IdeConf + */ + + +/** + * @defgroup IdeOptimization Compiler setting + * This groupe is just used by the function STM32_GetCryptoLibrarySettings to get the current library settings + * This groupe has no impact on the algorithms implementation + * @{ + */ +#ifdef IAR + /* #define IAR_Optimization ((uint16_t)0x0001) */ /*!< The compiler optimization is None optimization */ + /* #define IAR_Optimization ((uint16_t)0x0002) */ /*!< The compiler optimization is Low optimization */ + /* #define IAR_Optimization ((uint16_t)0x0003) */ /*!< The compiler optimization is Meduim optimization */ + /* #define IAR_Optimization ((uint16_t)0x0004) */ /*!< The compiler optimization is high balanced optimization */ + /* #define IAR_Optimization ((uint16_t)0x0005) */ /*!< The compiler optimization is high Size optimization */ +#define IAR_Optimization ((uint16_t)0x0006) /*!< The compiler optimization is high speed optimization */ + /* #define IAR_Optimization ((uint16_t)0x0007) */ /*!< The compiler optimization is high speed optimization with No Size constraints */ +#endif + +#ifdef KEIL + /* #define KEIL_Optimization ((uint16_t)0x0001) */ /*!< The compiler optimization is O0 */ + /* #define KEIL_Optimization ((uint16_t)0x0002) */ /*!< The compiler optimization is O1 */ + /* #define KEIL_Optimization ((uint16_t)0x0003) */ /*!< The compiler optimization is O2 */ + /* #define KEIL_Optimization ((uint16_t)0x0004) */ /*!< The compiler optimization is O3 */ + + /* #define OFT ((uint16_t)0x0010) */ /*!< Library is compiled with option Optimize For Time */ + /* #define SLSM ((uint16_t)0x0020) */ /*!< Library is compiled with option Split Load And Store Multiple */ + /* #define O1ELFSPF ((uint16_t)0x0040) */ /*!< Library is compiled with option One ELF Section per Function */ +#endif + +#ifdef GCC + /* #define GCC_Optimization ((uint16_t)0x0001) */ /*!< The compiler optimization is O0 */ + /* #define GCC_Optimization ((uint16_t)0x0002) */ /*!< The compiler optimization is OG */ + /* #define GCC_Optimization ((uint16_t)0x0003) */ /*!< The compiler optimization is O1 */ + /* #define GCC_Optimization ((uint16_t)0x0004) */ /*!< The compiler optimization is O2 */ + /* #define GCC_Optimization ((uint16_t)0x0005) */ /*!< The compiler optimization is O3 */ + /* #define GCC_Optimization ((uint16_t)0x0006) */ /*!< The compiler optimization is OS */ + /* #define GCC_Optimization ((uint16_t)0x0007) */ /*!< The compiler optimization is Ofast */ + + /* #define PDCR ((uint16_t)0x0010) */ /*!< Library is compiled with option Prepare Dead Code Removal */ + /* #define PDDR ((uint16_t)0x0020) */ /*!< Library is compiled with option Prepare Dead Data Removal */ + /* #define NSA ((uint16_t)0x0040) */ /*!< Library is compiled with option No Strict Aliasing */ +#endif + +/** + * @} End of IdeOptimization + */ + + + + +/** @defgroup EndiannessConf Endianness + * Used to specify the memory representation of the platform. + * - CRL_ENDIANNESS=1 for LITTLE ENDIAN + * - CRL_ENDIANNESS=2 for BIG ENDIAN \n + * This setting is \b VERY \b IMPORTANT + * Only one option should be enabled + * @{ + */ + +#define CRL_ENDIANNESS 1 /*!< LITTLE ENDIAN is selected */ + /* #define CRL_ENDIANNESS 2 */ /*!< BIG ENDIAN is selected */ + +/** + * @} End of EndiannessConf + */ + +/** + * @defgroup MisalignedConf Misaligned words read/write operations. + * Used to specify if the processor supports misaligned integers read/write operations. \n + * To be portable this flag is not defined but if the processor supports read/write operations of 4 + * bytes to address not multiple by 4 then setting this flag to 1 will improve the performance + * of AES when used through high level functions (ex AES_CBC or crl_AES). + * @{ + */ +#define CRL_CPU_SUPPORT_MISALIGNED ((uint8_t)0x01) /*!< Improve the performance of AES when used through high level functions + Enabled for Cortex M3, M4, M7 and Disabled for Cortex M0, M0+ */ + + +/** + * @} End of MisalignedConf + */ + +/** + * @defgroup EncDecConf Encryption and/or Decryption functionalities + * @{ + */ +#define INCLUDE_ENCRYPTION ((uint8_t)0x01) /*!< Includes the Encryption functionalities in the library.*/ +#define INCLUDE_DECRYPTION ((uint8_t)0x02) /*!< Includes the Decryption functionalities in the library.*/ + +/** + * @} End of EncDecConf + */ + +/** + * @defgroup SymKeyConf Symmetric Key Algorithms + * @{ + */ + +#define INCLUDE_DES ((uint16_t)0x0001) /*!< DES functions are included in the library. */ +#define INCLUDE_TDES ((uint16_t)0x0002) /*!< TripleDES (TDES) functions are included in the library. */ +#define INCLUDE_AES128 ((uint16_t)0x0004) /*!< AES functions with key size of 128 bit are included in the library. */ +#define INCLUDE_AES192 ((uint16_t)0x0008) /*!< AES functions with key size of 192 bit are included in the library. */ +#define INCLUDE_AES256 ((uint16_t)0x0010) /*!< AES functions with key size of 256 bit are included in the library. */ +#define INCLUDE_ARC4 ((uint16_t)0x0020) /*!< ARC4 functions are included in the library. */ +#define INCLUDE_CHACHA ((uint16_t)0x0040) /*!< ChaCha functions are included in the library. */ +#define INCLUDE_CHACHA20POLY1305 ((uint16_t)0x0080) /*!< oly1305-AES functions are included in the library */ + +/** + * @} End of SymKeyConf + */ + +/** + * @defgroup SymKeyModesConf Modes of Operations for Symmetric Key Algorithms + * @{ + */ + +#define INCLUDE_ECB ((uint16_t)0x0001) /*!< AES high level functions for ECB mode are included in the library */ +#define INCLUDE_CBC ((uint16_t)0x0002) /*!< AES high level functions for CBC mode are included in the library */ +#define INCLUDE_CTR ((uint16_t)0x0004) /*!< AES high level functions for CTR mode are included in the library */ +#define INCLUDE_GCM ((uint16_t)0x0008) /*!< AES high level functions for GCM mode are included in the library */ +#define INCLUDE_KEY_WRAP ((uint16_t)0x0010) /*!< AES-KWRAP is included in the library */ +#define INCLUDE_CCM ((uint16_t)0x0020) /*!< AES-CCM is included in the library */ +#define INCLUDE_CMAC ((uint16_t)0x0040) /*!< AES-CMAC is included in the library */ +#define INCLUDE_XTS ((uint16_t)0x0080) /*!< AES-XTS is included in the library */ +#define INCLUDE_OFB ((uint16_t)0x0100) /*!< AES-OFB is included in the library */ +#define INCLUDE_CFB ((uint16_t)0x0200) /*!< AES-CFB is included in the library */ + +/** + * @} End of SymKeyModesConf + */ + +/** + * @defgroup AsymKeyConf Asymmetric Key Algorithms + * @{ + */ + +#define INCLUDE_RSA (uint16_t)0x0001) /*!< RSA functions for signature verification are included in the library */ +#define INCLUDE_ECC (uint16_t)0x0002) /*!< ECC functions are included in the library */ +#define INCLUDE_ED25519 (uint16_t)0x0004) /*!< ED25519 functions are included in the library */ +#define INCLUDE_CURVE25519 (uint16_t)0x0008) /*!< Curve25519 functions are included in the library */ +/** + * @} End of AsymKeyConf + */ + +/** + * @defgroup HashConf Hash and HMAC Algorithms + * @{ + */ + +#define INCLUDE_MD5 ((uint16_t)0x0001) /*!< MD5 functions are included in the library */ +#define INCLUDE_SHA1 ((uint16_t)0x0002) /*!< SHA-1 functions are included in the library */ +#define INCLUDE_SHA224 ((uint16_t)0x0004) /*!< SHA-224 functions are included in the library */ +#define INCLUDE_SHA256 ((uint16_t)0x0008) /*!< SHA-256 functions are included in the library */ +#define INCLUDE_SHA384 ((uint16_t)0x0010) /*!< SHA-384 functions are included in the library */ +#define INCLUDE_SHA512 ((uint16_t)0x0020) /*!< SHA-512 functions are included in the library */ +#define INCLUDE_HMAC ((uint16_t)0x0040) /*!< Select if, for the selected hash algorithms, HMAC should be included in the library */ +#define INCLUDE_HKDF ((uint16_t)0x0080) /*!< Select if including the HKDF key derivation function, it requires HMAC */ + + + /** + * @} + */ + +/** +* @defgroup MACConf Poly1305-AES Algorithm +* @{ +*/ + +#define INCLUDE_POLY1305 ((uint16_t)0x0001) /*!< This defines if Poly1305-AES functions are included in the library */ + +/** +* @} +*/ + + + +/** + * @defgroup DRBGConf Deterministic Random Bit Generator Based on AES-128 + * @{ + */ +#define INCLUDE_DRBG_AES128 ((uint16_t)0x0001) /*!< Includes the deterministic random bit generator library */ +#define CRL_RANDOM_REQUIRE_RESEED ((uint16_t)0x0002) /*!< Implements the request for reseed when using the DRBG too many times for security standards */ +/** + * @} End of DRBGConf + */ + + + + + + +/** + * @defgroup AESConf AES version + * Used to select the AES algorithm version to use + * - CRL_AES_ALGORITHM = 1 : version with 522 bytes of look-up tables, slower than version 2. + * - CRL_AES_ALGORITHM = 2 : version with 2048 bytes of look-up tables, faster than version 1. + * Only one option should be enabled + * @{ + + */ + /* #define CRL_AES_ALGORITHM 1 */ /*!< version with 522 bytes of look-up tables is selected */ + #define CRL_AES_ALGORITHM 2 /*!< version with 2048 bytes of look-up tables is selected */ +/** + * @} End of AESConf + */ + +/** + * @defgroup RSAConf RSA Window Size + * This parameter is used to speed up RSA operation with private key at expense of RAM memory. + * It can't be set less than one. + * Suggested values are 3 or 4. Entering a value of 7 or more will be probably worst than using 6. + * Only one option should be enabled + * @{ + */ + /* #define RSA_WINDOW_SIZE 1 */ /*!< Window size selected is 1 */ + /* #define RSA_WINDOW_SIZE 2 */ /*!< Window size selected is 2 */ + /* #define RSA_WINDOW_SIZE 3 */ /*!< Window size selected is 3 */ +#define RSA_WINDOW_SIZE 4 /*!< Window size selected is 4 */ +/** + * @} End of RSAConf + */ + +/** + * @defgroup GCMConf AES GCM GF(2^128) Precomputations Tables + * Used to specify the algorithm to be used for polynomial multiplication in AES-GCM.\n + * The algorithm's choice also defines the size of the precomputed table made to speed + * up the multiplication. \n There are two types of table, one is based on the value of + * the key and so needs to be generated at runting (through AES_GCM_keyschedule), the other + * is constant and is defined (if included here) in privkey.h. + * There are 3 possible choices: + * - 0 = Without any tables. No space required. Slower version. + * - 1 = Key-dependent table for *Poly(y) 0000
© COPYRIGHT 2015 STMicroelectronics
+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +#include "config.h" + +/* List of automatically enabled defines and checks */ +#if defined ( __GNUC__ ) + #ifndef __weak + #define __weak __attribute__((weak)) + #endif /* __weak */ +#endif + +/* INCLUDE_DRBG_AES128 requires AES128 with Encryption capabilities */ +#ifdef INCLUDE_DRBG_AES128 +#define INCLUDE_AES128 ((uint16_t)0x0004) +#define INCLUDE_ENCRYPTION ((uint8_t)0x01) +#endif + +#if defined(INCLUDE_AES128) || defined(INCLUDE_AES192) || defined(INCLUDE_AES256) +#define INCLUDE_AES /*!< Automatically defined if AES has been selected */ +#endif + +#if defined(INCLUDE_DES) || defined(INCLUDE_TDES) +#define INCLUDE_DES_CORE /*!< TripleDES and DES has the same core function, this flag enables it */ +#endif + +#if defined(INCLUDE_RSA) || defined (INCLUDE_ECC) +#define INCLUDE_MATH /*!< The Multiprecision Math engine is included */ +#endif + +/** Hash functions are included */ +#ifdef INCLUDE_HKDF +#define INCLUDE_HMAC ((uint16_t)0x0040) +#define INCLUDE_SHA512 ((uint16_t)0x0020) +#endif + +#if defined(INCLUDE_SHA1) || defined(INCLUDE_SHA224) || defined(INCLUDE_SHA256) || defined(INCLUDE_MD5)|| defined(INCLUDE_SHA512) +#define INCLUDE_HASH /*!< Hash functions are included */ +#endif + + + + +/************************************************************************************************* +***-*-*-*-*--**- SOME CHECKS, DON'T MODIFY -**--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-** +*************************************************************************************************/ +#if (defined(INCLUDE_ENCRYPTION) || defined(INCLUDE_DECRYPTION)) && !(defined(INCLUDE_AES) || defined(INCLUDE_DES_CORE) || defined(INCLUDE_ARC4)) +#error "Either encryption or decryption has been specified but no AES or DES are present" +#elif (!defined(INCLUDE_ENCRYPTION) && !defined(INCLUDE_DECRYPTION)) && (defined(INCLUDE_AES) || defined(INCLUDE_DES_CORE)) +#error "AES or DES are present but without encryption or decryption functionalities!" +#endif + +#ifdef CRL_CPU_SUPPORT_MISALIGNED + #ifndef CRL_ENDIANNESS + #error "With CRL_CPU_SUPPORT_MISALIGNED=1 a definition for CRL_ENDIANNESS is required!" + #endif +#endif + +#if defined(INCLUDE_GCM) && !defined(INCLUDE_AES) +#error "GCM is currently supported only by AES, but AES has not be included, please include AES or remove GCM" +#endif + +#if defined(INCLUDE_CMAC) && !defined(INCLUDE_AES) +#error "CMAC is currently supported only by AES, but AES has not be included, please include AES or remove GCM" +#endif + +#if defined(INCLUDE_KEY_WRAP) && !defined(INCLUDE_AES) +#error "KWRAP is currently supported only by AES, but AES has not be included, please include AES or remove KWRAP" +#endif + +#if defined(INCLUDE_CTR) && !defined(INCLUDE_AES) +#error "CTR is currently supported only by AES, but AES has not be included, please include AES or remove CTR" +#endif + +#if defined(INCLUDE_CCM) && !defined(INCLUDE_AES) +#error "CCM is currently supported only by AES, but AES has not be included, please include AES or remove CCM" +#endif + +#if defined(INCLUDE_DRBG_AES128) && !defined(INCLUDE_AES128) +#error "DRBG_AES128 requires INCLUDE_AES_128" +#endif + +#if defined(INCLUDE_POLY1305) && !defined(INCLUDE_AES128) +#error "POLY1305-AES requires INCLUDE_AES_128" +#endif + + +#if defined(INCLUDE_ED25519) && !defined(INCLUDE_SHA512) +#error "ED25519 requires INCLUDE_SHA512" +#endif + +#if defined(INCLUDE_ECC_SIGN) & !(defined(INCLUDE_DRBG_AES128)) +#error "To include ECC_SIGN functionalities you need a random generator. \n" +#endif + +#if defined(INCLUDE_RSA) && !defined(RSA_WINDOW_SIZE) +#define RSA_WINDOW_SIZE 1 +#endif + +/************************************************************************************************* +***-*-*-*-*--**- STD PERIPHERAL DRIVERS INCLUSION -**--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*** +*************************************************************************************************/ +#define CL_ON_STM32 + +/************************************************************************************************* +***-*-*-*-*--**- FAMILIES WITH HW CRYPTO -**--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*** +*************************************************************************************************/ + +#if defined(INCLUDE_DRBG_AES128) +#define INCLUDE_RNG /*!< A Random Engine is present in the library */ +#endif + +/************************************************************************************************* +***-*-*-*-*--**- CRYPTO LIBRARY INCLUSIONS -**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*** +*************************************************************************************************/ +#include +#include +#include "Common/types.h" +#include "Common/macros.h" +#include "Common/err_codes.h" +#include "Common/sk.h" + +#ifdef INCLUDE_AES +#include "AES/aes.h" +#endif + +#ifdef INCLUDE_DES +#include "DES/des.h" +#endif + +#ifdef INCLUDE_TDES +#include "TDES/tdes.h" +#endif + +#ifdef INCLUDE_ARC4 +#include "ARC4/arc4.h" +#endif + +#ifdef INCLUDE_HASH +#include "HASH/hash.h" +#endif + +#ifdef INCLUDE_MATH +#include "Common_ecc_rsa/MATH/math.h" +#endif + +#ifdef INCLUDE_RSA +#include "RSA/rsa.h" +#endif + +#ifdef INCLUDE_RNG +#include "RNG/rng.h" +#endif + +#ifdef INCLUDE_ECC +#include "ECC/ecc.h" +#endif +#ifdef INCLUDE_POLY1305 +#include "POLY1305/poly1305.h" +#endif + +#ifdef INCLUDE_ED25519 +#include "ED25519/ed25519.h" +#endif + +#ifdef INCLUDE_CURVE25519 +#include "C25519/c25519.h" +#endif + +#ifdef INCLUDE_CHACHA +#include "CHACHA/chacha.h" +#endif + +#ifdef INCLUDE_CHACHA20POLY1305 +#include "CHACHA20-POLY1305/chacha20-poly1305.h" +#endif + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_IAR.a a/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_IAR.a new file mode 100644 index 0000000..2cdcdf8 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_IAR.a diff --git b/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_IAR_otnsc.a a/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_IAR_otnsc.a new file mode 100644 index 0000000..345bd12 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_IAR_otnsc.a diff --git b/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib a/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib new file mode 100644 index 0000000..8d76113 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib diff --git b/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib a/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib new file mode 100644 index 0000000..a38d4ec --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Lib/STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib diff --git b/Base_core/AESLIB/STM32_Cryptographic/Lib/libSTM32CryptographicV3.0.0_CM4_GCC.a a/Base_core/AESLIB/STM32_Cryptographic/Lib/libSTM32CryptographicV3.0.0_CM4_GCC.a new file mode 100644 index 0000000..8630466 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Lib/libSTM32CryptographicV3.0.0_CM4_GCC.a diff --git b/Base_core/AESLIB/STM32_Cryptographic/Lib/libSTM32CryptographicV3.0.0_CM4_GCC_ot.a a/Base_core/AESLIB/STM32_Cryptographic/Lib/libSTM32CryptographicV3.0.0_CM4_GCC_ot.a new file mode 100644 index 0000000..1ab4d36 --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Lib/libSTM32CryptographicV3.0.0_CM4_GCC_ot.a diff --git b/Base_core/AESLIB/STM32_Cryptographic/Release_Notes.html a/Base_core/AESLIB/STM32_Cryptographic/Release_Notes.html new file mode 100644 index 0000000..9ec5e4d --- /dev/null +++ a/Base_core/AESLIB/STM32_Cryptographic/Release_Notes.html @@ -0,0 +1,50 @@ + + + + + + +Binary + +

Back to Release page
+

Release Notes for STM32 Cryptographic Firmware Library Package Libraries image format for Cortex M4

+

Copyright 2015 STMicroelectronics


+

Contents

  1. Libraries image format update History
  2. License

Libraries image format  update History


+

V3.0.0 / 05- June-2015

+

Main Changes

+
+
+
    +
  • Two STM32 Cryptographic Libraries provided for each Development Toolchain:
    • IAR Embedded Workbench for ARM (EWARM) toolchain v7.40:
      • STM32CryptographicV3.0.0_CM4_IAR.a: New official release of optimized STM32 Cryptographic Library for Cortex M4 with High size optimization.
      • +
      • STM32CryptographicV3.0.0_CM4_IAR_otnsc.a: First official release of optimized STM32 Cryptographic Library for Cortex M4 with High speed optimization and the option No +Size constraints is enabled.
      • +
    • RealView Microcontroller Development Kit (MDK-ARM) toolchain v5.14:
      • +
      • STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib: New official release of optimized STM32 Cryptographic Library for Cortex M4 with High size optimization.
      • +
      • STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib: First official release of optimized STM32 Cryptographic Library for Cortex M4 with High speed optimization and the option Split +Load and Store Multiple and One + ELF Section per Function are enabled.
      • +
      +
    • Atollic TrueSTUDIO STM32 (TrueSTUDIO) toolchain v5.3.0:
    • +
        +
      • STM32CryptographicV3.0.0_CM4_GCC.a: First official release of optimized STM32 Cryptographic Library for Cortex M4 with High size optimization.
      • +
      • STM32CryptographicV3.0.0_CM4_GCC_ot.a: First official release of optimized STM32 Cryptographic Library for Cortex M4 with High speed optimization.
      • +
      +
    +
+
+ Note: CRC pheripheral is used by STM32 cryptographic library.
+
+

License

Licensed +under MCD-ST Liberty SW License Agreement V2, (the "License"); You may +not use this package except in compliance with the License. You may +obtain a copy of the License at:


Unless +required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See +the License for the specific language governing permissions and +limitations under the License.

 

 


For complete documentation on STM32(CORTEX M4) 32-Bit Microcontrollers visit www.st.com/STM32

+

 

+ + + + \ No newline at end of file diff --git b/Base_core/Ethernet/Internet/dhcp.c a/Base_core/Ethernet/Internet/dhcp.c new file mode 100644 index 0000000..d738649 --- /dev/null +++ a/Base_core/Ethernet/Internet/dhcp.c @@ -0,0 +1,814 @@ +/** +****************************************************************************** +* @file dhcp.c +* @version V1.2 +* @date 2017-11-01 +* @brief 自动获取IP函数 +* +* @company 深圳炜世科技有限公司 +* @information WIZnet W5500官方代理商,全程技术支持,价格绝对优势! +* @website www.wisioe.com +* @forum www.w5500.cn +* @qqGroup 383035001 +****************************************************************************** +*/ + +#include +#include +#include "w5500.h" +#include "socket.h" +#include "dhcp.h" +#include "utility.h" +#include "w5500_conf.h" + +//#define DHCP_DEBUG +DHCP_Get DHCP_GET; +uint8* SRC_MAC_ADDR = EXTERN_DHCP_MAC; /*本地MAC地址*/ +uint8* GET_SN_MASK = EXTERN_DHCP_SN; /*从DHCP服务器获取到的子网掩码*/ +uint8* GET_GW_IP = EXTERN_DHCP_GW; /*从DHCP服务器获取到的网关地址*/ +uint8* GET_DNS_IP = EXTERN_DHCP_DNS; /*从DHCP服务器获取到的DNS服务器地址*/ +uint8* DHCP_HOST_NAME = EXTERN_DHCP_NAME; /*主机名*/ +uint8* GET_SIP = EXTERN_DHCP_SIP; /*从DHCP服务器获取到的本机IP*/ +uint8 DHCP_SIP[4] = {0,}; /*已发现的DNS服务器地址*/ +uint8 DHCP_REAL_SIP[4] = {0,}; /*从DHCP列表中选择使用的DHCP服务器*/ +uint8 OLD_SIP[4]; /*最初获取到的IP地址*/ + +uint8 dhcp_state = STATE_DHCP_READY; /*DHCP客户端状态*/ +uint8 dhcp_retry_count = 0; /*DHCP重试次数*/ +uint8 DHCP_timeout = 0; /*DHCP超时标志位*/ +uint32 dhcp_lease_time; /*租约时间*/ +uint32 next_dhcp_time = 0; /*DHCP超时时间*/ +uint32 dhcp_tick_cnt = 0; +uint8 DHCP_timer; + +uint8 Conflict_flag = 0; +uint32 DHCP_XID = DEFAULT_XID; +uint8 EXTERN_DHCPBUF[1024]; +RIP_MSG* pRIPMSG = (RIP_MSG*)EXTERN_DHCPBUF; /*DHCP消息指针*/ + +void send_DHCP_DISCOVER(void); /*向DHCP服务器发送发现报文*/ +void send_DHCP_REQUEST(void); /*向DHCP服务器发送请求报文*/ +void send_DHCP_RELEASE_DECLINE(char msgtype); /*向DHCP服务器发送释放报文*/ + +void reset_DHCP_time(void); /*初始化DHCP计时器*/ +void DHCP_timer_handler(void); /*DHCP计时器*/ +void check_DHCP_Timeout(void); /*检查是否超时*/ +uint8 check_leasedIP(void); /*检查获取的IP是否冲突*/ +uint8 parseDHCPMSG(uint16 length); /*从DHCP服务器接收消息并解析*/ + +/** +*@brief DHCP定时初始化 +*@param 无 +*@return 无 +*/ +void reset_DHCP_time(void) +{ + dhcp_time = 0; + dhcp_tick_cnt = 0; + next_dhcp_time = dhcp_time + DHCP_WAIT_TIME; + dhcp_retry_count = 0; +} + +/** +*@brief 发送DISCOVER信息给DHCP服务器 +*@param 无 +*@return 无 +*/ +void send_DHCP_DISCOVER(void) +{ + uint8 ip[4] = {255,255,255,255}; + uint16 i=0; + //the host name modified + uint8 host_name[12]; + //*((uint32*)DHCP_SIP)=0; + //*((uint32*)DHCP_REAL_SIP)=0; + memset((void*)pRIPMSG,0,sizeof(RIP_MSG)); /*清空pRIPMSG的 sizeof(RIP_MSG) 个空间*/ + + pRIPMSG->op = DHCP_BOOTREQUEST; + pRIPMSG->htype = DHCP_HTYPE10MB; + pRIPMSG->hlen = DHCP_HLENETHERNET; + pRIPMSG->hops = DHCP_HOPS; + pRIPMSG->xid = htonl(DHCP_XID); + pRIPMSG->secs = htons(DHCP_SECS); + pRIPMSG->flags =htons(DHCP_FLAGSBROADCAST); + pRIPMSG->chaddr[0] = SRC_MAC_ADDR[0]; + pRIPMSG->chaddr[1] = SRC_MAC_ADDR[1]; + pRIPMSG->chaddr[2] = SRC_MAC_ADDR[2]; + pRIPMSG->chaddr[3] = SRC_MAC_ADDR[3]; + pRIPMSG->chaddr[4] = SRC_MAC_ADDR[4]; + pRIPMSG->chaddr[5] = SRC_MAC_ADDR[5]; + + + /* MAGIC_COOKIE */ + pRIPMSG->OPT[i++] = (uint8)((MAGIC_COOKIE >> 24)& 0xFF); + pRIPMSG->OPT[i++] = (uint8)((MAGIC_COOKIE >> 16)& 0xFF); + pRIPMSG->OPT[i++] = (uint8)((MAGIC_COOKIE >> 8)& 0xFF); + pRIPMSG->OPT[i++] = (uint8)(MAGIC_COOKIE& 0xFF); + + /* Option Request Param. */ + pRIPMSG->OPT[i++] = dhcpMessageType; + pRIPMSG->OPT[i++] = 0x01; + pRIPMSG->OPT[i++] = DHCP_DISCOVER; + + /*Client identifier*/ + pRIPMSG->OPT[i++] = dhcpClientIdentifier; + pRIPMSG->OPT[i++] = 0x07; + pRIPMSG->OPT[i++] = 0x01; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[0]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[1]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[2]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[3]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[4]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[5]; + + // host name + pRIPMSG->OPT[i++] = hostName; + // set the host name + sprintf((char*)host_name,"%.4s-%02X%02X%02X",DEVICE_ID,SRC_MAC_ADDR[3],SRC_MAC_ADDR[4],SRC_MAC_ADDR[5]); + + + pRIPMSG->OPT[i++] = (uint8)strlen((char*)host_name); + + strcpy((char*)(&(pRIPMSG->OPT[i])),(char*)host_name); + + + i+=(uint16)strlen((char*)host_name); + + pRIPMSG->OPT[i++] = dhcpParamRequest; + pRIPMSG->OPT[i++] = 0x06; + pRIPMSG->OPT[i++] = subnetMask; + pRIPMSG->OPT[i++] = routersOnSubnet; + pRIPMSG->OPT[i++] = dns; + pRIPMSG->OPT[i++] = domainName; + pRIPMSG->OPT[i++] = dhcpT1value; + pRIPMSG->OPT[i++] = dhcpT2value; + pRIPMSG->OPT[i++] = endOption; + + /* send broadcasting packet */ + //printf(" send dhcp discover %s\r\n",EXTERN_DHCPBUF); + //for(uint8 i=0; i<3; i++) + //Delay_ms(800); + sendto(SOCK_DHCP, (uint8 *)pRIPMSG, sizeof(RIP_MSG), ip, DHCP_SERVER_PORT); + + #ifdef DHCP_DEBUG + //printf(" sent DHCP_DISCOVER\r\n"); + #endif +} + +/** +*@brief 将请求消息发送到DHCP服务器 +*@param 无 +*@return 无 +*/ +void send_DHCP_REQUEST(void) +{ + uint8 ip[4]; + uint16 i = 0; + //uint16 len=0; + uint8 host_name[12]; + + memset((void*)pRIPMSG,0,sizeof(RIP_MSG)); + + pRIPMSG->op = DHCP_BOOTREQUEST; + pRIPMSG->htype = DHCP_HTYPE10MB; + pRIPMSG->hlen = DHCP_HLENETHERNET; + pRIPMSG->hops = DHCP_HOPS; + pRIPMSG->xid = htonl(DHCP_XID); + pRIPMSG->secs = htons(DHCP_SECS); + + if(dhcp_state < STATE_DHCP_LEASED) + pRIPMSG->flags = htons(DHCP_FLAGSBROADCAST); + else + { + pRIPMSG->flags = 0; // For Unicast + memcpy(pRIPMSG->ciaddr,GET_SIP,4); + } + + memcpy(pRIPMSG->chaddr,SRC_MAC_ADDR,6); + + /* MAGIC_COOKIE */ + pRIPMSG->OPT[i++] = (uint8)((MAGIC_COOKIE >> 24) & 0xFF); + pRIPMSG->OPT[i++] = (uint8)((MAGIC_COOKIE >> 16) & 0xFF); + pRIPMSG->OPT[i++] = (uint8)((MAGIC_COOKIE >> 8) & 0xFF); + pRIPMSG->OPT[i++] = (uint8)(MAGIC_COOKIE & 0xFF); + + /* Option Request Param. */ + pRIPMSG->OPT[i++] = dhcpMessageType; + pRIPMSG->OPT[i++] = 0x01; + pRIPMSG->OPT[i++] = DHCP_REQUEST; + + pRIPMSG->OPT[i++] = dhcpClientIdentifier; + pRIPMSG->OPT[i++] = 0x07; + pRIPMSG->OPT[i++] = 0x01; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[0]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[1]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[2]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[3]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[4]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[5]; + + if(dhcp_state < STATE_DHCP_LEASED) + { + pRIPMSG->OPT[i++] = dhcpRequestedIPaddr; + pRIPMSG->OPT[i++] = 0x04; + pRIPMSG->OPT[i++] = GET_SIP[0]; + pRIPMSG->OPT[i++] = GET_SIP[1]; + pRIPMSG->OPT[i++] = GET_SIP[2]; + pRIPMSG->OPT[i++] = GET_SIP[3]; + + pRIPMSG->OPT[i++] = dhcpServerIdentifier; + pRIPMSG->OPT[i++] = 0x04; + pRIPMSG->OPT[i++] = DHCP_SIP[0]; + pRIPMSG->OPT[i++] = DHCP_SIP[1]; + pRIPMSG->OPT[i++] = DHCP_SIP[2]; + pRIPMSG->OPT[i++] = DHCP_SIP[3]; + } + + // host name + pRIPMSG->OPT[i++] = hostName; + //set the host name + sprintf((char*)host_name,(char*)"%.4s-%02X%02X%02X",DEVICE_ID,SRC_MAC_ADDR[3],SRC_MAC_ADDR[4],SRC_MAC_ADDR[5]); + pRIPMSG->OPT[i++] = (uint8)strlen((char*)host_name); + strcpy((char*)&(pRIPMSG->OPT[i]),(char*)host_name); + i+=strlen((char*)host_name); + + pRIPMSG->OPT[i++] = dhcpParamRequest; + pRIPMSG->OPT[i++] = 0x08; + pRIPMSG->OPT[i++] = subnetMask; + pRIPMSG->OPT[i++] = routersOnSubnet; + pRIPMSG->OPT[i++] = dns; + pRIPMSG->OPT[i++] = domainName; + pRIPMSG->OPT[i++] = dhcpT1value; + pRIPMSG->OPT[i++] = dhcpT2value; + pRIPMSG->OPT[i++] = performRouterDiscovery; + pRIPMSG->OPT[i++] = staticRoute; + pRIPMSG->OPT[i++] = endOption; + + /* send broadcasting packet */ + if(dhcp_state < STATE_DHCP_LEASED) memset(ip,0xFF,4); + else + memcpy(ip,DHCP_SIP,4); + sendto(SOCK_DHCP, (const uint8 *)pRIPMSG, sizeof(RIP_MSG), ip, DHCP_SERVER_PORT); + #ifdef DHCP_DEBUG + //printf(" sent DHCP_REQUEST\r\n"); + #endif +} + +/** +*@brief 发送释放消息 +*@param msgtype:是否为7 +*@return 无 +*/ +void send_DHCP_RELEASE_DECLINE(char msgtype) +{ + uint16 i =0; + uint8 ip[4]; + + memset((void*)pRIPMSG,0,sizeof(RIP_MSG)); + + pRIPMSG->op = DHCP_BOOTREQUEST; + pRIPMSG->htype = DHCP_HTYPE10MB; + pRIPMSG->hlen = DHCP_HLENETHERNET; + pRIPMSG->hops = DHCP_HOPS; + pRIPMSG->xid = htonl(DHCP_XID); + pRIPMSG->secs = htons(DHCP_SECS); + pRIPMSG->flags =0;// DHCP_FLAGSBROADCAST; + + memcpy(pRIPMSG->chaddr,SRC_MAC_ADDR,6); + + /* MAGIC_COOKIE */ + pRIPMSG->OPT[i++] = (uint8)((MAGIC_COOKIE >> 24) & 0xFF); + pRIPMSG->OPT[i++] = (uint8)((MAGIC_COOKIE >> 16) & 0xFF); + pRIPMSG->OPT[i++] = (uint8)((MAGIC_COOKIE >> 8) & 0xFF); + pRIPMSG->OPT[i++] = (uint8)(MAGIC_COOKIE & 0xFF); + + /* Option Request Param. */ + pRIPMSG->OPT[i++] = dhcpMessageType; + pRIPMSG->OPT[i++] = 0x01; + pRIPMSG->OPT[i++] = ((!msgtype) ? DHCP_RELEASE : DHCP_DECLINE); + + pRIPMSG->OPT[i++] = dhcpClientIdentifier; + pRIPMSG->OPT[i++] = 0x07; + pRIPMSG->OPT[i++] = 0x01; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[0]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[1]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[2]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[3]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[4]; + pRIPMSG->OPT[i++] = SRC_MAC_ADDR[5]; + + pRIPMSG->OPT[i++] = dhcpServerIdentifier; + pRIPMSG->OPT[i++] = 0x04; + pRIPMSG->OPT[i++] = DHCP_SIP[0]; + pRIPMSG->OPT[i++] = DHCP_SIP[1]; + pRIPMSG->OPT[i++] = DHCP_SIP[2]; + pRIPMSG->OPT[i++] = DHCP_SIP[3]; + + if(msgtype) + { + pRIPMSG->OPT[i++] = dhcpRequestedIPaddr; + pRIPMSG->OPT[i++] = 0x04; + pRIPMSG->OPT[i++] = GET_SIP[0]; + pRIPMSG->OPT[i++] = GET_SIP[1]; + pRIPMSG->OPT[i++] = GET_SIP[2]; + pRIPMSG->OPT[i++] = GET_SIP[3]; + #ifdef DHCP_DEBUG + //printf(" sent DHCP_DECLINE\r\n"); + #endif + } + #ifdef DHCP_DEBUG + else + { + printf(" sent DHCP_RELEASE\r\n"); + } + #endif + + pRIPMSG->OPT[i++] = endOption; + + + if(msgtype) memset(ip,0xFF,4); + else + memcpy(ip,DHCP_SIP,4); + // printf(" send dhcp decline\r\n"); + sendto(SOCK_DHCP, (uint8 *)pRIPMSG, sizeof(RIP_MSG), ip, DHCP_SERVER_PORT); +} + +/** +*@brief 解析获得的DHCP消息 +*@param length:解析消息长度 +*@return 0:解析失败 其他:解析成功 +*/ +uint8 parseDHCPMSG(uint16 length) +{ + uint8 svr_addr[6]; + uint16 svr_port; + uint16 len; + uint8 * p; + uint8 * e; + uint8 type; + uint8 opt_len = 0; + + len = recvfrom(SOCK_DHCP, (uint8 *)pRIPMSG, length, svr_addr, &svr_port); + + #ifdef DHCP_DEBUG + printf(" DHCP_SIP:%u.%u.%u.%u\r\n",DHCP_SIP[0],DHCP_SIP[1],DHCP_SIP[2],DHCP_SIP[3]); + printf(" DHCP_RIP:%u.%u.%u.%u\r\n",DHCP_REAL_SIP[0],DHCP_REAL_SIP[1],DHCP_REAL_SIP[2],DHCP_REAL_SIP[3]); + printf(" svr_addr:%u.%u.%u.%u\r\n",svr_addr[0],svr_addr[1],svr_addr[2],svr_addr[3]); + #endif + + if(pRIPMSG->op != DHCP_BOOTREPLY || svr_port != DHCP_SERVER_PORT) + { + #ifdef DHCP_DEBUG + printf(" DHCP : NO DHCP MSG\r\n"); + #endif + return 0; + } + if(memcmp(pRIPMSG->chaddr,SRC_MAC_ADDR,6) != 0 || pRIPMSG->xid != htonl(DHCP_XID)) + { + #ifdef DHCP_DEBUG + printf(" No My DHCP Message. This message is ignored.\r\n"); + printf(" \tSRC_MAC_ADDR(%02X.%02X.%02X.",SRC_MAC_ADDR[0],SRC_MAC_ADDR[1],SRC_MAC_ADDR[2]); + printf(" %02X.%02X.%02X)",SRC_MAC_ADDR[3],SRC_MAC_ADDR[4],SRC_MAC_ADDR[5]); + printf(" , pRIPMSG->chaddr(%02X.%02X.%02X.",(char)pRIPMSG->chaddr[0],(char)pRIPMSG->chaddr[1],(char)pRIPMSG->chaddr[2]); + printf(" %02X.%02X.%02X)",pRIPMSG->chaddr[3],pRIPMSG->chaddr[4],pRIPMSG->chaddr[5]); + printf(" \tpRIPMSG->xid(%08X), DHCP_XID(%08X)",pRIPMSG->xid,(DHCP_XID)); + printf(" \tpRIMPMSG->yiaddr:%d.%d.%d.%d\r\n",pRIPMSG->yiaddr[0],pRIPMSG->yiaddr[1],pRIPMSG->yiaddr[2],pRIPMSG->yiaddr[3]); + #endif + return 0; + } + + if( *((uint32*)DHCP_SIP) != 0x00000000 ) + { + if( *((uint32*)DHCP_REAL_SIP) != *((uint32*)svr_addr) && + *((uint32*)DHCP_SIP) != *((uint32*)svr_addr) ) + { + #ifdef DHCP_DEBUG + printf(" Another DHCP sever send a response message. This is ignored.\r\n"); + printf(" \tIP:%u.%u.%u.%u\r\n",svr_addr[0],svr_addr[1],svr_addr[2],svr_addr[3]); + #endif + return 0; + } + } + memcpy(GET_SIP,pRIPMSG->yiaddr,4); + + #ifdef DHCP_DEBUG + printf(" DHCP MSG received\r\n"); + printf(" yiaddr : %u.%u.%u.%u\r\n",GET_SIP[0],GET_SIP[1],GET_SIP[2],GET_SIP[3]); + #endif + type = 0; + p = (uint8 *)(&pRIPMSG->op); + p = p + 240; + e = p + (len - 240); + #ifdef DHCP_DEBUG + printf(" p : %08X e : %08X len : %d\r\n", (uint32)p, (uint32)e, len); + #endif + while ( p < e ) + { + switch ( *p++ ) + { + case endOption : + return type; + + case padOption : + break; + + case dhcpMessageType : + opt_len = *p++; + type = *p; + #ifdef DHCP_DEBUG + printf(" dhcpMessageType : %02X\r\n", type); + #endif + break; + + case subnetMask : + opt_len =* p++; + memcpy(GET_SN_MASK,p,4); + #ifdef DHCP_DEBUG + printf(" subnetMask : "); + printf(" %u.%u.%u.%u\r\n",GET_SN_MASK[0],GET_SN_MASK[1],GET_SN_MASK[2],GET_SN_MASK[3]); + #endif + break; + + case routersOnSubnet : + opt_len = *p++; + memcpy(GET_GW_IP,p,4); + #ifdef DHCP_DEBUG + printf(" routersOnSubnet : "); + printf(" %u.%u.%u.%u\r\n",GET_GW_IP[0],GET_GW_IP[1],GET_GW_IP[2],GET_GW_IP[3]); + #endif + break; + + case dns : + opt_len = *p++; + memcpy(GET_DNS_IP,p,4); + break; + + case dhcpIPaddrLeaseTime : + opt_len = *p++; + dhcp_lease_time = ntohl(*((uint32*)p)); + #ifdef DHCP_DEBUG + printf(" dhcpIPaddrLeaseTime : %d\r\n", dhcp_lease_time); + #endif + break; + + case dhcpServerIdentifier : + opt_len = *p++; + #ifdef DHCP_DEBUG + printf(" DHCP_SIP : %u.%u.%u.%u\r\n", DHCP_SIP[0], DHCP_SIP[1], DHCP_SIP[2], DHCP_SIP[3]); + #endif + if( *((uint32*)DHCP_SIP) == 0 || + *((uint32*)DHCP_REAL_SIP) == *((uint32*)svr_addr) || + *((uint32*)DHCP_SIP) == *((uint32*)svr_addr) ) + { + memcpy(DHCP_SIP,p,4); + memcpy(DHCP_REAL_SIP,svr_addr,4); // Copy the real ip address of my DHCP server + #ifdef DHCP_DEBUG + printf(" My dhcpServerIdentifier : "); + printf(" %u.%u.%u.%u\r\n", DHCP_SIP[0], DHCP_SIP[1], DHCP_SIP[2], DHCP_SIP[3]); + printf(" My DHCP server real IP address : "); + printf(" %u.%u.%u.%u\r\n", DHCP_REAL_SIP[0], DHCP_REAL_SIP[1], DHCP_REAL_SIP[2], DHCP_REAL_SIP[3]); + #endif + } + else + { + #ifdef DHCP_DEBUG + printf(" Another dhcpServerIdentifier : \r\n"); + printf(" \tMY(%u.%u.%u.%u) ", DHCP_SIP[0], DHCP_SIP[1], DHCP_SIP[2], DHCP_SIP[3]); + printf(" Another(%u.%u.%u.%u)\r\n", svr_addr[0], svr_addr[1], svr_addr[2], svr_addr[3]); + #endif + } + break; + + default : + opt_len = *p++; + #ifdef DHCP_DEBUG + printf(" opt_len : %u\r\n", opt_len); + #endif + break; + } // switch + p+=opt_len; + } // while + return 0; +} + +/** +*@brief 检查DHCP状态 +*@param s: socket数 +*@return 返回得到的DHCP状态 +* DHCP_RET_NONE: 未获取到IP地址 +* DHCP_RET_TIMEOUT:超时 +* DHCP_RET_UPDATE: 获取成功 +* DHCP_RET_CONFLICT:IP地址冲突 +*/ +uint8 check_DHCP_state(SOCKET s) +{ + uint16 len; /*定义一个表示接收数据大小变量*/ + uint8 type; /*定义一个表示接收封包类型变量*/ + + type = 0; + if(getSn_SR(s)!=SOCK_CLOSED) /*socket处于打开状态*/ + { + if ((len = getSn_RX_RSR(s)) > 0) /*接收到数据*/ + { + type = parseDHCPMSG(len); /*解析收到的封包类型*/ + } + } + else /*socket处于关闭状态,重新初始化socket*/ + { + if(dhcp_state == STATE_DHCP_READY) + { + //init_dhcp_client(); + #ifdef DHCP_DEBUG + printf(" state : STATE_DHCP_READY\r\n"); + #endif + } + if(!socket(SOCK_DHCP,Sn_MR_UDP,DHCP_CLIENT_PORT,0x00))/*初始化socket和端口*/ + { + #ifdef DHCP_DEBUG + printf(" Fail to create the DHCPC_SOCK(%u)\r\n",SOCK_DHCP); + #endif + return DHCP_RET_ERR; /*socket初始化错误*/ + } + } + switch ( dhcp_state ) + { + case STATE_DHCP_READY: /*DHCP初始化状态*/ + DHCP_timeout = 0; /*DHCP超时标志设置为1*/ + reset_DHCP_time(); /*复位超时时间*/ + send_DHCP_DISCOVER(); /*发送DISCOVER包*/ + + DHCP_timer = 0; /*set_timer0(DHCP_timer_handler); */ + dhcp_state = STATE_DHCP_DISCOVER; /*DHCP的DISCOVER状态*/ + break; + + case STATE_DHCP_DISCOVER: + if (type == DHCP_OFFER) + { + reset_DHCP_time(); /*复位超时时间*/ + send_DHCP_REQUEST(); /*发送REQUEST包*/ + dhcp_state = STATE_DHCP_REQUEST; + #ifdef DHCP_DEBUG + printf(" state : STATE_DHCP_REQUEST\r\n"); + #endif + } + else + check_DHCP_Timeout(); /*检查是否超时*/ + break; + + case STATE_DHCP_REQUEST : /*DHCP的REQUEST状态*/ + if (type == DHCP_ACK) /*接收到DHCP服务器回应的off封包*/ + { + reset_DHCP_time(); + if (check_leasedIP()) + { + #ifdef DHCP_DEBUG + printf(" state : STATE_DHCP_LEASED\r\n"); + #endif + dhcp_state = STATE_DHCP_LEASED; + return DHCP_RET_UPDATE; + } + else + { + #ifdef DHCP_DEBUG + printf(" state : STATE_DHCP_DISCOVER\r\n"); + #endif + dhcp_state = STATE_DHCP_DISCOVER; + return DHCP_RET_CONFLICT; + } + } + else if (type == DHCP_NAK) + { + reset_DHCP_time(); /*复位超时时间*/ + dhcp_state = STATE_DHCP_DISCOVER; + #ifdef DHCP_DEBUG + printf(" state : STATE_DHCP_DISCOVER\r\n"); + #endif + } + else + check_DHCP_Timeout(); /*检查是否超时*/ + break; + + case STATE_DHCP_LEASED : + if ((dhcp_lease_time != 0xffffffff) && (dhcp_time>(dhcp_lease_time/2))) + { + type = 0; + memcpy(OLD_SIP,GET_SIP,4); + DHCP_XID++; + send_DHCP_REQUEST(); + dhcp_state = STATE_DHCP_REREQUEST; + #ifdef DHCP_DEBUG + printf(" state : STATE_DHCP_REREQUEST\r\n"); + #endif + reset_DHCP_time(); + } + break; + case STATE_DHCP_REREQUEST : + if (type == DHCP_ACK) + { + if(memcmp(OLD_SIP,GET_SIP,4)!=0) + { + #ifdef DHCP_DEBUG + printf(" The IP address from the DHCP server is updated.\r\n"); + printf(" OLD_SIP=%u.%u.%u.%u",OLD_SIP[0],OLD_SIP[1],OLD_SIP[2],OLD_SIP[3]); + printf(" GET_SIP=%u.%u.%u.%u\r\n",GET_SIP[0],GET_SIP[1],GET_SIP[2],GET_SIP[3]); + #endif + return DHCP_RET_UPDATE; + } + #ifdef DHCP_DEBUG + else + { + printf(" state : STATE_DHCP_LEASED : same IP\r\n"); + } + #endif + reset_DHCP_time(); + dhcp_state = STATE_DHCP_LEASED; + } + else if (type == DHCP_NAK) + { + reset_DHCP_time(); + dhcp_state = STATE_DHCP_DISCOVER; + #ifdef DHCP_DEBUG + printf(" state : STATE_DHCP_DISCOVER\r\n"); + #endif + } + else + check_DHCP_Timeout(); + break; + + default : + dhcp_state = STATE_DHCP_READY; + break; + } + if (DHCP_timeout == 1) + { + //kill_timer0(DHCP_timer); + dhcp_state = STATE_DHCP_READY; + return DHCP_RET_TIMEOUT; + } + return DHCP_RET_NONE; +} + +/** +*@brief 检查DHCP请求释放超时 +*@param 无 +*@return 无 +*/ +void check_DHCP_Timeout(void) +{ + if(dhcp_retry_count < MAX_DHCP_RETRY) + { + if(dhcp_time > next_dhcp_time) + { + dhcp_time = 0; + next_dhcp_time = dhcp_time + DHCP_WAIT_TIME; + dhcp_retry_count++; + switch ( dhcp_state ) + { + case STATE_DHCP_DISCOVER : + #ifdef DHCP_DEBUG + printf(" <> state : STATE_DHCP_DISCOVER\r\n"); + #endif + send_DHCP_DISCOVER(); + break; + + case STATE_DHCP_REQUEST : + #ifdef DHCP_DEBUG + printf(" <> state : STATE_DHCP_REQUEST\r\n"); + #endif + send_DHCP_REQUEST(); + break; + + case STATE_DHCP_REREQUEST : + #ifdef DHCP_DEBUG + printf(" <> state : STATE_DHCP_REREQUEST\r\n"); + #endif + send_DHCP_REQUEST(); + break; + + default : + break; + } + } + } + else + { + reset_DHCP_time(); + DHCP_timeout = 1; + + send_DHCP_DISCOVER(); + dhcp_state = STATE_DHCP_DISCOVER; + #ifdef DHCP_DEBUG + printf(" timeout : state : STATE_DHCP_DISCOVER\r\n"); + #endif + } +} + +/** +*@brief 检查获取的IP是否冲突 +*@param 无 +*@return 无 +*/ +uint8 check_leasedIP(void) +{ + #ifdef DHCP_DEBUG + printf(" \r\n"); + #endif + send_DHCP_RELEASE_DECLINE(1); + return 0; + } + #ifdef DHCP_DEBUG + printf(" No Conflict>\r\n"); + #endif + return 1; +} + +/** +*@brief DHCP 定时器操作 +*@param 无 +*@return 无 +*/ +void DHCP_timer_handler(void) +{ + if(dhcp_tick_cnt++ > 1000) + { + dhcp_tick_cnt = 0; + dhcp_time++; + } +} + +/** +*@brief 初始化DHCP客户端 +*@param 无 +*@return 无 +*/ +void init_dhcp_client(void) +{ + uint8 ip_0[4]={0,}; + DHCP_XID = 0x12345678; + memset(OLD_SIP,0,sizeof(OLD_SIP)); + memset(DHCP_SIP,0,sizeof(DHCP_SIP)); + memset(DHCP_REAL_SIP,0,sizeof(GET_SN_MASK)); + + /*clear ip setted flag */ + iinchip_init(); + setSUBR(ip_0); + setGAR(ip_0); + setSIPR(ip_0); + printf(" mac=%02x:%02x:%02x:%02x:%02x:%02x\r\n",SRC_MAC_ADDR[0],SRC_MAC_ADDR[1],SRC_MAC_ADDR[2],SRC_MAC_ADDR[3],SRC_MAC_ADDR[4],SRC_MAC_ADDR[5]); + + dhcp_state = STATE_DHCP_READY; + #ifdef DHCP_DEBUG + printf(" init_dhcp_client:%u\r\n",SOCK_DHCP); + #endif +} +/** +*@brief 执行DHCP Client +*@param 无 +*@return 无 +*/ +void do_dhcp(void) +{ + uint8 dhcpret=0; + ip_from=IP_FROM_DHCP; /*IP配置方法选择为DHCP*/ + dhcp_timer_init(); /*初始化DHCP定时器*/ + if(Conflict_flag == 1) + { + init_dhcp_client(); /*初始化DHCP客户端*/ + Conflict_flag =0; + } + + dhcpret = check_DHCP_state(SOCK_DHCP); /*获取DHCP服务状态*/ + + switch(dhcpret) + { + case DHCP_RET_NONE: /*IP地址获取不成功*/ + break; + + case DHCP_RET_TIMEOUT: /*IP地址获取超时*/ + break; + + case DHCP_RET_UPDATE: /*成功获取到IP地址*/ + dhcp_ok=1; + set_w5500_ip(); /*将获取到的IP地址写入W5500寄存器*/ + printf(" 已从DHCP服务器成功获得IP地址\r\n"); + + break; + + case DHCP_RET_CONFLICT: /*IP地址获取冲突*/ + printf(" 从DHCP获取IP地址失败\r\n"); + dhcp_state = STATE_DHCP_READY; + printf(" 重试中\r\n"); + dhcp_ok=0; + break; + + default: + break; + } +} diff --git b/Base_core/Ethernet/Internet/dhcp.h a/Base_core/Ethernet/Internet/dhcp.h new file mode 100644 index 0000000..e783ae6 --- /dev/null +++ a/Base_core/Ethernet/Internet/dhcp.h @@ -0,0 +1,169 @@ +#ifndef _DHCP_H_ +#define _DHCP_H_ +#include "stdio.h" + +#define DEVICE_ID "W5500" +typedef struct _DHCP_GET +{ + uint8 mac[6]; + uint8 lip[4]; + uint8 sub[4]; + uint8 gw[4]; + uint8 dns[4]; +}DHCP_Get; + +extern uint32 dhcp_time; +extern DHCP_Get DHCP_GET; +#define EXTERN_DHCP_MAC DHCP_GET.mac +#define EXTERN_DHCP_SN DHCP_GET.sub +#define EXTERN_DHCP_GW DHCP_GET.gw +#define EXTERN_DHCP_DNS DHCP_GET.dns +#define EXTERN_DHCP_NAME "iweb"//ConfigMsg.domain +#define EXTERN_DHCP_SIP DHCP_GET.lip + +#define DHCP_RET_NONE 0 +#define DHCP_RET_ERR 1 +#define DHCP_RET_TIMEOUT 2 +#define DHCP_RET_UPDATE 3 +#define DHCP_RET_CONFLICT 4 + + + + +/* DHCP state machine. */ +#define STATE_DHCP_READY 0 +#define STATE_DHCP_DISCOVER 1 +#define STATE_DHCP_REQUEST 2 +#define STATE_DHCP_LEASED 3 +#define STATE_DHCP_REREQUEST 4 +#define STATE_DHCP_RELEASE 5 + +#define MAX_DHCP_RETRY 3 +#define DHCP_WAIT_TIME 5 + +#define DHCP_FLAGSBROADCAST 0x8000 + +/* UDP port numbers for DHCP */ +#define DHCP_SERVER_PORT 67 /* from server to client */ +#define DHCP_CLIENT_PORT 68 /* from client to server */ + +/* DHCP message OP code */ +#define DHCP_BOOTREQUEST 1 +#define DHCP_BOOTREPLY 2 + +/* DHCP message type */ +#define DHCP_DISCOVER 1 +#define DHCP_OFFER 2 +#define DHCP_REQUEST 3 +#define DHCP_DECLINE 4 +#define DHCP_ACK 5 +#define DHCP_NAK 6 +#define DHCP_RELEASE 7 +#define DHCP_INFORM 8 + +#define DHCP_HTYPE10MB 1 +#define DHCP_HTYPE100MB 2 + +#define DHCP_HLENETHERNET 6 +#define DHCP_HOPS 0 +#define DHCP_SECS 0 + +#define MAGIC_COOKIE 0x63825363 +#define DEFAULT_XID 0x12345678 + +#define DEFAULT_LEASETIME 0xffffffff /* infinite lease time */ + +/* DHCP option and value (cf. RFC1533) */ +enum +{ + padOption = 0, + subnetMask = 1, + timerOffset = 2, + routersOnSubnet = 3, + timeServer = 4, + nameServer = 5, + dns = 6, + logServer = 7, + cookieServer = 8, + lprServer = 9, + impressServer = 10, + resourceLocationServer = 11, + hostName = 12, + bootFileSize = 13, + meritDumpFile = 14, + domainName = 15, + swapServer = 16, + rootPath = 17, + extentionsPath = 18, + IPforwarding = 19, + nonLocalSourceRouting = 20, + policyFilter = 21, + maxDgramReasmSize = 22, + defaultIPTTL = 23, + pathMTUagingTimeout = 24, + pathMTUplateauTable = 25, + ifMTU = 26, + allSubnetsLocal = 27, + broadcastAddr = 28, + performMaskDiscovery = 29, + maskSupplier = 30, + performRouterDiscovery = 31, + routerSolicitationAddr = 32, + staticRoute = 33, + trailerEncapsulation = 34, + arpCacheTimeout = 35, + ethernetEncapsulation = 36, + tcpDefaultTTL = 37, + tcpKeepaliveInterval = 38, + tcpKeepaliveGarbage = 39, + nisDomainName = 40, + nisServers = 41, + ntpServers = 42, + vendorSpecificInfo = 43, + netBIOSnameServer = 44, + netBIOSdgramDistServer = 45, + netBIOSnodeType = 46, + netBIOSscope = 47, + xFontServer = 48, + xDisplayManager = 49, + dhcpRequestedIPaddr = 50, + dhcpIPaddrLeaseTime = 51, + dhcpOptionOverload = 52, + dhcpMessageType = 53, + dhcpServerIdentifier = 54, + dhcpParamRequest = 55, + dhcpMsg = 56, + dhcpMaxMsgSize = 57, + dhcpT1value = 58, + dhcpT2value = 59, + dhcpClassIdentifier = 60, + dhcpClientIdentifier = 61, + endOption = 255 +}; + +typedef struct _RIP_MSG +{ + uint8 op; + uint8 htype; + uint8 hlen; + uint8 hops; + uint32 xid; + uint16 secs; + uint16 flags; + uint8 ciaddr[4]; + uint8 yiaddr[4]; + uint8 siaddr[4]; + uint8 giaddr[4]; + uint8 chaddr[16]; + uint8 sname[64]; + uint8 file[128]; + uint8 OPT[312]; +}RIP_MSG; + +#define MAX_DHCP_OPT 16 + +void init_dhcp_client(void); + +uint8 check_DHCP_state(SOCKET s); // Check the DHCP state +void do_dhcp(void); +#endif /* _DHCP_H_ */ diff --git b/Base_core/Ethernet/Internet/tcp_demo.c a/Base_core/Ethernet/Internet/tcp_demo.c new file mode 100644 index 0000000..b560f07 --- /dev/null +++ a/Base_core/Ethernet/Internet/tcp_demo.c @@ -0,0 +1,150 @@ +/** +****************************************************************************** +* @file tcp_demo.c +* @version V1.2 +* @date 2017-11-01 +* @brief TCP 婕旂ず鍑芥暟 +* +* @company 娣卞湷鐐滀笘绉戞妧鏈夐檺鍏徃 +* @information WIZnet W5500瀹樻柟浠g悊鍟嗭紝鍏ㄧ▼鎶鏈敮鎸侊紝浠锋牸缁濆浼樺娍锛 +* @website www.wisioe.com +* @forum www.w5500.cn +* @qqGroup 383035001 +****************************************************************************** +*/ + +#include +#include +#include "tcp_demo.h" +#include "W5500_conf.h" +#include "w5500.h" +#include "socket.h" + +#include "base_core_user.h" +#include "function_interface.h" +#include "platform_interface.h" + + +uint8 buff[2048]; /*瀹氫箟涓涓2KB鐨勭紦瀛*/ + + +unsigned char tcp_send_data_to_pc(unsigned char *buff,unsigned short len) +{ + return send(SOCK_TCPS,buff,len); +} + + +/** +*@brief TCP Server鍥炵幆婕旂ず鍑芥暟銆 +*@param 鏃 +*@return 鏃 +*/ +unsigned char test_stat; +void do_tcp_server(void) +{ + uint16 len=0; + unsigned char sr_stat; + + if( !function.TCPIP__SW) return ; + platform.disable_interrupt(); + + sr_stat =getSn_SR(SOCK_TCPS); + + /*20200327 瑙e喅鎷旀彃缃戠嚎鍚庝笉鑳藉啀杩炴帴鐨勯棶棰: + a,缃戠嚎鎷斿嚭鍚庨噸鏂板垵濮嬪寲socket; + b,鍜宻dk杩炴帴鏃舵湁鏃朵細杩涘叆鍒癝OCK_SYNRECV鐘舵佸鑷存棤娉曡繛鎺ワ紝why? 閲嶆柊鍒濆鍖杝ocket锛*/ + if( ( ((0x01&getPHYStatus() )==0) &&(sr_stat !=SOCK_LISTEN) ) || (sr_stat ==SOCK_SYNRECV) ){ + socket(SOCK_TCPS ,Sn_MR_TCP,local_port,Sn_MR_ND); /*鎵撳紑socket*/ + listen(SOCK_TCPS); /*socket寤虹珛鐩戝惉*/ + } + + switch(sr_stat ) /*鑾峰彇socket鐨勭姸鎬*/ + { + case SOCK_CLOSED: /*socket澶勪簬鍏抽棴鐘舵*/ + socket(SOCK_TCPS ,Sn_MR_TCP,local_port,Sn_MR_ND); /*鎵撳紑socket*/ + break; + + case SOCK_INIT: /*socket宸插垵濮嬪寲鐘舵*/ + listen(SOCK_TCPS); /*socket寤虹珛鐩戝惉*/ + break; + + case SOCK_ESTABLISHED: /*socket澶勪簬杩炴帴寤虹珛鐘舵*/ + + if(getSn_IR(SOCK_TCPS) & Sn_IR_CON) + { + setSn_IR(SOCK_TCPS, Sn_IR_CON); /*娓呴櫎鎺ユ敹涓柇鏍囧織浣*/ + } + len=getSn_RX_RSR(SOCK_TCPS); /*瀹氫箟len涓哄凡鎺ユ敹鏁版嵁鐨勯暱搴*/ +// if(len>0) +// { +// recv(SOCK_TCPS,buff,len); /*鎺ユ敹鏉ヨ嚜Client鐨勬暟鎹*/ +// buff[len]=0x00; /*娣诲姞瀛楃涓茬粨鏉熺*/ +// //printf("%s\r\n",buff); +// send(SOCK_TCPS,buff,len); /*鍚慍lient鍙戦佹暟鎹*/ +// } + + if(len>0) + { + recv(SOCK_TCPS,buff,len); /*鎺ユ敹鏉ヨ嚜Client鐨勬暟鎹*/ + if( (buff[0] ==0xf5)&&(buff[1] ==0xaa)&&(buff[2] ==0xaa) ){ + void set_pc_communication_type(unsigned char type); + set_pc_communication_type(1); + base_core.sdk_data_fifo_in(buff+3); + } + } + break; + + case SOCK_SYNRECV: + break; + + case SOCK_CLOSE_WAIT: /*socket澶勪簬绛夊緟鍏抽棴鐘舵*/ + close(SOCK_TCPS); + break; + } + + platform.enable_interrupt(); +} + +/** +*@brief TCP Client鍥炵幆婕旂ず鍑芥暟銆 +*@param 鏃 +*@return 鏃 +*/ +void do_tcp_client(void) +{ + uint16 len=0; + + switch(getSn_SR(SOCK_TCPC)) /*鑾峰彇socket鐨勭姸鎬*/ + { + case SOCK_CLOSED: /*socket澶勪簬鍏抽棴鐘舵*/ + //printf("鍒濆鍖朶r\n"); + socket(SOCK_TCPC,Sn_MR_TCP,local_port,Sn_MR_ND); + break; + + case SOCK_INIT: /*socket澶勪簬鍒濆鍖栫姸鎬*/ + //printf("杩炴帴\r\n"); + connect(SOCK_TCPC,remote_ip,remote_port); /*socket杩炴帴鏈嶅姟鍣*/ + break; + + case SOCK_ESTABLISHED: /*socket澶勪簬杩炴帴寤虹珛鐘舵*/ + if(getSn_IR(SOCK_TCPC) & Sn_IR_CON) + { + setSn_IR(SOCK_TCPC, Sn_IR_CON); /*娓呴櫎鎺ユ敹涓柇鏍囧織浣*/ + } + + len=getSn_RX_RSR(SOCK_TCPC); /*瀹氫箟len涓哄凡鎺ユ敹鏁版嵁鐨勯暱搴*/ + if(len>0) + { + recv(SOCK_TCPC,buff,len); /*鎺ユ敹鏉ヨ嚜Server鐨勬暟鎹*/ + buff[len]=0x00; /*娣诲姞瀛楃涓茬粨鏉熺*/ + //printf("%s\r\n",buff); + send(SOCK_TCPC,buff,len); /*鍚慡erver鍙戦佹暟鎹*/ + } + break; + + case SOCK_CLOSE_WAIT: /*socket澶勪簬绛夊緟鍏抽棴鐘舵*/ + //printf("鍏抽棴\r\n"); + close(SOCK_TCPC); + break; + } +} diff --git b/Base_core/Ethernet/Internet/tcp_demo.h a/Base_core/Ethernet/Internet/tcp_demo.h new file mode 100644 index 0000000..a86ece8 --- /dev/null +++ a/Base_core/Ethernet/Internet/tcp_demo.h @@ -0,0 +1,8 @@ +#ifndef __TCP_DEMO_H +#define __TCP_DEMO_H +#include "types.h" + +extern uint16 W5500_tcp_server_port; +void do_tcp_server(void);//TCP Server回环演示函数 +void do_tcp_client(void);//TCP Clinet回环演示函数 +#endif diff --git b/Base_core/Ethernet/W5500/socket.c a/Base_core/Ethernet/W5500/socket.c new file mode 100644 index 0000000..37221a2 --- /dev/null +++ a/Base_core/Ethernet/W5500/socket.c @@ -0,0 +1,500 @@ +/** +****************************************************************************** +* @file socket.c +* @version V1.2 +* @date 2017-11-01 +* @brief socket编程相关函数 +* +* @company 深圳炜世科技有限公司 +* @information WIZnet W5500官方代理商,全程技术支持,价格绝对优势! +* @website www.wisioe.com +* @forum www.w5500.cn +* @qqGroup 383035001 +****************************************************************************** +*/ + +#include "socket.h" +#include "W5500_conf.h" +#include "stdio.h" +#include "w5500.h" + +/** +*@brief This Socket function initialize the channel in perticular mode, +* and set the port and wait for W5200 done it. +*@param s: socket number. +*@param protocol: The socket to chose. +*@param port:The port to bind. +*@param flag: Set some bit of MR,such as **< No Delayed Ack(TCP) flag. +*@return 1 for sucess else 0. +*/ +uint8 socket(SOCKET s, uint8 protocol, uint16 port, uint8 flag) +{ + uint8 ret; + if ( + ((protocol&0x0F) == Sn_MR_TCP) || + ((protocol&0x0F) == Sn_MR_UDP) || + ((protocol&0x0F) == Sn_MR_IPRAW) || + ((protocol&0x0F) == Sn_MR_MACRAW) || + ((protocol&0x0F) == Sn_MR_PPPOE) + ) + { + close(s); + IINCHIP_WRITE(Sn_MR(s) ,protocol | flag); + if (port != 0) { + IINCHIP_WRITE( Sn_PORT0(s) ,(uint8)((port & 0xff00) >> 8)); + IINCHIP_WRITE( Sn_PORT1(s) ,(uint8)(port & 0x00ff)); + } else { + local_port++; // if don't set the source port, set local_port number. + IINCHIP_WRITE(Sn_PORT0(s) ,(uint8)((local_port & 0xff00) >> 8)); + IINCHIP_WRITE(Sn_PORT1(s) ,(uint8)(local_port & 0x00ff)); + } + IINCHIP_WRITE( Sn_CR(s) ,Sn_CR_OPEN); // run sockinit Sn_CR + + /* wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s)) ) + ; + /* ------- */ + ret = 1; + } + else + { + ret = 0; + } + return ret; +} + +/** +*@brief This function close the socket and parameter is "s" which represent the socket number +*@param s: socket number. +*@return None +*/ +void close(SOCKET s) +{ + IINCHIP_WRITE( Sn_CR(s) ,Sn_CR_CLOSE); + + /* wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s) ) ) + ; + /* ------- */ + + IINCHIP_WRITE( Sn_IR(s) , 0xFF); /* all clear */ +} + +/** +*@brief This function established the connection for the channel in passive (server) mode. +* This function waits for the request from the peer. +*@param s: socket number. +*@return 1 for success else 0. +*/ +uint8 listen(SOCKET s) +{ + uint8 ret; + if (IINCHIP_READ( Sn_SR(s) ) == SOCK_INIT) + { + IINCHIP_WRITE( Sn_CR(s) ,Sn_CR_LISTEN); + /* wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s) ) ) + ; + /* ------- */ + ret = 1; + } + else + { + ret = 0; + } + return ret; +} + +/** +*@brief This function established the connection for the channel in Active (client) mode. +* This function waits for the untill the connection is established. +*@param s: socket number. +*@param addr: The server IP address to connect +*@param port: The server IP port to connect +*@return 1 for success else 0. +*/ +uint8 connect(SOCKET s, uint8 * addr, uint16 port) +{ + uint8 ret; + if( + ((addr[0] == 0xFF) && (addr[1] == 0xFF) && (addr[2] == 0xFF) && (addr[3] == 0xFF)) || + ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || + (port == 0x00) + ) + { + ret = 0; + } + else + { + ret = 1; + // set destination IP + IINCHIP_WRITE( Sn_DIPR0(s), addr[0]); + IINCHIP_WRITE( Sn_DIPR1(s), addr[1]); + IINCHIP_WRITE( Sn_DIPR2(s), addr[2]); + IINCHIP_WRITE( Sn_DIPR3(s), addr[3]); + IINCHIP_WRITE( Sn_DPORT0(s), (uint8)((port & 0xff00) >> 8)); + IINCHIP_WRITE( Sn_DPORT1(s), (uint8)(port & 0x00ff)); + IINCHIP_WRITE( Sn_CR(s) ,Sn_CR_CONNECT); + /* wait for completion */ + while ( IINCHIP_READ(Sn_CR(s) ) ) ; + + while ( IINCHIP_READ(Sn_SR(s)) != SOCK_SYNSENT ) + { + if(IINCHIP_READ(Sn_SR(s)) == SOCK_ESTABLISHED) + { + break; + } + if (getSn_IR(s) & Sn_IR_TIMEOUT) + { + IINCHIP_WRITE(Sn_IR(s), (Sn_IR_TIMEOUT)); // clear TIMEOUT Interrupt + ret = 0; + break; + } + } + } + return ret; +} + +/** +*@brief This function used for disconnect the socket s +*@param s: socket number. +*@return 1 for success else 0. +*/ +void disconnect(SOCKET s) +{ + IINCHIP_WRITE( Sn_CR(s) ,Sn_CR_DISCON); + + /* wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s) ) ) + ; + /* ------- */ +} + +/** +*@brief This function used to send the data in TCP mode +*@param s: socket number. +*@param buf: data buffer to send. +*@param len: data length. +*@return 1 for success else 0. +*/ +uint16 send(SOCKET s, const uint8 * buf, uint16 len) +{ + uint8 status=0; + uint16 ret=0; + uint16 freesize=0; + + if (len > getIINCHIP_TxMAX(s))ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size. + else ret = len; + + // if freebuf is available, start. + do + { + freesize = getSn_TX_FSR(s); + status = IINCHIP_READ(Sn_SR(s)); + if ((status != SOCK_ESTABLISHED) && (status != SOCK_CLOSE_WAIT)) + { + ret = 0; + break; + } + } while (freesize < ret); + + // copy data + send_data_processing(s, (uint8 *)buf, ret); + IINCHIP_WRITE( Sn_CR(s) ,Sn_CR_SEND); + + /* wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s) ) ); + + while ( (IINCHIP_READ(Sn_IR(s) ) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) + { + status = IINCHIP_READ(Sn_SR(s)); + if ((status != SOCK_ESTABLISHED) && (status != SOCK_CLOSE_WAIT) ) + { + //printf(" SEND_OK Problem!!\r\n"); + close(s); + return 0; + } + } + IINCHIP_WRITE( Sn_IR(s) , Sn_IR_SEND_OK); + + #ifdef __DEF_IINCHIP_INT__ + putISR(s, getISR(s) & (~Sn_IR_SEND_OK)); + #else + IINCHIP_WRITE( Sn_IR(s) , Sn_IR_SEND_OK); + #endif + return ret; +} + +/** +*@brief This function is an application I/F function which is used to receive the data in TCP mode. +* It continues to wait for data as much as the application wants to receive. +*@param s: socket number. +*@param buf: data buffer to receive. +*@param len: data length. +*@return received data size for success else 0. +*/ +uint16 recv(SOCKET s, uint8 * buf, uint16 len) +{ + uint16 ret=0; + if ( len > 0 ) + { + recv_data_processing(s, buf, len); + IINCHIP_WRITE( Sn_CR(s) ,Sn_CR_RECV); + /* wait to process the command... */ + while( IINCHIP_READ(Sn_CR(s) )); + /* ------- */ + ret = len; + } + return ret; +} + +/** +*@brief This function is an application I/F function which is used to send the data for other then TCP mode. +* Unlike TCP transmission, The peer's destination address and the port is needed. +*@param s: socket number. +*@param buf: data buffer to send. +*@param len: data length. +*@param addr: IP address to send. +*@param port: IP port to send. +*@return This function return send data size for success else 0. +*/ +uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port) +{ + uint16 ret=0; + + if (len > getIINCHIP_TxMAX(s)) + ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size. + else ret = len; + + if( ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || ((port == 0x00)) )//||(ret == 0) ) + { + /* added return value */ + ret = 0; + } + else + { + IINCHIP_WRITE( Sn_DIPR0(s), addr[0]); + IINCHIP_WRITE( Sn_DIPR1(s), addr[1]); + IINCHIP_WRITE( Sn_DIPR2(s), addr[2]); + IINCHIP_WRITE( Sn_DIPR3(s), addr[3]); + IINCHIP_WRITE( Sn_DPORT0(s),(uint8)((port & 0xff00) >> 8)); + IINCHIP_WRITE( Sn_DPORT1(s),(uint8)(port & 0x00ff)); + // copy data + send_data_processing(s, (uint8 *)buf, ret); + IINCHIP_WRITE( Sn_CR(s) ,Sn_CR_SEND); + /* wait to process the command... */ + while( IINCHIP_READ( Sn_CR(s) ) ) + ; + /* ------- */ + while( (IINCHIP_READ( Sn_IR(s) ) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) + { + if (IINCHIP_READ( Sn_IR(s) ) & Sn_IR_TIMEOUT) + { + /* clear interrupt */ + IINCHIP_WRITE( Sn_IR(s) , (Sn_IR_SEND_OK | Sn_IR_TIMEOUT)); /* clear SEND_OK & TIMEOUT */ + return 0; + } + } + IINCHIP_WRITE( Sn_IR(s) , Sn_IR_SEND_OK); + } + return ret; +} + +/** +*@brief This function is an application I/F function which is used to receive the data in other then +* TCP mode. This function is used to receive UDP, IP_RAW and MAC_RAW mode, and handle the header as well. +*@param s: socket number. +*@param buf: data buffer to receive. +*@param len: data length. +*@param addr: IP address to receive. +*@param port: IP port to receive. +*@return This function return received data size for success else 0. +*/ +uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port) +{ + uint8 head[8]; + uint16 data_len=0; + uint16 ptr=0; + uint32 addrbsb =0; + if ( len > 0 ) + { + ptr = IINCHIP_READ(Sn_RX_RD0(s) ); + ptr = ((ptr & 0x00ff) << 8) + IINCHIP_READ(Sn_RX_RD1(s)); + addrbsb = (uint32)(ptr<<8) + (s<<5) + 0x18; + + switch (IINCHIP_READ(Sn_MR(s) ) & 0x07) + { + case Sn_MR_UDP : + wiz_read_buf(addrbsb, head, 0x08); + ptr += 8; + // read peer's IP address, port number. + addr[0] = head[0]; + addr[1] = head[1]; + addr[2] = head[2]; + addr[3] = head[3]; + *port = head[4]; + *port = (*port << 8) + head[5]; + data_len = head[6]; + data_len = (data_len << 8) + head[7]; + + addrbsb = (uint32)(ptr<<8) + (s<<5) + 0x18; + wiz_read_buf(addrbsb, buf, data_len); + ptr += data_len; + + IINCHIP_WRITE( Sn_RX_RD0(s), (uint8)((ptr & 0xff00) >> 8)); + IINCHIP_WRITE( Sn_RX_RD1(s), (uint8)(ptr & 0x00ff)); + break; + + case Sn_MR_IPRAW : + // printf(" \r\n Sn_MR_IPRAW \r\n"); + wiz_read_buf(addrbsb, head, 0x06); + + ptr += 6; + addr[0] = head[0]; + addr[1] = head[1]; + addr[2] = head[2]; + addr[3] = head[3]; + data_len = head[4]; + data_len = (data_len << 8) + head[5]; + + addrbsb = (uint32)(ptr<<8) + (s<<5) + 0x18; + + // printf(" data:%d \r\n",data_len); + wiz_read_buf(addrbsb, buf, data_len); + + ptr += data_len; + + IINCHIP_WRITE( Sn_RX_RD0(s), (uint8)((ptr & 0xff00) >> 8)); + IINCHIP_WRITE( Sn_RX_RD1(s), (uint8)(ptr & 0x00ff)); + + break; + + case Sn_MR_MACRAW : + // printf(" \r\n Sn_MR_MCRAW \r\n"); + wiz_read_buf(addrbsb, head, 0x02); + ptr+=2; + data_len = head[0]; + data_len = (data_len<<8) + head[1] - 2; + if(data_len > 1514) + { + //printf(" data_len over 1514\r\n"); + while(1) + ; + } + + addrbsb = (uint32)(ptr<<8) + (s<<5) + 0x18; + wiz_read_buf(addrbsb, buf, data_len); + ptr += data_len; + + IINCHIP_WRITE( Sn_RX_RD0(s), (uint8)((ptr & 0xff00) >> 8)); + IINCHIP_WRITE( Sn_RX_RD1(s), (uint8)(ptr & 0x00ff)); + break; + + default : + break; + } + IINCHIP_WRITE( Sn_CR(s) ,Sn_CR_RECV); + + /* wait to process the command... */ + while( IINCHIP_READ( Sn_CR(s)) ) + ; + /* ------- */ + } + return data_len; +} + +#ifdef __MACRAW__ +/** +*@brief OPen the 0-th socket with MACRAW mode +*@param None +*@return None +*/ +void macraw_open(void) +{ + uint8 sock_num=0; + uint16 dummyPort = 0; + uint8 mFlag = 0; + sock_num = 0; + close(sock_num); // Close the 0-th socket + socket(sock_num, Sn_MR_MACRAW, dummyPort,mFlag); +} + +/** +*@brief OPen the 0-th socket with MACRAW mode +*@param buf: data buffer to send. +*@param len: data length. +*@return This function return sended data size for success else 0. +*/ +uint16 macraw_send( const uint8 * buf, uint16 len ) +{ + uint16 ret=0; + uint8 sock_num; + sock_num =0; + + + if (len > getIINCHIP_TxMAX(sock_num)) ret = getIINCHIP_TxMAX(sock_num); // check size not to exceed MAX size. + else ret = len; + + send_data_processing(sock_num, (uint8 *)buf, len); + + //W5500 SEND COMMAND + IINCHIP_WRITE(Sn_CR(sock_num),Sn_CR_SEND); + while( IINCHIP_READ(Sn_CR(sock_num)) ) + ; + while ( (IINCHIP_READ(Sn_IR(sock_num)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK ) + ; + IINCHIP_WRITE(Sn_IR(sock_num), Sn_IR_SEND_OK); + + return ret; +} + +/** +*@brief OPen the 0-th socket with MACRAW mode +*@param buf: data buffer to send. +*@param len: data length. +*@return This function return received data size for success else 0. +*/ +uint16 macraw_recv( uint8 * buf, uint16 len ) +{ + uint8 sock_num; + uint16 data_len=0; + uint16 dummyPort = 0; + uint16 ptr = 0; + uint8 mFlag = 0; + sock_num = 0; + + if ( len > 0 ) + { + data_len = 0; + + ptr = IINCHIP_READ(Sn_RX_RD0(sock_num)); + ptr = (uint16)((ptr & 0x00ff) << 8) + IINCHIP_READ( Sn_RX_RD1(sock_num) ); + //-- read_data(s, (uint8 *)ptr, data, len); // read data + data_len = IINCHIP_READ_RXBUF(0, ptr); + ptr++; + data_len = ((data_len<<8) + IINCHIP_READ_RXBUF(0, ptr)) - 2; + ptr++; + + if(data_len > 1514) + { + printf(" data_len over 1514\r\n"); + printf(" \r\nptr: %X, data_len: %X", ptr, data_len); + + /** recommand : close and open **/ + close(sock_num); // Close the 0-th socket + socket(sock_num, Sn_MR_MACRAW, dummyPort,mFlag); // OPen the 0-th socket with MACRAW mode + return 0; + } + + IINCHIP_READ_RXBUF_BURST(sock_num, ptr, data_len, (uint8*)(buf)); + ptr += data_len; + + IINCHIP_WRITE(Sn_RX_RD0(sock_num),(uint8)((ptr & 0xff00) >> 8)); + IINCHIP_WRITE(Sn_RX_RD1(sock_num),(uint8)(ptr & 0x00ff)); + IINCHIP_WRITE(Sn_CR(sock_num), Sn_CR_RECV); + while( IINCHIP_READ(Sn_CR(sock_num)) ) + ; + } + return data_len; +} +#endif diff --git b/Base_core/Ethernet/W5500/socket.h a/Base_core/Ethernet/W5500/socket.h new file mode 100644 index 0000000..3e6856d --- /dev/null +++ a/Base_core/Ethernet/W5500/socket.h @@ -0,0 +1,38 @@ +#ifndef _SOCKET_H_ +#define _SOCKET_H_ + +#include "stm32f4xx.h" +#include "Types.h" + +/*Socket 端口选择,可按自己的习惯定义*/ +#define SOCK_TCPS 0 +#define SOCK_HUMTEM 0 +#define SOCK_PING 0 +#define SOCK_TCPC 1 +#define SOCK_UDPS 2 +#define SOCK_WEIBO 2 +#define SOCK_DHCP 3 +#define SOCK_HTTPS 4 +#define SOCK_DNS 5 +#define SOCK_SMTP 6 +#define SOCK_NTP 7 +//#define NETBIOS_SOCK 6 //在netbios.c已定义 + +extern uint8 socket(SOCKET s, uint8 protocol, uint16 port, uint8 flag); // Opens a socket(TCP or UDP or IP_RAW mode) +extern void close(SOCKET s); // Close socket +extern uint8 connect(SOCKET s, uint8 * addr, uint16 port); // Establish TCP connection (Active connection) +extern void disconnect(SOCKET s); // disconnect the connection +extern uint8 listen(SOCKET s); // Establish TCP connection (Passive connection) +extern uint16 send(SOCKET s, const uint8 * buf, uint16 len); // Send data (TCP) +extern uint16 recv(SOCKET s, uint8 * buf, uint16 len); // Receive data (TCP) +extern uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port); // Send data (UDP/IP RAW) +extern uint16 recvfrom(SOCKET s, uint8 * buf, uint16 len, uint8 * addr, uint16 *port); // Receive data (UDP/IP RAW) + +#ifdef __MACRAW__ +void macraw_open(void); +uint16 macraw_send( const uint8 * buf, uint16 len ); //Send data (MACRAW) +uint16 macraw_recv( uint8 * buf, uint16 len ); //Recv data (MACRAW) +#endif + +#endif +/* _SOCKET_H_ */ diff --git b/Base_core/Ethernet/W5500/types.h a/Base_core/Ethernet/W5500/types.h new file mode 100644 index 0000000..a6dd215 --- /dev/null +++ a/Base_core/Ethernet/W5500/types.h @@ -0,0 +1,46 @@ +#ifndef _TYPE_H_ +#define _TYPE_H_ + +#define MAX_SOCK_NUM 8 /**< Maxmium number of socket */ + +typedef char int8; + +typedef volatile char vint8; + +typedef unsigned char uint8; + +typedef volatile unsigned char vuint8; + +typedef int int16; + +typedef unsigned short uint16; + +typedef long int32; + +typedef unsigned long uint32; + +typedef uint8 u_char; /**< 8-bit value */ +typedef uint8 SOCKET; +typedef uint16 u_short; /**< 16-bit value */ +typedef uint16 u_int; /**< 16-bit value */ +typedef uint32 u_long; /**< 32-bit value */ + +//add by Gavin +typedef volatile char vu8; +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned long u32; + +typedef union _un_l2cval +{ + u_long lVal; + u_char cVal[4]; +}un_l2cval; + +typedef union _un_i2cval +{ + u_int iVal; + u_char cVal[2]; +}un_i2cval; + +#endif /* _TYPE_H_ */ diff --git b/Base_core/Ethernet/W5500/utility.c a/Base_core/Ethernet/W5500/utility.c new file mode 100644 index 0000000..163fa58 --- /dev/null +++ a/Base_core/Ethernet/W5500/utility.c @@ -0,0 +1,444 @@ +/** +****************************************************************************** +* @file utility.c +* @version V1.2 +* @date 2017-11-01 +* @brief 公共实用函数 延时函数 数据格式转换 +* +* @company 深圳炜世科技有限公司 +* @information WIZnet W5500官方代理商,全程技术支持,价格绝对优势! +* @website www.wisioe.com +* @forum www.w5500.cn +* @qqGroup 383035001 +****************************************************************************** +*/ + +#include "w5500.h" +#include "w5500_conf.h" +#include "utility.h" + +#include +#include +#include + +#include "types.h" //add by Gavin + +static u8 fac_us=0; /*us延时倍乘数*/ +static u16 fac_ms=0; /*ms延时倍乘数*/ + +/** +*@brief 初始化延迟函数 +*@param SYSCLK:系统时钟 +*@return 无 +*/ +void systick_init (u8 sysclk) +{ + SysTick->CTRL&=0xfffffffb; /*bit2清空,选择外部时钟 HCLK/8*/ + fac_us=sysclk/8; + fac_ms=(u16)fac_us*1000; +} + +/** +*@brief 秒延时函数 +*@param time_s:要延时秒时间数 +*@return 无 +*/ +void delay_s( uint32 time_s ) +{ + for(;time_s>0;time_s--) + delay_ms(1000); +} + +/** +*@brief 毫秒延时函数 +*@param time_ms:要延时毫秒时间数 +*@return 无 +*/ +void delay_ms( uint32 time_ms ) +{ + +// u32 temp; +// SysTick->LOAD=(u32)time_ms*fac_ms; /*时间加载(SysTick->LOAD为24bit)*/ +// SysTick->VAL =0x00; /*清空计数器*/ +// SysTick->CTRL=0x01 ; /*开始倒数*/ +// do +// { +// temp=SysTick->CTRL; +// } +// while(temp&0x01&&!(temp&(1<<16))); /*等待时间到达*/ +// SysTick->CTRL=0x00; /*关闭计数器*/ +// SysTick->VAL =0X00; /*清空计数器*/ + + unsigned int i = 0; + while( time_ms-- ){ + i = 33400; + while( i-- ); + } + +} + +/** +*@brief 微秒延时函数 +*@param time_ms:要延时微秒时间数 +*@return 无 +*/ +void delay_us( uint32 time_us ) +{ + u32 temp; + SysTick->LOAD=time_us*fac_us; /*时间加载*/ + SysTick->VAL=0x00; /*清空计数器*/ + SysTick->CTRL=0x01 ; /*开始倒数 */ + do + { + temp=SysTick->CTRL; + } + while(temp&0x01&&!(temp&(1<<16))); /*等待时间到达*/ + SysTick->CTRL=0x00; /*关闭计数器*/ + SysTick->VAL =0X00; /*清空计数器*/ +} + +/** +*@brief 字符转转化为8位整型函数 +*@param str:要转化字符串, base: +*@return num:返回转化后的整型数 +*/ +uint16 atoi16(char* str,uint16 base ) +{ + unsigned int num = 0; + while (*str !=0) + num = num * base + c2d(*str++); + return num; +} + +/** +*@brief 字符转转化为32位整型函数 +*@param str:要转化字符串, base: +*@return num:返回转化后的整型数 +*/ +uint32 atoi32(char* str,uint16 base ) +{ + uint32 num = 0; + while (*str !=0) + num = num * base + c2d(*str++); + return num; +} + +/** +*@brief 整型数转化为字符串函数 +*@param n:要转化整数, str[5]:存放转化后的字符串 len:整型数长度 +*@return 无 +*/ +void itoa(uint16 n,uint8 str[5], uint8 len) +{ + uint8 i=len-1; + + memset(str,0x20,len); + do{ + str[i--]=n%10+'0'; + + }while((n/=10)>0); + + return; +} + + +/** +*@brief 把字符串转化为十进制或十六进制数函数 +*@param str:要转化字符串, len:整型数长度 +*@return 成功 - 1, 失败 - 0 +*/ +int validatoi(char* str, int base,int* ret) +{ + int c; + char* tstr = str; + if(str == 0 || *str == '\0') return 0; + while(*tstr != '\0') + { + c = c2d(*tstr); + if( c >= 0 && c < base) tstr++; + else return 0; + } + + *ret = atoi16(str,base); + return 1; +} + +/** +*@brief 用新的字符去替换字符串中特殊的字符 +*@param str:替换后字符串,oldchar:特殊的字符,newchar:新的字符 +*@return 无 +*/ +void replacetochar(char * str, char oldchar,char newchar ) +{ + int x; + for (x = 0; str[x]; x++) + if (str[x] == oldchar) str[x] = newchar; +} + +/** +*@brief 把十进制数转化为字符型 +*@param c:要转化十进制数据 +*@return 返回一个字符型数据 +*/ +char c2d(uint8 c ) +{ + if (c >= '0' && c <= '9') + return c - '0'; + if (c >= 'a' && c <= 'f') + return 10 + c -'a'; + if (c >= 'A' && c <= 'F') + return 10 + c -'A'; + + return (char)c; +} + +/** +*@brief 16位字符高8位低8位转换 +*@param i:要转化的数据 +*@return 转换后的数据 +*/ +uint16 swaps(uint16 i) +{ + uint16 ret=0; + ret = (i & 0xFF) << 8; + ret |= ((i >> 8)& 0xFF); + return ret; +} +/** +*@brief 32位字符高低位变换 +*@param i:要转化的数据 +*@return 转换后的数据 +*/ +uint32 swapl(uint32 l) +{ + uint32 ret=0; + ret = (l & 0xFF) << 24; + ret |= ((l >> 8) & 0xFF) << 16; + ret |= ((l >> 16) & 0xFF) << 8; + ret |= ((l >> 24) & 0xFF); + return ret; +} + +/** +*@brief 字符串处理 +*@param src目标字符串 s1 s2操作字符串 +*@return 无 +*/ +void mid(int8* src, int8* s1, int8* s2, int8* sub) +{ + int8* sub1; + int8* sub2; + uint16 n; + + sub1=strstr(src,s1); + sub1+=strlen(s1); + sub2=strstr(sub1,s2); + n=sub2-sub1; + strncpy(sub,sub1,n); + sub[n]=0; +} + +/** +*@brief ip网络地址转换 +*@param adr:地址 ip:ip +*@return 无 +*/ +void inet_addr_(unsigned char* addr,unsigned char *ip) +{ + int i; + char taddr[30]; + char * nexttok; + char num; + strcpy(taddr,(char *)addr); + + nexttok = taddr; + for(i = 0; i < 4 ; i++) + { + nexttok = strtok(nexttok,"."); + if(nexttok[0] == '0' && nexttok[1] == 'x') num = atoi16(nexttok+2,0x10); + else num = atoi16(nexttok,10); + + ip[i] = num; + nexttok = NULL; + } +} + +/** +*@brief 将32地址转化为十进制格式 +*@param addr: 要转化地址 +*@return 返回十进制格式地址 +*/ +char* inet_ntoa( + unsigned long addr + ) +{ + static char addr_str[32]; + memset(addr_str,0,32); + sprintf(addr_str,"%d.%d.%d.%d",(int)(addr>>24 & 0xFF),(int)(addr>>16 & 0xFF),(int)(addr>>8 & 0xFF),(int)(addr & 0xFF)); + return addr_str; +} + +/** +*@brief 将16地址转化为十进制格式 +*@param addr: 要转化地址 +*@return 返回十进制格式地址 +*/ +char* inet_ntoa_pad(unsigned long addr) +{ + static char addr_str[16]; + memset(addr_str,0,16); + //printf(addr_str,"%03d.%03d.%03d.%03d",(int)(addr>>24 & 0xFF),(int)(addr>>16 & 0xFF),(int)(addr>>8 & 0xFF),(int)(addr & 0xFF)); + return addr_str; +} + +/** +*@brief 验证IP地址 +*@param ip addr +*@return 成功 - 1, 失败 - 0 +*/ +char verify_ip_address(char* src, uint8 * ip) +{ + int i; + int tnum; + char tsrc[50]; + char* tok = tsrc; + + strcpy(tsrc,src); + + for(i = 0; i < 4; i++) + { + tok = strtok(tok,"."); + if ( !tok ) return 0; + if(tok[0] == '0' && tok[1] == 'x') + { + if(!validatoi(tok+2,0x10,&tnum)) + return 0; + } + else if(!validatoi(tok,10,&tnum)) + return 0; + + ip[i] = tnum; + + if(tnum < 0 || tnum > 255) return 0; + tok = NULL; + } + return 1; +} + +/** +*@brief 将一个 主机模式的unsigned short型数据转换到大端模式的TCP/IP 网络字节格式的数据. +*@param 要转换的数据 +*@return 大端模式的数据 +*/ +uint16 htons( + uint16 hostshort /**< A 16-bit number in host byte order. */ + ) +{ + #if ( SYSTEM_ENDIAN == _ENDIAN_LITTLE_ ) + return swaps(hostshort); + #else + return hostshort; + #endif +} + +/** +*@brief 将一个 主机模式的unsigned long型数据转换到大端模式的TCP/IP 网络字节格式的数据. +*@param 要转换的数据 +*@return 大端模式的数据 +*/ +unsigned long htonl( + unsigned long hostlong /**< hostshort - A 32-bit number in host byte order. */ + ) +{ +#if ( SYSTEM_ENDIAN == _ENDIAN_LITTLE_ ) + return swapl(hostlong); +#else + return hostlong; +#endif +} + + + +/** +*@brief 将一个大端模式的TCP/IP 网络字节格式的数据转换到主机模式的unsigned short型数据 +*@param 要转换的数据 +*@return unsigned short模式的数据 +*/ +unsigned long ntohs( + unsigned short netshort /**< netshort - network odering 16bit value */ + ) +{ +#if ( SYSTEM_ENDIAN == _ENDIAN_LITTLE_ ) + return htons(netshort); +#else + return netshort; +#endif +} + + +/** +*@brief 将一个大端模式的TCP/IP 网络字节格式的数据转换到主机模式的unsigned long型数据 +*@param 要转换的数据 +*@return unsigned long模式的数据 +*/ +unsigned long ntohl(unsigned long netlong) +{ +#if ( SYSTEM_ENDIAN == _ENDIAN_LITTLE_ ) + return htonl(netlong); +#else + return netlong; +#endif +} + +/** +*@brief 计算字符串校验值 +*@param 要转换的数据 +*@return 校验值 +*/ +unsigned short checksum( + unsigned char * src, /**< pointer to stream */ + unsigned int len /**< size of stream */ + ) +{ + u_int sum, tsum, i, j; + u_long lsum; + + j = len >> 1; + + lsum = 0; + + for (i = 0; i < j; i++) + { + tsum = src[i * 2]; + tsum = tsum << 8; + tsum += src[i * 2 + 1]; + lsum += tsum; + } + + if (len % 2) + { + tsum = src[i * 2]; + lsum += (tsum << 8); + } + + sum = lsum; + sum = ~(sum + (lsum >> 16)); + return (u_short) sum; +} + +/** +*@brief 检查地址是否匹配 +*@param 要转换的数据 +*@return 成功为1 失败为0 +*/ +u_char check_dest_in_local(u_long destip) +{ + int i = 0; + u_char * pdestip = (u_char*)&destip; + for(i =0; i < 4; i++) + { + if((pdestip[i] & IINCHIP_READ(SUBR0+i)) != (IINCHIP_READ(SIPR0+i) & IINCHIP_READ(SUBR0+i))) + return 1; // Remote + } + return 0; +} diff --git b/Base_core/Ethernet/W5500/utility.h a/Base_core/Ethernet/W5500/utility.h new file mode 100644 index 0000000..387d476 --- /dev/null +++ a/Base_core/Ethernet/W5500/utility.h @@ -0,0 +1,45 @@ +#ifndef _UTILITY_H +#define _UTILITY_H +#include "stdio.h" +#include "types.h" +#include "stm32f4xx.h" + +void systick_init (uint8 SYSCLK); +void delay_s( uint32 time_s ); +void delay_us(uint32 time_us); +void delay_ms(uint32 time_ms); + +uint16 atoi16(char* str,uint16 base); /* Convert a string to integer number */ +uint32 atoi32(char* str,uint16 base); /* Convert a string to integer number */ +void itoa(uint16 n,uint8* str, uint8 len); +int validatoi(char* str, int base, int* ret); /* Verify character string and Convert it to (hexa-)decimal. */ +char c2d(u_char c); /* Convert a character to HEX */ + +uint16 swaps(uint16 i); +uint32 swapl(uint32 l); + +void replacetochar(char * str, char oldchar, char newchar); + +void mid(int8* src, int8* s1, int8* s2, int8* sub); +void inet_addr_(unsigned char* addr,unsigned char *ip); + +char* inet_ntoa(unsigned long addr); /* Convert 32bit Address into Dotted Decimal Format */ +char* inet_ntoa_pad(unsigned long addr); + +uint32 inet_addr(unsigned char* addr); /* Converts a string containing an (Ipv4) Internet Protocol decimal dotted address into a 32bit address */ + +char verify_ip_address(char* src, uint8 * ip); /* Verify dotted notation IP address string */ + +uint16 htons( unsigned short hostshort); /* htons function converts a unsigned short from host to TCP/IP network byte order (which is big-endian).*/ + +uint32 htonl(unsigned long hostlong); /* htonl function converts a unsigned long from host to TCP/IP network byte order (which is big-endian). */ + +uint32 ntohs(unsigned short netshort); /* ntohs function converts a unsigned short from TCP/IP network byte order to host byte order (which is little-endian on Intel processors). */ + +uint32 ntohl(unsigned long netlong); /* ntohl function converts a u_long from TCP/IP network order to host byte order (which is little-endian on Intel processors). */ + +uint16 checksum(unsigned char * src, unsigned int len); /* Calculate checksum of a stream */ + +uint8 check_dest_in_local(u_long destip); /* Check Destination in local or remote */ + +#endif diff --git b/Base_core/Ethernet/W5500/w5500.c a/Base_core/Ethernet/W5500/w5500.c new file mode 100644 index 0000000..e1afcc7 --- /dev/null +++ a/Base_core/Ethernet/W5500/w5500.c @@ -0,0 +1,437 @@ +/** +****************************************************************************** +* @file w5500.c +* @version V1.2 +* @date 2017-11-01 +* @brief 读写W5500寄存器底层函数 +* +* @company 深圳炜世科技有限公司 +* @information WIZnet W5500官方代理商,全程技术支持,价格绝对优势! +* @website www.wisioe.com +* @forum www.w5500.cn +* @qqGroup 383035001 +****************************************************************************** +*/ + +#include +#include +#include "w5500_conf.h" +#include "w5500.h" +#include "socket.h" +#include "utility.h" +#ifdef __DEF_IINCHIP_PPP__ +#include "md5.h" +#endif + +uint16 SSIZE[MAX_SOCK_NUM] = {0,0,0,0,0,0,0,0}; // Max Tx buffer +uint16 RSIZE[MAX_SOCK_NUM] = {0,0,0,0,0,0,0,0}; // Max Rx buffer +uint8 txsize[MAX_SOCK_NUM] = {2,2,2,2,2,2,2,2}; // tx buffer set K bits +uint8 rxsize[MAX_SOCK_NUM] = {2,2,2,2,2,2,2,2}; // rx buffet set K bits + +/** +*@brief This function is to get the Max size to receive. +*@param s: socket number +*@return This function return the RX buffer size has been setted +*/ +void iinchip_init(void) +{ + setMR( MR_RST ); +#ifdef __DEF_IINCHIP_DBG__ + //printf("MR value is %02x \r\n",IINCHIP_READ_COMMON(MR)); +#endif +} + +/** +*@brief This function is to get the Max size to receive. +*@param s: socket number +*@return This function return the RX buffer size has been setted +*/ +uint16 getIINCHIP_RxMAX(SOCKET s) +{ + return RSIZE[s]; +} + +/** +*@brief This function is to get the Max size to receive. +*@param s: socket number +*@return This function return the RX buffer size has been setted +*/ +uint16 getIINCHIP_TxMAX(SOCKET s) +{ + return SSIZE[s]; +} + +/** +*@brief This function is to set up gateway IP address. +*@param addr: a pointer to a 4 -byte array responsible to set the Gateway IP address +*@return None +*/ +void setGAR(uint8 * addr ) +{ + wiz_write_buf(GAR0, addr, 4); +} + +/** +*@brief This function is to get gateway IP address. +*@param addr: a pointer to a 4 -byte array responsible to get the Gateway IP address +*@return None +*/ +void getGAR(uint8 * addr) +{ + wiz_read_buf(GAR0, addr, 4); +} + +/** +*@brief This function is to set up SubnetMask address +*@param addr: a pointer to a 4 -byte array responsible to set the subway IP address. +*@return None +*/ +void setSUBR(uint8 * addr) +{ + wiz_write_buf(SUBR0, addr, 4); +} +/** +*@brief This function is to set up MAC address. +*@param addr: a pointer to a 6 -byte array responsible to set the MAC address. +*@return None +*/ +void setSHAR(uint8 * addr) +{ + wiz_write_buf(SHAR0, addr, 6); +} + +/** +*@brief This function is to set up Source IP address. +*@param addr:a pointer to a 4 -byte array responsible to set the Source IP addres. +*@return None +*/ +void setSIPR(uint8 * addr) +{ + wiz_write_buf(SIPR0, addr, 4); +} + +/** +*@brief This function is to get Subnet mask. +*@param addr:a pointer to a 4 -byte array responsible to set the Subnet mask. +*@return None +*/ +void getSUBR(uint8 * addr) +{ + wiz_read_buf(SUBR0, addr, 4); +} + +/** +*@brief This function is to get up Source MAC . +*@param addr: a pointer to a 6 -byte array responsible to get the MAC +*@return None +*/ +void getSHAR(uint8 * addr) +{ + wiz_read_buf(SHAR0, addr, 6); +} + +/** +*@brief This function is to get up Source IP . +*@param addr: a pointer to a 4 -byte array responsible to get the Source IP +*@return None +*/ +void getSIPR(uint8 * addr) +{ + wiz_read_buf(SIPR0, addr, 4); +} +/** +*@brief This function is to set the MR register. +*@param val: the value to set to MR +*@return None +*/ +void setMR(uint8 val) +{ + IINCHIP_WRITE(MR,val); +} + +/** +*@brief This function is to get Interrupt register in common register. +*@param None +*@return The value read from the IR register +*/ +uint8 getIR( void ) +{ + return IINCHIP_READ(IR); +} + +/** +@brief This function is to set up Retransmission time. + If there is no response from the peer or delay in response then retransmission + will be there as per RTR (Retry Time-value Register)setting +*@param timeout: The value write to the RTR0 register +*@return None +*/ +void setRTR(uint16 timeout) +{ + IINCHIP_WRITE(RTR0,(uint8)((timeout & 0xff00) >> 8)); + IINCHIP_WRITE(RTR1,(uint8)(timeout & 0x00ff)); +} + +/** +@brief This function is to set the number of Retransmission. +* If there is no response from the peer or delay in response then recorded time +* as per RTR & RCR register seeting then time out will occur. +*@param retry: Times to retry +*@return None +*/ +void setRCR(uint8 retry) +{ + IINCHIP_WRITE(WIZ_RCR,retry); +} + +/** +*@brief This function is to the interrupt mask Enable/Disable appropriate Interrupt. ('1' : interrupt enable) + If any bit in IMR is set as '0' then there is not interrupt signal though the bit is + set in IR register. +*@param mask: the bits to clear +*@return None +*/ +void clearIR(uint8 mask) +{ + IINCHIP_WRITE(IR, ~mask | getIR() ); +} + +/** +*@brief This function is to set the maximum segment size of TCP in Active Mode), while in Passive Mode this is set by peer +*@param s: socket number +*@param Sn_MSSR: the maximum segment size +*@return None +*/ +void setSn_MSS(SOCKET s, uint16 Sn_MSSR) +{ + IINCHIP_WRITE( Sn_MSSR0(s), (uint8)((Sn_MSSR & 0xff00) >> 8)); + IINCHIP_WRITE( Sn_MSSR1(s), (uint8)(Sn_MSSR & 0x00ff)); +} + +/** +*@brief This function is to set the IP Time to live(TTL) Register +*@param s: socket number +*@param Sn_MSSR: the IP Time to live +*@return None +*/ +void setSn_TTL(SOCKET s, uint8 ttl) +{ + IINCHIP_WRITE( Sn_TTL(s) , ttl); +} + +/** +*@brief This function is to read the Interrupt & Soket Status registe +*@param s: socket number +*@return socket interrupt status +*/ +uint8 getSn_IR(SOCKET s) +{ + return IINCHIP_READ(Sn_IR(s)); +} + +/** +*@brief This function is to write the Interrupt & Soket Status register to clear the interrupt +*@param s: socket number +*@return socket interrupt status +*/ +void setSn_IR(uint8 s, uint8 val) +{ + IINCHIP_WRITE(Sn_IR(s), val); +} + +/** +*@brief This function is to get socket status +*@param s: socket number +*@return socket status +*/ +uint8 getSn_SR(SOCKET s) +{ + return IINCHIP_READ(Sn_SR(s)); +} + +/** +*@brief This fuction is to get socket TX free buf size +* This gives free buffer size of transmit buffer. This is the data size that user can transmit. +* User shuold check this value first and control the size of transmitting data +*@param s: socket number +*@return socket TX free buf size +*/ +uint16 getSn_TX_FSR(SOCKET s) +{ + uint16 val=0,val1=0; + do + { + val1 = IINCHIP_READ(Sn_TX_FSR0(s)); + val1 = (val1 << 8) + IINCHIP_READ(Sn_TX_FSR1(s)); + if (val1 != 0) + { + val = IINCHIP_READ(Sn_TX_FSR0(s)); + val = (val << 8) + IINCHIP_READ(Sn_TX_FSR1(s)); + } + } while (val != val1); + return val; +} + +/** +*@brief This fuction is to give size of received data in receive buffer. +*@param s: socket number +*@return socket TX free buf size +*/ +uint16 getSn_RX_RSR(SOCKET s) +{ + uint16 val=0,val1=0; + do + { + val1 = IINCHIP_READ(Sn_RX_RSR0(s)); + val1 = (val1 << 8) + IINCHIP_READ(Sn_RX_RSR1(s)); + if(val1 != 0) + { + val = IINCHIP_READ(Sn_RX_RSR0(s)); + val = (val << 8) + IINCHIP_READ(Sn_RX_RSR1(s)); + } + } while (val != val1); + return val; +} + +/** +*@brief This function is being called by send() and sendto() function also. +* This function read the Tx write pointer register and after copy the data in buffer update the Tx write pointer +* register. User should read upper byte first and lower byte later to get proper value. +*@param s: socket number +*@param data: data buffer to send +*@param len: data length +*@return socket TX free buf size +*/ +void send_data_processing(SOCKET s, uint8 *data, uint16 len) +{ + uint16 ptr =0; + uint32 addrbsb =0; + if(len == 0) + { + //printf("CH: %d Unexpected1 length 0\r\n", s); + return; + } + + ptr = IINCHIP_READ( Sn_TX_WR0(s) ); + ptr = ((ptr & 0x00ff) << 8) + IINCHIP_READ(Sn_TX_WR1(s)); + + addrbsb = (uint32)(ptr<<8) + (s<<5) + 0x10; + wiz_write_buf(addrbsb, data, len); + + ptr += len; + IINCHIP_WRITE( Sn_TX_WR0(s) ,(uint8)((ptr & 0xff00) >> 8)); + IINCHIP_WRITE( Sn_TX_WR1(s),(uint8)(ptr & 0x00ff)); +} + +/** +*@brief This function is being called by recv() also. +* This function read the Rx read pointer register +* and after copy the data from receive buffer update the Rx write pointer register. +* User should read upper byte first and lower byte later to get proper value. +*@param s: socket number +*@param data: data buffer to receive +*@param len: data length +*@return None +*/ +void recv_data_processing(SOCKET s, uint8 *data, uint16 len) +{ + uint16 ptr = 0; + uint32 addrbsb = 0; + + if(len == 0) + { + //printf(" CH: %d Unexpected2 length 0\r\n", s); + return; + } + + ptr = IINCHIP_READ( Sn_RX_RD0(s) ); + ptr = ((ptr & 0x00ff) << 8) + IINCHIP_READ( Sn_RX_RD1(s) ); + + addrbsb = (uint32)(ptr<<8) + (s<<5) + 0x18; + wiz_read_buf(addrbsb, data, len); + ptr += len; + + IINCHIP_WRITE( Sn_RX_RD0(s), (uint8)((ptr & 0xff00) >> 8)); + IINCHIP_WRITE( Sn_RX_RD1(s), (uint8)(ptr & 0x00ff)); +} + +/** +*@brief This function set the transmit & receive buffer size as per the channels is used +*@Note: TMSR and RMSR bits are as follows\n +* Maximum memory size for Tx, Rx in the W5500 is 16K Bytes,\n +* In the range of 16KBytes, the memory size could be allocated dynamically by each channel.\n +* Be attentive to sum of memory size shouldn't exceed 8Kbytes\n +* and to data transmission and receiption from non-allocated channel may cause some problems.\n +* If the 16KBytes memory is already assigned to centain channel, \n +* other 3 channels couldn't be used, for there's no available memory.\n +* If two 4KBytes memory are assigned to two each channels, \n +* other 2 channels couldn't be used, for there's no available memory.\n +*@param tx_size: tx buffer size to set=tx_size[s]*(1024) +*@param rx_size: rx buffer size to set=rx_size[s]*(1024) +*@return None +*/ +void socket_buf_init( uint8 * tx_size, uint8 * rx_size ) +{ + int16 i; + int16 ssum=0,rsum=0; + + for (i = 0 ; i < MAX_SOCK_NUM; i++) // Set the size, masking and base address of Tx & Rx memory by each channel + { + IINCHIP_WRITE( (Sn_TXMEM_SIZE(i)), tx_size[i]); + IINCHIP_WRITE( (Sn_RXMEM_SIZE(i)), rx_size[i]); + + #ifdef __DEF_IINCHIP_DBG__ + //printf(" tx_size[%d]: %d, Sn_TXMEM_SIZE = %d\r\n",i, tx_size[i], IINCHIP_READ(Sn_TXMEM_SIZE(i))); + //printf(" rx_size[%d]: %d, Sn_RXMEM_SIZE = %d\r\n",i, rx_size[i], IINCHIP_READ(Sn_RXMEM_SIZE(i))); + #endif + SSIZE[i] = (int16)(0); + RSIZE[i] = (int16)(0); + + if (ssum <= 16384) + { + SSIZE[i] = (int16)tx_size[i]*(1024); + } + + if (rsum <= 16384) + { + RSIZE[i]=(int16)rx_size[i]*(1024); + } + ssum += SSIZE[i]; + rsum += RSIZE[i]; + } +} + +void setKPALVTR(SOCKET i,uint8 val) +{ + IINCHIP_WRITE(Sn_KPALVTR(i),val); +} + +/** +*@brief 检测物理层连接 +*@param 无 +*@return 无 +*/ +void PHY_check(void) +{ + uint8 PHY_connect=0; + PHY_connect=0x01&getPHYStatus(); + if(PHY_connect==0) + { + //printf(" \r\n 请检查网线是否连接?\r\n"); + + while(PHY_connect == 0) { + PHY_connect=0x01&getPHYStatus(); + //printf(" ."); + delay_ms(500); + } + //printf(" \r\n"); + } + +// if(PHY_connect) +// delay_ms(1); +} + +uint8 getPHYStatus( void ) +{ + return IINCHIP_READ(PHYCFGR); +} diff --git b/Base_core/Ethernet/W5500/w5500.h a/Base_core/Ethernet/W5500/w5500.h new file mode 100644 index 0000000..607bd88 --- /dev/null +++ a/Base_core/Ethernet/W5500/w5500.h @@ -0,0 +1,307 @@ +/** +****************************************************************************** +* @file W5500.h +* @version V1.2 +* @date 2017-11-01 +* @brief W5500寄存器地址定义/宏定义等 +* +* @company 深圳炜世科技有限公司 +* @information WIZnet W5500官方代理商,全程技术支持,价格绝对优势! +* @website www.wisioe.com +* @forum www.w5500.cn +* @qqGroup 383035001 +****************************************************************************** +*/ + +#ifndef _W5500_H_ +#define _W5500_H_ +#include "stm32f4xx.h" +#include "Types.h" + +#define MR (0x000000) +/**brief Gateway IP Register address*/ +#define GAR0 (0x000100) +#define GAR1 (0x000200) +#define GAR2 (0x000300) +#define GAR3 (0x000400) +/**brief Subnet mask Register address*/ +#define SUBR0 (0x000500) +#define SUBR1 (0x000600) +#define SUBR2 (0x000700) +#define SUBR3 (0x000800) +/**brief Source MAC Register address*/ +#define SHAR0 (0x000900) +#define SHAR1 (0x000A00) +#define SHAR2 (0x000B00) +#define SHAR3 (0x000C00) +#define SHAR4 (0x000D00) +#define SHAR5 (0x000E00) +/**@brief Source IP Register address*/ +#define SIPR0 (0x000F00) +#define SIPR1 (0x001000) +#define SIPR2 (0x001100) +#define SIPR3 (0x001200) +/**@brief set Interrupt low level timer register address*/ +#define INTLEVEL0 (0x001300) +#define INTLEVEL1 (0x001400) +/**@brief Interrupt Register*/ +#define IR (0x001500) +/**@brief Interrupt mask register*/ +#define IMR (0x001600) +/**@brief Socket Interrupt Register*/ +#define SIR (0x001700) +/**@brief Socket Interrupt Mask Register*/ +#define SIMR (0x001800) +/**@brief Timeout register address( 1 is 100us )*/ +#define RTR0 (0x001900) +#define RTR1 (0x001A00) +/**@brief Retry count reigster*/ +#define WIZ_RCR (0x001B00) +/**@briefPPP LCP Request Timer register in PPPoE mode*/ +#define PTIMER (0x001C00) +/**@brief PPP LCP Magic number register in PPPoE mode*/ +#define PMAGIC (0x001D00) +/**@brief PPP Destination MAC Register address*/ +#define PDHAR0 (0x001E00) +#define PDHAR1 (0x001F00) +#define PDHAR2 (0x002000) +#define PDHAR3 (0x002100) +#define PDHAR4 (0x002200) +#define PDHAR5 (0x002300) +/** + @brief PPP Session Identification Register + */ +#define PSID0 (0x002400) +#define PSID1 (0x002500) +/**@brief PPP Maximum Segment Size(MSS) register*/ +#define PMR0 (0x002600) +#define PMR1 (0x002700) +/**@brief Unreachable IP register address in UDP mode*/ +#define UIPR0 (0x002800) +#define UIPR1 (0x002900) +#define UIPR2 (0x002A00) +#define UIPR3 (0x002B00) +/**@brief Unreachable Port register address in UDP mode*/ +#define UPORT0 (0x002C00) +#define UPORT1 (0x002D00) +/**@brief PHY Configuration Register*/ +#define PHYCFGR (0x002E00) +/**@brief chip version register address*/ +#define VERSIONR (0x003900) +/**@brief socket Mode register*/ +#define Sn_MR(ch) (0x000008 + (ch<<5)) +/**@brief channel Sn_CR register*/ +#define Sn_CR(ch) (0x000108 + (ch<<5)) +/**@brief channel interrupt register*/ +#define Sn_IR(ch) (0x000208 + (ch<<5)) +/**@brief channel status register*/ +#define Sn_SR(ch) (0x000308 + (ch<<5)) +/**@brief source port register*/ +#define Sn_PORT0(ch) (0x000408 + (ch<<5)) +#define Sn_PORT1(ch) (0x000508 + (ch<<5)) +/**@brief Peer MAC register address*/ +#define Sn_DHAR0(ch) (0x000608 + (ch<<5)) +#define Sn_DHAR1(ch) (0x000708 + (ch<<5)) +#define Sn_DHAR2(ch) (0x000808 + (ch<<5)) +#define Sn_DHAR3(ch) (0x000908 + (ch<<5)) +#define Sn_DHAR4(ch) (0x000A08 + (ch<<5)) +#define Sn_DHAR5(ch) (0x000B08 + (ch<<5)) +/**@brief Peer IP register address*/ +#define Sn_DIPR0(ch) (0x000C08 + (ch<<5)) +#define Sn_DIPR1(ch) (0x000D08 + (ch<<5)) +#define Sn_DIPR2(ch) (0x000E08 + (ch<<5)) +#define Sn_DIPR3(ch) (0x000F08 + (ch<<5)) +/**@brief Peer port register address*/ +#define Sn_DPORT0(ch) (0x001008 + (ch<<5)) +#define Sn_DPORT1(ch) (0x001108 + (ch<<5)) +/**@brief Maximum Segment Size(Sn_MSSR0) register address*/ +#define Sn_MSSR0(ch) (0x001208 + (ch<<5)) +#define Sn_MSSR1(ch) (0x001308 + (ch<<5)) + +#define Sn_PROTO(ch) (0x001408 + (ch<<5)) +/** @brief IP Type of Service(TOS) Register */ +#define Sn_TOS(ch) (0x001508 + (ch<<5)) +/**@brief IP Time to live(TTL) Register */ +#define Sn_TTL(ch) (0x001608 + (ch<<5)) +/**@brief Receive memory size reigster*/ +#define Sn_RXMEM_SIZE(ch) (0x001E08 + (ch<<5)) +/**@brief Transmit memory size reigster*/ +#define Sn_TXMEM_SIZE(ch) (0x001F08 + (ch<<5)) +/**@brief Transmit free memory size register*/ +#define Sn_TX_FSR0(ch) (0x002008 + (ch<<5)) +#define Sn_TX_FSR1(ch) (0x002108 + (ch<<5)) +/** + @brief Transmit memory read pointer register address + */ +#define Sn_TX_RD0(ch) (0x002208 + (ch<<5)) +#define Sn_TX_RD1(ch) (0x002308 + (ch<<5)) +/**@brief Transmit memory write pointer register address*/ +#define Sn_TX_WR0(ch) (0x002408 + (ch<<5)) +#define Sn_TX_WR1(ch) (0x002508 + (ch<<5)) +/**@brief Received data size register*/ +#define Sn_RX_RSR0(ch) (0x002608 + (ch<<5)) +#define Sn_RX_RSR1(ch) (0x002708 + (ch<<5)) +/**@brief Read point of Receive memory*/ +#define Sn_RX_RD0(ch) (0x002808 + (ch<<5)) +#define Sn_RX_RD1(ch) (0x002908 + (ch<<5)) +/**@brief Write point of Receive memory*/ +#define Sn_RX_WR0(ch) (0x002A08 + (ch<<5)) +#define Sn_RX_WR1(ch) (0x002B08 + (ch<<5)) +/**@brief socket interrupt mask register*/ +#define Sn_IMR(ch) (0x002C08 + (ch<<5)) +/**@brief frag field value in IP header register*/ +#define Sn_FRAG(ch) (0x002D08 + (ch<<5)) +/**@brief Keep Timer register*/ +#define Sn_KPALVTR(ch) (0x002F08 + (ch<<5)) + +/* MODE register values */ +#define MR_RST 0x80 /**< reset */ +#define MR_WOL 0x20 /**< Wake on Lan */ +#define MR_PB 0x10 /**< ping block */ +#define MR_PPPOE 0x08 /**< enable pppoe */ +#define MR_UDP_FARP 0x02 /**< enbale FORCE ARP */ +/* IR register values */ +#define IR_CONFLICT 0x80 /**< check ip confict */ +#define IR_UNREACH 0x40 /**< get the destination unreachable message in UDP sending */ +#define IR_PPPoE 0x20 /**< get the PPPoE close message */ +#define IR_MAGIC 0x10 /**< get the magic packet interrupt */ + +/* Sn_MR values */ +#define Sn_MR_CLOSE 0x00 /**< unused socket */ +#define Sn_MR_TCP 0x01 /**< TCP */ +#define Sn_MR_UDP 0x02 /**< UDP */ +#define Sn_MR_IPRAW 0x03 /**< IP LAYER RAW SOCK */ +#define Sn_MR_MACRAW 0x04 /**< MAC LAYER RAW SOCK */ +#define Sn_MR_PPPOE 0x05 /**< PPPoE */ +#define Sn_MR_UCASTB 0x10 /**< Unicast Block in UDP Multicating*/ +#define Sn_MR_ND 0x20 /**< No Delayed Ack(TCP) flag */ +#define Sn_MR_MC 0x20 /**< Multicast IGMP (UDP) flag */ +#define Sn_MR_BCASTB 0x40 /**< Broadcast blcok in UDP Multicating */ +#define Sn_MR_MULTI 0x80 /**< support UDP Multicating */ + + /* Sn_MR values on MACRAW MODE */ +#define Sn_MR_MIP6N 0x10 /**< IPv6 packet Block */ +#define Sn_MR_MMB 0x20 /**< IPv4 Multicasting Block */ +//#define Sn_MR_BCASTB 0x40 /**< Broadcast blcok */ +#define Sn_MR_MFEN 0x80 /**< support MAC filter enable */ + +/* Sn_CR values */ +#define Sn_CR_OPEN 0x01 /**< initialize or open socket */ +#define Sn_CR_LISTEN 0x02 /**< wait connection request in tcp mode(Server mode) */ +#define Sn_CR_CONNECT 0x04 /**< send connection request in tcp mode(Client mode) */ +#define Sn_CR_DISCON 0x08 /**< send closing reqeuset in tcp mode */ +#define Sn_CR_CLOSE 0x10 /**< close socket */ +#define Sn_CR_SEND 0x20 /**< update txbuf pointer, send data */ +#define Sn_CR_SEND_MAC 0x21 /**< send data with MAC address, so without ARP process */ +#define Sn_CR_SEND_KEEP 0x22 /**< send keep alive message */ +#define Sn_CR_RECV 0x40 /**< update rxbuf pointer, recv data */ + +#ifdef __DEF_IINCHIP_PPP__ + #define Sn_CR_PCON 0x23 + #define Sn_CR_PDISCON 0x24 + #define Sn_CR_PCR 0x25 + #define Sn_CR_PCN 0x26 + #define Sn_CR_PCJ 0x27 +#endif + +/* Sn_IR values */ +#ifdef __DEF_IINCHIP_PPP__ + #define Sn_IR_PRECV 0x80 + #define Sn_IR_PFAIL 0x40 + #define Sn_IR_PNEXT 0x20 +#endif + +#define Sn_IR_SEND_OK 0x10 /**< complete sending */ +#define Sn_IR_TIMEOUT 0x08 /**< assert timeout */ +#define Sn_IR_RECV 0x04 /**< receiving data */ +#define Sn_IR_DISCON 0x02 /**< closed socket */ +#define Sn_IR_CON 0x01 /**< established connection */ + +/* Sn_SR values */ +#define SOCK_CLOSED 0x00 /**< closed */ +#define SOCK_INIT 0x13 /**< init state */ +#define SOCK_LISTEN 0x14 /**< listen state */ +#define SOCK_SYNSENT 0x15 /**< connection state */ +#define SOCK_SYNRECV 0x16 /**< connection state */ +#define SOCK_ESTABLISHED 0x17 /**< success to connect */ +#define SOCK_FIN_WAIT 0x18 /**< closing state */ +#define SOCK_CLOSING 0x1A /**< closing state */ +#define SOCK_TIME_WAIT 0x1B /**< closing state */ +#define SOCK_CLOSE_WAIT 0x1C /**< closing state */ +#define SOCK_LAST_ACK 0x1D /**< closing state */ +#define SOCK_UDP 0x22 /**< udp socket */ +#define SOCK_IPRAW 0x32 /**< ip raw mode socket */ +#define SOCK_MACRAW 0x42 /**< mac raw mode socket */ +#define SOCK_PPPOE 0x5F /**< pppoe socket */ + +/* IP PROTOCOL */ +#define IPPROTO_IP 0 /**< Dummy for IP */ +#define IPPROTO_ICMP 1 /**< Control message protocol */ +#define IPPROTO_IGMP 2 /**< Internet group management protocol */ +#define IPPROTO_GGP 3 /**< Gateway^2 (deprecated) */ +#define IPPROTO_TCP 6 /**< TCP */ +#define IPPROTO_PUP 12 /**< PUP */ +#define IPPROTO_UDP 17 /**< UDP */ +#define IPPROTO_IDP 22 /**< XNS idp */ +#define IPPROTO_ND 77 /**< UNOFFICIAL net disk protocol */ +#define IPPROTO_RAW 255 /**< Raw IP packet */ + +/** + @brief Keep Timer register + */ +#define Sn_KPALVTR(ch) (0x002F08 + (ch<<5)) + + +/********************************************************* +* iinchip access function +*********************************************************/ + +void iinchip_init(void); // reset iinchip +void socket_buf_init(uint8 * tx_size, uint8 * rx_size); // setting tx/rx buf size +uint8 getISR(uint8 s); +void putISR(uint8 s, uint8 val); +uint16 getIINCHIP_RxMAX(uint8 s); +uint16 getIINCHIP_TxMAX(uint8 s); +void setMR(uint8 val); +void setRTR(uint16 timeout); // set retry duration for data transmission, connection, closing ... +void setRCR(uint8 retry); // set retry count (above the value, assert timeout interrupt) +void clearIR(uint8 mask); // clear interrupt +uint8 getIR( void ); +void setSn_MSS(SOCKET s, uint16 Sn_MSSR); // set maximum segment size +uint8 getSn_IR(SOCKET s); // get socket interrupt status +uint8 getSn_SR(SOCKET s); // get socket status +uint16 getSn_TX_FSR(SOCKET s); // get socket TX free buf size +uint16 getSn_RX_RSR(SOCKET s); // get socket RX recv buf size +uint8 getSn_SR(SOCKET s); +void setSn_TTL(SOCKET s, uint8 ttl); +void send_data_processing(SOCKET s, uint8 *wizdata, uint16 len); +void recv_data_processing(SOCKET s, uint8 *wizdata, uint16 len); + +void setGAR(uint8 * addr); // set gateway address +void setSUBR(uint8 * addr); // set subnet mask address +void setSHAR(uint8 * addr); // set local MAC address +void setSIPR(uint8 * addr); // set local IP address +void getGAR(uint8 * addr); +void getSUBR(uint8 * addr); +void getSHAR(uint8 * addr); +void getSIPR(uint8 * addr); +void setSn_IR(uint8 s, uint8 val); +void Reset_W5500(void); +void PHY_check(void); +void setKPALVTR(SOCKET i,uint8 val); +uint8 getPHYStatus( void ); +extern uint8 txsize[]; +extern uint8 rxsize[]; + +/** + @brief WIZCHIP_OFFSET_INC on IINCHIP_READ/WRITE + * case1. + * IINCHIP_WRITE(RTR0,val); + * IINCHIP_WRITE(RTR1,val); + * case1. + * IINCHIP_WRITE(RTR0,val); + * IINCHIP_WRITE(WIZCHIP_OFFSET_INC(RTR0,1)); + */ +//#define WIZCHIP_OFFSET_INC(ADDR, N) (ADDR + (N<<8)) //< Increase offset address + +#endif diff --git b/Base_core/Ethernet/W5500/w5500_conf.c a/Base_core/Ethernet/W5500/w5500_conf.c new file mode 100644 index 0000000..24300dc --- /dev/null +++ a/Base_core/Ethernet/W5500/w5500_conf.c @@ -0,0 +1,817 @@ +/** +****************************************************************************** +* @file w5500_conf.c +* @version V1.2 +* @date 2017-11-01 +* @brief 用3.5.0版本库建的工程模板 +* @attention 配置MCU,移植w5500程序需要修改的文件,配置w5500的MAC和IP地址 +* +* @company 深圳炜世科技有限公司 +* @information WIZnet W5500官方代理商,全程技术支持,价格绝对优势! +* @website www.wisioe.com +* @forum www.w5500.cn +* @qqGroup 383035001 +****************************************************************************** +*/ + +/* +add by Gavin 2020.03 +RST -PA15 +CS -PB14 +INT -PB15 +SPI -sys_SPI3(PC10-clk;PC11 MISO;PC12 -MOSI; + + 参考原理图得知,w5500和NFC读卡器共用系统spi3, + 而目前的NFC驱动是用的模拟spi,需要修改; + 特别说明: 由于RST复位引脚也是共用(硬件设计缺陷),所以初始化在前的执行一次复位; + 后初始化的那个模块不能再执行复位动作了,否则... + + NFC ic RC522的spi速度最大10M; + w5500 SPI最大速度 80M + system SPI3 最大速度 21.5M + 所以系统SPI只能设置成3个中最小的那个 10M; + 代理商参考设计资料 http://www.w5500.cn + //--------------------------- +1,DEMO_W5500的宏定义用于屏蔽 demo中的开发板硬件信息 +2, 实际调试,NFC ic-RC522只能用SPI3 8分频=5M通信,4分频实际测试不通过!!!!!!!!!!!! + +*/ +#include +#include +#include "w5500_conf.h" +#include "utility.h" +#include "w5500.h" +#include "dhcp.h" +#include "platform_interface.h" +#include "function_interface.h" +#include "function.h" +#include "tcp_demo.h" +#include "platform.h" + +//next 3 header file mask by Gavin +//#include "bsp_i2c_ee.h" +//#include "bsp_spi_flash.h" +//#include "bsp_TiMbase.h" + +//add by Gavin +extern SPI_HandleTypeDef hspi3; + +#ifndef DEMO_W5500 +#define W5500_CS_PORT GPIOB +#define W5500_CS_PIN GPIO_PIN_14 +#define SET_W5500_CS HAL_GPIO_WritePin(W5500_CS_PORT,W5500_CS_PIN,GPIO_PIN_SET) +#define RESET_W5500_CS HAL_GPIO_WritePin(W5500_CS_PORT,W5500_CS_PIN,GPIO_PIN_RESET) + + +#endif + + + + +CONFIG_MSG ConfigMsg; /*配置结构体*/ +EEPROM_MSG_STR EEPROM_MSG; /*EEPROM存储信息结构体*/ + +/*MAC地址首字节必须为偶数*/ +/*如果多块W5500网络适配板在同一现场工作,请使用不同的MAC地址*/ +uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11}; + +/*定义默认IP信息*/ +uint8 local_ip[4]={192,168,0,12}; /*定义W5500默认IP地址*/ +uint8 subnet[4]={255,255,255,0}; /*定义W5500默认子网掩码*/ +uint8 gateway[4]={200,200,100,1}; //{192,168,1,1}; /*定义W5500默认网关*/ +uint8 dns_server[4]={114,114,114,114}; /*定义W5500默认DNS*/ + +uint16 local_port=4000;//8000; /*定义本地端口*/ + +/*定义远端IP信息*/ +uint8 remote_ip[4]={192,168,1,107}; /*远端IP地址*/ +uint16 remote_port=8080; /*远端端口号*/ + +/*IP配置方法选择,请自行选择*/ +uint8 ip_from=IP_FROM_DEFINE; + +uint8 dhcp_ok=0; /*dhcp成功获取IP*/ +uint32 ms=0; /*毫秒计数*/ +uint32 dhcp_time= 0; /*DHCP运行计数*/ +vu8 ntptimer = 0; /*NPT秒计数*/ + +/** +*@brief 配置W5500的IP地址 +*@param 无 +*@return 无 +*/ +void set_w5500_ip(void) +{ + + /*复制定义的配置信息到配置结构体*/ + memcpy(ConfigMsg.mac, mac, 6); + memcpy(ConfigMsg.lip,local_ip,4); + memcpy(ConfigMsg.sub,subnet,4); + memcpy(ConfigMsg.gw,gateway,4); + memcpy(ConfigMsg.dns,dns_server,4); + if(ip_from==IP_FROM_DEFINE){ + //printf(" 使用定义的IP信息配置W5500:\r\n"); + } + /*使用EEPROM存储的IP参数*/ + if(ip_from==IP_FROM_EEPROM) + { + /*从EEPROM中读取IP配置信息*/ + read_config_from_eeprom(); + + /*如果读取EEPROM中MAC信息,如果已配置,则可使用*/ + if( *(EEPROM_MSG.mac)==0x00&& *(EEPROM_MSG.mac+1)==0x08&&*(EEPROM_MSG.mac+2)==0xdc) + { + //printf(" IP from EEPROM\r\n"); + /*复制EEPROM配置信息到配置的结构体变量*/ + memcpy(ConfigMsg.lip,EEPROM_MSG.lip, 4); + memcpy(ConfigMsg.sub,EEPROM_MSG.sub, 4); + memcpy(ConfigMsg.gw, EEPROM_MSG.gw, 4); + } + else + { + //printf(" EEPROM未配置,使用定义的IP信息配置W5500,并写入EEPROM\r\n"); + write_config_to_eeprom(); /*使用默认的IP信息,并初始化EEPROM中数据*/ + } + } + + /*使用DHCP获取IP参数,需调用DHCP子函数*/ + if(ip_from==IP_FROM_DHCP) + { + /*复制DHCP获取的配置信息到配置结构体*/ + if(dhcp_ok==1) + { + //printf(" IP from DHCP\r\n"); + memcpy(ConfigMsg.lip,DHCP_GET.lip, 4); + memcpy(ConfigMsg.sub,DHCP_GET.sub, 4); + memcpy(ConfigMsg.gw,DHCP_GET.gw, 4); + memcpy(ConfigMsg.dns,DHCP_GET.dns,4); + } + else + { + //printf(" DHCP子程序未运行,或者不成功\r\n"); + //printf(" 使用定义的IP信息配置W5500\r\n"); + } + } + + /*以下配置信息,根据需要选用*/ + ConfigMsg.sw_ver[0]=FW_VER_HIGH; + ConfigMsg.sw_ver[1]=FW_VER_LOW; + + /*将IP配置信息写入W5500相应寄存器*/ + setSUBR(ConfigMsg.sub); + setGAR(ConfigMsg.gw); + setSIPR(ConfigMsg.lip); + + getSIPR (local_ip); + //printf(" W5500 IP地址 : %d.%d.%d.%d\r\n", local_ip[0],local_ip[1],local_ip[2],local_ip[3]); + getSUBR(subnet); + //printf(" W5500 子网掩码 : %d.%d.%d.%d\r\n", subnet[0],subnet[1],subnet[2],subnet[3]); + getGAR(gateway); + //printf(" W5500 网关 : %d.%d.%d.%d\r\n", gateway[0],gateway[1],gateway[2],gateway[3]); + +} + +/** +*@brief 配置W5500的MAC地址 +*@param 无 +*@return 无 +*/ +void set_w5500_mac(void) +{ + memcpy(ConfigMsg.mac, mac, 6); + setSHAR(ConfigMsg.mac); /**/ + memcpy(DHCP_GET.mac, mac, 6); +} + + + + + + +/** +*@brief 配置W5500的GPIO接口 +*@param 无 +*@return 无 +*/ +void gpio_for_w5500_config(void) +{ + #ifdef DEMO_W5500 //add by Gavin + GPIO_InitTypeDef GPIO_InitStructure; + SPI_FLASH_Init(); /*初始化STM32 SPI接口*/ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG, ENABLE); + + /*使用SPI1*/ + #ifdef STM32_SPI1 + /*定义RESET引脚*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /*选择要控制的GPIO引脚*/ + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz*/ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚模式为通用推挽输出*/ + GPIO_Init(GPIOC, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/ + GPIO_SetBits(GPIOC, GPIO_Pin_0); + /*定义INT引脚*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; /*选择要控制的GPIO引脚*/ + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /*设置引脚模式为通用推挽模拟上拉输入*/ + GPIO_Init(GPIOC, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/ + #endif + + /*使用SPI2*/ + #ifdef STM32_SPI2 + /*定义RESET引脚*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /*选择要控制的GPIO引脚*/ + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz*/ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /*设置引脚模式为通用推挽输出*/ + GPIO_Init(GPIOB, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/ + GPIO_SetBits(GPIOB, GPIO_Pin_9); + /*定义INT引脚*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; /*选择要控制的GPIO引脚*/ + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; /*设置引脚模式为通用推挽模拟上拉输入*/ + GPIO_Init(GPIOC, &GPIO_InitStructure); /*调用库函数,初始化GPIO*/ + #endif + #else + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + GPIO_InitStruct.Pin = W5500_CS_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + HAL_GPIO_Init(W5500_CS_PORT, &GPIO_InitStruct); + + #endif +} + +/** +*@brief W5500片选信号设置函数 +*@param val: 为“0”表示片选端口为低,为“1”表示片选端口为高 +*@return 无 +*/ +void wiz_cs(uint8_t val) +{ +#ifdef DEMO_W5500 //add by Gavin + #ifdef STM32_SPI1 + if (val == LOW) + { + GPIO_ResetBits(GPIOA, GPIO_Pin_4); + } + else if (val == HIGH) + { + GPIO_SetBits(GPIOA, GPIO_Pin_4); + } + #endif + #ifdef STM32_SPI2 + if (val == LOW) + { + GPIO_ResetBits(GPIOB, GPIO_Pin_12); + } + else if (val == HIGH) + { + GPIO_SetBits(GPIOB, GPIO_Pin_12); + } + #endif +#else + if (val == LOW) + { + RESET_W5500_CS;//GPIO_ResetBits(GPIOB, GPIO_Pin_12); + } + else if (val == HIGH) + { + SET_W5500_CS;//GPIO_SetBits(GPIOB, GPIO_Pin_12); + } +#endif +} + +/** +*@brief 设置W5500的片选端口SCSn为低 +*@param 无 +*@return 无 +*/ +void iinchip_csoff(void) +{ + wiz_cs(LOW); +} + +/** +*@brief 设置W5500的片选端口SCSn为高 +*@param 无 +*@return 无 +*/ +void iinchip_cson(void) +{ + wiz_cs(HIGH); +} + + +/* +2019.12.04 实测1ms; +环境:主频168MHz,关闭中断,IO取反用示波器测试!! */ +void w5500_delay_ms( unsigned short time ) +{ + unsigned short i = 0; + while( time-- ){ + i = 33400; + while( i-- ); + } +} + +/** +*@brief W5500复位设置函数 +*@param 无 +*@return 无 +*/ +void reset_w5500(void) +{ +#ifdef DEMO_W5500 //add by Gavin + #ifdef STM32_SPI1 + GPIO_ResetBits(GPIOC, GPIO_Pin_0); + delay_us(2); + GPIO_SetBits(GPIOC, GPIO_Pin_0); + delay_ms(1600); + #endif + #ifdef STM32_SPI2 + GPIO_ResetBits(GPIOB, GPIO_Pin_9); + delay_us(2); + GPIO_SetBits(GPIOB, GPIO_Pin_9); + delay_ms(1600); + #endif +#endif + + if( get_hard_flag() ==0){ //200S_V3 w5500 RST-PA8 + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + // + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); + w5500_delay_ms(50); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); + w5500_delay_ms(50); + } + +} + +/** +*@brief STM32 SPI1读写8位数据 +*@param dat:写入的8位数据 +*@return 无 +*/ +uint8 IINCHIP_SpiSendData(uint8 dat) +{ +#ifdef DEMO_W5500 //add by Gavin + return(SPI_FLASH_SendByte(dat)); +#else + unsigned char rxdata; + HAL_SPI_TransmitReceive(&hspi3,&dat,&rxdata,1,100); + return rxdata; +#endif + +} + +/** +*@brief 写入一个8位数据到W5500 +*@param addrbsb: 写入数据的地址 +*@param data:写入的8位数据 +*@return 无 +*/ +void IINCHIP_WRITE( uint32 addrbsb, uint8 data) +{ + iinchip_csoff(); + IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); + IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); + IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4); + IINCHIP_SpiSendData(data); + iinchip_cson(); +} + +/** +*@brief 从W5500读出一个8位数据 +*@param addrbsb: 写入数据的地址 +*@param data:从写入的地址处读取到的8位数据 +*@return 无 +*/ +uint8 IINCHIP_READ(uint32 addrbsb) +{ + uint8 data = 0; + iinchip_csoff(); + IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); + IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); + IINCHIP_SpiSendData( (addrbsb & 0x000000F8)) ; + data = IINCHIP_SpiSendData(0x00); + iinchip_cson(); + return data; +} + +/** +*@brief 向W5500写入len字节数据 +*@param addrbsb: 写入数据的地址 +*@param buf:写入字符串 +*@param len:字符串长度 +*@return len:返回字符串长度 +*/ +uint16 wiz_write_buf(uint32 addrbsb,uint8* buf,uint16 len) +{ + uint16 idx = 0; + if(len == 0){ //printf(" Unexpected2 length 0\r\n"); + } + iinchip_csoff(); + IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); + IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); + IINCHIP_SpiSendData( (addrbsb & 0x000000F8) + 4); + for(idx = 0; idx < len; idx++) + { + IINCHIP_SpiSendData(buf[idx]); + } + iinchip_cson(); + return len; +} + +/** +*@brief 从W5500读出len字节数据 +*@param addrbsb: 读取数据的地址 +*@param buf:存放读取数据 +*@param len:字符串长度 +*@return len:返回字符串长度 +*/ +uint16 wiz_read_buf(uint32 addrbsb, uint8* buf,uint16 len) +{ + uint16 idx = 0; + if(len == 0) + { + //printf(" Unexpected2 length 0\r\n"); + } + iinchip_csoff(); + IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16); + IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8); + IINCHIP_SpiSendData( (addrbsb & 0x000000F8)); + for(idx = 0; idx < len; idx++) + { + buf[idx] = IINCHIP_SpiSendData(0x00); + } + iinchip_cson(); + return len; +} + +/** +*@brief 写配置信息到EEPROM +*@param 无 +*@return 无 +*/ +void write_config_to_eeprom(void) +{ +#ifdef DEMO_W5500 //add by Gavin + uint16 dAddr=0; + ee_WriteBytes(ConfigMsg.mac,dAddr,(uint8)EEPROM_MSG_LEN); + delay_ms(10); +#endif +} + +/** +*@brief 从EEPROM读配置信息 +*@param 无 +*@return 无 +*/ +void read_config_from_eeprom(void) +{ +#ifdef DEMO_W5500 //add by Gavin + ee_ReadBytes(EEPROM_MSG.mac,0,EEPROM_MSG_LEN); + delay_us(10); +#endif +} + +/** +*@brief STM32定时器2初始化 +*@param 无 +*@return 无 +*/ +void timer2_init(void) +{ +#ifdef DEMO_W5500 //add by Gavin + TIM2_Configuration(); /* TIM2 定时配置 */ + TIM2_NVIC_Configuration(); /* 定时器的中断优先级 */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); /* TIM2 重新开时钟,开始计时 */ +#endif +} + +/** +*@brief dhcp用到的定时器初始化 +*@param 无 +*@return 无 +*/ +void dhcp_timer_init(void) +{ + timer2_init(); +} + +/** +*@brief ntp用到的定时器初始化 +*@param 无 +*@return 无 +*/ +void ntp_timer_init(void) +{ + timer2_init(); +} + +/** +*@brief 定时器2中断函数 +*@param 无 +*@return 无 +*/ +#ifdef DEMO_W5500 //add by Gavin +void timer2_isr(void) +{ + + ms++; + if(ms>=1000) + { + ms=0; + dhcp_time++; /*DHCP定时加1S*/ + #ifndef __NTP_H__ + ntptimer++; /*NTP重试时间加1S*/ + #endif + } +} +#else +void timer2_isr(void) +{ +//called by 20ms + if(++ms>=50) + { + ms=0; + dhcp_time++; /*DHCP定时加1S*/ + #ifndef __NTP_H__ + ntptimer++; /*NTP重试时间加1S*/ + #endif + } +} +#endif + +/** +*@brief STM32系统软复位函数 +*@param 无 +*@return 无 +*/ +void reboot(void) +{ +#ifdef DEMO_W5500 //add by Gavin + pFunction Jump_To_Application; + uint32 JumpAddress; + //printf(" 系统重启中……\r\n"); + JumpAddress = *(vu32*) (0x00000004); + Jump_To_Application = (pFunction) JumpAddress; + Jump_To_Application(); +#endif +} + + + + +//----------------------------------- NEXT add by Gavin ---------------------------------------------------------------- + + +//see BASE protocol 5.2.9 TCPIP +struct tcpip_STR{ + unsigned char ip_addr[4]; + unsigned char mac_addr[6]; + unsigned char subnet_mask[4]; + unsigned char gateway[4]; +#define IP_ADDR_LEN 4 +#define MAC_ADDR_LEN 6 +#define SUBNET_ADDR_LEN 4 +#define GATEWAY_ADDR_LEN 4 +}; +struct tcpip_STR tcp_ip; + +#define STORE_IP_ADDR 0x120 //len=4+1 +#define STORE_MAC_ADDR 0x128 //len=6+1 +#define STORE_SUBNET_ADDR 0x130 //len=4+1 +#define STORE_GATEWAY_ADDR 0x138 //len=4+1 + +#define W5500_STORE_FLAG 0x5A + + + + +//-------------------------------------------------------------------- +static void w5500_set_mac_addr(void){ + memcpy(ConfigMsg.mac,tcp_ip.mac_addr, 6);// memcpy(ConfigMsg.mac, mac, 6); + setSHAR(ConfigMsg.mac); +} + +static void w5500_set_ip_addr(void){ + memcpy(ConfigMsg.lip,tcp_ip.ip_addr,4); + setSIPR(ConfigMsg.lip); +} + +static void w5500_set_sub_addr(void){ + memcpy(ConfigMsg.sub,tcp_ip.subnet_mask,4); + setSUBR(ConfigMsg.sub); +} + +static void w5500_set_getway_addr(void){ + memcpy(ConfigMsg.gw,tcp_ip.gateway,4); + setGAR(ConfigMsg.gw); +} + + + +/* +设置w5500的网络参数!!! +*/ +static void setting_w5500_parameter(void) +{ + memcpy(ConfigMsg.mac,tcp_ip.mac_addr, 6);// memcpy(ConfigMsg.mac, mac, 6); + setSHAR(ConfigMsg.mac); /**/ + memcpy(DHCP_GET.mac, tcp_ip.mac_addr, 6);// memcpy(DHCP_GET.mac, mac, 6); + + //复制定义的配置信息到配置结构体/ + memcpy(ConfigMsg.mac, tcp_ip.mac_addr, 6); + + + memcpy(ConfigMsg.lip,tcp_ip.ip_addr,4); + memcpy(ConfigMsg.sub,tcp_ip.subnet_mask,4); + memcpy(ConfigMsg.gw,tcp_ip.gateway,4); + + memcpy(ConfigMsg.dns,dns_server,4); + + /*将IP配置信息写入W5500相应寄存器*/ + setSUBR(ConfigMsg.sub); + setGAR(ConfigMsg.gw); + setSIPR(ConfigMsg.lip); +} + + + +/* +#define STORE_IP_ADDR 0x120 //len=4+1 +#define STORE_MAC_ADDR 0x128 //len=6+1 +#define STORE_SUBNET_ADDR 0x130 //len=4+1 +#define STORE_GATEWAY_ADDR 0x138 //len=4+1 +* 处理来自sdk/PC的配置参数信息 +*/ +void _0x61_tcpip_sub(const unsigned char *rxpc) +{ + unsigned char ack_buf[32],ack_len,wtmp[8]; + unsigned char op_flag =0; + + switch(rxpc[4]){ + + case 2: + memcpy(tcp_ip.ip_addr,rxpc+5,IP_ADDR_LEN); + w5500_set_ip_addr();// + memcpy(wtmp+1,tcp_ip.ip_addr,IP_ADDR_LEN); + wtmp[0] =W5500_STORE_FLAG; + platform.e2prom_write(STORE_IP_ADDR,wtmp,IP_ADDR_LEN+1); + case 1: //read ip addr + ack_buf[0] =1; + memcpy(ack_buf+1,tcp_ip.ip_addr,IP_ADDR_LEN); + ack_len =IP_ADDR_LEN; + op_flag =1; + break; + + case 4: + memcpy(tcp_ip.mac_addr,rxpc+5,MAC_ADDR_LEN); + w5500_set_mac_addr();// + memcpy(wtmp+1,tcp_ip.mac_addr,MAC_ADDR_LEN); + wtmp[0] =W5500_STORE_FLAG; + platform.e2prom_write(STORE_MAC_ADDR,wtmp,MAC_ADDR_LEN+1); + case 3: //read mac_addr addr + ack_buf[0] =3; + memcpy(ack_buf+1,tcp_ip.mac_addr,MAC_ADDR_LEN); + ack_len =MAC_ADDR_LEN; + op_flag =1; + break; + + case 6: + memcpy(tcp_ip.subnet_mask,rxpc+5,SUBNET_ADDR_LEN); + w5500_set_sub_addr(); + memcpy(wtmp+1,tcp_ip.subnet_mask,SUBNET_ADDR_LEN); + wtmp[0] =W5500_STORE_FLAG; + platform.e2prom_write(STORE_SUBNET_ADDR,wtmp,SUBNET_ADDR_LEN+1); + case 5: //read subnet_mask addr + ack_buf[0] =5; + memcpy(ack_buf+1,tcp_ip.subnet_mask,SUBNET_ADDR_LEN); + ack_len =SUBNET_ADDR_LEN; + op_flag =1; + break; + + case 8: + memcpy(tcp_ip.gateway,rxpc+5,GATEWAY_ADDR_LEN); + w5500_set_getway_addr(); + memcpy(wtmp+1,tcp_ip.gateway,GATEWAY_ADDR_LEN); + wtmp[0] =W5500_STORE_FLAG; + platform.e2prom_write(STORE_GATEWAY_ADDR,wtmp,GATEWAY_ADDR_LEN+1); + case 7: //read gateway addr + ack_buf[0] =7; + memcpy(ack_buf+1,tcp_ip.gateway,GATEWAY_ADDR_LEN); + ack_len =GATEWAY_ADDR_LEN; + op_flag =1; + break; + + default:break; + }//sw + + if(op_flag){ + user__pc_cmd_ack(0x61,12,ack_buf,ack_len+1); + } +} + + +/* +* 从E2prom中的指定位置读取W5500的参数,用于上电初始化 +* 初始化设置W5500 : + setting parameter; +*/ +static void read_w5500_parameter(void) +{ + unsigned char tmp[8]; + //12 TCP IP settting + //ip + platform.e2prom_read(STORE_IP_ADDR,tmp,IP_ADDR_LEN+1); + if(tmp[0] ==W5500_STORE_FLAG ){ + memcpy(tcp_ip.ip_addr,tmp+1,IP_ADDR_LEN); + } + else{ + tcp_ip.ip_addr[0] = 192; + tcp_ip.ip_addr[1] = 168; + tcp_ip.ip_addr[2] = 0; + tcp_ip.ip_addr[3] = 12; + } + + //mac + platform.e2prom_read(STORE_MAC_ADDR,tmp,MAC_ADDR_LEN+1); + if( tmp[0] ==W5500_STORE_FLAG ){ + memcpy(tcp_ip.mac_addr,tmp+1,MAC_ADDR_LEN); + } + else{ + tcp_ip.mac_addr[0] = 0x00; + tcp_ip.mac_addr[1] = 0x08; + tcp_ip.mac_addr[2] = 0xdc; + tcp_ip.mac_addr[3] = 0x11; + tcp_ip.mac_addr[4] = 0x11; + tcp_ip.mac_addr[5] = 0x11; + } + + //subnet + platform.e2prom_read(STORE_SUBNET_ADDR,tmp,SUBNET_ADDR_LEN+1); + if(tmp[0] == W5500_STORE_FLAG ){ + memcpy(tcp_ip.subnet_mask,tmp+1,SUBNET_ADDR_LEN); + } + else{ + tcp_ip.subnet_mask[0] = 255; + tcp_ip.subnet_mask[1] = 255; + tcp_ip.subnet_mask[2] = 255; + tcp_ip.subnet_mask[3] = 0; + } + + //gateway + platform.e2prom_read(STORE_GATEWAY_ADDR,tmp,GATEWAY_ADDR_LEN+1); + if(tmp[0] ==W5500_STORE_FLAG ){ + memcpy(tcp_ip.gateway,tmp+1,GATEWAY_ADDR_LEN); + } + else{ + tcp_ip.gateway[0] = 200; + tcp_ip.gateway[1] = 200; + tcp_ip.gateway[2] = 100; + tcp_ip.gateway[3] = 1; + } + +} + + + + +/* +* 初始化W5500 +* 初始化io控制; rest ; setting ip mac。。。 +*/ +void w5500_init(void) +{ + if( !function.TCPIP__SW) return ; + + gpio_for_w5500_config(); /*初始化MCU相关引脚*/ + reset_w5500(); /*硬复位W5500*/ + + //useing to test spi communication;add by Gavin + //w5500_ver = IINCHIP_READ(VERSIONR); + +// PHY_check(); /*检查网线是否接入*/ +// set_w5500_mac(); /*配置MAC地址*/ +// set_w5500_ip(); /*配置IP地址*/ + read_w5500_parameter(); + setting_w5500_parameter();// + + socket_buf_init(txsize, rxsize); /*初始化8个Socket的发送接收缓存大小*/ +} + + + + + + + + diff --git b/Base_core/Ethernet/W5500/w5500_conf.h a/Base_core/Ethernet/W5500/w5500_conf.h new file mode 100644 index 0000000..7491d17 --- /dev/null +++ a/Base_core/Ethernet/W5500/w5500_conf.h @@ -0,0 +1,106 @@ +#ifndef _W5500_CONF_H_ +#define _W5500_CONF_H_ + +#include "stm32f4xx.h" +#include "stdio.h" +#include "types.h" +#define __GNUC__ + +typedef void (*pFunction)(void); + +extern uint8 remote_ip[4]; /*远端IP地址*/ +extern uint16 remote_port; /*远端端口号*/ +extern uint16 local_port; /*定义本地端口*/ +extern uint8 use_dhcp; /*是否使用DHCP获取IP*/ +extern uint8 use_eeprom; /*是否使用EEPROM中的IP配置信息*/ + +//#define STM32_SPI1 +#define STM32_SPI2 + +/*W5500接STM32的 SPI1硬件接线定义*/ +// W5500_SCS ---> STM32_GPIOA4 /*W5500的片选管脚*/ +// W5500_SCLK ---> STM32_GPIOA5 /*W5500的时钟管脚*/ +// W5500_MISO ---> STM32_GPIOA6 /*W5500的MISO管脚*/ +// W5500_MOSI ---> STM32_GPIOA7 /*W5500的MOSI管脚*/ +// W5500_RESET ---> STM32_GPIOC0 /*W5500的RESET管脚*/ +// W5500_INT ---> STM32_GPIOC1 /*W5500的INT管脚*/ + +/*W5500接STM32的 SPI2硬件接线定义*/ +// W5500_SCS ---> STM32_GPIOB12 /*W5500的片选管脚*/ +// W5500_SCLK ---> STM32_GPIOB13 /*W5500的时钟管脚*/ +// W5500_MISO ---> STM32_GPIOB14 /*W5500的MISO管脚*/ +// W5500_MOSI ---> STM32_GPIOB15 /*W5500的MOSI管脚*/ +// W5500_RESET ---> STM32_GPIOB9 /*W5500的RESET管脚*/ +// W5500_INT ---> STM32_GPIOC6 /*W5500的INT管脚*/ + +#define FW_VER_HIGH 1 +#define FW_VER_LOW 0 +#define ON 1 +#define OFF 0 +#define HIGH 1 +#define LOW 0 + +#define MAX_BUF_SIZE 1460 /*定义每个数据包的大小*/ +#define KEEP_ALIVE_TIME 30 /*30sec*/ +#define TX_RX_MAX_BUF_SIZE 2048 +#define EEPROM_MSG_LEN sizeof(EEPROM_MSG) + +#define IP_FROM_DEFINE 0 /*使用初始定义的IP信息*/ +#define IP_FROM_DHCP 1 /*使用DHCP获取IP信息*/ +#define IP_FROM_EEPROM 2 /*使用EEPROM定义的IP信息*/ +extern uint8 ip_from; /*选择IP信息配置源*/ +#pragma pack(1) +/*此结构体定义了W5500可供配置的主要参数*/ +typedef struct _CONFIG_MSG +{ + uint8 mac[6]; /*MAC地址*/ + uint8 lip[4]; /*local IP本地IP地址*/ + uint8 sub[4]; /*子网掩码*/ + uint8 gw[4]; /*网关*/ + uint8 dns[4]; /*DNS服务器地址*/ + uint8 rip[4]; /*remote IP远程IP地址*/ + uint8 sw_ver[2]; /*软件版本号*/ +}CONFIG_MSG; +#pragma pack() + +#pragma pack(1) +/*此结构体定义了eeprom写入的几个变量,可按需修改*/ +typedef struct _EEPROM_MSG +{ + uint8 mac[6]; /*MAC地址*/ + uint8 lip[4]; /*local IP本地IP地址*/ + uint8 sub[4]; /*子网掩码*/ + uint8 gw[4]; /*网关*/ +}EEPROM_MSG_STR; +#pragma pack() + +extern EEPROM_MSG_STR EEPROM_MSG; +extern CONFIG_MSG ConfigMsg; +extern uint8 dhcp_ok; /*DHCP获取成功*/ +extern uint32 dhcp_time; /*DHCP运行计数*/ +extern vu8 ntptimer; /*NPT秒计数*/ + +/*MCU配置相关函数*/ +void gpio_for_w5500_config(void); /*SPI接口reset 及中断引脚*/ +void timer2_init(void); /*STM32定时器2初始化*/ +void timer2_isr(void); /*定时器中断执行的函数*/ +void reboot(void); /*STM32软复位*/ +void write_config_to_eeprom(void); /*写配置信息到EEPROM中*/ +void read_config_from_eeprom(void); /*从EEPROM中读出信息*/ + +/*W5500SPI相关函数*/ +void IINCHIP_WRITE( uint32 addrbsb, uint8 data); /*写入一个8位数据到W5500*/ +uint8 IINCHIP_READ(uint32 addrbsb); /*从W5500读出一个8位数据*/ +uint16 wiz_write_buf(uint32 addrbsb,uint8* buf,uint16 len); /*向W5500写入len字节数据*/ +uint16 wiz_read_buf(uint32 addrbsb, uint8* buf,uint16 len); /*从W5500读出len字节数据*/ + +/*W5500基本配置相关函数*/ +void reset_w5500(void); /*硬复位W5500*/ +void set_w5500_mac(void); /*配置W5500的MAC地址*/ +void set_w5500_ip(void); /*配置W5500的IP地址*/ + +/*需要用定时的的应用函数*/ +void dhcp_timer_init(void); /*dhcp用到的定时器初始化*/ +void ntp_timer_init(void); /*npt用到的定时器初始化*/ + +#endif diff --git b/Base_core/core_lib/_debug_core_.h a/Base_core/core_lib/_debug_core_.h new file mode 100644 index 0000000..06541bd --- /dev/null +++ a/Base_core/core_lib/_debug_core_.h @@ -0,0 +1,101 @@ + + +//姣忎釜鏁版嵁鍖呴噷鏈澶氬寘鎷殑閿洏淇℃伅涓暟 +#define KP_MAX_IN_PKT 9 + +//鏈澶氱洃娴100鍙敭鐩; 鏈澶氱洃娴100鏉″唴瀹,濡傛灉闇瑕佺殑璇 +#define _DBG_KP_CNT (100+1) +//鏈澶氳褰 閿洏SN鍑洪敊 鐨勪釜鏁 +#define _DBG_ERR_CNT 8 + + +#define _DBG_KP_IDSN_CONTINUE //閿洏鏄畝鍖朣N 1-100;涓嶅畾涔夊氨鏄棤搴廠N閿洏 +#ifdef _DBG_KP_IDSN_CONTINUE + #define _DBG_IDSN_LEN 4 + #define _DBG_VALID_KP_CNT 100//47 +#endif + +//鐩戞祴棰樺彿 +#define _DBG_TITLE_CNT 201 + #define _DBG_ERR_TITLE_CNT 5 + + +/* +*浠ラ敭鐩樹负瀵硅薄 +*/ +struct _debug_keypad_info_STR +{ + //witch keyad + unsigned short rx_kp_cnt; + unsigned short ack_kp_cnt; + //witch pc + unsigned short tx_pc_cnt; + unsigned short acked_pc_cnt; + unsigned char kp_idsn[6]; + + #if _DBG_TITLE_CNT != 0 + unsigned char rpt_title_NO[_DBG_TITLE_CNT]; + unsigned char title_NO[_DBG_TITLE_CNT]; + unsigned char title_cnt; //缁熻鏌愪釜閿洏鎺ユ敹浜嗗灏戝埌棰; + + //璁板綍棰樺瀷閿欒淇℃伅 + unsigned char err_title_NO[_DBG_ERR_TITLE_CNT]; + unsigned char err_title_cnt; + #endif + + #if 0 + unsigned char err_content_unit_cnt; //闇瑕佽褰曢敊璇唴瀹;姝g‘鐨勪笉闇瑕侊紱 + unsigned char err_content[_DBG_ERR_CNT][_DBG_CONTENT_LEN]; + unsigned char right_content_unit_cnt; //姝g‘鍐呭鐨勫崟浣嶆暟锛 + unsigned char content_unit[_DBG_CONTENT_UNIT_CNT]; //妫娴嬪唴瀹圭殑鍗曚綅鏁帮紱姣斿100閬撴祴楠岄 + #endif +}; + + +//鍗曚釜鏁版嵁鍖呯粨鏋勪綋; cnt-閿洏涓暟锛涢敭鐩樻暟鎹 +struct _debug_rpt_pkt_STR +{ + unsigned char kp_data[KP_MAX_IN_PKT]; + unsigned char kp_cnt; +}; + + + + +struct _debug_core_STR +{ + struct _debug_keypad_info_STR kp_info[_DBG_KP_CNT]; + unsigned char idsn_len; //2-id;4-sn;6-sn + unsigned char valid_kp_cnt; //瀹為檯闇瑕佹娴嬮敭鐩樹釜鏁帮紱鏈澶100锛 0琛ㄧず娌℃湁寮鍚洃娴嬪姛鑳斤紱 + + unsigned char rx_idsn_err[_DBG_ERR_CNT][6]; //鎺ユ敹鏃剁殑idsn鍑洪敊鍦ㄦ璁板綍锛屽叾浠栭敊璇畾涔夋垚閿洏灞炴э紒锛 + unsigned char rx_idsn_err_cnt; + unsigned char ack_idsn_err[_DBG_ERR_CNT][6]; + unsigned char ack_idsn_err_cnt; + + //tx pc/sdk + unsigned char txpc_idsn_err[_DBG_ERR_CNT][6]; + unsigned char txpc_idsn_err_cnt; + struct _debug_rpt_pkt_STR rpt_pkt[11]; + + + + #if 0 + unsigned char dist_idsn[_DBG_KP_CNT][6]; + unsigned char dist_content[_DBG_CONTENT_LEN]; //瀹為檯鐩戞祴鐨勫唴瀹 'AAA' + unsigned char dist_content_len; //妫娴嬪唴瀹圭殑闀垮害锛3bytes + unsigned char dist_content_unit_cnt; //姣忎釜閿洏妫娴嬪唴瀹圭殑涓暟锛屾瘮濡30閬撴祴楠岄 ;鏈澶100锛0琛ㄧず涓嶉渶瑕佹娴嬪唴瀹癸紒锛 + #endif +}; + +extern struct _debug_core_STR _dbg_core_; + + + + + + + + + + diff --git b/Base_core/core_lib/base_core.h a/Base_core/core_lib/base_core.h new file mode 100644 index 0000000..66dbdcf --- /dev/null +++ a/Base_core/core_lib/base_core.h @@ -0,0 +1,819 @@ + + +#ifndef _BASE_CORE_H_ +#define _BASE_CORE_H_ + +#include "base_config.h" + +#ifdef _OLD_CONFIG_ + +//#define RF_5G8 //鍖哄埆浜庡父瑙2.4G +/*鏀寔60璺殑璇█鍗忚鍜30璺殑鍗忚鏄笉鍚岀殑!! +*鍙戦佷俊鏍囩殑鍛ㄦ湡涓暟鍙婂鐞嗛兘鏈夌粏寰樊鍒! +a,鍒濆鐗堟湰锛 Cycle 13*2.5ms; Max 30keypad; 48bytes voice/packet ->default + 涓棿鐗堟湰 Cycle 28ms; Max 60keypad; 52bytes voice/packet ->#define KEYPAD60 + 鍙潬浼犺緭鐗堟湰: Cycle 28ms; Max 60keypad; 48bytes voice/packet ->#define KEYPAD60 && define VOICE_PROTOCOL_3RD +b, +*/ +#ifdef RF_5G8 + #define KEYPAD60 //绗簩鐗堣闊冲崗璁-60璺 + #define VOICE_PROTOCOL_3RD //绗笁鐗堣闊冲崗璁-60璺+鍙潬浼犺緭(鍩轰簬绗簩鐗) + #define BUF_ALERT2 //鏀寔閿洏閲嶄紶璇煶鍗曠嫭杩炵画鐐瑰悕 + /* + 寮鍚瀹忓畾涔夛紝鎶曠エ鏁版嵁澶勭悊(rf鎺ユ敹鍜宺pt to pc鐨勬姇绁ㄦ暟鎹)灏卞湪涓荤▼搴忓惊鐜腑杩涜锛屽惁鍒欏湪涓柇閲岀洿鎺ュ鐞(榛樿) */ + #define MAINLOOP_PROCESS_VOTE +#endif + + + + +//#define RF_MODUAL_MONITOR //rf 妯″潡鐩戞祴 + +//------------------- 2020.11 閲嶅啓debug ---------------------------------------------------------- +/* +* +*/ +//#define _DEBUG_CORE_ //鎬诲紑鍏 +//#define _DBG_2G4_KP_ //涓庨敭鐩樼殑閫氫俊 +//#define _DBG_VOICE_KP //鐩戞祴閿洏鏁版嵁锛屽寘鎷闊冲拰闈炶闊虫ā寮;T2璇█鍩虹珯 + +//#define _SDK_OFFLINE_ //sdk鏂仈鍚庯紝鍩虹珯寮哄埗鍏抽棴鎵鏈夐敭鐩; 鐢ㄤ簬閰嶅悎鍋氶敭鐩樼數閲忔祴璇;; +//#define _SDK_SYSMODE0_KEEPTIMER_ //sysmode0淇濇寔涓娈垫椂闂村悗鍏抽棴鎵鏈夐敭鐩 + + + + + + + +//*--------- +//* 鍙兘寮鍏,绂佹淇敼!!! +//*----------------------- +#define TYPE_T2 10 + +#define TYPE_EVS200 50 +#define TYPE_EVS100 51 + +#define TYPE_CRS200 40 +#define TYPE_CRS200_NL 41 +#define TYPE_CRS200_433 30 +#define TYPE_C100 41 +//-------------------------------------- +/** +*EVS200: +* 1,E11 - a,4涓ā鍧楅兘鍙戝熀纭淇℃爣锛屾姇绁ㄤ俊鏍囧拰ack; b,闇瑕佹妸鍩虹淇℃爣鍜屾姇绁ㄤ俊鏍囬兘淇敼鎴28Bytes; //20200616 +* 2,G1 - a,AES鍔犲瘑 淇℃爣闇瑕佸彂閫32bytes;b,鎶曠エ淇℃爣涓甫涓婚鐐逛俊鎭紱c,瀹归噺鍧囪 銆 +* +*CRS200: +* 1,T1Lite - 鍦ㄦ姇绁ㄤ俊鏍噒mp32蹇呴』鏄俊鏍囩殑crc鏍¢獙鐨勪綆瀛楄妭! +* +*EVS200_433锛 +* 1,voxm - 杞彂鏁版嵁蹇呴』瑕佸姞crc鏍¢獙!! +*/ + +#endif + + +//20200930 //鎵╁睍鎶曠エ淇℃爣涓嬶紝鑷畾涔夐鍨嬪拰鎸囧畾绛旈鍣ㄥ姛鑳藉彔鍔狅紝闇瑕佷袱涓紦鍐插尯淇濆瓨;鐗规畩澶勭悊!!!!! +#define EXTEND_VBEACON2 + +/* +*鍩虹珯鏍稿績鍥轰欢鐨勭増鏈紝 +*/ +#ifdef RF_5G8 +#define CORE_VER0 4 //stm32F4 +#define CORE_VER1 5 //5.8G +#define CORE_VER2 0 +#define VOTE_BEACON_64BYTE //64瀛楄妭鐨勬姇绁ㄤ俊鏍囷紝甯歌鏃犵嚎閫氫俊鍙敤32瀛楄妭 +#else +#define CORE_VER0 4 //stm32F4 +#define CORE_VER1 2 //2.4G +#define CORE_VER2 0 + +//#define CORE_VER0 1 //stm32F1 +//#define CORE_VER1 2 +//#define CORE_VER2 0 +#endif + + +//-------------------------- kernel status -------------------------------------------- +/* +* +*/ +#include "base_core_user.h" +struct kernel_STR{ + unsigned char sdk_connect_status; + unsigned short sdk_connect_count; + unsigned char sdk_connect_status_acc; + unsigned short sdk_connect_count_acc; + + unsigned char pc_led_count; + unsigned char rf_led_status; + unsigned char rf_led_count; + + //unsigned char run_state; //鍐呮牳杩愯鐘舵: //enum core_run_state_ENUM + enum core_run_state_ENUM run_state; //鍐呮牳杩愯鐘舵: + + unsigned char permit_display_flag; //璇煶鍩虹珯鏈夋晥! + unsigned char bill_info[9]; //璁淇℃伅 + unsigned char _20ms_flag; + + unsigned char keypad_crc_flag; //crc杞紑鍏,涓巗dk閫氫俊! + + + unsigned char keypad_online_cnt; //璇█鍩虹珯鏈夋晥! + //debug used + unsigned short rx_buf_overflow; //鎺ユ敹缂撳啿鍖烘孩鍑轰釜鏁; + unsigned short rx_idsnbuf_overflow; //淇濇寔idsn缂撳啿鍖烘孩鍑轰釜鏁; 璇煶妯″紡涓嬫棤鏁; + unsigned short re_rpt_pc_count; //鍩虹珯娌℃湁琚玴c纭锛岄噸鍙戠殑鏁版嵁鍖呬釜鏁 + + + //20200825,澧炲姞澶氶鍨嬪紑濮嬫爣蹇,鐢ㄤ簬鐗规畩ack + unsigned char multi_title_flag; + //20200914 鎵╁睍鎶曠エ淇℃爣 + unsigned char ext_vbeacon_onoff_flag; + unsigned char ext_vbeacon_sysmode_change_flag; + //#ifdef EXTEND_VBEACON2 + unsigned char ext_vbeacon_type1_flag; //鑷畾涔夐鍨----A,B,AB + unsigned char ext_vbeacon_type2_flag; //鎸囧畾绛旈鍣 + + unsigned int sysmode0_keeptimer_05S; + + unsigned short custom_rf_sync_code; +// unsigned short tmp1; +// unsigned short tmp2; +// unsigned char tmp3; +// unsigned short tmp4[20]; +}; +extern struct kernel_STR kernel; + + +//get sys mode0 淇濇寔鏃堕棿; +unsigned int get_sysmode0_keeptimer(void); + + +/* +* turn on LED if it stay OFF status; +*called by rcvRF data +*/ +void refresh_rcvRF_indicate(void); + +/* +* indicate led, and update pc connect status +* called by base core rx function */ +void refresh_pc_connect_status(void); +unsigned char get_pc_connect_status_acc(void); +/* +* timer monitor pc connect status +*called by 20ms timer +*/ +void timer_20ms_function(void); + +/* +* get pc connect status */ +unsigned char get_pc_connect_status(void); + + +unsigned char get_datapos(void); + +unsigned char get_base_status(void); +/* +* +*/ +unsigned char get_permit_dispaly_status(void); + + +//-------------------- base core ------------------------------- + +#ifdef RF_5G8 + #define USB_REPORT_MAX 1024 +#else + #define USB_REPORT_MAX 64 +#endif + +/* +鍒濆鍖栧熀绔欐牳蹇冪殑鍙傛暟*/ +void base_core_init_all(void); + +/* +鍩虹珯鏍稿績鍑芥暟鍦ㄤ富绋嬪簭寰幆涓璋冪敤*/ +void base_core_main_loop(void); + +/* +璁剧疆纭欢淇℃伅*/ +void set_base_hard_firmware_info(void); + +/*鑾峰彇鐧藉悕鍗曟ā鍧楃紪鍙*/ +unsigned char get_whitelist_rfid(void); + + + + + + +//------------------ timer isr ------------------------------- +/* +鏍稿績闇瑕佺殑瀹氭椂鍣ㄤ腑鏂湇鍔$▼搴*/ +extern void base_core_2ms5_isr(void); +extern void base_core_20ms_isr(void); +extern void base_core_28ms_isr(void); + + + +//---------------------------pc/sdk ---------------------------------- +/* +鍩虹珯鎺ユ敹pc鐨剈sb鏁版嵁锛屼繚瀛樺埌 闃熷垪涓 +姝ゅ嚱鏁拌usb endpoint callback 璋冪敤*/ +unsigned char pcrx_data_save(const unsigned char *pc_buf); +void pcrx_init_queue(void); + +//send data to pc via usb +void base_tx_to_pc_sub(const unsigned char *dt); + + +/* +鍒濆鍖栧鐞 鍩虹珯鍜宻dk/PC鐨勬暟鎹氫俊 +a,鍒濆鍖 鎺ユ敹pc鏁版嵁鐨勯槦鍒 +b,鍒濆鍖 閿洏杞彂缁檖c鐨勬暟鎹槦鍒*/ +void base_process_pc_init(void); + +/* +鍩虹珯澶勭悊pc鏁版嵁鐨勬诲叆鍙 +called by mainloop*/ +void base_process_pc_data(void); + +/* +鍩虹珯鍥炲簲鏉ヨ嚜pc鐨0x60鍛戒护 +input: + type-pc鐨勬暟鎹被鍨 + ack_buf - 鍥炲簲鐨刡uf + type_data_len - 鍥炲簲buf鐨勯暱搴*/ +void pc_cmd_0x60_ack(unsigned char type, unsigned char *ack_buf,unsigned char type_data_len); +/* +鍩虹珯澶勭悊鏉ヨ嚜pc鐨0x60鍛戒护 +1,澶嶅埗鐩稿叧鍙傛暟 +2锛屼繚瀛樺埌E2prom +3, 鍥炲簲pc*/ +unsigned char pc_cmd_0x60_process(const unsigned char *rxpc); + +/* +鍩虹珯澶勭悊鏉ヨ嚜pc鐨0x60鍛戒护 +1,澶嶅埗鐩稿叧鍙傛暟 +2锛屼繚瀛樺埌E2prom +3, 鍥炲簲pc*/ +unsigned char pc_cmd_0x61_process(const unsigned char *rxpc); +/* +鍩虹珯鍥炲簲鏉ヨ嚜pc鐨0x61鍛戒护 */ +void pc_cmd_0x61_ack(unsigned char type,const unsigned char *ack_buf,unsigned char type_data_len); + + +//杞彂 缁橮C +/* +鍩虹珯杞彂 keypad鐩存帴缁 pc鐨勬暟鎹 +濡傛杞彂鏄惁浼氬拰姝e父鏁版嵁鍐茬獊 锛燂紵锛 濡備綍閬垮厤 +called by main loop , */ +unsigned char keypad_transfer2pc_data_fetch(void); +/* +鍩虹珯淇濆瓨 keypad鐩存帴缁 pc 鐨勬暟鎹 +called by 鍩虹珯澶勭悊鎺ユ敹閿洏rf鏁版嵁鐨勫嚱鏁 */ +void keypad_transfer2pc_data_save(const unsigned char *trans2kp); + +unsigned short calc_custom_rf_sync_code(const unsigned char*input); + +//-------------------鍩虹珯鐩稿叧鍑芥暟 --------------------------------------- +/* +澶嶅埗閰嶅鐮 */ +void get_base_match_code(unsigned char *mac); + +#define log_mode_is_SN (get_base_log_mode()>3) +#define log_mode_is_ID (get_base_log_mode()<=3) +#define log_mode_is_CRS2 ( log_mode_is_SN && function.crs2__SW ) +#define log_mode_is_free_match ( (get_base_log_mode()==3)||(get_base_log_mode()==6) ) +#define log_mode_is_WHITELIST (function.whitelist__SW &&( (get_base_log_mode()==8)||(get_base_log_mode()==9)) ) + + +unsigned char assert_base_log_mode(void); +unsigned char get_base_log_mode(void); + +/*鑾峰彇鍩虹珯涓婚鐐规ā鍧楃紪鍙*/ +unsigned char get_mainRF_usr_id(void); +/* +鑾峰彇 涓婚鐐瑰搴旂殑纭欢缂栧彿锛侊紒锛侊紒, */ +unsigned char get_main_rf_hard_id(void); + +unsigned char get_base_main_rfchannel(void); +void set_base_main_rfchannel(unsigned char freq); +/* +鍒ゆ柇/闄愬埗鍩虹珯棰戠偣*/ +unsigned char assert_base_channel(void); + +/* +鍒ゆ柇鍩虹珯id鏄惁鍚堟硶*/ +unsigned char assert_base_id(void); +/* +鑾峰彇鍩虹珯鐨刬d*/ +unsigned char get_base_id(void); + +/* +* sdk璁剧疆鐨勬墿灞曞熀纭淇℃爣涔嬪悗锛屽氨寮鍚拰鏍囧噯鍩虹淇℃爣浜ゆ浛鍙戦; */ +void set_ext_basicbeacon_startup_flag(unsigned char); + +//============================================ keypad ============================================================= +/* +CRC璁剧疆 +*/ +void set_keypad_crc_config(unsigned char flag); +unsigned char get_keypad_crc_config(void); +unsigned char keypad_crc_check(void); + + + + +/* +鍒ゆ柇鏄惁鍦ㄥ閲忓潎琛℃ā寮*/ +unsigned char get_ext_basicbeacon_startup_flag(void); + +///* +//鍩虹珯鍙戠粰閿洏鐨勬暟鎹細 +//鍩虹淇℃爣锛屾姇绁ㄤ俊鏍囧拰鎶曠エ鏁版嵁鐨勭‘璁*/ +void base_tx_to_keypad_sub(unsigned char *buf,unsigned char rf_id); + +/* +鍜屼笂杩板嚱鏁扮浉姣旓紝姝ゅ嚱鏁颁笓闂ㄧ粰澶栭儴浣跨敤 +rf_id琛ㄧず鐨勬槸 鏃犵嚎妯″潡鐨勭‖浠舵爣鍙 +*/ +void send_to_keypad_user_hardID(unsigned char *buf,unsigned char rf_hard_id); + +/* +鍒濆鍖 閿洏鐩稿叧 +a, 鍒濆鍖栨帴鏀堕敭鐩樼殑闃熷垪 +b,鍒濆鍖栬浆鍙戠粰閿洏鐨勬暟鎹槦鍒 +called by main init */ +void base_process_keyapad_init(void); + +/* +鍩虹珯澶勭悊鏉ヨ嚜閿洏 鏁版嵁 鎬诲叆鍙 +灏嗛敭鐩樻暟鎹垎鎴4涓被鍨嬶細 + id 妯″紡 + sn 妯″紡 + CRS2 妯″紡 + 杞彂鑷硃c鐨勬暟鎹 +called by main loop */ +void keypad_rf_data_process(void); + +void keypad_rf_data_process_NO_fifo(unsigned char *tmp); + +/* ------------------ +鍩虹珯鍙戦佷俊鏍/鏃跺簭 缁欓敭鐩 +姝ゅ嚱鏁2.5ms琚皟鐢ㄤ竴娆 +called by 2.5ms timer*/ +void base_tx_keypad_beacon(void); + + +/* +鍩虹珯鎺ユ敹閿洏鏁版嵁锛屽皢閿洏鏁版嵁淇濆瓨鍒 闃熷垪涓 +琚 鏃犵嚎涓柇鍑芥暟璋冪敤 */ +unsigned char keypad_rf_data_save( unsigned char *rf_data); + + +//-pc 杞彂 keypad +/* +鍩虹珯鍙戦 pc鐩存帴缁 keypad 鐨勬暟鎹 +called by 淇℃爣鍙戦佸嚱鏁 base_tx_keypad_beacon() +return : + 0- 娌℃湁瑕佽浆鍙戠殑鏁版嵁鎴栬 杩炵画杞彂鏃堕棿鍒 + 1- 杩樻湁鏁版嵁鎴栬呰浆鍙戠瓑寰咃紝 */ +unsigned char pc_transfer2keypad_data_fetch(void); + +/* +鍩虹珯淇濆瓨pc鐩存帴杞彂缁欓敭鐩樼殑鏁版嵁 +called by 鍩虹珯澶勭悊pc鏁版嵁鐨勫嚱鏁 */ +unsigned char pc_transfer2keypad_data_save(unsigned char *trans2kp); + + + +//-------澶勭悊閿洏id/sn鐩稿叧鍑芥暟 +struct keypad_idsn_STR{ + #define SN_LEN 6 + unsigned char number; + unsigned char idsn[10][SN_LEN]; +}; +extern struct keypad_idsn_STR keypad_idsn; + + + +/*------------------------------------------------- +澶氭棤绾挎ā鍧楃浉鍏冲弬鏁!(鍏煎鍗曟ā鍧)*/ +struct multi_modual_STR{ + unsigned char modual_id[4]; //[0]-涓婚鐐规ā鍧楃紪鍙凤紝 + unsigned char modual_chan[4]; //涓巗dk璁剧疆鐣岄潰瀵瑰簲 + volatile unsigned char count; //涓巗dk璁剧疆鐣岄潰瀵瑰簲 + volatile unsigned char hard_rf_modual_cnt;//function路.h涓缃棤绾挎ā鍧楃殑涓暟! + + unsigned char main_index; //涓绘ā鍧楀湪modual_id[]涓殑涓嬫爣浣嶇疆index + unsigned char whitelist_index; //鐧藉悕鍗曟ā鍧楀湪modual_id[]涓殑涓嬫爣浣嶇疆index + struct keypad_idsn_STR multi_idsn[4]; //璁板綍鎺ユ敹閿洏鐨刬d/sn /max 4 rf modual +}; +extern struct multi_modual_STR multi; + + +extern void multi_chan_init(void); +/* +璁剧疆鏃犵嚎妯″潡鐨勯鐐*/ +extern void base_set_rf_freq(unsigned char rf_id); + + +/* +璁剧疆澶氶鐐规椂鐨勫鐞嗭細 called by pc璁剧疆鍗曟ā鍧楁搷浣滄椂 + a 鍚屾鍒板棰戠偣 + b 澶嶅埗鍒板唴鏍竚ulti鍙橀噺 + c E2prom淇濆瓨涓や釜棰戠偣*/ +void process_setup_single_chan(unsigned char single_rf); + +/* +璁剧疆澶氶鐐规椂鐨勫鐞嗭細 called by multi setup + a 鍚屾鍒板崟棰戠偣 + b 澶嶅埗鍒板唴鏍竚ulti鍙橀噺 + c E2prom淇濆瓨涓や釜棰戠偣*/ +void process_setup_multi_chan(unsigned char multi_freq); + +/* +鏍规嵁鏉ヨ嚜涓柇鐨勬ā鍧楀簭鍙锋煡璇㈣嚜宸辩殑搴忓彿 +return :鏌ヨ鍒颁簡灏辩洿鎺ヨ繑鍥炲簭鍙 +0xff -娌℃湁鍦ㄨ〃鏍间腑鏌ヨ鍒般 +called by rx keypad data */ +unsigned char conver_id(unsigned char hard_id); + + +/* +閫氳繃鍗曢鐐瑰叧鑱斿棰戠偣,涓嶅叧鑱旀湁鏁堥鐐逛釜鏁*/ +void single_relevant_to_multi_chan(unsigned char single_chan); + + +void multi_chan_polling(void); + + +unsigned char get_operaion_rf_count(void); + + +//鍩虹珯鑷洃娴媟f妯″潡锛侊紒 +void rf_modual__tx_counter(unsigned char id); +void rf_modual__tx_interrupt_counter(unsigned char id); +void rf_modual__check(void); +void rf_modual_5G8__check(void); +extern unsigned char get_rf_error_cnt(unsigned char *buf); +void rf_error_warning(void); +/* +淇濆瓨閿洏鐨刬d/sn +intput: + idsn--buffer + byteN- id/sn瀛楃涓暟 +return: + 0- fail + 1- OK */ +unsigned char keypad_idsn_save(const unsigned char *idsn,unsigned char cnt,unsigned char rf_id); + +/* +浠庣紦鍐插尯涓彇鍑篿d/sn +intput: + idsn -buffer + byteN-瀛楄妭鏁帮紝2-id,4 sn, 6sn + idsn_cnt -瑕佽鍙杋d/sn鐨勪釜鏁; */ +void keypad_idsn_fetch(unsigned char *idsn,unsigned char byteN,unsigned char idsn_cnt); + + +unsigned char keypad_rf_data_fetch(unsigned char *rf_data); + +/* +娓呴櫎璁板綍閿洏idsn,鍙婃湁鏁堜釜鏁 */ +extern void keypad_idsn_clear(void); + +/* +鍩虹珯鍙戦佷俊鏍囩殑寮鍏, +鏌愪簺鍔熻兘闇瑕佸叧闂 鍩虹珯鍙戦佷俊鏍 +鍩虹珯璇诲彇鍩虹鍙傛暟鍚庡啀寮鍚彂閫佷俊鏍 */ +void base_send_beacon_switch(unsigned char sw); +unsigned char get_base_send_beacon_status(void); + +unsigned char keypad_crs2_mode(const unsigned char *rxkp,unsigned char rf_id); + + +//---------------------------------- 5.8G rf----------------------------------------------------------- + +#ifdef KEYPAD60 +#define KEYPAD_COUNT_MAX 90//60//30 +#define TRANSFER_CYCLE_MAX 9//6//(KEYPAD_COUNT_MAX/10+KEYPAD_COUNT_MAX%10) +#else +#define KEYPAD_COUNT_MAX 30 +#define TRANSFER_CYCLE_MAX 6 //(KEYPAD_COUNT_MAX/10+KEYPAD_COUNT_MAX%10) +#endif + +#define OFFLINE_COUNT 280//154//10 //10涓ぇ鍛ㄦ湡閮芥病鏈夋敹鍒版暟鎹紝璁や负绂荤嚎; + +/* +閿洏淇℃伅缁撴瀯浣 element*/ +typedef struct keypad_info_STR{ + unsigned char id_sn[4]; + unsigned char re_send_slot; + unsigned short offline_count; + unsigned char filt_heart_pkt_count; //杩囨护蹇冭烦鍖呰鏁板櫒 + #ifdef VOICE_PROTOCOL_3RD + unsigned char buf_warnning; + unsigned char ask_resend_state; + #endif + + #ifdef _DBG_VOICE_KP + unsigned short re_send_timers; //璇ラ敭鐩橀噸鍙戠殑娆℃暟 + unsigned short rxkp_cnt; //鏀跺埌閿洏鏁版嵁鍖呯殑涓暟,璇煶鍜岄潪璇煶閮芥湁鏁 + unsigned short ackkp_cnt; //鍩虹珯搴旂瓟閿洏鐨勬鏁帮紝 璇煶鐘舵佷笉搴旂瓟! + unsigned short ackkp_in_cnt; //璁板綍sn娆℃暟涓巃ckkp_cnt瀵瑰簲;璇煶鐘舵佷笅鏃犳晥! + unsigned short tx_pc_cnt; //鎶ュ憡缁檚dk鐨勬鏁; 璇煶鍜岄潪璇煶閮芥湁鏁 + + unsigned short send_beacon_cnt; //鍙戦佷俊鏍囩殑娆℃暟 + #endif + + +}ELEMENT; + +//node +struct link_node_STR{ + ELEMENT element; //keypad info + unsigned char status; + struct link_node_STR *next; +}; + +struct link_queue_STR{ + struct link_node_STR *front; + struct link_node_STR *rear; +}; +//queue +extern struct link_queue_STR keypad_info; + +#ifdef BUF_ALERT2 +#define BUF_GET_T 20 //鍗曠嫭鐐瑰悕鍑犳 +struct buf_alert_get_STR{ + unsigned char Status; + unsigned char SN[4];//瑕佺偣鍚嶇殑SN + unsigned char GetT;//鐐瑰悕璁℃暟 + unsigned char ResendT;//閲嶄紶鍛ㄦ湡 +}; +extern struct buf_alert_get_STR buf_get_info; +#endif + +//link queue basic +void link_queue_init(struct link_queue_STR *queue); +unsigned char link_queue_input(struct link_queue_STR *queue,ELEMENT *ele); +/* +杩炵画鍙栧嚭澶氫釜element 鏁版嵁 +return 鍙栧嚭鐨勪釜鏁; +*/ +unsigned char link_queue_outN(struct link_queue_STR *queue,unsigned char *out,unsigned char offset); +unsigned char link_queue_outN_re_send(struct link_queue_STR *queue,unsigned char *out,unsigned char offset); +unsigned char link_queue_check_re_send(struct link_queue_STR *queue,unsigned char offset); + +void link_queue_check_online(struct link_queue_STR *queue); + +void base_process_5G8_keyapd_init_queue(void); +//void base_process_rx_keypad_data_5G8(unsigned char *buf); + +unsigned char get_link_queue_length(struct link_queue_STR *queue); + +unsigned char get_keypad_count(void); +unsigned char get_link_queue_sn(unsigned char *sn); + +struct link_node_STR *link_queue_find_special_sn(struct link_queue_STR *queue,const unsigned char *sn); + +void re_init_all_resend_slot(void); + +//鐗规畩澶勭悊鎸囧畾杞彂 +void spec_trans__record_sn(unsigned char *trans); +void spec_trans__load_sn(unsigned char *start); + + +//========================================== 涓婃姤鏁版嵁 鍜 闃熷垪澶勭悊鎶曠エ鏁版嵁 ======================================================== +/* +鍒濆鍖栦笂鎶ユ姇绁ㄦ暟鎹 鐩稿叧鍙傛暟 +called by main init */ +extern void vote_data_parameter_init(void); + + +/* +鍔熻兘 锛氬瓨鍌ㄦ姇绁ㄦ暟鎹 +input: + type锛氶敭鐩樻姇绁ㄦ暟鎹殑绫诲瀷锛屽叿浣撹鍗忚鍒嗙被 + *data:鏁版嵁鎸囬拡 + len: 鏁版嵁闀垮害 +return: 1, 瀛樺偍鎴愬姛 锛0-澶辫触; +璋冪敤锛氬熀绔欏鐞嗘帴鏀跺埌鐨勯敭鐩樻暟鎹悎娉曞悗锛岃皟鐢ㄦ鍑芥暟淇濆瓨鎶曠エ鏁版嵁*/ + +extern unsigned char vote_data_store(unsigned char *vote_data); +/* +鍚姩鏁版嵁涓婃姤缁檖c +褰損c鍙戦佸懡浠よ闂熀绔欐槸鍚︽湁鎶曠エ鏁版嵁鏃惰璋冪敤锛侊紒*/ +extern void vote_data_report_startup(void); + +/* +鍩虹珯鍙戦佹姇绁ㄦ暟鎹寘缁檖c +琚 main loop 璋冪敤*/ +extern void vote_data_report_to_pc(void); + +/* +鍔熻兘锛氬鏋滄湁澶氫釜鏁版嵁鍖呴渶瑕佷笂鎶ョ粰pc,姝ゅ嚱鏁扮殑浣滅敤鍦ㄤ簬鎺у埗鏁版嵁鍖呬箣闂寸殑鏃堕棿闂撮殧锛岀洰鍓嶇殑25ms +input: interval + 鏁版嵁鍖呬箣闂寸殑鍙戦侀棿闅旀椂闂 = interval*2.5ms; + +琚2.5ms瀹氭椂鍣ㄨ皟鐢 +*/ +extern void vote_data_report_interval(void); + + +/* +//鍒濆鍖栭槦鍒楃浉鍏冲弬鏁*/ +extern void vote_init_queue(void); + +/* +input: 琚‘璁ょ殑鏁版嵁鍖呭簭鍙锋寚閽.1-10锛屽叿浣撹鍩虹珯鍗忚 + +璋冪敤锛 鍩虹珯鏀跺埌pc鐨勬姇绁ㄦ暟鎹寘纭淇℃伅鍚 璋冪敤姝ゅ嚱鏁帮紒锛*/ +extern void vote_status_clear_confirmed(const unsigned char *confirm); + +/* +function: 澶嶄綅娌℃湁琚‘璁ょ殑鏁版嵁鍖 +1锛岄亶鍘嗛槦鍒椾腑鎵鏈夋暟鎹紝鎵惧埌鏁版嵁鍖呭簭鍙峰湪0< rpt_status<=10 */ +extern void vote_status_reset_NOconfirmed(void); + + +/* +function: 鎵撳寘鏁版嵁涓婃姤缁檚dk +1,濡傛灉Qtype闃熷垪涓虹┖锛岃〃绀烘病鏈変换浣曟姇绁ㄦ暟鎹紝鐩存帴鎶ュ憡 +2锛屽鏋滈槦鍒椾笉涓虹┖锛屽氨浠嶲type闃熷垪澶存墍鎸囧悜鐨凲data鏁版嵁澶村紑濮嬫墦鍖,鐩村埌闃熷垪灏鹃儴锛侊紒 +3锛屽厛鍙戦佷竴涓猼ype鎵鍖呭惈鐨刣ata;鍦ㄤ笅涓娆dk璇㈤棶鏃跺啀鍙戦佷笅涓涓猼ype鎸囧悜鐨勬暟鎹; +return: + 0锛氭病鏈変换浣曟暟鎹簡 ;; + 1锛氬彲鑳借繕鏈夋暟鎹紝闇瑕佺户缁皟鐢ㄦ鍑芥暟锛侊紒 */ +extern unsigned char vote_data_packing( unsigned char pkt_seq); + + +unsigned char get_packing_parameter(unsigned char *type,unsigned char *cnt,unsigned char *len); + +/* +debug only +妫娴嬪師濮嬫姇绁╞uf涓槸鍚﹁繕鏈夋暟鎹! +鑾峰彇鏁版嵁鐘舵乻tatus;鍜屾暟鎹搴旂殑閿洏id/sn */ +unsigned char vote_buf_remain_count(unsigned char *id,unsigned char *status); + + + + +//-------------------------------------- 閫氱敤闃熷垪 鐩稿叧鍑芥暟 ------------------------------- +//20190604 +typedef unsigned char elem_type; +struct fifo_queue_STR{ + //modify by Gavin20191206,//璋冭瘯瓒呰繃20涓猅2閿洏鏃讹紝sdk鐩戞祴鍒板熀绔欎涪澶辨暟鎹弗閲 +// unsigned char front; +// unsigned char rear; +// unsigned char count; + + unsigned short front; + unsigned short rear; + unsigned short count; + elem_type **pdata; +}; + +void queue_init(struct fifo_queue_STR *queue,unsigned char **data,unsigned short node_size,unsigned char data_len); +unsigned char queue_in(struct fifo_queue_STR *queue,const elem_type* data,unsigned short node_size,unsigned char data_len); + +unsigned char queue_out(struct fifo_queue_STR *queue,elem_type* data,unsigned short node_size,unsigned char data_len); +unsigned char queue_out_special(struct fifo_queue_STR *queue,elem_type* data,unsigned short node_size,unsigned char data_len,unsigned char type); +unsigned char queue_out_get_type(struct fifo_queue_STR *queue,unsigned char data_len); + + +//----------------------------------- +void transfer2kp_init_queue(void); +void transfer2pc_init_queue(void); + + + + +//====================== math function =============================================== +/* +鍐呭瓨澶嶅埗*/ +extern void mem_cpy( const unsigned char *src,unsigned char *dist,unsigned char len); + +/* +鍒濆鍖栨暟缁勭殑鍊奸兘涓烘寚瀹氬父閲*/ +extern void mem_set(unsigned char *tmp,unsigned char len,unsigned char set_val); + +/* +姣旇緝涓や釜鏁扮粍瀵瑰簲浣嶆暟鎹槸鍚︾浉绛 +鍙鏈変笉鐩哥瓑灏辫繑鍥0 */ +extern unsigned char mem_compare(const unsigned char *ptr1,const unsigned char *ptr2,unsigned char len); + +/* +姣旇緝鏁扮粍鐨勬瘡涓厓绱犻兘涓庢寚瀹氬父閲忔槸鍚︾浉绛 +鍙鏈変笉鐩哥瓑鐨勫氨 return 0;*/ +extern unsigned char mem_cmp_const(const unsigned char *ptr1,unsigned char len,unsigned char _const); + +/* +鎼滅储鏁扮粍涓厓绱犳槸鍚︽湁鎸囧畾甯搁噺*/ +unsigned char mem_search_const(const unsigned char *ptr1,unsigned char len,unsigned char _const); + + +void Dec_to_Hex(unsigned char *sn,unsigned char len,unsigned char *dec ); + + + +//================================================================ E2prom store =============================================== +#define STORE_FLAG 0xF5 +//store addr// 20190930 update +#define STORE_BASE_CONFIG_ADDR 0 //len=BASE_CONFIG_LEN+1= 8 +#define STORE_BASE_HDINFO_ADDR 0x08 //len==BASE_HDINFO_LEN +1 =14 +#define STORE_BASE_MAC_ADDR 0x18 //len=BASE_MAC_LEN +1 =5 +#define STORE_DFU_ADDR 0x2E //len=1;fixed!!!! +#define STORE_BASIC_BEACON_ADDR 0x30 //len=BASIC_BEACON_LEN+1 =15 +#define STORE_OEM_CODE_ADDR 0x40 //len==8+1=9; +#define STORE_OEM_USER_ADDR 0x50 //len=16*5 zone0-4=5 +#ifndef VOTE_BEACON_64BYTE + #define STORE_VOTE_BEACON_ADDR 0xa0 //len==VOTE_BEACON_LEN+1=27 +#endif +#define STORE_BASE_NAME_ADDR 0xc0 //len==BASE_NAME_LOG_MODE_LEN+1=14 +#define STORE_BASE_ATTRIB_ADDR 0xd0 //len=4+1 +#define STORE_AUX_ATT_ADDR 0xd8 //len=3+1 +#define STORE_OEM_JY_ADDR 0xe0 //len=10+1锛屾瀬鍩 +#define STORE_MULTI_CHAN_ADDR 0xf0 //len=6+1 +#define STORE_BASIC_EXT_BEACON_ADDR 0x100 //len =BASIC_EXT_BEACON_LEN +1 =25 + + +#define STORE_IP_ADDR 0x120 //len=4+1 +#define STORE_MAC_ADDR 0x128 //len=6+1 +#define STORE_SUBNET_ADDR 0x130 //len=4+1 +#define STORE_GATEWAY_ADDR 0x138 //len=4+1 +#define STORE_KP_CRC_CONFIG 0x140 //len=1+1 + +#ifdef VOTE_BEACON_64BYTE + #define STORE_VOTE_BEACON_ADDR 0x150 //len==VOTE_BEACON_LEN+1= 55 ->0x190 +#endif + +//#define E2PROM_ADDR_KEYCODE 0x100 +#define STORE_AES_KEYCODE_ADDR 0x400 //len =32 +#define STORE_AES_CONFIG_ADDR 0x420 //0x120 //len =3 //20200427淇敼锛岃В鍐冲拰IP鍦板潃瀛樺偍鍐茬獊!! +#define STORE_BASE_PWD_ADDR 0x428//len=4 + + + +unsigned char base_write_e2prom( unsigned short addr,const unsigned char * ptr,unsigned char len); +unsigned char base_read_e2prom( unsigned short addr, unsigned char * ptr,unsigned char len); +void base_read_e2prom_parameter(void); + + + + + +//--------------------------- debug_core ----------------------------- + + +#ifdef _DBG_VOICE_KP //5.8G only +void _debug_voice_kp__ack_keypad(unsigned char *sn); +void _debug_voice_kp__tx_pc(unsigned char *sn); +void _debug_voice_kp__init_keypad_parameter(ELEMENT *ele_tmp); +void _debug_voice_kp__init_all_parameter(void); +void _debug_voice_kp__app_get_keypad_debug_info(unsigned char *sn); +void _debug_voice_kp__record_illegal_rx_idsn(unsigned char *sn); + + +void _debug_core__process_5G8_keypad(unsigned char* pc); +#endif + + + + +//---------------------------------------------------------- +//2020.11 +void response_pc_cmd( char type[], unsigned char *ack,unsigned char len); + +void _debug_core__init(void); +void _debug_core__init_parameter_datapos_change(void); + +void _debug_core__record_rxkp_info(const unsigned char *rx_kp); +//void _debug_core__record_ackkp_info(const unsigned char *ack_kp); +void _debug_core__record_ackkp_info(unsigned char mode_type, const unsigned char *ack_kp); +void _debug_core__record_txpc_info(unsigned char pkt_seq, const unsigned char *tx_pc); +void _debug_core__record_pcack_info(unsigned char pkt_seq); +void _debug_core__record_txpc_info_report(const unsigned char *tx_pc); +void _debug_core__printf(void); +void _debug_set_subject(unsigned char val); + +//core +void _debug_core__process_core_info(const unsigned char *pc); + +//sdk offline and sysmode0 keeptimer +void _monitor_sdkoffline_sysmode0(void); +void reset__monitor_sdkoffline_sysmode0(void); + + + + +#endif //_BASE_CORE_H_ + + + diff --git b/Base_core/core_lib/base_core.h~RF432a2ae8.TMP a/Base_core/core_lib/base_core.h~RF432a2ae8.TMP new file mode 100644 index 0000000..5fdc606 --- /dev/null +++ a/Base_core/core_lib/base_core.h~RF432a2ae8.TMP @@ -0,0 +1,798 @@ + + +#ifndef _BASE_CORE_H_ +#define _BASE_CORE_H_ + +#define RF_5G8 //鍖哄埆浜庡父瑙2.4G +/*鏀寔60璺殑璇█鍗忚鍜30璺殑鍗忚鏄笉鍚岀殑!! +*鍙戦佷俊鏍囩殑鍛ㄦ湡涓暟鍙婂鐞嗛兘鏈夌粏寰樊鍒! +a,鍒濆鐗堟湰锛 Cycle 13*2.5ms; Max 30keypad; 48bytes voice/packet ->default + 涓棿鐗堟湰 Cycle 28ms; Max 60keypad; 52bytes voice/packet ->#define KEYPAD60 + 鍙潬浼犺緭鐗堟湰: Cycle 28ms; Max 60keypad; 48bytes voice/packet ->#define KEYPAD60 && define VOICE_PROTOCOL_3RD +b, +*/ +#ifdef RF_5G8 + #define KEYPAD60 //绗簩鐗堣闊冲崗璁-60璺 + #define VOICE_PROTOCOL_3RD //绗笁鐗堣闊冲崗璁-60璺+鍙潬浼犺緭(鍩轰簬绗簩鐗) + /* + 寮鍚瀹忓畾涔夛紝鎶曠エ鏁版嵁澶勭悊(rf鎺ユ敹鍜宺pt to pc鐨勬姇绁ㄦ暟鎹)灏卞湪涓荤▼搴忓惊鐜腑杩涜锛屽惁鍒欏湪涓柇閲岀洿鎺ュ鐞(榛樿) */ + #define MAINLOOP_PROCESS_VOTE +#endif + + +//20200930 //鎵╁睍鎶曠エ淇℃爣涓嬶紝鑷畾涔夐鍨嬪拰鎸囧畾绛旈鍣ㄥ姛鑳藉彔鍔狅紝闇瑕佷袱涓紦鍐插尯淇濆瓨;鐗规畩澶勭悊!!!!! +#define EXTEND_VBEACON2 + + +#define RF_MODUAL_MONITOR //rf 妯″潡鐩戞祴 + +//------------------- 2020.11 閲嶅啓debug ---------------------------------------------------------- +/* +* +*/ +//#define _DEBUG_CORE_ //鎬诲紑鍏 +//#define _DBG_2G4_KP_ //涓庨敭鐩樼殑閫氫俊 +//#define _DBG_VOICE_KP //鐩戞祴閿洏鏁版嵁锛屽寘鎷闊冲拰闈炶闊虫ā寮;T2璇█鍩虹珯 + +//#define _SDK_OFFLINE_ //sdk鏂仈鍚庯紝鍩虹珯寮哄埗鍏抽棴鎵鏈夐敭鐩; 鐢ㄤ簬閰嶅悎鍋氶敭鐩樼數閲忔祴璇;; +//#define _SDK_SYSMODE0_KEEPTIMER_ //sysmode0淇濇寔涓娈垫椂闂村悗鍏抽棴鎵鏈夐敭鐩 + + + + + + + +//*--------- +//* 鍙兘寮鍏,绂佹淇敼!!! +//*----------------------- +#define TYPE_T2 10 + +#define TYPE_EVS200 50 +#define TYPE_EVS100 51 + +#define TYPE_CRS200 40 +#define TYPE_CRS200_NL 41 +#define TYPE_CRS200_433 30 +#define TYPE_C100 41 +//-------------------------------------- +/** +*EVS200: +* 1,E11 - a,4涓ā鍧楅兘鍙戝熀纭淇℃爣锛屾姇绁ㄤ俊鏍囧拰ack; b,闇瑕佹妸鍩虹淇℃爣鍜屾姇绁ㄤ俊鏍囬兘淇敼鎴28Bytes; //20200616 +* 2,G1 - a,AES鍔犲瘑 淇℃爣闇瑕佸彂閫32bytes;b,鎶曠エ淇℃爣涓甫涓婚鐐逛俊鎭紱c,瀹归噺鍧囪 銆 +* +*CRS200: +* 1,T1Lite - 鍦ㄦ姇绁ㄤ俊鏍噒mp32蹇呴』鏄俊鏍囩殑crc鏍¢獙鐨勪綆瀛楄妭! +* +*EVS200_433锛 +* 1,voxm - 杞彂鏁版嵁蹇呴』瑕佸姞crc鏍¢獙!! +*/ + + + +/* +*鍩虹珯鏍稿績鍥轰欢鐨勭増鏈紝 +*/ +#ifdef RF_5G8 +#define CORE_VER0 4 //stm32F4 +#define CORE_VER1 5 //5.8G +#define CORE_VER2 0 +#define VOTE_BEACON_64BYTE //64瀛楄妭鐨勬姇绁ㄤ俊鏍囷紝甯歌鏃犵嚎閫氫俊鍙敤32瀛楄妭 +#else +#define CORE_VER0 4 //stm32F4 +#define CORE_VER1 2 //2.4G +#define CORE_VER2 0 + +//#define CORE_VER0 1 //stm32F1 +//#define CORE_VER1 2 +//#define CORE_VER2 0 +#endif + + +//-------------------------- kernel status -------------------------------------------- +/* +* +*/ +#include "base_core_user.h" +struct kernel_STR{ + unsigned char sdk_connect_status; + unsigned char sdk_connect_count; + + unsigned char pc_led_count; + unsigned char rf_led_status; + unsigned char rf_led_count; + + //unsigned char run_state; //鍐呮牳杩愯鐘舵: //enum core_run_state_ENUM + enum core_run_state_ENUM run_state; //鍐呮牳杩愯鐘舵: + + unsigned char permit_display_flag; //璇煶鍩虹珯鏈夋晥! + unsigned char bill_info[9]; //璁淇℃伅 + unsigned char _20ms_flag; + + unsigned char keypad_crc_flag; //crc杞紑鍏,涓巗dk閫氫俊! + + + unsigned char keypad_online_cnt; //璇█鍩虹珯鏈夋晥! + //debug used + unsigned short rx_buf_overflow; //鎺ユ敹缂撳啿鍖烘孩鍑轰釜鏁; + unsigned short rx_idsnbuf_overflow; //淇濇寔idsn缂撳啿鍖烘孩鍑轰釜鏁; 璇煶妯″紡涓嬫棤鏁; + unsigned short re_rpt_pc_count; //鍩虹珯娌℃湁琚玴c纭锛岄噸鍙戠殑鏁版嵁鍖呬釜鏁 + + + //20200825,澧炲姞澶氶鍨嬪紑濮嬫爣蹇,鐢ㄤ簬鐗规畩ack + unsigned char multi_title_flag; + //20200914 鎵╁睍鎶曠エ淇℃爣 + unsigned char ext_vbeacon_onoff_flag; + unsigned char ext_vbeacon_sysmode_change_flag; + //#ifdef EXTEND_VBEACON2 + unsigned char ext_vbeacon_type1_flag; //鑷畾涔夐鍨----A,B,AB + unsigned char ext_vbeacon_type2_flag; //鎸囧畾绛旈鍣 + + unsigned int sysmode0_keeptimer_05S; + +// unsigned short tmp1; +// unsigned short tmp2; +// unsigned char tmp3; +// unsigned short tmp4[20]; +}; +extern struct kernel_STR kernel; + + +//get sys mode0 淇濇寔鏃堕棿; +unsigned int get_sysmode0_keeptimer(void); + + +/* +* turn on LED if it stay OFF status; +*called by rcvRF data +*/ +void refresh_rcvRF_indicate(void); + +/* +* indicate led, and update pc connect status +* called by base core rx function */ +void refresh_pc_connect_status(void); + +/* +* timer monitor pc connect status +*called by 20ms timer +*/ +void timer_20ms_function(void); + +/* +* get pc connect status */ +unsigned char get_pc_connect_status(void); + + +unsigned char get_datapos(void); + +unsigned char get_base_status(void); +/* +* +*/ +unsigned char get_permit_dispaly_status(void); + + +//-------------------- base core ------------------------------- + +#ifdef RF_5G8 + #define USB_REPORT_MAX 1024 +#else + #define USB_REPORT_MAX 64 +#endif + +/* +鍒濆鍖栧熀绔欐牳蹇冪殑鍙傛暟*/ +void base_core_init_all(void); + +/* +鍩虹珯鏍稿績鍑芥暟鍦ㄤ富绋嬪簭寰幆涓璋冪敤*/ +void base_core_main_loop(void); + +/* +璁剧疆纭欢淇℃伅*/ +void set_base_hard_firmware_info(void); + +/*鑾峰彇鐧藉悕鍗曟ā鍧楃紪鍙*/ +unsigned char get_whitelist_rfid(void); + + + + + + +//------------------ timer isr ------------------------------- +/* +鏍稿績闇瑕佺殑瀹氭椂鍣ㄤ腑鏂湇鍔$▼搴*/ +extern void base_core_2ms5_isr(void); +extern void base_core_20ms_isr(void); +extern void base_core_28ms_isr(void); + + + +//---------------------------pc/sdk ---------------------------------- +/* +鍩虹珯鎺ユ敹pc鐨剈sb鏁版嵁锛屼繚瀛樺埌 闃熷垪涓 +姝ゅ嚱鏁拌usb endpoint callback 璋冪敤*/ +unsigned char pcrx_data_save(const unsigned char *pc_buf); +void pcrx_init_queue(void); + +//send data to pc via usb +void base_tx_to_pc_sub(const unsigned char *dt); + + +/* +鍒濆鍖栧鐞 鍩虹珯鍜宻dk/PC鐨勬暟鎹氫俊 +a,鍒濆鍖 鎺ユ敹pc鏁版嵁鐨勯槦鍒 +b,鍒濆鍖 閿洏杞彂缁檖c鐨勬暟鎹槦鍒*/ +void base_process_pc_init(void); + +/* +鍩虹珯澶勭悊pc鏁版嵁鐨勬诲叆鍙 +called by mainloop*/ +void base_process_pc_data(void); + +/* +鍩虹珯鍥炲簲鏉ヨ嚜pc鐨0x60鍛戒护 +input: + type-pc鐨勬暟鎹被鍨 + ack_buf - 鍥炲簲鐨刡uf + type_data_len - 鍥炲簲buf鐨勯暱搴*/ +void pc_cmd_0x60_ack(unsigned char type, unsigned char *ack_buf,unsigned char type_data_len); +/* +鍩虹珯澶勭悊鏉ヨ嚜pc鐨0x60鍛戒护 +1,澶嶅埗鐩稿叧鍙傛暟 +2锛屼繚瀛樺埌E2prom +3, 鍥炲簲pc*/ +unsigned char pc_cmd_0x60_process(const unsigned char *rxpc); + +/* +鍩虹珯澶勭悊鏉ヨ嚜pc鐨0x60鍛戒护 +1,澶嶅埗鐩稿叧鍙傛暟 +2锛屼繚瀛樺埌E2prom +3, 鍥炲簲pc*/ +unsigned char pc_cmd_0x61_process(const unsigned char *rxpc); +/* +鍩虹珯鍥炲簲鏉ヨ嚜pc鐨0x61鍛戒护 */ +void pc_cmd_0x61_ack(unsigned char type,const unsigned char *ack_buf,unsigned char type_data_len); + + +//杞彂 缁橮C +/* +鍩虹珯杞彂 keypad鐩存帴缁 pc鐨勬暟鎹 +濡傛杞彂鏄惁浼氬拰姝e父鏁版嵁鍐茬獊 锛燂紵锛 濡備綍閬垮厤 +called by main loop , */ +unsigned char keypad_transfer2pc_data_fetch(void); +/* +鍩虹珯淇濆瓨 keypad鐩存帴缁 pc 鐨勬暟鎹 +called by 鍩虹珯澶勭悊鎺ユ敹閿洏rf鏁版嵁鐨勫嚱鏁 */ +void keypad_transfer2pc_data_save(const unsigned char *trans2kp); + + + +//-------------------鍩虹珯鐩稿叧鍑芥暟 --------------------------------------- +/* +澶嶅埗閰嶅鐮 */ +void get_base_match_code(unsigned char *mac); + +#define log_mode_is_SN (get_base_log_mode()>3) +#define log_mode_is_ID (get_base_log_mode()<=3) +#define log_mode_is_CRS2 ( log_mode_is_SN && function.crs2__SW ) +#define log_mode_is_free_match ( (get_base_log_mode()==3)||(get_base_log_mode()==6) ) +#define log_mode_is_WHITELIST (function.whitelist__SW &&( (get_base_log_mode()==8)||(get_base_log_mode()==9)) ) + + +unsigned char assert_base_log_mode(void); +unsigned char get_base_log_mode(void); + +/*鑾峰彇鍩虹珯涓婚鐐规ā鍧楃紪鍙*/ +unsigned char get_mainRF_usr_id(void); +/* +鑾峰彇 涓婚鐐瑰搴旂殑纭欢缂栧彿锛侊紒锛侊紒, */ +unsigned char get_main_rf_hard_id(void); + +unsigned char get_base_main_rfchannel(void); +void set_base_main_rfchannel(unsigned char freq); +/* +鍒ゆ柇/闄愬埗鍩虹珯棰戠偣*/ +unsigned char assert_base_channel(void); + +/* +鍒ゆ柇鍩虹珯id鏄惁鍚堟硶*/ +unsigned char assert_base_id(void); +/* +鑾峰彇鍩虹珯鐨刬d*/ +unsigned char get_base_id(void); + +/* +* sdk璁剧疆鐨勬墿灞曞熀纭淇℃爣涔嬪悗锛屽氨寮鍚拰鏍囧噯鍩虹淇℃爣浜ゆ浛鍙戦; */ +void set_ext_basicbeacon_startup_flag(unsigned char); + +//============================================ keypad ============================================================= +/* +CRC璁剧疆 +*/ +void set_keypad_crc_config(unsigned char flag); +unsigned char get_keypad_crc_config(void); +unsigned char keypad_crc_check(void); + + + + +/* +鍒ゆ柇鏄惁鍦ㄥ閲忓潎琛℃ā寮*/ +unsigned char get_ext_basicbeacon_startup_flag(void); + +///* +//鍩虹珯鍙戠粰閿洏鐨勬暟鎹細 +//鍩虹淇℃爣锛屾姇绁ㄤ俊鏍囧拰鎶曠エ鏁版嵁鐨勭‘璁*/ +void base_tx_to_keypad_sub(unsigned char *buf,unsigned char rf_id); + +/* +鍜屼笂杩板嚱鏁扮浉姣旓紝姝ゅ嚱鏁颁笓闂ㄧ粰澶栭儴浣跨敤 +rf_id琛ㄧず鐨勬槸 鏃犵嚎妯″潡鐨勭‖浠舵爣鍙 +*/ +void send_to_keypad_user_hardID(unsigned char *buf,unsigned char rf_hard_id); + +/* +鍒濆鍖 閿洏鐩稿叧 +a, 鍒濆鍖栨帴鏀堕敭鐩樼殑闃熷垪 +b,鍒濆鍖栬浆鍙戠粰閿洏鐨勬暟鎹槦鍒 +called by main init */ +void base_process_keyapad_init(void); + +/* +鍩虹珯澶勭悊鏉ヨ嚜閿洏 鏁版嵁 鎬诲叆鍙 +灏嗛敭鐩樻暟鎹垎鎴4涓被鍨嬶細 + id 妯″紡 + sn 妯″紡 + CRS2 妯″紡 + 杞彂鑷硃c鐨勬暟鎹 +called by main loop */ +void keypad_rf_data_process(void); + +void keypad_rf_data_process_NO_fifo(unsigned char *tmp); + +/* ------------------ +鍩虹珯鍙戦佷俊鏍/鏃跺簭 缁欓敭鐩 +姝ゅ嚱鏁2.5ms琚皟鐢ㄤ竴娆 +called by 2.5ms timer*/ +void base_tx_keypad_beacon(void); + + +/* +鍩虹珯鎺ユ敹閿洏鏁版嵁锛屽皢閿洏鏁版嵁淇濆瓨鍒 闃熷垪涓 +琚 鏃犵嚎涓柇鍑芥暟璋冪敤 */ +unsigned char keypad_rf_data_save( unsigned char *rf_data); + + +//-pc 杞彂 keypad +/* +鍩虹珯鍙戦 pc鐩存帴缁 keypad 鐨勬暟鎹 +called by 淇℃爣鍙戦佸嚱鏁 base_tx_keypad_beacon() +return : + 0- 娌℃湁瑕佽浆鍙戠殑鏁版嵁鎴栬 杩炵画杞彂鏃堕棿鍒 + 1- 杩樻湁鏁版嵁鎴栬呰浆鍙戠瓑寰咃紝 */ +unsigned char pc_transfer2keypad_data_fetch(void); + +/* +鍩虹珯淇濆瓨pc鐩存帴杞彂缁欓敭鐩樼殑鏁版嵁 +called by 鍩虹珯澶勭悊pc鏁版嵁鐨勫嚱鏁 */ +unsigned char pc_transfer2keypad_data_save(unsigned char *trans2kp); + + + +//-------澶勭悊閿洏id/sn鐩稿叧鍑芥暟 +struct keypad_idsn_STR{ + #define SN_LEN 6 + unsigned char number; + unsigned char idsn[10][SN_LEN]; +}; +extern struct keypad_idsn_STR keypad_idsn; + + + +/*------------------------------------------------- +澶氭棤绾挎ā鍧楃浉鍏冲弬鏁!(鍏煎鍗曟ā鍧)*/ +struct multi_modual_STR{ + unsigned char modual_id[4]; //[0]-涓婚鐐规ā鍧楃紪鍙凤紝 + unsigned char modual_chan[4]; //涓巗dk璁剧疆鐣岄潰瀵瑰簲 + volatile unsigned char count; //涓巗dk璁剧疆鐣岄潰瀵瑰簲 + volatile unsigned char hard_rf_modual_cnt;//function路.h涓缃棤绾挎ā鍧楃殑涓暟! + + unsigned char main_index; //涓绘ā鍧楀湪modual_id[]涓殑涓嬫爣浣嶇疆index + unsigned char whitelist_index; //鐧藉悕鍗曟ā鍧楀湪modual_id[]涓殑涓嬫爣浣嶇疆index + struct keypad_idsn_STR multi_idsn[4]; //璁板綍鎺ユ敹閿洏鐨刬d/sn /max 4 rf modual +}; +extern struct multi_modual_STR multi; + + +extern void multi_chan_init(void); +/* +璁剧疆鏃犵嚎妯″潡鐨勯鐐*/ +extern void base_set_rf_freq(unsigned char rf_id); + + +/* +璁剧疆澶氶鐐规椂鐨勫鐞嗭細 called by pc璁剧疆鍗曟ā鍧楁搷浣滄椂 + a 鍚屾鍒板棰戠偣 + b 澶嶅埗鍒板唴鏍竚ulti鍙橀噺 + c E2prom淇濆瓨涓や釜棰戠偣*/ +void process_setup_single_chan(unsigned char single_rf); + +/* +璁剧疆澶氶鐐规椂鐨勫鐞嗭細 called by multi setup + a 鍚屾鍒板崟棰戠偣 + b 澶嶅埗鍒板唴鏍竚ulti鍙橀噺 + c E2prom淇濆瓨涓や釜棰戠偣*/ +void process_setup_multi_chan(unsigned char multi_freq); + +/* +鏍规嵁鏉ヨ嚜涓柇鐨勬ā鍧楀簭鍙锋煡璇㈣嚜宸辩殑搴忓彿 +return :鏌ヨ鍒颁簡灏辩洿鎺ヨ繑鍥炲簭鍙 +0xff -娌℃湁鍦ㄨ〃鏍间腑鏌ヨ鍒般 +called by rx keypad data */ +unsigned char conver_id(unsigned char hard_id); + + +/* +閫氳繃鍗曢鐐瑰叧鑱斿棰戠偣,涓嶅叧鑱旀湁鏁堥鐐逛釜鏁*/ +void single_relevant_to_multi_chan(unsigned char single_chan); + + +void multi_chan_polling(void); + + +unsigned char get_operaion_rf_count(void); + + +//鍩虹珯鑷洃娴媟f妯″潡锛侊紒 +void rf_modual__tx_counter(unsigned char id); +void rf_modual__tx_interrupt_counter(unsigned char id); +void rf_modual__check(void); +extern unsigned char get_rf_error_cnt(unsigned char *buf); + +/* +淇濆瓨閿洏鐨刬d/sn +intput: + idsn--buffer + byteN- id/sn瀛楃涓暟 +return: + 0- fail + 1- OK */ +unsigned char keypad_idsn_save(const unsigned char *idsn,unsigned char cnt,unsigned char rf_id); + +/* +浠庣紦鍐插尯涓彇鍑篿d/sn +intput: + idsn -buffer + byteN-瀛楄妭鏁帮紝2-id,4 sn, 6sn + idsn_cnt -瑕佽鍙杋d/sn鐨勪釜鏁; */ +void keypad_idsn_fetch(unsigned char *idsn,unsigned char byteN,unsigned char idsn_cnt); + + +unsigned char keypad_rf_data_fetch(unsigned char *rf_data); + +/* +娓呴櫎璁板綍閿洏idsn,鍙婃湁鏁堜釜鏁 */ +extern void keypad_idsn_clear(void); + +/* +鍩虹珯鍙戦佷俊鏍囩殑寮鍏, +鏌愪簺鍔熻兘闇瑕佸叧闂 鍩虹珯鍙戦佷俊鏍 +鍩虹珯璇诲彇鍩虹鍙傛暟鍚庡啀寮鍚彂閫佷俊鏍 */ +void base_send_beacon_switch(unsigned char sw); +unsigned char get_base_send_beacon_status(void); + +unsigned char keypad_crs2_mode(const unsigned char *rxkp,unsigned char rf_id); + + +//---------------------------------- 5.8G rf----------------------------------------------------------- + +#ifdef KEYPAD60 +#define KEYPAD_COUNT_MAX 60//30 +#define TRANSFER_CYCLE_MAX 9//6//(KEYPAD_COUNT_MAX/10+KEYPAD_COUNT_MAX%10) +#else +#define KEYPAD_COUNT_MAX 30 +#define TRANSFER_CYCLE_MAX 6 //(KEYPAD_COUNT_MAX/10+KEYPAD_COUNT_MAX%10) +#endif + +#define OFFLINE_COUNT 280//154//10 //10涓ぇ鍛ㄦ湡閮芥病鏈夋敹鍒版暟鎹紝璁や负绂荤嚎; + +/* +閿洏淇℃伅缁撴瀯浣 element*/ +typedef struct keypad_info_STR{ + unsigned char id_sn[4]; + unsigned char re_send_slot; + unsigned short offline_count; + unsigned char filt_heart_pkt_count; //杩囨护蹇冭烦鍖呰鏁板櫒 + #ifdef VOICE_PROTOCOL_3RD + unsigned char buf_warnning; + unsigned char ask_resend_state; + #endif + + #ifdef _DBG_VOICE_KP + unsigned short re_send_timers; //璇ラ敭鐩橀噸鍙戠殑娆℃暟 + unsigned short rxkp_cnt; //鏀跺埌閿洏鏁版嵁鍖呯殑涓暟,璇煶鍜岄潪璇煶閮芥湁鏁 + unsigned short ackkp_cnt; //鍩虹珯搴旂瓟閿洏鐨勬鏁帮紝 璇煶鐘舵佷笉搴旂瓟! + unsigned short ackkp_in_cnt; //璁板綍sn娆℃暟涓巃ckkp_cnt瀵瑰簲;璇煶鐘舵佷笅鏃犳晥! + unsigned short tx_pc_cnt; //鎶ュ憡缁檚dk鐨勬鏁; 璇煶鍜岄潪璇煶閮芥湁鏁 + + unsigned short send_beacon_cnt; //鍙戦佷俊鏍囩殑娆℃暟 + #endif + + +}ELEMENT; + +//node +struct link_node_STR{ + ELEMENT element; //keypad info + unsigned char status; + struct link_node_STR *next; +}; + +struct link_queue_STR{ + struct link_node_STR *front; + struct link_node_STR *rear; +}; +//queue +extern struct link_queue_STR keypad_info; + + + +//link queue basic +void link_queue_init(struct link_queue_STR *queue); +unsigned char link_queue_input(struct link_queue_STR *queue,ELEMENT *ele); +/* +杩炵画鍙栧嚭澶氫釜element 鏁版嵁 +return 鍙栧嚭鐨勪釜鏁; +*/ +unsigned char link_queue_outN(struct link_queue_STR *queue,unsigned char *out,unsigned char offset); +unsigned char link_queue_outN_re_send(struct link_queue_STR *queue,unsigned char *out,unsigned char offset); +unsigned char link_queue_check_re_send(struct link_queue_STR *queue,unsigned char offset); + +void link_queue_check_online(struct link_queue_STR *queue); + +void base_process_5G8_keyapd_init_queue(void); +//void base_process_rx_keypad_data_5G8(unsigned char *buf); + +unsigned char get_link_queue_length(struct link_queue_STR *queue); + +unsigned char get_keypad_count(void); +unsigned char get_link_queue_sn(unsigned char *sn); + +struct link_node_STR *link_queue_find_special_sn(struct link_queue_STR *queue,const unsigned char *sn); + +void re_init_all_resend_slot(void); + +//鐗规畩澶勭悊鎸囧畾杞彂 +void spec_trans__record_sn(unsigned char *trans); +void spec_trans__load_sn(unsigned char *start); + + +//========================================== 涓婃姤鏁版嵁 鍜 闃熷垪澶勭悊鎶曠エ鏁版嵁 ======================================================== +/* +鍒濆鍖栦笂鎶ユ姇绁ㄦ暟鎹 鐩稿叧鍙傛暟 +called by main init */ +extern void vote_data_parameter_init(void); + + +/* +鍔熻兘 锛氬瓨鍌ㄦ姇绁ㄦ暟鎹 +input: + type锛氶敭鐩樻姇绁ㄦ暟鎹殑绫诲瀷锛屽叿浣撹鍗忚鍒嗙被 + *data:鏁版嵁鎸囬拡 + len: 鏁版嵁闀垮害 +return: 1, 瀛樺偍鎴愬姛 锛0-澶辫触; +璋冪敤锛氬熀绔欏鐞嗘帴鏀跺埌鐨勯敭鐩樻暟鎹悎娉曞悗锛岃皟鐢ㄦ鍑芥暟淇濆瓨鎶曠エ鏁版嵁*/ + +extern unsigned char vote_data_store(unsigned char *vote_data); +/* +鍚姩鏁版嵁涓婃姤缁檖c +褰損c鍙戦佸懡浠よ闂熀绔欐槸鍚︽湁鎶曠エ鏁版嵁鏃惰璋冪敤锛侊紒*/ +extern void vote_data_report_startup(void); + +/* +鍩虹珯鍙戦佹姇绁ㄦ暟鎹寘缁檖c +琚 main loop 璋冪敤*/ +extern void vote_data_report_to_pc(void); + +/* +鍔熻兘锛氬鏋滄湁澶氫釜鏁版嵁鍖呴渶瑕佷笂鎶ョ粰pc,姝ゅ嚱鏁扮殑浣滅敤鍦ㄤ簬鎺у埗鏁版嵁鍖呬箣闂寸殑鏃堕棿闂撮殧锛岀洰鍓嶇殑25ms +input: interval + 鏁版嵁鍖呬箣闂寸殑鍙戦侀棿闅旀椂闂 = interval*2.5ms; + +琚2.5ms瀹氭椂鍣ㄨ皟鐢 +*/ +extern void vote_data_report_interval(void); + + +/* +//鍒濆鍖栭槦鍒楃浉鍏冲弬鏁*/ +extern void vote_init_queue(void); + +/* +input: 琚‘璁ょ殑鏁版嵁鍖呭簭鍙锋寚閽.1-10锛屽叿浣撹鍩虹珯鍗忚 + +璋冪敤锛 鍩虹珯鏀跺埌pc鐨勬姇绁ㄦ暟鎹寘纭淇℃伅鍚 璋冪敤姝ゅ嚱鏁帮紒锛*/ +extern void vote_status_clear_confirmed(const unsigned char *confirm); + +/* +function: 澶嶄綅娌℃湁琚‘璁ょ殑鏁版嵁鍖 +1锛岄亶鍘嗛槦鍒椾腑鎵鏈夋暟鎹紝鎵惧埌鏁版嵁鍖呭簭鍙峰湪0< rpt_status<=10 */ +extern void vote_status_reset_NOconfirmed(void); + + +/* +function: 鎵撳寘鏁版嵁涓婃姤缁檚dk +1,濡傛灉Qtype闃熷垪涓虹┖锛岃〃绀烘病鏈変换浣曟姇绁ㄦ暟鎹紝鐩存帴鎶ュ憡 +2锛屽鏋滈槦鍒椾笉涓虹┖锛屽氨浠嶲type闃熷垪澶存墍鎸囧悜鐨凲data鏁版嵁澶村紑濮嬫墦鍖,鐩村埌闃熷垪灏鹃儴锛侊紒 +3锛屽厛鍙戦佷竴涓猼ype鎵鍖呭惈鐨刣ata;鍦ㄤ笅涓娆dk璇㈤棶鏃跺啀鍙戦佷笅涓涓猼ype鎸囧悜鐨勬暟鎹; +return: + 0锛氭病鏈変换浣曟暟鎹簡 ;; + 1锛氬彲鑳借繕鏈夋暟鎹紝闇瑕佺户缁皟鐢ㄦ鍑芥暟锛侊紒 */ +extern unsigned char vote_data_packing( unsigned char pkt_seq); + + +unsigned char get_packing_parameter(unsigned char *type,unsigned char *cnt,unsigned char *len); + +/* +debug only +妫娴嬪師濮嬫姇绁╞uf涓槸鍚﹁繕鏈夋暟鎹! +鑾峰彇鏁版嵁鐘舵乻tatus;鍜屾暟鎹搴旂殑閿洏id/sn */ +unsigned char vote_buf_remain_count(unsigned char *id,unsigned char *status); + + + + +//-------------------------------------- 閫氱敤闃熷垪 鐩稿叧鍑芥暟 ------------------------------- +//20190604 +typedef unsigned char elem_type; +struct fifo_queue_STR{ + //modify by Gavin20191206,//璋冭瘯瓒呰繃20涓猅2閿洏鏃讹紝sdk鐩戞祴鍒板熀绔欎涪澶辨暟鎹弗閲 +// unsigned char front; +// unsigned char rear; +// unsigned char count; + + unsigned short front; + unsigned short rear; + unsigned short count; + elem_type **pdata; +}; + +void queue_init(struct fifo_queue_STR *queue,unsigned char **data,unsigned short node_size,unsigned char data_len); +unsigned char queue_in(struct fifo_queue_STR *queue,const elem_type* data,unsigned short node_size,unsigned char data_len); + +unsigned char queue_out(struct fifo_queue_STR *queue,elem_type* data,unsigned short node_size,unsigned char data_len); +unsigned char queue_out_special(struct fifo_queue_STR *queue,elem_type* data,unsigned short node_size,unsigned char data_len,unsigned char type); +unsigned char queue_out_get_type(struct fifo_queue_STR *queue,unsigned char data_len); + + +//----------------------------------- +void transfer2kp_init_queue(void); +void transfer2pc_init_queue(void); + + + + +//====================== math function =============================================== +/* +鍐呭瓨澶嶅埗*/ +extern void mem_cpy( const unsigned char *src,unsigned char *dist,unsigned char len); + +/* +鍒濆鍖栨暟缁勭殑鍊奸兘涓烘寚瀹氬父閲*/ +extern void mem_set(unsigned char *tmp,unsigned char len,unsigned char set_val); + +/* +姣旇緝涓や釜鏁扮粍瀵瑰簲浣嶆暟鎹槸鍚︾浉绛 +鍙鏈変笉鐩哥瓑灏辫繑鍥0 */ +extern unsigned char mem_compare(const unsigned char *ptr1,const unsigned char *ptr2,unsigned char len); + +/* +姣旇緝鏁扮粍鐨勬瘡涓厓绱犻兘涓庢寚瀹氬父閲忔槸鍚︾浉绛 +鍙鏈変笉鐩哥瓑鐨勫氨 return 0;*/ +extern unsigned char mem_cmp_const(const unsigned char *ptr1,unsigned char len,unsigned char _const); + +/* +鎼滅储鏁扮粍涓厓绱犳槸鍚︽湁鎸囧畾甯搁噺*/ +unsigned char mem_search_const(const unsigned char *ptr1,unsigned char len,unsigned char _const); + + +void Dec_to_Hex(unsigned char *sn,unsigned char len,unsigned char *dec ); + + + +//================================================================ E2prom store =============================================== +#define STORE_FLAG 0xF5 +//store addr// 20190930 update +#define STORE_BASE_CONFIG_ADDR 0 //len=BASE_CONFIG_LEN+1= 8 +#define STORE_BASE_HDINFO_ADDR 0x08 //len==BASE_HDINFO_LEN +1 =14 +#define STORE_BASE_MAC_ADDR 0x18 //len=BASE_MAC_LEN +1 =5 +#define STORE_DFU_ADDR 0x2E //len=1;fixed!!!! +#define STORE_BASIC_BEACON_ADDR 0x30 //len=BASIC_BEACON_LEN+1 =15 +#define STORE_OEM_CODE_ADDR 0x40 //len==8+1=9; +#define STORE_OEM_USER_ADDR 0x50 //len=16*5 zone0-4=5 +#ifndef VOTE_BEACON_64BYTE + #define STORE_VOTE_BEACON_ADDR 0xa0 //len==VOTE_BEACON_LEN+1=27 +#endif +#define STORE_BASE_NAME_ADDR 0xc0 //len==BASE_NAME_LOG_MODE_LEN+1=14 +#define STORE_BASE_ATTRIB_ADDR 0xd0 //len=4+1 +#define STORE_AUX_ATT_ADDR 0xd8 //len=3+1 +#define STORE_OEM_JY_ADDR 0xe0 //len=10+1锛屾瀬鍩 +#define STORE_MULTI_CHAN_ADDR 0xf0 //len=6+1 +#define STORE_BASIC_EXT_BEACON_ADDR 0x100 //len =BASIC_EXT_BEACON_LEN +1 =25 + + +#define STORE_IP_ADDR 0x120 //len=4+1 +#define STORE_MAC_ADDR 0x128 //len=6+1 +#define STORE_SUBNET_ADDR 0x130 //len=4+1 +#define STORE_GATEWAY_ADDR 0x138 //len=4+1 +#define STORE_KP_CRC_CONFIG 0x140 //len=1+1 + +#ifdef VOTE_BEACON_64BYTE + #define STORE_VOTE_BEACON_ADDR 0x150 //len==VOTE_BEACON_LEN+1= 55 ->0x190 +#endif + +//#define E2PROM_ADDR_KEYCODE 0x100 +#define STORE_AES_KEYCODE_ADDR 0x400 //len =32 +#define STORE_AES_CONFIG_ADDR 0x420 //0x120 //len =3 //20200427淇敼锛岃В鍐冲拰IP鍦板潃瀛樺偍鍐茬獊!! + + + + +unsigned char base_write_e2prom( unsigned short addr,const unsigned char * ptr,unsigned char len); +unsigned char base_read_e2prom( unsigned short addr, unsigned char * ptr,unsigned char len); +void base_read_e2prom_parameter(void); + + + + + +//--------------------------- debug_core ----------------------------- + + +#ifdef _DBG_VOICE_KP //5.8G only +void _debug_voice_kp__ack_keypad(unsigned char *sn); +void _debug_voice_kp__tx_pc(unsigned char *sn); +void _debug_voice_kp__init_keypad_parameter(ELEMENT *ele_tmp); +void _debug_voice_kp__init_all_parameter(void); +void _debug_voice_kp__app_get_keypad_debug_info(unsigned char *sn); +void _debug_voice_kp__record_illegal_rx_idsn(unsigned char *sn); + + +void _debug_core__process_5G8_keypad(unsigned char* pc); +#endif + + + + +//---------------------------------------------------------- +//2020.11 +void response_pc_cmd( char type[], unsigned char *ack,unsigned char len); + +void _debug_core__init(void); +void _debug_core__init_parameter_datapos_change(void); + +void _debug_core__record_rxkp_info(const unsigned char *rx_kp); +//void _debug_core__record_ackkp_info(const unsigned char *ack_kp); +void _debug_core__record_ackkp_info(unsigned char mode_type, const unsigned char *ack_kp); +void _debug_core__record_txpc_info(unsigned char pkt_seq, const unsigned char *tx_pc); +void _debug_core__record_pcack_info(unsigned char pkt_seq); +void _debug_core__record_txpc_info_report(const unsigned char *tx_pc); + + +//core +void _debug_core__process_core_info(const unsigned char *pc); + +//sdk offline and sysmode0 keeptimer +void _monitor_sdkoffline_sysmode0(void); +void reset__monitor_sdkoffline_sysmode0(void); + + + + +#endif //_BASE_CORE_H_ + + + diff --git b/Base_core/core_lib/base_core_user.h a/Base_core/core_lib/base_core_user.h new file mode 100644 index 0000000..0a892f9 --- /dev/null +++ a/Base_core/core_lib/base_core_user.h @@ -0,0 +1,91 @@ + +#ifndef _BASE_CORE_USER_H_ +#define _BASE_CORE_USER_H_ +/* +姝ゅご鏂囦欢鏄熀绔欏唴鏍稿紑鏀剧粰鐢ㄦ埛鐨勫嚱鏁版帴鍙*/ + + +#ifndef NULL +#define NULL ((void *)0) +#endif + + + +enum core_run_state_ENUM{ + _STA_IDLE, + _STA_GENERAL_VOTEING, + _STA_VOICE_START, + _STA_VOICE_VOTEING, + _STA_FAST_MATCH, + _STA_SYSMODE_0, +}; +//extern enum core_run_state_ENUM KERNEL_RUN_STATE; + + + +struct base_core_STR{ + void (*get_core_ver)(unsigned char *); + void(*core_init)(void); + void(*core_loop)(void); + void(*timer_2ms5_enter)(void); + void(*timer_20ms_enter)(void); + void(*timer4_enter)(void); + + void(*get_match_code)(unsigned char *mcode); + unsigned char (*get_id)(void); + unsigned char (*get_log_mode)(void); + void (*set_main_rf_chan)(unsigned char); + unsigned char (*get_main_rf_chan)(void); + unsigned char (*get_mainRF_hard_id)(void); + unsigned char (*get_whitelistRF_hard_id)(void); + + void (*send_rf_data)(unsigned char *buf,unsigned char rf_hard_id); + void (*switch_send_beacon)(unsigned char sw); + unsigned char (*get_send_beacon)(void); + unsigned char (*rf_data_fifo_in)( unsigned char *rxkp); + + + void (*send_data_to_pc)(const unsigned char *dt); + + unsigned char (*get_vote_datapos)(void); + + unsigned char (*sdk_data_fifo_in)(const unsigned char *rxpc); + //using display + unsigned char (*get_run_status)(void); + unsigned char (*get_sdk_connect_status)(void); + unsigned char (*get_sdk_connect_status_acc)(void); + unsigned char (*get_permit_dispaly_flag)(void); + + + // + unsigned char (*get_5G8_keypad_sn_list)(unsigned char *sn); + unsigned char (*get_5G8_keypad_online_count)(void); + + void(*force_sysmode0)(void); +}; +extern struct base_core_STR base_core; + + + + + + +//crc16 +unsigned short crc16(const unsigned char *ptr,unsigned short len); + + +//楂樹綅鍦ㄥ墠 +#define _2BYTE_TO_16BIT(_byte,_short) _short= ((_byte)[0]<<8)+(_byte)[1]; +#define _16BIT_TO_2BYTE(_short,_byte) (_byte)[0] =(_short)>>8;(_byte)[1] =(_short)&0xff; + + +//涔樻硶杞垚浣嶇Щ!! +#define MULTIx60(i) ((i<<5)+(i<<4)+(i<<3)+(i<<2)) //60=32+16+8+4 +#define MULTIx5(i) ((i<<2)+i) //5=4+1 + + + + + +#endif //_BASE_CORE_USER_H_ + diff --git b/Base_core/core_lib/base_pc_protocol.h a/Base_core/core_lib/base_pc_protocol.h new file mode 100644 index 0000000..2babb0c --- /dev/null +++ a/Base_core/core_lib/base_pc_protocol.h @@ -0,0 +1,247 @@ + +#ifndef _BASE_PC_PROTOCOL_ +#define _BASE_PC_PROTOCOL_ + +#include "base_core.h" + +//-------------2.1 pc 璁剧疆鍩虹淇℃爣 ------------------------------ +//pc-->BASE +struct BASE_Bbeacon_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char auth_code[2]; //byte4 + unsigned char login; //byte6 + unsigned char report; + unsigned char offtime; //byte8鑷姩鍏虫満鏃堕棿 + unsigned char attrib; + unsigned char nowT[2]; //byte10-11 + unsigned char more_info; //byte12 + unsigned char conf_id[2]; //byte13-14 + unsigned char info_id; + unsigned char page_id[2]; //byte16-17 + #define BASIC_BEACON_LEN 14//17 +}; + +//crs2鍗忚涓嬬殑鍩虹淇℃爣 +struct BASE_Bbeacon_CRS2_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char crs2_attrib[4]; //byte4-7 + unsigned char pack_cnt; //淇℃爣搴忓彿锛岀24瀛楄妭浣4浣嶏紝0~7锛岀敤浜庨敭鐩樹紤鐪犲悓姝ュ敜閱,20220518 + + #define BASIC_BEACON_CRS2_LEN 4 +}; + + +/* +*鎵╁睍鍩虹淇℃爣; +protocol: + base V5.34 section5.2.8 type21,22 + keypad V5.4.0 section2.3 ext basic beacon +*/ +struct BASE_ext_Bbeacon_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char info_type; //byte5 ---->keypad byte3 + unsigned char base_count; //byte + unsigned char blank[2]; //null + unsigned char base_ch[20]; + + #define BASIC_EXT_BEACON_LEN 24 +}; + + + + + + + + +//------------2.2 pc 璁剧疆鎶曠エ淇℃爣 ------------------------------ +//pc-->BASE +//pc鍙戦佹姇绁ㄤ俊鏍囷紝4瀛楄妭鍙婁箣鍚庣殑涓庡熀绔欏彂缁欓敭鐩樼殑涓鑷淬 +struct BASE_Vbeacon_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char DATAPOS; //byte4 + volatile unsigned char sys_mode; + unsigned char vbuf[24]; //byte6-29 + + unsigned char vbuf_default[35]; //used to 64bytes rf vote beacon only + #ifdef VOTE_BEACON_64BYTE + #define VOTE_BEACON_LEN 55 + #else + #define VOTE_BEACON_LEN 26 + #endif +}; + + +/*------------2.4 鎵╁睍鎶曠エ淇℃爣 --------------------------------- +鎵╁睍淇℃爣 +cmdtype=14,15 +*see base protocol V0.95 -section2.4 +*see keypad protocol V0.99-10 section2.2.17 +* 鑷畾涔夋爣棰 - 鏂颁笢鏂规场娉″畾鍒 at CRS100 debug ok first!; +*/ +struct ext_vbeacon_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char info_type; + unsigned char null; + unsigned char datapos; + unsigned char title[20]; +// unsigned char default_buf[25]; + + #define EXT_VBEACON_LEN 23// #define EXT_VBEACON_LEN 26 +}; + + + +//----------------5.2 鍩虹珯鍩虹绠$悊绫 ----------------------------- +//5.2.1 璇诲啓鍩虹珯閰嶇疆 +struct bs_cfg_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char bs_id; //byte4 real id + unsigned char chan; + unsigned char keymin[2]; + unsigned char keymax[2]; + unsigned char rf_pwr; //byte10 + + #define BASE_CONFIG_LEN 7 +}; + +//5.2.2 璇诲啓鍩虹珯纭欢淇℃伅 +struct bs_hdinfo_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char MODEL; //byte4 + unsigned char H_VER; + unsigned char S_VER; + unsigned char SERIAL[6]; //byte7-12 + unsigned char NEWVER; //byte13 + unsigned char SW_3B[3]; //byte14-16 + #define BASE_HDINFO_LEN 13 +}; + +//5.2.3 璇诲啓閰嶅鐮 +struct bs_match_code_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char match_code[4]; //byte4-7 + #define BASE_MAC_LEN 4 +}; + + +//5.2.4 鍩虹珯鍗囩骇 +//5.2.5 + + +//5.2.6 杞欢鐙楀姛鑳 +struct soft_dog_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char mode; //byte4 + unsigned char user_zone; + unsigned char user_info[16]; + +}; + + +//5.2.7 淇¢亾璇勪及 +//struct channel_assess_STR{ + +//}; + + + +//------//5.2.8 閫氱敤闄勫姞閰嶇疆 -------------------------------------------------- +struct general_aux_config_mode1_2_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char log_mode;//byte5 + unsigned char base_name[12]; + #define BASE_NAME_LOG_MODE_LEN 13 +}; + +struct general_aux_config_mode3_4_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char attrib2; //byte5 + unsigned char chan_count; + unsigned char chan_freq[4]; + unsigned char test123; + #define MULTI_FREQ_LEN 6 +}; + +struct general_aux_config_mode7_8_STR{ //protocol section5.23 + unsigned char head_addr; //is struct head address,no actual utility + unsigned char net_timer;//byte5 + +}; +struct general_aux_config_mode11_12_STR{ //protocol section5.23 //鑰冨嫟鐩稿叧 + unsigned char head_addr; //is struct head address,no actual utility + unsigned char keypad_attn_sw; //byte5 + unsigned char keypad_report_sw;//byte6 + unsigned char base_beacon_sw; //byte7 ,寮鍚椂鍙戦佹姇绁ㄤ俊鏍 + #define AUX_ATT_LEN 3 +}; + +//struct general_aux_config_mode15_16_STR{ //protocol section5. 蹇熼厤瀵瑰熀绔欏姛鐜囪缃 +// unsigned char head_addr; //is struct head address,no actual utility +// unsigned char lower_PA; //byte5 +// unsigned char keypad_report_sw;//byte6 +// unsigned char base_beacon_sw; //byte7 ,寮鍚椂鍙戦佹姇绁ㄤ俊鏍 +// #define FASTMATCH_LOWERPA_LEN 1 +//}; + +struct general_aux_config_mode23_24_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char log_mode;//byte5 + unsigned char base_name[12]; + #define AUX_NAME_LEN 13 +}; + +struct general_aux_config_mode25_26_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char log_mode;//byte5 + unsigned char base_pwd[2]; + #define AUX_PWD_LEN 3 +}; + + + + + + +////see BASE protocol 5.2.10 +//struct base_test_STR{ +// unsigned char head_addr; //is struct head address,no actual utility +// unsigned char type; +// unsigned char chan; +// unsigned char Tmode; +// unsigned char rf_pwr; +// unsigned short send_cnt[2]; //鍙戦佹鏁 +// unsigned char interval; //鍙戦侀棿闅 ms +// #define BASE_TEST_LEN 7 +// +// +//}; + + + +extern struct BASE_Bbeacon_STR basic_beacon; +extern struct BASE_ext_Bbeacon_STR basic_ext_beacon; +extern struct BASE_Bbeacon_CRS2_STR basic_beacon_crs2; +extern struct BASE_Vbeacon_STR vote_beacon; +extern struct ext_vbeacon_STR ext_vbeacon; +extern struct ext_vbeacon_STR ext_vbeacon_2; +extern struct bs_cfg_STR base_config; +extern struct bs_hdinfo_STR base_hdinfo; +extern struct bs_match_code_STR base_mac; +//extern struct general_aux_config_STR aux_config; + extern struct general_aux_config_mode1_2_STR base_name_log_mode; + extern struct general_aux_config_mode3_4_STR multi_freq_setup; + extern struct general_aux_config_mode7_8_STR aux_beats; + extern struct general_aux_config_mode11_12_STR aux_att; + extern struct general_aux_config_mode23_24_STR base_name_setup; + extern struct general_aux_config_mode25_26_STR base_pwd_setup; + //extern struct general_aux_config_mode15_16_STR fastmatch_lowerPA; + +//extern struct base_test_STR base_test; + + + + +#endif + + diff --git b/Base_core/core_lib/function_interface.h a/Base_core/core_lib/function_interface.h new file mode 100644 index 0000000..f6a1543 --- /dev/null +++ a/Base_core/core_lib/function_interface.h @@ -0,0 +1,142 @@ + + +#ifndef _FUNCTION_INTERFACE_H_ +#define _FUNCTION_INTERFACE_H_ + + +/* +鍔熻兘鎺ュ彛缁撴瀯 +*/ +struct function_STR{ + /*------------------------------------------------------- + !!!!!!!!!!!! 璀︽垝绾 姝ゅ悗鐨勬暟鎹姝换浣曚慨鏀 !!!!!!!! + --------------------------------------------------------*/ + //1 whitelist + const unsigned char whitelist__SW; //鍔熻兘寮鍏 + void (*whitelist__init)(void);//棰勭暀 + void (*whitelist__enter)(const unsigned char *ptr); + unsigned char *(*whitelist__search_special_list)(const unsigned char *ptr); + unsigned char (*whitelist__base_confirm_keypad_request)(void); + unsigned char (*whitelist__keypad_idsn_record_request)(const unsigned char *rxkp); + + //2 fast match + const unsigned char fastmatch__SW; //鍔熻兘寮鍏 + void (*fastmatch__enter_exit)(const unsigned char *rxpc); + unsigned char (*fastmatch__load_info_to_vote_beacon)(unsigned char *ptr); + unsigned char (*fastmatch__success_check)(const unsigned char *rxkp); + void (*fastmatch__lowPA_setup)(const unsigned char *); + void (*fastmatch__lowPA_ack)(void); + unsigned char (*fastmatch__get_status)(void); + + //3,update keypad firmware + const unsigned char updatekp__SW; //鍔熻兘寮鍏 + void (*update__kp_enter)(const unsigned char *rx_pc); + unsigned char (*update__kp_progress)(void); + unsigned char (*update__save_keypad_ack_data)(const unsigned char *rxkp); + unsigned char (*update__get_status)(void); + void (*update__monitor_sdk_connect)(void); + + //4 base test + const unsigned char basetest__SW; //鍔熻兘寮鍏 + void (*basetest__progress)(void); + void (*basetest__init)(void); + unsigned char (*basetest__get_status)(void); + void (*basetest__rx_and_ack_pc)(const unsigned char *rxpc,unsigned char *ack_buf); + + //5 monitor base freq + const unsigned char monitor__SW; //鍔熻兘寮鍏 + void (*monitor__auto_search_freq_enter)(void); + unsigned char (*monitor__rf_data)(unsigned char *rx_kp); + void (*monitor__freq_process)(void); + + //6 hard info + const unsigned char hdinfo_HMODEL; + const unsigned char hdinfo_SW1; + const unsigned char hdinfo_SW2; + const unsigned char hdinfo_SW3; + + const unsigned char rf_speed_set; + const unsigned char rf_channel_max; //鏈澶氶鐐规暟;2.4G鏈80涓鐐癸紝433M鍙湁32涓 + unsigned char rf_id[4]; + + //7 other function + const unsigned char crs2__SW; //crs2寮鍏 + const unsigned char lock_channel; //鍥哄畾棰戠偣 + const unsigned char mask_spec_channel; //灞忚斀鎸囧畾棰戠偣 + const unsigned char lock_logmode; //鍥哄畾妯″紡 + const unsigned char no_matchcode__SW; //鏃犻厤瀵圭爜寮鍏 + const unsigned char aux_att__SW; + const unsigned char aux_beat__SW; + const unsigned char no_ID_mode__SW; //涓嶆敮鎸乮d妯″紡鐨勫紑鍏 + const unsigned char lock_rf_count; //鏄惁鍏佽 + //const unsigned char fix_rf_tx_beacon_cnt; + const unsigned char match_keypad_type; + const unsigned char base_type; + + //8 crc + const unsigned char crc16_keypad__SW; // + const unsigned char crc16_pc__SW; // + + //9 ,nfc function + const unsigned char nfc__SW; // + void (*nfc__pc_interaction)(const unsigned char *buf); + void(*nfc__scan)(void); + + //10,AES + const unsigned char AES__SW; + void(*aes__init)(void); + void(*aes__config_enter)(const unsigned char *); + void(*aes__load_fastmatch)(unsigned char *); + void(*aes__keycode_upgrade)(void); + void (*aes__rf_Encrypt)(unsigned char *); + unsigned char (*aes__rf_Decrypt)(unsigned char *); + void (*aes__get_key)(unsigned char *); + unsigned char (*aes__get_status)(void); + + //11,TCP IP + const unsigned char TCPIP__SW; + void(*tcpip__init)(void); + void(*tcpip__config_enter)(const unsigned char *); + void (*tcpip__process)(void); + + //broadcast + const unsigned char BROADCAST__SW; + void(*broadcast__config_enter)(const unsigned char *); + void(*broadcast__startup)(void); + unsigned char (*broadcast__keypad_request)(unsigned char); + unsigned char (*broadcast__det_content_err)(void); + + //user extend interface + void (*user_pc_transfer2keypad)(const unsigned char *buf); //pc杞彂缁檏eypad鐨勬暟鎹 + void (*user_pc_0x60cmd)(const unsigned char *buf); + void (*user_pc_0x61cmd)(const unsigned char *buf); + void (*user_pc_0x61cmd_type0x0B)(const unsigned char *buf); + + void (*user_keypad_transfer2pc)(const unsigned char *buf); //keypad杞彂缁檖c鐨勬暟鎹 + + + //app debug + void (*_debug__function_enter)(const unsigned char *buf); + + /*------------------------------------------------------- + !!!!!!!!!!!! 璀︽垝绾 姝ゅ墠鐨勬暟鎹姝换浣曚慨鏀 !!!!!!!! + 濡傞渶娣诲姞璇峰湪姝や箣鍚!!!!!!!!!!!!!!!!! + --------------------------------------------------------*/ + void (*msg__polling)(void); + void (*network__polling)(unsigned char); + unsigned char (*network__get_netseq)(void); + void (*network__set_netseq_change)(void); + unsigned short (*network__get_pwd)(void); + void (*network__set_pwd)(unsigned short); + unsigned char (*network__get_name)(unsigned char *buf, unsigned char buflen); + unsigned char (*network__set_name)(unsigned char *buf, unsigned char buflen); + unsigned char (*network__get_nameview)(void); + void (*network__set_nameview)(unsigned char view); + +}; +extern struct function_STR function; + + + +#endif //_FUNCTION_INTERFACE_H_ + diff --git b/Base_core/core_lib/platform_interface.h a/Base_core/core_lib/platform_interface.h new file mode 100644 index 0000000..3fa2d72 --- /dev/null +++ a/Base_core/core_lib/platform_interface.h @@ -0,0 +1,154 @@ + + +#ifndef _PLATFORM_INTERFACE_H_ +#define _PLATFORM_INTERFACE_H_ + + +// +#define NFC_BLOCK_CNT 64//32 + +//#define _NFC_DEBUG_ + +//#define _NFC_READER_ + + +#ifdef _NFC_DEBUG_ +struct _info_STR{ + unsigned char name[16]; + unsigned char keypad_sn[6]; + unsigned char card_sn_record[8]; + unsigned char keep_; + unsigned char start_; + unsigned char complish_; +}; + +struct _nfc_err_STR{ + unsigned char cnt; + unsigned char card_sn[NFC_BLOCK_CNT][8]; +}; + +#endif + + +/* +*define nfc block info struct */ +struct nfc_app_STR{ + unsigned char waddr[NFC_BLOCK_CNT]; + unsigned char wbuf[NFC_BLOCK_CNT][4]; + unsigned wblock_cnt; + + unsigned char raddr[NFC_BLOCK_CNT]; + unsigned char rbuf[NFC_BLOCK_CNT][4]; + unsigned rblock_cnt; + + volatile unsigned char mode_status; //default, user write,nfc reader(debug only) + unsigned char card_write_cnt_addr; + unsigned short wait_sdk_info; // + unsigned char sdk_offline_cnt; //sdk connect det + + + + #ifdef _NFC_DEBUG_ + + unsigned char debug_sdk_change_cnt; + unsigned char debug_sdk_down_cnt; + unsigned char debug_custom_ok_cnt; + unsigned char debug_default_ok_cnt; + unsigned char debug_driver_ok_cnt; + unsigned char debug_driver_start_cnt; + unsigned char debug_driver_keep_cnt; + unsigned char ok_cnt; + unsigned char card_sn[8]; + + struct _nfc_err_STR error[8]; + struct _info_STR kp_nfc_info[NFC_BLOCK_CNT]; + #endif + +}; +extern struct nfc_app_STR nfc_app; + + +struct hardware_platform_STR{ + /*------------------------------------------------------- + !!!!!!!!!!!! 璀︽垝绾 姝ゅ悗鐨勬暟鎹姝换浣曚慨鏀 !!!!!!!! + --------------------------------------------------------*/ + void (*disable_interrupt)(void); + void (*enable_interrupt)(void); + void (*system_reset)(void); + void (*delay_ms)(unsigned int ); + void (*get_chip_id)(unsigned char *chip_id); + + //usb + unsigned char (*base_send_data_to_pc)(unsigned char *buf,unsigned short len); + unsigned char (*usb_connect_status)(void); + + //i2c + void(*e2prom_write)(unsigned int addr,const unsigned char *buf,unsigned char len); + unsigned char(*e2prom_read)(unsigned int addr,unsigned char *buf,unsigned char len); + + //rf + void (*rf_send_data)(unsigned char* buf,unsigned char len,unsigned char rf_id); + void (*rf_set_freq)(unsigned char freq,unsigned char rf_id); + void (*rf_set_send_pwr)(unsigned char pa,unsigned char rf_id); + void (*rf_set_FCC_mode)(unsigned char mode); + unsigned char (*rf_get_rssi)(void); + void (*rf_init)(unsigned char rf_id); + void (*rf_update_sync_code)(unsigned short sync,unsigned char sync_cnt,unsigned char rf_id); + // + void (*rf_5G8_load_send_data)(unsigned char* buf,unsigned char len,unsigned char rf_id); + void (*rf_5G8_send_multi_frame)(void (*send_function)(const unsigned char *,unsigned char id),const unsigned char *tmp ,unsigned char rf_id); + //void (*rf_send_data_sub)(unsigned char* buf,unsigned char len,unsigned char rf_id); + //void (*rf_5G8_send_multi_frame)(void (*send_function)(const unsigned char *),const unsigned char *tmp ,unsigned char rf_id); + + //led + void (*pc_led_ctrl)(unsigned char high_low); + void (*rf_led_ctrl)(unsigned char high_low); + void (*general_led_ctrl)(unsigned char led_NO, unsigned char high_low); + + //double ANT + void (*doule_ANT_sw)(unsigned char); + + //buzzer + void (*buzzer_ctrl)(unsigned char); + + //rfid + unsigned char (*rfid_get_hard_connect_status)(void); + unsigned char (*rfid_reader)(unsigned char addr,unsigned char cnt,unsigned char *out) ; + int (*rfid_write_read_N_block)(struct nfc_app_STR *); + + + //LCD + void (*lcd_display_chinese)(unsigned short x,unsigned short y + //,unsigned char char_type + ,const unsigned char *chr + ,unsigned char len + //,unsigned char reverse + ); + + void (*lcd_display_char)(unsigned short x,unsigned short y + //, unsigned char char_type, + ,const unsigned char *chr + //unsigned char len, + //unsigned char reverse + ); + +// //used to AES +// unsigned int (*get_timer_cnt)(void); +// void (*enable_crc_clk)(void); + + + void (* uart1_print_bytes)(unsigned char *pt,unsigned short len); + /*------------------------------------------------------- + !!!!!!!!!!!! 璀︽垝绾 姝ゅ墠鐨勬暟鎹姝换浣曚慨鏀 !!!!!!!! + 濡傞渶娣诲姞璇峰湪姝や箣鍚!!!!!!!!!!!!!!!!! + --------------------------------------------------------*/ + + +}; +extern struct hardware_platform_STR platform; + + + + +#endif + diff --git b/Base_core/core_src/Queue_circle.c a/Base_core/core_src/Queue_circle.c new file mode 100644 index 0000000..c3104af --- /dev/null +++ a/Base_core/core_src/Queue_circle.c @@ -0,0 +1,97 @@ + +#include "base_core_user.h" +#include "base_core.h" +#include "platform_interface.h" + + +/* +闃熷垪鍒濆鍖*/ +void queue_init(struct fifo_queue_STR *queue,unsigned char **data,unsigned short node_size,unsigned char data_len) +{ + queue->pdata =data; + queue->front = queue->rear; + queue->count =0; +} + + +/* +灏嗘暟鎹瓨鍌ㄥ埌闃熷垪灏鹃儴*/ +unsigned char queue_in(struct fifo_queue_STR *queue,const elem_type* data,unsigned short node_size,unsigned char data_len) +{ + unsigned char retval; //modify by Gavin 20200407,閬垮厤node_size瓒婄晫閫犳垚婧㈠嚭!!! + platform.disable_interrupt(); + if( (queue->front ==queue->rear)&&(queue->count >= node_size) )//if( (queue->front ==queue->rear)&&(queue->count == node_size) ) + retval=0; + else{ + mem_cpy(data, (unsigned char*)(queue->pdata)+ queue->rear *data_len,data_len); + queue->rear = (queue->rear +1)% node_size; + queue->count += 1; + retval=1; + } + platform.enable_interrupt(); + return retval; +} + + +/* +浠庨槦鍒楀ご璇诲彇鏁版嵁锛屽苟涓斿垹闄*/ +unsigned char queue_out(struct fifo_queue_STR *queue,elem_type* data,unsigned short node_size,unsigned char data_len) +{ + unsigned char retval; + platform.disable_interrupt(); + if( (queue->front ==queue->rear)&&(queue->count == 0) ) + retval= 0; + else{ + mem_cpy((unsigned char*)(queue->pdata)+ queue->front *data_len,data,data_len); + queue->front = (queue->front +1)% node_size; + queue->count -= 1; + retval= 1; + } + platform.enable_interrupt(); + return retval; +} + + +/*------------------------------------ 浠ヤ笂鏄氱敤fifo澶勭悊鍑芥暟锛 浠ヤ笅鏄鐞嗘姇绁ㄦ暟鎹笓鐢ㄥ嚱鏁 ---------------------------------------------------- +闃熷垪澶存暟鎹涓瀛楄妭璇诲彇(type),涓庤緭鍏ョ殑type姣斿 +濡傛灉闃熷垪鏄┖ return 0 +濡傛灉闃熷垪涓殑type涓庣洰鏍噒ype涓嶇浉绛夛紝涓嶈鍙栨暟鎹苟return 2 +濡傛灉涓や釜type鐩哥瓑锛宺eturn 1*/ +unsigned char queue_out_special(struct fifo_queue_STR *queue,elem_type* data,unsigned short node_size,unsigned char data_len,unsigned char type) +{ + unsigned char retval; + platform.disable_interrupt(); + if( (queue->front ==queue->rear)&&(queue->count == 0) ) + retval= 0; + else{ + if( *((unsigned char*)(queue->pdata)+ queue->front*data_len) !=type) retval= 2; + else{ + mem_cpy((unsigned char*)(queue->pdata)+ queue->front *data_len,data,data_len); + queue->front = (queue->front +1)% node_size; + queue->count -= 1; + retval= 1; + } + } + platform.enable_interrupt(); + return retval; +} + + +/* +鍙栧嚭闃熷垪澶寸殑绗竴涓瓧鑺(type) +濡傛灉闃熷垪涓虹┖ return0 +鍚﹀垯 return 闃熷垪澶翠腑鐨則ype*/ +unsigned char queue_out_get_type(struct fifo_queue_STR *queue,unsigned char data_len) +{ + unsigned char retval; + platform.disable_interrupt(); + if( (queue->front ==queue->rear)&&(queue->count == 0) ) + retval= 0; + else{ + retval = *((unsigned char*)(queue->pdata)+ queue->front*data_len); + } + platform.enable_interrupt(); + return retval; +} + + diff --git b/Base_core/core_src/_debug_kp_pc.c a/Base_core/core_src/_debug_kp_pc.c new file mode 100644 index 0000000..95c8e9f --- /dev/null +++ a/Base_core/core_src/_debug_kp_pc.c @@ -0,0 +1,418 @@ + #include "base_core.h" +#include "_debug_core_.h" + + + +#if defined(_DBG_2G4_KP_) + +void _debug_core__sequence_idsn_init(void); +// +unsigned char get_idsn_and_len(unsigned char kp_type,unsigned char *offset,unsigned char *len); +unsigned char _debug_core__find_idsn_in_list( const unsigned char *rx_sn); +unsigned char _debug_core__creat_keypad_list(const unsigned char *rx_kp); + + +//------------------------------0 init parameter ---------------------------------------------------------- + +//called by debug modual startup +void _debug_core__init(void) +{ + unsigned char i,j; + + _dbg_core_.idsn_len =0; + _dbg_core_.valid_kp_cnt =0; + _dbg_core_.rx_idsn_err_cnt =0; + _dbg_core_.ack_idsn_err_cnt =0; + _dbg_core_.txpc_idsn_err_cnt =0; + + for(i=0;i<_DBG_KP_CNT;i++){ + _dbg_core_.kp_info[i].ack_kp_cnt =0; + _dbg_core_.kp_info[i].rx_kp_cnt =0; + _dbg_core_.kp_info[i].tx_pc_cnt=0; + _dbg_core_.kp_info[i].acked_pc_cnt =0; + + #if _DBG_TITLE_CNT !=0 + for(j=0;j<_DBG_TITLE_CNT;j++){ + _dbg_core_.kp_info[i].title_NO[j]=0; + _dbg_core_.kp_info[i].rpt_title_NO[j]=0; + }//for + _dbg_core_.kp_info[i].title_cnt=0; + + for(j=0;j<_DBG_ERR_TITLE_CNT;j++){ + _dbg_core_.kp_info[i].err_title_NO[j] =0; + } + _dbg_core_.kp_info[i].err_title_cnt =0; + #endif + }//for + + for(i=0;i<11;i++){ + _dbg_core_.rpt_pkt[i].kp_cnt =0; + } + + #ifdef _DBG_KP_IDSN_CONTINUE + _debug_core__sequence_idsn_init(); + #endif +} + +//extern unsigned short sdk_ack_err_cnt; +//called when datapos changed! +void _debug_core__init_parameter_datapos_change(void) +{ + unsigned char i,j; +//sdk_ack_err_cnt=0; + _dbg_core_.rx_idsn_err_cnt =0; + _dbg_core_.ack_idsn_err_cnt =0; + _dbg_core_.txpc_idsn_err_cnt =0; + + for(i=0;i<_DBG_KP_CNT;i++){ + _dbg_core_.kp_info[i].ack_kp_cnt =0; + _dbg_core_.kp_info[i].rx_kp_cnt =0; + _dbg_core_.kp_info[i].tx_pc_cnt=0; + _dbg_core_.kp_info[i].acked_pc_cnt =0; + + #if _DBG_TITLE_CNT !=0 + for(j=0;j<_DBG_TITLE_CNT;j++){ + _dbg_core_.kp_info[i].title_NO[j]=0; + _dbg_core_.kp_info[i].rpt_title_NO[j]=0; + }//for + _dbg_core_.kp_info[i].title_cnt=0; + #endif + }//for +} + + + + + + +//---------------------------------- 1 keypad list process --------------------------------------- +#ifndef _DBG_KP_IDSN_CONTINUE +/* +*淇濆瓨瑕佽皟璇曠殑閿洏id/sn鍚嶅崟 +*鍚屾椂寰楀埌idsn_type 锛涘疄闄呮湁鏁堢殑閿洏涓暟; +*/ +void _debug_core__write_kp_list(unsigned char *list) +{ + unsigned char offset; + +} + +/* +* 璇诲嚭褰撳墠璋冭瘯鐨勯敭鐩樺悕鍗 +*/ +void _debug_core__read_kp_list(unsigned char *list) +{ + + +} +#else + +//鍙紪鍙锋垚浠1寮濮嬬殑id/sn +void _debug_core__sequence_idsn_init(void) +{ + unsigned char i; + _dbg_core_.idsn_len = _DBG_IDSN_LEN; + _dbg_core_.valid_kp_cnt =_DBG_VALID_KP_CNT; + + for(i=0;i<_DBG_KP_CNT;i++){ + mem_set(_dbg_core_.kp_info[i].kp_idsn,6,0); + if(i <= _dbg_core_.valid_kp_cnt){ + _dbg_core_.kp_info[i].kp_idsn[_dbg_core_.idsn_len-1] = i; + } + }//for +} + +#endif +/* +*search special SN in keypad list +*return :the offset of special sn in keypad sn list +* -1:not found +*/ +static int _mem_cmp_(const unsigned char *ptr1,const unsigned char *ptr2,unsigned char len) +{ + unsigned char i; + for(i=0;i ptr2[i]) + return 1; + else if(ptr1[i] < ptr2[i]) + return -1; + } + return 0; +} + +//search sn in keypad sn list +static int _debug_core__search_kp_list(const unsigned char *sn) +{ + struct _debug_keypad_info_STR *list =_dbg_core_.kp_info; + unsigned char sum =_dbg_core_.valid_kp_cnt; + unsigned char idsn_len = _dbg_core_.idsn_len; + + unsigned char low,mid,high; + int cmp_rslt; + low =0; + high = sum; //-1?? + + while(low<=high){ + mid=(low+high)/2; //璁$畻涓棿鍏冪礌搴忓彿 + cmp_rslt =_mem_cmp_(_dbg_core_.kp_info[mid].kp_idsn,sn,idsn_len); + //cmp_rslt =_mem_cmp_(list[mid].kp_idsn,sn,idsn_len); + if( cmp_rslt ==0 ) + return mid; + else if(cmp_rslt >0 ) + high =mid-1; + else + low = mid +1; + }//while + + return -1; +} + + + + + + +//---------------------------------- 2 RX keypad --------------------------------------- + +static void get_idsnlen_and_offset(unsigned char data_type,unsigned char *idsn_len,unsigned char *index) +{ + //unsigned char idsn_len=0; + switch (data_type){ + case 0x91: + *idsn_len =2; + *index =2; + break; + + case 0x92: + *idsn_len =6; + *index =3; + break; + + case 0x93: + case 0x94: + *idsn_len =4; + *index =3; + break; + + default: + break; + } + + //return idsn_len; +} +/* +* 妫娴嬮敭鐩樼殑鏁版嵁澶勭悊鍑芥暟 +* Input: +* rx_kp[0] -- len +* rx_kp[1] -- 0x91/92/93,94 +*/ +void _debug_core__record_rxkp_info(const unsigned char *rx_kp) +{ + unsigned char cur_idsnlen,index; + int pos; + if(_dbg_core_.valid_kp_cnt ==0) return; + + get_idsnlen_and_offset(rx_kp[1],&cur_idsnlen,&index); + if(_dbg_core_.idsn_len != cur_idsnlen) return; + + pos =_debug_core__search_kp_list( rx_kp+index); + if(pos ==-1){//idsn not found in list + if(_dbg_core_.rx_idsn_err_cnt < _DBG_ERR_CNT){//to prevent overflow + //record error SN + mem_cpy(rx_kp+index,_dbg_core_.rx_idsn_err[_dbg_core_.rx_idsn_err_cnt],_dbg_core_.idsn_len); + _dbg_core_.rx_idsn_err_cnt++; + } + } + else{ + #if 0 + _dbg_core_.kp_info[pos].rx_kp_cnt++; + #else + #if _DBG_TITLE_CNT !=0 + {//棰樺彿妫娴 + unsigned char title= rx_kp[index+8]; + if( (title==0) ||(title >200) || (rx_kp[index-1] !=7) ){ + //error + if( _dbg_core_.kp_info[pos].err_title_cnt<_DBG_ERR_TITLE_CNT){ + unsigned char err_seq = _dbg_core_.kp_info[pos].err_title_cnt; + _dbg_core_.kp_info[pos].err_title_NO[err_seq] = title; + _dbg_core_.kp_info[pos].err_title_cnt++; + } + } + else{ + _dbg_core_.kp_info[pos].rx_kp_cnt++; + _dbg_core_.kp_info[pos].title_NO[title]++; + } + } + #endif + + #endif + } +} + + + +//---------------------------------- 3 ACK keypad --------------------------------------- +/* +* 鏍规嵁ack mode =0x15,16,18/19 寰楀嚭idsn绫诲瀷 +*/ +static unsigned char get_idsnlen(unsigned char mode_) +{ + unsigned char idsn_len=0; + switch (mode_){ + case 0x15: + idsn_len =2; + break; + case 0x16: + idsn_len =6; + break; + case 0x18: + case 0x19: + idsn_len =4; + break; + + default: + break; + } + return idsn_len; +} +/* +* 妫娴嬪熀绔檃ck閿洏鐨凷N鏄惁姝g‘; +* Input: +* ack_kp -- id/sn start address +* mode_type --0x15,16,18/19 +* called by 鍩虹珯ack閿洏鍔犺浇SN鏁版嵁鏃惰皟鐢 +*/ +void _debug_core__record_ackkp_info(unsigned char mode_type, const unsigned char *ack_kp) +{ + int pos; + if(_dbg_core_.valid_kp_cnt ==0) return; + if( get_idsnlen(mode_type) != _dbg_core_.idsn_len) return; + + //鍏0鏄┖闂叉椂鍊欑殑ack锛屼笉绠楅敊璇 + if( mem_cmp_const(ack_kp,_dbg_core_.idsn_len,0) ) return; + + pos =_debug_core__search_kp_list(ack_kp); + + if( pos == -1){ + if(_dbg_core_.ack_idsn_err_cnt < _DBG_ERR_CNT){//to prevent overflow + mem_cpy(ack_kp,_dbg_core_.ack_idsn_err[_dbg_core_.ack_idsn_err_cnt],_dbg_core_.idsn_len); + _dbg_core_.ack_idsn_err_cnt++; + } + else{ + //error record overflow + } + } + else{ + _dbg_core_.kp_info[pos].ack_kp_cnt++; + } +} + + + + + +////----------------------------------4 with PC/SDK --------------------------------------- +/* +* 鍩虹珯鍙戠粰pc鎶曠エ鏁版嵁锛岃褰曞叾涓殑閿洏淇℃伅锛 +* called by 鍩虹珯缁勭粐/鎵撳寘鏁版嵁鍙戦佹椂璋冪敤!!! +*/ +void _debug_core__record_txpc_info(unsigned char pkt_seq, const unsigned char *tx_pc) +{ + unsigned char cur_kp= _dbg_core_.rpt_pkt[pkt_seq].kp_cnt; + int pos; + + if( pkt_seq>10) return; //to avoid overflow + if( cur_kp >= KP_MAX_IN_PKT) return; //涓鍖呮渶澶氬寘鍚8涓敭鐩樻暟鎹紒锛 + + pos =_debug_core__search_kp_list(tx_pc+2); //2-offset + + if(pos ==-1){ + if( _dbg_core_.txpc_idsn_err_cnt >=_DBG_ERR_CNT) return ; //to avoid overflow + //record txpc error sn + mem_cpy(tx_pc, _dbg_core_.txpc_idsn_err[_dbg_core_.txpc_idsn_err_cnt],_dbg_core_.idsn_len); + _dbg_core_.txpc_idsn_err_cnt++; + } + else{ + _dbg_core_.rpt_pkt[pkt_seq].kp_data[cur_kp] = pos; + _dbg_core_.rpt_pkt[pkt_seq].kp_cnt++; + _dbg_core_.kp_info[pos].tx_pc_cnt++; + + #if _DBG_TITLE_CNT !=0 +// {//棰樺彿妫娴, 涓婃姤鍒皊dk鐨勮褰 +// unsigned char title= tx_pc[2+8]; +// _dbg_core_.kp_info[pos].title_NO[title] = pkt_seq; +// } + #endif + } +} + + + +/* +* 鍔犺浇usb 鍙戦佷箣鍓嶇洃娴 +*/ +void _debug_core__record_txpc_info_report(const unsigned char *tx_pc) +{ + unsigned char pkt_seq=tx_pc[4]; + //unsigned char cur_kp= _dbg_core_.rpt_pkt[pkt_seq].kp_cnt; + int pos; + + if( pkt_seq>10) return; //to avoid overflow + //if( cur_kp >= KP_MAX_IN_PKT) return; //涓鍖呮渶澶氬寘鍚8涓敭鐩樻暟鎹紒锛 +//first + pos =_debug_core__search_kp_list(tx_pc+2+5); //2-offset + if(pos ==-1){ + } + else{ + #if _DBG_TITLE_CNT !=0 + {//棰樺彿妫娴, 涓婃姤鍒皊dk鐨勮褰 + unsigned char title= tx_pc[2+8+5]; + _dbg_core_.kp_info[pos].rpt_title_NO[title] = pkt_seq; + } + #endif + } + +//second + if( (tx_pc[2+5+26-1]==0xff)&&(tx_pc[2+5+26]==0xff) ) return; + pos =_debug_core__search_kp_list(tx_pc+2+5+26); //2-offset + if(pos ==-1){ + } + else{ + #if _DBG_TITLE_CNT !=0 + {//棰樺彿妫娴, 涓婃姤鍒皊dk鐨勮褰 + unsigned char title= tx_pc[2+8+5+26]; + _dbg_core_.kp_info[pos].rpt_title_NO[title] = pkt_seq; + } + #endif + } +} + + + + + +/* +* 璁板綍鎶曠エ鏁版嵁涓紝鍝簺閿洏鏁版嵁琚玴c纭鎺ユ敹 +* called by 姣忎釜packet璋冪敤涓娆 +*/ +void _debug_core__record_pcack_info(unsigned char pkt_seq) +{ + unsigned char i; + char pos; + + if( pkt_seq>10) return; + + for(i=0;i<_dbg_core_.rpt_pkt[pkt_seq].kp_cnt;i++){ + pos =_dbg_core_.rpt_pkt[pkt_seq].kp_data[i]; + _dbg_core_.kp_info[pos].acked_pc_cnt++; + }//for + + //clear + _dbg_core_.rpt_pkt[pkt_seq].kp_cnt =0; +} + +#endif + + + + diff --git b/Base_core/core_src/_debug_main.c a/Base_core/core_src/_debug_main.c new file mode 100644 index 0000000..2d94e15 --- /dev/null +++ a/Base_core/core_src/_debug_main.c @@ -0,0 +1,177 @@ + +#include "base_core.h" +#include "_debug_core_.h" +#include "platform_interface.h" +#include "function_interface.h" + +/* +2020.11.08 涓烘洿濂界殑閫傚簲鍚勭璋冭瘯闇姹傚拰閰嶅悎base Assist Tool;閲嶅啓璋冭瘯閮ㄥ垎鐨勫浐浠 +*/ + +#ifdef _DEBUG_CORE_ + +struct _debug_core_STR _dbg_core_={ + .valid_kp_cnt =0, +}; + + + +/* 姝ゅ嚱鏁扮敤浜庡洖澶峚ssist tool鐨勫懡浠 +*/ +void response_pc_cmd( char type[], unsigned char *ack,unsigned char len) +{ + unsigned char tmp[64]; + if(len>56) len=56; + mem_cpy(ack,tmp+8,len); + mem_set(tmp+8+len,56-len,' '); + tmp[0] = 'a'; + tmp[1] = 'c'; + tmp[2] = 'k'; + tmp[3] = '-'; + tmp[4] = type[0]; + tmp[5] = type[1]; + tmp[6] = type[2]; + tmp[7] = ':'; + platform.base_send_data_to_pc(tmp,64); +} + + +/* +* 鑾峰彇閿欒淇℃伅鍑芥暟 +*/ +void get_SNerror_info(unsigned char err_total,unsigned char (*err_p)[6], unsigned char seq, unsigned char *info) +{ + unsigned char i; + info[0] = err_total; + for(i=0;i<6;i++){ + info[1+i*8] = seq; + info[2+i*8] = ':'; + mem_cpy(err_p[seq],info+3+i*8,6); //mem_cpy(_dbg_core_.rx_idsn_err[seq],info+3+i*8,6); + } +} + +#endif + + + + +#if defined(_DBG_2G4_KP_) + +/* ------------ +* 鑾峰彇鍩虹閿洏淇℃伅 +*/ +static void get_keypad_info__basic(unsigned char offset, unsigned char *info) +{ + struct _debug_keypad_info_STR p =_dbg_core_.kp_info[offset]; + mem_cpy(p.kp_idsn,info+0,6); + info[6] = p.rx_kp_cnt>>8; + info[7] = p.rx_kp_cnt; + info[8] = p.ack_kp_cnt>>8; + info[9] = p.ack_kp_cnt; + info[10] = p.tx_pc_cnt>>8; + info[11] = p.tx_pc_cnt; + info[12] = p.acked_pc_cnt>>8; + info[13] = p.acked_pc_cnt; +} + + +/*------------------- +* 澶勭悊閿洏璋冭瘯淇℃伅鍏ュ彛 +* called by +*/ +void _debug_core__process_keypad_info(unsigned char *pc) +{ +// unsigned char tmp[64],cmd_type; +// unsigned char start_offset =6; + +// mem_set(tmp,64,' '); +// mem_cpy(pc+8,tmp,start_offset); +// cmd_type =pc[12]; +// //pc[13] ==':' +// //pc[14] ---鏈夋晥鏁版嵁寮濮.... +// if(mem_compare(pc+8,(unsigned char*)"READ",4) ){//read keypad info +// unsigned char index; +// index = pc[14]; +// switch (cmd_type){ +// case '1': //read閿洏鍩虹淇℃伅 +// get_keypad_info__basic(index,tmp+start_offset); +// break; +// case '2': //rx keypad sn error +// get_SNerror_info(_dbg_core_.rx_idsn_err_cnt,_dbg_core_.rx_idsn_err,index,tmp+start_offset); +// break; +// case '3': //ack keypad sn error +// get_SNerror_info(_dbg_core_.ack_idsn_err_cnt,_dbg_core_.ack_idsn_err,index,tmp+start_offset); +// break; +// case '4': //tx pc sn error +// get_SNerror_info(_dbg_core_.txpc_idsn_err_cnt,_dbg_core_.txpc_idsn_err,index,tmp+start_offset); +// break; +// +// default: +// mem_cpy("ERR",tmp+start_offset,3); +// break; +// }//sw +// }//if +// else if(mem_compare(pc+8,(unsigned char*)"STAT",4) ){ +// switch (cmd_type){ +// case '1'://setting +// if( (pc[14] ==0)||(pc[14] ==1)||(pc[14] ==2) ){ +// _dbg_core_.status =pc[14]; +// mem_cpy("ok ",tmp+start_offset,3); +// } +// else +// mem_cpy("ERR",tmp+start_offset,3); +// break; +// case '3': //inquire +// tmp[start_offset] = _dbg_core_.status; +// tmp[start_offset+1] = _dbg_core_.valid_kp_cnt; +// tmp[start_offset+2] = _dbg_core_.idsn_len; +// tmp[start_offset+3] = _dbg_core_.rx_idsn_err_cnt; +// tmp[start_offset+4] = _dbg_core_.ack_idsn_err_cnt; +// tmp[start_offset+5] = _dbg_core_.txpc_idsn_err_cnt; +// break; +// default: +// mem_cpy("ERR",tmp+start_offset,3); +// break; +// }//sw +// } +// else{ +// mem_cpy("ERR",tmp+start_offset,3); +// } + +// //response pc cmd +// response_pc_cmd("kyp",tmp,64); +} +#endif + + + +/*---------------------------------------------------------------- +鎵鏈夎皟璇曞懡浠ょ殑鎬诲叆鍙 +called by usb rx functionW +*/ +void _debug_core__cmd_enter(unsigned char *pc) +{ +// #ifdef _DEBUG_CORE_ +// if( (pc[0] !='s')||(pc[1] !='n')||(pc[2] !='d')||(pc[3] !='-')||(pc[13] !=':')) return; + +// //1,璋冭瘯閿洏 +// if(mem_compare(pc+4,(unsigned char*)"kyp:",4) ){ +// #if defined(_DBG_2G4_KP_) +// //_debug_core__process_keypad_info(pc); +// #endif +// } +// else if(mem_compare(pc+4,(unsigned char*)"fun:",4) ){ +// function._debug__function_enter(pc); +// } +// else if(mem_compare(pc+4,(unsigned char*)"cor:",4) ){ +// _debug_core__process_core_info(pc); +// } +// else if(mem_compare(pc+4,(unsigned char*)"5g8:",4) ){ +// #ifdef _DBG_VOICE_KP +// _debug_core__process_5G8_keypad(pc); +// #endif +// } +// +// #endif +} + diff --git b/Base_core/core_src/_debug_sort.c a/Base_core/core_src/_debug_sort.c new file mode 100644 index 0000000..02661eb --- /dev/null +++ a/Base_core/core_src/_debug_sort.c @@ -0,0 +1,158 @@ + +#include "base_core.h" +#include "_debug_core_.h" + + + +#if defined(_DBG_2G4_KP_) +/* +return: +-1--- my < dist +0--- my ==dist +1--- my > dist +*/ +static int check_mem(const unsigned char*my,const unsigned char*dist,unsigned char len) +{ + unsigned char i; + for(i=0;i dist[len-1-i]) return 1; + else if( my[len-1-i] < dist[len-1-i]) return -1; + }//for + return 0; +} + + +/* +function:灏嗕竴涓猻n瀛樻斁鍦ㄥ綋鍓峫ist涓寚瀹歱os浣嶇疆 +0 - 鎺掑湪pos鍚庨潰after +1 -鎺掑湪pos鍓嶉潰before +*/ +static void move_(struct _debug_core_STR *tmp, + unsigned char pos, + unsigned char bf_aft, + const unsigned char *sn) +{ + unsigned char i,len = tmp->valid_kp_cnt; + unsigned char idsn_len = tmp->idsn_len; + + if(len==0) return; //prevent overflow + + if( bf_aft ==0){// 鏀惧湪pos鍚庨潰 + for(i=pos+1;ikp_info[len+pos-i].kp_idsn,tmp->kp_info[len+pos-i+1].kp_idsn,idsn_len); + mem_cpy(sn,tmp->kp_info[pos+1].kp_idsn,idsn_len); //insert + } + else{ + for(i=pos;ikp_info[len-1+pos-i].kp_idsn,tmp->kp_info[len-1+pos-i+1].kp_idsn,idsn_len); + mem_cpy(sn,tmp->kp_info[pos].kp_idsn,idsn_len); //insert + } +} + + +/*Input: +* rx_kp[0] -- len +* rx_kp[1] -- 0x91/92/93,94 + fucntion :鐢ㄤ簬璁板綍杩炴帴鍒板熀绔欑殑鎵鏈夐敭鐩橈紝骞朵笖鎸夌収閿洏SN浠庡皬鍒板ぇ鐨勯『搴忥紙渚夸簬鍚庣画浣跨敤鏃跺揩閫熸煡琛) +* input: 鍖呭惈閿洏SN +* 鎸夐『搴忔彃鍏ュ埌鍒楄〃涓(鎵惧埌绗竴涓瘮鑷繁澶х殑锛屾斁鍦ㄥ叾鍓嶉潰);濡傛灉宸茬粡瀛樺湪灏变笉澶勭悊 +*/ +unsigned char _debug_core__creat_keypad_list(const unsigned char *rx_kp) +{ + unsigned char mid,len; + unsigned char range_start,range_end; + int s_rslt,e_rslt,mid_rslt; + unsigned char idsn_len; + unsigned char index; + + //update/record idsn_len and idsn_index + if( get_idsn_and_len(rx_kp[1],&_dbg_core_.idsn_index,&_dbg_core_.idsn_len)==0 ) return 0; + + idsn_len = _dbg_core_.idsn_len; + index = _dbg_core_.idsn_index; + //process [0] specially!! + if( (len = _dbg_core_.valid_kp_cnt) ==0 ){ + mem_cpy(rx_kp + index,_dbg_core_.kp_info[0].kp_idsn,idsn_len); + _dbg_core_.valid_kp_cnt++; + return 1; + } + + range_start =0; + range_end = len -1; + + while (1){ + if(range_end - range_start <= 1){ + s_rslt = check_mem(rx_kp + index,_dbg_core_.kp_info[range_start].kp_idsn,idsn_len); + e_rslt = check_mem(rx_kp + index,_dbg_core_.kp_info[range_end].kp_idsn,idsn_len); + if( (s_rslt==0) || (e_rslt==0) ) return 0; //宸茬粡瀛樺湪灏变笉鐢ㄦ帓搴忎簡 + else if(s_rslt==-1) + move_(&_dbg_core_,range_start,1,rx_kp + index); + else if( (s_rslt==1)&& (e_rslt==-1)) + move_(&_dbg_core_,range_start,0,rx_kp + index); + else + move_(&_dbg_core_,range_end,0,rx_kp + index); + + break; + } + + mid =(range_end - range_start)>>1; // /2 + mid_rslt = check_mem(rx_kp + index,_dbg_core_.kp_info[range_start+mid].kp_idsn,idsn_len); + if( mid_rslt ==0) return 0; //宸茬粡瀛樺湪灏变笉鐢ㄦ帓搴忎簡 + else if( mid_rslt ==1) + range_start = range_start+mid; + else + range_end = range_start+mid; + }//while + + _dbg_core_.valid_kp_cnt++; + return 1; +} + + + +/* +* 鏌ユ壘keypad list涓寚瀹歴n鐨勪綅缃紱濡傛灉瀛樺湪灏辫繑鍥炲叾涓嬫爣; +0xff - 娌℃湁杩欎釜SN +0- _DBG_KP_CNT ;got it +*/ +unsigned char _debug_core__find_idsn_in_list( const unsigned char *rx_sn) +{ + unsigned char mid,len; + unsigned char range_start,range_end; + int mid_rslt; + unsigned char idsn_len = _dbg_core_.idsn_len; + + //process [0] specially!! + if( (len = _dbg_core_.valid_kp_cnt) ==0 ) return 0xff; + + range_start =0; + range_end = len -1; + + while (1){ + if(range_end - range_start <= 1){ + if( check_mem(rx_sn,_dbg_core_.kp_info[range_start].kp_idsn,idsn_len) ==0) + return range_start; + else if( check_mem(rx_sn,_dbg_core_.kp_info[range_end].kp_idsn,idsn_len) ==0) + return range_end; + else + break; //not found!!! + } + + mid =(range_end - range_start)>>1; // /2 + mid_rslt = check_mem(rx_sn,_dbg_core_.kp_info[range_start+mid].kp_idsn,idsn_len); + if( mid_rslt ==0) return range_start+mid; + else if( mid_rslt ==1) + range_start = range_start+mid; + else + range_end = range_start+mid; + }//while + + return 0xff; +} + +#endif + + + + + diff --git b/Base_core/core_src/base_core.c a/Base_core/core_src/base_core.c new file mode 100644 index 0000000..69cb0cc --- /dev/null +++ a/Base_core/core_src/base_core.c @@ -0,0 +1,593 @@ +/* +*鍩虹珯鏍稿績澶勭悊 +*a,鍒濆鍖栨牳蹇冪浉鍏冲弬鏁 +*b,杞鍩虹珯鏍稿績鍑芥暟 +*/ + +#include "base_pc_protocol.h" +#include "platform_interface.h" +#include "function_interface.h" +#include "base_core.h" +#include "base_core_user.h" +#include "string.h" + +#ifdef _DEBUG_CORE_ + #include "SEGGER_RTT.h" + #include "SEGGER_RTT_Conf.h" +#endif + +//kernel variable,used in kernel only!! +struct kernel_STR kernel={ + .multi_title_flag=0, + .ext_vbeacon_onoff_flag=0, + .ext_vbeacon_sysmode_change_flag=0, + .ext_vbeacon_type1_flag =0, + .ext_vbeacon_type2_flag =0, + +}; + +//define enum used record kernel status, +//enum core_run_state_ENUM KERNEL_RUN_STATE; + +/* +* 鑾峰彇鍐呮牳鐗堟湰 +*/ +static void get_core_version(unsigned char *ver) +{ + ver[0] = CORE_VER0; + ver[1] = CORE_VER1; + ver[2] = CORE_VER2; +} + +void base_core_force_sysmode0(void) +{ + vote_beacon.sys_mode =0; + mem_set(vote_beacon.vbuf,5,0); + + //mulit content,broadcast + kernel.multi_title_flag =0; // +} + +struct base_core_STR base_core={ + .get_core_ver = get_core_version, + .core_init =base_core_init_all, + .core_loop =base_core_main_loop, + .timer_2ms5_enter =base_core_2ms5_isr, + .timer_20ms_enter =base_core_20ms_isr, + .timer4_enter = base_core_28ms_isr, + .get_match_code =get_base_match_code, + .get_id =get_base_id, + .get_log_mode =get_base_log_mode, + + .set_main_rf_chan = process_setup_single_chan,//update_single_freq, + .get_main_rf_chan=get_base_main_rfchannel, + .get_mainRF_hard_id =get_main_rf_hard_id,//缁欏閮ㄧ敤鎴 + .get_whitelistRF_hard_id =get_whitelist_rfid, + + .sdk_data_fifo_in =pcrx_data_save, + .rf_data_fifo_in =keypad_rf_data_save, + + .send_data_to_pc =base_tx_to_pc_sub, +// .send_data_to_pc =keypad_transfer2pc_data_save, + + .get_vote_datapos =get_datapos, + + .get_sdk_connect_status =get_pc_connect_status, + .get_sdk_connect_status_acc =get_pc_connect_status_acc, + .get_run_status =get_base_status, + + .send_rf_data =send_to_keypad_user_hardID, + .switch_send_beacon = base_send_beacon_switch, + .get_send_beacon = get_base_send_beacon_status, + .get_permit_dispaly_flag = get_permit_dispaly_status, + .force_sysmode0 = base_core_force_sysmode0, + + #ifdef RF_5G8 + .get_5G8_keypad_sn_list =get_link_queue_sn, + .get_5G8_keypad_online_count =get_keypad_count, + #endif + +}; + + + +//------------------------------------------- +/* +*鍙栧嚭鏍囧織浣嶅悗锛屾竻闄ゆ鏍囧織浣嶏紒锛侊紒 +*/ +unsigned char get_permit_dispaly_status(void) +{ + unsigned tmp =kernel.permit_display_flag; + kernel.permit_display_flag=0; + return tmp; +} + + +//-------------------------------------------------------------------------- +///* +//Led1鐢ㄤ簬鎸囩ず鍩虹珯鍜宲c涔嬮棿鐨勮繛鎺ワ細 +// 娌℃湁琚玴c usb璇嗗埆锛氬父浜 +// 琚玴c usb 璇嗗埆锛0.5S闂撮殧闂儊 +// 涓嶴DK鏈夋暟鎹氫俊锛氶绻侀棯鐑 + +//Led2鐢ㄤ簬鎸囩ず鍩虹珯鍜岄敭鐩樹箣闂寸殑閫氫俊鐘舵侊細 +// 娌℃湁閿洏鏁版嵁锛氬父鐏 +// 鏈夋敹鍒伴敭鐩樻暟鎹細棰戠箒闂儊 +//*/ + +/* +* indicate led, and update pc connect status +* called by base core rx function */ +void refresh_pc_connect_status(void) +{ + platform.pc_led_ctrl(2);//闂儊 + + kernel.sdk_connect_status =1; + kernel.sdk_connect_count=0; + + kernel.sdk_connect_status_acc =1; + kernel.sdk_connect_count_acc=0; +} + +/* +* turn on LED if it stay OFF status; +*called by rcvRF data +*/ +void refresh_rcvRF_indicate(void) +{ + if(kernel.rf_led_status ==0) return; + + kernel.rf_led_status =0; + kernel.rf_led_count=0; + platform.rf_led_ctrl(1); +} + + +/* +* 鑾峰彇datapos 鐢ㄤ簬骞挎挱淇℃伅 */ +unsigned char get_datapos(void) +{ + return vote_beacon.DATAPOS; +} + + +/* +* get pc connect status */ +unsigned char get_pc_connect_status(void) +{ + return kernel.sdk_connect_status; +} + +unsigned char get_pc_connect_status_acc(void) +{ + return kernel.sdk_connect_status_acc; +} +/* +* get base status: +* base status =idle,vote, trans to pc,trans to keypad,update keypad fireware銆傘傘 +* +*/ +unsigned char get_base_status(void) +{ +// if( (vote_beacon.sys_mode!=0)&&(vote_beacon.sys_mode!=40)) +// return 1; +// else +// return 0; + + if( vote_beacon.sys_mode ==40) + kernel.run_state = _STA_FAST_MATCH; + else if( vote_beacon.sys_mode ==16){ + if( (kernel.run_state !=_STA_VOICE_VOTEING)&&(kernel.run_state !=_STA_VOICE_START)) + kernel.run_state = _STA_VOICE_START; + else + kernel.run_state = _STA_VOICE_VOTEING; + } + else if( vote_beacon.sys_mode !=0) + kernel.run_state = _STA_GENERAL_VOTEING; + else if( vote_beacon.sys_mode ==0) + kernel.run_state =_STA_SYSMODE_0; + else{ + kernel.run_state = _STA_IDLE; + } + + + //姝ゅ鍙互瀹屽杽鏍稿績鐨勫悇绉嶇姸鎬!! + return kernel.run_state; +} + + + +/* +* timer monitor pc connect status +*called by 20ms timer */ +void timer_20ms_function(void) +{ + kernel._20ms_flag =1; + + //1, rf LED keep on 100ms. + if( (kernel.rf_led_status==0)&&(++kernel.rf_led_count>5)){ + kernel.rf_led_count=0; + kernel.rf_led_status=1; + platform.rf_led_ctrl(0); + } + + //2, The pc LED flashes at 500ms once ,if the usb connection is OK. + if( ++kernel.pc_led_count>25){ + kernel.pc_led_count =0; + //(platform.usb_connect_status())? platform.pc_led_ctrl(2):platform.pc_led_ctrl(1); + if( platform.usb_connect_status()) + platform.pc_led_ctrl(2); + else + platform.pc_led_ctrl(1); + } + + //3, the SDK is considered offline, if no data is received within 1S; + if(++kernel.sdk_connect_count > 1500){//20210327鐢1S淇敼鎴30S sdk绂荤嚎瓒呮椂銆50*30 + kernel.sdk_connect_status=0; + kernel.sdk_connect_count=0; + } + + if(++kernel.sdk_connect_count_acc > 50){ + kernel.sdk_connect_status_acc=0; + kernel.sdk_connect_count_acc=0; + } +} + + + + +/* +璁剧疆纭欢淇℃伅*/ +void set_base_hard_firmware_info(void) +{ + base_hdinfo.NEWVER =0xA0; + base_hdinfo.MODEL = function.hdinfo_HMODEL; + base_hdinfo.H_VER= 13; + base_hdinfo.S_VER=1; + base_hdinfo.SW_3B[0]=function.hdinfo_SW1; + base_hdinfo.SW_3B[1]=function.hdinfo_SW2; + base_hdinfo.SW_3B[2]=function.hdinfo_SW3; +} + + +/* ------------------------------------------------------------------- +鍒濆鍖栧熀绔欐牳蹇冪殑鍙傛暟 +涓婄數鍒濆鍖栨椂琚皟鐢 +*/ +void base_core_init_all(void) +{ + //20200317锛屽涓嬩袱涓嚱鏁扮殑鍏堝悗椤哄簭浜掓崲浜嗭紒璇诲彇澶氶鐐逛俊鎭悗鍐嶅幓璁剧疆鏃犵嚎妯″潡 + base_read_e2prom_parameter(); + multi_chan_init();//鍒濆鍖栧妯″潡鐩稿叧鍙傛暟 + + vote_data_parameter_init(); //鍒濆鍖栧鐞嗘姇绁ㄦ暟鎹浉鍏冲弬鏁 + + base_process_pc_init(); //鍒濆鍖栨帴鏀秔c鐩稿叧鍙傛暟 + base_process_keyapad_init();//鍒濆鍖栭敭鐩樼浉鍏冲弬鏁 + + #ifdef _DBG_2G4_KP_ + _debug_core__init(); + #endif +} + + +/* +鍩虹珯鏍稿績鍑芥暟鍦ㄤ富绋嬪簭寰幆涓璋冪敤 +*/ +void _debug_core__RTT_read(void); +void base_core_main_loop(void) +{ + //keypad + #ifdef MAINLOOP_PROCESS_VOTE + keypad_rf_data_process(); //澶勭悊鎺ユ敹鍒扮殑rf鏁版嵁 + #endif + //pc + base_process_pc_data(); //澶勭悊鎺ユ敹鍒皃c鐨勬暟鎹 + + #ifdef MAINLOOP_PROCESS_VOTE + vote_data_report_to_pc(); //鍩虹珯涓婃姤鎶曠エ鏁版嵁缁檖c + #endif + keypad_transfer2pc_data_fetch(); //鍙戦 閿洏杞彂缁檖c鐨勬暟鎹 + + _debug_core__RTT_read(); + + if(kernel._20ms_flag){ + kernel._20ms_flag =0; + function.monitor__freq_process(); + } + +} + + +#ifdef _DEBUG_CORE_ + +#define DEBUG_KP_MAX 40 +#define DEBUG_SUBJECT_MAX 25 // 200/8 姣忛鐢ㄤ竴涓猙it浣嶈〃绀 + +volatile unsigned char debug_rxkp[DEBUG_KP_MAX][DEBUG_SUBJECT_MAX]={0}; +volatile unsigned char debug_ackkp[DEBUG_KP_MAX][DEBUG_SUBJECT_MAX]={0}; +volatile unsigned char debug_txpc[DEBUG_KP_MAX][DEBUG_SUBJECT_MAX]={0}; +volatile unsigned char debug_pcack[DEBUG_KP_MAX][DEBUG_SUBJECT_MAX]={0}; +volatile unsigned char debug_subject=0; +volatile unsigned short debug_rxkpcnt[DEBUG_KP_MAX]={0}; +volatile unsigned short debug_ackkpcnt[DEBUG_KP_MAX]={0}; + +void basic_delay_us( unsigned short time ); + +void _debug_set_subject(unsigned char val) +{ + debug_subject = val/8; +} + +void debug_set_buf_bit(unsigned char *buf, unsigned int index) +{ + unsigned char i=0,j=0; + i=index/8; + j=index%8; + *(buf + i)|=(0x01<5) + { + cnt=0; + SEGGER_RTT_printf(0,"\n "); + basic_delay_us(5000); + } + } + SEGGER_RTT_printf(0,"\n"); + basic_delay_us(5000); + } +// else +// { +//// SEGGER_RTT_printf(0,"SN:%03d Rx_cnt:%d ACK_cnt:%d\n ",i+1, debug_rxkpcnt[i], debug_ackkpcnt[i]); +// } + } + + } +// else +// { +// unsigned int avg_rxcnt=0,avg_ackcnt=0; +// unsigned char rxcnt=0,ackcnt=0; +//// SEGGER_RTT_printf(0,"Keypad RX OK!\n"); +// SEGGER_RTT_printf(0,"OK\n"); +// for(i=0;ifront; + for(i=0;inext ==NULL) return 0; + p = p->next; + } + + while(p->next!=NULL){ + + if (p->next->element.buf_warnning ==1) //if ((p->next->element.buf_warnning ==1)) //des by Pei; 鍘绘帀涓瀵规嫭鍙凤紝瑙e喅缂栬瘧鎶ヨ20210221 Gavin; + { + memcpy(buf_get_info.SN,p->next->element.id_sn,4); + buf_get_info.GetT=0; + buf_get_info.Status=1; + //sn=(buf_get_info.SN[0]<<24)+(buf_get_info.SN[1]<<16)+(buf_get_info.SN[2]<<8)+(buf_get_info.SN[3]); + //DEBUG_LOG(">>>SN[%10d] @%d BufAlert Get Start!\n",sn,offset+1); + return offset+1; + } + p =p->next; + offset++; + }//while + return 0; +} + + +#endif + +#ifdef VOICE_PROTOCOL_3RD +/* 20200924 绉绘鏁村悎绗笁鐗堝崗璁; +*a,鍗忚涓鍔犱簡閿洏buf鍛婅鏍囧織锛屽熀绔欐敹鍒板悗缁欎簣姝ら敭鐩樻洿澶氱殑鏃堕棿鐗; buf_warnning +*b,妯$硦浜嗙偣鍚嶅拰閲嶄紶鐨勫尯鍒;鐐瑰悕涔熶細灏嗕笂娆$殑re_send_offset鍙戦佺粰閿洏; +*c,閿洏鍦ㄦ敹鍒拌姹傞噸浼犳椂,浼氬皢閲嶄紶slot+鏂扮殑鏁版嵁 =8slot閲嶆柊鍙戦; +*d,鍩虹珯鍙戦侀噸浼犱俊鎭笉婊10涓椂,浼氭寜鐐瑰悕鐨勬柟寮忚ˉ婊★紝骞惰褰昮ill_10_offset浣嶇疆锛 +***閬囧埌鍚屾牱鎯呮櫙鏃跺氨浼氭帴鐫fill_10_offset缁х画琛ユ弧10锛岀洿鍒拌ˉ婊℃垨鑰呴亶鍘嗗畬queue!!! +*f,鎺ョ潃d,涓洪伩鍏嶅悓涓涓敭鐩楽N閲嶄紶鍜岃ˉ婊10閲嶅鐨勬儏鍐(涓嶄細鍑洪敊,褰卞搷鏁堢巼),鐢╝sk_resend_state鏉ュ尯鍒 +*/ + +unsigned char fill_10_offset=0; //琛10璇诲彇鍒皅ueue涓綅缃亸绉 +/* +* 閲嶄紶涓暟涓嶆弧10涓椂锛岃皟鐢ㄦ鍑芥暟琛ユ弧10(濡傛灉queue鏈夎冻澶熷悕鍗曠殑璇) +* 鐐瑰悕涓暟涓嶆弧10涓椂, +* 濡備綍閬垮厤锛歛,鏌愪釜閿洏鐨勯噸浼犲拰鐐瑰悕涓嶅湪鍚屼竴涓懆鏈熷唴? +*/ +unsigned char fill_10_list(struct link_queue_STR *queue,unsigned char *out,unsigned char count) +{ + unsigned char i; + struct link_node_STR *p =queue->front; + + for(i=0;inext ==NULL) return 0; + p = p->next; + } + + while( count <10){ + if(p->next==NULL){ //鍒板熬浜? + fill_10_offset =0; + return 0; + } + if(p->next->element.ask_resend_state==1){//鍒氬垰宸茬粡閲嶄紶浜;琛ラ綈10涓噷灏变笉瑕佸寘鎷畠浜; + p =p->next; + continue; + } + //4byte sn +1byte re_send_slot; + mem_cpy(p->next->element.id_sn,&out[count*5],4); + #ifdef VOICE_PROTOCOL_3RD + out[count*5+4] = p->next->element.re_send_slot; + #else + out[count*5+4] = 0x00;//姝ゅ瓧鑺傝〃绀洪噸浼狅紝姝ゅ涓虹偣鍚嶏紝杈撳嚭0x00; p->next->element.re_send_slot; + #endif + p->next->element.re_send_slot =0xff; +#ifdef _DBG_VOICE_KP + if( base_core.get_run_status() ==_STA_VOICE_VOTEING )//鎶曠エ鐘舵佷笅鎵嶈褰 + p->next->element.send_beacon_cnt++; +#endif + fill_10_offset++; + count++; + p =p->next; + }//while + + return 0; +} +#endif + + +/* +杩炵画鍙栧嚭10 涓猠lement 鏁版嵁锛歴n,re-send; +* out ---keypad sn and re-send-slot; +* offset ---start search from queue offset; +*return :涓嬩竴涓妭鐐 鍦ㄩ槦鍒椾腑鐨勫亸绉; +*/ +unsigned char link_queue_outN(struct link_queue_STR *queue,unsigned char *out,unsigned char offset) +{ + unsigned char i; + unsigned char len=0; + unsigned char count=0; + struct link_node_STR *p =queue->front; + + for(i=0;inext ==NULL) return 0; + p = p->next; + } + + while(p->next!=NULL){ + len++; + //4byte sn +1byte re_send_slot; + mem_cpy(p->next->element.id_sn,&out[count*5],4); + #ifdef VOICE_PROTOCOL_3RD + p->next->element.ask_resend_state =0; + out[count*5+4] = p->next->element.re_send_slot; + #else + out[count*5+4] = 0x00;//姝ゅ瓧鑺傝〃绀洪噸浼狅紝姝ゅ涓虹偣鍚嶏紝杈撳嚭0x00; p->next->element.re_send_slot; + #endif + p->next->element.re_send_slot =0xff; +#ifdef _DBG_VOICE_KP + if( base_core.get_run_status() ==_STA_VOICE_VOTEING )//鎶曠エ鐘舵佷笅鎵嶈褰 + p->next->element.send_beacon_cnt++; +#endif + p =p->next; + if(++count>=10){ + if(p->next!=NULL) + return (offset+len);//(p->next->next - queue->front); + else + return 0; + } + }//while + + + + return 0; +} + + +/* +鏌ユ壘鏄惁瀛樺湪闇瑕侀噸浼犵殑閿洏锛屽鏋滄湁灏卞鍒跺叾鏁版嵁 +姣忔鏈澶氬鍒10涓紝 +鐒跺悗缁х画閬嶅巻涔嬪悗鐨勯槦鍒楋紝鐩村埌鎵惧埌杩樻湁閲嶄紶鐨勬垨鑰呮病鏈夐噸浼犵殑浜*/ +unsigned char link_queue_outN_re_send(struct link_queue_STR *queue,unsigned char *out,unsigned char offset) +{ + unsigned char i; + unsigned char len=0; + unsigned char count=0; + struct link_node_STR *p =queue->front; + + for(i=0;inext ==NULL) return 0; //add 20200924?? + p = p->next; + } + while(p->next!=NULL){ + len++; + #ifdef VOICE_PROTOCOL_3RD + if( (p->next->element.re_send_slot ==0)&&(p->next->element.buf_warnning==0) ) + #else + if(p->next->element.re_send_slot ==0) + #endif + { + p =p->next; continue; + } + #ifdef _DBG_VOICE_KP + p->next->element.re_send_timers++; + #endif + + #ifdef BUF_ALERT2 + if ((p->next->element.buf_warnning==1)&&(buf_get_info.Status==0)) + {//浼樺寲閲嶄紶涓湁buf鍛婅锛屼竴瀹氭墽琛岀偣鍚嶏紝鍗充娇閿洏鍙堜笉鍛婅浜 + //DEBUG_MSG("SN[%10d] Buf Alert!-PreSET-\n",sn); + memcpy(buf_get_info.SN,p->next->element.id_sn,4); + buf_get_info.GetT=0; + buf_get_info.Status=1; + } + #endif + + mem_cpy(p->next->element.id_sn,&out[count*5],4);//4byte sn +1byte re_send_slot; + out[count*5+4] = p->next->element.re_send_slot; + /* 姝ゅ涓嶅悓鐨勫師鍥犳槸閿洏瀵归噸浼犵殑澶勭悊涓嶅悓浜: + a,befor 閿洏鏀跺埌閲嶄紶淇″彿鍚庯紝灏卞彂閫佸熀绔欏憡鐭ョ殑閭e嚑涓猻lot灏卞彲浠ヤ簡; + b,Now 閿洏鏀跺埌閲嶄紶淇″彿鍚,灏嗗熀绔欏憡鐭ョ殑閭e嚑涓猻lot鍜屾柊鐨勬暟鎹噾榻7slot鍙戦; */ + #ifdef VOICE_PROTOCOL_3RD + p->next->element.re_send_slot=0xFF; //pei婕忎簡灏卞鑷村師鏉ョ殑涓㈠寘锛侊紒 + p->next->element.ask_resend_state =1; + #endif + p =p->next; + if(++count>=10){ + while(p->next !=NULL){//缁х画鏌ユ壘鐪嬪悗闈㈡槸鍚﹁繕鏈夋暟鎹; + if( p->next->element.re_send_slot !=0) return len+offset;//(p->next->next - queue->front); + len++; + p =p->next; + }//while + return 0; + } + }//while + + #ifdef VOICE_PROTOCOL_3RD + //閲嶄紶涓嶆弧10涓椂锛屼細鐢ㄧ偣鍚嶆潵浠f浛; + fill_10_list(queue,out,count); + #endif + + return 0; +} + + +/* +妫娴嬮槦鍒椾腑鏄惁鏈夐渶瑕侀噸浼犵殑閿洏*/ +unsigned char link_queue_check_re_send(struct link_queue_STR *queue,unsigned char offset) +{ + unsigned char remain_re_send=0; + + struct link_node_STR *p =queue->front; +// for(i=0;inext; + + while(p->next!=NULL){ + #ifdef VOICE_PROTOCOL_3RD + if( (p->next->element.re_send_slot !=0) ||(p->next->element.buf_warnning==1) ) + #else + if( p->next->element.re_send_slot !=0) + #endif + { + remain_re_send++;//return 1; + } + p =p->next; + }//while + return remain_re_send; +} + + +/* +* 妫娴嬮敭鐩樺湪绾/绂荤嚎 +* check keypad on/offline +*/ +void link_queue_check_online(struct link_queue_STR *queue) +{ + struct link_node_STR *p_tmp,*p =queue->front; + + while(p->next!=NULL){ + if( ++p->next->element.offline_count >= OFFLINE_COUNT){//杩炵画N涓ぇ鍛ㄦ湡娌℃湁鏀跺埌鏁版嵁 + p_tmp =p->next; + if(p_tmp == queue->rear)//濡傛灉鏄熬鎸囬拡锛屾洿鏂 + queue->rear =p; + + p->next = p->next->next; + p_tmp->status=0; + p_tmp->next=NULL; + continue; + } + p =p->next; + }//while +} + + + + + + +/* +*閬嶅巻鏁翠釜闃熷垪锛屽鍒舵湁鏁堥敭鐩樼殑sn鍙 +* return 閿洏鐨勪釜鏁 +*/ +unsigned char get_link_queue_sn(unsigned char *sn) +{ + unsigned char length=0; + struct link_node_STR *p =keypad_info.front; + + while(p->next!=NULL){ + length++; + mem_cpy(p->next->element.id_sn,sn,4); + sn +=4; + p =p->next; + }//while + + return length; +} + + + +/* 閲嶆柊寮濮嬩竴娆ATEpos鍙樺寲; 鍒濆鍖栭噸鍙戞爣蹇! +* 鍏跺疄鍦ㄩ潪璇煶鐘舵佷笅锛屽熀绔欐敹鍒伴敭鐩樼殑蹇冭烦鏃朵篃浼氬垵濮嬪寲閲嶄紶鏍囧織涓0; +*/ +void re_init_all_resend_slot(void) +{ + struct link_node_STR *p =keypad_info.front; + #ifdef VOICE_PROTOCOL_3RD + fill_10_offset=0; // + #endif + while(p->next!=NULL){ + p->next->element.re_send_slot=0; + + p =p->next; + }//while +} + + + + + +/*----------------------------------------------------------- +鍩虹珯澶勭悊閿洏鏃犵嚎鏁版嵁 */ +/* +void keypad_rf_data_process(void) +{ + unsigned char buf[64+4]; +// unsigned char *tmp; +// unsigned char rfid; + + + if(!keypad_rf_data_fetch(buf) )return; + + keypad_rf_data_process_NO_fifo(buf); +} +*/ + +/* + +*/ +void keypad_rf_data_process_NO_fifo(unsigned char *buf) +{ + //unsigned char buf[64+4]; + unsigned char *tmp; + unsigned char rfid; + + +// if(!keypad_rf_data_fetch(buf) )return; + + //buf0 -modual id + //buf1-3 -match code + //buf5 CMD type + tmp= buf+4; + + //灏嗘潵鑷‖浠剁殑id杞寲鎴 鏍稿績璁板綍纭欢id鐨勬暟缁勪笅鏍囷紒锛侊紒锛 + rfid= conver_id(buf[0]); + + //monitor same freq + if(function.monitor__rf_data(tmp)!=0) //if( function.monitor__SW &&(function.monitor__rf_data(tmp)!=0) ) + return; + + //check_matchcode(tmp); + if(mem_compare(buf+1,base_mac.match_code,3) ==0){ + //mem_cpy(buf+1,rx_error_match_code,3); + return; + } + + refresh_rcvRF_indicate(); + + switch(tmp[1]){ + case 0x96: //鏄敭鐩樼殑鍏ョ綉淇℃伅 + { + ELEMENT ele_tmp[1]; + struct link_node_STR *node; + + platform.disable_interrupt(); + if( (node =link_queue_find_special_sn(&keypad_info,tmp+2) ) ==NULL){//闃熷垪涓病鏈夋閿洏sn,灏辫褰曚笅鏉 + mem_cpy(tmp+2,ele_tmp->id_sn,4); + ele_tmp->re_send_slot=0xff; + ele_tmp->offline_count =0; //clear offline count + + #ifdef _DBG_VOICE_KP//debug only. + _debug_voice_kp__init_keypad_parameter(ele_tmp); + #endif + link_queue_input(&keypad_info,ele_tmp); + } + else{ //鏀跺埌宸茬粡鍏ョ綉鐨勯敭鐩樺叆缃戜俊鎭,how to process?????s + #ifdef _DBG_VOICE_KP //debug only!! + _debug_voice_kp__init_keypad_parameter(& node->element); + #endif + } + platform.enable_interrupt(); + } + break; + + #if 1//#ifndef KEYPAD60 + case 0x95: //鏄闊虫暟鎹 --绗竴鐗堣瑷鍗忚 + { + unsigned char total,slot_seq; + struct link_node_STR *node; + + platform.disable_interrupt(); + //鏀跺埌鐨勯敭鐩樻暟鎹笉鍦⊿N list涓紝 涓嶅仛浠讳綍澶勭悊! + if( (node =link_queue_find_special_sn(&keypad_info,tmp+2)) ==NULL)goto _proce_voice_exit;// break; + + if( tmp[8]==0){ //鏄績璺冲寘 + node->element.re_send_slot =0; //娓呴櫎閲嶄紶鏍囧織!!!! + node->element.offline_count =0; //澶嶄綅绂荤嚎鍦ㄧ嚎璁℃暟鍣 + + //杩囨护蹇冭烦鍖,30鍖呬笂鎶1鍖 + if( ++node->element.filt_heart_pkt_count>= 30){ + node->element.filt_heart_pkt_count=0; + } + else + goto _proce_voice_exit;//break; + + if( get_pc_connect_status()==0)//娌℃湁杩炴帴sdk鏃讹紝蹇冭烦鍖呭氨涓嶈繘缂撳啿鍣 + goto _proce_voice_exit;//break; + } + else{ //鏄闊虫暟鎹寘 + node->element.filt_heart_pkt_count=0;//娓呴櫎杩囨护蹇冭烦鍖呰鏁板櫒 + + #ifdef _DBG_VOICE_KP + node->element.rxkp_cnt++; + #endif + + total =tmp[10]>>4; + total = 0xff>>(8-total);//conver to bit + slot_seq =tmp[10]&0x0f; + slot_seq = 1<<(slot_seq-1); + + node->element.offline_count =0; + node->element.re_send_slot &= (~slot_seq)&total; + } + platform.enable_interrupt(); + + //灏嗘暟鎹姞鍏ュ埌涓婃姤鍒皃c鐨勭紦鍐插尯涓 + if( vote_data_store(tmp+1) ==0){ + #ifdef _DBG_VOICE_KP + kernel.rx_buf_overflow++;//debug only + #endif + } + } + break; +_proce_voice_exit: + platform.enable_interrupt(); + break; + #endif + + #if 1//defined(KEYPAD60)&& !defined(VOICE_PROTOCOL_3RD) + case 0x97: //鏄闊虫暟鎹 -绗簩鐗堝崗璁 + { + unsigned char total,slot_seq; + struct link_node_STR *node; +#define PACKH_INDEX 6//8 +#define SLOTN_INDEX 8//10 + platform.disable_interrupt(); + //鏀跺埌鐨勯敭鐩樻暟鎹笉鍦⊿N list涓紝 涓嶅仛浠讳綍澶勭悊! + if( (node =link_queue_find_special_sn(&keypad_info,tmp+2)) ==NULL)goto _proce_voice_exit2;// break; + + if( tmp[PACKH_INDEX]==0){ //鏄績璺冲寘 + node->element.re_send_slot =0; //娓呴櫎閲嶄紶鏍囧織!!!! + node->element.offline_count =0; //澶嶄綅绂荤嚎鍦ㄧ嚎璁℃暟鍣 + + //杩囨护蹇冭烦鍖,30鍖呬笂鎶1鍖 + if( ++node->element.filt_heart_pkt_count>= 30){ + node->element.filt_heart_pkt_count=0; + } + else + goto _proce_voice_exit2;//break; + + if( get_pc_connect_status()==0)//娌℃湁杩炴帴sdk鏃讹紝蹇冭烦鍖呭氨涓嶈繘缂撳啿鍣 + goto _proce_voice_exit2;//break; + } + else{ //鏄闊虫暟鎹寘 + node->element.filt_heart_pkt_count=0;//娓呴櫎杩囨护蹇冭烦鍖呰鏁板櫒 + + #ifdef _DBG_VOICE_KP + node->element.rxkp_cnt++; + #endif + + total =tmp[SLOTN_INDEX]>>4; + total = 0xff>>(8-total);//conver to bit + slot_seq =tmp[SLOTN_INDEX]&0x0f; + slot_seq = 1<<(slot_seq-1); + + node->element.offline_count =0; + node->element.re_send_slot &= (~slot_seq)&total; + } + platform.enable_interrupt(); + + //灏嗘暟鎹姞鍏ュ埌涓婃姤鍒皃c鐨勭紦鍐插尯涓 + if( vote_data_store(tmp+1) ==0){ + #ifdef _DBG_VOICE_KP + kernel.rx_buf_overflow++;//debug only + #endif + } + } + break; +_proce_voice_exit2: + platform.enable_interrupt(); + break; + #endif + + #if defined(KEYPAD60)&& defined(VOICE_PROTOCOL_3RD) + case 0x98: //鏄闊虫暟鎹 -绗笁鐗堝崗璁 + { + unsigned char total,slot_seq; + struct link_node_STR *node; + + platform.disable_interrupt(); + //鏀跺埌鐨勯敭鐩樻暟鎹笉鍦⊿N list涓紝 涓嶅仛浠讳綍澶勭悊! + if( (node =link_queue_find_special_sn(&keypad_info,tmp+2)) ==NULL)goto _proce_voice_exit3;// break; + + node->element.offline_count =0; //澶嶄綅绂荤嚎鍦ㄧ嚎璁℃暟鍣 + if( tmp[8]==0xff){ //鏄績璺冲寘 + node->element.re_send_slot =0; //娓呴櫎閲嶄紶鏍囧織!!!! + + #ifdef BUF_ALERT2 + //0x15鍗曠嫭鐐瑰悕鎻愬墠缁堟锛岃妭绾︿竴鐐规椂闂 + if (buf_get_info.Status) + { + if (mem_compare(tmp+2,buf_get_info.SN,4))//SN鐩稿悓 + { + //DEBUG_MSG("--- BufAlert QuickExit!--%d\n",BUF_GET_T-buf_get_info.GetT); + buf_get_info.GetT=BUF_GET_T; + buf_get_info.Status=0; + } + } + #endif + + //杩囨护蹇冭烦鍖,30鍖呬笂鎶1鍖 + if( ++node->element.filt_heart_pkt_count>= 30){ + node->element.filt_heart_pkt_count=0; + } + else + goto _proce_voice_exit3;//break; + + if( get_pc_connect_status()==0)//娌℃湁杩炴帴sdk鏃讹紝蹇冭烦鍖呭氨涓嶈繘缂撳啿鍣 + goto _proce_voice_exit3;//break; + } + else{ //鏄闊虫暟鎹寘 + node->element.filt_heart_pkt_count=0;//娓呴櫎杩囨护蹇冭烦鍖呰鏁板櫒 + #ifdef _DBG_VOICE_KP + node->element.rxkp_cnt++; + #endif +// total =tmp[10]>>4; +// total = 0xff>>(8-total);//conver to bit +// slot_seq =tmp[10]&0x0f; +// slot_seq = 1<<(slot_seq-1); +// node->element.offline_count =0; +// node->element.re_send_slot &= (~slot_seq)&total; + total =((tmp[8]>>4)&7)+1; + total = 0xff>>(8-total);//conver to bit + slot_seq =tmp[8]&0x0f;//SLOTN + slot_seq = 1<<(slot_seq);//-1); + + //璁板綍璇煶buf鍛婅 + node->element.buf_warnning =(tmp[8]&0x80)?1:0; + } + platform.enable_interrupt(); + + //灏嗘暟鎹姞鍏ュ埌涓婃姤鍒皃c鐨勭紦鍐插尯涓 + if( vote_data_store(tmp+1) ==0){ + #if 1 //#ifdef _DBG_VOICE_KP + kernel.rx_buf_overflow++;//debug only + #endif + } + else{ + node->element.re_send_slot &= ((~slot_seq)&total); //鏀跺埌鐨勭墖鍙穊it缃0 + } + } + break; +_proce_voice_exit3: + platform.enable_interrupt(); + break; + #endif + + //鏅氭姇绁ㄦ暟鎹 + case 0x93: + case 0x94: //store vote data and record SN that using at base ack; + { + struct link_node_STR *node; + if( (node =link_queue_find_special_sn(&keypad_info,tmp+3) ) ==NULL){ + #ifdef _DBG_VOICE_KP + _debug_voice_kp__record_illegal_rx_idsn(tmp+3); + #endif + } + else{ + #ifndef _DBG_VOICE_KP + vote_data_store(tmp+1); + keypad_idsn_save(&tmp[3],4,rfid); + #else + if(vote_data_store(tmp+1) ) + node->element.rxkp_cnt++; + else + kernel.rx_buf_overflow++;//debug only + + if(keypad_idsn_save(&tmp[3],4,rfid) ) + node->element.ackkp_in_cnt++; + else + kernel.rx_idsnbuf_overflow++;//test only + #endif + } + } + break; + + case 0xB0://single packet download + keypad_transfer2pc_data_save(tmp);//store to transfer buffer + //operation_debug_io(4);//test only + break; + + case 0xC0://multi packet download ,using keypad firmware update! + if(function.updatekp__SW && function.update__save_keypad_ack_data(tmp) )return; + break; + + default: + break; + }//sw +} + + +/*鍒濆鍖 鐢ㄤ簬缁勫懠鐨 閾捐〃*/ +void base_process_5G8_keyapd_init_queue(void) +{ + link_queue_init(&keypad_info); +} + + +unsigned short get_rx_buf_overflow(void) //debug only +{ +return kernel.rx_buf_overflow;// +} + + +//----------------------------------------------------------------------------------------- +//----------------------- debug start ----------------------------------------------------- +/* +2020.05.20鐢变簬璇煶閿洏娌℃湁id妯″紡(鑷冲皯鍦ㄨ闊虫ā寮忎笅娌℃湁)锛屽苟涓攕n鍙锋槸鏈塏FC鍗″彿鍐冲畾鐨勶紝娌℃硶鐢ㄦ埛缂栧彿! +浠庤屽鑷磀ebug妫娴嬮敭鐩樻暟鎹椂涓嶈兘浣跨敤甯歌鐨勫唴鏍告娴嬫柟娉(鎴栬呰鐢ㄨ捣鏉ュ緢楹荤儲鑰屼笖妫娴嬪彲鑳戒細褰卞搷杩愯閫熷害) +鎵浠ラ渶瑕佸崟鐙啓debug妫娴嬫柟娉曪細 +a,鍒╃敤閿洏鍚嶅崟keypad list锛屽鍔犲彉閲忚褰曚俊鎭; +b,褰揹ebug app鍙戦佸搴旂殑SN鏌ヨ鏃讹紝鍦╧eypad list涓悳绱㈢劧鍚庡彇鍑哄搴旂殑璋冭瘯淇℃伅; +c锛岃緭鍏f 88 (鍗佽繘鍒禨N-5bytes) +d锛屽紑鍚柊涓杞姇绁ㄦ椂锛屽紑鍚痙ebug鍔熻兘锛屽苟涓旀竻闄ゆ墍鏈夌浉鍏冲彉閲; + + +_DBG_VOICE_KP : +浠庨敭鐩樺崟浣撴潵鐪嬶紝妫娴嬬殑鍙傛暟鏈夛細鍖呮嫭璇煶鍜岄潪璇煶 + 閲嶄紶娆℃暟 + 鏀跺埌鐨勬暟鎹寘涓暟 + 鍩虹珯ack涓暟 + 涓婃姤缁檚dk鏁版嵁鍖呬釜鏁 + 琚玸dk纭鐨勬暟鎹寘涓暟 +*/ + + +#ifdef _DBG_VOICE_KP + +/* +娓呴櫎 鏌愪釜閿洏鐨刣ebug鍙傛暟; 鍏ョ綉鏃惰璋冪敤锛侊紒 +*/ +void _debug_voice_kp__init_keypad_parameter(ELEMENT *ele_tmp) +{ + ele_tmp->re_send_timers =0; + ele_tmp->rxkp_cnt =0; + ele_tmp->ackkp_cnt =0; + ele_tmp->ackkp_in_cnt =0; + ele_tmp->tx_pc_cnt =0; + + ele_tmp->send_beacon_cnt=0; +} + +/* +* 娓呴櫎鎵鏈夌殑debug 鍙傛暟锛涙柊涓杞姇绁ㄥ紑濮嬫椂琚皟鐢!!! +*/ +void _debug_voice_kp__init_all_parameter(void) +{ + struct link_node_STR *p_tmp,*p =keypad_info.front;// queue->front; + + //a,clear all keypad parameter + while(p->next!=NULL){ + _debug_voice_kp__init_keypad_parameter(&p->next->element); + p =p->next; + }//while + + //b,clear other parameter + kernel.re_rpt_pc_count=0; + kernel.rx_buf_overflow =0; + kernel.rx_idsnbuf_overflow =0; +} + + + +/* +*鐩戞祴鏌愪釜閿洏鏁版嵁涓婃姤涓猻dk鐨勬鏁!! +*/ +void _debug_voice_kp__tx_pc(unsigned char *sn) +{ + struct link_node_STR *node; + + //鏀跺埌鐨勯敭鐩樻暟鎹笉鍦⊿N list涓紝 涓嶅仛浠讳綍澶勭悊! + if( (node =link_queue_find_special_sn(&keypad_info,sn)) ==NULL)return; + node->element.tx_pc_cnt++; +} + +/* +*鐩戞祴鏌愪釜閿洏琚熀绔欑‘璁ょ殑娆℃暟,璇煶妯″紡涓嬫病鏈夌‘璁わ紝鎵浠ユ棤鏁!! +*/ +void _debug_voice_kp__ack_keypad(unsigned char *sn) +{ + struct link_node_STR *node; + + //鏀跺埌鐨勯敭鐩樻暟鎹笉鍦⊿N list涓紝 涓嶅仛浠讳綍澶勭悊! + if( (node =link_queue_find_special_sn(&keypad_info,sn)) ==NULL)return; + node->element.ackkp_cnt++; +} + + +void _debug_voice_kp__record_illegal_rx_idsn(unsigned char *sn) +{ + +} + + + + + + + + +/* +* offset鍋忕Щ浣嶇疆涓婄殑閿洏淇℃伅 +*/ +static void get_5g8_keypad_info__basic(unsigned char offset, unsigned char *info) +{ +// struct _debug_keypad_info_STR p =_dbg_core_.kp_info[offset]; +// mem_cpy(p.kp_idsn,info+0,6); +// info[6] = p.rx_kp_cnt>>8; +// info[7] = p.rx_kp_cnt; +// info[8] = p.ack_kp_cnt>>8; +// info[9] = p.ack_kp_cnt; +// info[10] = p.tx_pc_cnt>>8; +// info[11] = p.tx_pc_cnt; +// info[12] = p.acked_pc_cnt>>8; +// info[13] = p.acked_pc_cnt; + + struct link_node_STR *node; + //mem_cpy(p.kp_idsn,info+0,6); + info[6] = node->element.rxkp_cnt>>8; //rx packet count; + info[7] = node->element.rxkp_cnt; + +} + +/*------------------------------------------------------------------ +* +*/ +void _debug_core__process_5G8_keypad(unsigned char* pc) +{ + unsigned char tmp[64],cmd_type; + unsigned char start_offset =6; + + mem_set(tmp,64,' '); + mem_cpy(pc+8,tmp,start_offset); + cmd_type =pc[12]; + //pc[13] ==':' + //pc[14] ---鏈夋晥鏁版嵁寮濮.... + if(mem_compare(pc+8,(unsigned char*)"READ",4) ){//read keypad info + unsigned char index; + index = pc[14]; + switch (cmd_type){ + case '1': //read閿洏鍩虹淇℃伅 + get_5g8_keypad_info__basic(index,tmp+start_offset); + break; + case '2': //rx keypad sn error + //get_SNerror_info(_dbg_core_.rx_idsn_err_cnt,_dbg_core_.rx_idsn_err,index,tmp+start_offset); + break; + case '3': //ack keypad sn error + //get_SNerror_info(_dbg_core_.ack_idsn_err_cnt,_dbg_core_.ack_idsn_err,index,tmp+start_offset); + break; + case '4': //tx pc sn error + //get_SNerror_info(_dbg_core_.txpc_idsn_err_cnt,_dbg_core_.txpc_idsn_err,index,tmp+start_offset); + break; + + default: + mem_cpy("ERR",tmp+start_offset,3); + break; + }//sw + }//if + else if(mem_compare(pc+8,(unsigned char*)"STAT",4) ){ + switch (cmd_type){ + case '1'://setting + if( (pc[14] ==0)||(pc[14] ==1)||(pc[14] ==2) ){ +// _dbg_core_.status =pc[14]; + mem_cpy("ok ",tmp+start_offset,3); + } + else + mem_cpy("ERR",tmp+start_offset,3); + break; + case '3': //inquire +// tmp[start_offset] = _dbg_core_.status; +// tmp[start_offset+1] = _dbg_core_.valid_kp_cnt; +// tmp[start_offset+2] = _dbg_core_.idsn_len; +// tmp[start_offset+3] = _dbg_core_.rx_idsn_err_cnt; +// tmp[start_offset+4] = _dbg_core_.ack_idsn_err_cnt; +// tmp[start_offset+5] = _dbg_core_.txpc_idsn_err_cnt; + break; + default: + mem_cpy("ERR",tmp+start_offset,3); + break; + }//sw + } + else{ + mem_cpy("ERR",tmp+start_offset,3); + } + + //response pc cmd + response_pc_cmd("5g8",tmp,64); + + +} + + + + + + + + + + +#include "stdio.h" +#include "stdlib.h" +#include "string.h" +/* +杈撳叆鐨勫崄鍏繘鍒舵暟锛5瀛楄妭锛夛紝褰撴垚10杩涘埗锛堝彧鏈4瀛楄妭锛; +渚嬪 : +杈撳叆 12 34; 瀹為檯鏄0x1234锛涗絾鏄敤鎴锋兂瑕佺殑鏄崄杩涘埗鐨1234锛 +*/ +//static void Dec_to_Hex(unsigned char *sn,unsigned char *dec ) +//{ +// int tmp; +// char buf[10]; +// unsigned char i; +// +// //a,hex conver to string +// for(i=0;i<5;i++) +// sprintf( (char *)(buf + (i<<1)),"%02x",sn[i]); +// //b,string conver to integer +// tmp =atoi(buf); +// +// dec[0] = tmp>>24; +// dec[1] = tmp>>16; +// dec[2] = tmp>>8; +// dec[3] = tmp>>0; +//} + +/*------------------------------------------------------------ +姝ゅ嚱鏁拌В鍐砫ebug鏃 鏄剧ず瀛楃 +1 line: inquired keypad SN +2 line: keypad list count +3 line: +app 鍙戦佹煡璇㈡煇涓敭鐩樹俊鎭殑鍛戒护 +鍩虹珯鏀跺埌鍛戒护鍚:鍦╧eypad list涓悳绱㈤敭鐩橈紝濡傛灉瀛樺湪,澶嶅埗璇ラ敭鐩樻暟鎹笂鎶ョ粰app; +*/ +void _debug_voice_kp__app_get_keypad_debug_info(unsigned char *sn_dec) +{ + struct link_node_STR *node; + + unsigned char i,j,count; + unsigned char tmp[256]; + unsigned char sn[4]; + + count=0; + memset(tmp,' ',200); + + Dec_to_Hex(sn_dec,5,sn); + + //1 line + sprintf( (char *)(tmp),"SN: "); + sprintf( (char *)(tmp+4),"%010d",(sn[0]<<24)+(sn[1]<<16)+(sn[2]<<8)+sn[3]); + if( (node =link_queue_find_special_sn(&keypad_info,sn)) ==NULL){ + //鏌ヨ鐨凷N涓嶅湪 keypad SN list涓 + sprintf( (char *)(tmp+16),"Err:SN nonexst!"); //2 line + } + else{ + //2 line 鎺ユ敹鍒扮殑閿洏鏁版嵁鍖呬釜鏁 + sprintf( (char *)(tmp+16),"RXKP:"); + sprintf( (char *)(tmp+16+5),"%011d",node->element.rxkp_cnt); + //3 line 閿洏閲嶅彂娆℃暟 + sprintf( (char *)(tmp+32),"KPRETX:"); + sprintf( (char *)(tmp+32+7),"%09d",node->element.re_send_timers); + + //4 line 鍗佸叚杩涘埗 涓婃姤缁檚dk鐨勬暟鎹寘涓暟 + sprintf( (char *)(tmp+48),"TXPC:"); + sprintf( (char *)(tmp+48+5),"%011d",node->element.tx_pc_cnt); + + //5 line 鍥犵紦鍐插櫒婧㈠嚭涓㈠け鐨勬暟鎹寘 鎬讳釜鏁 + sprintf( (char *)(tmp+64),"RX_OV:"); + sprintf( (char *)(tmp+64+6),"%010d",kernel.rx_buf_overflow); + + //6 line 鍦ㄧ嚎閿洏涓暟 + sprintf( (char *)(tmp+80),"KP_CNT:"); + sprintf( (char *)(tmp+80+7),"%09d",get_link_queue_length(&keypad_info) ); + + //7 line 鏁版嵁閲嶅彂缁檚dk鐨勬绘鏁 + sprintf( (char *)(tmp+96),"REPC:"); + sprintf( (char *)(tmp+96+5),"%011d",kernel.re_rpt_pc_count ); + + + //8 line 鐐瑰悕娆℃暟 + sprintf( (char *)(tmp+112),"CALL:"); + sprintf( (char *)(tmp+112+6),"%010d",node->element.send_beacon_cnt ); + } + + tmp[189]=0xa5; //璋冭瘯鏃讹紝bushound鐩戞祴鍒版鏁版嵁涓插氨鍋滀笅鏉ワ紝渚夸簬瑙傚療锛侊紒 + tmp[190]=0x5a; + tmp[191]=0xa5; + + platform.base_send_data_to_pc(tmp+0,256); +} +#endif +//-------------------------- debug end -------------------------------------------- + + + + +#endif //RF_5G8 + diff --git b/Base_core/core_src/base_process_5G8_tx.c a/Base_core/core_src/base_process_5G8_tx.c new file mode 100644 index 0000000..6f03e9c --- /dev/null +++ a/Base_core/core_src/base_process_5G8_tx.c @@ -0,0 +1,600 @@ + +#include "base_core_user.h" +#include "base_core.h" +#include "platform_interface.h" +#include "base_pc_protocol.h" +#include "function_interface.h" + +#ifdef RF_5G8 + +unsigned char Send_beacon_kyepad_nub=0; //add by Daiyu 鏍囧織澶у懆鏈熻鏁 璁╅敭鐩樼煡閬 +/* +2019.12.04 瀹炴祴 delay(500) =500us; +鐜锛氫富棰168MHz,鍏抽棴涓柇,IO鍙栧弽鐢ㄧず娉㈠櫒娴嬭瘯!! +鐢变簬GPIO鏃犳硶鍝嶅簲 delayus(1)锛屾墍浠ュ疄闄呮祴璇昫elay(500) =500us */ +static void _5G8_delay_us( unsigned short time ) +{ + unsigned short i = 0; + while( time-- ){ + i = 30; + while( i-- ) ; + } +} + + +/* +*鍩虹珯鍙戦佹姇绁ㄤ俊鏍 +*Warning !!! 鐗瑰埆娉ㄦ剰锛氭澶刬d鏄ā鍧楃‖浠秈d,涓嶆槸鍐呮牳閲嶆柊缂栫殑鍙风爜!!! +*/ +static void base_load_vote_beacon(unsigned char timers,unsigned char id) +{ + unsigned char i; + unsigned char tmp[64+1]; + + keypad_idsn_clear(); + + tmp[0] =64;//28; //len + base_core.get_match_code(tmp+1);//tmp1-4 + tmp[5] =0x17;//(log_mode_is_ID)?0x13:0x14; //vote beacon + tmp[6] =basic_beacon.nowT[0]; //nowT + tmp[7] =basic_beacon.nowT[1]; + // #ifdef VOTE_BEACON_64BYTE + // mem_cpy(&vote_beacon.head_addr+1,tmp+8,55); //special!!!!!!!Gavin20200204 + // #else + mem_cpy(&vote_beacon.head_addr+1,tmp+8,VOTE_BEACON_LEN); + // #endif + + + mem_cpy(&basic_beacon_crs2.head_addr+1,tmp+29,BASIC_BEACON_CRS2_LEN); +// tmp[29] =basic_beacon_crs2.crs2_attrib[0]| (get_base_log_mode()==5); + tmp[29] =basic_beacon_crs2.crs2_attrib[0]| (base_core.get_log_mode()==5); + tmp[30] =basic_beacon_crs2.crs2_attrib[1]; + tmp[31] =base_core.get_main_rf_chan();//get_base_main_rfchannel();// + tmp[32] =basic_beacon_crs2.crs2_attrib[3]; + + + + for(i=0;i>8; +//// tmp[63] = crc&0xff; +// platform.rf_5G8_load_send_data(tmp+1,64,multi.modual_id[get_mainRF_usr_id()]); +// _5G8_delay_us(50);// delay_us1(50); +// //绗簩娆 +// tmp[6] = 2; +// //crc =crc16(tmp+4,60); +//// tmp[62] = crc>>8; +//// tmp[63] = crc&0xff; +// platform.rf_5G8_load_send_data(tmp+1,64,multi.modual_id[get_mainRF_usr_id()]);//A5130_send_buf(tmp,64); +// _5G8_delay_us(50);// delay_us1(50); +// //绗笁娆 +// tmp[6] = 3; +// //crc =crc16(tmp+4,60); +//// tmp[62] = crc>>8; +//// tmp[63] = crc&0xff; +// platform.rf_5G8_load_send_data(tmp+1,64,multi.modual_id[get_mainRF_usr_id()]);//A5130_send_buf(tmp,64); + + tmp[7]= Send_beacon_kyepad_nub; // 鏍囧織澶у懆鏈熺殑娆℃暟 + //绗竴娆 + tmp[6] = 1; + //crc =crc16(tmp+4,60); +// tmp[62] = crc>>8; +// tmp[63] = crc&0xff; + platform.rf_5G8_load_send_data(tmp+1,64,id); + _5G8_delay_us(150);//_5G8_delay_us(200);// delay_us1(50); + //绗簩娆 + tmp[6] = 2; + //crc =crc16(tmp+4,60); +// tmp[62] = crc>>8; +// tmp[63] = crc&0xff; + platform.rf_5G8_load_send_data(tmp+1,64,id); + //_5G8_delay_us(50);// delay_us1(50); + //绗笁娆 + tmp[6] = 3; + //crc =crc16(tmp+4,60); +// tmp[62] = crc>>8; +// tmp[63] = crc&0xff; +// platform.rf_5G8_load_send_data(tmp+1,64,id); +} + + +/* +7甯ф暟鎹泦涓彂閫侊紝鑺傜渷鍒囨崲鏃堕棿 +Warning !!! 鐗瑰埆娉ㄦ剰锛氭澶刬d鏄ā鍧楃‖浠秈d,涓嶆槸鍐呮牳閲嶆柊缂栫殑鍙风爜!!! +*/ +static void base_send_beacon_all(const unsigned char *info,unsigned char id) +{ + #ifdef KEYPAD60 //60璺闊虫椂涓嶅彂ack + if(vote_beacon.sys_mode !=16) + #endif + base_load_confirm_beacon(2,id); //confirm beacon 2 + + if( pc_transfer2keypad_data_fetch()){//pc transfer to keypad + + } + else{ + #ifdef KEYPAD60 //60璺闊虫椂涓嶅彂ack + if(vote_beacon.sys_mode ==16) + base_load_vote_beacon(1,id); + else + #endif + base_load_vote_beacon(2,id); //vote beacon 2 + } + + base_load_voice_beacon(info,id); //voice beacon 3 +} + +/* +閲嶅彂鏃讹紝璋冪敤姝ゅ嚱鏁帮紝鍖哄埆浜庢甯告暟鎹抚锛屽彧鏄负浜嗚皟璇曞ソ鐪嬫尝褰; +5甯ф暟鎹泦涓彂閫侊紝鑺傜渷鍒囨崲鏃堕棿 +Warning !!! 鐗瑰埆娉ㄦ剰锛氭澶刬d鏄ā鍧楃‖浠秈d,涓嶆槸鍐呮牳閲嶆柊缂栫殑鍙风爜!!! +*/ +static void base_send_beacon_all_2(const unsigned char *info,unsigned char id) +{ + #ifdef KEYPAD60 //60璺闊虫椂涓嶅彂ack + if(vote_beacon.sys_mode !=16) + #endif + base_load_confirm_beacon(1,id); //confirm beacon 2 + + if( pc_transfer2keypad_data_fetch()){ + + } + else + base_load_vote_beacon(1,id); //vote beacon 2 + + base_load_voice_beacon(info,id); //voice beacon 3 +} + + + +/* +*姝ゅ嚱鏁颁粎浠呮槸涓轰簡灏佽鎴恇ase_send_beacon_all 涓鑷达紝渚夸簬璋冪敤 platform.rf_5G8_send_multi_frame +鐢ㄤ簬鍓ā鍧楀彂閫佸涓猘ck +濡傛灉鏄彂閫佷竴涓猘ck鍙互鐢 base_send_confirm_beacon_direct鍑芥暟 +*/ +static void base_send_ack_only(const unsigned char *info,unsigned char id) +{ + base_load_confirm_beacon(2,id); //confirm beacon 2 + +} + + +/* +鍩虹珯鐩存帴鐩存帴....鍙戦佺‘璁や俊鏍 ,涓庝笂杩板嚱鏁扮殑鍖哄埆鏄皟鐢ㄤ竴涓畬鏁寸殑鍙戦佸嚱鏁 锛侊紒锛 +*Warning !!! 鐗瑰埆娉ㄦ剰锛氭澶刬d鏄ā鍧楃‖浠秈d,涓嶆槸鍐呮牳閲嶆柊缂栫殑鍙风爜!!! +//2020.02.27 add by Gavin +*/ +//static void base_send_confirm_beacon_direct(unsigned char timers,unsigned char id) +//{ +// unsigned char tmp[64+1]; +// unsigned char i; +// mem_set(tmp,sizeof(tmp)/sizeof(unsigned char),0); +// +// tmp[0] =64; +// base_core.get_match_code(tmp+1); +// tmp[5] =0x19; +// tmp[6] =0; +// tmp[7] =0; + +// +// for(i=0;i<10;i++){//tmp[8]... +// mem_cpy(multi.multi_idsn[0].idsn[i],tmp+8+5*i,5); //姝ゅid 鍥轰欢涓0--T2鍙湁涓涓ā鍧 +// } +// +// for(i=0;ielement.re_send_slot; + node->element.re_send_slot=0xFF;//!!鍚﹀垯鐐瑰悕閿洏浼氫涪鍖 + + } + + platform.rf_5G8_load_send_data(info+1,64,id); + +} + +#endif + + + + + + + + + + + + + +struct send_beacon_STR{ + unsigned char step; + unsigned char remain_cycle_count; //涓涓ぇ鍛ㄦ湡鍐呬紶杈撶殑娆℃暟锛岃闊+閲嶄紶 = TRANSFER_CYCLE_MAX + unsigned char ask_offset; //褰撳墠鐐瑰悕鍦 SN list涓殑鍋忕Щ; + unsigned char re_send_offset; //褰撳墠閲嶄紶鍦 SN list涓殑鍋忕Щ +}; +static struct send_beacon_STR send_beacon={ + .step=1, + .remain_cycle_count=0, + .ask_offset=0, + .re_send_offset=0, +}; + +//鐢ㄤ簬杩囨护璇煶鍩虹珯蹇冭烦鍖呯殑鍙傛暟锛 +#define SEND_BEACON_INIT 1 +#define SEND_BEACON_VOICE 2 +#define SEND_BEACON_RE_SEND_INIT 3 +#define SEND_BEACON_RE_SEND 4 +#define SEND_BEACON_RE_SEND_BLANK 5 +#define SEND_BEACON_ALERT 6 + +/* ----------------------------------------------- +鍙戦佷俊鏍 鎬诲叆鍙e嚱鏁 +called by timer2.5ms isr*/ +void base_tx_keypad_beacon(void) +{ unsigned char tx_buf[64]; + + #ifndef KEYPAD60 + static unsigned char beancon_count=0; + if(++beancon_count <13) return; //2.5msx13 = 32.5ms! + beancon_count=0; + #endif + + if(function.updatekp__SW ){ + function.update__kp_progress(); + } + + //154*32.5 =5S +// link_queue_check_online(&keypad_info);//姣忎釜澶у懆鏈熷紑濮嬫椂鎵嶆洿鏂伴敭鐩樺湪绾/绂荤嚎 鐘舵 + + + switch(send_beacon.step){ + case 0:break; + + case SEND_BEACON_INIT://鍒濆鍖 + _init_send_beacon: + Send_beacon_kyepad_nub++; // 澶у懆鏈熻嚜澧 + send_beacon.ask_offset=0; + send_beacon.remain_cycle_count =TRANSFER_CYCLE_MAX; + link_queue_check_online(&keypad_info);//姣忎釜澶у懆鏈熷紑濮嬫椂鎵嶆洿鏂伴敭鐩樺湪绾/绂荤嚎 鐘舵 + kernel.keypad_online_cnt =get_link_queue_length(&keypad_info);//get_keypad_count(); + #ifdef BUF_ALERT2 + buf_get_info.ResendT=0; + buf_get_info.Status=0;//!! + #endif + case SEND_BEACON_VOICE: //鐐瑰悕 + if(send_beacon.remain_cycle_count==0){ //娌℃湁鍙戦佸懆鏈(搴旇涓嶅瓨鍦ㄦ鎯呭喌) + goto _init_send_beacon;//send_beacon.step =SEND_BEACON_INIT; + } + else{ + //unsigned char tx_buf[64]; + mem_set(tx_buf,64,0); //mem_set(tx_buf,sizeof(tx_buf)/sizeof(unsigned char),0); + #if (MULTI_5G8==1) + multi_chan_polling(); + #endif + send_beacon.remain_cycle_count--; + send_beacon.ask_offset =link_queue_outN(&keypad_info,tx_buf,send_beacon.ask_offset);//浠嶴N list涓彇鍑篠N锛涗竴娆℃渶澶10涓 + platform.rf_5G8_send_multi_frame(base_send_beacon_all,tx_buf,multi.modual_id[get_mainRF_usr_id()]); //涓绘ā鍧楃殑id=0? + + if(multi.count>1){//2020.02.27 add by Gavin + unsigned char i; + for(i=1;i0){//鍙戦侀噸浼 + unsigned char tx_buf[64]; + mem_set(tx_buf,64,0);//mem_set(tx_buf,sizeof(tx_buf)/sizeof(unsigned char),0); + #if (MULTI_5G8==1) + multi_chan_polling(); + #endif + send_beacon.remain_cycle_count--; + send_beacon.re_send_offset =link_queue_outN_re_send(&keypad_info,tx_buf,send_beacon.re_send_offset); + platform.rf_5G8_send_multi_frame(base_send_beacon_all_2,tx_buf,multi.modual_id[get_mainRF_usr_id()]); //涓绘ā鍧楃殑id=0? + } + //娌℃湁閲嶄紶鏁版嵁 鎴栬 娌℃湁閲嶄紶鍛ㄦ湡浜嗭紝閮藉洖鍒板ぇ鍛ㄦ湡 锛 +// if( (send_beacon.re_send_offset==0)||(send_beacon.remain_cycle_count==0) ){ +// send_beacon.step = SEND_BEACON_INIT; //閲嶄紶瀹屾瘯鎴栬呮病鏈夐噸浼犲懆鏈熶簡,鍥炲埌澶у懆鏈 +// } + else{ + #ifdef BUF_ALERT2 + //鍒ゆ柇鏈夋棤閿洏buf鍛婅闇瑕佸崟鐙偣鍚 + extern unsigned char check_buf_alert(struct link_queue_STR *queue,unsigned char offset); + if ( buf_get_info.Status==1)//浼樺寲鎴愬彲澶勭悊閲嶄紶涓嚭鐜拌繃鍛婅鐨 + { + //sn=(buf_get_info.SN[0]<<24)+(buf_get_info.SN[1]<<16)+(buf_get_info.SN[2]<<8)+(buf_get_info.SN[3]); + //DEBUG_LOG("SN[%10d] Buf Alert!-PreSET- Start...\n",sn); + send_beacon.step=SEND_BEACON_ALERT; + goto _send_buf_alert; + } + if (check_buf_alert(&keypad_info,0)) + { + send_beacon.step=SEND_BEACON_ALERT; + goto _send_buf_alert; + } + #endif + goto _init_send_beacon; //send_beacon.step = SEND_BEACON_INIT; //閲嶄紶瀹屾瘯鎴栬呮病鏈夐噸浼犲懆鏈熶簡,鍥炲埌澶у懆鏈 + } + + break; + + #if defined(KEYPAD60)&& !defined(VOICE_PROTOCOL_3RD)//#ifdef KEYPAD60 + case SEND_BEACON_RE_SEND_BLANK: + goto__beacon_re_send_blank: + if(send_beacon.remain_cycle_count>0){//鍙戦侀噸浼 + unsigned char tx_buf[64]; + mem_set(tx_buf,sizeof(tx_buf)/sizeof(unsigned char),0); + + send_beacon.remain_cycle_count--; + //send_beacon.re_send_offset =link_queue_outN_re_send(&keypad_info,tx_buf,send_beacon.re_send_offset); + platform.rf_5G8_send_multi_frame(base_send_beacon_all_2,tx_buf,multi.modual_id[get_mainRF_usr_id()]); //涓绘ā鍧楃殑id=0? + } + +// //娌℃湁閲嶄紶鏁版嵁 鎴栬 娌℃湁閲嶄紶鍛ㄦ湡浜嗭紝閮藉洖鍒板ぇ鍛ㄦ湡 锛 +// if( (send_beacon.re_send_offset==0)||(send_beacon.remain_cycle_count==0) ){ + send_beacon.step = SEND_BEACON_INIT; //閲嶄紶瀹屾瘯鎴栬呮病鏈夐噸浼犲懆鏈熶簡,鍥炲埌澶у懆鏈 +// } + break; + #endif + +#ifdef BUF_ALERT2 + //閿洏buf鍛婅闇瑕佸崟鐙偣鍚 + case SEND_BEACON_ALERT: + _send_buf_alert: + if (buf_get_info.GetT"); + } + else + { + buf_get_info.Status=0; + TIM4_SetT(0);//瀹氭椂鍣ㄦ敼鍥炴爣鍑 + //DEBUG_MSG("!\n"); + #if 1 + send_beacon.step=SEND_BEACON_INIT; + goto _init_send_beacon; + #else + send_beacon.step=SEND_BEACON_RE_SEND_INIT; + goto re_send_init; + #endif + } + break; + #endif + + default:break; + }//sw +} + + + +/* +鑾峰彇鍦ㄧ嚎閿洏鐨勪釜鏁*/ +unsigned char get_keypad_count(void) +{ + return get_link_queue_length(&keypad_info); //keypad_info.rear-keypad_info.front; +} + + + +/* +鍙戦佷俊鏍囩殑寮鍏筹紝姣斿鍦ㄩ敭鐩樺浐浠跺崌绾х殑鏃跺欏氨闇瑕佸叧闂俊鏍囧彂閫 */ +void base_send_beacon_switch(unsigned char sw) +{ + send_beacon.step =sw; +} + +unsigned char get_base_send_beacon_status(void) +{ + return send_beacon.step; +} + + + +//---------------------------------------------------------------- +/* +* 2020.12.01 娴嬭瘯鍙戠幇by Pei: 鎸囧畾濮撳悕涓嬪彂锛岄敭鐩樺繀椤荤瓑鍒扮偣鍚嶆墠鑳藉洖澶嶏紝瀵艰嚧鍝嶅簲鎱紱 +*瑙e喅鍔炴硶锛氳涓嬫寚瀹氱殑閿洏SN,鍦ㄤ笅涓娆$偣鍚嶄腑寮哄埗鍔犲叆姝ら敭鐩楽N +*/ +struct special_trans_STR +{ + unsigned char flag; + unsigned char spec_sn[4]; + + unsigned char load_spec_sn_flag; //鐢ㄤ簬澶栭儴锛岀姝FC鍜孡CD +}; +static struct special_trans_STR spec_trans; + +//record +void spec_trans__record_sn(unsigned char *trans) +{ + //鍗曞寘锛屽苟涓旀槸鎸囧畾SN 妯″紡 + if( (trans[5]==0x30)&&(trans[6]==0xff)&&(trans[7]==0xff) ){ + spec_trans.flag =1; + mem_cpy(trans+25,spec_trans.spec_sn,4); + } +} + + +void spec_trans__load_sn(unsigned char *start) +{ + struct link_node_STR *node=NULL; + + if(spec_trans.flag==0) return; + spec_trans.flag =0; + spec_trans.load_spec_sn_flag =1; // + + mem_cpy(spec_trans.spec_sn,start,4); + + if( (node =link_queue_find_special_sn(&keypad_info, start)) !=NULL){ + start[4] = node->element.re_send_slot; + } + else + start[4] = 0xff; +} + + +#endif + diff --git b/Base_core/core_src/base_process_pc_cmd_0x60.c a/Base_core/core_src/base_process_pc_cmd_0x60.c new file mode 100644 index 0000000..29e0a6e --- /dev/null +++ a/Base_core/core_src/base_process_pc_cmd_0x60.c @@ -0,0 +1,201 @@ + +#include "base_pc_protocol.h" +#include "platform_interface.h" +#include "function_interface.h" +#include "base_core.h" +#include "base_core_user.h" + + +//--------------------------- 0x60 --------------------------------------- +#define _0x60_READ_BASIC_BEACON 1 +#define _0x60_WRITE_BASIC_BEACON 2 +#define _0x60_READ_VOTE_BEACON 3 +#define _0x60_WRITE_VOTE_BEACON 4 +#define _0x60_READ_VOTE_MSG 5 +#define _0x60_WRITE_VOTE_MSG 6 +#define _0x60_READ_BASIC_BEACON_CRS2 7 +#define _0x60_WRITE_BASIC_BEACON_CRS2 8 +#define _0x60_WRITE_BROADCAST_PARAMETER 11 //V0.95 Section2.3璁剧疆鍙戜俊鎭俊鏍 +#define _0x60_WRITE_BROADCAST_CONTENT 12 +#define _0x60_WRITE_BROADCAST_START 13 + +#define _0x60_READ_EXT_BEACON 14 +#define _0x60_WRITE_EXT_BEACON 15 + + +void _0x60_basic_delay_ms( unsigned short time ) +{ + unsigned short i = 0; + while( time-- ){ + i = 33400; + while( i-- ); + } +} +/* +鍩虹珯鍥炲簲鏉ヨ嚜pc鐨0x60鍛戒护 +input: + type-pc鐨勬暟鎹被鍨 + ack_buf - 鍥炲簲鐨刡uf + type_data_len - 鍥炲簲buf鐨勯暱搴 */ +void pc_cmd_0x60_ack(unsigned char type, unsigned char *ack_buf,unsigned char type_data_len) +{ + unsigned char tmp[64]; + mem_set(tmp,sizeof(tmp)/sizeof(unsigned char),0); + tmp[0]= 31; + tmp[1]= 0xE0; + tmp[2]= get_base_id();//pc2bs_Bb.bs_id; //Gavin + tmp[3]= type; + mem_cpy( ack_buf,tmp+4,type_data_len); //tmp[4]...... + //here,you can set some special type + + base_tx_to_pc_sub(tmp); +} + + +/* +鍩虹珯澶勭悊鏉ヨ嚜pc鐨0x60鍛戒护 +1,澶嶅埗鐩稿叧鍙傛暟 +2锛屼繚瀛樺埌E2prom +3, 鍥炲簲pc */ +unsigned char pc_cmd_0x60_process(const unsigned char *rxpc) +{ + switch(rxpc[3]){ + //----1,2 read,write basic beacon + case _0x60_WRITE_BASIC_BEACON: + //a copy data + //disable_INT(); + mem_cpy( rxpc+4,&basic_beacon.head_addr+1,BASIC_BEACON_LEN); + //enable_INT(); + //b store to e2prom + base_write_e2prom(STORE_BASIC_BEACON_ADDR,&basic_beacon.head_addr+1,BASIC_BEACON_LEN); + // + if(basic_beacon.more_info ==3){ + mem_cpy(rxpc+13,kernel.bill_info,9); + } + + //c ack pc + case _0x60_READ_BASIC_BEACON: + pc_cmd_0x60_ack(_0x60_READ_BASIC_BEACON,&basic_beacon.head_addr+1,BASIC_BEACON_LEN); + break; + + //-----3,4 read,write vote beacon + case _0x60_WRITE_VOTE_BEACON: + if(rxpc[4] != vote_beacon.DATAPOS){//DataPos ---- is changge!!! + #ifdef _DEBUG_CORE_ + _debug_core__init_parameter_datapos_change();//鏂扮殑涓杞姇绁ㄥ紑濮嬶紝娓呴櫎蹇呰debug鍙傛暟!! + _debug_set_subject(rxpc[8]); + #endif + #ifdef RF_5G8 + re_init_all_resend_slot(); + #endif + #ifdef _DBG_VOICE_KP + _debug_voice_kp__init_all_parameter(); + #endif + kernel.rx_buf_overflow =0; //add by Gavin 20201201 debug only + } +// #ifdef _DEBUG_CORE_ +// if(11 == vote_beacon.vbuf[0] && rxpc[6] == 0) +// { +// _debug_core__printf(); +// } +// #endif + if(rxpc[5] != vote_beacon.sys_mode){//sys mode ---- is changge!!! + kernel.ext_vbeacon_sysmode_change_flag =1; // + } + + //妫娴嬪棰樺瀷娴嬮獙棰 + if( (rxpc[5]==14)&&(rxpc[6]==20)&&(rxpc[5] != vote_beacon.sys_mode) ){ + function.broadcast__startup(); + kernel.multi_title_flag =1; //used to ack title + } + else if( (rxpc[5]!=14) || (rxpc[6]!=20) ) + kernel.multi_title_flag =0; // + + //copy data + // #ifdef VOTE_BEACON_64BYTE + // mem_cpy( rxpc+4,&vote_beacon.head_addr+1,55);//special!!!!!!!Gavin20200204 + // #else + mem_cpy( rxpc+4,&vote_beacon.head_addr+1,VOTE_BEACON_LEN); + // #endif + + + //enable_INT(); + //store to e2prom + base_write_e2prom(STORE_VOTE_BEACON_ADDR,&vote_beacon.head_addr+1,VOTE_BEACON_LEN); + //蹇熼厤瀵瑰叆鍙 + function.fastmatch__enter_exit(rxpc);//fastmatch_enter_exit(rxpc); + //ack pc + case _0x60_READ_VOTE_BEACON: + pc_cmd_0x60_ack(_0x60_READ_VOTE_BEACON,&vote_beacon.head_addr+1,VOTE_BEACON_LEN); + break; + + //-----5,6 pc send get vote msg requset!! + case _0x60_READ_VOTE_MSG: + vote_data_report_startup(); //queue + break; + case _0x60_WRITE_VOTE_MSG: //pc ack the vote msg! + { + unsigned char ack_tmp=1; + vote_status_clear_confirmed(&rxpc[4]); //queue + pc_cmd_0x60_ack(_0x60_WRITE_VOTE_MSG,&ack_tmp,1); + } + break; + + //-----7,8 CRS2鍗忚涓嬬殑鍩虹淇℃爣 + case _0x60_WRITE_BASIC_BEACON_CRS2: + if(!function.crs2__SW) break; + //disable_INT(); + mem_cpy( rxpc+4,&basic_beacon_crs2.head_addr+1,BASIC_BEACON_CRS2_LEN); + //enable_INT(); + base_write_e2prom(STORE_BASE_ATTRIB_ADDR,&basic_beacon_crs2.head_addr+1,BASIC_BEACON_CRS2_LEN); + _0x60_basic_delay_ms(5); + case _0x60_READ_BASIC_BEACON_CRS2: + if(!function.crs2__SW) break; + pc_cmd_0x60_ack(_0x60_READ_BASIC_BEACON_CRS2,&basic_beacon_crs2.head_addr+1,BASIC_BEACON_CRS2_LEN); + break; + + case _0x60_WRITE_BROADCAST_PARAMETER:// 11 //V0.95 Section2.3璁剧疆鍙戜俊鎭俊鏍 + case _0x60_WRITE_BROADCAST_CONTENT:// 12 + case _0x60_WRITE_BROADCAST_START:// 13 + function.broadcast__config_enter(rxpc); + break; + + //----14,15 read,write ext beacon + case _0x60_WRITE_EXT_BEACON: + //a copy data + //disable_INT(); + #ifdef EXTEND_VBEACON2 + if(rxpc[4] ==1){ //鑷畾涔夐鍨嬶紱閿洏鍗忚section2.2.17-1; + mem_cpy( rxpc+4,&ext_vbeacon.head_addr+1,EXT_VBEACON_LEN); + kernel.ext_vbeacon_type1_flag =1; + kernel.ext_vbeacon_sysmode_change_flag=0; //瑙e喅sdk 鍙戦乻top鍚庡張蹇熷惎鍔ㄥ鑷存棤鏁堢殑闂锛32.5ms + } + else if(rxpc[4] ==2){//鎸囧畾绛旈鍣 + mem_cpy( rxpc+4,&ext_vbeacon_2.head_addr+1,EXT_VBEACON_LEN); + kernel.ext_vbeacon_type2_flag =1; + kernel.ext_vbeacon_sysmode_change_flag=0; + } + #else + mem_cpy( rxpc+4,&ext_vbeacon.head_addr+1,EXT_VBEACON_LEN); + #endif + kernel.ext_vbeacon_onoff_flag =1; + //enable_INT(); + //b store to e2prom + //base_write_e2prom(STORE_BASIC_BEACON_ADDR,&basic_beacon.head_addr+1,BASIC_BEACON_LEN); + + //c ack pc + case _0x60_READ_EXT_BEACON: + //pc_cmd_0x60_ack(_0x60_READ_EXT_BEACON,rxpc+4,EXT_VBEACON_LEN); + pc_cmd_0x60_ack(_0x60_READ_EXT_BEACON,&ext_vbeacon.head_addr+1,EXT_VBEACON_LEN); + break; + + + default: + function.user_pc_0x60cmd(rxpc); + break; + }//sw + + return 1; +} + + diff --git b/Base_core/core_src/base_process_pc_cmd_0x61.c a/Base_core/core_src/base_process_pc_cmd_0x61.c new file mode 100644 index 0000000..0aa2750 --- /dev/null +++ a/Base_core/core_src/base_process_pc_cmd_0x61.c @@ -0,0 +1,415 @@ + +#include "base_pc_protocol.h" +#include "platform_interface.h" +#include "function_interface.h" +#include "base_core.h" +#include "base_core_user.h" + +//----------------------0x61 --------------------------------------------- +#define _0x61_READ_BASE_CONFIG 1 +#define _0x61_WRITE_BASE_CONFIG 2 +#define _0x61_READ_HD_INFO 3 +#define _0x61_WRITE_HD_INFO 4 +#define _0x61_READ_MAC 5 +#define _0x61_WRITE_MAC 6 +#define _0x61_DFU 7 +#define _0x61_SOFT_DOG 9 +#define _0x61_CHAN_ASSESS 10 +#define _0x61_AUX_CONFIG 11 +#define _0x61_TCPIP_CONFIG 12 +#define _0x61_BASE_TEST 13 +#define _0x61_WHITE_LIST 14 // whitelist +#define _0x61_READ_OEM 15 +#define _0x61_WRITE_OEM 16 +#define _0x61_UPDATE_KP 22 +#define _0x61_READ_AES_CONFIG 23//17 //閫氳鍔犲瘑璇 +#define _0x61_WRITE_AES_CONFIG 24//18 +#define _0x61_READ_CRC_CONFIG 25 +#define _0x61_WRITE_CRC_CONFIG 26 + +/* +鍩虹珯鍥炲簲鏉ヨ嚜pc鐨0x61鍛戒护 */ +void pc_cmd_0x61_ack(unsigned char type,const unsigned char *ack_buf,unsigned char type_data_len) +{ + unsigned char tmp[64]; //whitelist 闇瑕佺殑buf闀夸簺 + + mem_set(tmp,sizeof(tmp)/sizeof(tmp[0]),0); + tmp[0]= 31; + tmp[1]= 0xE1; + tmp[2]= get_base_id();//pc2bs_Bb.bs_id; + tmp[3]= type; + mem_cpy( ack_buf,tmp+4,type_data_len); + + //send to pc + base_tx_to_pc_sub(tmp); +} + + + +/* +* case _0x61_AUX_CONFIG鐨勫瓙鍑芥暟澶勭悊 +*/ +static void _0x61_AUX_CONFIG_sub(const unsigned char *rxpc) +{ + unsigned char ack_buf[64]; + + ack_buf[0] =rxpc[4]; + switch(rxpc[4]){ + case 2: //write log moe and base name + mem_cpy(rxpc+5,&base_name_log_mode.head_addr+1,BASE_NAME_LOG_MODE_LEN); + assert_base_log_mode(); + base_write_e2prom(STORE_BASE_NAME_ADDR,&base_name_log_mode.head_addr+1,BASE_NAME_LOG_MODE_LEN); + ack_buf[0] =1; + case 1: //read log_mode and base name base_name_log_mode + mem_cpy(&base_name_log_mode.head_addr+1,ack_buf+1,BASE_NAME_LOG_MODE_LEN); //used ack pc + pc_cmd_0x61_ack(_0x61_AUX_CONFIG,ack_buf,BASE_NAME_LOG_MODE_LEN+1); + break; + + case 4://write multi channal parameter!!,add by Gavin 20190718 + mem_cpy(rxpc+5,&multi_freq_setup.head_addr+1,MULTI_FREQ_LEN); + if(function.lock_rf_count) + multi_freq_setup.chan_count=function.lock_rf_count; + if( (multi_freq_setup.chan_count==0) ||(multi_freq_setup.chan_count>4) )//妯″潡鏁颁笉鑳戒负闆,鑷冲皯涔熸湁涓涓 + multi_freq_setup.chan_count=1; + //sdk璁剧疆鐨勬棤绾挎ā鍧椾釜鏁颁笉鑳藉ぇ浜庣‖浠跺疄闄呮ā鍧椾釜鏁 + if(multi_freq_setup.chan_count >multi.hard_rf_modual_cnt) + multi_freq_setup.chan_count = multi.hard_rf_modual_cnt; + + process_setup_multi_chan(multi_freq_setup.chan_freq[0]);//update single channel + //base_write_e2prom(STORE_MULTI_CHAN_ADDR,&multi_freq_setup.head_addr+1,MULTI_FREQ_LEN); //write e2prom + ack_buf[0] =4; + case 3://read multi channal parameter!! + if(function.base_type ==TYPE_C100) break; + if(function.base_type ==TYPE_CRS200) break; + if(function.base_type ==TYPE_EVS100) break; + mem_cpy(&multi_freq_setup.head_addr+1,ack_buf+1,MULTI_FREQ_LEN); + pc_cmd_0x61_ack(_0x61_AUX_CONFIG,ack_buf,MULTI_FREQ_LEN+1); + break; + + //AUX_ATT + case 12: //write + if(!function.aux_att__SW) break; + mem_cpy(rxpc+5,&aux_att.head_addr+1,AUX_ATT_LEN); + base_write_e2prom(STORE_AUX_ATT_ADDR,&aux_att.head_addr+1,AUX_ATT_LEN); + case 11: //read + if(!function.aux_att__SW) break; + ack_buf[0] =11; + mem_cpy(&aux_att.head_addr+1,ack_buf+1,AUX_ATT_LEN); + pc_cmd_0x61_ack(_0x61_AUX_CONFIG,ack_buf,AUX_ATT_LEN+1); + break; + + //#ifdef AUX_BEATS //鏁欒偛鏂扮増-鍩虹珯閮ㄥ垎V0.9 section5.2.3 + case 10://write //SDK瀹氭椂10S鍚戝熀绔欒缃竴娆..... + if(!function.aux_beat__SW) break; + if(rxpc[5]==1) + aux_beats.net_timer= 30; //30*0.5S=15S + case 9: //璇诲彇鍏嶉厤瀵筍N鍙锋ā寮忎笅鐨勭綉缁滅姸鎬 + if(!function.aux_beat__SW) break; + ack_buf[0] =9; + ack_buf[1] = (aux_beats.net_timer>0); + pc_cmd_0x61_ack(_0x61_AUX_CONFIG,ack_buf,2); + break; + //#endif + +// case 16: //write +// fastmatch_lowerPA.lower_PA =rxpc[5]; +// case 15: +// ack_buf[0] =15; +// ack_buf[1] =fastmatch_lowerPA.lower_PA; +// pc_cmd_0x61_ack(_0x61_AUX_CONFIG,ack_buf,2); +// break; + case 16: //write + function.fastmatch__lowPA_setup(rxpc); + case 15: + function.fastmatch__lowPA_ack(); + break; + + //NFC + case 20: + case 19: + //function.nfc__pc_interaction(rxpc); + break; + + //read/wrtie ext basic beacon ;include base multi channel info + case 22: //write + mem_cpy(rxpc+5,&basic_ext_beacon.head_addr+1,BASIC_EXT_BEACON_LEN); + //base_write_e2prom(STORE_BASIC_EXT_BEACON_ADDR,&basic_ext_beacon.head_addr+1,BASIC_EXT_BEACON_LEN);//20200415涓嶄繚瀛樺熀纭鎵╁睍淇℃爣锛 + if( basic_ext_beacon.base_count!=0) + set_ext_basicbeacon_startup_flag(1); //startup BASE send Ext beacon and Gen beacon + else + set_ext_basicbeacon_startup_flag(0); + case 21: + ack_buf[0] =21; + mem_cpy(&basic_ext_beacon.head_addr+1,ack_buf+1,BASIC_EXT_BEACON_LEN); + pc_cmd_0x61_ack(_0x61_AUX_CONFIG,ack_buf,BASIC_EXT_BEACON_LEN+1); + break; + case 24: //write log moe and base name + mem_cpy(rxpc+5,&base_name_setup.head_addr+1,AUX_NAME_LEN); + assert_base_log_mode(); + function.network__set_name(base_name_setup.base_name, 12); + function.network__set_netseq_change(); + base_write_e2prom(STORE_BASE_NAME_ADDR,&base_name_setup.head_addr+1,AUX_NAME_LEN); + ack_buf[0] =23; + case 23: //read log_mode and base name base_name_log_mode + mem_cpy(&base_name_setup.head_addr+1,ack_buf+1,AUX_NAME_LEN); //used ack pc + pc_cmd_0x61_ack(_0x61_AUX_CONFIG,ack_buf,AUX_NAME_LEN+1); + break; + case 26: //write base password + mem_cpy(rxpc+5,&base_pwd_setup.head_addr+1,AUX_PWD_LEN); + if((base_pwd_setup.base_pwd[0]*256+base_pwd_setup.base_pwd[1])>60000) + { + base_pwd_setup.base_pwd[0] = 0xEA; + base_pwd_setup.base_pwd[1] = 0x60; + } + function.network__set_pwd(base_pwd_setup.base_pwd[0]*256+base_pwd_setup.base_pwd[1]); + function.network__set_netseq_change(); + base_write_e2prom(STORE_BASE_PWD_ADDR,&base_pwd_setup.head_addr+1,AUX_PWD_LEN); + ack_buf[0] =25; + case 25: //read base password + mem_cpy(&base_pwd_setup.head_addr+1,ack_buf+1,AUX_PWD_LEN); //used ack pc + pc_cmd_0x61_ack(_0x61_AUX_CONFIG,ack_buf,AUX_PWD_LEN+1); + break; + default: + function.user_pc_0x61cmd_type0x0B(rxpc); + break; + }//sw +} + + +/*澶勭悊杞欢鐙楀瓙绋嬪簭 +20200908-10璋冭瘯: +涓や釜SDK瀵硅蒋浠剁嫍鐨勫鐞嗘柟娉曚笉涓鑷: +1,鏃DK + S1,cmd1鏍稿瀵嗙爜鍐嶈鍐欐搷浣 +2,鏂癉T + write:鐩存帴cmd3鍐欐暟鎹 + read: cmd4璇诲瘑鐮佹牳瀵,鐒跺悗鎵嶈 +*/ +void _0x61_soft_dog_sub(const unsigned char *rxpc) +{ + unsigned char ack_buf[32],ack_len; + unsigned char tmp[16],i,rslt=0; + static unsigned char oem_code_check_rslt=0; + + ack_buf[0] =rxpc[4]; //sub type + switch(rxpc[4]){ + case 1://1鏍稿瀵嗙爜 + base_read_e2prom(STORE_OEM_CODE_ADDR,tmp,8); //Gavin + if( mem_compare(tmp,rxpc+6,8) ==0 ){ + oem_code_check_rslt =0; + ack_buf[1] =oem_code_check_rslt; + ack_len=2; + } + else{ + oem_code_check_rslt =1; //result + ack_buf[1] =oem_code_check_rslt; + mem_cpy(tmp,ack_buf+2,8); //灏嗙閽ュ姞杞藉埌ack 涓; + ack_len=2+8; + } + break; + + case 2: //璇荤敤鎴峰尯 + case 3: //鍐欑敤鎴峰尯 + //if( (!oem_code_check_rslt)||(rxpc[5] >4) ){//瀵嗙爜鏍稿涓嶆纭垨鑰呯殑鍖哄彿瓒呭嚭閮芥槸閿欒鐨 + if( rxpc[5] >4){ + ack_buf[1] =0; //zone + ack_buf[2] ='L'; + ack_buf[3] ='O'; + ack_buf[4] ='C'; + ack_buf[5] ='K'; + ack_len=6; + }else{ + ack_buf[0] = 2; + ack_buf[1] = rxpc[5]; //area 0-3 + if( rxpc[4] ==2){//read + platform.e2prom_read(STORE_OEM_USER_ADDR+rxpc[5]*16,ack_buf+2,16); + //base_read_e2prom(STORE_OEM_USER_ADDR+rxpc[5]*16,ack_buf+2,16); //Gavin + ack_len=18; + }else{//write + platform.e2prom_write(STORE_OEM_USER_ADDR+rxpc[5]*16,(unsigned char *)rxpc+6,16); + //base_write_e2prom(STORE_OEM_USER_ADDR+rxpc[5]*16,rxpc+6,16); //Gavin + mem_cpy(rxpc+6,ack_buf+2,16); + ack_len=18; + } + } + break; + case 4: //璇诲瘑鐮 + base_read_e2prom(STORE_OEM_CODE_ADDR,ack_buf+2,8); + ack_buf[0] =3; + ack_buf[1] =0; + ack_len=10; //8+2 + break; + case 5: //鍐欑敤鎴峰尯瀵嗙爜 + base_write_e2prom(STORE_OEM_CODE_ADDR,rxpc+6,8); + platform.rf_update_sync_code(calc_custom_rf_sync_code(rxpc+6),4,get_main_rf_hard_id() ); + ack_buf[1] =0; + ack_buf[2] =0; + mem_cpy(rxpc+6,ack_buf+3,8); + ack_len=11; //8+3 + break; + case 6: //璇昏姱鐗嘦ID + #if 0 //#ifdef RF_MODUAL_MONITOR + ack_len= get_rf_error_cnt(ack_buf+2); + ack_len+=2; + #else + ack_buf[1] =0; + platform.get_chip_id(ack_buf+2);//chip id length is 12bytes //Gavin + ack_len=14; + #endif + break; + default: rslt =1;break; + }//sw + + if(rslt==0) pc_cmd_0x61_ack(_0x61_SOFT_DOG,ack_buf,ack_len); +} + + + + + +/*---------------------- +鍩虹珯澶勭悊鏉ヨ嚜pc鐨0x60鍛戒护 +1,澶嶅埗鐩稿叧鍙傛暟 +2锛屼繚瀛樺埌E2prom +3, 鍥炲簲pc*/ +unsigned char pc_cmd_0x61_process(const unsigned char *rxpc) +{ + unsigned char ack_buf[32]; + + switch(rxpc[3]){ + + //----1,2 read write base configuare + case _0x61_WRITE_BASE_CONFIG://write base config + //a,copy data + //disable_INT(); + mem_cpy( rxpc+4,&base_config.head_addr+1,BASE_CONFIG_LEN); + //enable_INT(); + assert_base_id();//assert base id + assert_base_channel(); //assert base channal, then set it to RF module; + process_setup_single_chan(base_config.chan); //syn to multi channel + //b, setup rf power + platform.rf_set_send_pwr(base_config.rf_pwr,get_main_rf_hard_id()); //get_mainRF_usr_id() + for(unsigned char i=0;i9) ){ + base_name_log_mode.log_mode =1; + return 0; + } + + return 1; +} + + + +/*------------------------------ +鑾峰彇鍩虹珯鐨刬d*/ +unsigned char get_base_id(void) +{ + return base_config.bs_id; +} +/* +鍒ゆ柇鍩虹珯id鏄惁鍚堟硶*/ +unsigned char assert_base_id(void) +{ + if( (base_config.bs_id <1)||(base_config.bs_id>32) ){ + base_config.bs_id =1; + return 0; + } + return 1; +} + + + +/* +澶嶅埗閰嶅鐮 */ +void get_base_match_code(unsigned char *mac) +{ + if( (base_name_log_mode.log_mode==3)||(base_name_log_mode.log_mode ==6) ){//if( log_mode__auto_match()){//20200401澧炲姞鍏嶉厤瀵瑰姛鑳 + mac[0]=0xAA; + mac[1]=0xBB; + mac[2]=0xCC; + mac[3]=0xDD; + } + else + mem_cpy(base_mac.match_code,mac,BASE_MAC_LEN); +} + + +void base_tx_to_pc_sub(const unsigned char *dt) +{ + unsigned char tmp[USB_REPORT_MAX]; + + tmp[0] =0xF5; + tmp[1] =0xAA; + tmp[2] =0xAA; +#ifdef _RPT_PKT_CNT_ + mem_cpy(dt,tmp+3,dt[0]+2); + mem_set(tmp+tmp[3]+3+1,USB_REPORT_MAX-(tmp[3]+3),0); +#else + mem_cpy(dt,tmp+3,dt[0]+1); +// //#ifdef ENCRC +// { +// unsigned short crc =crc16(tmp+4,tmp[3]-2); +// tmp[tmp[3]+3-1] = crc>>8; +// tmp[tmp[3]+3] = crc&0xff; +// } +// //#endif + //鏃犳晥鏁版嵁閮芥竻闄 + mem_set(tmp+tmp[3]+3,USB_REPORT_MAX-(tmp[3]+3),0); +#endif + + platform.base_send_data_to_pc(tmp,USB_REPORT_MAX); +} + +//void user__base_tx_to_pc_sub( unsigned char *dt) +//{ +// unsigned char tmp[USB_REPORT_LEN]; + +// tmp[0] =0xF5; +// tmp[1] =0xAA; +// tmp[2] =0xAA; +// mem_cpy(dt,tmp+3,dt[0]+1); +// +//// //#ifdef ENCRC +//// { +//// unsigned short crc =crc16(tmp+4,tmp[3]-2); +//// tmp[tmp[3]+3-1] = crc>>8; +//// tmp[tmp[3]+3] = crc&0xff; +//// } +//// //#endif +// +// //鏃犳晥鏁版嵁閮芥竻闄 +// mem_set(tmp+tmp[3]+3,USB_REPORT_LEN-(tmp[3]+3),0); +// platform.base_send_data_to_pc(tmp,USB_REPORT_LEN); +//} + +/*//------------------------------------------------------------------------ +寮杈熶竴涓紦鍐插尯鐢ㄤ簬瀛樻斁鎺ユ敹pc鐨勬暟鎹 +*/ +#define PCRX_NODE_SIZE 17//10//5 //鑺傜偣涓暟锛屽嵆缂撳啿鍖洪暱搴 17 =16+1 keypad update??? +#define PCRX_DATA_SIZE 64 //鏁版嵁鐨勬渶澶ч暱搴 +struct fifo_queue_STR pcrx_queue; +unsigned char pcrx_buf[PCRX_NODE_SIZE][PCRX_DATA_SIZE]; +/* +鍒濆鍖栫敤浜庝繚鎸乻dk鐨勬暟鎹産uffer */ +void pcrx_init_queue(void) +{ + queue_init(&pcrx_queue,(unsigned char **)pcrx_buf,PCRX_NODE_SIZE,PCRX_DATA_SIZE); +} + +/* +鍩虹珯鎺ユ敹pc鐨剈sb鏁版嵁锛屼繚瀛樺埌 闃熷垪涓 +姝ゅ嚱鏁拌usb endpoint callback 璋冪敤*/ +unsigned char pcrx_data_save(const unsigned char *pc_buf) +{ + return queue_in(&pcrx_queue,pc_buf,PCRX_NODE_SIZE,PCRX_DATA_SIZE); +} + +/* +浠巄uffer閲屽彇鍑烘暟鎹 */ +static unsigned char pcrx_data_fetch(unsigned char *pc_buf) +{ + unsigned char ret_val; +// platform.disable_interrupt(); + ret_val =queue_out(&pcrx_queue,pc_buf,PCRX_NODE_SIZE,PCRX_DATA_SIZE); +// platform.enable_interrupt(); + return ret_val; +} + + + +/* ------------------------------------------------------ +鍩虹珯澶勭悊pc鏁版嵁鐨勬诲叆鍙 +called by mainloop*/ +// unsigned char rx_pc_buf[64]; //瀹氫箟鎴愬叏灞鍙橀噺渚夸簬璋冭瘯 +void base_process_pc_data(void) +{ + unsigned char rx_pc_buf[64+4]; + + if(!pcrx_data_fetch(rx_pc_buf))return ; + + //鏍稿sdk鐨勫懡浠ゆ槸涓嶆槸鍙戠粰鏈熀绔欑殑!!!//澶氬熀绔欐椂鏈夌敤;sdk 杞彂缁欓敭鐩樼殑鏁版嵁娌℃湁id锛屼笉鍋氬垽鏂!!!! + if( ((rx_pc_buf[1]==0x60)||(rx_pc_buf[1]==0x61)) &&(rx_pc_buf[2] !=0) && (rx_pc_buf[2] !=get_base_id()) ) return; + + #if defined(_SDK_OFFLINE_) || defined(_SDK_SYSMODE0_KEEPTIMER_) + if( (rx_pc_buf[1]==0x60)&&( (rx_pc_buf[3]==5)||(rx_pc_buf[3]==6)) ){ + //闄や簡涓闂崄绛斿锛屽叾浠杝dk鍛戒护閮藉彲浠ユ縺娲绘娴媠dk offline鍜宻ysmode===0 瀹氭椂鍏抽棴閿洏鍔熻兘 + } + else{ + reset__monitor_sdkoffline_sysmode0(); + } + #endif + + //buf0 -len + //buf1寮濮嬫濂戒笌鍗忚涓殑byte浣嶇浉鍚岋紒锛 + refresh_pc_connect_status(); + + //process pc data/cmd + if(rx_pc_buf[1] ==0x60){ + pc_cmd_0x60_process(rx_pc_buf); + } + else if(rx_pc_buf[1] ==0x61){ + pc_cmd_0x61_process(rx_pc_buf); + } + else + { +// function.user_pc_transfer2keypad(rx_pc_buf); + pc_transfer2keypad_data_save(rx_pc_buf); + + } +} + + +/* +鍒濆鍖栧鐞 鍩虹珯鍜宻dk/PC鐨勬暟鎹氫俊 +a,鍒濆鍖 鎺ユ敹pc鏁版嵁鐨勯槦鍒 +b,鍒濆鍖 閿洏杞彂缁檖c鐨勬暟鎹槦鍒 */ +void base_process_pc_init(void) +{ + pcrx_init_queue(); + transfer2pc_init_queue(); +} + + diff --git b/Base_core/core_src/base_process_rx_keypad.c a/Base_core/core_src/base_process_rx_keypad.c new file mode 100644 index 0000000..3e2e650 --- /dev/null +++ a/Base_core/core_src/base_process_rx_keypad.c @@ -0,0 +1,451 @@ + +#include "base_pc_protocol.h" +#include "platform_interface.h" +#include "function_interface.h" +#include "base_core.h" +#include "base_core_user.h" + + + +//-------------------------------------- id mode ----------------------------------------------------------- +/* +澶勭悊id 妯″紡涓嬬殑閿洏鏁版嵁 +return锛 + 0- fail + 1- OK */ +unsigned char keypad_id_mode(const unsigned char *rxkp,unsigned char rf_id) +{ + unsigned char tmp[64]; + unsigned char offset,len,type; + unsigned char dist_offset =3; + + mem_set(tmp,sizeof(tmp)/sizeof(tmp[0]),0); + offset=5; + len=4; + + switch(rxkp[4]){//switch output: type and len + + case 0: //娴嬭瘯妯″紡 + //------20200401--娴嬮獙棰樻病鏈夌姸鎬佹姤鍛 + if( vote_beacon.sys_mode ==14){ + type=0x0D; + len=9; + } + else//-------------- + type=0x0A; + break; + case 1: //鍗曞 + type=0x01; + break; + case 2://鍗曢夊閫 + type=0x02; + break; + case 3://璇勫垎 + len=10; + type=0x03; + break; + case 4://鎺掑簭 + len=7; + type=0x05; + break; + case 5://閿洏鍗忚 3.2.6瀛楃涓, id+SN鎵弿娴嬭瘯鏃犳硶鏀堕綈???????? + len=20; + type=0x06; + break; + case 20://鎵规鍗曞肩粨鏋 + case 21://鎵规璇勫垎缁撴灉 + case 22://鎵规鍗曢夊閫夌粨鏋 + case 23://鍙﹂変粬浜虹粨鏋 + case 24://鎵规鎺掑簭缁撴灉 + case 25://鎵规濉┖缁撴灉 + case 26://鍙﹂変粬浜虹粨鏋 + case 27://澶囩敤 + case 28://澶囩敤 + len=21; + type=0x04; + offset=4;//8; + break; + case 33://鏈嶅姟鐢宠 //20200513 //鏀寔閿洏璇锋眰, + type=0x0C; +// len =4; +// offset=4; + len=3; + offset=5; + tmp[3] =0x02; //specially + dist_offset=4; + break; + + case 34://鍙戣█鎺у埗 + case 35://涓诲腑鎺у埗 + len=4; + type=0x0C; + offset=4;//8; + // bs_kp.rx_kp_buf[8] -= 31; //Gavin? + break; + + case 15://澶氬寘鐢宠 + len=4; + type=0x0C; + offset=4;//8; + // bs_kp.rx_kp_buf[8]=1; //Gavin? + break; + case 16://see keypad protocol 3.4.1 //鐧诲綍淇℃伅锛屾瘮濡傚揩閫熼厤瀵癸紝鑷敱閰嶅... + len=20; + type=0x0B; + function.fastmatch__success_check(rxkp+2);//fastmatch_success_check(rxkp+6); + break; + + default: + return 0;//break; //error!!!!! + }//switch + + tmp[0]=type; + tmp[1]=rxkp[2]; + tmp[2]=rxkp[3]; + //copy rxkp to tmp pointer,from tmp+2; + mem_cpy(rxkp+offset,tmp+dist_offset,len); //mem_cpy(rxkp+offset,tmp+3,len); + + //鐗规畩澶勭悊-------20200630------ + if( rxkp[4]==15){//澶氬寘鐢宠 + tmp[3]=1; + } + + if( (rxkp[4]==34)||(rxkp[4]==35) ){//鍙戣█鎺у埗 //涓诲腑鎺у埗 + if(tmp[3]>=31) + tmp[3] -=31; + } + //-------------------------------- + + if(vote_data_store(tmp)==0) return 0; + #ifdef _DBG_2G4_KP_ + _debug_core__record_rxkp_info(rxkp); + #endif + + //record the keypad id/sn, using in base ack the keypad + if( keypad_idsn_save(&rxkp[2],2,rf_id) ==0) return 0; + + return 1; +} + +//----------------------------------- sn mode ------------------------------------------------------- +/* +澶勭悊sn 妯″紡涓嬬殑閿洏鏁版嵁 +sn妯″紡: + 鏁版嵁绫诲瀷鍥哄畾鏄20;!!!! + 鏁版嵁闀垮害鍥哄畾鏄16 +return锛 + 0- fail + 1- OK +*/ +unsigned char keypad_sn_mode(const unsigned char *rxkp,unsigned char rf_id) +{ + unsigned char tmp[32]; + if( (rxkp[2]==12)&&(rxkp[9]==4) ) + function.broadcast__keypad_request(1); + + tmp[0] = 20;//type; + mem_cpy(rxkp+2,tmp+1,16); + if(vote_data_store(tmp)==0) return 0; + + #ifdef _DBG_2G4_KP_ + _debug_core__record_rxkp_info(rxkp); + #endif + + //record the keypad id/sn, using in base ack the keypad + if( keypad_idsn_save(&rxkp[3],6,rf_id) ==0) return 0; + + function.fastmatch__success_check(rxkp+7); + + return 1; +} + + +//--------------------------------- crs2 mode --------------------------------------------------- +/* +澶勭悊CRS2 妯″紡涓嬬殑閿洏鏁版嵁 +return锛 + 0- fail + 1- OK */ +unsigned char keypad_crs2_mode(const unsigned char *rxkp,unsigned char rf_id) +{ + unsigned char len,type; + unsigned char tmp[64];// unsigned char tmp[32]; + + //寮鍚績璺冲姛鑳藉悗锛屽畾鏃舵病鏈夋敹鍒板績璺冲氨涓嶆帴鏀堕敭鐩樻暟鎹紒 + if( (function.aux_beat__SW)&&(aux_beats.net_timer==0) ) return 0; + + if( (rxkp[2]==12)&&(rxkp[9]==4) ) + function.broadcast__keypad_request(1); + + //濡傛灉寮鍚簡鐧藉悕鍗曞姛鑳 SN浠巄yte7寮濮嬶紝CRS2鍗忚涓嬪彧鏈4byte??? + if( log_mode_is_WHITELIST){//if( function.whitelist__SW){ + //鑳介緳鐢熶骇娴嬭瘯妯″紡锛屽紑鍚熀绔欏彂淇℃爣鍚庯紝涓嶅垽鏂敭鐩樼櫧鍚嶅崟 + if( ((function.aux_att__SW)&&(aux_att.base_beacon_sw==0))|| (base_core.get_log_mode()==8) ){ + //a,鍏堝垽鏂敭鐩楽N鏄惁鍦ㄥ悕鍗曢噷,涓嶅湪鍚嶅崟閲屽氨涓嶅仛浠讳綍澶勭悊. + if(function.whitelist__search_special_list(rxkp+3) ==NULL) + return 0; + } + + //b,妫娴嬪埌鏈夌櫧鍚嶅崟鐢宠锛屽悗缁棤闇澶勭悊 + if(function.whitelist__keypad_idsn_record_request(rxkp) ) return 0; + +// //c,鐧藉悕鍗曟ā寮忎笅锛屽閿洏鏁版嵁鐨勫垎鏋 +// if( rxkp[2] ==4 ){ +// type = (rxkp[1] == 0x93)?22:26; +// len =rxkp[0];//-4; +// if(len>27) len =27; //??? +// } +// else{ +// type = 21;//(rxkp[1] == 0x93)?21:25;//20200518 +// len =rxkp[0];//-4; +// if(len>16) len =16; //?? +// } + } + //else + + {//闈濩RS2鍗忚锛屽嵆鏅歋N妯″紡锛屽閿洏鏁版嵁鐨勫垎鏋 + if( rxkp[2] ==4 ){//string +// if(log_mode_is_WHITELIST) +// type = (rxkp[1] == 0x93)?22:26; +// else + type = 22; + len =rxkp[0]; + if(len>27) len =27; + } + else if(rxkp[2] ==9){//Keypad protocolV0.99 section3.2.3,瀛楃涓诧紝甯︾數閲,瀵瑰簲鍩虹珯鍗忚3.2.7 + type = 28; + len = 27; + } + else if( (rxkp[2] ==7) ||(rxkp[2]==8)){//protocol keyapd section3.2.11 瀵瑰簲鍩虹珯鍗忚3.2.6 + type = 27; + len = 27; + } + else{ + type = 21; + len =rxkp[0]; + if(len>16) len =16; + } + } + + tmp[0] =type; + mem_cpy(rxkp+2,tmp+1,len); + if(rxkp[17] == 1)//鍏ョ綉鐢宠,20220621 + { + if((rxkp[15]*256 + rxkp[16])== function.network__get_pwd() || function.network__get_pwd()==0)//瀵嗙爜姝g‘鎴栨棤瀵嗙爜 + { + if(vote_data_store(tmp)==0) return 0; + } + } + else + { + if(vote_data_store(tmp)==0) return 0; + } + + + //record the keypad id/sn, using in base ack the keypad + if( keypad_idsn_save(&rxkp[3],4,rf_id) ==0) return 0; + + #ifdef _DBG_2G4_KP_ + _debug_core__record_rxkp_info(rxkp); + #endif + + function.fastmatch__success_check(rxkp+15); + + return 1; +} + + + + + +/*-------------------------------------------------------------------------- +寮杈熶竴涓紦鍐插櫒鐢ㄤ簬澶勭悊閿洏鐨勬棤绾挎暟鎹紒锛侊紒 +*/ +#define KPRX_NODE_SIZE 15 //鑺傜偣涓暟锛屽嵆缂撳啿鍖洪暱搴 +#define KPRX_DATA_SIZE 65//64 //鏁版嵁鐨勬渶澶ч暱搴 +struct fifo_queue_STR kprx_queue; +unsigned char kprx_buf[KPRX_NODE_SIZE][KPRX_DATA_SIZE]; +/* +*/ +void kprx_init_queue(void) +{ + queue_init(&kprx_queue,(unsigned char**)kprx_buf,KPRX_NODE_SIZE,KPRX_DATA_SIZE); +} + +/* +鍩虹珯鎺ユ敹閿洏鏁版嵁锛屽皢閿洏鏁版嵁淇濆瓨鍒 闃熷垪涓 +琚 鏃犵嚎涓柇鍑芥暟璋冪敤 */ +unsigned char keypad_rf_data_save( unsigned char *rf_data) +{ + #ifdef MAINLOOP_PROCESS_VOTE + return queue_in(&kprx_queue,rf_data,KPRX_NODE_SIZE,KPRX_DATA_SIZE); + #else + keypad_rf_data_process_NO_fifo(rf_data); + return 1; + #endif +} + +/* +浠庣紦鍐插尯涓彇鍑洪敭鐩樻暟鎹 +input: rf_data[0] =len */ +unsigned char keypad_rf_data_fetch(unsigned char *rf_data) +{ + unsigned char ret_val; + platform.disable_interrupt(); + ret_val =queue_out(&kprx_queue,rf_data,KPRX_NODE_SIZE,KPRX_DATA_SIZE); + platform.enable_interrupt(); + return ret_val; +} + +#ifndef RF_5G8 +volatile unsigned int error_cnt; +void keypad_rf_data_process_NO_fifo(unsigned char *tmp) +{ + unsigned char modual_id,*keypad_buf; +// unsigned char tmp[64+1]; +// +// if(!keypad_rf_data_fetch(tmp) ){ +// return; +// } + + if(tmp[1] <4) return; //閬垮厤鍚庣画鎵цkeypad_buf[0]-4鍑洪敊!!! + + //monitor same freq + if( (function.fastmatch__get_status() ==0) && (function.monitor__rf_data(tmp+1)!=0) )//if( function.monitor__SW &&(function.monitor__rf_data(tmp)!=0) ) + return; + + //AES 瑙e瘑鍑洪敊锛屾暟鎹涪寮冿紒锛侊紒 + if( !function.aes__rf_Decrypt(tmp+1) )return ; + if( (modual_id = conver_id(tmp[0])) ==0xff) return ;//纭欢id杞崲鎴愬唴閮╥d锛屽鐞嗘洿鏂逛究 + keypad_buf = tmp+1; //鐢ㄦ寚閽堟洿鐏垫椿!! + + + //crc16鍏ㄦ牎楠屽姛鑳 + if( keypad_crc_check() && \ + ( (keypad_buf[5]==0x91)||(keypad_buf[5]==0x92)||(keypad_buf[5]==0x93)||(keypad_buf[5]==0x94) ) ){ + unsigned short crc; + if(function.crc16_keypad__SW==2){ //22bytes鐨凜RC + crc =(keypad_buf[27]<<8)+keypad_buf[28]; + //a,0x00涓嶆牎楠 + //if( ((crc =(keypad_buf[27]<<8)+keypad_buf[28])>0x00)&&(crc !=crc16(keypad_buf+5,22)) )return ; + //b,鎵鏈夋暟鎹兘鏍¢獙锛屽寘鎷0x00!! + if( crc !=crc16(keypad_buf+5,22) )return ; + + } + else if(function.crc16_keypad__SW==3){ //22 or 26 bytes + crc = (keypad_buf[27]<<8)+keypad_buf[28]; + if( crc !=crc16(keypad_buf+5,22) ){ + crc =(keypad_buf[31]<<8)+keypad_buf[32]; + if( crc !=crc16(keypad_buf+5,26) )return ; + } + } + else{ //26Bytes鐨凜RC + crc =(keypad_buf[31]<<8)+keypad_buf[32]; + if( crc !=crc16(keypad_buf+5,26) )return ; + } + + } + #if UPDATE_KP_2 + if( (keypad_buf[5]!=0x91)&&(keypad_buf[5]!=0x92)&&(keypad_buf[5]!=0x93)&&(keypad_buf[5]!=0x94) ){ + if(function.updatekp__SW && function.update__save_keypad_ack_data(keypad_buf) ){ + refresh_rcvRF_indicate(); + return; + } + } + #endif + + if(!function.no_matchcode__SW){ + if( ((keypad_buf[5]==0x93)&&(keypad_buf[6]==14)) || + log_mode_is_free_match || log_mode_is_WHITELIST ){ + //鑰冨嫟,鍏嶉厤瀵规ā寮忥紝鐧藉悕鍗曟ā寮忛兘涓嶉獙璇侀厤瀵圭爜; + } + else{ + if(mem_compare(keypad_buf+1,base_mac.match_code,BASE_MAC_LEN) ==0) + return; + } + //remove match code ,涔嬪悗鐨勬暟鎹拰鍗忚byte瀹屽叏鍚诲悎锛屼究浜庨槄璇绘瘮瀵 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + mem_cpy(keypad_buf+5,keypad_buf+1,keypad_buf[0]-4); + keypad_buf[0] -=4; + } + + + //-----鏄熀绔欐暟鎹 //2020.04.14 + if(keypad_buf[1]<0x80){ + //姝ゅ鍋 :a鍚岄妫娴;b澶氬熀绔欐娴 + return; + } + + //led2_indicate rx + refresh_rcvRF_indicate();//led2_indicate_rf(); + + if( keypad_buf[1] ==0x91){ + keypad_id_mode(keypad_buf,modual_id); + } + else if( keypad_buf[1] ==0x92){//sn mode + keypad_sn_mode(keypad_buf,modual_id); + } + else if((function.crs2__SW)&& ( (keypad_buf[1] ==0x93)||(keypad_buf[1] ==0x94)) ){ //crs2 + keypad_crs2_mode(keypad_buf,modual_id); + } + else{ //transfer to pc //閿洏杞彂鏁版嵁缁檖c,鍩虹珯涓嶅仛澶勭悊 + //鏉ヨ嚜閿洏鐨勮冨嫟鏁版嵁:08 fb 3c 04 80 74 11 e2 fd; 姝ゆ暟鎹彲鑳戒笉鑳藉埌杈捐繖閲!!!?? + if( (keypad_buf[0] ==0x18)&& + (keypad_buf[1] ==keypad_buf[2])&&(keypad_buf[1] ==keypad_buf[3])&& + (keypad_buf[1] ==keypad_buf[4])&&(keypad_buf[1] ==keypad_buf[5]) + ){ + error_cnt++; + return; + } + function.user_keypad_transfer2pc(keypad_buf); + + //濡傛灉鏄敭鐩樺崌绾фā寮忥紝骞朵笖鏄敭鐩樺洖搴旂殑鍗囩骇鐩稿叧鏁版嵁锛屽氨闇瑕佽浆鍙戠粰pc + if(function.updatekp__SW && function.update__save_keypad_ack_data(keypad_buf) )return; //搴旇灏嗘鍑芥暟绉诲埌 function.user_keypad_transfer2pc(keypad_buf);涓幓澶勭悊锛 + + keypad_transfer2pc_data_save(keypad_buf);//store to transfer buffer +// tmp[0] =tmp[0]; //debug only + } +} +#endif // + +/* +鍩虹珯澶勭悊鏉ヨ嚜閿洏 鏁版嵁 鎬诲叆鍙 +灏嗛敭鐩樻暟鎹垎鎴4涓被鍨嬶細 + id 妯″紡 + sn 妯″紡 + CRS2 妯″紡 + 杞彂鑷硃c鐨勬暟鎹 +called by main loop */ +void keypad_rf_data_process(void) +{ +// unsigned char modual_id,*keypad_buf; + unsigned char tmp[64+1]; + + if(!keypad_rf_data_fetch(tmp) ){ + return; + } + + keypad_rf_data_process_NO_fifo(tmp); +} + + + +/* +鍒濆鍖 閿洏鐩稿叧 +a, 鍒濆鍖栨帴鏀堕敭鐩樼殑闃熷垪 +b,鍒濆鍖栬浆鍙戠粰閿洏鐨勬暟鎹槦鍒 +called by main init */ +void base_process_keyapad_init(void) +{ + #ifdef RF_5G8 + base_process_5G8_keyapd_init_queue(); + #endif + + kprx_init_queue(); + transfer2kp_init_queue(); //pc transfer to keyapd queue init. + keypad_idsn_clear(); + base_send_beacon_switch(1); //寮鍚熀绔欏彂閫佷俊鏍囨暟鎹 + +} + + + diff --git b/Base_core/core_src/base_process_tx_keypad.c a/Base_core/core_src/base_process_tx_keypad.c new file mode 100644 index 0000000..dcaf020 --- /dev/null +++ a/Base_core/core_src/base_process_tx_keypad.c @@ -0,0 +1,905 @@ + +#include "base_pc_protocol.h" +#include "platform_interface.h" +#include "function_interface.h" +#include "base_core.h" +#include "base_core_user.h" + +struct keypad_idsn_STR keypad_idsn; + + +/*----------------------- CRC -------------------------------------------------------- +鍩虹珯鍜岄敭鐩樹箣闂寸殑crc鏍¢獙寮鍏筹紝sdk鍙互鐩存帴璁剧疆; +鍖哄埆浜巉unction.crc16_keypad__SW --鍥轰欢鏄惁鏀寔crc鍔熻兘; +*/ + +/* +*/ +void set_keypad_crc_config(unsigned char flag) +{ + if( function.crc16_keypad__SW){ + //a,鐗规畩鐨 AES寮鍚殑妯″紡涓,keypad CRC寮哄埗鎵撳紑鐨!!!!!! + if(function.aes__get_status() !=0) + kernel.keypad_crc_flag =1; + else{ + kernel.keypad_crc_flag =flag; + } + } + else{ + //濡傛灉base core涓嶆敮鎸丆RC鍔熻兘锛岀洿鎺ュ弽棣0 + kernel.keypad_crc_flag =0; + } + + //store keypad crc config + base_write_e2prom(STORE_KP_CRC_CONFIG,&kernel.keypad_crc_flag,1); +} + +///* +//鐗规畩鐨.. +//*/ +//unsigned char get_keypad_crc_config(void) +//{ +// //AES寮鍚殑妯″紡涓,keypad CRC寮哄埗鎵撳紑鐨!!!!!! +// if(function.aes__get_status() !=0) +// set_keypad_crc_config(1); +// +// return kernel.keypad_crc_flag; +//} + +/* +鍒ゆ柇鍩虹珯鍜岄敭鐩樻槸鍚﹁繘琛孋RC鏍¢獙 +濡傛灉宸茬粡寮鍚簡AES鍔熻兘锛岀敱浜嶢ES鑷甫浜咰RC锛屾墍浠ュ閮ㄤ笉鑳藉啀鍋欳RC浜 +濡傛灉娌℃湁寮鍚疉ES鍔熻兘锛屽氨鎸 keypad_crc_flag鐨勫疄闄呭兼潵杩愯 +*/ +unsigned char keypad_crc_check(void) +{ + if(function.aes__get_status() !=0) + return 0; + else if (function.crc16_keypad__SW==0) + return 0; + else + return kernel.keypad_crc_flag; + +} + + + +/*----------------------------------------------------------- +鍩虹珯鍙戠粰閿洏鐨勬暟鎹細 +鍩虹淇℃爣锛屾姇绁ㄤ俊鏍囧拰鎶曠エ鏁版嵁鐨勭‘璁 +input[0] = data length +rf_id 琛ㄧず鐨勬槸鏍稿績鍐呴儴璁板綍鐨勭‖浠剁紪鍙风殑鏁扮粍涓嬫爣!!!! +*/ +void base_tx_to_keypad_sub(unsigned char *ibuf,unsigned char rf_id) +{ + unsigned char buf[64+1]; //add by Gavin,鍑芥暟閲嶅叆闂; + mem_cpy(ibuf,buf,ibuf[0]+1); + + if(function.no_matchcode__SW){ //NO math code + buf[0] -=4; + mem_cpy(buf+5,buf+1,buf[0]); + } + +// if( keypad_crc_check()){//if(function.crc16_keypad__SW){ +// unsigned short crc_tmp; +// crc_tmp = crc16(buf+5,26); +// buf[31]=crc_tmp>>8; +// buf[32]=crc_tmp&0xff; +// buf[0]=32; +// } + + //monitor rf modual + rf_modual__tx_counter(multi.modual_id[rf_id]); + + function.aes__rf_Encrypt(buf); //AES + platform.rf_send_data(buf+1,buf[0],multi.modual_id[rf_id]); +} + + +/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +鍜屼笂杩板嚱鏁扮浉姣旓紝姝ゅ嚱鏁颁笓闂ㄧ粰澶栭儴浣跨敤 function涓兘鍙兘浼氱敤鍒般 +rf_id琛ㄧず鐨勬槸 鏃犵嚎妯″潡鐨勭‖浠舵爣鍙*/ +void send_to_keypad_user_hardID(unsigned char *ibuf,unsigned char rf_hard_id) +{ + unsigned char buf[64+1]; //add by Gavin,鍑芥暟閲嶅叆闂; + mem_cpy(ibuf,buf,ibuf[0]+1); + + if(function.no_matchcode__SW){ //NO math code + buf[0] -=4; + mem_cpy(buf+5,buf+1,buf[0]); + } + + // +// if( keypad_crc_check()){//if(function.crc16_keypad__SW){ +// unsigned short crc_tmp; +// crc_tmp = crc16(buf+5,26); +// buf[31]=crc_tmp>>8; +// buf[32]=crc_tmp&0xff; +// buf[0]=32; +// } + + function.aes__rf_Encrypt(buf); //AES + platform.rf_send_data(buf+1,buf[0],rf_hard_id); +} + + + +/* +鍒ゆ柇/闄愬埗鍩虹珯棰戠偣*/ +unsigned char assert_base_channel(void) +{ + if(function.lock_channel!=0) + base_config.chan = function.lock_channel; + + if( function.mask_spec_channel){ + if( base_config.chan ==2) base_config.chan=1; + if( base_config.chan ==26) base_config.chan=25; + if( base_config.chan ==80) base_config.chan=79; + } + + + if( (base_config.chan <=0)||(base_config.chan>function.rf_channel_max) ){ + base_config.chan =1; + return 0; + } + return 1; +} + + + + + +//--------------------------------------- record id/sn process-------------------------- +/* +淇濆瓨閿洏鐨刬d/sn +intput: + idsn--buffer + byteN- id/sn瀛楃涓暟 +return: + 0- fail + 1- OK */ +unsigned char keypad_idsn_save(const unsigned char *idsn,unsigned char byteN,unsigned char rf_id) +{ + unsigned char idsn_count; + if( byteN>6) return 0; + if(rf_id >=4) return 0; + +//kernel.multi_title_flag=0;//debug only +// if(kernel.multi_title_flag){ //澶氶鍨嬬壒娈婂鐞 +// if( (idsn[8]==0) ||(idsn[8] >200) ) return 0; //鍒ゆ柇棰樺瀷 +// } + + platform.disable_interrupt(); + + if( (idsn_count= multi.multi_idsn[rf_id].number) <10){ + mem_cpy(idsn,multi.multi_idsn[rf_id].idsn[idsn_count],byteN); + +// if(kernel.multi_title_flag){ //澶氶鍨嬬壒娈婂鐞 +// multi.multi_idsn[rf_id].idsn[idsn_count][4] = idsn[8]; //璁板綍棰樺瀷锛岀敤浜巃ck, debug only!!! +// } +// else + { + //crs2妯″紡涓嬮渶瑕佺壒娈婂鐞嗐4銆 + if(function.crs2__SW) //閿洏鐢ㄦ瀛楄妭鍒ゆ柇鍩虹珯鐨刟ck鏄惁鏈夋晥 + multi.multi_idsn[rf_id].idsn[idsn_count][4] =1; + + if(idsn[14] == 1)//鍏ョ綉鐢宠,20220621 + { + if((idsn[12]*256 + idsn[13])== function.network__get_pwd() || function.network__get_pwd()==0)//瀵嗙爜姝g‘鎴栨棤瀵嗙爜 + { + multi.multi_idsn[rf_id].idsn[idsn_count][4] =11; + } + else + { + multi.multi_idsn[rf_id].idsn[idsn_count][4] =10; + } + } + } + multi.multi_idsn[rf_id].number++; + } + + platform.enable_interrupt(); + return 1; +} + + +/* +娓呴櫎璁板綍閿洏idsn,鍙婃湁鏁堜釜鏁 +*/ +void keypad_idsn_clear(void) +{ + unsigned char i,j; + //娑夊強鍒板壇妯″潡鍙戜俊鏍囧拰棰戠偣杞浆 + for(i=0;i>8; + tmp[28] = crc_tmp&0xff; + } + base_tx_to_keypad_sub(tmp,j); + }//for +} + +static void base_confirm_keypad_sn_mode(unsigned char seq) +{ + unsigned char tmp[64];//tmp[32]; //20200511 + unsigned char i,seq2,j; + + tmp[0] =35; + get_base_match_code(tmp+1); + tmp[5] =0x16; + seq2 = (seq==1)?0:5; + + for(j=0;j>8; + tmp[11+i*6] = crc_tmp&0xff; + } + + base_tx_to_keypad_sub(tmp,j); + }//for + +} + + +static void base_confirm_keypad_crs2_mode(unsigned char seq) +{ + unsigned char tmp[64];//tmp[32]; + unsigned char i,seq2,j; +#if 0 + tmp[0] =32; + get_base_match_code(tmp+1); + tmp[6] =0; + tmp[7] =0; + if(seq==1){ + seq2 =0; + tmp[5] =0x18; + if(function.aux_att__SW) + tmp[6] =(aux_att.keypad_attn_sw>0)+ ((aux_att.keypad_report_sw>0)<<1) + ((aux_att.base_beacon_sw>0)<<2); + }else{ + seq2=5; + tmp[5] =0x19; + if(function.aux_att__SW) + tmp[6] =(aux_att.keypad_attn_sw>0)+ ((aux_att.keypad_report_sw>0)<<1); + } + + for(j=0;j0)+ ((aux_att.keypad_report_sw>0)<<1) + ((aux_att.base_beacon_sw>0)<<2); + }else{ + seq2=5; + tmp[5] =0x19; + if(function.aux_att__SW) + tmp[6] =(aux_att.keypad_attn_sw>0)+ ((aux_att.keypad_report_sw>0)<<1); + } + + for(j=0;j>8; + tmp[11+i*6] = crc_tmp&0xff; + } + } + else{ //200200826;鐗规畩澶勭悊澶氶鍨: + unsigned short crc; + for(i=0;i<4;i++){ //ACK 4 keypad Max, remain 5bytes for CRC load tmp31,32; + #ifdef _DBG_2G4_KP_ + _debug_core__record_ackkp_info(tmp[5], multi.multi_idsn[j].idsn[seq2+i] ); + #endif + mem_cpy(multi.multi_idsn[j].idsn[seq2+i],tmp+8+5*i,5); + }//for + tmp[28] = 0xff; + tmp[29] = 0xff; + tmp[30] = 0xff; + crc=crc16(tmp+5,26); + tmp[31] = crc>>8; + tmp[32] = crc; + } + + base_tx_to_keypad_sub(tmp,j); + }//for + +#endif +} + + + +//============================================ base tx to keypad beacon ========================================= +#define STEP_SEND_BASIC_BEACON 1 +#define STEP_SEND_VOTE_BEACON 2 +#define STEP_RX_VOTE 3 +#define STEP_SEND_CONFIRM1 4 +#define STEP_SEND_CONFIRM2 5 +#define STEP_SEND_CONFIRM_END 6 +#define STEP_TRANS2KEYPAD 7 +#define STEP_KEYPAD_UPDATE 8 + + +struct send_beacon_STR{ + unsigned char step; + unsigned char vote_beacon_cnt; + #define WAITFOR_VOTE_2MS5 10 + unsigned char waitfor_vote; + //杞彂鐩稿叧 + unsigned char (*transfer_function_pointer)(void); + unsigned char transfer_idle_times,transfer_busy_times; +}; +struct send_beacon_STR send_beacon; + + + + + + + + + +/* +*鍙戦佹墿灞曞熀纭淇℃爣 +*鐢ㄤ簬澶氬熀绔欏閲忓潎琛; +* see keypad protocol V5.40 secton2.3 +*/ +static void base_tx_ext_basic_beacon(void) +{ + unsigned char tmp[32],j; + + tmp[0] =31;//28; //len + base_core.get_match_code(tmp+1); + tmp[5] =0x10; //ext basic beacon + tmp[6] =get_base_id(); //base id + mem_cpy(&basic_ext_beacon.head_addr+1,tmp+7,BASIC_EXT_BEACON_LEN); + + for(j=0;j>8; + tmp[32] = crc; + tmp[0] = 32; + } + base_tx_to_keypad_sub(tmp,j); + }//for + + send_beacon.step = STEP_RX_VOTE; + send_beacon.vote_beacon_cnt =0; + send_beacon.waitfor_vote=0; +} + + +/* +*鍙屽ぉ绾垮垏鎹 +*/ +static void doule_ant_application(void) +{ + static unsigned char multi_ant_counter; + if( ++multi_ant_counter>10){ + if(multi_ant_counter>12) multi_ant_counter=0; + platform.doule_ANT_sw(1);//鍓ぉ绾 + } + else{ + platform.doule_ANT_sw(0);//涓诲ぉ绾 + } +} + + + + +/*------------------------------ extend vote beacon start ------------------------------------- +20200914 +1,灏 CRS100涓 鑷畾涔夋爣棰橈紙鏂颁笢鏂规场娉″畾鍒讹級绉绘鍒板ぇ鍩虹珯;see keypad protocol V0.99-10 secton2.2.17 +2,澧炲姞section 2.2.17-2鎸囧畾绛旈鍣; + +*鍙戦佹墿灞曟姇绁ㄤ俊鏍 +鏁欒偛鏂扮増-琛ㄥ喅鍣╒0.99-14 section2.2.17-2; +娌跨敤鏁欒偛鏂扮増-鍩虹珯鍗忚V0.95 section2.4 璁剧疆鎵╁睍淇℃爣銆 +鍙互鍙傝冧箣鍓嶅凡缁忓湪CRS100涓婂畬鎴愮殑 -琛ㄥ喅鍣╒0.99-10 section2.2.17锛堟场娉¤嚜瀹氫箟棰樺瀷锛 +*/ +#ifdef EXTEND_VBEACON2 +static void base_tx_ext_vbeacon(unsigned char type) +{ + unsigned char tmp[32]; + + tmp[0] =31;//28; //len + base_core.get_match_code(tmp+1);//get_base_match_code(tmp+1);//tmp1-4 + tmp[5] =0x33; //ext vote beacon + if(type==0) + mem_cpy(&ext_vbeacon.head_addr+1,tmp+6,EXT_VBEACON_LEN); + else + mem_cpy(&ext_vbeacon_2.head_addr+1,tmp+6,EXT_VBEACON_LEN); + tmp[31] =get_base_main_rfchannel();// add by Gavin 20201222 閰嶅悎T1lite + base_tx_to_keypad_sub(tmp,get_mainRF_usr_id()); + + send_beacon.step = STEP_RX_VOTE; + send_beacon.vote_beacon_cnt++; + send_beacon.waitfor_vote= 0; +} +#else +static void base_tx_ext_vbeacon(void) +{ + unsigned char tmp[32]; + + tmp[0] =31;//28; //len + base_core.get_match_code(tmp+1);//get_base_match_code(tmp+1);//tmp1-4 + tmp[5] =0x33; //ext vote beacon + mem_cpy(&ext_vbeacon.head_addr+1,tmp+6,EXT_VBEACON_LEN); + + base_tx_to_keypad_sub(tmp,get_mainRF_usr_id()); + + send_beacon.step = STEP_RX_VOTE; + send_beacon.vote_beacon_cnt++; + send_beacon.waitfor_vote= 0; +} +#endif + + +/* +*鎵╁睍鎶曠エ淇℃爣鐨勫惎鍋滄帶鍒 +* turn on : sdk鍐欏叆鍙傛暟鍚庡氨鍚姩鍙戦 kernel.ext_vbeacon_onoff_flag +* turn off: sdk鍋滄涓氬姟銆 +*/ +static unsigned char check_send_ext_vbeacon(void) +{ + static unsigned char alternate_flag=0; + + if( kernel.ext_vbeacon_onoff_flag && (alternate_flag ^=1) ){ + + #ifdef EXTEND_VBEACON2 + if(kernel.ext_vbeacon_type1_flag && kernel.ext_vbeacon_type2_flag){ + static unsigned char cur_type=0; + if(cur_type==0) + base_tx_ext_vbeacon(0); + else + base_tx_ext_vbeacon(1); + cur_type^=1; + } + else if(kernel.ext_vbeacon_type1_flag){ + base_tx_ext_vbeacon(0); + } + else if(kernel.ext_vbeacon_type2_flag){ + base_tx_ext_vbeacon(1); + } + #else + base_tx_ext_vbeacon(); + #endif + return 1; + } + + if( kernel.ext_vbeacon_sysmode_change_flag && (vote_beacon.sys_mode ==0) ){ + kernel.ext_vbeacon_sysmode_change_flag=0; + kernel.ext_vbeacon_onoff_flag=0; + + kernel.ext_vbeacon_type1_flag=0; + kernel.ext_vbeacon_type2_flag=0; + } + + return 0; +} +//------------------------------ extend vote beacon end ------------------------------------- + + +/* +鍙戦佹姇绁ㄤ俊鏍囧嚱鏁*/ +static void base_tx_vote_beacon(void) +{ + unsigned char tmp[40],j; + + //check send exr vote beacon + if(check_send_ext_vbeacon()) return; + + //clear record id/sn buffer, + keypad_idsn_clear(); + + if( function.broadcast__keypad_request(0)==1) return; //鎺ユ敹閿洏鐨勯噸澶嶅箍鎾殑鐢宠骞朵笖宸茬粡纭鍚庡氨寮鍚箍鎾紝鍏抽棴淇℃爣鍙戦 + //鍙屽ぉ绾垮垏鎹 + doule_ant_application(); + + //濡傛灉寮鍚簡att鍔熻兘锛 妯℃嫙娴嬭瘯鎵撳紑鍚庢墠鍙戞姇绁ㄤ俊鏍 + if( (function.aux_att__SW==0)|| (function.aux_att__SW && aux_att.base_beacon_sw) ) + { + + tmp[0] =32; + get_base_match_code(tmp+1);//tmp1-4 + tmp[5] =(log_mode_is_ID)?0x13:0x14; //vote beacon + if(log_mode_is_CRS2 ) tmp[5] =0x17;//瑙佹暀鑲叉柊鐗堣〃鍐冲櫒鍗忚 + tmp[6] =basic_beacon.nowT[0]; //nowT + tmp[7] =basic_beacon.nowT[1]; + mem_cpy(&vote_beacon.head_addr+1,tmp+8,VOTE_BEACON_LEN); + + if( log_mode_is_WHITELIST) + tmp[9] =vote_beacon.sys_mode |(1<<6) ; //鎺у埗鐧藉悕鍗曞紑鍏 + else + tmp[9] =vote_beacon.sys_mode &~(1<<6) ; + + /* + //鐢变簬澧炲姞浜嗗揩閫熼厤瀵规椂鍙戦丄ES绉橀挜;鎵浠ュ湪AES鍔犲瘑妯″紡涓嬪揩閫熼厤瀵规椂锛屼笉鑳藉姞杞藉涓嬩俊鎭紝鍚﹀垯AES绉橀挜琚細琚慨鏀!!! */ + //if( function.fastmatch__load_info_to_vote_beacon(tmp)==0){//modify by gavin 20200422 + if( (function.fastmatch__load_info_to_vote_beacon(tmp)==0) || (function.aes__get_status()==0) ){ + if(log_mode_is_CRS2 ){ //crs2 mode + tmp[5] =0x17;//瑙佹暀鑲叉柊鐗堣〃鍐冲櫒鍗忚 + //tmp[0] =32; + mem_cpy(&basic_beacon_crs2.head_addr+1,tmp+29,BASIC_BEACON_CRS2_LEN); + basic_beacon_crs2.pack_cnt++; + if(basic_beacon_crs2.pack_cnt>7) basic_beacon_crs2.pack_cnt=0;//0~7 淇℃爣搴忓彿锛20220518 + tmp[28] =basic_beacon_crs2.pack_cnt;//搴忓彿鐢ㄤ簬閿洏浼戠湢鍚屾閱掓潵,20220518 + tmp[29] =basic_beacon_crs2.crs2_attrib[0]| (get_base_log_mode()==5); + tmp[30] =basic_beacon_crs2.crs2_attrib[1]; +// tmp[31] =get_base_main_rfchannel();// + tmp[31] = function.network__get_netseq();//鏀逛负缁勭綉搴忓彿锛20220621 + if( (function.base_type == TYPE_CRS200)||(function.base_type == TYPE_C100) ) + tmp[32] = crc16(tmp+5,27)&0xff; //Notice:閰嶅悎T1lite 蹇呴』鍚敤 + else{ + tmp[32] =basic_beacon_crs2.crs2_attrib[3]; + } + } + else{//20200401 閰岹1鏃舵棤娉曢攣棰戣屽鍔犱富棰戠偣淇℃伅; + tmp[29] =0xA5; + tmp[30] =get_base_main_rfchannel(); + } + } + + for(j=0;j>8; + tmp[32] = crc; + tmp[0] = 32; + } + + base_tx_to_keypad_sub(tmp,j); + }//for + + } + //here,add special setting + + send_beacon.step = STEP_RX_VOTE; + send_beacon.vote_beacon_cnt++; + send_beacon.waitfor_vote= 0; +} + +extern unsigned char msg_issendtime(void); +extern void msg_recover_beacon_countdown(void); +/* --------------------------------------------------------- +鍩虹珯鍙戦佷俊鏍/鏃跺簭 缁欓敭鐩 +姝ゅ嚱鏁2.5ms琚皟鐢ㄤ竴娆 +called by 2.5ms timer*/ +void base_tx_keypad_beacon(void) +{ + #if TEXT_MESSAGE + msg_recover_beacon_countdown(); + #endif + if(send_beacon.step==0) return; + + switch(send_beacon.step){ + //----1 鍩虹淇℃爣 + case STEP_SEND_BASIC_BEACON: + if(log_mode_is_CRS2) + base_tx_vote_beacon();//crs2鍗忚涓 涓嶅彂閫佸熀纭淇℃爣浜 + else + base_tx_basic_beacon(); + break; + + //----2 鎶曠エ淇℃爣 + case STEP_SEND_VOTE_BEACON: + base_tx_vote_beacon(); + break; + + //-----3 鎺ユ敹閿洏鎶曠エ + case STEP_RX_VOTE: //?? + if( ++send_beacon.waitfor_vote =2)){ + send_beacon.vote_beacon_cnt=0; + base_tx_basic_beacon(); + } + else//crs2妯″紡 鎴栬呴潪crs2妯″紡涓嬫姇绁ㄤ俊鏍囧皯浜2 + { + #if TEXT_MESSAGE + if(!msg_issendtime()) + base_tx_vote_beacon(); + else + { + base_send_beacon_switch(0); + } + #else + base_tx_vote_beacon(); + #endif + } + } + break; + + case STEP_TRANS2KEYPAD: + if(send_beacon.transfer_function_pointer() ){//鏈夋暟鎹 + //send_beacon.transfer_idle_times=0; + send_beacon.transfer_busy_times++; + if(send_beacon.transfer_busy_times>= 80){ + beacon_type=1; //433M + send_beacon.step =STEP_SEND_BASIC_BEACON; + } + } + else{ + unsigned char transfer_idle_timer_tmp; + send_beacon.transfer_idle_times++; + //send_beacon.transfer_busy_times=0; + /* 2020.07.23 433M鍩虹珯閰嶅悎Voxm骞虫澘鏃"鏄剧ず缁撴灉鐨勭姸鎬佷笅绂荤嚎鍐嶅湪绾挎棤娉曟仮澶嶅埌绂荤嚎鍓嶇殑鐘舵" 瑙e喅鍔炴硶锛20timers + 2020.09.15 EVS200 涓嬪彂鍚嶅崟缁忓父澶辫触; 瑙e喅鍔炴硶锛80timers; + */ + if(function.base_type ==TYPE_CRS200_433) + transfer_idle_timer_tmp =20; + else + transfer_idle_timer_tmp =80; + if(send_beacon.transfer_idle_times>= transfer_idle_timer_tmp){//if(send_beacon.transfer_idle_times>=80){ + beacon_type=1; //433M + send_beacon.step =STEP_SEND_BASIC_BEACON; + } + } + break; + + default:break; + }//sw +} + + +//--------------------------------------------------------------------- +/* +鍩虹珯鍙戦佷俊鏍囩殑寮鍏, +鏌愪簺鍔熻兘闇瑕佸叧闂 鍩虹珯鍙戦佷俊鏍 +鍩虹珯璇诲彇鍩虹鍙傛暟鍚庡啀寮鍚彂閫佷俊鏍 +*/ +void base_send_beacon_switch(unsigned char sw) +{ + send_beacon.step =sw; +} + +unsigned char get_base_send_beacon_status(void) +{ + return send_beacon.step; +} + + +#endif //RF_5G8 + + diff --git b/Base_core/core_src/base_timer.c a/Base_core/core_src/base_timer.c new file mode 100644 index 0000000..95d5f5e --- /dev/null +++ a/Base_core/core_src/base_timer.c @@ -0,0 +1,76 @@ + +#include "base_pc_protocol.h" +#include "platform_interface.h" +#include "function_interface.h" +#include "base_core.h" +#include "base_core_user.h" + + + +/* +2.5ms涓柇鏈嶅姟绋嬪簭 +*/ +void base_core_2ms5_isr(void) +{ + #ifndef KEYPAD60 + //鍩虹珯鍙戦佷俊鏍囩粰閿洏鎬诲叆鍙 + base_tx_keypad_beacon(); + #endif +//operation_debug_io(4); + //鍩虹珯涓婃姤鎶曠エ鏁版嵁缁檖c鐨勬暟鎹寘鍙戦侀棿闅 + vote_data_report_interval(); + + #if defined(_SDK_OFFLINE_) || defined(_SDK_SYSMODE0_KEEPTIMER_)//閰嶅悎閿洏鐢甸噺娴嬭瘯 + _monitor_sdkoffline_sysmode0(); + #endif +} + +/* +* +*/ +void base_core_28ms_isr(void) +{ + #ifdef KEYPAD60 + //鍩虹珯鍙戦佷俊鏍囩粰閿洏鎬诲叆鍙 + base_tx_keypad_beacon(); + #endif +} + + +//----------------------------------------------------------------- +/* +20ms涓柇鏈嶅姟绋嬪簭 +*/ +void base_core_20ms_isr(void) +{ + static volatile unsigned char _0s5_cnt; + + unsigned short tmp16; + _2BYTE_TO_16BIT(basic_beacon.nowT,tmp16); + tmp16++; + _16BIT_TO_2BYTE(tmp16,basic_beacon.nowT); + + timer_20ms_function(); + + if(++_0s5_cnt >=25){//0.5S瀹氭椂鍣ㄥ姛鑳 + _0s5_cnt =0; + + //濡傛灉寮鍚簡蹇冭烦鍔熻兘锛屽垯鍚敤瀹氭椂鍣 + if( (function.aux_beat__SW)&&(aux_beats.net_timer) ) aux_beats.net_timer--; + + //sysmode ==0鐨勭洃娴; + if( vote_beacon.sys_mode ==0) + kernel.sysmode0_keeptimer_05S++; + else + kernel.sysmode0_keeptimer_05S =0; + } + + //rf error warning + rf_error_warning(); + +} + + + + + diff --git b/Base_core/core_src/common_math.c a/Base_core/core_src/common_math.c new file mode 100644 index 0000000..964575f --- /dev/null +++ a/Base_core/core_src/common_math.c @@ -0,0 +1,124 @@ + +/* +鍐呭瓨澶嶅埗 +*/ +void mem_cpy( const unsigned char *src,unsigned char *dist,unsigned char len) +{ + unsigned char i; + for(i=0;i> 12; /* 鏆傚瓨CRC鐨勯珮鍥涗綅 */ + Crc <<= 4; /* CRC宸︾Щ4浣嶏紝鐩稿綋浜庡彇CRC鐨勪綆12浣嶏級*/ + Crc ^= crc_table[da ^ ( *ptr / 16 )]; /* CRC鐨勯珮4浣嶅拰鏈瓧鑺傜殑鍓嶅崐瀛楄妭鐩稿姞鍚庢煡琛ㄨ绠桟RC锛 + 鐒跺悗鍔犱笂涓婁竴娆RC鐨勪綑鏁 */ + da = Crc >> 12; /* 鏆傚瓨CRC鐨勯珮4浣 */ + Crc <<= 4; /* CRC宸︾Щ4浣嶏紝 鐩稿綋浜嶤RC鐨勪綆12浣嶏級 */ + Crc ^= crc_table[da ^ ( *ptr & 0x0f )]; /* CRC鐨勯珮4浣嶅拰鏈瓧鑺傜殑鍚庡崐瀛楄妭鐩稿姞鍚庢煡琛ㄨ绠桟RC锛岀劧鍚庡啀鍔犱笂涓婁竴娆RC鐨勪綑鏁 */ + ptr++; + } + return( Crc ); +} + + + + +#include "stdio.h" +#include "stdlib.h" +#include "string.h" +/* +杈撳叆鐨勫崄鍏繘鍒舵暟锛5瀛楄妭锛夛紝褰撴垚10杩涘埗锛堝彧鏈4瀛楄妭锛; +渚嬪 : +杈撳叆 12 34; 瀹為檯鏄0x1234锛涗絾鏄敤鎴锋兂瑕佺殑鏄崄杩涘埗鐨1234锛 +*/ +void Dec_to_Hex(unsigned char *sn,unsigned char len, unsigned char *dec ) +{ + int tmp; + char buf[10]; + unsigned char i; + + //a,hex conver to string + for(i=0;i>24; + dec[1] = tmp>>16; + dec[2] = tmp>>8; + dec[3] = tmp>>0; +} + + + + + + diff --git b/Base_core/core_src/debug.c a/Base_core/core_src/debug.c new file mode 100644 index 0000000..00fd6fb --- /dev/null +++ a/Base_core/core_src/debug.c @@ -0,0 +1,875 @@ +#include "stdio.h" +#include "stdlib.h" +#include "string.h" +#include "platform_interface.h" +#include "base_core_user.h" +#include "base_core.h" +#include "function_interface.h" + +#ifdef CORE_DEBUG +/* +*姝ゆ枃浠朵粎浠呯敤浜庡熀绔欏唴鏍稿浐浠剁殑璋冭瘯; +*瀹炵幇鎬濇兂锛氬畾涔変竴娈靛唴瀛樼敤浜庤褰曟兂瑕佽皟璇曠殑鏁版嵁锛屽埄鐢╞ushound鍙戦佸懡浠よ鍙栧搴斿唴瀛樻鐨勬暟鎹; +*2020.05.20 鏍规嵁鏉庡瀹氱殑usb璋冭瘯鍗忚锛岄噸鏂版暣鐞!! +*/ + + +/*20200606涔愭暀涔愬閿欓debug,鐩戞祴鍐呭鏄敭鐩樺崗璁3.2.11 ANStype=7,8; +閿洏缂栧彿涓1-100;(蹇呴』!!!!) +鍦ㄦ櫘閫氭娴嬪熀纭涓婏紝澧炲姞浜嗗棰樺瀷妫娴!!! +ff 81 xx ;xx=棰樼洰鐨勪釜鏁,鏌ョ湅鎺ユ敹鐨勬讳綋鎯呭喌 +ff 82 xx ;xx=棰樼洰鐨勪釜鏁,鏌ョ湅鍩虹珯鍙戦佺粰閿洏鐨刟ck鎬讳綋鎯呭喌 +ff 88 aa bb cc dd xx; + aabbccdd鏄鏌ヨ鐨勫崄杩涘埗閿洏SN鐨勫叿浣撴儏鍐; + xx =0,鏌ヨ鏌愪釜閿洏榛樿鍙傛暟 + xx =1,鏌ヨ鎺ユ敹id閿欒鐨勫叿浣撴暟鎹 + xx =2,鏌ヨ鎺ユ敹鍐呭閿欒鐨勫叿浣撴暟鎹; +*/ + +/* 20200622 VOXM433 +200鍙獀oxm pad 骞虫澘; +妫娴嬫帴鏀跺埌鐨勯敭鐩樺拰鍙戦佺粰sdk鐨勯敭鐩樻鏁 + +*/ + + + + +//void realview_sprintf(unsigned char *scr,unsigned char mode); +void realview_sprintf(unsigned short *scr,unsigned char mode); +void core_debug__get_special_keypad_info(unsigned char *sn_dec); +void core_debug__get_all_keypad_info(unsigned char mode); + +//------------------------------------------- +//Don't modify next three define !! +#define DBG_CMD_LEN 8 //璁板綍sdk 鍛戒护鐨勪釜鏁 + +#define DBG_ERRBUF_LEN 30 //鏈澶ц褰曢敊璇敭鐩樹釜鏁 +#define MONITOR_CNT 100 //瀹為檯鐩戞祴閿洏鐨勪釜鏁 +#define TILT_CNT 201//31//40//妫娴嬮鏁 + +#ifdef _20200622_VOXM_ +#define DBG_BUF_LEN 201 //鏈澶ц褰曢敭鐩樹釜鏁 +#else +#define DBG_BUF_LEN 101 //鏈澶ц褰曢敭鐩樹釜鏁 +#endif + + + + +#ifdef _DBG_ID_KP //妫娴婭D閿洏 +//keypad record +struct keypad_STR{ + unsigned short rx[DBG_BUF_LEN]; //鎺ユ敹鍒扮殑閿洏锛屾鏁帮紵 + unsigned short ack[DBG_BUF_LEN]; //瀵归敭鐩樼殑鍥炲簲, 娆℃暟锛 + unsigned short tx_sdk[DBG_BUF_LEN]; //涓婃姤缁橲DK鐨勬鏁 + unsigned short sdk_ack[DBG_BUF_LEN]; //琚玸dk纭鐨勬鏁 + + #ifdef _20200606_LEJIAO + unsigned char tile[DBG_BUF_LEN][TILT_CNT];//妫娴嬮鍨 + #endif + +}; + +//error record +struct error_STR{ + //id + unsigned char rx_id[DBG_ERRBUF_LEN]; //鍑洪敊鐨刬d + unsigned char rx_id_cnt; //鍑洪敊鐨勪釜鏁 + unsigned char ack_id[DBG_ERRBUF_LEN]; + unsigned char ack_id_cnt; + + #ifdef _20200606_LEJIAO //涔愭暀涔愬 + unsigned char rx_content_cnt; + unsigned char content[DBG_ERRBUF_LEN][8]; + unsigned char rx_content_id[DBG_ERRBUF_LEN]; + unsigned char tile_id[DBG_ERRBUF_LEN]; + unsigned char tile_id_cnt; + #endif +}; + +#endif + +struct debug_STR{ + unsigned char sw_flag; //姝よ皟璇曞姛鑳藉紑鍏 + unsigned char cmd_type[DBG_CMD_LEN]; //璁板綍鏉ヨ嚜sdk鐨勫懡浠 + void (*send_data)(unsigned char *); //void (*send_data)(unsigned char *data_,unsigned char len); + + unsigned char vote_status; + + #ifdef _DBG_ID_KP + //unsigned char kp_cnt; //special //?? + struct keypad_STR kp; + struct error_STR err; + #endif +}; + + +/* +* delay function*/ +void core_debug_delay_ms( unsigned short time ) +{ + unsigned short i = 0; + while( time-- ){ + i = 33400; + while( i-- ); + } +} + +/* +* usb鍙戦佸嚱鏁*/ +static void core_debug_send_data(unsigned char *buf) +{ + platform.base_send_data_to_pc(buf,64); +} + + +/* +* 鍒濆鍖 core debug缁撴瀯浣 +*/ +struct debug_STR core_debug={ + .sw_flag=0, + .send_data = core_debug_send_data, + .cmd_type =0, +}; + + +/* +鍒濆鍖杁ebug,娓呯悊鎵鏈夊彉閲忎负0 +called by system init or applicaiton startup; +*/ +void core_debug__init(void) +{ + unsigned short i,j; + //if(core_debug.sw_flag==0) return;//娌℃湁寮鍚鍔熻兘锛岀洿鎺ヨ繑鍥 + + //sdk cmd type + for(i=0;i绌洪棽 +* other -> voting +*/ +void core_debug__set_vote_status(unsigned char stat) +{ + core_debug.vote_status = stat; +} + +unsigned char core_debug__get_vote_status(void) +{ + return core_debug.vote_status; +} + + + + + +/* +澶勭悊璋冭瘯鍛戒护涓诲嚱鏁 +called by main loop +*/ +void _debug_main_loop(void) +{ + unsigned char i,j,count,tmp[DBG_BUF_LEN]; + + if(core_debug.sw_flag ==0) return; //娌℃湁寮鍚鍔熻兘 + if(core_debug.cmd_type[0]==0) return; //娌℃湁鍛戒护灏辫繑鍥 +// memset(tmp,0,DBG_BUF_LEN); //init tmp=0 + + switch(tmp[0]=core_debug.cmd_type[0]){ + + //1.0, open usb debug switch + case 0xff: + memset(tmp,' ',32); + sprintf( (char *)(tmp),"Open usb debug ok!!"); + platform.base_send_data_to_pc(tmp,32); + break; + //1.1,clear all parameter + case 0xF0: + core_debug__init(); + memset(tmp,' ',32); + sprintf( (char *)(tmp),"Init all parameter OK"); + platform.base_send_data_to_pc(tmp,32); + break; + + //2,璋冭瘯閿洏涓㈤ --鑾峰彇鎵鏈夐敭鐩樼姸鎬 + //rx and ack between base and keypad; + case 0x81://鍩虹珯鎺ユ敹鍒扮殑閿洏鍜屾帴鏀舵鏁 + case 0x82://鍩虹珯纭杩囩殑閿洏鍜岀‘璁ゆ鏁 + //case 0x83: //鑾峰彇鎸囧畾閿洏 鏈鍚庢彁浜ょ殑鏁版嵁 + //case 0x84: //鑾峰彇鏁版嵁鍑洪敊鐨勯敭鐩 + case 0x85: //鑾峰彇涓婃姤缁檚dk鐨勯敭鐩 + case 0x86: //鑾峰彇琚玸dk纭鐨勯敭鐩 + //case 0x87: //鏌ョ湅鍩虹珯鏄惁鏈夋粸鐣欑殑鎶曠エ鏁版嵁 + core_debug__get_all_keypad_info(core_debug.cmd_type[0]); + break; + + //2.1,璋冭瘯閿洏涓㈤ --鑾峰彇鎸囧畾閿洏鐨勭粏鑺傜姸鎬 + case 0x88: //鏌ヨ鎸囧畾SN鐨勯敭鐩樻暟鎹 + #ifdef _DBG_VOICE_KP + _debug_voice_kp__app_get_keypad_debug_info(core_debug.cmd_type+1); + #else + core_debug__get_special_keypad_info(core_debug.cmd_type+1); + #endif + break; + + //3 鐢ㄤ簬function debug鐨勫叆鍙 + case 0xA0: + function._debug__function_enter(core_debug.cmd_type+1); + break; + + case 0xB0: + keypad_battery_test_enter(core_debug.cmd_type+1); + break; + + //add other type + default: + break; + }//sw + + core_debug.cmd_type[0]=0;//娓呴浂锛岄伩鍏嶉噸澶嶅彂閫 +} +#endif + + + +/* +* app 鍛戒护鎺ュ彛鍑芥暟 -涓巗dk鐨勯氫俊鎺ュ彛 +* called by usb communicatoin +*/ +void core_debug_enter(unsigned char *pc) +{ + #ifdef CORE_DEBUG + //a,fisrt byte must be 0xff; + if( pc[0]!=0xFF) return; + //b,copy data + mem_cpy(pc+1,core_debug.cmd_type,DBG_CMD_LEN); + //c,special command-debug turn on; + if( (core_debug.cmd_type[0] ==0xff) &&(core_debug.cmd_type[1] ==0x00) && + (core_debug.cmd_type[2] ==0xff) &&(core_debug.cmd_type[3] ==0x00) && + (core_debug.cmd_type[4] ==0xff) &&(core_debug.cmd_type[5] ==0x00) && + (core_debug.cmd_type[6] ==0xff) &&(core_debug.cmd_type[7] ==0x00) ){ + core_debug.sw_flag =1; //寮鍚璋冭瘯鍔熻兘 + } + #endif +} + + + + + + + + +//-------------------------------------------------------------------------------------- +#ifdef CORE_DEBUG + +/* +*/ +void _debug_core__load_1line__var2string(unsigned char line,unsigned char *in,unsigned char in_len, unsigned char *out) +{ + unsigned char i,str[17]; + memset(out+(line<<4),0,16); + for(i=0;i= core_debug.cmd_type[1]) { + //tmp[32+i*16+j+2]='0'+scr[i*10+j];//鎵撳嵃姣忎釜閿洏鐨勬鏁//0-9鏄暟瀛楀彲浠ョ洿鎺ヨ浆鍖栨垚瀛楃 + //sprintf((char *)(tmp[32+i*16+j+2]),"%x",scr[i*10+j]); + tmp[32+i*16+j+2]='1'; + count++; + } + #else + if(scr[i*10+j]) { + tmp[32+i*16+j+2]='1';//0'+scr[i*10+j];//鎵撳嵃姣忎釜閿洏鐨勬鏁//0-9鏄暟瀛楀彲浠ョ洿鎺ヨ浆鍖栨垚瀛楃 + count++; + } + #endif + }//for + //姣忚鐨13-15瀛楄妭 + tmp[32+i*16+13]=0;tmp[32+i*16+14]=0;tmp[32+i*16+15]=0;//姣忚鏈敤鍒扮殑鏁版嵁娓呴浂锛屼究浜庢竻鏅版煡鐪 + }//for + + switch(mode){ //绗竴琛 + case 0x81: + sprintf( (char *)(tmp)," %003d keypads in",count); + break; + case 0x82: + sprintf( (char *)(tmp),"%003d keypads ack",count); + break; + case 0x83: + //sprintf( (char *)(tmp)," %003d keypads in",count); + break; + case 0x84: + //sprintf( (char *)(tmp)," %003d keypads in",count); + break; + case 0x85: + sprintf( (char *)(tmp),"%003d send to SDK",count); + break; + case 0x86: + sprintf( (char *)(tmp)," %003d ack by SDK",count); + break; + case 0x87: + //sprintf( (char *)(tmp)," %003d keypads in",count); + break; + default: + break; + }//sw + + tmp[389]=0xa5; //璋冭瘯鏃讹紝bushound鐩戞祴鍒版鏁版嵁涓插氨鍋滀笅鏉ワ紝渚夸簬瑙傚療锛侊紒 + tmp[390]=0x5a; + tmp[391]=0xa5; + platform.base_send_data_to_pc(tmp+0,512); +} +#endif + +#if 0 +/*------------------------------------------------------------ +姝ゅ嚱鏁拌В鍐砫ebug鏃 鏄剧ず瀛楃 +1 line: inquired keypad SN +2 line: keypad list count +3 line: +app 鍙戦佹煡璇㈡煇涓敭鐩樹俊鎭殑鍛戒护 +鍩虹珯鏀跺埌鍛戒护鍚:鍦╧eypad list涓悳绱㈤敭鐩橈紝濡傛灉瀛樺湪,澶嶅埗璇ラ敭鐩樻暟鎹笂鎶ョ粰app; +*/ +void core_debug__get_special_keypad_info(unsigned char *sn_dec) +{ + struct link_node_STR *node; + + unsigned char i,j,count; + unsigned char tmp[256]; + unsigned char sn[4]; + unsigned char temp_cnt; + + count=0; + memset(tmp,' ',256); + Dec_to_Hex(sn_dec,4,sn); + + //1 line + sprintf( (char *)(tmp),"SN: "); + sprintf( (char *)(tmp+4),"%010d",(sn[0]<<24)+(sn[1]<<16)+(sn[2]<<8)+sn[3]); + + if( (sn[0]<<24)+(sn[1]<<16)+(sn[2]<<8)+sn[3] > MONITOR_CNT ) + sprintf( (char *)(tmp+16),"Err:SN nonexst!"); //2 line + else{ + #ifdef _20200606_LEJIAO + if(sn_dec[4]==0){ //sn鍙峰悗闈㈢殑鍙傛暟锛岄粯璁ゆ煡閿洏鍚勪釜鍙傛暟 + //2 line 鎺ユ敹鍒扮殑閿洏鏁版嵁鍖呬釜鏁 + sprintf( (char *)(tmp+16),"RXKP:"); + sprintf( (char *)(tmp+16+5),"%011d",core_debug.kp.rx[sn[3]]); + //3 line 鍩虹珯ack鐨勬鏁 + sprintf( (char *)(tmp+32),"ACKKP:"); + sprintf( (char *)(tmp+32+7),"%09d",core_debug.kp.ack[sn[3]]); + + //4 line 鎺ユ敹閿欒 + sprintf( (char *)(tmp+48),"rxideer:"); + temp_cnt =0; + for(i=0;i10) return; //鏈澶10琛 + sprintf( (char *)(tmp+96+temp_cnt*16+4),"cont"); + mem_cpy(core_debug.err.content[i],tmp+96+temp_cnt*16+8,8); + temp_cnt++; + } + }//for + sprintf( (char *)(tmp+80+7),"%05d",temp_cnt); + } + else if(sn_dec[4]==1){//鏌ラ鐩 + //2 line 鎺ユ敹鍒扮殑閿洏鏁版嵁鍖呬釜鏁 + sprintf( (char *)(tmp+16),"tileerrcnt:"); + //sprintf( (char *)(tmp+16+5),"%011d",core_debug.kp.rx[sn[3]]); + //3 line 鍩虹珯ack鐨勬鏁 + //sprintf( (char *)(tmp+32),"ACKKP:"); + sprintf( (char *)(tmp+32),"%05d",core_debug.err.tile_id_cnt); + //line 4 + temp_cnt=0; + for(i=1;i<=core_debug.err.tile_id_cnt;i++){ + sprintf( (char *)(tmp+48+i*3),"%03d",core_debug.err.tile_id[i]); + }//for + //sprintf( (char *)(tmp+48),"losetile"); + +// //line5 +// temp_cnt=0; +// for(i=1;i<=TILT_CNT;i++){ +// if(core_debug.kp.tile[sn[3]][i]==0){ +// sprintf( (char *)(tmp+64+5+temp_cnt*2),"%02d",i); +// temp_cnt++; +// } +// }//for +// sprintf( (char *)(tmp+64),"%04d",temp_cnt); + } + else if(sn_dec[4]==2){//鏌ラ敭鐩樼殑閿欒id鐨勫叿浣撴儏鍐 + //line 2 + sprintf( (char *)(tmp+16),"losetile"); + //line 3 + temp_cnt=0; + for(i=1;i<=TILT_CNT;i++){ + //if( (core_debug.kp.tile[sn[3]][i]==0) && (32+5+temp_cnt*3+3 <255) ){ + //sprintf( (char *)(tmp+32+5+temp_cnt*3),"%03d",i); + if( (core_debug.kp.tile[sn[3]][i]==0) && (32+5+temp_cnt*4+3 <255) ){ //涓や釜涔嬮棿澧炲姞绌烘牸渚夸簬瑙傚療 + sprintf( (char *)(tmp+32+5+temp_cnt*4),"%03d ",i); + temp_cnt++; + } + }//for + sprintf( (char *)(tmp+32),"%04d",temp_cnt); + } + #endif + + + + #ifdef _20200622_VOXM_ + if(sn_dec[4]==0){ //sn鍙峰悗闈㈢殑鍙傛暟锛岄粯璁ゆ煡閿洏鍚勪釜鍙傛暟 + //2 line 鎺ユ敹鍒扮殑閿洏鏁版嵁鍖呬釜鏁 + sprintf( (char *)(tmp+16),"RXKP:"); + sprintf( (char *)(tmp+16+5),"%011d",core_debug.kp.rx[sn[3]]); + //3 line 鍩虹珯ack鐨勬鏁 + sprintf( (char *)(tmp+32),"ACKKP:"); + sprintf( (char *)(tmp+32+7),"%09d",core_debug.kp.ack[sn[3]]); + + //4 line 鎺ユ敹閿欒 + sprintf( (char *)(tmp+48),"rxideer:"); + temp_cnt =0; + for(i=0;i MONITOR_CNT ){ + _debug_core__load_1line__var2string(2,(unsigned char*)"Err:SN nonexst!",16,tmp); + return; + } + + if(sn_dec[4]==0){ //sn鍙峰悗闈㈢殑鍙傛暟锛岄粯璁ゆ煡閿洏鍚勪釜鍙傛暟 + #ifdef _DBG_ID_KP + //rx keypad count + _debug_core__load_1line__var2string(3,(unsigned char*)"RXKP:",16,tmp); + _debug_core__load_1line__var2string(4,(unsigned char*)&core_debug.kp.rx[sn[3]],2,tmp); //2 byte conver print short? + //rx keypad count + _debug_core__load_1line__var2string(5,(unsigned char*)"ACKKP:",16,tmp); + _debug_core__load_1line__var2string(6,(unsigned char*)&core_debug.kp.ack[sn[3]],2,tmp); + //rx error--beyond the max id/sn + _debug_core__load_1line__var2string(7,(unsigned char*)"RX error:",16,tmp); + temp_cnt =0; + for(i=0;iMONITOR_CNT) ){ //id/SN 瓒呭嚭鑼冨洿 + if( core_debug.err.rx_id_cnt TILT_CNT) ){ + //error + core_debug.err.tile_id[core_debug.err.tile_id_cnt]= rx_kp[11]; + core_debug.err.tile_id_cnt++; + } + else{ + core_debug.kp.tile[kp_id][rx_kp[11]]++; + } + } + else{ + if( core_debug.err.rx_content_cnt MONITOR_CNT){ //id/SN 瓒呭嚭鑼冨洿 + if( core_debug.err.ack_id_cnt = 400*60 ) || (_sdkoffline_sysmode0.sysmode0_keep_cnt >=400*60*40) ){ + #ifdef _SDK_OFFLINE_ + if(++_sdkoffline_sysmode0.sdk_offline_cnt >= 400*60 ) + flag =1; + #endif + #ifdef _SDK_SYSMODE0_KEEPTIMER_ + if(vote_beacon.sys_mode ==0) + _sdkoffline_sysmode0.sysmode0_keep_cnt++; + else + _sdkoffline_sysmode0.sysmode0_keep_cnt=0; + if(_sdkoffline_sysmode0.sysmode0_keep_cnt >=400*60*40) + flag =1; + #endif + + if(flag){ + _sdkoffline_sysmode0.sdk_offline_cnt =0; + _sdkoffline_sysmode0.sysmode0_keep_cnt =0; + _sdkoffline_sysmode0.exec_step_timer =0 ; + _sdkoffline_sysmode0.exec_type =2; + } + } + break; + + case 2: + vote_beacon.sys_mode =0; //閫鍑哄綋鍓嶄笟鍔★紝鎸佺画涓260*2.5ms灏忔鏃堕棿; + mem_set(vote_beacon.vbuf,5,0); // memset(vote_beacon.param,0,5); // + if( ++_sdkoffline_sysmode0.exec_step_timer >= 260){ + _sdkoffline_sysmode0.exec_step_timer =0 ; + _sdkoffline_sysmode0.exec_type =3; + } + break; + + case 3: + base_force_keypad_poweroff(); + if( ++_sdkoffline_sysmode0.exec_step_timer >= 260*3){ + base_send_beacon_switch(0); // 鍏抽棴鍩虹珯鍙戦佷俊鏍囨暟鎹 //send_order = SEND_NONE; //涓嶅彂浠讳綍淇℃爣锛 + _sdkoffline_sysmode0.exec_step_timer =0 ; + _sdkoffline_sysmode0.exec_type =4; //off + } + break; + + default:break; + }//switch + +} + +//called by sdk cmd;闄や簡涓闂崄绛斾箣澶栫殑sdk鍛戒护閮藉彲浠ラ噸鏂版縺娲绘娴; +void reset__monitor_sdkoffline_sysmode0(void) +{ + _sdkoffline_sysmode0.sdk_offline_cnt =0; + + if(_sdkoffline_sysmode0.exec_type !=4) return; + _sdkoffline_sysmode0.exec_type =1; //re-startup + if( get_base_send_beacon_status()==0) + base_send_beacon_switch(1); +} + +#endif + + + +//---------------------- base core info------------------------------------------------------------------ +/* +* +*/ +#if defined(_DEBUG_CORE_) +void _debug_core__process_core_info(const unsigned char *pc) +{ + unsigned char tmp[64],cmd_type; + unsigned char start_offset =6; + + mem_set(tmp,64,' '); + mem_cpy(pc+8,tmp,start_offset); + cmd_type =pc[12]; + //pc[13] ==':' + //pc[14] ---鏈夋晥鏁版嵁寮濮.... + if(mem_compare(pc+8,(unsigned char*)"BATT",4) ){ + switch (cmd_type){ + #if defined(_SDK_OFFLINE_) || defined(_SDK_SYSMODE0_KEEPTIMER_) + case '1': //set + _sdkoffline_sysmode0.exec_type = pc[14]; + if( (pc[15]<<8) + pc[16] ) + _sdkoffline_sysmode0.waitfor_timer_Sec = (pc[15]<<8) + pc[16]; + mem_cpy("ok ",tmp+start_offset,3); + break; + case '3': //get + tmp[start_offset+0] = _sdkoffline_sysmode0.exec_type; + tmp[start_offset+1] = _sdkoffline_sysmode0.waitfor_timer_Sec>>8; + tmp[start_offset+2] = _sdkoffline_sysmode0.waitfor_timer_Sec; + break; + #endif + + + default: + mem_cpy("ERR",tmp+start_offset,3); + break; + }//sw + } + + //response pc cmd + response_pc_cmd("cor",tmp,64); +} + +#endif + diff --git b/Base_core/core_src/function_e2prom.c a/Base_core/core_src/function_e2prom.c new file mode 100644 index 0000000..e532fb7 --- /dev/null +++ a/Base_core/core_src/function_e2prom.c @@ -0,0 +1,235 @@ + +#include "base_pc_protocol.h" +#include "platform_interface.h" +#include "function_interface.h" +#include "base_core.h" +#include "base_core_user.h" + + + +unsigned char base_write_e2prom( unsigned short addr, const unsigned char * ptr,unsigned char len) +{ + unsigned char tmp[0xff]; + + tmp[0] = STORE_FLAG; + mem_cpy(ptr,tmp+1,len); + platform.e2prom_write(addr,tmp,len+1); + + return 1; +} + +unsigned char base_read_e2prom( unsigned short addr, unsigned char * ptr,unsigned char len) +{ + unsigned char tmp[0xff]; + platform.e2prom_read(addr,tmp,len+1); + + if(tmp[0] == STORE_FLAG){ + mem_cpy(tmp+1,ptr,len); + return 1; + } + else + return 0; +} + + + +//------------------------------------------------------------------------ +const unsigned char OEM_CODE[] = {"@SUNVOTE"}; //榛樿鍘傚 + +unsigned short calc_custom_rf_sync_code(const unsigned char*input) +{ + unsigned char i; + unsigned char sum0,sum1; + + sum0=0; + sum1=0; + for(i=0;i<4;i++){ + sum0 +=input[0+i]; //寰堝彲鑳戒細婧㈠嚭,how to do + sum1 +=input[4+i]; //寰堝彲鑳戒細婧㈠嚭,how to do + } + sum0 ^=0xA5; + sum1 ^=0xA5; + + return( (sum1<<8) +sum0 ); +} +/* +璇诲彇鍩虹珯鍒濆鍖栧弬鏁帮紝E2prom +called by 涓婄數鍒濆鍖 +*/ +void base_read_e2prom_parameter(void) +{ + unsigned char tmp[0xff]; + + //----1 read base name and log mode + if(base_read_e2prom(STORE_BASE_NAME_ADDR,tmp,AUX_NAME_LEN) ){ + mem_cpy(tmp,&base_name_log_mode.head_addr+1,AUX_NAME_LEN); + mem_cpy(tmp,&base_name_setup.head_addr+1,AUX_NAME_LEN); + function.network__set_name(base_name_setup.base_name, 12); + //here,you can add assert log mode, + } + else{ + base_name_log_mode.log_mode=1; + mem_set(base_name_log_mode.base_name,12,0); + } + assert_base_log_mode(); + + if(base_read_e2prom(STORE_BASE_PWD_ADDR,tmp,AUX_PWD_LEN) ){ + mem_cpy(tmp,&base_pwd_setup.head_addr+1,AUX_PWD_LEN); + function.network__set_pwd(base_pwd_setup.base_pwd[0]*256+base_pwd_setup.base_pwd[1]); + //here,you can add assert log mode, + } + + //----2,read base config + if( base_read_e2prom(STORE_BASE_CONFIG_ADDR,tmp,BASE_CONFIG_LEN) ){ + mem_cpy(tmp,&base_config.head_addr+1,BASE_CONFIG_LEN); + } + else{ + unsigned short tmp16; + base_config.bs_id=1; + base_config.chan=1; + + _2BYTE_TO_16BIT(base_config.keymin,tmp16); + tmp16=1; + _16BIT_TO_2BYTE(tmp16,base_config.keymin); + + _2BYTE_TO_16BIT(base_config.keymax,tmp16); + tmp16=1; + _16BIT_TO_2BYTE(tmp16,base_config.keymax); + } + + assert_base_id();//assert base id + assert_base_channel(); //assert base channal, then set it to RF module; + //鐗瑰埆娉ㄦ剰锛屾澶勬病鏈夎缃鐐 锛侊紒锛侊紒锛佺瓑寰呭悗闈㈢殑澶氭ā鍧楀弬鏁帮紝鍥犱负鍐呮牳璁剧疆棰戠偣鏄敤妯″潡鍙傛暟multi鐨 + + + //3 ---- read base hard info + if( base_read_e2prom(STORE_BASE_HDINFO_ADDR,tmp,BASE_HDINFO_LEN) ){ + mem_cpy(tmp,&base_hdinfo.head_addr+1,BASE_HDINFO_LEN); + } + else{ + mem_set(base_hdinfo.SERIAL,6,0xff); + } + set_base_hard_firmware_info();//function.version_info(); //鍥哄畾鐨勭‖浠剁増鏈俊鎭 + + //4,----read base match code + if( base_read_e2prom(STORE_BASE_MAC_ADDR,tmp,BASE_MAC_LEN) ){ + mem_cpy(tmp,&base_mac.head_addr+1,BASE_MAC_LEN); + } + else{ + mem_set(&base_mac.head_addr+1,BASE_MAC_LEN,0xff);//test only + } + + //5, ----read basic beacon + if( base_read_e2prom(STORE_BASIC_BEACON_ADDR,tmp,6) ){ + mem_cpy(tmp,&basic_beacon.head_addr+1,6); + } + else{ + basic_beacon.auth_code[0]=0; + basic_beacon.auth_code[0]=0; + basic_beacon.login=0; + basic_beacon.report=0; + basic_beacon.offtime=10; + basic_beacon.attrib=8; + } + + //6,---- read vote beacon + if( base_read_e2prom(STORE_VOTE_BEACON_ADDR,tmp,VOTE_BEACON_LEN) ){ + mem_cpy(tmp,&vote_beacon.head_addr+1,VOTE_BEACON_LEN); + if( function.BROADCAST__SW&&(vote_beacon.sys_mode ==0x0E)&&(vote_beacon.vbuf[0]==0x14) ){ + if( function.broadcast__det_content_err() ==0) + kernel.multi_title_flag =1; + } + } + else{ + mem_set(&vote_beacon.head_addr+1,VOTE_BEACON_LEN,0x00); + } + + //7,---- OEM + if( base_read_e2prom(STORE_OEM_CODE_ADDR,tmp,8) ){ + #if 1 + kernel.custom_rf_sync_code =0; + if(tmp[0]!='@'){ + kernel.custom_rf_sync_code =calc_custom_rf_sync_code(tmp); + } + else{ + //platform.rf_update_sync_code( (sum2<<8)+sum1 ); //sunvote default; + } + #else + //榛樿鍙敮鎸丂sunvote + unsigned char len =sizeof(OEM_CODE)/sizeof(unsigned char); + if( mem_compare(tmp,OEM_CODE,len) ==0){ //!= OEM_CODE + mem_cpy(OEM_CODE,tmp,len); + base_write_e2prom(STORE_OEM_CODE_ADDR,tmp,len); + } + #endif + } + else{ + unsigned char len =sizeof(OEM_CODE)/sizeof(unsigned char); + mem_cpy(OEM_CODE,tmp,len); + base_write_e2prom(STORE_OEM_CODE_ADDR,tmp,len); + } + + + //8,--- read CRS2 mode basic beacon + if( base_read_e2prom(STORE_BASE_ATTRIB_ADDR,tmp,BASIC_BEACON_CRS2_LEN) ){ + mem_cpy(tmp,&basic_beacon_crs2.head_addr+1,BASIC_BEACON_CRS2_LEN); + } + else{ + mem_set(&basic_beacon_crs2.head_addr+1,BASIC_BEACON_CRS2_LEN,0x00); + } + + //9,--read ATT + if( base_read_e2prom(STORE_AUX_ATT_ADDR,tmp,AUX_ATT_LEN)){ + mem_cpy(tmp,&aux_att.head_addr+1,AUX_ATT_LEN); + } + else{ + aux_att.keypad_attn_sw=1; + aux_att.keypad_report_sw=0; + aux_att.base_beacon_sw=0; + } + + //10,--read multi channel + if( base_read_e2prom(STORE_MULTI_CHAN_ADDR,tmp,MULTI_FREQ_LEN) ){ + mem_cpy(tmp,&multi_freq_setup.head_addr+1,MULTI_FREQ_LEN); + if(function.lock_rf_count) + multi_freq_setup.chan_count=function.lock_rf_count; + if( (multi_freq_setup.chan_count==0) ||(multi_freq_setup.chan_count>4) )//妯″潡鏁颁笉鑳戒负闆,鑷冲皯涔熸湁涓涓 + multi_freq_setup.chan_count=1; + if( multi_freq_setup.chan_freq[0] !=base_config.chan){//20200416 瑙e喅LOCK_CHAN !=0鏃讹紝鏃犳硶鍏宠仈鍒板棰戠偣鐨勯棶棰 + single_relevant_to_multi_chan(base_config.chan); + } + } + else{ + //鏃犳晥澶氶鐐逛俊鎭紝闇瑕佽缃垵濮嬪弬鏁; + if(function.lock_rf_count) + multi_freq_setup.chan_count=function.lock_rf_count; + else + multi_freq_setup.chan_count=1; + single_relevant_to_multi_chan(base_config.chan); + } + + //11 ,ext basic beacon //20200415涓嶄繚瀛樺熀纭鎵╁睍淇℃爣锛 +// if( base_read_e2prom(STORE_BASIC_EXT_BEACON_ADDR,tmp,BASIC_EXT_BEACON_LEN) ){ +// mem_cpy(tmp,&basic_ext_beacon.head_addr+1,BASIC_EXT_BEACON_LEN); +// } +// else{ +// //how to init ?? +// mem_set(&basic_ext_beacon.head_addr+1,BASIC_EXT_BEACON_LEN,0); +// } + + //12 keypad crc config + if( base_read_e2prom(STORE_KP_CRC_CONFIG,tmp,1) ){ + kernel.keypad_crc_flag = tmp[0]; + } + else{ + if( function.crc16_keypad__SW) + kernel.keypad_crc_flag =1; //榛樿鎵撳紑閿洏CRC鏍¢獙 + else + kernel.keypad_crc_flag =0; + } + + +} + + + diff --git b/Base_core/core_src/grp_list_5G8.c a/Base_core/core_src/grp_list_5G8.c new file mode 100644 index 0000000..573fe78 --- /dev/null +++ a/Base_core/core_src/grp_list_5G8.c @@ -0,0 +1,194 @@ + + +#include "base_core.h" +#include "base_core_user.h" +#include "platform_interface.h" +#include "base_pc_protocol.h" +#include "function_interface.h" + + + +//#ifdef RF_5G8 +#if defined(RF_5G8) || defined(_DBG_SN_KP) + +struct link_node_STR node_array[KEYPAD_COUNT_MAX+1];//[0]浣滀负鎸囬拡澶达紝涓嶄繚瀛樺疄闄呮暟鎹 + + + +//---------------------- Element -------------------------------- +static void element_init(ELEMENT *node_ele) +{ + mem_set(node_ele->id_sn,4,0); + node_ele->offline_count=0; + node_ele->re_send_slot=0xff; + + #ifdef _DBG_VOICE_KP + node_ele->re_send_timers=0x00; + #endif +} + +static void element_cpy(ELEMENT *ele,ELEMENT *node_ele) +{ + //mem_cpy(ele->id_sn,node_ele->id_sn,sizeof(ELEMENT)/sizeof(node_ele)); + mem_cpy(ele->id_sn,node_ele->id_sn,4); + node_ele->offline_count=ele->offline_count; + node_ele->re_send_slot=ele->re_send_slot; + + #ifdef _DBG_VOICE_KP + node_ele->re_send_timers=ele->re_send_timers; + #endif +} + + + +/*--------------------- Node------------------------ +寮杈焠ode锛屽疄闄呮槸鍦ㄦ暟缁勪腑鎼滅储绌洪棽node;*/ +static struct link_node_STR *mallco_node(void) +{ + /*涓轰簡姣忔鍦ㄦ暟缁勪腑蹇熸壘鍒扮┖闂瞡ode锛屽畾涔変竴涓爣鍑嗕綅锛 + 浜ゆ浛浠庢暟缁勫ご鍜屼负鎼滅储*/ + static unsigned char flag=1; + unsigned char i; + + flag^=1; + if( flag==0){ + for(i=1;i0;i--){ + if(node_array[i].status!=0) continue; + return &node_array[i];//break; //鎵惧埌浜嗭紝灏辫繑鍥 + }//for + } + + return NULL; +} + + + +//------------------------------------------------------- Queue ------------------------------------- +//鍒濆鍖栭槦鍒 +void link_queue_init(struct link_queue_STR *queue) +{ + unsigned char i; + //init node[], independent + for(i=0;ifront =&node_array[0]; + queue->rear =&node_array[0]; + queue->rear->next =NULL; +} + +/*鍏ラ槦鍒, 鍚庢潵鐨勬暟鎹斁鍦ㄩ槦鍒楃殑 灏鹃儴*/ +unsigned char link_queue_input(struct link_queue_STR *queue,ELEMENT *ele) +{ + struct link_node_STR *new_node=NULL; + + if( (new_node =mallco_node()) ==NULL ) return 0; + new_node->next =NULL; + new_node->status=1; + element_cpy(ele,&new_node->element); //淇濆瓨element鏁版嵁 + + queue->rear->next = new_node; + queue->rear =new_node; + + return 1; +} + + + + +/* +鍦ㄩ槦鍒椾腑鏌ユ壘鏄惁瀛樺湪鎸囧畾鐨凷N +return: 濡傛灉鏌ユ壘鎴愬姛 Node鐨勪綅缃 +鍚﹀垯 杩斿洖NULL*/ +struct link_node_STR *link_queue_find_special_sn(struct link_queue_STR *queue,const unsigned char *sn) +{ + struct link_node_STR *p =queue->front; + + while(p->next!= NULL){ + if( mem_compare(sn,p->next->element.id_sn,4) )//鎵惧埌浜 + return (p->next); + p =p->next; + }//while + + return NULL; +} + + + +/* +閬嶅巻鏁翠釜闃熷垪锛岃繑鍥炴暣涓槦鍒楀厓绱犱釜鏁!!!--鍗抽敭鐩樹釜鏁 */ +unsigned char get_link_queue_length(struct link_queue_STR *queue) +{ + unsigned char length=0; + struct link_node_STR *p =queue->front; + + while(p->next!=NULL){ + length++; + p =p->next; + }//while + + return length; +} + + + + + + +#if 0 +//------------------------------------------------------------------------------------------------ +/* +* +* +*/ +unsigned char traverse_link_queue(void (*traverse_operation)(unsigned char *),unsigned char *out,unsigned char offset) +{ + struct link_node_STR *p =keypad_info.front; + unsigned char i,ret_val=0; + + for(i=0;inext; + + while(p->next!= NULL){ + + //traverse_operation(); + + p =p->next; + }//while + + return ret_val; +} + + +///* +//1, 鑾峰彇鍚勪釜鍏冪礌鏁版嵁; +//2, 鑾峰彇闇瑕侀噸浼犵殑鍏冪礌鏁版嵁 +//3, 鏄惁闇瑕侀噸浼 +//4,鐩戞祴绂荤嚎鍦ㄧ嚎 +//5,鑾峰彇鍦ㄧ嚎涓暟 +//6,鑾峰彇鍦ㄧ嚎SN琛ㄥ崟 +//*/ +//static unsigned char op_check_re_send(struct link_node_STR *p) +//{ +// //if( p->next->element.re_send_slot !=0) +// +// +//} +#endif + + +#endif + + + + diff --git b/Base_core/core_src/multi_channel.c a/Base_core/core_src/multi_channel.c new file mode 100644 index 0000000..e6ff19a --- /dev/null +++ a/Base_core/core_src/multi_channel.c @@ -0,0 +1,433 @@ +/* +------------------------------------------------------------------- + 鍩虹珯棰戠偣璇存槑 | SDK | E2prom +-------------------------------------------------------------------- +a, 鍗曢鐐 base_config.chan | YES | YES +-------------------------------------------------------------------- +b, 澶氶鐐 multi_freq_setup.chan_freq and chan_count| YES | YES +-------------------------------------------------------------------- +c, 澶氶鐐 multi.modual_chan and count | NO | NO +-------------------------------------------------------------------- + +鍚勪釜棰戠偣鐨勫鐞: +1, 涓婄數鍚庨鍏堜粠E2prom涓鍙栧崟棰戠偣淇℃伅 base_config.chan +2锛岀劧鍚庝粠E2prom涓鍙栧棰戠偣淇℃伅 multi_freq_setup +3, 鍦ㄦ棤绾挎ā鍧楀垵濮嬫椂锛屽鍒秏ulti_freq_setup 鍒 multi 鐒跺悗璁剧疆棰戠偣鍒版棤绾挎ā鍧 setup_multi_info +3锛宻dk璁剧疆鍗曢鐐瑰悗 process_setup_single_chan +4锛宻dk璁剧疆澶氶鐐瑰悗 process_setup_multi_chan +*/ + +#include "base_pc_protocol.h" +#include "platform_interface.h" +#include "function_interface.h" +#include "base_core.h" +#include "base_core_user.h" + +struct multi_modual_STR multi; + +/* +2019.12.04 瀹炴祴1ms; +鐜锛氫富棰168MHz,鍏抽棴涓柇,IO鍙栧弽鐢ㄧず娉㈠櫒娴嬭瘯!! */ +static void e2prom_write_delay_ms( unsigned short time ) +{ + unsigned short i = 0; + while( time-- ){ + i = 33400; + while( i-- ); + } +} + + +//-------------------------- multi 鐩稿叧鍑芥暟 ----------------------------------- +/*鑾峰彇涓婚鐐 鍐呴儴璁板綍鏁扮粍涓嬫爣锛屼綔涓簃ulti.modual_id鐨勪笅鏍 琛ㄧず涓绘ā鍧楃殑纭欢鏍囧彿 +鍥哄畾鍦╗0]鐨勪綅缃*/ +unsigned char get_mainRF_usr_id(void) +{ + return 0; +// return multi.main_index; +} + +/* +鑾峰彇 涓婚鐐瑰搴旂殑纭欢缂栧彿锛侊紒锛侊紒, */ +unsigned char get_main_rf_hard_id(void) +{ + return multi.modual_id[0]; + //return multi.modual_id[multi.main_index]; +} + + +/*鑾峰彇涓婚鐐*/ +unsigned char get_base_main_rfchannel(void) +{ + return multi.modual_chan[0]; + //return multi.modual_chan[multi.main_index]; +} + + +/*鑾峰彇鐧藉悕鍗曟ā鍧楃紪鍙*/ +unsigned char get_whitelist_rfid(void) +{ + return multi.modual_id[multi.whitelist_index]; +} + + + +/* +灏嗗崗璁腑鐨勫棰戠偣澶嶅埗鍒板唴鏍镐腑鐨勫棰戠偣鍙傛暟涓,鐒跺悗璁剧疆鍒版棤绾挎ā鍧椾腑 +涓轰究浜庡唴鏍稿澶氶鐐圭殑绠$悊锛屾病鏈夌洿鎺ヤ娇鐢ㄥ崗璁腑瀹氫箟鐨 multi_freq_setup +鑰屾槸浣跨敤鑷畾涔夌殑multi !!!*/ +static void setup_multi_info(void) +{ + unsigned char i; + +// if(function.match_keypad_type ==KP_E11_V010){ +// multi.count =multi_freq_setup.chan_count; +// mem_cpy(multi_freq_setup.chan_freq,multi.modual_chan,4); //copy channel +// } +// else { + multi.count =multi_freq_setup.chan_count; + mem_set(multi.modual_chan,4,0); + //} + + mem_cpy(multi_freq_setup.chan_freq,multi.modual_chan,multi.count); //copy channel + + + /* 鐗瑰埆璁剧疆鐧藉悕鍗曟ā鍧楃殑棰戠偣 涓0*/ + if(multi.whitelist_index function.rf_channel_max) + return 1; + else + return tmp; +} + +/* +閫氳繃鍗曢鐐瑰叧鑱斿棰戠偣,涓嶅叧鑱旀湁鏁堥鐐逛釜鏁*/ +void single_relevant_to_multi_chan(unsigned char single_chan) +{ + multi_freq_setup.chan_freq[0] = single_chan; + multi_freq_setup.chan_freq[1] =calc_next_multi_chan(multi_freq_setup.chan_freq[0]); + multi_freq_setup.chan_freq[2] =calc_next_multi_chan(multi_freq_setup.chan_freq[1]); + multi_freq_setup.chan_freq[3] =calc_next_multi_chan(multi_freq_setup.chan_freq[2]); +} + + + +/* +璁剧疆澶氶鐐规椂鐨勫鐞嗭細 called by pc璁剧疆鍗曟ā鍧楁搷浣滄椂 + a 鍚屾鍒板棰戠偣 + b 澶嶅埗鍒板唴鏍竚ulti鍙橀噺 + c E2prom淇濆瓨涓や釜棰戠偣*/ +void process_setup_single_chan(unsigned char single_rf) +{ + single_relevant_to_multi_chan(single_rf); + setup_multi_info(); + //鏇存柊鍚庝繚瀛樹富棰戠偣锛岃冭檻鍒版帴鐫浼氫繚瀛樺崟妯″潡棰戠偣锛屾墍浠ュ仛寤舵椂 + base_write_e2prom(STORE_MULTI_CHAN_ADDR,&multi_freq_setup.head_addr+1,MULTI_FREQ_LEN); + e2prom_write_delay_ms(10); + base_config.chan = single_rf; //add by Gavin20200807 棰戠偣鍐茬獊锛屾壘鍒版柊棰戠偣鍚庢棤娉曞悓姝ユ洿鏂 + base_write_e2prom(STORE_BASE_CONFIG_ADDR,&base_config.head_addr+1,BASE_CONFIG_LEN); +} + +/* +璁剧疆澶氶鐐规椂鐨勫鐞嗭細 called by multi setup + a 鍚屾鍒板崟棰戠偣 + b 澶嶅埗鍒板唴鏍竚ulti鍙橀噺 + c E2prom淇濆瓨涓や釜棰戠偣*/ +void process_setup_multi_chan(unsigned char multi_freq) +{ + base_config.chan = multi_freq; + setup_multi_info(); + //鏇存柊鍚庝繚瀛樹富棰戠偣锛岃冭檻鍒版帴鐫浼氫繚瀛樺崟妯″潡棰戠偣锛屾墍浠ュ仛寤舵椂 + base_write_e2prom(STORE_MULTI_CHAN_ADDR,&multi_freq_setup.head_addr+1,MULTI_FREQ_LEN); + e2prom_write_delay_ms(10); + base_write_e2prom(STORE_BASE_CONFIG_ADDR,&base_config.head_addr+1,BASE_CONFIG_LEN); +} + + + + +/* +鏍规嵁鐢ㄦ埛閰嶇疆锛岃绠楁棤绾挎ā鍧椾釜鏁 +灏嗙‖浠剁殑鎺掑簭杞崲鎴愯嚜宸辩殑椤哄簭 +called by base core init */ +void multi_chan_init(void) +{ + unsigned char i,id=1;// + multi.hard_rf_modual_cnt =0; + + /*1锛屾竻绌哄唴鏍稿棰戠偣璁板綍鏁扮粍锛 + 鐒跺悗璁$畻funcion 璁剧疆鐨勬棤绾挎ā鍧椾釜鏁皉f_count -蹇呴』涓庣‖浠跺疄闄呯剨鎺ユā鍧椾釜鏁颁竴鏍凤紝鍚﹀垯鍙兘浼氬奖鍝嶆甯告ā鍧楅氫俊*/ + for(i=0;i<4;i++){ + multi.modual_id[i] =0xff;//init is 0xff + if((function.rf_id[i]==0xff)||(function.rf_id[i]==0xfe)||(function.rf_id[i]==0xfb) ) + multi.hard_rf_modual_cnt++; + }//for + + multi.whitelist_index =0xff; + //c, record the function of the rf modual + for(i=0;i<4;i++){//鐢ㄦ埛璁剧疆鐨勭‖浠剁紪鍙0-3鏀惧湪multi.modual_id[]涓 + switch(function.rf_id[i]){ + case 0xff://涓绘ā鍧楃紪鍙锋寚瀹氬啓鍦╗0]; + multi.modual_id[0] =i; + multi.main_index =0; //棰勭暀锛岀洰鍓嶏紝涓婚鐐瑰浐瀹氬湪0 + break; + case 0xfe://鍓ā鍧椾粠[1]寮濮媔d=1; + multi.modual_id[id++] =i; + break; + case 0xfb://鐧藉悕鍗曟ā鍧楀湪鏈鍚庝竴涓, + multi.whitelist_index =id; + multi.modual_id[id++] =i; + break; + + default: + //multi.modual_id[i] =0xff; + break; + }//sw + }//for + + for(i=0;imulti.hard_rf_modual_cnt) + multi_freq_setup.chan_count = multi.hard_rf_modual_cnt; + + //棰戠偣淇℃伅鍐欏叆鍒板悇涓棤绾挎ā鍧 + setup_multi_info(); + if(kernel.custom_rf_sync_code) + platform.rf_update_sync_code( kernel.custom_rf_sync_code,4,get_main_rf_hard_id()); +} + + + +/* +鏍规嵁鏉ヨ嚜涓柇鐨勬ā鍧楀簭鍙锋煡璇㈣嚜宸卞湪 modual_id[]涓殑index +return :鏌ヨ鍒颁簡灏辩洿鎺ヨ繑鍥炲簭鍙 +0xff -娌℃湁鍦ㄨ〃鏍间腑鏌ヨ鍒般 +called by rx keypad data */ +unsigned char conver_id(unsigned char hard_id) +{ + unsigned char i; + //娑夊強 鍓ā鍧椾篃鍙戜俊鏍囧拰棰戠偣棰戠偣杞浆; + for(i=0;iRF_FAIL_CNT){ + err[1+cnt] =i+1; //start from 1 + cnt +=1; + } + }//for + err[0] = cnt; +} + +static void rf_error_ack_pc(void) +{ + unsigned char tmp[64]; //whitelist 闇瑕佺殑buf闀夸簺 + mem_set(tmp,sizeof(tmp)/sizeof(tmp[0]),0); + tmp[0]= 31; + tmp[1]= 0xE1; + tmp[2]= base_core.get_id();// + tmp[3]= 10;//type; + tmp[4]= 6; // + get_error_info(tmp+5); + //memcpy( tmp+4,ack_buf,type_data_len); + //send to pc + base_core.send_data_to_pc(tmp); +} + +//called by 20ms +void rf_error_warning(void) +{ + if(rf_error.state != 1) return; + + if(++rf_error.timer_cnt < 1500){ //20ms + if(rf_error.timer_cnt%100 ==0){ + platform.buzzer_ctrl(1); + rf_error_ack_pc(); //send error info to sdk + } + } + else{ + rf_error.state =2; + rf_error.timer_cnt=0; + } +} + + +/*----------------------- 鐩戞祴澶勭悊 -------------------------------- +* called by tx beacon +*/ +void rf_modual__tx_counter(unsigned char id) +{ + rf_modual[id].tx_cnt++; +} + +//called by rf IO intettupt +void rf_modual__tx_interrupt_counter(unsigned char id) +{ + rf_modual[id].tx_interrupt_cnt++; +} + +// +void rf_modual__check(void) +{ +#ifdef RF_MODUAL_MONITOR + unsigned char i,id; + if(rf_error.state !=0) return; + id = multi.modual_id[0]; //current channel!! + i=0; + if(rf_modual[id].tx_cnt > rf_modual[id].tx_interrupt_cnt){ + if(rf_modual[id].tx_cnt - rf_modual[id].tx_interrupt_cnt > THRESHOLD_RF_CNT){ + if( ++rf_modual[id].failure % 3 ==0){ + if(rf_modual[id].failure >= RF_FAIL_CNT){ + rf_error.state =1; //20210415 set warning flag + rf_error.timer_cnt =0; + } + rf_modual[id].error_cnt++; //debug only!! + //re-init the failure rf modual + platform.rf_init(multi.modual_id[i]); + platform.rf_set_freq(multi.modual_chan[i],multi.modual_id[i]); + } + } + else{ + rf_modual[id].failure =0; + } + } + else{ + rf_modual[id].failure =0; + } + //clear this period paramter, ready for next period + rf_modual[id].tx_cnt=0; + rf_modual[id].tx_interrupt_cnt=0; + +#endif +} + +#ifdef RF_MODUAL_MONITOR +unsigned char get_rf_error_cnt(unsigned char *buf) +{ + unsigned char i,id,cnt=0; + for(i=0;i>8; + buf[2+cnt] = rf_modual[id].error_cnt; + cnt +=3; + }//for + + return cnt; +} +#endif + + +//---------------------------------------------- +/* +* 5.8G妯″潡鐩戞祴锛屽崟妯″潡鍜屽妯″潡閮介傜敤 +*/ +#ifdef RF_MODUAL_5G8_MONITOR + +static unsigned char rf_modual_5G8_invalid_flag; +void rf_modual_5G8_invalid_set(void) +{ + rf_modual_5G8_invalid_flag=1; +} + + +void rf_modual_5G8__check(void) +{ + if(rf_modual_5G8_invalid_flag==0) return; + rf_modual_5G8_invalid_flag =0; + platform.rf_init(multi.modual_id[0]); + platform.rf_set_freq(multi.modual_chan[0],multi.modual_id[0]); +} + +#endif + + + + diff --git b/Base_core/core_src/transfer_keypad_pc.c a/Base_core/core_src/transfer_keypad_pc.c new file mode 100644 index 0000000..59fa9fd --- /dev/null +++ a/Base_core/core_src/transfer_keypad_pc.c @@ -0,0 +1,134 @@ + +/* +姝ゆ枃妗g敤鏉ュ鐞唒c杞彂缁欓敭鐩樼殑鏁版嵁鍜 + 閿洏杞彂缁檖c鐨勬暟鎹 +*/ +#include "base_pc_protocol.h" +#include "platform_interface.h" +#include "function_interface.h" +#include "base_core.h" +#include "base_core_user.h" + + +//--------------------keypad transfer to pc dircet ------------------------------------------ +/* +寮杈熶竴涓敤浜庨敭鐩樿浆鍙戠粰鍩虹珯鐨勭紦鍐插尯锛侊紒*/ +#define TRANS2PC_NODE_SIZE 10//5 //鑺傜偣涓暟锛屽嵆缂撳啿鍖洪暱搴 +#define TRANS2PC_DATA_SIZE 64 //鏁版嵁鐨勬渶澶ч暱搴 +struct fifo_queue_STR trans2pc_queue; +unsigned char trans2pc_buf[TRANS2PC_NODE_SIZE][TRANS2PC_DATA_SIZE]; + +void transfer2pc_init_queue(void) +{ + queue_init(&trans2pc_queue,(unsigned char **)trans2pc_buf,TRANS2PC_NODE_SIZE,TRANS2PC_DATA_SIZE); +} + +/* +鍩虹珯淇濆瓨 keypad鐩存帴缁 pc 鐨勬暟鎹 +called by 鍩虹珯澶勭悊鎺ユ敹閿洏rf鏁版嵁鐨勫嚱鏁 */ +//unsigned char keypad_transfer2pc_data_save(const unsigned char *trans2kp) +//{ +// return queue_in(&trans2pc_queue,trans2kp,TRANS2PC_NODE_SIZE,TRANS2PC_DATA_SIZE); +//} +void keypad_transfer2pc_data_save(const unsigned char *trans2kp) +{ + queue_in(&trans2pc_queue,trans2kp,TRANS2PC_NODE_SIZE,TRANS2PC_DATA_SIZE); +} +/* +鍩虹珯杞彂 keypad鐩存帴缁 pc鐨勬暟鎹 +濡傛杞彂鏄惁浼氬拰姝e父鏁版嵁鍐茬獊 锛燂紵锛 濡備綍閬垮厤 +called by main loop , */ +unsigned char keypad_transfer2pc_data_fetch(void) +{ + unsigned char transfer2pc_buf[64+4]; + //coye data +// if( !queue_out(&trans2pc_queue,transfer2pc_buf,TRANS2PC_NODE_SIZE,TRANS2PC_DATA_SIZE)) return 0; + unsigned char ret_val; + platform.disable_interrupt(); + ret_val =queue_out(&trans2pc_queue,transfer2pc_buf,TRANS2PC_NODE_SIZE,TRANS2PC_DATA_SIZE); + platform.enable_interrupt(); + if( !ret_val) return 0; + + transfer2pc_buf[0] +=2; //len,涓轰粈涔堜笉鏄洿鎺ヨ浆鍙戦敭鐩樼殑鍘熷鏁版嵁锛 + + base_tx_to_pc_sub(transfer2pc_buf); +//operation_debug_io(5);//test only + return 1; +} + + + + +//--------------------pc transfer to keypad dircet ------------------------------------------ +#define TRANS2KP_NODE_SIZE 10//5 //鑺傜偣涓暟锛屽嵆缂撳啿鍖洪暱搴 +#define TRANS2KP_DATA_SIZE 64 //鏁版嵁鐨勬渶澶ч暱搴 +struct fifo_queue_STR trans2kp_queue; +unsigned char trans2kp_buf[TRANS2KP_NODE_SIZE][TRANS2KP_DATA_SIZE]; +/* +*/ +void transfer2kp_init_queue(void) +{ + queue_init(&trans2kp_queue,(unsigned char**)trans2kp_buf,TRANS2KP_NODE_SIZE,TRANS2KP_DATA_SIZE); +} + +/* +鍩虹珯淇濆瓨pc鐩存帴杞彂缁欓敭鐩樼殑鏁版嵁 +called by 鍩虹珯澶勭悊pc鏁版嵁鐨勫嚱鏁 */ +unsigned char pc_transfer2keypad_data_save(unsigned char *trans2keypad) +{ +// return queue_in(&trans2kp_queue,trans2keypad,TRANS2KP_NODE_SIZE,TRANS2KP_DATA_SIZE); + unsigned char ret_val; + platform.disable_interrupt(); + ret_val =queue_in(&trans2kp_queue,trans2keypad,TRANS2KP_NODE_SIZE,TRANS2KP_DATA_SIZE); + platform.enable_interrupt(); + return ret_val; +} + + +/* +鍩虹珯鍙戦 pc鐩存帴缁 keypad 鐨勬暟鎹 +called by 淇℃爣鍙戦佸嚱鏁 base_tx_keypad_beacon() +return : + 0- 娌℃湁瑕佽浆鍙戠殑鏁版嵁鎴栬 杩炵画杞彂鏃堕棿鍒 + 1- 杩樻湁鏁版嵁鎴栬呰浆鍙戠瓑寰咃紝 */ +unsigned char pc_transfer2keypad_data_fetch(void) +{ + unsigned char trans2kp_buf[64+5],j; + //coye data + if( !queue_out(&trans2kp_queue,trans2kp_buf+4,TRANS2KP_NODE_SIZE,TRANS2KP_DATA_SIZE)) return 0; + + //鏉ヨ嚜pc鐨勮浆鍙戞暟鎹槸娌℃湁閰嶅鐮佺殑锛屽姞涓婁箣鍚庡啀鍙戠粰閿洏 + trans2kp_buf[0] =trans2kp_buf[4]+4; + get_base_match_code(trans2kp_buf+1); + + #ifndef RF_5G8 + + if( get_ext_basicbeacon_startup_flag() ){//瀹归噺鍧囪 妯″紡涓嬶紝姣忎釜妯″潡閮藉拰涓绘ā鍧椾竴鏍峰彂閫佷俊鏍 + for(j=0;j>8; + trans2kp_buf[32]=crc_tmp&0xff; + trans2kp_buf[0]=32; + } + base_tx_to_keypad_sub(trans2kp_buf,get_mainRF_usr_id()); + } + #else + platform.rf_5G8_load_send_data(trans2kp_buf+1,64,multi.modual_id[get_mainRF_usr_id()]); + platform.rf_5G8_load_send_data(trans2kp_buf+1,64,multi.modual_id[get_mainRF_usr_id()]); + + spec_trans__record_sn(trans2kp_buf); + #endif + + return 1; +} + + + diff --git b/Base_core/core_src/vote__process.c a/Base_core/core_src/vote__process.c new file mode 100644 index 0000000..1083bb7 --- /dev/null +++ a/Base_core/core_src/vote__process.c @@ -0,0 +1,361 @@ + +#include "base_core.h" +#include "base_core_user.h" +#include "platform_interface.h" + + +//瀹氫箟鐢ㄤ簬璁板綍鎶曠エ鏁版嵁鐨勭紦鍐插尯 +#ifdef RF_5G8 + #define VOTE_NODE_SIZE 1024//512 //鑺傜偣涓暟锛屽嵆缂撳啿鍖洪暱搴 + #define VOTE_DATA_SIZE 64 //鏁版嵁鐨勬渶澶ч暱搴︼紝鏉ヨ嚜鏃犵嚎閿洏鐨勬暟鎹紝5,8G MAX=64bytes + + #define _1PKT_NKEYPAD 15 //涓涓暟鎹寘閲屾湁澶氬皯涓敭鐩樻暟閲; + #define _1KAYPAD_BYTES 60 //1涓敭鐩樼殑鏁版嵁闀垮害鏄60瀛楄妭; + +#else + #define VOTE_NODE_SIZE 200 //鑺傜偣涓暟锛屽嵆缂撳啿鍖洪暱搴 + #define VOTE_DATA_SIZE 32 //鏁版嵁鐨勬渶澶ч暱搴,鏉ヨ嚜鏃犵嚎閿洏鐨勬暟鎹紝 +#endif + +//static + struct fifo_queue_STR vote_queue; +static unsigned char vote_buf[VOTE_NODE_SIZE][VOTE_DATA_SIZE]; + + +/* +鍒濆鍖栫紦鍐插尯锛岄槦鍒椾笌鏁扮粍寤虹珛鍏宠仈 */ +void vote_init_queue(void) +{ + queue_init(&vote_queue,(unsigned char**)vote_buf,VOTE_NODE_SIZE,VOTE_DATA_SIZE); +} + +/* +淇濇寔鏁版嵁鍒伴槦鍒椾腑; +called by 鍩虹珯鎺ユ敹澶勭悊閿洏鏁版嵁鍑芥暟 +*/ +unsigned char vote_data_store(unsigned char *vote_data) +{ + return queue_in(&vote_queue,vote_data,VOTE_NODE_SIZE,VOTE_DATA_SIZE); +} + + + +/* +瀹氫箟涓涓笓闂ㄤ笂鎶ョ粰pc鐨勭紦鍐插尯锛屼紭鐐癸細淇濇寔鍘熸湁闃熷垪锛侊紒 */ +static unsigned char packet_count=0; +struct packet_STR{ +#ifdef RF_5G8 + unsigned char count; //packet涓寘鍚殑閿洏涓暟;<=_1PKT_NKEYPAD; + unsigned char data[60*_1PKT_NKEYPAD];//usb PHY max length =1024bytes +#else + unsigned char data[64]; //full usb max length=64max + unsigned char valid_len; +#endif + unsigned char status; //0-init,reported ;1-reporting and wait ack;2- re-report; + unsigned char rpt_len; +}; + +struct packet_STR packet[11]={ //浠1寮濮嬶紝10涓暟鎹 + {.status =0,}, //.valid_len =0,?? + {.status =0,}, + {.status =0,}, + {.status =0,}, + {.status =0,}, + {.status =0,}, + {.status =0,}, + {.status =0,}, + {.status =0,}, + {.status =0,}, + {.status =0,}, +}; + + + +#ifdef RF_5G8 +/* +鍔犺浇鍙戦佹暟鎹紝閫氳繃usb 鍙戦佸嚭鍘!!! */ +unsigned char vote_data_packing( unsigned char pkt_seq) +{ + //涓撻棬鐢ㄤ簬usb鏁版嵁涓婃姤鐨勯暱buf 1024; + unsigned char rpt_buf[USB_REPORT_MAX]; + unsigned short i; + unsigned short total_len; + +// for(i=0;i= pkt_seq) &&(packet[pkt_seq].status ==2)) { + for(i=0;i>8; + rpt_buf[4]=total_len; + + platform.base_send_data_to_pc(rpt_buf,USB_REPORT_MAX); + return 1; + } + + //b, + if( queue_out(&vote_queue,rpt_buf+12,VOTE_NODE_SIZE,VOTE_DATA_SIZE) ==0 ){ + rpt_buf[8]=0xff;//pkt seq + rpt_buf[9]=0; //type + rpt_buf[10]=0; //count + rpt_buf[11]=0; + platform.base_send_data_to_pc(rpt_buf,USB_REPORT_MAX); + return 0; + } + else{ + //淇濆瓨packet鐨勭涓涓敭鐩樻暟鎹 + mem_cpy(rpt_buf+12,packet[pkt_seq].data,60); + packet[pkt_seq].count=1; + + #ifdef _DBG_VOICE_KP + #ifdef KEYPAD60 + if(rpt_buf[17]!=0) + #else + if(rpt_buf[19]!=0) + #endif + _debug_voice_kp__tx_pc(rpt_buf+13); + #endif + + for(i=1;i<_1PKT_NKEYPAD;i++){ + //if( queue_out(&vote_queue,rpt_buf+12+60*i,VOTE_NODE_SIZE,VOTE_DATA_SIZE)==0)break; + if( queue_out(&vote_queue,rpt_buf+12+MULTIx60(i),VOTE_NODE_SIZE,VOTE_DATA_SIZE)==0)break; + + #ifdef _DBG_VOICE_KP + #ifdef KEYPAD60 + if(rpt_buf[17+MULTIx60(i)]!=0) + #else + if(rpt_buf[19+MULTIx60(i)]!=0) + #endif + _debug_voice_kp__tx_pc(rpt_buf+13+MULTIx60(i)); + #endif + + mem_cpy(rpt_buf+12+MULTIx60(i),packet[pkt_seq].data+MULTIx60(i),60); + packet[pkt_seq].count++; + }//for + + packet[pkt_seq].status =1; + packet_count =pkt_seq; + rpt_buf[10]=packet[pkt_seq].count; + total_len = MULTIx60(packet[pkt_seq].count) +7;//60*packet[pkt_seq].count +7; + rpt_buf[3]=total_len>>8; + rpt_buf[4]=total_len; + + #ifdef _DBG_PHYUSB_RPT_ERROR + rpt_buf[1016]= 0xff; + rpt_buf[1017]= kernel.re_rpt_pc_count; + rpt_buf[1018]= kernel.re_rpt_pc_count>>8; + rpt_buf[1019]= packet_count;//test only + + rpt_buf[1020]= kernel.keypad_online_cnt; //debug + rpt_buf[1021]= 0xff; + rpt_buf[1022]= kernel.rx_buf_overflow; //test only + rpt_buf[1023]= kernel.rx_buf_overflow>>8; + #endif + + + platform.base_send_data_to_pc(rpt_buf,USB_REPORT_MAX); + return 1; + } +} +#else +unsigned char pkt_cnt=0; //#ifdef _RPT_PKT_CNT_ ;绗60瀛楄妭鎶ュ憡鏈夋晥鏁版嵁鍖呯疮璁℃暟 +/* +浠庨槦鍒椾腑鍙栧嚭鎶曠エ鏁版嵁锛屽埌涓婃姤缂撳啿鍖簆acket; +*/ +unsigned char vote_data_packing( unsigned char pkt_seq) +{ + unsigned char tmp[64]; + unsigned char type,type_len,_1pkt_keypad_cnt,rpt_type; + unsigned char j;//i; + + mem_set(tmp,sizeof(tmp)/sizeof(tmp[0]),0); + tmp[0]=31; + tmp[1]=0xE0; + tmp[2]= get_base_id(); + tmp[3]=5; + tmp[4]=pkt_seq; + + //a,鎶ュ憡涔嬪墠娌℃湁琚‘璁ょ殑鏁版嵁鍖(宸茬粡鎵撳寘濂界殑) + if( (packet_count >= pkt_seq) &&(packet[pkt_seq].status ==2)) { + mem_cpy(packet[pkt_seq].data,tmp+5,packet[pkt_seq].valid_len); + #if defined(_DBG_2G4_KP_)//new + _debug_core__record_txpc_info_report(tmp); + #endif + #ifdef _RPT_PKT_CNT_ + pkt_cnt++; + tmp[60] = pkt_cnt; + #endif + tmp[0] = packet[pkt_seq].rpt_len; + base_tx_to_pc_sub(tmp); + return 1; + } + + //b,浠庨槦鍒楀ご鍙栧嚭type绫诲瀷骞跺垽鏂槸鍚︿负绌 +// platform.disable_interrupt(); + type =queue_out_get_type(&vote_queue,VOTE_DATA_SIZE); +// platform.enable_interrupt(); + if( type==0){ + //if( (type =queue_out_get_type(&vote_queue,VOTE_DATA_SIZE) ) ==0){ + //闃熷垪涓虹┖鐨勫鐞, + tmp[4]=0xff;//pkt seq + tmp[5]=0; //type + tmp[6]=0; //id + tmp[7]=0; + base_tx_to_pc_sub(tmp); + return 0; + } + + //c 闃熷垪涓嶄负绌猴紝鐢眛ype寰楀嚭鐩稿叧鐨勬墦鍖呭弬鏁 + rpt_type =type; + tmp[0] =get_packing_parameter(&rpt_type,&_1pkt_keypad_cnt,&type_len); + + //d,鍒濆鍖栨墦鍖呯浉鍏冲弬鏁帮細reset packet buf,set data TYPE,init packet len, init status..... + mem_set(packet[pkt_seq].data,64,0); + packet[pkt_seq].data[0] =rpt_type;//type + packet[pkt_seq].valid_len =1; //len =1 is type; + packet[pkt_seq].status =1; + packet_count =pkt_seq; + + //e,read vote buf then packing them! + for(j=0;j<_1pkt_keypad_cnt;){ //for(i=0;i<_1pkt_keypad_cnt;i++){ + unsigned char store_buf[VOTE_DATA_SIZE]; + unsigned char out_rslt; + j++; + //read keypad data from VOTE buf, Notice:first bytes is data type; +// platform.disable_interrupt(); + out_rslt =queue_out_special(&vote_queue,store_buf,VOTE_NODE_SIZE,VOTE_DATA_SIZE,type); +// platform.enable_interrupt(); + if( out_rslt ==1){ + //if( queue_out_special(&vote_queue,store_buf,VOTE_NODE_SIZE,VOTE_DATA_SIZE,type) ==1){ + #if defined(_DBG_2G4_KP_)//new + _debug_core__record_txpc_info(pkt_seq,store_buf); + #endif + if( rpt_type == 0x0D){/*鐗规畩澶勭悊娴嬮獙棰樻姤鍛婄姸鎬侊紝rpt_type鍚庨潰1瀛楄妭寮哄埗鍐1;鎶ュ憡闀垮害鍔1*/ + packet[pkt_seq].data[packet[pkt_seq].valid_len] = 1; //fix =1 specially!!! + packet[pkt_seq].valid_len++; //length+1 specially!!! + } + mem_cpy(store_buf+1,packet[pkt_seq].data + packet[pkt_seq].valid_len,type_len); + packet[pkt_seq].valid_len +=type_len; + } + if( (out_rslt==0) ||(j>=_1pkt_keypad_cnt) ){ //else { + //=0 or =2 鏁版嵁涓虹┖ 鎴栬卼ype涓嶄竴鑷; + packet[pkt_seq].data[packet[pkt_seq].valid_len] =0xff; + packet[pkt_seq].data[packet[pkt_seq].valid_len+1] =0xff; + packet[pkt_seq].valid_len +=2; + break; + } + + }//for + + //f, load data to report buf,then send them. + mem_cpy(packet[pkt_seq].data,tmp+5,packet[pkt_seq].valid_len); + packet[pkt_seq].rpt_len =tmp[0]; + #if defined(_DBG_2G4_KP_)//new + _debug_core__record_txpc_info_report(tmp); + #endif + #ifdef _RPT_PKT_CNT_ + pkt_cnt++; + tmp[60] = pkt_cnt; + #endif + base_tx_to_pc_sub(tmp); + return 1; +} +#endif + +//unsigned short sdk_ack_err_cnt=0; +/* +鏀跺埌鏉ヨ嚜sdk鐨勭‘璁や俊鏍囧悗锛屾竻闄よ纭鐨勶紝 澶嶄綅娌℃湁琚‘璁ょ殑锛屽噯澶囦笅涓懆鏈熼噸鍙 */ +void vote_status_clear_confirmed(const unsigned char *rx_ack) +{ + unsigned char i,j,confirmed[10]; + unsigned char confirmed_cnt=0; + + //1 寰楀埌鏈夋晥纭鏁版嵁鍖呬釜鏁 confirm_cnt + for(i=0;i<10;i++){ + if( (rx_ack[i]==0)||(rx_ack[i]>10) ) break; + confirmed[i] =rx_ack[i]; + confirmed_cnt++; + }//for + if(confirmed_cnt==0) return; + +//if( (confirmed_cnt==1)&&(confirmed[0] ==0x0A)){ +// sdk_ack_err_cnt++; +// return; +//} + + platform.disable_interrupt(); + //2,璁剧疆琚‘璁ょ殑packet[] + for(i=0;i= packet_count)//all packet confirmed!! + packet_count =0; + else{ + unsigned char remain_offset=1; + //3锛屾鏌ユ病鏈夎纭鐨刾acket骞朵笖鎸夐『搴忔帓鍒楀埌packet锛屼粠[1]寮濮; + + for(i=1;i<=packet_count;i++){ + if( packet[i].status ==0) continue; + + kernel.re_rpt_pc_count++; //debug only + //a,copy data and other parameter + packet[remain_offset].status = 2; + if(i==remain_offset){//source and dist is equl in packet[],so noneed copy + remain_offset++; //2021.01.12 淇姝ゆ儏鍐典笅status娌℃湁缃2鐨刡ug; + continue; + } + + #ifdef RF_5G8 + packet[remain_offset].count = packet[i].count; + for(j=0;j= 128) +// count = 128; +// else +// count = code_len; + +// Platform.FLASH_Read(flash_addr, buf, count); +// crc_calc = Upgrade_CRC(crc_calc, buf, (uint16_t)count); +// flash_addr += count; +// code_len -= count; +// } +// Enable_Interrupt(); + +// return crc_calc; +// } + +//鑾峰彇鎬籆RC 鎬婚暱 +//void Upgrade_ParameterInit(void) +void Upgrade_ParameterInit(unsigned char *mac, unsigned short crc, unsigned int totoal_len) +{ + //uint8_t testbuf[1024]; + + // DownLoad.ATC[0] = KeyConect.ATC[0]; + // DownLoad.ATC[1] = KeyConect.ATC[1]; + // DownLoad.ATC[2] = KeyConect.ATC[2]; + // DownLoad.ATC[3] = KeyConect.ATC[3]; + memcpy(DownLoad.ATC, mac, 4); + + DownLoad.ALLCRC.u16 = crc; //DownCheckBinCrc(LOADSTART, LOADLEN); //杩欎釜鎹㈡垚SDK浼犺繃鏉ョ殑澶у皬涓嶤RC + + DownLoad.Len.u32 = totoal_len; //LOADLEN; + + DownLoad.DownBlockNum = totoal_len / 1024; //LOADLEN / 1024; //鏁伴噺 + + log_debug("\nC:%x", DownLoad.ALLCRC.u16); +} + +void Upgrade_GetNextPack(uint8_t *data) +{ + //Platform.FLASH_Read(LOADSTART + DownLoad.Pack.PackCount * 1024U, data, 1024); +} +//鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺 +//鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺 + +void Upgrade_SendBeacon(uint8_t mode, uint8_t Count) +{ + static uint8_t temp = 0; + uint8_t buf[33] = {0}; + uint16_t Crc = 0; + + buf[0] = DownLoad.ATC[0]; + buf[1] = DownLoad.ATC[1]; + buf[2] = DownLoad.ATC[2]; + buf[3] = DownLoad.ATC[3]; + buf[4] = 0x42; + buf[5] = 0x01; //绫诲瀷 + buf[6] = DownLoad.TranSportPos; //POS + buf[7] = mode; //鎿嶄綔 + + buf[8] = 0xff; + buf[9] = 0xff; + + buf[10] = 0x00; //SN + buf[11] = 0x00; + buf[12] = 0x00; + buf[13] = 0x00; + + buf[14] = DownLoad.Len.u8[0]; + buf[15] = DownLoad.Len.u8[1]; + buf[16] = DownLoad.Len.u8[2]; + buf[17] = DownLoad.Len.u8[3]; + + buf[18] = DownLoad.ALLCRC.u8[0]; //CRC + buf[19] = DownLoad.ALLCRC.u8[1]; + + buf[20] = DownLoad.ASK_POS; + + Crc = Upgrade_CRC(0, buf + 4, 27) & 0xFF; + buf[31] = Crc; + + while (Count) + { + Upgrade_TxPayload(buf, 32); + Upgrade_WaitRfSendOK(); + Upgrade_DelayUs(50); + Count--; + } +} + +void Upgrade_BeaconQuery(void) +{ + uint8_t sendbuf[64] = {0}; + U8_U16 crc; + + sendbuf[0] = DownLoad.ATC[0]; + sendbuf[1] = DownLoad.ATC[1]; + sendbuf[2] = DownLoad.ATC[2]; + sendbuf[3] = DownLoad.ATC[3]; + + sendbuf[4] = 0xfe; + sendbuf[5] = 0x48; + sendbuf[6] = 0xde; + sendbuf[7] = 0x7f; + + sendbuf[8] = 1; //鍚庣画鏁版嵁鐗囧尯 + sendbuf[9] = 0x02; //璇㈤棶CMD + + crc.u16 = Upgrade_CRC(0, DownLoad.SN_BUF, 48); //璁$畻CRC鏍¢獙 + + sendbuf[10] = crc.u8[0]; + sendbuf[11] = crc.u8[1]; + + sendbuf[12] = DownLoad.QueryPos; //璇㈤棶搴忓彿 + + memcpy(sendbuf + 16, DownLoad.SN_BUF, 48); + + memset(DownLoad.SN_BUF, 0, 48); + DownLoad.SN_Count = 0; + + Upgrade_TxPayload(sendbuf, 32); + Upgrade_WaitRfSendOK(); + Upgrade_DelayUs(20); + + Upgrade_TxPayload(sendbuf + 32, 32); + Upgrade_WaitRfSendOK(); +} +void Upgrade_SendPassThroughPack(uint8_t count) +{ + //鍙戝ご + uint8_t buf[33] = {0}; + + buf[0] = DownLoad.ATC[0]; + buf[1] = DownLoad.ATC[1]; + buf[2] = DownLoad.ATC[2]; + buf[3] = DownLoad.ATC[3]; + + DownLoad.MatchCode[0] = 0xfe; + DownLoad.MatchCode[1] = 0x48; + DownLoad.MatchCode[2] = 0xde; + DownLoad.MatchCode[3] = 0x7f; + + buf[4] = DownLoad.MatchCode[0]; + buf[5] = DownLoad.MatchCode[1]; + buf[6] = DownLoad.MatchCode[2]; + buf[7] = DownLoad.MatchCode[3]; + + buf[8] = 32; //鏁版嵁鐗囧尯 + buf[9] = 0x01; //CMD + + buf[10] = DownLoad.Pack.CRC.u8[0]; + buf[11] = DownLoad.Pack.CRC.u8[1]; + buf[12] = DownLoad.TranSportPos; //璇ユ浼犺緭搴忓彿 + buf[13] = count; //褰撳墠鍖呭簭鍙 + + Upgrade_TxPayload(buf, 32); + Upgrade_WaitRfSendOK(); + Upgrade_DelayUs(200); + + for (uint8_t i = 0; i < 32; i++) + { + Upgrade_TxPayload(DownLoad.Pack.Buf + (32 * i), 32); + Upgrade_WaitRfSendOK(); + Upgrade_DelayUs(20); + } + //鍙戞暟鎹 +} + +//uint8_t NextPack[1024] = {0}; +//鍑芥暟浣滅敤锛氭煡璇㈠熀绔橲erver鏄惁宸茬粡鑾峰彇鍒颁笂娆℃暟鎹 +//return: 0 琛ㄧず鎴愬姛鑾峰彇鍒拌鍖呮暟鎹 +// 1 琛ㄧず杩樺湪鑾峰彇涓 +// ...绛夌瓑鍏朵粬澶辫触鍘熷洜 +//data 鎴愬姛鑾峰彇鍒扮殑鏃跺 灏1K鏁版嵁鍐欏叆鏀瑰湴鍧 +// 澶辫触涓嶈鍐欏叆鏀瑰湴鍧浠讳綍鏁版嵁 +uint8_t Upgrade_CheckNextPackArrive(uint8_t *data) +{ + if (update.data_ok_flag) + { + memcpy(data, update.data_, 1024); + return 0; + } + else + return 1; +} + +//鍑芥暟浣滅敤锛氶氱煡鍩虹珯Server鍙互鍘昏幏鍙栦笅涓鍖呭彂閫佹暟鎹 +//step 闃舵鍙凤細0闃舵 鍩虹珯鎵維DK鐩存帴瑕佹暟鎹 SDK鎸夐『搴忎粠0鍒版渶鍚庝竴鍖 +// 1闃舵 鍩虹珯鎸塩ount鍙锋壘SDK瑕佽娈垫暟鎹 +//count 闇瑕佽幏鍙栦笅涓鍖呬紶杈撶殑鍖呭簭鍙 浠0寮濮嬨 鍗曚綅1K 鏈鍚庝竴鍖匰DK琛ュ叏1024 +void Upgrade_StartGetNextPack(uint8_t step, uint8_t count) +{ + //Platform.FLASH_Read(LOADSTART + count * 1024U, NextPack, 1024); + update.data_ok_flag = 0; + update_request_pkt_to_pc(10, count); +} + +static uint32_t TickTimeOut = 0; + +void Upgrade_TickHandler(void) +{ + static uint16_t H_Tick = 0; + + if (TickTimeOut) + { + if (--TickTimeOut == 0) + { + if ((DownFSM != DOWN_IDLE) && (DownFSM != DOWN_END)) + DownFSM = DOWN_END; + } + } + + switch (DownFSM) + { + case DOWN_IDLE: + break; + case DOWN_START: + //骞挎挱1S寮濮嬫寚浠 鍐嶈浆鍒版帴鏀 + Upgrade_SendBeacon(Down_Start, 30); + H_Tick++; + if (H_Tick > 40) + { + DownLoad.Pack.PackCount = 0; + DownLoad.Pack.SendCount = 0x1ff; + DownLoad.ResendMAX = 1; + DownLoad.ResendCount = 0; + + memset(DownLoad.SN_BUF, 0, 48); + DownLoad.SN_Count = 0; + + H_Tick = 0; + DownLoad.Step = 0; + memset(DownLoad.LostBitBUF, 0xff, 64); + Upgrade_StartGetNextPack(DownLoad.Step, DownLoad.Pack.PackCount); //鍑嗗绗竴鍖呮暟鎹 + Upgrade_ClrBit(DownLoad.LostBitBUF, 0); + DownLoad.CheckNext = 0; //False; + DownFSM = DOWN_PASSTHROUGH; + // GUI_ShowVoteInput("DOWN_PASSTHROUGH"); + // SGUI_RefreshScreen(); + } + break; + case DOWN_PASSTHROUGH: + + log_debug("\nS:%d", DownLoad.Pack.PackCount); + + if (DownLoad.CheckNext != 1) + { + if (Upgrade_CheckNextPackArrive(DownLoad.Pack.Buf) == 0) //鎴愬姛鑾峰彇鍒版暟鎹 + { + DownLoad.CheckNext = 1; //True; + DownLoad.ResendCount = 0; + DownLoad.Pack.CRC.u16 = Upgrade_CRC(0, DownLoad.Pack.Buf, 1024); + DownLoad.Pack.SendCount = DownLoad.Pack.PackCount; + } + } + if (DownLoad.Pack.SendCount != 0x1ff) + { + if (++DownLoad.ResendCount > 200) + DownLoad.ResendCount = 200; + Upgrade_SendPassThroughPack(DownLoad.Pack.SendCount); + Upgrade_DelayUs(800); + Upgrade_SendPassThroughPack(DownLoad.Pack.SendCount); + } + + if ((DownLoad.ResendCount >= DownLoad.ResendMAX) && (DownLoad.CheckNext == 1)) + { + DownLoad.CheckNext = 0; //False; + for (uint8_t i = 0; i < DownLoad.DownBlockNum; i++) + { + if (Upgrade_GetBit(DownLoad.LostBitBUF, i)) + { + Upgrade_ClrBit(DownLoad.LostBitBUF, i); + DownLoad.Pack.PackCount = i; + Upgrade_StartGetNextPack(DownLoad.Step, DownLoad.Pack.PackCount); + break; + } + if (i == (DownLoad.DownBlockNum - 1)) + DownFSM = DOWN_PASSTHROUGHEND; + } + } + + break; + + case DOWN_PASSTHROUGHEND: + H_Tick = 0; + DownLoad.ASK_POS++; + memset(DownLoad.LostBitBUF, 0, 32); + DownFSM = DOWN_QUERY; + if (DownLoad.QueryPos++ > 200) + DownLoad.QueryPos = 1; + log_debug("DOWN_QUERY"); + // GUI_ShowVoteInput("DOWN_END"); + //SGUI_RefreshScreen(); + break; + + case DOWN_QUERY: + Upgrade_BeaconQuery(); + + H_Tick++; + if (H_Tick >= 50) //5S + { + uint16_t LostNum = 0; + H_Tick = 0; + for (uint16_t i = 0; i < DownLoad.DownBlockNum; i++) + { + if (Upgrade_GetBit(DownLoad.LostBitBUF, i)) + { + LostNum++; + } + } + log_debug("\nLNum:%d", LostNum); + if (LostNum == 0) + { + DownFSM = DOWN_END; + break; + } + else + { + DownLoad.Step++; + DownLoad.ResendMAX = 8; + + for (uint8_t i = 0; i < DownLoad.DownBlockNum; i++) + { + if (Upgrade_GetBit(DownLoad.LostBitBUF, i)) + { + Upgrade_ClrBit(DownLoad.LostBitBUF, i); + DownLoad.Pack.PackCount = i; + Upgrade_StartGetNextPack(DownLoad.Step, DownLoad.Pack.PackCount); + break; + } + } + DownFSM = DOWN_PASSTHROUGH; + break; + } + } + + break; + case DOWN_END: + //骞挎挱1S寮濮嬫寚浠 鍐嶈浆鍒版帴鏀 + Upgrade_SendBeacon(Down_Stop, 30); + H_Tick++; + if (H_Tick > 40) + { + TickTimeOut=0; + H_Tick = 0; + DownFSM = DOWN_IDLE; + updat__exit(); + } + break; + default: + break; + } +} + +uint8_t Upgrade_PassThrough_CheckHead(uint8_t *buf) +{ + if ((buf[1] == 0xAA) && (buf[2] == 0xBB) && (buf[3] == 0xCC) && (buf[4] == 0xDD)) //鍏嶉厤瀵 + { + } + else + { + if (DownLoad.ATC[0] != buf[1]) + return 2; + if (DownLoad.ATC[1] != buf[2]) + return 2; + if (DownLoad.ATC[2] != buf[3]) + return 2; + if (DownLoad.ATC[3] != buf[4]) + return 2; + } + + if (0x7f != buf[5]) + return 1; + if (0xde != buf[6]) + return 1; + if (0x48 != buf[7]) + return 1; + if (0xfe != buf[8]) + return 1; + + return 0; +} + +void Upgrade_RfSendCallBack(const uint8_t *data, uint16_t len) +{ + static uint8_t PassThroughStep = 0; + static U8_U16 CRC = {0}; + static uint8_t T_SN[4] = {0}; + uint8_t RxBuf[33] = {0}; + + RxBuf[0] = len; + memcpy(RxBuf + 1, data, len); + + if (Upgrade_PassThrough_CheckHead(RxBuf) == 0) + { + if (RxBuf[10] != 0x82) + return; + PassThroughStep = 1; + memcpy(T_SN, RxBuf + 13, 4); //淇濆瓨SN鍙 + CRC.u8[0] = RxBuf[11]; + CRC.u8[1] = RxBuf[12]; + return; + } + if (PassThroughStep == 1) + { + PassThroughStep = 0; + uint16_t crc = Upgrade_CRC(0, RxBuf + 1, 32); + if (crc == CRC.u16) //鏍¢獙姝g‘ + { + log_debug("\nCRCT"); + if (DownLoad.SN_Count < 16) + { + memcpy((DownLoad.SN_BUF + DownLoad.SN_Count * 4), T_SN, 4); + DownLoad.SN_Count++; + } + for (uint8_t i = 0; i < 32; i++) + { + if (RxBuf[i + 1] != 0) + { + DownLoad.LostBitBUF[i] = DownLoad.LostBitBUF[i] | RxBuf[i + 1]; + } + } + } + return; + } +} + +//鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺 +//鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺旈渶淇敼閮ㄥ垎鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺 +//鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺 +//鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺 +void Upgrade_Start(void) +{ + // Platform.Timer_Stop(HW_TIM_TypeUSecs0); + // Platform.Timer_Stop(HW_TIM_TypeUSecs1); + // Platform.Timer_Stop(HW_TIM_TypeUSecs2); + + // Platform.RF_SetRxPayloadCallback(Upgrade_RfSendCallBack); //RF鎺ユ敹鍥炶皟 + // //Platform.RF_SetTxEndCallback(CORE_BASE_SET_EndCallback); //RF鍙戦佸畬鎴愬洖璋 + + // Platform.Timer_SetIRQHandler(HW_TIM_TypeUSecs1, Upgrade_TickHandler); //鍗囩骇 涓绘祦绋嬪畾鏃朵腑鏂 100MS + // Platform.Timer_Start(HW_TIM_TypeUSecs1, 100 * 1000); + + DownFSM = DOWN_START; //寮濮嬪崌绾 + DownLoad.TranSportPos++; //鍗囩骇Pos搴忓彿 + TickTimeOut = 6000; //10鍒嗛挓瓒呮椂鏃堕棿 + + base_core.switch_send_beacon(0); +} + +//妯℃嫙鍥轰欢涓嬭浇 +//void Upgrade_Init(void) +//{ +// //Upgrade_ParameterInit(); //鍙傛暟鍒濆鍖 鑾峰彇鎬婚暱涓嶤RC +// Upgrade_Start(); //寮濮嬪浐浠跺崌绾 +//} + +//鈥斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺斺 + +//-------------------------------- 涓巔c 涔嬮棿鐨勯氫俊 ----------------------------------------------- + +#if 0 +/* +鍩虹珯鍙戦佸崌绾ц繃绋嬩腑鐨勭姸鎬佺粰PC +*/ +static void update_report_info_to_pc(unsigned char kp_seq,unsigned char status) +{ + unsigned char tmp[32]; + if(kp_seq>= UPDATE_KP_CNT) return;//error 闃叉鏁扮粍婧㈠嚭 + tmp[0] =24; + tmp[1] =0xE1; + tmp[2] =base_core.get_id();//get_base_id(); + tmp[3] =22; + tmp[4] =6; + tmp[5] =0;//packH + tmp[6] =0;//packL + tmp[7] =status; //閿欒鎴栬呮槸閫氱煡/鏁版嵁宸茬粡鍙戦佸畬浜嗭紒 + if(tmp[7]==1)//鎶ュ憡瀹屾垚鐘舵佹椂锛屼笉鍏虫敞id/SN锛屼究浜庤皟璇曠悊瑙 +memset(tmp+8,0xff,6);// mem_set(tmp+8,6,0xff); + else + memcpy(tmp+8,update.idsn[kp_seq],6);//mem_cpy(update.idsn[kp_seq],tmp+8,6); //鎶ュ憡閿欒鏃跺繀椤诲寘鍚玦d/SN + + base_core.send_data_to_pc(tmp);//user__base_tx_to_pc_sub(tmp); +} +#endif +static void update_request_pkt_to_pc(unsigned char type, unsigned short pkt_id) +{ + unsigned char tmp[32]; + //if(kp_seq>= UPDATE_KP_CNT) return;//error 闃叉鏁扮粍婧㈠嚭 + tmp[0] = 24; + tmp[1] = 0xE1; + tmp[2] = base_core.get_id(); //get_base_id(); + tmp[3] = 22; + tmp[4] = type; //7;//6; + tmp[5] = pkt_id >> 8; //packH + tmp[6] = pkt_id; //packL + // tmp[7] =status; //閿欒鎴栬呮槸閫氱煡/鏁版嵁宸茬粡鍙戦佸畬浜嗭紒 + // if(tmp[7]==1)//鎶ュ憡瀹屾垚鐘舵佹椂锛屼笉鍏虫敞id/SN锛屼究浜庤皟璇曠悊瑙 + //memset(tmp+8,0xff,6);// mem_set(tmp+8,6,0xff); + // else + // memcpy(tmp+8,update.idsn[kp_seq],6);//mem_cpy(update.idsn[kp_seq],tmp+8,6); //鎶ュ憡閿欒鏃跺繀椤诲寘鍚玦d/SN +#if _RTT_VIEW_ +// SEGGER_SYSVIEW_PrintfHost("base->pc:request packetNO=%d", pkt_id); +#endif + base_core.send_data_to_pc(tmp); //user__base_tx_to_pc_sub(tmp); +} + +/* +鍩虹珯鍗囩骇閿洏鍥轰欢涔 鍩虹珯涓巔c涔嬮棿鐨勯氫俊鍏ュ彛锛屼篃鏄崌绾у姛鑳界殑鎬诲叆鍙o紒 +call by rx_pc_0x61 +娴佺▼锛 pc涓嬭浇鍚嶅崟 + pc鍛婄煡鍩虹珯鍙互寮濮嬮氱煡閿洏杩涘叆涓嬭浇 + pc寮濮嬪彂閫佸崌绾ф暟鎹 + 鐒跺悗鍩虹珯杩涘叆骞挎挱鍗囩骇鏁版嵁 +*/ +void update_kp_enter(const unsigned char *rx_pc) +{ + switch (rx_pc[4]) + { + case 1: +#if 0 + update.idsn_mode =rx_pc[5]; + memcpy(&update.Hver,rx_pc+8,10);//mem_cpy(rx_pc+8,&update.Hver,10); + + if(rx_pc[7]==1){ //a start update + update.type_start_stop_data=1;//update.type_cmd_data =1; + update.start_end_flag=1; + //memset(update.valid,0,UPDATE_KP_CNT); //clear valid flag + if(update.valid_cnt < UPDATE_KP_CNT) + memset(update.valid+update.valid_cnt,0,UPDATE_KP_CNT-update.valid_cnt); + update.step =_STEP_NOTICE_START; + _debug__updata_init(); + update.start_end_flag=1; //鍗囩骇鍔熻兘鎬诲紑鍏!! + } + else if(rx_pc[7]==0){ //b,finish update + update.type_start_stop_data=0;//update.type_cmd_data =0; + update.step =_STEP_NOTICE_FINISH; + } + else{ //c, stop update + update.type_start_stop_data=0;//update.type_cmd_data =0; + update.step =_STEP_NOTICE_ABORT;//鍋滄鍛戒护 + } +#else + memcpy(&update.Hver, rx_pc + 8, 10); + + if (rx_pc[7] == 1) //寮濮 + { //start + unsigned char mac[4]; + unsigned int file_len = (update.file_len[0] << 24) + (update.file_len[1] << 16) + + (update.file_len[2] << 8) + (update.file_len[3] << 0); + base_core.get_match_code(mac); + Upgrade_ParameterInit(mac, (update.crc[0] << 8) + update.crc[1], file_len); + update.start_end_flag = 1; + Upgrade_Start(); //寮濮嬪浐浠跺崌绾 +//#if _RTT_VIEW_ +// view_print(0, "pc->base: start keypad update", rx_pc + 4); +//#endif + } + else if (rx_pc[7] == 2) //缁堟 + { + update.start_end_flag = 0; + DownFSM = DOWN_END; + base_core.switch_send_beacon(1); + } +#endif + user__pc_cmd_ack(0x61, 22, rx_pc + 4, 26); //update_ack_pc_0x61(rx_pc); //responce sdk + break; +#if 0 + case 2:{ //download id/sn list of keypad + unsigned char i,current; + update.kp_counter =rx_pc[5]; + update.valid_cnt =rx_pc[5];//鍒濆鍖栨湁鏁堜釜鏁 + if(update.kp_counter >UPDATE_KP_CNT ) break; //瓒呭嚭鏈澶ч敭鐩樹釜鏁 error ??濡備綍鎶ュ憡姝ら敊璇? + //姣忔鍙戦8涓6瀛楄妭琛ㄥ崟 + current = (rx_pc[6]<<3); + //if( current >= UPDATE_KP_CNT-8) break;//error 闃叉鏁扮粍婧㈠嚭 + for(i=0;i<8;i++){ + if(current+i >= UPDATE_KP_CNT) break; //瑙e喅100鍙敭鐩樻渶鍚4鍙棤娉曡繘鍏ュ崌绾х殑闂 + memcpy(update.idsn[current+i],&rx_pc[7+i*6],6); + update.valid[current+i] =1; + } + } + + user__pc_cmd_ack(0x61,22,rx_pc+4,26);//update_ack_pc_0x61(rx_pc); + break; + + case 4://down update data + + update.downID =rx_pc[6]; + update.packH =rx_pc[7]; + update.packL =rx_pc[8]; + if(update.packL >=16) break;//error 闃叉鏁扮粍婧㈠嚭 + memcpy(update.data[update.packL],rx_pc+9,18);//mem_cpy(rx_pc+9,update.data[update.packL],18);//16bytes data +2bytes crc + + break; + + + case 5://涓鍖呮暟鎹紶杈撳畬浜嗭紝鍙互寮濮嬪悜閿洏骞挎挱鏁版嵁浜嗭紒 + update.type_start_stop_data=2; + update.step =_STEP_BROADCAST_DATA_INIT; + break; + + case 6: //confirm report data from pc + update.pc_confirm_flag=1; + update.pc_confirm_type =rx_pc[7]; + break; +#endif + + case 7: //update data.... +// if (rx_pc[8] <= 21) +// { +// memcpy(update.data_ + rx_pc[8] * 48, rx_pc + 9, 48); +// } + + // if(rx_pc[8] ==0){ + // memcpy(update.data_+0,rx_pc+9,512); + // } + // else if(rx_pc[8] ==1){ + // memcpy(update.data_+512,rx_pc+9,512); + // update.data_ok_flag =1; + // } + + +// #if _RTT_VIEW_ +// view_print(0, "pc->base: a 512 bytes", rx_pc + 4); +// #endif + user__pc_cmd_ack(0x61, 22, rx_pc + 4, 26); + + #if TEXT_MESSAGE + if(rx_pc[5]==30) + { + msg_get_pc_data(rx_pc);//, update.data_);//msg_get_pc_data(rx_pc); +// if((rx_pc[7]*16 + rx_pc[8]+1)>=rx_pc[6]) +// { +// msg_get_pc_data(1, rx_pc + 9, rx_pc[6],48);//msg_get_pc_data(update.data_,rx_pc[6]*48); +// } +// else +// { +// msg_get_pc_data(0, rx_pc + 9, rx_pc[6],48); +// } + } + else + #endif + { + if (rx_pc[8] <= 21) + { + memcpy(update.data_ + rx_pc[8] * 48, rx_pc + 9, 48); + } + if (rx_pc[8] == 21) + update.data_ok_flag = 1; + } + break; + default: + break; + } //sw +} + + +void Msg_TickHandler(void); +//100ms timer +void update_2_timer(void) +{ + if (++update.timer_cnt >= 5) + { + update.timer_cnt = 0; + Upgrade_TickHandler(); + #if TEXT_MESSAGE + Msg_TickHandler(); + #endif + } +} + +//rf RX interface for keypad update +unsigned char save_keypad_ack_data(const unsigned char *rxkp) +{ +//#if _RTT_VIEW_ +// view_print(0, "keypad->base: rx rf data ", rxkp); +//#endif + if (update.start_end_flag) + { // &&(rxkp[1]==0xC0)&& ((rxkp[4]==0x01)||(rxkp[4]==0x03)) ){ + Upgrade_RfSendCallBack(rxkp + 1, rxkp[0]); + return 1; + } + else + return 0; +} +#endif + +//------------------------------------------------------------------------- +#if _RTT_VIEW_ +#include "SEGGER_SYSVIEW.h" +#include "SEGGER_RTT.h" + +//void view_print(unsigned char type, char *string, const unsigned char *tmp) +//{ +// unsigned short on_off = 0; +// on_off = 1; + +// if (on_off) +// { +// SEGGER_SYSVIEW_Print(string); + +// SEGGER_SYSVIEW_PrintfHost("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x ", +// tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7], +// tmp[8], tmp[9], tmp[10], tmp[11], tmp[12], tmp[13], tmp[14], tmp[15]); +// } +//} + +#endif diff --git b/Base_core/func_src/fucntion_base_test.c a/Base_core/func_src/fucntion_base_test.c new file mode 100644 index 0000000..0be782b --- /dev/null +++ a/Base_core/func_src/fucntion_base_test.c @@ -0,0 +1,168 @@ + +#include "function_interface.h" +#include "platform_interface.h" +#include "base_core_user.h" +#include "string.h" + + +//see BASE protocol 5.2.10 +struct base_test_STR{ + unsigned char head_addr; //is struct head address,no actual utility + unsigned char type; + unsigned char chan; + unsigned char Tmode; + unsigned char rf_pwr; + unsigned short send_cnt[2]; //鍙戦佹鏁 + unsigned char interval; //鍙戦侀棿闅 ms + #define BASE_TEST_LEN 7 +}; + +struct base_test_STR base_test; + + + + +/* +鍖呮嫭浜哸,cc2500娴嬭瘯鍩虹珯鍙戦佹椂鐨凴ssi;b,24L01 tx only;c,normal base; +*/ + + +static unsigned short cur_send_cnt,cur_recv_cnt; +unsigned char rx_rssi,rssi_request_flag; + + + + + + +/* +鍒濆鍖栧熀绔欐祴璇曠浉鍏冲浐浠 +*/ +void basetest_init(void) +{ + base_test.type=0; + cur_send_cnt=0; + cur_recv_cnt=0; +} + +/* +鑾峰彇鍩虹珯娴嬭瘯鐘舵 +*/ +unsigned char basetest_get_status(void) +{ + if(base_test.type) return 1; + return 0; +} + +unsigned char base_test_chan=1; +/* +鎺ユ敹骞朵笖鍔犺浇ack pc 鏁版嵁 +*/ +void basetest_rx_and_ack_pc(const unsigned char *rxpc,unsigned char *ack_buf) +//void basetest_load_info_ack_pc(unsigned char *rxpc,unsigned char *ack_buf) +{ + memcpy(&base_test.head_addr+1,rxpc+4,BASE_TEST_LEN);//mem_cpy(rxpc+4,&base_test.head_addr+1,BASE_TEST_LEN); + + ack_buf[0] =base_test.type; + ack_buf[1] =base_test.chan; + ack_buf[2] =base_test.rf_pwr; + ack_buf[3] =cur_send_cnt>>8; //tx + ack_buf[4] =cur_send_cnt; + ack_buf[5] =cur_recv_cnt>>8; //rx + ack_buf[6] =cur_recv_cnt; + ack_buf[7] =rx_rssi; //rssi + + + #ifdef FCCCE + //--------------------------------------------- + void FCC_test_enter(unsigned char mode,unsigned char rf_id); + if( base_test.type !=3 ) return; + if( (base_test.Tmode<1) ||(base_test.Tmode >4) )return; + if( (base_test.rf_pwr<1) ||(base_test.rf_pwr >4) )return; + base_test_chan =base_test.chan; + FCC_test_enter(base_test.Tmode,base_test.rf_pwr-1); + #endif +} + + +/* +鍩虹珯娴嬭瘯澶勭悊 +this function called by main loop +*/ +void basetest_progress(void) +{ + unsigned char i,tmp[40]; + unsigned char keypad_buf[64]; + + switch(base_test.type){ + case 1: //杩涘叆灏勯娴嬭瘯妯″紡 ,鍙墽琛屼竴娆″氨閫鍑;琚祴鍩虹珯杩涘叆FCC3妯″紡 + platform.rf_set_FCC_mode(base_test.Tmode); + base_test.type =0xff; + break; + + case 2://閫鍑烘祴璇曟ā寮 + basetest_init(); + break; + + case 3://鍩虹珯杩涘叆娴嬭瘯鍙戦佹ā寮 + if(++cur_send_cnt>= (base_test.send_cnt[0]<<8) +base_test.send_cnt[1] )break; + tmp[0] =32; + for(i=0;i<32;i++) tmp[i] = i; + base_core.send_rf_data(tmp,base_core.get_mainRF_hard_id());//base_tx_to_keypad_sub(tmp,base_core.get_main_rf_id()); + platform.delay_ms(base_test.interval); + break; + + case 4://鍩虹珯杩涘叆娴嬭瘯鎺ユ敹妯″紡 + cur_recv_cnt=0; + break; + case 5: + //姝ゅ妫娴嬫帴鏀堕敭鐩樻暟鎹紝闇瑕佸叧闂甯哥殑澶勭悊閿洏鏁版嵁鍑芥暟锛侊紒 +// if( !fifo_output(&keypad_data,keypad_buf+1,&keypad_buf[0]) )return; //buf涓病鏈夋湁鏁堟暟鎹 !!!!!!!!!!????????????? + if(keypad_buf[0]!=32) return; + if(keypad_buf[1]!=0) return; + if(keypad_buf[2]!=1) return; + if(keypad_buf[3]!=2) return; + cur_recv_cnt++; + break; + + case 6://鍩虹珯杩涘叆妫娴婻SSI妯″紡 + rx_rssi=0; + break; + + case 7: + if( !rssi_request_flag) break; + rx_rssi = platform.rf_get_rssi(); + break; + + default:break; + }//sw +} + + + +#ifdef CCxxxx //cc2500 棰戠巼杞崲 +/* +cc2500鐢ㄤ簬鍩虹珯娴嬭瘯鐨勪綔鐢ㄦ槸 妫娴嬪熀绔欑殑RSSI +cc2500鐨勯鐐硅寖鍥 2403-2482;1M鐨 姝ヨ繘 鑰屼笖1-40棰戠偣鍜41-80棰戠偣闂撮殧鐨 1-2404;2-2406; 41-2403;42-2405M; +24L01鐨勯鐜囪寖鍥存槸2401-2480锛屾杩1M; 棰戠偣涓庨鐜囧搴旓紱1-2401锛2-2402锛 79-2479M +涓轰簡瑙e喅cc2500鍜24L01瀵瑰簲鍏崇郴,鐗规坊鍔犳杞崲鍑芥暟 + */ +unsigned char basetest_cc2500_freq_conver(unsigned char freq) +{ + //鍙湁鍦ㄦ祴璇曟ā寮忎笅鎵嶅仛棰戠偣杞崲锛屽惁鍒欎細瀵艰嚧棰戠偣閿欎贡鑰屾棤娉曞拰閿洏閫氫俊锛 + if(!base_test.type) return freq; + + if(freq<3) freq=3; + if(freq>80) freq=80; + if(freq%2) + freq=((freq-3)>>1)+41; + else + freq =((freq-4)>>1)+1; + + return freq; +} +#endif //#ifdef CCxxxx + + + + diff --git b/Base_core/func_src/fucntion_fastmatch.c a/Base_core/func_src/fucntion_fastmatch.c new file mode 100644 index 0000000..bf01a46 --- /dev/null +++ a/Base_core/func_src/fucntion_fastmatch.c @@ -0,0 +1,235 @@ + +#include "function_interface.h" +#include "platform_interface.h" +#include "base_core_user.h" +#include "function.h" +#include "string.h" + + +struct fastmatch_STR{ + volatile unsigned char flag; + unsigned char chan; + unsigned short keypad_id; + unsigned char lowPA; +}; +struct fastmatch_STR fastmatch={ + .flag =0, +}; + + + + + + +/* +妫娴 pc璁剧疆鎶曠エ淇℃爣绫诲瀷鏄惁鏄揩閫熼厤瀵 40 +called by pc璁剧疆鎶曠エ淇℃爣 +*/ +void fastmatch_enter_exit(const unsigned char *rxpc) +{ + //琛ㄥ喅鍣ㄥ崗璁 2.2.16 + //fast match enter + if(rxpc[5]==40){ + if(rxpc[6]==0) return; + fastmatch.flag=1; + fastmatch.keypad_id= (rxpc[8]<<8)+rxpc[9]; + if(rxpc[6]==1) + fastmatch.chan =0; + else + fastmatch.chan =81; //?? 蹇熼厤瀵2 ?? + + //AES --杩涘叆蹇熼厤瀵规椂锛屾洿鏂颁竴娆$閽 + function.aes__keycode_upgrade(); + } + else{ + if(fastmatch.flag){//exit fast match,鍒囨崲鍒伴厤瀵瑰墠鐨勯鐐 + fastmatch.flag=0; + platform.rf_set_freq(base_core.get_main_rf_chan(),base_core.get_mainRF_hard_id());//platform.rf_set_freq(base_core.get_main_rf_chan(),base_core.get_main_rf_id()); + } + } + +} + + + + +/* +蹇熼厤瀵规ā寮忎笅锛屽姞杞界浉鍏虫暟鎹埌鎶曠エ淇℃爣涓 +called by 鍩虹珯鍙戦佹姇绁ㄤ俊鏍 +*/ +unsigned char fastmatch_load_info_to_vote_beacon(unsigned char *ptr) +{ + static unsigned char chan_trigger=0;//鍋氶鐜囦氦鏇挎爣蹇梖lag //??????Gavin + if(!fastmatch.flag) return 0; + + //CRS2妯″紡涓嬪浣曞鐞 ?? 涓轰綍CRS2鍗忚涓嬩笉鍒囨崲鍒板伐浣滈鐐瑰彂鏁版嵁?? + if(chan_trigger==0){ +// if(chan_trigger){ + platform.rf_set_freq(fastmatch.chan,base_core.get_mainRF_hard_id());//platform.rf_set_freq(fastmatch.chan,base_core.get_main_rf_id()); + ptr[10] =1; + ptr[11] =base_core.get_main_rf_chan();//get_base_main_rfchannel(); + ptr[12] =fastmatch.keypad_id>>8; + ptr[13] =fastmatch.keypad_id; + } + else{ + platform.rf_set_freq(base_core.get_main_rf_chan(),base_core.get_mainRF_hard_id());//platform.rf_set_freq(base_core.get_main_rf_chan(),base_core.get_main_rf_id()); + if(function.crs2__SW){//crs2鍗忚涓?? + ptr[10] =1; + ptr[11] =base_core.get_main_rf_chan();//get_base_main_rfchannel(); + ptr[12] =fastmatch.keypad_id>>8; + ptr[13] =fastmatch.keypad_id; + } + else{ + ptr[10] =0; + ptr[11] =0; + ptr[12] =0; + ptr[13] =0; + } + } + + //AES--- + function.aes__load_fastmatch(ptr); + + chan_trigger ^=1; + + return 1; +} + + +unsigned char fastmatch_status(void) +{ + return fastmatch.flag; +} + + +/* +妫娴嬫帴鏀跺埌鐨勯敭鐩樻暟鎹槸鍚︽纭紝濡傛灉姝g‘閰嶅鎴愬姛锛屽垏鎹㈠埌涓嬩竴涓揩閫熼厤瀵筰d +閰嶅id鍦ㄩ敭鐩樻暟鎹腑鐨勪綅缃槸涓嶅悓鐨 + id妯″紡涓媌yte6-7 + SN妯″紡涓媌yte11-12 + CRS2妯″紡涓 byte19-20 +called by 鎺ユ敹閿洏鍑芥暟 +*/ +unsigned char fastmatch_success_check(const unsigned char *rxkp) +{ + if(!fastmatch.flag) return 0; + if( (fastmatch.keypad_id>0)&&(fastmatch.keypad_id ==(rxkp[0]<<8)+rxkp[1]) ){//fast match sucess, + fastmatch.keypad_id++;//pointer next id + return 1; + } + return 0; +} + + +//------------------------- 蹇熼厤瀵规椂 浣庡姛鑰楀鐞 -------------------------------- +/* +蹇熼厤瀵瑰紑鍏冲嚱鏁帮紝 +*/ +void fastmatch_switch(unsigned char on_off) +{ + fastmatch.flag =on_off; + platform.rf_set_freq(base_core.get_main_rf_chan(),base_core.get_mainRF_hard_id());//platform.rf_set_freq(base_core.get_main_rf_chan(),base_core.get_main_rf_id()); +} + + +/* +sdk璁剧疆蹇熼厤瀵逛笅鏃犵嚎妯″潡浣庡姛鐜囪缃紑鍏*/ +void fastmatch_lowerPA_setup(const unsigned char *rxpc) +{ + //fastmatch_lowerPA.lower_PA =rxpc[5]; + fastmatch.lowPA=rxpc[5]; +} + +static void fastmatch_lowerPA_ack_sub(unsigned char type,const unsigned char *ack_buf,unsigned char type_data_len) +{ + unsigned char tmp[64]; //whitelist 闇瑕佺殑buf闀夸簺 + + memset(tmp,0,sizeof(tmp)/sizeof(tmp[0]));//mem_set(tmp,sizeof(tmp)/sizeof(tmp[0]),0); + tmp[0]= 31; +// if(type ==_0x61_WHITE_LIST) tmp[0]= 60; //鐧藉悕鍗曞凡缁忓崟鐙鐞嗕簡 + tmp[1]= 0xE1; + tmp[2]= base_core.get_id();//get_base_id();//pc2bs_Bb.bs_id; + tmp[3]= type; + memcpy( tmp+4,ack_buf,type_data_len);//mem_cpy( ack_buf,tmp+4,type_data_len); + + //send to pc + base_core.send_data_to_pc(tmp);//user__base_tx_to_pc_sub(tmp); +} + +/* +sdk璇诲彇蹇熼厤瀵逛笅浣庡姛鑰楄缃姸鎬*/ +void fastmatch_lowerPA_ack(void) +{ + unsigned char ack_buf[2]; + ack_buf[0] =15; + //ack_buf[1] =fastmatch_lowerPA.lower_PA; + ack_buf[1] =fastmatch.lowPA; + //pc_cmd_0x61_ack(11,ack_buf,2); + fastmatch_lowerPA_ack_sub(11,ack_buf,2); + +} + + + +/* +妫娴嬪揩閫熼厤瀵逛笅锛屽熀绔欐槸鍚﹂檷浣庡姛鐜囬厤瀵 +called by 24L01*/ +unsigned char check_fastmatch_lowerPA(void) +{ + if( fastmatch.flag && fastmatch.lowPA) return 1; + return 0; +} + + + + + +//------------------------- 蹇熼厤瀵规椂涓嬭浇 濮撳悕 ----------------------------------------------- +/* +鍘熺悊锛 蹇熼厤瀵瑰畬鎴愬悗锛宻dk浼氶氳繃鍩虹珯杞彂濮撳悕鏁版嵁缁欓敭鐩橈紝姝ゆ椂锛屽熀绔欐娴嬪埌姝ゅ姩浣滃悗锛 +鍏抽棴蹇熼厤瀵瑰苟涓斾繚璇佸熀绔欏湪涓婚鐐(闈0棰戠偣)銆 +閿洏鏀跺埌濮撳悕鍚庝細閫氳繃鍩虹珯杞彂鍥炲簲淇℃伅锛屾鏃讹紝鍩虹珯妫娴嬪埌姝ゅ姩浣滃悗锛 +閲嶆柊鎵撳紑蹇熼厤瀵癸紝渚夸簬涓嬩竴涓敭鐩樺啓濮撳悕銆 +涓轰簡閬垮厤鏌愪釜閿洏涓嶅洖搴旀暟鎹鑷村熀绔欎竴鐩村叧闂揩閫熼厤瀵逛粠鑰屽鑷存棤娉曡繘琛屼笅涓涓敭鐩 鐨勯棶棰 +瑙e喅鍔炴硶锛氬叧闂揩閫熼厤瀵规椂锛屽紑鍚畾鏃跺櫒锛屽畾鏃舵椂闂村埌鍚庡氨閲嶆柊鎵撳紑蹇熼厤瀵广 +*/ +#ifdef DOWNLOAD_NAME + +static unsigned char down_name_20msN = 0; +/* +called by 20ms timer isr*/ +void down_name_20ms_timer(void) +{ + if(!down_name_20msN) return; + if(++down_name_20msN<50) return ; + down_name_20msN =0; + fastmatch_switch(1);//open fast match +} + +/* +called by sdk閫氳繃鍩虹珯杞彂缁欓敭鐩樼殑鍑芥暟 */ +unsigned char down_name_enter(unsigned char *rxpc) +{ + if( (rxpc[1]==0x30)&&(rxpc[5]==4) ){ + fastmatch_switch(0);//close fast match + down_name_20msN =1;//start timer + return 1; + } + return 0; +} + + +/* +called by 閿洏閫氳繃鍩虹珯杞彂缁檚dk鐨勫嚱鏁 */ +unsigned char down_name_exit(unsigned char *rxkp) +{ + if( (rxkp[5]==0xB0)&&(rxkp[9]==4) ){ + fastmatch_switch(1);//open fast match + down_name_20msN =0;//stop timer + return 1; + } + return 0; +} + +#endif + diff --git b/Base_core/func_src/fucntion_text_message.c a/Base_core/func_src/fucntion_text_message.c new file mode 100644 index 0000000..21d005f --- /dev/null +++ a/Base_core/func_src/fucntion_text_message.c @@ -0,0 +1,408 @@ +#include "base_core_user.h" +#include "function.h" +#include "string.h" +#include "platform_interface.h" +#include "stdint.h" +#include "base_pc_protocol.h" + +//#define RTT_DEBUG + + +#ifdef RTT_DEBUG +#include "SEGGER_RTT.h" +#include "SEGGER_RTT_Conf.h" +#endif + +#if (TEXT_MESSAGE) + +#define WAIT_TXOK_TIMER 500 +#define BEACON_RECOVER_COUNTDOWN 11 +#define MSG_BUF_LEN 1056 + +void set_tx_ok_flag(unsigned char flag); +unsigned char get_tx_ok_flag(void); +void basic_delay_us( unsigned short time ); + +struct text_msg_STR +{ + unsigned char status; + unsigned char data_ok_flag; + unsigned char buf[MSG_BUF_LEN+1]; +// unsigned char *buf; + unsigned char rf_pack_index; + unsigned int buf_len; + unsigned int pc_pack_all; + unsigned int pc_pack_cnt; + unsigned int pc_pack_index; + unsigned int send_len; + unsigned int timer_cnt; + unsigned char recover_cutdown; + unsigned char data_change; +}; + +unsigned char RF_Send_buf[MSG_BUF_LEN+1]={0}; + + +struct text_msg_STR msg={0}; +uint16_t msg_outtime_cnt=0; + + +typedef union { + unsigned int dec; + unsigned char part[4]; +} byte2str; + +byte2str Byte2Dex; + +uint16_t msg_delay_us(uint32_t time) +{ + basic_delay_us(time); +} + +void Msg_TickHandler(void) +{ + if (msg_outtime_cnt) + { + if (--msg_outtime_cnt == 0) + { + msg.data_ok_flag=0; + msg.buf_len=0; + msg.pc_pack_all=0; + msg.pc_pack_cnt=0; + } + } +} + +//unsigned char msg_get_pc_data(uint8_t flag, const unsigned char *buf, unsigned char pack_all,unsigned int buf_len) +//{ +// if(msg.buf_len==0) +// { +// memset(msg.buf, 0, MSG_BUF_LEN); +// msg.pc_pack_all=pack_all; +// } + +// if(msg.buf_len+buf_len>MSG_BUF_LEN) +// { +// msg.data_ok_flag=0; +// memset(msg.buf, 0, MSG_BUF_LEN); +// msg.buf_len=0; +// msg.pc_pack_all=0; +// msg.pc_pack_cnt=0; +// return 1; +// } +// msg.pc_pack_cnt++; +// if(msg.pc_pack_cnt>msg.pc_pack_all) +// { +//// msg.data_ok_flag=0; +//// memset(msg.buf, 0, MSG_BUF_LEN); +//// msg.buf_len=0; +//// msg.pc_pack_all=0; +//// msg.pc_pack_cnt=0; +//// return 1; +// } +// +// +// memcpy(msg.buf + msg.buf_len,buf,buf_len); +// msg.buf_len+=buf_len; +// +// +// msg_outtime_cnt=5; +// if(flag) +// { msg.send_len=msg.buf_len; +// msg.data_ok_flag=1; +// msg.pack_index++; +// +// msg_outtime_cnt=0; +// msg.buf_len=0; +// msg.pc_pack_all=0; +// msg.pc_pack_cnt=0; +// } +// +// return 0; + +//// else +//// return 1; +//} + + +//unsigned char msg_get_pc_data(const unsigned char *buf) +unsigned char msg_get_pc_data(const unsigned char *PC_buf)//, unsigned char *Save_buf) +{ + uint16_t i; + +// msg.buf=Save_buf; + if(msg.buf_len==0) + { + memset(msg.buf, 0, MSG_BUF_LEN); + msg.pc_pack_all=*(PC_buf+6); + msg.pc_pack_index=((PC_buf[7]*16) + PC_buf[8]); + if((PC_buf[7]*16) + PC_buf[8]) + return 1; + } + else + { + if(msg.pc_pack_index==((PC_buf[7]*16) + PC_buf[8])) + return 2; + msg.pc_pack_index=(PC_buf[7]*16) + PC_buf[8]; + } + + if((msg.buf_len+48)>MSG_BUF_LEN) + { + msg.data_ok_flag=0; + memset(msg.buf, 0, MSG_BUF_LEN); + msg.buf_len=0; + msg.pc_pack_all=0; + msg.pc_pack_cnt=0; + return 3; + } + + msg.pc_pack_cnt++; + if(msg.pc_pack_cnt>msg.pc_pack_all) + { + msg.data_ok_flag=0; + memset(msg.buf, 0, MSG_BUF_LEN); + msg.buf_len=0; + msg.pc_pack_all=0; + msg.pc_pack_cnt=0; + return 4; + } + + memcpy(msg.buf + msg.buf_len,PC_buf+9,48); + msg.buf_len+=48; + msg_outtime_cnt=5; + if((msg.pc_pack_index+1)>=msg.pc_pack_all ) + { msg.send_len=msg.buf_len; + + msg.data_ok_flag=1; + msg.rf_pack_index++; + msg.timer_cnt=0; + msg.data_change=1; + msg_outtime_cnt=0; +// msg.buf_len=0; +// msg.pc_pack_all=0; +// msg.pc_pack_cnt=0; + } + + return 0; +} + +uint8_t msg_tx_payload(uint8_t *Payload, uint32_t Length) +{ + //return Platform.RF_TxPack(Payload, Length); + set_tx_ok_flag(0); + platform.rf_send_data(Payload, Length, base_core.get_mainRF_hard_id()); + return 1; +} + + + +void msg_wait_rfsendOK() +{ + uint8_t status; + uint16_t wait = WAIT_TXOK_TIMER; + + while (wait) + { + if (get_tx_ok_flag()) + return; + msg_delay_us(2); + wait--; + } +} + +#ifdef RTT_DEBUG +void msg_rtt_log(uint8_t index, uint8_t *buf) +{ + uint16_t send_len=0; + char temp[50]={0}; + uint16_t i; + uint16_t msg_len; + uint16_t rtn=0; + uint8_t cnt=0; + + while (send_len7 && msg_len<48 ) + { + for(cnt=7;cnt>8; + buf[11] = Crc&0xFF; + + buf[12] = msg.rf_pack_index; + memset(buf+13,0,19); + msg_tx_payload(buf, 32); + msg_wait_rfsendOK(); + msg_delay_us(200); + #ifdef RTT_DEBUG + msg_rtt_log(msg.rf_pack_index,Send_buf); + #endif + while (send_len300) +// { +// msg.data_ok_flag=0; +// msg.timer_cnt=0; +// } +// } +// return 0; + + + uint8_t buf[1500]; + if( base_core.get_run_status() !=_STA_SYSMODE_0 ) return 0; + if(!msg.data_ok_flag ) return 0; + if(basic_beacon_crs2.pack_cnt==7) + { + basic_beacon_crs2.pack_cnt=0; + msg_set_status(1); + msg.recover_cutdown=BEACON_RECOVER_COUNTDOWN; + return 1; + } + + msg.timer_cnt++; + { + if(msg.timer_cnt>300) + { + msg.data_ok_flag=0; + msg.timer_cnt=0; + } + } + return 0; +} + +void msg_recover_beacon_countdown(void) +{ + if(msg.recover_cutdown) + { + if(msg.recover_cutdown>BEACON_RECOVER_COUNTDOWN) msg.recover_cutdown=BEACON_RECOVER_COUNTDOWN; + msg.recover_cutdown--; + if(msg.recover_cutdown==0) + { +// base_send_beacon_switch(2); + } + } +} + +unsigned char msg_get_status(void) +{ + return msg.status; +} + +void msg_set_status(unsigned char status) +{ + msg.status=status; +} + +void msg_clr_len(void) +{ + msg.buf_len=0; +} + +#endif diff --git b/Base_core/func_src/function.c a/Base_core/func_src/function.c new file mode 100644 index 0000000..31b9220 --- /dev/null +++ a/Base_core/func_src/function.c @@ -0,0 +1,237 @@ +/* +a,鍩虹珯鍔熻兘缁撴瀯浣撴寚閽堢殑瀹炵幇锛 +b,鍚勪釜鍔熻兘鍑芥暟鐨勫垵濮嬪寲 +c, +*/ +#include "platform_interface.h" +#include "function_interface.h" +#include "function.h" +#include "base_core_user.h" + + +/* +闄や簡0x60,0x61涔嬪鐨勭被鍨! +澶嶅埗pc杞彂缁欓敭鐩樼殑鏁版嵁,鐢ㄤ簬鐢ㄦ埛寮鍙戯紝姝ゆ暟鎹笉鍙互淇敼; +*/ +void user__pc_transfer2keypad(const unsigned char *pc_kp) +{ + + + +} + +/* +*/ +void user__keypad_transfer2pc(const unsigned char *kp_pc) +{ + +} + + +/* +* sdk璁剧疆0x60榛樿涔嬪鐨勭被鍨嬶紝渚涘姛鑳藉紑鍙戠敤鎴蜂娇鐢 +*/ +void user__pc_0x60cmd(const unsigned char *pc_kp) +{ + +} + +/* +* +*/ +void user__pc_0x61cmd(const unsigned char *pc_kp) +{ + + +} + + +/* +* +*/ +void user__pc_0x61cmd_type0x0B(const unsigned char *pc_kp) +{ + +} + + + +#include "string.h" +/* +*鍔熻兘锛 鐢ㄤ簬鍥炲sdk鐨勭粺涓鎺ュ彛锛岋紙core涔嬪锛 +* input : +cmd =0x60,0x61 +type =瀵瑰簲鍗忚涓殑byte3? +ack_buf =鍗忚涓殑byte4,鍩虹珯闇瑕佹牴鎹笉鍚岀殑鎯呭喌鍥炲涓嶅悓鐨勬暟鎹紱 +len = ack_buf鏁版嵁鐨勯暱搴 +*/ +void user__pc_cmd_ack(unsigned char cmd,unsigned char type, const unsigned char *ack_buf,unsigned char type_data_len) +{ + unsigned char tmp[32]; //whitelist 闇瑕佺殑buf闀夸簺 + + memset(tmp,0,sizeof(tmp)/sizeof(tmp[0])); + tmp[0]= 31; + tmp[1]= (cmd&0x0f) | 0xE0;//0xE1; + tmp[2]= base_core.get_id(); + tmp[3]= type; + memcpy( tmp+4,ack_buf,type_data_len);//mem_cpy( ack_buf,tmp+4,type_data_len); + //send to pc + base_core.send_data_to_pc(tmp);//user__base_tx_to_pc_sub(tmp); +} + + + +/*------------------------------------------------------------------- +瀹氫箟鍔熻兘寮鍏冲強鐩稿叧鍔熻兘鍑芥暟锛屽苟鍒濆鍖栵紝涔嬪悗涓嶅厑璁镐慨鏀!!! +*/ +//瀹氫箟鍔熻兘鐩稿叧鐨勭粨鏋勪綋 +struct function_STR function={ + /*------------------------------------------------------- + !!!!!!!!!!!! 璀︽垝绾 姝ゅ悗鐨勬暟鎹姝换浣曚慨鏀 !!!!!!!! + --------------------------------------------------------*/ + //whitelist + .whitelist__SW =WHITELIST, + .whitelist__init =whitelist_init, + .whitelist__enter= whitelist_enter, + .whitelist__search_special_list =search_special_list, + .whitelist__base_confirm_keypad_request =base_confirm_keypad_whitelist_request, + .whitelist__keypad_idsn_record_request =keypad_idsn_record_whitelist_request, + + //fastmatch + .fastmatch__SW =FAST_MATCH, + .fastmatch__enter_exit =fastmatch_enter_exit, + .fastmatch__load_info_to_vote_beacon =fastmatch_load_info_to_vote_beacon, + .fastmatch__success_check =fastmatch_success_check, + .fastmatch__lowPA_setup =fastmatch_lowerPA_setup, + .fastmatch__lowPA_ack=fastmatch_lowerPA_ack, + .fastmatch__get_status = fastmatch_status, + + //base test + .basetest__SW=BASE_TEST, //鍔熻兘寮鍏 + .basetest__progress=basetest_progress, + .basetest__init=basetest_init, + .basetest__get_status=basetest_get_status, + .basetest__rx_and_ack_pc=basetest_rx_and_ack_pc, + + //update keypad firmeware + .updatekp__SW =UPDATE_KP, + .update__kp_enter=update_kp_enter, + .update__kp_progress=update_kp_progress, + .update__save_keypad_ack_data=save_keypad_ack_data, + .update__get_status =update_get_status, + .update__monitor_sdk_connect =update_monitor_sdk_connect, + + //montior other base at same freq + .monitor__SW=MON_FREQ, //鍔熻兘寮鍏 + .monitor__auto_search_freq_enter=auto_search_freq_enter, + .monitor__rf_data=monitor_rf_data, + .monitor__freq_process=monitor_freq_process, + + //hard info + .hdinfo_HMODEL=HMODEL, + .hdinfo_SW1=SW1, + .hdinfo_SW2=SW2, + .hdinfo_SW3=SW3, + + .rf_speed_set=RF_SPEED, + .rf_channel_max=FREQ_MAX,//2.4G鏈80涓鐐癸紝433M鍙湁32涓 + .rf_id ={RF_MODUAL0_SET,RF_MODUAL1_SET,RF_MODUAL2_SET,RF_MODUAL3_SET},//璁板綍纭欢妯″潡缂栧彿 + // + .crs2__SW=CRS2, + .lock_channel=LOCK_CHAN, + .mask_spec_channel =MASK_SPEC_CHAN, + .lock_logmode=LOCK_LOGMODE, + .no_matchcode__SW=NO_MATCHCODE, + .aux_att__SW=AUX_ATT, + .aux_beat__SW=AUX_BEATS, + .no_ID_mode__SW =NO_ID_MODE, + .lock_rf_count =LOCK_RF_CNT, +// .fix_rf_tx_beacon_cnt =FIX_RF_TX_BEACON_CNT, +// .match_keypad_type = KEYPAD_TYPE, + .base_type = BASE_TYPE, + + .crc16_keypad__SW =CRC16_CHECK_KEYPAD, + .crc16_pc__SW =CRC16_CHECK_PC, + + #if (NFC==1) //#if defined(NFC)&&(NFC==1) + .nfc__SW =NFC, + .nfc__pc_interaction =base_record_keypad_NFC_info, + .nfc__scan = NFC_monitor, + #endif + + //AES function + .AES__SW =AES, + .aes__init= aes_init, + .aes__load_fastmatch =aes_load_fastmatch_data, + .aes__config_enter =process_pc_aes_config, + .aes__keycode_upgrade =aes_keycode_upgrade, + .aes__rf_Encrypt =rf_Encrypt, + .aes__rf_Decrypt =rf_Decrypt, + .aes__get_key =get_aes_key, + .aes__get_status = get_aes_status, + + #if (TCPIP==1) //#if defined(TCPIP)&&(TCPIP==1) + //tcp ip + .TCPIP__SW =TCPIP, + .tcpip__init =w5500_init, + .tcpip__config_enter =_0x61_tcpip_sub, + .tcpip__process = do_tcp_server, + #endif + + //broadcast + .BROADCAST__SW =BROADCAST, + .broadcast__config_enter =broadcast_config, + .broadcast__startup =startup_broadcast, + .broadcast__keypad_request =process_keypad_broadcast_requst, + .broadcast__det_content_err = det_blank_content, + + //user interface //鍚庣画鏍规嵁闇瑕佸鍔狅紱 + .user_keypad_transfer2pc =user__keypad_transfer2pc, + .user_pc_0x60cmd = user__pc_0x60cmd, + .user_pc_0x61cmd = user__pc_0x61cmd, + .user_pc_0x61cmd_type0x0B =user__pc_0x61cmd_type0x0B, + .user_pc_transfer2keypad =user__pc_transfer2keypad, + + + ._debug__function_enter =_debug_function_enter, + /*------------------------------------------------------- + !!!!!!!!!!!! 璀︽垝绾 姝ゅ墠鐨勬暟鎹姝换浣曚慨鏀 !!!!!!!! + 濡傞渶娣诲姞璇峰湪姝や箣鍚!!!!!!!!!!!!!!!!! + --------------------------------------------------------*/ + //message broadcast + #if TEXT_MESSAGE + .msg__polling = msg_polling, + #endif + + //network + .network__polling = network_polling, + .network__get_netseq = network_get_netseq, + .network__set_netseq_change = network_set_netseq_change, + .network__get_pwd = network_get_pwd, + .network__set_pwd = network_set_pwd, + .network__get_name = network_get_name, + .network__set_name = network_set_name, + .network__get_nameview = network_get_nameview, + .network__set_nameview = network_set_nameview, + +}; + + + + +/* +鍒濆鍖栧熀绔欏姛鑳芥ā鍧楋紝鎵鏈夌殑锛侊紒锛 +*/ +void function_init_all(void) +{ + // + function.whitelist__init(); + +} + + + + + + + diff --git b/Base_core/func_src/function_AES.c a/Base_core/func_src/function_AES.c new file mode 100644 index 0000000..ccadbb7 --- /dev/null +++ a/Base_core/func_src/function_AES.c @@ -0,0 +1,526 @@ +/* + +* +* +* +*/ + +#include "function_interface.h" +#include "platform_interface.h" +#include "base_core_user.h" +#include "function.h" +#include "string.h" +#include "AES.h" +#include "HW_MCUIO.h" +//#include "stm32f4xx_hal.h" + + +//#define E2PROM_ADDR_KEYCODE 0x100 +#define STORE_AES_KEYCODE_ADDR 0x400 //len =32 +#define STORE_AES_CONFIG_ADDR 0x420 //0x120 //len =3 //20200427淇敼锛岃В鍐冲拰IP鍦板潃瀛樺偍鍐茬獊!! + + +#define KEY_CODE_LEN 32 +#define KEYCODE_LEN_HALF 16 + + +const unsigned char Keycode_Sunvote[] ="SunVote1998&JackPei1972CoolBob99";//32瀛楄妭鍘熷瀵嗙爜鍘熷鏁版嵁 + +struct AES_STR{ + unsigned char type_0_128_256; + unsigned char _mcu_flag; //纭欢AES; =0-->杞欢AES AesMcu + unsigned char key_update_flag; + + unsigned char keycode0[KEY_CODE_LEN]; //skey0 + unsigned char keycode[KEY_CODE_LEN]; //skey +}; +struct AES_STR aes; + + + + + +/* +* 鍔犲瘑鍑芥暟 +* input: + key -- + _256_mode --128 or 256 +*/ +static void Encrypt(unsigned char *src,unsigned char *dist,unsigned char *key,unsigned char _256_mode) +{ + uint32_t output_len; + + if(_256_mode==2) + _256_mode =1; //AES 256 + else + _256_mode =0; //AES 128 + + if (aes._mcu_flag==1) + STM32_AES_ECB_Encrypt(src,16,key,dist,&output_len,_256_mode);//16鏄痵rc闀垮害锛屽嚱鏁伴噷闈㈡敮鎸佸姞瀵嗘ā寮 + else + AES_Encrypt((char*)src,(char*)dist,(char*)key,_256_mode); +} + +/* +* 瑙e瘑鍑芥暟 +* +*/ +static void Decrypt(unsigned char *src,unsigned char *dist,unsigned char *key,unsigned char _256_mode) +{ + uint32_t output_len; + + if(_256_mode==2) + _256_mode =1; //AES 256 + else + _256_mode =0; //AES 128 + + if (aes._mcu_flag==1) + STM32_AES_ECB_Decrypt(src,16,key,dist,&output_len,_256_mode); + else + AES_Decrypt((char*)dist,(char*)src,(char*)key,_256_mode); +} + + + +/* +* 鑾峰彇榛樿鐨勭閽 +* input:key ---瀵瑰簲demo涓殑sKey0; +* note:浣跨敤AES128鍒嗗埆鎿嶄綔鍓嶅悗16bytes +*/ +static void generate_default_key0_code(void) +{ + unsigned char i; + + memset(aes.keycode0,0,KEY_CODE_LEN); + memcpy(aes.keycode,Keycode_Sunvote,KEY_CODE_LEN); + + for(i=0;i>8; +// src[32]=crc_tmp&0xff; +// src[0]=32; +// } + + //------------ CRC ---------------- + { + unsigned short crc_tmp; + crc_tmp = crc16(src+5,26); + src[31]=crc_tmp>>8; + src[32]=crc_tmp&0xff; + src[0]=32; + } + //--------------------------------- + + //0, copy + memcpy(dist,src,KEY_CODE_LEN+1); + + //a, + if( (tmp=CmdXch(src[5])) >0) + dist[5] =tmp; + + //byte6-21 鍔犲瘑 + if( ((dist[5]==0x41)||(dist[5]==0x42) ) &&(dist[9]==40) ){//0x13->0x41 0x14->0x42 + dist[5] =0x4C; + Encrypt(src+6,dist+6,aes.keycode0,aes.type_0_128_256); + } + else{ + if(base_is_auto_match() ){//--- + //dist[5] =0x4C; + Encrypt(src+6,dist+6,aes.keycode0,aes.type_0_128_256); + } + else //--- + Encrypt(src+6,dist+6,aes.keycode,aes.type_0_128_256); + } + //byte22-32 鍔犲瘑锛氬拰鍔犲瘑鍚庣殑鍓11瀛楄妭寮傛垨锛 + for(i=0;i<11;i++) + dist[22+i] =src[22+i]^dist[6+i]; + + //d, byte6-32鍋氬墠鍚庣浉鍏冲鐞嗭紝閬垮厤鍏0鏁版嵁瀹规槗鐚滃嚭锛屽拰鍓嶄竴涓瓧鑺傚紓鎴栵紝濂芥仮澶 + for(i=7;i0) + dist[5] =tmp; + + for(i=6;i0) || (src[32]>0) ){ + crc_tmp = crc16(src+5,26); + if( ((crc_tmp>>8) != src[31]) || ( (crc_tmp&0xff) != src[32]) ) + return 0; + } + } + //------------------------------ + + return 1; +} + + + +/* +* 璇诲彇AES config +*/ +static void read_AES_config(void) +{ + unsigned char tmp[8]; + + platform.e2prom_read(STORE_AES_CONFIG_ADDR,tmp,3); + if(tmp[0]== 0xF5){//STORE_FLAG + aes.type_0_128_256 =tmp[1]; + aes.key_update_flag =tmp[2]; + } + else{ + aes.type_0_128_256 =0; + } +} + + + +/* +* 0x61 cmd from sdk +*see protocol xxx section yy +*/ +void process_pc_aes_config(const unsigned char *rx_pc) +{ + unsigned char tmp[32]; + + if(rx_pc[3] ==24){//write config + aes.type_0_128_256 =rx_pc[4]; + aes.key_update_flag =rx_pc[5]; + tmp[0]= 0xF5; + tmp[1]= rx_pc[4]; + tmp[2]= rx_pc[5]; + platform.e2prom_write(STORE_AES_CONFIG_ADDR,tmp,3); + } + + tmp[0]= aes.type_0_128_256; + tmp[1]= aes.key_update_flag; + user__pc_cmd_ack(0x61,23,tmp,2); +} + + +/* +*蹇熼厤瀵规椂 澧炲姞aes绉橀挜鐨勪紶閫; +*input :fdata = vote beacon +*/ +void aes_load_fastmatch_data(unsigned char *fdata) +{ + static unsigned char aes_pos=0; +// unsigned char i; + + if(!function.AES__SW) return; + if(!aes.type_0_128_256) return; + + //鐗规畩澶勭悊:蹇熼厤瀵逛笅鐨刟es256鍔犲瘑鏃讹紝byte5閮藉彉鎴0x13; + if( base_core.get_log_mode() >3 ) + fdata[5] =0x13; + + aes_pos ^=1; + fdata[14] =aes.type_0_128_256; + if(aes_pos) + fdata[10] = 3; + + memcpy(fdata+15,aes.keycode+16*aes_pos,16); +} + + + +/* +*鏇存柊绉橀挜锛屽揩閫熼厤瀵瑰惎鍔ㄦ椂琚皟鐢紒 +*/ +void aes_keycode_upgrade(void) +{ + unsigned char i; + + if(!function.AES__SW) return; + if(!aes.type_0_128_256) return; + + if(aes.key_update_flag)return; //鍒ゆ柇 鏇存柊绉橀挜鐨勫紑鍏 + + srand(HW_TIMER_Count_get( TIMER5 ));//(TIM5->CNT);//!!鍚﹀垯鍚庨潰rand鐢熸垚鏁板瓧鏄竴鏍风殑搴忓垪 + for(i=0;i>2);//(block[i] -4)/4 + byte_seq = tmp>>3;// /8 + bit_seq = tmp%8; + flag[byte_seq] |= 1<=NFC_BLOCK_CNT) return; //闃叉鐢ㄦ埛杩炵画澶氭鍐欏叆瀵艰嚧鏁扮粍瓒婄晫 + memcpy(nfc_app.wbuf[nfc_app.wblock_cnt+i],info+6+i*4,4); //mem_cpy(info+6+i*4,nfc.buf[1+i],4); + nfc_app.waddr[nfc_app.wblock_cnt+i] = STUD_ID_ADDR+i;//block + }//for + nfc_app.wblock_cnt+=4; + + //b, student name 16bytes store block30-33; + for(i=0;i<4;i++){ + if( nfc_app.wblock_cnt+i >=NFC_BLOCK_CNT) return; //闃叉鐢ㄦ埛杩炵画澶氭鍐欏叆瀵艰嚧鏁扮粍瓒婄晫 + memcpy(nfc_app.wbuf[nfc_app.wblock_cnt+i],info+22+i*4,4); //mem_cpy(info+22+i*4,nfc.buf[5+i],4); + nfc_app.waddr[nfc_app.wblock_cnt+i] = STUD_NAME_ADDR+i;//block + }//for + nfc_app.wblock_cnt+=4; + + //b, money 4bytes store block30-33; + for(i=0;i<1;i++){ + if( nfc_app.wblock_cnt+i >=NFC_BLOCK_CNT) return; //闃叉鐢ㄦ埛杩炵画澶氭鍐欏叆瀵艰嚧鏁扮粍瓒婄晫 + memcpy(nfc_app.wbuf[nfc_app.wblock_cnt+i],info+38+i*4,4);//mem_cpy(info+38+i*4,nfc.buf[9+i],4); + nfc_app.waddr[nfc_app.wblock_cnt+i] = MONEY_ADDR+i;//block + }//for + nfc_app.wblock_cnt+=1; + #endif + + ack_buf[1] =1;//used ack adk + } + + //--------------2锛岃偂涓滃鍚 ---------------------- + #ifdef NFC_G1 + /*20200317淇敼,sdk涓嬪彂 鑲℃潈浜哄拰鑲℃潈鏁板埌鍩虹珯锛屽熀绔欎竴娆℃у啓鍏ュ埌閿洏*/ + else if(info[5]==2){ //store name + for(i=0;i<13;i++){ + if( nfc_app.wblock_cnt+i >=NFC_BLOCK_CNT) return; //闃叉鐢ㄦ埛杩炵画澶氭鍐欏叆瀵艰嚧鏁扮粍瓒婄晫 + memcpy(nfc_app.wbuf[nfc_app.wblock_cnt+i],info+6+i*4,4); + nfc_app.waddr[nfc_app.wblock_cnt+i] =10+i; //G1 NFC鍦板潃璇存槑 + } + nfc_app.wblock_cnt +=13; + ack_buf[1] =2;//used ack adk + } + //--------------,3锛岃偂绁ㄦ暟閲-------------------------- + else if(info[5]==3){ //store count + for(i=0;i<2;i++){ + if( nfc_app.wblock_cnt+i >=NFC_BLOCK_CNT) return; //闃叉鐢ㄦ埛杩炵画澶氭鍐欏叆瀵艰嚧鏁扮粍瓒婄晫 + memcpy(nfc_app.wbuf[nfc_app.wblock_cnt+i],info+6+i*4,4); + nfc_app.waddr[nfc_app.wblock_cnt+i] =23+i; //G1 NFC鍦板潃璇存槑 + } + nfc_app.wblock_cnt +=2; + ack_buf[1] =3;//used ack adk + } + #endif + + #ifdef NFC_STD + nfc_app.wblock_cnt +=calc_update_flag(nfc_app.waddr,nfc_app.wblock_cnt); + #endif + + #ifdef _NFC_DEBUG_ + for(i=0;i<4;i++) + memcpy(nfc_app.kp_nfc_info[nfc_app.ok_cnt].name+i*4,nfc_app.wbuf[6+i],4); + nfc_app.debug_sdk_down_cnt++; + #endif + + nfc_app.mode_status =1; //sdk write flag + } + else{ //------------------------------read nfc infor + + } + + ack_buf[0] =info[4]; //19,20 +// ack_buf[1] =1; //鏀跺埌鎸囦护锛屽湪鍚庣画鎿嶄綔涓墠杩斿洖鐪熸鐨勬暟鎹!! + user__pc_cmd_ack(0x61,11,ack_buf,2);//nfc_ack_pc(ack_buf,2); +} + + + + +/* +*鍒峰崱鍚庡皢閿洏淇℃伅鍙嶉缁檚dk +*/ +static void responce_keypad_info_to_pc(void) +{ + unsigned char ack_buf[32]; + ack_buf[0] =20; //19,20 + ack_buf[1] =2; //responce keypad info + + #ifdef NFC_T2 //T2鐨剆dk鎶婂墠4涓瓧鑺備綔涓篠N锛涘叾浠栫殑鐢ㄥ悗4涓綔涓篠N + // ack_buf[2] =nfc_app.rbuf[0][0]; //4byte SN + // ack_buf[3] =nfc_app.rbuf[0][1]; + ack_buf[2] =nfc_app.rbuf[0][2]; + ack_buf[3] =nfc_app.rbuf[0][3]; + ack_buf[4] =nfc_app.rbuf[1][0]; //2bytes of 6bytes SN remain + ack_buf[5] =nfc_app.rbuf[1][1]; + ack_buf[6] =0x00;//nfc_app.rbuf[0][2]; + ack_buf[7] =0x00;//nfc_app.rbuf[0][3]; + #else + ack_buf[2] =nfc_app.rbuf[0][0]; //4byte SN + ack_buf[3] =nfc_app.rbuf[0][1]; + ack_buf[4] =nfc_app.rbuf[0][2]; + ack_buf[5] =nfc_app.rbuf[0][3]; + ack_buf[6] =nfc_app.rbuf[1][0]; //2bytes of 6bytes SN remain + ack_buf[7] =nfc_app.rbuf[1][1]; + #endif + ack_buf[8] =nfc_app.rbuf[2][0]; //id + ack_buf[9] =nfc_app.rbuf[2][1]; + user__pc_cmd_ack(0x61,11,ack_buf,10); +} + + +/* +* 20ms scan +*/ +void NFC_monitor(void) +{ + //閿洏鍥轰欢鍗囩骇妯″紡涓嬶紝涓嶆敮鎸丯FC鍒峰崱锛20201009 + if(function.updatekp__SW && function.update__get_status() ) return; + + if( base_core.get_sdk_connect_status() ==0){ + unsigned char i; + if(++nfc_app.sdk_offline_cnt >=100){ //*20ms + nfc_app.sdk_offline_cnt=0; + nfc_app.mode_status =0; //sdk Nms鍐呬笉杩炴帴锛屽熀绔欏氨鍥炲埌鍩虹鐘舵 + #ifdef _NFC_DEBUG_ + nfc_app.debug_custom_ok_cnt=0; + nfc_app.debug_default_ok_cnt =0; + nfc_app.debug_sdk_down_cnt =0; + nfc_app.debug_driver_ok_cnt=0; + nfc_app.debug_sdk_change_cnt=0; + nfc_app.ok_cnt=0; + nfc_app.debug_driver_start_cnt=0; + for(i=0;i<8;i++){ + nfc_app.error[i].cnt=0; + memset(nfc_app.error[i].card_sn,0,8); + }//for + #endif + } + } + else{ + nfc_app.sdk_offline_cnt=0; + } + + + if(nfc_app.mode_status ==1){ //鍐欏畬鎴愪箣鍚庤繕闇瑕佽鍥炶鍐欑殑閿洏鐨剆n id绛変俊鎭; + //a load read info addr + nfc_app.rblock_cnt =load_read_info__idsn(0); + + //b,write/read data and read the keypad sn + if( platform.rfid_write_read_N_block(&nfc_app) == 0x12){ + #ifdef _NFC_DEBUG_ + nfc_app.debug_custom_ok_cnt++; + memcpy(nfc_app.kp_nfc_info[nfc_app.ok_cnt].keypad_sn,nfc_app.rbuf[0]+2,2); + memcpy(nfc_app.kp_nfc_info[nfc_app.ok_cnt].keypad_sn+2,nfc_app.rbuf[1],2); + memcpy(&nfc_app.kp_nfc_info[nfc_app.ok_cnt].keep_,&nfc_app.debug_driver_keep_cnt,1); + memcpy(&nfc_app.kp_nfc_info[nfc_app.ok_cnt].start_,&nfc_app.debug_driver_start_cnt,1); + memcpy(&nfc_app.kp_nfc_info[nfc_app.ok_cnt].complish_,&nfc_app.debug_custom_ok_cnt,1); + memcpy(&nfc_app.kp_nfc_info[nfc_app.ok_cnt].card_sn_record,&nfc_app.card_sn,8); + nfc_app.ok_cnt++; + #endif + platform.buzzer_ctrl(1); + responce_keypad_info_to_pc(); + //start timer + nfc_app.wait_sdk_info =200; //*20ms = + nfc_app.mode_status =0; + } + } + else if(nfc_app.mode_status ==2){ //read info from keypad + + } + else{//鍙啓鍏ラ厤瀵圭爜鍜屼富棰戠偣淇℃伅 + if( nfc_app.wait_sdk_info ){ + nfc_app.wait_sdk_info--; + return; + } + + nfc_app.wblock_cnt = load_write_info__matchcode_chan(0); + #ifdef NFC_STD + nfc_app.wblock_cnt +=calc_update_flag(nfc_app.waddr,nfc_app.wblock_cnt); + #endif + nfc_app.rblock_cnt =load_read_info__idsn(0); + + if( platform.rfid_write_read_N_block(&nfc_app)==0x12){ + #ifdef _NFC_DEBUG_ + nfc_app.debug_default_ok_cnt++; + #endif + platform.buzzer_ctrl(1); + responce_keypad_info_to_pc(); + } + + } +} + + + +#endif diff --git b/Base_core/func_src/function_T2_display.c a/Base_core/func_src/function_T2_display.c new file mode 100644 index 0000000..bb9ffc6 --- /dev/null +++ a/Base_core/func_src/function_T2_display.c @@ -0,0 +1,209 @@ + +#include "platform_interface.h" +#include "dot.h" +#include "function.h" +#include "base_core_user.h" +#include "function_interface.h" + + +#ifdef LCD_ON +//鐗堟湰 +const unsigned char VERSION[]={ + CB0E6, + CB1BE, + CA3BA //: +}; + +//棰戠偣 +const unsigned char CHANNEL[]={ + CC6B5, + CB5E3, + CA3BA //: +}; + + +/*杩炴帴鐘舵*/ +const unsigned char CONNECT_STAT[]={ + CC1AC, + CBDD3, + CD7B4, + CCCAC, + CA3BA //: +}; + +//宸茶繛鎺 +const unsigned char CONNECT_STAT_LINK[]={ + CD2D1, + CC1AC, + CBDD3, + +}; +//鏈繛鎺 +const unsigned char CONNECT_STAT_NOLINK[]={ + CCEB4, + CC1AC, + CBDD3, + +}; + + + + +/* +* 鏄剧ず鏁板瓧瀛愬嚱鏁帮細澶存暟瀛楁槸0涓嶆樉绀猴紱b,姣忎釜鍗曞厓鍙槸鏄剧ず涓涓瓧绗(灏界鏄0涔熸樉绀) +*/ +static unsigned char calc_valid_disp_char(unsigned char sw,unsigned char *ver_tmp) +{ + unsigned char tmp[3],len=0; + + + tmp[0] = sw/100; + tmp[1] = (sw%100)/10; + tmp[2] = sw%10; + if( tmp[0]!=0){ + ver_tmp[0] = tmp[0]+0x30; + ver_tmp[1] = tmp[1]+0x30; + ver_tmp[2] = tmp[2]+0x30; + len=3; + } + else{ + if( tmp[1]!=0){ + ver_tmp[0] = tmp[1]+0x30; + ver_tmp[1] = tmp[2]+0x30; + len=2; + } + else{ + ver_tmp[0] = tmp[2]+0x30; + len=1; + } + } + return len; +} + +/* +* 鏄剧ず鍩虹珯鍥轰欢鐗堟湰鍙 +*/ +void lcd_display_ver(void) +{ + unsigned char tmp[12],len=0; + + len = calc_valid_disp_char(SW1,tmp); + tmp[len] ='.'; + len +=1; + + len += calc_valid_disp_char(SW2,tmp+len); + tmp[len] ='.'; + len +=1; + + len += calc_valid_disp_char(SW3,tmp+len); + tmp[len] =0x00; + + platform.lcd_display_char(3*16,7,(unsigned char *)tmp); //纭欢鐗堟湰 +} + +/* +* 鏄剧ず鍩虹珯宸ヤ綔鐨勬棤绾块鐐 +*/ +void lcd_display_channel(void) +{ + unsigned char tmp[3],ch; +// len = calc_valid_disp_char(base_core.get_main_rf_chan(),tmp); +// if(len ==1){ +// tmp[1]=' '; +// len++; +// } + //add by Gavin20201221,鍒锋柊棰戠偣淇℃伅浠庝袱浣嶅垏鎹㈠埌涓浣嶆椂 鍘熸潵鐨勭浜屼綅杩樹繚鎸佺殑闂锛 + ch = base_core.get_main_rf_chan(); + tmp[0] = (ch/10)%10 + 0x30; + tmp[1] = ch%10 +0x30; + tmp[2] = 0x00; + + platform.lcd_display_char(3*16,10,(unsigned char *)tmp); +} + + +/* +* 鏄剧ず鍩虹珯涓嶴DK鐨勮繛鎺ョ姸鎬 +*/ +void lcd_display_connect_status(unsigned char sta) +{ + if(sta) + platform.lcd_display_chinese(5*16,4,CONNECT_STAT_LINK,sizeof(CONNECT_STAT_LINK)/sizeof(unsigned char)); + else + platform.lcd_display_chinese(5*16,4,CONNECT_STAT_NOLINK,sizeof(CONNECT_STAT_NOLINK)/sizeof(unsigned char)); +} + + + + +void lcd_display_same_freq_distrub(unsigned char enter_exit) +{ + #if 0 + if(enter_exit){ + platform.lcd_display_char(0,4, (unsigned char *)" Warning "); + platform.lcd_display_char(0,6, (unsigned char *)"frequency interference"); + platform.lcd_display_char(0,8, (unsigned char *)" "); + + } + else{ + platform.lcd_display_char(0,4, (unsigned char *)" "); + platform.lcd_display_char(0,6, (unsigned char *)" "); + platform.lcd_display_char(0,8, (unsigned char *)" "); + + platform.lcd_display_chinese(0,4,CONNECT_STAT,sizeof(CONNECT_STAT)/sizeof(unsigned char)); + platform.lcd_display_chinese(0,6,READER_STAT,sizeof(READER_STAT)/sizeof(unsigned char)); + platform.lcd_display_chinese(0,8,ANSWER_STAT,sizeof(ANSWER_STAT)/sizeof(unsigned char)); + lcd_display_vote_stat(); + lcd_display_nfc_stat(); + lcd_display_sdk_stat(); + } + #endif +} + + +/* +* 鍥哄畾鏄剧ず鐨勮彍鍗; +* called by sys init +*/ +void lcd_display_menu(void) +{ + platform.lcd_display_char(0,0,(unsigned char *)"SunVote RF200-T30B"); + platform.lcd_display_char(0,2,(unsigned char *)"____________________"); + platform.lcd_display_chinese(0,4,CONNECT_STAT,sizeof(CONNECT_STAT)/sizeof(unsigned char)); + platform.lcd_display_chinese(0,7,VERSION,sizeof(VERSION)/sizeof(unsigned char)); + platform.lcd_display_chinese(0,10,CHANNEL,sizeof(CHANNEL)/sizeof(unsigned char)); + + //鏄剧ず鍐呭 + lcd_display_connect_status(0); + lcd_display_ver(); + lcd_display_channel(); +} + + +/* +* called by mainloop +*/ +void T2_voice_base_dispaly_main_loop(void) +{ + static unsigned char sdk_connect_record=0; + static unsigned char channel_record=0; + //2020.12.03 璋冭瘯鏀瑰杽濮撳悕涓嬪彂閫熷害鏃跺彂鐜帮紝杞彂鏁版嵁鏃跺紑鍚疦FC鍜孡CD鏄剧ず瀵瑰鍚嶄笅鍙戞垚鍔熺巼褰卞搷寰堝ぇ锛 + //绠鍖朙CD鏄剧ず鐣岄潰锛屾寜椤圭洰缁忕悊鎻愪緵鐨勬柊鐣岄潰鍋;鍚屾椂锛岃浆鍙戞椂鍏抽棴鏄剧ず鍜孨FC + function.nfc__scan(); + + if( sdk_connect_record != base_core.get_sdk_connect_status() ){ + sdk_connect_record = base_core.get_sdk_connect_status(); + lcd_display_connect_status(sdk_connect_record); + } + + if(base_core.get_main_rf_chan() != channel_record){ + channel_record =base_core.get_main_rf_chan(); + lcd_display_channel(); + } +} + + +#endif + + + diff --git b/Base_core/func_src/function_broadcast.c a/Base_core/func_src/function_broadcast.c new file mode 100644 index 0000000..0b20a8c --- /dev/null +++ a/Base_core/func_src/function_broadcast.c @@ -0,0 +1,227 @@ +/* +骞挎挱鏁版嵁锛堜俊鏍囷級 +鍩虹珯鍗忚V0.95 section2.3璁剧疆鍙戜俊鎭俊鏍 +閿洏鍗忚V0.99-11 section 2.4 骞挎挱淇℃伅淇℃爣 +*/ +#include "base_core_user.h" +#include "string.h" +#include "function.h" +#include "function_interface.h" + +#define SLOT_MAX 128 //Max is 0xff from protocol!! + +struct content_STR{ + //2.3.2鍙戦佺殑鍐呭 + unsigned char dcmd; + unsigned char slotmax; +// unsigned char slotn; + unsigned char data[SLOT_MAX][16]; //128,Max=0xff +}; + +struct broadcast_STR{ + //2.3.1鍙戦佸弬鏁 + unsigned char type; + unsigned char times; + unsigned char slots; + + //2.3.2鍙戦佺殑鍐呭 + struct content_STR content[2]; + + //2.3.3鍚姩鍙戦佸拰缁撴灉 + unsigned char id_sn_broad; + unsigned char id_sn[6]; + unsigned char startup_dcmd; + + //user var + unsigned char on_off_flag; + unsigned char execute_times; + unsigned char slot_seq; + unsigned char cur_type; + + //keypad request + unsigned char keypad_request_step; + + unsigned char data_pos; +}; +struct broadcast_STR broadcast={ + .data_pos =0, + +}; + + +/* -------------------------------------------------------- +鍩虹珯淇濆瓨鏉ヨ嚜sdk鐨勫箍鎾暟鎹 +*/ +void broadcast_config(const unsigned char *rx_pc) +{ + unsigned char type;//棰樺瀷 +// unsigned char ack_flag=1; + unsigned char ack_buf[20]={1}; + unsigned char ack_buf_len=1; + + switch(rx_pc[3]){ + case 11: + memcpy(&broadcast.type,rx_pc+4,3); + break; + + case 12: + //20200811,澧炲姞sdk浠庡熀绔欒鍥為鍨嬫暟鎹傚熀绔欓儴鍒哣0.96 section2.3.2 + //if( (rx_pc[4] !=1) && (rx_pc[4] !=2) ) break; + if( (rx_pc[4] ==1) || (rx_pc[4] ==2) ) + { + if( rx_pc[6] >=SLOT_MAX) break;//闃叉鏁扮粍婧㈠嚭 + type=rx_pc[4]-1; + broadcast.content[type].dcmd = rx_pc[4]; + broadcast.content[type].slotmax =rx_pc[5]; + memcpy(&broadcast.content[type].data[rx_pc[6]] ,rx_pc+7,16); + } + else if(rx_pc[4] &0x80){ //sdk璇婚鍨嬫暟鎹 + if( rx_pc[6] >=SLOT_MAX) break;//闃叉鏁扮粍婧㈠嚭 + type=(rx_pc[4]&~0x80) -1; + ack_buf[1] =broadcast.content[type].slotmax; //byte5 + ack_buf[2] =rx_pc[6]; + memcpy(ack_buf+3,&broadcast.content[type].data[rx_pc[6]] ,16); + ack_buf_len =19; + } + break; + + case 13: + memcpy(&broadcast.id_sn_broad,rx_pc+4,8); + break; + + default:ack_buf_len=0;break; + }//sw + if(ack_buf_len) + user__pc_cmd_ack(0x60,rx_pc[3],ack_buf,ack_buf_len); +} + +//unsigned char broad_cast_cnt; + +/*--------------------------------------------- +鍙戦佸箍鎾俊鏍囧瓙鍑芥暟 +input: + type -棰樺瀷 + seq -鏁版嵁鍖呭彿 +*/ +static void base_broadcast_sub(unsigned char type,unsigned char seq) +{ + unsigned char tmp[32+1]; + tmp[0] = 32;//31; + base_core.get_match_code(tmp+1); + + tmp[5] = ( base_core.get_log_mode() <=3)?0x31:0x32; //id or SN + + tmp[6] = 0x00; + tmp[7] = 0x00; + //byte8-11 Keypad SN + +// tmp[12] = broadcast.content[type].dcmd | (broadcast.data_pos <<4); //DCMD,High 4bit is datapos + tmp[12] = (broadcast.content[type].dcmd&0x0f) | (base_core.get_vote_datapos() <<4); //DCMD,High 4bit is datapos + tmp[13] = 0; + tmp[14] =broadcast.content[type].slotmax ;//slotMax + tmp[15] = seq; //broadcast.content[type].slotn ; //slot_seq + memcpy(tmp+16,broadcast.content[type].data[seq],16); + tmp[32] =crc16(tmp+5,27)&0xff; //CRC + +//broad_cast_cnt++; + + base_core.send_rf_data(tmp,base_core.get_mainRF_hard_id()); +} + + +/* +鍚姩骞挎挱鐨勬潯浠 +a,鐩戞祴鍒 娴嬮獙棰-澶氶鍨; 琛ㄥ喅鍣╒0.99-11 section2.2.13 +b,鎺ユ敹鍒 閿洏娌℃湁鏀堕綈鏁版嵁鐨 璇锋眰; 鏁欒偛鏂扮増-琛ㄥ喅鍣╒0.99-11 section3.2.6 +*/ +void startup_broadcast(void) +{ + if( !function.BROADCAST__SW) return; + if(broadcast.on_off_flag==1) return; //濡傛灉姝e湪杩涜骞挎挱淇℃伅锛屽氨涓嶈鍐嶅惎鍔ㄤ簡!!!! + base_core.switch_send_beacon(0);// turn off send beacon + broadcast.data_pos++; + broadcast.on_off_flag =1; + broadcast.execute_times = 0; + broadcast.slot_seq =0; + broadcast.cur_type =0;//鐢辫繘鍏ョ殑妯″紡鍐冲畾debug only +} + +/* +//2021.05.10 瀹㈣瘔鎻忚堪锛氬棰樺瀷妯″紡涓嬶紝閲嶆柊鎷旀彃鍩虹珯鍚庡鑷撮敭鐩樻棤娉曞紑鏈--鍏跺疄鏄敭鐩樻樉绀虹櫧灞; +鍘熷洜锛氬棰樺瀷妯″紡涓嬶紝棰樺瀷鍐呭涓嶄繚瀛橈紝鎷旀彃鍩虹珯鍚庨鍨嬪唴瀹逛涪澶;浣嗘槸杩樻槸鍦ㄥ棰樺瀷妯″紡涓嬨 +瑙e喅鍔炴硶锛氬湪寮濮嬪箍鎾棰樺瀷鏃讹紝澧炲姞鍒ゆ柇鏄惁瀛樺湪棰樺瀷鍐呭锛涘鏋滄病鏈夊氨寮哄埗閫鍑哄苟鍒囨崲鍒扮┖闂叉ā寮忎笅銆 +*/ +unsigned char det_blank_content(void) +{ + if( (broadcast.content[0].slotmax==0) &&(broadcast.content[1].slotmax==0) ){ + //force exit multi content,exit sysmode0; + broadcast.on_off_flag =0; + base_core.force_sysmode0(); + base_core.switch_send_beacon(1); + + return 1; + } + return 0; +} + + +/*---------------------------------------------------------- +* 鐗规畩澶勭悊 鏉ヨ嚜閿洏鐨勨滃箍鎾俊鎭笉瀹屾暣鈥濈殑璇锋眰; +* 鍩虹珯鏀跺埌閿洏璇锋眰鍚,闇瑕佹寜姝e父鍛ㄦ湡缁欓敭鐩榓ck锛岀劧鍚庢墠寮濮嬪惎鍔ㄥ箍鎾彂閫侊紱 +* 褰撶劧濡傛灉褰撳墠姝e湪鍙戝箍鎾俊鍙凤紝灏变笉蹇呭啀鍚姩鍙戦佷簡锛侊紒 +*鍏蜂綋鍋氭硶锛氬湪鍙戦佸熀纭/鎶曠エ淇℃爣鏃(姝ゆ椂鍩虹珯涓瀹氭槸宸茬粡鍙戦佷簡瀵归敭鐩樿姹傜殑ack)鍒ゆ柇鏄鏋滄敹鍒颁簡閿洏璇锋眰锛屽氨寮鍚箍鎾ā寮; +* input:request =1 ,鎺ユ敹閿洏鐢宠杈撳叆鍙傛暟;other:startup +* return +*/ +unsigned char process_keypad_broadcast_requst(unsigned char request) +{ + if( !function.BROADCAST__SW) return 0; + + if( request ==1){ + if(det_blank_content() ) return 0; + broadcast.keypad_request_step = request; + } + else{ + if(broadcast.keypad_request_step){ + broadcast.keypad_request_step=0; + startup_broadcast(); + return 1; + } + } + return 0; +} + + + + + + + +unsigned char led_cnt;//debug only +/* +called by 2.5ms and turn off send beacon!! +*/ +void base_broadcast_process_2ms5(void) +{ + if( !function.BROADCAST__SW) return; + if( !broadcast.on_off_flag) return; + if(broadcast.slot_seq >= SLOT_MAX) return; + + base_broadcast_sub(broadcast.cur_type,broadcast.slot_seq); + +// if(++led_cnt>=3){//debug only +// led_cnt=0; +// operation_debug_io(5);//debug only +// } + + if(++broadcast.slot_seq >= broadcast.content[broadcast.cur_type].slotmax ){ + //鍙戦佸畬涓涓懆鏈熶簡; + broadcast.slot_seq =0; + if(++broadcast.execute_times >=10){ + broadcast.on_off_flag=0; + base_core.switch_send_beacon(1); + } + } +} + + diff --git b/Base_core/func_src/function_debug.c a/Base_core/func_src/function_debug.c new file mode 100644 index 0000000..5e65a16 --- /dev/null +++ a/Base_core/func_src/function_debug.c @@ -0,0 +1,106 @@ + +#include "stdio.h" +#include "stdlib.h" +#include "string.h" +#include "platform_interface.h" + + +//-------------------------------------- NFC reader -------------------------------------------------- + +#ifdef _NFC_READER_ +/* +* nfc function 璋冭瘯鍑芥暟 +*/ +static void _debug_process__nfc(const unsigned char *pc,unsigned char *ack) +{ + + if(pc[11] =='S'){ //status + switch (pc[12]){ + case '1': //set + if(pc[14]== 1){ + nfc_app.mode_status =0x02; + memcpy(ack,"OK ",3);//mem_cpy("OK ",ack,3); + } + else if(pc[14]== 0){ + nfc_app.mode_status =0x00; + memcpy(ack,"OK ",3);//mem_cpy("OK ",ack,3); + } + else + memcpy(ack,"ERR",3);//mem_cpy("ERR",ack,3); + break; + + case '3': //get + ack[0] = (nfc_app.mode_status==0x02)?1:0; + break; + + default: + memcpy(ack,"ERR",3);//mem_cpy("ERR",ack,3); + break; + }//sw + } + else if(pc[11] =='O'){ //write or read operation + switch (pc[12]){ + case '1': //read block + platform.rfid_reader(pc[14],pc[15],ack); + break; + + case '2': //write block + break; + + default: + memcpy(ack,"ERR",3);//mem_cpy("ERR",ack,3); + break; + }//sw + } + +} +#endif + + + + +//ack +static void _dbg_function__response_pc_cmd( char type[], unsigned char *ack,unsigned char len) +{ + unsigned char tmp[64]; + if(len>56) len=56; + memcpy(tmp+8,ack,len);// mem_cpy(ack,tmp+8,len); + memset(tmp+8+len,' ',56-len); //mem_set(tmp+8+len,56-len,' '); + tmp[0] = 'a'; + tmp[1] = 'c'; + tmp[2] = 'k'; + tmp[3] = '-'; + tmp[4] = type[0]; + tmp[5] = type[1]; + tmp[6] = type[2]; + tmp[7] = ':'; + platform.base_send_data_to_pc(tmp,64); +} + + +/* ------------------------------------------------------------ +* function debug 鎬诲叆鍙 +* bushound input format: ff A0 *in +* +*/ +void _debug_function_enter(const unsigned char *pc) +{ + unsigned char tmp[64];//,cmd_type; + unsigned char start_offset =6; + + memset(tmp,' ',64); //mem_set(tmp,64,' '); + memcpy(tmp,pc+8,start_offset); //mem_cpy(pc+8,tmp,start_offset); + //cmd_type =pc[12]; + //pc[14] ---鏈夋晥鏁版嵁寮濮.... + #ifdef _NFC_READER_ //NFC鐩稿叧 + if(memcmp(pc+8,(unsigned char*)"NFC",3) ==0 ){ //if(mem_compare(pc+8,(unsigned char*)"NFC",3) ){ + _debug_process__nfc(pc,tmp+start_offset); + } + #endif + + + + //response pc cmd + _dbg_function__response_pc_cmd("fun",tmp,64); +} + diff --git b/Base_core/func_src/function_hard_test.c a/Base_core/func_src/function_hard_test.c new file mode 100644 index 0000000..3f9ca91 --- /dev/null +++ a/Base_core/func_src/function_hard_test.c @@ -0,0 +1,92 @@ +/* +function_hard_test.c鐢ㄤ簬纭欢娴嬭瘯 +1,鏀跺埌鏌愪釜瑙﹀彂淇″彿鍚庤繘鍏ョ‖浠舵祴璇曟ā寮 +2,杩涘叆姝诲惊鐜紝娴嬭瘯瀹屾垚閫氳繃led,lcd,buzzer绛夋寚绀烘祴璇曠粨鏋 +3,闇瑕侀噸鏂版嫈鎻掓墠鑳藉洖鍒版甯告ā寮; +*/ + +#include "function_interface.h" +#include "platform_interface.h" + +struct hard_test_STR{ + #define HARD_TEST_CH 19 //纭欢娴嬭瘯鏃朵娇鐢ㄧ殑棰戠偣 + unsigned char flag; + unsigned char rf_modual_cnt; + unsigned char rf_modual_id[4]; +}; + +struct hard_test_STR hard_test; + + +/* + +*/ +unsigned char rf_modual_RXTX_test(unsigned char id) +{ + unsigned char main_id= hard_test.rf_modual_id[0]; + char tx_buf[32]= "Sunvote base hard test"; + + //a,main rf modual init + platform.rf_init(main_id); + platform.rf_set_freq(HARD_TEST_CH,main_id); + + //b,target rf modual init + platform.rf_init(id); + platform.rf_set_freq(HARD_TEST_CH,id); + + //c,target modual TX,Main modual RX + platform.rf_send_data((unsigned char *)tx_buf,32,id); + //wait for main modual Rx data,then check data right or not; + + //d,target modual RX,Main modual TX + platform.rf_send_data((unsigned char *)tx_buf,32,main_id); + + + + //e,set target modual to other channel after test complete; + platform.rf_set_freq(1,id); + + return 0; +} + + + + +/* +纭欢娴嬭瘯鍏ュ彛 + +*/ +void hard_test__enter(void) +{ + unsigned char i,err_flag=0; + //a,init + + //缁熻妯″潡鐨勪釜鏁帮紝姣忎釜妯″潡鐨勭‖浠剁紪鍙; + hard_test.rf_modual_cnt =0; + for(i=0;i<4;i++){ + if((function.rf_id[i]==0xff)||(function.rf_id[i]==0xfe)||(function.rf_id[i]==0xfb) ){ + hard_test.rf_modual_id[hard_test.rf_modual_cnt ] = i; + hard_test.rf_modual_cnt++; + } + }//for + + for(i=1;i 25){ +// monitor_freq.disturb_cnt =26; +// } + return 1; + } + return 0; + +} + + + + + +/* +妫娴嬫槸鍚︽湁骞叉壈 +return: + 0- 瀹氭椂鏃堕棿鏈埌 + 1- 鏈夊共鎵 + 2- 娌℃湁骞叉壈 +*/ +static unsigned char check_disturb(void) +{ + //5s鍐呮敹鍒25娆″共鎵帮紝璁や负鏈夊悓棰戝共鎵 + if(++monitor_freq.monitor_interval<250) return 0; //20ms*250=5S瀹氭椂鍣 + monitor_freq.monitor_interval=0; + + if(monitor_freq.disturb_cnt>=45){ //25->45 + monitor_freq.disturb_cnt=0; + return 1; + } + else{ + monitor_freq.disturb_cnt=0; + return 2; + } +} + +static void monitor_freq_ack_pc(const unsigned char *ack_buf,unsigned char type_data_len) +{ + unsigned char tmp[64]; //whitelist 闇瑕佺殑buf闀夸簺 + + memset(tmp,0,sizeof(tmp)/sizeof(tmp[0]));//mem_set(tmp,sizeof(tmp)/sizeof(tmp[0]),0); + tmp[0]= 31; + tmp[1]= 0xE1; + tmp[2]= base_core.get_id();// + tmp[3]= 10;//type; + memcpy( tmp+4,ack_buf,type_data_len);//mem_cpy( ack_buf,tmp+4,type_data_len); + + //send to pc + if(base_core.get_sdk_connect_status_acc() ) + base_core.send_data_to_pc(tmp);//user__base_tx_to_pc_sub(tmp); +} + + +/* +鍩虹珯妫娴嬪綋鍓嶉鐐规槸鍚︽湁骞叉壈锛 +濡傛灉鏈夊共鎵帮紝涓婃姤缁檖c,鏌ユ壘骞插噣鐨勯鐐 +called by 20ms +*/ +void monitor_freq_process(void) +{ +#if 0 + unsigned char rslt; + unsigned char ack_pc[32]; + + if( !function.monitor__SW) return; + + if( ( rslt=check_disturb())==0 ) return;//0 5S瀹氭椂鏈埌 + monitor_freq.disturb_status =rslt; + + if(monitor_freq.disturb_status==1){ //1 鏈夊共鎵 + if(monitor_freq.search_new_freq_flag){//鎼滅储鐘舵 + if( monitor_freq.search_cnt>function.rf_channel_max){ //FREQ_MAX FREQMAX + //鎵鏈夐鐐归兘鎼滅储瀹屼簡 + platform.rf_set_freq(base_core.get_main_rf_chan(),base_core.get_mainRF_hard_id());//platform.rf_set_freq(base_core.get_main_rf_chan(),base_core.get_main_rf_id()); //鎭㈠鎼滅储鍓嶇殑棰戠偣 + monitor_freq.search_new_freq_flag=0; + //report to pc + ack_pc[0] =3; + ack_pc[1] =base_core.get_main_rf_chan();//get_base_main_rfchannel(); + ack_pc[2] =77; + ack_pc[3] =20; + ack_pc[4] =5; + monitor_freq_ack_pc(ack_pc,5); + } + else{ + monitor_freq.new_freq++; + monitor_freq.search_cnt++; + if( (monitor_freq.new_freq <=0)||(monitor_freq.new_freq> function.rf_channel_max) ) //assert_freq 80?? + monitor_freq.new_freq=1; + + //platform.rf_set_freq(monitor_freq.new_freq,base_core.get_mainRF_hard_id()); + base_core.set_main_rf_chan(monitor_freq.new_freq); + } + } + else{ + //report to pc + ack_pc[0] =3;//4;//鍚岄骞叉壈鎻愰啋; + ack_pc[1] =base_core.get_main_rf_chan();//monitor_freq.new_freq; + monitor_freq_ack_pc(ack_pc,2); + platform.buzzer_ctrl(1); + } + } + else if(monitor_freq.disturb_status==2){//2 娌℃湁骞叉壈 + if( !monitor_freq.search_new_freq_flag) return;//鎼滅储鐘舵 + monitor_freq.search_new_freq_flag=0;//鍏抽棴鎼滅储鏂伴鐐瑰姛鑳 + base_core.set_main_rf_chan(monitor_freq.new_freq);//璁板綍鏂扮殑棰戠偣//淇濆瓨鏂伴鐐瑰埌E2prom + //report to pc + ack_pc[0] =4; // + ack_pc[1] =monitor_freq.new_freq; + monitor_freq_ack_pc(ack_pc,2); + } +#else + unsigned char rslt; + unsigned char ack_pc[32]; + if( !function.monitor__SW) return; + + switch (check_disturb()) + { + case 1://鏈夊共鎵 + if(monitor_freq.search_new_freq_flag){//鎼滅储鐘舵 + if( monitor_freq.search_cnt>function.rf_channel_max){ //FREQ_MAX FREQMAX + //鎵鏈夐鐐归兘鎼滅储瀹屼簡 + //platform.rf_set_freq(base_core.get_main_rf_chan(),base_core.get_mainRF_hard_id());////鎭㈠鎼滅储鍓嶇殑棰戠偣??? + monitor_freq.search_new_freq_flag=0; + //report to pc + ack_pc[0] =3; + ack_pc[1] =base_core.get_main_rf_chan();//get_base_main_rfchannel(); + ack_pc[2] =77; + ack_pc[3] =20; + ack_pc[4] =5; + monitor_freq_ack_pc(ack_pc,5); + } + else{ + monitor_freq.new_freq++; + monitor_freq.search_cnt++; + if( (monitor_freq.new_freq <=0)||(monitor_freq.new_freq> function.rf_channel_max) ) //assert_freq 80?? + monitor_freq.new_freq=1; + //璁剧疆鏂伴鐐瑰悗锛岄噸鏂拌鏃跺拰璁℃暟; + monitor_freq.monitor_interval=0; + monitor_freq.disturb_cnt=0; + //platform.rf_set_freq(monitor_freq.new_freq,base_core.get_mainRF_hard_id()); + base_core.set_main_rf_chan(monitor_freq.new_freq); + } + } + else{ + //report to pc + ack_pc[0] =3;//4;//鍚岄骞叉壈鎻愰啋; + ack_pc[1] =base_core.get_main_rf_chan();//monitor_freq.new_freq; + monitor_freq_ack_pc(ack_pc,2); + //platform.buzzer_ctrl(1); + } + break; + + case 2://娌℃湁骞叉壈 + if( !monitor_freq.search_new_freq_flag) return;//鎼滅储鐘舵 + monitor_freq.search_new_freq_flag=0;//鍏抽棴鎼滅储鏂伴鐐瑰姛鑳 + //base_core.set_main_rf_chan(monitor_freq.new_freq);//璁板綍鏂扮殑棰戠偣//淇濆瓨鏂伴鐐瑰埌E2prom + //report to pc + ack_pc[0] =4; // + ack_pc[1] =monitor_freq.new_freq; + monitor_freq_ack_pc(ack_pc,2); + break; + + default: + break; + } + +#endif +} + + + + + + + diff --git b/Base_core/func_src/function_network.c a/Base_core/func_src/function_network.c new file mode 100644 index 0000000..4f65a33 --- /dev/null +++ a/Base_core/func_src/function_network.c @@ -0,0 +1,233 @@ + +#include "function_interface.h" +#include "platform_interface.h" +#include "base_core_user.h" +//#include "base_pc_protocol.h" +#include "base_core.h" +#include "function.h" +#include "string.h" +#include +#include "HW_MCUIO.h" + +#define NAME_VIEW_BIT 0x01 +#define DISABLE_NAME_VIEW_BIT 0xFE +#define MATCH_BIT 0x02 +#define DISABLE_MATCH_BIT 0xFD +#define WHITELIST_BIT 0x04 +#define DISABLE_WHITELIST_BIT 0xFB + +void set_tx_ok_flag(unsigned char flag); +unsigned char get_tx_ok_flag(void); +void basic_delay_us( unsigned short time ); + +struct network_STR +{ + unsigned char cnt; + unsigned char net_seq; + unsigned char st_bit; + unsigned short pwd; + unsigned char reserve[2]; + unsigned char name[13]; + unsigned char name_viewable; + unsigned char send_flag; + unsigned int randspace; + unsigned short send_cnt; +}; + +struct network_STR Network={ + .net_seq=0, + .cnt=60, + .st_bit=0, + .pwd=0x123F, + .name="C100BABCDEFG", + .name_viewable=1, + .send_flag=0, + .randspace=100, + .send_cnt=0, +}; + +unsigned int RandData(unsigned int max) +{ + unsigned char buf[5]; + base_core.get_match_code(buf); + if (max == 0) + { + srand((buf[0]+buf[1])*256+buf[2]+buf[3]); + return 0; + } + else if (max == 1) + { + srand((buf[0]+buf[1])*256+buf[2]+buf[3] + HW_TIMER_Count_get( TIMER5 ));//TIM5->CNT); + return 1; + } + else + { + return (rand() % max); + } +} + +unsigned int network_randtime(unsigned int max) +{ + unsigned int rr, randmax, subtime; + + if(Network.send_cnt==0) + { + RandData(1);// + } + if(Network.send_cnt>250) + { + Network.send_cnt=0; + } + else + { + Network.send_cnt++; + } + + randmax = max / 4;// 4 times per 1S + rr = RandData(randmax); + subtime = randmax + rr - Network.randspace; // + Network.randspace = rr; + return subtime; +} + +void network_wait_rfsendOK(void) +{ + unsigned char status; + unsigned short wait = 500; + + while (wait) + { + if (get_tx_ok_flag()) + return; + basic_delay_us(2); + wait--; + } +} + +/* + +*/ +void network_tx_beacon(void) +{ + unsigned char buf[40]={0}; + unsigned char j; + unsigned short crc; + buf[0] =32; + base_core.get_match_code(buf+1);//tmp1-4 + buf[5] = 0x51; + buf[6] =Network.net_seq; //nowT + if( log_mode_is_WHITELIST) + buf[7]=2; + else + buf[7]=1; + buf[8]=base_core.get_main_rf_chan(); + buf[9]=0; + buf[10]=0; + buf[11]=0; + buf[12]=0; + buf[13]=0; + if(Network.name_viewable) + buf[13]|=NAME_VIEW_BIT; + else + buf[13]&=DISABLE_MATCH_BIT; + + if(base_core.get_run_status() == _STA_FAST_MATCH) + buf[13]|=MATCH_BIT; + else + buf[13]&=DISABLE_MATCH_BIT; + + if(buf[7]==2) + buf[13]|=WHITELIST_BIT; + else + buf[13]&=DISABLE_WHITELIST_BIT; + + buf[14]=(Network.pwd>>8)&0xFF; + buf[15]=(Network.pwd)&0xFF; + + buf[16]=0;buf[17]=0; + memcpy(buf+18, Network.name, 12); + crc = crc16(buf+5, 27); + buf[31]=(crc>>8)&0xFF; + buf[32]=crc&0xFF; + + Network.send_flag=1; + platform.rf_set_freq(0,base_core.get_mainRF_hard_id()); + base_core.send_rf_data(buf,base_core.get_mainRF_hard_id()); + +} + +//4 or 5 times per S +static void network_creat_random_delay(void) +{ + Network.cnt = network_randtime(400);//60;// +} + +void network_polling(unsigned char mode) +{ + if(Network.send_flag) + { + Network.send_flag=0; + platform.rf_set_freq(base_core.get_main_rf_chan(),base_core.get_mainRF_hard_id()); + } + + if(mode) + { + if(Network.cnt) + { + Network.cnt--; + if(Network.cnt==0) + { + network_tx_beacon(); + network_creat_random_delay(); + } + } + } +} + +unsigned char network_get_netseq(void) +{ + return Network.net_seq; +} + +void network_set_netseq_change(void) +{ + Network.net_seq++; +} +unsigned short network_get_pwd(void) +{ + return Network.pwd; +} + +void network_set_pwd(unsigned short pwd) +{ + Network.pwd = pwd; +} + +unsigned char network_get_name(unsigned char *buf, unsigned char buflen) +{ + if(buflen<12) return 0; + memcpy(buf,Network.name,12); + return 1; +} + +unsigned char network_set_name(unsigned char *buf, unsigned char buflen) +{ + if(buflen>12) return 0; + memcpy(Network.name,buf,buflen); + return 1; +} + +unsigned char network_get_nameview(void) +{ + return Network.name_viewable; +} + +void network_set_nameview(unsigned char view) +{ + if(view) Network.name_viewable = 1; + else Network.name_viewable = 0; +} + + + + diff --git b/Base_core/func_src/function_txmsg_beacon.c a/Base_core/func_src/function_txmsg_beacon.c new file mode 100644 index 0000000..1e7ee95 --- /dev/null +++ a/Base_core/func_src/function_txmsg_beacon.c @@ -0,0 +1,195 @@ +/* +*2020.02.05 Gavin +璁剧疆鍙戦佷俊鎭 淇℃爣 + +*/ + + +#include "platform_interface.h" +#include "function_interface.h" +#include "function.h" +#include "base_core_user.h" +#include "string.h" + +#if 0 + +///* +//鍙戦佷俊鎭俊鏍 --鍙傛暟 +//cmdtype =11 +//*/ +//struct txmsg_beacon_para_STR{ +// unsigned char head_addr; //is struct head address,no actual utility +// unsigned char type; //byte4 +// unsigned char times; +// unsigned char slots; +//}; + + +///* +//鍙戦佷俊鎭俊鏍 --鍐呭 +//cmdtype =12 +//*/ +//struct txmsg_beacon_content_STR{ +// unsigned char head_addr; //is struct head address,no actual utility +// unsigned char type; +// unsigned char slotmax; +// unsigned char cur_slot; +// +//}; + + +/* +鍙戦佷俊鎭 淇℃爣 +*/ +struct msg_beacon_STR{ +// //a鍙傛暟 + unsigned char type; +// unsigned char times; +// unsigned char slots; + + //b鍐呭 + unsigned char slotmax; +// unsigned char cur_slot; + unsigned char sdata[255][16]; + +// //c 鍚姩 +// unsigned char specify_or_boardcast; +// unsigned char id_sn[6]; + + //-----NO protocol parameter -------------------- + unsigned char start_stop_flag; + unsigned char cur_slot; + unsigned char datapos; + unsigned char cur_times; +}; +struct msg_beacon_STR msg_beacon; + + +#define MSG_BEACON_SLOT_MAX 20 +#define MSG_BEACON_BOARD_TIMES 10 + +//------------------ 涓巔c鐨勯氫俊 -------------------------------------------- + +void msg_beacon_0x60_process(unsigned char *rxpc) +{ + unsigned char ack_buf[32]; + + switch(rxpc[3]){ + case 11: + break; + + case 12: + if( (rxpc[4] ==1)||(rxpc[4] ==2) ){ //棰樺瀷 + unsigned char cur_slot; + msg_beacon.type =rxpc[4]; + if( (msg_beacon.slotmax =rxpc[5])>MSG_BEACON_SLOT_MAX) + msg_beacon.slotmax =MSG_BEACON_SLOT_MAX; +// msg_beacon.slotmax = (rxpc[5]>MSG_BEACON_SLOT_MAX)?MSG_BEACON_SLOT_MAX:rxpc[5]; + if( (cur_slot =rxpc[6])>MSG_BEACON_SLOT_MAX-1) + cur_slot =MSG_BEACON_SLOT_MAX-1; + memcpy(msg_beacon.sdata[cur_slot],rxpc+7,16); + ack_buf[0] =1; + user__pc_cmd_ack(0x60,12,ack_buf,1); + } + break; + + + case 13: + break; + + default:break; + }//sw +} + + + + + + + +/* +* see keypad protocol section2.4 +*/ +static void send_msg_beacon_sub(void) +{ + unsigned char tmp[64]; + memset(tmp,0,64); + + tmp[0] =32; + base_core.get_match_code(tmp+1); + tmp[5] =0x31; + //tmp[6] =0x31;//6-11 + tmp[12] =msg_beacon.type |(msg_beacon.datapos<<4); + tmp[13] =0; //楂4浣嶏細骞挎挱鍜屾彁浜ゆ暟鎹瘮;浣4浣嶏細绗嚑涓椂搴 + tmp[14] =msg_beacon.slotmax; //slot max + tmp[15] =msg_beacon.cur_slot; //current slot + memcpy(tmp+16,msg_beacon.sdata[msg_beacon.cur_slot],16); + msg_beacon.cur_slot++; + //tmp[32] =0x31; //CRC + base_core.send_rf_data(tmp,base_core.get_mainRF_hard_id()); +} + + +/* +* called by 2.5ms timer isr +* +*/ +void base_tx_keypad_msg_beacon(void) +{ + static unsigned char msg_beacon_count=0; + + if(!msg_beacon.start_stop_flag) return; + + if(++msg_beacon_count>= 13){ + msg_beacon_count=0; + base_core.switch_send_beacon(1); //on basic beacon send + } + else{ + //12涓椂闂寸墖閲屽彧鍙10涓紝涓轰粈涔堬紵 + + base_core.switch_send_beacon(0); //off basic beacon send + + send_msg_beacon_sub(); + if( msg_beacon.cur_slot>=msg_beacon.slotmax){ + //骞挎挱瀹屼竴杞簡 + if(++msg_beacon.cur_times >=MSG_BEACON_BOARD_TIMES){ + base_core.switch_send_beacon(1); //on basic beacon send + msg_beacon.start_stop_flag =0; + } + } + } + +} + + + + + + + + + + +//鍒ゆ柇鏄惁闇瑕佽嚜鍔ㄨ繘鍏ヤ俊鎭俊鏍囧箍鎾 +void msg_beacon_enter_exit(const unsigned char *rxpc) +{ + if (rxpc[3]!=4) return;//鍐欐姇绁ㄤ俊鏍 + if((rxpc[5]==14)&&((rxpc[6]==20)||(rxpc[6]==21)))// 5鏄疢ODE锛14鏄紓姝ユ祴楠 20銆21鏄甫闀块鍨嬪拰绛旀 + { + msg_beacon.cur_times =0; //init send times + msg_beacon.cur_slot =0; //init solt + if(++msg_beacon.datapos>15) //init data pos + msg_beacon.datapos =1; + msg_beacon.start_stop_flag =1; //start + } + else{ + if(msg_beacon.start_stop_flag){ + base_core.switch_send_beacon(1); //on basic beacon send + msg_beacon.start_stop_flag =0; + } + } + +} + + +#endif diff --git b/Base_core/func_src/function_update_keypad.c a/Base_core/func_src/function_update_keypad.c new file mode 100644 index 0000000..f8b00e2 --- /dev/null +++ a/Base_core/func_src/function_update_keypad.c @@ -0,0 +1,842 @@ + +#include "base_core_user.h" +#include "function.h" +#include "string.h" +#include "platform_interface.h" +/* +* see base protocol V0.9.5 section5.4 base download multi-packets +* 甯歌2.4 鎱㈤熺殑閿洏鍥轰欢鍗囩骇鏂瑰紡; 杩樻湁5.8G蹇熼敭鐩樺浐浠跺崌绾фā寮忋 +* +*/ + + +#ifndef A5130 + +#if (!UPDATE_KP_2) +#define UPDATE_KP_CNT 100//80 //鍩虹珯鏀寔涓娆℃渶澶氬崌绾х殑閿洏鏁 + +struct update_STR{ + + //don't change next variable sequence!!!! + unsigned char Hver; + unsigned char Sver[3]; + unsigned char crc[2]; + unsigned char file_len[4]; + //sequence limit over + + //from pc + volatile unsigned char start_end_flag; + + unsigned char downID; //section1 + unsigned char packH; //section2 + unsigned char packL; //section3 + unsigned char pack_cur; //褰撳墠鏁版嵁鍖0-15 + unsigned char data[16][18]; + + volatile unsigned char step; +// volatile unsigned short OKBITS; + unsigned short okbits; + volatile unsigned char wait_timer; //绛夊緟閿洏鍥炲鐨勮鏃跺櫒 + unsigned char re_send_times; //閲嶅彂娆℃暟 + unsigned char re_send_data_times; + + volatile unsigned char pc_confirm_flag; //sdk纭鍑洪敊閿洏鏍囧織 + unsigned char pc_confirm_type; + + volatile unsigned char type_start_stop_data; //0,1 -寮濮/缁撴潫涓嬭浇;2-鏁版嵁涓嬭浇 + + unsigned char idsn_mode; //id or sn + unsigned char idsn[UPDATE_KP_CNT][6]; //store id/sn of kp + unsigned char valid[UPDATE_KP_CNT]; //0-valid; 1-invalid + unsigned char valid_cnt; + + unsigned char kp_counter; //鍗囩骇閿洏鐨勪釜鏁 + volatile unsigned char kp_cur; //褰撳墠閿洏搴忓彿 + + //rx keypad ack + volatile unsigned char keypad_ack_flag; //閿洏鍥炲簲鍩虹珯鏍囧織 + unsigned char keypad_ack_buf[64]; + + void (*send_inquire_to_keypad)(unsigned char); + unsigned char (*process_keypad_ack)(void); + + unsigned char send_data_slice_interval; + unsigned char broadcast_data_re_send_flag; + + //debug only + unsigned int rx_det_err; + unsigned int rx_det_err2; +}; + +struct update_STR update; +static void update_report_info_to_pc(unsigned char kp_seq,unsigned char status); + + + + + +//------------ debug start ---------------------------------------------- +// #define MAX_PKT 10//0 +// #define DBG_UPDATE + +#ifdef DBG_UPDATE +struct debug_update_STR{ + + //start + unsigned short start__ask_kp_cnt[UPDATE_KP_CNT]; + unsigned short start__kp_ack_cnt[UPDATE_KP_CNT]; + + //stop + unsigned short stop__ask_kp_cnt[UPDATE_KP_CNT]; +// unsigned short start__kp_ack_cnt; + + //data + unsigned short data__re_send_times[MAX_PKT]; + unsigned short data__ask_kp_cnt[UPDATE_KP_CNT][MAX_PKT]; + unsigned short data__kp_ack_cnt[UPDATE_KP_CNT][MAX_PKT]; +}; + +struct debug_update_STR debug_update; +#endif + +/* +姣忔寮濮嬪崌绾ф竻鐞嗘墍鏈塪ebug鍙傛暟 +*/ +static void _debug__updata_init(void) +{ + #ifdef DBG_UPDATE + unsigned short i,j; + for(i=0;i=UPDATE_KP_CNT) return; + debug_update.start__ask_kp_cnt[sn]++; + #endif +} + +//瀵规煇涓敭鐩,鏀跺埌瀵瑰惎鍔ㄤ俊鍙风殑鍥炲簲鐨勬鏁 +static void _debug__start__kp_ack_cnt(unsigned char sn) +{ +#ifdef DBG_UPDATE + if(sn>=UPDATE_KP_CNT) return; + debug_update.start__kp_ack_cnt[sn]++; + #endif +} + +//---------------------------------------------------- +//瀵规煇涓敭鐩樺彂閫 鍋滄淇″彿鐨勬鏁 +static void _debug__stop__ask_kp_cnt(unsigned char sn) +{ + #ifdef DBG_UPDATE + if(sn>=UPDATE_KP_CNT) return; + debug_update.stop__ask_kp_cnt[sn]++; + #endif +} + +//------------------ data --------------------------------- +//鏌愪釜鏁版嵁鍖 閲嶅彂鐨勬鏁 +static void _debug__data__re_send_times(void) +{ + #ifdef DBG_UPDATE + debug_update.data__re_send_times[update.packH]++; + #endif +} + +//鏌愪釜閿洏鐨勬煇涓暟鎹寘 璇㈤棶娆℃暟 +static void _debug__data__ask_kp_cnt(unsigned char sn) +{ + #ifdef DBG_UPDATE + if(update.packH>=MAX_PKT) return; + if(sn>=UPDATE_KP_CNT) return; + debug_update.data__ask_kp_cnt[sn][update.packH]++; + #endif +} + + +//鏌愪釜閿洏鐨勬煇涓暟鎹寘 璇㈤棶娆℃暟 +static void _debug__data__kp_ack_cnt(unsigned char sn) +{ + #ifdef DBG_UPDATE + if(update.packH>=MAX_PKT) return; + if(sn>=UPDATE_KP_CNT) return; + debug_update.data__kp_ack_cnt[sn][update.packH]++; + #endif +} + + +//--------------------- debug end ----------------------------- + + +//init +#define _STEP_INIT0 0x00 + +//start stop +#define _STEP_NOTICE_START 0x10 +#define _STEP_NOTICE_ABORT 0x11 +#define _STEP_NOTICE_FINISH 0x12 +#define _STEP_NOTICE_STOP_PROCESS 0x13 + +//data +#define _STEP_BROADCAST_DATA_INIT 0x20 +#define _STEP_BROADCAST_DATA 0x21 +#define _STEP_BROADCAST_DATA_RE 0x22 +//#define _STEP_BROADCAST_DATA_RE_SENDING 0x23 + +//report pc +#define _STEP_KEYPAD_NO_ACK_ERROR 0x0a +#define _STEP_WAIT_PC_CONFIRM_ERROR 0x0b +#define _STEP_THIS_PKT_FINISH 0x0c +#define _STEP_WAIT_PC_CONFIRM_FINISH 0x0d + +//common +#define _STEP_ASK_KEYPAD_CONTINUE 0xc0 +#define _STEP_ASK_KEYPAD_INIT 0xc1 +#define _STEP_ASK_KEYPAD 0xc2 +#define _STEP_WAIT_KEYPAD_ACK 0xc3 + + +/* +* +*/ +#if BASE_TYPE == EVS200 + #define WAITFOR_KEYPAD_ACK_CYCLE 30//12 //绛夊緟姣忎釜閿洏鍥炲鐨勫懆鏈熸暟2.5ms/cycle + #define ASK_KP_TIMES 50//30 //姣忎釜閿洏姣忔閫氫俊鏈澶ц闂敭鐩樼殑娆℃暟 + #define UPDATE_DATA_RE_SEND_TIMES 50//30 //姣忓寘閿洏鍗囩骇鏁版嵁鏈澶氶噸鍙戞鏁 + #define SEND_UPDATE_DATA_INTERVEL 4//6//5 //鍙戦佹瘡鐗囨暟鎹寘鐨勬椂闂撮棿闅 2.5ms +#else + //娌跨敤EA3100 + #define WAITFOR_KEYPAD_ACK_CYCLE 14//10 //绛夊緟姣忎釜閿洏鍥炲鐨勫懆鏈熸暟2.5ms/cycle + #define ASK_KP_TIMES 50//40 //姣忎釜閿洏姣忔閫氫俊鏈澶ц闂敭鐩樼殑娆℃暟 + #define UPDATE_DATA_RE_SEND_TIMES 50//40 //姣忓寘閿洏鍗囩骇鏁版嵁鏈澶氶噸鍙戞鏁 + #define SEND_UPDATE_DATA_INTERVEL 6//4 //鍙戦佹瘡鐗囨暟鎹寘鐨勬椂闂撮棿闅 2.5ms +#endif + +/* +閫氱煡閿洏杩涘叆/閫鍑 鍥轰欢鍗囩骇妯″紡 +杈撳叆锛氳繘鍏ヨ繕鏄鍑猴紝b锛岃鍙戦佺殑閿洏id/sn鐨勬暟缁勪笅鏍 +input: enter/exit, array of offset; +*/ +static void notice_kp_enter_exit_update(unsigned char kp_seq) +{ + unsigned char tmp[33]; + + tmp[0] =0x20; + base_core.get_match_code(tmp+1);//tmp1-4; + tmp[5] =0x40; + if(update.idsn_mode == 1 ){ //see base protocol 5.4 + tmp[6] =update.idsn[kp_seq][0]; //id H + tmp[7] =update.idsn[kp_seq][1]; //id L + memset(tmp+12,0,6);//mem_set(tmp+12,6,0x00); + } + else{ + tmp[6] =0xff; //id H + tmp[7] =0xff; //id L + memcpy(tmp+12,update.idsn[kp_seq],6);//mem_cpy(update.idsn[kp_seq],tmp+12,6); + } + tmp[8] =0x01; //杩涘叆涓嬭浇 + tmp[9] =0x1E; //down type 30 + tmp[10] =0x00; + tmp[11] =update.type_start_stop_data;// enter_exit;//DCMD 1-寮濮嬶紱0-閫鍑 + //瑙佹暀鑲叉柊鐗堣〃鍐冲櫒鍗忚0.91 -6.1 + memcpy(tmp+18,&update.Hver,10);//mem_cpy(&update.Hver,tmp+18,10); +//operation_debug_io(3); + base_core.send_rf_data(tmp,base_core.get_mainRF_hard_id()); + + //test only + if( update.type_start_stop_data) + _debug__start__ask_kp_cnt(update.idsn[kp_seq][5]); + else + _debug__stop__ask_kp_cnt(update.idsn[kp_seq][5]); +} + + +/* +鍩虹珯骞挎挱鏁版嵁缁欐墍鏈夐敭鐩 +input: 鏁版嵁鏁扮粍涓嬫爣 0-15 +*/ +static void broadcast_update_data(unsigned char data_seq) +{ + unsigned char tmp[33]; + + tmp[0] =0x1E; + base_core.get_match_code(tmp+1);//tmp1-4; + tmp[5] =0x40; + tmp[6] =0xff; //骞挎挱 + tmp[7] =0x01; + tmp[8] =0x02; //骞挎挱涓嬭浇鏁版嵁 + tmp[9] =0x1E; //down type + tmp[10] =update.downID; + tmp[11] =update.packH; //鏁版嵁娈 + tmp[12] =data_seq; //鏁版嵁鐗0-15 + memcpy(tmp+13,update.data[data_seq],18);//mem_cpy(update.data[data_seq],tmp+13,18); +//operation_debug_io(6); // + base_core.send_rf_data(tmp,base_core.get_mainRF_hard_id()); +} + + +/* +鍩虹珯璇㈤棶閿洏鏄惁鏀跺埌鍗囩骇鏁版嵁 +杈撳叆锛氶敭鐩榠d/sn鐨勬暟缁勪笅鏍 +*/ +static void ask_keypad(unsigned char kp_seq) +{ + unsigned char tmp[33]; + + tmp[0] =0x1E; + base_core.get_match_code(tmp+1);//tmp1-4; + tmp[5] =0x40; + tmp[8] =0x03; //璇㈤棶鐘舵 + tmp[9] =0x1E; //down type + tmp[10] =update.downID; + tmp[11] =update.packH; //鏁版嵁娈 + + if(update.idsn_mode == 1 ){ //see base protocol 5.4 + tmp[6] =update.idsn[kp_seq][0]; //id H + tmp[7] =update.idsn[kp_seq][1]; //id L +memset(tmp+12,0,6);// mem_set(tmp+12,6,0x00); + } + else{ + tmp[6] =0xff; //id H + tmp[7] =0xff; //id L + memcpy(tmp+12,update.idsn[kp_seq],6);//mem_cpy(update.idsn[kp_seq],tmp+12,6); + } + + base_core.send_rf_data(tmp,base_core.get_mainRF_hard_id()); + + //test only + _debug__data__ask_kp_cnt( update.idsn[kp_seq][5]); + +} + +/* +淇濆瓨閿洏鐨勫洖搴旀暟鎹 +called by 鍩虹珯澶勭悊閿洏杞彂缁檖c鐨勬暟鎹鐞嗗嚱鏁 +return 1-鏈夐敭鐩樺洖 +*/ +unsigned char save_keypad_ack_data(const unsigned char *rxkp) +{ + //鍙湁鍦ㄥ崌绾ч敭鐩樺浐浠舵ā寮忎笅鎵嶆湁鏁堬紱鍖哄埆甯歌鐨勮浆鍙戞暟鎹紝 + if( update.start_end_flag &&(rxkp[1]==0xC0)&& ((rxkp[4]==0x01)||(rxkp[4]==0x03)) ){ + +// if( (rxkp[4]==0x03)&&(rxkp[7] != update.packH) ){ +// update.rx_det_err++; //debug only +// return 0; +// } + + memcpy(update.keypad_ack_buf,rxkp,rxkp[0]); //copy keypad ack data + update.keypad_ack_flag=1; + + //------------------------- + //test only + if(update.type_start_stop_data==2){//data + _debug__data__kp_ack_cnt(update.keypad_ack_buf[15]); + } + else if(update.type_start_stop_data==1){ + + _debug__start__kp_ack_cnt(update.keypad_ack_buf[13]); + } + else{ + } + //----------------- + + return 1; + } + else{ + update.rx_det_err2++; //debug only + return 0; + } +} + + + + +/* +妫娴嬫槸鍚︽敹鍒版寚瀹氶敭鐩樼殑ack +鏀跺埌鐨勯敭鐩樼殑鍥炲簲锛屽苟涓攊d/sn姝g‘ return 1 */ +static unsigned char check_keypad_ack_idsn(unsigned char type) +{ + unsigned char i; + + if(!update.keypad_ack_flag) return 0; + update.keypad_ack_flag =0; + + //骞挎挱寮濮嬭繘鍏ヤ笅杞芥椂鍜屽悗闈笅杞芥暟鎹椂锛岄敭鐩樿繑鍥炴暟鎹腑 SN鐨勪綅缃槸涓嶄竴鏍风殑锛 id鐨勪綅缃浐瀹氬湪byte2 + if(type==1) i=8; + else + i=10; + + switch(update.idsn_mode){ + case 1: //id mode + if( memcmp(update.idsn[update.kp_cur],update.keypad_ack_buf+2,2)==0 ) + return 1; + break; + case 2: //4byte SN + if( memcmp(update.idsn[update.kp_cur]+2,update.keypad_ack_buf+2+i,4)==0 ) + return 1; //鍚4byte SN + else + break; + case 3: //6byte SN + if( memcmp(update.idsn[update.kp_cur],update.keypad_ack_buf+i,6)==0 ) + return 1; + break; + + default:break; + }//sw + + return 0; +} + + +/* +鑾峰彇鏇存柊鐘舵 + 0- 娌℃湁杩涘叆鏇存柊妯″紡 +*/ +unsigned char update_get_status(void) +{ + return update.start_end_flag; +} + + +//-------------------------------- 涓巔c 涔嬮棿鐨勯氫俊 ----------------------------------------------- +/* +鍩虹珯鍙戦佸崌绾ц繃绋嬩腑鐨勭姸鎬佺粰PC +*/ +static void update_report_info_to_pc(unsigned char kp_seq,unsigned char status) +{ + unsigned char tmp[32]; + if(kp_seq>= UPDATE_KP_CNT) return;//error 闃叉鏁扮粍婧㈠嚭 + tmp[0] =24; + tmp[1] =0xE1; + tmp[2] =base_core.get_id();//get_base_id(); + tmp[3] =22; + tmp[4] =6; + tmp[5] =0;//packH + tmp[6] =0;//packL + tmp[7] =status; //閿欒鎴栬呮槸閫氱煡/鏁版嵁宸茬粡鍙戦佸畬浜嗭紒 + if(tmp[7]==1)//鎶ュ憡瀹屾垚鐘舵佹椂锛屼笉鍏虫敞id/SN锛屼究浜庤皟璇曠悊瑙 +memset(tmp+8,0xff,6);// mem_set(tmp+8,6,0xff); + else + memcpy(tmp+8,update.idsn[kp_seq],6);//mem_cpy(update.idsn[kp_seq],tmp+8,6); //鎶ュ憡閿欒鏃跺繀椤诲寘鍚玦d/SN + + base_core.send_data_to_pc(tmp);//user__base_tx_to_pc_sub(tmp); +} + + + +/* +鍩虹珯鍗囩骇閿洏鍥轰欢涔 鍩虹珯涓巔c涔嬮棿鐨勯氫俊鍏ュ彛锛屼篃鏄崌绾у姛鑳界殑鎬诲叆鍙o紒 +call by rx_pc_0x61 +娴佺▼锛 pc涓嬭浇鍚嶅崟 + pc鍛婄煡鍩虹珯鍙互寮濮嬮氱煡閿洏杩涘叆涓嬭浇 + pc寮濮嬪彂閫佸崌绾ф暟鎹 + 鐒跺悗鍩虹珯杩涘叆骞挎挱鍗囩骇鏁版嵁 +*/ +void update_kp_enter(const unsigned char *rx_pc) +{ + switch(rx_pc[4] ){ + case 1: + update.idsn_mode =rx_pc[5]; + memcpy(&update.Hver,rx_pc+8,10);//mem_cpy(rx_pc+8,&update.Hver,10); + + if(rx_pc[7]==1){ //a start update + update.type_start_stop_data=1;//update.type_cmd_data =1; + update.start_end_flag=1; + //memset(update.valid,0,UPDATE_KP_CNT); //clear valid flag + if(update.valid_cnt < UPDATE_KP_CNT) + memset(update.valid+update.valid_cnt,0,UPDATE_KP_CNT-update.valid_cnt); + update.step =_STEP_NOTICE_START; + _debug__updata_init(); + update.start_end_flag=1; //鍗囩骇鍔熻兘鎬诲紑鍏!! + } + else if(rx_pc[7]==0){ //b,finish update + update.type_start_stop_data=0;//update.type_cmd_data =0; + update.step =_STEP_NOTICE_FINISH; + } + else{ //c, stop update + update.type_start_stop_data=0;//update.type_cmd_data =0; + update.step =_STEP_NOTICE_ABORT;//鍋滄鍛戒护 + } + + user__pc_cmd_ack(0x61,22,rx_pc+4,26);//update_ack_pc_0x61(rx_pc); //responce sdk + break; + + case 2:{ //download id/sn list of keypad + unsigned char i,current; + update.kp_counter =rx_pc[5]; + update.valid_cnt =rx_pc[5];//鍒濆鍖栨湁鏁堜釜鏁 + if(update.kp_counter >UPDATE_KP_CNT ) break; //瓒呭嚭鏈澶ч敭鐩樹釜鏁 error ??濡備綍鎶ュ憡姝ら敊璇? + //姣忔鍙戦8涓6瀛楄妭琛ㄥ崟 + current = (rx_pc[6]<<3); + //if( current >= UPDATE_KP_CNT-8) break;//error 闃叉鏁扮粍婧㈠嚭 + for(i=0;i<8;i++){ + if(current+i >= UPDATE_KP_CNT) break; //瑙e喅100鍙敭鐩樻渶鍚4鍙棤娉曡繘鍏ュ崌绾х殑闂 + memcpy(update.idsn[current+i],&rx_pc[7+i*6],6); + update.valid[current+i] =1; + } + } + + user__pc_cmd_ack(0x61,22,rx_pc+4,26);//update_ack_pc_0x61(rx_pc); + break; + + case 4://down update data + update.downID =rx_pc[6]; + update.packH =rx_pc[7]; + update.packL =rx_pc[8]; + if(update.packL >=16) break;//error 闃叉鏁扮粍婧㈠嚭 + memcpy(update.data[update.packL],rx_pc+9,18);//mem_cpy(rx_pc+9,update.data[update.packL],18);//16bytes data +2bytes crc + break; + + case 5://涓鍖呮暟鎹紶杈撳畬浜嗭紝鍙互寮濮嬪悜閿洏骞挎挱鏁版嵁浜嗭紒 + + update.type_start_stop_data=2; + update.step =_STEP_BROADCAST_DATA_INIT; + break; + + case 6: //confirm report data from pc + update.pc_confirm_flag=1; + update.pc_confirm_type =rx_pc[7]; + break; + + default:break; + }//sw +} + + + +//----------------------------------------------------------------------------- +/* +* 鏌ユ壘涓嬩竴涓敭鐩橈細 +* return 1-娌℃湁閿洏浜 +* return 0-鍒囨崲鍒颁笅涓涓敭鐩 +*/ +static unsigned char next_keypad(void) +{ + do{ + if( update.kp_cur+1 >=update.kp_counter){ + return 1; + } + + update.kp_cur++; + if( update.valid[update.kp_cur]==1){ //if( update.valid[update.kp_cur]==0){ + return 0; + } + }while(1); +} + + +/* +* 澶勭悊璇㈤棶骞挎挱鍚仠鍛戒护鍚庡搴旂殑閿洏ack +* 涓巔rocess_data_ack鍑芥暟淇濇寔缁熶竴鎰忎箟鐨剅eturn鍊硷紱 +*/ +static unsigned char process_notice_ack(void) +{ + return check_keypad_ack_idsn(1); +} + + +/* +* 澶勭悊璇㈤棶骞挎挱鍗囩骇鏁版嵁鍚庡搴旂殑閿洏ack +*涓巔rocess_notice_ack鍑芥暟淇濇寔缁熶竴鎰忎箟鐨剅eturn鍊硷紱 +*/ +static unsigned char process_data_ack(void) +{ + unsigned char i; + unsigned short okbit,dist_okbit=0xffff; + + if(!check_keypad_ack_idsn(2)) return 0; + + update.okbits = (update.keypad_ack_buf[9]<<8) + update.keypad_ack_buf[8];//record un-recevice data;all 16packets + +// for(i=0;i<=update.packL;i++) //Notice:packL=0-15 +// dist_okbit &= ~(1<= UPDATE_DATA_RE_SEND_TIMES){//閽堝鏌愪釜閿洏锛1涓暟鎹寘鏈澶氬彂閫20娆 + update.re_send_data_times=0; + return 4; //error; + } + else + return 3; //not all data slot; + } +} + + + +/* +* 涓庨敭鐩樼殑浜や簰澶勭悊 +*/ +unsigned char update_kp_progress(void) +{ + switch(update.step){ + + /*----------------------- common start-------------------------------- + * part0:: common锛氬熀绔欏彂閫佽闂暟鎹紝閿洏鏀跺埌鍚庡氨鍥炲; + * 鏈夋纭洖搴: + * 娌℃湁鏀跺埌姝g‘鍥炲簲: + */ + case _STEP_ASK_KEYPAD_INIT: + update.kp_cur=0; + + case _STEP_ASK_KEYPAD_CONTINUE: + if( (update.valid[update.kp_cur]==0) && next_keypad() ){//if( (update.valid[update.kp_cur]==1) && next_keypad() ){//鏃犳晥閿洏涓嶅啀璇㈤棶!! + update.step =_STEP_THIS_PKT_FINISH;//鎵鏈夐敭鐩橀兘璇㈤棶瀹屾瘯浜 + break; + } + update.re_send_times=0; + update.wait_timer=0; + update.step =_STEP_ASK_KEYPAD; + //notice:姝ゅ娌℃湁break!!!! + + case _STEP_ASK_KEYPAD://鍙戦佽闂氱煡 + //init rx keypad parameter锛侊紒锛 + update.keypad_ack_flag=0; + memset(update.keypad_ack_buf,0,20); + update.keypad_ack_buf[8]=0xff; + update.keypad_ack_buf[9]=0xff; + //load send interface + update.send_inquire_to_keypad(update.kp_cur); + update.step =_STEP_WAIT_KEYPAD_ACK; + break; + + case _STEP_WAIT_KEYPAD_ACK://绛夊緟閿洏鍥炲簲 + switch(update.process_keypad_ack()){ + case 0: //閿洏娌℃湁鍥炲簲 + if(++update.wait_timer =ASK_KP_TIMES){//娌℃湁绛夊埌灏遍噸鍙戣闂紝鏈澶氶噸鍙 娆 + update.re_send_times=0; + update.step =_STEP_KEYPAD_NO_ACK_ERROR;//閲嶅彂娆℃暟鍒帮紝error + } + else + update.step =_STEP_ASK_KEYPAD; //缁х画璇㈤棶褰撳墠閿洏 + break; + + case 1://鏀跺埌閿洏鐨勬纭洖搴 + if(next_keypad()){ //is last keypad + update.step =_STEP_THIS_PKT_FINISH;//鎵鏈夐敭鐩橀兘璇㈤棶瀹屾瘯浜 + } + else{ +// //寮濮嬭闂笅涓涓敭鐩樻椂鍒濆鍖栵紱 +// update.re_send_times=0; +// update.wait_timer=0; +// update.re_send_data_times=0; + update.step =_STEP_ASK_KEYPAD_CONTINUE;//寮濮嬭闂笅涓涓敭鐩 + } + break; + + //case 3,case 4,used to data only + case 3: + update.broadcast_data_re_send_flag =1; + update.step =_STEP_BROADCAST_DATA_RE;//閿洏娌℃湁鏀跺畬鎵鏈夌殑鏁版嵁鐗囧氨閲嶅彂鎵鏈夋暟鎹墖 + break; + case 4: + update.step =_STEP_KEYPAD_NO_ACK_ERROR; + break; + + default:break; + }//sw + break; + //-------------------- common end ----------------------------------------- + + + /* part1-0: stop and abort ;; + * 鐗规畩澶勭悊 缁堟鍜屽仠姝㈠懡浠わ紝骞挎挱涔嬪悗涓嶅啀璇㈤棶閿洏锛屽熀绔欑洿鎺ラ鍑洪敭鐩樺浐浠跺崌绾фā寮忋 + */ + case _STEP_NOTICE_ABORT: + case _STEP_NOTICE_FINISH: + update.kp_cur=0; + update.re_send_times=0; + update.step =_STEP_NOTICE_STOP_PROCESS; + + case _STEP_NOTICE_STOP_PROCESS: + if(++update.re_send_times<50){ //瀵规瘡涓敭鐩樺彂閫50娆″仠姝㈠懡浠 + notice_kp_enter_exit_update(update.kp_cur); + } + else{ + update.re_send_times=0; + if(++update.kp_cur >=update.kp_counter){ + update_report_info_to_pc(update.kp_cur,1); //report finish + update.start_end_flag =0;//鍩虹珯閫鍑洪敭鐩樺浐浠跺崌绾фā寮忋 + update.step =_STEP_INIT0; + } + } + break; + + + /* part1-1:start 骞挎挱鍚姩鍛戒护 + */ + case _STEP_NOTICE_START: + update.send_inquire_to_keypad =notice_kp_enter_exit_update; + update.process_keypad_ack =process_notice_ack; + update.step= _STEP_ASK_KEYPAD_INIT; + break; + + /* part 2: send upgrade data + */ + case _STEP_BROADCAST_DATA_INIT: //姣忓寘鏁版嵁鍙戦佷粠杩欓噷寮濮 + update.re_send_data_times=0; + update.send_inquire_to_keypad =ask_keypad; + update.process_keypad_ack =process_data_ack; + update.broadcast_data_re_send_flag =0; + + update.pack_cur =0; + update.step= _STEP_BROADCAST_DATA; + //姝ゅ娌℃湁break!!! + + case _STEP_BROADCAST_DATA: //姣忓寘鏁版嵁鏈塏鐗囷紝姣忕墖鍙戦佷粠杩欓噷寮濮 SEND_UPDATE_DATA_INTERVEL + if(++update.send_data_slice_interval <=SEND_UPDATE_DATA_INTERVEL) break; + + if( update.pack_cur<=update.packL){//broadcast this packet,then pointer next packet; + broadcast_update_data(update.pack_cur); + update.pack_cur++;//鎸囧悜涓嬩竴鏉℃暟鎹 + update.send_data_slice_interval=0; + } + else{//鏈鏁版嵁鍧楀彂閫佸畬鎴; + _debug__data__re_send_times(); +// if(update.broadcast_data_re_send_flag) +// update.step= _STEP_ASK_KEYPAD_CONTINUE; +// else + update.step= _STEP_ASK_KEYPAD_INIT; + } + break; + + /*part2-2 16鐗囨暟鎹病鏈夋敹榻, 閲嶅鍙戦佸綋鍓嶆墍鏈夋暟鎹寘, + 鍙戦佸畬姣曞悗瑕佷粠褰撳墠閿洏寮濮嬭闂,鑰屼笉鏄粠kp_cur=0寮濮 */ + case _STEP_BROADCAST_DATA_RE: //閲嶅彂鏁版嵁鍖呬粠姝ゅ紑濮 + //update.pack_cur =0; + //update.step= _STEP_BROADCAST_DATA; + if( update.okbits ==0){//add by Gavin20210518,澶勭悊寮傚父; + update.okbits =0xffff; + } + + if(++update.send_data_slice_interval <=SEND_UPDATE_DATA_INTERVEL) break; + for(unsigned char i=0;i<16;i++){ + if( ((update.okbits>>i)&0x01)==0)continue;//find re-send + update.okbits &= ~(1<= 50* 20)&& +// (update.step!=_STEP_NOTICE_ABORT )&& (update.step!=_STEP_NOTICE_STOP_PROCESS ) +// ){ +// update.type_start_stop_data=0;// stop cmd +// update.step = _STEP_NOTICE_ABORT; +// } +// } +} + +#endif + +#endif diff --git b/Base_core/func_src/function_update_keypad_5G8.c a/Base_core/func_src/function_update_keypad_5G8.c new file mode 100644 index 0000000..03ad820 --- /dev/null +++ a/Base_core/func_src/function_update_keypad_5G8.c @@ -0,0 +1,634 @@ +/* +* This document is used to 5.8G keypad firmware update. +* main process: a, sdk send cmd +* +* 5.8G transfer speed faster then 2.4G锛 +* we can use other methods(protocol) to implement 5.8Gkeypad firmware upgrade; +*/ + + +#include "base_core_user.h" +#include "platform_interface.h" +#include "function.h" +#include "string.h" + +#ifdef A5130 + +#define UPDATE_KP_CNT 30 + + +#define C_STEP_INIT 0 +#define C_STEP_NOTICE_1 1 +#define C_STEP_NOTICE_0 2 +#define C_STEP_NOTICE_RE 22 +#define C_STEP_NOTICE_EXCUTE 11 +#define C_STEP_DATA 4 + + + + +struct update_STR{ + //don't change next variable sequence!!!! + unsigned char Hver; //byte[8] + unsigned char Sver[3]; + unsigned char crc[2]; + unsigned char file_len[4]; + //sequence limit over + + //data info + unsigned char downID; //section1 + unsigned char packH; //section2 + unsigned char packL; //section3 + unsigned char firmware[8][34]; //keypad firmware data + + void (*send_function)(const unsigned char *,unsigned char id); + volatile unsigned char control_step; + unsigned char re_send_times; //閲嶅彂娆℃暟 + unsigned char valid_cnt; + unsigned char current_kp; + unsigned char start_end_flag; + + /* 涓轰簡渚夸簬鍐呭瓨澶嶅埗锛屾病鏈変娇鐢ㄥ涓嬮敭鐩樼粨鏋勪綋锛岃屾槸鐢ㄧ嫭绔嬫暟缁 + struct kp_STR{ + unsigned char sn[4]; + unsigned char result; + }; + struct kp_STR kp[UPDATE_KP_CNT]; + */ + unsigned char sn_list[UPDATE_KP_CNT][4]; + unsigned char result[UPDATE_KP_CNT]; + + unsigned char special_sn_list[UPDATE_KP_CNT][4]; + unsigned char special_mode_flag; + unsigned char special_sn_count; + + unsigned short sdk_link_timeout; + unsigned char check_sdk_link_flag; +}; +struct update_STR update; + + +/* +2019.12.04 瀹炴祴 delay(500) =500us; +鐜锛氫富棰168MHz,鍏抽棴涓柇,IO鍙栧弽鐢ㄧず娉㈠櫒娴嬭瘯!! +鐢变簬GPIO鏃犳硶鍝嶅簲 delayus(1)锛屾墍浠ュ疄闄呮祴璇昫elay(500) =500us */ +void upate_delay_us( unsigned short time ) +{ + unsigned short i = 0; + while( time-- ){ + i = 30; + while( i-- ) ; + } +} + +/* 2020.12.14 澧炲姞閿洏鍗囩骇杩囩▼涓璼dk鏂紑鑰屽熀绔欐棤娉曡嚜鍔ㄩ鍑哄埌姝e父妯″紡鐨勯棶棰橈紱 +* 鑰冭檻鍒板崌绾ц繃绋嬩腑涓嶅悓闃舵锛宻dk閫氫俊棰戠巼涔熶笉涓鏍;绠鍗曠殑瀹氭椂澶勭悊鍙兘浼氳鍒ゆ柇; +*/ +void set_sdk_link_flag(unsigned char stat) +{ + update.check_sdk_link_flag = stat; +} + +unsigned char get_sdk_link_flag(void) +{ + return update.check_sdk_link_flag; +} + +//called by BASE send ack to sdk; +void set_sdk_link_timeout(unsigned short time) //time* 2.5ms // +{ + update.sdk_link_timeout = time; + set_sdk_link_flag(1); +} + + +/* +* called by 2.5ms loop +*/ +unsigned char check_sdk_timeout(void) +{ + if( get_sdk_link_flag() ==0) return 0; + + if(update.sdk_link_timeout){ + update.sdk_link_timeout--; + } + else{ + if( base_core.get_send_beacon() ==0){ //turn on if the status is off; + base_core.switch_send_beacon(1); + update.control_step =C_STEP_INIT; + } + } + + return 0; +} + + + + + + +/*-------------------------- PC --------------------- +* base respond sdk command*/ +static void update_ack_pc(const unsigned char *rx_pc) +{ + unsigned char tmp[64]; + set_sdk_link_timeout(200); + tmp[0] = (rx_pc[0]>64)?64:rx_pc[0]; + + memcpy(tmp+2,rx_pc+2,60);// mem_cpy(rx_pc+2,tmp+2,60); + tmp[1] =0xE1; + base_core.send_data_to_pc(tmp); +} + +/* after acomplish communicate with keypad, +* base report status to SDK active; */ +static void base_report_status(unsigned char status) +{ + unsigned char tmp[24]; + tmp[0] =24; + tmp[1] =0xE1; + tmp[2] =base_core.get_id();//get_base_id(); + tmp[3] =22; + tmp[4] =6; + tmp[5] =0;//packH + tmp[6] =0;//packL + tmp[7] =status; //閿欒鎴栬呮槸閫氱煡/鏁版嵁宸茬粡鍙戦佸畬浜嗭紒 + memset(tmp+8,0xff,6);//mem_set(tmp+8,6,0xff); + set_sdk_link_timeout(200); + base_core.send_data_to_pc(tmp); +} + +/* after receive feedback from the keypad on the end signal, +* base call this function to report the keypad status actively to sdk; */ +static void base_report_result(unsigned char status) +{ + unsigned char i,tmp[1024]; + tmp[0] =158; + tmp[1] =0xE1; + tmp[2] =base_core.get_id();//get_base_id(); + tmp[3] =22; + tmp[4] =6; + tmp[5] =0;//packH + tmp[6] =0;//packL + tmp[7] =update.valid_cnt; + + for(i=0;iUPDATE_KP_CNT ){ //if( (update.valid_cnt =get_link_queue_sn(&update.sn_list[0][0])) >UPDATE_KP_CNT ){ + update.valid_cnt =UPDATE_KP_CNT; + } + update.control_step =C_STEP_NOTICE_1; + } + else if(rx_pc[7] ==0){//exit download + update.start_end_flag=0; + update.control_step =C_STEP_NOTICE_0; + } + //update.special_mode_flag=0; //榛樿骞挎挱妯″紡 + memset(update.result,0,UPDATE_KP_CNT);//mem_set(update.result,UPDATE_KP_CNT,0);//clear result record + memcpy(&update.Hver,rx_pc+8,10); //mem_cpy(rx_pc+8,&update.Hver,10); + update_ack_pc(rx_pc); + break; + + case 2://download id/sn list 涓嬭浇id/sn琛ㄥ崟 //add by 20191224 + if( (rx_pc[5]<=UPDATE_KP_CNT)&&(rx_pc[6]<3) ){ + unsigned char i; + update.special_sn_count =rx_pc[5]; + for(i=0;i<10;i++){ + memcpy(update.special_sn_list[rx_pc[6]*10+i],rx_pc+7+i*4,4);//mem_cpy(rx_pc+7+i*4,update.special_sn_list[rx_pc[6]*10+i],4); + }//for + } + update_ack_pc(rx_pc); + break; + + case 4://download keypad data 涓嬭浇鍏蜂綋鏁版嵁 + update.downID =rx_pc[6]; + update.packH =rx_pc[7]; + update.packL =rx_pc[8]; + if(update.packL >=8) break;//error 闃叉鏁扮粍婧㈠嚭 + memcpy(update.firmware[update.packL],rx_pc+9,34);//mem_cpy(rx_pc+9,update.firmware[update.packL],34); + update_ack_pc(rx_pc); + + //test only + if( update.packL>=7){ + //update.rx_256_count++; //test only + update.control_step=C_STEP_DATA; + } + break; + + case 5://packet download finish,this time 鏈鏁版嵁涓嬭浇瀹屾垚 + break; + case 6://PC confirm base report status 纭鍩虹珯涓婃姤鐨勭姸鎬 + break; + default: + break; + }//switch +} + + + + + + + + +/*---------------------------------- TX keypad ------------------------------------------------------------------- +* broadcast SN three times; +*this format compatible with the normal voice communication +input : 瑕佸彂閫佺殑閿洏淇℃伅 */ +static void broadcast_SN(const unsigned char *key_info) +{ + unsigned char tmp[64],i; + unsigned short crc; + memset(tmp,0,sizeof(tmp)/sizeof(unsigned char));//mem_set(tmp,sizeof(tmp)/sizeof(unsigned char),0); + + //3byte match code,1byte net id; + tmp[0] =64;//32; + base_core.get_match_code(tmp+1); + tmp[5] = 0x12;//0x11;//difference in normal voice + + for(i=0;i<10;i++){ + tmp[13+i*5] = key_info[0+i*4]; + tmp[14+i*5] = key_info[1+i*4]; + tmp[15+i*5] = key_info[2+i*4]; + tmp[16+i*5] = key_info[3+i*4]; + tmp[17+i*5] = 0x00; + } + + //绗竴娆 + tmp[6] = 1; + //crc =crc16(tmp+4,60); +// tmp[62] = crc>>8; +// tmp[63] = crc&0xff; + platform.rf_5G8_load_send_data(tmp+1,64,base_core.get_mainRF_hard_id());//A5130_send_buf(tmp,64); + upate_delay_us(50); + //绗簩娆 + tmp[6] = 2; + //crc =crc16(tmp+4,60); +// tmp[62] = crc>>8; +// tmp[63] = crc&0xff; + platform.rf_5G8_load_send_data(tmp+1,64,base_core.get_mainRF_hard_id());//A5130_send_buf(tmp,64); + upate_delay_us(50); + //绗笁娆 + tmp[6] = 3; + //crc =crc16(tmp+4,60); +// tmp[62] = crc>>8; +// tmp[63] = crc&0xff; + platform.rf_5G8_load_send_data(tmp+1,64,base_core.get_mainRF_hard_id());//A5130_send_buf(tmp,64); +} + + + +/* +*broadcast the start/stop command to keypad, no SN id specified! +*input: +//cmd -start or stop +*type -enter or exit ? +*/ +//static void broadcast_control_cmd(unsigned char start_exit,unsigned char *kp_sn) +static void broadcast_control_cmd(unsigned char start_exit) +{ + unsigned char tmp[64+1];///20191226//tmp buffer+1 for the new keypad upgrade procotol,that longth is 64byte,but tmp[0] is used save length + unsigned char i; + + tmp[0] =64; + base_core.get_match_code(tmp+1);//tmp1-4; + tmp[5] =0x40; + +// tmp[6] =0x00; //broadcast +// tmp[7] =0x00; +// mem_set(tmp+12,6,0x00); //6bytes + + tmp[8] =0x01; //fix + tmp[9] =0x1E; //down type 30 + tmp[10] =0x00; + tmp[11] =start_exit;//DCMD 1-寮濮嬶紱0-閫鍑 + //瑙佹暀鑲叉柊鐗堣〃鍐冲櫒鍗忚0.91 -6.1 + memcpy(tmp+18,&update.Hver,10);//mem_cpy(&update.Hver,tmp+18,10); + + tmp[31] =0x00; //CRC + tmp[32] =0x00; + + + switch(update.special_mode_flag){ + case 0: + tmp[6] =0x00; //broadcast + tmp[7] =0x00; + memset(tmp+12,0x00,6); //mem_set(tmp+12,6,0x00); //6bytes + platform.rf_5G8_load_send_data(tmp+1,64,base_core.get_mainRF_hard_id()); + platform.rf_5G8_load_send_data(tmp+1,64,base_core.get_mainRF_hard_id()); + + break; + + case 1: //id? + break; + + case 2://special sn + tmp[6] =0xff; //spciel + tmp[7] =0xff; + + for(i=0;i=update.special_sn_count) ){ + platform.rf_5G8_load_send_data(tmp+1,64,base_core.get_mainRF_hard_id()); + upate_delay_us(100); + } + }//for + + break; + } //sw + + +// platform.rf_5G8_load_send_data(tmp+1,64,base_core.get_mainRF_hard_id()); +// platform.rf_5G8_load_send_data(tmp+1,64,base_core.get_mainRF_hard_id()); +} + + +/* +* broadcast 256bytes data to all keypad; +*/ +static void broadcast_data256(unsigned short pkt_cnt) +{ + unsigned char tmp[64]; + unsigned short i; + + tmp[0] =64; + base_core.get_match_code(tmp+1);//tmp1-4; + tmp[5] =0x40; + tmp[6] =0x00;//0xff; //骞挎挱 + tmp[7] =0x00;//0x01; + tmp[8] =0x02; //骞挎挱涓嬭浇鏁版嵁 + tmp[9] =0x1E; //down type + tmp[10] =update.downID; + tmp[11] =update.packH; //鏁版嵁娈 + + for(i=0;i<8;i++){ + tmp[12] =i; //鏁版嵁鐗0-8 + memcpy(tmp+13,update.firmware[i],34);//mem_cpy(update.firmware[i],tmp+13,34); + base_core.send_rf_data(tmp,base_core.get_mainRF_hard_id()); + upate_delay_us(200);//delay_us(200);//delay_us(500); + }//for +} + +/* +send 256byte: split 8times, 32bytes every send; +re-send 2times ;*/ +static void broadcast_data256_2(unsigned short pkt_cnt) +{ + unsigned char tmp[64]; + unsigned short i; + + tmp[0] =64; + base_core.get_match_code(tmp+1);//tmp1-4; + tmp[5] =0x40; + tmp[6] =0x00;//0xff; //骞挎挱 + tmp[7] =0x00;//0x01; + tmp[8] =0x02; //骞挎挱涓嬭浇鏁版嵁 + tmp[9] =0x1E; //down type + tmp[10] =update.downID; + tmp[11] =update.packH; //鏁版嵁娈 + + for(i=0;i<8;i++){ + tmp[12] =i; //鏁版嵁鐗0-8 + memcpy(tmp+13,update.firmware[i],34);//mem_cpy(update.firmware[i],tmp+13,34); + base_core.send_rf_data(tmp,base_core.get_mainRF_hard_id()); + upate_delay_us(200);//delay_us(200); + base_core.send_rf_data(tmp,base_core.get_mainRF_hard_id()); + upate_delay_us(200);//delay_us(200); + }//for +} + + +/* +send start info and normal poll keypad +* add "unsigned char id" for compatibility the platform.rf_5G8_send_multi_frame() function intput parameter! +*/ +static void broadcast_start_cmd(const unsigned char *sn,unsigned char id) +{ + broadcast_control_cmd(1); //enter download + broadcast_SN(sn); +} + +/* +send stop info and normal poll keypad +* add "unsigned char id" for compatibility the platform.rf_5G8_send_multi_frame() function intput parameter! +*/ +static void broadcast_end_cmd(const unsigned char *sn,unsigned char id) +{ + broadcast_control_cmd(0); //exit download + broadcast_SN(sn); +} + + +//--------------- Rx ack of keypad ----------------------------- +/* +rcv keypad ack data; data type is 0xC0 +called by 0xC0 */ +unsigned char save_keypad_ack_data(const unsigned char *rx_kp) +{ + unsigned char i; + +//// update.test_flag =1; +// //鏌ユ壘鏀跺埌鐨勯敭鐩樺湪sn list涓殑浣嶇疆 +// for(i=0;i=update.valid_cnt) return 0; +// +// //b, record keypad result; +// update.result[i] = rx_kp[14]; + + + //鎺ユ敹閿洏鐨勫弽棣 + //if( update.control_step !=C_STEP_NOTICE_EXCUTE ) return 0; + + + if(update.start_end_flag==0){ + for(i=0;i=UPDATE_KP_CNT) return 0; + + platform.rf_5G8_send_multi_frame(update.send_function, &update.sn_list[update.current_kp][0], base_core.get_mainRF_hard_id()); + + if( update.current_kp+10 0){//閲嶅娆℃暟杩樻病鍒 + update.re_send_times--; + update.control_step =C_STEP_NOTICE_EXCUTE; + } + else{ + //---------------閲嶅娆℃暟鍒颁簡 + if(update.start_end_flag){ + //姝ゅ鍙互璁$畻 鏈夊灏戦敭鐩樺寮濮嬪崌绾т俊鍙峰仛浜嗗洖搴 + + platform.delay_ms(500); + base_report_status(1); + update.control_step =C_STEP_INIT; + } + else{ + //姝ゅ鍙互鐪嬪埌閿洏鍙嶉鍏跺崌绾х粨鏋滐紒 + + base_report_result(1); + base_core.switch_send_beacon(1); //turn on send beacon + update.control_step =C_STEP_INIT; + } + //-------------- + break; + } + //鐗瑰埆娉ㄦ剰锛屾澶勬病鏈 break; + + case C_STEP_NOTICE_EXCUTE://polling min send modual ,interval is 32.5ms + update.control_step =(update_process_sub())?C_STEP_NOTICE_EXCUTE:C_STEP_NOTICE_RE; + break; + + // type 2: + case C_STEP_DATA://鍙戦256瀛楄妭鏁版嵁 + broadcast_data256(1); + broadcast_data256(1); + broadcast_data256(1); + broadcast_data256_2(1); + platform.delay_ms(8);//涓椤靛彂瀹屼簡锛屽欢鏃剁暀缁欓敭鐩樺啓flash鐨勬椂闂达紒锛 + + base_report_status(1); + update.control_step =C_STEP_INIT; + break; + + default:break; + }//switch + + //2020.12.14 add by Gavin + check_sdk_timeout(); + + return 1; +} + + +/* +* 涓轰簡鍏煎鎺ュ彛鑰屽鍔狅紝5.8G閿洏鍥轰欢鍗囩骇娌℃湁鐢!!! +*/ +unsigned char update_get_status(void) +{ + + return 0; +} + + + +/* +* 妫娴嬪熀绔欏拰sdk鐨勮繛鎺ョ姸鎬; +*瑙e喅鍏抽棴sdk鍚庯紝鍩虹珯鍜岄敭鐩樻棤娉曢鍑哄崌绾х姸鎬佺殑闂; +*called by 20ms +*/ +unsigned short update_sdk_connect_cnt; + +void update_monitor_sdk_connect(void) +{ + if( !update_get_status() ) return; + if( base_core.get_sdk_connect_status() ) + update_sdk_connect_cnt=0; + else{ +// if( (++update_sdk_connect_cnt>= 50*4)&& +// (update.step!=_STEP_NOTICE_ABORT )&& (update.step!=_STEP_NOTICE_STOP_PROCESS ) +// ){ +// update.type_start_stop_data=0;// stop cmd +// update.step = _STEP_NOTICE_ABORT; +// } + } +} + + + + + + + +#endif + + + + diff --git b/Base_core/func_src/function_upload_multipkt.c a/Base_core/func_src/function_upload_multipkt.c new file mode 100644 index 0000000..f208278 --- /dev/null +++ a/Base_core/func_src/function_upload_multipkt.c @@ -0,0 +1,296 @@ +/* +涓婁紶澶氬寘澶勭悊锛 +鍩虹珯鍗忚V0.95锛岀5.5鍩虹珯涓婁紶澶氬寘 +閿洏鍗忚V0.99-11,绗洓绔犱笂浼犲鍖; + +*/ + + +#include "platform_interface.h" +#include "function_interface.h" +#include "function.h" +#include "base_core_user.h" +#include "string.h" + + + + + + +#if 0 +/* +* see base protocol V0.95 section5.5 鍩虹珯澶氬寘涓婁紶 +*/ +struct upload_multipkt_STR{ + unsigned char mode_status; //byte4 + unsigned char id_sn_mode; + unsigned char id_sn[6]; + unsigned char pkt_type; //byte12 + unsigned char pkt_id; //byte13 + + //-above parameter is protocol ;next is user define------------ + unsigned char packH; + unsigned char packL; + + unsigned char pack_cur; + unsigned short pack_16bits; + unsigned short pack_total; + unsigned char keypad_ack_flag; + unsigned char start_stop_flag; + +}; +struct upload_multipkt_STR up_multipkt; + + +/* +* process sdk setting data,then ack +*/ +void upload_multipkt_0x61_process(unsigned char *rxpc) +{ + unsigned char ack_buf[2]; + + memcpy(&up_multipkt.mode_status,rxpc+4,10); + ack_buf[0] =1; + user__pc_cmd_ack(0x61,23,ack_buf,1); + + if(up_multipkt.mode_status==1){ + + } + else{ + + } + +} + + + + +//-------------------------------------------------- +/* +* see keypad protocol V0.99-10 section4 涓婁紶澶氬寘 +*section4.1 閿洏寮濮嬪鍖呮帴鏀 +*section4.2 璇㈤棶澶氬寘鍜屽簲绛 +*section4.3 澶氬寘鎺ユ敹瀹屾瘯纭 +*/ +#define UPMULTI_CMD__STARTUP 1 //杩涘叆澶氬寘涓婁紶妯″紡 +#define UPMULTI_CMD__INQUIRY 2 //璇㈤棶澶氬寘鏁版嵁 +#define UPMULTI_CMD__DONE 3 //澶氬寘鎺ユ敹瀹屾瘯-纭 + +static void base_tx__multipkt_cmd(unsigned char cmd) +{ + unsigned char tmp[64]; + memset(tmp,0,64); + + tmp[0] =32; + base_core.get_match_code(tmp+1); + tmp[5] =0x20; + + if( up_multipkt.id_sn_mode==1){ + tmp[6] =up_multipkt.id_sn[0]; + tmp[7] =up_multipkt.id_sn[1]; + } + else{ + tmp[6] =0xff; + tmp[7] =0xff; + memcpy(tmp+14,up_multipkt.id_sn,6); + } + tmp[8] =cmd; + tmp[9] =up_multipkt.pkt_type; + tmp[10] =up_multipkt.pkt_id; + + if(cmd==UPMULTI_CMD__INQUIRY){ + tmp[11] =up_multipkt.pack_cur; + tmp[12] =up_multipkt.pack_16bits>>8; + tmp[13] =up_multipkt.pack_16bits; + } + + base_core.send_rf_data(tmp,base_core.get_mainRF_hard_id()); +} + + +/* +*鍒濆鍖栨帴鏀跺鍖呯殑鍙傛暟锛侊紒 +*/ +static void init_multipkt_rcv_parameter(void) +{ + if(up_multipkt.pack_total >=16){ + up_multipkt.pack_16bits=0xffff; + up_multipkt.pack_total -=16; + } + else{ + up_multipkt.pack_16bits= (1<=13){ + multipkt_beacon_count=0; + //send normal beacon + base_core.switch_send_beacon(1); //on basic beacon send + return; + } + else if(multipkt_beacon_count>10){ + + return; + } + + + //1-10 鏃堕棿鐗囩敤浜庡彂閫 + base_core.switch_send_beacon(0); //off basic beacon send + + switch(multipkt_beacon_step){ + case 0: break; + + case 1: //鍚姩澶氬寘 + base_tx__multipkt_cmd(UPMULTI_CMD__STARTUP); + wait_ack_time=0; + up_multipkt.keypad_ack_flag =0; + multipkt_beacon_step=2; + break; + + case 2://绛夊緟閿洏瀵瑰鍖呭惎鍔ㄧ殑鍥炲簲 + if( up_multipkt.keypad_ack_flag){ + multipkt_inquiry_init(); + multipkt_beacon_step=3; + goto goto_send_inquiry; + } + else{ + if(++wait_ack_time>= WAIT_ACK_TIME){ + //error + return; + } + base_tx__multipkt_cmd(UPMULTI_CMD__STARTUP); + } + break; + + case 3: //鍙戦佸鍖呰姹 + goto_send_inquiry: + base_tx__multipkt_cmd(UPMULTI_CMD__INQUIRY); + wait_ack_time=0; + up_multipkt.keypad_ack_flag =0; + multipkt_beacon_step=4; + break; + + case 4://绛夊緟閿洏瀵瑰鍖呭洖搴 + if( up_multipkt.keypad_ack_flag){ + if(check_multipkt_ack() ){ + base_tx__multipkt_cmd(UPMULTI_CMD__INQUIRY);//鍙戠殑鏄笅涓涓暟鎹寘 + } + else{ + //finish report; + multipkt_beacon_step=5; + } + } + else{ + if(++wait_ack_time>= WAIT_ACK_TIME){ + //error report + return; + } + base_tx__multipkt_cmd(UPMULTI_CMD__INQUIRY);//閲嶅鍙戞湰娆 + } + + case 5: + base_tx__multipkt_cmd(UPMULTI_CMD__DONE); + wait_ack_time=0; + up_multipkt.keypad_ack_flag =0; + multipkt_beacon_step=6; + break; + + case 6: + if( up_multipkt.keypad_ack_flag){ + //ok,exit + multipkt_beacon_step=0; + up_multipkt.start_stop_flag=0; + } + else{ + if(++wait_ack_time>= WAIT_ACK_TIME){ + //error, exit + multipkt_beacon_step=0; + up_multipkt.start_stop_flag=0; + return ; + } + base_tx__multipkt_cmd(UPMULTI_CMD__DONE); + } + break; + + default:break; + }//sw + +} + + + + +#endif diff --git b/Base_core/func_src/function_whitelist.c a/Base_core/func_src/function_whitelist.c new file mode 100644 index 0000000..7173aa2 --- /dev/null +++ a/Base_core/func_src/function_whitelist.c @@ -0,0 +1,439 @@ + +#include "base_core_user.h" +#include "function.h" +#include "stdio.h" +#include "string.h" +#include "function_interface.h" + +/* +瑙佹暀鑲叉柊鐗堬紝鍩虹珯鍗忚section5.3 +鐧藉悕鍗曚繚瀛樻槸杩炵画鐨,濡傛灉妫娴嬪埌涓虹┖ 0x000000鐨勫厓绱犲氨琛ㄧず鍚庣画娌℃湁浜 +鎵浠ョ壒鍒敞鎰忥細鍒犻櫎鐧藉悕鍗曞悗灏嗗叾濉啓0xaaaaaaa(褰撶劧杩欐牱鍋氬氨瑕侀伩鍏嶅叏a鐨剆n鍙凤紝) +*/ +#define LIST_MAX 200 +#define LIST_CNT_OF_1ZONE 10 +#define ZONE_MAX (LIST_MAX/LIST_CNT_OF_1ZONE) + +unsigned char list[LIST_MAX][4]; +unsigned char list_valid_cnt=0; +unsigned char list_request_flag=0; +unsigned char list_sn[4]; + + + +////--------------------------- 鎺堟潈鐩稿叧 ---------------------------------------------------- +/* +鍒犻櫎鐧藉悕鍗: +a锛屽垹闄ゅ崟涓悕鍗 --缁欏崟涓敭鐩樺彂鎺堟潈 +b, 鍒犻櫎鎵鏈夊悕鍗 --骞挎挱鍙戦佹巿鏉 +瀹炵幇锛 +杩炵画鍙戦亁x娆℃巿鏉冨懡浠; +*/ +#define DELETE_MULTI //20200909 add by Gavin add delete multi whitelist +#define DELETE_MULTI_MAX 30 + +struct wlist_STR{ + unsigned short link_sdk_timer; + unsigned char link_sdk_flag; + unsigned char auth_type; + unsigned short auth_resend_times; + #ifdef DELETE_MULTI + unsigned char auth_keypad_sn[DELETE_MULTI_MAX][4]; + unsigned char auth_keypad_cnt; //鍒犻櫎鐨勪釜鏁 + unsigned char auth_keypad_cur; //鎺堟潈鍙戦佽疆璇 + #else + unsigned char auth_keypad_sn[4]; + #endif +}; + +struct wlist_STR wlist; + +/* +* 鍒犻櫎鎵鏈夊悕鍗曟椂:鍐欑涓鍖;b,鍩虹珯涓巗dk鏂繛 +*/ +void auth_all_keypad(void) +{ + unsigned short i; + wlist.auth_type =2; + wlist.auth_resend_times=0; + + for(i=0;i= wlist.auth_keypad_cnt) + wlist.auth_keypad_cur=0; + tmp[14]=wlist.auth_keypad_sn[wlist.auth_keypad_cur][0]; //SN + tmp[15]=wlist.auth_keypad_sn[wlist.auth_keypad_cur][1]; + tmp[16]=wlist.auth_keypad_sn[wlist.auth_keypad_cur][2]; + tmp[17]=wlist.auth_keypad_sn[wlist.auth_keypad_cur][3]; + wlist.auth_keypad_cur++; + #else + tmp[14]=wlist.auth_keypad_sn[0]; //SN + tmp[15]=wlist.auth_keypad_sn[1]; + tmp[16]=wlist.auth_keypad_sn[2]; + tmp[17]=wlist.auth_keypad_sn[3]; + #endif + } + //send + base_core.send_rf_data(tmp,base_core.get_mainRF_hard_id()); + return 1; +} + + + +/* +*called by 2.5ms; +*/ +void whitelist__2ms5_call(void) +{ + if(!function.whitelist__SW) return; + + //a, + if(base_core.get_sdk_connect_status() ){//online +// if(wlist.link_sdk_flag) +// wlist.link_sdk_flag=0; + } + else{ + if(wlist.link_sdk_flag==0){ + wlist.link_sdk_flag=1; + auth_all_keypad();//鎺堟潈 + } + } + + //b,鎵ц鍙戦佹巿鏉 + if(!wlist.auth_type) return; + if(++wlist.auth_resend_times<200) + whitelist__tx_authcode_to_keypad(); + else{ + wlist.auth_type=0; + wlist.auth_resend_times=0; + memset(wlist.auth_keypad_sn,0,4); + } +} +//---------------------------- 鎺堟潈 end ------------------------------------------------------------------ + + + + + + +/* +璁$畻涓涓尯鍐呮湁鏁坙ist鐨勪釜鏁 +*/ +static unsigned char calc_valid_list_cnt(const unsigned char *ptr) +{ + unsigned short i,j; + unsigned char cnt=0; + + for(i=0;i=ZONE_MAX) return 0; + + offset =get_offset(zone); //寰楀埌璧峰浣嶇疆 + for(i=0;i=ZONE_MAX) return 0; + + //鍐欑涓鍖烘椂锛屽皢鎵鏈夊尯閮芥竻绌 + if(zone==0){ + whitelist_init(); + auth_all_keypad();//鎺堟潈 + } + + cnt =calc_valid_list_cnt(ptr);//寰楀埌鏈夋晥list涓暟 + offset =get_offset(zone); //寰楀埌璧峰浣嶇疆 + write_list_sub(offset,ptr,cnt); + return 1; +} + + +/* +澧炲姞鐧藉悕鍗 1涓--鏈澶1鍖 +澧炲姞鐧藉悕鍗曟椂涓嶆寚瀹氬尯鍙!!!!!!!! +return: + 10涓猯ist鐨勫啓鍏ユ墽琛岀粨鏋滐紝鎴愬姛鎴栧け璐 10涓猙it +*/ +static unsigned short whitelist_add(const unsigned char *ptr) +{ + unsigned char i,cnt,remain_cnt; + unsigned short reslt_bit=0xffff; + + cnt =calc_valid_list_cnt(ptr);//寰楀埌鏈夋晥list涓暟 + if( list_valid_cnt + cnt <= LIST_MAX) + write_list_sub(list_valid_cnt,ptr,cnt); + else{ + //澧炲姞鐨刲ist涓暟瓒呭嚭褰撳墠绌虹櫧list涓暟锛屼笉鑳藉叏閮ㄥ啓鍏! + remain_cnt = LIST_MAX -list_valid_cnt;//寰楀埌list涓墿浣欎釜鏁 + write_list_sub(list_valid_cnt,ptr,remain_cnt); + //涓嶈兘鍐欏叆鐨勫氨鏍囪閿欒 + for(i=remain_cnt;iDELETE_MULTI_MAX) + cnt = DELETE_MULTI_MAX; + wlist.auth_keypad_cnt = cnt; + #endif + for(i=0;i>i)&0x01; + //pc_cmd_0x61_ack(_0x61_WHITE_LIST,ack_buf,12); + whitelist_ack_pc(ack_buf,12); + break; + + default:break; + }//sw + +} + + + + + diff --git b/Base_core/user_driver/A5130_5G8.c a/Base_core/user_driver/A5130_5G8.c new file mode 100644 index 0000000..0dc81c5 --- /dev/null +++ a/Base_core/user_driver/A5130_5G8.c @@ -0,0 +1,781 @@ + +/* + +*/ +#include "HW_MCUIO.h" +#include "A5130.h" +#include "function.h" +#include "base_core_user.h" +#include "platform.h" + + +#ifdef A5130 + + +//#define RF_PORT GPIOD +//#define RF_CS GPIO_PIN_3 + +//#define RF_PATX_PORT GPIOD +//#define RF_PATX GPIO_PIN_1 +//#define RF_PARX_PORT GPIOD +//#define RF_PARX GPIO_PIN_2 + + + + +const unsigned char ID_Tab[8]={0x34,0x75,0xC5,0x8C,0xC7,0x33,0x45,0xE7}; //ID code + +#ifdef BASE_HARDWARE_T2 +//cs of SPI +GPIO_TypeDef* const rf_cs_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +uint16_t const rf_cs_pin[4] ={GPIO_PIN_13,GPIO_PIN_8,GPIO_PIN_3,GPIO_PIN_6}; + +//澶栭儴涓柇 +GPIO_TypeDef* const rf_it_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +uint16_t const rf_it_pin[4] ={GPIO_PIN_14,GPIO_PIN_9,GPIO_PIN_4,GPIO_PIN_7}; + +//鐢ㄤ簬璁剧疆寮鍏充腑鏂 +const unsigned char rf_it_pin_nbr[]={14,9,4,7}; + +//TX PA +GPIO_TypeDef* const rf_paTX_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +uint16_t const rf_paTX_pin[4] ={GPIO_PIN_11,GPIO_PIN_6,GPIO_PIN_1,GPIO_PIN_4}; + +GPIO_TypeDef* const rf_paRX_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +uint16_t const rf_paRX_pin[4] ={GPIO_PIN_12,GPIO_PIN_7,GPIO_PIN_2,GPIO_PIN_5}; + +#elif defined(BASE_HARDWARE_200S) +//GPIO_TypeDef* const rf_cs_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +//uint16_t const rf_cs_pin[4] ={GPIO_PIN_13,GPIO_PIN_8,GPIO_PIN_3,GPIO_PIN_6}; + +////isr +//GPIO_TypeDef* const rf_it_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +//uint16_t const rf_it_pin[4] ={GPIO_PIN_14,GPIO_PIN_9,GPIO_PIN_4,GPIO_PIN_7}; + +////鐢ㄤ簬璁剧疆寮鍏充腑鏂 +//const unsigned char rf_it_pin_nbr[]={14,9,4,7}; + + +////TX PA 5.8G //cc2500 RF_LNA +//GPIO_TypeDef* const rf_paTX_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +//uint16_t const rf_paTX_pin[4] ={GPIO_PIN_1,GPIO_PIN_11,GPIO_PIN_6,GPIO_PIN_4}; + +////RX PA 5.8G //cc2500-RF_PA_EN +//GPIO_TypeDef* const rf_paRX_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +//uint16_t const rf_paRX_pin[4] ={GPIO_PIN_2,GPIO_PIN_12,GPIO_PIN_7,GPIO_PIN_5}; + +//hardware 200s RF modual silk screen:J2-J3-J1-J4 +GPIO_TypeDef* const rf_cs_port[4]={GPIOD,GPIOB,GPIOD,GPIOC}; +uint16_t const rf_cs_pin[4] ={GPIO_PIN_13,GPIO_PIN_4,GPIO_PIN_3,GPIO_PIN_6}; + +//isr +GPIO_TypeDef* const rf_it_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +uint16_t const rf_it_pin[4] ={GPIO_PIN_14,GPIO_PIN_5,GPIO_PIN_4,GPIO_PIN_7}; + +//鐢ㄤ簬璁剧疆寮鍏充腑鏂 +const unsigned char rf_it_pin_nbr[]={14,5,4,7}; + + +//TX PA 5.8G //cc2500 RF_LNA +GPIO_TypeDef* const rf_paTX_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +uint16_t const rf_paTX_pin[4] ={GPIO_PIN_11,GPIO_PIN_6,GPIO_PIN_1,GPIO_PIN_4}; + +//RX PA 5.8G //cc2500-RF_PA_EN +GPIO_TypeDef* const rf_paRX_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +uint16_t const rf_paRX_pin[4] ={GPIO_PIN_12,GPIO_PIN_7,GPIO_PIN_2,GPIO_PIN_5}; +#endif + + + + +#define A5130_SET_CS_HIGH(i) HAL_GPIO_WritePin(rf_cs_port[i],rf_cs_pin[i], GPIO_PIN_SET) //HAL_GPIO_WritePin(RF_PORT,RF_CS, GPIO_PIN_SET) +#define A5130_SET_CS_LOW(i) HAL_GPIO_WritePin(rf_cs_port[i],rf_cs_pin[i], GPIO_PIN_RESET) //HAL_GPIO_WritePin(RF_PORT,RF_CS, GPIO_PIN_RESET) + +#define PA_TX_ENABLE(i) HAL_GPIO_WritePin(rf_paTX_port[i],rf_paTX_pin[i], GPIO_PIN_SET) //HAL_GPIO_WritePin(RF_PATX_PORT,RF_PATX, GPIO_PIN_SET) +#define PA_TX_DISENABLE(i) HAL_GPIO_WritePin(rf_paTX_port[i],rf_paTX_pin[i], GPIO_PIN_RESET) + +#define PA_RX_DISENABLE(i) HAL_GPIO_WritePin(rf_paRX_port[i],rf_paRX_pin[i], GPIO_PIN_RESET) //HAL_GPIO_WritePin(RF_PARX_PORT,RF_PARX, GPIO_PIN_RESET) +#define PA_RX_ENABLE(i) HAL_GPIO_WritePin(rf_paRX_port[i],rf_paRX_pin[i], GPIO_PIN_SET) + +#define WAITFOR_TX_COPMLATE(i) HAL_GPIO_ReadPin(rf_it_port[i],rf_it_pin[i]) //HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_4) + + +#ifdef BASE_HARDWARE_T2 +#define OPEN_MISO(id) {} +#define CLOSE_MISO(id) {} +#else +// miso control +GPIO_TypeDef* const miso_ctrl_port[4]={GPIOE,GPIOB,GPIOE,GPIOE}; +uint16_t const miso_ctrl_pin[4] ={GPIO_PIN_8,GPIO_PIN_7,GPIO_PIN_9,GPIO_PIN_10}; +#define OPEN_MISO(id) HAL_GPIO_WritePin(miso_ctrl_port[id],miso_ctrl_pin[id], GPIO_PIN_SET) +#define CLOSE_MISO(id) HAL_GPIO_WritePin(miso_ctrl_port[id],miso_ctrl_pin[id], GPIO_PIN_RESET) +#endif + +/* +鍒濆鍖栧弬鏁*/ +const unsigned char A5130Config[]= +{ + 0x00, //RESET register, + 0x62, //0x60, //MODE register, //Gavin + 0x00, //CALIBRATION register, + 0x3F, //FIFO1 register, + 0x00, //FIFO2 register, + 0x00, //FIFO register, + 0x00, //IDDATA register, + 0x00, //RCOSC1 register, + + 0x00, //RCOSC2 register, + 0x0C, //RCOSC3 register, + 0x02, //CKO register, //Gavin + 0x01, //GPIO1 register 0x0B//Gavin + 0x59, //GPIO2 register, //Gavin + 0x1F, //DATARATECLOCK register, + 0x41, //PLL1 register, + 0x1E, //PLL2 register, + + 0x59, //PLL3 register, + 0x74, //PLL4 register, + 0x01, //PLL5 register, + 0x32, //ChannelGroup1 register, + 0x64, //ChannelGroup1 register, + 0x2D, //TX1 register, + 0x40, //TX2 register, + 0x09,//0x19, //DELAY1 register, + 0x40, //DELAY2 register, + 0x70, //RX register, + 0x7B, //RXGAIN1 register, + 0xC0, //RXGAIN2 register, + 0x7C, //RXGAIN3 register, + 0xCA, //RXGAIN4 register, + 0x00, //RSSI register, + 0xC9, //ADC register, + 0x1C, //CODE1 register, 寮鍚痗rc 鍏抽棴crc 0x0c + 0x8F, //CODE2 register, 寮鍚痗rc 鍏抽棴crc 0x0f + 0x2A, //CODE3 register, + 0xE4, //IFCAL1 register, + 0x01, //IFCAL2 register, + 0x4F, //VCOCCAL register, + 0xC0, //VCOCAL1 register, + 0x80, //VCOCAL2 register, + 0x70, //VCO deviation 1 register, + 0x40, //VCO deviation 2 register, + 0x00, //DSA register, + 0xBF, //VCO Modulation delay register, + 0x60, //BATTERY register, 2CH? + + 0x49, //TXTEST register, 0x41 -4.8db /////0x7b 3.3db //0x49 -3.5db + //0x41, //TXTEST register, 0x41 -4.8db /////0x7b 3.3db + 0x57, //RXDEM1 register, + 0x74, //RXDEM2 register, + 0xF3, //CPC1 register, + 0x33, //CPC2 register, + 0x4D, //CRYSTAL register, + 0x15, //PLLTEST register, + 0x0F, //VCOTEST register, + 0x00, //RF Analog register, + 0x00, //Key data register, + 0x37, //Channel select register, + 0x00, //ROM register, + 0x00, //DataRate register, + 0x00, //FCR register, + 0x00, //ARD register, + 0x00, //AFEP register, + 0x00, //FCB register, + 0x00, //KEYC register, + 0x00 //USID register, +}; + + +const unsigned char A5130_Addr2A_Config[]= // 2A 棰濆鍋忕Щ鍦板潃璁剧疆 +{ + 0x1A,//0x2A, //page0, //49US, CL=18pF, CSXTL=42 + 0x81, //page1, + 0xF0, //Page2, + 0x80, //page3, + 0x80, //page4, + 0x48, //page5, + 0x00, //page6, + 0xC0, //page7, + 0x3A, //page8, + 0x3E, //page9, + 0xE8, //page10, + 0x80, //page11, + 0x00 //page12, +}; + +const unsigned char A5130_Addr38_Config[]= // 38棰濆鍋忕Щ鍦板潃璁剧疆 +{ + 0x74, //page0, + 0x50, //page1, + 0x0D, //page2, + 0x24, //page3, + 0x06, //page4, + 0x40, //page5, + 0x60, //page6, + 0x04, //page7, + 0x00, //page8, + 0x00, //page9, + 0x00 //page10, + +}; + + + + +#define SPI_TIME_OUT 100 +extern SPI_HandleTypeDef hspi1; +void spi_writebyte(unsigned char data,unsigned char id) +{ + //OPEN_MISO(id); + HAL_SPI_Transmit(&hspi1,&data,1,SPI_TIME_OUT); + //CLOSE_MISO(id); +} + +void spi_writebyteN(unsigned char *data,unsigned char count,unsigned char id) +{ + //OPEN_MISO(id); + HAL_SPI_Transmit(&hspi1,data,count,SPI_TIME_OUT); + //CLOSE_MISO(id); +} + + +unsigned char spi_readbyte(unsigned char id) +{ + unsigned char rxdata; + HAL_StatusTypeDef rslt; + + OPEN_MISO(id); + rslt =HAL_SPI_Receive(&hspi1,&rxdata,1,SPI_TIME_OUT); + CLOSE_MISO(id); + + if( HAL_OK ==rslt ) + return rxdata; + else + return 0; +} + +unsigned char spi_readbyteN(unsigned char *rxdata,unsigned char count,unsigned char id) +{ + unsigned char data=0xff; + HAL_StatusTypeDef rslt; + + OPEN_MISO(id); + rslt =HAL_SPI_TransmitReceive(&hspi1,&data,rxdata,count,SPI_TIME_OUT); + CLOSE_MISO(id); + + if( rslt==HAL_OK) + return 1; + else + return 0; +} + + + + + +/************************************************************************ +** A5130_WriteReg 鍚戝瘎瀛樺櫒鍐欏叆鏁版嵁 +************************************************************************/ +void A5130_WriteReg(unsigned char addr, unsigned char sdata,unsigned char id) +{ + + + A5130_SET_CS_LOW(id); + + spi_writebyte(addr|0x00,id); + //Gavin1211//basic_delay_us(2);//delay_us(2);//add by Gavin + spi_writebyte(sdata,id); + //Gavin1211//basic_delay_us(2);//delay_us(2); + + A5130_SET_CS_HIGH(id); +} + +/*鎸夐〉鍐*/ +void A5130_WriteReg_Page(unsigned char addr, unsigned char sdata,unsigned char page,unsigned char id) +{ + A5130_WriteReg(RFANALOG_REG, (A5130Config[RFANALOG_REG] &0x0f)| (page<<4),id); + A5130_WriteReg(addr,sdata,id); +} + + +/************************************************************************ +** A5130_ReadReg +************************************************************************/ +unsigned char A5130_ReadReg(unsigned char addr,unsigned char id) +{ + unsigned rdata; + A5130_SET_CS_LOW(id); + + spi_writebyte(addr|0x40,id); + rdata =spi_readbyte(id); + //Gavin1211//basic_delay_us(2);//delay_us(2); + + A5130_SET_CS_HIGH(id); + return rdata; +} + +/*鎸夐〉璇*/ +unsigned char A5130_ReadReg_Page(unsigned char addr,unsigned char page,unsigned char id) +{ + A5130_WriteReg(RFANALOG_REG, (A5130Config[RFANALOG_REG] &0x0f)| (page<<4),id); + return A5130_ReadReg(addr,id); +} + +void A5130_Trimming(unsigned char id) //read then write +{ + unsigned char CBG,CTR,BDC,STM; + + A5130_WriteReg_Page(ROMP_REG, 0xA0, 9,id); + basic_delay_ms(10);//delay_ms(10); + + A5130_SET_CS_LOW(id); + + spi_writebyte(USID_REG|0x40,id); + basic_delay_us(3);//delay_us(3); + + CBG = spi_readbyte(id); //BPBG + CTR = spi_readbyte(id); //ADC trimming + BDC = spi_readbyte(id); //Battery detect + STM = spi_readbyte(id); //V-temp trimming + + A5130_SET_CS_HIGH(id); + basic_delay_ms(5);//delay_ms(5); + + A5130_WriteReg_Page(ROMP_REG, 0x40+CBG, 1,id); //BPBG + A5130_WriteReg_Page(ROMP_REG, CTR, 2,id); //ADC trimming + A5130_WriteReg_Page(ROMP_REG, BDC << 2, 0,id); //Battery detect + A5130_WriteReg_Page(ROMP_REG, STM, 4,id); //V-temp trimming +} + + + +/********************************************************************* +** Strobe Command +*********************************************************************/ +void StrobeCmd(unsigned char cmd,unsigned char id) +{ + if(cmd== CMD_SLEEP) + A5130_WriteReg(BATTERY_REG, A5130Config[BATTERY_REG] & ~0x20,id); + else + A5130_WriteReg(BATTERY_REG, A5130Config[BATTERY_REG],id); + + A5130_SET_CS_LOW(id); + spi_writebyte(cmd,id); + //Gavin1211//basic_delay_us(2);//delay_us(2); + A5130_SET_CS_HIGH(id); +} + + +static void re_set_MISO(unsigned char id) +{ +// A5130_WriteReg(GIO2_REG, 0x59,id); //GIO2 add by Gavin 1226 + +} + + +/*------------------------------------------- +鍐欏叆鍚屾鐮乮d code,骞堕獙璇佹槸鍚︽纭 +*/ +static unsigned char A5130_write_ID_code(const unsigned char *code,unsigned char id) +{ + unsigned char i,tmp[8],rslt=1; + +re_set_MISO(id);//test? + + A5130_SET_CS_LOW(id); + + basic_delay_us(1);//delay_us(1); + spi_writebyte(IDCODE_REG,id);// write + for(i=0;i<8;i++){ + spi_writebyte(code[i],id); + basic_delay_us(10);//delay_us(10); + } + A5130_SET_CS_HIGH(id); + basic_delay_us(10);//delay_us(10); + + A5130_SET_CS_LOW(id); + spi_writebyte(IDCODE_REG|0x40,id);//read + basic_delay_us(3);//delay_us(3); + spi_readbyteN(tmp,8,id); + A5130_SET_CS_HIGH(id); + + //debug only + for(i=0;i<8;i++){ + if(tmp[i] != code[i]){ + rslt =0; + break; + } + }//for + + + + return rslt; +} + +/* +read device id*/ +void A5130_read_device_id(unsigned char *device_id,unsigned char id) +{ +// unsigned char i; + +re_set_MISO(id);//test? + + A5130_SET_CS_LOW(id); + spi_writebyte(USID_REG|0x40,id);// read + basic_delay_us(3);//delay_us(3); + spi_readbyteN(device_id,4,id); + A5130_SET_CS_HIGH(id); +} + + +/**/ +static void A5130_set_FIFO(unsigned char id) +{ + re_set_MISO(id);//test? + + A5130_SET_CS_LOW(id); + spi_writebyte(FIFO1_REG,id);// + spi_writebyte(0x3F,id); + spi_writebyte(0x00,id); + basic_delay_us(3);//delay_us(3); + A5130_SET_CS_HIGH(id); +} + + +void A5130_rx_packet(unsigned char *tmp,unsigned char id) +{ + re_set_MISO(id);//test? + + A5130_SET_CS_LOW(id); + + //basic_delay_us(1); + spi_writebyte(FIFO_REG | 0x40,id);// + //basic_delay_us(2); + spi_readbyteN(tmp,64,id); + //basic_delay_us(2); + + A5130_SET_CS_HIGH(id); +} + + +/*------------------------------------------------------------------------------- +*/ +static void A5130_config(unsigned char id) +{ + unsigned char i; + +re_set_MISO(id);//test? + + for (i=MODECTRL_REG; i<=FIFO2_REG; i++) + A5130_WriteReg(i, A5130Config[i],id); + basic_delay_us(3);// delay_us(3); + + for (i=RCOSC1_REG; i<=VCODEVCAL2_REG; i++) + A5130_WriteReg(i, A5130Config[i],id); + basic_delay_us(3);// delay_us(3); + + for (i=0; i<=12; i++) //0x2A DAS + A5130_WriteReg_Page(DASP_REG, A5130_Addr2A_Config[i], i,id); + basic_delay_us(3);// delay_us(3); + + for (i=VCOMODDELAY_REG; i<=RFANALOG_REG; i++) + A5130_WriteReg(i, A5130Config[i],id); + basic_delay_us(3);// delay_us(3); + + A5130_WriteReg(CHSELECT_REG, A5130Config[CHSELECT_REG],id); + basic_delay_us(3);// delay_us(3); + + for (i=0; i<=10; i++) //0x38 ROM + A5130_WriteReg_Page(ROMP_REG, A5130_Addr38_Config[i], i,id); + basic_delay_us(3);// delay_us(3); + + for (i=DATARATECLOCK; i<=AFEP_REG; i++) + A5130_WriteReg(i, A5130Config[i],id); + basic_delay_us(3);// delay_us(3); + + A5130_WriteReg(KEYC_REG, A5130Config[KEYC_REG],id); +} + + + +/********************************************************************* +** CHGroupCal +*********************************************************************/ +static void CHGroupCal(unsigned char ch,unsigned char id) +{ + unsigned char i,tmp; + unsigned int j=0; + unsigned char vb,vbcf,vc,vccf,deva,adev; + +re_set_MISO(id);//test? + + A5130_WriteReg(PLL1_REG, ch,id); + A5130_WriteReg(VCOCCAL_REG, A5130Config[0x25],id); //for test mode + + for(i=0;i<5;i++){ + A5130_WriteReg(CALIBRATION_REG, 0x1C,id); + do{ + tmp = A5130_ReadReg(CALIBRATION_REG,id); + tmp &= 0x1C; + j++; + basic_delay_us(100);//pei + } + while ((tmp)&&(j<200));//while ((tmp)&&(j<2000)); + }//for + + //for check + tmp = A5130_ReadReg(VCOCAL1_REG,id); + vb = tmp & 0x0F; + vbcf = (tmp >>4) & 0x01; + + tmp = A5130_ReadReg(VCOCCAL_REG,id); + vc = tmp & 0x0F; + vccf = (tmp >>4) & 0x01; + + tmp = A5130_ReadReg(VCODEVCAL1_REG,id); + deva = tmp; + + tmp = A5130_ReadReg(VCODEVCAL2_REG,id); + adev = tmp; + + if (vbcf && vccf&&vb&&vc&&deva&&adev){ // 閬垮厤鎶ラ敊鑰屽凡 + //error status....... + } +} + + + +/* +*/ +static void A5130_cal(unsigned char id) +{ + unsigned char i,tmp; + unsigned char fb, fbcf, fcd, rhc, rlc; + + StrobeCmd(CMD_PLL,id); //calibration @PLL state + //calibration IF procedure +// A5130_WriteReg(CALIBRATION_REG, 0x63); + + //calibration IF procedure + A5130_WriteReg(CALIBRATION_REG, 0x63,id); + i=0; //add by pei + do + { + i++; + tmp = A5130_ReadReg(CALIBRATION_REG,id); + tmp &= 0x63; + basic_delay_us(400);//pei + } + while(tmp&&(i<200)); + + //calibration VBC,VDC,VCC procedure + CHGroupCal(25,id); //calibrate channel group Bank I + CHGroupCal(75,id); //calibrate channel group Bank II + CHGroupCal(125,id); //calibrate channel group Bank III + + StrobeCmd(CMD_STBY,id); //return to STBY state + + //for check + tmp = A5130_ReadReg(IFCAL1_REG,id); + fb = tmp & 0x0F; + fbcf = (tmp >>4) & 0x01; + + tmp = A5130_ReadReg(IFCAL2_REG,id); + fcd = tmp & 0x1F; + + rhc = A5130_ReadReg(RXGAIN2_REG,id); + rlc = A5130_ReadReg(RXGAIN3_REG,id); + + if (fbcf&&fb&&fcd&&rhc&&rlc){// 閬垮厤鎶ラ敊鑰屽凡 + //error //Err_State(); + } +} + + + + +/*---------------------------------------------------- +鍙戦佹暟鎹嚱鏁*/ +void A5130_send_data_sub(unsigned char *buf,unsigned char count,unsigned char id) +{ + unsigned int j; + + //step1 --see datasheet page69 + StrobeCmd(CMD_TFR,id); + //step 2 + A5130_SET_CS_LOW(id); + spi_writebyte(FIFO_REG,id ); + spi_writebyteN(buf,count,id); //64 + A5130_SET_CS_HIGH(id); + //step3 + StrobeCmd(CMD_TX,id); // 鍚姩鍙戦 + //step 4: wait for WTR + j=0; +// while(WAITFOR_TX_COPMLATE(id)){ +// if(j++>100000) +// break; +// }//while +// if(j>=100000)//娌℃湁鍙戦佸畬鎴愮殑淇″彿锛 +// StrobeCmd(CMD_STBY,id); + + //modify by pei + while(WAITFOR_TX_COPMLATE(id)){ + if(j++>2000) //鍘100000=18.5ms 瀹炴祴2000=355us婊¤冻闇姹 + break; + }//while + if(j>=2000)//娌℃湁鍙戦佸畬鎴愮殑淇″彿锛 + StrobeCmd(CMD_STBY,id); +} + + + +/* +* send multi frame data, that included in *send_function function; */ +void A5130_send_beacon(void (*send_function)(const unsigned char *,unsigned char id),const unsigned char *tmp,unsigned char id) +{ + unsigned char it_pin_nbr =rf_it_pin_nbr[id]; + + EXTI->IMR&=~(1<IMR |=(1<IMR&=~(1<IMR |=(1<Mode, GPIO_init->Speed, GPIO_init->Pin); +} + +void HW_GD_GPIO_TogglePin(HW_GPIO_PortDef Port, uint32_t Pin) +{ + if (gpio_input_bit_get(Port, Pin) == SET) + { + gpio_bit_reset(Port, Pin); + } + else + { + gpio_bit_set(Port, Pin); + } +} + +static volatile uint32_t systick; +uint32_t HW_GD_GetTick(void) +{ + return systick; +} + +void HW_GD_IncTick(void) +{ + systick++; +} + +void HW_GD_Delay(uint32_t DelayMs) +{ + uint32_t tick = HW_GD_GetTick(); + + do + { + if (HW_GD_GetTick() - tick >= DelayMs) + { + return; + } + } while (1); +} + +void HW_GD_DelayUS(uint32_t DelayUs) +{ + uint32_t cnt = DelayUs * 22; // 98.340M,1000us,??996us + while (cnt--) + { + /* code */ + } +} + +void HW_GD_SPI0_Init(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + rcu_periph_clock_enable(RCU_SPI0); + + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7); + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); + + spi_parameter_struct spi_init_struct; + + /* SPI0 parameter config */ + spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; + spi_init_struct.device_mode = SPI_MASTER; + spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; + spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; + spi_init_struct.nss = SPI_NSS_SOFT; + spi_init_struct.prescale = SPI_PSC_16; + spi_init_struct.endian = SPI_ENDIAN_MSB; + spi_init(SPI0, &spi_init_struct); + spi_enable(SPI0); + + +} + +uint8_t HW_GD_SPI_TransmitReceiveOneByte(uint32_t SPIX, uint8_t tx_data, uint8_t rx_data) +{ + uint32_t time_out = RF_SPI_TIMEOUT; + uint8_t rtn=0; + while (!spi_i2s_flag_get(SPIX, SPI_FLAG_TBE) && time_out--) + ; + spi_i2s_data_transmit(SPIX, tx_data); + if(time_out==0) rtn=1; + time_out = RF_SPI_TIMEOUT; + while (!spi_i2s_flag_get(SPIX, SPI_FLAG_RBNE) && time_out--) + ; + rx_data=spi_i2s_data_receive(SPIX); + if(time_out==0) rtn=1; + + return rtn; +} + +uint8_t HW_GD_SPI0_TransmitReceive(uint8_t *txbuf, uint8_t *rxbuf, uint16_t len) +{ + uint8_t rtn=0; + for(uint16_t i=0;i 0; i--){ + if ((ucAddr & 0x80) == 0x80) + SET_MF522_SI + else + RESET_MF522_SI + + SET_MF522_SCK //*MF522_SCK = 1; + ucAddr <<= 1; + RESET_MF522_SCK //*MF522_SCK = 0; + } + + for (i = 8; i > 0; i--){ + if ((value & 0x80) == 0x80) + SET_MF522_SI + else + RESET_MF522_SI + + SET_MF522_SCK //*MF522_SCK = 1; + value <<= 1; + RESET_MF522_SCK //*MF522_SCK = 0; + } + + SET_MF522_NS //*MF522_NS = 1; + SET_MF522_SCK //*MF522_SCK = 1; + } +//#endif + +} + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細璇籖C632瀵勫瓨鍣 +//鍙傛暟璇存槑锛欰ddress[IN]:瀵勫瓨鍣ㄥ湴鍧 +//杩 鍥烇細璇诲嚭鐨勫 +///////////////////////////////////////////////////////////////////// +static unsigned char ReadRawRC(unsigned char Address) +{ + //#ifdef SYS_SPI3 + if( get_hard_flag()){ + unsigned char value[2],ucAddr = ((Address << 1) & 0x7E) | 0x80; + + RESET_MF522_NS //*MF522_NS = 0; + HAL_SPI_TransmitReceive(&hspi3,&ucAddr,value,2,100); + SET_MF522_NS //*MF522_NS = 1; + + return value[1]; + //#else + } + else{ + unsigned char i, ucAddr, ucResult = 0; + + RESET_MF522_SCK; //*MF522_SCK = 0; + RESET_MF522_NS; //*MF522_NS = 0; + + ucAddr = ((Address << 1) & 0x7E) | 0x80; + + for (i = 8; i > 0; i--){ + if ((ucAddr & 0x80) == 0x80) + SET_MF522_SI + else + RESET_MF522_SI + + SET_MF522_SCK //*MF522_SCK = 1; + ucAddr <<= 1; + RESET_MF522_SCK //*MF522_SCK = 0; + } + + for (i = 8; i > 0; i--){ + SET_MF522_SCK //*MF522_SCK = 1; + ucResult <<= 1; + ucResult |=HAL_GPIO_ReadPin(MF522_MI_PORT,MF522_MI_PIN); + RESET_MF522_SCK //*MF522_SCK = 0; + } + + SET_MF522_NS; //*MF522_NS = 1; + SET_MF522_SCK; //*MF522_SCK = 1; + return ucResult; + } + //#endif +} + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細缃甊C522瀵勫瓨鍣ㄤ綅 +//鍙傛暟璇存槑锛歳eg[IN]:瀵勫瓨鍣ㄥ湴鍧 +// mask[IN]:缃綅鍊 +///////////////////////////////////////////////////////////////////// +static void SetBitMask(unsigned char reg, unsigned char mask) +{ + char tmp = 0x0; + tmp = ReadRawRC(reg); + WriteRawRC(reg, tmp | mask); // set bit mask +} + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細娓匯C522瀵勫瓨鍣ㄤ綅 +//鍙傛暟璇存槑锛歳eg[IN]:瀵勫瓨鍣ㄥ湴鍧 +// mask[IN]:娓呬綅鍊 +///////////////////////////////////////////////////////////////////// +static void ClearBitMask(unsigned char reg, unsigned char mask) +{ + char tmp = 0x0; + tmp = ReadRawRC(reg); + WriteRawRC(reg, tmp & ~mask); // clear bit mask +} + +///////////////////////////////////////////////////////////////////// +//鐢∕F522璁$畻CRC16鍑芥暟 +///////////////////////////////////////////////////////////////////// +static void CalulateCRC(unsigned char *pIndata, unsigned char len, unsigned char *pOutData) +{ + unsigned char i, n; + ClearBitMask(DivIrqReg, 0x04); + WriteRawRC(CommandReg, PCD_IDLE); + SetBitMask(FIFOLevelReg, 0x80); + for (i = 0; i < len; i++) + { + WriteRawRC(FIFODataReg, *(pIndata + i)); + } + WriteRawRC(CommandReg, PCD_CALCCRC); + + i = 0xFF; + do + { + n = ReadRawRC(DivIrqReg); + i--; + } while ((i != 0) && !(n & 0x04)); + pOutData[0] = ReadRawRC(CRCResultRegL); + pOutData[1] = ReadRawRC(CRCResultRegM); +} + +///////////////////////////////////////////////////////////////////// +//寮鍚ぉ绾 +//姣忔鍚姩鎴栧叧闂ぉ闄╁彂灏勪箣闂村簲鑷冲皯鏈1ms鐨勯棿闅 +///////////////////////////////////////////////////////////////////// +static void PcdAntennaOn(void) +{ + unsigned char i; + i = ReadRawRC(TxControlReg); + + if (!(i & 0x03)) + { + SetBitMask(TxControlReg, 0x03); + } +} + +///////////////////////////////////////////////////////////////////// +//鍏抽棴澶╃嚎 +///////////////////////////////////////////////////////////////////// +static void PcdAntennaOff(void) +{ + ClearBitMask(TxControlReg, 0x03); +} + + +//---------------------------------------- +static char PcdReset(void) +{ +// SET_MF522_RST //*MF522_RST=1; +// mDelay(50000); + RESET_MF522_RST //*MF522_RST=0; + mDelay(50000); + SET_MF522_RST //*MF522_RST=1; + mDelay(50000); + WriteRawRC(CommandReg, PCD_RESETPHASE); + + mDelay(500); //_nop_(); + + WriteRawRC(ModeReg, 0x3D); //鍜孧ifare鍗¢氳锛孋RC鍒濆鍊0x6363 + WriteRawRC(TReloadRegL, 30); + WriteRawRC(TReloadRegH, 0); + WriteRawRC(TModeReg, 0x8D); + WriteRawRC(TPrescalerReg, 0x3E); + + WriteRawRC(TxAutoReg, 0x40); //蹇呴』瑕 锛岃缃昏緫1锛屽己鍒100%ASK璋冨埗 Gavin + + return MI_OK; +} + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細閫氳繃RC522鍜孖SO14443鍗¢氳 +//鍙傛暟璇存槑锛欳ommand[IN]:RC522鍛戒护瀛 +// pInData[IN]:閫氳繃RC522鍙戦佸埌鍗$墖鐨勬暟鎹 +// InLenByte[IN]:鍙戦佹暟鎹殑瀛楄妭闀垮害 +// pOutData[OUT]:鎺ユ敹鍒扮殑鍗$墖杩斿洖鏁版嵁 +// *pOutLenBit[OUT]:杩斿洖鏁版嵁鐨勪綅闀垮害 +///////////////////////////////////////////////////////////////////// +//char PcdComMF522(unsigned char Command, +static int PcdComMF522(unsigned char Command, + unsigned char *pInData, + unsigned char InLenByte, + unsigned char *pOutData, + unsigned int *pOutLenBit) +{ + //char status = MI_ERR; + int status = MI_ERR; + + unsigned char irqEn = 0x00; + unsigned char waitFor = 0x00; //Mask by Gavin + unsigned char lastBits; + unsigned char n; + unsigned int i; + + switch (Command) + { + case PCD_AUTHENT: + irqEn = 0x12; + waitFor = 0x10; + break; + case PCD_TRANSCEIVE: + irqEn = 0x77; + waitFor = 0x30; //Mask by Gavin + break; + default: + break; + } + + WriteRawRC(ComIEnReg, irqEn | 0x80); //reg0x02 + ClearBitMask(ComIrqReg, 0x80); //reg0x04 ==0 + WriteRawRC(CommandReg, PCD_IDLE); //reg0x01 + SetBitMask(FIFOLevelReg, 0x80); //reg0x0A + + for (i = 0; i < InLenByte; i++) + { + WriteRawRC(FIFODataReg, pInData[i]); + } //reg0x09 + WriteRawRC(CommandReg, Command); + + if (Command == PCD_TRANSCEIVE) + { + SetBitMask(BitFramingReg, 0x80); + } //reg0x0D + + // i = 600;//鏍规嵁鏃堕挓棰戠巼璋冩暣锛屾搷浣淢1鍗℃渶澶х瓑寰呮椂闂25ms + i = 3600; + #ifdef _NEW_NFC_APP + i=1000;//800; //420鏄复鐣屽 + #endif + do + { + n = ReadRawRC(ComIrqReg); //reg0x04 + i--; + } while ((i != 0) && !(n & 0x01) && !(n & waitFor)); + + + + ClearBitMask(BitFramingReg, 0x80); + + if (i != 0) + { + if (!(ReadRawRC(ErrorReg) & 0x1B)) + { + status = MI_OK; + if (n & irqEn & 0x01) //timer IrQ==1 璁惧畾鏃堕棿閲屾病鏈夋壘鍒帮紵 + { + status = MI_NOTAGERR; + } + + if (Command == PCD_TRANSCEIVE) + { + n = ReadRawRC(FIFOLevelReg); + lastBits = ReadRawRC(ControlReg) & 0x07; + if (lastBits) + { + *pOutLenBit = (n - 1) * 8 + lastBits; + } + else + { + *pOutLenBit = n * 8; + } + if (n == 0) + { + n = 1; + } + if (n > MAXRLEN) + { + n = MAXRLEN; + } + for (i = 0; i < n; i++) + { + pOutData[i] = ReadRawRC(FIFODataReg); + } + } + } + else + { + status = MI_ERR; + } + } + + SetBitMask(ControlReg, 0x80); // stop timer now + WriteRawRC(CommandReg, PCD_IDLE); + return status; +} + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細瀵诲崱 +//鍙傛暟璇存槑: req_code[IN]:瀵诲崱鏂瑰紡 +// 0x52 = 瀵绘劅搴斿尯鍐呮墍鏈夌鍚14443A鏍囧噯鐨勫崱 +// 0x26 = 瀵绘湭杩涘叆浼戠湢鐘舵佺殑鍗 +// pTagType[OUT]锛氬崱鐗囩被鍨嬩唬鐮 +// 0x4400 = Mifare_UltraLight +// 0x0400 = Mifare_One(S50) +// 0x0200 = Mifare_One(S70) +// 0x0800 = Mifare_Pro(X) +// 0x4403 = Mifare_DESFire +//杩 鍥: 鎴愬姛杩斿洖MI_OK +///////////////////////////////////////////////////////////////////// +//char PcdRequest(unsigned char req_code,unsigned char *pTagType) +#ifdef _NEW_NFC_APP +/* 2020.12.04 Gavin He +* 璋冭瘯鍙戠幇锛屾壂鎻忓嚱鏁癙cdRequest 浼氭秷鑰楄嚦灏3ms鐨勬椂闂达紝杩欐牱鎷栨參鏁翠釜涓诲惊鐜; +* 鎱㈢殑鍘熷洜: 璋冪敤鐨凱cdComMF522鍑芥暟涓湁姝诲惊鐜瓑寰咃紒 +* 瑙e喅鍔炴硶锛氬皢鍑芥暟鎷嗗垎鎴愬涓姸鎬佹満锛屽湪涓诲惊鐜噷澶氭璁块棶瀹屾垚; +*/ +static int PcdRequest(unsigned char req_code, unsigned char *pTagType) +{ + //PcdRequest 鍐呴儴鍙橀噺, + int status = 1;//MI_ERR; + static unsigned int unLen = 0; + static unsigned char ucComMF522Buf[MAXRLEN]; + //PcdComMF522 鍐呴儴鍙橀噺 + static unsigned char irqEn = 0x00; + static unsigned char waitFor = 0x00; //Mask by Gavin + unsigned char lastBits; + static unsigned char n; + static unsigned int i; + /*static int PcdComMF522(unsigned char Command, + unsigned char *pInData, + unsigned char InLenByte, + unsigned char *pOutData, + unsigned int *pOutLenBit)*/ + //PcdComMF522 function input + static unsigned char Command; + static unsigned char *pInData; + static unsigned char InLenByte; + static unsigned char *pOutData; + static unsigned int *pOutLenBit; + + static unsigned char find_step=0; //add by Gavin + + switch(find_step){ + + case 0: + //----- PcdRequest part 1 --------------------- + ClearBitMask(Status2Reg, 0x08); + WriteRawRC(BitFramingReg, 0x07); + SetBitMask(TxControlReg, 0x03); + ucComMF522Buf[0] = req_code; + + //------- call function: PcdComMF522 Part1 start ---------- + //status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 1, ucComMF522Buf, &unLen); + Command = PCD_TRANSCEIVE; + pInData = ucComMF522Buf; + InLenByte =1; + pOutData = ucComMF522Buf; + unLen = 0; + pOutLenBit =&unLen; + + switch (Command) + { + case PCD_AUTHENT: + irqEn = 0x12; + waitFor = 0x10; + break; + case PCD_TRANSCEIVE: + irqEn = 0x77; + waitFor = 0x30; //Mask by Gavin + break; + default: + break; + } + + WriteRawRC(ComIEnReg, irqEn | 0x80); //reg0x02 + ClearBitMask(ComIrqReg, 0x80); //reg0x04 ==0 + WriteRawRC(CommandReg, PCD_IDLE); //reg0x01 + SetBitMask(FIFOLevelReg, 0x80); //reg0x0A + + for (i = 0; i < InLenByte; i++) + { + WriteRawRC(FIFODataReg, pInData[i]); + } //reg0x09 + WriteRawRC(CommandReg, Command); + + if (Command == PCD_TRANSCEIVE) + { + SetBitMask(BitFramingReg, 0x80); + } //reg0x0D + //-------- call function: PcdComMF522 Part1 end --------------------- + + i=200; //set waitfor timer + find_step =1; + //break; + + case 1: + //-------- call function: PcdComMF522 Part2 --------------------- + /* + i = 3600; + i=430; //420鏄复鐣屽 + do + { + n = ReadRawRC(ComIrqReg); //reg0x04 + i--; + } while ((i != 0) && !(n & 0x01) && !(n & waitFor)); + */ +// #define W_TIMER 255 + i--; + n = ReadRawRC(ComIrqReg); //reg0x04 + if ( (i != 0) &&!(n & 0x01) && !(n & waitFor)){ + //None find + status = 1; + } + else{ + //find; + status = 1; + find_step =2 ; + } + + //-------------------------------------------------------------------------------- + break; + + case 2: + //-------- call function: PcdComMF522 Part3 --------------------- + ClearBitMask(BitFramingReg, 0x80); + + if (i != 0) + { + if (!(ReadRawRC(ErrorReg) & 0x1B)) + { + status = MI_OK; + if (n & irqEn & 0x01) //timer IrQ==1 璁惧畾鏃堕棿閲屾病鏈夋壘鍒帮紵 + { + status = MI_NOTAGERR; + } + + if (Command == PCD_TRANSCEIVE) + { + n = ReadRawRC(FIFOLevelReg); + lastBits = ReadRawRC(ControlReg) & 0x07; + if (lastBits) + { + *pOutLenBit = (n - 1) * 8 + lastBits; + } + else + { + *pOutLenBit = n * 8; + } + if (n == 0) + { + n = 1; + } + if (n > MAXRLEN) + { + n = MAXRLEN; + } + for (i = 0; i < n; i++) + { + pOutData[i] = ReadRawRC(FIFODataReg); + } + } + } + else + { + status = MI_ERR; + } + } + SetBitMask(ControlReg, 0x80); // stop timer now + WriteRawRC(CommandReg, PCD_IDLE); + //-------- call function: PcdComMF522 Part3 end --------------------- + + //----- PcdRequest part 2 --------------------- + if ((status == MI_OK) && (unLen == 0x10)) + { + *pTagType = ucComMF522Buf[0]; + *(pTagType + 1) = ucComMF522Buf[1]; + } + else + { + status = MI_ERR; + } + + find_step =0; + break; + + default: + status = MI_ERR; + break; + }//sw + + return status; +} + +#else +static int PcdRequest(unsigned char req_code, unsigned char *pTagType) +{ + int status; // + //char status; + unsigned int unLen = 0; + unsigned char ucComMF522Buf[MAXRLEN]; + + ClearBitMask(Status2Reg, 0x08); + WriteRawRC(BitFramingReg, 0x07); + SetBitMask(TxControlReg, 0x03); + + ucComMF522Buf[0] = req_code; + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 1, ucComMF522Buf, &unLen); + + if ((status == MI_OK) && (unLen == 0x10)) + { + *pTagType = ucComMF522Buf[0]; + *(pTagType + 1) = ucComMF522Buf[1]; + } + else + { + status = MI_ERR; + } + + return status; +} +#endif + + + +#if 0 +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細闃插啿鎾 +//鍙傛暟璇存槑: pSnr[OUT]:鍗$墖搴忓垪鍙凤紝4瀛楄妭 +//杩 鍥: 鎴愬姛杩斿洖MI_OK +///////////////////////////////////////////////////////////////////// +//char PcdAnticoll(unsigned char *pSnr) +static int PcdAnticoll(unsigned char *pSnr) +{ + //char status; + int status; + unsigned char i,snr_check=0; + unsigned int unLen; + unsigned char ucComMF522Buf[MAXRLEN]; + + + ClearBitMask(Status2Reg,0x08); + WriteRawRC(BitFramingReg,0x00); + ClearBitMask(CollReg,0x80); + + ucComMF522Buf[0] = PICC_ANTICOLL1; + ucComMF522Buf[1] = 0x20; + + status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen); + + if (status == MI_OK) + { + for (i=0; i<4; i++) + { + *(pSnr+i) = ucComMF522Buf[i]; + snr_check ^= ucComMF522Buf[i]; + } + if (snr_check != ucComMF522Buf[i]) + { status = MI_ERR; } + } + + SetBitMask(CollReg,0x80); + return status; +} + + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細閫夊畾鍗$墖 +//鍙傛暟璇存槑: pSnr[IN]:鍗$墖搴忓垪鍙凤紝4瀛楄妭 +//杩 鍥: 鎴愬姛杩斿洖MI_OK +///////////////////////////////////////////////////////////////////// +static int PcdSelect(unsigned char *pSnr) +{ + int status; + unsigned char i; + unsigned int unLen; + unsigned char ucComMF522Buf[MAXRLEN]; + + ucComMF522Buf[0] = PICC_ANTICOLL1; + ucComMF522Buf[1] = 0x70; + ucComMF522Buf[6] = 0; + for (i=0; i<4; i++) + { + ucComMF522Buf[i+2] = *(pSnr+i); + ucComMF522Buf[6] ^= *(pSnr+i); + } + CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]); + + ClearBitMask(Status2Reg,0x08); + + status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen); + + if ((status == MI_OK) && (unLen == 0x18)) + { status = MI_OK; } + else + { status = MI_ERR; } + + return status; +} +#else //灏嗛槻纰版挒绾у埆鐢卞唴缃敼涓轰綔涓哄舰鍙傚嚭鍏ャ俌SY 2019.10.14 +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細闃插啿鎾 +//鍙傛暟璇存槑: pSnr[OUT]:鍗$墖搴忓垪鍙凤紝4瀛楄妭 +// sec_code[IN]锛氶槻纰版挒绾у埆 +//杩 鍥: 鎴愬姛杩斿洖MI_OK +///////////////////////////////////////////////////////////////////// +//char PcdAnticoll(unsigned char *pSnr) +static int PcdAnticoll(unsigned char sec_code, unsigned char *pSnr) +{ + //char status; + int status; + unsigned char i, snr_check = 0; + unsigned int unLen; + unsigned char ucComMF522Buf[MAXRLEN]; + + ClearBitMask(Status2Reg, 0x08); + WriteRawRC(BitFramingReg, 0x00); + ClearBitMask(CollReg, 0x80); + + ucComMF522Buf[0] = sec_code; + ucComMF522Buf[1] = 0x20; + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 2, ucComMF522Buf, &unLen); + + if (status == MI_OK) + { + for (i = 0; i < 4; i++) + { + *(pSnr + i) = ucComMF522Buf[i]; + snr_check ^= ucComMF522Buf[i]; + } + if (snr_check != ucComMF522Buf[i]) + { + status = MI_ERR; + } + } + + SetBitMask(CollReg, 0x80); + return status; +} + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細閫夊畾鍗$墖 +//鍙傛暟璇存槑: pSnr[IN]:鍗$墖搴忓垪鍙凤紝4瀛楄妭 +// sec_code[IN]锛氶槻纰版挒绾у埆 +//杩 鍥: 鎴愬姛杩斿洖MI_OK +///////////////////////////////////////////////////////////////////// +static int PcdSelect(unsigned char sec_code, unsigned char *pSnr) +{ + int status; + unsigned char i; + unsigned int unLen; + unsigned char ucComMF522Buf[MAXRLEN]; + + ucComMF522Buf[0] = sec_code; + ucComMF522Buf[1] = 0x70; + ucComMF522Buf[6] = 0; + for (i = 0; i < 4; i++) + { + ucComMF522Buf[i + 2] = *(pSnr + i); + ucComMF522Buf[6] ^= *(pSnr + i); + } + CalulateCRC(ucComMF522Buf, 7, &ucComMF522Buf[7]); + + ClearBitMask(Status2Reg, 0x08); + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 9, ucComMF522Buf, &unLen); + + if ((status == MI_OK) && (unLen == 0x18)) + { + status = MI_OK; + } + else + { + status = MI_ERR; + } + + return status; +} +#endif + + + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細楠岃瘉鍗$墖瀵嗙爜 +//鍙傛暟璇存槑: auth_mode[IN]: 瀵嗙爜楠岃瘉妯″紡 +// 0x60 = 楠岃瘉A瀵嗛挜 +// 0x61 = 楠岃瘉B瀵嗛挜 +// addr[IN]锛氬潡鍦板潃 +// pKey[IN]锛氬瘑鐮 +// pSnr[IN]锛氬崱鐗囧簭鍒楀彿锛4瀛楄妭 +//杩 鍥: 鎴愬姛杩斿洖MI_OK +///////////////////////////////////////////////////////////////////// +//static int PcdAuthState(unsigned char auth_mode, unsigned char addr, unsigned char *pKey, unsigned char *pSnr) +//{ +// int status; +// unsigned int unLen; +// unsigned char i, ucComMF522Buf[MAXRLEN]; + +// ucComMF522Buf[0] = auth_mode; +// ucComMF522Buf[1] = addr; +// for (i = 0; i < 6; i++) +// { +// ucComMF522Buf[i + 2] = *(pKey + i); +// } +// for (i=0; i<6; i++) +// //for (i = 0; i < 4; i++) +// { +// ucComMF522Buf[i + 8] = *(pSnr + i); +// } +// // memcpy(&ucComMF522Buf[2], pKey, 6); +// // memcpy(&ucComMF522Buf[8], pSnr, 4); + +// status = PcdComMF522(PCD_AUTHENT, ucComMF522Buf, 12, ucComMF522Buf, &unLen); +// if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))) +// { +// status = MI_ERR; +// } + +// return status; +//} + + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細鍐欐暟鎹埌M1鍗′竴鍧 +//鍙傛暟璇存槑: addr[IN]锛氬潡鍦板潃 +// pData[IN]锛氬啓鍏ョ殑鏁版嵁锛16瀛楄妭 +//杩 鍥: 鎴愬姛杩斿洖MI_OK +///////////////////////////////////////////////////////////////////// +static int PcdWrite(unsigned char addr, unsigned char *pData) +{ + int status; + unsigned int unLen; + unsigned char i, ucComMF522Buf[MAXRLEN]; + + ucComMF522Buf[0] = PICC_WRITE; + ucComMF522Buf[1] = addr; + CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]); + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen); + + if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) + { + status = MI_ERR; + } + + if (status == MI_OK) + { + //memcpy(ucComMF522Buf, pData, 16); + //for (i = 0; i < 4; i++) + for (i = 0; i < 16; i++) + { + ucComMF522Buf[i] = *(pData + i); + } + CalulateCRC(ucComMF522Buf, 16, &ucComMF522Buf[16]); + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 18, ucComMF522Buf, &unLen); + if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) + { + status = MI_ERR; + } + } + + return status; +} + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細璇诲彇M1鍗′竴鍧楁暟鎹 +//鍙傛暟璇存槑: addr[IN]锛氬潡鍦板潃 +// pData[OUT]锛氳鍑虹殑鏁版嵁锛16瀛楄妭 +//杩 鍥: 鎴愬姛杩斿洖MI_OK +///////////////////////////////////////////////////////////////////// +static int PcdRead(unsigned char addr, unsigned char *pData) +{ + int status; + unsigned int unLen; + unsigned char i, ucComMF522Buf[MAXRLEN]; + + ucComMF522Buf[0] = PICC_READ; + ucComMF522Buf[1] = addr; + CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]); + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen); + //if (status == MI_OK) + if ((status == MI_OK) && (unLen == 0x90)) + // { memcpy(pData, ucComMF522Buf, 16); } + { + //for (i = 0; i < 4; i++)// + for (i = 0; i < 16; i++) //2020.02.17 Gavin modify + { + *(pData + i) = ucComMF522Buf[i]; + } + } + else + { + status = MI_ERR; + } + + return status; +} + +#ifdef NOUSE + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細鎵f鍜屽厖鍊 +//鍙傛暟璇存槑: dd_mode[IN]锛氬懡浠ゅ瓧 +// 0xC0 = 鎵f +// 0xC1 = 鍏呭 +// addr[IN]锛氶挶鍖呭湴鍧 +// pValue[IN]锛4瀛楄妭澧(鍑)鍊硷紝浣庝綅鍦ㄥ墠 +//杩 鍥: 鎴愬姛杩斿洖MI_OK +///////////////////////////////////////////////////////////////////// +static int PcdValue(unsigned char dd_mode, unsigned char addr, unsigned char *pValue) +{ + int status; + unsigned int unLen; + unsigned char i, ucComMF522Buf[MAXRLEN]; + + ucComMF522Buf[0] = dd_mode; + ucComMF522Buf[1] = addr; + CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]); + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen); + + if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) + { + status = MI_ERR; + } + + if (status == MI_OK) + { + // memcpy(ucComMF522Buf, pValue, 4); + for (i = 0; i < 16; i++) + { + ucComMF522Buf[i] = *(pValue + i); + } + CalulateCRC(ucComMF522Buf, 4, &ucComMF522Buf[4]); + unLen = 0; + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 6, ucComMF522Buf, &unLen); + if (status != MI_ERR) + { + status = MI_OK; + } + } + + if (status == MI_OK) + { + ucComMF522Buf[0] = PICC_TRANSFER; + ucComMF522Buf[1] = addr; + CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]); + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen); + + if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) + { + status = MI_ERR; + } + } + return status; +} + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細澶囦唤閽卞寘 +//鍙傛暟璇存槑: sourceaddr[IN]锛氭簮鍦板潃 +// goaladdr[IN]锛氱洰鏍囧湴鍧 +//杩 鍥: 鎴愬姛杩斿洖MI_OK +///////////////////////////////////////////////////////////////////// +static int PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr) +{ + int status; + unsigned int unLen; + unsigned char ucComMF522Buf[MAXRLEN]; + + ucComMF522Buf[0] = PICC_RESTORE; + ucComMF522Buf[1] = sourceaddr; + CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]); + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen); + + if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) + { + status = MI_ERR; + } + + if (status == MI_OK) + { + ucComMF522Buf[0] = 0; + ucComMF522Buf[1] = 0; + ucComMF522Buf[2] = 0; + ucComMF522Buf[3] = 0; + CalulateCRC(ucComMF522Buf, 4, &ucComMF522Buf[4]); + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 6, ucComMF522Buf, &unLen); + if (status != MI_ERR) + { + status = MI_OK; + } + } + + if (status != MI_OK) + { + return MI_ERR; + } + + ucComMF522Buf[0] = PICC_TRANSFER; + ucComMF522Buf[1] = goaladdr; + + CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]); + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen); + + if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) + { + status = MI_ERR; + } + + return status; +} + +///////////////////////////////////////////////////////////////////// +//鍔 鑳斤細鍛戒护鍗$墖杩涘叆浼戠湢鐘舵 +//杩 鍥: 鎴愬姛杩斿洖MI_OK +///////////////////////////////////////////////////////////////////// +static int PcdHalt(void) +{ + int status = 0x00; + unsigned int unLen; + unsigned char ucComMF522Buf[MAXRLEN]; + + ucComMF522Buf[0] = PICC_HALT; + ucComMF522Buf[1] = 0; + CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]); + + status = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &unLen); + + // return MI_OK; + return status; +} +#endif + + + + +#define CARD_SN_LEN 8 +unsigned char error_count=0; +unsigned char card_SN_last[CARD_SN_LEN]; +#include "string.h" +// +////MF522 鍗¢獙璇佹椂闇瑕佸弬鏁 +//unsigned char DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; +/* +s1锛屽紑鍚嚜鍔ㄥ鍗,绛夊緟鐩村埌鏈夊崱0xE6+ 1byte + 4byte鐨勫簭鍒楀彿 +S2,鍏抽棴鑷姩瀵诲崱 +S3,寮鍚1444A澶嶅悎瀵诲崱 +S4, 璇诲啓鎿嶄綔 */ +#ifdef _NEW_NFC_APP + +int nfc_write_read_N_block(struct nfc_app_STR *nfc) +{ + unsigned char card_type[2]; + unsigned char card_SN[4]; + unsigned char card_SN_this[CARD_SN_LEN]; + unsigned char i,rtmp[16],tmp[16],status; + + //瀵诲崱锛----寰楀埌鍗$殑绫诲瀷0x4400 + if( (status =PcdRequest(PICC_REQALL, card_type) ) != MI_OK){ + if( (status!=1) && (++error_count>=30) ){ + error_count=0; + memset(card_SN_last,0,CARD_SN_LEN); + } + return 0xE0; //return MI_ERR; + } + /* FM11NT ---0x44 , 0x00 + M1 ---0x04 , //鐧藉崱 + */ + + //鏇存敼涓篗0鍗$殑闃插啿鎾炴祦绋 YSY 2019.10.14 + //闃插啿鎾,----寰楀埌 鍗$墖搴忓垪鍙凤紝4瀛楄妭 + if( PcdAnticoll(0x93, card_SN) != MI_OK) + return 0xE1; //return MI_ERR;goto rfid_error1; + memcpy(card_SN_this,card_SN,4); + //閫夊崱--INPUT 鍗$墖鐨勫簭鍒楀彿4瀛楄妭!! + if( PcdSelect(0x93, card_SN)!= MI_OK) + return 0xE1; //goto rfid_error1; + if( PcdAnticoll(0x95, card_SN)!= MI_OK) + return 0xE1; //goto rfid_error1; + memcpy(card_SN_this+4,card_SN,4); + + error_count =0; + if(memcmp(card_SN_this,card_SN_last,CARD_SN_LEN) ==0) + return 1; //tag淇濇寔add by Gavin 渚夸簬澶栭儴鍋氬簲鐢 + + //閫夊崱--INPUT 鍗$墖鐨勫簭鍒楀彿4瀛楄妭!! + if( PcdSelect(0x95, card_SN) != MI_OK) + return 0xE1; //goto rfid_error1; + + + //--------------------------------------------------------------------- + //a,write + for(i=0;iwblock_cnt;i++){ + //a1, read + if(PcdRead(nfc->waddr[i],rtmp)!= MI_OK) + goto rfid_error_retry1; + //a2, modify + memcpy(rtmp,nfc->wbuf[i],4); + //a3,write + if(PcdWrite(nfc->waddr[i], rtmp) != MI_OK) + goto rfid_error_retry2; + }//for + + //a4,read then check them + for(i=0;iwblock_cnt;i++){ + if(PcdRead(nfc->waddr[i],tmp)!= MI_OK) + goto rfid_error_retry3; + if( memcmp(nfc->wbuf[i],tmp,4) !=0 ) + goto rfid_error_retry4; + }//for + + //20201016 add by Gavin 淇敼娆℃暟 + if(nfc->card_write_cnt_addr !=0){ + unsigned int r_count,w_count=0; + if(PcdRead(nfc->card_write_cnt_addr,tmp)!= MI_OK) + goto rfid_error_retry6; + w_count =(tmp[0]<<24)+(tmp[1]<<16)+(tmp[2]<<8)+(tmp[3]<<0) +1; + tmp[0] = w_count>>24; + tmp[1] = w_count>>16; + tmp[2] = w_count>>8; + tmp[3] = w_count>>0; + if(PcdWrite(nfc->card_write_cnt_addr, tmp) != MI_OK) + goto rfid_error_retry6; + + //read and check + if(PcdRead(nfc->card_write_cnt_addr,tmp)!= MI_OK) + goto rfid_error_retry6; + r_count =(tmp[0]<<24)+(tmp[1]<<16)+(tmp[2]<<8)+(tmp[3]<<0); + if( w_count != r_count) + goto rfid_error_retry6; + } + + //b,read keypad SN + for(i=0;irblock_cnt;i++){ + if( PcdRead(nfc->raddr[i],rtmp)!= MI_OK ) + goto rfid_error_retry5; //return 0xE2; // + memcpy(nfc->rbuf[i],rtmp,4); + }//for + + //--------2020.12.17 浠嶯FC鐩存帴鑾峰彇UID; add by Gavin + nfc->rbuf[0][0] = card_SN_this[7]; + nfc->rbuf[0][1] = card_SN_this[6]; + nfc->rbuf[0][2] = card_SN_this[5]; + nfc->rbuf[0][3] = card_SN_this[4]; + + nfc->rbuf[1][0] = card_SN_this[3]; + nfc->rbuf[1][1] = card_SN_this[2]; + nfc->rbuf[1][2] = card_SN_this[1]; + nfc->rbuf[1][3] = card_SN_this[0]; + //------------------------------------- + + memcpy(card_SN_last,card_SN_this,CARD_SN_LEN); + return 0x12; //return MI_OK; + //---------------------------------------------------------------------------- + +rfid_error_retry1: +rfid_error_retry2: +rfid_error_retry3: +rfid_error_retry4: +rfid_error_retry5: +rfid_error_retry6: + return 0xE2; // + +} +#else +int nfc_write_read_N_block(struct nfc_app_STR *nfc) +{ + unsigned char card_type[2]; + unsigned char card_SN[4]; + unsigned char card_SN_this[CARD_SN_LEN]; + unsigned char i,rtmp[16],tmp[16]; + + //瀵诲崱锛----寰楀埌鍗$殑绫诲瀷0x4400 + if( PcdRequest(PICC_REQALL, card_type) != MI_OK){ + if(++error_count>=10){ + error_count=0; + memset(card_SN_last,0,CARD_SN_LEN); + } + return 0xE0; //return MI_ERR; + } + /* FM11NT ---0x44 , 0x00 + M1 ---0x04 , //鐧藉崱 + */ + + //鏇存敼涓篗0鍗$殑闃插啿鎾炴祦绋 YSY 2019.10.14 + //闃插啿鎾,----寰楀埌 鍗$墖搴忓垪鍙凤紝4瀛楄妭 + if( PcdAnticoll(0x93, card_SN) != MI_OK) + return 0xE1; //return MI_ERR;goto rfid_error1; + memcpy(card_SN_this,card_SN,4); + //閫夊崱--INPUT 鍗$墖鐨勫簭鍒楀彿4瀛楄妭!! + if( PcdSelect(0x93, card_SN)!= MI_OK) + return 0xE1; //goto rfid_error1; + if( PcdAnticoll(0x95, card_SN)!= MI_OK) + return 0xE1; //goto rfid_error1; + memcpy(card_SN_this+4,card_SN,4); + //閫夊崱--INPUT 鍗$墖鐨勫簭鍒楀彿4瀛楄妭!! + if( PcdSelect(0x95, card_SN) != MI_OK) + return 0xE1; //goto rfid_error1; + + #ifdef _NFC_DEBUG_ + nfc->debug_driver_keep_cnt++; + #endif + error_count =0; + if(memcmp(card_SN_this,card_SN_last,CARD_SN_LEN) ==0) + return 1; //tag淇濇寔add by Gavin 渚夸簬澶栭儴鍋氬簲鐢 + //--------------------------------------------------------------------- + #ifdef _NFC_DEBUG_ + nfc->debug_driver_start_cnt++; + #endif +#if 0 + //a,write + for(i=0;iwblock_cnt;i++){ + //a1, read + if(PcdRead(nfc->waddr[i],rtmp)!= MI_OK) + goto rfid_error_retry1; + //a2, modify + memcpy(rtmp,nfc->wbuf[i],4); + //a3,write + PcdWrite(nfc->waddr[i], rtmp); + mDelay(50); + if(PcdWrite(nfc->waddr[i], rtmp) != MI_OK) + goto rfid_error_retry2; + mDelay(50); + + //a4,read then check them + if(PcdRead(nfc->waddr[i],tmp)!= MI_OK) + goto rfid_error_retry3; + if( memcmp(rtmp,tmp,4) !=0 ) + goto rfid_error_retry4; + }//for +#else + //a,write + for(i=0;iwblock_cnt;i++){ + //a1, read + if(PcdRead(nfc->waddr[i],rtmp)!= MI_OK) + goto rfid_error_retry1; + //a2, modify + memcpy(rtmp,nfc->wbuf[i],4); + //a3,write + if(PcdWrite(nfc->waddr[i], rtmp) != MI_OK) + goto rfid_error_retry2; + }//for + + ////a4,read then check them + for(i=0;iwblock_cnt;i++){ + if(PcdRead(nfc->waddr[i],tmp)!= MI_OK) + goto rfid_error_retry3; + if( memcmp(nfc->wbuf[i],tmp,4) !=0 ) + goto rfid_error_retry4; + }//for + + //20201016 add by Gavin 淇敼娆℃暟 + if(nfc->card_write_cnt_addr !=0){ + unsigned int r_count,w_count=0; + if(PcdRead(nfc->card_write_cnt_addr,tmp)!= MI_OK) + goto rfid_error_retry6; + w_count =(tmp[0]<<24)+(tmp[1]<<16)+(tmp[2]<<8)+(tmp[3]<<0) +1; + tmp[0] = w_count>>24; + tmp[1] = w_count>>16; + tmp[2] = w_count>>8; + tmp[3] = w_count>>0; + if(PcdWrite(nfc->card_write_cnt_addr, tmp) != MI_OK) + goto rfid_error_retry6; + + //read and check + if(PcdRead(nfc->card_write_cnt_addr,tmp)!= MI_OK) + goto rfid_error_retry6; + r_count =(tmp[0]<<24)+(tmp[1]<<16)+(tmp[2]<<8)+(tmp[3]<<0); + if( w_count != r_count) + goto rfid_error_retry6; + } +#endif + + //b,read keypad SN + for(i=0;irblock_cnt;i++){ + if( PcdRead(nfc->raddr[i],rtmp)!= MI_OK ) + goto rfid_error_retry5; //return 0xE2; // + memcpy(nfc->rbuf[i],rtmp,4); + }//for + #ifdef _NFC_DEBUG_ + nfc->debug_driver_ok_cnt++; + memcpy(nfc->card_sn,card_SN_this,CARD_SN_LEN); + #endif + memcpy(card_SN_last,card_SN_this,CARD_SN_LEN); + return 0x12; //return MI_OK; + //---------------------------------------------------------------------------- + +#ifdef _NFC_DEBUG_ +rfid_error_retry1: + memcpy(nfc->error[1].card_sn[nfc->error[1].cnt],card_SN_this,CARD_SN_LEN); + nfc->error[1].cnt++; + return 0xE2; // +rfid_error_retry2: + memcpy(nfc->error[2].card_sn[nfc->error[2].cnt],card_SN_this,CARD_SN_LEN); + nfc->error[2].cnt++; + return 0xE2; // +rfid_error_retry3: + memcpy(nfc->error[3].card_sn[nfc->error[3].cnt],card_SN_this,CARD_SN_LEN); + nfc->error[3].cnt++; + return 0xE2; // +rfid_error_retry4: + memcpy(nfc->error[4].card_sn[nfc->error[4].cnt],card_SN_this,CARD_SN_LEN); + nfc->error[4].cnt++; + return 0xE2; // +rfid_error_retry5: + memcpy(nfc->error[5].card_sn[nfc->error[5].cnt],card_SN_this,CARD_SN_LEN); + nfc->error[5].cnt++; + return 0xE2; // +rfid_error_retry6: + memcpy(nfc->error[6].card_sn[nfc->error[6].cnt],card_SN_this,CARD_SN_LEN); + nfc->error[6].cnt++; + return 0xE2; // +#else +rfid_error_retry1: +rfid_error_retry2: +rfid_error_retry3: +rfid_error_retry4: +rfid_error_retry5: +rfid_error_retry6: + return 0xE2; // +#endif +} + +#endif + +////////////////////////////////////////////////////////////////////// +//??RC632????? +////////////////////////////////////////////////////////////////////// +static int M500PcdConfigISOType(unsigned char type) +{ + if (type == 'A'){ //ISO14443_A + ClearBitMask(Status2Reg, 0x08); + WriteRawRC(RxSelReg, 0x86); //84 + WriteRawRC(RFCfgReg, 0x7F); //4F + WriteRawRC(TReloadRegL, 30); //tmoLength);// TReloadVal = 'h6a =tmoLength(dec) + WriteRawRC(TReloadRegH, 0); + WriteRawRC(TModeReg, 0x8D); + WriteRawRC(TPrescalerReg, 0x3E); + WriteRawRC(TxAutoReg, 0x40); //Force100ASK(???)//add by Gavin + + mDelay(100); + PcdAntennaOn(); + } + else{ + return MI_NOTAGERR;//-1; + } + + return MI_OK; +} + + + + + +/* +* initinal RFid card enter; */ +void rfid_init(void) +{ + SPI_InitIO(); + PcdReset(); + PcdAntennaOff(); //鍏抽棴澶╃嚎 + PcdAntennaOn(); //寮鍚ぉ绾 + + M500PcdConfigISOType('A'); +} + +//unsigned char testx; +/* +* this function using check rfid reader connect or not +*/ +unsigned char get_rfid_reader_Hard_connect_status(void) +{ + //testx =ReadRawRC(RFCfgReg); + + return ( (ReadRawRC(RFCfgReg)==0x7F)?1:0); +} + + + + + + +/* +* rfid reader-- debug only +*/ +unsigned char nfc_reader(unsigned char addr,unsigned char cnt,unsigned char *out) +{ + unsigned char card_type[2]; + unsigned char card_SN[4]; + unsigned char card_SN_this[CARD_SN_LEN]; + unsigned char i;//,rtmp[16],tmp[16]; + + //瀵诲崱锛----寰楀埌鍗$殑绫诲瀷0x4400 + if( PcdRequest(PICC_REQALL, card_type) != MI_OK){ + if(++error_count>=10){ + error_count=0; + memset(card_SN_last,0,CARD_SN_LEN); + } + return 0xE0; //return MI_ERR; + } + /* FM11NT ---0x44 , 0x00 + M1 ---0x04 , //鐧藉崱 + */ + + //鏇存敼涓篗0鍗$殑闃插啿鎾炴祦绋 YSY 2019.10.14 + //闃插啿鎾,----寰楀埌 鍗$墖搴忓垪鍙凤紝4瀛楄妭 + if( PcdAnticoll(0x93, card_SN) != MI_OK) + return 0xE1; //return MI_ERR;goto rfid_error1; + memcpy(card_SN_this,card_SN,4); + //閫夊崱--INPUT 鍗$墖鐨勫簭鍒楀彿4瀛楄妭!! + if( PcdSelect(0x93, card_SN)!= MI_OK) + return 0xE1; //goto rfid_error1; + if( PcdAnticoll(0x95, card_SN)!= MI_OK) + return 0xE1; //goto rfid_error1; + memcpy(card_SN_this+4,card_SN,4); + //閫夊崱--INPUT 鍗$墖鐨勫簭鍒楀彿4瀛楄妭!! + if( PcdSelect(0x95, card_SN) != MI_OK) + return 0xE1; //goto rfid_error1; + + error_count =0; + if(memcmp(card_SN_this,card_SN_last,CARD_SN_LEN) ==0) + return 1; //tag淇濇寔add by Gavin 渚夸簬澶栭儴鍋氬簲鐢 + + //b,read keypad SN + for(i=0;iSR & 1 << 1 ) == 0 ){ // 绛夊緟鍙戦佺┖闂 + retry++; + if( retry > SPI1_BREAK ) + return 0; + } + SPI1->DR = TxData; //鍙戦 + + retry = 0; + while( ( SPI1->SR & 1 << 0 ) == 0 ){ //绛夊緟鎺ユ敹瀹屾垚 + retry++; + if( retry > SPI1_BREAK ) + return 0; + } + return SPI1->DR; //杩斿洖鎺ユ敹鍒扮殑鏁版嵁 +#else + + uint8_t rlst; + unsigned char rx_data; + OPEN_MISO(rf_seq); + rlst =HW_RF_SPI_TransmitReceive(&TxData,&rx_data,1);//HAL_SPI_TransmitReceive(&hspi1,&TxData,&rx_data,1, 100); +// CLOSE_MISO(rf_seq); + if(rlst == 0x00U) + return rx_data; + else + return 0; +#endif +} + +#define SPI_WR_N 1 //add by Gavin20211023 + +static unsigned char drv_spi_read_write_byte_N( unsigned char *TxData,unsigned char *RxData,unsigned char len,unsigned char rf_seq ) +{ + #ifdef SIM_SPI + #define SPI1_BREAK 200 + unsigned short retry = 0; + while( ( SPI1->SR & 1 << 1 ) == 0 ){ // 绛夊緟鍙戦佺┖闂 + retry++; + if( retry > SPI1_BREAK ) + return 0; + } + SPI1->DR = TxData; //鍙戦 + + retry = 0; + while( ( SPI1->SR & 1 << 0 ) == 0 ){ //绛夊緟鎺ユ敹瀹屾垚 + retry++; + if( retry > SPI1_BREAK ) + return 0; + } + return SPI1->DR; //杩斿洖鎺ユ敹鍒扮殑鏁版嵁 +#else + + uint8_t rlst; + //unsigned char rx_data; + //OPEN_MISO(rf_seq); + rlst =HW_RF_SPI_TransmitReceive(TxData,RxData,len);//HAL_SPI_TransmitReceive(&hspi1,TxData,RxData,len, 500); +// CLOSE_MISO(rf_seq); + if(rlst == 0x00U) + return 1; + else + return 0; +#endif +} + + +/* +2019.12.04 瀹炴祴 delay(500) =500us; +鐜锛氫富棰168MHz,鍏抽棴涓柇,IO鍙栧弽鐢ㄧず娉㈠櫒娴嬭瘯!! +鐢变簬GPIO鏃犳硶鍝嶅簲 delayus(1)锛屾墍浠ュ疄闄呮祴璇昫elay(500) =500us */ +static void _24R1_delay_us( unsigned short time ) +{ + unsigned short i = 0; + while( time-- ){ + i = 30; + while( i-- ) ; + } +} + +/* +*/ +static void DelayUs( unsigned short time ) +{ +// unsigned short i = 0; +// while( time-- ){ +// i = 6; //16M=2 +// while( i-- ) ; +// } + _24R1_delay_us(10); +} + + + + + +/** + * @brief :NRF24L01璇诲瘎瀛樺櫒 + * @param : + @Addr:瀵勫瓨鍣ㄥ湴鍧 + * @note :鍦板潃鍦ㄨ澶囦腑鏈夋晥 + * @retval:璇诲彇鐨勬暟鎹 + */ +static uint8_t NRF24L01_Read_Reg( uint8_t RegAddr,unsigned char rf_seq ) +{ + uint8_t btmp; +// if(rf_seq !=1) +// rf_seq=1; + RF24L01_SET_CS_LOW(rf_seq ); //鐗囬 + + drv_spi_read_write_byte( NRF_READ_REG | RegAddr,rf_seq ); //璇诲懡浠 鍦板潃 + btmp = drv_spi_read_write_byte( 0xFF ,rf_seq); //璇绘暟鎹 + + RF24L01_SET_CS_HIGH(rf_seq ); //鍙栨秷鐗囬 + + return btmp; +} + +/** + * @brief :NRF24L01璇绘寚瀹氶暱搴︾殑鏁版嵁 + * @param : + * @reg:鍦板潃 + * @pBuf:鏁版嵁瀛樻斁鍦板潃 + * @len:鏁版嵁闀垮害 + * @note :鏁版嵁闀垮害涓嶈秴杩255锛屽湴鍧鍦ㄨ澶囦腑鏈夋晥 + * @retval:璇诲彇鐘舵 + */ +void NRF24L01_Read_Buf( uint8_t RegAddr, uint8_t* pBuf, uint8_t len ,unsigned char rf_seq) +{ + uint8_t btmp; + + RF24L01_SET_CS_LOW(rf_seq ); //鐗囬 + + drv_spi_read_write_byte( NRF_READ_REG | RegAddr ,rf_seq); //璇诲懡浠 鍦板潃 + #if (SPI_WR_N) + { + unsigned char tmp[256]; + drv_spi_read_write_byte_N(tmp,pBuf,len,rf_seq); + } + #else + for( btmp = 0; btmp < len; btmp ++ ) + { + *( pBuf + btmp ) = drv_spi_read_write_byte( 0xFF ,rf_seq); //璇绘暟鎹 + } + #endif + RF24L01_SET_CS_HIGH(rf_seq ); //鍙栨秷鐗囬 +} + +/** + * @brief :NRF24L01鍐欏瘎瀛樺櫒 + * @param :鏃 + * @note :鍦板潃鍦ㄨ澶囦腑鏈夋晥 + * @retval:璇诲啓鐘舵 + */ +static void NRF24L01_Write_Reg( uint8_t RegAddr, uint8_t Value ,unsigned char rf_seq) +{ + +// if(rf_seq !=1) +// rf_seq=1; + + RF24L01_SET_CE_LOW(rf_seq); //pei鍙兘鍦╯tandby妯″紡涓嬩慨鏀!! + RF24L01_SET_CS_LOW(rf_seq); //鐗囬 + + drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr ,rf_seq); //鍐欏懡浠 鍦板潃 + drv_spi_read_write_byte( Value ,rf_seq); //鍐欐暟鎹 + + RF24L01_SET_CS_HIGH( rf_seq); //鍙栨秷鐗囬 +} + +/** + * @brief :NRF24L01鍐欐寚瀹氶暱搴︾殑鏁版嵁 + * @param : + * @reg:鍦板潃 + * @pBuf:鍐欏叆鐨勬暟鎹湴鍧 + * @len:鏁版嵁闀垮害 + * @note :鏁版嵁闀垮害涓嶈秴杩255锛屽湴鍧鍦ㄨ澶囦腑鏈夋晥 + * @retval:鍐欑姸鎬 + */ +static void NRF24L01_Write_Buf( uint8_t RegAddr, uint8_t* pBuf, uint8_t len ,unsigned char rf_seq) +{ + uint8_t i; + + RF24L01_SET_CS_LOW(rf_seq ); //鐗囬 + + drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr ,rf_seq); //鍐欏懡浠 鍦板潃 + #if (SPI_WR_N) + { + unsigned char tmp[256]; + drv_spi_read_write_byte_N(pBuf,tmp,len,rf_seq); + } + #else + for( i = 0; i < len; i ++ ) + { + drv_spi_read_write_byte( *( pBuf + i ) ,rf_seq); //鍐欐暟鎹 + } + #endif + RF24L01_SET_CS_HIGH( rf_seq); //鍙栨秷鐗囬 +} + + +/** + * @brief :娓呯┖TX缂撳啿鍖 + * @param :鏃 + * @note :鏃 + * @retval:鏃 + */ +static void NRF24L01_Flush_Tx_Fifo( unsigned char rf_seq) +{ + RF24L01_SET_CS_LOW( rf_seq); //鐗囬 + + drv_spi_read_write_byte( FLUSH_TX ,rf_seq); //娓匱X FIFO鍛戒护 + + RF24L01_SET_CS_HIGH(rf_seq ); //鍙栨秷鐗囬 +} + +/** + * @brief :娓呯┖RX缂撳啿鍖 + * @param :鏃 + * @note :鏃 + * @retval:鏃 + */ +static void NRF24L01_Flush_Rx_Fifo( unsigned char rf_seq) +{ + RF24L01_SET_CS_LOW(rf_seq ); //鐗囬 + + drv_spi_read_write_byte( FLUSH_RX ,rf_seq); //娓匯X FIFO鍛戒护 + + RF24L01_SET_CS_HIGH( rf_seq); //鍙栨秷鐗囬 +} + +/** + * @brief :閲嶆柊浣跨敤涓婁竴鍖呮暟鎹 + * @param :鏃 + * @note :鏃 + * @retval:鏃 + */ +//static void NRF24L01_Reuse_Tx_Payload( void ) +//{ +// RF24L01_SET_CS_LOW( ); //鐗囬 + +// drv_spi_read_write_byte( REUSE_TX_PL ); //閲嶆柊浣跨敤涓婁竴鍖呭懡浠 + +// RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +//} + +/** + * @brief :NRF24L01绌烘搷浣 + * @param :鏃 + * @note :鏃 + * @retval:鏃 + */ +//static void NRF24L01_Nop( void ) +//{ +// RF24L01_SET_CS_LOW( ); //鐗囬 + +// drv_spi_read_write_byte( NOP ); //绌烘搷浣滃懡浠 + +// RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +//} + +/** + * @brief :NRF24L01璇荤姸鎬佸瘎瀛樺櫒 + * @param :鏃 + * @note :鏃 + * @retval:RF24L01鐘舵 + */ +static uint8_t NRF24L01_Read_Status_Register( unsigned char rf_seq ) +{ + uint8_t Status; + + RF24L01_SET_CS_LOW( rf_seq); //鐗囬 + + Status = drv_spi_read_write_byte( NRF_READ_REG + STATUS ,rf_seq); //璇荤姸鎬佸瘎瀛樺櫒 + + RF24L01_SET_CS_HIGH( rf_seq); //鍙栨秷鐗囬 + + return Status; +} + +/** + * @brief :NRF24L01娓呬腑鏂 + * @param : + @IRQ_Source:涓柇婧 + * @note :鏃 + * @retval:娓呴櫎鍚庣姸鎬佸瘎瀛樺櫒鐨勫 + */ +static uint8_t NRF24L01_Clear_IRQ_Flag( uint8_t IRQ_Source ,unsigned char rf_seq) +{ + uint8_t btmp = 0; + + IRQ_Source &= ( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT ); //涓柇鏍囧織澶勭悊 + btmp = NRF24L01_Read_Status_Register( rf_seq); //璇荤姸鎬佸瘎瀛樺櫒 + + RF24L01_SET_CS_LOW( rf_seq); //鐗囬 + drv_spi_read_write_byte( NRF_WRITE_REG + STATUS ,rf_seq); //鍐欑姸鎬佸瘎瀛樺櫒鍛戒护 + drv_spi_read_write_byte( IRQ_Source | btmp ,rf_seq); //娓呯浉搴斾腑鏂爣蹇 + RF24L01_SET_CS_HIGH( rf_seq); //鍙栨秷鐗囬 + + return ( NRF24L01_Read_Status_Register( rf_seq) ); //杩斿洖鐘舵佸瘎瀛樺櫒鐘舵 +} + +/** + * @brief :璇籖F24L01涓柇鐘舵 + * @param :鏃 + * @note :鏃 + * @retval:涓柇鐘舵 + */ +//static uint8_t RF24L01_Read_IRQ_Status( void ) +//{ +// return ( NRF24L01_Read_Status_Register( ) & ( ( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT ) ) ); //杩斿洖涓柇鐘舵 +//} + +/** + * @brief :璇籉IFO涓暟鎹搴 + * @param :鏃 + * @note :鏃 + * @retval:鏁版嵁瀹藉害 + */ +static uint8_t NRF24L01_Read_Top_Fifo_Width( unsigned char rf_seq ) +{ + uint8_t btmp; + + RF24L01_SET_CS_LOW( rf_seq); //鐗囬 + + drv_spi_read_write_byte( R_RX_PL_WID ,rf_seq); //璇籉IFO涓暟鎹搴﹀懡浠 + btmp = drv_spi_read_write_byte( 0xFF ,rf_seq); //璇绘暟鎹 + + RF24L01_SET_CS_HIGH( rf_seq); //鍙栨秷鐗囬 + + return btmp; +} + +/** + * @brief :璇绘帴鏀跺埌鐨勬暟鎹 + * @param :鏃 + * @note :鏃 + * @retval: + @pRxBuf:鏁版嵁瀛樻斁鍦板潃棣栧湴鍧 + */ +static uint8_t NRF24L01_Read_Rx_Payload( uint8_t* pRxBuf ,unsigned char rf_seq) +{ + uint8_t volatile Width, PipeNum; + + PipeNum = ( NRF24L01_Read_Reg( STATUS ,rf_seq) >> 1 ) & 0x07; //璇绘帴鏀剁姸鎬 + //Width= NRF24L01_Read_Reg(RX_PW_P0);//璇诲嚭涓0 + Width = NRF24L01_Read_Top_Fifo_Width(rf_seq ); //璇绘帴鏀舵暟鎹釜鏁 + if( Width > 32 ) //pei--濂藉儚鍑虹幇涓嶄簡 + { + NRF24L01_Flush_Rx_Fifo( rf_seq); + return 0; + } + + RF24L01_SET_CS_LOW(rf_seq ); //鐗囬 + drv_spi_read_write_byte( RD_RX_PLOAD ,rf_seq); //璇绘湁鏁堟暟鎹懡浠 + #if (SPI_WR_N) + { + unsigned char tmp[256]; + drv_spi_read_write_byte_N(tmp,pRxBuf,Width,rf_seq); + } + #else + for( PipeNum = 0; PipeNum < Width; PipeNum ++ ) + { + *( pRxBuf + PipeNum ) = drv_spi_read_write_byte( 0xFF ,rf_seq); //璇绘暟鎹 + } + #endif + RF24L01_SET_CS_HIGH( rf_seq); //鍙栨秷鐗囬 + + NRF24L01_Flush_Rx_Fifo( rf_seq); //娓呯┖RX FIFO --鍑虹幇杩囪鍑烘槸涓婁竴鍖呮儏鍐靛悗鍔---纭疄鑳芥ā鎷熷嚭鐜 + //Width = NRF24L01_Read_Top_Fifo_Width( );//鍗充娇娓呴櫎FIFO璇诲嚭杩樻槸鍘熸潵鐨勫 + //NRF24L01_Clear_IRQ_Flag( IRQ_ALL );//鍙互閬垮厤涓柇鍝嶅簲涓張鎺ユ敹涓鍖呭悗妯″潡涓嶅啀浜х敓涓柇锛屽洜涓轰腑鏂病娓呴櫎鏍囧織 + return Width; +} + +/** + * @brief :鍙戦佹暟鎹紙甯﹀簲绛旓級 + * @param : + * @pTxBuf:鍙戦佹暟鎹湴鍧 + * @len:闀垮害 + * @note :涓娆′笉瓒呰繃32涓瓧鑺 + * @retval:鏃 + */ +//static void NRF24L01_Write_Tx_Payload_Ack( uint8_t* pTxBuf, uint8_t len ) +//{ +// uint8_t btmp; +// uint8_t length = ( len > 32 ) ? 32 : len; //鏁版嵁闀胯揪澶х害32 鍒欏彧鍙戦32涓 + +// NRF24L01_Flush_Tx_Fifo( ); //娓匱X FIFO + +// RF24L01_SET_CS_LOW( ); //鐗囬 +// drv_spi_read_write_byte( WR_TX_PLOAD ); //鍙戦佸懡浠 + +// for( btmp = 0; btmp < length; btmp ++ ) +// { +// drv_spi_read_write_byte( *( pTxBuf + btmp ) ); //鍙戦佹暟鎹 +// } +// RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +//} + +/** + * @brief :鍙戦佹暟鎹紙涓嶅甫搴旂瓟锛 + * @param : + * @pTxBuf:鍙戦佹暟鎹湴鍧 + * @len:闀垮害 + * @note :涓娆′笉瓒呰繃32涓瓧鑺 + * @retval:鏃 + */ +static void NRF24L01_Write_Tx_Payload_NoAck( uint8_t* pTxBuf, uint8_t len ,unsigned char rf_seq) +{ + if( len > 32 || len == 0 ) + { + return ; //鏁版嵁闀垮害澶т簬32 鎴栬呯瓑浜0 涓嶆墽琛 + } + + RF24L01_SET_CS_LOW( rf_seq); //鐗囬 + drv_spi_read_write_byte( WR_TX_PLOAD_NACK ,rf_seq); //鍙戦佸懡浠 + #if (SPI_WR_N) + { + unsigned char tmp[256]; + drv_spi_read_write_byte_N(pTxBuf,tmp,len,rf_seq); + } + #else + while( len-- ) + { + drv_spi_read_write_byte( *pTxBuf ,rf_seq); //鍙戦佹暟鎹 + pTxBuf++; + } + #endif + RF24L01_SET_CS_HIGH(rf_seq ); //鍙栨秷鐗囬 +} + +/** + * @brief :鍦ㄦ帴鏀舵ā寮忎笅鍚慣X FIFO鍐欐暟鎹(甯CK) + * @param : + * @pData:鏁版嵁鍦板潃 + * @len:闀垮害 + * @note :涓娆′笉瓒呰繃32涓瓧鑺 + * @retval:鏃 + */ +//static void NRF24L01_Write_Tx_Payload_InAck( uint8_t* pData, uint8_t len ) +//{ +// uint8_t btmp; + +// len = ( len > 32 ) ? 32 : len; //鏁版嵁闀垮害澶т簬32涓垯鍙啓32涓瓧鑺 + +// RF24L01_SET_CS_LOW( ); //鐗囬 +// drv_spi_read_write_byte( W_ACK_PLOAD ); //鍛戒护 +// for( btmp = 0; btmp < len; btmp ++ ) +// { +// drv_spi_read_write_byte( *( pData + btmp ) ); //鍐欐暟鎹 +// } +// RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +//} + +/** + * @brief :璁剧疆鍙戦佸湴鍧 + * @param : + * @pAddr:鍦板潃瀛樻斁鍦板潃 + * @len:闀垮害 + * @note :鏃 + * @retval:鏃 + */ +static void NRF24L01_Set_TxAddr( uint8_t* pAddr, uint8_t len ,unsigned char rf_seq) +{ + len = ( len > 5 ) ? 5 : len; //鍦板潃涓嶈兘澶т簬5涓瓧鑺 + NRF24L01_Write_Buf( TX_ADDR, pAddr, len ,rf_seq); //鍐欏湴鍧 +} + +/** + * @brief :璁剧疆鎺ユ敹閫氶亾鍦板潃 + * @param : + * @PipeNum:閫氶亾 + * @pAddr:鍦板潃瀛樿偉鐫鍦板潃 + * @Len:闀垮害 + * @note :閫氶亾涓嶅ぇ浜5 鍦板潃闀垮害涓嶅ぇ浜5涓瓧鑺 + * @retval:鏃 + */ +static void NRF24L01_Set_RxAddr( uint8_t PipeNum, uint8_t* pAddr, uint8_t Len ,unsigned char rf_seq) +{ + Len = ( Len > 5 ) ? 5 : Len; + PipeNum = ( PipeNum > 5 ) ? 5 : PipeNum; //閫氶亾涓嶅ぇ浜5 鍦板潃闀垮害涓嶅ぇ浜5涓瓧鑺 + + NRF24L01_Write_Buf( RX_ADDR_P0 + PipeNum, pAddr, Len ,rf_seq); //鍐欏叆鍦板潃 +} + +/** + * @brief :璁剧疆閫氫俊閫熷害 + * @param : + * @Speed:閫熷害 + * @note :鏃 + * @retval:鏃 + */ +static void NRF24L01_Set_Speed( nRf24l01SpeedType Speed ,unsigned char rf_seq) +{ + uint8_t btmp = 0; + + btmp = NRF24L01_Read_Reg( RF_SETUP ,rf_seq); + btmp &= ~( ( 1 << 5 ) | ( 1 << 3 ) ); + + if( Speed == SPEED_250K ) //250K + { + btmp |= ( 1 << 5 ); + } + else if( Speed == SPEED_1M ) //1M + { + btmp &= ~( ( 1 << 5 ) | ( 1 << 3 ) ); + } + else if( Speed == SPEED_2M ) //2M + { + btmp |= ( 1 << 3 ); + } + + NRF24L01_Write_Reg( RF_SETUP, btmp ,rf_seq); +} + + +/** + * @brief :璁剧疆棰戠巼 + * @param : + * @FreqPoint:棰戠巼璁剧疆鍙傛暟 + * @note :鍊间笉澶т簬127 + * @retval:鏃 + */ +static void RF24L01_Chan( uint8_t FreqPoint ,unsigned char rf_seq) +{ + NRF24L01_Write_Reg( RF_CH, FreqPoint & 0x7F ,rf_seq); +} + +/** + * @brief :NRF24L01妫娴 + * @param :鏃 + * @note :鏃 + * @retval:鏃 + */ +unsigned char NRF24L01_check( unsigned char rf_seq ) +{ + uint8_t i; + uint8_t buf[5] = { 0X11, 0X22, 0XA3, 0XA4, 0XA5 }; + uint8_t read_buf[ 5 ] = { 0 }; + + NRF24L01_Write_Buf( TX_ADDR, buf, 5 ,rf_seq); //鍐欏叆5涓瓧鑺傜殑鍦板潃 + NRF24L01_Read_Buf( TX_ADDR, read_buf, 5 ,rf_seq); //璇诲嚭鍐欏叆鐨勫湴鍧 + + for( i = 0; i < 5; i++ ){ + if( buf[ i ] != read_buf[ i ] ) + return 0; + } + return 1; +} + +/** + * @brief :璁剧疆妯″紡 + * @param : + * @Mode:妯″紡鍙戦佹ā寮忔垨鎺ユ敹妯″紡 + * @note :鏃 + * @retval:鏃 + */ +static void RF24L01_Set_Mode( nRf24l01ModeType Mode ,unsigned char rf_seq) +{ + uint8_t controlreg = 0; + controlreg = NRF24L01_Read_Reg( CONFIG ,rf_seq); + + if( Mode == MODE_TX ) + { + controlreg &= ~( 1 << PRIM_RX ); + } + else + { + if( Mode == MODE_RX ) + { + controlreg |= ( 1 << PRIM_RX ); + } + } + + NRF24L01_Write_Reg( CONFIG, controlreg ,rf_seq); +} + +/** + * @brief :NRF24L01鍙戦佷竴娆℃暟鎹 + * @param : + * @txbuf:寰呭彂閫佹暟鎹鍦板潃 + * @Length:鍙戦佹暟鎹暱搴 + * @note :鏃 + * @retval: + * MAX_TX锛氳揪鍒版渶澶ч噸鍙戞鏁 + * TX_OK锛氬彂閫佸畬鎴 + * 0xFF:鍏朵粬鍘熷洜 + */ +//static uint8_t NRF24L01_TxPacket( uint8_t* txbuf, uint8_t Length ) +//{ +//// uint8_t l_Status = 0; +//// uint16_t l_MsTimes = 0; + +// RF24L01_SET_CS_LOW( ); //鐗囬 +// drv_spi_read_write_byte( FLUSH_TX ); +// RF24L01_SET_CS_HIGH( ); + +// RF24L01_SET_CE_LOW( ); +// NRF24L01_Write_Buf( WR_TX_PLOAD, txbuf, Length ); //鍐欐暟鎹埌TX BUF 32瀛楄妭 TX_PLOAD_WIDTH +// RF24L01_SET_CE_HIGH( ); //鍚姩鍙戦 + +// return 0xFF; //鍏朵粬鍘熷洜鍙戦佸け璐 +//} + +/** + * @brief :NRF24L01鎺ユ敹鏁版嵁 + * @param : + * @rxbuf:鎺ユ敹鏁版嵁瀛樻斁鍦板潃 + * @note :鏃 + * @retval:鎺ユ敹鐨勬暟鎹釜鏁 + */ +//static uint8_t NRF24L01_RxPacket( uint8_t* rxbuf ) +//{ +// uint8_t l_Status = 0, l_RxLength = 0;//, l_100MsTimes = 0; + +// l_Status = NRF24L01_Read_Reg( STATUS ); //璇荤姸鎬佸瘎瀛樺櫒 +// NRF24L01_Write_Reg( STATUS, l_Status ); //娓呬腑鏂爣蹇 +// if( l_Status & RX_OK ) //鎺ユ敹鍒版暟鎹 +// { +// l_RxLength = NRF24L01_Read_Reg( R_RX_PL_WID ); //璇诲彇鎺ユ敹鍒扮殑鏁版嵁涓暟 +// NRF24L01_Read_Buf( RD_RX_PLOAD, rxbuf, l_RxLength ); //鎺ユ敹鍒版暟鎹 +// NRF24L01_Write_Reg( FLUSH_RX, 0xff ); //娓呴櫎RX FIFO +// return l_RxLength; +// } + +// return 0; //娌℃湁鏀跺埌鏁版嵁 +//} + + + +//#define NRF24L01 +static void NRF24L01_SetPA( unsigned char level ,unsigned char rf_seq) +{ + uint8_t btmp; + +#ifdef NRF24L01 + btmp = NRF24L01_Read_Reg( RF_SETUP ) & ~0x06; + btmp |= ( (level<<1) & 6 ) |0x01; + NRF24L01_Write_Reg( RF_SETUP, btmp ); +#else + btmp = NRF24L01_Read_Reg( RF_SETUP ,rf_seq) & ~0x07; + btmp |= ( level & 7 ); + NRF24L01_Write_Reg( RF_SETUP, btmp ,rf_seq); +#endif + +} + +//鍒囨崲鍒版帴鏀舵ā寮 +static void RF24L01_RxOn(unsigned char rf_seq) +{ + RF24L01_SET_CE_LOW(rf_seq);//standby鎵嶈兘璁剧疆 + + RF24L01_Set_Mode( MODE_RX ,rf_seq); + RF24L01_SET_CE_HIGH(rf_seq); +} + + + +//娓呴櫎鎺ユ敹涓柇鏍囧織浣嶏紝瑙i櫎鑺墖鎺ユ敹姝绘満 +static void RF24L01_ClrIRQ(unsigned char rf_seq) +{ + NRF24L01_Clear_IRQ_Flag( IRQ_ALL ,rf_seq); +} + + + + + + + + + +//------------------------------------------------------------------------------------------------ + +//static void rf_io_init( void ) +//{ +// SPI_InitTypeDef SPI_InitStructure; +// GPIO_InitTypeDef GPIO_InitStructure; +// EXTI_InitTypeDef EXTI_InitStructure; +// NVIC_InitTypeDef NVIC_InitStructure; + +// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE ); +// /* Enable SPI1 clocks */ //驴陋脢录鲁玫脢录禄炉SPI +// RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE ); + +// /* Configure SPI1 pins: NSS, SCK, MISO and MOSI */ +// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //no NSS +// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; +// GPIO_Init( GPIOA, &GPIO_InitStructure ); +// +// GPIO_InitStructure.GPIO_Pin = RF_CS; +// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; +// GPIO_Init( RF_PORT, &GPIO_InitStructure ); +// GPIO_SetBits( RF_PORT, RF_CS ); + +// /* SPI1 configuration */ +// SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; +// SPI_InitStructure.SPI_Mode = SPI_Mode_Master; +// SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; +//#ifndef SI24R1 +// SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; +// SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; +//#else +// SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //驴脮脧脨脳麓脤卢脦陋碌脥碌莽脝陆 +// SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //碌脷脪禄赂枚卤脽脩脴虏脡录炉脢媒戮脻 +//#endif +// SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //脠铆录镁驴脴脰脝CS陆脜 +// SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//SPI_SPEED ; +// SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; +// SPI_InitStructure.SPI_CRCPolynomial = 7; +// SPI_Init( SPI1, &SPI_InitStructure ); +// SPI_Cmd( SPI1, ENABLE ); //脢鹿脛脺SPI + +// //2,鍒濆鍖 PA LNA io +// GPIO_InitStructure.GPIO_Pin = RF_PA | RF_LNA; +// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; +// GPIO_Init( RF_PAPORT, &GPIO_InitStructure ); +// GPIO_ResetBits( RF_PAPORT, RF_PA ); +// GPIO_ResetBits( RF_PAPORT, RF_LNA ); + + +// //3锛岃缃甀O杈撳叆妯″紡鐢ㄤ簬妫娴媟f鐨勪腑鏂 +// /* Configure PA.3 pin as input floating */ +// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; +// GPIO_Init( GPIOA, &GPIO_InitStructure ); +// /* Connect EXTI3 Line to PA.3 pin */ +// GPIO_EXTILineConfig( GPIO_PortSourceGPIOA, GPIO_PinSource3 ); + +// /* Configure EXTI3 line */ +// EXTI_InitStructure.EXTI_Line = EXTI_Line3; +// EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; +// EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //脧脗脤酶脩脴 +// EXTI_InitStructure.EXTI_LineCmd = ENABLE; +// EXTI_Init( &EXTI_InitStructure ); + +// /* Enable and set EXTI3 Interrupt priority */ +// NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; +// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; +// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//2; +// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; +// NVIC_Init( &NVIC_InitStructure ); +// +// NVIC_DisableIRQ( EXTI3_IRQn ); +//} + + + + + +/* +璁剧疆棰戠巼鐐 +*/ +void rf_setfreq(unsigned char freq,unsigned char rf_seq) +{ + + CLI(); + RF24L01_Chan( freq ,rf_seq); + RF24L01_RxOn(rf_seq);//璁剧疆棰戠巼鍚庡垏鎹㈠埌鎺ユ敹妯″紡 + SEI(); +} + + + +/* +璁剧疆鍚屾鐮 +*/ +#if (SUPPORT_HS6621_SOC) +void rf_set_syncode(unsigned short sync,unsigned char sync_cnt,unsigned char rf_seq) +{ + uint8_t addr[5] = {INIT_ADDR}; //#define INIT_ADDR 0x19,0x98,0xA4,0x25,0x01 + addr[2] = sync>>8; + addr[3] = sync; //淇敼鏃犵嚎鍦板潃鐮侊紝缂虹渷A425 + NRF24L01_Set_TxAddr( addr, sync_cnt ,rf_seq); //璁剧疆TX鍦板潃 + NRF24L01_Set_RxAddr( 0,addr, sync_cnt ,rf_seq); //璁剧疆RX鍦板潃 閫氶亾0 +} +#else +void rf_set_syncode(unsigned short sync,unsigned char rf_seq) +{ + uint8_t addr[5] = {INIT_ADDR}; //#define INIT_ADDR 0x19,0x98,0xA4,0x25,0x01 + addr[2] = sync>>8; + addr[3] = sync; //淇敼鏃犵嚎鍦板潃鐮侊紝缂虹渷A425 + NRF24L01_Set_TxAddr( addr, 4 ,rf_seq); //璁剧疆TX鍦板潃 + NRF24L01_Set_RxAddr( 0,addr, 4 ,rf_seq); //璁剧疆RX鍦板潃 閫氶亾0 +} +#endif + + +//鍩虹珯璁剧疆鍔熺巼锛屾斁鍦ㄩ鐐瑰垵濮嬪寲鍑芥暟閲岄潰 +void rf_set_PA_Mode( unsigned char mode ,unsigned char rf_seq) +{ + //#ifdef FASTMATCH_LOWERPA + if(check_fastmatch_lowerPA()) + NRF24L01_SetPA( PWR_7DB ,rf_seq); + else + //#endif + { + switch( mode ) + { + case 1: + NRF24L01_SetPA( PWR_F4DB ,rf_seq); + break; + case 2: + NRF24L01_SetPA( PWR_F6DB ,rf_seq); + break; + case 3: + NRF24L01_SetPA( PWR_F12DB ,rf_seq); + break; + default: + NRF24L01_SetPA( PWR_0DB ,rf_seq); + break; + } + } +} + + + +//--------------------------------------------------------------- +//鍒濆鍖 +void rf_initial(unsigned char rf_seq) +{ + //test only + NRF24L01_check(rf_seq);//Gavin + + NRF24L01_Clear_IRQ_Flag( IRQ_ALL ,rf_seq); + +#if DYNAMIC_PACKET == 1 + NRF24L01_Write_Reg( DYNPD, ( 1 << 0 ) ,rf_seq); //浣胯兘閫氶亾0鍔ㄦ佹暟鎹暱搴 + //NRF24L01_Write_Reg( FEATRUE, 0x07 ); + NRF24L01_Write_Reg( FEATRUE, + ( 1 << EN_DPL ) | //鍔ㄦ侀暱搴 + //( 1 << EN_ACK_PAY ) | //甯﹁礋杞芥暟鎹殑ACK鍖, 鍏佽鏃犲簲绛旓紝 + ( 1 << EN_DYN_ACK ) ,rf_seq); //甯﹁礋杞藉簲绛: 鍏抽棴 + NRF24L01_Read_Reg( DYNPD ,rf_seq); + NRF24L01_Read_Reg( FEATRUE ,rf_seq); +#elif DYNAMIC_PACKET == 0 + //L01_WriteSingleReg( L01REG_RX_PW_P0, FIXED_PACKET_LEN ); //鍥哄畾鏁版嵁闀垮害 + NRF24L01_Write_Reg( FEATRUE, + //( 1 << EN_DPL ) | //鍔ㄦ侀暱搴 + //( 1 << EN_ACK_PAY ) | //甯﹁礋杞芥暟鎹殑ACK鍖, 鍏佽鏃犲簲绛旓紝 + ( 1 << EN_DYN_ACK ) ,rf_seq); //甯﹁礋杞藉簲绛: 鍏抽棴 + NRF24L01_Write_Reg(RX_PW_P0,FIXED_PACKET_LEN,rf_seq); +#endif //DYNAMIC_PACKET + + NRF24L01_Write_Reg( CONFIG, + //( 1< 32 ) + Length = 32; + + //#ifdef FASTMATCH_LOWERPA//add by Gavin + if(check_fastmatch_lowerPA()) + RF24L01_SET_PATX_LOW(rf_seq); + else + RF24L01_SET_PATX_HIGH(rf_seq); + //#endif + #if (SUPPORT_HS6621_SOC) + Length =FIXED_PACKET_LEN; + #endif + NRF24L01_Write_Tx_Payload_NoAck( txbuf, Length ,rf_seq); + RF24L01_SET_CE_HIGH(rf_seq); //鍚姩鍙戦 + DelayUs( 50 ); //10us灏卞彲浠ュ惎鍔ㄥ彂閫 + RF24L01_SET_CE_LOW(rf_seq); +} + + +extern void rf_modual__tx_interrupt_counter(unsigned char id); +static volatile unsigned char tx_ok_flag; +void set_tx_ok_flag(unsigned char flag) +{ + tx_ok_flag =flag; +} +unsigned char get_tx_ok_flag(void) +{ + return tx_ok_flag; +} +//鏃犵嚎涓柇鍝嶅簲 +void rf_Irq(unsigned char rf_seq) +{ + unsigned char Status,tmp[64+1]; + + Status = NRF24L01_Read_Reg( STATUS ,rf_seq); //璇荤姸鎬佸瘎瀛樺櫒 +// DelayUs( 200 ); //渚涚ず娉㈠櫒瑙傚療 + NRF24L01_Write_Reg( STATUS, Status ,rf_seq); //娓呬腑鏂爣蹇---閲岄潰CE缃綆瀵艰嚧涓嶅啀鎺ユ敹 + + if( Status & RX_OK ){ //鎺ユ敹鍒版暟鎹 +// tmp[0] = NRF24L01_Read_Rx_Payload(&tmp[1] ,rf_seq); +// keypad_rf_data_save(tmp); + //Note:鐢╰mp[0]璁板綍鏁版嵁鏉ユ簮閭d釜鏃犵嚎妯″潡,鍦ㄤ富绋嬪簭杞鏃惰В閲婃淇℃伅 + tmp[0] = rf_seq; //record鏁版嵁鏉ユ簮!! + tmp[1] = NRF24L01_Read_Rx_Payload(&tmp[2] ,rf_seq); + + base_core.rf_data_fifo_in(tmp); //keypad_rf_data_save(tmp); + } + + if( Status & TX_OK ){ + set_tx_ok_flag(1); + rf_modual__tx_interrupt_counter(rf_seq); + } + + RF24L01_SET_PATX_LOW(rf_seq);//lower PA in fast match + + RF24L01_ClrIRQ(rf_seq);//鎺掗櫎鎺ユ敹姝绘満鐨勬儏鍐 + RF24L01_RxOn(rf_seq); +} + + + + + + + + + + + + + +//------------------------------------------------- FCCCE ----------------------------------------------------------------- +/* +Gavin 20180629 FCCCE +1,鍏抽棴 鍚戦敭鐩樺畾鏃跺彂閫佷俊鏍 --timer2.5ms涓 +2锛屽睆钄 涓荤▼搴忓惊鐜腑鐨勫簲鐢紱 +3锛屽皢鍜宲c閫氫俊鐨勫嚱鏁扮Щ鍔╱sb涓柇閲岀洿鎺ュ鐞嗭紝瀹炵幇锛 + a锛岀敤sdk鏉ュ垏鎹㈠悇绉嶆祴璇曟ā寮 + b,鍒╃敤sdk淇敼棰戠偣鍜屽熀绔欐湰韬殑DFU +4, +*/ +#ifdef FCCCE +//FCC璁よ瘉闇瑕佺殑鐗规畩娴嬭瘯妯″紡 +//1 杩炵画鍙戝皠妯″紡锛堝甫璋冨埗锛 +//2 杩炵画鏀朵俊妯″紡锛堝甫璋冨埗锛 +//3 鏃犺皟鍒 杩炵画鍙戜俊妯″紡 +//4 鏃犺皟鍒 杩炵画鏀朵俊妯″紡 + + +void FCC_test_enter(unsigned char mode,unsigned char rf_seq) +{ + unsigned char i; + + + //FccMode=Mode; + + switch (mode){ + case 0: + case 1://杩炵画MSK杈撳嚭 + CLI(); + i=NRF24L01_Read_Reg(RF_SETUP,0); + //i |= (1<SR & 1 << 1 ) == 0 ) // 绛夊緟鍙戦佺┖闂 +// //while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) +// { +// retry++; +// if( retry > SPI1_BREAK ) +// { +// return 0; +// } +// } +// SPI1->DR = TxData; //鍙戦 + +// retry = 0; +// while( ( SPI1->SR & 1 << 0 ) == 0 ) //绛夊緟鎺ユ敹瀹屾垚 +// //while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) +// { +// retry++; +// if( retry > SPI1_BREAK ) +// { +// return 0; +// } +// } +// return SPI1->DR; //杩斿洖鎺ユ敹鍒扮殑鏁版嵁 + +//typedef enum +//{ +// HAL_OK = 0x00U, +// HAL_ERROR = 0x01U, +// HAL_BUSY = 0x02U, +// HAL_TIMEOUT = 0x03U +//} HAL_StatusTypeDef; + + HAL_StatusTypeDef rlst; + unsigned char rx_data; + rlst =HAL_SPI_TransmitReceive(&hspi1,&TxData,&rx_data,1, 5); + + if(rlst == HAL_OK) + return rx_data; + else + return 0; +} + +/** + * @brief :NRF24L01璇诲瘎瀛樺櫒 + * @param : + @Addr:瀵勫瓨鍣ㄥ湴鍧 + * @note :鍦板潃鍦ㄨ澶囦腑鏈夋晥 + * @retval:璇诲彇鐨勬暟鎹 + */ +static uint8_t NRF24L01_Read_Reg( uint8_t RegAddr ) +{ + uint8_t btmp; + + RF24L01_SET_CS_LOW( ); //鐗囬 + + drv_spi_read_write_byte( NRF_READ_REG | RegAddr ); //璇诲懡浠 鍦板潃 + btmp = drv_spi_read_write_byte( 0xFF ); //璇绘暟鎹 + + RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 + + return btmp; +} + +/** + * @brief :NRF24L01璇绘寚瀹氶暱搴︾殑鏁版嵁 + * @param : + * @reg:鍦板潃 + * @pBuf:鏁版嵁瀛樻斁鍦板潃 + * @len:鏁版嵁闀垮害 + * @note :鏁版嵁闀垮害涓嶈秴杩255锛屽湴鍧鍦ㄨ澶囦腑鏈夋晥 + * @retval:璇诲彇鐘舵 + */ +static void NRF24L01_Read_Buf( uint8_t RegAddr, uint8_t* pBuf, uint8_t len ) +{ + uint8_t btmp; + + RF24L01_SET_CS_LOW( ); //鐗囬 + + drv_spi_read_write_byte( NRF_READ_REG | RegAddr ); //璇诲懡浠 鍦板潃 + for( btmp = 0; btmp < len; btmp ++ ) + { + *( pBuf + btmp ) = drv_spi_read_write_byte( 0xFF ); //璇绘暟鎹 + } + RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +} + +/** + * @brief :NRF24L01鍐欏瘎瀛樺櫒 + * @param :鏃 + * @note :鍦板潃鍦ㄨ澶囦腑鏈夋晥 + * @retval:璇诲啓鐘舵 + */ +static void NRF24L01_Write_Reg( uint8_t RegAddr, uint8_t Value ) +{ + RF24L01_SET_CE_LOW( ); //pei鍙兘鍦╯tandby妯″紡涓嬩慨鏀!! + RF24L01_SET_CS_LOW( ); //鐗囬 + + drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr ); //鍐欏懡浠 鍦板潃 + drv_spi_read_write_byte( Value ); //鍐欐暟鎹 + + RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +} + +/** + * @brief :NRF24L01鍐欐寚瀹氶暱搴︾殑鏁版嵁 + * @param : + * @reg:鍦板潃 + * @pBuf:鍐欏叆鐨勬暟鎹湴鍧 + * @len:鏁版嵁闀垮害 + * @note :鏁版嵁闀垮害涓嶈秴杩255锛屽湴鍧鍦ㄨ澶囦腑鏈夋晥 + * @retval:鍐欑姸鎬 + */ +static void NRF24L01_Write_Buf( uint8_t RegAddr, uint8_t* pBuf, uint8_t len ) +{ + uint8_t i; + + RF24L01_SET_CS_LOW( ); //鐗囬 + + drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr ); //鍐欏懡浠 鍦板潃 + for( i = 0; i < len; i ++ ) + { + drv_spi_read_write_byte( *( pBuf + i ) ); //鍐欐暟鎹 + } + + RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +} + + +/** + * @brief :娓呯┖TX缂撳啿鍖 + * @param :鏃 + * @note :鏃 + * @retval:鏃 + */ +static void NRF24L01_Flush_Tx_Fifo( void ) +{ + RF24L01_SET_CS_LOW( ); //鐗囬 + + drv_spi_read_write_byte( FLUSH_TX ); //娓匱X FIFO鍛戒护 + + RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +} + +/** + * @brief :娓呯┖RX缂撳啿鍖 + * @param :鏃 + * @note :鏃 + * @retval:鏃 + */ +static void NRF24L01_Flush_Rx_Fifo( void ) +{ + RF24L01_SET_CS_LOW( ); //鐗囬 + + drv_spi_read_write_byte( FLUSH_RX ); //娓匯X FIFO鍛戒护 + + RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +} + +/** + * @brief :閲嶆柊浣跨敤涓婁竴鍖呮暟鎹 + * @param :鏃 + * @note :鏃 + * @retval:鏃 + */ +//static void NRF24L01_Reuse_Tx_Payload( void ) +//{ +// RF24L01_SET_CS_LOW( ); //鐗囬 + +// drv_spi_read_write_byte( REUSE_TX_PL ); //閲嶆柊浣跨敤涓婁竴鍖呭懡浠 + +// RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +//} + +/** + * @brief :NRF24L01绌烘搷浣 + * @param :鏃 + * @note :鏃 + * @retval:鏃 + */ +//static void NRF24L01_Nop( void ) +//{ +// RF24L01_SET_CS_LOW( ); //鐗囬 + +// drv_spi_read_write_byte( NOP ); //绌烘搷浣滃懡浠 + +// RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +//} + +/** + * @brief :NRF24L01璇荤姸鎬佸瘎瀛樺櫒 + * @param :鏃 + * @note :鏃 + * @retval:RF24L01鐘舵 + */ +static uint8_t NRF24L01_Read_Status_Register( void ) +{ + uint8_t Status; + + RF24L01_SET_CS_LOW( ); //鐗囬 + + Status = drv_spi_read_write_byte( NRF_READ_REG + STATUS ); //璇荤姸鎬佸瘎瀛樺櫒 + + RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 + + return Status; +} + +/** + * @brief :NRF24L01娓呬腑鏂 + * @param : + @IRQ_Source:涓柇婧 + * @note :鏃 + * @retval:娓呴櫎鍚庣姸鎬佸瘎瀛樺櫒鐨勫 + */ +static uint8_t NRF24L01_Clear_IRQ_Flag( uint8_t IRQ_Source ) +{ + uint8_t btmp = 0; + + IRQ_Source &= ( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT ); //涓柇鏍囧織澶勭悊 + btmp = NRF24L01_Read_Status_Register( ); //璇荤姸鎬佸瘎瀛樺櫒 + + RF24L01_SET_CS_LOW( ); //鐗囬 + drv_spi_read_write_byte( NRF_WRITE_REG + STATUS ); //鍐欑姸鎬佸瘎瀛樺櫒鍛戒护 + drv_spi_read_write_byte( IRQ_Source | btmp ); //娓呯浉搴斾腑鏂爣蹇 + RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 + + return ( NRF24L01_Read_Status_Register( ) ); //杩斿洖鐘舵佸瘎瀛樺櫒鐘舵 +} + +/** + * @brief :璇籖F24L01涓柇鐘舵 + * @param :鏃 + * @note :鏃 + * @retval:涓柇鐘舵 + */ +//static uint8_t RF24L01_Read_IRQ_Status( void ) +//{ +// return ( NRF24L01_Read_Status_Register( ) & ( ( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT ) ) ); //杩斿洖涓柇鐘舵 +//} + +/** + * @brief :璇籉IFO涓暟鎹搴 + * @param :鏃 + * @note :鏃 + * @retval:鏁版嵁瀹藉害 + */ +static uint8_t NRF24L01_Read_Top_Fifo_Width( void ) +{ + uint8_t btmp; + + RF24L01_SET_CS_LOW( ); //鐗囬 + + drv_spi_read_write_byte( R_RX_PL_WID ); //璇籉IFO涓暟鎹搴﹀懡浠 + btmp = drv_spi_read_write_byte( 0xFF ); //璇绘暟鎹 + + RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 + + return btmp; +} + +/** + * @brief :璇绘帴鏀跺埌鐨勬暟鎹 + * @param :鏃 + * @note :鏃 + * @retval: + @pRxBuf:鏁版嵁瀛樻斁鍦板潃棣栧湴鍧 + */ +static uint8_t NRF24L01_Read_Rx_Payload( uint8_t* pRxBuf ) +{ + uint8_t volatile Width, PipeNum; + + PipeNum = ( NRF24L01_Read_Reg( STATUS ) >> 1 ) & 0x07; //璇绘帴鏀剁姸鎬 + //Width= NRF24L01_Read_Reg(RX_PW_P0);//璇诲嚭涓0 + Width = NRF24L01_Read_Top_Fifo_Width( ); //璇绘帴鏀舵暟鎹釜鏁 + if( Width > 32 ) //pei--濂藉儚鍑虹幇涓嶄簡 + { + NRF24L01_Flush_Rx_Fifo( ); + return 0; + } + + RF24L01_SET_CS_LOW( ); //鐗囬 + drv_spi_read_write_byte( RD_RX_PLOAD ); //璇绘湁鏁堟暟鎹懡浠 + + for( PipeNum = 0; PipeNum < Width; PipeNum ++ ) + { + *( pRxBuf + PipeNum ) = drv_spi_read_write_byte( 0xFF ); //璇绘暟鎹 + } + RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 + + NRF24L01_Flush_Rx_Fifo( ); //娓呯┖RX FIFO --鍑虹幇杩囪鍑烘槸涓婁竴鍖呮儏鍐靛悗鍔---纭疄鑳芥ā鎷熷嚭鐜 + //Width = NRF24L01_Read_Top_Fifo_Width( );//鍗充娇娓呴櫎FIFO璇诲嚭杩樻槸鍘熸潵鐨勫 + //NRF24L01_Clear_IRQ_Flag( IRQ_ALL );//鍙互閬垮厤涓柇鍝嶅簲涓張鎺ユ敹涓鍖呭悗妯″潡涓嶅啀浜х敓涓柇锛屽洜涓轰腑鏂病娓呴櫎鏍囧織 + return Width; +} + +/** + * @brief :鍙戦佹暟鎹紙甯﹀簲绛旓級 + * @param : + * @pTxBuf:鍙戦佹暟鎹湴鍧 + * @len:闀垮害 + * @note :涓娆′笉瓒呰繃32涓瓧鑺 + * @retval:鏃 + */ +//static void NRF24L01_Write_Tx_Payload_Ack( uint8_t* pTxBuf, uint8_t len ) +//{ +// uint8_t btmp; +// uint8_t length = ( len > 32 ) ? 32 : len; //鏁版嵁闀胯揪澶х害32 鍒欏彧鍙戦32涓 + +// NRF24L01_Flush_Tx_Fifo( ); //娓匱X FIFO + +// RF24L01_SET_CS_LOW( ); //鐗囬 +// drv_spi_read_write_byte( WR_TX_PLOAD ); //鍙戦佸懡浠 + +// for( btmp = 0; btmp < length; btmp ++ ) +// { +// drv_spi_read_write_byte( *( pTxBuf + btmp ) ); //鍙戦佹暟鎹 +// } +// RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +//} + +/** + * @brief :鍙戦佹暟鎹紙涓嶅甫搴旂瓟锛 + * @param : + * @pTxBuf:鍙戦佹暟鎹湴鍧 + * @len:闀垮害 + * @note :涓娆′笉瓒呰繃32涓瓧鑺 + * @retval:鏃 + */ +static void NRF24L01_Write_Tx_Payload_NoAck( uint8_t* pTxBuf, uint8_t len ) +{ + if( len > 32 || len == 0 ) + { + return ; //鏁版嵁闀垮害澶т簬32 鎴栬呯瓑浜0 涓嶆墽琛 + } + + RF24L01_SET_CS_LOW( ); //鐗囬 + drv_spi_read_write_byte( WR_TX_PLOAD_NACK ); //鍙戦佸懡浠 + while( len-- ) + { + drv_spi_read_write_byte( *pTxBuf ); //鍙戦佹暟鎹 + pTxBuf++; + } + RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +} + +/** + * @brief :鍦ㄦ帴鏀舵ā寮忎笅鍚慣X FIFO鍐欐暟鎹(甯CK) + * @param : + * @pData:鏁版嵁鍦板潃 + * @len:闀垮害 + * @note :涓娆′笉瓒呰繃32涓瓧鑺 + * @retval:鏃 + */ +//static void NRF24L01_Write_Tx_Payload_InAck( uint8_t* pData, uint8_t len ) +//{ +// uint8_t btmp; + +// len = ( len > 32 ) ? 32 : len; //鏁版嵁闀垮害澶т簬32涓垯鍙啓32涓瓧鑺 + +// RF24L01_SET_CS_LOW( ); //鐗囬 +// drv_spi_read_write_byte( W_ACK_PLOAD ); //鍛戒护 +// for( btmp = 0; btmp < len; btmp ++ ) +// { +// drv_spi_read_write_byte( *( pData + btmp ) ); //鍐欐暟鎹 +// } +// RF24L01_SET_CS_HIGH( ); //鍙栨秷鐗囬 +//} + +/** + * @brief :璁剧疆鍙戦佸湴鍧 + * @param : + * @pAddr:鍦板潃瀛樻斁鍦板潃 + * @len:闀垮害 + * @note :鏃 + * @retval:鏃 + */ +static void NRF24L01_Set_TxAddr( uint8_t* pAddr, uint8_t len ) +{ + len = ( len > 5 ) ? 5 : len; //鍦板潃涓嶈兘澶т簬5涓瓧鑺 + NRF24L01_Write_Buf( TX_ADDR, pAddr, len ); //鍐欏湴鍧 +} + +/** + * @brief :璁剧疆鎺ユ敹閫氶亾鍦板潃 + * @param : + * @PipeNum:閫氶亾 + * @pAddr:鍦板潃瀛樿偉鐫鍦板潃 + * @Len:闀垮害 + * @note :閫氶亾涓嶅ぇ浜5 鍦板潃闀垮害涓嶅ぇ浜5涓瓧鑺 + * @retval:鏃 + */ +static void NRF24L01_Set_RxAddr( uint8_t PipeNum, uint8_t* pAddr, uint8_t Len ) +{ + Len = ( Len > 5 ) ? 5 : Len; + PipeNum = ( PipeNum > 5 ) ? 5 : PipeNum; //閫氶亾涓嶅ぇ浜5 鍦板潃闀垮害涓嶅ぇ浜5涓瓧鑺 + + NRF24L01_Write_Buf( RX_ADDR_P0 + PipeNum, pAddr, Len ); //鍐欏叆鍦板潃 +} + +/** + * @brief :璁剧疆閫氫俊閫熷害 + * @param : + * @Speed:閫熷害 + * @note :鏃 + * @retval:鏃 + */ +static void NRF24L01_Set_Speed( nRf24l01SpeedType Speed ) +{ + uint8_t btmp = 0; + + btmp = NRF24L01_Read_Reg( RF_SETUP ); + btmp &= ~( ( 1 << 5 ) | ( 1 << 3 ) ); + + if( Speed == SPEED_250K ) //250K + { + btmp |= ( 1 << 5 ); + } + else if( Speed == SPEED_1M ) //1M + { + btmp &= ~( ( 1 << 5 ) | ( 1 << 3 ) ); + } + else if( Speed == SPEED_2M ) //2M + { + btmp |= ( 1 << 3 ); + } + + NRF24L01_Write_Reg( RF_SETUP, btmp ); +} + + +/** + * @brief :璁剧疆棰戠巼 + * @param : + * @FreqPoint:棰戠巼璁剧疆鍙傛暟 + * @note :鍊间笉澶т簬127 + * @retval:鏃 + */ +static void RF24L01_Chan( uint8_t FreqPoint ) +{ + NRF24L01_Write_Reg( RF_CH, FreqPoint & 0x7F ); +} + +/** + * @brief :NRF24L01妫娴 + * @param :鏃 + * @note :鏃 + * @retval:鏃 + */ +static void NRF24L01_check( void ) +{ + uint8_t i; + uint8_t buf[5] = { 0X11, 0X22, 0XA3, 0XA4, 0XA5 }; + uint8_t read_buf[ 5 ] = { 0 }; + + NRF24L01_Write_Buf( TX_ADDR, buf, 5 ); //鍐欏叆5涓瓧鑺傜殑鍦板潃 + NRF24L01_Read_Buf( TX_ADDR, read_buf, 5 ); //璇诲嚭鍐欏叆鐨勫湴鍧 + + for( i = 0; i < 5; i++ ) + { + if( buf[ i ] != read_buf[ i ] ) + { + break; + } + } +} + +/** + * @brief :璁剧疆妯″紡 + * @param : + * @Mode:妯″紡鍙戦佹ā寮忔垨鎺ユ敹妯″紡 + * @note :鏃 + * @retval:鏃 + */ +static void RF24L01_Set_Mode( nRf24l01ModeType Mode ) +{ + uint8_t controlreg = 0; + controlreg = NRF24L01_Read_Reg( CONFIG ); + + if( Mode == MODE_TX ) + { + controlreg &= ~( 1 << PRIM_RX ); + } + else + { + if( Mode == MODE_RX ) + { + controlreg |= ( 1 << PRIM_RX ); + } + } + + NRF24L01_Write_Reg( CONFIG, controlreg ); +} + +/** + * @brief :NRF24L01鍙戦佷竴娆℃暟鎹 + * @param : + * @txbuf:寰呭彂閫佹暟鎹鍦板潃 + * @Length:鍙戦佹暟鎹暱搴 + * @note :鏃 + * @retval: + * MAX_TX锛氳揪鍒版渶澶ч噸鍙戞鏁 + * TX_OK锛氬彂閫佸畬鎴 + * 0xFF:鍏朵粬鍘熷洜 + */ +//static uint8_t NRF24L01_TxPacket( uint8_t* txbuf, uint8_t Length ) +//{ +//// uint8_t l_Status = 0; +//// uint16_t l_MsTimes = 0; + +// RF24L01_SET_CS_LOW( ); //鐗囬 +// drv_spi_read_write_byte( FLUSH_TX ); +// RF24L01_SET_CS_HIGH( ); + +// RF24L01_SET_CE_LOW( ); +// NRF24L01_Write_Buf( WR_TX_PLOAD, txbuf, Length ); //鍐欐暟鎹埌TX BUF 32瀛楄妭 TX_PLOAD_WIDTH +// RF24L01_SET_CE_HIGH( ); //鍚姩鍙戦 + +// return 0xFF; //鍏朵粬鍘熷洜鍙戦佸け璐 +//} + +/** + * @brief :NRF24L01鎺ユ敹鏁版嵁 + * @param : + * @rxbuf:鎺ユ敹鏁版嵁瀛樻斁鍦板潃 + * @note :鏃 + * @retval:鎺ユ敹鐨勬暟鎹釜鏁 + */ +//static uint8_t NRF24L01_RxPacket( uint8_t* rxbuf ) +//{ +// uint8_t l_Status = 0, l_RxLength = 0;//, l_100MsTimes = 0; + +// l_Status = NRF24L01_Read_Reg( STATUS ); //璇荤姸鎬佸瘎瀛樺櫒 +// NRF24L01_Write_Reg( STATUS, l_Status ); //娓呬腑鏂爣蹇 +// if( l_Status & RX_OK ) //鎺ユ敹鍒版暟鎹 +// { +// l_RxLength = NRF24L01_Read_Reg( R_RX_PL_WID ); //璇诲彇鎺ユ敹鍒扮殑鏁版嵁涓暟 +// NRF24L01_Read_Buf( RD_RX_PLOAD, rxbuf, l_RxLength ); //鎺ユ敹鍒版暟鎹 +// NRF24L01_Write_Reg( FLUSH_RX, 0xff ); //娓呴櫎RX FIFO +// return l_RxLength; +// } + +// return 0; //娌℃湁鏀跺埌鏁版嵁 +//} + + + +//#define NRF24L01 +static void NRF24L01_SetPA( unsigned char level ) +{ + uint8_t btmp; + +#ifdef NRF24L01 + btmp = NRF24L01_Read_Reg( RF_SETUP ) & ~0x06; + btmp |= ( (level<<1) & 6 ) |0x01; + NRF24L01_Write_Reg( RF_SETUP, btmp ); +#else + btmp = NRF24L01_Read_Reg( RF_SETUP ) & ~0x07; + btmp |= ( level & 7 ); + NRF24L01_Write_Reg( RF_SETUP, btmp ); +#endif + +} + +//鍒囨崲鍒版帴鏀舵ā寮 +static void RF24L01_RxOn() +{ + RF24L01_SET_CE_LOW( );//standby鎵嶈兘璁剧疆 + + RF24L01_Set_Mode( MODE_RX ); + RF24L01_SET_CE_HIGH( ); +} + + +//娓呴櫎鎺ユ敹涓柇鏍囧織浣嶏紝瑙i櫎鑺墖鎺ユ敹姝绘満 +static void RF24L01_ClrIRQ() +{ + NRF24L01_Clear_IRQ_Flag( IRQ_ALL ); +} + + +/* +璁剧疆棰戠巼鐐 +*/ +void rf_setfreq(unsigned char freq) +{ + //CLI(); + RF24L01_Chan( freq ); + RF24L01_RxOn();//璁剧疆棰戠巼鍚庡垏鎹㈠埌鎺ユ敹妯″紡 + //SEI(); +} + + + +/* +璁剧疆鍚屾鐮 +*/ +void rf_set_syncode(unsigned short sync) +{ + uint8_t addr[5] = {INIT_ADDR}; //#define INIT_ADDR 0x19,0x98,0xA4,0x25,0x01 + addr[2] = sync>>8; + addr[3] = sync; //淇敼鏃犵嚎鍦板潃鐮侊紝缂虹渷A425 + NRF24L01_Set_TxAddr( addr, 4 ); //璁剧疆TX鍦板潃 + NRF24L01_Set_RxAddr( 0,addr, 4 ); //璁剧疆RX鍦板潃 閫氶亾0 +} + + + +//鍩虹珯璁剧疆鍔熺巼锛屾斁鍦ㄩ鐐瑰垵濮嬪寲鍑芥暟閲岄潰 +void rf_set_PA_Mode( unsigned char mode ) +{ + //#ifdef FASTMATCH_LOWERPA + if(check_fastmatch_lowerPA()) + NRF24L01_SetPA( PWR_7DB ); + else + //#endif + { + switch( mode ) + { + case 1: + NRF24L01_SetPA( PWR_F4DB ); + break; + case 2: + NRF24L01_SetPA( PWR_F6DB ); + break; + case 3: + NRF24L01_SetPA( PWR_F12DB ); + break; + default: + NRF24L01_SetPA( PWR_0DB ); + break; + } + } +} + + + + +//鍒濆鍖 +void rf_initial(void) +{ + NRF24L01_check();//Gavin + + NRF24L01_Clear_IRQ_Flag( IRQ_ALL ); + +#if DYNAMIC_PACKET == 1 + NRF24L01_Write_Reg( DYNPD, ( 1 << 0 ) ); //浣胯兘閫氶亾0鍔ㄦ佹暟鎹暱搴 + //NRF24L01_Write_Reg( FEATRUE, 0x07 ); + NRF24L01_Write_Reg( FEATRUE, + ( 1 << EN_DPL ) | //鍔ㄦ侀暱搴 + //( 1 << EN_ACK_PAY ) | //甯﹁礋杞芥暟鎹殑ACK鍖, 鍏佽鏃犲簲绛旓紝 + ( 1 << EN_DYN_ACK ) ); //甯﹁礋杞藉簲绛: 鍏抽棴 + NRF24L01_Read_Reg( DYNPD ); + NRF24L01_Read_Reg( FEATRUE ); +#elif DYNAMIC_PACKET == 0 + L01_WriteSingleReg( L01REG_RX_PW_P0, FIXED_PACKET_LEN ); //鍥哄畾鏁版嵁闀垮害 +#endif //DYNAMIC_PACKET + + NRF24L01_Write_Reg( CONFIG, + //( 1< 32 ) + Length = 32; + + //#ifdef FASTMATCH_LOWERPA//add by Gavin + if(check_fastmatch_lowerPA()) + RF24L01_SET_PATX_LOW(); + else + RF24L01_SET_PATX_HIGH(); + //#endif + + NRF24L01_Write_Tx_Payload_NoAck( txbuf, Length ); + RF24L01_SET_CE_HIGH( ); //鍚姩鍙戦 + DelayUs( 50 ); //10us灏卞彲浠ュ惎鍔ㄥ彂閫 + RF24L01_SET_CE_LOW( ); +} + + + + + + + +extern unsigned char keypad_rf_data_save(const unsigned char *rf_data); +//鏃犵嚎涓柇鍝嶅簲 +void rf_Irq(void) +{ + unsigned char Status,tmp[64]; + + Status = NRF24L01_Read_Reg( STATUS ); //璇荤姸鎬佸瘎瀛樺櫒 +// DelayUs( 200 ); //渚涚ず娉㈠櫒瑙傚療 + NRF24L01_Write_Reg( STATUS, Status ); //娓呬腑鏂爣蹇---閲岄潰CE缃綆瀵艰嚧涓嶅啀鎺ユ敹 + + if( Status & RX_OK ){ //鎺ユ敹鍒版暟鎹 +// GPIO_SetBits( RF_PORT, RF_LNA ); + tmp[0] = NRF24L01_Read_Rx_Payload(&tmp[1]); + keypad_rf_data_save(tmp); + } + if( Status & TX_OK ){ + } + + //#ifdef FASTMATCH_LOWERPA//add by Gavin + RF24L01_SET_PATX_LOW(); + //#endif + + //#ifdef RFCHK + RF24L01_ClrIRQ();//鎺掗櫎鎺ユ敹姝绘満鐨勬儏鍐 + //#endif + + RF24L01_RxOn(); +} + + + + + + + + + + + + + +////------------------------------------------------- FCCCE ----------------------------------------------------------------- +///* +//Gavin 20180629 FCCCE +//1,鍏抽棴 鍚戦敭鐩樺畾鏃跺彂閫佷俊鏍 --timer2.5ms涓 +//2锛屽睆钄 涓荤▼搴忓惊鐜腑鐨勫簲鐢紱 +//3锛屽皢鍜宲c閫氫俊鐨勫嚱鏁扮Щ鍔╱sb涓柇閲岀洿鎺ュ鐞嗭紝瀹炵幇锛 +// a锛岀敤sdk鏉ュ垏鎹㈠悇绉嶆祴璇曟ā寮 +// b,鍒╃敤sdk淇敼棰戠偣鍜屽熀绔欐湰韬殑DFU +//4, +//*/ +//#ifdef FCCCE +////FCC璁よ瘉闇瑕佺殑鐗规畩娴嬭瘯妯″紡 +////1 杩炵画鍙戝皠妯″紡锛堝甫璋冨埗锛 +////2 杩炵画鏀朵俊妯″紡锛堝甫璋冨埗锛 +////3 鏃犺皟鍒 杩炵画鍙戜俊妯″紡 +////4 鏃犺皟鍒 杩炵画鏀朵俊妯″紡 + + +//void FCC_Test(uchar Mode) +//{ +// uchar i; + +// +// FccMode=Mode; +// +// switch (Mode){ +// case 0: +// case 1://杩炵画MSK杈撳嚭 +// CLI(); +// i=NRF24L01_Read_Reg(RF_SETUP); +// //i |= (1<TX,RX鏃舵牎姝 + +//2010.2.24灞忚斀浜嗘帴鏀舵椂鍊欑洿鎺RcvOk=1 +//2010.2.24鍙疧EM瀹氬埗鏃犵嚎鍚屾鐮 + +//2010.4.8 +//CC_PackStatus()璇诲彇CCA +//MCSM1=澶嶄綅鍊0x30 涓嶅啀淇敼涓0锛屼娇鑳紺CA done +//PKTLEN鍙互鍐欏皯浜64(鍘0xFF)閬垮厤FIFO婧㈠嚭锛岃櫧鐒堕噰鐢ㄤ笉瀹氶暱鍖 done +//浣跨敤CCA鎴朇S蹇呴』瑕佸厛RXON鍦ㄦ帴鏀剁姸鎬侊紵鏄殑 CCA杩樺繀椤讳娇鑳紺CA鎵嶈兘妫娴嬶紝CS涓嶉渶瑕佷娇鑳紺CA +//IOCFG2 璁剧疆涓09鍙湪GDO2鑴氱湅CCA淇″彿杈撳嚭 done + +//2010.4.16 +//娴嬭瘯鍑篊CA姣旀帴鏀跺畬鎴愭參1.7ms锛孋S杞芥尝妫娴嬭兘寰堝揩缁撴潫 + +//2010.4.24 +//娴嬭瘯RX姝绘満鏃跺欙紝鐘舵佽繕鏄1鎺ユ敹鐨勶紝骞朵笉鏄疪X婧㈠嚭锛屼絾RXBUF涓65瀛楄妭锛屽垰濂芥瘮鐗╃悊BUF澶1瀛楄妭 +//閲嶆柊IDLE鍐峈XON鍙互閫鍑烘鏈虹姸鎬侊紝鎶奝KTLEN闄愬畾涓0x20鍙互鎻愬墠缁撴潫閿欒鍖咃紒锛佽兘閬垮厤RX姝绘満鐨勬儏鍐碉紵 +//鐚滄祴鏄暱搴﹀瓧鑺傞敊璇鑷存帴鏀舵鏈猴紝鍥犱负GDO0鑴氫竴鐩翠负楂橈紙宸茬粡寮濮嬫帴鏀朵絾娌℃湁缁撴潫锛 + +//CCA鑰冭檻妫娴嬫椂闂达紝瑕佽绠楀彂閫佹椂闂达紝鏈鏈竴涓狢CA鍚庝篃鑳藉彂閫佸畬鏁存暟鎹寘 +//鍥犱负Calibartion灏辫720us锛屽強1ms鍚庢墠鑳芥娴嬪埌CCA锛屾垨鑰冭檻鍘绘帀鑷姩Calibration? +//CCA鐨勪俊鍙峰己搴﹁繕鍙互璁剧疆AGCCTRL0-2 +//瀛樺湪鑳藉彂灏勶紝浣嗕笉鑳芥帴鏀跺埌鎯呭喌锛燂紵 + +//2010.5.12 433M澧炲姞淇敼浜咮AND2010閰嶇疆楂橀熸棤绾块氫俊 +//2010.5.18 绉绘鍒癕52鏃跺欙紝淇433M涓嬬殑鍘熸枃浠讹紝2.4G鐨勯厤缃苟涓嶅 --娉ㄦ剰:CC_Init()涓笉鍚岀殑鏃犵嚎涓柇鎵撳紑涓嶅悓 +//5.19 鍔2.4G涓嬫柊閰嶇疆250K-Baud,MSK + +//2011.3 鑲栭洩鐞︾Щ妞嶅埌STC骞冲彴涓 +//2011.4.9 pei淇sync0,sync1鍓嶉潰婕弖8瀹氫箟瀵艰嚧cc_init()涓紩瀵肩爜涓嶅 +//2011.5.1 pei涓嶄娇鐢⊿PI鎿嶄綔杩涜浜嗘祴璇曪紝灏戣淇敼SPI1_ReadWriteByte() +//娉ㄦ剰锛歱ei STC骞冲彴涓嬶紝SPI鎿嶄綔锛屽繀椤籔1.6淇濇寔杈撳嚭涓洪珮锛孧ISO璇诲叆鎵嶈兘姝g‘锛屾垨鑰呴氳繃P1M1骞茶剢璁剧疆涓鸿緭鍏 + +#if 0 +#define PAMAX 0xFE +#define PAMAX2 0xA9 //-4dBm +#define PAMAX3 0x6E //-8dBm +//#define PAMAX4 0xC6 //-12dBm +#define PAMAX4 0x44 //-28dBm 閰嶅鏃跺姛鐜囬檷浣庯紝鏈缁堜娇鐢ㄤ簡-28db鐨勫弬鏁 +#endif + +#define RSSI0 72 //Rssi Offset + + +//#define FCCCE + + +#ifdef CC2500 + #ifdef FCCCE + #define PAMAX 0xE0 //0xFF //1.5 + #define PAMAX2 0xE0 //0xEE //0dBm + #define PAMAX3 0xE0 //0x6E //-8dBm + #else + #define PAMAX 0xFF //1.5 + #define PAMAX2 0xEE //0dBm + #define PAMAX3 0xE0 //0x6E //-8dBm + #endif +#else + //cc1101 433M + #define PAMAX 0xC0 //9.9 + #define PAMAX2 0x60 //0dBm + #define PAMAX3 0x35 //-8dBm + #define PAMAX4 0x1B //-16dBm +#endif + + + + +//CC2500 BAND2010 +// Chipcon +// Product = CC2500 +// Chip version = E (VERSION = 0x03) +// Crystal accuracy = 10 ppm +// X-tal frequency = 26 MHz +// RF output power = 0 dBm +// RX filterbandwidth = 541.666667 kHz +// Phase = 0 +// Datarate = 249.938965 kBaud +// Modulation = (7) MSK +// Manchester enable = (0) Manchester disabled +// RF Frequency = 2401.999939 MHz +// Channel spacing = 333.251953 kHz +// Channel number = 0 +// Optimization = Sensitivity +// Sync mode = (3) 30/32 sync word bits detected +// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX +// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled +// Forward Error Correction = (0) FEC disabled +// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word. +// Packetlength = 255 +// Preamble count = (2) 4 bytes +// Append status = 1 +// Address check = (0) No address check +// FIFO autoflush = 0 +// Device address = 0 +// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet +// GDO2 signal selection = (41) CHIP_RDY + +//#include "hw_config.h" +#include "stm32f4xx_hal.h" + + + + +//rf +//#define RF_PORT GPIOA +//#define RF_CS GPIO_PIN_4 +//#define RF_PAPORT GPIOA +//#define RF_PA GPIO_PIN_2 +//#define RF_LNA GPIO_PIN_1 +//#define RF_CS0(rf_id) HAL_GPIO_WritePin(RF_PORT,RF_CS, GPIO_PIN_RESET)//GPIO_ResetBits(RF_PORT,RF_CS) +//#define RF_CS1(rf_id) HAL_GPIO_WritePin(RF_PORT,RF_CS, GPIO_PIN_SET)//GPIO_SetBits(RF_PORT,RF_CS) + +//#define PA_EN0 HAL_GPIO_WritePin(RF_PAPORT,RF_PA, GPIO_PIN_RESET)//GPIO_ResetBits(RF_PAPORT,RF_PA) +//#define PA_EN1 HAL_GPIO_WritePin(RF_PAPORT,RF_PA, GPIO_PIN_SET)//GPIO_SetBits(RF_PAPORT,RF_PA) + +//#define LNA_EN0 HAL_GPIO_WritePin(RF_PAPORT,RF_LNA, GPIO_PIN_RESET)// GPIO_ResetBits(RF_PAPORT,RF_LNA) +//#define LNA_EN1 HAL_GPIO_WritePin(RF_PAPORT,RF_LNA, GPIO_PIN_SET)//GPIO_SetBits(RF_PAPORT,RF_LNA) + +//#define RF_READ HAL_GPIO_ReadPin(RF_PORT,GPIO_PIN_6) + + + +//hardware 200s RF modual silk screen:J2-J3-J1-J4 +GPIO_TypeDef* const rf_cs_port[4]={GPIOD,GPIOB,GPIOD,GPIOC}; +uint16_t const rf_cs_pin[4] ={GPIO_PIN_13,GPIO_PIN_4,GPIO_PIN_3,GPIO_PIN_6}; + +//isr +GPIO_TypeDef* const rf_it_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +uint16_t const rf_it_pin[4] ={GPIO_PIN_14,GPIO_PIN_5,GPIO_PIN_4,GPIO_PIN_7}; + +//鐢ㄤ簬璁剧疆寮鍏充腑鏂 +const unsigned char rf_it_pin_nbr[]={14,5,4,7}; + + +//TX PA 5.8G //cc2500 RF_LNA +GPIO_TypeDef* const rf_paTX_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +uint16_t const rf_paTX_pin[4] ={GPIO_PIN_11,GPIO_PIN_6,GPIO_PIN_1,GPIO_PIN_4}; + +//RX PA 5.8G //cc2500-RF_PA_EN +GPIO_TypeDef* const rf_ce_port[4]={GPIOD,GPIOD,GPIOD,GPIOC}; +uint16_t const rf_ce_pin[4] ={GPIO_PIN_12,GPIO_PIN_7,GPIO_PIN_2,GPIO_PIN_5}; + + +#define RF_CS1(id) HAL_GPIO_WritePin(rf_cs_port[id],rf_cs_pin[id], GPIO_PIN_SET) +#define RF_CS0(id) HAL_GPIO_WritePin(rf_cs_port[id],rf_cs_pin[id], GPIO_PIN_RESET) + +#define PA_EN1(id) HAL_GPIO_WritePin(rf_ce_port[id],rf_ce_pin[id], GPIO_PIN_SET) +#define PA_EN0(id) HAL_GPIO_WritePin(rf_ce_port[id],rf_ce_pin[id],GPIO_PIN_RESET) + +#define LNA_EN1(id) HAL_GPIO_WritePin(rf_paTX_port[id],rf_paTX_pin[id],GPIO_PIN_SET) +#define LNA_EN0(id) HAL_GPIO_WritePin(rf_paTX_port[id],rf_paTX_pin[id],GPIO_PIN_RESET) + +//#define RF_READ(id) HAL_GPIO_ReadPin(rf_it_port[id],rf_it_pin[id]) +#define RF_READ(id) HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6) + + +// miso control +GPIO_TypeDef* const miso_ctrl_port[4]={GPIOE,GPIOB,GPIOE,GPIOE}; +uint16_t const miso_ctrl_pin[4] ={GPIO_PIN_8,GPIO_PIN_7,GPIO_PIN_9,GPIO_PIN_10}; + +#define OPEN_MISO(id) HAL_GPIO_WritePin(miso_ctrl_port[id],miso_ctrl_pin[id], GPIO_PIN_SET) +#define CLOSE_MISO(id) HAL_GPIO_WritePin(miso_ctrl_port[id],miso_ctrl_pin[id], GPIO_PIN_RESET) + + + +/* +2019.12.04 瀹炴祴 delay(500) =500us; +鐜锛氫富棰168MHz,鍏抽棴涓柇,IO鍙栧弽鐢ㄧず娉㈠櫒娴嬭瘯!! +鐢变簬GPIO鏃犳硶鍝嶅簲 delayus(1)锛屾墍浠ュ疄闄呮祴璇昫elay(500) =500us */ +void ccxx_delay_us( unsigned short time ) +{ + unsigned short i = 0; + while( time-- ){ + i = 30; + while( i-- ) ; + } +} + + +//绛夊緟鑺墖ready +static void CC_Rdy(unsigned char rf_id) +{ + unsigned char i; + for (i=0;i<10;i++){ + if( RF_READ(rf_id) ==0) + return; + ccxx_delay_us(10);// + //DelayUs(20);// + } + +} + +//#define SIM_SPI //2020.06.03娴嬭瘯瀵勫瓨鍣ㄦ搷浣滄柟寮弌k銆 +#define SPI1_BREAK 200 +extern SPI_HandleTypeDef hspi1; + +static unsigned char SPI1_ReadWriteByte(unsigned char TxData,unsigned char rf_id) +{ + #ifdef SIM_SPI + unsigned short retry=0; + if((SPI1->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE){ + /* Enable SPI peripheral */ + SPI1->CR1 |= SPI_CR1_SPE; //__HAL_SPI_ENABLE(hspi); + } + + while((SPI1->SR&1<<1)==0){// 绛夊緟鍙戦佺┖闂 + if(retry++>SPI1_BREAK)return 0; + } + SPI1->DR=TxData; //鍙戦 + + retry=0; + while((SPI1->SR&1<<0)==0){ //绛夊緟鎺ユ敹瀹屾垚 + if(retry++>SPI1_BREAK)return 0; + } + return SPI1->DR; //杩斿洖鎺ユ敹鍒扮殑鏁版嵁 + #else + HAL_StatusTypeDef rlst; + unsigned char rx_data; +// OPEN_MISO(rf_id); + rlst =HAL_SPI_TransmitReceive(&hspi1,&TxData,&rx_data,1, 5); +// CLOSE_MISO(rf_id); + if(rlst == HAL_OK) + return rx_data; + else + return 0; + #endif +} + + + +//鍐欏懡浠 +static unsigned char CC_Cmd(unsigned char Cmd,unsigned char rf_id) +{ + unsigned char Status; + + RF_CS0(rf_id); + CC_Rdy(rf_id); + Status=SPI1_ReadWriteByte(Cmd,rf_id); + RF_CS1(rf_id); + return Status; +} + + + +//鎸囧畾鍦板潃锛屽啓閰嶇疆瀛 +static unsigned char CC_WrReg(unsigned char Addr,unsigned char Data,unsigned char rf_id) +{ + unsigned char Status; + + RF_CS0(rf_id); + CC_Rdy(rf_id); + Status=SPI1_ReadWriteByte(Addr,rf_id); + SPI1_ReadWriteByte(Data,rf_id); + RF_CS1(rf_id); + return Status; +} +//鎸囧畾鍦板潃锛岃繛缁啓閰嶇疆 +static unsigned char CC_WrRegs(unsigned char Addr,unsigned char *Buf,unsigned char Count,unsigned char rf_id) +{ + unsigned char Status,i; + + RF_CS0(rf_id); + CC_Rdy(rf_id); + Status=SPI1_ReadWriteByte(Addr|0x40,rf_id); + for (i=0;iFSCTRL1,rf_id); + CC_WrReg(CCxxx0_FSCTRL0, pRfSettings->FSCTRL0,rf_id); + CC_WrReg(CCxxx0_FREQ2, pRfSettings->FREQ2,rf_id); + CC_WrReg(CCxxx0_FREQ1, pRfSettings->FREQ1,rf_id); + CC_WrReg(CCxxx0_FREQ0, pRfSettings->FREQ0,rf_id); + CC_WrReg(CCxxx0_MDMCFG4, pRfSettings->MDMCFG4,rf_id); + CC_WrReg(CCxxx0_MDMCFG3, pRfSettings->MDMCFG3,rf_id); + CC_WrReg(CCxxx0_MDMCFG2, pRfSettings->MDMCFG2,rf_id); + CC_WrReg(CCxxx0_MDMCFG1, pRfSettings->MDMCFG1,rf_id); + CC_WrReg(CCxxx0_MDMCFG0, pRfSettings->MDMCFG0,rf_id); + CC_WrReg(CCxxx0_CHANNR, pRfSettings->CHANNR,rf_id); + CC_WrReg(CCxxx0_DEVIATN, pRfSettings->DEVIATN,rf_id); + CC_WrReg(CCxxx0_FREND1, pRfSettings->FREND1,rf_id); + CC_WrReg(CCxxx0_FREND0, pRfSettings->FREND0,rf_id); + CC_WrReg(CCxxx0_MCSM0 , pRfSettings->MCSM0 ,rf_id); + CC_WrReg(CCxxx0_FOCCFG, pRfSettings->FOCCFG,rf_id); + CC_WrReg(CCxxx0_BSCFG, pRfSettings->BSCFG,rf_id); + CC_WrReg(CCxxx0_AGCCTRL2, pRfSettings->AGCCTRL2,rf_id); + CC_WrReg(CCxxx0_AGCCTRL1, pRfSettings->AGCCTRL1,rf_id); + CC_WrReg(CCxxx0_AGCCTRL0, pRfSettings->AGCCTRL0,rf_id); + CC_WrReg(CCxxx0_FSCAL3, pRfSettings->FSCAL3,rf_id); + CC_WrReg(CCxxx0_FSCAL2, pRfSettings->FSCAL2,rf_id); + CC_WrReg(CCxxx0_FSCAL1, pRfSettings->FSCAL1,rf_id); + CC_WrReg(CCxxx0_FSCAL0, pRfSettings->FSCAL0,rf_id); + CC_WrReg(CCxxx0_FSTEST, pRfSettings->FSTEST,rf_id); + CC_WrReg(CCxxx0_TEST2, pRfSettings->TEST2,rf_id); + CC_WrReg(CCxxx0_TEST1, pRfSettings->TEST1,rf_id); + CC_WrReg(CCxxx0_TEST0, pRfSettings->TEST0,rf_id); + CC_WrReg(CCxxx0_IOCFG2, pRfSettings->IOCFG2,rf_id); + CC_WrReg(CCxxx0_IOCFG0, pRfSettings->IOCFG0,rf_id); + CC_WrReg(CCxxx0_PKTCTRL1, pRfSettings->PKTCTRL1,rf_id); + CC_WrReg(CCxxx0_PKTCTRL0, pRfSettings->PKTCTRL0,rf_id); + CC_WrReg(CCxxx0_ADDR, pRfSettings->ADDR,rf_id); + CC_WrReg(CCxxx0_PKTLEN, pRfSettings->PKTLEN,rf_id); + + CC_WrReg(CCxxx0_FIFOTHR, pRfSettings->FIFOTHR,rf_id); +} +#endif + + + + + + +//================================================== +#ifdef CC1101 //M433M +RF_SETTINGS rfSettings76800 = { + 0x08, // FSCTRL1 Frequency synthesizer control. + 0x00, // FSCTRL0 Frequency synthesizer control. + 0x10, // FREQ2 Frequency control word, high byte. + 0xA9, // FREQ1 Frequency control word, middle byte. + 0x5A, // FREQ0 Frequency control word, low byte. + 0xAB, // MDMCFG4 Modem configuration. + 0x83, // MDMCFG3 Modem configuration. + 0x13, // MDMCFG2 Modem configuration. + 0x20, // MDMCFG1 Modem configuration. + 0xCF, // MDMCFG0 Modem configuration. CHANSPC_M + 0x00, // CHANNR Channel number. + 0x42, // DEVIATN Modem deviation setting (when FSK modulation is enabled). + 0xB6, // FREND1 Front end RX configuration. + 0x10, // FREND0 Front end RX configuration. + 0x18, // MCSM0 Main Radio Control State Machine configuration. + 0x1D, // FOCCFG Frequency Offset Compensation Configuration. + 0x1C, // BSCFG Bit synchronization Configuration. + 0xC7, // AGCCTRL2 AGC control. + 0x00, // AGCCTRL1 AGC control. + 0xB2, // AGCCTRL0 AGC control. + 0xEA, // FSCAL3 Frequency synthesizer calibration. + 0x2A, // FSCAL2 Frequency synthesizer calibration. + 0x00, // FSCAL1 Frequency synthesizer calibration. + 0x1F, // FSCAL0 Frequency synthesizer calibration. + 0x59, // FSTEST Frequency synthesizer calibration. + 0x81, // TEST2 Various test settings. + 0x35, // TEST1 Various test settings. + 0x09, // TEST0 Various test settings. + 0x07, // FIFOTHR RXFIFO and TXFIFO thresholds. //add by Gavin + 0x0E,//0x09,//0x29, // IOCFG2 GDO2 output pin configuration. 0x09=CCA杈撳嚭 0x0E=CS杈撳嚭 + 0x06, // IOCFG0D GDO0 output pin configuration. Refer to SmartRF锟 Studio User Manual for detailed pseudo register explanation. + 0x04, // PKTCTRL1 Packet automation control. + 0x05, // PKTCTRL0 Packet automation control. + 0x00, // ADDR Device address. + 0x25,//0x20 // PKTLEN Packet length. +}; + + +//*------------------------------------------ +//* 鍑芥暟鍚嶇О : cc_rf_config +//* 鍔熻兘鎻忚堪 : 鏃犵嚎妯″潡閰嶇疆 +//* 鍏ュ彛鍙傛暟 : 鏃 +//* 鍑哄彛鍙傛暟 : 鏃 +//*--------------------------------------------- +static void cc_rf_config(RF_SETTINGS *rf_settings,unsigned char rf_id) +{ + // Write register settings + CC_WrReg(CCxxx0_FSCTRL1, rf_settings->FSCTRL1,rf_id); + CC_WrReg(CCxxx0_FSCTRL0, rf_settings->FSCTRL0,rf_id); + CC_WrReg(CCxxx0_FREQ2, rf_settings->FREQ2,rf_id); + CC_WrReg(CCxxx0_FREQ1, rf_settings->FREQ1,rf_id); + CC_WrReg(CCxxx0_FREQ0, rf_settings->FREQ0,rf_id); + CC_WrReg(CCxxx0_MDMCFG4, rf_settings->MDMCFG4,rf_id); + CC_WrReg(CCxxx0_MDMCFG3, rf_settings->MDMCFG3,rf_id); + CC_WrReg(CCxxx0_MDMCFG2, rf_settings->MDMCFG2,rf_id); + CC_WrReg(CCxxx0_MDMCFG1, rf_settings->MDMCFG1,rf_id); + CC_WrReg(CCxxx0_MDMCFG0, rf_settings->MDMCFG0,rf_id); + CC_WrReg(CCxxx0_CHANNR, rf_settings->CHANNR,rf_id); + CC_WrReg(CCxxx0_DEVIATN, rf_settings->DEVIATN,rf_id); + CC_WrReg(CCxxx0_FREND1, rf_settings->FREND1,rf_id); + CC_WrReg(CCxxx0_FREND0, rf_settings->FREND0,rf_id); + CC_WrReg(CCxxx0_MCSM0 , rf_settings->MCSM0 ,rf_id); + CC_WrReg(CCxxx0_FOCCFG, rf_settings->FOCCFG,rf_id); + CC_WrReg(CCxxx0_BSCFG, rf_settings->BSCFG,rf_id); + CC_WrReg(CCxxx0_AGCCTRL2, rf_settings->AGCCTRL2,rf_id); + CC_WrReg(CCxxx0_AGCCTRL1, rf_settings->AGCCTRL1,rf_id); + CC_WrReg(CCxxx0_AGCCTRL0, rf_settings->AGCCTRL0,rf_id); + CC_WrReg(CCxxx0_FSCAL3, rf_settings->FSCAL3,rf_id); + CC_WrReg(CCxxx0_FSCAL2, rf_settings->FSCAL2,rf_id); + CC_WrReg(CCxxx0_FSCAL1, rf_settings->FSCAL1,rf_id); + CC_WrReg(CCxxx0_FSCAL0, rf_settings->FSCAL0,rf_id); + CC_WrReg(CCxxx0_FSTEST, rf_settings->FSTEST,rf_id); + CC_WrReg(CCxxx0_TEST2, rf_settings->TEST2,rf_id); + CC_WrReg(CCxxx0_TEST1, rf_settings->TEST1,rf_id); + CC_WrReg(CCxxx0_TEST0, rf_settings->TEST0,rf_id); + CC_WrReg(CCxxx0_IOCFG2, rf_settings->IOCFG2,rf_id); + CC_WrReg(CCxxx0_IOCFG0, rf_settings->IOCFG0,rf_id); + CC_WrReg(CCxxx0_PKTCTRL1, rf_settings->PKTCTRL1,rf_id); + CC_WrReg(CCxxx0_PKTCTRL0, rf_settings->PKTCTRL0,rf_id); + CC_WrReg(CCxxx0_ADDR, rf_settings->ADDR,rf_id); + CC_WrReg(CCxxx0_PKTLEN, rf_settings->PKTLEN,rf_id); +//#ifdef BAND2010 + CC_WrReg(CCxxx0_FIFOTHR, rf_settings->FIFOTHR,rf_id); +//#endif +} + +#endif //#ifdef CC1101 + + + + +//==================================================================== + + + +//u8 CC_RssiCh(u8 rssi) +//{//杈撳嚭鍊兼槸姝e硷紝浣嗛兘鏄礋鐨刣Bm锛屼緥濡傝繑鍥炲兼槸55鏄-55dBm +// if (rssi>=128) +// { return (128+RSSI0-(rssi>>1)); +// }else +// { return (RSSI0-(rssi>>1)); +// } +//} + +/* + +*/ +unsigned char cc2500_get_rssi(unsigned char rf_id) +{ + unsigned char rssi =CC_RdStatus(CCxxx0_RSSI,rf_id); + + if (rssi>=128) + return (128+RSSI0-(rssi>>1)); + else + return (RSSI0-(rssi>>1)); +} + + +//u8 CC_PackStatus(void) +//{ +// return CC_RdStatus(CCxxx0_PKTSTATUS); +// //bit0-bit7 GDO0,GDO1,GDO2,SYNC, CCA,PQT,CS,CRCOK +// //濡傛灉MCSM1.CCA锛0娌℃湁浣跨敤CCA鐨勮瘽锛孋CA鎸囩ず浣嶆讳负1锛 +// //濡傛灉浣跨敤CCA锛孋CA鍜孋S浣嶅氨鐩稿弽 +//} + +void rf_set_PA_Mode(unsigned char mode,unsigned char rf_id) +{ + switch (mode) + { + case 2: + CC_PaTable(PAMAX2,rf_id); + break; + case 3: + CC_PaTable(PAMAX3,rf_id); + break; +// case 4: +// CC_PaTable(PAMAX4,rf_id); +// break; + default: + CC_PaTable(PAMAX,rf_id); + break; + } +} + + + +unsigned char test_only; + +void rf_SendPacket(unsigned char *txBuffer, unsigned char size,unsigned char rf_id) +{ + LNA_EN0(rf_id); + PA_EN1(rf_id); + + CC_ClrTx(rf_id);//v1.1淇濊瘉TxBYTES鏃犱互鍓嶅瓧鑺 + CC_WrReg(CCxxx0_TXFIFO, size,rf_id);//len + CC_WrRegs(CCxxx0_TXFIFO, txBuffer, size,rf_id); + CC_Cmd(CCxxx0_STX,rf_id); +} + + + +//static void cc_freq(unsigned char freq, unsigned char rfpwr) +//{ +//// //鎹㈢墖閫... +////#ifndef CHAN80 +//// #ifdef CC1101 +//// CC_Chan(freq-1); //add by Gavin +//// #else +//// CC_Chan(freq*6); +//// #endif +////#else +//// if (freq<41){ +//// CC_Chan(freq*6);// 1-40鏄弻鏁伴鐐 2402-2480 +//// } +//// else{ +//// freq=3+(freq-41)*6; // 41-80鏄鏁伴鐐 2401-2479 +//// CC_Chan(freq); +//// } +////#endif +//} + +void rf_setfreq(unsigned char freq,unsigned char rf_id) +{ +#ifdef CC2500 + if (freq<41){ + CC_Chan(freq*6,rf_id);// 1-40鏄弻鏁伴鐐 2402-2480 + } + else{ + freq=3+(freq-41)*6; // 41-80鏄鏁伴鐐 2401-2479 + CC_Chan(freq,rf_id); + } +#elif defined(CC1101) + CC_Chan(freq-1,rf_id); //add by Gavin +#endif + + //cc_set_pa(rfpwr);//鍩虹珯鍔熺巼 + CC_XCal(rf_id); +} + + + + +#define MAX_LEN 40 + +//浠庢棤绾挎ā鍧楄鍙栨暟鎹寘 +static unsigned char cc_rd_packet(unsigned char *buf,unsigned char rf_id) +{ + volatile unsigned char crc_ok=0; + + // Read length byte + buf[0]= CC_RdReg(CCxxx0_RXFIFO,rf_id);//绗竴瀛楄妭鏄疞en + if( (buf[0]==0)||(buf[0]>MAX_LEN) ) + goto RXERR; + + // Read data from RX FIFO and store in rxBuffer + CC_RdRegs(CCxxx0_RXFIFO, buf+1, buf[0],rf_id); + + // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI) + //rssi= + CC_RdReg(CCxxx0_RXFIFO,rf_id); + //lqi=CC_RdReg(CCxxx0_RXFIFO); + //if (lqi>0x80) + if(CC_RdReg(CCxxx0_RXFIFO,rf_id)>0x80) + { + crc_ok=1; // MSB of LQI is the CRC_OK bit + } + else + crc_ok=0; + +// lqi=lqi&0x7F; + //len= + //CC_RdStatus(CCxxx0_RXBYTES) & 0x7f;//mask by Gavin +// if (len==0) +// return ; + +RXERR: //搴旇涓0锛屼笉涓0灏变笉瀵癸紝瑕佹竻闄xFiFo + CC_ClrRx(rf_id); + + return crc_ok; +} + + +extern void rf_modual__tx_interrupt_counter(unsigned char id); + +//-------------------------------------------------------- +//鏃犵嚎妯″潡涓柇鏈嶅姟绋嬪簭 +void rf_Irq(unsigned char rf_id) +{ + volatile unsigned char i; + unsigned char tmp[64+1]; + + PA_EN0(rf_id); + LNA_EN1(rf_id); + + //鍏堝鐞嗘ā鍧楅敊璇儏鍐 + i=CC_RdStatus(0x35,rf_id)&0x7f;//CCxxx0_MARCSTATE + if (i==17) + {CC_ClrRx(rf_id);goto TRXRET;}//Rx_OverFlow閿欒 + + if (i==22) + {CC_ClrTx(rf_id);goto TRXRET;}//Tx_UnderFlow閿欒 + + + //鏍规嵁鏄惁鎺ユ敹鍒版暟鎹紝鍒ゆ柇鏄彂閫佸畬鎴愪腑鏂繕鏄帴鏀朵腑鏂 + i=CC_RdStatus(0x3B,rf_id)&0x7f;//CCxxx0_RXBYTES + if(i==0){ //鍙戦佷腑鏂 + rf_modual__tx_interrupt_counter(rf_id); + } + else{ + + tmp[32]=0; + tmp[33]=0; + if( cc_rd_packet(tmp+1,rf_id) ){ + + tmp[0] = rf_id; //record INT id + base_core.rf_data_fifo_in(tmp); //keypad_rf_data_save(tmp); + + }//if + } + + +TRXRET: + CC_RxOn(rf_id); //rx +} + + + +/* +璁剧疆鍚屾鐮 +*/ +void rf_set_syncode(unsigned short sync,unsigned char rf_id) +{ +// uint8_t addr[5] = {INIT_ADDR}; //#define INIT_ADDR 0x19,0x98,0xA4,0x25,0x01 +// addr[2] = sync>>8; +// addr[3] = sync; //淇敼鏃犵嚎鍦板潃鐮侊紝缂虹渷A425 +// NRF24L01_Set_TxAddr( addr, 4 ); //璁剧疆TX鍦板潃 +// NRF24L01_Set_RxAddr( 0,addr, 4 ); //璁剧疆RX鍦板潃 閫氶亾0 + + CC_WrReg(CCxxx0_SYNC1,sync,rf_id); + CC_WrReg(CCxxx0_SYNC0,sync>>8,rf_id); +} + +unsigned char CC_Test(unsigned char rf_id) +{ + return CC_RdStatus(CCxxx0_VERSION,rf_id);//0x03 +} + +unsigned char ver_val; + +//************************ +void rf_initial(unsigned char rf_id) +{ + //鎵撳紑鏃犵嚎妯″潡spi miso鎺у埗寮鍏!浠ュ悗閮戒笉鍏抽棴!! + OPEN_MISO(rf_id); + + CC_RESET(rf_id); +#ifdef CC1101 //add by Gavin + cc_rf_config(&rfSettings76800,rf_id); +#else + CC_RfConfig(&rfSettings250K,rf_id); +#endif + + ver_val =CC_Test(rf_id); + + rf_set_syncode(0x25A4,rf_id);//actual test OK! + + CC_PaTable(PAMAX,rf_id); + CC_WrReg(CCxxx0_MCSM1,0x00,rf_id );//0x0f鍙栨秷CCA锛屾敹鍙戞诲洖鍒癛X 涓嶈兘锛屽惁鍒欎笉鑳借嚜鍔ㄦ牎姝i鐜 + CC_WrReg(CCxxx0_MCSM0,0x38,rf_id );//MCSM).FS_AUTOCAL 0x18鎬籆alibatre锛0x28 IDLE鏃跺欙紝0x38 4娆DLE鏍℃涓娆 + CC_WHITE(1,rf_id); + +#ifdef CC1101 + CC_FEC(1,rf_id); //add by Gavin +#endif + + CC_RxOn(rf_id); + //PA鎺у埗 + LNA_EN1(rf_id); + PA_EN0(rf_id); +} + + + + +//-------- FCC CE start -------------------------------------------- +#ifdef FCCCE + +/* + + +*/ +static void FCC_Init(void ) +{ + extern TIM_HandleTypeDef htim2; + extern TIM_HandleTypeDef htim5; + HAL_TIM_Base_MspDeInit(&htim2); + HAL_TIM_Base_MspDeInit(&htim5); +} + +extern unsigned char base_test_chan; +//璁よ瘉闇瑕佺殑鐗规畩娴嬭瘯妯″紡 +//1 杩炵画鍙戝皠妯″紡锛堝甫璋冨埗锛 +//2 杩炵画鏀朵俊妯″紡锛堝甫璋冨埗锛 +//3 鏃犺皟鍒 杩炵画鍙戜俊妯″紡 +//4 鏃犺皟鍒 杩炵画鏀朵俊妯″紡 +void FCC_test_enter(unsigned char mode,unsigned char rf_id) +{ + FCC_Init(); + CC_Cmd(CCxxx0_SIDLE,0); + CC_Cmd(CCxxx0_SIDLE,1); + CC_Cmd(CCxxx0_SIDLE,2); + CC_Cmd(CCxxx0_SIDLE,3); + rf_setfreq(base_test_chan,rf_id); + + + switch (mode){ + + case 1://杩炵画MSK杈撳嚭 + CLI();//鍏充腑鏂 + CC_Cmd(CCxxx0_SIDLE,rf_id); + //cc_write_reg(0x08,0x02 );//CCxxx0_PKTCTRL0 鎸佺画鍙戝皠娴嬭瘯鍔熺巼 + CC_WrReg(0x08,0x22,rf_id); //浣跨敤闅忔満鏁版嵁鍙戦侊紝淇濊瘉鏈夋暟鎹嚭鍘 + //鍐欏洖鏍囧噯MSK + CC_WrReg(0x12,0x73,rf_id );//CCxxx0_MDMCFG2 + CC_WrReg(0x22,0x10,rf_id );//CCxxx0_FREND0 + + //cc_write_reg(0x11,0x7A ); //MDMCFG3 baud璋冮珮鍙互杩500KHz + + LNA_EN0(rf_id); + PA_EN1(rf_id); + CC_Cmd(CCxxx0_STX,rf_id); + + SEI(); //寮涓柇 + break; + + case 2://杩炵画MSK鎺ユ敹 + CLI(); //鍏充腑鏂 + CC_Cmd(CCxxx0_SIDLE,rf_id); + CC_WrReg(0x08,0x02,rf_id );//CCxxx0_PKTCTRL0 鎸佺画鍙戝皠娴嬭瘯鍔熺巼 + //鍐欏洖鏍囧噯MSK + CC_WrReg(0x12,0x73,rf_id );//CCxxx0_MDMCFG2 + CC_WrReg(0x22,0x10,rf_id );//CCxxx0_FREND0 + + PA_EN0(rf_id); + LNA_EN1(rf_id); + CC_Cmd(CCxxx0_SRX,rf_id); + + SEI(); //寮涓柇 + break; + + case 3://杩炵画杞芥尝杈撳嚭锛屾棤璋冨埗 + CLI(); //鍏充腑鏂 + CC_Cmd(CCxxx0_SIDLE,rf_id); + //浠ヤ笅2琛岀敤浜嶬CC娴嬭瘯锛屽彧鍑鸿浇娉紝鏈皟鍒剁殑---娉ㄦ剰锛歋PAN璁1M锛孷BW1M锛屼絾RBW璁10K鎵嶈兘鐪嬪埌鍒嗗紑鐨2涓尝宄 + CC_WrReg(0x12,0x33,rf_id );//CCxxx0_MDMCFG2 + CC_WrReg(0x22,0x00,rf_id );//CCxxx0_FREND0 + CC_WrReg(0x08,0x02,rf_id );//CCxxx0_PKTCTRL0 鎸佺画鍙戝皠娴嬭瘯鍔熺巼 + + LNA_EN0(rf_id); + PA_EN1(rf_id); + CC_Cmd(CCxxx0_STX,rf_id); + + SEI(); //寮涓柇 + break; + + case 4://杩炵画杞芥尝妯″紡鎺ユ敹锛屾棤璋冨埗 + CLI(); //鍏充腑鏂 + CC_Cmd(CCxxx0_SIDLE,rf_id); + //浠ヤ笅2琛岀敤浜嶬CC娴嬭瘯锛屽彧鍑鸿浇娉紝鏈皟鍒剁殑---娉ㄦ剰锛歋PAN璁1M锛孷BW1M锛屼絾RBW璁10K鎵嶈兘鐪嬪埌鍒嗗紑鐨2涓尝宄 + CC_WrReg(0x12,0x33,rf_id );//CCxxx0_MDMCFG2 + CC_WrReg(0x22,0x00,rf_id );//CCxxx0_FREND0 + CC_WrReg(0x08,0x02,rf_id );//CCxxx0_PKTCTRL0 鎸佺画鍙戝皠娴嬭瘯鍔熺巼 + + PA_EN0(rf_id); + LNA_EN1(rf_id); + CC_Cmd(CCxxx0_SRX,rf_id); + + SEI(); //寮涓柇 + break; + }//sw + + +} +#endif +//-------- FCC CE stop -------------------------------------------- + + + + +#endif //CCxxxx + + diff --git b/Base_core/user_driver/cc2500_1101.C a/Base_core/user_driver/cc2500_1101.C new file mode 100644 index 0000000..789b3bd --- /dev/null +++ a/Base_core/user_driver/cc2500_1101.C @@ -0,0 +1,850 @@ +/******************************************************************************* +* Copyright (C), 2000-2014, Sunsky Electronic Technology Co., Ltd. +* 文件名: CCxx00_New.C +* 作 者: 梁新平 +* 版 本: +* 日 期: 2014-5-26 +* 说 明: +* +* +* 修订历史: +* +* 1. 时间: 2014-5-26 +* 修订者: 梁新平 +* 修订内容: 创建 +* 2. +* 其它: +*******************************************************************************/ + +#include "cc2500_1101.h" +#include "platform.h" +#include "function.h" +#include "base_core_user.h" + + + +#if defined(CC1101) || defined(CC2500) + +//注意CC2500的CRC效验问题--CRCL=00时会指示CrcErr + +//PKTCTRL1=04,即WOR_AUTOSYNC=0,CRC_AUTOFLUSH=0,APPEND_STATUS=1,ADR_CHK=0 +//PKTCTRL0=05,即WHITE_DATA=0,PKT_FORMAT=0 used fifo,CRC_EN=1,LENTH=variable + +//MCSM1=复位值0x30,即RXOFF_MODE和TXOFF_MODE均为IDLE, +//但CCA_Mode=3 RSSI低而且没有在接收时才能从RX到TX状态,这是测试中1/10概率没有切换到TX状态的原因?改为0 + +//MDMCFG2从3改为0x13是由FSK转为GFSK模式,相对更好: +//测试出现 按6.6版本76.8K设置时,近距离效果都不行,把FSK改为GFSK就好了 +//MCSM0=0x18,即FS_AUTOCAL=Mode1 IDLE->TX,RX时校正 + +//2010.2.24屏蔽了接收时候直接bRcvOk=1 +//2010.2.24可OEM定制无线同步码 + +//2010.4.8 +//CC_PackStatus()读取CCA +//MCSM1=复位值0x30 不再修改为0,使能CCA done +//PKTLEN可以写少于64(原0xFF)避免FIFO溢出,虽然采用不定长包 done +//使用CCA或CS必须要先RXON在接收状态?是的 CCA还必须使能CCA才能检测,CS不需要使能CCA +//IOCFG2 设置为09可在GDO2脚看CCA信号输出 done + +//2010.4.16 +//测试出CCA比接收完成慢1.7ms,CS载波检测能很快结束 + +//2010.4.24 +//测试RX死机时候,状态还是1接收的,并不是RX溢出,但RXBUF为65字节,刚好比物理BUF多1字节 +//重新IDLE再RXON可以退出死机状态,把PKTLEN限定为0x20可以提前结束错误包!!能避免RX死机的情况? +//猜测是长度字节错误导致接收死机,因为GDO0脚一直为高(已经开始接收但没有结束) + +//CCA考虑检测时间,要计算发送时间,最末一个CCA后也能发送完整数据包 +//因为Calibartion就要720us,及1ms后才能检测到CCA,或考虑去掉自动Calibration? +//CCA的信号强度还可以设置AGCCTRL0-2 +//存在能发射,但不能接收到情况?? + +//2010.5.12 433M增加修改了BAND2010配置高速无线通信 +//2010.5.18 移植到M52时候,修正433M下的原文件,2.4G的配置并不对 --注意:CC_Init()中不同的无线中断打开不同 +//5.19 加2.4G下新配置250K-Baud,MSK + +//2011.3 肖雪琦移植到STC平台下 +//2011.4.9 pei修正sync0,sync1前面漏u8定义导致cc_init()中引导码不对 +//2011.5.1 pei不使用SPI操作进行了测试,少许修改SPI1_ReadWriteByte() +//注意:pei STC平台下,SPI操作,必须P1.6保持输出为高,MISO读入才能正确,或者通过P1M1干脆设置为输入 + + +#define PAMAX 0xFE +#define RSSI0 72 //Rssi Offset +//#define PAMAX 0xFE +#define PAMAX2 0xA9 //-4dBm +#define PAMAX3 0x6E //-8dBm +//#define PAMAX4 0xC6 //-12dBm +#define PAMAX4 0x44 //-28dBm 配对时功率降低,最终使用了-28db的参数 + + + + +//CC2500 BAND2010 + +// Chipcon +// Product = CC2500 +// Chip version = E (VERSION = 0x03) +// Crystal accuracy = 10 ppm +// X-tal frequency = 26 MHz +// RF output power = 0 dBm +// RX filterbandwidth = 541.666667 kHz +// Phase = 0 +// Datarate = 249.938965 kBaud +// Modulation = (7) MSK +// Manchester enable = (0) Manchester disabled +// RF Frequency = 2401.999939 MHz +// Channel spacing = 333.251953 kHz +// Channel number = 0 +// Optimization = Sensitivity +// Sync mode = (3) 30/32 sync word bits detected +// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX +// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled +// Forward Error Correction = (0) FEC disabled +// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word. +// Packetlength = 255 +// Preamble count = (2) 4 bytes +// Append status = 1 +// Address check = (0) No address check +// FIFO autoflush = 0 +// Device address = 0 +// GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet +// GDO2 signal selection = (41) CHIP_RDY + + + +static void DelayUs( unsigned short time ) +{ + unsigned short i = 0; + while( time-- ) + { + i = 6; //16M=2 + while( i-- ) ; + } +} + + +//等待芯片ready +static void CC_Rdy(void) +{ + unsigned char i; + for (i=0;i<10;i++){ + if (RF_READ ==0) + return; + DelayUs(20);// + } + +} + + +extern SPI_HandleTypeDef hspi1; + +static unsigned char SPI1_ReadWriteByte(unsigned char TxData) +{ +// unsigned short retry=0; +// while((SPI1->SR&1<<1)==0)// 等待发送空闲 +////while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) +// { +// retry++; +// if(retry>SPI1_BREAK)return 0; +// } +// SPI1->DR=TxData; //发送 +// +// retry=0; +// while((SPI1->SR&1<<0)==0) //等待接收完成 +////while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) +// { +// retry++; +// if(retry>SPI1_BREAK)return 0; +// } +// return SPI1->DR; //返回接收到的数据 + + + HAL_StatusTypeDef rlst; + unsigned char rx_data; + rlst =HAL_SPI_TransmitReceive(&hspi1,&TxData,&rx_data,1, 5); + + if(rlst == HAL_OK) + return rx_data; + else + return 0; +} + + + +//写命令 +static unsigned char CC_Cmd(unsigned char Cmd) +{ + unsigned char Status; + + RF_CS0; + CC_Rdy(); + Status=SPI1_ReadWriteByte(Cmd); + RF_CS1; + return Status; +} + + + +//指定地址,写配置字 +static unsigned char CC_WrReg(unsigned char Addr,unsigned char Data) +{ + unsigned char Status; + + RF_CS0; + CC_Rdy(); + Status=SPI1_ReadWriteByte(Addr); + SPI1_ReadWriteByte(Data); + RF_CS1; + return Status; +} +//指定地址,连续写配置 +static unsigned char CC_WrRegs(unsigned char Addr,unsigned char *Buf,unsigned char Count) +{ + unsigned char Status,i; + + RF_CS0; + CC_Rdy(); + Status=SPI1_ReadWriteByte(Addr|0x40); + for (i=0;iFSCTRL1); + CC_WrReg(CCxxx0_FSCTRL0, pRfSettings->FSCTRL0); + CC_WrReg(CCxxx0_FREQ2, pRfSettings->FREQ2); + CC_WrReg(CCxxx0_FREQ1, pRfSettings->FREQ1); + CC_WrReg(CCxxx0_FREQ0, pRfSettings->FREQ0); + CC_WrReg(CCxxx0_MDMCFG4, pRfSettings->MDMCFG4); + CC_WrReg(CCxxx0_MDMCFG3, pRfSettings->MDMCFG3); + CC_WrReg(CCxxx0_MDMCFG2, pRfSettings->MDMCFG2); + CC_WrReg(CCxxx0_MDMCFG1, pRfSettings->MDMCFG1); + CC_WrReg(CCxxx0_MDMCFG0, pRfSettings->MDMCFG0); + CC_WrReg(CCxxx0_CHANNR, pRfSettings->CHANNR); + CC_WrReg(CCxxx0_DEVIATN, pRfSettings->DEVIATN); + CC_WrReg(CCxxx0_FREND1, pRfSettings->FREND1); + CC_WrReg(CCxxx0_FREND0, pRfSettings->FREND0); + CC_WrReg(CCxxx0_MCSM0 , pRfSettings->MCSM0 ); + CC_WrReg(CCxxx0_FOCCFG, pRfSettings->FOCCFG); + CC_WrReg(CCxxx0_BSCFG, pRfSettings->BSCFG); + CC_WrReg(CCxxx0_AGCCTRL2, pRfSettings->AGCCTRL2); + CC_WrReg(CCxxx0_AGCCTRL1, pRfSettings->AGCCTRL1); + CC_WrReg(CCxxx0_AGCCTRL0, pRfSettings->AGCCTRL0); + CC_WrReg(CCxxx0_FSCAL3, pRfSettings->FSCAL3); + CC_WrReg(CCxxx0_FSCAL2, pRfSettings->FSCAL2); + CC_WrReg(CCxxx0_FSCAL1, pRfSettings->FSCAL1); + CC_WrReg(CCxxx0_FSCAL0, pRfSettings->FSCAL0); + CC_WrReg(CCxxx0_FSTEST, pRfSettings->FSTEST); + CC_WrReg(CCxxx0_TEST2, pRfSettings->TEST2); + CC_WrReg(CCxxx0_TEST1, pRfSettings->TEST1); + CC_WrReg(CCxxx0_TEST0, pRfSettings->TEST0); + CC_WrReg(CCxxx0_IOCFG2, pRfSettings->IOCFG2); + CC_WrReg(CCxxx0_IOCFG0, pRfSettings->IOCFG0); + CC_WrReg(CCxxx0_PKTCTRL1, pRfSettings->PKTCTRL1); + CC_WrReg(CCxxx0_PKTCTRL0, pRfSettings->PKTCTRL0); + CC_WrReg(CCxxx0_ADDR, pRfSettings->ADDR); + CC_WrReg(CCxxx0_PKTLEN, pRfSettings->PKTLEN); + + CC_WrReg(CCxxx0_FIFOTHR, pRfSettings->FIFOTHR); +} +#endif + + + + + + +//================================================== +#ifdef CC1101 //M433M +RF_SETTINGS rfSettings76800 = { + 0x08, // FSCTRL1 Frequency synthesizer control. + 0x00, // FSCTRL0 Frequency synthesizer control. + 0x10, // FREQ2 Frequency control word, high byte. + 0xA9, // FREQ1 Frequency control word, middle byte. + 0x5A, // FREQ0 Frequency control word, low byte. + 0xAB, // MDMCFG4 Modem configuration. + 0x83, // MDMCFG3 Modem configuration. + 0x13, // MDMCFG2 Modem configuration. + 0x20, // MDMCFG1 Modem configuration. + 0xCF, // MDMCFG0 Modem configuration. CHANSPC_M + 0x00, // CHANNR Channel number. + 0x42, // DEVIATN Modem deviation setting (when FSK modulation is enabled). + 0xB6, // FREND1 Front end RX configuration. + 0x10, // FREND0 Front end RX configuration. + 0x18, // MCSM0 Main Radio Control State Machine configuration. + 0x1D, // FOCCFG Frequency Offset Compensation Configuration. + 0x1C, // BSCFG Bit synchronization Configuration. + 0xC7, // AGCCTRL2 AGC control. + 0x00, // AGCCTRL1 AGC control. + 0xB2, // AGCCTRL0 AGC control. + 0xEA, // FSCAL3 Frequency synthesizer calibration. + 0x2A, // FSCAL2 Frequency synthesizer calibration. + 0x00, // FSCAL1 Frequency synthesizer calibration. + 0x1F, // FSCAL0 Frequency synthesizer calibration. + 0x59, // FSTEST Frequency synthesizer calibration. + 0x81, // TEST2 Various test settings. + 0x35, // TEST1 Various test settings. + 0x09, // TEST0 Various test settings. + 0x07, // FIFOTHR RXFIFO and TXFIFO thresholds. //add by Gavin + 0x0E,//0x09,//0x29, // IOCFG2 GDO2 output pin configuration. 0x09=CCA输出 0x0E=CS输出 + 0x06, // IOCFG0D GDO0 output pin configuration. Refer to SmartRF Studio User Manual for detailed pseudo register explanation. + 0x04, // PKTCTRL1 Packet automation control. + 0x05, // PKTCTRL0 Packet automation control. + 0x00, // ADDR Device address. + 0x25,//0x20 // PKTLEN Packet length. +}; + + +//*------------------------------------------ +//* 函数名称 : cc_rf_config +//* 功能描述 : 无线模块配置 +//* 入口参数 : 无 +//* 出口参数 : 无 +//*--------------------------------------------- +static void cc_rf_config(RF_SETTINGS *rf_settings) +{ + // Write register settings + CC_WrReg(CCxxx0_FSCTRL1, rf_settings->FSCTRL1); + CC_WrReg(CCxxx0_FSCTRL0, rf_settings->FSCTRL0); + CC_WrReg(CCxxx0_FREQ2, rf_settings->FREQ2); + CC_WrReg(CCxxx0_FREQ1, rf_settings->FREQ1); + CC_WrReg(CCxxx0_FREQ0, rf_settings->FREQ0); + CC_WrReg(CCxxx0_MDMCFG4, rf_settings->MDMCFG4); + CC_WrReg(CCxxx0_MDMCFG3, rf_settings->MDMCFG3); + CC_WrReg(CCxxx0_MDMCFG2, rf_settings->MDMCFG2); + CC_WrReg(CCxxx0_MDMCFG1, rf_settings->MDMCFG1); + CC_WrReg(CCxxx0_MDMCFG0, rf_settings->MDMCFG0); + CC_WrReg(CCxxx0_CHANNR, rf_settings->CHANNR); + CC_WrReg(CCxxx0_DEVIATN, rf_settings->DEVIATN); + CC_WrReg(CCxxx0_FREND1, rf_settings->FREND1); + CC_WrReg(CCxxx0_FREND0, rf_settings->FREND0); + CC_WrReg(CCxxx0_MCSM0 , rf_settings->MCSM0 ); + CC_WrReg(CCxxx0_FOCCFG, rf_settings->FOCCFG); + CC_WrReg(CCxxx0_BSCFG, rf_settings->BSCFG); + CC_WrReg(CCxxx0_AGCCTRL2, rf_settings->AGCCTRL2); + CC_WrReg(CCxxx0_AGCCTRL1, rf_settings->AGCCTRL1); + CC_WrReg(CCxxx0_AGCCTRL0, rf_settings->AGCCTRL0); + CC_WrReg(CCxxx0_FSCAL3, rf_settings->FSCAL3); + CC_WrReg(CCxxx0_FSCAL2, rf_settings->FSCAL2); + CC_WrReg(CCxxx0_FSCAL1, rf_settings->FSCAL1); + CC_WrReg(CCxxx0_FSCAL0, rf_settings->FSCAL0); + CC_WrReg(CCxxx0_FSTEST, rf_settings->FSTEST); + CC_WrReg(CCxxx0_TEST2, rf_settings->TEST2); + CC_WrReg(CCxxx0_TEST1, rf_settings->TEST1); + CC_WrReg(CCxxx0_TEST0, rf_settings->TEST0); + CC_WrReg(CCxxx0_IOCFG2, rf_settings->IOCFG2); + CC_WrReg(CCxxx0_IOCFG0, rf_settings->IOCFG0); + CC_WrReg(CCxxx0_PKTCTRL1, rf_settings->PKTCTRL1); + CC_WrReg(CCxxx0_PKTCTRL0, rf_settings->PKTCTRL0); + CC_WrReg(CCxxx0_ADDR, rf_settings->ADDR); + CC_WrReg(CCxxx0_PKTLEN, rf_settings->PKTLEN); +//#ifdef BAND2010 + CC_WrReg(CCxxx0_FIFOTHR, rf_settings->FIFOTHR); +//#endif +} + +#endif //#ifdef CC1101 + + + + +//==================================================================== + +//u8 CC_Test(void) +//{ +// return CC_RdStatus(CCxxx0_VERSION);//0x03 +//} + +//u8 CC_RssiCh(u8 rssi) +//{//输出值是正值,但都是负的dBm,例如返回值是55是-55dBm +// if (rssi>=128) +// { return (128+RSSI0-(rssi>>1)); +// }else +// { return (RSSI0-(rssi>>1)); +// } +//} + +/* + +*/ +unsigned char cc2500_get_rssi(void) +{ + unsigned char rssi =CC_RdStatus(CCxxx0_RSSI); + + if (rssi>=128) + return (128+RSSI0-(rssi>>1)); + else + return (RSSI0-(rssi>>1)); +} + + +//u8 CC_PackStatus(void) +//{ +// return CC_RdStatus(CCxxx0_PKTSTATUS); +// //bit0-bit7 GDO0,GDO1,GDO2,SYNC, CCA,PQT,CS,CRCOK +// //如果MCSM1.CCA=0没有使用CCA的话,CCA指示位总为1, +// //如果使用CCA,CCA和CS位就相反 +//} + +void rf_set_PA_Mode(unsigned char mode) +{ + switch (mode) + { + case 2: + CC_PaTable(PAMAX2); + break; + case 3: + CC_PaTable(PAMAX3); + break; + case 4: + CC_PaTable(PAMAX4); + break; + default: + CC_PaTable(PAMAX); + break; + } +} + + + + + +void rf_SendPacket(unsigned char *txBuffer, unsigned char size) +{ + LNA_EN0; + PA_EN1; + + CC_ClrTx();//v1.1保证TxBYTES无以前字节 + CC_WrReg(CCxxx0_TXFIFO, size);//len + CC_WrRegs(CCxxx0_TXFIFO, txBuffer, size); + CC_Cmd(CCxxx0_STX); + + //AdcBatt(); +} + + + +//static void cc_freq(unsigned char freq, unsigned char rfpwr) +//{ +//// //换片选... +////#ifndef CHAN80 +//// #ifdef CC1101 +//// CC_Chan(freq-1); //add by Gavin +//// #else +//// CC_Chan(freq*6); +//// #endif +////#else +//// if (freq<41){ +//// CC_Chan(freq*6);// 1-40是双数频点 2402-2480 +//// } +//// else{ +//// freq=3+(freq-41)*6; // 41-80是奇数频点 2401-2479 +//// CC_Chan(freq); +//// } +////#endif +//} + +void rf_setfreq(unsigned char freq) +{ +#ifdef CC2500 + if (freq<41){ + CC_Chan(freq*6);// 1-40是双数频点 2402-2480 + } + else{ + freq=3+(freq-41)*6; // 41-80是奇数频点 2401-2479 + CC_Chan(freq); + } +#elif defined(CC1101) + CC_Chan(freq-1); //add by Gavin +#endif + + //cc_set_pa(rfpwr);//基站功率 + CC_XCal(); +} + + + + +#define MAX_LEN 40 + +//从无线模块读取数据包 +static unsigned char cc_rd_packet(unsigned char *buf) +{ + + volatile unsigned char crc_ok=0; + + // Read length byte + buf[0]= CC_RdReg(CCxxx0_RXFIFO);//第一字节是Len + if( (buf[0]==0)||(buf[0]>MAX_LEN) ) + goto RXERR; + + + // Read data from RX FIFO and store in rxBuffer + CC_RdRegs(CCxxx0_RXFIFO, buf+1, buf[0]); + + // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI) + //rssi= + CC_RdReg(CCxxx0_RXFIFO); + //lqi=CC_RdReg(CCxxx0_RXFIFO); + //if (lqi>0x80) + if(CC_RdReg(CCxxx0_RXFIFO)>0x80) + { + crc_ok=1; // MSB of LQI is the CRC_OK bit + } + else + crc_ok=0; + +// lqi=lqi&0x7F; + //len= + //CC_RdStatus(CCxxx0_RXBYTES) & 0x7f;//mask by Gavin +// if (len==0) +// return ; + +RXERR: //应该为0,不为0就不对,要清除RxFiFo + CC_ClrRx(); + + return crc_ok; +} + + + + +//-------------------------------------------------------- +//无线模块中断服务程序 +void rf_Irq(void) +{ + volatile unsigned char i; + unsigned char tmp[64]; + + PA_EN0; + LNA_EN1; + + //先处理模块错误情况 + i=CC_RdStatus(0x35)&0x7f;//CCxxx0_MARCSTATE + if (i==17) + {CC_ClrRx();goto TRXRET;}//Rx_OverFlow错误 + + if (i==22) + {CC_ClrTx();goto TRXRET;}//Tx_UnderFlow错误 + + + //根据是否接收到数据,判断是发送完成中断还是接收中断 + i=CC_RdStatus(0x3B)&0x7f;//CCxxx0_RXBYTES + if(i==0){ //发送中断 + //bs_kp.tx_kp_flag=1; + } + else{ + if( cc_rd_packet(tmp) ) + base_core.rf_data_fifo_in(tmp); //keypad_rf_data_save(tmp); + } + + +TRXRET: + CC_RxOn(); //rx +} + + + +/* +设置同步码 +*/ +void rf_set_syncode(unsigned short sync) +{ +// uint8_t addr[5] = {INIT_ADDR}; //#define INIT_ADDR 0x19,0x98,0xA4,0x25,0x01 +// addr[2] = sync>>8; +// addr[3] = sync; //修改无线地址码,缺省A425 +// NRF24L01_Set_TxAddr( addr, 4 ); //设置TX地址 +// NRF24L01_Set_RxAddr( 0,addr, 4 ); //设置RX地址 通道0 + + CC_WrReg(CCxxx0_SYNC1,sync); + CC_WrReg(CCxxx0_SYNC0,sync>>8); +} + + + +//************************ +void rf_initial(void) +{ + CC_RESET(); +#ifdef CC1101 //add by Gavin + cc_rf_config(&rfSettings76800); +#else + CC_RfConfig(&rfSettings250K); +#endif + rf_set_syncode(0x25A4);//actual test OK! + + CC_PaTable(PAMAX); + CC_WrReg(CCxxx0_MCSM1,0x00 );//0x0f取消CCA,收发总回到RX 不能,否则不能自动校正频率 + CC_WrReg(CCxxx0_MCSM0,0x38 );//MCSM).FS_AUTOCAL 0x18总Calibatre,0x28 IDLE时候,0x38 4次IDLE校正一次 + CC_WHITE(1); + +#ifdef CC1101 + CC_FEC(1); //add by Gavin +#endif + + CC_RxOn(); + //PA控制 + LNA_EN1; + PA_EN0; +} + + + + +//----------------------------------------- FCC CE ------------------------------------------------------------------ +#ifdef FCCCE +void FCC_Init() +{ + TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);//关闭2.5ms中断 + NVIC_DisableIRQ(EXTI3_IRQn);//关闭无线中断 +} + +//认证需要的特殊测试模式 +//1 连续发射模式(带调制) +//2 连续收信模式(带调制) +//3 无调制 连续发信模式 +//4 无调制 连续收信模式 +void FCC_Test(unsigned char mode) +{ + //FccMode=mode; + switch (mode) + { + case 1://连续MSK输出 + CLI();//关中断 + CC_Cmd(CCxxx0_SIDLE); + //cc_write_reg(0x08,0x02 );//CCxxx0_PKTCTRL0 持续发射测试功率 + CC_WrReg(0x08,0x22 ); //使用随机数据发送,保证有数据出去 + //写回标准MSK + CC_WrReg(0x12,0x73 );//CCxxx0_MDMCFG2 + CC_WrReg(0x22,0x10 );//CCxxx0_FREND0 + + //cc_write_reg(0x11,0x7A ); //MDMCFG3 baud调高可以过500KHz + + LNA_EN0; + PA_EN1; + CC_Cmd(CCxxx0_STX); + + SEI(); //开中断 + break; + + case 2://连续MSK接收 + CLI(); //关中断 + CC_Cmd(CCxxx0_SIDLE); + CC_WrReg(0x08,0x02 );//CCxxx0_PKTCTRL0 持续发射测试功率 + //写回标准MSK + CC_WrReg(0x12,0x73 );//CCxxx0_MDMCFG2 + CC_WrReg(0x22,0x10 );//CCxxx0_FREND0 + + PA_EN0; + LNA_EN1; + CC_Cmd(CCxxx0_SRX); + + SEI(); //开中断 + break; + + case 3://连续载波输出,无调制 + CLI(); //关中断 + CC_Cmd(CCxxx0_SIDLE); + //以下2行用于KCC测试,只出载波,未调制的---注意:SPAN设1M,VBW1M,但RBW设10K才能看到分开的2个波峰 + CC_WrReg(0x12,0x33 );//CCxxx0_MDMCFG2 + CC_WrReg(0x22,0x00 );//CCxxx0_FREND0 + CC_WrReg(0x08,0x02 );//CCxxx0_PKTCTRL0 持续发射测试功率 + + LNA_EN0; + PA_EN1; + CC_Cmd(CCxxx0_STX); + + SEI(); //开中断 + break; + + case 4://连续载波模式接收,无调制 + CLI(); //关中断 + CC_Cmd(CCxxx0_SIDLE); + //以下2行用于KCC测试,只出载波,未调制的---注意:SPAN设1M,VBW1M,但RBW设10K才能看到分开的2个波峰 + CC_WrReg(0x12,0x33 );//CCxxx0_MDMCFG2 + CC_WrReg(0x22,0x00 );//CCxxx0_FREND0 + CC_WrReg(0x08,0x02 );//CCxxx0_PKTCTRL0 持续发射测试功率 + + PA_EN0; + LNA_EN1; + CC_Cmd(CCxxx0_SRX); + + SEI(); //开中断 + break; + } +} +#endif + +#endif //CCxxxx + + diff --git b/Base_core/user_driver/char_std8x16.c a/Base_core/user_driver/char_std8x16.c new file mode 100644 index 0000000..ea68c06 --- /dev/null +++ a/Base_core/user_driver/char_std8x16.c @@ -0,0 +1,279 @@ +/*鏈枃浠朵负8脳16鐐归樀瑗挎枃瀛楀簱鏂囦欢,瀛楃殑绾靛悜8鐐规瀯鎴愪竴瀛楄妭,涓婃柟鐨勭偣鍦ㄥ瓧鑺傜殑浣庝綅,瀛楃鐐归樀鍥涜鎸夊乏涓婅鈫掑彸涓婅鈫掑乏涓嬭鈫掑彸涓嬭鍙栧瓧*/ +/*濡備綘鎯冲湪浠ュ悗缁х画鐢℉ZDotReader鎵撳紑鏂囦欢,杩藉姞姹夊瓧鐐归樀鏁版嵁,璇蜂笉瑕佷慨鏀规垨澧炲垹鎵鏈夋敞閲*/ + +#include "function.h" +#ifdef LCD_ON + +const unsigned char chardot[] = { +/*a CHAR_61 */ +0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00, +0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20, + +/*b CHAR_62 */ +0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00, +0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00, + +/*c CHAR_63 */ +0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, +0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00, + +/*d CHAR_64 */ +0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00, +0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20, + +/*e CHAR_65 */ +0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00, +0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00, + +/*f CHAR_66 */ +0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18, +0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, + +/*g CHAR_67 */ +0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00, +0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00, + +/*h CHAR_68 */ +0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00, +0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20, + +/*i CHAR_69 */ +0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00, +0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, + +/*j CHAR_6A */ +0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00, +0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00, + +/*k CHAR_6B */ +0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00, +0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00, + +/*l CHAR_6C */ +0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00, +0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, + +/*m CHAR_6D */ +0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, +0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F, + +/*n CHAR_6E */ +0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00, +0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20, + +/*o CHAR_6F */ +0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00, +0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00, + +/*p CHAR_70 */ +0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00, +0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00, + +/*q CHAR_71 */ +0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00, +0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80, + +/*r CHAR_72 */ +0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00, +0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00, + +/*s CHAR_73 */ +0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00, +0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00, + +/*t CHAR_74 */ +0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00, +0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00, + +/*u CHAR_75 */ +0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00, +0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20, + +/*v CHAR_76 */ +0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80, +0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00, + +/*w CHAR_77 */ +0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80, +0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00, + +/*x CHAR_78 */ +0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00, +0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00, + +/*y CHAR_79 */ +0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80, +0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00, + +/*z CHAR_7A */ +0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, +0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00, + +/* CHAR_20 */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +/*A CHAR_41 */ +0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00, +0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20, + +/*B CHAR_42 */ +0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00, +0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00, + +/*C CHAR_43 */ +0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00, +0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00, + +/*D CHAR_44 */ +0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00, +0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00, + +/*E CHAR_45 */ +0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00, +0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00, + +/*F CHAR_46 */ +0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00, +0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00, + +/*G CHAR_47 */ +0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00, +0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00, + +/*H CHAR_48 */ +0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08, +0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20, + +/*I CHAR_49 */ +0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00, +0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, + +/*J CHAR_4A */ +0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00, +0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00, + +/*K CHAR_4B */ +0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00, +0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00, + +/*L CHAR_4C */ +0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00, +0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00, + +/*M CHAR_4D */ +0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00, +0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00, + +/*N CHAR_4E */ +0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08, +0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00, + +/*O CHAR_4F */ +0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00, +0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00, + +/*P CHAR_50 */ +0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00, +0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00, + +/*Q CHAR_51 */ +0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00, +0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00, + +/*R CHAR_52 */ +0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00, +0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20, + +/*S CHAR_53 */ +0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00, +0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00, + +/*T CHAR_54 */ +0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00, +0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00, + +/*U CHAR_55 */ +0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08, +0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00, + +/*V CHAR_56 */ +0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08, +0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00, + +/*W CHAR_57 */ +0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00, +0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00, + +/*X CHAR_58 */ +0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08, +0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20, + +/*Y CHAR_59 */ +0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00, +0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00, + +/*Z CHAR_5A */ +0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00, +0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00, + +/*0 CHAR_30 */ +0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, +0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00, + +/*1 CHAR_31 */ +0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00, +0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, + +/*2 CHAR_32 */ +0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00, +0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, + +/*3 CHAR_33 */ +0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00, +0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, + +/*4 CHAR_34 */ +0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00, +0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, + +/*5 CHAR_35 */ +0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00, +0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, + +/*6 CHAR_36 */ +0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00, +0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, + +/*7 CHAR_37 */ +0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00, +0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, + +/*8 CHAR_38 */ +0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00, +0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, + +/*9 CHAR_39 */ +0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00, +0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00, + +/*- CHAR_2D */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01, + +/*_ CHAR_5F */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, + +/*. CHAR_2E */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00, + +/*: CHAR_3A */ +0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00, +0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00 +}; + + +#endif + diff --git b/Base_core/user_driver/i2c.c a/Base_core/user_driver/i2c.c new file mode 100644 index 0000000..6540c1c --- /dev/null +++ a/Base_core/user_driver/i2c.c @@ -0,0 +1,218 @@ + +#include "HW_MCUIO.h"//#include "stm32f4xx_hal.h" +#include "platform.h" +#include "function.h" + +#define I2C_PORT GPIOB +#define I2C_SCK GPIO_PIN_8// GPIO_PIN_6 +#define I2C_SDA GPIO_PIN_9// GPIO_PIN_7 + +/* +This i2c driver from stm32F1xx; we should add delay when operation io, +because the stm32F4 much fast (The main frequency of stm32F4xx is 168M) !! +F4绯诲垪閫熷害澶揩锛岄渶瑕佸姞寤舵椂锛岃鍐欐墠姝e父!!!*/ +static void i2c_delay(unsigned short dy) +{ + unsigned short i; + for(i=0;i>8); + i2c_send_byte(addr); + for(i=0;i= (len-offset) ){ + cur_len = len-offset; + } + else{ + cur_len = cur_len; + } + + i2c_start(); + i2c_send_byte(0xA0); + i2c_send_byte((addr+offset)>>8); + i2c_send_byte(addr+offset); + for(i=0;i=len) break; + }while(1); + + + #endif +} + +/* +*/ +unsigned char EE_ReadBytes(unsigned int addr,unsigned char *pdata,unsigned char len) +{ + unsigned char i; + i2c_start(); + i2c_send_byte(0xA0);//write + i2c_send_byte(addr>>8); + i2c_send_byte(addr); + + i2c_start(); + i2c_send_byte(0xA1);//read + for(i=0;i=0x61)&&(*pt<=0x7A) ) //灏忓啓 + rt = &chardot[(*pt-0x61)*16]; + else if( (*pt>=0x41)&&(*pt<=0x5A) ) //澶у啓 + rt = &chardot[((CHAR_41)+*pt-0x41)*16]; + else if( (*pt>=0x30)&&(*pt<=0x39) ) //鏁板瓧 + rt = &chardot[((CHAR_30)+*pt-0x30)*16]; + else if (*pt==0x20)//绌烘牸 + rt = &chardot[(CHAR_20)*16]; + else if (*pt==0x2D)//-涓潬 + rt = &chardot[(CHAR_2D)*16]; + else if (*pt==0x5F)//_涓嬫潬 + rt = &chardot[(CHAR_5F)*16]; + else if (*pt==0x2E)//. + rt = &chardot[(CHAR_2E)*16]; + else if (*pt==0x3A)//: + rt = &chardot[(CHAR_3A)*16]; + + else //鍑洪敊鏃讹紝鏄剧ず绌烘牸(绌虹櫧) + rt = &chardot[(CHAR_20)*16]; + return rt; +} + + + + + +#define CHAR_16x8 1 +#define CHAR_16x8_MIDLINE 2 +#define CHIN_12x12 3 + +#define CHIN_16x16 4 + +/* +* +*/ +static unsigned char display_char_chinese(unsigned short x,unsigned short y, + unsigned char char_type, + const unsigned char *chr, + unsigned char len, + unsigned char reverse) +{ + unsigned char i,j,*pt; + + switch(char_type){ + case CHAR_16x8: + for(j=0;;j++){ + if( chr[j] ==0x00 )break; + pt =get_string_table(chr+j); + //鍐欎竴涓瓧绗 + lcd_set_cursor_position(x+j*8,y); + for(i=0;i<8;i++) lcd_write_data( (reverse==0)?pt[i]:~pt[i] ); + lcd_set_cursor_position(x+j*8,y+1); + for(i=0;i<8;i++) lcd_write_data( (reverse==0)?pt[i+8]:~pt[i+8] ); + }//for + break; + + case CHAR_16x8_MIDLINE://鐗规畩澶勭悊:涓嬪垝绾夸唬鏇夸腑鍒掔嚎 + for(j=0;;j++){ + if( chr[j] ==0x00 )break; + pt =get_string_table(chr+j); + //鍐欎竴涓瓧绗 + lcd_set_cursor_position(x+j*8,y); + for(i=0;i<8;i++) lcd_write_data( (reverse==0)?pt[i]:~pt[i] ); + lcd_set_cursor_position(x+j*8,y);//lcd_set_cursor_position(x+j*8,y+1); + for(i=0;i<8;i++) lcd_write_data( (reverse==0)?pt[i+8]:~pt[i+8] ); + }//for + break; + + #if 0 + case CHIN_12x12: + for(j=0;j> 12; /* 鏆傚瓨CRC鐨勯珮鍥涗綅 */ + Crc <<= 4; /* CRC宸︾Щ4浣嶏紝鐩稿綋浜庡彇CRC鐨勪綆12浣嶏級*/ + Crc ^= crc_table2[da ^ ( *ptr / 16 )]; /* CRC鐨勯珮4浣嶅拰鏈瓧鑺傜殑鍓嶅崐瀛楄妭鐩稿姞鍚庢煡琛ㄨ绠桟RC锛 + 鐒跺悗鍔犱笂涓婁竴娆RC鐨勪綑鏁 */ + da = Crc >> 12; /* 鏆傚瓨CRC鐨勯珮4浣 */ + Crc <<= 4; /* CRC宸︾Щ4浣嶏紝 鐩稿綋浜嶤RC鐨勪綆12浣嶏級 */ + Crc ^= crc_table2[da ^ ( *ptr & 0x0f )]; /* CRC鐨勯珮4浣嶅拰鏈瓧鑺傜殑鍚庡崐瀛楄妭鐩稿姞鍚庢煡琛ㄨ绠桟RC锛岀劧鍚庡啀鍔犱笂涓婁竴娆RC鐨勪綑鏁 */ + ptr++; + } + return( Crc ); +} + +/* + +*/ +void uart1_send_datas(unsigned char *pt,unsigned short len) +{ +// unsigned short i; +// for(i=0;iCNT, +// .enable_crc_clk =__HAL_RCC_CRC_CLK_ENABLE,//__CRC_CLK_ENABLE, + + + + .uart1_print_bytes =uart1_send_datas, + /*------------------------------------------------------- + !!!!!!!!!!!! 璀︽垝绾 姝ゅ墠鐨勬暟鎹姝换浣曚慨鏀 !!!!!!!! + 濡傞渶娣诲姞璇峰湪姝や箣鍚!!!!!!!!!!!!!!!!! + --------------------------------------------------------*/ + + + +}; + + + diff --git b/Base_core/user_lib/A5130.h a/Base_core/user_lib/A5130.h new file mode 100644 index 0000000..2cee7b0 --- /dev/null +++ a/Base_core/user_lib/A5130.h @@ -0,0 +1,101 @@ + + + +#define MODE_REG 0x00 +#define MODECTRL_REG 0x01 +#define CALIBRATION_REG 0x02 +#define FIFO1_REG 0x03 +#define FIFO2_REG 0x04 +#define FIFO_REG 0x05 +#define IDCODE_REG 0x06 +#define RCOSC1_REG 0x07 + +#define RCOSC2_REG 0x08 +#define RCOSC3_REG 0x09 +#define CKO_REG 0x0A +#define GIO1_REG 0x0B +#define GIO2_REG 0x0C +#define DATARATE_REG 0x0D +#define PLL1_REG 0x0E +#define PLL2_REG 0x0F + +#define PLL3_REG 0x10 +#define PLL4_REG 0x11 +#define PLL5_REG 0x12 +#define CHGROUP1_REG 0x13 +#define CHGROUP2_REG 0x14 +#define TX1_REG 0x15 +#define TX2_REG 0x16 +#define DELAY1_REG 0x17 + +#define DELAY2_REG 0x18 +#define RX_REG 0x19 +#define RXGAIN1_REG 0x1A +#define RXGAIN2_REG 0x1B +#define RXGAIN3_REG 0x1C +#define RXGAIN4_REG 0x1D +#define RSSI_REG 0x1E +#define ADC_REG 0x1F + +#define CODE1_REG 0x20 +#define CODE2_REG 0x21 +#define CODE3_REG 0x22 +#define IFCAL1_REG 0x23 +#define IFCAL2_REG 0x24 +#define VCOCCAL_REG 0x25 +#define VCOCAL1_REG 0x26 +#define VCOCAL2_REG 0x27 + +#define VCODEVCAL1_REG 0x28 +#define VCODEVCAL2_REG 0x29 +#define DASP_REG 0x2A +#define VCOMODDELAY_REG 0x2B +#define BATTERY_REG 0x2C +#define TXTEST_REG 0x2D +#define RXDEM1_REG 0x2E +#define RXDEM2_REG 0x2F + +#define CPC1_REG 0x30 +#define CPC2_REG 0x31 +#define CRYSTALTEST_REG 0x32 +#define PLLTEST_REG 0x33 +#define VCOTEST_REG 0x34 +#define RFANALOG_REG 0x35 +#define KEYDATA_REG 0x36 +#define CHSELECT_REG 0x37 + +#define ROMP_REG 0x38 +#define DATARATECLOCK 0x39 +#define FCR_REG 0x3A +#define ARD_REG 0x3B +#define AFEP_REG 0x3C +#define FCB_REG 0x3D +#define KEYC_REG 0x3E +#define USID_REG 0x3F + + + + +//strobe command +#define CMD_SLEEP 0x80 //1000,xxxx SLEEP mode +#define CMD_IDLE 0x90 //1001,xxxx IDLE mode +#define CMD_STBY 0xA0 //1010,xxxx Standby mode +#define CMD_PLL 0xB0 //1011,xxxx PLL mode +#define CMD_RX 0xC0 //1100,xxxx RX mode +#define CMD_TX 0xD0 //1101,xxxx TX mode +#define CMD_TFR 0xE0 //1110,xxxx TX FIFO reset +#define CMD_RFR 0xF0 //1111,xxxx RX FIFO reset + + + + + + + + + + + + + + diff --git b/Base_core/user_lib/Common/err_codes.h a/Base_core/user_lib/Common/err_codes.h new file mode 100644 index 0000000..70347e4 --- /dev/null +++ a/Base_core/user_lib/Common/err_codes.h @@ -0,0 +1,260 @@ +/** + ****************************************************************************** + * @file err_codes.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Provides defines for error codes + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_ERR_CODES_H__ +#define __CRL_ERR_CODES_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +//#include "config.h" +#include "types.h" +#include "err_codes.h" + + +/** @addtogroup UserAPI User Level API + * @{ + */ + +/** @addtogroup ErrCodes Error Codes Definitions + * @{ + */ + +/** @defgroup GenericError Generic Error Codes + * @{ + */ + +#define AUTHENTICATION_SUCCESSFUL (int32_t) (1003) /*!< Authentication successful */ +#define AUTHENTICATION_FAILED (int32_t) (1004) /*!< Authentication failed */ +#define SIGNATURE_VALID AUTHENTICATION_SUCCESSFUL /*!< Signature is valid */ +#define SIGNATURE_INVALID AUTHENTICATION_FAILED /*!< Signature is NOT valid */ +#define ERR_MEMORY_FAIL (int32_t) (1005) /*!< Problems with dynamic allocation (there's no more available memory) */ +/** + * @} + */ + +/** @defgroup AESError AES Error Codes + * @{ + */ +#define AES_SUCCESS (int32_t) (0) /*!< AES of PRIVKEY Success */ +#define AES_ERR_BAD_INPUT_SIZE (int32_t) (3101) /*!< AES of PRIVKEY Invalid input size */ +#define AES_ERR_BAD_OPERATION (int32_t) (3102) /*!< AES of PRIVKEY Invalid operation */ +#define AES_ERR_BAD_CONTEXT (int32_t) (3103) /*!< AES of PRIVKEY The AES context contains some invalid or uninitialized values */ +#define AES_ERR_BAD_PARAMETER (int32_t) (3104) /*!< AES of PRIVKEY One of the expected function parameters is invalid */ +/** + * @} + */ +/** @defgroup CHACHAError ChaCha Error Codes +* @{ +*/ +#define CHACHA_SUCCESS (int32_t) (0) /*!< ChaCha Success */ +#define CHACHA_ERR_BAD_INPUT_SIZE (int32_t) (3201) /*!< ChaCha Invalid input size */ +#define CHACHA_ERR_BAD_OPERATION (int32_t) (3202) /*!< ChaCha Invalid operation */ +#define CHACHA_ERR_BAD_CONTEXT (int32_t) (3203) /*!< ChaCha The AES context contains some invalid or uninitialized values */ +#define CHACHA_ERR_BAD_PARAMETER (int32_t) (3204) /*!< ChaCha One of the expected function parameters is invalid */ +/** +* @} +*/ + +/** @defgroup POLY1305Error POLY1305 Error Codes +* @{ +*/ +#define POLY1305_SUCCESS (int32_t) (0) /*!< POLY1305 Success */ +#define POLY1305_ERR_BAD_OPERATION (int32_t) (3102) /*!< POLY1305 Invalid operation */ +#define POLY1305_ERR_BAD_CONTEXT (int32_t) (3103) /*!< POLY1305 The context contains some invalid or uninitialized values */ +#define POLY1305_ERR_BAD_PARAMETER (int32_t) (3104) /*!< POLY1305 One of the expected function parameters is invalid */ +/** +* @} +*/ + + +/** @defgroup ARC4Error ARC4 Error Codes + * @{ + */ +#define ARC4_SUCCESS (int32_t) (0) /*!< ARC4 of PRIVKEY Success*/ +#define ARC4_ERR_BAD_OPERATION (int32_t) (3202) /*!< ARC4 of PRIVKEY Invalid operation */ +#define ARC4_ERR_BAD_CONTEXT (int32_t) (3203) /*!< ARC4 of PRIVKEY The ARC4 context contains some invalid or uninitialized values */ +#define ARC4_ERR_BAD_PARAMETER (int32_t) (3204) /*!< ARC4 of PRIVKEY One of the expected function parameters is invalid */ +/** + * @} + */ + +/** @defgroup DESError DES Error Codes + * @{ + */ +#define DES_SUCCESS (int32_t) (0) /*!< DES of PRIVKEY Success */ +#define DES_ERR_BAD_INPUT_SIZE (int32_t) (3301) /*!< DES of PRIVKEY Invalid input size, it must be multiple of 8 */ +#define DES_ERR_BAD_OPERATION (int32_t) (3302) /*!< DES of PRIVKEY Invalid operation */ +#define DES_ERR_BAD_CONTEXT (int32_t) (3303) /*!< DES of PRIVKEY The DES context contains some invalid or uninitialized values */ +#define DES_ERR_BAD_PARAMETER (int32_t) (3304) /*!< DES of PRIVKEY One of the expected function parameters is invalid*/ +/** + * @} + */ + +/** @defgroup TDESError TDES Error Codes + * @{ + */ +#define TDES_SUCCESS (int32_t) (0) /*!< TDES of PRIVKEY Success */ +#define TDES_ERR_BAD_INPUT_SIZE (int32_t) (3311) /*!< TDES of PRIVKEY Invalid input size, it must be multiple of 8 */ +#define TDES_ERR_BAD_OPERATION (int32_t) (3312) /*!< TDES of PRIVKEY Invalid operation */ +#define TDES_ERR_BAD_CONTEXT (int32_t) (3313) /*!< TDES of PRIVKEY The TDES context contains some invalid or uninitialized values */ +#define TDES_ERR_BAD_PARAMETER (int32_t) (3314) /*!< TDES of PRIVKEY One of the expected function parameters is invalid */ +/** + * @} + */ + +/** @defgroup HASHError HASH Error Codes + * @{ + */ +#define HASH_SUCCESS (int32_t) (0) /*!< hash Success */ +#define HASH_ERR_BAD_OPERATION (int32_t) (4001) /*!< hash Invalid operation */ +#define HASH_ERR_BAD_CONTEXT (int32_t) (4002) /*!< hash The HASH context contains some invalid or uninitialized values */ +#define HASH_ERR_BAD_PARAMETER (int32_t) (4003) /*!< hash One of the expected function parameters is invalid */ +#define HASH_ERR_INTERNAL (int32_t) (4011) /*!< hash Generic internal error */ +/** + * @} + */ + +/** @defgroup RSAError RSA Error Codes + * @{ + */ +#define RSA_SUCCESS (int32_t) (0) /*!< RSA Success */ +#define RSA_ERR_BAD_OPERATION (int32_t) (5102) /*!< RSA Invalid operation */ +#define RSA_ERR_BAD_KEY (int32_t) (5103) /*!< RSA Invalid Key */ +#define RSA_ERR_BAD_PARAMETER (int32_t) (5104) /*!< RSA One of the expected function parameters is invalid */ +#define RSA_ERR_UNSUPPORTED_HASH (int32_t) (5105) /*!< RSA The hash function is not supported */ +#define RSA_ERR_MESSAGE_TOO_LONG (int32_t) (5106) /*!< RSA Message too long */ +#define RSA_ERR_MODULUS_TOO_SHORT (int32_t) (5107) /*!< RSA modulus too short */ +#define RSA_ERR_GENERIC (int32_t) (5108) /*!< RSA Generic Error */ +/** + * @} + */ + +/** @defgroup ECCError ECC Error Codes + * @{ + */ +#define ECC_SUCCESS (int32_t) (0) /*!< ecc Success */ +#define ECC_ERR_BAD_OPERATION (int32_t) (5202) /*!< ecc Invalid operation */ +#define ECC_ERR_BAD_CONTEXT (int32_t) (5203) /*!< ecc The ECC context contains some invalid or initialized parameters */ +#define ECC_ERR_BAD_PARAMETER (int32_t) (5204) /*!< ecc One of the expected function parameters is invalid */ +#define ECC_ERR_BAD_PUBLIC_KEY (int32_t) (5205) /*!< ecc Invalid Public Key */ +#define ECC_ERR_BAD_PRIVATE_KEY (int32_t) (5206) /*!< ecc Invalid Private Key */ +#define ECC_ERR_MISSING_EC_PARAMETER (int32_t) (5207) /*!< ecc The EC parameters structure miss some parameter required by the function */ +#define ECC_WARN_POINT_AT_INFINITY (int32_t) (5208) /*!< ecc Returned Point is the point at infinity */ +/** + * @} + */ + +/** @defgroup RNGError Random Number Error Codes + * @{ + */ +#define RNG_SUCCESS (int32_t) (0) /*!< RNG Success */ +#define RNG_ERR_UNINIT_STATE (int32_t) (6001) /*!< RNG has not been correctly initialized */ +#define RNG_ERR_BAD_OPERATION (int32_t) (6002) /*!< RNG Invalid operation */ +#define RNG_ERR_RESEED_NEEDED (int32_t) (6003) /*!< RNG Reseed is needed */ +#define RNG_ERR_BAD_PARAMETER (int32_t) (6004) /*!< RNG One of the expected function parameters is invalid */ +#define RNG_ERR_BAD_ENTROPY_SIZE (int32_t) (6006) /*!< RNG Check the size of the entropy string */ +#define RNG_ERR_BAD_PERS_STRING_SIZE (int32_t) (6007) /*!< RNG Check the size of the personalization string */ +#define RNG_ERR_BAD_ADD_INPUT_SIZE (int32_t) (6008) /*!< RNG Check the size of the additional input string */ +#define RNG_ERR_BAD_REQUEST (int32_t) (6009) /*!< RNG Check the size of the random request */ +#define RNG_ERR_BAD_NONCE_SIZE (int32_t) (6010) /*!< RNG Check the size of the nocne */ +#define RNG_ERR_INTERNAL (int32_t) (6011) /*!< RNG Generic internal RNG error */ + + + + + +/** @defgroup ED25519Error Ed25519 Error Codes +* @{ +*/ +#define ED25519_SUCCESS (int32_t) (0) /*!< Ed25519 Success */ +#define ED25519_ERR_BAD_POINT (int32_t) (5505) /*!< Ed25519 Invalid Packet Point */ +#define ED25519_ERR_BAD_PARAMETER (int32_t) (5504) /*!< Ed25519 One of the expected function parameters is invalid */ + + +/** +* @} +*/ + +/** @defgroup C25519Error Curve25519 Error Codes +* @{ +*/ +#define C25519_SUCCESS (int32_t) (0) /*!< Curve25519 Success */ +#define C25519_ERR_BAD_POINT (int32_t) (5605) /*!< Curve25519 Invalid Packet Point */ +#define C25519_ERR_BAD_PARAMETER (int32_t) (5604) /*!< Curve25519 One of the expected function parameters is invalid */ + + +/** +* @} +*/ + +/** @defgroup MathError Mathemtical Error Codes + * @{ + */ +#define MATH_SUCCESS (int32_t) (0) /*!< Math Success */ +#define MATH_ERR_BIGNUM_OVERFLOW (int32_t) (5301) /*!< Math Overflow, the returned BigNum would be greater than its maximum size */ +#define MATH_ERR_EVEN_MODULUS (int32_t) (5302) /*!< Math This function can be used only with odd moduli */ +#define MATH_ERR_BAD_PARAMETER (int32_t) (5304) /*!< Math One of the expected function parameters is invalid */ +#define MATH_ERR_INTERNAL (int32_t) (5311) /*!< Math Generic internal error */ + +/** + * @} + */ + +/** @defgroup CHACHA20POLY1305Error ChaCha20-Poly1305 Error Codes +* @{ +*/ +#define CHACHA20POLY1305_SUCCESS (int32_t) (0) /*!< ChaCha20-Poly1305 Success */ +#define CHACHA20POLY1305_ERR_BAD_OPERATION (int32_t) (3102) /*!< ChaCha20-Poly1305 Invalid operation */ +#define CHACHA20POLY1305_ERR_BAD_CONTEXT (int32_t) (3103) /*!< ChaCha20-Poly1305 The context contains some invalid or uninitialized values */ +#define CHACHA20POLY1305_ERR_BAD_PARAMETER (int32_t) (3104) /*!< ChaCha20-Poly1305 One of the expected function parameters is invalid */ + +/** +* @} +*/ + + #ifdef __cplusplus +} +#endif + +#endif /* __CRL_ERR_CODES_H__ */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/user_lib/Common/macros.h a/Base_core/user_lib/Common/macros.h new file mode 100644 index 0000000..c35c74c --- /dev/null +++ a/Base_core/user_lib/Common/macros.h @@ -0,0 +1,303 @@ +/** + ****************************************************************************** + * @file macros.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Support Macros for functions of the Cryptolib + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_MACROS_H__ +#define __CRL_MACROS_H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +/* Exported types --------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/** @addtogroup InternalAPI Internal functions + * @{ + */ + +/** @addtogroup Macros Macros + * @{ + */ + +/** + * @brief This macro returns the number of 32-bit words required + * to store a variable whose byte size is passed in input + * @param b Number of bytes + * @retval Number of words required to store a variable of size b + */ +#define WORD_COUNT(b) ((int32_t) ((uint32_t) b + 3u) / 4u) + +/** + * @brief This macro returns the maximum value between two inputs, + * the evaluation is done with the ">" operator + * @param a First input + * @param b Second input + * @retval Max(a,b) + */ +#define MAX(a,b) ((((uint32_t)(a)) > ((uint32_t)(b))) ? (a) : (b)) + +/** + * @brief This macro returns the minumum value between two inputs, + * the evaluation is done with the ">" operator + * @param a First input + * @param b Second input + * @retval Min(a,b) + */ +#define MIN(a,b) ((((uint32_t)(a)) > ((uint32_t)(b))) ? (b) : (a)) + + +/** + * @brief This macro is used to rotate left a 32bit variable by bits bits + * @param value The 32 bit value to rotate left + * @param bits The number of bits to rotate left + * @retval Roteted 32 bit value + */ +#ifdef CL_ON_STM32 +#define ROL(value, bits) (uint32_t) __ROR((value),32 - (bits)) +#else +#define ROL(value, bits) (uint32_t) (((value) << (bits)) | ((value) >> (32 - (bits)))) +#endif + +/** + * @brief This macro is used to rotate right a 32bit variable by bits bits + * @param value The 32 bit value to rotate right + * @param bits The number of bits to rotate right + * @retval Roteted 32 bit value + */ +#ifdef CL_ON_STM32 +#define ROR(value, bits) (uint32_t) __ROR((value),(bits)) +#else +#define ROR(value, bits) (uint32_t) (((value) >> (bits)) | ((value) << (32 - (bits)))) +#endif + +/** + * @brief This macro returns the least significant byte from an int32_t + * @param P_word The 32-bit from which the least significant byte is taken + * @retval Least significant byte of P_word + */ +#define BYTE_3(P_word) (uint8_t) (P_word & 0xFFu) + +/** + * @brief This macro returns the second least significant byte from an int32_t + * @param P_word The 32-bit from which the second least significant byte is taken + * @retval Second least significant byte of P_word + */ +#define BYTE_2(P_word) (uint8_t) ((P_word >> 8) & 0xFFu) + +/** + * @brief This macro returns the second most significant byte from an int32_t + * @param P_word The 32-bit from which the second most significant byte is taken + * @retval Second most significant byte of P_word + */ +#define BYTE_1(P_word) (uint8_t) ((P_word >> 16) & 0xFFu) + +/** + * @brief This macro returns the most significant byte from an int32_t + * @param P_word The 32-bit from which the most significant byte is taken + * @retval Most significant byte of x + */ +#define BYTE_0(P_word) (uint8_t) ((P_word >> 24) & 0xFFu) + +/** + * @brief This macro returns a byte within an word + * @param P_word The 32-bit from which the byte + * @param P_n The index of the byte to be taken, 0 = MSB, 3 = LSB + * @retval Selected P_n byte from P_word + */ +#define BYTE_X(P_word, P_n) (uint8_t) ((P_word >> (24 - (8 * (P_n)))) & 0xFFu) + + +/** + * @brief This macro outputs the 4 octects that form the input 32bit integer + * @param [in] P_x The input 32bit integer + * @param [out] P_a The least significant byte of P_x + * @param [out] P_b The second least significant byte of P_x + * @param [out] P_c The second most significant byte of P_x + * @param P_d The most significant byte of P_x + * @retval none + */ +#define WORD32_TO_WORD8(P_x,P_a,P_b,P_c,P_d) P_a=(uint8_t)BYTE_3(P_x),P_b=(uint8_t)BYTE_2(P_x),P_c=(uint8_t)BYTE_1(P_x),P_d=(uint8_t)BYTE_0(P_x) + + +/** + * @brief This macro returns an integer from 4 octects + * @param P_b0 The most significant byte of the resulting integer + * @param P_b1 The second most byte of the resulting integer + * @param P_b2 The second least byte of the resulting integer + * @param P_b3 The least byte of the resulting integer + * @retval The resulting 32bit integer formed by P_b0 || P_b1 || P_b2 || P_b3 + */ +#define WORD8_TO_WORD32(P_b0, P_b1, P_b2, P_b3) (uint32_t) ((uint32_t)(P_b0) << 24 | (uint32_t)(P_b1) << 16 | (uint32_t)(P_b2) << 8 | (P_b3)) + +#if CRL_ENDIANNESS==1 + +/** + * @brief This macro is used on little endian cpus to convert a + * 4 byte array into a 32 bit integer or viceversa. + * @param VariableToConvert The 32 bits value to be converted + * @retval The converted 32 bits value + */ +#ifdef CL_ON_STM32 +#define LE_CONVERT_W32(VariableToConvert) (uint32_t) (__REV(VariableToConvert)) +#else +#define LE_CONVERT_W32(VariableToConvert) (uint32_t) ((ROL( (uint32_t) VariableToConvert,24) & 0xFF00FF00u ) | (ROL( (uint32_t) VariableToConvert,8) & 0x00FF00FFu )) +#endif + +#elif CRL_ENDIANNESS==2 + +/** + * @brief This macro doesn't do anything. It exist for compatibility with + * little endian cpus. + * @param VariableToConvert The 32 bit value to be converted + * @retval VariableToConvert as it was passed + * @note This macro simply returns its argument as it is. + */ +#define LE_CONVERT_W32(VariableToConvert) (VariableToConvert) +#else /* CRL_ENDIANNESS NOT SET */ +#error "Please select endianness in config.h" +#endif /* #if CRL_ENDIANNESS */ + + +/* Support macro for rand.c for big endian cpus */ +#if CRL_ENDIANNESS==2 + +/** + * @brief This macro is used on big endian cpus to convert a + * a 32 bit integer into a little endian array of 4 bytes. + * @param VariableToConvert The 32 bits value to be converted + * @retval The converted 32 bits value + */ +#define BE_CONVERT_W32(VariableToConvert) ((ROL(VariableToConvert,24)&0xFF00FF00) | (ROL(VariableToConvert,8)&0x00FF00FF)) +#endif + +#ifdef CRL_CPU_SUPPORT_MISALIGNED + +/** + * @brief This macro is used to read a 4 bytes from a byte array and return + * it as a 32-bit word, taking care of system endianness + * @param P_pInputBuffer Pointer to the input byte buffer + * @param P_index Index of P_pInputBuffer where the reading should start + * @retval The 32 bits value + * @note This macro is for systems where unaligned reading is allowed + */ +#define BUFFER_2_W32(P_pInputBuffer,P_index) (LE_CONVERT_W32(*((const uint32_t *) ((P_pInputBuffer)+(P_index))))) +/** +* @brief This macro is used to read a 4 bytes from a byte array and return +* it as a 32-bit word with reversed endiannes +* @param P_pInputBuffer Pointer to the input byte buffer +* @param P_index Index of P_pInputBuffer where the reading should start +* @retval The 32 bits value +* @note This macro is for systems where unaligned reading is allowed +*/ +#define BUFFER_2_LEW32(P_pInputBuffer,P_index) ((*((const uint32_t *) ((P_pInputBuffer)+(P_index))))) + +/** + * @brief This macro is used to write a 32bit integer into a byte buffer, + * taking care of system endianness + * @param [out] P_pOutputBuffer Pointer to the output byte buffer + * @param [in] P_index Index of P_pOutputBuffer where the writing should start + * @param [in] P_word The 32-bit word that will be written + * @retval none + * @note This macro is for systems where unaligned writing is allowed + */ + +#define W32_2_BUFFER(P_pOutputBuffer,P_index,P_word) *((uint32_t*)(P_pOutputBuffer+(P_index)))=LE_CONVERT_W32(P_word) +/** +* @brief This macro is used to write a 32bit integer into a byte buffer, +* with reversed endiannes +* @param [out] P_pOutputBuffer Pointer to the output byte buffer +* @param [in] P_index Index of P_pOutputBuffer where the writing should start +* @param [in] P_word The 32-bit word that will be written +* @retval none +* @note This macro is for systems where unaligned writing is allowed +*/ +#define LEW32_2_BUFFER(P_pOutputBuffer,P_index,P_word) *((uint32_t*)(P_pOutputBuffer+(P_index)))=(P_word) +#else + +/** + * @brief This macro is used to read a 4 bytes from a byte array and return + * it as a 32-bit word + * @param P_pInputBuffer Pointer to the input byte buffer + * @param P_index Index of P_pInputBuffer where the reading should start + * @retval The 32 bits value + * @note This macro is for systems where unaligned reading is \b not allowed + */ +#define BUFFER_2_W32(P_pInputBuffer,P_index) (WORD8_TO_WORD32(P_pInputBuffer[(P_index)],P_pInputBuffer[(P_index)+1],P_pInputBuffer[(P_index)+2],P_pInputBuffer[(P_index)+3])) + +/** +* @brief This macro is used to read a 4 bytes from a byte array and return +* it as a 32-bit word with reversed endiannes +* @param P_pInputBuffer Pointer to the input byte buffer +* @param P_index Index of P_pInputBuffer where the reading should start +* @retval The 32 bits value +* @note This macro is for systems where unaligned reading is \b not allowed +*/ +#define BUFFER_2_LEW32(P_pInputBuffer,P_index) (WORD8_TO_WORD32((P_pInputBuffer)[(P_index)+3],(P_pInputBuffer)[(P_index)+2],(P_pInputBuffer)[(P_index)+1],(P_pInputBuffer)[(P_index)])) + +/** + * @brief This macro is used to write a 32bit integer into a byte buffer, + * taking care of system endianness + * @param [out] P_pOutputBuffer Pointer to the output byte buffer + * @param [in] P_index Index of P_pOutputBuffer where the writing should start + * @param [in] P_word The 32-bit word that will be written + * @retval none + * @note This macro is for systems where unaligned writing is \b not allowed + */ +#define W32_2_BUFFER(P_pOutputBuffer,P_index,P_word) WORD32_TO_WORD8((P_word),P_pOutputBuffer[(P_index)+3],P_pOutputBuffer[(P_index)+2],P_pOutputBuffer[(P_index)+1],P_pOutputBuffer[(P_index)]) + +/** +* @brief This macro is used to write a 32bit integer into a byte buffer, +* with reversed endiannes +* @param [out] P_pOutputBuffer Pointer to the output byte buffer +* @param [in] P_index Index of P_pOutputBuffer where the writing should start +* @param [in] P_word The 32-bit word that will be written +* @retval none +* @note This macro is for systems where unaligned writing is \b not allowed +*/ +#define LEW32_2_BUFFER(P_pOutputBuffer,P_index,P_word) WORD32_TO_WORD8((P_word),(P_pOutputBuffer)[(P_index)],(P_pOutputBuffer)[(P_index)+1],(P_pOutputBuffer)[(P_index)+2],(P_pOutputBuffer)[(P_index)+3]) + + +#endif + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif +/* Exported functions ------------------------------------------------------- */ + +#endif /*__CRL_MACROS_H__*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/user_lib/Common/sk.h a/Base_core/user_lib/Common/sk.h new file mode 100644 index 0000000..46323d1 --- /dev/null +++ a/Base_core/user_lib/Common/sk.h @@ -0,0 +1,114 @@ +/** + ****************************************************************************** + * @file sk.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Symmetric Key Common Definitions + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_SK_H__ +#define __CRL_SK_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ + +/** @addtogroup SymKey + * @{ + */ +/* Exported types ----------------------------------------------------------- */ + +typedef enum { + E_SK_DEFAULT = (uint32_t) (0x00000000), /*!< User Flag: No flag specified. This is the default value that should be set to this flag */ + E_SK_DONT_PERFORM_KEY_SCHEDULE = (uint32_t) (0x00000001), /*!< User Flag: Used to force the init to not reperform key schedule.\n + The classic example is where the same key is used on a new message, in this case to redo key scheduling is + a useless waste of computation, could be particularly useful on GCM, where key schedule is very complicated. */ + E_SK_FINAL_APPEND = (uint32_t) (0x00000020), /*!< User Flag: Must be set in CMAC mode before the final Append call occurs. */ + E_SK_OPERATION_COMPLETED = (uint32_t) (0x00000002), /*!< Internal Flag (not to be set/read by user): used to check that the Finish function has been already called */ + E_SK_NO_MORE_APPEND_ALLOWED = (uint32_t) (0x00000004), /*!< Internal Flag (not to be set/read by user): it is set when the last append has been called. Used where the append is called with an InputSize not + multiple of the block size, which means that is the last input.*/ + E_SK_NO_MORE_HEADER_APPEND_ALLOWED = (uint32_t) (0x00000010), /*!< Internal Flag (not to be set/read by user): only for authenticated encryption modes. \n + It is set when the last header append has been called. Used where the header append is called with an InputSize not + multiple of the block size, which means that is the last input.*/ + E_SK_APPEND_DONE = (uint32_t) (0x00000040), /*!< Internal Flag (not to be set/read by user): only for CMAC.It is set when the first append has been called */ + E_SK_SET_COUNTER = (uint32_t)(0x00000080), /*!< User Flag: With ChaCha20 this is used to indicate a value for the counter, used to process non contiguous blocks (i.e. jump ahead)*/ + +} SKflags_et; /*!< Type definitation for Symmetric Key Flags */ + +/** + * @} + */ + +/** @addtogroup InternalAPI Internal functions + * @{ + */ + +/** @defgroup SymKeylowlevel Symmetric Key Low Level Flags + * @{ + */ + +#define C_ENC (uint32_t) (0x00000000) /*!< Internal contant indicating "Encryption" */ +#define C_DEC (uint32_t) (0x00000001) /*!< Internal contant indicating "Decryption" */ +#define C_DIR_MASK (uint32_t) (0x00000001) /*!< Internal mask for Encryption/Decryption */ +#define C_ECB (uint32_t) (0x00000002) /*!< Internal contant indicating "ECB" */ +#define C_CBC (uint32_t) (0x00000004) /*!< Internal contant indicating "CBC" */ +#define C_CTR (uint32_t) (0x00000006) /*!< Internal contant indicating "CTR" */ +#define C_MODE_MASK (uint32_t) (0x00000006) /*!< Internal mask for ECB/CBC/CTR */ +#define C_DES (uint32_t) (0x00000008) /*!< Internal contant indicating "DES" */ +#define C_TDES (uint32_t) (0x00000010) /*!< Internal contant indicating "TDES" */ +#define C_AES (uint32_t) (0x00000018) /*!< Internal contant indicating "AES" */ +#define C_ALGO_MASK (uint32_t) (0x00000018) /*!< Internal mask for DES/TDES/AES */ +#define C_AES128 (uint32_t) (0x10000000) /*!< Internal contant indicating "AES with key of 128" */ +#define C_AES192 (uint32_t) (0x18000000) /*!< Internal contant indicating "AES with key of 192" */ +#define C_AES256 (uint32_t) (0x20000000) /*!< Internal contant indicating "AES with key of 256" */ +#define C_AES_KEY_MASK (uint32_t) (0x00000038) /*!< Internal mask for AES128/AES192/AES256 */ + + +/* Directions of the operations */ +#define CRL_ENC 0 /*!< Used to specify an encryption operation. */ +#define CRL_DEC 1 /*!< Used to specify a decryption operation. */ + +/* Modes of operation */ +#define CRL_ECB 0 /*!< Used to specify the Electronic Code Book mode of operation. */ +#define CRL_CBC 1 /*!< Used to specify the Cipher Block Chaining mode of operation. */ +#define CRL_CTR 2 /*!< Used to specify the Counter mode of operation (for AES only). */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __CRL_SK_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/user_lib/Common/types.h a/Base_core/user_lib/Common/types.h new file mode 100644 index 0000000..8a90da6 --- /dev/null +++ a/Base_core/user_lib/Common/types.h @@ -0,0 +1,101 @@ +/** + ****************************************************************************** + * @file types.h + * @author MCD Application Team + * @version V3.0.0 + * @date 05-June-2015 + * @brief Define the various basic types needed by the Library + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2015 STMicroelectronics

+ * + * Licensed under MCD-ST Image SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRL_TYPES_H__ +#define __CRL_TYPES_H__ + + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ + +/** @addtogroup UserAPI User Level API + * @{ + */ + +/** @addtogroup TYPES Data Types Definitions + * @{ + */ + +#if !defined(_STDINT_H) && !defined(__stdint_h) && !defined(_STDINT) + +#ifndef __uint8_t_defined + +typedef unsigned int uint32_t; /*!< stdint.h defintion of uint32_t */ +typedef unsigned char uint8_t; /*!< stdint.h defintion of uint8_t */ +typedef unsigned short int uint16_t; /*!< stdint.h defintion of uint16_t */ +typedef unsigned long long uint64_t; /*!< stdint.h defintion of uint64_t */ + +#define __uint8_t_defined +#define __uint16_t_defined +#define __uint32_t_defined +#define __uint64_t_defined +#endif /*!< __uint8_t_defined */ + +#ifndef __int8_t_defined + +typedef signed long long int64_t; /*!< stdint.h defintion of int64_t */ +typedef signed int int32_t; /*!< stdint.h defintion of int32_t */ +typedef signed short int int16_t; /*!< stdint.h defintion of int16_t */ +typedef signed char int8_t; /*!< stdint.h defintion of int8_t */ +#define __int8_t_defined +#define __int16_t_defined +#define __int32_t_defined +#define __int64_t_defined +#endif /* __int8_t_defined */ + +#endif /* !defined(_STDINT_H) && !defined(__stdint_h) && !defined(_STDINT) */ + +/** @brief Type definitation for a pre-allocated memory buffer that is required by some functions */ +typedef struct +{ + uint8_t *pmBuf; /*!< Pointer to the pre-allocated memory buffer, this must be set by the user*/ + uint16_t mSize; /*!< Total size of the pre-allocated memory buffer */ + uint16_t mUsed; /*!< Currently used portion of the buffer, should be inititalized by user to zero */ +} +membuf_stt; + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __CRL_TYPES_H__ */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git b/Base_core/user_lib/HW_MCUIO.h a/Base_core/user_lib/HW_MCUIO.h new file mode 100644 index 0000000..fce5bad --- /dev/null +++ a/Base_core/user_lib/HW_MCUIO.h @@ -0,0 +1,122 @@ +#ifndef __HW_MCUIO_H__ +#define __HW_MCUIO_H__ + +#define MCU_STM32F4XX 0 +#define MCU_GD32F30X 1 + +#include "function.h" + +#if ( MCU_STM32F4XX == 1 ) + #include "stm32f4xx_hal.h" + #define HW_GPIO_PortDef GPIO_TypeDef* +// typedef GPIO_TypeDef HW_GPIO_PortDef; +#elif ( MCU_GD32F30X == 1 ) + #include "gd32f30x_gpio.h" + #include "gd32f30x_exti.h" + +// typedef uint32_t HW_GPIO_PortDef; + #define HW_GPIO_PortDef uint32_t +#endif + +#define RF_SPI_TIMEOUT 20000 // SPI鐨勮秴鏃惰鏁帮紝姣忔鍙槸鍗曠函鐨勮鏁-- + +typedef struct +{ + uint32_t Pin; /*!< Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_pins_define */ + + uint32_t Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIO_mode_define */ + + uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. + This parameter can be a value of @ref GPIO_pull_define */ + + uint32_t Speed; /*!< Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIO_speed_define */ + + uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. + This parameter can be a value of @ref GPIO_Alternate_function_selection */ + uint32_t Port; +}HW_GPIO_InitTypeDef; + + + + +// GPIO閫傞厤灞 + +#if ( MCU_STM32F4XX == 1 ) + + #define HW_GPIO_MODE_AIN GPIO_MODE_ANALOG /*!< analog input mode */ +// #define HW_GPIO_MODE_FLOATING GPIO_MODE_IN_FLOATING /*!< floating input mode */ + #define HW_GPIO_MODE_IPD GPIO_MODE_INPUT /*!< pull-down input mode */ + #define HW_GPIO_MODE_IPU GPIO_MODE_INPUT /*!< pull-up input mode */ + #define HW_GPIO_MODE_OUT_OD GPIO_MODE_OUTPUT_OD /*!< GPIO output with open-drain */ + #define HW_GPIO_MODE_OUT_PP GPIO_MODE_OUTPUT_PP /*!< GPIO output with push-pull */ + #define HW_GPIO_MODE_AF_OD GPIO_MODE_AF_OD /*!< AFIO output with open-drain */ + #define HW_GPIO_MODE_AF_PP GPIO_MODE_AF_PP + + #define HW_GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW /*!< output max speed 2MHz */ + #define HW_GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM /*!< output max speed 10MHz */ + #define HW_GPIO_SPEED_HIGH GPIO_SPEED_FREQ_HIGH /*!< output max speed 50MHz */ + #define HW_GPIO_SPEED_VERY_HIGH GPIO_SPEED_FREQ_VERY_HIGH /*!< GPIO very high output speed, max speed more than 50MHz */ + + #define HW_GPIO_Init(Port, init) HAL_GPIO_Init(Port, init) + #define HW_GPIO_ReadPin(Port, Pin) HAL_GPIO_ReadPin(Port, Pin) + #define HW_GPIO_SetPin(Port, Pin) HAL_GPIO_WritePin(Port, Pin, GPIO_PIN_SET) + #define HW_GPIO_ResetPin(Port, Pin) HAL_GPIO_WritePin(Port, Pin, GPIO_PIN_RESET) + #define HW_GPIO_TogglePin(Port, Pin) HAL_GPIO_TogglePin(Port, Pin) + + #define HW_RF_SPI_Init MX_SPI1_Init + + #define HW_DelayMs HAL_Delay +#elif ( MCU_GD32F30X == 1 ) + void HW_GD_GPIO_Init(HW_GPIO_PortDef Port, HW_GPIO_InitTypeDef *GPIO_init); + void HW_GD_GPIO_TogglePin(HW_GPIO_PortDef Port, uint32_t Pin); + void HW_GD_Delay(uint32_t DelayMs); + void HW_GD_IncTick(void); + void HW_GD_SPI0_Init(void); + uint8_t HW_GD_SPI0_TransmitReceive(uint8_t *txbuf, uint8_t *rxbuf, uint16_t len); + uint8_t HW_GD_CUSTOM_HID_REPORT_SEND(uint8_t *buf, uint16_t len); + + //GPIO + #define GPIO_NOPULL 0x00000000U /*!< No Pull-up or Pull-down activation */ + #define GPIO_PULLUP 0x00000001U /*!< Pull-up activation */ + #define GPIO_PULLDOWN 0x00000002U /*!< Pull-down activation */ + + #define HW_GPIO_MODE_AIN GPIO_MODE_AIN /*!< analog input mode */ + #define HW_GPIO_MODE_FLOATING GPIO_MODE_IN_FLOATING /*!< floating input mode */ + #define HW_GPIO_MODE_IPD GPIO_MODE_IPD /*!< pull-down input mode */ + #define HW_GPIO_MODE_IPU GPIO_MODE_IPU /*!< pull-up input mode */ + #define HW_GPIO_MODE_OUT_OD GPIO_MODE_OUT_OD /*!< GPIO output with open-drain */ + #define HW_GPIO_MODE_OUT_PP GPIO_MODE_OUT_PP /*!< GPIO output with push-pull */ + #define HW_GPIO_MODE_AF_OD GPIO_MODE_AF_OD /*!< AFIO output with open-drain */ + #define HW_GPIO_MODE_AF_PP GPIO_MODE_AF_PP + + #define HW_GPIO_SPEED_LOW GPIO_OSPEED_2MHZ /*!< output max speed 2MHz */ + #define HW_GPIO_SPEED_MEDIUM GPIO_OSPEED_10MHZ /*!< output max speed 10MHz */ + #define HW_GPIO_SPEED_HIGH GPIO_OSPEED_50MHZ /*!< output max speed 50MHz */ + #define HW_GPIO_SPEED_VERY_HIGH GPIO_OSPEED_MAX /*!< GPIO very high output speed, max speed more than 50MHz */ + + #define HW_GPIO_Init(Port, init) HW_GD_GPIO_Init(Port, init) + #define HW_GPIO_ReadPin(Port, Pin) gpio_input_bit_get(Port, Pin) + #define HW_GPIO_SetPin(Port, Pin) gpio_bit_set(Port, Pin) + #define HW_GPIO_ResetPin(Port, Pin) gpio_bit_reset(Port, Pin) + #define HW_GPIO_TogglePin(Port, Pin) HW_GD_GPIO_TogglePin(Port, Pin) + + //SPI + #define HW_RF_SPI_Init HW_GD_SPI0_Init + #define HW_RF_SPI_TransmitReceive(txbuf, rxbuf, len) HW_GD_SPI0_TransmitReceive(txbuf, rxbuf, len) + + //TIMER + #define HW_TIMER_Count_get( TIMERX ) timer_counter_read( TIMERX ) + + //USB custom_hid_report_send + #define HW_CUSTOM_HID_REPORT_SEND HW_GD_CUSTOM_HID_REPORT_SEND + + #define HW_DelayMs HW_GD_Delay + +#endif + + + +#endif diff --git b/Base_core/user_lib/MF522.h a/Base_core/user_lib/MF522.h new file mode 100644 index 0000000..d25c746 --- /dev/null +++ a/Base_core/user_lib/MF522.h @@ -0,0 +1,135 @@ + + +#ifndef _MF522_H +#define _MF522_H + + +//#define RFCARD + +///////////////////////////////////////////////////////////////////// +//MF522命令字 +///////////////////////////////////////////////////////////////////// +#define PCD_IDLE 0x00 //取消当前命令 +#define PCD_AUTHENT 0x0E //验证密钥 +#define PCD_RECEIVE 0x08 //接收数据 +#define PCD_TRANSMIT 0x04 //发送数据 +#define PCD_TRANSCEIVE 0x0C //发送并接收数据 +#define PCD_RESETPHASE 0x0F //复位 +#define PCD_CALCCRC 0x03 //CRC计算 + +///////////////////////////////////////////////////////////////////// +//Mifare_One卡片命令字 +///////////////////////////////////////////////////////////////////// +#define PICC_REQIDL 0x26 //寻天线区内未进入休眠状态 +#define PICC_REQALL 0x52 //寻天线区内全部卡 +#define PICC_ANTICOLL1 0x93 //防冲撞 +#define PICC_ANTICOLL2 0x95 //防冲撞 +#define PICC_AUTHENT1A 0x60 //验证A密钥 +#define PICC_AUTHENT1B 0x61 //验证B密钥 +#define PICC_READ 0x30 //读块 +#define PICC_WRITE 0xA0 //写块 +#define PICC_DECREMENT 0xC0 //扣款 +#define PICC_INCREMENT 0xC1 //充值 +#define PICC_RESTORE 0xC2 //调块数据到缓冲区 +#define PICC_TRANSFER 0xB0 //保存缓冲区中数据 +#define PICC_HALT 0x50 //休眠 + +///////////////////////////////////////////////////////////////////// +//MF522 FIFO长度定义 +///////////////////////////////////////////////////////////////////// +#define DEF_FIFO_LENGTH 64 //FIFO size=64byte + +///////////////////////////////////////////////////////////////////// +//MF522寄存器定义 +///////////////////////////////////////////////////////////////////// +// PAGE 0 +#define RFU00 0x00 +#define CommandReg 0x01 +#define ComIEnReg 0x02 +#define DivlEnReg 0x03 +#define ComIrqReg 0x04 +#define DivIrqReg 0x05 +#define ErrorReg 0x06 +#define Status1Reg 0x07 +#define Status2Reg 0x08 +#define FIFODataReg 0x09 +#define FIFOLevelReg 0x0A +#define WaterLevelReg 0x0B +#define ControlReg 0x0C +#define BitFramingReg 0x0D +#define CollReg 0x0E +#define RFU0F 0x0F +// PAGE 1 +#define RFU10 0x10 +#define ModeReg 0x11 +#define TxModeReg 0x12 +#define RxModeReg 0x13 +#define TxControlReg 0x14 +#define TxAutoReg 0x15 +#define TxSelReg 0x16 +#define RxSelReg 0x17 +#define RxThresholdReg 0x18 +#define DemodReg 0x19 +#define RFU1A 0x1A +#define RFU1B 0x1B +#define MifareReg 0x1C +#define RFU1D 0x1D +#define RFU1E 0x1E +#define SerialSpeedReg 0x1F +// PAGE 2 +#define RFU20 0x20 +#define CRCResultRegM 0x21 +#define CRCResultRegL 0x22 +#define RFU23 0x23 +#define ModWidthReg 0x24 +#define RFU25 0x25 +#define RFCfgReg 0x26 +#define GsNReg 0x27 +#define CWGsCfgReg 0x28 +#define ModGsCfgReg 0x29 +#define TModeReg 0x2A +#define TPrescalerReg 0x2B +#define TReloadRegH 0x2C +#define TReloadRegL 0x2D +#define TCounterValueRegH 0x2E +#define TCounterValueRegL 0x2F +// PAGE 3 +#define RFU30 0x30 +#define TestSel1Reg 0x31 +#define TestSel2Reg 0x32 +#define TestPinEnReg 0x33 +#define TestPinValueReg 0x34 +#define TestBusReg 0x35 +#define AutoTestReg 0x36 +#define VersionReg 0x37 +#define AnalogTestReg 0x38 +#define TestDAC1Reg 0x39 +#define TestDAC2Reg 0x3A +#define TestADCReg 0x3B +#define RFU3C 0x3C +#define RFU3D 0x3D +#define RFU3E 0x3E +#define RFU3F 0x3F + +///////////////////////////////////////////////////////////////////// +//和MF522通讯时返回的错误代码 +///////////////////////////////////////////////////////////////////// +#define MI_OK 0 +#define MI_NOTAGERR (-1) +#define MI_ERR (-2) + + + + +#endif // + + + + + + + + + + + diff --git b/Base_core/user_lib/RF24L01.h a/Base_core/user_lib/RF24L01.h new file mode 100644 index 0000000..18f3b0b --- /dev/null +++ a/Base_core/user_lib/RF24L01.h @@ -0,0 +1,198 @@ +/** + ****************************************************************************** + * @author 娉借绉戞妧 ASHINING + * @version V3.0 + * @date 2016-10-08 + * @brief NRF24L01閰嶇疆H鏂囦欢 + ****************************************************************************** + * @attention + * + * 瀹樼綉 : http://www.ashining.com + * 娣樺疂 : https://shop105912646.taobao.com + * 闃块噷宸村反: https://cdzeyao.1688.com + ****************************************************************************** + */ + + +#ifndef __DRV_RF24L01_H__ +#define __DRV_RF24L01_H__ + +//#include "stm32f4xx_hal.h"//#include "stm32F10x.h" +#include "function.h" + + +#if (SUPPORT_HS6621_SOC) +#define DYNAMIC_PACKET 0 //1:鍔ㄦ佹暟鎹寘, 0:鍥哄畾 +#else +/** 閰嶇疆鍜岄夐」瀹氫箟 */ +#define DYNAMIC_PACKET 1 //1:鍔ㄦ佹暟鎹寘, 0:鍥哄畾 +#endif +#define FIXED_PACKET_LEN 32 //鍖呴暱搴 +#define REPEAT_CNT 15 //閲嶅娆℃暟 +//#define INIT_ADDR 0x34,0x43,0x10,0x10,0x01 +#define INIT_ADDR 0x19,0x98,0xA4,0x25,0x01 + + + + +typedef enum ModeType +{ + MODE_TX = 0, + MODE_RX +} nRf24l01ModeType; + +typedef enum SpeedType +{ + SPEED_250K = 0, + SPEED_1M, + SPEED_2M +} nRf24l01SpeedType; + +typedef enum PowerType +{ + POWER_F18DBM = 0, + POWER_F12DBM, + POWER_F6DBM, + POWER_0DBM +} nRf24l01PowerType; + + +/** NRF24L01瀹氫箟 */ +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//瀵勫瓨鍣ㄦ搷浣滃懡浠 +#define NRF_READ_REG 0x00 //璇婚厤缃瘎瀛樺櫒锛屼綆5浣嶄负瀵勫瓨鍣ㄥ湴鍧 +#define NRF_WRITE_REG 0x20 //鍐欓厤缃瘎瀛樺櫒锛屼綆5浣嶄负瀵勫瓨鍣ㄥ湴鍧 +#define RD_RX_PLOAD 0x61 //璇籖X鏈夋晥鏁版嵁锛1~32瀛楄妭 +#define WR_TX_PLOAD 0xA0 //鍐橳X鏈夋晥鏁版嵁锛1~32瀛楄妭 +#define FLUSH_TX 0xE1 //娓呴櫎TX FIFO瀵勫瓨鍣紝鍙戝皠妯″紡涓嬩娇鐢 +#define FLUSH_RX 0xE2 //娓呴櫎RX FIFO瀵勫瓨鍣紝鎺ユ敹妯″紡涓嬩娇鐢 +#define REUSE_TX_PL 0xE3 //閲嶆柊浣跨敤涓婁竴鍖呮暟鎹紝CE涓洪珮锛屾暟鎹寘琚笉鏂彂閫 +#define R_RX_PL_WID 0x60 +#define NOP 0xFF //绌烘搷浣滐紝鍙互鐢ㄦ潵璇荤姸鎬佸瘎瀛樺櫒 +#define W_ACK_PLOAD 0xA8 +#define WR_TX_PLOAD_NACK 0xB0 +//SPI(NRF24L01)瀵勫瓨鍣ㄥ湴鍧 +#define CONFIG 0x00 //閰嶇疆瀵勫瓨鍣ㄥ湴鍧锛宐it0:1鎺ユ敹妯″紡,0鍙戝皠妯″紡;bit1:鐢甸夋嫨;bit2:CRC妯″紡;bit3:CRC浣胯兘; +//bit4:涓柇MAX_RT(杈惧埌鏈澶ч噸鍙戞鏁颁腑鏂)浣胯兘;bit5:涓柇TX_DS浣胯兘;bit6:涓柇RX_DR浣胯兘 +#define EN_AA 0x01 //浣胯兘鑷姩搴旂瓟鍔熻兘 bit0~5 瀵瑰簲閫氶亾0~5 +#define EN_RXADDR 0x02 //鎺ユ敹鍦板潃鍏佽 bit0~5 瀵瑰簲閫氶亾0~5 +#define SETUP_AW 0x03 //璁剧疆鍦板潃瀹藉害(鎵鏈夋暟鎹氶亾) bit0~1: 00,3瀛楄妭 01,4瀛楄妭, 02,5瀛楄妭 +#define SETUP_RETR 0x04 //寤虹珛鑷姩閲嶅彂;bit0~3:鑷姩閲嶅彂璁℃暟鍣;bit4~7:鑷姩閲嶅彂寤舵椂 250*x+86us +#define RF_CH 0x05 //RF閫氶亾,bit0~6宸ヤ綔閫氶亾棰戠巼 +#define RF_SETUP 0x06 //RF瀵勫瓨鍣紝bit3:浼犺緭閫熺巼( 0:1M 1:2M);bit1~2:鍙戝皠鍔熺巼;bit0:鍣0鏀惧ぇ鍣ㄥ鐩 +#define STATUS 0x07 //鐘舵佸瘎瀛樺櫒;bit0:TX FIFO婊℃爣蹇;bit1~3:鎺ユ敹鏁版嵁閫氶亾鍙(鏈澶:6);bit4:杈惧埌鏈澶氭閲嶅彂娆℃暟 +//bit5:鏁版嵁鍙戦佸畬鎴愪腑鏂;bit6:鎺ユ敹鏁版嵁涓柇 +#define MAX_TX 0x10 //杈惧埌鏈澶у彂閫佹鏁颁腑鏂 +#define TX_OK 0x20 //TX鍙戦佸畬鎴愪腑鏂 +#define RX_OK 0x40 //鎺ユ敹鍒版暟鎹腑鏂 + +#define OBSERVE_TX 0x08 //鍙戦佹娴嬪瘎瀛樺櫒,bit7~4:鏁版嵁鍖呬涪澶辫鏁板櫒;bit3~0:閲嶅彂璁℃暟鍣 +#define CD 0x09 //杞芥尝妫娴嬪瘎瀛樺櫒,bit0:杞芥尝妫娴 +#define RX_ADDR_P0 0x0A //鏁版嵁閫氶亾0鎺ユ敹鍦板潃锛屾渶澶ч暱搴5涓瓧鑺傦紝浣庡瓧鑺傚湪鍓 +#define RX_ADDR_P1 0x0B //鏁版嵁閫氶亾1鎺ユ敹鍦板潃锛屾渶澶ч暱搴5涓瓧鑺傦紝浣庡瓧鑺傚湪鍓 +#define RX_ADDR_P2 0x0C //鏁版嵁閫氶亾2鎺ユ敹鍦板潃锛屾渶浣庡瓧鑺傚彲璁剧疆锛岄珮瀛楄妭锛屽繀椤诲悓RX_ADDR_P1[39:8]鐩哥瓑 +#define RX_ADDR_P3 0x0D //鏁版嵁閫氶亾3鎺ユ敹鍦板潃锛屾渶浣庡瓧鑺傚彲璁剧疆锛岄珮瀛楄妭锛屽繀椤诲悓RX_ADDR_P1[39:8]鐩哥瓑 +#define RX_ADDR_P4 0x0E //鏁版嵁閫氶亾4鎺ユ敹鍦板潃锛屾渶浣庡瓧鑺傚彲璁剧疆锛岄珮瀛楄妭锛屽繀椤诲悓RX_ADDR_P1[39:8]鐩哥瓑 +#define RX_ADDR_P5 0x0F //鏁版嵁閫氶亾5鎺ユ敹鍦板潃锛屾渶浣庡瓧鑺傚彲璁剧疆锛岄珮瀛楄妭锛屽繀椤诲悓RX_ADDR_P1[39:8]鐩哥瓑 +#define TX_ADDR 0x10 //鍙戦佸湴鍧(浣庡瓧鑺傚湪鍓),ShockBurstTM妯″紡涓嬶紝RX_ADDR_P0涓庡湴鍧鐩哥瓑 +#define RX_PW_P0 0x11 //鎺ユ敹鏁版嵁閫氶亾0鏈夋晥鏁版嵁瀹藉害(1~32瀛楄妭),璁剧疆涓0鍒欓潪娉 +#define RX_PW_P1 0x12 //鎺ユ敹鏁版嵁閫氶亾1鏈夋晥鏁版嵁瀹藉害(1~32瀛楄妭),璁剧疆涓0鍒欓潪娉 +#define RX_PW_P2 0x13 //鎺ユ敹鏁版嵁閫氶亾2鏈夋晥鏁版嵁瀹藉害(1~32瀛楄妭),璁剧疆涓0鍒欓潪娉 +#define RX_PW_P3 0x14 //鎺ユ敹鏁版嵁閫氶亾3鏈夋晥鏁版嵁瀹藉害(1~32瀛楄妭),璁剧疆涓0鍒欓潪娉 +#define RX_PW_P4 0x15 //鎺ユ敹鏁版嵁閫氶亾4鏈夋晥鏁版嵁瀹藉害(1~32瀛楄妭),璁剧疆涓0鍒欓潪娉 +#define RX_PW_P5 0x16 //鎺ユ敹鏁版嵁閫氶亾5鏈夋晥鏁版嵁瀹藉害(1~32瀛楄妭),璁剧疆涓0鍒欓潪娉 +#define NRF_FIFO_STATUS 0x17 //FIFO鐘舵佸瘎瀛樺櫒;bit0:RX FIFO瀵勫瓨鍣ㄧ┖鏍囧織;bit1:RX FIFO婊℃爣蹇;bit2~3淇濈暀 +//bit4:TX FIFO 绌烘爣蹇;bit5:TX FIFO婊℃爣蹇;bit6:1,寰幆鍙戦佷笂涓鏁版嵁鍖.0,涓嶅惊鐜 +#define DYNPD 0x1C +#define FEATRUE 0x1D +////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//浣嶅畾涔 +#define MASK_RX_DR 6 +#define MASK_TX_DS 5 +#define MASK_MAX_RT 4 +#define EN_CRC 3 +#define CRCO 2 +#define PWR_UP 1 +#define PRIM_RX 0 + +#define ENAA_P5 5 +#define ENAA_P4 4 +#define ENAA_P3 3 +#define ENAA_P2 2 +#define ENAA_P1 1 +#define ENAA_P0 0 + +#define ERX_P5 5 +#define ERX_P4 4 +#define ERX_P3 3 +#define ERX_P2 2 +#define ERX_P1 1 +#define ERX_P0 0 + +#define AW_RERSERVED 0x0 +#define AW_3BYTES 0x1 +#define AW_4BYTES 0x2 +#define AW_5BYTES 0x3 + +#define ARD_250US (0x00<<4) +#define ARD_500US (0x01<<4) +#define ARD_750US (0x02<<4) +#define ARD_1000US (0x03<<4) +#define ARD_2000US (0x07<<4) +#define ARD_4000US (0x0F<<4) +#define ARC_DISABLE 0x00 +#define ARC_15 0x0F + +#define CONT_WAVE 7 +#define RF_DR_LOW 5 +#define PLL_LOCK 4 +#define RF_DR_HIGH 3 + +//bit2-bit1: +//#define PWR_18DB (0x00<<1) +//#define PWR_12DB (0x01<<1) +//#define PWR_6DB (0x02<<1) +//define PWR_0DB (0x03<<1) +#define PWR_7DB 7 +#define PWR_4DB 6 +#define PWR_3DB 5 +#define PWR_1DB 4 +#define PWR_0DB 3 +#define PWR_F4DB 2 +#define PWR_F6DB 1 +#define PWR_F12DB 0 + +#define RX_DR 6 +#define TX_DS 5 +#define MAX_RT 4 +//for bit3-bit1, +#define TX_FULL_0 0 + +#define RPD 0 + +#define TX_REUSE 6 +#define TX_FULL_1 5 +#define TX_EMPTY 4 +//bit3-bit2, reserved, only '00' +#define RX_FULL 1 +#define RX_EMPTY 0 + +#define DPL_P5 5 +#define DPL_P4 4 +#define DPL_P3 3 +#define DPL_P2 2 +#define DPL_P1 1 +#define DPL_P0 0 + +#define EN_DPL 2 +#define EN_ACK_PAY 1 +#define EN_DYN_ACK 0 +#define IRQ_ALL ( (1< + +/* enum definitions */ +typedef enum {DISABLE = 0, ENABLE = !DISABLE} EventStatus, ControlStatus; +typedef enum {RESET = 0, SET = !RESET} FlagStatus; +typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus; + +/* bit operations */ +#define REG32(addr) (*(volatile uint32_t *)(uint32_t)(addr)) +#define REG16(addr) (*(volatile uint16_t *)(uint32_t)(addr)) +#define REG8(addr) (*(volatile uint8_t *)(uint32_t)(addr)) +#define BIT(x) ((uint32_t)((uint32_t)0x01U<<(x))) +#define BITS(start, end) ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end)))) +#define GET_BITS(regval, start, end) (((regval) & BITS((start),(end))) >> (start)) + +/* main flash and SRAM memory map */ +#define FLASH_BASE ((uint32_t)0x08000000U) /*!< main FLASH base address */ +#define SRAM_BASE ((uint32_t)0x20000000U) /*!< SRAM0 base address */ +#define OB_BASE ((uint32_t)0x1FFFF800U) /*!< OB base address */ +#define DBG_BASE ((uint32_t)0xE0042000U) /*!< DBG base address */ +#define EXMC_BASE ((uint32_t)0xA0000000U) /*!< EXMC register base address */ + +/* peripheral memory map */ +#define APB1_BUS_BASE ((uint32_t)0x40000000U) /*!< apb1 base address */ +#define APB2_BUS_BASE ((uint32_t)0x40010000U) /*!< apb2 base address */ +#define AHB1_BUS_BASE ((uint32_t)0x40018000U) /*!< ahb1 base address */ +#define AHB3_BUS_BASE ((uint32_t)0x60000000U) /*!< ahb3 base address */ + +/* advanced peripheral bus 1 memory map */ +#define TIMER_BASE (APB1_BUS_BASE + 0x00000000U) /*!< TIMER base address */ +#define RTC_BASE (APB1_BUS_BASE + 0x00002800U) /*!< RTC base address */ +#define WWDGT_BASE (APB1_BUS_BASE + 0x00002C00U) /*!< WWDGT base address */ +#define FWDGT_BASE (APB1_BUS_BASE + 0x00003000U) /*!< FWDGT base address */ +#define SPI_BASE (APB1_BUS_BASE + 0x00003800U) /*!< SPI base address */ +#define USART_BASE (APB1_BUS_BASE + 0x00004400U) /*!< USART base address */ +#define I2C_BASE (APB1_BUS_BASE + 0x00005400U) /*!< I2C base address */ +#define USBD_BASE (APB1_BUS_BASE + 0x00005C00U) /*!< USBD base address */ +#define USBD_RAM_BASE (APB1_BUS_BASE + 0x00006000U) /*!< USBD RAM base address */ +#define CAN_BASE (APB1_BUS_BASE + 0x00006400U) /*!< CAN base address */ +#define BKP_BASE (APB1_BUS_BASE + 0x00006C00U) /*!< BKP base address */ +#define PMU_BASE (APB1_BUS_BASE + 0x00007000U) /*!< PMU base address */ +#define DAC_BASE (APB1_BUS_BASE + 0x00007400U) /*!< DAC base address */ +#define CTC_BASE (APB1_BUS_BASE + 0x0000C800U) /*!< CTC base address */ + +/* advanced peripheral bus 2 memory map */ +#define AFIO_BASE (APB2_BUS_BASE + 0x00000000U) /*!< AFIO base address */ +#define EXTI_BASE (APB2_BUS_BASE + 0x00000400U) /*!< EXTI base address */ +#define GPIO_BASE (APB2_BUS_BASE + 0x00000800U) /*!< GPIO base address */ +#define ADC_BASE (APB2_BUS_BASE + 0x00002400U) /*!< ADC base address */ + +/* advanced high performance bus 1 memory map */ +#define SDIO_BASE (AHB1_BUS_BASE + 0x00000000U) /*!< SDIO base address */ +#define DMA_BASE (AHB1_BUS_BASE + 0x00008000U) /*!< DMA base address */ +#define RCU_BASE (AHB1_BUS_BASE + 0x00009000U) /*!< RCU base address */ +#define FMC_BASE (AHB1_BUS_BASE + 0x0000A000U) /*!< FMC base address */ +#define CRC_BASE (AHB1_BUS_BASE + 0x0000B000U) /*!< CRC base address */ +#define ENET_BASE (AHB1_BUS_BASE + 0x00010000U) /*!< ENET base address */ +#define USBFS_BASE (AHB1_BUS_BASE + 0x0FFE8000U) /*!< USBFS base address */ + +/* define marco USE_STDPERIPH_DRIVER */ +#if !defined USE_STDPERIPH_DRIVER +#define USE_STDPERIPH_DRIVER +#endif +#ifdef USE_STDPERIPH_DRIVER +#include "gd32f30x_libopt.h" +#endif /* USE_STDPERIPH_DRIVER */ + +#ifdef __cplusplus +} +#endif +#endif diff --git b/Drivers/CMSIS/GD/GD32F30x/Include/system_gd32f30x.h a/Drivers/CMSIS/GD/GD32F30x/Include/system_gd32f30x.h new file mode 100644 index 0000000..69e7366 --- /dev/null +++ a/Drivers/CMSIS/GD/GD32F30x/Include/system_gd32f30x.h @@ -0,0 +1,57 @@ +/*! + \file system_gd32f30x.h + \brief CMSIS Cortex-M4 Device Peripheral Access Layer Header File for + GD32F30x Device Series +*/ + +/* Copyright (c) 2012 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ +/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ + +#ifndef SYSTEM_GD32F30X_H +#define SYSTEM_GD32F30X_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* system clock frequency (core clock) */ +extern uint32_t SystemCoreClock; + +/* function declarations */ +/* initialize the system and update the SystemCoreClock variable */ +extern void SystemInit (void); +/* update the SystemCoreClock with current core clock retrieved from cpu registers */ +extern void SystemCoreClockUpdate (void); + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_GD32F30X_H */ diff --git b/Drivers/CMSIS/GD/GD32F30x/Source/ARM/startup_gd32f30x_cl.s a/Drivers/CMSIS/GD/GD32F30x/Source/ARM/startup_gd32f30x_cl.s new file mode 100644 index 0000000..b274d61 --- /dev/null +++ a/Drivers/CMSIS/GD/GD32F30x/Source/ARM/startup_gd32f30x_cl.s @@ -0,0 +1,385 @@ +;/*! +; \file startup_gd32f30x_cl.s +; \brief start up file +; +; \version 2017-02-10, V1.0.0, firmware for GD32F30x +; \version 2018-10-10, V1.1.0, firmware for GD32F30x +; \version 2018-12-25, V2.0.0, firmware for GD32F30x +; \version 2020-09-30, V2.1.0, firmware for GD32F30x +;*/ +; +;/* +; Copyright (c) 2020, GigaDevice Semiconductor Inc. + +; Redistribution and use in source and binary forms, with or without modification, +;are permitted provided that the following conditions are met: +; +; 1. Redistributions of source code must retain the above copyright notice, this +; list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright notice, +; this list of conditions and the following disclaimer in the documentation +; and/or other materials provided with the distribution. +; 3. Neither the name of the copyright holder nor the names of its contributors +; may be used to endorse or promote products derived from this software without +; specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +;AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +;IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +;INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +;NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +;PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +;ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +;OF SUCH DAMAGE. +;*/ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000400 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +; /* reset Vector Mapped to at Address 0 */ + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + +; /* external interrupts handler */ + DCD WWDGT_IRQHandler ; 16:Window Watchdog Timer + DCD LVD_IRQHandler ; 17:LVD through EXTI Line detect + DCD TAMPER_IRQHandler ; 18:Tamper through EXTI Line detect + DCD RTC_IRQHandler ; 19:RTC through EXTI Line + DCD FMC_IRQHandler ; 20:FMC + DCD RCU_CTC_IRQHandler ; 21:RCU and CTC + DCD EXTI0_IRQHandler ; 22:EXTI Line 0 + DCD EXTI1_IRQHandler ; 23:EXTI Line 1 + DCD EXTI2_IRQHandler ; 24:EXTI Line 2 + DCD EXTI3_IRQHandler ; 25:EXTI Line 3 + DCD EXTI4_IRQHandler ; 26:EXTI Line 4 + DCD DMA0_Channel0_IRQHandler ; 27:DMA0 Channel0 + DCD DMA0_Channel1_IRQHandler ; 28:DMA0 Channel1 + DCD DMA0_Channel2_IRQHandler ; 29:DMA0 Channel2 + DCD DMA0_Channel3_IRQHandler ; 30:DMA0 Channel3 + DCD DMA0_Channel4_IRQHandler ; 31:DMA0 Channel4 + DCD DMA0_Channel5_IRQHandler ; 32:DMA0 Channel5 + DCD DMA0_Channel6_IRQHandler ; 33:DMA0 Channel6 + DCD ADC0_1_IRQHandler ; 34:ADC0 and ADC1 + DCD CAN0_TX_IRQHandler ; 35:CAN0 TX + DCD CAN0_RX0_IRQHandler ; 36:CAN0 RX0 + DCD CAN0_RX1_IRQHandler ; 37:CAN0 RX1 + DCD CAN0_EWMC_IRQHandler ; 38:CAN0 EWMC + DCD EXTI5_9_IRQHandler ; 39:EXTI5 to EXTI9 + DCD TIMER0_BRK_TIMER8_IRQHandler ; 40:TIMER0 Break and TIMER8 + DCD TIMER0_UP_TIMER9_IRQHandler ; 41:TIMER0 Update and TIMER9 + DCD TIMER0_TRG_CMT_TIMER10_IRQHandler ; 42:TIMER0 Trigger and Commutation and TIMER10 + DCD TIMER0_Channel_IRQHandler ; 43:TIMER0 Channel Capture Compare + DCD TIMER1_IRQHandler ; 44:TIMER1 + DCD TIMER2_IRQHandler ; 45:TIMER2 + DCD TIMER3_IRQHandler ; 46:TIMER3 + DCD I2C0_EV_IRQHandler ; 47:I2C0 Event + DCD I2C0_ER_IRQHandler ; 48:I2C0 Error + DCD I2C1_EV_IRQHandler ; 49:I2C1 Event + DCD I2C1_ER_IRQHandler ; 50:I2C1 Error + DCD SPI0_IRQHandler ; 51:SPI0 + DCD SPI1_IRQHandler ; 52:SPI1 + DCD USART0_IRQHandler ; 53:USART0 + DCD USART1_IRQHandler ; 54:USART1 + DCD USART2_IRQHandler ; 55:USART2 + DCD EXTI10_15_IRQHandler ; 56:EXTI10 to EXTI15 + DCD RTC_Alarm_IRQHandler ; 57:RTC Alarm + DCD USBFS_WKUP_IRQHandler ; 58:USBFS Wakeup + DCD TIMER7_BRK_TIMER11_IRQHandler ; 59:TIMER7 Break and TIMER11 + DCD TIMER7_UP_TIMER12_IRQHandler ; 60:TIMER7 Update and TIMER12 + DCD TIMER7_TRG_CMT_TIMER13_IRQHandler ; 61:TIMER7 Trigger and Commutation and TIMER13 + DCD TIMER7_Channel_IRQHandler ; 62:TIMER7 Channel Capture Compare + DCD 0 ; Reserved + DCD EXMC_IRQHandler ; 64:EXMC + DCD 0 ; Reserved + DCD TIMER4_IRQHandler ; 66:TIMER4 + DCD SPI2_IRQHandler ; 67:SPI2 + DCD UART3_IRQHandler ; 68:UART3 + DCD UART4_IRQHandler ; 69:UART4 + DCD TIMER5_IRQHandler ; 70:TIMER5 + DCD TIMER6_IRQHandler ; 71:TIMER6 + DCD DMA1_Channel0_IRQHandler ; 72:DMA1 Channel0 + DCD DMA1_Channel1_IRQHandler ; 73:DMA1 Channel1 + DCD DMA1_Channel2_IRQHandler ; 74:DMA1 Channel2 + DCD DMA1_Channel3_IRQHandler ; 75:DMA1 Channel3 + DCD DMA1_Channel4_IRQHandler ; 76:DMA1 Channel4 + DCD ENET_IRQHandler ; 77:Ethernet + DCD ENET_WKUP_IRQHandler ; 78:Ethernet Wakeup through EXTI Line + DCD CAN1_TX_IRQHandler ; 79:CAN1 TX + DCD CAN1_RX0_IRQHandler ; 80:CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; 81:CAN1 RX1 + DCD CAN1_EWMC_IRQHandler ; 82:CAN1 EWMC + DCD USBFS_IRQHandler ; 83:USBFS + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +;/* reset Handler */ +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +;/* dummy Exception Handlers */ +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler\ + PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler\ + PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC +; /* external interrupts handler */ + EXPORT WWDGT_IRQHandler [WEAK] + EXPORT LVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FMC_IRQHandler [WEAK] + EXPORT RCU_CTC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA0_Channel0_IRQHandler [WEAK] + EXPORT DMA0_Channel1_IRQHandler [WEAK] + EXPORT DMA0_Channel2_IRQHandler [WEAK] + EXPORT DMA0_Channel3_IRQHandler [WEAK] + EXPORT DMA0_Channel4_IRQHandler [WEAK] + EXPORT DMA0_Channel5_IRQHandler [WEAK] + EXPORT DMA0_Channel6_IRQHandler [WEAK] + EXPORT ADC0_1_IRQHandler [WEAK] + EXPORT CAN0_TX_IRQHandler [WEAK] + EXPORT CAN0_RX0_IRQHandler [WEAK] + EXPORT CAN0_RX1_IRQHandler [WEAK] + EXPORT CAN0_EWMC_IRQHandler [WEAK] + EXPORT EXTI5_9_IRQHandler [WEAK] + EXPORT TIMER0_BRK_TIMER8_IRQHandler [WEAK] + EXPORT TIMER0_UP_TIMER9_IRQHandler [WEAK] + EXPORT TIMER0_TRG_CMT_TIMER10_IRQHandler [WEAK] + EXPORT TIMER0_Channel_IRQHandler [WEAK] + EXPORT TIMER1_IRQHandler [WEAK] + EXPORT TIMER2_IRQHandler [WEAK] + EXPORT TIMER3_IRQHandler [WEAK] + EXPORT I2C0_EV_IRQHandler [WEAK] + EXPORT I2C0_ER_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT EXTI10_15_IRQHandler [WEAK] + EXPORT RTC_Alarm_IRQHandler [WEAK] + EXPORT USBFS_WKUP_IRQHandler [WEAK] + EXPORT TIMER7_BRK_TIMER11_IRQHandler [WEAK] + EXPORT TIMER7_UP_TIMER12_IRQHandler [WEAK] + EXPORT TIMER7_TRG_CMT_TIMER13_IRQHandler [WEAK] + EXPORT TIMER7_Channel_IRQHandler [WEAK] + EXPORT EXMC_IRQHandler [WEAK] + EXPORT TIMER4_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT TIMER5_IRQHandler [WEAK] + EXPORT TIMER6_IRQHandler [WEAK] + EXPORT DMA1_Channel0_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT ENET_IRQHandler [WEAK] + EXPORT ENET_WKUP_IRQHandler [WEAK] + EXPORT CAN1_TX_IRQHandler [WEAK] + EXPORT CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_EWMC_IRQHandler [WEAK] + EXPORT USBFS_IRQHandler [WEAK] + +;/* external interrupts handler */ +WWDGT_IRQHandler +LVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FMC_IRQHandler +RCU_CTC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA0_Channel0_IRQHandler +DMA0_Channel1_IRQHandler +DMA0_Channel2_IRQHandler +DMA0_Channel3_IRQHandler +DMA0_Channel4_IRQHandler +DMA0_Channel5_IRQHandler +DMA0_Channel6_IRQHandler +ADC0_1_IRQHandler +CAN0_TX_IRQHandler +CAN0_RX0_IRQHandler +CAN0_RX1_IRQHandler +CAN0_EWMC_IRQHandler +EXTI5_9_IRQHandler +TIMER0_BRK_TIMER8_IRQHandler +TIMER0_UP_TIMER9_IRQHandler +TIMER0_TRG_CMT_TIMER10_IRQHandler +TIMER0_Channel_IRQHandler +TIMER1_IRQHandler +TIMER2_IRQHandler +TIMER3_IRQHandler +I2C0_EV_IRQHandler +I2C0_ER_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +EXTI10_15_IRQHandler +RTC_Alarm_IRQHandler +USBFS_WKUP_IRQHandler +TIMER7_BRK_TIMER11_IRQHandler +TIMER7_UP_TIMER12_IRQHandler +TIMER7_TRG_CMT_TIMER13_IRQHandler +TIMER7_Channel_IRQHandler +EXMC_IRQHandler +TIMER4_IRQHandler +SPI2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +TIMER5_IRQHandler +TIMER6_IRQHandler +DMA1_Channel0_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +ENET_IRQHandler +ENET_WKUP_IRQHandler +CAN1_TX_IRQHandler +CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_EWMC_IRQHandler +USBFS_IRQHandler + + B . + ENDP + + ALIGN + +; user Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + END diff --git b/Drivers/CMSIS/GD/GD32F30x/Source/ARM/startup_gd32f30x_hd.s a/Drivers/CMSIS/GD/GD32F30x/Source/ARM/startup_gd32f30x_hd.s new file mode 100644 index 0000000..66c92af --- /dev/null +++ a/Drivers/CMSIS/GD/GD32F30x/Source/ARM/startup_gd32f30x_hd.s @@ -0,0 +1,365 @@ +;/*! +; \file startup_gd32f30x_hd.s +; \brief start up file +; +; \version 2017-02-10, V1.0.0, firmware for GD32F30x +; \version 2018-10-10, V1.1.0, firmware for GD32F30x +; \version 2018-12-25, V2.0.0, firmware for GD32F30x +; \version 2020-09-30, V2.1.0, firmware for GD32F30x +;*/ +; +;/* +; Copyright (c) 2020, GigaDevice Semiconductor Inc. + +; Redistribution and use in source and binary forms, with or without modification, +;are permitted provided that the following conditions are met: +; +; 1. Redistributions of source code must retain the above copyright notice, this +; list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright notice, +; this list of conditions and the following disclaimer in the documentation +; and/or other materials provided with the distribution. +; 3. Neither the name of the copyright holder nor the names of its contributors +; may be used to endorse or promote products derived from this software without +; specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +;AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +;IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +;INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +;NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +;PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +;ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +;OF SUCH DAMAGE. +;*/ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00001000 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000400 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +; /* reset Vector Mapped to at Address 0 */ + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + +; /* external interrupts handler */ + DCD WWDGT_IRQHandler ; 16:Window Watchdog Timer + DCD LVD_IRQHandler ; 17:LVD through EXTI Line detect + DCD TAMPER_IRQHandler ; 18:Tamper through EXTI Line detect + DCD RTC_IRQHandler ; 19:RTC through EXTI Line + DCD FMC_IRQHandler ; 20:FMC + DCD RCU_CTC_IRQHandler ; 21:RCU and CTC + DCD EXTI0_IRQHandler ; 22:EXTI Line 0 + DCD EXTI1_IRQHandler ; 23:EXTI Line 1 + DCD EXTI2_IRQHandler ; 24:EXTI Line 2 + DCD EXTI3_IRQHandler ; 25:EXTI Line 3 + DCD EXTI4_IRQHandler ; 26:EXTI Line 4 + DCD DMA0_Channel0_IRQHandler ; 27:DMA0 Channel0 + DCD DMA0_Channel1_IRQHandler ; 28:DMA0 Channel1 + DCD DMA0_Channel2_IRQHandler ; 29:DMA0 Channel2 + DCD DMA0_Channel3_IRQHandler ; 30:DMA0 Channel3 + DCD DMA0_Channel4_IRQHandler ; 31:DMA0 Channel4 + DCD DMA0_Channel5_IRQHandler ; 32:DMA0 Channel5 + DCD DMA0_Channel6_IRQHandler ; 33:DMA0 Channel6 + DCD ADC0_1_IRQHandler ; 34:ADC0 and ADC1 + DCD USBD_HP_CAN0_TX_IRQHandler ; 35:USBD HP and CAN0 TX + DCD USBD_LP_CAN0_RX0_IRQHandler ; 36:USBD LP and CAN0 RX0 + DCD CAN0_RX1_IRQHandler ; 37:CAN0 RX1 + DCD CAN0_EWMC_IRQHandler ; 38:CAN0 EWMC + DCD EXTI5_9_IRQHandler ; 39:EXTI5 to EXTI9 + DCD TIMER0_BRK_IRQHandler ; 40:TIMER0 Break + DCD TIMER0_UP_IRQHandler ; 41:TIMER0 Update + DCD TIMER0_TRG_CMT_IRQHandler ; 42:TIMER0 Trigger and Commutation + DCD TIMER0_Channel_IRQHandler ; 43:TIMER0 Channel Capture Compare + DCD TIMER1_IRQHandler ; 44:TIMER1 + DCD TIMER2_IRQHandler ; 45:TIMER2 + DCD TIMER3_IRQHandler ; 46:TIMER3 + DCD I2C0_EV_IRQHandler ; 47:I2C0 Event + DCD I2C0_ER_IRQHandler ; 48:I2C0 Error + DCD I2C1_EV_IRQHandler ; 49:I2C1 Event + DCD I2C1_ER_IRQHandler ; 50:I2C1 Error + DCD SPI0_IRQHandler ; 51:SPI0 + DCD SPI1_IRQHandler ; 52:SPI1 + DCD USART0_IRQHandler ; 53:USART0 + DCD USART1_IRQHandler ; 54:USART1 + DCD USART2_IRQHandler ; 55:USART2 + DCD EXTI10_15_IRQHandler ; 56:EXTI10 to EXTI15 + DCD RTC_Alarm_IRQHandler ; 57:RTC Alarm + DCD USBD_WKUP_IRQHandler ; 58:USBD Wakeup + DCD TIMER7_BRK_IRQHandler ; 59:TIMER7 Break + DCD TIMER7_UP_IRQHandler ; 60:TIMER7 Update + DCD TIMER7_TRG_CMT_IRQHandler ; 61:TIMER7 Trigger and Commutation + DCD TIMER7_Channel_IRQHandler ; 62:TIMER7 Channel Capture Compare + DCD ADC2_IRQHandler ; 63:ADC2 + DCD EXMC_IRQHandler ; 64:EXMC + DCD SDIO_IRQHandler ; 65:SDIO + DCD TIMER4_IRQHandler ; 66:TIMER4 + DCD SPI2_IRQHandler ; 67:SPI2 + DCD UART3_IRQHandler ; 68:UART3 + DCD UART4_IRQHandler ; 69:UART4 + DCD TIMER5_IRQHandler ; 70:TIMER5 + DCD TIMER6_IRQHandler ; 71:TIMER6 + DCD DMA1_Channel0_IRQHandler ; 72:DMA1 Channel0 + DCD DMA1_Channel1_IRQHandler ; 73:DMA1 Channel1 + DCD DMA1_Channel2_IRQHandler ; 74:DMA1 Channel2 + DCD DMA1_Channel3_4_IRQHandler ; 75:DMA1 Channel3 and Channel4 + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +;/* reset Handler */ +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +;/* dummy Exception Handlers */ +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler\ + PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler\ + PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC +; /* external interrupts handler */ + EXPORT WWDGT_IRQHandler [WEAK] + EXPORT LVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FMC_IRQHandler [WEAK] + EXPORT RCU_CTC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA0_Channel0_IRQHandler [WEAK] + EXPORT DMA0_Channel1_IRQHandler [WEAK] + EXPORT DMA0_Channel2_IRQHandler [WEAK] + EXPORT DMA0_Channel3_IRQHandler [WEAK] + EXPORT DMA0_Channel4_IRQHandler [WEAK] + EXPORT DMA0_Channel5_IRQHandler [WEAK] + EXPORT DMA0_Channel6_IRQHandler [WEAK] + EXPORT ADC0_1_IRQHandler [WEAK] + EXPORT USBD_HP_CAN0_TX_IRQHandler [WEAK] + EXPORT USBD_LP_CAN0_RX0_IRQHandler [WEAK] + EXPORT CAN0_RX1_IRQHandler [WEAK] + EXPORT CAN0_EWMC_IRQHandler [WEAK] + EXPORT EXTI5_9_IRQHandler [WEAK] + EXPORT TIMER0_BRK_IRQHandler [WEAK] + EXPORT TIMER0_UP_IRQHandler [WEAK] + EXPORT TIMER0_TRG_CMT_IRQHandler [WEAK] + EXPORT TIMER0_Channel_IRQHandler [WEAK] + EXPORT TIMER1_IRQHandler [WEAK] + EXPORT TIMER2_IRQHandler [WEAK] + EXPORT TIMER3_IRQHandler [WEAK] + EXPORT I2C0_EV_IRQHandler [WEAK] + EXPORT I2C0_ER_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT EXTI10_15_IRQHandler [WEAK] + EXPORT RTC_Alarm_IRQHandler [WEAK] + EXPORT USBD_WKUP_IRQHandler [WEAK] + EXPORT TIMER7_BRK_IRQHandler [WEAK] + EXPORT TIMER7_UP_IRQHandler [WEAK] + EXPORT TIMER7_TRG_CMT_IRQHandler [WEAK] + EXPORT TIMER7_Channel_IRQHandler [WEAK] + EXPORT ADC2_IRQHandler [WEAK] + EXPORT EXMC_IRQHandler [WEAK] + EXPORT SDIO_IRQHandler [WEAK] + EXPORT TIMER4_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT TIMER5_IRQHandler [WEAK] + EXPORT TIMER6_IRQHandler [WEAK] + EXPORT DMA1_Channel0_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_4_IRQHandler [WEAK] + +;/* external interrupts handler */ +WWDGT_IRQHandler +LVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FMC_IRQHandler +RCU_CTC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA0_Channel0_IRQHandler +DMA0_Channel1_IRQHandler +DMA0_Channel2_IRQHandler +DMA0_Channel3_IRQHandler +DMA0_Channel4_IRQHandler +DMA0_Channel5_IRQHandler +DMA0_Channel6_IRQHandler +ADC0_1_IRQHandler +USBD_HP_CAN0_TX_IRQHandler +USBD_LP_CAN0_RX0_IRQHandler +CAN0_RX1_IRQHandler +CAN0_EWMC_IRQHandler +EXTI5_9_IRQHandler +TIMER0_BRK_IRQHandler +TIMER0_UP_IRQHandler +TIMER0_TRG_CMT_IRQHandler +TIMER0_Channel_IRQHandler +TIMER1_IRQHandler +TIMER2_IRQHandler +TIMER3_IRQHandler +I2C0_EV_IRQHandler +I2C0_ER_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +EXTI10_15_IRQHandler +RTC_Alarm_IRQHandler +USBD_WKUP_IRQHandler +TIMER7_BRK_IRQHandler +TIMER7_UP_IRQHandler +TIMER7_TRG_CMT_IRQHandler +TIMER7_Channel_IRQHandler +ADC2_IRQHandler +EXMC_IRQHandler +SDIO_IRQHandler +TIMER4_IRQHandler +SPI2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +TIMER5_IRQHandler +TIMER6_IRQHandler +DMA1_Channel0_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_4_IRQHandler + + B . + ENDP + + ALIGN + +; user Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + END diff --git b/Drivers/CMSIS/GD/GD32F30x/Source/ARM/startup_gd32f30x_xd.s a/Drivers/CMSIS/GD/GD32F30x/Source/ARM/startup_gd32f30x_xd.s new file mode 100644 index 0000000..4475675 --- /dev/null +++ a/Drivers/CMSIS/GD/GD32F30x/Source/ARM/startup_gd32f30x_xd.s @@ -0,0 +1,365 @@ +;/*! +; \file startup_gd32f30x_xd.s +; \brief start up file +; +; \version 2017-02-10, V1.0.0, firmware for GD32F30x +; \version 2018-10-10, V1.1.0, firmware for GD32F30x +; \version 2018-12-25, V2.0.0, firmware for GD32F30x +; \version 2020-09-30, V2.1.0, firmware for GD32F30x +;*/ +; +;/* +; Copyright (c) 2020, GigaDevice Semiconductor Inc. + +; Redistribution and use in source and binary forms, with or without modification, +;are permitted provided that the following conditions are met: +; +; 1. Redistributions of source code must retain the above copyright notice, this +; list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright notice, +; this list of conditions and the following disclaimer in the documentation +; and/or other materials provided with the distribution. +; 3. Neither the name of the copyright holder nor the names of its contributors +; may be used to endorse or promote products derived from this software without +; specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +;AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +;IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +;INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +;NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +;PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +;ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +;OF SUCH DAMAGE. +;*/ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x00000400 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x00000400 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + +; /* reset Vector Mapped to at Address 0 */ + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + +; /* external interrupts handler */ + DCD WWDGT_IRQHandler ; 16:Window Watchdog Timer + DCD LVD_IRQHandler ; 17:LVD through EXTI Line detect + DCD TAMPER_IRQHandler ; 18:Tamper through EXTI Line detect + DCD RTC_IRQHandler ; 19:RTC through EXTI Line + DCD FMC_IRQHandler ; 20:FMC + DCD RCU_CTC_IRQHandler ; 21:RCU and CTC + DCD EXTI0_IRQHandler ; 22:EXTI Line 0 + DCD EXTI1_IRQHandler ; 23:EXTI Line 1 + DCD EXTI2_IRQHandler ; 24:EXTI Line 2 + DCD EXTI3_IRQHandler ; 25:EXTI Line 3 + DCD EXTI4_IRQHandler ; 26:EXTI Line 4 + DCD DMA0_Channel0_IRQHandler ; 27:DMA0 Channel0 + DCD DMA0_Channel1_IRQHandler ; 28:DMA0 Channel1 + DCD DMA0_Channel2_IRQHandler ; 29:DMA0 Channel2 + DCD DMA0_Channel3_IRQHandler ; 30:DMA0 Channel3 + DCD DMA0_Channel4_IRQHandler ; 31:DMA0 Channel4 + DCD DMA0_Channel5_IRQHandler ; 32:DMA0 Channel5 + DCD DMA0_Channel6_IRQHandler ; 33:DMA0 Channel6 + DCD ADC0_1_IRQHandler ; 34:ADC0 and ADC1 + DCD USBD_HP_CAN0_TX_IRQHandler ; 35:USBD HP and CAN0 TX + DCD USBD_LP_CAN0_RX0_IRQHandler ; 36:USBD LP and CAN0 RX0 + DCD CAN0_RX1_IRQHandler ; 37:CAN0 RX1 + DCD CAN0_EWMC_IRQHandler ; 38:CAN0 EWMC + DCD EXTI5_9_IRQHandler ; 39:EXTI5 to EXTI9 + DCD TIMER0_BRK_TIMER8_IRQHandler ; 40:TIMER0 Break and TIMER8 + DCD TIMER0_UP_TIMER9_IRQHandler ; 41:TIMER0 Update and TIMER9 + DCD TIMER0_TRG_CMT_TIMER10_IRQHandler ; 42:TIMER0 Trigger and Commutation and TIMER10 + DCD TIMER0_Channel_IRQHandler ; 43:TIMER0 Channel Capture Compare + DCD TIMER1_IRQHandler ; 44:TIMER1 + DCD TIMER2_IRQHandler ; 45:TIMER2 + DCD TIMER3_IRQHandler ; 46:TIMER3 + DCD I2C0_EV_IRQHandler ; 47:I2C0 Event + DCD I2C0_ER_IRQHandler ; 48:I2C0 Error + DCD I2C1_EV_IRQHandler ; 49:I2C1 Event + DCD I2C1_ER_IRQHandler ; 50:I2C1 Error + DCD SPI0_IRQHandler ; 51:SPI0 + DCD SPI1_IRQHandler ; 52:SPI1 + DCD USART0_IRQHandler ; 53:USART0 + DCD USART1_IRQHandler ; 54:USART1 + DCD USART2_IRQHandler ; 55:USART2 + DCD EXTI10_15_IRQHandler ; 56:EXTI10 to EXTI15 + DCD RTC_Alarm_IRQHandler ; 57:RTC Alarm + DCD USBD_WKUP_IRQHandler ; 58:USBD Wakeup + DCD TIMER7_BRK_TIMER11_IRQHandler ; 59:TIMER7 Break and TIMER11 + DCD TIMER7_UP_TIMER12_IRQHandler ; 60:TIMER7 Update and TIMER12 + DCD TIMER7_TRG_CMT_TIMER13_IRQHandler ; 61:TIMER7 Trigger and Commutation and TIMER13 + DCD TIMER7_Channel_IRQHandler ; 62:TIMER7 Channel Capture Compare + DCD ADC2_IRQHandler ; 63:ADC2 + DCD EXMC_IRQHandler ; 64:EXMC + DCD SDIO_IRQHandler ; 65:SDIO + DCD TIMER4_IRQHandler ; 66:TIMER4 + DCD SPI2_IRQHandler ; 67:SPI2 + DCD UART3_IRQHandler ; 68:UART3 + DCD UART4_IRQHandler ; 69:UART4 + DCD TIMER5_IRQHandler ; 70:TIMER5 + DCD TIMER6_IRQHandler ; 71:TIMER6 + DCD DMA1_Channel0_IRQHandler ; 72:DMA1 Channel0 + DCD DMA1_Channel1_IRQHandler ; 73:DMA1 Channel1 + DCD DMA1_Channel2_IRQHandler ; 74:DMA1 Channel2 + DCD DMA1_Channel3_4_IRQHandler ; 75:DMA1 Channel3 and Channel4 + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +;/* reset Handler */ +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +;/* dummy Exception Handlers */ +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler\ + PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler\ + PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC +; /* external interrupts handler */ + EXPORT WWDGT_IRQHandler [WEAK] + EXPORT LVD_IRQHandler [WEAK] + EXPORT TAMPER_IRQHandler [WEAK] + EXPORT RTC_IRQHandler [WEAK] + EXPORT FMC_IRQHandler [WEAK] + EXPORT RCU_CTC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA0_Channel0_IRQHandler [WEAK] + EXPORT DMA0_Channel1_IRQHandler [WEAK] + EXPORT DMA0_Channel2_IRQHandler [WEAK] + EXPORT DMA0_Channel3_IRQHandler [WEAK] + EXPORT DMA0_Channel4_IRQHandler [WEAK] + EXPORT DMA0_Channel5_IRQHandler [WEAK] + EXPORT DMA0_Channel6_IRQHandler [WEAK] + EXPORT ADC0_1_IRQHandler [WEAK] + EXPORT USBD_HP_CAN0_TX_IRQHandler [WEAK] + EXPORT USBD_LP_CAN0_RX0_IRQHandler [WEAK] + EXPORT CAN0_RX1_IRQHandler [WEAK] + EXPORT CAN0_EWMC_IRQHandler [WEAK] + EXPORT EXTI5_9_IRQHandler [WEAK] + EXPORT TIMER0_BRK_TIMER8_IRQHandler [WEAK] + EXPORT TIMER0_UP_TIMER9_IRQHandler [WEAK] + EXPORT TIMER0_TRG_CMT_TIMER10_IRQHandler [WEAK] + EXPORT TIMER0_Channel_IRQHandler [WEAK] + EXPORT TIMER1_IRQHandler [WEAK] + EXPORT TIMER2_IRQHandler [WEAK] + EXPORT TIMER3_IRQHandler [WEAK] + EXPORT I2C0_EV_IRQHandler [WEAK] + EXPORT I2C0_ER_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT SPI0_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT USART0_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT EXTI10_15_IRQHandler [WEAK] + EXPORT RTC_Alarm_IRQHandler [WEAK] + EXPORT USBD_WKUP_IRQHandler [WEAK] + EXPORT TIMER7_BRK_TIMER11_IRQHandler [WEAK] + EXPORT TIMER7_UP_TIMER12_IRQHandler [WEAK] + EXPORT TIMER7_TRG_CMT_TIMER13_IRQHandler [WEAK] + EXPORT TIMER7_Channel_IRQHandler [WEAK] + EXPORT ADC2_IRQHandler [WEAK] + EXPORT EXMC_IRQHandler [WEAK] + EXPORT SDIO_IRQHandler [WEAK] + EXPORT TIMER4_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT UART3_IRQHandler [WEAK] + EXPORT UART4_IRQHandler [WEAK] + EXPORT TIMER5_IRQHandler [WEAK] + EXPORT TIMER6_IRQHandler [WEAK] + EXPORT DMA1_Channel0_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_4_IRQHandler [WEAK] + +;/* external interrupts handler */ +WWDGT_IRQHandler +LVD_IRQHandler +TAMPER_IRQHandler +RTC_IRQHandler +FMC_IRQHandler +RCU_CTC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA0_Channel0_IRQHandler +DMA0_Channel1_IRQHandler +DMA0_Channel2_IRQHandler +DMA0_Channel3_IRQHandler +DMA0_Channel4_IRQHandler +DMA0_Channel5_IRQHandler +DMA0_Channel6_IRQHandler +ADC0_1_IRQHandler +USBD_HP_CAN0_TX_IRQHandler +USBD_LP_CAN0_RX0_IRQHandler +CAN0_RX1_IRQHandler +CAN0_EWMC_IRQHandler +EXTI5_9_IRQHandler +TIMER0_BRK_TIMER8_IRQHandler +TIMER0_UP_TIMER9_IRQHandler +TIMER0_TRG_CMT_TIMER10_IRQHandler +TIMER0_Channel_IRQHandler +TIMER1_IRQHandler +TIMER2_IRQHandler +TIMER3_IRQHandler +I2C0_EV_IRQHandler +I2C0_ER_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +SPI0_IRQHandler +SPI1_IRQHandler +USART0_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +EXTI10_15_IRQHandler +RTC_Alarm_IRQHandler +USBD_WKUP_IRQHandler +TIMER7_BRK_TIMER11_IRQHandler +TIMER7_UP_TIMER12_IRQHandler +TIMER7_TRG_CMT_TIMER13_IRQHandler +TIMER7_Channel_IRQHandler +ADC2_IRQHandler +EXMC_IRQHandler +SDIO_IRQHandler +TIMER4_IRQHandler +SPI2_IRQHandler +UART3_IRQHandler +UART4_IRQHandler +TIMER5_IRQHandler +TIMER6_IRQHandler +DMA1_Channel0_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_4_IRQHandler + + B . + ENDP + + ALIGN + +; user Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + END diff --git b/Drivers/CMSIS/GD/GD32F30x/Source/IAR/startup_gd32f30x_cl.s a/Drivers/CMSIS/GD/GD32F30x/Source/IAR/startup_gd32f30x_cl.s new file mode 100644 index 0000000..4e1fd63 --- /dev/null +++ a/Drivers/CMSIS/GD/GD32F30x/Source/IAR/startup_gd32f30x_cl.s @@ -0,0 +1,525 @@ +;/*! +; \file startup_gd32f30x_cl.s +; \brief start up file +; +; \version 2018-10-10, V1.1.0, firmware for GD32F30x +; \version 2020-09-30, V2.1.0, firmware for GD32F30x +;*/ +; +;/* +; Copyright (c) 2020, GigaDevice Semiconductor Inc. + +; Redistribution and use in source and binary forms, with or without modification, +;are permitted provided that the following conditions are met: +; +; 1. Redistributions of source code must retain the above copyright notice, this +; list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright notice, +; this list of conditions and the following disclaimer in the documentation +; and/or other materials provided with the distribution. +; 3. Neither the name of the copyright holder nor the names of its contributors +; may be used to endorse or promote products derived from this software without +; specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +;AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +;IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +;INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +;NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +;PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +;ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +;OF SUCH DAMAGE. +;*/ + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) ; top of stack + DCD Reset_Handler ; Vector Number 1,Reset Handler + + DCD NMI_Handler ; Vector Number 2,NMI Handler + DCD HardFault_Handler ; Vector Number 3,Hard Fault Handler + DCD MemManage_Handler ; Vector Number 4,MPU Fault Handler + DCD BusFault_Handler ; Vector Number 5,Bus Fault Handler + DCD UsageFault_Handler ; Vector Number 6,Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; Vector Number 11,SVCall Handler + DCD DebugMon_Handler ; Vector Number 12,Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; Vector Number 14,PendSV Handler + DCD SysTick_Handler ; Vector Number 15,SysTick Handler + + ; External Interrupts + DCD WWDGT_IRQHandler ; 16:Window Watchdog Timer + DCD LVD_IRQHandler ; 17:LVD through EXTI Line detect + DCD TAMPER_IRQHandler ; 18:Tamper through EXTI Line detect + DCD RTC_IRQHandler ; 19:RTC through EXTI Line + DCD FMC_IRQHandler ; 20:FMC + DCD RCU_CTC_IRQHandler ; 21:RCU and CTC + DCD EXTI0_IRQHandler ; 22:EXTI Line 0 + DCD EXTI1_IRQHandler ; 23:EXTI Line 1 + DCD EXTI2_IRQHandler ; 24:EXTI Line 2 + DCD EXTI3_IRQHandler ; 25:EXTI Line 3 + DCD EXTI4_IRQHandler ; 26:EXTI Line 4 + DCD DMA0_Channel0_IRQHandler ; 27:DMA0 Channel0 + DCD DMA0_Channel1_IRQHandler ; 28:DMA0 Channel1 + DCD DMA0_Channel2_IRQHandler ; 29:DMA0 Channel2 + DCD DMA0_Channel3_IRQHandler ; 30:DMA0 Channel3 + DCD DMA0_Channel4_IRQHandler ; 31:DMA0 Channel4 + DCD DMA0_Channel5_IRQHandler ; 32:DMA0 Channel5 + DCD DMA0_Channel6_IRQHandler ; 33:DMA0 Channel6 + DCD ADC0_1_IRQHandler ; 34:ADC0 and ADC1 + DCD CAN0_TX_IRQHandler ; 35:CAN0 TX + DCD CAN0_RX0_IRQHandler ; 36:CAN0 RX0 + DCD CAN0_RX1_IRQHandler ; 37:CAN0 RX1 + DCD CAN0_EWMC_IRQHandler ; 38:CAN0 EWMC + DCD EXTI5_9_IRQHandler ; 39:EXTI5 to EXTI9 + DCD TIMER0_BRK_TIMER8_IRQHandler ; 40:TIMER0 Break and TIMER8 + DCD TIMER0_UP_TIMER9_IRQHandler ; 41:TIMER0 Update and TIMER9 + DCD TIMER0_TRG_CMT_TIMER10_IRQHandler ; 42:TIMER0 Trigger and Commucation and TIMER10 + DCD TIMER0_Channel_IRQHandler ; 43:TIMER0 Channel Capture Compare + DCD TIMER1_IRQHandler ; 44:TIMER1 + DCD TIMER2_IRQHandler ; 45:TIMER2 + DCD TIMER3_IRQHandler ; 46:TIMER3 + DCD I2C0_EV_IRQHandler ; 47:I2C0 Event + DCD I2C0_ER_IRQHandler ; 48:I2C0 Error + DCD I2C1_EV_IRQHandler ; 49:I2C1 Event + DCD I2C1_ER_IRQHandler ; 50:I2C1 Error + DCD SPI0_IRQHandler ; 51:SPI0 + DCD SPI1_IRQHandler ; 52:SPI1 + DCD USART0_IRQHandler ; 53:USART0 + DCD USART1_IRQHandler ; 54:USART1 + DCD USART2_IRQHandler ; 55:USART2 + DCD EXTI10_15_IRQHandler ; 56:EXTI10 to EXTI15 + DCD RTC_Alarm_IRQHandler ; 57:RTC Alarm + DCD USBFS_WKUP_IRQHandler ; 58:USBFS Wakeup + DCD TIMER7_BRK_TIMER11_IRQHandler ; 59:TIMER7 Break and TIMER11 + DCD TIMER7_UP_TIMER12_IRQHandler ; 60:TIMER7 Update and TIMER12 + DCD TIMER7_TRG_CMT_TIMER13_IRQHandler ; 61:TIMER7 Trigger and Commucation and TIMER13 + DCD TIMER7_Channel_IRQHandler ; 62:TIMER7 Channel Capture Compare + DCD 0 ; 63:Reserved + DCD EXMC_IRQHandler ; 64:EXMC + DCD 0 ; 65:Reserved + DCD TIMER4_IRQHandler ; 66:TIMER4 + DCD SPI2_IRQHandler ; 67:SPI2 + DCD UART3_IRQHandler ; 68:UART3 + DCD UART4_IRQHandler ; 69:UART4 + DCD TIMER5_IRQHandler ; 70:TIMER5 + DCD TIMER6_IRQHandler ; 71:TIMER6 + DCD DMA1_Channel0_IRQHandler ; 72:DMA1 Channel0 + DCD DMA1_Channel1_IRQHandler ; 73:DMA1 Channel1 + DCD DMA1_Channel2_IRQHandler ; 74:DMA1 Channel2 + DCD DMA1_Channel3_IRQHandler ; 75:DMA1 Channel3 + DCD DMA1_Channel4_IRQHandler ; 76:DMA1 Channel4 + DCD ENET_IRQHandler ; 77:Ethernet + DCD ENET_WKUP_IRQHandler ; 78:Ethernet Wakeup through EXTI Line + DCD CAN1_TX_IRQHandler ; 79:CAN1 TX + DCD CAN1_RX0_IRQHandler ; 80:CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; 81:CAN1 RX1 + DCD CAN1_EWMC_IRQHandler ; 82:CAN1 EWMC + DCD USBFS_IRQHandler ; 83:USBFS + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:NOROOT:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDGT_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +WWDGT_IRQHandler + B WWDGT_IRQHandler + + PUBWEAK LVD_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +LVD_IRQHandler + B LVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +FMC_IRQHandler + B FMC_IRQHandler + + PUBWEAK RCU_CTC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RCU_CTC_IRQHandler + B RCU_CTC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA0_Channel0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel0_IRQHandler + B DMA0_Channel0_IRQHandler + + PUBWEAK DMA0_Channel1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel1_IRQHandler + B DMA0_Channel1_IRQHandler + + PUBWEAK DMA0_Channel2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel2_IRQHandler + B DMA0_Channel2_IRQHandler + + PUBWEAK DMA0_Channel3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel3_IRQHandler + B DMA0_Channel3_IRQHandler + + PUBWEAK DMA0_Channel4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel4_IRQHandler + B DMA0_Channel4_IRQHandler + + PUBWEAK DMA0_Channel5_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel5_IRQHandler + B DMA0_Channel5_IRQHandler + + PUBWEAK DMA0_Channel6_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel6_IRQHandler + B DMA0_Channel6_IRQHandler + + PUBWEAK ADC0_1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ADC0_1_IRQHandler + B ADC0_1_IRQHandler + + PUBWEAK CAN0_TX_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_TX_IRQHandler + B CAN0_TX_IRQHandler + + PUBWEAK CAN0_RX0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_RX0_IRQHandler + B CAN0_RX0_IRQHandler + + PUBWEAK CAN0_RX1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_RX1_IRQHandler + B CAN0_RX1_IRQHandler + + PUBWEAK CAN0_EWMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_EWMC_IRQHandler + B CAN0_EWMC_IRQHandler + + PUBWEAK EXTI5_9_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI5_9_IRQHandler + B EXTI5_9_IRQHandler + + PUBWEAK TIMER0_BRK_TIMER8_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_BRK_TIMER8_IRQHandler + B TIMER0_BRK_TIMER8_IRQHandler + + PUBWEAK TIMER0_UP_TIMER9_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_UP_TIMER9_IRQHandler + B TIMER0_UP_TIMER9_IRQHandler + + PUBWEAK TIMER0_TRG_CMT_TIMER10_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_TRG_CMT_TIMER10_IRQHandler + B TIMER0_TRG_CMT_TIMER10_IRQHandler + + PUBWEAK TIMER0_Channel_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_Channel_IRQHandler + B TIMER0_Channel_IRQHandler + + PUBWEAK TIMER1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER1_IRQHandler + B TIMER1_IRQHandler + + PUBWEAK TIMER2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER2_IRQHandler + B TIMER2_IRQHandler + + PUBWEAK TIMER3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER3_IRQHandler + B TIMER3_IRQHandler + + PUBWEAK I2C0_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C0_EV_IRQHandler + B I2C0_EV_IRQHandler + + PUBWEAK I2C0_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C0_ER_IRQHandler + B I2C0_ER_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK SPI0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI0_IRQHandler + B SPI0_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK USART0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART0_IRQHandler + B USART0_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK EXTI10_15_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI10_15_IRQHandler + B EXTI10_15_IRQHandler + + PUBWEAK RTC_Alarm_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RTC_Alarm_IRQHandler + B RTC_Alarm_IRQHandler + + PUBWEAK USBFS_WKUP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBFS_WKUP_IRQHandler + B USBFS_WKUP_IRQHandler + + PUBWEAK TIMER7_BRK_TIMER11_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_BRK_TIMER11_IRQHandler + B TIMER7_BRK_TIMER11_IRQHandler + + PUBWEAK TIMER7_UP_TIMER12_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_UP_TIMER12_IRQHandler + B TIMER7_UP_TIMER12_IRQHandler + + PUBWEAK TIMER7_TRG_CMT_TIMER13_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_TRG_CMT_TIMER13_IRQHandler + B TIMER7_TRG_CMT_TIMER13_IRQHandler + + PUBWEAK TIMER7_Channel_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_Channel_IRQHandler + B TIMER7_Channel_IRQHandler + + PUBWEAK EXMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXMC_IRQHandler + B EXMC_IRQHandler + + PUBWEAK TIMER4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER4_IRQHandler + B TIMER4_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK UART3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART3_IRQHandler + B UART3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK TIMER5_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER5_IRQHandler + B TIMER5_IRQHandler + + PUBWEAK TIMER6_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER6_IRQHandler + B TIMER6_IRQHandler + + PUBWEAK DMA1_Channel0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel0_IRQHandler + B DMA1_Channel0_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK ENET_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ENET_IRQHandler + B ENET_IRQHandler + + PUBWEAK ENET_WKUP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ENET_WKUP_IRQHandler + B ENET_WKUP_IRQHandler + + PUBWEAK CAN1_TX_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN1_TX_IRQHandler + B CAN1_TX_IRQHandler + + PUBWEAK CAN1_RX0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN1_RX0_IRQHandler + B CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_EWMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN1_EWMC_IRQHandler + B CAN1_EWMC_IRQHandler + + PUBWEAK USBFS_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBFS_IRQHandler + B USBFS_IRQHandler + END \ No newline at end of file diff --git b/Drivers/CMSIS/GD/GD32F30x/Source/IAR/startup_gd32f30x_hd.s a/Drivers/CMSIS/GD/GD32F30x/Source/IAR/startup_gd32f30x_hd.s new file mode 100644 index 0000000..71b952f --- /dev/null +++ a/Drivers/CMSIS/GD/GD32F30x/Source/IAR/startup_gd32f30x_hd.s @@ -0,0 +1,487 @@ +;/*! +; \file startup_gd32f30x_hd.s +; \brief start up file +; +; \version 2018-10-10, V1.1.0, firmware for GD32F30x +; \version 2020-09-30, V2.1.0, firmware for GD32F30x +;*/ +; +;/* +; Copyright (c) 2020, GigaDevice Semiconductor Inc. + +; Redistribution and use in source and binary forms, with or without modification, +;are permitted provided that the following conditions are met: +; +; 1. Redistributions of source code must retain the above copyright notice, this +; list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright notice, +; this list of conditions and the following disclaimer in the documentation +; and/or other materials provided with the distribution. +; 3. Neither the name of the copyright holder nor the names of its contributors +; may be used to endorse or promote products derived from this software without +; specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +;AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +;IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +;INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +;NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +;PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +;ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +;OF SUCH DAMAGE. +;*/ + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) ; top of stack + DCD Reset_Handler ; Vector Number 1,Reset Handler + + DCD NMI_Handler ; Vector Number 2,NMI Handler + DCD HardFault_Handler ; Vector Number 3,Hard Fault Handler + DCD MemManage_Handler ; Vector Number 4,MPU Fault Handler + DCD BusFault_Handler ; Vector Number 5,Bus Fault Handler + DCD UsageFault_Handler ; Vector Number 6,Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; Vector Number 11,SVCall Handler + DCD DebugMon_Handler ; Vector Number 12,Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; Vector Number 14,PendSV Handler + DCD SysTick_Handler ; Vector Number 15,SysTick Handler + + ; External Interrupts + DCD WWDGT_IRQHandler ; 16:Window Watchdog Timer + DCD LVD_IRQHandler ; 17:LVD through EXTI Line detect + DCD TAMPER_IRQHandler ; 18:Tamper through EXTI Line detect + DCD RTC_IRQHandler ; 19:RTC through EXTI Line + DCD FMC_IRQHandler ; 20:FMC + DCD RCU_CTC_IRQHandler ; 21:RCU and CTC + DCD EXTI0_IRQHandler ; 22:EXTI Line 0 + DCD EXTI1_IRQHandler ; 23:EXTI Line 1 + DCD EXTI2_IRQHandler ; 24:EXTI Line 2 + DCD EXTI3_IRQHandler ; 25:EXTI Line 3 + DCD EXTI4_IRQHandler ; 26:EXTI Line 4 + DCD DMA0_Channel0_IRQHandler ; 27:DMA0 Channel0 + DCD DMA0_Channel1_IRQHandler ; 28:DMA0 Channel1 + DCD DMA0_Channel2_IRQHandler ; 29:DMA0 Channel2 + DCD DMA0_Channel3_IRQHandler ; 30:DMA0 Channel3 + DCD DMA0_Channel4_IRQHandler ; 31:DMA0 Channel4 + DCD DMA0_Channel5_IRQHandler ; 32:DMA0 Channel5 + DCD DMA0_Channel6_IRQHandler ; 33:DMA0 Channel6 + DCD ADC0_1_IRQHandler ; 34:ADC0 and ADC1 + DCD USBD_HP_CAN0_TX_IRQHandler ; 35:USBD HP and CAN0 TX + DCD USBD_LP_CAN0_RX0_IRQHandler ; 36:USBD LP and CAN0 RX0 + DCD CAN0_RX1_IRQHandler ; 37:CAN0 RX1 + DCD CAN0_EWMC_IRQHandler ; 38:CAN0 EWMC + DCD EXTI5_9_IRQHandler ; 39:EXTI5 to EXTI9 + DCD TIMER0_BRK_IRQHandler ; 40:TIMER0 Break + DCD TIMER0_UP_IRQHandler ; 41:TIMER0 Update + DCD TIMER0_TRG_CMT_IRQHandler ; 42:TIMER0 Trigger and Commucation + DCD TIMER0_Channel_IRQHandler ; 43:TIMER0 Channel Capture Compare + DCD TIMER1_IRQHandler ; 44:TIMER1 + DCD TIMER2_IRQHandler ; 45:TIMER2 + DCD TIMER3_IRQHandler ; 46:TIMER3 + DCD I2C0_EV_IRQHandler ; 47:I2C0 Event + DCD I2C0_ER_IRQHandler ; 48:I2C0 Error + DCD I2C1_EV_IRQHandler ; 49:I2C1 Event + DCD I2C1_ER_IRQHandler ; 50:I2C1 Error + DCD SPI0_IRQHandler ; 51:SPI0 + DCD SPI1_IRQHandler ; 52:SPI1 + DCD USART0_IRQHandler ; 53:USART0 + DCD USART1_IRQHandler ; 54:USART1 + DCD USART2_IRQHandler ; 55:USART2 + DCD EXTI10_15_IRQHandler ; 56:EXTI10 to EXTI15 + DCD RTC_Alarm_IRQHandler ; 57:RTC Alarm + DCD USBD_WKUP_IRQHandler ; 58:USBD Wakeup + DCD TIMER7_BRK_IRQHandler ; 59:TIMER7 Break + DCD TIMER7_UP_IRQHandler ; 60:TIMER7 Update + DCD TIMER7_TRG_CMT_IRQHandler ; 61:TIMER7 Trigger and Commucation + DCD TIMER7_Channel_IRQHandler ; 62:TIMER7 Channel Capture Compare + DCD ADC2_IRQHandler ; 63:ADC2 + DCD EXMC_IRQHandler ; 64:EXMC + DCD SDIO_IRQHandler ; 65:SDIO + DCD TIMER4_IRQHandler ; 66:TIMER4 + DCD SPI2_IRQHandler ; 67:SPI2 + DCD UART3_IRQHandler ; 68:UART3 + DCD UART4_IRQHandler ; 69:UART4 + DCD TIMER5_IRQHandler ; 70:TIMER5 + DCD TIMER6_IRQHandler ; 71:TIMER6 + DCD DMA1_Channel0_IRQHandler ; 72:DMA1 Channel0 + DCD DMA1_Channel1_IRQHandler ; 73:DMA1 Channel1 + DCD DMA1_Channel2_IRQHandler ; 74:DMA1 Channel2 + DCD DMA1_Channel3_4_IRQHandler ; 75:DMA1 Channel3 and channel4 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:NOROOT:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDGT_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +WWDGT_IRQHandler + B WWDGT_IRQHandler + + PUBWEAK LVD_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +LVD_IRQHandler + B LVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +FMC_IRQHandler + B FMC_IRQHandler + + PUBWEAK RCU_CTC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RCU_CTC_IRQHandler + B RCU_CTC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA0_Channel0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel0_IRQHandler + B DMA0_Channel0_IRQHandler + + PUBWEAK DMA0_Channel1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel1_IRQHandler + B DMA0_Channel1_IRQHandler + + PUBWEAK DMA0_Channel2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel2_IRQHandler + B DMA0_Channel2_IRQHandler + + PUBWEAK DMA0_Channel3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel3_IRQHandler + B DMA0_Channel3_IRQHandler + + PUBWEAK DMA0_Channel4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel4_IRQHandler + B DMA0_Channel4_IRQHandler + + PUBWEAK DMA0_Channel5_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel5_IRQHandler + B DMA0_Channel5_IRQHandler + + PUBWEAK DMA0_Channel6_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel6_IRQHandler + B DMA0_Channel6_IRQHandler + + PUBWEAK ADC0_1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ADC0_1_IRQHandler + B ADC0_1_IRQHandler + + PUBWEAK USBD_HP_CAN0_TX_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBD_HP_CAN0_TX_IRQHandler + B USBD_HP_CAN0_TX_IRQHandler + + PUBWEAK USBD_LP_CAN0_RX0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBD_LP_CAN0_RX0_IRQHandler + B USBD_LP_CAN0_RX0_IRQHandler + + PUBWEAK CAN0_RX1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_RX1_IRQHandler + B CAN0_RX1_IRQHandler + + PUBWEAK CAN0_EWMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_EWMC_IRQHandler + B CAN0_EWMC_IRQHandler + + PUBWEAK EXTI5_9_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI5_9_IRQHandler + B EXTI5_9_IRQHandler + + PUBWEAK TIMER0_BRK_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_BRK_IRQHandler + B TIMER0_BRK_IRQHandler + + PUBWEAK TIMER0_UP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_UP_IRQHandler + B TIMER0_UP_IRQHandler + + PUBWEAK TIMER0_TRG_CMT_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_TRG_CMT_IRQHandler + B TIMER0_TRG_CMT_IRQHandler + + PUBWEAK TIMER0_Channel_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_Channel_IRQHandler + B TIMER0_Channel_IRQHandler + + PUBWEAK TIMER1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER1_IRQHandler + B TIMER1_IRQHandler + + PUBWEAK TIMER2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER2_IRQHandler + B TIMER2_IRQHandler + + PUBWEAK TIMER3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER3_IRQHandler + B TIMER3_IRQHandler + + PUBWEAK I2C0_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C0_EV_IRQHandler + B I2C0_EV_IRQHandler + + PUBWEAK I2C0_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C0_ER_IRQHandler + B I2C0_ER_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK SPI0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI0_IRQHandler + B SPI0_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK USART0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART0_IRQHandler + B USART0_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK EXTI10_15_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI10_15_IRQHandler + B EXTI10_15_IRQHandler + + PUBWEAK RTC_Alarm_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RTC_Alarm_IRQHandler + B RTC_Alarm_IRQHandler + + PUBWEAK USBD_WKUP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBD_WKUP_IRQHandler + B USBD_WKUP_IRQHandler + + PUBWEAK TIMER7_BRK_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_BRK_IRQHandler + B TIMER7_BRK_IRQHandler + + PUBWEAK TIMER7_UP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_UP_IRQHandler + B TIMER7_UP_IRQHandler + + PUBWEAK TIMER7_TRG_CMT_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_TRG_CMT_IRQHandler + B TIMER7_TRG_CMT_IRQHandler + + PUBWEAK TIMER7_Channel_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_Channel_IRQHandler + B TIMER7_Channel_IRQHandler + + PUBWEAK ADC2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ADC2_IRQHandler + B ADC2_IRQHandler + + PUBWEAK EXMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXMC_IRQHandler + B EXMC_IRQHandler + + PUBWEAK SDIO_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SDIO_IRQHandler + B SDIO_IRQHandler + + PUBWEAK TIMER4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER4_IRQHandler + B TIMER4_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK UART3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART3_IRQHandler + B UART3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK TIMER5_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER5_IRQHandler + B TIMER5_IRQHandler + + PUBWEAK TIMER6_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER6_IRQHandler + B TIMER6_IRQHandler + + PUBWEAK DMA1_Channel0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel0_IRQHandler + B DMA1_Channel0_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel3_4_IRQHandler + B DMA1_Channel3_4_IRQHandler + END \ No newline at end of file diff --git b/Drivers/CMSIS/GD/GD32F30x/Source/IAR/startup_gd32f30x_xd.s a/Drivers/CMSIS/GD/GD32F30x/Source/IAR/startup_gd32f30x_xd.s new file mode 100644 index 0000000..1eb4659 --- /dev/null +++ a/Drivers/CMSIS/GD/GD32F30x/Source/IAR/startup_gd32f30x_xd.s @@ -0,0 +1,487 @@ +;/*! +; \file startup_gd32f30x_xd.s +; \brief start up file +; +; \version 2018-10-10, V1.1.0, firmware for GD32F30x +; \version 2020-09-30, V2.1.0, firmware for GD32F30x +;*/ +; +;/* +; Copyright (c) 2020, GigaDevice Semiconductor Inc. + +; Redistribution and use in source and binary forms, with or without modification, +;are permitted provided that the following conditions are met: +; +; 1. Redistributions of source code must retain the above copyright notice, this +; list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright notice, +; this list of conditions and the following disclaimer in the documentation +; and/or other materials provided with the distribution. +; 3. Neither the name of the copyright holder nor the names of its contributors +; may be used to endorse or promote products derived from this software without +; specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +;AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +;IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +;INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +;NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +;PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +;WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +;ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +;OF SUCH DAMAGE. +;*/ + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + PUBLIC __vector_table + + DATA +__vector_table + DCD sfe(CSTACK) ; top of stack + DCD Reset_Handler ; Vector Number 1,Reset Handler + + DCD NMI_Handler ; Vector Number 2,NMI Handler + DCD HardFault_Handler ; Vector Number 3,Hard Fault Handler + DCD MemManage_Handler ; Vector Number 4,MPU Fault Handler + DCD BusFault_Handler ; Vector Number 5,Bus Fault Handler + DCD UsageFault_Handler ; Vector Number 6,Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; Vector Number 11,SVCall Handler + DCD DebugMon_Handler ; Vector Number 12,Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; Vector Number 14,PendSV Handler + DCD SysTick_Handler ; Vector Number 15,SysTick Handler + + ; External Interrupts + DCD WWDGT_IRQHandler ; 16:Window Watchdog Timer + DCD LVD_IRQHandler ; 17:LVD through EXTI Line detect + DCD TAMPER_IRQHandler ; 18:Tamper through EXTI Line detect + DCD RTC_IRQHandler ; 19:RTC through EXTI Line + DCD FMC_IRQHandler ; 20:FMC + DCD RCU_CTC_IRQHandler ; 21:RCU and CTC + DCD EXTI0_IRQHandler ; 22:EXTI Line 0 + DCD EXTI1_IRQHandler ; 23:EXTI Line 1 + DCD EXTI2_IRQHandler ; 24:EXTI Line 2 + DCD EXTI3_IRQHandler ; 25:EXTI Line 3 + DCD EXTI4_IRQHandler ; 26:EXTI Line 4 + DCD DMA0_Channel0_IRQHandler ; 27:DMA0 Channel0 + DCD DMA0_Channel1_IRQHandler ; 28:DMA0 Channel1 + DCD DMA0_Channel2_IRQHandler ; 29:DMA0 Channel2 + DCD DMA0_Channel3_IRQHandler ; 30:DMA0 Channel3 + DCD DMA0_Channel4_IRQHandler ; 31:DMA0 Channel4 + DCD DMA0_Channel5_IRQHandler ; 32:DMA0 Channel5 + DCD DMA0_Channel6_IRQHandler ; 33:DMA0 Channel6 + DCD ADC0_1_IRQHandler ; 34:ADC0 and ADC1 + DCD USBD_HP_CAN0_TX_IRQHandler ; 35:USBD HP and CAN0 TX + DCD USBD_LP_CAN0_RX0_IRQHandler ; 36:USBD LP and CAN0 RX0 + DCD CAN0_RX1_IRQHandler ; 37:CAN0 RX1 + DCD CAN0_EWMC_IRQHandler ; 38:CAN0 EWMC + DCD EXTI5_9_IRQHandler ; 39:EXTI5 to EXTI9 + DCD TIMER0_BRK_TIMER8_IRQHandler ; 40:TIMER0 Break and TIMER8 + DCD TIMER0_UP_TIMER9_IRQHandler ; 41:TIMER0 Update and TIMER9 + DCD TIMER0_TRG_CMT_TIMER10_IRQHandler ; 42:TIMER0 Trigger and Commucation and TIMER10 + DCD TIMER0_Channel_IRQHandler ; 43:TIMER0 Channel Capture Compare + DCD TIMER1_IRQHandler ; 44:TIMER1 + DCD TIMER2_IRQHandler ; 45:TIMER2 + DCD TIMER3_IRQHandler ; 46:TIMER3 + DCD I2C0_EV_IRQHandler ; 47:I2C0 Event + DCD I2C0_ER_IRQHandler ; 48:I2C0 Error + DCD I2C1_EV_IRQHandler ; 49:I2C1 Event + DCD I2C1_ER_IRQHandler ; 50:I2C1 Error + DCD SPI0_IRQHandler ; 51:SPI0 + DCD SPI1_IRQHandler ; 52:SPI1 + DCD USART0_IRQHandler ; 53:USART0 + DCD USART1_IRQHandler ; 54:USART1 + DCD USART2_IRQHandler ; 55:USART2 + DCD EXTI10_15_IRQHandler ; 56:EXTI10 to EXTI15 + DCD RTC_Alarm_IRQHandler ; 57:RTC Alarm + DCD USBD_WKUP_IRQHandler ; 58:USBD Wakeup + DCD TIMER7_BRK_TIMER11_IRQHandler ; 59:TIMER7 Break and TIMER11 + DCD TIMER7_UP_TIMER12_IRQHandler ; 60:TIMER7 Update and TIMER12 + DCD TIMER7_TRG_CMT_TIMER13_IRQHandler ; 61:TIMER7 Trigger and Commucation and TIMER13 + DCD TIMER7_Channel_IRQHandler ; 62:TIMER7 Channel Capture Compare + DCD ADC2_IRQHandler ; 63:ADC2 + DCD EXMC_IRQHandler ; 64:EXMC + DCD SDIO_IRQHandler ; 65:SDIO + DCD TIMER4_IRQHandler ; 66:TIMER4 + DCD SPI2_IRQHandler ; 67:SPI2 + DCD UART3_IRQHandler ; 68:UART3 + DCD UART4_IRQHandler ; 69:UART4 + DCD TIMER5_IRQHandler ; 70:TIMER5 + DCD TIMER6_IRQHandler ; 71:TIMER6 + DCD DMA1_Channel0_IRQHandler ; 72:DMA1 Channel0 + DCD DMA1_Channel1_IRQHandler ; 73:DMA1 Channel1 + DCD DMA1_Channel2_IRQHandler ; 74:DMA1 Channel2 + DCD DMA1_Channel3_4_IRQHandler ; 75:DMA1 Channel3 and channel4 + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:NOROOT:REORDER(2) +Reset_Handler + LDR R0, =SystemInit + BLX R0 + LDR R0, =__iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:NOROOT:REORDER(1) +SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDGT_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +WWDGT_IRQHandler + B WWDGT_IRQHandler + + PUBWEAK LVD_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +LVD_IRQHandler + B LVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +FMC_IRQHandler + B FMC_IRQHandler + + PUBWEAK RCU_CTC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RCU_CTC_IRQHandler + B RCU_CTC_IRQHandler + + PUBWEAK EXTI0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI0_IRQHandler + B EXTI0_IRQHandler + + PUBWEAK EXTI1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI1_IRQHandler + B EXTI1_IRQHandler + + PUBWEAK EXTI2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI2_IRQHandler + B EXTI2_IRQHandler + + PUBWEAK EXTI3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI3_IRQHandler + B EXTI3_IRQHandler + + PUBWEAK EXTI4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI4_IRQHandler + B EXTI4_IRQHandler + + PUBWEAK DMA0_Channel0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel0_IRQHandler + B DMA0_Channel0_IRQHandler + + PUBWEAK DMA0_Channel1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel1_IRQHandler + B DMA0_Channel1_IRQHandler + + PUBWEAK DMA0_Channel2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel2_IRQHandler + B DMA0_Channel2_IRQHandler + + PUBWEAK DMA0_Channel3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel3_IRQHandler + B DMA0_Channel3_IRQHandler + + PUBWEAK DMA0_Channel4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel4_IRQHandler + B DMA0_Channel4_IRQHandler + + PUBWEAK DMA0_Channel5_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel5_IRQHandler + B DMA0_Channel5_IRQHandler + + PUBWEAK DMA0_Channel6_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA0_Channel6_IRQHandler + B DMA0_Channel6_IRQHandler + + PUBWEAK ADC0_1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ADC0_1_IRQHandler + B ADC0_1_IRQHandler + + PUBWEAK USBD_HP_CAN0_TX_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBD_HP_CAN0_TX_IRQHandler + B USBD_HP_CAN0_TX_IRQHandler + + PUBWEAK USBD_LP_CAN0_RX0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBD_LP_CAN0_RX0_IRQHandler + B USBD_LP_CAN0_RX0_IRQHandler + + PUBWEAK CAN0_RX1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_RX1_IRQHandler + B CAN0_RX1_IRQHandler + + PUBWEAK CAN0_EWMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +CAN0_EWMC_IRQHandler + B CAN0_EWMC_IRQHandler + + PUBWEAK EXTI5_9_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI5_9_IRQHandler + B EXTI5_9_IRQHandler + + PUBWEAK TIMER0_BRK_TIMER8_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_BRK_TIMER8_IRQHandler + B TIMER0_BRK_TIMER8_IRQHandler + + PUBWEAK TIMER0_UP_TIMER9_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_UP_TIMER9_IRQHandler + B TIMER0_UP_TIMER9_IRQHandler + + PUBWEAK TIMER0_TRG_CMT_TIMER10_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_TRG_CMT_TIMER10_IRQHandler + B TIMER0_TRG_CMT_TIMER10_IRQHandler + + PUBWEAK TIMER0_Channel_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER0_Channel_IRQHandler + B TIMER0_Channel_IRQHandler + + PUBWEAK TIMER1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER1_IRQHandler + B TIMER1_IRQHandler + + PUBWEAK TIMER2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER2_IRQHandler + B TIMER2_IRQHandler + + PUBWEAK TIMER3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER3_IRQHandler + B TIMER3_IRQHandler + + PUBWEAK I2C0_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C0_EV_IRQHandler + B I2C0_EV_IRQHandler + + PUBWEAK I2C0_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C0_ER_IRQHandler + B I2C0_ER_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK SPI0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI0_IRQHandler + B SPI0_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK USART0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART0_IRQHandler + B USART0_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK EXTI10_15_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXTI10_15_IRQHandler + B EXTI10_15_IRQHandler + + PUBWEAK RTC_Alarm_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +RTC_Alarm_IRQHandler + B RTC_Alarm_IRQHandler + + PUBWEAK USBD_WKUP_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +USBD_WKUP_IRQHandler + B USBD_WKUP_IRQHandler + + PUBWEAK TIMER7_BRK_TIMER11_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_BRK_TIMER11_IRQHandler + B TIMER7_BRK_TIMER11_IRQHandler + + PUBWEAK TIMER7_UP_TIMER12_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_UP_TIMER12_IRQHandler + B TIMER7_UP_TIMER12_IRQHandler + + PUBWEAK TIMER7_TRG_CMT_TIMER13_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_TRG_CMT_TIMER13_IRQHandler + B TIMER7_TRG_CMT_TIMER13_IRQHandler + + PUBWEAK TIMER7_Channel_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER7_Channel_IRQHandler + B TIMER7_Channel_IRQHandler + + PUBWEAK ADC2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +ADC2_IRQHandler + B ADC2_IRQHandler + + PUBWEAK EXMC_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +EXMC_IRQHandler + B EXMC_IRQHandler + + PUBWEAK SDIO_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SDIO_IRQHandler + B SDIO_IRQHandler + + PUBWEAK TIMER4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER4_IRQHandler + B TIMER4_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK UART3_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART3_IRQHandler + B UART3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK TIMER5_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER5_IRQHandler + B TIMER5_IRQHandler + + PUBWEAK TIMER6_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +TIMER6_IRQHandler + B TIMER6_IRQHandler + + PUBWEAK DMA1_Channel0_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel0_IRQHandler + B DMA1_Channel0_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_4_IRQHandler + SECTION .text:CODE:NOROOT:REORDER(1) +DMA1_Channel3_4_IRQHandler + B DMA1_Channel3_4_IRQHandler + END \ No newline at end of file diff --git b/Drivers/CMSIS/GD/GD32F30x/Source/system_gd32f30x.c a/Drivers/CMSIS/GD/GD32F30x/Source/system_gd32f30x.c new file mode 100644 index 0000000..6ae5b37 --- /dev/null +++ a/Drivers/CMSIS/GD/GD32F30x/Source/system_gd32f30x.c @@ -0,0 +1,1003 @@ +/*! + \file system_gd32f30x.c + \brief CMSIS Cortex-M4 Device Peripheral Access Layer Source File for + GD32F30x Device Series +*/ + +/* Copyright (c) 2012 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ +/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32f30x.h" + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +/* select a system clock by uncommenting the following line */ +/* use IRC8M */ +//#define __SYSTEM_CLOCK_IRC8M (uint32_t)(__IRC8M) +//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000) +//#define __SYSTEM_CLOCK_120M_PLL_IRC8M (uint32_t)(120000000) + +/* use HXTAL(XD series CK_HXTAL = 8M, CL series CK_HXTAL = 25M) */ +//#define __SYSTEM_CLOCK_HXTAL (uint32_t)(__HXTAL) +//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) +#define __SYSTEM_CLOCK_120M_PLL_HXTAL (uint32_t)(120000000) + +#define SEL_IRC8M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLL 0x02U +#define RCU_MODIFY {volatile uint32_t i; \ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV2; \ + for(i=0;i<20000;i++);} + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_IRC8M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_IRC8M; +static void system_clock_8m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_IRC8M; +static void system_clock_48m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M; +static void system_clock_72m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M; +static void system_clock_108m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_IRC8M; +static void system_clock_120m_irc8m(void); + +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL; +static void system_clock_48m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; +static void system_clock_72m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; +static void system_clock_108m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_120M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_HXTAL; +static void system_clock_120m_hxtal(void); +#endif /* __SYSTEM_CLOCK_IRC8M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit (void) +{ + /* FPU settings */ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + /* reset the RCU clock configuration to the default reset state */ + /* Set IRC8MEN bit */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + RCU_MODIFY + + RCU_CFG0 &= ~RCU_CFG0_SCS; + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + /* reset HXTALEN, CKMEN and PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x009f0000U; +#elif defined(GD32F30X_CL) + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN |RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00ff0000U; +#endif + + /* reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* Reset CFG0 and CFG1 registers */ + RCU_CFG0 = 0x00000000U; + RCU_CFG1 = 0x00000000U; + + /* configure the system clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_IRC8M + system_clock_8m_irc8m(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) + system_clock_48m_irc8m(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) + system_clock_72m_irc8m(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) + system_clock_108m_irc8m(); +#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC8M) + system_clock_120m_irc8m(); + +#elif defined (__SYSTEM_CLOCK_HXTAL) + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) + system_clock_48m_hxtal(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) + system_clock_72m_hxtal(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) + system_clock_108m_hxtal(); +#elif defined (__SYSTEM_CLOCK_120M_PLL_HXTAL) + system_clock_120m_hxtal(); +#endif /* __SYSTEM_CLOCK_IRC8M */ +} + +#ifdef __SYSTEM_CLOCK_IRC8M +/*! + \brief configure the system clock to 8M by IRC8M + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_8m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select IRC8M as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_IRC8M; + + /* wait until IRC8M is selected as system clock */ + while(0U != (RCU_CFG0 & RCU_SCSS_IRC8M)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +/*! + \brief configure the system clock to 48M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* LDO output voltage high mode */ + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL12; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +/*! + \brief configure the system clock to 72M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + }while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* LDO output voltage high mode */ + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL18; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +/*! + \brief configure the system clock to 108M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + }while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* LDO output voltage high mode */ + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL27; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC8M) +/*! + \brief configure the system clock to 120M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_120m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + }while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* LDO output voltage high mode */ + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 30 = 120 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL30; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_HXTAL) +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(0 == (RCU_CFG0 & RCU_SCSS_HXTAL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +/*! + \brief configure the system clock to 48M by PLL which selects HXTAL(8M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + /* select HXTAL/2 as clock source */ + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0); + + /* CK_PLL = (CK_HXTAL/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL12; + +#elif defined(GD32F30X_CL) + /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_PLL_MUL12); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PLLPRESEL | RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } +#endif /* GD32F30X_HD and GD32F30X_XD */ + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +/*! + \brief configure the system clock to 72M by PLL which selects HXTAL(8M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + /* select HXTAL/2 as clock source */ + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0); + + /* CK_PLL = (CK_HXTAL/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL18; + +#elif defined(GD32F30X_CL) + /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_PLL_MUL18); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PLLPRESEL | RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } +#endif /* GD32F30X_HD and GD32F30X_XD */ + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(8M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + /* select HXTAL/2 as clock source */ + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0); + + /* CK_PLL = (CK_HXTAL/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL27; + +#elif defined(GD32F30X_CL) + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_PLL_MUL27); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PLLPRESEL | RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } +#endif /* GD32F30X_HD and GD32F30X_XD */ + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_120M_PLL_HXTAL) +/*! + \brief configure the system clock to 120M by PLL which selects HXTAL(8M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_120m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + /* select HXTAL/2 as clock source */ + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0); + + /* CK_PLL = (CK_HXTAL/2) * 30 = 120 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); +// RCU_CFG0 |= RCU_PLL_MUL30; + #if (__HXTAL == 16000000) + RCU_CFG0 |= RCU_PLL_MUL15; +#else + RCU_CFG0 |= RCU_PLL_MUL30; +#endif + +#elif defined(GD32F30X_CL) + /* CK_PLL = (CK_PREDIV0) * 30 = 120 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_PLL_MUL30); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PLLPRESEL | RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0U){ + } +#endif /* GD32F30X_HD and GD32F30X_XD */ + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} +#endif /* __SYSTEM_CLOCK_IRC8M */ + +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate(void) +{ + uint32_t sws; + uint32_t pllsel, pllpresel, predv0sel, pllmf, ck_src, idx, clk_exp; + /* exponent of AHB, APB1 and APB2 clock divider */ + const uint8_t ahb_exp[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +#ifdef GD32F30X_CL + uint32_t predv0, predv1, pll1mf; +#endif /* GD32F30X_CL */ + + sws = GET_BITS(RCU_CFG0, 2, 3); + switch(sws){ + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL, IRC48M or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + if(RCU_PLLSRC_HXTAL_IRC48M == pllsel){ + /* PLL clock source is HXTAL or IRC48M */ + pllpresel = (RCU_CFG1 & RCU_CFG1_PLLPRESEL); + + if(RCU_PLLPRESRC_HXTAL == pllpresel){ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + }else{ + /* PLL clock source is IRC48 */ + ck_src = IRC48M_VALUE; + } + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + predv0sel = (RCU_CFG0 & RCU_CFG0_PREDV0); + /* PREDV0 input source clock divided by 2 */ + if(RCU_CFG0_PREDV0 == predv0sel){ + ck_src /= 2U; + } +#elif defined(GD32F30X_CL) + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; +#endif /* GD32F30X_HD and GD32F30X_XD */ + }else{ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + if((RCU_CFG0 & RCU_CFG0_PLLMF_5)){ + pllmf |= 0x20U; + } + + if( pllmf >= 15U){ + pllmf += 1U; + }else{ + pllmf += 2U; + } + if(pllmf > 61U){ + pllmf = 63U; + } + SystemCoreClock = ck_src * pllmf; + #ifdef GD32F30X_CL + if(15U == pllmf){ + SystemCoreClock = (ck_src * 6U) + (ck_src / 2U); + } + #endif /* GD32F30X_CL */ + break; + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } + + /* calculate AHB clock frequency */ + idx = GET_BITS(RCU_CFG0, 4, 7); + clk_exp = ahb_exp[idx]; + SystemCoreClock = SystemCoreClock >> clk_exp; +} diff --git b/Drivers/CMSIS/core_cm4.h a/Drivers/CMSIS/core_cm4.h new file mode 100644 index 0000000..d828414 --- /dev/null +++ a/Drivers/CMSIS/core_cm4.h @@ -0,0 +1,1790 @@ +/**************************************************************************//** + * @file core_cm4.h + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File + * @version V3.30 + * @date 17. February 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2014 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __CORE_CM4_H_GENERIC +#define __CORE_CM4_H_GENERIC + +/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** \ingroup Cortex_M4 + @{ + */ + +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x04) /*!< Cortex-M Core */ + + +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + #define __STATIC_INLINE static __inline + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + #define __STATIC_INLINE static inline + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ + #define __STATIC_INLINE static inline + +#elif defined ( __TMS470__ ) + #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ + #define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + #define __STATIC_INLINE static inline + +#elif defined ( __CSMC__ ) /* Cosmic */ + #define __packed + #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ + #define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */ + #define __STATIC_INLINE static inline + +#endif + +/** __FPU_USED indicates whether an FPU is used or not. For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1 + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0 + #endif + #else + #define __FPU_USED 0 + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1 + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0 + #endif + #else + #define __FPU_USED 0 + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1 + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0 + #endif + #else + #define __FPU_USED 0 + #endif + +#elif defined ( __TMS470__ ) + #if defined __TI_VFP_SUPPORT__ + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1 + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0 + #endif + #else + #define __FPU_USED 0 + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1 + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0 + #endif + #else + #define __FPU_USED 0 + #endif + +#elif defined ( __CSMC__ ) /* Cosmic */ + #if ( __CSMC__ & 0x400) // FPU present for parser + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1 + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0 + #endif + #else + #define __FPU_USED 0 + #endif +#endif + +#include /* standard types definitions */ +#include /* Core Instruction Access */ +#include /* Core Function Access */ +#include /* Compiler specific SIMD Intrinsics */ + +#endif /* __CORE_CM4_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM4_H_DEPENDANT +#define __CORE_CM4_H_DEPENDANT + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM4_REV + #define __CM4_REV 0x0000 + #warning "__CM4_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0 + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0 + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 4 + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0 + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/*@} end of group Cortex_M4 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ +#else + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ +#endif + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + + +/** \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + + +/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ +#else + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ +#endif + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + + +/** \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/*@} end of group CMSIS_CORE */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644]; + __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5]; + __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Registers Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* SCB Hard Fault Status Registers Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1]; + __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISOOFP_Pos 9 /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8 /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __O union + { + __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864]; + __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15]; + __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15]; + __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29]; + __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43]; + __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6]; + __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1]; + __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1]; + __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1]; + __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL << DWT_CTRL_CYCCNTENA_Pos) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL << DWT_CPICNT_CPICNT_Pos) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL << DWT_EXCCNT_EXCCNT_Pos) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL << DWT_SLEEPCNT_SLEEPCNT_Pos) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL << DWT_LSUCNT_LSUCNT_Pos) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL << DWT_FOLDCNT_FOLDCNT_Pos) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL << DWT_MASK_MASK_Pos) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL << DWT_FUNCTION_FUNCTION_Pos) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2]; + __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55]; + __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131]; + __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759]; + __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1]; + __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39]; + __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8]; + __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL << TPI_ACPR_PRESCALER_Pos) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL << TPI_SPPR_TXMODE_Pos) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL << TPI_FFSR_FlInProg_Pos) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL << TPI_TRIGGER_TRIGGER_Pos) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL << TPI_FIFO0_ETM0_Pos) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL << TPI_ITATBCTR2_ATREADY_Pos) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL << TPI_FIFO1_ITM0_Pos) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL << TPI_ITATBCTR0_ATREADY_Pos) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL << TPI_ITCTRL_Mode_Pos) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL << TPI_DEVID_NrTraceInput_Pos) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL << TPI_DEVTYPE_SubType_Pos) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if (__MPU_PRESENT == 1) +/** \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register */ +#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register */ +#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register */ +#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register */ +#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register */ +#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if (__FPU_PRESENT == 1) +/** \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1]; + __IO uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IO uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IO uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __I uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __I uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register */ +#define FPU_FPCCR_ASPEN_Pos 31 /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30 /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8 /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6 /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5 /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4 /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3 /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1 /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0 /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL << FPU_FPCCR_LSPACT_Pos) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register */ +#define FPU_FPCAR_ADDRESS_Pos 3 /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register */ +#define FPU_FPDSCR_AHP_Pos 26 /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25 /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24 /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22 /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28 /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24 /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20 /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16 /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12 /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8 /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4 /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0 /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL << FPU_MVFR0_A_SIMD_registers_Pos) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28 /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24 /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4 /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0 /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL << FPU_MVFR1_FtZ_mode_Pos) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ +#endif + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register */ +#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Cortex-M4 Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if (__MPU_PRESENT == 1) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#if (__FPU_PRESENT == 1) + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +/** \brief Set Priority Grouping + + The function sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** \brief Get Priority Grouping + + The function reads the priority grouping field from the NVIC Interrupt Controller. + + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) +{ + return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ +} + + +/** \brief Enable External Interrupt + + The function enables a device-specific interrupt in the NVIC interrupt controller. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ +/* NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); enable interrupt */ + NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] = (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); /* enable interrupt */ +} + + +/** \brief Disable External Interrupt + + The function disables a device-specific interrupt in the NVIC interrupt controller. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ +} + + +/** \brief Get Pending Interrupt + + The function reads the pending register in the NVIC and returns the pending bit + for the specified interrupt. + + \param [in] IRQn Interrupt number. + + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ +} + + +/** \brief Set Pending Interrupt + + The function sets the pending bit of an external interrupt. + + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ +} + + +/** \brief Clear Pending Interrupt + + The function clears the pending bit of an external interrupt. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + + +/** \brief Get Active Interrupt + + The function reads the active register in NVIC and returns the active bit. + + \param [in] IRQn Interrupt number. + + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + */ +__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ +} + + +/** \brief Set Interrupt Priority + + The function sets the priority of an interrupt. + + \note The priority cannot be set for every core interrupt. + + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if(IRQn < 0) { + SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ + else { + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ +} + + +/** \brief Get Interrupt Priority + + The function reads the priority of an interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented + priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ + else { + return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** \brief Encode Priority + + The function encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the samllest possible priority group is set. + + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + return ( + ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | + ((SubPriority & ((1 << (SubPriorityBits )) - 1))) + ); +} + + +/** \brief Decode Priority + + The function decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); + *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); +} + + +/** \brief System Reset + + The function initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + while(1); /* wait until reset */ +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if (__Vendor_SysTickConfig == 0) + +/** \brief System Tick Configuration + + The function initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + + \param [in] ticks Number of ticks between two interrupts. + + \return 0 Function succeeded. + \return 1 Function failed. + + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ + + SysTick->LOAD = ticks - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** \brief ITM Send Character + + The function transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + + \param [in] ch Character to transmit. + + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if ((ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ + (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0].u32 == 0); + ITM->PORT[0].u8 = (uint8_t) ch; + } + return (ch); +} + + +/** \brief ITM Receive Character + + The function inputs a character via the external variable \ref ITM_RxBuffer. + + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) { + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** \brief ITM Check Character + + The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) { + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { + return (0); /* no character available */ + } else { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + +#endif /* __CORE_CM4_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ + +#ifdef __cplusplus +} +#endif diff --git b/Drivers/CMSIS/core_cm4_simd.h a/Drivers/CMSIS/core_cm4_simd.h new file mode 100644 index 0000000..f9bceff --- /dev/null +++ a/Drivers/CMSIS/core_cm4_simd.h @@ -0,0 +1,697 @@ +/**************************************************************************//** + * @file core_cm4_simd.h + * @brief CMSIS Cortex-M4 SIMD Header File + * @version V3.30 + * @date 17. February 2014 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2014 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ + + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#endif + +#ifndef __CORE_CM4_SIMD_H +#define __CORE_CM4_SIMD_H + +#ifdef __cplusplus + extern "C" { +#endif + + +/******************************************************************************* + * Hardware Abstraction Layer + ******************************************************************************/ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32) ) >> 32)) + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ // Little endian + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else // Big endian + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ // Little endian + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else // Big endian + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ // Little endian + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else // Big endian + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ // Little endian + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else // Big endian + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ +#include + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ +#include + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ +/* not yet supported */ + + +#elif defined ( __CSMC__ ) /*------------------ COSMIC Compiler -------------------*/ +/* Cosmic specific functions */ +#include + +#endif + +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_SIMD_H */ diff --git b/Drivers/CMSIS/core_cmFunc.h a/Drivers/CMSIS/core_cmFunc.h new file mode 100644 index 0000000..3c932e0 --- /dev/null +++ a/Drivers/CMSIS/core_cmFunc.h @@ -0,0 +1,616 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V3.01 + * @date 06. March 2012 + * + * @note + * Copyright (C) 2009-2012 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CORE_CMFUNC_H +#define __CORE_CMFUNC_H + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + +/* intrinsic void __enable_irq(); */ +/* intrinsic void __disable_irq(); */ + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xff); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ + +#include + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief Enable IRQ Interrupts + + This function enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i"); +} + + +/** \brief Disable IRQ Interrupts + + This function disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i"); +} + + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) ); +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) ); +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) ); +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f"); +} + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f"); +} + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); + return(result); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (value) ); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) ); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +#endif /* __CORE_CMFUNC_H */ diff --git b/Drivers/CMSIS/core_cmInstr.h a/Drivers/CMSIS/core_cmInstr.h new file mode 100644 index 0000000..597e64d --- /dev/null +++ a/Drivers/CMSIS/core_cmInstr.h @@ -0,0 +1,618 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V3.01 + * @date 06. March 2012 + * + * @note + * Copyright (C) 2009-2012 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CORE_CMINSTR_H +#define __CORE_CMINSTR_H + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +#define __ISB() __isb(0xF) + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __dsb(0xF) + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __dmb(0xF) + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __rbit + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW(value, ptr) __strex(value, ptr) + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +#define __CLREX __clrex + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + +#endif /* (__CORTEX_M >= 0x03) */ + + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ + +#include + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void) +{ + __ASM volatile ("nop"); +} + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void) +{ + __ASM volatile ("wfi"); +} + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void) +{ + __ASM volatile ("wfe"); +} + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void) +{ + __ASM volatile ("sev"); +} + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void) +{ + __ASM volatile ("isb"); +} + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void) +{ + __ASM volatile ("dsb"); +} + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void) +{ + __ASM volatile ("dmb"); +} + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value) +{ + uint32_t result; + + __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + + __ASM volatile ("ror %0, %0, %1" : "+r" (op1) : "r" (op2) ); + return(op1); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint8_t result; + + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint16_t result; + + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void) +{ + __ASM volatile ("clrex"); +} + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value) +{ + uint8_t result; + + __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + +#endif /* __CORE_CMINSTR_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_adc.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_adc.h new file mode 100644 index 0000000..ee9638c --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_adc.h @@ -0,0 +1,403 @@ +/*! + \file gd32f30x_adc.h + \brief definitions for the ADC + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_ADC_H +#define GD32F30X_ADC_H + +#include "gd32f30x.h" + +/* ADC definitions */ +#define ADC0 ADC_BASE +#define ADC1 (ADC_BASE + 0x400U) +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define ADC2 (ADC_BASE + 0x1800U) +#endif + +/* registers definitions */ +#define ADC_STAT(adcx) REG32((adcx) + 0x00U) /*!< ADC status register */ +#define ADC_CTL0(adcx) REG32((adcx) + 0x04U) /*!< ADC control register 0 */ +#define ADC_CTL1(adcx) REG32((adcx) + 0x08U) /*!< ADC control register 1 */ +#define ADC_SAMPT0(adcx) REG32((adcx) + 0x0CU) /*!< ADC sampling time register 0 */ +#define ADC_SAMPT1(adcx) REG32((adcx) + 0x10U) /*!< ADC sampling time register 1 */ +#define ADC_IOFF0(adcx) REG32((adcx) + 0x14U) /*!< ADC inserted channel data offset register 0 */ +#define ADC_IOFF1(adcx) REG32((adcx) + 0x18U) /*!< ADC inserted channel data offset register 1 */ +#define ADC_IOFF2(adcx) REG32((adcx) + 0x1CU) /*!< ADC inserted channel data offset register 2 */ +#define ADC_IOFF3(adcx) REG32((adcx) + 0x20U) /*!< ADC inserted channel data offset register 3 */ +#define ADC_WDHT(adcx) REG32((adcx) + 0x24U) /*!< ADC watchdog high threshold register */ +#define ADC_WDLT(adcx) REG32((adcx) + 0x28U) /*!< ADC watchdog low threshold register */ +#define ADC_RSQ0(adcx) REG32((adcx) + 0x2CU) /*!< ADC regular sequence register 0 */ +#define ADC_RSQ1(adcx) REG32((adcx) + 0x30U) /*!< ADC regular sequence register 1 */ +#define ADC_RSQ2(adcx) REG32((adcx) + 0x34U) /*!< ADC regular sequence register 2 */ +#define ADC_ISQ(adcx) REG32((adcx) + 0x38U) /*!< ADC inserted sequence register */ +#define ADC_IDATA0(adcx) REG32((adcx) + 0x3CU) /*!< ADC inserted data register 0 */ +#define ADC_IDATA1(adcx) REG32((adcx) + 0x40U) /*!< ADC inserted data register 1 */ +#define ADC_IDATA2(adcx) REG32((adcx) + 0x44U) /*!< ADC inserted data register 2 */ +#define ADC_IDATA3(adcx) REG32((adcx) + 0x48U) /*!< ADC inserted data register 3 */ +#define ADC_RDATA(adcx) REG32((adcx) + 0x4CU) /*!< ADC regular data register */ +#define ADC_OVSAMPCTL(adcx) REG32((adcx) + 0x80U) /*!< ADC oversampling control register */ + +/* bits definitions */ +/* ADC_STAT */ +#define ADC_STAT_WDE BIT(0) /*!< analog watchdog event flag */ +#define ADC_STAT_EOC BIT(1) /*!< end of conversion */ +#define ADC_STAT_EOIC BIT(2) /*!< inserted channel end of conversion */ +#define ADC_STAT_STIC BIT(3) /*!< inserted channel start flag */ +#define ADC_STAT_STRC BIT(4) /*!< regular channel start flag */ + +/* ADC_CTL0 */ +#define ADC_CTL0_WDCHSEL BITS(0,4) /*!< analog watchdog channel select bits */ +#define ADC_CTL0_EOCIE BIT(5) /*!< interrupt enable for EOC */ +#define ADC_CTL0_WDEIE BIT(6) /*!< analog watchdog interrupt enable */ +#define ADC_CTL0_EOICIE BIT(7) /*!< interrupt enable for inserted channels */ +#define ADC_CTL0_SM BIT(8) /*!< scan mode */ +#define ADC_CTL0_WDSC BIT(9) /*!< when in scan mode, analog watchdog is effective on a single channel */ +#define ADC_CTL0_ICA BIT(10) /*!< automatic inserted group conversion */ +#define ADC_CTL0_DISRC BIT(11) /*!< discontinuous mode on regular channels */ +#define ADC_CTL0_DISIC BIT(12) /*!< discontinuous mode on inserted channels */ +#define ADC_CTL0_DISNUM BITS(13,15) /*!< discontinuous mode channel count */ +#define ADC_CTL0_SYNCM BITS(16,19) /*!< sync mode selection */ +#define ADC_CTL0_IWDEN BIT(22) /*!< analog watchdog enable on inserted channels */ +#define ADC_CTL0_RWDEN BIT(23) /*!< analog watchdog enable on regular channels */ +#define ADC_CTL0_DRES BITS(24,25) /*!< ADC data resolution */ + +/* ADC_CTL1 */ +#define ADC_CTL1_ADCON BIT(0) /*!< ADC converter on */ +#define ADC_CTL1_CTN BIT(1) /*!< continuous conversion */ +#define ADC_CTL1_CLB BIT(2) /*!< ADC calibration */ +#define ADC_CTL1_RSTCLB BIT(3) /*!< reset calibration */ +#define ADC_CTL1_DMA BIT(8) /*!< direct memory access mode */ +#define ADC_CTL1_DAL BIT(11) /*!< data alignment */ +#define ADC_CTL1_ETSIC BITS(12,14) /*!< external trigger select for inserted channel */ +#define ADC_CTL1_ETEIC BIT(15) /*!< external trigger enable for inserted channel */ +#define ADC_CTL1_ETSRC BITS(17,19) /*!< external trigger select for regular channel */ +#define ADC_CTL1_ETERC BIT(20) /*!< external trigger conversion mode for inserted channels */ +#define ADC_CTL1_SWICST BIT(21) /*!< start on inserted channel */ +#define ADC_CTL1_SWRCST BIT(22) /*!< start on regular channel */ +#define ADC_CTL1_TSVREN BIT(23) /*!< channel 16 and 17 enable of ADC0 */ + +/* ADC_SAMPTx x=0..1 */ +#define ADC_SAMPTX_SPTN BITS(0,2) /*!< channel x sample time selection */ + +/* ADC_IOFFx x=0..3 */ +#define ADC_IOFFX_IOFF BITS(0,11) /*!< data offset for inserted channel x */ + +/* ADC_WDHT */ +#define ADC_WDHT_WDHT BITS(0,11) /*!< analog watchdog high threshold */ + +/* ADC_WDLT */ +#define ADC_WDLT_WDLT BITS(0,11) /*!< analog watchdog low threshold */ + +/* ADC_RSQx */ +#define ADC_RSQX_RSQN BITS(0,4) /*!< x conversion in regular sequence */ +#define ADC_RSQ0_RL BITS(20,23) /*!< regular channel sequence length */ + +/* ADC_ISQ */ +#define ADC_ISQ_ISQN BITS(0,4) /*!< x conversion in regular sequence */ +#define ADC_ISQ_IL BITS(20,21) /*!< inserted sequence length */ + +/* ADC_IDATAx x=0..3*/ +#define ADC_IDATAX_IDATAN BITS(0,15) /*!< inserted data x */ + +/* ADC_RDATA */ +#define ADC_RDATA_RDATA BITS(0,15) /*!< regular data */ +#define ADC_RDATA_ADC1RDTR BITS(16,31) /*!< ADC1 regular channel data */ + +/* ADC_OVSAMPCTL */ +#define ADC_OVSAMPCTL_OVSEN BIT(0) /*!< oversampling enable */ +#define ADC_OVSAMPCTL_OVSR BITS(2,4) /*!< oversampling ratio */ +#define ADC_OVSAMPCTL_OVSS BITS(5,8) /*!< oversampling shift */ +#define ADC_OVSAMPCTL_TOVS BIT(9) /*!< triggered oversampling */ +#define ADC_OVSAMPCTL_DRES BITS(12,13) /*!< oversampling shift */ + + +/* constants definitions */ +/* ADC status flag */ +#define ADC_FLAG_WDE ADC_STAT_WDE /*!< analog watchdog event flag */ +#define ADC_FLAG_EOC ADC_STAT_EOC /*!< end of conversion */ +#define ADC_FLAG_EOIC ADC_STAT_EOIC /*!< inserted channel end of conversion */ +#define ADC_FLAG_STIC ADC_STAT_STIC /*!< inserted channel start flag */ +#define ADC_FLAG_STRC ADC_STAT_STRC /*!< regular channel start flag */ + +/* adc_ctl0 register value */ +#define CTL0_DISNUM(regval) (BITS(13,15) & ((uint32_t)(regval) << 13)) /*!< write value to ADC_CTL0_DISNUM bit field */ + +/* ADC special function definitions */ +#define ADC_SCAN_MODE ADC_CTL0_SM /*!< scan mode */ +#define ADC_INSERTED_CHANNEL_AUTO ADC_CTL0_ICA /*!< inserted channel group convert automatically */ +#define ADC_CONTINUOUS_MODE ADC_CTL1_CTN /*!< continuous mode */ + +/* ADC synchronization mode */ +#define CTL0_SYNCM(regval) (BITS(16,19) & ((uint32_t)(regval) << 16)) /*!< write value to ADC_CTL0_SYNCM bit field */ +#define ADC_MODE_FREE CTL0_SYNCM(0) /*!< all the ADCs work independently */ +#define ADC_DAUL_REGULAL_PARALLEL_INSERTED_PARALLEL CTL0_SYNCM(1) /*!< ADC0 and ADC1 work in combined regular parallel + inserted parallel mode */ +#define ADC_DAUL_REGULAL_PARALLEL_INSERTED_ROTATION CTL0_SYNCM(2) /*!< ADC0 and ADC1 work in combined regular parallel + trigger rotation mode */ +#define ADC_DAUL_INSERTED_PARALLEL_REGULAL_FOLLOWUP_FAST CTL0_SYNCM(3) /*!< ADC0 and ADC1 work in combined inserted parallel + follow-up fast mode */ +#define ADC_DAUL_INSERTED_PARALLEL_REGULAL_FOLLOWUP_SLOW CTL0_SYNCM(4) /*!< ADC0 and ADC1 work in combined inserted parallel + follow-up slow mode */ +#define ADC_DAUL_INSERTED_PARALLEL CTL0_SYNCM(5) /*!< ADC0 and ADC1 work in inserted parallel mode only */ +#define ADC_DAUL_REGULAL_PARALLEL CTL0_SYNCM(6) /*!< ADC0 and ADC1 work in regular parallel mode only */ +#define ADC_DAUL_REGULAL_FOLLOWUP_FAST CTL0_SYNCM(7) /*!< ADC0 and ADC1 work in follow-up fast mode only */ +#define ADC_DAUL_REGULAL_FOLLOWUP_SLOW CTL0_SYNCM(8) /*!< ADC0 and ADC1 work in follow-up slow mode only */ +#define ADC_DAUL_INSERTED_TRRIGGER_ROTATION CTL0_SYNCM(9) /*!< ADC0 and ADC1 work in trigger rotation mode only */ + +/* ADC data alignment */ +#define ADC_DATAALIGN_RIGHT ((uint32_t)0x00000000U) /*!< LSB alignment */ +#define ADC_DATAALIGN_LEFT ADC_CTL1_DAL /*!< MSB alignment */ + +/* ADC external trigger select for regular channel */ +#define CTL1_ETSRC(regval) (BITS(17,19) & ((uint32_t)(regval) << 17)) /*!< write value to ADC_CTL1_ETSRC bit field */ +#define ADC0_1_EXTTRIG_REGULAR_T0_CH0 CTL1_ETSRC(0) /*!< timer 0 CC0 event select */ +#define ADC0_1_EXTTRIG_REGULAR_T0_CH1 CTL1_ETSRC(1) /*!< timer 0 CC1 event select */ +#define ADC0_1_EXTTRIG_REGULAR_T0_CH2 CTL1_ETSRC(2) /*!< timer 0 CC2 event select */ +#define ADC0_1_EXTTRIG_REGULAR_T1_CH1 CTL1_ETSRC(3) /*!< timer 1 CC1 event select */ +#define ADC0_1_EXTTRIG_REGULAR_T2_TRGO CTL1_ETSRC(4) /*!< timer 2 TRGO event select */ +#define ADC0_1_EXTTRIG_REGULAR_T3_CH3 CTL1_ETSRC(5) /*!< timer 3 CC3 event select */ +#define ADC0_1_EXTTRIG_REGULAR_T7_TRGO CTL1_ETSRC(6) /*!< timer 7 TRGO event select */ +#define ADC0_1_EXTTRIG_REGULAR_EXTI_11 CTL1_ETSRC(6) /*!< external interrupt line 11 */ +#define ADC0_1_2_EXTTRIG_REGULAR_NONE CTL1_ETSRC(7) /*!< software trigger */ + +#define ADC2_EXTTRIG_REGULAR_T2_CH0 CTL1_ETSRC(0) /*!< timer 2 CC0 event select */ +#define ADC2_EXTTRIG_REGULAR_T1_CH2 CTL1_ETSRC(1) /*!< timer 1 CC2 event select */ +#define ADC2_EXTTRIG_REGULAR_T0_CH2 CTL1_ETSRC(2) /*!< timer 0 CC2 event select */ +#define ADC2_EXTTRIG_REGULAR_T7_CH0 CTL1_ETSRC(3) /*!< timer 7 CC0 event select */ +#define ADC2_EXTTRIG_REGULAR_T7_TRGO CTL1_ETSRC(4) /*!< timer 7 TRGO event select */ +#define ADC2_EXTTRIG_REGULAR_T4_CH0 CTL1_ETSRC(5) /*!< timer 4 CC0 event select */ +#define ADC2_EXTTRIG_REGULAR_T4_CH2 CTL1_ETSRC(6) /*!< timer 4 CC2 event select */ + +/* ADC external trigger select for inserted channel */ +#define CTL1_ETSIC(regval) (BITS(12,14) & ((uint32_t)(regval) << 12)) /*!< write value to ADC_CTL1_ETSIC bit field */ +#define ADC0_1_EXTTRIG_INSERTED_T0_TRGO CTL1_ETSIC(0) /*!< timer 0 TRGO event select */ +#define ADC0_1_EXTTRIG_INSERTED_T0_CH3 CTL1_ETSIC(1) /*!< timer 0 CC3 event select */ +#define ADC0_1_EXTTRIG_INSERTED_T1_TRGO CTL1_ETSIC(2) /*!< timer 1 TRGO event select */ +#define ADC0_1_EXTTRIG_INSERTED_T1_CH0 CTL1_ETSIC(3) /*!< timer 1 CC0 event select */ +#define ADC0_1_EXTTRIG_INSERTED_T2_CH3 CTL1_ETSIC(4) /*!< timer 2 CC3 event select */ +#define ADC0_1_EXTTRIG_INSERTED_T3_TRGO CTL1_ETSIC(5) /*!< timer 3 TRGO event select */ +#define ADC0_1_EXTTRIG_INSERTED_EXTI_15 CTL1_ETSIC(6) /*!< external interrupt line 15 */ +#define ADC0_1_EXTTRIG_INSERTED_T7_CH3 CTL1_ETSIC(6) /*!< timer 7 CC3 event select */ +#define ADC0_1_2_EXTTRIG_INSERTED_NONE CTL1_ETSIC(7) /*!< software trigger */ + +#define ADC2_EXTTRIG_INSERTED_T0_TRGO CTL1_ETSIC(0) /*!< timer 0 TRGO event select */ +#define ADC2_EXTTRIG_INSERTED_T0_CH3 CTL1_ETSIC(1) /*!< timer 0 CC3 event select */ +#define ADC2_EXTTRIG_INSERTED_T3_CH2 CTL1_ETSIC(2) /*!< timer 3 CC2 event select */ +#define ADC2_EXTTRIG_INSERTED_T7_CH1 CTL1_ETSIC(3) /*!< timer 7 CC1 event select */ +#define ADC2_EXTTRIG_INSERTED_T7_CH3 CTL1_ETSIC(4) /*!< timer 7 CC3 event select */ +#define ADC2_EXTTRIG_INSERTED_T4_TRGO CTL1_ETSIC(5) /*!< timer 4 TRGO event select */ +#define ADC2_EXTTRIG_INSERTED_T4_CH3 CTL1_ETSIC(6) /*!< timer 4 CC3 event select */ + +/* ADC channel sample time */ +#define SAMPTX_SPT(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_SAMPTX_SPT bit field */ +#define ADC_SAMPLETIME_1POINT5 SAMPTX_SPT(0) /*!< 1.5 sampling cycles */ +#define ADC_SAMPLETIME_7POINT5 SAMPTX_SPT(1) /*!< 7.5 sampling cycles */ +#define ADC_SAMPLETIME_13POINT5 SAMPTX_SPT(2) /*!< 13.5 sampling cycles */ +#define ADC_SAMPLETIME_28POINT5 SAMPTX_SPT(3) /*!< 28.5 sampling cycles */ +#define ADC_SAMPLETIME_41POINT5 SAMPTX_SPT(4) /*!< 41.5 sampling cycles */ +#define ADC_SAMPLETIME_55POINT5 SAMPTX_SPT(5) /*!< 55.5 sampling cycles */ +#define ADC_SAMPLETIME_71POINT5 SAMPTX_SPT(6) /*!< 71.5 sampling cycles */ +#define ADC_SAMPLETIME_239POINT5 SAMPTX_SPT(7) /*!< 239.5 sampling cycles */ + +/* adc_ioffx register value */ +#define IOFFX_IOFF(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_IOFFX_IOFF bit field */ + +/* adc_wdht register value */ +#define WDHT_WDHT(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_WDHT_WDHT bit field */ + +/* adc_wdlt register value */ +#define WDLT_WDLT(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_WDLT_WDLT bit field */ + +/* adc_rsqx register value */ +#define RSQ0_RL(regval) (BITS(20,23) & ((uint32_t)(regval) << 20)) /*!< write value to ADC_RSQ0_RL bit field */ + +/* adc_isq register value */ +#define ISQ_IL(regval) (BITS(20,21) & ((uint32_t)(regval) << 20)) /*!< write value to ADC_ISQ_IL bit field */ + +/* adc_ovsampctl register value */ +/* ADC resolution */ +#define OVSAMPCTL_DRES(regval) (BITS(12,13) & ((uint32_t)(regval) << 12)) /*!< write value to ADC_OVSAMPCTL_DRES bit field */ +#define ADC_RESOLUTION_12B OVSAMPCTL_DRES(0) /*!< 12-bit ADC resolution */ +#define ADC_RESOLUTION_10B OVSAMPCTL_DRES(1) /*!< 10-bit ADC resolution */ +#define ADC_RESOLUTION_8B OVSAMPCTL_DRES(2) /*!< 8-bit ADC resolution */ +#define ADC_RESOLUTION_6B OVSAMPCTL_DRES(3) /*!< 6-bit ADC resolution */ + +/* oversampling shift */ +#define OVSAMPCTL_OVSS(regval) (BITS(5,8) & ((uint32_t)(regval) << 5)) /*!< write value to ADC_OVSAMPCTL_OVSS bit field */ +#define ADC_OVERSAMPLING_SHIFT_NONE OVSAMPCTL_OVSS(0) /*!< no oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_1B OVSAMPCTL_OVSS(1) /*!< 1-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_2B OVSAMPCTL_OVSS(2) /*!< 2-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_3B OVSAMPCTL_OVSS(3) /*!< 3-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_4B OVSAMPCTL_OVSS(4) /*!< 4-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_5B OVSAMPCTL_OVSS(5) /*!< 5-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_6B OVSAMPCTL_OVSS(6) /*!< 6-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_7B OVSAMPCTL_OVSS(7) /*!< 7-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_8B OVSAMPCTL_OVSS(8) /*!< 8-bit oversampling shift */ + +/* oversampling ratio */ +#define OVSAMPCTL_OVSR(regval) (BITS(2,4) & ((uint32_t)(regval) << 2)) /*!< write value to ADC_OVSAMPCTL_OVSR bit field */ +#define ADC_OVERSAMPLING_RATIO_MUL2 OVSAMPCTL_OVSR(0) /*!< oversampling ratio multiple 2 */ +#define ADC_OVERSAMPLING_RATIO_MUL4 OVSAMPCTL_OVSR(1) /*!< oversampling ratio multiple 4 */ +#define ADC_OVERSAMPLING_RATIO_MUL8 OVSAMPCTL_OVSR(2) /*!< oversampling ratio multiple 8 */ +#define ADC_OVERSAMPLING_RATIO_MUL16 OVSAMPCTL_OVSR(3) /*!< oversampling ratio multiple 16 */ +#define ADC_OVERSAMPLING_RATIO_MUL32 OVSAMPCTL_OVSR(4) /*!< oversampling ratio multiple 32 */ +#define ADC_OVERSAMPLING_RATIO_MUL64 OVSAMPCTL_OVSR(5) /*!< oversampling ratio multiple 64 */ +#define ADC_OVERSAMPLING_RATIO_MUL128 OVSAMPCTL_OVSR(6) /*!< oversampling ratio multiple 128 */ +#define ADC_OVERSAMPLING_RATIO_MUL256 OVSAMPCTL_OVSR(7) /*!< oversampling ratio multiple 256 */ + +/* triggered oversampling */ +#define ADC_OVERSAMPLING_ALL_CONVERT ((uint32_t)0x00000000U) /*!< all oversampled conversions for a channel are done consecutively after a trigger */ +#define ADC_OVERSAMPLING_ONE_CONVERT ADC_OVSAMPCTL_TOVS /*!< each oversampled conversion for a channel needs a trigger */ + +/* ADC channel group definitions */ +#define ADC_REGULAR_CHANNEL ((uint8_t)0x01U) /*!< adc regular channel group */ +#define ADC_INSERTED_CHANNEL ((uint8_t)0x02U) /*!< adc inserted channel group */ +#define ADC_REGULAR_INSERTED_CHANNEL ((uint8_t)0x03U) /*!< both regular and inserted channel group */ + +#define ADC_CHANNEL_DISCON_DISABLE ((uint8_t)0x04U) /*!< disable discontinuous mode of regular & inserted channel */ + +/* ADC inserted channel definitions */ +#define ADC_INSERTED_CHANNEL_0 ((uint8_t)0x00U) /*!< adc inserted channel 0 */ +#define ADC_INSERTED_CHANNEL_1 ((uint8_t)0x01U) /*!< adc inserted channel 1 */ +#define ADC_INSERTED_CHANNEL_2 ((uint8_t)0x02U) /*!< adc inserted channel 2 */ +#define ADC_INSERTED_CHANNEL_3 ((uint8_t)0x03U) /*!< adc inserted channel 3 */ + +/* ADC channel definitions */ +#define ADC_CHANNEL_0 ((uint8_t)0x00U) /*!< ADC channel 0 */ +#define ADC_CHANNEL_1 ((uint8_t)0x01U) /*!< ADC channel 1 */ +#define ADC_CHANNEL_2 ((uint8_t)0x02U) /*!< ADC channel 2 */ +#define ADC_CHANNEL_3 ((uint8_t)0x03U) /*!< ADC channel 3 */ +#define ADC_CHANNEL_4 ((uint8_t)0x04U) /*!< ADC channel 4 */ +#define ADC_CHANNEL_5 ((uint8_t)0x05U) /*!< ADC channel 5 */ +#define ADC_CHANNEL_6 ((uint8_t)0x06U) /*!< ADC channel 6 */ +#define ADC_CHANNEL_7 ((uint8_t)0x07U) /*!< ADC channel 7 */ +#define ADC_CHANNEL_8 ((uint8_t)0x08U) /*!< ADC channel 8 */ +#define ADC_CHANNEL_9 ((uint8_t)0x09U) /*!< ADC channel 9 */ +#define ADC_CHANNEL_10 ((uint8_t)0x0AU) /*!< ADC channel 10 */ +#define ADC_CHANNEL_11 ((uint8_t)0x0BU) /*!< ADC channel 11 */ +#define ADC_CHANNEL_12 ((uint8_t)0x0CU) /*!< ADC channel 12 */ +#define ADC_CHANNEL_13 ((uint8_t)0x0DU) /*!< ADC channel 13 */ +#define ADC_CHANNEL_14 ((uint8_t)0x0EU) /*!< ADC channel 14 */ +#define ADC_CHANNEL_15 ((uint8_t)0x0FU) /*!< ADC channel 15 */ +#define ADC_CHANNEL_16 ((uint8_t)0x10U) /*!< ADC channel 16 */ +#define ADC_CHANNEL_17 ((uint8_t)0x11U) /*!< ADC channel 17 */ + +/* ADC interrupt */ +#define ADC_INT_WDE ADC_STAT_WDE /*!< analog watchdog event interrupt */ +#define ADC_INT_EOC ADC_STAT_EOC /*!< end of group conversion interrupt */ +#define ADC_INT_EOIC ADC_STAT_EOIC /*!< end of inserted group conversion interrupt */ + +/* ADC interrupt flag */ +#define ADC_INT_FLAG_WDE ADC_STAT_WDE /*!< analog watchdog event interrupt flag */ +#define ADC_INT_FLAG_EOC ADC_STAT_EOC /*!< end of group conversion interrupt flag */ +#define ADC_INT_FLAG_EOIC ADC_STAT_EOIC /*!< end of inserted group conversion interrupt flag */ + +/* function declarations */ +/* reset ADC */ +void adc_deinit(uint32_t adc_periph); +/* enable ADC interface */ +void adc_enable(uint32_t adc_periph); +/* disable ADC interface */ +void adc_disable(uint32_t adc_periph); +/* ADC calibration and reset calibration */ +void adc_calibration_enable(uint32_t adc_periph); +/* enable DMA request */ +void adc_dma_mode_enable(uint32_t adc_periph); +/* disable DMA request */ +void adc_dma_mode_disable(uint32_t adc_periph); +/* enable the temperature sensor and Vrefint channel */ +void adc_tempsensor_vrefint_enable(void); +/* disable the temperature sensor and Vrefint channel */ +void adc_tempsensor_vrefint_disable(void); + +/* configure ADC resolution */ +void adc_resolution_config(uint32_t adc_periph , uint32_t resolution); +/* configure ADC discontinuous mode */ +void adc_discontinuous_mode_config(uint32_t adc_periph , uint8_t adc_channel_group , uint8_t length); + +/* configure the ADC mode */ +void adc_mode_config(uint32_t mode); +/* enable or disable ADC special function */ +void adc_special_function_config(uint32_t adc_periph , uint32_t function , ControlStatus newvalue); +/* configure ADC data alignment */ +void adc_data_alignment_config(uint32_t adc_periph , uint32_t data_alignment); +/* configure the length of regular channel group or inserted channel group */ +void adc_channel_length_config(uint32_t adc_periph , uint8_t adc_channel_group , uint32_t length); +/* configure ADC regular channel */ +void adc_regular_channel_config(uint32_t adc_periph , uint8_t rank , uint8_t adc_channel , uint32_t sample_time); +/* configure ADC inserted channel */ +void adc_inserted_channel_config(uint32_t adc_periph , uint8_t rank , uint8_t adc_channel , uint32_t sample_time); +/* configure ADC inserted channel offset */ +void adc_inserted_channel_offset_config(uint32_t adc_periph , uint8_t inserted_channel , uint16_t offset); +/* enable ADC external trigger */ +void adc_external_trigger_config(uint32_t adc_periph, uint8_t adc_channel_group, ControlStatus newvalue); +/* configure ADC external trigger source */ +void adc_external_trigger_source_config(uint32_t adc_periph, uint8_t adc_channel_group, uint32_t external_trigger_source); +/* enable ADC software trigger */ +void adc_software_trigger_enable(uint32_t adc_periph , uint8_t adc_channel_group); + +/* read ADC regular group data register */ +uint16_t adc_regular_data_read(uint32_t adc_periph); +/* read ADC inserted group data register */ +uint16_t adc_inserted_data_read(uint32_t adc_periph , uint8_t inserted_channel); +/* read the last ADC0 and ADC1 conversion result data in sync mode */ +uint32_t adc_sync_mode_convert_value_read(void); + +/* get the ADC flag bits */ +FlagStatus adc_flag_get(uint32_t adc_periph , uint32_t adc_flag); +/* clear the ADC flag bits */ +void adc_flag_clear(uint32_t adc_periph , uint32_t adc_flag); +/* get the ADC interrupt bits */ +FlagStatus adc_interrupt_flag_get(uint32_t adc_periph , uint32_t adc_interrupt); +/* clear the ADC flag */ +void adc_interrupt_flag_clear(uint32_t adc_periph , uint32_t adc_interrupt); +/* enable ADC interrupt */ +void adc_interrupt_enable(uint32_t adc_periph , uint32_t adc_interrupt); +/* disable ADC interrupt */ +void adc_interrupt_disable(uint32_t adc_periph , uint32_t adc_interrupt); + +/* configure ADC analog watchdog single channel */ +void adc_watchdog_single_channel_enable(uint32_t adc_periph, uint8_t adc_channel); +/* configure ADC analog watchdog group channel */ +void adc_watchdog_group_channel_enable(uint32_t adc_periph, uint8_t adc_channel_group); +/* disable ADC analog watchdog */ +void adc_watchdog_disable(uint32_t adc_periph); +/* configure ADC analog watchdog threshold */ +void adc_watchdog_threshold_config(uint32_t adc_periph , uint16_t low_threshold , uint16_t high_threshold); + +/* configure ADC oversample mode */ +void adc_oversample_mode_config(uint32_t adc_periph , uint32_t mode , uint16_t shift , uint8_t ratio); +/* enable ADC oversample mode */ +void adc_oversample_mode_enable(uint32_t adc_periph); +/* disable ADC oversample mode */ +void adc_oversample_mode_disable(uint32_t adc_periph); +#endif /* GD32F30X_ADC_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_bkp.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_bkp.h new file mode 100644 index 0000000..215a8f9 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_bkp.h @@ -0,0 +1,244 @@ +/*! + \file gd32f30x_bkp.h + \brief definitions for the BKP + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_BKP_H +#define GD32F30X_BKP_H + +#include "gd32f30x.h" + +/* BKP definitions */ +#define BKP BKP_BASE /*!< BKP base address */ + +/* registers definitions */ +#define BKP_DATA0 REG16((BKP) + 0x04U) /*!< BKP data register 0 */ +#define BKP_DATA1 REG16((BKP) + 0x08U) /*!< BKP data register 1 */ +#define BKP_DATA2 REG16((BKP) + 0x0CU) /*!< BKP data register 2 */ +#define BKP_DATA3 REG16((BKP) + 0x10U) /*!< BKP data register 3 */ +#define BKP_DATA4 REG16((BKP) + 0x14U) /*!< BKP data register 4 */ +#define BKP_DATA5 REG16((BKP) + 0x18U) /*!< BKP data register 5 */ +#define BKP_DATA6 REG16((BKP) + 0x1CU) /*!< BKP data register 6 */ +#define BKP_DATA7 REG16((BKP) + 0x20U) /*!< BKP data register 7 */ +#define BKP_DATA8 REG16((BKP) + 0x24U) /*!< BKP data register 8 */ +#define BKP_DATA9 REG16((BKP) + 0x28U) /*!< BKP data register 9 */ +#define BKP_DATA10 REG16((BKP) + 0x40U) /*!< BKP data register 10 */ +#define BKP_DATA11 REG16((BKP) + 0x44U) /*!< BKP data register 11 */ +#define BKP_DATA12 REG16((BKP) + 0x48U) /*!< BKP data register 12 */ +#define BKP_DATA13 REG16((BKP) + 0x4CU) /*!< BKP data register 13 */ +#define BKP_DATA14 REG16((BKP) + 0x50U) /*!< BKP data register 14 */ +#define BKP_DATA15 REG16((BKP) + 0x54U) /*!< BKP data register 15 */ +#define BKP_DATA16 REG16((BKP) + 0x58U) /*!< BKP data register 16 */ +#define BKP_DATA17 REG16((BKP) + 0x5CU) /*!< BKP data register 17 */ +#define BKP_DATA18 REG16((BKP) + 0x60U) /*!< BKP data register 18 */ +#define BKP_DATA19 REG16((BKP) + 0x64U) /*!< BKP data register 19 */ +#define BKP_DATA20 REG16((BKP) + 0x68U) /*!< BKP data register 20 */ +#define BKP_DATA21 REG16((BKP) + 0x6CU) /*!< BKP data register 21 */ +#define BKP_DATA22 REG16((BKP) + 0x70U) /*!< BKP data register 22 */ +#define BKP_DATA23 REG16((BKP) + 0x74U) /*!< BKP data register 23 */ +#define BKP_DATA24 REG16((BKP) + 0x78U) /*!< BKP data register 24 */ +#define BKP_DATA25 REG16((BKP) + 0x7CU) /*!< BKP data register 25 */ +#define BKP_DATA26 REG16((BKP) + 0x80U) /*!< BKP data register 26 */ +#define BKP_DATA27 REG16((BKP) + 0x84U) /*!< BKP data register 27 */ +#define BKP_DATA28 REG16((BKP) + 0x88U) /*!< BKP data register 28 */ +#define BKP_DATA29 REG16((BKP) + 0x8CU) /*!< BKP data register 29 */ +#define BKP_DATA30 REG16((BKP) + 0x90U) /*!< BKP data register 30 */ +#define BKP_DATA31 REG16((BKP) + 0x94U) /*!< BKP data register 31 */ +#define BKP_DATA32 REG16((BKP) + 0x98U) /*!< BKP data register 32 */ +#define BKP_DATA33 REG16((BKP) + 0x9CU) /*!< BKP data register 33 */ +#define BKP_DATA34 REG16((BKP) + 0xA0U) /*!< BKP data register 34 */ +#define BKP_DATA35 REG16((BKP) + 0xA4U) /*!< BKP data register 35 */ +#define BKP_DATA36 REG16((BKP) + 0xA8U) /*!< BKP data register 36 */ +#define BKP_DATA37 REG16((BKP) + 0xACU) /*!< BKP data register 37 */ +#define BKP_DATA38 REG16((BKP) + 0xB0U) /*!< BKP data register 38 */ +#define BKP_DATA39 REG16((BKP) + 0xB4U) /*!< BKP data register 39 */ +#define BKP_DATA40 REG16((BKP) + 0xB8U) /*!< BKP data register 40 */ +#define BKP_DATA41 REG16((BKP) + 0xBCU) /*!< BKP data register 41 */ +#define BKP_OCTL REG16((BKP) + 0x2CU) /*!< RTC signal output control register */ +#define BKP_TPCTL REG16((BKP) + 0x30U) /*!< tamper pin control register */ +#define BKP_TPCS REG16((BKP) + 0x34U) /*!< tamper control and status register */ + +/* bits definitions */ +/* BKP_DATA */ +#define BKP_DATA BITS(0,15) /*!< backup data */ + +/* BKP_OCTL */ +#define BKP_OCTL_RCCV BITS(0,6) /*!< RTC clock calibration value */ +#define BKP_OCTL_COEN BIT(7) /*!< RTC clock calibration output enable */ +#define BKP_OCTL_ASOEN BIT(8) /*!< RTC alarm or second signal output enable */ +#define BKP_OCTL_ROSEL BIT(9) /*!< RTC output selection */ +#define BKP_OCTL_CCOSEL BIT(14) /*!< RTC clock output selection */ +#define BKP_OCTL_CALDIR BIT(15) /*!< RTC clock calibration direction */ + +/* BKP_TPCTL */ +#define BKP_TPCTL_TPEN BIT(0) /*!< tamper detection enable */ +#define BKP_TPCTL_TPAL BIT(1) /*!< tamper pin active level */ + +/* BKP_TPCS */ +#define BKP_TPCS_TER BIT(0) /*!< tamper event reset */ +#define BKP_TPCS_TIR BIT(1) /*!< tamper interrupt reset */ +#define BKP_TPCS_TPIE BIT(2) /*!< tamper interrupt enable */ +#define BKP_TPCS_TEF BIT(8) /*!< tamper event flag */ +#define BKP_TPCS_TIF BIT(9) /*!< tamper interrupt flag */ + +/* constants definitions */ +/* BKP register */ +#define BKP_DATA0_9(number) REG16((BKP) + 0x04U + (number) * 0x04U) +#define BKP_DATA10_41(number) REG16((BKP) + 0x40U + ((number)-10U) * 0x04U) + +/* get data of BKP data register */ +#define BKP_DATA_GET(regval) GET_BITS((uint32_t)(regval), 0, 15) + +/* RTC clock calibration value */ +#define OCTL_RCCV(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) + +/* RTC output selection */ +#define RTC_OUTPUT_ALARM_PULSE ((uint16_t)0x0000U) /*!< RTC alarm pulse is selected as the RTC output */ +#define RTC_OUTPUT_SECOND_PULSE ((uint16_t)0x0200U) /*!< RTC second pulse is selected as the RTC output */ + +/* RTC clock output selection */ +#define RTC_CLOCK_DIV_64 ((uint16_t)0x0000U) /*!< RTC clock div 64 */ +#define RTC_CLOCK_DIV_1 ((uint16_t)0x4000U) /*!< RTC clock div 1 */ + +/* RTC clock calibration direction */ +#define RTC_CLOCK_SLOWED_DOWN ((uint16_t)0x0000U) /*!< RTC clock slow down */ +#define RTC_CLOCK_SPEED_UP ((uint16_t)0x8000U) /*!< RTC clock speed up */ + +/* tamper pin active level */ +#define TAMPER_PIN_ACTIVE_HIGH ((uint16_t)0x0000U) /*!< the tamper pin is active high */ +#define TAMPER_PIN_ACTIVE_LOW ((uint16_t)0x0002U) /*!< the tamper pin is active low */ + +/* tamper flag */ +#define BKP_FLAG_TAMPER BKP_TPCS_TEF /*!< tamper event flag */ + +/* tamper interrupt flag */ +#define BKP_INT_FLAG_TAMPER BKP_TPCS_TIF /*!< tamper interrupt flag */ + +/* BKP data register number */ +typedef enum +{ + BKP_DATA_0 = 1, /*!< BKP data register 0 */ + BKP_DATA_1, /*!< BKP data register 1 */ + BKP_DATA_2, /*!< BKP data register 2 */ + BKP_DATA_3, /*!< BKP data register 3 */ + BKP_DATA_4, /*!< BKP data register 4 */ + BKP_DATA_5, /*!< BKP data register 5 */ + BKP_DATA_6, /*!< BKP data register 6 */ + BKP_DATA_7, /*!< BKP data register 7 */ + BKP_DATA_8, /*!< BKP data register 8 */ + BKP_DATA_9, /*!< BKP data register 9 */ + BKP_DATA_10, /*!< BKP data register 10 */ + BKP_DATA_11, /*!< BKP data register 11 */ + BKP_DATA_12, /*!< BKP data register 12 */ + BKP_DATA_13, /*!< BKP data register 13 */ + BKP_DATA_14, /*!< BKP data register 14 */ + BKP_DATA_15, /*!< BKP data register 15 */ + BKP_DATA_16, /*!< BKP data register 16 */ + BKP_DATA_17, /*!< BKP data register 17 */ + BKP_DATA_18, /*!< BKP data register 18 */ + BKP_DATA_19, /*!< BKP data register 19 */ + BKP_DATA_20, /*!< BKP data register 20 */ + BKP_DATA_21, /*!< BKP data register 21 */ + BKP_DATA_22, /*!< BKP data register 22 */ + BKP_DATA_23, /*!< BKP data register 23 */ + BKP_DATA_24, /*!< BKP data register 24 */ + BKP_DATA_25, /*!< BKP data register 25 */ + BKP_DATA_26, /*!< BKP data register 26 */ + BKP_DATA_27, /*!< BKP data register 27 */ + BKP_DATA_28, /*!< BKP data register 28 */ + BKP_DATA_29, /*!< BKP data register 29 */ + BKP_DATA_30, /*!< BKP data register 30 */ + BKP_DATA_31, /*!< BKP data register 31 */ + BKP_DATA_32, /*!< BKP data register 32 */ + BKP_DATA_33, /*!< BKP data register 33 */ + BKP_DATA_34, /*!< BKP data register 34 */ + BKP_DATA_35, /*!< BKP data register 35 */ + BKP_DATA_36, /*!< BKP data register 36 */ + BKP_DATA_37, /*!< BKP data register 37 */ + BKP_DATA_38, /*!< BKP data register 38 */ + BKP_DATA_39, /*!< BKP data register 39 */ + BKP_DATA_40, /*!< BKP data register 40 */ + BKP_DATA_41, /*!< BKP data register 41 */ +}bkp_data_register_enum; + +/* function declarations */ +/* reset BKP registers */ +void bkp_deinit(void); +/* write BKP data register */ +void bkp_write_data(bkp_data_register_enum register_number, uint16_t data); +/* read BKP data register */ +uint16_t bkp_read_data(bkp_data_register_enum register_number); + +/* RTC related functions */ +/* enable RTC clock calibration output */ +void bkp_rtc_calibration_output_enable(void); +/* disable RTC clock calibration output */ +void bkp_rtc_calibration_output_disable(void); +/* enable RTC alarm or second signal output */ +void bkp_rtc_signal_output_enable(void); +/* disable RTC alarm or second signal output */ +void bkp_rtc_signal_output_disable(void); +/* RTC output selection */ +void bkp_rtc_output_select(uint16_t outputsel); +/* RTC clock output selection */ +void bkp_rtc_clock_output_select(uint16_t clocksel); +/* RTC clock calibration direction */ +void bkp_rtc_clock_calibration_direction(uint16_t direction); +/* set RTC clock calibration value */ +void bkp_rtc_calibration_value_set(uint8_t value); + +/* tamper pin related functions */ +/* enable tamper pin detection */ +void bkp_tamper_detection_enable(void); +/* disable tamper pin detection */ +void bkp_tamper_detection_disable(void); +/* set tamper pin active level */ +void bkp_tamper_active_level_set(uint16_t level); +/* enable tamper pin interrupt */ +void bkp_tamper_interrupt_enable(void); +/* disable tamper pin interrupt */ +void bkp_tamper_interrupt_disable(void); + +/* flag functions */ +/* get BKP flag state */ +FlagStatus bkp_flag_get(uint16_t flag); +/* clear BKP flag state */ +void bkp_flag_clear(uint16_t flag); +/* get BKP interrupt flag state */ +FlagStatus bkp_interrupt_flag_get(uint16_t flag); +/* clear BKP interrupt flag state */ +void bkp_interrupt_flag_clear(uint16_t flag); + +#endif /* GD32F30X_BKP_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_can.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_can.h new file mode 100644 index 0000000..dc74966 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_can.h @@ -0,0 +1,754 @@ +/*! + \file gd32f30x_can.h + \brief definitions for the CAN + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2019-11-27, V2.0.1, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_CAN_H +#define GD32F30X_CAN_H + +#include "gd32f30x.h" + +/* CAN definitions */ +#define CAN0 CAN_BASE /*!< CAN0 base address */ +#define CAN1 (CAN0 + 0x00000400U) /*!< CAN1 base address */ + +/* registers definitions */ +#define CAN_CTL(canx) REG32((canx) + 0x00U) /*!< CAN control register */ +#define CAN_STAT(canx) REG32((canx) + 0x04U) /*!< CAN status register */ +#define CAN_TSTAT(canx) REG32((canx) + 0x08U) /*!< CAN transmit status register*/ +#define CAN_RFIFO0(canx) REG32((canx) + 0x0CU) /*!< CAN receive FIFO0 register */ +#define CAN_RFIFO1(canx) REG32((canx) + 0x10U) /*!< CAN receive FIFO1 register */ +#define CAN_INTEN(canx) REG32((canx) + 0x14U) /*!< CAN interrupt enable register */ +#define CAN_ERR(canx) REG32((canx) + 0x18U) /*!< CAN error register */ +#define CAN_BT(canx) REG32((canx) + 0x1CU) /*!< CAN bit timing register */ +#define CAN_TMI0(canx) REG32((canx) + 0x180U) /*!< CAN transmit mailbox0 identifier register */ +#define CAN_TMP0(canx) REG32((canx) + 0x184U) /*!< CAN transmit mailbox0 property register */ +#define CAN_TMDATA00(canx) REG32((canx) + 0x188U) /*!< CAN transmit mailbox0 data0 register */ +#define CAN_TMDATA10(canx) REG32((canx) + 0x18CU) /*!< CAN transmit mailbox0 data1 register */ +#define CAN_TMI1(canx) REG32((canx) + 0x190U) /*!< CAN transmit mailbox1 identifier register */ +#define CAN_TMP1(canx) REG32((canx) + 0x194U) /*!< CAN transmit mailbox1 property register */ +#define CAN_TMDATA01(canx) REG32((canx) + 0x198U) /*!< CAN transmit mailbox1 data0 register */ +#define CAN_TMDATA11(canx) REG32((canx) + 0x19CU) /*!< CAN transmit mailbox1 data1 register */ +#define CAN_TMI2(canx) REG32((canx) + 0x1A0U) /*!< CAN transmit mailbox2 identifier register */ +#define CAN_TMP2(canx) REG32((canx) + 0x1A4U) /*!< CAN transmit mailbox2 property register */ +#define CAN_TMDATA02(canx) REG32((canx) + 0x1A8U) /*!< CAN transmit mailbox2 data0 register */ +#define CAN_TMDATA12(canx) REG32((canx) + 0x1ACU) /*!< CAN transmit mailbox2 data1 register */ +#define CAN_RFIFOMI0(canx) REG32((canx) + 0x1B0U) /*!< CAN receive FIFO0 mailbox identifier register */ +#define CAN_RFIFOMP0(canx) REG32((canx) + 0x1B4U) /*!< CAN receive FIFO0 mailbox property register */ +#define CAN_RFIFOMDATA00(canx) REG32((canx) + 0x1B8U) /*!< CAN receive FIFO0 mailbox data0 register */ +#define CAN_RFIFOMDATA10(canx) REG32((canx) + 0x1BCU) /*!< CAN receive FIFO0 mailbox data1 register */ +#define CAN_RFIFOMI1(canx) REG32((canx) + 0x1C0U) /*!< CAN receive FIFO1 mailbox identifier register */ +#define CAN_RFIFOMP1(canx) REG32((canx) + 0x1C4U) /*!< CAN receive FIFO1 mailbox property register */ +#define CAN_RFIFOMDATA01(canx) REG32((canx) + 0x1C8U) /*!< CAN receive FIFO1 mailbox data0 register */ +#define CAN_RFIFOMDATA11(canx) REG32((canx) + 0x1CCU) /*!< CAN receive FIFO1 mailbox data1 register */ +#define CAN_FCTL(canx) REG32((canx) + 0x200U) /*!< CAN filter control register */ +#define CAN_FMCFG(canx) REG32((canx) + 0x204U) /*!< CAN filter mode register */ +#define CAN_FSCFG(canx) REG32((canx) + 0x20CU) /*!< CAN filter scale register */ +#define CAN_FAFIFO(canx) REG32((canx) + 0x214U) /*!< CAN filter associated FIFO register */ +#define CAN_FW(canx) REG32((canx) + 0x21CU) /*!< CAN filter working register */ +#define CAN_F0DATA0(canx) REG32((canx) + 0x240U) /*!< CAN filter 0 data 0 register */ +#define CAN_F1DATA0(canx) REG32((canx) + 0x248U) /*!< CAN filter 1 data 0 register */ +#define CAN_F2DATA0(canx) REG32((canx) + 0x250U) /*!< CAN filter 2 data 0 register */ +#define CAN_F3DATA0(canx) REG32((canx) + 0x258U) /*!< CAN filter 3 data 0 register */ +#define CAN_F4DATA0(canx) REG32((canx) + 0x260U) /*!< CAN filter 4 data 0 register */ +#define CAN_F5DATA0(canx) REG32((canx) + 0x268U) /*!< CAN filter 5 data 0 register */ +#define CAN_F6DATA0(canx) REG32((canx) + 0x270U) /*!< CAN filter 6 data 0 register */ +#define CAN_F7DATA0(canx) REG32((canx) + 0x278U) /*!< CAN filter 7 data 0 register */ +#define CAN_F8DATA0(canx) REG32((canx) + 0x280U) /*!< CAN filter 8 data 0 register */ +#define CAN_F9DATA0(canx) REG32((canx) + 0x288U) /*!< CAN filter 9 data 0 register */ +#define CAN_F10DATA0(canx) REG32((canx) + 0x290U) /*!< CAN filter 10 data 0 register */ +#define CAN_F11DATA0(canx) REG32((canx) + 0x298U) /*!< CAN filter 11 data 0 register */ +#define CAN_F12DATA0(canx) REG32((canx) + 0x2A0U) /*!< CAN filter 12 data 0 register */ +#define CAN_F13DATA0(canx) REG32((canx) + 0x2A8U) /*!< CAN filter 13 data 0 register */ +#define CAN_F14DATA0(canx) REG32((canx) + 0x2B0U) /*!< CAN filter 14 data 0 register */ +#define CAN_F15DATA0(canx) REG32((canx) + 0x2B8U) /*!< CAN filter 15 data 0 register */ +#define CAN_F16DATA0(canx) REG32((canx) + 0x2C0U) /*!< CAN filter 16 data 0 register */ +#define CAN_F17DATA0(canx) REG32((canx) + 0x2C8U) /*!< CAN filter 17 data 0 register */ +#define CAN_F18DATA0(canx) REG32((canx) + 0x2D0U) /*!< CAN filter 18 data 0 register */ +#define CAN_F19DATA0(canx) REG32((canx) + 0x2D8U) /*!< CAN filter 19 data 0 register */ +#define CAN_F20DATA0(canx) REG32((canx) + 0x2E0U) /*!< CAN filter 20 data 0 register */ +#define CAN_F21DATA0(canx) REG32((canx) + 0x2E8U) /*!< CAN filter 21 data 0 register */ +#define CAN_F22DATA0(canx) REG32((canx) + 0x2F0U) /*!< CAN filter 22 data 0 register */ +#define CAN_F23DATA0(canx) REG32((canx) + 0x3F8U) /*!< CAN filter 23 data 0 register */ +#define CAN_F24DATA0(canx) REG32((canx) + 0x300U) /*!< CAN filter 24 data 0 register */ +#define CAN_F25DATA0(canx) REG32((canx) + 0x308U) /*!< CAN filter 25 data 0 register */ +#define CAN_F26DATA0(canx) REG32((canx) + 0x310U) /*!< CAN filter 26 data 0 register */ +#define CAN_F27DATA0(canx) REG32((canx) + 0x318U) /*!< CAN filter 27 data 0 register */ +#define CAN_F0DATA1(canx) REG32((canx) + 0x244U) /*!< CAN filter 0 data 1 register */ +#define CAN_F1DATA1(canx) REG32((canx) + 0x24CU) /*!< CAN filter 1 data 1 register */ +#define CAN_F2DATA1(canx) REG32((canx) + 0x254U) /*!< CAN filter 2 data 1 register */ +#define CAN_F3DATA1(canx) REG32((canx) + 0x25CU) /*!< CAN filter 3 data 1 register */ +#define CAN_F4DATA1(canx) REG32((canx) + 0x264U) /*!< CAN filter 4 data 1 register */ +#define CAN_F5DATA1(canx) REG32((canx) + 0x26CU) /*!< CAN filter 5 data 1 register */ +#define CAN_F6DATA1(canx) REG32((canx) + 0x274U) /*!< CAN filter 6 data 1 register */ +#define CAN_F7DATA1(canx) REG32((canx) + 0x27CU) /*!< CAN filter 7 data 1 register */ +#define CAN_F8DATA1(canx) REG32((canx) + 0x284U) /*!< CAN filter 8 data 1 register */ +#define CAN_F9DATA1(canx) REG32((canx) + 0x28CU) /*!< CAN filter 9 data 1 register */ +#define CAN_F10DATA1(canx) REG32((canx) + 0x294U) /*!< CAN filter 10 data 1 register */ +#define CAN_F11DATA1(canx) REG32((canx) + 0x29CU) /*!< CAN filter 11 data 1 register */ +#define CAN_F12DATA1(canx) REG32((canx) + 0x2A4U) /*!< CAN filter 12 data 1 register */ +#define CAN_F13DATA1(canx) REG32((canx) + 0x2ACU) /*!< CAN filter 13 data 1 register */ +#define CAN_F14DATA1(canx) REG32((canx) + 0x2B4U) /*!< CAN filter 14 data 1 register */ +#define CAN_F15DATA1(canx) REG32((canx) + 0x2BCU) /*!< CAN filter 15 data 1 register */ +#define CAN_F16DATA1(canx) REG32((canx) + 0x2C4U) /*!< CAN filter 16 data 1 register */ +#define CAN_F17DATA1(canx) REG32((canx) + 0x24CU) /*!< CAN filter 17 data 1 register */ +#define CAN_F18DATA1(canx) REG32((canx) + 0x2D4U) /*!< CAN filter 18 data 1 register */ +#define CAN_F19DATA1(canx) REG32((canx) + 0x2DCU) /*!< CAN filter 19 data 1 register */ +#define CAN_F20DATA1(canx) REG32((canx) + 0x2E4U) /*!< CAN filter 20 data 1 register */ +#define CAN_F21DATA1(canx) REG32((canx) + 0x2ECU) /*!< CAN filter 21 data 1 register */ +#define CAN_F22DATA1(canx) REG32((canx) + 0x2F4U) /*!< CAN filter 22 data 1 register */ +#define CAN_F23DATA1(canx) REG32((canx) + 0x2FCU) /*!< CAN filter 23 data 1 register */ +#define CAN_F24DATA1(canx) REG32((canx) + 0x304U) /*!< CAN filter 24 data 1 register */ +#define CAN_F25DATA1(canx) REG32((canx) + 0x30CU) /*!< CAN filter 25 data 1 register */ +#define CAN_F26DATA1(canx) REG32((canx) + 0x314U) /*!< CAN filter 26 data 1 register */ +#define CAN_F27DATA1(canx) REG32((canx) + 0x31CU) /*!< CAN filter 27 data 1 register */ + +/* CAN transmit mailbox bank */ +#define CAN_TMI(canx, bank) REG32((canx) + 0x180U + ((bank) * 0x10U)) /*!< CAN transmit mailbox identifier register */ +#define CAN_TMP(canx, bank) REG32((canx) + 0x184U + ((bank) * 0x10U)) /*!< CAN transmit mailbox property register */ +#define CAN_TMDATA0(canx, bank) REG32((canx) + 0x188U + ((bank) * 0x10U)) /*!< CAN transmit mailbox data0 register */ +#define CAN_TMDATA1(canx, bank) REG32((canx) + 0x18CU + ((bank) * 0x10U)) /*!< CAN transmit mailbox data1 register */ + +/* CAN filter bank */ +#define CAN_FDATA0(canx, bank) REG32((canx) + 0x240U + ((bank) * 0x8U) + 0x0U) /*!< CAN filter data 0 register */ +#define CAN_FDATA1(canx, bank) REG32((canx) + 0x240U + ((bank) * 0x8U) + 0x4U) /*!< CAN filter data 1 register */ + +/* CAN receive fifo mailbox bank */ +#define CAN_RFIFOMI(canx, bank) REG32((canx) + 0x1B0U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox identifier register */ +#define CAN_RFIFOMP(canx, bank) REG32((canx) + 0x1B4U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox property register */ +#define CAN_RFIFOMDATA0(canx, bank) REG32((canx) + 0x1B8U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox data0 register */ +#define CAN_RFIFOMDATA1(canx, bank) REG32((canx) + 0x1BCU + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox data1 register */ + +/* bits definitions */ +/* CAN_CTL */ +#define CAN_CTL_IWMOD BIT(0) /*!< initial working mode */ +#define CAN_CTL_SLPWMOD BIT(1) /*!< sleep working mode */ +#define CAN_CTL_TFO BIT(2) /*!< transmit FIFO order */ +#define CAN_CTL_RFOD BIT(3) /*!< receive FIFO overwrite disable */ +#define CAN_CTL_ARD BIT(4) /*!< automatic retransmission disable */ +#define CAN_CTL_AWU BIT(5) /*!< automatic wakeup */ +#define CAN_CTL_ABOR BIT(6) /*!< automatic bus-off recovery */ +#define CAN_CTL_TTC BIT(7) /*!< time triggered communication */ +#define CAN_CTL_SWRST BIT(15) /*!< CAN software reset */ +#define CAN_CTL_DFZ BIT(16) /*!< CAN debug freeze */ + +/* CAN_STAT */ +#define CAN_STAT_IWS BIT(0) /*!< initial working state */ +#define CAN_STAT_SLPWS BIT(1) /*!< sleep working state */ +#define CAN_STAT_ERRIF BIT(2) /*!< error interrupt flag*/ +#define CAN_STAT_WUIF BIT(3) /*!< status change interrupt flag of wakeup from sleep working mode */ +#define CAN_STAT_SLPIF BIT(4) /*!< status change interrupt flag of sleep working mode entering */ +#define CAN_STAT_TS BIT(8) /*!< transmitting state */ +#define CAN_STAT_RS BIT(9) /*!< receiving state */ +#define CAN_STAT_LASTRX BIT(10) /*!< last sample value of rx pin */ +#define CAN_STAT_RXL BIT(11) /*!< CAN rx signal */ + +/* CAN_TSTAT */ +#define CAN_TSTAT_MTF0 BIT(0) /*!< mailbox0 transmit finished */ +#define CAN_TSTAT_MTFNERR0 BIT(1) /*!< mailbox0 transmit finished and no error */ +#define CAN_TSTAT_MAL0 BIT(2) /*!< mailbox0 arbitration lost */ +#define CAN_TSTAT_MTE0 BIT(3) /*!< mailbox0 transmit error */ +#define CAN_TSTAT_MST0 BIT(7) /*!< mailbox0 stop transmitting */ +#define CAN_TSTAT_MTF1 BIT(8) /*!< mailbox1 transmit finished */ +#define CAN_TSTAT_MTFNERR1 BIT(9) /*!< mailbox1 transmit finished and no error */ +#define CAN_TSTAT_MAL1 BIT(10) /*!< mailbox1 arbitration lost */ +#define CAN_TSTAT_MTE1 BIT(11) /*!< mailbox1 transmit error */ +#define CAN_TSTAT_MST1 BIT(15) /*!< mailbox1 stop transmitting */ +#define CAN_TSTAT_MTF2 BIT(16) /*!< mailbox2 transmit finished */ +#define CAN_TSTAT_MTFNERR2 BIT(17) /*!< mailbox2 transmit finished and no error */ +#define CAN_TSTAT_MAL2 BIT(18) /*!< mailbox2 arbitration lost */ +#define CAN_TSTAT_MTE2 BIT(19) /*!< mailbox2 transmit error */ +#define CAN_TSTAT_MST2 BIT(23) /*!< mailbox2 stop transmitting */ +#define CAN_TSTAT_NUM BITS(24,25) /*!< mailbox number */ +#define CAN_TSTAT_TME0 BIT(26) /*!< transmit mailbox0 empty */ +#define CAN_TSTAT_TME1 BIT(27) /*!< transmit mailbox1 empty */ +#define CAN_TSTAT_TME2 BIT(28) /*!< transmit mailbox2 empty */ +#define CAN_TSTAT_TMLS0 BIT(29) /*!< last sending priority flag for mailbox0 */ +#define CAN_TSTAT_TMLS1 BIT(30) /*!< last sending priority flag for mailbox1 */ +#define CAN_TSTAT_TMLS2 BIT(31) /*!< last sending priority flag for mailbox2 */ + +/* CAN_RFIFO0 */ +#define CAN_RFIFO0_RFL0 BITS(0,1) /*!< receive FIFO0 length */ +#define CAN_RFIFO0_RFF0 BIT(3) /*!< receive FIFO0 full */ +#define CAN_RFIFO0_RFO0 BIT(4) /*!< receive FIFO0 overfull */ +#define CAN_RFIFO0_RFD0 BIT(5) /*!< receive FIFO0 dequeue */ + +/* CAN_RFIFO1 */ +#define CAN_RFIFO1_RFL1 BITS(0,1) /*!< receive FIFO1 length */ +#define CAN_RFIFO1_RFF1 BIT(3) /*!< receive FIFO1 full */ +#define CAN_RFIFO1_RFO1 BIT(4) /*!< receive FIFO1 overfull */ +#define CAN_RFIFO1_RFD1 BIT(5) /*!< receive FIFO1 dequeue */ + +/* CAN_INTEN */ +#define CAN_INTEN_TMEIE BIT(0) /*!< transmit mailbox empty interrupt enable */ +#define CAN_INTEN_RFNEIE0 BIT(1) /*!< receive FIFO0 not empty interrupt enable */ +#define CAN_INTEN_RFFIE0 BIT(2) /*!< receive FIFO0 full interrupt enable */ +#define CAN_INTEN_RFOIE0 BIT(3) /*!< receive FIFO0 overfull interrupt enable */ +#define CAN_INTEN_RFNEIE1 BIT(4) /*!< receive FIFO1 not empty interrupt enable */ +#define CAN_INTEN_RFFIE1 BIT(5) /*!< receive FIFO1 full interrupt enable */ +#define CAN_INTEN_RFOIE1 BIT(6) /*!< receive FIFO1 overfull interrupt enable */ +#define CAN_INTEN_WERRIE BIT(8) /*!< warning error interrupt enable */ +#define CAN_INTEN_PERRIE BIT(9) /*!< passive error interrupt enable */ +#define CAN_INTEN_BOIE BIT(10) /*!< bus-off interrupt enable */ +#define CAN_INTEN_ERRNIE BIT(11) /*!< error number interrupt enable */ +#define CAN_INTEN_ERRIE BIT(15) /*!< error interrupt enable */ +#define CAN_INTEN_WIE BIT(16) /*!< wakeup interrupt enable */ +#define CAN_INTEN_SLPWIE BIT(17) /*!< sleep working interrupt enable */ + +/* CAN_ERR */ +#define CAN_ERR_WERR BIT(0) /*!< warning error */ +#define CAN_ERR_PERR BIT(1) /*!< passive error */ +#define CAN_ERR_BOERR BIT(2) /*!< bus-off error */ +#define CAN_ERR_ERRN BITS(4,6) /*!< error number */ +#define CAN_ERR_TECNT BITS(16,23) /*!< transmit error count */ +#define CAN_ERR_RECNT BITS(24,31) /*!< receive error count */ + +/* CAN_BT */ +#define CAN_BT_BAUDPSC BITS(0,9) /*!< baudrate prescaler */ +#define CAN_BT_BS1 BITS(16,19) /*!< bit segment 1 */ +#define CAN_BT_BS2 BITS(20,22) /*!< bit segment 2 */ +#define CAN_BT_SJW BITS(24,25) /*!< resynchronization jump width */ +#define CAN_BT_LCMOD BIT(30) /*!< loopback communication mode */ +#define CAN_BT_SCMOD BIT(31) /*!< silent communication mode */ + +/* CAN_TMIx */ +#define CAN_TMI_TEN BIT(0) /*!< transmit enable */ +#define CAN_TMI_FT BIT(1) /*!< frame type */ +#define CAN_TMI_FF BIT(2) /*!< frame format */ +#define CAN_TMI_EFID BITS(3,31) /*!< the frame identifier */ +#define CAN_TMI_SFID BITS(21,31) /*!< the frame identifier */ + +/* CAN_TMPx */ +#define CAN_TMP_DLENC BITS(0,3) /*!< data length code */ +#define CAN_TMP_TSEN BIT(8) /*!< time stamp enable */ +#define CAN_TMP_TS BITS(16,31) /*!< time stamp */ + +/* CAN_TMDATA0x */ +#define CAN_TMDATA0_DB0 BITS(0,7) /*!< transmit data byte 0 */ +#define CAN_TMDATA0_DB1 BITS(8,15) /*!< transmit data byte 1 */ +#define CAN_TMDATA0_DB2 BITS(16,23) /*!< transmit data byte 2 */ +#define CAN_TMDATA0_DB3 BITS(24,31) /*!< transmit data byte 3 */ + +/* CAN_TMDATA1x */ +#define CAN_TMDATA1_DB4 BITS(0,7) /*!< transmit data byte 4 */ +#define CAN_TMDATA1_DB5 BITS(8,15) /*!< transmit data byte 5 */ +#define CAN_TMDATA1_DB6 BITS(16,23) /*!< transmit data byte 6 */ +#define CAN_TMDATA1_DB7 BITS(24,31) /*!< transmit data byte 7 */ + +/* CAN_RFIFOMIx */ +#define CAN_RFIFOMI_FT BIT(1) /*!< frame type */ +#define CAN_RFIFOMI_FF BIT(2) /*!< frame format */ +#define CAN_RFIFOMI_EFID BITS(3,31) /*!< the frame identifier */ +#define CAN_RFIFOMI_SFID BITS(21,31) /*!< the frame identifier */ + +/* CAN_RFIFOMPx */ +#define CAN_RFIFOMP_DLENC BITS(0,3) /*!< receive data length code */ +#define CAN_RFIFOMP_FI BITS(8,15) /*!< filter index */ +#define CAN_RFIFOMP_TS BITS(16,31) /*!< time stamp */ + +/* CAN_RFIFOMDATA0x */ +#define CAN_RFIFOMDATA0_DB0 BITS(0,7) /*!< receive data byte 0 */ +#define CAN_RFIFOMDATA0_DB1 BITS(8,15) /*!< receive data byte 1 */ +#define CAN_RFIFOMDATA0_DB2 BITS(16,23) /*!< receive data byte 2 */ +#define CAN_RFIFOMDATA0_DB3 BITS(24,31) /*!< receive data byte 3 */ + +/* CAN_RFIFOMDATA1x */ +#define CAN_RFIFOMDATA1_DB4 BITS(0,7) /*!< receive data byte 4 */ +#define CAN_RFIFOMDATA1_DB5 BITS(8,15) /*!< receive data byte 5 */ +#define CAN_RFIFOMDATA1_DB6 BITS(16,23) /*!< receive data byte 6 */ +#define CAN_RFIFOMDATA1_DB7 BITS(24,31) /*!< receive data byte 7 */ + +/* CAN_FCTL */ +#define CAN_FCTL_FLD BIT(0) /*!< filter lock disable */ +#define CAN_FCTL_HBC1F BITS(8,13) /*!< header bank of CAN1 filter */ + +/* CAN_FMCFG */ +#define CAN_FMCFG_FMOD(regval) BIT(regval) /*!< filter mode, list or mask*/ + +/* CAN_FSCFG */ +#define CAN_FSCFG_FS(regval) BIT(regval) /*!< filter scale, 32 bits or 16 bits*/ + +/* CAN_FAFIFO */ +#define CAN_FAFIFOR_FAF(regval) BIT(regval) /*!< filter associated with FIFO */ + +/* CAN_FW */ +#define CAN_FW_FW(regval) BIT(regval) /*!< filter working */ + +/* CAN_FxDATAy */ +#define CAN_FDATA_FD(regval) BIT(regval) /*!< filter data */ + +/* consts definitions */ +/* define the CAN bit position and its register index offset */ +#define CAN_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define CAN_REG_VAL(canx, offset) (REG32((canx) + ((uint32_t)(offset) >> 6))) +#define CAN_BIT_POS(val) ((uint32_t)(val) & 0x1FU) + +#define CAN_REGIDX_BITS(regidx, bitpos0, bitpos1) (((uint32_t)(regidx) << 12) | ((uint32_t)(bitpos0) << 6) | (uint32_t)(bitpos1)) +#define CAN_REG_VALS(canx, offset) (REG32((canx) + ((uint32_t)(offset) >> 12))) +#define CAN_BIT_POS0(val) (((uint32_t)(val) >> 6) & 0x1FU) +#define CAN_BIT_POS1(val) ((uint32_t)(val) & 0x1FU) + +/* register offset */ +#define STAT_REG_OFFSET ((uint8_t)0x04U) /*!< STAT register offset */ +#define TSTAT_REG_OFFSET ((uint8_t)0x08U) /*!< TSTAT register offset */ +#define RFIFO0_REG_OFFSET ((uint8_t)0x0CU) /*!< RFIFO0 register offset */ +#define RFIFO1_REG_OFFSET ((uint8_t)0x10U) /*!< RFIFO1 register offset */ +#define ERR_REG_OFFSET ((uint8_t)0x18U) /*!< ERR register offset */ + +/* CAN flags */ +typedef enum +{ + /* flags in STAT register */ + CAN_FLAG_RXL = CAN_REGIDX_BIT(STAT_REG_OFFSET, 11U), /*!< RX level */ + CAN_FLAG_LASTRX = CAN_REGIDX_BIT(STAT_REG_OFFSET, 10U), /*!< last sample value of RX pin */ + CAN_FLAG_RS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 9U), /*!< receiving state */ + CAN_FLAG_TS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 8U), /*!< transmitting state */ + CAN_FLAG_SLPIF = CAN_REGIDX_BIT(STAT_REG_OFFSET, 4U), /*!< status change flag of entering sleep working mode */ + CAN_FLAG_WUIF = CAN_REGIDX_BIT(STAT_REG_OFFSET, 3U), /*!< status change flag of wakeup from sleep working mode */ + CAN_FLAG_ERRIF = CAN_REGIDX_BIT(STAT_REG_OFFSET, 2U), /*!< error flag */ + CAN_FLAG_SLPWS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 1U), /*!< sleep working state */ + CAN_FLAG_IWS = CAN_REGIDX_BIT(STAT_REG_OFFSET, 0U), /*!< initial working state */ + /* flags in TSTAT register */ + CAN_FLAG_TMLS2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 31U), /*!< transmit mailbox 2 last sending in Tx FIFO */ + CAN_FLAG_TMLS1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 30U), /*!< transmit mailbox 1 last sending in Tx FIFO */ + CAN_FLAG_TMLS0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 29U), /*!< transmit mailbox 0 last sending in Tx FIFO */ + CAN_FLAG_TME2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 28U), /*!< transmit mailbox 2 empty */ + CAN_FLAG_TME1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 27U), /*!< transmit mailbox 1 empty */ + CAN_FLAG_TME0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 26U), /*!< transmit mailbox 0 empty */ + CAN_FLAG_MTE2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 19U), /*!< mailbox 2 transmit error */ + CAN_FLAG_MTE1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 11U), /*!< mailbox 1 transmit error */ + CAN_FLAG_MTE0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 3U), /*!< mailbox 0 transmit error */ + CAN_FLAG_MAL2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 18U), /*!< mailbox 2 arbitration lost */ + CAN_FLAG_MAL1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 10U), /*!< mailbox 1 arbitration lost */ + CAN_FLAG_MAL0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 2U), /*!< mailbox 0 arbitration lost */ + CAN_FLAG_MTFNERR2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 17U), /*!< mailbox 2 transmit finished with no error */ + CAN_FLAG_MTFNERR1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 9U), /*!< mailbox 1 transmit finished with no error */ + CAN_FLAG_MTFNERR0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 1U), /*!< mailbox 0 transmit finished with no error */ + CAN_FLAG_MTF2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 16U), /*!< mailbox 2 transmit finished */ + CAN_FLAG_MTF1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 8U), /*!< mailbox 1 transmit finished */ + CAN_FLAG_MTF0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 0U), /*!< mailbox 0 transmit finished */ + /* flags in RFIFO0 register */ + CAN_FLAG_RFO0 = CAN_REGIDX_BIT(RFIFO0_REG_OFFSET, 4U), /*!< receive FIFO0 overfull */ + CAN_FLAG_RFF0 = CAN_REGIDX_BIT(RFIFO0_REG_OFFSET, 3U), /*!< receive FIFO0 full */ + /* flags in RFIFO1 register */ + CAN_FLAG_RFO1 = CAN_REGIDX_BIT(RFIFO1_REG_OFFSET, 4U), /*!< receive FIFO1 overfull */ + CAN_FLAG_RFF1 = CAN_REGIDX_BIT(RFIFO1_REG_OFFSET, 3U), /*!< receive FIFO1 full */ + /* flags in ERR register */ + CAN_FLAG_BOERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 2U), /*!< bus-off error */ + CAN_FLAG_PERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 1U), /*!< passive error */ + CAN_FLAG_WERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 0U), /*!< warning error */ +}can_flag_enum; + +/* CAN interrupt flags */ +typedef enum +{ + /* interrupt flags in STAT register */ + CAN_INT_FLAG_SLPIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 4U, 17U), /*!< status change interrupt flag of sleep working mode entering */ + CAN_INT_FLAG_WUIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 3U, 16), /*!< status change interrupt flag of wakeup from sleep working mode */ + CAN_INT_FLAG_ERRIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 2U, 15), /*!< error interrupt flag */ + /* interrupt flags in TSTAT register */ + CAN_INT_FLAG_MTF2 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 16U, 0U), /*!< mailbox 2 transmit finished interrupt flag */ + CAN_INT_FLAG_MTF1 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 8U, 0U), /*!< mailbox 1 transmit finished interrupt flag */ + CAN_INT_FLAG_MTF0 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 0U, 0U), /*!< mailbox 0 transmit finished interrupt flag */ + /* interrupt flags in RFIFO0 register */ + CAN_INT_FLAG_RFO0 = CAN_REGIDX_BITS(RFIFO0_REG_OFFSET, 4U, 3U), /*!< receive FIFO0 overfull interrupt flag */ + CAN_INT_FLAG_RFF0 = CAN_REGIDX_BITS(RFIFO0_REG_OFFSET, 3U, 2U), /*!< receive FIFO0 full interrupt flag */ + CAN_INT_FLAG_RFL0 = CAN_REGIDX_BITS(RFIFO0_REG_OFFSET, 2U, 1U), /*!< receive FIFO0 not empty interrupt flag */ + /* interrupt flags in RFIFO0 register */ + CAN_INT_FLAG_RFO1 = CAN_REGIDX_BITS(RFIFO1_REG_OFFSET, 4U, 6U), /*!< receive FIFO1 overfull interrupt flag */ + CAN_INT_FLAG_RFF1 = CAN_REGIDX_BITS(RFIFO1_REG_OFFSET, 3U, 5U), /*!< receive FIFO1 full interrupt flag */ + CAN_INT_FLAG_RFL1 = CAN_REGIDX_BITS(RFIFO1_REG_OFFSET, 2U, 4U), /*!< receive FIFO1 not empty interrupt flag */ + /* interrupt flags in ERR register */ + CAN_INT_FLAG_ERRN = CAN_REGIDX_BITS(ERR_REG_OFFSET, 3U, 11U), /*!< error number interrupt flag */ + CAN_INT_FLAG_BOERR = CAN_REGIDX_BITS(ERR_REG_OFFSET, 2U, 10U), /*!< bus-off error interrupt flag */ + CAN_INT_FLAG_PERR = CAN_REGIDX_BITS(ERR_REG_OFFSET, 1U, 9U), /*!< passive error interrupt flag */ + CAN_INT_FLAG_WERR = CAN_REGIDX_BITS(ERR_REG_OFFSET, 0U, 8U), /*!< warning error interrupt flag */ +}can_interrupt_flag_enum; + +/* CAN initiliaze parameters struct */ +typedef struct +{ + uint8_t working_mode; /*!< CAN working mode */ + uint8_t resync_jump_width; /*!< CAN resynchronization jump width */ + uint8_t time_segment_1; /*!< time segment 1 */ + uint8_t time_segment_2; /*!< time segment 2 */ + ControlStatus time_triggered; /*!< time triggered communication mode */ + ControlStatus auto_bus_off_recovery; /*!< automatic bus-off recovery */ + ControlStatus auto_wake_up; /*!< automatic wake-up mode */ + ControlStatus no_auto_retrans; /*!< automatic retransmission mode disable */ + ControlStatus rec_fifo_overwrite; /*!< receive FIFO overwrite mode */ + ControlStatus trans_fifo_order; /*!< transmit FIFO order */ + uint16_t prescaler; /*!< baudrate prescaler */ +}can_parameter_struct; + +/* CAN transmit message struct */ +typedef struct +{ + uint32_t tx_sfid; /*!< standard format frame identifier */ + uint32_t tx_efid; /*!< extended format frame identifier */ + uint8_t tx_ff; /*!< format of frame, standard or extended format */ + uint8_t tx_ft; /*!< type of frame, data or remote */ + uint8_t tx_dlen; /*!< data length */ + uint8_t tx_data[8]; /*!< transmit data */ +}can_trasnmit_message_struct; + +/* CAN receive message struct */ +typedef struct +{ + uint32_t rx_sfid; /*!< standard format frame identifier */ + uint32_t rx_efid; /*!< extended format frame identifier */ + uint8_t rx_ff; /*!< format of frame, standard or extended format */ + uint8_t rx_ft; /*!< type of frame, data or remote */ + uint8_t rx_dlen; /*!< data length */ + uint8_t rx_data[8]; /*!< receive data */ + uint8_t rx_fi; /*!< filtering index */ +} can_receive_message_struct; + +/* CAN filter parameters struct */ +typedef struct +{ + uint16_t filter_list_high; /*!< filter list number high bits*/ + uint16_t filter_list_low; /*!< filter list number low bits */ + uint16_t filter_mask_high; /*!< filter mask number high bits */ + uint16_t filter_mask_low; /*!< filter mask number low bits */ + uint16_t filter_fifo_number; /*!< receive FIFO associated with the filter */ + uint16_t filter_number; /*!< filter number */ + uint16_t filter_mode; /*!< filter mode, list or mask */ + uint16_t filter_bits; /*!< filter scale */ + ControlStatus filter_enable; /*!< filter work or not */ +}can_filter_parameter_struct; + +/* CAN errors */ +typedef enum +{ + CAN_ERROR_NONE = 0, /*!< no error */ + CAN_ERROR_FILL, /*!< fill error */ + CAN_ERROR_FORMATE, /*!< format error */ + CAN_ERROR_ACK, /*!< ACK error */ + CAN_ERROR_BITRECESSIVE, /*!< bit recessive error */ + CAN_ERROR_BITDOMINANTER, /*!< bit dominant error */ + CAN_ERROR_CRC, /*!< CRC error */ + CAN_ERROR_SOFTWARECFG, /*!< software configure */ +}can_error_enum; + +/* transmit states */ +typedef enum +{ + CAN_TRANSMIT_FAILED = 0U, /*!< CAN transmitted failure */ + CAN_TRANSMIT_OK = 1U, /*!< CAN transmitted success */ + CAN_TRANSMIT_PENDING = 2U, /*!< CAN transmitted pending */ + CAN_TRANSMIT_NOMAILBOX = 4U, /*!< no empty mailbox to be used for CAN */ +}can_transmit_state_enum; + +typedef enum +{ + CAN_INIT_STRUCT = 0, /* CAN initiliaze parameters struct */ + CAN_FILTER_STRUCT, /* CAN filter parameters struct */ + CAN_TX_MESSAGE_STRUCT, /* CAN transmit message struct */ + CAN_RX_MESSAGE_STRUCT, /* CAN receive message struct */ +}can_struct_type_enum; + +/* CAN baudrate prescaler*/ +#define BT_BAUDPSC(regval) (BITS(0,9) & ((uint32_t)(regval) << 0)) + +/* CAN bit segment 1*/ +#define BT_BS1(regval) (BITS(16,19) & ((uint32_t)(regval) << 16)) + +/* CAN bit segment 2*/ +#define BT_BS2(regval) (BITS(20,22) & ((uint32_t)(regval) << 20)) + +/* CAN resynchronization jump width*/ +#define BT_SJW(regval) (BITS(24,25) & ((uint32_t)(regval) << 24)) + +/* CAN communication mode*/ +#define BT_MODE(regval) (BITS(30,31) & ((uint32_t)(regval) << 30)) + +/* CAN FDATA high 16 bits */ +#define FDATA_MASK_HIGH(regval) (BITS(16,31) & ((uint32_t)(regval) << 16)) + +/* CAN FDATA low 16 bits */ +#define FDATA_MASK_LOW(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) + +/* CAN1 filter start bank_number*/ +#define FCTL_HBC1F(regval) (BITS(8,13) & ((uint32_t)(regval) << 8)) + +/* CAN transmit mailbox extended identifier*/ +#define TMI_EFID(regval) (BITS(3,31) & ((uint32_t)(regval) << 3)) + +/* CAN transmit mailbox standard identifier*/ +#define TMI_SFID(regval) (BITS(21,31) & ((uint32_t)(regval) << 21)) + +/* transmit data byte 0 */ +#define TMDATA0_DB0(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) + +/* transmit data byte 1 */ +#define TMDATA0_DB1(regval) (BITS(8,15) & ((uint32_t)(regval) << 8)) + +/* transmit data byte 2 */ +#define TMDATA0_DB2(regval) (BITS(16,23) & ((uint32_t)(regval) << 16)) + +/* transmit data byte 3 */ +#define TMDATA0_DB3(regval) (BITS(24,31) & ((uint32_t)(regval) << 24)) + +/* transmit data byte 4 */ +#define TMDATA1_DB4(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) + +/* transmit data byte 5 */ +#define TMDATA1_DB5(regval) (BITS(8,15) & ((uint32_t)(regval) << 8)) + +/* transmit data byte 6 */ +#define TMDATA1_DB6(regval) (BITS(16,23) & ((uint32_t)(regval) << 16)) + +/* transmit data byte 7 */ +#define TMDATA1_DB7(regval) (BITS(24,31) & ((uint32_t)(regval) << 24)) + +/* receive mailbox extended identifier*/ +#define GET_RFIFOMI_EFID(regval) GET_BITS((uint32_t)(regval), 3U, 31U) + +/* receive mailbox standrad identifier*/ +#define GET_RFIFOMI_SFID(regval) GET_BITS((uint32_t)(regval), 21U, 31U) + +/* receive data length */ +#define GET_RFIFOMP_DLENC(regval) GET_BITS((uint32_t)(regval), 0U, 3U) + +/* the index of the filter by which the frame is passed */ +#define GET_RFIFOMP_FI(regval) GET_BITS((uint32_t)(regval), 8U, 15U) + +/* receive data byte 0 */ +#define GET_RFIFOMDATA0_DB0(regval) GET_BITS((uint32_t)(regval), 0U, 7U) + +/* receive data byte 1 */ +#define GET_RFIFOMDATA0_DB1(regval) GET_BITS((uint32_t)(regval), 8U, 15U) + +/* receive data byte 2 */ +#define GET_RFIFOMDATA0_DB2(regval) GET_BITS((uint32_t)(regval), 16U, 23U) + +/* receive data byte 3 */ +#define GET_RFIFOMDATA0_DB3(regval) GET_BITS((uint32_t)(regval), 24U, 31U) + +/* receive data byte 4 */ +#define GET_RFIFOMDATA1_DB4(regval) GET_BITS((uint32_t)(regval), 0U, 7U) + +/* receive data byte 5 */ +#define GET_RFIFOMDATA1_DB5(regval) GET_BITS((uint32_t)(regval), 8U, 15U) + +/* receive data byte 6 */ +#define GET_RFIFOMDATA1_DB6(regval) GET_BITS((uint32_t)(regval), 16U, 23U) + +/* receive data byte 7 */ +#define GET_RFIFOMDATA1_DB7(regval) GET_BITS((uint32_t)(regval), 24U, 31U) + +/* error number */ +#define GET_ERR_ERRN(regval) GET_BITS((uint32_t)(regval), 4U, 6U) + +/* transmit error count */ +#define GET_ERR_TECNT(regval) GET_BITS((uint32_t)(regval), 16U, 23U) + +/* receive error count */ +#define GET_ERR_RECNT(regval) GET_BITS((uint32_t)(regval), 24U, 31U) + +/* CAN errors */ +#define ERR_ERRN(regval) (BITS(4,6) & ((uint32_t)(regval) << 4)) +#define CAN_ERRN_0 ERR_ERRN(0U) /* no error */ +#define CAN_ERRN_1 ERR_ERRN(1U) /*!< fill error */ +#define CAN_ERRN_2 ERR_ERRN(2U) /*!< format error */ +#define CAN_ERRN_3 ERR_ERRN(3U) /*!< ACK error */ +#define CAN_ERRN_4 ERR_ERRN(4U) /*!< bit recessive error */ +#define CAN_ERRN_5 ERR_ERRN(5U) /*!< bit dominant error */ +#define CAN_ERRN_6 ERR_ERRN(6U) /*!< CRC error */ +#define CAN_ERRN_7 ERR_ERRN(7U) /*!< software error */ + +#define CAN_STATE_PENDING ((uint32_t)0x00000000U) /*!< CAN pending */ + +/* CAN communication mode */ +#define CAN_NORMAL_MODE ((uint8_t)0x00U) /*!< normal communication mode */ +#define CAN_LOOPBACK_MODE ((uint8_t)0x01U) /*!< loopback communication mode */ +#define CAN_SILENT_MODE ((uint8_t)0x02U) /*!< silent communication mode */ +#define CAN_SILENT_LOOPBACK_MODE ((uint8_t)0x03U) /*!< loopback and silent communication mode */ + +/* CAN resynchronisation jump width */ +#define CAN_BT_SJW_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ +#define CAN_BT_SJW_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ +#define CAN_BT_SJW_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ +#define CAN_BT_SJW_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ + +/* CAN time segment 1 */ +#define CAN_BT_BS1_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ +#define CAN_BT_BS1_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ +#define CAN_BT_BS1_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ +#define CAN_BT_BS1_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ +#define CAN_BT_BS1_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ +#define CAN_BT_BS1_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ +#define CAN_BT_BS1_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ +#define CAN_BT_BS1_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ +#define CAN_BT_BS1_9TQ ((uint8_t)0x08U) /*!< 9 time quanta */ +#define CAN_BT_BS1_10TQ ((uint8_t)0x09U) /*!< 10 time quanta */ +#define CAN_BT_BS1_11TQ ((uint8_t)0x0AU) /*!< 11 time quanta */ +#define CAN_BT_BS1_12TQ ((uint8_t)0x0BU) /*!< 12 time quanta */ +#define CAN_BT_BS1_13TQ ((uint8_t)0x0CU) /*!< 13 time quanta */ +#define CAN_BT_BS1_14TQ ((uint8_t)0x0DU) /*!< 14 time quanta */ +#define CAN_BT_BS1_15TQ ((uint8_t)0x0EU) /*!< 15 time quanta */ +#define CAN_BT_BS1_16TQ ((uint8_t)0x0FU) /*!< 16 time quanta */ + +/* CAN time segment 2 */ +#define CAN_BT_BS2_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ +#define CAN_BT_BS2_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ +#define CAN_BT_BS2_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ +#define CAN_BT_BS2_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ +#define CAN_BT_BS2_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ +#define CAN_BT_BS2_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ +#define CAN_BT_BS2_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ +#define CAN_BT_BS2_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ + +/* CAN mailbox number */ +#define CAN_MAILBOX0 ((uint8_t)0x00U) /*!< mailbox0 */ +#define CAN_MAILBOX1 ((uint8_t)0x01U) /*!< mailbox1 */ +#define CAN_MAILBOX2 ((uint8_t)0x02U) /*!< mailbox2 */ +#define CAN_NOMAILBOX ((uint8_t)0x03U) /*!< no mailbox empty */ + +/* CAN frame format */ +#define CAN_FF_STANDARD ((uint32_t)0x00000000U) /*!< standard frame */ +#define CAN_FF_EXTENDED ((uint32_t)0x00000004U) /*!< extended frame */ + +/* CAN receive fifo */ +#define CAN_FIFO0 ((uint8_t)0x00U) /*!< receive FIFO0 */ +#define CAN_FIFO1 ((uint8_t)0x01U) /*!< receive FIFO1 */ + +/* frame number of receive fifo */ +#define CAN_RFIF_RFL_MASK ((uint32_t)0x00000003U) /*!< mask for frame number in receive FIFOx */ + +#define CAN_SFID_MASK ((uint32_t)0x000007FFU) /*!< mask of standard identifier */ +#define CAN_EFID_MASK ((uint32_t)0x1FFFFFFFU) /*!< mask of extended identifier */ + +/* CAN working mode */ +#define CAN_MODE_INITIALIZE ((uint8_t)0x01U) /*!< CAN initialize mode */ +#define CAN_MODE_NORMAL ((uint8_t)0x02U) /*!< CAN normal mode */ +#define CAN_MODE_SLEEP ((uint8_t)0x04U) /*!< CAN sleep mode */ + +/* filter bits */ +#define CAN_FILTERBITS_16BIT ((uint8_t)0x00U) /*!< CAN filter 16 bits */ +#define CAN_FILTERBITS_32BIT ((uint8_t)0x01U) /*!< CAN filter 32 bits */ + +/* filter mode */ +#define CAN_FILTERMODE_MASK ((uint8_t)0x00U) /*!< mask mode */ +#define CAN_FILTERMODE_LIST ((uint8_t)0x01U) /*!< list mode */ + +/* filter 16 bits mask */ +#define CAN_FILTER_MASK_16BITS ((uint32_t)0x0000FFFFU) /*!< can filter 16 bits mask */ + +/* frame type */ +#define CAN_FT_DATA ((uint32_t)0x00000000U) /*!< data frame */ +#define CAN_FT_REMOTE ((uint32_t)0x00000002U) /*!< remote frame */ + +/* CAN timeout */ +#define CAN_TIMEOUT ((uint32_t)0x0000FFFFU) /*!< timeout value */ + +/* interrupt enable bits */ +#define CAN_INT_TME CAN_INTEN_TMEIE /*!< transmit mailbox empty interrupt enable */ +#define CAN_INT_RFNE0 CAN_INTEN_RFNEIE0 /*!< receive FIFO0 not empty interrupt enable */ +#define CAN_INT_RFF0 CAN_INTEN_RFFIE0 /*!< receive FIFO0 full interrupt enable */ +#define CAN_INT_RFO0 CAN_INTEN_RFOIE0 /*!< receive FIFO0 overfull interrupt enable */ +#define CAN_INT_RFNE1 CAN_INTEN_RFNEIE1 /*!< receive FIFO1 not empty interrupt enable */ +#define CAN_INT_RFF1 CAN_INTEN_RFFIE1 /*!< receive FIFO1 full interrupt enable */ +#define CAN_INT_RFO1 CAN_INTEN_RFOIE1 /*!< receive FIFO1 overfull interrupt enable */ +#define CAN_INT_WERR CAN_INTEN_WERRIE /*!< warning error interrupt enable */ +#define CAN_INT_PERR CAN_INTEN_PERRIE /*!< passive error interrupt enable */ +#define CAN_INT_BO CAN_INTEN_BOIE /*!< bus-off interrupt enable */ +#define CAN_INT_ERRN CAN_INTEN_ERRNIE /*!< error number interrupt enable */ +#define CAN_INT_ERR CAN_INTEN_ERRIE /*!< error interrupt enable */ +#define CAN_INT_WAKEUP CAN_INTEN_WIE /*!< wakeup interrupt enable */ +#define CAN_INT_SLPW CAN_INTEN_SLPWIE /*!< sleep working interrupt enable */ + +/* function declarations */ +/* deinitialize CAN */ +void can_deinit(uint32_t can_periph); +/* initialize CAN struct */ +void can_struct_para_init(can_struct_type_enum type, void* p_struct); +/* initialize CAN */ +ErrStatus can_init(uint32_t can_periph, can_parameter_struct* can_parameter_init); +/* CAN filter init */ +void can_filter_init(can_filter_parameter_struct* can_filter_parameter_init); +/* set can1 fliter start bank number */ +void can1_filter_start_bank(uint8_t start_bank); +/* enable functions */ +/* CAN debug freeze enable */ +void can_debug_freeze_enable(uint32_t can_periph); +/* CAN debug freeze disable */ +void can_debug_freeze_disable(uint32_t can_periph); +/* CAN time trigger mode enable */ +void can_time_trigger_mode_enable(uint32_t can_periph); +/* CAN time trigger mode disable */ +void can_time_trigger_mode_disable(uint32_t can_periph); + +/* transmit functions */ +/* transmit CAN message */ +uint8_t can_message_transmit(uint32_t can_periph, can_trasnmit_message_struct* transmit_message); +/* get CAN transmit state */ +can_transmit_state_enum can_transmit_states(uint32_t can_periph, uint8_t mailbox_number); +/* stop CAN transmission */ +void can_transmission_stop(uint32_t can_periph, uint8_t mailbox_number); +/* CAN receive message */ +void can_message_receive(uint32_t can_periph, uint8_t fifo_number, can_receive_message_struct* receive_message); +/* CAN release fifo */ +void can_fifo_release(uint32_t can_periph, uint8_t fifo_number); +/* CAN receive message length */ +uint8_t can_receive_message_length_get(uint32_t can_periph, uint8_t fifo_number); +/* CAN working mode */ +ErrStatus can_working_mode_set(uint32_t can_periph, uint8_t working_mode); +/* CAN wakeup from sleep mode */ +ErrStatus can_wakeup(uint32_t can_periph); + +/* CAN get error */ +can_error_enum can_error_get(uint32_t can_periph); +/* get CAN receive error number */ +uint8_t can_receive_error_number_get(uint32_t can_periph); +/* get CAN transmit error number */ +uint8_t can_transmit_error_number_get(uint32_t can_periph); + +/* CAN interrupt enable */ +void can_interrupt_enable(uint32_t can_periph, uint32_t interrupt); +/* CAN interrupt disable */ +void can_interrupt_disable(uint32_t can_periph, uint32_t interrupt); +/* CAN get flag state */ +FlagStatus can_flag_get(uint32_t can_periph, can_flag_enum flag); +/* CAN clear flag state */ +void can_flag_clear(uint32_t can_periph, can_flag_enum flag); +/* CAN get interrupt flag state */ +FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum flag); +/* CAN clear interrupt flag state */ +void can_interrupt_flag_clear(uint32_t can_periph, can_interrupt_flag_enum flag); + +#endif /* GD32F30X_CAN_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_crc.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_crc.h new file mode 100644 index 0000000..1563134 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_crc.h @@ -0,0 +1,81 @@ +/*! + \file gd32f30x_crc.h + \brief definitions for the CRC + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_CRC_H +#define GD32F30X_CRC_H + +#include "gd32f30x.h" + +/* CRC definitions */ +#define CRC CRC_BASE + +/* registers definitions */ +#define CRC_DATA REG32(CRC + 0x00U) /*!< CRC data register */ +#define CRC_FDATA REG32(CRC + 0x04U) /*!< CRC free data register */ +#define CRC_CTL REG32(CRC + 0x08U) /*!< CRC control register */ + +/* bits definitions */ +/* CRC_DATA */ +#define CRC_DATA_DATA BITS(0,31) /*!< CRC calculation result bits */ + +/* CRC_FDATA */ +#define CRC_FDATA_FDATA BITS(0,7) /*!< CRC free data bits */ + +/* CRC_CTL */ +#define CRC_CTL_RST BIT(0) /*!< CRC reset CRC_DATA register bit */ + + +/* function declarations */ +/* deinit CRC calculation unit */ +void crc_deinit(void); + +/* reset data register(CRC_DATA) to the value of 0xFFFFFFFF */ +void crc_data_register_reset(void); +/* read the value of the data register */ +uint32_t crc_data_register_read(void); + +/* read the value of the free data register */ +uint8_t crc_free_data_register_read(void); +/* write data to the free data register */ +void crc_free_data_register_write(uint8_t free_data); + +/* calculate the CRC value of a 32-bit data */ +uint32_t crc_single_data_calculate(uint32_t sdata); +/* calculate the CRC value of an array of 32-bit values */ +uint32_t crc_block_data_calculate(const uint32_t *array, uint32_t size); + +#endif /* GD32F30X_CRC_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_ctc.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_ctc.h new file mode 100644 index 0000000..d55d399 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_ctc.h @@ -0,0 +1,186 @@ +/*! + \file gd32f30x_ctc.h + \brief definitions for the CTC + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_CTC_H +#define GD32F30X_CTC_H + +#include "gd32f30x.h" + +/* CTC definitions */ +#define CTC CTC_BASE + +/* registers definitions */ +#define CTC_CTL0 REG32((CTC) + 0x00U) /*!< CTC control register 0 */ +#define CTC_CTL1 REG32((CTC) + 0x04U) /*!< CTC control register 1 */ +#define CTC_STAT REG32((CTC) + 0x08U) /*!< CTC status register */ +#define CTC_INTC REG32((CTC) + 0x0CU) /*!< CTC interrupt clear register */ + +/* bits definitions */ +/* CTC_CTL0 */ +#define CTC_CTL0_CKOKIE BIT(0) /*!< clock trim OK(CKOKIF) interrupt enable */ +#define CTC_CTL0_CKWARNIE BIT(1) /*!< clock trim warning(CKWARNIF) interrupt enable */ +#define CTC_CTL0_ERRIE BIT(2) /*!< error(ERRIF) interrupt enable */ +#define CTC_CTL0_EREFIE BIT(3) /*!< EREFIF interrupt enable */ +#define CTC_CTL0_CNTEN BIT(5) /*!< CTC counter enable */ +#define CTC_CTL0_AUTOTRIM BIT(6) /*!< hardware automatically trim mode */ +#define CTC_CTL0_SWREFPUL BIT(7) /*!< software reference source sync pulse */ +#define CTC_CTL0_TRIMVALUE BITS(8,13) /*!< IRC48M trim value */ + +/* CTC_CTL1 */ +#define CTC_CTL1_RLVALUE BITS(0,15) /*!< CTC counter reload value */ +#define CTC_CTL1_CKLIM BITS(16,23) /*!< clock trim base limit value */ +#define CTC_CTL1_REFPSC BITS(24,26) /*!< reference signal source prescaler */ +#define CTC_CTL1_REFSEL BITS(28,29) /*!< reference signal source selection */ +#define CTC_CTL1_REFPOL BIT(31) /*!< reference signal source polarity */ + +/* CTC_STAT */ +#define CTC_STAT_CKOKIF BIT(0) /*!< clock trim OK interrupt flag */ +#define CTC_STAT_CKWARNIF BIT(1) /*!< clock trim warning interrupt flag */ +#define CTC_STAT_ERRIF BIT(2) /*!< error interrupt flag */ +#define CTC_STAT_EREFIF BIT(3) /*!< expect reference interrupt flag */ +#define CTC_STAT_CKERR BIT(8) /*!< clock trim error bit */ +#define CTC_STAT_REFMISS BIT(9) /*!< reference sync pulse miss */ +#define CTC_STAT_TRIMERR BIT(10) /*!< trim value error bit */ +#define CTC_STAT_REFDIR BIT(15) /*!< CTC trim counter direction when reference sync pulse occurred */ +#define CTC_STAT_REFCAP BITS(16,31) /*!< CTC counter capture when reference sync pulse occurred */ + +/* CTC_INTC */ +#define CTC_INTC_CKOKIC BIT(0) /*!< CKOKIF interrupt clear bit */ +#define CTC_INTC_CKWARNIC BIT(1) /*!< CKWARNIF interrupt clear bit */ +#define CTC_INTC_ERRIC BIT(2) /*!< ERRIF interrupt clear bit */ +#define CTC_INTC_EREFIC BIT(3) /*!< EREFIF interrupt clear bit */ + +/* constants definitions */ +/* hardware automatically trim mode definitions */ +#define CTC_HARDWARE_TRIM_MODE_ENABLE CTC_CTL0_AUTOTRIM /*!< hardware automatically trim mode enable*/ +#define CTC_HARDWARE_TRIM_MODE_DISABLE ((uint32_t)0x00000000U) /*!< hardware automatically trim mode disable*/ + +/* reference signal source polarity definitions */ +#define CTC_REFSOURCE_POLARITY_FALLING CTC_CTL1_REFPOL /*!< reference signal source polarity is falling edge*/ +#define CTC_REFSOURCE_POLARITY_RISING ((uint32_t)0x00000000U) /*!< reference signal source polarity is rising edge*/ + +/* reference signal source selection definitions */ +#define CTL1_REFSEL(regval) (BITS(28,29) & ((uint32_t)(regval) << 28)) +#define CTC_REFSOURCE_GPIO CTL1_REFSEL(0) /*!< GPIO is selected */ +#define CTC_REFSOURCE_LXTAL CTL1_REFSEL(1) /*!< LXTAL is selected */ +#define CTC_REFSOURCE_USB_SOF CTL1_REFSEL(2) /*!< USBD_SOF or USBFS_SOF is selected */ + +/* reference signal source prescaler definitions */ +#define CTL1_REFPSC(regval) (BITS(24,26) & ((uint32_t)(regval) << 24)) +#define CTC_REFSOURCE_PSC_OFF CTL1_REFPSC(0) /*!< reference signal not divided */ +#define CTC_REFSOURCE_PSC_DIV2 CTL1_REFPSC(1) /*!< reference signal divided by 2 */ +#define CTC_REFSOURCE_PSC_DIV4 CTL1_REFPSC(2) /*!< reference signal divided by 4 */ +#define CTC_REFSOURCE_PSC_DIV8 CTL1_REFPSC(3) /*!< reference signal divided by 8 */ +#define CTC_REFSOURCE_PSC_DIV16 CTL1_REFPSC(4) /*!< reference signal divided by 16 */ +#define CTC_REFSOURCE_PSC_DIV32 CTL1_REFPSC(5) /*!< reference signal divided by 32 */ +#define CTC_REFSOURCE_PSC_DIV64 CTL1_REFPSC(6) /*!< reference signal divided by 64 */ +#define CTC_REFSOURCE_PSC_DIV128 CTL1_REFPSC(7) /*!< reference signal divided by 128 */ + +/* CTC interrupt enable definitions */ +#define CTC_INT_CKOK CTC_CTL0_CKOKIE /*!< clock trim OK interrupt enable */ +#define CTC_INT_CKWARN CTC_CTL0_CKWARNIE /*!< clock trim warning interrupt enable */ +#define CTC_INT_ERR CTC_CTL0_ERRIE /*!< error interrupt enable */ +#define CTC_INT_EREF CTC_CTL0_EREFIE /*!< expect reference interrupt enable */ + +/* CTC interrupt source definitions */ +#define CTC_INT_FLAG_CKOK CTC_STAT_CKOKIF /*!< clock trim OK interrupt flag */ +#define CTC_INT_FLAG_CKWARN CTC_STAT_CKWARNIF /*!< clock trim warning interrupt flag */ +#define CTC_INT_FLAG_ERR CTC_STAT_ERRIF /*!< error interrupt flag */ +#define CTC_INT_FLAG_EREF CTC_STAT_EREFIF /*!< expect reference interrupt flag */ +#define CTC_INT_FLAG_CKERR CTC_STAT_CKERR /*!< clock trim error bit */ +#define CTC_INT_FLAG_REFMISS CTC_STAT_REFMISS /*!< reference sync pulse miss */ +#define CTC_INT_FLAG_TRIMERR CTC_STAT_TRIMERR /*!< trim value error */ + +/* CTC flag definitions */ +#define CTC_FLAG_CKOK CTC_STAT_CKOKIF /*!< clock trim OK flag */ +#define CTC_FLAG_CKWARN CTC_STAT_CKWARNIF /*!< clock trim warning flag */ +#define CTC_FLAG_ERR CTC_STAT_ERRIF /*!< error flag */ +#define CTC_FLAG_EREF CTC_STAT_EREFIF /*!< expect reference flag */ +#define CTC_FLAG_CKERR CTC_STAT_CKERR /*!< clock trim error bit */ +#define CTC_FLAG_REFMISS CTC_STAT_REFMISS /*!< reference sync pulse miss */ +#define CTC_FLAG_TRIMERR CTC_STAT_TRIMERR /*!< trim value error bit */ + +/* function declarations */ +/* reset ctc clock trim controller */ +void ctc_deinit(void); +/* enable CTC trim counter */ +void ctc_counter_enable(void); +/* disable CTC trim counter */ +void ctc_counter_disable(void); + +/* configure the IRC48M trim value */ +void ctc_irc48m_trim_value_config(uint8_t trim_value); +/* generate software reference source sync pulse */ +void ctc_software_refsource_pulse_generate(void); +/* configure hardware automatically trim mode */ +void ctc_hardware_trim_mode_config(uint32_t hardmode); + +/* configure reference signal source polarity */ +void ctc_refsource_polarity_config(uint32_t polarity); +/* select reference signal source */ +void ctc_refsource_signal_select(uint32_t refs); +/* configure reference signal source prescaler */ +void ctc_refsource_prescaler_config(uint32_t prescaler); +/* configure clock trim base limit value */ +void ctc_clock_limit_value_config(uint8_t limit_value); +/* configure CTC counter reload value */ +void ctc_counter_reload_value_config(uint16_t reload_value); + +/* read CTC counter capture value when reference sync pulse occurred */ +uint16_t ctc_counter_capture_value_read(void); +/* read CTC trim counter direction when reference sync pulse occurred */ +FlagStatus ctc_counter_direction_read(void); +/* read CTC counter reload value */ +uint16_t ctc_counter_reload_value_read(void); +/* read the IRC48M trim value */ +uint8_t ctc_irc48m_trim_value_read(void); + +/* interrupt & flag functions */ +/* enable the CTC interrupt */ +void ctc_interrupt_enable(uint32_t interrupt); +/* disable the CTC interrupt */ +void ctc_interrupt_disable(uint32_t interrupt); +/* get CTC interrupt flag */ +FlagStatus ctc_interrupt_flag_get(uint32_t int_flag); +/* clear CTC interrupt flag */ +void ctc_interrupt_flag_clear(uint32_t int_flag); +/* get CTC flag */ +FlagStatus ctc_flag_get(uint32_t flag); +/* clear CTC flag */ +void ctc_flag_clear(uint32_t flag); + +#endif /* GD32F30X_CTC_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_dac.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_dac.h new file mode 100644 index 0000000..24c28c2 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_dac.h @@ -0,0 +1,250 @@ +/*! + \file gd32f30x_dac.h + \brief definitions for the DAC + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_DAC_H +#define GD32F30X_DAC_H + +#include "gd32f30x.h" + +/* DACx(x=0,1) definitions */ +#define DAC DAC_BASE +#define DAC0 0U +#define DAC1 1U + +/* registers definitions */ +#define DAC_CTL REG32(DAC + 0x00U) /*!< DAC control register */ +#define DAC_SWT REG32(DAC + 0x04U) /*!< DAC software trigger register */ +#define DAC0_R12DH REG32(DAC + 0x08U) /*!< DAC0 12-bit right-aligned data holding register */ +#define DAC0_L12DH REG32(DAC + 0x0CU) /*!< DAC0 12-bit left-aligned data holding register */ +#define DAC0_R8DH REG32(DAC + 0x10U) /*!< DAC0 8-bit right-aligned data holding register */ +#define DAC1_R12DH REG32(DAC + 0x14U) /*!< DAC1 12-bit right-aligned data holding register */ +#define DAC1_L12DH REG32(DAC + 0x18U) /*!< DAC1 12-bit left-aligned data holding register */ +#define DAC1_R8DH REG32(DAC + 0x1CU) /*!< DAC1 8-bit right-aligned data holding register */ +#define DACC_R12DH REG32(DAC + 0x20U) /*!< DAC concurrent mode 12-bit right-aligned data holding register */ +#define DACC_L12DH REG32(DAC + 0x24U) /*!< DAC concurrent mode 12-bit left-aligned data holding register */ +#define DACC_R8DH REG32(DAC + 0x28U) /*!< DAC concurrent mode 8-bit right-aligned data holding register */ +#define DAC0_DO REG32(DAC + 0x2CU) /*!< DAC0 data output register */ +#define DAC1_DO REG32(DAC + 0x30U) /*!< DAC1 data output register */ + +/* bits definitions */ +/* DAC_CTL */ +#define DAC_CTL_DEN0 BIT(0) /*!< DAC0 enable/disable bit */ +#define DAC_CTL_DBOFF0 BIT(1) /*!< DAC0 output buffer turn on/turn off bit */ +#define DAC_CTL_DTEN0 BIT(2) /*!< DAC0 trigger enable/disable bit */ +#define DAC_CTL_DTSEL0 BITS(3,5) /*!< DAC0 trigger source selection enable/disable bits */ +#define DAC_CTL_DWM0 BITS(6,7) /*!< DAC0 noise wave mode */ +#define DAC_CTL_DWBW0 BITS(8,11) /*!< DAC0 noise wave bit width */ +#define DAC_CTL_DDMAEN0 BIT(12) /*!< DAC0 DMA enable/disable bit */ +#define DAC_CTL_DEN1 BIT(16) /*!< DAC1 enable/disable bit */ +#define DAC_CTL_DBOFF1 BIT(17) /*!< DAC1 output buffer turn on/turn off bit */ +#define DAC_CTL_DTEN1 BIT(18) /*!< DAC1 trigger enable/disable bit */ +#define DAC_CTL_DTSEL1 BITS(19,21) /*!< DAC1 trigger source selection enable/disable bits */ +#define DAC_CTL_DWM1 BITS(22,23) /*!< DAC1 noise wave mode */ +#define DAC_CTL_DWBW1 BITS(24,27) /*!< DAC1 noise wave bit width */ +#define DAC_CTL_DDMAEN1 BIT(28) /*!< DAC1 DMA enable/disable bit */ + +/* DAC_SWT */ +#define DAC_SWT_SWTR0 BIT(0) /*!< DAC0 software trigger bit, cleared by hardware */ +#define DAC_SWT_SWTR1 BIT(1) /*!< DAC1 software trigger bit, cleared by hardware */ + +/* DAC0_R12DH */ +#define DAC0_R12DH_DAC0_DH BITS(0,11) /*!< DAC0 12-bit right-aligned data bits */ + +/* DAC0_L12DH */ +#define DAC0_L12DH_DAC0_DH BITS(4,15) /*!< DAC0 12-bit left-aligned data bits */ + +/* DAC0_R8DH */ +#define DAC0_R8DH_DAC0_DH BITS(0,7) /*!< DAC0 8-bit right-aligned data bits */ + +/* DAC1_R12DH */ +#define DAC1_R12DH_DAC1_DH BITS(0,11) /*!< DAC1 12-bit right-aligned data bits */ + +/* DAC1_L12DH */ +#define DAC1_L12DH_DAC1_DH BITS(4,15) /*!< DAC1 12-bit left-aligned data bits */ + +/* DAC1_R8DH */ +#define DAC1_R8DH_DAC1_DH BITS(0,7) /*!< DAC1 8-bit right-aligned data bits */ + +/* DACC_R12DH */ +#define DACC_R12DH_DAC0_DH BITS(0,11) /*!< DAC concurrent mode DAC0 12-bit right-aligned data bits */ +#define DACC_R12DH_DAC1_DH BITS(16,27) /*!< DAC concurrent mode DAC1 12-bit right-aligned data bits */ + +/* DACC_L12DH */ +#define DACC_L12DH_DAC0_DH BITS(4,15) /*!< DAC concurrent mode DAC0 12-bit left-aligned data bits */ +#define DACC_L12DH_DAC1_DH BITS(20,31) /*!< DAC concurrent mode DAC1 12-bit left-aligned data bits */ + +/* DACC_R8DH */ +#define DACC_R8DH_DAC0_DH BITS(0,7) /*!< DAC concurrent mode DAC0 8-bit right-aligned data bits */ +#define DACC_R8DH_DAC1_DH BITS(8,15) /*!< DAC concurrent mode DAC1 8-bit right-aligned data bits */ + +/* DAC0_DO */ +#define DAC0_DO_DAC0_DO BITS(0,11) /*!< DAC0 12-bit output data bits */ + +/* DAC1_DO */ +#define DAC1_DO_DAC1_DO BITS(0,11) /*!< DAC1 12-bit output data bits */ + +/* constants definitions */ +/* DAC trigger source */ +#define CTL_DTSEL(regval) (BITS(3,5) & ((uint32_t)(regval) << 3)) +#define DAC_TRIGGER_T5_TRGO CTL_DTSEL(0) /*!< TIMER5 TRGO */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define DAC_TRIGGER_T7_TRGO CTL_DTSEL(1) /*!< TIMER7 TRGO */ +#elif defined(GD32F30X_CL) +#define DAC_TRIGGER_T2_TRGO CTL_DTSEL(1) /*!< TIMER2 TRGO */ +#endif /* GD32F30X_HD and GD32F30X_XD */ +#define DAC_TRIGGER_T6_TRGO CTL_DTSEL(2) /*!< TIMER6 TRGO */ +#define DAC_TRIGGER_T4_TRGO CTL_DTSEL(3) /*!< TIMER4 TRGO */ +#define DAC_TRIGGER_T1_TRGO CTL_DTSEL(4) /*!< TIMER1 TRGO */ +#define DAC_TRIGGER_T3_TRGO CTL_DTSEL(5) /*!< TIMER3 TRGO */ +#define DAC_TRIGGER_EXTI_9 CTL_DTSEL(6) /*!< EXTI interrupt line9 event */ +#define DAC_TRIGGER_SOFTWARE CTL_DTSEL(7) /*!< software trigger */ + +/* DAC noise wave mode */ +#define CTL_DWM(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) +#define DAC_WAVE_DISABLE CTL_DWM(0) /*!< wave disable */ +#define DAC_WAVE_MODE_LFSR CTL_DWM(1) /*!< LFSR noise mode */ +#define DAC_WAVE_MODE_TRIANGLE CTL_DWM(2) /*!< triangle noise mode */ + +/* DAC noise wave bit width */ +#define DWBW(regval) (BITS(8,11) & ((uint32_t)(regval) << 8)) +#define DAC_WAVE_BIT_WIDTH_1 DWBW(0) /*!< bit width of the wave signal is 1 */ +#define DAC_WAVE_BIT_WIDTH_2 DWBW(1) /*!< bit width of the wave signal is 2 */ +#define DAC_WAVE_BIT_WIDTH_3 DWBW(2) /*!< bit width of the wave signal is 3 */ +#define DAC_WAVE_BIT_WIDTH_4 DWBW(3) /*!< bit width of the wave signal is 4 */ +#define DAC_WAVE_BIT_WIDTH_5 DWBW(4) /*!< bit width of the wave signal is 5 */ +#define DAC_WAVE_BIT_WIDTH_6 DWBW(5) /*!< bit width of the wave signal is 6 */ +#define DAC_WAVE_BIT_WIDTH_7 DWBW(6) /*!< bit width of the wave signal is 7 */ +#define DAC_WAVE_BIT_WIDTH_8 DWBW(7) /*!< bit width of the wave signal is 8 */ +#define DAC_WAVE_BIT_WIDTH_9 DWBW(8) /*!< bit width of the wave signal is 9 */ +#define DAC_WAVE_BIT_WIDTH_10 DWBW(9) /*!< bit width of the wave signal is 10 */ +#define DAC_WAVE_BIT_WIDTH_11 DWBW(10) /*!< bit width of the wave signal is 11 */ +#define DAC_WAVE_BIT_WIDTH_12 DWBW(11) /*!< bit width of the wave signal is 12 */ + +/* unmask LFSR bits in DAC LFSR noise mode */ +#define DAC_LFSR_BIT0 DAC_WAVE_BIT_WIDTH_1 /*!< unmask the LFSR bit0 */ +#define DAC_LFSR_BITS1_0 DAC_WAVE_BIT_WIDTH_2 /*!< unmask the LFSR bits[1:0] */ +#define DAC_LFSR_BITS2_0 DAC_WAVE_BIT_WIDTH_3 /*!< unmask the LFSR bits[2:0] */ +#define DAC_LFSR_BITS3_0 DAC_WAVE_BIT_WIDTH_4 /*!< unmask the LFSR bits[3:0] */ +#define DAC_LFSR_BITS4_0 DAC_WAVE_BIT_WIDTH_5 /*!< unmask the LFSR bits[4:0] */ +#define DAC_LFSR_BITS5_0 DAC_WAVE_BIT_WIDTH_6 /*!< unmask the LFSR bits[5:0] */ +#define DAC_LFSR_BITS6_0 DAC_WAVE_BIT_WIDTH_7 /*!< unmask the LFSR bits[6:0] */ +#define DAC_LFSR_BITS7_0 DAC_WAVE_BIT_WIDTH_8 /*!< unmask the LFSR bits[7:0] */ +#define DAC_LFSR_BITS8_0 DAC_WAVE_BIT_WIDTH_9 /*!< unmask the LFSR bits[8:0] */ +#define DAC_LFSR_BITS9_0 DAC_WAVE_BIT_WIDTH_10 /*!< unmask the LFSR bits[9:0] */ +#define DAC_LFSR_BITS10_0 DAC_WAVE_BIT_WIDTH_11 /*!< unmask the LFSR bits[10:0] */ +#define DAC_LFSR_BITS11_0 DAC_WAVE_BIT_WIDTH_12 /*!< unmask the LFSR bits[11:0] */ + +/* DAC data alignment */ +#define DATA_ALIGN(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define DAC_ALIGN_12B_R DATA_ALIGN(0) /*!< data right 12 bit alignment */ +#define DAC_ALIGN_12B_L DATA_ALIGN(1) /*!< data left 12 bit alignment */ +#define DAC_ALIGN_8B_R DATA_ALIGN(2) /*!< data right 8 bit alignment */ + +/* triangle amplitude in DAC triangle noise mode */ +#define DAC_TRIANGLE_AMPLITUDE_1 DAC_WAVE_BIT_WIDTH_1 /*!< triangle amplitude is 1 */ +#define DAC_TRIANGLE_AMPLITUDE_3 DAC_WAVE_BIT_WIDTH_2 /*!< triangle amplitude is 3 */ +#define DAC_TRIANGLE_AMPLITUDE_7 DAC_WAVE_BIT_WIDTH_3 /*!< triangle amplitude is 7 */ +#define DAC_TRIANGLE_AMPLITUDE_15 DAC_WAVE_BIT_WIDTH_4 /*!< triangle amplitude is 15 */ +#define DAC_TRIANGLE_AMPLITUDE_31 DAC_WAVE_BIT_WIDTH_5 /*!< triangle amplitude is 31 */ +#define DAC_TRIANGLE_AMPLITUDE_63 DAC_WAVE_BIT_WIDTH_6 /*!< triangle amplitude is 63 */ +#define DAC_TRIANGLE_AMPLITUDE_127 DAC_WAVE_BIT_WIDTH_7 /*!< triangle amplitude is 127 */ +#define DAC_TRIANGLE_AMPLITUDE_255 DAC_WAVE_BIT_WIDTH_8 /*!< triangle amplitude is 255 */ +#define DAC_TRIANGLE_AMPLITUDE_511 DAC_WAVE_BIT_WIDTH_9 /*!< triangle amplitude is 511 */ +#define DAC_TRIANGLE_AMPLITUDE_1023 DAC_WAVE_BIT_WIDTH_10 /*!< triangle amplitude is 1023 */ +#define DAC_TRIANGLE_AMPLITUDE_2047 DAC_WAVE_BIT_WIDTH_11 /*!< triangle amplitude is 2047 */ +#define DAC_TRIANGLE_AMPLITUDE_4095 DAC_WAVE_BIT_WIDTH_12 /*!< triangle amplitude is 4095 */ + +/* function declarations */ +/* initialization functions */ +/* deinitialize DAC */ +void dac_deinit(void); +/* enable DAC */ +void dac_enable(uint32_t dac_periph); +/* disable DAC */ +void dac_disable(uint32_t dac_periph); +/* enable DAC DMA */ +void dac_dma_enable(uint32_t dac_periph); +/* disable DAC DMA */ +void dac_dma_disable(uint32_t dac_periph); +/* enable DAC output buffer */ +void dac_output_buffer_enable(uint32_t dac_periph); +/* disable DAC output buffer */ +void dac_output_buffer_disable(uint32_t dac_periph); +/* get the last data output value */ +uint16_t dac_output_value_get(uint32_t dac_periph); +/* set DAC data holding register value */ +void dac_data_set(uint32_t dac_periph, uint32_t dac_align, uint16_t data); + +/* DAC trigger configuration */ +/* enable DAC trigger */ +void dac_trigger_enable(uint32_t dac_periph); +/* disable DAC trigger */ +void dac_trigger_disable(uint32_t dac_periph); +/* configure DAC trigger source */ +void dac_trigger_source_config(uint32_t dac_periph, uint32_t triggersource); +/* enable DAC software trigger */ +void dac_software_trigger_enable(uint32_t dac_periph); +/* disable DAC software trigger */ +void dac_software_trigger_disable(uint32_t dac_periph); + +/* DAC wave mode configuration */ +/* configure DAC wave mode */ +void dac_wave_mode_config(uint32_t dac_periph, uint32_t wave_mode); +/* configure DAC wave bit width */ +void dac_wave_bit_width_config(uint32_t dac_periph, uint32_t bit_width); +/* configure DAC LFSR noise mode */ +void dac_lfsr_noise_config(uint32_t dac_periph, uint32_t unmask_bits); +/* configure DAC triangle noise mode */ +void dac_triangle_noise_config(uint32_t dac_periph, uint32_t amplitude); + +/* DAC concurrent mode configuration */ +/* enable DAC concurrent mode */ +void dac_concurrent_enable(void); +/* disable DAC concurrent mode */ +void dac_concurrent_disable(void); +/* enable DAC concurrent software trigger */ +void dac_concurrent_software_trigger_enable(void); +/* disable DAC concurrent software trigger */ +void dac_concurrent_software_trigger_disable(void); +/* enable DAC concurrent buffer function */ +void dac_concurrent_output_buffer_enable(void); +/* disable DAC concurrent buffer function */ +void dac_concurrent_output_buffer_disable(void); +/* set DAC concurrent mode data holding register value */ +void dac_concurrent_data_set(uint32_t dac_align, uint16_t data0, uint16_t data1); + +#endif /* GD32F30X_DAC_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_dbg.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_dbg.h new file mode 100644 index 0000000..a375d3e --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_dbg.h @@ -0,0 +1,158 @@ +/*! + \file gd32f30x_dbg.h + \brief definitions for the DBG + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_DBG_H +#define GD32F30X_DBG_H + +#include "gd32f30x.h" + +/* DBG definitions */ +#define DBG DBG_BASE + +/* registers definitions */ +#define DBG_ID REG32(DBG + 0x00U) /*!< DBG_ID code register */ +#define DBG_CTL0 REG32(DBG + 0x04U) /*!< DBG control register 0 */ + +/* bits definitions */ +/* DBG_ID */ +#define DBG_ID_ID_CODE BITS(0,31) /*!< DBG ID code values */ + +/* DBG_CTL0 */ +#define DBG_CTL0_SLP_HOLD BIT(0) /*!< keep debugger connection during sleep mode */ +#define DBG_CTL0_DSLP_HOLD BIT(1) /*!< keep debugger connection during deepsleep mode */ +#define DBG_CTL0_STB_HOLD BIT(2) /*!< keep debugger connection during standby mode */ +#define DBG_CTL0_TRACE_IOEN BIT(5) /*!< enable trace pin assignment */ +#define DBG_CTL0_TRACE_MODE BITS(6,7) /*!< trace pin mode selection */ +#define DBG_CTL0_FWDGT_HOLD BIT(8) /*!< debug FWDGT kept when core is halted */ +#define DBG_CTL0_WWDGT_HOLD BIT(9) /*!< debug WWDGT kept when core is halted */ +#define DBG_CTL0_TIMER0_HOLD BIT(10) /*!< hold TIMER0 counter when core is halted */ +#define DBG_CTL0_TIMER1_HOLD BIT(11) /*!< hold TIMER1 counter when core is halted */ +#define DBG_CTL0_TIMER2_HOLD BIT(12) /*!< hold TIMER2 counter when core is halted */ +#define DBG_CTL0_TIMER3_HOLD BIT(13) /*!< hold TIMER3 counter when core is halted */ +#define DBG_CTL0_CAN0_HOLD BIT(14) /*!< debug CAN0 kept when core is halted */ +#define DBG_CTL0_I2C0_HOLD BIT(15) /*!< hold I2C0 smbus when core is halted */ +#define DBG_CTL0_I2C1_HOLD BIT(16) /*!< hold I2C1 smbus when core is halted */ +#define DBG_CTL0_TIMER7_HOLD BIT(17) /*!< hold TIMER7 counter when core is halted */ +#define DBG_CTL0_TIMER4_HOLD BIT(18) /*!< hold TIMER4 counter when core is halted */ +#define DBG_CTL0_TIMER5_HOLD BIT(19) /*!< hold TIMER5 counter when core is halted */ +#define DBG_CTL0_TIMER6_HOLD BIT(20) /*!< hold TIMER6 counter when core is halted */ +#ifdef GD32F30X_CL +#define DBG_CTL0_CAN1_HOLD BIT(21) /*!< debug CAN1 kept when core is halted */ +#endif /* GD32F30X_CL */ +#ifndef GD32F30X_HD +#define DBG_CTL0_TIMER11_HOLD BIT(25) /*!< hold TIMER11 counter when core is halted */ +#define DBG_CTL0_TIMER12_HOLD BIT(26) /*!< hold TIMER12 counter when core is halted */ +#define DBG_CTL0_TIMER13_HOLD BIT(27) /*!< hold TIMER13 counter when core is halted */ +#define DBG_CTL0_TIMER8_HOLD BIT(28) /*!< hold TIMER8 counter when core is halted */ +#define DBG_CTL0_TIMER9_HOLD BIT(29) /*!< hold TIMER9 counter when core is halted */ +#define DBG_CTL0_TIMER10_HOLD BIT(30) /*!< hold TIMER10 counter when core is halted */ +#endif /* GD32F30X_HD */ + +/* constants definitions */ +#define DBG_LOW_POWER_SLEEP DBG_CTL0_SLP_HOLD /*!< keep debugger connection during sleep mode */ +#define DBG_LOW_POWER_DEEPSLEEP DBG_CTL0_DSLP_HOLD /*!< keep debugger connection during deepsleep mode */ +#define DBG_LOW_POWER_STANDBY DBG_CTL0_STB_HOLD /*!< keep debugger connection during standby mode */ + +/* define the peripheral debug hold bit position and its register index offset */ +#define DBG_REGIDX_BIT(regidx, bitpos) (((regidx) << 6) | (bitpos)) +#define DBG_REG_VAL(periph) (REG32(DBG + ((uint32_t)(periph) >> 6))) +#define DBG_BIT_POS(val) ((uint32_t)(val) & 0x1FU) + +/* register index */ +enum dbg_reg_idx +{ + DBG_IDX_CTL0 = 0x04U +}; + +typedef enum +{ + DBG_FWDGT_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 8U), /*!< debug FWDGT kept when core is halted */ + DBG_WWDGT_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 9U), /*!< debug WWDGT kept when core is halted */ + DBG_TIMER0_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 10U), /*!< hold TIMER0 counter when core is halted */ + DBG_TIMER1_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 11U), /*!< hold TIMER1 counter when core is halted */ + DBG_TIMER2_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 12U), /*!< hold TIMER2 counter when core is halted */ + DBG_TIMER3_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 13U), /*!< hold TIMER3 counter when core is halted */ + DBG_CAN0_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 14U), /*!< debug CAN0 kept when core is halted */ + DBG_I2C0_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 15U), /*!< hold I2C0 smbus when core is halted */ + DBG_I2C1_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 16U), /*!< hold I2C1 smbus when core is halted */ + DBG_TIMER7_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 17U), /*!< hold TIMER7 counter when core is halted */ + DBG_TIMER4_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 18U), /*!< hold TIMER4 counter when core is halted */ + DBG_TIMER5_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 19U), /*!< hold TIMER5 counter when core is halted */ + DBG_TIMER6_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 20U), /*!< hold TIMER6 counter when core is halted */ +#ifdef GD32F30X_CL + DBG_CAN1_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 21U), /*!< debug CAN1 kept when core is halted */ +#endif /* GD32F30X_CL */ +#ifndef GD32F30X_HD + DBG_TIMER11_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 25U), /*!< hold TIMER11 counter when core is halted */ + DBG_TIMER12_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 26U), /*!< hold TIMER12 counter when core is halted */ + DBG_TIMER13_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 27U), /*!< hold TIMER13 counter when core is halted */ + DBG_TIMER8_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 28U), /*!< hold TIMER8 counter when core is halted */ + DBG_TIMER9_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 29U), /*!< hold TIMER9 counter when core is halted */ + DBG_TIMER10_HOLD = DBG_REGIDX_BIT(DBG_IDX_CTL0, 30U), /*!< hold TIMER10 counter when core is halted */ +#endif /* GD32F30X_HD */ +}dbg_periph_enum; + +#define CTL0_TRACE_MODE(regval) (BITS(6,7)&((uint32_t)(regval)<<6)) +#define TRACE_MODE_ASYNC CTL0_TRACE_MODE(0) /*!< trace pin used for async mode */ +#define TRACE_MODE_SYNC_DATASIZE_1 CTL0_TRACE_MODE(1) /*!< trace pin used for sync mode and data size is 1 */ +#define TRACE_MODE_SYNC_DATASIZE_2 CTL0_TRACE_MODE(2) /*!< trace pin used for sync mode and data size is 2 */ +#define TRACE_MODE_SYNC_DATASIZE_4 CTL0_TRACE_MODE(3) /*!< trace pin used for sync mode and data size is 4 */ + +/* function declarations */ +/* deinitialize the DBG */ +void dbg_deinit(void); +/* read DBG_ID code register */ +uint32_t dbg_id_get(void); + +/* enable low power behavior when the MCU is in debug mode */ +void dbg_low_power_enable(uint32_t dbg_low_power); +/* disable low power behavior when the MCU is in debug mode */ +void dbg_low_power_disable(uint32_t dbg_low_power); + +/* enable peripheral behavior when the MCU is in debug mode */ +void dbg_periph_enable(dbg_periph_enum dbg_periph); +/* disable peripheral behavior when the MCU is in debug mode */ +void dbg_periph_disable(dbg_periph_enum dbg_periph); + +/* enable trace pin assignment */ +void dbg_trace_pin_enable(void); +/* disable trace pin assignment */ +void dbg_trace_pin_disable(void); +/* set trace pin mode */ +void dbg_trace_pin_mode_set(uint32_t trace_mode); + +#endif /* GD32F30X_DBG_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_dma.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_dma.h new file mode 100644 index 0000000..13f715f --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_dma.h @@ -0,0 +1,285 @@ +/*! + \file gd32f30x_dma.h + \brief definitions for the DMA + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_DMA_H +#define GD32F30X_DMA_H + +#include "gd32f30x.h" + +/* DMA definitions */ +#define DMA0 (DMA_BASE) /*!< DMA0 base address */ +#define DMA1 (DMA_BASE + 0x0400U) /*!< DMA1 base address */ + +/* registers definitions */ +#define DMA_INTF(dmax) REG32((dmax) + 0x00U) /*!< DMA interrupt flag register */ +#define DMA_INTC(dmax) REG32((dmax) + 0x04U) /*!< DMA interrupt flag clear register */ + +#define DMA_CH0CTL(dmax) REG32((dmax) + 0x08U) /*!< DMA channel 0 control register */ +#define DMA_CH0CNT(dmax) REG32((dmax) + 0x0CU) /*!< DMA channel 0 counter register */ +#define DMA_CH0PADDR(dmax) REG32((dmax) + 0x10U) /*!< DMA channel 0 peripheral base address register */ +#define DMA_CH0MADDR(dmax) REG32((dmax) + 0x14U) /*!< DMA channel 0 memory base address register */ + +#define DMA_CH1CTL(dmax) REG32((dmax) + 0x1CU) /*!< DMA channel 1 control register */ +#define DMA_CH1CNT(dmax) REG32((dmax) + 0x20U) /*!< DMA channel 1 counter register */ +#define DMA_CH1PADDR(dmax) REG32((dmax) + 0x24U) /*!< DMA channel 1 peripheral base address register */ +#define DMA_CH1MADDR(dmax) REG32((dmax) + 0x28U) /*!< DMA channel 1 memory base address register */ + +#define DMA_CH2CTL(dmax) REG32((dmax) + 0x30U) /*!< DMA channel 2 control register */ +#define DMA_CH2CNT(dmax) REG32((dmax) + 0x34U) /*!< DMA channel 2 counter register */ +#define DMA_CH2PADDR(dmax) REG32((dmax) + 0x38U) /*!< DMA channel 2 peripheral base address register */ +#define DMA_CH2MADDR(dmax) REG32((dmax) + 0x3CU) /*!< DMA channel 2 memory base address register */ + +#define DMA_CH3CTL(dmax) REG32((dmax) + 0x44U) /*!< DMA channel 3 control register */ +#define DMA_CH3CNT(dmax) REG32((dmax) + 0x48U) /*!< DMA channel 3 counter register */ +#define DMA_CH3PADDR(dmax) REG32((dmax) + 0x4CU) /*!< DMA channel 3 peripheral base address register */ +#define DMA_CH3MADDR(dmax) REG32((dmax) + 0x50U) /*!< DMA channel 3 memory base address register */ + +#define DMA_CH4CTL(dmax) REG32((dmax) + 0x58U) /*!< DMA channel 4 control register */ +#define DMA_CH4CNT(dmax) REG32((dmax) + 0x5CU) /*!< DMA channel 4 counter register */ +#define DMA_CH4PADDR(dmax) REG32((dmax) + 0x60U) /*!< DMA channel 4 peripheral base address register */ +#define DMA_CH4MADDR(dmax) REG32((dmax) + 0x64U) /*!< DMA channel 4 memory base address register */ + +#define DMA_CH5CTL(dmax) REG32((dmax) + 0x6CU) /*!< DMA channel 5 control register */ +#define DMA_CH5CNT(dmax) REG32((dmax) + 0x70U) /*!< DMA channel 5 counter register */ +#define DMA_CH5PADDR(dmax) REG32((dmax) + 0x74U) /*!< DMA channel 5 peripheral base address register */ +#define DMA_CH5MADDR(dmax) REG32((dmax) + 0x78U) /*!< DMA channel 5 memory base address register */ + +#define DMA_CH6CTL(dmax) REG32((dmax) + 0x80U) /*!< DMA channel 6 control register */ +#define DMA_CH6CNT(dmax) REG32((dmax) + 0x84U) /*!< DMA channel 6 counter register */ +#define DMA_CH6PADDR(dmax) REG32((dmax) + 0x88U) /*!< DMA channel 6 peripheral base address register */ +#define DMA_CH6MADDR(dmax) REG32((dmax) + 0x8CU) /*!< DMA channel 6 memory base address register */ + +/* bits definitions */ +/* DMA_INTF */ +#define DMA_INTF_GIF BIT(0) /*!< global interrupt flag of channel */ +#define DMA_INTF_FTFIF BIT(1) /*!< full transfer finish flag of channel */ +#define DMA_INTF_HTFIF BIT(2) /*!< half transfer finish flag of channel */ +#define DMA_INTF_ERRIF BIT(3) /*!< error flag of channel */ + +/* DMA_INTC */ +#define DMA_INTC_GIFC BIT(0) /*!< clear global interrupt flag of channel */ +#define DMA_INTC_FTFIFC BIT(1) /*!< clear transfer finish flag of channel */ +#define DMA_INTC_HTFIFC BIT(2) /*!< clear half transfer finish flag of channel */ +#define DMA_INTC_ERRIFC BIT(3) /*!< clear error flag of channel */ + +/* DMA_CHxCTL, x=0..6 */ +#define DMA_CHXCTL_CHEN BIT(0) /*!< channel enable */ +#define DMA_CHXCTL_FTFIE BIT(1) /*!< enable bit for channel full transfer finish interrupt */ +#define DMA_CHXCTL_HTFIE BIT(2) /*!< enable bit for channel half transfer finish interrupt */ +#define DMA_CHXCTL_ERRIE BIT(3) /*!< enable bit for channel error interrupt */ +#define DMA_CHXCTL_DIR BIT(4) /*!< transfer direction */ +#define DMA_CHXCTL_CMEN BIT(5) /*!< circular mode enable */ +#define DMA_CHXCTL_PNAGA BIT(6) /*!< next address generation algorithm of peripheral */ +#define DMA_CHXCTL_MNAGA BIT(7) /*!< next address generation algorithm of memory */ +#define DMA_CHXCTL_PWIDTH BITS(8,9) /*!< transfer data width of peripheral */ +#define DMA_CHXCTL_MWIDTH BITS(10,11) /*!< transfer data width of memory */ +#define DMA_CHXCTL_PRIO BITS(12,13) /*!< priority level */ +#define DMA_CHXCTL_M2M BIT(14) /*!< memory to memory mode */ + +/* DMA_CHxCNT,x=0..6 */ +#define DMA_CHXCNT_CNT BITS(0,15) /*!< transfer counter */ + +/* DMA_CHxPADDR,x=0..6 */ +#define DMA_CHXPADDR_PADDR BITS(0,31) /*!< peripheral base address */ + +/* DMA_CHxMADDR,x=0..6 */ +#define DMA_CHXMADDR_MADDR BITS(0,31) /*!< memory base address */ + +/* constants definitions */ +/* DMA channel select */ +typedef enum +{ + DMA_CH0 = 0, /*!< DMA Channel0 */ + DMA_CH1, /*!< DMA Channel1 */ + DMA_CH2, /*!< DMA Channel2 */ + DMA_CH3, /*!< DMA Channel3 */ + DMA_CH4, /*!< DMA Channel4 */ + DMA_CH5, /*!< DMA Channel5 */ + DMA_CH6 /*!< DMA Channel6 */ +} dma_channel_enum; + +/* DMA initialize struct */ +typedef struct +{ + uint32_t periph_addr; /*!< peripheral base address */ + uint32_t periph_width; /*!< transfer data size of peripheral */ + uint32_t memory_addr; /*!< memory base address */ + uint32_t memory_width; /*!< transfer data size of memory */ + uint32_t number; /*!< channel transfer number */ + uint32_t priority; /*!< channel priority level */ + uint8_t periph_inc; /*!< peripheral increasing mode */ + uint8_t memory_inc; /*!< memory increasing mode */ + uint8_t direction; /*!< channel data transfer direction */ + +} dma_parameter_struct; + +#define DMA_FLAG_ADD(flag, shift) ((flag) << ((shift) * 4U)) /*!< DMA channel flag shift */ + +/* DMA_register address */ +#define DMA_CHCTL(dma, channel) REG32(((dma) + 0x08U) + 0x14U * (uint32_t)(channel)) /*!< the address of DMA channel CHXCTL register */ +#define DMA_CHCNT(dma, channel) REG32(((dma) + 0x0CU) + 0x14U * (uint32_t)(channel)) /*!< the address of DMA channel CHXCNT register */ +#define DMA_CHPADDR(dma, channel) REG32(((dma) + 0x10U) + 0x14U * (uint32_t)(channel)) /*!< the address of DMA channel CHXPADDR register */ +#define DMA_CHMADDR(dma, channel) REG32(((dma) + 0x14U) + 0x14U * (uint32_t)(channel)) /*!< the address of DMA channel CHXMADDR register */ + +/* DMA reset value */ +#define DMA_CHCTL_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXCTL register */ +#define DMA_CHCNT_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXCNT register */ +#define DMA_CHPADDR_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXPADDR register */ +#define DMA_CHMADDR_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXMADDR register */ +#define DMA_CHINTF_RESET_VALUE (DMA_INTF_GIF | DMA_INTF_FTFIF | \ + DMA_INTF_HTFIF | DMA_INTF_ERRIF) /*!< clear DMA channel DMA_INTF register */ + +/* DMA_INTF register */ +/* interrupt flag bits */ +#define DMA_INT_FLAG_G DMA_INTF_GIF /*!< global interrupt flag of channel */ +#define DMA_INT_FLAG_FTF DMA_INTF_FTFIF /*!< full transfer finish interrupt flag of channel */ +#define DMA_INT_FLAG_HTF DMA_INTF_HTFIF /*!< half transfer finish interrupt flag of channel */ +#define DMA_INT_FLAG_ERR DMA_INTF_ERRIF /*!< error interrupt flag of channel */ + +/* flag bits */ +#define DMA_FLAG_G DMA_INTF_GIF /*!< global interrupt flag of channel */ +#define DMA_FLAG_FTF DMA_INTF_FTFIF /*!< full transfer finish flag of channel */ +#define DMA_FLAG_HTF DMA_INTF_HTFIF /*!< half transfer finish flag of channel */ +#define DMA_FLAG_ERR DMA_INTF_ERRIF /*!< error flag of channel */ + +/* DMA_CHxCTL register */ +/* interrupt enable bits */ +#define DMA_INT_FTF DMA_CHXCTL_FTFIE /*!< enable bit for channel full transfer finish interrupt */ +#define DMA_INT_HTF DMA_CHXCTL_HTFIE /*!< enable bit for channel half transfer finish interrupt */ +#define DMA_INT_ERR DMA_CHXCTL_ERRIE /*!< enable bit for channel error interrupt */ + +/* transfer direction */ +#define DMA_PERIPHERAL_TO_MEMORY ((uint8_t)0x0000U) /*!< read from peripheral and write to memory */ +#define DMA_MEMORY_TO_PERIPHERAL ((uint8_t)0x0001U) /*!< read from memory and write to peripheral */ + +/* peripheral increasing mode */ +#define DMA_PERIPH_INCREASE_DISABLE ((uint8_t)0x0000U) /*!< next address of peripheral is fixed address mode */ +#define DMA_PERIPH_INCREASE_ENABLE ((uint8_t)0x0001U) /*!< next address of peripheral is increasing address mode */ + +/* memory increasing mode */ +#define DMA_MEMORY_INCREASE_DISABLE ((uint8_t)0x0000U) /*!< next address of memory is fixed address mode */ +#define DMA_MEMORY_INCREASE_ENABLE ((uint8_t)0x0001U) /*!< next address of memory is increasing address mode */ + +/* transfer data size of peripheral */ +#define CHCTL_PWIDTH(regval) (BITS(8,9) & ((uint32_t)(regval) << 8)) /*!< transfer data size of peripheral */ +#define DMA_PERIPHERAL_WIDTH_8BIT CHCTL_PWIDTH(0) /*!< transfer data size of peripheral is 8-bit */ +#define DMA_PERIPHERAL_WIDTH_16BIT CHCTL_PWIDTH(1) /*!< transfer data size of peripheral is 16-bit */ +#define DMA_PERIPHERAL_WIDTH_32BIT CHCTL_PWIDTH(2) /*!< transfer data size of peripheral is 32-bit */ + +/* transfer data size of memory */ +#define CHCTL_MWIDTH(regval) (BITS(10,11) & ((uint32_t)(regval) << 10)) /*!< transfer data size of memory */ +#define DMA_MEMORY_WIDTH_8BIT CHCTL_MWIDTH(0) /*!< transfer data size of memory is 8-bit */ +#define DMA_MEMORY_WIDTH_16BIT CHCTL_MWIDTH(1) /*!< transfer data size of memory is 16-bit */ +#define DMA_MEMORY_WIDTH_32BIT CHCTL_MWIDTH(2) /*!< transfer data size of memory is 32-bit */ + +/* channel priority level */ +#define CHCTL_PRIO(regval) (BITS(12,13) & ((uint32_t)(regval) << 12)) /*!< DMA channel priority level */ +#define DMA_PRIORITY_LOW CHCTL_PRIO(0) /*!< low priority */ +#define DMA_PRIORITY_MEDIUM CHCTL_PRIO(1) /*!< medium priority */ +#define DMA_PRIORITY_HIGH CHCTL_PRIO(2) /*!< high priority */ +#define DMA_PRIORITY_ULTRA_HIGH CHCTL_PRIO(3) /*!< ultra high priority */ + +/* memory to memory mode */ +#define DMA_MEMORY_TO_MEMORY_DISABLE ((uint32_t)0x00000000U) +#define DMA_MEMORY_TO_MEMORY_ENABLE ((uint32_t)0x00000001U) + +/* DMA_CHxCNT register */ +/* transfer counter */ +#define DMA_CHANNEL_CNT_MASK DMA_CHXCNT_CNT /*!< transfer counter mask */ + +/* function declarations */ +/* DMA deinitialization and initialization functions */ +/* deinitialize DMA a channel registers */ +void dma_deinit(uint32_t dma_periph, dma_channel_enum channelx); +/* initialize the parameters of DMA struct with the default values */ +void dma_struct_para_init(dma_parameter_struct* init_struct); +/* initialize DMA channel */ +void dma_init(uint32_t dma_periph, dma_channel_enum channelx, dma_parameter_struct* init_struct); +/* enable DMA circulation mode */ +void dma_circulation_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable DMA circulation mode */ +void dma_circulation_disable(uint32_t dma_periph, dma_channel_enum channelx); +/* enable memory to memory mode */ +void dma_memory_to_memory_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable memory to memory mode */ +void dma_memory_to_memory_disable(uint32_t dma_periph, dma_channel_enum channelx); +/* enable DMA channel */ +void dma_channel_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable DMA channel */ +void dma_channel_disable(uint32_t dma_periph, dma_channel_enum channelx); + +/* DMA configuration functions */ +/* set DMA peripheral base address */ +void dma_periph_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address); +/* set DMA memory base address */ +void dma_memory_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address); +/* set the number of remaining data to be transferred by the DMA */ +void dma_transfer_number_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t number); +/* get the number of remaining data to be transferred by the DMA */ +uint32_t dma_transfer_number_get(uint32_t dma_periph, dma_channel_enum channelx); +/* configure priority level of DMA channel */ +void dma_priority_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t priority); +/* configure transfer data size of memory */ +void dma_memory_width_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t mwidth); +/* configure transfer data size of peripheral */ +void dma_periph_width_config (uint32_t dma_periph, dma_channel_enum channelx, uint32_t pwidth); +/* enable next address increasement algorithm of memory */ +void dma_memory_increase_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable next address increasement algorithm of memory */ +void dma_memory_increase_disable(uint32_t dma_periph, dma_channel_enum channelx); +/* enable next address increasement algorithm of peripheral */ +void dma_periph_increase_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable next address increasement algorithm of peripheral */ +void dma_periph_increase_disable(uint32_t dma_periph, dma_channel_enum channelx); +/* configure the direction of data transfer on the channel */ +void dma_transfer_direction_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t direction); + +/* flag and interrupt functions */ +/* check DMA flag is set or not */ +FlagStatus dma_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); +/* clear DMA a channel flag */ +void dma_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); +/* check DMA flag and interrupt enable bit is set or not */ +FlagStatus dma_interrupt_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); +/* clear DMA a channel flag */ +void dma_interrupt_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); +/* enable DMA interrupt */ +void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source); +/* disable DMA interrupt */ +void dma_interrupt_disable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source); + +#endif /* GD32F30X_DMA_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_enet.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_enet.h new file mode 100644 index 0000000..daff2b7 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_enet.h @@ -0,0 +1,1702 @@ +/*! + \file gd32f30x_enet.h + \brief definitions for the ENET + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-04-02, V2.0.1, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_ENET_H +#define GD32F30X_ENET_H + +#include "gd32f30x.h" + +#define IF_USE_EXTERNPHY_LIB 0 +#if (1 == IF_USE_EXTERNPHY_LIB) +#include "phy.h" +#endif + +#ifndef ENET_RXBUF_NUM +#define ENET_RXBUF_NUM 5U /*!< ethernet Rx DMA descriptor number */ +#endif + +#ifndef ENET_TXBUF_NUM +#define ENET_TXBUF_NUM 5U /*!< ethernet Tx DMA descriptor number */ +#endif + +#ifndef ENET_RXBUF_SIZE +#define ENET_RXBUF_SIZE ENET_MAX_FRAME_SIZE /*!< ethernet receive buffer size */ +#endif + +#ifndef ENET_TXBUF_SIZE +#define ENET_TXBUF_SIZE ENET_MAX_FRAME_SIZE /*!< ethernet transmit buffer size */ +#endif + +/* #define SELECT_DESCRIPTORS_ENHANCED_MODE */ + +/* #define USE_DELAY */ + +#ifndef _PHY_H_ +#define DP83848 0 +#define LAN8700 1 +#define PHY_TYPE DP83848 + +#define PHY_ADDRESS ((uint16_t)1U) /*!< phy address determined by the hardware */ + +/* PHY read write timeouts */ +#define PHY_READ_TO ((uint32_t)0x0004FFFFU) /*!< PHY read timeout */ +#define PHY_WRITE_TO ((uint32_t)0x0004FFFFU) /*!< PHY write timeout */ + +/* PHY delay */ +#define PHY_RESETDELAY ((uint32_t)0x008FFFFFU) /*!< PHY reset delay */ +#define PHY_CONFIGDELAY ((uint32_t)0x00FFFFFFU) /*!< PHY configure delay */ + +/* PHY register address */ +#define PHY_REG_BCR 0U /*!< tranceiver basic control register */ +#define PHY_REG_BSR 1U /*!< tranceiver basic status register */ + +/* PHY basic control register */ +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< enable phy loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< configure speed to 100 Mbit/s and the full-duplex mode */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< configure speed to 100 Mbit/s and the half-duplex mode */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< configure speed to 10 Mbit/s and the full-duplex mode */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< configure speed to 10 Mbit/s and the half-duplex mode */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< enable the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< isolate PHY from MII */ + +/* PHY basic status register */ +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< auto-negotioation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< jabber condition detected */ + +#if(PHY_TYPE == LAN8700) +#define PHY_SR 31U /*!< tranceiver status register */ +#define PHY_SPEED_STATUS ((uint16_t)0x0004) /*!< configured information of speed: 10Mbit/s */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0010) /*!< configured information of duplex: full-duplex */ +#elif(PHY_TYPE == DP83848) +#define PHY_SR 16U /*!< tranceiver status register */ +#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< configured information of speed: 10Mbit/s */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< configured information of duplex: full-duplex */ +#endif /* PHY_TYPE */ + +#endif /* _PHY_H_ */ + + +/* ENET definitions */ +#define ENET ENET_BASE + +/* registers definitions */ +#define ENET_MAC_CFG REG32((ENET) + 0x00U) /*!< ethernet MAC configuration register */ +#define ENET_MAC_FRMF REG32((ENET) + 0x04U) /*!< ethernet MAC frame filter register */ +#define ENET_MAC_HLH REG32((ENET) + 0x08U) /*!< ethernet MAC hash list high register */ +#define ENET_MAC_HLL REG32((ENET) + 0x0CU) /*!< ethernet MAC hash list low register */ +#define ENET_MAC_PHY_CTL REG32((ENET) + 0x10U) /*!< ethernet MAC PHY control register */ +#define ENET_MAC_PHY_DATA REG32((ENET) + 0x14U) /*!< ethernet MAC MII data register */ +#define ENET_MAC_FCTL REG32((ENET) + 0x18U) /*!< ethernet MAC flow control register */ +#define ENET_MAC_VLT REG32((ENET) + 0x1CU) /*!< ethernet MAC VLAN tag register */ +#define ENET_MAC_RWFF REG32((ENET) + 0x28U) /*!< ethernet MAC remote wakeup frame filter register */ +#define ENET_MAC_WUM REG32((ENET) + 0x2CU) /*!< ethernet MAC wakeup management register */ +#define ENET_MAC_DBG REG32((ENET) + 0x34U) /*!< ethernet MAC debug register */ +#define ENET_MAC_INTF REG32((ENET) + 0x38U) /*!< ethernet MAC interrupt flag register */ +#define ENET_MAC_INTMSK REG32((ENET) + 0x3CU) /*!< ethernet MAC interrupt mask register */ +#define ENET_MAC_ADDR0H REG32((ENET) + 0x40U) /*!< ethernet MAC address 0 high register */ +#define ENET_MAC_ADDR0L REG32((ENET) + 0x44U) /*!< ethernet MAC address 0 low register */ +#define ENET_MAC_ADDR1H REG32((ENET) + 0x48U) /*!< ethernet MAC address 1 high register */ +#define ENET_MAC_ADDR1L REG32((ENET) + 0x4CU) /*!< ethernet MAC address 1 low register */ +#define ENET_MAC_ADDT2H REG32((ENET) + 0x50U) /*!< ethernet MAC address 2 high register */ +#define ENET_MAC_ADDR2L REG32((ENET) + 0x54U) /*!< ethernet MAC address 2 low register */ +#define ENET_MAC_ADDR3H REG32((ENET) + 0x58U) /*!< ethernet MAC address 3 high register */ +#define ENET_MAC_ADDR3L REG32((ENET) + 0x5CU) /*!< ethernet MAC address 3 low register */ +#define ENET_MAC_FCTH REG32((ENET) + 0x1080U) /*!< ethernet MAC flow control threshold register */ + +#define ENET_MSC_CTL REG32((ENET) + 0x100U) /*!< ethernet MSC control register */ +#define ENET_MSC_RINTF REG32((ENET) + 0x104U) /*!< ethernet MSC receive interrupt flag register */ +#define ENET_MSC_TINTF REG32((ENET) + 0x108U) /*!< ethernet MSC transmit interrupt flag register */ +#define ENET_MSC_RINTMSK REG32((ENET) + 0x10CU) /*!< ethernet MSC receive interrupt mask register */ +#define ENET_MSC_TINTMSK REG32((ENET) + 0x110U) /*!< ethernet MSC transmit interrupt mask register */ +#define ENET_MSC_SCCNT REG32((ENET) + 0x14CU) /*!< ethernet MSC transmitted good frames after a single collision counter register */ +#define ENET_MSC_MSCCNT REG32((ENET) + 0x150U) /*!< ethernet MSC transmitted good frames after more than a single collision counter register */ +#define ENET_MSC_TGFCNT REG32((ENET) + 0x168U) /*!< ethernet MSC transmitted good frames counter register */ +#define ENET_MSC_RFCECNT REG32((ENET) + 0x194U) /*!< ethernet MSC received frames with CRC error counter register */ +#define ENET_MSC_RFAECNT REG32((ENET) + 0x198U) /*!< ethernet MSC received frames with alignment error counter register */ +#define ENET_MSC_RGUFCNT REG32((ENET) + 0x1C4U) /*!< ethernet MSC received good unicast frames counter register */ + +#define ENET_PTP_TSCTL REG32((ENET) + 0x700U) /*!< ethernet PTP time stamp control register */ +#define ENET_PTP_SSINC REG32((ENET) + 0x704U) /*!< ethernet PTP subsecond increment register */ +#define ENET_PTP_TSH REG32((ENET) + 0x708U) /*!< ethernet PTP time stamp high register */ +#define ENET_PTP_TSL REG32((ENET) + 0x70CU) /*!< ethernet PTP time stamp low register */ +#define ENET_PTP_TSUH REG32((ENET) + 0x710U) /*!< ethernet PTP time stamp update high register */ +#define ENET_PTP_TSUL REG32((ENET) + 0x714U) /*!< ethernet PTP time stamp update low register */ +#define ENET_PTP_TSADDEND REG32((ENET) + 0x718U) /*!< ethernet PTP time stamp addend register */ +#define ENET_PTP_ETH REG32((ENET) + 0x71CU) /*!< ethernet PTP expected time high register */ +#define ENET_PTP_ETL REG32((ENET) + 0x720U) /*!< ethernet PTP expected time low register */ +#define ENET_PTP_TSF REG32((ENET) + 0x728U) /*!< ethernet PTP time stamp flag register */ +#define ENET_PTP_PPSCTL REG32((ENET) + 0x72CU) /*!< ethernet PTP PPS control register */ + +#define ENET_DMA_BCTL REG32((ENET) + 0x1000U) /*!< ethernet DMA bus control register */ +#define ENET_DMA_TPEN REG32((ENET) + 0x1004U) /*!< ethernet DMA transmit poll enable register */ +#define ENET_DMA_RPEN REG32((ENET) + 0x1008U) /*!< ethernet DMA receive poll enable register */ +#define ENET_DMA_RDTADDR REG32((ENET) + 0x100CU) /*!< ethernet DMA receive descriptor table address register */ +#define ENET_DMA_TDTADDR REG32((ENET) + 0x1010U) /*!< ethernet DMA transmit descriptor table address register */ +#define ENET_DMA_STAT REG32((ENET) + 0x1014U) /*!< ethernet DMA status register */ +#define ENET_DMA_CTL REG32((ENET) + 0x1018U) /*!< ethernet DMA control register */ +#define ENET_DMA_INTEN REG32((ENET) + 0x101CU) /*!< ethernet DMA interrupt enable register */ +#define ENET_DMA_MFBOCNT REG32((ENET) + 0x1020U) /*!< ethernet DMA missed frame and buffer overflow counter register */ +#define ENET_DMA_RSWDC REG32((ENET) + 0x1024U) /*!< ethernet DMA receive state watchdog counter register */ +#define ENET_DMA_CTDADDR REG32((ENET) + 0x1048U) /*!< ethernet DMA current transmit descriptor address register */ +#define ENET_DMA_CRDADDR REG32((ENET) + 0x104CU) /*!< ethernet DMA current receive descriptor address register */ +#define ENET_DMA_CTBADDR REG32((ENET) + 0x1050U) /*!< ethernet DMA current transmit buffer address register */ +#define ENET_DMA_CRBADDR REG32((ENET) + 0x1054U) /*!< ethernet DMA current receive buffer address register */ + +/* bits definitions */ +/* ENET_MAC_CFG */ +#define ENET_MAC_CFG_REN BIT(2) /*!< receiver enable */ +#define ENET_MAC_CFG_TEN BIT(3) /*!< transmitter enable */ +#define ENET_MAC_CFG_DFC BIT(4) /*!< defferal check */ +#define ENET_MAC_CFG_BOL BITS(5,6) /*!< back-off limit */ +#define ENET_MAC_CFG_APCD BIT(7) /*!< automatic pad/CRC drop */ +#define ENET_MAC_CFG_RTD BIT(9) /*!< retry disable */ +#define ENET_MAC_CFG_IPFCO BIT(10) /*!< IP frame checksum offload */ +#define ENET_MAC_CFG_DPM BIT(11) /*!< duplex mode */ +#define ENET_MAC_CFG_LBM BIT(12) /*!< loopback mode */ +#define ENET_MAC_CFG_ROD BIT(13) /*!< receive own disable */ +#define ENET_MAC_CFG_SPD BIT(14) /*!< fast eneternet speed */ +#define ENET_MAC_CFG_CSD BIT(16) /*!< carrier sense disable */ +#define ENET_MAC_CFG_IGBS BITS(17,19) /*!< inter-frame gap bit selection */ +#define ENET_MAC_CFG_JBD BIT(22) /*!< jabber disable */ +#define ENET_MAC_CFG_WDD BIT(23) /*!< watchdog disable */ +#define ENET_MAC_CFG_TFCD BIT(25) /*!< type frame CRC dropping */ + +/* ENET_MAC_FRMF */ +#define ENET_MAC_FRMF_PM BIT(0) /*!< promiscuous mode */ +#define ENET_MAC_FRMF_HUF BIT(1) /*!< hash unicast filter */ +#define ENET_MAC_FRMF_HMF BIT(2) /*!< hash multicast filter */ +#define ENET_MAC_FRMF_DAIFLT BIT(3) /*!< destination address inverse filtering enable */ +#define ENET_MAC_FRMF_MFD BIT(4) /*!< multicast filter disable */ +#define ENET_MAC_FRMF_BFRMD BIT(5) /*!< broadcast frame disable */ +#define ENET_MAC_FRMF_PCFRM BITS(6,7) /*!< pass control frames */ +#define ENET_MAC_FRMF_SAIFLT BIT(8) /*!< source address inverse filtering */ +#define ENET_MAC_FRMF_SAFLT BIT(9) /*!< source address filter */ +#define ENET_MAC_FRMF_HPFLT BIT(10) /*!< hash or perfect filter */ +#define ENET_MAC_FRMF_FAR BIT(31) /*!< frames all receive */ + +/* ENET_MAC_HLH */ +#define ENET_MAC_HLH_HLH BITS(0,31) /*!< hash list high */ + +/* ENET_MAC_HLL */ +#define ENET_MAC_HLL_HLL BITS(0,31) /*!< hash list low */ + +/* ENET_MAC_PHY_CTL */ +#define ENET_MAC_PHY_CTL_PB BIT(0) /*!< PHY busy */ +#define ENET_MAC_PHY_CTL_PW BIT(1) /*!< PHY write */ +#define ENET_MAC_PHY_CTL_CLR BITS(2,4) /*!< clock range */ +#define ENET_MAC_PHY_CTL_PR BITS(6,10) /*!< PHY register */ +#define ENET_MAC_PHY_CTL_PA BITS(11,15) /*!< PHY address */ + +/* ENET_MAC_PHY_DATA */ +#define ENET_MAC_PHY_DATA_PD BITS(0,15) /*!< PHY data */ + +/* ENET_MAC_FCTL */ +#define ENET_MAC_FCTL_FLCBBKPA BIT(0) /*!< flow control busy(in full duplex mode)/backpressure activate(in half duplex mode) */ +#define ENET_MAC_FCTL_TFCEN BIT(1) /*!< transmit flow control enable */ +#define ENET_MAC_FCTL_RFCEN BIT(2) /*!< receive flow control enable */ +#define ENET_MAC_FCTL_UPFDT BIT(3) /*!< unicast pause frame detect */ +#define ENET_MAC_FCTL_PLTS BITS(4,5) /*!< pause low threshold */ +#define ENET_MAC_FCTL_DZQP BIT(7) /*!< disable zero-quanta pause */ +#define ENET_MAC_FCTL_PTM BITS(16,31) /*!< pause time */ + +/* ENET_MAC_VLT */ +#define ENET_MAC_VLT_VLTI BITS(0,15) /*!< VLAN tag identifier(for receive frames) */ +#define ENET_MAC_VLT_VLTC BIT(16) /*!< 12-bit VLAN tag comparison */ + +/* ENET_MAC_RWFF */ +#define ENET_MAC_RWFF_DATA BITS(0,31) /*!< wakeup frame filter register data */ + +/* ENET_MAC_WUM */ +#define ENET_MAC_WUM_PWD BIT(0) /*!< power down */ +#define ENET_MAC_WUM_MPEN BIT(1) /*!< magic packet enable */ +#define ENET_MAC_WUM_WFEN BIT(2) /*!< wakeup frame enable */ +#define ENET_MAC_WUM_MPKR BIT(5) /*!< magic packet received */ +#define ENET_MAC_WUM_WUFR BIT(6) /*!< wakeup frame received */ +#define ENET_MAC_WUM_GU BIT(9) /*!< global unicast */ +#define ENET_MAC_WUM_WUFFRPR BIT(31) /*!< wakeup frame filter register pointer reset */ + +/* ENET_MAC_DBG */ +#define ENET_MAC_DBG_MRNI BIT(0) /*!< MAC receive state not idle */ +#define ENET_MAC_DBG_RXAFS BITS(1,2) /*!< Rx asynchronous FIFO status */ +#define ENET_MAC_DBG_RXFW BIT(4) /*!< RxFIFO is writing */ +#define ENET_MAC_DBG_RXFRS BITS(5,6) /*!< RxFIFO read operation status */ +#define ENET_MAC_DBG_RXFS BITS(8,9) /*!< RxFIFO state */ +#define ENET_MAC_DBG_MTNI BIT(16) /*!< MAC transmit state not idle */ +#define ENET_MAC_DBG_SOMT BITS(17,18) /*!< status of mac transmitter */ +#define ENET_MAC_DBG_PCS BIT(19) /*!< pause condition status */ +#define ENET_MAC_DBG_TXFRS BITS(20,21) /*!< TxFIFO read operation status */ +#define ENET_MAC_DBG_TXFW BIT(22) /*!< TxFIFO is writing */ +#define ENET_MAC_DBG_TXFNE BIT(24) /*!< TxFIFO not empty flag */ +#define ENET_MAC_DBG_TXFF BIT(25) /*!< TxFIFO full flag */ + +/* ENET_MAC_INTF */ +#define ENET_MAC_INTF_WUM BIT(3) /*!< WUM status */ +#define ENET_MAC_INTF_MSC BIT(4) /*!< MSC status */ +#define ENET_MAC_INTF_MSCR BIT(5) /*!< MSC receive status */ +#define ENET_MAC_INTF_MSCT BIT(6) /*!< MSC transmit status */ +#define ENET_MAC_INTF_TMST BIT(9) /*!< timestamp trigger status */ + +/* ENET_MAC_INTMSK */ +#define ENET_MAC_INTMSK_WUMIM BIT(3) /*!< WUM interrupt mask */ +#define ENET_MAC_INTMSK_TMSTIM BIT(9) /*!< timestamp trigger interrupt mask */ + +/* ENET_MAC_ADDR0H */ +#define ENET_MAC_ADDR0H_ADDR0H BITS(0,15) /*!< MAC address0 high */ +#define ENET_MAC_ADDR0H_MO BIT(31) /*!< always read 1 and must be kept */ + +/* ENET_MAC_ADDR0L */ +#define ENET_MAC_ADDR0L_ADDR0L BITS(0,31) /*!< MAC address0 low */ + +/* ENET_MAC_ADDR1H */ +#define ENET_MAC_ADDR1H_ADDR1H BITS(0,15) /*!< MAC address1 high */ +#define ENET_MAC_ADDR1H_MB BITS(24,29) /*!< mask byte */ +#define ENET_MAC_ADDR1H_SAF BIT(30) /*!< source address filter */ +#define ENET_MAC_ADDR1H_AFE BIT(31) /*!< address filter enable */ + +/* ENET_MAC_ADDR1L */ +#define ENET_MAC_ADDR1L_ADDR1L BITS(0,31) /*!< MAC address1 low */ + +/* ENET_MAC_ADDR2H */ +#define ENET_MAC_ADDR2H_ADDR2H BITS(0,15) /*!< MAC address2 high */ +#define ENET_MAC_ADDR2H_MB BITS(24,29) /*!< mask byte */ +#define ENET_MAC_ADDR2H_SAF BIT(30) /*!< source address filter */ +#define ENET_MAC_ADDR2H_AFE BIT(31) /*!< address filter enable */ + +/* ENET_MAC_ADDR2L */ +#define ENET_MAC_ADDR2L_ADDR2L BITS(0,31) /*!< MAC address2 low */ + +/* ENET_MAC_ADDR3H */ +#define ENET_MAC_ADDR3H_ADDR3H BITS(0,15) /*!< MAC address3 high */ +#define ENET_MAC_ADDR3H_MB BITS(24,29) /*!< mask byte */ +#define ENET_MAC_ADDR3H_SAF BIT(30) /*!< source address filter */ +#define ENET_MAC_ADDR3H_AFE BIT(31) /*!< address filter enable */ + +/* ENET_MAC_ADDR3L */ +#define ENET_MAC_ADDR3L_ADDR3L BITS(0,31) /*!< MAC address3 low */ + +/* ENET_MAC_FCTH */ +#define ENET_MAC_FCTH_RFA BITS(0,2) /*!< threshold of active flow control */ +#define ENET_MAC_FCTH_RFD BITS(4,6) /*!< threshold of deactive flow control */ + +/* ENET_MSC_CTL */ +#define ENET_MSC_CTL_CTR BIT(0) /*!< counter reset */ +#define ENET_MSC_CTL_CTSR BIT(1) /*!< counter stop rollover */ +#define ENET_MSC_CTL_RTOR BIT(2) /*!< reset on read */ +#define ENET_MSC_CTL_MCFZ BIT(3) /*!< MSC counter freeze */ +#define ENET_MSC_CTL_PMC BIT(4) /*!< preset MSC counter */ +#define ENET_MSC_CTL_AFHPM BIT(5) /*!< almost full or half preset mode */ + +/* ENET_MSC_RINTF */ +#define ENET_MSC_RINTF_RFCE BIT(5) /*!< received frames CRC error */ +#define ENET_MSC_RINTF_RFAE BIT(6) /*!< received frames alignment error */ +#define ENET_MSC_RINTF_RGUF BIT(17) /*!< receive good unicast frames */ + +/* ENET_MSC_TINTF */ +#define ENET_MSC_TINTF_TGFSC BIT(14) /*!< transmitted good frames single collision */ +#define ENET_MSC_TINTF_TGFMSC BIT(15) /*!< transmitted good frames more single collision */ +#define ENET_MSC_TINTF_TGF BIT(21) /*!< transmitted good frames */ + +/* ENET_MSC_RINTMSK */ +#define ENET_MSC_RINTMSK_RFCEIM BIT(5) /*!< received frame CRC error interrupt mask */ +#define ENET_MSC_RINTMSK_RFAEIM BIT(6) /*!< received frames alignment error interrupt mask */ +#define ENET_MSC_RINTMSK_RGUFIM BIT(17) /*!< received good unicast frames interrupt mask */ + +/* ENET_MSC_TINTMSK */ +#define ENET_MSC_TINTMSK_TGFSCIM BIT(14) /*!< transmitted good frames single collision interrupt mask */ +#define ENET_MSC_TINTMSK_TGFMSCIM BIT(15) /*!< transmitted good frames more single collision interrupt mask */ +#define ENET_MSC_TINTMSK_TGFIM BIT(21) /*!< transmitted good frames interrupt mask */ + +/* ENET_MSC_SCCNT */ +#define ENET_MSC_SCCNT_SCC BITS(0,31) /*!< transmitted good frames single collision counter */ + +/* ENET_MSC_MSCCNT */ +#define ENET_MSC_MSCCNT_MSCC BITS(0,31) /*!< transmitted good frames more one single collision counter */ + +/* ENET_MSC_TGFCNT */ +#define ENET_MSC_TGFCNT_TGF BITS(0,31) /*!< transmitted good frames counter */ + +/* ENET_MSC_RFCECNT */ +#define ENET_MSC_RFCECNT_RFCER BITS(0,31) /*!< received frames with CRC error counter */ + +/* ENET_MSC_RFAECNT */ +#define ENET_MSC_RFAECNT_RFAER BITS(0,31) /*!< received frames alignment error counter */ + +/* ENET_MSC_RGUFCNT */ +#define ENET_MSC_RGUFCNT_RGUF BITS(0,31) /*!< received good unicast frames counter */ + +/* ENET_PTP_TSCTL */ +#define ENET_PTP_TSCTL_TMSEN BIT(0) /*!< timestamp enable */ +#define ENET_PTP_TSCTL_TMSFCU BIT(1) /*!< timestamp fine or coarse update */ +#define ENET_PTP_TSCTL_TMSSTI BIT(2) /*!< timestamp system time initialize */ +#define ENET_PTP_TSCTL_TMSSTU BIT(3) /*!< timestamp system time update */ +#define ENET_PTP_TSCTL_TMSITEN BIT(4) /*!< timestamp interrupt trigger enable */ +#define ENET_PTP_TSCTL_TMSARU BIT(5) /*!< timestamp addend register update */ +#define ENET_PTP_TSCTL_ARFSEN BIT(8) /*!< all received frames snapshot enable */ +#define ENET_PTP_TSCTL_SCROM BIT(9) /*!< subsecond counter rollover mode */ +#define ENET_PTP_TSCTL_PFSV BIT(10) /*!< PTP frame snooping version */ +#define ENET_PTP_TSCTL_ESEN BIT(11) /*!< received Ethernet snapshot enable */ +#define ENET_PTP_TSCTL_IP6SEN BIT(12) /*!< received IPv6 snapshot enable */ +#define ENET_PTP_TSCTL_IP4SEN BIT(13) /*!< received IPv4 snapshot enable */ +#define ENET_PTP_TSCTL_ETMSEN BIT(14) /*!< received event type message snapshot enable */ +#define ENET_PTP_TSCTL_MNMSEN BIT(15) /*!< received master node message snapshot enable */ +#define ENET_PTP_TSCTL_CKNT BITS(16,17) /*!< clock node type for time stamp */ +#define ENET_PTP_TSCTL_MAFEN BIT(18) /*!< MAC address filter enable for PTP frame */ + +/* ENET_PTP_SSINC */ +#define ENET_PTP_SSINC_STMSSI BITS(0,7) /*!< system time subsecond increment */ + +/* ENET_PTP_TSH */ +#define ENET_PTP_TSH_STMS BITS(0,31) /*!< system time second */ + +/* ENET_PTP_TSL */ +#define ENET_PTP_TSL_STMSS BITS(0,30) /*!< system time subseconds */ +#define ENET_PTP_TSL_STS BIT(31) /*!< system time sign */ + +/* ENET_PTP_TSUH */ +#define ENET_PTP_TSUH_TMSUS BITS(0,31) /*!< timestamp update seconds */ + +/* ENET_PTP_TSUL */ +#define ENET_PTP_TSUL_TMSUSS BITS(0,30) /*!< timestamp update subseconds */ +#define ENET_PTP_TSUL_TMSUPNS BIT(31) /*!< timestamp update positive or negative sign */ + +/* ENET_PTP_TSADDEND */ +#define ENET_PTP_TSADDEND_TMSA BITS(0,31) /*!< timestamp addend */ + +/* ENET_PTP_ETH */ +#define ENET_PTP_ETH_ETSH BITS(0,31) /*!< expected time high */ + +/* ENET_PTP_ETL */ +#define ENET_PTP_ETL_ETSL BITS(0,31) /*!< expected time low */ + +/* ENET_PTP_TSF */ +#define ENET_PTP_TSF_TSSCO BIT(0) /*!< timestamp second counter overflow */ +#define ENET_PTP_TSF_TTM BIT(1) /*!< target time match */ + +/* ENET_PTP_PPSCTL */ +#define ENET_PTP_PPSCTL_PPSOFC BITS(0,3) /*!< PPS output frequency configure */ + +/* ENET_DMA_BCTL */ +#define ENET_DMA_BCTL_SWR BIT(0) /*!< software reset */ +#define ENET_DMA_BCTL_DAB BIT(1) /*!< DMA arbitration */ +#define ENET_DMA_BCTL_DPSL BITS(2,6) /*!< descriptor skip length */ +#define ENET_DMA_BCTL_DFM BIT(7) /*!< descriptor format mode */ +#define ENET_DMA_BCTL_PGBL BITS(8,13) /*!< programmable burst length */ +#define ENET_DMA_BCTL_RTPR BITS(14,15) /*!< RxDMA and TxDMA transfer priority ratio */ +#define ENET_DMA_BCTL_FB BIT(16) /*!< fixed Burst */ +#define ENET_DMA_BCTL_RXDP BITS(17,22) /*!< RxDMA PGBL */ +#define ENET_DMA_BCTL_UIP BIT(23) /*!< use independent PGBL */ +#define ENET_DMA_BCTL_FPBL BIT(24) /*!< four times PGBL mode */ +#define ENET_DMA_BCTL_AA BIT(25) /*!< address-aligned */ +#define ENET_DMA_BCTL_MB BIT(26) /*!< mixed burst */ + +/* ENET_DMA_TPEN */ +#define ENET_DMA_TPEN_TPE BITS(0,31) /*!< transmit poll enable */ + +/* ENET_DMA_RPEN */ +#define ENET_DMA_RPEN_RPE BITS(0,31) /*!< receive poll enable */ + +/* ENET_DMA_RDTADDR */ +#define ENET_DMA_RDTADDR_SRT BITS(0,31) /*!< start address of receive table */ + +/* ENET_DMA_TDTADDR */ +#define ENET_DMA_TDTADDR_STT BITS(0,31) /*!< start address of transmit table */ + +/* ENET_DMA_STAT */ +#define ENET_DMA_STAT_TS BIT(0) /*!< transmit status */ +#define ENET_DMA_STAT_TPS BIT(1) /*!< transmit process stopped status */ +#define ENET_DMA_STAT_TBU BIT(2) /*!< transmit buffer unavailable status */ +#define ENET_DMA_STAT_TJT BIT(3) /*!< transmit jabber timeout status */ +#define ENET_DMA_STAT_RO BIT(4) /*!< receive overflow status */ +#define ENET_DMA_STAT_TU BIT(5) /*!< transmit underflow status */ +#define ENET_DMA_STAT_RS BIT(6) /*!< receive status */ +#define ENET_DMA_STAT_RBU BIT(7) /*!< receive buffer unavailable status */ +#define ENET_DMA_STAT_RPS BIT(8) /*!< receive process stopped status */ +#define ENET_DMA_STAT_RWT BIT(9) /*!< receive watchdog timeout status */ +#define ENET_DMA_STAT_ET BIT(10) /*!< early transmit status */ +#define ENET_DMA_STAT_FBE BIT(13) /*!< fatal bus error status */ +#define ENET_DMA_STAT_ER BIT(14) /*!< early receive status */ +#define ENET_DMA_STAT_AI BIT(15) /*!< abnormal interrupt summary */ +#define ENET_DMA_STAT_NI BIT(16) /*!< normal interrupt summary */ +#define ENET_DMA_STAT_RP BITS(17,19) /*!< receive process state */ +#define ENET_DMA_STAT_TP BITS(20,22) /*!< transmit process state */ +#define ENET_DMA_STAT_EB BITS(23,25) /*!< error bits status */ +#define ENET_DMA_STAT_MSC BIT(27) /*!< MSC status */ +#define ENET_DMA_STAT_WUM BIT(28) /*!< WUM status */ +#define ENET_DMA_STAT_TST BIT(29) /*!< timestamp trigger status */ + +/* ENET_DMA_CTL */ +#define ENET_DMA_CTL_SRE BIT(1) /*!< start/stop receive enable */ +#define ENET_DMA_CTL_OSF BIT(2) /*!< operate on second frame */ +#define ENET_DMA_CTL_RTHC BITS(3,4) /*!< receive threshold control */ +#define ENET_DMA_CTL_FUF BIT(6) /*!< forward undersized good frames */ +#define ENET_DMA_CTL_FERF BIT(7) /*!< forward error frames */ +#define ENET_DMA_CTL_STE BIT(13) /*!< start/stop transmission enable */ +#define ENET_DMA_CTL_TTHC BITS(14,16) /*!< transmit threshold control */ +#define ENET_DMA_CTL_FTF BIT(20) /*!< flush transmit FIFO */ +#define ENET_DMA_CTL_TSFD BIT(21) /*!< transmit store-and-forward */ +#define ENET_DMA_CTL_DAFRF BIT(24) /*!< disable flushing of received frames */ +#define ENET_DMA_CTL_RSFD BIT(25) /*!< receive store-and-forward */ +#define ENET_DMA_CTL_DTCERFD BIT(26) /*!< dropping of TCP/IP checksum error frames disable */ + +/* ENET_DMA_INTEN */ +#define ENET_DMA_INTEN_TIE BIT(0) /*!< transmit interrupt enable */ +#define ENET_DMA_INTEN_TPSIE BIT(1) /*!< transmit process stopped interrupt enable */ +#define ENET_DMA_INTEN_TBUIE BIT(2) /*!< transmit buffer unavailable interrupt enable */ +#define ENET_DMA_INTEN_TJTIE BIT(3) /*!< transmit jabber timeout interrupt enable */ +#define ENET_DMA_INTEN_ROIE BIT(4) /*!< receive overflow interrupt enable */ +#define ENET_DMA_INTEN_TUIE BIT(5) /*!< transmit underflow interrupt enable */ +#define ENET_DMA_INTEN_RIE BIT(6) /*!< receive interrupt enable */ +#define ENET_DMA_INTEN_RBUIE BIT(7) /*!< receive buffer unavailable interrupt enable */ +#define ENET_DMA_INTEN_RPSIE BIT(8) /*!< receive process stopped interrupt enable */ +#define ENET_DMA_INTEN_RWTIE BIT(9) /*!< receive watchdog timeout interrupt enable */ +#define ENET_DMA_INTEN_ETIE BIT(10) /*!< early transmit interrupt enable */ +#define ENET_DMA_INTEN_FBEIE BIT(13) /*!< fatal bus error interrupt enable */ +#define ENET_DMA_INTEN_ERIE BIT(14) /*!< early receive interrupt enable */ +#define ENET_DMA_INTEN_AIE BIT(15) /*!< abnormal interrupt summary enable */ +#define ENET_DMA_INTEN_NIE BIT(16) /*!< normal interrupt summary enable */ + +/* ENET_DMA_MFBOCNT */ +#define ENET_DMA_MFBOCNT_MSFC BITS(0,15) /*!< missed frames by the controller */ +#define ENET_DMA_MFBOCNT_MSFA BITS(17,27) /*!< missed frames by the application */ + +/* ENET_DMA_RSWDC */ +#define ENET_DMA_RSWDC_WDCFRS BITS(0,7) /*!< watchdog counter for receive status (RS) */ + +/* ENET_DMA_CTDADDR */ +#define ENET_DMA_CTDADDR_TDAP BITS(0,31) /*!< transmit descriptor address pointer */ + +/* ENET_DMA_CRDADDR */ +#define ENET_DMA_CRDADDR_RDAP BITS(0,31) /*!< receive descriptor address pointer */ + +/* ENET_DMA_CTBADDR */ +#define ENET_DMA_CTBADDR_TBAP BITS(0,31) /*!< transmit buffer address pointer */ + +/* ENET_DMA_CRBADDR */ +#define ENET_DMA_CRBADDR_RBAP BITS(0,31) /*!< receive buffer address pointer */ + +/* ENET DMA Tx descriptor TDES0 */ +#define ENET_TDES0_DB BIT(0) /*!< deferred */ +#define ENET_TDES0_UFE BIT(1) /*!< underflow error */ +#define ENET_TDES0_EXD BIT(2) /*!< excessive deferral */ +#define ENET_TDES0_COCNT BITS(3,6) /*!< collision count */ +#define ENET_TDES0_VFRM BIT(7) /*!< VLAN frame */ +#define ENET_TDES0_ECO BIT(8) /*!< excessive collision */ +#define ENET_TDES0_LCO BIT(9) /*!< late collision */ +#define ENET_TDES0_NCA BIT(10) /*!< no carrier */ +#define ENET_TDES0_LCA BIT(11) /*!< loss of carrier */ +#define ENET_TDES0_IPPE BIT(12) /*!< IP payload error */ +#define ENET_TDES0_FRMF BIT(13) /*!< frame flushed */ +#define ENET_TDES0_JT BIT(14) /*!< jabber timeout */ +#define ENET_TDES0_ES BIT(15) /*!< error summary */ +#define ENET_TDES0_IPHE BIT(16) /*!< IP header error */ +#define ENET_TDES0_TTMSS BIT(17) /*!< transmit timestamp status */ +#define ENET_TDES0_TCHM BIT(20) /*!< the second address chained mode */ +#define ENET_TDES0_TERM BIT(21) /*!< transmit end of ring mode*/ +#define ENET_TDES0_CM BITS(22,23) /*!< checksum mode */ +#define ENET_TDES0_TTSEN BIT(25) /*!< transmit timestamp function enable */ +#define ENET_TDES0_DPAD BIT(26) /*!< disable adding pad */ +#define ENET_TDES0_DCRC BIT(27) /*!< disable CRC */ +#define ENET_TDES0_FSG BIT(28) /*!< first segment */ +#define ENET_TDES0_LSG BIT(29) /*!< last segment */ +#define ENET_TDES0_INTC BIT(30) /*!< interrupt on completion */ +#define ENET_TDES0_DAV BIT(31) /*!< DAV bit */ + +/* ENET DMA Tx descriptor TDES1 */ +#define ENET_TDES1_TB1S BITS(0,12) /*!< transmit buffer 1 size */ +#define ENET_TDES1_TB2S BITS(16,28) /*!< transmit buffer 2 size */ + +/* ENET DMA Tx descriptor TDES2 */ +#define ENET_TDES2_TB1AP BITS(0,31) /*!< transmit buffer 1 address pointer/transmit frame timestamp low 32-bit value */ + +/* ENET DMA Tx descriptor TDES3 */ +#define ENET_TDES3_TB2AP BITS(0,31) /*!< transmit buffer 2 address pointer (or next descriptor address) / transmit frame timestamp high 32-bit value */ + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE +/* ENET DMA Tx descriptor TDES6 */ +#define ENET_TDES6_TTSL BITS(0,31) /*!< transmit frame timestamp low 32-bit value */ + +/* ENET DMA Tx descriptor TDES7 */ +#define ENET_TDES7_TTSH BITS(0,31) /*!< transmit frame timestamp high 32-bit value */ +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + +/* ENET DMA Rx descriptor RDES0 */ +#define ENET_RDES0_PCERR BIT(0) /*!< payload checksum error */ +#define ENET_RDES0_EXSV BIT(0) /*!< extended status valid */ +#define ENET_RDES0_CERR BIT(1) /*!< CRC error */ +#define ENET_RDES0_DBERR BIT(2) /*!< dribble bit error */ +#define ENET_RDES0_RERR BIT(3) /*!< receive error */ +#define ENET_RDES0_RWDT BIT(4) /*!< receive watchdog timeout */ +#define ENET_RDES0_FRMT BIT(5) /*!< frame type */ +#define ENET_RDES0_LCO BIT(6) /*!< late collision */ +#define ENET_RDES0_IPHERR BIT(7) /*!< IP frame header error */ +#define ENET_RDES0_TSV BIT(7) /*!< timestamp valid */ +#define ENET_RDES0_LDES BIT(8) /*!< last descriptor */ +#define ENET_RDES0_FDES BIT(9) /*!< first descriptor */ +#define ENET_RDES0_VTAG BIT(10) /*!< VLAN tag */ +#define ENET_RDES0_OERR BIT(11) /*!< overflow Error */ +#define ENET_RDES0_LERR BIT(12) /*!< length error */ +#define ENET_RDES0_SAFF BIT(13) /*!< SA filter fail */ +#define ENET_RDES0_DERR BIT(14) /*!< descriptor error */ +#define ENET_RDES0_ERRS BIT(15) /*!< error summary */ +#define ENET_RDES0_FRML BITS(16,29) /*!< frame length */ +#define ENET_RDES0_DAFF BIT(30) /*!< destination address filter fail */ +#define ENET_RDES0_DAV BIT(31) /*!< descriptor available */ + +/* ENET DMA Rx descriptor RDES1 */ +#define ENET_RDES1_RB1S BITS(0,12) /*!< receive buffer 1 size */ +#define ENET_RDES1_RCHM BIT(14) /*!< receive chained mode for second address */ +#define ENET_RDES1_RERM BIT(15) /*!< receive end of ring mode*/ +#define ENET_RDES1_RB2S BITS(16,28) /*!< receive buffer 2 size */ +#define ENET_RDES1_DINTC BIT(31) /*!< disable interrupt on completion */ + +/* ENET DMA Rx descriptor RDES2 */ +#define ENET_RDES2_RB1AP BITS(0,31) /*!< receive buffer 1 address pointer / receive frame timestamp low 32-bit */ + +/* ENET DMA Rx descriptor RDES3 */ +#define ENET_RDES3_RB2AP BITS(0,31) /*!< receive buffer 2 address pointer (next descriptor address)/receive frame timestamp high 32-bit value */ + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE +/* ENET DMA Rx descriptor RDES4 */ +#define ENET_RDES4_IPPLDT BITS(0,2) /*!< IP frame payload type */ +#define ENET_RDES4_IPHERR BIT(3) /*!< IP frame header error */ +#define ENET_RDES4_IPPLDERR BIT(4) /*!< IP frame payload error */ +#define ENET_RDES4_IPCKSB BIT(5) /*!< IP frame checksum bypassed */ +#define ENET_RDES4_IPF4 BIT(6) /*!< IP frame in version 4 */ +#define ENET_RDES4_IPF6 BIT(7) /*!< IP frame in version 6 */ +#define ENET_RDES4_PTPMT BITS(8,11) /*!< PTP message type */ +#define ENET_RDES4_PTPOEF BIT(12) /*!< PTP on ethernet frame */ +#define ENET_RDES4_PTPVF BIT(13) /*!< PTP version format */ + +/* ENET DMA Rx descriptor RDES6 */ +#define ENET_RDES6_RTSL BITS(0,31) /*!< receive frame timestamp low 32-bit value */ + +/* ENET DMA Rx descriptor RDES7 */ +#define ENET_RDES7_RTSH BITS(0,31) /*!< receive frame timestamp high 32-bit value */ +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + +/* constants definitions */ +/* define bit position and its register index offset */ +#define ENET_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define ENET_REG_VAL(periph) (REG32(ENET + ((uint32_t)(periph)>>6))) +#define ENET_BIT_POS(val) ((uint32_t)(val) & 0x1FU) + +/* ENET clock range judgement */ +#define ENET_RANGE(hclk, n, m) (((hclk) >= (n))&&((hclk) < (m))) + +/* define MAC address configuration and reference address */ +#define ENET_SET_MACADDRH(p) (((uint32_t)(p)[5] << 8) | (uint32_t)(p)[4]) +#define ENET_SET_MACADDRL(p) (((uint32_t)(p)[3] << 24) | ((uint32_t)(p)[2] << 16) | ((uint32_t)(p)[1] << 8) | (uint32_t)(p)[0]) +#define ENET_ADDRH_BASE ((ENET) + 0x40U) +#define ENET_ADDRL_BASE ((ENET) + 0x44U) +#define ENET_GET_MACADDR(offset, n) ((uint8_t)((REG32((ENET_ADDRL_BASE + (offset)) - (((n) / 4U) * 4U)) >> (8U * ((n) % 4U))) & 0xFFU)) + +/* register offset */ +#define MAC_FCTL_REG_OFFSET 0x0018U /*!< MAC flow control register offset */ +#define MAC_WUM_REG_OFFSET 0x002CU /*!< MAC wakeup management register offset */ +#define MAC_INTF_REG_OFFSET 0x0038U /*!< MAC interrupt flag register offset */ +#define MAC_INTMSK_REG_OFFSET 0x003CU /*!< MAC interrupt mask register offset */ + +#define MSC_RINTF_REG_OFFSET 0x0104U /*!< MSC receive interrupt flag register offset */ +#define MSC_TINTF_REG_OFFSET 0x0108U /*!< MSC transmit interrupt flag register offset */ +#define MSC_RINTMSK_REG_OFFSET 0x010CU /*!< MSC receive interrupt mask register offset */ +#define MSC_TINTMSK_REG_OFFSET 0x0110U /*!< MSC transmit interrupt mask register offset */ +#define MSC_SCCNT_REG_OFFSET 0x014CU /*!< MSC transmitted good frames after a single collision counter register offset */ +#define MSC_MSCCNT_REG_OFFSET 0x0150U /*!< MSC transmitted good frames after more than a single collision counter register offset */ +#define MSC_TGFCNT_REG_OFFSET 0x0168U /*!< MSC transmitted good frames counter register offset */ +#define MSC_RFCECNT_REG_OFFSET 0x0194U /*!< MSC received frames with CRC error counter register offset */ +#define MSC_RFAECNT_REG_OFFSET 0x0198U /*!< MSC received frames with alignment error counter register offset */ +#define MSC_RGUFCNT_REG_OFFSET 0x01C4U /*!< MSC received good unicast frames counter register offset */ + +#define PTP_TSF_REG_OFFSET 0x0728U /*!< PTP time stamp flag register offset */ + +#define DMA_STAT_REG_OFFSET 0x1014U /*!< DMA status register offset */ +#define DMA_INTEN_REG_OFFSET 0x101CU /*!< DMA interrupt enable register offset */ +#define DMA_TDTADDR_REG_OFFSET 0x1010U /*!< DMA transmit descriptor table address register offset */ +#define DMA_CTDADDR_REG_OFFSET 0x1048U /*!< DMA current transmit descriptor address register */ +#define DMA_CTBADDR_REG_OFFSET 0x1050U /*!< DMA current transmit buffer address register */ +#define DMA_RDTADDR_REG_OFFSET 0x100CU /*!< DMA receive descriptor table address register */ +#define DMA_CRDADDR_REG_OFFSET 0x104CU /*!< DMA current receive descriptor address register */ +#define DMA_CRBADDR_REG_OFFSET 0x1054U /*!< DMA current receive buffer address register */ + +/* ENET status flag get */ +typedef enum +{ + /* ENET_MAC_WUM register */ + ENET_MAC_FLAG_MPKR = ENET_REGIDX_BIT(MAC_WUM_REG_OFFSET, 5U), /*!< magic packet received flag */ + ENET_MAC_FLAG_WUFR = ENET_REGIDX_BIT(MAC_WUM_REG_OFFSET, 6U), /*!< wakeup frame received flag */ + /* ENET_MAC_FCTL register */ + ENET_MAC_FLAG_FLOWCONTROL = ENET_REGIDX_BIT(MAC_FCTL_REG_OFFSET, 0U), /*!< flow control status flag */ + /* ENET_MAC_INTF register */ + ENET_MAC_FLAG_WUM = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 3U), /*!< WUM status flag */ + ENET_MAC_FLAG_MSC = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 4U), /*!< MSC status flag */ + ENET_MAC_FLAG_MSCR = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 5U), /*!< MSC receive status flag */ + ENET_MAC_FLAG_MSCT = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 6U), /*!< MSC transmit status flag */ + ENET_MAC_FLAG_TMST = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 9U), /*!< timestamp trigger status flag */ + /* ENET_PTP_TSF register */ + ENET_PTP_FLAG_TSSCO = ENET_REGIDX_BIT(PTP_TSF_REG_OFFSET, 0U), /*!< timestamp second counter overflow flag */ + ENET_PTP_FLAG_TTM = ENET_REGIDX_BIT(PTP_TSF_REG_OFFSET, 1U), /*!< target time match flag */ + /* ENET_MSC_RINTF register */ + ENET_MSC_FLAG_RFCE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 5U), /*!< received frames CRC error flag */ + ENET_MSC_FLAG_RFAE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 6U), /*!< received frames alignment error flag */ + ENET_MSC_FLAG_RGUF = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 17U), /*!< received good unicast frames flag */ + /* ENET_MSC_TINTF register */ + ENET_MSC_FLAG_TGFSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 14U), /*!< transmitted good frames single collision flag */ + ENET_MSC_FLAG_TGFMSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 15U), /*!< transmitted good frames more single collision flag */ + ENET_MSC_FLAG_TGF = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 21U), /*!< transmitted good frames flag */ + /* ENET_DMA_STAT register */ + ENET_DMA_FLAG_TS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ + ENET_DMA_FLAG_TPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ + ENET_DMA_FLAG_TBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ + ENET_DMA_FLAG_TJT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ + ENET_DMA_FLAG_RO = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ + ENET_DMA_FLAG_TU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ + ENET_DMA_FLAG_RS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ + ENET_DMA_FLAG_RBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ + ENET_DMA_FLAG_RPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ + ENET_DMA_FLAG_RWT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ + ENET_DMA_FLAG_ET = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ + ENET_DMA_FLAG_FBE = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ + ENET_DMA_FLAG_ER = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ + ENET_DMA_FLAG_AI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ + ENET_DMA_FLAG_NI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U), /*!< normal interrupt summary flag */ + ENET_DMA_FLAG_EB_DMA_ERROR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 23U), /*!< error during data transfer by RxDMA/TxDMA flag */ + ENET_DMA_FLAG_EB_TRANSFER_ERROR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 24U), /*!< error during write/read transfer flag */ + ENET_DMA_FLAG_EB_ACCESS_ERROR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 25U), /*!< error during data buffer/descriptor access flag */ + ENET_DMA_FLAG_MSC = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 27U), /*!< MSC status flag */ + ENET_DMA_FLAG_WUM = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 28U), /*!< WUM status flag */ + ENET_DMA_FLAG_TST = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 29U), /*!< timestamp trigger status flag */ +}enet_flag_enum; + +/* ENET stutus flag clear */ +typedef enum +{ + /* ENET_DMA_STAT register */ + ENET_DMA_FLAG_TS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ + ENET_DMA_FLAG_TPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ + ENET_DMA_FLAG_TBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ + ENET_DMA_FLAG_TJT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ + ENET_DMA_FLAG_RO_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ + ENET_DMA_FLAG_TU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ + ENET_DMA_FLAG_RS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ + ENET_DMA_FLAG_RBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ + ENET_DMA_FLAG_RPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ + ENET_DMA_FLAG_RWT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ + ENET_DMA_FLAG_ET_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ + ENET_DMA_FLAG_FBE_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ + ENET_DMA_FLAG_ER_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ + ENET_DMA_FLAG_AI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ + ENET_DMA_FLAG_NI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U), /*!< normal interrupt summary flag */ +}enet_flag_clear_enum; + +/* ENET interrupt enable/disable */ +typedef enum +{ + /* ENET_MAC_INTMSK register */ + ENET_MAC_INT_WUMIM = ENET_REGIDX_BIT(MAC_INTMSK_REG_OFFSET, 3U), /*!< WUM interrupt mask */ + ENET_MAC_INT_TMSTIM = ENET_REGIDX_BIT(MAC_INTMSK_REG_OFFSET, 9U), /*!< timestamp trigger interrupt mask */ + /* ENET_MSC_RINTMSK register */ + ENET_MSC_INT_RFCEIM = ENET_REGIDX_BIT(MSC_RINTMSK_REG_OFFSET, 5U), /*!< received frame CRC error interrupt mask */ + ENET_MSC_INT_RFAEIM = ENET_REGIDX_BIT(MSC_RINTMSK_REG_OFFSET, 6U), /*!< received frames alignment error interrupt mask */ + ENET_MSC_INT_RGUFIM = ENET_REGIDX_BIT(MSC_RINTMSK_REG_OFFSET, 17U), /*!< received good unicast frames interrupt mask */ + /* ENET_MSC_TINTMSK register */ + ENET_MSC_INT_TGFSCIM = ENET_REGIDX_BIT(MSC_TINTMSK_REG_OFFSET, 14U), /*!< transmitted good frames single collision interrupt mask */ + ENET_MSC_INT_TGFMSCIM = ENET_REGIDX_BIT(MSC_TINTMSK_REG_OFFSET, 15U), /*!< transmitted good frames more single collision interrupt mask */ + ENET_MSC_INT_TGFIM = ENET_REGIDX_BIT(MSC_TINTMSK_REG_OFFSET, 21U), /*!< transmitted good frames interrupt mask */ + /* ENET_DMA_INTEN register */ + ENET_DMA_INT_TIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 0U), /*!< transmit interrupt enable */ + ENET_DMA_INT_TPSIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 1U), /*!< transmit process stopped interrupt enable */ + ENET_DMA_INT_TBUIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 2U), /*!< transmit buffer unavailable interrupt enable */ + ENET_DMA_INT_TJTIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 3U), /*!< transmit jabber timeout interrupt enable */ + ENET_DMA_INT_ROIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 4U), /*!< receive overflow interrupt enable */ + ENET_DMA_INT_TUIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 5U), /*!< transmit underflow interrupt enable */ + ENET_DMA_INT_RIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 6U), /*!< receive interrupt enable */ + ENET_DMA_INT_RBUIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 7U), /*!< receive buffer unavailable interrupt enable */ + ENET_DMA_INT_RPSIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 8U), /*!< receive process stopped interrupt enable */ + ENET_DMA_INT_RWTIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 9U), /*!< receive watchdog timeout interrupt enable */ + ENET_DMA_INT_ETIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 10U), /*!< early transmit interrupt enable */ + ENET_DMA_INT_FBEIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 13U), /*!< fatal bus error interrupt enable */ + ENET_DMA_INT_ERIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 14U), /*!< early receive interrupt enable */ + ENET_DMA_INT_AIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 15U), /*!< abnormal interrupt summary enable */ + ENET_DMA_INT_NIE = ENET_REGIDX_BIT(DMA_INTEN_REG_OFFSET, 16U), /*!< normal interrupt summary enable */ +}enet_int_enum; + +/* ENET interrupt flag get */ +typedef enum +{ + /* ENET_MAC_INTF register */ + ENET_MAC_INT_FLAG_WUM = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 3U), /*!< WUM status flag */ + ENET_MAC_INT_FLAG_MSC = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 4U), /*!< MSC status flag */ + ENET_MAC_INT_FLAG_MSCR = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 5U), /*!< MSC receive status flag */ + ENET_MAC_INT_FLAG_MSCT = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 6U), /*!< MSC transmit status flag */ + ENET_MAC_INT_FLAG_TMST = ENET_REGIDX_BIT(MAC_INTF_REG_OFFSET, 9U), /*!< timestamp trigger status flag */ + /* ENET_MSC_RINTF register */ + ENET_MSC_INT_FLAG_RFCE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 5U), /*!< received frames CRC error flag */ + ENET_MSC_INT_FLAG_RFAE = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 6U), /*!< received frames alignment error flag */ + ENET_MSC_INT_FLAG_RGUF = ENET_REGIDX_BIT(MSC_RINTF_REG_OFFSET, 17U), /*!< received good unicast frames flag */ + /* ENET_MSC_TINTF register */ + ENET_MSC_INT_FLAG_TGFSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 14U), /*!< transmitted good frames single collision flag */ + ENET_MSC_INT_FLAG_TGFMSC = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 15U), /*!< transmitted good frames more single collision flag */ + ENET_MSC_INT_FLAG_TGF = ENET_REGIDX_BIT(MSC_TINTF_REG_OFFSET, 21U), /*!< transmitted good frames flag */ + /* ENET_DMA_STAT register */ + ENET_DMA_INT_FLAG_TS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ + ENET_DMA_INT_FLAG_TPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ + ENET_DMA_INT_FLAG_TBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ + ENET_DMA_INT_FLAG_TJT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ + ENET_DMA_INT_FLAG_RO = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ + ENET_DMA_INT_FLAG_TU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ + ENET_DMA_INT_FLAG_RS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ + ENET_DMA_INT_FLAG_RBU = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ + ENET_DMA_INT_FLAG_RPS = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ + ENET_DMA_INT_FLAG_RWT = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ + ENET_DMA_INT_FLAG_ET = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ + ENET_DMA_INT_FLAG_FBE = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ + ENET_DMA_INT_FLAG_ER = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ + ENET_DMA_INT_FLAG_AI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ + ENET_DMA_INT_FLAG_NI = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U), /*!< normal interrupt summary flag */ + ENET_DMA_INT_FLAG_MSC = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 27U), /*!< MSC status flag */ + ENET_DMA_INT_FLAG_WUM = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 28U), /*!< WUM status flag */ + ENET_DMA_INT_FLAG_TST = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 29U), /*!< timestamp trigger status flag */ +}enet_int_flag_enum; + +/* ENET interrupt flag clear */ +typedef enum +{ + /* ENET_DMA_STAT register */ + ENET_DMA_INT_FLAG_TS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 0U), /*!< transmit status flag */ + ENET_DMA_INT_FLAG_TPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 1U), /*!< transmit process stopped status flag */ + ENET_DMA_INT_FLAG_TBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 2U), /*!< transmit buffer unavailable status flag */ + ENET_DMA_INT_FLAG_TJT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 3U), /*!< transmit jabber timeout status flag */ + ENET_DMA_INT_FLAG_RO_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 4U), /*!< receive overflow status flag */ + ENET_DMA_INT_FLAG_TU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 5U), /*!< transmit underflow status flag */ + ENET_DMA_INT_FLAG_RS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 6U), /*!< receive status flag */ + ENET_DMA_INT_FLAG_RBU_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 7U), /*!< receive buffer unavailable status flag */ + ENET_DMA_INT_FLAG_RPS_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 8U), /*!< receive process stopped status flag */ + ENET_DMA_INT_FLAG_RWT_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 9U), /*!< receive watchdog timeout status flag */ + ENET_DMA_INT_FLAG_ET_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 10U), /*!< early transmit status flag */ + ENET_DMA_INT_FLAG_FBE_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 13U), /*!< fatal bus error status flag */ + ENET_DMA_INT_FLAG_ER_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 14U), /*!< early receive status flag */ + ENET_DMA_INT_FLAG_AI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 15U), /*!< abnormal interrupt summary flag */ + ENET_DMA_INT_FLAG_NI_CLR = ENET_REGIDX_BIT(DMA_STAT_REG_OFFSET, 16U), /*!< normal interrupt summary flag */ +}enet_int_flag_clear_enum; + +/* current RX/TX descriptor/buffer/descriptor table address get */ +typedef enum +{ + ENET_RX_DESC_TABLE = DMA_RDTADDR_REG_OFFSET, /*!< RX descriptor table */ + ENET_RX_CURRENT_DESC = DMA_CRDADDR_REG_OFFSET, /*!< current RX descriptor */ + ENET_RX_CURRENT_BUFFER = DMA_CRBADDR_REG_OFFSET, /*!< current RX buffer */ + ENET_TX_DESC_TABLE = DMA_TDTADDR_REG_OFFSET, /*!< TX descriptor table */ + ENET_TX_CURRENT_DESC = DMA_CTDADDR_REG_OFFSET, /*!< current TX descriptor */ + ENET_TX_CURRENT_BUFFER = DMA_CTBADDR_REG_OFFSET /*!< current TX buffer */ +}enet_desc_reg_enum; + +/* MAC statistics counter get */ +typedef enum +{ + ENET_MSC_TX_SCCNT = MSC_SCCNT_REG_OFFSET, /*!< MSC transmitted good frames after a single collision counter */ + ENET_MSC_TX_MSCCNT = MSC_MSCCNT_REG_OFFSET, /*!< MSC transmitted good frames after more than a single collision counter */ + ENET_MSC_TX_TGFCNT = MSC_TGFCNT_REG_OFFSET, /*!< MSC transmitted good frames counter */ + ENET_MSC_RX_RFCECNT = MSC_RFCECNT_REG_OFFSET, /*!< MSC received frames with CRC error counter */ + ENET_MSC_RX_RFAECNT = MSC_RFAECNT_REG_OFFSET, /*!< MSC received frames with alignment error counter */ + ENET_MSC_RX_RGUFCNT = MSC_RGUFCNT_REG_OFFSET /*!< MSC received good unicast frames counter */ +}enet_msc_counter_enum; + +/* function option, used for ENET initialization */ +typedef enum +{ + FORWARD_OPTION = BIT(0), /*!< configure the frame forward related parameters */ + DMABUS_OPTION = BIT(1), /*!< configure the DMA bus mode related parameters */ + DMA_MAXBURST_OPTION = BIT(2), /*!< configure the DMA max burst related parameters */ + DMA_ARBITRATION_OPTION = BIT(3), /*!< configure the DMA arbitration related parameters */ + STORE_OPTION = BIT(4), /*!< configure the store forward mode related parameters */ + DMA_OPTION = BIT(5), /*!< configure the DMA control related parameters */ + VLAN_OPTION = BIT(6), /*!< configure the VLAN tag related parameters */ + FLOWCTL_OPTION = BIT(7), /*!< configure the flow control related parameters */ + HASHH_OPTION = BIT(8), /*!< configure the hash list high 32-bit related parameters */ + HASHL_OPTION = BIT(9), /*!< configure the hash list low 32-bit related parameters */ + FILTER_OPTION = BIT(10), /*!< configure the frame filter control related parameters */ + HALFDUPLEX_OPTION = BIT(11), /*!< configure the halfduplex related parameters */ + TIMER_OPTION = BIT(12), /*!< configure the frame timer related parameters */ + INTERFRAMEGAP_OPTION = BIT(13), /*!< configure the inter frame gap related parameters */ +}enet_option_enum; + +/* phy mode and mac loopback configurations */ +typedef enum +{ + ENET_AUTO_NEGOTIATION = 0x01u, /*!< PHY auto negotiation */ + ENET_100M_FULLDUPLEX = (ENET_MAC_CFG_SPD | ENET_MAC_CFG_DPM), /*!< 100Mbit/s, full-duplex */ + ENET_100M_HALFDUPLEX = ENET_MAC_CFG_SPD , /*!< 100Mbit/s, half-duplex */ + ENET_10M_FULLDUPLEX = ENET_MAC_CFG_DPM, /*!< 10Mbit/s, full-duplex */ + ENET_10M_HALFDUPLEX = (uint32_t)0x00000000U, /*!< 10Mbit/s, half-duplex */ + ENET_LOOPBACKMODE = (ENET_MAC_CFG_LBM | ENET_MAC_CFG_DPM) /*!< MAC in loopback mode at the MII */ +}enet_mediamode_enum; + +/* IP frame checksum function */ +typedef enum +{ + ENET_NO_AUTOCHECKSUM = (uint32_t)0x00000000U, /*!< disable IP frame checksum function */ + ENET_AUTOCHECKSUM_DROP_FAILFRAMES = ENET_MAC_CFG_IPFCO, /*!< enable IP frame checksum function */ + ENET_AUTOCHECKSUM_ACCEPT_FAILFRAMES = (ENET_MAC_CFG_IPFCO|ENET_DMA_CTL_DTCERFD) /*!< enable IP frame checksum function, and the received frame + with only payload error but no other errors will not be dropped */ +}enet_chksumconf_enum; + +/* received frame filter function */ +typedef enum +{ + ENET_PROMISCUOUS_MODE = ENET_MAC_FRMF_PM, /*!< promiscuous mode enabled */ + ENET_RECEIVEALL = (int32_t)ENET_MAC_FRMF_FAR, /*!< all received frame are forwarded to application */ + ENET_BROADCAST_FRAMES_PASS = (uint32_t)0x00000000U, /*!< the address filters pass all received broadcast frames */ + ENET_BROADCAST_FRAMES_DROP = ENET_MAC_FRMF_BFRMD /*!< the address filters filter all incoming broadcast frames */ +}enet_frmrecept_enum; + +/* register group value get */ +typedef enum +{ + ALL_MAC_REG = 0, /*!< MAC register group */ + ALL_MSC_REG = 22, /*!< MSC register group */ + ALL_PTP_REG = 33, /*!< PTP register group */ + ALL_DMA_REG = 44, /*!< DMA register group */ +}enet_registers_type_enum; + +/* dma direction select */ +typedef enum +{ + ENET_DMA_TX = ENET_DMA_STAT_TP, /*!< DMA transmit direction */ + ENET_DMA_RX = ENET_DMA_STAT_RP /*!< DMA receive direction */ +}enet_dmadirection_enum; + +/* PHY operation direction select */ +typedef enum +{ + ENET_PHY_READ = (uint32_t)0x00000000, /*!< read PHY */ + ENET_PHY_WRITE = ENET_MAC_PHY_CTL_PW /*!< write PHY */ +}enet_phydirection_enum; + +/* register operation direction select */ +typedef enum +{ + ENET_REG_READ, /*!< read register */ + ENET_REG_WRITE /*!< write register */ +}enet_regdirection_enum; + +/* ENET MAC addresses */ +typedef enum +{ + ENET_MAC_ADDRESS0 = ((uint32_t)0x00000000), /*!< MAC address0 */ + ENET_MAC_ADDRESS1 = ((uint32_t)0x00000008), /*!< MAC address1 */ + ENET_MAC_ADDRESS2 = ((uint32_t)0x00000010), /*!< MAC address2 */ + ENET_MAC_ADDRESS3 = ((uint32_t)0x00000018) /*!< MAC address3 */ +}enet_macaddress_enum; + +/* descriptor information */ +typedef enum +{ + TXDESC_COLLISION_COUNT, /*!< the number of collisions occurred before the frame was transmitted */ + TXDESC_BUFFER_1_ADDR, /*!< transmit frame buffer 1 address */ + RXDESC_FRAME_LENGTH, /*!< the byte length of the received frame that was transferred to the buffer */ + RXDESC_BUFFER_1_SIZE, /*!< receive buffer 1 size */ + RXDESC_BUFFER_2_SIZE, /*!< receive buffer 2 size */ + RXDESC_BUFFER_1_ADDR /*!< receive frame buffer 1 address */ +}enet_descstate_enum; + +/* MSC counters preset mode */ +typedef enum +{ + ENET_MSC_PRESET_NONE = 0U, /*!< do not preset MSC counter */ + ENET_MSC_PRESET_HALF = ENET_MSC_CTL_PMC, /*!< preset all MSC counters to almost-half(0x7FFF FFF0) value */ + ENET_MSC_PRESET_FULL = ENET_MSC_CTL_PMC | ENET_MSC_CTL_AFHPM /*!< preset all MSC counters to almost-full(0xFFFF FFF0) value */ +}enet_msc_preset_enum; + +/* structure for initialization of the ENET */ +typedef struct +{ + uint32_t option_enable; /*!< select which function to configure */ + uint32_t forward_frame; /*!< frame forward related parameters */ + uint32_t dmabus_mode; /*!< DMA bus mode related parameters */ + uint32_t dma_maxburst; /*!< DMA max burst related parameters */ + uint32_t dma_arbitration; /*!< DMA Tx and Rx arbitration related parameters */ + uint32_t store_forward_mode; /*!< store forward mode related parameters */ + uint32_t dma_function; /*!< DMA control related parameters */ + uint32_t vlan_config; /*!< VLAN tag related parameters */ + uint32_t flow_control; /*!< flow control related parameters */ + uint32_t hashtable_high; /*!< hash list high 32-bit related parameters */ + uint32_t hashtable_low; /*!< hash list low 32-bit related parameters */ + uint32_t framesfilter_mode; /*!< frame filter control related parameters */ + uint32_t halfduplex_param; /*!< halfduplex related parameters */ + uint32_t timer_config; /*!< frame timer related parameters */ + uint32_t interframegap; /*!< inter frame gap related parameters */ +}enet_initpara_struct; + +/* structure for ENET DMA desciptors */ +typedef struct +{ + uint32_t status; /*!< status */ + uint32_t control_buffer_size; /*!< control and buffer1, buffer2 lengths */ + uint32_t buffer1_addr; /*!< buffer1 address pointer/timestamp low */ + uint32_t buffer2_next_desc_addr; /*!< buffer2 or next descriptor address pointer/timestamp high */ + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE + uint32_t extended_status; /*!< extended status */ + uint32_t reserved; /*!< reserved */ + uint32_t timestamp_low; /*!< timestamp low */ + uint32_t timestamp_high; /*!< timestamp high */ +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + +} enet_descriptors_struct; + +/* structure of PTP system time */ +typedef struct +{ + uint32_t second; /*!< second of system time */ + uint32_t nanosecond; /*!< nanosecond of system time */ + uint32_t sign; /*!< sign of system time */ +}enet_ptp_systime_struct; + +/* mac_cfg register value */ +#define MAC_CFG_BOL(regval) (BITS(5,6) & ((uint32_t)(regval) << 5)) /*!< write value to ENET_MAC_CFG_BOL bit field */ +#define ENET_BACKOFFLIMIT_10 MAC_CFG_BOL(0) /*!< min (n, 10) */ +#define ENET_BACKOFFLIMIT_8 MAC_CFG_BOL(1) /*!< min (n, 8) */ +#define ENET_BACKOFFLIMIT_4 MAC_CFG_BOL(2) /*!< min (n, 4) */ +#define ENET_BACKOFFLIMIT_1 MAC_CFG_BOL(3) /*!< min (n, 1) */ + +#define MAC_CFG_IGBS(regval) (BITS(17,19) & ((uint32_t)(regval) << 17)) /*!< write value to ENET_MAC_CFG_IGBS bit field */ +#define ENET_INTERFRAMEGAP_96BIT MAC_CFG_IGBS(0) /*!< minimum 96 bit times */ +#define ENET_INTERFRAMEGAP_88BIT MAC_CFG_IGBS(1) /*!< minimum 88 bit times */ +#define ENET_INTERFRAMEGAP_80BIT MAC_CFG_IGBS(2) /*!< minimum 80 bit times */ +#define ENET_INTERFRAMEGAP_72BIT MAC_CFG_IGBS(3) /*!< minimum 72 bit times */ +#define ENET_INTERFRAMEGAP_64BIT MAC_CFG_IGBS(4) /*!< minimum 64 bit times */ +#define ENET_INTERFRAMEGAP_56BIT MAC_CFG_IGBS(5) /*!< minimum 56 bit times */ +#define ENET_INTERFRAMEGAP_48BIT MAC_CFG_IGBS(6) /*!< minimum 48 bit times */ +#define ENET_INTERFRAMEGAP_40BIT MAC_CFG_IGBS(7) /*!< minimum 40 bit times */ + +#define ENET_TYPEFRAME_CRC_DROP_ENABLE ENET_MAC_CFG_TFCD /*!< FCS field(last 4 bytes) of frame will be dropped before forwarding */ +#define ENET_TYPEFRAME_CRC_DROP_DISABLE ((uint32_t)0x00000000U) /*!< FCS field(last 4 bytes) of frame will not be dropped before forwarding */ +#define ENET_TYPEFRAME_CRC_DROP ENET_MAC_CFG_TFCD /*!< the function that FCS field(last 4 bytes) of frame will be dropped before forwarding */ + +#define ENET_WATCHDOG_ENABLE ((uint32_t)0x00000000U) /*!< the MAC allows no more than 2048 bytes of the frame being received */ +#define ENET_WATCHDOG_DISABLE ENET_MAC_CFG_WDD /*!< the MAC disables the watchdog timer on the receiver, and can receive frames of up to 16384 bytes */ + +#define ENET_JABBER_ENABLE ((uint32_t)0x00000000U) /*!< the maximum transmission byte is 2048 */ +#define ENET_JABBER_DISABLE ENET_MAC_CFG_JBD /*!< the maximum transmission byte can be 16384 */ + +#define ENET_CARRIERSENSE_ENABLE ((uint32_t)0x00000000U) /*!< the MAC transmitter generates carrier sense error and aborts the transmission */ +#define ENET_CARRIERSENSE_DISABLE ENET_MAC_CFG_CSD /*!< the MAC transmitter ignores the MII CRS signal during frame transmission in half-duplex mode */ + +#define ENET_SPEEDMODE_10M ((uint32_t)0x00000000U) /*!< 10 Mbit/s */ +#define ENET_SPEEDMODE_100M ENET_MAC_CFG_SPD /*!< 100 Mbit/s */ + +#define ENET_RECEIVEOWN_ENABLE ((uint32_t)0x00000000U) /*!< the MAC receives all packets that are given by the PHY while transmitting */ +#define ENET_RECEIVEOWN_DISABLE ENET_MAC_CFG_ROD /*!< the MAC disables the reception of frames in half-duplex mode */ + +#define ENET_LOOPBACKMODE_ENABLE ENET_MAC_CFG_LBM /*!< the MAC operates in loopback mode at the MII */ +#define ENET_LOOPBACKMODE_DISABLE ((uint32_t)0x00000000U) /*!< the MAC operates in normal mode */ + +#define ENET_MODE_FULLDUPLEX ENET_MAC_CFG_DPM /*!< full-duplex mode enable */ +#define ENET_MODE_HALFDUPLEX ((uint32_t)0x00000000U) /*!< half-duplex mode enable */ + +#define ENET_CHECKSUMOFFLOAD_ENABLE ENET_MAC_CFG_IPFCO /*!< IP frame checksum offload function enabled for received IP frame */ +#define ENET_CHECKSUMOFFLOAD_DISABLE ((uint32_t)0x00000000U) /*!< the checksum offload function in the receiver is disabled */ + +#define ENET_RETRYTRANSMISSION_ENABLE ((uint32_t)0x00000000U) /*!< the MAC attempts retries up to 16 times based on the settings of BOL*/ +#define ENET_RETRYTRANSMISSION_DISABLE ENET_MAC_CFG_RTD /*!< the MAC attempts only 1 transmission */ + +#define ENET_AUTO_PADCRC_DROP_ENABLE ENET_MAC_CFG_APCD /*!< the MAC strips the Pad/FCS field on received frames */ +#define ENET_AUTO_PADCRC_DROP_DISABLE ((uint32_t)0x00000000U) /*!< the MAC forwards all received frames without modify it */ +#define ENET_AUTO_PADCRC_DROP ENET_MAC_CFG_APCD /*!< the function of the MAC strips the Pad/FCS field on received frames */ + +#define ENET_DEFERRALCHECK_ENABLE ENET_MAC_CFG_DFC /*!< the deferral check function is enabled in the MAC */ +#define ENET_DEFERRALCHECK_DISABLE ((uint32_t)0x00000000U) /*!< the deferral check function is disabled */ + +/* mac_frmf register value */ +#define MAC_FRMF_PCFRM(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) /*!< write value to ENET_MAC_FRMF_PCFRM bit field */ +#define ENET_PCFRM_PREVENT_ALL MAC_FRMF_PCFRM(0) /*!< MAC prevents all control frames from reaching the application */ +#define ENET_PCFRM_PREVENT_PAUSEFRAME MAC_FRMF_PCFRM(1) /*!< MAC only forwards all other control frames except pause control frame */ +#define ENET_PCFRM_FORWARD_ALL MAC_FRMF_PCFRM(2) /*!< MAC forwards all control frames to application even if they fail the address filter */ +#define ENET_PCFRM_FORWARD_FILTERED MAC_FRMF_PCFRM(3) /*!< MAC forwards control frames that only pass the address filter */ + +#define ENET_RX_FILTER_DISABLE ENET_MAC_FRMF_FAR /*!< all received frame are forwarded to application */ +#define ENET_RX_FILTER_ENABLE ((uint32_t)0x00000000U) /*!< only the frame passed the filter can be forwarded to application */ + +#define ENET_SRC_FILTER_NORMAL_ENABLE ENET_MAC_FRMF_SAFLT /*!< filter source address */ +#define ENET_SRC_FILTER_INVERSE_ENABLE (ENET_MAC_FRMF_SAFLT | ENET_MAC_FRMF_SAIFLT) /*!< inverse source address filtering result */ +#define ENET_SRC_FILTER_DISABLE ((uint32_t)0x00000000U) /*!< source address function in filter disable */ +#define ENET_SRC_FILTER ENET_MAC_FRMF_SAFLT /*!< filter source address function */ +#define ENET_SRC_FILTER_INVERSE ENET_MAC_FRMF_SAIFLT /*!< inverse source address filtering result function */ + +#define ENET_BROADCASTFRAMES_ENABLE ((uint32_t)0x00000000U) /*!< the address filters pass all received broadcast frames */ +#define ENET_BROADCASTFRAMES_DISABLE ENET_MAC_FRMF_BFRMD /*!< the address filters filter all incoming broadcast frames */ + +#define ENET_DEST_FILTER_INVERSE_ENABLE ENET_MAC_FRMF_DAIFLT /*!< inverse DA filtering result */ +#define ENET_DEST_FILTER_INVERSE_DISABLE ((uint32_t)0x00000000U) /*!< not inverse DA filtering result */ +#define ENET_DEST_FILTER_INVERSE ENET_MAC_FRMF_DAIFLT /*!< inverse DA filtering result function */ + +#define ENET_PROMISCUOUS_ENABLE ENET_MAC_FRMF_PM /*!< promiscuous mode enabled */ +#define ENET_PROMISCUOUS_DISABLE ((uint32_t)0x00000000U) /*!< promiscuous mode disabled */ + +#define ENET_MULTICAST_FILTER_HASH_OR_PERFECT (ENET_MAC_FRMF_HMF | ENET_MAC_FRMF_HPFLT) /*!< pass multicast frames that match either the perfect or the hash filtering */ +#define ENET_MULTICAST_FILTER_HASH ENET_MAC_FRMF_HMF /*!< pass multicast frames that match the hash filtering */ +#define ENET_MULTICAST_FILTER_PERFECT ((uint32_t)0x00000000U) /*!< pass multicast frames that match the perfect filtering */ +#define ENET_MULTICAST_FILTER_NONE ENET_MAC_FRMF_MFD /*!< all multicast frames are passed */ +#define ENET_MULTICAST_FILTER_PASS ENET_MAC_FRMF_MFD /*!< pass all multicast frames function */ +#define ENET_MULTICAST_FILTER_HASH_MODE ENET_MAC_FRMF_HMF /*!< HASH multicast filter function */ +#define ENET_FILTER_MODE_EITHER ENET_MAC_FRMF_HPFLT /*!< HASH or perfect filter function */ + +#define ENET_UNICAST_FILTER_EITHER (ENET_MAC_FRMF_HUF | ENET_MAC_FRMF_HPFLT) /*!< pass unicast frames that match either the perfect or the hash filtering */ +#define ENET_UNICAST_FILTER_HASH ENET_MAC_FRMF_HUF /*!< pass unicast frames that match the hash filtering */ +#define ENET_UNICAST_FILTER_PERFECT ((uint32_t)0x00000000U) /*!< pass unicast frames that match the perfect filtering */ +#define ENET_UNICAST_FILTER_HASH_MODE ENET_MAC_FRMF_HUF /*!< HASH unicast filter function */ + +/* mac_phy_ctl register value */ +#define MAC_PHY_CTL_CLR(regval) (BITS(2,4) & ((uint32_t)(regval) << 2)) /*!< write value to ENET_MAC_PHY_CTL_CLR bit field */ +#define ENET_MDC_HCLK_DIV42 MAC_PHY_CTL_CLR(0) /*!< HCLK:60-100 MHz; MDC clock= HCLK/42 */ +#define ENET_MDC_HCLK_DIV62 MAC_PHY_CTL_CLR(1) /*!< HCLK:100-120 MHz; MDC clock= HCLK/62 */ +#define ENET_MDC_HCLK_DIV16 MAC_PHY_CTL_CLR(2) /*!< HCLK:20-35 MHz; MDC clock= HCLK/16 */ +#define ENET_MDC_HCLK_DIV26 MAC_PHY_CTL_CLR(3) /*!< HCLK:35-60 MHz; MDC clock= HCLK/26 */ + +#define MAC_PHY_CTL_PR(regval) (BITS(6,10) & ((uint32_t)(regval) << 6)) /*!< write value to ENET_MAC_PHY_CTL_PR bit field */ + +#define MAC_PHY_CTL_PA(regval) (BITS(11,15) & ((uint32_t)(regval) << 11)) /*!< write value to ENET_MAC_PHY_CTL_PA bit field */ + +/* mac_phy_data register value */ +#define MAC_PHY_DATA_PD(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_PHY_DATA_PD bit field */ + +/* mac_fctl register value */ +#define MAC_FCTL_PLTS(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) /*!< write value to ENET_MAC_FCTL_PLTS bit field */ +#define ENET_PAUSETIME_MINUS4 MAC_FCTL_PLTS(0) /*!< pause time minus 4 slot times */ +#define ENET_PAUSETIME_MINUS28 MAC_FCTL_PLTS(1) /*!< pause time minus 28 slot times */ +#define ENET_PAUSETIME_MINUS144 MAC_FCTL_PLTS(2) /*!< pause time minus 144 slot times */ +#define ENET_PAUSETIME_MINUS256 MAC_FCTL_PLTS(3) /*!< pause time minus 256 slot times */ + +#define ENET_ZERO_QUANTA_PAUSE_ENABLE ((uint32_t)0x00000000U) /*!< enable the automatic zero-quanta generation function */ +#define ENET_ZERO_QUANTA_PAUSE_DISABLE ENET_MAC_FCTL_DZQP /*!< disable the automatic zero-quanta generation function */ +#define ENET_ZERO_QUANTA_PAUSE ENET_MAC_FCTL_DZQP /*!< the automatic zero-quanta generation function */ + +#define ENET_MAC0_AND_UNIQUE_ADDRESS_PAUSEDETECT ENET_MAC_FCTL_UPFDT /*!< besides the unique multicast address, MAC also use the MAC0 address to detect pause frame */ +#define ENET_UNIQUE_PAUSEDETECT ((uint32_t)0x00000000U) /*!< only the unique multicast address for pause frame which is specified in IEEE802.3 can be detected */ + +#define ENET_RX_FLOWCONTROL_ENABLE ENET_MAC_FCTL_RFCEN /*!< enable decoding function for the received pause frame and process it */ +#define ENET_RX_FLOWCONTROL_DISABLE ((uint32_t)0x00000000U) /*!< decode function for pause frame is disabled */ +#define ENET_RX_FLOWCONTROL ENET_MAC_FCTL_RFCEN /*!< decoding function for the received pause frame and process it */ + +#define ENET_TX_FLOWCONTROL_ENABLE ENET_MAC_FCTL_TFCEN /*!< enable the flow control operation in the MAC */ +#define ENET_TX_FLOWCONTROL_DISABLE ((uint32_t)0x00000000U) /*!< disable the flow control operation in the MAC */ +#define ENET_TX_FLOWCONTROL ENET_MAC_FCTL_TFCEN /*!< the flow control operation in the MAC */ + +#define ENET_BACK_PRESSURE_ENABLE ENET_MAC_FCTL_FLCBBKPA /*!< enable the back pressure operation in the MAC */ +#define ENET_BACK_PRESSURE_DISABLE ((uint32_t)0x00000000U) /*!< disable the back pressure operation in the MAC */ +#define ENET_BACK_PRESSURE ENET_MAC_FCTL_FLCBBKPA /*!< the back pressure operation in the MAC */ + +#define MAC_FCTL_PTM(regval) (BITS(16,31) & ((uint32_t)(regval) << 16)) /*!< write value to ENET_MAC_FCTL_PTM bit field */ +/* mac_vlt register value */ +#define MAC_VLT_VLTI(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_VLT_VLTI bit field */ + +#define ENET_VLANTAGCOMPARISON_12BIT ENET_MAC_VLT_VLTC /*!< only low 12 bits of the VLAN tag are used for comparison */ +#define ENET_VLANTAGCOMPARISON_16BIT ((uint32_t)0x00000000U) /*!< all 16 bits of the VLAN tag are used for comparison */ + +/* mac_wum register value */ +#define ENET_WUM_FLAG_WUFFRPR ENET_MAC_WUM_WUFFRPR /*!< wakeup frame filter register poniter reset */ +#define ENET_WUM_FLAG_WUFR ENET_MAC_WUM_WUFR /*!< wakeup frame received */ +#define ENET_WUM_FLAG_MPKR ENET_MAC_WUM_MPKR /*!< magic packet received */ +#define ENET_WUM_POWER_DOWN ENET_MAC_WUM_PWD /*!< power down mode */ +#define ENET_WUM_MAGIC_PACKET_FRAME ENET_MAC_WUM_MPEN /*!< enable a wakeup event due to magic packet reception */ +#define ENET_WUM_WAKE_UP_FRAME ENET_MAC_WUM_WFEN /*!< enable a wakeup event due to wakeup frame reception */ +#define ENET_WUM_GLOBAL_UNICAST ENET_MAC_WUM_GU /*!< any received unicast frame passed filter is considered to be a wakeup frame */ + +/* mac_dbg register value */ +#define ENET_MAC_RECEIVER_NOT_IDLE ENET_MAC_DBG_MRNI /*!< MAC receiver is not in idle state */ +#define ENET_RX_ASYNCHRONOUS_FIFO_STATE ENET_MAC_DBG_RXAFS /*!< Rx asynchronous FIFO status */ +#define ENET_RXFIFO_WRITING ENET_MAC_DBG_RXFW /*!< RxFIFO is doing write operation */ +#define ENET_RXFIFO_READ_STATUS ENET_MAC_DBG_RXFRS /*!< RxFIFO read operation status */ +#define ENET_RXFIFO_STATE ENET_MAC_DBG_RXFS /*!< RxFIFO state */ +#define ENET_MAC_TRANSMITTER_NOT_IDLE ENET_MAC_DBG_MTNI /*!< MAC transmitter is not in idle state */ +#define ENET_MAC_TRANSMITTER_STATUS ENET_MAC_DBG_SOMT /*!< status of MAC transmitter */ +#define ENET_PAUSE_CONDITION_STATUS ENET_MAC_DBG_PCS /*!< pause condition status */ +#define ENET_TXFIFO_READ_STATUS ENET_MAC_DBG_TXFRS /*!< TxFIFO read operation status */ +#define ENET_TXFIFO_WRITING ENET_MAC_DBG_TXFW /*!< TxFIFO is doing write operation */ +#define ENET_TXFIFO_NOT_EMPTY ENET_MAC_DBG_TXFNE /*!< TxFIFO is not empty */ +#define ENET_TXFIFO_FULL ENET_MAC_DBG_TXFF /*!< TxFIFO is full */ + +#define GET_MAC_DBG_RXAFS(regval) GET_BITS((regval),1,2) /*!< get value of ENET_MAC_DBG_RXAFS bit field */ + +#define GET_MAC_DBG_RXFRS(regval) GET_BITS((regval),5,6) /*!< get value of ENET_MAC_DBG_RXFRS bit field */ + +#define GET_MAC_DBG_RXFS(regval) GET_BITS((regval),8,9) /*!< get value of ENET_MAC_DBG_RXFS bit field */ + +#define GET_MAC_DBG_SOMT(regval) GET_BITS((regval),17,18) /*!< get value of ENET_MAC_DBG_SOMT bit field */ + +#define GET_MAC_DBG_TXFRS(regval) GET_BITS((regval),20,21) /*!< get value of ENET_MAC_DBG_TXFRS bit field */ + +/* mac_addr0h register value */ +#define MAC_ADDR0H_ADDR0H(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_ADDR0H_ADDR0H bit field */ + +/* mac_addrxh register value, x = 1,2,3 */ +#define MAC_ADDR123H_ADDR123H(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_MAC_ADDRxH_ADDRxH(x=1,2,3) bit field */ + +#define ENET_ADDRESS_MASK_BYTE0 BIT(24) /*!< low register bits [7:0] */ +#define ENET_ADDRESS_MASK_BYTE1 BIT(25) /*!< low register bits [15:8] */ +#define ENET_ADDRESS_MASK_BYTE2 BIT(26) /*!< low register bits [23:16] */ +#define ENET_ADDRESS_MASK_BYTE3 BIT(27) /*!< low register bits [31:24] */ +#define ENET_ADDRESS_MASK_BYTE4 BIT(28) /*!< high register bits [7:0] */ +#define ENET_ADDRESS_MASK_BYTE5 BIT(29) /*!< high register bits [15:8] */ + +#define ENET_ADDRESS_FILTER_SA BIT(30) /*!< use MAC address[47:0] is to compare with the SA fields of the received frame */ +#define ENET_ADDRESS_FILTER_DA ((uint32_t)0x00000000) /*!< use MAC address[47:0] is to compare with the DA fields of the received frame */ + +/* mac_fcth register value */ +#define MAC_FCTH_RFA(regval) ((BITS(0,2) & ((uint32_t)(regval) << 0)) << 8) /*!< write value to ENET_MAC_FCTH_RFA bit field */ +#define ENET_ACTIVE_THRESHOLD_256BYTES MAC_FCTH_RFA(0) /*!< threshold level is 256 bytes */ +#define ENET_ACTIVE_THRESHOLD_512BYTES MAC_FCTH_RFA(1) /*!< threshold level is 512 bytes */ +#define ENET_ACTIVE_THRESHOLD_768BYTES MAC_FCTH_RFA(2) /*!< threshold level is 768 bytes */ +#define ENET_ACTIVE_THRESHOLD_1024BYTES MAC_FCTH_RFA(3) /*!< threshold level is 1024 bytes */ +#define ENET_ACTIVE_THRESHOLD_1280BYTES MAC_FCTH_RFA(4) /*!< threshold level is 1280 bytes */ +#define ENET_ACTIVE_THRESHOLD_1536BYTES MAC_FCTH_RFA(5) /*!< threshold level is 1536 bytes */ +#define ENET_ACTIVE_THRESHOLD_1792BYTES MAC_FCTH_RFA(6) /*!< threshold level is 1792 bytes */ + +#define MAC_FCTH_RFD(regval) ((BITS(4,6) & ((uint32_t)(regval) << 4)) << 8) /*!< write value to ENET_MAC_FCTH_RFD bit field */ +#define ENET_DEACTIVE_THRESHOLD_256BYTES MAC_FCTH_RFD(0) /*!< threshold level is 256 bytes */ +#define ENET_DEACTIVE_THRESHOLD_512BYTES MAC_FCTH_RFD(1) /*!< threshold level is 512 bytes */ +#define ENET_DEACTIVE_THRESHOLD_768BYTES MAC_FCTH_RFD(2) /*!< threshold level is 768 bytes */ +#define ENET_DEACTIVE_THRESHOLD_1024BYTES MAC_FCTH_RFD(3) /*!< threshold level is 1024 bytes */ +#define ENET_DEACTIVE_THRESHOLD_1280BYTES MAC_FCTH_RFD(4) /*!< threshold level is 1280 bytes */ +#define ENET_DEACTIVE_THRESHOLD_1536BYTES MAC_FCTH_RFD(5) /*!< threshold level is 1536 bytes */ +#define ENET_DEACTIVE_THRESHOLD_1792BYTES MAC_FCTH_RFD(6) /*!< threshold level is 1792 bytes */ + +/* msc_ctl register value */ +#define ENET_MSC_COUNTER_STOP_ROLLOVER ENET_MSC_CTL_CTSR /*!< counter stop rollover */ +#define ENET_MSC_RESET_ON_READ ENET_MSC_CTL_RTOR /*!< reset on read */ +#define ENET_MSC_COUNTERS_FREEZE ENET_MSC_CTL_MCFZ /*!< MSC counter freeze */ + +/* ptp_tsctl register value */ +#define PTP_TSCTL_CKNT(regval) (BITS(16,17) & ((uint32_t)(regval) << 16)) /*!< write value to ENET_PTP_TSCTL_CKNT bit field */ + +#define ENET_RXTX_TIMESTAMP ENET_PTP_TSCTL_TMSEN /*!< enable timestamp function for transmit and receive frames */ +#define ENET_PTP_TIMESTAMP_INT ENET_PTP_TSCTL_TMSITEN /*!< timestamp interrupt trigger enable */ +#define ENET_ALL_RX_TIMESTAMP ENET_PTP_TSCTL_ARFSEN /*!< all received frames are taken snapshot */ +#define ENET_NONTYPE_FRAME_SNAPSHOT ENET_PTP_TSCTL_ESEN /*!< take snapshot when received non type frame */ +#define ENET_IPV6_FRAME_SNAPSHOT ENET_PTP_TSCTL_IP6SEN /*!< take snapshot for IPv6 frame */ +#define ENET_IPV4_FRAME_SNAPSHOT ENET_PTP_TSCTL_IP4SEN /*!< take snapshot for IPv4 frame */ +#define ENET_PTP_FRAME_USE_MACADDRESS_FILTER ENET_PTP_TSCTL_MAFEN /*!< enable MAC address1-3 to filter the PTP frame */ + +/* ptp_ssinc register value */ +#define PTP_SSINC_STMSSI(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_PTP_SSINC_STMSSI bit field */ + +/* ptp_tsl register value */ +#define GET_PTP_TSL_STMSS(regval) GET_BITS((uint32_t)(regval),0,30) /*!< get value of ENET_PTP_TSL_STMSS bit field */ + +#define ENET_PTP_TIME_POSITIVE ((uint32_t)0x00000000) /*!< time value is positive */ +#define ENET_PTP_TIME_NEGATIVE ENET_PTP_TSL_STS /*!< time value is negative */ + +#define GET_PTP_TSL_STS(regval) (((regval) & BIT(31)) >> (31U)) /*!< get value of ENET_PTP_TSL_STS bit field */ + +/* ptp_tsul register value */ +#define PTP_TSUL_TMSUSS(regval) (BITS(0,30) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_PTP_TSUL_TMSUSS bit field */ + +#define ENET_PTP_ADD_TO_TIME ((uint32_t)0x00000000) /*!< timestamp update value is added to system time */ +#define ENET_PTP_SUBSTRACT_FROM_TIME ENET_PTP_TSUL_TMSUPNS /*!< timestamp update value is subtracted from system time */ + +/* ptp_ppsctl register value */ +#define PTP_PPSCTL_PPSOFC(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_PTP_PPSCTL_PPSOFC bit field */ +#define ENET_PPSOFC_1HZ PTP_PPSCTL_PPSOFC(0) /*!< PPS output 1Hz frequency */ +#define ENET_PPSOFC_2HZ PTP_PPSCTL_PPSOFC(1) /*!< PPS output 2Hz frequency */ +#define ENET_PPSOFC_4HZ PTP_PPSCTL_PPSOFC(2) /*!< PPS output 4Hz frequency */ +#define ENET_PPSOFC_8HZ PTP_PPSCTL_PPSOFC(3) /*!< PPS output 8Hz frequency */ +#define ENET_PPSOFC_16HZ PTP_PPSCTL_PPSOFC(4) /*!< PPS output 16Hz frequency */ +#define ENET_PPSOFC_32HZ PTP_PPSCTL_PPSOFC(5) /*!< PPS output 32Hz frequency */ +#define ENET_PPSOFC_64HZ PTP_PPSCTL_PPSOFC(6) /*!< PPS output 64Hz frequency */ +#define ENET_PPSOFC_128HZ PTP_PPSCTL_PPSOFC(7) /*!< PPS output 128Hz frequency */ +#define ENET_PPSOFC_256HZ PTP_PPSCTL_PPSOFC(8) /*!< PPS output 256Hz frequency */ +#define ENET_PPSOFC_512HZ PTP_PPSCTL_PPSOFC(9) /*!< PPS output 512Hz frequency */ +#define ENET_PPSOFC_1024HZ PTP_PPSCTL_PPSOFC(10) /*!< PPS output 1024Hz frequency */ +#define ENET_PPSOFC_2048HZ PTP_PPSCTL_PPSOFC(11) /*!< PPS output 2048Hz frequency */ +#define ENET_PPSOFC_4096HZ PTP_PPSCTL_PPSOFC(12) /*!< PPS output 4096Hz frequency */ +#define ENET_PPSOFC_8192HZ PTP_PPSCTL_PPSOFC(13) /*!< PPS output 8192Hz frequency */ +#define ENET_PPSOFC_16384HZ PTP_PPSCTL_PPSOFC(14) /*!< PPS output 16384Hz frequency */ +#define ENET_PPSOFC_32768HZ PTP_PPSCTL_PPSOFC(15) /*!< PPS output 32768Hz frequency */ + +/* dma_bctl register value */ +#define DMA_BCTL_DPSL(regval) (BITS(2,6) & ((uint32_t)(regval) << 2)) /*!< write value to ENET_DMA_BCTL_DPSL bit field */ +#define GET_DMA_BCTL_DPSL(regval) GET_BITS((regval),2,6) /*!< get value of ENET_DMA_BCTL_DPSL bit field */ + +#define ENET_ENHANCED_DESCRIPTOR ENET_DMA_BCTL_DFM /*!< enhanced mode descriptor */ +#define ENET_NORMAL_DESCRIPTOR ((uint32_t)0x00000000) /*!< normal mode descriptor */ + +#define DMA_BCTL_PGBL(regval) (BITS(8,13) & ((uint32_t)(regval) << 8)) /*!< write value to ENET_DMA_BCTL_PGBL bit field */ +#define ENET_PGBL_1BEAT DMA_BCTL_PGBL(1) /*!< maximum number of beats is 1 */ +#define ENET_PGBL_2BEAT DMA_BCTL_PGBL(2) /*!< maximum number of beats is 2 */ +#define ENET_PGBL_4BEAT DMA_BCTL_PGBL(4) /*!< maximum number of beats is 4 */ +#define ENET_PGBL_8BEAT DMA_BCTL_PGBL(8) /*!< maximum number of beats is 8 */ +#define ENET_PGBL_16BEAT DMA_BCTL_PGBL(16) /*!< maximum number of beats is 16 */ +#define ENET_PGBL_32BEAT DMA_BCTL_PGBL(32) /*!< maximum number of beats is 32 */ +#define ENET_PGBL_4xPGBL_4BEAT (DMA_BCTL_PGBL(1)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 4 */ +#define ENET_PGBL_4xPGBL_8BEAT (DMA_BCTL_PGBL(2)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 8 */ +#define ENET_PGBL_4xPGBL_16BEAT (DMA_BCTL_PGBL(4)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 16 */ +#define ENET_PGBL_4xPGBL_32BEAT (DMA_BCTL_PGBL(8)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 32 */ +#define ENET_PGBL_4xPGBL_64BEAT (DMA_BCTL_PGBL(16)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 64 */ +#define ENET_PGBL_4xPGBL_128BEAT (DMA_BCTL_PGBL(32)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats is 128 */ + +#define DMA_BCTL_RTPR(regval) (BITS(14,15) & ((uint32_t)(regval) << 14)) /*!< write value to ENET_DMA_BCTL_RTPR bit field */ +#define ENET_ARBITRATION_RXTX_1_1 DMA_BCTL_RTPR(0) /*!< receive and transmit priority ratio is 1:1*/ +#define ENET_ARBITRATION_RXTX_2_1 DMA_BCTL_RTPR(1) /*!< receive and transmit priority ratio is 2:1*/ +#define ENET_ARBITRATION_RXTX_3_1 DMA_BCTL_RTPR(2) /*!< receive and transmit priority ratio is 3:1 */ +#define ENET_ARBITRATION_RXTX_4_1 DMA_BCTL_RTPR(3) /*!< receive and transmit priority ratio is 4:1 */ +#define ENET_ARBITRATION_RXPRIORTX ENET_DMA_BCTL_DAB /*!< RxDMA has higher priority than TxDMA */ + +#define ENET_FIXED_BURST_ENABLE ENET_DMA_BCTL_FB /*!< AHB can only use SINGLE/INCR4/INCR8/INCR16 during start of normal burst transfers */ +#define ENET_FIXED_BURST_DISABLE ((uint32_t)0x00000000) /*!< AHB can use SINGLE/INCR burst transfer operations */ + +#define DMA_BCTL_RXDP(regval) (BITS(17,22) & ((uint32_t)(regval) << 17)) /*!< write value to ENET_DMA_BCTL_RXDP bit field */ +#define ENET_RXDP_1BEAT DMA_BCTL_RXDP(1) /*!< maximum number of beats 1 */ +#define ENET_RXDP_2BEAT DMA_BCTL_RXDP(2) /*!< maximum number of beats 2 */ +#define ENET_RXDP_4BEAT DMA_BCTL_RXDP(4) /*!< maximum number of beats 4 */ +#define ENET_RXDP_8BEAT DMA_BCTL_RXDP(8) /*!< maximum number of beats 8 */ +#define ENET_RXDP_16BEAT DMA_BCTL_RXDP(16) /*!< maximum number of beats 16 */ +#define ENET_RXDP_32BEAT DMA_BCTL_RXDP(32) /*!< maximum number of beats 32 */ +#define ENET_RXDP_4xPGBL_4BEAT (DMA_BCTL_RXDP(1)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 4 */ +#define ENET_RXDP_4xPGBL_8BEAT (DMA_BCTL_RXDP(2)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 8 */ +#define ENET_RXDP_4xPGBL_16BEAT (DMA_BCTL_RXDP(4)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 16 */ +#define ENET_RXDP_4xPGBL_32BEAT (DMA_BCTL_RXDP(8)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 32 */ +#define ENET_RXDP_4xPGBL_64BEAT (DMA_BCTL_RXDP(16)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 64 */ +#define ENET_RXDP_4xPGBL_128BEAT (DMA_BCTL_RXDP(32)|ENET_DMA_BCTL_FPBL) /*!< maximum number of beats 128 */ + +#define ENET_RXTX_DIFFERENT_PGBL ENET_DMA_BCTL_UIP /*!< RxDMA uses the RXDP[5:0], while TxDMA uses the PGBL[5:0] */ +#define ENET_RXTX_SAME_PGBL ((uint32_t)0x00000000) /*!< RxDMA/TxDMA uses PGBL[5:0] */ + +#define ENET_ADDRESS_ALIGN_ENABLE ENET_DMA_BCTL_AA /*!< enabled address-aligned */ +#define ENET_ADDRESS_ALIGN_DISABLE ((uint32_t)0x00000000) /*!< disable address-aligned */ + +#define ENET_MIXED_BURST_ENABLE ENET_DMA_BCTL_MB /*!< AHB master interface transfer burst length greater than 16 with INCR */ +#define ENET_MIXED_BURST_DISABLE ((uint32_t)0x00000000) /*!< AHB master interface only transfer fixed burst length with 16 and below */ + +/* dma_stat register value */ +#define GET_DMA_STAT_RP(regval) GET_BITS((uint32_t)(regval),17,19) /*!< get value of ENET_DMA_STAT_RP bit field */ +#define ENET_RX_STATE_STOPPED ((uint32_t)0x00000000) /*!< reset or stop rx command issued */ +#define ENET_RX_STATE_FETCHING BIT(17) /*!< fetching the Rx descriptor */ +#define ENET_RX_STATE_WAITING (BIT(17)|BIT(18)) /*!< waiting for receive packet */ +#define ENET_RX_STATE_SUSPENDED BIT(19) /*!< Rx descriptor unavailable */ +#define ENET_RX_STATE_CLOSING (BIT(17)|BIT(19)) /*!< closing receive descriptor */ +#define ENET_RX_STATE_QUEUING ENET_DMA_STAT_RP /*!< transferring the receive packet data from recevie buffer to host memory */ + +#define GET_DMA_STAT_TP(regval) GET_BITS((uint32_t)(regval),20,22) /*!< get value of ENET_DMA_STAT_TP bit field */ +#define ENET_TX_STATE_STOPPED ((uint32_t)0x00000000) /*!< reset or stop Tx Command issued */ +#define ENET_TX_STATE_FETCHING BIT(20) /*!< fetching the Tx descriptor */ +#define ENET_TX_STATE_WAITING BIT(21) /*!< waiting for status */ +#define ENET_TX_STATE_READING (BIT(20)|BIT(21)) /*!< reading the data from host memory buffer and queuing it to transmit buffer */ +#define ENET_TX_STATE_SUSPENDED (BIT(21)|BIT(22)) /*!< Tx descriptor unavailabe or transmit buffer underflow */ +#define ENET_TX_STATE_CLOSING ENET_DMA_STAT_TP /*!< closing Tx descriptor */ + +#define GET_DMA_STAT_EB(regval) GET_BITS((uint32_t)(regval),23,25) /*!< get value of ENET_DMA_STAT_EB bit field */ +#define ENET_ERROR_TXDATA_TRANSFER BIT(23) /*!< error during data transfer by TxDMA or RxDMA */ +#define ENET_ERROR_READ_TRANSFER BIT(24) /*!< error during write transfer or read transfer */ +#define ENET_ERROR_DESC_ACCESS BIT(25) /*!< error during descriptor or buffer access */ + +/* dma_ctl register value */ +#define DMA_CTL_RTHC(regval) (BITS(3,4) & ((uint32_t)(regval) << 3)) /*!< write value to ENET_DMA_CTL_RTHC bit field */ +#define ENET_RX_THRESHOLD_64BYTES DMA_CTL_RTHC(0) /*!< threshold level is 64 Bytes */ +#define ENET_RX_THRESHOLD_32BYTES DMA_CTL_RTHC(1) /*!< threshold level is 32 Bytes */ +#define ENET_RX_THRESHOLD_96BYTES DMA_CTL_RTHC(2) /*!< threshold level is 96 Bytes */ +#define ENET_RX_THRESHOLD_128BYTES DMA_CTL_RTHC(3) /*!< threshold level is 128 Bytes */ + +#define DMA_CTL_TTHC(regval) (BITS(14,16) & ((uint32_t)(regval) << 14)) /*!< write value to ENET_DMA_CTL_TTHC bit field */ +#define ENET_TX_THRESHOLD_64BYTES DMA_CTL_TTHC(0) /*!< threshold level is 64 Bytes */ +#define ENET_TX_THRESHOLD_128BYTES DMA_CTL_TTHC(1) /*!< threshold level is 128 Bytes */ +#define ENET_TX_THRESHOLD_192BYTES DMA_CTL_TTHC(2) /*!< threshold level is 192 Bytes */ +#define ENET_TX_THRESHOLD_256BYTES DMA_CTL_TTHC(3) /*!< threshold level is 256 Bytes */ +#define ENET_TX_THRESHOLD_40BYTES DMA_CTL_TTHC(4) /*!< threshold level is 40 Bytes */ +#define ENET_TX_THRESHOLD_32BYTES DMA_CTL_TTHC(5) /*!< threshold level is 32 Bytes */ +#define ENET_TX_THRESHOLD_24BYTES DMA_CTL_TTHC(6) /*!< threshold level is 24 Bytes */ +#define ENET_TX_THRESHOLD_16BYTES DMA_CTL_TTHC(7) /*!< threshold level is 16 Bytes */ + +#define ENET_TCPIP_CKSUMERROR_ACCEPT ENET_DMA_CTL_DTCERFD /*!< Rx frame with only payload error but no other errors will not be dropped */ +#define ENET_TCPIP_CKSUMERROR_DROP ((uint32_t)0x00000000) /*!< all error frames will be dropped when FERF = 0 */ + +#define ENET_RX_MODE_STOREFORWARD ENET_DMA_CTL_RSFD /*!< RxFIFO operates in store-and-forward mode */ +#define ENET_RX_MODE_CUTTHROUGH ((uint32_t)0x00000000) /*!< RxFIFO operates in cut-through mode */ + +#define ENET_FLUSH_RXFRAME_ENABLE ((uint32_t)0x00000000) /*!< RxDMA flushes all frames */ +#define ENET_FLUSH_RXFRAME_DISABLE ENET_DMA_CTL_DAFRF /*!< RxDMA does not flush any frames */ +#define ENET_NO_FLUSH_RXFRAME ENET_DMA_CTL_DAFRF /*!< RxDMA does not flush frames function */ + +#define ENET_TX_MODE_STOREFORWARD ENET_DMA_CTL_TSFD /*!< TxFIFO operates in store-and-forward mode */ +#define ENET_TX_MODE_CUTTHROUGH ((uint32_t)0x00000000) /*!< TxFIFO operates in cut-through mode */ + +#define ENET_FORWARD_ERRFRAMES_ENABLE (ENET_DMA_CTL_FERF << 2) /*!< all frame received with error except runt error are forwarded to memory */ +#define ENET_FORWARD_ERRFRAMES_DISABLE ((uint32_t)0x00000000) /*!< RxFIFO drop error frame */ +#define ENET_FORWARD_ERRFRAMES (ENET_DMA_CTL_FERF << 2) /*!< the function that all frame received with error except runt error are forwarded to memory */ + +#define ENET_FORWARD_UNDERSZ_GOODFRAMES_ENABLE (ENET_DMA_CTL_FUF << 2) /*!< forward undersized good frames */ +#define ENET_FORWARD_UNDERSZ_GOODFRAMES_DISABLE ((uint32_t)0x00000000) /*!< RxFIFO drops all frames whose length is less than 64 bytes */ +#define ENET_FORWARD_UNDERSZ_GOODFRAMES (ENET_DMA_CTL_FUF << 2) /*!< the function that forwarding undersized good frames */ + +#define ENET_SECONDFRAME_OPT_ENABLE ENET_DMA_CTL_OSF /*!< TxDMA controller operate on second frame mode enable*/ +#define ENET_SECONDFRAME_OPT_DISABLE ((uint32_t)0x00000000) /*!< TxDMA controller operate on second frame mode disable */ +#define ENET_SECONDFRAME_OPT ENET_DMA_CTL_OSF /*!< TxDMA controller operate on second frame function */ + +/* dma_mfbocnt register value */ +#define GET_DMA_MFBOCNT_MSFC(regval) GET_BITS((regval),0,15) /*!< get value of ENET_DMA_MFBOCNT_MSFC bit field */ + +#define GET_DMA_MFBOCNT_MSFA(regval) GET_BITS((regval),17,27) /*!< get value of ENET_DMA_MFBOCNT_MSFA bit field */ + +/* dma_rswdc register value */ +#define DMA_RSWDC_WDCFRS(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) /*!< write value to ENET_DMA_RSWDC_WDCFRS bit field */ + +/* dma tx descriptor tdes0 register value */ +#define TDES0_CONT(regval) (BITS(3,6) & ((uint32_t)(regval) << 3)) /*!< write value to ENET DMA TDES0 CONT bit field */ +#define GET_TDES0_COCNT(regval) GET_BITS((regval),3,6) /*!< get value of ENET DMA TDES0 CONT bit field */ + +#define TDES0_CM(regval) (BITS(22,23) & ((uint32_t)(regval) << 22)) /*!< write value to ENET DMA TDES0 CM bit field */ +#define ENET_CHECKSUM_DISABLE TDES0_CM(0) /*!< checksum insertion disabled */ +#define ENET_CHECKSUM_IPV4HEADER TDES0_CM(1) /*!< only IP header checksum calculation and insertion are enabled */ +#define ENET_CHECKSUM_TCPUDPICMP_SEGMENT TDES0_CM(2) /*!< TCP/UDP/ICMP checksum insertion calculated but pseudo-header */ +#define ENET_CHECKSUM_TCPUDPICMP_FULL TDES0_CM(3) /*!< TCP/UDP/ICMP checksum insertion fully calculated */ + +/* dma tx descriptor tdes1 register value */ +#define TDES1_TB1S(regval) (BITS(0,12) & ((uint32_t)(regval) << 0)) /*!< write value to ENET DMA TDES1 TB1S bit field */ + +#define TDES1_TB2S(regval) (BITS(16,28) & ((uint32_t)(regval) << 16)) /*!< write value to ENET DMA TDES1 TB2S bit field */ + +/* dma rx descriptor rdes0 register value */ +#define RDES0_FRML(regval) (BITS(16,29) & ((uint32_t)(regval) << 16)) /*!< write value to ENET DMA RDES0 FRML bit field */ +#define GET_RDES0_FRML(regval) GET_BITS((regval),16,29) /*!< get value of ENET DMA RDES0 FRML bit field */ + +/* dma rx descriptor rdes1 register value */ +#define ENET_RECEIVE_COMPLETE_INT_ENABLE ((uint32_t)0x00000000U) /*!< RS bit immediately set after Rx completed */ +#define ENET_RECEIVE_COMPLETE_INT_DISABLE ENET_RDES1_DINTC /*!< RS bit not immediately set after Rx completed */ + +#define GET_RDES1_RB1S(regval) GET_BITS((regval),0,12) /*!< get value of ENET DMA RDES1 RB1S bit field */ + +#define GET_RDES1_RB2S(regval) GET_BITS((regval),16,28) /*!< get value of ENET DMA RDES1 RB2S bit field */ + +/* dma rx descriptor rdes4 register value */ +#define RDES4_IPPLDT(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) /*!< write value to ENET DMA RDES4 IPPLDT bit field */ +#define GET_RDES4_IPPLDT(regval) GET_BITS((regval),0,2) /*!< get value of ENET DMA RDES4 IPPLDT bit field */ + +#define RDES4_PTPMT(regval) (BITS(8,11) & ((uint32_t)(regval) << 8)) /*!< write value to ENET DMA RDES4 PTPMT bit field */ +#define GET_RDES4_PTPMT(regval) GET_BITS((regval),8,11) /*!< get value of ENET DMA RDES4 PTPMT bit field */ + +/* ENET register mask value */ +#define MAC_CFG_MASK ((uint32_t)0xFD30810FU) /*!< ENET_MAC_CFG register mask */ +#define MAC_FCTL_MASK ((uint32_t)0x0000FF41U) /*!< ENET_MAC_FCTL register mask */ +#define DMA_CTL_MASK ((uint32_t)0xF8DE3F23U) /*!< ENET_DMA_CTL register mask */ +#define DMA_BCTL_MASK ((uint32_t)0xF800007DU) /*!< ENET_DMA_BCTL register mask */ +#define ENET_MSC_PRESET_MASK (~(ENET_MSC_CTL_PMC | ENET_MSC_CTL_AFHPM)) /*!< ENET_MSC_CTL preset mask */ + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE +#define ETH_DMATXDESC_SIZE 0x20U /*!< TxDMA enhanced descriptor size */ +#define ETH_DMARXDESC_SIZE 0x20U /*!< RxDMA enhanced descriptor size */ +#else +#define ETH_DMATXDESC_SIZE 0x10U /*!< TxDMA descriptor size */ +#define ETH_DMARXDESC_SIZE 0x10U /*!< RxDMA descriptor size */ +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + + +typedef enum{ + ENET_CKNT_ORDINARY = PTP_TSCTL_CKNT(0), /*!< type of ordinary clock node type for timestamp */ + ENET_CKNT_BOUNDARY = PTP_TSCTL_CKNT(1), /*!< type of boundary clock node type for timestamp */ + ENET_CKNT_END_TO_END = PTP_TSCTL_CKNT(2), /*!< type of end-to-end transparent clock node type for timestamp */ + ENET_CKNT_PEER_TO_PEER = PTP_TSCTL_CKNT(3), /*!< type of peer-to-peer transparent clock node type for timestamp */ + ENET_PTP_SYSTIME_INIT = ENET_PTP_TSCTL_TMSSTI, /*!< timestamp initialize */ + ENET_PTP_SYSTIME_UPDATE = ENET_PTP_TSCTL_TMSSTU, /*!< timestamp update */ + ENET_PTP_ADDEND_UPDATE = ENET_PTP_TSCTL_TMSARU, /*!< addend register update */ + ENET_PTP_FINEMODE = (int32_t)(ENET_PTP_TSCTL_TMSFCU| BIT(31)), /*!< the system timestamp uses the fine method for updating */ + ENET_PTP_COARSEMODE = ENET_PTP_TSCTL_TMSFCU, /*!< the system timestamp uses the coarse method for updating */ + ENET_SUBSECOND_DIGITAL_ROLLOVER = (int32_t)(ENET_PTP_TSCTL_SCROM | BIT(31)), /*!< digital rollover mode */ + ENET_SUBSECOND_BINARY_ROLLOVER = ENET_PTP_TSCTL_SCROM, /*!< binary rollover mode */ + ENET_SNOOPING_PTP_VERSION_2 = (int32_t)(ENET_PTP_TSCTL_PFSV| BIT(31)), /*!< version 2 */ + ENET_SNOOPING_PTP_VERSION_1 = ENET_PTP_TSCTL_PFSV, /*!< version 1 */ + ENET_EVENT_TYPE_MESSAGES_SNAPSHOT = (int32_t)(ENET_PTP_TSCTL_ETMSEN| BIT(31)), /*!< only event type messages are taken snapshot */ + ENET_ALL_TYPE_MESSAGES_SNAPSHOT = ENET_PTP_TSCTL_ETMSEN, /*!< all type messages are taken snapshot except announce, management and signaling message */ + ENET_MASTER_NODE_MESSAGE_SNAPSHOT = (int32_t)(ENET_PTP_TSCTL_MNMSEN| BIT(31)), /*!< snapshot is only take for master node message */ + ENET_SLAVE_NODE_MESSAGE_SNAPSHOT = ENET_PTP_TSCTL_MNMSEN, /*!< snapshot is only taken for slave node message */ +}enet_ptp_function_enum; + + +/* ENET remote wake-up frame register length */ +#define ETH_WAKEUP_REGISTER_LENGTH 8U /*!< remote wake-up frame register length */ + +/* ENET frame size */ +#define ENET_MAX_FRAME_SIZE 1524U /*!< header + frame_extra + payload + CRC */ + +/* ENET delay timeout */ +#define ENET_DELAY_TO ((uint32_t)0x0004FFFFU) /*!< ENET delay timeout */ +#define ENET_RESET_TO ((uint32_t)0x000004FFU) /*!< ENET reset timeout */ + + + +/* function declarations */ +/* main function */ +/* deinitialize the ENET, and reset structure parameters for ENET initialization */ +void enet_deinit(void); +/* configure the parameters which are usually less cared for initialization */ +void enet_initpara_config(enet_option_enum option, uint32_t para); +/* initialize ENET peripheral with generally concerned parameters and the less cared parameters */ +ErrStatus enet_init(enet_mediamode_enum mediamode, enet_chksumconf_enum checksum, enet_frmrecept_enum recept); +/* reset all core internal registers located in CLK_TX and CLK_RX */ +ErrStatus enet_software_reset(void); +/* check receive frame valid and return frame size */ +uint32_t enet_rxframe_size_get(void); +/* initialize the dma tx/rx descriptors's parameters in chain mode */ +void enet_descriptors_chain_init(enet_dmadirection_enum direction); +/* initialize the dma tx/rx descriptors's parameters in ring mode */ +void enet_descriptors_ring_init(enet_dmadirection_enum direction); +/* handle current received frame data to application buffer */ +ErrStatus enet_frame_receive(uint8_t *buffer, uint32_t bufsize); +/* handle current received frame but without data copy to application buffer */ +#define ENET_NOCOPY_FRAME_RECEIVE() enet_frame_receive(NULL, 0U) +/* handle application buffer data to transmit it */ +ErrStatus enet_frame_transmit(uint8_t *buffer, uint32_t length); +/* handle current transmit frame but without data copy from application buffer */ +#define ENET_NOCOPY_FRAME_TRANSMIT(len) enet_frame_transmit(NULL, (len)) +/* configure the transmit IP frame checksum offload calculation and insertion */ +ErrStatus enet_transmit_checksum_config(enet_descriptors_struct *desc, uint32_t checksum); +/* ENET Tx and Rx function enable (include MAC and DMA module) */ +void enet_enable(void); +/* ENET Tx and Rx function disable (include MAC and DMA module) */ +void enet_disable(void); +/* configure MAC address */ +void enet_mac_address_set(enet_macaddress_enum mac_addr, uint8_t paddr[]); +/* get MAC address */ +ErrStatus enet_mac_address_get(enet_macaddress_enum mac_addr, uint8_t paddr[], uint8_t bufsize); + +/* get the ENET MAC/MSC/PTP/DMA status flag */ +FlagStatus enet_flag_get(enet_flag_enum enet_flag); +/* clear the ENET DMA status flag */ +void enet_flag_clear(enet_flag_clear_enum enet_flag); +/* enable ENET MAC/MSC/DMA interrupt */ +void enet_interrupt_enable(enet_int_enum enet_int); +/* disable ENET MAC/MSC/DMA interrupt */ +void enet_interrupt_disable(enet_int_enum enet_int); +/* get ENET MAC/MSC/DMA interrupt flag */ +FlagStatus enet_interrupt_flag_get(enet_int_flag_enum int_flag); +/* clear ENET DMA interrupt flag */ +void enet_interrupt_flag_clear(enet_int_flag_clear_enum int_flag_clear); + +/* MAC function */ +/* ENET Tx function enable (include MAC and DMA module) */ +void enet_tx_enable(void); +/* ENET Tx function disable (include MAC and DMA module) */ +void enet_tx_disable(void); +/* ENET Rx function enable (include MAC and DMA module) */ +void enet_rx_enable(void); +/* ENET Rx function disable (include MAC and DMA module) */ +void enet_rx_disable(void); +/* put registers value into the application buffer */ +void enet_registers_get(enet_registers_type_enum type, uint32_t *preg, uint32_t num); +/* get the enet debug status from the debug register */ +uint32_t enet_debug_status_get(uint32_t mac_debug); +/* enable the MAC address filter */ +void enet_address_filter_enable(enet_macaddress_enum mac_addr); +/* disable the MAC address filter */ +void enet_address_filter_disable(enet_macaddress_enum mac_addr); +/* configure the MAC address filter */ +void enet_address_filter_config(enet_macaddress_enum mac_addr, uint32_t addr_mask, uint32_t filter_type); +/* PHY interface configuration (configure SMI clock and reset PHY chip) */ +ErrStatus enet_phy_config(void); +/* write to/read from a PHY register */ +ErrStatus enet_phy_write_read(enet_phydirection_enum direction, uint16_t phy_address, uint16_t phy_reg, uint16_t *pvalue); +/* enable the loopback function of phy chip */ +ErrStatus enet_phyloopback_enable(void); +/* disable the loopback function of phy chip */ +ErrStatus enet_phyloopback_disable(void); +/* enable ENET forward feature */ +void enet_forward_feature_enable(uint32_t feature); +/* disable ENET forward feature */ +void enet_forward_feature_disable(uint32_t feature); +/* enable ENET fliter feature */ +void enet_fliter_feature_enable(uint32_t feature); +/* disable ENET fliter feature */ +void enet_fliter_feature_disable(uint32_t feature); + +/* flow control function */ +/* generate the pause frame, ENET will send pause frame after enable transmit flow control */ +ErrStatus enet_pauseframe_generate(void); +/* configure the pause frame detect type */ +void enet_pauseframe_detect_config(uint32_t detect); +/* configure the pause frame parameters */ +void enet_pauseframe_config(uint32_t pausetime, uint32_t pause_threshold); +/* configure the threshold of the flow control(deactive and active threshold) */ +void enet_flowcontrol_threshold_config(uint32_t deactive, uint32_t active); +/* enable ENET flow control feature */ +void enet_flowcontrol_feature_enable(uint32_t feature); +/* disable ENET flow control feature */ +void enet_flowcontrol_feature_disable(uint32_t feature); + +/* DMA function */ +/* get the dma transmit/receive process state */ +uint32_t enet_dmaprocess_state_get(enet_dmadirection_enum direction); +/* poll the dma transmission/reception enable */ +void enet_dmaprocess_resume(enet_dmadirection_enum direction); +/* check and recover the Rx process */ +void enet_rxprocess_check_recovery(void); +/* flush the ENET transmit fifo, and wait until the flush operation completes */ +ErrStatus enet_txfifo_flush(void); +/* get the transmit/receive address of current descriptor, or current buffer, or descriptor table */ +uint32_t enet_current_desc_address_get(enet_desc_reg_enum addr_get); +/* get the Tx or Rx descriptor information */ +uint32_t enet_desc_information_get(enet_descriptors_struct *desc, enet_descstate_enum info_get); +/* get the number of missed frames during receiving */ +void enet_missed_frame_counter_get(uint32_t *rxfifo_drop, uint32_t *rxdma_drop); + +/* descriptor function */ +/* get the bit flag of ENET dma descriptor */ +FlagStatus enet_desc_flag_get(enet_descriptors_struct *desc, uint32_t desc_flag); +/* set the bit flag of ENET dma tx descriptor */ +void enet_desc_flag_set(enet_descriptors_struct *desc, uint32_t desc_flag); +/* clear the bit flag of ENET dma tx descriptor */ +void enet_desc_flag_clear(enet_descriptors_struct *desc, uint32_t desc_flag); +/* when receiving the completed, set RS bit in ENET_DMA_STAT register will immediately set */ +void enet_rx_desc_immediate_receive_complete_interrupt(enet_descriptors_struct *desc); +/* when receiving the completed, set RS bit in ENET_DMA_STAT register will is set after a configurable delay time */ +void enet_rx_desc_delay_receive_complete_interrupt(enet_descriptors_struct *desc, uint32_t delay_time); +/* drop current receive frame */ +void enet_rxframe_drop(void); +/* enable DMA feature */ +void enet_dma_feature_enable(uint32_t feature); +/* disable DMA feature */ +void enet_dma_feature_disable(uint32_t feature); + + +/* special enhanced mode function */ +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE +/* get the bit of extended status flag in ENET DMA descriptor */ +uint32_t enet_rx_desc_enhanced_status_get(enet_descriptors_struct *desc, uint32_t desc_status); +/* configure descriptor to work in enhanced mode */ +void enet_desc_select_enhanced_mode(void); +/* initialize the dma Tx/Rx descriptors's parameters in enhanced chain mode with ptp function */ +void enet_ptp_enhanced_descriptors_chain_init(enet_dmadirection_enum direction); +/* initialize the dma Tx/Rx descriptors's parameters in enhanced ring mode with ptp function */ +void enet_ptp_enhanced_descriptors_ring_init(enet_dmadirection_enum direction); +/* receive a packet data with timestamp values to application buffer, when the DMA is in enhanced mode */ +ErrStatus enet_ptpframe_receive_enhanced_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]); +/* handle current received frame but without data copy to application buffer in PTP enhanced mode */ +#define ENET_NOCOPY_PTPFRAME_RECEIVE_ENHANCED_MODE(ptr) enet_ptpframe_receive_enhanced_mode(NULL, 0U, (ptr)) +/* send data with timestamp values in application buffer as a transmit packet, when the DMA is in enhanced mode */ +ErrStatus enet_ptpframe_transmit_enhanced_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]); +/* handle current transmit frame but without data copy from application buffer in PTP enhanced mode */ +#define ENET_NOCOPY_PTPFRAME_TRANSMIT_ENHANCED_MODE(len, ptr) enet_ptpframe_transmit_enhanced_mode(NULL, (len), (ptr)) + +#else + +/* configure descriptor to work in normal mode */ +void enet_desc_select_normal_mode(void); +/* initialize the dma Tx/Rx descriptors's parameters in normal chain mode with ptp function */ +void enet_ptp_normal_descriptors_chain_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab); +/* initialize the dma Tx/Rx descriptors's parameters in normal ring mode with ptp function */ +void enet_ptp_normal_descriptors_ring_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab); +/* receive a packet data with timestamp values to application buffer, when the DMA is in normal mode */ +ErrStatus enet_ptpframe_receive_normal_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]); +/* handle current received frame but without data copy to application buffer in PTP normal mode */ +#define ENET_NOCOPY_PTPFRAME_RECEIVE_NORMAL_MODE(ptr) enet_ptpframe_receive_normal_mode(NULL, 0U, (ptr)) +/* send data with timestamp values in application buffer as a transmit packet, when the DMA is in normal mode */ +ErrStatus enet_ptpframe_transmit_normal_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]); +/* handle current transmit frame but without data copy from application buffer in PTP normal mode */ +#define ENET_NOCOPY_PTPFRAME_TRANSMIT_NORMAL_MODE(len, ptr) enet_ptpframe_transmit_normal_mode(NULL, (len), (ptr)) + +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + +/* WUM function */ +/* wakeup frame filter register pointer reset */ +void enet_wum_filter_register_pointer_reset(void); +/* set the remote wakeup frame registers */ +void enet_wum_filter_config(uint32_t pdata[]); +/* enable wakeup management features */ +void enet_wum_feature_enable(uint32_t feature); +/* disable wakeup management features */ +void enet_wum_feature_disable(uint32_t feature); + +/* MSC function */ +/* reset the MAC statistics counters */ +void enet_msc_counters_reset(void); +/* enable the MAC statistics counter features */ +void enet_msc_feature_enable(uint32_t feature); +/* disable the MAC statistics counter features */ +void enet_msc_feature_disable(uint32_t feature); +/* configure MAC statistics counters preset mode */ +void enet_msc_counters_preset_config(enet_msc_preset_enum mode); +/* get MAC statistics counter */ +uint32_t enet_msc_counters_get(enet_msc_counter_enum counter); + +/* PTP function */ +/* change subsecond to nanosecond */ +uint32_t enet_ptp_subsecond_2_nanosecond(uint32_t subsecond); +/* change nanosecond to subsecond */ +uint32_t enet_ptp_nanosecond_2_subsecond(uint32_t nanosecond); +/* enable the PTP features */ +void enet_ptp_feature_enable(uint32_t feature); +/* disable the PTP features */ +void enet_ptp_feature_disable(uint32_t feature); +/* configure the PTP timestamp function */ +ErrStatus enet_ptp_timestamp_function_config(enet_ptp_function_enum func); +/* configure the PTP system time subsecond increment value */ +void enet_ptp_subsecond_increment_config(uint32_t subsecond); +/* adjusting the PTP clock frequency only in fine update mode */ +void enet_ptp_timestamp_addend_config(uint32_t add); +/* initializing or adding/subtracting to second of the PTP system time */ +void enet_ptp_timestamp_update_config(uint32_t sign, uint32_t second, uint32_t subsecond); +/* configure the PTP expected target time */ +void enet_ptp_expected_time_config(uint32_t second, uint32_t nanosecond); +/* get the PTP current system time */ +void enet_ptp_system_time_get(enet_ptp_systime_struct *systime_struct); +/* configure the PPS output frequency */ +void enet_ptp_pps_output_frequency_config(uint32_t freq); +/* configure and start PTP timestamp counter */ +void enet_ptp_start(int32_t updatemethod, uint32_t init_sec, uint32_t init_subsec, uint32_t carry_cfg, uint32_t accuracy_cfg); +/* adjust frequency in fine method by configure addend register */ +void enet_ptp_finecorrection_adjfreq(int32_t carry_cfg); +/* update system time in coarse method */ +void enet_ptp_coarsecorrection_systime_update(enet_ptp_systime_struct *systime_struct); +/* set system time in fine method */ +void enet_ptp_finecorrection_settime(enet_ptp_systime_struct * systime_struct); +/* get the ptp flag status */ +FlagStatus enet_ptp_flag_get(uint32_t flag); + +/* internal function */ +/* reset the ENET initpara struct, call it before using enet_initpara_config() */ +void enet_initpara_reset(void); +#ifdef USE_DELAY +/* user can provide more timing precise _ENET_DELAY_ function */ +#define _ENET_DELAY_ delay_ms +#else +/* default _ENET_DELAY_ function with less precise timing */ +#define _ENET_DELAY_ enet_delay +#endif + +#endif /* GD32F30X_ENET_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_exmc.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_exmc.h new file mode 100644 index 0000000..feb2fb3 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_exmc.h @@ -0,0 +1,446 @@ +/*! + \file gd32f30x_exmc.h + \brief definitions for the EXMC + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_EXMC_H +#define GD32F30X_EXMC_H + +#include "gd32f30x.h" + +/* EXMC definitions */ +#define EXMC (EXMC_BASE) /*!< EXMC register base address */ + +/* registers definitions */ +/* NOR/PSRAM */ +#define EXMC_SNCTL0 REG32(EXMC + 0x00U) /*!< EXMC SRAM/NOR flash control register0 */ +#define EXMC_SNTCFG0 REG32(EXMC + 0x04U) /*!< EXMC SRAM/NOR flash timing configuration register0 */ +#define EXMC_SNWTCFG0 REG32(EXMC + 0x104U) /*!< EXMC SRAM/NOR flash write timing configuration register0 */ + +#define EXMC_SNCTL1 REG32(EXMC + 0x08U) /*!< EXMC SRAM/NOR flash control register1 */ +#define EXMC_SNTCFG1 REG32(EXMC + 0x0CU) /*!< EXMC SRAM/NOR flash timing configuration register1 */ +#define EXMC_SNWTCFG1 REG32(EXMC + 0x10CU) /*!< EXMC SRAM/NOR flash write timing configuration register1 */ + +#define EXMC_SNCTL2 REG32(EXMC + 0x10U) /*!< EXMC SRAM/NOR flash control register2 */ +#define EXMC_SNTCFG2 REG32(EXMC + 0x14U) /*!< EXMC SRAM/NOR flash timing configuration register2 */ +#define EXMC_SNWTCFG2 REG32(EXMC + 0x114U) /*!< EXMC SRAM/NOR flash write timing configuration register2 */ + +#define EXMC_SNCTL3 REG32(EXMC + 0x18U) /*!< EXMC SRAM/NOR flash control register3 */ +#define EXMC_SNTCFG3 REG32(EXMC + 0x1CU) /*!< EXMC SRAM/NOR flash timing configuration register3 */ +#define EXMC_SNWTCFG3 REG32(EXMC + 0x11CU) /*!< EXMC SRAM/NOR flash write timing configuration register3 */ + +/* NAND/PC card */ +#define EXMC_NPCTL1 REG32(EXMC + 0x60U) /*!< EXMC NAND/PC card control register1 */ +#define EXMC_NPINTEN1 REG32(EXMC + 0x64U) /*!< EXMC NAND/PC card interrupt enable register1 */ +#define EXMC_NPCTCFG1 REG32(EXMC + 0x68U) /*!< EXMC NAND/PC card common space timing configuration register1 */ +#define EXMC_NPATCFG1 REG32(EXMC + 0x6CU) /*!< EXMC NAND/PC card attribute space timing configuration register1 */ +#define EXMC_NECC1 REG32(EXMC + 0x74U) /*!< EXMC NAND ECC register1 */ + +#define EXMC_NPCTL2 REG32(EXMC + 0x80U) /*!< EXMC NAND/PC card control register2 */ +#define EXMC_NPINTEN2 REG32(EXMC + 0x84U) /*!< EXMC NAND/PC card interrupt enable register2 */ +#define EXMC_NPCTCFG2 REG32(EXMC + 0x88U) /*!< EXMC NAND/PC card common space timing configuration register2 */ +#define EXMC_NPATCFG2 REG32(EXMC + 0x8CU) /*!< EXMC NAND/PC card attribute space timing configuration register2 */ +#define EXMC_NECC2 REG32(EXMC + 0x94U) /*!< EXMC NAND ECC register2 */ + +#define EXMC_NPCTL3 REG32(EXMC + 0xA0U) /*!< EXMC NAND/PC card control register3 */ +#define EXMC_NPINTEN3 REG32(EXMC + 0xA4U) /*!< EXMC NAND/PC card interrupt enable register3 */ +#define EXMC_NPCTCFG3 REG32(EXMC + 0xA8U) /*!< EXMC NAND/PC card common space timing configuration register3 */ +#define EXMC_NPATCFG3 REG32(EXMC + 0xACU) /*!< EXMC NAND/PC card attribute space timing configuration register3 */ +#define EXMC_PIOTCFG3 REG32(EXMC + 0xB0U) /*!< EXMC PC card I/O space timing configuration register */ + +/* bits definitions */ +/* EXMC_SNCTLx,x=0..3 */ +#define EXMC_SNCTL_NRBKEN BIT(0) /*!< NOR bank enable */ +#define EXMC_SNCTL_NRMUX BIT(1) /*!< NOR bank memory address/data multiplexing enable */ +#define EXMC_SNCTL_NRTP BITS(2,3) /*!< NOR bank memory type */ +#define EXMC_SNCTL_NRW BITS(4,5) /*!< NOR bank memory data bus width */ +#define EXMC_SNCTL_NREN BIT(6) /*!< NOR flash access enable */ +#define EXMC_SNCTL_SBRSTEN BIT(8) /*!< synchronous burst enable */ +#define EXMC_SNCTL_NRWTPOL BIT(9) /*!< NWAIT signal polarity */ +#define EXMC_SNCTL_WRAPEN BIT(10) /*!< wrapped burst mode enable */ +#define EXMC_SNCTL_NRWTCFG BIT(11) /*!< NWAIT signal configuration, only work in synchronous mode */ +#define EXMC_SNCTL_WREN BIT(12) /*!< write enable */ +#define EXMC_SNCTL_NRWTEN BIT(13) /*!< NWAIT signal enable */ +#define EXMC_SNCTL_EXMODEN BIT(14) /*!< extended mode enable */ +#define EXMC_SNCTL_ASYNCWAIT BIT(15) /*!< asynchronous wait enable */ +#define EXMC_SNCTL_CPS BITS(16,18) /*!< CRAM page size */ +#define EXMC_SNCTL_SYNCWR BIT(19) /*!< synchronous write config */ + +/* EXMC_SNTCFGx,x=0..3 */ +#define EXMC_SNTCFG_ASET BITS(0,3) /*!< asynchronous address setup time */ +#define EXMC_SNTCFG_AHLD BITS(4,7) /*!< asynchronous address hold time */ +#define EXMC_SNTCFG_DSET BITS(8,15) /*!< asynchronous data setup time */ +#define EXMC_SNTCFG_BUSLAT BITS(16,19) /*!< bus latency */ +#define EXMC_SNTCFG_CKDIV BITS(20,23) /*!< synchronous clock divide ratio */ +#define EXMC_SNTCFG_DLAT BITS(24,27) /*!< synchronous data latency for NOR flash */ +#define EXMC_SNTCFG_ASYNCMOD BITS(28,29) /*!< asynchronous access mode */ + +/* EXMC_SNWTCFGx,x=0..3 */ +#define EXMC_SNWTCFG_WASET BITS(0,3) /*!< asynchronous address setup time */ +#define EXMC_SNWTCFG_WAHLD BITS(4,7) /*!< asynchronous address hold time */ +#define EXMC_SNWTCFG_WDSET BITS(8,15) /*!< asynchronous data setup time */ +#define EXMC_SNWTCFG_WBUSLAT BITS(16,19) /*!< bus latency */ +#define EXMC_SNWTCFG_WASYNCMOD BITS(28,29) /*!< asynchronous access mode */ + +/* EXMC_NPCTLx,x=1..3 */ +#define EXMC_NPCTL_NDWTEN BIT(1) /*!< wait feature enable */ +#define EXMC_NPCTL_NDBKEN BIT(2) /*!< NAND bank enable */ +#define EXMC_NPCTL_NDTP BIT(3) /*!< NAND bank memory type */ +#define EXMC_NPCTL_NDW BITS(4,5) /*!< NAND bank memory data bus width */ +#define EXMC_NPCTL_ECCEN BIT(6) /*!< ECC enable */ +#define EXMC_NPCTL_CTR BITS(9,12) /*!< CLE to RE delay */ +#define EXMC_NPCTL_ATR BITS(13,16) /*!< ALE to RE delay */ +#define EXMC_NPCTL_ECCSZ BITS(17,19) /*!< ECC size */ + +/* EXMC_NPINTENx,x=1..3 */ +#define EXMC_NPINTEN_INTRS BIT(0) /*!< interrupt rising edge status */ +#define EXMC_NPINTEN_INTHS BIT(1) /*!< interrupt high-level status */ +#define EXMC_NPINTEN_INTFS BIT(2) /*!< interrupt falling edge status */ +#define EXMC_NPINTEN_INTREN BIT(3) /*!< interrupt rising edge detection enable */ +#define EXMC_NPINTEN_INTHEN BIT(4) /*!< interrupt high-level detection enable */ +#define EXMC_NPINTEN_INTFEN BIT(5) /*!< interrupt falling edge detection enable */ +#define EXMC_NPINTEN_FFEPT BIT(6) /*!< FIFO empty flag */ + +/* EXMC_NPCTCFGx,x=1..3 */ +#define EXMC_NPCTCFG_COMSET BITS(0,7) /*!< common memory setup time */ +#define EXMC_NPCTCFG_COMWAIT BITS(8,15) /*!< common memory wait time */ +#define EXMC_NPCTCFG_COMHLD BITS(16,23) /*!< common memory hold time */ +#define EXMC_NPCTCFG_COMHIZ BITS(24,31) /*!< common memory data bus HiZ time */ + +/* EXMC_NPATCFGx,x=1..3 */ +#define EXMC_NPATCFG_ATTSET BITS(0,7) /*!< attribute memory setup time */ +#define EXMC_NPATCFG_ATTWAIT BITS(8,15) /*!< attribute memory wait time */ +#define EXMC_NPATCFG_ATTHLD BITS(16,23) /*!< attribute memory hold time */ +#define EXMC_NPATCFG_ATTHIZ BITS(24,31) /*!< attribute memory data bus HiZ time */ + +/* EXMC_PIOTCFG3 */ +#define EXMC_PIOTCFG3_IOSET BITS(0,7) /*!< IO space setup time */ +#define EXMC_PIOTCFG3_IOWAIT BITS(8,15) /*!< IO space wait time */ +#define EXMC_PIOTCFG3_IOHLD BITS(16,23) /*!< IO space hold time */ +#define EXMC_PIOTCFG3_IOHIZ BITS(24,31) /*!< IO space data bus HiZ time */ + +/* EXMC_NECCx,x=1,2 */ +#define EXMC_NECC_ECC BITS(0,31) /*!< ECC result */ + +/* constants definitions */ +/* EXMC NOR/SRAM timing initialize struct */ +typedef struct +{ + uint32_t asyn_access_mode; /*!< asynchronous access mode */ + uint32_t syn_data_latency; /*!< configure the data latency */ + uint32_t syn_clk_division; /*!< configure the clock divide ratio */ + uint32_t bus_latency; /*!< configure the bus latency */ + uint32_t asyn_data_setuptime; /*!< configure the data setup time,asynchronous access mode valid */ + uint32_t asyn_address_holdtime; /*!< configure the address hold time,asynchronous access mode valid */ + uint32_t asyn_address_setuptime; /*!< configure the data setup time,asynchronous access mode valid */ +}exmc_norsram_timing_parameter_struct; + +/* EXMC NOR/SRAM initialize struct */ +typedef struct +{ + uint32_t norsram_region; /*!< select the region of EXMC NOR/SRAM bank */ + uint32_t write_mode; /*!< the write mode, synchronous mode or asynchronous mode */ + uint32_t extended_mode; /*!< enable or disable the extended mode */ + uint32_t asyn_wait; /*!< enable or disable the asynchronous wait function */ + uint32_t nwait_signal; /*!< enable or disable the NWAIT signal while in synchronous bust mode */ + uint32_t memory_write; /*!< enable or disable the write operation */ + uint32_t nwait_config; /*!< NWAIT signal configuration */ + uint32_t wrap_burst_mode; /*!< enable or disable the wrap burst mode */ + uint32_t nwait_polarity; /*!< specifies the polarity of NWAIT signal from memory */ + uint32_t burst_mode; /*!< enable or disable the burst mode */ + uint32_t databus_width; /*!< specifies the databus width of external memory */ + uint32_t memory_type; /*!< specifies the type of external memory */ + uint32_t address_data_mux; /*!< specifies whether the data bus and address bus are multiplexed */ + exmc_norsram_timing_parameter_struct* read_write_timing; /*!< timing parameters for read and write if the extended mode is not used or the timing + parameters for read if the extended mode is used */ + exmc_norsram_timing_parameter_struct* write_timing; /*!< timing parameters for write when the extended mode is used */ +}exmc_norsram_parameter_struct; + +/* EXMC NAND/PC card timing initialize struct */ +typedef struct +{ + uint32_t databus_hiztime; /*!< configure the dadtabus HiZ time for write operation */ + uint32_t holdtime; /*!< configure the address hold time(or the data hold time for write operation) */ + uint32_t waittime; /*!< configure the minimum wait time */ + uint32_t setuptime; /*!< configure the address setup time */ +}exmc_nand_pccard_timing_parameter_struct; + +/* EXMC NAND initialize struct */ +typedef struct +{ + uint32_t nand_bank; /*!< select the bank of NAND */ + uint32_t ecc_size; /*!< the page size for the ECC calculation */ + uint32_t atr_latency; /*!< configure the latency of ALE low to RB low */ + uint32_t ctr_latency; /*!< configure the latency of CLE low to RB low */ + uint32_t ecc_logic; /*!< enable or disable the ECC calculation logic */ + uint32_t databus_width; /*!< the NAND flash databus width */ + uint32_t wait_feature; /*!< enable or disable the wait feature */ + exmc_nand_pccard_timing_parameter_struct* common_space_timing; /*!< the timing parameters for NAND flash common space */ + exmc_nand_pccard_timing_parameter_struct* attribute_space_timing; /*!< the timing parameters for NAND flash attribute space */ +}exmc_nand_parameter_struct; + +/* EXMC PC card initialize struct */ +typedef struct +{ + uint32_t atr_latency; /*!< configure the latency of ALE low to RB low */ + uint32_t ctr_latency; /*!< configure the latency of CLE low to RB low */ + uint32_t wait_feature; /*!< enable or disable the wait feature */ + exmc_nand_pccard_timing_parameter_struct* common_space_timing; /*!< the timing parameters for PC card common space */ + exmc_nand_pccard_timing_parameter_struct* attribute_space_timing; /*!< the timing parameters for PC card attribute space */ + exmc_nand_pccard_timing_parameter_struct* io_space_timing; /*!< the timing parameters for PC card IO space */ +}exmc_pccard_parameter_struct; + +/* EXMC_register address */ +#define EXMC_SNCTL(region) REG32(EXMC + 0x08U * (region)) /*!< EXMC SRAM/NOR flash control registers, region = 0,1,2,3 */ +#define EXMC_SNTCFG(region) REG32(EXMC + 0x04U + 0x08U * (region)) /*!< EXMC SRAM/NOR flash timing configuration registers, region = 0,1,2,3 */ +#define EXMC_SNWTCFG(region) REG32(EXMC + 0x104U + 0x08U * (region)) /*!< EXMC SRAM/NOR flash write timing configuration registers, region = 0,1,2,3 */ + +#define EXMC_NPCTL(bank) REG32(EXMC + 0x40U + 0x20U * (bank)) /*!< EXMC NAND/PC card control registers, bank = 1,2,3 */ +#define EXMC_NPINTEN(bank) REG32(EXMC + 0x44U + 0x20U * (bank)) /*!< EXMC NAND/PC card interrupt enable registers, bank = 1,2,3 */ +#define EXMC_NPCTCFG(bank) REG32(EXMC + 0x48U + 0x20U * (bank)) /*!< EXMC NAND/PC card common space timing configuration registers, bank = 1,2,3 */ +#define EXMC_NPATCFG(bank) REG32(EXMC + 0x4CU + 0x20U * (bank)) /*!< EXMC NAND/PC card attribute space timing configuration registers, bank = 1,2,3 */ +#define EXMC_NECC(bank) REG32(EXMC + 0x54U + 0x20U * (bank)) /*!< EXMC NAND ECC registers, bank = 1,2 */ + +/* CRAM page size */ +#define SNCTL_CPS(regval) (BITS(16,18) & ((uint32_t)(regval) << 16)) +#define EXMC_CRAM_AUTO_SPLIT SNCTL_CPS(0) /*!< automatic burst split on page boundary crossing */ +#define EXMC_CRAM_PAGE_SIZE_128_BYTES SNCTL_CPS(1) /*!< page size is 128 bytes */ +#define EXMC_CRAM_PAGE_SIZE_256_BYTES SNCTL_CPS(2) /*!< page size is 256 bytes */ +#define EXMC_CRAM_PAGE_SIZE_512_BYTES SNCTL_CPS(3) /*!< page size is 512 bytes */ +#define EXMC_CRAM_PAGE_SIZE_1024_BYTES SNCTL_CPS(4) /*!< page size is 1024 bytes */ + +/* NOR bank memory data bus width */ +#define SNCTL_NRW(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) +#define EXMC_NOR_DATABUS_WIDTH_8B SNCTL_NRW(0) /*!< NOR data width is 8 bits */ +#define EXMC_NOR_DATABUS_WIDTH_16B SNCTL_NRW(1) /*!< NOR data width is 16 bits */ + +/* NOR bank memory type */ +#define SNCTL_NRTP(regval) (BITS(2,3) & ((uint32_t)(regval) << 2)) +#define EXMC_MEMORY_TYPE_SRAM SNCTL_NRTP(0) /*!< SRAM,ROM */ +#define EXMC_MEMORY_TYPE_PSRAM SNCTL_NRTP(1) /*!< PSRAM,CRAM */ +#define EXMC_MEMORY_TYPE_NOR SNCTL_NRTP(2) /*!< NOR flash */ + +/* asynchronous access mode */ +#define SNTCFG_ASYNCMOD(regval) (BITS(28,29) & ((uint32_t)(regval) << 28)) +#define EXMC_ACCESS_MODE_A SNTCFG_ASYNCMOD(0) /*!< mode A access */ +#define EXMC_ACCESS_MODE_B SNTCFG_ASYNCMOD(1) /*!< mode B access */ +#define EXMC_ACCESS_MODE_C SNTCFG_ASYNCMOD(2) /*!< mode C access */ +#define EXMC_ACCESS_MODE_D SNTCFG_ASYNCMOD(3) /*!< mode D access */ + +/* data latency for NOR flash */ +#define SNTCFG_DLAT(regval) (BITS(24,27) & ((uint32_t)(regval) << 24)) +#define EXMC_DATALAT_2_CLK SNTCFG_DLAT(0) /*!< data latency of first burst access is 2 EXMC_CLK */ +#define EXMC_DATALAT_3_CLK SNTCFG_DLAT(1) /*!< data latency of first burst access is 3 EXMC_CLK */ +#define EXMC_DATALAT_4_CLK SNTCFG_DLAT(2) /*!< data latency of first burst access is 4 EXMC_CLK */ +#define EXMC_DATALAT_5_CLK SNTCFG_DLAT(3) /*!< data latency of first burst access is 5 EXMC_CLK */ +#define EXMC_DATALAT_6_CLK SNTCFG_DLAT(4) /*!< data latency of first burst access is 6 EXMC_CLK */ +#define EXMC_DATALAT_7_CLK SNTCFG_DLAT(5) /*!< data latency of first burst access is 7 EXMC_CLK */ +#define EXMC_DATALAT_8_CLK SNTCFG_DLAT(6) /*!< data latency of first burst access is 8 EXMC_CLK */ +#define EXMC_DATALAT_9_CLK SNTCFG_DLAT(7) /*!< data latency of first burst access is 9 EXMC_CLK */ +#define EXMC_DATALAT_10_CLK SNTCFG_DLAT(8) /*!< data latency of first burst access is 10 EXMC_CLK */ +#define EXMC_DATALAT_11_CLK SNTCFG_DLAT(9) /*!< data latency of first burst access is 11 EXMC_CLK */ +#define EXMC_DATALAT_12_CLK SNTCFG_DLAT(10) /*!< data latency of first burst access is 12 EXMC_CLK */ +#define EXMC_DATALAT_13_CLK SNTCFG_DLAT(11) /*!< data latency of first burst access is 13 EXMC_CLK */ +#define EXMC_DATALAT_14_CLK SNTCFG_DLAT(12) /*!< data latency of first burst access is 14 EXMC_CLK */ +#define EXMC_DATALAT_15_CLK SNTCFG_DLAT(13) /*!< data latency of first burst access is 15 EXMC_CLK */ +#define EXMC_DATALAT_16_CLK SNTCFG_DLAT(14) /*!< data latency of first burst access is 16 EXMC_CLK */ +#define EXMC_DATALAT_17_CLK SNTCFG_DLAT(15) /*!< data latency of first burst access is 17 EXMC_CLK */ + +/* synchronous clock divide ratio */ +#define SNTCFG_CKDIV(regval) (BITS(20,23) & ((uint32_t)(regval) << 20)) +#define EXMC_SYN_CLOCK_RATIO_DISABLE SNTCFG_CKDIV(0) /*!< EXMC_CLK disable */ +#define EXMC_SYN_CLOCK_RATIO_2_CLK SNTCFG_CKDIV(1) /*!< EXMC_CLK = HCLK/2 */ +#define EXMC_SYN_CLOCK_RATIO_3_CLK SNTCFG_CKDIV(2) /*!< EXMC_CLK = HCLK/3 */ +#define EXMC_SYN_CLOCK_RATIO_4_CLK SNTCFG_CKDIV(3) /*!< EXMC_CLK = HCLK/4 */ +#define EXMC_SYN_CLOCK_RATIO_5_CLK SNTCFG_CKDIV(4) /*!< EXMC_CLK = HCLK/5 */ +#define EXMC_SYN_CLOCK_RATIO_6_CLK SNTCFG_CKDIV(5) /*!< EXMC_CLK = HCLK/6 */ +#define EXMC_SYN_CLOCK_RATIO_7_CLK SNTCFG_CKDIV(6) /*!< EXMC_CLK = HCLK/7 */ +#define EXMC_SYN_CLOCK_RATIO_8_CLK SNTCFG_CKDIV(7) /*!< EXMC_CLK = HCLK/8 */ +#define EXMC_SYN_CLOCK_RATIO_9_CLK SNTCFG_CKDIV(8) /*!< EXMC_CLK = HCLK/9 */ +#define EXMC_SYN_CLOCK_RATIO_10_CLK SNTCFG_CKDIV(9) /*!< EXMC_CLK = HCLK/10 */ +#define EXMC_SYN_CLOCK_RATIO_11_CLK SNTCFG_CKDIV(10) /*!< EXMC_CLK = HCLK/11 */ +#define EXMC_SYN_CLOCK_RATIO_12_CLK SNTCFG_CKDIV(11) /*!< EXMC_CLK = HCLK/12 */ +#define EXMC_SYN_CLOCK_RATIO_13_CLK SNTCFG_CKDIV(12) /*!< EXMC_CLK = HCLK/13 */ +#define EXMC_SYN_CLOCK_RATIO_14_CLK SNTCFG_CKDIV(13) /*!< EXMC_CLK = HCLK/14 */ +#define EXMC_SYN_CLOCK_RATIO_15_CLK SNTCFG_CKDIV(14) /*!< EXMC_CLK = HCLK/15 */ +#define EXMC_SYN_CLOCK_RATIO_16_CLK SNTCFG_CKDIV(15) /*!< EXMC_CLK = HCLK/16 */ + +/* ECC size */ +#define NPCTL_ECCSZ(regval) (BITS(17,19) & ((uint32_t)(regval) << 17)) +#define EXMC_ECC_SIZE_256BYTES NPCTL_ECCSZ(0) /* ECC size is 256 bytes */ +#define EXMC_ECC_SIZE_512BYTES NPCTL_ECCSZ(1) /* ECC size is 512 bytes */ +#define EXMC_ECC_SIZE_1024BYTES NPCTL_ECCSZ(2) /* ECC size is 1024 bytes */ +#define EXMC_ECC_SIZE_2048BYTES NPCTL_ECCSZ(3) /* ECC size is 2048 bytes */ +#define EXMC_ECC_SIZE_4096BYTES NPCTL_ECCSZ(4) /* ECC size is 4096 bytes */ +#define EXMC_ECC_SIZE_8192BYTES NPCTL_ECCSZ(5) /* ECC size is 8192 bytes */ + +/* ALE to RE delay */ +#define NPCTL_ATR(regval) (BITS(13,16) & ((uint32_t)(regval) << 13)) +#define EXMC_ALE_RE_DELAY_1_HCLK NPCTL_ATR(0) /* ALE to RE delay = 1*HCLK */ +#define EXMC_ALE_RE_DELAY_2_HCLK NPCTL_ATR(1) /* ALE to RE delay = 2*HCLK */ +#define EXMC_ALE_RE_DELAY_3_HCLK NPCTL_ATR(2) /* ALE to RE delay = 3*HCLK */ +#define EXMC_ALE_RE_DELAY_4_HCLK NPCTL_ATR(3) /* ALE to RE delay = 4*HCLK */ +#define EXMC_ALE_RE_DELAY_5_HCLK NPCTL_ATR(4) /* ALE to RE delay = 5*HCLK */ +#define EXMC_ALE_RE_DELAY_6_HCLK NPCTL_ATR(5) /* ALE to RE delay = 6*HCLK */ +#define EXMC_ALE_RE_DELAY_7_HCLK NPCTL_ATR(6) /* ALE to RE delay = 7*HCLK */ +#define EXMC_ALE_RE_DELAY_8_HCLK NPCTL_ATR(7) /* ALE to RE delay = 8*HCLK */ +#define EXMC_ALE_RE_DELAY_9_HCLK NPCTL_ATR(8) /* ALE to RE delay = 9*HCLK */ +#define EXMC_ALE_RE_DELAY_10_HCLK NPCTL_ATR(9) /* ALE to RE delay = 10*HCLK */ +#define EXMC_ALE_RE_DELAY_11_HCLK NPCTL_ATR(10) /* ALE to RE delay = 11*HCLK */ +#define EXMC_ALE_RE_DELAY_12_HCLK NPCTL_ATR(11) /* ALE to RE delay = 12*HCLK */ +#define EXMC_ALE_RE_DELAY_13_HCLK NPCTL_ATR(12) /* ALE to RE delay = 13*HCLK */ +#define EXMC_ALE_RE_DELAY_14_HCLK NPCTL_ATR(13) /* ALE to RE delay = 14*HCLK */ +#define EXMC_ALE_RE_DELAY_15_HCLK NPCTL_ATR(14) /* ALE to RE delay = 15*HCLK */ +#define EXMC_ALE_RE_DELAY_16_HCLK NPCTL_ATR(15) /* ALE to RE delay = 16*HCLK */ + +/* CLE to RE delay */ +#define NPCTL_CTR(regval) (BITS(9,12) & ((uint32_t)(regval) << 9)) +#define EXMC_CLE_RE_DELAY_1_HCLK NPCTL_CTR(0) /* CLE to RE delay = 1*HCLK */ +#define EXMC_CLE_RE_DELAY_2_HCLK NPCTL_CTR(1) /* CLE to RE delay = 2*HCLK */ +#define EXMC_CLE_RE_DELAY_3_HCLK NPCTL_CTR(2) /* CLE to RE delay = 3*HCLK */ +#define EXMC_CLE_RE_DELAY_4_HCLK NPCTL_CTR(3) /* CLE to RE delay = 4*HCLK */ +#define EXMC_CLE_RE_DELAY_5_HCLK NPCTL_CTR(4) /* CLE to RE delay = 5*HCLK */ +#define EXMC_CLE_RE_DELAY_6_HCLK NPCTL_CTR(5) /* CLE to RE delay = 6*HCLK */ +#define EXMC_CLE_RE_DELAY_7_HCLK NPCTL_CTR(6) /* CLE to RE delay = 7*HCLK */ +#define EXMC_CLE_RE_DELAY_8_HCLK NPCTL_CTR(7) /* CLE to RE delay = 8*HCLK */ +#define EXMC_CLE_RE_DELAY_9_HCLK NPCTL_CTR(8) /* CLE to RE delay = 9*HCLK */ +#define EXMC_CLE_RE_DELAY_10_HCLK NPCTL_CTR(9) /* CLE to RE delay = 10*HCLK */ +#define EXMC_CLE_RE_DELAY_11_HCLK NPCTL_CTR(10) /* CLE to RE delay = 11*HCLK */ +#define EXMC_CLE_RE_DELAY_12_HCLK NPCTL_CTR(11) /* CLE to RE delay = 12*HCLK */ +#define EXMC_CLE_RE_DELAY_13_HCLK NPCTL_CTR(12) /* CLE to RE delay = 13*HCLK */ +#define EXMC_CLE_RE_DELAY_14_HCLK NPCTL_CTR(13) /* CLE to RE delay = 14*HCLK */ +#define EXMC_CLE_RE_DELAY_15_HCLK NPCTL_CTR(14) /* CLE to RE delay = 15*HCLK */ +#define EXMC_CLE_RE_DELAY_16_HCLK NPCTL_CTR(15) /* CLE to RE delay = 16*HCLK */ + +/* NAND bank memory data bus width */ +#define NPCTL_NDW(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) +#define EXMC_NAND_DATABUS_WIDTH_8B NPCTL_NDW(0) /*!< NAND data width is 8 bits */ +#define EXMC_NAND_DATABUS_WIDTH_16B NPCTL_NDW(1) /*!< NAND data width is 16 bits */ + +/* EXMC NOR/SRAM bank region definition */ +#define EXMC_BANK0_NORSRAM_REGION0 ((uint32_t)0x00000000U) /*!< bank0 NOR/SRAM region0 */ +#define EXMC_BANK0_NORSRAM_REGION1 ((uint32_t)0x00000001U) /*!< bank0 NOR/SRAM region1 */ +#define EXMC_BANK0_NORSRAM_REGION2 ((uint32_t)0x00000002U) /*!< bank0 NOR/SRAM region2 */ +#define EXMC_BANK0_NORSRAM_REGION3 ((uint32_t)0x00000003U) /*!< bank0 NOR/SRAM region3 */ + +/* EXMC NOR/SRAM write mode */ +#define EXMC_ASYN_WRITE ((uint32_t)0x00000000U) /*!< asynchronous write mode */ +#define EXMC_SYN_WRITE EXMC_SNCTL_SYNCWR /*!< synchronous write mode */ + +/* EXMC NWAIT signal configuration */ +#define EXMC_NWAIT_CONFIG_BEFORE ((uint32_t)0x00000000U) /*!< NWAIT signal is active one data cycle before wait state */ +#define EXMC_NWAIT_CONFIG_DURING EXMC_SNCTL_NRWTCFG /*!< NWAIT signal is active during wait state */ + +/* EXMC NWAIT signal polarity configuration */ +#define EXMC_NWAIT_POLARITY_LOW ((uint32_t)0x00000000U) /*!< low level is active of NWAIT */ +#define EXMC_NWAIT_POLARITY_HIGH EXMC_SNCTL_NRWTPOL /*!< high level is active of NWAIT */ + +/* EXMC NAND/PC card bank definition */ +#define EXMC_BANK1_NAND ((uint32_t)0x00000001U) /*!< bank1 NAND flash */ +#define EXMC_BANK2_NAND ((uint32_t)0x00000002U) /*!< bank2 NAND flash */ +#define EXMC_BANK3_PCCARD ((uint32_t)0x00000003U) /*!< bank3 PC card */ + +/* EXMC flag bits */ +#define EXMC_NAND_PCCARD_FLAG_RISE EXMC_NPINTEN_INTRS /*!< interrupt rising edge status */ +#define EXMC_NAND_PCCARD_FLAG_LEVEL EXMC_NPINTEN_INTHS /*!< interrupt high-level status */ +#define EXMC_NAND_PCCARD_FLAG_FALL EXMC_NPINTEN_INTFS /*!< interrupt falling edge status */ +#define EXMC_NAND_PCCARD_FLAG_FIFOE EXMC_NPINTEN_FFEPT /*!< FIFO empty flag */ + +/* EXMC interrupt flag bits */ +#define EXMC_NAND_PCCARD_INT_FLAG_RISE EXMC_NPINTEN_INTREN /*!< rising edge interrupt and flag */ +#define EXMC_NAND_PCCARD_INT_FLAG_LEVEL EXMC_NPINTEN_INTHEN /*!< high-level interrupt and flag */ +#define EXMC_NAND_PCCARD_INT_FLAG_FALL EXMC_NPINTEN_INTFEN /*!< falling edge interrupt and flag */ + +/* function declarations */ +/* initialization functions */ +/* NOR/SRAM */ +/* deinitialize EXMC NOR/SRAM region */ +void exmc_norsram_deinit(uint32_t exmc_norsram_region); +/* initialize exmc_norsram_parameter_struct with the default values */ +void exmc_norsram_struct_para_init(exmc_norsram_parameter_struct* exmc_norsram_init_struct); +/* initialize EXMC NOR/SRAM region */ +void exmc_norsram_init(exmc_norsram_parameter_struct* exmc_norsram_init_struct); +/* enable EXMC NOR/SRAM region */ +void exmc_norsram_enable(uint32_t exmc_norsram_region); +/* disable EXMC NOR/SRAM region */ +void exmc_norsram_disable(uint32_t exmc_norsram_region); +/* NAND */ +/* deinitialize EXMC NAND bank */ +void exmc_nand_deinit(uint32_t exmc_nand_bank); +/* initialize exmc_norsram_parameter_struct with the default values */ +void exmc_nand_struct_para_init(exmc_nand_parameter_struct* exmc_nand_init_struct); +/* initialize EXMC NAND bank */ +void exmc_nand_init(exmc_nand_parameter_struct* exmc_nand_init_struct); +/* enable EXMC NAND bank */ +void exmc_nand_enable(uint32_t exmc_nand_bank); +/* disable EXMC NAND bank */ +void exmc_nand_disable(uint32_t exmc_nand_bank); +/* PC card */ +/* deinitialize EXMC PC card bank */ +void exmc_pccard_deinit(void); +/* initialize exmc_pccard_parameter_struct parameter with the default values */ +void exmc_pccard_struct_para_init(exmc_pccard_parameter_struct* exmc_pccard_init_struct); +/* initialize EXMC PC card bank */ +void exmc_pccard_init(exmc_pccard_parameter_struct* exmc_pccard_init_struct); +/* enable EXMC PC card bank */ +void exmc_pccard_enable(void); +/* disable EXMC PC card bank */ +void exmc_pccard_disable(void); + +/* function configuration */ +/* NOR/SRAM */ +/* configure CRAM page size */ +void exmc_norsram_page_size_config(uint32_t exmc_norsram_region, uint32_t page_size); +/* NAND */ +/* enable or disable the EXMC NAND ECC function */ +void exmc_nand_ecc_config(uint32_t exmc_nand_bank, ControlStatus newvalue); +/* get the EXMC ECC value */ +uint32_t exmc_ecc_get(uint32_t exmc_nand_bank); + +/* interrupt & flag functions */ +/* enable EXMC interrupt */ +void exmc_interrupt_enable(uint32_t exmc_bank,uint32_t interrupt); +/* disable EXMC interrupt */ +void exmc_interrupt_disable(uint32_t exmc_bank,uint32_t interrupt); +/* get EXMC flag status */ +FlagStatus exmc_flag_get(uint32_t exmc_bank,uint32_t flag); +/* clear EXMC flag status */ +void exmc_flag_clear(uint32_t exmc_bank,uint32_t flag); +/* get EXMC interrupt flag */ +FlagStatus exmc_interrupt_flag_get(uint32_t exmc_bank,uint32_t interrupt); +/* clear EXMC interrupt flag */ +void exmc_interrupt_flag_clear(uint32_t exmc_bank,uint32_t interrupt); + +#endif /* GD32F30X_EXMC_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_exti.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_exti.h new file mode 100644 index 0000000..9ce7be8 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_exti.h @@ -0,0 +1,255 @@ +/*! + \file gd32f30x_exti.h + \brief definitions for the EXTI + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_EXTI_H +#define GD32F30X_EXTI_H + +#include "gd32f30x.h" + +/* EXTI definitions */ +#define EXTI EXTI_BASE + +/* registers definitions */ +#define EXTI_INTEN REG32(EXTI + 0x00U) /*!< interrupt enable register */ +#define EXTI_EVEN REG32(EXTI + 0x04U) /*!< event enable register */ +#define EXTI_RTEN REG32(EXTI + 0x08U) /*!< rising edge trigger enable register */ +#define EXTI_FTEN REG32(EXTI + 0x0CU) /*!< falling trigger enable register */ +#define EXTI_SWIEV REG32(EXTI + 0x10U) /*!< software interrupt event register */ +#define EXTI_PD REG32(EXTI + 0x14U) /*!< pending register */ + +/* bits definitions */ +/* EXTI_INTEN */ +#define EXTI_INTEN_INTEN0 BIT(0) /*!< interrupt from line 0 */ +#define EXTI_INTEN_INTEN1 BIT(1) /*!< interrupt from line 1 */ +#define EXTI_INTEN_INTEN2 BIT(2) /*!< interrupt from line 2 */ +#define EXTI_INTEN_INTEN3 BIT(3) /*!< interrupt from line 3 */ +#define EXTI_INTEN_INTEN4 BIT(4) /*!< interrupt from line 4 */ +#define EXTI_INTEN_INTEN5 BIT(5) /*!< interrupt from line 5 */ +#define EXTI_INTEN_INTEN6 BIT(6) /*!< interrupt from line 6 */ +#define EXTI_INTEN_INTEN7 BIT(7) /*!< interrupt from line 7 */ +#define EXTI_INTEN_INTEN8 BIT(8) /*!< interrupt from line 8 */ +#define EXTI_INTEN_INTEN9 BIT(9) /*!< interrupt from line 9 */ +#define EXTI_INTEN_INTEN10 BIT(10) /*!< interrupt from line 10 */ +#define EXTI_INTEN_INTEN11 BIT(11) /*!< interrupt from line 11 */ +#define EXTI_INTEN_INTEN12 BIT(12) /*!< interrupt from line 12 */ +#define EXTI_INTEN_INTEN13 BIT(13) /*!< interrupt from line 13 */ +#define EXTI_INTEN_INTEN14 BIT(14) /*!< interrupt from line 14 */ +#define EXTI_INTEN_INTEN15 BIT(15) /*!< interrupt from line 15 */ +#define EXTI_INTEN_INTEN16 BIT(16) /*!< interrupt from line 16 */ +#define EXTI_INTEN_INTEN17 BIT(17) /*!< interrupt from line 17 */ +#define EXTI_INTEN_INTEN18 BIT(18) /*!< interrupt from line 18 */ +#define EXTI_INTEN_INTEN19 BIT(19) /*!< interrupt from line 19 */ + +/* EXTI_EVEN */ +#define EXTI_EVEN_EVEN0 BIT(0) /*!< event from line 0 */ +#define EXTI_EVEN_EVEN1 BIT(1) /*!< event from line 1 */ +#define EXTI_EVEN_EVEN2 BIT(2) /*!< event from line 2 */ +#define EXTI_EVEN_EVEN3 BIT(3) /*!< event from line 3 */ +#define EXTI_EVEN_EVEN4 BIT(4) /*!< event from line 4 */ +#define EXTI_EVEN_EVEN5 BIT(5) /*!< event from line 5 */ +#define EXTI_EVEN_EVEN6 BIT(6) /*!< event from line 6 */ +#define EXTI_EVEN_EVEN7 BIT(7) /*!< event from line 7 */ +#define EXTI_EVEN_EVEN8 BIT(8) /*!< event from line 8 */ +#define EXTI_EVEN_EVEN9 BIT(9) /*!< event from line 9 */ +#define EXTI_EVEN_EVEN10 BIT(10) /*!< event from line 10 */ +#define EXTI_EVEN_EVEN11 BIT(11) /*!< event from line 11 */ +#define EXTI_EVEN_EVEN12 BIT(12) /*!< event from line 12 */ +#define EXTI_EVEN_EVEN13 BIT(13) /*!< event from line 13 */ +#define EXTI_EVEN_EVEN14 BIT(14) /*!< event from line 14 */ +#define EXTI_EVEN_EVEN15 BIT(15) /*!< event from line 15 */ +#define EXTI_EVEN_EVEN16 BIT(16) /*!< event from line 16 */ +#define EXTI_EVEN_EVEN17 BIT(17) /*!< event from line 17 */ +#define EXTI_EVEN_EVEN18 BIT(18) /*!< event from line 18 */ +#define EXTI_EVEN_EVEN19 BIT(19) /*!< event from line 19 */ + +/* EXTI_RTEN */ +#define EXTI_RTEN_RTEN0 BIT(0) /*!< rising edge from line 0 */ +#define EXTI_RTEN_RTEN1 BIT(1) /*!< rising edge from line 1 */ +#define EXTI_RTEN_RTEN2 BIT(2) /*!< rising edge from line 2 */ +#define EXTI_RTEN_RTEN3 BIT(3) /*!< rising edge from line 3 */ +#define EXTI_RTEN_RTEN4 BIT(4) /*!< rising edge from line 4 */ +#define EXTI_RTEN_RTEN5 BIT(5) /*!< rising edge from line 5 */ +#define EXTI_RTEN_RTEN6 BIT(6) /*!< rising edge from line 6 */ +#define EXTI_RTEN_RTEN7 BIT(7) /*!< rising edge from line 7 */ +#define EXTI_RTEN_RTEN8 BIT(8) /*!< rising edge from line 8 */ +#define EXTI_RTEN_RTEN9 BIT(9) /*!< rising edge from line 9 */ +#define EXTI_RTEN_RTEN10 BIT(10) /*!< rising edge from line 10 */ +#define EXTI_RTEN_RTEN11 BIT(11) /*!< rising edge from line 11 */ +#define EXTI_RTEN_RTEN12 BIT(12) /*!< rising edge from line 12 */ +#define EXTI_RTEN_RTEN13 BIT(13) /*!< rising edge from line 13 */ +#define EXTI_RTEN_RTEN14 BIT(14) /*!< rising edge from line 14 */ +#define EXTI_RTEN_RTEN15 BIT(15) /*!< rising edge from line 15 */ +#define EXTI_RTEN_RTEN16 BIT(16) /*!< rising edge from line 16 */ +#define EXTI_RTEN_RTEN17 BIT(17) /*!< rising edge from line 17 */ +#define EXTI_RTEN_RTEN18 BIT(18) /*!< rising edge from line 18 */ +#define EXTI_RTEN_RTEN19 BIT(19) /*!< rising edge from line 19 */ + +/* EXTI_FTEN */ +#define EXTI_FTEN_FTEN0 BIT(0) /*!< falling edge from line 0 */ +#define EXTI_FTEN_FTEN1 BIT(1) /*!< falling edge from line 1 */ +#define EXTI_FTEN_FTEN2 BIT(2) /*!< falling edge from line 2 */ +#define EXTI_FTEN_FTEN3 BIT(3) /*!< falling edge from line 3 */ +#define EXTI_FTEN_FTEN4 BIT(4) /*!< falling edge from line 4 */ +#define EXTI_FTEN_FTEN5 BIT(5) /*!< falling edge from line 5 */ +#define EXTI_FTEN_FTEN6 BIT(6) /*!< falling edge from line 6 */ +#define EXTI_FTEN_FTEN7 BIT(7) /*!< falling edge from line 7 */ +#define EXTI_FTEN_FTEN8 BIT(8) /*!< falling edge from line 8 */ +#define EXTI_FTEN_FTEN9 BIT(9) /*!< falling edge from line 9 */ +#define EXTI_FTEN_FTEN10 BIT(10) /*!< falling edge from line 10 */ +#define EXTI_FTEN_FTEN11 BIT(11) /*!< falling edge from line 11 */ +#define EXTI_FTEN_FTEN12 BIT(12) /*!< falling edge from line 12 */ +#define EXTI_FTEN_FTEN13 BIT(13) /*!< falling edge from line 13 */ +#define EXTI_FTEN_FTEN14 BIT(14) /*!< falling edge from line 14 */ +#define EXTI_FTEN_FTEN15 BIT(15) /*!< falling edge from line 15 */ +#define EXTI_FTEN_FTEN16 BIT(16) /*!< falling edge from line 16 */ +#define EXTI_FTEN_FTEN17 BIT(17) /*!< falling edge from line 17 */ +#define EXTI_FTEN_FTEN18 BIT(18) /*!< falling edge from line 18 */ +#define EXTI_FTEN_FTEN19 BIT(19) /*!< falling edge from line 19 */ + +/* EXTI_SWIEV */ +#define EXTI_SWIEV_SWIEV0 BIT(0) /*!< software interrupt/event request from line 0 */ +#define EXTI_SWIEV_SWIEV1 BIT(1) /*!< software interrupt/event request from line 1 */ +#define EXTI_SWIEV_SWIEV2 BIT(2) /*!< software interrupt/event request from line 2 */ +#define EXTI_SWIEV_SWIEV3 BIT(3) /*!< software interrupt/event request from line 3 */ +#define EXTI_SWIEV_SWIEV4 BIT(4) /*!< software interrupt/event request from line 4 */ +#define EXTI_SWIEV_SWIEV5 BIT(5) /*!< software interrupt/event request from line 5 */ +#define EXTI_SWIEV_SWIEV6 BIT(6) /*!< software interrupt/event request from line 6 */ +#define EXTI_SWIEV_SWIEV7 BIT(7) /*!< software interrupt/event request from line 7 */ +#define EXTI_SWIEV_SWIEV8 BIT(8) /*!< software interrupt/event request from line 8 */ +#define EXTI_SWIEV_SWIEV9 BIT(9) /*!< software interrupt/event request from line 9 */ +#define EXTI_SWIEV_SWIEV10 BIT(10) /*!< software interrupt/event request from line 10 */ +#define EXTI_SWIEV_SWIEV11 BIT(11) /*!< software interrupt/event request from line 11 */ +#define EXTI_SWIEV_SWIEV12 BIT(12) /*!< software interrupt/event request from line 12 */ +#define EXTI_SWIEV_SWIEV13 BIT(13) /*!< software interrupt/event request from line 13 */ +#define EXTI_SWIEV_SWIEV14 BIT(14) /*!< software interrupt/event request from line 14 */ +#define EXTI_SWIEV_SWIEV15 BIT(15) /*!< software interrupt/event request from line 15 */ +#define EXTI_SWIEV_SWIEV16 BIT(16) /*!< software interrupt/event request from line 16 */ +#define EXTI_SWIEV_SWIEV17 BIT(17) /*!< software interrupt/event request from line 17 */ +#define EXTI_SWIEV_SWIEV18 BIT(18) /*!< software interrupt/event request from line 18 */ +#define EXTI_SWIEV_SWIEV19 BIT(19) /*!< software interrupt/event request from line 19 */ + +/* EXTI_PD */ +#define EXTI_PD_PD0 BIT(0) /*!< interrupt/event pending status from line 0 */ +#define EXTI_PD_PD1 BIT(1) /*!< interrupt/event pending status from line 1 */ +#define EXTI_PD_PD2 BIT(2) /*!< interrupt/event pending status from line 2 */ +#define EXTI_PD_PD3 BIT(3) /*!< interrupt/event pending status from line 3 */ +#define EXTI_PD_PD4 BIT(4) /*!< interrupt/event pending status from line 4 */ +#define EXTI_PD_PD5 BIT(5) /*!< interrupt/event pending status from line 5 */ +#define EXTI_PD_PD6 BIT(6) /*!< interrupt/event pending status from line 6 */ +#define EXTI_PD_PD7 BIT(7) /*!< interrupt/event pending status from line 7 */ +#define EXTI_PD_PD8 BIT(8) /*!< interrupt/event pending status from line 8 */ +#define EXTI_PD_PD9 BIT(9) /*!< interrupt/event pending status from line 9 */ +#define EXTI_PD_PD10 BIT(10) /*!< interrupt/event pending status from line 10 */ +#define EXTI_PD_PD11 BIT(11) /*!< interrupt/event pending status from line 11 */ +#define EXTI_PD_PD12 BIT(12) /*!< interrupt/event pending status from line 12 */ +#define EXTI_PD_PD13 BIT(13) /*!< interrupt/event pending status from line 13 */ +#define EXTI_PD_PD14 BIT(14) /*!< interrupt/event pending status from line 14 */ +#define EXTI_PD_PD15 BIT(15) /*!< interrupt/event pending status from line 15 */ +#define EXTI_PD_PD16 BIT(16) /*!< interrupt/event pending status from line 16 */ +#define EXTI_PD_PD17 BIT(17) /*!< interrupt/event pending status from line 17 */ +#define EXTI_PD_PD18 BIT(18) /*!< interrupt/event pending status from line 18 */ +#define EXTI_PD_PD19 BIT(19) /*!< interrupt/event pending status from line 19 */ + +/* constants definitions */ +/* EXTI line number */ +typedef enum +{ + EXTI_0 = BIT(0), /*!< EXTI line 0 */ + EXTI_1 = BIT(1), /*!< EXTI line 1 */ + EXTI_2 = BIT(2), /*!< EXTI line 2 */ + EXTI_3 = BIT(3), /*!< EXTI line 3 */ + EXTI_4 = BIT(4), /*!< EXTI line 4 */ + EXTI_5 = BIT(5), /*!< EXTI line 5 */ + EXTI_6 = BIT(6), /*!< EXTI line 6 */ + EXTI_7 = BIT(7), /*!< EXTI line 7 */ + EXTI_8 = BIT(8), /*!< EXTI line 8 */ + EXTI_9 = BIT(9), /*!< EXTI line 9 */ + EXTI_10 = BIT(10), /*!< EXTI line 10 */ + EXTI_11 = BIT(11), /*!< EXTI line 11 */ + EXTI_12 = BIT(12), /*!< EXTI line 12 */ + EXTI_13 = BIT(13), /*!< EXTI line 13 */ + EXTI_14 = BIT(14), /*!< EXTI line 14 */ + EXTI_15 = BIT(15), /*!< EXTI line 15 */ + EXTI_16 = BIT(16), /*!< EXTI line 16 */ + EXTI_17 = BIT(17), /*!< EXTI line 17 */ + EXTI_18 = BIT(18), /*!< EXTI line 18 */ + EXTI_19 = BIT(19), /*!< EXTI line 19 */ +}exti_line_enum; + +/* external interrupt and event */ +typedef enum +{ + EXTI_INTERRUPT = 0, /*!< EXTI interrupt mode */ + EXTI_EVENT /*!< EXTI event mode */ +}exti_mode_enum; + +/* interrupt trigger mode */ +typedef enum +{ + EXTI_TRIG_RISING = 0, /*!< EXTI rising edge trigger */ + EXTI_TRIG_FALLING, /*!< EXTI falling edge trigger */ + EXTI_TRIG_BOTH /*!< EXTI rising and falling edge trigger */ +}exti_trig_type_enum; + +/* function declarations */ +/* deinitialize the EXTI */ +void exti_deinit(void); +/* enable the configuration of EXTI initialize */ +void exti_init(exti_line_enum linex, exti_mode_enum mode, exti_trig_type_enum trig_type); +/* enable the interrupts from EXTI line x */ +void exti_interrupt_enable(exti_line_enum linex); +/* enable the events from EXTI line x */ +void exti_event_enable(exti_line_enum linex); +/* disable the interrupts from EXTI line x */ +void exti_interrupt_disable(exti_line_enum linex); +/* disable the events from EXTI line x */ +void exti_event_disable(exti_line_enum linex); + +/* get EXTI lines pending flag */ +FlagStatus exti_flag_get(exti_line_enum linex); +/* clear EXTI lines pending flag */ +void exti_flag_clear(exti_line_enum linex); +/* get EXTI lines flag when the interrupt flag is set */ +FlagStatus exti_interrupt_flag_get(exti_line_enum linex); +/* clear EXTI lines pending flag */ +void exti_interrupt_flag_clear(exti_line_enum linex); +/* enable the EXTI software interrupt event */ +void exti_software_interrupt_enable(exti_line_enum linex); +/* disable the EXTI software interrupt event */ +void exti_software_interrupt_disable(exti_line_enum linex); + +#endif /* GD32F30X_EXTI_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_fmc.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_fmc.h new file mode 100644 index 0000000..ec728d8 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_fmc.h @@ -0,0 +1,375 @@ +/*! + \file gd32f30x_fmc.h + \brief definitions for the FMC + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef GD32F30X_FMC_H +#define GD32F30X_FMC_H + +#include "gd32f30x.h" + +/* FMC and option byte definition */ +#define FMC FMC_BASE /*!< FMC register base address */ +#define OB OB_BASE /*!< option bytes base address */ + +/* registers definitions */ +#define FMC_WS REG32((FMC) + 0x00U) /*!< FMC wait state register */ +#define FMC_KEY0 REG32((FMC) + 0x04U) /*!< FMC unlock key register 0 */ +#define FMC_OBKEY REG32((FMC) + 0x08U) /*!< FMC option bytes unlock key register */ +#define FMC_STAT0 REG32((FMC) + 0x0CU) /*!< FMC status register 0 */ +#define FMC_CTL0 REG32((FMC) + 0x10U) /*!< FMC control register 0 */ +#define FMC_ADDR0 REG32((FMC) + 0x14U) /*!< FMC address register 0 */ +#define FMC_OBSTAT REG32((FMC) + 0x1CU) /*!< FMC option bytes status register */ +#define FMC_WP REG32((FMC) + 0x20U) /*!< FMC erase/program protection register */ +#define FMC_KEY1 REG32((FMC) + 0x44U) /*!< FMC unlock key register 1 */ +#define FMC_STAT1 REG32((FMC) + 0x4CU) /*!< FMC status register 1 */ +#define FMC_CTL1 REG32((FMC) + 0x50U) /*!< FMC control register 1 */ +#define FMC_ADDR1 REG32((FMC) + 0x54U) /*!< FMC address register 1 */ +#define FMC_WSEN REG32((FMC) + 0xFCU) /*!< FMC wait state enable register */ +#define FMC_PID REG32((FMC) + 0x100U) /*!< FMC product ID register */ + +#define OB_SPC REG16((OB) + 0x00U) /*!< option byte security protection value */ +#define OB_USER REG16((OB) + 0x02U) /*!< option byte user value*/ +#define OB_DATA1 REG16((OB) + 0x04U) /*!< option byte data1 value*/ +#define OB_DATA2 REG16((OB) + 0x06U) /*!< option byte data2 value*/ +#define OB_WP0 REG16((OB) + 0x08U) /*!< option byte write protection 0 */ +#define OB_WP1 REG16((OB) + 0x0AU) /*!< option byte write protection 1 */ +#define OB_WP2 REG16((OB) + 0x0CU) /*!< option byte write protection 2 */ +#define OB_WP3 REG16((OB) + 0x0EU) /*!< option byte write protection 3 */ + +/* bits definitions */ +/* FMC_WS */ +#define FMC_WS_WSCNT BITS(0,2) /*!< wait state counter */ + +/* FMC_KEY0 */ +#define FMC_KEY0_KEY BITS(0,31) /*!< FMC_CTL0 unlock key bits */ + +/* FMC_OBKEY */ +#define FMC_OBKEY_OBKEY BITS(0,31) /*!< option bytes unlock key bits */ + +/* FMC_STAT0 */ +#define FMC_STAT0_BUSY BIT(0) /*!< flash busy flag bit */ +#define FMC_STAT0_PGERR BIT(2) /*!< flash program error flag bit */ +#define FMC_STAT0_WPERR BIT(4) /*!< erase/program protection error flag bit */ +#define FMC_STAT0_ENDF BIT(5) /*!< end of operation flag bit */ + +/* FMC_CTL0 */ +#define FMC_CTL0_PG BIT(0) /*!< main flash program for bank0 command bit */ +#define FMC_CTL0_PER BIT(1) /*!< main flash page erase for bank0 command bit */ +#define FMC_CTL0_MER BIT(2) /*!< main flash mass erase for bank0 command bit */ +#define FMC_CTL0_OBPG BIT(4) /*!< option bytes program command bit */ +#define FMC_CTL0_OBER BIT(5) /*!< option bytes erase command bit */ +#define FMC_CTL0_START BIT(6) /*!< send erase command to FMC bit */ +#define FMC_CTL0_LK BIT(7) /*!< FMC_CTL0 lock bit */ +#define FMC_CTL0_OBWEN BIT(9) /*!< option bytes erase/program enable bit */ +#define FMC_CTL0_ERRIE BIT(10) /*!< error interrupt enable bit */ +#define FMC_CTL0_ENDIE BIT(12) /*!< end of operation interrupt enable bit */ + +/* FMC_ADDR0 */ +#define FMC_ADDR0_ADDR BITS(0,31) /*!< Flash erase/program command address bits */ + +/* FMC_OBSTAT */ +#define FMC_OBSTAT_OBERR BIT(0) /*!< option bytes read error bit. */ +#define FMC_OBSTAT_SPC BIT(1) /*!< option bytes security protection code */ +#define FMC_OBSTAT_USER BITS(2,9) /*!< store USER of option bytes block after system reset */ +#define FMC_OBSTAT_DATA BITS(10,25) /*!< store DATA of option bytes block after system reset. */ + +/* FMC_WP */ +#define FMC_WP_WP BITS(0,31) /*!< store WP of option bytes block after system reset */ + +/* FMC_KEY1 */ +#define FMC_KEY1_KEY BITS(0,31) /*!< FMC_CTL1 unlock key bits */ + +/* FMC_STAT1 */ +#define FMC_STAT1_BUSY BIT(0) /*!< flash busy flag bit */ +#define FMC_STAT1_PGERR BIT(2) /*!< flash program error flag bit */ +#define FMC_STAT1_WPERR BIT(4) /*!< erase/program protection error flag bit */ +#define FMC_STAT1_ENDF BIT(5) /*!< end of operation flag bit */ + +/* FMC_CTL1 */ +#define FMC_CTL1_PG BIT(0) /*!< main flash program for bank1 command bit */ +#define FMC_CTL1_PER BIT(1) /*!< main flash page erase for bank1 command bit */ +#define FMC_CTL1_MER BIT(2) /*!< main flash mass erase for bank1 command bit */ +#define FMC_CTL1_START BIT(6) /*!< send erase command to FMC bit */ +#define FMC_CTL1_LK BIT(7) /*!< FMC_CTL1 lock bit */ +#define FMC_CTL1_ERRIE BIT(10) /*!< error interrupt enable bit */ +#define FMC_CTL1_ENDIE BIT(12) /*!< end of operation interrupt enable bit */ + +/* FMC_ADDR1 */ +#define FMC_ADDR1_ADDR BITS(0,31) /*!< Flash erase/program command address bits */ + +/* FMC_WSEN */ +#define FMC_WSEN_WSEN BIT(0) /*!< FMC wait state enable bit */ +#define FMC_WSEN_BPEN BIT(1) /*!< FMC bit program enable bit */ + +/* FMC_PID */ +#define FMC_PID_PID BITS(0,31) /*!< product ID bits */ + +/* constants definitions */ +/* define the FMC bit position and its register index offset */ +#define FMC_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define FMC_REG_VAL(offset) (REG32(FMC + ((uint32_t)(offset) >> 6))) +#define FMC_BIT_POS(val) ((uint32_t)(val) & 0x1FU) +#define FMC_REGIDX_BITS(regidx, bitpos0, bitpos1) (((uint32_t)(regidx) << 12) | ((uint32_t)(bitpos0) << 6) | (uint32_t)(bitpos1)) +#define FMC_REG_VALS(offset) (REG32(FMC + ((uint32_t)(offset) >> 12))) +#define FMC_BIT_POS0(val) (((uint32_t)(val) >> 6) & 0x1FU) +#define FMC_BIT_POS1(val) ((uint32_t)(val) & 0x1FU) +#define FMC_REG_OFFSET_GET(flag) ((uint32_t)(flag) >> 12) + +/* configuration register */ +#define FMC_STAT0_REG_OFFSET 0x0CU /*!< status register 0 offset */ +#define FMC_CTL0_REG_OFFSET 0x10U /*!< control register 0 offset */ +#define FMC_STAT1_REG_OFFSET 0x4CU /*!< status register 1 offset */ +#define FMC_CTL1_REG_OFFSET 0x50U /*!< control register 1 offset */ +#define FMC_OBSTAT_REG_OFFSET 0x1CU /*!< option byte status register offset */ + +/* fmc state */ +typedef enum +{ + FMC_READY, /*!< the operation has been completed */ + FMC_BUSY, /*!< the operation is in progress */ + FMC_PGERR, /*!< program error */ + FMC_WPERR, /*!< erase/program protection error */ + FMC_TOERR, /*!< timeout error */ +}fmc_state_enum; + +/* FMC interrupt enable */ +typedef enum +{ + FMC_INT_BANK0_END = FMC_REGIDX_BIT(FMC_CTL0_REG_OFFSET, 12U), /*!< enable FMC end of program interrupt */ + FMC_INT_BANK0_ERR = FMC_REGIDX_BIT(FMC_CTL0_REG_OFFSET, 10U), /*!< enable FMC error interrupt */ + FMC_INT_BANK1_END = FMC_REGIDX_BIT(FMC_CTL1_REG_OFFSET, 12U), /*!< enable FMC bank1 end of program interrupt */ + FMC_INT_BANK1_ERR = FMC_REGIDX_BIT(FMC_CTL1_REG_OFFSET, 10U), /*!< enable FMC bank1 error interrupt */ +}fmc_int_enum; + +/* FMC flags */ +typedef enum +{ + FMC_FLAG_BANK0_BUSY = FMC_REGIDX_BIT(FMC_STAT0_REG_OFFSET, 0U), /*!< FMC bank0 busy flag */ + FMC_FLAG_BANK0_PGERR = FMC_REGIDX_BIT(FMC_STAT0_REG_OFFSET, 2U), /*!< FMC bank0 operation error flag bit */ + FMC_FLAG_BANK0_WPERR = FMC_REGIDX_BIT(FMC_STAT0_REG_OFFSET, 4U), /*!< FMC bank0 erase/program protection error flag bit */ + FMC_FLAG_BANK0_END = FMC_REGIDX_BIT(FMC_STAT0_REG_OFFSET, 5U), /*!< FMC bank0 end of operation flag bit */ + FMC_FLAG_OBERR = FMC_REGIDX_BIT(FMC_OBSTAT_REG_OFFSET, 0U), /*!< FMC option bytes read error flag */ + FMC_FLAG_BANK1_BUSY = FMC_REGIDX_BIT(FMC_STAT1_REG_OFFSET, 0U), /*!< FMC bank1 busy flag */ + FMC_FLAG_BANK1_PGERR = FMC_REGIDX_BIT(FMC_STAT1_REG_OFFSET, 2U), /*!< FMC bank1 operation error flag bit */ + FMC_FLAG_BANK1_WPERR = FMC_REGIDX_BIT(FMC_STAT1_REG_OFFSET, 4U), /*!< FMC bank1 erase/program protection error flag bit */ + FMC_FLAG_BANK1_END = FMC_REGIDX_BIT(FMC_STAT1_REG_OFFSET, 5U), /*!< FMC bank1 end of operation flag bit */ +}fmc_flag_enum; + +/* FMC interrupt flags */ +typedef enum +{ + FMC_INT_FLAG_BANK0_PGERR = FMC_REGIDX_BITS(FMC_STAT0_REG_OFFSET, 2U, 10U), /*!< FMC bank0 operation error interrupt flag bit */ + FMC_INT_FLAG_BANK0_WPERR = FMC_REGIDX_BITS(FMC_STAT0_REG_OFFSET, 4U, 10U), /*!< FMC bank0 erase/program protection error interrupt flag bit */ + FMC_INT_FLAG_BANK0_END = FMC_REGIDX_BITS(FMC_STAT0_REG_OFFSET, 5U, 12U), /*!< FMC bank0 end of operation interrupt flag bit */ + FMC_INT_FLAG_BANK1_PGERR = FMC_REGIDX_BITS(FMC_STAT1_REG_OFFSET, 2U, 10U), /*!< FMC bank1 operation error interrupt flag bit */ + FMC_INT_FLAG_BANK1_WPERR = FMC_REGIDX_BITS(FMC_STAT1_REG_OFFSET, 4U, 10U), /*!< FMC bank1 erase/program protection error interrupt flag bit */ + FMC_INT_FLAG_BANK1_END = FMC_REGIDX_BITS(FMC_STAT1_REG_OFFSET, 5U, 12U), /*!< FMC bank1 end of operation interrupt flag bit */ +}fmc_interrupt_flag_enum; + +/* unlock key */ +#define UNLOCK_KEY0 ((uint32_t)0x45670123U) /*!< unlock key 0 */ +#define UNLOCK_KEY1 ((uint32_t)0xCDEF89ABU) /*!< unlock key 1 */ + +/* FMC wait state counter */ +#define WS_WSCNT(regval) (BITS(0,2) & ((uint32_t)(regval))) +#define WS_WSCNT_0 WS_WSCNT(0) /*!< FMC 0 wait */ +#define WS_WSCNT_1 WS_WSCNT(1) /*!< FMC 1 wait */ +#define WS_WSCNT_2 WS_WSCNT(2) /*!< FMC 2 wait */ + +/* option bytes software/hardware free watch dog timer */ +#define OB_FWDGT_SW ((uint8_t)0x01U) /*!< software free watchdog */ +#define OB_FWDGT_HW ((uint8_t)0x00U) /*!< hardware free watchdog */ + +/* option bytes reset or not entering deep sleep mode */ +#define OB_DEEPSLEEP_NRST ((uint8_t)0x02U) /*!< no reset when entering deepsleep mode */ +#define OB_DEEPSLEEP_RST ((uint8_t)0x00U) /*!< generate a reset instead of entering deepsleep mode */ + +/* option bytes reset or not entering standby mode */ +#define OB_STDBY_NRST ((uint8_t)0x04U) /*!< no reset when entering deepsleep mode */ +#define OB_STDBY_RST ((uint8_t)0x00U) /*!< generate a reset instead of entering standby mode */ + +/* option bytes boot bank value */ +#define OB_BOOT_B0 ((uint8_t)0x08U) /*!< boot from bank0 */ +#define OB_BOOT_B1 ((uint8_t)0x00U) /*!< boot from bank1 */ + +#define OB_USER_MASK ((uint8_t)0xF0U) /*!< MASK value */ + +/* read protect configure */ +#define FMC_NSPC ((uint8_t)0xA5U) /*!< no security protection */ +#define FMC_USPC ((uint8_t)0xBBU) /*!< under security protection */ + +/* OB_SPC */ +#define OB_SPC_SPC ((uint32_t)0x000000FFU) /*!< option byte security protection value */ +#define OB_SPC_SPC_N ((uint32_t)0x0000FF00U) /*!< option byte security protection complement value */ + +/* OB_USER */ +#define OB_USER_USER ((uint32_t)0x00FF0000U) /*!< user option value */ +#define OB_USER_USER_N ((uint32_t)0xFF000000U) /*!< user option complement value */ + +/* OB_WP0 */ +#define OB_WP0_WP0 ((uint32_t)0x000000FFU) /*!< FMC write protection option value */ + +/* OB_WP1 */ +#define OB_WP1_WP1 ((uint32_t)0x0000FF00U) /*!< FMC write protection option complement value */ + +/* OB_WP2 */ +#define OB_WP2_WP2 ((uint32_t)0x00FF0000U) /*!< FMC write protection option value */ + +/* OB_WP3 */ +#define OB_WP3_WP3 ((uint32_t)0xFF000000U) /*!< FMC write protection option complement value */ + +/* option bytes write protection */ +#define OB_WP_0 ((uint32_t)0x00000001U) /*!< erase/program protection of sector 0 */ +#define OB_WP_1 ((uint32_t)0x00000002U) /*!< erase/program protection of sector 1 */ +#define OB_WP_2 ((uint32_t)0x00000004U) /*!< erase/program protection of sector 2 */ +#define OB_WP_3 ((uint32_t)0x00000008U) /*!< erase/program protection of sector 3 */ +#define OB_WP_4 ((uint32_t)0x00000010U) /*!< erase/program protection of sector 4 */ +#define OB_WP_5 ((uint32_t)0x00000020U) /*!< erase/program protection of sector 5 */ +#define OB_WP_6 ((uint32_t)0x00000040U) /*!< erase/program protection of sector 6 */ +#define OB_WP_7 ((uint32_t)0x00000080U) /*!< erase/program protection of sector 7 */ +#define OB_WP_8 ((uint32_t)0x00000100U) /*!< erase/program protection of sector 8 */ +#define OB_WP_9 ((uint32_t)0x00000200U) /*!< erase/program protection of sector 9 */ +#define OB_WP_10 ((uint32_t)0x00000400U) /*!< erase/program protection of sector 10 */ +#define OB_WP_11 ((uint32_t)0x00000800U) /*!< erase/program protection of sector 11 */ +#define OB_WP_12 ((uint32_t)0x00001000U) /*!< erase/program protection of sector 12 */ +#define OB_WP_13 ((uint32_t)0x00002000U) /*!< erase/program protection of sector 13 */ +#define OB_WP_14 ((uint32_t)0x00004000U) /*!< erase/program protection of sector 14 */ +#define OB_WP_15 ((uint32_t)0x00008000U) /*!< erase/program protection of sector 15 */ +#define OB_WP_16 ((uint32_t)0x00010000U) /*!< erase/program protection of sector 16 */ +#define OB_WP_17 ((uint32_t)0x00020000U) /*!< erase/program protection of sector 17 */ +#define OB_WP_18 ((uint32_t)0x00040000U) /*!< erase/program protection of sector 18 */ +#define OB_WP_19 ((uint32_t)0x00080000U) /*!< erase/program protection of sector 19 */ +#define OB_WP_20 ((uint32_t)0x00100000U) /*!< erase/program protection of sector 20 */ +#define OB_WP_21 ((uint32_t)0x00200000U) /*!< erase/program protection of sector 21 */ +#define OB_WP_22 ((uint32_t)0x00400000U) /*!< erase/program protection of sector 22 */ +#define OB_WP_23 ((uint32_t)0x00800000U) /*!< erase/program protection of sector 23 */ +#define OB_WP_24 ((uint32_t)0x01000000U) /*!< erase/program protection of sector 24 */ +#define OB_WP_25 ((uint32_t)0x02000000U) /*!< erase/program protection of sector 25 */ +#define OB_WP_26 ((uint32_t)0x04000000U) /*!< erase/program protection of sector 26 */ +#define OB_WP_27 ((uint32_t)0x08000000U) /*!< erase/program protection of sector 27 */ +#define OB_WP_28 ((uint32_t)0x10000000U) /*!< erase/program protection of sector 28 */ +#define OB_WP_29 ((uint32_t)0x20000000U) /*!< erase/program protection of sector 29 */ +#define OB_WP_30 ((uint32_t)0x40000000U) /*!< erase/program protection of sector 30 */ +#define OB_WP_31 ((uint32_t)0x80000000U) /*!< erase/program protection of sector 31 */ +#define OB_WP_ALL ((uint32_t)0xFFFFFFFFU) /*!< erase/program protection of all sectors */ + +/* FMC timeout */ +#define FMC_TIMEOUT_COUNT ((uint32_t)0x0FFF0000U) /*!< FMC timeout count value */ + +/* FMC BANK address */ +#define FMC_BANK0_END_ADDRESS ((uint32_t)0x0807FFFFU) /*!< FMC bank0 end address */ +#define FMC_BANK0_SIZE ((uint32_t)0x00000200U) /*!< FMC bank0 size */ +#define FMC_SIZE (*(uint16_t *)0x1FFFF7E0U) /*!< FMC size */ + +/* function declarations */ +/* FMC main memory programming functions */ +/* set the FMC wait state counter */ +void fmc_wscnt_set(uint32_t wscnt); +/* unlock the main FMC operation */ +void fmc_unlock(void); +/* unlock the FMC bank0 operation */ +void fmc_bank0_unlock(void); +/* unlock the FMC bank1 operation */ +void fmc_bank1_unlock(void); +/* lock the main FMC operation */ +void fmc_lock(void); +/* lock the bank0 FMC operation */ +void fmc_bank0_lock(void); +/* lock the bank1 FMC operation */ +void fmc_bank1_lock(void); +/* FMC erase page */ +fmc_state_enum fmc_page_erase(uint32_t page_address); +/* FMC erase whole chip */ +fmc_state_enum fmc_mass_erase(void); +/* FMC erase whole bank0 */ +fmc_state_enum fmc_bank0_erase(void); +/* FMC erase whole bank1 */ +fmc_state_enum fmc_bank1_erase(void); +/* FMC program a word at the corresponding address */ +fmc_state_enum fmc_word_program(uint32_t address, uint32_t data); +/* FMC program a half word at the corresponding address */ +fmc_state_enum fmc_halfword_program(uint32_t address, uint16_t data); +/* FMC reprogram a word at the corresponding address without erasing */ +fmc_state_enum fmc_word_reprogram(uint32_t address, uint32_t data); + +/* FMC option bytes programming functions */ +/* unlock the option byte operation */ +void ob_unlock(void); +/* lock the option byte operation */ +void ob_lock(void); +/* erase the option byte */ +fmc_state_enum ob_erase(void); +/* enable write protect */ +fmc_state_enum ob_write_protection_enable(uint32_t ob_wp); +/* configure the option byte security protection */ +fmc_state_enum ob_security_protection_config(uint8_t ob_spc); +/* write the FMC option byte */ +fmc_state_enum ob_user_write(uint8_t ob_fwdgt, uint8_t ob_deepsleep, uint8_t ob_stdby, uint8_t ob_boot); +/* program option bytes data */ +fmc_state_enum ob_data_program(uint32_t address, uint8_t data); +/* get the FMC option byte user */ +uint8_t ob_user_get(void); +/* get OB_DATA in register FMC_OBSTAT */ +uint16_t ob_data_get(void); +/* get the FMC option byte write protection */ +uint32_t ob_write_protection_get(void); +/* get option byte security protection code value */ +FlagStatus ob_spc_get(void); + +/* FMC interrupts and flags management functions */ +/* enable FMC interrupt */ +void fmc_interrupt_enable(uint32_t interrupt); +/* disable FMC interrupt */ +void fmc_interrupt_disable(uint32_t interrupt); +/* check flag is set or not */ +FlagStatus fmc_flag_get(uint32_t flag); +/* clear the FMC flag */ +void fmc_flag_clear(uint32_t flag); +/* get FMC interrupt flag state */ +FlagStatus fmc_interrupt_flag_get(fmc_interrupt_flag_enum flag); +/* clear FMC interrupt flag state */ +void fmc_interrupt_flag_clear(fmc_interrupt_flag_enum flag); +/* return the FMC bank0 state */ +fmc_state_enum fmc_bank0_state_get(void); +/* return the FMC bank1 state */ +fmc_state_enum fmc_bank1_state_get(void); +/* check FMC bank0 ready or not */ +fmc_state_enum fmc_bank0_ready_wait(uint32_t timeout); +/* check FMC bank1 ready or not */ +fmc_state_enum fmc_bank1_ready_wait(uint32_t timeout); + +#endif /* GD32F30X_FMC_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_fwdgt.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_fwdgt.h new file mode 100644 index 0000000..fd7529e --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_fwdgt.h @@ -0,0 +1,107 @@ +/*! + \file gd32f30x_fwdgt.h + \brief definitions for the FWDGT + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_FWDGT_H +#define GD32F30X_FWDGT_H + +#include "gd32f30x.h" + +/* FWDGT definitions */ +#define FWDGT FWDGT_BASE + +/* registers definitions */ +#define FWDGT_CTL REG32((FWDGT) + 0x00U) /*!< FWDGT control register */ +#define FWDGT_PSC REG32((FWDGT) + 0x04U) /*!< FWDGT prescaler register */ +#define FWDGT_RLD REG32((FWDGT) + 0x08U) /*!< FWDGT reload register */ +#define FWDGT_STAT REG32((FWDGT) + 0x0CU) /*!< FWDGT status register */ + +/* bits definitions */ +/* FWDGT_CTL */ +#define FWDGT_CTL_CMD BITS(0,15) /*!< FWDGT command value */ + +/* FWDGT_PSC */ +#define FWDGT_PSC_PSC BITS(0,2) /*!< FWDGT prescaler divider value */ + +/* FWDGT_RLD */ +#define FWDGT_RLD_RLD BITS(0,11) /*!< FWDGT counter reload value */ + +/* FWDGT_STAT */ +#define FWDGT_STAT_PUD BIT(0) /*!< FWDGT prescaler divider value update */ +#define FWDGT_STAT_RUD BIT(1) /*!< FWDGT counter reload value update */ + +/* constants definitions */ +/* psc register value */ +#define PSC_PSC(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) +#define FWDGT_PSC_DIV4 ((uint8_t)PSC_PSC(0)) /*!< FWDGT prescaler set to 4 */ +#define FWDGT_PSC_DIV8 ((uint8_t)PSC_PSC(1)) /*!< FWDGT prescaler set to 8 */ +#define FWDGT_PSC_DIV16 ((uint8_t)PSC_PSC(2)) /*!< FWDGT prescaler set to 16 */ +#define FWDGT_PSC_DIV32 ((uint8_t)PSC_PSC(3)) /*!< FWDGT prescaler set to 32 */ +#define FWDGT_PSC_DIV64 ((uint8_t)PSC_PSC(4)) /*!< FWDGT prescaler set to 64 */ +#define FWDGT_PSC_DIV128 ((uint8_t)PSC_PSC(5)) /*!< FWDGT prescaler set to 128 */ +#define FWDGT_PSC_DIV256 ((uint8_t)PSC_PSC(6)) /*!< FWDGT prescaler set to 256 */ + +/* control value */ +#define FWDGT_WRITEACCESS_ENABLE ((uint16_t)0x5555U) /*!< FWDGT_CTL bits write access enable value */ +#define FWDGT_WRITEACCESS_DISABLE ((uint16_t)0x0000U) /*!< FWDGT_CTL bits write access disable value */ +#define FWDGT_KEY_RELOAD ((uint16_t)0xAAAAU) /*!< FWDGT_CTL bits fwdgt counter reload value */ +#define FWDGT_KEY_ENABLE ((uint16_t)0xCCCCU) /*!< FWDGT_CTL bits fwdgt counter enable value */ + +/* FWDGT timeout value */ +#define FWDGT_PSC_TIMEOUT ((uint32_t)0x000FFFFFU) /*!< FWDGT_PSC register write operation state flag timeout */ +#define FWDGT_RLD_TIMEOUT ((uint32_t)0x000FFFFFU) /*!< FWDGT_RLD register write operation state flag timeout */ + +/* FWDGT flag definitions */ +#define FWDGT_FLAG_PUD FWDGT_STAT_PUD /*!< FWDGT prescaler divider value update flag */ +#define FWDGT_FLAG_RUD FWDGT_STAT_RUD /*!< FWDGT counter reload value update flag */ + +/* function declarations */ +/* enable write access to FWDGT_PSC and FWDGT_RLD */ +void fwdgt_write_enable(void); +/* disable write access to FWDGT_PSC and FWDGT_RLD */ +void fwdgt_write_disable(void); +/* start the free watchdog timer counter */ +void fwdgt_enable(void); + +/* reload the counter of FWDGT */ +void fwdgt_counter_reload(void); +/* configure counter reload value, and prescaler divider value */ +ErrStatus fwdgt_config(uint16_t reload_value, uint8_t prescaler_div); + +/* get flag state of FWDGT */ +FlagStatus fwdgt_flag_get(uint16_t flag); + +#endif /* GD32F30X_FWDGT_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_gpio.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_gpio.h new file mode 100644 index 0000000..ea7a5b0 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_gpio.h @@ -0,0 +1,536 @@ +/*! + \file gd32f30x_gpio.h + \brief definitions for the GPIO + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_GPIO_H +#define GD32F30X_GPIO_H + +#include "gd32f30x.h" + +/* GPIOx(x=A,B,C,D,E,F,G) definitions */ +#define GPIOA (GPIO_BASE + 0x00000000U) +#define GPIOB (GPIO_BASE + 0x00000400U) +#define GPIOC (GPIO_BASE + 0x00000800U) +#define GPIOD (GPIO_BASE + 0x00000C00U) +#define GPIOE (GPIO_BASE + 0x00001000U) +#define GPIOF (GPIO_BASE + 0x00001400U) +#define GPIOG (GPIO_BASE + 0x00001800U) + +/* AFIO definitions */ +#define AFIO AFIO_BASE + +/* registers definitions */ +/* GPIO registers definitions */ +#define GPIO_CTL0(gpiox) REG32((gpiox) + 0x00U) /*!< GPIO port control register 0 */ +#define GPIO_CTL1(gpiox) REG32((gpiox) + 0x04U) /*!< GPIO port control register 1 */ +#define GPIO_ISTAT(gpiox) REG32((gpiox) + 0x08U) /*!< GPIO port input status register */ +#define GPIO_OCTL(gpiox) REG32((gpiox) + 0x0CU) /*!< GPIO port output control register */ +#define GPIO_BOP(gpiox) REG32((gpiox) + 0x10U) /*!< GPIO port bit operation register */ +#define GPIO_BC(gpiox) REG32((gpiox) + 0x14U) /*!< GPIO bit clear register */ +#define GPIO_LOCK(gpiox) REG32((gpiox) + 0x18U) /*!< GPIO port configuration lock register */ +#define GPIOx_SPD(gpiox) REG32((gpiox) + 0x3CU) /*!< GPIO port bit speed register */ + +/* AFIO registers definitions */ +#define AFIO_EC REG32(AFIO + 0x00U) /*!< AFIO event control register */ +#define AFIO_PCF0 REG32(AFIO + 0x04U) /*!< AFIO port configuration register 0 */ +#define AFIO_EXTISS0 REG32(AFIO + 0x08U) /*!< AFIO port EXTI sources selection register 0 */ +#define AFIO_EXTISS1 REG32(AFIO + 0x0CU) /*!< AFIO port EXTI sources selection register 1 */ +#define AFIO_EXTISS2 REG32(AFIO + 0x10U) /*!< AFIO port EXTI sources selection register 2 */ +#define AFIO_EXTISS3 REG32(AFIO + 0x14U) /*!< AFIO port EXTI sources selection register 3 */ +#define AFIO_PCF1 REG32(AFIO + 0x1CU) /*!< AFIO port configuration register 1 */ +#define AFIO_CPSCTL REG32(AFIO + 0x20U) /*!< IO compensation control register */ + +/* bits definitions */ +/* GPIO_CTL0 */ +#define GPIO_CTL0_MD0 BITS(0,1) /*!< port 0 mode bits */ +#define GPIO_CTL0_CTL0 BITS(2,3) /*!< pin 0 configuration bits */ +#define GPIO_CTL0_MD1 BITS(4,5) /*!< port 1 mode bits */ +#define GPIO_CTL0_CTL1 BITS(6,7) /*!< pin 1 configuration bits */ +#define GPIO_CTL0_MD2 BITS(8,9) /*!< port 2 mode bits */ +#define GPIO_CTL0_CTL2 BITS(10,11) /*!< pin 2 configuration bits */ +#define GPIO_CTL0_MD3 BITS(12,13) /*!< port 3 mode bits */ +#define GPIO_CTL0_CTL3 BITS(14,15) /*!< pin 3 configuration bits */ +#define GPIO_CTL0_MD4 BITS(16,17) /*!< port 4 mode bits */ +#define GPIO_CTL0_CTL4 BITS(18,19) /*!< pin 4 configuration bits */ +#define GPIO_CTL0_MD5 BITS(20,21) /*!< port 5 mode bits */ +#define GPIO_CTL0_CTL5 BITS(22,23) /*!< pin 5 configuration bits */ +#define GPIO_CTL0_MD6 BITS(24,25) /*!< port 6 mode bits */ +#define GPIO_CTL0_CTL6 BITS(26,27) /*!< pin 6 configuration bits */ +#define GPIO_CTL0_MD7 BITS(28,29) /*!< port 7 mode bits */ +#define GPIO_CTL0_CTL7 BITS(30,31) /*!< pin 7 configuration bits */ + +/* GPIO_CTL1 */ +#define GPIO_CTL1_MD8 BITS(0,1) /*!< port 8 mode bits */ +#define GPIO_CTL1_CTL8 BITS(2,3) /*!< pin 8 configuration bits */ +#define GPIO_CTL1_MD9 BITS(4,5) /*!< port 9 mode bits */ +#define GPIO_CTL1_CTL9 BITS(6,7) /*!< pin 9 configuration bits */ +#define GPIO_CTL1_MD10 BITS(8,9) /*!< port 10 mode bits */ +#define GPIO_CTL1_CTL10 BITS(10,11) /*!< pin 10 configuration bits */ +#define GPIO_CTL1_MD11 BITS(12,13) /*!< port 11 mode bits */ +#define GPIO_CTL1_CTL11 BITS(14,15) /*!< pin 11 configuration bits */ +#define GPIO_CTL1_MD12 BITS(16,17) /*!< port 12 mode bits */ +#define GPIO_CTL1_CTL12 BITS(18,19) /*!< pin 12 configuration bits */ +#define GPIO_CTL1_MD13 BITS(20,21) /*!< port 13 mode bits */ +#define GPIO_CTL1_CTL13 BITS(22,23) /*!< pin 13 configuration bits */ +#define GPIO_CTL1_MD14 BITS(24,25) /*!< port 14 mode bits */ +#define GPIO_CTL1_CTL14 BITS(26,27) /*!< pin 14 configuration bits */ +#define GPIO_CTL1_MD15 BITS(28,29) /*!< port 15 mode bits */ +#define GPIO_CTL1_CTL15 BITS(30,31) /*!< pin 15 configuration bits */ + +/* GPIO_ISTAT */ +#define GPIO_ISTAT_ISTAT0 BIT(0) /*!< pin 0 input status */ +#define GPIO_ISTAT_ISTAT1 BIT(1) /*!< pin 1 input status */ +#define GPIO_ISTAT_ISTAT2 BIT(2) /*!< pin 2 input status */ +#define GPIO_ISTAT_ISTAT3 BIT(3) /*!< pin 3 input status */ +#define GPIO_ISTAT_ISTAT4 BIT(4) /*!< pin 4 input status */ +#define GPIO_ISTAT_ISTAT5 BIT(5) /*!< pin 5 input status */ +#define GPIO_ISTAT_ISTAT6 BIT(6) /*!< pin 6 input status */ +#define GPIO_ISTAT_ISTAT7 BIT(7) /*!< pin 7 input status */ +#define GPIO_ISTAT_ISTAT8 BIT(8) /*!< pin 8 input status */ +#define GPIO_ISTAT_ISTAT9 BIT(9) /*!< pin 9 input status */ +#define GPIO_ISTAT_ISTAT10 BIT(10) /*!< pin 10 input status */ +#define GPIO_ISTAT_ISTAT11 BIT(11) /*!< pin 11 input status */ +#define GPIO_ISTAT_ISTAT12 BIT(12) /*!< pin 12 input status */ +#define GPIO_ISTAT_ISTAT13 BIT(13) /*!< pin 13 input status */ +#define GPIO_ISTAT_ISTAT14 BIT(14) /*!< pin 14 input status */ +#define GPIO_ISTAT_ISTAT15 BIT(15) /*!< pin 15 input status */ + +/* GPIO_OCTL */ +#define GPIO_OCTL_OCTL0 BIT(0) /*!< pin 0 output bit */ +#define GPIO_OCTL_OCTL1 BIT(1) /*!< pin 1 output bit */ +#define GPIO_OCTL_OCTL2 BIT(2) /*!< pin 2 output bit */ +#define GPIO_OCTL_OCTL3 BIT(3) /*!< pin 3 output bit */ +#define GPIO_OCTL_OCTL4 BIT(4) /*!< pin 4 output bit */ +#define GPIO_OCTL_OCTL5 BIT(5) /*!< pin 5 output bit */ +#define GPIO_OCTL_OCTL6 BIT(6) /*!< pin 6 output bit */ +#define GPIO_OCTL_OCTL7 BIT(7) /*!< pin 7 output bit */ +#define GPIO_OCTL_OCTL8 BIT(8) /*!< pin 8 output bit */ +#define GPIO_OCTL_OCTL9 BIT(9) /*!< pin 9 output bit */ +#define GPIO_OCTL_OCTL10 BIT(10) /*!< pin 10 output bit */ +#define GPIO_OCTL_OCTL11 BIT(11) /*!< pin 11 output bit */ +#define GPIO_OCTL_OCTL12 BIT(12) /*!< pin 12 output bit */ +#define GPIO_OCTL_OCTL13 BIT(13) /*!< pin 13 output bit */ +#define GPIO_OCTL_OCTL14 BIT(14) /*!< pin 14 output bit */ +#define GPIO_OCTL_OCTL15 BIT(15) /*!< pin 15 output bit */ + +/* GPIO_BOP */ +#define GPIO_BOP_BOP0 BIT(0) /*!< pin 0 set bit */ +#define GPIO_BOP_BOP1 BIT(1) /*!< pin 1 set bit */ +#define GPIO_BOP_BOP2 BIT(2) /*!< pin 2 set bit */ +#define GPIO_BOP_BOP3 BIT(3) /*!< pin 3 set bit */ +#define GPIO_BOP_BOP4 BIT(4) /*!< pin 4 set bit */ +#define GPIO_BOP_BOP5 BIT(5) /*!< pin 5 set bit */ +#define GPIO_BOP_BOP6 BIT(6) /*!< pin 6 set bit */ +#define GPIO_BOP_BOP7 BIT(7) /*!< pin 7 set bit */ +#define GPIO_BOP_BOP8 BIT(8) /*!< pin 8 set bit */ +#define GPIO_BOP_BOP9 BIT(9) /*!< pin 9 set bit */ +#define GPIO_BOP_BOP10 BIT(10) /*!< pin 10 set bit */ +#define GPIO_BOP_BOP11 BIT(11) /*!< pin 11 set bit */ +#define GPIO_BOP_BOP12 BIT(12) /*!< pin 12 set bit */ +#define GPIO_BOP_BOP13 BIT(13) /*!< pin 13 set bit */ +#define GPIO_BOP_BOP14 BIT(14) /*!< pin 14 set bit */ +#define GPIO_BOP_BOP15 BIT(15) /*!< pin 15 set bit */ +#define GPIO_BOP_CR0 BIT(16) /*!< pin 0 clear bit */ +#define GPIO_BOP_CR1 BIT(17) /*!< pin 1 clear bit */ +#define GPIO_BOP_CR2 BIT(18) /*!< pin 2 clear bit */ +#define GPIO_BOP_CR3 BIT(19) /*!< pin 3 clear bit */ +#define GPIO_BOP_CR4 BIT(20) /*!< pin 4 clear bit */ +#define GPIO_BOP_CR5 BIT(21) /*!< pin 5 clear bit */ +#define GPIO_BOP_CR6 BIT(22) /*!< pin 6 clear bit */ +#define GPIO_BOP_CR7 BIT(23) /*!< pin 7 clear bit */ +#define GPIO_BOP_CR8 BIT(24) /*!< pin 8 clear bit */ +#define GPIO_BOP_CR9 BIT(25) /*!< pin 9 clear bit */ +#define GPIO_BOP_CR10 BIT(26) /*!< pin 10 clear bit */ +#define GPIO_BOP_CR11 BIT(27) /*!< pin 11 clear bit */ +#define GPIO_BOP_CR12 BIT(28) /*!< pin 12 clear bit */ +#define GPIO_BOP_CR13 BIT(29) /*!< pin 13 clear bit */ +#define GPIO_BOP_CR14 BIT(30) /*!< pin 14 clear bit */ +#define GPIO_BOP_CR15 BIT(31) /*!< pin 15 clear bit */ + +/* GPIO_BC */ +#define GPIO_BC_CR0 BIT(0) /*!< pin 0 clear bit */ +#define GPIO_BC_CR1 BIT(1) /*!< pin 1 clear bit */ +#define GPIO_BC_CR2 BIT(2) /*!< pin 2 clear bit */ +#define GPIO_BC_CR3 BIT(3) /*!< pin 3 clear bit */ +#define GPIO_BC_CR4 BIT(4) /*!< pin 4 clear bit */ +#define GPIO_BC_CR5 BIT(5) /*!< pin 5 clear bit */ +#define GPIO_BC_CR6 BIT(6) /*!< pin 6 clear bit */ +#define GPIO_BC_CR7 BIT(7) /*!< pin 7 clear bit */ +#define GPIO_BC_CR8 BIT(8) /*!< pin 8 clear bit */ +#define GPIO_BC_CR9 BIT(9) /*!< pin 9 clear bit */ +#define GPIO_BC_CR10 BIT(10) /*!< pin 10 clear bit */ +#define GPIO_BC_CR11 BIT(11) /*!< pin 11 clear bit */ +#define GPIO_BC_CR12 BIT(12) /*!< pin 12 clear bit */ +#define GPIO_BC_CR13 BIT(13) /*!< pin 13 clear bit */ +#define GPIO_BC_CR14 BIT(14) /*!< pin 14 clear bit */ +#define GPIO_BC_CR15 BIT(15) /*!< pin 15 clear bit */ + +/* GPIO_LOCK */ +#define GPIO_LOCK_LK0 BIT(0) /*!< pin 0 lock bit */ +#define GPIO_LOCK_LK1 BIT(1) /*!< pin 1 lock bit */ +#define GPIO_LOCK_LK2 BIT(2) /*!< pin 2 lock bit */ +#define GPIO_LOCK_LK3 BIT(3) /*!< pin 3 lock bit */ +#define GPIO_LOCK_LK4 BIT(4) /*!< pin 4 lock bit */ +#define GPIO_LOCK_LK5 BIT(5) /*!< pin 5 lock bit */ +#define GPIO_LOCK_LK6 BIT(6) /*!< pin 6 lock bit */ +#define GPIO_LOCK_LK7 BIT(7) /*!< pin 7 lock bit */ +#define GPIO_LOCK_LK8 BIT(8) /*!< pin 8 lock bit */ +#define GPIO_LOCK_LK9 BIT(9) /*!< pin 9 lock bit */ +#define GPIO_LOCK_LK10 BIT(10) /*!< pin 10 lock bit */ +#define GPIO_LOCK_LK11 BIT(11) /*!< pin 11 lock bit */ +#define GPIO_LOCK_LK12 BIT(12) /*!< pin 12 lock bit */ +#define GPIO_LOCK_LK13 BIT(13) /*!< pin 13 lock bit */ +#define GPIO_LOCK_LK14 BIT(14) /*!< pin 14 lock bit */ +#define GPIO_LOCK_LK15 BIT(15) /*!< pin 15 lock bit */ +#define GPIO_LOCK_LKK BIT(16) /*!< pin sequence lock key */ + +/* GPIO_SPD */ +#define GPIO_SPD_SPD0 BIT(0) /*!< pin 0 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD1 BIT(1) /*!< pin 1 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD2 BIT(2) /*!< pin 2 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD3 BIT(3) /*!< pin 3 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD4 BIT(4) /*!< pin 4 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD5 BIT(5) /*!< pin 5 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD6 BIT(6) /*!< pin 6 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD7 BIT(7) /*!< pin 7 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD8 BIT(8) /*!< pin 8 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD9 BIT(9) /*!< pin 9 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD10 BIT(10) /*!< pin 10 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD11 BIT(11) /*!< pin 11 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD12 BIT(12) /*!< pin 12 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD13 BIT(13) /*!< pin 13 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD14 BIT(14) /*!< pin 14 set very high output speed when MDx is 0b11 */ +#define GPIO_SPD_SPD15 BIT(15) /*!< pin 15 set very high output speed when MDx is 0b11 */ + +/* AFIO_EC */ +#define AFIO_EC_PIN BITS(0,3) /*!< event output pin selection */ +#define AFIO_EC_PORT BITS(4,6) /*!< event output port selection */ +#define AFIO_EC_EOE BIT(7) /*!< event output enable */ + +/* AFIO_PCF0 */ +#ifdef GD32F30X_CL +/* memory map and bit definitions for GD32F30X_CL devices */ +#define AFIO_PCF0_SPI0_REMAP BIT(0) /*!< SPI0 remapping */ +#define AFIO_PCF0_I2C0_REMAP BIT(1) /*!< I2C0 remapping */ +#define AFIO_PCF0_USART0_REMAP BIT(2) /*!< USART0 remapping */ +#define AFIO_PCF0_USART1_REMAP BIT(3) /*!< USART1 remapping */ +#define AFIO_PCF0_USART2_REMAP BITS(4,5) /*!< USART2 remapping */ +#define AFIO_PCF0_TIMER0_REMAP BITS(6,7) /*!< TIMER0 remapping */ +#define AFIO_PCF0_TIMER1_REMAP BITS(8,9) /*!< TIMER1 remapping */ +#define AFIO_PCF0_TIMER2_REMAP BITS(10,11) /*!< TIMER2 remapping */ +#define AFIO_PCF0_TIMER3_REMAP BIT(12) /*!< TIMER3 remapping */ +#define AFIO_PCF0_CAN0_REMAP BITS(13,14) /*!< CAN0 remapping */ +#define AFIO_PCF0_PD01_REMAP BIT(15) /*!< port D0/port D1 mapping on OSC_IN/OSC_OUT */ +#define AFIO_PCF0_TIMER4CH3_IREMAP BIT(16) /*!< TIMER4 channel3 internal remapping */ +#define AFIO_PCF0_ENET_REMAP BIT(21) /*!< ethernet MAC I/O remapping */ +#define AFIO_PCF0_CAN1_REMAP BIT(22) /*!< CAN1 remapping */ +#define AFIO_PCF0_ENET_PHY_SEL BIT(23) /*!< ethernet MII or RMII PHY selection */ +#define AFIO_PCF0_SWJ_CFG BITS(24,26) /*!< serial wire JTAG configuration */ +#define AFIO_PCF0_SPI2_REMAP BIT(28) /*!< SPI2/I2S2 remapping */ +#define AFIO_PCF0_TIMER1ITR0_REMAP BIT(29) /*!< TIMER1 internal trigger 0 remapping */ +#define AFIO_PCF0_PTP_PPS_REMAP BIT(30) /*!< ethernet PTP PPS remapping */ + +#else +/* memory map and bit definitions for GD32F30X_HD devices and GD32F30X_XD devices */ +#define AFIO_PCF0_SPI0_REMAP BIT(0) /*!< SPI0 remapping */ +#define AFIO_PCF0_I2C0_REMAP BIT(1) /*!< I2C0 remapping */ +#define AFIO_PCF0_USART0_REMAP BIT(2) /*!< USART0 remapping */ +#define AFIO_PCF0_USART1_REMAP BIT(3) /*!< USART1 remapping */ +#define AFIO_PCF0_USART2_REMAP BITS(4,5) /*!< USART2 remapping */ +#define AFIO_PCF0_TIMER0_REMAP BITS(6,7) /*!< TIMER0 remapping */ +#define AFIO_PCF0_TIMER1_REMAP BITS(8,9) /*!< TIMER1 remapping */ +#define AFIO_PCF0_TIMER2_REMAP BITS(10,11) /*!< TIMER2 remapping */ +#define AFIO_PCF0_TIMER3_REMAP BIT(12) /*!< TIMER3 remapping */ +#define AFIO_PCF0_CAN_REMAP BITS(13,14) /*!< CAN remapping */ +#define AFIO_PCF0_PD01_REMAP BIT(15) /*!< port D0/port D1 mapping on OSC_IN/OSC_OUT */ +#define AFIO_PCF0_TIMER4CH3_IREMAP BIT(16) /*!< TIMER4 channel3 internal remapping */ +#define AFIO_PCF0_ADC0_ETRGINS_REMAP BIT(17) /*!< ADC 0 external trigger inserted conversion remapping */ +#define AFIO_PCF0_ADC0_ETRGREG_REMAP BIT(18) /*!< ADC 0 external trigger regular conversion remapping */ +#define AFIO_PCF0_ADC1_ETRGINS_REMAP BIT(19) /*!< ADC 1 external trigger inserted conversion remapping */ +#define AFIO_PCF0_ADC1_ETRGREG_REMAP BIT(20) /*!< ADC 1 external trigger regular conversion remapping */ +#define AFIO_PCF0_SWJ_CFG BITS(24,26) /*!< serial wire JTAG configuration */ +#define AFIO_PCF0_SPI2_REMAP BIT(28) /*!< SPI2/I2S2 remapping */ +#endif /* GD32F30X_CL */ + +/* AFIO_EXTISS0 */ +#define AFIO_EXTI0_SS BITS(0,3) /*!< EXTI 0 sources selection */ +#define AFIO_EXTI1_SS BITS(4,7) /*!< EXTI 1 sources selection */ +#define AFIO_EXTI2_SS BITS(8,11) /*!< EXTI 2 sources selection */ +#define AFIO_EXTI3_SS BITS(12,15) /*!< EXTI 3 sources selection */ + +/* AFIO_EXTISS1 */ +#define AFIO_EXTI4_SS BITS(0,3) /*!< EXTI 4 sources selection */ +#define AFIO_EXTI5_SS BITS(4,7) /*!< EXTI 5 sources selection */ +#define AFIO_EXTI6_SS BITS(8,11) /*!< EXTI 6 sources selection */ +#define AFIO_EXTI7_SS BITS(12,15) /*!< EXTI 7 sources selection */ + +/* AFIO_EXTISS2 */ +#define AFIO_EXTI8_SS BITS(0,3) /*!< EXTI 8 sources selection */ +#define AFIO_EXTI9_SS BITS(4,7) /*!< EXTI 9 sources selection */ +#define AFIO_EXTI10_SS BITS(8,11) /*!< EXTI 10 sources selection */ +#define AFIO_EXTI11_SS BITS(12,15) /*!< EXTI 11 sources selection */ + +/* AFIO_EXTISS3 */ +#define AFIO_EXTI12_SS BITS(0,3) /*!< EXTI 12 sources selection */ +#define AFIO_EXTI13_SS BITS(4,7) /*!< EXTI 13 sources selection */ +#define AFIO_EXTI14_SS BITS(8,11) /*!< EXTI 14 sources selection */ +#define AFIO_EXTI15_SS BITS(12,15) /*!< EXTI 15 sources selection */ + +/* AFIO_PCF1 */ +#define AFIO_PCF1_TIMER8_REMAP BIT(5) /*!< TIMER8 remapping */ +#define AFIO_PCF1_TIMER9_REMAP BIT(6) /*!< TIMER9 remapping */ +#define AFIO_PCF1_TIMER10_REMAP BIT(7) /*!< TIMER10 remapping */ +#define AFIO_PCF1_TIMER12_REMAP BIT(8) /*!< TIMER12 remapping */ +#define AFIO_PCF1_TIMER13_REMAP BIT(9) /*!< TIMER13 remapping */ +#define AFIO_PCF1_EXMC_NADV BIT(10) /*!< EXMC_NADV connect/disconnect */ +#define AFIO_PCF1_CTC_REMAP BITS(11,12) /*!< CTC remapping */ + +/* AFIO_CPSCTL */ +#define AFIO_CPSCTL_CPS_EN BIT(0) /*!< I/O compensation cell enable */ +#define AFIO_CPSCTL_CPS_RDY BIT(8) /*!< I/O compensation cell is ready or not */ + +/* constants definitions */ +typedef FlagStatus bit_status; + +/* GPIO mode values set */ +#define GPIO_MODE_SET(n, mode) ((uint32_t)((uint32_t)(mode) << (4U * (n)))) +#define GPIO_MODE_MASK(n) (0xFU << (4U * (n))) + +/* GPIO mode definitions */ +#define GPIO_MODE_AIN ((uint8_t)0x00U) /*!< analog input mode */ +#define GPIO_MODE_IN_FLOATING ((uint8_t)0x04U) /*!< floating input mode */ +#define GPIO_MODE_IPD ((uint8_t)0x28U) /*!< pull-down input mode */ +#define GPIO_MODE_IPU ((uint8_t)0x48U) /*!< pull-up input mode */ +#define GPIO_MODE_OUT_OD ((uint8_t)0x14U) /*!< GPIO output with open-drain */ +#define GPIO_MODE_OUT_PP ((uint8_t)0x10U) /*!< GPIO output with push-pull */ +#define GPIO_MODE_AF_OD ((uint8_t)0x1CU) /*!< AFIO output with open-drain */ +#define GPIO_MODE_AF_PP ((uint8_t)0x18U) /*!< AFIO output with push-pull */ + +/* GPIO output max speed value */ +#define GPIO_OSPEED_10MHZ ((uint8_t)0x01U) /*!< output max speed 10MHz */ +#define GPIO_OSPEED_2MHZ ((uint8_t)0x02U) /*!< output max speed 2MHz */ +#define GPIO_OSPEED_50MHZ ((uint8_t)0x03U) /*!< output max speed 50MHz */ +#define GPIO_OSPEED_MAX ((uint8_t)0x04U) /*!< GPIO very high output speed, max speed more than 50MHz */ + +/* GPIO event output port definitions */ +#define GPIO_EVENT_PORT_GPIOA ((uint8_t)0x00U) /*!< event output port A */ +#define GPIO_EVENT_PORT_GPIOB ((uint8_t)0x01U) /*!< event output port B */ +#define GPIO_EVENT_PORT_GPIOC ((uint8_t)0x02U) /*!< event output port C */ +#define GPIO_EVENT_PORT_GPIOD ((uint8_t)0x03U) /*!< event output port D */ +#define GPIO_EVENT_PORT_GPIOE ((uint8_t)0x04U) /*!< event output port E */ + +/* GPIO output port source definitions */ +#define GPIO_PORT_SOURCE_GPIOA ((uint8_t)0x00U) /*!< output port source A */ +#define GPIO_PORT_SOURCE_GPIOB ((uint8_t)0x01U) /*!< output port source B */ +#define GPIO_PORT_SOURCE_GPIOC ((uint8_t)0x02U) /*!< output port source C */ +#define GPIO_PORT_SOURCE_GPIOD ((uint8_t)0x03U) /*!< output port source D */ +#define GPIO_PORT_SOURCE_GPIOE ((uint8_t)0x04U) /*!< output port source E */ +#define GPIO_PORT_SOURCE_GPIOF ((uint8_t)0x05U) /*!< output port source F */ +#define GPIO_PORT_SOURCE_GPIOG ((uint8_t)0x06U) /*!< output port source G */ + +/* GPIO event output pin definitions */ +#define GPIO_EVENT_PIN_0 ((uint8_t)0x00U) /*!< GPIO event pin 0 */ +#define GPIO_EVENT_PIN_1 ((uint8_t)0x01U) /*!< GPIO event pin 1 */ +#define GPIO_EVENT_PIN_2 ((uint8_t)0x02U) /*!< GPIO event pin 2 */ +#define GPIO_EVENT_PIN_3 ((uint8_t)0x03U) /*!< GPIO event pin 3 */ +#define GPIO_EVENT_PIN_4 ((uint8_t)0x04U) /*!< GPIO event pin 4 */ +#define GPIO_EVENT_PIN_5 ((uint8_t)0x05U) /*!< GPIO event pin 5 */ +#define GPIO_EVENT_PIN_6 ((uint8_t)0x06U) /*!< GPIO event pin 6 */ +#define GPIO_EVENT_PIN_7 ((uint8_t)0x07U) /*!< GPIO event pin 7 */ +#define GPIO_EVENT_PIN_8 ((uint8_t)0x08U) /*!< GPIO event pin 8 */ +#define GPIO_EVENT_PIN_9 ((uint8_t)0x09U) /*!< GPIO event pin 9 */ +#define GPIO_EVENT_PIN_10 ((uint8_t)0x0AU) /*!< GPIO event pin 10 */ +#define GPIO_EVENT_PIN_11 ((uint8_t)0x0BU) /*!< GPIO event pin 11 */ +#define GPIO_EVENT_PIN_12 ((uint8_t)0x0CU) /*!< GPIO event pin 12 */ +#define GPIO_EVENT_PIN_13 ((uint8_t)0x0DU) /*!< GPIO event pin 13 */ +#define GPIO_EVENT_PIN_14 ((uint8_t)0x0EU) /*!< GPIO event pin 14 */ +#define GPIO_EVENT_PIN_15 ((uint8_t)0x0FU) /*!< GPIO event pin 15 */ + +/* GPIO output pin source definitions */ +#define GPIO_PIN_SOURCE_0 ((uint8_t)0x00U) /*!< GPIO pin source 0 */ +#define GPIO_PIN_SOURCE_1 ((uint8_t)0x01U) /*!< GPIO pin source 1 */ +#define GPIO_PIN_SOURCE_2 ((uint8_t)0x02U) /*!< GPIO pin source 2 */ +#define GPIO_PIN_SOURCE_3 ((uint8_t)0x03U) /*!< GPIO pin source 3 */ +#define GPIO_PIN_SOURCE_4 ((uint8_t)0x04U) /*!< GPIO pin source 4 */ +#define GPIO_PIN_SOURCE_5 ((uint8_t)0x05U) /*!< GPIO pin source 5 */ +#define GPIO_PIN_SOURCE_6 ((uint8_t)0x06U) /*!< GPIO pin source 6 */ +#define GPIO_PIN_SOURCE_7 ((uint8_t)0x07U) /*!< GPIO pin source 7 */ +#define GPIO_PIN_SOURCE_8 ((uint8_t)0x08U) /*!< GPIO pin source 8 */ +#define GPIO_PIN_SOURCE_9 ((uint8_t)0x09U) /*!< GPIO pin source 9 */ +#define GPIO_PIN_SOURCE_10 ((uint8_t)0x0AU) /*!< GPIO pin source 10 */ +#define GPIO_PIN_SOURCE_11 ((uint8_t)0x0BU) /*!< GPIO pin source 11 */ +#define GPIO_PIN_SOURCE_12 ((uint8_t)0x0CU) /*!< GPIO pin source 12 */ +#define GPIO_PIN_SOURCE_13 ((uint8_t)0x0DU) /*!< GPIO pin source 13 */ +#define GPIO_PIN_SOURCE_14 ((uint8_t)0x0EU) /*!< GPIO pin source 14 */ +#define GPIO_PIN_SOURCE_15 ((uint8_t)0x0FU) /*!< GPIO pin source 15 */ + +/* GPIO pin definitions */ +#define GPIO_PIN_0 BIT(0) /*!< GPIO pin 0 */ +#define GPIO_PIN_1 BIT(1) /*!< GPIO pin 1 */ +#define GPIO_PIN_2 BIT(2) /*!< GPIO pin 2 */ +#define GPIO_PIN_3 BIT(3) /*!< GPIO pin 3 */ +#define GPIO_PIN_4 BIT(4) /*!< GPIO pin 4 */ +#define GPIO_PIN_5 BIT(5) /*!< GPIO pin 5 */ +#define GPIO_PIN_6 BIT(6) /*!< GPIO pin 6 */ +#define GPIO_PIN_7 BIT(7) /*!< GPIO pin 7 */ +#define GPIO_PIN_8 BIT(8) /*!< GPIO pin 8 */ +#define GPIO_PIN_9 BIT(9) /*!< GPIO pin 9 */ +#define GPIO_PIN_10 BIT(10) /*!< GPIO pin 10 */ +#define GPIO_PIN_11 BIT(11) /*!< GPIO pin 11 */ +#define GPIO_PIN_12 BIT(12) /*!< GPIO pin 12 */ +#define GPIO_PIN_13 BIT(13) /*!< GPIO pin 13 */ +#define GPIO_PIN_14 BIT(14) /*!< GPIO pin 14 */ +#define GPIO_PIN_15 BIT(15) /*!< GPIO pin 15 */ +#define GPIO_PIN_ALL BITS(0,15) /*!< GPIO pin all */ + +/* AFIO remap mask */ +#define PCF0_USART2_REMAP(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) /*!< USART2 remapping */ +#define PCF0_TIMER0_REMAP(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) /*!< TIMER0 remapping */ +#define PCF0_TIMER1_REMAP(regval) (BITS(8,9) & ((uint32_t)(regval) << 8)) /*!< TIMER1 remapping */ +#define PCF0_TIMER2_REMAP(regval) (BITS(10,11) & ((uint32_t)(regval) << 10)) /*!< TIMER2 remapping */ +#define PCF0_CAN_REMAP(regval) (BITS(13,14) & ((uint32_t)(regval) << 13)) /*!< CAN remapping */ +#define PCF0_SWJ_CFG(regval) (BITS(24,26) & ((uint32_t)(regval) << 24)) /*!< serial wire JTAG configuration */ +#define PCF1_CTC_REMAP(regval) (BITS(11,12) & ((uint32_t)(regval) << 11)) /*!< CTC remapping */ + +/* GPIO remap definitions */ +#define GPIO_SPI0_REMAP AFIO_PCF0_SPI0_REMAP /*!< SPI0 remapping */ +#define GPIO_I2C0_REMAP AFIO_PCF0_I2C0_REMAP /*!< I2C0 remapping */ +#define GPIO_USART0_REMAP AFIO_PCF0_USART0_REMAP /*!< USART0 remapping */ +#define GPIO_USART1_REMAP AFIO_PCF0_USART1_REMAP /*!< USART1 remapping */ +#define GPIO_USART2_PARTIAL_REMAP ((uint32_t)0x00140000U | PCF0_USART2_REMAP(1)) /*!< USART2 partial remapping */ +#define GPIO_USART2_FULL_REMAP ((uint32_t)0x00140000U | PCF0_USART2_REMAP(3)) /*!< USART2 full remapping */ +#define GPIO_TIMER0_PARTIAL_REMAP ((uint32_t)0x00160000U | PCF0_TIMER0_REMAP(1)) /*!< TIMER0 partial remapping */ +#define GPIO_TIMER0_FULL_REMAP ((uint32_t)0x00160000U | PCF0_TIMER0_REMAP(3)) /*!< TIMER0 full remapping */ +#define GPIO_TIMER1_PARTIAL_REMAP0 ((uint32_t)0x00180000U | PCF0_TIMER1_REMAP(1)) /*!< TIMER1 partial remapping */ +#define GPIO_TIMER1_PARTIAL_REMAP1 ((uint32_t)0x00180000U | PCF0_TIMER1_REMAP(2)) /*!< TIMER1 partial remapping */ +#define GPIO_TIMER1_FULL_REMAP ((uint32_t)0x00180000U | PCF0_TIMER1_REMAP(3)) /*!< TIMER1 full remapping */ +#define GPIO_TIMER2_PARTIAL_REMAP ((uint32_t)0x001A0000U | PCF0_TIMER2_REMAP(2)) /*!< TIMER2 partial remapping */ +#define GPIO_TIMER2_FULL_REMAP ((uint32_t)0x001A0000U | PCF0_TIMER2_REMAP(3)) /*!< TIMER2 full remapping */ +#define GPIO_TIMER3_REMAP AFIO_PCF0_TIMER3_REMAP /*!< TIMER3 remapping */ +#define GPIO_PD01_REMAP AFIO_PCF0_PD01_REMAP /*!< PD01 remapping */ +#define GPIO_TIMER4CH3_IREMAP ((uint32_t)0x00200000U | (AFIO_PCF0_TIMER4CH3_IREMAP >> 16)) /*!< TIMER4 channel3 internal remapping */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define GPIO_CAN_PARTIAL_REMAP ((uint32_t)0x001D0000U | PCF0_CAN_REMAP(2)) /*!< CAN partial remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) */ +#define GPIO_CAN_FULL_REMAP ((uint32_t)0x001D0000U | PCF0_CAN_REMAP(3)) /*!< CAN full remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) */ +#endif /* GD32F30X_HD||GD32F30X_XD */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define GPIO_ADC0_ETRGINS_REMAP ((uint32_t)0x00200000U | (AFIO_PCF0_ADC0_ETRGINS_REMAP >> 16)) /*!< ADC0 external trigger inserted conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) */ +#define GPIO_ADC0_ETRGREG_REMAP ((uint32_t)0x00200000U | (AFIO_PCF0_ADC0_ETRGREG_REMAP >> 16)) /*!< ADC0 external trigger regular conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) */ +#define GPIO_ADC1_ETRGINS_REMAP ((uint32_t)0x00200000U | (AFIO_PCF0_ADC1_ETRGINS_REMAP >> 16)) /*!< ADC1 external trigger inserted conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) */ +#define GPIO_ADC1_ETRGREG_REMAP ((uint32_t)0x00200000U | (AFIO_PCF0_ADC1_ETRGREG_REMAP >> 16)) /*!< ADC1 external trigger regular conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) */ +#endif /* GD32F30X_HD||GD32F30X_XD */ +#define GPIO_SWJ_NONJTRST_REMAP ((uint32_t)0x00300000U | (PCF0_SWJ_CFG(1) >> 16)) /*!< full SWJ(JTAG-DP + SW-DP),but without NJTRST */ +#define GPIO_SWJ_SWDPENABLE_REMAP ((uint32_t)0x00300000U | (PCF0_SWJ_CFG(2) >> 16)) /*!< JTAG-DP disabled and SW-DP enabled */ +#define GPIO_SWJ_DISABLE_REMAP ((uint32_t)0x00300000U | (PCF0_SWJ_CFG(4) >> 16)) /*!< JTAG-DP disabled and SW-DP disabled */ +#define GPIO_SPI2_REMAP ((uint32_t)0x00200000U | (AFIO_PCF0_SPI2_REMAP >> 16)) /*!< SPI2 remapping*/ +#ifdef GD32F30X_CL +#define GPIO_CAN0_PARTIAL_REMAP ((uint32_t)0x001D0000U | PCF0_CAN_REMAP(2)) /*!< CAN0 partial remapping(only for GD32F30X_CL devices) */ +#define GPIO_CAN0_FULL_REMAP ((uint32_t)0x001D0000U | PCF0_CAN_REMAP(3)) /*!< CAN0 full remapping(only for GD32F30X_CL devices) */ +#define GPIO_ENET_REMAP ((uint32_t)0x00200000U | (AFIO_PCF0_ENET_REMAP >> 16)) /*!< ENET remapping(only for GD32F30X_CL devices) */ +#define GPIO_CAN1_REMAP ((uint32_t)0x00200000U | (AFIO_PCF0_CAN1_REMAP >> 16)) /*!< CAN1 remapping(only for GD32F30X_CL devices) */ +#define GPIO_TIMER1ITR0_REMAP ((uint32_t)0x00200000U | (AFIO_PCF0_TIMER1ITR0_REMAP >> 16)) /*!< TIMER1 internal trigger 0 remapping(only for GD32F30X_CL devices) */ +#define GPIO_PTP_PPS_REMAP ((uint32_t)0x00200000U | (AFIO_PCF0_PTP_PPS_REMAP >> 16)) /*!< ethernet PTP PPS remapping(only for GD32F30X_CL devices) */ +#endif /* GD32F30X_CL */ +#define GPIO_TIMER8_REMAP ((uint32_t)0x80000000U | AFIO_PCF1_TIMER8_REMAP) /*!< TIMER8 remapping */ +#define GPIO_TIMER9_REMAP ((uint32_t)0x80000000U | AFIO_PCF1_TIMER9_REMAP) /*!< TIMER9 remapping */ +#define GPIO_TIMER10_REMAP ((uint32_t)0x80000000U | AFIO_PCF1_TIMER10_REMAP) /*!< TIMER10 remapping */ +#define GPIO_TIMER12_REMAP ((uint32_t)0x80000000U | AFIO_PCF1_TIMER12_REMAP) /*!< TIMER12 remapping */ +#define GPIO_TIMER13_REMAP ((uint32_t)0x80000000U | AFIO_PCF1_TIMER13_REMAP) /*!< TIMER13 remapping */ +#define GPIO_EXMC_NADV_REMAP ((uint32_t)0x80000000U | AFIO_PCF1_EXMC_NADV) /*!< EXMC_NADV connect/disconnect */ +#define GPIO_CTC_REMAP0 ((uint32_t)0x801B0000U | PCF1_CTC_REMAP(1)) /*!< CTC remapping(PD15) */ +#define GPIO_CTC_REMAP1 ((uint32_t)0x801B0000U | PCF1_CTC_REMAP(2)) /*!< CTC remapping(PF0) */ + +#ifdef GD32F30X_CL +/* ethernet MII or RMII PHY selection */ +#define GPIO_ENET_PHY_MII ((uint32_t)0x00000000U) /*!< configure ethernet MAC for connection with an MII PHY */ +#define GPIO_ENET_PHY_RMII AFIO_PCF0_ENET_PHY_SEL /*!< configure ethernet MAC for connection with an RMII PHY */ +#endif /* GD32F30X_CL */ + +/* I/O compensation cell enable/disable */ +#define GPIO_COMPENSATION_ENABLE AFIO_CPSCTL_CPS_EN /*!< I/O compensation cell is enable */ +#define GPIO_COMPENSATION_DISABLE ((uint32_t)0x00000000U) /*!< I/O compensation cell is disable */ + +/* function declarations */ +/* reset GPIO port */ +void gpio_deinit(uint32_t gpio_periph); +/* reset alternate function I/O(AFIO) */ +void gpio_afio_deinit(void); +/* GPIO parameter initialization */ +void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, uint32_t pin); + +/* set GPIO pin bit */ +void gpio_bit_set(uint32_t gpio_periph, uint32_t pin); +/* reset GPIO pin bit */ +void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin); +/* write data to the specified GPIO pin */ +void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value); +/* write data to the specified GPIO port */ +void gpio_port_write(uint32_t gpio_periph, uint16_t data); + +/* get GPIO pin input status */ +FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin); +/* get GPIO port input status */ +uint16_t gpio_input_port_get(uint32_t gpio_periph); +/* get GPIO pin output status */ +FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin); +/* get GPIO port output status */ +uint16_t gpio_output_port_get(uint32_t gpio_periph); +/* configure GPIO pin remap */ +void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue); + +#ifdef GD32F30X_CL +/* select ethernet MII or RMII PHY */ +void gpio_ethernet_phy_select(uint32_t enet_sel); +#endif /* GD32F30X_CL */ + +/* select GPIO pin exti sources */ +void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin); + +/* configure GPIO pin event output */ +void gpio_event_output_config(uint8_t output_port, uint8_t output_pin); +/* enable GPIO pin event output */ +void gpio_event_output_enable(void); +/* disable GPIO pin event output */ +void gpio_event_output_disable(void); + +/* lock GPIO pin bit */ +void gpio_pin_lock(uint32_t gpio_periph, uint32_t pin); +/* configure the I/O compensation cell */ +void gpio_compensation_config(uint32_t compensation); +/* check the I/O compensation cell is ready or not */ +FlagStatus gpio_compensation_flag_get(void); + +#endif /* GD32F30X_GPIO_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_i2c.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_i2c.h new file mode 100644 index 0000000..95d0fc6 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_i2c.h @@ -0,0 +1,355 @@ +/*! + \file gd32f30x_i2c.h + \brief definitions for the I2C + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2019-04-16, V2.0.1, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_I2C_H +#define GD32F30X_I2C_H + +#include "gd32f30x.h" + +/* I2Cx(x=0,1) definitions */ +#define I2C0 I2C_BASE /*!< I2C0 base address */ +#define I2C1 (I2C_BASE + 0x00000400U) /*!< I2C1 base address */ + +/* registers definitions */ +#define I2C_CTL0(i2cx) REG32((i2cx) + 0x00U) /*!< I2C control register 0 */ +#define I2C_CTL1(i2cx) REG32((i2cx) + 0x04U) /*!< I2C control register 1 */ +#define I2C_SADDR0(i2cx) REG32((i2cx) + 0x08U) /*!< I2C slave address register 0*/ +#define I2C_SADDR1(i2cx) REG32((i2cx) + 0x0CU) /*!< I2C slave address register */ +#define I2C_DATA(i2cx) REG32((i2cx) + 0x10U) /*!< I2C transfer buffer register */ +#define I2C_STAT0(i2cx) REG32((i2cx) + 0x14U) /*!< I2C transfer status register 0 */ +#define I2C_STAT1(i2cx) REG32((i2cx) + 0x18U) /*!< I2C transfer status register */ +#define I2C_CKCFG(i2cx) REG32((i2cx) + 0x1CU) /*!< I2C clock configure register */ +#define I2C_RT(i2cx) REG32((i2cx) + 0x20U) /*!< I2C rise time register */ +#define I2C_FMPCFG(i2cx) REG32((i2cx) + 0x90U) /*!< I2C fast-mode-plus configure register */ + +/* bits definitions */ +/* I2Cx_CTL0 */ +#define I2C_CTL0_I2CEN BIT(0) /*!< peripheral enable */ +#define I2C_CTL0_SMBEN BIT(1) /*!< SMBus mode */ +#define I2C_CTL0_SMBSEL BIT(3) /*!< SMBus type */ +#define I2C_CTL0_ARPEN BIT(4) /*!< ARP enable */ +#define I2C_CTL0_PECEN BIT(5) /*!< PEC enable */ +#define I2C_CTL0_GCEN BIT(6) /*!< general call enable */ +#define I2C_CTL0_SS BIT(7) /*!< clock stretching disable (slave mode) */ +#define I2C_CTL0_START BIT(8) /*!< start generation */ +#define I2C_CTL0_STOP BIT(9) /*!< stop generation */ +#define I2C_CTL0_ACKEN BIT(10) /*!< acknowledge enable */ +#define I2C_CTL0_POAP BIT(11) /*!< acknowledge/PEC position (for data reception) */ +#define I2C_CTL0_PECTRANS BIT(12) /*!< packet error checking */ +#define I2C_CTL0_SALT BIT(13) /*!< SMBus alert */ +#define I2C_CTL0_SRESET BIT(15) /*!< software reset */ + +/* I2Cx_CTL1 */ +#define I2C_CTL1_I2CCLK BITS(0,6) /*!< I2CCLK[6:0] bits (peripheral clock frequency) */ +#define I2C_CTL1_ERRIE BIT(8) /*!< error interrupt inable */ +#define I2C_CTL1_EVIE BIT(9) /*!< event interrupt enable */ +#define I2C_CTL1_BUFIE BIT(10) /*!< buffer interrupt enable */ +#define I2C_CTL1_DMAON BIT(11) /*!< DMA requests enable */ +#define I2C_CTL1_DMALST BIT(12) /*!< DMA last transfer */ + +/* I2Cx_SADDR0 */ +#define I2C_SADDR0_ADDRESS0 BIT(0) /*!< bit 0 of a 10-bit address */ +#define I2C_SADDR0_ADDRESS BITS(1,7) /*!< 7-bit address or bits 7:1 of a 10-bit address */ +#define I2C_SADDR0_ADDRESS_H BITS(8,9) /*!< highest two bits of a 10-bit address */ +#define I2C_SADDR0_ADDFORMAT BIT(15) /*!< address mode for the I2C slave */ + +/* I2Cx_SADDR1 */ +#define I2C_SADDR1_DUADEN BIT(0) /*!< aual-address mode switch */ +#define I2C_SADDR1_ADDRESS2 BITS(1,7) /*!< second I2C address for the slave in dual-address mode */ + +/* I2Cx_DATA */ +#define I2C_DATA_TRB BITS(0,7) /*!< 8-bit data register */ + +/* I2Cx_STAT0 */ +#define I2C_STAT0_SBSEND BIT(0) /*!< start bit (master mode) */ +#define I2C_STAT0_ADDSEND BIT(1) /*!< address sent (master mode)/matched (slave mode) */ +#define I2C_STAT0_BTC BIT(2) /*!< byte transfer finished */ +#define I2C_STAT0_ADD10SEND BIT(3) /*!< 10-bit header sent (master mode) */ +#define I2C_STAT0_STPDET BIT(4) /*!< stop detection (slave mode) */ +#define I2C_STAT0_RBNE BIT(6) /*!< data register not empty (receivers) */ +#define I2C_STAT0_TBE BIT(7) /*!< data register empty (transmitters) */ +#define I2C_STAT0_BERR BIT(8) /*!< bus error */ +#define I2C_STAT0_LOSTARB BIT(9) /*!< arbitration lost (master mode) */ +#define I2C_STAT0_AERR BIT(10) /*!< acknowledge failure */ +#define I2C_STAT0_OUERR BIT(11) /*!< overrun/underrun */ +#define I2C_STAT0_PECERR BIT(12) /*!< PEC error in reception */ +#define I2C_STAT0_SMBTO BIT(14) /*!< timeout signal in SMBus mode */ +#define I2C_STAT0_SMBALT BIT(15) /*!< SMBus alert status */ + +/* I2Cx_STAT1 */ +#define I2C_STAT1_MASTER BIT(0) /*!< master/slave */ +#define I2C_STAT1_I2CBSY BIT(1) /*!< bus busy */ +#define I2C_STAT1_TR BIT(2) /*!< transmitter/receiver */ +#define I2C_STAT1_RXGC BIT(4) /*!< general call address (slave mode) */ +#define I2C_STAT1_DEFSMB BIT(5) /*!< SMBus device default address (slave mode) */ +#define I2C_STAT1_HSTSMB BIT(6) /*!< SMBus host header (slave mode) */ +#define I2C_STAT1_DUMODF BIT(7) /*!< dual flag (slave mode) */ +#define I2C_STAT1_PECV BITS(8,15) /*!< packet error checking value */ + +/* I2Cx_CKCFG */ +#define I2C_CKCFG_CLKC BITS(0,11) /*!< clock control register in fast/standard mode or fast mode plus(master mode) */ +#define I2C_CKCFG_DTCY BIT(14) /*!< duty cycle of fast mode or fast mode plus */ +#define I2C_CKCFG_FAST BIT(15) /*!< I2C speed selection in master mode */ + +/* I2Cx_RT */ +#define I2C_RT_RISETIME BITS(0,6) /*!< maximum rise time in fast/standard mode or fast mode plus(master mode) */ + +/* I2Cx_FMPCFG */ +#define I2C_FMPCFG_FMPEN BIT(0) /*!< fast mode plus enable bit */ + +/* constants definitions */ +/* define the I2C bit position and its register index offset */ +#define I2C_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define I2C_REG_VAL(i2cx, offset) (REG32((i2cx) + (((uint32_t)(offset) & 0xFFFFU) >> 6))) +#define I2C_BIT_POS(val) ((uint32_t)(val) & 0x1FU) +#define I2C_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2) (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\ + | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))) +#define I2C_REG_VAL2(i2cx, offset) (REG32((i2cx) + ((uint32_t)(offset) >> 22))) +#define I2C_BIT_POS2(val) (((uint32_t)(val) & 0x1F0000U) >> 16) + +/* register offset */ +#define I2C_CTL1_REG_OFFSET 0x04U /*!< CTL1 register offset */ +#define I2C_STAT0_REG_OFFSET 0x14U /*!< STAT0 register offset */ +#define I2C_STAT1_REG_OFFSET 0x18U /*!< STAT1 register offset */ + +/* I2C flags */ +typedef enum +{ + /* flags in STAT0 register */ + I2C_FLAG_SBSEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 0U), /*!< start condition sent out in master mode */ + I2C_FLAG_ADDSEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 1U), /*!< address is sent in master mode or received and matches in slave mode */ + I2C_FLAG_BTC = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 2U), /*!< byte transmission finishes */ + I2C_FLAG_ADD10SEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 3U), /*!< header of 10-bit address is sent in master mode */ + I2C_FLAG_STPDET = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 4U), /*!< stop condition detected in slave mode */ + I2C_FLAG_RBNE = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 6U), /*!< I2C_DATA is not Empty during receiving */ + I2C_FLAG_TBE = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 7U), /*!< I2C_DATA is empty during transmitting */ + I2C_FLAG_BERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 8U), /*!< a bus error occurs indication a unexpected start or stop condition on I2C bus */ + I2C_FLAG_LOSTARB = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 9U), /*!< arbitration lost in master mode */ + I2C_FLAG_AERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 10U), /*!< acknowledge error */ + I2C_FLAG_OUERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 11U), /*!< over-run or under-run situation occurs in slave mode */ + I2C_FLAG_PECERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 12U), /*!< PEC error when receiving data */ + I2C_FLAG_SMBTO = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 14U), /*!< timeout signal in SMBus mode */ + I2C_FLAG_SMBALT = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 15U), /*!< SMBus alert status */ + /* flags in STAT1 register */ + I2C_FLAG_MASTER = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 0U), /*!< a flag indicating whether I2C block is in master or slave mode */ + I2C_FLAG_I2CBSY = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 1U), /*!< busy flag */ + I2C_FLAG_TRS = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 2U), /*!< whether the I2C is a transmitter or a receiver */ + I2C_FLAG_RXGC = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 4U), /*!< general call address (00h) received */ + I2C_FLAG_DEFSMB = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 5U), /*!< default address of SMBus device */ + I2C_FLAG_HSTSMB = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 6U), /*!< SMBus host header detected in slave mode */ + I2C_FLAG_DUMOD = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 7U) /*!< dual flag in slave mode indicating which address is matched in dual-address mode */ +}i2c_flag_enum; + +/* I2C interrupt flags */ +typedef enum +{ + /* interrupt flags in CTL1 register */ + I2C_INT_FLAG_SBSEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 0U), /*!< start condition sent out in master mode interrupt flag */ + I2C_INT_FLAG_ADDSEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 1U), /*!< address is sent in master mode or received and matches in slave mode interrupt flag */ + I2C_INT_FLAG_BTC = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 2U), /*!< byte transmission finishes */ + I2C_INT_FLAG_ADD10SEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 3U), /*!< header of 10-bit address is sent in master mode interrupt flag */ + I2C_INT_FLAG_STPDET = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 4U), /*!< stop condition detected in slave mode interrupt flag */ + I2C_INT_FLAG_RBNE = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 6U), /*!< I2C_DATA is not Empty during receiving interrupt flag */ + I2C_INT_FLAG_TBE = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U, I2C_STAT0_REG_OFFSET, 7U), /*!< I2C_DATA is empty during transmitting interrupt flag */ + I2C_INT_FLAG_BERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 8U), /*!< a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag */ + I2C_INT_FLAG_LOSTARB = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 9U), /*!< arbitration lost in master mode interrupt flag */ + I2C_INT_FLAG_AERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 10U), /*!< acknowledge error interrupt flag */ + I2C_INT_FLAG_OUERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 11U), /*!< over-run or under-run situation occurs in slave mode interrupt flag */ + I2C_INT_FLAG_PECERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 12U), /*!< PEC error when receiving data interrupt flag */ + I2C_INT_FLAG_SMBTO = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 14U), /*!< timeout signal in SMBus mode interrupt flag */ + I2C_INT_FLAG_SMBALT = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U, I2C_STAT0_REG_OFFSET, 15U), /*!< SMBus Alert status interrupt flag */ +}i2c_interrupt_flag_enum; + +/* I2C interrupt enable or disable */ +typedef enum +{ + /* interrupt in CTL1 register */ + I2C_INT_ERR = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 8U), /*!< error interrupt enable */ + I2C_INT_EV = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 9U), /*!< event interrupt enable */ + I2C_INT_BUF = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 10U), /*!< buffer interrupt enable */ +}i2c_interrupt_enum; + +/* SMBus/I2C mode switch and SMBus type selection */ +#define I2C_I2CMODE_ENABLE ((uint32_t)0x00000000U) /*!< I2C mode */ +#define I2C_SMBUSMODE_ENABLE I2C_CTL0_SMBEN /*!< SMBus mode */ + +/* SMBus/I2C mode switch and SMBus type selection */ +#define I2C_SMBUS_DEVICE ((uint32_t)0x00000000U) /*!< SMBus mode device type */ +#define I2C_SMBUS_HOST I2C_CTL0_SMBSEL /*!< SMBus mode host type */ + +/* I2C transfer direction */ +#define I2C_RECEIVER ((uint32_t)0x00000001U) /*!< receiver */ +#define I2C_TRANSMITTER ((uint32_t)0xFFFFFFFEU) /*!< transmitter */ + +/* whether or not to send an ACK */ +#define I2C_ACK_DISABLE ((uint32_t)0x00000000U) /*!< ACK will be not sent */ +#define I2C_ACK_ENABLE ((uint32_t)0x00000001U) /*!< ACK will be sent */ + +/* I2C POAP position*/ +#define I2C_ACKPOS_NEXT ((uint32_t)0x00000000U) /*!< ACKEN bit decides whether or not to send ACK for the next byte */ +#define I2C_ACKPOS_CURRENT ((uint32_t)0x00000001U) /*!< ACKEN bit decides whether or not to send ACK or not for the current byte */ + +/* I2C dual-address mode switch */ +#define I2C_DUADEN_DISABLE ((uint32_t)0x00000000U) /*!< dual-address mode disabled */ +#define I2C_DUADEN_ENABLE ((uint32_t)0x00000001U) /*!< dual-address mode enabled */ + +/* whether or not to stretch SCL low */ +#define I2C_SCLSTRETCH_ENABLE ((uint32_t)0x00000000U) /*!< SCL stretching is enabled */ +#define I2C_SCLSTRETCH_DISABLE I2C_CTL0_SS /*!< SCL stretching is disabled */ + +/* whether or not to response to a general call */ +#define I2C_GCEN_ENABLE I2C_CTL0_GCEN /*!< slave will response to a general call */ +#define I2C_GCEN_DISABLE ((uint32_t)0x00000000U) /*!< slave will not response to a general call */ + +/* software reset I2C */ +#define I2C_SRESET_SET I2C_CTL0_SRESET /*!< I2C is under reset */ +#define I2C_SRESET_RESET ((uint32_t)0x00000000U) /*!< I2C is not under reset */ + +/* I2C DMA mode configure */ +/* DMA mode switch */ +#define I2C_DMA_ON I2C_CTL1_DMAON /*!< DMA mode enabled */ +#define I2C_DMA_OFF ((uint32_t)0x00000000U) /*!< DMA mode disabled */ + +/* flag indicating DMA last transfer */ +#define I2C_DMALST_ON I2C_CTL1_DMALST /*!< next DMA EOT is the last transfer */ +#define I2C_DMALST_OFF ((uint32_t)0x00000000U) /*!< next DMA EOT is not the last transfer */ + +/* I2C PEC configure */ +/* PEC enable */ +#define I2C_PEC_ENABLE I2C_CTL0_PECEN /*!< PEC calculation on */ +#define I2C_PEC_DISABLE ((uint32_t)0x00000000U) /*!< PEC calculation off */ + +/* PEC transfer */ +#define I2C_PECTRANS_ENABLE I2C_CTL0_PECTRANS /*!< transfer PEC */ +#define I2C_PECTRANS_DISABLE ((uint32_t)0x00000000U) /*!< not transfer PEC value */ + +/* I2C SMBus configure */ +/* issue or not alert through SMBA pin */ +#define I2C_SALTSEND_ENABLE I2C_CTL0_SALT /*!< issue alert through SMBA pin */ +#define I2C_SALTSEND_DISABLE ((uint32_t)0x00000000U) /*!< not issue alert through SMBA */ + +/* ARP protocol in SMBus switch */ +#define I2C_ARP_ENABLE I2C_CTL0_ARPEN /*!< ARP enable */ +#define I2C_ARP_DISABLE ((uint32_t)0x00000000U) /*!< ARP disable */ + +/* fast mode plus enable */ +#define I2C_FAST_MODE_PLUS_ENABLE I2C_FMPCFG_FMPEN /*!< fast mode plus enable */ +#define I2C_FAST_MODE_PLUS_DISABLE ((uint32_t)0x00000000U) /*!< fast mode plus disable */ + +/* transmit I2C data */ +#define DATA_TRANS(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) + +/* receive I2C data */ +#define DATA_RECV(regval) GET_BITS((uint32_t)(regval), 0, 7) + +/* I2C duty cycle in fast mode or fast mode plus */ +#define I2C_DTCY_2 ((uint32_t)0x00000000U) /*!< in I2C fast mode or fast mode plus Tlow/Thigh = 2 */ +#define I2C_DTCY_16_9 I2C_CKCFG_DTCY /*!< in I2C fast mode or fast mode plus Tlow/Thigh = 16/9 */ + +/* address mode for the I2C slave */ +#define I2C_ADDFORMAT_7BITS ((uint32_t)0x00000000U) /*!< address:7 bits */ +#define I2C_ADDFORMAT_10BITS I2C_SADDR0_ADDFORMAT /*!< address:10 bits */ + +/* function declarations */ +/* reset I2C */ +void i2c_deinit(uint32_t i2c_periph); +/* configure I2C clock */ +void i2c_clock_config(uint32_t i2c_periph, uint32_t clkspeed, uint32_t dutycyc); +/* configure I2C address */ +void i2c_mode_addr_config(uint32_t i2c_periph, uint32_t mode, uint32_t addformat, uint32_t addr); +/* SMBus type selection */ +void i2c_smbus_type_config(uint32_t i2c_periph, uint32_t type); +/* whether or not to send an ACK */ +void i2c_ack_config(uint32_t i2c_periph, uint32_t ack); +/* configure I2C POAP position */ +void i2c_ackpos_config(uint32_t i2c_periph, uint32_t pos); +/* master sends slave address */ +void i2c_master_addressing(uint32_t i2c_periph, uint32_t addr, uint32_t trandirection); +/* enable dual-address mode */ +void i2c_dualaddr_enable(uint32_t i2c_periph, uint32_t dualaddr); +/* disable dual-address mode */ +void i2c_dualaddr_disable(uint32_t i2c_periph); +/* enable I2C */ +void i2c_enable(uint32_t i2c_periph); +/* disable I2C */ +void i2c_disable(uint32_t i2c_periph); + +/* generate a START condition on I2C bus */ +void i2c_start_on_bus(uint32_t i2c_periph); +/* generate a STOP condition on I2C bus */ +void i2c_stop_on_bus(uint32_t i2c_periph); +/* I2C transmit data function */ +void i2c_data_transmit(uint32_t i2c_periph, uint8_t data); +/* I2C receive data function */ +uint8_t i2c_data_receive(uint32_t i2c_periph); +/* enable I2C DMA mode */ +void i2c_dma_enable(uint32_t i2c_periph, uint32_t dmastate); +/* configure whether next DMA EOT is DMA last transfer or not */ +void i2c_dma_last_transfer_config(uint32_t i2c_periph, uint32_t dmalast); +/* whether to stretch SCL low when data is not ready in slave mode */ +void i2c_stretch_scl_low_config(uint32_t i2c_periph, uint32_t stretchpara); +/* whether or not to response to a general call */ +void i2c_slave_response_to_gcall_config(uint32_t i2c_periph, uint32_t gcallpara); +/* software reset I2C */ +void i2c_software_reset_config(uint32_t i2c_periph, uint32_t sreset); + +/* I2C PEC calculation on or off */ +void i2c_pec_enable(uint32_t i2c_periph, uint32_t pecstate); +/* I2C whether to transfer PEC value */ +void i2c_pec_transfer_enable(uint32_t i2c_periph, uint32_t pecpara); +/* packet error checking value */ +uint8_t i2c_pec_value_get(uint32_t i2c_periph); +/* I2C issue alert through SMBA pin */ +void i2c_smbus_issue_alert(uint32_t i2c_periph, uint32_t smbuspara); +/* I2C ARP protocol in SMBus switch */ +void i2c_smbus_arp_enable(uint32_t i2c_periph, uint32_t arpstate); + +/* check I2C flag is set or not */ +FlagStatus i2c_flag_get(uint32_t i2c_periph, i2c_flag_enum flag); +/* clear I2C flag */ +void i2c_flag_clear(uint32_t i2c_periph, i2c_flag_enum flag); +/* enable I2C interrupt */ +void i2c_interrupt_enable(uint32_t i2c_periph, i2c_interrupt_enum interrupt); +/* disable I2C interrupt */ +void i2c_interrupt_disable(uint32_t i2c_periph, i2c_interrupt_enum interrupt); +/* check I2C interrupt flag */ +FlagStatus i2c_interrupt_flag_get(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag); +/* clear I2C interrupt flag */ +void i2c_interrupt_flag_clear(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag); + +#endif /* GD32F30X_I2C_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_misc.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_misc.h new file mode 100644 index 0000000..3b58b30 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_misc.h @@ -0,0 +1,94 @@ +/*! + \file gd32f30x_misc.h + \brief definitions for the MISC + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_MISC_H +#define GD32F30X_MISC_H + +#include "gd32f30x.h" + +/* constants definitions */ +/* set the RAM and FLASH base address */ +#define NVIC_VECTTAB_RAM ((uint32_t)0x20000000) /*!< RAM base address */ +#define NVIC_VECTTAB_FLASH ((uint32_t)0x08000000) /*!< Flash base address */ + +/* set the NVIC vector table offset mask */ +#define NVIC_VECTTAB_OFFSET_MASK ((uint32_t)0x1FFFFF80) + +/* the register key mask, if you want to do the write operation, you should write 0x5FA to VECTKEY bits */ +#define NVIC_AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) + +/* priority group - define the pre-emption priority and the subpriority */ +#define NVIC_PRIGROUP_PRE0_SUB4 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority 4 bits for subpriority */ +#define NVIC_PRIGROUP_PRE1_SUB3 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority 3 bits for subpriority */ +#define NVIC_PRIGROUP_PRE2_SUB2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority 2 bits for subpriority */ +#define NVIC_PRIGROUP_PRE3_SUB1 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority 1 bits for subpriority */ +#define NVIC_PRIGROUP_PRE4_SUB0 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority 0 bits for subpriority */ + +/* choose the method to enter or exit the lowpower mode */ +#define SCB_SCR_SLEEPONEXIT ((uint8_t)0x02) /*!< choose the the system whether enter low power mode by exiting from ISR */ +#define SCB_SCR_SLEEPDEEP ((uint8_t)0x04) /*!< choose the the system enter the DEEPSLEEP mode or SLEEP mode */ +#define SCB_SCR_SEVONPEND ((uint8_t)0x10) /*!< choose the interrupt source that can wake up the lowpower mode */ + +#define SCB_LPM_SLEEP_EXIT_ISR SCB_SCR_SLEEPONEXIT +#define SCB_LPM_DEEPSLEEP SCB_SCR_SLEEPDEEP +#define SCB_LPM_WAKE_BY_ALL_INT SCB_SCR_SEVONPEND + +/* choose the systick clock source */ +#define SYSTICK_CLKSOURCE_HCLK_DIV8 ((uint32_t)0xFFFFFFFBU) /*!< systick clock source is from HCLK/8 */ +#define SYSTICK_CLKSOURCE_HCLK ((uint32_t)0x00000004U) /*!< systick clock source is from HCLK */ + +/* function declarations */ +/* set the priority group */ +void nvic_priority_group_set(uint32_t nvic_prigroup); + +/* enable NVIC request */ +void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, uint8_t nvic_irq_sub_priority); +/* disable NVIC request */ +void nvic_irq_disable(uint8_t nvic_irq); + +/* set the NVIC vector table base address */ +void nvic_vector_table_set(uint32_t nvic_vict_tab, uint32_t offset); + +/* set the state of the low power mode */ +void system_lowpower_set(uint8_t lowpower_mode); +/* reset the state of the low power mode */ +void system_lowpower_reset(uint8_t lowpower_mode); + +/* set the systick clock source */ +void systick_clksource_set(uint32_t systick_clksource); + +#endif /* GD32F30X_MISC_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_pmu.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_pmu.h new file mode 100644 index 0000000..c8c00fc --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_pmu.h @@ -0,0 +1,192 @@ +/*! + \file gd32f30x_pmu.h + \brief definitions for the PMU + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef GD32F30X_PMU_H +#define GD32F30X_PMU_H + +#include "gd32f30x.h" + +/* PMU definitions */ +#define PMU PMU_BASE /*!< PMU base address */ + +/* registers definitions */ +#define PMU_CTL REG32((PMU) + 0x00U) /*!< PMU control register */ +#define PMU_CS REG32((PMU) + 0x04U) /*!< PMU control and status register */ + +/* bits definitions */ +/* PMU_CTL */ +#define PMU_CTL_LDOLP BIT(0) /*!< LDO low power mode */ +#define PMU_CTL_STBMOD BIT(1) /*!< standby mode */ +#define PMU_CTL_WURST BIT(2) /*!< wakeup flag reset */ +#define PMU_CTL_STBRST BIT(3) /*!< standby flag reset */ +#define PMU_CTL_LVDEN BIT(4) /*!< low voltage detector enable */ +#define PMU_CTL_LVDT BITS(5,7) /*!< low voltage detector threshold */ +#define PMU_CTL_BKPWEN BIT(8) /*!< backup domain write enable */ +#define PMU_CTL_LDLP BIT(10) /*!< low-driver mode when use low power LDO */ +#define PMU_CTL_LDNP BIT(11) /*!< low-driver mode when use normal power LDO */ +#define PMU_CTL_LDOVS BITS(14,15) /*!< LDO output voltage select */ +#define PMU_CTL_HDEN BIT(16) /*!< high-driver mode enable */ +#define PMU_CTL_HDS BIT(17) /*!< high-driver mode switch */ +#define PMU_CTL_LDEN BITS(18,19) /*!< low-driver mode enable in deep-sleep mode */ + +/* PMU_CS */ +#define PMU_CS_WUF BIT(0) /*!< wakeup flag */ +#define PMU_CS_STBF BIT(1) /*!< standby flag */ +#define PMU_CS_LVDF BIT(2) /*!< low voltage detector status flag */ +#define PMU_CS_WUPEN BIT(8) /*!< wakeup pin enable */ +#define PMU_CS_LDOVSRF BIT(14) /*!< LDO voltage select ready flag */ +#define PMU_CS_HDRF BIT(16) /*!< high-driver ready flag */ +#define PMU_CS_HDSRF BIT(17) /*!< high-driver switch ready flag */ +#define PMU_CS_LDRF BITS(18,19) /*!< Low-driver mode ready flag */ + +/* constants definitions */ +/* PMU ldo definitions */ +#define PMU_LDO_NORMAL ((uint32_t)0x00000000U) /*!< LDO normal work when PMU enter deepsleep mode */ +#define PMU_LDO_LOWPOWER PMU_CTL_LDOLP /*!< LDO work in low power status when PMU enter deepsleep mode */ + +/* PMU low voltage detector threshold definitions */ +#define CTL_LVDT(regval) (BITS(5,7)&((uint32_t)(regval)<<5)) +#define PMU_LVDT_0 CTL_LVDT(0) /*!< voltage threshold is 2.1V */ +#define PMU_LVDT_1 CTL_LVDT(1) /*!< voltage threshold is 2.3V */ +#define PMU_LVDT_2 CTL_LVDT(2) /*!< voltage threshold is 2.4V */ +#define PMU_LVDT_3 CTL_LVDT(3) /*!< voltage threshold is 2.6V */ +#define PMU_LVDT_4 CTL_LVDT(4) /*!< voltage threshold is 2.7V */ +#define PMU_LVDT_5 CTL_LVDT(5) /*!< voltage threshold is 2.9V */ +#define PMU_LVDT_6 CTL_LVDT(6) /*!< voltage threshold is 3.0V */ +#define PMU_LVDT_7 CTL_LVDT(7) /*!< voltage threshold is 3.1V */ + +/* PMU low-driver mode when use low power LDO */ +#define CTL_LDLP(regval) (BIT(10)&((uint32_t)(regval)<<10)) +#define PMU_NORMALDR_LOWPWR CTL_LDLP(0) /*!< normal driver when use low power LDO */ +#define PMU_LOWDR_LOWPWR CTL_LDLP(1) /*!< low-driver mode enabled when LDEN is 11 and use low power LDO */ + +/* PMU low-driver mode when use normal power LDO */ +#define CTL_LDNP(regval) (BIT(11)&((uint32_t)(regval)<<11)) +#define PMU_NORMALDR_NORMALPWR CTL_LDNP(0) /*!< normal driver when use normal power LDO */ +#define PMU_LOWDR_NORMALPWR CTL_LDNP(1) /*!< low-driver mode enabled when LDEN is 11 and use normal power LDO */ + +/* PMU LDO output voltage select definitions */ +#define CTL_LDOVS(regval) (BITS(14,15)&((uint32_t)(regval)<<14)) +#define PMU_LDOVS_LOW CTL_LDOVS(1) /*!< LDO output voltage low mode */ +#define PMU_LDOVS_MID CTL_LDOVS(2) /*!< LDO output voltage mid mode */ +#define PMU_LDOVS_HIGH CTL_LDOVS(3) /*!< LDO output voltage high mode */ + +/* PMU high-driver mode switch */ +#define CTL_HDS(regval) (BIT(17)&((uint32_t)(regval)<<17)) +#define PMU_HIGHDR_SWITCH_NONE CTL_HDS(0) /*!< no high-driver mode switch */ +#define PMU_HIGHDR_SWITCH_EN CTL_HDS(1) /*!< high-driver mode switch */ + +/* low-driver mode in deep-sleep mode */ +#define PMU_LOWDRIVER_DISABLE ((uint32_t)0x00000000U) /*!< low-driver mode disable in deep-sleep mode */ +#define PMU_LOWDRIVER_ENABLE PMU_CTL_LDEN /*!< low-driver mode enable in deep-sleep mode */ + +/* PMU low power mode ready flag definitions */ +#define CS_LDRF(regval) (BITS(18,19)&((uint32_t)(regval)<<18)) +#define PMU_LDRF_NORMAL CS_LDRF(0) /*!< normal driver in deep-sleep mode */ +#define PMU_LDRF_LOWDRIVER CS_LDRF(3) /*!< low-driver mode in deep-sleep mode */ + +/* PMU flag definitions */ +#define PMU_FLAG_WAKEUP PMU_CS_WUF /*!< wakeup flag status */ +#define PMU_FLAG_STANDBY PMU_CS_STBF /*!< standby flag status */ +#define PMU_FLAG_LVD PMU_CS_LVDF /*!< lvd flag status */ +#define PMU_FLAG_LDOVSRF PMU_CS_LDOVSRF /*!< LDO voltage select ready flag */ +#define PMU_FLAG_HDRF PMU_CS_HDRF /*!< high-driver ready flag */ +#define PMU_FLAG_HDSRF PMU_CS_HDSRF /*!< high-driver switch ready flag */ +#define PMU_FLAG_LDRF PMU_CS_LDRF /*!< low-driver mode ready flag */ + +/* PMU flag reset definitions */ +#define PMU_FLAG_RESET_WAKEUP ((uint8_t)0x00U) /*!< wakeup flag reset */ +#define PMU_FLAG_RESET_STANDBY ((uint8_t)0x01U) /*!< standby flag reset */ + +/* PMU command constants definitions */ +#define WFI_CMD ((uint8_t)0x00U) /*!< use WFI command */ +#define WFE_CMD ((uint8_t)0x01U) /*!< use WFE command */ + +/* function declarations */ +/* reset PMU registers */ +void pmu_deinit(void); + +/* LVD functions */ +/* select low voltage detector threshold */ +void pmu_lvd_select(uint32_t lvdt_n); +/* select LDO output voltage */ +void pmu_ldo_output_select(uint32_t ldo_output); +/* disable PMU lvd */ +void pmu_lvd_disable(void); + +/* functions of low-driver mode and high-driver mode in deep-sleep mode */ +/* switch high-driver mode */ +void pmu_highdriver_switch_select(uint32_t highdr_switch); +/* enable high-driver mode */ +void pmu_highdriver_mode_enable(void); +/* disable high-driver mode */ +void pmu_highdriver_mode_disable(void); +/* enable low-driver mode in deep-sleep mode */ +void pmu_lowdriver_mode_enable(void); +/* disable low-driver mode in deep-sleep mode */ +void pmu_lowdriver_mode_disable(void); +/* in deep-sleep mode, driver mode when use low power LDO */ +void pmu_lowpower_driver_config(uint32_t mode); +/* in deep-sleep mode, driver mode when use normal power LDO */ +void pmu_normalpower_driver_config(uint32_t mode); + +/* set PMU mode */ +/* PMU work in sleep mode */ +void pmu_to_sleepmode(uint8_t sleepmodecmd); +/* PMU work in deepsleep mode */ +void pmu_to_deepsleepmode(uint32_t ldo, uint32_t lowdrive, uint8_t deepsleepmodecmd); +/* PMU work in standby mode */ +void pmu_to_standbymode(uint8_t standbymodecmd); +/* enable PMU wakeup pin */ +void pmu_wakeup_pin_enable(void); +/* disable PMU wakeup pin */ +void pmu_wakeup_pin_disable(void); + +/* backup related functions */ +/* enable backup domain write */ +void pmu_backup_write_enable(void); +/* disable backup domain write */ +void pmu_backup_write_disable(void); + +/* flag functions */ +/* get flag state */ +FlagStatus pmu_flag_get(uint32_t flag); +/* clear flag bit */ +void pmu_flag_clear(uint32_t flag); + +#endif /* GD32F30X_PMU_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_rcu.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_rcu.h new file mode 100644 index 0000000..dfeb6a0 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_rcu.h @@ -0,0 +1,1053 @@ +/*! + \file gd32f30x_rcu.h + \brief definitions for the RCU + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_RCU_H +#define GD32F30X_RCU_H + +#include "gd32f30x.h" + +/* RCU definitions */ +#define RCU RCU_BASE + +/* registers definitions */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define RCU_CTL REG32(RCU + 0x00U) /*!< control register */ +#define RCU_CFG0 REG32(RCU + 0x04U) /*!< clock configuration register 0 */ +#define RCU_INT REG32(RCU + 0x08U) /*!< clock interrupt register */ +#define RCU_APB2RST REG32(RCU + 0x0CU) /*!< APB2 reset register */ +#define RCU_APB1RST REG32(RCU + 0x10U) /*!< APB1 reset register */ +#define RCU_AHBEN REG32(RCU + 0x14U) /*!< AHB enable register */ +#define RCU_APB2EN REG32(RCU + 0x18U) /*!< APB2 enable register */ +#define RCU_APB1EN REG32(RCU + 0x1CU) /*!< APB1 enable register */ +#define RCU_BDCTL REG32(RCU + 0x20U) /*!< backup domain control register */ +#define RCU_RSTSCK REG32(RCU + 0x24U) /*!< reset source / clock register */ +#define RCU_CFG1 REG32(RCU + 0x2CU) /*!< clock configuration register 1 */ +#define RCU_DSV REG32(RCU + 0x34U) /*!< deep-sleep mode voltage register */ +#define RCU_ADDCTL REG32(RCU + 0xC0U) /*!< Additional clock control register */ +#define RCU_ADDINT REG32(RCU + 0xCCU) /*!< Additional clock interrupt register */ +#define RCU_ADDAPB1RST REG32(RCU + 0xE0U) /*!< APB1 additional reset register */ +#define RCU_ADDAPB1EN REG32(RCU + 0xE4U) /*!< APB1 additional enable register */ +#elif defined(GD32F30X_CL) +#define RCU_CTL REG32(RCU + 0x00U) /*!< control register */ +#define RCU_CFG0 REG32(RCU + 0x04U) /*!< clock configuration register 0 */ +#define RCU_INT REG32(RCU + 0x08U) /*!< clock interrupt register */ +#define RCU_APB2RST REG32(RCU + 0x0CU) /*!< APB2 reset register */ +#define RCU_APB1RST REG32(RCU + 0x10U) /*!< APB1 reset register */ +#define RCU_AHBEN REG32(RCU + 0x14U) /*!< AHB1 enable register */ +#define RCU_APB2EN REG32(RCU + 0x18U) /*!< APB2 enable register */ +#define RCU_APB1EN REG32(RCU + 0x1CU) /*!< APB1 enable register */ +#define RCU_BDCTL REG32(RCU + 0x20U) /*!< backup domain control register */ +#define RCU_RSTSCK REG32(RCU + 0x24U) /*!< reset source / clock register */ +#define RCU_AHBRST REG32(RCU + 0x28U) /*!< AHB reset register */ +#define RCU_CFG1 REG32(RCU + 0x2CU) /*!< clock configuration register 1 */ +#define RCU_DSV REG32(RCU + 0x34U) /*!< deep-sleep mode voltage register */ +#define RCU_ADDCTL REG32(RCU + 0xC0U) /*!< Additional clock control register */ +#define RCU_ADDINT REG32(RCU + 0xCCU) /*!< Additional clock interrupt register */ +#define RCU_ADDAPB1RST REG32(RCU + 0xE0U) /*!< APB1 additional reset register */ +#define RCU_ADDAPB1EN REG32(RCU + 0xE4U) /*!< APB1 additional enable register */ +#endif /* GD32F30X_HD and GD32F30X_XD */ + +/* bits definitions */ +/* RCU_CTL */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define RCU_CTL_IRC8MEN BIT(0) /*!< internal high speed oscillator enable */ +#define RCU_CTL_IRC8MSTB BIT(1) /*!< IRC8M high speed internal oscillator stabilization flag */ +#define RCU_CTL_IRC8MADJ BITS(3,7) /*!< high speed internal oscillator clock trim adjust value */ +#define RCU_CTL_IRC8MCALIB BITS(8,15) /*!< high speed internal oscillator calibration value register */ +#define RCU_CTL_HXTALEN BIT(16) /*!< external high speed oscillator enable */ +#define RCU_CTL_HXTALSTB BIT(17) /*!< external crystal oscillator clock stabilization flag */ +#define RCU_CTL_HXTALBPS BIT(18) /*!< external crystal oscillator clock bypass mode enable */ +#define RCU_CTL_CKMEN BIT(19) /*!< HXTAL clock monitor enable */ +#define RCU_CTL_PLLEN BIT(24) /*!< PLL enable */ +#define RCU_CTL_PLLSTB BIT(25) /*!< PLL clock stabilization flag */ +#elif defined(GD32F30X_CL) +#define RCU_CTL_IRC8MEN BIT(0) /*!< internal high speed oscillator enable */ +#define RCU_CTL_IRC8MSTB BIT(1) /*!< IRC8M high speed internal oscillator stabilization flag */ +#define RCU_CTL_IRC8MADJ BITS(3,7) /*!< high speed internal oscillator clock trim adjust value */ +#define RCU_CTL_IRC8MCALIB BITS(8,15) /*!< high speed internal oscillator calibration value register */ +#define RCU_CTL_HXTALEN BIT(16) /*!< external high speed oscillator enable */ +#define RCU_CTL_HXTALSTB BIT(17) /*!< external crystal oscillator clock stabilization flag */ +#define RCU_CTL_HXTALBPS BIT(18) /*!< external crystal oscillator clock bypass mode enable */ +#define RCU_CTL_CKMEN BIT(19) /*!< HXTAL clock monitor enable */ +#define RCU_CTL_PLLEN BIT(24) /*!< PLL enable */ +#define RCU_CTL_PLLSTB BIT(25) /*!< PLL clock stabilization flag */ +#define RCU_CTL_PLL1EN BIT(26) /*!< PLL1 enable */ +#define RCU_CTL_PLL1STB BIT(27) /*!< PLL1 clock stabilization flag */ +#define RCU_CTL_PLL2EN BIT(28) /*!< PLL2 enable */ +#define RCU_CTL_PLL2STB BIT(29) /*!< PLL2 clock stabilization flag */ +#endif /* GD32F30X_HD and GD32F30X_XD */ + +/* RCU_CFG0 */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define RCU_CFG0_SCS BITS(0,1) /*!< system clock switch */ +#define RCU_CFG0_SCSS BITS(2,3) /*!< system clock switch status */ +#define RCU_CFG0_AHBPSC BITS(4,7) /*!< AHB prescaler selection */ +#define RCU_CFG0_APB1PSC BITS(8,10) /*!< APB1 prescaler selection */ +#define RCU_CFG0_APB2PSC BITS(11,13) /*!< APB2 prescaler selection */ +#define RCU_CFG0_ADCPSC BITS(14,15) /*!< ADC prescaler selection */ +#define RCU_CFG0_PLLSEL BIT(16) /*!< PLL clock source selection */ +#define RCU_CFG0_PREDV0 BIT(17) /*!< PREDV0 division factor */ +#define RCU_CFG0_PLLMF BITS(18,21) /*!< PLL clock multiplication factor */ +#define RCU_CFG0_USBDPSC BITS(22,23) /*!< USBD clock prescaler selection */ +#define RCU_CFG0_CKOUT0SEL BITS(24,26) /*!< CKOUT0 clock source selection */ +#define RCU_CFG0_PLLMF_4 BIT(27) /*!< bit 4 of PLLMF */ +#define RCU_CFG0_ADCPSC_2 BIT(28) /*!< bit 2 of ADCPSC */ +#define RCU_CFG0_PLLMF_5 BIT(30) /*!< bit 5 of PLLMF */ +#define RCU_CFG0_USBDPSC_2 BIT(31) /*!< bit 2 of USBDPSC */ +#elif defined(GD32F30X_CL) +#define RCU_CFG0_SCS BITS(0,1) /*!< system clock switch */ +#define RCU_CFG0_SCSS BITS(2,3) /*!< system clock switch status */ +#define RCU_CFG0_AHBPSC BITS(4,7) /*!< AHB prescaler selection */ +#define RCU_CFG0_APB1PSC BITS(8,10) /*!< APB1 prescaler selection */ +#define RCU_CFG0_APB2PSC BITS(11,13) /*!< APB2 prescaler selection */ +#define RCU_CFG0_ADCPSC BITS(14,15) /*!< ADC prescaler selection */ +#define RCU_CFG0_PLLSEL BIT(16) /*!< PLL clock source selection */ +#define RCU_CFG0_PREDV0_LSB BIT(17) /*!< the LSB of PREDV0 division factor */ +#define RCU_CFG0_PLLMF BITS(18,21) /*!< PLL clock multiplication factor */ +#define RCU_CFG0_USBFSPSC BITS(22,23) /*!< USBFS clock prescaler selection */ +#define RCU_CFG0_CKOUT0SEL BITS(24,27) /*!< CKOUT0 clock source selection */ +#define RCU_CFG0_ADCPSC_2 BIT(28) /*!< bit 2 of ADCPSC */ +#define RCU_CFG0_PLLMF_4 BIT(29) /*!< bit 4 of PLLMF */ +#define RCU_CFG0_PLLMF_5 BIT(30) /*!< bit 5 of PLLMF */ +#define RCU_CFG0_USBFSPSC_2 BIT(31) /*!< bit 2 of USBFSPSC */ +#endif /* GD32F30X_HD and GD32F30X_XD */ + +/* RCU_INT */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define RCU_INT_IRC40KSTBIF BIT(0) /*!< IRC40K stabilization interrupt flag */ +#define RCU_INT_LXTALSTBIF BIT(1) /*!< LXTAL stabilization interrupt flag */ +#define RCU_INT_IRC8MSTBIF BIT(2) /*!< IRC8M stabilization interrupt flag */ +#define RCU_INT_HXTALSTBIF BIT(3) /*!< HXTAL stabilization interrupt flag */ +#define RCU_INT_PLLSTBIF BIT(4) /*!< PLL stabilization interrupt flag */ +#define RCU_INT_CKMIF BIT(7) /*!< HXTAL clock stuck interrupt flag */ +#define RCU_INT_IRC40KSTBIE BIT(8) /*!< IRC40K stabilization interrupt enable */ +#define RCU_INT_LXTALSTBIE BIT(9) /*!< LXTAL stabilization interrupt enable */ +#define RCU_INT_IRC8MSTBIE BIT(10) /*!< IRC8M stabilization interrupt enable */ +#define RCU_INT_HXTALSTBIE BIT(11) /*!< HXTAL stabilization interrupt enable */ +#define RCU_INT_PLLSTBIE BIT(12) /*!< PLL stabilization interrupt enable */ +#define RCU_INT_IRC40KSTBIC BIT(16) /*!< IRC40K Stabilization interrupt clear */ +#define RCU_INT_LXTALSTBIC BIT(17) /*!< LXTAL Stabilization interrupt clear */ +#define RCU_INT_IRC8MSTBIC BIT(18) /*!< IRC8M Stabilization interrupt clear */ +#define RCU_INT_HXTALSTBIC BIT(19) /*!< HXTAL Stabilization interrupt clear */ +#define RCU_INT_PLLSTBIC BIT(20) /*!< PLL stabilization interrupt clear */ +#define RCU_INT_CKMIC BIT(23) /*!< HXTAL clock stuck interrupt clear */ +#elif defined(GD32F30X_CL) +#define RCU_INT_IRC40KSTBIF BIT(0) /*!< IRC40K stabilization interrupt flag */ +#define RCU_INT_LXTALSTBIF BIT(1) /*!< LXTAL stabilization interrupt flag */ +#define RCU_INT_IRC8MSTBIF BIT(2) /*!< IRC8M stabilization interrupt flag */ +#define RCU_INT_HXTALSTBIF BIT(3) /*!< HXTAL stabilization interrupt flag */ +#define RCU_INT_PLLSTBIF BIT(4) /*!< PLL stabilization interrupt flag */ +#define RCU_INT_PLL1STBIF BIT(5) /*!< PLL1 stabilization interrupt flag */ +#define RCU_INT_PLL2STBIF BIT(6) /*!< PLL2 stabilization interrupt flag */ +#define RCU_INT_CKMIF BIT(7) /*!< HXTAL clock stuck interrupt flag */ +#define RCU_INT_IRC40KSTBIE BIT(8) /*!< IRC40K stabilization interrupt enable */ +#define RCU_INT_LXTALSTBIE BIT(9) /*!< LXTAL stabilization interrupt enable */ +#define RCU_INT_IRC8MSTBIE BIT(10) /*!< IRC8M stabilization interrupt enable */ +#define RCU_INT_HXTALSTBIE BIT(11) /*!< HXTAL stabilization interrupt enable */ +#define RCU_INT_PLLSTBIE BIT(12) /*!< PLL stabilization interrupt enable */ +#define RCU_INT_PLL1STBIE BIT(13) /*!< PLL1 stabilization interrupt enable */ +#define RCU_INT_PLL2STBIE BIT(14) /*!< PLL2 stabilization interrupt enable */ +#define RCU_INT_IRC40KSTBIC BIT(16) /*!< IRC40K stabilization interrupt clear */ +#define RCU_INT_LXTALSTBIC BIT(17) /*!< LXTAL stabilization interrupt clear */ +#define RCU_INT_IRC8MSTBIC BIT(18) /*!< IRC8M stabilization interrupt clear */ +#define RCU_INT_HXTALSTBIC BIT(19) /*!< HXTAL stabilization interrupt clear */ +#define RCU_INT_PLLSTBIC BIT(20) /*!< PLL stabilization interrupt clear */ +#define RCU_INT_PLL1STBIC BIT(21) /*!< PLL1 stabilization interrupt clear */ +#define RCU_INT_PLL2STBIC BIT(22) /*!< PLL2 stabilization interrupt clear */ +#define RCU_INT_CKMIC BIT(23) /*!< HXTAL clock stuck interrupt clear */ +#endif /* GD32F30X_HD and GD32F30X_XD */ + +/* RCU_APB2RST */ +#define RCU_APB2RST_AFRST BIT(0) /*!< alternate function I/O reset */ +#define RCU_APB2RST_PARST BIT(2) /*!< GPIO port A reset */ +#define RCU_APB2RST_PBRST BIT(3) /*!< GPIO port B reset */ +#define RCU_APB2RST_PCRST BIT(4) /*!< GPIO port C reset */ +#define RCU_APB2RST_PDRST BIT(5) /*!< GPIO port D reset */ +#define RCU_APB2RST_PERST BIT(6) /*!< GPIO port E reset */ +#define RCU_APB2RST_PFRST BIT(7) /*!< GPIO port F reset */ +#define RCU_APB2RST_PGRST BIT(8) /*!< GPIO port G reset */ +#define RCU_APB2RST_ADC0RST BIT(9) /*!< ADC0 reset */ +#define RCU_APB2RST_ADC1RST BIT(10) /*!< ADC1 reset */ +#define RCU_APB2RST_TIMER0RST BIT(11) /*!< TIMER0 reset */ +#define RCU_APB2RST_SPI0RST BIT(12) /*!< SPI0 reset */ +#define RCU_APB2RST_TIMER7RST BIT(13) /*!< TIMER7 reset */ +#define RCU_APB2RST_USART0RST BIT(14) /*!< USART0 reset */ +#ifndef GD32F30X_CL +#define RCU_APB2RST_ADC2RST BIT(15) /*!< ADC2 reset */ +#endif /* GD32F30X_CL */ +#ifndef GD32F30X_HD +#define RCU_APB2RST_TIMER8RST BIT(19) /*!< TIMER8 reset */ +#define RCU_APB2RST_TIMER9RST BIT(20) /*!< TIMER9 reset */ +#define RCU_APB2RST_TIMER10RST BIT(21) /*!< TIMER10 reset */ +#endif /* GD32F30X_HD */ + +/* RCU_APB1RST */ +#define RCU_APB1RST_TIMER1RST BIT(0) /*!< TIMER1 reset */ +#define RCU_APB1RST_TIMER2RST BIT(1) /*!< TIMER2 reset */ +#define RCU_APB1RST_TIMER3RST BIT(2) /*!< TIMER3 reset */ +#define RCU_APB1RST_TIMER4RST BIT(3) /*!< TIMER4 reset */ +#define RCU_APB1RST_TIMER5RST BIT(4) /*!< TIMER5 reset */ +#define RCU_APB1RST_TIMER6RST BIT(5) /*!< TIMER6 reset */ +#ifndef GD32F30X_HD +#define RCU_APB1RST_TIMER11RST BIT(6) /*!< TIMER11 reset */ +#define RCU_APB1RST_TIMER12RST BIT(7) /*!< TIMER12 reset */ +#define RCU_APB1RST_TIMER13RST BIT(8) /*!< TIMER13 reset */ +#endif /* GD32F30X_HD */ +#define RCU_APB1RST_WWDGTRST BIT(11) /*!< WWDGT reset */ +#define RCU_APB1RST_SPI1RST BIT(14) /*!< SPI1 reset */ +#define RCU_APB1RST_SPI2RST BIT(15) /*!< SPI2 reset */ +#define RCU_APB1RST_USART1RST BIT(17) /*!< USART1 reset */ +#define RCU_APB1RST_USART2RST BIT(18) /*!< USART2 reset */ +#define RCU_APB1RST_UART3RST BIT(19) /*!< UART3 reset */ +#define RCU_APB1RST_UART4RST BIT(20) /*!< UART4 reset */ +#define RCU_APB1RST_I2C0RST BIT(21) /*!< I2C0 reset */ +#define RCU_APB1RST_I2C1RST BIT(22) /*!< I2C1 reset */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define RCU_APB1RST_USBDRST BIT(23) /*!< USBD reset */ +#endif /* GD32F30X_HD and GD32F30X_XD */ +#define RCU_APB1RST_CAN0RST BIT(25) /*!< CAN0 reset */ +#ifdef GD32F30X_CL +#define RCU_APB1RST_CAN1RST BIT(26) /*!< CAN1 reset */ +#endif /* GD32F30X_CL */ +#define RCU_APB1RST_BKPIRST BIT(27) /*!< backup interface reset */ +#define RCU_APB1RST_PMURST BIT(28) /*!< PMU reset */ +#define RCU_APB1RST_DACRST BIT(29) /*!< DAC reset */ + +/* RCU_AHBEN */ +#define RCU_AHBEN_DMA0EN BIT(0) /*!< DMA0 clock enable */ +#define RCU_AHBEN_DMA1EN BIT(1) /*!< DMA1 clock enable */ +#define RCU_AHBEN_SRAMSPEN BIT(2) /*!< SRAM clock enable when sleep mode */ +#define RCU_AHBEN_FMCSPEN BIT(4) /*!< FMC clock enable when sleep mode */ +#define RCU_AHBEN_CRCEN BIT(6) /*!< CRC clock enable */ +#define RCU_AHBEN_EXMCEN BIT(8) /*!< EXMC clock enable */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define RCU_AHBEN_SDIOEN BIT(10) /*!< SDIO clock enable */ +#elif defined(GD32F30X_CL) +#define RCU_AHBEN_USBFSEN BIT(12) /*!< USBFS clock enable */ +#define RCU_AHBEN_ENETEN BIT(14) /*!< ENET clock enable */ +#define RCU_AHBEN_ENETTXEN BIT(15) /*!< Ethernet TX clock enable */ +#define RCU_AHBEN_ENETRXEN BIT(16) /*!< Ethernet RX clock enable */ +#endif /* GD32F30X_HD and GD32F30X_XD */ + +/* RCU_APB2EN */ +#define RCU_APB2EN_AFEN BIT(0) /*!< alternate function IO clock enable */ +#define RCU_APB2EN_PAEN BIT(2) /*!< GPIO port A clock enable */ +#define RCU_APB2EN_PBEN BIT(3) /*!< GPIO port B clock enable */ +#define RCU_APB2EN_PCEN BIT(4) /*!< GPIO port C clock enable */ +#define RCU_APB2EN_PDEN BIT(5) /*!< GPIO port D clock enable */ +#define RCU_APB2EN_PEEN BIT(6) /*!< GPIO port E clock enable */ +#define RCU_APB2EN_PFEN BIT(7) /*!< GPIO port F clock enable */ +#define RCU_APB2EN_PGEN BIT(8) /*!< GPIO port G clock enable */ +#define RCU_APB2EN_ADC0EN BIT(9) /*!< ADC0 clock enable */ +#define RCU_APB2EN_ADC1EN BIT(10) /*!< ADC1 clock enable */ +#define RCU_APB2EN_TIMER0EN BIT(11) /*!< TIMER0 clock enable */ +#define RCU_APB2EN_SPI0EN BIT(12) /*!< SPI0 clock enable */ +#define RCU_APB2EN_TIMER7EN BIT(13) /*!< TIMER7 clock enable */ +#define RCU_APB2EN_USART0EN BIT(14) /*!< USART0 clock enable */ +#ifndef GD32F30X_CL +#define RCU_APB2EN_ADC2EN BIT(15) /*!< ADC2 clock enable */ +#endif /* GD32F30X_CL */ +#ifndef GD32F30X_HD +#define RCU_APB2EN_TIMER8EN BIT(19) /*!< TIMER8 clock enable */ +#define RCU_APB2EN_TIMER9EN BIT(20) /*!< TIMER9 clock enable */ +#define RCU_APB2EN_TIMER10EN BIT(21) /*!< TIMER10 clock enable */ +#endif /* GD32F30X_HD */ + +/* RCU_APB1EN */ +#define RCU_APB1EN_TIMER1EN BIT(0) /*!< TIMER1 clock enable */ +#define RCU_APB1EN_TIMER2EN BIT(1) /*!< TIMER2 clock enable */ +#define RCU_APB1EN_TIMER3EN BIT(2) /*!< TIMER3 clock enable */ +#define RCU_APB1EN_TIMER4EN BIT(3) /*!< TIMER4 clock enable */ +#define RCU_APB1EN_TIMER5EN BIT(4) /*!< TIMER5 clock enable */ +#define RCU_APB1EN_TIMER6EN BIT(5) /*!< TIMER6 clock enable */ +#ifndef GD32F30X_HD +#define RCU_APB1EN_TIMER11EN BIT(6) /*!< TIMER11 clock enable */ +#define RCU_APB1EN_TIMER12EN BIT(7) /*!< TIMER12 clock enable */ +#define RCU_APB1EN_TIMER13EN BIT(8) /*!< TIMER13 clock enable */ +#endif /* GD32F30X_HD */ +#define RCU_APB1EN_WWDGTEN BIT(11) /*!< WWDGT clock enable */ +#define RCU_APB1EN_SPI1EN BIT(14) /*!< SPI1 clock enable */ +#define RCU_APB1EN_SPI2EN BIT(15) /*!< SPI2 clock enable */ +#define RCU_APB1EN_USART1EN BIT(17) /*!< USART1 clock enable */ +#define RCU_APB1EN_USART2EN BIT(18) /*!< USART2 clock enable */ +#define RCU_APB1EN_UART3EN BIT(19) /*!< UART3 clock enable */ +#define RCU_APB1EN_UART4EN BIT(20) /*!< UART4 clock enable */ +#define RCU_APB1EN_I2C0EN BIT(21) /*!< I2C0 clock enable */ +#define RCU_APB1EN_I2C1EN BIT(22) /*!< I2C1 clock enable */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define RCU_APB1EN_USBDEN BIT(23) /*!< USBD clock enable */ +#endif /* GD32F30X_HD and GD32F30X_XD */ +#define RCU_APB1EN_CAN0EN BIT(25) /*!< CAN0 clock enable */ +#ifdef GD32F30X_CL +#define RCU_APB1EN_CAN1EN BIT(26) /*!< CAN1 clock enable */ +#endif /* GD32F30X_CL */ +#define RCU_APB1EN_BKPIEN BIT(27) /*!< backup interface clock enable */ +#define RCU_APB1EN_PMUEN BIT(28) /*!< PMU clock enable */ +#define RCU_APB1EN_DACEN BIT(29) /*!< DAC clock enable */ + +/* RCU_BDCTL */ +#define RCU_BDCTL_LXTALEN BIT(0) /*!< LXTAL enable */ +#define RCU_BDCTL_LXTALSTB BIT(1) /*!< low speed crystal oscillator stabilization flag */ +#define RCU_BDCTL_LXTALBPS BIT(2) /*!< LXTAL bypass mode enable */ +#define RCU_BDCTL_LXTALDRI BITS(3,4) /*!< LXTAL drive capability */ +#define RCU_BDCTL_RTCSRC BITS(8,9) /*!< RTC clock entry selection */ +#define RCU_BDCTL_RTCEN BIT(15) /*!< RTC clock enable */ +#define RCU_BDCTL_BKPRST BIT(16) /*!< backup domain reset */ + +/* RCU_RSTSCK */ +#define RCU_RSTSCK_IRC40KEN BIT(0) /*!< IRC40K enable */ +#define RCU_RSTSCK_IRC40KSTB BIT(1) /*!< IRC40K stabilization flag */ +#define RCU_RSTSCK_RSTFC BIT(24) /*!< reset flag clear */ +#define RCU_RSTSCK_EPRSTF BIT(26) /*!< external pin reset flag */ +#define RCU_RSTSCK_PORRSTF BIT(27) /*!< power reset flag */ +#define RCU_RSTSCK_SWRSTF BIT(28) /*!< software reset flag */ +#define RCU_RSTSCK_FWDGTRSTF BIT(29) /*!< free watchdog timer reset flag */ +#define RCU_RSTSCK_WWDGTRSTF BIT(30) /*!< window watchdog timer reset flag */ +#define RCU_RSTSCK_LPRSTF BIT(31) /*!< low-power reset flag */ + +#ifdef GD32F30X_CL +/* RCU_AHBRST */ +#define RCU_AHBRST_USBFSRST BIT(12) /*!< USBFS reset */ +#define RCU_AHBRST_ENETRST BIT(14) /*!< ENET reset */ +#endif /* GD32F30X_CL */ + +/* RCU_CFG1 */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define RCU_CFG1_ADCPSC_3 BIT(29) /*!< bit 4 of ADCPSC */ +#define RCU_CFG1_PLLPRESEL BIT(30) /*!< PLL clock source selection */ +#elif defined(GD32F30X_CL) +#define RCU_CFG1_PREDV0 BITS(0,3) /*!< PREDV0 division factor */ +#define RCU_CFG1_PREDV1 BITS(4,7) /*!< PREDV1 division factor */ +#define RCU_CFG1_PLL1MF BITS(8,11) /*!< PLL1 clock multiplication factor */ +#define RCU_CFG1_PLL2MF BITS(12,15) /*!< PLL2 clock multiplication factor */ +#define RCU_CFG1_PREDV0SEL BIT(16) /*!< PREDV0 input clock source selection */ +#define RCU_CFG1_I2S1SEL BIT(17) /*!< I2S1 clock source selection */ +#define RCU_CFG1_I2S2SEL BIT(18) /*!< I2S2 clock source selection */ +#define RCU_CFG1_ADCPSC_3 BIT(29) /*!< bit 4 of ADCPSC */ +#define RCU_CFG1_PLLPRESEL BIT(30) /*!< PLL clock source selection */ +#define RCU_CFG1_PLL2MF_4 BIT(31) /*!< bit 5 of PLL2MF */ +#endif /* GD32F30X_HD and GD32F30X_XD */ + +/* RCU_DSV */ +#define RCU_DSV_DSLPVS BITS(0,2) /*!< deep-sleep mode voltage select */ + +/* RCU_ADDCTL */ +#define RCU_ADDCTL_CK48MSEL BIT(0) /*!< 48MHz clock selection */ +#define RCU_ADDCTL_IRC48MEN BIT(16) /*!< internal 48MHz RC oscillator enable */ +#define RCU_ADDCTL_IRC48MSTB BIT(17) /*!< internal 48MHz RC oscillator clock stabilization flag */ +#define RCU_ADDCTL_IRC48MCAL BITS(24,31) /*!< internal 48MHz RC oscillator calibration value register */ + +/* RCU_ADDINT */ +#define RCU_ADDINT_IRC48MSTBIF BIT(6) /*!< IRC48M stabilization interrupt flag */ +#define RCU_ADDINT_IRC48MSTBIE BIT(14) /*!< internal 48 MHz RC oscillator stabilization interrupt enable */ +#define RCU_ADDINT_IRC48MSTBIC BIT(22) /*!< internal 48 MHz RC oscillator stabilization interrupt clear */ + +/* RCU_ADDAPB1RST */ +#define RCU_ADDAPB1RST_CTCRST BIT(27) /*!< CTC reset */ + +/* RCU_ADDAPB1EN */ +#define RCU_ADDAPB1EN_CTCEN BIT(27) /*!< CTC clock enable */ + + +/* constants definitions */ +/* define the peripheral clock enable bit position and its register index offset */ +#define RCU_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define RCU_REG_VAL(periph) (REG32(RCU + ((uint32_t)(periph) >> 6))) +#define RCU_BIT_POS(val) ((uint32_t)(val) & 0x1FU) + +/* register offset */ +/* peripherals enable */ +#define AHBEN_REG_OFFSET 0x14U /*!< AHB enable register offset */ +#define APB1EN_REG_OFFSET 0x1CU /*!< APB1 enable register offset */ +#define APB2EN_REG_OFFSET 0x18U /*!< APB2 enable register offset */ +#define ADD_APB1EN_REG_OFFSET 0xE4U /*!< APB1 additional enable register offset */ + +/* peripherals reset */ +#define AHBRST_REG_OFFSET 0x28U /*!< AHB reset register offset */ +#define APB1RST_REG_OFFSET 0x10U /*!< APB1 reset register offset */ +#define APB2RST_REG_OFFSET 0x0CU /*!< APB2 reset register offset */ +#define ADD_APB1RST_REG_OFFSET 0xE0U /*!< APB1 additional reset register offset */ +#define RSTSCK_REG_OFFSET 0x24U /*!< reset source/clock register offset */ + +/* clock control */ +#define CTL_REG_OFFSET 0x00U /*!< control register offset */ +#define BDCTL_REG_OFFSET 0x20U /*!< backup domain control register offset */ +#define ADDCTL_REG_OFFSET 0xC0U /*!< additional clock control register offset */ + +/* clock stabilization and stuck interrupt */ +#define INT_REG_OFFSET 0x08U /*!< clock interrupt register offset */ +#define ADDINT_REG_OFFSET 0xCCU /*!< additional clock interrupt register offset */ + +/* configuration register */ +#define CFG0_REG_OFFSET 0x04U /*!< clock configuration register 0 offset */ +#define CFG1_REG_OFFSET 0x2CU /*!< clock configuration register 1 offset */ + +/* peripheral clock enable */ +typedef enum +{ + /* AHB peripherals */ + RCU_DMA0 = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 0U), /*!< DMA0 clock */ + RCU_DMA1 = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 1U), /*!< DMA1 clock */ + RCU_CRC = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 6U), /*!< CRC clock */ + RCU_EXMC = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 8U), /*!< EXMC clock */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + RCU_SDIO = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 10U), /*!< SDIO clock */ +#elif defined(GD32F30X_CL) + RCU_USBFS = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 12U), /*!< USBFS clock */ + RCU_ENET = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 14U), /*!< ENET clock */ + RCU_ENETTX = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 15U), /*!< ENETTX clock */ + RCU_ENETRX = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 16U), /*!< ENETRX clock */ +#endif /* GD32F30X_HD and GD32F30X_XD */ + + /* APB1 peripherals */ + RCU_TIMER1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 0U), /*!< TIMER1 clock */ + RCU_TIMER2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 1U), /*!< TIMER2 clock */ + RCU_TIMER3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 2U), /*!< TIMER3 clock */ + RCU_TIMER4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 3U), /*!< TIMER4 clock */ + RCU_TIMER5 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 4U), /*!< TIMER5 clock */ + RCU_TIMER6 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 5U), /*!< TIMER6 clock */ +#ifndef GD32F30X_HD + RCU_TIMER11 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 6U), /*!< TIMER11 clock */ + RCU_TIMER12 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 7U), /*!< TIMER12 clock */ + RCU_TIMER13 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 8U), /*!< TIMER13 clock */ +#endif /* GD32F30X_HD */ + RCU_WWDGT = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 11U), /*!< WWDGT clock */ + RCU_SPI1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 14U), /*!< SPI1 clock */ + RCU_SPI2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 15U), /*!< SPI2 clock */ + RCU_USART1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 17U), /*!< USART1 clock */ + RCU_USART2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 18U), /*!< USART2 clock */ + RCU_UART3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 19U), /*!< UART3 clock */ + RCU_UART4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 20U), /*!< UART4 clock */ + RCU_I2C0 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 21U), /*!< I2C0 clock */ + RCU_I2C1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 22U), /*!< I2C1 clock */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + RCU_USBD = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 23U), /*!< USBD clock */ +#endif /* GD32F30X_HD and GD32F30X_XD */ + RCU_CAN0 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 25U), /*!< CAN0 clock */ +#ifdef GD32F30X_CL + RCU_CAN1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 26U), /*!< CAN1 clock */ +#endif /* GD32F30X_CL */ + RCU_BKPI = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 27U), /*!< BKPI clock */ + RCU_PMU = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 28U), /*!< PMU clock */ + RCU_DAC = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 29U), /*!< DAC clock */ + RCU_RTC = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 15U), /*!< RTC clock */ + RCU_CTC = RCU_REGIDX_BIT(ADD_APB1EN_REG_OFFSET, 27U), /*!< CTC clock */ + + /* APB2 peripherals */ + RCU_AF = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 0U), /*!< alternate function clock */ + RCU_GPIOA = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 2U), /*!< GPIOA clock */ + RCU_GPIOB = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 3U), /*!< GPIOB clock */ + RCU_GPIOC = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 4U), /*!< GPIOC clock */ + RCU_GPIOD = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 5U), /*!< GPIOD clock */ + RCU_GPIOE = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 6U), /*!< GPIOE clock */ + RCU_GPIOF = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 7U), /*!< GPIOF clock */ + RCU_GPIOG = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 8U), /*!< GPIOG clock */ + RCU_ADC0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 9U), /*!< ADC0 clock */ + RCU_ADC1 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 10U), /*!< ADC1 clock */ + RCU_TIMER0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 11U), /*!< TIMER0 clock */ + RCU_SPI0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 12U), /*!< SPI0 clock */ + RCU_TIMER7 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 13U), /*!< TIMER7 clock */ + RCU_USART0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 14U), /*!< USART0 clock */ +#ifndef GD32F30X_CL + RCU_ADC2 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 15U), /*!< ADC2 clock */ +#endif /* GD32F30X_CL */ +#ifndef GD32F30X_HD + RCU_TIMER8 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 19U), /*!< TIMER8 clock */ + RCU_TIMER9 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 20U), /*!< TIMER9 clock */ + RCU_TIMER10 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 21U), /*!< TIMER10 clock */ +#endif /* GD32F30X_HD */ +}rcu_periph_enum; + +/* peripheral clock enable when sleep mode*/ +typedef enum +{ + /* AHB peripherals */ + RCU_SRAM_SLP = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 2U), /*!< SRAM clock */ + RCU_FMC_SLP = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 4U), /*!< FMC clock */ +}rcu_periph_sleep_enum; + +/* peripherals reset */ +typedef enum +{ + /* AHB peripherals */ +#ifdef GD32F30X_CL + RCU_USBFSRST = RCU_REGIDX_BIT(AHBRST_REG_OFFSET, 12U), /*!< USBFS clock reset */ + RCU_ENETRST = RCU_REGIDX_BIT(AHBRST_REG_OFFSET, 14U), /*!< ENET clock reset */ +#endif /* GD32F30X_CL */ + + /* APB1 peripherals */ + RCU_TIMER1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 0U), /*!< TIMER1 clock reset */ + RCU_TIMER2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 1U), /*!< TIMER2 clock reset */ + RCU_TIMER3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 2U), /*!< TIMER3 clock reset */ + RCU_TIMER4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 3U), /*!< TIMER4 clock reset */ + RCU_TIMER5RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 4U), /*!< TIMER5 clock reset */ + RCU_TIMER6RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 5U), /*!< TIMER6 clock reset */ +#ifndef GD32F30X_HD + RCU_TIMER11RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 6U), /*!< TIMER11 clock reset */ + RCU_TIMER12RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 7U), /*!< TIMER12 clock reset */ + RCU_TIMER13RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 8U), /*!< TIMER13 clock reset */ +#endif /* GD32F30X_HD */ + RCU_WWDGTRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 11U), /*!< WWDGT clock reset */ + RCU_SPI1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 14U), /*!< SPI1 clock reset */ + RCU_SPI2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 15U), /*!< SPI2 clock reset */ + RCU_USART1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 17U), /*!< USART1 clock reset */ + RCU_USART2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 18U), /*!< USART2 clock reset */ + RCU_UART3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 19U), /*!< UART3 clock reset */ + RCU_UART4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 20U), /*!< UART4 clock reset */ + RCU_I2C0RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 21U), /*!< I2C0 clock reset */ + RCU_I2C1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 22U), /*!< I2C1 clock reset */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + RCU_USBDRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 23U), /*!< USBD clock reset */ +#endif /* GD32F30X_HD and GD32F30X_XD */ + RCU_CAN0RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 25U), /*!< CAN0 clock reset */ +#ifdef GD32F30X_CL + RCU_CAN1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 26U), /*!< CAN1 clock reset */ +#endif /* GD32F30X_CL */ + RCU_BKPIRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 27U), /*!< BKPI clock reset */ + RCU_PMURST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 28U), /*!< PMU clock reset */ + RCU_DACRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 29U), /*!< DAC clock reset */ + RCU_CTCRST = RCU_REGIDX_BIT(ADD_APB1RST_REG_OFFSET, 27U), /*!< RTC clock reset */ + + /* APB2 peripherals */ + RCU_AFRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 0U), /*!< alternate function clock reset */ + RCU_GPIOARST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 2U), /*!< GPIOA clock reset */ + RCU_GPIOBRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 3U), /*!< GPIOB clock reset */ + RCU_GPIOCRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 4U), /*!< GPIOC clock reset */ + RCU_GPIODRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 5U), /*!< GPIOD clock reset */ + RCU_GPIOERST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 6U), /*!< GPIOE clock reset */ + RCU_GPIOFRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 7U), /*!< GPIOF clock reset */ + RCU_GPIOGRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 8U), /*!< GPIOG clock reset */ + RCU_ADC0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 9U), /*!< ADC0 clock reset */ + RCU_ADC1RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 10U), /*!< ADC1 clock reset */ + RCU_TIMER0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 11U), /*!< TIMER0 clock reset */ + RCU_SPI0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 12U), /*!< SPI0 clock reset */ + RCU_TIMER7RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 13U), /*!< TIMER7 clock reset */ + RCU_USART0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 14U), /*!< USART0 clock reset */ +#ifndef GD32F30X_CL + RCU_ADC2RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 15U), /*!< ADC2 clock reset */ +#endif /* GD32F30X_CL */ +#ifndef GD32F30X_HD + RCU_TIMER8RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 19U), /*!< TIMER8 clock reset */ + RCU_TIMER9RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 20U), /*!< TIMER9 clock reset */ + RCU_TIMER10RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 21U), /*!< TIMER10 clock reset */ +#endif /* GD32F30X_HD */ +}rcu_periph_reset_enum; + +/* clock stabilization and peripheral reset flags */ +typedef enum +{ + /* clock stabilization flags */ + RCU_FLAG_IRC8MSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 1U), /*!< IRC8M stabilization flags */ + RCU_FLAG_HXTALSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 17U), /*!< HXTAL stabilization flags */ + RCU_FLAG_PLLSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 25U), /*!< PLL stabilization flags */ +#ifdef GD32F30X_CL + RCU_FLAG_PLL1STB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 27U), /*!< PLL1 stabilization flags */ + RCU_FLAG_PLL2STB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 29U), /*!< PLL2 stabilization flags */ +#endif /* GD32F30X_CL */ + RCU_FLAG_LXTALSTB = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 1U), /*!< LXTAL stabilization flags */ + RCU_FLAG_IRC40KSTB = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 1U), /*!< IRC40K stabilization flags */ + RCU_FLAG_IRC48MSTB = RCU_REGIDX_BIT(ADDCTL_REG_OFFSET, 17U), /*!< IRC48M stabilization flags */ + /* reset source flags */ + RCU_FLAG_EPRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 26U), /*!< external PIN reset flags */ + RCU_FLAG_PORRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 27U), /*!< power reset flags */ + RCU_FLAG_SWRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 28U), /*!< software reset flags */ + RCU_FLAG_FWDGTRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 29U), /*!< FWDGT reset flags */ + RCU_FLAG_WWDGTRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 30U), /*!< WWDGT reset flags */ + RCU_FLAG_LPRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 31U), /*!< low-power reset flags */ +}rcu_flag_enum; + +/* clock stabilization and ckm interrupt flags */ +typedef enum +{ + RCU_INT_FLAG_IRC40KSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 0U), /*!< IRC40K stabilization interrupt flag */ + RCU_INT_FLAG_LXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 1U), /*!< LXTAL stabilization interrupt flag */ + RCU_INT_FLAG_IRC8MSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 2U), /*!< IRC8M stabilization interrupt flag */ + RCU_INT_FLAG_HXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 3U), /*!< HXTAL stabilization interrupt flag */ + RCU_INT_FLAG_PLLSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 4U), /*!< PLL stabilization interrupt flag */ +#ifdef GD32F30X_CL + RCU_INT_FLAG_PLL1STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 5U), /*!< PLL1 stabilization interrupt flag */ + RCU_INT_FLAG_PLL2STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 6U), /*!< PLL2 stabilization interrupt flag */ +#endif /* GD32F30X_CL */ + RCU_INT_FLAG_CKM = RCU_REGIDX_BIT(INT_REG_OFFSET, 7U), /*!< HXTAL clock stuck interrupt flag */ + RCU_INT_FLAG_IRC48MSTB = RCU_REGIDX_BIT(ADDINT_REG_OFFSET, 6U), /*!< IRC48M stabilization interrupt flag */ +}rcu_int_flag_enum; + +/* clock stabilization and stuck interrupt flags clear */ +typedef enum +{ + RCU_INT_FLAG_IRC40KSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 16U), /*!< IRC40K stabilization interrupt flags clear */ + RCU_INT_FLAG_LXTALSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 17U), /*!< LXTAL stabilization interrupt flags clear */ + RCU_INT_FLAG_IRC8MSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 18U), /*!< IRC8M stabilization interrupt flags clear */ + RCU_INT_FLAG_HXTALSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 19U), /*!< HXTAL stabilization interrupt flags clear */ + RCU_INT_FLAG_PLLSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 20U), /*!< PLL stabilization interrupt flags clear */ +#ifdef GD32F30X_CL + RCU_INT_FLAG_PLL1STB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 21U), /*!< PLL1 stabilization interrupt flags clear */ + RCU_INT_FLAG_PLL2STB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 22U), /*!< PLL2 stabilization interrupt flags clear */ +#endif /* GD32F30X_CL */ + RCU_INT_FLAG_CKM_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 23U), /*!< CKM interrupt flags clear */ + RCU_INT_FLAG_IRC48MSTB_CLR = RCU_REGIDX_BIT(ADDINT_REG_OFFSET, 22U), /*!< internal 48 MHz RC oscillator stabilization interrupt clear */ +}rcu_int_flag_clear_enum; + +/* clock stabilization interrupt enable or disable */ +typedef enum +{ + RCU_INT_IRC40KSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 8U), /*!< IRC40K stabilization interrupt */ + RCU_INT_LXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 9U), /*!< LXTAL stabilization interrupt */ + RCU_INT_IRC8MSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 10U), /*!< IRC8M stabilization interrupt */ + RCU_INT_HXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 11U), /*!< HXTAL stabilization interrupt */ + RCU_INT_PLLSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 12U), /*!< PLL stabilization interrupt */ +#ifdef GD32F30X_CL + RCU_INT_PLL1STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 13U), /*!< PLL1 stabilization interrupt */ + RCU_INT_PLL2STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 14U), /*!< PLL2 stabilization interrupt */ +#endif /* GD32F30X_CL */ + RCU_INT_IRC48MSTB = RCU_REGIDX_BIT(ADDINT_REG_OFFSET, 14U), /*!< internal 48 MHz RC oscillator stabilization interrupt */ +}rcu_int_enum; + +/* oscillator types */ +typedef enum +{ + RCU_HXTAL = RCU_REGIDX_BIT(CTL_REG_OFFSET, 16U), /*!< HXTAL */ + RCU_LXTAL = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 0U), /*!< LXTAL */ + RCU_IRC8M = RCU_REGIDX_BIT(CTL_REG_OFFSET, 0U), /*!< IRC8M */ + RCU_IRC48M = RCU_REGIDX_BIT(ADDCTL_REG_OFFSET, 16U), /*!< IRC48M */ + RCU_IRC40K = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 0U), /*!< IRC40K */ + RCU_PLL_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 24U), /*!< PLL */ +#ifdef GD32F30X_CL + RCU_PLL1_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 26U), /*!< PLL1 */ + RCU_PLL2_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 28U), /*!< PLL2 */ +#endif /* GD32F30X_CL */ +}rcu_osci_type_enum; + +/* rcu clock frequency */ +typedef enum +{ + CK_SYS = 0, /*!< system clock */ + CK_AHB, /*!< AHB clock */ + CK_APB1, /*!< APB1 clock */ + CK_APB2, /*!< APB2 clock */ +}rcu_clock_freq_enum; + +/* RCU_CFG0 register bit define */ +/* system clock source select */ +#define CFG0_SCS(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define RCU_CKSYSSRC_IRC8M CFG0_SCS(0) /*!< system clock source select IRC8M */ +#define RCU_CKSYSSRC_HXTAL CFG0_SCS(1) /*!< system clock source select HXTAL */ +#define RCU_CKSYSSRC_PLL CFG0_SCS(2) /*!< system clock source select PLL */ + +/* system clock source select status */ +#define CFG0_SCSS(regval) (BITS(2,3) & ((uint32_t)(regval) << 2)) +#define RCU_SCSS_IRC8M CFG0_SCSS(0) /*!< system clock source select IRC8M */ +#define RCU_SCSS_HXTAL CFG0_SCSS(1) /*!< system clock source select HXTAL */ +#define RCU_SCSS_PLL CFG0_SCSS(2) /*!< system clock source select PLLP */ + +/* AHB prescaler selection */ +#define CFG0_AHBPSC(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) +#define RCU_AHB_CKSYS_DIV1 CFG0_AHBPSC(0) /*!< AHB prescaler select CK_SYS */ +#define RCU_AHB_CKSYS_DIV2 CFG0_AHBPSC(8) /*!< AHB prescaler select CK_SYS/2 */ +#define RCU_AHB_CKSYS_DIV4 CFG0_AHBPSC(9) /*!< AHB prescaler select CK_SYS/4 */ +#define RCU_AHB_CKSYS_DIV8 CFG0_AHBPSC(10) /*!< AHB prescaler select CK_SYS/8 */ +#define RCU_AHB_CKSYS_DIV16 CFG0_AHBPSC(11) /*!< AHB prescaler select CK_SYS/16 */ +#define RCU_AHB_CKSYS_DIV64 CFG0_AHBPSC(12) /*!< AHB prescaler select CK_SYS/64 */ +#define RCU_AHB_CKSYS_DIV128 CFG0_AHBPSC(13) /*!< AHB prescaler select CK_SYS/128 */ +#define RCU_AHB_CKSYS_DIV256 CFG0_AHBPSC(14) /*!< AHB prescaler select CK_SYS/256 */ +#define RCU_AHB_CKSYS_DIV512 CFG0_AHBPSC(15) /*!< AHB prescaler select CK_SYS/512 */ + +/* APB1 prescaler selection */ +#define CFG0_APB1PSC(regval) (BITS(8,10) & ((uint32_t)(regval) << 8)) +#define RCU_APB1_CKAHB_DIV1 CFG0_APB1PSC(0) /*!< APB1 prescaler select CK_AHB */ +#define RCU_APB1_CKAHB_DIV2 CFG0_APB1PSC(4) /*!< APB1 prescaler select CK_AHB/2 */ +#define RCU_APB1_CKAHB_DIV4 CFG0_APB1PSC(5) /*!< APB1 prescaler select CK_AHB/4 */ +#define RCU_APB1_CKAHB_DIV8 CFG0_APB1PSC(6) /*!< APB1 prescaler select CK_AHB/8 */ +#define RCU_APB1_CKAHB_DIV16 CFG0_APB1PSC(7) /*!< APB1 prescaler select CK_AHB/16 */ + +/* APB2 prescaler selection */ +#define CFG0_APB2PSC(regval) (BITS(11,13) & ((uint32_t)(regval) << 11)) +#define RCU_APB2_CKAHB_DIV1 CFG0_APB2PSC(0) /*!< APB2 prescaler select CK_AHB */ +#define RCU_APB2_CKAHB_DIV2 CFG0_APB2PSC(4) /*!< APB2 prescaler select CK_AHB/2 */ +#define RCU_APB2_CKAHB_DIV4 CFG0_APB2PSC(5) /*!< APB2 prescaler select CK_AHB/4 */ +#define RCU_APB2_CKAHB_DIV8 CFG0_APB2PSC(6) /*!< APB2 prescaler select CK_AHB/8 */ +#define RCU_APB2_CKAHB_DIV16 CFG0_APB2PSC(7) /*!< APB2 prescaler select CK_AHB/16 */ + +/* ADC prescaler select */ +#define RCU_CKADC_CKAPB2_DIV2 ((uint32_t)0x00000000U) /*!< ADC prescaler select CK_APB2/2 */ +#define RCU_CKADC_CKAPB2_DIV4 ((uint32_t)0x00000001U) /*!< ADC prescaler select CK_APB2/4 */ +#define RCU_CKADC_CKAPB2_DIV6 ((uint32_t)0x00000002U) /*!< ADC prescaler select CK_APB2/6 */ +#define RCU_CKADC_CKAPB2_DIV8 ((uint32_t)0x00000003U) /*!< ADC prescaler select CK_APB2/8 */ +#define RCU_CKADC_CKAPB2_DIV12 ((uint32_t)0x00000005U) /*!< ADC prescaler select CK_APB2/12 */ +#define RCU_CKADC_CKAPB2_DIV16 ((uint32_t)0x00000007U) /*!< ADC prescaler select CK_APB2/16 */ +#define RCU_CKADC_CKAHB_DIV5 ((uint32_t)0x00000008U) /*!< ADC prescaler select CK_AHB/5 */ +#define RCU_CKADC_CKAHB_DIV6 ((uint32_t)0x00000009U) /*!< ADC prescaler select CK_AHB/6 */ +#define RCU_CKADC_CKAHB_DIV10 ((uint32_t)0x0000000AU) /*!< ADC prescaler select CK_AHB/10 */ +#define RCU_CKADC_CKAHB_DIV20 ((uint32_t)0x0000000BU) /*!< ADC prescaler select CK_AHB/20 */ + +/* PLL clock source selection */ +#define RCU_PLLSRC_IRC8M_DIV2 ((uint32_t)0x00000000U) /*!< IRC8M/2 clock selected as source clock of PLL */ +#define RCU_PLLSRC_HXTAL_IRC48M RCU_CFG0_PLLSEL /*!< HXTAL or IRC48M selected as source clock of PLL */ + +/* PLL clock multiplication factor */ +#define PLLMF_4 RCU_CFG0_PLLMF_4 /* bit 4 of PLLMF */ +#define PLLMF_5 RCU_CFG0_PLLMF_5 /* bit 5 of PLLMF */ +#define PLLMF_4_5 (PLLMF_4 | PLLMF_5) /* bit 4 and 5 of PLLMF */ + +#define CFG0_PLLMF(regval) (BITS(18,21) & ((uint32_t)(regval) << 18)) +#define RCU_PLL_MUL2 CFG0_PLLMF(0) /*!< PLL source clock multiply by 2 */ +#define RCU_PLL_MUL3 CFG0_PLLMF(1) /*!< PLL source clock multiply by 3 */ +#define RCU_PLL_MUL4 CFG0_PLLMF(2) /*!< PLL source clock multiply by 4 */ +#define RCU_PLL_MUL5 CFG0_PLLMF(3) /*!< PLL source clock multiply by 5 */ +#define RCU_PLL_MUL6 CFG0_PLLMF(4) /*!< PLL source clock multiply by 6 */ +#define RCU_PLL_MUL7 CFG0_PLLMF(5) /*!< PLL source clock multiply by 7 */ +#define RCU_PLL_MUL8 CFG0_PLLMF(6) /*!< PLL source clock multiply by 8 */ +#define RCU_PLL_MUL9 CFG0_PLLMF(7) /*!< PLL source clock multiply by 9 */ +#define RCU_PLL_MUL10 CFG0_PLLMF(8) /*!< PLL source clock multiply by 10 */ +#define RCU_PLL_MUL11 CFG0_PLLMF(9) /*!< PLL source clock multiply by 11 */ +#define RCU_PLL_MUL12 CFG0_PLLMF(10) /*!< PLL source clock multiply by 12 */ +#define RCU_PLL_MUL13 CFG0_PLLMF(11) /*!< PLL source clock multiply by 13 */ +#define RCU_PLL_MUL14 CFG0_PLLMF(12) /*!< PLL source clock multiply by 14 */ +#if(defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define RCU_PLL_MUL15 CFG0_PLLMF(13) /*!< PLL source clock multiply by 15 */ +#elif defined(GD32F30X_CL) +#define RCU_PLL_MUL6_5 CFG0_PLLMF(13) /*!< PLL source clock multiply by 6.5 */ +#endif /* GD32F30X_HD and GD32F30X_XD */ +#define RCU_PLL_MUL16 CFG0_PLLMF(14) /*!< PLL source clock multiply by 16 */ +#define RCU_PLL_MUL17 (PLLMF_4 | CFG0_PLLMF(0)) /*!< PLL source clock multiply by 17 */ +#define RCU_PLL_MUL18 (PLLMF_4 | CFG0_PLLMF(1)) /*!< PLL source clock multiply by 18 */ +#define RCU_PLL_MUL19 (PLLMF_4 | CFG0_PLLMF(2)) /*!< PLL source clock multiply by 19 */ +#define RCU_PLL_MUL20 (PLLMF_4 | CFG0_PLLMF(3)) /*!< PLL source clock multiply by 20 */ +#define RCU_PLL_MUL21 (PLLMF_4 | CFG0_PLLMF(4)) /*!< PLL source clock multiply by 21 */ +#define RCU_PLL_MUL22 (PLLMF_4 | CFG0_PLLMF(5)) /*!< PLL source clock multiply by 22 */ +#define RCU_PLL_MUL23 (PLLMF_4 | CFG0_PLLMF(6)) /*!< PLL source clock multiply by 23 */ +#define RCU_PLL_MUL24 (PLLMF_4 | CFG0_PLLMF(7)) /*!< PLL source clock multiply by 24 */ +#define RCU_PLL_MUL25 (PLLMF_4 | CFG0_PLLMF(8)) /*!< PLL source clock multiply by 25 */ +#define RCU_PLL_MUL26 (PLLMF_4 | CFG0_PLLMF(9)) /*!< PLL source clock multiply by 26 */ +#define RCU_PLL_MUL27 (PLLMF_4 | CFG0_PLLMF(10)) /*!< PLL source clock multiply by 27 */ +#define RCU_PLL_MUL28 (PLLMF_4 | CFG0_PLLMF(11)) /*!< PLL source clock multiply by 28 */ +#define RCU_PLL_MUL29 (PLLMF_4 | CFG0_PLLMF(12)) /*!< PLL source clock multiply by 29 */ +#define RCU_PLL_MUL30 (PLLMF_4 | CFG0_PLLMF(13)) /*!< PLL source clock multiply by 30 */ +#define RCU_PLL_MUL31 (PLLMF_4 | CFG0_PLLMF(14)) /*!< PLL source clock multiply by 31 */ +#define RCU_PLL_MUL32 (PLLMF_4 | CFG0_PLLMF(15)) /*!< PLL source clock multiply by 32 */ +#define RCU_PLL_MUL33 (PLLMF_5 | CFG0_PLLMF(0)) /*!< PLL source clock multiply by 33 */ +#define RCU_PLL_MUL34 (PLLMF_5 | CFG0_PLLMF(1)) /*!< PLL source clock multiply by 34 */ +#define RCU_PLL_MUL35 (PLLMF_5 | CFG0_PLLMF(2)) /*!< PLL source clock multiply by 35 */ +#define RCU_PLL_MUL36 (PLLMF_5 | CFG0_PLLMF(3)) /*!< PLL source clock multiply by 36 */ +#define RCU_PLL_MUL37 (PLLMF_5 | CFG0_PLLMF(4)) /*!< PLL source clock multiply by 37 */ +#define RCU_PLL_MUL38 (PLLMF_5 | CFG0_PLLMF(5)) /*!< PLL source clock multiply by 38 */ +#define RCU_PLL_MUL39 (PLLMF_5 | CFG0_PLLMF(6)) /*!< PLL source clock multiply by 39 */ +#define RCU_PLL_MUL40 (PLLMF_5 | CFG0_PLLMF(7)) /*!< PLL source clock multiply by 40 */ +#define RCU_PLL_MUL41 (PLLMF_5 | CFG0_PLLMF(8)) /*!< PLL source clock multiply by 41 */ +#define RCU_PLL_MUL42 (PLLMF_5 | CFG0_PLLMF(9)) /*!< PLL source clock multiply by 42 */ +#define RCU_PLL_MUL43 (PLLMF_5 | CFG0_PLLMF(10)) /*!< PLL source clock multiply by 43 */ +#define RCU_PLL_MUL44 (PLLMF_5 | CFG0_PLLMF(11)) /*!< PLL source clock multiply by 44 */ +#define RCU_PLL_MUL45 (PLLMF_5 | CFG0_PLLMF(12)) /*!< PLL source clock multiply by 45 */ +#define RCU_PLL_MUL46 (PLLMF_5 | CFG0_PLLMF(13)) /*!< PLL source clock multiply by 46 */ +#define RCU_PLL_MUL47 (PLLMF_5 | CFG0_PLLMF(14)) /*!< PLL source clock multiply by 47 */ +#define RCU_PLL_MUL48 (PLLMF_5 | CFG0_PLLMF(15)) /*!< PLL source clock multiply by 48 */ +#define RCU_PLL_MUL49 (PLLMF_4_5 | CFG0_PLLMF(0)) /*!< PLL source clock multiply by 49 */ +#define RCU_PLL_MUL50 (PLLMF_4_5 | CFG0_PLLMF(1)) /*!< PLL source clock multiply by 50 */ +#define RCU_PLL_MUL51 (PLLMF_4_5 | CFG0_PLLMF(2)) /*!< PLL source clock multiply by 51 */ +#define RCU_PLL_MUL52 (PLLMF_4_5 | CFG0_PLLMF(3)) /*!< PLL source clock multiply by 52 */ +#define RCU_PLL_MUL53 (PLLMF_4_5 | CFG0_PLLMF(4)) /*!< PLL source clock multiply by 53 */ +#define RCU_PLL_MUL54 (PLLMF_4_5 | CFG0_PLLMF(5)) /*!< PLL source clock multiply by 54 */ +#define RCU_PLL_MUL55 (PLLMF_4_5 | CFG0_PLLMF(6)) /*!< PLL source clock multiply by 55 */ +#define RCU_PLL_MUL56 (PLLMF_4_5 | CFG0_PLLMF(7)) /*!< PLL source clock multiply by 56 */ +#define RCU_PLL_MUL57 (PLLMF_4_5 | CFG0_PLLMF(8)) /*!< PLL source clock multiply by 57 */ +#define RCU_PLL_MUL58 (PLLMF_4_5 | CFG0_PLLMF(9)) /*!< PLL source clock multiply by 58 */ +#define RCU_PLL_MUL59 (PLLMF_4_5 | CFG0_PLLMF(10)) /*!< PLL source clock multiply by 59 */ +#define RCU_PLL_MUL60 (PLLMF_4_5 | CFG0_PLLMF(11)) /*!< PLL source clock multiply by 60 */ +#define RCU_PLL_MUL61 (PLLMF_4_5 | CFG0_PLLMF(12)) /*!< PLL source clock multiply by 61 */ +#define RCU_PLL_MUL62 (PLLMF_4_5 | CFG0_PLLMF(13)) /*!< PLL source clock multiply by 62 */ +#define RCU_PLL_MUL63 (PLLMF_4_5 | CFG0_PLLMF(14)) /*!< PLL source clock multiply by 63 */ + +#if(defined(GD32F30X_HD) || defined(GD32F30X_XD)) +#define USBPSC_2 RCU_CFG0_USBDPSC_2 +#elif defined(GD32F30X_CL) +#define USBPSC_2 RCU_CFG0_USBFSPSC_2 +#endif /* GD32F30X_HD and GD32F30X_XD */ + +/* USBD/USBFS prescaler select */ +#define CFG0_USBPSC(regval) (BITS(22,23) & ((uint32_t)(regval) << 22)) +#define RCU_CKUSB_CKPLL_DIV1_5 CFG0_USBPSC(0) /*!< USBD/USBFS prescaler select CK_PLL/1.5 */ +#define RCU_CKUSB_CKPLL_DIV1 CFG0_USBPSC(1) /*!< USBD/USBFS prescaler select CK_PLL/1 */ +#define RCU_CKUSB_CKPLL_DIV2_5 CFG0_USBPSC(2) /*!< USBD/USBFS prescaler select CK_PLL/2.5 */ +#define RCU_CKUSB_CKPLL_DIV2 CFG0_USBPSC(3) /*!< USBD/USBFS prescaler select CK_PLL/2 */ +#define RCU_CKUSB_CKPLL_DIV3 (USBPSC_2 |CFG0_USBPSC(0)) /*!< USBD/USBFS prescaler select CK_PLL/3 */ +#define RCU_CKUSB_CKPLL_DIV3_5 (USBPSC_2 |CFG0_USBPSC(1)) /*!< USBD/USBFS prescaler select CK_PLL/3.5 */ +#define RCU_CKUSB_CKPLL_DIV4 (USBPSC_2 |CFG0_USBPSC(2)) /*!< USBD/USBFS prescaler select CK_PLL/4 */ + +/* CKOUT0 Clock source selection */ +#define CFG0_CKOUT0SEL(regval) (BITS(24,27) & ((uint32_t)(regval) << 24)) +#define RCU_CKOUT0SRC_NONE CFG0_CKOUT0SEL(0) /*!< no clock selected */ +#define RCU_CKOUT0SRC_CKSYS CFG0_CKOUT0SEL(4) /*!< system clock selected */ +#define RCU_CKOUT0SRC_IRC8M CFG0_CKOUT0SEL(5) /*!< internal 8M RC oscillator clock selected */ +#define RCU_CKOUT0SRC_HXTAL CFG0_CKOUT0SEL(6) /*!< high speed crystal oscillator clock (HXTAL) selected */ +#define RCU_CKOUT0SRC_CKPLL_DIV2 CFG0_CKOUT0SEL(7) /*!< CK_PLL/2 clock selected */ +#ifdef GD32F30X_CL +#define RCU_CKOUT0SRC_CKPLL1 CFG0_CKOUT0SEL(8) /*!< CK_PLL1 clock selected */ +#define RCU_CKOUT0SRC_CKPLL2_DIV2 CFG0_CKOUT0SEL(9) /*!< CK_PLL2/2 clock selected */ +#define RCU_CKOUT0SRC_EXT1 CFG0_CKOUT0SEL(10) /*!< EXT1 selected, to provide the external clock for ENET */ +#define RCU_CKOUT0SRC_CKPLL2 CFG0_CKOUT0SEL(11) /*!< CK_PLL2 clock selected */ +#endif /* GD32F30X_CL */ + +/* LXTAL drive capability */ +#define BDCTL_LXTALDRI(regval) (BITS(3,4) & ((uint32_t)(regval) << 3)) +#define RCU_LXTAL_LOWDRI BDCTL_LXTALDRI(0) /*!< lower driving capability */ +#define RCU_LXTAL_MED_LOWDRI BDCTL_LXTALDRI(1) /*!< medium low driving capability */ +#define RCU_LXTAL_MED_HIGHDRI BDCTL_LXTALDRI(2) /*!< medium high driving capability */ +#define RCU_LXTAL_HIGHDRI BDCTL_LXTALDRI(3) /*!< higher driving capability */ + +/* RTC clock entry selection */ +#define BDCTL_RTCSRC(regval) (BITS(8,9) & ((uint32_t)(regval) << 8)) +#define RCU_RTCSRC_NONE BDCTL_RTCSRC(0) /*!< no clock selected */ +#define RCU_RTCSRC_LXTAL BDCTL_RTCSRC(1) /*!< RTC source clock select LXTAL */ +#define RCU_RTCSRC_IRC40K BDCTL_RTCSRC(2) /*!< RTC source clock select IRC40K */ +#define RCU_RTCSRC_HXTAL_DIV_128 BDCTL_RTCSRC(3) /*!< RTC source clock select HXTAL/128 */ + +/* PREDV0 division factor */ +#define CFG1_PREDV0(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) +#define RCU_PREDV0_DIV1 CFG1_PREDV0(0) /*!< PREDV0 input source clock not divided */ +#define RCU_PREDV0_DIV2 CFG1_PREDV0(1) /*!< PREDV0 input source clock divided by 2 */ +#define RCU_PREDV0_DIV3 CFG1_PREDV0(2) /*!< PREDV0 input source clock divided by 3 */ +#define RCU_PREDV0_DIV4 CFG1_PREDV0(3) /*!< PREDV0 input source clock divided by 4 */ +#define RCU_PREDV0_DIV5 CFG1_PREDV0(4) /*!< PREDV0 input source clock divided by 5 */ +#define RCU_PREDV0_DIV6 CFG1_PREDV0(5) /*!< PREDV0 input source clock divided by 6 */ +#define RCU_PREDV0_DIV7 CFG1_PREDV0(6) /*!< PREDV0 input source clock divided by 7 */ +#define RCU_PREDV0_DIV8 CFG1_PREDV0(7) /*!< PREDV0 input source clock divided by 8 */ +#define RCU_PREDV0_DIV9 CFG1_PREDV0(8) /*!< PREDV0 input source clock divided by 9 */ +#define RCU_PREDV0_DIV10 CFG1_PREDV0(9) /*!< PREDV0 input source clock divided by 10 */ +#define RCU_PREDV0_DIV11 CFG1_PREDV0(10) /*!< PREDV0 input source clock divided by 11 */ +#define RCU_PREDV0_DIV12 CFG1_PREDV0(11) /*!< PREDV0 input source clock divided by 12 */ +#define RCU_PREDV0_DIV13 CFG1_PREDV0(12) /*!< PREDV0 input source clock divided by 13 */ +#define RCU_PREDV0_DIV14 CFG1_PREDV0(13) /*!< PREDV0 input source clock divided by 14 */ +#define RCU_PREDV0_DIV15 CFG1_PREDV0(14) /*!< PREDV0 input source clock divided by 15 */ +#define RCU_PREDV0_DIV16 CFG1_PREDV0(15) /*!< PREDV0 input source clock divided by 16 */ + +/* PREDV1 division factor */ +#define CFG1_PREDV1(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) +#define RCU_PREDV1_DIV1 CFG1_PREDV1(0) /*!< PREDV1 input source clock not divided */ +#define RCU_PREDV1_DIV2 CFG1_PREDV1(1) /*!< PREDV1 input source clock divided by 2 */ +#define RCU_PREDV1_DIV3 CFG1_PREDV1(2) /*!< PREDV1 input source clock divided by 3 */ +#define RCU_PREDV1_DIV4 CFG1_PREDV1(3) /*!< PREDV1 input source clock divided by 4 */ +#define RCU_PREDV1_DIV5 CFG1_PREDV1(4) /*!< PREDV1 input source clock divided by 5 */ +#define RCU_PREDV1_DIV6 CFG1_PREDV1(5) /*!< PREDV1 input source clock divided by 6 */ +#define RCU_PREDV1_DIV7 CFG1_PREDV1(6) /*!< PREDV1 input source clock divided by 7 */ +#define RCU_PREDV1_DIV8 CFG1_PREDV1(7) /*!< PREDV1 input source clock divided by 8 */ +#define RCU_PREDV1_DIV9 CFG1_PREDV1(8) /*!< PREDV1 input source clock divided by 9 */ +#define RCU_PREDV1_DIV10 CFG1_PREDV1(9) /*!< PREDV1 input source clock divided by 10 */ +#define RCU_PREDV1_DIV11 CFG1_PREDV1(10) /*!< PREDV1 input source clock divided by 11 */ +#define RCU_PREDV1_DIV12 CFG1_PREDV1(11) /*!< PREDV1 input source clock divided by 12 */ +#define RCU_PREDV1_DIV13 CFG1_PREDV1(12) /*!< PREDV1 input source clock divided by 13 */ +#define RCU_PREDV1_DIV14 CFG1_PREDV1(13) /*!< PREDV1 input source clock divided by 14 */ +#define RCU_PREDV1_DIV15 CFG1_PREDV1(14) /*!< PREDV1 input source clock divided by 15 */ +#define RCU_PREDV1_DIV16 CFG1_PREDV1(15) /*!< PREDV1 input source clock divided by 16 */ + +/* PLL1 clock multiplication factor */ +#define CFG1_PLL1MF(regval) (BITS(8,11) & ((uint32_t)(regval) << 8)) +#define RCU_PLL1_MUL8 CFG1_PLL1MF(6) /*!< PLL1 source clock multiply by 8 */ +#define RCU_PLL1_MUL9 CFG1_PLL1MF(7) /*!< PLL1 source clock multiply by 9 */ +#define RCU_PLL1_MUL10 CFG1_PLL1MF(8) /*!< PLL1 source clock multiply by 10 */ +#define RCU_PLL1_MUL11 CFG1_PLL1MF(9) /*!< PLL1 source clock multiply by 11 */ +#define RCU_PLL1_MUL12 CFG1_PLL1MF(10) /*!< PLL1 source clock multiply by 12 */ +#define RCU_PLL1_MUL13 CFG1_PLL1MF(11) /*!< PLL1 source clock multiply by 13 */ +#define RCU_PLL1_MUL14 CFG1_PLL1MF(12) /*!< PLL1 source clock multiply by 14 */ +#define RCU_PLL1_MUL15 CFG1_PLL1MF(13) /*!< PLL1 source clock multiply by 15 */ +#define RCU_PLL1_MUL16 CFG1_PLL1MF(14) /*!< PLL1 source clock multiply by 16 */ +#define RCU_PLL1_MUL20 CFG1_PLL1MF(15) /*!< PLL1 source clock multiply by 20 */ + +/* PLL2 clock multiplication factor */ +#define PLL2MF_4 RCU_CFG1_PLL2MF_4 /* bit 4 of PLL2MF */ + +#define CFG1_PLL2MF(regval) (BITS(12,15) & ((uint32_t)(regval) << 12)) +#define RCU_PLL2_MUL8 CFG1_PLL2MF(6) /*!< PLL2 source clock multiply by 8 */ +#define RCU_PLL2_MUL9 CFG1_PLL2MF(7) /*!< PLL2 source clock multiply by 9 */ +#define RCU_PLL2_MUL10 CFG1_PLL2MF(8) /*!< PLL2 source clock multiply by 10 */ +#define RCU_PLL2_MUL11 CFG1_PLL2MF(9) /*!< PLL2 source clock multiply by 11 */ +#define RCU_PLL2_MUL12 CFG1_PLL2MF(10) /*!< PLL2 source clock multiply by 12 */ +#define RCU_PLL2_MUL13 CFG1_PLL2MF(11) /*!< PLL2 source clock multiply by 13 */ +#define RCU_PLL2_MUL14 CFG1_PLL2MF(12) /*!< PLL2 source clock multiply by 14 */ +#define RCU_PLL2_MUL15 CFG1_PLL2MF(13) /*!< PLL2 source clock multiply by 15 */ +#define RCU_PLL2_MUL16 CFG1_PLL2MF(14) /*!< PLL2 source clock multiply by 16 */ +#define RCU_PLL2_MUL20 CFG1_PLL2MF(15) /*!< PLL2 source clock multiply by 20 */ +#define RCU_PLL2_MUL18 (PLL2MF_4 | CFG1_PLL2MF(0)) /*!< PLL2 source clock multiply by 18 */ +#define RCU_PLL2_MUL19 (PLL2MF_4 | CFG1_PLL2MF(1)) /*!< PLL2 source clock multiply by 19 */ +#define RCU_PLL2_MUL21 (PLL2MF_4 | CFG1_PLL2MF(3)) /*!< PLL2 source clock multiply by 21 */ +#define RCU_PLL2_MUL22 (PLL2MF_4 | CFG1_PLL2MF(4)) /*!< PLL2 source clock multiply by 22 */ +#define RCU_PLL2_MUL23 (PLL2MF_4 | CFG1_PLL2MF(5)) /*!< PLL2 source clock multiply by 23 */ +#define RCU_PLL2_MUL24 (PLL2MF_4 | CFG1_PLL2MF(6)) /*!< PLL2 source clock multiply by 24 */ +#define RCU_PLL2_MUL25 (PLL2MF_4 | CFG1_PLL2MF(7)) /*!< PLL2 source clock multiply by 25 */ +#define RCU_PLL2_MUL26 (PLL2MF_4 | CFG1_PLL2MF(8)) /*!< PLL2 source clock multiply by 26 */ +#define RCU_PLL2_MUL27 (PLL2MF_4 | CFG1_PLL2MF(9)) /*!< PLL2 source clock multiply by 27 */ +#define RCU_PLL2_MUL28 (PLL2MF_4 | CFG1_PLL2MF(10)) /*!< PLL2 source clock multiply by 28 */ +#define RCU_PLL2_MUL29 (PLL2MF_4 | CFG1_PLL2MF(11)) /*!< PLL2 source clock multiply by 29 */ +#define RCU_PLL2_MUL30 (PLL2MF_4 | CFG1_PLL2MF(12)) /*!< PLL2 source clock multiply by 30 */ +#define RCU_PLL2_MUL31 (PLL2MF_4 | CFG1_PLL2MF(13)) /*!< PLL2 source clock multiply by 31 */ +#define RCU_PLL2_MUL32 (PLL2MF_4 | CFG1_PLL2MF(14)) /*!< PLL2 source clock multiply by 32 */ +#define RCU_PLL2_MUL40 (PLL2MF_4 | CFG1_PLL2MF(15)) /*!< PLL2 source clock multiply by 40 */ + +#ifdef GD32F30X_CL +/* PREDV0 input clock source selection */ +#define RCU_PREDV0SRC_HXTAL_IRC48M ((uint32_t)0x00000000U) /*!< HXTAL or IRC48M selected as PREDV0 input source clock */ +#define RCU_PREDV0SRC_CKPLL1 RCU_CFG1_PREDV0SEL /*!< CK_PLL1 selected as PREDV0 input source clock */ + +/* I2S1 clock source selection */ +#define RCU_I2S1SRC_CKSYS ((uint32_t)0x00000000U) /*!< system clock selected as I2S1 source clock */ +#define RCU_I2S1SRC_CKPLL2_MUL2 RCU_CFG1_I2S1SEL /*!< (CK_PLL2 x 2) selected as I2S1 source clock */ + +/* I2S2 clock source selection */ +#define RCU_I2S2SRC_CKSYS ((uint32_t)0x00000000U) /*!< system clock selected as I2S2 source clock */ +#define RCU_I2S2SRC_CKPLL2_MUL2 RCU_CFG1_I2S2SEL /*!< (CK_PLL2 x 2) selected as I2S2 source clock */ +#endif /* GD32F30X_CL */ + +/* PLL input clock source selection */ +#define RCU_PLLPRESRC_HXTAL ((uint32_t)0x00000000U) /*!< HXTAL selected as PLL source clock */ +#define RCU_PLLPRESRC_IRC48M RCU_CFG1_PLLPRESEL /*!< CK_PLL selected as PREDV0 input source clock */ + +/* deep-sleep mode voltage */ +#define DSV_DSLPVS(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) +#define RCU_DEEPSLEEP_V_1_0 DSV_DSLPVS(0) /*!< core voltage is 1.0V in deep-sleep mode */ +#define RCU_DEEPSLEEP_V_0_9 DSV_DSLPVS(1) /*!< core voltage is 0.9V in deep-sleep mode */ +#define RCU_DEEPSLEEP_V_0_8 DSV_DSLPVS(2) /*!< core voltage is 0.8V in deep-sleep mode */ +#define RCU_DEEPSLEEP_V_0_7 DSV_DSLPVS(3) /*!< core voltage is 0.7V in deep-sleep mode */ + +/* 48MHz clock selection */ +#define RCU_CK48MSRC_CKPLL ((uint32_t)0x00000000U) /*!< use CK_PLL clock */ +#define RCU_CK48MSRC_IRC48M RCU_ADDCTL_CK48MSEL /*!< select IRC48M clock */ + +/* function declarations */ +/* deinitialize the RCU */ +void rcu_deinit(void); +/* enable the peripherals clock */ +void rcu_periph_clock_enable(rcu_periph_enum periph); +/* disable the peripherals clock */ +void rcu_periph_clock_disable(rcu_periph_enum periph); +/* enable the peripherals clock when sleep mode */ +void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph); +/* disable the peripherals clock when sleep mode */ +void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph); +/* reset the peripherals */ +void rcu_periph_reset_enable(rcu_periph_reset_enum periph_reset); +/* disable reset the peripheral */ +void rcu_periph_reset_disable(rcu_periph_reset_enum periph_reset); +/* reset the BKP domain */ +void rcu_bkp_reset_enable(void); +/* disable the BKP domain reset */ +void rcu_bkp_reset_disable(void); + +/* configure the system clock source */ +void rcu_system_clock_source_config(uint32_t ck_sys); +/* get the system clock source */ +uint32_t rcu_system_clock_source_get(void); +/* configure the AHB prescaler selection */ +void rcu_ahb_clock_config(uint32_t ck_ahb); +/* configure the APB1 prescaler selection */ +void rcu_apb1_clock_config(uint32_t ck_apb1); +/* configure the APB2 prescaler selection */ +void rcu_apb2_clock_config(uint32_t ck_apb2); +/* configure the CK_OUT0 clock source and divider */ +void rcu_ckout0_config(uint32_t ckout0_src); +/* configure the PLL clock source selection and PLL multiply factor */ +void rcu_pll_config(uint32_t pll_src, uint32_t pll_mul); +/* configure the PLL clock source preselection */ +void rcu_pllpresel_config(uint32_t pll_presel); +#if(defined(GD32F30X_HD) || defined(GD32F30X_XD)) +/* configure the PREDV0 division factor and clock source */ +void rcu_predv0_config(uint32_t predv0_div); +#elif defined(GD32F30X_CL) +/* configure the PREDV0 division factor and clock source */ +void rcu_predv0_config(uint32_t predv0_source, uint32_t predv0_div); +/* configure the PREDV1 division factor */ +void rcu_predv1_config(uint32_t predv1_div); +/* configure the PLL1 clock */ +void rcu_pll1_config(uint32_t pll_mul); +/* configure the PLL2 clock */ +void rcu_pll2_config(uint32_t pll_mul); +#endif /* GD32F30X_HD and GD32F30X_XD */ + +/* configure the ADC division factor */ +void rcu_adc_clock_config(uint32_t adc_psc); +/* configure the USBD/USBFS prescaler factor */ +void rcu_usb_clock_config(uint32_t usb_psc); +/* configure the RTC clock source selection */ +void rcu_rtc_clock_config(uint32_t rtc_clock_source); +#ifdef GD32F30X_CL +/* configure the I2S1 clock source selection */ +void rcu_i2s1_clock_config(uint32_t i2s_clock_source); +/* configure the I2S2 clock source selection */ +void rcu_i2s2_clock_config(uint32_t i2s_clock_source); +#endif /* GD32F30X_CL */ +/* configure the CK48M clock selection */ +void rcu_ck48m_clock_config(uint32_t ck48m_clock_source); + + +/* get the clock stabilization and periphral reset flags */ +FlagStatus rcu_flag_get(rcu_flag_enum flag); +/* clear the reset flag */ +void rcu_all_reset_flag_clear(void); +/* get the clock stabilization interrupt and ckm flags */ +FlagStatus rcu_interrupt_flag_get(rcu_int_flag_enum int_flag); +/* clear the interrupt flags */ +void rcu_interrupt_flag_clear(rcu_int_flag_clear_enum int_flag); +/* enable the stabilization interrupt */ +void rcu_interrupt_enable(rcu_int_enum interrupt); +/* disable the stabilization interrupt */ +void rcu_interrupt_disable(rcu_int_enum interrupt); + +/* configure the LXTAL drive capability */ +void rcu_lxtal_drive_capability_config(uint32_t lxtal_dricap); +/* wait for oscillator stabilization flags is SET or oscillator startup is timeout */ +ErrStatus rcu_osci_stab_wait(rcu_osci_type_enum osci); +/* turn on the oscillator */ +void rcu_osci_on(rcu_osci_type_enum osci); +/* turn off the oscillator */ +void rcu_osci_off(rcu_osci_type_enum osci); +/* enable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it */ +void rcu_osci_bypass_mode_enable(rcu_osci_type_enum osci); +/* disable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it */ +void rcu_osci_bypass_mode_disable(rcu_osci_type_enum osci); +/* enable the HXTAL clock monitor */ +void rcu_hxtal_clock_monitor_enable(void); +/* disable the HXTAL clock monitor */ +void rcu_hxtal_clock_monitor_disable(void); + +/* set the IRC8M adjust value */ +void rcu_irc8m_adjust_value_set(uint32_t irc8m_adjval); + +/* set the deep sleep mode voltage */ +void rcu_deepsleep_voltage_set(uint32_t dsvol); + +/* get the system clock, bus and peripheral clock frequency */ +uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock); + +#endif /* GD32F30X_RCU_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_rtc.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_rtc.h new file mode 100644 index 0000000..24aab19 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_rtc.h @@ -0,0 +1,138 @@ +/*! + \file gd32f30x_rtc.h + \brief definitions for the RTC + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef GD32F30X_RTC_H +#define GD32F30X_RTC_H + +#include "gd32f30x.h" + +/* RTC definitions */ +#define RTC RTC_BASE + +/* registers definitions */ +#define RTC_INTEN REG32(RTC + 0x00U) /*!< interrupt enable register */ +#define RTC_CTL REG32(RTC + 0x04U) /*!< control register */ +#define RTC_PSCH REG32(RTC + 0x08U) /*!< prescaler high register */ +#define RTC_PSCL REG32(RTC + 0x0CU) /*!< prescaler low register */ +#define RTC_DIVH REG32(RTC + 0x10U) /*!< divider high register */ +#define RTC_DIVL REG32(RTC + 0x14U) /*!< divider low register */ +#define RTC_CNTH REG32(RTC + 0x18U) /*!< counter high register */ +#define RTC_CNTL REG32(RTC + 0x1CU) /*!< counter low register */ +#define RTC_ALRMH REG32(RTC + 0x20U) /*!< alarm high register */ +#define RTC_ALRML REG32(RTC + 0x24U) /*!< alarm low register */ + +/* bits definitions */ +/* RTC_INTEN */ +#define RTC_INTEN_SCIE BIT(0) /*!< second interrupt enable */ +#define RTC_INTEN_ALRMIE BIT(1) /*!< alarm interrupt enable */ +#define RTC_INTEN_OVIE BIT(2) /*!< overflow interrupt enable */ + +/* RTC_CTL */ +#define RTC_CTL_SCIF BIT(0) /*!< second interrupt flag */ +#define RTC_CTL_ALRMIF BIT(1) /*!< alarm interrupt flag */ +#define RTC_CTL_OVIF BIT(2) /*!< overflow interrupt flag */ +#define RTC_CTL_RSYNF BIT(3) /*!< registers synchronized flag */ +#define RTC_CTL_CMF BIT(4) /*!< configuration mode flag */ +#define RTC_CTL_LWOFF BIT(5) /*!< last write operation finished flag */ + +/* RTC_PSC */ +#define RTC_PSCH_PSC BITS(0, 3) /*!< prescaler high value */ +#define RTC_PSCL_PSC BITS(0, 15) /*!< prescaler low value */ + +/* RTC_DIV */ +#define RTC_DIVH_DIV BITS(0, 3) /*!< divider high value */ +#define RTC_DIVL_DIV BITS(0, 15) /*!< divider low value */ + +/* RTC_CNT */ +#define RTC_CNTH_CNT BITS(0, 15) /*!< counter high value */ +#define RTC_CNTL_CNT BITS(0, 15) /*!< counter low value */ + +/* RTC_ALRM */ +#define RTC_ALRMH_ALRM BITS(0, 15) /*!< alarm high value */ +#define RTC_ALRML_ALRM BITS(0, 15) /*!< alarm low value */ + +/* constants definitions */ +#define RTC_HIGH_VALUE 0x000F0000U /*!< RTC high value */ +#define RTC_LOW_VALUE 0x0000FFFFU /*!< RTC low value */ + +/* RTC interrupt enable or disable definitions */ +#define RTC_INT_SECOND RTC_INTEN_SCIE /*!< second interrupt enable */ +#define RTC_INT_ALARM RTC_INTEN_ALRMIE /*!< alarm interrupt enable */ +#define RTC_INT_OVERFLOW RTC_INTEN_OVIE /*!< overflow interrupt enable */ + +/* RTC flag definitions */ +#define RTC_FLAG_SECOND RTC_CTL_SCIF /*!< second interrupt flag */ +#define RTC_FLAG_ALARM RTC_CTL_ALRMIF /*!< alarm interrupt flag */ +#define RTC_FLAG_OVERFLOW RTC_CTL_OVIF /*!< overflow interrupt flag */ +#define RTC_FLAG_RSYN RTC_CTL_RSYNF /*!< registers synchronized flag */ +#define RTC_FLAG_LWOF RTC_CTL_LWOFF /*!< last write operation finished flag */ + +/* function declarations */ +/* enable RTC interrupt */ +void rtc_interrupt_enable(uint32_t interrupt); +/* disable RTC interrupt */ +void rtc_interrupt_disable(uint32_t interrupt); + +/* enter RTC configuration mode */ +void rtc_configuration_mode_enter(void); +/* exit RTC configuration mode */ +void rtc_configuration_mode_exit(void); + +/* wait RTC last write operation finished flag set */ +void rtc_lwoff_wait(void); +/* wait RTC registers synchronized flag set */ +void rtc_register_sync_wait(void); + +/* get RTC counter value */ +uint32_t rtc_counter_get(void); +/* set RTC counter value */ +void rtc_counter_set(uint32_t cnt); + +/* set RTC prescaler value */ +void rtc_prescaler_set(uint32_t psc); +/* set RTC alarm value */ +void rtc_alarm_config(uint32_t alarm); +/* get RTC divider value */ +uint32_t rtc_divider_get(void); + +/* get RTC flag status */ +FlagStatus rtc_flag_get(uint32_t flag); +/* clear RTC flag status */ +void rtc_flag_clear(uint32_t flag); + +#endif /* GD32F30X_RTC_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_sdio.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_sdio.h new file mode 100644 index 0000000..c2796c5 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_sdio.h @@ -0,0 +1,434 @@ +/*! + \file gd32f30x_sdio.h + \brief definitions for the SDIO + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_SDIO_H +#define GD32F30X_SDIO_H + +#include "gd32f30x.h" + +/* SDIO definitions */ +#define SDIO SDIO_BASE + +/* registers definitions */ +#define SDIO_PWRCTL REG32(SDIO + 0x00U) /*!< SDIO power control register */ +#define SDIO_CLKCTL REG32(SDIO + 0x04U) /*!< SDIO clock control register */ +#define SDIO_CMDAGMT REG32(SDIO + 0x08U) /*!< SDIO command argument register */ +#define SDIO_CMDCTL REG32(SDIO + 0x0CU) /*!< SDIO command control register */ +#define SDIO_RSPCMDIDX REG32(SDIO + 0x10U) /*!< SDIO command index response register */ +#define SDIO_RESP0 REG32(SDIO + 0x14U) /*!< SDIO response register 0 */ +#define SDIO_RESP1 REG32(SDIO + 0x18U) /*!< SDIO response register 1 */ +#define SDIO_RESP2 REG32(SDIO + 0x1CU) /*!< SDIO response register 2 */ +#define SDIO_RESP3 REG32(SDIO + 0x20U) /*!< SDIO response register 3 */ +#define SDIO_DATATO REG32(SDIO + 0x24U) /*!< SDIO data timeout register */ +#define SDIO_DATALEN REG32(SDIO + 0x28U) /*!< SDIO data length register */ +#define SDIO_DATACTL REG32(SDIO + 0x2CU) /*!< SDIO data control register */ +#define SDIO_DATACNT REG32(SDIO + 0x30U) /*!< SDIO data counter register */ +#define SDIO_STAT REG32(SDIO + 0x34U) /*!< SDIO status register */ +#define SDIO_INTC REG32(SDIO + 0x38U) /*!< SDIO interrupt clear register */ +#define SDIO_INTEN REG32(SDIO + 0x3CU) /*!< SDIO interrupt enable register */ +#define SDIO_FIFOCNT REG32(SDIO + 0x48U) /*!< SDIO FIFO counter register */ +#define SDIO_FIFO REG32(SDIO + 0x80U) /*!< SDIO FIFO data register */ + +/* bits definitions */ +/* SDIO_PWRCTL */ +#define SDIO_PWRCTL_PWRCTL BITS(0,1) /*!< SDIO power control bits */ + +/* SDIO_CLKCTL */ +#define SDIO_CLKCTL_DIV BITS(0,7) /*!< clock division */ +#define SDIO_CLKCTL_CLKEN BIT(8) /*!< SDIO_CLK clock output enable bit */ +#define SDIO_CLKCTL_CLKPWRSAV BIT(9) /*!< SDIO_CLK clock dynamic switch on/off for power saving */ +#define SDIO_CLKCTL_CLKBYP BIT(10) /*!< clock bypass enable bit */ +#define SDIO_CLKCTL_BUSMODE BITS(11,12) /*!< SDIO card bus mode control bit */ +#define SDIO_CLKCTL_CLKEDGE BIT(13) /*!< SDIO_CLK clock edge selection bit */ +#define SDIO_CLKCTL_HWCLKEN BIT(14) /*!< hardware clock control enable bit */ +#define SDIO_CLKCTL_DIV8 BIT(31) /*!< MSB of clock division */ + +/* SDIO_CMDAGMT */ +#define SDIO_CMDAGMT_CMDAGMT BITS(0,31) /*!< SDIO card command argument */ + +/* SDIO_CMDCTL */ +#define SDIO_CMDCTL_CMDIDX BITS(0,5) /*!< command index */ +#define SDIO_CMDCTL_CMDRESP BITS(6,7) /*!< command response type bits */ +#define SDIO_CMDCTL_INTWAIT BIT(8) /*!< interrupt wait instead of timeout */ +#define SDIO_CMDCTL_WAITDEND BIT(9) /*!< wait for ends of data transfer */ +#define SDIO_CMDCTL_CSMEN BIT(10) /*!< command state machine(CSM) enable bit */ +#define SDIO_CMDCTL_SUSPEND BIT(11) /*!< SD I/O suspend command(SD I/O only) */ +#define SDIO_CMDCTL_ENCMDC BIT(12) /*!< CMD completion signal enabled (CE-ATA only) */ +#define SDIO_CMDCTL_NINTEN BIT(13) /*!< no CE-ATA interrupt (CE-ATA only) */ +#define SDIO_CMDCTL_ATAEN BIT(14) /*!< CE-ATA command enable(CE-ATA only) */ + +/* SDIO_DATATO */ +#define SDIO_DATATO_DATATO BITS(0,31) /*!< data timeout period */ + +/* SDIO_DATALEN */ +#define SDIO_DATALEN_DATALEN BITS(0,24) /*!< data transfer length */ + +/* SDIO_DATACTL */ +#define SDIO_DATACTL_DATAEN BIT(0) /*!< data transfer enabled bit */ +#define SDIO_DATACTL_DATADIR BIT(1) /*!< data transfer direction */ +#define SDIO_DATACTL_TRANSMOD BIT(2) /*!< data transfer mode */ +#define SDIO_DATACTL_DMAEN BIT(3) /*!< DMA enable bit */ +#define SDIO_DATACTL_BLKSZ BITS(4,7) /*!< data block size */ +#define SDIO_DATACTL_RWEN BIT(8) /*!< read wait mode enabled(SD I/O only) */ +#define SDIO_DATACTL_RWSTOP BIT(9) /*!< read wait stop(SD I/O only) */ +#define SDIO_DATACTL_RWTYPE BIT(10) /*!< read wait type(SD I/O only) */ +#define SDIO_DATACTL_IOEN BIT(11) /*!< SD I/O specific function enable(SD I/O only) */ + +/* SDIO_STAT */ +#define SDIO_STAT_CCRCERR BIT(0) /*!< command response received (CRC check failed) */ +#define SDIO_STAT_DTCRCERR BIT(1) /*!< data block sent/received (CRC check failed) */ +#define SDIO_STAT_CMDTMOUT BIT(2) /*!< command response timeout */ +#define SDIO_STAT_DTTMOUT BIT(3) /*!< data timeout */ +#define SDIO_STAT_TXURE BIT(4) /*!< transmit FIFO underrun error occurs */ +#define SDIO_STAT_RXORE BIT(5) /*!< received FIFO overrun error occurs */ +#define SDIO_STAT_CMDRECV BIT(6) /*!< command response received (CRC check passed) */ +#define SDIO_STAT_CMDSEND BIT(7) /*!< command sent (no response required) */ +#define SDIO_STAT_DTEND BIT(8) /*!< data end (data counter, SDIO_DATACNT, is zero) */ +#define SDIO_STAT_STBITE BIT(9) /*!< start bit error in the bus */ +#define SDIO_STAT_DTBLKEND BIT(10) /*!< data block sent/received (CRC check passed) */ +#define SDIO_STAT_CMDRUN BIT(11) /*!< command transmission in progress */ +#define SDIO_STAT_TXRUN BIT(12) /*!< data transmission in progress */ +#define SDIO_STAT_RXRUN BIT(13) /*!< data reception in progress */ +#define SDIO_STAT_TFH BIT(14) /*!< transmit FIFO is half empty: at least 8 words can be written into the FIFO */ +#define SDIO_STAT_RFH BIT(15) /*!< receive FIFO is half full: at least 8 words can be read in the FIFO */ +#define SDIO_STAT_TFF BIT(16) /*!< transmit FIFO is full */ +#define SDIO_STAT_RFF BIT(17) /*!< receive FIFO is full */ +#define SDIO_STAT_TFE BIT(18) /*!< transmit FIFO is empty */ +#define SDIO_STAT_RFE BIT(19) /*!< receive FIFO is empty */ +#define SDIO_STAT_TXDTVAL BIT(20) /*!< data is valid in transmit FIFO */ +#define SDIO_STAT_RXDTVAL BIT(21) /*!< data is valid in receive FIFO */ +#define SDIO_STAT_SDIOINT BIT(22) /*!< SD I/O interrupt received */ +#define SDIO_STAT_ATAEND BIT(23) /*!< CE-ATA command completion signal received (only for CMD61) */ + +/* SDIO_INTC */ +#define SDIO_INTC_CCRCERRC BIT(0) /*!< CCRCERR flag clear bit */ +#define SDIO_INTC_DTCRCERRC BIT(1) /*!< DTCRCERR flag clear bit */ +#define SDIO_INTC_CMDTMOUTC BIT(2) /*!< CMDTMOUT flag clear bit */ +#define SDIO_INTC_DTTMOUTC BIT(3) /*!< DTTMOUT flag clear bit */ +#define SDIO_INTC_TXUREC BIT(4) /*!< TXURE flag clear bit */ +#define SDIO_INTC_RXOREC BIT(5) /*!< RXORE flag clear bit */ +#define SDIO_INTC_CMDRECVC BIT(6) /*!< CMDRECV flag clear bit */ +#define SDIO_INTC_CMDSENDC BIT(7) /*!< CMDSEND flag clear bit */ +#define SDIO_INTC_DTENDC BIT(8) /*!< DTEND flag clear bit */ +#define SDIO_INTC_STBITEC BIT(9) /*!< STBITE flag clear bit */ +#define SDIO_INTC_DTBLKENDC BIT(10) /*!< DTBLKEND flag clear bit */ +#define SDIO_INTC_SDIOINTC BIT(22) /*!< SDIOINT flag clear bit */ +#define SDIO_INTC_ATAENDC BIT(23) /*!< ATAEND flag clear bit */ + +/* SDIO_INTEN */ +#define SDIO_INTEN_CCRCERRIE BIT(0) /*!< command response CRC fail interrupt enable */ +#define SDIO_INTEN_DTCRCERRIE BIT(1) /*!< data CRC fail interrupt enable */ +#define SDIO_INTEN_CMDTMOUTIE BIT(2) /*!< command response timeout interrupt enable */ +#define SDIO_INTEN_DTTMOUTIE BIT(3) /*!< data timeout interrupt enable */ +#define SDIO_INTEN_TXUREIE BIT(4) /*!< transmit FIFO underrun error interrupt enable */ +#define SDIO_INTEN_RXOREIE BIT(5) /*!< received FIFO overrun error interrupt enable */ +#define SDIO_INTEN_CMDRECVIE BIT(6) /*!< command response received interrupt enable */ +#define SDIO_INTEN_CMDSENDIE BIT(7) /*!< command sent interrupt enable */ +#define SDIO_INTEN_DTENDIE BIT(8) /*!< data end interrupt enable */ +#define SDIO_INTEN_STBITEIE BIT(9) /*!< start bit error interrupt enable */ +#define SDIO_INTEN_DTBLKENDIE BIT(10) /*!< data block end interrupt enable */ +#define SDIO_INTEN_CMDRUNIE BIT(11) /*!< command transmission interrupt enable */ +#define SDIO_INTEN_TXRUNIE BIT(12) /*!< data transmission interrupt enable */ +#define SDIO_INTEN_RXRUNIE BIT(13) /*!< data reception interrupt enable */ +#define SDIO_INTEN_TFHIE BIT(14) /*!< transmit FIFO half empty interrupt enable */ +#define SDIO_INTEN_RFHIE BIT(15) /*!< receive FIFO half full interrupt enable */ +#define SDIO_INTEN_TFFIE BIT(16) /*!< transmit FIFO full interrupt enable */ +#define SDIO_INTEN_RFFIE BIT(17) /*!< receive FIFO full interrupt enable */ +#define SDIO_INTEN_TFEIE BIT(18) /*!< transmit FIFO empty interrupt enable */ +#define SDIO_INTEN_RFEIE BIT(19) /*!< receive FIFO empty interrupt enable */ +#define SDIO_INTEN_TXDTVALIE BIT(20) /*!< data valid in transmit FIFO interrupt enable */ +#define SDIO_INTEN_RXDTVALIE BIT(21) /*!< data valid in receive FIFO interrupt enable */ +#define SDIO_INTEN_SDIOINTIE BIT(22) /*!< SD I/O interrupt received interrupt enable */ +#define SDIO_INTEN_ATAENDIE BIT(23) /*!< CE-ATA command completion signal received interrupt enable */ + +/* SDIO_FIFO */ +#define SDIO_FIFO_FIFODT BITS(0,31) /*!< receive FIFO data or transmit FIFO data */ + +/* constants definitions */ +/* SDIO flags */ +#define SDIO_FLAG_CCRCERR BIT(0) /*!< command response received (CRC check failed) flag */ +#define SDIO_FLAG_DTCRCERR BIT(1) /*!< data block sent/received (CRC check failed) flag */ +#define SDIO_FLAG_CMDTMOUT BIT(2) /*!< command response timeout flag */ +#define SDIO_FLAG_DTTMOUT BIT(3) /*!< data timeout flag */ +#define SDIO_FLAG_TXURE BIT(4) /*!< transmit FIFO underrun error occurs flag */ +#define SDIO_FLAG_RXORE BIT(5) /*!< received FIFO overrun error occurs flag */ +#define SDIO_FLAG_CMDRECV BIT(6) /*!< command response received (CRC check passed) flag */ +#define SDIO_FLAG_CMDSEND BIT(7) /*!< command sent (no response required) flag */ +#define SDIO_FLAG_DTEND BIT(8) /*!< data end (data counter, SDIO_DATACNT, is zero) flag */ +#define SDIO_FLAG_STBITE BIT(9) /*!< start bit error in the bus flag */ +#define SDIO_FLAG_DTBLKEND BIT(10) /*!< data block sent/received (CRC check passed) flag */ +#define SDIO_FLAG_CMDRUN BIT(11) /*!< command transmission in progress flag */ +#define SDIO_FLAG_TXRUN BIT(12) /*!< data transmission in progress flag */ +#define SDIO_FLAG_RXRUN BIT(13) /*!< data reception in progress flag */ +#define SDIO_FLAG_TFH BIT(14) /*!< transmit FIFO is half empty flag: at least 8 words can be written into the FIFO */ +#define SDIO_FLAG_RFH BIT(15) /*!< receive FIFO is half full flag: at least 8 words can be read in the FIFO */ +#define SDIO_FLAG_TFF BIT(16) /*!< transmit FIFO is full flag */ +#define SDIO_FLAG_RFF BIT(17) /*!< receive FIFO is full flag */ +#define SDIO_FLAG_TFE BIT(18) /*!< transmit FIFO is empty flag */ +#define SDIO_FLAG_RFE BIT(19) /*!< receive FIFO is empty flag */ +#define SDIO_FLAG_TXDTVAL BIT(20) /*!< data is valid in transmit FIFO flag */ +#define SDIO_FLAG_RXDTVAL BIT(21) /*!< data is valid in receive FIFO flag */ +#define SDIO_FLAG_SDIOINT BIT(22) /*!< SD I/O interrupt received flag */ +#define SDIO_FLAG_ATAEND BIT(23) /*!< CE-ATA command completion signal received (only for CMD61) flag */ + +/* SDIO interrupt enable or disable */ +#define SDIO_INT_CCRCERR BIT(0) /*!< SDIO CCRCERR interrupt */ +#define SDIO_INT_DTCRCERR BIT(1) /*!< SDIO DTCRCERR interrupt */ +#define SDIO_INT_CMDTMOUT BIT(2) /*!< SDIO CMDTMOUT interrupt */ +#define SDIO_INT_DTTMOUT BIT(3) /*!< SDIO DTTMOUT interrupt */ +#define SDIO_INT_TXURE BIT(4) /*!< SDIO TXURE interrupt */ +#define SDIO_INT_RXORE BIT(5) /*!< SDIO RXORE interrupt */ +#define SDIO_INT_CMDRECV BIT(6) /*!< SDIO CMDRECV interrupt */ +#define SDIO_INT_CMDSEND BIT(7) /*!< SDIO CMDSEND interrupt */ +#define SDIO_INT_DTEND BIT(8) /*!< SDIO DTEND interrupt */ +#define SDIO_INT_STBITE BIT(9) /*!< SDIO STBITE interrupt */ +#define SDIO_INT_DTBLKEND BIT(10) /*!< SDIO DTBLKEND interrupt */ +#define SDIO_INT_CMDRUN BIT(11) /*!< SDIO CMDRUN interrupt */ +#define SDIO_INT_TXRUN BIT(12) /*!< SDIO TXRUN interrupt */ +#define SDIO_INT_RXRUN BIT(13) /*!< SDIO RXRUN interrupt */ +#define SDIO_INT_TFH BIT(14) /*!< SDIO TFH interrupt */ +#define SDIO_INT_RFH BIT(15) /*!< SDIO RFH interrupt */ +#define SDIO_INT_TFF BIT(16) /*!< SDIO TFF interrupt */ +#define SDIO_INT_RFF BIT(17) /*!< SDIO RFF interrupt */ +#define SDIO_INT_TFE BIT(18) /*!< SDIO TFE interrupt */ +#define SDIO_INT_RFE BIT(19) /*!< SDIO RFE interrupt */ +#define SDIO_INT_TXDTVAL BIT(20) /*!< SDIO TXDTVAL interrupt */ +#define SDIO_INT_RXDTVAL BIT(21) /*!< SDIO RXDTVAL interrupt */ +#define SDIO_INT_SDIOINT BIT(22) /*!< SDIO SDIOINT interrupt */ +#define SDIO_INT_ATAEND BIT(23) /*!< SDIO ATAEND interrupt */ + +/* SDIO interrupt flags */ +#define SDIO_INT_FLAG_CCRCERR BIT(0) /*!< SDIO CCRCERR interrupt flag */ +#define SDIO_INT_FLAG_DTCRCERR BIT(1) /*!< SDIO DTCRCERR interrupt flag */ +#define SDIO_INT_FLAG_CMDTMOUT BIT(2) /*!< SDIO CMDTMOUT interrupt flag */ +#define SDIO_INT_FLAG_DTTMOUT BIT(3) /*!< SDIO DTTMOUT interrupt flag */ +#define SDIO_INT_FLAG_TXURE BIT(4) /*!< SDIO TXURE interrupt flag */ +#define SDIO_INT_FLAG_RXORE BIT(5) /*!< SDIO RXORE interrupt flag */ +#define SDIO_INT_FLAG_CMDRECV BIT(6) /*!< SDIO CMDRECV interrupt flag */ +#define SDIO_INT_FLAG_CMDSEND BIT(7) /*!< SDIO CMDSEND interrupt flag */ +#define SDIO_INT_FLAG_DTEND BIT(8) /*!< SDIO DTEND interrupt flag */ +#define SDIO_INT_FLAG_STBITE BIT(9) /*!< SDIO STBITE interrupt flag */ +#define SDIO_INT_FLAG_DTBLKEND BIT(10) /*!< SDIO DTBLKEND interrupt flag */ +#define SDIO_INT_FLAG_CMDRUN BIT(11) /*!< SDIO CMDRUN interrupt flag */ +#define SDIO_INT_FLAG_TXRUN BIT(12) /*!< SDIO TXRUN interrupt flag */ +#define SDIO_INT_FLAG_RXRUN BIT(13) /*!< SDIO RXRUN interrupt flag */ +#define SDIO_INT_FLAG_TFH BIT(14) /*!< SDIO TFH interrupt flag */ +#define SDIO_INT_FLAG_RFH BIT(15) /*!< SDIO RFH interrupt flag */ +#define SDIO_INT_FLAG_TFF BIT(16) /*!< SDIO TFF interrupt flag */ +#define SDIO_INT_FLAG_RFF BIT(17) /*!< SDIO RFF interrupt flag */ +#define SDIO_INT_FLAG_TFE BIT(18) /*!< SDIO TFE interrupt flag */ +#define SDIO_INT_FLAG_RFE BIT(19) /*!< SDIO RFE interrupt flag */ +#define SDIO_INT_FLAG_TXDTVAL BIT(20) /*!< SDIO TXDTVAL interrupt flag */ +#define SDIO_INT_FLAG_RXDTVAL BIT(21) /*!< SDIO RXDTVAL interrupt flag */ +#define SDIO_INT_FLAG_SDIOINT BIT(22) /*!< SDIO SDIOINT interrupt flag */ +#define SDIO_INT_FLAG_ATAEND BIT(23) /*!< SDIO ATAEND interrupt flag */ + +/* SDIO power control */ +#define PWRCTL_PWRCTL(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define SDIO_POWER_OFF PWRCTL_PWRCTL(0) /*!< SDIO power off */ +#define SDIO_POWER_ON PWRCTL_PWRCTL(3) /*!< SDIO power on */ + +/* SDIO card bus mode control */ +#define CLKCTL_BUSMODE(regval) (BITS(11,12) & ((uint32_t)(regval) << 11)) +#define SDIO_BUSMODE_1BIT CLKCTL_BUSMODE(0) /*!< 1-bit SDIO card bus mode */ +#define SDIO_BUSMODE_4BIT CLKCTL_BUSMODE(1) /*!< 4-bit SDIO card bus mode */ +#define SDIO_BUSMODE_8BIT CLKCTL_BUSMODE(2) /*!< 8-bit SDIO card bus mode */ + +/* SDIO_CLK clock edge selection */ +#define SDIO_SDIOCLKEDGE_RISING (uint32_t)0x00000000U /*!< select the rising edge of the SDIOCLK to generate SDIO_CLK */ +#define SDIO_SDIOCLKEDGE_FALLING SDIO_CLKCTL_CLKEDGE /*!< select the falling edge of the SDIOCLK to generate SDIO_CLK */ + +/* clock bypass enable or disable */ +#define SDIO_CLOCKBYPASS_DISABLE (uint32_t)0x00000000U /*!< no bypass */ +#define SDIO_CLOCKBYPASS_ENABLE SDIO_CLKCTL_CLKBYP /*!< clock bypass */ + +/* SDIO_CLK clock dynamic switch on/off for power saving */ +#define SDIO_CLOCKPWRSAVE_DISABLE (uint32_t)0x00000000U /*!< SDIO_CLK clock is always on */ +#define SDIO_CLOCKPWRSAVE_ENABLE SDIO_CLKCTL_CLKPWRSAV /*!< SDIO_CLK closed when bus is idle */ + +/* SDIO command response type */ +#define CMDCTL_CMDRESP(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) +#define SDIO_RESPONSETYPE_NO CMDCTL_CMDRESP(0) /*!< no response */ +#define SDIO_RESPONSETYPE_SHORT CMDCTL_CMDRESP(1) /*!< short response */ +#define SDIO_RESPONSETYPE_LONG CMDCTL_CMDRESP(3) /*!< long response */ + +/* command state machine wait type */ +#define SDIO_WAITTYPE_NO (uint32_t)0x00000000U /*!< not wait interrupt */ +#define SDIO_WAITTYPE_INTERRUPT SDIO_CMDCTL_INTWAIT /*!< wait interrupt */ +#define SDIO_WAITTYPE_DATAEND SDIO_CMDCTL_WAITDEND /*!< wait the end of data transfer */ + +#define SDIO_RESPONSE0 (uint32_t)0x00000000U /*!< card response[31:0]/card response[127:96] */ +#define SDIO_RESPONSE1 (uint32_t)0x00000001U /*!< card response[95:64] */ +#define SDIO_RESPONSE2 (uint32_t)0x00000002U /*!< card response[63:32] */ +#define SDIO_RESPONSE3 (uint32_t)0x00000003U /*!< card response[31:1], plus bit 0 */ + +/* SDIO data block size */ +#define DATACTL_BLKSZ(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) +#define SDIO_DATABLOCKSIZE_1BYTE DATACTL_BLKSZ(0) /*!< block size = 1 byte */ +#define SDIO_DATABLOCKSIZE_2BYTES DATACTL_BLKSZ(1) /*!< block size = 2 bytes */ +#define SDIO_DATABLOCKSIZE_4BYTES DATACTL_BLKSZ(2) /*!< block size = 4 bytes */ +#define SDIO_DATABLOCKSIZE_8BYTES DATACTL_BLKSZ(3) /*!< block size = 8 bytes */ +#define SDIO_DATABLOCKSIZE_16BYTES DATACTL_BLKSZ(4) /*!< block size = 16 bytes */ +#define SDIO_DATABLOCKSIZE_32BYTES DATACTL_BLKSZ(5) /*!< block size = 32 bytes */ +#define SDIO_DATABLOCKSIZE_64BYTES DATACTL_BLKSZ(6) /*!< block size = 64 bytes */ +#define SDIO_DATABLOCKSIZE_128BYTES DATACTL_BLKSZ(7) /*!< block size = 128 bytes */ +#define SDIO_DATABLOCKSIZE_256BYTES DATACTL_BLKSZ(8) /*!< block size = 256 bytes */ +#define SDIO_DATABLOCKSIZE_512BYTES DATACTL_BLKSZ(9) /*!< block size = 512 bytes */ +#define SDIO_DATABLOCKSIZE_1024BYTES DATACTL_BLKSZ(10) /*!< block size = 1024 bytes */ +#define SDIO_DATABLOCKSIZE_2048BYTES DATACTL_BLKSZ(11) /*!< block size = 2048 bytes */ +#define SDIO_DATABLOCKSIZE_4096BYTES DATACTL_BLKSZ(12) /*!< block size = 4096 bytes */ +#define SDIO_DATABLOCKSIZE_8192BYTES DATACTL_BLKSZ(13) /*!< block size = 8192 bytes */ +#define SDIO_DATABLOCKSIZE_16384BYTES DATACTL_BLKSZ(14) /*!< block size = 16384 bytes */ + +/* SDIO data transfer mode */ +#define SDIO_TRANSMODE_BLOCK (uint32_t)0x00000000U /*!< block transfer */ +#define SDIO_TRANSMODE_STREAM SDIO_DATACTL_TRANSMOD /*!< stream transfer or SDIO multibyte transfer */ + +/* SDIO data transfer direction */ +#define SDIO_TRANSDIRECTION_TOCARD (uint32_t)0x00000000U /*!< write data to card */ +#define SDIO_TRANSDIRECTION_TOSDIO SDIO_DATACTL_DATADIR /*!< read data from card */ + +/* SDIO read wait type */ +#define SDIO_READWAITTYPE_DAT2 (uint32_t)0x00000000U /*!< read wait control using SDIO_DAT[2] */ +#define SDIO_READWAITTYPE_CLK SDIO_DATACTL_RWTYPE /*!< read wait control by stopping SDIO_CLK */ + +/* function declarations */ +/* de/initialization functions, hardware clock, bus mode, power_state and SDIO clock configuration */ +/* deinitialize the SDIO */ +void sdio_deinit(void); +/* configure the SDIO clock */ +void sdio_clock_config(uint32_t clock_edge, uint32_t clock_bypass, uint32_t clock_powersave, uint16_t clock_division); +/* enable hardware clock control */ +void sdio_hardware_clock_enable(void); +/* disable hardware clock control */ +void sdio_hardware_clock_disable(void); +/* set different SDIO card bus mode */ +void sdio_bus_mode_set(uint32_t bus_mode); +/* set the SDIO power state */ +void sdio_power_state_set(uint32_t power_state); +/* get the SDIO power state */ +uint32_t sdio_power_state_get(void); +/* enable SDIO_CLK clock output */ +void sdio_clock_enable(void); +/* disable SDIO_CLK clock output */ +void sdio_clock_disable(void); + +/* configure the command index, argument, response type, wait type and CSM to send command functions */ +/* configure the command and response */ +void sdio_command_response_config(uint32_t cmd_index, uint32_t cmd_argument, uint32_t response_type); +/* set the command state machine wait type */ +void sdio_wait_type_set(uint32_t wait_type); +/* enable the CSM(command state machine) */ +void sdio_csm_enable(void); +/* disable the CSM(command state machine) */ +void sdio_csm_disable(void); +/* get the last response command index */ +uint8_t sdio_command_index_get(void); +/* get the response for the last received command */ +uint32_t sdio_response_get(uint32_t responsex); + +/* configure the data timeout, length, block size, transfer mode, direction and DSM for data transfer functions */ +/* configure the data timeout, data length and data block size */ +void sdio_data_config(uint32_t data_timeout, uint32_t data_length, uint32_t data_blocksize); +/* configure the data transfer mode and direction */ +void sdio_data_transfer_config(uint32_t transfer_mode, uint32_t transfer_direction); +/* enable the DSM(data state machine) for data transfer */ +void sdio_dsm_enable(void); +/* disable the DSM(data state machine) */ +void sdio_dsm_disable(void); +/* write data(one word) to the transmit FIFO */ +void sdio_data_write(uint32_t data); +/* read data(one word) from the receive FIFO */ +uint32_t sdio_data_read(void); +/* get the number of remaining data bytes to be transferred to card */ +uint32_t sdio_data_counter_get(void); +/* get the number of words remaining to be written or read from FIFO */ +uint32_t sdio_fifo_counter_get(void); +/* enable the DMA request for SDIO */ +void sdio_dma_enable(void); +/* disable the DMA request for SDIO */ +void sdio_dma_disable(void); + +/* flag and interrupt functions */ +/* get the flags state of SDIO */ +FlagStatus sdio_flag_get(uint32_t flag); +/* clear the pending flags of SDIO */ +void sdio_flag_clear(uint32_t flag); +/* enable the SDIO interrupt */ +void sdio_interrupt_enable(uint32_t int_flag); +/* disable the SDIO interrupt */ +void sdio_interrupt_disable(uint32_t int_flag); +/* get the interrupt flags state of SDIO */ +FlagStatus sdio_interrupt_flag_get(uint32_t int_flag); +/* clear the interrupt pending flags of SDIO */ +void sdio_interrupt_flag_clear(uint32_t int_flag); + +/* SD I/O card functions */ +/* enable the read wait mode(SD I/O only) */ +void sdio_readwait_enable(void); +/* disable the read wait mode(SD I/O only) */ +void sdio_readwait_disable(void); +/* enable the function that stop the read wait process(SD I/O only) */ +void sdio_stop_readwait_enable(void); +/* disable the function that stop the read wait process(SD I/O only) */ +void sdio_stop_readwait_disable(void); +/* set the read wait type(SD I/O only) */ +void sdio_readwait_type_set(uint32_t readwait_type); +/* enable the SD I/O mode specific operation(SD I/O only) */ +void sdio_operation_enable(void); +/* disable the SD I/O mode specific operation(SD I/O only) */ +void sdio_operation_disable(void); +/* enable the SD I/O suspend operation(SD I/O only) */ +void sdio_suspend_enable(void); +/* disable the SD I/O suspend operation(SD I/O only) */ +void sdio_suspend_disable(void); + +/* CE-ATA functions */ +/* enable the CE-ATA command(CE-ATA only) */ +void sdio_ceata_command_enable(void); +/* disable the CE-ATA command(CE-ATA only) */ +void sdio_ceata_command_disable(void); +/* enable the CE-ATA interrupt(CE-ATA only) */ +void sdio_ceata_interrupt_enable(void); +/* disable the CE-ATA interrupt(CE-ATA only) */ +void sdio_ceata_interrupt_disable(void); +/* enable the CE-ATA command completion signal(CE-ATA only) */ +void sdio_ceata_command_completion_enable(void); +/* disable the CE-ATA command completion signal(CE-ATA only) */ +void sdio_ceata_command_completion_disable(void); + +#endif /* GD32F30X_SDIO_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_spi.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_spi.h new file mode 100644 index 0000000..6e95509 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_spi.h @@ -0,0 +1,365 @@ +/*! + \file gd32f30x_spi.h + \brief definitions for the SPI + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_SPI_H +#define GD32F30X_SPI_H + +#include "gd32f30x.h" + +/* SPIx(x=0,1,2) definitions */ +#define SPI0 (SPI_BASE + 0x0000F800U) +#define SPI1 SPI_BASE +#define SPI2 (SPI_BASE + 0x00000400U) + +/* SPI registers definitions */ +#define SPI_CTL0(spix) REG32((spix) + 0x00U) /*!< SPI control register 0 */ +#define SPI_CTL1(spix) REG32((spix) + 0x04U) /*!< SPI control register 1*/ +#define SPI_STAT(spix) REG32((spix) + 0x08U) /*!< SPI status register */ +#define SPI_DATA(spix) REG32((spix) + 0x0CU) /*!< SPI data register */ +#define SPI_CRCPOLY(spix) REG32((spix) + 0x10U) /*!< SPI CRC polynomial register */ +#define SPI_RCRC(spix) REG32((spix) + 0x14U) /*!< SPI receive CRC register */ +#define SPI_TCRC(spix) REG32((spix) + 0x18U) /*!< SPI transmit CRC register */ +#define SPI_I2SCTL(spix) REG32((spix) + 0x1CU) /*!< SPI I2S control register */ +#define SPI_I2SPSC(spix) REG32((spix) + 0x20U) /*!< SPI I2S clock prescaler register */ +#define SPI_QCTL(spix) REG32((spix) + 0x80U) /*!< SPI quad mode control register(only SPI0) */ + +/* bits definitions */ +/* SPI_CTL0 */ +#define SPI_CTL0_CKPH BIT(0) /*!< clock phase selection*/ +#define SPI_CTL0_CKPL BIT(1) /*!< clock polarity selection */ +#define SPI_CTL0_MSTMOD BIT(2) /*!< master mode enable */ +#define SPI_CTL0_PSC BITS(3,5) /*!< master clock prescaler selection */ +#define SPI_CTL0_SPIEN BIT(6) /*!< SPI enable*/ +#define SPI_CTL0_LF BIT(7) /*!< LSB first mode */ +#define SPI_CTL0_SWNSS BIT(8) /*!< NSS pin selection in NSS software mode */ +#define SPI_CTL0_SWNSSEN BIT(9) /*!< NSS software mode selection */ +#define SPI_CTL0_RO BIT(10) /*!< receive only */ +#define SPI_CTL0_FF16 BIT(11) /*!< data frame size */ +#define SPI_CTL0_CRCNT BIT(12) /*!< CRC next transfer */ +#define SPI_CTL0_CRCEN BIT(13) /*!< CRC calculation enable */ +#define SPI_CTL0_BDOEN BIT(14) /*!< bidirectional transmit output enable*/ +#define SPI_CTL0_BDEN BIT(15) /*!< bidirectional enable */ + +/* SPI_CTL1 */ +#define SPI_CTL1_DMAREN BIT(0) /*!< receive buffer dma enable */ +#define SPI_CTL1_DMATEN BIT(1) /*!< transmit buffer dma enable */ +#define SPI_CTL1_NSSDRV BIT(2) /*!< drive NSS output */ +#define SPI_CTL1_NSSP BIT(3) /*!< SPI NSS pulse mode enable */ +#define SPI_CTL1_TMOD BIT(4) /*!< SPI TI mode enable */ +#define SPI_CTL1_ERRIE BIT(5) /*!< errors interrupt enable */ +#define SPI_CTL1_RBNEIE BIT(6) /*!< receive buffer not empty interrupt enable */ +#define SPI_CTL1_TBEIE BIT(7) /*!< transmit buffer empty interrupt enable */ + +/* SPI_STAT */ +#define SPI_STAT_RBNE BIT(0) /*!< receive buffer not empty */ +#define SPI_STAT_TBE BIT(1) /*!< transmit buffer empty */ +#define SPI_STAT_I2SCH BIT(2) /*!< I2S channel side */ +#define SPI_STAT_TXURERR BIT(3) /*!< I2S transmission underrun error bit */ +#define SPI_STAT_CRCERR BIT(4) /*!< SPI CRC error bit */ +#define SPI_STAT_CONFERR BIT(5) /*!< SPI configuration error bit */ +#define SPI_STAT_RXORERR BIT(6) /*!< SPI reception overrun error bit */ +#define SPI_STAT_TRANS BIT(7) /*!< transmitting on-going bit */ +#define SPI_STAT_FERR BIT(8) /*!< format error bit */ + +/* SPI_DATA */ +#define SPI_DATA_DATA BITS(0,15) /*!< data transfer register */ + +/* SPI_CRCPOLY */ +#define SPI_CRCPOLY_CPR BITS(0,15) /*!< CRC polynomial register */ + +/* SPI_RCRC */ +#define SPI_RCRC_RCR BITS(0,15) /*!< RX CRC register */ + +/* SPI_TCRC */ +#define SPI_TCRC_TCR BITS(0,15) /*!< TX CRC register */ + +/* SPI_I2SCTL */ +#define SPI_I2SCTL_CHLEN BIT(0) /*!< channel length */ +#define SPI_I2SCTL_DTLEN BITS(1,2) /*!< data length */ +#define SPI_I2SCTL_CKPL BIT(3) /*!< idle state clock polarity */ +#define SPI_I2SCTL_I2SSTD BITS(4,5) /*!< I2S standard selection */ +#define SPI_I2SCTL_PCMSMOD BIT(7) /*!< PCM frame synchronization mode */ +#define SPI_I2SCTL_I2SOPMOD BITS(8,9) /*!< I2S operation mode */ +#define SPI_I2SCTL_I2SEN BIT(10) /*!< I2S enable */ +#define SPI_I2SCTL_I2SSEL BIT(11) /*!< I2S mode selection */ + +/* SPI_I2SPSC */ +#define SPI_I2SPSC_DIV BITS(0,7) /*!< dividing factor for the prescaler */ +#define SPI_I2SPSC_OF BIT(8) /*!< odd factor for the prescaler */ +#define SPI_I2SPSC_MCKOEN BIT(9) /*!< I2S MCK output enable */ + +/* SPI_QCTL(only for SPI0) */ +#define SPI_QCTL_QMOD BIT(0) /*!< quad-SPI mode enable */ +#define SPI_QCTL_QRD BIT(1) /*!< quad-SPI mode read select */ +#define SPI_QCTL_IO23_DRV BIT(2) /*!< drive SPI_IO2 and SPI_IO3 enable */ + +/* constants definitions */ +/* SPI and I2S parameter struct definitions */ +typedef struct +{ + uint32_t device_mode; /*!< SPI master or slave */ + uint32_t trans_mode; /*!< SPI transtype */ + uint32_t frame_size; /*!< SPI frame size */ + uint32_t nss; /*!< SPI NSS control by handware or software */ + uint32_t endian; /*!< SPI big endian or little endian */ + uint32_t clock_polarity_phase; /*!< SPI clock phase and polarity */ + uint32_t prescale; /*!< SPI prescale factor */ +}spi_parameter_struct; + +/* SPI mode definitions */ +#define SPI_MASTER (SPI_CTL0_MSTMOD | SPI_CTL0_SWNSS) /*!< SPI as master */ +#define SPI_SLAVE ((uint32_t)0x00000000U) /*!< SPI as slave */ + +/* SPI bidirectional transfer direction */ +#define SPI_BIDIRECTIONAL_TRANSMIT SPI_CTL0_BDOEN /*!< SPI work in transmit-only mode */ +#define SPI_BIDIRECTIONAL_RECEIVE (~SPI_CTL0_BDOEN) /*!< SPI work in receive-only mode */ + +/* SPI transmit type */ +#define SPI_TRANSMODE_FULLDUPLEX ((uint32_t)0x00000000U) /*!< SPI receive and send data at fullduplex communication */ +#define SPI_TRANSMODE_RECEIVEONLY SPI_CTL0_RO /*!< SPI only receive data */ +#define SPI_TRANSMODE_BDRECEIVE SPI_CTL0_BDEN /*!< bidirectional receive data */ +#define SPI_TRANSMODE_BDTRANSMIT (SPI_CTL0_BDEN | SPI_CTL0_BDOEN) /*!< bidirectional transmit data*/ + +/* SPI frame size */ +#define SPI_FRAMESIZE_16BIT SPI_CTL0_FF16 /*!< SPI frame size is 16 bits */ +#define SPI_FRAMESIZE_8BIT ((uint32_t)0x00000000U) /*!< SPI frame size is 8 bits */ + +/* SPI NSS control mode */ +#define SPI_NSS_SOFT SPI_CTL0_SWNSSEN /*!< SPI NSS control by sofrware */ +#define SPI_NSS_HARD ((uint32_t)0x00000000U) /*!< SPI NSS control by hardware */ + +/* SPI transmit way */ +#define SPI_ENDIAN_MSB ((uint32_t)0x00000000U) /*!< SPI transmit way is big endian: transmit MSB first */ +#define SPI_ENDIAN_LSB SPI_CTL0_LF /*!< SPI transmit way is little endian: transmit LSB first */ + +/* SPI clock phase and polarity */ +#define SPI_CK_PL_LOW_PH_1EDGE ((uint32_t)0x00000000U) /*!< SPI clock polarity is low level and phase is first edge */ +#define SPI_CK_PL_HIGH_PH_1EDGE SPI_CTL0_CKPL /*!< SPI clock polarity is high level and phase is first edge */ +#define SPI_CK_PL_LOW_PH_2EDGE SPI_CTL0_CKPH /*!< SPI clock polarity is low level and phase is second edge */ +#define SPI_CK_PL_HIGH_PH_2EDGE (SPI_CTL0_CKPL | SPI_CTL0_CKPH) /*!< SPI clock polarity is high level and phase is second edge */ + +/* SPI clock prescale factor */ +#define CTL0_PSC(regval) (BITS(3,5) & ((uint32_t)(regval) << 3)) +#define SPI_PSC_2 CTL0_PSC(0) /*!< SPI clock prescale factor is 2 */ +#define SPI_PSC_4 CTL0_PSC(1) /*!< SPI clock prescale factor is 4 */ +#define SPI_PSC_8 CTL0_PSC(2) /*!< SPI clock prescale factor is 8 */ +#define SPI_PSC_16 CTL0_PSC(3) /*!< SPI clock prescale factor is 16 */ +#define SPI_PSC_32 CTL0_PSC(4) /*!< SPI clock prescale factor is 32 */ +#define SPI_PSC_64 CTL0_PSC(5) /*!< SPI clock prescale factor is 64 */ +#define SPI_PSC_128 CTL0_PSC(6) /*!< SPI clock prescale factor is 128 */ +#define SPI_PSC_256 CTL0_PSC(7) /*!< SPI clock prescale factor is 256 */ + +/* I2S audio sample rate */ +#define I2S_AUDIOSAMPLE_8K ((uint32_t)8000U) /*!< I2S audio sample rate is 8KHz */ +#define I2S_AUDIOSAMPLE_11K ((uint32_t)11025U) /*!< I2S audio sample rate is 11KHz */ +#define I2S_AUDIOSAMPLE_16K ((uint32_t)16000U) /*!< I2S audio sample rate is 16KHz */ +#define I2S_AUDIOSAMPLE_22K ((uint32_t)22050U) /*!< I2S audio sample rate is 22KHz */ +#define I2S_AUDIOSAMPLE_32K ((uint32_t)32000U) /*!< I2S audio sample rate is 32KHz */ +#define I2S_AUDIOSAMPLE_44K ((uint32_t)44100U) /*!< I2S audio sample rate is 44KHz */ +#define I2S_AUDIOSAMPLE_48K ((uint32_t)48000U) /*!< I2S audio sample rate is 48KHz */ +#define I2S_AUDIOSAMPLE_96K ((uint32_t)96000U) /*!< I2S audio sample rate is 96KHz */ +#define I2S_AUDIOSAMPLE_192K ((uint32_t)192000U) /*!< I2S audio sample rate is 192KHz */ + +/* I2S frame format */ +#define I2SCTL_DTLEN(regval) (BITS(1,2) & ((uint32_t)(regval) << 1)) +#define I2S_FRAMEFORMAT_DT16B_CH16B I2SCTL_DTLEN(0) /*!< I2S data length is 16 bit and channel length is 16 bit */ +#define I2S_FRAMEFORMAT_DT16B_CH32B (I2SCTL_DTLEN(0) | SPI_I2SCTL_CHLEN) /*!< I2S data length is 16 bit and channel length is 32 bit */ +#define I2S_FRAMEFORMAT_DT24B_CH32B (I2SCTL_DTLEN(1) | SPI_I2SCTL_CHLEN) /*!< I2S data length is 24 bit and channel length is 32 bit */ +#define I2S_FRAMEFORMAT_DT32B_CH32B (I2SCTL_DTLEN(2) | SPI_I2SCTL_CHLEN) /*!< I2S data length is 32 bit and channel length is 32 bit */ + +/* I2S master clock output */ +#define I2S_MCKOUT_DISABLE ((uint32_t)0x00000000U) /*!< I2S master clock output disable */ +#define I2S_MCKOUT_ENABLE SPI_I2SPSC_MCKOEN /*!< I2S master clock output enable */ + +/* I2S operation mode */ +#define I2SCTL_I2SOPMOD(regval) (BITS(8,9) & ((uint32_t)(regval) << 8)) +#define I2S_MODE_SLAVETX I2SCTL_I2SOPMOD(0) /*!< I2S slave transmit mode */ +#define I2S_MODE_SLAVERX I2SCTL_I2SOPMOD(1) /*!< I2S slave receive mode */ +#define I2S_MODE_MASTERTX I2SCTL_I2SOPMOD(2) /*!< I2S master transmit mode */ +#define I2S_MODE_MASTERRX I2SCTL_I2SOPMOD(3) /*!< I2S master receive mode */ + +/* I2S standard */ +#define I2SCTL_I2SSTD(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) +#define I2S_STD_PHILLIPS I2SCTL_I2SSTD(0) /*!< I2S phillips standard */ +#define I2S_STD_MSB I2SCTL_I2SSTD(1) /*!< I2S MSB standard */ +#define I2S_STD_LSB I2SCTL_I2SSTD(2) /*!< I2S LSB standard */ +#define I2S_STD_PCMSHORT I2SCTL_I2SSTD(3) /*!< I2S PCM short standard */ +#define I2S_STD_PCMLONG (I2SCTL_I2SSTD(3) | SPI_I2SCTL_PCMSMOD) /*!< I2S PCM long standard */ + +/* I2S clock polarity */ +#define I2S_CKPL_LOW ((uint32_t)0x00000000U) /*!< I2S clock polarity low level */ +#define I2S_CKPL_HIGH SPI_I2SCTL_CKPL /*!< I2S clock polarity high level */ + +/* SPI DMA constants definitions */ +#define SPI_DMA_TRANSMIT ((uint8_t)0x00U) /*!< SPI transmit data use DMA */ +#define SPI_DMA_RECEIVE ((uint8_t)0x01U) /*!< SPI receive data use DMA */ + +/* SPI CRC constants definitions */ +#define SPI_CRC_TX ((uint8_t)0x00U) /*!< SPI transmit CRC value */ +#define SPI_CRC_RX ((uint8_t)0x01U) /*!< SPI receive CRC value */ + +/* SPI/I2S interrupt enable/disable constants definitions */ +#define SPI_I2S_INT_TBE ((uint8_t)0x00U) /*!< transmit buffer empty interrupt */ +#define SPI_I2S_INT_RBNE ((uint8_t)0x01U) /*!< receive buffer not empty interrupt */ +#define SPI_I2S_INT_ERR ((uint8_t)0x02U) /*!< error interrupt */ + +/* SPI/I2S interrupt flag constants definitions */ +#define SPI_I2S_INT_FLAG_TBE ((uint8_t)0x00U) /*!< transmit buffer empty interrupt flag */ +#define SPI_I2S_INT_FLAG_RBNE ((uint8_t)0x01U) /*!< receive buffer not empty interrupt flag */ +#define SPI_I2S_INT_FLAG_RXORERR ((uint8_t)0x02U) /*!< overrun interrupt flag */ +#define SPI_INT_FLAG_CONFERR ((uint8_t)0x03U) /*!< config error interrupt flag */ +#define SPI_INT_FLAG_CRCERR ((uint8_t)0x04U) /*!< CRC error interrupt flag */ +#define I2S_INT_FLAG_TXURERR ((uint8_t)0x05U) /*!< underrun error interrupt flag */ +#define SPI_I2S_INT_FLAG_FERR ((uint8_t)0x06U) /*!< format error interrupt flag */ + +/* SPI/I2S flag definitions */ +#define SPI_FLAG_RBNE SPI_STAT_RBNE /*!< receive buffer not empty flag */ +#define SPI_FLAG_TBE SPI_STAT_TBE /*!< transmit buffer empty flag */ +#define SPI_FLAG_CRCERR SPI_STAT_CRCERR /*!< CRC error flag */ +#define SPI_FLAG_CONFERR SPI_STAT_CONFERR /*!< mode config error flag */ +#define SPI_FLAG_RXORERR SPI_STAT_RXORERR /*!< receive overrun error flag */ +#define SPI_FLAG_TRANS SPI_STAT_TRANS /*!< transmit on-going flag */ +#define SPI_FLAG_FERR SPI_STAT_FERR /*!< format error flag */ +#define I2S_FLAG_RBNE SPI_STAT_RBNE /*!< receive buffer not empty flag */ +#define I2S_FLAG_TBE SPI_STAT_TBE /*!< transmit buffer empty flag */ +#define I2S_FLAG_CH SPI_STAT_I2SCH /*!< channel side flag */ +#define I2S_FLAG_TXURERR SPI_STAT_TXURERR /*!< underrun error flag */ +#define I2S_FLAG_RXORERR SPI_STAT_RXORERR /*!< overrun error flag */ +#define I2S_FLAG_TRANS SPI_STAT_TRANS /*!< transmit on-going flag */ +#define I2S_FLAG_FERR SPI_STAT_FERR /*!< format error flag */ + +/* function declarations */ +/* SPI/I2S deinitialization and initialization functions */ +/* reset SPI and I2S */ +void spi_i2s_deinit(uint32_t spi_periph); +/* initialize the parameters of SPI struct with the default values */ +void spi_struct_para_init(spi_parameter_struct* spi_struct); +/* initialize SPI parameter */ +void spi_init(uint32_t spi_periph, spi_parameter_struct* spi_struct); +/* enable SPI */ +void spi_enable(uint32_t spi_periph); +/* disable SPI */ +void spi_disable(uint32_t spi_periph); + +/* initialize I2S parameter */ +void i2s_init(uint32_t spi_periph, uint32_t i2s_mode, uint32_t i2s_standard, uint32_t i2s_ckpl); +/* configure I2S prescaler */ +void i2s_psc_config(uint32_t spi_periph, uint32_t i2s_audiosample, uint32_t i2s_frameformat, uint32_t i2s_mckout); +/* enable I2S */ +void i2s_enable(uint32_t spi_periph); +/* disable I2S */ +void i2s_disable(uint32_t spi_periph); + +/* NSS functions */ +/* enable SPI NSS output */ +void spi_nss_output_enable(uint32_t spi_periph); +/* disable SPI NSS output */ +void spi_nss_output_disable(uint32_t spi_periph); +/* SPI NSS pin high level in software mode */ +void spi_nss_internal_high(uint32_t spi_periph); +/* SPI NSS pin low level in software mode */ +void spi_nss_internal_low(uint32_t spi_periph); + +/* SPI DMA functions */ +/* enable SPI DMA */ +void spi_dma_enable(uint32_t spi_periph, uint8_t dma); +/* disable SPI DMA */ +void spi_dma_disable(uint32_t spi_periph, uint8_t dma); + +/* SPI/I2S transfer configure functions */ +/* configure SPI/I2S data frame format */ +void spi_i2s_data_frame_format_config(uint32_t spi_periph, uint16_t frame_format); +/* SPI transmit data */ +void spi_i2s_data_transmit(uint32_t spi_periph, uint16_t data); +/* SPI receive data */ +uint16_t spi_i2s_data_receive(uint32_t spi_periph); +/* configure SPI bidirectional transfer direction */ +void spi_bidirectional_transfer_config(uint32_t spi_periph, uint32_t transfer_direction); + +/* SPI CRC functions */ +/* set SPI CRC polynomial */ +void spi_crc_polynomial_set(uint32_t spi_periph, uint16_t crc_poly); +/* get SPI CRC polynomial */ +uint16_t spi_crc_polynomial_get(uint32_t spi_periph); +/* turn on SPI CRC function */ +void spi_crc_on(uint32_t spi_periph); +/* turn off SPI CRC function */ +void spi_crc_off(uint32_t spi_periph); +/* SPI next data is CRC value */ +void spi_crc_next(uint32_t spi_periph); +/* get SPI CRC send value or receive value */ +uint16_t spi_crc_get(uint32_t spi_periph, uint8_t crc); + +/* SPI TI mode functions */ +/* enable SPI TI mode */ +void spi_ti_mode_enable(uint32_t spi_periph); +/* disable SPI TI mode */ +void spi_ti_mode_disable(uint32_t spi_periph); + +/* SPI NSS pulse mode functions */ +/* enable SPI NSS pulse mode */ +void spi_nssp_mode_enable(uint32_t spi_periph); +/* disable SPI NSS pulse mode */ +void spi_nssp_mode_disable(uint32_t spi_periph); + +/* quad wire SPI functions */ +/* enable quad wire SPI */ +void qspi_enable(uint32_t spi_periph); +/* disable quad wire SPI */ +void qspi_disable(uint32_t spi_periph); +/* enable quad wire SPI write */ +void qspi_write_enable(uint32_t spi_periph); +/* enable quad wire SPI read */ +void qspi_read_enable(uint32_t spi_periph); +/* enable quad wire SPI_IO2 and SPI_IO3 pin output */ +void qspi_io23_output_enable(uint32_t spi_periph); +/* disable quad wire SPI_IO2 and SPI_IO3 pin output */ +void qspi_io23_output_disable(uint32_t spi_periph); + +/* flag and interrupt functions */ +/* enable SPI and I2S interrupt */ +void spi_i2s_interrupt_enable(uint32_t spi_periph, uint8_t interrupt); +/* disable SPI and I2S interrupt */ +void spi_i2s_interrupt_disable(uint32_t spi_periph, uint8_t interrupt); +/* get SPI and I2S interrupt status */ +FlagStatus spi_i2s_interrupt_flag_get(uint32_t spi_periph, uint8_t interrupt); +/* get SPI and I2S flag status */ +FlagStatus spi_i2s_flag_get(uint32_t spi_periph, uint32_t flag); +/* clear SPI CRC error flag status */ +void spi_crc_error_clear(uint32_t spi_periph); + +#endif /* GD32F30X_SPI_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_timer.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_timer.h new file mode 100644 index 0000000..56867e3 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_timer.h @@ -0,0 +1,752 @@ +/*! + \file gd32f30x_timer.h + \brief definitions for the TIMER + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_TIMER_H +#define GD32F30X_TIMER_H + +#include "gd32f30x.h" + +/* TIMERx(x=0..13) definitions */ +#define TIMER0 (TIMER_BASE + 0x00012C00U) +#define TIMER1 (TIMER_BASE + 0x00000000U) +#define TIMER2 (TIMER_BASE + 0x00000400U) +#define TIMER3 (TIMER_BASE + 0x00000800U) +#define TIMER4 (TIMER_BASE + 0x00000C00U) +#define TIMER5 (TIMER_BASE + 0x00001000U) +#define TIMER6 (TIMER_BASE + 0x00001400U) +#define TIMER7 (TIMER_BASE + 0x00013400U) +#define TIMER8 (TIMER_BASE + 0x00014C00U) +#define TIMER9 (TIMER_BASE + 0x00015000U) +#define TIMER10 (TIMER_BASE + 0x00015400U) +#define TIMER11 (TIMER_BASE + 0x00001800U) +#define TIMER12 (TIMER_BASE + 0x00001C00U) +#define TIMER13 (TIMER_BASE + 0x00002000U) + +/* registers definitions */ +#define TIMER_CTL0(timerx) REG32((timerx) + 0x00U) /*!< TIMER control register 0 */ +#define TIMER_CTL1(timerx) REG32((timerx) + 0x04U) /*!< TIMER control register 1 */ +#define TIMER_SMCFG(timerx) REG32((timerx) + 0x08U) /*!< TIMER slave mode configuration register */ +#define TIMER_DMAINTEN(timerx) REG32((timerx) + 0x0CU) /*!< TIMER DMA and interrupt enable register */ +#define TIMER_INTF(timerx) REG32((timerx) + 0x10U) /*!< TIMER interrupt flag register */ +#define TIMER_SWEVG(timerx) REG32((timerx) + 0x14U) /*!< TIMER software event generation register */ +#define TIMER_CHCTL0(timerx) REG32((timerx) + 0x18U) /*!< TIMER channel control register 0 */ +#define TIMER_CHCTL1(timerx) REG32((timerx) + 0x1CU) /*!< TIMER channel control register 1 */ +#define TIMER_CHCTL2(timerx) REG32((timerx) + 0x20U) /*!< TIMER channel control register 2 */ +#define TIMER_CNT(timerx) REG32((timerx) + 0x24U) /*!< TIMER counter register */ +#define TIMER_PSC(timerx) REG32((timerx) + 0x28U) /*!< TIMER prescaler register */ +#define TIMER_CAR(timerx) REG32((timerx) + 0x2CU) /*!< TIMER counter auto reload register */ +#define TIMER_CREP(timerx) REG32((timerx) + 0x30U) /*!< TIMER counter repetition register */ +#define TIMER_CH0CV(timerx) REG32((timerx) + 0x34U) /*!< TIMER channel 0 capture/compare value register */ +#define TIMER_CH1CV(timerx) REG32((timerx) + 0x38U) /*!< TIMER channel 1 capture/compare value register */ +#define TIMER_CH2CV(timerx) REG32((timerx) + 0x3CU) /*!< TIMER channel 2 capture/compare value register */ +#define TIMER_CH3CV(timerx) REG32((timerx) + 0x40U) /*!< TIMER channel 3 capture/compare value register */ +#define TIMER_CCHP(timerx) REG32((timerx) + 0x44U) /*!< TIMER complementary channel protection register */ +#define TIMER_DMACFG(timerx) REG32((timerx) + 0x48U) /*!< TIMER DMA configuration register */ +#define TIMER_DMATB(timerx) REG32((timerx) + 0x4CU) /*!< TIMER DMA transfer buffer register */ +#define TIMER_IRMP(timerx) REG32((timerx) + 0x50U) /*!< TIMER channel input remap register */ +#define TIMER_CFG(timerx) REG32((timerx) + 0xFCU) /*!< TIMER configuration register */ + +/* bits definitions */ +/* TIMER_CTL0 */ +#define TIMER_CTL0_CEN BIT(0) /*!< TIMER counter enable */ +#define TIMER_CTL0_UPDIS BIT(1) /*!< update disable */ +#define TIMER_CTL0_UPS BIT(2) /*!< update source */ +#define TIMER_CTL0_SPM BIT(3) /*!< single pulse mode */ +#define TIMER_CTL0_DIR BIT(4) /*!< timer counter direction */ +#define TIMER_CTL0_CAM BITS(5,6) /*!< center-aligned mode selection */ +#define TIMER_CTL0_ARSE BIT(7) /*!< auto-reload shadow enable */ +#define TIMER_CTL0_CKDIV BITS(8,9) /*!< clock division */ + +/* TIMER_CTL1 */ +#define TIMER_CTL1_CCSE BIT(0) /*!< commutation control shadow enable */ +#define TIMER_CTL1_CCUC BIT(2) /*!< commutation control shadow register update control */ +#define TIMER_CTL1_DMAS BIT(3) /*!< DMA request source selection */ +#define TIMER_CTL1_MMC BITS(4,6) /*!< master mode control */ +#define TIMER_CTL1_TI0S BIT(7) /*!< channel 0 trigger input selection(hall mode selection) */ +#define TIMER_CTL1_ISO0 BIT(8) /*!< idle state of channel 0 output */ +#define TIMER_CTL1_ISO0N BIT(9) /*!< idle state of channel 0 complementary output */ +#define TIMER_CTL1_ISO1 BIT(10) /*!< idle state of channel 1 output */ +#define TIMER_CTL1_ISO1N BIT(11) /*!< idle state of channel 1 complementary output */ +#define TIMER_CTL1_ISO2 BIT(12) /*!< idle state of channel 2 output */ +#define TIMER_CTL1_ISO2N BIT(13) /*!< idle state of channel 2 complementary output */ +#define TIMER_CTL1_ISO3 BIT(14) /*!< idle state of channel 3 output */ + +/* TIMER_SMCFG */ +#define TIMER_SMCFG_SMC BITS(0,2) /*!< slave mode control */ +#define TIMER_SMCFG_TRGS BITS(4,6) /*!< trigger selection */ +#define TIMER_SMCFG_MSM BIT(7) /*!< master-slave mode */ +#define TIMER_SMCFG_ETFC BITS(8,11) /*!< external trigger filter control */ +#define TIMER_SMCFG_ETPSC BITS(12,13) /*!< external trigger prescaler */ +#define TIMER_SMCFG_SMC1 BIT(14) /*!< part of SMC for enable external clock mode 1 */ +#define TIMER_SMCFG_ETP BIT(15) /*!< external trigger polarity */ + +/* TIMER_DMAINTEN */ +#define TIMER_DMAINTEN_UPIE BIT(0) /*!< update interrupt enable */ +#define TIMER_DMAINTEN_CH0IE BIT(1) /*!< channel 0 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH1IE BIT(2) /*!< channel 1 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH2IE BIT(3) /*!< channel 2 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH3IE BIT(4) /*!< channel 3 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CMTIE BIT(5) /*!< commutation interrupt request enable */ +#define TIMER_DMAINTEN_TRGIE BIT(6) /*!< trigger interrupt enable */ +#define TIMER_DMAINTEN_BRKIE BIT(7) /*!< break interrupt enable */ +#define TIMER_DMAINTEN_UPDEN BIT(8) /*!< update DMA request enable */ +#define TIMER_DMAINTEN_CH0DEN BIT(9) /*!< channel 0 DMA request enable */ +#define TIMER_DMAINTEN_CH1DEN BIT(10) /*!< channel 1 DMA request enable */ +#define TIMER_DMAINTEN_CH2DEN BIT(11) /*!< channel 2 DMA request enable */ +#define TIMER_DMAINTEN_CH3DEN BIT(12) /*!< channel 3 DMA request enable */ +#define TIMER_DMAINTEN_CMTDEN BIT(13) /*!< commutation DMA request enable */ +#define TIMER_DMAINTEN_TRGDEN BIT(14) /*!< trigger DMA request enable */ + +/* TIMER_INTF */ +#define TIMER_INTF_UPIF BIT(0) /*!< update interrupt flag */ +#define TIMER_INTF_CH0IF BIT(1) /*!< channel 0 capture/compare interrupt flag */ +#define TIMER_INTF_CH1IF BIT(2) /*!< channel 1 capture/compare interrupt flag */ +#define TIMER_INTF_CH2IF BIT(3) /*!< channel 2 capture/compare interrupt flag */ +#define TIMER_INTF_CH3IF BIT(4) /*!< channel 3 capture/compare interrupt flag */ +#define TIMER_INTF_CMTIF BIT(5) /*!< channel commutation interrupt flag */ +#define TIMER_INTF_TRGIF BIT(6) /*!< trigger interrupt flag */ +#define TIMER_INTF_BRKIF BIT(7) /*!< break interrupt flag */ +#define TIMER_INTF_CH0OF BIT(9) /*!< channel 0 overcapture flag */ +#define TIMER_INTF_CH1OF BIT(10) /*!< channel 1 overcapture flag */ +#define TIMER_INTF_CH2OF BIT(11) /*!< channel 2 overcapture flag */ +#define TIMER_INTF_CH3OF BIT(12) /*!< channel 3 overcapture flag */ + +/* TIMER_SWEVG */ +#define TIMER_SWEVG_UPG BIT(0) /*!< update event generate */ +#define TIMER_SWEVG_CH0G BIT(1) /*!< channel 0 capture or compare event generation */ +#define TIMER_SWEVG_CH1G BIT(2) /*!< channel 1 capture or compare event generation */ +#define TIMER_SWEVG_CH2G BIT(3) /*!< channel 2 capture or compare event generation */ +#define TIMER_SWEVG_CH3G BIT(4) /*!< channel 3 capture or compare event generation */ +#define TIMER_SWEVG_CMTG BIT(5) /*!< channel commutation event generation */ +#define TIMER_SWEVG_TRGG BIT(6) /*!< trigger event generation */ +#define TIMER_SWEVG_BRKG BIT(7) /*!< break event generation */ + +/* TIMER_CHCTL0 */ +/* output compare mode */ +#define TIMER_CHCTL0_CH0MS BITS(0,1) /*!< channel 0 mode selection */ +#define TIMER_CHCTL0_CH0COMFEN BIT(2) /*!< channel 0 output compare fast enable */ +#define TIMER_CHCTL0_CH0COMSEN BIT(3) /*!< channel 0 output compare shadow enable */ +#define TIMER_CHCTL0_CH0COMCTL BITS(4,6) /*!< channel 0 output compare mode */ +#define TIMER_CHCTL0_CH0COMCEN BIT(7) /*!< channel 0 output compare clear enable */ +#define TIMER_CHCTL0_CH1MS BITS(8,9) /*!< channel 1 mode selection */ +#define TIMER_CHCTL0_CH1COMFEN BIT(10) /*!< channel 1 output compare fast enable */ +#define TIMER_CHCTL0_CH1COMSEN BIT(11) /*!< channel 1 output compare shadow enable */ +#define TIMER_CHCTL0_CH1COMCTL BITS(12,14) /*!< channel 1 output compare mode */ +#define TIMER_CHCTL0_CH1COMCEN BIT(15) /*!< channel 1 output compare clear enable */ +/* input capture mode */ +#define TIMER_CHCTL0_CH0CAPPSC BITS(2,3) /*!< channel 0 input capture prescaler */ +#define TIMER_CHCTL0_CH0CAPFLT BITS(4,7) /*!< channel 0 input capture filter control */ +#define TIMER_CHCTL0_CH1CAPPSC BITS(10,11) /*!< channel 1 input capture prescaler */ +#define TIMER_CHCTL0_CH1CAPFLT BITS(12,15) /*!< channel 1 input capture filter control */ + +/* TIMER_CHCTL1 */ +/* output compare mode */ +#define TIMER_CHCTL1_CH2MS BITS(0,1) /*!< channel 2 mode selection */ +#define TIMER_CHCTL1_CH2COMFEN BIT(2) /*!< channel 2 output compare fast enable */ +#define TIMER_CHCTL1_CH2COMSEN BIT(3) /*!< channel 2 output compare shadow enable */ +#define TIMER_CHCTL1_CH2COMCTL BITS(4,6) /*!< channel 2 output compare mode */ +#define TIMER_CHCTL1_CH2COMCEN BIT(7) /*!< channel 2 output compare clear enable */ +#define TIMER_CHCTL1_CH3MS BITS(8,9) /*!< channel 3 mode selection */ +#define TIMER_CHCTL1_CH3COMFEN BIT(10) /*!< channel 3 output compare fast enable */ +#define TIMER_CHCTL1_CH3COMSEN BIT(11) /*!< channel 3 output compare shadow enable */ +#define TIMER_CHCTL1_CH3COMCTL BITS(12,14) /*!< channel 3 output compare mode */ +#define TIMER_CHCTL1_CH3COMCEN BIT(15) /*!< channel 3 output compare clear enable */ +/* input capture mode */ +#define TIMER_CHCTL1_CH2CAPPSC BITS(2,3) /*!< channel 2 input capture prescaler */ +#define TIMER_CHCTL1_CH2CAPFLT BITS(4,7) /*!< channel 2 input capture filter control */ +#define TIMER_CHCTL1_CH3CAPPSC BITS(10,11) /*!< channel 3 input capture prescaler */ +#define TIMER_CHCTL1_CH3CAPFLT BITS(12,15) /*!< channel 3 input capture filter control */ + +/* TIMER_CHCTL2 */ +#define TIMER_CHCTL2_CH0EN BIT(0) /*!< channel 0 capture/compare function enable */ +#define TIMER_CHCTL2_CH0P BIT(1) /*!< channel 0 capture/compare function polarity */ +#define TIMER_CHCTL2_CH0NEN BIT(2) /*!< channel 0 complementary output enable */ +#define TIMER_CHCTL2_CH0NP BIT(3) /*!< channel 0 complementary output polarity */ +#define TIMER_CHCTL2_CH1EN BIT(4) /*!< channel 1 capture/compare function enable */ +#define TIMER_CHCTL2_CH1P BIT(5) /*!< channel 1 capture/compare function polarity */ +#define TIMER_CHCTL2_CH1NEN BIT(6) /*!< channel 1 complementary output enable */ +#define TIMER_CHCTL2_CH1NP BIT(7) /*!< channel 1 complementary output polarity */ +#define TIMER_CHCTL2_CH2EN BIT(8) /*!< channel 2 capture/compare function enable */ +#define TIMER_CHCTL2_CH2P BIT(9) /*!< channel 2 capture/compare function polarity */ +#define TIMER_CHCTL2_CH2NEN BIT(10) /*!< channel 2 complementary output enable */ +#define TIMER_CHCTL2_CH2NP BIT(11) /*!< channel 2 complementary output polarity */ +#define TIMER_CHCTL2_CH3EN BIT(12) /*!< channel 3 capture/compare function enable */ +#define TIMER_CHCTL2_CH3P BIT(13) /*!< channel 3 capture/compare function polarity */ + +/* TIMER_CNT */ +#define TIMER_CNT_CNT BITS(0,15) /*!< 16 bit timer counter */ + +/* TIMER_PSC */ +#define TIMER_PSC_PSC BITS(0,15) /*!< prescaler value of the counter clock */ + +/* TIMER_CAR */ +#define TIMER_CAR_CARL BITS(0,15) /*!< 16 bit counter auto reload value */ + +/* TIMER_CREP */ +#define TIMER_CREP_CREP BITS(0,7) /*!< counter repetition value */ + +/* TIMER_CH0CV */ +#define TIMER_CH0CV_CH0VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 0 */ + +/* TIMER_CH1CV */ +#define TIMER_CH1CV_CH1VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 1 */ + +/* TIMER_CH2CV */ +#define TIMER_CH2CV_CH2VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 2 */ + +/* TIMER_CH3CV */ +#define TIMER_CH3CV_CH3VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 3 */ + +/* TIMER_CCHP */ +#define TIMER_CCHP_DTCFG BITS(0,7) /*!< dead time configure */ +#define TIMER_CCHP_PROT BITS(8,9) /*!< complementary register protect control */ +#define TIMER_CCHP_IOS BIT(10) /*!< idle mode off-state configure */ +#define TIMER_CCHP_ROS BIT(11) /*!< run mode off-state configure */ +#define TIMER_CCHP_BRKEN BIT(12) /*!< break enable */ +#define TIMER_CCHP_BRKP BIT(13) /*!< break polarity */ +#define TIMER_CCHP_OAEN BIT(14) /*!< output automatic enable */ +#define TIMER_CCHP_POEN BIT(15) /*!< primary output enable */ + +/* TIMER_DMACFG */ +#define TIMER_DMACFG_DMATA BITS(0,4) /*!< DMA transfer access start address */ +#define TIMER_DMACFG_DMATC BITS(8,12) /*!< DMA transfer count */ + +/* TIMER_DMATB */ +#define TIMER_DMATB_DMATB BITS(0,15) /*!< DMA transfer buffer address */ + +/* TIMER_IRMP */ +#define TIMER10_IRMP_ITI1_RMP BITS(0,1) /*!< TIMER10 internal trigger input 1 remap */ + +/* TIMER_CFG */ +#define TIMER_CFG_OUTSEL BIT(0) /*!< the output value selection */ +#define TIMER_CFG_CHVSEL BIT(1) /*!< write CHxVAL register selection */ + +/* constants definitions */ +/* TIMER init parameter struct definitions*/ +typedef struct +{ + uint16_t prescaler; /*!< prescaler value */ + uint16_t alignedmode; /*!< aligned mode */ + uint16_t counterdirection; /*!< counter direction */ + uint16_t clockdivision; /*!< clock division value */ + uint32_t period; /*!< period value */ + uint8_t repetitioncounter; /*!< the counter repetition value */ +}timer_parameter_struct; + +/* break parameter struct definitions*/ +typedef struct +{ + uint16_t runoffstate; /*!< run mode off-state */ + uint16_t ideloffstate; /*!< idle mode off-state */ + uint16_t deadtime; /*!< dead time */ + uint16_t breakpolarity; /*!< break polarity */ + uint16_t outputautostate; /*!< output automatic enable */ + uint16_t protectmode; /*!< complementary register protect control */ + uint16_t breakstate; /*!< break enable */ +}timer_break_parameter_struct; + +/* channel output parameter struct definitions */ +typedef struct +{ + uint16_t outputstate; /*!< channel output state */ + uint16_t outputnstate; /*!< channel complementary output state */ + uint16_t ocpolarity; /*!< channel output polarity */ + uint16_t ocnpolarity; /*!< channel complementary output polarity */ + uint16_t ocidlestate; /*!< idle state of channel output */ + uint16_t ocnidlestate; /*!< idle state of channel complementary output */ +}timer_oc_parameter_struct; + +/* channel input parameter struct definitions */ +typedef struct +{ + uint16_t icpolarity; /*!< channel input polarity */ + uint16_t icselection; /*!< channel input mode selection */ + uint16_t icprescaler; /*!< channel input capture prescaler */ + uint16_t icfilter; /*!< channel input capture filter control */ +}timer_ic_parameter_struct; + +/* TIMER interrupt enable or disable */ +#define TIMER_INT_UP TIMER_DMAINTEN_UPIE /*!< update interrupt */ +#define TIMER_INT_CH0 TIMER_DMAINTEN_CH0IE /*!< channel 0 interrupt */ +#define TIMER_INT_CH1 TIMER_DMAINTEN_CH1IE /*!< channel 1 interrupt */ +#define TIMER_INT_CH2 TIMER_DMAINTEN_CH2IE /*!< channel 2 interrupt */ +#define TIMER_INT_CH3 TIMER_DMAINTEN_CH3IE /*!< channel 3 interrupt */ +#define TIMER_INT_CMT TIMER_DMAINTEN_CMTIE /*!< channel commutation interrupt flag */ +#define TIMER_INT_TRG TIMER_DMAINTEN_TRGIE /*!< trigger interrupt */ +#define TIMER_INT_BRK TIMER_DMAINTEN_BRKIE /*!< break interrupt */ + +/* TIMER flag */ +#define TIMER_FLAG_UP TIMER_INTF_UPIF /*!< update flag */ +#define TIMER_FLAG_CH0 TIMER_INTF_CH0IF /*!< channel 0 flag */ +#define TIMER_FLAG_CH1 TIMER_INTF_CH1IF /*!< channel 1 flag */ +#define TIMER_FLAG_CH2 TIMER_INTF_CH2IF /*!< channel 2 flag */ +#define TIMER_FLAG_CH3 TIMER_INTF_CH3IF /*!< channel 3 flag */ +#define TIMER_FLAG_CMT TIMER_INTF_CMTIF /*!< channel commutation flag */ +#define TIMER_FLAG_TRG TIMER_INTF_TRGIF /*!< trigger flag */ +#define TIMER_FLAG_BRK TIMER_INTF_BRKIF /*!< break flag */ +#define TIMER_FLAG_CH0O TIMER_INTF_CH0OF /*!< channel 0 overcapture flag */ +#define TIMER_FLAG_CH1O TIMER_INTF_CH1OF /*!< channel 1 overcapture flag */ +#define TIMER_FLAG_CH2O TIMER_INTF_CH2OF /*!< channel 2 overcapture flag */ +#define TIMER_FLAG_CH3O TIMER_INTF_CH3OF /*!< channel 3 overcapture flag */ + +/* TIMER interrupt flag */ +#define TIMER_INT_FLAG_UP TIMER_INTF_UPIF /*!< update interrupt flag */ +#define TIMER_INT_FLAG_CH0 TIMER_INTF_CH0IF /*!< channel 0 interrupt flag */ +#define TIMER_INT_FLAG_CH1 TIMER_INTF_CH1IF /*!< channel 1 interrupt flag */ +#define TIMER_INT_FLAG_CH2 TIMER_INTF_CH2IF /*!< channel 2 interrupt flag */ +#define TIMER_INT_FLAG_CH3 TIMER_INTF_CH3IF /*!< channel 3 interrupt flag */ +#define TIMER_INT_FLAG_CMT TIMER_INTF_CMTIF /*!< channel commutation interrupt flag */ +#define TIMER_INT_FLAG_TRG TIMER_INTF_TRGIF /*!< trigger interrupt flag */ +#define TIMER_INT_FLAG_BRK TIMER_INTF_BRKIF + + + +/* TIMER DMA source enable */ +#define TIMER_DMA_UPD ((uint16_t)TIMER_DMAINTEN_UPDEN) /*!< update DMA enable */ +#define TIMER_DMA_CH0D ((uint16_t)TIMER_DMAINTEN_CH0DEN) /*!< channel 0 DMA enable */ +#define TIMER_DMA_CH1D ((uint16_t)TIMER_DMAINTEN_CH1DEN) /*!< channel 1 DMA enable */ +#define TIMER_DMA_CH2D ((uint16_t)TIMER_DMAINTEN_CH2DEN) /*!< channel 2 DMA enable */ +#define TIMER_DMA_CH3D ((uint16_t)TIMER_DMAINTEN_CH3DEN) /*!< channel 3 DMA enable */ +#define TIMER_DMA_CMTD ((uint16_t)TIMER_DMAINTEN_CMTDEN) /*!< commutation DMA request enable */ +#define TIMER_DMA_TRGD ((uint16_t)TIMER_DMAINTEN_TRGDEN) /*!< trigger DMA enable */ + +/* channel DMA request source selection */ +#define TIMER_DMAREQUEST_UPDATEEVENT ((uint8_t)0x00U) /*!< DMA request of channel y is sent when update event occurs */ +#define TIMER_DMAREQUEST_CHANNELEVENT ((uint8_t)0x01U) /*!< DMA request of channel y is sent when channel y event occurs */ + +/* DMA access base address */ +#define DMACFG_DMATA(regval) (BITS(0, 4) & ((uint32_t)(regval) << 0U)) +#define TIMER_DMACFG_DMATA_CTL0 DMACFG_DMATA(0) /*!< DMA transfer address is TIMER_CTL0 */ +#define TIMER_DMACFG_DMATA_CTL1 DMACFG_DMATA(1) /*!< DMA transfer address is TIMER_CTL1 */ +#define TIMER_DMACFG_DMATA_SMCFG DMACFG_DMATA(2) /*!< DMA transfer address is TIMER_SMCFG */ +#define TIMER_DMACFG_DMATA_DMAINTEN DMACFG_DMATA(3) /*!< DMA transfer address is TIMER_DMAINTEN */ +#define TIMER_DMACFG_DMATA_INTF DMACFG_DMATA(4) /*!< DMA transfer address is TIMER_INTF */ +#define TIMER_DMACFG_DMATA_SWEVG DMACFG_DMATA(5) /*!< DMA transfer address is TIMER_SWEVG */ +#define TIMER_DMACFG_DMATA_CHCTL0 DMACFG_DMATA(6) /*!< DMA transfer address is TIMER_CHCTL0 */ +#define TIMER_DMACFG_DMATA_CHCTL1 DMACFG_DMATA(7) /*!< DMA transfer address is TIMER_CHCTL1 */ +#define TIMER_DMACFG_DMATA_CHCTL2 DMACFG_DMATA(8) /*!< DMA transfer address is TIMER_CHCTL2 */ +#define TIMER_DMACFG_DMATA_CNT DMACFG_DMATA(9) /*!< DMA transfer address is TIMER_CNT */ +#define TIMER_DMACFG_DMATA_PSC DMACFG_DMATA(10) /*!< DMA transfer address is TIMER_PSC */ +#define TIMER_DMACFG_DMATA_CAR DMACFG_DMATA(11) /*!< DMA transfer address is TIMER_CAR */ +#define TIMER_DMACFG_DMATA_CREP DMACFG_DMATA(12) /*!< DMA transfer address is TIMER_CREP */ +#define TIMER_DMACFG_DMATA_CH0CV DMACFG_DMATA(13) /*!< DMA transfer address is TIMER_CH0CV */ +#define TIMER_DMACFG_DMATA_CH1CV DMACFG_DMATA(14) /*!< DMA transfer address is TIMER_CH1CV */ +#define TIMER_DMACFG_DMATA_CH2CV DMACFG_DMATA(15) /*!< DMA transfer address is TIMER_CH2CV */ +#define TIMER_DMACFG_DMATA_CH3CV DMACFG_DMATA(16) /*!< DMA transfer address is TIMER_CH3CV */ +#define TIMER_DMACFG_DMATA_CCHP DMACFG_DMATA(17) /*!< DMA transfer address is TIMER_CCHP */ +#define TIMER_DMACFG_DMATA_DMACFG DMACFG_DMATA(18) /*!< DMA transfer address is TIMER_DMACFG */ +#define TIMER_DMACFG_DMATA_DMATB DMACFG_DMATA(19) /*!< DMA transfer address is TIMER_DMATB */ + +/* DMA access burst length */ +#define DMACFG_DMATC(regval) (BITS(8, 12) & ((uint32_t)(regval) << 8U)) +#define TIMER_DMACFG_DMATC_1TRANSFER DMACFG_DMATC(0) /*!< DMA transfer 1 time */ +#define TIMER_DMACFG_DMATC_2TRANSFER DMACFG_DMATC(1) /*!< DMA transfer 2 times */ +#define TIMER_DMACFG_DMATC_3TRANSFER DMACFG_DMATC(2) /*!< DMA transfer 3 times */ +#define TIMER_DMACFG_DMATC_4TRANSFER DMACFG_DMATC(3) /*!< DMA transfer 4 times */ +#define TIMER_DMACFG_DMATC_5TRANSFER DMACFG_DMATC(4) /*!< DMA transfer 5 times */ +#define TIMER_DMACFG_DMATC_6TRANSFER DMACFG_DMATC(5) /*!< DMA transfer 6 times */ +#define TIMER_DMACFG_DMATC_7TRANSFER DMACFG_DMATC(6) /*!< DMA transfer 7 times */ +#define TIMER_DMACFG_DMATC_8TRANSFER DMACFG_DMATC(7) /*!< DMA transfer 8 times */ +#define TIMER_DMACFG_DMATC_9TRANSFER DMACFG_DMATC(8) /*!< DMA transfer 9 times */ +#define TIMER_DMACFG_DMATC_10TRANSFER DMACFG_DMATC(9) /*!< DMA transfer 10 times */ +#define TIMER_DMACFG_DMATC_11TRANSFER DMACFG_DMATC(10) /*!< DMA transfer 11 times */ +#define TIMER_DMACFG_DMATC_12TRANSFER DMACFG_DMATC(11) /*!< DMA transfer 12 times */ +#define TIMER_DMACFG_DMATC_13TRANSFER DMACFG_DMATC(12) /*!< DMA transfer 13 times */ +#define TIMER_DMACFG_DMATC_14TRANSFER DMACFG_DMATC(13) /*!< DMA transfer 14 times */ +#define TIMER_DMACFG_DMATC_15TRANSFER DMACFG_DMATC(14) /*!< DMA transfer 15 times */ +#define TIMER_DMACFG_DMATC_16TRANSFER DMACFG_DMATC(15) /*!< DMA transfer 16 times */ +#define TIMER_DMACFG_DMATC_17TRANSFER DMACFG_DMATC(16) /*!< DMA transfer 17 times */ +#define TIMER_DMACFG_DMATC_18TRANSFER DMACFG_DMATC(17) /*!< DMA transfer 18 times */ + +/* TIMER software event generation source */ +#define TIMER_EVENT_SRC_UPG ((uint16_t)0x0001U) /*!< update event generation */ +#define TIMER_EVENT_SRC_CH0G ((uint16_t)0x0002U) /*!< channel 0 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH1G ((uint16_t)0x0004U) /*!< channel 1 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH2G ((uint16_t)0x0008U) /*!< channel 2 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH3G ((uint16_t)0x0010U) /*!< channel 3 capture or compare event generation */ +#define TIMER_EVENT_SRC_CMTG ((uint16_t)0x0020U) /*!< channel commutation event generation */ +#define TIMER_EVENT_SRC_TRGG ((uint16_t)0x0040U) /*!< trigger event generation */ +#define TIMER_EVENT_SRC_BRKG ((uint16_t)0x0080U) /*!< break event generation */ + +/* center-aligned mode selection */ +#define CTL0_CAM(regval) ((uint16_t)(BITS(5, 6) & ((uint32_t)(regval) << 5U))) +#define TIMER_COUNTER_EDGE CTL0_CAM(0) /*!< edge-aligned mode */ +#define TIMER_COUNTER_CENTER_DOWN CTL0_CAM(1) /*!< center-aligned and counting down assert mode */ +#define TIMER_COUNTER_CENTER_UP CTL0_CAM(2) /*!< center-aligned and counting up assert mode */ +#define TIMER_COUNTER_CENTER_BOTH CTL0_CAM(3) /*!< center-aligned and counting up/down assert mode */ + +/* TIMER prescaler reload mode */ +#define TIMER_PSC_RELOAD_NOW ((uint32_t)0x00000000U) /*!< the prescaler is loaded right now */ +#define TIMER_PSC_RELOAD_UPDATE ((uint32_t)0x00000001U) /*!< the prescaler is loaded at the next update event */ + +/* count direction */ +#define TIMER_COUNTER_UP ((uint16_t)0x0000U) /*!< counter up direction */ +#define TIMER_COUNTER_DOWN ((uint16_t)TIMER_CTL0_DIR) /*!< counter down direction */ + +/* specify division ratio between TIMER clock and dead-time and sampling clock */ +#define CTL0_CKDIV(regval) ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U))) +#define TIMER_CKDIV_DIV1 CTL0_CKDIV(0) /*!< clock division value is 1,fDTS=fTIMER_CK */ +#define TIMER_CKDIV_DIV2 CTL0_CKDIV(1) /*!< clock division value is 2,fDTS= fTIMER_CK/2 */ +#define TIMER_CKDIV_DIV4 CTL0_CKDIV(2) /*!< clock division value is 4, fDTS= fTIMER_CK/4 */ + +/* single pulse mode */ +#define TIMER_SP_MODE_SINGLE ((uint32_t)0x00000000U) /*!< single pulse mode */ +#define TIMER_SP_MODE_REPETITIVE ((uint32_t)0x00000001U) /*!< repetitive pulse mode */ + +/* update source */ +#define TIMER_UPDATE_SRC_REGULAR ((uint32_t)0x00000000U) /*!< update generate only by counter overflow/underflow */ +#define TIMER_UPDATE_SRC_GLOBAL ((uint32_t)0x00000001U) /*!< update generate by setting of UPG bit or the counter overflow/underflow,or the slave mode controller trigger */ + +/* run mode off-state configure */ +#define TIMER_ROS_STATE_ENABLE ((uint16_t)TIMER_CCHP_ROS) /*!< when POEN bit is set, the channel output signals (CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */ +#define TIMER_ROS_STATE_DISABLE ((uint16_t)0x0000U) /*!< when POEN bit is set, the channel output signals (CHx_O/CHx_ON) are disabled */ + +/* idle mode off-state configure */ +#define TIMER_IOS_STATE_ENABLE ((uint16_t)TIMER_CCHP_IOS) /*!< when POEN bit is reset, he channel output signals (CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */ +#define TIMER_IOS_STATE_DISABLE ((uint16_t)0x0000U) /*!< when POEN bit is reset, the channel output signals (CHx_O/CHx_ON) are disabled */ + +/* break input polarity */ +#define TIMER_BREAK_POLARITY_LOW ((uint16_t)0x0000U) /*!< break input polarity is low */ +#define TIMER_BREAK_POLARITY_HIGH ((uint16_t)TIMER_CCHP_BRKP) /*!< break input polarity is high */ + +/* output automatic enable */ +#define TIMER_OUTAUTO_ENABLE ((uint16_t)TIMER_CCHP_OAEN) /*!< output automatic enable */ +#define TIMER_OUTAUTO_DISABLE ((uint16_t)0x0000U) /*!< output automatic disable */ + +/* complementary register protect control */ +#define CCHP_PROT(regval) ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U))) +#define TIMER_CCHP_PROT_OFF CCHP_PROT(0) /*!< protect disable */ +#define TIMER_CCHP_PROT_0 CCHP_PROT(1) /*!< PROT mode 0 */ +#define TIMER_CCHP_PROT_1 CCHP_PROT(2) /*!< PROT mode 1 */ +#define TIMER_CCHP_PROT_2 CCHP_PROT(3) /*!< PROT mode 2 */ + +/* break input enable */ +#define TIMER_BREAK_ENABLE ((uint16_t)TIMER_CCHP_BRKEN) /*!< break input enable */ +#define TIMER_BREAK_DISABLE ((uint16_t)0x0000U) /*!< break input disable */ + +/* TIMER channel n(n=0,1,2,3) */ +#define TIMER_CH_0 ((uint16_t)0x0000U) /*!< TIMER channel 0(TIMERx(x=0..4,7..13)) */ +#define TIMER_CH_1 ((uint16_t)0x0001U) /*!< TIMER channel 1(TIMERx(x=0..4,7,8,11)) */ +#define TIMER_CH_2 ((uint16_t)0x0002U) /*!< TIMER channel 2(TIMERx(x=0..4,7)) */ +#define TIMER_CH_3 ((uint16_t)0x0003U) /*!< TIMER channel 3(TIMERx(x=0..4,7)) */ + +/* channel enable state*/ +#define TIMER_CCX_ENABLE ((uint32_t)0x00000001U) /*!< channel enable */ +#define TIMER_CCX_DISABLE ((uint32_t)0x00000000U) /*!< channel disable */ + +/* channel complementary output enable state*/ +#define TIMER_CCXN_ENABLE ((uint16_t)0x0004U) /*!< channel complementary enable */ +#define TIMER_CCXN_DISABLE ((uint16_t)0x0000U) /*!< channel complementary disable */ + +/* channel output polarity */ +#define TIMER_OC_POLARITY_HIGH ((uint16_t)0x0000U) /*!< channel output polarity is high */ +#define TIMER_OC_POLARITY_LOW ((uint16_t)0x0002U) /*!< channel output polarity is low */ + +/* channel complementary output polarity */ +#define TIMER_OCN_POLARITY_HIGH ((uint16_t)0x0000U) /*!< channel complementary output polarity is high */ +#define TIMER_OCN_POLARITY_LOW ((uint16_t)0x0008U) /*!< channel complementary output polarity is low */ + +/* idle state of channel output */ +#define TIMER_OC_IDLE_STATE_HIGH ((uint16_t)0x0100) /*!< idle state of channel output is high */ +#define TIMER_OC_IDLE_STATE_LOW ((uint16_t)0x0000) /*!< idle state of channel output is low */ + +/* idle state of channel complementary output */ +#define TIMER_OCN_IDLE_STATE_HIGH ((uint16_t)0x0200U) /*!< idle state of channel complementary output is high */ +#define TIMER_OCN_IDLE_STATE_LOW ((uint16_t)0x0000U) /*!< idle state of channel complementary output is low */ + +/* channel output compare mode */ +#define TIMER_OC_MODE_TIMING ((uint16_t)0x0000U) /*!< timing mode */ +#define TIMER_OC_MODE_ACTIVE ((uint16_t)0x0010U) /*!< active mode */ +#define TIMER_OC_MODE_INACTIVE ((uint16_t)0x0020U) /*!< inactive mode */ +#define TIMER_OC_MODE_TOGGLE ((uint16_t)0x0030U) /*!< toggle mode */ +#define TIMER_OC_MODE_LOW ((uint16_t)0x0040U) /*!< force low mode */ +#define TIMER_OC_MODE_HIGH ((uint16_t)0x0050U) /*!< force high mode */ +#define TIMER_OC_MODE_PWM0 ((uint16_t)0x0060U) /*!< PWM0 mode */ +#define TIMER_OC_MODE_PWM1 ((uint16_t)0x0070U) /*!< PWM1 mode*/ + +/* channel output compare shadow enable */ +#define TIMER_OC_SHADOW_ENABLE ((uint16_t)0x0008U) /*!< channel output shadow state enable */ +#define TIMER_OC_SHADOW_DISABLE ((uint16_t)0x0000U) /*!< channel output shadow state disable */ + +/* channel output compare fast enable */ +#define TIMER_OC_FAST_ENABLE ((uint16_t)0x0004) /*!< channel output fast function enable */ +#define TIMER_OC_FAST_DISABLE ((uint16_t)0x0000) /*!< channel output fast function disable */ + +/* channel output compare clear enable */ +#define TIMER_OC_CLEAR_ENABLE ((uint16_t)0x0080U) /*!< channel output clear function enable */ +#define TIMER_OC_CLEAR_DISABLE ((uint16_t)0x0000U) /*!< channel output clear function disable */ + +/* channel control shadow register update control */ +#define TIMER_UPDATECTL_CCU ((uint32_t)0x00000000U) /*!< the shadow registers are updated when CMTG bit is set */ +#define TIMER_UPDATECTL_CCUTRI ((uint32_t)0x00000001U) /*!< the shadow registers update by when CMTG bit is set or an rising edge of TRGI occurs */ + +/* channel input capture polarity */ +#define TIMER_IC_POLARITY_RISING ((uint16_t)0x0000U) /*!< input capture rising edge */ +#define TIMER_IC_POLARITY_FALLING ((uint16_t)0x0002U) /*!< input capture falling edge */ + +/* TIMER input capture selection */ +#define TIMER_IC_SELECTION_DIRECTTI ((uint16_t)0x0001U) /*!< channel y is configured as input and icy is mapped on CIy */ +#define TIMER_IC_SELECTION_INDIRECTTI ((uint16_t)0x0002U) /*!< channel y is configured as input and icy is mapped on opposite input */ +#define TIMER_IC_SELECTION_ITS ((uint16_t)0x0003U) /*!< channel y is configured as input and icy is mapped on ITS */ + +/* channel input capture prescaler */ +#define TIMER_IC_PSC_DIV1 ((uint16_t)0x0000U) /*!< no prescaler */ +#define TIMER_IC_PSC_DIV2 ((uint16_t)0x0004U) /*!< divided by 2 */ +#define TIMER_IC_PSC_DIV4 ((uint16_t)0x0008U) /*!< divided by 4*/ +#define TIMER_IC_PSC_DIV8 ((uint16_t)0x000CU) /*!< divided by 8 */ + +/* trigger selection */ +#define SMCFG_TRGSEL(regval) (BITS(4, 6) & ((uint32_t)(regval) << 4U)) +#define TIMER_SMCFG_TRGSEL_ITI0 SMCFG_TRGSEL(0) /*!< internal trigger 0 */ +#define TIMER_SMCFG_TRGSEL_ITI1 SMCFG_TRGSEL(1) /*!< internal trigger 1 */ +#define TIMER_SMCFG_TRGSEL_ITI2 SMCFG_TRGSEL(2) /*!< internal trigger 2 */ +#define TIMER_SMCFG_TRGSEL_ITI3 SMCFG_TRGSEL(3) /*!< internal trigger 3 */ +#define TIMER_SMCFG_TRGSEL_CI0F_ED SMCFG_TRGSEL(4) /*!< TI0 Edge Detector */ +#define TIMER_SMCFG_TRGSEL_CI0FE0 SMCFG_TRGSEL(5) /*!< filtered TIMER input 0 */ +#define TIMER_SMCFG_TRGSEL_CI1FE1 SMCFG_TRGSEL(6) /*!< filtered TIMER input 1 */ +#define TIMER_SMCFG_TRGSEL_ETIFP SMCFG_TRGSEL(7) /*!< external trigger */ + +/* master mode control */ +#define CTL1_MMC(regval) (BITS(4, 6) & ((uint32_t)(regval) << 4U)) +#define TIMER_TRI_OUT_SRC_RESET CTL1_MMC(0) /*!< the UPG bit as trigger output */ +#define TIMER_TRI_OUT_SRC_ENABLE CTL1_MMC(1) /*!< the counter enable signal TIMER_CTL0_CEN as trigger output */ +#define TIMER_TRI_OUT_SRC_UPDATE CTL1_MMC(2) /*!< update event as trigger output */ +#define TIMER_TRI_OUT_SRC_CH0 CTL1_MMC(3) /*!< a capture or a compare match occurred in channal0 as trigger output TRGO */ +#define TIMER_TRI_OUT_SRC_O0CPRE CTL1_MMC(4) /*!< O0CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O1CPRE CTL1_MMC(5) /*!< O1CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O2CPRE CTL1_MMC(6) /*!< O2CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O3CPRE CTL1_MMC(7) /*!< O3CPRE as trigger output */ + +/* slave mode control */ +#define SMCFG_SMC(regval) (BITS(0, 2) & ((uint32_t)(regval) << 0U)) +#define TIMER_SLAVE_MODE_DISABLE SMCFG_SMC(0) /*!< slave mode disable */ +#define TIMER_ENCODER_MODE0 SMCFG_SMC(1) /*!< encoder mode 0 */ +#define TIMER_ENCODER_MODE1 SMCFG_SMC(2) /*!< encoder mode 1 */ +#define TIMER_ENCODER_MODE2 SMCFG_SMC(3) /*!< encoder mode 2 */ +#define TIMER_SLAVE_MODE_RESTART SMCFG_SMC(4) /*!< restart mode */ +#define TIMER_SLAVE_MODE_PAUSE SMCFG_SMC(5) /*!< pause mode */ +#define TIMER_SLAVE_MODE_EVENT SMCFG_SMC(6) /*!< event mode */ +#define TIMER_SLAVE_MODE_EXTERNAL0 SMCFG_SMC(7) /*!< external clock mode 0 */ + +/* master slave mode selection */ +#define TIMER_MASTER_SLAVE_MODE_ENABLE ((uint32_t)0x00000000U) /*!< master slave mode enable */ +#define TIMER_MASTER_SLAVE_MODE_DISABLE ((uint32_t)0x00000001U) /*!< master slave mode disable */ + +/* external trigger prescaler */ +#define SMCFG_ETPSC(regval) (BITS(12, 13) & ((uint32_t)(regval) << 12U)) +#define TIMER_EXT_TRI_PSC_OFF SMCFG_ETPSC(0) /*!< no divided */ +#define TIMER_EXT_TRI_PSC_DIV2 SMCFG_ETPSC(1) /*!< divided by 2 */ +#define TIMER_EXT_TRI_PSC_DIV4 SMCFG_ETPSC(2) /*!< divided by 4 */ +#define TIMER_EXT_TRI_PSC_DIV8 SMCFG_ETPSC(3) /*!< divided by 8 */ + +/* external trigger polarity */ +#define TIMER_ETP_FALLING TIMER_SMCFG_ETP /*!< active low or falling edge active */ +#define TIMER_ETP_RISING ((uint32_t)0x00000000U) /*!< active high or rising edge active */ + +/* channel 0 trigger input selection */ +#define TIMER_HALLINTERFACE_ENABLE ((uint32_t)0x00000000U) /*!< TIMER hall sensor mode enable */ +#define TIMER_HALLINTERFACE_DISABLE ((uint32_t)0x00000001U) /*!< TIMER hall sensor mode disable */ + +/* TIMERx(x=0,1,2,13,14,15,16) write cc register selection */ +#define TIMER_CHVSEL_ENABLE ((uint16_t)0x0002U) /*!< write CHxVAL register selection enable */ +#define TIMER_CHVSEL_DISABLE ((uint16_t)0x0000U) /*!< write CHxVAL register selection disable */ + +/* the output value selection */ +#define TIMER_OUTSEL_ENABLE ((uint16_t)0x0001U) /*!< output value selection enable */ +#define TIMER_OUTSEL_DISABLE ((uint16_t)0x0000U) /*!< output value selection disable */ + + +/* function declarations */ +/* TIMER timebase */ +/* deinit a TIMER */ +void timer_deinit(uint32_t timer_periph); +/* initialize TIMER init parameter struct */ +void timer_struct_para_init(timer_parameter_struct* initpara); +/* initialize TIMER counter */ +void timer_init(uint32_t timer_periph, timer_parameter_struct* initpara); +/* enable a TIMER */ +void timer_enable(uint32_t timer_periph); +/* disable a TIMER */ +void timer_disable(uint32_t timer_periph); +/* enable the auto reload shadow function */ +void timer_auto_reload_shadow_enable(uint32_t timer_periph); +/* disable the auto reload shadow function */ +void timer_auto_reload_shadow_disable(uint32_t timer_periph); +/* enable the update event */ +void timer_update_event_enable(uint32_t timer_periph); +/* disable the update event */ +void timer_update_event_disable(uint32_t timer_periph); +/* set TIMER counter alignment mode */ +void timer_counter_alignment(uint32_t timer_periph, uint16_t aligned); +/* set TIMER counter up direction */ +void timer_counter_up_direction(uint32_t timer_periph); +/* set TIMER counter down direction */ +void timer_counter_down_direction(uint32_t timer_periph); +/* configure TIMER prescaler */ +void timer_prescaler_config(uint32_t timer_periph, uint16_t prescaler, uint8_t pscreload); +/* configure TIMER repetition register value */ +void timer_repetition_value_config(uint32_t timer_periph, uint16_t repetition); +/* configure TIMER autoreload register value */ +void timer_autoreload_value_config(uint32_t timer_periph, uint16_t autoreload); +/* configure TIMER counter register value */ +void timer_counter_value_config(uint32_t timer_periph , uint16_t counter); +/* read TIMER counter value */ +uint32_t timer_counter_read(uint32_t timer_periph); +/* read TIMER prescaler value */ +uint16_t timer_prescaler_read(uint32_t timer_periph); +/* configure TIMER single pulse mode */ +void timer_single_pulse_mode_config(uint32_t timer_periph, uint32_t spmode); +/* configure TIMER update source */ +void timer_update_source_config(uint32_t timer_periph, uint32_t update); + +/* TIMER interrupt and flag*/ +/* enable the TIMER interrupt */ +void timer_interrupt_enable(uint32_t timer_periph, uint32_t interrupt); +/* disable the TIMER interrupt */ +void timer_interrupt_disable(uint32_t timer_periph, uint32_t interrupt); +/* get timer interrupt flag */ +FlagStatus timer_interrupt_flag_get(uint32_t timer_periph, uint32_t interrupt); +/* clear TIMER interrupt flag */ +void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt); +/* get TIMER flags */ +FlagStatus timer_flag_get(uint32_t timer_periph, uint32_t flag); +/* clear TIMER flags */ +void timer_flag_clear(uint32_t timer_periph, uint32_t flag); + +/* timer DMA and event*/ +/* enable the TIMER DMA */ +void timer_dma_enable(uint32_t timer_periph, uint16_t dma); +/* disable the TIMER DMA */ +void timer_dma_disable(uint32_t timer_periph, uint16_t dma); +/* channel DMA request source selection */ +void timer_channel_dma_request_source_select(uint32_t timer_periph, uint8_t dma_request); +/* configure the TIMER DMA transfer */ +void timer_dma_transfer_config(uint32_t timer_periph,uint32_t dma_baseaddr, uint32_t dma_lenth); +/* software generate events */ +void timer_event_software_generate(uint32_t timer_periph, uint16_t event); + +/* TIMER channel complementary protection */ +/* initialize TIMER break parameter struct */ +void timer_break_struct_para_init(timer_break_parameter_struct* breakpara); +/* configure TIMER break function */ +void timer_break_config(uint32_t timer_periph, timer_break_parameter_struct* breakpara); +/* enable TIMER break function */ +void timer_break_enable(uint32_t timer_periph); +/* disable TIMER break function */ +void timer_break_disable(uint32_t timer_periph); +/* enable TIMER output automatic function */ +void timer_automatic_output_enable(uint32_t timer_periph); +/* disable TIMER output automatic function */ +void timer_automatic_output_disable(uint32_t timer_periph); +/* enable or disable TIMER primary output function */ +void timer_primary_output_config(uint32_t timer_periph, ControlStatus newvalue); +/* enable or disable channel capture/compare control shadow register */ +void timer_channel_control_shadow_config(uint32_t timer_periph, ControlStatus newvalue); +/* configure TIMER channel control shadow register update control */ +void timer_channel_control_shadow_update_config(uint32_t timer_periph, uint8_t ccuctl); + +/* TIMER channel output */ +/* initialize TIMER channel output parameter struct */ +void timer_channel_output_struct_para_init(timer_oc_parameter_struct* ocpara); +/* configure TIMER channel output function */ +void timer_channel_output_config(uint32_t timer_periph,uint16_t channel, timer_oc_parameter_struct* ocpara); +/* configure TIMER channel output compare mode */ +void timer_channel_output_mode_config(uint32_t timer_periph, uint16_t channel,uint16_t ocmode); +/* configure TIMER channel output pulse value */ +void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, uint32_t pulse); +/* configure TIMER channel output shadow function */ +void timer_channel_output_shadow_config(uint32_t timer_periph, uint16_t channel, uint16_t ocshadow); +/* configure TIMER channel output fast function */ +void timer_channel_output_fast_config(uint32_t timer_periph, uint16_t channel, uint16_t ocfast); +/* configure TIMER channel output clear function */ +void timer_channel_output_clear_config(uint32_t timer_periph,uint16_t channel,uint16_t occlear); +/* configure TIMER channel output polarity */ +void timer_channel_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocpolarity); +/* configure TIMER channel complementary output polarity */ +void timer_channel_complementary_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnpolarity); +/* configure TIMER channel enable state */ +void timer_channel_output_state_config(uint32_t timer_periph, uint16_t channel, uint32_t state); +/* configure TIMER channel complementary output enable state */ +void timer_channel_complementary_output_state_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnstate); + +/* TIMER channel input */ +/* initialize TIMER channel input parameter struct */ +void timer_channel_input_struct_para_init(timer_ic_parameter_struct* icpara); +/* configure TIMER input capture parameter */ +void timer_input_capture_config(uint32_t timer_periph, uint16_t channel, timer_ic_parameter_struct* icpara); +/* configure TIMER channel input capture prescaler value */ +void timer_channel_input_capture_prescaler_config(uint32_t timer_periph, uint16_t channel, uint16_t prescaler); +/* read TIMER channel capture compare register value */ +uint32_t timer_channel_capture_value_register_read(uint32_t timer_periph, uint16_t channel); +/* configure TIMER input pwm capture function */ +void timer_input_pwm_capture_config(uint32_t timer_periph, uint16_t channel, timer_ic_parameter_struct* icpwm); +/* configure TIMER hall sensor mode */ +void timer_hall_mode_config(uint32_t timer_periph, uint32_t hallmode); + +/* TIMER master and slave */ +/* select TIMER input trigger source */ +void timer_input_trigger_source_select(uint32_t timer_periph, uint32_t intrigger); +/* select TIMER master mode output trigger source */ +void timer_master_output_trigger_source_select(uint32_t timer_periph, uint32_t outrigger); +/* select TIMER slave mode */ +void timer_slave_mode_select(uint32_t timer_periph,uint32_t slavemode); +/* configure TIMER master slave mode */ +void timer_master_slave_mode_config(uint32_t timer_periph, uint32_t masterslave); +/* configure TIMER external trigger input */ +void timer_external_trigger_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter); +/* configure TIMER quadrature decoder mode */ +void timer_quadrature_decoder_mode_config(uint32_t timer_periph, uint32_t decomode, uint16_t ic0polarity, uint16_t ic1polarity); +/* configure TIMER internal clock mode */ +void timer_internal_clock_config(uint32_t timer_periph); +/* configure TIMER the internal trigger as external clock input */ +void timer_internal_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t intrigger); +/* configure TIMER the external trigger as external clock input */ +void timer_external_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t extrigger, uint16_t extpolarity,uint32_t extfilter); +/* configure TIMER the external clock mode 0 */ +void timer_external_clock_mode0_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter); +/* configure TIMER the external clock mode 1 */ +void timer_external_clock_mode1_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter); +/* disable TIMER the external clock mode 1 */ +void timer_external_clock_mode1_disable(uint32_t timer_periph); + +/* TIMER configure */ +/* configure TIMER write CHxVAL register selection */ +void timer_write_chxval_register_config(uint32_t timer_periph, uint16_t ccsel); +/* configure TIMER output value selection */ +void timer_output_value_selection_config(uint32_t timer_periph, uint16_t outsel); + +#endif /* GD32F30X_TIMER_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_usart.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_usart.h new file mode 100644 index 0000000..198a0cf --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_usart.h @@ -0,0 +1,444 @@ +/*! + \file gd32f30x_usart.h + \brief definitions for the USART + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_USART_H +#define GD32F30X_USART_H + +#include "gd32f30x.h" + +/* USARTx(x=0,1,2)/UARTx(x=3,4) definitions */ +#define USART1 USART_BASE /*!< USART1 base address */ +#define USART2 (USART_BASE+0x00000400U) /*!< USART2 base address */ +#define UART3 (USART_BASE+0x00000800U) /*!< UART3 base address */ +#define UART4 (USART_BASE+0x00000C00U) /*!< UART4 base address */ +#define USART0 (USART_BASE+0x0000F400U) /*!< USART0 base address */ + +/* registers definitions */ +#define USART_STAT0(usartx) REG32((usartx) + 0x00U) /*!< USART status register 0 */ +#define USART_DATA(usartx) REG32((usartx) + 0x04U) /*!< USART data register */ +#define USART_BAUD(usartx) REG32((usartx) + 0x08U) /*!< USART baud rate register */ +#define USART_CTL0(usartx) REG32((usartx) + 0x0CU) /*!< USART control register 0 */ +#define USART_CTL1(usartx) REG32((usartx) + 0x10U) /*!< USART control register 1 */ +#define USART_CTL2(usartx) REG32((usartx) + 0x14U) /*!< USART control register 2 */ +#define USART_GP(usartx) REG32((usartx) + 0x18U) /*!< USART guard time and prescaler register */ +#define USART_CTL3(usartx) REG32((usartx) + 0x80U) /*!< USART control register 3 */ +#define USART_RT(usartx) REG32((usartx) + 0x84U) /*!< USART receiver timeout register */ +#define USART_STAT1(usartx) REG32((usartx) + 0x88U) /*!< USART status register 1 */ + +/* bits definitions */ +/* USARTx_STAT0 */ +#define USART_STAT0_PERR BIT(0) /*!< parity error flag */ +#define USART_STAT0_FERR BIT(1) /*!< frame error flag */ +#define USART_STAT0_NERR BIT(2) /*!< noise error flag */ +#define USART_STAT0_ORERR BIT(3) /*!< overrun error */ +#define USART_STAT0_IDLEF BIT(4) /*!< IDLE frame detected flag */ +#define USART_STAT0_RBNE BIT(5) /*!< read data buffer not empty */ +#define USART_STAT0_TC BIT(6) /*!< transmission complete */ +#define USART_STAT0_TBE BIT(7) /*!< transmit data buffer empty */ +#define USART_STAT0_LBDF BIT(8) /*!< LIN break detected flag */ +#define USART_STAT0_CTSF BIT(9) /*!< CTS change flag */ + +/* USARTx_DATA */ +#define USART_DATA_DATA BITS(0,8) /*!< transmit or read data value */ + +/* USARTx_BAUD */ +#define USART_BAUD_FRADIV BITS(0,3) /*!< fraction part of baud-rate divider */ +#define USART_BAUD_INTDIV BITS(4,15) /*!< integer part of baud-rate divider */ + +/* USARTx_CTL0 */ +#define USART_CTL0_SBKCMD BIT(0) /*!< send break command */ +#define USART_CTL0_RWU BIT(1) /*!< receiver wakeup from mute mode */ +#define USART_CTL0_REN BIT(2) /*!< receiver enable */ +#define USART_CTL0_TEN BIT(3) /*!< transmitter enable */ +#define USART_CTL0_IDLEIE BIT(4) /*!< idle line detected interrupt enable */ +#define USART_CTL0_RBNEIE BIT(5) /*!< read data buffer not empty interrupt and overrun error interrupt enable */ +#define USART_CTL0_TCIE BIT(6) /*!< transmission complete interrupt enable */ +#define USART_CTL0_TBEIE BIT(7) /*!< transmitter buffer empty interrupt enable */ +#define USART_CTL0_PERRIE BIT(8) /*!< parity error interrupt enable */ +#define USART_CTL0_PM BIT(9) /*!< parity mode */ +#define USART_CTL0_PCEN BIT(10) /*!< parity check function enable */ +#define USART_CTL0_WM BIT(11) /*!< wakeup method in mute mode */ +#define USART_CTL0_WL BIT(12) /*!< word length */ +#define USART_CTL0_UEN BIT(13) /*!< USART enable */ + +/* USARTx_CTL1 */ +#define USART_CTL1_ADDR BITS(0,3) /*!< address of USART */ +#define USART_CTL1_LBLEN BIT(5) /*!< LIN break frame length */ +#define USART_CTL1_LBDIE BIT(6) /*!< LIN break detected interrupt eanble */ +#define USART_CTL1_CLEN BIT(8) /*!< CK length */ +#define USART_CTL1_CPH BIT(9) /*!< CK phase */ +#define USART_CTL1_CPL BIT(10) /*!< CK polarity */ +#define USART_CTL1_CKEN BIT(11) /*!< CK pin enable */ +#define USART_CTL1_STB BITS(12,13) /*!< STOP bits length */ +#define USART_CTL1_LMEN BIT(14) /*!< LIN mode enable */ + +/* USARTx_CTL2 */ +#define USART_CTL2_ERRIE BIT(0) /*!< error interrupt enable */ +#define USART_CTL2_IREN BIT(1) /*!< IrDA mode enable */ +#define USART_CTL2_IRLP BIT(2) /*!< IrDA low-power */ +#define USART_CTL2_HDEN BIT(3) /*!< half-duplex enable */ +#define USART_CTL2_NKEN BIT(4) /*!< NACK enable in smartcard mode */ +#define USART_CTL2_SCEN BIT(5) /*!< smartcard mode enable */ +#define USART_CTL2_DENR BIT(6) /*!< DMA request enable for reception */ +#define USART_CTL2_DENT BIT(7) /*!< DMA request enable for transmission */ +#define USART_CTL2_RTSEN BIT(8) /*!< RTS enable */ +#define USART_CTL2_CTSEN BIT(9) /*!< CTS enable */ +#define USART_CTL2_CTSIE BIT(10) /*!< CTS interrupt enable */ + +/* USARTx_GP */ +#define USART_GP_PSC BITS(0,7) /*!< prescaler value for dividing the system clock */ +#define USART_GP_GUAT BITS(8,15) /*!< guard time value in smartcard mode */ + +/* USARTx_CTL3 */ +#define USART_CTL3_RTEN BIT(0) /*!< receiver timeout enable */ +#define USART_CTL3_SCRTNUM BITS(1,3) /*!< smartcard auto-retry number */ +#define USART_CTL3_RTIE BIT(4) /*!< interrupt enable bit of receive timeout event */ +#define USART_CTL3_EBIE BIT(5) /*!< interrupt enable bit of end of block event */ +#define USART_CTL3_RINV BIT(8) /*!< RX pin level inversion */ +#define USART_CTL3_TINV BIT(9) /*!< TX pin level inversion */ +#define USART_CTL3_DINV BIT(10) /*!< data bit level inversion */ +#define USART_CTL3_MSBF BIT(11) /*!< most significant bit first */ + +/* USARTx_RT */ +#define USART_RT_RT BITS(0,23) /*!< receiver timeout threshold */ +#define USART_RT_BL BITS(24,31) /*!< block length */ + +/* USARTx_STAT1 */ +#define USART_STAT1_RTF BIT(11) /*!< receiver timeout flag */ +#define USART_STAT1_EBF BIT(12) /*!< end of block flag */ +#define USART_STAT1_BSY BIT(16) /*!< busy flag */ + +/* constants definitions */ +/* define the USART bit position and its register index offset */ +#define USART_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define USART_REG_VAL(usartx, offset) (REG32((usartx) + (((uint32_t)(offset) & 0xFFFFU) >> 6))) +#define USART_BIT_POS(val) ((uint32_t)(val) & 0x1FU) +#define USART_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2) (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\ + | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))) +#define USART_REG_VAL2(usartx, offset) (REG32((usartx) + ((uint32_t)(offset) >> 22))) +#define USART_BIT_POS2(val) (((uint32_t)(val) & 0x1F0000U) >> 16) + +/* register offset */ +#define USART_STAT0_REG_OFFSET 0x00U /*!< STAT0 register offset */ +#define USART_STAT1_REG_OFFSET 0x88U /*!< STAT1 register offset */ +#define USART_CTL0_REG_OFFSET 0x0CU /*!< CTL0 register offset */ +#define USART_CTL1_REG_OFFSET 0x10U /*!< CTL1 register offset */ +#define USART_CTL2_REG_OFFSET 0x14U /*!< CTL2 register offset */ +#define USART_CTL3_REG_OFFSET 0x80U /*!< CTL3 register offset */ + +/* USART flags */ +typedef enum +{ + /* flags in STAT0 register */ + USART_FLAG_CTS = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 9U), /*!< CTS change flag */ + USART_FLAG_LBD = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 8U), /*!< LIN break detected flag */ + USART_FLAG_TBE = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 7U), /*!< transmit data buffer empty */ + USART_FLAG_TC = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 6U), /*!< transmission complete */ + USART_FLAG_RBNE = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 5U), /*!< read data buffer not empty */ + USART_FLAG_IDLE = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 4U), /*!< IDLE frame detected flag */ + USART_FLAG_ORERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 3U), /*!< overrun error */ + USART_FLAG_NERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 2U), /*!< noise error flag */ + USART_FLAG_FERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 1U), /*!< frame error flag */ + USART_FLAG_PERR = USART_REGIDX_BIT(USART_STAT0_REG_OFFSET, 0U), /*!< parity error flag */ + /* flags in STAT1 register */ + USART_FLAG_BSY = USART_REGIDX_BIT(USART_STAT1_REG_OFFSET, 16U), /*!< busy flag */ + USART_FLAG_EB = USART_REGIDX_BIT(USART_STAT1_REG_OFFSET, 12U), /*!< end of block flag */ + USART_FLAG_RT = USART_REGIDX_BIT(USART_STAT1_REG_OFFSET, 11U), /*!< receiver timeout flag */ +}usart_flag_enum; + +/* USART interrupt flags */ +typedef enum +{ + /* interrupt flags in CTL0 register */ + USART_INT_FLAG_PERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 8U, USART_STAT0_REG_OFFSET, 0U), /*!< parity error interrupt and flag */ + USART_INT_FLAG_TBE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 7U, USART_STAT0_REG_OFFSET, 7U), /*!< transmitter buffer empty interrupt and flag */ + USART_INT_FLAG_TC = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 6U, USART_STAT0_REG_OFFSET, 6U), /*!< transmission complete interrupt and flag */ + USART_INT_FLAG_RBNE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT0_REG_OFFSET, 5U), /*!< read data buffer not empty interrupt and flag */ + USART_INT_FLAG_RBNE_ORERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT0_REG_OFFSET, 3U), /*!< read data buffer not empty interrupt and overrun error flag */ + USART_INT_FLAG_IDLE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 4U, USART_STAT0_REG_OFFSET, 4U), /*!< IDLE line detected interrupt and flag */ + /* interrupt flags in CTL1 register */ + USART_INT_FLAG_LBD = USART_REGIDX_BIT2(USART_CTL1_REG_OFFSET, 6U, USART_STAT0_REG_OFFSET, 8U), /*!< LIN break detected interrupt and flag */ + /* interrupt flags in CTL2 register */ + USART_INT_FLAG_CTS = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 10U, USART_STAT0_REG_OFFSET, 9U), /*!< CTS interrupt and flag */ + USART_INT_FLAG_ERR_ORERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT0_REG_OFFSET, 3U), /*!< error interrupt and overrun error */ + USART_INT_FLAG_ERR_NERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT0_REG_OFFSET, 2U), /*!< error interrupt and noise error flag */ + USART_INT_FLAG_ERR_FERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT0_REG_OFFSET, 1U), /*!< error interrupt and frame error flag */ + /* interrupt flags in CTL3 register */ + USART_INT_FLAG_EB = USART_REGIDX_BIT2(USART_CTL3_REG_OFFSET, 5U, USART_STAT1_REG_OFFSET, 12U), /*!< interrupt enable bit of end of block event and flag */ + USART_INT_FLAG_RT = USART_REGIDX_BIT2(USART_CTL3_REG_OFFSET, 4U, USART_STAT1_REG_OFFSET, 11U), /*!< interrupt enable bit of receive timeout event and flag */ +}usart_interrupt_flag_enum; + +/* USART interrupt enable or disable */ +typedef enum +{ + /* interrupt in CTL0 register */ + USART_INT_PERR = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 8U), /*!< parity error interrupt */ + USART_INT_TBE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 7U), /*!< transmitter buffer empty interrupt */ + USART_INT_TC = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 6U), /*!< transmission complete interrupt */ + USART_INT_RBNE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 5U), /*!< read data buffer not empty interrupt and overrun error interrupt */ + USART_INT_IDLE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 4U), /*!< IDLE line detected interrupt */ + /* interrupt in CTL1 register */ + USART_INT_LBD = USART_REGIDX_BIT(USART_CTL1_REG_OFFSET, 6U), /*!< LIN break detected interrupt */ + /* interrupt in CTL2 register */ + USART_INT_CTS = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 10U), /*!< CTS interrupt */ + USART_INT_ERR = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 0U), /*!< error interrupt */ + /* interrupt in CTL3 register */ + USART_INT_EB = USART_REGIDX_BIT(USART_CTL3_REG_OFFSET, 5U), /*!< end of block interrupt */ + USART_INT_RT = USART_REGIDX_BIT(USART_CTL3_REG_OFFSET, 4U), /*!< receive timeout interrupt */ +}usart_interrupt_enum; + +/* USART invert configure */ +typedef enum +{ + /* data bit level inversion */ + USART_DINV_ENABLE, /*!< data bit level inversion */ + USART_DINV_DISABLE, /*!< data bit level not inversion */ + /* TX pin level inversion */ + USART_TXPIN_ENABLE, /*!< TX pin level inversion */ + USART_TXPIN_DISABLE, /*!< TX pin level not inversion */ + /* RX pin level inversion */ + USART_RXPIN_ENABLE, /*!< RX pin level inversion */ + USART_RXPIN_DISABLE, /*!< RX pin level not inversion */ +}usart_invert_enum; + +/* USART receiver configure */ +#define CTL0_REN(regval) (BIT(2) & ((uint32_t)(regval) << 2)) +#define USART_RECEIVE_ENABLE CTL0_REN(1) /*!< enable receiver */ +#define USART_RECEIVE_DISABLE CTL0_REN(0) /*!< disable receiver */ + +/* USART transmitter configure */ +#define CTL0_TEN(regval) (BIT(3) & ((uint32_t)(regval) << 3)) +#define USART_TRANSMIT_ENABLE CTL0_TEN(1) /*!< enable transmitter */ +#define USART_TRANSMIT_DISABLE CTL0_TEN(0) /*!< disable transmitter */ + +/* USART parity bits definitions */ +#define CTL0_PM(regval) (BITS(9,10) & ((uint32_t)(regval) << 9)) +#define USART_PM_NONE CTL0_PM(0) /*!< no parity */ +#define USART_PM_EVEN CTL0_PM(2) /*!< even parity */ +#define USART_PM_ODD CTL0_PM(3) /*!< odd parity */ + +/* USART wakeup method in mute mode */ +#define CTL0_WM(regval) (BIT(11) & ((uint32_t)(regval) << 11)) +#define USART_WM_IDLE CTL0_WM(0) /*!< idle line */ +#define USART_WM_ADDR CTL0_WM(1) /*!< address match */ + +/* USART word length definitions */ +#define CTL0_WL(regval) (BIT(12) & ((uint32_t)(regval) << 12)) +#define USART_WL_8BIT CTL0_WL(0) /*!< 8 bits */ +#define USART_WL_9BIT CTL0_WL(1) /*!< 9 bits */ + +/* USART stop bits definitions */ +#define CTL1_STB(regval) (BITS(12,13) & ((uint32_t)(regval) << 12)) +#define USART_STB_1BIT CTL1_STB(0) /*!< 1 bit */ +#define USART_STB_0_5BIT CTL1_STB(1) /*!< 0.5 bit */ +#define USART_STB_2BIT CTL1_STB(2) /*!< 2 bits */ +#define USART_STB_1_5BIT CTL1_STB(3) /*!< 1.5 bits */ + +/* USART LIN break frame length */ +#define CTL1_LBLEN(regval) (BIT(5) & ((uint32_t)(regval) << 5)) +#define USART_LBLEN_10B CTL1_LBLEN(0) /*!< 10 bits */ +#define USART_LBLEN_11B CTL1_LBLEN(1) /*!< 11 bits */ + +/* USART CK length */ +#define CTL1_CLEN(regval) (BIT(8) & ((uint32_t)(regval) << 8)) +#define USART_CLEN_NONE CTL1_CLEN(0) /*!< there are 7 CK pulses for an 8 bit frame and 8 CK pulses for a 9 bit frame */ +#define USART_CLEN_EN CTL1_CLEN(1) /*!< there are 8 CK pulses for an 8 bit frame and 9 CK pulses for a 9 bit frame */ + +/* USART clock phase */ +#define CTL1_CPH(regval) (BIT(9) & ((uint32_t)(regval) << 9)) +#define USART_CPH_1CK CTL1_CPH(0) /*!< first clock transition is the first data capture edge */ +#define USART_CPH_2CK CTL1_CPH(1) /*!< second clock transition is the first data capture edge */ + +/* USART clock polarity */ +#define CTL1_CPL(regval) (BIT(10) & ((uint32_t)(regval) << 10)) +#define USART_CPL_LOW CTL1_CPL(0) /*!< steady low value on CK pin */ +#define USART_CPL_HIGH CTL1_CPL(1) /*!< steady high value on CK pin */ + +/* USART DMA request for receive configure */ +#define CLT2_DENR(regval) (BIT(6) & ((uint32_t)(regval) << 6)) +#define USART_DENR_ENABLE CLT2_DENR(1) /*!< DMA request enable for reception */ +#define USART_DENR_DISABLE CLT2_DENR(0) /*!< DMA request disable for reception */ + +/* USART DMA request for transmission configure */ +#define CLT2_DENT(regval) (BIT(7) & ((uint32_t)(regval) << 7)) +#define USART_DENT_ENABLE CLT2_DENT(1) /*!< DMA request enable for transmission */ +#define USART_DENT_DISABLE CLT2_DENT(0) /*!< DMA request disable for transmission */ + +/* USART RTS configure */ +#define CLT2_RTSEN(regval) (BIT(8) & ((uint32_t)(regval) << 8)) +#define USART_RTS_ENABLE CLT2_RTSEN(1) /*!< RTS enable */ +#define USART_RTS_DISABLE CLT2_RTSEN(0) /*!< RTS disable */ + +/* USART CTS configure */ +#define CLT2_CTSEN(regval) (BIT(9) & ((uint32_t)(regval) << 9)) +#define USART_CTS_ENABLE CLT2_CTSEN(1) /*!< CTS enable */ +#define USART_CTS_DISABLE CLT2_CTSEN(0) /*!< CTS disable */ + +/* USART IrDA low-power enable */ +#define CTL2_IRLP(regval) (BIT(2) & ((uint32_t)(regval) << 2)) +#define USART_IRLP_LOW CTL2_IRLP(1) /*!< low-power */ +#define USART_IRLP_NORMAL CTL2_IRLP(0) /*!< normal */ + +/* USART data is transmitted/received with the LSB/MSB first */ +#define CTL3_MSBF(regval) (BIT(11) & ((uint32_t)(regval) << 11)) +#define USART_MSBF_LSB CTL3_MSBF(0) /*!< LSB first */ +#define USART_MSBF_MSB CTL3_MSBF(1) /*!< MSB first */ + +/* function declarations */ +/* initialization functions */ +/* reset USART */ +void usart_deinit(uint32_t usart_periph); +/* configure USART baud rate value */ +void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval); +/* configure USART parity function */ +void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg); +/* configure USART word length */ +void usart_word_length_set(uint32_t usart_periph, uint32_t wlen); +/* configure USART stop bit length */ +void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen); +/* enable USART */ +void usart_enable(uint32_t usart_periph); +/* disable USART */ +void usart_disable(uint32_t usart_periph); +/* configure USART transmitter */ +void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig); +/* configure USART receiver */ +void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig); + +/* USART normal mode communication */ +/* data is transmitted/received with the LSB/MSB first */ +void usart_data_first_config(uint32_t usart_periph, uint32_t msbf); +/* configure USART inverted */ +void usart_invert_config(uint32_t usart_periph, usart_invert_enum invertpara); +/* enable receiver timeout */ +void usart_receiver_timeout_enable(uint32_t usart_periph); +/* disable receiver timeout */ +void usart_receiver_timeout_disable(uint32_t usart_periph); +/* configure receiver timeout threshold */ +void usart_receiver_timeout_threshold_config(uint32_t usart_periph, uint32_t rtimeout); +/* USART transmit data function */ +void usart_data_transmit(uint32_t usart_periph, uint32_t data); +/* USART receive data function */ +uint16_t usart_data_receive(uint32_t usart_periph); + +/* multi-processor communication */ +/* configure address of the USART */ +void usart_address_config(uint32_t usart_periph, uint8_t addr); +/* enable mute mode */ +void usart_mute_mode_enable(uint32_t usart_periph); +/* disable mute mode */ +void usart_mute_mode_disable(uint32_t usart_periph); +/* configure wakeup method in mute mode */ +void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmethod); + +/* LIN mode communication */ +/* enable LIN mode */ +void usart_lin_mode_enable(uint32_t usart_periph); +/* disable LIN mode */ +void usart_lin_mode_disable(uint32_t usart_periph); +/* LIN break detection length */ +void usart_lin_break_detection_length_config(uint32_t usart_periph, uint32_t lblen); +/* send break frame */ +void usart_send_break(uint32_t usart_periph); + +/* half-duplex communication */ +/* enable half-duplex mode */ +void usart_halfduplex_enable(uint32_t usart_periph); +/* disable half-duplex mode */ +void usart_halfduplex_disable(uint32_t usart_periph); + +/* synchronous communication */ +/* enable CK pin in synchronous mode */ +void usart_synchronous_clock_enable(uint32_t usart_periph); +/* disable CK pin in synchronous mode */ +void usart_synchronous_clock_disable(uint32_t usart_periph); +/* configure usart synchronous mode parameters */ +void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl); + +/* smartcard communication */ +/* configure guard time value in smartcard mode */ +void usart_guard_time_config(uint32_t usart_periph,uint32_t guat); +/* enable smartcard mode */ +void usart_smartcard_mode_enable(uint32_t usart_periph); +/* disable smartcard mode */ +void usart_smartcard_mode_disable(uint32_t usart_periph); +/* enable NACK in smartcard mode */ +void usart_smartcard_mode_nack_enable(uint32_t usart_periph); +/* disable NACK in smartcard mode */ +void usart_smartcard_mode_nack_disable(uint32_t usart_periph); +/* configure smartcard auto-retry number */ +void usart_smartcard_autoretry_config(uint32_t usart_periph, uint32_t scrtnum); +/* configure block length */ +void usart_block_length_config(uint32_t usart_periph, uint32_t bl); + +/* IrDA communication */ +/* enable IrDA mode */ +void usart_irda_mode_enable(uint32_t usart_periph); +/* disable IrDA mode */ +void usart_irda_mode_disable(uint32_t usart_periph); +/* configure the peripheral clock prescaler */ +void usart_prescaler_config(uint32_t usart_periph, uint8_t psc); +/* configure IrDA low-power */ +void usart_irda_lowpower_config(uint32_t usart_periph, uint32_t irlp); + +/* hardware flow communication */ +/* configure hardware flow control RTS */ +void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig); +/* configure hardware flow control CTS */ +void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig); + +/* DMA communication */ +/* configure USART DMA for reception */ +void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd); +/* configure USART DMA for transmission */ +void usart_dma_transmit_config(uint32_t usart_periph, uint32_t dmacmd); + +/* flag & interrupt functions */ +/* get flag in STAT0/STAT1 register */ +FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag); +/* clear flag in STAT0/STAT1 register */ +void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag); +/* enable USART interrupt */ +void usart_interrupt_enable(uint32_t usart_periph, usart_interrupt_enum interrupt); +/* disable USART interrupt */ +void usart_interrupt_disable(uint32_t usart_periph, usart_interrupt_enum interrupt); +/* get USART interrupt and flag status */ +FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, usart_interrupt_flag_enum int_flag); +/* clear interrupt flag in STAT0/STAT1 register */ +void usart_interrupt_flag_clear(uint32_t usart_periph, usart_interrupt_flag_enum int_flag); + +#endif /* GD32F30x_USART_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_wwdgt.h a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_wwdgt.h new file mode 100644 index 0000000..ec9022a --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Include/gd32f30x_wwdgt.h @@ -0,0 +1,90 @@ +/*! + \file gd32f30x_wwdgt.h + \brief definitions for the WWDGT + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef GD32F30X_WWDGT_H +#define GD32F30X_WWDGT_H + +#include "gd32f30x.h" + +/* WWDGT definitions */ +#define WWDGT WWDGT_BASE + +/* registers definitions */ +#define WWDGT_CTL REG32((WWDGT) + 0x00U) /*!< WWDGT control register */ +#define WWDGT_CFG REG32((WWDGT) + 0x04U) /*!< WWDGT configuration register */ +#define WWDGT_STAT REG32((WWDGT) + 0x08U) /*!< WWDGT status register */ + +/* bits definitions */ +/* WWDGT_CTL */ +#define WWDGT_CTL_CNT BITS(0,6) /*!< WWDGT counter value */ +#define WWDGT_CTL_WDGTEN BIT(7) /*!< WWDGT counter enable */ + +/* WWDGT_CFG */ +#define WWDGT_CFG_WIN BITS(0,6) /*!< WWDGT counter window value */ +#define WWDGT_CFG_PSC BITS(7,8) /*!< WWDGT prescaler divider value */ +#define WWDGT_CFG_EWIE BIT(9) /*!< early wakeup interrupt enable */ + +/* WWDGT_STAT */ +#define WWDGT_STAT_EWIF BIT(0) /*!< early wakeup interrupt flag */ + +/* constants definitions */ +#define CFG_PSC(regval) (BITS(7,8) & ((uint32_t)(regval) << 7)) /*!< write value to WWDGT_CFG_PSC bit field */ +#define WWDGT_CFG_PSC_DIV1 CFG_PSC(0) /*!< the time base of WWDGT = (PCLK1/4096)/1 */ +#define WWDGT_CFG_PSC_DIV2 CFG_PSC(1) /*!< the time base of WWDGT = (PCLK1/4096)/2 */ +#define WWDGT_CFG_PSC_DIV4 CFG_PSC(2) /*!< the time base of WWDGT = (PCLK1/4096)/4 */ +#define WWDGT_CFG_PSC_DIV8 CFG_PSC(3) /*!< the time base of WWDGT = (PCLK1/4096)/8 */ + +/* function declarations */ +/* reset the window watchdog timer configuration */ +void wwdgt_deinit(void); +/* start the window watchdog timer counter */ +void wwdgt_enable(void); + +/* configure the window watchdog timer counter value */ +void wwdgt_counter_update(uint16_t counter_value); +/* configure counter value, window value, and prescaler divider value */ +void wwdgt_config(uint16_t counter, uint16_t window, uint32_t prescaler); + +/* enable early wakeup interrupt of WWDGT */ +void wwdgt_interrupt_enable(void); +/* check early wakeup interrupt state of WWDGT */ +FlagStatus wwdgt_flag_get(void); +/* clear early wakeup interrupt state of WWDGT */ +void wwdgt_flag_clear(void); + +#endif /* GD32F30X_WWDGT_H */ diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_adc.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_adc.c new file mode 100644 index 0000000..2a8c536 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_adc.c @@ -0,0 +1,941 @@ +/*! + \file gd32f30x_adc.c + \brief ADC driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_adc.h" + +/*! + \brief reset ADC + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[out] none + \retval none +*/ +void adc_deinit(uint32_t adc_periph) +{ + switch(adc_periph){ + case ADC0: + rcu_periph_reset_enable(RCU_ADC0RST); + rcu_periph_reset_disable(RCU_ADC0RST); + break; + case ADC1: + rcu_periph_reset_enable(RCU_ADC1RST); + rcu_periph_reset_disable(RCU_ADC1RST); + break; +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + case ADC2: + rcu_periph_reset_enable(RCU_ADC2RST); + rcu_periph_reset_disable(RCU_ADC2RST); + break; +#endif + default: + break; + } +} + +/*! + \brief enable ADC interface + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[out] none + \retval none +*/ +void adc_enable(uint32_t adc_periph) +{ + if(RESET == (ADC_CTL1(adc_periph) & ADC_CTL1_ADCON)){ + ADC_CTL1(adc_periph) |= (uint32_t)ADC_CTL1_ADCON; + } +} + +/*! + \brief disable ADC interface + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[out] none + \retval none +*/ +void adc_disable(uint32_t adc_periph) +{ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ADCON); +} + +/*! + \brief ADC calibration and reset calibration + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[out] none + \retval none +*/ +void adc_calibration_enable(uint32_t adc_periph) +{ + /* reset the selected ADC calibration registers */ + ADC_CTL1(adc_periph) |= (uint32_t) ADC_CTL1_RSTCLB; + /* check the RSTCLB bit state */ + while((ADC_CTL1(adc_periph) & ADC_CTL1_RSTCLB)){ + } + /* enable ADC calibration process */ + ADC_CTL1(adc_periph) |= ADC_CTL1_CLB; + /* check the CLB bit state */ + while((ADC_CTL1(adc_periph) & ADC_CTL1_CLB)){ + } +} + +/*! + \brief enable DMA request + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[out] none + \retval none +*/ +void adc_dma_mode_enable(uint32_t adc_periph) +{ + ADC_CTL1(adc_periph) |= (uint32_t)(ADC_CTL1_DMA); +} + +/*! + \brief disable DMA request + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[out] none + \retval none +*/ +void adc_dma_mode_disable(uint32_t adc_periph) +{ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_DMA); +} + +/*! + \brief enable the temperature sensor and Vrefint channel + \param[in] none + \param[out] none + \retval none +*/ +void adc_tempsensor_vrefint_enable(void) +{ + /* enable the temperature sensor and Vrefint channel */ + ADC_CTL1(ADC0) |= ADC_CTL1_TSVREN; +} + +/*! + \brief disable the temperature sensor and Vrefint channel + \param[in] none + \param[out] none + \retval none +*/ +void adc_tempsensor_vrefint_disable(void) +{ + /* disable the temperature sensor and Vrefint channel */ + ADC_CTL1(ADC0) &= ~ADC_CTL1_TSVREN; +} + +/*! + \brief configure ADC resolution + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] resolution: ADC resolution + only one among these parameters can be selected + \arg ADC_RESOLUTION_12B: 12-bit ADC resolution + \arg ADC_RESOLUTION_10B: 10-bit ADC resolution + \arg ADC_RESOLUTION_8B: 8-bit ADC resolution + \arg ADC_RESOLUTION_6B: 6-bit ADC resolution + \param[out] none + \retval none +*/ +void adc_resolution_config(uint32_t adc_periph , uint32_t resolution) +{ + ADC_OVSAMPCTL(adc_periph) &= ~((uint32_t)ADC_OVSAMPCTL_DRES); + ADC_OVSAMPCTL(adc_periph) |= (uint32_t)resolution; +} + +/*! + \brief configure ADC discontinuous mode + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_channel_group: select the channel group + only one among these parameters can be selected + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \arg ADC_CHANNEL_DISCON_DISABLE: disable discontinuous mode of regular & inserted channel + \param[in] length: number of conversions in discontinuous mode,the number can be 1..8 + for regular channel ,the number has no effect for inserted channel + \param[out] none + \retval none +*/ +void adc_discontinuous_mode_config(uint32_t adc_periph, uint8_t adc_channel_group, uint8_t length) +{ + ADC_CTL0(adc_periph) &= ~((uint32_t)( ADC_CTL0_DISRC | ADC_CTL0_DISIC )); + switch(adc_channel_group){ + case ADC_REGULAR_CHANNEL: + /* config the number of conversions in discontinuous mode */ + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_DISNUM); + ADC_CTL0(adc_periph) |= CTL0_DISNUM(((uint32_t)length - 1U)); + + ADC_CTL0(adc_periph) |= (uint32_t)ADC_CTL0_DISRC; + break; + case ADC_INSERTED_CHANNEL: + ADC_CTL0(adc_periph) |= (uint32_t)ADC_CTL0_DISIC; + break; + case ADC_CHANNEL_DISCON_DISABLE: + default: + break; + } +} + +/*! + \brief configure the ADC sync mode + \param[in] mode: ADC mode + only one among these parameters can be selected + \arg ADC_MODE_FREE: all the ADCs work independently + \arg ADC_DAUL_REGULAL_PARALLEL_INSERTED_PARALLEL: ADC0 and ADC1 work in combined regular parallel + inserted parallel mode + \arg ADC_DAUL_REGULAL_PARALLEL_INSERTED_ROTATION: ADC0 and ADC1 work in combined regular parallel + trigger rotation mode + \arg ADC_DAUL_INSERTED_PARALLEL_REGULAL_FOLLOWUP_FAST: ADC0 and ADC1 work in combined inserted parallel + follow-up fast mode + \arg ADC_DAUL_INSERTED_PARALLEL_REGULAL_FOLLOWUP_SLOW: ADC0 and ADC1 work in combined inserted parallel + follow-up slow mode + \arg ADC_DAUL_INSERTED_PARALLEL: ADC0 and ADC1 work in inserted parallel mode only + \arg ADC_DAUL_REGULAL_PARALLEL: ADC0 and ADC1 work in regular parallel mode only + \arg ADC_DAUL_REGULAL_FOLLOWUP_FAST: ADC0 and ADC1 work in follow-up fast mode only + \arg ADC_DAUL_REGULAL_FOLLOWUP_SLOW: ADC0 and ADC1 work in follow-up slow mode only + \arg ADC_DAUL_INSERTED_TRRIGGER_ROTATION: ADC0 and ADC1 work in trigger rotation mode only + \param[out] none + \retval none +*/ +void adc_mode_config(uint32_t mode) +{ + ADC_CTL0(ADC0) &= ~(ADC_CTL0_SYNCM); + ADC_CTL0(ADC0) |= mode; +} + +/*! + \brief enable or disable ADC special function + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] function: the function to config + one or more parameters can be selected below + \arg ADC_SCAN_MODE: scan mode select + \arg ADC_INSERTED_CHANNEL_AUTO: inserted channel group convert automatically + \arg ADC_CONTINUOUS_MODE: continuous mode select + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void adc_special_function_config(uint32_t adc_periph , uint32_t function , ControlStatus newvalue) +{ + if(newvalue){ + if(0U != (function & ADC_SCAN_MODE)){ + ADC_CTL0(adc_periph) |= ADC_SCAN_MODE; + } + if(0U != (function & ADC_INSERTED_CHANNEL_AUTO)){ + ADC_CTL0(adc_periph) |= ADC_INSERTED_CHANNEL_AUTO; + } + if(0U != (function & ADC_CONTINUOUS_MODE)){ + ADC_CTL1(adc_periph) |= ADC_CONTINUOUS_MODE; + } + }else{ + if(0U != (function & ADC_SCAN_MODE)){ + ADC_CTL0(adc_periph) &= ~ADC_SCAN_MODE; + } + if(0U != (function & ADC_INSERTED_CHANNEL_AUTO)){ + ADC_CTL0(adc_periph) &= ~ADC_INSERTED_CHANNEL_AUTO; + } + if(0U != (function & ADC_CONTINUOUS_MODE)){ + ADC_CTL1(adc_periph) &= ~ADC_CONTINUOUS_MODE; + } + } +} + +/*! + \brief configure ADC data alignment + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] data_alignment: data alignment select + only one parameter can be selected + \arg ADC_DATAALIGN_RIGHT: LSB alignment + \arg ADC_DATAALIGN_LEFT: MSB alignment + \param[out] none + \retval none +*/ +void adc_data_alignment_config(uint32_t adc_periph , uint32_t data_alignment) +{ + if(ADC_DATAALIGN_RIGHT != data_alignment){ + ADC_CTL1(adc_periph) |= ADC_CTL1_DAL; + }else{ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_DAL); + } +} + +/*! + \brief configure the length of regular channel group or inserted channel group + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_channel_group: select the channel group + only one parameter can be selected + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \param[in] length: the length of the channel + regular channel 1-16 + inserted channel 1-4 + \param[out] none + \retval none +*/ +void adc_channel_length_config(uint32_t adc_periph, uint8_t adc_channel_group, uint32_t length) +{ + switch(adc_channel_group){ + case ADC_REGULAR_CHANNEL: + ADC_RSQ0(adc_periph) &= ~((uint32_t)ADC_RSQ0_RL); + ADC_RSQ0(adc_periph) |= RSQ0_RL((uint32_t)(length-1U)); + + break; + case ADC_INSERTED_CHANNEL: + ADC_ISQ(adc_periph) &= ~((uint32_t)ADC_ISQ_IL); + ADC_ISQ(adc_periph) |= ISQ_IL((uint32_t)(length-1U)); + + break; + default: + break; + } +} + +/*! + \brief configure ADC regular channel + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] rank: the regular group sequence rank,this parameter must be between 0 to 15 + \param[in] adc_channel: the selected ADC channel + only one among these parameters can be selected + \arg ADC_CHANNEL_x(x=0..17)(x=16 and x=17 are only for ADC0): ADC Channelx + \param[in] sample_time: the sample time value + only one parameter can be selected + \arg ADC_SAMPLETIME_1POINT5: 1.5 cycles + \arg ADC_SAMPLETIME_7POINT5: 7.5 cycles + \arg ADC_SAMPLETIME_13POINT5: 13.5 cycles + \arg ADC_SAMPLETIME_28POINT5: 28.5 cycles + \arg ADC_SAMPLETIME_41POINT5: 41.5 cycles + \arg ADC_SAMPLETIME_55POINT5: 55.5 cycles + \arg ADC_SAMPLETIME_71POINT5: 71.5 cycles + \arg ADC_SAMPLETIME_239POINT5: 239.5 cycles + \param[out] none + \retval none +*/ +void adc_regular_channel_config(uint32_t adc_periph , uint8_t rank , uint8_t adc_channel , uint32_t sample_time) +{ + uint32_t rsq,sampt; + + /* ADC regular sequence config */ + if(rank < 6U){ + rsq = ADC_RSQ2(adc_periph); + rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (5U*rank))); + rsq |= ((uint32_t)adc_channel << (5U*rank)); + ADC_RSQ2(adc_periph) = rsq; + }else if(rank < 12U){ + rsq = ADC_RSQ1(adc_periph); + rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (5U*(rank-6U)))); + rsq |= ((uint32_t)adc_channel << (5U*(rank-6U))); + ADC_RSQ1(adc_periph) = rsq; + }else if(rank < 16U){ + rsq = ADC_RSQ0(adc_periph); + rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (5U*(rank-12U)))); + rsq |= ((uint32_t)adc_channel << (5U*(rank-12U))); + ADC_RSQ0(adc_periph) = rsq; + }else{ + } + + /* ADC sampling time config */ + if(adc_channel < 10U){ + sampt = ADC_SAMPT1(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (3U*adc_channel))); + sampt |= (uint32_t)(sample_time << (3U*adc_channel)); + ADC_SAMPT1(adc_periph) = sampt; + }else if(adc_channel < 18U){ + sampt = ADC_SAMPT0(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (3U*(adc_channel-10U)))); + sampt |= (uint32_t)(sample_time << (3U*(adc_channel-10U))); + ADC_SAMPT0(adc_periph) = sampt; + }else{ + } +} + +/*! + \brief configure ADC inserted channel + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] rank: the inserted group sequencer rank,this parameter must be between 0 to 3 + \param[in] adc_channel: the selected ADC channel + only one among these parameters can be selected + \arg ADC_CHANNEL_x(x=0..17)(x=16 and x=17 are only for ADC0): ADC Channelx + \param[in] sample_time: The sample time value + only one parameter can be selected + \arg ADC_SAMPLETIME_1POINT5: 1.5 cycles + \arg ADC_SAMPLETIME_7POINT5: 7.5 cycles + \arg ADC_SAMPLETIME_13POINT5: 13.5 cycles + \arg ADC_SAMPLETIME_28POINT5: 28.5 cycles + \arg ADC_SAMPLETIME_41POINT5: 41.5 cycles + \arg ADC_SAMPLETIME_55POINT5: 55.5 cycles + \arg ADC_SAMPLETIME_71POINT5: 71.5 cycles + \arg ADC_SAMPLETIME_239POINT5: 239.5 cycles + \param[out] none + \retval none +*/ +void adc_inserted_channel_config(uint32_t adc_periph , uint8_t rank , uint8_t adc_channel , uint32_t sample_time) +{ + uint8_t inserted_length; + uint32_t isq,sampt; + + inserted_length = (uint8_t)GET_BITS(ADC_ISQ(adc_periph) , 20U , 21U); + + isq = ADC_ISQ(adc_periph); + isq &= ~((uint32_t)(ADC_ISQ_ISQN << (5U * ((3 + rank) - inserted_length)))); + isq |= ((uint32_t)adc_channel << (5U * ((3 + rank) - inserted_length))); + ADC_ISQ(adc_periph) = isq; + + /* ADC sampling time config */ + if(adc_channel < 10U){ + sampt = ADC_SAMPT1(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (3U*adc_channel))); + sampt |= (uint32_t) sample_time << (3U*adc_channel); + ADC_SAMPT1(adc_periph) = sampt; + }else if(adc_channel < 18U){ + sampt = ADC_SAMPT0(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (3U*(adc_channel-10U)))); + sampt |= ((uint32_t)sample_time << (3U*(adc_channel-10U))); + ADC_SAMPT0(adc_periph) = sampt; + }else{ + } +} + +/*! + \brief configure ADC inserted channel offset + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] inserted_channel : insert channel select + only one parameter can be selected + \arg ADC_INSERTED_CHANNEL_0: inserted channel0 + \arg ADC_INSERTED_CHANNEL_1: inserted channel1 + \arg ADC_INSERTED_CHANNEL_2: inserted channel2 + \arg ADC_INSERTED_CHANNEL_3: inserted channel3 + \param[in] offset : the offset data + \param[out] none + \retval none +*/ +void adc_inserted_channel_offset_config(uint32_t adc_periph , uint8_t inserted_channel , uint16_t offset) +{ + uint8_t inserted_length; + uint32_t num = 0U; + + inserted_length = (uint8_t)GET_BITS(ADC_ISQ(adc_periph) , 20U , 21U); + num = 3U - (inserted_length - inserted_channel); + + if(num <= 3U){ + /* calculate the offset of the register */ + num = num * 4U; + /* config the offset of the selected channels */ + REG32((adc_periph) + 0x14U + num) = IOFFX_IOFF((uint32_t)offset); + } +} + +/*! + \brief enable ADC external trigger + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_channel_group: select the channel group + one or more parameters can be selected + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void adc_external_trigger_config(uint32_t adc_periph, uint8_t adc_channel_group, ControlStatus newvalue) +{ + if(newvalue){ + if(0U != (adc_channel_group & ADC_REGULAR_CHANNEL)){ + ADC_CTL1(adc_periph) |= ADC_CTL1_ETERC; + } + if(0U != (adc_channel_group & ADC_INSERTED_CHANNEL)){ + ADC_CTL1(adc_periph) |= ADC_CTL1_ETEIC; + } + }else{ + if(0U != (adc_channel_group & ADC_REGULAR_CHANNEL)){ + ADC_CTL1(adc_periph) &= ~ADC_CTL1_ETERC; + } + if(0U != (adc_channel_group & ADC_INSERTED_CHANNEL)){ + ADC_CTL1(adc_periph) &= ~ADC_CTL1_ETEIC; + } + } +} + +/*! + \brief configure ADC external trigger source + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_channel_group: select the channel group + only one parameter can be selected + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \param[in] external_trigger_source: regular or inserted group trigger source + only one parameter can be selected + for regular channel: + \arg ADC0_1_EXTTRIG_REGULAR_T0_CH0: timer 0 CC0 event select + \arg ADC0_1_EXTTRIG_REGULAR_T0_CH1: timer 0 CC1 event select + \arg ADC0_1_EXTTRIG_REGULAR_T0_CH2: timer 0 CC2 event select + \arg ADC0_1_EXTTRIG_REGULAR_T1_CH1: timer 1 CC1 event select + \arg ADC0_1_EXTTRIG_REGULAR_T2_TRGO: timer 2 TRGO event select + \arg ADC0_1_EXTTRIG_REGULAR_T3_CH3: timer 3 CC3 event select + \arg ADC0_1_EXTTRIG_REGULAR_T7_TRGO: timer 7 TRGO event select + \arg ADC0_1_EXTTRIG_REGULAR_EXTI_11 : external interrupt line 11 + \arg ADC2_EXTTRIG_REGULAR_T2_CH0: timer 2 CC0 event select + \arg ADC2_EXTTRIG_REGULAR_T1_CH2: timer 1 CC2 event select + \arg ADC2_EXTTRIG_REGULAR_T0_CH2: timer 0 CC2 event select + \arg ADC2_EXTTRIG_REGULAR_T7_CH0: timer 7 CC0 event select + \arg ADC2_EXTTRIG_REGULAR_T7_TRGO: timer 7 TRGO event select + \arg ADC2_EXTTRIG_REGULAR_T4_CH0: timer 4 CC0 event select + \arg ADC2_EXTTRIG_REGULAR_T4_CH2: timer 4 CC2 event select + \arg ADC0_1_2_EXTTRIG_REGULAR_NONE: software trigger + for inserted channel: + \arg ADC0_1_EXTTRIG_INSERTED_T0_TRGO: timer 0 TRGO event select + \arg ADC0_1_EXTTRIG_INSERTED_T0_CH3: timer 0 CC3 event select + \arg ADC0_1_EXTTRIG_INSERTED_T1_TRGO: timer 1 TRGO event select + \arg ADC0_1_EXTTRIG_INSERTED_T1_CH0: timer 1 CC0 event select + \arg ADC0_1_EXTTRIG_INSERTED_T2_CH3: timer 2 CC3 event select + \arg ADC0_1_EXTTRIG_INSERTED_T3_TRGO: timer 3 TRGO event select + \arg ADC0_1_EXTTRIG_INSERTED_EXTI_15: external interrupt line 15 + \arg ADC0_1_EXTTRIG_INSERTED_T7_CH3: timer 7 CC3 event select + \arg ADC2_EXTTRIG_INSERTED_T0_TRGO: timer 0 TRGO event select + \arg ADC2_EXTTRIG_INSERTED_T0_CH3: timer 0 CC3 event select + \arg ADC2_EXTTRIG_INSERTED_T3_CH2: timer 3 CC2 event select + \arg ADC2_EXTTRIG_INSERTED_T7_CH1: timer 7 CC1 event select + \arg ADC2_EXTTRIG_INSERTED_T7_CH3: timer 7 CC3 event select + \arg ADC2_EXTTRIG_INSERTED_T4_TRGO: timer 4 TRGO event select + \arg ADC2_EXTTRIG_INSERTED_T4_CH3: timer 4 CC3 event select + \arg ADC0_1_2_EXTTRIG_INSERTED_NONE: software trigger + \param[out] none + \retval none +*/ +void adc_external_trigger_source_config(uint32_t adc_periph, uint8_t adc_channel_group, uint32_t external_trigger_source) +{ + switch(adc_channel_group){ + case ADC_REGULAR_CHANNEL: + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETSRC); + ADC_CTL1(adc_periph) |= (uint32_t)external_trigger_source; + break; + case ADC_INSERTED_CHANNEL: + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETSIC); + ADC_CTL1(adc_periph) |= (uint32_t)external_trigger_source; + break; + default: + break; + } +} + +/*! + \brief enable ADC software trigger + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_channel_group: select the channel group + one or more parameters can be selected + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \param[out] none + \retval none +*/ +void adc_software_trigger_enable(uint32_t adc_periph , uint8_t adc_channel_group) +{ + if(0U != (adc_channel_group & ADC_REGULAR_CHANNEL)){ + ADC_CTL1(adc_periph) |= ADC_CTL1_SWRCST; + } + if(0U != (adc_channel_group & ADC_INSERTED_CHANNEL)){ + ADC_CTL1(adc_periph) |= ADC_CTL1_SWICST; + } +} + +/*! + \brief read ADC regular group data register + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] none + \param[out] none + \retval the conversion value +*/ +uint16_t adc_regular_data_read(uint32_t adc_periph) +{ + return (uint16_t)(ADC_RDATA(adc_periph)); +} + +/*! + \brief read ADC inserted group data register + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] inserted_channel : insert channel select + only one parameter can be selected + \arg ADC_INSERTED_CHANNEL_0: inserted Channel0 + \arg ADC_INSERTED_CHANNEL_1: inserted channel1 + \arg ADC_INSERTED_CHANNEL_2: inserted Channel2 + \arg ADC_INSERTED_CHANNEL_3: inserted Channel3 + \param[out] none + \retval the conversion value +*/ +uint16_t adc_inserted_data_read(uint32_t adc_periph , uint8_t inserted_channel) +{ + uint32_t idata; + /* read the data of the selected channel */ + switch(inserted_channel){ + case ADC_INSERTED_CHANNEL_0: + idata = ADC_IDATA0(adc_periph); + break; + case ADC_INSERTED_CHANNEL_1: + idata = ADC_IDATA1(adc_periph); + break; + case ADC_INSERTED_CHANNEL_2: + idata = ADC_IDATA2(adc_periph); + break; + case ADC_INSERTED_CHANNEL_3: + idata = ADC_IDATA3(adc_periph); + break; + default: + idata = 0U; + break; + } + return (uint16_t)idata; +} + +/*! + \brief read the last ADC0 and ADC1 conversion result data in sync mode + \param[in] none + \param[out] none + \retval the conversion value +*/ +uint32_t adc_sync_mode_convert_value_read(void) +{ + /* return conversion value */ + return ADC_RDATA(ADC0); +} + +/*! + \brief get the ADC flag bits + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_flag: the adc flag bits + only one parameter can be selected + \arg ADC_FLAG_WDE: analog watchdog event flag + \arg ADC_FLAG_EOC: end of group conversion flag + \arg ADC_FLAG_EOIC: end of inserted group conversion flag + \arg ADC_FLAG_STIC: start flag of inserted channel group + \arg ADC_FLAG_STRC: start flag of regular channel group + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus adc_flag_get(uint32_t adc_periph , uint32_t adc_flag) +{ + FlagStatus reval = RESET; + if(ADC_STAT(adc_periph) & adc_flag){ + reval = SET; + } + return reval; +} + +/*! + \brief clear the ADC flag bits + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_flag: the adc flag bits + one or more parameters can be selected + \arg ADC_FLAG_WDE: analog watchdog event flag + \arg ADC_FLAG_EOC: end of group conversion flag + \arg ADC_FLAG_EOIC: end of inserted group conversion flag + \arg ADC_FLAG_STIC: start flag of inserted channel group + \arg ADC_FLAG_STRC: start flag of regular channel group + \param[out] none + \retval none +*/ +void adc_flag_clear(uint32_t adc_periph , uint32_t adc_flag) +{ + ADC_STAT(adc_periph) &= ~((uint32_t)adc_flag); +} + +/*! + \brief get the ADC interrupt bits + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_interrupt: the adc interrupt bits + only oneparameter can be selected + \arg ADC_INT_FLAG_WDE: analog watchdog interrupt + \arg ADC_INT_FLAG_EOC: end of group conversion interrupt + \arg ADC_INT_FLAG_EOIC: end of inserted group conversion interrupt + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus adc_interrupt_flag_get(uint32_t adc_periph , uint32_t adc_interrupt) +{ + FlagStatus interrupt_flag = RESET; + uint32_t state; + /* check the interrupt bits */ + switch(adc_interrupt){ + case ADC_INT_FLAG_WDE: + state = ADC_STAT(adc_periph) & ADC_STAT_WDE; + if((ADC_CTL0(adc_periph) & ADC_CTL0_WDEIE) && state){ + interrupt_flag = SET; + } + break; + case ADC_INT_FLAG_EOC: + state = ADC_STAT(adc_periph) & ADC_STAT_EOC; + if((ADC_CTL0(adc_periph) & ADC_CTL0_EOCIE) && state){ + interrupt_flag = SET; + } + break; + case ADC_INT_FLAG_EOIC: + state = ADC_STAT(adc_periph) & ADC_STAT_EOIC; + if((ADC_CTL0(adc_periph) & ADC_CTL0_EOICIE) && state){ + interrupt_flag = SET; + } + break; + default: + break; + } + return interrupt_flag; +} + +/*! + \brief clear the ADC flag + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_interrupt: the adc status flag + one or more parameters can be selected + \arg ADC_INT_FLAG_WDE: analog watchdog interrupt + \arg ADC_INT_FLAG_EOC: end of group conversion interrupt + \arg ADC_INT_FLAG_EOIC: end of inserted group conversion interrupt + \param[out] none + \retval none +*/ +void adc_interrupt_flag_clear(uint32_t adc_periph , uint32_t adc_interrupt) +{ + ADC_STAT(adc_periph) &= ~((uint32_t)adc_interrupt); +} + +/*! + \brief enable ADC interrupt + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_interrupt: the adc interrupt + one or more parameters can be selected + \arg ADC_INT_WDE: analog watchdog interrupt flag + \arg ADC_INT_EOC: end of group conversion interrupt flag + \arg ADC_INT_EOIC: end of inserted group conversion interrupt flag + \param[out] none + \retval none +*/ +void adc_interrupt_enable(uint32_t adc_periph , uint32_t adc_interrupt) +{ + if(0U != (adc_interrupt & ADC_INT_WDE)){ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_WDEIE; + } + + if(0U != (adc_interrupt & ADC_INT_EOC)){ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_EOCIE; + } + + if(0U != (adc_interrupt & ADC_INT_EOIC)){ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_EOICIE; + } +} + +/*! + \brief disable ADC interrupt + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_interrupt: the adc interrupt flag + one or more parameters can be selected + \arg ADC_INT_WDE: analog watchdog interrupt flag + \arg ADC_INT_EOC: end of group conversion interrupt flag + \arg ADC_INT_EOIC: end of inserted group conversion interrupt flag + \param[out] none + \retval none +*/ +void adc_interrupt_disable(uint32_t adc_periph, uint32_t adc_interrupt) +{ + if(0U != (adc_interrupt & ADC_INT_WDE)){ + ADC_CTL0(adc_periph) &= ~(uint32_t) ADC_CTL0_WDEIE; + } + + if(0U != (adc_interrupt & ADC_INT_EOC)){ + ADC_CTL0(adc_periph) &= ~(uint32_t) ADC_CTL0_EOCIE; + } + + if(0U != (adc_interrupt & ADC_INT_EOIC)){ + ADC_CTL0(adc_periph) &= ~(uint32_t) ADC_CTL0_EOICIE; + } +} + +/*! + \brief configure ADC analog watchdog single channel + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_channel: the selected ADC channel + only one among these parameters can be selected + \arg ADC_CHANNEL_x: ADC Channelx(x=0..17)(x=16 and x=17 are only for ADC0) + \param[out] none + \retval none +*/ +void adc_watchdog_single_channel_enable(uint32_t adc_periph, uint8_t adc_channel) +{ + ADC_CTL0(adc_periph) &= (uint32_t)~(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN | ADC_CTL0_WDSC | ADC_CTL0_WDCHSEL); + + ADC_CTL0(adc_periph) |= (uint32_t)adc_channel; + ADC_CTL0(adc_periph) |= (uint32_t)(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN | ADC_CTL0_WDSC); +} + +/*! + \brief configure ADC analog watchdog group channel + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] adc_channel_group: the channel group use analog watchdog + only one parameter can be selected + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \arg ADC_REGULAR_INSERTED_CHANNEL: both regular and inserted group + \param[out] none + \retval none +*/ +void adc_watchdog_group_channel_enable(uint32_t adc_periph, uint8_t adc_channel_group) +{ + ADC_CTL0(adc_periph) &= (uint32_t)~(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN | ADC_CTL0_WDSC); + /* select the group */ + switch(adc_channel_group){ + case ADC_REGULAR_CHANNEL: + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_RWDEN; + break; + case ADC_INSERTED_CHANNEL: + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_IWDEN; + break; + case ADC_REGULAR_INSERTED_CHANNEL: + ADC_CTL0(adc_periph) |= (uint32_t)(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN); + break; + default: + break; + } +} + +/*! + \brief disable ADC analog watchdog + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[out] none + \retval none +*/ +void adc_watchdog_disable(uint32_t adc_periph) +{ + ADC_CTL0(adc_periph) &= (uint32_t)~(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN | ADC_CTL0_WDSC | ADC_CTL0_WDCHSEL); +} + +/*! + \brief configure ADC analog watchdog threshold + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] low_threshold: analog watchdog low threshold,0..4095 + \param[in] high_threshold: analog watchdog high threshold,0..4095 + \param[out] none + \retval none +*/ +void adc_watchdog_threshold_config(uint32_t adc_periph , uint16_t low_threshold , uint16_t high_threshold) +{ + ADC_WDLT(adc_periph) = (uint32_t)WDLT_WDLT(low_threshold); + ADC_WDHT(adc_periph) = (uint32_t)WDHT_WDHT(high_threshold); +} + +/*! + \brief configure ADC oversample mode + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[in] mode: ADC oversampling mode + only oneparameter can be selected + \arg ADC_OVERSAMPLING_ALL_CONVERT: all oversampled conversions for a channel are done consecutively after a trigger + \arg ADC_OVERSAMPLING_ONE_CONVERT: each oversampled conversion for a channel needs a trigger + \param[in] shift: ADC oversampling shift + only oneparameter can be selected + \arg ADC_OVERSAMPLING_SHIFT_NONE: no oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_1B: 1-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_2B: 2-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_3B: 3-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_4B: 3-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_5B: 5-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_6B: 6-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_7B: 7-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_8B: 8-bit oversampling shift + \param[in] ratio: ADC oversampling ratio + only oneparameter can be selected + \arg ADC_OVERSAMPLING_RATIO_MUL2: oversampling ratio multiple 2 + \arg ADC_OVERSAMPLING_RATIO_MUL4: oversampling ratio multiple 4 + \arg ADC_OVERSAMPLING_RATIO_MUL8: oversampling ratio multiple 8 + \arg ADC_OVERSAMPLING_RATIO_MUL16: oversampling ratio multiple 16 + \arg ADC_OVERSAMPLING_RATIO_MUL32: oversampling ratio multiple 32 + \arg ADC_OVERSAMPLING_RATIO_MUL64: oversampling ratio multiple 64 + \arg ADC_OVERSAMPLING_RATIO_MUL128: oversampling ratio multiple 128 + \arg ADC_OVERSAMPLING_RATIO_MUL256: oversampling ratio multiple 256 + \param[out] none + \retval none +*/ +void adc_oversample_mode_config(uint32_t adc_periph, uint32_t mode, uint16_t shift, uint8_t ratio) +{ + if(ADC_OVERSAMPLING_ONE_CONVERT == mode){ + ADC_OVSAMPCTL(adc_periph) |= (uint32_t)ADC_OVSAMPCTL_TOVS; + }else{ + ADC_OVSAMPCTL(adc_periph) &= ~((uint32_t)ADC_OVSAMPCTL_TOVS); + } + /* config the shift and ratio */ + ADC_OVSAMPCTL(adc_periph) &= ~((uint32_t)(ADC_OVSAMPCTL_OVSR | ADC_OVSAMPCTL_OVSS)); + ADC_OVSAMPCTL(adc_periph) |= ((uint32_t)shift | (uint32_t)ratio); +} + +/*! + \brief enable ADC oversample mode + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[out] none + \retval none +*/ +void adc_oversample_mode_enable(uint32_t adc_periph) +{ + ADC_OVSAMPCTL(adc_periph) |= ADC_OVSAMPCTL_OVSEN; +} + +/*! + \brief disable ADC oversample mode + \param[in] adc_periph: ADCx,x=0,1,2 + only one among these parameters can be selected + \param[out] none + \retval none +*/ +void adc_oversample_mode_disable(uint32_t adc_periph) +{ + ADC_OVSAMPCTL(adc_periph) &= ~((uint32_t)ADC_OVSAMPCTL_OVSEN); +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_bkp.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_bkp.c new file mode 100644 index 0000000..6bf086b --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_bkp.c @@ -0,0 +1,328 @@ +/*! + \file gd32f30x_bkp.c + \brief BKP driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_bkp.h" + +#define TAMPER_FLAG_SHIFT ((uint8_t)8U) + +/*! + \brief reset BKP registers + \param[in] none + \param[out] none + \retval none +*/ +void bkp_deinit(void) +{ + /* reset BKP domain register*/ + rcu_bkp_reset_enable(); + rcu_bkp_reset_disable(); +} + +/*! + \brief write BKP data register + \param[in] register_number: refer to bkp_data_register_enum, only one parameter can be selected + \arg BKP_DATA_x(x = 0..41): bkp data register number x + \param[in] data: the data to be write in BKP data register + \param[out] none + \retval none +*/ +void bkp_write_data(bkp_data_register_enum register_number, uint16_t data) +{ + if((register_number >= BKP_DATA_10) && (register_number <= BKP_DATA_41)){ + BKP_DATA10_41(register_number-1U) = data; + }else if((register_number >= BKP_DATA_0) && (register_number <= BKP_DATA_9)){ + BKP_DATA0_9(register_number-1U) = data; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief read BKP data register + \param[in] register_number: refer to bkp_data_register_enum, only one parameter can be selected + \arg BKP_DATA_x(x = 0..41): bkp data register number x + \param[out] none + \retval data of BKP data register +*/ +uint16_t bkp_read_data(bkp_data_register_enum register_number) +{ + uint16_t data = 0U; + + /* get the data from the BKP data register */ + if((register_number >= BKP_DATA_10) && (register_number <= BKP_DATA_41)){ + data = BKP_DATA10_41(register_number-1U); + }else if((register_number >= BKP_DATA_0) && (register_number <= BKP_DATA_9)){ + data = BKP_DATA0_9(register_number-1U); + }else{ + /* illegal parameters */ + } + return data; +} + +/*! + \brief enable RTC clock calibration output + \param[in] none + \param[out] none + \retval none +*/ +void bkp_rtc_calibration_output_enable(void) +{ + BKP_OCTL |= (uint16_t)BKP_OCTL_COEN; +} + +/*! + \brief disable RTC clock calibration output + \param[in] none + \param[out] none + \retval none +*/ +void bkp_rtc_calibration_output_disable(void) +{ + BKP_OCTL &= (uint16_t)~BKP_OCTL_COEN; +} + +/*! + \brief enable RTC alarm or second signal output + \param[in] none + \param[out] none + \retval none +*/ +void bkp_rtc_signal_output_enable(void) +{ + BKP_OCTL |= (uint16_t)BKP_OCTL_ASOEN; +} + +/*! + \brief disable RTC alarm or second signal output + \param[in] none + \param[out] none + \retval none +*/ +void bkp_rtc_signal_output_disable(void) +{ + BKP_OCTL &= (uint16_t)~BKP_OCTL_ASOEN; +} + +/*! + \brief select RTC output + \param[in] outputsel: RTC output selection + \arg RTC_OUTPUT_ALARM_PULSE: RTC alarm pulse is selected as the RTC output + \arg RTC_OUTPUT_SECOND_PULSE: RTC second pulse is selected as the RTC output + \param[out] none + \retval none +*/ +void bkp_rtc_output_select(uint16_t outputsel) +{ + uint16_t ctl = 0U; + + ctl = BKP_OCTL; + ctl &= (uint16_t)~BKP_OCTL_ROSEL; + ctl |= outputsel; + BKP_OCTL = ctl; +} + +/*! + \brief select RTC clock output + \param[in] clocksel: RTC clock output selection + \arg RTC_CLOCK_DIV_64: RTC clock div 64 + \arg RTC_CLOCK_DIV_1: RTC clock + \param[out] none + \retval none +*/ +void bkp_rtc_clock_output_select(uint16_t clocksel) +{ + uint16_t ctl = 0U; + + ctl = BKP_OCTL; + ctl &= (uint16_t)~BKP_OCTL_CCOSEL; + ctl |= clocksel; + BKP_OCTL = ctl; +} + +/*! + \brief RTC clock calibration direction + \param[in] direction: RTC clock calibration direction + \arg RTC_CLOCK_SLOWED_DOWN: RTC clock slow down + \arg RTC_CLOCK_SPEED_UP: RTC clock speed up + \param[out] none + \retval none +*/ +void bkp_rtc_clock_calibration_direction(uint16_t direction) +{ + uint16_t ctl = 0U; + + ctl = BKP_OCTL; + ctl &= (uint16_t)~BKP_OCTL_CALDIR; + ctl |= direction; + BKP_OCTL = ctl; +} + +/*! + \brief set RTC clock calibration value + \param[in] value: RTC clock calibration value + \arg 0x00 - 0x7F + \param[out] none + \retval none +*/ +void bkp_rtc_calibration_value_set(uint8_t value) +{ + uint16_t ctl; + + ctl = BKP_OCTL; + ctl &= ~(uint16_t)BKP_OCTL_RCCV; + ctl |= (uint16_t)OCTL_RCCV(value); + BKP_OCTL = ctl; +} + +/*! + \brief enable tamper detection + \param[in] none + \param[out] none + \retval none +*/ +void bkp_tamper_detection_enable(void) +{ + BKP_TPCTL |= (uint16_t)BKP_TPCTL_TPEN; +} + +/*! + \brief disable tamper detection + \param[in] none + \param[out] none + \retval none +*/ +void bkp_tamper_detection_disable(void) +{ + BKP_TPCTL &= (uint16_t)~BKP_TPCTL_TPEN; +} + +/*! + \brief set tamper pin active level + \param[in] level: tamper active level + \arg TAMPER_PIN_ACTIVE_HIGH: the tamper pin is active high + \arg TAMPER_PIN_ACTIVE_LOW: the tamper pin is active low + \param[out] none + \retval none +*/ +void bkp_tamper_active_level_set(uint16_t level) +{ + uint16_t ctl = 0U; + + ctl = BKP_TPCTL; + ctl &= (uint16_t)~BKP_TPCTL_TPAL; + ctl |= level; + BKP_TPCTL = ctl; +} + +/*! + \brief enable tamper interrupt + \param[in] none + \param[out] none + \retval none +*/ +void bkp_tamper_interrupt_enable(void) +{ + BKP_TPCS |= (uint16_t)BKP_TPCS_TPIE; +} + +/*! + \brief disable tamper interrupt + \param[in] none + \param[out] none + \retval none +*/ +void bkp_tamper_interrupt_disable(void) +{ + BKP_TPCS &= (uint16_t)~BKP_TPCS_TPIE; +} + +/*! + \brief get bkp flag state + \param[in] flag + \arg BKP_FLAG_TAMPER: tamper event flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus bkp_flag_get(uint16_t flag) +{ + if(RESET != (BKP_TPCS & flag)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear bkp flag state + \param[in] flag + \arg BKP_FLAG_TAMPER: tamper event flag + \param[out] none + \retval none +*/ +void bkp_flag_clear(uint16_t flag) +{ + BKP_TPCS |= (uint16_t)(flag >> TAMPER_FLAG_SHIFT); +} + +/*! + \brief get bkp interrupt flag state + \param[in] flag + \arg BKP_INT_FLAG_TAMPER: tamper interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus bkp_interrupt_flag_get(uint16_t flag) +{ + if(RESET != (BKP_TPCS & flag)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear bkp interrupt flag state + \param[in] flag + \arg BKP_INT_FLAG_TAMPER: tamper interrupt flag + \param[out] none + \retval none +*/ +void bkp_interrupt_flag_clear(uint16_t flag) +{ + BKP_TPCS |= (uint16_t)(flag >> TAMPER_FLAG_SHIFT); +} + diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_can.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_can.c new file mode 100644 index 0000000..193bf62 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_can.c @@ -0,0 +1,1042 @@ +/*! + \file gd32f30x_can.c + \brief CAN driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2019-11-27, V2.0.1, firmware for GD32F30x + \version 2020-03-02, V2.0.2, firmware for GD32F30x + \version 2020-07-14, V2.0.3, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_can.h" +#include + +#define CAN_ERROR_HANDLE(s) do{}while(1) + +/*! + \brief deinitialize CAN + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[out] none + \retval none +*/ +void can_deinit(uint32_t can_periph) +{ +#ifdef GD32F30X_CL + if(CAN0 == can_periph){ + rcu_periph_reset_enable(RCU_CAN0RST); + rcu_periph_reset_disable(RCU_CAN0RST); + }else{ + rcu_periph_reset_enable(RCU_CAN1RST); + rcu_periph_reset_disable(RCU_CAN1RST); + } +#else + if(CAN0 == can_periph){ + rcu_periph_reset_enable(RCU_CAN0RST); + rcu_periph_reset_disable(RCU_CAN0RST); + } +#endif +} + +/*! + \brief initialize CAN parameter struct with a default value + \param[in] type: the type of CAN parameter struct + only one parameter can be selected which is shown as below: + \arg CAN_INIT_STRUCT: the CAN initial struct + \arg CAN_FILTER_STRUCT: the CAN filter struct + \arg CAN_TX_MESSAGE_STRUCT: the CAN TX message struct + \arg CAN_RX_MESSAGE_STRUCT: the CAN RX message struct + \param[in] p_struct: the pointer of the specific struct + \param[out] none + \retval none +*/ +void can_struct_para_init(can_struct_type_enum type, void* p_struct) +{ + uint8_t i; + + if(NULL == p_struct){ + CAN_ERROR_HANDLE("struct parameter can not be NULL \r\n"); + } + + /* get type of the struct */ + switch(type){ + /* used for can_init() */ + case CAN_INIT_STRUCT: + ((can_parameter_struct*)p_struct)->auto_bus_off_recovery = DISABLE; + ((can_parameter_struct*)p_struct)->no_auto_retrans = DISABLE; + ((can_parameter_struct*)p_struct)->auto_wake_up = DISABLE; + ((can_parameter_struct*)p_struct)->prescaler = 0x03FFU; + ((can_parameter_struct*)p_struct)->rec_fifo_overwrite = DISABLE; + ((can_parameter_struct*)p_struct)->resync_jump_width = CAN_BT_SJW_1TQ; + ((can_parameter_struct*)p_struct)->time_segment_1 = CAN_BT_BS1_3TQ; + ((can_parameter_struct*)p_struct)->time_segment_2 = CAN_BT_BS2_1TQ; + ((can_parameter_struct*)p_struct)->time_triggered = DISABLE; + ((can_parameter_struct*)p_struct)->trans_fifo_order = DISABLE; + ((can_parameter_struct*)p_struct)->working_mode = CAN_NORMAL_MODE; + + break; + /* used for can_filter_init() */ + case CAN_FILTER_STRUCT: + ((can_filter_parameter_struct*)p_struct)->filter_bits = CAN_FILTERBITS_32BIT; + ((can_filter_parameter_struct*)p_struct)->filter_enable = DISABLE; + ((can_filter_parameter_struct*)p_struct)->filter_fifo_number = CAN_FIFO0; + ((can_filter_parameter_struct*)p_struct)->filter_list_high = 0x0000U; + ((can_filter_parameter_struct*)p_struct)->filter_list_low = 0x0000U; + ((can_filter_parameter_struct*)p_struct)->filter_mask_high = 0x0000U; + ((can_filter_parameter_struct*)p_struct)->filter_mask_low = 0x0000U; + ((can_filter_parameter_struct*)p_struct)->filter_mode = CAN_FILTERMODE_MASK; + ((can_filter_parameter_struct*)p_struct)->filter_number = 0U; + + break; + /* used for can_message_transmit() */ + case CAN_TX_MESSAGE_STRUCT: + for(i = 0U; i < 8U; i++){ + ((can_trasnmit_message_struct*)p_struct)->tx_data[i] = 0U; + } + + ((can_trasnmit_message_struct*)p_struct)->tx_dlen = 0u; + ((can_trasnmit_message_struct*)p_struct)->tx_efid = 0U; + ((can_trasnmit_message_struct*)p_struct)->tx_ff = (uint8_t)CAN_FF_STANDARD; + ((can_trasnmit_message_struct*)p_struct)->tx_ft = (uint8_t)CAN_FT_DATA; + ((can_trasnmit_message_struct*)p_struct)->tx_sfid = 0U; + + break; + /* used for can_message_receive() */ + case CAN_RX_MESSAGE_STRUCT: + for(i = 0U; i < 8U; i++){ + ((can_receive_message_struct*)p_struct)->rx_data[i] = 0U; + } + + ((can_receive_message_struct*)p_struct)->rx_dlen = 0U; + ((can_receive_message_struct*)p_struct)->rx_efid = 0U; + ((can_receive_message_struct*)p_struct)->rx_ff = (uint8_t)CAN_FF_STANDARD; + ((can_receive_message_struct*)p_struct)->rx_fi = 0U; + ((can_receive_message_struct*)p_struct)->rx_ft = (uint8_t)CAN_FT_DATA; + ((can_receive_message_struct*)p_struct)->rx_sfid = 0U; + + break; + + default: + CAN_ERROR_HANDLE("parameter is invalid \r\n"); + } +} + +/*! + \brief initialize CAN + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] can_parameter_init: parameters for CAN initializtion + \arg working_mode: CAN_NORMAL_MODE, CAN_LOOPBACK_MODE, CAN_SILENT_MODE, CAN_SILENT_LOOPBACK_MODE + \arg resync_jump_width: CAN_BT_SJW_xTQ(x=1, 2, 3, 4) + \arg time_segment_1: CAN_BT_BS1_xTQ(1..16) + \arg time_segment_2: CAN_BT_BS2_xTQ(1..8) + \arg time_triggered: ENABLE or DISABLE + \arg auto_bus_off_recovery: ENABLE or DISABLE + \arg auto_wake_up: ENABLE or DISABLE + \arg no_auto_retrans: ENABLE or DISABLE + \arg rec_fifo_overwrite: ENABLE or DISABLE + \arg trans_fifo_order: ENABLE or DISABLE + \arg prescaler: 0x0001 - 0x0400 + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus can_init(uint32_t can_periph, can_parameter_struct* can_parameter_init) +{ + uint32_t timeout = CAN_TIMEOUT; + ErrStatus flag = ERROR; + + /* disable sleep mode */ + CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD; + /* enable initialize mode */ + CAN_CTL(can_periph) |= CAN_CTL_IWMOD; + /* wait ACK */ + while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)){ + timeout--; + } + /* check initialize working success */ + if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)){ + flag = ERROR; + }else{ + /* set the bit timing register */ + CAN_BT(can_periph) = (BT_MODE((uint32_t)can_parameter_init->working_mode) | \ + BT_SJW((uint32_t)can_parameter_init->resync_jump_width) | \ + BT_BS1((uint32_t)can_parameter_init->time_segment_1) | \ + BT_BS2((uint32_t)can_parameter_init->time_segment_2) | \ + BT_BAUDPSC(((uint32_t)(can_parameter_init->prescaler) - 1U))); + + /* time trigger communication mode */ + if(ENABLE == can_parameter_init->time_triggered){ + CAN_CTL(can_periph) |= CAN_CTL_TTC; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_TTC; + } + /* automatic bus-off managment */ + if(ENABLE == can_parameter_init->auto_bus_off_recovery){ + CAN_CTL(can_periph) |= CAN_CTL_ABOR; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_ABOR; + } + /* automatic wakeup mode */ + if(ENABLE == can_parameter_init->auto_wake_up){ + CAN_CTL(can_periph) |= CAN_CTL_AWU; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_AWU; + } + /* automatic retransmission mode disable */ + if(ENABLE == can_parameter_init->no_auto_retrans){ + CAN_CTL(can_periph) |= CAN_CTL_ARD; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_ARD; + } + /* receive fifo overwrite mode */ + if(ENABLE == can_parameter_init->rec_fifo_overwrite){ + CAN_CTL(can_periph) |= CAN_CTL_RFOD; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_RFOD; + } + /* transmit fifo order */ + if(ENABLE == can_parameter_init->trans_fifo_order){ + CAN_CTL(can_periph) |= CAN_CTL_TFO; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_TFO; + } + /* disable initialize mode */ + CAN_CTL(can_periph) &= ~CAN_CTL_IWMOD; + timeout = CAN_TIMEOUT; + /* wait the ACK */ + while((CAN_STAT_IWS == (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)){ + timeout--; + } + /* check exit initialize mode */ + if(0U != timeout){ + flag = SUCCESS; + } + } + return flag; +} + +/*! + \brief initialize CAN filter + \param[in] can_filter_parameter_init: struct for CAN filter initialization + \arg filter_list_high: 0x0000 - 0xFFFF + \arg filter_list_low: 0x0000 - 0xFFFF + \arg filter_mask_high: 0x0000 - 0xFFFF + \arg filter_mask_low: 0x0000 - 0xFFFF + \arg filter_fifo_number: CAN_FIFO0, CAN_FIFO1 + \arg filter_number: 0 - 27 + \arg filter_mode: CAN_FILTERMODE_MASK, CAN_FILTERMODE_LIST + \arg filter_bits: CAN_FILTERBITS_32BIT, CAN_FILTERBITS_16BIT + \arg filter_enable: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void can_filter_init(can_filter_parameter_struct* can_filter_parameter_init) +{ + uint32_t val = 0U; + + val = ((uint32_t)1) << (can_filter_parameter_init->filter_number); + /* filter lock disable */ + CAN_FCTL(CAN0) |= CAN_FCTL_FLD; + /* disable filter */ + CAN_FW(CAN0) &= ~(uint32_t)val; + + /* filter 16 bits */ + if(CAN_FILTERBITS_16BIT == can_filter_parameter_init->filter_bits){ + /* set filter 16 bits */ + CAN_FSCFG(CAN0) &= ~(uint32_t)val; + /* first 16 bits list and first 16 bits mask or first 16 bits list and second 16 bits list */ + CAN_FDATA0(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_low) & CAN_FILTER_MASK_16BITS) | \ + FDATA_MASK_LOW((can_filter_parameter_init->filter_list_low) & CAN_FILTER_MASK_16BITS); + /* second 16 bits list and second 16 bits mask or third 16 bits list and fourth 16 bits list */ + CAN_FDATA1(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_high) & CAN_FILTER_MASK_16BITS) | \ + FDATA_MASK_LOW((can_filter_parameter_init->filter_list_high) & CAN_FILTER_MASK_16BITS); + } + /* filter 32 bits */ + if(CAN_FILTERBITS_32BIT == can_filter_parameter_init->filter_bits){ + /* set filter 32 bits */ + CAN_FSCFG(CAN0) |= (uint32_t)val; + /* 32 bits list or first 32 bits list */ + CAN_FDATA0(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_list_high) & CAN_FILTER_MASK_16BITS) | + FDATA_MASK_LOW((can_filter_parameter_init->filter_list_low) & CAN_FILTER_MASK_16BITS); + /* 32 bits mask or second 32 bits list */ + CAN_FDATA1(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_high) & CAN_FILTER_MASK_16BITS) | + FDATA_MASK_LOW((can_filter_parameter_init->filter_mask_low) & CAN_FILTER_MASK_16BITS); + } + + /* filter mode */ + if(CAN_FILTERMODE_MASK == can_filter_parameter_init->filter_mode){ + /* mask mode */ + CAN_FMCFG(CAN0) &= ~(uint32_t)val; + }else{ + /* list mode */ + CAN_FMCFG(CAN0) |= (uint32_t)val; + } + + /* filter FIFO */ + if(CAN_FIFO0 == (can_filter_parameter_init->filter_fifo_number)){ + /* FIFO0 */ + CAN_FAFIFO(CAN0) &= ~(uint32_t)val; + }else{ + /* FIFO1 */ + CAN_FAFIFO(CAN0) |= (uint32_t)val; + } + + /* filter working */ + if(ENABLE == can_filter_parameter_init->filter_enable){ + + CAN_FW(CAN0) |= (uint32_t)val; + } + + /* filter lock enable */ + CAN_FCTL(CAN0) &= ~CAN_FCTL_FLD; +} + +/*! + \brief set CAN1 fliter start bank number + \param[in] start_bank: CAN1 start bank number + only one parameter can be selected which is shown as below: + \arg (1..27) + \param[out] none + \retval none +*/ +void can1_filter_start_bank(uint8_t start_bank) +{ + /* filter lock disable */ + CAN_FCTL(CAN0) |= CAN_FCTL_FLD; + /* set CAN1 filter start number */ + CAN_FCTL(CAN0) &= ~(uint32_t)CAN_FCTL_HBC1F; + CAN_FCTL(CAN0) |= FCTL_HBC1F(start_bank); + /* filter lock enaable */ + CAN_FCTL(CAN0) &= ~CAN_FCTL_FLD; +} + +/*! + \brief enable CAN debug freeze + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[out] none + \retval none +*/ +void can_debug_freeze_enable(uint32_t can_periph) +{ + CAN_CTL(can_periph) |= CAN_CTL_DFZ; +#ifdef GD32F30X_CL + if(CAN0 == can_periph){ + dbg_periph_enable(DBG_CAN0_HOLD); + }else{ + dbg_periph_enable(DBG_CAN1_HOLD); + } +#else + if(CAN0 == can_periph){ + dbg_periph_enable(DBG_CAN0_HOLD); + } +#endif +} + +/*! + \brief disable CAN debug freeze + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[out] none + \retval none +*/ +void can_debug_freeze_disable(uint32_t can_periph) +{ + CAN_CTL(can_periph) &= ~CAN_CTL_DFZ; +#ifdef GD32F30X_CL + if(CAN0 == can_periph){ + dbg_periph_disable(DBG_CAN0_HOLD); + }else{ + dbg_periph_disable(DBG_CAN1_HOLD); + } +#else + if(CAN0 == can_periph){ + dbg_periph_enable(DBG_CAN0_HOLD); + } +#endif +} + +/*! + \brief enable CAN time trigger mode + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[out] none + \retval none +*/ +void can_time_trigger_mode_enable(uint32_t can_periph) +{ + uint8_t mailbox_number; + + /* enable the tcc mode */ + CAN_CTL(can_periph) |= CAN_CTL_TTC; + /* enable time stamp */ + for(mailbox_number = 0U; mailbox_number < 3U; mailbox_number++){ + CAN_TMP(can_periph, mailbox_number) |= CAN_TMP_TSEN; + } +} + +/*! + \brief disable CAN time trigger mode + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[out] none + \retval none +*/ +void can_time_trigger_mode_disable(uint32_t can_periph) +{ + uint8_t mailbox_number; + + /* disable the TCC mode */ + CAN_CTL(can_periph) &= ~CAN_CTL_TTC; + /* reset TSEN bits */ + for(mailbox_number = 0U; mailbox_number < 3U; mailbox_number++){ + CAN_TMP(can_periph, mailbox_number) &= ~CAN_TMP_TSEN; + } +} + +/*! + \brief transmit CAN message + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] transmit_message: struct for CAN transmit message + \arg tx_sfid: 0x00000000 - 0x000007FF + \arg tx_efid: 0x00000000 - 0x1FFFFFFF + \arg tx_ff: CAN_FF_STANDARD, CAN_FF_EXTENDED + \arg tx_ft: CAN_FT_DATA, CAN_FT_REMOTE + \arg tx_dlen: 0 - 8 + \arg tx_data[]: 0x00 - 0xFF + \param[out] none + \retval mailbox_number +*/ +uint8_t can_message_transmit(uint32_t can_periph, can_trasnmit_message_struct* transmit_message) +{ + uint8_t mailbox_number = CAN_MAILBOX0; + + /* select one empty mailbox */ + if(CAN_TSTAT_TME0 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME0)){ + mailbox_number = CAN_MAILBOX0; + }else if(CAN_TSTAT_TME1 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME1)){ + mailbox_number = CAN_MAILBOX1; + }else if(CAN_TSTAT_TME2 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME2)){ + mailbox_number = CAN_MAILBOX2; + }else{ + mailbox_number = CAN_NOMAILBOX; + } + /* return no mailbox empty */ + if(CAN_NOMAILBOX == mailbox_number){ + return CAN_NOMAILBOX; + } + + CAN_TMI(can_periph, mailbox_number) &= CAN_TMI_TEN; + if(CAN_FF_STANDARD == transmit_message->tx_ff){ + /* set transmit mailbox standard identifier */ + CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_SFID(transmit_message->tx_sfid) | \ + transmit_message->tx_ft); + }else{ + /* set transmit mailbox extended identifier */ + CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_EFID(transmit_message->tx_efid) | \ + transmit_message->tx_ff | \ + transmit_message->tx_ft); + } + /* set the data length */ + CAN_TMP(can_periph, mailbox_number) &= ~CAN_TMP_DLENC; + CAN_TMP(can_periph, mailbox_number) |= transmit_message->tx_dlen; + /* set the data */ + CAN_TMDATA0(can_periph, mailbox_number) = TMDATA0_DB3(transmit_message->tx_data[3]) | \ + TMDATA0_DB2(transmit_message->tx_data[2]) | \ + TMDATA0_DB1(transmit_message->tx_data[1]) | \ + TMDATA0_DB0(transmit_message->tx_data[0]); + CAN_TMDATA1(can_periph, mailbox_number) = TMDATA1_DB7(transmit_message->tx_data[7]) | \ + TMDATA1_DB6(transmit_message->tx_data[6]) | \ + TMDATA1_DB5(transmit_message->tx_data[5]) | \ + TMDATA1_DB4(transmit_message->tx_data[4]); + /* enable transmission */ + CAN_TMI(can_periph, mailbox_number) |= CAN_TMI_TEN; + + return mailbox_number; +} + +/*! + \brief get CAN transmit state + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] mailbox_number + only one parameter can be selected which is shown as below: + \arg CAN_MAILBOX(x=0,1,2) + \param[out] none + \retval can_transmit_state_enum +*/ +can_transmit_state_enum can_transmit_states(uint32_t can_periph, uint8_t mailbox_number) +{ + can_transmit_state_enum state = CAN_TRANSMIT_FAILED; + uint32_t val = 0U; + + /* check selected mailbox state */ + switch(mailbox_number){ + /* mailbox0 */ + case CAN_MAILBOX0: + val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF0 | CAN_TSTAT_MTFNERR0 | CAN_TSTAT_TME0); + break; + /* mailbox1 */ + case CAN_MAILBOX1: + val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF1 | CAN_TSTAT_MTFNERR1 | CAN_TSTAT_TME1); + break; + /* mailbox2 */ + case CAN_MAILBOX2: + val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF2 | CAN_TSTAT_MTFNERR2 | CAN_TSTAT_TME2); + break; + default: + val = CAN_TRANSMIT_FAILED; + break; + } + + switch(val){ + /* transmit pending */ + case (CAN_STATE_PENDING): + state = CAN_TRANSMIT_PENDING; + break; + /* mailbox0 transmit succeeded */ + case (CAN_TSTAT_MTF0 | CAN_TSTAT_MTFNERR0 | CAN_TSTAT_TME0): + state = CAN_TRANSMIT_OK; + break; + /* mailbox1 transmit succeeded */ + case (CAN_TSTAT_MTF1 | CAN_TSTAT_MTFNERR1 | CAN_TSTAT_TME1): + state = CAN_TRANSMIT_OK; + break; + /* mailbox2 transmit succeeded */ + case (CAN_TSTAT_MTF2 | CAN_TSTAT_MTFNERR2 | CAN_TSTAT_TME2): + state = CAN_TRANSMIT_OK; + break; + /* transmit failed */ + default: + state = CAN_TRANSMIT_FAILED; + break; + } + return state; +} + +/*! + \brief stop CAN transmission + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] mailbox_number + only one parameter can be selected which is shown as below: + \arg CAN_MAILBOXx(x=0,1,2) + \param[out] none + \retval none +*/ +void can_transmission_stop(uint32_t can_periph, uint8_t mailbox_number) +{ + if(CAN_MAILBOX0 == mailbox_number){ + CAN_TSTAT(can_periph) |= CAN_TSTAT_MST0; + while(CAN_TSTAT_MST0 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST0)){ + } + }else if(CAN_MAILBOX1 == mailbox_number){ + CAN_TSTAT(can_periph) |= CAN_TSTAT_MST1; + while(CAN_TSTAT_MST1 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST1)){ + } + }else if(CAN_MAILBOX2 == mailbox_number){ + CAN_TSTAT(can_periph) |= CAN_TSTAT_MST2; + while(CAN_TSTAT_MST2 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST2)){ + } + }else{ + /* illegal parameters */ + } +} + +/*! + \brief CAN receive message + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] fifo_number + \arg CAN_FIFOx(x=0,1) + \param[out] receive_message: struct for CAN receive message + \arg rx_sfid: 0x00000000 - 0x000007FF + \arg rx_efid: 0x00000000 - 0x1FFFFFFF + \arg rx_ff: CAN_FF_STANDARD, CAN_FF_EXTENDED + \arg rx_ft: CAN_FT_DATA, CAN_FT_REMOTE + \arg rx_dlen: 0 - 8 + \arg rx_data[]: 0x00 - 0xFF + \arg rx_fi: 0 - 27 + \retval none +*/ +void can_message_receive(uint32_t can_periph, uint8_t fifo_number, can_receive_message_struct* receive_message) +{ + /* get the frame format */ + receive_message->rx_ff = (uint8_t)(CAN_RFIFOMI_FF & CAN_RFIFOMI(can_periph, fifo_number)); + if(CAN_FF_STANDARD == receive_message->rx_ff){ + /* get standard identifier */ + receive_message->rx_sfid = (uint32_t)(GET_RFIFOMI_SFID(CAN_RFIFOMI(can_periph, fifo_number))); + }else{ + /* get extended identifier */ + receive_message->rx_efid = (uint32_t)(GET_RFIFOMI_EFID(CAN_RFIFOMI(can_periph, fifo_number))); + } + + /* get frame type */ + receive_message->rx_ft = (uint8_t)(CAN_RFIFOMI_FT & CAN_RFIFOMI(can_periph, fifo_number)); + /* filtering index */ + receive_message->rx_fi = (uint8_t)(GET_RFIFOMP_FI(CAN_RFIFOMP(can_periph, fifo_number))); + /* get recevie data length */ + receive_message->rx_dlen = (uint8_t)(GET_RFIFOMP_DLENC(CAN_RFIFOMP(can_periph, fifo_number))); + + /* receive data */ + receive_message -> rx_data[0] = (uint8_t)(GET_RFIFOMDATA0_DB0(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message -> rx_data[1] = (uint8_t)(GET_RFIFOMDATA0_DB1(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message -> rx_data[2] = (uint8_t)(GET_RFIFOMDATA0_DB2(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message -> rx_data[3] = (uint8_t)(GET_RFIFOMDATA0_DB3(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message -> rx_data[4] = (uint8_t)(GET_RFIFOMDATA1_DB4(CAN_RFIFOMDATA1(can_periph, fifo_number))); + receive_message -> rx_data[5] = (uint8_t)(GET_RFIFOMDATA1_DB5(CAN_RFIFOMDATA1(can_periph, fifo_number))); + receive_message -> rx_data[6] = (uint8_t)(GET_RFIFOMDATA1_DB6(CAN_RFIFOMDATA1(can_periph, fifo_number))); + receive_message -> rx_data[7] = (uint8_t)(GET_RFIFOMDATA1_DB7(CAN_RFIFOMDATA1(can_periph, fifo_number))); + + /* release FIFO */ + if(CAN_FIFO0 == fifo_number){ + CAN_RFIFO0(can_periph) |= CAN_RFIFO0_RFD0; + }else{ + CAN_RFIFO1(can_periph) |= CAN_RFIFO1_RFD1; + } +} + +/*! + \brief release FIFO0 + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] fifo_number + only one parameter can be selected which is shown as below: + \arg CAN_FIFOx(x=0,1) + \param[out] none + \retval none +*/ +void can_fifo_release(uint32_t can_periph, uint8_t fifo_number) +{ + if(CAN_FIFO0 == fifo_number){ + CAN_RFIFO0(can_periph) |= CAN_RFIFO0_RFD0; + }else if(CAN_FIFO1 == fifo_number){ + CAN_RFIFO1(can_periph) |= CAN_RFIFO1_RFD1; + }else{ + /* illegal parameters */ + CAN_ERROR_HANDLE("CAN FIFO NUM is invalid \r\n"); + } +} + +/*! + \brief CAN receive message length + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] fifo_number + only one parameter can be selected which is shown as below: + \arg CAN_FIFOx(x=0,1) + \param[out] none + \retval message length +*/ +uint8_t can_receive_message_length_get(uint32_t can_periph, uint8_t fifo_number) +{ + uint8_t val = 0U; + + if(CAN_FIFO0 == fifo_number){ + /* FIFO0 */ + val = (uint8_t)(CAN_RFIFO0(can_periph) & CAN_RFIF_RFL_MASK); + }else if(CAN_FIFO1 == fifo_number){ + /* FIFO1 */ + val = (uint8_t)(CAN_RFIFO1(can_periph) & CAN_RFIF_RFL_MASK); + }else{ + /* illegal parameters */ + } + return val; +} + +/*! + \brief set CAN working mode + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] can_working_mode + only one parameter can be selected which is shown as below: + \arg CAN_MODE_INITIALIZE + \arg CAN_MODE_NORMAL + \arg CAN_MODE_SLEEP + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus can_working_mode_set(uint32_t can_periph, uint8_t working_mode) +{ + ErrStatus flag = ERROR; + /* timeout for IWS or also for SLPWS bits */ + uint32_t timeout = CAN_TIMEOUT; + + if(CAN_MODE_INITIALIZE == working_mode){ + /* disable sleep mode */ + CAN_CTL(can_periph) &= (~(uint32_t)CAN_CTL_SLPWMOD); + /* set initialize mode */ + CAN_CTL(can_periph) |= (uint8_t)CAN_CTL_IWMOD; + /* wait the acknowledge */ + while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)){ + timeout--; + } + if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)){ + flag = ERROR; + }else{ + flag = SUCCESS; + } + }else if(CAN_MODE_NORMAL == working_mode){ + /* enter normal mode */ + CAN_CTL(can_periph) &= ~(uint32_t)(CAN_CTL_SLPWMOD | CAN_CTL_IWMOD); + /* wait the acknowledge */ + while((0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))) && (0U != timeout)){ + timeout--; + } + if(0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))){ + flag = ERROR; + }else{ + flag = SUCCESS; + } + }else if(CAN_MODE_SLEEP == working_mode){ + /* disable initialize mode */ + CAN_CTL(can_periph) &= (~(uint32_t)CAN_CTL_IWMOD); + /* set sleep mode */ + CAN_CTL(can_periph) |= (uint8_t)CAN_CTL_SLPWMOD; + /* wait the acknowledge */ + while((CAN_STAT_SLPWS != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) && (0U != timeout)){ + timeout--; + } + if(CAN_STAT_SLPWS != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)){ + flag = ERROR; + }else{ + flag = SUCCESS; + } + }else{ + flag = ERROR; + } + return flag; +} + +/*! + \brief wake up CAN + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus can_wakeup(uint32_t can_periph) +{ + ErrStatus flag = ERROR; + uint32_t timeout = CAN_TIMEOUT; + + /* wakeup */ + CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD; + + while((0U != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) && (0x00U != timeout)){ + timeout--; + } + /* check state */ + if(0U != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)){ + flag = ERROR; + }else{ + flag = SUCCESS; + } + return flag; +} + +/*! + \brief get CAN error type + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[out] none + \retval can_error_enum + \arg CAN_ERROR_NONE: no error + \arg CAN_ERROR_FILL: fill error + \arg CAN_ERROR_FORMATE: format error + \arg CAN_ERROR_ACK: ACK error + \arg CAN_ERROR_BITRECESSIVE: bit recessive + \arg CAN_ERROR_BITDOMINANTER: bit dominant error + \arg CAN_ERROR_CRC: CRC error + \arg CAN_ERROR_SOFTWARECFG: software configure +*/ +can_error_enum can_error_get(uint32_t can_periph) +{ + can_error_enum error; + error = CAN_ERROR_NONE; + + /* get error type */ + error = (can_error_enum)(GET_ERR_ERRN(CAN_ERR(can_periph))); + return error; +} + +/*! + \brief get CAN receive error number + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[out] none + \retval error number +*/ +uint8_t can_receive_error_number_get(uint32_t can_periph) +{ + uint8_t val; + + /* get error count */ + val = (uint8_t)(GET_ERR_RECNT(CAN_ERR(can_periph))); + return val; +} + +/*! + \brief get CAN transmit error number + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[out] none + \retval error number +*/ +uint8_t can_transmit_error_number_get(uint32_t can_periph) +{ + uint8_t val; + + val = (uint8_t)(GET_ERR_TECNT(CAN_ERR(can_periph))); + return val; +} + +/*! + \brief enable CAN interrupt + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] interrupt + one or more parameters can be selected which are shown as below: + \arg CAN_INT_TME: transmit mailbox empty interrupt enable + \arg CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable + \arg CAN_INT_RFF0: receive FIFO0 full interrupt enable + \arg CAN_INT_RFO0: receive FIFO0 overfull interrupt enable + \arg CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable + \arg CAN_INT_RFF1: receive FIFO1 full interrupt enable + \arg CAN_INT_RFO1: receive FIFO1 overfull interrupt enable + \arg CAN_INT_WERR: warning error interrupt enable + \arg CAN_INT_PERR: passive error interrupt enable + \arg CAN_INT_BO: bus-off interrupt enable + \arg CAN_INT_ERRN: error number interrupt enable + \arg CAN_INT_ERR: error interrupt enable + \arg CAN_INT_WU: wakeup interrupt enable + \arg CAN_INT_SLPW: sleep working interrupt enable + \param[out] none + \retval none +*/ +void can_interrupt_enable(uint32_t can_periph, uint32_t interrupt) +{ + CAN_INTEN(can_periph) |= interrupt; +} + +/*! + \brief disable CAN interrupt + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] interrupt + one or more parameters can be selected which are shown as below: + \arg CAN_INT_TME: transmit mailbox empty interrupt enable + \arg CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable + \arg CAN_INT_RFF0: receive FIFO0 full interrupt enable + \arg CAN_INT_RFO0: receive FIFO0 overfull interrupt enable + \arg CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable + \arg CAN_INT_RFF1: receive FIFO1 full interrupt enable + \arg CAN_INT_RFO1: receive FIFO1 overfull interrupt enable + \arg CAN_INT_WERR: warning error interrupt enable + \arg CAN_INT_PERR: passive error interrupt enable + \arg CAN_INT_BO: bus-off interrupt enable + \arg CAN_INT_ERRN: error number interrupt enable + \arg CAN_INT_ERR: error interrupt enable + \arg CAN_INT_WU: wakeup interrupt enable + \arg CAN_INT_SLPW: sleep working interrupt enable + \param[out] none + \retval none +*/ +void can_interrupt_disable(uint32_t can_periph, uint32_t interrupt) +{ + CAN_INTEN(can_periph) &= ~interrupt; +} + +/*! + \brief get CAN flag state + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] flag: CAN flags, refer to can_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_FLAG_RXL: RX level + \arg CAN_FLAG_LASTRX: last sample value of RX pin + \arg CAN_FLAG_RS: receiving state + \arg CAN_FLAG_TS: transmitting state + \arg CAN_FLAG_SLPIF: status change flag of entering sleep working mode + \arg CAN_FLAG_WUIF: status change flag of wakeup from sleep working mode + \arg CAN_FLAG_ERRIF: error flag + \arg CAN_FLAG_SLPWS: sleep working state + \arg CAN_FLAG_IWS: initial working state + \arg CAN_FLAG_TMLS2: transmit mailbox 2 last sending in Tx FIFO + \arg CAN_FLAG_TMLS1: transmit mailbox 1 last sending in Tx FIFO + \arg CAN_FLAG_TMLS0: transmit mailbox 0 last sending in Tx FIFO + \arg CAN_FLAG_TME2: transmit mailbox 2 empty + \arg CAN_FLAG_TME1: transmit mailbox 1 empty + \arg CAN_FLAG_TME0: transmit mailbox 0 empty + \arg CAN_FLAG_MTE2: mailbox 2 transmit error + \arg CAN_FLAG_MTE1: mailbox 1 transmit error + \arg CAN_FLAG_MTE0: mailbox 0 transmit error + \arg CAN_FLAG_MAL2: mailbox 2 arbitration lost + \arg CAN_FLAG_MAL1: mailbox 1 arbitration lost + \arg CAN_FLAG_MAL0: mailbox 0 arbitration lost + \arg CAN_FLAG_MTFNERR2: mailbox 2 transmit finished with no error + \arg CAN_FLAG_MTFNERR1: mailbox 1 transmit finished with no error + \arg CAN_FLAG_MTFNERR0: mailbox 0 transmit finished with no error + \arg CAN_FLAG_MTF2: mailbox 2 transmit finished + \arg CAN_FLAG_MTF1: mailbox 1 transmit finished + \arg CAN_FLAG_MTF0: mailbox 0 transmit finished + \arg CAN_FLAG_RFO0: receive FIFO0 overfull + \arg CAN_FLAG_RFF0: receive FIFO0 full + \arg CAN_FLAG_RFO1: receive FIFO1 overfull + \arg CAN_FLAG_RFF1: receive FIFO1 full + \arg CAN_FLAG_BOERR: bus-off error + \arg CAN_FLAG_PERR: passive error + \arg CAN_FLAG_WERR: warning error + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus can_flag_get(uint32_t can_periph, can_flag_enum flag) +{ + /* get flag and interrupt enable state */ + if(RESET != (CAN_REG_VAL(can_periph, flag) & BIT(CAN_BIT_POS(flag)))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear CAN flag state + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] flag: CAN flags, refer to can_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_FLAG_SLPIF: status change flag of entering sleep working mode + \arg CAN_FLAG_WUIF: status change flag of wakeup from sleep working mode + \arg CAN_FLAG_ERRIF: error flag + \arg CAN_FLAG_MTE2: mailbox 2 transmit error + \arg CAN_FLAG_MTE1: mailbox 1 transmit error + \arg CAN_FLAG_MTE0: mailbox 0 transmit error + \arg CAN_FLAG_MAL2: mailbox 2 arbitration lost + \arg CAN_FLAG_MAL1: mailbox 1 arbitration lost + \arg CAN_FLAG_MAL0: mailbox 0 arbitration lost + \arg CAN_FLAG_MTFNERR2: mailbox 2 transmit finished with no error + \arg CAN_FLAG_MTFNERR1: mailbox 1 transmit finished with no error + \arg CAN_FLAG_MTFNERR0: mailbox 0 transmit finished with no error + \arg CAN_FLAG_MTF2: mailbox 2 transmit finished + \arg CAN_FLAG_MTF1: mailbox 1 transmit finished + \arg CAN_FLAG_MTF0: mailbox 0 transmit finished + \arg CAN_FLAG_RFO0: receive FIFO0 overfull + \arg CAN_FLAG_RFF0: receive FIFO0 full + \arg CAN_FLAG_RFO1: receive FIFO1 overfull + \arg CAN_FLAG_RFF1: receive FIFO1 full + \param[out] none + \retval none +*/ +void can_flag_clear(uint32_t can_periph, can_flag_enum flag) +{ + CAN_REG_VAL(can_periph, flag) = BIT(CAN_BIT_POS(flag)); +} + +/*! + \brief get CAN interrupt flag state + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] flag: CAN interrupt flags, refer to can_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_INT_FLAG_SLPIF: status change interrupt flag of sleep working mode entering + \arg CAN_INT_FLAG_WUIF: status change interrupt flag of wakeup from sleep working mode + \arg CAN_INT_FLAG_ERRIF: error interrupt flag + \arg CAN_INT_FLAG_MTF2: mailbox 2 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF1: mailbox 1 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF0: mailbox 0 transmit finished interrupt flag + \arg CAN_INT_FLAG_RFO0: receive FIFO0 overfull interrupt flag + \arg CAN_INT_FLAG_RFF0: receive FIFO0 full interrupt flag + \arg CAN_INT_FLAG_RFL0: receive FIFO0 not empty interrupt flag + \arg CAN_INT_FLAG_RFO1: receive FIFO1 overfull interrupt flag + \arg CAN_INT_FLAG_RFF1: receive FIFO1 full interrupt flag + \arg CAN_INT_FLAG_RFL1: receive FIFO1 not empty interrupt flag + \arg CAN_INT_FLAG_ERRN: error number interrupt flag + \arg CAN_INT_FLAG_BOERR: bus-off error interrupt flag + \arg CAN_INT_FLAG_PERR: passive error interrupt flag + \arg CAN_INT_FLAG_WERR: warning error interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum flag) +{ + uint32_t ret1 = RESET; + uint32_t ret2 = RESET; + + /* get the staus of interrupt flag */ + if (flag == CAN_INT_FLAG_RFL0) { + ret1 = can_receive_message_length_get(can_periph, CAN_FIFO0); + } else if (flag == CAN_INT_FLAG_RFL1) { + ret1 = can_receive_message_length_get(can_periph, CAN_FIFO1); + } else if (flag == CAN_INT_FLAG_ERRN) { + ret1 = can_error_get(can_periph); + } else { + ret1 = CAN_REG_VALS(can_periph, flag) & BIT(CAN_BIT_POS0(flag)); + } + /* get the staus of interrupt enale bit */ + ret2 = CAN_INTEN(can_periph) & BIT(CAN_BIT_POS1(flag)); + if(ret1 && ret2){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear CAN interrupt flag state + \param[in] can_periph + \arg CANx(x=0,1),the CAN1 only for GD32F30X_CL + \param[in] flag: CAN interrupt flags, refer to can_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_INT_FLAG_SLPIF: status change interrupt flag of sleep working mode entering + \arg CAN_INT_FLAG_WUIF: status change interrupt flag of wakeup from sleep working mode + \arg CAN_INT_FLAG_ERRIF: error interrupt flag + \arg CAN_INT_FLAG_MTF2: mailbox 2 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF1: mailbox 1 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF0: mailbox 0 transmit finished interrupt flag + \arg CAN_INT_FLAG_RFO0: receive FIFO0 overfull interrupt flag + \arg CAN_INT_FLAG_RFF0: receive FIFO0 full interrupt flag + \arg CAN_INT_FLAG_RFO1: receive FIFO1 overfull interrupt flag + \arg CAN_INT_FLAG_RFF1: receive FIFO1 full interrupt flag + \param[out] none + \retval none +*/ +void can_interrupt_flag_clear(uint32_t can_periph, can_interrupt_flag_enum flag) +{ + CAN_REG_VALS(can_periph, flag) = BIT(CAN_BIT_POS0(flag)); +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_crc.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_crc.c new file mode 100644 index 0000000..1072748 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_crc.c @@ -0,0 +1,130 @@ +/*! + \file gd32f30x_crc.c + \brief CRC driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_crc.h" + +#define CRC_DATA_RESET_VALUE ((uint32_t)0xFFFFFFFFU) +#define CRC_FDATA_RESET_VALUE ((uint32_t)0x00000000U) + +/*! + \brief deinit CRC calculation unit + \param[in] none + \param[out] none + \retval none +*/ +void crc_deinit(void) +{ + CRC_DATA = CRC_DATA_RESET_VALUE; + CRC_FDATA = CRC_FDATA_RESET_VALUE; + CRC_CTL = (uint32_t)CRC_CTL_RST; +} + +/*! + \brief reset data register(CRC_DATA) to the value of 0xFFFFFFFF + \param[in] none + \param[out] none + \retval none +*/ +void crc_data_register_reset(void) +{ + CRC_CTL |= (uint32_t)CRC_CTL_RST; +} + +/*! + \brief read the value of the data register + \param[in] none + \param[out] none + \retval 32-bit value of the data register +*/ +uint32_t crc_data_register_read(void) +{ + uint32_t data; + data = CRC_DATA; + return (data); +} + +/*! + \brief read the value of the free data register + \param[in] none + \param[out] none + \retval 8-bit value of the free data register +*/ +uint8_t crc_free_data_register_read(void) +{ + uint8_t fdata; + fdata = (uint8_t)CRC_FDATA; + return (fdata); +} + +/*! + \brief write data to the free data register + \param[in] free_data: specified 8-bit data + \param[out] none + \retval none +*/ +void crc_free_data_register_write(uint8_t free_data) +{ + CRC_FDATA = (uint32_t)free_data; +} + +/*! + \brief calculate the CRC value of a 32-bit data + \param[in] sdata: specified 32-bit data + \param[out] none + \retval 32-bit value calculated by CRC +*/ +uint32_t crc_single_data_calculate(uint32_t sdata) +{ + CRC_DATA = sdata; + return (CRC_DATA); +} + +/*! + \brief calculate the CRC value of an array of 32-bit values + \param[in] array: pointer to an array of 32-bit values + \param[in] size: size of the array + \param[out] none + \retval 32-bit value calculated by CRC +*/ +uint32_t crc_block_data_calculate(const uint32_t *array, uint32_t size) +{ + uint32_t index; + for(index = 0U; index < size; index++){ + CRC_DATA = *(array+index); + } + return (CRC_DATA); +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_ctc.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_ctc.c new file mode 100644 index 0000000..038429a --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_ctc.c @@ -0,0 +1,393 @@ +/*! + \file gd32f30x_ctc.c + \brief CTC driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_ctc.h" + +#define CTC_FLAG_MASK ((uint32_t)0x00000700U) + +/* CTC register bit offset */ +#define CTC_TRIMVALUE_OFFSET ((uint32_t)8U) +#define CTC_TRIM_VALUE_OFFSET ((uint32_t)8U) +#define CTC_REFCAP_OFFSET ((uint32_t)16U) +#define CTC_LIMIT_VALUE_OFFSET ((uint32_t)16U) + +/*! + \brief reset CTC clock trim controller + \param[in] none + \param[out] none + \retval none +*/ +void ctc_deinit(void) +{ + /* reset CTC */ + rcu_periph_reset_enable(RCU_CTCRST); + rcu_periph_reset_disable(RCU_CTCRST); +} + + + +/*! + \brief enable CTC trim counter + \param[in] none + \param[out] none + \retval none +*/ +void ctc_counter_enable(void) +{ + CTC_CTL0 |= (uint32_t)CTC_CTL0_CNTEN; +} + +/*! + \brief disable CTC trim counter + \param[in] none + \param[out] none + \retval none +*/ +void ctc_counter_disable(void) +{ + CTC_CTL0 &= (uint32_t)(~CTC_CTL0_CNTEN); +} + +/*! + \brief configure the IRC48M trim value + \param[in] ctc_trim_value: 8-bit IRC48M trim value + \arg 0x00 - 0x3F + \param[out] none + \retval none +*/ +void ctc_irc48m_trim_value_config(uint8_t trim_value) +{ + /* clear TRIMVALUE bits */ + CTC_CTL0 &= (~(uint32_t)CTC_CTL0_TRIMVALUE); + /* set TRIMVALUE bits */ + CTC_CTL0 |= ((uint32_t)trim_value << CTC_TRIM_VALUE_OFFSET); +} + +/*! + \brief generate software reference source sync pulse + \param[in] none + \param[out] none + \retval none +*/ +void ctc_software_refsource_pulse_generate(void) +{ + CTC_CTL0 |= (uint32_t)CTC_CTL0_SWREFPUL; +} + +/*! + \brief configure hardware automatically trim mode + \param[in] hardmode: + only one parameter can be selected which is shown as below: + \arg CTC_HARDWARE_TRIM_MODE_ENABLE: hardware automatically trim mode enable + \arg CTC_HARDWARE_TRIM_MODE_DISABLE: hardware automatically trim mode disable + \param[out] none + \retval none +*/ +void ctc_hardware_trim_mode_config(uint32_t hardmode) +{ + CTC_CTL0 &= (uint32_t)(~CTC_CTL0_AUTOTRIM); + CTC_CTL0 |= (uint32_t)hardmode; +} +/*! + \brief configure reference signal source polarity + \param[in] polarity: + only one parameter can be selected which is shown as below: + \arg CTC_REFSOURCE_POLARITY_FALLING: reference signal source polarity is falling edge + \arg CTC_REFSOURCE_POLARITY_RISING: reference signal source polarity is rising edge + \param[out] none + \retval none +*/ +void ctc_refsource_polarity_config(uint32_t polarity) +{ + CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFPOL); + CTC_CTL1 |= (uint32_t)polarity; +} + +/*! + \brief select reference signal source + \param[in] refs: + only one parameter can be selected which is shown as below: + \arg CTC_REFSOURCE_GPIO: GPIO is selected + \arg CTC_REFSOURCE_LXTAL: LXTAL is selected + \arg CTC_REFSOURCE_USBSOF: USBD_SOF or USBFS_SOF is selected + \param[out] none + \retval none +*/ +void ctc_refsource_signal_select(uint32_t refs) +{ + CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFSEL); + CTC_CTL1 |= (uint32_t)refs; +} + +/*! + \brief configure reference signal source prescaler + \param[in] prescaler: + only one parameter can be selected which is shown as below: + \arg CTC_REFSOURCE_PSC_OFF: reference signal not divided + \arg CTC_REFSOURCE_PSC_DIV2: reference signal divided by 2 + \arg CTC_REFSOURCE_PSC_DIV4: reference signal divided by 4 + \arg CTC_REFSOURCE_PSC_DIV8: reference signal divided by 8 + \arg CTC_REFSOURCE_PSC_DIV16: reference signal divided by 16 + \arg CTC_REFSOURCE_PSC_DIV32: reference signal divided by 32 + \arg CTC_REFSOURCE_PSC_DIV64: reference signal divided by 64 + \arg CTC_REFSOURCE_PSC_DIV128: reference signal divided by 128 + \param[out] none + \retval none +*/ +void ctc_refsource_prescaler_config(uint32_t prescaler) +{ + CTC_CTL1 &= (uint32_t)(~CTC_CTL1_REFPSC); + CTC_CTL1 |= (uint32_t)prescaler; +} + +/*! + \brief configure clock trim base limit value + \param[in] limit_value: 8-bit clock trim base limit value + \arg 0x00 - 0xFF + \param[out] none + \retval none +*/ +void ctc_clock_limit_value_config(uint8_t limit_value) +{ + CTC_CTL1 &= (uint32_t)(~CTC_CTL1_CKLIM); + CTC_CTL1 |= (uint32_t)((uint32_t)limit_value << CTC_LIMIT_VALUE_OFFSET); +} + +/*! + \brief configure CTC counter reload value + \param[in] reload_value: 16-bit CTC counter reload value + \arg 0x0000 - 0xFFFF + \param[out] none + \retval none +*/ +void ctc_counter_reload_value_config(uint16_t reload_value) +{ + CTC_CTL1 &= (uint32_t)(~CTC_CTL1_RLVALUE); + CTC_CTL1 |= (uint32_t)reload_value; +} + +/*! + \brief read CTC counter capture value when reference sync pulse occurred + \param[in] none + \param[out] none + \retval the 16-bit CTC counter capture value +*/ +uint16_t ctc_counter_capture_value_read(void) +{ + uint16_t capture_value = 0U; + capture_value = (uint16_t)((CTC_STAT & CTC_STAT_REFCAP)>> CTC_REFCAP_OFFSET); + return (capture_value); +} + +/*! + \brief read CTC trim counter direction when reference sync pulse occurred + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET + \arg SET: CTC trim counter direction is down-counting + \arg RESET: CTC trim counter direction is up-counting +*/ +FlagStatus ctc_counter_direction_read(void) +{ + if(RESET != (CTC_STAT & CTC_STAT_REFDIR)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief read CTC counter reload value + \param[in] none + \param[out] none + \retval the 16-bit CTC counter reload value +*/ +uint16_t ctc_counter_reload_value_read(void) +{ + uint16_t reload_value = 0U; + reload_value = (uint16_t)(CTC_CTL1 & CTC_CTL1_RLVALUE); + return (reload_value); +} + +/*! + \brief read the IRC48M trim value + \param[in] none + \param[out] none + \retval the 8-bit IRC48M trim value +*/ +uint8_t ctc_irc48m_trim_value_read(void) +{ + uint8_t trim_value = 0U; + trim_value = (uint8_t)((CTC_CTL0 & CTC_CTL0_TRIMVALUE) >> CTC_TRIMVALUE_OFFSET); + return (trim_value); +} + +/*! + \brief enable the CTC interrupt + \param[in] interrupt: CTC interrupt enable + one or more parameters can be selected which are shown as below: + \arg CTC_INT_CKOK: clock trim OK interrupt enable + \arg CTC_INT_CKWARN: clock trim warning interrupt enable + \arg CTC_INT_ERR: error interrupt enable + \arg CTC_INT_EREF: expect reference interrupt enable + \param[out] none + \retval none +*/ +void ctc_interrupt_enable(uint32_t interrupt) +{ + CTC_CTL0 |= (uint32_t)interrupt; +} + +/*! + \brief disable the CTC interrupt + \param[in] interrupt: CTC interrupt enable source + one or more parameters can be selected which are shown as below: + \arg CTC_INT_CKOK: clock trim OK interrupt enable + \arg CTC_INT_CKWARN: clock trim warning interrupt enable + \arg CTC_INT_ERR: error interrupt enable + \arg CTC_INT_EREF: expect reference interrupt enable + \param[out] none + \retval none +*/ +void ctc_interrupt_disable(uint32_t interrupt) +{ + CTC_CTL0 &= (uint32_t)(~interrupt); +} + +/*! + \brief get CTC interrupt flag + \param[in] int_flag: the CTC interrupt flag + only one parameter can be selected which is shown as below: + \arg CTC_INT_FLAG_CKOK: clock trim OK interrupt + \arg CTC_INT_FLAG_CKWARN: clock trim warning interrupt + \arg CTC_INT_FLAG_ERR: error interrupt + \arg CTC_INT_FLAG_EREF: expect reference interrupt + \arg CTC_INT_FLAG_CKERR: clock trim error bit interrupt + \arg CTC_INT_FLAG_REFMISS: reference sync pulse miss interrupt + \arg CTC_INT_FLAG_TRIMERR: trim value error interrupt + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus ctc_interrupt_flag_get(uint32_t int_flag) +{ + uint32_t interrupt_flag = 0U, intenable = 0U; + + /* check whether the interrupt is enabled */ + if(RESET != (int_flag & CTC_FLAG_MASK)){ + intenable = CTC_CTL0 & CTC_CTL0_ERRIE; + }else{ + intenable = CTC_CTL0 & int_flag; + } + + /* get interrupt flag status */ + interrupt_flag = CTC_STAT & int_flag; + + if(interrupt_flag && intenable){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear CTC interrupt flag + \param[in] int_flag: the CTC interrupt flag + only one parameter can be selected which is shown as below: + \arg CTC_INT_FLAG_CKOK: clock trim OK interrupt + \arg CTC_INT_FLAG_CKWARN: clock trim warning interrupt + \arg CTC_INT_FLAG_ERR: error interrupt + \arg CTC_INT_FLAG_EREF: expect reference interrupt + \arg CTC_INT_FLAG_CKERR: clock trim error bit interrupt + \arg CTC_INT_FLAG_REFMISS: reference sync pulse miss interrupt + \arg CTC_INT_FLAG_TRIMERR: trim value error interrupt + \param[out] none + \retval none +*/ +void ctc_interrupt_flag_clear(uint32_t int_flag) +{ + if(RESET != (int_flag & CTC_FLAG_MASK)){ + CTC_INTC |= CTC_INTC_ERRIC; + }else{ + CTC_INTC |= int_flag; + } +} + +/*! + \brief get CTC flag + \param[in] flag: the CTC flag + only one parameter can be selected which is shown as below: + \arg CTC_FLAG_CKOK: clock trim OK flag + \arg CTC_FLAG_CKWARN: clock trim warning flag + \arg CTC_FLAG_ERR: error flag + \arg CTC_FLAG_EREF: expect reference flag + \arg CTC_FLAG_CKERR: clock trim error bit + \arg CTC_FLAG_REFMISS: reference sync pulse miss + \arg CTC_FLAG_TRIMERR: trim value error bit + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus ctc_flag_get(uint32_t flag) +{ + if(RESET != (CTC_STAT & flag)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear CTC flag + \param[in] flag: the CTC flag + only one parameter can be selected which is shown as below: + \arg CTC_FLAG_CKOK: clock trim OK flag + \arg CTC_FLAG_CKWARN: clock trim warning flag + \arg CTC_FLAG_ERR: error flag + \arg CTC_FLAG_EREF: expect reference flag + \arg CTC_FLAG_CKERR: clock trim error bit + \arg CTC_FLAG_REFMISS: reference sync pulse miss + \arg CTC_FLAG_TRIMERR: trim value error bit + \param[out] none + \retval none +*/ +void ctc_flag_clear(uint32_t flag) +{ + if(RESET != (flag & CTC_FLAG_MASK)){ + CTC_INTC |= CTC_INTC_ERRIC; + }else{ + CTC_INTC |= flag; + } +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_dac.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_dac.c new file mode 100644 index 0000000..0a8c6df --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_dac.c @@ -0,0 +1,541 @@ +/*! + \file gd32f30x_dac.c + \brief DAC driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_dac.h" + +/* DAC register bit offset */ +#define DAC1_REG_OFFSET ((uint32_t)16U) +#define DH_12BIT_OFFSET ((uint32_t)16U) +#define DH_8BIT_OFFSET ((uint32_t)8U) + +/*! + \brief deinitialize DAC + \param[in] none + \param[out] none + \retval none +*/ +void dac_deinit(void) +{ + rcu_periph_reset_enable(RCU_DACRST); + rcu_periph_reset_disable(RCU_DACRST); +} + +/*! + \brief enable DAC + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_enable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL |= DAC_CTL_DEN0; + }else{ + DAC_CTL |= DAC_CTL_DEN1; + } +} + +/*! + \brief disable DAC + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_disable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL &= ~DAC_CTL_DEN0; + }else{ + DAC_CTL &= ~DAC_CTL_DEN1; + } +} + +/*! + \brief enable DAC DMA function + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_dma_enable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL |= DAC_CTL_DDMAEN0; + }else{ + DAC_CTL |= DAC_CTL_DDMAEN1; + } +} + +/*! + \brief disable DAC DMA function + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_dma_disable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL &= ~DAC_CTL_DDMAEN0; + }else{ + DAC_CTL &= ~DAC_CTL_DDMAEN1; + } +} + +/*! + \brief enable DAC output buffer + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_output_buffer_enable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL &= ~DAC_CTL_DBOFF0; + }else{ + DAC_CTL &= ~DAC_CTL_DBOFF1; + } +} + +/*! + \brief disable DAC output buffer + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_output_buffer_disable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL |= DAC_CTL_DBOFF0; + }else{ + DAC_CTL |= DAC_CTL_DBOFF1; + } +} + +/*! + \brief get DAC output value + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval DAC output data +*/ +uint16_t dac_output_value_get(uint32_t dac_periph) +{ + uint16_t data = 0U; + if(DAC0 == dac_periph){ + /* store the DAC0 output value */ + data = (uint16_t)DAC0_DO; + }else{ + /* store the DAC1 output value */ + data = (uint16_t)DAC1_DO; + } + return data; +} + +/*! + \brief set the DAC specified data holding register value + \param[in] dac_periph: DACx(x = 0,1) + \param[in] dac_align: data alignment + only one parameter can be selected which is shown as below: + \arg DAC_ALIGN_8B_R: data right 8 bit alignment + \arg DAC_ALIGN_12B_R: data right 12 bit alignment + \arg DAC_ALIGN_12B_L: data left 12 bit alignment + \param[in] data: data to be loaded + \param[out] none + \retval none +*/ +void dac_data_set(uint32_t dac_periph, uint32_t dac_align, uint16_t data) +{ + if(DAC0 == dac_periph){ + switch(dac_align){ + /* data right 12 bit alignment */ + case DAC_ALIGN_12B_R: + DAC0_R12DH = data; + break; + /* data left 12 bit alignment */ + case DAC_ALIGN_12B_L: + DAC0_L12DH = data; + break; + /* data right 8 bit alignment */ + case DAC_ALIGN_8B_R: + DAC0_R8DH = data; + break; + default: + break; + } + }else{ + switch(dac_align){ + /* data right 12 bit alignment */ + case DAC_ALIGN_12B_R: + DAC1_R12DH = data; + break; + /* data left 12 bit alignment */ + case DAC_ALIGN_12B_L: + DAC1_L12DH = data; + break; + /* data right 8 bit alignment */ + case DAC_ALIGN_8B_R: + DAC1_R8DH = data; + break; + default: + break; + } + } +} + +/*! + \brief enable DAC trigger + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_trigger_enable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL |= DAC_CTL_DTEN0; + }else{ + DAC_CTL |= DAC_CTL_DTEN1; + } +} + +/*! + \brief disable DAC trigger + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_trigger_disable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL &= ~DAC_CTL_DTEN0; + }else{ + DAC_CTL &= ~DAC_CTL_DTEN1; + } +} + +/*! + \brief set DAC trigger source + \param[in] dac_periph: DACx(x = 0,1) + \param[in] triggersource: external triggers of DAC + only one parameter can be selected which is shown as below: + \arg DAC_TRIGGER_T1_TRGO: TIMER1 TRGO + \arg DAC_TRIGGER_T2_TRGO: TIMER2 TRGO (for GD32F30X_CL) + \arg DAC_TRIGGER_T3_TRGO: TIMER3 TRGO + \arg DAC_TRIGGER_T4_TRGO: TIMER4 TRGO + \arg DAC_TRIGGER_T5_TRGO: TIMER5 TRGO + \arg DAC_TRIGGER_T6_TRGO: TIMER6 TRGO + \arg DAC_TRIGGER_T7_TRGO: TIMER7 TRGO (for GD32F30X_HD and GD32F30X_XD) + \arg DAC_TRIGGER_EXTI_9: EXTI interrupt line9 event + \arg DAC_TRIGGER_SOFTWARE: software trigger + \param[out] none + \retval none +*/ +void dac_trigger_source_config(uint32_t dac_periph,uint32_t triggersource) +{ + if(DAC0 == dac_periph){ + /* configure DAC0 trigger source */ + DAC_CTL &= ~DAC_CTL_DTSEL0; + DAC_CTL |= triggersource; + }else{ + /* configure DAC1 trigger source */ + DAC_CTL &= ~DAC_CTL_DTSEL1; + DAC_CTL |= (triggersource << DAC1_REG_OFFSET); + } +} + +/*! + \brief enable DAC software trigger + \param[in] dac_periph: DACx(x = 0,1) + \retval none +*/ +void dac_software_trigger_enable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_SWT |= DAC_SWT_SWTR0; + }else{ + DAC_SWT |= DAC_SWT_SWTR1; + } +} + +/*! + \brief disable DAC software trigger + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_software_trigger_disable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_SWT &= ~DAC_SWT_SWTR0; + }else{ + DAC_SWT &= ~DAC_SWT_SWTR1; + } +} + +/*! + \brief configure DAC wave mode + \param[in] dac_periph: DACx(x = 0,1) + \param[in] wave_mode: noise wave mode + only one parameter can be selected which is shown as below: + \arg DAC_WAVE_DISABLE: wave disable + \arg DAC_WAVE_MODE_LFSR: LFSR noise mode + \arg DAC_WAVE_MODE_TRIANGLE: triangle noise mode + \param[out] none + \retval none +*/ +void dac_wave_mode_config(uint32_t dac_periph, uint32_t wave_mode) +{ + if(DAC0 == dac_periph){ + /* configure DAC0 wave mode */ + DAC_CTL &= ~DAC_CTL_DWM0; + DAC_CTL |= wave_mode; + }else{ + /* configure DAC1 wave mode */ + DAC_CTL &= ~DAC_CTL_DWM1; + DAC_CTL |= (wave_mode << DAC1_REG_OFFSET); + } +} + +/*! + \brief configure DAC wave bit width + \param[in] dac_periph: DACx(x = 0,1) + \param[in] bit_width: noise wave bit width + only one parameter can be selected which is shown as below: + \arg DAC_WAVE_BIT_WIDTH_1: bit width of the wave signal is 1 + \arg DAC_WAVE_BIT_WIDTH_2: bit width of the wave signal is 2 + \arg DAC_WAVE_BIT_WIDTH_3: bit width of the wave signal is 3 + \arg DAC_WAVE_BIT_WIDTH_4: bit width of the wave signal is 4 + \arg DAC_WAVE_BIT_WIDTH_5: bit width of the wave signal is 5 + \arg DAC_WAVE_BIT_WIDTH_6: bit width of the wave signal is 6 + \arg DAC_WAVE_BIT_WIDTH_7: bit width of the wave signal is 7 + \arg DAC_WAVE_BIT_WIDTH_8: bit width of the wave signal is 8 + \arg DAC_WAVE_BIT_WIDTH_9: bit width of the wave signal is 9 + \arg DAC_WAVE_BIT_WIDTH_10: bit width of the wave signal is 10 + \arg DAC_WAVE_BIT_WIDTH_11: bit width of the wave signal is 11 + \arg DAC_WAVE_BIT_WIDTH_12: bit width of the wave signal is 12 + \param[out] none + \retval none +*/ +void dac_wave_bit_width_config(uint32_t dac_periph, uint32_t bit_width) +{ + if(DAC0 == dac_periph){ + /* configure DAC0 wave bit width */ + DAC_CTL &= ~DAC_CTL_DWBW0; + DAC_CTL |= bit_width; + }else{ + /* configure DAC1 wave bit width */ + DAC_CTL &= ~DAC_CTL_DWBW1; + DAC_CTL |= (bit_width << DAC1_REG_OFFSET); + } +} + +/*! + \brief configure DAC LFSR noise mode + \param[in] dac_periph: DACx(x = 0,1) + \param[in] unmask_bits: unmask LFSR bits in DAC LFSR noise mode + only one parameter can be selected which is shown as below: + \arg DAC_LFSR_BIT0: unmask the LFSR bit0 + \arg DAC_LFSR_BITS1_0: unmask the LFSR bits[1:0] + \arg DAC_LFSR_BITS2_0: unmask the LFSR bits[2:0] + \arg DAC_LFSR_BITS3_0: unmask the LFSR bits[3:0] + \arg DAC_LFSR_BITS4_0: unmask the LFSR bits[4:0] + \arg DAC_LFSR_BITS5_0: unmask the LFSR bits[5:0] + \arg DAC_LFSR_BITS6_0: unmask the LFSR bits[6:0] + \arg DAC_LFSR_BITS7_0: unmask the LFSR bits[7:0] + \arg DAC_LFSR_BITS8_0: unmask the LFSR bits[8:0] + \arg DAC_LFSR_BITS9_0: unmask the LFSR bits[9:0] + \arg DAC_LFSR_BITS10_0: unmask the LFSR bits[10:0] + \arg DAC_LFSR_BITS11_0: unmask the LFSR bits[11:0] + \param[out] none + \retval none +*/ +void dac_lfsr_noise_config(uint32_t dac_periph, uint32_t unmask_bits) +{ + if(DAC0 == dac_periph){ + /* configure DAC0 LFSR noise mode */ + DAC_CTL &= ~DAC_CTL_DWBW0; + DAC_CTL |= unmask_bits; + }else{ + /* configure DAC1 LFSR noise mode */ + DAC_CTL &= ~DAC_CTL_DWBW1; + DAC_CTL |= (unmask_bits << DAC1_REG_OFFSET); + } +} + +/*! + \brief configure DAC triangle noise mode + \param[in] dac_periph: DACx(x = 0,1) + \param[in] amplitude: triangle amplitude in DAC triangle noise mode + only one parameter can be selected which is shown as below: + \arg DAC_TRIANGLE_AMPLITUDE_1: triangle amplitude is 1 + \arg DAC_TRIANGLE_AMPLITUDE_3: triangle amplitude is 3 + \arg DAC_TRIANGLE_AMPLITUDE_7: triangle amplitude is 7 + \arg DAC_TRIANGLE_AMPLITUDE_15: triangle amplitude is 15 + \arg DAC_TRIANGLE_AMPLITUDE_31: triangle amplitude is 31 + \arg DAC_TRIANGLE_AMPLITUDE_63: triangle amplitude is 63 + \arg DAC_TRIANGLE_AMPLITUDE_127: triangle amplitude is 127 + \arg DAC_TRIANGLE_AMPLITUDE_255: triangle amplitude is 255 + \arg DAC_TRIANGLE_AMPLITUDE_511: triangle amplitude is 511 + \arg DAC_TRIANGLE_AMPLITUDE_1023: triangle amplitude is 1023 + \arg DAC_TRIANGLE_AMPLITUDE_2047: triangle amplitude is 2047 + \arg DAC_TRIANGLE_AMPLITUDE_4095: triangle amplitude is 4095 + \param[out] none + \retval none +*/ +void dac_triangle_noise_config(uint32_t dac_periph, uint32_t amplitude) +{ + if(DAC0 == dac_periph){ + /* configure DAC0 triangle noise mode */ + DAC_CTL &= ~DAC_CTL_DWBW0; + DAC_CTL |= amplitude; + }else{ + /* configure DAC1 triangle noise mode */ + DAC_CTL &= ~DAC_CTL_DWBW1; + DAC_CTL |= (amplitude << DAC1_REG_OFFSET); + } +} + +/*! + \brief enable DAC concurrent mode + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_enable(void) +{ + uint32_t ctl = 0U; + ctl = DAC_CTL_DEN0 | DAC_CTL_DEN1; + DAC_CTL |= (ctl); +} + +/*! + \brief disable DAC concurrent mode + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_disable(void) +{ + uint32_t ctl = 0U; + ctl = DAC_CTL_DEN0 | DAC_CTL_DEN1; + DAC_CTL &= (~ctl); +} + +/*! + \brief enable DAC concurrent software trigger function + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_software_trigger_enable(void) +{ + uint32_t swt = 0U; + swt = DAC_SWT_SWTR0 | DAC_SWT_SWTR1; + DAC_SWT |= (swt); +} + +/*! + \brief disable DAC concurrent software trigger function + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_software_trigger_disable(void) +{ + uint32_t swt = 0U; + swt = DAC_SWT_SWTR0 | DAC_SWT_SWTR1; + DAC_SWT &= (~swt); +} + +/*! + \brief enable DAC concurrent buffer function + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_output_buffer_enable(void) +{ + uint32_t ctl = 0U; + ctl = DAC_CTL_DBOFF0 | DAC_CTL_DBOFF1; + DAC_CTL &= (~ctl); +} + +/*! + \brief disable DAC concurrent buffer function + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_output_buffer_disable(void) +{ + uint32_t ctl = 0U; + ctl = DAC_CTL_DBOFF0 | DAC_CTL_DBOFF1; + DAC_CTL |= (ctl); +} + +/*! + \brief set DAC concurrent mode data holding register value + \param[in] dac_align: data alignment + only one parameter can be selected which is shown as below: + \arg DAC_ALIGN_8B_R: data right 8b alignment + \arg DAC_ALIGN_12B_R: data right 12b alignment + \arg DAC_ALIGN_12B_L: data left 12b alignment + \param[in] data0: data to be loaded + \param[in] data1: data to be loaded + \param[out] none + \retval none +*/ +void dac_concurrent_data_set(uint32_t dac_align, uint16_t data0, uint16_t data1) +{ + uint32_t data = 0U; + switch(dac_align){ + /* data right 12b alignment */ + case DAC_ALIGN_12B_R: + data = ((uint32_t)data1 << DH_12BIT_OFFSET) | data0; + DACC_R12DH = data; + break; + /* data left 12b alignment */ + case DAC_ALIGN_12B_L: + data = ((uint32_t)data1 << DH_12BIT_OFFSET) | data0; + DACC_L12DH = data; + break; + /* data right 8b alignment */ + case DAC_ALIGN_8B_R: + data = ((uint32_t)data1 << DH_8BIT_OFFSET) | data0; + DACC_R8DH = data; + break; + default: + break; + } +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_dbg.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_dbg.c new file mode 100644 index 0000000..b0c4f5a --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_dbg.c @@ -0,0 +1,164 @@ +/*! + \file gd32f30x_dbg.c + \brief DBG driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_dbg.h" + +#define DBG_RESET_VAL 0x00000000U + +/*! + \brief deinitialize the DBG + \param[in] none + \param[out] none + \retval none +*/ +void dbg_deinit(void) +{ + DBG_CTL0 = DBG_RESET_VAL; +} + +/*! + \brief read DBG_ID code register + \param[in] none + \param[out] none + \retval DBG_ID code +*/ +uint32_t dbg_id_get(void) +{ + return DBG_ID; +} + +/*! + \brief enable low power behavior when the mcu is in debug mode + \param[in] dbg_low_power: + this parameter can be any combination of the following values: + \arg DBG_LOW_POWER_SLEEP: keep debugger connection during sleep mode + \arg DBG_LOW_POWER_DEEPSLEEP: keep debugger connection during deepsleep mode + \arg DBG_LOW_POWER_STANDBY: keep debugger connection during standby mode + \param[out] none + \retval none +*/ +void dbg_low_power_enable(uint32_t dbg_low_power) +{ + DBG_CTL0 |= dbg_low_power; +} + +/*! + \brief disable low power behavior when the mcu is in debug mode + \param[in] dbg_low_power: + this parameter can be any combination of the following values: + \arg DBG_LOW_POWER_SLEEP: donot keep debugger connection during sleep mode + \arg DBG_LOW_POWER_DEEPSLEEP: donot keep debugger connection during deepsleep mode + \arg DBG_LOW_POWER_STANDBY: donot keep debugger connection during standby mode + \param[out] none + \retval none +*/ +void dbg_low_power_disable(uint32_t dbg_low_power) +{ + DBG_CTL0 &= ~dbg_low_power; +} + +/*! + \brief enable peripheral behavior when the mcu is in debug mode + \param[in] dbg_periph: refer to dbg_periph_enum + only one parameter can be selected which is shown as below: + \arg DBG_FWDGT_HOLD : debug FWDGT kept when core is halted + \arg DBG_WWDGT_HOLD : debug WWDGT kept when core is halted + \arg DBG_CANx_HOLD (x=0,1,CAN1 is only available for CL series): hold CANx counter when core is halted + \arg DBG_I2Cx_HOLD (x=0,1): hold I2Cx smbus when core is halted + \arg DBG_TIMERx_HOLD (x=0,1,2,3,4,5,6,7,8,9,10,11,12,13,TIMER8..13 are not available for HD series): hold TIMERx counter when core is halted + \param[out] none + \retval none +*/ +void dbg_periph_enable(dbg_periph_enum dbg_periph) +{ + DBG_REG_VAL(dbg_periph) |= BIT(DBG_BIT_POS(dbg_periph)); +} + +/*! + \brief disable peripheral behavior when the mcu is in debug mode + \param[in] dbg_periph: refer to dbg_periph_enum + only one parameter can be selected which is shown as below: + \arg DBG_FWDGT_HOLD : debug FWDGT kept when core is halted + \arg DBG_WWDGT_HOLD : debug WWDGT kept when core is halted + \arg DBG_CANx_HOLD (x=0,1,CAN1 is only available for CL series): hold CAN0 counter when core is halted + \arg DBG_I2Cx_HOLD (x=0,1): hold I2Cx smbus when core is halted + \arg DBG_TIMERx_HOLD (x=0,1,2,3,4,5,6,7,8,9,10,11,12,13,TIMER8..13 are not available for HD series): hold TIMERx counter when core is halted + \param[out] none + \retval none +*/ +void dbg_periph_disable(dbg_periph_enum dbg_periph) +{ + DBG_REG_VAL(dbg_periph) &= ~BIT(DBG_BIT_POS(dbg_periph)); +} + +/*! + \brief enable trace pin assignment + \param[in] none + \param[out] none + \retval none +*/ +void dbg_trace_pin_enable(void) +{ + DBG_CTL0 |= DBG_CTL0_TRACE_IOEN; +} + +/*! + \brief disable trace pin assignment + \param[in] none + \param[out] none + \retval none +*/ +void dbg_trace_pin_disable(void) +{ + DBG_CTL0 &= ~DBG_CTL0_TRACE_IOEN; +} + +/*! + \brief trace pin mode selection + \param[in] trace_mode: + \arg TRACE_MODE_ASYNC: trace pin used for async mode + \arg TRACE_MODE_SYNC_DATASIZE_1: trace pin used for sync mode and data size is 1 + \arg TRACE_MODE_SYNC_DATASIZE_2: trace pin used for sync mode and data size is 2 + \arg TRACE_MODE_SYNC_DATASIZE_4: trace pin used for sync mode and data size is 4 + \param[out] none + \retval none +*/ +void dbg_trace_pin_mode_set(uint32_t trace_mode) +{ + DBG_CTL0 &= ~DBG_CTL0_TRACE_MODE; + DBG_CTL0 |= trace_mode; +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_dma.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_dma.c new file mode 100644 index 0000000..683e8ea --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_dma.c @@ -0,0 +1,735 @@ +/*! + \file gd32f30x_dma.c + \brief DMA driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_dma.h" +#include + +#define DMA_WRONG_HANDLE while(1){} + +/* check whether peripheral matches channels or not */ +static ErrStatus dma_periph_and_channel_check(uint32_t dma_periph, dma_channel_enum channelx); + +/*! + \brief deinitialize DMA a channel registers + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel is deinitialized + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_deinit(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + /* disable DMA a channel */ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CHEN; + /* reset DMA channel registers */ + DMA_CHCTL(dma_periph, channelx) = DMA_CHCTL_RESET_VALUE; + DMA_CHCNT(dma_periph, channelx) = DMA_CHCNT_RESET_VALUE; + DMA_CHPADDR(dma_periph, channelx) = DMA_CHPADDR_RESET_VALUE; + DMA_CHMADDR(dma_periph, channelx) = DMA_CHMADDR_RESET_VALUE; + DMA_INTC(dma_periph) |= DMA_FLAG_ADD(DMA_CHINTF_RESET_VALUE, channelx); +} + +/*! + \brief initialize the parameters of DMA struct with the default values + \param[in] init_struct: the initialization data needed to initialize DMA channel + \param[out] none + \retval none +*/ +void dma_struct_para_init(dma_parameter_struct* init_struct) +{ + if(NULL == init_struct){ + DMA_WRONG_HANDLE + } + + /* set the DMA struct with the default values */ + init_struct->periph_addr = 0U; + init_struct->periph_width = 0U; + init_struct->periph_inc = DMA_PERIPH_INCREASE_DISABLE; + init_struct->memory_addr = 0U; + init_struct->memory_width = 0U; + init_struct->memory_inc = DMA_MEMORY_INCREASE_DISABLE; + init_struct->number = 0U; + init_struct->direction = DMA_PERIPHERAL_TO_MEMORY; + init_struct->priority = DMA_PRIORITY_LOW; +} + +/*! + \brief initialize DMA channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel is initialized + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] init_struct: the data needed to initialize DMA channel + periph_addr: peripheral base address + periph_width: DMA_PERIPHERAL_WIDTH_8BIT, DMA_PERIPHERAL_WIDTH_16BIT, DMA_PERIPHERAL_WIDTH_32BIT + periph_inc: DMA_PERIPH_INCREASE_ENABLE, DMA_PERIPH_INCREASE_DISABLE + memory_addr: memory base address + memory_width: DMA_MEMORY_WIDTH_8BIT, DMA_MEMORY_WIDTH_16BIT, DMA_MEMORY_WIDTH_32BIT + memory_inc: DMA_MEMORY_INCREASE_ENABLE, DMA_MEMORY_INCREASE_DISABLE + direction: DMA_PERIPHERAL_TO_MEMORY, DMA_MEMORY_TO_PERIPHERAL + number: the number of remaining data to be transferred by the DMA + priority: DMA_PRIORITY_LOW, DMA_PRIORITY_MEDIUM, DMA_PRIORITY_HIGH, DMA_PRIORITY_ULTRA_HIGH + \param[out] none + \retval none +*/ +void dma_init(uint32_t dma_periph, dma_channel_enum channelx, dma_parameter_struct* init_struct) +{ + uint32_t ctl; + + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + /* configure peripheral base address */ + DMA_CHPADDR(dma_periph, channelx) = init_struct->periph_addr; + + /* configure memory base address */ + DMA_CHMADDR(dma_periph, channelx) = init_struct->memory_addr; + + /* configure the number of remaining data to be transferred */ + DMA_CHCNT(dma_periph, channelx) = (init_struct->number & DMA_CHANNEL_CNT_MASK); + + /* configure peripheral transfer width,memory transfer width and priority */ + ctl = DMA_CHCTL(dma_periph, channelx); + ctl &= ~(DMA_CHXCTL_PWIDTH | DMA_CHXCTL_MWIDTH | DMA_CHXCTL_PRIO); + ctl |= (init_struct->periph_width | init_struct->memory_width | init_struct->priority); + DMA_CHCTL(dma_periph, channelx) = ctl; + + /* configure peripheral increasing mode */ + if(DMA_PERIPH_INCREASE_ENABLE == init_struct->periph_inc){ + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; + }else{ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_PNAGA; + } + + /* configure memory increasing mode */ + if(DMA_MEMORY_INCREASE_ENABLE == init_struct->memory_inc){ + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MNAGA; + }else{ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MNAGA; + } + + /* configure the direction of data transfer */ + if(DMA_PERIPHERAL_TO_MEMORY == init_struct->direction){ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_DIR; + }else{ + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_DIR; + } +} + +/*! + \brief enable DMA circulation mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_circulation_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CMEN; +} + +/*! + \brief disable DMA circulation mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_circulation_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CMEN; +} + +/*! + \brief enable memory to memory mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_memory_to_memory_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_M2M; +} + +/*! + \brief disable memory to memory mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_memory_to_memory_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_M2M; +} + +/*! + \brief enable DMA channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_channel_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CHEN; +} + +/*! + \brief disable DMA channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_channel_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CHEN; +} + +/*! + \brief set DMA peripheral base address + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set peripheral base address + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] address: peripheral base address + \param[out] none + \retval none +*/ +void dma_periph_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHPADDR(dma_periph, channelx) = address; +} + +/*! + \brief set DMA memory base address + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set memory base address + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] address: memory base address + \param[out] none + \retval none +*/ +void dma_memory_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHMADDR(dma_periph, channelx) = address; +} + +/*! + \brief set the number of remaining data to be transferred by the DMA + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set number + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] number: the number of remaining data to be transferred by the DMA + \param[out] none + \retval none +*/ +void dma_transfer_number_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t number) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCNT(dma_periph, channelx) = (number & DMA_CHANNEL_CNT_MASK); +} + +/*! + \brief get the number of remaining data to be transferred by the DMA + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set number + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval uint32_t: the number of remaining data to be transferred by the DMA +*/ +uint32_t dma_transfer_number_get(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + return (uint32_t)DMA_CHCNT(dma_periph, channelx); +} + +/*! + \brief configure priority level of DMA channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] priority: priority Level of this channel + only one parameter can be selected which is shown as below: + \arg DMA_PRIORITY_LOW: low priority + \arg DMA_PRIORITY_MEDIUM: medium priority + \arg DMA_PRIORITY_HIGH: high priority + \arg DMA_PRIORITY_ULTRA_HIGH: ultra high priority + \param[out] none + \retval none +*/ +void dma_priority_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t priority) +{ + uint32_t ctl; + + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_PRIO; + ctl |= priority; + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief configure transfer data size of memory + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] mwidth: transfer data width of memory + only one parameter can be selected which is shown as below: + \arg DMA_MEMORY_WIDTH_8BIT: transfer data width of memory is 8-bit + \arg DMA_MEMORY_WIDTH_16BIT: transfer data width of memory is 16-bit + \arg DMA_MEMORY_WIDTH_32BIT: transfer data width of memory is 32-bit + \param[out] none + \retval none +*/ +void dma_memory_width_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t mwidth) +{ + uint32_t ctl; + + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_MWIDTH; + ctl |= mwidth; + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief configure transfer data size of peripheral + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] pwidth: transfer data width of peripheral + only one parameter can be selected which is shown as below: + \arg DMA_PERIPHERAL_WIDTH_8BIT: transfer data width of peripheral is 8-bit + \arg DMA_PERIPHERAL_WIDTH_16BIT: transfer data width of peripheral is 16-bit + \arg DMA_PERIPHERAL_WIDTH_32BIT: transfer data width of peripheral is 32-bit + \param[out] none + \retval none +*/ +void dma_periph_width_config (uint32_t dma_periph, dma_channel_enum channelx, uint32_t pwidth) +{ + uint32_t ctl; + + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_PWIDTH; + ctl |= pwidth; + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief enable next address increasement algorithm of memory + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_memory_increase_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MNAGA; +} + +/*! + \brief disable next address increasement algorithm of memory + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_memory_increase_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MNAGA; +} + +/*! + \brief enable next address increasement algorithm of peripheral + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_periph_increase_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; +} + +/*! + \brief disable next address increasement algorithm of peripheral + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_periph_increase_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_PNAGA; +} + +/*! + \brief configure the direction of data transfer on the channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] direction: specify the direction of data transfer + only one parameter can be selected which is shown as below: + \arg DMA_PERIPHERAL_TO_MEMORY: read from peripheral and write to memory + \arg DMA_MEMORY_TO_PERIPHERAL: read from memory and write to peripheral + \param[out] none + \retval none +*/ +void dma_transfer_direction_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t direction) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + if(DMA_PERIPHERAL_TO_MEMORY == direction){ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_DIR; + } else { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_DIR; + } +} + +/*! + \brief check DMA flag is set or not + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to get flag + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] flag: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_FLAG_G: global interrupt flag of channel + \arg DMA_FLAG_FTF: full transfer finish flag of channel + \arg DMA_FLAG_HTF: half transfer finish flag of channel + \arg DMA_FLAG_ERR: error flag of channel + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus dma_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) +{ + FlagStatus reval; + + if(RESET != (DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx))){ + reval = SET; + }else{ + reval = RESET; + } + + return reval; +} + +/*! + \brief clear DMA a channel flag + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to clear flag + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] flag: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_FLAG_G: global interrupt flag of channel + \arg DMA_FLAG_FTF: full transfer finish flag of channel + \arg DMA_FLAG_HTF: half transfer finish flag of channel + \arg DMA_FLAG_ERR: error flag of channel + \param[out] none + \retval none +*/ +void dma_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) +{ + DMA_INTC(dma_periph) |= DMA_FLAG_ADD(flag, channelx); +} + +/*! + \brief check DMA flag and interrupt enable bit is set or not + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to get flag + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] flag: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_INT_FLAG_FTF: full transfer finish interrupt flag of channel + \arg DMA_INT_FLAG_HTF: half transfer finish interrupt flag of channel + \arg DMA_INT_FLAG_ERR: error interrupt flag of channel + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus dma_interrupt_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) +{ + uint32_t interrupt_enable = 0U, interrupt_flag = 0U; + + switch(flag){ + case DMA_INT_FLAG_FTF: + interrupt_flag = DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_FTFIE; + break; + case DMA_INT_FLAG_HTF: + interrupt_flag = DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_HTFIE; + break; + case DMA_INT_FLAG_ERR: + interrupt_flag = DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_ERRIE; + break; + default: + DMA_WRONG_HANDLE + } + + if(interrupt_flag && interrupt_enable){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear DMA a channel flag + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to clear flag + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] flag: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_INT_FLAG_G: global interrupt flag of channel + \arg DMA_INT_FLAG_FTF: full transfer finish interrupt flag of channel + \arg DMA_INT_FLAG_HTF: half transfer finish interrupt flag of channel + \arg DMA_INT_FLAG_ERR: error interrupt flag of channel + \param[out] none + \retval none +*/ +void dma_interrupt_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) +{ + DMA_INTC(dma_periph) |= DMA_FLAG_ADD(flag, channelx); +} + +/*! + \brief enable DMA interrupt + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] source: specify which interrupt to enbale + one or more parameters can be selected which are shown as below + \arg DMA_INT_FTF: channel full transfer finish interrupt + \arg DMA_INT_HTF: channel half transfer finish interrupt + \arg DMA_INT_ERR: channel error interrupt + \param[out] none + \retval none +*/ +void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= source; +} + +/*! + \brief disable DMA interrupt + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] source: specify which interrupt to disbale + one or more parameters can be selected which are shown as below + \arg DMA_INT_FTF: channel full transfer finish interrupt + \arg DMA_INT_HTF: channel half transfer finish interrupt + \arg DMA_INT_ERR: channel error interrupt + \param[out] none + \retval none +*/ +void dma_interrupt_disable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~source; +} + +/*! + \brief check whether peripheral and channels match + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA_CHx(x=0..6) + \param[out] none + \retval none +*/ +static ErrStatus dma_periph_and_channel_check(uint32_t dma_periph, dma_channel_enum channelx) +{ + ErrStatus val = SUCCESS; + + if(DMA1 == dma_periph){ + /* for DMA1, the channel is from DMA_CH0 to DMA_CH4 */ + if(channelx > DMA_CH4){ + val = ERROR; + } + } + + return val; +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_enet.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_enet.c new file mode 100644 index 0000000..7841254 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_enet.c @@ -0,0 +1,3680 @@ +/*! + \file gd32f30x_enet.c + \brief ENET driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-04-02, V2.0.1, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_enet.h" +#include + +#ifdef GD32F30X_CL + +#if defined (__CC_ARM) /*!< ARM compiler */ +__align(4) +enet_descriptors_struct rxdesc_tab[ENET_RXBUF_NUM]; /*!< ENET RxDMA descriptor */ +__align(4) +enet_descriptors_struct txdesc_tab[ENET_TXBUF_NUM]; /*!< ENET TxDMA descriptor */ +__align(4) +uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE]; /*!< ENET receive buffer */ +__align(4) +uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE]; /*!< ENET transmit buffer */ + +#elif defined ( __ICCARM__ ) /*!< IAR compiler */ +#pragma data_alignment=4 +enet_descriptors_struct rxdesc_tab[ENET_RXBUF_NUM]; /*!< ENET RxDMA descriptor */ +#pragma data_alignment=4 +enet_descriptors_struct txdesc_tab[ENET_TXBUF_NUM]; /*!< ENET TxDMA descriptor */ +#pragma data_alignment=4 +uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE]; /*!< ENET receive buffer */ +#pragma data_alignment=4 +uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE]; /*!< ENET transmit buffer */ + +#elif defined (__GNUC__) /* GNU Compiler */ +enet_descriptors_struct rxdesc_tab[ENET_RXBUF_NUM] __attribute__ ((aligned (4))); /*!< ENET RxDMA descriptor */ +enet_descriptors_struct txdesc_tab[ENET_TXBUF_NUM] __attribute__ ((aligned (4))); /*!< ENET TxDMA descriptor */ +uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE] __attribute__ ((aligned (4))); /*!< ENET receive buffer */ +uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE] __attribute__ ((aligned (4))); /*!< ENET transmit buffer */ + +#endif /* __CC_ARM */ + +/* global transmit and receive descriptors pointers */ +enet_descriptors_struct *dma_current_txdesc; +enet_descriptors_struct *dma_current_rxdesc; + +/* structure pointer of ptp descriptor for normal mode */ +enet_descriptors_struct *dma_current_ptp_txdesc = NULL; +enet_descriptors_struct *dma_current_ptp_rxdesc = NULL; + +/* init structure parameters for ENET initialization */ +static enet_initpara_struct enet_initpara ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + +static uint32_t enet_unknow_err = 0U; +/* array of register offset for debug information get */ +static const uint16_t enet_reg_tab[] = { +0x0000, 0x0004, 0x0008, 0x000C, 0x0010, 0x0014, 0x0018, 0x001C, 0x0028, 0x002C, 0x0034, +0x0038, 0x003C, 0x0040, 0x0044, 0x0048, 0x004C, 0x0050, 0x0054, 0x0058, 0x005C, 0x1080, + +0x0100, 0x0104, 0x0108, 0x010C, 0x0110, 0x014C, 0x0150, 0x0168, 0x0194, 0x0198, 0x01C4, + +0x0700, 0x0704,0x0708, 0x070C, 0x0710, 0x0714, 0x0718, 0x071C, 0x0720, 0x0728, 0x072C, + +0x1000, 0x1004, 0x1008, 0x100C, 0x1010, 0x1014, 0x1018, 0x101C, 0x1020, 0x1024, 0x1048, +0x104C, 0x1050, 0x1054}; + +/* initialize ENET peripheral with generally concerned parameters, call it by enet_init() */ +static void enet_default_init(void); + +#ifndef USE_DELAY +/* insert a delay time */ +static void enet_delay(uint32_t ncount); +#endif /* USE_DELAY */ + +/*! + \brief deinitialize the ENET, and reset structure parameters for ENET initialization + \param[in] none + \param[out] none + \retval none +*/ +void enet_deinit(void) +{ + rcu_periph_reset_enable(RCU_ENETRST); + rcu_periph_reset_disable(RCU_ENETRST); + enet_initpara_reset(); +} + +/*! + \brief configure the parameters which are usually less cared for initialization + note -- this function must be called before enet_init(), otherwise + configuration will be no effect + \param[in] option: different function option, which is related to several parameters, + only one parameter can be selected which is shown as below, refer to enet_option_enum + \arg FORWARD_OPTION: choose to configure the frame forward related parameters + \arg DMABUS_OPTION: choose to configure the DMA bus mode related parameters + \arg DMA_MAXBURST_OPTION: choose to configure the DMA max burst related parameters + \arg DMA_ARBITRATION_OPTION: choose to configure the DMA arbitration related parameters + \arg STORE_OPTION: choose to configure the store forward mode related parameters + \arg DMA_OPTION: choose to configure the DMA descriptor related parameters + \arg VLAN_OPTION: choose to configure vlan related parameters + \arg FLOWCTL_OPTION: choose to configure flow control related parameters + \arg HASHH_OPTION: choose to configure hash high + \arg HASHL_OPTION: choose to configure hash low + \arg FILTER_OPTION: choose to configure frame filter related parameters + \arg HALFDUPLEX_OPTION: choose to configure halfduplex mode related parameters + \arg TIMER_OPTION: choose to configure time counter related parameters + \arg INTERFRAMEGAP_OPTION: choose to configure the inter frame gap related parameters + \param[in] para: the related parameters according to the option + all the related parameters should be configured which are shown as below + FORWARD_OPTION related parameters: + - ENET_AUTO_PADCRC_DROP_ENABLE/ ENET_AUTO_PADCRC_DROP_DISABLE ; + - ENET_TYPEFRAME_CRC_DROP_ENABLE/ ENET_TYPEFRAME_CRC_DROP_DISABLE ; + - ENET_FORWARD_ERRFRAMES_ENABLE/ ENET_FORWARD_ERRFRAMES_DISABLE ; + - ENET_FORWARD_UNDERSZ_GOODFRAMES_ENABLE/ ENET_FORWARD_UNDERSZ_GOODFRAMES_DISABLE . + DMABUS_OPTION related parameters: + - ENET_ADDRESS_ALIGN_ENABLE/ ENET_ADDRESS_ALIGN_DISABLE ; + - ENET_FIXED_BURST_ENABLE/ ENET_FIXED_BURST_DISABLE ; + - ENET_MIXED_BURST_ENABLE/ ENET_MIXED_BURST_DISABLE ; + DMA_MAXBURST_OPTION related parameters: + - ENET_RXDP_1BEAT/ ENET_RXDP_2BEAT/ ENET_RXDP_4BEAT/ + ENET_RXDP_8BEAT/ ENET_RXDP_16BEAT/ ENET_RXDP_32BEAT/ + ENET_RXDP_4xPGBL_4BEAT/ ENET_RXDP_4xPGBL_8BEAT/ + ENET_RXDP_4xPGBL_16BEAT/ ENET_RXDP_4xPGBL_32BEAT/ + ENET_RXDP_4xPGBL_64BEAT/ ENET_RXDP_4xPGBL_128BEAT ; + - ENET_PGBL_1BEAT/ ENET_PGBL_2BEAT/ ENET_PGBL_4BEAT/ + ENET_PGBL_8BEAT/ ENET_PGBL_16BEAT/ ENET_PGBL_32BEAT/ + ENET_PGBL_4xPGBL_4BEAT/ ENET_PGBL_4xPGBL_8BEAT/ + ENET_PGBL_4xPGBL_16BEAT/ ENET_PGBL_4xPGBL_32BEAT/ + ENET_PGBL_4xPGBL_64BEAT/ ENET_PGBL_4xPGBL_128BEAT ; + - ENET_RXTX_DIFFERENT_PGBL/ ENET_RXTX_SAME_PGBL ; + DMA_ARBITRATION_OPTION related parameters: + - ENET_ARBITRATION_RXPRIORTX + - ENET_ARBITRATION_RXTX_1_1/ ENET_ARBITRATION_RXTX_2_1/ + ENET_ARBITRATION_RXTX_3_1/ ENET_ARBITRATION_RXTX_4_1/. + STORE_OPTION related parameters: + - ENET_RX_MODE_STOREFORWARD/ ENET_RX_MODE_CUTTHROUGH ; + - ENET_TX_MODE_STOREFORWARD/ ENET_TX_MODE_CUTTHROUGH ; + - ENET_RX_THRESHOLD_64BYTES/ ENET_RX_THRESHOLD_32BYTES/ + ENET_RX_THRESHOLD_96BYTES/ ENET_RX_THRESHOLD_128BYTES ; + - ENET_TX_THRESHOLD_64BYTES/ ENET_TX_THRESHOLD_128BYTES/ + ENET_TX_THRESHOLD_192BYTES/ ENET_TX_THRESHOLD_256BYTES/ + ENET_TX_THRESHOLD_40BYTES/ ENET_TX_THRESHOLD_32BYTES/ + ENET_TX_THRESHOLD_24BYTES/ ENET_TX_THRESHOLD_16BYTES . + DMA_OPTION related parameters: + - ENET_FLUSH_RXFRAME_ENABLE/ ENET_FLUSH_RXFRAME_DISABLE ; + - ENET_SECONDFRAME_OPT_ENABLE/ ENET_SECONDFRAME_OPT_DISABLE ; + - ENET_ENHANCED_DESCRIPTOR/ ENET_NORMAL_DESCRIPTOR . + VLAN_OPTION related parameters: + - ENET_VLANTAGCOMPARISON_12BIT/ ENET_VLANTAGCOMPARISON_16BIT ; + - MAC_VLT_VLTI(regval) . + FLOWCTL_OPTION related parameters: + - MAC_FCTL_PTM(regval) ; + - ENET_ZERO_QUANTA_PAUSE_ENABLE/ ENET_ZERO_QUANTA_PAUSE_DISABLE ; + - ENET_PAUSETIME_MINUS4/ ENET_PAUSETIME_MINUS28/ + ENET_PAUSETIME_MINUS144/ENET_PAUSETIME_MINUS256 ; + - ENET_MAC0_AND_UNIQUE_ADDRESS_PAUSEDETECT/ ENET_UNIQUE_PAUSEDETECT ; + - ENET_RX_FLOWCONTROL_ENABLE/ ENET_RX_FLOWCONTROL_DISABLE ; + - ENET_TX_FLOWCONTROL_ENABLE/ ENET_TX_FLOWCONTROL_DISABLE ; + - ENET_ACTIVE_THRESHOLD_256BYTES/ ENET_ACTIVE_THRESHOLD_512BYTES ; + - ENET_ACTIVE_THRESHOLD_768BYTES/ ENET_ACTIVE_THRESHOLD_1024BYTES ; + - ENET_ACTIVE_THRESHOLD_1280BYTES/ ENET_ACTIVE_THRESHOLD_1536BYTES ; + - ENET_ACTIVE_THRESHOLD_1792BYTES ; + - ENET_DEACTIVE_THRESHOLD_256BYTES/ ENET_DEACTIVE_THRESHOLD_512BYTES ; + - ENET_DEACTIVE_THRESHOLD_768BYTES/ ENET_DEACTIVE_THRESHOLD_1024BYTES ; + - ENET_DEACTIVE_THRESHOLD_1280BYTES/ ENET_DEACTIVE_THRESHOLD_1536BYTES ; + - ENET_DEACTIVE_THRESHOLD_1792BYTES . + HASHH_OPTION related parameters: + - 0x0~0xFFFF FFFFU + HASHL_OPTION related parameters: + - 0x0~0xFFFF FFFFU + FILTER_OPTION related parameters: + - ENET_SRC_FILTER_NORMAL_ENABLE/ ENET_SRC_FILTER_INVERSE_ENABLE/ + ENET_SRC_FILTER_DISABLE ; + - ENET_DEST_FILTER_INVERSE_ENABLE/ ENET_DEST_FILTER_INVERSE_DISABLE ; + - ENET_MULTICAST_FILTER_HASH_OR_PERFECT/ ENET_MULTICAST_FILTER_HASH/ + ENET_MULTICAST_FILTER_PERFECT/ ENET_MULTICAST_FILTER_NONE ; + - ENET_UNICAST_FILTER_EITHER/ ENET_UNICAST_FILTER_HASH/ + ENET_UNICAST_FILTER_PERFECT ; + - ENET_PCFRM_PREVENT_ALL/ ENET_PCFRM_PREVENT_PAUSEFRAME/ + ENET_PCFRM_FORWARD_ALL/ ENET_PCFRM_FORWARD_FILTERED . + HALFDUPLEX_OPTION related parameters: + - ENET_CARRIERSENSE_ENABLE/ ENET_CARRIERSENSE_DISABLE ; + - ENET_RECEIVEOWN_ENABLE/ ENET_RECEIVEOWN_DISABLE ; + - ENET_RETRYTRANSMISSION_ENABLE/ ENET_RETRYTRANSMISSION_DISABLE ; + - ENET_BACKOFFLIMIT_10/ ENET_BACKOFFLIMIT_8/ + ENET_BACKOFFLIMIT_4/ ENET_BACKOFFLIMIT_1 ; + - ENET_DEFERRALCHECK_ENABLE/ ENET_DEFERRALCHECK_DISABLE . + TIMER_OPTION related parameters: + - ENET_WATCHDOG_ENABLE/ ENET_WATCHDOG_DISABLE ; + - ENET_JABBER_ENABLE/ ENET_JABBER_DISABLE ; + INTERFRAMEGAP_OPTION related parameters: + - ENET_INTERFRAMEGAP_96BIT/ ENET_INTERFRAMEGAP_88BIT/ + ENET_INTERFRAMEGAP_80BIT/ ENET_INTERFRAMEGAP_72BIT/ + ENET_INTERFRAMEGAP_64BIT/ ENET_INTERFRAMEGAP_56BIT/ + ENET_INTERFRAMEGAP_48BIT/ ENET_INTERFRAMEGAP_40BIT . + \param[out] none + \retval none +*/ +void enet_initpara_config(enet_option_enum option, uint32_t para) +{ + switch(option){ + case FORWARD_OPTION: + /* choose to configure forward_frame, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)FORWARD_OPTION; + enet_initpara.forward_frame = para; + break; + case DMABUS_OPTION: + /* choose to configure dmabus_mode, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)DMABUS_OPTION; + enet_initpara.dmabus_mode = para; + break; + case DMA_MAXBURST_OPTION: + /* choose to configure dma_maxburst, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)DMA_MAXBURST_OPTION; + enet_initpara.dma_maxburst = para; + break; + case DMA_ARBITRATION_OPTION: + /* choose to configure dma_arbitration, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)DMA_ARBITRATION_OPTION; + enet_initpara.dma_arbitration = para; + break; + case STORE_OPTION: + /* choose to configure store_forward_mode, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)STORE_OPTION; + enet_initpara.store_forward_mode = para; + break; + case DMA_OPTION: + /* choose to configure dma_function, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)DMA_OPTION; + +#ifndef SELECT_DESCRIPTORS_ENHANCED_MODE + para &= ~ENET_ENHANCED_DESCRIPTOR; +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + + enet_initpara.dma_function = para; + break; + case VLAN_OPTION: + /* choose to configure vlan_config, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)VLAN_OPTION; + enet_initpara.vlan_config = para; + break; + case FLOWCTL_OPTION: + /* choose to configure flow_control, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)FLOWCTL_OPTION; + enet_initpara.flow_control = para; + break; + case HASHH_OPTION: + /* choose to configure hashtable_high, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)HASHH_OPTION; + enet_initpara.hashtable_high = para; + break; + case HASHL_OPTION: + /* choose to configure hashtable_low, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)HASHL_OPTION; + enet_initpara.hashtable_low = para; + break; + case FILTER_OPTION: + /* choose to configure framesfilter_mode, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)FILTER_OPTION; + enet_initpara.framesfilter_mode = para; + break; + case HALFDUPLEX_OPTION: + /* choose to configure halfduplex_param, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)HALFDUPLEX_OPTION; + enet_initpara.halfduplex_param = para; + break; + case TIMER_OPTION: + /* choose to configure timer_config, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)TIMER_OPTION; + enet_initpara.timer_config = para; + break; + case INTERFRAMEGAP_OPTION: + /* choose to configure interframegap, and save the configuration parameters */ + enet_initpara.option_enable |= (uint32_t)INTERFRAMEGAP_OPTION; + enet_initpara.interframegap = para; + break; + default: + break; + } +} + +/*! + \brief initialize ENET peripheral with generally concerned parameters and the less cared + parameters + \param[in] mediamode: PHY mode and mac loopback configurations, only one parameter can be selected + which is shown as below, refer to enet_mediamode_enum + \arg ENET_AUTO_NEGOTIATION: PHY auto negotiation + \arg ENET_100M_FULLDUPLEX: 100Mbit/s, full-duplex + \arg ENET_100M_HALFDUPLEX: 100Mbit/s, half-duplex + \arg ENET_10M_FULLDUPLEX: 10Mbit/s, full-duplex + \arg ENET_10M_HALFDUPLEX: 10Mbit/s, half-duplex + \arg ENET_LOOPBACKMODE: MAC in loopback mode at the MII + \param[in] checksum: IP frame checksum offload function, only one parameter can be selected + which is shown as below, refer to enet_mediamode_enum + \arg ENET_NO_AUTOCHECKSUM: disable IP frame checksum function + \arg ENET_AUTOCHECKSUM_DROP_FAILFRAMES: enable IP frame checksum function + \arg ENET_AUTOCHECKSUM_ACCEPT_FAILFRAMES: enable IP frame checksum function, and the received frame + with only payload error but no other errors will not be dropped + \param[in] recept: frame filter function, only one parameter can be selected + which is shown as below, refer to enet_frmrecept_enum + \arg ENET_PROMISCUOUS_MODE: promiscuous mode enabled + \arg ENET_RECEIVEALL: all received frame are forwarded to application + \arg ENET_BROADCAST_FRAMES_PASS: the address filters pass all received broadcast frames + \arg ENET_BROADCAST_FRAMES_DROP: the address filters filter all incoming broadcast frames + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus enet_init(enet_mediamode_enum mediamode, enet_chksumconf_enum checksum, enet_frmrecept_enum recept) +{ + uint32_t reg_value=0U, reg_temp = 0U, temp = 0U; + uint32_t media_temp = 0U; + uint32_t timeout = 0U; + uint16_t phy_value = 0U; + ErrStatus phy_state= ERROR, enet_state = ERROR; + + /* PHY interface configuration, configure SMI clock and reset PHY chip */ + if(ERROR == enet_phy_config()){ + _ENET_DELAY_(PHY_RESETDELAY); + if(ERROR == enet_phy_config()){ + return enet_state; + } + } + /* initialize ENET peripheral with generally concerned parameters */ + enet_default_init(); + + /* 1st, configure mediamode */ + media_temp = (uint32_t)mediamode; + /* if is PHY auto negotiation */ + if((uint32_t)ENET_AUTO_NEGOTIATION == media_temp){ + /* wait for PHY_LINKED_STATUS bit be set */ + do{ + enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BSR, &phy_value); + phy_value &= PHY_LINKED_STATUS; + timeout++; + }while((RESET == phy_value) && (timeout < PHY_READ_TO)); + /* return ERROR due to timeout */ + if(PHY_READ_TO == timeout){ + return enet_state; + } + /* reset timeout counter */ + timeout = 0U; + + /* enable auto-negotiation */ + phy_value = PHY_AUTONEGOTIATION; + phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &phy_value); + if(!phy_state){ + /* return ERROR due to write timeout */ + return enet_state; + } + + /* wait for the PHY_AUTONEGO_COMPLETE bit be set */ + do{ + enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BSR, &phy_value); + phy_value &= PHY_AUTONEGO_COMPLETE; + timeout++; + }while((RESET == phy_value) && (timeout < (uint32_t)PHY_READ_TO)); + /* return ERROR due to timeout */ + if(PHY_READ_TO == timeout){ + return enet_state; + } + /* reset timeout counter */ + timeout = 0U; + + /* read the result of the auto-negotiation */ + enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_SR, &phy_value); + /* configure the duplex mode of MAC following the auto-negotiation result */ + if((uint16_t)RESET != (phy_value & PHY_DUPLEX_STATUS)){ + media_temp = ENET_MODE_FULLDUPLEX; + }else{ + media_temp = ENET_MODE_HALFDUPLEX; + } + /* configure the communication speed of MAC following the auto-negotiation result */ + if((uint16_t)RESET !=(phy_value & PHY_SPEED_STATUS)){ + media_temp |= ENET_SPEEDMODE_10M; + }else{ + media_temp |= ENET_SPEEDMODE_100M; + } + }else{ + phy_value = (uint16_t)((media_temp & ENET_MAC_CFG_DPM) >> 3); + phy_value |= (uint16_t)((media_temp & ENET_MAC_CFG_SPD) >> 1); + phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &phy_value); + if(!phy_state){ + /* return ERROR due to write timeout */ + return enet_state; + } + /* PHY configuration need some time */ + _ENET_DELAY_(PHY_CONFIGDELAY); + } + /* after configuring the PHY, use mediamode to configure registers */ + reg_value = ENET_MAC_CFG; + /* configure ENET_MAC_CFG register */ + reg_value &= (~(ENET_MAC_CFG_SPD |ENET_MAC_CFG_DPM |ENET_MAC_CFG_LBM)); + reg_value |= media_temp; + ENET_MAC_CFG = reg_value; + + /* 2st, configure checksum */ + if(RESET != ((uint32_t)checksum & ENET_CHECKSUMOFFLOAD_ENABLE)){ + ENET_MAC_CFG |= ENET_CHECKSUMOFFLOAD_ENABLE; + + reg_value = ENET_DMA_CTL; + /* configure ENET_DMA_CTL register */ + reg_value &= ~ENET_DMA_CTL_DTCERFD; + reg_value |= ((uint32_t)checksum & ENET_DMA_CTL_DTCERFD); + ENET_DMA_CTL = reg_value; + } + + /* 3rd, configure recept */ + ENET_MAC_FRMF |= (uint32_t)recept; + + /* 4th, configure different function options */ + /* configure forward_frame related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)FORWARD_OPTION)){ + reg_temp = enet_initpara.forward_frame; + + reg_value = ENET_MAC_CFG; + temp = reg_temp; + /* configure ENET_MAC_CFG register */ + reg_value &= (~(ENET_MAC_CFG_TFCD |ENET_MAC_CFG_APCD)); + temp &= (ENET_MAC_CFG_TFCD | ENET_MAC_CFG_APCD); + reg_value |= temp; + ENET_MAC_CFG = reg_value; + + reg_value = ENET_DMA_CTL; + temp = reg_temp; + /* configure ENET_DMA_CTL register */ + reg_value &= (~(ENET_DMA_CTL_FERF |ENET_DMA_CTL_FUF)); + temp &= ((ENET_DMA_CTL_FERF | ENET_DMA_CTL_FUF)<<2); + reg_value |= (temp >> 2); + ENET_DMA_CTL = reg_value; + } + + /* configure dmabus_mode related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)DMABUS_OPTION)){ + temp = enet_initpara.dmabus_mode; + + reg_value = ENET_DMA_BCTL; + /* configure ENET_DMA_BCTL register */ + reg_value &= ~(ENET_DMA_BCTL_AA | ENET_DMA_BCTL_FB \ + |ENET_DMA_BCTL_FPBL | ENET_DMA_BCTL_MB); + reg_value |= temp; + ENET_DMA_BCTL = reg_value; + } + + /* configure dma_maxburst related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)DMA_MAXBURST_OPTION)){ + temp = enet_initpara.dma_maxburst; + + reg_value = ENET_DMA_BCTL; + /* configure ENET_DMA_BCTL register */ + reg_value &= ~(ENET_DMA_BCTL_RXDP| ENET_DMA_BCTL_PGBL | ENET_DMA_BCTL_UIP); + reg_value |= temp; + ENET_DMA_BCTL = reg_value; + } + + /* configure dma_arbitration related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)DMA_ARBITRATION_OPTION)){ + temp = enet_initpara.dma_arbitration; + + reg_value = ENET_DMA_BCTL; + /* configure ENET_DMA_BCTL register */ + reg_value &= ~(ENET_DMA_BCTL_RTPR | ENET_DMA_BCTL_DAB); + reg_value |= temp; + ENET_DMA_BCTL = reg_value; + } + + /* configure store_forward_mode related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)STORE_OPTION)){ + temp = enet_initpara.store_forward_mode; + + reg_value = ENET_DMA_CTL; + /* configure ENET_DMA_CTL register */ + reg_value &= ~(ENET_DMA_CTL_RSFD | ENET_DMA_CTL_TSFD| ENET_DMA_CTL_RTHC| ENET_DMA_CTL_TTHC); + reg_value |= temp; + ENET_DMA_CTL = reg_value; + } + + /* configure dma_function related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)DMA_OPTION)){ + reg_temp = enet_initpara.dma_function; + + reg_value = ENET_DMA_CTL; + temp = reg_temp; + /* configure ENET_DMA_CTL register */ + reg_value &= (~(ENET_DMA_CTL_DAFRF |ENET_DMA_CTL_OSF)); + temp &= (ENET_DMA_CTL_DAFRF | ENET_DMA_CTL_OSF); + reg_value |= temp; + ENET_DMA_CTL = reg_value; + + reg_value = ENET_DMA_BCTL; + temp = reg_temp; + /* configure ENET_DMA_BCTL register */ + reg_value &= (~ENET_DMA_BCTL_DFM); + temp &= ENET_DMA_BCTL_DFM; + reg_value |= temp; + ENET_DMA_BCTL = reg_value; + } + + /* configure vlan_config related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)VLAN_OPTION)){ + reg_temp = enet_initpara.vlan_config; + + reg_value = ENET_MAC_VLT; + /* configure ENET_MAC_VLT register */ + reg_value &= ~(ENET_MAC_VLT_VLTI | ENET_MAC_VLT_VLTC); + reg_value |= reg_temp; + ENET_MAC_VLT = reg_value; + } + + /* configure flow_control related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)FLOWCTL_OPTION)){ + reg_temp = enet_initpara.flow_control; + + reg_value = ENET_MAC_FCTL; + temp = reg_temp; + /* configure ENET_MAC_FCTL register */ + reg_value &= ~(ENET_MAC_FCTL_PTM |ENET_MAC_FCTL_DZQP |ENET_MAC_FCTL_PLTS \ + | ENET_MAC_FCTL_UPFDT |ENET_MAC_FCTL_RFCEN |ENET_MAC_FCTL_TFCEN); + temp &= (ENET_MAC_FCTL_PTM |ENET_MAC_FCTL_DZQP |ENET_MAC_FCTL_PLTS \ + | ENET_MAC_FCTL_UPFDT |ENET_MAC_FCTL_RFCEN |ENET_MAC_FCTL_TFCEN); + reg_value |= temp; + ENET_MAC_FCTL = reg_value; + + reg_value = ENET_MAC_FCTH; + temp = reg_temp; + /* configure ENET_MAC_FCTH register */ + reg_value &= ~(ENET_MAC_FCTH_RFA |ENET_MAC_FCTH_RFD); + temp &= ((ENET_MAC_FCTH_RFA | ENET_MAC_FCTH_RFD )<<8); + reg_value |= (temp >> 8); + ENET_MAC_FCTH = reg_value; + } + + /* configure hashtable_high related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)HASHH_OPTION)){ + ENET_MAC_HLH = enet_initpara.hashtable_high; + } + + /* configure hashtable_low related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)HASHL_OPTION)){ + ENET_MAC_HLL = enet_initpara.hashtable_low; + } + + /* configure framesfilter_mode related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)FILTER_OPTION)){ + reg_temp = enet_initpara.framesfilter_mode; + + reg_value = ENET_MAC_FRMF; + /* configure ENET_MAC_FRMF register */ + reg_value &= ~(ENET_MAC_FRMF_SAFLT | ENET_MAC_FRMF_SAIFLT | ENET_MAC_FRMF_DAIFLT \ + | ENET_MAC_FRMF_HMF | ENET_MAC_FRMF_HPFLT | ENET_MAC_FRMF_MFD \ + | ENET_MAC_FRMF_HUF | ENET_MAC_FRMF_PCFRM); + reg_value |= reg_temp; + ENET_MAC_FRMF = reg_value; + } + + /* configure halfduplex_param related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)HALFDUPLEX_OPTION)){ + reg_temp = enet_initpara.halfduplex_param; + + reg_value = ENET_MAC_CFG; + /* configure ENET_MAC_CFG register */ + reg_value &= ~(ENET_MAC_CFG_CSD | ENET_MAC_CFG_ROD | ENET_MAC_CFG_RTD \ + | ENET_MAC_CFG_BOL | ENET_MAC_CFG_DFC); + reg_value |= reg_temp; + ENET_MAC_CFG = reg_value; + } + + /* configure timer_config related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)TIMER_OPTION)){ + reg_temp = enet_initpara.timer_config; + + reg_value = ENET_MAC_CFG; + /* configure ENET_MAC_CFG register */ + reg_value &= ~(ENET_MAC_CFG_WDD | ENET_MAC_CFG_JBD); + reg_value |= reg_temp; + ENET_MAC_CFG = reg_value; + } + + /* configure interframegap related registers */ + if(RESET != (enet_initpara.option_enable & (uint32_t)INTERFRAMEGAP_OPTION)){ + reg_temp = enet_initpara.interframegap; + + reg_value = ENET_MAC_CFG; + /* configure ENET_MAC_CFG register */ + reg_value &= ~ENET_MAC_CFG_IGBS; + reg_value |= reg_temp; + ENET_MAC_CFG = reg_value; + } + + enet_state = SUCCESS; + return enet_state; +} + +/*! + \brief reset all core internal registers located in CLK_TX and CLK_RX + \param[in] none + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_software_reset(void) +{ + uint32_t timeout = 0U; + ErrStatus enet_state = ERROR; + uint32_t dma_flag; + + /* reset all core internal registers located in CLK_TX and CLK_RX */ + ENET_DMA_BCTL |= ENET_DMA_BCTL_SWR; + + /* wait for reset operation complete */ + do{ + dma_flag = (ENET_DMA_BCTL & ENET_DMA_BCTL_SWR); + timeout++; + }while((RESET != dma_flag) && (ENET_DELAY_TO != timeout)); + + /* reset operation complete */ + if(RESET == (ENET_DMA_BCTL & ENET_DMA_BCTL_SWR)){ + enet_state = SUCCESS; + } + + return enet_state; +} + +/*! + \brief check receive frame valid and return frame size + \param[in] none + \param[out] none + \retval size of received frame: 0x0 - 0x3FFF +*/ +uint32_t enet_rxframe_size_get(void) +{ + uint32_t size = 0U; + uint32_t status; + + /* get rdes0 information of current RxDMA descriptor */ + status = dma_current_rxdesc->status; + + /* if the desciptor is owned by DMA */ + if((uint32_t)RESET != (status & ENET_RDES0_DAV)){ + return 0U; + } + + /* if has any error, or the frame uses two or more descriptors */ + if((((uint32_t)RESET) != (status & ENET_RDES0_ERRS)) || + (((uint32_t)RESET) == (status & ENET_RDES0_LDES)) || + (((uint32_t)RESET) == (status & ENET_RDES0_FDES))){ + /* drop current receive frame */ + enet_rxframe_drop(); + + return 1U; + } +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE + /* if is an ethernet-type frame, and IP frame payload error occurred */ + if(((uint32_t)RESET) != (dma_current_rxdesc->status & ENET_RDES0_FRMT) && + ((uint32_t)RESET) != (dma_current_rxdesc->extended_status & ENET_RDES4_IPPLDERR)){ + /* drop current receive frame */ + enet_rxframe_drop(); + + return 1U; + } +#else + /* if is an ethernet-type frame, and IP frame payload error occurred */ + if((((uint32_t)RESET) != (status & ENET_RDES0_FRMT)) && + (((uint32_t)RESET) != (status & ENET_RDES0_PCERR))){ + /* drop current receive frame */ + enet_rxframe_drop(); + + return 1U; + } +#endif + /* if CPU owns current descriptor, no error occured, the frame uses only one descriptor */ + if((((uint32_t)RESET) == (status & ENET_RDES0_DAV)) && + (((uint32_t)RESET) == (status & ENET_RDES0_ERRS)) && + (((uint32_t)RESET) != (status & ENET_RDES0_LDES)) && + (((uint32_t)RESET) != (status & ENET_RDES0_FDES))){ + /* get the size of the received data including CRC */ + size = GET_RDES0_FRML(status); + /* substract the CRC size */ + size = size - 4U; + + /* if is a type frame, and CRC is not included in forwarding frame */ + if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (status & ENET_RDES0_FRMT))){ + size = size + 4U; + } + }else{ + enet_unknow_err++; + enet_rxframe_drop(); + + return 1U; + } + + /* return packet size */ + return size; +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in chain mode + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum, + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[out] none + \retval none +*/ +void enet_descriptors_chain_init(enet_dmadirection_enum direction) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc, *desc_tab; + uint8_t *buf; + + /* if want to initialize DMA Tx descriptors */ + if (ENET_DMA_TX == direction){ + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* select chain mode */ + desc_status = ENET_TDES0_TCHM; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + }else{ + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* select receive chained mode and set buffer1 size */ + desc_bufsize = ENET_RDES1_RCHM | (uint32_t)ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + } + dma_current_ptp_rxdesc = NULL; + dma_current_ptp_txdesc = NULL; + + /* configure each descriptor */ + for(num=0U; num < count; num++){ + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* if is not the last descriptor */ + if(num < (count - 1U)){ + /* configure the next descriptor address */ + desc->buffer2_next_desc_addr = (uint32_t)(desc_tab + num + 1U); + }else{ + /* when it is the last descriptor, the next descriptor address + equals to first descriptor address in descriptor table */ + desc->buffer2_next_desc_addr = (uint32_t) desc_tab; + } + } +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in ring mode + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum, + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[out] none + \retval none +*/ +void enet_descriptors_ring_init(enet_dmadirection_enum direction) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc; + enet_descriptors_struct *desc_tab; + uint8_t *buf; + + /* configure descriptor skip length */ + ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DPSL; + ENET_DMA_BCTL |= DMA_BCTL_DPSL(0); + + /* if want to initialize DMA Tx descriptors */ + if (ENET_DMA_TX == direction){ + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + }else{ + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* set buffer1 size */ + desc_bufsize = ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + } + dma_current_ptp_rxdesc = NULL; + dma_current_ptp_txdesc = NULL; + + /* configure each descriptor */ + for(num=0U; num < count; num++){ + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* when it is the last descriptor */ + if(num == (count - 1U)){ + if (ENET_DMA_TX == direction){ + /* configure transmit end of ring mode */ + desc->status |= ENET_TDES0_TERM; + }else{ + /* configure receive end of ring mode */ + desc->control_buffer_size |= ENET_RDES1_RERM; + } + } + } +} + +/*! + \brief handle current received frame data to application buffer + \param[in] bufsize: the size of buffer which is the parameter in function + \param[out] buffer: pointer to the received frame data + note -- if the input is NULL, user should copy data in application by himself + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_frame_receive(uint8_t *buffer, uint32_t bufsize) +{ + uint32_t offset = 0U, size = 0U; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_DAV)){ + return ERROR; + } + + /* if buffer pointer is null, indicates that users has copied data in application */ + if(NULL != buffer){ + /* if no error occurs, and the frame uses only one descriptor */ + if((((uint32_t)RESET) == (dma_current_rxdesc->status & ENET_RDES0_ERRS)) && + (((uint32_t)RESET) != (dma_current_rxdesc->status & ENET_RDES0_LDES)) && + (((uint32_t)RESET) != (dma_current_rxdesc->status & ENET_RDES0_FDES))){ + /* get the frame length except CRC */ + size = GET_RDES0_FRML(dma_current_rxdesc->status); + size = size - 4U; + + /* if is a type frame, and CRC is not included in forwarding frame */ + if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (dma_current_rxdesc->status & ENET_RDES0_FRMT))){ + size = size + 4U; + } + + /* to avoid situation that the frame size exceeds the buffer length */ + if(size > bufsize){ + return ERROR; + } + + /* copy data from Rx buffer to application buffer */ + for(offset = 0U; offsetbuffer1_addr) + offset)); + } + + }else{ + /* return ERROR */ + return ERROR; + } + } + /* enable reception, descriptor is owned by DMA */ + dma_current_rxdesc->status = ENET_RDES0_DAV; + + /* check Rx buffer unavailable flag status */ + if ((uint32_t)RESET != (ENET_DMA_STAT & ENET_DMA_STAT_RBU)){ + /* clear RBU flag */ + ENET_DMA_STAT = ENET_DMA_STAT_RBU; + /* resume DMA reception by writing to the RPEN register*/ + ENET_DMA_RPEN = 0U; + } + + /* update the current RxDMA descriptor pointer to the next decriptor in RxDMA decriptor table */ + /* chained mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)){ + dma_current_rxdesc = (enet_descriptors_struct*) (dma_current_rxdesc->buffer2_next_desc_addr); + }else{ + /* ring mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)){ + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_rxdesc = (enet_descriptors_struct*) (ENET_DMA_RDTADDR); + }else{ + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_rxdesc = (enet_descriptors_struct*) (uint32_t)((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + (GET_DMA_BCTL_DPSL(ENET_DMA_BCTL))); + } + } + + return SUCCESS; +} + +/*! + \brief handle application buffer data to transmit it + \param[in] buffer: pointer to the frame data to be transmitted, + note -- if the input is NULL, user should handle the data in application by himself + \param[in] length: the length of frame data to be transmitted + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_frame_transmit(uint8_t *buffer, uint32_t length) +{ + uint32_t offset = 0U; + uint32_t dma_tbu_flag, dma_tu_flag; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)){ + return ERROR; + } + + /* only frame length no more than ENET_MAX_FRAME_SIZE is allowed */ + if(length > ENET_MAX_FRAME_SIZE){ + return ERROR; + } + + /* if buffer pointer is null, indicates that users has handled data in application */ + if(NULL != buffer){ + /* copy frame data from application buffer to Tx buffer */ + for(offset = 0U; offset < length; offset++){ + (*(__IO uint8_t *) (uint32_t)((dma_current_txdesc->buffer1_addr) + offset)) = (*(buffer + offset)); + } + } + + /* set the frame length */ + dma_current_txdesc->control_buffer_size = length; + /* set the segment of frame, frame is transmitted in one descriptor */ + dma_current_txdesc->status |= ENET_TDES0_LSG | ENET_TDES0_FSG; + /* enable the DMA transmission */ + dma_current_txdesc->status |= ENET_TDES0_DAV; + + /* check Tx buffer unavailable flag status */ + dma_tbu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TBU); + dma_tu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TU); + + if ((RESET != dma_tbu_flag) || (RESET != dma_tu_flag)){ + /* clear TBU and TU flag */ + ENET_DMA_STAT = (dma_tbu_flag | dma_tu_flag); + /* resume DMA transmission by writing to the TPEN register*/ + ENET_DMA_TPEN = 0U; + } + + /* update the current TxDMA descriptor pointer to the next decriptor in TxDMA decriptor table*/ + /* chained mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TCHM)){ + dma_current_txdesc = (enet_descriptors_struct*) (dma_current_txdesc->buffer2_next_desc_addr); + }else{ + /* ring mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TERM)){ + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_txdesc = (enet_descriptors_struct*) (ENET_DMA_TDTADDR); + }else{ + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_txdesc = (enet_descriptors_struct*) (uint32_t)((uint32_t)dma_current_txdesc + ETH_DMATXDESC_SIZE + (GET_DMA_BCTL_DPSL(ENET_DMA_BCTL))); + } + } + + return SUCCESS; +} + +/*! + \brief configure the transmit IP frame checksum offload calculation and insertion + \param[in] desc: the descriptor pointer which users want to configure + \param[in] checksum: IP frame checksum configuration + only one parameter can be selected which is shown as below + \arg ENET_CHECKSUM_DISABLE: checksum insertion disabled + \arg ENET_CHECKSUM_IPV4HEADER: only IP header checksum calculation and insertion are enabled + \arg ENET_CHECKSUM_TCPUDPICMP_SEGMENT: TCP/UDP/ICMP checksum insertion calculated but pseudo-header + \arg ENET_CHECKSUM_TCPUDPICMP_FULL: TCP/UDP/ICMP checksum insertion fully calculated + \param[out] none + \retval ErrStatus: ERROR, SUCCESS +*/ +ErrStatus enet_transmit_checksum_config(enet_descriptors_struct *desc, uint32_t checksum) +{ + if(NULL != desc){ + desc->status &= ~ENET_TDES0_CM; + desc->status |= checksum; + return SUCCESS; + }else{ + return ERROR; + } +} + +/*! + \brief ENET Tx and Rx function enable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_enable(void) +{ + enet_tx_enable(); + enet_rx_enable(); +} + +/*! + \brief ENET Tx and Rx function disable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_disable(void) +{ + enet_tx_disable(); + enet_rx_disable(); +} + +/*! + \brief configure MAC address + \param[in] mac_addr: select which MAC address will be set, + only one parameter can be selected which is shown as below + \arg ENET_MAC_ADDRESS0: set MAC address 0 filter + \arg ENET_MAC_ADDRESS1: set MAC address 1 filter + \arg ENET_MAC_ADDRESS2: set MAC address 2 filter + \arg ENET_MAC_ADDRESS3: set MAC address 3 filter + \param[in] paddr: the buffer pointer which stores the MAC address + (little-ending store, such as MAC address is aa:bb:cc:dd:ee:22, the buffer is {22, ee, dd, cc, bb, aa}) + \param[out] none + \retval none +*/ +void enet_mac_address_set(enet_macaddress_enum mac_addr, uint8_t paddr[]) +{ + REG32(ENET_ADDRH_BASE + (uint32_t)mac_addr) = ENET_SET_MACADDRH(paddr); + REG32(ENET_ADDRL_BASE + (uint32_t)mac_addr) = ENET_SET_MACADDRL(paddr); +} + +/*! + \brief get MAC address + \param[in] mac_addr: select which MAC address will be get, + only one parameter can be selected which is shown as below + \arg ENET_MAC_ADDRESS0: get MAC address 0 filter + \arg ENET_MAC_ADDRESS1: get MAC address 1 filter + \arg ENET_MAC_ADDRESS2: get MAC address 2 filter + \arg ENET_MAC_ADDRESS3: get MAC address 3 filter + \param[out] paddr: the buffer pointer which is stored the MAC address + (little-ending store, such as mac address is aa:bb:cc:dd:ee:22, the buffer is {22, ee, dd, cc, bb, aa}) + \param[in] bufsize: refer to the size of the buffer which stores the MAC address + \arg 6 - 255 + \retval ErrStatus: ERROR, SUCCESS +*/ +ErrStatus enet_mac_address_get(enet_macaddress_enum mac_addr, uint8_t paddr[], uint8_t bufsize) +{ + if(bufsize < 6U){ + return ERROR; + } + paddr[0] = ENET_GET_MACADDR(mac_addr, 0U); + paddr[1] = ENET_GET_MACADDR(mac_addr, 1U); + paddr[2] = ENET_GET_MACADDR(mac_addr, 2U); + paddr[3] = ENET_GET_MACADDR(mac_addr, 3U); + paddr[4] = ENET_GET_MACADDR(mac_addr, 4U); + paddr[5] = ENET_GET_MACADDR(mac_addr, 5U); + return SUCCESS; +} + +/*! + \brief get the ENET MAC/MSC/PTP/DMA status flag + \param[in] enet_flag: ENET status flag, refer to enet_flag_enum, + only one parameter can be selected which is shown as below + \arg ENET_MAC_FLAG_MPKR: magic packet received flag + \arg ENET_MAC_FLAG_WUFR: wakeup frame received flag + \arg ENET_MAC_FLAG_FLOWCONTROL: flow control status flag + \arg ENET_MAC_FLAG_WUM: WUM status flag + \arg ENET_MAC_FLAG_MSC: MSC status flag + \arg ENET_MAC_FLAG_MSCR: MSC receive status flag + \arg ENET_MAC_FLAG_MSCT: MSC transmit status flag + \arg ENET_MAC_FLAG_TMST: time stamp trigger status flag + \arg ENET_PTP_FLAG_TSSCO: timestamp second counter overflow flag + \arg ENET_PTP_FLAG_TTM: target time match flag + \arg ENET_MSC_FLAG_RFCE: received frames CRC error flag + \arg ENET_MSC_FLAG_RFAE: received frames alignment error flag + \arg ENET_MSC_FLAG_RGUF: received good unicast frames flag + \arg ENET_MSC_FLAG_TGFSC: transmitted good frames single collision flag + \arg ENET_MSC_FLAG_TGFMSC: transmitted good frames more single collision flag + \arg ENET_MSC_FLAG_TGF: transmitted good frames flag + \arg ENET_DMA_FLAG_TS: transmit status flag + \arg ENET_DMA_FLAG_TPS: transmit process stopped status flag + \arg ENET_DMA_FLAG_TBU: transmit buffer unavailable status flag + \arg ENET_DMA_FLAG_TJT: transmit jabber timeout status flag + \arg ENET_DMA_FLAG_RO: receive overflow status flag + \arg ENET_DMA_FLAG_TU: transmit underflow status flag + \arg ENET_DMA_FLAG_RS: receive status flag + \arg ENET_DMA_FLAG_RBU: receive buffer unavailable status flag + \arg ENET_DMA_FLAG_RPS: receive process stopped status flag + \arg ENET_DMA_FLAG_RWT: receive watchdog timeout status flag + \arg ENET_DMA_FLAG_ET: early transmit status flag + \arg ENET_DMA_FLAG_FBE: fatal bus error status flag + \arg ENET_DMA_FLAG_ER: early receive status flag + \arg ENET_DMA_FLAG_AI: abnormal interrupt summary flag + \arg ENET_DMA_FLAG_NI: normal interrupt summary flag + \arg ENET_DMA_FLAG_EB_DMA_ERROR: DMA error flag + \arg ENET_DMA_FLAG_EB_TRANSFER_ERROR: transfer error flag + \arg ENET_DMA_FLAG_EB_ACCESS_ERROR: access error flag + \arg ENET_DMA_FLAG_MSC: MSC status flag + \arg ENET_DMA_FLAG_WUM: WUM status flag + \arg ENET_DMA_FLAG_TST: timestamp trigger status flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus enet_flag_get(enet_flag_enum enet_flag) +{ + if(RESET != (ENET_REG_VAL(enet_flag) & BIT(ENET_BIT_POS(enet_flag)))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear the ENET DMA status flag + \param[in] enet_flag: ENET DMA flag clear, refer to enet_flag_clear_enum + only one parameter can be selected which is shown as below + \arg ENET_DMA_FLAG_TS_CLR: transmit status flag clear + \arg ENET_DMA_FLAG_TPS_CLR: transmit process stopped status flag clear + \arg ENET_DMA_FLAG_TBU_CLR: transmit buffer unavailable status flag clear + \arg ENET_DMA_FLAG_TJT_CLR: transmit jabber timeout status flag clear + \arg ENET_DMA_FLAG_RO_CLR: receive overflow status flag clear + \arg ENET_DMA_FLAG_TU_CLR: transmit underflow status flag clear + \arg ENET_DMA_FLAG_RS_CLR: receive status flag clear + \arg ENET_DMA_FLAG_RBU_CLR: receive buffer unavailable status flag clear + \arg ENET_DMA_FLAG_RPS_CLR: receive process stopped status flag clear + \arg ENET_DMA_FLAG_RWT_CLR: receive watchdog timeout status flag clear + \arg ENET_DMA_FLAG_ET_CLR: early transmit status flag clear + \arg ENET_DMA_FLAG_FBE_CLR: fatal bus error status flag clear + \arg ENET_DMA_FLAG_ER_CLR: early receive status flag clear + \arg ENET_DMA_FLAG_AI_CLR: abnormal interrupt summary flag clear + \arg ENET_DMA_FLAG_NI_CLR: normal interrupt summary flag clear + \param[out] none + \retval none +*/ +void enet_flag_clear(enet_flag_clear_enum enet_flag) +{ + /* write 1 to the corresponding bit in ENET_DMA_STAT, to clear it */ + ENET_REG_VAL(enet_flag) = BIT(ENET_BIT_POS(enet_flag)); +} + +/*! + \brief enable ENET MAC/MSC/DMA interrupt + \param[in] enet_int: ENET interrupt, + only one parameter can be selected which is shown as below + \arg ENET_MAC_INT_WUMIM: WUM interrupt mask + \arg ENET_MAC_INT_TMSTIM: timestamp trigger interrupt mask + \arg ENET_MSC_INT_RFCEIM: received frame CRC error interrupt mask + \arg ENET_MSC_INT_RFAEIM: received frames alignment error interrupt mask + \arg ENET_MSC_INT_RGUFIM: received good unicast frames interrupt mask + \arg ENET_MSC_INT_TGFSCIM: transmitted good frames single collision interrupt mask + \arg ENET_MSC_INT_TGFMSCIM: transmitted good frames more single collision interrupt mask + \arg ENET_MSC_INT_TGFIM: transmitted good frames interrupt mask + \arg ENET_DMA_INT_TIE: transmit interrupt enable + \arg ENET_DMA_INT_TPSIE: transmit process stopped interrupt enable + \arg ENET_DMA_INT_TBUIE: transmit buffer unavailable interrupt enable + \arg ENET_DMA_INT_TJTIE: transmit jabber timeout interrupt enable + \arg ENET_DMA_INT_ROIE: receive overflow interrupt enable + \arg ENET_DMA_INT_TUIE: transmit underflow interrupt enable + \arg ENET_DMA_INT_RIE: receive interrupt enable + \arg ENET_DMA_INT_RBUIE: receive buffer unavailable interrupt enable + \arg ENET_DMA_INT_RPSIE: receive process stopped interrupt enable + \arg ENET_DMA_INT_RWTIE: receive watchdog timeout interrupt enable + \arg ENET_DMA_INT_ETIE: early transmit interrupt enable + \arg ENET_DMA_INT_FBEIE: fatal bus error interrupt enable + \arg ENET_DMA_INT_ERIE: early receive interrupt enable + \arg ENET_DMA_INT_AIE: abnormal interrupt summary enable + \arg ENET_DMA_INT_NIE: normal interrupt summary enable + \param[out] none + \retval none +*/ +void enet_interrupt_enable(enet_int_enum enet_int) +{ + if(DMA_INTEN_REG_OFFSET == ((uint32_t)enet_int >> 6)){ + /* ENET_DMA_INTEN register interrupt */ + ENET_REG_VAL(enet_int) |= BIT(ENET_BIT_POS(enet_int)); + }else{ + /* other INTMSK register interrupt */ + ENET_REG_VAL(enet_int) &= ~BIT(ENET_BIT_POS(enet_int)); + } +} + +/*! + \brief disable ENET MAC/MSC/DMA interrupt + \param[in] enet_int: ENET interrupt, + only one parameter can be selected which is shown as below + \arg ENET_MAC_INT_WUMIM: WUM interrupt mask + \arg ENET_MAC_INT_TMSTIM: timestamp trigger interrupt mask + \arg ENET_MSC_INT_RFCEIM: received frame CRC error interrupt mask + \arg ENET_MSC_INT_RFAEIM: received frames alignment error interrupt mask + \arg ENET_MSC_INT_RGUFIM: received good unicast frames interrupt mask + \arg ENET_MSC_INT_TGFSCIM: transmitted good frames single collision interrupt mask + \arg ENET_MSC_INT_TGFMSCIM: transmitted good frames more single collision interrupt mask + \arg ENET_MSC_INT_TGFIM: transmitted good frames interrupt mask + \arg ENET_DMA_INT_TIE: transmit interrupt enable + \arg ENET_DMA_INT_TPSIE: transmit process stopped interrupt enable + \arg ENET_DMA_INT_TBUIE: transmit buffer unavailable interrupt enable + \arg ENET_DMA_INT_TJTIE: transmit jabber timeout interrupt enable + \arg ENET_DMA_INT_ROIE: receive overflow interrupt enable + \arg ENET_DMA_INT_TUIE: transmit underflow interrupt enable + \arg ENET_DMA_INT_RIE: receive interrupt enable + \arg ENET_DMA_INT_RBUIE: receive buffer unavailable interrupt enable + \arg ENET_DMA_INT_RPSIE: receive process stopped interrupt enable + \arg ENET_DMA_INT_RWTIE: receive watchdog timeout interrupt enable + \arg ENET_DMA_INT_ETIE: early transmit interrupt enable + \arg ENET_DMA_INT_FBEIE: fatal bus error interrupt enable + \arg ENET_DMA_INT_ERIE: early receive interrupt enable + \arg ENET_DMA_INT_AIE: abnormal interrupt summary enable + \arg ENET_DMA_INT_NIE: normal interrupt summary enable + \param[out] none + \retval none +*/ +void enet_interrupt_disable(enet_int_enum enet_int) +{ + if(DMA_INTEN_REG_OFFSET == ((uint32_t)enet_int >> 6)){ + /* ENET_DMA_INTEN register interrupt */ + ENET_REG_VAL(enet_int) &= ~BIT(ENET_BIT_POS(enet_int)); + }else{ + /* other INTMSK register interrupt */ + ENET_REG_VAL(enet_int) |= BIT(ENET_BIT_POS(enet_int)); + } +} + +/*! + \brief get ENET MAC/MSC/DMA interrupt flag + \param[in] int_flag: ENET interrupt flag, + only one parameter can be selected which is shown as below + \arg ENET_MAC_INT_FLAG_WUM: WUM status flag + \arg ENET_MAC_INT_FLAG_MSC: MSC status flag + \arg ENET_MAC_INT_FLAG_MSCR: MSC receive status flag + \arg ENET_MAC_INT_FLAG_MSCT: MSC transmit status flag + \arg ENET_MAC_INT_FLAG_TMST: time stamp trigger status flag + \arg ENET_MSC_INT_FLAG_RFCE: received frames CRC error flag + \arg ENET_MSC_INT_FLAG_RFAE: received frames alignment error flag + \arg ENET_MSC_INT_FLAG_RGUF: received good unicast frames flag + \arg ENET_MSC_INT_FLAG_TGFSC: transmitted good frames single collision flag + \arg ENET_MSC_INT_FLAG_TGFMSC: transmitted good frames more single collision flag + \arg ENET_MSC_INT_FLAG_TGF: transmitted good frames flag + \arg ENET_DMA_INT_FLAG_TS: transmit status flag + \arg ENET_DMA_INT_FLAG_TPS: transmit process stopped status flag + \arg ENET_DMA_INT_FLAG_TBU: transmit buffer unavailable status flag + \arg ENET_DMA_INT_FLAG_TJT: transmit jabber timeout status flag + \arg ENET_DMA_INT_FLAG_RO: receive overflow status flag + \arg ENET_DMA_INT_FLAG_TU: transmit underflow status flag + \arg ENET_DMA_INT_FLAG_RS: receive status flag + \arg ENET_DMA_INT_FLAG_RBU: receive buffer unavailable status flag + \arg ENET_DMA_INT_FLAG_RPS: receive process stopped status flag + \arg ENET_DMA_INT_FLAG_RWT: receive watchdog timeout status flag + \arg ENET_DMA_INT_FLAG_ET: early transmit status flag + \arg ENET_DMA_INT_FLAG_FBE: fatal bus error status flag + \arg ENET_DMA_INT_FLAG_ER: early receive status flag + \arg ENET_DMA_INT_FLAG_AI: abnormal interrupt summary flag + \arg ENET_DMA_INT_FLAG_NI: normal interrupt summary flag + \arg ENET_DMA_INT_FLAG_MSC: MSC status flag + \arg ENET_DMA_INT_FLAG_WUM: WUM status flag + \arg ENET_DMA_INT_FLAG_TST: timestamp trigger status flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus enet_interrupt_flag_get(enet_int_flag_enum int_flag) +{ + if(RESET != (ENET_REG_VAL(int_flag) & BIT(ENET_BIT_POS(int_flag)))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear ENET DMA interrupt flag + \param[in] int_flag_clear: clear ENET interrupt flag, + only one parameter can be selected which is shown as below + \arg ENET_DMA_INT_FLAG_TS_CLR: transmit status flag + \arg ENET_DMA_INT_FLAG_TPS_CLR: transmit process stopped status flag + \arg ENET_DMA_INT_FLAG_TBU_CLR: transmit buffer unavailable status flag + \arg ENET_DMA_INT_FLAG_TJT_CLR: transmit jabber timeout status flag + \arg ENET_DMA_INT_FLAG_RO_CLR: receive overflow status flag + \arg ENET_DMA_INT_FLAG_TU_CLR: transmit underflow status flag + \arg ENET_DMA_INT_FLAG_RS_CLR: receive status flag + \arg ENET_DMA_INT_FLAG_RBU_CLR: receive buffer unavailable status flag + \arg ENET_DMA_INT_FLAG_RPS_CLR: receive process stopped status flag + \arg ENET_DMA_INT_FLAG_RWT_CLR: receive watchdog timeout status flag + \arg ENET_DMA_INT_FLAG_ET_CLR: early transmit status flag + \arg ENET_DMA_INT_FLAG_FBE_CLR: fatal bus error status flag + \arg ENET_DMA_INT_FLAG_ER_CLR: early receive status flag + \arg ENET_DMA_INT_FLAG_AI_CLR: abnormal interrupt summary flag + \arg ENET_DMA_INT_FLAG_NI_CLR: normal interrupt summary flag + \param[out] none + \retval none +*/ +void enet_interrupt_flag_clear(enet_int_flag_clear_enum int_flag_clear) +{ + /* write 1 to the corresponding bit in ENET_DMA_STAT, to clear it */ + ENET_REG_VAL(int_flag_clear) = BIT(ENET_BIT_POS(int_flag_clear)); +} + +/*! + \brief ENET Tx function enable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_tx_enable(void) +{ + ENET_MAC_CFG |= ENET_MAC_CFG_TEN; + enet_txfifo_flush(); + ENET_DMA_CTL |= ENET_DMA_CTL_STE; +} + +/*! + \brief ENET Tx function disable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_tx_disable(void) +{ + ENET_DMA_CTL &= ~ENET_DMA_CTL_STE; + enet_txfifo_flush(); + ENET_MAC_CFG &= ~ENET_MAC_CFG_TEN; +} + +/*! + \brief ENET Rx function enable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_rx_enable(void) +{ + ENET_MAC_CFG |= ENET_MAC_CFG_REN; + ENET_DMA_CTL |= ENET_DMA_CTL_SRE; +} + +/*! + \brief ENET Rx function disable (include MAC and DMA module) + \param[in] none + \param[out] none + \retval none +*/ +void enet_rx_disable(void) +{ + ENET_DMA_CTL &= ~ENET_DMA_CTL_SRE; + ENET_MAC_CFG &= ~ENET_MAC_CFG_REN; +} + +/*! + \brief put registers value into the application buffer + \param[in] type: register type which will be get, refer to enet_registers_type_enum, + only one parameter can be selected which is shown as below + \arg ALL_MAC_REG: get the registers within the offset scope between ENET_MAC_CFG and ENET_MAC_FCTH + \arg ALL_MSC_REG: get the registers within the offset scope between ENET_MSC_CTL and ENET_MSC_RGUFCNT + \arg ALL_PTP_REG: get the registers within the offset scope between ENET_PTP_TSCTL and ENET_PTP_PPSCTL + \arg ALL_DMA_REG: get the registers within the offset scope between ENET_DMA_BCTL and ENET_DMA_CRBADDR + \param[in] num: the number of registers that the user want to get + \param[out] preg: the application buffer pointer for storing the register value + \retval none +*/ +void enet_registers_get(enet_registers_type_enum type, uint32_t *preg, uint32_t num) +{ + uint32_t offset = 0U, max = 0U, limit = 0U; + + offset = (uint32_t)type; + max = (uint32_t)type + num; + limit = sizeof(enet_reg_tab)/sizeof(uint16_t); + + /* prevent element in this array is out of range */ + if(max > limit){ + max = limit; + } + + for(; offset < max; offset++){ + /* get value of the corresponding register */ + *preg = REG32((ENET) + enet_reg_tab[offset]); + preg++; + } +} + +/*! + \brief get the enet debug status from the debug register + \param[in] mac_debug: enet debug status, + only one parameter can be selected which is shown as below + \arg ENET_MAC_RECEIVER_NOT_IDLE: MAC receiver is not in idle state + \arg ENET_RX_ASYNCHRONOUS_FIFO_STATE: Rx asynchronous FIFO status + \arg ENET_RXFIFO_WRITING: RxFIFO is doing write operation + \arg ENET_RXFIFO_READ_STATUS: RxFIFO read operation status + \arg ENET_RXFIFO_STATE: RxFIFO state + \arg ENET_MAC_TRANSMITTER_NOT_IDLE: MAC transmitter is not in idle state + \arg ENET_MAC_TRANSMITTER_STATUS: status of MAC transmitter + \arg ENET_PAUSE_CONDITION_STATUS: pause condition status + \arg ENET_TXFIFO_READ_STATUS: TxFIFO read operation status + \arg ENET_TXFIFO_WRITING: TxFIFO is doing write operation + \arg ENET_TXFIFO_NOT_EMPTY: TxFIFO is not empty + \arg ENET_TXFIFO_FULL: TxFIFO is full + \param[out] none + \retval value of the status users want to get +*/ +uint32_t enet_debug_status_get(uint32_t mac_debug) +{ + uint32_t temp_state = 0U; + + switch(mac_debug){ + case ENET_RX_ASYNCHRONOUS_FIFO_STATE: + temp_state = GET_MAC_DBG_RXAFS(ENET_MAC_DBG); + break; + case ENET_RXFIFO_READ_STATUS: + temp_state = GET_MAC_DBG_RXFRS(ENET_MAC_DBG); + break; + case ENET_RXFIFO_STATE: + temp_state = GET_MAC_DBG_RXFS(ENET_MAC_DBG); + break; + case ENET_MAC_TRANSMITTER_STATUS: + temp_state = GET_MAC_DBG_SOMT(ENET_MAC_DBG); + break; + case ENET_TXFIFO_READ_STATUS: + temp_state = GET_MAC_DBG_TXFRS(ENET_MAC_DBG); + break; + default: + if(RESET != (ENET_MAC_DBG & mac_debug)){ + temp_state = 0x1U; + } + break; + } + return temp_state; +} + +/*! + \brief enable the MAC address filter + \param[in] mac_addr: select which MAC address will be enable + \arg ENET_MAC_ADDRESS1: enable MAC address 1 filter + \arg ENET_MAC_ADDRESS2: enable MAC address 2 filter + \arg ENET_MAC_ADDRESS3: enable MAC address 3 filter + \param[out] none + \retval none +*/ +void enet_address_filter_enable(enet_macaddress_enum mac_addr) +{ + REG32(ENET_ADDRH_BASE + mac_addr) |= ENET_MAC_ADDR1H_AFE; +} + +/*! + \brief disable the MAC address filter + \param[in] mac_addr: select which MAC address will be disable, + only one parameter can be selected which is shown as below + \arg ENET_MAC_ADDRESS1: disable MAC address 1 filter + \arg ENET_MAC_ADDRESS2: disable MAC address 2 filter + \arg ENET_MAC_ADDRESS3: disable MAC address 3 filter + \param[out] none + \retval none +*/ +void enet_address_filter_disable(enet_macaddress_enum mac_addr) +{ + REG32(ENET_ADDRH_BASE + mac_addr) &= ~ENET_MAC_ADDR1H_AFE; +} + +/*! + \brief configure the MAC address filter + \param[in] mac_addr: select which MAC address will be configured, + only one parameter can be selected which is shown as below + \arg ENET_MAC_ADDRESS1: configure MAC address 1 filter + \arg ENET_MAC_ADDRESS2: configure MAC address 2 filter + \arg ENET_MAC_ADDRESS3: configure MAC address 3 filter + \param[in] addr_mask: select which MAC address bytes will be mask, + one or more parameters can be selected which are shown as below + \arg ENET_ADDRESS_MASK_BYTE0: mask ENET_MAC_ADDR1L[7:0] bits + \arg ENET_ADDRESS_MASK_BYTE1: mask ENET_MAC_ADDR1L[15:8] bits + \arg ENET_ADDRESS_MASK_BYTE2: mask ENET_MAC_ADDR1L[23:16] bits + \arg ENET_ADDRESS_MASK_BYTE3: mask ENET_MAC_ADDR1L [31:24] bits + \arg ENET_ADDRESS_MASK_BYTE4: mask ENET_MAC_ADDR1H [7:0] bits + \arg ENET_ADDRESS_MASK_BYTE5: mask ENET_MAC_ADDR1H [15:8] bits + \param[in] filter_type: select which MAC address filter type will be selected, + only one parameter can be selected which is shown as below + \arg ENET_ADDRESS_FILTER_SA: The MAC address is used to compared with the SA field of the received frame + \arg ENET_ADDRESS_FILTER_DA: The MAC address is used to compared with the DA field of the received frame + \param[out] none + \retval none +*/ +void enet_address_filter_config(enet_macaddress_enum mac_addr, uint32_t addr_mask, uint32_t filter_type) +{ + uint32_t reg; + + /* get the address filter register value which is to be configured */ + reg = REG32(ENET_ADDRH_BASE + mac_addr); + + /* clear and configure the address filter register */ + reg &= ~(ENET_MAC_ADDR1H_MB | ENET_MAC_ADDR1H_SAF); + reg |= (addr_mask | filter_type); + REG32(ENET_ADDRH_BASE + mac_addr) = reg; +} + +/*! + \brief PHY interface configuration (configure SMI clock and reset PHY chip) + \param[in] none + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_phy_config(void) +{ + uint32_t ahbclk; + uint32_t reg; + uint16_t phy_value; + ErrStatus enet_state = ERROR; + + /* clear the previous MDC clock */ + reg = ENET_MAC_PHY_CTL; + reg &= ~ENET_MAC_PHY_CTL_CLR; + + /* get the HCLK frequency */ + ahbclk = rcu_clock_freq_get(CK_AHB); + + /* configure MDC clock according to HCLK frequency range */ + if(ENET_RANGE(ahbclk, 20000000U, 35000000U)){ + reg |= ENET_MDC_HCLK_DIV16; + }else if(ENET_RANGE(ahbclk, 35000000U, 60000000U)){ + reg |= ENET_MDC_HCLK_DIV26; + }else if(ENET_RANGE(ahbclk, 60000000U, 100000000U)){ + reg |= ENET_MDC_HCLK_DIV42; + }else if((ENET_RANGE(ahbclk, 100000000U, 168000000U))||(168000000U == ahbclk)){ + reg |= ENET_MDC_HCLK_DIV62; + }else{ + return enet_state; + } + ENET_MAC_PHY_CTL = reg; + + /* reset PHY */ + phy_value = PHY_RESET; + if(ERROR == (enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &phy_value))){ + return enet_state; + } + /* PHY reset need some time */ + _ENET_DELAY_(ENET_DELAY_TO); + + /* check whether PHY reset is complete */ + if(ERROR == (enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BCR, &phy_value))){ + return enet_state; + } + + /* PHY reset complete */ + if(RESET == (phy_value & PHY_RESET)){ + enet_state = SUCCESS; + } + + return enet_state; +} + +/*! + \brief write to / read from a PHY register + \param[in] direction: only one parameter can be selected which is shown as below + \arg ENET_PHY_WRITE: write data to phy register + \arg ENET_PHY_READ: read data from phy register + \param[in] phy_address: 0x0 - 0x1F + \param[in] phy_reg: 0x0 - 0x1F + \param[in] pvalue: the value will be written to the PHY register in ENET_PHY_WRITE direction + \param[out] pvalue: the value will be read from the PHY register in ENET_PHY_READ direction + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_phy_write_read(enet_phydirection_enum direction, uint16_t phy_address, uint16_t phy_reg, uint16_t *pvalue) +{ + uint32_t reg, phy_flag; + uint32_t timeout = 0U; + ErrStatus enet_state = ERROR; + + /* configure ENET_MAC_PHY_CTL with write/read operation */ + reg = ENET_MAC_PHY_CTL; + reg &= ~(ENET_MAC_PHY_CTL_PB | ENET_MAC_PHY_CTL_PW | ENET_MAC_PHY_CTL_PR | ENET_MAC_PHY_CTL_PA); + reg |= (direction | MAC_PHY_CTL_PR(phy_reg) | MAC_PHY_CTL_PA(phy_address) | ENET_MAC_PHY_CTL_PB); + + /* if do the write operation, write value to the register */ + if(ENET_PHY_WRITE == direction){ + ENET_MAC_PHY_DATA = *pvalue; + } + + /* do PHY write/read operation, and wait the operation complete */ + ENET_MAC_PHY_CTL = reg; + do{ + phy_flag = (ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_PB); + timeout++; + } + while((RESET != phy_flag) && (ENET_DELAY_TO != timeout)); + + /* write/read operation complete */ + if(RESET == (ENET_MAC_PHY_CTL & ENET_MAC_PHY_CTL_PB)){ + enet_state = SUCCESS; + } + + /* if do the read operation, get value from the register */ + if(ENET_PHY_READ == direction){ + *pvalue = (uint16_t)ENET_MAC_PHY_DATA; + } + + return enet_state; +} + +/*! + \brief enable the loopback function of PHY chip + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus enet_phyloopback_enable(void) +{ + uint16_t temp_phy = 0U; + ErrStatus phy_state = ERROR; + + /* get the PHY configuration to update it */ + enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); + + /* enable the PHY loopback mode */ + temp_phy |= PHY_LOOPBACK; + + /* update the PHY control register with the new configuration */ + phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); + + return phy_state; +} + +/*! + \brief disable the loopback function of PHY chip + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus enet_phyloopback_disable(void) +{ + uint16_t temp_phy = 0U; + ErrStatus phy_state = ERROR; + + /* get the PHY configuration to update it */ + enet_phy_write_read(ENET_PHY_READ, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); + + /* disable the PHY loopback mode */ + temp_phy &= (uint16_t)~PHY_LOOPBACK; + + /* update the PHY control register with the new configuration */ + phy_state = enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, PHY_REG_BCR, &temp_phy); + + return phy_state; +} + +/*! + \brief enable ENET forward feature + \param[in] feature: the feature of ENET forward mode, + one or more parameters can be selected which are shown as below + \arg ENET_AUTO_PADCRC_DROP: the function of the MAC strips the Pad/FCS field on received frames + \arg ENET_TYPEFRAME_CRC_DROP: the function that FCS field(last 4 bytes) of frame will be dropped before forwarding + \arg ENET_FORWARD_ERRFRAMES: the function that all frame received with error except runt error are forwarded to memory + \arg ENET_FORWARD_UNDERSZ_GOODFRAMES: the function that forwarding undersized good frames + \param[out] none + \retval none +*/ +void enet_forward_feature_enable(uint32_t feature) +{ + uint32_t mask; + + mask = (feature & (~(ENET_FORWARD_ERRFRAMES | ENET_FORWARD_UNDERSZ_GOODFRAMES))); + ENET_MAC_CFG |= mask; + + mask = (feature & (~(ENET_AUTO_PADCRC_DROP | ENET_TYPEFRAME_CRC_DROP))); + ENET_DMA_CTL |= (mask >> 2); +} + +/*! + \brief disable ENET forward feature + \param[in] feature: the feature of ENET forward mode, + one or more parameters can be selected which are shown as below + \arg ENET_AUTO_PADCRC_DROP: the function of the MAC strips the Pad/FCS field on received frames + \arg ENET_TYPEFRAME_CRC_DROP: the function that FCS field(last 4 bytes) of frame will be dropped before forwarding + \arg ENET_FORWARD_ERRFRAMES: the function that all frame received with error except runt error are forwarded to memory + \arg ENET_FORWARD_UNDERSZ_GOODFRAMES: the function that forwarding undersized good frames + \param[out] none + \retval none +*/ +void enet_forward_feature_disable(uint32_t feature) +{ + uint32_t mask; + + mask = (feature & (~(ENET_FORWARD_ERRFRAMES | ENET_FORWARD_UNDERSZ_GOODFRAMES))); + ENET_MAC_CFG &= ~mask; + + mask = (feature & (~(ENET_AUTO_PADCRC_DROP | ENET_TYPEFRAME_CRC_DROP))); + ENET_DMA_CTL &= ~(mask >> 2); +} + +/*! + \brief enable ENET fliter feature + \param[in] feature: the feature of ENET fliter mode, + one or more parameters can be selected which are shown as below + \arg ENET_SRC_FILTER: filter source address function + \arg ENET_SRC_FILTER_INVERSE: inverse source address filtering result function + \arg ENET_DEST_FILTER_INVERSE: inverse DA filtering result function + \arg ENET_MULTICAST_FILTER_PASS: pass all multicast frames function + \arg ENET_MULTICAST_FILTER_HASH_MODE: HASH multicast filter function + \arg ENET_UNICAST_FILTER_HASH_MODE: HASH unicast filter function + \arg ENET_FILTER_MODE_EITHER: HASH or perfect filter function + \param[out] none + \retval none +*/ +void enet_fliter_feature_enable(uint32_t feature) +{ + ENET_MAC_FRMF |= feature; +} + +/*! + \brief disable ENET fliter feature + \param[in] feature: the feature of ENET fliter mode, + one or more parameters can be selected which are shown as below + \arg ENET_SRC_FILTER: filter source address function + \arg ENET_SRC_FILTER_INVERSE: inverse source address filtering result function + \arg ENET_DEST_FILTER_INVERSE: inverse DA filtering result function + \arg ENET_MULTICAST_FILTER_PASS: pass all multicast frames function + \arg ENET_MULTICAST_FILTER_HASH_MODE: HASH multicast filter function + \arg ENET_UNICAST_FILTER_HASH_MODE: HASH unicast filter function + \arg ENET_FILTER_MODE_EITHER: HASH or perfect filter function + \param[out] none + \retval none +*/ +void enet_fliter_feature_disable(uint32_t feature) +{ + ENET_MAC_FRMF &= ~feature; +} + +/*! + \brief generate the pause frame, ENET will send pause frame after enable transmit flow control + this function only use in full-dulex mode + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus enet_pauseframe_generate(void) +{ + ErrStatus enet_state =ERROR; + uint32_t temp = 0U; + + /* in full-duplex mode, must make sure this bit is 0 before writing register */ + temp = ENET_MAC_FCTL & ENET_MAC_FCTL_FLCBBKPA; + if(RESET == temp){ + ENET_MAC_FCTL |= ENET_MAC_FCTL_FLCBBKPA; + enet_state = SUCCESS; + } + return enet_state; +} + +/*! + \brief configure the pause frame detect type + \param[in] detect: pause frame detect type, + only one parameter can be selected which is shown as below + \arg ENET_MAC0_AND_UNIQUE_ADDRESS_PAUSEDETECT: besides the unique multicast address, MAC can also + use the MAC0 address to detecting pause frame + \arg ENET_UNIQUE_PAUSEDETECT: only the unique multicast address for pause frame which is specified + in IEEE802.3 can be detected + \param[out] none + \retval none +*/ +void enet_pauseframe_detect_config(uint32_t detect) +{ + ENET_MAC_FCTL &= ~ENET_MAC_FCTL_UPFDT; + ENET_MAC_FCTL |= detect; +} + +/*! + \brief configure the pause frame parameters + \param[in] pausetime: pause time in transmit pause control frame + \param[in] pause_threshold: the threshold of the pause timer for retransmitting frames automatically, + this value must make sure to be less than configured pause time, only one parameter can be + selected which is shown as below + \arg ENET_PAUSETIME_MINUS4: pause time minus 4 slot times + \arg ENET_PAUSETIME_MINUS28: pause time minus 28 slot times + \arg ENET_PAUSETIME_MINUS144: pause time minus 144 slot times + \arg ENET_PAUSETIME_MINUS256: pause time minus 256 slot times + \param[out] none + \retval none +*/ +void enet_pauseframe_config(uint32_t pausetime, uint32_t pause_threshold) +{ + ENET_MAC_FCTL &= ~(ENET_MAC_FCTL_PTM | ENET_MAC_FCTL_PLTS); + ENET_MAC_FCTL |= (MAC_FCTL_PTM(pausetime) | pause_threshold); +} + +/*! + \brief configure the threshold of the flow control(deactive and active threshold) + \param[in] deactive: the threshold of the deactive flow control, this value + should always be less than active flow control value, only one + parameter can be selected which is shown as below + \arg ENET_DEACTIVE_THRESHOLD_256BYTES: threshold level is 256 bytes + \arg ENET_DEACTIVE_THRESHOLD_512BYTES: threshold level is 512 bytes + \arg ENET_DEACTIVE_THRESHOLD_768BYTES: threshold level is 768 bytes + \arg ENET_DEACTIVE_THRESHOLD_1024BYTES: threshold level is 1024 bytes + \arg ENET_DEACTIVE_THRESHOLD_1280BYTES: threshold level is 1280 bytes + \arg ENET_DEACTIVE_THRESHOLD_1536BYTES: threshold level is 1536 bytes + \arg ENET_DEACTIVE_THRESHOLD_1792BYTES: threshold level is 1792 bytes + \param[in] active: the threshold of the active flow control, only one parameter + can be selected which is shown as below + \arg ENET_ACTIVE_THRESHOLD_256BYTES: threshold level is 256 bytes + \arg ENET_ACTIVE_THRESHOLD_512BYTES: threshold level is 512 bytes + \arg ENET_ACTIVE_THRESHOLD_768BYTES: threshold level is 768 bytes + \arg ENET_ACTIVE_THRESHOLD_1024BYTES: threshold level is 1024 bytes + \arg ENET_ACTIVE_THRESHOLD_1280BYTES: threshold level is 1280 bytes + \arg ENET_ACTIVE_THRESHOLD_1536BYTES: threshold level is 1536 bytes + \arg ENET_ACTIVE_THRESHOLD_1792BYTES: threshold level is 1792 bytes + \param[out] none + \retval none +*/ +void enet_flowcontrol_threshold_config(uint32_t deactive, uint32_t active) +{ + ENET_MAC_FCTH = ((deactive | active) >> 8); +} + +/*! + \brief enable ENET flow control feature + \param[in] feature: the feature of ENET flow control mode + one or more parameters can be selected which are shown as below + \arg ENET_ZERO_QUANTA_PAUSE: the automatic zero-quanta generation function + \arg ENET_TX_FLOWCONTROL: the flow control operation in the MAC + \arg ENET_RX_FLOWCONTROL: decoding function for the received pause frame and process it + \arg ENET_BACK_PRESSURE: back pressure operation in the MAC(only use in half-dulex mode) + \param[out] none + \retval none +*/ +void enet_flowcontrol_feature_enable(uint32_t feature) +{ + if(RESET != (feature & ENET_ZERO_QUANTA_PAUSE)){ + ENET_MAC_FCTL &= ~ENET_ZERO_QUANTA_PAUSE; + } + feature &= ~ENET_ZERO_QUANTA_PAUSE; + ENET_MAC_FCTL |= feature; +} + +/*! + \brief disable ENET flow control feature + \param[in] feature: the feature of ENET flow control mode + one or more parameters can be selected which are shown as below + \arg ENET_ZERO_QUANTA_PAUSE: the automatic zero-quanta generation function + \arg ENET_TX_FLOWCONTROL: the flow control operation in the MAC + \arg ENET_RX_FLOWCONTROL: decoding function for the received pause frame and process it + \arg ENET_BACK_PRESSURE: back pressure operation in the MAC(only use in half-dulex mode) + \param[out] none + \retval none +*/ +void enet_flowcontrol_feature_disable(uint32_t feature) +{ + if(RESET != (feature & ENET_ZERO_QUANTA_PAUSE)){ + ENET_MAC_FCTL |= ENET_ZERO_QUANTA_PAUSE; + } + feature &= ~ENET_ZERO_QUANTA_PAUSE; + ENET_MAC_FCTL &= ~feature; +} + +/*! + \brief get the dma transmit/receive process state + \param[in] direction: choose the direction of dma process which users want to check, + refer to enet_dmadirection_enum, only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: dma transmit process + \arg ENET_DMA_RX: dma receive process + \param[out] none + \retval state of dma process, the value range shows below: + ENET_RX_STATE_STOPPED, ENET_RX_STATE_FETCHING, ENET_RX_STATE_WAITING, + ENET_RX_STATE_SUSPENDED, ENET_RX_STATE_CLOSING, ENET_RX_STATE_QUEUING, + ENET_TX_STATE_STOPPED, ENET_TX_STATE_FETCHING, ENET_TX_STATE_WAITING, + ENET_TX_STATE_READING, ENET_TX_STATE_SUSPENDED, ENET_TX_STATE_CLOSING +*/ +uint32_t enet_dmaprocess_state_get(enet_dmadirection_enum direction) +{ + uint32_t reval; + reval = (uint32_t)(ENET_DMA_STAT & (uint32_t)direction); + return reval; +} + +/*! + \brief poll the DMA transmission/reception enable by writing any value to the + ENET_DMA_TPEN/ENET_DMA_RPEN register, this will make the DMA to resume transmission/reception + \param[in] direction: choose the direction of DMA process which users want to resume, + refer to enet_dmadirection_enum, only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA transmit process + \arg ENET_DMA_RX: DMA receive process + \param[out] none + \retval none +*/ +void enet_dmaprocess_resume(enet_dmadirection_enum direction) +{ + if(ENET_DMA_TX == direction){ + ENET_DMA_TPEN = 0U; + }else{ + ENET_DMA_RPEN = 0U; + } +} + +/*! + \brief check and recover the Rx process + \param[in] none + \param[out] none + \retval none +*/ +void enet_rxprocess_check_recovery(void) +{ + uint32_t status; + + /* get DAV information of current RxDMA descriptor */ + status = dma_current_rxdesc->status; + status &= ENET_RDES0_DAV; + + /* if current descriptor is owned by DMA, but the descriptor address mismatches with + receive descriptor address pointer updated by RxDMA controller */ + if((ENET_DMA_CRDADDR != ((uint32_t)dma_current_rxdesc)) && + (ENET_RDES0_DAV == status)){ + dma_current_rxdesc = (enet_descriptors_struct*)ENET_DMA_CRDADDR; + } +} + +/*! + \brief flush the ENET transmit FIFO, and wait until the flush operation completes + \param[in] none + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus enet_txfifo_flush(void) +{ + uint32_t flush_state; + uint32_t timeout = 0U; + ErrStatus enet_state = ERROR; + + /* set the FTF bit for flushing transmit FIFO */ + ENET_DMA_CTL |= ENET_DMA_CTL_FTF; + /* wait until the flush operation completes */ + do{ + flush_state = ENET_DMA_CTL & ENET_DMA_CTL_FTF; + timeout++; + }while((RESET != flush_state) && (timeout < ENET_DELAY_TO)); + /* return ERROR due to timeout */ + if(RESET == flush_state){ + enet_state = SUCCESS; + } + + return enet_state; +} + +/*! + \brief get the transmit/receive address of current descriptor, or current buffer, or descriptor table + \param[in] addr_get: choose the address which users want to get, refer to enet_desc_reg_enum, + only one parameter can be selected which is shown as below + \arg ENET_RX_DESC_TABLE: the start address of the receive descriptor table + \arg ENET_RX_CURRENT_DESC: the start descriptor address of the current receive descriptor read by + the RxDMA controller + \arg ENET_RX_CURRENT_BUFFER: the current receive buffer address being read by the RxDMA controller + \arg ENET_TX_DESC_TABLE: the start address of the transmit descriptor table + \arg ENET_TX_CURRENT_DESC: the start descriptor address of the current transmit descriptor read by + the TxDMA controller + \arg ENET_TX_CURRENT_BUFFER: the current transmit buffer address being read by the TxDMA controller + \param[out] none + \retval address value +*/ +uint32_t enet_current_desc_address_get(enet_desc_reg_enum addr_get) +{ + uint32_t reval = 0U; + + reval = REG32((ENET) +(uint32_t)addr_get); + return reval; +} + +/*! + \brief get the Tx or Rx descriptor information + \param[in] desc: the descriptor pointer which users want to get information + \param[in] info_get: the descriptor information type which is selected, + only one parameter can be selected which is shown as below + \arg RXDESC_BUFFER_1_SIZE: receive buffer 1 size + \arg RXDESC_BUFFER_2_SIZE: receive buffer 2 size + \arg RXDESC_FRAME_LENGTH: the byte length of the received frame that was transferred to the buffer + \arg TXDESC_COLLISION_COUNT: the number of collisions occurred before the frame was transmitted + \arg RXDESC_BUFFER_1_ADDR: the buffer1 address of the Rx frame + \arg TXDESC_BUFFER_1_ADDR: the buffer1 address of the Tx frame + \param[out] none + \retval descriptor information, if value is 0xFFFFFFFFU, means the false input parameter +*/ +uint32_t enet_desc_information_get(enet_descriptors_struct *desc, enet_descstate_enum info_get) +{ + uint32_t reval = 0xFFFFFFFFU; + + switch(info_get){ + case RXDESC_BUFFER_1_SIZE: + reval = GET_RDES1_RB1S(desc->control_buffer_size); + break; + case RXDESC_BUFFER_2_SIZE: + reval = GET_RDES1_RB2S(desc->control_buffer_size); + break; + case RXDESC_FRAME_LENGTH: + reval = GET_RDES0_FRML(desc->status); + if(reval > 4U){ + reval = reval - 4U; + + /* if is a type frame, and CRC is not included in forwarding frame */ + if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (desc->status & ENET_RDES0_FRMT))){ + reval = reval + 4U; + } + }else{ + reval = 0U; + } + + break; + case RXDESC_BUFFER_1_ADDR: + reval = desc->buffer1_addr; + break; + case TXDESC_BUFFER_1_ADDR: + reval = desc->buffer1_addr; + break; + case TXDESC_COLLISION_COUNT: + reval = GET_TDES0_COCNT(desc->status); + break; + default: + break; + } + return reval; +} + +/*! + \brief get the number of missed frames during receiving + \param[in] none + \param[out] rxfifo_drop: pointer to the number of frames dropped by RxFIFO + \param[out] rxdma_drop: pointer to the number of frames missed by the RxDMA controller + \retval none +*/ +void enet_missed_frame_counter_get(uint32_t *rxfifo_drop, uint32_t *rxdma_drop) +{ + uint32_t temp_counter = 0U; + + temp_counter = ENET_DMA_MFBOCNT; + *rxfifo_drop = GET_DMA_MFBOCNT_MSFA(temp_counter); + *rxdma_drop = GET_DMA_MFBOCNT_MSFC(temp_counter); +} + +/*! + \brief get the bit flag of ENET DMA descriptor + \param[in] desc: the descriptor pointer which users want to get flag + \param[in] desc_flag: the bit flag of ENET DMA descriptor, + only one parameter can be selected which is shown as below + \arg ENET_TDES0_DB: deferred + \arg ENET_TDES0_UFE: underflow error + \arg ENET_TDES0_EXD: excessive deferral + \arg ENET_TDES0_VFRM: VLAN frame + \arg ENET_TDES0_ECO: excessive collision + \arg ENET_TDES0_LCO: late collision + \arg ENET_TDES0_NCA: no carrier + \arg ENET_TDES0_LCA: loss of carrier + \arg ENET_TDES0_IPPE: IP payload error + \arg ENET_TDES0_FRMF: frame flushed + \arg ENET_TDES0_JT: jabber timeout + \arg ENET_TDES0_ES: error summary + \arg ENET_TDES0_IPHE: IP header error + \arg ENET_TDES0_TTMSS: transmit timestamp status + \arg ENET_TDES0_TCHM: the second address chained mode + \arg ENET_TDES0_TERM: transmit end of ring mode + \arg ENET_TDES0_TTSEN: transmit timestamp function enable + \arg ENET_TDES0_DPAD: disable adding pad + \arg ENET_TDES0_DCRC: disable CRC + \arg ENET_TDES0_FSG: first segment + \arg ENET_TDES0_LSG: last segment + \arg ENET_TDES0_INTC: interrupt on completion + \arg ENET_TDES0_DAV: DAV bit + + \arg ENET_RDES0_PCERR: payload checksum error + \arg ENET_RDES0_EXSV: extended status valid + \arg ENET_RDES0_CERR: CRC error + \arg ENET_RDES0_DBERR: dribble bit error + \arg ENET_RDES0_RERR: receive error + \arg ENET_RDES0_RWDT: receive watchdog timeout + \arg ENET_RDES0_FRMT: frame type + \arg ENET_RDES0_LCO: late collision + \arg ENET_RDES0_IPHERR: IP frame header error + \arg ENET_RDES0_TSV: timestamp valid + \arg ENET_RDES0_LDES: last descriptor + \arg ENET_RDES0_FDES: first descriptor + \arg ENET_RDES0_VTAG: VLAN tag + \arg ENET_RDES0_OERR: overflow error + \arg ENET_RDES0_LERR: length error + \arg ENET_RDES0_SAFF: SA filter fail + \arg ENET_RDES0_DERR: descriptor error + \arg ENET_RDES0_ERRS: error summary + \arg ENET_RDES0_DAFF: destination address filter fail + \arg ENET_RDES0_DAV: descriptor available + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus enet_desc_flag_get(enet_descriptors_struct *desc, uint32_t desc_flag) +{ + FlagStatus enet_flag = RESET; + + if((uint32_t)RESET != (desc->status & desc_flag)){ + enet_flag = SET; + } + + return enet_flag; +} + +/*! + \brief set the bit flag of ENET DMA descriptor + \param[in] desc: the descriptor pointer which users want to set flag + \param[in] desc_flag: the bit flag of ENET DMA descriptor, + only one parameter can be selected which is shown as below + \arg ENET_TDES0_VFRM: VLAN frame + \arg ENET_TDES0_FRMF: frame flushed + \arg ENET_TDES0_TCHM: the second address chained mode + \arg ENET_TDES0_TERM: transmit end of ring mode + \arg ENET_TDES0_TTSEN: transmit timestamp function enable + \arg ENET_TDES0_DPAD: disable adding pad + \arg ENET_TDES0_DCRC: disable CRC + \arg ENET_TDES0_FSG: first segment + \arg ENET_TDES0_LSG: last segment + \arg ENET_TDES0_INTC: interrupt on completion + \arg ENET_TDES0_DAV: DAV bit + \arg ENET_RDES0_DAV: descriptor available + \param[out] none + \retval none +*/ +void enet_desc_flag_set(enet_descriptors_struct *desc, uint32_t desc_flag) +{ + desc->status |= desc_flag; +} + +/*! + \brief clear the bit flag of ENET DMA descriptor + \param[in] desc: the descriptor pointer which users want to clear flag + \param[in] desc_flag: the bit flag of ENET DMA descriptor, + only one parameter can be selected which is shown as below + \arg ENET_TDES0_VFRM: VLAN frame + \arg ENET_TDES0_FRMF: frame flushed + \arg ENET_TDES0_TCHM: the second address chained mode + \arg ENET_TDES0_TERM: transmit end of ring mode + \arg ENET_TDES0_TTSEN: transmit timestamp function enable + \arg ENET_TDES0_DPAD: disable adding pad + \arg ENET_TDES0_DCRC: disable CRC + \arg ENET_TDES0_FSG: first segment + \arg ENET_TDES0_LSG: last segment + \arg ENET_TDES0_INTC: interrupt on completion + \arg ENET_TDES0_DAV: DAV bit + \arg ENET_RDES0_DAV: descriptor available + \param[out] none + \retval none +*/ +void enet_desc_flag_clear(enet_descriptors_struct *desc, uint32_t desc_flag) +{ + desc->status &= ~desc_flag; +} + +/*! + \brief when receiving completed, set RS bit in ENET_DMA_STAT register will immediately set + \param[in] desc: the descriptor pointer which users want to configure + \param[out] none + \retval none +*/ +void enet_rx_desc_immediate_receive_complete_interrupt(enet_descriptors_struct *desc) +{ + desc->control_buffer_size &= ~ENET_RDES1_DINTC; +} + +/*! + \brief when receiving completed, set RS bit in ENET_DMA_STAT register will is set after a configurable delay time + \param[in] desc: the descriptor pointer which users want to configure + \param[in] delay_time: delay a time of 256*delay_time HCLK, this value must be between 0 and 0xFF + \param[out] none + \retval none +*/ +void enet_rx_desc_delay_receive_complete_interrupt(enet_descriptors_struct *desc, uint32_t delay_time) +{ + desc->control_buffer_size |= ENET_RDES1_DINTC; + ENET_DMA_RSWDC = DMA_RSWDC_WDCFRS(delay_time); +} + +/*! + \brief drop current receive frame + \param[in] none + \param[out] none + \retval none +*/ +void enet_rxframe_drop(void) +{ + /* enable reception, descriptor is owned by DMA */ + dma_current_rxdesc->status = ENET_RDES0_DAV; + + /* chained mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)){ + if(NULL != dma_current_ptp_rxdesc){ + dma_current_rxdesc = (enet_descriptors_struct*) (dma_current_ptp_rxdesc->buffer2_next_desc_addr); + /* if it is the last ptp descriptor */ + if(0U != dma_current_ptp_rxdesc->status){ + /* pointer back to the first ptp descriptor address in the desc_ptptab list address */ + dma_current_ptp_rxdesc = (enet_descriptors_struct*) (dma_current_ptp_rxdesc->status); + }else{ + /* ponter to the next ptp descriptor */ + dma_current_ptp_rxdesc++; + } + }else{ + dma_current_rxdesc = (enet_descriptors_struct*) (dma_current_rxdesc->buffer2_next_desc_addr); + } + + }else{ + /* ring mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)){ + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_rxdesc = (enet_descriptors_struct*) (ENET_DMA_RDTADDR); + if(NULL != dma_current_ptp_rxdesc){ + dma_current_ptp_rxdesc = (enet_descriptors_struct*) (dma_current_ptp_rxdesc->status); + } + }else{ + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_rxdesc = (enet_descriptors_struct*) (uint32_t)((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + GET_DMA_BCTL_DPSL(ENET_DMA_BCTL)); + if(NULL != dma_current_ptp_rxdesc){ + dma_current_ptp_rxdesc++; + } + } + } +} + +/*! + \brief enable DMA feature + \param[in] feature: the feature of DMA mode, + one or more parameters can be selected which are shown as below + \arg ENET_NO_FLUSH_RXFRAME: RxDMA does not flushes frames function + \arg ENET_SECONDFRAME_OPT: TxDMA controller operate on second frame function + \param[out] none + \retval none +*/ +void enet_dma_feature_enable(uint32_t feature) +{ + ENET_DMA_CTL |= feature; +} + +/*! + \brief disable DMA feature + \param[in] feature: the feature of DMA mode, + one or more parameters can be selected which are shown as below + \arg ENET_NO_FLUSH_RXFRAME: RxDMA does not flushes frames function + \arg ENET_SECONDFRAME_OPT: TxDMA controller operate on second frame function + \param[out] none + \retval none +*/ +void enet_dma_feature_disable(uint32_t feature) +{ + ENET_DMA_CTL &= ~feature; +} + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE +/*! + \brief get the bit of extended status flag in ENET DMA descriptor + \param[in] desc: the descriptor pointer which users want to get the extended status flag + \param[in] desc_status: the extended status want to get, + only one parameter can be selected which is shown as below + \arg ENET_RDES4_IPPLDT: IP frame payload type + \arg ENET_RDES4_IPHERR: IP frame header error + \arg ENET_RDES4_IPPLDERR: IP frame payload error + \arg ENET_RDES4_IPCKSB: IP frame checksum bypassed + \arg ENET_RDES4_IPF4: IP frame in version 4 + \arg ENET_RDES4_IPF6: IP frame in version 6 + \arg ENET_RDES4_PTPMT: PTP message type + \arg ENET_RDES4_PTPOEF: PTP on ethernet frame + \arg ENET_RDES4_PTPVF: PTP version format + \param[out] none + \retval value of extended status +*/ +uint32_t enet_rx_desc_enhanced_status_get(enet_descriptors_struct *desc, uint32_t desc_status) +{ + uint32_t reval = 0xFFFFFFFFU; + + switch (desc_status){ + case ENET_RDES4_IPPLDT: + reval = GET_RDES4_IPPLDT(desc->extended_status); + break; + case ENET_RDES4_PTPMT: + reval = GET_RDES4_PTPMT(desc->extended_status); + break; + default: + if ((uint32_t)RESET != (desc->extended_status & desc_status)){ + reval = 1U; + }else{ + reval = 0U; + } + } + + return reval; +} + +/*! + \brief configure descriptor to work in enhanced mode + \param[in] none + \param[out] none + \retval none +*/ +void enet_desc_select_enhanced_mode(void) +{ + ENET_DMA_BCTL |= ENET_DMA_BCTL_DFM; +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in enhanced chain mode with ptp function + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum, + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[out] none + \retval none +*/ +void enet_ptp_enhanced_descriptors_chain_init(enet_dmadirection_enum direction) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc, *desc_tab; + uint8_t *buf; + + /* if want to initialize DMA Tx descriptors */ + if (ENET_DMA_TX == direction){ + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* select chain mode, and enable transmit timestamp function */ + desc_status = ENET_TDES0_TCHM | ENET_TDES0_TTSEN; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + }else{ + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* select receive chained mode and set buffer1 size */ + desc_bufsize = ENET_RDES1_RCHM | (uint32_t)ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + } + + /* configuration each descriptor */ + for(num = 0U; num < count; num++){ + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* if is not the last descriptor */ + if(num < (count - 1U)){ + /* configure the next descriptor address */ + desc->buffer2_next_desc_addr = (uint32_t)(desc_tab + num + 1U); + }else{ + /* when it is the last descriptor, the next descriptor address + equals to first descriptor address in descriptor table */ + desc->buffer2_next_desc_addr = (uint32_t)desc_tab; + } + } +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in enhanced ring mode with ptp function + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum, + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[out] none + \retval none +*/ +void enet_ptp_enhanced_descriptors_ring_init(enet_dmadirection_enum direction) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc; + enet_descriptors_struct *desc_tab; + uint8_t *buf; + + /* configure descriptor skip length */ + ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DPSL; + ENET_DMA_BCTL |= DMA_BCTL_DPSL(0); + + /* if want to initialize DMA Tx descriptors */ + if (ENET_DMA_TX == direction){ + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* select ring mode, and enable transmit timestamp function */ + desc_status = ENET_TDES0_TTSEN; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + }else{ + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* set buffer1 size */ + desc_bufsize = ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + } + + /* configure each descriptor */ + for(num=0U; num < count; num++){ + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* when it is the last descriptor */ + if(num == (count - 1U)){ + if (ENET_DMA_TX == direction){ + /* configure transmit end of ring mode */ + desc->status |= ENET_TDES0_TERM; + }else{ + /* configure receive end of ring mode */ + desc->control_buffer_size |= ENET_RDES1_RERM; + } + } + } +} + +/*! + \brief receive a packet data with timestamp values to application buffer, when the DMA is in enhanced mode + \param[in] bufsize: the size of buffer which is the parameter in function + \param[out] buffer: pointer to the application buffer + note -- if the input is NULL, user should copy data in application by himself + \param[out] timestamp: pointer to the table which stores the timestamp high and low + note -- if the input is NULL, timestamp is ignored + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_ptpframe_receive_enhanced_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]) +{ + uint32_t offset = 0U, size = 0U; + uint32_t timeout = 0U; + uint32_t rdes0_tsv_flag; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_DAV)){ + return ERROR; + } + + /* if buffer pointer is null, indicates that users has copied data in application */ + if(NULL != buffer){ + /* if no error occurs, and the frame uses only one descriptor */ + if(((uint32_t)RESET == (dma_current_rxdesc->status & ENET_RDES0_ERRS)) && + ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_LDES)) && + ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_FDES))){ + /* get the frame length except CRC */ + size = GET_RDES0_FRML(dma_current_rxdesc->status) - 4U; + + /* if is a type frame, and CRC is not included in forwarding frame */ + if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (dma_current_rxdesc->status & ENET_RDES0_FRMT))){ + size = size + 4U; + } + + /* to avoid situation that the frame size exceeds the buffer length */ + if(size > bufsize){ + return ERROR; + } + + /* copy data from Rx buffer to application buffer */ + for(offset = 0; offset < size; offset++){ + (*(buffer + offset)) = (*(__IO uint8_t *)((dma_current_rxdesc->buffer1_addr) + offset)); + } + }else{ + return ERROR; + } + } + + /* if timestamp pointer is null, indicates that users don't care timestamp in application */ + if(NULL != timestamp){ + /* wait for ENET_RDES0_TSV flag to be set, the timestamp value is taken and + write to the RDES6 and RDES7 */ + do{ + rdes0_tsv_flag = (dma_current_rxdesc->status & ENET_RDES0_TSV); + timeout++; + }while ((RESET == rdes0_tsv_flag) && (timeout < ENET_DELAY_TO)); + + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout){ + return ERROR; + } + + /* clear the ENET_RDES0_TSV flag */ + dma_current_rxdesc->status &= ~ENET_RDES0_TSV; + /* get the timestamp value of the received frame */ + timestamp[0] = dma_current_rxdesc->timestamp_low; + timestamp[1] = dma_current_rxdesc->timestamp_high; + } + + /* enable reception, descriptor is owned by DMA */ + dma_current_rxdesc->status = ENET_RDES0_DAV; + + /* check Rx buffer unavailable flag status */ + if ((uint32_t)RESET != (ENET_DMA_STAT & ENET_DMA_STAT_RBU)){ + /* Clear RBU flag */ + ENET_DMA_STAT = ENET_DMA_STAT_RBU; + /* resume DMA reception by writing to the RPEN register*/ + ENET_DMA_RPEN = 0; + } + + /* update the current RxDMA descriptor pointer to the next decriptor in RxDMA decriptor table */ + /* chained mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)){ + dma_current_rxdesc = (enet_descriptors_struct*) (dma_current_rxdesc->buffer2_next_desc_addr); + }else{ + /* ring mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)){ + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_rxdesc = (enet_descriptors_struct*) (ENET_DMA_RDTADDR); + }else{ + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_rxdesc = (enet_descriptors_struct*) ((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + GET_DMA_BCTL_DPSL(ENET_DMA_BCTL)); + } + } + + return SUCCESS; +} + +/*! + \brief send data with timestamp values in application buffer as a transmit packet, when the DMA is in enhanced mode + \param[in] buffer: pointer on the application buffer + note -- if the input is NULL, user should copy data in application by himself + \param[in] length: the length of frame data to be transmitted + \param[out] timestamp: pointer to the table which stores the timestamp high and low + note -- if the input is NULL, timestamp is ignored + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_ptpframe_transmit_enhanced_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]) +{ + uint32_t offset = 0; + uint32_t dma_tbu_flag, dma_tu_flag; + uint32_t tdes0_ttmss_flag; + uint32_t timeout = 0; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)){ + return ERROR; + } + + /* only frame length no more than ENET_MAX_FRAME_SIZE is allowed */ + if(length > ENET_MAX_FRAME_SIZE){ + return ERROR; + } + + /* if buffer pointer is null, indicates that users has handled data in application */ + if(NULL != buffer){ + /* copy frame data from application buffer to Tx buffer */ + for(offset = 0; offset < length; offset++){ + (*(__IO uint8_t *)((dma_current_txdesc->buffer1_addr) + offset)) = (*(buffer + offset)); + } + } + /* set the frame length */ + dma_current_txdesc->control_buffer_size = length; + /* set the segment of frame, frame is transmitted in one descriptor */ + dma_current_txdesc->status |= ENET_TDES0_LSG | ENET_TDES0_FSG; + /* enable the DMA transmission */ + dma_current_txdesc->status |= ENET_TDES0_DAV; + + /* check Tx buffer unavailable flag status */ + dma_tbu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TBU); + dma_tu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TU); + + if ((RESET != dma_tbu_flag) || (RESET != dma_tu_flag)){ + /* Clear TBU and TU flag */ + ENET_DMA_STAT = (dma_tbu_flag | dma_tu_flag); + /* resume DMA transmission by writing to the TPEN register*/ + ENET_DMA_TPEN = 0; + } + + /* if timestamp pointer is null, indicates that users don't care timestamp in application */ + if(NULL != timestamp){ + /* wait for ENET_TDES0_TTMSS flag to be set, a timestamp was captured */ + do{ + tdes0_ttmss_flag = (dma_current_txdesc->status & ENET_TDES0_TTMSS); + timeout++; + }while((RESET == tdes0_ttmss_flag) && (timeout < ENET_DELAY_TO)); + + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout){ + return ERROR; + } + + /* clear the ENET_TDES0_TTMSS flag */ + dma_current_txdesc->status &= ~ENET_TDES0_TTMSS; + /* get the timestamp value of the transmit frame */ + timestamp[0] = dma_current_txdesc->timestamp_low; + timestamp[1] = dma_current_txdesc->timestamp_high; + } + + /* update the current TxDMA descriptor pointer to the next decriptor in TxDMA decriptor table*/ + /* chained mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TCHM)){ + dma_current_txdesc = (enet_descriptors_struct*) (dma_current_txdesc->buffer2_next_desc_addr); + }else{ + /* ring mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TERM)){ + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_txdesc = (enet_descriptors_struct*) (ENET_DMA_TDTADDR); + }else{ + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_txdesc = (enet_descriptors_struct*) ((uint32_t)dma_current_txdesc + ETH_DMATXDESC_SIZE + GET_DMA_BCTL_DPSL(ENET_DMA_BCTL)); + } + } + + return SUCCESS; +} + +#else + +/*! + \brief configure descriptor to work in normal mode + \param[in] none + \param[out] none + \retval none +*/ +void enet_desc_select_normal_mode(void) +{ + ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DFM; +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in normal chain mode with PTP function + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum, + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[in] desc_ptptab: pointer to the first descriptor address of PTP Rx descriptor table + \param[out] none + \retval none +*/ +void enet_ptp_normal_descriptors_chain_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc, *desc_tab; + uint8_t *buf; + + /* if want to initialize DMA Tx descriptors */ + if(ENET_DMA_TX == direction){ + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* select chain mode, and enable transmit timestamp function */ + desc_status = ENET_TDES0_TCHM | ENET_TDES0_TTSEN; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + dma_current_ptp_txdesc = desc_ptptab; + }else{ + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* select receive chained mode and set buffer1 size */ + desc_bufsize = ENET_RDES1_RCHM | (uint32_t)ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + dma_current_ptp_rxdesc = desc_ptptab; + } + + /* configure each descriptor */ + for(num = 0U; num < count; num++){ + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* if is not the last descriptor */ + if(num < (count - 1U)){ + /* configure the next descriptor address */ + desc->buffer2_next_desc_addr = (uint32_t)(desc_tab + num + 1U); + }else{ + /* when it is the last descriptor, the next descriptor address + equals to first descriptor address in descriptor table */ + desc->buffer2_next_desc_addr = (uint32_t)desc_tab; + } + /* set desc_ptptab equal to desc_tab */ + (&desc_ptptab[num])->buffer1_addr = desc->buffer1_addr; + (&desc_ptptab[num])->buffer2_next_desc_addr = desc->buffer2_next_desc_addr; + } + /* when it is the last ptp descriptor, preserve the first descriptor + address of desc_ptptab in ptp descriptor status */ + (&desc_ptptab[num-1U])->status = (uint32_t)desc_ptptab; +} + +/*! + \brief initialize the DMA Tx/Rx descriptors's parameters in normal ring mode with PTP function + \param[in] direction: the descriptors which users want to init, refer to enet_dmadirection_enum, + only one parameter can be selected which is shown as below + \arg ENET_DMA_TX: DMA Tx descriptors + \arg ENET_DMA_RX: DMA Rx descriptors + \param[in] desc_ptptab: pointer to the first descriptor address of PTP Rx descriptor table + \param[out] none + \retval none +*/ +void enet_ptp_normal_descriptors_ring_init(enet_dmadirection_enum direction, enet_descriptors_struct *desc_ptptab) +{ + uint32_t num = 0U, count = 0U, maxsize = 0U; + uint32_t desc_status = 0U, desc_bufsize = 0U; + enet_descriptors_struct *desc, *desc_tab; + uint8_t *buf; + + /* configure descriptor skip length */ + ENET_DMA_BCTL &= ~ENET_DMA_BCTL_DPSL; + ENET_DMA_BCTL |= DMA_BCTL_DPSL(0); + + /* if want to initialize DMA Tx descriptors */ + if(ENET_DMA_TX == direction){ + /* save a copy of the DMA Tx descriptors */ + desc_tab = txdesc_tab; + buf = &tx_buff[0][0]; + count = ENET_TXBUF_NUM; + maxsize = ENET_TXBUF_SIZE; + + /* select ring mode, and enable transmit timestamp function */ + desc_status = ENET_TDES0_TTSEN; + + /* configure DMA Tx descriptor table address register */ + ENET_DMA_TDTADDR = (uint32_t)desc_tab; + dma_current_txdesc = desc_tab; + dma_current_ptp_txdesc = desc_ptptab; + }else{ + /* if want to initialize DMA Rx descriptors */ + /* save a copy of the DMA Rx descriptors */ + desc_tab = rxdesc_tab; + buf = &rx_buff[0][0]; + count = ENET_RXBUF_NUM; + maxsize = ENET_RXBUF_SIZE; + + /* enable receiving */ + desc_status = ENET_RDES0_DAV; + /* select receive ring mode and set buffer1 size */ + desc_bufsize = (uint32_t)ENET_RXBUF_SIZE; + + /* configure DMA Rx descriptor table address register */ + ENET_DMA_RDTADDR = (uint32_t)desc_tab; + dma_current_rxdesc = desc_tab; + dma_current_ptp_rxdesc = desc_ptptab; + } + + /* configure each descriptor */ + for(num = 0U; num < count; num++){ + /* get the pointer to the next descriptor of the descriptor table */ + desc = desc_tab + num; + + /* configure descriptors */ + desc->status = desc_status; + desc->control_buffer_size = desc_bufsize; + desc->buffer1_addr = (uint32_t)(&buf[num * maxsize]); + + /* when it is the last descriptor */ + if(num == (count - 1U)){ + if (ENET_DMA_TX == direction){ + /* configure transmit end of ring mode */ + desc->status |= ENET_TDES0_TERM; + }else{ + /* configure receive end of ring mode */ + desc->control_buffer_size |= ENET_RDES1_RERM; + } + } + /* set desc_ptptab equal to desc_tab */ + (&desc_ptptab[num])->buffer1_addr = desc->buffer1_addr; + (&desc_ptptab[num])->buffer2_next_desc_addr = desc->buffer2_next_desc_addr; + } + /* when it is the last ptp descriptor, preserve the first descriptor + address of desc_ptptab in ptp descriptor status */ + (&desc_ptptab[num-1U])->status = (uint32_t)desc_ptptab; +} + +/*! + \brief receive a packet data with timestamp values to application buffer, when the DMA is in normal mode + \param[in] bufsize: the size of buffer which is the parameter in function + \param[out] timestamp: pointer to the table which stores the timestamp high and low + \param[out] buffer: pointer to the application buffer + note -- if the input is NULL, user should copy data in application by himself + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_ptpframe_receive_normal_mode(uint8_t *buffer, uint32_t bufsize, uint32_t timestamp[]) +{ + uint32_t offset = 0U, size = 0U; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_DAV)){ + return ERROR; + } + + /* if buffer pointer is null, indicates that users has copied data in application */ + if(NULL != buffer){ + /* if no error occurs, and the frame uses only one descriptor */ + if(((uint32_t)RESET == (dma_current_rxdesc->status & ENET_RDES0_ERRS)) && + ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_LDES)) && + ((uint32_t)RESET != (dma_current_rxdesc->status & ENET_RDES0_FDES))){ + + /* get the frame length except CRC */ + size = GET_RDES0_FRML(dma_current_rxdesc->status) - 4U; + /* if is a type frame, and CRC is not included in forwarding frame */ + if((RESET != (ENET_MAC_CFG & ENET_MAC_CFG_TFCD)) && (RESET != (dma_current_rxdesc->status & ENET_RDES0_FRMT))){ + size = size + 4U; + } + + /* to avoid situation that the frame size exceeds the buffer length */ + if(size > bufsize){ + return ERROR; + } + + /* copy data from Rx buffer to application buffer */ + for(offset = 0U; offset < size; offset++){ + (*(buffer + offset)) = (*(__IO uint8_t *)(uint32_t)((dma_current_ptp_rxdesc->buffer1_addr) + offset)); + } + + }else{ + return ERROR; + } + } + /* copy timestamp value from Rx descriptor to application array */ + timestamp[0] = dma_current_rxdesc->buffer1_addr; + timestamp[1] = dma_current_rxdesc->buffer2_next_desc_addr; + + dma_current_rxdesc->buffer1_addr = dma_current_ptp_rxdesc ->buffer1_addr ; + dma_current_rxdesc->buffer2_next_desc_addr = dma_current_ptp_rxdesc ->buffer2_next_desc_addr; + + /* enable reception, descriptor is owned by DMA */ + dma_current_rxdesc->status = ENET_RDES0_DAV; + + /* check Rx buffer unavailable flag status */ + if ((uint32_t)RESET != (ENET_DMA_STAT & ENET_DMA_STAT_RBU)){ + /* clear RBU flag */ + ENET_DMA_STAT = ENET_DMA_STAT_RBU; + /* resume DMA reception by writing to the RPEN register*/ + ENET_DMA_RPEN = 0U; + } + + /* update the current RxDMA descriptor pointer to the next decriptor in RxDMA decriptor table */ + /* chained mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RCHM)){ + dma_current_rxdesc = (enet_descriptors_struct*) (dma_current_ptp_rxdesc->buffer2_next_desc_addr); + /* if it is the last ptp descriptor */ + if(0U != dma_current_ptp_rxdesc->status){ + /* pointer back to the first ptp descriptor address in the desc_ptptab list address */ + dma_current_ptp_rxdesc = (enet_descriptors_struct*) (dma_current_ptp_rxdesc->status); + }else{ + /* ponter to the next ptp descriptor */ + dma_current_ptp_rxdesc++; + } + }else{ + /* ring mode */ + if((uint32_t)RESET != (dma_current_rxdesc->control_buffer_size & ENET_RDES1_RERM)){ + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_rxdesc = (enet_descriptors_struct*) (ENET_DMA_RDTADDR); + /* RDES2 and RDES3 will not be covered by buffer address, so do not need to preserve a new table, + use the same table with RxDMA descriptor */ + dma_current_ptp_rxdesc = (enet_descriptors_struct*) (dma_current_ptp_rxdesc->status); + }else{ + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_rxdesc = (enet_descriptors_struct*) (uint32_t)((uint32_t)dma_current_rxdesc + ETH_DMARXDESC_SIZE + GET_DMA_BCTL_DPSL(ENET_DMA_BCTL)); + dma_current_ptp_rxdesc ++; + } + } + + return SUCCESS; +} + +/*! + \brief send data with timestamp values in application buffer as a transmit packet, when the DMA is in normal mode + \param[in] buffer: pointer on the application buffer + note -- if the input is NULL, user should copy data in application by himself + \param[in] length: the length of frame data to be transmitted + \param[out] timestamp: pointer to the table which stores the timestamp high and low + note -- if the input is NULL, timestamp is ignored + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_ptpframe_transmit_normal_mode(uint8_t *buffer, uint32_t length, uint32_t timestamp[]) +{ + uint32_t offset = 0U, timeout = 0U; + uint32_t dma_tbu_flag, dma_tu_flag, tdes0_ttmss_flag; + + /* the descriptor is busy due to own by the DMA */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)){ + return ERROR; + } + + /* only frame length no more than ENET_MAX_FRAME_SIZE is allowed */ + if(length > ENET_MAX_FRAME_SIZE){ + return ERROR; + } + + /* if buffer pointer is null, indicates that users has handled data in application */ + if(NULL != buffer){ + /* copy frame data from application buffer to Tx buffer */ + for(offset = 0U; offset < length; offset++){ + (*(__IO uint8_t *) (uint32_t)((dma_current_ptp_txdesc->buffer1_addr) + offset)) = (*(buffer + offset)); + } + } + /* set the frame length */ + dma_current_txdesc->control_buffer_size = (length & (uint32_t)0x1FFF); + /* set the segment of frame, frame is transmitted in one descriptor */ + dma_current_txdesc->status |= ENET_TDES0_LSG | ENET_TDES0_FSG; + /* enable the DMA transmission */ + dma_current_txdesc->status |= ENET_TDES0_DAV; + + /* check Tx buffer unavailable flag status */ + dma_tbu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TBU); + dma_tu_flag = (ENET_DMA_STAT & ENET_DMA_STAT_TU); + + if((RESET != dma_tbu_flag) || (RESET != dma_tu_flag)){ + /* clear TBU and TU flag */ + ENET_DMA_STAT = (dma_tbu_flag | dma_tu_flag); + /* resume DMA transmission by writing to the TPEN register*/ + ENET_DMA_TPEN = 0U; + } + + /* if timestamp pointer is null, indicates that users don't care timestamp in application */ + if(NULL != timestamp){ + /* wait for ENET_TDES0_TTMSS flag to be set, a timestamp was captured */ + do{ + tdes0_ttmss_flag = (dma_current_txdesc->status & ENET_TDES0_TTMSS); + timeout++; + }while((RESET == tdes0_ttmss_flag) && (timeout < ENET_DELAY_TO)); + + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout){ + return ERROR; + } + + /* clear the ENET_TDES0_TTMSS flag */ + dma_current_txdesc->status &= ~ENET_TDES0_TTMSS; + /* get the timestamp value of the transmit frame */ + timestamp[0] = dma_current_txdesc->buffer1_addr; + timestamp[1] = dma_current_txdesc->buffer2_next_desc_addr; + } + dma_current_txdesc->buffer1_addr = dma_current_ptp_txdesc ->buffer1_addr ; + dma_current_txdesc->buffer2_next_desc_addr = dma_current_ptp_txdesc ->buffer2_next_desc_addr; + + /* update the current TxDMA descriptor pointer to the next decriptor in TxDMA decriptor table */ + /* chained mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TCHM)){ + dma_current_txdesc = (enet_descriptors_struct*) (dma_current_ptp_txdesc->buffer2_next_desc_addr); + /* if it is the last ptp descriptor */ + if(0U != dma_current_ptp_txdesc->status){ + /* pointer back to the first ptp descriptor address in the desc_ptptab list address */ + dma_current_ptp_txdesc = (enet_descriptors_struct*) (dma_current_ptp_txdesc->status); + }else{ + /* ponter to the next ptp descriptor */ + dma_current_ptp_txdesc++; + } + }else{ + /* ring mode */ + if((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_TERM)){ + /* if is the last descriptor in table, the next descriptor is the table header */ + dma_current_txdesc = (enet_descriptors_struct*) (ENET_DMA_TDTADDR); + /* TDES2 and TDES3 will not be covered by buffer address, so do not need to preserve a new table, + use the same table with TxDMA descriptor */ + dma_current_ptp_txdesc = (enet_descriptors_struct*) (dma_current_ptp_txdesc->status); + }else{ + /* the next descriptor is the current address, add the descriptor size, and descriptor skip length */ + dma_current_txdesc = (enet_descriptors_struct*) (uint32_t)((uint32_t)dma_current_txdesc + ETH_DMATXDESC_SIZE + GET_DMA_BCTL_DPSL(ENET_DMA_BCTL)); + dma_current_ptp_txdesc ++; + } + } + return SUCCESS; +} + +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ + +/*! + \brief wakeup frame filter register pointer reset + \param[in] none + \param[out] none + \retval none +*/ +void enet_wum_filter_register_pointer_reset(void) +{ + ENET_MAC_WUM |= ENET_MAC_WUM_WUFFRPR; +} + +/*! + \brief set the remote wakeup frame registers + \param[in] pdata: pointer to buffer data which is written to remote wakeup frame registers (8 words total) + \param[out] none + \retval none +*/ +void enet_wum_filter_config(uint32_t pdata[]) +{ + uint32_t num = 0U; + + /* configure ENET_MAC_RWFF register */ + for(num = 0U; num < ETH_WAKEUP_REGISTER_LENGTH; num++){ + ENET_MAC_RWFF = pdata[num]; + } +} + +/*! + \brief enable wakeup management features + \param[in] feature: one or more parameters can be selected which are shown as below + \arg ENET_WUM_POWER_DOWN: power down mode + \arg ENET_WUM_MAGIC_PACKET_FRAME: enable a wakeup event due to magic packet reception + \arg ENET_WUM_WAKE_UP_FRAME: enable a wakeup event due to wakeup frame reception + \arg ENET_WUM_GLOBAL_UNICAST: any received unicast frame passed filter is considered to be a wakeup frame + \param[out] none + \retval none +*/ +void enet_wum_feature_enable(uint32_t feature) +{ + ENET_MAC_WUM |= feature; +} + +/*! + \brief disable wakeup management features + \param[in] feature: one or more parameters can be selected which are shown as below + \arg ENET_WUM_MAGIC_PACKET_FRAME: enable a wakeup event due to magic packet reception + \arg ENET_WUM_WAKE_UP_FRAME: enable a wakeup event due to wakeup frame reception + \arg ENET_WUM_GLOBAL_UNICAST: any received unicast frame passed filter is considered to be a wakeup frame + \param[out] none + \retval none +*/ +void enet_wum_feature_disable(uint32_t feature) +{ + ENET_MAC_WUM &= (~feature); +} + +/*! + \brief reset the MAC statistics counters + \param[in] none + \param[out] none + \retval none +*/ +void enet_msc_counters_reset(void) +{ + /* reset all counters */ + ENET_MSC_CTL |= ENET_MSC_CTL_CTR; +} + +/*! + \brief enable the MAC statistics counter features + \param[in] feature: one or more parameters can be selected which are shown as below + \arg ENET_MSC_COUNTER_STOP_ROLLOVER: counter stop rollover + \arg ENET_MSC_RESET_ON_READ: reset on read + \arg ENET_MSC_COUNTERS_FREEZE: MSC counter freeze + \param[out] none + \retval none +*/ +void enet_msc_feature_enable(uint32_t feature) +{ + ENET_MSC_CTL |= feature; +} + +/*! + \brief disable the MAC statistics counter features + \param[in] feature: one or more parameters can be selected which are shown as below + \arg ENET_MSC_COUNTER_STOP_ROLLOVER: counter stop rollover + \arg ENET_MSC_RESET_ON_READ: reset on read + \arg ENET_MSC_COUNTERS_FREEZE: MSC counter freeze + \param[out] none + \retval none +*/ +void enet_msc_feature_disable(uint32_t feature) +{ + ENET_MSC_CTL &= (~feature); +} + +/*! + \brief configure MAC statistics counters preset mode + \param[in] mode: MSC counters preset mode, refer to enet_msc_preset_enum, + only one parameter can be selected which is shown as below + \arg ENET_MSC_PRESET_NONE: do not preset MSC counter + \arg ENET_MSC_PRESET_HALF: preset all MSC counters to almost-half(0x7FFF FFF0) value + \arg ENET_MSC_PRESET_FULL: preset all MSC counters to almost-full(0xFFFF FFF0) value + \param[out] none + \retval none +*/ +void enet_msc_counters_preset_config(enet_msc_preset_enum mode) +{ + ENET_MSC_CTL &= ENET_MSC_PRESET_MASK; + ENET_MSC_CTL |= (uint32_t)mode; +} + +/*! + \brief get MAC statistics counter + \param[in] counter: MSC counters which is selected, refer to enet_msc_counter_enum, + only one parameter can be selected which is shown as below + \arg ENET_MSC_TX_SCCNT: MSC transmitted good frames after a single collision counter + \arg ENET_MSC_TX_MSCCNT: MSC transmitted good frames after more than a single collision counter + \arg ENET_MSC_TX_TGFCNT: MSC transmitted good frames counter + \arg ENET_MSC_RX_RFCECNT: MSC received frames with CRC error counter + \arg ENET_MSC_RX_RFAECNT: MSC received frames with alignment error counter + \arg ENET_MSC_RX_RGUFCNT: MSC received good unicast frames counter + \param[out] none + \retval the MSC counter value +*/ +uint32_t enet_msc_counters_get(enet_msc_counter_enum counter) +{ + uint32_t reval; + + reval = REG32((ENET + (uint32_t)counter)); + + return reval; +} + +/*! + \brief change subsecond to nanosecond + \param[in] subsecond: subsecond value + \param[out] none + \retval the nanosecond value +*/ +uint32_t enet_ptp_subsecond_2_nanosecond(uint32_t subsecond) +{ + uint64_t val = subsecond * 1000000000Ull; + val >>= 31; + return (uint32_t)val; +} + +/*! + \brief change nanosecond to subsecond + \param[in] nanosecond: nanosecond value + \param[out] none + \retval the subsecond value +*/ +uint32_t enet_ptp_nanosecond_2_subsecond(uint32_t nanosecond) +{ + uint64_t val = nanosecond * 0x80000000Ull; + val /= 1000000000U; + return (uint32_t)val; +} + +/*! + \brief enable the PTP features + \param[in] feature: the feature of ENET PTP mode + one or more parameters can be selected which are shown as below + \arg ENET_RXTX_TIMESTAMP: timestamp function for transmit and receive frames + \arg ENET_PTP_TIMESTAMP_INT: timestamp interrupt trigger + \arg ENET_ALL_RX_TIMESTAMP: all received frames are taken snapshot + \arg ENET_NONTYPE_FRAME_SNAPSHOT: take snapshot when received non type frame + \arg ENET_IPV6_FRAME_SNAPSHOT: take snapshot for IPv6 frame + \arg ENET_IPV4_FRAME_SNAPSHOT: take snapshot for IPv4 frame + \arg ENET_PTP_FRAME_USE_MACADDRESS_FILTER: use MAC address1-3 to filter the PTP frame + \param[out] none + \retval none +*/ +void enet_ptp_feature_enable(uint32_t feature) +{ + ENET_PTP_TSCTL |= feature; +} + +/*! + \brief disable the PTP features + \param[in] feature: the feature of ENET PTP mode + one or more parameters can be selected which are shown as below + \arg ENET_RXTX_TIMESTAMP: timestamp function for transmit and receive frames + \arg ENET_PTP_TIMESTAMP_INT: timestamp interrupt trigger + \arg ENET_ALL_RX_TIMESTAMP: all received frames are taken snapshot + \arg ENET_NONTYPE_FRAME_SNAPSHOT: take snapshot when received non type frame + \arg ENET_IPV6_FRAME_SNAPSHOT: take snapshot for IPv6 frame + \arg ENET_IPV4_FRAME_SNAPSHOT: take snapshot for IPv4 frame + \arg ENET_PTP_FRAME_USE_MACADDRESS_FILTER: use MAC address1-3 to filter the PTP frame + \param[out] none + \retval none +*/ +void enet_ptp_feature_disable(uint32_t feature) +{ + ENET_PTP_TSCTL &= ~feature; +} + +/*! + \brief configure the PTP timestamp function + \param[in] func: only one parameter can be selected which is shown as below + \arg ENET_CKNT_ORDINARY: type of ordinary clock node type for timestamp + \arg ENET_CKNT_BOUNDARY: type of boundary clock node type for timestamp + \arg ENET_CKNT_END_TO_END: type of end-to-end transparent clock node type for timestamp + \arg ENET_CKNT_PEER_TO_PEER: type of peer-to-peer transparent clock node type for timestamp + \arg ENET_PTP_ADDEND_UPDATE: addend register update + \arg ENET_PTP_SYSTIME_UPDATE: timestamp update + \arg ENET_PTP_SYSTIME_INIT: timestamp initialize + \arg ENET_PTP_FINEMODE: the system timestamp uses the fine method for updating + \arg ENET_PTP_COARSEMODE: the system timestamp uses the coarse method for updating + \arg ENET_SUBSECOND_DIGITAL_ROLLOVER: digital rollover mode + \arg ENET_SUBSECOND_BINARY_ROLLOVER: binary rollover mode + \arg ENET_SNOOPING_PTP_VERSION_2: version 2 + \arg ENET_SNOOPING_PTP_VERSION_1: version 1 + \arg ENET_EVENT_TYPE_MESSAGES_SNAPSHOT: only event type messages are taken snapshot + \arg ENET_ALL_TYPE_MESSAGES_SNAPSHOT: all type messages are taken snapshot except announce, + management and signaling message + \arg ENET_MASTER_NODE_MESSAGE_SNAPSHOT: snapshot is only take for master node message + \arg ENET_SLAVE_NODE_MESSAGE_SNAPSHOT: snapshot is only taken for slave node message + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus enet_ptp_timestamp_function_config(enet_ptp_function_enum func) +{ + uint32_t temp_config = 0U, temp_state = 0U; + uint32_t timeout = 0U; + ErrStatus enet_state = SUCCESS; + + switch(func){ + case ENET_CKNT_ORDINARY: + case ENET_CKNT_BOUNDARY: + case ENET_CKNT_END_TO_END: + case ENET_CKNT_PEER_TO_PEER: + ENET_PTP_TSCTL &= ~ENET_PTP_TSCTL_CKNT; + ENET_PTP_TSCTL |= (uint32_t)func; + break; + case ENET_PTP_ADDEND_UPDATE: + /* this bit must be read as zero before application set it */ + do{ + temp_state = ENET_PTP_TSCTL & ENET_PTP_TSCTL_TMSARU; + timeout++; + }while((RESET != temp_state) && (timeout < ENET_DELAY_TO)); + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout){ + enet_state = ERROR; + }else{ + ENET_PTP_TSCTL |= ENET_PTP_TSCTL_TMSARU; + } + break; + case ENET_PTP_SYSTIME_UPDATE: + /* both the TMSSTU and TMSSTI bits must be read as zero before application set this bit */ + do{ + temp_state = ENET_PTP_TSCTL & (ENET_PTP_TSCTL_TMSSTU | ENET_PTP_TSCTL_TMSSTI); + timeout++; + }while((RESET != temp_state) && (timeout < ENET_DELAY_TO)); + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout){ + enet_state = ERROR; + }else{ + ENET_PTP_TSCTL |= ENET_PTP_TSCTL_TMSSTU; + } + break; + case ENET_PTP_SYSTIME_INIT: + /* this bit must be read as zero before application set it */ + do{ + temp_state = ENET_PTP_TSCTL & ENET_PTP_TSCTL_TMSSTI; + timeout++; + }while((RESET != temp_state) && (timeout < ENET_DELAY_TO)); + /* return ERROR due to timeout */ + if(ENET_DELAY_TO == timeout){ + enet_state = ERROR; + }else{ + ENET_PTP_TSCTL |= ENET_PTP_TSCTL_TMSSTI; + } + break; + default: + temp_config = (uint32_t)func & (~BIT(31)); + if(RESET != ((uint32_t)func & BIT(31))){ + ENET_PTP_TSCTL |= temp_config; + }else{ + ENET_PTP_TSCTL &= ~temp_config; + } + break; + } + + return enet_state; +} + +/*! + \brief configure system time subsecond increment value + \param[in] subsecond: the value will be added to the subsecond value of system time, + this value must be between 0 and 0xFF + \param[out] none + \retval none +*/ +void enet_ptp_subsecond_increment_config(uint32_t subsecond) +{ + ENET_PTP_SSINC = PTP_SSINC_STMSSI(subsecond); +} + +/*! + \brief adjusting the clock frequency only in fine update mode + \param[in] add: the value will be added to the accumulator register to achieve time synchronization + \param[out] none + \retval none +*/ +void enet_ptp_timestamp_addend_config(uint32_t add) +{ + ENET_PTP_TSADDEND = add; +} + +/*! + \brief initialize or add/subtract to second of the system time + \param[in] sign: timestamp update positive or negative sign, + only one parameter can be selected which is shown as below + \arg ENET_PTP_ADD_TO_TIME: timestamp update value is added to system time + \arg ENET_PTP_SUBSTRACT_FROM_TIME: timestamp update value is subtracted from system time + \param[in] second: initializing or adding/subtracting to second of the system time + \param[in] subsecond: the current subsecond of the system time + with 0.46 ns accuracy if required accuracy is 20 ns + \param[out] none + \retval none +*/ +void enet_ptp_timestamp_update_config(uint32_t sign, uint32_t second, uint32_t subsecond) +{ + ENET_PTP_TSUH = second; + ENET_PTP_TSUL = sign | PTP_TSUL_TMSUSS(subsecond); +} + +/*! + \brief configure the expected target time + \param[in] second: the expected target second time + \param[in] nanosecond: the expected target nanosecond time (signed) + \param[out] none + \retval none +*/ +void enet_ptp_expected_time_config(uint32_t second, uint32_t nanosecond) +{ + ENET_PTP_ETH = second; + ENET_PTP_ETL = nanosecond; +} + +/*! + \brief get the current system time + \param[in] none + \param[out] systime_struct: pointer to a enet_ptp_systime_struct structure which contains + parameters of PTP system time + members of the structure and the member values are shown as below: + second: 0x0 - 0xFFFF FFFF + nanosecond: 0x0 - 0x7FFF FFFF * 10^9 / 2^31 + sign: ENET_PTP_TIME_POSITIVE, ENET_PTP_TIME_NEGATIVE + \retval none +*/ +void enet_ptp_system_time_get(enet_ptp_systime_struct *systime_struct) +{ + uint32_t temp_sec = 0U, temp_subs = 0U; + + /* get the value of sysytem time registers */ + temp_sec = (uint32_t)ENET_PTP_TSH; + temp_subs = (uint32_t)ENET_PTP_TSL; + + /* get sysytem time and construct the enet_ptp_systime_struct structure */ + systime_struct->second = temp_sec; + systime_struct->nanosecond = GET_PTP_TSL_STMSS(temp_subs); + systime_struct->nanosecond = enet_ptp_subsecond_2_nanosecond(systime_struct->nanosecond); + systime_struct->sign = GET_PTP_TSL_STS(temp_subs); +} + +/*! + \brief configure the PPS output frequency + \param[in] freq: PPS output frequency, + only one parameter can be selected which is shown as below + \arg ENET_PPSOFC_1HZ: PPS output 1Hz frequency + \arg ENET_PPSOFC_2HZ: PPS output 2Hz frequency + \arg ENET_PPSOFC_4HZ: PPS output 4Hz frequency + \arg ENET_PPSOFC_8HZ: PPS output 8Hz frequency + \arg ENET_PPSOFC_16HZ: PPS output 16Hz frequency + \arg ENET_PPSOFC_32HZ: PPS output 32Hz frequency + \arg ENET_PPSOFC_64HZ: PPS output 64Hz frequency + \arg ENET_PPSOFC_128HZ: PPS output 128Hz frequency + \arg ENET_PPSOFC_256HZ: PPS output 256Hz frequency + \arg ENET_PPSOFC_512HZ: PPS output 512Hz frequency + \arg ENET_PPSOFC_1024HZ: PPS output 1024Hz frequency + \arg ENET_PPSOFC_2048HZ: PPS output 2048Hz frequency + \arg ENET_PPSOFC_4096HZ: PPS output 4096Hz frequency + \arg ENET_PPSOFC_8192HZ: PPS output 8192Hz frequency + \arg ENET_PPSOFC_16384HZ: PPS output 16384Hz frequency + \arg ENET_PPSOFC_32768HZ: PPS output 32768Hz frequency + \param[out] none + \retval none +*/ +void enet_ptp_pps_output_frequency_config(uint32_t freq) +{ + ENET_PTP_PPSCTL = freq; +} + +/*! + \brief configure and start PTP timestamp counter + \param[in] updatemethod: method for updating + \arg ENET_PTP_FINEMODE: fine correction method + \arg ENET_PTP_COARSEMODE: coarse correction method + \param[in] init_sec: second value for initializing system time + \param[in] init_subsec: subsecond value for initializing system time + \param[in] carry_cfg: the value to be added to the accumulator register (in fine method is used) + \param[in] accuracy_cfg: the value to be added to the subsecond value of system time + \param[out] none + \retval none +*/ +void enet_ptp_start(int32_t updatemethod, uint32_t init_sec, uint32_t init_subsec, uint32_t carry_cfg, uint32_t accuracy_cfg) +{ + /* mask the timestamp trigger interrupt */ + enet_interrupt_disable(ENET_MAC_INT_TMSTIM); + + /* enable timestamp */ + enet_ptp_feature_enable(ENET_ALL_RX_TIMESTAMP | ENET_RXTX_TIMESTAMP); + + /* configure system time subsecond increment based on the PTP clock frequency */ + enet_ptp_subsecond_increment_config(accuracy_cfg); + + if(ENET_PTP_FINEMODE == updatemethod){ + /* fine correction method: configure the timestamp addend, then update */ + enet_ptp_timestamp_addend_config(carry_cfg); + enet_ptp_timestamp_function_config(ENET_PTP_ADDEND_UPDATE); + /* wait until update is completed */ + while(SET == enet_ptp_flag_get((uint32_t)ENET_PTP_ADDEND_UPDATE)){ + } + } + + /* choose the fine correction method */ + enet_ptp_timestamp_function_config((enet_ptp_function_enum)updatemethod); + + /* initialize the system time */ + enet_ptp_timestamp_update_config(ENET_PTP_ADD_TO_TIME, init_sec, init_subsec); + enet_ptp_timestamp_function_config(ENET_PTP_SYSTIME_INIT); + +#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE + enet_desc_select_enhanced_mode(); +#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */ +} + +/*! + \brief adjust frequency in fine method by configure addend register + \param[in] carry_cfg: the value to be added to the accumulator register + \param[out] none + \retval none +*/ +void enet_ptp_finecorrection_adjfreq(int32_t carry_cfg) +{ + /* re-configure the timestamp addend, then update */ + enet_ptp_timestamp_addend_config((uint32_t)carry_cfg); + enet_ptp_timestamp_function_config(ENET_PTP_ADDEND_UPDATE); +} + +/*! + \brief update system time in coarse method + \param[in] systime_struct: : pointer to a enet_ptp_systime_struct structure which contains + parameters of PTP system time + members of the structure and the member values are shown as below: + second: 0x0 - 0xFFFF FFFF + nanosecond: 0x0 - 0x7FFF FFFF * 10^9 / 2^31 + sign: ENET_PTP_TIME_POSITIVE, ENET_PTP_TIME_NEGATIVE + \param[out] none + \retval none +*/ +void enet_ptp_coarsecorrection_systime_update(enet_ptp_systime_struct *systime_struct) +{ + uint32_t subsecond_val; + uint32_t carry_cfg; + + subsecond_val = enet_ptp_nanosecond_2_subsecond(systime_struct->nanosecond); + + /* save the carry_cfg value */ + carry_cfg = ENET_PTP_TSADDEND_TMSA; + + /* update the system time */ + enet_ptp_timestamp_update_config(systime_struct->sign, systime_struct->second, subsecond_val); + enet_ptp_timestamp_function_config(ENET_PTP_SYSTIME_UPDATE); + + /* wait until the update is completed */ + while(SET == enet_ptp_flag_get((uint32_t)ENET_PTP_SYSTIME_UPDATE)){ + } + + /* write back the carry_cfg value, then update */ + enet_ptp_timestamp_addend_config(carry_cfg); + enet_ptp_timestamp_function_config(ENET_PTP_ADDEND_UPDATE); +} + +/*! + \brief set system time in fine method + \param[in] systime_struct: : pointer to a enet_ptp_systime_struct structure which contains + parameters of PTP system time + members of the structure and the member values are shown as below: + second: 0x0 - 0xFFFF FFFF + nanosecond: 0x0 - 0x7FFF FFFF * 10^9 / 2^31 + sign: ENET_PTP_TIME_POSITIVE, ENET_PTP_TIME_NEGATIVE + \param[out] none + \retval none +*/ +void enet_ptp_finecorrection_settime(enet_ptp_systime_struct * systime_struct) +{ + uint32_t subsecond_val; + + subsecond_val = enet_ptp_nanosecond_2_subsecond(systime_struct->nanosecond); + + /* initialize the system time */ + enet_ptp_timestamp_update_config(systime_struct->sign, systime_struct->second, subsecond_val); + enet_ptp_timestamp_function_config(ENET_PTP_SYSTIME_INIT); + + /* wait until the system time initialzation finished */ + while(SET == enet_ptp_flag_get((uint32_t)ENET_PTP_SYSTIME_INIT)){ + } +} + +/*! + \brief get the ptp flag status + \param[in] flag: ptp flag status to be checked + \arg ENET_PTP_ADDEND_UPDATE: addend register update + \arg ENET_PTP_SYSTIME_UPDATE: timestamp update + \arg ENET_PTP_SYSTIME_INIT: timestamp initialize + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus enet_ptp_flag_get(uint32_t flag) +{ + FlagStatus bitstatus = RESET; + + if ((uint32_t)RESET != (ENET_PTP_TSCTL & flag)){ + bitstatus = SET; + } + + return bitstatus; +} + +/*! + \brief reset the ENET initpara struct, call it before using enet_initpara_config() + \param[in] none + \param[out] none + \retval none +*/ +void enet_initpara_reset(void) +{ + enet_initpara.option_enable = 0U; + enet_initpara.forward_frame = 0U; + enet_initpara.dmabus_mode = 0U; + enet_initpara.dma_maxburst = 0U; + enet_initpara.dma_arbitration = 0U; + enet_initpara.store_forward_mode = 0U; + enet_initpara.dma_function = 0U; + enet_initpara.vlan_config = 0U; + enet_initpara.flow_control = 0U; + enet_initpara.hashtable_high = 0U; + enet_initpara.hashtable_low = 0U; + enet_initpara.framesfilter_mode = 0U; + enet_initpara.halfduplex_param = 0U; + enet_initpara.timer_config = 0U; + enet_initpara.interframegap = 0U; +} + +/*! + \brief initialize ENET peripheral with generally concerned parameters, call it by enet_init() + \param[in] none + \param[out] none + \retval none +*/ +static void enet_default_init(void) +{ + uint32_t reg_value = 0U; + + /* MAC */ + /* configure ENET_MAC_CFG register */ + reg_value = ENET_MAC_CFG; + reg_value &= MAC_CFG_MASK; + reg_value |= ENET_WATCHDOG_ENABLE | ENET_JABBER_ENABLE | ENET_INTERFRAMEGAP_96BIT \ + | ENET_SPEEDMODE_10M |ENET_MODE_HALFDUPLEX | ENET_LOOPBACKMODE_DISABLE \ + | ENET_CARRIERSENSE_ENABLE | ENET_RECEIVEOWN_ENABLE \ + | ENET_RETRYTRANSMISSION_ENABLE | ENET_BACKOFFLIMIT_10 \ + | ENET_DEFERRALCHECK_DISABLE \ + | ENET_TYPEFRAME_CRC_DROP_DISABLE \ + | ENET_AUTO_PADCRC_DROP_DISABLE \ + | ENET_CHECKSUMOFFLOAD_DISABLE; + ENET_MAC_CFG = reg_value; + + /* configure ENET_MAC_FRMF register */ + ENET_MAC_FRMF = ENET_SRC_FILTER_DISABLE |ENET_DEST_FILTER_INVERSE_DISABLE \ + |ENET_MULTICAST_FILTER_PERFECT |ENET_UNICAST_FILTER_PERFECT \ + |ENET_PCFRM_PREVENT_ALL |ENET_BROADCASTFRAMES_ENABLE \ + |ENET_PROMISCUOUS_DISABLE |ENET_RX_FILTER_ENABLE; + + /* configure ENET_MAC_HLH, ENET_MAC_HLL register */ + ENET_MAC_HLH = 0x0U; + + ENET_MAC_HLL = 0x0U; + + /* configure ENET_MAC_FCTL, ENET_MAC_FCTH register */ + reg_value = ENET_MAC_FCTL; + reg_value &= MAC_FCTL_MASK; + reg_value |= MAC_FCTL_PTM(0) |ENET_ZERO_QUANTA_PAUSE_DISABLE \ + |ENET_PAUSETIME_MINUS4 |ENET_UNIQUE_PAUSEDETECT \ + |ENET_RX_FLOWCONTROL_DISABLE |ENET_TX_FLOWCONTROL_DISABLE; + ENET_MAC_FCTL = reg_value; + + /* configure ENET_MAC_VLT register */ + ENET_MAC_VLT = ENET_VLANTAGCOMPARISON_16BIT |MAC_VLT_VLTI(0); + + /* DMA */ + /* configure ENET_DMA_CTL register */ + reg_value = ENET_DMA_CTL; + reg_value &= DMA_CTL_MASK; + reg_value |= ENET_TCPIP_CKSUMERROR_DROP |ENET_RX_MODE_STOREFORWARD \ + |ENET_FLUSH_RXFRAME_ENABLE |ENET_TX_MODE_STOREFORWARD \ + |ENET_TX_THRESHOLD_64BYTES |ENET_RX_THRESHOLD_64BYTES \ + |ENET_SECONDFRAME_OPT_DISABLE; + ENET_DMA_CTL = reg_value; + + /* configure ENET_DMA_BCTL register */ + reg_value = ENET_DMA_BCTL; + reg_value &= DMA_BCTL_MASK; + reg_value = ENET_ADDRESS_ALIGN_ENABLE |ENET_ARBITRATION_RXTX_2_1 \ + |ENET_RXDP_32BEAT |ENET_PGBL_32BEAT |ENET_RXTX_DIFFERENT_PGBL \ + |ENET_FIXED_BURST_ENABLE |ENET_MIXED_BURST_DISABLE \ + |ENET_NORMAL_DESCRIPTOR; + ENET_DMA_BCTL = reg_value; +} + +#ifndef USE_DELAY +/*! + \brief insert a delay time + \param[in] ncount: specifies the delay time length + \param[out] none + \param[out] none +*/ +static void enet_delay(uint32_t ncount) +{ + __IO uint32_t delay_time = 0U; + + for(delay_time = ncount; delay_time != 0U; delay_time--){ + } +} +#endif /* USE_DELAY */ + +#endif /* GD32F30X_CL */ diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_exmc.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_exmc.c new file mode 100644 index 0000000..769b99f --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_exmc.c @@ -0,0 +1,677 @@ +/*! + \file gd32f30x_exmc.c + \brief EXMC driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_exmc.h" + +/* EXMC bank0 register reset value */ +#define BANK0_SNCTL_REGION0_RESET ((uint32_t)0x000030DBU) +#define BANK0_SNCTL_REGION1_2_3_RESET ((uint32_t)0x000030D2U) +#define BANK0_SNTCFG_RESET ((uint32_t)0x0FFFFFFFU) +#define BANK0_SNWTCFG_RESET ((uint32_t)0x0FFFFFFFU) + +/* EXMC bank1/2 register reset mask */ +#define BANK1_2_NPCTL_RESET ((uint32_t)0x00000018U) +#define BANK1_2_NPINTEN_RESET ((uint32_t)0x00000042U) +#define BANK1_2_NPCTCFG_RESET ((uint32_t)0xFCFCFCFCU) +#define BANK1_2_NPATCFG_RESET ((uint32_t)0xFCFCFCFCU) + +/* EXMC bank3 register reset mask */ +#define BANK3_NPCTL_RESET ((uint32_t)0x00000018U) +#define BANK3_NPINTEN_RESET ((uint32_t)0x00000043U) +#define BANK3_NPCTCFG_RESET ((uint32_t)0xFCFCFCFCU) +#define BANK3_NPATCFG_RESET ((uint32_t)0xFCFCFCFCU) +#define BANK3_PIOTCFG3_RESET ((uint32_t)0xFCFCFCFCU) + +/* EXMC register bit offset */ +#define SNCTL_NRMUX_OFFSET ((uint32_t)1U) +#define SNCTL_SBRSTEN_OFFSET ((uint32_t)8U) +#define SNCTL_WRAPEN_OFFSET ((uint32_t)10U) +#define SNCTL_WREN_OFFSET ((uint32_t)12U) +#define SNCTL_NRWTEN_OFFSET ((uint32_t)13U) +#define SNCTL_EXMODEN_OFFSET ((uint32_t)14U) +#define SNCTL_ASYNCWAIT_OFFSET ((uint32_t)15U) + +#define SNTCFG_AHLD_OFFSET ((uint32_t)4U) +#define SNTCFG_DSET_OFFSET ((uint32_t)8U) +#define SNTCFG_BUSLAT_OFFSET ((uint32_t)16U) + +#define SNWTCFG_WAHLD_OFFSET ((uint32_t)4U) +#define SNWTCFG_WDSET_OFFSET ((uint32_t)8U) +#define SNWTCFG_WBUSLAT_OFFSET ((uint32_t)16U) + +#define NPCTL_NDWTEN_OFFSET ((uint32_t)1U) +#define NPCTL_ECCEN_OFFSET ((uint32_t)6U) + +#define NPCTCFG_COMWAIT_OFFSET ((uint32_t)8U) +#define NPCTCFG_COMHLD_OFFSET ((uint32_t)16U) +#define NPCTCFG_COMHIZ_OFFSET ((uint32_t)24U) + +#define NPATCFG_ATTWAIT_OFFSET ((uint32_t)8U) +#define NPATCFG_ATTHLD_OFFSET ((uint32_t)16U) +#define NPATCFG_ATTHIZ_OFFSET ((uint32_t)24U) + +#define PIOTCFG_IOWAIT_OFFSET ((uint32_t)8U) +#define PIOTCFG_IOHLD_OFFSET ((uint32_t)16U) +#define PIOTCFG_IOHIZ_OFFSET ((uint32_t)24U) + +#define INTEN_INTS_OFFSET ((uint32_t)3U) + +/*! + \brief deinitialize EXMC NOR/SRAM region + \param[in] exmc_norsram_region: select the region of bank0 + only one parameter can be selected which is shown as below: + \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) + \param[out] none + \retval none +*/ +void exmc_norsram_deinit(uint32_t exmc_norsram_region) +{ + /* reset the registers */ + if(EXMC_BANK0_NORSRAM_REGION0 == exmc_norsram_region){ + EXMC_SNCTL(exmc_norsram_region) = BANK0_SNCTL_REGION0_RESET; + }else{ + EXMC_SNCTL(exmc_norsram_region) = BANK0_SNCTL_REGION1_2_3_RESET; + } + EXMC_SNTCFG(exmc_norsram_region) = BANK0_SNTCFG_RESET; + EXMC_SNWTCFG(exmc_norsram_region) = BANK0_SNWTCFG_RESET; +} + +/*! + \brief initialize exmc_norsram_parameter_struct with the default values + \param[in] none + \param[out] exmc_norsram_init_struct: the initialized struct exmc_norsram_parameter_struct pointer + \retval none +*/ +void exmc_norsram_struct_para_init(exmc_norsram_parameter_struct* exmc_norsram_init_struct) +{ + /* configure the structure with default values */ + exmc_norsram_init_struct->norsram_region = EXMC_BANK0_NORSRAM_REGION0; + exmc_norsram_init_struct->address_data_mux = ENABLE; + exmc_norsram_init_struct->memory_type = EXMC_MEMORY_TYPE_SRAM; + exmc_norsram_init_struct->databus_width = EXMC_NOR_DATABUS_WIDTH_8B; + exmc_norsram_init_struct->burst_mode = DISABLE; + exmc_norsram_init_struct->nwait_polarity = EXMC_NWAIT_POLARITY_LOW; + exmc_norsram_init_struct->wrap_burst_mode = DISABLE; + exmc_norsram_init_struct->nwait_config = EXMC_NWAIT_CONFIG_BEFORE; + exmc_norsram_init_struct->memory_write = ENABLE; + exmc_norsram_init_struct->nwait_signal = ENABLE; + exmc_norsram_init_struct->extended_mode = DISABLE; + exmc_norsram_init_struct->asyn_wait = DISABLE; + exmc_norsram_init_struct->write_mode = EXMC_ASYN_WRITE; + + /* read/write timing configure */ + exmc_norsram_init_struct->read_write_timing->asyn_address_setuptime = 0xFU; + exmc_norsram_init_struct->read_write_timing->asyn_address_holdtime = 0xFU; + exmc_norsram_init_struct->read_write_timing->asyn_data_setuptime = 0xFFU; + exmc_norsram_init_struct->read_write_timing->bus_latency = 0xFU; + exmc_norsram_init_struct->read_write_timing->syn_clk_division = EXMC_SYN_CLOCK_RATIO_16_CLK; + exmc_norsram_init_struct->read_write_timing->syn_data_latency = EXMC_DATALAT_17_CLK; + exmc_norsram_init_struct->read_write_timing->asyn_access_mode = EXMC_ACCESS_MODE_A; + + /* write timing configure, when extended mode is used */ + exmc_norsram_init_struct->write_timing->asyn_address_setuptime = 0xFU; + exmc_norsram_init_struct->write_timing->asyn_address_holdtime = 0xFU; + exmc_norsram_init_struct->write_timing->asyn_data_setuptime = 0xFFU; + exmc_norsram_init_struct->write_timing->bus_latency = 0xFU; + exmc_norsram_init_struct->write_timing->asyn_access_mode = EXMC_ACCESS_MODE_A; +} + +/*! + \brief initialize EXMC NOR/SRAM region + \param[in] exmc_norsram_parameter_struct: configure the EXMC NOR/SRAM parameter + norsram_region: EXMC_BANK0_NORSRAM_REGIONx,x=0..3 + write_mode: EXMC_ASYN_WRITE,EXMC_SYN_WRITE + extended_mode: ENABLE or DISABLE + asyn_wait: ENABLE or DISABLE + nwait_signal: ENABLE or DISABLE + memory_write: ENABLE or DISABLE + nwait_config: EXMC_NWAIT_CONFIG_BEFORE,EXMC_NWAIT_CONFIG_DURING + wrap_burst_mode: ENABLE or DISABLE + nwait_polarity: EXMC_NWAIT_POLARITY_LOW,EXMC_NWAIT_POLARITY_HIGH + burst_mode: ENABLE or DISABLE + databus_width: EXMC_NOR_DATABUS_WIDTH_8B,EXMC_NOR_DATABUS_WIDTH_16B + memory_type: EXMC_MEMORY_TYPE_SRAM,EXMC_MEMORY_TYPE_PSRAM,EXMC_MEMORY_TYPE_NOR + address_data_mux: ENABLE or DISABLE + read_write_timing: struct exmc_norsram_timing_parameter_struct set the time + write_timing: struct exmc_norsram_timing_parameter_struct set the time + \param[out] none + \retval none +*/ +void exmc_norsram_init(exmc_norsram_parameter_struct* exmc_norsram_init_struct) +{ + uint32_t snctl = 0x00000000U,sntcfg = 0x00000000U,snwtcfg = 0x00000000U; + + /* get the register value */ + snctl = EXMC_SNCTL(exmc_norsram_init_struct->norsram_region); + + /* clear relative bits */ + snctl &= ((uint32_t)~(EXMC_SNCTL_NRMUX | EXMC_SNCTL_NRTP | EXMC_SNCTL_NRW | EXMC_SNCTL_SBRSTEN | + EXMC_SNCTL_NREN | EXMC_SNCTL_NRWTPOL | EXMC_SNCTL_WRAPEN | EXMC_SNCTL_NRWTCFG | + EXMC_SNCTL_WREN | EXMC_SNCTL_NRWTEN | EXMC_SNCTL_EXMODEN | EXMC_SNCTL_ASYNCWAIT | + EXMC_SNCTL_SYNCWR )); + + snctl |= (uint32_t)(exmc_norsram_init_struct->address_data_mux << SNCTL_NRMUX_OFFSET) | + exmc_norsram_init_struct->memory_type | + exmc_norsram_init_struct->databus_width | + (exmc_norsram_init_struct->burst_mode << SNCTL_SBRSTEN_OFFSET) | + exmc_norsram_init_struct->nwait_polarity | + (exmc_norsram_init_struct->wrap_burst_mode << SNCTL_WRAPEN_OFFSET) | + exmc_norsram_init_struct->nwait_config | + (exmc_norsram_init_struct->memory_write << SNCTL_WREN_OFFSET) | + (exmc_norsram_init_struct->nwait_signal << SNCTL_NRWTEN_OFFSET) | + (exmc_norsram_init_struct->extended_mode << SNCTL_EXMODEN_OFFSET) | + (exmc_norsram_init_struct->asyn_wait << SNCTL_ASYNCWAIT_OFFSET) | + exmc_norsram_init_struct->write_mode; + + sntcfg = (uint32_t)((exmc_norsram_init_struct->read_write_timing->asyn_address_setuptime - 1U ) & EXMC_SNTCFG_ASET )| + (((exmc_norsram_init_struct->read_write_timing->asyn_address_holdtime - 1U ) << SNTCFG_AHLD_OFFSET ) & EXMC_SNTCFG_AHLD ) | + (((exmc_norsram_init_struct->read_write_timing->asyn_data_setuptime - 1U ) << SNTCFG_DSET_OFFSET ) & EXMC_SNTCFG_DSET ) | + (((exmc_norsram_init_struct->read_write_timing->bus_latency - 1U ) << SNTCFG_BUSLAT_OFFSET ) & EXMC_SNTCFG_BUSLAT )| + exmc_norsram_init_struct->read_write_timing->syn_clk_division | + exmc_norsram_init_struct->read_write_timing->syn_data_latency | + exmc_norsram_init_struct->read_write_timing->asyn_access_mode; + + /* nor flash access enable */ + if(EXMC_MEMORY_TYPE_NOR == exmc_norsram_init_struct->memory_type){ + snctl |= (uint32_t)EXMC_SNCTL_NREN; + } + + /* extended mode configure */ + if(ENABLE == exmc_norsram_init_struct->extended_mode){ + snwtcfg = (uint32_t)((exmc_norsram_init_struct->write_timing->asyn_address_setuptime - 1U) & EXMC_SNWTCFG_WASET ) | + (((exmc_norsram_init_struct->write_timing->asyn_address_holdtime -1U ) << SNWTCFG_WAHLD_OFFSET ) & EXMC_SNWTCFG_WAHLD )| + (((exmc_norsram_init_struct->write_timing->asyn_data_setuptime -1U ) << SNWTCFG_WDSET_OFFSET ) & EXMC_SNWTCFG_WDSET )| + (((exmc_norsram_init_struct->write_timing->bus_latency - 1U ) << SNWTCFG_WBUSLAT_OFFSET ) & EXMC_SNWTCFG_WBUSLAT ) | + exmc_norsram_init_struct->write_timing->asyn_access_mode; + }else{ + snwtcfg = BANK0_SNWTCFG_RESET; + } + + /* configure the registers */ + EXMC_SNCTL(exmc_norsram_init_struct->norsram_region) = snctl; + EXMC_SNTCFG(exmc_norsram_init_struct->norsram_region) = sntcfg; + EXMC_SNWTCFG(exmc_norsram_init_struct->norsram_region) = snwtcfg; +} + +/*! + \brief enable EXMC NOR/PSRAM bank region + \param[in] exmc_norsram_region: specifie the region of NOR/PSRAM bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) + \param[out] none + \retval none +*/ +void exmc_norsram_enable(uint32_t exmc_norsram_region) +{ + EXMC_SNCTL(exmc_norsram_region) |= (uint32_t)EXMC_SNCTL_NRBKEN; +} + +/*! + \brief disable EXMC NOR/PSRAM bank region + \param[in] exmc_norsram_region: specifie the region of NOR/PSRAM Bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) + \param[out] none + \retval none +*/ +void exmc_norsram_disable(uint32_t exmc_norsram_region) +{ + EXMC_SNCTL(exmc_norsram_region) &= ~(uint32_t)EXMC_SNCTL_NRBKEN; +} + +/*! + \brief deinitialize EXMC NAND bank + \param[in] exmc_nand_bank: select the bank of NAND + only one parameter can be selected which is shown as below: + \arg EXMC_BANKx_NAND(x=1..2) + \param[out] none + \retval none +*/ +void exmc_nand_deinit(uint32_t exmc_nand_bank) +{ + /* EXMC_BANK1_NAND or EXMC_BANK2_NAND */ + EXMC_NPCTL(exmc_nand_bank) = BANK1_2_NPCTL_RESET; + EXMC_NPINTEN(exmc_nand_bank) = BANK1_2_NPINTEN_RESET; + EXMC_NPCTCFG(exmc_nand_bank) = BANK1_2_NPCTCFG_RESET; + EXMC_NPATCFG(exmc_nand_bank) = BANK1_2_NPATCFG_RESET; +} + +/*! + \brief initialize exmc_norsram_parameter_struct with the default values + \param[in] none + \param[out] the initialized struct exmc_norsram_parameter_struct pointer + \retval none +*/ +void exmc_nand_struct_para_init(exmc_nand_parameter_struct* exmc_nand_init_struct) +{ + /* configure the structure with default values */ + exmc_nand_init_struct->nand_bank = EXMC_BANK1_NAND; + exmc_nand_init_struct->wait_feature = DISABLE; + exmc_nand_init_struct->databus_width = EXMC_NAND_DATABUS_WIDTH_8B; + exmc_nand_init_struct->ecc_logic = DISABLE; + exmc_nand_init_struct->ecc_size = EXMC_ECC_SIZE_256BYTES; + exmc_nand_init_struct->ctr_latency = 0x0U; + exmc_nand_init_struct->atr_latency = 0x0U; + exmc_nand_init_struct->common_space_timing->setuptime = 0xFCU; + exmc_nand_init_struct->common_space_timing->waittime = 0xFCU; + exmc_nand_init_struct->common_space_timing->holdtime = 0xFCU; + exmc_nand_init_struct->common_space_timing->databus_hiztime = 0xFCU; + exmc_nand_init_struct->attribute_space_timing->setuptime = 0xFCU; + exmc_nand_init_struct->attribute_space_timing->waittime = 0xFCU; + exmc_nand_init_struct->attribute_space_timing->holdtime = 0xFCU; + exmc_nand_init_struct->attribute_space_timing->databus_hiztime = 0xFCU; +} + +/*! + \brief initialize EXMC NAND bank + \param[in] exmc_nand_parameter_struct: configure the EXMC NAND parameter + nand_bank: EXMC_BANK1_NAND,EXMC_BANK2_NAND + ecc_size: EXMC_ECC_SIZE_xBYTES,x=256,512,1024,2048,4096 + atr_latency: EXMC_ALE_RE_DELAY_x_HCLK,x=1..16 + ctr_latency: EXMC_CLE_RE_DELAY_x_HCLK,x=1..16 + ecc_logic: ENABLE or DISABLE + databus_width: EXMC_NAND_DATABUS_WIDTH_8B,EXMC_NAND_DATABUS_WIDTH_16B + wait_feature: ENABLE or DISABLE + common_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time + attribute_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time + \param[out] none + \retval none +*/ +void exmc_nand_init(exmc_nand_parameter_struct* exmc_nand_init_struct) +{ + uint32_t npctl = 0x00000000U, npctcfg = 0x00000000U, npatcfg = 0x00000000U; + + npctl = (uint32_t)(exmc_nand_init_struct->wait_feature << NPCTL_NDWTEN_OFFSET)| + EXMC_NPCTL_NDTP | + exmc_nand_init_struct->databus_width | + (exmc_nand_init_struct->ecc_logic << NPCTL_ECCEN_OFFSET)| + exmc_nand_init_struct->ecc_size | + exmc_nand_init_struct->ctr_latency | + exmc_nand_init_struct->atr_latency; + + npctcfg = (uint32_t)((exmc_nand_init_struct->common_space_timing->setuptime - 1U) & EXMC_NPCTCFG_COMSET ) | + (((exmc_nand_init_struct->common_space_timing->waittime - 1U) << NPCTCFG_COMWAIT_OFFSET) & EXMC_NPCTCFG_COMWAIT ) | + ((exmc_nand_init_struct->common_space_timing->holdtime << NPCTCFG_COMHLD_OFFSET) & EXMC_NPCTCFG_COMHLD ) | + (((exmc_nand_init_struct->common_space_timing->databus_hiztime - 1U) << NPCTCFG_COMHIZ_OFFSET) & EXMC_NPCTCFG_COMHIZ ); + + npatcfg = (uint32_t)((exmc_nand_init_struct->attribute_space_timing->setuptime - 1U) & EXMC_NPATCFG_ATTSET ) | + (((exmc_nand_init_struct->attribute_space_timing->waittime - 1U) << NPATCFG_ATTWAIT_OFFSET) & EXMC_NPATCFG_ATTWAIT ) | + ((exmc_nand_init_struct->attribute_space_timing->holdtime << NPATCFG_ATTHLD_OFFSET) & EXMC_NPATCFG_ATTHLD ) | + (((exmc_nand_init_struct->attribute_space_timing->databus_hiztime -1U) << NPATCFG_ATTHIZ_OFFSET) & EXMC_NPATCFG_ATTHIZ ); + + /* EXMC_BANK1_NAND or EXMC_BANK2_NAND initialize */ + EXMC_NPCTL(exmc_nand_init_struct->nand_bank) = npctl; + EXMC_NPCTCFG(exmc_nand_init_struct->nand_bank) = npctcfg; + EXMC_NPATCFG(exmc_nand_init_struct->nand_bank) = npatcfg; +} + +/*! + \brief enable NAND bank + \param[in] exmc_nand_bank: specifie the NAND bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANKx_NAND(x=1,2) + \param[out] none + \retval none +*/ +void exmc_nand_enable(uint32_t exmc_nand_bank) +{ + EXMC_NPCTL(exmc_nand_bank) |= EXMC_NPCTL_NDBKEN; +} + +/*! + \brief disable NAND bank + \param[in] exmc_nand_bank: specifie the NAND bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANKx_NAND(x=1,2) + \param[out] none + \retval none +*/ +void exmc_nand_disable(uint32_t exmc_nand_bank) +{ + EXMC_NPCTL(exmc_nand_bank) &= (~EXMC_NPCTL_NDBKEN); +} + +/*! + \brief deinitialize EXMC PC card bank + \param[in] none + \param[out] none + \retval none +*/ +void exmc_pccard_deinit(void) +{ + /* EXMC_BANK3_PCCARD */ + EXMC_NPCTL3 = BANK3_NPCTL_RESET; + EXMC_NPINTEN3 = BANK3_NPINTEN_RESET; + EXMC_NPCTCFG3 = BANK3_NPCTCFG_RESET; + EXMC_NPATCFG3 = BANK3_NPATCFG_RESET; + EXMC_PIOTCFG3 = BANK3_PIOTCFG3_RESET; +} + +/*! + \brief initialize exmc_pccard_parameter_struct parameter with the default values + \param[in] none + \param[out] the initialized struct exmc_pccard_parameter_struct pointer + \retval none +*/ +void exmc_pccard_struct_para_init(exmc_pccard_parameter_struct* exmc_pccard_init_struct) +{ + /* configure the structure with default values */ + exmc_pccard_init_struct->wait_feature = DISABLE; + exmc_pccard_init_struct->ctr_latency = 0x0U; + exmc_pccard_init_struct->atr_latency = 0x0U; + exmc_pccard_init_struct->common_space_timing->setuptime = 0xFCU; + exmc_pccard_init_struct->common_space_timing->waittime = 0xFCU; + exmc_pccard_init_struct->common_space_timing->holdtime = 0xFCU; + exmc_pccard_init_struct->common_space_timing->databus_hiztime = 0xFCU; + exmc_pccard_init_struct->attribute_space_timing->setuptime = 0xFCU; + exmc_pccard_init_struct->attribute_space_timing->waittime = 0xFCU; + exmc_pccard_init_struct->attribute_space_timing->holdtime = 0xFCU; + exmc_pccard_init_struct->attribute_space_timing->databus_hiztime = 0xFCU; + exmc_pccard_init_struct->io_space_timing->setuptime = 0xFCU; + exmc_pccard_init_struct->io_space_timing->waittime = 0xFCU; + exmc_pccard_init_struct->io_space_timing->holdtime = 0xFCU; + exmc_pccard_init_struct->io_space_timing->databus_hiztime = 0xFCU; +} + +/*! + \brief initialize EXMC PC card bank + \param[in] exmc_pccard_parameter_struct: configure the EXMC NAND parameter + atr_latency: EXMC_ALE_RE_DELAY_x_HCLK,x=1..16 + ctr_latency: EXMC_CLE_RE_DELAY_x_HCLK,x=1..16 + wait_feature: ENABLE or DISABLE + common_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time + attribute_space_timing: struct exmc_nand_pccard_timing_parameter_struct set the time + io_space_timing: exmc_nand_pccard_timing_parameter_struct set the time + \param[out] none + \retval none +*/ +void exmc_pccard_init(exmc_pccard_parameter_struct* exmc_pccard_init_struct) +{ + /* configure the EXMC bank3 PC card control register */ + EXMC_NPCTL3 = (uint32_t)(exmc_pccard_init_struct->wait_feature << NPCTL_NDWTEN_OFFSET) | + EXMC_NAND_DATABUS_WIDTH_16B | + exmc_pccard_init_struct->ctr_latency | + exmc_pccard_init_struct->atr_latency ; + + /* configure the EXMC bank3 PC card common space timing configuration register */ + EXMC_NPCTCFG3 = (uint32_t)((exmc_pccard_init_struct->common_space_timing->setuptime - 1U)& EXMC_NPCTCFG_COMSET ) | + (((exmc_pccard_init_struct->common_space_timing->waittime - 1U) << NPCTCFG_COMWAIT_OFFSET) & EXMC_NPCTCFG_COMWAIT ) | + ((exmc_pccard_init_struct->common_space_timing->holdtime << NPCTCFG_COMHLD_OFFSET) & EXMC_NPCTCFG_COMHLD ) | + (((exmc_pccard_init_struct->common_space_timing->databus_hiztime - 1U) << NPCTCFG_COMHIZ_OFFSET) & EXMC_NPCTCFG_COMHIZ ); + + /* configure the EXMC bank3 PC card attribute space timing configuration register */ + EXMC_NPATCFG3 = (uint32_t)((exmc_pccard_init_struct->attribute_space_timing->setuptime - 1U) & EXMC_NPATCFG_ATTSET ) | + (((exmc_pccard_init_struct->attribute_space_timing->waittime - 1U) << NPATCFG_ATTWAIT_OFFSET) & EXMC_NPATCFG_ATTWAIT ) | + ((exmc_pccard_init_struct->attribute_space_timing->holdtime << NPATCFG_ATTHLD_OFFSET) & EXMC_NPATCFG_ATTHLD )| + (((exmc_pccard_init_struct->attribute_space_timing->databus_hiztime -1U) << NPATCFG_ATTHIZ_OFFSET) & EXMC_NPATCFG_ATTHIZ ); + + /* configure the EXMC bank3 PC card io space timing configuration register */ + EXMC_PIOTCFG3 = (uint32_t)((exmc_pccard_init_struct->io_space_timing->setuptime - 1U) & EXMC_PIOTCFG3_IOSET ) | + (((exmc_pccard_init_struct->io_space_timing->waittime - 1U) << PIOTCFG_IOWAIT_OFFSET) & EXMC_PIOTCFG3_IOWAIT ) | + ((exmc_pccard_init_struct->io_space_timing->holdtime << PIOTCFG_IOHLD_OFFSET) & EXMC_PIOTCFG3_IOHLD )| + ((exmc_pccard_init_struct->io_space_timing->databus_hiztime << PIOTCFG_IOHIZ_OFFSET) & EXMC_PIOTCFG3_IOHIZ ); +} + +/*! + \brief enable PC Card Bank + \param[in] none + \param[out] none + \retval none +*/ +void exmc_pccard_enable(void) +{ + EXMC_NPCTL3 |= EXMC_NPCTL_NDBKEN; +} + +/*! + \brief disable PC Card Bank + \param[in] none + \param[out] none + \retval none +*/ +void exmc_pccard_disable(void) +{ + EXMC_NPCTL3 &= (~EXMC_NPCTL_NDBKEN); +} + +/*! + \brief configure CRAM page size + \param[in] exmc_norsram_region: specifie the region of NOR/PSRAM bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANK0_NORSRAM_REGIONx(x=0..3) + \param[in] page_size: CRAM page size + only one parameter can be selected which is shown as below: + \arg EXMC_CRAM_AUTO_SPLIT: the clock is generated only during synchronous access + \arg EXMC_CRAM_PAGE_SIZE_128_BYTES: page size is 128 bytes + \arg EXMC_CRAM_PAGE_SIZE_256_BYTES: page size is 256 bytes + \arg EXMC_CRAM_PAGE_SIZE_512_BYTES: page size is 512 bytes + \arg EXMC_CRAM_PAGE_SIZE_1024_BYTES: page size is 1024 bytes + \param[out] none + \retval none +*/ +void exmc_norsram_page_size_config(uint32_t exmc_norsram_region, uint32_t page_size) +{ + /* reset the bits */ + EXMC_SNCTL(exmc_norsram_region) &= ~EXMC_SNCTL_CPS; + + /* set the CPS bits */ + EXMC_SNCTL(exmc_norsram_region) |= page_size; +} + +/*! + \brief enable or disable the EXMC NAND ECC function + \param[in] exmc_nand_bank: specifie the NAND bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANKx_NAND(x=1,2) + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void exmc_nand_ecc_config(uint32_t exmc_nand_bank, ControlStatus newvalue) +{ + if (ENABLE == newvalue){ + /* enable the selected NAND bank ECC function */ + EXMC_NPCTL(exmc_nand_bank) |= EXMC_NPCTL_ECCEN; + }else{ + /* disable the selected NAND bank ECC function */ + EXMC_NPCTL(exmc_nand_bank) &= (~EXMC_NPCTL_ECCEN); + } +} + +/*! + \brief get the EXMC ECC value + \param[in] exmc_nand_bank: specifie the NAND bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANKx_NAND(x=1,2) + \param[out] none + \retval the error correction code(ECC) value +*/ +uint32_t exmc_ecc_get(uint32_t exmc_nand_bank) +{ + return (EXMC_NECC(exmc_nand_bank)); +} + +/*! + \brief enable EXMC interrupt + \param[in] exmc_bank: specifies the NAND bank,PC card bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC card bank + \param[in] interrupt: EXMC interrupt flag + only one parameter can be selected which are shown as below: + \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag + \param[out] none + \retval none +*/ +void exmc_interrupt_enable(uint32_t exmc_bank,uint32_t interrupt) +{ + /* NAND bank1,bank2 or PC card bank3 */ + EXMC_NPINTEN(exmc_bank) |= interrupt; +} + +/*! + \brief disable EXMC interrupt + \param[in] exmc_bank: specifies the NAND bank , PC card bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC card bank + \param[in] interrupt: EXMC interrupt flag + only one parameter can be selected which are shown as below: + \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag + \param[out] none + \retval none +*/ +void exmc_interrupt_disable(uint32_t exmc_bank,uint32_t interrupt) +{ + /* NAND bank1,bank2 or PC card bank3 */ + EXMC_NPINTEN(exmc_bank) &= (~interrupt); +} + +/*! + \brief get EXMC flag status + \param[in] exmc_bank: specifies the NAND bank , PC card bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC Card bank + \param[in] flag: EXMC status and flag + only one parameter can be selected which are shown as below: + \arg EXMC_NAND_PCCARD_FLAG_RISE: interrupt rising edge status + \arg EXMC_NAND_PCCARD_FLAG_LEVEL: interrupt high-level status + \arg EXMC_NAND_PCCARD_FLAG_FALL: interrupt falling edge status + \arg EXMC_NAND_PCCARD_FLAG_FIFOE: FIFO empty flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus exmc_flag_get(uint32_t exmc_bank,uint32_t flag) +{ + uint32_t status = 0x00000000U; + + /* NAND bank1,bank2 or PC card bank3 */ + status = EXMC_NPINTEN(exmc_bank); + + if ((status & flag) != (uint32_t)flag ){ + /* flag is reset */ + return RESET; + }else{ + /* flag is set */ + return SET; + } +} + +/*! + \brief clear EXMC flag status + \param[in] exmc_bank: specifie the NAND bank , PCCARD bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC card bank + \param[in] flag: EXMC status and flag + only one parameter can be selected which are shown as below: + \arg EXMC_NAND_PCCARD_FLAG_RISE: interrupt rising edge status + \arg EXMC_NAND_PCCARD_FLAG_LEVEL: interrupt high-level status + \arg EXMC_NAND_PCCARD_FLAG_FALL: interrupt falling edge status + \arg EXMC_NAND_PCCARD_FLAG_FIFOE: FIFO empty flag + \param[out] none + \retval none +*/ +void exmc_flag_clear(uint32_t exmc_bank,uint32_t flag) +{ + /* NAND bank1,bank2 or PC card bank3 */ + EXMC_NPINTEN(exmc_bank) &= (~flag); +} + +/*! + \brief get EXMC interrupt flag + \param[in] exmc_bank: specifies the NAND bank , PC card bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC card bank + \param[in] interrupt: EXMC interrupt flag + only one parameter can be selected which are shown as below: + \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus exmc_interrupt_flag_get(uint32_t exmc_bank,uint32_t interrupt) +{ + uint32_t status = 0x00000000U,interrupt_enable = 0x00000000U,interrupt_state = 0x00000000U; + + /* NAND bank1,bank2 or PC card bank3 */ + status = EXMC_NPINTEN(exmc_bank); + interrupt_state = (status & (interrupt >> INTEN_INTS_OFFSET)); + + interrupt_enable = (status & interrupt); + + if ((interrupt_enable) && (interrupt_state)){ + /* interrupt flag is set */ + return SET; + }else{ + /* interrupt flag is reset */ + return RESET; + } +} + +/*! + \brief clear EXMC interrupt flag + \param[in] exmc_bank: specifies the NAND bank , PC card bank + only one parameter can be selected which is shown as below: + \arg EXMC_BANK1_NAND: the NAND bank1 + \arg EXMC_BANK2_NAND: the NAND bank2 + \arg EXMC_BANK3_PCCARD: the PC card bank + \param[in] interrupt: EXMC interrupt flag + only one parameter can be selected which are shown as below: + \arg EXMC_NAND_PCCARD_INT_FLAG_RISE: rising edge interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_LEVEL: high-level interrupt and flag + \arg EXMC_NAND_PCCARD_INT_FLAG_FALL: falling edge interrupt and flag + \param[out] none + \retval none +*/ +void exmc_interrupt_flag_clear(uint32_t exmc_bank,uint32_t interrupt) +{ + /* NAND bank1,bank2 or PC card bank3 */ + EXMC_NPINTEN(exmc_bank) &= ~(interrupt >> INTEN_INTS_OFFSET); +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_exti.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_exti.c new file mode 100644 index 0000000..b027a52 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_exti.c @@ -0,0 +1,253 @@ +/*! + \file gd32f30x_exti.c + \brief EXTI driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_exti.h" + +/*! + \brief deinitialize the EXTI + \param[in] none + \param[out] none + \retval none +*/ +void exti_deinit(void) +{ + /* reset the value of all the EXTI registers */ + EXTI_INTEN = (uint32_t)0x00000000U; + EXTI_EVEN = (uint32_t)0x00000000U; + EXTI_RTEN = (uint32_t)0x00000000U; + EXTI_FTEN = (uint32_t)0x00000000U; + EXTI_SWIEV = (uint32_t)0x00000000U; +} + +/*! + \brief initialize the EXTI + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..19): EXTI line x + \param[in] mode: interrupt or event mode, refer to exti_mode_enum + only one parameter can be selected which is shown as below: + \arg EXTI_INTERRUPT: interrupt mode + \arg EXTI_EVENT: event mode + \param[in] trig_type: interrupt trigger type, refer to exti_trig_type_enum + only one parameter can be selected which is shown as below: + \arg EXTI_TRIG_RISING: rising edge trigger + \arg EXTI_TRIG_FALLING: falling trigger + \arg EXTI_TRIG_BOTH: rising and falling trigger + \param[out] none + \retval none +*/ +void exti_init(exti_line_enum linex, exti_mode_enum mode, exti_trig_type_enum trig_type) +{ + /* reset the EXTI line x */ + EXTI_INTEN &= ~(uint32_t)linex; + EXTI_EVEN &= ~(uint32_t)linex; + EXTI_RTEN &= ~(uint32_t)linex; + EXTI_FTEN &= ~(uint32_t)linex; + + /* set the EXTI mode and enable the interrupts or events from EXTI line x */ + switch(mode){ + case EXTI_INTERRUPT: + EXTI_INTEN |= (uint32_t)linex; + break; + case EXTI_EVENT: + EXTI_EVEN |= (uint32_t)linex; + break; + default: + break; + } + + /* set the EXTI trigger type */ + switch(trig_type){ + case EXTI_TRIG_RISING: + EXTI_RTEN |= (uint32_t)linex; + EXTI_FTEN &= ~(uint32_t)linex; + break; + case EXTI_TRIG_FALLING: + EXTI_RTEN &= ~(uint32_t)linex; + EXTI_FTEN |= (uint32_t)linex; + break; + case EXTI_TRIG_BOTH: + EXTI_RTEN |= (uint32_t)linex; + EXTI_FTEN |= (uint32_t)linex; + break; + default: + break; + } +} + +/*! + \brief enable the interrupts from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..19): EXTI line x + \param[out] none + \retval none +*/ +void exti_interrupt_enable(exti_line_enum linex) +{ + EXTI_INTEN |= (uint32_t)linex; +} + +/*! + \brief enable the events from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..19): EXTI line x + \param[out] none + \retval none +*/ +void exti_event_enable(exti_line_enum linex) +{ + EXTI_EVEN |= (uint32_t)linex; +} + +/*! + \brief disable the interrupt from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..19): EXTI line x + \param[out] none + \retval none +*/ +void exti_interrupt_disable(exti_line_enum linex) +{ + EXTI_INTEN &= ~(uint32_t)linex; +} + +/*! + \brief disable the events from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..19): EXTI line x + \param[out] none + \retval none +*/ +void exti_event_disable(exti_line_enum linex) +{ + EXTI_EVEN &= ~(uint32_t)linex; +} + +/*! + \brief get EXTI lines flag + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..19): EXTI line x + \param[out] none + \retval FlagStatus: status of flag (RESET or SET) +*/ +FlagStatus exti_flag_get(exti_line_enum linex) +{ + if(RESET != (EXTI_PD & (uint32_t)linex)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear EXTI lines pending flag + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..19): EXTI line x + \param[out] none + \retval none +*/ +void exti_flag_clear(exti_line_enum linex) +{ + EXTI_PD = (uint32_t)linex; +} + +/*! + \brief get EXTI lines flag when the interrupt flag is set + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..19): EXTI line x + \param[out] none + \retval FlagStatus: status of flag (RESET or SET) +*/ +FlagStatus exti_interrupt_flag_get(exti_line_enum linex) +{ + uint32_t flag_left, flag_right; + + flag_left = EXTI_PD & (uint32_t)linex; + flag_right = EXTI_INTEN & (uint32_t)linex; + + if((RESET != flag_left) && (RESET != flag_right)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear EXTI lines pending flag + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..19): EXTI line x + \param[out] none + \retval none +*/ +void exti_interrupt_flag_clear(exti_line_enum linex) +{ + EXTI_PD = (uint32_t)linex; +} + +/*! + \brief enable EXTI software interrupt event + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..19): EXTI line x + \param[out] none + \retval none +*/ +void exti_software_interrupt_enable(exti_line_enum linex) +{ + EXTI_SWIEV |= (uint32_t)linex; +} + +/*! + \brief disable EXTI software interrupt event + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..19): EXTI line x + \param[out] none + \retval none +*/ +void exti_software_interrupt_disable(exti_line_enum linex) +{ + EXTI_SWIEV &= ~(uint32_t)linex; +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_fmc.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_fmc.c new file mode 100644 index 0000000..bce9e99 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_fmc.c @@ -0,0 +1,1009 @@ +/*! + \file gd32f30x_fmc.c + \brief FMC driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#include "gd32f30x_fmc.h" + +/*! + \brief set the wait state counter value + \param[in] wscnt:wait state counter value + \arg WS_WSCNT_0: FMC 0 wait + \arg WS_WSCNT_1: FMC 1 wait + \arg WS_WSCNT_2: FMC 2 wait + \param[out] none + \retval none +*/ +void fmc_wscnt_set(uint32_t wscnt) +{ + uint32_t reg; + + reg = FMC_WS; + /* set the wait state counter value */ + reg &= ~FMC_WS_WSCNT; + FMC_WS = (reg | wscnt); +} + +/*! + \brief unlock the main FMC operation + \param[in] none + \param[out] none + \retval none +*/ +void fmc_unlock(void) +{ + if((RESET != (FMC_CTL0 & FMC_CTL0_LK))){ + /* write the FMC unlock key */ + FMC_KEY0 = UNLOCK_KEY0; + FMC_KEY0 = UNLOCK_KEY1; + } + if(FMC_BANK0_SIZE < FMC_SIZE){ + /* write the FMC unlock key */ + if(RESET != (FMC_CTL1 & FMC_CTL1_LK)){ + FMC_KEY1 = UNLOCK_KEY0; + FMC_KEY1 = UNLOCK_KEY1; + } + } +} + +/*! + \brief unlock the FMC bank0 operation + this function can be used for all GD32F30x devices. + for GD32F30x with flash more than 512KB, this function unlocks bank0. + for GD32F30x with flash no more than 512KB and it is equivalent to fmc_unlock function. + \param[in] none + \param[out] none + \retval none +*/ +void fmc_bank0_unlock(void) +{ + if((RESET != (FMC_CTL0 & FMC_CTL0_LK))){ + /* write the FMC unlock key */ + FMC_KEY0 = UNLOCK_KEY0; + FMC_KEY0 = UNLOCK_KEY1; + } +} + +/*! + \brief unlock the FMC bank1 operation + this function can be used for GD32F30x with flash more than 512KB. + \param[in] none + \param[out] none + \retval none +*/ +void fmc_bank1_unlock(void) +{ + if((RESET != (FMC_CTL1 & FMC_CTL1_LK))){ + /* write the FMC unlock key */ + FMC_KEY1 = UNLOCK_KEY0; + FMC_KEY1 = UNLOCK_KEY1; + } +} + +/*! + \brief lock the main FMC operation + \param[in] none + \param[out] none + \retval none +*/ +void fmc_lock(void) +{ + /* set the LK bit */ + FMC_CTL0 |= FMC_CTL0_LK; + + if(FMC_BANK0_SIZE < FMC_SIZE){ + /* set the LK bit */ + FMC_CTL1 |= FMC_CTL1_LK; + } +} + +/*! + \brief lock the FMC bank0 operation + this function can be used for all GD32F30X devices. + for GD32F30x with flash more than 512KB, this function locks bank0. + for GD32F30x with flash no more than 512KB and it is equivalent to fmc_lock function. + \param[in] none + \param[out] none + \retval none +*/ +void fmc_bank0_lock(void) +{ + /* set the LK bit*/ + FMC_CTL0 |= FMC_CTL0_LK; +} + +/*! + \brief lock the FMC bank1 operation + this function can be used for GD32F30x with flash more than 512KB. + \param[in] none + \param[out] none + \retval none +*/ +void fmc_bank1_lock(void) +{ + /* set the LK bit*/ + FMC_CTL1 |= FMC_CTL1_LK; +} + +/*! + \brief erase page + \param[in] page_address: the page address to be erased. + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum fmc_page_erase(uint32_t page_address) +{ + fmc_state_enum fmc_state; + + if(FMC_BANK0_SIZE < FMC_SIZE){ + if(FMC_BANK0_END_ADDRESS > page_address){ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* if the last operation is completed, start page erase */ + if(FMC_READY == fmc_state){ + FMC_CTL0 |= FMC_CTL0_PER; + FMC_ADDR0 = page_address; + FMC_CTL0 |= FMC_CTL0_START; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PER bit */ + FMC_CTL0 &= ~FMC_CTL0_PER; + } + }else{ + /* wait for the FMC ready */ + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + /* if the last operation is completed, start page erase */ + if(FMC_READY == fmc_state){ + FMC_CTL1 |= FMC_CTL1_PER; + FMC_ADDR1 = page_address; + if(FMC_OBSTAT & FMC_OBSTAT_SPC){ + FMC_ADDR0 = page_address; + } + FMC_CTL1 |= FMC_CTL1_START; + /* wait for the FMC ready */ + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PER bit */ + FMC_CTL1 &= ~FMC_CTL1_PER; + } + } + }else{ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* if the last operation is completed, start page erase */ + if(FMC_READY == fmc_state){ + FMC_CTL0 |= FMC_CTL0_PER; + FMC_ADDR0 = page_address; + FMC_CTL0 |= FMC_CTL0_START; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PER bit */ + FMC_CTL0 &= ~FMC_CTL0_PER; + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief erase whole chip + \param[in] none + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum fmc_mass_erase(void) +{ + fmc_state_enum fmc_state; + if(FMC_BANK0_SIZE < FMC_SIZE){ + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + if(FMC_READY == fmc_state){ + /* start whole chip erase */ + FMC_CTL0 |= FMC_CTL0_MER; + FMC_CTL0 |= FMC_CTL0_START; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + if(FMC_READY != fmc_state){ + return fmc_state; + } + /* reset the MER bit */ + FMC_CTL0 &= ~FMC_CTL0_MER; + } + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + if(FMC_READY == fmc_state){ + /* start whole chip erase */ + FMC_CTL1 |= FMC_CTL1_MER; + FMC_CTL1 |= FMC_CTL1_START; + /* wait for the FMC ready */ + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the MER bit */ + FMC_CTL1 &= ~FMC_CTL1_MER; + } + }else{ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + if(FMC_READY == fmc_state){ + /* start whole chip erase */ + FMC_CTL0 |= FMC_CTL0_MER; + FMC_CTL0 |= FMC_CTL0_START; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the MER bit */ + FMC_CTL0 &= ~FMC_CTL0_MER; + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief erase bank0 + \param[in] none + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum fmc_bank0_erase(void) +{ + fmc_state_enum fmc_state = FMC_READY; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* start FMC bank0 erase */ + FMC_CTL0 |= FMC_CTL0_MER; + FMC_CTL0 |= FMC_CTL0_START; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the MER bit */ + FMC_CTL0 &= ~FMC_CTL0_MER; + } + /* return the fmc state */ + return fmc_state; +} + +/*! + \brief erase bank1 + \param[in] none + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum fmc_bank1_erase(void) +{ + fmc_state_enum fmc_state = FMC_READY; + /* wait for the FMC ready */ + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* start FMC bank1 erase */ + FMC_CTL1 |= FMC_CTL1_MER; + FMC_CTL1 |= FMC_CTL1_START; + /* wait for the FMC ready */ + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the MER bit */ + FMC_CTL1 &= ~FMC_CTL1_MER; + } + /* return the fmc state */ + return fmc_state; +} + +/*! + \brief program a word at the corresponding address + \param[in] address: address to program + \param[in] data: word to program + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum fmc_word_program(uint32_t address, uint32_t data) +{ + fmc_state_enum fmc_state = FMC_READY; + if(FMC_BANK0_SIZE < FMC_SIZE){ + if(FMC_BANK0_END_ADDRESS > address){ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the PG bit to start program */ + FMC_CTL0 |= FMC_CTL0_PG; + REG32(address) = data; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PG bit */ + FMC_CTL0 &= ~FMC_CTL0_PG; + } + }else{ + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the PG bit to start program */ + FMC_CTL1 |= FMC_CTL1_PG; + REG32(address) = data; + /* wait for the FMC ready */ + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PG bit */ + FMC_CTL1 &= ~FMC_CTL1_PG; + } + } + }else{ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the PG bit to start program */ + FMC_CTL0 |= FMC_CTL0_PG; + REG32(address) = data; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PG bit */ + FMC_CTL0 &= ~FMC_CTL0_PG; + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief program a half word at the corresponding address + \param[in] address: address to program + \param[in] data: halfword to program + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum fmc_halfword_program(uint32_t address, uint16_t data) +{ + fmc_state_enum fmc_state = FMC_READY; + if(FMC_BANK0_SIZE < FMC_SIZE){ + if(FMC_BANK0_END_ADDRESS > address){ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the PG bit to start program */ + FMC_CTL0 |= FMC_CTL0_PG; + REG16(address) = data; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PG bit */ + FMC_CTL0 &= ~FMC_CTL0_PG; + } + }else{ + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the PG bit to start program */ + FMC_CTL1 |= FMC_CTL1_PG; + REG16(address) = data; + /* wait for the FMC ready */ + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PG bit */ + FMC_CTL1 &= ~FMC_CTL1_PG; + } + } + }else{ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the PG bit to start program */ + FMC_CTL0 |= FMC_CTL0_PG; + REG16(address) = data; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PG bit */ + FMC_CTL0 &= ~FMC_CTL0_PG; + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief program a word at the corresponding address without erasing + \param[in] address: address to program + \param[in] data: word to program + \param[out] none + \retval fmc_state +*/ +fmc_state_enum fmc_word_reprogram(uint32_t address, uint32_t data) +{ + fmc_state_enum fmc_state = FMC_READY; + if(FMC_BANK0_SIZE < FMC_SIZE){ + if(FMC_BANK0_END_ADDRESS > address){ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + FMC_WSEN |= FMC_WSEN_BPEN; + if(FMC_READY == fmc_state){ + /* set the PG bit to start program */ + FMC_CTL0 |= FMC_CTL0_PG; + REG32(address) = data; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PG bit */ + FMC_CTL0 &= ~FMC_CTL0_PG; + } + }else{ + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + FMC_WSEN |= FMC_WSEN_BPEN; + if(FMC_READY == fmc_state){ + /* set the PG bit to start program */ + FMC_CTL1 |= FMC_CTL1_PG; + REG32(address) = data; + /* wait for the FMC ready */ + fmc_state = fmc_bank1_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PG bit */ + FMC_CTL1 &= ~FMC_CTL1_PG; + } + } + }else{ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + FMC_WSEN |= FMC_WSEN_BPEN; + if(FMC_READY == fmc_state){ + /* set the PG bit to start program */ + FMC_CTL0 |= FMC_CTL0_PG; + REG32(address) = data; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PG bit */ + FMC_CTL0 &= ~FMC_CTL0_PG; + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief unlock the option byte operation + \param[in] none + \param[out] none + \retval none +*/ +void ob_unlock(void) +{ + if(RESET == (FMC_CTL0 & FMC_CTL0_OBWEN)){ + /* write the FMC key */ + FMC_OBKEY = UNLOCK_KEY0; + FMC_OBKEY = UNLOCK_KEY1; + } +} + +/*! + \brief lock the option byte operation + \param[in] none + \param[out] none + \retval none +*/ +void ob_lock(void) +{ + /* reset the OBWEN bit */ + FMC_CTL0 &= ~FMC_CTL0_OBWEN; +} + +/*! + \brief erase the FMC option byte + unlock the FMC_CTL0 and option byte before calling this function + \param[in] none + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum ob_erase(void) +{ + uint16_t temp_spc = FMC_NSPC; + + fmc_state_enum fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + /* check the option byte security protection value */ + if(RESET != ob_spc_get()){ + temp_spc = FMC_USPC; + } + + if(FMC_READY == fmc_state){ + + /* start erase the option byte */ + FMC_CTL0 |= FMC_CTL0_OBER; + FMC_CTL0 |= FMC_CTL0_START; + + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* reset the OBER bit */ + FMC_CTL0 &= ~FMC_CTL0_OBER; + /* set the OBPG bit */ + FMC_CTL0 |= FMC_CTL0_OBPG; + /* no security protection */ + OB_SPC = (uint16_t)temp_spc; + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + if(FMC_TOERR != fmc_state){ + /* reset the OBPG bit */ + FMC_CTL0 &= ~FMC_CTL0_OBPG; + } + }else{ + if(FMC_TOERR != fmc_state){ + /* reset the OBPG bit */ + FMC_CTL0 &= ~FMC_CTL0_OBPG; + } + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief enable write protection + \param[in] ob_wp: specify sector to be write protected + \arg OB_WPx(x=0..31): write protect specify sector + \arg OB_WP_ALL: write protect all sector + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum ob_write_protection_enable(uint32_t ob_wp) +{ + uint16_t temp_wp0, temp_wp1, temp_wp2, temp_wp3; + + fmc_state_enum fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + ob_wp = (uint32_t)(~ob_wp); + temp_wp0 = (uint16_t)(ob_wp & OB_WP0_WP0); + temp_wp1 = (uint16_t)((ob_wp & OB_WP1_WP1) >> 8U); + temp_wp2 = (uint16_t)((ob_wp & OB_WP2_WP2) >> 16U); + temp_wp3 = (uint16_t)((ob_wp & OB_WP3_WP3) >> 24U); + + if(FMC_READY == fmc_state){ + + /* set the OBPG bit*/ + FMC_CTL0 |= FMC_CTL0_OBPG; + + if(0xFFU != temp_wp0){ + OB_WP0 = temp_wp0; + + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + } + if((FMC_READY == fmc_state) && (0xFFU != temp_wp1)){ + OB_WP1 = temp_wp1; + + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + } + if((FMC_READY == fmc_state) && (0xFFU != temp_wp2)){ + OB_WP2 = temp_wp2; + + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + } + if((FMC_READY == fmc_state) && (0xFFU != temp_wp3)){ + OB_WP3 = temp_wp3; + + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + } + if(FMC_TOERR != fmc_state){ + /* reset the OBPG bit */ + FMC_CTL0 &= ~FMC_CTL0_OBPG; + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief configure security protection + \param[in] ob_spc: specify security protection + \arg FMC_NSPC: no security protection + \arg FMC_USPC: under security protection + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum ob_security_protection_config(uint8_t ob_spc) +{ + fmc_state_enum fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + FMC_CTL0 |= FMC_CTL0_OBER; + FMC_CTL0 |= FMC_CTL0_START; + + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* reset the OBER bit */ + FMC_CTL0 &= ~FMC_CTL0_OBER; + + /* start the option byte program */ + FMC_CTL0 |= FMC_CTL0_OBPG; + + OB_SPC = (uint16_t)ob_spc; + + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_TOERR != fmc_state){ + /* reset the OBPG bit */ + FMC_CTL0 &= ~FMC_CTL0_OBPG; + } + }else{ + if(FMC_TOERR != fmc_state){ + /* reset the OBER bit */ + FMC_CTL0 &= ~FMC_CTL0_OBER; + } + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief program the FMC user option byte + \param[in] ob_fwdgt: option byte watchdog value + \arg OB_FWDGT_SW: software free watchdog + \arg OB_FWDGT_HW: hardware free watchdog + \param[in] ob_deepsleep: option byte deepsleep reset value + \arg OB_DEEPSLEEP_NRST: no reset when entering deepsleep mode + \arg OB_DEEPSLEEP_RST: generate a reset instead of entering deepsleep mode + \param[in] ob_stdby:option byte standby reset value + \arg OB_STDBY_NRST: no reset when entering standby mode + \arg OB_STDBY_RST: generate a reset instead of entering standby mode + \param[in] ob_boot: specifies the option byte boot bank value + \arg OB_BOOT_B0: boot from bank0 + \arg OB_BOOT_B1: boot from bank1 or bank0 if bank1 is void + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum ob_user_write(uint8_t ob_fwdgt, uint8_t ob_deepsleep, uint8_t ob_stdby, uint8_t ob_boot) +{ + fmc_state_enum fmc_state = FMC_READY; + uint8_t temp; + + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the OBPG bit*/ + FMC_CTL0 |= FMC_CTL0_OBPG; + + temp = ((uint8_t)((uint8_t)((uint8_t)(ob_boot | ob_fwdgt) | ob_deepsleep) | ob_stdby) | OB_USER_MASK); + OB_USER = (uint16_t)temp; + + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_TOERR != fmc_state){ + /* reset the OBPG bit */ + FMC_CTL0 &= ~FMC_CTL0_OBPG; + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief program option bytes data + \param[in] address: the option bytes address to be programmed + \param[in] data: the byte to be programmed + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum ob_data_program(uint32_t address, uint8_t data) +{ + fmc_state_enum fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the OBPG bit */ + FMC_CTL0 |= FMC_CTL0_OBPG; + REG16(address) = data; + + /* wait for the FMC ready */ + fmc_state = fmc_bank0_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_TOERR != fmc_state){ + /* reset the OBPG bit */ + FMC_CTL0 &= ~FMC_CTL0_OBPG; + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief get the FMC user option byte + \param[in] none + \param[out] none + \retval the FMC user option byte values +*/ +uint8_t ob_user_get(void) +{ + /* return the FMC user option byte value */ + return (uint8_t)(FMC_OBSTAT >> 2U); +} + +/*! + \brief get OB_DATA in register FMC_OBSTAT + \param[in] none + \param[out] none + \retval ob_data +*/ +uint16_t ob_data_get(void) +{ + return (uint16_t)(FMC_OBSTAT >> 10U); +} + +/*! + \brief get the FMC option byte write protection + \param[in] none + \param[out] none + \retval the FMC write protection option byte value +*/ +uint32_t ob_write_protection_get(void) +{ + /* return the FMC write protection option byte value */ + return FMC_WP; +} + +/*! + \brief get the FMC option byte security protection + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus ob_spc_get(void) +{ + FlagStatus spc_state = RESET; + + if(RESET != (FMC_OBSTAT & FMC_OBSTAT_SPC)){ + spc_state = SET; + }else{ + spc_state = RESET; + } + return spc_state; +} + +/*! + \brief enable FMC interrupt + \param[in] interrupt: the FMC interrupt source + \arg FMC_INT_BANK0_END: FMC bank0 end of program interrupt + \arg FMC_INT_BANK0_ERR: FMC bank0 error interrupt + \arg FMC_INT_BANK1_END: FMC bank1 end of program interrupt + \arg FMC_INT_BANK1_ERR: FMC bank1 error interrupt + \param[out] none + \retval none +*/ +void fmc_interrupt_enable(uint32_t interrupt) +{ + FMC_REG_VAL(interrupt) |= BIT(FMC_BIT_POS(interrupt)); +} + +/*! + \brief disable FMC interrupt + \param[in] interrupt: the FMC interrupt source + \arg FMC_INT_BANK0_END: FMC bank0 end of program interrupt + \arg FMC_INT_BANK0_ERR: FMC bank0 error interrupt + \arg FMC_INT_BANK1_END: FMC bank1 end of program interrupt + \arg FMC_INT_BANK1_ERR: FMC bank1 error interrupt + \param[out] none + \retval none +*/ +void fmc_interrupt_disable(uint32_t interrupt) +{ + FMC_REG_VAL(interrupt) &= ~BIT(FMC_BIT_POS(interrupt)); +} + +/*! + \brief check flag is set or not + \param[in] flag: check FMC flag + only one parameter can be selected which is shown as below: + \arg FMC_FLAG_BANK0_BUSY: FMC bank0 busy flag bit + \arg FMC_FLAG_BANK0_PGERR: FMC bank0 operation error flag bit + \arg FMC_FLAG_BANK0_WPERR: FMC bank0 erase/program protection error flag bit + \arg FMC_FLAG_BANK0_END: FMC bank0 end of operation flag bit + \arg FMC_FLAG_OBERR: FMC option bytes read error flag bit + \arg FMC_FLAG_BANK1_BUSY: FMC bank1 busy flag bit + \arg FMC_FLAG_BANK1_PGERR: FMC bank1 operation error flag bit + \arg FMC_FLAG_BANK1_WPERR: FMC bank1 erase/program protection error flag bit + \arg FMC_FLAG_BANK1_END: FMC bank1 end of operation flag bit + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus fmc_flag_get(uint32_t flag) +{ + if(RESET != (FMC_REG_VAL(flag) & BIT(FMC_BIT_POS(flag)))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear the FMC flag + \param[in] flag: clear FMC flag + only one parameter can be selected which is shown as below: + \arg FMC_FLAG_BANK0_PGERR: FMC bank0 operation error flag bit + \arg FMC_FLAG_BANK0_WPERR: FMC bank0 erase/program protection error flag bit + \arg FMC_FLAG_BANK0_END: FMC bank0 end of operation flag bit + \arg FMC_FLAG_BANK1_PGERR: FMC bank1 operation error flag bit + \arg FMC_FLAG_BANK1_WPERR: FMC bank1 erase/program protection error flag bit + \arg FMC_FLAG_BANK1_END: FMC bank1 end of operation flag bit + \param[out] none + \retval none +*/ +void fmc_flag_clear(uint32_t flag) +{ + FMC_REG_VAL(flag) |= BIT(FMC_BIT_POS(flag)); +} + +/*! + \brief get FMC interrupt flag state + \param[in] flag: FMC interrupt flags, refer to fmc_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg FMC_INT_FLAG_BANK0_PGERR: FMC bank0 operation error interrupt flag bit + \arg FMC_INT_FLAG_BANK0_WPERR: FMC bank0 erase/program protection error interrupt flag bit + \arg FMC_INT_FLAG_BANK0_END: FMC bank0 end of operation interrupt flag bit + \arg FMC_INT_FLAG_BANK1_PGERR: FMC bank1 operation error interrupt flag bit + \arg FMC_INT_FLAG_BANK1_WPERR: FMC bank1 erase/program protection error interrupt flag bit + \arg FMC_INT_FLAG_BANK1_END: FMC bank1 end of operation interrupt flag bit + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus fmc_interrupt_flag_get(fmc_interrupt_flag_enum flag) +{ + FlagStatus ret1 = RESET; + FlagStatus ret2 = RESET; + + if(FMC_STAT0_REG_OFFSET == FMC_REG_OFFSET_GET(flag)){ + /* get the staus of interrupt flag */ + ret1 = (FlagStatus)(FMC_REG_VALS(flag) & BIT(FMC_BIT_POS0(flag))); + /* get the staus of interrupt enale bit */ + ret2 = (FlagStatus)(FMC_CTL0 & BIT(FMC_BIT_POS1(flag))); + }else{ + /* get the staus of interrupt flag */ + ret1 = (FlagStatus)(FMC_REG_VALS(flag) & BIT(FMC_BIT_POS0(flag))); + /* get the staus of interrupt enale bit */ + ret2 = (FlagStatus)(FMC_CTL1 & BIT(FMC_BIT_POS1(flag))); + } + + if(ret1 && ret2){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear FMC interrupt flag state + \param[in] flag: FMC interrupt flags, refer to can_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg FMC_INT_FLAG_BANK0_PGERR: FMC bank0 operation error interrupt flag bit + \arg FMC_INT_FLAG_BANK0_WPERR: FMC bank0 erase/program protection error interrupt flag bit + \arg FMC_INT_FLAG_BANK0_END: FMC bank0 end of operation interrupt flag bit + \arg FMC_INT_FLAG_BANK1_PGERR: FMC bank1 operation error interrupt flag bit + \arg FMC_INT_FLAG_BANK1_WPERR: FMC bank1 erase/program protection error interrupt flag bit + \arg FMC_INT_FLAG_BANK1_END: FMC bank1 end of operation interrupt flag bit + \param[out] none + \retval none +*/ +void fmc_interrupt_flag_clear(fmc_interrupt_flag_enum flag) +{ + FMC_REG_VALS(flag) |= BIT(FMC_BIT_POS0(flag)); +} + +/*! + \brief get the FMC bank0 state + \param[in] none + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum fmc_bank0_state_get(void) +{ + fmc_state_enum fmc_state = FMC_READY; + + if((uint32_t)0x00U != (FMC_STAT0 & FMC_STAT0_BUSY)){ + fmc_state = FMC_BUSY; + }else{ + if((uint32_t)0x00U != (FMC_STAT0 & FMC_STAT0_WPERR)){ + fmc_state = FMC_WPERR; + }else{ + if((uint32_t)0x00U != (FMC_STAT0 & (FMC_STAT0_PGERR))){ + fmc_state = FMC_PGERR; + } + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief get the FMC bank1 state + \param[in] none + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum fmc_bank1_state_get(void) +{ + fmc_state_enum fmc_state = FMC_READY; + + if((uint32_t)0x00U != (FMC_STAT1 & FMC_STAT1_BUSY)){ + fmc_state = FMC_BUSY; + }else{ + if((uint32_t)0x00U != (FMC_STAT1 & FMC_STAT1_WPERR)){ + fmc_state = FMC_WPERR; + }else{ + if((uint32_t)0x00U != (FMC_STAT1 & FMC_STAT1_PGERR)){ + fmc_state = FMC_PGERR; + } + } + } + + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief check whether FMC bank0 is ready or not + \param[in] timeout: count of loop + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum fmc_bank0_ready_wait(uint32_t timeout) +{ + fmc_state_enum fmc_state = FMC_BUSY; + + /* wait for FMC ready */ + do{ + /* get FMC state */ + fmc_state = fmc_bank0_state_get(); + timeout--; + }while((FMC_BUSY == fmc_state) && (0x00U != timeout)); + + if(FMC_BUSY == fmc_state){ + fmc_state = FMC_TOERR; + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief check whether FMC bank1 is ready or not + \param[in] timeout: count of loop + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum fmc_bank1_ready_wait(uint32_t timeout) +{ + fmc_state_enum fmc_state = FMC_BUSY; + + /* wait for FMC ready */ + do{ + /* get FMC state */ + fmc_state = fmc_bank1_state_get(); + timeout--; + }while((FMC_BUSY == fmc_state) && (0x00U != timeout)); + + if(FMC_BUSY == fmc_state){ + fmc_state = FMC_TOERR; + } + /* return the FMC state */ + return fmc_state; +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_fwdgt.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_fwdgt.c new file mode 100644 index 0000000..c5e1aee --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_fwdgt.c @@ -0,0 +1,158 @@ +/*! + \file gd32f30x_fwdgt.c + \brief FWDGT driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_fwdgt.h" + +/* write value to FWDGT_CTL_CMD bit field */ +#define CTL_CMD(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) +/* write value to FWDGT_RLD_RLD bit field */ +#define RLD_RLD(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) + +/*! + \brief enable write access to FWDGT_PSC and FWDGT_RLD + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_write_enable(void) +{ + FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; +} + +/*! + \brief disable write access to FWDGT_PSC and FWDGT_RLD + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_write_disable(void) +{ + FWDGT_CTL = FWDGT_WRITEACCESS_DISABLE; +} + +/*! + \brief start the free watchdog timer counter + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_enable(void) +{ + FWDGT_CTL = FWDGT_KEY_ENABLE; +} + +/*! + \brief reload the counter of FWDGT + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_counter_reload(void) +{ + FWDGT_CTL = FWDGT_KEY_RELOAD; +} + +/*! + \brief configure counter reload value, and prescaler divider value + \param[in] reload_value: specify reload value(0x0000 - 0x0FFF) + \param[in] prescaler_div: FWDGT prescaler value + only one parameter can be selected which is shown as below: + \arg FWDGT_PSC_DIV4: FWDGT prescaler set to 4 + \arg FWDGT_PSC_DIV8: FWDGT prescaler set to 8 + \arg FWDGT_PSC_DIV16: FWDGT prescaler set to 16 + \arg FWDGT_PSC_DIV32: FWDGT prescaler set to 32 + \arg FWDGT_PSC_DIV64: FWDGT prescaler set to 64 + \arg FWDGT_PSC_DIV128: FWDGT prescaler set to 128 + \arg FWDGT_PSC_DIV256: FWDGT prescaler set to 256 + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus fwdgt_config(uint16_t reload_value, uint8_t prescaler_div) +{ + uint32_t timeout = FWDGT_PSC_TIMEOUT; + uint32_t flag_status = RESET; + + /* enable write access to FWDGT_PSC,and FWDGT_RLD */ + FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; + + /* wait until the PUD flag to be reset */ + do{ + flag_status = FWDGT_STAT & FWDGT_STAT_PUD; + }while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); + + if ((uint32_t)RESET != flag_status){ + return ERROR; + } + + /* configure FWDGT */ + FWDGT_PSC = (uint32_t)prescaler_div; + + timeout = FWDGT_RLD_TIMEOUT; + /* wait until the RUD flag to be reset */ + do{ + flag_status = FWDGT_STAT & FWDGT_STAT_RUD; + }while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); + + if ((uint32_t)RESET != flag_status){ + return ERROR; + } + + FWDGT_RLD = RLD_RLD(reload_value); + + /* reload the counter */ + FWDGT_CTL = FWDGT_KEY_RELOAD; + + return SUCCESS; +} + +/*! + \brief get flag state of FWDGT + \param[in] flag: flag to get + only one parameter can be selected which is shown as below: + \arg FWDGT_FLAG_PUD: a write operation to FWDGT_PSC register is on going + \arg FWDGT_FLAG_RUD: a write operation to FWDGT_RLD register is on going + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus fwdgt_flag_get(uint16_t flag) +{ + if(RESET != (FWDGT_STAT & flag)){ + return SET; + } + + return RESET; +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_gpio.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_gpio.c new file mode 100644 index 0000000..98df185 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_gpio.c @@ -0,0 +1,583 @@ +/*! + \file gd32f30x_gpio.c + \brief GPIO driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_gpio.h" + +#define AFIO_EXTI_SOURCE_MASK ((uint8_t)0x03U) /*!< AFIO exti source selection mask*/ +#define AFIO_EXTI_SOURCE_FIELDS ((uint8_t)0x04U) /*!< select AFIO exti source registers */ +#define LSB_16BIT_MASK ((uint16_t)0xFFFFU) /*!< LSB 16-bit mask */ +#define PCF_POSITION_MASK ((uint32_t)0x000F0000U) /*!< AFIO_PCF register position mask */ +#define PCF_SWJCFG_MASK ((uint32_t)0xF8FFFFFFU) /*!< AFIO_PCF register SWJCFG mask */ +#define PCF_LOCATION1_MASK ((uint32_t)0x00200000U) /*!< AFIO_PCF register location1 mask */ +#define PCF_LOCATION2_MASK ((uint32_t)0x00100000U) /*!< AFIO_PCF register location2 mask */ +#define AFIO_PCF1_FIELDS ((uint32_t)0x80000000U) /*!< select AFIO_PCF1 register */ +#define GPIO_OUTPUT_PORT_OFFSET ((uint32_t)4U) /*!< GPIO event output port offset*/ + +/*! + \brief reset GPIO port + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G) + \param[out] none + \retval none +*/ +void gpio_deinit(uint32_t gpio_periph) +{ + switch(gpio_periph){ + case GPIOA: + /* reset GPIOA */ + rcu_periph_reset_enable(RCU_GPIOARST); + rcu_periph_reset_disable(RCU_GPIOARST); + break; + case GPIOB: + /* reset GPIOB */ + rcu_periph_reset_enable(RCU_GPIOBRST); + rcu_periph_reset_disable(RCU_GPIOBRST); + break; + case GPIOC: + /* reset GPIOC */ + rcu_periph_reset_enable(RCU_GPIOCRST); + rcu_periph_reset_disable(RCU_GPIOCRST); + break; + case GPIOD: + /* reset GPIOD */ + rcu_periph_reset_enable(RCU_GPIODRST); + rcu_periph_reset_disable(RCU_GPIODRST); + break; + case GPIOE: + /* reset GPIOE */ + rcu_periph_reset_enable(RCU_GPIOERST); + rcu_periph_reset_disable(RCU_GPIOERST); + break; + case GPIOF: + /* reset GPIOF */ + rcu_periph_reset_enable(RCU_GPIOFRST); + rcu_periph_reset_disable(RCU_GPIOFRST); + break; + case GPIOG: + /* reset GPIOG */ + rcu_periph_reset_enable(RCU_GPIOGRST); + rcu_periph_reset_disable(RCU_GPIOGRST); + break; + default: + break; + } +} + +/*! + \brief reset alternate function I/O(AFIO) + \param[in] none + \param[out] none + \retval none +*/ +void gpio_afio_deinit(void) +{ + rcu_periph_reset_enable(RCU_AFRST); + rcu_periph_reset_disable(RCU_AFRST); +} + +/*! + \brief GPIO parameter initialization + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G) + \param[in] mode: gpio pin mode + only one parameter can be selected which is shown as below: + \arg GPIO_MODE_AIN: analog input mode + \arg GPIO_MODE_IN_FLOATING: floating input mode + \arg GPIO_MODE_IPD: pull-down input mode + \arg GPIO_MODE_IPU: pull-up input mode + \arg GPIO_MODE_OUT_OD: GPIO output with open-drain + \arg GPIO_MODE_OUT_PP: GPIO output with push-pull + \arg GPIO_MODE_AF_OD: AFIO output with open-drain + \arg GPIO_MODE_AF_PP: AFIO output with push-pull + \param[in] speed: gpio output max speed value + only one parameter can be selected which is shown as below: + \arg GPIO_OSPEED_10MHZ: output max speed 10MHz + \arg GPIO_OSPEED_2MHZ: output max speed 2MHz + \arg GPIO_OSPEED_50MHZ: output max speed 50MHz + \arg GPIO_OSPEED_MAX: output max speed more than 50MHz + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, uint32_t pin) +{ + uint16_t i; + uint32_t temp_mode = 0U; + uint32_t reg = 0U; + + /* GPIO mode configuration */ + temp_mode = (uint32_t)(mode & ((uint32_t)0x0FU)); + + /* GPIO speed configuration */ + if(((uint32_t)0x00U) != ((uint32_t)mode & ((uint32_t)0x10U))){ + /* output mode max speed */ + if(GPIO_OSPEED_MAX == (uint32_t)speed){ + temp_mode |= (uint32_t)0x03U; + /* set the corresponding SPD bit */ + GPIOx_SPD(gpio_periph) |= (uint32_t)pin ; + }else{ + /* output mode max speed:10MHz,2MHz,50MHz */ + temp_mode |= (uint32_t)speed; + } + } + + /* configure the eight low port pins with GPIO_CTL0 */ + for(i = 0U;i < 8U;i++){ + if((1U << i) & pin){ + reg = GPIO_CTL0(gpio_periph); + + /* clear the specified pin mode bits */ + reg &= ~GPIO_MODE_MASK(i); + /* set the specified pin mode bits */ + reg |= GPIO_MODE_SET(i, temp_mode); + + /* set IPD or IPU */ + if(GPIO_MODE_IPD == mode){ + /* reset the corresponding OCTL bit */ + GPIO_BC(gpio_periph) = (uint32_t)((1U << i) & pin); + }else{ + /* set the corresponding OCTL bit */ + if(GPIO_MODE_IPU == mode){ + GPIO_BOP(gpio_periph) = (uint32_t)((1U << i) & pin); + } + } + /* set GPIO_CTL0 register */ + GPIO_CTL0(gpio_periph) = reg; + } + } + /* configure the eight high port pins with GPIO_CTL1 */ + for(i = 8U;i < 16U;i++){ + if((1U << i) & pin){ + reg = GPIO_CTL1(gpio_periph); + + /* clear the specified pin mode bits */ + reg &= ~GPIO_MODE_MASK(i - 8U); + /* set the specified pin mode bits */ + reg |= GPIO_MODE_SET(i - 8U, temp_mode); + + /* set IPD or IPU */ + if(GPIO_MODE_IPD == mode){ + /* reset the corresponding OCTL bit */ + GPIO_BC(gpio_periph) = (uint32_t)((1U << i) & pin); + }else{ + /* set the corresponding OCTL bit */ + if(GPIO_MODE_IPU == mode){ + GPIO_BOP(gpio_periph) = (uint32_t)((1U << i) & pin); + } + } + /* set GPIO_CTL1 register */ + GPIO_CTL1(gpio_periph) = reg; + } + } +} + +/*! + \brief set GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_bit_set(uint32_t gpio_periph,uint32_t pin) +{ + GPIO_BOP(gpio_periph) = (uint32_t)pin; +} + +/*! + \brief reset GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_bit_reset(uint32_t gpio_periph,uint32_t pin) +{ + GPIO_BC(gpio_periph) = (uint32_t)pin; +} + +/*! + \brief write data to the specified GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[in] bit_value: SET or RESET + \arg RESET: clear the port pin + \arg SET: set the port pin + \param[out] none + \retval none +*/ +void gpio_bit_write(uint32_t gpio_periph,uint32_t pin,bit_status bit_value) +{ + if(RESET != bit_value){ + GPIO_BOP(gpio_periph) = (uint32_t)pin; + }else{ + GPIO_BC(gpio_periph) = (uint32_t)pin; + } +} + +/*! + \brief write data to the specified GPIO port + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G) + \param[in] data: specify the value to be written to the port output data register + \param[out] none + \retval none +*/ +void gpio_port_write(uint32_t gpio_periph,uint16_t data) +{ + GPIO_OCTL(gpio_periph) = (uint32_t)data; +} + +/*! + \brief get GPIO pin input status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G) + \param[in] pin: GPIO pin + only one parameter can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval input status of gpio pin: SET or RESET +*/ +FlagStatus gpio_input_bit_get(uint32_t gpio_periph,uint32_t pin) +{ + if((uint32_t)RESET != (GPIO_ISTAT(gpio_periph)&(pin))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief get GPIO port input status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G) + \param[out] none + \retval input status of gpio all pins +*/ +uint16_t gpio_input_port_get(uint32_t gpio_periph) +{ + return (uint16_t)(GPIO_ISTAT(gpio_periph)); +} + +/*! + \brief get GPIO pin output status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G) + \param[in] pin: GPIO pin + only one parameter can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval output status of gpio pin: SET or RESET +*/ +FlagStatus gpio_output_bit_get(uint32_t gpio_periph,uint32_t pin) +{ + if((uint32_t)RESET !=(GPIO_OCTL(gpio_periph)&(pin))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief get GPIO port output status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G) + \param[out] none + \retval output status of gpio all pins +*/ +uint16_t gpio_output_port_get(uint32_t gpio_periph) +{ + return ((uint16_t)GPIO_OCTL(gpio_periph)); +} + +/*! + \brief configure GPIO pin remap + \param[in] gpio_remap: select the pin to remap + only one parameter can be selected which are shown as below: + \arg GPIO_SPI0_REMAP: SPI0 remapping + \arg GPIO_I2C0_REMAP: I2C0 remapping + \arg GPIO_USART0_REMAP: USART0 remapping + \arg GPIO_USART1_REMAP: USART1 remapping + \arg GPIO_USART2_PARTIAL_REMAP: USART2 partial remapping + \arg GPIO_USART2_FULL_REMAP: USART2 full remapping + \arg GPIO_TIMER0_PARTIAL_REMAP: TIMER0 partial remapping + \arg GPIO_TIMER0_FULL_REMAP: TIMER0 full remapping + \arg GPIO_TIMER1_PARTIAL_REMAP0: TIMER1 partial remapping + \arg GPIO_TIMER1_PARTIAL_REMAP1: TIMER1 partial remapping + \arg GPIO_TIMER1_FULL_REMAP: TIMER1 full remapping + \arg GPIO_TIMER2_PARTIAL_REMAP: TIMER2 partial remapping + \arg GPIO_TIMER2_FULL_REMAP: TIMER2 full remapping + \arg GPIO_TIMER3_REMAP: TIMER3 remapping + \arg GPIO_CAN_PARTIAL_REMAP: CAN partial remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) + \arg GPIO_CAN_FULL_REMAP: CAN full remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) + \arg GPIO_CAN0_PARTIAL_REMAP: CAN0 partial remapping(only for GD32F30X_CL devices) + \arg GPIO_CAN0_FULL_REMAP: CAN0 full remapping(only for GD32F30X_CL devices) + \arg GPIO_PD01_REMAP: PD01 remapping + \arg GPIO_TIMER4CH3_IREMAP: TIMER4 channel3 internal remapping + \arg GPIO_ADC0_ETRGINS_REMAP: ADC0 external trigger inserted conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) + \arg GPIO_ADC0_ETRGREG_REMAP: ADC0 external trigger regular conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) + \arg GPIO_ADC1_ETRGINS_REMAP: ADC1 external trigger inserted conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) + \arg GPIO_ADC1_ETRGREG_REMAP: ADC1 external trigger regular conversion remapping(only for GD32F30X_HD devices and GD32F30X_XD devices) + \arg GPIO_ENET_REMAP: ENET remapping(only for GD32F30X_CL devices) + \arg GPIO_CAN1_REMAP: CAN1 remapping(only for GD32F30X_CL devices) + \arg GPIO_SWJ_NONJTRST_REMAP: full SWJ(JTAG-DP + SW-DP),but without NJTRST + \arg GPIO_SWJ_SWDPENABLE_REMAP: JTAG-DP disabled and SW-DP enabled + \arg GPIO_SWJ_DISABLE_REMAP: JTAG-DP disabled and SW-DP disabled + \arg GPIO_SPI2_REMAP: SPI2 remapping + \arg GPIO_TIMER1ITR0_REMAP: TIMER1 internal trigger 0 remapping(only for GD32F30X_CL devices) + \arg GPIO_PTP_PPS_REMAP: ethernet PTP PPS remapping(only for GD32F30X_CL devices) + \arg GPIO_TIMER8_REMAP: TIMER8 remapping + \arg GPIO_TIMER9_REMAP: TIMER9 remapping + \arg GPIO_TIMER10_REMAP: TIMER10 remapping + \arg GPIO_TIMER12_REMAP: TIMER12 remapping + \arg GPIO_TIMER13_REMAP: TIMER13 remapping + \arg GPIO_EXMC_NADV_REMAP: EXMC_NADV connect/disconnect + \arg GPIO_CTC_REMAP0: CTC remapping(PD15) + \arg GPIO_CTC_REMAP1: CTC remapping(PF0) + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue) +{ + uint32_t remap1 = 0U, remap2 = 0U, temp_reg = 0U, temp_mask = 0U; + + if(((uint32_t)0x80000000U) == (remap & 0x80000000U)){ + /* get AFIO_PCF1 regiter value */ + temp_reg = AFIO_PCF1; + }else{ + /* get AFIO_PCF0 regiter value */ + temp_reg = AFIO_PCF0; + } + + temp_mask = (remap & PCF_POSITION_MASK) >> 0x10U; + remap1 = remap & LSB_16BIT_MASK; + + /* judge pin remap type */ + if((PCF_LOCATION1_MASK | PCF_LOCATION2_MASK) == (remap & (PCF_LOCATION1_MASK | PCF_LOCATION2_MASK))){ + temp_reg &= PCF_SWJCFG_MASK; + AFIO_PCF0 &= PCF_SWJCFG_MASK; + }else if(PCF_LOCATION2_MASK == (remap & PCF_LOCATION2_MASK)){ + remap2 = ((uint32_t)0x03U) << temp_mask; + temp_reg &= ~remap2; + temp_reg |= ~PCF_SWJCFG_MASK; + }else{ + temp_reg &= ~(remap1 << ((remap >> 0x15U)*0x10U)); + temp_reg |= ~PCF_SWJCFG_MASK; + } + + /* set pin remap value */ + if(DISABLE != newvalue){ + temp_reg |= (remap1 << ((remap >> 0x15U)*0x10U)); + } + + if(AFIO_PCF1_FIELDS == (remap & AFIO_PCF1_FIELDS)){ + /* set AFIO_PCF1 regiter value */ + AFIO_PCF1 = temp_reg; + }else{ + /* set AFIO_PCF0 regiter value */ + AFIO_PCF0 = temp_reg; + } +} + +#ifdef GD32F30X_CL +/*! + \brief select ethernet MII or RMII PHY + \param[in] enet_sel: ethernet MII or RMII PHY selection + \arg GPIO_ENET_PHY_MII: configure ethernet MAC for connection with an MII PHY + \arg GPIO_ENET_PHY_RMII: configure ethernet MAC for connection with an RMII PHY + \param[out] none + \retval none +*/ +void gpio_ethernet_phy_select(uint32_t enet_sel) +{ + /* clear AFIO_PCF0_ENET_PHY_SEL bit */ + AFIO_PCF0 &= (uint32_t)(~AFIO_PCF0_ENET_PHY_SEL); + + /* select MII or RMII PHY */ + AFIO_PCF0 |= (uint32_t)enet_sel; +} +#endif /* GD32F30X_CL */ + +/*! + \brief select GPIO pin exti sources + \param[in] output_port: gpio event output port + only one parameter can be selected which are shown as below: + \arg GPIO_PORT_SOURCE_GPIOA: output port source A + \arg GPIO_PORT_SOURCE_GPIOB: output port source B + \arg GPIO_PORT_SOURCE_GPIOC: output port source C + \arg GPIO_PORT_SOURCE_GPIOD: output port source D + \arg GPIO_PORT_SOURCE_GPIOE: output port source E + \arg GPIO_PORT_SOURCE_GPIOF: output port source F + \arg GPIO_PORT_SOURCE_GPIOG: output port source G + \param[in] output_pin: GPIO output pin source + only one parameter can be selected which are shown as below: + \arg GPIO_PIN_SOURCE_x(x=0..15) + \param[out] none + \retval none +*/ +void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin) +{ + uint32_t source = 0U; + source = ((uint32_t)0x0FU) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK)); + + /* select EXTI sources */ + if(GPIO_PIN_SOURCE_4 > output_pin){ + /* select EXTI0/EXTI1/EXTI2/EXTI3 */ + AFIO_EXTISS0 &= ~source; + AFIO_EXTISS0 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK))); + }else if(GPIO_PIN_SOURCE_8 > output_pin){ + /* select EXTI4/EXTI5/EXTI6/EXTI7 */ + AFIO_EXTISS1 &= ~source; + AFIO_EXTISS1 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK))); + }else if(GPIO_PIN_SOURCE_12 > output_pin){ + /* select EXTI8/EXTI9/EXTI10/EXTI11 */ + AFIO_EXTISS2 &= ~source; + AFIO_EXTISS2 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK))); + }else{ + /* select EXTI12/EXTI13/EXTI14/EXTI15 */ + AFIO_EXTISS3 &= ~source; + AFIO_EXTISS3 |= (((uint32_t)output_port) << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK))); + } +} + +/*! + \brief configure GPIO pin event output + \param[in] output_port: gpio event output port + only one parameter can be selected which are shown as below: + \arg GPIO_EVENT_PORT_GPIOA: event output port A + \arg GPIO_EVENT_PORT_GPIOB: event output port B + \arg GPIO_EVENT_PORT_GPIOC: event output port C + \arg GPIO_EVENT_PORT_GPIOD: event output port D + \arg GPIO_EVENT_PORT_GPIOE: event output port E + \param[in] output_pin: GPIO event output pin + only one parameter can be selected which are shown as below: + \arg GPIO_EVENT_PIN_x(x=0..15) + \param[out] none + \retval none +*/ +void gpio_event_output_config(uint8_t output_port, uint8_t output_pin) +{ + uint32_t reg = 0U; + reg = AFIO_EC; + + /* clear AFIO_EC_PORT and AFIO_EC_PIN bits */ + reg &= (uint32_t)(~(AFIO_EC_PORT|AFIO_EC_PIN)); + + reg |= (uint32_t)((uint32_t)output_port << GPIO_OUTPUT_PORT_OFFSET); + reg |= (uint32_t)output_pin; + + AFIO_EC = reg; +} + +/*! + \brief enable GPIO pin event output + \param[in] none + \param[out] none + \retval none +*/ +void gpio_event_output_enable(void) +{ + AFIO_EC |= AFIO_EC_EOE; +} + +/*! + \brief disable GPIO pin event output + \param[in] none + \param[out] none + \retval none +*/ +void gpio_event_output_disable(void) +{ + AFIO_EC &= (uint32_t)(~AFIO_EC_EOE); +} + +/*! + \brief lock GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E,F,G) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_pin_lock(uint32_t gpio_periph,uint32_t pin) +{ + uint32_t lock = 0x00010000U; + lock |= pin; + + /* lock key writing sequence: write 1 -> write 0 -> write 1 -> read 0 -> read 1 */ + GPIO_LOCK(gpio_periph) = (uint32_t)lock; + GPIO_LOCK(gpio_periph) = (uint32_t)pin; + GPIO_LOCK(gpio_periph) = (uint32_t)lock; + lock = GPIO_LOCK(gpio_periph); + lock = GPIO_LOCK(gpio_periph); +} + +/*! + \brief configure the I/O compensation cell + \param[in] compensation: specifies the I/O compensation cell mode + only one parameter can be selected which are shown as below: + \arg GPIO_COMPENSATION_ENABLE: I/O compensation cell is enabled + \arg GPIO_COMPENSATION_DISABLE: I/O compensation cell is disabled + \param[out] none + \retval none +*/ +void gpio_compensation_config(uint32_t compensation) +{ + uint32_t reg; + reg = AFIO_CPSCTL; + + /* reset the AFIO_CPSCTL_CPS_EN bit and set according to gpio_compensation */ + reg &= ~AFIO_CPSCTL_CPS_EN; + AFIO_CPSCTL = (reg | compensation); +} + +/*! + \brief check the I/O compensation cell is ready or not + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET + */ +FlagStatus gpio_compensation_flag_get(void) +{ + if(((uint32_t)RESET) != (AFIO_CPSCTL & AFIO_CPSCTL_CPS_RDY)){ + return SET; + }else{ + return RESET; + } +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_i2c.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_i2c.c new file mode 100644 index 0000000..b2f7103 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_i2c.c @@ -0,0 +1,737 @@ +/*! + \file gd32f30x_i2c.c + \brief I2C driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2019-04-16, V2.0.1, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_i2c.h" + +#define I2C_ERROR_HANDLE(s) do{}while(1) + +#define I2CCLK_MAX ((uint32_t)0x0000003CU) /*!< i2cclk maximum value */ +#define I2CCLK_MIN ((uint32_t)0x00000002U) /*!< i2cclk minimum value */ +#define I2C_FLAG_MASK ((uint32_t)0x0000FFFFU) /*!< i2c flag mask */ +#define I2C_ADDRESS_MASK ((uint32_t)0x000003FFU) /*!< i2c address mask */ +#define I2C_ADDRESS2_MASK ((uint32_t)0x000000FEU) /*!< the second i2c address mask */ + +/* I2C register bit offset */ +#define STAT1_PECV_OFFSET ((uint32_t)8U) /* bit offset of PECV in I2C_STAT1 */ + +/*! + \brief reset I2C + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none +*/ +void i2c_deinit(uint32_t i2c_periph) +{ + switch(i2c_periph){ + case I2C0: + /* reset I2C0 */ + rcu_periph_reset_enable(RCU_I2C0RST); + rcu_periph_reset_disable(RCU_I2C0RST); + break; + case I2C1: + /* reset I2C1 */ + rcu_periph_reset_enable(RCU_I2C1RST); + rcu_periph_reset_disable(RCU_I2C1RST); + break; + default: + break; + } +} + +/*! + \brief configure I2C clock + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] clkspeed: I2C clock speed, supports standard mode (up to 100 kHz), fast mode (up to 400 kHz) + and fast mode plus (up to 1MHz) + \param[in] dutycyc: duty cycle in fast mode or fast mode plus + only one parameter can be selected which is shown as below: + \arg I2C_DTCY_2: T_low/T_high=2 + \arg I2C_DTCY_16_9: T_low/T_high=16/9 + \param[out] none + \retval none +*/ +void i2c_clock_config(uint32_t i2c_periph, uint32_t clkspeed, uint32_t dutycyc) +{ + uint32_t pclk1, clkc, freq, risetime; + uint32_t temp; + + /* check the clkspeed value */ + if(0U == clkspeed){ + I2C_ERROR_HANDLE("the parameter can not be 0 \r\n"); + } + + pclk1 = rcu_clock_freq_get(CK_APB1); + /* I2C peripheral clock frequency */ + freq = (uint32_t)(pclk1/1000000U); + if(freq >= I2CCLK_MAX){ + freq = I2CCLK_MAX; + } + temp = I2C_CTL1(i2c_periph); + temp &= ~I2C_CTL1_I2CCLK; + temp |= freq; + + I2C_CTL1(i2c_periph) = temp; + + if(100000U >= clkspeed){ + /* the maximum SCL rise time is 1000ns in standard mode */ + risetime = (uint32_t)((pclk1/1000000U)+1U); + if(risetime >= I2CCLK_MAX){ + I2C_RT(i2c_periph) = I2CCLK_MAX; + }else if(risetime <= I2CCLK_MIN){ + I2C_RT(i2c_periph) = I2CCLK_MIN; + }else{ + I2C_RT(i2c_periph) = risetime; + } + clkc = (uint32_t)(pclk1/(clkspeed*2U)); + if(clkc < 0x04U){ + /* the CLKC in standard mode minmum value is 4 */ + clkc = 0x04U; + } + I2C_CKCFG(i2c_periph) |= (I2C_CKCFG_CLKC & clkc); + + }else if(400000U >= clkspeed){ + /* the maximum SCL rise time is 300ns in fast mode */ + I2C_RT(i2c_periph) = (uint32_t)(((freq*(uint32_t)300U)/(uint32_t)1000U)+(uint32_t)1U); + if(I2C_DTCY_2 == dutycyc){ + /* I2C duty cycle is 2 */ + clkc = (uint32_t)(pclk1/(clkspeed*3U)); + I2C_CKCFG(i2c_periph) &= ~I2C_CKCFG_DTCY; + }else{ + /* I2C duty cycle is 16/9 */ + clkc = (uint32_t)(pclk1/(clkspeed*25U)); + I2C_CKCFG(i2c_periph) |= I2C_CKCFG_DTCY; + } + if(0U == (clkc & I2C_CKCFG_CLKC)){ + /* the CLKC in fast mode minmum value is 1 */ + clkc |= 0x0001U; + } + I2C_CKCFG(i2c_periph) |= I2C_CKCFG_FAST; + I2C_CKCFG(i2c_periph) |= clkc; + }else{ + /* fast mode plus, the maximum SCL rise time is 120ns */ + I2C_RT(i2c_periph) = (uint32_t)(((freq*(uint32_t)120U)/(uint32_t)1000U)+(uint32_t)1U); + if(I2C_DTCY_2 == dutycyc){ + /* I2C duty cycle is 2 */ + clkc = (uint32_t)(pclk1/(clkspeed*3U)); + I2C_CKCFG(i2c_periph) &= ~I2C_CKCFG_DTCY; + }else{ + /* I2C duty cycle is 16/9 */ + clkc = (uint32_t)(pclk1/(clkspeed*25U)); + I2C_CKCFG(i2c_periph) |= I2C_CKCFG_DTCY; + } + /* enable fast mode */ + I2C_CKCFG(i2c_periph) |= I2C_CKCFG_FAST; + I2C_CKCFG(i2c_periph) |= clkc; + /* enable I2C fast mode plus */ + I2C_FMPCFG(i2c_periph) = I2C_FMPCFG_FMPEN; + } +} + +/*! + \brief configure I2C address + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] mode: + only one parameter can be selected which is shown as below: + \arg I2C_I2CMODE_ENABLE: I2C mode + \arg I2C_SMBUSMODE_ENABLE: SMBus mode + \param[in] addformat: 7bits or 10bits + only one parameter can be selected which is shown as below: + \arg I2C_ADDFORMAT_7BITS: 7bits + \arg I2C_ADDFORMAT_10BITS: 10bits + \param[in] addr: I2C address + \param[out] none + \retval none +*/ +void i2c_mode_addr_config(uint32_t i2c_periph, uint32_t mode, uint32_t addformat, uint32_t addr) +{ + /* SMBus/I2C mode selected */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SMBEN); + ctl |= mode; + I2C_CTL0(i2c_periph) = ctl; + /* configure address */ + addr = addr & I2C_ADDRESS_MASK; + I2C_SADDR0(i2c_periph) = (addformat | addr); +} + +/*! + \brief SMBus type selection + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] type: + only one parameter can be selected which is shown as below: + \arg I2C_SMBUS_DEVICE: device + \arg I2C_SMBUS_HOST: host + \param[out] none + \retval none +*/ +void i2c_smbus_type_config(uint32_t i2c_periph, uint32_t type) +{ + if(I2C_SMBUS_HOST == type){ + I2C_CTL0(i2c_periph) |= I2C_CTL0_SMBSEL; + }else{ + I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_SMBSEL); + } +} + +/*! + \brief whether or not to send an ACK + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] ack: + only one parameter can be selected which is shown as below: + \arg I2C_ACK_ENABLE: ACK will be sent + \arg I2C_ACK_DISABLE: ACK will not be sent + \param[out] none + \retval none +*/ +void i2c_ack_config(uint32_t i2c_periph, uint32_t ack) +{ + if(I2C_ACK_ENABLE == ack){ + I2C_CTL0(i2c_periph) |= I2C_CTL0_ACKEN; + }else{ + I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_ACKEN); + } +} + +/*! + \brief configure I2C POAP position + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] pos: + only one parameter can be selected which is shown as below: + \arg I2C_ACKPOS_CURRENT: whether to send ACK or not for the current + \arg I2C_ACKPOS_NEXT: whether to send ACK or not for the next byte + \param[out] none + \retval none +*/ +void i2c_ackpos_config(uint32_t i2c_periph, uint32_t pos) +{ + /* configure I2C POAP position */ + if(I2C_ACKPOS_NEXT == pos){ + I2C_CTL0(i2c_periph) |= I2C_CTL0_POAP; + }else{ + I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_POAP); + } +} + +/*! + \brief master sends slave address + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] addr: slave address + \param[in] trandirection: transmitter or receiver + only one parameter can be selected which is shown as below: + \arg I2C_TRANSMITTER: transmitter + \arg I2C_RECEIVER: receiver + \param[out] none + \retval none +*/ +void i2c_master_addressing(uint32_t i2c_periph, uint32_t addr, uint32_t trandirection) +{ + /* master is a transmitter or a receiver */ + if(I2C_TRANSMITTER == trandirection){ + addr = addr & I2C_TRANSMITTER; + }else{ + addr = addr | I2C_RECEIVER; + } + /* send slave address */ + I2C_DATA(i2c_periph) = addr; +} + +/*! + \brief enable dual-address mode + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] dualaddr: the second address in dual-address mode + \param[out] none + \retval none +*/ +void i2c_dualaddr_enable(uint32_t i2c_periph, uint32_t dualaddr) +{ + /* configure address */ + dualaddr = dualaddr & I2C_ADDRESS2_MASK; + I2C_SADDR1(i2c_periph) = (I2C_SADDR1_DUADEN | dualaddr); +} + +/*! + \brief disable dual-address mode + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none +*/ +void i2c_dualaddr_disable(uint32_t i2c_periph) +{ + I2C_SADDR1(i2c_periph) &= ~(I2C_SADDR1_DUADEN); +} + +/*! + \brief enable I2C + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none +*/ +void i2c_enable(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) |= I2C_CTL0_I2CEN; +} + +/*! + \brief disable I2C + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none +*/ +void i2c_disable(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_I2CEN); +} + +/*! + \brief generate a START condition on I2C bus + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none +*/ +void i2c_start_on_bus(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) |= I2C_CTL0_START; +} + +/*! + \brief generate a STOP condition on I2C bus + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none +*/ +void i2c_stop_on_bus(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) |= I2C_CTL0_STOP; +} + +/*! + \brief I2C transmit data function + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] data: data of transmission + \param[out] none + \retval none +*/ +void i2c_data_transmit(uint32_t i2c_periph, uint8_t data) +{ + I2C_DATA(i2c_periph) = DATA_TRANS(data); +} + +/*! + \brief I2C receive data function + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval data of received +*/ +uint8_t i2c_data_receive(uint32_t i2c_periph) +{ + return (uint8_t)DATA_RECV(I2C_DATA(i2c_periph)); +} + +/*! + \brief enable I2C DMA mode + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] dmastate: + only one parameter can be selected which is shown as below: + \arg I2C_DMA_ON: DMA mode enable + \arg I2C_DMA_OFF: DMA mode disable + \param[out] none + \retval none +*/ +void i2c_dma_enable(uint32_t i2c_periph, uint32_t dmastate) +{ + /* configure I2C DMA function */ + uint32_t ctl = 0U; + + ctl = I2C_CTL1(i2c_periph); + ctl &= ~(I2C_CTL1_DMAON); + ctl |= dmastate; + I2C_CTL1(i2c_periph) = ctl; +} + +/*! + \brief configure whether next DMA EOT is DMA last transfer or not + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] dmalast: + only one parameter can be selected which is shown as below: + \arg I2C_DMALST_ON: next DMA EOT is the last transfer + \arg I2C_DMALST_OFF: next DMA EOT is not the last transfer + \param[out] none + \retval none +*/ +void i2c_dma_last_transfer_config(uint32_t i2c_periph, uint32_t dmalast) +{ + /* configure DMA last transfer */ + uint32_t ctl = 0U; + + ctl = I2C_CTL1(i2c_periph); + ctl &= ~(I2C_CTL1_DMALST); + ctl |= dmalast; + I2C_CTL1(i2c_periph) = ctl; +} + +/*! + \brief whether to stretch SCL low when data is not ready in slave mode + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] stretchpara: + only one parameter can be selected which is shown as below: + \arg I2C_SCLSTRETCH_ENABLE: SCL stretching is enabled + \arg I2C_SCLSTRETCH_DISABLE: SCL stretching is disabled + \param[out] none + \retval none +*/ +void i2c_stretch_scl_low_config(uint32_t i2c_periph, uint32_t stretchpara) +{ + /* configure I2C SCL strerching enable or disable */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SS); + ctl |= stretchpara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief whether or not to response to a general call + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] gcallpara: + only one parameter can be selected which is shown as below: + \arg I2C_GCEN_ENABLE: slave will response to a general call + \arg I2C_GCEN_DISABLE: slave will not response to a general call + \param[out] none + \retval none +*/ +void i2c_slave_response_to_gcall_config(uint32_t i2c_periph, uint32_t gcallpara) +{ + /* configure slave response to a general call enable or disable */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_GCEN); + ctl |= gcallpara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief software reset I2C + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] sreset: + only one parameter can be selected which is shown as below: + \arg I2C_SRESET_SET: I2C is under reset + \arg I2C_SRESET_RESET: I2C is not under reset + \param[out] none + \retval none +*/ +void i2c_software_reset_config(uint32_t i2c_periph, uint32_t sreset) +{ + /* modify CTL0 and configure software reset I2C state */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SRESET); + ctl |= sreset; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief I2C PEC calculation on or off + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] pecpara: + only one parameter can be selected which is shown as below: + \arg I2C_PEC_ENABLE: PEC calculation on + \arg I2C_PEC_DISABLE: PEC calculation off + \param[out] none + \retval none +*/ +void i2c_pec_enable(uint32_t i2c_periph, uint32_t pecstate) +{ + /* on/off PEC calculation */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_PECEN); + ctl |= pecstate; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief I2C whether to transfer PEC value + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] pecpara: + only one parameter can be selected which is shown as below: + \arg I2C_PECTRANS_ENABLE: transfer PEC + \arg I2C_PECTRANS_DISABLE: not transfer PEC + \param[out] none + \retval none +*/ +void i2c_pec_transfer_enable(uint32_t i2c_periph, uint32_t pecpara) +{ + /* whether to transfer PEC */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_PECTRANS); + ctl |= pecpara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief get packet error checking value + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval PEC value +*/ +uint8_t i2c_pec_value_get(uint32_t i2c_periph) +{ + return (uint8_t)((I2C_STAT1(i2c_periph) & I2C_STAT1_PECV)>>STAT1_PECV_OFFSET); +} + +/*! + \brief I2C issue alert through SMBA pin + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] smbuspara: + only one parameter can be selected which is shown as below: + \arg I2C_SALTSEND_ENABLE: issue alert through SMBA pin + \arg I2C_SALTSEND_DISABLE: not issue alert through SMBA pin + \param[out] none + \retval none +*/ +void i2c_smbus_issue_alert(uint32_t i2c_periph, uint32_t smbuspara) +{ + /* issue alert through SMBA pin configure*/ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SALT); + ctl |= smbuspara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief enable or disable I2C ARP protocol in SMBus switch + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] smbuspara: + only one parameter can be selected which is shown as below: + \arg I2C_ARP_ENABLE: enable ARP + \arg I2C_ARP_DISABLE: disable ARP + \param[out] none + \retval none +*/ +void i2c_smbus_arp_enable(uint32_t i2c_periph, uint32_t arpstate) +{ + /* enable or disable I2C ARP protocol*/ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_ARPEN); + ctl |= arpstate; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief check I2C flag is set or not + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] flag: I2C flags, refer to i2c_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_FLAG_SBSEND: start condition send out + \arg I2C_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode + \arg I2C_FLAG_BTC: byte transmission finishes + \arg I2C_FLAG_ADD10SEND: header of 10-bit address is sent in master mode + \arg I2C_FLAG_STPDET: stop condition detected in slave mode + \arg I2C_FLAG_RBNE: I2C_DATA is not Empty during receiving + \arg I2C_FLAG_TBE: I2C_DATA is empty during transmitting + \arg I2C_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus + \arg I2C_FLAG_LOSTARB: arbitration lost in master mode + \arg I2C_FLAG_AERR: acknowledge error + \arg I2C_FLAG_OUERR: overrun or underrun situation occurs in slave mode + \arg I2C_FLAG_PECERR: PEC error when receiving data + \arg I2C_FLAG_SMBTO: timeout signal in SMBus mode + \arg I2C_FLAG_SMBALT: SMBus alert status + \arg I2C_FLAG_MASTER: a flag indicating whether I2C block is in master or slave mode + \arg I2C_FLAG_I2CBSY: busy flag + \arg I2C_FLAG_TRS: whether the I2C is a transmitter or a receiver + \arg I2C_FLAG_RXGC: general call address (00h) received + \arg I2C_FLAG_DEFSMB: default address of SMBus device + \arg I2C_FLAG_HSTSMB: SMBus host header detected in slave mode + \arg I2C_FLAG_DUMOD: dual flag in slave mode indicating which address is matched in dual-address mode + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus i2c_flag_get(uint32_t i2c_periph, i2c_flag_enum flag) +{ + if(RESET != (I2C_REG_VAL(i2c_periph, flag) & BIT(I2C_BIT_POS(flag)))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear I2C flag + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] flag: I2C flags, refer to i2c_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_FLAG_SMBALT: SMBus Alert status + \arg I2C_FLAG_SMBTO: timeout signal in SMBus mode + \arg I2C_FLAG_PECERR: PEC error when receiving data + \arg I2C_FLAG_OUERR: over-run or under-run situation occurs in slave mode + \arg I2C_FLAG_AERR: acknowledge error + \arg I2C_FLAG_LOSTARB: arbitration lost in master mode + \arg I2C_FLAG_BERR: a bus error + \arg I2C_FLAG_ADDSEND: cleared by reading I2C_STAT0 and reading I2C_STAT1 + \param[out] none + \retval none +*/ +void i2c_flag_clear(uint32_t i2c_periph, i2c_flag_enum flag) +{ + if(I2C_FLAG_ADDSEND == flag){ + /* read I2C_STAT0 and then read I2C_STAT1 to clear ADDSEND */ + I2C_STAT0(i2c_periph); + I2C_STAT1(i2c_periph); + }else{ + I2C_REG_VAL(i2c_periph, flag) &= ~BIT(I2C_BIT_POS(flag)); + } +} + +/*! + \brief enable I2C interrupt + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] interrupt: I2C interrupts, refer to i2c_interrupt_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_ERR: error interrupt enable + \arg I2C_INT_EV: event interrupt enable + \arg I2C_INT_BUF: buffer interrupt enable + \param[out] none + \retval none +*/ +void i2c_interrupt_enable(uint32_t i2c_periph, i2c_interrupt_enum interrupt) +{ + I2C_REG_VAL(i2c_periph, interrupt) |= BIT(I2C_BIT_POS(interrupt)); +} + +/*! + \brief disable I2C interrupt + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] interrupt: I2C interrupts, refer to i2c_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_ERR: error interrupt enable + \arg I2C_INT_EV: event interrupt enable + \arg I2C_INT_BUF: buffer interrupt enable + \param[out] none + \retval none +*/ +void i2c_interrupt_disable(uint32_t i2c_periph, i2c_interrupt_enum interrupt) +{ + I2C_REG_VAL(i2c_periph, interrupt) &= ~BIT(I2C_BIT_POS(interrupt)); +} + +/*! + \brief check I2C interrupt flag + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] int_flag: I2C interrupt flags, refer to i2c_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_FLAG_SBSEND: start condition sent out in master mode interrupt flag + \arg I2C_INT_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode interrupt flag + \arg I2C_INT_FLAG_BTC: byte transmission finishes + \arg I2C_INT_FLAG_ADD10SEND: header of 10-bit address is sent in master mode interrupt flag + \arg I2C_INT_FLAG_STPDET: etop condition detected in slave mode interrupt flag + \arg I2C_INT_FLAG_RBNE: I2C_DATA is not Empty during receiving interrupt flag + \arg I2C_INT_FLAG_TBE: I2C_DATA is empty during transmitting interrupt flag + \arg I2C_INT_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag + \arg I2C_INT_FLAG_LOSTARB: arbitration lost in master mode interrupt flag + \arg I2C_INT_FLAG_AERR: acknowledge error interrupt flag + \arg I2C_INT_FLAG_OUERR: over-run or under-run situation occurs in slave mode interrupt flag + \arg I2C_INT_FLAG_PECERR: PEC error when receiving data interrupt flag + \arg I2C_INT_FLAG_SMBTO: timeout signal in SMBus mode interrupt flag + \arg I2C_INT_FLAG_SMBALT: SMBus Alert status interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus i2c_interrupt_flag_get(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag) +{ + uint32_t intenable = 0U, flagstatus = 0U, bufie; + + /* check BUFIE */ + bufie = I2C_CTL1(i2c_periph)&I2C_CTL1_BUFIE; + + /* get the interrupt enable bit status */ + intenable = (I2C_REG_VAL(i2c_periph, int_flag) & BIT(I2C_BIT_POS(int_flag))); + /* get the corresponding flag bit status */ + flagstatus = (I2C_REG_VAL2(i2c_periph, int_flag) & BIT(I2C_BIT_POS2(int_flag))); + + if((I2C_INT_FLAG_RBNE == int_flag) || (I2C_INT_FLAG_TBE == int_flag)){ + if(intenable && bufie){ + intenable = 1U; + }else{ + intenable = 0U; + } + } + if((0U != flagstatus) && (0U != intenable)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear I2C interrupt flag + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] intflag: I2C interrupt flags, refer to i2c_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode interrupt flag + \arg I2C_INT_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag + \arg I2C_INT_FLAG_LOSTARB: arbitration lost in master mode interrupt flag + \arg I2C_INT_FLAG_AERR: acknowledge error interrupt flag + \arg I2C_INT_FLAG_OUERR: over-run or under-run situation occurs in slave mode interrupt flag + \arg I2C_INT_FLAG_PECERR: PEC error when receiving data interrupt flag + \arg I2C_INT_FLAG_SMBTO: timeout signal in SMBus mode interrupt flag + \arg I2C_INT_FLAG_SMBALT: SMBus Alert status interrupt flag + \param[out] none + \retval none +*/ +void i2c_interrupt_flag_clear(uint32_t i2c_periph, i2c_interrupt_flag_enum int_flag) +{ + if(I2C_INT_FLAG_ADDSEND == int_flag){ + /* read I2C_STAT0 and then read I2C_STAT1 to clear ADDSEND */ + I2C_STAT0(i2c_periph); + I2C_STAT1(i2c_periph); + }else{ + I2C_REG_VAL2(i2c_periph, int_flag) &= ~BIT(I2C_BIT_POS2(int_flag)); + } +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_misc.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_misc.c new file mode 100644 index 0000000..a90e87e --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_misc.c @@ -0,0 +1,176 @@ +/*! + \file gd32f30x_misc.c + \brief MISC driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_misc.h" + +/*! + \brief set the priority group + \param[in] nvic_prigroup: the NVIC priority group + \arg NVIC_PRIGROUP_PRE0_SUB4:0 bits for pre-emption priority 4 bits for subpriority + \arg NVIC_PRIGROUP_PRE1_SUB3:1 bits for pre-emption priority 3 bits for subpriority + \arg NVIC_PRIGROUP_PRE2_SUB2:2 bits for pre-emption priority 2 bits for subpriority + \arg NVIC_PRIGROUP_PRE3_SUB1:3 bits for pre-emption priority 1 bits for subpriority + \arg NVIC_PRIGROUP_PRE4_SUB0:4 bits for pre-emption priority 0 bits for subpriority + \param[out] none + \retval none +*/ +void nvic_priority_group_set(uint32_t nvic_prigroup) +{ + /* set the priority group value */ + SCB->AIRCR = NVIC_AIRCR_VECTKEY_MASK | nvic_prigroup; +} + +/*! + \brief enable NVIC request + \param[in] nvic_irq: the NVIC interrupt request, detailed in IRQn_Type + \param[in] nvic_irq_pre_priority: the pre-emption priority needed to set + \param[in] nvic_irq_sub_priority: the subpriority needed to set + \param[out] none + \retval none +*/ +void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, + uint8_t nvic_irq_sub_priority) +{ + uint32_t temp_priority = 0x00U, temp_pre = 0x00U, temp_sub = 0x00U; + /* use the priority group value to get the temp_pre and the temp_sub */ + if(((SCB->AIRCR) & (uint32_t)0x700U)==NVIC_PRIGROUP_PRE0_SUB4){ + temp_pre=0U; + temp_sub=0x4U; + }else if(((SCB->AIRCR) & (uint32_t)0x700U)==NVIC_PRIGROUP_PRE1_SUB3){ + temp_pre=1U; + temp_sub=0x3U; + }else if(((SCB->AIRCR) & (uint32_t)0x700U)==NVIC_PRIGROUP_PRE2_SUB2){ + temp_pre=2U; + temp_sub=0x2U; + }else if(((SCB->AIRCR) & (uint32_t)0x700U)==NVIC_PRIGROUP_PRE3_SUB1){ + temp_pre=3U; + temp_sub=0x1U; + }else if(((SCB->AIRCR) & (uint32_t)0x700U)==NVIC_PRIGROUP_PRE4_SUB0){ + temp_pre=4U; + temp_sub=0x0U; + }else{ + nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); + temp_pre=2U; + temp_sub=0x2U; + } + /* get the temp_priority to fill the NVIC->IP register */ + temp_priority = (uint32_t)nvic_irq_pre_priority << (0x4U - temp_pre); + temp_priority |= nvic_irq_sub_priority &(0x0FU >> (0x4U - temp_sub)); + temp_priority = temp_priority << 0x04U; + NVIC->IP[nvic_irq] = (uint8_t)temp_priority; + /* enable the selected IRQ */ + NVIC->ISER[nvic_irq >> 0x05U] = (uint32_t)0x01U << (nvic_irq & (uint8_t)0x1FU); +} + +/*! + \brief disable NVIC request + \param[in] nvic_irq: the NVIC interrupt request, detailed in IRQn_Type + \param[out] none + \retval none +*/ +void nvic_irq_disable(uint8_t nvic_irq) +{ + /* disable the selected IRQ.*/ + NVIC->ICER[nvic_irq >> 0x05] = (uint32_t)0x01 << (nvic_irq & (uint8_t)0x1F); +} + +/*! + \brief set the NVIC vector table base address + \param[in] nvic_vict_tab: the RAM or FLASH base address + \arg NVIC_VECTTAB_RAM: RAM base address + \are NVIC_VECTTAB_FLASH: Flash base address + \param[in] offset: Vector Table offset + \param[out] none + \retval none +*/ +void nvic_vector_table_set(uint32_t nvic_vict_tab, uint32_t offset) +{ + SCB->VTOR = nvic_vict_tab | (offset & NVIC_VECTTAB_OFFSET_MASK); + __DSB(); +} + +/*! + \brief set the state of the low power mode + \param[in] lowpower_mode: the low power mode state + \arg SCB_LPM_SLEEP_EXIT_ISR: if chose this para, the system always enter low power + mode by exiting from ISR + \arg SCB_LPM_DEEPSLEEP: if chose this para, the system will enter the DEEPSLEEP mode + \arg SCB_LPM_WAKE_BY_ALL_INT: if chose this para, the lowpower mode can be woke up + by all the enable and disable interrupts + \param[out] none + \retval none +*/ +void system_lowpower_set(uint8_t lowpower_mode) +{ + SCB->SCR |= (uint32_t)lowpower_mode; +} + +/*! + \brief reset the state of the low power mode + \param[in] lowpower_mode: the low power mode state + \arg SCB_LPM_SLEEP_EXIT_ISR: if chose this para, the system will exit low power + mode by exiting from ISR + \arg SCB_LPM_DEEPSLEEP: if chose this para, the system will enter the SLEEP mode + \arg SCB_LPM_WAKE_BY_ALL_INT: if chose this para, the lowpower mode only can be + woke up by the enable interrupts + \param[out] none + \retval none +*/ +void system_lowpower_reset(uint8_t lowpower_mode) +{ + SCB->SCR &= (~(uint32_t)lowpower_mode); +} + +/*! + \brief set the systick clock source + \param[in] systick_clksource: the systick clock source needed to choose + \arg SYSTICK_CLKSOURCE_HCLK: systick clock source is from HCLK + \arg SYSTICK_CLKSOURCE_HCLK_DIV8: systick clock source is from HCLK/8 + \param[out] none + \retval none +*/ + +void systick_clksource_set(uint32_t systick_clksource) +{ + if(SYSTICK_CLKSOURCE_HCLK == systick_clksource ){ + /* set the systick clock source from HCLK */ + SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; + }else{ + /* set the systick clock source from HCLK/8 */ + SysTick->CTRL &= SYSTICK_CLKSOURCE_HCLK_DIV8; + } +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_pmu.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_pmu.c new file mode 100644 index 0000000..5c9be20 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_pmu.c @@ -0,0 +1,401 @@ +/*! + \file gd32f30x_pmu.c + \brief PMU driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#include "gd32f30x_pmu.h" + +/*! + \brief reset PMU register + \param[in] none + \param[out] none + \retval none +*/ +void pmu_deinit(void) +{ + /* reset PMU */ + rcu_periph_reset_enable(RCU_PMURST); + rcu_periph_reset_disable(RCU_PMURST); +} + +/*! + \brief select low voltage detector threshold + \param[in] lvdt_n: + \arg PMU_LVDT_0: voltage threshold is 2.1V + \arg PMU_LVDT_1: voltage threshold is 2.3V + \arg PMU_LVDT_2: voltage threshold is 2.4V + \arg PMU_LVDT_3: voltage threshold is 2.6V + \arg PMU_LVDT_4: voltage threshold is 2.7V + \arg PMU_LVDT_5: voltage threshold is 2.9V + \arg PMU_LVDT_6: voltage threshold is 3.0V + \arg PMU_LVDT_7: voltage threshold is 3.1V + \param[out] none + \retval none +*/ +void pmu_lvd_select(uint32_t lvdt_n) +{ + /* disable LVD */ + PMU_CTL &= ~PMU_CTL_LVDEN; + /* clear LVDT bits */ + PMU_CTL &= ~PMU_CTL_LVDT; + /* set LVDT bits according to lvdt_n */ + PMU_CTL |= lvdt_n; + /* enable LVD */ + PMU_CTL |= PMU_CTL_LVDEN; +} + +/*! + \brief select LDO output voltage + this bit set by software when the main PLL closed, before closing PLL, change the system clock to IRC16M or HXTAL + \param[in] ldo_output: + \arg PMU_LDOVS_LOW: LDO output voltage low mode + \arg PMU_LDOVS_MID: LDO output voltage mid mode + \arg PMU_LDOVS_HIGH: LDO output voltage high mode + \param[out] none + \retval none +*/ +void pmu_ldo_output_select(uint32_t ldo_output) +{ + PMU_CTL &= ~PMU_CTL_LDOVS; + PMU_CTL |= ldo_output; +} + +/*! + \brief disable PMU lvd + \param[in] none + \param[out] none + \retval none +*/ +void pmu_lvd_disable(void) +{ + /* disable LVD */ + PMU_CTL &= ~PMU_CTL_LVDEN; +} + +/*! + \brief switch high-driver mode + this bit set by software only when IRC16M or HXTAL used as system clock + \param[in] highdr_switch: + \arg PMU_HIGHDR_SWITCH_NONE: disable high-driver mode switch + \arg PMU_HIGHDR_SWITCH_EN: enable high-driver mode switch + \param[out] none + \retval none +*/ +void pmu_highdriver_switch_select(uint32_t highdr_switch) +{ + /* wait for HDRF flag set */ + while(SET != pmu_flag_get(PMU_FLAG_HDRF)){ + } + PMU_CTL &= ~PMU_CTL_HDS; + PMU_CTL |= highdr_switch; +} + +/*! + \brief enable high-driver mode + this bit set by software only when IRC16M or HXTAL used as system clock + \param[in] none + \param[out] none + \retval none +*/ +void pmu_highdriver_mode_enable(void) +{ + PMU_CTL |= PMU_CTL_HDEN; +} + +/*! + \brief disable high-driver mode + \param[in] none + \param[out] none + \retval none +*/ +void pmu_highdriver_mode_disable(void) +{ + PMU_CTL &= ~PMU_CTL_HDEN; +} + +/*! + \brief enable low-driver mode in deep-sleep mode + \param[in] none + \param[out] none + \retval none +*/ +void pmu_lowdriver_mode_enable(void) +{ + PMU_CTL |= PMU_CTL_LDEN; +} + +/*! + \brief disable low-driver mode in deep-sleep mode + \param[in] none + \param[out] none + \retval none +*/ +void pmu_lowdriver_mode_disable(void) +{ + PMU_CTL &= ~PMU_CTL_LDEN; +} + +/*! + \brief driver mode when use low power LDO + \param[in] mode: + \arg PMU_NORMALDR_LOWPWR: normal driver when use low power LDO + \arg PMU_LOWDR_LOWPWR: low-driver mode enabled when LDEN is 11 and use low power LDO + \param[out] none + \retval none +*/ +void pmu_lowpower_driver_config(uint32_t mode) +{ + PMU_CTL &= ~PMU_CTL_LDLP; + PMU_CTL |= mode; +} + +/*! + \brief driver mode when use normal power LDO + \param[in] mode: + \arg PMU_NORMALDR_NORMALPWR: normal driver when use normal power LDO + \arg PMU_LOWDR_NORMALPWR: low-driver mode enabled when LDEN is 11 and use normal power LDO + \param[out] none + \retval none +*/ +void pmu_normalpower_driver_config(uint32_t mode) +{ + PMU_CTL &= ~PMU_CTL_LDNP; + PMU_CTL |= mode; +} + +/*! + \brief PMU work in sleep mode + \param[in] sleepmodecmd: + \arg WFI_CMD: use WFI command + \arg WFE_CMD: use WFE command + \param[out] none + \retval none +*/ +void pmu_to_sleepmode(uint8_t sleepmodecmd) +{ + /* clear sleepdeep bit of Cortex-M4 system control register */ + SCB->SCR &= ~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); + + /* select WFI or WFE command to enter sleep mode */ + if(WFI_CMD == sleepmodecmd){ + __WFI(); + }else{ + __WFE(); + } +} + +/*! + \brief PMU work in deepsleep mode + \param[in] ldo: + only one parameter can be selected which is shown as below: + \arg PMU_LDO_NORMAL: LDO normal work when pmu enter deepsleep mode + \arg PMU_LDO_LOWPOWER: LDO work in low power mode when pmu enter deepsleep mode + \param[in] lowdrive: + only one parameter can be selected which is shown as below: + \arg PMU_LOWDRIVER_ENABLE: low-driver mode enable in deep-sleep mode + \arg PMU_LOWDRIVER_DISABLE: low-driver mode disable in deep-sleep mode + \param[in] deepsleepmodecmd: + only one parameter can be selected which is shown as below: + \arg WFI_CMD: use WFI command + \arg WFE_CMD: use WFE command + \param[out] none + \retval none +*/ +void pmu_to_deepsleepmode(uint32_t ldo, uint32_t lowdrive, uint8_t deepsleepmodecmd) +{ + static uint32_t reg_snap[ 4 ]; + /* clear stbmod and ldolp bits */ + PMU_CTL &= ~((uint32_t)(PMU_CTL_STBMOD | PMU_CTL_LDOLP | PMU_CTL_LDEN | PMU_CTL_LDNP | PMU_CTL_LDLP)); + + /* set ldolp bit according to pmu_ldo */ + PMU_CTL |= ldo; + + /* low drive mode config in deep-sleep mode */ + if(PMU_LOWDRIVER_ENABLE == lowdrive){ + if(PMU_LDO_NORMAL == ldo){ + PMU_CTL |= (uint32_t)(PMU_CTL_LDEN | PMU_CTL_LDNP); + }else{ + PMU_CTL |= (uint32_t)(PMU_CTL_LDEN | PMU_CTL_LDLP); + } + } + + /* set sleepdeep bit of Cortex-M4 system control register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + reg_snap[ 0 ] = REG32( 0xE000E010U ); + reg_snap[ 1 ] = REG32( 0xE000E100U ); + reg_snap[ 2 ] = REG32( 0xE000E104U ); + reg_snap[ 3 ] = REG32( 0xE000E108U ); + + REG32( 0xE000E010U ) &= 0x00010004U; + REG32( 0xE000E180U ) = 0XFF7FF83DU; + REG32( 0xE000E184U ) = 0XFFFFF8FFU; + REG32( 0xE000E188U ) = 0xFFFFFFFFU; + + /* select WFI or WFE command to enter deepsleep mode */ + if(WFI_CMD == deepsleepmodecmd){ + __WFI(); + }else{ + __SEV(); + __WFE(); + __WFE(); + } + + REG32( 0xE000E010U ) = reg_snap[ 0 ] ; + REG32( 0xE000E100U ) = reg_snap[ 1 ] ; + REG32( 0xE000E104U ) = reg_snap[ 2 ] ; + REG32( 0xE000E108U ) = reg_snap[ 3 ] ; + + /* reset sleepdeep bit of Cortex-M4 system control register */ + SCB->SCR &= ~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); +} + +/*! + \brief pmu work in standby mode + \param[in] standbymodecmd: + \arg WFI_CMD: use WFI command + \arg WFE_CMD: use WFE command + \param[out] none + \retval none +*/ +void pmu_to_standbymode(uint8_t standbymodecmd) +{ + /* set sleepdeep bit of Cortex-M4 system control register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + /* set stbmod bit */ + PMU_CTL |= PMU_CTL_STBMOD; + + /* reset wakeup flag */ + PMU_CTL |= PMU_CTL_WURST; + + /* select WFI or WFE command to enter standby mode */ + if(WFI_CMD == standbymodecmd){ + __WFI(); + }else{ + __WFE(); + } +} + +/*! + \brief enable backup domain write + \param[in] none + \param[out] none + \retval none +*/ +void pmu_backup_write_enable(void) +{ + PMU_CTL |= PMU_CTL_BKPWEN; +} + +/*! + \brief disable backup domain write + \param[in] none + \param[out] none + \retval none +*/ +void pmu_backup_write_disable(void) +{ + PMU_CTL &= ~PMU_CTL_BKPWEN; +} + +/*! + \brief enable wakeup pin + \param[in] none + \param[out] none + \retval none +*/ +void pmu_wakeup_pin_enable(void) +{ + PMU_CS |= PMU_CS_WUPEN; +} + +/*! + \brief disable wakeup pin + \param[in] none + \param[out] none + \retval none +*/ +void pmu_wakeup_pin_disable(void) +{ + PMU_CS &= ~PMU_CS_WUPEN; +} + +/*! + \brief get flag state + \param[in] flag: + \arg PMU_FLAG_WAKEUP: wakeup flag + \arg PMU_FLAG_STANDBY: standby flag + \arg PMU_FLAG_LVD: lvd flag + \arg PMU_FLAG_LDOVSRF: LDO voltage select ready flag + \arg PMU_FLAG_HDRF: high-driver ready flag + \arg PMU_FLAG_HDSRF: high-driver switch ready flag + \arg PMU_FLAG_LDRF: low-driver mode ready flag + \param[out] none + \retval FlagStatus SET or RESET +*/ +FlagStatus pmu_flag_get(uint32_t flag) +{ + if(PMU_CS & flag){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear flag bit + \param[in] flag: + \arg PMU_FLAG_RESET_WAKEUP: reset wakeup flag + \arg PMU_FLAG_RESET_STANDBY: reset standby flag + \param[out] none + \retval none +*/ +void pmu_flag_clear(uint32_t flag) +{ + switch(flag){ + case PMU_FLAG_RESET_WAKEUP: + /* reset wakeup flag */ + PMU_CTL |= PMU_CTL_WURST; + break; + case PMU_FLAG_RESET_STANDBY: + /* reset standby flag */ + PMU_CTL |= PMU_CTL_STBRST; + break; + default : + break; + } +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_rcu.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_rcu.c new file mode 100644 index 0000000..1a1bd76 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_rcu.c @@ -0,0 +1,1332 @@ +/*! + \file gd32f30x_rcu.c + \brief RCU driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_rcu.h" + +/* define clock source */ +#define SEL_IRC8M ((uint16_t)0U) /* IRC8M is selected as CK_SYS */ +#define SEL_HXTAL ((uint16_t)1U) /* HXTAL is selected as CK_SYS */ +#define SEL_PLL ((uint16_t)2U) /* PLL is selected as CK_SYS */ + +/* define startup timeout count */ +#define OSC_STARTUP_TIMEOUT ((uint32_t)0x000FFFFFU) +#define LXTAL_STARTUP_TIMEOUT ((uint32_t)0x03FFFFFFU) + +/* ADC clock prescaler offset */ +#define RCU_ADC_PSC_OFFSET ((uint32_t)14U) + +/* RCU IRC8M adjust value mask and offset*/ +#define RCU_IRC8M_ADJUST_MASK ((uint8_t)0x1FU) +#define RCU_IRC8M_ADJUST_OFFSET ((uint32_t)3U) + +/* RCU PLL1 clock multiplication factor offset */ +#define RCU_CFG1_PLL1MF_OFFSET ((uint32_t)8U) +/* RCU PREDV1 division factor offset*/ +#define RCU_CFG1_PREDV1_OFFSET ((uint32_t)4U) + + +/*! + \brief deinitialize the RCU + \param[in] none + \param[out] none + \retval none +*/ +void rcu_deinit(void) +{ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + rcu_osci_stab_wait(RCU_IRC8M); + + RCU_CFG0 &= ~RCU_CFG0_SCS; + + /* reset CTL register */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + RCU_CTL &= ~RCU_CTL_HXTALBPS; + + /* reset CFG0 register */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0 | RCU_CFG0_PLLMF | + RCU_CFG0_USBDPSC | RCU_CFG0_CKOUT0SEL | RCU_CFG0_PLLMF_4 | RCU_CFG0_ADCPSC_2 | RCU_CFG0_PLLMF_5 | RCU_CFG0_USBDPSC_2); +#elif defined(GD32F30X_CL) + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_CKOUT0SEL | RCU_CFG0_ADCPSC_2 | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5 | RCU_CFG0_USBFSPSC_2); +#endif /* GD32F30X_HD and GD32F30X_XD */ + /* reset CTL register */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + RCU_CTL &= ~RCU_CTL_HXTALBPS; +#ifdef GD32F30X_CL + RCU_CTL &= ~(RCU_CTL_PLL1EN | RCU_CTL_PLL2EN); +#endif /* GD32F30X_CL */ + + /* reset INT and CFG1 register */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + RCU_INT = 0x009f0000U; + RCU_CFG1 &= ~(RCU_CFG1_ADCPSC_3 | RCU_CFG1_PLLPRESEL); +#elif defined(GD32F30X_CL) + RCU_INT = 0x00ff0000U; + RCU_CFG1 &= ~(RCU_CFG1_PREDV0 | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PLL2MF | + RCU_CFG1_PREDV0SEL | RCU_CFG1_I2S1SEL | RCU_CFG1_I2S2SEL | RCU_CFG1_ADCPSC_3 | + RCU_CFG1_PLLPRESEL | RCU_CFG1_PLL2MF_4); +#endif /* GD32F30X_HD and GD32F30X_XD */ +} + +/*! + \brief enable the peripherals clock + \param[in] periph: RCU peripherals, refer to rcu_periph_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOx (x=A,B,C,D,E,F,G): GPIO ports clock + \arg RCU_AF : alternate function clock + \arg RCU_CRC: CRC clock + \arg RCU_DMAx (x=0,1): DMA clock + \arg RCU_ENET: ENET clock(CL series available) + \arg RCU_ENETTX: ENETTX clock(CL series available) + \arg RCU_ENETRX: ENETRX clock(CL series available) + \arg RCU_USBD: USBD clock(HD,XD series available) + \arg RCU_USBFS: USBFS clock(CL series available) + \arg RCU_EXMC: EXMC clock + \arg RCU_TIMERx (x=0,1,2,3,4,5,6,7,8,9,10,11,12,13,TIMER8..13 are not available for HD series): TIMER clock + \arg RCU_WWDGT: WWDGT clock + \arg RCU_SPIx (x=0,1,2): SPI clock + \arg RCU_USARTx (x=0,1,2): USART clock + \arg RCU_UARTx (x=3,4): UART clock + \arg RCU_I2Cx (x=0,1): I2C clock + \arg RCU_CANx (x=0,1,CAN1 is only available for CL series): CAN clock + \arg RCU_PMU: PMU clock + \arg RCU_DAC: DAC clock + \arg RCU_RTC: RTC clock + \arg RCU_ADCx (x=0,1,2,ADC2 is not available for CL series): ADC clock + \arg RCU_SDIO: SDIO clock(not available for CL series) + \arg RCU_CTC: CTC clock + \arg RCU_BKPI: BKP interface clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_enable(rcu_periph_enum periph) +{ + RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief disable the peripherals clock + \param[in] periph: RCU peripherals, refer to rcu_periph_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOx (x=A,B,C,D,E,F,G): GPIO ports clock + \arg RCU_AF: alternate function clock + \arg RCU_CRC: CRC clock + \arg RCU_DMAx (x=0,1): DMA clock + \arg RCU_ENET: ENET clock(CL series available) + \arg RCU_ENETTX: ENETTX clock(CL series available) + \arg RCU_ENETRX: ENETRX clock(CL series available) + \arg RCU_USBD: USBD clock(HD,XD series available) + \arg RCU_USBFS: USBFS clock(CL series available) + \arg RCU_EXMC: EXMC clock + \arg RCU_TIMERx (x=0,1,2,3,4,5,6,7,8,9,10,11,12,13,TIMER8..13 are not available for HD series): TIMER clock + \arg RCU_WWDGT: WWDGT clock + \arg RCU_SPIx (x=0,1,2): SPI clock + \arg RCU_USARTx (x=0,1,2): USART clock + \arg RCU_UARTx (x=3,4): UART clock + \arg RCU_I2Cx (x=0,1): I2C clock + \arg RCU_CANx (x=0,1,CAN1 is only available for CL series): CAN clock + \arg RCU_PMU: PMU clock + \arg RCU_DAC: DAC clock + \arg RCU_RTC: RTC clock + \arg RCU_ADCx (x=0,1,2,ADC2 is not available for CL series): ADC clock + \arg RCU_SDIO: SDIO clock(not available for CL series) + \arg RCU_CTC: CTC clock + \arg RCU_BKPI: BKP interface clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_disable(rcu_periph_enum periph) +{ + RCU_REG_VAL(periph) &= ~BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief enable the peripherals clock when sleep mode + \param[in] periph: RCU peripherals, refer to rcu_periph_sleep_enum + only one parameter can be selected which is shown as below: + \arg RCU_FMC_SLP: FMC clock + \arg RCU_SRAM_SLP: SRAM clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph) +{ + RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief disable the peripherals clock when sleep mode + \param[in] periph: RCU peripherals, refer to rcu_periph_sleep_enum + only one parameter can be selected which is shown as below: + \arg RCU_FMC_SLP: FMC clock + \arg RCU_SRAM_SLP: SRAM clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph) +{ + RCU_REG_VAL(periph) &= ~BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief reset the peripherals + \param[in] periph_reset: RCU peripherals reset, refer to rcu_periph_reset_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOxRST (x=A,B,C,D,E,F,G): reset GPIO ports + \arg RCU_AFRST : reset alternate function clock + \arg RCU_ENETRST: reset ENET(CL series available) + \arg RCU_USBDRST: reset USBD(HD,XD series available) + \arg RCU_USBFSRST: reset USBFS(CL series available) + \arg RCU_TIMERxRST (x=0,1,2,3,4,5,6,7,8,9,10,11,12,13,TIMER8..13 are not available for HD series): reset TIMER + \arg RCU_WWDGTRST: reset WWDGT + \arg RCU_SPIxRST (x=0,1,2): reset SPI + \arg RCU_USARTxRST (x=0,1,2): reset USART + \arg RCU_UARTxRST (x=3,4): reset UART + \arg RCU_I2CxRST (x=0,1): reset I2C + \arg RCU_CANxRST (x=0,1,CAN1 is only available for CL series): reset CAN + \arg RCU_PMURST: reset PMU + \arg RCU_DACRST: reset DAC + \arg RCU_ADCRST (x=0,1,2,ADC2 is not available for CL series): reset ADC + \arg RCU_CTCRST: reset CTC + \arg RCU_BKPIRST: reset BKPI + \param[out] none + \retval none +*/ +void rcu_periph_reset_enable(rcu_periph_reset_enum periph_reset) +{ + RCU_REG_VAL(periph_reset) |= BIT(RCU_BIT_POS(periph_reset)); +} + +/*! + \brief disable reset the peripheral + \param[in] periph_reset: RCU peripherals reset, refer to rcu_periph_reset_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOxRST (x=A,B,C,D,E,F,G): reset GPIO ports + \arg RCU_AFRST : reset alternate function clock + \arg RCU_ENETRST: reset ENET(CL series available) + \arg RCU_USBDRST: reset USBD(HD,XD series available) + \arg RCU_USBFSRST: reset USBFS(CL series available) + \arg RCU_TIMERxRST (x=0,1,2,3,4,5,6,7,8,9,10,11,12,13,TIMER8..13 are not available for HD series): reset TIMER + \arg RCU_WWDGTRST: reset WWDGT + \arg RCU_SPIxRST (x=0,1,2): reset SPI + \arg RCU_USARTxRST (x=0,1,2): reset USART + \arg RCU_UARTxRST (x=3,4): reset UART + \arg RCU_I2CxRST (x=0,1): reset I2C + \arg RCU_CANxRST (x=0,1,CAN1 is only available for CL series): reset CAN + \arg RCU_PMURST: reset PMU + \arg RCU_DACRST: reset DAC + \arg RCU_ADCRST (x=0,1,2,ADC2 is not available for CL series): reset ADC + \arg RCU_CTCRST: reset CTC + \arg RCU_BKPIRST: reset BKPI + \param[out] none + \retval none +*/ +void rcu_periph_reset_disable(rcu_periph_reset_enum periph_reset) +{ + RCU_REG_VAL(periph_reset) &= ~BIT(RCU_BIT_POS(periph_reset)); +} + +/*! + \brief reset the BKP domain + \param[in] none + \param[out] none + \retval none +*/ +void rcu_bkp_reset_enable(void) +{ + RCU_BDCTL |= RCU_BDCTL_BKPRST; +} + +/*! + \brief disable the BKP domain reset + \param[in] none + \param[out] none + \retval none +*/ +void rcu_bkp_reset_disable(void) +{ + RCU_BDCTL &= ~RCU_BDCTL_BKPRST; +} + +/*! + \brief configure the system clock source + \param[in] ck_sys: system clock source select + only one parameter can be selected which is shown as below: + \arg RCU_CKSYSSRC_IRC8M: select CK_IRC8M as the CK_SYS source + \arg RCU_CKSYSSRC_HXTAL: select CK_HXTAL as the CK_SYS source + \arg RCU_CKSYSSRC_PLL: select CK_PLL as the CK_SYS source + \param[out] none + \retval none +*/ +void rcu_system_clock_source_config(uint32_t ck_sys) +{ + uint32_t reg; + + reg = RCU_CFG0; + /* reset the SCS bits and set according to ck_sys */ + reg &= ~RCU_CFG0_SCS; + RCU_CFG0 = (reg | ck_sys); +} + +/*! + \brief get the system clock source + \param[in] none + \param[out] none + \retval which clock is selected as CK_SYS source + \arg RCU_SCSS_IRC8M: CK_IRC8M is selected as the CK_SYS source + \arg RCU_SCSS_HXTAL: CK_HXTAL is selected as the CK_SYS source + \arg RCU_SCSS_PLL: CK_PLL is selected as the CK_SYS source +*/ +uint32_t rcu_system_clock_source_get(void) +{ + return (RCU_CFG0 & RCU_CFG0_SCSS); +} + +/*! + \brief configure the AHB clock prescaler selection + \param[in] ck_ahb: AHB clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_AHB_CKSYS_DIVx, x=1, 2, 4, 8, 16, 64, 128, 256, 512 + \param[out] none + \retval none +*/ +void rcu_ahb_clock_config(uint32_t ck_ahb) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the AHBPSC bits and set according to ck_ahb */ + reg &= ~RCU_CFG0_AHBPSC; + RCU_CFG0 = (reg | ck_ahb); +} + +/*! + \brief configure the APB1 clock prescaler selection + \param[in] ck_apb1: APB1 clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_APB1_CKAHB_DIV1: select CK_AHB as CK_APB1 + \arg RCU_APB1_CKAHB_DIV2: select CK_AHB/2 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV4: select CK_AHB/4 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV8: select CK_AHB/8 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV16: select CK_AHB/16 as CK_APB1 + \param[out] none + \retval none +*/ +void rcu_apb1_clock_config(uint32_t ck_apb1) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the APB1PSC and set according to ck_apb1 */ + reg &= ~RCU_CFG0_APB1PSC; + RCU_CFG0 = (reg | ck_apb1); +} + +/*! + \brief configure the APB2 clock prescaler selection + \param[in] ck_apb2: APB2 clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_APB2_CKAHB_DIV1: select CK_AHB as CK_APB2 + \arg RCU_APB2_CKAHB_DIV2: select CK_AHB/2 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV4: select CK_AHB/4 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV8: select CK_AHB/8 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV16: select CK_AHB/16 as CK_APB2 + \param[out] none + \retval none +*/ +void rcu_apb2_clock_config(uint32_t ck_apb2) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the APB2PSC and set according to ck_apb2 */ + reg &= ~RCU_CFG0_APB2PSC; + RCU_CFG0 = (reg | ck_apb2); +} + +/*! + \brief configure the CK_OUT0 clock source + \param[in] ckout0_src: CK_OUT0 clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_CKOUT0SRC_NONE: no clock selected + \arg RCU_CKOUT0SRC_CKSYS: system clock selected + \arg RCU_CKOUT0SRC_IRC8M: high speed 8M internal oscillator clock selected + \arg RCU_CKOUT0SRC_HXTAL: HXTAL selected + \arg RCU_CKOUT0SRC_CKPLL_DIV2: CK_PLL/2 selected + \arg RCU_CKOUT0SRC_CKPLL1: CK_PLL1 selected + \arg RCU_CKOUT0SRC_CKPLL2_DIV2: CK_PLL2/2 selected + \arg RCU_CKOUT0SRC_EXT1: EXT1 selected + \arg RCU_CKOUT0SRC_CKPLL2: PLL selected + \param[out] none + \retval none +*/ +void rcu_ckout0_config(uint32_t ckout0_src) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the CKOUT0SRC, set according to ckout0_src */ + reg &= ~RCU_CFG0_CKOUT0SEL; + RCU_CFG0 = (reg | ckout0_src); +} + +/*! + \brief configure the main PLL clock + \param[in] pll_src: PLL clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_PLLSRC_IRC8M_DIV2: IRC8M/2 clock selected as source clock of PLL + \arg RCU_PLLSRC_HXTAL_IRC48M: HXTAL or IRC48M selected as source clock of PLL + \param[in] pll_mul: PLL clock multiplication factor + only one parameter can be selected which is shown as below: + \arg RCU_PLL_MULx (XD series x = 2..63, CL series x = 2..14, 16..63, 6.5) + \param[out] none + \retval none +*/ +void rcu_pll_config(uint32_t pll_src, uint32_t pll_mul) +{ + uint32_t reg = 0U; + + reg = RCU_CFG0; + + /* PLL clock source and multiplication factor configuration */ + reg &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + reg |= (pll_src | pll_mul); + + RCU_CFG0 = reg; +} + +/*! + \brief configure the PLL clock source preselection + \param[in] pll_presel: PLL clock source preselection + only one parameter can be selected which is shown as below: + \arg RCU_PLLPRESRC_HXTAL: HXTAL selected as PLL source clock + \arg RCU_PLLPRESRC_IRC48M: CK_PLL selected as PREDV0 input source clock + \param[out] none + \retval none +*/ +void rcu_pllpresel_config(uint32_t pll_presel) +{ + uint32_t reg = 0U; + + reg = RCU_CFG1; + + /* PLL clock source preselection */ + reg &= ~RCU_CFG1_PLLPRESEL; + reg |= pll_presel; + + RCU_CFG1 = reg; +} + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) +/*! + \brief configure the PREDV0 division factor + \param[in] predv0_div: PREDV0 division factor + \arg RCU_PREDV0_DIVx, x = 1,2 + \param[out] none + \retval none +*/ +void rcu_predv0_config(uint32_t predv0_div) +{ + uint32_t reg = 0U; + + reg = RCU_CFG0; + /* reset PREDV0 bit */ + reg &= ~RCU_CFG0_PREDV0; + if(RCU_PREDV0_DIV2 == predv0_div){ + /* set the PREDV0 bit */ + reg |= RCU_CFG0_PREDV0; + } + + RCU_CFG0 = reg; +} +#elif defined(GD32F30X_CL) +/*! + \brief configure the PREDV0 division factor and clock source + \param[in] predv0_source: PREDV0 input clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_PREDV0SRC_HXTAL_IRC48M: HXTAL or IRC48M selected as PREDV0 input source clock + \arg RCU_PREDV0SRC_CKPLL1: CK_PLL1 selected as PREDV0 input source clock + \param[in] predv0_div: PREDV0 division factor + only one parameter can be selected which is shown as below: + \arg RCU_PREDV0_DIVx, x = 1..16 + \param[out] none + \retval none +*/ +void rcu_predv0_config(uint32_t predv0_source, uint32_t predv0_div) +{ + uint32_t reg = 0U; + + reg = RCU_CFG1; + /* reset PREDV0SEL and PREDV0 bits */ + reg &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV0); + /* set the PREDV0SEL and PREDV0 division factor */ + reg |= (predv0_source | predv0_div); + + RCU_CFG1 = reg; +} + +/*! + \brief configure the PREDV1 division factor + \param[in] predv1_div: PREDV1 division factor + only one parameter can be selected which is shown as below: + \arg RCU_PREDV1_DIVx, x = 1..16 + \param[out] none + \retval none +*/ +void rcu_predv1_config(uint32_t predv1_div) +{ + uint32_t reg = 0U; + + reg = RCU_CFG1; + /* reset the PREDV1 bits */ + reg &= ~RCU_CFG1_PREDV1; + /* set the PREDV1 division factor */ + reg |= predv1_div; + + RCU_CFG1 = reg; +} + +/*! + \brief configure the PLL1 clock + \param[in] pll_mul: PLL clock multiplication factor + only one parameter can be selected which is shown as below: + \arg RCU_PLL1_MULx (x = 8..14,16,20) + \param[out] none + \retval none +*/ +void rcu_pll1_config(uint32_t pll_mul) +{ + RCU_CFG1 &= ~RCU_CFG1_PLL1MF; + RCU_CFG1 |= pll_mul; +} + +/*! + \brief configure the PLL2 clock + \param[in] pll_mul: PLL clock multiplication factor + only one parameter can be selected which is shown as below: + \arg RCU_PLL2_MULx (x = 8..14,16,20,18..32,40) + \param[out] none + \retval none +*/ +void rcu_pll2_config(uint32_t pll_mul) +{ + RCU_CFG1 &= ~RCU_CFG1_PLL2MF; + RCU_CFG1 |= pll_mul; +} +#endif /* GD32F30X_HD and GD32F30X_XD */ + +/*! + \brief configure the ADC prescaler factor + \param[in] adc_psc: ADC prescaler factor + only one parameter can be selected which is shown as below: + \arg RCU_CKADC_CKAPB2_DIV2: ADC prescaler select CK_APB2/2 + \arg RCU_CKADC_CKAPB2_DIV4: ADC prescaler select CK_APB2/4 + \arg RCU_CKADC_CKAPB2_DIV6: ADC prescaler select CK_APB2/6 + \arg RCU_CKADC_CKAPB2_DIV8: ADC prescaler select CK_APB2/8 + \arg RCU_CKADC_CKAPB2_DIV12: ADC prescaler select CK_APB2/12 + \arg RCU_CKADC_CKAPB2_DIV16: ADC prescaler select CK_APB2/16 + \arg RCU_CKADC_CKAHB_DIV5: ADC prescaler select CK_AHB/5 + \arg RCU_CKADC_CKAHB_DIV6: ADC prescaler select CK_AHB/6 + \arg RCU_CKADC_CKAHB_DIV10: ADC prescaler select CK_AHB/10 + \arg RCU_CKADC_CKAHB_DIV20: ADC prescaler select CK_AHB/20 + \param[out] none + \retval none +*/ +void rcu_adc_clock_config(uint32_t adc_psc) +{ + uint32_t reg0,reg1; + + /* reset the ADCPSC bits */ + reg0 = RCU_CFG0; + reg0 &= ~(RCU_CFG0_ADCPSC_2 | RCU_CFG0_ADCPSC); + reg1 = RCU_CFG1; + reg1 &= ~RCU_CFG1_ADCPSC_3; + + /* set the ADC prescaler factor */ + switch(adc_psc){ + case RCU_CKADC_CKAPB2_DIV2: + case RCU_CKADC_CKAPB2_DIV4: + case RCU_CKADC_CKAPB2_DIV6: + case RCU_CKADC_CKAPB2_DIV8: + reg0 |= (adc_psc << RCU_ADC_PSC_OFFSET); + break; + + case RCU_CKADC_CKAPB2_DIV12: + case RCU_CKADC_CKAPB2_DIV16: + adc_psc &= ~BIT(2); + reg0 |= ((adc_psc << RCU_ADC_PSC_OFFSET) | RCU_CFG0_ADCPSC_2); + break; + + case RCU_CKADC_CKAHB_DIV5: + case RCU_CKADC_CKAHB_DIV6: + case RCU_CKADC_CKAHB_DIV10: + case RCU_CKADC_CKAHB_DIV20: + adc_psc &= ~BITS(2,3); + reg0 |= (adc_psc << RCU_ADC_PSC_OFFSET); + reg1 |= RCU_CFG1_ADCPSC_3; + break; + + default: + break; + } + + /* set the register */ + RCU_CFG0 = reg0; + RCU_CFG1 = reg1; +} + +/*! + \brief configure the USBD/USBFS prescaler factor + \param[in] usb_psc: USB prescaler factor + only one parameter can be selected which is shown as below: + \arg RCU_CKUSB_CKPLL_DIV1_5: USBD/USBFS prescaler select CK_PLL/1.5 + \arg RCU_CKUSB_CKPLL_DIV1: USBD/USBFS prescaler select CK_PLL/1 + \arg RCU_CKUSB_CKPLL_DIV2_5: USBD/USBFS prescaler select CK_PLL/2.5 + \arg RCU_CKUSB_CKPLL_DIV2: USBD/USBFS prescaler select CK_PLL/2 + \arg RCU_CKUSB_CKPLL_DIV3: USBD/USBFS prescaler select CK_PLL/3 + \arg RCU_CKUSB_CKPLL_DIV3_5: USBD/USBFS prescaler select CK_PLL/3.5 + \arg RCU_CKUSB_CKPLL_DIV4: USBD/USBFS prescaler select CK_PLL/4 + \param[out] none + \retval none +*/ +void rcu_usb_clock_config(uint32_t usb_psc) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* configure the USBD/USBFS prescaler factor */ +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + reg &= ~RCU_CFG0_USBDPSC; +#elif defined(GD32F30X_CL) + reg &= ~RCU_CFG0_USBFSPSC; +#endif /* GD32F30X_HD and GD32F30X_XD */ + + RCU_CFG0 = (reg | usb_psc); +} + +/*! + \brief configure the RTC clock source selection + \param[in] rtc_clock_source: RTC clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_RTCSRC_NONE: no clock selected + \arg RCU_RTCSRC_LXTAL: CK_LXTAL selected as RTC source clock + \arg RCU_RTCSRC_IRC40K: CK_IRC40K selected as RTC source clock + \arg RCU_RTCSRC_HXTAL_DIV_128: CK_HXTAL/128 selected as RTC source clock + \param[out] none + \retval none +*/ +void rcu_rtc_clock_config(uint32_t rtc_clock_source) +{ + uint32_t reg; + + reg = RCU_BDCTL; + /* reset the RTCSRC bits and set according to rtc_clock_source */ + reg &= ~RCU_BDCTL_RTCSRC; + RCU_BDCTL = (reg | rtc_clock_source); +} + +#ifdef GD32F30X_CL +/*! + \brief configure the I2S1 clock source selection + \param[in] i2s_clock_source: I2S1 clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_I2S1SRC_CKSYS: System clock selected as I2S1 source clock + \arg RCU_I2S1SRC_CKPLL2_MUL2: CK_PLL2x2 selected as I2S1 source clock + \param[out] none + \retval none +*/ +void rcu_i2s1_clock_config(uint32_t i2s_clock_source) +{ + uint32_t reg; + + reg = RCU_CFG1; + /* reset the I2S1SEL bit and set according to i2s_clock_source */ + reg &= ~RCU_CFG1_I2S1SEL; + RCU_CFG1 = (reg | i2s_clock_source); +} + +/*! + \brief configure the I2S2 clock source selection + \param[in] i2s_clock_source: I2S2 clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_I2S2SRC_CKSYS: system clock selected as I2S2 source clock + \arg RCU_I2S2SRC_CKPLL2_MUL2: CK_PLL2x2 selected as I2S2 source clock + \param[out] none + \retval none +*/ +void rcu_i2s2_clock_config(uint32_t i2s_clock_source) +{ + uint32_t reg; + + reg = RCU_CFG1; + /* reset the I2S2SEL bit and set according to i2s_clock_source */ + reg &= ~RCU_CFG1_I2S2SEL; + RCU_CFG1 = (reg | i2s_clock_source); +} +#endif /* GD32F30X_CL */ + +/*! + \brief configure the CK48M clock source selection + \param[in] ck48m_clock_source: CK48M clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_CK48MSRC_CKPLL: CK_PLL selected as CK48M source clock + \arg RCU_CK48MSRC_IRC48M: CK_IRC48M selected as CK48M source clock + \param[out] none + \retval none +*/ +void rcu_ck48m_clock_config(uint32_t ck48m_clock_source) +{ + uint32_t reg; + + reg = RCU_ADDCTL; + /* reset the CK48MSEL bit and set according to ck48m_clock_source */ + reg &= ~RCU_ADDCTL_CK48MSEL; + RCU_ADDCTL = (reg | ck48m_clock_source); +} + +/*! + \brief get the clock stabilization and periphral reset flags + \param[in] flag: the clock stabilization and periphral reset flags, refer to rcu_flag_enum + only one parameter can be selected which is shown as below: + \arg RCU_FLAG_IRC8MSTB: IRC8M stabilization flag + \arg RCU_FLAG_HXTALSTB: HXTAL stabilization flag + \arg RCU_FLAG_PLLSTB: PLL stabilization flag + \arg RCU_FLAG_PLL1STB: PLL1 stabilization flag(CL series only) + \arg RCU_FLAG_PLL2STB: PLL2 stabilization flag(CL series only) + \arg RCU_FLAG_LXTALSTB: LXTAL stabilization flag + \arg RCU_FLAG_IRC40KSTB: IRC40K stabilization flag + \arg RCU_FLAG_IRC48MSTB: IRC48M stabilization flag + \arg RCU_FLAG_EPRST: external PIN reset flag + \arg RCU_FLAG_PORRST: power reset flag + \arg RCU_FLAG_SWRST: software reset flag + \arg RCU_FLAG_FWDGTRST: free watchdog timer reset flag + \arg RCU_FLAG_WWDGTRST: window watchdog timer reset flag + \arg RCU_FLAG_LPRST: low-power reset flag + \param[out] none + \retval none +*/ +FlagStatus rcu_flag_get(rcu_flag_enum flag) +{ + /* get the rcu flag */ + if(RESET != (RCU_REG_VAL(flag) & BIT(RCU_BIT_POS(flag)))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear all the reset flag + \param[in] none + \param[out] none + \retval none +*/ +void rcu_all_reset_flag_clear(void) +{ + RCU_RSTSCK |= RCU_RSTSCK_RSTFC; +} + +/*! + \brief get the clock stabilization interrupt and ckm flags + \param[in] int_flag: interrupt and ckm flags, refer to rcu_int_flag_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_FLAG_IRC40KSTB: IRC40K stabilization interrupt flag + \arg RCU_INT_FLAG_LXTALSTB: LXTAL stabilization interrupt flag + \arg RCU_INT_FLAG_IRC8MSTB: IRC8M stabilization interrupt flag + \arg RCU_INT_FLAG_HXTALSTB: HXTAL stabilization interrupt flag + \arg RCU_INT_FLAG_PLLSTB: PLL stabilization interrupt flag + \arg RCU_INT_FLAG_PLL1STB: PLL1 stabilization interrupt flag(CL series only) + \arg RCU_INT_FLAG_PLL2STB: PLL2 stabilization interrupt flag(CL series only) + \arg RCU_INT_FLAG_CKM: HXTAL clock stuck interrupt flag + \arg RCU_INT_FLAG_IRC48MSTB: IRC48M stabilization interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus rcu_interrupt_flag_get(rcu_int_flag_enum int_flag) +{ + /* get the rcu interrupt flag */ + if(RESET != (RCU_REG_VAL(int_flag) & BIT(RCU_BIT_POS(int_flag)))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear the interrupt flags + \param[in] int_flag: clock stabilization and stuck interrupt flags clear, refer to rcu_int_flag_clear_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_FLAG_IRC40KSTB_CLR: IRC40K stabilization interrupt flag clear + \arg RCU_INT_FLAG_LXTALSTB_CLR: LXTAL stabilization interrupt flag clear + \arg RCU_INT_FLAG_IRC8MSTB_CLR: IRC8M stabilization interrupt flag clear + \arg RCU_INT_FLAG_HXTALSTB_CLR: HXTAL stabilization interrupt flag clear + \arg RCU_INT_FLAG_PLLSTB_CLR: PLL stabilization interrupt flag clear + \arg RCU_INT_FLAG_PLL1STB_CLR: PLL1 stabilization interrupt flag clear(CL series only) + \arg RCU_INT_FLAG_PLL2STB_CLR: PLL2 stabilization interrupt flag clear(CL series only) + \arg RCU_INT_FLAG_CKM_CLR: clock stuck interrupt flag clear + \arg RCU_INT_FLAG_IRC48MSTB_CLR: IRC48M stabilization interrupt flag clear + \param[out] none + \retval none +*/ +void rcu_interrupt_flag_clear(rcu_int_flag_clear_enum int_flag) +{ + RCU_REG_VAL(int_flag) |= BIT(RCU_BIT_POS(int_flag)); +} + +/*! + \brief enable the stabilization interrupt + \param[in] interrupt clock stabilization interrupt, refer to rcu_int_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_IRC40KSTB: IRC40K stabilization interrupt enable + \arg RCU_INT_LXTALSTB: LXTAL stabilization interrupt enable + \arg RCU_INT_IRC8MSTB: IRC8M stabilization interrupt enable + \arg RCU_INT_HXTALSTB: HXTAL stabilization interrupt enable + \arg RCU_INT_PLLSTB: PLL stabilization interrupt enable + \arg RCU_INT_PLL1STB: PLL1 stabilization interrupt enable(CL series only) + \arg RCU_INT_PLL2STB: PLL2 stabilization interrupt enable(CL series only) + \arg RCU_INT_IRC48MSTB: IRC48M stabilization interrupt enable + \param[out] none + \retval none +*/ +void rcu_interrupt_enable(rcu_int_enum interrupt) +{ + RCU_REG_VAL(interrupt) |= BIT(RCU_BIT_POS(interrupt)); +} + +/*! + \brief disable the stabilization interrupt + \param[in] interrupt clock stabilization interrupt, refer to rcu_int_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_IRC40KSTB: IRC40K stabilization interrupt enable + \arg RCU_INT_LXTALSTB: LXTAL stabilization interrupt enable + \arg RCU_INT_IRC8MSTB: IRC8M stabilization interrupt enable + \arg RCU_INT_HXTALSTB: HXTAL stabilization interrupt enable + \arg RCU_INT_PLLSTB: PLL stabilization interrupt enable + \arg RCU_INT_PLL1STB: PLL1 stabilization interrupt enable(CL series only) + \arg RCU_INT_PLL2STB: PLL2 stabilization interrupt enable(CL series only) + \arg RCU_INT_IRC48MSTB: IRC48M stabilization interrupt enable + \param[out] none + \retval none +*/ +void rcu_interrupt_disable(rcu_int_enum interrupt) +{ + RCU_REG_VAL(interrupt) &= ~BIT(RCU_BIT_POS(interrupt)); +} + +/*! + \brief configure the LXTAL drive capability + \param[in] lxtal_dricap: drive capability of LXTAL + only one parameter can be selected which is shown as below: + \arg RCU_LXTAL_LOWDRI: lower driving capability + \arg RCU_LXTAL_MED_LOWDRI: medium low driving capability + \arg RCU_LXTAL_MED_HIGHDRI: medium high driving capability + \arg RCU_LXTAL_HIGHDRI: higher driving capability + \param[out] none + \retval none +*/ +void rcu_lxtal_drive_capability_config(uint32_t lxtal_dricap) +{ + uint32_t reg; + + reg = RCU_BDCTL; + + /* reset the LXTALDRI bits and set according to lxtal_dricap */ + reg &= ~RCU_BDCTL_LXTALDRI; + RCU_BDCTL = (reg | lxtal_dricap); +} + +/*! + \brief wait for oscillator stabilization flags is SET or oscillator startup is timeout + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \arg RCU_IRC8M: internal 8M RC oscillators(IRC8M) + \arg RCU_IRC48M: internal 48M RC oscillators(IRC48M) + \arg RCU_IRC40K: internal 40K RC oscillator(IRC40K) + \arg RCU_PLL_CK: phase locked loop(PLL) + \arg RCU_PLL1_CK: phase locked loop 1(CL series only) + \arg RCU_PLL2_CK: phase locked loop 2(CL series only) + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus rcu_osci_stab_wait(rcu_osci_type_enum osci) +{ + uint32_t stb_cnt = 0U; + ErrStatus reval = ERROR; + FlagStatus osci_stat = RESET; + + switch(osci){ + /* wait HXTAL stable */ + case RCU_HXTAL: + while((RESET == osci_stat) && (HXTAL_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_HXTALSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_HXTALSTB)){ + reval = SUCCESS; + } + break; + + /* wait LXTAL stable */ + case RCU_LXTAL: + while((RESET == osci_stat) && (LXTAL_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_LXTALSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_LXTALSTB)){ + reval = SUCCESS; + } + break; + + /* wait IRC8M stable */ + case RCU_IRC8M: + while((RESET == osci_stat) && (IRC8M_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_IRC8MSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_IRC8MSTB)){ + reval = SUCCESS; + } + break; + + /* wait IRC48M stable */ + case RCU_IRC48M: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_IRC48MSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if (RESET != rcu_flag_get(RCU_FLAG_IRC48MSTB)){ + reval = SUCCESS; + } + break; + + /* wait IRC40K stable */ + case RCU_IRC40K: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_IRC40KSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_IRC40KSTB)){ + reval = SUCCESS; + } + break; + + /* wait PLL stable */ + case RCU_PLL_CK: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_PLLSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_PLLSTB)){ + reval = SUCCESS; + } + break; + +#ifdef GD32F30X_CL + /* wait PLL1 stable */ + case RCU_PLL1_CK: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_PLL1STB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_PLL1STB)){ + reval = SUCCESS; + } + break; + /* wait PLL2 stable */ + case RCU_PLL2_CK: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_PLL2STB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_PLL2STB)){ + reval = SUCCESS; + } + break; +#endif /* GD32F30X_CL */ + + default: + break; + } + + /* return value */ + return reval; +} + +/*! + \brief turn on the oscillator + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \arg RCU_IRC8M: internal 8M RC oscillators(IRC8M) + \arg RCU_IRC48M: internal 48M RC oscillators(IRC48M) + \arg RCU_IRC40K: internal 40K RC oscillator(IRC40K) + \arg RCU_PLL_CK: phase locked loop(PLL) + \arg RCU_PLL1_CK: phase locked loop 1(CL series only) + \arg RCU_PLL2_CK: phase locked loop 2(CL series only) + \param[out] none + \retval none +*/ +void rcu_osci_on(rcu_osci_type_enum osci) +{ + RCU_REG_VAL(osci) |= BIT(RCU_BIT_POS(osci)); +} + +/*! + \brief turn off the oscillator + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \arg RCU_IRC8M: internal 8M RC oscillators(IRC8M) + \arg RCU_IRC48M: internal 48M RC oscillators(IRC48M) + \arg RCU_IRC40K: internal 40K RC oscillator(IRC40K) + \arg RCU_PLL_CK: phase locked loop(PLL) + \arg RCU_PLL1_CK: phase locked loop 1(CL series only) + \arg RCU_PLL2_CK: phase locked loop 2(CL series only) + \param[out] none + \retval none +*/ +void rcu_osci_off(rcu_osci_type_enum osci) +{ + RCU_REG_VAL(osci) &= ~BIT(RCU_BIT_POS(osci)); +} + +/*! + \brief enable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \param[out] none + \retval none +*/ +void rcu_osci_bypass_mode_enable(rcu_osci_type_enum osci) +{ + uint32_t reg; + + switch(osci){ + /* enable HXTAL to bypass mode */ + case RCU_HXTAL: + reg = RCU_CTL; + RCU_CTL &= ~RCU_CTL_HXTALEN; + RCU_CTL = (reg | RCU_CTL_HXTALBPS); + break; + /* enable LXTAL to bypass mode */ + case RCU_LXTAL: + reg = RCU_BDCTL; + RCU_BDCTL &= ~RCU_BDCTL_LXTALEN; + RCU_BDCTL = (reg | RCU_BDCTL_LXTALBPS); + break; + case RCU_IRC8M: + case RCU_IRC48M: + case RCU_IRC40K: + case RCU_PLL_CK: +#ifdef GD32F30X_CL + case RCU_PLL1_CK: + case RCU_PLL2_CK: +#endif /* GD32F30X_CL */ + break; + default: + break; + } +} + +/*! + \brief disable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \param[out] none + \retval none +*/ +void rcu_osci_bypass_mode_disable(rcu_osci_type_enum osci) +{ + uint32_t reg; + + switch(osci){ + /* disable HXTAL to bypass mode */ + case RCU_HXTAL: + reg = RCU_CTL; + RCU_CTL &= ~RCU_CTL_HXTALEN; + RCU_CTL = (reg & ~RCU_CTL_HXTALBPS); + break; + /* disable LXTAL to bypass mode */ + case RCU_LXTAL: + reg = RCU_BDCTL; + RCU_BDCTL &= ~RCU_BDCTL_LXTALEN; + RCU_BDCTL = (reg & ~RCU_BDCTL_LXTALBPS); + break; + case RCU_IRC8M: + case RCU_IRC48M: + case RCU_IRC40K: + case RCU_PLL_CK: +#ifdef GD32F30X_CL + case RCU_PLL1_CK: + case RCU_PLL2_CK: +#endif /* GD32F30X_CL */ + break; + default: + break; + } +} + +/*! + \brief enable the HXTAL clock monitor + \param[in] none + \param[out] none + \retval none +*/ + +void rcu_hxtal_clock_monitor_enable(void) +{ + RCU_CTL |= RCU_CTL_CKMEN; +} + +/*! + \brief disable the HXTAL clock monitor + \param[in] none + \param[out] none + \retval none +*/ +void rcu_hxtal_clock_monitor_disable(void) +{ + RCU_CTL &= ~RCU_CTL_CKMEN; +} + +/*! + \brief set the IRC8M adjust value + \param[in] irc8m_adjval: IRC8M adjust value, must be between 0 and 0x1F + \arg 0x00 - 0x1F + \param[out] none + \retval none +*/ +void rcu_irc8m_adjust_value_set(uint32_t irc8m_adjval) +{ + uint32_t reg; + + reg = RCU_CTL; + /* reset the IRC8MADJ bits and set according to irc8m_adjval */ + reg &= ~RCU_CTL_IRC8MADJ; + RCU_CTL = (reg | ((irc8m_adjval & RCU_IRC8M_ADJUST_MASK) << RCU_IRC8M_ADJUST_OFFSET)); +} + +/*! + \brief deep-sleep mode voltage select + \param[in] dsvol: deep sleep mode voltage + only one parameter can be selected which is shown as below: + \arg RCU_DEEPSLEEP_V_1_0: the core voltage is 1.0V + \arg RCU_DEEPSLEEP_V_0_9: the core voltage is 0.9V + \arg RCU_DEEPSLEEP_V_0_8: the core voltage is 0.8V + \arg RCU_DEEPSLEEP_V_0_7: the core voltage is 0.7V + \param[out] none + \retval none +*/ +void rcu_deepsleep_voltage_set(uint32_t dsvol) +{ + dsvol &= RCU_DSV_DSLPVS; + RCU_DSV = dsvol; +} + +/*! + \brief get the system clock, bus and peripheral clock frequency + \param[in] clock: the clock frequency which to get + only one parameter can be selected which is shown as below: + \arg CK_SYS: system clock frequency + \arg CK_AHB: AHB clock frequency + \arg CK_APB1: APB1 clock frequency + \arg CK_APB2: APB2 clock frequency + \param[out] none + \retval clock frequency of system, AHB, APB1, APB2 +*/ +uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock) +{ + uint32_t sws, ck_freq = 0U; + uint32_t cksys_freq, ahb_freq, apb1_freq, apb2_freq; + uint32_t pllsel, pllpresel, predv0sel, pllmf,ck_src, idx, clk_exp; +#ifdef GD32F30X_CL + uint32_t predv0, predv1, pll1mf; +#endif /* GD32F30X_CL */ + + /* exponent of AHB, APB1 and APB2 clock divider */ + uint8_t ahb_exp[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + uint8_t apb1_exp[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + uint8_t apb2_exp[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + + sws = GET_BITS(RCU_CFG0, 2, 3); + switch(sws){ + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + cksys_freq = IRC8M_VALUE; + break; + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + cksys_freq = HXTAL_VALUE; + break; + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL, IRC48M or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + if(RCU_PLLSRC_HXTAL_IRC48M == pllsel) { + /* PLL clock source is HXTAL or IRC48M */ + pllpresel = (RCU_CFG1 & RCU_CFG1_PLLPRESEL); + + if(RCU_PLLPRESRC_HXTAL == pllpresel){ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + }else{ + /* PLL clock source is IRC48 */ + ck_src = IRC48M_VALUE; + } + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + predv0sel = (RCU_CFG0 & RCU_CFG0_PREDV0); + /* PREDV0 input source clock divided by 2 */ + if(RCU_CFG0_PREDV0 == predv0sel){ + ck_src /= 2U; + } +#elif defined(GD32F30X_CL) + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> RCU_CFG1_PREDV1_OFFSET) + 1U; + pll1mf = (uint32_t)((RCU_CFG1 & RCU_CFG1_PLL1MF) >> RCU_CFG1_PLL1MF_OFFSET) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src/predv1)*pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; +#endif /* GD32F30X_HD and GD32F30X_XD */ + }else{ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE/2U; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + if((RCU_CFG0 & RCU_CFG0_PLLMF_5)){ + pllmf |= 0x20U; + } + if(pllmf < 15U){ + pllmf += 2U; + }else if((pllmf >= 15U) && (pllmf <= 62U)){ + pllmf += 1U; + }else{ + pllmf = 63U; + } + cksys_freq = ck_src*pllmf; + #ifdef GD32F30X_CL + if(15U == pllmf){ + cksys_freq = ck_src*6U + ck_src/2U; + } + #endif /* GD32F30X_CL */ + + break; + /* IRC8M is selected as CK_SYS */ + default: + cksys_freq = IRC8M_VALUE; + break; + } + + /* calculate AHB clock frequency */ + idx = GET_BITS(RCU_CFG0, 4, 7); + clk_exp = ahb_exp[idx]; + ahb_freq = cksys_freq >> clk_exp; + + /* calculate APB1 clock frequency */ + idx = GET_BITS(RCU_CFG0, 8, 10); + clk_exp = apb1_exp[idx]; + apb1_freq = ahb_freq >> clk_exp; + + /* calculate APB2 clock frequency */ + idx = GET_BITS(RCU_CFG0, 11, 13); + clk_exp = apb2_exp[idx]; + apb2_freq = ahb_freq >> clk_exp; + + /* return the clocks frequency */ + switch(clock){ + case CK_SYS: + ck_freq = cksys_freq; + break; + case CK_AHB: + ck_freq = ahb_freq; + break; + case CK_APB1: + ck_freq = apb1_freq; + break; + case CK_APB2: + ck_freq = apb2_freq; + break; + default: + break; + } + return ck_freq; +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_rtc.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_rtc.c new file mode 100644 index 0000000..b6e323b --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_rtc.c @@ -0,0 +1,230 @@ +/*! + \file gd32f30x_rtc.c + \brief RTC driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#include "gd32f30x_rtc.h" + +/*! + \brief enable RTC interrupt + \param[in] interrupt: specify which interrupt to enbale + \arg RTC_INT_SECOND: second interrupt + \arg RTC_INT_ALARM: alarm interrupt + \arg RTC_INT_OVERFLOW: overflow interrupt + \param[out] none + \retval none +*/ +void rtc_interrupt_enable(uint32_t interrupt) +{ + RTC_INTEN |= interrupt; +} + +/*! + \brief disable RTC interrupt + \param[in] interrupt: specify which interrupt to disbale + \arg RTC_INT_SECOND: second interrupt + \arg RTC_INT_ALARM: alarm interrupt + \arg RTC_INT_OVERFLOW: overflow interrupt + \param[out] none + \retval none +*/ +void rtc_interrupt_disable(uint32_t interrupt) +{ + RTC_INTEN &= ~interrupt; +} + +/*! + \brief enter RTC configuration mode + \param[in] none + \param[out] none + \retval none +*/ +void rtc_configuration_mode_enter(void) +{ + RTC_CTL |= RTC_CTL_CMF; +} + +/*! + \brief exit RTC configuration mode + \param[in] none + \param[out] none + \retval none +*/ +void rtc_configuration_mode_exit(void) +{ + RTC_CTL &= ~RTC_CTL_CMF; +} + +/*! + \brief wait RTC last write operation finished flag set + \param[in] none + \param[out] none + \retval none +*/ +void rtc_lwoff_wait(void) +{ + /* loop until LWOFF flag is set */ + while (RESET == (RTC_CTL & RTC_CTL_LWOFF)){ + } +} + +/*! + \brief wait RTC registers synchronized flag set + \param[in] none + \param[out] none + \retval none +*/ +void rtc_register_sync_wait(void) +{ + /* clear RSYNF flag */ + RTC_CTL &= ~RTC_CTL_RSYNF; + /* loop until RSYNF flag is set */ + while (RESET == (RTC_CTL & RTC_CTL_RSYNF)){ + } +} + +/*! + \brief get RTC counter value + \param[in] none + \param[out] none + \retval RTC counter value +*/ +uint32_t rtc_counter_get(void) +{ + uint32_t temp = 0x0U; + temp = RTC_CNTL; + temp |= (RTC_CNTH << 16); + return temp; +} + +/*! + \brief set RTC counter value + \param[in] cnt: RTC counter value + \param[out] none + \retval none +*/ +void rtc_counter_set(uint32_t cnt) +{ + rtc_configuration_mode_enter(); + /* set the RTC counter high bits */ + RTC_CNTH = cnt >> 16; + /* set the RTC counter low bits */ + RTC_CNTL = (cnt & RTC_LOW_VALUE); + rtc_configuration_mode_exit(); +} + +/*! + \brief set RTC prescaler value + \param[in] psc: RTC prescaler value + \param[out] none + \retval none +*/ +void rtc_prescaler_set(uint32_t psc) +{ + rtc_configuration_mode_enter(); + /* set the RTC prescaler high bits */ + RTC_PSCH = (psc & RTC_HIGH_VALUE) >> 16; + /* set the RTC prescaler low bits */ + RTC_PSCL = (psc & RTC_LOW_VALUE); + rtc_configuration_mode_exit(); +} + +/*! + \brief set RTC alarm value + \param[in] alarm: RTC alarm value + \param[out] none + \retval none +*/ +void rtc_alarm_config(uint32_t alarm) +{ + rtc_configuration_mode_enter(); + /* set the alarm high bits */ + RTC_ALRMH = alarm >> 16; + /* set the alarm low bits */ + RTC_ALRML = (alarm & RTC_LOW_VALUE); + rtc_configuration_mode_exit(); +} + +/*! + \brief get RTC divider value + \param[in] none + \param[out] none + \retval RTC divider value +*/ +uint32_t rtc_divider_get(void) +{ + uint32_t temp = 0x00U; + temp = (RTC_DIVH & RTC_DIVH_DIV) << 16; + temp |= RTC_DIVL; + return temp; +} + +/*! + \brief get RTC flag status + \param[in] flag: specify which flag status to get + \arg RTC_FLAG_SECOND: second interrupt flag + \arg RTC_FLAG_ALARM: alarm interrupt flag + \arg RTC_FLAG_OVERFLOW: overflow interrupt flag + \arg RTC_FLAG_RSYN: registers synchronized flag + \arg RTC_FLAG_LWOF: last write operation finished flag + \param[out] none + \retval SET or RESET +*/ +FlagStatus rtc_flag_get(uint32_t flag) +{ + if(RESET != (RTC_CTL & flag)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear RTC flag status + \param[in] flag: specify which flag status to clear + \arg RTC_FLAG_SECOND: second interrupt flag + \arg RTC_FLAG_ALARM: alarm interrupt flag + \arg RTC_FLAG_OVERFLOW: overflow interrupt flag + \arg RTC_FLAG_RSYN: registers synchronized flag + \param[out] none + \retval none +*/ +void rtc_flag_clear(uint32_t flag) +{ + /* clear RTC flag */ + RTC_CTL &= ~flag; +} + diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_sdio.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_sdio.c new file mode 100644 index 0000000..ab95caf --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_sdio.c @@ -0,0 +1,809 @@ +/*! + \file gd32f30x_sdio.c + \brief SDIO driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_sdio.h" + +#define DEFAULT_RESET_VALUE 0x00000000U + +/*! + \brief deinitialize the SDIO + \param[in] none + \param[out] none + \retval none +*/ +void sdio_deinit(void) +{ + SDIO_PWRCTL = DEFAULT_RESET_VALUE; + SDIO_CLKCTL = DEFAULT_RESET_VALUE; + SDIO_CMDAGMT = DEFAULT_RESET_VALUE; + SDIO_CMDCTL = DEFAULT_RESET_VALUE; + SDIO_DATATO = DEFAULT_RESET_VALUE; + SDIO_DATALEN = DEFAULT_RESET_VALUE; + SDIO_DATACTL = DEFAULT_RESET_VALUE; + SDIO_INTC = DEFAULT_RESET_VALUE; + SDIO_INTEN = DEFAULT_RESET_VALUE; +} + +/*! + \brief configure the SDIO clock + \param[in] clock_edge: SDIO_CLK clock edge + only one parameter can be selected which is shown as below: + \arg SDIO_SDIOCLKEDGE_RISING: select the rising edge of the SDIOCLK to generate SDIO_CLK + \arg SDIO_SDIOCLKEDGE_FALLING: select the falling edge of the SDIOCLK to generate SDIO_CLK + \param[in] clock_bypass: clock bypass + only one parameter can be selected which is shown as below: + \arg SDIO_CLOCKBYPASS_ENABLE: clock bypass + \arg SDIO_CLOCKBYPASS_DISABLE: no bypass + \param[in] clock_powersave: SDIO_CLK clock dynamic switch on/off for power saving + only one parameter can be selected which is shown as below: + \arg SDIO_CLOCKPWRSAVE_ENABLE: SDIO_CLK closed when bus is idle + \arg SDIO_CLOCKPWRSAVE_DISABLE: SDIO_CLK clock is always on + \param[in] clock_division: clock division, less than 512 + \param[out] none + \retval none +*/ +void sdio_clock_config(uint32_t clock_edge, uint32_t clock_bypass, uint32_t clock_powersave, uint16_t clock_division) +{ + uint32_t clock_config = 0U; + clock_config = SDIO_CLKCTL; + /* reset the CLKEDGE, CLKBYP, CLKPWRSAV, DIV */ + clock_config &= ~(SDIO_CLKCTL_CLKEDGE | SDIO_CLKCTL_CLKBYP | SDIO_CLKCTL_CLKPWRSAV | SDIO_CLKCTL_DIV8 | SDIO_CLKCTL_DIV); + /* if the clock division is greater or equal to 256, set the DIV[8] */ + if(clock_division >= 256U){ + clock_config |= SDIO_CLKCTL_DIV8; + clock_division -= 256U; + } + /* configure the SDIO_CLKCTL according to the parameters */ + clock_config |= (clock_edge | clock_bypass | clock_powersave | clock_division); + SDIO_CLKCTL = clock_config; +} + +/*! + \brief enable hardware clock control + \param[in] none + \param[out] none + \retval none +*/ +void sdio_hardware_clock_enable(void) +{ + SDIO_CLKCTL |= SDIO_CLKCTL_HWCLKEN; +} + +/*! + \brief disable hardware clock control + \param[in] none + \param[out] none + \retval none +*/ +void sdio_hardware_clock_disable(void) +{ + SDIO_CLKCTL &= ~SDIO_CLKCTL_HWCLKEN; +} + +/*! + \brief set different SDIO card bus mode + \param[in] bus_mode: SDIO card bus mode + only one parameter can be selected which is shown as below: + \arg SDIO_BUSMODE_1BIT: 1-bit SDIO card bus mode + \arg SDIO_BUSMODE_4BIT: 4-bit SDIO card bus mode + \arg SDIO_BUSMODE_8BIT: 8-bit SDIO card bus mode + \param[out] none + \retval none +*/ +void sdio_bus_mode_set(uint32_t bus_mode) +{ + /* reset the SDIO card bus mode bits and set according to bus_mode */ + SDIO_CLKCTL &= ~SDIO_CLKCTL_BUSMODE; + SDIO_CLKCTL |= bus_mode; +} + +/*! + \brief set the SDIO power state + \param[in] power_state: SDIO power state + only one parameter can be selected which is shown as below: + \arg SDIO_POWER_ON: SDIO power on + \arg SDIO_POWER_OFF: SDIO power off + \param[out] none + \retval none +*/ +void sdio_power_state_set(uint32_t power_state) +{ + SDIO_PWRCTL = power_state; +} + +/*! + \brief get the SDIO power state + \param[in] none + \param[out] none + \retval SDIO power state + \arg SDIO_POWER_ON: SDIO power on + \arg SDIO_POWER_OFF: SDIO power off +*/ +uint32_t sdio_power_state_get(void) +{ + return SDIO_PWRCTL; +} + +/*! + \brief enable SDIO_CLK clock output + \param[in] none + \param[out] none + \retval none +*/ +void sdio_clock_enable(void) +{ + SDIO_CLKCTL |= SDIO_CLKCTL_CLKEN; +} + +/*! + \brief disable SDIO_CLK clock output + \param[in] none + \param[out] none + \retval none +*/ +void sdio_clock_disable(void) +{ + SDIO_CLKCTL &= ~SDIO_CLKCTL_CLKEN; +} + +/*! + \brief configure the command and response + \param[in] cmd_index: command index, refer to the related specifications + \param[in] cmd_argument: command argument, refer to the related specifications + \param[in] response_type: response type + only one parameter can be selected which is shown as below: + \arg SDIO_RESPONSETYPE_NO: no response + \arg SDIO_RESPONSETYPE_SHORT: short response + \arg SDIO_RESPONSETYPE_LONG: long response + \param[out] none + \retval none +*/ +void sdio_command_response_config(uint32_t cmd_index, uint32_t cmd_argument, uint32_t response_type) +{ + uint32_t cmd_config = 0U; + /* reset the command index, command argument and response type */ + SDIO_CMDAGMT &= ~SDIO_CMDAGMT_CMDAGMT; + SDIO_CMDAGMT = cmd_argument; + cmd_config = SDIO_CMDCTL; + cmd_config &= ~(SDIO_CMDCTL_CMDIDX | SDIO_CMDCTL_CMDRESP); + /* configure SDIO_CMDCTL and SDIO_CMDAGMT according to the parameters */ + cmd_config |= (cmd_index | response_type); + SDIO_CMDCTL = cmd_config; +} + +/*! + \brief set the command state machine wait type + \param[in] wait_type: wait type + only one parameter can be selected which is shown as below: + \arg SDIO_WAITTYPE_NO: not wait interrupt + \arg SDIO_WAITTYPE_INTERRUPT: wait interrupt + \arg SDIO_WAITTYPE_DATAEND: wait the end of data transfer + \param[out] none + \retval none +*/ +void sdio_wait_type_set(uint32_t wait_type) +{ + /* reset INTWAIT and WAITDEND */ + SDIO_CMDCTL &= ~(SDIO_CMDCTL_INTWAIT | SDIO_CMDCTL_WAITDEND); + /* set the wait type according to wait_type */ + SDIO_CMDCTL |= wait_type; +} + +/*! + \brief enable the CSM(command state machine) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_csm_enable(void) +{ + SDIO_CMDCTL |= SDIO_CMDCTL_CSMEN; +} + +/*! + \brief disable the CSM(command state machine) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_csm_disable(void) +{ + SDIO_CMDCTL &= ~SDIO_CMDCTL_CSMEN; +} + +/*! + \brief get the last response command index + \param[in] none + \param[out] none + \retval last response command index +*/ +uint8_t sdio_command_index_get(void) +{ + return (uint8_t)SDIO_RSPCMDIDX; +} + +/*! + \brief get the response for the last received command + \param[in] responsex: SDIO response + only one parameter can be selected which is shown as below: + \arg SDIO_RESPONSE0: card response[31:0]/card response[127:96] + \arg SDIO_RESPONSE1: card response[95:64] + \arg SDIO_RESPONSE2: card response[63:32] + \arg SDIO_RESPONSE3: card response[31:1], plus bit 0 + \param[out] none + \retval response for the last received command +*/ +uint32_t sdio_response_get(uint32_t responsex) +{ + uint32_t resp_content = 0U; + switch(responsex){ + case SDIO_RESPONSE0: + resp_content = SDIO_RESP0; + break; + case SDIO_RESPONSE1: + resp_content = SDIO_RESP1; + break; + case SDIO_RESPONSE2: + resp_content = SDIO_RESP2; + break; + case SDIO_RESPONSE3: + resp_content = SDIO_RESP3; + break; + default: + break; + } + return resp_content; +} + +/*! + \brief configure the data timeout, data length and data block size + \param[in] data_timeout: data timeout period in card bus clock periods + \param[in] data_length: number of data bytes to be transferred + \param[in] data_blocksize: size of data block for block transfer + only one parameter can be selected which is shown as below: + \arg SDIO_DATABLOCKSIZE_1BYTE: block size = 1 byte + \arg SDIO_DATABLOCKSIZE_2BYTES: block size = 2 bytes + \arg SDIO_DATABLOCKSIZE_4BYTES: block size = 4 bytes + \arg SDIO_DATABLOCKSIZE_8BYTES: block size = 8 bytes + \arg SDIO_DATABLOCKSIZE_16BYTES: block size = 16 bytes + \arg SDIO_DATABLOCKSIZE_32BYTES: block size = 32 bytes + \arg SDIO_DATABLOCKSIZE_64BYTES: block size = 64 bytes + \arg SDIO_DATABLOCKSIZE_128BYTES: block size = 128 bytes + \arg SDIO_DATABLOCKSIZE_256BYTES: block size = 256 bytes + \arg SDIO_DATABLOCKSIZE_512BYTES: block size = 512 bytes + \arg SDIO_DATABLOCKSIZE_1024BYTES: block size = 1024 bytes + \arg SDIO_DATABLOCKSIZE_2048BYTES: block size = 2048 bytes + \arg SDIO_DATABLOCKSIZE_4096BYTES: block size = 4096 bytes + \arg SDIO_DATABLOCKSIZE_8192BYTES: block size = 8192 bytes + \arg SDIO_DATABLOCKSIZE_16384BYTES: block size = 16384 bytes + \param[out] none + \retval none +*/ +void sdio_data_config(uint32_t data_timeout, uint32_t data_length, uint32_t data_blocksize) +{ + /* reset data timeout, data length and data block size */ + SDIO_DATATO &= ~SDIO_DATATO_DATATO; + SDIO_DATALEN &= ~SDIO_DATALEN_DATALEN; + SDIO_DATACTL &= ~SDIO_DATACTL_BLKSZ; + /* configure the related parameters of data */ + SDIO_DATATO = data_timeout; + SDIO_DATALEN = data_length; + SDIO_DATACTL |= data_blocksize; +} + +/*! + \brief configure the data transfer mode and direction + \param[in] transfer_mode: mode of data transfer + only one parameter can be selected which is shown as below: + \arg SDIO_TRANSMODE_BLOCK: block transfer + \arg SDIO_TRANSMODE_STREAM: stream transfer or SDIO multibyte transfer + \param[in] transfer_direction: data transfer direction, read or write + only one parameter can be selected which is shown as below: + \arg SDIO_TRANSDIRECTION_TOCARD: write data to card + \arg SDIO_TRANSDIRECTION_TOSDIO: read data from card + \param[out] none + \retval none +*/ +void sdio_data_transfer_config(uint32_t transfer_mode, uint32_t transfer_direction) +{ + uint32_t data_trans = 0U; + /* reset the data transfer mode, transfer direction and set according to the parameters */ + data_trans = SDIO_DATACTL; + data_trans &= ~(SDIO_DATACTL_TRANSMOD | SDIO_DATACTL_DATADIR); + data_trans |= (transfer_mode | transfer_direction); + SDIO_DATACTL = data_trans; +} + +/*! + \brief enable the DSM(data state machine) for data transfer + \param[in] none + \param[out] none + \retval none +*/ +void sdio_dsm_enable(void) +{ + SDIO_DATACTL |= SDIO_DATACTL_DATAEN; +} + +/*! + \brief disable the DSM(data state machine) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_dsm_disable(void) +{ + SDIO_DATACTL &= ~SDIO_DATACTL_DATAEN; +} + +/*! + \brief write data(one word) to the transmit FIFO + \param[in] data: 32-bit data write to card + \param[out] none + \retval none +*/ +void sdio_data_write(uint32_t data) +{ + SDIO_FIFO = data; +} + +/*! + \brief read data(one word) from the receive FIFO + \param[in] none + \param[out] none + \retval received data +*/ +uint32_t sdio_data_read(void) +{ + return SDIO_FIFO; +} + +/*! + \brief get the number of remaining data bytes to be transferred to card + \param[in] none + \param[out] none + \retval number of remaining data bytes to be transferred +*/ +uint32_t sdio_data_counter_get(void) +{ + return SDIO_DATACNT; +} + +/*! + \brief get the number of words remaining to be written or read from FIFO + \param[in] none + \param[out] none + \retval remaining number of words +*/ +uint32_t sdio_fifo_counter_get(void) +{ + return SDIO_FIFOCNT; +} + +/*! + \brief enable the DMA request for SDIO + \param[in] none + \param[out] none + \retval none +*/ +void sdio_dma_enable(void) +{ + SDIO_DATACTL |= SDIO_DATACTL_DMAEN; +} + +/*! + \brief disable the DMA request for SDIO + \param[in] none + \param[out] none + \retval none +*/ +void sdio_dma_disable(void) +{ + SDIO_DATACTL &= ~SDIO_DATACTL_DMAEN; +} + +/*! + \brief get the flags state of SDIO + \param[in] flag: flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_FLAG_CCRCERR: command response received (CRC check failed) flag + \arg SDIO_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag + \arg SDIO_FLAG_CMDTMOUT: command response timeout flag + \arg SDIO_FLAG_DTTMOUT: data timeout flag + \arg SDIO_FLAG_TXURE: transmit FIFO underrun error occurs flag + \arg SDIO_FLAG_RXORE: received FIFO overrun error occurs flag + \arg SDIO_FLAG_CMDRECV: command response received (CRC check passed) flag + \arg SDIO_FLAG_CMDSEND: command sent (no response required) flag + \arg SDIO_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag + \arg SDIO_FLAG_STBITE: start bit error in the bus flag + \arg SDIO_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag + \arg SDIO_FLAG_CMDRUN: command transmission in progress flag + \arg SDIO_FLAG_TXRUN: data transmission in progress flag + \arg SDIO_FLAG_RXRUN: data reception in progress flag + \arg SDIO_FLAG_TFH: transmit FIFO is half empty flag: at least 8 words can be written into the FIFO + \arg SDIO_FLAG_RFH: receive FIFO is half full flag: at least 8 words can be read in the FIFO + \arg SDIO_FLAG_TFF: transmit FIFO is full flag + \arg SDIO_FLAG_RFF: receive FIFO is full flag + \arg SDIO_FLAG_TFE: transmit FIFO is empty flag + \arg SDIO_FLAG_RFE: receive FIFO is empty flag + \arg SDIO_FLAG_TXDTVAL: data is valid in transmit FIFO flag + \arg SDIO_FLAG_RXDTVAL: data is valid in receive FIFO flag + \arg SDIO_FLAG_SDIOINT: SD I/O interrupt received flag + \arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus sdio_flag_get(uint32_t flag) +{ + if(RESET != (SDIO_STAT & flag)){ + return SET; + } + return RESET; +} + +/*! + \brief clear the pending flags of SDIO + \param[in] flag: flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_FLAG_CCRCERR: command response received (CRC check failed) flag + \arg SDIO_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag + \arg SDIO_FLAG_CMDTMOUT: command response timeout flag + \arg SDIO_FLAG_DTTMOUT: data timeout flag + \arg SDIO_FLAG_TXURE: transmit FIFO underrun error occurs flag + \arg SDIO_FLAG_RXORE: received FIFO overrun error occurs flag + \arg SDIO_FLAG_CMDRECV: command response received (CRC check passed) flag + \arg SDIO_FLAG_CMDSEND: command sent (no response required) flag + \arg SDIO_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag + \arg SDIO_FLAG_STBITE: start bit error in the bus flag + \arg SDIO_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag + \arg SDIO_FLAG_SDIOINT: SD I/O interrupt received flag + \arg SDIO_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag + \param[out] none + \retval none +*/ +void sdio_flag_clear(uint32_t flag) +{ + SDIO_INTC = flag; +} + +/*! + \brief enable the SDIO interrupt + \param[in] int_flag: interrupt flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_INT_CCRCERR: SDIO CCRCERR interrupt + \arg SDIO_INT_DTCRCERR: SDIO DTCRCERR interrupt + \arg SDIO_INT_CMDTMOUT: SDIO CMDTMOUT interrupt + \arg SDIO_INT_DTTMOUT: SDIO DTTMOUT interrupt + \arg SDIO_INT_TXURE: SDIO TXURE interrupt + \arg SDIO_INT_RXORE: SDIO RXORE interrupt + \arg SDIO_INT_CMDRECV: SDIO CMDRECV interrupt + \arg SDIO_INT_CMDSEND: SDIO CMDSEND interrupt + \arg SDIO_INT_DTEND: SDIO DTEND interrupt + \arg SDIO_INT_STBITE: SDIO STBITE interrupt + \arg SDIO_INT_DTBLKEND: SDIO DTBLKEND interrupt + \arg SDIO_INT_CMDRUN: SDIO CMDRUN interrupt + \arg SDIO_INT_TXRUN: SDIO TXRUN interrupt + \arg SDIO_INT_RXRUN: SDIO RXRUN interrupt + \arg SDIO_INT_TFH: SDIO TFH interrupt + \arg SDIO_INT_RFH: SDIO RFH interrupt + \arg SDIO_INT_TFF: SDIO TFF interrupt + \arg SDIO_INT_RFF: SDIO RFF interrupt + \arg SDIO_INT_TFE: SDIO TFE interrupt + \arg SDIO_INT_RFE: SDIO RFE interrupt + \arg SDIO_INT_TXDTVAL: SDIO TXDTVAL interrupt + \arg SDIO_INT_RXDTVAL: SDIO RXDTVAL interrupt + \arg SDIO_INT_SDIOINT: SDIO SDIOINT interrupt + \arg SDIO_INT_ATAEND: SDIO ATAEND interrupt + \param[out] none + \retval none +*/ +void sdio_interrupt_enable(uint32_t int_flag) +{ + SDIO_INTEN |= int_flag; +} + +/*! + \brief disable the SDIO interrupt + \param[in] int_flag: interrupt flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_INT_CCRCERR: SDIO CCRCERR interrupt + \arg SDIO_INT_DTCRCERR: SDIO DTCRCERR interrupt + \arg SDIO_INT_CMDTMOUT: SDIO CMDTMOUT interrupt + \arg SDIO_INT_DTTMOUT: SDIO DTTMOUT interrupt + \arg SDIO_INT_TXURE: SDIO TXURE interrupt + \arg SDIO_INT_RXORE: SDIO RXORE interrupt + \arg SDIO_INT_CMDRECV: SDIO CMDRECV interrupt + \arg SDIO_INT_CMDSEND: SDIO CMDSEND interrupt + \arg SDIO_INT_DTEND: SDIO DTEND interrupt + \arg SDIO_INT_STBITE: SDIO STBITE interrupt + \arg SDIO_INT_DTBLKEND: SDIO DTBLKEND interrupt + \arg SDIO_INT_CMDRUN: SDIO CMDRUN interrupt + \arg SDIO_INT_TXRUN: SDIO TXRUN interrupt + \arg SDIO_INT_RXRUN: SDIO RXRUN interrupt + \arg SDIO_INT_TFH: SDIO TFH interrupt + \arg SDIO_INT_RFH: SDIO RFH interrupt + \arg SDIO_INT_TFF: SDIO TFF interrupt + \arg SDIO_INT_RFF: SDIO RFF interrupt + \arg SDIO_INT_TFE: SDIO TFE interrupt + \arg SDIO_INT_RFE: SDIO RFE interrupt + \arg SDIO_INT_TXDTVAL: SDIO TXDTVAL interrupt + \arg SDIO_INT_RXDTVAL: SDIO RXDTVAL interrupt + \arg SDIO_INT_SDIOINT: SDIO SDIOINT interrupt + \arg SDIO_INT_ATAEND: SDIO ATAEND interrupt + \param[out] none + \retval none +*/ +void sdio_interrupt_disable(uint32_t int_flag) +{ + SDIO_INTEN &= ~int_flag; +} + +/*! + \brief get the interrupt flags state of SDIO + \param[in] int_flag: interrupt flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_INT_FLAG_CCRCERR: SDIO CCRCERR interrupt flag + \arg SDIO_INT_FLAG_DTCRCERR: SDIO DTCRCERR interrupt flag + \arg SDIO_INT_FLAG_CMDTMOUT: SDIO CMDTMOUT interrupt flag + \arg SDIO_INT_FLAG_DTTMOUT: SDIO DTTMOUT interrupt flag + \arg SDIO_INT_FLAG_TXURE: SDIO TXURE interrupt flag + \arg SDIO_INT_FLAG_RXORE: SDIO RXORE interrupt flag + \arg SDIO_INT_FLAG_CMDRECV: SDIO CMDRECV interrupt flag + \arg SDIO_INT_FLAG_CMDSEND: SDIO CMDSEND interrupt flag + \arg SDIO_INT_FLAG_DTEND: SDIO DTEND interrupt flag + \arg SDIO_INT_FLAG_STBITE: SDIO STBITE interrupt flag + \arg SDIO_INT_FLAG_DTBLKEND: SDIO DTBLKEND interrupt flag + \arg SDIO_INT_FLAG_CMDRUN: SDIO CMDRUN interrupt flag + \arg SDIO_INT_FLAG_TXRUN: SDIO TXRUN interrupt flag + \arg SDIO_INT_FLAG_RXRUN: SDIO RXRUN interrupt flag + \arg SDIO_INT_FLAG_TFH: SDIO TFH interrupt flag + \arg SDIO_INT_FLAG_RFH: SDIO RFH interrupt flag + \arg SDIO_INT_FLAG_TFF: SDIO TFF interrupt flag + \arg SDIO_INT_FLAG_RFF: SDIO RFF interrupt flag + \arg SDIO_INT_FLAG_TFE: SDIO TFE interrupt flag + \arg SDIO_INT_FLAG_RFE: SDIO RFE interrupt flag + \arg SDIO_INT_FLAG_TXDTVAL: SDIO TXDTVAL interrupt flag + \arg SDIO_INT_FLAG_RXDTVAL: SDIO RXDTVAL interrupt flag + \arg SDIO_INT_FLAG_SDIOINT: SDIO SDIOINT interrupt flag + \arg SDIO_INT_FLAG_ATAEND: SDIO ATAEND interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus sdio_interrupt_flag_get(uint32_t int_flag) +{ + if(RESET != (SDIO_STAT & int_flag)){ + return SET; + } + return RESET; +} + +/*! + \brief clear the interrupt pending flags of SDIO + \param[in] int_flag: interrupt flags state of SDIO + one or more parameters can be selected which are shown as below: + \arg SDIO_INT_FLAG_CCRCERR: command response received (CRC check failed) flag + \arg SDIO_INT_FLAG_DTCRCERR: data block sent/received (CRC check failed) flag + \arg SDIO_INT_FLAG_CMDTMOUT: command response timeout flag + \arg SDIO_INT_FLAG_DTTMOUT: data timeout flag + \arg SDIO_INT_FLAG_TXURE: transmit FIFO underrun error occurs flag + \arg SDIO_INT_FLAG_RXORE: received FIFO overrun error occurs flag + \arg SDIO_INT_FLAG_CMDRECV: command response received (CRC check passed) flag + \arg SDIO_INT_FLAG_CMDSEND: command sent (no response required) flag + \arg SDIO_INT_FLAG_DTEND: data end (data counter, SDIO_DATACNT, is zero) flag + \arg SDIO_INT_FLAG_STBITE: start bit error in the bus flag + \arg SDIO_INT_FLAG_DTBLKEND: data block sent/received (CRC check passed) flag + \arg SDIO_INT_FLAG_SDIOINT: SD I/O interrupt received flag + \arg SDIO_INT_FLAG_ATAEND: CE-ATA command completion signal received (only for CMD61) flag + \param[out] none + \retval none +*/ +void sdio_interrupt_flag_clear(uint32_t int_flag) +{ + SDIO_INTC = int_flag; +} + +/*! + \brief enable the read wait mode(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_readwait_enable(void) +{ + SDIO_DATACTL |= SDIO_DATACTL_RWEN; +} + +/*! + \brief disable the read wait mode(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_readwait_disable(void) +{ + SDIO_DATACTL &= ~SDIO_DATACTL_RWEN; +} + +/*! + \brief enable the function that stop the read wait process(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_stop_readwait_enable(void) +{ + SDIO_DATACTL |= SDIO_DATACTL_RWSTOP; +} + +/*! + \brief disable the function that stop the read wait process(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_stop_readwait_disable(void) +{ + SDIO_DATACTL &= ~SDIO_DATACTL_RWSTOP; +} + +/*! + \brief set the read wait type(SD I/O only) + \param[in] readwait_type: SD I/O read wait type + only one parameter can be selected which is shown as below: + \arg SDIO_READWAITTYPE_CLK: read wait control by stopping SDIO_CLK + \arg SDIO_READWAITTYPE_DAT2: read wait control using SDIO_DAT[2] + \param[out] none + \retval none +*/ +void sdio_readwait_type_set(uint32_t readwait_type) +{ + if(SDIO_READWAITTYPE_CLK == readwait_type){ + SDIO_DATACTL |= SDIO_DATACTL_RWTYPE; + }else{ + SDIO_DATACTL &= ~SDIO_DATACTL_RWTYPE; + } +} + +/*! + \brief enable the SD I/O mode specific operation(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_operation_enable(void) +{ + SDIO_DATACTL |= SDIO_DATACTL_IOEN; +} + +/*! + \brief disable the SD I/O mode specific operation(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_operation_disable(void) +{ + SDIO_DATACTL &= ~SDIO_DATACTL_IOEN; +} + +/*! + \brief enable the SD I/O suspend operation(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_suspend_enable(void) +{ + SDIO_CMDCTL |= SDIO_CMDCTL_SUSPEND; +} + +/*! + \brief disable the SD I/O suspend operation(SD I/O only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_suspend_disable(void) +{ + SDIO_CMDCTL &= ~SDIO_CMDCTL_SUSPEND; +} + +/*! + \brief enable the CE-ATA command(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_command_enable(void) +{ + SDIO_CMDCTL |= SDIO_CMDCTL_ATAEN; +} + +/*! + \brief disable the CE-ATA command(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_command_disable(void) +{ + SDIO_CMDCTL &= ~SDIO_CMDCTL_ATAEN; +} + +/*! + \brief enable the CE-ATA interrupt(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_interrupt_enable(void) +{ + SDIO_CMDCTL &= ~SDIO_CMDCTL_NINTEN; +} + +/*! + \brief disable the CE-ATA interrupt(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_interrupt_disable(void) +{ + SDIO_CMDCTL |= SDIO_CMDCTL_NINTEN; +} + +/*! + \brief enable the CE-ATA command completion signal(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_command_completion_enable(void) +{ + SDIO_CMDCTL |= SDIO_CMDCTL_ENCMDC; +} + +/*! + \brief disable the CE-ATA command completion signal(CE-ATA only) + \param[in] none + \param[out] none + \retval none +*/ +void sdio_ceata_command_completion_disable(void) +{ + SDIO_CMDCTL &= ~SDIO_CMDCTL_ENCMDC; +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_spi.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_spi.c new file mode 100644 index 0000000..26736cf --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_spi.c @@ -0,0 +1,859 @@ +/*! + \file gd32f30x_spi.c + \brief SPI driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_spi.h" + +#define SPI_ERROR_HANDLE(s) do{}while(1) + +/* SPI/I2S parameter initialization mask */ +#define SPI_INIT_MASK ((uint32_t)0x00003040U) /*!< SPI parameter initialization mask */ +#define I2S_INIT_MASK ((uint32_t)0x0000F047U) /*!< I2S parameter initialization mask */ + +/* default value */ +#define SPI_I2SPSC_DEFAULT_VALUE ((uint32_t)0x00000002U) /*!< default value of SPI_I2SPSC register */ + +/* I2S clock source selection, multiplication and division mask */ +#define I2S1_CLOCK_SEL ((uint32_t)0x00020000U) /*!< I2S1 clock source selection */ +#define I2S2_CLOCK_SEL ((uint32_t)0x00040000U) /*!< I2S2 clock source selection */ +#define I2S_CLOCK_MUL_MASK ((uint32_t)0x0000F000U) /*!< I2S clock multiplication mask */ +#define I2S_CLOCK_DIV_MASK ((uint32_t)0x000000F0U) /*!< I2S clock division mask */ + +/*! + \brief reset SPI and I2S + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_i2s_deinit(uint32_t spi_periph) +{ + switch(spi_periph){ + case SPI0: + /* reset SPI0 */ + rcu_periph_reset_enable(RCU_SPI0RST); + rcu_periph_reset_disable(RCU_SPI0RST); + break; + case SPI1: + /* reset SPI1 and I2S1 */ + rcu_periph_reset_enable(RCU_SPI1RST); + rcu_periph_reset_disable(RCU_SPI1RST); + break; + case SPI2: + /* reset SPI2 and I2S2 */ + rcu_periph_reset_enable(RCU_SPI2RST); + rcu_periph_reset_disable(RCU_SPI2RST); + break; + default : + break; + } +} + +/*! + \brief initialize the parameters of SPI struct with default values + \param[in] none + \param[out] spi_parameter_struct: the initialized struct spi_parameter_struct pointer + \retval none +*/ +void spi_struct_para_init(spi_parameter_struct *spi_struct) +{ + /* configure the structure with default value */ + spi_struct->device_mode = SPI_SLAVE; + spi_struct->trans_mode = SPI_TRANSMODE_FULLDUPLEX; + spi_struct->frame_size = SPI_FRAMESIZE_8BIT; + spi_struct->nss = SPI_NSS_HARD; + spi_struct->clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; + spi_struct->prescale = SPI_PSC_2; + spi_struct->endian = SPI_ENDIAN_MSB; +} + +/*! + \brief initialize SPI parameter + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] spi_struct: SPI parameter initialization stuct members of the structure + and the member values are shown as below: + device_mode: SPI_MASTER, SPI_SLAVE + trans_mode: SPI_TRANSMODE_FULLDUPLEX, SPI_TRANSMODE_RECEIVEONLY, + SPI_TRANSMODE_BDRECEIVE, SPI_TRANSMODE_BDTRANSMIT + frame_size: SPI_FRAMESIZE_16BIT, SPI_FRAMESIZE_8BIT + nss: SPI_NSS_SOFT, SPI_NSS_HARD + endian: SPI_ENDIAN_MSB, SPI_ENDIAN_LSB + clock_polarity_phase: SPI_CK_PL_LOW_PH_1EDGE, SPI_CK_PL_HIGH_PH_1EDGE + SPI_CK_PL_LOW_PH_2EDGE, SPI_CK_PL_HIGH_PH_2EDGE + prescale: SPI_PSC_n (n=2,4,8,16,32,64,128,256) + \param[out] none + \retval none +*/ +void spi_init(uint32_t spi_periph, spi_parameter_struct* spi_struct) +{ + uint32_t reg = 0U; + reg = SPI_CTL0(spi_periph); + reg &= SPI_INIT_MASK; + + /* select SPI as master or slave */ + reg |= spi_struct->device_mode; + /* select SPI transfer mode */ + reg |= spi_struct->trans_mode; + /* select SPI frame size */ + reg |= spi_struct->frame_size; + /* select SPI NSS use hardware or software */ + reg |= spi_struct->nss; + /* select SPI LSB or MSB */ + reg |= spi_struct->endian; + /* select SPI polarity and phase */ + reg |= spi_struct->clock_polarity_phase; + /* select SPI prescale to adjust transmit speed */ + reg |= spi_struct->prescale; + + /* write to SPI_CTL0 register */ + SPI_CTL0(spi_periph) = (uint32_t)reg; + + SPI_I2SCTL(spi_periph) &= (uint32_t)(~SPI_I2SCTL_I2SSEL); +} + +/*! + \brief enable SPI + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_enable(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_SPIEN; +} + +/*! + \brief disable SPI + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_disable(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_SPIEN); +} + +/*! + \brief initialize I2S parameter + \param[in] spi_periph: SPIx(x=1,2) + \param[in] i2s_mode: I2S operation mode + only one parameter can be selected which is shown as below: + \arg I2S_MODE_SLAVETX: I2S slave transmit mode + \arg I2S_MODE_SLAVERX: I2S slave receive mode + \arg I2S_MODE_MASTERTX: I2S master transmit mode + \arg I2S_MODE_MASTERRX: I2S master receive mode + \param[in] i2s_standard: I2S standard + only one parameter can be selected which is shown as below: + \arg I2S_STD_PHILLIPS: I2S phillips standard + \arg I2S_STD_MSB: I2S MSB standard + \arg I2S_STD_LSB: I2S LSB standard + \arg I2S_STD_PCMSHORT: I2S PCM short standard + \arg I2S_STD_PCMLONG: I2S PCM long standard + \param[in] i2s_ckpl: I2S idle state clock polarity + only one parameter can be selected which is shown as below: + \arg I2S_CKPL_LOW: I2S clock polarity low level + \arg I2S_CKPL_HIGH: I2S clock polarity high level + \param[out] none + \retval none +*/ +void i2s_init(uint32_t spi_periph, uint32_t i2s_mode, uint32_t i2s_standard, uint32_t i2s_ckpl) +{ + uint32_t reg= 0U; + reg = SPI_I2SCTL(spi_periph); + reg &= I2S_INIT_MASK; + + /* enable I2S mode */ + reg |= (uint32_t)SPI_I2SCTL_I2SSEL; + /* select I2S mode */ + reg |= (uint32_t)i2s_mode; + /* select I2S standard */ + reg |= (uint32_t)i2s_standard; + /* select I2S polarity */ + reg |= (uint32_t)i2s_ckpl; + + /* write to SPI_I2SCTL register */ + SPI_I2SCTL(spi_periph) = (uint32_t)reg; +} + +/*! + \brief configure I2S prescaler + \param[in] spi_periph: SPIx(x=1,2) + \param[in] i2s_audiosample: I2S audio sample rate + only one parameter can be selected which is shown as below: + \arg I2S_AUDIOSAMPLE_8K: audio sample rate is 8KHz + \arg I2S_AUDIOSAMPLE_11K: audio sample rate is 11KHz + \arg I2S_AUDIOSAMPLE_16K: audio sample rate is 16KHz + \arg I2S_AUDIOSAMPLE_22K: audio sample rate is 22KHz + \arg I2S_AUDIOSAMPLE_32K: audio sample rate is 32KHz + \arg I2S_AUDIOSAMPLE_44K: audio sample rate is 44KHz + \arg I2S_AUDIOSAMPLE_48K: audio sample rate is 48KHz + \arg I2S_AUDIOSAMPLE_96K: audio sample rate is 96KHz + \arg I2S_AUDIOSAMPLE_192K: audio sample rate is 192KHz + \param[in] i2s_frameformat: I2S data length and channel length + only one parameter can be selected which is shown as below: + \arg I2S_FRAMEFORMAT_DT16B_CH16B: I2S data length is 16 bit and channel length is 16 bit + \arg I2S_FRAMEFORMAT_DT16B_CH32B: I2S data length is 16 bit and channel length is 32 bit + \arg I2S_FRAMEFORMAT_DT24B_CH32B: I2S data length is 24 bit and channel length is 32 bit + \arg I2S_FRAMEFORMAT_DT32B_CH32B: I2S data length is 32 bit and channel length is 32 bit + \param[in] i2s_mckout: I2S master clock output + only one parameter can be selected which is shown as below: + \arg I2S_MCKOUT_ENABLE: I2S master clock output enable + \arg I2S_MCKOUT_DISABLE: I2S master clock output disable + \param[out] none + \retval none +*/ +void i2s_psc_config(uint32_t spi_periph, uint32_t i2s_audiosample, uint32_t i2s_frameformat, uint32_t i2s_mckout) +{ + uint32_t i2sdiv = 2U, i2sof = 0U; + uint32_t clks = 0U; + uint32_t i2sclock = 0U; + +#ifdef GD32F30X_CL + uint32_t pll2mf_4 = 0U; +#endif /* GD32F30X_CL */ + + /* judge whether the audiosample is 0 */ + if(0U == i2s_audiosample){ + SPI_ERROR_HANDLE("the parameter can not be 0 \r\n"); + } + /* deinit SPI_I2SPSC register */ + SPI_I2SPSC(spi_periph) = SPI_I2SPSC_DEFAULT_VALUE; + +#ifdef GD32F30X_CL + /* get the I2S clock source */ + if(((uint32_t)spi_periph) == SPI1){ + /* I2S1 clock source selection */ + clks = I2S1_CLOCK_SEL; + }else{ + /* I2S2 clock source selection */ + clks = I2S2_CLOCK_SEL; + } + + if(0U != (RCU_CFG1 & clks)){ + /* get RCU PLL2 clock multiplication factor */ + clks = (uint32_t)((RCU_CFG1 & I2S_CLOCK_MUL_MASK) >> 12U); + + pll2mf_4 = RCU_CFG1 & RCU_CFG1_PLL2MF_4; + + if( 0U == pll2mf_4){ + if((clks > 5U) && (clks < 15U)){ + /* multiplier is between 8 and 16 */ + clks += 2U; + }else{ + if(15U == clks){ + /* multiplier is 20 */ + clks = 20U; + } + } + }else{ + if(clks < 15U){ + /* multiplier is between 18 and 32 */ + clks += 18U; + }else{ + if(15U == clks){ + /* multiplier is 40 */ + clks = 40U; + } + } + } + + /* get the PREDV1 value */ + i2sclock = (uint32_t)(((RCU_CFG1 & I2S_CLOCK_DIV_MASK) >> 4U) + 1U); + /* calculate i2sclock based on PLL2 and PREDV1 */ + i2sclock = (uint32_t)((HXTAL_VALUE / i2sclock) * clks * 2U); + }else{ + /* get system clock */ + i2sclock = rcu_clock_freq_get(CK_SYS); + } +#else + /* get system clock */ + i2sclock = rcu_clock_freq_get(CK_SYS); +#endif /* GD32F30X_CL */ + + /* config the prescaler depending on the mclk output state, the frame format and audio sample rate */ + if(I2S_MCKOUT_ENABLE == i2s_mckout){ + clks = (uint32_t)(((i2sclock / 256U) * 10U) / i2s_audiosample); + }else{ + if(I2S_FRAMEFORMAT_DT16B_CH16B == i2s_frameformat){ + clks = (uint32_t)(((i2sclock / 32U) *10U ) / i2s_audiosample); + }else{ + clks = (uint32_t)(((i2sclock / 64U) *10U ) / i2s_audiosample); + } + } + + /* remove the floating point */ + clks = (clks + 5U) / 10U; + i2sof = (clks & 0x00000001U); + i2sdiv = ((clks - i2sof) / 2U); + i2sof = (i2sof << 8U); + + /* set the default values */ + if((i2sdiv < 2U) || (i2sdiv > 255U)){ + i2sdiv = 2U; + i2sof = 0U; + } + + /* configure SPI_I2SPSC */ + SPI_I2SPSC(spi_periph) = (uint32_t)(i2sdiv | i2sof | i2s_mckout); + + /* clear SPI_I2SCTL_DTLEN and SPI_I2SCTL_CHLEN bits */ + SPI_I2SCTL(spi_periph) &= (uint32_t)(~(SPI_I2SCTL_DTLEN | SPI_I2SCTL_CHLEN)); + /* configure data frame format */ + SPI_I2SCTL(spi_periph) |= (uint32_t)i2s_frameformat; +} + +/*! + \brief enable I2S + \param[in] spi_periph: SPIx(x=1,2) + \param[out] none + \retval none +*/ +void i2s_enable(uint32_t spi_periph) +{ + SPI_I2SCTL(spi_periph) |= (uint32_t)SPI_I2SCTL_I2SEN; +} + +/*! + \brief disable I2S + \param[in] spi_periph: SPIx(x=1,2) + \param[out] none + \retval none +*/ +void i2s_disable(uint32_t spi_periph) +{ + SPI_I2SCTL(spi_periph) &= (uint32_t)(~SPI_I2SCTL_I2SEN); +} + +/*! + \brief enable SPI NSS output + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nss_output_enable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_NSSDRV; +} + +/*! + \brief disable SPI NSS output + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nss_output_disable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_NSSDRV); +} + +/*! + \brief SPI NSS pin high level in software mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nss_internal_high(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_SWNSS; +} + +/*! + \brief SPI NSS pin low level in software mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nss_internal_low(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_SWNSS); +} + +/*! + \brief enable SPI DMA send or receive + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] dma: SPI DMA mode + only one parameter can be selected which is shown as below: + \arg SPI_DMA_TRANSMIT: SPI transmit data use DMA + \arg SPI_DMA_RECEIVE: SPI receive data use DMA + \param[out] none + \retval none +*/ +void spi_dma_enable(uint32_t spi_periph, uint8_t dma) +{ + if(SPI_DMA_TRANSMIT == dma){ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_DMATEN; + }else{ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_DMAREN; + } +} + +/*! + \brief disable SPI DMA send or receive + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] dma: SPI DMA mode + only one parameter can be selected which is shown as below: + \arg SPI_DMA_TRANSMIT: SPI transmit data use DMA + \arg SPI_DMA_RECEIVE: SPI receive data use DMA + \param[out] none + \retval none +*/ +void spi_dma_disable(uint32_t spi_periph, uint8_t dma) +{ + if(SPI_DMA_TRANSMIT == dma){ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_DMATEN); + }else{ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_DMAREN); + } +} + +/*! + \brief configure SPI/I2S data frame format + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] frame_format: SPI frame size + only one parameter can be selected which is shown as below: + \arg SPI_FRAMESIZE_16BIT: SPI frame size is 16 bits + \arg SPI_FRAMESIZE_8BIT: SPI frame size is 8 bits + \param[out] none + \retval none +*/ +void spi_i2s_data_frame_format_config(uint32_t spi_periph, uint16_t frame_format) +{ + /* clear SPI_CTL0_FF16 bit */ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_FF16); + /* confige SPI_CTL0_FF16 bit */ + SPI_CTL0(spi_periph) |= (uint32_t)frame_format; +} + +/*! + \brief SPI transmit data + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] data: 16-bit data + \param[out] none + \retval none +*/ +void spi_i2s_data_transmit(uint32_t spi_periph, uint16_t data) +{ + SPI_DATA(spi_periph) = (uint32_t)data; +} + +/*! + \brief SPI receive data + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval 16-bit data +*/ +uint16_t spi_i2s_data_receive(uint32_t spi_periph) +{ + return ((uint16_t)SPI_DATA(spi_periph)); +} + +/*! + \brief configure SPI bidirectional transfer direction + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] transfer_direction: SPI transfer direction + only one parameter can be selected which is shown as below: + \arg SPI_BIDIRECTIONAL_TRANSMIT: SPI work in transmit-only mode + \arg SPI_BIDIRECTIONAL_RECEIVE: SPI work in receive-only mode + \retval none +*/ +void spi_bidirectional_transfer_config(uint32_t spi_periph, uint32_t transfer_direction) +{ + if(SPI_BIDIRECTIONAL_TRANSMIT == transfer_direction){ + /* set the transmit only mode */ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_BIDIRECTIONAL_TRANSMIT; + }else{ + /* set the receive only mode */ + SPI_CTL0(spi_periph) &= SPI_BIDIRECTIONAL_RECEIVE; + } +} + +/*! + \brief set SPI CRC polynomial + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] crc_poly: CRC polynomial value + \param[out] none + \retval none +*/ +void spi_crc_polynomial_set(uint32_t spi_periph,uint16_t crc_poly) +{ + /* set SPI CRC polynomial */ + SPI_CRCPOLY(spi_periph) = (uint32_t)crc_poly; +} + +/*! + \brief get SPI CRC polynomial + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval 16-bit CRC polynomial +*/ +uint16_t spi_crc_polynomial_get(uint32_t spi_periph) +{ + return ((uint16_t)SPI_CRCPOLY(spi_periph)); +} + +/*! + \brief turn on CRC function + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_crc_on(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_CRCEN; +} + +/*! + \brief turn off CRC function + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_crc_off(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_CRCEN); +} + +/*! + \brief SPI next data is CRC value + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_crc_next(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_CRCNT; +} + +/*! + \brief get SPI CRC send value or receive value + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] crc: SPI crc value + only one parameter can be selected which is shown as below: + \arg SPI_CRC_TX: get transmit crc value + \arg SPI_CRC_RX: get receive crc value + \param[out] none + \retval 16-bit CRC value +*/ +uint16_t spi_crc_get(uint32_t spi_periph,uint8_t crc) +{ + if(SPI_CRC_TX == crc){ + return ((uint16_t)(SPI_TCRC(spi_periph))); + }else{ + return ((uint16_t)(SPI_RCRC(spi_periph))); + } +} + +/*! + \brief enable SPI TI mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_ti_mode_enable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_TMOD; +} + +/*! + \brief disable SPI TI mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_ti_mode_disable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_TMOD); +} + +/*! + \brief enable SPI NSS pulse mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nssp_mode_enable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_NSSP; +} + +/*! + \brief disable SPI NSS pulse mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nssp_mode_disable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_NSSP); +} + +/*! + \brief enable quad wire SPI + \param[in] spi_periph: SPIx(only x=0) + \param[out] none + \retval none +*/ +void qspi_enable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) |= (uint32_t)SPI_QCTL_QMOD; +} + +/*! + \brief disable quad wire SPI + \param[in] spi_periph: SPIx(only x=0) + \param[out] none + \retval none +*/ +void qspi_disable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) &= (uint32_t)(~SPI_QCTL_QMOD); +} + +/*! + \brief enable quad wire SPI write + \param[in] spi_periph: SPIx(only x=0) + \param[out] none + \retval none +*/ +void qspi_write_enable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) &= (uint32_t)(~SPI_QCTL_QRD); +} + +/*! + \brief enable quad wire SPI read + \param[in] spi_periph: SPIx(only x=0) + \param[out] none + \retval none +*/ +void qspi_read_enable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) |= (uint32_t)SPI_QCTL_QRD; +} + +/*! + \brief enable SPI_IO2 and SPI_IO3 pin output + \param[in] spi_periph: SPIx(only x=0) + \param[out] none + \retval none +*/ +void qspi_io23_output_enable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) |= (uint32_t)SPI_QCTL_IO23_DRV; +} + + /*! + \brief disable SPI_IO2 and SPI_IO3 pin output + \param[in] spi_periph: SPIx(only x=0) + \param[out] none + \retval none +*/ + void qspi_io23_output_disable(uint32_t spi_periph) +{ + SPI_QCTL(spi_periph) &= (uint32_t)(~SPI_QCTL_IO23_DRV); +} + +/*! + \brief enable SPI and I2S interrupt + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] interrupt: SPI/I2S interrupt + only one parameter can be selected which is shown as below: + \arg SPI_I2S_INT_TBE: transmit buffer empty interrupt + \arg SPI_I2S_INT_RBNE: receive buffer not empty interrupt + \arg SPI_I2S_INT_ERR: CRC error,configuration error,reception overrun error, + transmission underrun error and format error interrupt + \param[out] none + \retval none +*/ +void spi_i2s_interrupt_enable(uint32_t spi_periph, uint8_t interrupt) +{ + switch(interrupt){ + /* SPI/I2S transmit buffer empty interrupt */ + case SPI_I2S_INT_TBE: + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_TBEIE; + break; + /* SPI/I2S receive buffer not empty interrupt */ + case SPI_I2S_INT_RBNE: + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_RBNEIE; + break; + /* SPI/I2S error */ + case SPI_I2S_INT_ERR: + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_ERRIE; + break; + default: + break; + } +} + +/*! + \brief disable SPI and I2S interrupt + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] interrupt: SPI/I2S interrupt + only one parameter can be selected which is shown as below: + \arg SPI_I2S_INT_TBE: transmit buffer empty interrupt + \arg SPI_I2S_INT_RBNE: receive buffer not empty interrupt + \arg SPI_I2S_INT_ERR: CRC error,configuration error,reception overrun error, + transmission underrun error and format error interrupt + \param[out] none + \retval none +*/ +void spi_i2s_interrupt_disable(uint32_t spi_periph, uint8_t interrupt) +{ + switch(interrupt){ + /* SPI/I2S transmit buffer empty interrupt */ + case SPI_I2S_INT_TBE: + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_TBEIE); + break; + /* SPI/I2S receive buffer not empty interrupt */ + case SPI_I2S_INT_RBNE: + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_RBNEIE); + break; + /* SPI/I2S error */ + case SPI_I2S_INT_ERR: + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_ERRIE); + break; + default : + break; + } +} + +/*! + \brief get SPI and I2S interrupt flag status + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] interrupt: SPI/I2S interrupt flag status + only one parameter can be selected which is shown as below: + \arg SPI_I2S_INT_FLAG_TBE: transmit buffer empty interrupt flag + \arg SPI_I2S_INT_FLAG_RBNE: receive buffer not empty interrupt flag + \arg SPI_I2S_INT_FLAG_RXORERR: overrun interrupt flag + \arg SPI_INT_FLAG_CONFERR: config error interrupt flag + \arg SPI_INT_FLAG_CRCERR: CRC error interrupt flag + \arg I2S_INT_FLAG_TXURERR: underrun error interrupt flag + \arg SPI_I2S_INT_FLAG_FERR: format error interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus spi_i2s_interrupt_flag_get(uint32_t spi_periph, uint8_t interrupt) +{ + uint32_t reg1 = SPI_STAT(spi_periph); + uint32_t reg2 = SPI_CTL1(spi_periph); + + switch(interrupt){ + /* SPI/I2S transmit buffer empty interrupt */ + case SPI_I2S_INT_FLAG_TBE: + reg1 = reg1 & SPI_STAT_TBE; + reg2 = reg2 & SPI_CTL1_TBEIE; + break; + /* SPI/I2S receive buffer not empty interrupt */ + case SPI_I2S_INT_FLAG_RBNE: + reg1 = reg1 & SPI_STAT_RBNE; + reg2 = reg2 & SPI_CTL1_RBNEIE; + break; + /* SPI/I2S overrun interrupt */ + case SPI_I2S_INT_FLAG_RXORERR: + reg1 = reg1 & SPI_STAT_RXORERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* SPI config error interrupt */ + case SPI_INT_FLAG_CONFERR: + reg1 = reg1 & SPI_STAT_CONFERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* SPI CRC error interrupt */ + case SPI_INT_FLAG_CRCERR: + reg1 = reg1 & SPI_STAT_CRCERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* I2S underrun error interrupt */ + case I2S_INT_FLAG_TXURERR: + reg1 = reg1 & SPI_STAT_TXURERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* SPI/I2S format error interrupt */ + case SPI_I2S_INT_FLAG_FERR: + reg1 = reg1 & SPI_STAT_FERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + default : + break; + } + /*get SPI/I2S interrupt flag status */ + if(reg1 && reg2){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief get SPI and I2S flag status + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] flag: SPI/I2S flag status + only one parameter can be selected which is shown as below: + \arg SPI_FLAG_TBE: transmit buffer empty flag + \arg SPI_FLAG_RBNE: receive buffer not empty flag + \arg SPI_FLAG_TRANS: transmit on-going flag + \arg SPI_FLAG_RXORERR: receive overrun error flag + \arg SPI_FLAG_CONFERR: mode config error flag + \arg SPI_FLAG_CRCERR: CRC error flag + \arg SPI_FLAG_FERR: format error flag + \arg I2S_FLAG_TBE: transmit buffer empty flag + \arg I2S_FLAG_RBNE: receive buffer not empty flag + \arg I2S_FLAG_TRANS: transmit on-going flag + \arg I2S_FLAG_RXORERR: overrun error flag + \arg I2S_FLAG_TXURERR: underrun error flag + \arg I2S_FLAG_CH: channel side flag + \arg I2S_FLAG_FERR: format error flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus spi_i2s_flag_get(uint32_t spi_periph, uint32_t flag) +{ + if(SPI_STAT(spi_periph) & flag){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear SPI CRC error flag status + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_crc_error_clear(uint32_t spi_periph) +{ + SPI_STAT(spi_periph) &= (uint32_t)(~SPI_FLAG_CRCERR); +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_timer.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_timer.c new file mode 100644 index 0000000..456062f --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_timer.c @@ -0,0 +1,2042 @@ +/*! + \file gd32f30x_timer.c + \brief TIMER driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_timer.h" + +/*! + \brief deinit a TIMER + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_deinit(uint32_t timer_periph) +{ + switch(timer_periph){ + case TIMER0: + /* reset TIMER0 */ + rcu_periph_reset_enable(RCU_TIMER0RST); + rcu_periph_reset_disable(RCU_TIMER0RST); + break; + case TIMER1: + /* reset TIMER1 */ + rcu_periph_reset_enable(RCU_TIMER1RST); + rcu_periph_reset_disable(RCU_TIMER1RST); + break; + case TIMER2: + /* reset TIMER2 */ + rcu_periph_reset_enable(RCU_TIMER2RST); + rcu_periph_reset_disable(RCU_TIMER2RST); + break; + case TIMER3: + /* reset TIMER3 */ + rcu_periph_reset_enable(RCU_TIMER3RST); + rcu_periph_reset_disable(RCU_TIMER3RST); + break; + case TIMER4: + /* reset TIMER4 */ + rcu_periph_reset_enable(RCU_TIMER4RST); + rcu_periph_reset_disable(RCU_TIMER4RST); + break; + case TIMER5: + /* reset TIMER5 */ + rcu_periph_reset_enable(RCU_TIMER5RST); + rcu_periph_reset_disable(RCU_TIMER5RST); + break; + case TIMER6: + /* reset TIMER6 */ + rcu_periph_reset_enable(RCU_TIMER6RST); + rcu_periph_reset_disable(RCU_TIMER6RST); + break; + case TIMER7: + /* reset TIMER7 */ + rcu_periph_reset_enable(RCU_TIMER7RST); + rcu_periph_reset_disable(RCU_TIMER7RST); + break; +#ifndef GD32F30X_HD + case TIMER8: + /* reset TIMER8 */ + rcu_periph_reset_enable(RCU_TIMER8RST); + rcu_periph_reset_disable(RCU_TIMER8RST); + break; + case TIMER9: + /* reset TIMER9 */ + rcu_periph_reset_enable(RCU_TIMER9RST); + rcu_periph_reset_disable(RCU_TIMER9RST); + break; + case TIMER10: + /* reset TIMER10 */ + rcu_periph_reset_enable(RCU_TIMER10RST); + rcu_periph_reset_disable(RCU_TIMER10RST); + break; + case TIMER11: + /* reset TIMER11 */ + rcu_periph_reset_enable(RCU_TIMER11RST); + rcu_periph_reset_disable(RCU_TIMER11RST); + break; + case TIMER12: + /* reset TIMER12 */ + rcu_periph_reset_enable(RCU_TIMER12RST); + rcu_periph_reset_disable(RCU_TIMER12RST); + break; + case TIMER13: + /* reset TIMER13 */ + rcu_periph_reset_enable(RCU_TIMER13RST); + rcu_periph_reset_disable(RCU_TIMER13RST); + break; +#endif /* GD32F30X_HD */ + default: + break; + } +} + +/*! + \brief initialize TIMER init parameter struct with a default value + \param[in] initpara: init parameter struct + \param[out] none + \retval none +*/ +void timer_struct_para_init(timer_parameter_struct* initpara) +{ + /* initialize the init parameter struct member with the default value */ + initpara->prescaler = 0U; + initpara->alignedmode = TIMER_COUNTER_EDGE; + initpara->counterdirection = TIMER_COUNTER_UP; + initpara->period = 65535U; + initpara->clockdivision = TIMER_CKDIV_DIV1; + initpara->repetitioncounter = 0U; +} + +/*! + \brief initialize TIMER counter + \param[in] timer_periph: TIMERx(x=0..13) + \param[in] initpara: init parameter struct + prescaler: prescaler value of the counter clock, 0~65535 + alignedmode: TIMER_COUNTER_EDGE, TIMER_COUNTER_CENTER_DOWN, TIMER_COUNTER_CENTER_UP, TIMER_COUNTER_CENTER_BOTH + counterdirection: TIMER_COUNTER_UP, TIMER_COUNTER_DOWN + period: counter auto reload value, 0~65535 + clockdivision: TIMER_CKDIV_DIV1, TIMER_CKDIV_DIV2, TIMER_CKDIV_DIV4 + repetitioncounter: counter repetition value, 0~255 + \param[out] none + \retval none +*/ +void timer_init(uint32_t timer_periph, timer_parameter_struct* initpara) +{ + /* configure the counter prescaler value */ + TIMER_PSC(timer_periph) = (uint16_t)initpara->prescaler; + + /* configure the counter direction and aligned mode */ + if((TIMER0 == timer_periph) || (TIMER1 == timer_periph) || (TIMER2 == timer_periph) + || (TIMER3 == timer_periph) || (TIMER4 == timer_periph) || (TIMER7 == timer_periph)){ + TIMER_CTL0(timer_periph) &= ~(uint32_t)(TIMER_CTL0_DIR|TIMER_CTL0_CAM); + TIMER_CTL0(timer_periph) |= (uint32_t)initpara->alignedmode; + TIMER_CTL0(timer_periph) |= (uint32_t)initpara->counterdirection; + } + + /* configure the autoreload value */ + TIMER_CAR(timer_periph) = (uint32_t)initpara->period; + + if((TIMER5 != timer_periph) && (TIMER6 != timer_periph)){ + /* reset the CKDIV bit */ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_CKDIV; + TIMER_CTL0(timer_periph) |= (uint32_t)initpara->clockdivision; + } + + if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)){ + /* configure the repetition counter value */ + TIMER_CREP(timer_periph) = (uint32_t)initpara->repetitioncounter; + } + + /* generate an update event */ + TIMER_SWEVG(timer_periph) |= (uint32_t)TIMER_SWEVG_UPG; +} + +/*! + \brief enable a TIMER + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_enable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_CEN; +} + +/*! + \brief disable a TIMER + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_disable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_CEN; +} + +/*! + \brief enable the auto reload shadow function + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_auto_reload_shadow_enable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_ARSE; +} + +/*! + \brief disable the auto reload shadow function + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_auto_reload_shadow_disable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_ARSE; +} + +/*! + \brief enable the update event + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_update_event_enable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_UPDIS; +} + +/*! + \brief disable the update event + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval none +*/ +void timer_update_event_disable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t) TIMER_CTL0_UPDIS; +} + +/*! + \brief set TIMER counter alignment mode + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] aligned: + only one parameter can be selected which is shown as below: + \arg TIMER_COUNTER_EDGE: edge-aligned mode + \arg TIMER_COUNTER_CENTER_DOWN: center-aligned and counting down assert mode + \arg TIMER_COUNTER_CENTER_UP: center-aligned and counting up assert mode + \arg TIMER_COUNTER_CENTER_BOTH: center-aligned and counting up/down assert mode + \param[out] none + \retval none +*/ +void timer_counter_alignment(uint32_t timer_periph, uint16_t aligned) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_CAM; + TIMER_CTL0(timer_periph) |= (uint32_t)aligned; +} + +/*! + \brief set TIMER counter up direction + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_counter_up_direction(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_DIR; +} + +/*! + \brief set TIMER counter down direction + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_counter_down_direction(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_DIR; +} + +/*! + \brief configure TIMER prescaler + \param[in] timer_periph: TIMERx(x=0..13) + \param[in] prescaler: prescaler value,0~65535 + \param[in] pscreload: prescaler reload mode + only one parameter can be selected which is shown as below: + \arg TIMER_PSC_RELOAD_NOW: the prescaler is loaded right now + \arg TIMER_PSC_RELOAD_UPDATE: the prescaler is loaded at the next update event + \param[out] none + \retval none +*/ +void timer_prescaler_config(uint32_t timer_periph, uint16_t prescaler, uint8_t pscreload) +{ + TIMER_PSC(timer_periph) = (uint32_t)prescaler; + + if(TIMER_PSC_RELOAD_NOW == pscreload){ + TIMER_SWEVG(timer_periph) |= (uint32_t)TIMER_SWEVG_UPG; + } +} + +/*! + \brief configure TIMER repetition register value + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] repetition: the counter repetition value,0~255 + \param[out] none + \retval none +*/ +void timer_repetition_value_config(uint32_t timer_periph, uint16_t repetition) +{ + TIMER_CREP(timer_periph) = (uint32_t)repetition; +} + +/*! + \brief configure TIMER autoreload register value + \param[in] timer_periph: TIMERx(x=0..13) + \param[in] autoreload: the counter auto-reload value,0~65535 + \param[out] none + \retval none +*/ +void timer_autoreload_value_config(uint32_t timer_periph, uint16_t autoreload) +{ + TIMER_CAR(timer_periph) = (uint32_t)autoreload; +} + +/*! + \brief configure TIMER counter register value + \param[in] timer_periph: TIMERx(x=0..13) + \param[in] counter: the counter value,0~65535 + \param[out] none + \retval none +*/ +void timer_counter_value_config(uint32_t timer_periph, uint16_t counter) +{ + TIMER_CNT(timer_periph) = (uint32_t)counter; +} + +/*! + \brief read TIMER counter value + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval counter value +*/ +uint32_t timer_counter_read(uint32_t timer_periph) +{ + uint32_t count_value = 0U; + count_value = TIMER_CNT(timer_periph); + return (count_value); +} + +/*! + \brief read TIMER prescaler value + \param[in] timer_periph: TIMERx(x=0..13) + \param[out] none + \retval prescaler register value +*/ +uint16_t timer_prescaler_read(uint32_t timer_periph) +{ + uint16_t prescaler_value = 0U; + prescaler_value = (uint16_t)(TIMER_PSC(timer_periph)); + return (prescaler_value); +} + +/*! + \brief configure TIMER single pulse mode + \param[in] timer_periph: TIMERx(x=0..8,11) + \param[in] spmode: + only one parameter can be selected which is shown as below: + \arg TIMER_SP_MODE_SINGLE: single pulse mode + \arg TIMER_SP_MODE_REPETITIVE: repetitive pulse mode + \param[out] none + \retval none +*/ +void timer_single_pulse_mode_config(uint32_t timer_periph, uint32_t spmode) +{ + if(TIMER_SP_MODE_SINGLE == spmode){ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_SPM; + }else if(TIMER_SP_MODE_REPETITIVE == spmode){ + TIMER_CTL0(timer_periph) &= ~((uint32_t)TIMER_CTL0_SPM); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief configure TIMER update source + \param[in] timer_periph: TIMERx(x=0..13) + \param[in] update: + only one parameter can be selected which is shown as below: + \arg TIMER_UPDATE_SRC_GLOBAL: update generate by setting of UPG bit or the counter overflow/underflow,or the slave mode controller trigger + \arg TIMER_UPDATE_SRC_REGULAR: update generate only by counter overflow/underflow + \param[out] none + \retval none +*/ +void timer_update_source_config(uint32_t timer_periph, uint32_t update) +{ + if(TIMER_UPDATE_SRC_REGULAR == update){ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_UPS; + }else if(TIMER_UPDATE_SRC_GLOBAL == update){ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_UPS; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief enable the TIMER interrupt + \param[in] timer_periph: please refer to the following parameters + \param[in] interrupt: timer interrupt enable source + only one parameter can be selected which is shown as below: + \arg TIMER_INT_UP: update interrupt enable, TIMERx(x=0..13) + \arg TIMER_INT_CH0: channel 0 interrupt enable, TIMERx(x=0..4,7..13) + \arg TIMER_INT_CH1: channel 1 interrupt enable, TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_CH2: channel 2 interrupt enable, TIMERx(x=0..4,7) + \arg TIMER_INT_CH3: channel 3 interrupt enable , TIMERx(x=0..4,7) + \arg TIMER_INT_CMT: commutation interrupt enable, TIMERx(x=0,7) + \arg TIMER_INT_TRG: trigger interrupt enable, TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_BRK: break interrupt enable, TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_interrupt_enable(uint32_t timer_periph, uint32_t interrupt) +{ + TIMER_DMAINTEN(timer_periph) |= (uint32_t) interrupt; +} + +/*! + \brief disable the TIMER interrupt + \param[in] timer_periph: please refer to the following parameters + \param[in] interrupt: timer interrupt source disable + only one parameter can be selected which is shown as below: + \arg TIMER_INT_UP: update interrupt disable, TIMERx(x=0..13) + \arg TIMER_INT_CH0: channel 0 interrupt disable, TIMERx(x=0..4,7..13) + \arg TIMER_INT_CH1: channel 1 interrupt disable, TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_CH2: channel 2 interrupt disable, TIMERx(x=0..4,7) + \arg TIMER_INT_CH3: channel 3 interrupt disable , TIMERx(x=0..4,7) + \arg TIMER_INT_CMT: commutation interrupt disable, TIMERx(x=0,7) + \arg TIMER_INT_TRG: trigger interrupt disable, TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_BRK: break interrupt disable, TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_interrupt_disable(uint32_t timer_periph, uint32_t interrupt) +{ + TIMER_DMAINTEN(timer_periph) &= (~(uint32_t)interrupt); +} + +/*! + \brief get timer interrupt flag + \param[in] timer_periph: please refer to the following parameters + \param[in] interrupt: the timer interrupt bits + only one parameter can be selected which is shown as below: + \arg TIMER_INT_FLAG_UP: update interrupt flag,TIMERx(x=0..13) + \arg TIMER_INT_FLAG_CH0: channel 0 interrupt flag,TIMERx(x=0..4,7..13) + \arg TIMER_INT_FLAG_CH1: channel 1 interrupt flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_FLAG_CH2: channel 2 interrupt flag,TIMERx(x=0..4,7) + \arg TIMER_INT_FLAG_CH3: channel 3 interrupt flag,TIMERx(x=0..4,7) + \arg TIMER_INT_FLAG_CMT: channel commutation interrupt flag,TIMERx(x=0,7) + \arg TIMER_INT_FLAG_TRG: trigger interrupt flag,TIMERx(x=0,7,8,11) + \arg TIMER_INT_FLAG_BRK: break interrupt flag,TIMERx(x=0,7) + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus timer_interrupt_flag_get(uint32_t timer_periph, uint32_t interrupt) +{ + uint32_t val; + val = (TIMER_DMAINTEN(timer_periph) & interrupt); + if((RESET != (TIMER_INTF(timer_periph) & interrupt) ) && (RESET != val)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear TIMER interrupt flag + \param[in] timer_periph: please refer to the following parameters + \param[in] interrupt: the timer interrupt bits + only one parameter can be selected which is shown as below: + \arg TIMER_INT_FLAG_UP: update interrupt flag,TIMERx(x=0..13) + \arg TIMER_INT_FLAG_CH0: channel 0 interrupt flag,TIMERx(x=0..4,7..13) + \arg TIMER_INT_FLAG_CH1: channel 1 interrupt flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_INT_FLAG_CH2: channel 2 interrupt flag,TIMERx(x=0..4,7) + \arg TIMER_INT_FLAG_CH3: channel 3 interrupt flag,TIMERx(x=0..4,7) + \arg TIMER_INT_FLAG_CMT: channel commutation interrupt flag,TIMERx(x=0,7) + \arg TIMER_INT_FLAG_TRG: trigger interrupt flag,TIMERx(x=0,7,8,11) + \arg TIMER_INT_FLAG_BRK: break interrupt flag,TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt) +{ + TIMER_INTF(timer_periph) = (~(uint32_t)interrupt); +} + +/*! + \brief get TIMER flags + \param[in] timer_periph: please refer to the following parameters + \param[in] flag: the timer interrupt flags + only one parameter can be selected which is shown as below: + \arg TIMER_FLAG_UP: update flag,TIMERx(x=0..13) + \arg TIMER_FLAG_CH0: channel 0 flag,TIMERx(x=0..4,7..13) + \arg TIMER_FLAG_CH1: channel 1 flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_FLAG_CH2: channel 2 flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CH3: channel 3 flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CMT: channel control update flag,TIMERx(x=0,7) + \arg TIMER_FLAG_TRG: trigger flag,TIMERx(x=0,7,8,11) + \arg TIMER_FLAG_BRK: break flag,TIMERx(x=0,7) + \arg TIMER_FLAG_CH0O: channel 0 overcapture flag,TIMERx(x=0..4,7..11) + \arg TIMER_FLAG_CH1O: channel 1 overcapture flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_FLAG_CH2O: channel 2 overcapture flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CH3O: channel 3 overcapture flag,TIMERx(x=0..4,7) + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus timer_flag_get(uint32_t timer_periph, uint32_t flag) +{ + if(RESET != (TIMER_INTF(timer_periph) & flag)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear TIMER flags + \param[in] timer_periph: please refer to the following parameters + \param[in] flag: the timer interrupt flags + only one parameter can be selected which is shown as below: + \arg TIMER_FLAG_UP: update flag,TIMERx(x=0..13) + \arg TIMER_FLAG_CH0: channel 0 flag,TIMERx(x=0..4,7..13) + \arg TIMER_FLAG_CH1: channel 1 flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_FLAG_CH2: channel 2 flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CH3: channel 3 flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CMT: channel control update flag,TIMERx(x=0,7) + \arg TIMER_FLAG_TRG: trigger flag,TIMERx(x=0,7,8,11) + \arg TIMER_FLAG_BRK: break flag,TIMERx(x=0,7) + \arg TIMER_FLAG_CH0O: channel 0 overcapture flag,TIMERx(x=0..4,7..11) + \arg TIMER_FLAG_CH1O: channel 1 overcapture flag,TIMERx(x=0..4,7,8,11) + \arg TIMER_FLAG_CH2O: channel 2 overcapture flag,TIMERx(x=0..4,7) + \arg TIMER_FLAG_CH3O: channel 3 overcapture flag,TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_flag_clear(uint32_t timer_periph, uint32_t flag) +{ + TIMER_INTF(timer_periph) = (~(uint32_t)flag); +} + +/*! + \brief enable the TIMER DMA + \param[in] timer_periph: please refer to the following parameters + \param[in] dma: specify which DMA to enable + only one parameter can be selected which is shown as below: + \arg TIMER_DMA_UPD: update DMA enable,TIMERx(x=0..7) + \arg TIMER_DMA_CH0D: channel 0 DMA enable,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH1D: channel 1 DMA enable,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH2D: channel 2 DMA enable,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH3D: channel 3 DMA enable,TIMERx(x=0..4,7) + \arg TIMER_DMA_CMTD: commutation DMA request enable,TIMERx(x=0,7) + \arg TIMER_DMA_TRGD: trigger DMA enable,TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_dma_enable(uint32_t timer_periph, uint16_t dma) +{ + TIMER_DMAINTEN(timer_periph) |= (uint32_t) dma; +} + +/*! + \brief disable the TIMER DMA + \param[in] timer_periph: please refer to the following parameters + \param[in] dma: specify which DMA to enable + one or more parameters can be selected which are shown as below: + \arg TIMER_DMA_UPD: update DMA ,TIMERx(x=0..7) + \arg TIMER_DMA_CH0D: channel 0 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH1D: channel 1 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH2D: channel 2 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CH3D: channel 3 DMA request,TIMERx(x=0..4,7) + \arg TIMER_DMA_CMTD: commutation DMA request ,TIMERx(x=0,7) + \arg TIMER_DMA_TRGD: trigger DMA request,TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_dma_disable(uint32_t timer_periph, uint16_t dma) +{ + TIMER_DMAINTEN(timer_periph) &= (~(uint32_t)(dma)); +} + +/*! + \brief channel DMA request source selection + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] dma_request: channel DMA request source selection + only one parameter can be selected which is shown as below: + \arg TIMER_DMAREQUEST_CHANNELEVENT: DMA request of channel y is sent when channel y event occurs + \arg TIMER_DMAREQUEST_UPDATEEVENT: DMA request of channel y is sent when update event occurs + \param[out] none + \retval none +*/ +void timer_channel_dma_request_source_select(uint32_t timer_periph, uint8_t dma_request) +{ + if(TIMER_DMAREQUEST_UPDATEEVENT == dma_request){ + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_DMAS; + }else if(TIMER_DMAREQUEST_CHANNELEVENT == dma_request){ + TIMER_CTL1(timer_periph) &= ~(uint32_t)TIMER_CTL1_DMAS; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief configure the TIMER DMA transfer + \param[in] timer_periph: please refer to the following parameters + \param[in] dma_baseaddr: + only one parameter can be selected which is shown as below: + \arg TIMER_DMACFG_DMATA_CTL0: DMA transfer address is TIMER_CTL0,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CTL1: DMA transfer address is TIMER_CTL1,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_SMCFG: DMA transfer address is TIMER_SMCFG,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_DMAINTEN: DMA transfer address is TIMER_DMAINTEN,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_INTF: DMA transfer address is TIMER_INTF,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_SWEVG: DMA transfer address is TIMER_SWEVG,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CHCTL0: DMA transfer address is TIMER_CHCTL0,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CHCTL1: DMA transfer address is TIMER_CHCTL1,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CHCTL2: DMA transfer address is TIMER_CHCTL2,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CNT: DMA transfer address is TIMER_CNT,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_PSC: DMA transfer address is TIMER_PSC,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CAR: DMA transfer address is TIMER_CAR,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CREP: DMA transfer address is TIMER_CREP,TIMERx(x=0,7) + \arg TIMER_DMACFG_DMATA_CH0CV: DMA transfer address is TIMER_CH0CV,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CH1CV: DMA transfer address is TIMER_CH1CV,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CH2CV: DMA transfer address is TIMER_CH2CV,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CH3CV: DMA transfer address is TIMER_CH3CV,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_CCHP: DMA transfer address is TIMER_CCHP,TIMERx(x=0,7) + \arg TIMER_DMACFG_DMATA_DMACFG: DMA transfer address is TIMER_DMACFG,TIMERx(x=0..4,7) + \arg TIMER_DMACFG_DMATA_DMATB: DMA transfer address is TIMER_DMATB,TIMERx(x=0..4,7) + \param[in] dma_lenth: + only one parameter can be selected which is shown as below: + \arg TIMER_DMACFG_DMATC_xTRANSFER(x=1..18): DMA transfer x time + \param[out] none + \retval none +*/ +void timer_dma_transfer_config(uint32_t timer_periph, uint32_t dma_baseaddr, uint32_t dma_lenth) +{ + TIMER_DMACFG(timer_periph) &= (~(uint32_t)(TIMER_DMACFG_DMATA | TIMER_DMACFG_DMATC)); + TIMER_DMACFG(timer_periph) |= (uint32_t)(dma_baseaddr | dma_lenth); +} + +/*! + \brief software generate events + \param[in] timer_periph: please refer to the following parameters + \param[in] event: the timer software event generation sources + one or more parameters can be selected which are shown as below: + \arg TIMER_EVENT_SRC_UPG: update event,TIMERx(x=0..13) + \arg TIMER_EVENT_SRC_CH0G: channel 0 capture or compare event generation,TIMERx(x=0..4,7..13) + \arg TIMER_EVENT_SRC_CH1G: channel 1 capture or compare event generation,TIMERx(x=0..4,7,8,11) + \arg TIMER_EVENT_SRC_CH2G: channel 2 capture or compare event generation,TIMERx(x=0..4,7) + \arg TIMER_EVENT_SRC_CH3G: channel 3 capture or compare event generation,TIMERx(x=0..4,7) + \arg TIMER_EVENT_SRC_CMTG: channel commutation event generation,TIMERx(x=0,7) + \arg TIMER_EVENT_SRC_TRGG: trigger event generation,TIMERx(x=0..4,7,8,11) + \arg TIMER_EVENT_SRC_BRKG: break event generation,TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_event_software_generate(uint32_t timer_periph, uint16_t event) +{ + TIMER_SWEVG(timer_periph) |= (uint32_t)event; +} + +/*! + \brief initialize TIMER break parameter struct with a default value + \param[in] breakpara: TIMER break parameter struct + \param[out] none + \retval none +*/ +void timer_break_struct_para_init(timer_break_parameter_struct* breakpara) +{ + /* initialize the break parameter struct member with the default value */ + breakpara->runoffstate = TIMER_ROS_STATE_DISABLE; + breakpara->ideloffstate = TIMER_IOS_STATE_DISABLE; + breakpara->deadtime = 0U; + breakpara->breakpolarity = TIMER_BREAK_POLARITY_LOW; + breakpara->outputautostate = TIMER_OUTAUTO_DISABLE; + breakpara->protectmode = TIMER_CCHP_PROT_OFF; + breakpara->breakstate = TIMER_BREAK_DISABLE; +} + +/*! + \brief configure TIMER break function + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] breakpara: TIMER break parameter struct + runoffstate: TIMER_ROS_STATE_ENABLE,TIMER_ROS_STATE_DISABLE + ideloffstate: TIMER_IOS_STATE_ENABLE,TIMER_IOS_STATE_DISABLE + deadtime: 0~255 + breakpolarity: TIMER_BREAK_POLARITY_LOW,TIMER_BREAK_POLARITY_HIGH + outputautostate: TIMER_OUTAUTO_ENABLE,TIMER_OUTAUTO_DISABLE + protectmode: TIMER_CCHP_PROT_OFF,TIMER_CCHP_PROT_0,TIMER_CCHP_PROT_1,TIMER_CCHP_PROT_2 + breakstate: TIMER_BREAK_ENABLE,TIMER_BREAK_DISABLE + \param[out] none + \retval none +*/ +void timer_break_config(uint32_t timer_periph, timer_break_parameter_struct* breakpara) +{ + TIMER_CCHP(timer_periph) = (uint32_t)(((uint32_t)(breakpara->runoffstate))| + ((uint32_t)(breakpara->ideloffstate))| + ((uint32_t)(breakpara->deadtime))| + ((uint32_t)(breakpara->breakpolarity))| + ((uint32_t)(breakpara->outputautostate)) | + ((uint32_t)(breakpara->protectmode))| + ((uint32_t)(breakpara->breakstate))) ; +} + +/*! + \brief enable TIMER break function + \param[in] timer_periph: TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_break_enable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_BRKEN; +} + +/*! + \brief disable TIMER break function + \param[in] timer_periph: TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_break_disable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) &= ~(uint32_t)TIMER_CCHP_BRKEN; +} + +/*! + \brief enable TIMER output automatic function + \param[in] timer_periph: TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_automatic_output_enable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_OAEN; +} + +/*! + \brief disable TIMER output automatic function + \param[in] timer_periph: TIMERx(x=0,7) + \param[out] none + \retval none +*/ +void timer_automatic_output_disable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) &= ~(uint32_t)TIMER_CCHP_OAEN; +} + +/*! + \brief configure TIMER primary output function + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void timer_primary_output_config(uint32_t timer_periph, ControlStatus newvalue) +{ + if(ENABLE == newvalue){ + TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_POEN; + }else{ + TIMER_CCHP(timer_periph) &= (~(uint32_t)TIMER_CCHP_POEN); + } +} + +/*! + \brief enable or disable channel capture/compare control shadow register + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void timer_channel_control_shadow_config(uint32_t timer_periph, ControlStatus newvalue) +{ + if(ENABLE == newvalue){ + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_CCSE; + }else{ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_CCSE); + } +} + +/*! + \brief configure TIMER channel control shadow register update control + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] ccuctl: channel control shadow register update control + only one parameter can be selected which is shown as below: + \arg TIMER_UPDATECTL_CCU: the shadow registers update by when CMTG bit is set + \arg TIMER_UPDATECTL_CCUTRI: the shadow registers update by when CMTG bit is set or an rising edge of TRGI occurs + \param[out] none + \retval none +*/ +void timer_channel_control_shadow_update_config(uint32_t timer_periph, uint8_t ccuctl) +{ + if(TIMER_UPDATECTL_CCU == ccuctl){ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_CCUC); + }else if(TIMER_UPDATECTL_CCUTRI == ccuctl){ + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_CCUC; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief initialize TIMER channel output parameter struct with a default value + \param[in] ocpara: TIMER channel n output parameter struct + \param[out] none + \retval none +*/ +void timer_channel_output_struct_para_init(timer_oc_parameter_struct* ocpara) +{ + /* initialize the channel output parameter struct member with the default value */ + ocpara->outputstate = (uint16_t)TIMER_CCX_DISABLE; + ocpara->outputnstate = TIMER_CCXN_DISABLE; + ocpara->ocpolarity = TIMER_OC_POLARITY_HIGH; + ocpara->ocnpolarity = TIMER_OCN_POLARITY_HIGH; + ocpara->ocidlestate = TIMER_OC_IDLE_STATE_LOW; + ocpara->ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; +} + +/*! + \brief configure TIMER channel output function + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4,7)) + \param[in] ocpara: TIMER channeln output parameter struct + outputstate: TIMER_CCX_ENABLE,TIMER_CCX_DISABLE + outputnstate: TIMER_CCXN_ENABLE,TIMER_CCXN_DISABLE + ocpolarity: TIMER_OC_POLARITY_HIGH,TIMER_OC_POLARITY_LOW + ocnpolarity: TIMER_OCN_POLARITY_HIGH,TIMER_OCN_POLARITY_LOW + ocidlestate: TIMER_OC_IDLE_STATE_LOW,TIMER_OC_IDLE_STATE_HIGH + ocnidlestate: TIMER_OCN_IDLE_STATE_LOW,TIMER_OCN_IDLE_STATE_HIGH + \param[out] none + \retval none +*/ +void timer_channel_output_config(uint32_t timer_periph, uint16_t channel, timer_oc_parameter_struct* ocpara) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + TIMER_CHCTL0(timer_periph) &= ~(uint32_t)TIMER_CHCTL0_CH0MS; + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->outputstate; + /* reset the CH0P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0P); + /* set the CH0P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->ocpolarity; + + if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)){ + /* reset the CH0NEN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NEN); + /* set the CH0NEN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->outputnstate; + /* reset the CH0NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NP); + /* set the CH0NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->ocnpolarity; + /* reset the ISO0 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO0); + /* set the ISO0 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)ocpara->ocidlestate; + /* reset the ISO0N bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO0N); + /* set the ISO0N bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)ocpara->ocnidlestate; + } + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + TIMER_CHCTL0(timer_periph) &= ~(uint32_t)TIMER_CHCTL0_CH1MS; + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpara->outputstate << 4U); + /* reset the CH1P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1P); + /* set the CH1P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 4U); + + if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)){ + /* reset the CH1NEN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NEN); + /* set the CH1NEN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputnstate) << 4U); + /* reset the CH1NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NP); + /* set the CH1NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnpolarity) << 4U); + /* reset the ISO1 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO1); + /* set the ISO1 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 2U); + /* reset the ISO1N bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO1N); + /* set the ISO1N bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnidlestate) << 2U); + } + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + /* reset the CH2EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); + TIMER_CHCTL1(timer_periph) &= ~(uint32_t)TIMER_CHCTL1_CH2MS; + /* set the CH2EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpara->outputstate << 8U); + /* reset the CH2P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2P); + /* set the CH2P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 8U); + + if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)){ + /* reset the CH2NEN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NEN); + /* set the CH2NEN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputnstate) << 8U); + /* reset the CH2NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NP); + /* set the CH2NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnpolarity) << 8U); + /* reset the ISO2 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO2); + /* set the ISO2 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 4U); + /* reset the ISO2N bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO2N); + /* set the ISO2N bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnidlestate) << 4U); + } + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + /* reset the CH3EN bit */ + TIMER_CHCTL2(timer_periph) &=(~(uint32_t)TIMER_CHCTL2_CH3EN); + TIMER_CHCTL1(timer_periph) &= ~(uint32_t)TIMER_CHCTL1_CH3MS; + /* set the CH3EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpara->outputstate << 12U); + /* reset the CH3P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3P); + /* set the CH3P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 12U); + + if((TIMER0 == timer_periph) || (TIMER7 == timer_periph)){ + /* reset the ISO3 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO3); + /* set the ISO3 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 6U); + } + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output compare mode + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] ocmode: channel output compare mode + only one parameter can be selected which is shown as below: + \arg TIMER_OC_MODE_TIMING: timing mode + \arg TIMER_OC_MODE_ACTIVE: active mode + \arg TIMER_OC_MODE_INACTIVE: inactive mode + \arg TIMER_OC_MODE_TOGGLE: toggle mode + \arg TIMER_OC_MODE_LOW: force low mode + \arg TIMER_OC_MODE_HIGH: force high mode + \arg TIMER_OC_MODE_PWM0: PWM0 mode + \arg TIMER_OC_MODE_PWM1: PWM1 mode + \param[out] none + \retval none +*/ +void timer_channel_output_mode_config(uint32_t timer_periph, uint16_t channel, uint16_t ocmode) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMCTL); + TIMER_CHCTL0(timer_periph) |= (uint32_t)ocmode; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMCTL); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(ocmode) << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMCTL); + TIMER_CHCTL1(timer_periph) |= (uint32_t)ocmode; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMCTL); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(ocmode) << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output pulse value + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] pulse: channel output pulse value,0~65535 + \param[out] none + \retval none +*/ +void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, uint32_t pulse) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CH0CV(timer_periph) = (uint32_t)pulse; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CH1CV(timer_periph) = (uint32_t)pulse; + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CH2CV(timer_periph) = (uint32_t)pulse; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CH3CV(timer_periph) = (uint32_t)pulse; + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output shadow function + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] ocshadow: channel output shadow state + only one parameter can be selected which is shown as below: + \arg TIMER_OC_SHADOW_ENABLE: channel output shadow state enable + \arg TIMER_OC_SHADOW_DISABLE: channel output shadow state disable + \param[out] none + \retval none +*/ +void timer_channel_output_shadow_config(uint32_t timer_periph, uint16_t channel, uint16_t ocshadow) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMSEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)ocshadow; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMSEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(ocshadow) << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMSEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)ocshadow; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMSEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(ocshadow) << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output fast function + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] ocfast: channel output fast function + only one parameter can be selected which is shown as below: + \arg TIMER_OC_FAST_ENABLE: channel output fast function enable + \arg TIMER_OC_FAST_DISABLE: channel output fast function disable + \param[out] none + \retval none +*/ +void timer_channel_output_fast_config(uint32_t timer_periph, uint16_t channel, uint16_t ocfast) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMFEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)ocfast; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMFEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)ocfast << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMFEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)ocfast; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMFEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)ocfast << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output clear function + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0 + \arg TIMER_CH_1: TIMER channel1 + \arg TIMER_CH_2: TIMER channel2 + \arg TIMER_CH_3: TIMER channel3 + \param[in] occlear: channel output clear function + only one parameter can be selected which is shown as below: + \arg TIMER_OC_CLEAR_ENABLE: channel output clear function enable + \arg TIMER_OC_CLEAR_DISABLE: channel output clear function disable + \param[out] none + \retval none +*/ +void timer_channel_output_clear_config(uint32_t timer_periph, uint16_t channel, uint16_t occlear) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMCEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)occlear; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMCEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)occlear << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMCEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)occlear; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMCEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)occlear << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output polarity + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] ocpolarity: channel output polarity + only one parameter can be selected which is shown as below: + \arg TIMER_OC_POLARITY_HIGH: channel output polarity is high + \arg TIMER_OC_POLARITY_LOW: channel output polarity is low + \param[out] none + \retval none +*/ +void timer_channel_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocpolarity) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpolarity; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 8U); + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 12U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel complementary output polarity + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0,7)) + \param[in] ocnpolarity: channel complementary output polarity + only one parameter can be selected which is shown as below: + \arg TIMER_OCN_POLARITY_HIGH: channel complementary output polarity is high + \arg TIMER_OCN_POLARITY_LOW: channel complementary output polarity is low + \param[out] none + \retval none +*/ +void timer_channel_complementary_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnpolarity) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NP); + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocnpolarity; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NP); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnpolarity << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NP); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnpolarity << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel enable state + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] state: TIMER channel enable state + only one parameter can be selected which is shown as below: + \arg TIMER_CCX_ENABLE: channel enable + \arg TIMER_CCX_DISABLE: channel disable + \param[out] none + \retval none +*/ +void timer_channel_output_state_config(uint32_t timer_periph, uint16_t channel, uint32_t state) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)state; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 8U); + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 12U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel complementary output enable state + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0,7)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0,7)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0,7)) + \param[in] ocnstate: TIMER channel complementary output enable state + only one parameter can be selected which is shown as below: + \arg TIMER_CCXN_ENABLE: channel complementary enable + \arg TIMER_CCXN_DISABLE: channel complementary disable + \param[out] none + \retval none +*/ +void timer_channel_complementary_output_state_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnstate) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NEN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocnstate; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NEN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnstate << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NEN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnstate << 8U); + break; + default: + break; + } +} + +/*! + \brief initialize TIMER channel input parameter struct with a default value + \param[in] icpara: TIMER channel intput parameter struct + \param[out] none + \retval none +*/ +void timer_channel_input_struct_para_init(timer_ic_parameter_struct* icpara) +{ + /* initialize the channel input parameter struct member with the default value */ + icpara->icpolarity = TIMER_IC_POLARITY_RISING; + icpara->icselection = TIMER_IC_SELECTION_DIRECTTI; + icpara->icprescaler = TIMER_IC_PSC_DIV1; + icpara->icfilter = 0U; +} + +/*! + \brief configure TIMER input capture parameter + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] icpara: TIMER channel intput parameter struct + icpolarity: TIMER_IC_POLARITY_RISING,TIMER_IC_POLARITY_FALLING + icselection: TIMER_IC_SELECTION_DIRECTTI,TIMER_IC_SELECTION_INDIRECTTI,TIMER_IC_SELECTION_ITS + icprescaler: TIMER_IC_PSC_DIV1,TIMER_IC_PSC_DIV2,TIMER_IC_PSC_DIV4,TIMER_IC_PSC_DIV8 + icfilter: 0~15 + \param[out] none + \retval none +*/ +void timer_input_capture_config(uint32_t timer_periph,uint16_t channel, timer_ic_parameter_struct* icpara) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)(icpara->icpolarity); + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + TIMER_CHCTL0(timer_periph) |= (uint32_t)(icpara->icselection); + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 4U); + + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + break; + + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + + /* reset the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection) << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 12U); + + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + /* reset the CH2EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); + + /* reset the CH2P and CH2NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH2P|TIMER_CHCTL2_CH2NP)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 8U); + + /* reset the CH2MS bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2MS); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection)); + + /* reset the CH2CAPFLT bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2CAPFLT); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 4U); + + /* set the CH2EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH2EN; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + /* reset the CH3EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3EN); + + /* reset the CH3P bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH3P)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 12U); + + /* reset the CH3MS bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3MS); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection) << 8U); + + /* reset the CH3CAPFLT bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3CAPFLT); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 12U); + + /* set the CH3EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH3EN; + break; + default: + break; + } + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, channel, (uint16_t)(icpara->icprescaler)); +} + +/*! + \brief configure TIMER channel input capture prescaler value + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[in] prescaler: channel input capture prescaler value + only one parameter can be selected which is shown as below: + \arg TIMER_IC_PSC_DIV1: no prescaler + \arg TIMER_IC_PSC_DIV2: divided by 2 + \arg TIMER_IC_PSC_DIV4: divided by 4 + \arg TIMER_IC_PSC_DIV8: divided by 8 + \param[out] none + \retval none +*/ +void timer_channel_input_capture_prescaler_config(uint32_t timer_periph, uint16_t channel, uint16_t prescaler) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPPSC); + TIMER_CHCTL0(timer_periph) |= (uint32_t)prescaler; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPPSC); + TIMER_CHCTL0(timer_periph) |= ((uint32_t)prescaler << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2CAPPSC); + TIMER_CHCTL1(timer_periph) |= (uint32_t)prescaler; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3CAPPSC); + TIMER_CHCTL1(timer_periph) |= ((uint32_t)prescaler << 8U); + break; + default: + break; + } +} + +/*! + \brief read TIMER channel capture compare register value + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0(TIMERx(x=0..4,7..13)) + \arg TIMER_CH_1: TIMER channel1(TIMERx(x=0..4,7,8,11)) + \arg TIMER_CH_2: TIMER channel2(TIMERx(x=0..4,7)) + \arg TIMER_CH_3: TIMER channel3(TIMERx(x=0..4,7)) + \param[out] none + \retval channel capture compare register value +*/ +uint32_t timer_channel_capture_value_register_read(uint32_t timer_periph, uint16_t channel) +{ + uint32_t count_value = 0U; + + switch(channel){ + /* read TIMER channel 0 capture compare register value */ + case TIMER_CH_0: + count_value = TIMER_CH0CV(timer_periph); + break; + /* read TIMER channel 1 capture compare register value */ + case TIMER_CH_1: + count_value = TIMER_CH1CV(timer_periph); + break; + /* read TIMER channel 2 capture compare register value */ + case TIMER_CH_2: + count_value = TIMER_CH2CV(timer_periph); + break; + /* read TIMER channel 3 capture compare register value */ + case TIMER_CH_3: + count_value = TIMER_CH3CV(timer_periph); + break; + default: + break; + } + return (count_value); +} + +/*! + \brief configure TIMER input pwm capture function + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel0 + \arg TIMER_CH_1: TIMER channel1 + \param[in] icpwm:TIMER channel intput pwm parameter struct + icpolarity: TIMER_IC_POLARITY_RISING,TIMER_IC_POLARITY_FALLING + icselection: TIMER_IC_SELECTION_DIRECTTI,TIMER_IC_SELECTION_INDIRECTTI + icprescaler: TIMER_IC_PSC_DIV1,TIMER_IC_PSC_DIV2,TIMER_IC_PSC_DIV4,TIMER_IC_PSC_DIV8 + icfilter: 0~15 + \param[out] none + \retval none +*/ +void timer_input_pwm_capture_config(uint32_t timer_periph, uint16_t channel, timer_ic_parameter_struct* icpwm) +{ + uint16_t icpolarity = 0x0U; + uint16_t icselection = 0x0U; + + /* Set channel input polarity */ + if(TIMER_IC_POLARITY_RISING == icpwm->icpolarity){ + icpolarity = TIMER_IC_POLARITY_FALLING; + }else{ + icpolarity = TIMER_IC_POLARITY_RISING; + } + + /* Set channel input mode selection */ + if(TIMER_IC_SELECTION_DIRECTTI == icpwm->icselection){ + icselection = TIMER_IC_SELECTION_INDIRECTTI; + }else{ + icselection = TIMER_IC_SELECTION_DIRECTTI; + } + + if(TIMER_CH_0 == channel){ + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P|TIMER_CHCTL2_CH0NP)); + /* set the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)(icpwm->icpolarity); + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + /* set the CH0MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)(icpwm->icselection); + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + /* set the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= ((uint32_t)(icpwm->icfilter) << 4U); + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph,TIMER_CH_0,(uint16_t)(icpwm->icprescaler)); + + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + /* reset the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P|TIMER_CHCTL2_CH1NP)); + /* set the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)icpolarity << 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + /* set the CH1MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)icselection << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + /* set the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icfilter) << 12U); + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph,TIMER_CH_1,(uint16_t)(icpwm->icprescaler)); + }else{ + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + /* reset the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P|TIMER_CHCTL2_CH1NP)); + /* set the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icpolarity) << 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + /* set the CH1MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icselection) << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + /* set the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icfilter) << 12U); + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_1, (uint16_t)(icpwm->icprescaler)); + + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P|TIMER_CHCTL2_CH0NP)); + /* set the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)icpolarity; + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + /* set the CH0MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)icselection; + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + /* set the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= ((uint32_t)(icpwm->icfilter) << 4U); + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_0, (uint16_t)(icpwm->icprescaler)); + } +} + +/*! + \brief configure TIMER hall sensor mode + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] hallmode: + only one parameter can be selected which is shown as below: + \arg TIMER_HALLINTERFACE_ENABLE: TIMER hall sensor mode enable + \arg TIMER_HALLINTERFACE_DISABLE: TIMER hall sensor mode disable + \param[out] none + \retval none +*/ +void timer_hall_mode_config(uint32_t timer_periph, uint32_t hallmode) +{ + if(TIMER_HALLINTERFACE_ENABLE == hallmode){ + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_TI0S; + }else if(TIMER_HALLINTERFACE_DISABLE == hallmode){ + TIMER_CTL1(timer_periph) &= ~(uint32_t)TIMER_CTL1_TI0S; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief select TIMER input trigger source + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] intrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_SMCFG_TRGSEL_ITI0: internal trigger 0 + \arg TIMER_SMCFG_TRGSEL_ITI1: internal trigger 1 + \arg TIMER_SMCFG_TRGSEL_ITI2: internal trigger 2 + \arg TIMER_SMCFG_TRGSEL_ITI3: internal trigger 3 + \arg TIMER_SMCFG_TRGSEL_CI0F_ED: TI0 edge detector + \arg TIMER_SMCFG_TRGSEL_CI0FE0: filtered TIMER input 0 + \arg TIMER_SMCFG_TRGSEL_CI1FE1: filtered TIMER input 1 + \arg TIMER_SMCFG_TRGSEL_ETIFP: external trigger(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_input_trigger_source_select(uint32_t timer_periph, uint32_t intrigger) +{ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_TRGS); + TIMER_SMCFG(timer_periph) |= (uint32_t)intrigger; +} + +/*! + \brief select TIMER master mode output trigger source + \param[in] timer_periph: TIMERx(x=0..7) + \param[in] outrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_TRI_OUT_SRC_RESET: the UPG bit as trigger output + \arg TIMER_TRI_OUT_SRC_ENABLE: the counter enable signal TIMER_CTL0_CEN as trigger output + \arg TIMER_TRI_OUT_SRC_UPDATE: update event as trigger output + \arg TIMER_TRI_OUT_SRC_CH0: a capture or a compare match occurred in channal0 as trigger output TRGO + \arg TIMER_TRI_OUT_SRC_O0CPRE: O0CPRE as trigger output + \arg TIMER_TRI_OUT_SRC_O1CPRE: O1CPRE as trigger output + \arg TIMER_TRI_OUT_SRC_O2CPRE: O2CPRE as trigger output + \arg TIMER_TRI_OUT_SRC_O3CPRE: O3CPRE as trigger output + \param[out] none + \retval none +*/ +void timer_master_output_trigger_source_select(uint32_t timer_periph, uint32_t outrigger) +{ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_MMC); + TIMER_CTL1(timer_periph) |= (uint32_t)outrigger; +} + +/*! + \brief select TIMER slave mode + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] slavemode: + only one parameter can be selected which is shown as below: + \arg TIMER_SLAVE_MODE_DISABLE: slave mode disable + \arg TIMER_ENCODER_MODE0: encoder mode 0 + \arg TIMER_ENCODER_MODE1: encoder mode 1 + \arg TIMER_ENCODER_MODE2: encoder mode 2 + \arg TIMER_SLAVE_MODE_RESTART: restart mode + \arg TIMER_SLAVE_MODE_PAUSE: pause mode + \arg TIMER_SLAVE_MODE_EVENT: event mode + \arg TIMER_SLAVE_MODE_EXTERNAL0: external clock mode 0. + \param[out] none + \retval none +*/ + +void timer_slave_mode_select(uint32_t timer_periph, uint32_t slavemode) +{ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); + + TIMER_SMCFG(timer_periph) |= (uint32_t)slavemode; +} + +/*! + \brief configure TIMER master slave mode + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] masterslave: + only one parameter can be selected which is shown as below: + \arg TIMER_MASTER_SLAVE_MODE_ENABLE: master slave mode enable + \arg TIMER_MASTER_SLAVE_MODE_DISABLE: master slave mode disable + \param[out] none + \retval none +*/ +void timer_master_slave_mode_config(uint32_t timer_periph, uint32_t masterslave) +{ + if(TIMER_MASTER_SLAVE_MODE_ENABLE == masterslave){ + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SMCFG_MSM; + }else if(TIMER_MASTER_SLAVE_MODE_DISABLE == masterslave){ + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_MSM; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief configure TIMER external trigger input + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] extprescaler: + only one parameter can be selected which is shown as below: + \arg TIMER_EXT_TRI_PSC_OFF: no divided + \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 + \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 + \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_ETP_FALLING: active low or falling edge active + \arg TIMER_ETP_RISING: active high or rising edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_trigger_config(uint32_t timer_periph, uint32_t extprescaler, + uint32_t extpolarity, uint32_t extfilter) +{ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)(TIMER_SMCFG_ETP | TIMER_SMCFG_ETPSC | TIMER_SMCFG_ETFC)); + TIMER_SMCFG(timer_periph) |= (uint32_t)(extprescaler | extpolarity); + TIMER_SMCFG(timer_periph) |= (uint32_t)(extfilter << 8U); +} + +/*! + \brief configure TIMER quadrature decoder mode + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] decomode: + only one parameter can be selected which is shown as below: + \arg TIMER_ENCODER_MODE0: counter counts on CI0FE0 edge depending on CI1FE1 level + \arg TIMER_ENCODER_MODE1: counter counts on CI1FE1 edge depending on CI0FE0 level + \arg TIMER_ENCODER_MODE2: counter counts on both CI0FE0 and CI1FE1 edges depending on the level of the other input + \param[in] ic0polarity: + only one parameter can be selected which is shown as below: + \arg TIMER_IC_POLARITY_RISING: capture rising edge + \arg TIMER_IC_POLARITY_FALLING: capture falling edge + \param[in] ic1polarity: + only one parameter can be selected which is shown as below: + \arg TIMER_IC_POLARITY_RISING: capture rising edge + \arg TIMER_IC_POLARITY_FALLING: capture falling edge + \param[out] none + \retval none +*/ +void timer_quadrature_decoder_mode_config(uint32_t timer_periph, uint32_t decomode, + uint16_t ic0polarity, uint16_t ic1polarity) +{ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); + TIMER_SMCFG(timer_periph) |= (uint32_t)decomode; + + TIMER_CHCTL0(timer_periph) &= (uint32_t)(((~(uint32_t)TIMER_CHCTL0_CH0MS))&((~(uint32_t)TIMER_CHCTL0_CH1MS))); + TIMER_CHCTL0(timer_periph) |= (uint32_t)(TIMER_IC_SELECTION_DIRECTTI|((uint32_t)TIMER_IC_SELECTION_DIRECTTI << 8U)); + + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P|TIMER_CHCTL2_CH0NP)); + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P|TIMER_CHCTL2_CH1NP)); + TIMER_CHCTL2(timer_periph) |= ((uint32_t)ic0polarity|((uint32_t)ic1polarity << 4U)); +} + +/*! + \brief configure TIMER internal clock mode + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[out] none + \retval none +*/ +void timer_internal_clock_config(uint32_t timer_periph) +{ + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC; +} + +/*! + \brief configure TIMER the internal trigger as external clock input + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] intrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_SMCFG_TRGSEL_ITI0: internal trigger 0 + \arg TIMER_SMCFG_TRGSEL_ITI1: internal trigger 1 + \arg TIMER_SMCFG_TRGSEL_ITI2: internal trigger 2 + \arg TIMER_SMCFG_TRGSEL_ITI3: internal trigger 3 + \param[out] none + \retval none +*/ +void timer_internal_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t intrigger) +{ + timer_input_trigger_source_select(timer_periph, intrigger); + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC; + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SLAVE_MODE_EXTERNAL0; +} + +/*! + \brief configure TIMER the external trigger as external clock input + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] extrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_SMCFG_TRGSEL_CI0F_ED: TI0 edge detector + \arg TIMER_SMCFG_TRGSEL_CI0FE0: filtered TIMER input 0 + \arg TIMER_SMCFG_TRGSEL_CI1FE1: filtered TIMER input 1 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_IC_POLARITY_RISING: active high or rising edge active + \arg TIMER_IC_POLARITY_FALLING: active low or falling edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t extrigger, + uint16_t extpolarity, uint32_t extfilter) +{ + if(TIMER_SMCFG_TRGSEL_CI1FE1 == extrigger){ + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + /* reset the CH1NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P|TIMER_CHCTL2_CH1NP)); + /* set the CH1NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)extpolarity << 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + /* set the CH1MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)TIMER_IC_SELECTION_DIRECTTI << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + /* set the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)(extfilter << 12U); + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + }else{ + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P|TIMER_CHCTL2_CH0NP)); + /* set the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)extpolarity; + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + /* set the CH0MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)TIMER_IC_SELECTION_DIRECTTI; + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)(extfilter << 4U); + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + } + /* select TIMER input trigger source */ + timer_input_trigger_source_select(timer_periph,extrigger); + /* reset the SMC bit */ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); + /* set the SMC bit */ + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SLAVE_MODE_EXTERNAL0; +} + +/*! + \brief configure TIMER the external clock mode0 + \param[in] timer_periph: TIMERx(x=0..4,7,8,11) + \param[in] extprescaler: + only one parameter can be selected which is shown as below: + \arg TIMER_EXT_TRI_PSC_OFF: no divided + \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 + \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 + \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_ETP_FALLING: active low or falling edge active + \arg TIMER_ETP_RISING: active high or rising edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_clock_mode0_config(uint32_t timer_periph, uint32_t extprescaler, + uint32_t extpolarity, uint32_t extfilter) +{ + /* configure TIMER external trigger input */ + timer_external_trigger_config(timer_periph, extprescaler, extpolarity, extfilter); + + /* reset the SMC bit,TRGS bit */ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)(TIMER_SMCFG_SMC | TIMER_SMCFG_TRGS)); + /* set the SMC bit,TRGS bit */ + TIMER_SMCFG(timer_periph) |= (uint32_t)(TIMER_SLAVE_MODE_EXTERNAL0 | TIMER_SMCFG_TRGSEL_ETIFP); +} + +/*! + \brief configure TIMER the external clock mode1 + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[in] extprescaler: + only one parameter can be selected which is shown as below: + \arg TIMER_EXT_TRI_PSC_OFF: no divided + \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 + \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 + \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_ETP_FALLING: active low or falling edge active + \arg TIMER_ETP_RISING: active high or rising edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_clock_mode1_config(uint32_t timer_periph, uint32_t extprescaler, + uint32_t extpolarity, uint32_t extfilter) +{ + /* configure TIMER external trigger input */ + timer_external_trigger_config(timer_periph, extprescaler, extpolarity, extfilter); + + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SMCFG_SMC1; +} + +/*! + \brief disable TIMER the external clock mode1 + \param[in] timer_periph: TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_external_clock_mode1_disable(uint32_t timer_periph) +{ + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC1; +} + +/*! + \brief configure TIMER write CHxVAL register selection + \param[in] timer_periph: TIMERx(x=0..4,7..13) + \param[in] ccsel: + only one parameter can be selected which is shown as below: + \arg TIMER_CHVSEL_DISABLE: no effect + \arg TIMER_CHVSEL_ENABLE: when write the CHxVAL register, if the write value is same as the CHxVAL value, the write access is ignored + \param[out] none + \retval none +*/ +void timer_write_chxval_register_config(uint32_t timer_periph, uint16_t ccsel) +{ + if(TIMER_CHVSEL_ENABLE == ccsel){ + TIMER_CFG(timer_periph) |= (uint32_t)TIMER_CFG_CHVSEL; + }else if(TIMER_CHVSEL_DISABLE == ccsel){ + TIMER_CFG(timer_periph) &= ~(uint32_t)TIMER_CFG_CHVSEL; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief configure TIMER output value selection + \param[in] timer_periph: TIMERx(x=0,7) + \param[in] outsel: + only one parameter can be selected which is shown as below: + \arg TIMER_OUTSEL_DISABLE: no effect + \arg TIMER_OUTSEL_ENABLE: if POEN and IOS is 0, the output disabled + \param[out] none + \retval none +*/ +void timer_output_value_selection_config(uint32_t timer_periph, uint16_t outsel) +{ + if(TIMER_OUTSEL_ENABLE == outsel){ + TIMER_CFG(timer_periph) |= (uint32_t)TIMER_CFG_OUTSEL; + }else if(TIMER_OUTSEL_DISABLE == outsel){ + TIMER_CFG(timer_periph) &= ~(uint32_t)TIMER_CFG_OUTSEL; + }else{ + /* illegal parameters */ + } +} diff --git b/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_usart.c a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_usart.c new file mode 100644 index 0000000..719f565 --- /dev/null +++ a/Drivers/GD32F30x_standard_peripheral/Source/gd32f30x_usart.c @@ -0,0 +1,909 @@ +/*! + \file gd32f30x_usart.c + \brief USART driver + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_usart.h" + +/* USART register bit offset */ +#define GP_GUAT_OFFSET ((uint32_t)8U) /* bit offset of GUAT in USART_GP */ +#define CTL3_SCRTNUM_OFFSET ((uint32_t)1U) /* bit offset of SCRTNUM in USART_CTL3 */ +#define RT_BL_OFFSET ((uint32_t)24U) /* bit offset of BL in USART_RT */ + +/*! + \brief reset USART/UART + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_deinit(uint32_t usart_periph) +{ + switch(usart_periph){ + case USART0: + /* reset USART0 */ + rcu_periph_reset_enable(RCU_USART0RST); + rcu_periph_reset_disable(RCU_USART0RST); + break; + case USART1: + /* reset USART1 */ + rcu_periph_reset_enable(RCU_USART1RST); + rcu_periph_reset_disable(RCU_USART1RST); + break; + case USART2: + /* reset USART2 */ + rcu_periph_reset_enable(RCU_USART2RST); + rcu_periph_reset_disable(RCU_USART2RST); + break; + case UART3: + /* reset UART3 */ + rcu_periph_reset_enable(RCU_UART3RST); + rcu_periph_reset_disable(RCU_UART3RST); + break; + case UART4: + /* reset UART4 */ + rcu_periph_reset_enable(RCU_UART4RST); + rcu_periph_reset_disable(RCU_UART4RST); + break; + default: + break; + } +} + +/*! + \brief configure USART baud rate value + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] baudval: baud rate value + \param[out] none + \retval none +*/ +void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval) +{ + uint32_t uclk=0U, intdiv=0U, fradiv=0U, udiv=0U; + switch(usart_periph){ + /* get clock frequency */ + case USART0: + /* get USART0 clock */ + uclk = rcu_clock_freq_get(CK_APB2); + break; + case USART1: + /* get USART1 clock */ + uclk = rcu_clock_freq_get(CK_APB1); + break; + case USART2: + /* get USART2 clock */ + uclk = rcu_clock_freq_get(CK_APB1); + break; + case UART3: + /* get UART3 clock */ + uclk = rcu_clock_freq_get(CK_APB1); + break; + case UART4: + /* get UART4 clock */ + uclk = rcu_clock_freq_get(CK_APB1); + break; + default: + break; + } + /* oversampling by 16, configure the value of USART_BAUD */ + udiv = (uclk+baudval/2U)/baudval; + intdiv = udiv & 0xfff0U; + fradiv = udiv & 0xfU; + USART_BAUD(usart_periph) = ((USART_BAUD_FRADIV | USART_BAUD_INTDIV) & (intdiv | fradiv)); +} + +/*! + \brief configure USART parity + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] paritycfg: configure USART parity + only one parameter can be selected which is shown as below: + \arg USART_PM_NONE: no parity + \arg USART_PM_ODD: odd parity + \arg USART_PM_EVEN: even parity + \param[out] none + \retval none +*/ +void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg) +{ + /* clear USART_CTL0 PM,PCEN bits */ + USART_CTL0(usart_periph) &= ~(USART_CTL0_PM | USART_CTL0_PCEN); + /* configure USART parity mode */ + USART_CTL0(usart_periph) |= paritycfg ; +} + +/*! + \brief configure USART word length + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] wlen: USART word length configure + only one parameter can be selected which is shown as below: + \arg USART_WL_8BIT: 8 bits + \arg USART_WL_9BIT: 9 bits + \param[out] none + \retval none +*/ +void usart_word_length_set(uint32_t usart_periph, uint32_t wlen) +{ + /* clear USART_CTL0 WL bit */ + USART_CTL0(usart_periph) &= ~USART_CTL0_WL; + /* configure USART word length */ + USART_CTL0(usart_periph) |= wlen; +} + +/*! + \brief configure USART stop bit length + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] stblen: USART stop bit configure + only one parameter can be selected which is shown as below: + \arg USART_STB_1BIT: 1 bit + \arg USART_STB_0_5BIT: 0.5 bit, not available for UARTx(x=3,4) + \arg USART_STB_2BIT: 2 bits + \arg USART_STB_1_5BIT: 1.5 bits, not available for UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen) +{ + /* clear USART_CTL1 STB bits */ + USART_CTL1(usart_periph) &= ~USART_CTL1_STB; + /* configure USART stop bits */ + USART_CTL1(usart_periph) |= stblen; +} + +/*! + \brief enable USART + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_enable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_UEN; +} + +/*! + \brief disable USART + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_disable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_UEN); +} + +/*! + \brief configure USART transmitter + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] txconfig: enable or disable USART transmitter + only one parameter can be selected which is shown as below: + \arg USART_TRANSMIT_ENABLE: enable USART transmission + \arg USART_TRANSMIT_DISABLE: enable USART transmission + \param[out] none + \retval none +*/ +void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL0(usart_periph); + ctl &= ~USART_CTL0_TEN; + ctl |= txconfig; + /* configure transfer mode */ + USART_CTL0(usart_periph) = ctl; +} + +/*! + \brief configure USART receiver + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] rxconfig: enable or disable USART receiver + only one parameter can be selected which is shown as below: + \arg USART_RECEIVE_ENABLE: enable USART reception + \arg USART_RECEIVE_DISABLE: disable USART reception + \param[out] none + \retval none +*/ +void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL0(usart_periph); + ctl &= ~USART_CTL0_REN; + ctl |= rxconfig; + /* configure transfer mode */ + USART_CTL0(usart_periph) = ctl; +} + +/*! + \brief data is transmitted/received with the LSB/MSB first + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] msbf: LSB/MSB + only one parameter can be selected which is shown as below: + \arg USART_MSBF_LSB: LSB first + \arg USART_MSBF_MSB: MSB first + \param[out] none + \retval none +*/ +void usart_data_first_config(uint32_t usart_periph, uint32_t msbf) +{ + USART_CTL3(usart_periph) &= ~(USART_CTL3_MSBF); + USART_CTL3(usart_periph) |= msbf; +} + +/*! + \brief configure USART inversion + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] invertpara: refer to enum usart_invert_enum + only one parameter can be selected which is shown as below: + \arg USART_DINV_ENABLE: data bit level inversion + \arg USART_DINV_DISABLE: data bit level not inversion + \arg USART_TXPIN_ENABLE: TX pin level inversion + \arg USART_TXPIN_DISABLE: TX pin level not inversion + \arg USART_RXPIN_ENABLE: RX pin level inversion + \arg USART_RXPIN_DISABLE: RX pin level not inversion + \param[out] none + \retval none +*/ +void usart_invert_config(uint32_t usart_periph, usart_invert_enum invertpara) +{ + /* inverted or not the specified siginal */ + switch(invertpara){ + case USART_DINV_ENABLE: + /* data bit level inversion */ + USART_CTL3(usart_periph) |= USART_CTL3_DINV; + break; + case USART_TXPIN_ENABLE: + /* TX pin level inversion */ + USART_CTL3(usart_periph) |= USART_CTL3_TINV; + break; + case USART_RXPIN_ENABLE: + /* RX pin level inversion */ + USART_CTL3(usart_periph) |= USART_CTL3_RINV; + break; + case USART_DINV_DISABLE: + /* data bit level not inversion */ + USART_CTL3(usart_periph) &= ~(USART_CTL3_DINV); + break; + case USART_TXPIN_DISABLE: + /* TX pin level not inversion */ + USART_CTL3(usart_periph) &= ~(USART_CTL3_TINV); + break; + case USART_RXPIN_DISABLE: + /* RX pin level not inversion */ + USART_CTL3(usart_periph) &= ~(USART_CTL3_RINV); + break; + default: + break; + } +} + +/*! + \brief enable receiver timeout of USART + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_receiver_timeout_enable(uint32_t usart_periph) +{ + USART_CTL3(usart_periph) |= USART_CTL3_RTEN; +} + +/*! + \brief disable receiver timeout of USART + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_receiver_timeout_disable(uint32_t usart_periph) +{ + USART_CTL3(usart_periph) &= ~(USART_CTL3_RTEN); +} + +/*! + \brief set the receiver timeout threshold of USART + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] rtimeout: 0-0xFFFFFF + \param[out] none + \retval none +*/ +void usart_receiver_timeout_threshold_config(uint32_t usart_periph, uint32_t rtimeout) +{ + USART_RT(usart_periph) &= ~(USART_RT_RT); + USART_RT(usart_periph) |= rtimeout; +} + +/*! + \brief USART transmit data function + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] data: data of transmission + \param[out] none + \retval none +*/ +void usart_data_transmit(uint32_t usart_periph, uint32_t data) +{ + USART_DATA(usart_periph) = ((uint16_t)USART_DATA_DATA & data); +} + +/*! + \brief USART receive data function + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval data of received +*/ +uint16_t usart_data_receive(uint32_t usart_periph) +{ + return (uint16_t)(GET_BITS(USART_DATA(usart_periph), 0U, 8U)); +} + +/*! + \brief configure the address of the USART in wake up by address match mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] addr: address of USART/UART + \param[out] none + \retval none +*/ +void usart_address_config(uint32_t usart_periph, uint8_t addr) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_ADDR); + USART_CTL1(usart_periph) |= (USART_CTL1_ADDR & addr); +} + +/*! + \brief receiver in mute mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_mute_mode_enable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_RWU; +} + +/*! + \brief receiver in active mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_mute_mode_disable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_RWU); +} + +/*! + \brief configure wakeup method in mute mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] wmethod: two methods be used to enter or exit the mute mode + only one parameter can be selected which is shown as below: + \arg USART_WM_IDLE: idle line + \arg USART_WM_ADDR: address mask + \param[out] none + \retval none +*/ +void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmethod) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_WM); + USART_CTL0(usart_periph) |= wmethod; +} + +/*! + \brief enable LIN mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_lin_mode_enable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) |= USART_CTL1_LMEN; +} + +/*! + \brief disable LIN mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_lin_mode_disable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_LMEN); +} + +/*! + \brief configure lin break frame length + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] lblen: lin break frame length + only one parameter can be selected which is shown as below: + \arg USART_LBLEN_10B: 10 bits + \arg USART_LBLEN_11B: 11 bits + \param[out] none + \retval none +*/ +void usart_lin_break_detection_length_config(uint32_t usart_periph, uint32_t lblen) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_LBLEN); + USART_CTL1(usart_periph) |= (USART_CTL1_LBLEN & lblen); +} + +/*! + \brief send break frame + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_send_break(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_SBKCMD; +} + +/*! + \brief enable half duplex mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_halfduplex_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_HDEN; +} + +/*! + \brief disable half duplex mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_halfduplex_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_HDEN); +} + +/*! + \brief enable CK pin in synchronous mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_synchronous_clock_enable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) |= USART_CTL1_CKEN; +} + +/*! + \brief disable CK pin in synchronous mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_synchronous_clock_disable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_CKEN); +} + +/*! + \brief configure USART synchronous mode parameters + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] clen: CK length + only one parameter can be selected which is shown as below: + \arg USART_CLEN_NONE: there are 7 CK pulses for an 8 bit frame and 8 CK pulses for a 9 bit frame + \arg USART_CLEN_EN: there are 8 CK pulses for an 8 bit frame and 9 CK pulses for a 9 bit frame + \param[in] cph: clock phase + only one parameter can be selected which is shown as below: + \arg USART_CPH_1CK: first clock transition is the first data capture edge + \arg USART_CPH_2CK: second clock transition is the first data capture edge + \param[in] cpl: clock polarity + only one parameter can be selected which is shown as below: + \arg USART_CPL_LOW: steady low value on CK pin + \arg USART_CPL_HIGH: steady high value on CK pin + \param[out] none + \retval none +*/ +void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl) +{ + uint32_t ctl = 0U; + + /* read USART_CTL1 register */ + ctl = USART_CTL1(usart_periph); + ctl &= ~(USART_CTL1_CLEN | USART_CTL1_CPH | USART_CTL1_CPL); + /* set CK length, CK phase, CK polarity */ + ctl |= (USART_CTL1_CLEN & clen) | (USART_CTL1_CPH & cph) | (USART_CTL1_CPL & cpl); + + USART_CTL1(usart_periph) = ctl; +} + +/*! + \brief configure guard time value in smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] guat: guard time value, 0-0xFF + \param[out] none + \retval none +*/ +void usart_guard_time_config(uint32_t usart_periph,uint32_t guat) +{ + USART_GP(usart_periph) &= ~(USART_GP_GUAT); + USART_GP(usart_periph) |= (USART_GP_GUAT & ((guat)<> 8);(uint8_t)((x) >> 16) + +/* audio_freq * data_size (2 bytes) * num_channels (stereo: 2) */ +#define DEFAULT_OUT_BIT_RESOLUTION 16U +#define DEFAULT_OUT_CHANNEL_NBR 2U /* mono = 1, stereo = 2 */ +#define AUDIO_OUT_PACKET (uint32_t)(((USBD_AUDIO_FREQ_16K * \ + (DEFAULT_OUT_BIT_RESOLUTION / 8U) *\ + DEFAULT_OUT_CHANNEL_NBR) / 1000U)) + +/* number of sub-packets in the audio transfer buffer. you can modify this value but always make sure + that it is an even number and higher than 3 */ +#define OUT_PACKET_NUM 4U + +/* total size of the audio transfer buffer */ +#define OUT_BUF_MARGIN 4U +#define TOTAL_OUT_BUF_SIZE ((uint32_t)((AUDIO_OUT_PACKET + OUT_BUF_MARGIN) * OUT_PACKET_NUM)) + +#define AUDIO_CONFIG_DESC_SET_LEN 109U +#define AUDIO_INTERFACE_DESC_SIZE 9U + +#define USB_AUDIO_DESC_SIZ 0x09U +#define AUDIO_STANDARD_EP_DESC_SIZE 0x09U +#define AUDIO_STREAMING_EP_DESC_SIZE 0x07U + +/* audio interface class code */ +#define USB_CLASS_AUDIO 0x01U + +/* audio interface subclass codes */ +#define AUDIO_SUBCLASS_CONTROL 0x01U +#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02U +#define AUDIO_SUBCLASS_MIDISTREAMING 0x03U + +/* audio interface protocol codes */ +#define AUDIO_PROTOCOL_UNDEFINED 0x00U +#define AUDIO_STREAMING_GENERAL 0x01U +#define AUDIO_STREAMING_FORMAT_TYPE 0x02U + +/* audio class-specific descriptor types */ +#define AUDIO_DESCTYPE_UNDEFINED 0x20U +#define AUDIO_DESCTYPE_DEVICE 0x21U +#define AUDIO_DESCTYPE_CONFIGURATION 0x22U +#define AUDIO_DESCTYPE_STRING 0x23U +#define AUDIO_DESCTYPE_INTERFACE 0x24U +#define AUDIO_DESCTYPE_ENDPOINT 0x25U + +/* audio control interface descriptor subtypes */ +#define AUDIO_CONTROL_HEADER 0x01U +#define AUDIO_CONTROL_INPUT_TERMINAL 0x02U +#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03U +#define AUDIO_CONTROL_MIXER_UNIT 0x04U +#define AUDIO_CONTROL_SELECTOR_UNIT 0x05U +#define AUDIO_CONTROL_FEATURE_UNIT 0x06U +#define AUDIO_CONTROL_PROCESSING_UNIT 0x07U +#define AUDIO_CONTROL_EXTENSION_UNIT 0x08U + +#define AUDIO_INPUT_TERMINAL_DESC_SIZE 0x0CU +#define AUDIO_OUTPUT_TERMINAL_DESC_SIZE 0x09U +#define AUDIO_STREAMING_INTERFACE_DESC_SIZE 0x07U + +#define AUDIO_CONTROL_MUTE 0x0001U + +#define AUDIO_FORMAT_TYPE_I 0x01U +#define AUDIO_FORMAT_TYPE_III 0x03U + +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01U +#define AUDIO_ENDPOINT_GENERAL 0x01U + +#define AUDIO_REQ_GET_CUR 0x81U +#define AUDIO_REQ_SET_CUR 0x01U + +#define AUDIO_OUT_STREAMING_CTRL 0x02U + +#define PACKET_SIZE(freq) (((freq) * 2U) * 2U / 1000U) + +#define AUDIO_PACKET_SIZE(frq) (uint8_t)(PACKET_SIZE(frq) & 0xFFU), \ + (uint8_t)((PACKET_SIZE(frq) >> 8U) & 0xFFU) + +#define SAMPLE_FREQ(frq) (uint8_t)(frq), (uint8_t)((frq) >> 8U), \ + (uint8_t)((frq) >> 16U) + + +#pragma pack(1) + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< header descriptor subtype */ + uint16_t bcdADC; /*!< audio device class specification release number in binary-coded decimal */ + uint16_t wTotalLength; /*!< total number of bytes */ + uint8_t bInCollection; /*!< the number of the streaming interfaces */ + uint8_t baInterfaceNr; /*!< interface number of the streaming interfaces */ +} usb_desc_AC_itf; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< AS_GENERAL descriptor subtype */ + uint8_t bTerminalLink; /*!< the terminal ID */ + uint8_t bDelay; /*!< delay introduced by the data path */ + uint16_t wFormatTag; /*!< the audio data format */ +} usb_desc_AS_itf; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< INPUT_TERMINAL descriptor subtype. */ + uint8_t bTerminalID; /*!< constant uniquely identifying the terminal within the audio function */ + uint16_t wTerminalType; /*!< constant characterizing the type of terminal */ + uint8_t bAssocTerminal; /*!< ID of the output terminal */ + uint8_t bNrChannels; /*!< number of logical output channels */ + uint16_t wChannelConfig; /*!< describes the spatial location of the logical channels */ + uint8_t iChannelNames; /*!< index of a string descriptor */ + uint8_t iTerminal; /*!< index of a string descriptor */ +} usb_desc_input_terminal; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< OUTPUT_TERMINAL descriptor subtype */ + uint8_t bTerminalID; /*!< constant uniquely identifying the terminal within the audio function */ + uint16_t wTerminalType; /*!< constant characterizing the type of terminal */ + uint8_t bAssocTerminal; /*!< constant, identifying the input terminal to which this output terminal is associated */ + uint8_t bSourceID; /*!< ID of the unit or terminal */ + uint8_t iTerminal; /*!< index of a string descriptor */ +} usb_desc_output_terminal; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< FEATURE_UNIT descriptor subtype */ + uint8_t bUnitID; /*!< constant uniquely identifying the unit within the audio function */ + uint8_t bSourceID; /*!< ID of the unit or terminal */ + uint8_t bControlSize; /*!< size in bytes of an element of the bmaControls() array */ + uint8_t bmaControls0; /*!< a bit set to 1 indicates that the mentioned control is supported for master channel 0 */ + uint8_t bmaControls1; /*!< a bit set to 1 indicates that the mentioned control is supported for logical channel 1 */ + uint8_t iFeature; /*!< index of a string descriptor */ +} usb_desc_mono_feature_unit; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< FEATURE_UNIT descriptor subtype */ + uint8_t bUnitID; /*!< constant uniquely identifying the unit within the audio function */ + uint8_t bSourceID; /*!< ID of the unit or terminal */ + uint8_t bControlSize; /*!< size in bytes of an element of the bmaControls() array */ + uint16_t bmaControls0; /*!< a bit set to 1 indicates that the mentioned control is supported for master channel 0 */ + uint16_t bmaControls1; /*!< a bit set to 1 indicates that the mentioned control is supported for logical channel 1 */ + uint16_t bmaControls2; /*!< a bit set to 1 indicates that the mentioned control is supported for logical channel 2 */ + uint8_t iFeature; /*!< index of a string descriptor */ +} usb_desc_stereo_feature_unit; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< FORMAT_TYPE descriptor subtype */ + uint8_t bFormatType; /*!< constant identifying the format type */ + uint8_t bNrChannels; /*!< indicates the number of physical channels in the audio data stream */ + uint8_t bSubFrameSize; /*!< the number of bytes occupied by one audio sub-frame */ + uint8_t bBitResolution; /*!< the number of effectively used bits from the available bits in an audio sub-frame */ + uint8_t bSamFreqType; /*!< indicates how the sampling frequency can be programmed */ + uint8_t bSamFreq[3]; /*!< sampling frequency ns in Hz for this isochronous data endpoint */ +} usb_desc_format_type; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bEndpointAddress; /*!< the address of the endpoint */ + uint8_t bmAttributes; /*!< transfer type and synchronization type */ + uint16_t wMaxPacketSize; /*!< maximum packet size this endpoint is capable of sending or receiving */ + uint8_t bInterval; /*!< left to the designer's discretion */ + uint8_t bRefresh; /*!< reset to 0 */ + uint8_t bSynchAddress; /*!< reset to 0 */ +} usb_desc_std_ep; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bDescriptorSubtype; /*!< EP_GENERAL descriptor subtype */ + uint8_t bmAttributes; /*!< transfer type and synchronization type */ + uint8_t bLockDelayUnits; /*!< indicates the units used for the wLockDelay field */ + uint16_t wLockDelay; /*!< indicates the time it takes this endpoint to reliably lock its internal clock recovery circuitry */ +} usb_desc_AS_ep; + +#pragma pack() + +/* USB configuration descriptor structure */ +typedef struct +{ + usb_desc_config config; + usb_desc_itf std_itf; + usb_desc_AC_itf ac_itf; + usb_desc_input_terminal in_terminal; + usb_desc_mono_feature_unit feature_unit; + usb_desc_output_terminal out_terminal; + usb_desc_itf std_as_itf_zeroband; + usb_desc_itf std_as_itf_opera; + usb_desc_AS_itf as_itf; + usb_desc_format_type format_typeI; + usb_desc_std_ep std_endpoint; + usb_desc_AS_ep as_endpoint; +} usb_desc_config_set; + +typedef struct +{ + /* main buffer for audio data out transfers and its relative pointers */ + uint8_t isoc_out_buff[TOTAL_OUT_BUF_SIZE * 2U]; + uint8_t* isoc_out_wrptr; + uint8_t* isoc_out_rdptr; + + /* main buffer for audio control requests transfers and its relative variables */ + uint8_t audioctl[64]; + uint8_t audioctl_unit; + uint32_t audioctl_len; + + uint32_t play_flag; +} usbd_audio_handler; + +extern usb_desc audio_desc; +extern usb_class audio_class; + +#endif /* __AUDIO_CORE_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/audio/Include/audio_out_itf.h a/Drivers/GD32F30x_usbd_library/class/device/audio/Include/audio_out_itf.h new file mode 100644 index 0000000..f7d50aa --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/audio/Include/audio_out_itf.h @@ -0,0 +1,76 @@ +/*! + \file audio_out_itf.h + \brief audio OUT (playback) interface header file + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __AUDIO_OUT_ITF_H +#define __AUDIO_OUT_ITF_H + +#include "usbd_conf.h" + +/* audio commands enumeration */ +typedef enum +{ + AUDIO_CMD_PLAY = 1U, + AUDIO_CMD_PAUSE, + AUDIO_CMD_STOP, +}audio_cmd_enum; + +/* mute commands */ +#define AUDIO_MUTE 0x01U +#define AUDIO_UNMUTE 0x00U + +/* functions return value */ +#define AUDIO_OK 0x00U +#define AUDIO_FAIL 0xFFU + +/* audio machine states */ +#define AUDIO_STATE_INACTIVE 0x00U +#define AUDIO_STATE_ACTIVE 0x01U +#define AUDIO_STATE_PLAYING 0x02U +#define AUDIO_STATE_PAUSED 0x03U +#define AUDIO_STATE_STOPPED 0x04U +#define AUDIO_STATE_ERROR 0x05U + +typedef struct { + uint8_t (*audio_init) (uint32_t audio_freq, uint32_t volume, uint32_t options); + uint8_t (*audio_deinit) (uint32_t options); + uint8_t (*audio_cmd) (uint8_t* pbuf, uint32_t size, uint8_t cmd); + uint8_t (*audio_volume_ctl) (uint8_t vol); + uint8_t (*audio_mute_ctl) (uint8_t cmd); + uint8_t (*audio_periodic_tc) (uint8_t cmd); + uint8_t (*audio_state_get) (void); +} audio_fops_struct; + +extern audio_fops_struct audio_out_fops; + +#endif /* __AUDIO_OUT_ITF_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/audio/Source/audio_core.c a/Drivers/GD32F30x_usbd_library/class/device/audio/Source/audio_core.c new file mode 100644 index 0000000..0cad6ac --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/audio/Source/audio_core.c @@ -0,0 +1,549 @@ +/*! + \file audio_core.c + \brief USB audio device class core functions + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_transc.h" +#include "audio_out_itf.h" +#include "audio_core.h" +#include + +#define USBD_VID 0x28E9U +#define USBD_PID 0x9574U + +/* local function prototypes ('static') */ +static uint8_t usbd_audio_sof (usb_dev *udev); +static uint8_t audio_init (usb_dev *udev, uint8_t config_index); +static uint8_t audio_deinit (usb_dev *udev, uint8_t config_index); +static uint8_t audio_req_handler (usb_dev *udev, usb_req *req); +static uint8_t audio_ctlx_out (usb_dev *udev); +static void audio_data_out (usb_dev *udev, uint8_t ep_num); + +usb_class audio_class = { + .init = audio_init, + .deinit = audio_deinit, + .req_process = audio_req_handler, + .ctlx_out = audio_ctlx_out, + .data_out = audio_data_out +}; + +usbd_int_cb_struct usb_inthandler = +{ + usbd_audio_sof, +}; + +/* note:it should use the c99 standard when compiling the below codes */ +/* USB standard device descriptor */ +usb_desc_dev audio_dev_desc = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USBD_EP0_MAX_SIZE, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +usb_desc_config_set audio_config_set = +{ + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = AUDIO_CONFIG_DESC_SET_LEN, + .bNumInterfaces = 0x02U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xC0U, + .bMaxPower = 0x32U + }, + + .std_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x00U, + .bInterfaceClass = USB_CLASS_AUDIO, + .bInterfaceSubClass = AUDIO_SUBCLASS_CONTROL, + .bInterfaceProtocol = AUDIO_PROTOCOL_UNDEFINED, + .iInterface = 0x00U + }, + + .ac_itf = + { + .header = + { + .bLength = sizeof(usb_desc_AC_itf), + .bDescriptorType = AUDIO_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = 0x01U, + .bcdADC = 0x0100U, + .wTotalLength = 0x0027U, + .bInCollection = 0x01U, + .baInterfaceNr = 0x01U + }, + + .in_terminal = + { + .header = + { + .bLength = sizeof(usb_desc_input_terminal), + .bDescriptorType = AUDIO_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = 0x02U, + .bTerminalID = 0x01U, + .wTerminalType = 0x0101U, + .bAssocTerminal = 0x00U, + .bNrChannels = 0x01U, + .wChannelConfig = 0x0000U, + .iChannelNames = 0x00U, + .iTerminal = 0x00U + }, + + .feature_unit = + { + .header = + { + .bLength = sizeof(usb_desc_mono_feature_unit), + .bDescriptorType = AUDIO_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT, + .bUnitID = AUDIO_OUT_STREAMING_CTRL, + .bSourceID = 0x01U, + .bControlSize = 0x01U, + .bmaControls0 = AUDIO_CONTROL_MUTE, + .bmaControls1 = 0x00U, + .iFeature = 0x00U + }, + + .out_terminal = + { + .header = + { + .bLength = sizeof(usb_desc_output_terminal), + .bDescriptorType = AUDIO_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AUDIO_CONTROL_OUTPUT_TERMINAL, + .bTerminalID = 0x03U, + .wTerminalType = 0x0301U, + .bAssocTerminal = 0x00U, + .bSourceID = 0x02U, + .iTerminal = 0x00U + }, + + .std_as_itf_zeroband = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x01U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x00U, + .bInterfaceClass = USB_CLASS_AUDIO, + .bInterfaceSubClass = AUDIO_SUBCLASS_AUDIOSTREAMING, + .bInterfaceProtocol = AUDIO_PROTOCOL_UNDEFINED, + .iInterface = 0x00U + }, + + .std_as_itf_opera = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x01U, + .bAlternateSetting = 0x01U, + .bNumEndpoints = 0x01U, + .bInterfaceClass = USB_CLASS_AUDIO, + .bInterfaceSubClass = AUDIO_SUBCLASS_AUDIOSTREAMING, + .bInterfaceProtocol = AUDIO_PROTOCOL_UNDEFINED, + .iInterface = 0x00U + }, + + .as_itf = + { + .header = + { + .bLength = sizeof(usb_desc_AS_itf), + .bDescriptorType = AUDIO_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AUDIO_STREAMING_GENERAL, + .bTerminalLink = 0x01U, + .bDelay = 0x01U, + .wFormatTag = 0x0001U, + }, + + .format_typeI = + { + .header = + { + .bLength = sizeof(usb_desc_format_type), + .bDescriptorType = AUDIO_DESCTYPE_INTERFACE + }, + .bDescriptorSubtype = AUDIO_STREAMING_FORMAT_TYPE, + .bFormatType = AUDIO_FORMAT_TYPE_III, + .bNrChannels = 0x02U, + .bSubFrameSize = 0x02U, + .bBitResolution = 0x10U, + .bSamFreqType = 0x01U, + .bSamFreq[0] = (uint8_t)USBD_AUDIO_FREQ_16K, + .bSamFreq[1] = USBD_AUDIO_FREQ_16K >> 8, + .bSamFreq[2] = USBD_AUDIO_FREQ_16K >> 16 + }, + + .std_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_std_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = AUDIO_OUT_EP, + .bmAttributes = USB_ENDPOINT_TYPE_ISOCHRONOUS, + .wMaxPacketSize = PACKET_SIZE(USBD_AUDIO_FREQ_16K), + .bInterval = 0x01U, + .bRefresh = 0x00U, + .bSynchAddress = 0x00U + }, + + .as_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_AS_ep), + .bDescriptorType = AUDIO_DESCTYPE_ENDPOINT + }, + .bDescriptorSubtype = AUDIO_ENDPOINT_GENERAL, + .bmAttributes = 0x00U, + .bLockDelayUnits = 0x00U, + .wLockDelay = 0x0000U, + } +}; + +/* USB language ID descriptor */ +static usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static usb_desc_str manufacturer_string = +{ + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static usb_desc_str product_string = +{ + .header = + { + .bLength = USB_STRING_LEN(14U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'A', 'u', 'd', 'i', 'o'} +}; + +/* USBD serial string */ +static usb_desc_str serial_string = +{ + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR, + } +}; + +/* USB string descriptor */ +static uint8_t* usbd_audio_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc audio_desc = { + .dev_desc = (uint8_t *)&audio_dev_desc, + .config_desc = (uint8_t *)&audio_config_set, + .strings = usbd_audio_strings +}; + + +/*! + \brief initialize the audio device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_init (usb_dev *udev, uint8_t config_index) +{ + usb_desc_std_ep std_ep = audio_config_set.std_endpoint; + + static usbd_audio_handler audio_handler; + + memset((void *)&audio_handler, 0, sizeof(usbd_audio_handler)); + + usb_desc_ep ep = { + .header = std_ep.header, + .bEndpointAddress = std_ep.bEndpointAddress, + .bmAttributes = std_ep.bmAttributes, + .wMaxPacketSize = std_ep.wMaxPacketSize, + .bInterval = std_ep.bInterval + }; + + /* initialize RX endpoint */ + usbd_ep_init(udev, EP_BUF_DBL, AUDIO_BUF_ADDR, &ep); + + usbd_int_fops = &usb_inthandler; + + audio_handler.isoc_out_rdptr = audio_handler.isoc_out_buff; + audio_handler.isoc_out_wrptr = audio_handler.isoc_out_buff; + + /* initialize the audio output hardware layer */ + if (USBD_OK != audio_out_fops.audio_init(USBD_AUDIO_FREQ_16K, DEFAULT_VOLUME, 0U)) { + return USBD_FAIL; + } + + udev->ep_transc[AUDIO_OUT_EP][TRANSC_OUT] = audio_class.data_out; + + /* prepare out endpoint to receive audio data */ + usbd_ep_recev (udev, AUDIO_OUT_EP, (uint8_t*)audio_handler.isoc_out_buff, (uint16_t)AUDIO_OUT_PACKET); + + udev->class_data[USBD_AUDIO_INTERFACE] = (void *)&audio_handler; + + return USBD_OK; +} + +/*! + \brief de-initialize the audio device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_deinit (usb_dev *udev, uint8_t config_index) +{ + /* deinitialize audio endpoints */ + usbd_ep_deinit(udev, AUDIO_OUT_EP); + + /* deinitialize the audio output hardware layer */ + if (USBD_OK != audio_out_fops.audio_deinit(0U)) { + return USBD_FAIL; + } + + return USBD_OK; +} + +/*! + \brief handle the audio class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_req_handler (usb_dev *udev, usb_req *req) +{ + uint8_t status = REQ_NOTSUPP; + + usbd_audio_handler *audio = (usbd_audio_handler *)udev->class_data[USBD_AUDIO_INTERFACE]; + + switch (req->bRequest) { + case AUDIO_REQ_GET_CUR: + usb_transc_config(&udev->transc_in[0], audio->audioctl, req->wLength, 0U); + + status = REQ_SUPP; + break; + + case AUDIO_REQ_SET_CUR: + if (req->wLength) { + usb_transc_config(&udev->transc_out[0], audio->audioctl, req->wLength, 0U); + + udev->class_core->req_cmd = AUDIO_REQ_SET_CUR; + + audio->audioctl_len = req->wLength; + audio->audioctl_unit = BYTE_HIGH(req->wIndex); + + status = REQ_SUPP; + } + break; + + default: + break; + } + + return status; +} + +/*! + \brief handles the audio out data stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval USB device operation status +*/ +static void audio_data_out (usb_dev *udev, uint8_t ep_num) +{ + usbd_audio_handler *audio = (usbd_audio_handler *)udev->class_data[USBD_AUDIO_INTERFACE]; + + if (AUDIO_OUT_EP == ep_num) { + /* increment the Buffer pointer or roll it back when all buffers are full */ + if (audio->isoc_out_wrptr >= (audio->isoc_out_buff + (AUDIO_OUT_PACKET * OUT_PACKET_NUM))) { + /* all buffers are full: roll back */ + audio->isoc_out_wrptr = audio->isoc_out_buff; + } else { + /* increment the buffer pointer */ + audio->isoc_out_wrptr += AUDIO_OUT_PACKET; + } + + /* prepare out endpoint to receive next audio packet */ + usbd_ep_recev (udev, AUDIO_OUT_EP, (uint8_t*)(audio->isoc_out_wrptr), (uint16_t)AUDIO_OUT_PACKET); + + /* trigger the start of streaming only when half buffer is full */ + if ((0U == audio->play_flag) && (audio->isoc_out_wrptr >= (audio->isoc_out_buff + ((AUDIO_OUT_PACKET * OUT_PACKET_NUM) / 2U)))) { + /* enable start of streaming */ + audio->play_flag = 1U; + } + } +} + +/*! + \brief handles audio control request data + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t audio_ctlx_out (usb_dev *udev) +{ + usbd_audio_handler *audio = (usbd_audio_handler *)udev->class_data[USBD_AUDIO_INTERFACE]; + + /* check if an audio_control request has been issued */ + if (AUDIO_REQ_SET_CUR == udev->class_core->req_cmd) { + /* in this driver, to simplify code, only SET_CUR request is managed */ + + /* check for which addressed unit the audio_control request has been issued */ + if (AUDIO_OUT_STREAMING_CTRL == audio->audioctl_unit) { + /* in this driver, to simplify code, only one unit is manage */ + + /* call the audio interface mute function */ + audio_out_fops.audio_mute_ctl(audio->audioctl[0]); + + /* reset the audioctl_cmd variable to prevent re-entering this function */ + udev->class_core->req_cmd = 0U; + + audio->audioctl_len = 0U; + } + } + + return USBD_OK; +} + +/*! + \brief handles the SOF event (data buffer update and synchronization) + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t usbd_audio_sof (usb_dev *udev) +{ + usbd_audio_handler *audio = (usbd_audio_handler *)udev->class_data[USBD_AUDIO_INTERFACE]; + + /* check if there are available data in stream buffer. + in this function, a single variable (play_flag) is used to avoid software delays. + the play operation must be executed as soon as possible after the SOF detection. */ + if (audio->play_flag) { + /* start playing received packet */ + audio_out_fops.audio_cmd((uint8_t*)(audio->isoc_out_rdptr), /* samples buffer pointer */ + AUDIO_OUT_PACKET, /* number of samples in Bytes */ + AUDIO_CMD_PLAY); /* command to be processed */ + + /* increment the Buffer pointer or roll it back when all buffers all full */ + if (audio->isoc_out_rdptr >= (audio->isoc_out_buff + (AUDIO_OUT_PACKET * OUT_PACKET_NUM))) { + /* roll back to the start of buffer */ + audio->isoc_out_rdptr = audio->isoc_out_buff; + } else { + /* increment to the next sub-buffer */ + audio->isoc_out_rdptr += AUDIO_OUT_PACKET; + } + + /* if all available buffers have been consumed, stop playing */ + if (audio->isoc_out_rdptr == audio->isoc_out_wrptr) { + /* pause the audio stream */ + audio_out_fops.audio_cmd((uint8_t*)(audio->isoc_out_buff), /* samples buffer pointer */ + AUDIO_OUT_PACKET, /* number of samples in Bytes */ + AUDIO_CMD_PAUSE); /* command to be processed */ + + /* stop entering play loop */ + audio->play_flag = 0U; + + /* reset buffer pointers */ + audio->isoc_out_rdptr = audio->isoc_out_buff; + audio->isoc_out_wrptr = audio->isoc_out_buff; + } + } + + return USBD_OK; +} diff --git b/Drivers/GD32F30x_usbd_library/class/device/audio/Source/audio_out_itf.c a/Drivers/GD32F30x_usbd_library/class/device/audio/Source/audio_out_itf.c new file mode 100644 index 0000000..f96925e --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/audio/Source/audio_out_itf.c @@ -0,0 +1,242 @@ +/*! + \file audio_out_itf.c + \brief audio OUT (playback) interface functions + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "audio_core.h" +#include "audio_out_itf.h" + +/* local function prototypes ('static') */ +static uint8_t init (uint32_t audio_freq, uint32_t volume, uint32_t options); +static uint8_t deinit (uint32_t options); +static uint8_t audio_cmd (uint8_t* pbuf, uint32_t size, uint8_t cmd); +static uint8_t volume_ctl (uint8_t vol); +static uint8_t mute_ctl (uint8_t cmd); +static uint8_t periodic_tc (uint8_t cmd); +static uint8_t get_state (void); + +audio_fops_struct audio_out_fops = +{ + init, + deinit, + audio_cmd, + volume_ctl, + mute_ctl, + periodic_tc, + get_state +}; + +static uint8_t audio_state = AUDIO_STATE_INACTIVE; + +/*! + \brief initialize and configures all required resources for audio play function + \param[in] audio_freq: statrt_up audio frequency + \param[in] volume: start_up volume to be set + \param[in] options: specific options passed to low layer function + \param[out] none + \retval AUDIO_OK if all operations succeed, otherwise, AUDIO_FAIL. +*/ +static uint8_t init (uint32_t audio_freq, uint32_t volume, uint32_t options) +{ + static uint32_t initialized = 0U; + + /* check if the low layer has already been initialized */ + if (0U == initialized) { + /* call low layer function */ + if (0U != eval_audio_init(OUTPUT_DEVICE_AUTO, volume, audio_freq)) { + audio_state = AUDIO_STATE_ERROR; + + return AUDIO_FAIL; + } + + /* set the initialization flag to prevent reinitializing the interface again */ + initialized = 1U; + } + + /* update the audio state machine */ + audio_state = AUDIO_STATE_ACTIVE; + + return AUDIO_OK; +} + +/*! + \brief free all resources used by low layer and stops audio-play function + \param[in] options: specific options passed to low layer function + \param[out] none + \retval AUDIO_OK if all operations succeed, otherwise, AUDIO_FAIL. +*/ +static uint8_t deinit (uint32_t options) +{ + /* update the audio state machine */ + audio_state = AUDIO_STATE_INACTIVE; + + return AUDIO_OK; +} + +/*! + \brief play, stop, pause or resume current file + \param[in] pbuf: address from which file should be played + \param[in] size: size of the current buffer/file + \param[in] cmd: command to be executed, can be: + \arg AUDIO_CMD_PLAY + \arg AUDIO_CMD_PAUSE + \arg AUDIO_CMD_RESUME + \arg AUDIO_CMD_STOP + \param[out] none + \retval AUDIO_OK if all operations succeed, otherwise, AUDIO_FAIL. +*/ +static uint8_t audio_cmd (uint8_t* pbuf, uint32_t size, uint8_t cmd) +{ + uint8_t status = AUDIO_OK; + + /* check the current state */ + if ((AUDIO_STATE_INACTIVE == audio_state) || (AUDIO_STATE_ERROR == audio_state)) { + audio_state = AUDIO_STATE_ERROR; + + return AUDIO_FAIL; + } + + switch (cmd) { + /* process the play command */ + case AUDIO_CMD_PLAY: + /* if current state is active or stopped */ + if ((AUDIO_STATE_ACTIVE == audio_state) || \ + (AUDIO_STATE_STOPPED == audio_state) || \ + (AUDIO_STATE_PLAYING == audio_state)) { + audio_mal_play((uint32_t)pbuf, (size / 2U)); + audio_state = AUDIO_STATE_PLAYING; + } else if (AUDIO_STATE_PAUSED == audio_state) { + if (eval_audio_pause_resume(AUDIO_RESUME, (uint32_t)pbuf, (size / 2U))) { + audio_state = AUDIO_STATE_ERROR; + + status = AUDIO_FAIL; + } else { + audio_state = AUDIO_STATE_PLAYING; + } + } else { + status = AUDIO_FAIL; + } + break; + + /* process the stop command */ + case AUDIO_CMD_STOP: + if (AUDIO_STATE_PLAYING != audio_state) { + /* unsupported command */ + status = AUDIO_FAIL; + } else if (eval_audio_stop(CODEC_PDWN_SW)) { + audio_state = AUDIO_STATE_ERROR; + + status = AUDIO_FAIL; + } else { + audio_state = AUDIO_STATE_STOPPED; + } + break; + + /* process the pause command */ + case AUDIO_CMD_PAUSE: + if (AUDIO_STATE_PLAYING != audio_state) { + /* unsupported command */ + status = AUDIO_FAIL; + } else if (eval_audio_pause_resume(AUDIO_PAUSE, (uint32_t)pbuf, (size / 2U))) { + audio_state = AUDIO_STATE_ERROR; + + status = AUDIO_FAIL; + } else { + audio_state = AUDIO_STATE_PAUSED; + } + break; + + /* unsupported command */ + default: + break; + } + + return status; +} + +/*! + \brief set the volume level + \param[in] vol: volume level to be set in % (from 0% to 100%) + \param[out] none + \retval AUDIO_OK if all operations succeed, otherwise, AUDIO_FAIL. +*/ +static uint8_t volume_ctl (uint8_t vol) +{ + /* call low layer volume setting function */ + if (eval_audio_volume_ctl(vol)) { + audio_state = AUDIO_STATE_ERROR; + + return AUDIO_FAIL; + } + + return AUDIO_OK; +} + +/*! + \brief mute or unmute the audio current output + \param[in] cmd: can be 0 to unmute, or 1 to mute + \param[out] none + \retval AUDIO_OK if all operations succeed, otherwise, AUDIO_FAIL. +*/ +static uint8_t mute_ctl (uint8_t cmd) +{ + /* call low layer mute setting function */ + if (eval_audio_mute((uint32_t)cmd)) { + audio_state = AUDIO_STATE_ERROR; + + return AUDIO_FAIL; + } + + return AUDIO_OK; +} + +/*! + \brief periodic transfer control + \param[in] cmd: command + \param[out] none + \retval AUDIO_OK if all operations succeed, otherwise, AUDIO_FAIL. +*/ +static uint8_t periodic_tc (uint8_t cmd) +{ + return AUDIO_OK; +} + +/*! + \brief return the current state of the audio machine + \param[in] none + \param[out] none + \retval AUDIO_OK if all operations succeed, otherwise, AUDIO_FAIL. +*/ +static uint8_t get_state (void) +{ + return audio_state; +} diff --git b/Drivers/GD32F30x_usbd_library/class/device/cdc/Include/cdc_acm_core.h a/Drivers/GD32F30x_usbd_library/class/device/cdc/Include/cdc_acm_core.h new file mode 100644 index 0000000..c0bac07 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/cdc/Include/cdc_acm_core.h @@ -0,0 +1,163 @@ +/*! + \file cdc_acm_core.h + \brief the header file of cdc acm driver + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __CDC_ACM_CORE_H +#define __CDC_ACM_CORE_H + +#include "usbd_enum.h" + +/* communications device class code */ +#define USB_CLASS_CDC 0x02U + +/* CDC subclass code */ +#define USB_CDC_SUBCLASS_DLCM 0x01U +#define USB_CDC_SUBCLASS_ACM 0x02U + +/* communications interface class control protocol codes */ +#define USB_CDC_PROTOCOL_NONE 0x00U +#define USB_CDC_PROTOCOL_AT 0x01U + +/* data interface class code */ +#define USB_CLASS_DATA 0x0AU + +#define USB_DESCTYPE_CDC_ACM 0x21U +#define USB_DESCTYPE_CS_INTERFACE 0x24U + +#define USB_CDC_ACM_CONFIG_DESC_SIZE 0x43U + +/* class-specific notification codes for PSTN subclasses */ +#define USB_CDC_NOTIFY_SERIAL_STATE 0x20U + +/* class-specific request codes */ +#define SEND_ENCAPSULATED_COMMAND 0x00U +#define GET_ENCAPSULATED_RESPONSE 0x01U +#define SET_COMM_FEATURE 0x02U +#define GET_COMM_FEATURE 0x03U +#define CLEAR_COMM_FEATURE 0x04U +#define SET_LINE_CODING 0x20U +#define GET_LINE_CODING 0x21U +#define SET_CONTROL_LINE_STATE 0x22U +#define SEND_BREAK 0x23U +#define NO_CMD 0xFFU + +#pragma pack(1) + +/* CDC ACM line coding struct */ +typedef struct { + uint32_t dwDTERate; /*!< data terminal rate */ + uint8_t bCharFormat; /*!< stop bits */ + uint8_t bParityType; /*!< parity */ + uint8_t bDataBits; /*!< data bits */ +} acm_line; + +/* notification structure */ +typedef struct { + uint8_t bmRequestType; /*!< type of request */ + uint8_t bNotification; /*!< communication interface class notifications */ + uint16_t wValue; /*!< value of notification */ + uint16_t wIndex; /*!< index of interface */ + uint16_t wLength; /*!< length of notification data */ +} acm_notification; + +/* header function struct */ +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: header function descriptor */ + uint16_t bcdCDC; /*!< bcdCDC: low byte of spec release number (CDC1.10) */ +} usb_desc_header_func; + +/* call managment function struct */ +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: call management function descriptor */ + uint8_t bmCapabilities; /*!< bmCapabilities: D0 is reset, D1 is ignored */ + uint8_t bDataInterface; /*!< bDataInterface: 1 interface used for call management */ +} usb_desc_call_managment_func; + +/* acm function struct */ +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: abstract control management descriptor */ + uint8_t bmCapabilities; /*!< bmCapabilities: D1 */ +} usb_desc_acm_func; + +/* union function struct */ +typedef struct { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: union function descriptor */ + uint8_t bMasterInterface; /*!< bMasterInterface: communication class interface */ + uint8_t bSlaveInterface0; /*!< bSlaveInterface0: data class interface */ +} usb_desc_union_func; + +#pragma pack() +/* configuration descriptor struct */ +typedef struct { + usb_desc_config config; + usb_desc_itf cmd_itf; + usb_desc_header_func cdc_header; + usb_desc_call_managment_func cdc_call_managment; + usb_desc_acm_func cdc_acm; + usb_desc_union_func cdc_union; + usb_desc_ep cdc_cmd_endpoint; + usb_desc_itf cdc_data_interface; + usb_desc_ep cdc_out_endpoint; + usb_desc_ep cdc_in_endpoint; +} usb_cdc_desc_config_set; + +#define USB_CDC_RX_LEN 64U + +typedef struct { + uint8_t pre_packet_send; + uint8_t packet_sent; + uint8_t packet_receive; + + uint8_t data[USB_CDC_RX_LEN]; + + uint32_t receive_length; + + acm_line line_coding; +} usb_cdc_handler; + +extern usb_desc cdc_desc; +extern usb_class cdc_class; + +/* function declarations */ +/* receive CDC ACM data */ +void cdc_acm_data_receive(usb_dev *udev); +/* send CDC ACM data */ +void cdc_acm_data_send(usb_dev *udev); +/* check cdc acm is ready for data transfer */ +uint8_t cdc_acm_check_ready(usb_dev *udev); + +#endif /* __CDC_ACM_CORE_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/cdc/Source/cdc_acm_core.c a/Drivers/GD32F30x_usbd_library/class/device/cdc/Source/cdc_acm_core.c new file mode 100644 index 0000000..04738ce --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/cdc/Source/cdc_acm_core.c @@ -0,0 +1,510 @@ +/*! + \file cdc_acm_core.c + \brief CDC ACM driver + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_transc.h" +#include "cdc_acm_core.h" + +#define USBD_VID 0x28E9U +#define USBD_PID 0x018AU + +/* note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +usb_desc_dev cdc_dev_desc = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV, + }, + .bcdUSB = 0x0200U, + .bDeviceClass = USB_CLASS_CDC, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USBD_EP0_MAX_SIZE, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM, +}; + +/* USB device configuration descriptor */ +usb_cdc_desc_config_set cdc_config_desc = +{ + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG, + }, + .wTotalLength = USB_CDC_ACM_CONFIG_DESC_SIZE, + .bNumInterfaces = 0x02U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0x80U, + .bMaxPower = 0x32U + }, + + .cmd_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x01U, + .bInterfaceClass = USB_CLASS_CDC, + .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM, + .bInterfaceProtocol = USB_CDC_PROTOCOL_AT, + .iInterface = 0x00U + }, + + .cdc_header = + { + .header = + { + .bLength = sizeof(usb_desc_header_func), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x00U, + .bcdCDC = 0x0110U + }, + + .cdc_call_managment = + { + .header = + { + .bLength = sizeof(usb_desc_call_managment_func), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x01U, + .bmCapabilities = 0x00U, + .bDataInterface = 0x01U + }, + + .cdc_acm = + { + .header = + { + .bLength = sizeof(usb_desc_acm_func), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x02U, + .bmCapabilities = 0x02U, + }, + + .cdc_union = + { + .header = + { + .bLength = sizeof(usb_desc_union_func), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x06U, + .bMasterInterface = 0x00U, + .bSlaveInterface0 = 0x01U, + }, + + .cdc_cmd_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP, + }, + .bEndpointAddress = CDC_CMD_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = CDC_ACM_CMD_PACKET_SIZE, + .bInterval = 0x0AU + }, + + .cdc_data_interface = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF, + }, + .bInterfaceNumber = 0x01U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_CLASS_DATA, + .bInterfaceSubClass = 0x00U, + .bInterfaceProtocol = USB_CDC_PROTOCOL_NONE, + .iInterface = 0x00U + }, + + .cdc_out_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP, + }, + .bEndpointAddress = CDC_OUT_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = CDC_ACM_DATA_PACKET_SIZE, + .bInterval = 0x00U + }, + + .cdc_in_endpoint = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = CDC_IN_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = CDC_ACM_DATA_PACKET_SIZE, + .bInterval = 0x00U + } +}; + +/* USB language ID descriptor */ +static usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static usb_desc_str manufacturer_string = +{ + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static usb_desc_str product_string = +{ + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'C', 'D', 'C', '_', 'A', 'C', 'M'} +}; + +/* USBD serial string */ +static usb_desc_str serial_string = +{ + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR, + } +}; + +/* USB string descriptor set */ +uint8_t* usbd_cdc_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc cdc_desc = { + .dev_desc = (uint8_t *)&cdc_dev_desc, + .config_desc = (uint8_t *)&cdc_config_desc, + .strings = usbd_cdc_strings +}; + +/* local function prototypes ('static') */ +static uint8_t cdc_acm_init (usb_dev *udev, uint8_t config_index); +static uint8_t cdc_acm_deinit (usb_dev *udev, uint8_t config_index); +static uint8_t cdc_acm_req_handler (usb_dev *udev, usb_req *req); +static uint8_t cdc_acm_ctlx_out (usb_dev *udev); +static void cdc_acm_data_in (usb_dev *udev, uint8_t ep_num); +static void cdc_acm_data_out (usb_dev *udev, uint8_t ep_num); + +usb_class cdc_class = { + .req_cmd = NO_CMD, + + .init = cdc_acm_init, + .deinit = cdc_acm_deinit, + .req_process = cdc_acm_req_handler, + .ctlx_out = cdc_acm_ctlx_out, + .data_in = cdc_acm_data_in, + .data_out = cdc_acm_data_out +}; + +/*! + \brief receive CDC ACM data + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +void cdc_acm_data_receive(usb_dev *udev) +{ + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE]; + + cdc->packet_receive = 0U; + cdc->pre_packet_send = 0U; + + usbd_ep_recev(udev, CDC_OUT_EP, (uint8_t*)(cdc->data), USB_CDC_RX_LEN); +} + +/*! + \brief send CDC ACM data + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +void cdc_acm_data_send (usb_dev *udev) +{ + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE]; + uint32_t data_len = cdc->receive_length; + + if ((0U != data_len) && (1U == cdc->packet_sent)) { + cdc->packet_sent = 0U; + usbd_ep_send(udev, CDC_IN_EP, (uint8_t*)(cdc->data), (uint16_t)data_len); + cdc->receive_length = 0U; + } +} + +/*! + \brief check cdc acm is ready for data transfer + \param[in] udev: pointer to USB device instance + \param[out] none + \retval 0 if CDC is ready, 5 otherwise +*/ +uint8_t cdc_acm_check_ready(usb_dev *udev) +{ + if (udev->class_data[CDC_COM_INTERFACE] != NULL) { + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE]; + + if ((1U == cdc->packet_receive) && (1U == cdc->pre_packet_send)) { + return 0U; + } + } + + return 5U; +} + +/*! + \brief initialize the CDC ACM device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_init (usb_dev *udev, uint8_t config_index) +{ + static usb_cdc_handler cdc_handler; + + /* initialize the data endpoints */ + usbd_ep_init(udev, EP_BUF_SNG, BULK_TX_ADDR, &(cdc_config_desc.cdc_in_endpoint)); + usbd_ep_init(udev, EP_BUF_SNG, BULK_RX_ADDR, &(cdc_config_desc.cdc_out_endpoint)); + + /* initialize the command endpoint */ + usbd_ep_init(udev, EP_BUF_SNG, INT_TX_ADDR, &(cdc_config_desc.cdc_cmd_endpoint)); + + udev->ep_transc[EP_ID(CDC_IN_EP)][TRANSC_IN] = cdc_class.data_in; + udev->ep_transc[CDC_OUT_EP][TRANSC_OUT] = cdc_class.data_out; + + /* initialize cdc handler structure */ + cdc_handler.packet_receive = 0U; + cdc_handler.packet_sent = 1U; + cdc_handler.pre_packet_send = 1U; + cdc_handler.receive_length = 0U; + + cdc_handler.line_coding = (acm_line){ + .dwDTERate = 115200U, + .bCharFormat = 0U, + .bParityType = 0U, + .bDataBits = 0x08U + }; + + udev->class_data[CDC_COM_INTERFACE] = (void *)&cdc_handler; + + return USBD_OK; +} + +/*! + \brief de-initialize the CDC ACM device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_deinit (usb_dev *udev, uint8_t config_index) +{ + /* deinitialize the data endpoints */ + usbd_ep_deinit(udev, CDC_IN_EP); + usbd_ep_deinit(udev, CDC_OUT_EP); + + /* deinitialize the command endpoint */ + usbd_ep_deinit(udev, CDC_CMD_EP); + + return USBD_OK; +} + +/*! + \brief command data received on control endpoint + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_ctlx_out (usb_dev *udev) +{ + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE]; + + if (NO_CMD != udev->class_core->req_cmd) { + cdc->packet_receive = 1U; + cdc->pre_packet_send = 1U; + + udev->class_core->req_cmd = NO_CMD; + } + + return USBD_OK; +} + + +/*! + \brief handle CDC ACM data in transaction + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval USB device operation status +*/ +static void cdc_acm_data_in (usb_dev *udev, uint8_t ep_num) +{ + usb_transc *transc = &udev->transc_in[ep_num]; + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE]; + + if (transc->xfer_count == transc->max_len) { + usbd_ep_send(udev, EP_ID(ep_num), NULL, 0U); + } else { + cdc->packet_sent = 1U; + cdc->pre_packet_send = 1U; + } +} + +/*! + \brief handle CDC ACM data out transaction + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval USB device operation status +*/ +static void cdc_acm_data_out (usb_dev *udev, uint8_t ep_num) +{ + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE]; + + cdc->packet_receive = 1U; + + cdc->receive_length = udev->transc_out[ep_num].xfer_count; +} + +/*! + \brief handle the CDC ACM class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_req_handler (usb_dev *udev, usb_req *req) +{ + uint8_t status = REQ_NOTSUPP, noti_buf[10] = {0U}; + usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE]; + + acm_notification *notif = (void *)noti_buf; + + switch (req->bRequest) { + case SEND_ENCAPSULATED_COMMAND: + break; + + case GET_ENCAPSULATED_RESPONSE: + break; + + case SET_COMM_FEATURE: + break; + + case GET_COMM_FEATURE: + break; + + case CLEAR_COMM_FEATURE: + break; + + case SET_LINE_CODING: + /* set the value of the current command to be processed */ + udev->class_core->req_cmd = req->bRequest; + + usb_transc_config(&udev->transc_out[0U], (uint8_t *)&cdc->line_coding, req->wLength, 0U); + + status = REQ_SUPP; + break; + + case GET_LINE_CODING: + usb_transc_config(&udev->transc_in[0U], (uint8_t *)&cdc->line_coding, 7U, 0U); + + status = REQ_SUPP; + break; + + case SET_CONTROL_LINE_STATE: + notif->bmRequestType = 0xA1U; + notif->bNotification = USB_CDC_NOTIFY_SERIAL_STATE; + notif->wIndex = 0U; + notif->wValue = 0U; + notif->wLength = 2U; + noti_buf[8] = (uint8_t)req->wValue & 3U; + noti_buf[9] = 0U; + + status = REQ_SUPP; + break; + + case SEND_BREAK: + break; + + default: + break; + } + + return status; +} diff --git b/Drivers/GD32F30x_usbd_library/class/device/dfu/Include/dfu_core.h a/Drivers/GD32F30x_usbd_library/class/device/dfu/Include/dfu_core.h new file mode 100644 index 0000000..81650b3 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/dfu/Include/dfu_core.h @@ -0,0 +1,179 @@ +/*! + \file dfu_core.h + \brief the header file of USB DFU device class core functions + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __DFU_CORE_H +#define __DFU_CORE_H + +#include "usbd_enum.h" + +/* DFU class code */ +#define USB_DFU_CLASS 0xFEU + +/* DFU subclass code */ +#define USB_DFU_SUBCLASS_UPGRADE 0x01U + +/* DFU protocol code */ +#define USB_DFU_PROTOCL_RUNTIME 0x01U +#define USB_DFU_PROTOCL_DFU 0x02U + +/* manifestation state */ +#define MANIFEST_COMPLETE 0x00U +#define MANIFEST_IN_PROGRESS 0x01U + +/* DFU attributes code */ +#define USB_DFU_CAN_DOWNLOAD 0x01U +#define USB_DFU_CAN_UPLOAD 0x02U +#define USB_DFU_MANIFEST_TOLERANT 0x04U +#define USB_DFU_WILL_DETACH 0x08U + +/* special commands with download request */ +#define GET_COMMANDS 0x00U +#define SET_ADDRESS_POINTER 0x21U +#define ERASE 0x41U + +/* memory operation command */ +#define CMD_ERASE 0U +#define CMD_WRITE 1U + +#define _BYTE1(x) (uint8_t)((x) & 0xFFU) /*!< addressing cycle 1st byte */ +#define _BYTE2(x) (uint8_t)(((x) & 0xFF00U) >> 8U) /*!< addressing cycle 2nd byte */ +#define _BYTE3(x) (uint8_t)(((x) & 0xFF0000U) >> 16U) /*!< addressing cycle 3rd byte */ + +#define SET_POLLING_TIMEOUT(x) do { \ + dfu->bwPollTimeout0 = _BYTE1(x);\ + dfu->bwPollTimeout1 = _BYTE2(x);\ + dfu->bwPollTimeout2 = _BYTE3(x);\ + } while(0) + +#define FLASH_ERASE_TIMEOUT 60U +#define FLASH_WRITE_TIMEOUT 80U + +/* bit detach capable = bit 3 in bmAttributes field */ +#define DFU_DETACH_MASK (uint8_t)(0x10U) +#define USB_DFU_CONFIG_DESC_SIZE (18U + (9U * USBD_ITF_MAX_NUM)) +#define DFU_DESC_TYPE 0x21U + +/* DFU device state enumeration */ +typedef enum { + STATE_APP_IDLE = 0x00U, + STATE_APP_DETACH, + STATE_DFU_IDLE, + STATE_DFU_DNLOAD_SYNC, + STATE_DFU_DNBUSY, + STATE_DFU_DNLOAD_IDLE, + STATE_DFU_MANIFEST_SYNC, + STATE_DFU_MANIFEST, + STATE_DFU_MANIFEST_WAIT_RESET, + STATE_DFU_UPLOAD_IDLE, + STATE_DFU_ERROR +} dfu_state; + +/* DFU device status enumeration */ +typedef enum { + STATUS_OK = 0x00U, + STATUS_ERR_TARGET, + STATUS_ERR_FILE, + STATUS_ERR_WRITE, + STATUS_ERR_ERASE, + STATUS_ERR_CHECK_ERASED, + STATUS_ERR_PROG, + STATUS_ERR_VERIFY, + STATUS_ERR_ADDRESS, + STATUS_ERR_NOTDONE, + STATUS_ERR_FIRMWARE, + STATUS_ERR_VENDOR, + STATUS_ERR_USBR, + STATUS_ERR_POR, + STATUS_ERR_UNKNOWN, + STATUS_ERR_STALLEDPKT +} dfu_status; + +/* DFU class-specific requests enumeration */ +typedef enum { + DFU_DETACH = 0U, + DFU_DNLOAD, + DFU_UPLOAD, + DFU_GETSTATUS, + DFU_CLRSTATUS, + DFU_GETSTATE, + DFU_ABORT, + DFU_REQ_MAX +} dfu_requests; + +#pragma pack(1) + +/* USB DFU function descriptor struct */ +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bmAttributes; /*!< DFU attributes */ + uint16_t wDetachTimeOut; /*!< time, in milliseconds, that the device will wait after receipt of the DFU_DETACH request. If */ + uint16_t wTransferSize; /*!< maximum number of bytes that the device can accept per control-write transaction */ + uint16_t bcdDFUVersion; /*!< numeric expression identifying the version of the DFU specification release. */ +} usb_desc_dfu_func; + +#pragma pack() + +/* USB configuration descriptor struct */ +typedef struct +{ + usb_desc_config config; + usb_desc_itf dfu_itf; + usb_desc_dfu_func dfu_func; +} usb_dfu_desc_config_set; + +/* USB DFU handler struct */ +typedef struct +{ + uint8_t bStatus; + uint8_t bwPollTimeout0; + uint8_t bwPollTimeout1; + uint8_t bwPollTimeout2; + uint8_t bState; + uint8_t iString; + + uint8_t manifest_state; + uint16_t data_len; + uint16_t block_num; + uint32_t base_addr; + + uint8_t buf[TRANSFER_SIZE]; +} usbd_dfu_handler; + +typedef void (*app_func) (void); + +extern usb_desc dfu_desc; +extern usb_class dfu_class; + +#endif /* __DFU_CORE_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/dfu/Source/dfu_core.c a/Drivers/GD32F30x_usbd_library/class/device/dfu/Source/dfu_core.c new file mode 100644 index 0000000..158f11f --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/dfu/Source/dfu_core.c @@ -0,0 +1,674 @@ +/*! + \file dfu_core.c + \brief USB DFU device class core functions + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "dfu_core.h" +#include "systick.h" + +#include + +#define USBD_VID 0x28E9U +#define USBD_PID 0x0189U + +/* local function prototypes ('static') */ +static uint8_t dfu_init (usb_dev *udev, uint8_t config_index); +static uint8_t dfu_deinit (usb_dev *udev, uint8_t config_index); +static uint8_t dfu_req_handler (usb_dev *udev, usb_req *req); +static uint8_t dfu_ctlx_in (usb_dev *udev); + +/* DFU requests management functions */ +static void dfu_detach (usb_dev *udev, usb_req *req); +static void dfu_dnload (usb_dev *udev, usb_req *req); +static void dfu_upload (usb_dev *udev, usb_req *req); +static void dfu_getstatus (usb_dev *udev, usb_req *req); +static void dfu_clrstatus (usb_dev *udev, usb_req *req); +static void dfu_getstate (usb_dev *udev, usb_req *req); +static void dfu_abort (usb_dev *udev, usb_req *req); +static void dfu_mode_leave (usb_dev *udev); +static uint8_t dfu_getstatus_complete (usb_dev *udev); + +static void (*dfu_request_process[])(usb_dev *udev, usb_req *req) = +{ + [DFU_DETACH] = dfu_detach, + [DFU_DNLOAD] = dfu_dnload, + [DFU_UPLOAD] = dfu_upload, + [DFU_GETSTATUS] = dfu_getstatus, + [DFU_CLRSTATUS] = dfu_clrstatus, + [DFU_GETSTATE] = dfu_getstate, + [DFU_ABORT] = dfu_abort +}; + +/* note:it should use the c99 standard when compiling the below codes */ +/* USB standard device descriptor */ +usb_desc_dev dfu_dev_desc = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USBD_EP0_MAX_SIZE, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +usb_dfu_desc_config_set dfu_config_desc = +{ + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_DFU_CONFIG_DESC_SIZE, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0x80U, + .bMaxPower = 0x32U + }, + + .dfu_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x00U, + .bInterfaceClass = USB_DFU_CLASS, + .bInterfaceSubClass = USB_DFU_SUBCLASS_UPGRADE, + .bInterfaceProtocol = USB_DFU_PROTOCL_DFU, + .iInterface = 0x00U + }, + + .dfu_func = + { + .header = + { + .bLength = sizeof(usb_desc_dfu_func), + .bDescriptorType = DFU_DESC_TYPE + }, + .bmAttributes = USB_DFU_CAN_DOWNLOAD | USB_DFU_CAN_UPLOAD | USB_DFU_WILL_DETACH, + .wDetachTimeOut = 0x00FFU, + .wTransferSize = TRANSFER_SIZE, + .bcdDFUVersion = 0x011AU, + }, +}; + +/* USB language ID descriptor */ +static usb_desc_LANGID usbd_language_id_desc = +{ + .header = { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static usb_desc_str manufacturer_string = +{ + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static usb_desc_str product_string = +{ + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'D', 'F', 'U'} +}; + +/* USBD serial string */ +static usb_desc_str serial_string = +{ + .header = + { + .bLength = USB_STRING_LEN(2U), + .bDescriptorType = USB_DESCTYPE_STR, + } +}; + +/* USB config string */ +static usb_desc_str config_string = +{ + .header = + { + .bLength = USB_STRING_LEN(15U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'D', '3', '2', ' ', 'U', 'S', 'B', ' ', 'C', 'O', 'N', 'F', 'I', 'G'} +}; + +static usb_desc_str interface_string = +{ + .header = + { + .bLength = USB_STRING_LEN(15U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'@', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'F', 'l', 'a', 's', 'h', ' ', '/', '0', 'x', '0', '8', '0', '0', + '0', '0', '0', '0', '/', '1', '6', '*', '0', '0', '1', 'K', 'a', ',', '4', '8', '*', '0', '0', '1', 'K', 'g'} +}; + +uint8_t* usbd_dfu_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string, + [STR_IDX_CONFIG] = (uint8_t *)&config_string, + [STR_IDX_ITF] = (uint8_t *)&interface_string +}; + +usb_desc dfu_desc = { + .dev_desc = (uint8_t *)&dfu_dev_desc, + .config_desc = (uint8_t *)&dfu_config_desc, + .strings = usbd_dfu_strings +}; + +usb_class dfu_class = { + .init = dfu_init, + .deinit = dfu_deinit, + .req_process = dfu_req_handler, + .ctlx_in = dfu_ctlx_in +}; + +/*! + \brief initialize the USB DFU device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t dfu_init (usb_dev *udev, uint8_t config_index) +{ + static usbd_dfu_handler dfu_handler; + + /* unlock the internal flash */ + fmc_unlock(); + + systick_config(); + + memset((void *)&dfu_handler, 0, sizeof(usbd_dfu_handler)); + + dfu_handler.base_addr = APP_LOADED_ADDR; + dfu_handler.manifest_state = MANIFEST_COMPLETE; + dfu_handler.bState = STATE_DFU_IDLE; + dfu_handler.bStatus = STATUS_OK; + + udev->class_data[USBD_DFU_INTERFACE] = (void *)&dfu_handler; + + return USBD_OK; +} + +/*! + \brief de-initialize the USB DFU device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t dfu_deinit (usb_dev *udev, uint8_t config_index) +{ + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->class_data[USBD_DFU_INTERFACE]; + + /* restore device default state */ + memset(udev->class_data[USBD_DFU_INTERFACE], 0, sizeof(usbd_dfu_handler)); + + dfu->bState = STATE_DFU_IDLE; + dfu->bStatus = STATUS_OK; + + /* lock the internal flash */ + fmc_lock(); + + return USBD_OK; +} + +/*! + \brief handle the USB DFU class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t dfu_req_handler (usb_dev *udev, usb_req *req) +{ + if (req->bRequest < DFU_REQ_MAX) { + dfu_request_process[req->bRequest](udev, req); + } else { + return USBD_FAIL; + } + + return USBD_OK; +} + +/*! + \brief handle data stage + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t dfu_ctlx_in (usb_dev *udev) +{ + dfu_getstatus_complete(udev); + + return USBD_OK; +} + +/*! + \brief handle data in stage in control endpoint 0 + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation status + */ +static uint8_t dfu_getstatus_complete (usb_dev *udev) +{ + uint32_t addr; + + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->class_data[USBD_DFU_INTERFACE]; + + if (STATE_DFU_DNBUSY == dfu->bState) { + /* decode the special command */ + if (0U == dfu->block_num) { + if (1U == dfu->data_len){ + if (GET_COMMANDS == dfu->buf[0]) { + /* no operation */ + } + } else if (5U == dfu->data_len) { + if (SET_ADDRESS_POINTER == dfu->buf[0]) { + /* set flash operation address */ + dfu->base_addr = *(uint32_t *)(dfu->buf + 1U); + } else if (ERASE == dfu->buf[0]) { + dfu->base_addr = *(uint32_t *)(dfu->buf + 1U); + + fmc_page_erase(dfu->base_addr); + } else { + /* no operation */ + } + } else { + /* no operation */ + } + } else if (dfu->block_num > 1U) { /* regular download command */ + /* preform the write operation */ + uint32_t idx = 0U; + + /* decode the required address */ + addr = (dfu->block_num - 2U) * TRANSFER_SIZE + dfu->base_addr; + + if (dfu->data_len & 0x03U) { /* not an aligned data */ + for (idx = dfu->data_len; idx < ((dfu->data_len & 0xFFFCU) + 4U); idx++) { + dfu->buf[idx] = 0xFFU; + } + } + + /* data received are word multiple */ + for (idx = 0U; idx < dfu->data_len; idx += 4U) { + fmc_word_program(addr, *(uint32_t *)(dfu->buf + idx)); + + addr += 4U; + } + + dfu->block_num = 0U; + } else { + /* no operation */ + } + + dfu->data_len = 0U; + + /* update the device state and poll timeout */ + dfu->bState = STATE_DFU_DNLOAD_SYNC; + + return USBD_OK; + } else if (STATE_DFU_MANIFEST == dfu->bState) { /* manifestation in progress */ + /* start leaving DFU mode */ + dfu_mode_leave(udev); + } else { + /* no operation */ + } + + return USBD_OK; +} + +/*! + \brief handle the DFU_DETACH request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none. +*/ +static void dfu_detach(usb_dev *udev, usb_req *req) +{ + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->class_data[USBD_DFU_INTERFACE]; + + switch (dfu->bState) { + case STATE_DFU_IDLE: + case STATE_DFU_DNLOAD_SYNC: + case STATE_DFU_DNLOAD_IDLE: + case STATE_DFU_MANIFEST_SYNC: + case STATE_DFU_UPLOAD_IDLE: + dfu->bStatus = STATUS_OK; + dfu->bState = STATE_DFU_IDLE; + dfu->iString = 0U; /* iString */ + + dfu->block_num = 0U; + dfu->data_len = 0U; + break; + + default: + break; + } + + /* check the detach capability in the DFU functional descriptor */ + if (dfu_config_desc.dfu_func.wDetachTimeOut & DFU_DETACH_MASK) { + usbd_disconnect(udev); + + usbd_connect(udev); + } else { + /* wait for the period of time specified in detach request */ + delay_1ms(4U); + } +} + +/*! + \brief handle the DFU_DNLOAD request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_dnload(usb_dev *udev, usb_req *req) +{ + usb_transc *transc = &udev->transc_out[0]; + + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->class_data[USBD_DFU_INTERFACE]; + + switch (dfu->bState) { + case STATE_DFU_IDLE: + case STATE_DFU_DNLOAD_IDLE: + if (req->wLength > 0U) { + /* update the global length and block number */ + dfu->block_num = req->wValue; + dfu->data_len = req->wLength; + + dfu->bState = STATE_DFU_DNLOAD_SYNC; + + transc->xfer_len = dfu->data_len; + transc->xfer_buf = dfu->buf; + transc->xfer_count = 0U; + } else { + dfu->manifest_state = MANIFEST_IN_PROGRESS; + dfu->bState = STATE_DFU_MANIFEST_SYNC; + } + break; + + default: + break; + } +} + +/*! + \brief handles the DFU UPLOAD request. + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_upload (usb_dev *udev, usb_req *req) +{ + uint8_t *phy_addr = NULL; + uint32_t addr = 0U; + + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->class_data[USBD_DFU_INTERFACE]; + + if(req->wLength <= 0U) { + dfu->bState = STATE_DFU_IDLE; + + return; + } + + usb_transc *transc = &udev->transc_in[0]; + + switch (dfu->bState) { + case STATE_DFU_IDLE: + case STATE_DFU_UPLOAD_IDLE: + /* update the global length and block number */ + dfu->block_num = req->wValue; + dfu->data_len = req->wLength; + + /* DFU get command */ + if (0U == dfu->block_num) { + /* update the state machine */ + dfu->bState = (dfu->data_len > 3U) ? STATE_DFU_IDLE : STATE_DFU_UPLOAD_IDLE; + + /* store the values of all supported commands */ + dfu->buf[0] = GET_COMMANDS; + dfu->buf[1] = SET_ADDRESS_POINTER; + dfu->buf[2] = ERASE; + + /* send the status data over EP0 */ + transc->xfer_buf = &(dfu->buf[0]); + transc->xfer_len = 3U; + } else if (dfu->block_num > 1U) { + dfu->bState = STATE_DFU_UPLOAD_IDLE; + + /* change is accelerated */ + addr = (dfu->block_num - 2U) * TRANSFER_SIZE + dfu->base_addr; + + /* return the physical address where data are stored */ + phy_addr = (uint8_t *)(addr); + + /* send the status data over EP0 */ + transc->xfer_buf = phy_addr; + transc->xfer_len = dfu->data_len; + } else { + dfu->bState = STATUS_ERR_STALLEDPKT; + } + break; + + default: + dfu->data_len = 0U; + dfu->block_num = 0U; + break; + } +} + +/*! + \brief handle the DFU_GETSTATUS request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_getstatus (usb_dev *udev, usb_req *req) +{ + usb_transc *transc = &udev->transc_in[0]; + + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->class_data[USBD_DFU_INTERFACE]; + + switch (dfu->bState) { + case STATE_DFU_DNLOAD_SYNC: + if (0U != dfu->data_len) { + dfu->bState = STATE_DFU_DNBUSY; + + if (0U == dfu->block_num) { + if (ERASE == dfu->buf[0]) { + SET_POLLING_TIMEOUT(FLASH_ERASE_TIMEOUT); + } else { + SET_POLLING_TIMEOUT(FLASH_WRITE_TIMEOUT); + } + } + } else { + dfu->bState = STATE_DFU_DNLOAD_IDLE; + } + break; + + case STATE_DFU_MANIFEST_SYNC: + if (MANIFEST_IN_PROGRESS == dfu->manifest_state) { + dfu->bState = STATE_DFU_MANIFEST; + dfu->bwPollTimeout0 = 1U; + } else if ((MANIFEST_COMPLETE == dfu->manifest_state) && \ + (dfu_config_desc.dfu_func.bmAttributes & 0x04U)){ + dfu->bState = STATE_DFU_IDLE; + dfu->bwPollTimeout0 = 0U; + } else { + /* no operation */ + } + break; + + default: + break; + } + + /* send the status data of DFU interface to host over EP0 */ + transc->xfer_buf = (uint8_t *)&(dfu->bStatus); + transc->xfer_len = 6U; +} + +/*! + \brief handle the DFU_CLRSTATUS request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_clrstatus (usb_dev *udev, usb_req *req) +{ + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->class_data[USBD_DFU_INTERFACE]; + + if (STATE_DFU_ERROR == dfu->bState) { + dfu->bStatus = STATUS_OK; + dfu->bState = STATE_DFU_IDLE; + } else { + /* state error */ + dfu->bStatus = STATUS_ERR_UNKNOWN; + dfu->bState = STATE_DFU_ERROR; + } + + dfu->iString = 0U; /* iString: index = 0 */ +} + +/*! + \brief handle the DFU_GETSTATE request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_getstate (usb_dev *udev, usb_req *req) +{ + usb_transc *transc = &udev->transc_in[0]; + + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->class_data[USBD_DFU_INTERFACE]; + + /* send the current state of the DFU interface to host */ + transc->xfer_buf = &(dfu->bState); + transc->xfer_len = 1U; +} + +/*! + \brief handle the DFU_ABORT request + \param[in] udev: pointer to USB device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void dfu_abort (usb_dev *udev, usb_req *req) +{ + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->class_data[USBD_DFU_INTERFACE]; + + switch (dfu->bState){ + case STATE_DFU_IDLE: + case STATE_DFU_DNLOAD_SYNC: + case STATE_DFU_DNLOAD_IDLE: + case STATE_DFU_MANIFEST_SYNC: + case STATE_DFU_UPLOAD_IDLE: + dfu->bStatus = STATUS_OK; + dfu->bState = STATE_DFU_IDLE; + dfu->iString = 0U; /* iString: index = 0 */ + + dfu->block_num = 0U; + dfu->data_len = 0U; + break; + + default: + break; + } +} + +/*! + \brief leave DFU mode and reset device to jump to user loaded code + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void dfu_mode_leave (usb_dev *udev) +{ + usbd_dfu_handler *dfu = (usbd_dfu_handler *)udev->class_data[USBD_DFU_INTERFACE]; + + dfu->manifest_state = MANIFEST_COMPLETE; + + if (dfu_config_desc.dfu_func.bmAttributes & 0x04U) { + dfu->bState = STATE_DFU_MANIFEST_SYNC; + } else { + dfu->bState = STATE_DFU_MANIFEST_WAIT_RESET; + + /* lock the internal flash */ + fmc_lock(); + + /* generate system reset to allow jumping to the user code */ + NVIC_SystemReset(); + } +} diff --git b/Drivers/GD32F30x_usbd_library/class/device/hid/Include/custom_hid_core.h a/Drivers/GD32F30x_usbd_library/class/device/hid/Include/custom_hid_core.h new file mode 100644 index 0000000..7e0b335 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/hid/Include/custom_hid_core.h @@ -0,0 +1,67 @@ +/*! + \file custom_hid_core.h + \brief definitions for HID core + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __CUSTOM_HID_CORE_H +#define __CUSTOM_HID_CORE_H + +#include "usbd_enum.h" +#include "usb_hid.h" + +#define DESC_LEN_REPORT 32U//96U +#define DESC_LEN_CONFIG 41U + +#define MAX_PERIPH_NUM 4U + +typedef struct { + uint8_t data[64];//[2]; + + uint8_t reportID; + uint8_t idlestate; + uint8_t protocol; +} custom_hid_handler; + +typedef struct { + void (*periph_config[MAX_PERIPH_NUM])(void); +} hid_fop_handler; + +extern usb_desc custom_hid_desc; +extern usb_class custom_hid_class; + +/* function declarations */ +/* register HID interface operation functions */ +uint8_t custom_hid_itfop_register (usb_dev *udev, hid_fop_handler *hid_fop); +/* send custom HID report */ +uint8_t custom_hid_report_send (usb_dev *udev, uint8_t *report, uint16_t len); + +#endif /* __CUSTOM_HID_CORE_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/hid/Include/standard_hid_core.h a/Drivers/GD32F30x_usbd_library/class/device/hid/Include/standard_hid_core.h new file mode 100644 index 0000000..a409127 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/hid/Include/standard_hid_core.h @@ -0,0 +1,66 @@ +/*! + \file standard_hid_core.h + \brief definitions for HID core + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __STANDARD_HID_CORE_H +#define __STANDARD_HID_CORE_H + +#include "usbd_enum.h" +#include "usb_hid.h" + +#define USB_HID_CONFIG_DESC_LEN 0x22U +#define USB_HID_REPORT_DESC_LEN 0x2EU + +typedef struct { + uint32_t protocol; + uint32_t idle_state; + + uint8_t data[HID_IN_PACKET]; + __IO uint8_t prev_transfer_complete; +} standard_hid_handler; + +typedef struct { + void (*hid_itf_config) (void); + void (*hid_itf_data_process) (usb_dev *udev); +} hid_fop_handler; + +extern usb_desc hid_desc; +extern usb_class hid_class; + +/* function declarations */ +/* register HID interface operation functions */ +uint8_t hid_itfop_register (usb_dev *udev, hid_fop_handler *hid_fop); +/* send HID report */ +uint8_t hid_report_send (usb_dev *udev, uint8_t *report, uint16_t len); + +#endif /* __STANDARD_HID_CORE_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/hid/Include/std_hid_mouse_core.h a/Drivers/GD32F30x_usbd_library/class/device/hid/Include/std_hid_mouse_core.h new file mode 100644 index 0000000..895645d --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/hid/Include/std_hid_mouse_core.h @@ -0,0 +1,69 @@ +/*! + \file std_hid_mouse_core.h + \brief definitions for HID mouse core + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __STD_HID_MOUSE_CORE_H +#define __STD_HID_MOUSE_CORE_H + +#include "usbd_enum.h" +#include "usb_hid.h" + +#define USB_HID_CONFIG_DESC_LEN 0x22U +#define USB_HID_REPORT_DESC_LEN 0x34U + +#define MOUSE_LEFT_BUTTON 0x01U +#define MOUSE_RIGHT_BUTTON 0x02U + +typedef struct { + uint32_t protocol; + uint32_t idle_state; + + uint8_t data[HID_IN_PACKET]; + __IO uint8_t prev_transfer_complete; +} standard_mice_handler; + +typedef struct { + void (*mice_itf_config) (void); + void (*mice_itf_data_process) (usb_dev *udev); +} mice_fop_handler; + +extern usb_desc hid_mouse_desc; +extern usb_class hid_class; + +/* function declarations */ +/* register HID interface operation functions */ +uint8_t hid_itfop_register (usb_dev *udev, mice_fop_handler *hid_fop); +/* send mouse report */ +uint8_t hid_report_send (usb_dev *udev, uint8_t *report, uint16_t len); + +#endif /* __STD_HID_MOUSE_CORE_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/hid/Include/usb_hid.h a/Drivers/GD32F30x_usbd_library/class/device/hid/Include/usb_hid.h new file mode 100644 index 0000000..1bc77d1 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/hid/Include/usb_hid.h @@ -0,0 +1,83 @@ +/*! + \file usb_hid.h + \brief definitions for the USB HID class + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_HID_H +#define __USB_HID_H + +#include "usb_ch9_std.h" + +#define USB_HID_CLASS 0x03U + +#define USB_DESCTYPE_HID 0x21U +#define USB_DESCTYPE_REPORT 0x22U + +/* HID subclass code */ +#define USB_HID_SUBCLASS_BOOT_ITF 0x01U + +/* HID protocol codes */ +#define USB_HID_PROTOCOL_KEYBOARD 0x01U +#define USB_HID_PROTOCOL_MOUSE 0x02U + +#define GET_REPORT 0x01U +#define GET_IDLE 0x02U +#define GET_PROTOCOL 0x03U +#define SET_REPORT 0x09U +#define SET_IDLE 0x0AU +#define SET_PROTOCOL 0x0BU + +#pragma pack(1) + +typedef struct +{ + usb_desc_header header; /*!< regular descriptor header containing the descriptor's type and length */ + + uint16_t bcdHID; /*!< BCD encoded version that the HID descriptor and device complies to */ + uint8_t bCountryCode; /*!< country code of the localized device, or zero if universal */ + uint8_t bNumDescriptors; /*!< total number of HID report descriptors for the interface */ + uint8_t bDescriptorType; /*!< type of HID report */ + uint16_t wDescriptorLength; /*!< length of the associated HID report descriptor, in bytes */ +} usb_desc_hid; + +#pragma pack() + +typedef struct +{ + usb_desc_config config; + usb_desc_itf hid_itf; + usb_desc_hid hid_vendor; + usb_desc_ep hid_epin; + usb_desc_ep hid_epout; +} usb_hid_desc_config_set; + +#endif /* __USB_HID_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/hid/Source/custom_hid_core.c a/Drivers/GD32F30x_usbd_library/class/device/hid/Source/custom_hid_core.c new file mode 100644 index 0000000..2cd2ee2 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/hid/Source/custom_hid_core.c @@ -0,0 +1,552 @@ +/*! + \file custom_hid_core.c + \brief custom HID class driver + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-06-22, V3.0.1, firmware for GD32F30x + \version 2021-11-09, V3.0.2, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_transc.h" +#include "custom_hid_core.h" +#include + +#define USBD_VID 0x2F70//0x28E9U +#define USBD_PID 0xEA10//0x128AU + +/* Note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +usb_desc_dev custom_hid_dev_desc = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, //0x12 + .bDescriptorType = USB_DESCTYPE_DEV, //0x01 + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USBD_EP0_MAX_SIZE,//64 + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0200,//0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM, +}; + +usb_hid_desc_config_set custom_hid_config_desc = +{ + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), //0x09 + .bDescriptorType = USB_DESCTYPE_CONFIG //0x02 + }, + .wTotalLength = DESC_LEN_CONFIG, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xC0U,//0x80U, + .bMaxPower = 0x32U + }, + + .hid_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), //0x09 + .bDescriptorType = USB_DESCTYPE_ITF //0x04 + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_HID_CLASS, //0x03 + .bInterfaceSubClass = 0x00U, + .bInterfaceProtocol = 0x00U, + .iInterface = 0x00U + }, + + .hid_vendor = + { + .header = + { + .bLength = sizeof(usb_desc_hid), //0x09 + .bDescriptorType = USB_DESCTYPE_HID //0x21 + }, + .bcdHID = 0x0111U, + .bCountryCode = 0x00U, + .bNumDescriptors = 0x01U, + .bDescriptorType = USB_DESCTYPE_REPORT, + .wDescriptorLength = DESC_LEN_REPORT, + }, + + .hid_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), //0x07 + .bDescriptorType = USB_DESCTYPE_EP //0x05 + }, + .bEndpointAddress = CUSTOMHID_IN_EP, //0x81 + .bmAttributes = USB_EP_ATTR_INT, //0x03 + .wMaxPacketSize = CUSTOMHID_IN_PACKET, //64 + .bInterval = 0x01U//0x20U + }, + + .hid_epout = + { + .header = + { + .bLength = sizeof(usb_desc_ep), //0x07 + .bDescriptorType = USB_DESCTYPE_EP //0x05 + }, + .bEndpointAddress = CUSTOMHID_OUT_EP, //0x01 + .bmAttributes = USB_EP_ATTR_INT, //0x03 + .wMaxPacketSize = CUSTOMHID_OUT_PACKET, //64 + .bInterval = 0x01U//0x20U + } +}; + +/* USB language ID descriptor */ +static usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static usb_desc_str manufacturer_string = +{ + .header = + { + .bLength = USB_STRING_LEN(7U),//(10U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'S', 'U', 'N', 'V', 'O', 'T', 'E'}//, ' ', ' ', ' '} +}; + +/* USB product string */ +static usb_desc_str product_string = +{ + .header = + { + .bLength = USB_STRING_LEN(5U),//(14U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'C', '1', '0', '0', 'B'}//, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '} +}; + +/* USBD serial string */ +static usb_desc_str serial_string = +{ + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR, + } +}; + +/* USB string descriptor set */ +uint8_t* usbd_hid_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc custom_hid_desc = { + .dev_desc = (uint8_t *)&custom_hid_dev_desc, + .config_desc = (uint8_t *)&custom_hid_config_desc, + .strings = usbd_hid_strings +}; + +/* local function prototypes ('static') */ +static uint8_t custom_hid_init (usb_dev *udev, uint8_t config_index); +static uint8_t custom_hid_deinit (usb_dev *udev, uint8_t config_index); +static uint8_t custom_hid_req_handler (usb_dev *udev, usb_req *req); +static void custom_hid_data_in (usb_dev *udev, uint8_t ep_num); +static void custom_hid_data_out (usb_dev *udev, uint8_t ep_num); + +usb_class custom_hid_class = { + .req_cmd = 0xFFU, + + .init = custom_hid_init, + .deinit = custom_hid_deinit, + .req_process = custom_hid_req_handler, + .data_in = custom_hid_data_in, + .data_out = custom_hid_data_out +}; + +const uint8_t customhid_report_descriptor[DESC_LEN_REPORT] = +{ +// 0x06, 0x00, 0xFF, /* USAGE_PAGE (Vendor Defined: 0xFF00) */ +// 0x09, 0x00, /* USAGE (Custom Device) */ +// 0xa1, 0x01, /* COLLECTION (Application) */ + +// /* led 1 */ +// 0x85, 0x11, /* REPORT_ID (0x11) */ +// 0x09, 0x01, /* USAGE (LED 1) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x08, /* REPORT_SIZE (8) */ +// 0x95, 0x01, /* REPORT_COUNT (1) */ +// 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ + +// /* led 2 */ +// 0x85, 0x12, /* REPORT_ID (0x12) */ +// 0x09, 0x02, /* USAGE (LED 2) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x08, /* REPORT_SIZE (8) */ +// 0x95, 0x01, /* REPORT_COUNT (1) */ +// 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ + +// /* led 3 */ +// 0x85, 0x13, /* REPORT_ID (0x13) */ +// 0x09, 0x03, /* USAGE (LED 3) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x08, /* REPORT_SIZE (8) */ +// 0x95, 0x01, /* REPORT_COUNT (1) */ +// 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ + +// /* led 4 */ +// 0x85, 0x14, /* REPORT_ID (0x14) */ +// 0x09, 0x04, /* USAGE (LED 4) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x08, /* REPORT_SIZE (8) */ +// 0x95, 0x01, /* REPORT_COUNT (1) */ +// 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ + +// /* wakeup key */ +// 0x85, 0x15, /* REPORT_ID (0x15) */ +// 0x09, 0x05, /* USAGE (Push Button) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x01, /* REPORT_SIZE (1) */ +// 0x81, 0x02, /* INPUT (Data,Var,Abs,Vol) */ + +// 0x75, 0x07, /* REPORT_SIZE (7) */ +// 0x81, 0x03, /* INPUT (Cnst,Var,Abs,Vol) */ + +// /* tamper key */ +// 0x85, 0x16, /* REPORT_ID (0x16) */ +// 0x09, 0x06, /* USAGE (Push Button) */ +// 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ +// 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ +// 0x75, 0x01, /* REPORT_SIZE (1) */ +// 0x81, 0x02, /* INPUT (Data,Var,Abs,Vol) */ + +// 0x75, 0x07, /* REPORT_SIZE (7) */ +// 0x81, 0x03, /* INPUT (Cnst,Var,Abs,Vol) */ + +// 0xc0 /* END_COLLECTION */ + + 0x06, 0xFF, 0xFF, + // Collection: Application + 0x09, 0xFF, + 0xA1, 0x01, + // Input report: Vendor-defined + 0x09, 0xFF, + 0x95, 64, + 0x75, 8, + 0x15, ( unsigned char ) - 128, + 0x25, ( unsigned char ) 127, + 0x81, 0, + + // Output report: vendor-defined + 0x09, 0xFF, + 0x95, 64, + 0x75, 8, + 0x15, ( unsigned char ) - 128, + 0x25, ( unsigned char ) 127, + 0x91, 0, + 0xC0 /* END_COLLECTION */ +}; + +/*! + \brief register HID interface operation functions + \param[in] udev: pointer to USB device instance + \param[in] hid_fop: HID operation functions structure + \param[out] none + \retval USB device operation status +*/ +uint8_t custom_hid_itfop_register (usb_dev *udev, hid_fop_handler *hid_fop) +{ + if (NULL != hid_fop) { + udev->user_data = hid_fop; + + return USBD_OK; + } + + return USBD_FAIL; +} + +/*! + \brief send custom HID report + \param[in] udev: pointer to USB device instance + \param[in] report: pointer to HID report + \param[in] len: data length + \param[out] none + \retval USB device operation status +*/ +uint8_t custom_hid_report_send (usb_dev *udev, uint8_t *report, uint16_t len) +{ + usbd_ep_send (udev, CUSTOMHID_IN_EP, report, len); + + return USBD_OK; +} + +/*! + \brief initialize the HID device + \param[in] pudev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t custom_hid_init (usb_dev *udev, uint8_t config_index) +{ + static custom_hid_handler hid_handler; + + memset((void *)&hid_handler, 0, sizeof(custom_hid_handler)); + + /* initialize the data endpoints */ + usbd_ep_init(udev, EP_BUF_SNG, HID_TX_ADDR, &(custom_hid_config_desc.hid_epin)); + usbd_ep_init(udev, EP_BUF_SNG, HID_RX_ADDR, &(custom_hid_config_desc.hid_epout)); + + usbd_ep_recev (udev, CUSTOMHID_OUT_EP, hid_handler.data, 64U);//2U); + + udev->ep_transc[EP_ID(CUSTOMHID_IN_EP)][TRANSC_IN] = custom_hid_class.data_in; + udev->ep_transc[EP_ID(CUSTOMHID_OUT_EP)][TRANSC_OUT] = custom_hid_class.data_out; + + udev->class_data[CUSTOM_HID_INTERFACE] = (void *)&hid_handler; + + if (udev->user_data != NULL) { + for (uint8_t i = 0U; i < MAX_PERIPH_NUM; i++) { + if (((hid_fop_handler *)udev->user_data)->periph_config[i] != NULL) { + ((hid_fop_handler *)udev->user_data)->periph_config[i](); + } + } + } + + return USBD_OK; +} + +/*! + \brief de-initialize the HID device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t custom_hid_deinit (usb_dev *udev, uint8_t config_index) +{ + /* deinitialize HID endpoints */ + usbd_ep_deinit(udev, CUSTOMHID_IN_EP); + usbd_ep_deinit(udev, CUSTOMHID_OUT_EP); + + return USBD_OK; +} + +/*! + \brief handle the HID class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t custom_hid_req_handler (usb_dev *udev, usb_req *req) +{ + uint8_t status = REQ_NOTSUPP; + + custom_hid_handler *hid = (custom_hid_handler *)udev->class_data[CUSTOM_HID_INTERFACE]; + + switch (req->bRequest) { + case USB_GET_DESCRIPTOR: + if (USB_DESCTYPE_REPORT == (req->wValue >> 8)) { + usb_transc_config(&udev->transc_in[0], + (uint8_t *)customhid_report_descriptor, + USB_MIN(DESC_LEN_REPORT, req->wLength), + 0U); + + status = REQ_SUPP; + } else if (USB_DESCTYPE_HID == (req->wValue >> 8U)) { + usb_transc_config(&udev->transc_in[0U], + (uint8_t *)(&(custom_hid_config_desc.hid_vendor)), + USB_MIN(9U, req->wLength), + 0U); + } + break; + + case GET_REPORT: + if (2U == req->wLength) { + usb_transc_config(&udev->transc_in[0], hid->data, 2U, 0U); + + status = REQ_SUPP; + } + break; + + case GET_IDLE: + usb_transc_config(&udev->transc_in[0], (uint8_t *)&hid->idlestate, 1U, 0U); + + status = REQ_SUPP; + break; + + case GET_PROTOCOL: + usb_transc_config(&udev->transc_in[0], (uint8_t *)&hid->protocol, 1U, 0U); + + status = REQ_SUPP; + break; + + case SET_REPORT: + hid->reportID = (uint8_t)(req->wValue); + + usb_transc_config(&udev->transc_out[0], hid->data, req->wLength, 0U); + + status = REQ_SUPP; + break; + + case SET_IDLE: + hid->idlestate = (uint8_t)(req->wValue >> 8); + + status = REQ_SUPP; + break; + + case SET_PROTOCOL: + hid->protocol = (uint8_t)(req->wValue); + + status = REQ_SUPP; + break; + + default: + break; + } + + return status; +} + +/*! + \brief handle custom HID data in transaction + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +static void custom_hid_data_in (usb_dev *udev, uint8_t ep_num) +{ + return; +} + +/*! + \brief handle custom HID data out transaction + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +static void custom_hid_data_out (usb_dev *udev, uint8_t ep_num) +{ + custom_hid_handler *hid = (custom_hid_handler *)udev->class_data[CUSTOM_HID_INTERFACE]; + + if (CUSTOMHID_OUT_EP == ep_num){ + +// switch (hid->data[0]){ +// case 0x11: +// if (RESET != hid->data[1]) { +// /* turn on led1 */ +// gd_eval_led_on(LED5); +// } else { +// gd_eval_led_off(LED5); +// } +// break; +// case 0x12: +// if (RESET != hid->data[1]) { +// gd_eval_led_on(LED2); +// } else { +// gd_eval_led_off(LED2); +// } +// break; +// case 0x13: +// if (RESET != hid->data[1]) { +// gd_eval_led_on(LED3); +// } else { +// gd_eval_led_off(LED3); +// } +// break; +// case 0x14: +// if (RESET != hid->data[1]) { +// gd_eval_led_on(LED4); +// } else { +// gd_eval_led_off(LED4); +// } +// break; +// default: +// /* turn off all leds */ +// gd_eval_led_off(LED5); +// gd_eval_led_off(LED2); +// gd_eval_led_off(LED3); +// gd_eval_led_off(LED4); +// break; +// } + + #include "base_core_user.h" + +// USBD_CUSTOM_HID_HandleTypeDef *hhid; +// hhid = (USBD_CUSTOM_HID_HandleTypeDef*)hUsbDeviceFS.pClassData;//??USB????????? + + if( (hid->data[0]!=0xf5) ||(hid->data[1]!=0xaa)||(hid->data[2]!=0xaa) ) { + + //----------------------------------- + //this is base core debug enter ; + void core_debug_enter(unsigned char *pc); + core_debug_enter(hid->data); + //------------------------------------ + + //return (USBD_OK); + } + void set_pc_communication_type(unsigned char type); + set_pc_communication_type(0); + base_core.sdk_data_fifo_in(hid->data + 3); + +// return (USBD_OK); + + usbd_ep_recev(udev, CUSTOMHID_OUT_EP, hid->data, 64U); + } +} diff --git b/Drivers/GD32F30x_usbd_library/class/device/hid/Source/standard_hid_core.c a/Drivers/GD32F30x_usbd_library/class/device/hid/Source/standard_hid_core.c new file mode 100644 index 0000000..1f5550b --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/hid/Source/standard_hid_core.c @@ -0,0 +1,427 @@ +/*! + \file standard_hid_core.c + \brief HID class driver + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_transc.h" +#include "standard_hid_core.h" + +#include + +#define USBD_VID 0x28E9U +#define USBD_PID 0x0380U + +/* Note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +usb_desc_dev hid_dev_desc = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, +#ifdef LPM_ENABLED + .bcdUSB = 0x0201U, +#else + .bcdUSB = 0x0200U, +#endif /* LPM_ENABLED */ + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USBD_EP0_MAX_SIZE, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +#ifdef LPM_ENABLED + +/* BOS descriptor */ +uint8_t USBD_BOSDesc[USB_BOS_DESC_LEN] = +{ + 0x05, + USB_DESCTYPE_BOS, + 0x0C, + 0x00, + 0x01, /* 1 device capability descriptor */ + + /* device capability*/ + 0x07, + USB_DEVICE_CAPABITY, + 0x02, + 0x06, /* LPM capability bit set */ + 0x00, + 0x00, + 0x00 +}; + +#endif /* LPM_ENABLED */ + +usb_hid_desc_config_set hid_config_desc = +{ + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_HID_CONFIG_DESC_LEN, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xA0U, + .bMaxPower = 0x32U + }, + + .hid_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x01U, + .bInterfaceClass = USB_HID_CLASS, + .bInterfaceSubClass = USB_HID_SUBCLASS_BOOT_ITF, + .bInterfaceProtocol = USB_HID_PROTOCOL_KEYBOARD, + .iInterface = 0x00U + }, + + .hid_vendor = + { + .header = + { + .bLength = sizeof(usb_desc_hid), + .bDescriptorType = USB_DESCTYPE_HID + }, + .bcdHID = 0x0111U, + .bCountryCode = 0x00U, + .bNumDescriptors = 0x01U, + .bDescriptorType = USB_DESCTYPE_REPORT, + .wDescriptorLength = USB_HID_REPORT_DESC_LEN, + }, + + .hid_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = HID_IN_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = HID_IN_PACKET, + .bInterval = 0x40U + } +}; + +/* USB language ID Descriptor */ +static usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static usb_desc_str manufacturer_string = +{ + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static usb_desc_str product_string = +{ + .header = + { + .bLength = USB_STRING_LEN(17U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'K', 'e', 'y', 'b', 'o', 'a', 'r', 'd'} +}; + +/* USBD serial string */ +static usb_desc_str serial_string = +{ + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR, + } +}; + +uint8_t* usbd_hid_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc hid_desc = { +#ifdef LPM_ENABLED + .bos_desc = (uint8_t *)&USBD_BOSDesc, +#endif /* LPM_ENABLED */ + .dev_desc = (uint8_t *)&hid_dev_desc, + .config_desc = (uint8_t *)&hid_config_desc, + .strings = usbd_hid_strings +}; + +/* local function prototypes ('static') */ +static uint8_t hid_init (usb_dev *udev, uint8_t config_index); +static uint8_t hid_deinit (usb_dev *udev, uint8_t config_index); +static uint8_t hid_req_handler (usb_dev *udev, usb_req *req); +static void hid_data_in_handler (usb_dev *udev, uint8_t ep_num); + +usb_class hid_class = { + .init = hid_init, + .deinit = hid_deinit, + .req_process = hid_req_handler, + .data_in = hid_data_in_handler +}; + +const uint8_t hid_report_desc[USB_HID_REPORT_DESC_LEN] = +{ + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x06, /* USAGE (Keyboard) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + + 0x05, 0x07, /* USAGE_PAGE (Keyboard/Keypad) */ + 0x19, 0xe0, /* USAGE_MINIMUM (Keyboard LeftControl) */ + 0x29, 0xe7, /* USAGE_MAXIMUM (Keyboard Right GUI) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x95, 0x08, /* REPORT_COUNT (8) */ + 0x75, 0x01, /* REPORT_SIZE (1) */ + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ + + 0x95, 0x01, /* REPORT_COUNT (1) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x81, 0x03, /* INPUT (Cnst,Var,Abs) */ + + 0x95, 0x06, /* REPORT_COUNT (6) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x26, 0xFF, 0x00, /* LOGICAL_MAXIMUM (255) */ + 0x05, 0x07, /* USAGE_PAGE (Keyboard/Keypad) */ + 0x19, 0x00, /* USAGE_MINIMUM (Reserved (no event indicated)) */ + 0x29, 0x65, /* USAGE_MAXIMUM (Keyboard Application) */ + 0x81, 0x00, /* INPUT (Data,Ary,Abs) */ + + 0xc0 /* END_COLLECTION */ +}; + +/*! + \brief register HID interface operation functions + \param[in] udev: pointer to USB device instance + \param[in] hid_fop: HID operation functions structure + \param[out] none + \retval USB device operation status +*/ +uint8_t hid_itfop_register (usb_dev *udev, hid_fop_handler *hid_fop) +{ + if (NULL != hid_fop) { + udev->user_data = (void *)hid_fop; + + return USBD_OK; + } + + return USBD_FAIL; +} + +/*! + \brief send keyboard report + \param[in] udev: pointer to USB device instance + \param[in] report: pointer to HID report + \param[in] len: data length + \param[out] none + \retval USB device operation status +*/ +uint8_t hid_report_send (usb_dev *udev, uint8_t *report, uint16_t len) +{ + standard_hid_handler *hid = (standard_hid_handler *)udev->class_data[USBD_HID_INTERFACE]; + + /* check if USB is configured */ + hid->prev_transfer_complete = 0U; + + usbd_ep_send(udev, HID_IN_EP, report, len); + + return USBD_OK; +} + +/*! + \brief initialize the HID device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_init (usb_dev *udev, uint8_t config_index) +{ + static standard_hid_handler hid_handler; + + memset((void *)&hid_handler, 0, sizeof(standard_hid_handler)); + + /* initialize Tx endpoint */ + usbd_ep_init(udev, EP_BUF_SNG, INT_TX_ADDR, &(hid_config_desc.hid_epin)); + + udev->ep_transc[EP_ID(HID_IN_EP)][TRANSC_IN] = hid_class.data_in; + + hid_handler.prev_transfer_complete = 1U; + + udev->class_data[USBD_HID_INTERFACE] = (void *)&hid_handler; + + if (NULL != udev->user_data) { + ((hid_fop_handler *)udev->user_data)->hid_itf_config(); + } + + return USBD_OK; +} + +/*! + \brief de-initialize the HID device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_deinit (usb_dev *udev, uint8_t config_index) +{ + /* deinitialize HID endpoints */ + usbd_ep_deinit (udev, HID_IN_EP); + + return USBD_OK; +} + +/*! + \brief handle the HID class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_req_handler (usb_dev *udev, usb_req *req) +{ + uint8_t status = REQ_NOTSUPP; + + standard_hid_handler *hid = (standard_hid_handler *)udev->class_data[USBD_HID_INTERFACE]; + + switch (req->bRequest) { + case GET_REPORT: + /* no use for this driver */ + break; + + case GET_IDLE: + usb_transc_config(&udev->transc_in[0U], (uint8_t *)&hid->idle_state, 1U, 0U); + + status = REQ_SUPP; + break; + + case GET_PROTOCOL: + usb_transc_config(&udev->transc_in[0U], (uint8_t *)&hid->protocol, 1U, 0U); + + status = REQ_SUPP; + break; + + case SET_REPORT: + /* no use for this driver */ + break; + + case SET_IDLE: + hid->idle_state = (uint8_t)(req->wValue >> 8); + + status = REQ_SUPP; + break; + + case SET_PROTOCOL: + hid->protocol = (uint8_t)(req->wValue); + + status = REQ_SUPP; + break; + + case USB_GET_DESCRIPTOR: + if (USB_DESCTYPE_REPORT == (req->wValue >> 8)) { + usb_transc_config(&udev->transc_in[0U], + (uint8_t *)hid_report_desc, + USB_MIN(USB_HID_REPORT_DESC_LEN, req->wLength), + 0U); + + status = REQ_SUPP; + } else if (USB_DESCTYPE_HID == (req->wValue >> 8U)) { + usb_transc_config(&udev->transc_in[0U], + (uint8_t *)(&(hid_config_desc.hid_vendor)), + USB_MIN(9U, req->wLength), + 0U); + } + break; + + default: + break; + } + + return status; +} + +/*! + \brief handle data stage in DATA IN transaction + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier + \param[out] none + \retval none +*/ +static void hid_data_in_handler (usb_dev *udev, uint8_t ep_num) +{ + standard_hid_handler *hid = (standard_hid_handler *)udev->class_data[USBD_HID_INTERFACE]; + + if (hid->data[2]) { + hid->data[2] = 0x00U; + + usbd_ep_send(udev, HID_IN_EP, hid->data, HID_IN_PACKET); + } else { + hid->prev_transfer_complete = 1U; + } +} diff --git b/Drivers/GD32F30x_usbd_library/class/device/hid/Source/std_hid_mouse_core.c a/Drivers/GD32F30x_usbd_library/class/device/hid/Source/std_hid_mouse_core.c new file mode 100644 index 0000000..9dfc18d --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/hid/Source/std_hid_mouse_core.c @@ -0,0 +1,425 @@ +/*! + \file std_hid_mouse_core.c + \brief HID class driver + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_transc.h" +#include "std_hid_mouse_core.h" + +#include + +#define USBD_VID 0x28E9U +#define USBD_PID 0x0381U + +/* Note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +usb_desc_dev hid_dev_desc = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, +#ifdef LPM_ENABLED + .bcdUSB = 0x0201U, +#else + .bcdUSB = 0x0200U, +#endif /* LPM_ENABLED */ + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USBD_EP0_MAX_SIZE, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +#ifdef LPM_ENABLED + +/* BOS descriptor */ +uint8_t USBD_BOSDesc[USB_BOS_DESC_LEN] = +{ + 0x05, + USB_DESCTYPE_BOS, + 0x0C, + 0x00, + 0x01, /* 1 device capability descriptor */ + + /* device capability*/ + 0x07, + USB_DEVICE_CAPABITY, + 0x02, + 0x06, /* LPM capability bit set */ + 0x00, + 0x00, + 0x00 +}; + +#endif /* LPM_ENABLED */ + +usb_hid_desc_config_set hid_config_desc = +{ + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_HID_CONFIG_DESC_LEN, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xA0U, + .bMaxPower = 0x32U + }, + + .hid_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x01U, + .bInterfaceClass = USB_HID_CLASS, + .bInterfaceSubClass = USB_HID_SUBCLASS_BOOT_ITF, + .bInterfaceProtocol = USB_HID_PROTOCOL_MOUSE, + .iInterface = 0x00U + }, + + .hid_vendor = + { + .header = + { + .bLength = sizeof(usb_desc_hid), + .bDescriptorType = USB_DESCTYPE_HID + }, + .bcdHID = 0x0111U, + .bCountryCode = 0x00U, + .bNumDescriptors = 0x01U, + .bDescriptorType = USB_DESCTYPE_REPORT, + .wDescriptorLength = USB_HID_REPORT_DESC_LEN, + }, + + .hid_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = HID_IN_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = HID_IN_PACKET, + .bInterval = 0x40U + } +}; + +/* USB language ID Descriptor */ +usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static usb_desc_str manufacturer_string = +{ + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static usb_desc_str product_string = +{ + .header = + { + .bLength = USB_STRING_LEN(14U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'M', 'o', 'u', 's', 'e'} +}; + +/* USBD serial string */ +static usb_desc_str serial_string = +{ + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR, + } +}; + +static uint8_t* usbd_hid_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc hid_mouse_desc = { + .dev_desc = (uint8_t *)&hid_dev_desc, + .config_desc = (uint8_t *)&hid_config_desc, + .strings = usbd_hid_strings +}; + +static uint8_t hid_init (usb_dev *udev, uint8_t config_index); +static uint8_t hid_deinit (usb_dev *udev, uint8_t config_index); +static uint8_t hid_req_handler (usb_dev *udev, usb_req *req); + +static void hid_data_in_handler (usb_dev *udev, uint8_t ep_num); + +usb_class hid_class = { + .init = hid_init, + .deinit = hid_deinit, + .req_process = hid_req_handler, + .data_in = hid_data_in_handler +}; + +const uint8_t hid_report_desc[USB_HID_REPORT_DESC_LEN] = +{ + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x02, /* USAGE (Mouse) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + 0x09, 0x01, /* USAGE (Pointer) */ + + 0xa1, 0x00, /* COLLECTION (Physical) */ + 0x05, 0x09, /* USAGE_PAGE (Button) */ + 0x19, 0x01, /* USAGE_MINIMUM (1) */ + 0x29, 0x03, /* USAGE_MAXIMUM (3) */ + + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x95, 0x03, /* REPORT_COUNT (3) */ + 0x75, 0x01, /* REPORT_SIZE (1) */ + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ + + 0x95, 0x01, /* REPORT_COUNT (1) */ + 0x75, 0x05, /* REPORT_SIZE (5) */ + 0x81, 0x01, /* INPUT (Cnst,Var,Abs) */ + + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x30, /* USAGE (X) */ + 0x09, 0x31, /* USAGE (Y) */ + 0x09, 0x38, /* USAGE (Wheel) */ + + 0x15, 0x81, /* LOGICAL_MINIMUM (-127) */ + 0x25, 0x7F, /* LOGICAL_MAXIMUM (127) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x95, 0x03, /* REPORT_COUNT (3) */ + 0x81, 0x06, /* INPUT (Data,Var,Rel) */ + 0xc0, /* END_COLLECTION */ + 0xc0 /* END_COLLECTION */ +}; + +/*! + \brief register HID interface operation functions + \param[in] udev: pointer to USB device instance + \param[in] hid_fop: HID operation functions structure + \param[out] none + \retval USB device operation status +*/ +uint8_t hid_itfop_register (usb_dev *udev, mice_fop_handler *hid_fop) +{ + if (NULL != hid_fop) { + udev->user_data = (void *)hid_fop; + + return USBD_OK; + } + + return USBD_FAIL; +} + +/*! + \brief send mouse report + \param[in] udev: pointer to USB device instance + \param[in] report: pointer to HID report + \param[in] len: data length + \param[out] none + \retval USB device operation status +*/ +uint8_t hid_report_send (usb_dev *udev, uint8_t *report, uint16_t len) +{ + standard_mice_handler *hid = (standard_mice_handler *)udev->class_data[USBD_HID_INTERFACE]; + + if(udev->cur_status == USBD_CONFIGURED){ + if(1U == hid->prev_transfer_complete){ + hid->prev_transfer_complete = 0U; + usbd_ep_send(udev, HID_IN_EP, report, len); + } + } + + return USBD_OK; +} + +/*! + \brief initialize the HID device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_init (usb_dev *udev, uint8_t config_index) +{ + static standard_mice_handler mice_handler; + + memset((void *)&mice_handler, 0, sizeof(standard_mice_handler)); + + /* initialize Tx endpoint */ + usbd_ep_init(udev, EP_BUF_SNG, INT_TX_ADDR, &(hid_config_desc.hid_epin)); + + udev->ep_transc[EP_ID(HID_IN_EP)][TRANSC_IN] = hid_class.data_in; + + mice_handler.prev_transfer_complete = 1U; + + udev->class_data[USBD_HID_INTERFACE] = (void *)&mice_handler; + + if (NULL != udev->user_data) { + ((mice_fop_handler *)(udev->user_data))->mice_itf_config(); + } + + return USBD_OK; +} + +/*! + \brief de-initialize the HID device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_deinit (usb_dev *udev, uint8_t config_index) +{ + /* deinitialize HID endpoints */ + usbd_ep_deinit (udev, HID_IN_EP); + + return USBD_OK; +} + +/*! + \brief handle the HID class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_req_handler (usb_dev *udev, usb_req *req) +{ + uint8_t status = REQ_NOTSUPP; + + standard_mice_handler *hid = (standard_mice_handler *)udev->class_data[USBD_HID_INTERFACE]; + + switch (req->bRequest) { + case GET_REPORT: + /* no use for this driver */ + break; + + case GET_IDLE: + usb_transc_config(&udev->transc_in[0U], (uint8_t *)&hid->idle_state, 1U, 0U); + + status = REQ_SUPP; + break; + + case GET_PROTOCOL: + usb_transc_config(&udev->transc_in[0], (uint8_t *)&hid->protocol, 1U, 0U); + + status = REQ_SUPP; + break; + + case SET_REPORT: + /* no use for this driver */ + break; + + case SET_IDLE: + hid->idle_state = (uint8_t)(req->wValue >> 8); + + status = REQ_SUPP; + break; + + case SET_PROTOCOL: + hid->protocol = (uint8_t)(req->wValue); + + status = REQ_SUPP; + break; + + case USB_GET_DESCRIPTOR: + if (USB_DESCTYPE_REPORT == (req->wValue >> 8)) { + usb_transc_config(&udev->transc_in[0U], + (uint8_t *)hid_report_desc, + USB_MIN(USB_HID_REPORT_DESC_LEN, req->wLength), + 0U); + + status = REQ_SUPP; + } + break; + + default: + break; + } + + return status; +} + +/*! + \brief handle data stage in DATA IN transaction + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier + \param[out] none + \retval none +*/ +static void hid_data_in_handler (usb_dev *udev, uint8_t ep_num) +{ + standard_mice_handler *hid = (standard_mice_handler *)udev->class_data[USBD_HID_INTERFACE]; + + if(hid->data[0] == 0U){ + hid->prev_transfer_complete = 1U; + }else{ + hid->data[0] = 0U; + usbd_ep_send(udev, HID_IN_EP, hid->data, HID_IN_PACKET); + } +} diff --git b/Drivers/GD32F30x_usbd_library/class/device/iap/Include/usb_iap_core.h a/Drivers/GD32F30x_usbd_library/class/device/iap/Include/usb_iap_core.h new file mode 100644 index 0000000..417d702 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/iap/Include/usb_iap_core.h @@ -0,0 +1,82 @@ +/*! + \file usb_iap_core.h + \brief the header file of IAP driver + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_IAP_CORE_H +#define __USB_IAP_CORE_H + +#include "usbd_enum.h" +#include "usb_hid.h" + +#define USB_DESC_LEN_IAP_REPORT 35U +#define USB_DESC_LEN_IAP_CONFIG_SET 41U + +/* special commands with download request */ +#define IAP_OPTION_BYTE 0x01U +#define IAP_ERASE 0x02U +#define IAP_DNLOAD 0x03U +#define IAP_LEAVE 0x04U +#define IAP_GETBIN_ADDRESS 0x05U + +typedef void (*app_func) (void); + +typedef struct +{ + uint8_t report_buf[IAP_OUT_PACKET + 1U]; + uint8_t option_byte[IAP_IN_PACKET]; + + /* state machine variables */ + uint8_t dev_status[IAP_IN_PACKET]; + uint8_t bin_addr[IAP_IN_PACKET]; + + uint8_t reportID; + uint8_t flag; + + uint32_t protocol; + uint32_t idlestate; + + uint16_t transfer_times; + uint16_t page_count; + uint16_t lps; /* last packet size */ + uint32_t file_length; + uint32_t base_address; +} usbd_iap_handler; + +extern usb_desc iap_desc; +extern usb_class iap_class; + +/* function declarations */ +/* send IAP report */ +uint8_t iap_report_send(usb_dev *udev, uint8_t *report, uint16_t len); + +#endif /* __USB_IAP_CORE_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/iap/Source/usb_iap_core.c a/Drivers/GD32F30x_usbd_library/class/device/iap/Source/usb_iap_core.c new file mode 100644 index 0000000..e0ff54b --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/iap/Source/usb_iap_core.c @@ -0,0 +1,594 @@ +/*! + \file usb_iap_core.c + \brief IAP driver + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_transc.h" +#include "usb_iap_core.h" +#include + +#define USBD_VID 0x28E9U +#define USBD_PID 0x028BU + +/* Note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +usb_desc_dev iap_dev_desc = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USBD_EP0_MAX_SIZE, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +usb_hid_desc_config_set iap_config_desc = +{ + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_DESC_LEN_IAP_CONFIG_SET, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0x80U, + .bMaxPower = 0x32U + }, + + .hid_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_HID_CLASS, + .bInterfaceSubClass = 0x00U, + .bInterfaceProtocol = 0x01U, + .iInterface = 0x00U + }, + + .hid_vendor = + { + .header = + { + .bLength = sizeof(usb_desc_hid), + .bDescriptorType = USB_DESCTYPE_HID + }, + .bcdHID = 0x0111U, + .bCountryCode = 0x00U, + .bNumDescriptors = 0x01U, + .bDescriptorType = USB_DESCTYPE_REPORT, + .wDescriptorLength = USB_DESC_LEN_IAP_REPORT, + }, + + .hid_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = IAP_IN_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = IAP_IN_PACKET, + .bInterval = 0x01U + }, + + .hid_epout = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = IAP_OUT_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = IAP_OUT_PACKET, + .bInterval = 0x01U + } +}; + +/* USB language ID Descriptor */ +usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static usb_desc_str manufacturer_string = +{ + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static usb_desc_str product_string = +{ + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'I', 'A', 'P'} +}; + +/* USBD serial string */ +static usb_desc_str serial_string = +{ + .header = + { + .bLength = USB_STRING_LEN(2U), + .bDescriptorType = USB_DESCTYPE_STR, + } +}; + +uint8_t* usbd_iap_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc iap_desc = { + .dev_desc = (uint8_t *)&iap_dev_desc, + .config_desc = (uint8_t *)&iap_config_desc, + .strings = usbd_iap_strings +}; + +/* local function prototypes ('static') */ +static uint8_t iap_init (usb_dev *udev, uint8_t config_index); +static uint8_t iap_deinit (usb_dev *udev, uint8_t config_index); +static uint8_t iap_req_handler (usb_dev *udev, usb_req *req); +static void iap_data_out (usb_dev *udev, uint8_t ep_num); + +usb_class iap_class = { + .init = iap_init, + .deinit = iap_deinit, + .req_process = iap_req_handler, + .data_out = iap_data_out +}; + +/* USB custom HID device report descriptor */ +const uint8_t iap_report_desc[USB_DESC_LEN_IAP_REPORT] = +{ + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x00, /* USAGE (Custom Device) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + + /* IAP command and data */ + 0x85, 0x01, /* REPORT_ID (0x01) */ + 0x09, 0x01, /* USAGE (IAP command) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x95, 0x3f, /* REPORT_COUNT (63) */ + 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ + + /* device status and option byte */ + 0x85, 0x02, /* REPORT_ID (0x02) */ + 0x09, 0x02, /* USAGE (Status and option byte) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x95, 0x10, /* REPORT_COUNT (16) */ + 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ + + 0xc0 /* END_COLLECTION */ +}; + +/* IAP requests management functions */ +static void iap_req_erase (usb_dev *udev); +static void iap_req_dnload (usb_dev *udev); +static void iap_req_optionbyte(usb_dev *udev); +static void iap_req_leave (usb_dev *udev); +static void iap_address_send (usb_dev *udev); +static void iap_data_write (uint8_t *data, uint32_t addr, uint32_t len); + +/*! + \brief initialize the HID device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t iap_init (usb_dev *udev, uint8_t config_index) +{ + static usbd_iap_handler iap_handler; + + /* initialize Tx endpoint */ + usbd_ep_init(udev, EP_BUF_SNG, INT_TX_ADDR, &(iap_config_desc.hid_epin)); + + /* initialize Rx endpoint */ + usbd_ep_init(udev, EP_BUF_SNG, INT_RX_ADDR, &(iap_config_desc.hid_epout)); + + /* unlock the internal flash */ + fmc_unlock(); + + memset((void *)&iap_handler, 0, sizeof(usbd_iap_handler)); + + /* prepare receive Data */ + usbd_ep_recev(udev, IAP_OUT_EP, iap_handler.report_buf, IAP_OUT_PACKET); + + udev->ep_transc[EP_ID(IAP_OUT_EP)][TRANSC_OUT] = iap_class.data_out; + + iap_handler.base_address = APP_LOADED_ADDR; + + udev->class_data[USBD_IAP_INTERFACE] = (void *)&iap_handler; + + return USBD_OK; +} + +/*! + \brief de-initialize the HID device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t iap_deinit (usb_dev *udev, uint8_t config_index) +{ + /* deinitialize HID endpoints */ + usbd_ep_deinit (udev, IAP_IN_EP); + usbd_ep_deinit (udev, IAP_OUT_EP); + + /* lock the internal flash */ + fmc_lock(); + + return USBD_OK; +} + +/*! + \brief handle the HID class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t iap_req_handler (usb_dev *udev, usb_req *req) +{ + uint8_t status = REQ_NOTSUPP; + + usbd_iap_handler *iap = (usbd_iap_handler *)udev->class_data[USBD_IAP_INTERFACE]; + + switch (req->bRequest) { + case GET_REPORT: + /* no use for this driver */ + break; + + case GET_IDLE: + usb_transc_config(&udev->transc_in[0], (uint8_t *)&iap->idlestate, 1U, 0U); + + status = REQ_SUPP; + break; + + case GET_PROTOCOL: + usb_transc_config(&udev->transc_in[0], (uint8_t *)&iap->protocol, 1U, 0U); + + status = REQ_SUPP; + break; + + case SET_REPORT: + iap->reportID = (uint8_t)(req->wValue); + + usb_transc_config(&udev->transc_out[0], iap->report_buf, req->wLength, 0U); + + status = REQ_SUPP; + break; + + case SET_IDLE: + iap->idlestate = (uint8_t)(req->wValue >> 8); + + status = REQ_SUPP; + break; + + case SET_PROTOCOL: + iap->protocol = (uint8_t)(req->wValue); + + status = REQ_SUPP; + break; + + case USB_GET_DESCRIPTOR: + if (USB_DESCTYPE_REPORT == (req->wValue >> 8)) { + usb_transc_config(&udev->transc_in[0], + (uint8_t *)iap_report_desc, + USB_MIN(USB_DESC_LEN_IAP_REPORT, req->wLength), + 0U); + + return REQ_SUPP; + } + break; + + default: + break; + } + + return status; +} + +/*! + \brief handle data out stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +static void iap_data_out (usb_dev *udev ,uint8_t ep_num) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->class_data[USBD_IAP_INTERFACE]; + + if (0x01U == iap->report_buf[0]) { + switch(iap->report_buf[1]) { + case IAP_DNLOAD: + iap_req_dnload(udev); + break; + + case IAP_ERASE: + iap_req_erase(udev); + break; + + case IAP_OPTION_BYTE: + iap_req_optionbyte(udev); + break; + + case IAP_LEAVE: + iap_req_leave(udev); + break; + + case IAP_GETBIN_ADDRESS: + iap_address_send(udev); + break; + + default: + break; + } + } + + usbd_ep_recev(udev, IAP_OUT_EP, iap->report_buf, IAP_OUT_PACKET); +} + +/*! + \brief send iap report + \param[in] udev: pointer to USB device instance + \param[in] report: pointer to HID report + \param[in] len: data length + \param[out] none + \retval USB device operation status +*/ +uint8_t iap_report_send (usb_dev *udev, uint8_t *report, uint16_t len) +{ + usbd_ep_send (udev, IAP_IN_EP, report, len); + + return USBD_OK; +} + +/*! + \brief handle the IAP_DNLOAD request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_req_dnload (usb_dev *udev) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->class_data[USBD_IAP_INTERFACE]; + + if (0U != iap->transfer_times) { + if (1U == iap->transfer_times) { + if (0U == iap->lps) { + iap_data_write(&iap->report_buf[2], iap->base_address, TRANSFER_SIZE); + } else { + iap_data_write(&iap->report_buf[2], iap->base_address, iap->file_length % TRANSFER_SIZE); + iap->lps = 0U; + } + + iap->dev_status[0] = 0x02U; + iap->dev_status[1] = 0x02U; + iap_report_send (udev, iap->dev_status, IAP_IN_PACKET); + } else { + iap_data_write(&iap->report_buf[2], iap->base_address, TRANSFER_SIZE); + + iap->base_address += TRANSFER_SIZE; + } + + iap->transfer_times--; + } +} + +/*! + \brief handle the IAP_ERASE request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_req_erase (usb_dev *udev) +{ + uint32_t i, addr = 0U; + + usbd_iap_handler *iap = (usbd_iap_handler *)udev->class_data[USBD_IAP_INTERFACE]; + + /* get base address to erase */ + iap->base_address = iap->report_buf[2]; + iap->base_address |= (uint32_t)iap->report_buf[3] << 8; + iap->base_address |= (uint32_t)iap->report_buf[4] << 16; + iap->base_address |= (uint32_t)iap->report_buf[5] << 24; + + iap->page_count = iap->report_buf[6]; + + /* get file length */ + iap->file_length = iap->report_buf[7]; + iap->file_length |= (uint32_t)iap->report_buf[8] << 8; + iap->file_length |= (uint32_t)iap->report_buf[9] << 16; + iap->file_length |= (uint32_t)iap->report_buf[10] << 24; + + /* compute last packet size and transfer times */ + iap->lps = iap->file_length % TRANSFER_SIZE; + if (0U == iap->lps) { + iap->transfer_times = (uint16_t)iap->file_length / TRANSFER_SIZE; + } else { + iap->transfer_times = (uint16_t)iap->file_length / TRANSFER_SIZE + 1U; + } + + /* check if the address is in protected area */ + if (IS_PROTECTED_AREA(iap->base_address)) { + return; + } + + addr = iap->base_address; + + for (i = 0U; i < iap->page_count; i ++) { + /* call the standard flash erase-page function */ + fmc_page_erase(addr); + + addr += PAGE_SIZE; + } + + iap->dev_status[0] = 0x02U; + iap->dev_status[1] = 0x01U; + + usbd_ep_send(udev, IAP_IN_EP, iap->dev_status, IAP_IN_PACKET); +} + +/*! + \brief handle the IAP_OPTION_BYTE request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_req_optionbyte (usb_dev *udev) +{ + uint8_t i = 0U; + uint32_t address = 0x1FFFF800U; + + usbd_iap_handler *iap = (usbd_iap_handler *)udev->class_data[USBD_IAP_INTERFACE]; + + iap->option_byte[0] = 0x02U; + + for (i = 1U; i < 17U; i++) { + iap->option_byte[i] = *(uint8_t *)address; + address++; + } + + iap_report_send(udev, iap->option_byte, IAP_IN_PACKET); +} + +/*! + \brief handle the IAP_LEAVE request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_req_leave (usb_dev *udev) +{ + /* lock the internal flash */ + fmc_lock(); + + /* generate system reset to allow jumping to the user code */ + NVIC_SystemReset(); +} + +/*! + \brief handle the IAP_SEND_ADDRESS request + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void iap_address_send(usb_dev *udev) +{ + usbd_iap_handler *iap = (usbd_iap_handler *)udev->class_data[USBD_IAP_INTERFACE]; + + iap->bin_addr[0] = 0x02U; + + iap->bin_addr[1] = (uint8_t)(APP_LOADED_ADDR); + iap->bin_addr[2] = (uint8_t)(APP_LOADED_ADDR >> 8); + iap->bin_addr[3] = (uint8_t)(APP_LOADED_ADDR >> 16); + iap->bin_addr[4] = (uint8_t)(APP_LOADED_ADDR >> 24); + + iap_report_send (udev, iap->bin_addr, IAP_IN_PACKET); +} + +/*! + \brief write data to sectors of memory + \param[in] data: data to be written + \param[in] addr: sector address/code + \param[in] len: length of data to be written (in bytes) + \param[out] none + \retval MAL_OK if all operations are OK, MAL_FAIL else +*/ +static void iap_data_write (uint8_t *data, uint32_t addr, uint32_t len) +{ + uint32_t index = 0U; + + /* check if the address is in protected area */ + if (IS_PROTECTED_AREA(addr)) { + return; + } + + if (len & 0x03U) {/* not an aligned data */ + for (index = len; index < ((len & 0xFFFCU) + 4U); index++) { + data[index] = 0xFFU; + } + } + + /* data received are word multiple */ + for (index = 0U; index < len; index += 4U) { + fmc_word_program(addr, *(uint32_t *)(data + index)); + addr += 4U; + } +} diff --git b/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_bbb.h a/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_bbb.h new file mode 100644 index 0000000..9763e26 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_bbb.h @@ -0,0 +1,130 @@ +/*! + \file usbd_msc_bbb.h + \brief the header file of the usbd_msc_bot.c file + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-02-20, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_MSC_BBB_H +#define __USBD_MSC_BBB_H + +#include "usbd_core.h" +#include "usbd_msc_mem.h" +#include "usbd_msc_scsi.h" + +#define BBB_CBW_SIGNATURE 0x43425355U +#define BBB_CSW_SIGNATURE 0x53425355U +#define BBB_CBW_LENGTH 31U +#define BBB_CSW_LENGTH 13U + +typedef struct { + uint32_t dCBWSignature; + uint32_t dCBWTag; + uint32_t dCBWDataTransferLength; + uint8_t bmCBWFlags; + uint8_t bCBWLUN; + uint8_t bCBWCBLength; + uint8_t CBWCB[16]; +}msc_bbb_cbw; + +typedef struct { + uint32_t dCSWSignature; + uint32_t dCSWTag; + uint32_t dCSWDataResidue; + uint8_t bCSWStatus; +}msc_bbb_csw; + +/* CSW command status */ +enum msc_csw_status { + CSW_CMD_PASSED = 0, + CSW_CMD_FAILED, + CSW_PHASE_ERROR +}; + +/* MSC BBB state */ +enum msc_bbb_state { + BBB_IDLE = 0U, /*!< idle state */ + BBB_DATA_OUT, /*!< data OUT state */ + BBB_DATA_IN, /*!< data IN state */ + BBB_LAST_DATA_IN, /*!< last data IN state */ + BBB_SEND_DATA /*!< send immediate data state */ +}; + +/* MSC BBB status */ +enum msc_bbb_status { + BBB_STATUS_NORMAL = 0U, /*!< normal status */ + BBB_STATUS_RECOVERY, /*!< recovery status*/ + BBB_STATUS_ERROR /*!< error status */ +}; + +typedef struct +{ + uint8_t bbb_data[MSC_MEDIA_PACKET_SIZE]; + + uint8_t max_lun; + uint8_t bbb_state; + uint8_t bbb_status; + + uint32_t bbb_datalen; + + msc_bbb_cbw bbb_cbw; + msc_bbb_csw bbb_csw; + + uint8_t scsi_sense_head; + uint8_t scsi_sense_tail; + + uint32_t scsi_blk_size[MEM_LUN_NUM]; + uint32_t scsi_blk_nbr[MEM_LUN_NUM]; + + uint32_t scsi_blk_addr; + uint32_t scsi_blk_len; +// uint32_t scsi_disk_pop; + + msc_scsi_sense scsi_sense[SENSE_LIST_DEEPTH]; +} usbd_msc_handler; + +/* function declarations */ +/* initialize the bbb process */ +void msc_bbb_init (usb_dev *udev); +/* reset the BBB machine */ +void msc_bbb_reset (usb_dev *udev); +/* deinitialize the BBB machine */ +void msc_bbb_deinit (usb_dev *udev); +/* handle BBB data IN stage */ +void msc_bbb_data_in (usb_dev *udev, uint8_t ep_num); +/* handle BBB data OUT stage */ +void msc_bbb_data_out (usb_dev *udev, uint8_t ep_num); +/* send the CSW(command status wrapper) */ +void msc_bbb_csw_send (usb_dev *udev, uint8_t csw_status); +/* complete the clear feature request */ +void msc_bbb_clrfeature (usb_dev *udev, uint8_t ep_num); + +#endif /* __USBD_MSC_BBB_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_core.h a/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_core.h new file mode 100644 index 0000000..f2b3ef3 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_core.h @@ -0,0 +1,86 @@ +/*! + \file usbd_msc_core.h + \brief the header file of USB MSC device class core functions + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-02-20, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_MSC_CORE_H +#define __USBD_MSC_CORE_H + +#include "usbd_core.h" + +/* mass storage device class code */ +#define USB_CLASS_MSC 0x08U + +/* mass storage subclass code */ +#define USB_MSC_SUBCLASS_RBC 0x01U +#define USB_MSC_SUBCLASS_ATAPI 0x02U +#define USB_MSC_SUBCLASS_UFI 0x04U +#define USB_MSC_SUBCLASS_SCSI 0x06U +#define USB_MSC_SUBCLASS_LOCKABLE 0x07U +#define USB_MSC_SUBCLASS_IEEE1667 0x08U + +/* mass storage interface class control protocol codes */ +#define USB_MSC_PROTOCOL_CBI 0x00U +#define USB_MSC_PROTOCOL_CBI_ALT 0x01U +#define USB_MSC_PROTOCOL_BBB 0x50U + +/* mass storage request codes */ +#define USB_MSC_REQ_CODES_ADSC 0x00U +#define USB_MSC_REQ_CODES_GET 0xFCU +#define USB_MSC_REQ_CODES_PUT 0xFDU +#define USB_MSC_REQ_CODES_GML 0xFEU +#define USB_MSC_REQ_CODES_BOMSR 0xFFU + +/* mass storage class-specific request codes */ +#define BBB_GET_MAX_LUN 0xFEU +#define BBB_RESET 0xFFU + +#define USB_MSC_CONFIG_DESC_SIZE 32U + +#define MSC_EPIN_SIZE MSC_DATA_PACKET_SIZE +#define MSC_EPOUT_SIZE MSC_DATA_PACKET_SIZE + +/* USB configuration descriptor structure */ +typedef struct +{ + usb_desc_config config; + + usb_desc_itf msc_itf; + usb_desc_ep msc_epin; + usb_desc_ep msc_epout; +} usb_desc_config_set; + +extern usb_desc msc_desc; +extern usb_class msc_class; + +#endif /* __USBD_MSC_CORE_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_data.h a/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_data.h new file mode 100644 index 0000000..9b37438 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_data.h @@ -0,0 +1,50 @@ +/*! + \file usbd_msc_data.h + \brief the header file of the usbd_msc_data.c file + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-02-20, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_MSC_DATA_H +#define __USBD_MSC_DATA_H + +#include "usbd_conf.h" + +#define MODE_SENSE6_LENGTH 8U +#define MODE_SENSE10_LENGTH 8U +#define INQUIRY_PAGE00_LENGTH 96U +#define FORMAT_CAPACITIES_LENGTH 20U + +extern const uint8_t msc_page00_inquiry_data[]; +extern const uint8_t msc_mode_sense6_data[]; +extern const uint8_t msc_mode_sense10_data[]; + +#endif /* __USBD_MSC_DATA_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_mem.h a/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_mem.h new file mode 100644 index 0000000..47e51b9 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_mem.h @@ -0,0 +1,60 @@ +/*! + \file usbd_msc_mem.h + \brief header file for storage memory + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-02-20, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_MSC_MEM_H +#define __USBD_MSC_MEM_H + +#include "usbd_conf.h" + +#define USBD_STD_INQUIRY_LENGTH 36U + +typedef struct +{ + int8_t (*mem_init) (uint8_t lun); + int8_t (*mem_ready) (uint8_t lun); + int8_t (*mem_protected) (uint8_t lun); + int8_t (*mem_read) (uint8_t lun, uint8_t *buf, uint32_t block_addr, uint16_t block_len); + int8_t (*mem_write) (uint8_t lun, uint8_t *buf, uint32_t block_addr, uint16_t block_len); + int8_t (*mem_maxlun) (void); + + uint8_t *mem_toc_data; + uint8_t *mem_inquiry_data[MEM_LUN_NUM]; + uint32_t mem_block_size[MEM_LUN_NUM]; + uint32_t mem_block_len[MEM_LUN_NUM]; +}usbd_mem_cb; + +extern usbd_mem_cb *usbd_mem_fops; + +#endif /* __USBD_MSC_MEM_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_scsi.h a/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_scsi.h new file mode 100644 index 0000000..18f34b5 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/msc/Include/usbd_msc_scsi.h @@ -0,0 +1,127 @@ +/*! + \file usbd_msc_scsi.h + \brief the header file of the usbd_msc_scsi.c file + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-02-20, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_MSC_SCSI_H +#define __USBD_MSC_SCSI_H + +#include "usbd_msc_data.h" +#include "usbd_msc_bbb.h" + +#define SENSE_LIST_DEEPTH 4U + +/* SCSI commands */ +#define SCSI_FORMAT_UNIT 0x04U +#define SCSI_INQUIRY 0x12U +#define SCSI_MODE_SELECT6 0x15U +#define SCSI_MODE_SELECT10 0x55U +#define SCSI_MODE_SENSE6 0x1AU +#define SCSI_READ_TOC_DATA 0x43U +#define SCSI_MODE_SENSE10 0x5AU +#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1EU +#define SCSI_READ6 0x08U +#define SCSI_READ10 0x28U +#define SCSI_READ12 0xA8U +#define SCSI_READ16 0x88U + +#define SCSI_READ_CAPACITY10 0x25U +#define SCSI_READ_CAPACITY16 0x9EU + +#define SCSI_REQUEST_SENSE 0x03U +#define SCSI_START_STOP_UNIT 0x1BU +#define SCSI_TEST_UNIT_READY 0x00U +#define SCSI_WRITE6 0x0AU +#define SCSI_WRITE10 0x2AU +#define SCSI_WRITE12 0xAAU +#define SCSI_WRITE16 0x8AU + +#define SCSI_VERIFY10 0x2FU +#define SCSI_VERIFY12 0xAFU +#define SCSI_VERIFY16 0x8FU + +#define SCSI_SEND_DIAGNOSTIC 0x1DU +#define SCSI_READ_FORMAT_CAPACITIES 0x23U + +#define INVALID_CDB 0x20U +#define INVALID_FIELED_IN_COMMAND 0x24U +#define PARAMETER_LIST_LENGTH_ERROR 0x1AU +#define INVALID_FIELD_IN_PARAMETER_LIST 0x26U +#define ADDRESS_OUT_OF_RANGE 0x21U +#define MEDIUM_NOT_PRESENT 0x3AU +#define MEDIUM_HAVE_CHANGED 0x28U +#define WRITE_PROTECTED 0x27U +#define UNRECOVERED_READ_ERROR 0x11U +#define WRITE_FAULT 0x03U + +#define READ_FORMAT_CAPACITY_DATA_LEN 0x0CU +#define READ_CAPACITY10_DATA_LEN 0x08U +#define MODE_SENSE10_DATA_LEN 0x08U +#define MODE_SENSE6_DATA_LEN 0x04U +#define READ_TOC_CMD_LEN 0x14U +#define REQUEST_SENSE_DATA_LEN 0x12U +#define STANDARD_INQUIRY_DATA_LEN 0x24U +#define BLKVFY 0x04U + +enum sense_state { + NO_SENSE = 0U, + RECOVERED_ERROR, + NOT_READY, + MEDIUM_ERROR, + HARDWARE_ERROR, + ILLEGAL_REQUEST, + UNIT_ATTENTION, + DATA_PROTECT, + BLANK_CHECK, + VENDOR_SPECIFIC, + COPY_ABORTED, + ABORTED_COMMAND, + RESERVED, + VOLUME_OVERFLOW, + MISCOMPARE +}; + +typedef struct { + uint8_t SenseKey; + uint32_t Information; + uint8_t ASC; + uint8_t ASCQ; +} msc_scsi_sense; + +/* function declarations */ +/* process SCSI commands */ +int8_t scsi_process_cmd (usb_dev *udev, uint8_t lun, uint8_t *cmd); +/* load the last error code in the error list */ +void scsi_sense_code (usb_dev *udev, uint8_t lun, uint8_t skey, uint8_t asc); + +#endif /* __USBD_MSC_SCSI_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_bbb.c a/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_bbb.c new file mode 100644 index 0000000..f0d99e3 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_bbb.c @@ -0,0 +1,284 @@ +/*! + \file usbd_msc_bbb.c + \brief USB BBB(Bulk/Bulk/Bulk) protocol core functions + \note BBB means Bulk-only transport protocol for USB MSC + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-02-20, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_enum.h" +#include "usbd_msc_bbb.h" + +/* local function prototypes ('static') */ +static void msc_bbb_cbw_decode (usb_dev *udev); +static void msc_bbb_data_send (usb_dev *udev, uint8_t *pbuf, uint32_t Len); +static void msc_bbb_abort (usb_dev *udev); + +/*! + \brief initialize the bbb process + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void msc_bbb_init (usb_dev *udev) +{ + uint8_t lun_num; + + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->bbb_state = BBB_IDLE; + msc->bbb_status = BBB_STATUS_NORMAL; + + /* initializes the storage logic unit */ + for(lun_num = 0U; lun_num < MEM_LUN_NUM; lun_num++) { + usbd_mem_fops->mem_init(lun_num); + } + + /* prepare endpoint to receive the first BBB CBW */ + usbd_ep_recev (udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); +} + +/*! + \brief reset the BBB machine + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void msc_bbb_reset (usb_dev *udev) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->bbb_state = BBB_IDLE; + msc->bbb_status = BBB_STATUS_RECOVERY; + + /* prepare endpoint to receive the first BBB command */ + usbd_ep_recev (udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); +} + +/*! + \brief deinitialize the BBB machine + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void msc_bbb_deinit (usb_dev *udev) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->bbb_state = BBB_IDLE; +} + +/*! + \brief handle BBB data IN stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +void msc_bbb_data_in (usb_dev *udev, uint8_t ep_num) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + switch (msc->bbb_state) { + case BBB_DATA_IN: + if (scsi_process_cmd (udev, msc->bbb_cbw.bCBWLUN, &msc->bbb_cbw.CBWCB[0]) < 0) { + msc_bbb_csw_send (udev, CSW_CMD_FAILED); + } + break; + + case BBB_SEND_DATA: + case BBB_LAST_DATA_IN: + msc_bbb_csw_send (udev, CSW_CMD_PASSED); + break; + + default: + break; + } +} + +/*! + \brief handle BBB data OUT stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +void msc_bbb_data_out (usb_dev *udev, uint8_t ep_num) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + switch (msc->bbb_state) { + case BBB_IDLE: + msc_bbb_cbw_decode (udev); + break; + + case BBB_DATA_OUT: + if (scsi_process_cmd (udev, msc->bbb_cbw.bCBWLUN, &msc->bbb_cbw.CBWCB[0]) < 0) { + msc_bbb_csw_send (udev, CSW_CMD_FAILED); + } + break; + + default: + break; + } +} + +/*! + \brief send the CSW(command status wrapper) + \param[in] udev: pointer to USB device instance + \param[in] csw_status: CSW status + \param[out] none + \retval none +*/ +void msc_bbb_csw_send (usb_dev *udev, uint8_t csw_status) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->bbb_csw.dCSWSignature = BBB_CSW_SIGNATURE; + msc->bbb_csw.bCSWStatus = csw_status; + msc->bbb_state = BBB_IDLE; + + usbd_ep_send (udev, MSC_IN_EP, (uint8_t *)&msc->bbb_csw, BBB_CSW_LENGTH); + + /* prepare endpoint to receive next command */ + usbd_ep_recev (udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); +} + +/*! + \brief complete the clear feature request + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +void msc_bbb_clrfeature (usb_dev *udev, uint8_t ep_num) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + if (msc->bbb_status == BBB_STATUS_ERROR)/* bad CBW signature */ { + usbd_ep_stall(udev, MSC_IN_EP); + + msc->bbb_status = BBB_STATUS_NORMAL; + } else if(((ep_num & 0x80U) == 0x80U) && (msc->bbb_status != BBB_STATUS_RECOVERY)) { + msc_bbb_csw_send (udev, CSW_CMD_FAILED); + } else { + + } +} + +/*! + \brief decode the CBW command and set the BBB state machine accordingly + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void msc_bbb_cbw_decode (usb_dev *udev) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + uint16_t rx_len = udev->transc_out[MSC_OUT_EP].xfer_count; + + msc->bbb_csw.dCSWTag = msc->bbb_cbw.dCBWTag; + msc->bbb_csw.dCSWDataResidue = msc->bbb_cbw.dCBWDataTransferLength; + + if ((BBB_CBW_LENGTH != rx_len) || + (BBB_CBW_SIGNATURE != msc->bbb_cbw.dCBWSignature)|| + (msc->bbb_cbw.bCBWLUN > 1U) || + (msc->bbb_cbw.bCBWCBLength < 1U) || + (msc->bbb_cbw.bCBWCBLength > 16U)) { + /* illegal command handler */ + scsi_sense_code (udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + msc->bbb_status = BBB_STATUS_ERROR; + + msc_bbb_abort (udev); + } else { + if (scsi_process_cmd (udev, msc->bbb_cbw.bCBWLUN, &msc->bbb_cbw.CBWCB[0]) < 0) { + msc_bbb_abort (udev); + } else if ((BBB_DATA_IN != msc->bbb_state) && + (BBB_DATA_OUT != msc->bbb_state) && + (BBB_LAST_DATA_IN != msc->bbb_state)) { /* burst xfer handled internally */ + if (msc->bbb_datalen > 0U) { + msc_bbb_data_send (udev, msc->bbb_data, msc->bbb_datalen); + } else if (0U == msc->bbb_datalen) { + msc_bbb_csw_send (udev, CSW_CMD_PASSED); + } else { + + } + } else { + + } + } +} + +/*! + \brief send the requested data + \param[in] udev: pointer to USB device instance + \param[in] buf: pointer to data buffer + \param[in] len: data length + \param[out] none + \retval none +*/ +static void msc_bbb_data_send (usb_dev *udev, uint8_t *buf, uint32_t len) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + len = USB_MIN (msc->bbb_cbw.dCBWDataTransferLength, len); + + msc->bbb_csw.dCSWDataResidue -= len; + msc->bbb_csw.bCSWStatus = CSW_CMD_PASSED; + msc->bbb_state = BBB_SEND_DATA; + + usbd_ep_send (udev, MSC_IN_EP, buf, len); +} + +/*! + \brief abort the current transfer + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void msc_bbb_abort (usb_dev *udev) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + if ((0U == msc->bbb_cbw.bmCBWFlags) && + (0U != msc->bbb_cbw.dCBWDataTransferLength) && + (BBB_STATUS_NORMAL == msc->bbb_status)) { + usbd_ep_stall(udev, MSC_OUT_EP); + } + + usbd_ep_stall(udev, MSC_IN_EP); + + if (msc->bbb_status == BBB_STATUS_ERROR) { + usbd_ep_recev (udev, MSC_OUT_EP, (uint8_t *)&msc->bbb_cbw, BBB_CBW_LENGTH); + } +} diff --git b/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_core.c a/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_core.c new file mode 100644 index 0000000..b99e85c --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_core.c @@ -0,0 +1,316 @@ +/*! + \file usbd_msc_core.c + \brief USB MSC device class core functions + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-02-20, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_enum.h" +#include "usbd_msc_bbb.h" +#include "usbd_msc_core.h" +#include "usbd_transc.h" +#include + +#define USBD_VID 0x28E9U +#define USBD_PID 0x128FU + +/* local function prototypes ('static') */ +static uint8_t msc_core_init (usb_dev *udev, uint8_t config_index); +static uint8_t msc_core_deinit (usb_dev *udev, uint8_t config_index); +static uint8_t msc_core_req (usb_dev *udev, usb_req *req); +static void msc_core_in (usb_dev *udev, uint8_t ep_num); +static void msc_core_out (usb_dev *udev, uint8_t ep_num); + +usb_class msc_class = +{ + .init = msc_core_init, + .deinit = msc_core_deinit, + + .req_process = msc_core_req, + + .data_in = msc_core_in, + .data_out = msc_core_out +}; + +/* note: it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +const usb_desc_dev msc_dev_desc = +{ + .header = { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USBD_EP0_MAX_SIZE, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +const usb_desc_config_set msc_config_desc = +{ + .config = + { + .header = { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_MSC_CONFIG_DESC_SIZE, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xC0U, + .bMaxPower = 0x32U + }, + + .msc_itf = + { + .header = { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_CLASS_MSC, + .bInterfaceSubClass = USB_MSC_SUBCLASS_SCSI, + .bInterfaceProtocol = USB_MSC_PROTOCOL_BBB, + .iInterface = 0x00U + }, + + .msc_epin = + { + .header = { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = MSC_IN_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = MSC_EPIN_SIZE, + .bInterval = 0x00U + }, + + .msc_epout = + { + .header = { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = MSC_OUT_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = MSC_EPOUT_SIZE, + .bInterval = 0x00U + } +}; + +/* USB language ID descriptor */ +const usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static const usb_desc_str manufacturer_string = +{ + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static const usb_desc_str product_string = +{ + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'M', 'S', 'C'} +}; + +/* USBD serial string */ +static usb_desc_str serial_string = +{ + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR, + } +}; + +/* USB string descriptor */ +uint8_t* usbd_msc_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc msc_desc = { + .dev_desc = (uint8_t *)&msc_dev_desc, + .config_desc = (uint8_t *)&msc_config_desc, + .strings = usbd_msc_strings +}; + +static uint8_t usbd_msc_maxlun = 0U; + +/*! + \brief initialize the MSC device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t msc_core_init (usb_dev *udev, uint8_t config_index) +{ + static usbd_msc_handler msc_handler; + + memset((void *)&msc_handler, 0U, sizeof(usbd_msc_handler)); + + udev->class_data[USBD_MSC_INTERFACE] = (void *)&msc_handler; + + /* initialize Tx endpoint */ + usbd_ep_init(udev, EP_BUF_SNG, BULK_TX_ADDR, &(msc_config_desc.msc_epin)); + + /* initialize Rx endpoint */ + usbd_ep_init(udev, EP_BUF_SNG, BULK_RX_ADDR, &(msc_config_desc.msc_epout)); + + udev->ep_transc[EP_ID(MSC_IN_EP)][TRANSC_IN] = msc_class.data_in; + udev->ep_transc[MSC_OUT_EP][TRANSC_OUT] = msc_class.data_out; + + /* initialize the BBB layer */ + msc_bbb_init(udev); + + return USBD_OK; +} + +/*! + \brief deinitialize the MSC device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t msc_core_deinit (usb_dev *udev, uint8_t config_index) +{ + /* clear MSC endpoints */ + usbd_ep_deinit (udev, MSC_IN_EP); + usbd_ep_deinit (udev, MSC_OUT_EP); + + /* deinitialize the BBB layer */ + msc_bbb_deinit(udev); + + return USBD_OK; +} + +/*! + \brief handle the MSC class-specific and standard requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t msc_core_req (usb_dev *udev, usb_req *req) +{ + switch (req->bRequest) { + case BBB_GET_MAX_LUN : + if((0U == req->wValue) && + (1U == req->wLength) && + (0x80U == (req->bmRequestType & 0x80U))) { + usbd_msc_maxlun = (uint8_t)usbd_mem_fops->mem_maxlun(); + + usb_transc_config(&udev->transc_in[0], &usbd_msc_maxlun, 1U, 0U); + } else { + return USBD_FAIL; + } + break; + + case BBB_RESET : + if((0U == req->wValue) && + (0U == req->wLength) && + (0x80U != (req->bmRequestType & 0x80U))) { + msc_bbb_reset(udev); + } else { + return USBD_FAIL; + } + break; + + case USB_CLEAR_FEATURE: + msc_bbb_clrfeature (udev, (uint8_t)req->wIndex); + break; + + default: + return USBD_FAIL; + } + + return USBD_OK; +} + +/*! + \brief handle data in stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: the endpoint number + \param[out] none + \retval none +*/ +static void msc_core_in (usb_dev *udev, uint8_t ep_num) +{ + msc_bbb_data_in(udev, ep_num); +} + +/*! + \brief handle data out stage + \param[in] udev: pointer to USB device instance + \param[in] ep_num: the endpoint number + \param[out] none + \retval none +*/ +static void msc_core_out (usb_dev *udev, uint8_t ep_num) +{ + msc_bbb_data_out (udev, ep_num); +} diff --git b/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_data.c a/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_data.c new file mode 100644 index 0000000..43ff75f --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_data.c @@ -0,0 +1,74 @@ +/*! + \file msc_bbb_scsi.h + \brief the header file of the msc_bbb_scsi.c + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-02-20, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_msc_data.h" + +/* USB mass storage page 0 inquiry data */ +const uint8_t msc_page00_inquiry_data[] = +{ + 0x00U, + 0x00U, + 0x00U, + 0x00U, + (INQUIRY_PAGE00_LENGTH - 4U), + 0x80U, + 0x83U, +}; + +/* USB mass storage sense 6 data */ +const uint8_t msc_mode_sense6_data[] = +{ + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U +}; + +/* USB mass storage sense 10 data */ +const uint8_t msc_mode_sense10_data[] = +{ + 0x00U, + 0x06U, + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U, + 0x00U +}; diff --git b/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_scsi.c a/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_scsi.c new file mode 100644 index 0000000..b77c2aa --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/msc/Source/usbd_msc_scsi.c @@ -0,0 +1,729 @@ +/*! + \file usbd_msc_scsi.c + \brief USB SCSI layer functions + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-02-20, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_enum.h" +#include "usbd_msc_bbb.h" +#include "usbd_msc_scsi.h" +#include "usbd_msc_data.h" + +/* local function prototypes ('static') */ +static int8_t scsi_test_unit_ready (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_mode_select6 (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_mode_select10 (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_inquiry (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_read_format_capacity (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_read_capacity10 (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_request_sense (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_mode_sense6 (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_toc_cmd_read (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_mode_sense10 (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_write10 (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_read10 (usb_dev *udev, uint8_t lun, uint8_t *params); +static int8_t scsi_verify10 (usb_dev *udev, uint8_t lun, uint8_t *params); + +static int8_t scsi_process_read (usb_dev *udev, uint8_t lun); +static int8_t scsi_process_write (usb_dev *udev, uint8_t lun); + +static inline int8_t scsi_check_address_range (usb_dev *udev, uint8_t lun, uint32_t blk_offset, uint16_t blk_nbr); +static inline int8_t scsi_format_cmd (usb_dev *udev, uint8_t lun); +static inline int8_t scsi_start_stop_unit (usb_dev *udev, uint8_t lun, uint8_t *params); +static inline int8_t scsi_allow_medium_removal (usb_dev *udev, uint8_t lun, uint8_t *params); + +/*! + \brief process SCSI commands + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +int8_t scsi_process_cmd(usb_dev *udev, uint8_t lun, uint8_t *params) +{ + switch (params[0]) { + case SCSI_TEST_UNIT_READY: + return scsi_test_unit_ready (udev, lun, params); + + case SCSI_REQUEST_SENSE: + return scsi_request_sense (udev, lun, params); + + case SCSI_INQUIRY: + return scsi_inquiry (udev, lun, params); + + case SCSI_START_STOP_UNIT: + return scsi_start_stop_unit (udev, lun, params); + + case SCSI_ALLOW_MEDIUM_REMOVAL: + return scsi_allow_medium_removal (udev, lun, params); + + case SCSI_MODE_SENSE6: + return scsi_mode_sense6 (udev, lun, params); + + case SCSI_MODE_SENSE10: + return scsi_mode_sense10 (udev, lun, params); + + case SCSI_READ_FORMAT_CAPACITIES: + return scsi_read_format_capacity (udev, lun, params); + + case SCSI_READ_CAPACITY10: + return scsi_read_capacity10 (udev, lun, params); + + case SCSI_READ10: + return scsi_read10 (udev, lun, params); + + case SCSI_WRITE10: + return scsi_write10 (udev, lun, params); + + case SCSI_VERIFY10: + return scsi_verify10 (udev, lun, params); + + case SCSI_FORMAT_UNIT: + return scsi_format_cmd (udev, lun); + + case SCSI_READ_TOC_DATA: + return scsi_toc_cmd_read (udev, lun, params); + + case SCSI_MODE_SELECT6: + return scsi_mode_select6 (udev, lun, params); + + case SCSI_MODE_SELECT10: + return scsi_mode_select10 (udev, lun, params); + + default: + scsi_sense_code (udev, lun, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } +} + +/*! + \brief load the last error code in the error list + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] skey: sense key + \param[in] asc: additional sense key + \param[out] none + \retval none +*/ +void scsi_sense_code (usb_dev *udev, uint8_t lun, uint8_t skey, uint8_t asc) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->scsi_sense[msc->scsi_sense_tail].SenseKey = skey; + msc->scsi_sense[msc->scsi_sense_tail].ASC = asc << 8U; + msc->scsi_sense_tail++; + + if (SENSE_LIST_DEEPTH == msc->scsi_sense_tail) { + msc->scsi_sense_tail = 0U; + } +} + +/*! + \brief process SCSI Test Unit Ready command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_test_unit_ready (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + /* case 9 : Hi > D0 */ + if (0U != msc->bbb_cbw.dCBWDataTransferLength) { + scsi_sense_code (udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + if (0 != usbd_mem_fops->mem_ready(lun)) { + scsi_sense_code(udev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + + return -1; + } + +// if (1U == msc->scsi_disk_pop) { +// usbd_disconnect (udev); +// } + + msc->bbb_datalen = 0U; + + return 0; +} + +/*! + \brief process Inquiry command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_mode_select6 (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = 0U; + + return 0; +} + +/*! + \brief process Inquiry command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_mode_select10 (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = 0U; + + return 0; +} + +/*! + \brief process Inquiry command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_inquiry (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + uint8_t *page = NULL; + uint16_t len = 0U; + + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + if (params[1] & 0x01U) { + page = (uint8_t *)msc_page00_inquiry_data; + + len = INQUIRY_PAGE00_LENGTH; + } else { + page = (uint8_t *)usbd_mem_fops->mem_inquiry_data[lun]; + + len = (uint16_t)(page[4] + 5U); + + if (params[4] <= len) { + len = params[4]; + } + } + + msc->bbb_datalen = len; + + while (len) { + len--; + msc->bbb_data[len] = page[len]; + } + + return 0; +} + +/*! + \brief process Read Capacity 10 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_read_capacity10 (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + uint32_t blk_num = usbd_mem_fops->mem_block_len[lun] - 1U; + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->scsi_blk_nbr[lun] = usbd_mem_fops->mem_block_len[lun]; + msc->scsi_blk_size[lun] = usbd_mem_fops->mem_block_size[lun]; + + msc->bbb_data[0] = (uint8_t)(blk_num >> 24U); + msc->bbb_data[1] = (uint8_t)(blk_num >> 16U); + msc->bbb_data[2] = (uint8_t)(blk_num >> 8U); + msc->bbb_data[3] = (uint8_t)(blk_num); + + msc->bbb_data[4] = (uint8_t)(msc->scsi_blk_size[lun] >> 24U); + msc->bbb_data[5] = (uint8_t)(msc->scsi_blk_size[lun] >> 16U); + msc->bbb_data[6] = (uint8_t)(msc->scsi_blk_size[lun] >> 8U); + msc->bbb_data[7] = (uint8_t)(msc->scsi_blk_size[lun]); + + msc->bbb_datalen = 8U; + + return 0; +} + +/*! + \brief process Read Format Capacity command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_read_format_capacity (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + uint16_t i = 0U; + uint32_t blk_size = usbd_mem_fops->mem_block_size[lun]; + uint32_t blk_num = usbd_mem_fops->mem_block_len[lun]; + uint32_t blk_nbr = blk_num - 1U; + + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + for (i = 0U; i < 12U; i++) { + msc->bbb_data[i] = 0U; + } + + msc->bbb_data[3] = 0x08U; + msc->bbb_data[4] = (uint8_t)(blk_nbr >> 24U); + msc->bbb_data[5] = (uint8_t)(blk_nbr >> 16U); + msc->bbb_data[6] = (uint8_t)(blk_nbr >> 8U); + msc->bbb_data[7] = (uint8_t)(blk_nbr); + + msc->bbb_data[8] = 0x02U; + msc->bbb_data[9] = (uint8_t)(blk_size >> 16U); + msc->bbb_data[10] = (uint8_t)(blk_size >> 8U); + msc->bbb_data[11] = (uint8_t)(blk_size); + + msc->bbb_datalen = 12U; + + return 0; +} + +/*! + \brief process Mode Sense6 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_mode_sense6 (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + uint16_t len = 8U; + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = len; + + while (len) { + len--; + msc->bbb_data[len] = msc_mode_sense6_data[len]; + } + + return 0; +} + +/*! + \brief process Mode Sense10 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_mode_sense10 (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + uint16_t len = 8U; + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = len; + + while (len) { + len--; + msc->bbb_data[len] = msc_mode_sense10_data[len]; + } + + return 0; +} + +/*! + \brief process Request Sense command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_request_sense (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + uint8_t i = 0U; + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + for (i = 0U; i < REQUEST_SENSE_DATA_LEN; i++) { + msc->bbb_data[i] = 0U; + } + + msc->bbb_data[0] = 0x70U; + msc->bbb_data[7] = REQUEST_SENSE_DATA_LEN - 6U; + + if ((msc->scsi_sense_head != msc->scsi_sense_tail)) { + msc->bbb_data[2] = msc->scsi_sense[msc->scsi_sense_head].SenseKey; + msc->bbb_data[12] = msc->scsi_sense[msc->scsi_sense_head].ASCQ; + msc->bbb_data[13] = msc->scsi_sense[msc->scsi_sense_head].ASC; + msc->scsi_sense_head++; + + if (msc->scsi_sense_head == SENSE_LIST_DEEPTH) { + msc->scsi_sense_head = 0U; + } + } + + msc->bbb_datalen = USB_MIN(REQUEST_SENSE_DATA_LEN, params[4]); + + return 0; +} + +/*! + \brief process Start Stop Unit command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static inline int8_t scsi_start_stop_unit (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = 0U; +// msc->scsi_disk_pop = 1U; + + return 0; +} + +/*! + \brief process Allow Medium Removal command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static inline int8_t scsi_allow_medium_removal (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + msc->bbb_datalen = 0U; + + return 0; +} + +/*! + \brief process Read10 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_read10 (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + if (msc->bbb_state == BBB_IDLE) { + /* direction is from device to host */ + if (0x80U != (msc->bbb_cbw.bmCBWFlags & 0x80U)) { + scsi_sense_code (udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + if (0 != usbd_mem_fops->mem_ready(lun)) { + scsi_sense_code (udev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + + return -1; + } + + msc->scsi_blk_addr = (params[2] << 24U) | (params[3] << 16U) | \ + (params[4] << 8U) | params[5]; + + msc->scsi_blk_len = (params[7] << 8U) | params[8]; + + if (scsi_check_address_range (udev, lun, msc->scsi_blk_addr, (uint16_t)msc->scsi_blk_len) < 0) { + return -1; /* error */ + } + + msc->bbb_state = BBB_DATA_IN; + + msc->scsi_blk_addr *= msc->scsi_blk_size[lun]; + msc->scsi_blk_len *= msc->scsi_blk_size[lun]; + + /* cases 4,5 : Hi <> Dn */ + if (msc->bbb_cbw.dCBWDataTransferLength != msc->scsi_blk_len) { + scsi_sense_code (udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + } + + msc->bbb_datalen = MSC_MEDIA_PACKET_SIZE; + + return scsi_process_read (udev, lun); +} + +/*! + \brief process Write10 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_write10 (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + if (BBB_IDLE == msc->bbb_state) { + /* case 8 : Hi <> Do */ + if (0x80U == (msc->bbb_cbw.bmCBWFlags & 0x80U)) { + scsi_sense_code (udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + /* check whether media is ready */ + if (0 != usbd_mem_fops->mem_ready(lun)) { + scsi_sense_code (udev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + + return -1; + } + + /* check if media is write-protected */ + if (0 != usbd_mem_fops->mem_protected(lun)) { + scsi_sense_code (udev, lun, NOT_READY, WRITE_PROTECTED); + + return -1; + } + + msc->scsi_blk_addr = (params[2] << 24U) | (params[3] << 16U) | \ + (params[4] << 8U) | params[5]; + + msc->scsi_blk_len = (params[7] << 8U) | params[8]; + + /* check if LBA address is in the right range */ + if (scsi_check_address_range (udev, lun, msc->scsi_blk_addr, (uint16_t)msc->scsi_blk_len) < 0) { + return -1; /* error */ + } + + msc->scsi_blk_addr *= msc->scsi_blk_size[lun]; + msc->scsi_blk_len *= msc->scsi_blk_size[lun]; + + /* cases 3,11,13 : Hn,Ho <> D0 */ + if (msc->bbb_cbw.dCBWDataTransferLength != msc->scsi_blk_len) { + scsi_sense_code (udev, msc->bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + /* prepare endpoint to receive first data packet */ + msc->bbb_state = BBB_DATA_OUT; + + usbd_ep_recev (udev, + MSC_OUT_EP, + msc->bbb_data, + USB_MIN (msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE)); + } else { /* write process ongoing */ + return scsi_process_write (udev, lun); + } + + return 0; +} + +/*! + \brief process Verify10 command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_verify10 (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + if (0x02U == (params[1] & 0x02U)) { + scsi_sense_code (udev, lun, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + + return -1; /* error, verify mode not supported*/ + } + + if (scsi_check_address_range (udev, lun, msc->scsi_blk_addr, (uint16_t)msc->scsi_blk_len) < 0) { + return -1; /* error */ + } + + msc->bbb_datalen = 0U; + + return 0; +} + +/*! + \brief check address range + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] blk_offset: block offset + \param[in] blk_nbr: number of block to be processed + \param[out] none + \retval status +*/ +static inline int8_t scsi_check_address_range (usb_dev *udev, uint8_t lun, uint32_t blk_offset, uint16_t blk_nbr) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + if ((blk_offset + blk_nbr) > msc->scsi_blk_nbr[lun]) { + scsi_sense_code (udev, lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); + + return -1; + } + + return 0; +} + +/*! + \brief handle read process + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[out] none + \retval status +*/ +static int8_t scsi_process_read (usb_dev *udev, uint8_t lun) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + uint32_t len = USB_MIN(msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE); + + if (usbd_mem_fops->mem_read(lun, + msc->bbb_data, + msc->scsi_blk_addr, + (uint16_t)(len / msc->scsi_blk_size[lun])) < 0) { + scsi_sense_code(udev, lun, HARDWARE_ERROR, UNRECOVERED_READ_ERROR); + + return -1; + } + + usbd_ep_send (udev, MSC_IN_EP, msc->bbb_data, len); + + msc->scsi_blk_addr += len; + msc->scsi_blk_len -= len; + + /* case 6 : Hi = Di */ + msc->bbb_csw.dCSWDataResidue -= len; + + if (0U == msc->scsi_blk_len) { + msc->bbb_state = BBB_LAST_DATA_IN; + } + + return 0; +} + +/*! + \brief handle write process + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[out] none + \retval status +*/ +static int8_t scsi_process_write (usb_dev *udev, uint8_t lun) +{ + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + uint32_t len = USB_MIN(msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE); + + if (usbd_mem_fops->mem_write (lun, + msc->bbb_data, + msc->scsi_blk_addr, + (uint16_t)(len / msc->scsi_blk_size[lun])) < 0) { + scsi_sense_code(udev, lun, HARDWARE_ERROR, WRITE_FAULT); + + return -1; + } + + msc->scsi_blk_addr += len; + msc->scsi_blk_len -= len; + + /* case 12 : Ho = Do */ + msc->bbb_csw.dCSWDataResidue -= len; + + if (0U == msc->scsi_blk_len) { + msc_bbb_csw_send (udev, CSW_CMD_PASSED); + } else { + /* prepare endpoint to receive next packet */ + usbd_ep_recev (udev, + MSC_OUT_EP, + msc->bbb_data, + USB_MIN (msc->scsi_blk_len, MSC_MEDIA_PACKET_SIZE)); + } + + return 0; +} + +/*! + \brief process Format Unit command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[out] none + \retval status +*/ +static inline int8_t scsi_format_cmd (usb_dev *udev, uint8_t lun) +{ + return 0; +} + +/*! + \brief process Read_Toc command + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval status +*/ +static int8_t scsi_toc_cmd_read (usb_dev *udev, uint8_t lun, uint8_t *params) +{ + uint8_t* pPage; + uint16_t len; + + usbd_msc_handler *msc = (usbd_msc_handler *)udev->class_data[USBD_MSC_INTERFACE]; + + pPage = (uint8_t *)&usbd_mem_fops->mem_toc_data[lun * READ_TOC_CMD_LEN]; + len = (uint16_t)pPage[1] + 2U; + + msc->bbb_datalen = len; + + while (len) { + len--; + msc->bbb_data[len] = pPage[len]; + } + + return 0; +} diff --git b/Drivers/GD32F30x_usbd_library/class/device/printer/Include/printer_core.h a/Drivers/GD32F30x_usbd_library/class/device/printer/Include/printer_core.h new file mode 100644 index 0000000..f6f76a9 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/printer/Include/printer_core.h @@ -0,0 +1,73 @@ +/*! + \file printer_core.h + \brief the header file of USB printer device class core functions + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __PRINTER_CORE_H +#define __PRINTER_CORE_H + +#include "usbd_enum.h" + +/* USB printing device class code */ +#define USB_CLASS_PRINTER 0x07U + +/* printing device subclass code */ +#define USB_SUBCLASS_PRINTER 0x01U + +/* printing device protocol code */ +#define PROTOCOL_UNIDIRECTIONAL_ITF 0x01U +#define PROTOCOL_BI_DIRECTIONAL_ITF 0x02U +#define PROTOCOL_1284_4_ITF 0x03U +#define PROTOCOL_VENDOR 0xFFU + +#define DEVICE_ID_LEN 103U + +#define USB_PRINTER_CONFIG_DESC_LEN 32U + +/* printing device specific-class request */ +#define GET_DEVICE_ID 0x00U +#define GET_PORT_STATUS 0x01U +#define SOFT_RESET 0x02U + +/* USB configuration descriptor structure */ +typedef struct +{ + usb_desc_config config; + usb_desc_itf printer_itf; + usb_desc_ep printer_epin; + usb_desc_ep printer_epout; +} usb_printer_desc_config_set; + +extern usb_desc printer_desc; +extern usb_class printer_class; + +#endif /* __PRINTER_CORE_H */ diff --git b/Drivers/GD32F30x_usbd_library/class/device/printer/Source/printer_core.c a/Drivers/GD32F30x_usbd_library/class/device/printer/Source/printer_core.c new file mode 100644 index 0000000..871806e --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/class/device/printer/Source/printer_core.c @@ -0,0 +1,310 @@ +/*! + \file printer_core.c + \brief USB printer device class core functions + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_transc.h" +#include "printer_core.h" + +#define USBD_VID 0x28E9U +#define USBD_PID 0x028DU + +/* printer port status: paper not empty/selected/no error */ +static uint8_t g_port_status = 0x18U; +uint8_t g_printer_data_buf[PRINTER_OUT_PACKET]; + +uint8_t Printer_DEVICE_ID[DEVICE_ID_LEN] = +{ + 0x00, 0x67, + 'M', 'A', 'N', 'U', 'F', 'A', 'C', 'T', 'U', 'R', 'E', 'R', ':', + 'G', 'I', 'G', 'A', ' ', 'D', 'E', 'V', 'I', 'C', 'E', '-', ';', + 'C', 'O', 'M', 'M', 'A', 'N', 'D', ' ', 'S', 'E', 'T', ':', + 'P', 'C', 'L', ',', 'M', 'P', 'L', ';', + 'M', 'O', 'D', 'E', 'L', ':', + 'L', 'a', 's', 'e', 'r', 'B', 'e', 'a', 'm', '?', ';', + 'C', 'O', 'M', 'M', 'E', 'N', 'T', ':', + 'G', 'o', 'o', 'd', ' ', '!', ';', + 'A', 'C', 'T', 'I', 'V', 'E', ' ', 'C', 'O', 'M', 'M', 'A', 'N', 'D', ' ', 'S', 'E', 'T', ':', + 'P', 'C', 'L', ';' +}; + +/* USB standard device descriptor */ +usb_desc_dev printer_dev_desc = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV, + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USBD_EP0_MAX_SIZE, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM, +}; + +/* USB device configuration descriptor */ +usb_printer_desc_config_set printer_config_desc = +{ + .config = + { + .header = + { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_PRINTER_CONFIG_DESC_LEN, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xA0U, + .bMaxPower = 0x32U + }, + + .printer_itf = + { + .header = + { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_CLASS_PRINTER, + .bInterfaceSubClass = USB_SUBCLASS_PRINTER, + .bInterfaceProtocol = PROTOCOL_BI_DIRECTIONAL_ITF, + .iInterface = 0x00U + }, + + .printer_epin = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = PRINTER_IN_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = PRINTER_IN_PACKET, + .bInterval = 0x00U + }, + + .printer_epout = + { + .header = + { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = PRINTER_OUT_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = PRINTER_OUT_PACKET, + .bInterval = 0x00U + }, +}; + +/* USB language ID Descriptor */ +static usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .wLANGID = ENG_LANGID +}; + +/* USB manufacture string */ +static usb_desc_str manufacturer_string = +{ + .header = + { + .bLength = USB_STRING_LEN(10U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'i', 'g', 'a', 'D', 'e', 'v', 'i', 'c', 'e'} +}; + +/* USB product string */ +static usb_desc_str product_string = +{ + .header = + { + .bLength = USB_STRING_LEN(16U), + .bDescriptorType = USB_DESCTYPE_STR, + }, + .unicode_string = {'G', 'D', '3', '2', '-', 'U', 'S', 'B', '_', 'P', 'r', 'i', 'n', 't', 'e', 'r'} +}; + +/* USBD serial string */ +static usb_desc_str serial_string = +{ + .header = + { + .bLength = USB_STRING_LEN(12U), + .bDescriptorType = USB_DESCTYPE_STR, + } +}; + +/* USB string descriptor */ +static uint8_t* usbd_msc_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = (uint8_t *)&manufacturer_string, + [STR_IDX_PRODUCT] = (uint8_t *)&product_string, + [STR_IDX_SERIAL] = (uint8_t *)&serial_string +}; + +usb_desc printer_desc = { + .dev_desc = (uint8_t *)&printer_dev_desc, + .config_desc = (uint8_t *)&printer_config_desc, + .strings = usbd_msc_strings +}; + +/* local function prototypes ('static') */ +static uint8_t printer_init (usb_dev *udev, uint8_t config_index); +static uint8_t printer_deinit (usb_dev *udev, uint8_t config_index); +static uint8_t printer_req_handler (usb_dev *udev, usb_req *req); +static void printer_data_in (usb_dev *udev, uint8_t ep_num); +static void printer_data_out (usb_dev *udev, uint8_t ep_num); + +usb_class printer_class = { + .init = printer_init, + .deinit = printer_deinit, + .req_process = printer_req_handler, + .data_in = printer_data_in, + .data_out = printer_data_out +}; +/*! + \brief initialize the printer device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t printer_init (usb_dev *udev, uint8_t config_index) +{ + /* initialize the data Tx/Rx endpoint */ + usbd_ep_init(udev, EP_BUF_SNG, BULK_TX_ADDR, &(printer_config_desc.printer_epin)); + usbd_ep_init(udev, EP_BUF_SNG, BULK_RX_ADDR, &(printer_config_desc.printer_epout)); + + udev->ep_transc[EP_ID(PRINTER_IN_EP)][TRANSC_IN] = printer_class.data_in; + udev->ep_transc[PRINTER_OUT_EP][TRANSC_OUT] = printer_class.data_out; + + /* prepare to receive data */ + usbd_ep_recev(udev, PRINTER_OUT_EP, g_printer_data_buf, PRINTER_OUT_PACKET); + + return USBD_OK; +} + +/*! + \brief de-initialize the printer device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t printer_deinit (usb_dev *udev, uint8_t config_index) +{ + /* deinitialize the data Tx/Rx endpoint */ + usbd_ep_deinit(udev, PRINTER_IN_EP); + usbd_ep_deinit(udev, PRINTER_OUT_EP); + + return USBD_OK; +} + +/*! + \brief handle the printer class-specific requests + \param[in] udev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t printer_req_handler (usb_dev *udev, usb_req *req) +{ + uint8_t status = REQ_NOTSUPP; + + switch (req->bRequest) { + case GET_DEVICE_ID: + usb_transc_config(&udev->transc_in[0], Printer_DEVICE_ID, DEVICE_ID_LEN, 0U); + + status = REQ_SUPP; + break; + + case GET_PORT_STATUS: + usb_transc_config(&udev->transc_in[0], (uint8_t *)&g_port_status, 1U, 0U); + + status = REQ_SUPP; + break; + + case SOFT_RESET: + usbd_ep_recev(udev, PRINTER_OUT_EP, g_printer_data_buf, PRINTER_OUT_PACKET); + + status = REQ_SUPP; + break; + + default: + break; + } + + return status; +} + +/*! + \brief handle printer data + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +static void printer_data_in (usb_dev *udev, uint8_t ep_num) +{ +} + +/*! + \brief handle printer data + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +static void printer_data_out (usb_dev *udev, uint8_t ep_num) +{ +} diff --git b/Drivers/GD32F30x_usbd_library/device/Include/usb_ch9_std.h a/Drivers/GD32F30x_usbd_library/device/Include/usb_ch9_std.h new file mode 100644 index 0000000..153413d --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/device/Include/usb_ch9_std.h @@ -0,0 +1,212 @@ +/*! + \file usb_ch9_std.h + \brief USB 2.0 standard defines + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_CH9_STD_H +#define __USB_CH9_STD_H + +#include "usbd_conf.h" + +#define USB_DEV_QUALIFIER_DESC_LEN 0x0AU /*!< USB device qualifier descriptor length */ +#define USB_DEV_DESC_LEN 0x12U /*!< USB device descriptor length */ +#define USB_CFG_DESC_LEN 0x09U /*!< USB configuration descriptor length */ +#define USB_ITF_DESC_LEN 0x09U /*!< USB interface descriptor length */ +#define USB_EP_DESC_LEN 0x07U /*!< USB endpoint descriptor length */ +#define USB_BOS_DESC_LEN 0x0CU /*!< USB BOS descriptor length */ +#define USB_OTG_DESC_LEN 0x03U /*!< USB device OTG descriptor length */ +#define USB_SETUP_PACKET_LEN 0x08U /*!< USB SETUP packet length */ +#define USB_DEVICE_CAPABITY 0x10U /*!< USB device capabity */ + + +/* bit 7 of bmRequestType: data phase transfer direction */ +#define USB_TRX_MASK 0x80U /*!< USB transfer direction mask */ +#define USB_TRX_OUT 0x00U /*!< USB transfer OUT direction */ +#define USB_TRX_IN 0x80U /*!< USB transfer IN direction */ + +/* bit 6..5 of bmRequestType: request type */ +#define USB_REQTYPE_STRD 0x00U /*!< USB standard request */ +#define USB_REQTYPE_CLASS 0x20U /*!< USB class request */ +#define USB_REQTYPE_VENDOR 0x40U /*!< USB vendor request */ +#define USB_REQTYPE_MASK 0x60U /*!< USB request mask */ + +#define USBD_BUS_POWERED 0x00U /*!< USB bus power supply */ +#define USBD_SELF_POWERED 0x01U /*!< USB self power supply */ + +#define USB_STATUS_REMOTE_WAKEUP 2U /*!< USB is in remote wakeup status */ +#define USB_STATUS_SELF_POWERED 1U /*!< USB is in self powered status */ + +/* bit 4..0 of bmRequestType: recipient type */ +enum _usb_recp_type { + USB_RECPTYPE_DEV = 0x0U, /*!< USB device request type */ + USB_RECPTYPE_ITF = 0x1U, /*!< USB interface request type */ + USB_RECPTYPE_EP = 0x2U, /*!< USB endpoint request type */ + USB_RECPTYPE_MASK = 0x3U /*!< USB request type mask */ +}; + +/* bRequest value */ +enum _usb_request { + USB_GET_STATUS = 0x0U, /*!< USB get status request */ + USB_CLEAR_FEATURE = 0x1U, /*!< USB clear feature request */ + USB_RESERVED2 = 0x2U, /*!< USB reserved2 */ + USB_SET_FEATURE = 0x3U, /*!< USB set feature request */ + USB_RESERVED4 = 0x4U, /*!< USB reserved4 */ + USB_SET_ADDRESS = 0x5U, /*!< USB set address request */ + USB_GET_DESCRIPTOR = 0x6U, /*!< USB get descriptor request */ + USB_SET_DESCRIPTOR = 0x7U, /*!< USB set descriptor request */ + USB_GET_CONFIGURATION = 0x8U, /*!< USB get configuration request */ + USB_SET_CONFIGURATION = 0x9U, /*!< USB set configuration request */ + USB_GET_INTERFACE = 0xAU, /*!< USB get interface request */ + USB_SET_INTERFACE = 0xBU, /*!< USB set interface request */ + USB_SYNCH_FRAME = 0xCU /*!< USB synchronized frame request */ +}; + +/* descriptor types of USB specifications */ +enum _usb_desctype { + USB_DESCTYPE_DEV = 0x1U, /*!< USB device descriptor type */ + USB_DESCTYPE_CONFIG = 0x2U, /*!< USB configuration descriptor type */ + USB_DESCTYPE_STR = 0x3U, /*!< USB string descriptor type */ + USB_DESCTYPE_ITF = 0x4U, /*!< USB interface descriptor type */ + USB_DESCTYPE_EP = 0x5U, /*!< USB endpoint descriptor type */ + USB_DESCTYPE_DEV_QUALIFIER = 0x6U, /*!< USB device qualifier descriptor type */ + USB_DESCTYPE_OTHER_SPD_CONFIG = 0x7U, /*!< USB other speed configuration descriptor type */ + USB_DESCTYPE_ITF_POWER = 0x8U, /*!< USB interface power descriptor type */ + USB_DESCTYPE_BOS = 0xFU /*!< USB BOS descriptor type */ +}; + +/* USB endpoint descriptor bmAttributes bit definitions */ +/* bits 1..0 : transfer type */ +enum _usbx_type { + USB_EP_ATTR_CTL = 0x0U, /*!< USB endpoint control attributes*/ + USB_EP_ATTR_ISO = 0x1U, /*!< USB endpoint isochronous attributes*/ + USB_EP_ATTR_BULK = 0x2U, /*!< USB endpoint bulk attributes*/ + USB_EP_ATTR_INT = 0x3U /*!< USB endpoint interrupt attributes*/ +}; + +/* bits 3..2 : Sync type (only if ISOCHRONOUS) */ +#define USB_EP_ATTR_NOSYNC 0x00U /*!< USB endpoint no SYNC attributes*/ +#define USB_EP_ATTR_ASYNC 0x04U /*!< USB endpoint ASYNC attributes*/ +#define USB_EP_ATTR_ADAPTIVE 0x08U /*!< USB endpoint adaptive attributes*/ +#define USB_EP_ATTR_SYNC 0x0CU /*!< USB endpoint SYNC attributes*/ +#define USB_EP_ATTR_SYNCTYPE 0x0CU /*!< USB endpoint SYNC type attributes*/ + +/* bits 5..4 : usage type (only if ISOCHRONOUS) */ +#define USB_EP_ATTR_DATA 0x00U /*!< USB endpoint data attributes*/ +#define USB_EP_ATTR_FEEDBACK 0x10U /*!< USB endpoint feedback attributes*/ +#define USB_EP_ATTR_IMPLICIT_FEEDBACK_DATA 0x20U /*!< USB endpoint implicit feedback attributes*/ +#define USB_EP_ATTR_USAGETYPE 0x30U /*!< USB endpoint usage type attributes*/ + +#pragma pack(1) + +/* USB standard device request structure */ +typedef struct _usb_req { + uint8_t bmRequestType; /*!< type of request */ + uint8_t bRequest; /*!< request of setup packet */ + uint16_t wValue; /*!< value of setup packet */ + uint16_t wIndex; /*!< index of setup packet */ + uint16_t wLength; /*!< length of setup packet */ +} usb_req; + +/* USB setup packet definition */ +typedef union _usb_setup { + uint8_t data[8]; /*!< USB setup data */ + + usb_req req; /*!< USB setup request */ +} usb_setup; + +/* USB descriptor definition */ +typedef struct _usb_desc_header { + uint8_t bLength; /*!< size of the descriptor */ + uint8_t bDescriptorType; /*!< type of the descriptor */ +} usb_desc_header; + +typedef struct _usb_desc_dev { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint16_t bcdUSB; /*!< BCD of the supported USB specification */ + uint8_t bDeviceClass; /*!< USB device class */ + uint8_t bDeviceSubClass; /*!< USB device subclass */ + uint8_t bDeviceProtocol; /*!< USB device protocol */ + uint8_t bMaxPacketSize0; /*!< size of the control (address 0) endpoint's bank in bytes */ + uint16_t idVendor; /*!< vendor ID for the USB product */ + uint16_t idProduct; /*!< unique product ID for the USB product */ + uint16_t bcdDevice; /*!< product release (version) number */ + uint8_t iManufacturer; /*!< string index for the manufacturer's name */ + uint8_t iProduct; /*!< string index for the product name/details */ + uint8_t iSerialNumber; /*!< string index for the product's globally unique hexadecimal serial number */ + uint8_t bNumberConfigurations; /*!< total number of configurations supported by the device */ +} usb_desc_dev; + +typedef struct _usb_desc_config { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint16_t wTotalLength; /*!< size of the configuration descriptor header, and all sub descriptors inside the configuration */ + uint8_t bNumInterfaces; /*!< total number of interfaces in the configuration */ + uint8_t bConfigurationValue; /*!< configuration index of the current configuration */ + uint8_t iConfiguration; /*!< index of a string descriptor describing the configuration */ + uint8_t bmAttributes; /*!< configuration attributes */ + uint8_t bMaxPower; /*!< maximum power consumption of the device while in the current configuration */ +} usb_desc_config; + +typedef struct _usb_desc_itf { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bInterfaceNumber; /*!< index of the interface in the current configuration */ + uint8_t bAlternateSetting; /*!< alternate setting for the interface number */ + uint8_t bNumEndpoints; /*!< total number of endpoints in the interface */ + uint8_t bInterfaceClass; /*!< interface class ID */ + uint8_t bInterfaceSubClass; /*!< interface subclass ID */ + uint8_t bInterfaceProtocol; /*!< interface protocol ID */ + uint8_t iInterface; /*!< index of the string descriptor describing the interface */ +} usb_desc_itf; + +typedef struct _usb_desc_ep { + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bEndpointAddress; /*!< logical address of the endpoint */ + uint8_t bmAttributes; /*!< endpoint attribute */ + uint16_t wMaxPacketSize; /*!< size of the endpoint bank, in bytes */ + uint8_t bInterval; /*!< polling interval in milliseconds for the endpoint if it is an INTERRUPT or ISOCHRONOUS type */ +} usb_desc_ep; + +typedef struct _usb_desc_LANGID { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint16_t wLANGID; /*!< LANGID code */ +} usb_desc_LANGID; + +typedef struct _usb_desc_str { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint16_t unicode_string[64]; /*!< unicode string data */ +} usb_desc_str; + +#pragma pack() + +/* compute string descriptor length */ +#define USB_STRING_LEN(unicode_chars) (sizeof(usb_desc_header) + ((unicode_chars) << 1)) + +#endif /* __USB_CH9_STD_H */ diff --git b/Drivers/GD32F30x_usbd_library/device/Include/usbd_core.h a/Drivers/GD32F30x_usbd_library/device/Include/usbd_core.h new file mode 100644 index 0000000..ab5a507 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/device/Include/usbd_core.h @@ -0,0 +1,340 @@ +/*! + \file usbd_core.h + \brief USB device driver core + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-08-10, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_CORE_H +#define __USBD_CORE_H + +#include "usb_ch9_std.h" + +/* endpoints definitions */ +#define EP_IN(x) ((uint8_t)(0x80U | (x))) +#define EP_OUT(x) ((uint8_t)(x)) + +#define EP_DIR(x) ((uint8_t)((x) >> 7U)) +#define EP_ID(x) ((uint8_t)((x) & 0x7FU)) + +/* USB device endpoint0 max packet size */ +#define USBD_EP0_MAX_SIZE 64U + +#define USBD_TRANSC_COUNT 3U + +/* USB device operation status */ +enum usbd_status { + USBD_UNCONNECTED = 0U, /*!< USB device unconnected status */ + USBD_DEFAULT, /*!< USB device default status */ + USBD_ADDRESSED, /*!< USB device addressed status */ + USBD_CONFIGURED, /*!< USB device configured status */ + USBD_SUSPENDED, /*!< USB device suspended status */ + USBD_CONNECTED /*!< USB device connected status */ +}; + +/* USB device operation state */ +enum usbd_state { + USBD_OK = 0U, /*!< USB device OK state */ + USBD_BUSY, /*!< USB device busy state */ + USBD_FAIL /*!< USB device fail state */ +}; + +/* USB device transaction type */ +enum usbd_transc { + TRANSC_SETUP = 0U, /*!< SETUP transaction */ + TRANSC_OUT, /*!< OUT transaction */ + TRANSC_IN, /*!< IN transaction */ + TRANSC_UNKNOWN /*!< unknown transaction */ +}; + +/* USB device endpoint buffer type */ +enum usbd_ep_kind { + EP_BUF_SNG = 0U, /*!< single buffer endpoint type value */ + EP_BUF_DBL /*!< double buffer endpoint type value */ +}; + +/* USB device transaction struct */ +typedef struct { + uint16_t max_len; /*!< packet max length */ + uint8_t ep_stall; /*!< endpoint STALL */ + + uint8_t *xfer_buf; /*!< transfer buffer */ + uint16_t xfer_len; /*!< transfer length */ + uint16_t xfer_count; /*!< transfer count */ +} usb_transc; + +/* USB device basic struct */ +typedef struct { + uint8_t max_ep_count; /*!< endpoint max count */ + uint8_t twin_buf; /*!< double buffer */ + uint16_t ram_size; /*!< ram size */ +} usb_basic; + +/* USB descriptor */ +typedef struct { + uint8_t *dev_desc; /*!< device descriptor */ + uint8_t *config_desc; /*!< configure descriptor */ + uint8_t *bos_desc; /*!< bos descriptor */ + uint8_t **strings; /*!< strings descriptor */ +} usb_desc; + +/* USB power management */ +typedef struct { + uint8_t power_mode; /*!< power mode */ + uint8_t power_low; /*!< power low */ + uint8_t esof_count; /*!< ESOF count */ + uint8_t suspend_enabled; /*!< suspend enabled flag */ + uint8_t remote_wakeup; /*!< remote wakeup */ + uint8_t remote_wakeup_on; /*!< remote wakeup enable */ + uint8_t lpm_enable; /*!< LPM enable */ +} usb_pm; + +/* USB LPM management */ +typedef struct { + uint32_t besl; /*!< besl */ + uint32_t L1_resume; /*!< L1 resume */ + uint32_t L1_remote_wakeup; /*!< L1 remote wakeup */ +} usb_lpm; + +/* USB control information */ +typedef struct { + usb_req req; /*!< USB request */ + uint8_t ctl_zlp; /*!< control zero length packet */ +} usb_control; + +typedef struct _usb_dev usb_dev; +typedef struct _usb_handler usb_handler; +typedef void (*usb_ep_transc) (usb_dev *usbd_dev, uint8_t ep_num); + +/* USB class struct */ +typedef struct { + uint8_t req_cmd; + uint8_t req_altset; + + uint8_t (*init) (usb_dev *udev, uint8_t config_index); + uint8_t (*deinit) (usb_dev *udev, uint8_t config_index); + + uint8_t (*req_process) (usb_dev *udev, usb_req *req); + + uint8_t (*ctlx_in) (usb_dev *udev); + uint8_t (*ctlx_out) (usb_dev *udev); + + void (*data_in) (usb_dev *udev, uint8_t ep_num); + void (*data_out) (usb_dev *udev, uint8_t ep_num); +} usb_class; + +/* USB core driver struct */ +struct _usb_dev { + /* basic parameters */ + uint8_t config; + uint8_t dev_addr; + + __IO uint8_t cur_status; + __IO uint8_t backup_status; + + usb_pm pm; +#ifdef LPM_ENABLED + usb_lpm lpm; +#endif /* LPM_ENABLED */ + usb_control control; + + usb_transc transc_out[EP_COUNT]; + usb_transc transc_in[EP_COUNT]; + + usb_ep_transc ep_transc[EP_COUNT][USBD_TRANSC_COUNT]; + + /* device class */ + usb_desc *desc; + usb_class *class_core; + usb_handler *drv_handler; + + void *class_data[USBD_ITF_MAX_NUM]; + void *user_data; + void *data; +}; + +typedef struct +{ + uint8_t (*SOF) (usb_dev *udev); /*!< SOF ISR callback */ +} usbd_int_cb_struct; + +/* USB handler struct */ +struct _usb_handler { + void (*init) (void); + void (*deinit) (void); + + void (*dp_pullup) (FlagStatus status); + void (*set_addr) (usb_dev *udev); + void (*suspend) (void); + void (*suspend_leave) (void); + void (*resume) (usb_dev *udev); + + void (*ep_reset) (usb_dev *udev); + void (*ep_setup) (usb_dev *udev, uint8_t buf_kind, uint32_t buf_addr, const usb_desc_ep *ep_desc); + void (*ep_disable) (usb_dev *udev, uint8_t ep_addr); + void (*ep_rx_enable) (usb_dev *udev, uint8_t ep_num); + void (*ep_write) (uint8_t *fifo, uint8_t ep_num, uint16_t bytes); + uint16_t (*ep_read) (uint8_t *fifo, uint8_t ep_num, uint8_t buf_kind); + void (*ep_stall_set) (usb_dev *udev, uint8_t ep_addr); + void (*ep_stall_clear) (usb_dev *udev, uint8_t ep_addr); + uint8_t (*ep_status_get) (usb_dev *udev, uint8_t ep_addr); +}; + +extern usbd_int_cb_struct *usbd_int_fops; + +/* static inline function definitions */ +/*! + \brief device connect + \param[in] udev: pointer to USB core instance + \param[out] none + \retval none +*/ +__STATIC_INLINE void usbd_connect (usb_dev *udev) +{ + udev->drv_handler->dp_pullup(SET); + + udev->cur_status = (uint8_t)USBD_CONNECTED; +} + +/*! + \brief device disconnect + \param[in] udev: pointer to USB core instance + \param[out] none + \retval none +*/ +__STATIC_INLINE void usbd_disconnect (usb_dev *udev) +{ + udev->drv_handler->dp_pullup(RESET); + + udev->cur_status = (uint8_t)USBD_UNCONNECTED; +} + +/*! + \brief device core register configure when stop device + \param[in] udev: pointer to USB core instance + \param[out] none + \retval none +*/ +__STATIC_INLINE void usbd_core_deinit (usb_dev *udev) +{ + udev->drv_handler->deinit(); +} + +/*! + \brief initialize endpoint + \param[in] udev: pointer to USB core instance + \param[in] buf_kind: endpoint buffer kind + \param[in] buf_addr: buffer addresss + \param[in] ep_desc: pointer to endpoint descriptor + \param[out] none + \retval none +*/ +__STATIC_INLINE void usbd_ep_init (usb_dev *udev, uint8_t buf_kind, uint32_t buf_addr, const usb_desc_ep *ep_desc) +{ + udev->drv_handler->ep_setup(udev, buf_kind, buf_addr, ep_desc); +} + +/*! + \brief configure the endpoint when it is disabled + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +__STATIC_INLINE void usbd_ep_deinit (usb_dev *udev, uint8_t ep_addr) +{ + udev->drv_handler->ep_disable(udev, ep_addr); +} + +/*! + \brief set an endpoint to STALL status + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +__STATIC_INLINE void usbd_ep_stall (usb_dev *udev, uint8_t ep_addr) +{ + udev->drv_handler->ep_stall_set(udev, ep_addr); +} + +/*! + \brief clear endpoint stalled status + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +__STATIC_INLINE void usbd_ep_clear_stall (usb_dev *udev, uint8_t ep_addr) +{ + udev->drv_handler->ep_stall_clear(udev, ep_addr); +} + +/*! + \brief get endpoint status + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +__STATIC_INLINE uint8_t usbd_ep_status_get (usb_dev *udev, uint8_t ep_addr) +{ + return udev->drv_handler->ep_status_get(udev, ep_addr); +} + +__STATIC_INLINE uint8_t usbd_connect_status_get(usb_dev *udev) +{ + return udev->cur_status; +} + +/* function declarations */ +/* initialize USBD */ +void usbd_init(usb_dev *udev, usb_desc *desc, usb_class *usbc); +/* endpoint prepare to transmit data */ +void usbd_ep_send (usb_dev *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t buf_len); +/* endpoint prepare to receive data */ +void usbd_ep_recev (usb_dev *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t buf_len); + + + +#endif /* __USBD_CORE_H */ diff --git b/Drivers/GD32F30x_usbd_library/device/Include/usbd_enum.h a/Drivers/GD32F30x_usbd_library/device/Include/usbd_enum.h new file mode 100644 index 0000000..2f1349a --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/device/Include/usbd_enum.h @@ -0,0 +1,111 @@ +/*! + \file usbd_enum.h + \brief USB enumeration definitions + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_ENUM_H +#define __USBD_ENUM_H + +#include "usbd_core.h" +#include "usb_ch9_std.h" + +#ifndef NULL + #define NULL 0U +#endif + +/* request state enumeration */ +typedef enum _usb_reqsta +{ + REQ_SUPP = 0x0U, /* supported request */ + REQ_NOTSUPP = 0x1U /* unsupported request */ +} usb_reqsta; + +/* string descriptor index enumeration */ +enum _str_index +{ + STR_IDX_LANGID = 0x0U, /* language ID string index */ + STR_IDX_MFC = 0x1U, /* manufacturer string index */ + STR_IDX_PRODUCT = 0x2U, /* product string index */ + STR_IDX_SERIAL = 0x3U, /* serial string index */ + STR_IDX_CONFIG = 0x4U, /* configuration string index */ + STR_IDX_ITF = 0x5U, /* interface string index */ + STR_IDX_MAX = 0x6U /* string index max value */ +}; + +/* PWR status enumeration */ +typedef enum +{ + USB_PWRSTA_SELF_POWERED = 0x1U, /* USB is in self powered status */ + USB_PWRSTA_REMOTE_WAKEUP = 0x2U, /* USB is in remote wakeup status */ +} usb_pwrsta; + +/* usb endpoint feature enumeration */ +typedef enum +{ + USB_FEATURE_EP_HALT = 0x0U, /* USB has endpoint halt feature */ + USB_FEATURE_REMOTE_WAKEUP = 0x1U, /* USB has endpoint remote wakeup feature */ + USB_FEATURE_TEST_MODE = 0x2U /* USB has endpoint test mode feature */ +} usb_feature; + +#define ENG_LANGID 0x0409U /* english language ID */ +#define CHN_LANGID 0x0804U /* chinese language ID */ + +/* device unique ID */ +#define DEVICE_ID1 (0x1FFFF7E8U) /* device ID1 */ +#define DEVICE_ID2 (0x1FFFF7ECU) /* device ID2 */ +#define DEVICE_ID3 (0x1FFFF7F0U) /* device ID3 */ + +#define DEVICE_ID (0x40022100U) /* device ID information */ + +//#define USB_SERIAL_STRING_SIZE 0x1AU + +/* USB device exported macros */ +#define BYTE_SWAP(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ + (uint16_t)(((uint16_t)(*(((uint8_t *)(addr)) + 1U))) << 8U)) +#define BYTE_LOW(x) ((uint8_t)((x) & 0x00FFU)) +#define BYTE_HIGH(x) ((uint8_t)(((x) & 0xFF00U) >> 8U)) + +#define USB_MIN(a, b) (((a) < (b)) ? (a) : (b)) + +#define CTL_EP(ep) (((ep) == 0x00U) || ((ep) == 0x80U)) + +/* function declarations */ +/* handle USB standard device request */ +usb_reqsta usbd_standard_request (usb_dev *udev, usb_req *req); +/* handle device class request */ +usb_reqsta usbd_class_request (usb_dev *udev, usb_req *req); +/* handle USB vendor request */ +usb_reqsta usbd_vendor_request (usb_dev *udev, usb_req *req); +/* get serial string */ +void serial_string_get (uint16_t *unicode_str); + +#endif /* __USBD_ENUM_H */ diff --git b/Drivers/GD32F30x_usbd_library/device/Include/usbd_pwr.h a/Drivers/GD32F30x_usbd_library/device/Include/usbd_pwr.h new file mode 100644 index 0000000..0ca8a2d --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/device/Include/usbd_pwr.h @@ -0,0 +1,67 @@ +/*! + \file usbd_pwr.h + \brief USB device power management functions prototype + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_PWR_H +#define __USBD_PWR_H + +#include "usbd_core.h" + +/* static inline function definitions */ +/*! + \brief first operation of USB wakeup is to wakeup MCU + \param[in] udev: pointer to USB core instance + \param[out] none + \retval none +*/ +__STATIC_INLINE void resume_mcu (usb_dev *udev) +{ + udev->drv_handler->suspend_leave(); +} + +/*! + \brief set USB device to suspend mode + \param[in] udev: pointer to USB core instance + \param[out] none + \retval none +*/ +__STATIC_INLINE void usbd_to_suspend (usb_dev *udev) +{ + udev->drv_handler->suspend(); +} + +/* function declarations */ +/* start to remote wakeup */ +void usbd_remote_wakeup_active (usb_dev *udev); + +#endif /* __USBD_PWR_H */ diff --git b/Drivers/GD32F30x_usbd_library/device/Include/usbd_transc.h a/Drivers/GD32F30x_usbd_library/device/Include/usbd_transc.h new file mode 100644 index 0000000..30699a5 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/device/Include/usbd_transc.h @@ -0,0 +1,63 @@ +/*! + \file usbd_transc.h + \brief USBD transaction + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_TRANSC_H +#define __USB_TRANSC_H + +#include "usbd_core.h" + +/*! + \brief USB transaction configure + \param[in] udev: pointer to USB device instance + \param[in] buf: transfer data buffer + \param[in] len: transfer data length + \param[out] none + \retval none +*/ +__STATIC_INLINE void usb_transc_config (usb_transc *transc, uint8_t *buf, uint16_t len, uint16_t count) +{ + transc->xfer_buf = buf; + transc->xfer_len = len; + transc->xfer_count = count; +} + +/* function declarations */ +/* process USB SETUP transaction */ +void _usb_setup_transc (usb_dev *udev, uint8_t ep_num); +/* process USB OUT transaction */ +void _usb_out0_transc (usb_dev *udev, uint8_t ep_num); +/* process USB IN transaction */ +void _usb_in0_transc (usb_dev *udev, uint8_t ep_num); + +#endif /* __USB_TRANSC_H */ diff --git b/Drivers/GD32F30x_usbd_library/device/Source/usbd_core.c a/Drivers/GD32F30x_usbd_library/device/Source/usbd_core.c new file mode 100644 index 0000000..b464f2b --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/device/Source/usbd_core.c @@ -0,0 +1,129 @@ +/*! + \file usbd_core.c + \brief USB device driver + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_core.h" +#include "usbd_enum.h" +#include "usbd_transc.h" +#include "usbd_lld_core.h" + +usbd_int_cb_struct *usbd_int_fops = NULL; + +/*! + \brief configure USB device initialization + \param[in] udev: pointer to USB core instance + \param[in] core: endpoint address + \param[in] usbc: USB class + \param[in] usbha: USB handler + \param[out] none + \retval none +*/ +void usbd_init (usb_dev *udev, usb_desc *desc, usb_class *usbc) +{ + /* configure USBD core basic attributes */ + usbd_core.basic.max_ep_count = 8U; + usbd_core.basic.twin_buf = 1U; + usbd_core.basic.ram_size = 512U; + + usbd_core.dev = udev; + + udev->desc = desc; + udev->class_core = usbc; + udev->drv_handler = &usbd_drv_handler; + + udev->ep_transc[0][TRANSC_SETUP] = _usb_setup_transc; + udev->ep_transc[0][TRANSC_OUT] = _usb_out0_transc; + udev->ep_transc[0][TRANSC_IN] = _usb_in0_transc; + + /* configure power management */ + udev->pm.power_mode = (udev->desc->config_desc[7] & 0x40U) >> 5; + + /* enable USB suspend */ + udev->pm.suspend_enabled = 1U; + + /* USB low level initialization */ + udev->drv_handler->init(); + + /* create serial string */ + serial_string_get((uint16_t *)udev->desc->strings[STR_IDX_SERIAL]); +} + +/*! + \brief endpoint prepare to receive data + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[in] pbuf: user buffer address pointer + \param[in] buf_len: buffer length + \param[out] none + \retval none +*/ +void usbd_ep_recev (usb_dev *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t buf_len) +{ + /* configure the transaction level parameters */ + usb_transc *transc = &udev->transc_out[EP_ID(ep_addr)]; + + usb_transc_config(transc, pbuf, buf_len, 0U); + + /* enable endpoint to receive */ + udev->drv_handler->ep_rx_enable(udev, ep_addr); +} + +/*! + \brief endpoint prepare to transmit data + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[in] pbuf: transmit buffer address pointer + \param[in] buf_len: buffer length + \param[out] none + \retval none +*/ +void usbd_ep_send (usb_dev *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t buf_len) +{ + uint8_t ep_num = EP_ID(ep_addr); + + usb_transc *transc = &udev->transc_in[ep_num]; + + uint16_t len = USB_MIN(buf_len, transc->max_len); + + /* configure the transaction level parameters */ + + udev->drv_handler->ep_write(pbuf, ep_num, len); + + usb_transc_config(transc, pbuf + len, buf_len - len, len); +} diff --git b/Drivers/GD32F30x_usbd_library/device/Source/usbd_enum.c a/Drivers/GD32F30x_usbd_library/device/Source/usbd_enum.c new file mode 100644 index 0000000..9772564 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/device/Source/usbd_enum.c @@ -0,0 +1,744 @@ +/*! + \file usbd_enum.c + \brief USB enumeration function + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-09-27, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_enum.h" +#include "usbd_transc.h" + +/* USB enumeration handle functions */ +static usb_reqsta _usb_std_getstatus (usb_dev *udev, usb_req *req); +static usb_reqsta _usb_std_clearfeature (usb_dev *udev, usb_req *req); +static usb_reqsta _usb_std_setfeature (usb_dev *udev, usb_req *req); +static usb_reqsta _usb_std_setaddress (usb_dev *udev, usb_req *req); +static usb_reqsta _usb_std_getdescriptor (usb_dev *udev, usb_req *req); +static usb_reqsta _usb_std_setdescriptor (usb_dev *udev, usb_req *req); +static usb_reqsta _usb_std_getconfiguration (usb_dev *udev, usb_req *req); +static usb_reqsta _usb_std_setconfiguration (usb_dev *udev, usb_req *req); +static usb_reqsta _usb_std_reserved (usb_dev *udev, usb_req *req); +static usb_reqsta _usb_std_getinterface (usb_dev *udev, usb_req *req); +static usb_reqsta _usb_std_setinterface (usb_dev *udev, usb_req *req); +static usb_reqsta _usb_std_synchframe (usb_dev *udev, usb_req *req); +static uint8_t* _usb_dev_desc_get (usb_dev *udev, uint8_t index, uint16_t *len); +static uint8_t* _usb_config_desc_get (usb_dev *udev, uint8_t index, uint16_t *len); +static uint8_t* _usb_str_desc_get (usb_dev *udev, uint8_t index, uint16_t *len); +static uint8_t* _usb_bos_desc_get (usb_dev *udev, uint8_t index, uint16_t *len); +static void int_to_unicode (uint32_t value, uint8_t *pbuf, uint8_t len); + +/* standard device request handler */ +static usb_reqsta (*_std_dev_req[]) (usb_dev *udev, usb_req *req) = { + [USB_GET_STATUS] = _usb_std_getstatus, + [USB_CLEAR_FEATURE] = _usb_std_clearfeature, + [USB_RESERVED2] = _usb_std_reserved, + [USB_SET_FEATURE] = _usb_std_setfeature, + [USB_RESERVED4] = _usb_std_reserved, + [USB_SET_ADDRESS] = _usb_std_setaddress, + [USB_GET_DESCRIPTOR] = _usb_std_getdescriptor, + [USB_SET_DESCRIPTOR] = _usb_std_setdescriptor, + [USB_GET_CONFIGURATION] = _usb_std_getconfiguration, + [USB_SET_CONFIGURATION] = _usb_std_setconfiguration, + [USB_GET_INTERFACE] = _usb_std_getinterface, + [USB_SET_INTERFACE] = _usb_std_setinterface, + [USB_SYNCH_FRAME] = _usb_std_synchframe, +}; + +/* get standard descriptor handler */ +static uint8_t* (*std_desc_get[])(usb_dev *udev, uint8_t index, uint16_t *len) = { + [USB_DESCTYPE_DEV - 1U] = _usb_dev_desc_get, + [USB_DESCTYPE_CONFIG - 1U] = _usb_config_desc_get, + [USB_DESCTYPE_STR - 1U] = _usb_str_desc_get +}; + +/*! + \brief handle USB standard device request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device operation cur_status +*/ +usb_reqsta usbd_standard_request (usb_dev *udev, usb_req *req) +{ + /* call device request handle function */ + return (*_std_dev_req[req->bRequest]) (udev, req); +} + +/*! + \brief handle USB device class request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device class request + \param[out] none + \retval USB device request status +*/ +usb_reqsta usbd_class_request (usb_dev *udev, usb_req *req) +{ + if ((uint8_t)USBD_CONFIGURED == udev->cur_status) { + if (BYTE_LOW(req->wIndex) < USBD_ITF_MAX_NUM) { + /* call device class handle function */ + return (usb_reqsta)udev->class_core->req_process(udev, req); + } + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB vendor request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB vendor request + \param[out] none + \retval USB device request status +*/ +usb_reqsta usbd_vendor_request (usb_dev *udev, usb_req *req) +{ + (void)udev; + (void)req; + + /* added by user */ + + return REQ_NOTSUPP; +} + +/*! + \brief no operation, just for reserved + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_reserved (usb_dev *udev, usb_req *req) +{ + (void)udev; + (void)req; + + /* no operation */ + return REQ_NOTSUPP; +} + +/*! + \brief get the device descriptor + \param[in] udev: pointer to USB device instance + \param[in] index: no use + \param[out] len: data length pointer + \retval descriptor buffer pointer +*/ +static uint8_t* _usb_dev_desc_get (usb_dev *udev, uint8_t index, uint16_t *len) +{ + (void)index; + + *len = udev->desc->dev_desc[0]; + + return udev->desc->dev_desc; +} + +/*! + \brief get the configuration descriptor + \brief[in] udev: pointer to USB device instance + \brief[in] index: no use + \param[out] len: data length pointer + \retval descriptor buffer pointer +*/ +static uint8_t* _usb_config_desc_get (usb_dev *udev, uint8_t index, uint16_t *len) +{ + (void)index; + + *len = udev->desc->config_desc[2] | (udev->desc->config_desc[3]<< 8); + + return udev->desc->config_desc; +} + +/*! + \brief get the BOS descriptor + \brief[in] udev: pointer to USB device instance + \brief[in] index: no use + \param[out] len: data length pointer + \retval descriptor buffer pointer +*/ +static uint8_t* _usb_bos_desc_get (usb_dev *udev, uint8_t index, uint16_t *len) +{ + if (NULL != udev->desc->bos_desc) { + (void)index; + + *len = (uint16_t)udev->desc->bos_desc[2] | (uint16_t)((uint16_t)udev->desc->bos_desc[3] << 8); + + return udev->desc->bos_desc; + } else { + *len = 0U; + + return NULL; + } +} + +/*! + \brief get string descriptor + \param[in] udev: pointer to USB device instance + \param[in] index: string descriptor index + \param[out] len: pointer to string length + \retval string descriptor +*/ +static uint8_t* _usb_str_desc_get (usb_dev *udev, uint8_t index, uint16_t *len) +{ + uint8_t* desc = udev->desc->strings[index]; + + *len = desc[0]; + + return desc; +} + +/*! + \brief handle Get_Status request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getstatus (usb_dev *udev, usb_req *req) +{ + uint8_t recp = BYTE_LOW(req->wIndex); + + usb_reqsta req_status = REQ_NOTSUPP; + + static uint8_t status[2] = {0U}; + + switch(req->bmRequestType & USB_RECPTYPE_MASK) { + /* handle device get status request */ + case USB_RECPTYPE_DEV: + switch (udev->cur_status) { + case USBD_ADDRESSED: + case USBD_CONFIGURED: + if (udev->pm.power_mode) { + status[0] = USB_STATUS_SELF_POWERED; + } else { + status[0] = 0U; + } + + if (udev->pm.remote_wakeup) { + status[0] |= USB_STATUS_REMOTE_WAKEUP; + } else { + status[0] = 0U; + } + + req_status = REQ_SUPP; + break; + + default: + break; + } + break; + /* handle interface get status request */ + case USB_RECPTYPE_ITF: + if (((uint8_t)USBD_CONFIGURED == udev->cur_status) && (recp < USBD_ITF_MAX_NUM)) { + req_status = REQ_SUPP; + } + break; + /* handle endpoint get status request */ + case USB_RECPTYPE_EP: + if ((uint8_t)USBD_CONFIGURED == udev->cur_status) { + if (0x80U == (recp & 0x80U)) { + status[0] = udev->transc_in[EP_ID(recp)].ep_stall; + } else { + status[0] = udev->transc_out[recp].ep_stall; + } + req_status = REQ_SUPP; + } + break; + + default: + break; + } + + if (REQ_SUPP == req_status) { + usb_transc_config(&udev->transc_in[0], status, 2U, 2U); + } + + return req_status; +} + +/*! + \brief handle USB Clear_Feature request + \param[in] udev: pointer to USB device instance + \param[in] req: USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_clearfeature (usb_dev *udev, usb_req *req) +{ + uint8_t ep = 0U; + + switch (req->bmRequestType & (uint8_t)USB_RECPTYPE_MASK) { + case USB_RECPTYPE_DEV: + switch (udev->cur_status) { + case USBD_ADDRESSED: + case USBD_CONFIGURED: + /* clear device remote wakeup feature */ + if ((uint16_t)USB_FEATURE_REMOTE_WAKEUP == req->wValue) { + udev->pm.remote_wakeup = 0U; + + return REQ_SUPP; + } + break; + + default: + break; + } + break; + + case USB_RECPTYPE_EP: + /* get endpoint address */ + ep = BYTE_LOW(req->wIndex); + + if ((uint8_t)USBD_CONFIGURED == udev->cur_status) { + /* clear endpoint halt feature */ + if (((uint16_t)USB_FEATURE_EP_HALT == req->wValue) && (!CTL_EP(ep))) { + usbd_ep_clear_stall(udev, ep); + + udev->class_core->req_process(udev, req); + + return REQ_SUPP; + } + } + break; + + case USB_RECPTYPE_ITF: + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Set_Feature request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setfeature (usb_dev *udev, usb_req *req) +{ + uint8_t ep = 0U; + + switch (req->bmRequestType & (uint8_t)USB_RECPTYPE_MASK) { + case USB_RECPTYPE_DEV: + switch (udev->cur_status) { + case USBD_ADDRESSED: + case USBD_CONFIGURED: + /* set device remote wakeup feature */ + if ((uint16_t)USB_FEATURE_REMOTE_WAKEUP == req->wValue) { + udev->pm.remote_wakeup = 1U; + + return REQ_SUPP; + } + break; + + default: + break; + } + break; + + case USB_RECPTYPE_EP: + /* get endpoint address */ + ep = BYTE_LOW(req->wIndex); + + if ((uint8_t)USBD_CONFIGURED == udev->cur_status) { + /* set endpoint halt feature */ + if (((uint8_t)USB_FEATURE_EP_HALT == req->wValue) && (!CTL_EP(ep))) { + usbd_ep_stall(udev, ep); + + return REQ_SUPP; + } + } + break; + + case USB_RECPTYPE_ITF: + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Set_Address request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setaddress (usb_dev *udev, usb_req *req) +{ + if ((0U == req->wIndex) && (0U == req->wLength)) { + udev->dev_addr = (uint8_t)(req->wValue) & 0x7FU; + + if (udev->cur_status != (uint8_t)USBD_CONFIGURED) { + if (udev->dev_addr) { + udev->cur_status = (uint8_t)USBD_ADDRESSED; + } else { + udev->cur_status = (uint8_t)USBD_DEFAULT; + } + + return REQ_SUPP; + } + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Get_Descriptor request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getdescriptor (usb_dev *udev, usb_req *req) +{ + uint8_t desc_type = 0U; + uint8_t desc_index = 0U; + + usb_reqsta status = REQ_NOTSUPP; + + usb_transc *transc = &udev->transc_in[0]; + + switch (req->bmRequestType & USB_RECPTYPE_MASK) { + case USB_RECPTYPE_DEV: + desc_type = BYTE_HIGH(req->wValue); + desc_index = BYTE_LOW(req->wValue); + + switch (desc_type) { + case USB_DESCTYPE_DEV: + transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, &transc->xfer_len); + if (64U == req->wLength) { + transc->xfer_len = 8U; + } + break; + + case USB_DESCTYPE_CONFIG: + transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, &transc->xfer_len); + break; + + case USB_DESCTYPE_STR: + if (desc_index < STR_IDX_MAX) { + transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, &transc->xfer_len); + } + break; + + case USB_DESCTYPE_ITF: + case USB_DESCTYPE_EP: + case USB_DESCTYPE_DEV_QUALIFIER: + case USB_DESCTYPE_OTHER_SPD_CONFIG: + case USB_DESCTYPE_ITF_POWER: + break; + + case USB_DESCTYPE_BOS: + transc->xfer_buf = _usb_bos_desc_get(udev, desc_index, &transc->xfer_len); + break; + + default: + break; + } + break; + + case USB_RECPTYPE_ITF: + /* get device class special descriptor */ + status = (usb_reqsta)(udev->class_core->req_process(udev, req)); + break; + + case USB_RECPTYPE_EP: + break; + + default: + break; + } + + if ((transc->xfer_len) && (req->wLength)) { + transc->xfer_len = USB_MIN(transc->xfer_len, req->wLength); + + if ((transc->xfer_len < udev->control.req.wLength) && + (0U == transc->xfer_len % transc->max_len)) { + udev->control.ctl_zlp = 1U; + } + + status = REQ_SUPP; + } + + return status; +} + +/*! + \brief handle USB Set_Descriptor request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setdescriptor (usb_dev *udev, usb_req *req) +{ + (void)udev; + (void)req; + + /* no handle */ + return REQ_SUPP; +} + +/*! + \brief handle USB Get_Configuration request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getconfiguration (usb_dev *udev, usb_req *req) +{ + (void)req; + + usb_reqsta req_status = REQ_NOTSUPP; + + switch (udev->cur_status) { + case USBD_ADDRESSED: + if (0U == udev->config) { + req_status = REQ_SUPP; + } + break; + + case USBD_CONFIGURED: + if (udev->config) { + req_status = REQ_SUPP; + } + break; + + default: + break; + } + + if (REQ_SUPP == req_status) { + usb_transc_config(&udev->transc_in[0], &(udev->config), 1U, 1U); + } + + return req_status; +} + +/*! + \brief handle USB Set_Configuration request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device operation cur_status +*/ +static usb_reqsta _usb_std_setconfiguration (usb_dev *udev, usb_req *req) +{ + static uint8_t config; + usb_reqsta status = REQ_NOTSUPP; + + config = (uint8_t)(req->wValue); + + if (config <= USBD_CFG_MAX_NUM) { + switch (udev->cur_status) { + case USBD_ADDRESSED: + if (config){ + (void)udev->class_core->init(udev, config); + + udev->config = config; + udev->cur_status = (uint8_t)USBD_CONFIGURED; + } + status = REQ_SUPP; + break; + + case USBD_CONFIGURED: + if (0U == config) { + (void)udev->class_core->deinit(udev, config); + + udev->config = config; + udev->cur_status = (uint8_t)USBD_ADDRESSED; + } else if (config != udev->config) { + /* clear old configuration */ + (void)udev->class_core->deinit(udev, udev->config); + + /* set new configuration */ + udev->config = config; + + (void)udev->class_core->init(udev, config); + } else { + /* no operation */ + } + status = REQ_SUPP; + break; + + case USBD_DEFAULT: + break; + + default: + break; + } + } + + return status; +} + +/*! + \brief handle USB Get_Interface request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getinterface (usb_dev *udev, usb_req *req) +{ + switch (udev->cur_status) { + case USBD_DEFAULT: + break; + + case USBD_ADDRESSED: + break; + + case USBD_CONFIGURED: + if (BYTE_LOW(req->wIndex) < USBD_ITF_MAX_NUM) { + usb_transc_config(&udev->transc_in[0], &(udev->class_core->req_altset), 1U, 1U); + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Set_Interface request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setinterface (usb_dev *udev, usb_req *req) +{ + switch (udev->cur_status) { + case USBD_DEFAULT: + break; + + case USBD_ADDRESSED: + break; + + case USBD_CONFIGURED: + if (BYTE_LOW(req->wIndex) < USBD_ITF_MAX_NUM) { + udev->class_core->req_altset = (uint8_t)req->wValue; + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB SynchFrame request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_synchframe (usb_dev *udev, usb_req *req) +{ + (void)udev; + (void)req; + + /* no handle */ + return REQ_SUPP; +} + +/*! + \brief convert hex 32bits value into unicode char + \param[in] value: Hex 32bits value + \param[in] pbuf: buffer pointer to store unicode char + \param[in] len: value length + \param[out] none + \retval none +*/ +static void int_to_unicode (uint32_t value, uint8_t *pbuf, uint8_t len) +{ + uint8_t index = 0U; + + for (index = 0U; index < len; index++) { + if ((value >> 28U) < 0x0AU) { + pbuf[2U * index] = (uint8_t)((value >> 28) + '0'); + } else { + pbuf[2U * index] = (uint8_t)((value >> 28) + 'A' - 10U); + } + + value = value << 4U; + + pbuf[2U * index + 1U] = 0U; + } +} + +/*! + \brief convert hex 32bits value into unicode char + \param[in] none + \param[out] none + \retval none +*/ +void serial_string_get (uint16_t *unicode_str) +{ + if (6U != (unicode_str[0] & 0x00FFU)) { + uint32_t DeviceSerial0, DeviceSerial1, DeviceSerial2; + + DeviceSerial0 = *(uint32_t*)DEVICE_ID1; + DeviceSerial1 = *(uint32_t*)DEVICE_ID2; + DeviceSerial2 = *(uint32_t*)DEVICE_ID3; + + DeviceSerial0 += DeviceSerial2; + + if (0U != DeviceSerial0) { + int_to_unicode(DeviceSerial0, (uint8_t*)&(unicode_str[1]), 8U); + int_to_unicode(DeviceSerial1, (uint8_t*)&(unicode_str[9]), 4U); + } + } else { + uint32_t device_serial = *(uint32_t*)DEVICE_ID; + + if (0U != device_serial) { + unicode_str[1] = (uint16_t)(device_serial & 0x0000FFFFU); + unicode_str[2] = (uint16_t)((device_serial & 0xFFFF0000U) >> 16U); + + } + } +} diff --git b/Drivers/GD32F30x_usbd_library/device/Source/usbd_pwr.c a/Drivers/GD32F30x_usbd_library/device/Source/usbd_pwr.c new file mode 100644 index 0000000..6be6b66 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/device/Source/usbd_pwr.c @@ -0,0 +1,60 @@ +/*! + \file usbd_pwr.c + \brief USB device power management driver + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_pwr.h" + +/*! + \brief start to remote wakeup + \param[in] udev: pointer to USB core instance + \param[out] none + \retval none +*/ +void usbd_remote_wakeup_active(usb_dev *udev) +{ + resume_mcu(udev); + +#ifdef LPM_ENABLED + if(1 == udev->lpm.L1_remote_wakeup){ + udev->drv_handler->resume(udev); + + udev->lpm.L1_resume = 1U; + } +#endif /* LPM_ENABLED */ + + if(1U == udev->pm.remote_wakeup){ + udev->pm.remote_wakeup_on = 1U; + udev->pm.esof_count = 15U; + udev->drv_handler->resume(udev); + } +} diff --git b/Drivers/GD32F30x_usbd_library/device/Source/usbd_transc.c a/Drivers/GD32F30x_usbd_library/device/Source/usbd_transc.c new file mode 100644 index 0000000..8837c08 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/device/Source/usbd_transc.c @@ -0,0 +1,207 @@ +/*! + \file usbd_transc.c + \brief USBD transaction function + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_enum.h" +#include "usbd_transc.h" + +/* local function prototypes ('static') */ +static inline void usb_stall_transc (usb_dev *udev); +static inline void usb_ctl_status_in (usb_dev *udev); +static inline void usb_ctl_data_in (usb_dev *udev); +static inline void usb_ctl_out (usb_dev *udev); +static inline void usb_0len_packet_send (usb_dev *udev); + +/*! + \brief USB setup stage processing + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void _usb_setup_transc (usb_dev *udev, uint8_t ep_num) +{ + (void)ep_num; + + usb_reqsta reqstat = REQ_NOTSUPP; + + uint16_t count = udev->drv_handler->ep_read((uint8_t *)(&udev->control.req), 0U, (uint8_t)EP_BUF_SNG); + + if (count != USB_SETUP_PACKET_LEN) { + usb_stall_transc(udev); + + return; + } + + switch (udev->control.req.bmRequestType & USB_REQTYPE_MASK) { + /* standard device request */ + case USB_REQTYPE_STRD: + reqstat = usbd_standard_request(udev, &udev->control.req); + break; + + /* device class request */ + case USB_REQTYPE_CLASS: + reqstat = usbd_class_request(udev, &udev->control.req); + break; + + /* vendor defined request */ + case USB_REQTYPE_VENDOR: + reqstat = usbd_vendor_request(udev, &udev->control.req); + break; + + default: + break; + } + + if (REQ_SUPP == reqstat) { + if (0U == udev->control.req.wLength) { + /* USB control transfer status in stage */ + usb_ctl_status_in(udev); + } else { + if (udev->control.req.bmRequestType & 0x80U) { + usb_ctl_data_in(udev); + } else { + /* USB control transfer data out stage */ + usb_ctl_out(udev); + } + } + } else { + usb_stall_transc(udev); + } +} + +/*! + \brief data out stage processing + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier(0..7) + \param[out] none + \retval none +*/ +void _usb_out0_transc (usb_dev *udev, uint8_t ep_num) +{ + if (((uint8_t)USBD_CONFIGURED == udev->cur_status) && (udev->class_core->ctlx_out != NULL)) { + /* device class handle */ + (void)udev->class_core->ctlx_out(udev); + } + + usb_transc_config(&udev->transc_out[ep_num], NULL, 0U, 0U); + + /* enter the control transaction status in stage */ + usb_ctl_status_in(udev); +} + +/*! + \brief data in stage processing + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier(0..7) + \param[out] none + \retval none +*/ +void _usb_in0_transc (usb_dev *udev, uint8_t ep_num) +{ + (void)ep_num; + + if (udev->control.ctl_zlp) { + /* send 0 length packet */ + usb_0len_packet_send(udev); + + udev->control.ctl_zlp = 0U; + } + + if (((uint8_t)USBD_CONFIGURED == udev->cur_status) && (udev->class_core->ctlx_in != NULL)) { + (void)udev->class_core->ctlx_in(udev); + } + + /* USB control transfer status out stage */ + usb_ctl_out(udev); + + if (0U != udev->dev_addr) { + udev->drv_handler->set_addr(udev); + + udev->dev_addr = 0U; + } +} + +/*! + \brief USB stalled transaction + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static inline void usb_stall_transc (usb_dev *udev) +{ + usbd_ep_stall(udev, 0x0U); +} + +/*! + \brief USB control transaction status in stage + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static inline void usb_ctl_status_in (usb_dev *udev) +{ + udev->drv_handler->ep_write(udev->transc_in[0].xfer_buf, 0U, 0U); +} + +/*! + \brief USB control transaction data in stage + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static inline void usb_ctl_data_in (usb_dev *udev) +{ + usbd_ep_send(udev, 0U, udev->transc_in[0].xfer_buf, udev->transc_in[0].xfer_len); +} + +/*! + \brief USB control transaction data out & status out stage + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static inline void usb_ctl_out (usb_dev *udev) +{ + udev->drv_handler->ep_rx_enable(udev, 0U); +} + +/*! + \brief USB send 0 length data packet + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static inline void usb_0len_packet_send (usb_dev *udev) +{ + udev->drv_handler->ep_write(udev->transc_in[0].xfer_buf, 0U, 0U); +} diff --git b/Drivers/GD32F30x_usbd_library/usbd/Include/usbd_lld_core.h a/Drivers/GD32F30x_usbd_library/usbd/Include/usbd_lld_core.h new file mode 100644 index 0000000..165b541 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/usbd/Include/usbd_lld_core.h @@ -0,0 +1,73 @@ +/*! + \file usbd_lld_core.h + \brief USB device low level driver core + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_LLD_CORE_H +#define __USBD_LLD_CORE_H + +#include "usbd_lld_regs.h" +#include "usbd_core.h" + +/* double buffer endpoint direction enumeration */ +enum dbuf_ep_dir +{ + DBUF_EP_IN, /*!< double buffer in direction */ + DBUF_EP_OUT, /*!< double buffer out direction */ + DBUF_EP_ERR, /*!< double buffer error direction */ +}; + +/* USBD endpoint ram struct */ +typedef struct +{ + __IO uint32_t tx_addr; /*!< transmission address */ + __IO uint32_t tx_count; /*!< transmission count */ + __IO uint32_t rx_addr; /*!< reception address */ + __IO uint32_t rx_count; /*!< reception count */ +} usbd_ep_ram; + +extern struct _usb_handler usbd_drv_handler; + +/* USB core driver struct */ +typedef struct +{ + usb_basic basic; + usb_dev *dev; +} usb_core_drv; + +extern usb_core_drv usbd_core; + +/* function declarations */ +/* free buffer used from application by toggling the SW_BUF byte */ +void user_buffer_free (uint8_t ep_num, uint8_t dir); + +#endif /* __USBD_LLD_CORE_H */ diff --git b/Drivers/GD32F30x_usbd_library/usbd/Include/usbd_lld_int.h a/Drivers/GD32F30x_usbd_library/usbd/Include/usbd_lld_int.h new file mode 100644 index 0000000..2c0eece --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/usbd/Include/usbd_lld_int.h @@ -0,0 +1,48 @@ +/*! + \file usbd_lld_int.h + \brief USB device low level interrupt handler + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_LLD_INT_H +#define __USBD_LLD_INT_H + +#include "usbd_core.h" +#include "usbd_enum.h" +#include "usbd_pwr.h" + +/* function declarations */ +/* USB device interrupt service routine */ +void usbd_isr (void); +/* handle USB high priority successful transfer event */ +void usbd_int_hpst (usb_dev *udev); + +#endif /* __USBD_LLD_INT_H */ diff --git b/Drivers/GD32F30x_usbd_library/usbd/Include/usbd_lld_regs.h a/Drivers/GD32F30x_usbd_library/usbd/Include/usbd_lld_regs.h new file mode 100644 index 0000000..30a7f77 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/usbd/Include/usbd_lld_regs.h @@ -0,0 +1,227 @@ +/*! + \file usbd_lld_regs.h + \brief USB device low level registers + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_LLD_REGS_H +#define __USBD_LLD_REGS_H + +#include "usbd_conf.h" + +/* USB device registers base address */ +#define USBD USBD_BASE +#define USBD_RAM USBD_RAM_BASE + +/* registers definitions */ +/* common registers */ +#define USBD_CTL (REG32(USBD + 0x40U)) /*!< control register */ +#define USBD_INTF (REG32(USBD + 0x44U)) /*!< interrupt flag register */ +#define USBD_STAT (REG32(USBD + 0x48U)) /*!< status register */ +#define USBD_DADDR (REG32(USBD + 0x4CU)) /*!< device address register */ +#define USBD_BADDR (REG32(USBD + 0x50U)) /*!< buffer address register */ +#define USBD_LPMCS (REG32(USBD + 0x54U)) /*!< USBD LPM control and status register */ + +/* endpoint control and status register */ +#define USBD_EPxCS(ep_num) (REG32(USBD + (ep_num) * 4U)) /*!< endpoint x control and status register address */ + +/* bits definitions */ +/* USBD_CTL */ +#define CTL_STIE BIT(15) /*!< successful transfer interrupt enable mask */ +#define CTL_PMOUIE BIT(14) /*!< packet memory overrun/underrun interrupt enable mask */ +#define CTL_ERRIE BIT(13) /*!< error interrupt enable mask */ +#define CTL_WKUPIE BIT(12) /*!< wakeup interrupt enable mask */ +#define CTL_SPSIE BIT(11) /*!< suspend state interrupt enable mask */ +#define CTL_RSTIE BIT(10) /*!< reset interrupt enable mask */ +#define CTL_SOFIE BIT(9) /*!< start of frame interrupt enable mask */ +#define CTL_ESOFIE BIT(8) /*!< expected start of frame interrupt enable mask */ +#define CTL_L1REQIE BIT(7) /*!< LPM L1 state request interrupt enable */ +#define CTL_L1RSREQ BIT(5) /*!< LPM L1 resume request */ +#define CTL_RSREQ BIT(4) /*!< resume request */ +#define CTL_SETSPS BIT(3) /*!< set suspend state */ +#define CTL_LOWM BIT(2) /*!< low-power mode at suspend state */ +#define CTL_CLOSE BIT(1) /*!< goes to close state */ +#define CTL_SETRST BIT(0) /*!< set USB reset */ + +#ifdef LPM_ENABLED +#define USBD_INTEN BITS(7, 15) /*!< USBD interrupt enable bits */ +#else +#define USBD_INTEN BITS(8, 15) /*!< USBD interrupt enable bits */ +#endif +/* USBD_INTF */ +#define INTF_STIF BIT(15) /*!< successful transfer interrupt flag (read only bit) */ +#define INTF_PMOUIF BIT(14) /*!< packet memory overrun/underrun interrupt flag (clear-only bit) */ +#define INTF_ERRIF BIT(13) /*!< error interrupt flag (clear-only bit) */ +#define INTF_WKUPIF BIT(12) /*!< wakeup interrupt flag (clear-only bit) */ +#define INTF_SPSIF BIT(11) /*!< suspend state interrupt flag (clear-only bit) */ +#define INTF_RSTIF BIT(10) /*!< reset interrupt flag (clear-only bit) */ +#define INTF_SOFIF BIT(9) /*!< start of frame interrupt flag (clear-only bit) */ +#define INTF_ESOFIF BIT(8) /*!< expected start of frame interrupt flag(clear-only bit) */ +#define INTF_L1REQ BIT(7) /*!< LPM L1 transaction is successfully received and acknowledged */ +#define INTF_DIR BIT(4) /*!< direction of transaction (read-only bit) */ +#define INTF_EPNUM BITS(0, 3) /*!< endpoint number (read-only bit) */ + +/* USBD_STAT */ +#define STAT_RXDP BIT(15) /*!< data plus line status */ +#define STAT_RXDM BIT(14) /*!< data minus line status */ +#define STAT_LOCK BIT(13) /*!< locked the USB */ +#define STAT_SOFLN BITS(11, 12) /*!< SOF lost number */ +#define STAT_FCNT BITS(0, 10) /*!< frame number count */ + +/* USBD_DADDR */ +#define DADDR_USBEN BIT(7) /*!< USB module enable */ +#define DADDR_USBADDR BITS(0, 6) /*!< USB device address */ + +/* USBD_EPxCS */ +#define EPxCS_RX_ST BIT(15) /*!< endpoint reception successful transferred */ +#define EPxCS_RX_DTG BIT(14) /*!< endpoint reception data PID toggle */ +#define EPxCS_RX_STA BITS(12, 13) /*!< endpoint reception status bits */ +#define EPxCS_SETUP BIT(11) /*!< endpoint setup transaction completed */ +#define EPxCS_CTL BITS(9, 10) /*!< endpoint type control */ +#define EPxCS_KCTL BIT(8) /*!< endpoint kind control */ +#define EPxCS_TX_ST BIT(7) /*!< endpoint transmission successful transfer */ +#define EPxCS_TX_DTG BIT(6) /*!< endpoint transmission data toggle */ +#define EPxCS_TX_STA BITS(4, 5) /*!< endpoint transmission transfers status bits */ +#define EPxCS_AR BITS(0, 3) /*!< endpoint address */ + +/* USBD_LPMCS */ +#define LPMCS_BLSTAT BITS(4, 7) /*!< bLinkState value */ +#define LPMCS_REMWK BIT(3) /*!< bRemoteWake value */ +#define LPMCS_LPMACK BIT(1) /*!< LPM token acknowledge enable */ +#define LPMCS_LPMEN BIT(0) /*!< LPM support enable */ + +/* constants definitions */ +/* endpoint control and status register mask (no toggle fields) */ +#define EPCS_MASK (EPxCS_RX_ST | EPxCS_SETUP | \ + EPxCS_CTL | EPxCS_KCTL | EPxCS_TX_ST | EPxCS_AR) + +/* EPxCS_CTL[1:0] endpoint type control */ +#define ENDP_TYPE(regval) (EPxCS_CTL & ((regval) << 9U)) + +#define EP_BULK ENDP_TYPE(0U) /* bulk transfers */ +#define EP_CONTROL ENDP_TYPE(1U) /* control transfers */ +#define EP_ISO ENDP_TYPE(2U) /* isochronous transfers */ +#define EP_INTERRUPT ENDP_TYPE(3U) /* interrupt transfers */ +#define EP_CTL_MASK (~EPxCS_CTL & EPCS_MASK) + +/* endpoint kind control mask */ +#define EPKCTL_MASK (~EPxCS_KCTL & EPCS_MASK) + +/* EPxCS_TX_STA[1:0] status for Tx transfer */ +#define ENDP_TXSTAT(regval) (EPxCS_TX_STA & ((regval) << 4U)) + +#define EPTX_DISABLED ENDP_TXSTAT(0U) /* transmission state is disabled */ +#define EPTX_STALL ENDP_TXSTAT(1U) /* transmission state is STALL */ +#define EPTX_NAK ENDP_TXSTAT(2U) /* transmission state is NAK */ +#define EPTX_VALID ENDP_TXSTAT(3U) /* transmission state is enabled */ +#define EPTX_DTGMASK (EPxCS_TX_STA | EPCS_MASK) + +/* EPxCS_RX_STA[1:0] status for Rx transfer */ +#define ENDP_RXSTAT(regval) (EPxCS_RX_STA & ((regval) << 12U)) + +#define EPRX_DISABLED ENDP_RXSTAT(0U) /* reception state is disabled */ +#define EPRX_STALL ENDP_RXSTAT(1U) /* reception state is STALL */ +#define EPRX_NAK ENDP_RXSTAT(2U) /* reception state is NAK */ +#define EPRX_VALID ENDP_RXSTAT(3U) /* reception state is enabled */ +#define EPRX_DTGMASK (EPxCS_RX_STA | EPCS_MASK) + +/* endpoint receive/transmission counter register bit definitions */ +#define EPRCNT_BLKSIZ BIT(15) /* reception data block size */ +#define EPRCNT_BLKNUM BITS(10, 14) /* reception data block number */ +#define EPRCNT_CNT BITS(0, 9) /* reception data count */ + +#define EPTCNT_CNT BITS(0, 9) /* transmisson data count */ + +/* interrupt flag clear bits */ +#define CLR(x) (USBD_INTF = ~INTF_##x) + +/* endpoint receive/transmission counter register bit offset */ +#define BLKSIZE_OFFSET (0x01U) +#define BLKNUM_OFFSET (0x05U) +#define RXCNT_OFFSET (0x0AU) + +#define TXCNT_OFFSET (0x0AU) + +#define BLKSIZE32_MASK (0x1fU) +#define BLKSIZE2_MASK (0x01U) + +#define BLKSIZE32_OFFSETMASK (0x05U) +#define BLKSIZE2_OFFSETMASK (0x01U) + +/* USBD operation macros */ + +/* Tx or Rx transfer status setting (bits EPTX_STA[1:0]) */ + +#define USBD_EP_TX_STAT_SET(ep, stat) do {\ + USBD_EPxCS(ep) = (USBD_EPxCS(ep) & (uint16_t)EPTX_DTGMASK) ^ (stat); \ +} while(0) + +#define USBD_EP_RX_STAT_SET(ep, stat) do {\ + USBD_EPxCS(ep) = (USBD_EPxCS(ep) & (uint16_t)EPRX_DTGMASK) ^ (stat); \ +} while(0) + +/* clear bit EPxCS_RX_ST/EPxCS_TX_ST in the endpoint control and status register */ + +#define USBD_EP_TX_ST_CLEAR(ep) do {\ + USBD_EPxCS(ep) &= ~EPxCS_TX_ST & (uint16_t)EPCS_MASK; \ +} while(0) + +#define USBD_EP_RX_ST_CLEAR(ep) do {\ + USBD_EPxCS(ep) &= ~EPxCS_RX_ST & (uint16_t)EPCS_MASK; \ +} while(0) + +/* toggle EPxCS_RX_DTG or EPxCS_TX_DTG bit in the endpoint control and status register */ + +#define USBD_TX_DTG_TOGGLE(ep) do {\ + USBD_EPxCS(ep) = EPxCS_TX_DTG | (USBD_EPxCS(ep) & EPCS_MASK); \ +} while(0) + +#define USBD_RX_DTG_TOGGLE(ep) do {\ + USBD_EPxCS(ep) = EPxCS_RX_DTG | (USBD_EPxCS(ep) & EPCS_MASK); \ +} while(0) + +/* clear EPxCS_RX_DTG or EPxCS_TX_DTG bit in the endpoint control and status register */ + +#define USBD_TX_DTG_CLEAR(ep) do {\ + if ((USBD_EPxCS(ep_num) & EPxCS_TX_DTG) != 0U) {\ + USBD_TX_DTG_TOGGLE(ep);\ + } \ +} while(0) + +#define USBD_RX_DTG_CLEAR(ep) do {\ + if ((USBD_EPxCS(ep_num) & EPxCS_RX_DTG) != 0U) {\ + USBD_RX_DTG_TOGGLE(ep);\ + } \ +} while(0) + +#define USBD_EP_DBL_BUF_SET(ep) (USBD_EPxCS(ep) = (USBD_EPxCS(ep) | EPxCS_KCTL) & EPCS_MASK) + +#endif /* __USBD_LLD_REGS_H */ diff --git b/Drivers/GD32F30x_usbd_library/usbd/Source/usbd_lld_core.c a/Drivers/GD32F30x_usbd_library/usbd/Source/usbd_lld_core.c new file mode 100644 index 0000000..105f5d2 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/usbd/Source/usbd_lld_core.c @@ -0,0 +1,642 @@ +/*! + \file usbd_lld_core.c + \brief USB device low level driver core + + \version 2020-08-01, V3.0.0, firmware for GD32F30x + \version 2021-08-10, V3.0.1, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_lld_core.h" +#include "usbd_enum.h" + +#define USB_EPTYPE_MASK 0x03U + +#if defined (__CC_ARM) /* ARM Compiler */ +static usbd_ep_ram btable_ep[EP_COUNT]__attribute__((at(USBD_RAM + 2 * (BTABLE_OFFSET & 0xFFF8)))); +#elif defined (__ICCARM__) /* IAR Compiler */ + __no_init usbd_ep_ram btable_ep[EP_COUNT] @(USBD_RAM + 2 * (BTABLE_OFFSET & 0xFFF8)); +#elif defined (__GNUC__) /* GNU GCC Compiler */ + usbd_ep_ram *btable_ep = (usbd_ep_ram *)(USBD_RAM + 2 * (BTABLE_OFFSET & 0xFFF8)); +#endif + +usb_core_drv usbd_core; + +static const uint32_t ep_type[] = { + [USB_EP_ATTR_CTL] = EP_CONTROL, + [USB_EP_ATTR_BULK] = EP_BULK, + [USB_EP_ATTR_INT] = EP_INTERRUPT, + [USB_EP_ATTR_ISO] = EP_ISO +}; + +/* local function prototypes ('static') */ +static void usbd_dp_pullup (FlagStatus status); +static void usbd_core_reset (void); +static void usbd_core_stop (void); +static void usbd_address_set (usb_dev *udev); +static void usbd_ep_reset (usb_dev *udev); +static void usbd_ep_setup (usb_dev *udev, uint8_t buf_kind, uint32_t buf_addr, const usb_desc_ep *ep_desc); +static void usbd_ep_rx_enable (usb_dev *udev, uint8_t ep_addr); +static void usbd_ep_disable (usb_dev *udev, uint8_t ep_addr); +static void usbd_ep_stall_set (usb_dev *udev, uint8_t ep_addr); +static void usbd_ep_stall_clear (usb_dev *udev, uint8_t ep_addr); +static void usbd_ep_data_write (uint8_t *user_fifo, uint8_t ep_num, uint16_t bytes); +static uint16_t usbd_ep_data_read (uint8_t *user_fifo, uint8_t ep_num, uint8_t buf_kind); +static void usbd_resume (usb_dev *udev); +static void usbd_suspend (void); +static void usbd_leave_suspend (void); +static uint8_t usbd_ep_status (usb_dev *udev, uint8_t ep_addr); + +struct _usb_handler usbd_drv_handler = { + .dp_pullup = usbd_dp_pullup, + .init = usbd_core_reset, + .deinit = usbd_core_stop, + .suspend = usbd_suspend, + .suspend_leave = usbd_leave_suspend, + .resume = usbd_resume, + .set_addr = usbd_address_set, + .ep_reset = usbd_ep_reset, + .ep_disable = usbd_ep_disable, + .ep_setup = usbd_ep_setup, + .ep_rx_enable = usbd_ep_rx_enable, + .ep_write = usbd_ep_data_write, + .ep_read = usbd_ep_data_read, + .ep_stall_set = usbd_ep_stall_set, + .ep_stall_clear = usbd_ep_stall_clear, + .ep_status_get = usbd_ep_status +}; + +/*! + \brief free buffer used from application by toggling the SW_BUF byte + \param[in] ep_num: endpoint identifier (0..7) + \param[in] dir: endpoint direction which can be OUT(0) or IN(1) + \param[out] none + \retval None +*/ +void user_buffer_free (uint8_t ep_num, uint8_t dir) +{ + if ((uint8_t)DBUF_EP_OUT == dir) { + USBD_TX_DTG_TOGGLE(ep_num); + } else if ((uint8_t)DBUF_EP_IN == dir) { + USBD_RX_DTG_TOGGLE(ep_num); + } else { + /* no operation */ + } +} + +/*! + \brief set the status of pull-up pin + \param[in] status: SET or RESET + \param[out] none + \retval none +*/ +static void usbd_dp_pullup (FlagStatus status) +{ + if (SET == status) { + gpio_bit_set(USB_PULLUP, USB_PULLUP_PIN); + } else { + gpio_bit_reset(USB_PULLUP, USB_PULLUP_PIN); + } +} + +/*! + \brief device core register initialization + \param[in] none + \param[out] none + \retval none +*/ +static void usbd_core_reset (void) +{ + /* reset the CLOSE bit */ + USBD_CTL = CTL_SETRST; + + /* may be need wait some time(tSTARTUP) */ + + /* clear SETRST bit in USBD_CTL register */ + USBD_CTL = 0U; + + /* clear all pending interrupts */ + USBD_INTF = 0U; + + /* set descriptors table offset in USB dedicated SRAM */ + USBD_BADDR = BTABLE_OFFSET & 0xFFF8U; + +#ifdef LPM_ENABLED + /* enable L1REQ interrupt */ + USBD_CTL = CTL_L1REQIE; + + USBD_LPMCS = LPMCS_LPMACK | LPMCS_LPMEN; +#endif /* LPM_ENABLED */ + + /* enable all interrupts mask bits */ + USBD_CTL |= CTL_STIE | CTL_WKUPIE | CTL_SPSIE | CTL_SOFIE | CTL_ESOFIE | CTL_RSTIE; +} + +/*! + \brief device core register configure when stop device + \param[in] none + \param[out] none + \retval none +*/ +static void usbd_core_stop (void) +{ + /* disable all interrupts and set USB reset */ + USBD_CTL = CTL_SETRST; + + /* clear all interrupt flags */ + USBD_INTF = 0U; + + /* close device */ + USBD_CTL = CTL_SETRST | CTL_CLOSE; +} + +/*! + \brief set device address + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void usbd_address_set (usb_dev *udev) +{ + USBD_DADDR = DADDR_USBEN | udev->dev_addr; +} + +/*! + \brief handle USB reset event + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void usbd_ep_reset (usb_dev *udev) +{ + uint8_t i = 0U; + + usb_transc *transc = &udev->transc_in[0]; + + btable_ep[0].tx_addr = EP0_TX_ADDR; + btable_ep[0].tx_count = 0U; + + transc->max_len = USBD_EP0_MAX_SIZE; + + transc = &udev->transc_out[0]; + + btable_ep[0].rx_addr = EP0_RX_ADDR; + + transc->max_len = USBD_EP0_MAX_SIZE; + + if (transc->max_len > 62U) { + btable_ep[0].rx_count = ((uint16_t)((uint16_t)transc->max_len << 5) - 1U) | 0x8000U; + } else { + btable_ep[0].rx_count = ((transc->max_len + 1U) & ~1U) << 9U; + } + + /* reset non-control endpoints */ + for (i = 1U; i < EP_COUNT; i++) { + USBD_EPxCS(i) = (USBD_EPxCS(i) & (~EPCS_MASK)) | i; + } + + /* clear endpoint 0 register */ + USBD_EPxCS(0U)= (uint16_t)(USBD_EPxCS(0U)); + + USBD_EPxCS(0U) = EP_CONTROL | EPRX_VALID | EPTX_NAK; + + /* set device address as default address 0 */ + USBD_DADDR = DADDR_USBEN; + + udev->cur_status = (uint8_t)USBD_DEFAULT; +} + +/*! + \brief endpoint initialization + \param[in] udev: pointer to USB core instance + \param[in] buf_kind: endpoint buffer kind + \param[in] buf_addr: endpoint buffer address + \param[in] ep_desc: pointer to endpoint descriptor + \param[out] none + \retval none +*/ +static void usbd_ep_setup (usb_dev *udev, uint8_t buf_kind, uint32_t buf_addr, const usb_desc_ep *ep_desc) +{ + uint8_t ep_addr = ep_desc->bEndpointAddress; + uint8_t ep_num = EP_ID(ep_addr); + uint16_t max_len = ep_desc->wMaxPacketSize; + + usb_transc *transc = NULL; + + /* set the endpoint type */ + USBD_EPxCS(ep_num) = ep_type[ep_desc->bmAttributes & USB_EPTYPE_MASK] | ep_num; + + if (EP_DIR(ep_addr)) { + transc = &udev->transc_in[ep_num]; + + transc->max_len = max_len; + + if ((uint8_t)EP_BUF_SNG == buf_kind) { + btable_ep[ep_num].tx_addr = buf_addr; + + /* configure the endpoint status as NAK status */ + USBD_EP_TX_STAT_SET(ep_num, EPTX_NAK); + } else if ((uint8_t)EP_BUF_DBL == buf_kind) { + USBD_EP_DBL_BUF_SET(ep_num); + + btable_ep[ep_num].tx_addr = buf_addr & 0xFFFFU; + btable_ep[ep_num].rx_addr = (buf_addr & 0xFFFF0000U) >> 16U; + + USBD_EP_TX_STAT_SET(ep_num, EPTX_VALID); + USBD_EP_RX_STAT_SET(ep_num, EPRX_DISABLED); + } else { + /* error operation */ + } + } else { + transc = &udev->transc_out[ep_num]; + + transc->max_len = max_len; + + if ((uint8_t)EP_BUF_SNG == buf_kind) { + btable_ep[ep_num].rx_addr = buf_addr; + } else if ((uint8_t)EP_BUF_DBL == buf_kind) { + USBD_EP_DBL_BUF_SET(ep_num); + + USBD_TX_DTG_TOGGLE(ep_num); + + btable_ep[ep_num].tx_addr = buf_addr & 0xFFFFU; + btable_ep[ep_num].rx_addr = (buf_addr & 0xFFFF0000U) >> 16U; + + if (max_len > 62U) { + btable_ep[ep_num].tx_count = (((uint32_t)max_len << 5) - 1U) | 0x8000U; + } else { + btable_ep[ep_num].tx_count = ((max_len + 1U) & ~1U) << 9U; + } + } else { + /* error operation */ + } + + if (max_len > 62U) { + btable_ep[ep_num].rx_count = (((uint32_t)max_len << 5U) - 1U) | 0x8000U; + } else { + btable_ep[ep_num].rx_count = ((max_len + 1U) & ~1U) << 9U; + } + + if ((uint8_t)EP_BUF_SNG == buf_kind) { + /* configure the endpoint status as NAK status */ + USBD_EP_RX_STAT_SET(ep_num, EPRX_NAK); + } else if ((uint8_t)EP_BUF_DBL == buf_kind) { + USBD_EP_RX_STAT_SET(ep_num, EPRX_DISABLED); + USBD_EP_TX_STAT_SET(ep_num, EPTX_NAK); + } else { + /* error operation */ + } + } +} + +/*! + \brief configure the endpoint when it is disabled + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +static void usbd_ep_disable (usb_dev *udev, uint8_t ep_addr) +{ + (void)udev; + + uint8_t ep_num = EP_ID(ep_addr); + + if (EP_DIR(ep_addr)) { + USBD_TX_DTG_CLEAR(ep_num); + + /* configure the endpoint status as DISABLED */ + USBD_EP_TX_STAT_SET(ep_num, EPTX_DISABLED); + } else { + USBD_RX_DTG_CLEAR(ep_num); + + /* configure the endpoint status as DISABLED */ + USBD_EP_RX_STAT_SET(ep_num, EPRX_DISABLED); + } +} + +/*! + \brief enable endpoint to receive + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +static void usbd_ep_rx_enable (usb_dev *udev, uint8_t ep_addr) +{ + (void)udev; + + /* enable endpoint to receive */ + USBD_EP_RX_STAT_SET(EP_ID(ep_addr), EPRX_VALID); +} + +/*! + \brief set an endpoint to STALL status + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +static void usbd_ep_stall_set (usb_dev *udev, uint8_t ep_addr) +{ + uint8_t ep_num = EP_ID(ep_addr); + + if (0U == ep_num) { + USBD_EP_TX_STAT_SET(0U, EPTX_STALL); + USBD_EP_RX_STAT_SET(0U, EPRX_STALL); + } else { + if (EP_DIR(ep_addr)) { + udev->transc_in[ep_num].ep_stall = 1U; + + USBD_EP_TX_STAT_SET(ep_num, EPTX_STALL); + } else { + udev->transc_out[ep_num].ep_stall = 1U; + + USBD_EP_RX_STAT_SET(ep_num, EPRX_STALL); + } + } +} + +/*! + \brief clear endpoint stalled status + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +static void usbd_ep_stall_clear (usb_dev *udev, uint8_t ep_addr) +{ + uint8_t ep_num = EP_ID(ep_addr); + + if (EP_DIR(ep_addr)) { + /* clear endpoint data toggle bit */ + USBD_TX_DTG_CLEAR(ep_num); + + udev->transc_in[ep_num].ep_stall = 0U; + + /* clear endpoint stall status */ + USBD_EP_TX_STAT_SET(ep_num, EPTX_VALID); + } else { + /* clear endpoint data toggle bit */ + USBD_RX_DTG_CLEAR(ep_num); + + udev->transc_out[ep_num].ep_stall = 0U; + + /* clear endpoint stall status */ + USBD_EP_RX_STAT_SET(ep_num, EPRX_VALID); + } +} + +/*! + \brief get the endpoint status + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval endpoint status +*/ +static uint8_t usbd_ep_status (usb_dev *udev, uint8_t ep_addr) +{ + (void)udev; + + uint32_t epcs = USBD_EPxCS(EP_ID(ep_addr)); + + if (EP_DIR(ep_addr)) { + return (uint8_t)(epcs & EPxCS_TX_STA); + } else { + return (uint8_t)(epcs & EPxCS_RX_STA); + } +} + +/*! + \brief write data from user FIFO to USB RAM + \param[in] user_fifo: pointer to user FIFO + \param[in] ep_num: endpoint number + \param[in] bytes: the bytes count of the write data + \param[out] none + \retval none +*/ +static void usbd_ep_data_write (uint8_t *user_fifo, uint8_t ep_num, uint16_t bytes) +{ + if (0U != bytes) { + uint32_t n; + uint32_t *write_addr = (uint32_t *)(btable_ep[ep_num].tx_addr * 2U + USBD_RAM); + + for (n = 0U; n < (bytes + 1U) / 2U; n++) { + *write_addr++ = *((uint16_t*)user_fifo); + user_fifo += 2U; + } + } + + btable_ep[ep_num].tx_count = bytes; + + USBD_EP_TX_STAT_SET(ep_num, EPTX_VALID); +} + +/*! + \brief read data from USBRAM to user FIFO + \param[in] user_fifo: pointer to user FIFO + \param[in] ep_num: endpoint number + \param[in] buf_kind: endpoint buffer kind + \param[out] none + \retval none +*/ +static uint16_t usbd_ep_data_read (uint8_t *user_fifo, uint8_t ep_num, uint8_t buf_kind) +{ + uint16_t n = 0U, bytes = 0U; + uint32_t *read_addr = NULL; + + if ((uint8_t)EP_BUF_SNG == buf_kind) { + bytes = (uint16_t)(btable_ep[ep_num].rx_count & EPRCNT_CNT); + + read_addr = (uint32_t *)(btable_ep[ep_num].rx_addr * 2U + USBD_RAM); + } else if ((uint8_t)EP_BUF_DBL == buf_kind) { + if (USBD_EPxCS(ep_num) & EPxCS_TX_DTG) { + bytes = (uint16_t)(btable_ep[ep_num].tx_count & EPRCNT_CNT); + + read_addr = (uint32_t *)(btable_ep[ep_num].tx_addr * 2U + USBD_RAM); + } else { + bytes = (uint16_t)(btable_ep[ep_num].rx_count & EPRCNT_CNT); + + read_addr = (uint32_t *)(btable_ep[ep_num].rx_addr * 2U + USBD_RAM); + } + } else { + return 0U; + } + + for (n = 0U; n < (bytes + 1U) / 2U; n++) { + *((uint16_t*)user_fifo) = (uint16_t)*read_addr++; + user_fifo += 2U; + } + + return bytes; +} + +#ifdef USBD_LOWPWR_MODE_ENABLE + +/*! + \brief restore system clocks and power while exiting from suspend mode + \param[in] none + \param[out] none + \retval none +*/ +static void lowpower_mode_exit (void) +{ + /* restore system clock */ + +#ifdef LPM_ENABLED + /* enable IRC8M */ + rcu_osci_on(RCU_IRC8M); + + /* wait till IRC8M is ready */ + while (RESET == rcu_flag_get(RCU_FLAG_IRC8MSTB)) { + } +#else + /* enable HXTAL */ + rcu_osci_on(RCU_HXTAL); + + /* wait till HXTAL is ready */ + while(RESET == rcu_flag_get(RCU_FLAG_HXTALSTB)) { + } +#endif + + /* enable PLL */ + rcu_osci_on(RCU_PLL_CK); + + /* wait till PLL is ready */ + while(RESET == rcu_flag_get(RCU_FLAG_PLLSTB)) { + } + + /* select PLL as system clock source */ + rcu_system_clock_source_config(RCU_CKSYSSRC_PLL); + + /* wait till PLL is used as system clock source */ + while(0x08U != rcu_system_clock_source_get()) { + } + + /* low power sleep on exit disabled */ + system_lowpower_reset(SCB_LPM_DEEPSLEEP); + +#ifdef USE_IRC48M + /* enable IRC48M clock */ + rcu_osci_on(RCU_IRC48M); + + /* wait till IRC48M is ready */ + while (SUCCESS != rcu_osci_stab_wait(RCU_IRC48M)) { + } + + rcu_ck48m_clock_config(RCU_CK48MSRC_IRC48M); +#endif +} + +#endif /* USBD_LOWPWR_MODE_ENABLE */ + +/*! + \brief resume the USB device + \param[in] none + \param[out] none + \retval none +*/ +static void usbd_resume (usb_dev *udev) +{ +#ifdef LPM_ENABLED + if(1 == udev->lpm.L1_remote_wakeup){ + USBD_CTL |= CTL_L1RSREQ; + } +#endif /* LPM_ENABLED */ + + if(1U == usbd_core.dev->pm.remote_wakeup){ + /* make USB resume */ + USBD_CTL |= CTL_RSREQ; + } +} + +/*! + \brief set USB device to leave mode + \param[in] none + \param[out] none + \retval none +*/ +static void usbd_leave_suspend (void) +{ + /* clear low_power mode bit in USBD_CTL */ + USBD_CTL &= ~CTL_LOWM; + +#ifdef USBD_LOWPWR_MODE_ENABLE + + /* restore normal operations */ + lowpower_mode_exit(); + +#endif /* USBD_LOWPWR_MODE_ENABLE */ + + /* clear SETSPS bit */ + USBD_CTL &= ~CTL_SETSPS; +} + +/*! + \brief set USB device to enter suspend mode + \param[in] none + \param[out] none + \retval none +*/ +static void usbd_suspend (void) +{ + /* set USB module to suspend and low-power mode */ + USBD_CTL |= CTL_SETSPS | CTL_LOWM; + +#ifdef USBD_LOWPWR_MODE_ENABLE + + /* check wakeup flag is set */ + if (0U == (USBD_INTF & INTF_WKUPIF)) { + /* enter DEEP_SLEEP mode with LDO in low power mode */ + pmu_to_deepsleepmode(PMU_LDO_NORMAL,PMU_LDO_LOWPOWER, WFI_CMD); + } else { + /* clear wakeup interrupt flag */ + CLR(WKUPIF); + + /* clear set_suspend flag */ + USBD_CTL &= ~CTL_SETSPS; + } + +#endif /* USBD_LOWPWR_MODE_ENABLE */ +} diff --git b/Drivers/GD32F30x_usbd_library/usbd/Source/usbd_lld_int.c a/Drivers/GD32F30x_usbd_library/usbd/Source/usbd_lld_int.c new file mode 100644 index 0000000..c547c33 --- /dev/null +++ a/Drivers/GD32F30x_usbd_library/usbd/Source/usbd_lld_int.c @@ -0,0 +1,276 @@ + /*! + \file usbd_lld_int.c + \brief USB device low level interrupt routines + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_lld_int.h" +#include "usbd_lld_core.h" + +/* local function prototypes ('static') */ +static void usbd_int_suspend (usb_dev *udev); + +/*! + \brief handle USB high priority successful transfer event + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void usbd_int_hpst (usb_dev *udev) +{ + __IO uint16_t int_status = 0U; + + /* wait till interrupts are not pending */ + while ((int_status = (uint16_t)USBD_INTF) & (uint16_t)INTF_STIF) { + /* get endpoint number */ + uint8_t ep_num = (uint8_t)(int_status & INTF_EPNUM); + + uint8_t transc_num = (uint8_t)TRANSC_UNKNOWN; + + if (int_status & INTF_DIR) { + if (USBD_EPxCS(ep_num) & EPxCS_RX_ST) { + uint16_t count = 0U; + + usb_transc *transc = &udev->transc_out[ep_num]; + + /* clear successful receive interrupt flag */ + USBD_EP_RX_ST_CLEAR(ep_num); + + count = udev->drv_handler->ep_read (transc->xfer_buf, ep_num, (uint8_t)EP_BUF_DBL); + + user_buffer_free(ep_num, (uint8_t)DBUF_EP_OUT); + + transc->xfer_buf += count; + transc->xfer_count += count; + transc->xfer_len -= count; + + if ((0U == transc->xfer_len) || (count < transc->max_len)) { + USBD_EP_RX_STAT_SET(ep_num, EPRX_NAK); + + transc_num = (uint8_t)TRANSC_OUT; + } + } + } else { + /* handle the in direction transaction */ + if (USBD_EPxCS(ep_num) & EPxCS_TX_ST) { + /* clear successful transmit interrupt flag */ + USBD_EP_TX_ST_CLEAR(ep_num); + + transc_num = (uint8_t)TRANSC_IN; + } + } + + if ((uint8_t)TRANSC_UNKNOWN != transc_num) { + udev->ep_transc[ep_num][transc_num](udev, ep_num); + } + } +} + +/*! + \brief USB interrupt events service routine + \param[in] none + \param[out] none + \retval none +*/ +void usbd_isr (void) +{ + __IO uint16_t int_status = (uint16_t)USBD_INTF; + __IO uint16_t int_flag = (uint16_t)(USBD_INTF & (USBD_CTL & USBD_INTEN)); + + usb_dev *udev = usbd_core.dev; + + if (INTF_STIF & int_flag) { + /* wait till interrupts are not pending */ + while ((int_status = (uint16_t)USBD_INTF) & (uint16_t)INTF_STIF) { + /* get endpoint number */ + uint8_t ep_num = (uint8_t)(int_status & INTF_EPNUM); + + if (int_status & INTF_DIR) { + /* handle the USB OUT direction transaction */ + if (USBD_EPxCS(ep_num) & EPxCS_RX_ST) { + /* clear successful receive interrupt flag */ + USBD_EP_RX_ST_CLEAR(ep_num); + + if (USBD_EPxCS(ep_num) & EPxCS_SETUP) { + + if (ep_num == 0U) { + udev->ep_transc[ep_num][TRANSC_SETUP](udev, ep_num); + } else { + return; + } + } else { + usb_transc *transc = &udev->transc_out[ep_num]; + + uint16_t count = udev->drv_handler->ep_read (transc->xfer_buf, ep_num, (uint8_t)EP_BUF_SNG); + + transc->xfer_buf += count; + transc->xfer_count += count; + + if ((transc->xfer_count >= transc->xfer_len) || (count < transc->max_len)) { + if (udev->ep_transc[ep_num][TRANSC_OUT]) { + udev->ep_transc[ep_num][TRANSC_OUT](udev, ep_num); + } + } else { + udev->drv_handler->ep_rx_enable(udev, ep_num); + } + } + } + } else { + /* handle the USB IN direction transaction */ + if (USBD_EPxCS(ep_num) & EPxCS_TX_ST) { + /* clear successful transmit interrupt flag */ + USBD_EP_TX_ST_CLEAR(ep_num); + + usb_transc *transc = &udev->transc_in[ep_num]; + + if (transc->xfer_len == 0U) { + if (udev->ep_transc[ep_num][TRANSC_IN]) { + udev->ep_transc[ep_num][TRANSC_IN](udev, ep_num); + } + } else { + usbd_ep_send(udev, ep_num, transc->xfer_buf, transc->xfer_len); + } + } + } + } + } + + if (INTF_WKUPIF & int_flag) { + /* clear wakeup interrupt flag in INTF */ + CLR(WKUPIF); + + /* restore the old cur_status */ + udev->cur_status = udev->backup_status; + +#ifdef LPM_ENABLED + if ((0U == udev->pm.remote_wakeup_on) && (0U == udev->lpm.L1_resume)) { + resume_mcu(udev); + } else if (1U == udev->pm.remote_wakeup_on) { + /* no operation */ + } else { + udev->lpm.L1_resume = 0U; + } + + /* clear L1 remote wakeup flag */ + udev->lpm.L1_remote_wakeup = 0U; +#else + if (0U == udev->pm.remote_wakeup_on) { + resume_mcu(udev); + } +#endif /* LPM_ENABLED */ + } + + if (INTF_SPSIF & int_flag) { + if(!(USBD_CTL & CTL_RSREQ)) { + usbd_int_suspend (udev); + + /* clear of suspend interrupt flag bit must be done after setting of CTLR_SETSPS */ + CLR(SPSIF); + } + } + + if (INTF_SOFIF & int_flag) { + /* clear SOF interrupt flag in INTF */ + CLR(SOFIF); + + /* if necessary, user can add code here */ + if (NULL != usbd_int_fops) { + (void)usbd_int_fops->SOF(udev); + } + } + + if (INTF_ESOFIF & int_flag) { + /* clear ESOF interrupt flag in INTF */ + CLR(ESOFIF); + + /* control resume time by ESOFs */ + if (udev->pm.esof_count > 0U) { + if (0U == --udev->pm.esof_count) { + if (udev->pm.remote_wakeup_on) { + USBD_CTL &= ~CTL_RSREQ; + + udev->pm.remote_wakeup_on = 0U; + } else { + USBD_CTL |= CTL_RSREQ; + + udev->pm.esof_count = 3U; + udev->pm.remote_wakeup_on = 1U; + } + } + } + } + + if (INTF_RSTIF & int_flag) { + /* clear reset interrupt flag in INTF */ + CLR(RSTIF); + + udev->drv_handler->ep_reset(udev); + } + +#ifdef LPM_ENABLED + if (INTF_L1REQ & int_flag) { + /* clear L1 ST bit in LPM INTF */ + USBD_INTF = CLR(L1REQ); + + /* read BESL field from subendpoint0 register which corresponds to HIRD parameter in LPM spec */ + udev->lpm.besl = (USBD_LPMCS & LPMCS_BLSTAT) >> 4; + + /* read BREMOTEWAKE bit from subendpoint0 register which corresponding to bRemoteWake bit in LPM request */ + udev->lpm.L1_remote_wakeup = (USBD_LPMCS & LPMCS_REMWK) >> 3; + + /* process USB device core layer suspend routine */ + usbd_int_suspend(udev); + } +#endif /* LPM_ENABLED */ +} + +/*! + \brief handle USB suspend event + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void usbd_int_suspend (usb_dev *udev) +{ + /* store the device current status */ + udev->backup_status = udev->cur_status; + + /* set device in suspended state */ + udev->cur_status = (uint8_t)USBD_SUSPENDED; + + /* usb enter in suspend mode and mcu system in low power mode */ + if (udev->pm.suspend_enabled) { + usbd_to_suspend(udev); + } else { + /* if not possible then resume after xx ms */ + udev->pm.esof_count = 3U; + } +} diff --git b/Inc/base_config.h a/Inc/base_config.h new file mode 100644 index 0000000..8047be8 --- /dev/null +++ a/Inc/base_config.h @@ -0,0 +1,1287 @@ + +#ifndef _BASE_CONFIG_H_ +#define _BASE_CONFIG_H_ + +#ifndef _OLD_CONFIG_ + + + + +//*--------------------------- +//* !!!!!!!绂佹淇敼!!!!!!!!! +//*--------------------------- +#define TYPE_T2 10 + +#define TYPE_EVS200 50 +#define TYPE_EVS100 51 + +#define TYPE_CRS200 40 +#define TYPE_CRS200_NL 41 +#define TYPE_CRS200_433 30 +#define TYPE_C100 41 +//-------------------------------------- +/** +*EVS200: +* 1,E11 - a,4涓ā鍧楅兘鍙戝熀纭淇℃爣锛屾姇绁ㄤ俊鏍囧拰ack; b,闇瑕佹妸鍩虹淇℃爣鍜屾姇绁ㄤ俊鏍囬兘淇敼鎴28Bytes; //20200616 +* 2,G1 - a,AES鍔犲瘑 淇℃爣闇瑕佸彂閫32bytes;b,鎶曠エ淇℃爣涓甫涓婚鐐逛俊鎭紱c,瀹归噺鍧囪 銆 +* +*CRS200: +* 1,T1Lite - 鍦ㄦ姇绁ㄤ俊鏍噒mp32蹇呴』鏄俊鏍囩殑crc鏍¢獙鐨勪綆瀛楄妭! +* +*EVS200_433锛 +* 1,voxm - 杞彂鏁版嵁蹇呴』瑕佸姞crc鏍¢獙!! +*/ + + + + + +// <<< Use Configuration Wizard in Context Menu >>> + +//----------------------------------------------------------------------- +// debug config +// debug function-choose 5.8G or No5.8G +// monitor vote data for lose vote +// other debug function: force keypad poweroff when test mode +// RF type(5.8G or not) +// Default:OFF +// <0=> OFF +// <1=> 5.8G +// <2=> Not5.8G(2.4G/433M) +#define DEBUG_CONFIG 2 + +#if (DEBUG_CONFIG ==1) + #define _DEBUG_CORE_ //鎬诲紑鍏 + #define _DBG_VOICE_KP //鐩戞祴閿洏鏁版嵁锛屽寘鎷闊冲拰闈炶闊虫ā寮;T2璇█鍩虹珯 +#elif (DEBUG_CONFIG ==2) + #define _DEBUG_CORE_ //鎬诲紑鍏 + #define _DBG_2G4_KP_ //涓庨敭鐩樼殑閫氫俊 +#endif + +// base forces all keypad poweroff when SDK disconnect +// This function is used to keypad battary test +//#define _SDK_OFFLINE_ //sdk鏂仈鍚庯紝鍩虹珯寮哄埗鍏抽棴鎵鏈夐敭鐩; 鐢ㄤ簬閰嶅悎鍋氶敭鐩樼數閲忔祴璇;; +//#define _SDK_SYSMODE0_KEEPTIMER_ //sysmode0淇濇寔涓娈垫椂闂村悗鍏抽棴鎵鏈夐敭鐩 +// + +// + +//------------------------------------------------------------------------------------------ +// Base model choose and config +// you must choose a BASE Model,then config parameter if you need; +// you should input test or release version, +// Base model +// Default:OFF +// <0=> OFF +// <1=> T2 +// <2=> EVS200 +// <3=> EVS100 +// <4=> CRS200 +// <5=> CRS200_433 +// <6=> C200 +// <7=> CRS200_5G8 +// <8=> C100 + +#define BASE_MODEL 8 + +//----- +#define T2 1 +#define EVS200 2 +#define EVS100 3 +#define CRS200 4 +#define CRS200_433 5 +#define C200 6 +#define CRS200_5G8 7 +#define C100 8 + + + +void operation_debug_io(unsigned char nbr);//debug only +#define TEST_SW1 100 + + + +// T2 voice config +// hardware:RF200 board with charge Box +// RF:5.8G-A5130 ;1 rf modual +// usb High speed(usb3300 ENABLE) +#if (BASE_MODEL ==T2) + //--------------1 HARDWARE_SETTING -------------------------------------------- + //纭欢浠e彿 + #define HMODEL 0xCA //202 + #define BASE_TYPE TYPE_T2 + + #define BASE_HARDWARE_T2 + //#define BASE_HARDWARE_200S + /*a,No display; + **b,buzzer IO changge*/ + + // I2C lcd switch //lcd display switch + #define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + //#define SI24R1 + //#define CC2500 + //#define CC1101 + #define A5130 + + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0 + #define RF_MODUAL1_SET 0 + #define RF_MODUAL2_SET 0xff + #define RF_MODUAL3_SET 0 + + #define RF_SPEED 0//鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + #define LOCK_RF_CNT 0//閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define BASE_TEST 0 //鍩虹珯娴嬭瘯 + #define MON_FREQ 1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 0 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 1 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 0 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 0 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 0 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜 + #define AUX_ATT 0 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 0 //骞挎挱淇℃伅淇℃爣 + + + #define CRC16_CHECK_KEYPAD 0//1 //CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁; + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + #define AES 0//1 + #define NFC 1// +#define _NEW_NFC_APP //浼樺寲NFC瀵诲崱 + #define NFC_T2 + #define T2_KEY60 //瀵筽latform鏉ヨ锛屽氨鏄槸鍚﹀紑鍚竴涓柊鐨則imer瀹氭椂鍣 + #define TCPIP 0//1 + #define USB3300 1 //highspeed + + //-----from base_core.h-------- + #define RF_5G8 + #define KEYPAD60 //绗簩鐗堣闊冲崗璁-60璺 + #define VOICE_PROTOCOL_3RD //绗笁鐗堣闊冲崗璁-60璺+鍙潬浼犺緭(鍩轰簬绗簩鐗) + #define BUF_ALERT2 //鏀寔閿洏閲嶄紶璇煶鍗曠嫭杩炵画鐐瑰悕 + /*寮鍚瀹忓畾涔夛紝鎶曠エ鏁版嵁澶勭悊(rf鎺ユ敹鍜宺pt to pc鐨勬姇绁ㄦ暟鎹)灏卞湪涓荤▼搴忓惊鐜腑杩涜锛屽惁鍒欏湪涓柇閲岀洿鎺ュ鐞(榛樿) */ + #define MAINLOOP_PROCESS_VOTE + + // test version + // SW1=100 for test version + #define VER_TEST 1 + #if (VER_TEST==1) + #define SW1 100 + // SW2 + #define SW2 0 + // SW3 + #define SW3 5//4//3//2//1 + #endif + // + + // release version + // this is release version + #define VER_RELEASE 0 + #if (VER_RELEASE==1) + // SW1 + #define SW1 0 + // SW2 + #define SW2 4 + // SW3 + #define SW3 3 + #endif + // + +// ////鍩虹珯鍥轰欢鐗堟湰 +//// #define SW1 0 +//// #define SW2 4 +//// #define SW3 3//2//1 +// #define SW1 1//TEST_SW1 +// #define SW2 0 +// #define SW3 0//24 + +// + +// CRS200_5G8 config +// hardware:200/400S board +// RF:5.8G-A5130 ;2 rf modual:timing switch work-ABABAB..... +// usb High speed(usb3300 ENABLE) +#elif (BASE_MODEL ==CRS200_5G8) + //--------------1 HARDWARE_SETTING -------------------------------------------- + //纭欢浠e彿 + #define HMODEL 0xCA //202 + #define BASE_TYPE TYPE_T2 + + //#define BASE_HARDWARE_T2 + #define BASE_HARDWARE_200S + /*a,No display; + **b,buzzer IO changge*/ + + // I2C lcd switch //lcd display switch + //#define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + //#define SI24R1 + //#define CC2500 + //#define CC1101 + #define A5130 + + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0 + #define RF_MODUAL1_SET 0xff + #define RF_MODUAL2_SET 0xfb + #define RF_MODUAL3_SET 0 + + #define RF_SPEED 0//鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + #define LOCK_RF_CNT 0//閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define BASE_TEST 0 //鍩虹珯娴嬭瘯 + #define MON_FREQ 1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 0 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 1 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 0 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 0 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 0 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜 + #define AUX_ATT 0 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 0 //骞挎挱淇℃伅淇℃爣 + + + #define CRC16_CHECK_KEYPAD 0//1 //CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁; + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + #define AES 0//1 + #define NFC 1// + #define _NEW_NFC_APP //浼樺寲NFC瀵诲崱 + #define NFC_T2 + #define T2_KEY60 //瀵筽latform鏉ヨ锛屽氨鏄槸鍚﹀紑鍚竴涓柊鐨則imer瀹氭椂鍣 + #define TCPIP 0//1 + #define USB3300 1 //highspeed + + //-----from base_core.h-------- + #define RF_5G8 + #define KEYPAD60 //绗簩鐗堣闊冲崗璁-60璺 + #define VOICE_PROTOCOL_3RD //绗笁鐗堣闊冲崗璁-60璺+鍙潬浼犺緭(鍩轰簬绗簩鐗) + #define BUF_ALERT2 //鏀寔閿洏閲嶄紶璇煶鍗曠嫭杩炵画鐐瑰悕 + /*寮鍚瀹忓畾涔夛紝鎶曠エ鏁版嵁澶勭悊(rf鎺ユ敹鍜宺pt to pc鐨勬姇绁ㄦ暟鎹)灏卞湪涓荤▼搴忓惊鐜腑杩涜锛屽惁鍒欏湪涓柇閲岀洿鎺ュ鐞(榛樿) */ + #define MAINLOOP_PROCESS_VOTE + + #define MULTI_5G8 1 + + + // test version + // SW1=100 for test version + #define VER_TEST 1 + #if (VER_TEST==1) + #define SW1 100 + // SW2 + #define SW2 0 + // SW3 + #define SW3 1 + #endif + // + + // release version + // this is release version + #define VER_RELEASE 0 + #if (VER_RELEASE==1) + // SW1 + #define SW1 0 + // SW2 + #define SW2 0 + // SW3 + #define SW3 0 + #endif + // + +// + +// EVS200 config +// hardware:200/400S board +// RF:cc2500 ;4 rf modual-RF comm +// usb High speed(usb3300 ENABLE) +#elif (BASE_MODEL == EVS200) + //--------------1 HARDWARE_SETTING -------------------------------------------- + //纭欢浠e彿 + #define HMODEL 0xCB + #define BASE_TYPE TYPE_EVS200 + + //#define BASE_HARDWARE_T2 + #define BASE_HARDWARE_200S + /*a,No display; + **b,buzzer IO changge*/ + // I2C lcd switch //lcd display switch + //#define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + //#define SI24R1 + #define CC2500 + //#define CC1101 + //#define A5130 + + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0xff// + #define RF_MODUAL1_SET 0xfe + #define RF_MODUAL2_SET 0xfe + #define RF_MODUAL3_SET 0xfe + + #define RF_SPEED 0 //鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + #define LOCK_RF_CNT 0 //閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define BASE_TEST 1 //鍩虹珯娴嬭瘯 + #define MON_FREQ 1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 0 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 0//1 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 0//1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 0 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 0 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 0 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜 + #define AUX_ATT 0 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 0 //骞挎挱淇℃伅淇℃爣 + + #define CRC16_CHECK_KEYPAD 1 //CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁; + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + #define AES 1 //闇瑕佹墦寮鍜岄敭鐩樼殑CRC鏍¢獙 CRC16_CHECK_KEYPAD + #define NFC 1 + #define NFC_G1 + #define TCPIP 1 + + // test version + // SW1=100 for test version + #define VER_TEST 1 + #if (VER_TEST==1) + #define SW1 100 + // SW2 + #define SW2 0 + // SW3 + #define SW3 73 + #endif + // + + // release version + // this is release version + #define VER_RELEASE 0 + #if (VER_RELEASE==1) + // SW1 + #define SW1 0 + // SW2 + #define SW2 2 + // SW3 + #define SW3 0 + #endif + // + ////鍩虹珯鍥轰欢鐗堟湰 + //formal version +// #define SW1 0 +// #define SW2 2//1 +// #define SW3 0 + //test Version +// #define SW1 TEST_SW1 +// #define SW2 0 +// #define SW3 73//70//69//68//66//67//65//64//63//62//61//60//59//58//57//56//55//54//53//52//0 +// //debug//47//46//45//44//43//42//41//40//39//38//37//36//35//34//33//32//31//30//29//28//27//26//25//24//23//22//21//20//19//18//17//16//15//14//13//12//10//9//8//7//6//5//4//3//2//1 + +// + + +// CRS200 config +// hardware:200/400S board +// RF:24L01 ;2 rf modual-RF com and whitelist +// usb High speed(usb3300 ENABLE) +//rf modual monitor +#elif (BASE_MODEL == CRS200) + //--------------1 HARDWARE_SETTING -------------------------------------------- + //纭欢浠e彿 + #define HMODEL 0xCE + #define BASE_TYPE TYPE_CRS200 + + //#define BASE_HARDWARE_T2 + //hardware 200s RF modual silk screen:J2-J3-J1-J4 + #define BASE_HARDWARE_200S + + /*a,No display; + **b,buzzer IO changge*/ + // I2C lcd switch //lcd display switch + //#define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + #define SI24R1 + //#define CC2500 + //#define CC1101 + //#define A5130 + + + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0//xff + #define RF_MODUAL1_SET 0xff + #define RF_MODUAL2_SET 0xfb + #define RF_MODUAL3_SET 0//xfb + + #define RF_SPEED 0//鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + #define LOCK_RF_CNT 2//閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 + //#define KEYPAD_TYPE KP_T1LITE //閫傞厤鐗规畩閿洏锛0-閫氱敤;other-鐗规畩閿洏浠e彿 + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define BASE_TEST 1 //鍩虹珯娴嬭瘯 + #define MON_FREQ 1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 1 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 1 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 0 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 0 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 0 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜 0-off;1-on + #define AUX_ATT 0 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 1 //骞挎挱淇℃伅淇℃爣 + + #define CRC16_CHECK_KEYPAD 2//1 //0-off,1-26bytes,2-CRC22bytes,3- 22or26bytes; CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁;鍥犱负AES鍖呮嫭浜哻rc鎵浠ヤ笉鑳藉拰AES鍔熻兘鍚屾椂寮鍚; + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + #define AES 0//1 + #define NFC 1 +#define _NEW_NFC_APP //浼樺寲NFC瀵诲崱 + #define NFC_STD_T1LITE + #define NFC_STD + //#define NFC_T2 + #define TCPIP 1 + + #define USB3300 1 //highspeed + + //-----from base_core.h-------- + #define RF_MODUAL_MONITOR //rf 妯″潡鐩戞祴 + + + // test version + // SW1=100 for test version + #define VER_TEST 1 + #if (VER_TEST==1) + #define SW1 100 + // SW2 + #define SW2 0 + // SW3 + #define SW3 87 + #endif + // + + // release version + // this is release version + #define VER_RELEASE 0 + #if (VER_RELEASE==1) + // SW1 + #define SW1 0 + // SW2 + #define SW2 2 + // SW3 + #define SW3 3 + #endif + // + ////鍩虹珯鍥轰欢鐗堟湰 + //formal version +// #define SW1 0 +// #define SW2 2//1 +// #define SW3 3//2//1//0 + //cong V100.0.18鐗堟湰寮濮嬩娇鐢ㄥ唴缃ぉ绾挎ā鍧 +// #define SW1 TEST_SW1 +// #define SW2 0 +// #define SW3 87//86//85//84//83//82//81//80//74//73//72//71//70//69//68//67//66//63//62//61//57//55//54//53//52//50//49//48//47//46//45//44//43//42//41//40//39//38//37//36//35//33//32//30//29//28//27//26//23//22//21//20//19//18//17//16//15//14//13//12//11//10//9//8//7//6//5//4//3//2//1//0 + +// + + +#elif (BASE_MODEL == CRS200_NENGLONG) + //--------------1 HARDWARE_SETTING -------------------------------------------- + //纭欢浠e彿 + #define HMODEL 0xCC + #define BASE_TYPE TYPE_CRS200_NL //CRS200_NENGLONG + + //#define BASE_HARDWARE_T2 + //hardware 200s RF modual silk screen:J2-J3-J1-J4 + #define BASE_HARDWARE_200S + + /*a,No display; + **b,buzzer IO changge*/ + // I2C lcd switch //lcd display switch + //#define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + #define SI24R1 + //#define CC2500 + //#define CC1101 + //#define A5130 + + /* + //log_mod=7;lock_chan=80;no_match code;com speed=1M;rf_sync=0x25A4*/ + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0//xff + #define RF_MODUAL1_SET 0xff + #define RF_MODUAL2_SET 0//xfb + #define RF_MODUAL3_SET 0//xfb + + #define LOCK_RF_CNT 0//閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 + #define RF_SPEED 1//鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 0//1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 0//1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define BASE_TEST 0//1 //鍩虹珯娴嬭瘯 + #define MON_FREQ 0//1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 1//0 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 1 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 7 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 80 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 1 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜,0-off;1-on + #define AUX_ATT 1 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 0 //骞挎挱淇℃伅淇℃爣 + + #define CRC16_CHECK_KEYPAD 1 //CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁;鍥犱负AES鍖呮嫭浜哻rc鎵浠ヤ笉鑳藉拰AES鍔熻兘鍚屾椂寮鍚; + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + #define AES 0//1 + #define NFC 1 + #define NFC_STD_T1LITE + #define NFC_STD + //#define NFC_T2 + #define TCPIP 0//1 + + ////鍩虹珯鍥轰欢鐗堟湰 + #define SW1 TEST_SW1 + #define SW2 0 + #define SW3 5//4//3//2//1 + + +// CRS200_433 config +// hardware:200/400S board +// RF:CC1101-433M ;2 rf modual-RF com +// usb High speed(usb3300 ENABLE) +//rf modual monitor +#elif (BASE_MODEL == CRS200_433) + //--------------1 HARDWARE_SETTING -------------------------------------------- + //纭欢浠e彿 + #define HMODEL 0xCF + #define BASE_TYPE TYPE_CRS200_433 + + //#define BASE_HARDWARE_T2 + //hardware 200s RF modual silk screen:J2-J3-J1-J4 + #define BASE_HARDWARE_200S + + /*a,No display; + **b,buzzer IO changge*/ + // I2C lcd switch //lcd display switch + //#define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + //#define SI24R1 + //#define CC2500 + #define CC1101 + //#define A5130 + + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0xff + #define RF_MODUAL1_SET 0//0xfe + #define RF_MODUAL2_SET 0//xfb + #define RF_MODUAL3_SET 0xfe + + #define RF_SPEED 0//鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + #define LOCK_RF_CNT 0//閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define BASE_TEST 1 //鍩虹珯娴嬭瘯 + #define MON_FREQ 1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 0 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 0 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 0//1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 0 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 0 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 0 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜 + #define AUX_ATT 0 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 0 //骞挎挱淇℃伅淇℃爣 + + #define CRC16_CHECK_KEYPAD 1 //CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁; + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + #define AES 0//1 + #define NFC 1 + #define NFC_T2 + #define TCPIP 1 + #define USB3300 1 //highspeed + + //-----from base_core.h-------- + #define RF_MODUAL_MONITOR //rf 妯″潡鐩戞祴 + + // test version + // SW1=100 for test version + #define VER_TEST 1 + #if (VER_TEST==1) + #define SW1 100 + // SW2 + #define SW2 3 + // SW3 + #define SW3 13//12//11//10//9//8//7//6//5//4//3//2//1 + #endif + // + + // release version + // this is release version + #define VER_RELEASE 0 + #if (VER_RELEASE==1) + // SW1 + #define SW1 0 + // SW2 + #define SW2 3 + // SW3 + #define SW3 0 + #endif + // +// #define SW1 0 +// #define SW2 3 +// #define SW3 0 + ////鍩虹珯鍥轰欢鐗堟湰 + //浠嶸100.3.6寮濮嬩娇鐢ㄤ袱涓ā鍧!! +// #define SW1 TEST_SW1 +// #define SW2 3 +// #define SW3 13//12//11//10//9//8//7//6//5//4//3//2//1 + +// + + +// EVS100 config (full speed) +// hardware:100S board +// RF:cc2500 ;1 rf modual-RF com +// usb Full speed(usb3300 DISABLE) +#elif (BASE_MODEL == EVS100) + //--------------1 HARDWARE_SETTING -------------------------------------------- + //纭欢浠e彿 + #define HMODEL 0xCD + #define BASE_TYPE TYPE_EVS100 + + //#define BASE_HARDWARE_T2 + //hardware 200s RF modual silk screen:J2-J3-J1-J4 + #define BASE_HARDWARE_100S + + /*a,No display; + **b,buzzer IO changge*/ + // I2C lcd switch //lcd display switch + //#define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + //#define SI24R1 + #define CC2500 + //#define CC1101 + //#define A5130 + + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0//xff + #define RF_MODUAL1_SET 0//0xfe + #define RF_MODUAL2_SET 0//xfb + #define RF_MODUAL3_SET 0xff + + #define RF_SPEED 0//鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + #define LOCK_RF_CNT 0//閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 +// #define FIX_RF_TX_BEACON_CNT 0 //鍙戦佷俊鏍囩殑鏃犵嚎妯″潡涓暟,鏄浐瀹氱殑锛屼笌sdk璁剧疆鐨勪釜鏁版棤鍏;0-鍙湁涓绘ā鍧楀彂閫佷俊鏍; + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define BASE_TEST 1 //鍩虹珯娴嬭瘯 + #define MON_FREQ 1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 0 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 0//1 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 0//1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 0 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 0 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 0 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜 + #define AUX_ATT 0 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 0 //骞挎挱淇℃伅淇℃爣 + #define AES 1 + + #if (AES==1) + #define CRC16_CHECK_KEYPAD 1 ////0-off,1-26bytes,2-CRC22bytes,3- 22or26bytes;CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁; + #else + #define CRC16_CHECK_KEYPAD 1 //0-off,1-26bytes,2-CRC22bytes,3- 22or26bytes;CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁; + #endif + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + + #define NFC 0//1 + #define NFC_T2 + #define TCPIP 0//1 + + + // test version + // SW1=100 for test version + #define VER_TEST 0 + #if (VER_TEST==1) + #define SW1 100 + // SW2 + #define SW2 0 + // SW3 + #define SW3 8 + #endif + // + + // release version + // this is release version + #define VER_RELEASE 1 + #if (VER_RELEASE==1) + // SW1 + #define SW1 1 + // SW2 + #define SW2 1 + // SW3 + #define SW3 0 + #endif + // + + ////鍩虹珯鍥轰欢鐗堟湰 +// #define SW1 TEST_SW1 +// #define SW2 0 +// #define SW3 2//1 + +// + +// C100 config (full speed) +// hardware:100S board +// RF:24L01 ;1 rf modual-RF com +// usb Full speed(usb3300 DISABLE) +#elif (BASE_MODEL == C100) + //--------------1 HARDWARE_SETTING -------------------------------------------- + // C100 custom + // you must choose a BASE Model,then config parameter if you need; + // you should input test or release version, + // Base model + // Default:STD + // <0=> STD + // <1=> NL + // <2=> ZDY + // <3=> SUPPORT_HS6621_SOC + #define CUSTOM 3 + + + #if (CUSTOM ==0) + //纭欢浠e彿 + #define HMODEL 0xD0 + #define BASE_TYPE TYPE_C100 + + //#define BASE_HARDWARE_T2 + //hardware 200s RF modual silk screen:J2-J3-J1-J4 + #define BASE_HARDWARE_100S + + /*a,No display; + **b,buzzer IO changge*/ + // I2C lcd switch //lcd display switch + //#define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + #define SI24R1 + //#define CC2500 + //#define CC1101 + //#define A5130 + + + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0//xff + #define RF_MODUAL1_SET 0//xff + #define RF_MODUAL2_SET 0//xfb + #define RF_MODUAL3_SET 0xff + + #define RF_SPEED 0//鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + #define LOCK_RF_CNT 0//2//閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 + //#define KEYPAD_TYPE KP_T1LITE //閫傞厤鐗规畩閿洏锛0-閫氱敤;other-鐗规畩閿洏浠e彿 + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define BASE_TEST 1 //鍩虹珯娴嬭瘯 + #define MON_FREQ 0//1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 0//1 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 1 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 0 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 0 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 0 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜 0-off;1-on + #define AUX_ATT 0 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 1 //骞挎挱淇℃伅淇℃爣 + + #define CRC16_CHECK_KEYPAD 2//1 //0-off,1-26bytes,2-CRC22bytes,3- 22or26bytes; CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁;鍥犱负AES鍖呮嫭浜哻rc鎵浠ヤ笉鑳藉拰AES鍔熻兘鍚屾椂寮鍚; + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + #define AES 0//1 + #define NFC 0//1 + #define NFC_STD_T1LITE + #define NFC_STD + //#define NFC_T2 + #define TCPIP 0//1 + + // standard test version + // SW1=100 for test version + #define VER_TEST 0 + #if (VER_TEST==1) + #define SW1 100 + // SW2 + #define SW2 0 + // SW3 + #define SW3 10//9//8 + #endif + // + + // standard release version + // this is release version + #define VER_RELEASE 0 + #if (VER_RELEASE==1) + // SW1 + #define SW1 1 + // SW2 + #define SW2 0 + // SW3 + #define SW3 0 + #endif + // +#elif (CUSTOM ==1) //-------- NL-------------------------------------- + //纭欢浠e彿 + #define HMODEL 197//0xD0 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + #define BASE_TYPE TYPE_C100 + + //#define BASE_HARDWARE_T2 + //hardware 200s RF modual silk screen:J2-J3-J1-J4 + #define BASE_HARDWARE_100S + + /*a,No display; + **b,buzzer IO changge*/ + // I2C lcd switch //lcd display switch + //#define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + #define SI24R1 + //#define CC2500 + //#define CC1101 + //#define A5130 + + + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0//xff + #define RF_MODUAL1_SET 0//xff + #define RF_MODUAL2_SET 0//xfb + #define RF_MODUAL3_SET 0xff + + #define RF_SPEED 1//鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + #define LOCK_RF_CNT 0//2//閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 + //#define KEYPAD_TYPE KP_T1LITE //閫傞厤鐗规畩閿洏锛0-閫氱敤;other-鐗规畩閿洏浠e彿 + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 0//1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define BASE_TEST 1 //鍩虹珯娴嬭瘯 + #define MON_FREQ 0//1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 1 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 1 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 7 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 80 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 0 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜 0-off;1-on + #define AUX_ATT 0 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 0//1 //骞挎挱淇℃伅淇℃爣 + + #define CRC16_CHECK_KEYPAD 1 //0-off,1-26bytes,2-CRC22bytes,3- 22or26bytes; CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁;鍥犱负AES鍖呮嫭浜哻rc鎵浠ヤ笉鑳藉拰AES鍔熻兘鍚屾椂寮鍚; + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + #define AES 0//1 + #define NFC 0//1 + #define NFC_STD_T1LITE + #define NFC_STD + //#define NFC_T2 + #define TCPIP 0//1 + + // CUSTOM_NL test version + // SW1=100 for test version + #define VER_TEST 0 + #if (VER_TEST==1) + #define SW1 100 + // SW2 + #define SW2 0 + // SW3 + #define SW3 2 + #endif + // + + // CUSTOM_NL release version + // this is release version + #define VER_RELEASE 0 + #if (VER_RELEASE==1) + // SW1 + #define SW1 0 + // SW2 + #define SW2 0 + // SW3 + #define SW3 0 + #endif + // +#elif (CUSTOM ==2) //-------- ZDY-------------------------------------- + //纭欢浠e彿 + #define HMODEL 0xC5 //0xD0 //!!!!涓嶤RS100鐨刏DY涓鑷 + #define BASE_TYPE TYPE_C100 + + //#define BASE_HARDWARE_T2 + //hardware 200s RF modual silk screen:J2-J3-J1-J4 + #define BASE_HARDWARE_100S + + /*a,No display; + **b,buzzer IO changge*/ + // I2C lcd switch //lcd display switch + //#define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + #define SI24R1 + //#define CC2500 + //#define CC1101 + //#define A5130 + + + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0//xff + #define RF_MODUAL1_SET 0//xff + #define RF_MODUAL2_SET 0//xfb + #define RF_MODUAL3_SET 0xff + + #define RF_SPEED 0//鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + #define LOCK_RF_CNT 0//2//閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 + //#define KEYPAD_TYPE KP_T1LITE //閫傞厤鐗规畩閿洏锛0-閫氱敤;other-鐗规畩閿洏浠e彿 + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 0//1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define BASE_TEST 1 //鍩虹珯娴嬭瘯 + #define MON_FREQ 0//1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 0//1 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 1 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 7 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 26 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 0 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜 0-off;1-on + #define AUX_ATT 0 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 0//1 //骞挎挱淇℃伅淇℃爣 + + #define CRC16_CHECK_KEYPAD 1 //0-off,1-26bytes,2-CRC22bytes,3- 22or26bytes; CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁;鍥犱负AES鍖呮嫭浜哻rc鎵浠ヤ笉鑳藉拰AES鍔熻兘鍚屾椂寮鍚; + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + #define AES 0//1 + #define NFC 0//1 + #define NFC_STD_T1LITE + #define NFC_STD + //#define NFC_T2 + #define TCPIP 0//1 + + // CUSTOM_ZDY test version + // SW1=100 for test version + #define VER_TEST 0 + #if (VER_TEST==1) + #define SW1 100 + // SW2 + #define SW2 0 + // SW3 + #define SW3 1 + #endif + // + + // CUSTOM_ZDY release version + // this is release version + #define VER_RELEASE 0 + #if (VER_RELEASE==1) + // SW1 + #define SW1 0 + // SW2 + #define SW2 0 + // SW3 + #define SW3 0 + #endif + // + +#elif (CUSTOM ==3) //-------- #define SUPPORT_HS6621_SOC 1-------------------------------------- + #define SUPPORT_HS6621_SOC 1 + //纭欢浠e彿 + #define HMODEL 210 + #define BASE_TYPE TYPE_C100 + + //#define BASE_HARDWARE_T2 + //hardware 200s RF modual silk screen:J2-J3-J1-J4 + #define BASE_HARDWARE_100S + + /*a,No display; + **b,buzzer IO changge*/ + // I2C lcd switch //lcd display switch + //#define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + #define SI24R1 + //#define CC2500 + //#define CC1101 + //#define A5130 + + + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0//xff + #define RF_MODUAL1_SET 0//xff + #define RF_MODUAL2_SET 0//xfb + #define RF_MODUAL3_SET 0xff + + #define RF_SPEED 1//鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + #define LOCK_RF_CNT 0//2//閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 + //#define KEYPAD_TYPE KP_T1LITE //閫傞厤鐗规畩閿洏锛0-閫氱敤;other-鐗规畩閿洏浠e彿 + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define UPDATE_KP_2 1 + #define TEXT_MESSAGE 1 //浣胯兘鐭俊 + #define BASE_TEST 1 //鍩虹珯娴嬭瘯 + #define MON_FREQ 1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 0//1 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 1 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 0 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 0 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 0 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜 0-off;1-on + #define AUX_ATT 0 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 1 //骞挎挱淇℃伅淇℃爣 + + #define CRC16_CHECK_KEYPAD 2//1 //0-off,1-26bytes,2-CRC22bytes,3- 22or26bytes; CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁;鍥犱负AES鍖呮嫭浜哻rc鎵浠ヤ笉鑳藉拰AES鍔熻兘鍚屾椂寮鍚; + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + #define AES 0//1 + #define NFC 0//1 + #define NFC_STD_T1LITE + #define NFC_STD + //#define NFC_T2 + #define TCPIP 0//1 + + // SUPPORT_HS6621_SOC test version + // SW1=100 for test version + #define VER_TEST 1 + #if (VER_TEST==1) + #define SW1 100 + // SW2 + #define SW2 0 + // SW3 + #define SW3 8 + #endif + // + + // SUPPORT_HS6621_SOC release version + // this is release version + #define VER_RELEASE 0 + #if (VER_RELEASE==1) + // SW1 + #define SW1 2 + // SW2 + #define SW2 0 + // SW3 + #define SW3 2 + #endif + // + #endif + + // + + +// + + +// C200 config (fullspeed) +// hardware:200/400S board +// RF:24L01 ;2 rf modual-RF com and whitelist +// usb Full speed(usb3300 DISABLE) +//rf modual monitor +#elif (BASE_MODEL == C200) + //--------------1 HARDWARE_SETTING -------------------------------------------- + //纭欢浠e彿 + #define HMODEL 0xCE + #define BASE_TYPE TYPE_CRS200 //C200 + + //#define BASE_HARDWARE_T2 + //hardware 200s RF modual silk screen:J2-J3-J1-J4 + #define BASE_HARDWARE_200S + + /*a,No display; + **b,buzzer IO changge*/ + // I2C lcd switch //lcd display switch + //#define LCD_ON + + //鏃犵嚎妯″潡鐩稿叧 + #define SI24R1 + //#define CC2500 + //#define CC1101 + //#define A5130 + + + /* 妯″潡涓暟鐢变笅闈㈢殑鍙傛暟璁$畻寰楀嚭,鏈澶氭敮鎸4涓ā鍧楋紒 + 0-涓嶅惎鐢 + 0xff-涓绘ā鍧(鍖呮嫭鍗曟ā鍧楋紝蹇呴』璁剧疆涓斿彧鏈1涓) + 0xfe-鍓ā鍧 (鍙互鏈夊涓紝鏈澶3涓) + 0xfb-鐧藉悕鍗曚笓鐢ㄦā鍧 (鍙湁鍦ㄥ紑鍚櫧鍚嶅崟鏃舵墠璁剧疆) */ + #define RF_MODUAL0_SET 0//xff + #define RF_MODUAL1_SET 0xff + #define RF_MODUAL2_SET 0xfb + #define RF_MODUAL3_SET 0//xfb + + #define RF_SPEED 0//鏃犵嚎妯″潡閫氫俊閫熺巼锛0-250K; 1-1M; 2-2M + #define LOCK_RF_CNT 2//閿佸畾鏃犵嚎妯″潡鐨勪釜鏁颁笉琚玸dk淇敼; 0-涓嶉攣瀹,鍏朵粬鏄攣瀹氬叿浣撲釜鏁 + //#define KEYPAD_TYPE KP_T1LITE //閫傞厤鐗规畩閿洏锛0-閫氱敤;other-鐗规畩閿洏浠e彿 + //----------------------------B function modual setting ------------------------ + #define FAST_MATCH 1 //蹇熼厤瀵瑰姛鑳藉紑鍏 :0-off + #define UPDATE_KP 1 //鍩虹珯骞挎挱鏇存柊閿洏鍥轰欢鍔熻兘寮鍏 + #define BASE_TEST 1 //鍩虹珯娴嬭瘯 + #define MON_FREQ 1 //鍚岄妫娴嬪姛鑳藉紑鍏 :0-off + #define WHITELIST 1 //鐧藉悕鍗曞姛鑳藉紑鍏 :0-off + + #define NO_ID_MODE 1 //1-涓嶆敮鎸乮d妯″紡; 0-鏀寔id妯″紡; + #define CRS2 1 //CRS2鍗忚鍔熻兘寮鍏 :0-off + #define LOCK_LOGMODE 0 //鍥轰欢鐧诲綍妯″紡鍔熻兘寮鍏 :0-off ,on -瑕佸浐瀹氱殑logmode + #define LOCK_CHAN 0 //鍥哄畾棰戠偣鍔熻兘 ,on -瑕佸浐瀹氱殑channel + #define MASK_SPEC_CHAN 0 //灞忚斀鎸囧畾鐨勯鐐: 0-off ,on -寮鍚烦杩囨寚瀹氶鐐瑰姛鑳;//閿愭嵎瀹氬埗 + #define NO_MATCHCODE 0 //涓庨敭鐩樹箣闂寸殑閫氫俊鏁版嵁涓病鏈夊寘鎷厤瀵圭爜 0-off;1-on + #define AUX_ATT 0 //鑰冨嫟 + #define AUX_BEATS 0 //蹇冭烦 + #define BROADCAST 1 //骞挎挱淇℃伅淇℃爣 + + #define CRC16_CHECK_KEYPAD 2//1 //0-off,1-26bytes,2-CRC22bytes,3- 22or26bytes; CRC16鏍¢獙涓庨敭鐩樹箣闂寸殑鏁版嵁;鍥犱负AES鍖呮嫭浜哻rc鎵浠ヤ笉鑳藉拰AES鍔熻兘鍚屾椂寮鍚; + #define CRC16_CHECK_PC 0 //CRC16鏍¢獙涓巔c涔嬮棿鐨勬暟鎹 + + #define AES 0//1 + #define NFC 1 + #define _NEW_NFC_APP //浼樺寲NFC瀵诲崱 + #define NFC_STD_T1LITE + #define NFC_STD + //#define NFC_T2 + #define TCPIP 1 + + //#define USB3300 1 //highspeed + + //-----from base_core.h-------- + #define RF_MODUAL_MONITOR //rf 妯″潡鐩戞祴 + + // test version + // SW1=100 for test version + #define VER_TEST 1 + #if (VER_TEST==1) + #define SW1 100 + // SW2 + #define SW2 0 + // SW3 + #define SW3 5//4//3//2//1 + #endif + // + + // release version + // this is release version + #define VER_RELEASE 0 + #if (VER_RELEASE==1) + // SW1 + #define SW1 1 + // SW2 + #define SW2 0 + // SW3 + #define SW3 0 + #endif + // + + ////鍩虹珯鍥轰欢鐗堟湰 + //formal version +// #define SW1 1 +// #define SW2 0 +// #define SW3 0 +// //cong V100.0.18鐗堟湰寮濮嬩娇鐢ㄥ唴缃ぉ绾挎ā鍧 +// #define SW1 TEST_SW1 +// #define SW2 0 +// #define SW3 5//4//3//2//1 + +#endif +// + +// + + +// <<< end of configuration section >>> + + + +#endif //#ifndef _OLD_CONFIG_ + +#endif //#ifndef _BASE_CONFIG_H_ + diff --git b/Inc/gd32f30x_it.h a/Inc/gd32f30x_it.h new file mode 100644 index 0000000..85804c5 --- /dev/null +++ a/Inc/gd32f30x_it.h @@ -0,0 +1,60 @@ +/*! + \file gd32f30x_it.h + \brief the header file of the ISR + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_IT_H +#define GD32F30X_IT_H + +#include "gd32f30x.h" + +/* function declarations */ +/* this function handles NMI exception */ +void NMI_Handler(void); +/* this function handles HardFault exception */ +void HardFault_Handler(void); +/* this function handles MemManage exception */ +void MemManage_Handler(void); +/* this function handles BusFault exception */ +void BusFault_Handler(void); +/* this function handles UsageFault exception */ +void UsageFault_Handler(void); +/* this function handles SVC exception */ +void SVC_Handler(void); +/* this function handles DebugMon exception */ +void DebugMon_Handler(void); +/* this function handles PendSV exception */ +void PendSV_Handler(void); +/* this function handles SysTick exception */ +void SysTick_Handler(void); + +#endif /* GD32F30X_IT_H */ diff --git b/Inc/gd32f30x_libopt.h a/Inc/gd32f30x_libopt.h new file mode 100644 index 0000000..49f3ded --- /dev/null +++ a/Inc/gd32f30x_libopt.h @@ -0,0 +1,63 @@ +/*! + \file gd32f30x_libopt.h + \brief library optional for gd32f30x + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F30X_LIBOPT_H +#define GD32F30X_LIBOPT_H + +#include "gd32f30x_rcu.h" +#include "gd32f30x_adc.h" +#include "gd32f30x_can.h" +#include "gd32f30x_crc.h" +#include "gd32f30x_ctc.h" +#include "gd32f30x_dac.h" +#include "gd32f30x_dbg.h" +#include "gd32f30x_dma.h" +#include "gd32f30x_exti.h" +#include "gd32f30x_fmc.h" +#include "gd32f30x_fwdgt.h" +#include "gd32f30x_gpio.h" +#include "gd32f30x_i2c.h" +#include "gd32f30x_pmu.h" +#include "gd32f30x_bkp.h" +#include "gd32f30x_rtc.h" +#include "gd32f30x_sdio.h" +#include "gd32f30x_spi.h" +#include "gd32f30x_timer.h" +#include "gd32f30x_usart.h" +#include "gd32f30x_wwdgt.h" +#include "gd32f30x_misc.h" +#include "gd32f30x_enet.h" +#include "gd32f30x_exmc.h" + +#endif /* GD32F30X_LIBOPT_H */ diff --git b/Inc/usbd_conf.h a/Inc/usbd_conf.h new file mode 100644 index 0000000..5c8d3fd --- /dev/null +++ a/Inc/usbd_conf.h @@ -0,0 +1,82 @@ +/*! + \file usbd_hw.h + \brief usbd hardware configure file + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_CONF_H +#define __USBD_CONF_H + +#include "gd32f30x.h" +//#include "gd32f303e_eval.h" + +#define USBD_CFG_MAX_NUM 1U +#define USBD_ITF_MAX_NUM 1U + +#define CUSTOM_HID_INTERFACE 0U + +/* define if low power mode is enabled; it allows entering the device into DEEP_SLEEP mode + following USB suspend event and wakes up after the USB wakeup event is received. */ +//#define USB_DEVICE_LOW_PWR_MODE_SUPPORT + +/* USB feature -- Self Powered */ +/* #define USBD_SELF_POWERED */ + +/* endpoint count used by the CDC ACM device */ +#define CUSTOMHID_IN_EP EP_IN(1U) +#define CUSTOMHID_OUT_EP EP_OUT(1U) + +#define CUSTOMHID_IN_PACKET 64U//2U +#define CUSTOMHID_OUT_PACKET 64U//2U + +/* endpoint0, Rx/Tx buffers address offset */ +#define EP0_RX_ADDR (0x40U) +#define EP0_TX_ADDR (0xA0U) + +/* CDC data Tx buffer address offset */ +#define HID_TX_ADDR (0x140U) + +/* CDC data Rx buffer address offset */ +#define HID_RX_ADDR (0x100U) + +/* endpoint count used by the CDC ACM device */ +#define EP_COUNT (4U) + +#define USB_STRING_COUNT 4U + +/* base address offset of the allocation buffer, used for buffer descriptor table and packet memory */ +#define BTABLE_OFFSET (0x0000U) + +#define USB_PULLUP GPIOA +#define USB_PULLUP_PIN GPIO_PIN_8 +#define RCC_AHBPeriph_GPIO_PULLUP RCU_GPIOA + +#endif /* __USBD_CONF_H */ diff --git b/Inc/usbd_hw.h a/Inc/usbd_hw.h new file mode 100644 index 0000000..fff3264 --- /dev/null +++ a/Inc/usbd_hw.h @@ -0,0 +1,48 @@ +/*! + \file usbd_hw.h + \brief usbd hardware configure file + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_HW_H +#define __USBD_HW_H + +#include "usbd_conf.h" + +/* function declarations */ +/* configure rcu clock */ +void rcu_config(void); +/* configure gpio port */ +void gpio_config(void); +/* configure nvic */ +void nvic_config(void); + +#endif /* __USBD_HW_H */ diff --git b/Proj/Base_GD303.uvguix.Administrator a/Proj/Base_GD303.uvguix.Administrator new file mode 100644 index 0000000..4c4b826 --- /dev/null +++ a/Proj/Base_GD303.uvguix.Administrator @@ -0,0 +1,4141 @@ + + + + -6.1 + +
### uVision Project, (C) Keil Software
+ + + E:\C100B_S6\C100B_GD\Base_core\AESLIB\STM32_Cryptographic\Lib + + + + + + + 38003 + Registers + 164 117 + + + 346 + Code Coverage + 1010 172 + + + 204 + Performance Analyzer + 732 175 175 100 + + + + + + 35141 + Event Statistics + + 200 50 700 + + + 1506 + Symbols + + 80 80 80 + + + 1936 + Watch 1 + + 200 133 133 + + + 1937 + Watch 2 + + 200 133 133 + + + 1935 + Call Stack + Locals + + 200 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + 466 + Source Browser + 500 + 166 + + + + + + + + 0 + 0 + 0 + 50 + 16 + + + + + + + 44 + 0 + 1 + + -32000 + -32000 + + + -1 + -1 + + + 42 + 429 + 1931 + 995 + + + + 0 + + 5648 + 0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000003B0000003A0000000100000032453A5C43313030425F53365C43313030425F47445C426173655F636F72655C757365725F6C69625C48575F4D4355494F2E68000000000A48575F4D4355494F2E6800000000C5D4F200FFFFFFFF35453A5C43313030425F53365C43313030425F47445C426173655F636F72655C757365725F6472697665725C706C6174666F726D2E63000000000A706C6174666F726D2E6300000000FFDC7800FFFFFFFF35453A5C43313030425F53365C43313030425F47445C426173655F636F72655C757365725F6472697665725C48575F4D4355494F2E63000000000A48575F4D4355494F2E6300000000BECEA100FFFFFFFF32453A5C43313030425F53365C43313030425F47445C426173655F636F72655C757365725F6C69625C66756E6374696F6E2E68000000000A66756E6374696F6E2E6800000000F0A0A100FFFFFFFF2B453A5C43313030425F53365C43313030425F47445C5372635C67643332663330785F757362645F68772E63000000001267643332663330785F757362645F68772E6300000000BCA8E100FFFFFFFF30453A5C43313030425F53365C43313030425F47445C426173655F636F72655C757365725F6472697665725C6C65642E6300000000056C65642E63000000009CC1B600FFFFFFFF29453A5C43313030425F53365C43313030425F47445C5372635C637573746F6D5F6869645F6974662E630000000010637573746F6D5F6869645F6974662E6300000000F7B88600FFFFFFFF4C453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F757362645F6C6962726172795C6465766963655C536F757263655C757362645F636F72652E63000000000B757362645F636F72652E6300000000D9ADC200FFFFFFFF24453A5C43313030425F53365C43313030425F47445C696E635C757362645F636F6E662E68000000000B757362645F636F6E662E6800000000A5C2D700FFFFFFFF4D453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F757362645F6C6962726172795C6465766963655C496E636C7564655C757362645F636F72652E68000000000B757362645F636F72652E6800000000B3A6BE00FFFFFFFF2D453A5C43313030425F53365C43313030425F47445C447269766572735C434D5349535C636F72655F636D342E68000000000A636F72655F636D342E6800000000EAD6A300FFFFFFFF26453A5C43313030425F53365C43313030425F47445C5372635C67643332663330785F69742E63000000000D67643332663330785F69742E6300000000F6FA7D00FFFFFFFF4C453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F757362645F6C6962726172795C6465766963655C536F757263655C757362645F656E756D2E63000000000B757362645F656E756D2E6300000000B5E99D00FFFFFFFF4E453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F757362645F6C6962726172795C757362645C536F757263655C757362645F6C6C645F636F72652E63000000000F757362645F6C6C645F636F72652E63000000005FC3CF00FFFFFFFF4D453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F757362645F6C6962726172795C757362645C536F757263655C757362645F6C6C645F696E742E63000000000E757362645F6C6C645F696E742E6300000000C1838300FFFFFFFF5C453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F757362645F6C6962726172795C636C6173735C6465766963655C6869645C536F757263655C637573746F6D5F6869645F636F72652E630000000011637573746F6D5F6869645F636F72652E6300000000CACAD500FFFFFFFF4F453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F757362645F6C6962726172795C757362645C496E636C7564655C757362645F6C6C645F636F72652E68000000000F757362645F6C6C645F636F72652E6800000000C5D4F200FFFFFFFF1F453A5C43313030425F53365C43313030425F47445C5372635C6D61696E2E6300000000066D61696E2E6300000000FFDC7800FFFFFFFF22453A5C43313030425F53365C43313030425F47445C696E635C757362645F68772E680000000009757362645F68772E6800000000BECEA100FFFFFFFF5D453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F757362645F6C6962726172795C636C6173735C6465766963655C6869645C496E636C7564655C637573746F6D5F6869645F636F72652E680000000011637573746F6D5F6869645F636F72652E6800000000F0A0A100FFFFFFFF55453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F757362645F6C6962726172795C636C6173735C6465766963655C6869645C496E636C7564655C7573625F6869642E6800000000097573625F6869642E6800000000BCA8E100FFFFFFFF4F453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F757362645F6C6962726172795C6465766963655C496E636C7564655C7573625F6368395F7374642E68000000000D7573625F6368395F7374642E68000000009CC1B600FFFFFFFF41453A5C43313030425F53365C43313030425F47445C447269766572735C434D5349535C47445C47443332463330785C496E636C7564655C67643332663330782E68000000000A67643332663330782E6800000000F7B88600FFFFFFFF4D453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F757362645F6C6962726172795C6465766963655C496E636C7564655C757362645F656E756D2E68000000000B757362645F656E756D2E6800000000D9ADC200FFFFFFFF33453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C626173655F636F72652E63000000000B626173655F636F72652E6300000000A5C2D700FFFFFFFF3C453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F6C69625C706C6174666F726D5F696E746572666163652E680000000014706C6174666F726D5F696E746572666163652E6800000000B3A6BE00FFFFFFFF3C453A5C43313030425F53365C43313030425F47445C426173655F636F72655C757365725F6472697665725C524632344C3031202D206D756C74692E630000000011524632344C3031202D206D756C74692E6300000000EAD6A300FFFFFFFF30453A5C43313030425F53365C43313030425F47445C426173655F636F72655C757365725F6472697665725C6932632E6300000000056932632E6300000000F6FA7D00FFFFFFFF4F453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F7374616E646172645F7065726970686572616C5C536F757263655C67643332663330785F7370692E63000000000E67643332663330785F7370692E6300000000B5E99D00FFFFFFFF50453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F7374616E646172645F7065726970686572616C5C496E636C7564655C67643332663330785F7370692E68000000000E67643332663330785F7370692E68000000005FC3CF00FFFFFFFF3A453A5C43313030425F53365C43313030425F47445C426173655F636F72655C66756E635F7372635C66756E6374696F6E5F6E6574776F726B2E63000000001266756E6374696F6E5F6E6574776F726B2E6300000000C1838300FFFFFFFF51453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F7374616E646172645F7065726970686572616C5C536F757263655C67643332663330785F74696D65722E63000000001067643332663330785F74696D65722E6300000000CACAD500FFFFFFFF52453A5C43313030425F53365C43313030425F47445C447269766572735C47443332463330785F7374616E646172645F7065726970686572616C5C496E636C7564655C67643332663330785F74696D65722E68000000001067643332663330785F74696D65722E6800000000C5D4F200FFFFFFFF32453A5C43313030425F53365C43313030425F47445C426173655F636F72655C757365725F6C69625C706C6174666F726D2E68000000000A706C6174666F726D2E6800000000FFDC7800FFFFFFFF33453A5C43313030425F53365C43313030425F47445C426173655F636F72655C757365725F6472697665725C62757A7A65722E63000000000862757A7A65722E6300000000BECEA100FFFFFFFF32453A5C43313030425F53365C43313030425F47445C426173655F636F72655C66756E635F7372635C66756E6374696F6E2E63000000000A66756E6374696F6E2E6300000000F0A0A100FFFFFFFF36453A5C43313030425F53365C43313030425F47445C426173655F636F72655C66756E635F7372635C66756E6374696F6E5F4145532E63000000000E66756E6374696F6E5F4145532E6300000000BCA8E100FFFFFFFF3C453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F6C69625C66756E6374696F6E5F696E746572666163652E68000000001466756E6374696F6E5F696E746572666163652E68000000009CC1B600FFFFFFFF2F453A5C43313030425F53365C43313030425F47445C426173655F636F72655C4145534C49425C4145535C4145532E6800000000054145532E6800000000F7B88600FFFFFFFF46453A5C43313030425F53365C43313030425F47445C426173655F636F72655C4145534C49425C53544D33325F43727970746F677261706869635C496E635C63727970746F2E68000000000863727970746F2E6800000000D9ADC200FFFFFFFF42453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C626173655F70726F636573735F70635F636D645F307836302E63000000001A626173655F70726F636573735F70635F636D645F307836302E6300000000A5C2D700FFFFFFFF3F453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C626173655F70726F636573735F70635F656E7465722E630000000017626173655F70726F636573735F70635F656E7465722E6300000000B3A6BE00FFFFFFFF38453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F6C69625C626173655F636F72655F757365722E680000000010626173655F636F72655F757365722E6800000000EAD6A300FFFFFFFF33453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F6C69625C626173655F636F72652E68000000000B626173655F636F72652E6800000000F6FA7D00FFFFFFFF40453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C626173655F70726F636573735F72785F6B65797061642E630000000018626173655F70726F636573735F72785F6B65797061642E6300000000B5E99D00FFFFFFFF37453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C766F74655F5F70726F636573732E63000000000F766F74655F5F70726F636573732E63000000005FC3CF00FFFFFFFF3C453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C7472616E736665725F6B65797061645F70632E6300000000147472616E736665725F6B65797061645F70632E6300000000C1838300FFFFFFFF36453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C51756575655F636972636C652E63000000000E51756575655F636972636C652E6300000000CACAD500FFFFFFFF2F453A5C43313030425F53365C43313030425F47445C5574696C69746965735C6764333266333033655F6576616C2E6300000000106764333266333033655F6576616C2E6300000000C5D4F200FFFFFFFF4F453A5C43313030425F53365C43313030425F47445C447269766572735C434D5349535C47445C47443332463330785C536F757263655C41524D5C737461727475705F67643332663330785F68642E730000000015737461727475705F67643332663330785F68642E7300000000FFDC7800FFFFFFFF2F453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C64656275672E63000000000764656275672E6300000000BECEA100FFFFFFFF35453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C636F6D6D6F6E5F6D6174682E63000000000D636F6D6D6F6E5F6D6174682E6300000000F0A0A100FFFFFFFF3C453A5C43313030425F53365C43313030425F47445C426173655F636F72655C66756E635F7372635C5472616E73706172656E74557067726164652E6300000000145472616E73706172656E74557067726164652E6300000000BCA8E100FFFFFFFF3C453A5C43313030425F53365C43313030425F47445C426173655F636F72655C66756E635F7372635C66756E6374696F6E5F77686974656C6973742E63000000001466756E6374696F6E5F77686974656C6973742E63000000009CC1B600FFFFFFFF44453A5C43313030425F53365C43313030425F47445C426173655F636F72655C66756E635F7372635C66756E6374696F6E5F7570646174655F6B65797061645F3547382E63000000001C66756E6374696F6E5F7570646174655F6B65797061645F3547382E6300000000F7B88600FFFFFFFF40453A5C43313030425F53365C43313030425F47445C426173655F636F72655C66756E635F7372635C66756E6374696F6E5F7570646174655F6B65797061642E63000000001866756E6374696F6E5F7570646174655F6B65797061642E6300000000D9ADC200FFFFFFFF42453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C626173655F70726F636573735F70635F636D645F307836312E63000000001A626173655F70726F636573735F70635F636D645F307836312E6300000000A5C2D700FFFFFFFF36453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C766F74655F5F7265706F72742E63000000000E766F74655F5F7265706F72742E6300000000B3A6BE00FFFFFFFF34453A5C43313030425F53365C43313030425F47445C426173655F636F72655C636F72655F7372635C626173655F74696D65722E63000000000C626173655F74696D65722E6300000000EAD6A300FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000270300009700000083070000AF020000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F40000004F00000090050000DF000000 + + + 16 + 52020000B1000000EE06000041010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000006B0100004E020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000006B0100004E020000 + + + 16 + D0000000E6000000EC01000028030000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E60000009803000076010000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E60000009803000076010000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E60000009803000076010000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E60000009803000076010000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + D0000000E60000009803000076010000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E60000009803000076010000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E60000009803000076010000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E60000009803000076010000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E60000009803000076010000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000006B0100004E020000 + + + 16 + D0000000E6000000EC01000028030000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000006B0100004E020000 + + + 16 + D0000000E6000000EC01000028030000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0300000082020000CB05000067030000 + + + 16 + D0000000E60000009803000076010000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000001B02000090050000BF020000 + + + 16 + D0000000E60000009803000076010000 + + + + 199 + 199 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000CB05000067030000 + + + 16 + D0000000E60000009803000076010000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + D0000000E60000009803000076010000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + D0000000E60000009803000076010000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E60000009803000076010000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + D0000000E60000009803000076010000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + D0000000E60000009803000076010000 + + + + 35141 + 35141 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + D0000000E60000009803000076010000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000006B0100004E020000 + + + 16 + D0000000E6000000EC01000028030000 + + + + 38007 + 38007 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000CB05000067030000 + + + 16 + D0000000E60000009803000076010000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000CB05000067030000 + + + 16 + D0000000E6000000EC01000028030000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 463 + 463 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000CB05000067030000 + + + 16 + D0000000E6000000EC01000028030000 + + + + 466 + 466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000082020000CB05000067030000 + + + 16 + D0000000E6000000EC01000028030000 + + + + 470 + 470 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + D0000000E60000009803000076010000 + + + + 50000 + 50000 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50001 + 50001 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50002 + 50002 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50003 + 50003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50004 + 50004 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50005 + 50005 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50006 + 50006 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50007 + 50007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50008 + 50008 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50009 + 50009 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50010 + 50010 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50011 + 50011 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50012 + 50012 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50013 + 50013 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50014 + 50014 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50015 + 50015 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50016 + 50016 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50017 + 50017 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50018 + 50018 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 50019 + 50019 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D05000012020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 966 + 0 + 8192 + 0 + + 16 + 0000000000000000D10300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0000000080030000CE05000093030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 476 + 0 + 8192 + 1 + + 16 + 000000001C000000E701000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 612 + 0 + 8192 + 2 + + 16 + 00000000380000006F02000054000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 824 + 824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000320200008D050000A6020000 + + + 16 + D0000000E6000000C0010000B1010000 + + + + 3312 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DF00000090050000E3000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E65002000000000000052020000B1000000EE06000041010000F40000004F00000090050000DF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A00400002B020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000FE050000B1000000EE0600008D020000A00400004F000000900500002B02000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF6E0100004F000000720100006702000001000000020000100400000001000000E8FDFFFFAB030000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000005E010000B1000000CC020000C9020000000000004F0000006E010000670200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000017020000900500001B02000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000005E0100007D020000EE06000021030000000000001B02000090050000BF02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFC80200001B020000CC020000BF02000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF0000000067020000CE0500006B0200000100000001000010040000000100000075FDFFFF8E000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF01000077940000018000800000010000005E010000CD0200002C070000E2030000000000006B020000CE050000800300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657301000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572010000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2862 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE8030000000000000000000000000000000000000000000000010000000100000096000000020020500000000019766F74655F646174615F7265706F72745F696E74657276616C96000000000000000F001074696D65725F326D73355F656E74657219766F74655F646174615F7265706F72745F696E74657276616C0B48575F54494D5F53746F700C48575F54494D5F53746172741448575F54494D5F53657449525148616E646C657212626173655F636F72655F326D73355F6973721370635F636D645F307836305F70726F636573731073646B5F646174615F6669666F5F696E0B4145535F44656372797074036B6579086165735F696E697414626173655F70726F636573735F70635F6461746109626565705F6374726C1A555342445F435553544F4D5F4849445F53656E645265706F72740B53544D3332463430357878000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 970 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0000000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000005433130304296000000000000000100054331303042000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2373 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1920 + 1080 + + + + 1 + Debug + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + AE0000004F00000056050000B3000000 + + + 16 + 0C020000B1000000B406000015010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000002001000060020000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 109 + 109 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000002001000060020000 + + + 16 + 3C0000005300000005010000D8010000 + + + + 1465 + 1465 + 1 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000530500009A000000 + + + 16 + 3C0000005300000034020000B4000000 + + + + 1935 + 1935 + 1 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 1936 + 1936 + 1 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 195 + 195 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000002001000060020000 + + + 16 + 3C0000005300000005010000D8010000 + + + + 196 + 196 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000002001000060020000 + + + 16 + 3C0000005300000005010000D8010000 + + + + 197 + 197 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 03000000940200001304000067030000 + + + 16 + 3C0000005300000034020000B4000000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 00000000C30100005504000038020000 + + + 16 + 3C0000005300000034020000B4000000 + + + + 199 + 199 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000940200001304000067030000 + + + 16 + 3C0000005300000034020000B4000000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + B100000066000000530500009A000000 + + + 16 + 3C0000005300000034020000B4000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000530500009A000000 + + + 16 + 3C0000005300000034020000B4000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000530500009A000000 + + + 16 + 3C0000005300000034020000B4000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000530500009A000000 + + + 16 + 3C0000005300000034020000B4000000 + + + + 35141 + 35141 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000530500009A000000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000530500009A000000 + + + 16 + 3C0000005300000034020000B4000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 38003 + 38003 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000660000002001000060020000 + + + 16 + 3C0000005300000005010000D8010000 + + + + 38007 + 38007 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000940200001304000067030000 + + + 16 + 3C0000005300000034020000B4000000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000940200001304000067030000 + + + 16 + 3C0000005300000005010000D8010000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 463 + 463 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000940200001304000067030000 + + + 16 + 3C0000005300000005010000D8010000 + + + + 466 + 466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000940200001304000067030000 + + + 16 + 3C0000005300000005010000D8010000 + + + + 470 + 470 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + B100000066000000530500009A000000 + + + 16 + 3C0000005300000034020000B4000000 + + + + 50000 + 50000 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50001 + 50001 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50002 + 50002 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50003 + 50003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50004 + 50004 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50005 + 50005 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50006 + 50006 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50007 + 50007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50008 + 50008 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50009 + 50009 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50010 + 50010 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50011 + 50011 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50012 + 50012 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50013 + 50013 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50014 + 50014 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50015 + 50015 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50016 + 50016 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50017 + 50017 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50018 + 50018 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 50019 + 50019 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 4A03000066000000EE03000052010000 + + + 16 + 3C00000053000000E6000000E0000000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 966 + 0 + 8192 + 0 + + 16 + 0000000000000000D10300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0000000080030000CE05000093030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 0 + 0 + 0 + 0 + 476 + 0 + 8192 + 1 + + 16 + 000000001C000000E701000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 1 + 0 + 0 + 0 + 612 + 0 + 8192 + 2 + + 16 + 000000001C0000006F02000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 824 + 824 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 1D04000066000000CB05000067030000 + + + 16 + 2D05000094000000E4060000F3020000 + + + + 3415 + 000000000C000000000000000020000000000000FFFFFFFFFFFFFFFFAE000000B300000056050000B7000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000000C020000B1000000B406000015010000AE0000004F00000056050000B30000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF430300004F000000470300006B010000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000A5040000B10000004F050000CD010000470300004F000000F10300006B01000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF230100004F0000002701000079020000010000000200001004000000010000002AFFFFFF1A030000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000005E010000B100000081020000DB020000000000004F00000023010000790200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7300000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF00000000BF01000055040000C301000000000000010000000400000001000000000000000000000000000000000000000000000001000000C60000000000000001000000000000000000000001000000FFFFFFFFAB02000039020000AF020000AE02000000000000020000000400000000000000000000000000000000000000000000000000000001000000C600000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF0000000079020000160400007D02000001000000010000100400000001000000B3FDFFFFAF000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF01000077940000018000800000010000005E010000DF02000074050000E2030000000000007D02000016040000800300000000000040820056060000000C4275696C64204F757470757400000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657301000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0642726F777365010000007794000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000040000001000000FFFFFFFFFFFFFFFF160400004F0000001A0400008003000001000000020000100400000001000000D8FAFFFF2601000000000000000000000000000001000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB0900000180004000000100000078050000B10000002C070000E20300001A0400004F000000CE0500008003000000000000404100560F0000001343616C6C20537461636B202B204C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031010000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFF0A00000000000000000000000000000000000000000000000000000001000000FFFFFFFF8F07000001000000FFFFFFFF8F070000000000000000000000000000 + + + 59392 + File + + 2862 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE8030000000000000000000000000000000000000000000000010000000100000096000000020020500000000019766F74655F646174615F7265706F72745F696E74657276616C96000000000000000F0019766F74655F646174615F7265706F72745F696E74657276616C0B48575F54494D5F53746F700C48575F54494D5F53746172741448575F54494D5F53657449525148616E646C65721074696D65725F326D73355F656E74657212626173655F636F72655F326D73355F6973721370635F636D645F307836305F70726F636573731073646B5F646174615F6669666F5F696E0B4145535F44656372797074036B6579086165735F696E697414626173655F70726F636573735F70635F6461746109626565705F6374726C1A555342445F435553544F4D5F4849445F53656E645265706F72740B53544D3332463430357878000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000300150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 955 + 00200000000000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0000000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000000002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050FFFFFFFF00960000000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000000240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2362 + 00200000010000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020000002D0000000000000000000000000000000001000000010000000180F07F0000020000002E0000000000000000000000000000000001000000010000000180E8880000020000003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000100310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F0100000200010032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000002000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000002000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1920 + 1080 + + + + + + 1 + 0 + + 100 + 58 + + ..\Base_core\user_lib\HW_MCUIO.h + 35 + 85 + 107 + 1 + + 0 + + + ..\Base_core\user_driver\platform.c + 1 + 69 + 83 + 1 + + 0 + + + ..\Base_core\user_driver\HW_MCUIO.c + 0 + 54 + 57 + 1 + + 0 + + + ..\Base_core\user_lib\function.h + 0 + 816 + 842 + 1 + + 0 + + + ..\Src\gd32f30x_usbd_hw.c + 0 + 61 + 43 + 1 + + 0 + + + ..\Base_core\user_driver\led.c + 0 + 33 + 42 + 1 + + 0 + + + ..\Src\custom_hid_itf.c + 20 + 31 + 47 + 1 + + 0 + + + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_core.c + 0 + 65 + 93 + 1 + + 0 + + + ..\inc\usbd_conf.h + 45 + 48 + 58 + 1 + + 0 + + + ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h + 0 + 40 + 49 + 1 + + 0 + + + ..\Drivers\CMSIS\core_cm4.h + 0 + 73 + 82 + 1 + + 0 + + + ..\Src\gd32f30x_it.c + 25 + 138 + 150 + 1 + + 0 + + + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_enum.c + 0 + 291 + 319 + 1 + + 0 + + + ..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_core.c + 36 + 51 + 52 + 1 + + 0 + + + ..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_int.c + 0 + 102 + 103 + 1 + + 0 + + + ..\Drivers\GD32F30x_usbd_library\class\device\hid\Source\custom_hid_core.c + 46 + 38 + 57 + 1 + + 0 + + + ..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_core.h + 21 + 21 + 63 + 1 + + 0 + + + ..\Src\main.c + 15 + 75 + 88 + 1 + + 0 + + + ..\inc\usbd_hw.h + 13 + 1 + 38 + 1 + + 0 + + + ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h + 14 + 15 + 38 + 1 + + 0 + + + ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h + 0 + 1 + 1 + 1 + + 0 + + + ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h + 17 + 16 + 38 + 1 + + 0 + + + ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h + 0 + 281 + 290 + 1 + + 0 + + + ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h + 0 + 1 + 1 + 1 + + 0 + + + ..\Base_core\core_src\base_core.c + 35 + 48 + 55 + 1 + + 0 + + + ..\Base_core\core_lib\platform_interface.h + 0 + 73 + 82 + 1 + + 0 + + + ..\Base_core\user_driver\RF24L01 - multi.c + 21 + 140 + 141 + 1 + + 0 + + + ..\Base_core\user_driver\i2c.c + 15 + 1 + 26 + 1 + + 0 + + + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_spi.c + 0 + 459 + 477 + 1 + + 0 + + + ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h + 0 + 242 + 251 + 1 + + 0 + + + ..\Base_core\func_src\function_network.c + 17 + 37 + 56 + 1 + + 0 + + + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_timer.c + 0 + 295 + 304 + 1 + + 0 + + + ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h + 0 + 318 + 327 + 1 + + 0 + + + ..\Base_core\user_lib\platform.h + 0 + 19 + 47 + 1 + + 0 + + + ..\Base_core\user_driver\buzzer.c + 0 + 1 + 1 + 1 + + 0 + + + ..\Base_core\func_src\function.c + 14 + 57 + 68 + 1 + + 0 + + + ..\Base_core\func_src\function_AES.c + 0 + 55 + 80 + 1 + + 0 + + + ..\Base_core\core_lib\function_interface.h + 0 + 77 + 86 + 1 + + 0 + + + ..\Base_core\AESLIB\AES\AES.h + 75 + 1 + 11 + 1 + + 0 + + + ..\Base_core\AESLIB\STM32_Cryptographic\Inc\crypto.h + 0 + 1 + 1 + 1 + + 0 + + + ..\Base_core\core_src\base_process_pc_cmd_0x60.c + 29 + 119 + 134 + 1 + + 0 + + + ..\Base_core\core_src\base_process_pc_enter.c + 0 + 87 + 96 + 1 + + 0 + + + ..\Base_core\core_lib\base_core_user.h + 17 + 21 + 30 + 1 + + 0 + + + ..\Base_core\core_lib\base_core.h + 0 + 225 + 251 + 1 + + 0 + + + ..\Base_core\core_src\base_process_rx_keypad.c + 0 + 262 + 281 + 1 + + 0 + + + ..\Base_core\core_src\vote__process.c + 0 + 184 + 185 + 1 + + 0 + + + ..\Base_core\core_src\transfer_keypad_pc.c + 0 + 51 + 79 + 1 + + 0 + + + ..\Base_core\core_src\Queue_circle.c + 0 + 11 + 22 + 1 + + 0 + + + ..\Utilities\gd32f303e_eval.c + 0 + 1 + 1 + 1 + + 0 + + + ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f30x_hd.s + 0 + 149 + 159 + 1 + + 0 + + + ..\Base_core\core_src\debug.c + 0 + 221 + 247 + 1 + + 0 + + + ..\Base_core\core_src\common_math.c + 0 + 1 + 9 + 1 + + 0 + + + ..\Base_core\func_src\TransparentUpgrade.c + 0 + 710 + 736 + 1 + + 0 + + + ..\Base_core\func_src\function_whitelist.c + 0 + 361 + 387 + 1 + + 0 + + + ..\Base_core\func_src\function_update_keypad_5G8.c + 0 + 139 + 140 + 1 + + 0 + + + ..\Base_core\func_src\function_update_keypad.c + 0 + 422 + 448 + 1 + + 0 + + + ..\Base_core\core_src\base_process_pc_cmd_0x61.c + 0 + 18 + 44 + 1 + + 0 + + + ..\Base_core\core_src\vote__report.c + 24 + 32 + 48 + 1 + + 0 + + + ..\Base_core\core_src\base_timer.c + 18 + 4 + 17 + 1 + + 0 + + + + +
diff --git b/Proj/Base_GD303.uvoptx a/Proj/Base_GD303.uvoptx new file mode 100644 index 0000000..1ca3fa1 --- /dev/null +++ a/Proj/Base_GD303.uvoptx @@ -0,0 +1,1197 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp; *.cc; *.cxx + 0 + + + + 0 + 0 + + + + C100B + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + DLGUARM + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + JL2CM3 + -U59425868 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0GD32F30x_HD.FLM -FS08000000 -FL080000 -FP0($$Device:GD32F303RE$Flash\GD32F30x_HD.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F30x_HD -FS08000000 -FL080000 -FP0($$Device:GD32F303RE$Flash\GD32F30x_HD.FLM)) + + + + + 0 + 0 + 30 + 1 +
134258994
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\Base_core\core_src\vote__report.c + + \\Base_GD303\../Base_core/core_src/vote__report.c\30 +
+
+ + + 1 + 0 + 0x20000673 + 0 + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + +
+
+ + + Application + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\Src\main.c + main.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\Src\gd32f30x_it.c + gd32f30x_it.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\Src\custom_hid_itf.c + custom_hid_itf.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + ..\Src\gd32f30x_usbd_hw.c + gd32f30x_usbd_hw.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + ..\Utilities\gd32f303e_eval.c + gd32f303e_eval.c + 0 + 0 + + + + + CMSIS + 1 + 0 + 0 + 0 + + 2 + 6 + 1 + 0 + 0 + 0 + ..\Src\system_gd32f30x.c + system_gd32f30x.c + 0 + 0 + + + + + Drivers/Peripherals + 1 + 0 + 0 + 0 + + 3 + 7 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_dma.c + gd32f30x_dma.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_exmc.c + gd32f30x_exmc.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_exti.c + gd32f30x_exti.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_fmc.c + gd32f30x_fmc.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_gpio.c + gd32f30x_gpio.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_misc.c + gd32f30x_misc.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_pmu.c + gd32f30x_pmu.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_rcu.c + gd32f30x_rcu.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_spi.c + gd32f30x_spi.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_timer.c + gd32f30x_timer.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_usart.c + gd32f30x_usart.c + 0 + 0 + + + + + Startup + 0 + 0 + 0 + 0 + + 4 + 18 + 2 + 0 + 0 + 0 + ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f30x_hd.s + startup_gd32f30x_hd.s + 0 + 0 + + + + + Drivers/USB + 1 + 0 + 0 + 0 + + 5 + 19 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_core.c + usbd_lld_core.c + 0 + 0 + + + 5 + 20 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_int.c + usbd_lld_int.c + 0 + 0 + + + 5 + 21 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_core.c + usbd_core.c + 0 + 0 + + + 5 + 22 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_enum.c + usbd_enum.c + 0 + 0 + + + 5 + 23 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_pwr.c + usbd_pwr.c + 0 + 0 + + + 5 + 24 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_transc.c + usbd_transc.c + 0 + 0 + + + 5 + 25 + 1 + 0 + 0 + 0 + ..\Drivers\GD32F30x_usbd_library\class\device\hid\Source\custom_hid_core.c + custom_hid_core.c + 0 + 0 + + + + + Doc + 0 + 0 + 0 + 0 + + + + Platform_interface + 1 + 0 + 0 + 0 + + 7 + 26 + 1 + 0 + 0 + 0 + ..\Base_core\user_driver\A5130_5G8.c + A5130_5G8.c + 0 + 0 + + + 7 + 27 + 1 + 0 + 0 + 0 + ..\Base_core\user_driver\cc2500_1101 - multi.C + cc2500_1101 - multi.C + 0 + 0 + + + 7 + 28 + 1 + 0 + 0 + 0 + ..\Base_core\user_driver\char_std8x16.c + char_std8x16.c + 0 + 0 + + + 7 + 29 + 1 + 0 + 0 + 0 + ..\Base_core\user_driver\Chinese_12x12.c + Chinese_12x12.c + 0 + 0 + + + 7 + 30 + 1 + 0 + 0 + 0 + ..\Base_core\user_driver\lcd_driver.c + lcd_driver.c + 0 + 0 + + + 7 + 31 + 1 + 0 + 0 + 0 + ..\Base_core\user_driver\MF522.c + MF522.c + 0 + 0 + + + 7 + 32 + 1 + 0 + 0 + 0 + ..\Base_core\user_driver\buzzer.c + buzzer.c + 0 + 0 + + + 7 + 33 + 1 + 0 + 0 + 0 + ..\Base_core\user_driver\i2c.c + i2c.c + 0 + 0 + + + 7 + 34 + 1 + 0 + 0 + 0 + ..\Base_core\user_driver\led.c + led.c + 0 + 0 + + + 7 + 35 + 1 + 0 + 0 + 0 + ..\Base_core\user_driver\platform.c + platform.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\Base_core\user_driver\RF24L01 - multi.c + RF24L01 - multi.c + 0 + 0 + + + 7 + 37 + 1 + 1 + 0 + 0 + ..\Base_core\user_driver\HW_MCUIO.c + HW_MCUIO.c + 0 + 0 + + + + + Core + 1 + 0 + 0 + 0 + + 8 + 38 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\base_core.c + base_core.c + 0 + 0 + + + 8 + 39 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\base_process_pc_cmd_0x60.c + base_process_pc_cmd_0x60.c + 0 + 0 + + + 8 + 40 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\base_process_pc_cmd_0x61.c + base_process_pc_cmd_0x61.c + 0 + 0 + + + 8 + 41 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\base_process_pc_enter.c + base_process_pc_enter.c + 0 + 0 + + + 8 + 42 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\base_process_rx_keypad.c + base_process_rx_keypad.c + 0 + 0 + + + 8 + 43 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\base_process_tx_keypad.c + base_process_tx_keypad.c + 0 + 0 + + + 8 + 44 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\base_timer.c + base_timer.c + 0 + 0 + + + 8 + 45 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\common_math.c + common_math.c + 0 + 0 + + + 8 + 46 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\debug.c + debug.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\function_e2prom.c + function_e2prom.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\multi_channel.c + multi_channel.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\Queue_circle.c + Queue_circle.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\transfer_keypad_pc.c + transfer_keypad_pc.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\vote__process.c + vote__process.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\Base_core\core_src\vote__report.c + vote__report.c + 0 + 0 + + + + + Function + 1 + 0 + 0 + 0 + + 9 + 53 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\fucntion_base_test.c + fucntion_base_test.c + 0 + 0 + + + 9 + 54 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\fucntion_fastmatch.c + fucntion_fastmatch.c + 0 + 0 + + + 9 + 55 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\fucntion_text_message.c + fucntion_text_message.c + 0 + 0 + + + 9 + 56 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function.c + function.c + 0 + 0 + + + 9 + 57 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_AES.c + function_AES.c + 0 + 0 + + + 9 + 58 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_broadcast.c + function_broadcast.c + 0 + 0 + + + 9 + 59 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_debug.c + function_debug.c + 0 + 0 + + + 9 + 60 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_monitor_freq.c + function_monitor_freq.c + 0 + 0 + + + 9 + 61 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_network.c + function_network.c + 0 + 0 + + + 9 + 62 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_NFC.c + function_NFC.c + 0 + 0 + + + 9 + 63 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_T2_display.c + function_T2_display.c + 0 + 0 + + + 9 + 64 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_txmsg_beacon.c + function_txmsg_beacon.c + 0 + 0 + + + 9 + 65 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_update_keypad.c + function_update_keypad.c + 0 + 0 + + + 9 + 66 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_update_keypad_5G8.c + function_update_keypad_5G8.c + 0 + 0 + + + 9 + 67 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_upload_multipkt.c + function_upload_multipkt.c + 0 + 0 + + + 9 + 68 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\function_whitelist.c + function_whitelist.c + 0 + 0 + + + 9 + 69 + 1 + 0 + 0 + 0 + ..\Base_core\func_src\TransparentUpgrade.c + TransparentUpgrade.c + 0 + 0 + + + + + AES + 0 + 0 + 0 + 0 + + 10 + 70 + 1 + 0 + 0 + 0 + ..\Base_core\AESLIB\AES\AES.c + AES.c + 0 + 0 + + + 10 + 71 + 4 + 0 + 0 + 0 + ..\Base_core\AESLIB\STM32_Cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib + STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib + 0 + 0 + + + 10 + 72 + 4 + 0 + 0 + 0 + ..\Base_core\AESLIB\STM32_Cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib + STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib + 0 + 0 + + + + + RTT + 1 + 0 + 0 + 0 + + 11 + 73 + 1 + 0 + 0 + 0 + ..\RTT\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + + + 11 + 74 + 1 + 0 + 0 + 0 + ..\RTT\SEGGER_RTT_printf.c + SEGGER_RTT_printf.c + 0 + 0 + + + +
diff --git b/Proj/Base_GD303.uvprojx a/Proj/Base_GD303.uvprojx new file mode 100644 index 0000000..8f44232 --- /dev/null +++ a/Proj/Base_GD303.uvprojx @@ -0,0 +1,1182 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + C100B + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + GD32F303RE + GigaDevice + GigaDevice.GD32F30x_DFP.2.1.0 + http://gd32mcu.com/data/documents/pack/ + IRAM(0x20000000,0x010000) IROM(0x08000000,0x080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F30x_HD -FS08000000 -FL080000 -FP0($$Device:GD32F303RE$Flash\GD32F30x_HD.FLM)) + 0 + $$Device:GD32F303RE$Device\Include\gd32f30x.h + + + + + + + + + + $$Device:GD32F303RE$SVD\GD32F30x_HD.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + Base_GD303 + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 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 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 0 + 3 + 3 + 1 + 1 + 0 + 0 + 0 + + --c99 + USE_STDPERIPH_DRIVER,GD32F30X_HD + + ..\inc;..\Drivers\CMSIS\GD\GD32F30x\Include;..\Drivers\GD32F30x_standard_peripheral\Include;..\Drivers\GD32F30x_usbd_library\usbd\Include;..\Drivers\GD32F30x_usbd_library\device\Include;..\Drivers\GD32F30x_usbd_library\class\device\hid\Include;..\Drivers\CMSIS;..\Base_core\core_lib;..\Base_core\user_lib;..\Base_core\AESLIB\AES;..\Base_core\AESLIB\STM32_Cryptographic\Inc;..\Utilities;..\RTT + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Application + + + main.c + 1 + ..\Src\main.c + + + gd32f30x_it.c + 1 + ..\Src\gd32f30x_it.c + + + custom_hid_itf.c + 1 + ..\Src\custom_hid_itf.c + + + gd32f30x_usbd_hw.c + 1 + ..\Src\gd32f30x_usbd_hw.c + + + gd32f303e_eval.c + 1 + ..\Utilities\gd32f303e_eval.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + + + CMSIS + + + system_gd32f30x.c + 1 + ..\Src\system_gd32f30x.c + + + + + Drivers/Peripherals + + + gd32f30x_dma.c + 1 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_dma.c + + + gd32f30x_exmc.c + 1 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_exmc.c + + + gd32f30x_exti.c + 1 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_exti.c + + + gd32f30x_fmc.c + 1 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_fmc.c + + + gd32f30x_gpio.c + 1 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_gpio.c + + + gd32f30x_misc.c + 1 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_misc.c + + + gd32f30x_pmu.c + 1 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_pmu.c + + + gd32f30x_rcu.c + 1 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_rcu.c + + + gd32f30x_spi.c + 1 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_spi.c + + + gd32f30x_timer.c + 1 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_timer.c + + + gd32f30x_usart.c + 1 + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_usart.c + + + + + Startup + + + startup_gd32f30x_hd.s + 2 + ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f30x_hd.s + + + + + Drivers/USB + + + usbd_lld_core.c + 1 + ..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_core.c + + + usbd_lld_int.c + 1 + ..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_int.c + + + usbd_core.c + 1 + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_core.c + + + usbd_enum.c + 1 + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_enum.c + + + usbd_pwr.c + 1 + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_pwr.c + + + usbd_transc.c + 1 + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_transc.c + + + custom_hid_core.c + 1 + ..\Drivers\GD32F30x_usbd_library\class\device\hid\Source\custom_hid_core.c + + + + + Doc + + + Platform_interface + + + A5130_5G8.c + 1 + ..\Base_core\user_driver\A5130_5G8.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + cc2500_1101 - multi.C + 1 + ..\Base_core\user_driver\cc2500_1101 - multi.C + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + char_std8x16.c + 1 + ..\Base_core\user_driver\char_std8x16.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + Chinese_12x12.c + 1 + ..\Base_core\user_driver\Chinese_12x12.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + lcd_driver.c + 1 + ..\Base_core\user_driver\lcd_driver.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + MF522.c + 1 + ..\Base_core\user_driver\MF522.c + + + 2 + 0 + 0 + 0 + 0 + 0 + 2 + 2 + 2 + 2 + 11 + + + 1 + + + + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 0 + 2 + 2 + 2 + 2 + 2 + 0 + 0 + 2 + 2 + 2 + 2 + 2 + + + + + + + + + + + + buzzer.c + 1 + ..\Base_core\user_driver\buzzer.c + + + i2c.c + 1 + ..\Base_core\user_driver\i2c.c + + + led.c + 1 + ..\Base_core\user_driver\led.c + + + platform.c + 1 + ..\Base_core\user_driver\platform.c + + + RF24L01 - multi.c + 1 + ..\Base_core\user_driver\RF24L01 - multi.c + + + HW_MCUIO.c + 1 + ..\Base_core\user_driver\HW_MCUIO.c + + + + + Core + + + base_core.c + 1 + ..\Base_core\core_src\base_core.c + + + base_process_pc_cmd_0x60.c + 1 + ..\Base_core\core_src\base_process_pc_cmd_0x60.c + + + base_process_pc_cmd_0x61.c + 1 + ..\Base_core\core_src\base_process_pc_cmd_0x61.c + + + base_process_pc_enter.c + 1 + ..\Base_core\core_src\base_process_pc_enter.c + + + base_process_rx_keypad.c + 1 + ..\Base_core\core_src\base_process_rx_keypad.c + + + base_process_tx_keypad.c + 1 + ..\Base_core\core_src\base_process_tx_keypad.c + + + base_timer.c + 1 + ..\Base_core\core_src\base_timer.c + + + common_math.c + 1 + ..\Base_core\core_src\common_math.c + + + debug.c + 1 + ..\Base_core\core_src\debug.c + + + function_e2prom.c + 1 + ..\Base_core\core_src\function_e2prom.c + + + multi_channel.c + 1 + ..\Base_core\core_src\multi_channel.c + + + Queue_circle.c + 1 + ..\Base_core\core_src\Queue_circle.c + + + transfer_keypad_pc.c + 1 + ..\Base_core\core_src\transfer_keypad_pc.c + + + vote__process.c + 1 + ..\Base_core\core_src\vote__process.c + + + vote__report.c + 1 + ..\Base_core\core_src\vote__report.c + + + + + Function + + + fucntion_base_test.c + 1 + ..\Base_core\func_src\fucntion_base_test.c + + + fucntion_fastmatch.c + 1 + ..\Base_core\func_src\fucntion_fastmatch.c + + + fucntion_text_message.c + 1 + ..\Base_core\func_src\fucntion_text_message.c + + + function.c + 1 + ..\Base_core\func_src\function.c + + + function_AES.c + 1 + ..\Base_core\func_src\function_AES.c + + + function_broadcast.c + 1 + ..\Base_core\func_src\function_broadcast.c + + + function_debug.c + 1 + ..\Base_core\func_src\function_debug.c + + + function_monitor_freq.c + 1 + ..\Base_core\func_src\function_monitor_freq.c + + + function_network.c + 1 + ..\Base_core\func_src\function_network.c + + + function_NFC.c + 1 + ..\Base_core\func_src\function_NFC.c + + + function_T2_display.c + 1 + ..\Base_core\func_src\function_T2_display.c + + + function_txmsg_beacon.c + 1 + ..\Base_core\func_src\function_txmsg_beacon.c + + + function_update_keypad.c + 1 + ..\Base_core\func_src\function_update_keypad.c + + + function_update_keypad_5G8.c + 1 + ..\Base_core\func_src\function_update_keypad_5G8.c + + + function_upload_multipkt.c + 1 + ..\Base_core\func_src\function_upload_multipkt.c + + + function_whitelist.c + 1 + ..\Base_core\func_src\function_whitelist.c + + + TransparentUpgrade.c + 1 + ..\Base_core\func_src\TransparentUpgrade.c + + + + + AES + + + AES.c + 1 + ..\Base_core\AESLIB\AES\AES.c + + + STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib + 4 + ..\Base_core\AESLIB\STM32_Cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib + + + STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib + 4 + ..\Base_core\AESLIB\STM32_Cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib + + + + + RTT + + + SEGGER_RTT.c + 1 + ..\RTT\SEGGER_RTT.c + + + SEGGER_RTT_printf.c + 1 + ..\RTT\SEGGER_RTT_printf.c + + + + + + + + + + + + + + + + + Base_GD303 + 1 + + + + +
diff --git b/Proj/EventRecorderStub.scvd a/Proj/EventRecorderStub.scvd new file mode 100644 index 0000000..2956b29 --- /dev/null +++ a/Proj/EventRecorderStub.scvd @@ -0,0 +1,9 @@ + + + + + + + + + diff --git b/Proj/JLinkLog.txt a/Proj/JLinkLog.txt new file mode 100644 index 0000000..be00b26 --- /dev/null +++ a/Proj/JLinkLog.txt @@ -0,0 +1,4506 @@ +T2350 7913:128 SEGGER J-Link V6.46 Log File (0001ms, 34977ms total) +T2350 7913:128 DLL Compiled: May 23 2019 17:49:56 (0001ms, 34977ms total) +T2350 7913:128 Logging started @ 2022-07-22 11:18 (0001ms, 34977ms total) +T2350 7913:129 JLINK_SetWarnOutHandler(...) (0000ms, 34977ms total) +T2350 7913:129 JLINK_OpenEx(...) +Firmware: J-Link V9 compiled May 7 2021 16:26:12 +Hardware: V9.40 +S/N: 59425868 +Feature(s): RDI, GDB, FlashDL, FlashBP, JFlash, RDDI +TELNET listener socket opened on port 19021WEBSRV +Starting webserver (0050ms, 35027ms total) +T2350 7913:129 WEBSRV Webserver running on local port 19080 (0050ms, 35027ms total) +T2350 7913:129 returns O.K. (0050ms, 35027ms total) +T2350 7913:180 JLINK_GetEmuCaps() returns 0xB9FF7BBF (0000ms, 35027ms total) +T2350 7913:180 JLINK_TIF_GetAvailable(...) (0001ms, 35028ms total) +T2350 7913:181 JLINK_SetErrorOutHandler(...) (0000ms, 35028ms total) +T2350 7913:181 JLINK_ExecCommand("ProjectFile = "E:\C100B_S6\C100B_GD\Proj\JLinkSettings.ini"", ...). returns 0x00 (0002ms, 35030ms total) +T2350 7913:186 JLINK_ExecCommand("Device = GD32F303RE", ...). Device "GD32F303RE" selected. returns 0x00 (0004ms, 35034ms total) +T2350 7913:190 JLINK_ExecCommand("DisableConnectionTimeout", ...). returns 0x01 (0000ms, 35034ms total) +T2350 7913:190 JLINK_GetHardwareVersion() returns 0x16F30 (0000ms, 35034ms total) +T2350 7913:190 JLINK_GetDLLVersion() returns 64600 (0000ms, 35034ms total) +T2350 7913:190 JLINK_GetFirmwareString(...) (0000ms, 35034ms total) +T2350 7913:200 JLINK_GetDLLVersion() returns 64600 (0000ms, 35034ms total) +T2350 7913:200 JLINK_GetCompileDateTime() (0000ms, 35034ms total) +T2350 7913:203 JLINK_GetFirmwareString(...) (0000ms, 35034ms total) +T2350 7913:206 JLINK_GetHardwareVersion() returns 0x16F30 (0000ms, 35034ms total) +T2350 7913:228 JLINK_TIF_Select(JLINKARM_TIF_SWD) returns 0x00 (0006ms, 35040ms total) +T2350 7913:234 JLINK_SetSpeed(5000) (0001ms, 35041ms total) +T2350 7913:235 JLINK_GetId() >0x10B TIF>Found SW-DP with ID 0x2BA01477 >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x28 TIF>Scanning AP map to find all available APs >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x21 TIF>AP[1]: Stopped AP scan as end of AP map has been reachedAP[0]: AHB-AP (IDR: 0x24770011)Iterating through AP map to find AHB-AP to use + >0x42 TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x21 TIF> >0x42 TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x21 TIF>AP[0]: Core foundAP[0]: AHB-AP ROM base: 0xE00FF000 >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x21 TIF>CPUID register: 0x410FC241. Implementer code: 0x41 (ARM)Found Cortex-M4 r0p1, Little endian. -- Max. mem block: 0x00011028 + -- CPU_ReadMem(4 bytes @ 0xE000EDF0) -- CPU_WriteMem(4 bytes @ 0xE000EDF0) -- CPU_ReadMem(4 bytes @ 0xE0002000)FPUnit: 6 code (BP) slots and 2 literal slots -- CPU_ReadMem(4 bytes @ 0xE000EDFC) -- CPU_WriteMem(4 bytes @ 0xE000EDFC) -- CPU_ReadMem(4 bytes @ 0xE0001000) -- CPU_WriteMem(4 bytes @ 0xE0001000) -- CPU_ReadMem(4 bytes @ 0xE000ED88) -- CPU_WriteMem(4 bytes @ 0xE000ED88) -- CPU_ReadMem(4 bytes @ 0xE000ED88) -- CPU_WriteMem(4 bytes @ 0xE000ED88)CoreSight components:ROMTbl[0] @ E00FF000 + -- CPU_ReadMem(16 bytes @ 0xE00FF000) -- CPU_ReadMem(16 bytes @ 0xE000EFF0) -- CPU_ReadMem(16 bytes @ 0xE000EFE0)ROMTbl[0][0]: E000E000, CID: B105E00D, PID: 000BB00C SCS-M7 -- CPU_ReadMem(16 bytes @ 0xE0001FF0) -- CPU_ReadMem(16 bytes @ 0xE0001FE0)ROMTbl[0][1]: E0001000, CID: B105E00D, PID: 003BB002 DWT -- CPU_ReadMem(16 bytes @ 0xE0002FF0) -- CPU_ReadMem(16 bytes @ 0xE0002FE0)ROMTbl[0][2]: E0002000, CID: B105E00D, PID: 002BB003 FPB -- CPU_ReadMem(16 bytes @ 0xE0000FF0) + -- CPU_ReadMem(16 bytes @ 0xE0000FE0)ROMTbl[0][3]: E0000000, CID: B105E00D, PID: 003BB001 ITM -- CPU_ReadMem(16 bytes @ 0xE00FF010) -- CPU_ReadMem(16 bytes @ 0xE0040FF0) -- CPU_ReadMem(16 bytes @ 0xE0040FE0)ROMTbl[0][4]: E0040000, CID: B105900D, PID: 000BB9A1 TPIU -- CPU_ReadMem(16 bytes @ 0xE0041FF0) -- CPU_ReadMem(16 bytes @ 0xE0041FE0)ROMTbl[0][5]: E0041000, CID: 00000000, PID: 00000000 ??? >0x0D TIF> >0x21 TIF> returns 0x2BA01477 (0296ms, 35337ms total) +T2350 7913:531 JLINK_GetDLLVersion() returns 64600 (0000ms, 35337ms total) +T2350 7913:531 JLINK_CORE_GetFound() returns 0xE0000FF (0000ms, 35337ms total) +T2350 7913:531 JLINK_GetDebugInfo(0x100 = JLINKARM_ROM_TABLE_ADDR_INDEX) -- Value=0xE00FF000 returns 0x00 (0000ms, 35337ms total) +T2350 7913:537 JLINK_GetDebugInfo(0x100 = JLINKARM_ROM_TABLE_ADDR_INDEX) -- Value=0xE00FF000 returns 0x00 (0000ms, 35337ms total) +T2350 7913:537 JLINK_GetDebugInfo(0x101 = JLINKARM_DEBUG_INFO_ETM_ADDR_INDEX) -- Value=0x00000000 returns 0x00 (0000ms, 35337ms total) +T2350 7913:537 JLINK_ReadMemEx(0xE0041FF0, 0x0010 Bytes, ..., Flags = 0x02000004) -- CPU_ReadMem(16 bytes @ 0xE0041FF0) - Data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 returns 0x10 (0001ms, 35338ms total) +T2350 7913:538 JLINK_GetDebugInfo(0x102 = JLINKARM_DEBUG_INFO_MTB_ADDR_INDEX) -- Value=0x00000000 returns 0x00 (0000ms, 35338ms total) +T2350 7913:538 JLINK_GetDebugInfo(0x103 = JLINKARM_DEBUG_INFO_TPIU_ADDR_INDEX) -- Value=0xE0040000 returns 0x00 (0000ms, 35338ms total) +T2350 7913:538 JLINK_GetDebugInfo(0x104 = JLINKARM_DEBUG_INFO_ITM_ADDR_INDEX) -- Value=0xE0000000 returns 0x00 (0000ms, 35338ms total) +T2350 7913:538 JLINK_GetDebugInfo(0x105 = JLINKARM_DEBUG_INFO_DWT_ADDR_INDEX) -- Value=0xE0001000 returns 0x00 (0000ms, 35338ms total) +T2350 7913:538 JLINK_GetDebugInfo(0x106 = JLINKARM_DEBUG_INFO_FPB_ADDR_INDEX) -- Value=0xE0002000 returns 0x00 (0000ms, 35338ms total) +T2350 7913:538 JLINK_GetDebugInfo(0x107 = JLINKARM_DEBUG_INFO_NVIC_ADDR_INDEX) -- Value=0xE000E000 returns 0x00 (0000ms, 35338ms total) +T2350 7913:538 JLINK_GetDebugInfo(0x10C = JLINKARM_DEBUG_INFO_DBG_ADDR_INDEX) -- Value=0xE000EDF0 returns 0x00 (0000ms, 35338ms total) +T2350 7913:538 JLINK_GetDebugInfo(0x01 = Unknown) -- Value=0x00000001 returns 0x00 (0000ms, 35338ms total) +T2350 7913:538 JLINK_ReadMemU32(0xE000ED00, 0x0001 Items, ...) -- CPU_ReadMem(4 bytes @ 0xE000ED00) - Data: 41 C2 0F 41 returns 1 (0001ms, 35339ms total) +T2350 7913:539 JLINK_GetDebugInfo(0x10F = JLINKARM_DEBUG_INFO_HAS_CORTEX_M_SECURITY_EXT_INDEX) -- Value=0x00000000 returns 0x00 (0000ms, 35339ms total) +T2350 7913:539 JLINK_SetResetType(JLINKARM_CM3_RESET_TYPE_NORMAL) returns JLINKARM_CM3_RESET_TYPE_NORMAL (0000ms, 35339ms total) +T2350 7913:539 JLINK_Reset() -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE000EDF0) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE000EDFC)Reset: Halt core after reset via DEMCR.VC_CORERESET. >0x35 TIF>Reset: Reset device via AIRCR.SYSRESETREQ. -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE000ED0C) >0x0D TIF> >0x28 TIF> -- CPU_ReadMem(4 bytes @ 0xE000EDF0) -- CPU_ReadMem(4 bytes @ 0xE000EDF0) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE000EDF0) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE000EDFC) + -- CPU_ReadMem(4 bytes @ 0xE000EDF0) -- CPU_WriteMem(4 bytes @ 0xE0002000) -- CPU_ReadMem(4 bytes @ 0xE000EDFC) -- CPU_ReadMem(4 bytes @ 0xE0001000) (0081ms, 35420ms total) +T2350 7913:620 JLINK_Halt() returns 0x00 (0000ms, 35420ms total) +T2350 7913:620 JLINK_ReadMemU32(0xE000EDF0, 0x0001 Items, ...) -- CPU_ReadMem(4 bytes @ 0xE000EDF0) - Data: 03 00 03 00 returns 1 (0001ms, 35421ms total) +T2350 7913:621 JLINK_WriteU32(0xE000EDF0, 0xA05F0003) -- CPU_WriteMem(4 bytes @ 0xE000EDF0) returns 0 (0001ms, 35422ms total) +T2350 7913:622 JLINK_WriteU32(0xE000EDFC, 0x01000000) -- CPU_WriteMem(4 bytes @ 0xE000EDFC) returns 0 (0001ms, 35423ms total) +T2350 7913:642 JLINK_GetHWStatus(...) returns 0x00 (0000ms, 35423ms total) +T2350 7913:656 JLINK_GetNumBPUnits(Type = 0xFFFFFF00) returns 0x06 (0000ms, 35423ms total) +T2350 7913:656 JLINK_GetNumBPUnits(Type = 0xF0) returns 0x2000 (0000ms, 35423ms total) +T2350 7913:656 JLINK_GetNumWPUnits() returns 0x04 (0000ms, 35423ms total) +T2350 7913:669 JLINK_GetSpeed() returns 0xFA0 (0000ms, 35423ms total) +T2350 7913:678 JLINK_ReadMemU32(0xE000E004, 0x0001 Items, ...) -- CPU_ReadMem(4 bytes @ 0xE000E004) - Data: 02 00 00 00 returns 1 (0004ms, 35427ms total) +T2350 7913:682 JLINK_ReadMemU32(0xE000E004, 0x0001 Items, ...) -- CPU_ReadMem(4 bytes @ 0xE000E004) - Data: 02 00 00 00 returns 1 (0003ms, 35430ms total) +T2350 7913:685 JLINK_WriteMemEx(0xE0001000, 0x001C Bytes, ..., Flags = 0x02000004) - Data: 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... -- CPU_WriteMem(28 bytes @ 0xE0001000) returns 0x1C (0002ms, 35432ms total) +T2350 7913:687 JLINK_Halt() returns 0x00 (0000ms, 35432ms total) +T2350 7913:687 JLINK_IsHalted() returns TRUE (0000ms, 35432ms total) +T2350 7913:689 JLINK_WriteMem(0x20000000, 0x013C Bytes, ...) - Data: 00 BE 0A E0 0D 78 2D 06 68 40 08 24 40 00 00 D3 ... -- CPU_WriteMem(316 bytes @ 0x20000000) returns 0x13C (0002ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R1, 0x00B71B00) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R2, 0x00000001) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(R15 (PC), 0x20000038) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35434ms total) +T2350 7913:691 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) -- CPU_ReadMem(2 bytes @ 0x20000000) returns 0x00000001 (0001ms, 35435ms total) +T2350 7913:692 JLINK_Go() -- CPU_WriteMem(2 bytes @ 0x20000000) -- CPU_ReadMem(4 bytes @ 0xE0001000) -- CPU_WriteMem(4 bytes @ 0xE0002008) -- CPU_WriteMem(4 bytes @ 0xE000200C) -- CPU_WriteMem(4 bytes @ 0xE0002010) -- CPU_WriteMem(4 bytes @ 0xE0002014) -- CPU_WriteMem(4 bytes @ 0xE0002018) -- CPU_WriteMem(4 bytes @ 0xE000201C) -- CPU_WriteMem(4 bytes @ 0xE0001004) (0008ms, 35443ms total) +T2350 7913:700 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35447ms total) +T2350 7913:704 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35443ms total) +T2350 7913:704 JLINK_ClrBPEx(BPHandle = 0x00000001) returns 0x00 (0000ms, 35443ms total) +T2350 7913:704 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35443ms total) +T2350 7913:704 JLINK_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:704 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35443ms total) +T2350 7913:704 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35443ms total) +T2350 7913:704 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:704 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:704 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:704 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:704 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:704 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35443ms total) +T2350 7913:705 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000002 (0000ms, 35443ms total) +T2350 7913:705 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0003ms, 35446ms total) +T2350 7913:708 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35450ms total) +T2350 7913:712 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35446ms total) +T2350 7913:712 JLINK_ClrBPEx(BPHandle = 0x00000002) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35446ms total) +T2350 7913:712 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0001ms, 35447ms total) +T2350 7913:713 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35447ms total) +T2350 7913:713 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35447ms total) +T2350 7913:713 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35447ms total) +T2350 7913:713 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35447ms total) +T2350 7913:713 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000003 (0000ms, 35447ms total) +T2350 7913:713 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0003ms, 35450ms total) +T2350 7913:716 JLINK_IsHalted() returns FALSE (0001ms, 35451ms total) +T2350 7913:783 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35454ms total) +T2350 7913:787 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35450ms total) +T2350 7913:787 JLINK_ClrBPEx(BPHandle = 0x00000003) returns 0x00 (0000ms, 35450ms total) +T2350 7913:787 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35450ms total) +T2350 7913:787 JLINK_WriteReg(R0, 0x08000800) returns 0x00 (0000ms, 35450ms total) +T2350 7913:787 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35450ms total) +T2350 7913:787 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35450ms total) +T2350 7913:787 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35450ms total) +T2350 7913:787 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35450ms total) +T2350 7913:787 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35450ms total) +T2350 7913:787 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35450ms total) +T2350 7913:787 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0001ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35451ms total) +T2350 7913:788 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000004 (0000ms, 35451ms total) +T2350 7913:788 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35455ms total) +T2350 7913:792 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35459ms total) +T2350 7913:796 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35455ms total) +T2350 7913:796 JLINK_ClrBPEx(BPHandle = 0x00000004) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R0, 0x08000800) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35455ms total) +T2350 7913:796 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000005 (0000ms, 35455ms total) +T2350 7913:796 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35459ms total) +T2350 7913:800 JLINK_IsHalted() returns FALSE (0001ms, 35460ms total) +T2350 7913:804 JLINK_IsHalted() returns FALSE (0001ms, 35460ms total) +T2350 7913:806 JLINK_IsHalted() returns FALSE (0001ms, 35460ms total) +T2350 7913:810 JLINK_IsHalted() returns FALSE (0001ms, 35460ms total) +T2350 7913:812 JLINK_IsHalted() returns FALSE (0001ms, 35460ms total) +T2350 7913:816 JLINK_IsHalted() returns FALSE (0001ms, 35460ms total) +T2350 7913:818 JLINK_IsHalted() returns FALSE (0001ms, 35460ms total) +T2350 7913:820 JLINK_IsHalted() returns FALSE (0001ms, 35460ms total) +T2350 7913:826 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35463ms total) +T2350 7913:830 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35459ms total) +T2350 7913:830 JLINK_ClrBPEx(BPHandle = 0x00000005) returns 0x00 (0000ms, 35459ms total) +T2350 7913:830 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35459ms total) +T2350 7913:830 JLINK_WriteReg(R0, 0x08001000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:830 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35459ms total) +T2350 7913:830 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35459ms total) +T2350 7913:830 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:830 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:830 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:830 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:830 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35459ms total) +T2350 7913:831 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000006 (0000ms, 35459ms total) +T2350 7913:831 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35463ms total) +T2350 7913:835 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0005ms, 35468ms total) +T2350 7913:840 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35463ms total) +T2350 7913:840 JLINK_ClrBPEx(BPHandle = 0x00000006) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R0, 0x08001000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35463ms total) +T2350 7913:840 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000007 (0000ms, 35463ms total) +T2350 7913:840 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35467ms total) +T2350 7913:844 JLINK_IsHalted() returns FALSE (0001ms, 35468ms total) +T2350 7913:861 JLINK_IsHalted() returns FALSE (0001ms, 35468ms total) +T2350 7913:863 JLINK_IsHalted() returns FALSE (0000ms, 35467ms total) +T2350 7913:864 JLINK_IsHalted() returns FALSE (0001ms, 35468ms total) +T2350 7913:868 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35471ms total) +T2350 7913:872 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35467ms total) +T2350 7913:872 JLINK_ClrBPEx(BPHandle = 0x00000007) returns 0x00 (0000ms, 35467ms total) +T2350 7913:872 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R0, 0x08001800) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35467ms total) +T2350 7913:873 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000008 (0000ms, 35467ms total) +T2350 7913:873 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35471ms total) +T2350 7913:877 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35475ms total) +T2350 7913:881 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35471ms total) +T2350 7913:881 JLINK_ClrBPEx(BPHandle = 0x00000008) returns 0x00 (0000ms, 35471ms total) +T2350 7913:881 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35471ms total) +T2350 7913:881 JLINK_WriteReg(R0, 0x08001800) returns 0x00 (0000ms, 35471ms total) +T2350 7913:881 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35471ms total) +T2350 7913:881 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35471ms total) +T2350 7913:881 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35471ms total) +T2350 7913:881 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0001ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35472ms total) +T2350 7913:882 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000009 (0000ms, 35472ms total) +T2350 7913:882 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35476ms total) +T2350 7913:886 JLINK_IsHalted() returns FALSE (0001ms, 35477ms total) +T2350 7913:890 JLINK_IsHalted() returns FALSE (0001ms, 35477ms total) +T2350 7913:892 JLINK_IsHalted() returns FALSE (0000ms, 35476ms total) +T2350 7913:893 JLINK_IsHalted() returns FALSE (0000ms, 35476ms total) +T2350 7913:894 JLINK_IsHalted() returns FALSE (0001ms, 35477ms total) +T2350 7913:896 JLINK_IsHalted() returns FALSE (0001ms, 35477ms total) +T2350 7913:898 JLINK_IsHalted() returns FALSE (0001ms, 35477ms total) +T2350 7913:904 JLINK_IsHalted() returns FALSE (0001ms, 35477ms total) +T2350 7913:906 JLINK_IsHalted() returns FALSE (0001ms, 35477ms total) +T2350 7913:910 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35480ms total) +T2350 7913:914 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35476ms total) +T2350 7913:914 JLINK_ClrBPEx(BPHandle = 0x00000009) returns 0x00 (0000ms, 35476ms total) +T2350 7913:914 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R0, 0x08002000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35476ms total) +T2350 7913:915 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000A (0000ms, 35476ms total) +T2350 7913:915 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35481ms total) +T2350 7913:920 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35485ms total) +T2350 7913:924 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35481ms total) +T2350 7913:924 JLINK_ClrBPEx(BPHandle = 0x0000000A) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R0, 0x08002000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35481ms total) +T2350 7913:924 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000B (0000ms, 35481ms total) +T2350 7913:924 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35485ms total) +T2350 7913:928 JLINK_IsHalted() returns FALSE (0001ms, 35486ms total) +T2350 7913:932 JLINK_IsHalted() returns FALSE (0001ms, 35486ms total) +T2350 7913:934 JLINK_IsHalted() returns FALSE (0001ms, 35486ms total) +T2350 7913:941 JLINK_IsHalted() returns FALSE (0001ms, 35486ms total) +T2350 7913:943 JLINK_IsHalted() returns FALSE (0001ms, 35486ms total) +T2350 7913:945 JLINK_IsHalted() returns FALSE (0001ms, 35486ms total) +T2350 7913:947 JLINK_IsHalted() returns FALSE (0000ms, 35485ms total) +T2350 7913:948 JLINK_IsHalted() returns FALSE (0001ms, 35486ms total) +T2350 7913:955 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35489ms total) +T2350 7913:959 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35485ms total) +T2350 7913:959 JLINK_ClrBPEx(BPHandle = 0x0000000B) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R0, 0x08002800) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35485ms total) +T2350 7913:959 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0001ms, 35486ms total) +T2350 7913:960 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35486ms total) +T2350 7913:960 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35486ms total) +T2350 7913:960 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35486ms total) +T2350 7913:960 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35486ms total) +T2350 7913:960 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35486ms total) +T2350 7913:960 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000C (0000ms, 35486ms total) +T2350 7913:960 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35490ms total) +T2350 7913:964 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35494ms total) +T2350 7913:968 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35490ms total) +T2350 7913:968 JLINK_ClrBPEx(BPHandle = 0x0000000C) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R0, 0x08002800) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35490ms total) +T2350 7913:968 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000D (0000ms, 35490ms total) +T2350 7913:968 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35494ms total) +T2350 7913:972 JLINK_IsHalted() returns FALSE (0001ms, 35495ms total) +T2350 7913:985 JLINK_IsHalted() returns FALSE (0001ms, 35495ms total) +T2350 7913:987 JLINK_IsHalted() returns FALSE (0000ms, 35494ms total) +T2350 7913:988 JLINK_IsHalted() returns FALSE (0000ms, 35494ms total) +T2350 7913:993 JLINK_IsHalted() returns FALSE (0001ms, 35495ms total) +T2350 7913:995 JLINK_IsHalted() returns FALSE (0000ms, 35494ms total) +T2350 7913:996 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35498ms total) +T2350 7914:000 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35494ms total) +T2350 7914:000 JLINK_ClrBPEx(BPHandle = 0x0000000D) returns 0x00 (0000ms, 35494ms total) +T2350 7914:000 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R0, 0x08003000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35494ms total) +T2350 7914:002 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000E (0000ms, 35494ms total) +T2350 7914:002 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35499ms total) +T2350 7914:007 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35503ms total) +T2350 7914:011 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35499ms total) +T2350 7914:011 JLINK_ClrBPEx(BPHandle = 0x0000000E) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R0, 0x08003000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35499ms total) +T2350 7914:011 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000000F (0000ms, 35499ms total) +T2350 7914:011 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35503ms total) +T2350 7914:015 JLINK_IsHalted() returns FALSE (0001ms, 35504ms total) +T2350 7914:021 JLINK_IsHalted() returns FALSE (0001ms, 35504ms total) +T2350 7914:023 JLINK_IsHalted() returns FALSE (0001ms, 35504ms total) +T2350 7914:025 JLINK_IsHalted() returns FALSE (0001ms, 35504ms total) +T2350 7914:027 JLINK_IsHalted() returns FALSE (0001ms, 35504ms total) +T2350 7914:029 JLINK_IsHalted() returns FALSE (0000ms, 35503ms total) +T2350 7914:030 JLINK_IsHalted() returns FALSE (0000ms, 35503ms total) +T2350 7914:031 JLINK_IsHalted() returns FALSE (0001ms, 35504ms total) +T2350 7914:033 JLINK_IsHalted() returns FALSE (0001ms, 35504ms total) +T2350 7914:035 JLINK_IsHalted() returns FALSE (0000ms, 35503ms total) +T2350 7914:036 JLINK_IsHalted() returns FALSE (0000ms, 35503ms total) +T2350 7914:037 JLINK_IsHalted() returns FALSE (0001ms, 35504ms total) +T2350 7914:039 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35507ms total) +T2350 7914:043 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35503ms total) +T2350 7914:043 JLINK_ClrBPEx(BPHandle = 0x0000000F) returns 0x00 (0000ms, 35503ms total) +T2350 7914:043 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R0, 0x08003800) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35503ms total) +T2350 7914:045 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000010 (0000ms, 35503ms total) +T2350 7914:045 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35508ms total) +T2350 7914:050 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35512ms total) +T2350 7914:054 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35508ms total) +T2350 7914:054 JLINK_ClrBPEx(BPHandle = 0x00000010) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R0, 0x08003800) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35508ms total) +T2350 7914:054 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000011 (0000ms, 35508ms total) +T2350 7914:054 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35512ms total) +T2350 7914:058 JLINK_IsHalted() returns FALSE (0001ms, 35513ms total) +T2350 7914:064 JLINK_IsHalted() returns FALSE (0001ms, 35513ms total) +T2350 7914:066 JLINK_IsHalted() returns FALSE (0000ms, 35512ms total) +T2350 7914:067 JLINK_IsHalted() returns FALSE (0001ms, 35513ms total) +T2350 7914:071 JLINK_IsHalted() returns FALSE (0001ms, 35513ms total) +T2350 7914:073 JLINK_IsHalted() returns FALSE (0000ms, 35512ms total) +T2350 7914:082 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35516ms total) +T2350 7914:086 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35512ms total) +T2350 7914:086 JLINK_ClrBPEx(BPHandle = 0x00000011) returns 0x00 (0000ms, 35512ms total) +T2350 7914:086 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R0, 0x08004000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35512ms total) +T2350 7914:087 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000012 (0000ms, 35512ms total) +T2350 7914:087 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35517ms total) +T2350 7914:092 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35521ms total) +T2350 7914:096 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35517ms total) +T2350 7914:096 JLINK_ClrBPEx(BPHandle = 0x00000012) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R0, 0x08004000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35517ms total) +T2350 7914:096 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000013 (0000ms, 35517ms total) +T2350 7914:096 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35522ms total) +T2350 7914:101 JLINK_IsHalted() returns FALSE (0001ms, 35523ms total) +T2350 7914:111 JLINK_IsHalted() returns FALSE (0001ms, 35523ms total) +T2350 7914:113 JLINK_IsHalted() returns FALSE (0000ms, 35523ms total) +T2350 7914:114 JLINK_IsHalted() returns FALSE (0000ms, 35523ms total) +T2350 7914:115 JLINK_IsHalted() returns FALSE (0000ms, 35523ms total) +T2350 7914:116 JLINK_IsHalted() returns FALSE (0000ms, 35523ms total) +T2350 7914:117 JLINK_IsHalted() returns FALSE (0000ms, 35523ms total) +T2350 7914:118 JLINK_IsHalted() returns FALSE (0000ms, 35523ms total) +T2350 7914:123 JLINK_IsHalted() returns FALSE (0001ms, 35524ms total) +T2350 7914:125 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35527ms total) +T2350 7914:129 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35523ms total) +T2350 7914:129 JLINK_ClrBPEx(BPHandle = 0x00000013) returns 0x00 (0000ms, 35523ms total) +T2350 7914:129 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R0, 0x08004800) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35523ms total) +T2350 7914:130 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000014 (0000ms, 35523ms total) +T2350 7914:130 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35527ms total) +T2350 7914:134 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35531ms total) +T2350 7914:139 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35527ms total) +T2350 7914:139 JLINK_ClrBPEx(BPHandle = 0x00000014) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R0, 0x08004800) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35527ms total) +T2350 7914:139 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000015 (0000ms, 35527ms total) +T2350 7914:139 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35531ms total) +T2350 7914:143 JLINK_IsHalted() returns FALSE (0001ms, 35532ms total) +T2350 7914:149 JLINK_IsHalted() returns FALSE (0001ms, 35532ms total) +T2350 7914:152 JLINK_IsHalted() returns FALSE (0001ms, 35532ms total) +T2350 7914:156 JLINK_IsHalted() returns FALSE (0001ms, 35532ms total) +T2350 7914:158 JLINK_IsHalted() returns FALSE (0000ms, 35531ms total) +T2350 7914:159 JLINK_IsHalted() returns FALSE (0000ms, 35531ms total) +T2350 7914:160 JLINK_IsHalted() returns FALSE (0000ms, 35531ms total) +T2350 7914:161 JLINK_IsHalted() returns FALSE (0001ms, 35532ms total) +T2350 7914:163 JLINK_IsHalted() returns FALSE (0001ms, 35532ms total) +T2350 7914:165 JLINK_IsHalted() returns FALSE (0000ms, 35532ms total) +T2350 7914:166 JLINK_IsHalted() returns FALSE (0000ms, 35532ms total) +T2350 7914:167 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35536ms total) +T2350 7914:171 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35532ms total) +T2350 7914:171 JLINK_ClrBPEx(BPHandle = 0x00000015) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R0, 0x08005000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35532ms total) +T2350 7914:171 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000016 (0000ms, 35532ms total) +T2350 7914:171 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35537ms total) +T2350 7914:176 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35541ms total) +T2350 7914:180 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35537ms total) +T2350 7914:180 JLINK_ClrBPEx(BPHandle = 0x00000016) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R0, 0x08005000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35537ms total) +T2350 7914:180 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000017 (0000ms, 35537ms total) +T2350 7914:180 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35542ms total) +T2350 7914:185 JLINK_IsHalted() returns FALSE (0001ms, 35543ms total) +T2350 7914:189 JLINK_IsHalted() returns FALSE (0001ms, 35543ms total) +T2350 7914:191 JLINK_IsHalted() returns FALSE (0001ms, 35544ms total) +T2350 7914:193 JLINK_IsHalted() returns FALSE (0001ms, 35544ms total) +T2350 7914:195 JLINK_IsHalted() returns FALSE (0001ms, 35544ms total) +T2350 7914:197 JLINK_IsHalted() returns FALSE (0001ms, 35544ms total) +T2350 7914:199 JLINK_IsHalted() returns FALSE (0000ms, 35543ms total) +T2350 7914:207 JLINK_IsHalted() returns FALSE (0001ms, 35544ms total) +T2350 7914:209 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35547ms total) +T2350 7914:213 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35543ms total) +T2350 7914:213 JLINK_ClrBPEx(BPHandle = 0x00000017) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R0, 0x08005800) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35543ms total) +T2350 7914:213 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0001ms, 35544ms total) +T2350 7914:214 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35544ms total) +T2350 7914:214 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35544ms total) +T2350 7914:214 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35544ms total) +T2350 7914:214 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35544ms total) +T2350 7914:214 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35544ms total) +T2350 7914:214 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000018 (0000ms, 35544ms total) +T2350 7914:214 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35548ms total) +T2350 7914:218 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35552ms total) +T2350 7914:222 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35548ms total) +T2350 7914:222 JLINK_ClrBPEx(BPHandle = 0x00000018) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R0, 0x08005800) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35548ms total) +T2350 7914:222 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0001ms, 35549ms total) +T2350 7914:223 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35549ms total) +T2350 7914:223 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35549ms total) +T2350 7914:223 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35549ms total) +T2350 7914:223 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35549ms total) +T2350 7914:223 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35549ms total) +T2350 7914:223 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35549ms total) +T2350 7914:223 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35549ms total) +T2350 7914:223 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000019 (0000ms, 35549ms total) +T2350 7914:223 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35553ms total) +T2350 7914:227 JLINK_IsHalted() returns FALSE (0001ms, 35554ms total) +T2350 7914:231 JLINK_IsHalted() returns FALSE (0001ms, 35554ms total) +T2350 7914:233 JLINK_IsHalted() returns FALSE (0001ms, 35554ms total) +T2350 7914:235 JLINK_IsHalted() returns FALSE (0000ms, 35553ms total) +T2350 7914:236 JLINK_IsHalted() returns FALSE (0000ms, 35553ms total) +T2350 7914:237 JLINK_IsHalted() returns FALSE (0000ms, 35553ms total) +T2350 7914:238 JLINK_IsHalted() returns FALSE (0001ms, 35554ms total) +T2350 7914:240 JLINK_IsHalted() returns FALSE (0000ms, 35553ms total) +T2350 7914:241 JLINK_IsHalted() returns FALSE (0000ms, 35553ms total) +T2350 7914:242 JLINK_IsHalted() returns FALSE (0001ms, 35554ms total) +T2350 7914:244 JLINK_IsHalted() returns FALSE (0001ms, 35554ms total) +T2350 7914:254 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35557ms total) +T2350 7914:258 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35553ms total) +T2350 7914:258 JLINK_ClrBPEx(BPHandle = 0x00000019) returns 0x00 (0000ms, 35553ms total) +T2350 7914:258 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R0, 0x08006000) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35553ms total) +T2350 7914:259 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0001ms, 35554ms total) +T2350 7914:260 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35554ms total) +T2350 7914:260 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35554ms total) +T2350 7914:260 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35554ms total) +T2350 7914:260 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35554ms total) +T2350 7914:260 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35554ms total) +T2350 7914:260 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35554ms total) +T2350 7914:260 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000001A (0000ms, 35554ms total) +T2350 7914:260 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35558ms total) +T2350 7914:264 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35562ms total) +T2350 7914:268 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35558ms total) +T2350 7914:268 JLINK_ClrBPEx(BPHandle = 0x0000001A) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R0, 0x08006000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:268 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:269 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:269 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35558ms total) +T2350 7914:269 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35558ms total) +T2350 7914:269 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:269 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:269 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:269 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35558ms total) +T2350 7914:269 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000001B (0000ms, 35558ms total) +T2350 7914:269 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0003ms, 35561ms total) +T2350 7914:272 JLINK_IsHalted() returns FALSE (0001ms, 35562ms total) +T2350 7914:278 JLINK_IsHalted() returns FALSE (0001ms, 35562ms total) +T2350 7914:280 JLINK_IsHalted() returns FALSE (0001ms, 35562ms total) +T2350 7914:282 JLINK_IsHalted() returns FALSE (0000ms, 35561ms total) +T2350 7914:283 JLINK_IsHalted() returns FALSE (0000ms, 35561ms total) +T2350 7914:284 JLINK_IsHalted() returns FALSE (0001ms, 35562ms total) +T2350 7914:286 JLINK_IsHalted() returns FALSE (0000ms, 35561ms total) +T2350 7914:287 JLINK_IsHalted() returns FALSE (0001ms, 35562ms total) +T2350 7914:289 JLINK_IsHalted() returns FALSE (0000ms, 35561ms total) +T2350 7914:290 JLINK_IsHalted() returns FALSE (0000ms, 35561ms total) +T2350 7914:291 JLINK_IsHalted() returns FALSE (0000ms, 35561ms total) +T2350 7914:292 JLINK_IsHalted() returns FALSE (0000ms, 35561ms total) +T2350 7914:295 JLINK_IsHalted() returns FALSE (0001ms, 35562ms total) +T2350 7914:297 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35565ms total) +T2350 7914:301 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35561ms total) +T2350 7914:301 JLINK_ClrBPEx(BPHandle = 0x0000001B) returns 0x00 (0000ms, 35561ms total) +T2350 7914:301 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35561ms total) +T2350 7914:301 JLINK_WriteReg(R0, 0x08006800) returns 0x00 (0000ms, 35561ms total) +T2350 7914:301 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35561ms total) +T2350 7914:301 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35561ms total) +T2350 7914:301 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35561ms total) +T2350 7914:301 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35561ms total) +T2350 7914:301 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35561ms total) +T2350 7914:301 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35561ms total) +T2350 7914:301 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35561ms total) +T2350 7914:302 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35562ms total) +T2350 7914:302 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000001C (0000ms, 35562ms total) +T2350 7914:302 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35566ms total) +T2350 7914:306 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35570ms total) +T2350 7914:310 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35566ms total) +T2350 7914:310 JLINK_ClrBPEx(BPHandle = 0x0000001C) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R0, 0x08006800) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35566ms total) +T2350 7914:310 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000001D (0000ms, 35566ms total) +T2350 7914:310 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35570ms total) +T2350 7914:314 JLINK_IsHalted() returns FALSE (0001ms, 35571ms total) +T2350 7914:316 JLINK_IsHalted() returns FALSE (0000ms, 35570ms total) +T2350 7914:317 JLINK_IsHalted() returns FALSE (0000ms, 35570ms total) +T2350 7914:318 JLINK_IsHalted() returns FALSE (0000ms, 35570ms total) +T2350 7914:319 JLINK_IsHalted() returns FALSE (0000ms, 35570ms total) +T2350 7914:320 JLINK_IsHalted() returns FALSE (0000ms, 35570ms total) +T2350 7914:321 JLINK_IsHalted() returns FALSE (0000ms, 35570ms total) +T2350 7914:322 JLINK_IsHalted() returns FALSE (0000ms, 35570ms total) +T2350 7914:323 JLINK_IsHalted() returns FALSE (0000ms, 35570ms total) +T2350 7914:328 JLINK_IsHalted() returns FALSE (0001ms, 35571ms total) +T2350 7914:330 JLINK_IsHalted() returns FALSE (0001ms, 35571ms total) +T2350 7914:332 JLINK_IsHalted() returns FALSE (0001ms, 35571ms total) +T2350 7914:334 JLINK_IsHalted() returns FALSE (0001ms, 35571ms total) +T2350 7914:336 JLINK_IsHalted() returns FALSE (0001ms, 35571ms total) +T2350 7914:338 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35573ms total) +T2350 7914:342 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35570ms total) +T2350 7914:342 JLINK_ClrBPEx(BPHandle = 0x0000001D) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R0, 0x08007000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35570ms total) +T2350 7914:342 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000001E (0000ms, 35570ms total) +T2350 7914:342 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35575ms total) +T2350 7914:347 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35579ms total) +T2350 7914:351 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35575ms total) +T2350 7914:351 JLINK_ClrBPEx(BPHandle = 0x0000001E) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R0, 0x08007000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35575ms total) +T2350 7914:351 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000001F (0000ms, 35575ms total) +T2350 7914:351 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35579ms total) +T2350 7914:355 JLINK_IsHalted() returns FALSE (0001ms, 35580ms total) +T2350 7914:357 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:358 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:359 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:360 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:361 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:362 JLINK_IsHalted() returns FALSE (0001ms, 35580ms total) +T2350 7914:364 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:365 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:366 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:367 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:368 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:369 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:370 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:375 JLINK_IsHalted() returns FALSE (0001ms, 35580ms total) +T2350 7914:377 JLINK_IsHalted() returns FALSE (0000ms, 35579ms total) +T2350 7914:378 JLINK_IsHalted() returns FALSE (0001ms, 35580ms total) +T2350 7914:380 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35583ms total) +T2350 7914:384 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35579ms total) +T2350 7914:384 JLINK_ClrBPEx(BPHandle = 0x0000001F) returns 0x00 (0000ms, 35579ms total) +T2350 7914:384 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R0, 0x08007800) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35579ms total) +T2350 7914:385 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000020 (0000ms, 35579ms total) +T2350 7914:385 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35583ms total) +T2350 7914:389 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35587ms total) +T2350 7914:394 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35583ms total) +T2350 7914:394 JLINK_ClrBPEx(BPHandle = 0x00000020) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R0, 0x08007800) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35583ms total) +T2350 7914:394 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000021 (0000ms, 35583ms total) +T2350 7914:394 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35587ms total) +T2350 7914:398 JLINK_IsHalted() returns FALSE (0001ms, 35588ms total) +T2350 7914:403 JLINK_IsHalted() returns FALSE (0001ms, 35588ms total) +T2350 7914:408 JLINK_IsHalted() returns FALSE (0001ms, 35588ms total) +T2350 7914:410 JLINK_IsHalted() returns FALSE (0001ms, 35588ms total) +T2350 7914:412 JLINK_IsHalted() returns FALSE (0001ms, 35588ms total) +T2350 7914:414 JLINK_IsHalted() returns FALSE (0001ms, 35588ms total) +T2350 7914:416 JLINK_IsHalted() returns FALSE (0001ms, 35588ms total) +T2350 7914:418 JLINK_IsHalted() returns FALSE (0001ms, 35588ms total) +T2350 7914:420 JLINK_IsHalted() returns FALSE (0001ms, 35588ms total) +T2350 7914:422 JLINK_IsHalted() returns FALSE (0000ms, 35587ms total) +T2350 7914:423 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35591ms total) +T2350 7914:427 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35587ms total) +T2350 7914:427 JLINK_ClrBPEx(BPHandle = 0x00000021) returns 0x00 (0000ms, 35587ms total) +T2350 7914:427 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R0, 0x08008000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35587ms total) +T2350 7914:428 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000022 (0000ms, 35587ms total) +T2350 7914:428 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35591ms total) +T2350 7914:432 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35595ms total) +T2350 7914:436 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35591ms total) +T2350 7914:436 JLINK_ClrBPEx(BPHandle = 0x00000022) returns 0x00 (0000ms, 35591ms total) +T2350 7914:436 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35591ms total) +T2350 7914:436 JLINK_WriteReg(R0, 0x08008000) returns 0x00 (0000ms, 35591ms total) +T2350 7914:436 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35591ms total) +T2350 7914:436 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35591ms total) +T2350 7914:436 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35591ms total) +T2350 7914:436 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35591ms total) +T2350 7914:436 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35591ms total) +T2350 7914:436 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35591ms total) +T2350 7914:436 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0001ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35592ms total) +T2350 7914:437 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000023 (0000ms, 35592ms total) +T2350 7914:437 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0006ms, 35598ms total) +T2350 7914:443 JLINK_IsHalted() returns FALSE (0001ms, 35599ms total) +T2350 7914:445 JLINK_IsHalted() returns FALSE (0001ms, 35599ms total) +T2350 7914:447 JLINK_IsHalted() returns FALSE (0001ms, 35599ms total) +T2350 7914:449 JLINK_IsHalted() returns FALSE (0001ms, 35599ms total) +T2350 7914:453 JLINK_IsHalted() returns FALSE (0001ms, 35599ms total) +T2350 7914:455 JLINK_IsHalted() returns FALSE (0001ms, 35599ms total) +T2350 7914:457 JLINK_IsHalted() returns FALSE (0000ms, 35598ms total) +T2350 7914:458 JLINK_IsHalted() returns FALSE (0001ms, 35599ms total) +T2350 7914:460 JLINK_IsHalted() returns FALSE (0000ms, 35598ms total) +T2350 7914:461 JLINK_IsHalted() returns FALSE (0000ms, 35598ms total) +T2350 7914:462 JLINK_IsHalted() returns FALSE (0000ms, 35598ms total) +T2350 7914:463 JLINK_IsHalted() returns FALSE (0000ms, 35598ms total) +T2350 7914:464 JLINK_IsHalted() returns FALSE (0001ms, 35599ms total) +T2350 7914:466 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35601ms total) +T2350 7914:469 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35598ms total) +T2350 7914:469 JLINK_ClrBPEx(BPHandle = 0x00000023) returns 0x00 (0000ms, 35598ms total) +T2350 7914:469 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R0, 0x08008800) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35598ms total) +T2350 7914:470 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000024 (0000ms, 35598ms total) +T2350 7914:470 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35602ms total) +T2350 7914:474 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35606ms total) +T2350 7914:478 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35602ms total) +T2350 7914:478 JLINK_ClrBPEx(BPHandle = 0x00000024) returns 0x00 (0000ms, 35602ms total) +T2350 7914:478 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35602ms total) +T2350 7914:478 JLINK_WriteReg(R0, 0x08008800) returns 0x00 (0000ms, 35602ms total) +T2350 7914:478 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0001ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35603ms total) +T2350 7914:479 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000025 (0000ms, 35603ms total) +T2350 7914:479 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35607ms total) +T2350 7914:483 JLINK_IsHalted() returns FALSE (0001ms, 35608ms total) +T2350 7914:489 JLINK_IsHalted() returns FALSE (0001ms, 35608ms total) +T2350 7914:491 JLINK_IsHalted() returns FALSE (0001ms, 35608ms total) +T2350 7914:493 JLINK_IsHalted() returns FALSE (0001ms, 35608ms total) +T2350 7914:495 JLINK_IsHalted() returns FALSE (0000ms, 35607ms total) +T2350 7914:496 JLINK_IsHalted() returns FALSE (0002ms, 35609ms total) +T2350 7914:499 JLINK_IsHalted() returns FALSE (0001ms, 35608ms total) +T2350 7914:501 JLINK_IsHalted() returns FALSE (0000ms, 35607ms total) +T2350 7914:502 JLINK_IsHalted() returns FALSE (0000ms, 35607ms total) +T2350 7914:503 JLINK_IsHalted() returns FALSE (0001ms, 35608ms total) +T2350 7914:505 JLINK_IsHalted() returns FALSE (0001ms, 35608ms total) +T2350 7914:507 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35611ms total) +T2350 7914:511 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35607ms total) +T2350 7914:511 JLINK_ClrBPEx(BPHandle = 0x00000025) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R0, 0x08009000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35607ms total) +T2350 7914:511 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000026 (0000ms, 35607ms total) +T2350 7914:511 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35612ms total) +T2350 7914:516 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35616ms total) +T2350 7914:520 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35612ms total) +T2350 7914:520 JLINK_ClrBPEx(BPHandle = 0x00000026) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R0, 0x08009000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35612ms total) +T2350 7914:520 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000027 (0000ms, 35612ms total) +T2350 7914:520 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35616ms total) +T2350 7914:524 JLINK_IsHalted() returns FALSE (0001ms, 35617ms total) +T2350 7914:530 JLINK_IsHalted() returns FALSE (0001ms, 35617ms total) +T2350 7914:532 JLINK_IsHalted() returns FALSE (0001ms, 35617ms total) +T2350 7914:534 JLINK_IsHalted() returns FALSE (0001ms, 35617ms total) +T2350 7914:536 JLINK_IsHalted() returns FALSE (0001ms, 35617ms total) +T2350 7914:538 JLINK_IsHalted() returns FALSE (0001ms, 35617ms total) +T2350 7914:540 JLINK_IsHalted() returns FALSE (0000ms, 35616ms total) +T2350 7914:541 JLINK_IsHalted() returns FALSE (0000ms, 35616ms total) +T2350 7914:542 JLINK_IsHalted() returns FALSE (0000ms, 35616ms total) +T2350 7914:543 JLINK_IsHalted() returns FALSE (0000ms, 35616ms total) +T2350 7914:544 JLINK_IsHalted() returns FALSE (0001ms, 35617ms total) +T2350 7914:546 JLINK_IsHalted() returns FALSE (0000ms, 35616ms total) +T2350 7914:547 JLINK_IsHalted() returns FALSE (0000ms, 35616ms total) +T2350 7914:548 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35620ms total) +T2350 7914:552 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35616ms total) +T2350 7914:552 JLINK_ClrBPEx(BPHandle = 0x00000027) returns 0x00 (0000ms, 35616ms total) +T2350 7914:552 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35616ms total) +T2350 7914:553 JLINK_WriteReg(R0, 0x08009800) returns 0x00 (0000ms, 35616ms total) +T2350 7914:553 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35616ms total) +T2350 7914:553 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35616ms total) +T2350 7914:553 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35616ms total) +T2350 7914:553 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35616ms total) +T2350 7914:553 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35616ms total) +T2350 7914:553 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35616ms total) +T2350 7914:553 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0001ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35617ms total) +T2350 7914:554 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000028 (0000ms, 35617ms total) +T2350 7914:554 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35622ms total) +T2350 7914:559 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35626ms total) +T2350 7914:563 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35622ms total) +T2350 7914:563 JLINK_ClrBPEx(BPHandle = 0x00000028) returns 0x00 (0000ms, 35622ms total) +T2350 7914:563 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35622ms total) +T2350 7914:563 JLINK_WriteReg(R0, 0x08009800) returns 0x00 (0000ms, 35622ms total) +T2350 7914:563 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35622ms total) +T2350 7914:563 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35622ms total) +T2350 7914:563 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35622ms total) +T2350 7914:563 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35622ms total) +T2350 7914:563 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35622ms total) +T2350 7914:563 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35622ms total) +T2350 7914:563 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35622ms total) +T2350 7914:563 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35622ms total) +T2350 7914:563 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35622ms total) +T2350 7914:563 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0001ms, 35623ms total) +T2350 7914:564 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35623ms total) +T2350 7914:564 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35623ms total) +T2350 7914:564 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35623ms total) +T2350 7914:564 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35623ms total) +T2350 7914:564 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35623ms total) +T2350 7914:564 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35623ms total) +T2350 7914:564 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35623ms total) +T2350 7914:564 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35623ms total) +T2350 7914:564 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35623ms total) +T2350 7914:564 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000029 (0000ms, 35623ms total) +T2350 7914:564 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35627ms total) +T2350 7914:568 JLINK_IsHalted() returns FALSE (0001ms, 35628ms total) +T2350 7914:570 JLINK_IsHalted() returns FALSE (0000ms, 35627ms total) +T2350 7914:572 JLINK_IsHalted() returns FALSE (0001ms, 35628ms total) +T2350 7914:630 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35631ms total) +T2350 7914:634 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35627ms total) +T2350 7914:634 JLINK_ClrBPEx(BPHandle = 0x00000029) returns 0x00 (0000ms, 35627ms total) +T2350 7914:634 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35627ms total) +T2350 7914:634 JLINK_WriteReg(R0, 0x0800A000) returns 0x00 (0000ms, 35627ms total) +T2350 7914:634 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35627ms total) +T2350 7914:634 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35627ms total) +T2350 7914:634 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35627ms total) +T2350 7914:634 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35627ms total) +T2350 7914:634 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35627ms total) +T2350 7914:634 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35627ms total) +T2350 7914:634 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35627ms total) +T2350 7914:634 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0001ms, 35628ms total) +T2350 7914:635 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35628ms total) +T2350 7914:635 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35628ms total) +T2350 7914:635 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35628ms total) +T2350 7914:635 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35628ms total) +T2350 7914:635 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35628ms total) +T2350 7914:635 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35628ms total) +T2350 7914:635 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35628ms total) +T2350 7914:635 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35628ms total) +T2350 7914:635 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35628ms total) +T2350 7914:635 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35628ms total) +T2350 7914:635 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35628ms total) +T2350 7914:635 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000002A (0000ms, 35628ms total) +T2350 7914:635 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35632ms total) +T2350 7914:639 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35636ms total) +T2350 7914:643 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35632ms total) +T2350 7914:643 JLINK_ClrBPEx(BPHandle = 0x0000002A) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R0, 0x0800A000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35632ms total) +T2350 7914:643 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000002B (0000ms, 35632ms total) +T2350 7914:643 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35636ms total) +T2350 7914:647 JLINK_IsHalted() returns FALSE (0001ms, 35637ms total) +T2350 7914:652 JLINK_IsHalted() returns FALSE (0001ms, 35637ms total) +T2350 7914:654 JLINK_IsHalted() returns FALSE (0001ms, 35637ms total) +T2350 7914:656 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:657 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:658 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:659 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:660 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:661 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:662 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:663 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:664 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:665 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:666 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:667 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:668 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:669 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:670 JLINK_IsHalted() returns FALSE (0000ms, 35636ms total) +T2350 7914:671 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35639ms total) +T2350 7914:674 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35636ms total) +T2350 7914:674 JLINK_ClrBPEx(BPHandle = 0x0000002B) returns 0x00 (0000ms, 35636ms total) +T2350 7914:674 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R0, 0x0800A800) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35636ms total) +T2350 7914:675 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000002C (0000ms, 35636ms total) +T2350 7914:675 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35641ms total) +T2350 7914:680 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0005ms, 35646ms total) +T2350 7914:685 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35641ms total) +T2350 7914:685 JLINK_ClrBPEx(BPHandle = 0x0000002C) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R0, 0x0800A800) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35641ms total) +T2350 7914:685 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000002D (0000ms, 35641ms total) +T2350 7914:685 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35645ms total) +T2350 7914:689 JLINK_IsHalted() returns FALSE (0001ms, 35646ms total) +T2350 7914:691 JLINK_IsHalted() returns FALSE (0000ms, 35645ms total) +T2350 7914:692 JLINK_IsHalted() returns FALSE (0001ms, 35646ms total) +T2350 7914:694 JLINK_IsHalted() returns FALSE (0000ms, 35645ms total) +T2350 7914:695 JLINK_IsHalted() returns FALSE (0000ms, 35645ms total) +T2350 7914:696 JLINK_IsHalted() returns FALSE (0000ms, 35645ms total) +T2350 7914:697 JLINK_IsHalted() returns FALSE (0000ms, 35645ms total) +T2350 7914:698 JLINK_IsHalted() returns FALSE (0001ms, 35646ms total) +T2350 7914:715 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35649ms total) +T2350 7914:719 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35645ms total) +T2350 7914:719 JLINK_ClrBPEx(BPHandle = 0x0000002D) returns 0x00 (0000ms, 35645ms total) +T2350 7914:719 JLINK_ReadReg(R0) returns 0x00000000 (0001ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R0, 0x0800B000) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35646ms total) +T2350 7914:721 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0001ms, 35647ms total) +T2350 7914:722 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35647ms total) +T2350 7914:722 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35647ms total) +T2350 7914:722 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35647ms total) +T2350 7914:722 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35647ms total) +T2350 7914:722 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35647ms total) +T2350 7914:722 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000002E (0000ms, 35647ms total) +T2350 7914:722 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35652ms total) +T2350 7914:727 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35656ms total) +T2350 7914:731 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35652ms total) +T2350 7914:731 JLINK_ClrBPEx(BPHandle = 0x0000002E) returns 0x00 (0000ms, 35652ms total) +T2350 7914:731 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35652ms total) +T2350 7914:731 JLINK_WriteReg(R0, 0x0800B000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:731 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35652ms total) +T2350 7914:731 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35652ms total) +T2350 7914:731 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:731 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:731 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:731 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:731 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35652ms total) +T2350 7914:732 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000002F (0000ms, 35652ms total) +T2350 7914:732 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35657ms total) +T2350 7914:737 JLINK_IsHalted() returns FALSE (0001ms, 35658ms total) +T2350 7914:745 JLINK_IsHalted() returns FALSE (0001ms, 35658ms total) +T2350 7914:759 JLINK_IsHalted() returns FALSE (0001ms, 35658ms total) +T2350 7914:762 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35661ms total) +T2350 7914:766 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35657ms total) +T2350 7914:766 JLINK_ClrBPEx(BPHandle = 0x0000002F) returns 0x00 (0000ms, 35657ms total) +T2350 7914:766 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R0, 0x0800B800) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35657ms total) +T2350 7914:767 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000030 (0000ms, 35657ms total) +T2350 7914:767 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35662ms total) +T2350 7914:772 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35666ms total) +T2350 7914:776 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35662ms total) +T2350 7914:776 JLINK_ClrBPEx(BPHandle = 0x00000030) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R0, 0x0800B800) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35662ms total) +T2350 7914:776 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000031 (0000ms, 35662ms total) +T2350 7914:776 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35666ms total) +T2350 7914:780 JLINK_IsHalted() returns FALSE (0001ms, 35667ms total) +T2350 7914:784 JLINK_IsHalted() returns FALSE (0001ms, 35667ms total) +T2350 7914:786 JLINK_IsHalted() returns FALSE (0000ms, 35666ms total) +T2350 7914:787 JLINK_IsHalted() returns FALSE (0001ms, 35667ms total) +T2350 7914:789 JLINK_IsHalted() returns FALSE (0001ms, 35667ms total) +T2350 7914:791 JLINK_IsHalted() returns FALSE (0000ms, 35666ms total) +T2350 7914:792 JLINK_IsHalted() returns FALSE (0000ms, 35666ms total) +T2350 7914:793 JLINK_IsHalted() returns FALSE (0000ms, 35666ms total) +T2350 7914:794 JLINK_IsHalted() returns FALSE (0000ms, 35666ms total) +T2350 7914:795 JLINK_IsHalted() returns FALSE (0000ms, 35666ms total) +T2350 7914:796 JLINK_IsHalted() returns FALSE (0001ms, 35667ms total) +T2350 7914:798 JLINK_IsHalted() returns FALSE (0001ms, 35667ms total) +T2350 7914:800 JLINK_IsHalted() returns FALSE (0001ms, 35667ms total) +T2350 7914:802 JLINK_IsHalted() returns FALSE (0000ms, 35666ms total) +T2350 7914:803 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35670ms total) +T2350 7914:807 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35666ms total) +T2350 7914:807 JLINK_ClrBPEx(BPHandle = 0x00000031) returns 0x00 (0000ms, 35666ms total) +T2350 7914:807 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R0, 0x0800C000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35666ms total) +T2350 7914:808 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000032 (0000ms, 35666ms total) +T2350 7914:808 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35671ms total) +T2350 7914:813 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35675ms total) +T2350 7914:817 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35671ms total) +T2350 7914:817 JLINK_ClrBPEx(BPHandle = 0x00000032) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R0, 0x0800C000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35671ms total) +T2350 7914:817 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000033 (0000ms, 35671ms total) +T2350 7914:817 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35675ms total) +T2350 7914:821 JLINK_IsHalted() returns FALSE (0001ms, 35676ms total) +T2350 7914:828 JLINK_IsHalted() returns FALSE (0001ms, 35676ms total) +T2350 7914:830 JLINK_IsHalted() returns FALSE (0001ms, 35676ms total) +T2350 7914:832 JLINK_IsHalted() returns FALSE (0000ms, 35675ms total) +T2350 7914:833 JLINK_IsHalted() returns FALSE (0000ms, 35675ms total) +T2350 7914:834 JLINK_IsHalted() returns FALSE (0001ms, 35676ms total) +T2350 7914:836 JLINK_IsHalted() returns FALSE (0000ms, 35675ms total) +T2350 7914:837 JLINK_IsHalted() returns FALSE (0001ms, 35676ms total) +T2350 7914:839 JLINK_IsHalted() returns FALSE (0002ms, 35677ms total) +T2350 7914:845 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35679ms total) +T2350 7914:849 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35675ms total) +T2350 7914:849 JLINK_ClrBPEx(BPHandle = 0x00000033) returns 0x00 (0000ms, 35675ms total) +T2350 7914:849 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35675ms total) +T2350 7914:849 JLINK_WriteReg(R0, 0x0800C800) returns 0x00 (0000ms, 35675ms total) +T2350 7914:849 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0001ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(R15 (PC), 0x20000020) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35676ms total) +T2350 7914:850 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000034 (0000ms, 35676ms total) +T2350 7914:850 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35680ms total) +T2350 7914:854 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35684ms total) +T2350 7914:858 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35680ms total) +T2350 7914:858 JLINK_ClrBPEx(BPHandle = 0x00000034) returns 0x00 (0000ms, 35680ms total) +T2350 7914:858 JLINK_ReadReg(R0) returns 0x00000001 (0000ms, 35680ms total) +T2350 7914:858 JLINK_WriteReg(R0, 0x0800C800) returns 0x00 (0000ms, 35680ms total) +T2350 7914:858 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35680ms total) +T2350 7914:858 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35680ms total) +T2350 7914:858 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35680ms total) +T2350 7914:858 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35680ms total) +T2350 7914:859 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(R15 (PC), 0x200000A8) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35681ms total) +T2350 7914:859 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000035 (0000ms, 35681ms total) +T2350 7914:859 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35685ms total) +T2350 7914:863 JLINK_IsHalted() returns FALSE (0001ms, 35686ms total) +T2350 7914:865 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:866 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:867 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:868 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:869 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:870 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:871 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:872 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:873 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:874 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:875 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:876 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:877 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:878 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:879 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:880 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:881 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:882 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:883 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:884 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:885 JLINK_IsHalted() returns FALSE (0000ms, 35685ms total) +T2350 7914:888 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35689ms total) +T2350 7914:892 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35685ms total) +T2350 7914:892 JLINK_ClrBPEx(BPHandle = 0x00000035) returns 0x00 (0000ms, 35685ms total) +T2350 7914:892 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35685ms total) +T2350 7914:892 JLINK_WriteReg(R0, 0x00000001) returns 0x00 (0000ms, 35685ms total) +T2350 7914:892 JLINK_WriteReg(R1, 0x00000800) returns 0x00 (0000ms, 35685ms total) +T2350 7914:892 JLINK_WriteReg(R2, 0x000000FF) returns 0x00 (0000ms, 35685ms total) +T2350 7914:892 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35685ms total) +T2350 7914:892 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35685ms total) +T2350 7914:893 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(R15 (PC), 0x2000006C) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35686ms total) +T2350 7914:893 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000036 (0000ms, 35686ms total) +T2350 7914:893 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35690ms total) +T2350 7914:897 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35694ms total) +T2350 7914:901 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35690ms total) +T2350 7914:901 JLINK_ClrBPEx(BPHandle = 0x00000036) returns 0x00 (0000ms, 35690ms total) +T2350 7914:901 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35690ms total) +T2350 7914:982 JLINK_WriteMem(0x20000000, 0x013C Bytes, ...) - Data: 00 BE 0A E0 0D 78 2D 06 68 40 08 24 40 00 00 D3 ... -- CPU_WriteMem(316 bytes @ 0x20000000) returns 0x13C (0002ms, 35692ms total) +T2350 7914:984 JLINK_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 35692ms total) +T2350 7914:984 JLINK_WriteReg(R1, 0x00B71B00) returns 0x00 (0000ms, 35692ms total) +T2350 7914:984 JLINK_WriteReg(R2, 0x00000002) returns 0x00 (0000ms, 35692ms total) +T2350 7914:984 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0001ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(R15 (PC), 0x20000038) returns 0x00 (0000ms, 35693ms total) +T2350 7914:985 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35693ms total) +T2350 7914:986 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35694ms total) +T2350 7914:986 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35694ms total) +T2350 7914:986 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35694ms total) +T2350 7914:986 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) -- CPU_ReadMem(2 bytes @ 0x20000000) returns 0x00000037 (0002ms, 35696ms total) +T2350 7914:988 JLINK_Go() -- CPU_WriteMem(2 bytes @ 0x20000000) -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35701ms total) +T2350 7914:993 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35705ms total) +T2350 7914:997 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35701ms total) +T2350 7914:997 JLINK_ClrBPEx(BPHandle = 0x00000037) returns 0x00 (0000ms, 35701ms total) +T2350 7914:997 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35701ms total) +T2350 7914:998 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: F0 8D 00 20 49 01 00 08 49 1A 00 08 A1 14 00 08 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35704ms total) +T2350 7915:001 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 80 46 10 22 41 46 38 46 FF F7 60 FF 40 46 05 F0 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35706ms total) +T2350 7915:003 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0001ms, 35707ms total) +T2350 7915:004 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35707ms total) +T2350 7915:004 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35707ms total) +T2350 7915:004 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35707ms total) +T2350 7915:004 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35707ms total) +T2350 7915:004 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35707ms total) +T2350 7915:004 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35707ms total) +T2350 7915:004 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000038 (0000ms, 35707ms total) +T2350 7915:004 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35711ms total) +T2350 7915:008 JLINK_IsHalted() returns FALSE (0001ms, 35712ms total) +T2350 7915:021 JLINK_IsHalted() returns FALSE (0001ms, 35712ms total) +T2350 7915:023 JLINK_IsHalted() returns FALSE (0001ms, 35712ms total) +T2350 7915:025 JLINK_IsHalted() returns FALSE (0000ms, 35711ms total) +T2350 7915:029 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35715ms total) +T2350 7915:033 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35711ms total) +T2350 7915:033 JLINK_ClrBPEx(BPHandle = 0x00000038) returns 0x00 (0000ms, 35711ms total) +T2350 7915:033 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35711ms total) +T2350 7915:034 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 1E 40 04 B0 BD E8 F0 87 00 24 B9 F1 10 0F A8 BF ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35714ms total) +T2350 7915:037 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 4F EA 3A 4A 4F EA 35 45 8A EA 3B 6A 84 EA 39 24 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R0, 0x08000400) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35716ms total) +T2350 7915:039 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000039 (0000ms, 35716ms total) +T2350 7915:039 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35721ms total) +T2350 7915:044 JLINK_IsHalted() returns FALSE (0001ms, 35722ms total) +T2350 7915:046 JLINK_IsHalted() returns FALSE (0001ms, 35722ms total) +T2350 7915:064 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35725ms total) +T2350 7915:068 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35721ms total) +T2350 7915:068 JLINK_ClrBPEx(BPHandle = 0x00000039) returns 0x00 (0000ms, 35721ms total) +T2350 7915:068 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35721ms total) +T2350 7915:069 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 0C EB E3 08 C2 4B 4F F0 01 0C C3 F8 08 C0 D3 F8 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35724ms total) +T2350 7915:072 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 4F EA 0C 4C 4C EA 07 2C 43 EA 0C 03 D2 F8 08 C0 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R0, 0x08000800) returns 0x00 (0000ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35726ms total) +T2350 7915:074 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0001ms, 35727ms total) +T2350 7915:075 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35727ms total) +T2350 7915:075 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35727ms total) +T2350 7915:075 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35727ms total) +T2350 7915:075 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35727ms total) +T2350 7915:075 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35727ms total) +T2350 7915:075 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35727ms total) +T2350 7915:075 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35727ms total) +T2350 7915:075 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35727ms total) +T2350 7915:075 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000003A (0000ms, 35727ms total) +T2350 7915:075 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35731ms total) +T2350 7915:079 JLINK_IsHalted() returns FALSE (0001ms, 35732ms total) +T2350 7915:081 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:082 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:083 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:084 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:085 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:086 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:087 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:088 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:089 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:090 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:091 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:092 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:093 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:094 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:095 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:096 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:097 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:098 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:099 JLINK_IsHalted() returns FALSE (0000ms, 35731ms total) +T2350 7915:100 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35734ms total) +T2350 7915:103 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35731ms total) +T2350 7915:103 JLINK_ClrBPEx(BPHandle = 0x0000003A) returns 0x00 (0000ms, 35731ms total) +T2350 7915:103 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35731ms total) +T2350 7915:106 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: CC F3 07 25 45 5D 51 F8 25 50 4F EA 35 45 50 FA ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0004ms, 35735ms total) +T2350 7915:110 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 1C F0 01 0F 4F F0 18 04 A2 F1 01 02 04 D0 12 F8 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R0, 0x08000C00) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35737ms total) +T2350 7915:112 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0001ms, 35738ms total) +T2350 7915:113 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35738ms total) +T2350 7915:113 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35738ms total) +T2350 7915:113 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35738ms total) +T2350 7915:113 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35738ms total) +T2350 7915:113 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35738ms total) +T2350 7915:113 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35738ms total) +T2350 7915:113 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35738ms total) +T2350 7915:113 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000003B (0000ms, 35738ms total) +T2350 7915:113 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35743ms total) +T2350 7915:118 JLINK_IsHalted() returns FALSE (0015ms, 35758ms total) +T2350 7915:186 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35747ms total) +T2350 7915:190 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35743ms total) +T2350 7915:190 JLINK_ClrBPEx(BPHandle = 0x0000003B) returns 0x00 (0000ms, 35743ms total) +T2350 7915:190 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35743ms total) +T2350 7915:190 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 6D 1C 04 2D F4 DB 64 1C 04 2C EF DB 00 20 FF F7 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35746ms total) +T2350 7915:193 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 02 90 00 20 03 90 04 20 04 90 01 A9 0E 48 00 F0 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R0, 0x08001000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35748ms total) +T2350 7915:195 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000003C (0000ms, 35748ms total) +T2350 7915:195 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35752ms total) +T2350 7915:202 JLINK_IsHalted() returns FALSE (0001ms, 35753ms total) +T2350 7915:204 JLINK_IsHalted() returns FALSE (0001ms, 35753ms total) +T2350 7915:209 JLINK_IsHalted() returns FALSE (0000ms, 35752ms total) +T2350 7915:211 JLINK_IsHalted() returns FALSE (0001ms, 35753ms total) +T2350 7915:213 JLINK_IsHalted() returns FALSE (0001ms, 35753ms total) +T2350 7915:215 JLINK_IsHalted() returns FALSE (0000ms, 35752ms total) +T2350 7915:216 JLINK_IsHalted() returns FALSE (0000ms, 35752ms total) +T2350 7915:217 JLINK_IsHalted() returns FALSE (0000ms, 35752ms total) +T2350 7915:218 JLINK_IsHalted() returns FALSE (0000ms, 35752ms total) +T2350 7915:219 JLINK_IsHalted() returns FALSE (0000ms, 35752ms total) +T2350 7915:220 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35755ms total) +T2350 7915:223 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35752ms total) +T2350 7915:223 JLINK_ClrBPEx(BPHandle = 0x0000003C) returns 0x00 (0000ms, 35752ms total) +T2350 7915:223 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35752ms total) +T2350 7915:224 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 00 08 01 40 00 30 01 40 2D E9 F0 41 04 46 0D 46 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0002ms, 35754ms total) +T2350 7915:226 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 03 09 89 EA 04 09 89 EA 05 09 9D F8 05 A0 89 EA ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0003ms, 35757ms total) +T2350 7915:230 JLINK_WriteReg(R0, 0x08001400) returns 0x00 (0001ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35758ms total) +T2350 7915:231 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000003D (0000ms, 35758ms total) +T2350 7915:231 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35762ms total) +T2350 7915:235 JLINK_IsHalted() returns FALSE (0000ms, 35762ms total) +T2350 7915:237 JLINK_IsHalted() returns FALSE (0001ms, 35763ms total) +T2350 7915:239 JLINK_IsHalted() returns FALSE (0000ms, 35762ms total) +T2350 7915:240 JLINK_IsHalted() returns FALSE (0000ms, 35762ms total) +T2350 7915:241 JLINK_IsHalted() returns FALSE (0000ms, 35762ms total) +T2350 7915:242 JLINK_IsHalted() returns FALSE (0000ms, 35762ms total) +T2350 7915:243 JLINK_IsHalted() returns FALSE (0004ms, 35766ms total) +T2350 7915:251 JLINK_IsHalted() returns FALSE (0000ms, 35762ms total) +T2350 7915:252 JLINK_IsHalted() returns FALSE (0000ms, 35762ms total) +T2350 7915:253 JLINK_IsHalted() returns FALSE (0000ms, 35762ms total) +T2350 7915:254 JLINK_IsHalted() returns FALSE (0001ms, 35763ms total) +T2350 7915:256 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35766ms total) +T2350 7915:260 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35762ms total) +T2350 7915:260 JLINK_ClrBPEx(BPHandle = 0x0000003D) returns 0x00 (0000ms, 35762ms total) +T2350 7915:260 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35762ms total) +T2350 7915:261 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: F0 F1 00 FB 11 40 80 BB 9D F8 00 70 9D F8 01 00 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0002ms, 35764ms total) +T2350 7915:263 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 14 10 04 4A 52 F8 24 00 04 F0 44 FD 10 BD 00 00 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35766ms total) +T2350 7915:265 JLINK_WriteReg(R0, 0x08001800) returns 0x00 (0000ms, 35766ms total) +T2350 7915:265 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35766ms total) +T2350 7915:265 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35766ms total) +T2350 7915:265 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35766ms total) +T2350 7915:265 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35766ms total) +T2350 7915:265 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35766ms total) +T2350 7915:265 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35766ms total) +T2350 7915:265 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35766ms total) +T2350 7915:265 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35766ms total) +T2350 7915:265 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35766ms total) +T2350 7915:265 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0001ms, 35767ms total) +T2350 7915:266 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35767ms total) +T2350 7915:266 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35767ms total) +T2350 7915:266 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35767ms total) +T2350 7915:266 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35767ms total) +T2350 7915:266 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35767ms total) +T2350 7915:266 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35767ms total) +T2350 7915:266 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35767ms total) +T2350 7915:266 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35767ms total) +T2350 7915:266 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35767ms total) +T2350 7915:266 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000003E (0000ms, 35767ms total) +T2350 7915:266 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0003ms, 35770ms total) +T2350 7915:269 JLINK_IsHalted() returns FALSE (0002ms, 35772ms total) +T2350 7915:273 JLINK_IsHalted() returns FALSE (0001ms, 35771ms total) +T2350 7915:275 JLINK_IsHalted() returns FALSE (0002ms, 35772ms total) +T2350 7915:280 JLINK_IsHalted() returns FALSE (0001ms, 35771ms total) +T2350 7915:282 JLINK_IsHalted() returns FALSE (0001ms, 35771ms total) +T2350 7915:284 JLINK_IsHalted() returns FALSE (0001ms, 35771ms total) +T2350 7915:286 JLINK_IsHalted() returns FALSE (0001ms, 35771ms total) +T2350 7915:288 JLINK_IsHalted() returns FALSE (0001ms, 35771ms total) +T2350 7915:290 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35774ms total) +T2350 7915:294 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35770ms total) +T2350 7915:294 JLINK_ClrBPEx(BPHandle = 0x0000003E) returns 0x00 (0000ms, 35770ms total) +T2350 7915:294 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35770ms total) +T2350 7915:294 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 75 F8 70 BD 2D E9 F0 41 04 46 0E 46 15 46 1F 46 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35773ms total) +T2350 7915:297 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 7C BD 01 2C 14 D1 0F 48 07 F0 EE F8 9D F8 00 10 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R0, 0x08001C00) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35775ms total) +T2350 7915:299 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000003F (0000ms, 35775ms total) +T2350 7915:299 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35779ms total) +T2350 7915:303 JLINK_IsHalted() returns FALSE (0001ms, 35780ms total) +T2350 7915:305 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:306 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:307 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:308 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:309 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:310 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:311 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:312 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:313 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:314 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:315 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:316 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:317 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:318 JLINK_IsHalted() returns FALSE (0000ms, 35779ms total) +T2350 7915:319 JLINK_IsHalted() returns FALSE (0001ms, 35780ms total) +T2350 7915:321 JLINK_IsHalted() returns FALSE (0001ms, 35780ms total) +T2350 7915:323 JLINK_IsHalted() returns FALSE (0001ms, 35780ms total) +T2350 7915:325 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35783ms total) +T2350 7915:329 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35779ms total) +T2350 7915:329 JLINK_ClrBPEx(BPHandle = 0x0000003F) returns 0x00 (0000ms, 35779ms total) +T2350 7915:329 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35779ms total) +T2350 7915:330 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 00 BF 00 BF 32 46 29 46 20 46 00 F0 0B F8 80 46 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0004ms, 35783ms total) +T2350 7915:334 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: DD E9 16 10 08 44 17 90 17 98 19 B0 BD E8 F0 8F ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R0, 0x08002000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35785ms total) +T2350 7915:336 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000040 (0000ms, 35785ms total) +T2350 7915:337 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35790ms total) +T2350 7915:341 JLINK_IsHalted() returns FALSE (0001ms, 35791ms total) +T2350 7915:348 JLINK_IsHalted() returns FALSE (0001ms, 35791ms total) +T2350 7915:350 JLINK_IsHalted() returns FALSE (0001ms, 35791ms total) +T2350 7915:352 JLINK_IsHalted() returns FALSE (0001ms, 35791ms total) +T2350 7915:363 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35794ms total) +T2350 7915:367 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35790ms total) +T2350 7915:367 JLINK_ClrBPEx(BPHandle = 0x00000040) returns 0x00 (0000ms, 35790ms total) +T2350 7915:367 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35790ms total) +T2350 7915:369 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 20 68 00 EB 09 01 01 AA 02 A8 FE F7 34 F8 05 46 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35793ms total) +T2350 7915:372 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: DE 20 8D F8 0A 00 7F 20 8D F8 0B 00 01 20 8D F8 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0003ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R0, 0x08002400) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35796ms total) +T2350 7915:375 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000041 (0000ms, 35796ms total) +T2350 7915:375 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35801ms total) +T2350 7915:380 JLINK_IsHalted() returns FALSE (0001ms, 35802ms total) +T2350 7915:382 JLINK_IsHalted() returns FALSE (0001ms, 35802ms total) +T2350 7915:384 JLINK_IsHalted() returns FALSE (0001ms, 35802ms total) +T2350 7915:386 JLINK_IsHalted() returns FALSE (0001ms, 35802ms total) +T2350 7915:393 JLINK_IsHalted() returns FALSE (0001ms, 35802ms total) +T2350 7915:395 JLINK_IsHalted() returns FALSE (0001ms, 35802ms total) +T2350 7915:397 JLINK_IsHalted() returns FALSE (0001ms, 35802ms total) +T2350 7915:399 JLINK_IsHalted() returns FALSE (0001ms, 35802ms total) +T2350 7915:401 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35805ms total) +T2350 7915:405 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35801ms total) +T2350 7915:405 JLINK_ClrBPEx(BPHandle = 0x00000041) returns 0x00 (0000ms, 35801ms total) +T2350 7915:405 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35801ms total) +T2350 7915:405 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: C0 F8 84 40 C4 F3 8F 20 04 49 88 80 08 46 B0 F8 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0004ms, 35805ms total) +T2350 7915:409 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 29 49 81 F8 4A 00 48 21 27 48 80 F8 4B 10 DE 21 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R0, 0x08002800) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35807ms total) +T2350 7915:411 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0001ms, 35808ms total) +T2350 7915:412 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000042 (0000ms, 35808ms total) +T2350 7915:412 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35812ms total) +T2350 7915:416 JLINK_IsHalted() returns FALSE (0001ms, 35813ms total) +T2350 7915:418 JLINK_IsHalted() returns FALSE (0001ms, 35813ms total) +T2350 7915:420 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:421 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:422 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:423 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:424 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:425 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:426 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:427 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:428 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:429 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:430 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:431 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:432 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:433 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:434 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:435 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:436 JLINK_IsHalted() returns FALSE (0000ms, 35812ms total) +T2350 7915:437 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35815ms total) +T2350 7915:440 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35812ms total) +T2350 7915:440 JLINK_ClrBPEx(BPHandle = 0x00000042) returns 0x00 (0000ms, 35812ms total) +T2350 7915:441 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35812ms total) +T2350 7915:441 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: FF F7 D0 FE A0 48 00 88 40 1C 9F 49 08 80 08 46 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35815ms total) +T2350 7915:444 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: E1 B2 04 48 32 46 43 6A 28 46 98 47 01 20 70 BD ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R0, 0x08002C00) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35817ms total) +T2350 7915:447 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000043 (0000ms, 35817ms total) +T2350 7915:447 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35822ms total) +T2350 7915:452 JLINK_IsHalted() returns FALSE (0001ms, 35823ms total) +T2350 7915:454 JLINK_IsHalted() returns FALSE (0001ms, 35823ms total) +T2350 7915:456 JLINK_IsHalted() returns FALSE (0000ms, 35822ms total) +T2350 7915:457 JLINK_IsHalted() returns FALSE (0000ms, 35822ms total) +T2350 7915:458 JLINK_IsHalted() returns FALSE (0001ms, 35823ms total) +T2350 7915:460 JLINK_IsHalted() returns FALSE (0001ms, 35823ms total) +T2350 7915:462 JLINK_IsHalted() returns FALSE (0001ms, 35823ms total) +T2350 7915:469 JLINK_IsHalted() returns FALSE (0001ms, 35823ms total) +T2350 7915:471 JLINK_IsHalted() returns FALSE (0001ms, 35823ms total) +T2350 7915:473 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35826ms total) +T2350 7915:477 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35822ms total) +T2350 7915:477 JLINK_ClrBPEx(BPHandle = 0x00000043) returns 0x00 (0000ms, 35822ms total) +T2350 7915:477 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35822ms total) +T2350 7915:479 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 84 00 28 28 00 D1 F1 E0 7C 48 90 F8 84 00 33 28 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35825ms total) +T2350 7915:482 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 2F 49 10 22 0B 6A 0D F1 12 01 98 47 12 25 0F E0 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35827ms total) +T2350 7915:484 JLINK_WriteReg(R0, 0x08003000) returns 0x00 (0000ms, 35827ms total) +T2350 7915:484 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0001ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35828ms total) +T2350 7915:485 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000044 (0000ms, 35828ms total) +T2350 7915:485 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35833ms total) +T2350 7915:490 JLINK_IsHalted() returns FALSE (0001ms, 35834ms total) +T2350 7915:492 JLINK_IsHalted() returns FALSE (0001ms, 35834ms total) +T2350 7915:501 JLINK_IsHalted() returns FALSE (0001ms, 35834ms total) +T2350 7915:503 JLINK_IsHalted() returns FALSE (0001ms, 35834ms total) +T2350 7915:505 JLINK_IsHalted() returns FALSE (0001ms, 35834ms total) +T2350 7915:507 JLINK_IsHalted() returns FALSE (0000ms, 35833ms total) +T2350 7915:508 JLINK_IsHalted() returns FALSE (0000ms, 35833ms total) +T2350 7915:509 JLINK_IsHalted() returns FALSE (0000ms, 35833ms total) +T2350 7915:511 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35837ms total) +T2350 7915:515 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35833ms total) +T2350 7915:516 JLINK_ClrBPEx(BPHandle = 0x00000044) returns 0x00 (0000ms, 35834ms total) +T2350 7915:516 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35834ms total) +T2350 7915:517 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 00 00 00 00 E0 69 00 20 E0 79 00 20 52 54 54 00 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35837ms total) +T2350 7915:520 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: F0 47 04 46 89 46 15 46 E6 68 A0 68 87 1B AF 42 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35839ms total) +T2350 7915:522 JLINK_WriteReg(R0, 0x08003400) returns 0x00 (0000ms, 35839ms total) +T2350 7915:522 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35839ms total) +T2350 7915:522 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35839ms total) +T2350 7915:522 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35839ms total) +T2350 7915:522 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35839ms total) +T2350 7915:522 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35839ms total) +T2350 7915:522 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35839ms total) +T2350 7915:522 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0001ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35840ms total) +T2350 7915:523 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000045 (0000ms, 35840ms total) +T2350 7915:523 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35845ms total) +T2350 7915:528 JLINK_IsHalted() returns FALSE (0001ms, 35846ms total) +T2350 7915:530 JLINK_IsHalted() returns FALSE (0001ms, 35846ms total) +T2350 7915:532 JLINK_IsHalted() returns FALSE (0001ms, 35846ms total) +T2350 7915:534 JLINK_IsHalted() returns FALSE (0001ms, 35846ms total) +T2350 7915:536 JLINK_IsHalted() returns FALSE (0001ms, 35846ms total) +T2350 7915:538 JLINK_IsHalted() returns FALSE (0001ms, 35846ms total) +T2350 7915:540 JLINK_IsHalted() returns FALSE (0000ms, 35845ms total) +T2350 7915:541 JLINK_IsHalted() returns FALSE (0001ms, 35846ms total) +T2350 7915:543 JLINK_IsHalted() returns FALSE (0001ms, 35846ms total) +T2350 7915:545 JLINK_IsHalted() returns FALSE (0000ms, 35845ms total) +T2350 7915:546 JLINK_IsHalted() returns FALSE (0000ms, 35845ms total) +T2350 7915:547 JLINK_IsHalted() returns FALSE (0001ms, 35846ms total) +T2350 7915:549 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35849ms total) +T2350 7915:553 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35845ms total) +T2350 7915:553 JLINK_ClrBPEx(BPHandle = 0x00000045) returns 0x00 (0000ms, 35845ms total) +T2350 7915:553 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35845ms total) +T2350 7915:554 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 10 B5 00 24 2C E0 04 EB C4 01 01 EB 04 11 16 4A ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35848ms total) +T2350 7915:557 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 53 F8 A4 0F 40 68 80 78 1C 68 64 68 E4 78 40 EA ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R0, 0x08003800) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35850ms total) +T2350 7915:559 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0001ms, 35851ms total) +T2350 7915:560 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35851ms total) +T2350 7915:560 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35851ms total) +T2350 7915:560 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35851ms total) +T2350 7915:560 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35851ms total) +T2350 7915:560 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000046 (0000ms, 35851ms total) +T2350 7915:560 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35855ms total) +T2350 7915:564 JLINK_IsHalted() returns FALSE (0001ms, 35856ms total) +T2350 7915:566 JLINK_IsHalted() returns FALSE (0000ms, 35855ms total) +T2350 7915:567 JLINK_IsHalted() returns FALSE (0000ms, 35855ms total) +T2350 7915:568 JLINK_IsHalted() returns FALSE (0000ms, 35855ms total) +T2350 7915:569 JLINK_IsHalted() returns FALSE (0000ms, 35855ms total) +T2350 7915:570 JLINK_IsHalted() returns FALSE (0000ms, 35855ms total) +T2350 7915:571 JLINK_IsHalted() returns FALSE (0000ms, 35855ms total) +T2350 7915:577 JLINK_IsHalted() returns FALSE (0001ms, 35856ms total) +T2350 7915:579 JLINK_IsHalted() returns FALSE (0001ms, 35856ms total) +T2350 7915:581 JLINK_IsHalted() returns FALSE (0001ms, 35856ms total) +T2350 7915:583 JLINK_IsHalted() returns FALSE (0000ms, 35855ms total) +T2350 7915:584 JLINK_IsHalted() returns FALSE (0000ms, 35855ms total) +T2350 7915:585 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35859ms total) +T2350 7915:589 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35855ms total) +T2350 7915:589 JLINK_ClrBPEx(BPHandle = 0x00000046) returns 0x00 (0000ms, 35855ms total) +T2350 7915:589 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35855ms total) +T2350 7915:589 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: B8 FB 14 E0 E0 7A 00 F0 80 00 48 B1 00 BF 4C 20 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0004ms, 35859ms total) +T2350 7915:593 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 81 00 80 78 0D 49 08 70 08 E0 05 EB 45 01 04 F1 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R0, 0x08003C00) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35861ms total) +T2350 7915:595 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0001ms, 35862ms total) +T2350 7915:596 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000047 (0000ms, 35862ms total) +T2350 7915:596 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35866ms total) +T2350 7915:600 JLINK_IsHalted() returns FALSE (0001ms, 35867ms total) +T2350 7915:602 JLINK_IsHalted() returns FALSE (0000ms, 35866ms total) +T2350 7915:613 JLINK_IsHalted() returns FALSE (0001ms, 35867ms total) +T2350 7915:615 JLINK_IsHalted() returns FALSE (0001ms, 35867ms total) +T2350 7915:617 JLINK_IsHalted() returns FALSE (0000ms, 35866ms total) +T2350 7915:618 JLINK_IsHalted() returns FALSE (0001ms, 35867ms total) +T2350 7915:620 JLINK_IsHalted() returns FALSE (0001ms, 35867ms total) +T2350 7915:622 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35870ms total) +T2350 7915:626 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35866ms total) +T2350 7915:626 JLINK_ClrBPEx(BPHandle = 0x00000047) returns 0x00 (0000ms, 35866ms total) +T2350 7915:626 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35866ms total) +T2350 7915:627 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 02 D0 03 28 09 D1 00 E0 00 BF 68 88 01 28 03 D1 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35869ms total) +T2350 7915:630 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 70 47 01 20 FC E7 00 00 A8 03 00 20 11 48 90 F8 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35871ms total) +T2350 7915:632 JLINK_WriteReg(R0, 0x08004000) returns 0x00 (0000ms, 35871ms total) +T2350 7915:632 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35871ms total) +T2350 7915:632 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35871ms total) +T2350 7915:632 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35871ms total) +T2350 7915:632 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35871ms total) +T2350 7915:632 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35871ms total) +T2350 7915:632 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35871ms total) +T2350 7915:632 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35871ms total) +T2350 7915:632 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35871ms total) +T2350 7915:632 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0001ms, 35872ms total) +T2350 7915:633 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35872ms total) +T2350 7915:633 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35872ms total) +T2350 7915:633 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35872ms total) +T2350 7915:633 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35872ms total) +T2350 7915:633 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35872ms total) +T2350 7915:633 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35872ms total) +T2350 7915:633 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35872ms total) +T2350 7915:633 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35872ms total) +T2350 7915:633 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35872ms total) +T2350 7915:633 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35872ms total) +T2350 7915:633 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000048 (0000ms, 35872ms total) +T2350 7915:633 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35876ms total) +T2350 7915:637 JLINK_IsHalted() returns FALSE (0001ms, 35877ms total) +T2350 7915:639 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:640 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:641 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:642 JLINK_IsHalted() returns FALSE (0001ms, 35877ms total) +T2350 7915:644 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:645 JLINK_IsHalted() returns FALSE (0001ms, 35877ms total) +T2350 7915:647 JLINK_IsHalted() returns FALSE (0001ms, 35877ms total) +T2350 7915:649 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:650 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:651 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:652 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:653 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:654 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:655 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:656 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:657 JLINK_IsHalted() returns FALSE (0000ms, 35876ms total) +T2350 7915:658 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35879ms total) +T2350 7915:661 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35876ms total) +T2350 7915:661 JLINK_ClrBPEx(BPHandle = 0x00000048) returns 0x00 (0000ms, 35876ms total) +T2350 7915:661 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35876ms total) +T2350 7915:662 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 81 6B 01 20 88 47 00 BF CF E7 00 00 FC 03 00 20 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35879ms total) +T2350 7915:665 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 8D F8 1D 00 8D F8 1E 00 1A 21 0D F1 05 00 01 F0 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R0, 0x08004400) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35881ms total) +T2350 7915:667 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0001ms, 35882ms total) +T2350 7915:668 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35882ms total) +T2350 7915:668 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000049 (0000ms, 35882ms total) +T2350 7915:668 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35886ms total) +T2350 7915:672 JLINK_IsHalted() returns FALSE (0001ms, 35887ms total) +T2350 7915:674 JLINK_IsHalted() returns FALSE (0001ms, 35887ms total) +T2350 7915:676 JLINK_IsHalted() returns FALSE (0001ms, 35887ms total) +T2350 7915:678 JLINK_IsHalted() returns FALSE (0001ms, 35887ms total) +T2350 7915:680 JLINK_IsHalted() returns FALSE (0000ms, 35886ms total) +T2350 7915:681 JLINK_IsHalted() returns FALSE (0001ms, 35887ms total) +T2350 7915:688 JLINK_IsHalted() returns FALSE (0001ms, 35887ms total) +T2350 7915:690 JLINK_IsHalted() returns FALSE (0001ms, 35887ms total) +T2350 7915:692 JLINK_IsHalted() returns FALSE (0001ms, 35887ms total) +T2350 7915:694 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35890ms total) +T2350 7915:698 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35886ms total) +T2350 7915:698 JLINK_ClrBPEx(BPHandle = 0x00000049) returns 0x00 (0000ms, 35886ms total) +T2350 7915:698 JLINK_ReadReg(R0) returns 0x00000000 (0001ms, 35887ms total) +T2350 7915:699 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 62 E0 00 24 17 E0 05 EB 45 02 C2 EB 85 13 33 4A ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0004ms, 35891ms total) +T2350 7915:703 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 01 00 60 28 03 D1 68 46 03 F0 72 F8 0A E0 9D F8 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R0, 0x08004800) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35893ms total) +T2350 7915:705 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000004A (0000ms, 35893ms total) +T2350 7915:705 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35898ms total) +T2350 7915:710 JLINK_IsHalted() returns FALSE (0001ms, 35899ms total) +T2350 7915:712 JLINK_IsHalted() returns FALSE (0001ms, 35899ms total) +T2350 7915:719 JLINK_IsHalted() returns FALSE (0001ms, 35899ms total) +T2350 7915:721 JLINK_IsHalted() returns FALSE (0001ms, 35899ms total) +T2350 7915:723 JLINK_IsHalted() returns FALSE (0001ms, 35899ms total) +T2350 7915:725 JLINK_IsHalted() returns FALSE (0000ms, 35898ms total) +T2350 7915:726 JLINK_IsHalted() returns FALSE (0001ms, 35899ms total) +T2350 7915:728 JLINK_IsHalted() returns FALSE (0000ms, 35898ms total) +T2350 7915:729 JLINK_IsHalted() returns FALSE (0001ms, 35899ms total) +T2350 7915:731 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35902ms total) +T2350 7915:735 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35898ms total) +T2350 7915:735 JLINK_ClrBPEx(BPHandle = 0x0000004A) returns 0x00 (0000ms, 35898ms total) +T2350 7915:735 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35898ms total) +T2350 7915:736 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 88 71 00 BF FF F7 52 FB FF F7 18 FB 0D 22 69 46 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35901ms total) +T2350 7915:739 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 03 D0 01 F0 FD F9 05 28 05 D1 9D F8 11 00 40 F0 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35903ms total) +T2350 7915:741 JLINK_WriteReg(R0, 0x08004C00) returns 0x00 (0000ms, 35903ms total) +T2350 7915:741 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35903ms total) +T2350 7915:741 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35903ms total) +T2350 7915:741 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35903ms total) +T2350 7915:741 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35903ms total) +T2350 7915:741 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35903ms total) +T2350 7915:741 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35903ms total) +T2350 7915:741 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0001ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35904ms total) +T2350 7915:742 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000004B (0000ms, 35904ms total) +T2350 7915:742 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35909ms total) +T2350 7915:747 JLINK_IsHalted() returns FALSE (0001ms, 35910ms total) +T2350 7915:749 JLINK_IsHalted() returns FALSE (0001ms, 35910ms total) +T2350 7915:751 JLINK_IsHalted() returns FALSE (0001ms, 35910ms total) +T2350 7915:753 JLINK_IsHalted() returns FALSE (0000ms, 35909ms total) +T2350 7915:754 JLINK_IsHalted() returns FALSE (0001ms, 35910ms total) +T2350 7915:756 JLINK_IsHalted() returns FALSE (0000ms, 35909ms total) +T2350 7915:757 JLINK_IsHalted() returns FALSE (0001ms, 35910ms total) +T2350 7915:759 JLINK_IsHalted() returns FALSE (0000ms, 35909ms total) +T2350 7915:760 JLINK_IsHalted() returns FALSE (0001ms, 35910ms total) +T2350 7915:762 JLINK_IsHalted() returns FALSE (0000ms, 35909ms total) +T2350 7915:763 JLINK_IsHalted() returns FALSE (0001ms, 35910ms total) +T2350 7915:765 JLINK_IsHalted() returns FALSE (0001ms, 35910ms total) +T2350 7915:767 JLINK_IsHalted() returns FALSE (0000ms, 35909ms total) +T2350 7915:768 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35912ms total) +T2350 7915:771 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35909ms total) +T2350 7915:771 JLINK_ClrBPEx(BPHandle = 0x0000004B) returns 0x00 (0000ms, 35909ms total) +T2350 7915:771 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35909ms total) +T2350 7915:772 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: C1 06 00 20 BB 03 00 20 58 20 00 20 4C 20 00 20 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0004ms, 35913ms total) +T2350 7915:776 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 30 B5 91 B0 05 46 0C 46 28 78 40 1C C2 B2 69 46 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R0, 0x08005000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35915ms total) +T2350 7915:778 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000004C (0000ms, 35915ms total) +T2350 7915:778 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35920ms total) +T2350 7915:783 JLINK_IsHalted() returns FALSE (0001ms, 35921ms total) +T2350 7915:785 JLINK_IsHalted() returns FALSE (0001ms, 35921ms total) +T2350 7915:787 JLINK_IsHalted() returns FALSE (0001ms, 35921ms total) +T2350 7915:789 JLINK_IsHalted() returns FALSE (0000ms, 35920ms total) +T2350 7915:795 JLINK_IsHalted() returns FALSE (0001ms, 35921ms total) +T2350 7915:797 JLINK_IsHalted() returns FALSE (0001ms, 35921ms total) +T2350 7915:799 JLINK_IsHalted() returns FALSE (0000ms, 35920ms total) +T2350 7915:800 JLINK_IsHalted() returns FALSE (0001ms, 35921ms total) +T2350 7915:802 JLINK_IsHalted() returns FALSE (0000ms, 35920ms total) +T2350 7915:803 JLINK_IsHalted() returns FALSE (0000ms, 35920ms total) +T2350 7915:804 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35923ms total) +T2350 7915:807 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35920ms total) +T2350 7915:807 JLINK_ClrBPEx(BPHandle = 0x0000004C) returns 0x00 (0000ms, 35920ms total) +T2350 7915:807 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35920ms total) +T2350 7915:808 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 0A 00 6B 48 00 7A 8D F8 0B 00 1A 22 03 A9 69 48 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0004ms, 35924ms total) +T2350 7915:812 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: F9 E7 9D F8 06 00 01 28 00 D0 F4 E7 9D F8 07 00 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R0, 0x08005400) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35926ms total) +T2350 7915:814 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000004D (0000ms, 35926ms total) +T2350 7915:814 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35931ms total) +T2350 7915:819 JLINK_IsHalted() returns FALSE (0001ms, 35932ms total) +T2350 7915:821 JLINK_IsHalted() returns FALSE (0001ms, 35932ms total) +T2350 7915:823 JLINK_IsHalted() returns FALSE (0001ms, 35932ms total) +T2350 7915:825 JLINK_IsHalted() returns FALSE (0001ms, 35932ms total) +T2350 7915:832 JLINK_IsHalted() returns FALSE (0001ms, 35932ms total) +T2350 7915:834 JLINK_IsHalted() returns FALSE (0001ms, 35932ms total) +T2350 7915:836 JLINK_IsHalted() returns FALSE (0000ms, 35931ms total) +T2350 7915:837 JLINK_IsHalted() returns FALSE (0000ms, 35931ms total) +T2350 7915:838 JLINK_IsHalted() returns FALSE (0001ms, 35932ms total) +T2350 7915:840 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35935ms total) +T2350 7915:844 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35931ms total) +T2350 7915:844 JLINK_ClrBPEx(BPHandle = 0x0000004D) returns 0x00 (0000ms, 35931ms total) +T2350 7915:844 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35931ms total) +T2350 7915:844 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 01 90 01 26 E0 78 0B 28 04 D0 0C 28 08 D0 0D 28 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35934ms total) +T2350 7915:847 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 40 7A 88 42 F3 DC FF 20 F6 E7 00 00 58 20 00 20 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35936ms total) +T2350 7915:849 JLINK_WriteReg(R0, 0x08005800) returns 0x00 (0000ms, 35936ms total) +T2350 7915:849 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35936ms total) +T2350 7915:849 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35936ms total) +T2350 7915:849 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0001ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35937ms total) +T2350 7915:850 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000004E (0000ms, 35937ms total) +T2350 7915:850 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35942ms total) +T2350 7915:855 JLINK_IsHalted() returns FALSE (0001ms, 35943ms total) +T2350 7915:857 JLINK_IsHalted() returns FALSE (0001ms, 35943ms total) +T2350 7915:859 JLINK_IsHalted() returns FALSE (0001ms, 35943ms total) +T2350 7915:861 JLINK_IsHalted() returns FALSE (0001ms, 35943ms total) +T2350 7915:863 JLINK_IsHalted() returns FALSE (0001ms, 35943ms total) +T2350 7915:865 JLINK_IsHalted() returns FALSE (0001ms, 35943ms total) +T2350 7915:867 JLINK_IsHalted() returns FALSE (0001ms, 35943ms total) +T2350 7915:869 JLINK_IsHalted() returns FALSE (0001ms, 35943ms total) +T2350 7915:871 JLINK_IsHalted() returns FALSE (0000ms, 35942ms total) +T2350 7915:872 JLINK_IsHalted() returns FALSE (0000ms, 35942ms total) +T2350 7915:873 JLINK_IsHalted() returns FALSE (0000ms, 35942ms total) +T2350 7915:874 JLINK_IsHalted() returns FALSE (0000ms, 35942ms total) +T2350 7915:875 JLINK_IsHalted() returns FALSE (0000ms, 35942ms total) +T2350 7915:876 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35945ms total) +T2350 7915:879 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35942ms total) +T2350 7915:879 JLINK_ClrBPEx(BPHandle = 0x0000004E) returns 0x00 (0000ms, 35942ms total) +T2350 7915:879 JLINK_ReadReg(R0) returns 0x00000000 (0001ms, 35943ms total) +T2350 7915:880 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: C5 B2 04 2D F1 D3 00 20 70 BD 00 00 70 06 00 20 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35946ms total) +T2350 7915:883 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 69 46 01 A8 FB F7 9E FA 04 46 14 B9 9D F8 00 00 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35948ms total) +T2350 7915:885 JLINK_WriteReg(R0, 0x08005C00) returns 0x00 (0000ms, 35948ms total) +T2350 7915:885 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35948ms total) +T2350 7915:885 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35948ms total) +T2350 7915:885 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35948ms total) +T2350 7915:885 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35948ms total) +T2350 7915:885 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35948ms total) +T2350 7915:885 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35948ms total) +T2350 7915:885 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35948ms total) +T2350 7915:885 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0001ms, 35949ms total) +T2350 7915:886 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35949ms total) +T2350 7915:886 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35949ms total) +T2350 7915:886 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35949ms total) +T2350 7915:886 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35949ms total) +T2350 7915:886 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35949ms total) +T2350 7915:886 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35949ms total) +T2350 7915:886 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35949ms total) +T2350 7915:886 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35949ms total) +T2350 7915:886 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35949ms total) +T2350 7915:886 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35949ms total) +T2350 7915:886 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35949ms total) +T2350 7915:886 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000004F (0000ms, 35949ms total) +T2350 7915:886 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35954ms total) +T2350 7915:891 JLINK_IsHalted() returns FALSE (0001ms, 35955ms total) +T2350 7915:893 JLINK_IsHalted() returns FALSE (0001ms, 35955ms total) +T2350 7915:895 JLINK_IsHalted() returns FALSE (0001ms, 35955ms total) +T2350 7915:897 JLINK_IsHalted() returns FALSE (0001ms, 35955ms total) +T2350 7915:904 JLINK_IsHalted() returns FALSE (0001ms, 35955ms total) +T2350 7915:906 JLINK_IsHalted() returns FALSE (0001ms, 35955ms total) +T2350 7915:908 JLINK_IsHalted() returns FALSE (0000ms, 35954ms total) +T2350 7915:909 JLINK_IsHalted() returns FALSE (0000ms, 35954ms total) +T2350 7915:910 JLINK_IsHalted() returns FALSE (0000ms, 35954ms total) +T2350 7915:911 JLINK_IsHalted() returns FALSE (0000ms, 35954ms total) +T2350 7915:912 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35957ms total) +T2350 7915:915 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0001ms, 35955ms total) +T2350 7915:916 JLINK_ClrBPEx(BPHandle = 0x0000004F) returns 0x00 (0000ms, 35955ms total) +T2350 7915:916 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35955ms total) +T2350 7915:917 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 00 20 48 70 02 E0 51 20 0D 49 48 70 0D 49 D1 F8 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35958ms total) +T2350 7915:920 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 01 48 40 78 70 47 00 00 B0 17 00 20 01 48 00 79 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R0, 0x08006000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:922 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:923 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:923 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35960ms total) +T2350 7915:923 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000050 (0000ms, 35960ms total) +T2350 7915:923 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35964ms total) +T2350 7915:927 JLINK_IsHalted() returns FALSE (0001ms, 35965ms total) +T2350 7915:929 JLINK_IsHalted() returns FALSE (0000ms, 35964ms total) +T2350 7915:930 JLINK_IsHalted() returns FALSE (0001ms, 35965ms total) +T2350 7915:937 JLINK_IsHalted() returns FALSE (0001ms, 35966ms total) +T2350 7915:939 JLINK_IsHalted() returns FALSE (0001ms, 35966ms total) +T2350 7915:941 JLINK_IsHalted() returns FALSE (0001ms, 35966ms total) +T2350 7915:943 JLINK_IsHalted() returns FALSE (0001ms, 35966ms total) +T2350 7915:945 JLINK_IsHalted() returns FALSE (0000ms, 35965ms total) +T2350 7915:946 JLINK_IsHalted() returns FALSE (0000ms, 35965ms total) +T2350 7915:947 JLINK_IsHalted() returns FALSE (0000ms, 35965ms total) +T2350 7915:948 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35968ms total) +T2350 7915:952 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35965ms total) +T2350 7915:952 JLINK_ClrBPEx(BPHandle = 0x00000050) returns 0x00 (0000ms, 35965ms total) +T2350 7915:952 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35965ms total) +T2350 7915:952 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 58 20 00 20 01 46 01 EB 81 00 40 00 70 47 00 00 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35968ms total) +T2350 7915:956 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 47 FF 05 20 FF F7 BA FF 20 46 70 BD 00 0C 01 40 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R0, 0x08006400) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35970ms total) +T2350 7915:958 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000051 (0000ms, 35970ms total) +T2350 7915:958 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35975ms total) +T2350 7915:963 JLINK_IsHalted() returns FALSE (0001ms, 35976ms total) +T2350 7915:965 JLINK_IsHalted() returns FALSE (0001ms, 35976ms total) +T2350 7915:967 JLINK_IsHalted() returns FALSE (0000ms, 35975ms total) +T2350 7915:968 JLINK_IsHalted() returns FALSE (0001ms, 35976ms total) +T2350 7915:970 JLINK_IsHalted() returns FALSE (0001ms, 35976ms total) +T2350 7915:972 JLINK_IsHalted() returns FALSE (0001ms, 35976ms total) +T2350 7915:974 JLINK_IsHalted() returns FALSE (0002ms, 35977ms total) +T2350 7915:977 JLINK_IsHalted() returns FALSE (0001ms, 35976ms total) +T2350 7915:979 JLINK_IsHalted() returns FALSE (0001ms, 35976ms total) +T2350 7915:981 JLINK_IsHalted() returns FALSE (0001ms, 35976ms total) +T2350 7915:983 JLINK_IsHalted() returns FALSE (0001ms, 35976ms total) +T2350 7915:985 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 35978ms total) +T2350 7915:988 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35975ms total) +T2350 7915:989 JLINK_ClrBPEx(BPHandle = 0x00000051) returns 0x00 (0000ms, 35976ms total) +T2350 7915:989 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35976ms total) +T2350 7915:989 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 00 71 07 48 FF F7 A8 FE 05 20 FF F7 19 FF 4F F4 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0004ms, 35980ms total) +T2350 7915:993 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 28 79 0F 28 02 D1 01 20 8D F8 07 00 28 79 22 28 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R0, 0x08006800) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35982ms total) +T2350 7915:995 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0001ms, 35983ms total) +T2350 7915:996 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35983ms total) +T2350 7915:996 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000052 (0000ms, 35983ms total) +T2350 7915:996 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 35987ms total) +T2350 7916:000 JLINK_IsHalted() returns FALSE (0001ms, 35988ms total) +T2350 7916:002 JLINK_IsHalted() returns FALSE (0000ms, 35987ms total) +T2350 7916:003 JLINK_IsHalted() returns FALSE (0000ms, 35987ms total) +T2350 7916:004 JLINK_IsHalted() returns FALSE (0000ms, 35987ms total) +T2350 7916:005 JLINK_IsHalted() returns FALSE (0000ms, 35987ms total) +T2350 7916:006 JLINK_IsHalted() returns FALSE (0000ms, 35987ms total) +T2350 7916:007 JLINK_IsHalted() returns FALSE (0000ms, 35987ms total) +T2350 7916:008 JLINK_IsHalted() returns FALSE (0000ms, 35987ms total) +T2350 7916:009 JLINK_IsHalted() returns FALSE (0000ms, 35987ms total) +T2350 7916:010 JLINK_IsHalted() returns FALSE (0000ms, 35987ms total) +T2350 7916:011 JLINK_IsHalted() returns FALSE (0000ms, 35987ms total) +T2350 7916:012 JLINK_IsHalted() returns FALSE (0000ms, 35987ms total) +T2350 7916:019 JLINK_IsHalted() returns FALSE (0001ms, 35988ms total) +T2350 7916:021 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 35991ms total) +T2350 7916:025 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35987ms total) +T2350 7916:025 JLINK_ClrBPEx(BPHandle = 0x00000052) returns 0x00 (0001ms, 35988ms total) +T2350 7916:026 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 35988ms total) +T2350 7916:026 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 84 12 25 48 10 44 40 1C 05 EB 45 02 00 EB 42 00 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 35991ms total) +T2350 7916:029 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 10 BD 00 00 30 B5 89 B0 04 46 0D 46 A0 78 0C 28 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 35993ms total) +T2350 7916:031 JLINK_WriteReg(R0, 0x08006C00) returns 0x00 (0001ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 35994ms total) +T2350 7916:032 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000053 (0000ms, 35994ms total) +T2350 7916:032 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 35999ms total) +T2350 7916:037 JLINK_IsHalted() returns FALSE (0001ms, 36000ms total) +T2350 7916:039 JLINK_IsHalted() returns FALSE (0001ms, 36000ms total) +T2350 7916:046 JLINK_IsHalted() returns FALSE (0001ms, 36000ms total) +T2350 7916:048 JLINK_IsHalted() returns FALSE (0001ms, 36000ms total) +T2350 7916:050 JLINK_IsHalted() returns FALSE (0001ms, 36000ms total) +T2350 7916:052 JLINK_IsHalted() returns FALSE (0000ms, 35999ms total) +T2350 7916:053 JLINK_IsHalted() returns FALSE (0000ms, 35999ms total) +T2350 7916:054 JLINK_IsHalted() returns FALSE (0001ms, 36000ms total) +T2350 7916:056 JLINK_IsHalted() returns FALSE (0000ms, 35999ms total) +T2350 7916:057 JLINK_IsHalted() returns FALSE (0000ms, 35999ms total) +T2350 7916:058 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36002ms total) +T2350 7916:061 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 35999ms total) +T2350 7916:061 JLINK_ClrBPEx(BPHandle = 0x00000053) returns 0x00 (0000ms, 35999ms total) +T2350 7916:062 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36000ms total) +T2350 7916:062 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 70 47 70 47 01 F0 5A FA 17 49 18 48 FE F7 04 FE ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36003ms total) +T2350 7916:065 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 80 47 E1 7F 88 42 0A D1 08 48 40 78 FA 28 04 DA ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36005ms total) +T2350 7916:067 JLINK_WriteReg(R0, 0x08007000) returns 0x00 (0000ms, 36005ms total) +T2350 7916:067 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36005ms total) +T2350 7916:067 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36005ms total) +T2350 7916:067 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0001ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36006ms total) +T2350 7916:068 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000054 (0000ms, 36006ms total) +T2350 7916:068 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 36011ms total) +T2350 7916:073 JLINK_IsHalted() returns FALSE (0001ms, 36012ms total) +T2350 7916:075 JLINK_IsHalted() returns FALSE (0001ms, 36012ms total) +T2350 7916:077 JLINK_IsHalted() returns FALSE (0001ms, 36012ms total) +T2350 7916:079 JLINK_IsHalted() returns FALSE (0001ms, 36012ms total) +T2350 7916:081 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:082 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:083 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:084 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:085 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:086 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:087 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:088 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:089 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:090 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:091 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:092 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:093 JLINK_IsHalted() returns FALSE (0000ms, 36011ms total) +T2350 7916:094 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36014ms total) +T2350 7916:097 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36011ms total) +T2350 7916:097 JLINK_ClrBPEx(BPHandle = 0x00000054) returns 0x00 (0000ms, 36011ms total) +T2350 7916:097 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36011ms total) +T2350 7916:098 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: D0 F8 30 04 40 1C 0F 49 D1 F8 28 14 88 42 16 D3 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36014ms total) +T2350 7916:101 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 1A 48 C5 72 28 46 69 1C CD B2 18 49 0C 54 00 E0 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R0, 0x08007400) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36016ms total) +T2350 7916:103 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0001ms, 36017ms total) +T2350 7916:104 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36017ms total) +T2350 7916:104 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000055 (0000ms, 36017ms total) +T2350 7916:104 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 36022ms total) +T2350 7916:109 JLINK_IsHalted() returns FALSE (0001ms, 36023ms total) +T2350 7916:111 JLINK_IsHalted() returns FALSE (0000ms, 36022ms total) +T2350 7916:112 JLINK_IsHalted() returns FALSE (0000ms, 36022ms total) +T2350 7916:113 JLINK_IsHalted() returns FALSE (0000ms, 36022ms total) +T2350 7916:114 JLINK_IsHalted() returns FALSE (0000ms, 36022ms total) +T2350 7916:115 JLINK_IsHalted() returns FALSE (0000ms, 36022ms total) +T2350 7916:116 JLINK_IsHalted() returns FALSE (0000ms, 36022ms total) +T2350 7916:117 JLINK_IsHalted() returns FALSE (0000ms, 36022ms total) +T2350 7916:127 JLINK_IsHalted() returns FALSE (0001ms, 36023ms total) +T2350 7916:129 JLINK_IsHalted() returns FALSE (0001ms, 36023ms total) +T2350 7916:131 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 36026ms total) +T2350 7916:135 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0001ms, 36023ms total) +T2350 7916:136 JLINK_ClrBPEx(BPHandle = 0x00000055) returns 0x00 (0000ms, 36023ms total) +T2350 7916:136 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36023ms total) +T2350 7916:136 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 1C 05 00 20 01 48 40 7D 70 47 00 00 1C 05 00 20 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36026ms total) +T2350 7916:139 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 00 68 00 F4 E0 60 B0 F5 C0 6F 03 D1 01 27 4F F0 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36028ms total) +T2350 7916:141 JLINK_WriteReg(R0, 0x08007800) returns 0x00 (0000ms, 36028ms total) +T2350 7916:141 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36028ms total) +T2350 7916:141 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36028ms total) +T2350 7916:141 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36028ms total) +T2350 7916:141 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0001ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36029ms total) +T2350 7916:142 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000056 (0000ms, 36029ms total) +T2350 7916:142 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 36034ms total) +T2350 7916:147 JLINK_IsHalted() returns FALSE (0001ms, 36035ms total) +T2350 7916:155 JLINK_IsHalted() returns FALSE (0001ms, 36035ms total) +T2350 7916:157 JLINK_IsHalted() returns FALSE (0001ms, 36035ms total) +T2350 7916:159 JLINK_IsHalted() returns FALSE (0001ms, 36035ms total) +T2350 7916:161 JLINK_IsHalted() returns FALSE (0001ms, 36035ms total) +T2350 7916:163 JLINK_IsHalted() returns FALSE (0001ms, 36035ms total) +T2350 7916:165 JLINK_IsHalted() returns FALSE (0001ms, 36035ms total) +T2350 7916:168 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0010ms, 36044ms total) +T2350 7916:178 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36034ms total) +T2350 7916:178 JLINK_ClrBPEx(BPHandle = 0x00000056) returns 0x00 (0000ms, 36034ms total) +T2350 7916:178 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36034ms total) +T2350 7916:178 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 5F 49 01 20 FF F7 B6 FF B7 E0 20 79 5E 49 49 78 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36037ms total) +T2350 7916:181 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 3D 49 88 68 80 47 01 22 01 A9 07 20 FF F7 64 FF ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36039ms total) +T2350 7916:183 JLINK_WriteReg(R0, 0x08007C00) returns 0x00 (0000ms, 36039ms total) +T2350 7916:183 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36039ms total) +T2350 7916:183 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0001ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36040ms total) +T2350 7916:184 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000057 (0000ms, 36040ms total) +T2350 7916:184 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 36045ms total) +T2350 7916:189 JLINK_IsHalted() returns FALSE (0001ms, 36046ms total) +T2350 7916:192 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:193 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:194 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:195 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:196 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:197 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:198 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:199 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:200 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:201 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:202 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:203 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:204 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:205 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:206 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:207 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:208 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:209 JLINK_IsHalted() returns FALSE (0000ms, 36045ms total) +T2350 7916:210 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36048ms total) +T2350 7916:213 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36045ms total) +T2350 7916:213 JLINK_ClrBPEx(BPHandle = 0x00000057) returns 0x00 (0000ms, 36045ms total) +T2350 7916:213 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36045ms total) +T2350 7916:214 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: FE F7 6C F9 FE F7 F0 F9 60 B1 00 24 05 E0 21 46 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36048ms total) +T2350 7916:217 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 0E 46 0A 49 08 68 80 47 20 88 61 88 88 42 03 D1 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R0, 0x08008000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36050ms total) +T2350 7916:219 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000058 (0000ms, 36050ms total) +T2350 7916:219 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36054ms total) +T2350 7916:223 JLINK_IsHalted() returns FALSE (0001ms, 36055ms total) +T2350 7916:225 JLINK_IsHalted() returns FALSE (0001ms, 36055ms total) +T2350 7916:236 JLINK_IsHalted() returns FALSE (0001ms, 36055ms total) +T2350 7916:238 JLINK_IsHalted() returns FALSE (0001ms, 36055ms total) +T2350 7916:240 JLINK_IsHalted() returns FALSE (0000ms, 36054ms total) +T2350 7916:241 JLINK_IsHalted() returns FALSE (0000ms, 36054ms total) +T2350 7916:242 JLINK_IsHalted() returns FALSE (0000ms, 36054ms total) +T2350 7916:244 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 36058ms total) +T2350 7916:248 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0001ms, 36055ms total) +T2350 7916:249 JLINK_ClrBPEx(BPHandle = 0x00000058) returns 0x00 (0000ms, 36055ms total) +T2350 7916:249 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36055ms total) +T2350 7916:250 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 10 01 29 48 40 68 00 F0 80 40 08 B1 41 F0 20 01 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36058ms total) +T2350 7916:253 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: B8 02 00 20 F0 B5 8D B0 05 46 4B 48 90 F8 90 00 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R0, 0x08008400) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36060ms total) +T2350 7916:255 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0001ms, 36061ms total) +T2350 7916:256 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36061ms total) +T2350 7916:256 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36061ms total) +T2350 7916:256 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36061ms total) +T2350 7916:256 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36061ms total) +T2350 7916:256 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36061ms total) +T2350 7916:256 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36061ms total) +T2350 7916:256 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36061ms total) +T2350 7916:256 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000059 (0000ms, 36061ms total) +T2350 7916:256 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36065ms total) +T2350 7916:260 JLINK_IsHalted() returns FALSE (0001ms, 36066ms total) +T2350 7916:268 JLINK_IsHalted() returns FALSE (0001ms, 36066ms total) +T2350 7916:270 JLINK_IsHalted() returns FALSE (0000ms, 36066ms total) +T2350 7916:271 JLINK_IsHalted() returns FALSE (0000ms, 36066ms total) +T2350 7916:272 JLINK_IsHalted() returns FALSE (0000ms, 36066ms total) +T2350 7916:273 JLINK_IsHalted() returns FALSE (0000ms, 36066ms total) +T2350 7916:274 JLINK_IsHalted() returns FALSE (0001ms, 36067ms total) +T2350 7916:276 JLINK_IsHalted() returns FALSE (0000ms, 36066ms total) +T2350 7916:277 JLINK_IsHalted() returns FALSE (0000ms, 36066ms total) +T2350 7916:278 JLINK_IsHalted() returns FALSE (0000ms, 36066ms total) +T2350 7916:279 JLINK_IsHalted() returns FALSE (0000ms, 36066ms total) +T2350 7916:280 JLINK_IsHalted() returns FALSE (0000ms, 36066ms total) +T2350 7916:281 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36069ms total) +T2350 7916:284 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36066ms total) +T2350 7916:285 JLINK_ClrBPEx(BPHandle = 0x00000059) returns 0x00 (0000ms, 36066ms total) +T2350 7916:285 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36066ms total) +T2350 7916:285 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: F0 4A 00 20 F0 B5 89 B0 05 46 45 48 90 F8 90 00 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36069ms total) +T2350 7916:288 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 01 21 02 20 F9 F7 10 F9 22 46 03 21 08 46 F9 F7 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R0, 0x08008800) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36071ms total) +T2350 7916:290 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36071ms total) +T2350 7916:291 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:291 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:291 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:291 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36071ms total) +T2350 7916:291 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000005A (0000ms, 36071ms total) +T2350 7916:291 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36075ms total) +T2350 7916:295 JLINK_IsHalted() returns FALSE (0001ms, 36076ms total) +T2350 7916:297 JLINK_IsHalted() returns FALSE (0000ms, 36075ms total) +T2350 7916:298 JLINK_IsHalted() returns FALSE (0000ms, 36075ms total) +T2350 7916:299 JLINK_IsHalted() returns FALSE (0000ms, 36075ms total) +T2350 7916:300 JLINK_IsHalted() returns FALSE (0000ms, 36075ms total) +T2350 7916:301 JLINK_IsHalted() returns FALSE (0000ms, 36075ms total) +T2350 7916:302 JLINK_IsHalted() returns FALSE (0000ms, 36075ms total) +T2350 7916:303 JLINK_IsHalted() returns FALSE (0000ms, 36075ms total) +T2350 7916:304 JLINK_IsHalted() returns FALSE (0000ms, 36075ms total) +T2350 7916:305 JLINK_IsHalted() returns FALSE (0001ms, 36076ms total) +T2350 7916:307 JLINK_IsHalted() returns FALSE (0001ms, 36076ms total) +T2350 7916:309 JLINK_IsHalted() returns FALSE (0001ms, 36076ms total) +T2350 7916:311 JLINK_IsHalted() returns FALSE (0001ms, 36076ms total) +T2350 7916:313 JLINK_IsHalted() returns FALSE (0000ms, 36075ms total) +T2350 7916:314 JLINK_IsHalted() returns FALSE (0000ms, 36075ms total) +T2350 7916:315 JLINK_IsHalted() returns FALSE (0000ms, 36075ms total) +T2350 7916:316 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36078ms total) +T2350 7916:319 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0001ms, 36076ms total) +T2350 7916:320 JLINK_ClrBPEx(BPHandle = 0x0000005A) returns 0x00 (0000ms, 36076ms total) +T2350 7916:320 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36076ms total) +T2350 7916:320 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 05 48 00 7C 28 B1 21 78 60 1C F9 F7 53 FE 01 20 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36079ms total) +T2350 7916:323 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 01 28 00 D1 F9 E7 0B 48 81 6B 00 20 88 47 08 48 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R0, 0x08008C00) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:325 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:326 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:326 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36081ms total) +T2350 7916:326 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36081ms total) +T2350 7916:326 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:326 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:326 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:326 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36081ms total) +T2350 7916:326 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000005B (0000ms, 36081ms total) +T2350 7916:326 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36085ms total) +T2350 7916:330 JLINK_IsHalted() returns FALSE (0001ms, 36086ms total) +T2350 7916:332 JLINK_IsHalted() returns FALSE (0000ms, 36085ms total) +T2350 7916:333 JLINK_IsHalted() returns FALSE (0000ms, 36085ms total) +T2350 7916:334 JLINK_IsHalted() returns FALSE (0000ms, 36085ms total) +T2350 7916:335 JLINK_IsHalted() returns FALSE (0000ms, 36085ms total) +T2350 7916:336 JLINK_IsHalted() returns FALSE (0000ms, 36085ms total) +T2350 7916:337 JLINK_IsHalted() returns FALSE (0000ms, 36085ms total) +T2350 7916:343 JLINK_IsHalted() returns FALSE (0001ms, 36086ms total) +T2350 7916:345 JLINK_IsHalted() returns FALSE (0001ms, 36086ms total) +T2350 7916:347 JLINK_IsHalted() returns FALSE (0001ms, 36086ms total) +T2350 7916:349 JLINK_IsHalted() returns FALSE (0000ms, 36085ms total) +T2350 7916:350 JLINK_IsHalted() returns FALSE (0000ms, 36085ms total) +T2350 7916:351 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36088ms total) +T2350 7916:354 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36085ms total) +T2350 7916:354 JLINK_ClrBPEx(BPHandle = 0x0000005B) returns 0x00 (0000ms, 36085ms total) +T2350 7916:354 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36085ms total) +T2350 7916:355 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 00 70 00 40 FF FF C3 B7 10 B5 FF F7 77 FF 10 BD ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36088ms total) +T2350 7916:358 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 61 20 00 F0 53 FE 60 79 1E 28 03 D1 20 46 FE F7 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R0, 0x08009000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36090ms total) +T2350 7916:360 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000005C (0001ms, 36091ms total) +T2350 7916:361 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36095ms total) +T2350 7916:365 JLINK_IsHalted() returns FALSE (0001ms, 36096ms total) +T2350 7916:367 JLINK_IsHalted() returns FALSE (0000ms, 36095ms total) +T2350 7916:368 JLINK_IsHalted() returns FALSE (0001ms, 36096ms total) +T2350 7916:374 JLINK_IsHalted() returns FALSE (0001ms, 36096ms total) +T2350 7916:376 JLINK_IsHalted() returns FALSE (0001ms, 36096ms total) +T2350 7916:378 JLINK_IsHalted() returns FALSE (0001ms, 36096ms total) +T2350 7916:380 JLINK_IsHalted() returns FALSE (0000ms, 36095ms total) +T2350 7916:381 JLINK_IsHalted() returns FALSE (0000ms, 36095ms total) +T2350 7916:382 JLINK_IsHalted() returns FALSE (0000ms, 36095ms total) +T2350 7916:383 JLINK_IsHalted() returns FALSE (0000ms, 36095ms total) +T2350 7916:384 JLINK_IsHalted() returns FALSE (0000ms, 36095ms total) +T2350 7916:385 JLINK_IsHalted() returns FALSE (0001ms, 36096ms total) +T2350 7916:387 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 36099ms total) +T2350 7916:391 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36095ms total) +T2350 7916:391 JLINK_ClrBPEx(BPHandle = 0x0000005C) returns 0x00 (0000ms, 36095ms total) +T2350 7916:391 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36095ms total) +T2350 7916:391 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 40 F4 1F 40 01 49 08 60 70 47 00 00 40 5C 00 40 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0004ms, 36099ms total) +T2350 7916:395 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 80 03 D3 F8 00 3C 48 F6 8F 74 A3 43 03 43 0D 4D ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36101ms total) +T2350 7916:397 JLINK_WriteReg(R0, 0x08009400) returns 0x00 (0000ms, 36101ms total) +T2350 7916:397 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36101ms total) +T2350 7916:397 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36101ms total) +T2350 7916:397 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:397 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:397 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:397 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:397 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:397 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36101ms total) +T2350 7916:398 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000005D (0000ms, 36101ms total) +T2350 7916:398 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0006ms, 36107ms total) +T2350 7916:404 JLINK_IsHalted() returns FALSE (0000ms, 36107ms total) +T2350 7916:406 JLINK_IsHalted() returns FALSE (0001ms, 36108ms total) +T2350 7916:408 JLINK_IsHalted() returns FALSE (0002ms, 36109ms total) +T2350 7916:411 JLINK_IsHalted() returns FALSE (0001ms, 36108ms total) +T2350 7916:413 JLINK_IsHalted() returns FALSE (0000ms, 36107ms total) +T2350 7916:414 JLINK_IsHalted() returns FALSE (0001ms, 36108ms total) +T2350 7916:416 JLINK_IsHalted() returns FALSE (0001ms, 36108ms total) +T2350 7916:418 JLINK_IsHalted() returns FALSE (0000ms, 36107ms total) +T2350 7916:419 JLINK_IsHalted() returns FALSE (0000ms, 36107ms total) +T2350 7916:420 JLINK_IsHalted() returns FALSE (0000ms, 36107ms total) +T2350 7916:421 JLINK_IsHalted() returns FALSE (0001ms, 36108ms total) +T2350 7916:423 JLINK_IsHalted() returns FALSE (0001ms, 36108ms total) +T2350 7916:425 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 36111ms total) +T2350 7916:429 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36107ms total) +T2350 7916:429 JLINK_ClrBPEx(BPHandle = 0x0000005D) returns 0x00 (0000ms, 36107ms total) +T2350 7916:429 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36107ms total) +T2350 7916:429 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 09 EB 80 08 C8 F8 00 CC F6 E0 01 2C FC D1 DF F8 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36110ms total) +T2350 7916:432 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 04 EB 80 03 D3 F8 00 3C 4B F6 8F 74 23 40 83 F4 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0003ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R0, 0x08009800) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36113ms total) +T2350 7916:435 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000005E (0000ms, 36113ms total) +T2350 7916:435 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36117ms total) +T2350 7916:439 JLINK_IsHalted() returns FALSE (0001ms, 36118ms total) +T2350 7916:441 JLINK_IsHalted() returns FALSE (0000ms, 36117ms total) +T2350 7916:442 JLINK_IsHalted() returns FALSE (0000ms, 36117ms total) +T2350 7916:443 JLINK_IsHalted() returns FALSE (0000ms, 36117ms total) +T2350 7916:444 JLINK_IsHalted() returns FALSE (0000ms, 36117ms total) +T2350 7916:445 JLINK_IsHalted() returns FALSE (0000ms, 36117ms total) +T2350 7916:448 JLINK_IsHalted() returns FALSE (0001ms, 36118ms total) +T2350 7916:450 JLINK_IsHalted() returns FALSE (0002ms, 36119ms total) +T2350 7916:453 JLINK_IsHalted() returns FALSE (0001ms, 36118ms total) +T2350 7916:455 JLINK_IsHalted() returns FALSE (0001ms, 36118ms total) +T2350 7916:457 JLINK_IsHalted() returns FALSE (0001ms, 36118ms total) +T2350 7916:459 JLINK_IsHalted() returns FALSE (0001ms, 36118ms total) +T2350 7916:461 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 36121ms total) +T2350 7916:465 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36117ms total) +T2350 7916:465 JLINK_ClrBPEx(BPHandle = 0x0000005E) returns 0x00 (0000ms, 36117ms total) +T2350 7916:465 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36117ms total) +T2350 7916:466 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 80 47 D4 F8 A4 10 C9 68 C8 68 FF F7 53 F8 70 BD ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0002ms, 36119ms total) +T2350 7916:468 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 5C 00 00 20 05 48 00 68 20 F0 04 00 03 49 08 60 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36121ms total) +T2350 7916:470 JLINK_WriteReg(R0, 0x08009C00) returns 0x00 (0000ms, 36121ms total) +T2350 7916:470 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36121ms total) +T2350 7916:470 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36121ms total) +T2350 7916:470 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36121ms total) +T2350 7916:470 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36121ms total) +T2350 7916:470 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36121ms total) +T2350 7916:470 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36121ms total) +T2350 7916:470 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36121ms total) +T2350 7916:470 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36121ms total) +T2350 7916:470 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0001ms, 36122ms total) +T2350 7916:471 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36122ms total) +T2350 7916:471 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36122ms total) +T2350 7916:471 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36122ms total) +T2350 7916:471 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36122ms total) +T2350 7916:471 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36122ms total) +T2350 7916:471 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36122ms total) +T2350 7916:471 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36122ms total) +T2350 7916:471 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36122ms total) +T2350 7916:471 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36122ms total) +T2350 7916:471 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36122ms total) +T2350 7916:471 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000005F (0000ms, 36122ms total) +T2350 7916:471 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36126ms total) +T2350 7916:475 JLINK_IsHalted() returns FALSE (0001ms, 36127ms total) +T2350 7916:477 JLINK_IsHalted() returns FALSE (0000ms, 36126ms total) +T2350 7916:478 JLINK_IsHalted() returns FALSE (0000ms, 36126ms total) +T2350 7916:484 JLINK_IsHalted() returns FALSE (0001ms, 36127ms total) +T2350 7916:486 JLINK_IsHalted() returns FALSE (0000ms, 36126ms total) +T2350 7916:487 JLINK_IsHalted() returns FALSE (0001ms, 36127ms total) +T2350 7916:489 JLINK_IsHalted() returns FALSE (0001ms, 36127ms total) +T2350 7916:491 JLINK_IsHalted() returns FALSE (0000ms, 36126ms total) +T2350 7916:492 JLINK_IsHalted() returns FALSE (0000ms, 36126ms total) +T2350 7916:493 JLINK_IsHalted() returns FALSE (0000ms, 36126ms total) +T2350 7916:494 JLINK_IsHalted() returns FALSE (0000ms, 36126ms total) +T2350 7916:495 JLINK_IsHalted() returns FALSE (0001ms, 36127ms total) +T2350 7916:497 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36129ms total) +T2350 7916:501 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36126ms total) +T2350 7916:501 JLINK_ClrBPEx(BPHandle = 0x0000005F) returns 0x00 (0000ms, 36126ms total) +T2350 7916:501 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36126ms total) +T2350 7916:502 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 84 10 96 49 08 44 90 F8 41 00 02 28 23 D1 04 EB ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36129ms total) +T2350 7916:505 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 10 B5 0B 48 40 78 90 B1 09 48 00 78 09 28 0E DA ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R0, 0x0800A000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36131ms total) +T2350 7916:507 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000060 (0000ms, 36131ms total) +T2350 7916:507 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 36136ms total) +T2350 7916:512 JLINK_IsHalted() returns FALSE (0001ms, 36137ms total) +T2350 7916:514 JLINK_IsHalted() returns FALSE (0001ms, 36137ms total) +T2350 7916:516 JLINK_IsHalted() returns FALSE (0001ms, 36137ms total) +T2350 7916:518 JLINK_IsHalted() returns FALSE (0001ms, 36137ms total) +T2350 7916:520 JLINK_IsHalted() returns FALSE (0001ms, 36137ms total) +T2350 7916:522 JLINK_IsHalted() returns FALSE (0000ms, 36136ms total) +T2350 7916:523 JLINK_IsHalted() returns FALSE (0000ms, 36136ms total) +T2350 7916:524 JLINK_IsHalted() returns FALSE (0000ms, 36136ms total) +T2350 7916:525 JLINK_IsHalted() returns FALSE (0001ms, 36137ms total) +T2350 7916:527 JLINK_IsHalted() returns FALSE (0000ms, 36136ms total) +T2350 7916:528 JLINK_IsHalted() returns FALSE (0000ms, 36136ms total) +T2350 7916:529 JLINK_IsHalted() returns FALSE (0000ms, 36136ms total) +T2350 7916:530 JLINK_IsHalted() returns FALSE (0001ms, 36137ms total) +T2350 7916:532 JLINK_IsHalted() returns FALSE (0000ms, 36136ms total) +T2350 7916:533 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 36140ms total) +T2350 7916:537 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36136ms total) +T2350 7916:537 JLINK_ClrBPEx(BPHandle = 0x00000060) returns 0x00 (0000ms, 36136ms total) +T2350 7916:537 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36136ms total) +T2350 7916:538 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: FC F7 83 FE 04 EB 44 00 00 EB 84 10 1C 49 08 44 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36139ms total) +T2350 7916:541 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 04 21 40 46 F5 F7 82 FD 60 1C 84 B2 AC 42 E8 DB ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R0, 0x0800A400) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36141ms total) +T2350 7916:543 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000061 (0000ms, 36141ms total) +T2350 7916:543 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 36146ms total) +T2350 7916:548 JLINK_IsHalted() returns FALSE (0001ms, 36147ms total) +T2350 7916:550 JLINK_IsHalted() returns FALSE (0001ms, 36147ms total) +T2350 7916:552 JLINK_IsHalted() returns FALSE (0001ms, 36147ms total) +T2350 7916:554 JLINK_IsHalted() returns FALSE (0000ms, 36146ms total) +T2350 7916:559 JLINK_IsHalted() returns FALSE (0001ms, 36147ms total) +T2350 7916:561 JLINK_IsHalted() returns FALSE (0001ms, 36147ms total) +T2350 7916:563 JLINK_IsHalted() returns FALSE (0000ms, 36146ms total) +T2350 7916:564 JLINK_IsHalted() returns FALSE (0000ms, 36146ms total) +T2350 7916:565 JLINK_IsHalted() returns FALSE (0000ms, 36146ms total) +T2350 7916:566 JLINK_IsHalted() returns FALSE (0000ms, 36146ms total) +T2350 7916:567 JLINK_IsHalted() returns FALSE (0001ms, 36147ms total) +T2350 7916:569 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36149ms total) +T2350 7916:572 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36146ms total) +T2350 7916:572 JLINK_ClrBPEx(BPHandle = 0x00000061) returns 0x00 (0000ms, 36146ms total) +T2350 7916:572 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36146ms total) +T2350 7916:573 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 01 60 60 1C 84 B2 0A 2C EF DB 01 20 E5 E7 00 00 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36150ms total) +T2350 7916:576 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: C6 D2 79 20 9A DB C0 FE 78 CD 5A F4 1F DD A8 33 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R0, 0x0800A800) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36152ms total) +T2350 7916:578 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0001ms, 36153ms total) +T2350 7916:579 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36153ms total) +T2350 7916:579 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36153ms total) +T2350 7916:579 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36153ms total) +T2350 7916:579 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36153ms total) +T2350 7916:579 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000062 (0000ms, 36153ms total) +T2350 7916:579 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36157ms total) +T2350 7916:583 JLINK_IsHalted() returns FALSE (0001ms, 36158ms total) +T2350 7916:585 JLINK_IsHalted() returns FALSE (0000ms, 36157ms total) +T2350 7916:590 JLINK_IsHalted() returns FALSE (0001ms, 36158ms total) +T2350 7916:592 JLINK_IsHalted() returns FALSE (0001ms, 36158ms total) +T2350 7916:594 JLINK_IsHalted() returns FALSE (0001ms, 36158ms total) +T2350 7916:596 JLINK_IsHalted() returns FALSE (0000ms, 36157ms total) +T2350 7916:597 JLINK_IsHalted() returns FALSE (0001ms, 36158ms total) +T2350 7916:599 JLINK_IsHalted() returns FALSE (0000ms, 36157ms total) +T2350 7916:600 JLINK_IsHalted() returns FALSE (0000ms, 36157ms total) +T2350 7916:601 JLINK_IsHalted() returns FALSE (0000ms, 36157ms total) +T2350 7916:602 JLINK_IsHalted() returns FALSE (0000ms, 36157ms total) +T2350 7916:603 JLINK_IsHalted() returns FALSE (0000ms, 36157ms total) +T2350 7916:604 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36160ms total) +T2350 7916:607 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36157ms total) +T2350 7916:607 JLINK_ClrBPEx(BPHandle = 0x00000062) returns 0x00 (0000ms, 36157ms total) +T2350 7916:607 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36157ms total) +T2350 7916:608 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 8C A1 89 0D BF E6 42 68 41 99 2D 0F B0 54 BB 16 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36160ms total) +T2350 7916:611 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 47 F1 1A 71 1D 29 C5 89 6F B7 62 0E AA 18 BE 1B ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R0, 0x0800AC00) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36162ms total) +T2350 7916:613 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0001ms, 36163ms total) +T2350 7916:614 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36163ms total) +T2350 7916:614 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36163ms total) +T2350 7916:614 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36163ms total) +T2350 7916:614 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36163ms total) +T2350 7916:614 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36163ms total) +T2350 7916:614 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36163ms total) +T2350 7916:614 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36163ms total) +T2350 7916:614 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000063 (0000ms, 36163ms total) +T2350 7916:614 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36167ms total) +T2350 7916:618 JLINK_IsHalted() returns FALSE (0001ms, 36168ms total) +T2350 7916:624 JLINK_IsHalted() returns FALSE (0001ms, 36168ms total) +T2350 7916:626 JLINK_IsHalted() returns FALSE (0001ms, 36168ms total) +T2350 7916:628 JLINK_IsHalted() returns FALSE (0001ms, 36168ms total) +T2350 7916:630 JLINK_IsHalted() returns FALSE (0000ms, 36167ms total) +T2350 7916:631 JLINK_IsHalted() returns FALSE (0000ms, 36167ms total) +T2350 7916:632 JLINK_IsHalted() returns FALSE (0000ms, 36167ms total) +T2350 7916:633 JLINK_IsHalted() returns FALSE (0001ms, 36168ms total) +T2350 7916:635 JLINK_IsHalted() returns FALSE (0000ms, 36167ms total) +T2350 7916:636 JLINK_IsHalted() returns FALSE (0000ms, 36167ms total) +T2350 7916:637 JLINK_IsHalted() returns FALSE (0000ms, 36167ms total) +T2350 7916:638 JLINK_IsHalted() returns FALSE (0000ms, 36167ms total) +T2350 7916:639 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36170ms total) +T2350 7916:642 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36167ms total) +T2350 7916:642 JLINK_ClrBPEx(BPHandle = 0x00000063) returns 0x00 (0000ms, 36167ms total) +T2350 7916:642 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36167ms total) +T2350 7916:643 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 73 D8 D8 AB 53 31 31 62 3F 15 15 2A 0C 04 04 08 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36170ms total) +T2350 7916:646 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 27 1D 1D 3A B9 9E 9E 27 38 E1 E1 D9 13 F8 F8 EB ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R0, 0x0800B000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36172ms total) +T2350 7916:648 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0001ms, 36173ms total) +T2350 7916:649 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36173ms total) +T2350 7916:649 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36173ms total) +T2350 7916:649 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000064 (0000ms, 36173ms total) +T2350 7916:649 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36177ms total) +T2350 7916:653 JLINK_IsHalted() returns FALSE (0001ms, 36178ms total) +T2350 7916:655 JLINK_IsHalted() returns FALSE (0000ms, 36177ms total) +T2350 7916:656 JLINK_IsHalted() returns FALSE (0000ms, 36177ms total) +T2350 7916:657 JLINK_IsHalted() returns FALSE (0000ms, 36177ms total) +T2350 7916:658 JLINK_IsHalted() returns FALSE (0000ms, 36177ms total) +T2350 7916:659 JLINK_IsHalted() returns FALSE (0000ms, 36177ms total) +T2350 7916:660 JLINK_IsHalted() returns FALSE (0000ms, 36177ms total) +T2350 7916:661 JLINK_IsHalted() returns FALSE (0000ms, 36177ms total) +T2350 7916:662 JLINK_IsHalted() returns FALSE (0000ms, 36177ms total) +T2350 7916:663 JLINK_IsHalted() returns FALSE (0000ms, 36177ms total) +T2350 7916:664 JLINK_IsHalted() returns FALSE (0000ms, 36177ms total) +T2350 7916:665 JLINK_IsHalted() returns FALSE (0001ms, 36178ms total) +T2350 7916:671 JLINK_IsHalted() returns FALSE (0001ms, 36178ms total) +T2350 7916:673 JLINK_IsHalted() returns FALSE (0001ms, 36178ms total) +T2350 7916:675 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 36181ms total) +T2350 7916:679 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36177ms total) +T2350 7916:679 JLINK_ClrBPEx(BPHandle = 0x00000064) returns 0x00 (0000ms, 36177ms total) +T2350 7916:679 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36177ms total) +T2350 7916:680 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 84 AE 6B BB 1C A0 81 FE 94 2B 08 F9 58 68 48 70 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36180ms total) +T2350 7916:683 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 33 56 10 E9 13 47 D6 6D 8C 61 D7 9A 7A 0C A1 37 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36182ms total) +T2350 7916:685 JLINK_WriteReg(R0, 0x0800B400) returns 0x00 (0000ms, 36182ms total) +T2350 7916:685 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36182ms total) +T2350 7916:685 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36182ms total) +T2350 7916:685 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36182ms total) +T2350 7916:685 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36182ms total) +T2350 7916:685 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36182ms total) +T2350 7916:685 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36182ms total) +T2350 7916:685 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36182ms total) +T2350 7916:685 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36182ms total) +T2350 7916:685 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36182ms total) +T2350 7916:685 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0001ms, 36183ms total) +T2350 7916:686 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36183ms total) +T2350 7916:686 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36183ms total) +T2350 7916:686 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36183ms total) +T2350 7916:686 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36183ms total) +T2350 7916:686 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36183ms total) +T2350 7916:686 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36183ms total) +T2350 7916:686 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36183ms total) +T2350 7916:686 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36183ms total) +T2350 7916:686 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36183ms total) +T2350 7916:686 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000065 (0000ms, 36183ms total) +T2350 7916:686 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36187ms total) +T2350 7916:690 JLINK_IsHalted() returns FALSE (0001ms, 36188ms total) +T2350 7916:692 JLINK_IsHalted() returns FALSE (0000ms, 36187ms total) +T2350 7916:693 JLINK_IsHalted() returns FALSE (0000ms, 36187ms total) +T2350 7916:694 JLINK_IsHalted() returns FALSE (0000ms, 36187ms total) +T2350 7916:700 JLINK_IsHalted() returns FALSE (0001ms, 36188ms total) +T2350 7916:702 JLINK_IsHalted() returns FALSE (0001ms, 36188ms total) +T2350 7916:704 JLINK_IsHalted() returns FALSE (0001ms, 36188ms total) +T2350 7916:706 JLINK_IsHalted() returns FALSE (0001ms, 36188ms total) +T2350 7916:708 JLINK_IsHalted() returns FALSE (0000ms, 36187ms total) +T2350 7916:709 JLINK_IsHalted() returns FALSE (0000ms, 36187ms total) +T2350 7916:710 JLINK_IsHalted() returns FALSE (0001ms, 36188ms total) +T2350 7916:712 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36190ms total) +T2350 7916:715 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36187ms total) +T2350 7916:715 JLINK_ClrBPEx(BPHandle = 0x00000065) returns 0x00 (0000ms, 36187ms total) +T2350 7916:715 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36187ms total) +T2350 7916:716 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 34 61 F6 60 B8 65 7A 64 3C 66 FE 67 C0 48 02 49 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36190ms total) +T2350 7916:719 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 20 80 10 00 00 00 10 80 20 00 10 00 20 00 00 80 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36192ms total) +T2350 7916:721 JLINK_WriteReg(R0, 0x0800B800) returns 0x00 (0000ms, 36192ms total) +T2350 7916:721 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36192ms total) +T2350 7916:721 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36192ms total) +T2350 7916:721 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36192ms total) +T2350 7916:721 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36192ms total) +T2350 7916:721 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36192ms total) +T2350 7916:721 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36192ms total) +T2350 7916:721 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36192ms total) +T2350 7916:721 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36192ms total) +T2350 7916:721 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0001ms, 36193ms total) +T2350 7916:722 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36193ms total) +T2350 7916:722 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36193ms total) +T2350 7916:722 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36193ms total) +T2350 7916:722 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36193ms total) +T2350 7916:722 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36193ms total) +T2350 7916:722 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36193ms total) +T2350 7916:722 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36193ms total) +T2350 7916:722 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36193ms total) +T2350 7916:722 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36193ms total) +T2350 7916:722 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36193ms total) +T2350 7916:722 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000066 (0000ms, 36193ms total) +T2350 7916:722 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36197ms total) +T2350 7916:726 JLINK_IsHalted() returns FALSE (0001ms, 36198ms total) +T2350 7916:728 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:729 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:730 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:731 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:732 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:733 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:734 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:735 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:736 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:737 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:738 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:739 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:740 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:741 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:742 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:743 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:744 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:745 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:746 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:747 JLINK_IsHalted() returns FALSE (0000ms, 36197ms total) +T2350 7916:748 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36200ms total) +T2350 7916:751 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36197ms total) +T2350 7916:751 JLINK_ClrBPEx(BPHandle = 0x00000066) returns 0x00 (0000ms, 36197ms total) +T2350 7916:751 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36197ms total) +T2350 7916:752 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 00 02 02 08 00 02 00 08 00 00 00 00 00 02 00 00 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36200ms total) +T2350 7916:755 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 10 00 00 00 10 00 40 20 10 00 40 20 00 00 00 00 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R0, 0x0800BC00) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36202ms total) +T2350 7916:757 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0001ms, 36203ms total) +T2350 7916:758 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36203ms total) +T2350 7916:758 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36203ms total) +T2350 7916:758 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36203ms total) +T2350 7916:758 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000067 (0000ms, 36203ms total) +T2350 7916:758 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36207ms total) +T2350 7916:762 JLINK_IsHalted() returns FALSE (0001ms, 36208ms total) +T2350 7916:764 JLINK_IsHalted() returns FALSE (0000ms, 36207ms total) +T2350 7916:765 JLINK_IsHalted() returns FALSE (0001ms, 36208ms total) +T2350 7916:767 JLINK_IsHalted() returns FALSE (0000ms, 36207ms total) +T2350 7916:768 JLINK_IsHalted() returns FALSE (0000ms, 36207ms total) +T2350 7916:769 JLINK_IsHalted() returns FALSE (0000ms, 36207ms total) +T2350 7916:770 JLINK_IsHalted() returns FALSE (0000ms, 36207ms total) +T2350 7916:771 JLINK_IsHalted() returns FALSE (0000ms, 36207ms total) +T2350 7916:772 JLINK_IsHalted() returns FALSE (0000ms, 36207ms total) +T2350 7916:773 JLINK_IsHalted() returns FALSE (0000ms, 36207ms total) +T2350 7916:774 JLINK_IsHalted() returns FALSE (0000ms, 36207ms total) +T2350 7916:779 JLINK_IsHalted() returns FALSE (0001ms, 36208ms total) +T2350 7916:781 JLINK_IsHalted() returns FALSE (0000ms, 36207ms total) +T2350 7916:782 JLINK_IsHalted() returns FALSE (0001ms, 36208ms total) +T2350 7916:784 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36210ms total) +T2350 7916:787 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36207ms total) +T2350 7916:787 JLINK_ClrBPEx(BPHandle = 0x00000067) returns 0x00 (0001ms, 36208ms total) +T2350 7916:788 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36208ms total) +T2350 7916:788 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 02 00 20 04 02 00 20 04 02 00 00 00 02 00 20 00 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36211ms total) +T2350 7916:791 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: BE 85 31 24 E2 B4 FF D5 C3 7D 0C 55 6F 89 7B F2 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R0, 0x0800C000) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36213ms total) +T2350 7916:793 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0001ms, 36214ms total) +T2350 7916:794 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36214ms total) +T2350 7916:794 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36214ms total) +T2350 7916:794 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36214ms total) +T2350 7916:794 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36214ms total) +T2350 7916:794 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36214ms total) +T2350 7916:794 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36214ms total) +T2350 7916:794 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000068 (0000ms, 36214ms total) +T2350 7916:794 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36218ms total) +T2350 7916:798 JLINK_IsHalted() returns FALSE (0001ms, 36219ms total) +T2350 7916:800 JLINK_IsHalted() returns FALSE (0000ms, 36218ms total) +T2350 7916:801 JLINK_IsHalted() returns FALSE (0000ms, 36218ms total) +T2350 7916:802 JLINK_IsHalted() returns FALSE (0001ms, 36219ms total) +T2350 7916:804 JLINK_IsHalted() returns FALSE (0000ms, 36218ms total) +T2350 7916:810 JLINK_IsHalted() returns FALSE (0001ms, 36219ms total) +T2350 7916:812 JLINK_IsHalted() returns FALSE (0001ms, 36219ms total) +T2350 7916:814 JLINK_IsHalted() returns FALSE (0000ms, 36218ms total) +T2350 7916:815 JLINK_IsHalted() returns FALSE (0001ms, 36219ms total) +T2350 7916:817 JLINK_IsHalted() returns FALSE (0000ms, 36218ms total) +T2350 7916:818 JLINK_IsHalted() returns FALSE (0000ms, 36218ms total) +T2350 7916:819 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36221ms total) +T2350 7916:822 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36218ms total) +T2350 7916:822 JLINK_ClrBPEx(BPHandle = 0x00000068) returns 0x00 (0000ms, 36218ms total) +T2350 7916:822 JLINK_ReadReg(R0) returns 0x00000000 (0001ms, 36219ms total) +T2350 7916:823 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 99 EB 8E DF 4C 77 48 27 A8 48 9B E1 B5 BC B0 34 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36222ms total) +T2350 7916:826 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36224ms total) +T2350 7916:828 JLINK_WriteReg(R0, 0x0800C400) returns 0x00 (0000ms, 36224ms total) +T2350 7916:828 JLINK_WriteReg(R1, 0x00000400) returns 0x00 (0000ms, 36224ms total) +T2350 7916:828 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36224ms total) +T2350 7916:828 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36224ms total) +T2350 7916:828 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0001ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36225ms total) +T2350 7916:829 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x00000069 (0000ms, 36225ms total) +T2350 7916:829 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36229ms total) +T2350 7916:833 JLINK_IsHalted() returns FALSE (0001ms, 36230ms total) +T2350 7916:835 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:836 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:837 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:838 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:839 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:840 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:841 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:842 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:843 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:844 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:845 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:846 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:847 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:848 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:849 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:850 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:851 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:852 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:853 JLINK_IsHalted() returns FALSE (0000ms, 36229ms total) +T2350 7916:854 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 36233ms total) +T2350 7916:858 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36229ms total) +T2350 7916:858 JLINK_ClrBPEx(BPHandle = 0x00000069) returns 0x00 (0000ms, 36229ms total) +T2350 7916:858 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36229ms total) +T2350 7916:860 JLINK_WriteMem(0x2000013C, 0x02C4 Bytes, ...) - Data: 6B 1F A3 0A 1A 70 F9 14 8C E2 5F E3 4D DF 0A 44 ... -- CPU_WriteMem(708 bytes @ 0x2000013C) returns 0x2C4 (0003ms, 36232ms total) +T2350 7916:863 JLINK_WriteMem(0x20000400, 0x013C Bytes, ...) - Data: C8 12 93 14 08 FD 8B 1B 08 29 0C 1A 1B 0C 29 18 ... -- CPU_WriteMem(316 bytes @ 0x20000400) returns 0x13C (0002ms, 36234ms total) +T2350 7916:865 JLINK_WriteReg(R0, 0x0800C800) returns 0x00 (0000ms, 36234ms total) +T2350 7916:865 JLINK_WriteReg(R1, 0x000003B4) returns 0x00 (0000ms, 36234ms total) +T2350 7916:865 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36234ms total) +T2350 7916:865 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36234ms total) +T2350 7916:865 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36234ms total) +T2350 7916:865 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36234ms total) +T2350 7916:865 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36234ms total) +T2350 7916:865 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36234ms total) +T2350 7916:865 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36234ms total) +T2350 7916:865 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36234ms total) +T2350 7916:865 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0001ms, 36235ms total) +T2350 7916:866 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36235ms total) +T2350 7916:866 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36235ms total) +T2350 7916:866 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36235ms total) +T2350 7916:866 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36235ms total) +T2350 7916:866 JLINK_WriteReg(R15 (PC), 0x200000D8) returns 0x00 (0000ms, 36235ms total) +T2350 7916:866 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36235ms total) +T2350 7916:866 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36235ms total) +T2350 7916:866 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36235ms total) +T2350 7916:866 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36235ms total) +T2350 7916:866 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000006A (0000ms, 36235ms total) +T2350 7916:866 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 36240ms total) +T2350 7916:871 JLINK_IsHalted() returns FALSE (0001ms, 36241ms total) +T2350 7916:873 JLINK_IsHalted() returns FALSE (0001ms, 36241ms total) +T2350 7916:875 JLINK_IsHalted() returns FALSE (0001ms, 36241ms total) +T2350 7916:877 JLINK_IsHalted() returns FALSE (0001ms, 36241ms total) +T2350 7916:879 JLINK_IsHalted() returns FALSE (0001ms, 36241ms total) +T2350 7916:881 JLINK_IsHalted() returns FALSE (0001ms, 36241ms total) +T2350 7916:891 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 36244ms total) +T2350 7916:895 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36240ms total) +T2350 7916:895 JLINK_ClrBPEx(BPHandle = 0x0000006A) returns 0x00 (0000ms, 36240ms total) +T2350 7916:895 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R0, 0x00000002) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R1, 0x000003B4) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R2, 0x2000013C) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36240ms total) +T2350 7916:896 JLINK_WriteReg(R15 (PC), 0x2000006C) returns 0x00 (0000ms, 36240ms total) +T2350 7916:897 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36241ms total) +T2350 7916:897 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36241ms total) +T2350 7916:897 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36241ms total) +T2350 7916:897 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36241ms total) +T2350 7916:897 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000006B (0000ms, 36241ms total) +T2350 7916:897 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 36246ms total) +T2350 7916:902 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 36250ms total) +T2350 7916:906 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36246ms total) +T2350 7916:906 JLINK_ClrBPEx(BPHandle = 0x0000006B) returns 0x00 (0000ms, 36246ms total) +T2350 7916:906 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36246ms total) +T2350 7916:962 JLINK_WriteMem(0x20000000, 0x013C Bytes, ...) - Data: 00 BE 0A E0 0D 78 2D 06 68 40 08 24 40 00 00 D3 ... -- CPU_WriteMem(316 bytes @ 0x20000000) returns 0x13C (0002ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R0, 0x08000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R1, 0x00B71B00) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R2, 0x00000003) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R3, 0x00000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(R15 (PC), 0x20000038) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36248ms total) +T2350 7916:964 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) -- CPU_ReadMem(2 bytes @ 0x20000000) returns 0x0000006C (0001ms, 36249ms total) +T2350 7916:965 JLINK_Go() -- CPU_WriteMem(2 bytes @ 0x20000000) -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 36254ms total) +T2350 7916:970 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0004ms, 36258ms total) +T2350 7916:974 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36254ms total) +T2350 7916:974 JLINK_ClrBPEx(BPHandle = 0x0000006C) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R0, 0xFFFFFFFF) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R1, 0x08000000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R2, 0x0000CBB4) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R3, 0x04C11DB7) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(R15 (PC), 0x20000002) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36254ms total) +T2350 7916:974 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000006D (0000ms, 36254ms total) +T2350 7916:974 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0004ms, 36258ms total) +T2350 7916:978 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7916:982 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7916:984 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7916:986 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7916:988 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7916:990 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7916:995 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7916:997 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7916:998 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7916:999 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:000 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:002 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:004 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:006 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:007 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:008 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:009 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:010 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:011 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:012 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:013 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:014 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:015 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:016 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:017 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:019 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:020 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:021 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:022 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:023 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:027 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:029 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:031 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:033 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:035 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:037 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:038 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:040 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:042 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:044 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:046 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:048 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:050 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:051 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:052 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:053 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:054 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:055 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:057 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:059 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:060 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:061 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:062 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:063 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:064 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:065 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:066 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:067 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:068 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:069 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:070 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:071 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:072 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:073 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:074 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:075 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:076 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:077 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:078 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:079 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:080 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:081 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:082 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:083 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:084 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:085 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:086 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:087 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:088 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:089 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:090 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:091 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:092 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:093 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:094 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:095 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:096 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:097 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:098 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:099 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:100 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:101 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:109 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:111 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:113 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:114 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:116 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:117 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:118 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:119 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:120 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:121 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:122 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:123 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:124 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:125 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:126 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:127 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:128 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:129 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:130 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:131 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:146 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:148 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:150 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:152 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:154 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:155 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:156 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:157 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:158 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:159 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:160 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:162 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:163 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:164 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:165 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:166 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:167 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:168 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:169 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:170 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:171 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:172 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:173 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:174 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:175 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:176 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:177 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:178 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:179 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:180 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:181 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:182 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:183 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:184 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:185 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:186 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:187 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:188 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:189 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:190 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:191 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:192 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:193 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:194 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:195 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:196 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:197 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:198 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:199 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:200 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:201 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:202 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:203 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:204 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:205 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:206 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:207 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:208 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:209 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:210 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:211 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:220 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:222 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:224 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:226 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:228 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:229 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:230 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:231 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:232 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:233 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:234 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:235 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:236 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:237 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:238 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:239 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:240 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:241 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:252 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:254 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:256 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:258 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:259 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:261 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:263 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:264 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:266 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:267 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:269 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:270 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:271 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:272 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:273 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:274 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:275 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:276 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:277 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:278 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:279 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:280 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:281 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:282 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:283 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:284 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:285 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:286 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:287 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:288 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:289 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:290 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:292 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:293 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:294 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:295 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:296 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:297 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:298 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:299 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:300 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:301 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:302 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:303 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:304 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:305 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:306 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:307 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:308 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:309 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:310 JLINK_IsHalted() returns FALSE (0000ms, 36258ms total) +T2350 7917:311 JLINK_IsHalted() returns FALSE (0001ms, 36259ms total) +T2350 7917:313 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:314 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:315 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:316 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:317 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:318 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:319 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:320 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:321 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:327 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:329 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:331 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:333 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:334 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:335 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:336 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:337 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:339 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:340 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:341 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:342 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:343 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:344 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:345 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:346 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:347 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:348 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:349 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:350 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:351 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:357 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:359 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:360 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:362 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:363 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:364 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:365 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:366 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:367 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:368 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:369 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:370 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:371 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:372 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:373 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:374 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:375 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:377 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:379 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:381 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:382 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:383 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:384 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:385 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:386 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:387 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:388 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:389 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:390 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:391 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:392 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:393 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:394 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:395 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:396 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:397 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:399 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:400 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:401 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:402 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:403 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:404 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:405 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:406 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:407 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:408 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:410 JLINK_IsHalted() returns FALSE (0000ms, 36259ms total) +T2350 7917:411 JLINK_IsHalted() returns FALSE (0001ms, 36260ms total) +T2350 7917:413 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:415 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:417 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:418 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:420 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:422 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:423 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:425 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:427 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:432 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:434 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:435 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:437 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:438 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:440 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:442 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:444 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:446 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:447 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:448 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:449 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:450 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:451 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:452 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:453 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:454 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:455 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:456 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:458 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:462 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:464 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:466 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:468 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:469 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:470 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:471 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:472 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:473 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:475 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:476 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:477 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:478 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:479 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:480 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:481 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:482 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:483 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:484 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:485 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:487 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:488 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:489 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:490 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:491 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:492 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:493 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:494 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:495 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:496 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:497 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:499 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:500 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:502 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:504 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:505 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:506 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:507 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:509 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:511 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:513 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:514 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:516 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:518 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:519 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:521 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:522 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:523 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:525 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:526 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:527 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:528 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:529 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:530 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:531 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:532 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:533 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:534 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:535 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:536 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:537 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:540 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:542 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:544 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:546 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:548 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:550 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:552 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:554 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:556 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:558 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:560 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:562 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:564 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:566 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:568 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:571 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:573 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:575 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:577 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:579 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:581 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:583 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:585 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:586 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:587 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:588 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:589 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:590 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:591 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:592 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:593 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:594 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:595 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:596 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:597 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:599 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:600 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:602 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:604 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:606 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:607 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:608 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:610 JLINK_IsHalted() returns FALSE (0002ms, 36262ms total) +T2350 7917:613 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:615 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:617 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:619 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:621 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:623 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:625 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:627 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:629 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:633 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:635 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:637 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:638 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:640 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:642 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:644 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:645 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:647 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:651 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:653 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:655 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:657 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:658 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:660 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:662 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:664 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:666 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:668 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:670 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:672 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:674 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:676 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:678 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:681 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:683 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:684 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:686 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:688 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:689 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:690 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:691 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:692 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:694 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:696 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:698 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:700 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:701 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:702 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:703 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:704 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:705 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:707 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:708 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:709 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:710 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:711 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:712 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:713 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:714 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:716 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:718 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:720 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:722 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:724 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:725 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:726 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:728 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:729 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:730 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:732 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:733 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:734 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:735 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:737 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:738 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:739 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:741 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:742 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:744 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:745 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:746 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:748 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:750 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:751 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:752 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:753 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:755 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:756 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:757 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:759 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:763 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:765 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:766 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:767 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:768 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:770 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:771 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:772 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:773 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:774 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:775 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:776 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:777 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:778 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:779 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:780 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:781 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:782 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:783 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:784 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:785 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:786 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:792 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:794 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:796 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:797 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:799 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:800 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:802 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:803 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:804 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:806 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:807 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:808 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:809 JLINK_IsHalted() returns FALSE (0001ms, 36261ms total) +T2350 7917:811 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:812 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:813 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:814 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:815 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:816 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:817 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:818 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:819 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:820 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:821 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:822 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:823 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:824 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:825 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:826 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:827 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:828 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:829 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:830 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:831 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:832 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:833 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:834 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:835 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:836 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:837 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:838 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:839 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:840 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:841 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:842 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:843 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:844 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:845 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:846 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:847 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:848 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:849 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:850 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:851 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:852 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:853 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:854 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:855 JLINK_IsHalted() returns FALSE (0000ms, 36260ms total) +T2350 7917:856 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0003ms, 36263ms total) +T2350 7917:859 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0001ms, 36261ms total) +T2350 7917:860 JLINK_ClrBPEx(BPHandle = 0x0000006D) returns 0x00 (0000ms, 36261ms total) +T2350 7917:860 JLINK_ReadReg(R0) returns 0x29A74127 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R0, 0x00000003) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R1, 0x08000000) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R2, 0x0000CBB4) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R3, 0x04C11DB7) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R4, 0x00000000) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R5, 0x00000000) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R6, 0x00000000) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R7, 0x00000000) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R8, 0x00000000) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R9, 0x20000134) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R10, 0x00000000) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R11, 0x00000000) returns 0x00 (0000ms, 36261ms total) +T2350 7917:868 JLINK_WriteReg(R12, 0x00000000) returns 0x00 (0001ms, 36262ms total) +T2350 7917:869 JLINK_WriteReg(R13 (SP), 0x20001000) returns 0x00 (0000ms, 36262ms total) +T2350 7917:869 JLINK_WriteReg(R14, 0x20000001) returns 0x00 (0000ms, 36262ms total) +T2350 7917:869 JLINK_WriteReg(R15 (PC), 0x2000006C) returns 0x00 (0000ms, 36262ms total) +T2350 7917:869 JLINK_WriteReg(XPSR, 0x01000000) returns 0x00 (0000ms, 36262ms total) +T2350 7917:869 JLINK_WriteReg(MSP, 0x20001000) returns 0x00 (0000ms, 36262ms total) +T2350 7917:869 JLINK_WriteReg(PSP, 0x20001000) returns 0x00 (0000ms, 36262ms total) +T2350 7917:869 JLINK_WriteReg(CFBP, 0x00000000) returns 0x00 (0000ms, 36262ms total) +T2350 7917:869 JLINK_SetBPEx(Addr = 0x20000000, Type = 0xFFFFFFF2) returns 0x0000006E (0000ms, 36262ms total) +T2350 7917:869 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) (0005ms, 36267ms total) +T2350 7917:874 JLINK_IsHalted() -- CPU_ReadMem(2 bytes @ 0x20000000) returns TRUE (0005ms, 36272ms total) +T2350 7917:879 JLINK_ReadReg(R15 (PC)) returns 0x20000000 (0000ms, 36267ms total) +T2350 7917:879 JLINK_ClrBPEx(BPHandle = 0x0000006E) returns 0x00 (0000ms, 36267ms total) +T2350 7917:879 JLINK_ReadReg(R0) returns 0x00000000 (0000ms, 36267ms total) +T2350 7917:944 JLINK_WriteMemEx(0x20000000, 0x0002 Bytes, ..., Flags = 0x02000000) - Data: FE E7 -- CPU_WriteMem(2 bytes @ 0x20000000) returns 0x02 (0002ms, 36269ms total) +T2350 7917:946 JLINK_SetResetType(JLINKARM_CM3_RESET_TYPE_NORMAL) returns JLINKARM_CM3_RESET_TYPE_NORMAL (0000ms, 36269ms total) +T2350 7917:946 JLINK_Reset() -- CPU_WriteMem(4 bytes @ 0xE000EDF0) -- CPU_WriteMem(4 bytes @ 0xE000EDFC)Reset: Halt core after reset via DEMCR.VC_CORERESET. >0x35 TIF>Reset: Reset device via AIRCR.SYSRESETREQ. -- CPU_WriteMem(4 bytes @ 0xE000ED0C) >0x0D TIF> >0x28 TIF> -- CPU_ReadMem(4 bytes @ 0xE000EDF0) -- CPU_ReadMem(4 bytes @ 0xE000EDF0) -- CPU_WriteMem(4 bytes @ 0xE000EDF0) -- CPU_WriteMem(4 bytes @ 0xE000EDFC) -- CPU_ReadMem(4 bytes @ 0xE000EDF0) -- CPU_WriteMem(4 bytes @ 0xE0002000) + -- CPU_ReadMem(4 bytes @ 0xE000EDFC) -- CPU_ReadMem(4 bytes @ 0xE0001000) (0101ms, 36370ms total) +T2350 7918:047 JLINK_Go() -- CPU_ReadMem(4 bytes @ 0xE0001000) -- CPU_WriteMem(4 bytes @ 0xE0002008) -- CPU_WriteMem(4 bytes @ 0xE000200C) -- CPU_WriteMem(4 bytes @ 0xE0002010) -- CPU_WriteMem(4 bytes @ 0xE0002014) -- CPU_WriteMem(4 bytes @ 0xE0002018) -- CPU_WriteMem(4 bytes @ 0xE000201C) -- CPU_WriteMem(4 bytes @ 0xE0001004) (0005ms, 36375ms total) +T2350 7918:094 JLINK_Close() -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE0002008) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE000200C) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE0002010) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE0002014) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE0002018) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE000201C) >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> + >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x28 TIF> (0036ms, 36411ms total) +T2350 7918:094 (0036ms, 36411ms total) +T2350 7918:094 Closed (0036ms, 36411ms total) diff --git b/Proj/JLinkSettings.ini a/Proj/JLinkSettings.ini new file mode 100644 index 0000000..39b6d05 --- /dev/null +++ a/Proj/JLinkSettings.ini @@ -0,0 +1,39 @@ +[BREAKPOINTS] +ForceImpTypeAny = 0 +ShowInfoWin = 1 +EnableFlashBP = 2 +BPDuringExecution = 0 +[CFI] +CFISize = 0x00 +CFIAddr = 0x00 +[CPU] +MonModeVTableAddr = 0xFFFFFFFF +MonModeDebug = 0 +MaxNumAPs = 0 +LowPowerHandlingMode = 0 +OverrideMemMap = 0 +AllowSimulation = 1 +ScriptFile="" +[FLASH] +CacheExcludeSize = 0x00 +CacheExcludeAddr = 0x00 +MinNumBytesFlashDL = 0 +SkipProgOnCRCMatch = 1 +VerifyDownload = 1 +AllowCaching = 1 +EnableFlashDL = 2 +Override = 0 +Device="ARM7" +[GENERAL] +WorkRAMSize = 0x00 +WorkRAMAddr = 0x00 +RAMUsageLimit = 0x00 +[SWO] +SWOLogFile="" +[MEM] +RdOverrideOrMask = 0x00 +RdOverrideAndMask = 0xFFFFFFFF +RdOverrideAddr = 0xFFFFFFFF +WrOverrideOrMask = 0x00 +WrOverrideAndMask = 0xFFFFFFFF +WrOverrideAddr = 0xFFFFFFFF diff --git b/Proj/Listings/Base_GD303.map a/Proj/Listings/Base_GD303.map new file mode 100644 index 0000000..ca3095c --- /dev/null +++ a/Proj/Listings/Base_GD303.map @@ -0,0 +1,5296 @@ +Component: ARM Compiler 5.06 update 7 (build 960) Tool: armlink [4d3601] + +============================================================================== + +Section Cross References + + main.o(i.GPIO_Init) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + main.o(i.GPIO_Init) refers to hw_mcuio.o(i.HW_GD_GPIO_Init) for HW_GD_GPIO_Init + main.o(i.TIMER1_Init) refers to gd32f30x_timer.o(i.timer_init) for timer_init + main.o(i.TIMER1_Init) refers to gd32f30x_misc.o(i.nvic_irq_enable) for nvic_irq_enable + main.o(i.TIMER1_Init) refers to gd32f30x_timer.o(i.timer_counter_value_config) for timer_counter_value_config + main.o(i.TIMER1_Init) refers to gd32f30x_timer.o(i.timer_prescaler_config) for timer_prescaler_config + main.o(i.TIMER1_Init) refers to gd32f30x_timer.o(i.timer_autoreload_value_config) for timer_autoreload_value_config + main.o(i.TIMER1_Init) refers to gd32f30x_timer.o(i.timer_interrupt_disable) for timer_interrupt_disable + main.o(i.TIMER1_Init) refers to gd32f30x_timer.o(i.timer_interrupt_flag_clear) for timer_interrupt_flag_clear + main.o(i.TIMER1_Init) refers to gd32f30x_timer.o(i.timer_interrupt_enable) for timer_interrupt_enable + main.o(i.TIMER1_Init) refers to gd32f30x_timer.o(i.timer_enable) for timer_enable + main.o(i.TIMER2_Init) refers to gd32f30x_timer.o(i.timer_init) for timer_init + main.o(i.TIMER2_Init) refers to gd32f30x_misc.o(i.nvic_irq_enable) for nvic_irq_enable + main.o(i.TIMER2_Init) refers to gd32f30x_timer.o(i.timer_counter_value_config) for timer_counter_value_config + main.o(i.TIMER2_Init) refers to gd32f30x_timer.o(i.timer_prescaler_config) for timer_prescaler_config + main.o(i.TIMER2_Init) refers to gd32f30x_timer.o(i.timer_autoreload_value_config) for timer_autoreload_value_config + main.o(i.TIMER2_Init) refers to gd32f30x_timer.o(i.timer_interrupt_disable) for timer_interrupt_disable + main.o(i.TIMER2_Init) refers to gd32f30x_timer.o(i.timer_interrupt_flag_clear) for timer_interrupt_flag_clear + main.o(i.TIMER2_Init) refers to gd32f30x_timer.o(i.timer_interrupt_enable) for timer_interrupt_enable + main.o(i.TIMER2_Init) refers to gd32f30x_timer.o(i.timer_enable) for timer_enable + main.o(i.main) refers to gd32f30x_usbd_hw.o(i.rcu_config) for rcu_config + main.o(i.main) refers to custom_hid_core.o(i.custom_hid_itfop_register) for custom_hid_itfop_register + main.o(i.main) refers to usbd_core.o(i.usbd_init) for usbd_init + main.o(i.main) refers to gd32f30x_usbd_hw.o(i.nvic_config) for nvic_config + main.o(i.main) refers to gd32f30x_usbd_hw.o(i.gpio_config) for gpio_config + main.o(i.main) refers to main.o(i.GPIO_Init) for GPIO_Init + main.o(i.main) refers to hw_mcuio.o(i.HW_GD_SPI0_Init) for HW_GD_SPI0_Init + main.o(i.main) refers to main.o(i.TIMER1_Init) for TIMER1_Init + main.o(i.main) refers to main.o(i.TIMER2_Init) for TIMER2_Init + main.o(i.main) refers to fucntion_text_message.o(i.msg_polling) for msg_polling + main.o(i.main) refers to custom_hid_itf.o(.data) for fop_handler + main.o(i.main) refers to main.o(.bss) for usbd_custom_hid + main.o(i.main) refers to custom_hid_core.o(.data) for custom_hid_class + main.o(i.main) refers to base_core.o(.data) for base_core + gd32f30x_it.o(i.EXTI0_IRQHandler) refers to gd32f30x_exti.o(i.exti_interrupt_flag_get) for exti_interrupt_flag_get + gd32f30x_it.o(i.EXTI0_IRQHandler) refers to custom_hid_core.o(i.custom_hid_report_send) for custom_hid_report_send + gd32f30x_it.o(i.EXTI0_IRQHandler) refers to gd32f30x_exti.o(i.exti_interrupt_flag_clear) for exti_interrupt_flag_clear + gd32f30x_it.o(i.EXTI0_IRQHandler) refers to main.o(.bss) for usbd_custom_hid + gd32f30x_it.o(i.EXTI0_IRQHandler) refers to gd32f30x_it.o(.data) for Send_Buffer + gd32f30x_it.o(i.EXTI10_15_IRQHandler) refers to gd32f30x_exti.o(i.exti_interrupt_flag_get) for exti_interrupt_flag_get + gd32f30x_it.o(i.EXTI10_15_IRQHandler) refers to custom_hid_core.o(i.custom_hid_report_send) for custom_hid_report_send + gd32f30x_it.o(i.EXTI10_15_IRQHandler) refers to gd32f30x_exti.o(i.exti_interrupt_flag_clear) for exti_interrupt_flag_clear + gd32f30x_it.o(i.EXTI10_15_IRQHandler) refers to main.o(.bss) for usbd_custom_hid + gd32f30x_it.o(i.EXTI10_15_IRQHandler) refers to gd32f30x_it.o(.data) for Send_Buffer + gd32f30x_it.o(i.SysTick_Handler) refers to hw_mcuio.o(i.HW_GD_IncTick) for HW_GD_IncTick + gd32f30x_it.o(i.TIMER1_IRQHandler) refers to gd32f30x_timer.o(i.timer_interrupt_flag_get) for timer_interrupt_flag_get + gd32f30x_it.o(i.TIMER1_IRQHandler) refers to gd32f30x_timer.o(i.timer_interrupt_flag_clear) for timer_interrupt_flag_clear + gd32f30x_it.o(i.TIMER1_IRQHandler) refers to platform.o(i.user_2ms5_timer) for user_2ms5_timer + gd32f30x_it.o(i.TIMER1_IRQHandler) refers to base_core.o(.data) for base_core + gd32f30x_it.o(i.TIMER2_IRQHandler) refers to gd32f30x_timer.o(i.timer_interrupt_flag_get) for timer_interrupt_flag_get + gd32f30x_it.o(i.TIMER2_IRQHandler) refers to gd32f30x_timer.o(i.timer_interrupt_flag_clear) for timer_interrupt_flag_clear + gd32f30x_it.o(i.TIMER2_IRQHandler) refers to platform.o(i.user_20ms_timer) for user_20ms_timer + gd32f30x_it.o(i.TIMER2_IRQHandler) refers to base_core.o(.data) for base_core + gd32f30x_it.o(i.TIMER3_IRQHandler) refers to gd32f30x_timer.o(i.timer_interrupt_flag_get) for timer_interrupt_flag_get + gd32f30x_it.o(i.TIMER3_IRQHandler) refers to gd32f30x_timer.o(i.timer_interrupt_flag_clear) for timer_interrupt_flag_clear + gd32f30x_it.o(i.USBD_LP_CAN0_RX0_IRQHandler) refers to usbd_lld_int.o(i.usbd_isr) for usbd_isr + custom_hid_itf.o(.data) refers to custom_hid_itf.o(i.key_config) for key_config + custom_hid_itf.o(.data) refers to custom_hid_itf.o(i.led_config) for led_config + gd32f30x_usbd_hw.o(i.gpio_config) refers to gd32f30x_gpio.o(i.gpio_init) for gpio_init + gd32f30x_usbd_hw.o(i.nvic_config) refers to gd32f30x_misc.o(i.nvic_priority_group_set) for nvic_priority_group_set + gd32f30x_usbd_hw.o(i.nvic_config) refers to gd32f30x_misc.o(i.nvic_irq_enable) for nvic_irq_enable + gd32f30x_usbd_hw.o(i.rcu_config) refers to gd32f30x_rcu.o(i.rcu_clock_freq_get) for rcu_clock_freq_get + gd32f30x_usbd_hw.o(i.rcu_config) refers to gd32f30x_rcu.o(i.rcu_periph_clock_enable) for rcu_periph_clock_enable + gd32f30x_usbd_hw.o(i.rcu_config) refers to gd32f30x_rcu.o(i.rcu_usb_clock_config) for rcu_usb_clock_config + system_gd32f30x.o(i.SystemCoreClockUpdate) refers to system_gd32f30x.o(.data) for SystemCoreClock + system_gd32f30x.o(i.SystemInit) refers to system_gd32f30x.o(i.system_clock_config) for system_clock_config + system_gd32f30x.o(i.system_clock_config) refers to system_gd32f30x.o(i.system_clock_120m_hxtal) for system_clock_120m_hxtal + gd32f30x_dma.o(i.dma_channel_disable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_channel_enable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_circulation_disable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_circulation_enable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_deinit) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_init) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_interrupt_disable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_interrupt_enable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_memory_address_config) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_memory_increase_disable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_memory_increase_enable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_memory_to_memory_disable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_memory_to_memory_enable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_memory_width_config) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_periph_address_config) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_periph_increase_disable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_periph_increase_enable) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_periph_width_config) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_priority_config) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_transfer_direction_config) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_transfer_number_config) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_dma.o(i.dma_transfer_number_get) refers to gd32f30x_dma.o(i.dma_periph_and_channel_check) for dma_periph_and_channel_check + gd32f30x_fmc.o(i.fmc_bank0_erase) refers to gd32f30x_fmc.o(i.fmc_bank0_ready_wait) for fmc_bank0_ready_wait + gd32f30x_fmc.o(i.fmc_bank0_ready_wait) refers to gd32f30x_fmc.o(i.fmc_bank0_state_get) for fmc_bank0_state_get + gd32f30x_fmc.o(i.fmc_bank1_erase) refers to gd32f30x_fmc.o(i.fmc_bank1_ready_wait) for fmc_bank1_ready_wait + gd32f30x_fmc.o(i.fmc_bank1_ready_wait) refers to gd32f30x_fmc.o(i.fmc_bank1_state_get) for fmc_bank1_state_get + gd32f30x_fmc.o(i.fmc_halfword_program) refers to gd32f30x_fmc.o(i.fmc_bank0_ready_wait) for fmc_bank0_ready_wait + gd32f30x_fmc.o(i.fmc_halfword_program) refers to gd32f30x_fmc.o(i.fmc_bank1_ready_wait) for fmc_bank1_ready_wait + gd32f30x_fmc.o(i.fmc_mass_erase) refers to gd32f30x_fmc.o(i.fmc_bank0_ready_wait) for fmc_bank0_ready_wait + gd32f30x_fmc.o(i.fmc_mass_erase) refers to gd32f30x_fmc.o(i.fmc_bank1_ready_wait) for fmc_bank1_ready_wait + gd32f30x_fmc.o(i.fmc_page_erase) refers to gd32f30x_fmc.o(i.fmc_bank0_ready_wait) for fmc_bank0_ready_wait + gd32f30x_fmc.o(i.fmc_page_erase) refers to gd32f30x_fmc.o(i.fmc_bank1_ready_wait) for fmc_bank1_ready_wait + gd32f30x_fmc.o(i.fmc_word_program) refers to gd32f30x_fmc.o(i.fmc_bank0_ready_wait) for fmc_bank0_ready_wait + gd32f30x_fmc.o(i.fmc_word_program) refers to gd32f30x_fmc.o(i.fmc_bank1_ready_wait) for fmc_bank1_ready_wait + gd32f30x_fmc.o(i.fmc_word_reprogram) refers to gd32f30x_fmc.o(i.fmc_bank0_ready_wait) for fmc_bank0_ready_wait + gd32f30x_fmc.o(i.fmc_word_reprogram) refers to gd32f30x_fmc.o(i.fmc_bank1_ready_wait) for fmc_bank1_ready_wait + gd32f30x_fmc.o(i.ob_data_program) refers to gd32f30x_fmc.o(i.fmc_bank0_ready_wait) for fmc_bank0_ready_wait + gd32f30x_fmc.o(i.ob_erase) refers to gd32f30x_fmc.o(i.fmc_bank0_ready_wait) for fmc_bank0_ready_wait + gd32f30x_fmc.o(i.ob_erase) refers to gd32f30x_fmc.o(i.ob_spc_get) for ob_spc_get + gd32f30x_fmc.o(i.ob_security_protection_config) refers to gd32f30x_fmc.o(i.fmc_bank0_ready_wait) for fmc_bank0_ready_wait + gd32f30x_fmc.o(i.ob_user_write) refers to gd32f30x_fmc.o(i.fmc_bank0_ready_wait) for fmc_bank0_ready_wait + gd32f30x_fmc.o(i.ob_write_protection_enable) refers to gd32f30x_fmc.o(i.fmc_bank0_ready_wait) for fmc_bank0_ready_wait + gd32f30x_gpio.o(i.gpio_afio_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_enable) for rcu_periph_reset_enable + gd32f30x_gpio.o(i.gpio_afio_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_disable) for rcu_periph_reset_disable + gd32f30x_gpio.o(i.gpio_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_enable) for rcu_periph_reset_enable + gd32f30x_gpio.o(i.gpio_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_disable) for rcu_periph_reset_disable + gd32f30x_misc.o(i.nvic_irq_enable) refers to gd32f30x_misc.o(i.nvic_priority_group_set) for nvic_priority_group_set + gd32f30x_pmu.o(i.pmu_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_enable) for rcu_periph_reset_enable + gd32f30x_pmu.o(i.pmu_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_disable) for rcu_periph_reset_disable + gd32f30x_pmu.o(i.pmu_highdriver_switch_select) refers to gd32f30x_pmu.o(i.pmu_flag_get) for pmu_flag_get + gd32f30x_pmu.o(i.pmu_to_deepsleepmode) refers to gd32f30x_pmu.o(.bss) for reg_snap + gd32f30x_rcu.o(i.rcu_deinit) refers to gd32f30x_rcu.o(i.rcu_osci_stab_wait) for rcu_osci_stab_wait + gd32f30x_rcu.o(i.rcu_osci_stab_wait) refers to gd32f30x_rcu.o(i.rcu_flag_get) for rcu_flag_get + gd32f30x_spi.o(i.i2s_psc_config) refers to gd32f30x_rcu.o(i.rcu_clock_freq_get) for rcu_clock_freq_get + gd32f30x_spi.o(i.spi_i2s_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_enable) for rcu_periph_reset_enable + gd32f30x_spi.o(i.spi_i2s_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_disable) for rcu_periph_reset_disable + gd32f30x_timer.o(i.timer_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_enable) for rcu_periph_reset_enable + gd32f30x_timer.o(i.timer_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_disable) for rcu_periph_reset_disable + gd32f30x_timer.o(i.timer_external_clock_mode0_config) refers to gd32f30x_timer.o(i.timer_external_trigger_config) for timer_external_trigger_config + gd32f30x_timer.o(i.timer_external_clock_mode1_config) refers to gd32f30x_timer.o(i.timer_external_trigger_config) for timer_external_trigger_config + gd32f30x_timer.o(i.timer_external_trigger_as_external_clock_config) refers to gd32f30x_timer.o(i.timer_input_trigger_source_select) for timer_input_trigger_source_select + gd32f30x_timer.o(i.timer_input_capture_config) refers to gd32f30x_timer.o(i.timer_channel_input_capture_prescaler_config) for timer_channel_input_capture_prescaler_config + gd32f30x_timer.o(i.timer_input_pwm_capture_config) refers to gd32f30x_timer.o(i.timer_channel_input_capture_prescaler_config) for timer_channel_input_capture_prescaler_config + gd32f30x_timer.o(i.timer_internal_trigger_as_external_clock_config) refers to gd32f30x_timer.o(i.timer_input_trigger_source_select) for timer_input_trigger_source_select + gd32f30x_usart.o(i.usart_baudrate_set) refers to gd32f30x_rcu.o(i.rcu_clock_freq_get) for rcu_clock_freq_get + gd32f30x_usart.o(i.usart_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_enable) for rcu_periph_reset_enable + gd32f30x_usart.o(i.usart_deinit) refers to gd32f30x_rcu.o(i.rcu_periph_reset_disable) for rcu_periph_reset_disable + startup_gd32f30x_hd.o(RESET) refers to startup_gd32f30x_hd.o(STACK) for __initial_sp + startup_gd32f30x_hd.o(RESET) refers to startup_gd32f30x_hd.o(.text) for Reset_Handler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.NMI_Handler) for NMI_Handler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.HardFault_Handler) for HardFault_Handler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.MemManage_Handler) for MemManage_Handler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.BusFault_Handler) for BusFault_Handler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.UsageFault_Handler) for UsageFault_Handler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.SVC_Handler) for SVC_Handler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.DebugMon_Handler) for DebugMon_Handler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.PendSV_Handler) for PendSV_Handler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.SysTick_Handler) for SysTick_Handler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.EXTI0_IRQHandler) for EXTI0_IRQHandler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.USBD_LP_CAN0_RX0_IRQHandler) for USBD_LP_CAN0_RX0_IRQHandler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.TIMER1_IRQHandler) for TIMER1_IRQHandler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.TIMER2_IRQHandler) for TIMER2_IRQHandler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.TIMER3_IRQHandler) for TIMER3_IRQHandler + startup_gd32f30x_hd.o(RESET) refers to gd32f30x_it.o(i.EXTI10_15_IRQHandler) for EXTI10_15_IRQHandler + startup_gd32f30x_hd.o(.text) refers to system_gd32f30x.o(i.SystemInit) for SystemInit + startup_gd32f30x_hd.o(.text) refers to entry.o(.ARM.Collect$$$$00000000) for __main + usbd_lld_core.o(i.usbd_dp_pullup) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + usbd_lld_core.o(i.usbd_dp_pullup) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + usbd_lld_core.o(i.usbd_ep_data_read) refers to usbd_lld_core.o(.ARM.__AT_0x40006000) for btable_ep + usbd_lld_core.o(i.usbd_ep_data_write) refers to usbd_lld_core.o(.ARM.__AT_0x40006000) for btable_ep + usbd_lld_core.o(i.usbd_ep_reset) refers to usbd_lld_core.o(.ARM.__AT_0x40006000) for btable_ep + usbd_lld_core.o(i.usbd_ep_setup) refers to usbd_lld_core.o(.constdata) for ep_type + usbd_lld_core.o(i.usbd_ep_setup) refers to usbd_lld_core.o(.ARM.__AT_0x40006000) for btable_ep + usbd_lld_core.o(i.usbd_resume) refers to usbd_lld_core.o(.data) for usbd_core + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_core_reset) for usbd_core_reset + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_core_stop) for usbd_core_stop + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_dp_pullup) for usbd_dp_pullup + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_address_set) for usbd_address_set + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_suspend) for usbd_suspend + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_leave_suspend) for usbd_leave_suspend + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_resume) for usbd_resume + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_ep_reset) for usbd_ep_reset + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_ep_setup) for usbd_ep_setup + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_ep_disable) for usbd_ep_disable + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_ep_rx_enable) for usbd_ep_rx_enable + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_ep_data_write) for usbd_ep_data_write + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_ep_data_read) for usbd_ep_data_read + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_ep_stall_set) for usbd_ep_stall_set + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_ep_stall_clear) for usbd_ep_stall_clear + usbd_lld_core.o(.data) refers to usbd_lld_core.o(i.usbd_ep_status) for usbd_ep_status + usbd_lld_int.o(i.usbd_int_hpst) refers to usbd_lld_core.o(i.user_buffer_free) for user_buffer_free + usbd_lld_int.o(i.usbd_isr) refers to usbd_core.o(i.usbd_ep_send) for usbd_ep_send + usbd_lld_int.o(i.usbd_isr) refers to usbd_lld_int.o(i.usbd_int_suspend) for usbd_int_suspend + usbd_lld_int.o(i.usbd_isr) refers to usbd_lld_core.o(.data) for usbd_core + usbd_lld_int.o(i.usbd_isr) refers to usbd_core.o(.data) for usbd_int_fops + usbd_core.o(i.usbd_ep_recev) refers to usbd_core.o(i.usb_transc_config) for usb_transc_config + usbd_core.o(i.usbd_ep_send) refers to usbd_core.o(i.usb_transc_config) for usb_transc_config + usbd_core.o(i.usbd_init) refers to usbd_enum.o(i.serial_string_get) for serial_string_get + usbd_core.o(i.usbd_init) refers to usbd_lld_core.o(.data) for usbd_core + usbd_core.o(i.usbd_init) refers to usbd_transc.o(i._usb_setup_transc) for _usb_setup_transc + usbd_core.o(i.usbd_init) refers to usbd_transc.o(i._usb_out0_transc) for _usb_out0_transc + usbd_core.o(i.usbd_init) refers to usbd_transc.o(i._usb_in0_transc) for _usb_in0_transc + usbd_enum.o(i._usb_std_getconfiguration) refers to usbd_enum.o(i.usb_transc_config) for usb_transc_config + usbd_enum.o(i._usb_std_getdescriptor) refers to usbd_enum.o(i._usb_bos_desc_get) for _usb_bos_desc_get + usbd_enum.o(i._usb_std_getdescriptor) refers to usbd_enum.o(.data) for std_desc_get + usbd_enum.o(i._usb_std_getinterface) refers to usbd_enum.o(i.usb_transc_config) for usb_transc_config + usbd_enum.o(i._usb_std_getstatus) refers to usbd_enum.o(i.usb_transc_config) for usb_transc_config + usbd_enum.o(i._usb_std_getstatus) refers to usbd_enum.o(.data) for status + usbd_enum.o(i._usb_std_setconfiguration) refers to usbd_enum.o(.data) for config + usbd_enum.o(i.serial_string_get) refers to usbd_enum.o(i.int_to_unicode) for int_to_unicode + usbd_enum.o(i.usbd_standard_request) refers to usbd_enum.o(.data) for _std_dev_req + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_getstatus) for _usb_std_getstatus + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_clearfeature) for _usb_std_clearfeature + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_reserved) for _usb_std_reserved + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_setfeature) for _usb_std_setfeature + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_setaddress) for _usb_std_setaddress + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_getdescriptor) for _usb_std_getdescriptor + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_setdescriptor) for _usb_std_setdescriptor + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_getconfiguration) for _usb_std_getconfiguration + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_setconfiguration) for _usb_std_setconfiguration + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_getinterface) for _usb_std_getinterface + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_setinterface) for _usb_std_setinterface + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_std_synchframe) for _usb_std_synchframe + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_dev_desc_get) for _usb_dev_desc_get + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_config_desc_get) for _usb_config_desc_get + usbd_enum.o(.data) refers to usbd_enum.o(i._usb_str_desc_get) for _usb_str_desc_get + usbd_transc.o(i._usb_in0_transc) refers to usbd_transc.o(i.usb_ctl_out) for usb_ctl_out + usbd_transc.o(i._usb_out0_transc) refers to usbd_transc.o(i.usb_ctl_status_in) for usb_ctl_status_in + usbd_transc.o(i._usb_setup_transc) refers to usbd_transc.o(i.usb_stall_transc) for usb_stall_transc + usbd_transc.o(i._usb_setup_transc) refers to usbd_enum.o(i.usbd_standard_request) for usbd_standard_request + usbd_transc.o(i._usb_setup_transc) refers to usbd_enum.o(i.usbd_class_request) for usbd_class_request + usbd_transc.o(i._usb_setup_transc) refers to usbd_enum.o(i.usbd_vendor_request) for usbd_vendor_request + usbd_transc.o(i._usb_setup_transc) refers to usbd_transc.o(i.usb_ctl_status_in) for usb_ctl_status_in + usbd_transc.o(i._usb_setup_transc) refers to usbd_core.o(i.usbd_ep_send) for usbd_ep_send + usbd_transc.o(i._usb_setup_transc) refers to usbd_transc.o(i.usb_ctl_out) for usb_ctl_out + custom_hid_core.o(i.custom_hid_data_out) refers to debug.o(i.core_debug_enter) for core_debug_enter + custom_hid_core.o(i.custom_hid_data_out) refers to platform.o(i.set_pc_communication_type) for set_pc_communication_type + custom_hid_core.o(i.custom_hid_data_out) refers to usbd_core.o(i.usbd_ep_recev) for usbd_ep_recev + custom_hid_core.o(i.custom_hid_data_out) refers to base_core.o(.data) for base_core + custom_hid_core.o(i.custom_hid_deinit) refers to custom_hid_core.o(i.usbd_ep_deinit) for usbd_ep_deinit + custom_hid_core.o(i.custom_hid_init) refers to memseta.o(.text) for __aeabi_memclr + custom_hid_core.o(i.custom_hid_init) refers to custom_hid_core.o(i.usbd_ep_init) for usbd_ep_init + custom_hid_core.o(i.custom_hid_init) refers to usbd_core.o(i.usbd_ep_recev) for usbd_ep_recev + custom_hid_core.o(i.custom_hid_init) refers to custom_hid_core.o(.bss) for hid_handler + custom_hid_core.o(i.custom_hid_init) refers to custom_hid_core.o(.data) for custom_hid_config_desc + custom_hid_core.o(i.custom_hid_report_send) refers to usbd_core.o(i.usbd_ep_send) for usbd_ep_send + custom_hid_core.o(i.custom_hid_req_handler) refers to custom_hid_core.o(i.usb_transc_config) for usb_transc_config + custom_hid_core.o(i.custom_hid_req_handler) refers to custom_hid_core.o(.constdata) for customhid_report_descriptor + custom_hid_core.o(i.custom_hid_req_handler) refers to custom_hid_core.o(.data) for custom_hid_config_desc + custom_hid_core.o(.data) refers to custom_hid_core.o(i.custom_hid_init) for custom_hid_init + custom_hid_core.o(.data) refers to custom_hid_core.o(i.custom_hid_deinit) for custom_hid_deinit + custom_hid_core.o(.data) refers to custom_hid_core.o(i.custom_hid_req_handler) for custom_hid_req_handler + custom_hid_core.o(.data) refers to custom_hid_core.o(i.custom_hid_data_in) for custom_hid_data_in + custom_hid_core.o(.data) refers to custom_hid_core.o(i.custom_hid_data_out) for custom_hid_data_out + buzzer.o(i.beep_ctrl) refers to buzzer.o(i.Beep) for Beep + i2c.o(i.EE_ReadBytes) refers to i2c.o(i.i2c_start) for i2c_start + i2c.o(i.EE_ReadBytes) refers to i2c.o(i.i2c_send_byte) for i2c_send_byte + i2c.o(i.EE_ReadBytes) refers to i2c.o(i.i2c_read_byte) for i2c_read_byte + i2c.o(i.EE_ReadBytes) refers to i2c.o(i.i2c_stop) for i2c_stop + i2c.o(i.EE_WriteBytes) refers to i2c.o(i.i2c_start) for i2c_start + i2c.o(i.EE_WriteBytes) refers to i2c.o(i.i2c_send_byte) for i2c_send_byte + i2c.o(i.EE_WriteBytes) refers to i2c.o(i.i2c_stop) for i2c_stop + i2c.o(i.EE_WriteBytes) refers to platform.o(i.basic_delay_ms) for basic_delay_ms + i2c.o(i.SET_SDA_IN) refers to memseta.o(.text) for __aeabi_memclr4 + i2c.o(i.SET_SDA_IN) refers to hw_mcuio.o(i.HW_GD_GPIO_Init) for HW_GD_GPIO_Init + i2c.o(i.SET_SDA_OUT) refers to memseta.o(.text) for __aeabi_memclr4 + i2c.o(i.SET_SDA_OUT) refers to hw_mcuio.o(i.HW_GD_GPIO_Init) for HW_GD_GPIO_Init + i2c.o(i.i2c_init) refers to memseta.o(.text) for __aeabi_memclr4 + i2c.o(i.i2c_init) refers to hw_mcuio.o(i.HW_GD_GPIO_Init) for HW_GD_GPIO_Init + i2c.o(i.i2c_read_byte) refers to i2c.o(i.SET_SDA_IN) for SET_SDA_IN + i2c.o(i.i2c_read_byte) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + i2c.o(i.i2c_read_byte) refers to i2c.o(i.i2c_delay) for i2c_delay + i2c.o(i.i2c_read_byte) refers to gd32f30x_gpio.o(i.gpio_input_bit_get) for gpio_input_bit_get + i2c.o(i.i2c_read_byte) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + i2c.o(i.i2c_read_byte) refers to i2c.o(i.SET_SDA_OUT) for SET_SDA_OUT + i2c.o(i.i2c_send_byte) refers to i2c.o(i.SET_SDA_OUT) for SET_SDA_OUT + i2c.o(i.i2c_send_byte) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + i2c.o(i.i2c_send_byte) refers to i2c.o(i.i2c_delay) for i2c_delay + i2c.o(i.i2c_send_byte) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + i2c.o(i.i2c_send_byte) refers to i2c.o(i.SET_SDA_IN) for SET_SDA_IN + i2c.o(i.i2c_send_byte) refers to gd32f30x_gpio.o(i.gpio_input_bit_get) for gpio_input_bit_get + i2c.o(i.i2c_start) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + i2c.o(i.i2c_start) refers to i2c.o(i.i2c_delay) for i2c_delay + i2c.o(i.i2c_start) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + i2c.o(i.i2c_stop) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + i2c.o(i.i2c_stop) refers to i2c.o(i.i2c_delay) for i2c_delay + i2c.o(i.i2c_stop) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + i2c.o(i.i2c_test_basic) refers to i2c.o(i.EE_WriteBytes) for EE_WriteBytes + i2c.o(i.i2c_test_basic) refers to i2c.o(i.EE_ReadBytes) for EE_ReadBytes + led.o(i.lcd_back_light_ctrl) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + led.o(i.lcd_back_light_ctrl) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + led.o(i.led1_control) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + led.o(i.led1_control) refers to hw_mcuio.o(i.HW_GD_GPIO_TogglePin) for HW_GD_GPIO_TogglePin + led.o(i.led1_control) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + led.o(i.led2_control) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + led.o(i.led2_control) refers to hw_mcuio.o(i.HW_GD_GPIO_TogglePin) for HW_GD_GPIO_TogglePin + led.o(i.led2_control) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + platform.o(i.CRC16) refers to platform.o(.constdata) for crc_table2 + platform.o(i.ant_sw) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + platform.o(i.ant_sw) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + platform.o(i.get_hard_flag) refers to platform.o(.data) for hard_200s_ver3 + platform.o(i.get_pc_communication_type) refers to platform.o(.data) for pc_tcpip_usb_com_type_flag + platform.o(i.get_usb_status) refers to main.o(.bss) for usbd_custom_hid + platform.o(i.operation_debug_io) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + platform.o(i.set_hard_flag) refers to platform.o(.data) for hard_200s_ver3 + platform.o(i.set_pc_communication_type) refers to platform.o(.data) for pc_tcpip_usb_com_type_flag + platform.o(i.set_pc_communication_type) refers to hw_mcuio.o(i.HW_GD_CUSTOM_HID_REPORT_SEND) for HW_GD_CUSTOM_HID_REPORT_SEND + platform.o(i.user_20ms_timer) refers to transparentupgrade.o(i.update_2_timer) for update_2_timer + platform.o(i.user_2ms5_timer) refers to function_broadcast.o(i.base_broadcast_process_2ms5) for base_broadcast_process_2ms5 + platform.o(i.user_2ms5_timer) refers to function_whitelist.o(i.whitelist__2ms5_call) for whitelist__2ms5_call + platform.o(i.user_2ms5_timer) refers to platform.o(.data) for mainloop_2ms5_flag + platform.o(.data) refers to platform.o(i.CLI) for CLI + platform.o(.data) refers to platform.o(i.SEI) for SEI + platform.o(.data) refers to platform.o(i.NVIC_SystemReset) for NVIC_SystemReset + platform.o(.data) refers to hw_mcuio.o(i.HW_GD_Delay) for HW_GD_Delay + platform.o(.data) refers to platform.o(i.get_stm32_chip_id) for get_stm32_chip_id + platform.o(.data) refers to hw_mcuio.o(i.HW_GD_CUSTOM_HID_REPORT_SEND) for HW_GD_CUSTOM_HID_REPORT_SEND + platform.o(.data) refers to platform.o(i.get_usb_status) for get_usb_status + platform.o(.data) refers to i2c.o(i.EE_WriteBytes) for EE_WriteBytes + platform.o(.data) refers to i2c.o(i.EE_ReadBytes) for EE_ReadBytes + platform.o(.data) refers to rf24l01 - multi.o(i.rf_SendPacket) for rf_SendPacket + platform.o(.data) refers to rf24l01 - multi.o(i.rf_setfreq) for rf_setfreq + platform.o(.data) refers to rf24l01 - multi.o(i.rf_set_PA_Mode) for rf_set_PA_Mode + platform.o(.data) refers to rf24l01 - multi.o(i.rf_initial) for rf_initial + platform.o(.data) refers to rf24l01 - multi.o(i.rf_set_syncode) for rf_set_syncode + platform.o(.data) refers to led.o(i.led1_control) for led1_control + platform.o(.data) refers to led.o(i.led2_control) for led2_control + platform.o(.data) refers to platform.o(i.ant_sw) for ant_sw + platform.o(.data) refers to buzzer.o(i.beep_ctrl) for beep_ctrl + platform.o(.data) refers to platform.o(i.uart1_send_datas) for uart1_send_datas + rf24l01 - multi.o(i.DelayUs) refers to rf24l01 - multi.o(i._24R1_delay_us) for _24R1_delay_us + rf24l01 - multi.o(i.NRF24L01_Clear_IRQ_Flag) refers to rf24l01 - multi.o(i.NRF24L01_Read_Status_Register) for NRF24L01_Read_Status_Register + rf24l01 - multi.o(i.NRF24L01_Clear_IRQ_Flag) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.NRF24L01_Clear_IRQ_Flag) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.NRF24L01_Clear_IRQ_Flag) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.NRF24L01_Clear_IRQ_Flag) refers to rf24l01 - multi.o(.constdata) for rf_cs_pin + rf24l01 - multi.o(i.NRF24L01_Flush_Rx_Fifo) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.NRF24L01_Flush_Rx_Fifo) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.NRF24L01_Flush_Rx_Fifo) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.NRF24L01_Flush_Rx_Fifo) refers to rf24l01 - multi.o(.constdata) for rf_cs_pin + rf24l01 - multi.o(i.NRF24L01_Flush_Tx_Fifo) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.NRF24L01_Flush_Tx_Fifo) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.NRF24L01_Flush_Tx_Fifo) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.NRF24L01_Flush_Tx_Fifo) refers to rf24l01 - multi.o(.constdata) for rf_cs_pin + rf24l01 - multi.o(i.NRF24L01_Read_Buf) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.NRF24L01_Read_Buf) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.NRF24L01_Read_Buf) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte_N) for drv_spi_read_write_byte_N + rf24l01 - multi.o(i.NRF24L01_Read_Buf) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.NRF24L01_Read_Buf) refers to rf24l01 - multi.o(.constdata) for rf_cs_pin + rf24l01 - multi.o(i.NRF24L01_Read_Reg) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.NRF24L01_Read_Reg) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.NRF24L01_Read_Reg) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.NRF24L01_Read_Reg) refers to rf24l01 - multi.o(.constdata) for rf_cs_pin + rf24l01 - multi.o(i.NRF24L01_Read_Rx_Payload) refers to rf24l01 - multi.o(i.NRF24L01_Read_Reg) for NRF24L01_Read_Reg + rf24l01 - multi.o(i.NRF24L01_Read_Rx_Payload) refers to rf24l01 - multi.o(i.NRF24L01_Read_Top_Fifo_Width) for NRF24L01_Read_Top_Fifo_Width + rf24l01 - multi.o(i.NRF24L01_Read_Rx_Payload) refers to rf24l01 - multi.o(i.NRF24L01_Flush_Rx_Fifo) for NRF24L01_Flush_Rx_Fifo + rf24l01 - multi.o(i.NRF24L01_Read_Rx_Payload) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.NRF24L01_Read_Rx_Payload) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.NRF24L01_Read_Rx_Payload) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte_N) for drv_spi_read_write_byte_N + rf24l01 - multi.o(i.NRF24L01_Read_Rx_Payload) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.NRF24L01_Read_Rx_Payload) refers to rf24l01 - multi.o(.constdata) for rf_cs_pin + rf24l01 - multi.o(i.NRF24L01_Read_Status_Register) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.NRF24L01_Read_Status_Register) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.NRF24L01_Read_Status_Register) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.NRF24L01_Read_Status_Register) refers to rf24l01 - multi.o(.constdata) for rf_cs_pin + rf24l01 - multi.o(i.NRF24L01_Read_Top_Fifo_Width) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.NRF24L01_Read_Top_Fifo_Width) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.NRF24L01_Read_Top_Fifo_Width) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.NRF24L01_Read_Top_Fifo_Width) refers to rf24l01 - multi.o(.constdata) for rf_cs_pin + rf24l01 - multi.o(i.NRF24L01_SetPA) refers to rf24l01 - multi.o(i.NRF24L01_Read_Reg) for NRF24L01_Read_Reg + rf24l01 - multi.o(i.NRF24L01_SetPA) refers to rf24l01 - multi.o(i.NRF24L01_Write_Reg) for NRF24L01_Write_Reg + rf24l01 - multi.o(i.NRF24L01_Set_RxAddr) refers to rf24l01 - multi.o(i.NRF24L01_Write_Buf) for NRF24L01_Write_Buf + rf24l01 - multi.o(i.NRF24L01_Set_Speed) refers to rf24l01 - multi.o(i.NRF24L01_Read_Reg) for NRF24L01_Read_Reg + rf24l01 - multi.o(i.NRF24L01_Set_Speed) refers to rf24l01 - multi.o(i.NRF24L01_Write_Reg) for NRF24L01_Write_Reg + rf24l01 - multi.o(i.NRF24L01_Set_TxAddr) refers to rf24l01 - multi.o(i.NRF24L01_Write_Buf) for NRF24L01_Write_Buf + rf24l01 - multi.o(i.NRF24L01_Write_Buf) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.NRF24L01_Write_Buf) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.NRF24L01_Write_Buf) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte_N) for drv_spi_read_write_byte_N + rf24l01 - multi.o(i.NRF24L01_Write_Buf) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.NRF24L01_Write_Buf) refers to rf24l01 - multi.o(.constdata) for rf_cs_pin + rf24l01 - multi.o(i.NRF24L01_Write_Reg) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.NRF24L01_Write_Reg) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.NRF24L01_Write_Reg) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.NRF24L01_Write_Reg) refers to rf24l01 - multi.o(.constdata) for rf_ce_pin + rf24l01 - multi.o(i.NRF24L01_Write_Tx_Payload_NoAck) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.NRF24L01_Write_Tx_Payload_NoAck) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.NRF24L01_Write_Tx_Payload_NoAck) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte_N) for drv_spi_read_write_byte_N + rf24l01 - multi.o(i.NRF24L01_Write_Tx_Payload_NoAck) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.NRF24L01_Write_Tx_Payload_NoAck) refers to rf24l01 - multi.o(.constdata) for rf_cs_pin + rf24l01 - multi.o(i.NRF24L01_check) refers to rf24l01 - multi.o(i.NRF24L01_Write_Buf) for NRF24L01_Write_Buf + rf24l01 - multi.o(i.NRF24L01_check) refers to rf24l01 - multi.o(i.NRF24L01_Read_Buf) for NRF24L01_Read_Buf + rf24l01 - multi.o(i.RF24L01_Chan) refers to rf24l01 - multi.o(i.NRF24L01_Write_Reg) for NRF24L01_Write_Reg + rf24l01 - multi.o(i.RF24L01_ClrIRQ) refers to rf24l01 - multi.o(i.NRF24L01_Clear_IRQ_Flag) for NRF24L01_Clear_IRQ_Flag + rf24l01 - multi.o(i.RF24L01_RxOn) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.RF24L01_RxOn) refers to rf24l01 - multi.o(i.RF24L01_Set_Mode) for RF24L01_Set_Mode + rf24l01 - multi.o(i.RF24L01_RxOn) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.RF24L01_RxOn) refers to rf24l01 - multi.o(.constdata) for rf_ce_pin + rf24l01 - multi.o(i.RF24L01_Set_Mode) refers to rf24l01 - multi.o(i.NRF24L01_Read_Reg) for NRF24L01_Read_Reg + rf24l01 - multi.o(i.RF24L01_Set_Mode) refers to rf24l01 - multi.o(i.NRF24L01_Write_Reg) for NRF24L01_Write_Reg + rf24l01 - multi.o(i.drv_spi_read_write_byte) refers to hw_mcuio.o(i.HW_GD_SPI0_TransmitReceive) for HW_GD_SPI0_TransmitReceive + rf24l01 - multi.o(i.drv_spi_read_write_byte_N) refers to hw_mcuio.o(i.HW_GD_SPI0_TransmitReceive) for HW_GD_SPI0_TransmitReceive + rf24l01 - multi.o(i.get_tx_ok_flag) refers to rf24l01 - multi.o(.data) for tx_ok_flag + rf24l01 - multi.o(i.rf_Irq) refers to rf24l01 - multi.o(i.NRF24L01_Read_Reg) for NRF24L01_Read_Reg + rf24l01 - multi.o(i.rf_Irq) refers to rf24l01 - multi.o(i.NRF24L01_Write_Reg) for NRF24L01_Write_Reg + rf24l01 - multi.o(i.rf_Irq) refers to rf24l01 - multi.o(i.NRF24L01_Read_Rx_Payload) for NRF24L01_Read_Rx_Payload + rf24l01 - multi.o(i.rf_Irq) refers to rf24l01 - multi.o(i.set_tx_ok_flag) for set_tx_ok_flag + rf24l01 - multi.o(i.rf_Irq) refers to multi_channel.o(i.rf_modual__tx_interrupt_counter) for rf_modual__tx_interrupt_counter + rf24l01 - multi.o(i.rf_Irq) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.rf_Irq) refers to rf24l01 - multi.o(i.RF24L01_ClrIRQ) for RF24L01_ClrIRQ + rf24l01 - multi.o(i.rf_Irq) refers to rf24l01 - multi.o(i.RF24L01_RxOn) for RF24L01_RxOn + rf24l01 - multi.o(i.rf_Irq) refers to base_core.o(.data) for base_core + rf24l01 - multi.o(i.rf_Irq) refers to rf24l01 - multi.o(.constdata) for rf_paTX_pin + rf24l01 - multi.o(i.rf_SendPacket) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + rf24l01 - multi.o(i.rf_SendPacket) refers to rf24l01 - multi.o(i.RF24L01_Set_Mode) for RF24L01_Set_Mode + rf24l01 - multi.o(i.rf_SendPacket) refers to rf24l01 - multi.o(i.drv_spi_read_write_byte) for drv_spi_read_write_byte + rf24l01 - multi.o(i.rf_SendPacket) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + rf24l01 - multi.o(i.rf_SendPacket) refers to fucntion_fastmatch.o(i.check_fastmatch_lowerPA) for check_fastmatch_lowerPA + rf24l01 - multi.o(i.rf_SendPacket) refers to rf24l01 - multi.o(i.NRF24L01_Write_Tx_Payload_NoAck) for NRF24L01_Write_Tx_Payload_NoAck + rf24l01 - multi.o(i.rf_SendPacket) refers to rf24l01 - multi.o(i.DelayUs) for DelayUs + rf24l01 - multi.o(i.rf_SendPacket) refers to rf24l01 - multi.o(.constdata) for rf_ce_pin + rf24l01 - multi.o(i.rf_initial) refers to rf24l01 - multi.o(i.NRF24L01_check) for NRF24L01_check + rf24l01 - multi.o(i.rf_initial) refers to rf24l01 - multi.o(i.NRF24L01_Clear_IRQ_Flag) for NRF24L01_Clear_IRQ_Flag + rf24l01 - multi.o(i.rf_initial) refers to rf24l01 - multi.o(i.NRF24L01_Write_Reg) for NRF24L01_Write_Reg + rf24l01 - multi.o(i.rf_initial) refers to rf24l01 - multi.o(i.NRF24L01_Set_Speed) for NRF24L01_Set_Speed + rf24l01 - multi.o(i.rf_initial) refers to rf24l01 - multi.o(i.NRF24L01_SetPA) for NRF24L01_SetPA + rf24l01 - multi.o(i.rf_initial) refers to rf24l01 - multi.o(i.rf_set_syncode) for rf_set_syncode + rf24l01 - multi.o(i.rf_initial) refers to rf24l01 - multi.o(i.NRF24L01_Flush_Tx_Fifo) for NRF24L01_Flush_Tx_Fifo + rf24l01 - multi.o(i.rf_initial) refers to rf24l01 - multi.o(i.NRF24L01_Flush_Rx_Fifo) for NRF24L01_Flush_Rx_Fifo + rf24l01 - multi.o(i.rf_initial) refers to rf24l01 - multi.o(i.RF24L01_RxOn) for RF24L01_RxOn + rf24l01 - multi.o(i.rf_initial) refers to function.o(.data) for function + rf24l01 - multi.o(i.rf_set_PA_Mode) refers to fucntion_fastmatch.o(i.check_fastmatch_lowerPA) for check_fastmatch_lowerPA + rf24l01 - multi.o(i.rf_set_PA_Mode) refers to rf24l01 - multi.o(i.NRF24L01_SetPA) for NRF24L01_SetPA + rf24l01 - multi.o(i.rf_set_syncode) refers to rf24l01 - multi.o(i.NRF24L01_Set_TxAddr) for NRF24L01_Set_TxAddr + rf24l01 - multi.o(i.rf_set_syncode) refers to rf24l01 - multi.o(i.NRF24L01_Set_RxAddr) for NRF24L01_Set_RxAddr + rf24l01 - multi.o(i.rf_setfreq) refers to platform.o(i.CLI) for CLI + rf24l01 - multi.o(i.rf_setfreq) refers to rf24l01 - multi.o(i.RF24L01_Chan) for RF24L01_Chan + rf24l01 - multi.o(i.rf_setfreq) refers to rf24l01 - multi.o(i.RF24L01_RxOn) for RF24L01_RxOn + rf24l01 - multi.o(i.rf_setfreq) refers to platform.o(i.SEI) for SEI + rf24l01 - multi.o(i.set_tx_ok_flag) refers to rf24l01 - multi.o(.data) for tx_ok_flag + hw_mcuio.o(i.HW_GD_CUSTOM_HID_REPORT_SEND) refers to custom_hid_core.o(i.custom_hid_report_send) for custom_hid_report_send + hw_mcuio.o(i.HW_GD_CUSTOM_HID_REPORT_SEND) refers to main.o(.bss) for usbd_custom_hid + hw_mcuio.o(i.HW_GD_Delay) refers to hw_mcuio.o(i.HW_GD_GetTick) for HW_GD_GetTick + hw_mcuio.o(i.HW_GD_GPIO_Init) refers to gd32f30x_gpio.o(i.gpio_init) for gpio_init + hw_mcuio.o(i.HW_GD_GPIO_TogglePin) refers to gd32f30x_gpio.o(i.gpio_input_bit_get) for gpio_input_bit_get + hw_mcuio.o(i.HW_GD_GPIO_TogglePin) refers to gd32f30x_gpio.o(i.gpio_bit_reset) for gpio_bit_reset + hw_mcuio.o(i.HW_GD_GPIO_TogglePin) refers to gd32f30x_gpio.o(i.gpio_bit_set) for gpio_bit_set + hw_mcuio.o(i.HW_GD_GetTick) refers to hw_mcuio.o(.data) for systick + hw_mcuio.o(i.HW_GD_IncTick) refers to hw_mcuio.o(.data) for systick + hw_mcuio.o(i.HW_GD_SPI0_Init) refers to gd32f30x_rcu.o(i.rcu_periph_clock_enable) for rcu_periph_clock_enable + hw_mcuio.o(i.HW_GD_SPI0_Init) refers to gd32f30x_gpio.o(i.gpio_init) for gpio_init + hw_mcuio.o(i.HW_GD_SPI0_Init) refers to gd32f30x_spi.o(i.spi_init) for spi_init + hw_mcuio.o(i.HW_GD_SPI0_Init) refers to gd32f30x_spi.o(i.spi_enable) for spi_enable + hw_mcuio.o(i.HW_GD_SPI0_TransmitReceive) refers to hw_mcuio.o(i.HW_GD_SPI_TransmitReceiveOneByte) for HW_GD_SPI_TransmitReceiveOneByte + hw_mcuio.o(i.HW_GD_SPI_TransmitReceiveOneByte) refers to gd32f30x_spi.o(i.spi_i2s_flag_get) for spi_i2s_flag_get + hw_mcuio.o(i.HW_GD_SPI_TransmitReceiveOneByte) refers to gd32f30x_spi.o(i.spi_i2s_data_transmit) for spi_i2s_data_transmit + hw_mcuio.o(i.HW_GD_SPI_TransmitReceiveOneByte) refers to gd32f30x_spi.o(i.spi_i2s_data_receive) for spi_i2s_data_receive + base_core.o(i._debug_core__RTT_read) refers to segger_rtt.o(i.SEGGER_RTT_Read) for SEGGER_RTT_Read + base_core.o(i._debug_core__RTT_read) refers to base_core.o(i._debug_core__printf) for _debug_core__printf + base_core.o(i._debug_core__RTT_read) refers to segger_rtt_printf.o(i.SEGGER_RTT_printf) for SEGGER_RTT_printf + base_core.o(i._debug_core__init_parameter_datapos_change) refers to memseta.o(.text) for __aeabi_memclr + base_core.o(i._debug_core__init_parameter_datapos_change) refers to base_core.o(.bss) for debug_rxkp + base_core.o(i._debug_core__printf) refers to base_core.o(i.debug_check_allerr) for debug_check_allerr + base_core.o(i._debug_core__printf) refers to segger_rtt_printf.o(i.SEGGER_RTT_printf) for SEGGER_RTT_printf + base_core.o(i._debug_core__printf) refers to platform.o(i.basic_delay_us) for basic_delay_us + base_core.o(i._debug_core__printf) refers to base_process_pc_enter.o(.bss) for vote_beacon + base_core.o(i._debug_core__printf) refers to base_core.o(.conststring) for .conststring + base_core.o(i._debug_core__printf) refers to base_core.o(.bss) for debug_ackkpcnt + base_core.o(i._debug_core__printf) refers to base_core.o(.data) for debug_subject + base_core.o(i._debug_core__record_ackkp_info) refers to base_core.o(.bss) for debug_ackkpcnt + base_core.o(i._debug_core__record_rxkp_info) refers to base_core.o(i.debug_set_buf_bit) for debug_set_buf_bit + base_core.o(i._debug_core__record_rxkp_info) refers to base_core.o(.bss) for debug_rxkp + base_core.o(i._debug_set_subject) refers to base_core.o(.data) for debug_subject + base_core.o(i.base_core_force_sysmode0) refers to common_math.o(i.mem_set) for mem_set + base_core.o(i.base_core_force_sysmode0) refers to base_process_pc_enter.o(.bss) for vote_beacon + base_core.o(i.base_core_force_sysmode0) refers to base_core.o(.bss) for kernel + base_core.o(i.base_core_init_all) refers to function_e2prom.o(i.base_read_e2prom_parameter) for base_read_e2prom_parameter + base_core.o(i.base_core_init_all) refers to multi_channel.o(i.multi_chan_init) for multi_chan_init + base_core.o(i.base_core_init_all) refers to vote__report.o(i.vote_data_parameter_init) for vote_data_parameter_init + base_core.o(i.base_core_init_all) refers to base_process_pc_enter.o(i.base_process_pc_init) for base_process_pc_init + base_core.o(i.base_core_init_all) refers to base_process_rx_keypad.o(i.base_process_keyapad_init) for base_process_keyapad_init + base_core.o(i.base_core_init_all) refers to base_core.o(i._debug_core__init) for _debug_core__init + base_core.o(i.base_core_main_loop) refers to base_process_pc_enter.o(i.base_process_pc_data) for base_process_pc_data + base_core.o(i.base_core_main_loop) refers to transfer_keypad_pc.o(i.keypad_transfer2pc_data_fetch) for keypad_transfer2pc_data_fetch + base_core.o(i.base_core_main_loop) refers to base_core.o(i._debug_core__RTT_read) for _debug_core__RTT_read + base_core.o(i.base_core_main_loop) refers to base_core.o(.bss) for kernel + base_core.o(i.base_core_main_loop) refers to function.o(.data) for function + base_core.o(i.debug_check_allerr) refers to base_core.o(.bss) for debug_rxkp + base_core.o(i.debug_check_allerr) refers to base_core.o(.data) for debug_subject + base_core.o(i.debug_check_err) refers to base_core.o(.data) for debug_subject + base_core.o(i.get_base_status) refers to base_process_pc_enter.o(.bss) for vote_beacon + base_core.o(i.get_base_status) refers to base_core.o(.bss) for kernel + base_core.o(i.get_datapos) refers to base_process_pc_enter.o(.bss) for vote_beacon + base_core.o(i.get_pc_connect_status) refers to base_core.o(.bss) for kernel + base_core.o(i.get_pc_connect_status_acc) refers to base_core.o(.bss) for kernel + base_core.o(i.get_permit_dispaly_status) refers to base_core.o(.bss) for kernel + base_core.o(i.refresh_pc_connect_status) refers to platform.o(.data) for platform + base_core.o(i.refresh_pc_connect_status) refers to base_core.o(.bss) for kernel + base_core.o(i.refresh_rcvRF_indicate) refers to base_core.o(.bss) for kernel + base_core.o(i.refresh_rcvRF_indicate) refers to platform.o(.data) for platform + base_core.o(i.set_base_hard_firmware_info) refers to base_process_pc_enter.o(.bss) for base_hdinfo + base_core.o(i.set_base_hard_firmware_info) refers to function.o(.data) for function + base_core.o(i.timer_20ms_function) refers to base_core.o(.bss) for kernel + base_core.o(i.timer_20ms_function) refers to platform.o(.data) for platform + base_core.o(.data) refers to base_core.o(i.get_core_version) for get_core_version + base_core.o(.data) refers to base_core.o(i.base_core_init_all) for base_core_init_all + base_core.o(.data) refers to base_core.o(i.base_core_main_loop) for base_core_main_loop + base_core.o(.data) refers to base_timer.o(i.base_core_2ms5_isr) for base_core_2ms5_isr + base_core.o(.data) refers to base_timer.o(i.base_core_20ms_isr) for base_core_20ms_isr + base_core.o(.data) refers to base_timer.o(i.base_core_28ms_isr) for base_core_28ms_isr + base_core.o(.data) refers to base_process_pc_enter.o(i.get_base_match_code) for get_base_match_code + base_core.o(.data) refers to base_process_pc_enter.o(i.get_base_id) for get_base_id + base_core.o(.data) refers to base_process_pc_enter.o(i.get_base_log_mode) for get_base_log_mode + base_core.o(.data) refers to multi_channel.o(i.process_setup_single_chan) for process_setup_single_chan + base_core.o(.data) refers to multi_channel.o(i.get_base_main_rfchannel) for get_base_main_rfchannel + base_core.o(.data) refers to multi_channel.o(i.get_main_rf_hard_id) for get_main_rf_hard_id + base_core.o(.data) refers to multi_channel.o(i.get_whitelist_rfid) for get_whitelist_rfid + base_core.o(.data) refers to base_process_tx_keypad.o(i.send_to_keypad_user_hardID) for send_to_keypad_user_hardID + base_core.o(.data) refers to base_process_tx_keypad.o(i.base_send_beacon_switch) for base_send_beacon_switch + base_core.o(.data) refers to base_process_tx_keypad.o(i.get_base_send_beacon_status) for get_base_send_beacon_status + base_core.o(.data) refers to base_process_rx_keypad.o(i.keypad_rf_data_save) for keypad_rf_data_save + base_core.o(.data) refers to base_process_pc_enter.o(i.base_tx_to_pc_sub) for base_tx_to_pc_sub + base_core.o(.data) refers to base_core.o(i.get_datapos) for get_datapos + base_core.o(.data) refers to base_process_pc_enter.o(i.pcrx_data_save) for pcrx_data_save + base_core.o(.data) refers to base_core.o(i.get_base_status) for get_base_status + base_core.o(.data) refers to base_core.o(i.get_pc_connect_status) for get_pc_connect_status + base_core.o(.data) refers to base_core.o(i.get_pc_connect_status_acc) for get_pc_connect_status_acc + base_core.o(.data) refers to base_core.o(i.get_permit_dispaly_status) for get_permit_dispaly_status + base_core.o(.data) refers to base_core.o(i.base_core_force_sysmode0) for base_core_force_sysmode0 + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_ack) refers to common_math.o(i.mem_set) for mem_set + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_ack) refers to base_process_pc_enter.o(i.get_base_id) for get_base_id + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_ack) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_ack) refers to base_process_pc_enter.o(i.base_tx_to_pc_sub) for base_tx_to_pc_sub + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to function_e2prom.o(i.base_write_e2prom) for base_write_e2prom + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_ack) for pc_cmd_0x60_ack + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to base_core.o(i._debug_core__init_parameter_datapos_change) for _debug_core__init_parameter_datapos_change + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to base_core.o(i._debug_set_subject) for _debug_set_subject + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to vote__report.o(i.vote_data_report_startup) for vote_data_report_startup + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to vote__process.o(i.vote_status_clear_confirmed) for vote_status_clear_confirmed + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to base_process_pc_cmd_0x60.o(i._0x60_basic_delay_ms) for _0x60_basic_delay_ms + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to base_process_pc_enter.o(.bss) for basic_beacon + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to base_core.o(.bss) for kernel + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to function.o(.data) for function + base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) refers to base_process_pc_enter.o(.data) for basic_beacon_crs2 + base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) refers to base_process_pc_enter.o(i.assert_base_log_mode) for assert_base_log_mode + base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) refers to function_e2prom.o(i.base_write_e2prom) for base_write_e2prom + base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) refers to base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_ack) for pc_cmd_0x61_ack + base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) refers to multi_channel.o(i.process_setup_multi_chan) for process_setup_multi_chan + base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) refers to base_process_tx_keypad.o(i.set_ext_basicbeacon_startup_flag) for set_ext_basicbeacon_startup_flag + base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) refers to base_process_pc_enter.o(.bss) for base_name_log_mode + base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) refers to base_process_pc_enter.o(.data) for multi_freq_setup + base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) refers to function.o(.data) for function + base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) refers to multi_channel.o(.bss) for multi + base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) refers to function_e2prom.o(i.base_read_e2prom) for base_read_e2prom + base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) refers to common_math.o(i.mem_compare) for mem_compare + base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) refers to function_e2prom.o(i.base_write_e2prom) for base_write_e2prom + base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) refers to multi_channel.o(i.get_main_rf_hard_id) for get_main_rf_hard_id + base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) refers to function_e2prom.o(i.calc_custom_rf_sync_code) for calc_custom_rf_sync_code + base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) refers to base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_ack) for pc_cmd_0x61_ack + base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) refers to base_process_pc_cmd_0x61.o(.data) for oem_code_check_rslt + base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) refers to platform.o(.data) for platform + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_ack) refers to common_math.o(i.mem_set) for mem_set + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_ack) refers to base_process_pc_enter.o(i.get_base_id) for get_base_id + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_ack) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_ack) refers to base_process_pc_enter.o(i.base_tx_to_pc_sub) for base_tx_to_pc_sub + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to base_process_pc_enter.o(i.assert_base_id) for assert_base_id + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to base_process_tx_keypad.o(i.assert_base_channel) for assert_base_channel + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to multi_channel.o(i.process_setup_single_chan) for process_setup_single_chan + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to multi_channel.o(i.get_main_rf_hard_id) for get_main_rf_hard_id + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_ack) for pc_cmd_0x61_ack + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to base_core.o(i.set_base_hard_firmware_info) for set_base_hard_firmware_info + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to function_e2prom.o(i.base_write_e2prom) for base_write_e2prom + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to base_process_pc_enter.o(i.get_base_match_code) for get_base_match_code + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) for _0x61_soft_dog_sub + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) for _0x61_AUX_CONFIG_sub + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to common_math.o(i.mem_set) for mem_set + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to base_process_tx_keypad.o(i.set_keypad_crc_config) for set_keypad_crc_config + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to base_process_pc_enter.o(.data) for base_config + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to platform.o(.data) for platform + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to multi_channel.o(.bss) for multi + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to base_process_pc_enter.o(.bss) for base_hdinfo + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to function.o(.data) for function + base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) refers to base_core.o(.bss) for kernel + base_process_pc_enter.o(i.assert_base_id) refers to base_process_pc_enter.o(.data) for base_config + base_process_pc_enter.o(i.assert_base_log_mode) refers to function.o(.data) for function + base_process_pc_enter.o(i.assert_base_log_mode) refers to base_process_pc_enter.o(.bss) for base_name_log_mode + base_process_pc_enter.o(i.base_process_pc_data) refers to base_process_pc_enter.o(i.pcrx_data_fetch) for pcrx_data_fetch + base_process_pc_enter.o(i.base_process_pc_data) refers to base_process_pc_enter.o(i.get_base_id) for get_base_id + base_process_pc_enter.o(i.base_process_pc_data) refers to base_core.o(i.refresh_pc_connect_status) for refresh_pc_connect_status + base_process_pc_enter.o(i.base_process_pc_data) refers to base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) for pc_cmd_0x60_process + base_process_pc_enter.o(i.base_process_pc_data) refers to base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) for pc_cmd_0x61_process + base_process_pc_enter.o(i.base_process_pc_data) refers to transfer_keypad_pc.o(i.pc_transfer2keypad_data_save) for pc_transfer2keypad_data_save + base_process_pc_enter.o(i.base_process_pc_init) refers to base_process_pc_enter.o(i.pcrx_init_queue) for pcrx_init_queue + base_process_pc_enter.o(i.base_process_pc_init) refers to transfer_keypad_pc.o(i.transfer2pc_init_queue) for transfer2pc_init_queue + base_process_pc_enter.o(i.base_tx_to_pc_sub) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_pc_enter.o(i.base_tx_to_pc_sub) refers to common_math.o(i.mem_set) for mem_set + base_process_pc_enter.o(i.base_tx_to_pc_sub) refers to platform.o(.data) for platform + base_process_pc_enter.o(i.get_base_id) refers to base_process_pc_enter.o(.data) for base_config + base_process_pc_enter.o(i.get_base_log_mode) refers to base_process_pc_enter.o(.bss) for base_name_log_mode + base_process_pc_enter.o(i.get_base_match_code) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_pc_enter.o(i.get_base_match_code) refers to base_process_pc_enter.o(.bss) for base_name_log_mode + base_process_pc_enter.o(i.get_base_match_code) refers to base_process_pc_enter.o(.data) for base_mac + base_process_pc_enter.o(i.pcrx_data_fetch) refers to queue_circle.o(i.queue_out) for queue_out + base_process_pc_enter.o(i.pcrx_data_fetch) refers to base_process_pc_enter.o(.bss) for pcrx_queue + base_process_pc_enter.o(i.pcrx_data_save) refers to queue_circle.o(i.queue_in) for queue_in + base_process_pc_enter.o(i.pcrx_data_save) refers to base_process_pc_enter.o(.bss) for pcrx_queue + base_process_pc_enter.o(i.pcrx_init_queue) refers to queue_circle.o(i.queue_init) for queue_init + base_process_pc_enter.o(i.pcrx_init_queue) refers to base_process_pc_enter.o(.bss) for pcrx_buf + base_process_rx_keypad.o(i.base_process_keyapad_init) refers to base_process_rx_keypad.o(i.kprx_init_queue) for kprx_init_queue + base_process_rx_keypad.o(i.base_process_keyapad_init) refers to transfer_keypad_pc.o(i.transfer2kp_init_queue) for transfer2kp_init_queue + base_process_rx_keypad.o(i.base_process_keyapad_init) refers to base_process_tx_keypad.o(i.keypad_idsn_clear) for keypad_idsn_clear + base_process_rx_keypad.o(i.base_process_keyapad_init) refers to base_process_tx_keypad.o(i.base_send_beacon_switch) for base_send_beacon_switch + base_process_rx_keypad.o(i.keypad_crs2_mode) refers to base_process_pc_enter.o(i.get_base_log_mode) for get_base_log_mode + base_process_rx_keypad.o(i.keypad_crs2_mode) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_rx_keypad.o(i.keypad_crs2_mode) refers to vote__process.o(i.vote_data_store) for vote_data_store + base_process_rx_keypad.o(i.keypad_crs2_mode) refers to base_process_tx_keypad.o(i.keypad_idsn_save) for keypad_idsn_save + base_process_rx_keypad.o(i.keypad_crs2_mode) refers to base_core.o(i._debug_core__record_rxkp_info) for _debug_core__record_rxkp_info + base_process_rx_keypad.o(i.keypad_crs2_mode) refers to function.o(.data) for function + base_process_rx_keypad.o(i.keypad_crs2_mode) refers to base_process_pc_enter.o(.data) for aux_beats + base_process_rx_keypad.o(i.keypad_crs2_mode) refers to base_core.o(.data) for base_core + base_process_rx_keypad.o(i.keypad_id_mode) refers to common_math.o(i.mem_set) for mem_set + base_process_rx_keypad.o(i.keypad_id_mode) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_rx_keypad.o(i.keypad_id_mode) refers to vote__process.o(i.vote_data_store) for vote_data_store + base_process_rx_keypad.o(i.keypad_id_mode) refers to base_core.o(i._debug_core__record_rxkp_info) for _debug_core__record_rxkp_info + base_process_rx_keypad.o(i.keypad_id_mode) refers to base_process_tx_keypad.o(i.keypad_idsn_save) for keypad_idsn_save + base_process_rx_keypad.o(i.keypad_id_mode) refers to base_process_pc_enter.o(.bss) for vote_beacon + base_process_rx_keypad.o(i.keypad_id_mode) refers to function.o(.data) for function + base_process_rx_keypad.o(i.keypad_rf_data_fetch) refers to queue_circle.o(i.queue_out) for queue_out + base_process_rx_keypad.o(i.keypad_rf_data_fetch) refers to platform.o(.data) for platform + base_process_rx_keypad.o(i.keypad_rf_data_fetch) refers to base_process_rx_keypad.o(.bss) for kprx_queue + base_process_rx_keypad.o(i.keypad_rf_data_process) refers to base_process_rx_keypad.o(i.keypad_rf_data_fetch) for keypad_rf_data_fetch + base_process_rx_keypad.o(i.keypad_rf_data_process) refers to base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) for keypad_rf_data_process_NO_fifo + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to multi_channel.o(i.conver_id) for conver_id + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to base_process_tx_keypad.o(i.keypad_crc_check) for keypad_crc_check + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to common_math.o(i.crc16) for crc16 + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to base_core.o(i.refresh_rcvRF_indicate) for refresh_rcvRF_indicate + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to base_process_pc_enter.o(i.get_base_log_mode) for get_base_log_mode + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to common_math.o(i.mem_compare) for mem_compare + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to base_process_rx_keypad.o(i.keypad_id_mode) for keypad_id_mode + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to base_process_rx_keypad.o(i.keypad_sn_mode) for keypad_sn_mode + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to base_process_rx_keypad.o(i.keypad_crs2_mode) for keypad_crs2_mode + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to transfer_keypad_pc.o(i.keypad_transfer2pc_data_save) for keypad_transfer2pc_data_save + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to function.o(.data) for function + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to base_process_pc_enter.o(.data) for base_mac + base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) refers to base_process_rx_keypad.o(.data) for error_cnt + base_process_rx_keypad.o(i.keypad_rf_data_save) refers to base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) for keypad_rf_data_process_NO_fifo + base_process_rx_keypad.o(i.keypad_sn_mode) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_rx_keypad.o(i.keypad_sn_mode) refers to vote__process.o(i.vote_data_store) for vote_data_store + base_process_rx_keypad.o(i.keypad_sn_mode) refers to base_core.o(i._debug_core__record_rxkp_info) for _debug_core__record_rxkp_info + base_process_rx_keypad.o(i.keypad_sn_mode) refers to base_process_tx_keypad.o(i.keypad_idsn_save) for keypad_idsn_save + base_process_rx_keypad.o(i.keypad_sn_mode) refers to function.o(.data) for function + base_process_rx_keypad.o(i.kprx_init_queue) refers to queue_circle.o(i.queue_init) for queue_init + base_process_rx_keypad.o(i.kprx_init_queue) refers to base_process_rx_keypad.o(.bss) for kprx_buf + base_process_tx_keypad.o(i.assert_base_channel) refers to function.o(.data) for function + base_process_tx_keypad.o(i.assert_base_channel) refers to base_process_pc_enter.o(.data) for base_config + base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) refers to base_process_pc_enter.o(i.get_base_match_code) for get_base_match_code + base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) refers to base_core.o(i._debug_core__record_ackkp_info) for _debug_core__record_ackkp_info + base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) refers to base_process_tx_keypad.o(i.keypad_crc_check) for keypad_crc_check + base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) refers to common_math.o(i.crc16) for crc16 + base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) refers to base_process_tx_keypad.o(i.base_tx_to_keypad_sub) for base_tx_to_keypad_sub + base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) refers to function.o(.data) for function + base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) refers to base_process_pc_enter.o(.data) for aux_att + base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) refers to multi_channel.o(.bss) for multi + base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) refers to base_core.o(.bss) for kernel + base_process_tx_keypad.o(i.base_confirm_keypad_id_mode) refers to base_process_pc_enter.o(i.get_base_match_code) for get_base_match_code + base_process_tx_keypad.o(i.base_confirm_keypad_id_mode) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_tx_keypad.o(i.base_confirm_keypad_id_mode) refers to base_process_tx_keypad.o(i.keypad_crc_check) for keypad_crc_check + base_process_tx_keypad.o(i.base_confirm_keypad_id_mode) refers to common_math.o(i.crc16) for crc16 + base_process_tx_keypad.o(i.base_confirm_keypad_id_mode) refers to base_process_tx_keypad.o(i.base_tx_to_keypad_sub) for base_tx_to_keypad_sub + base_process_tx_keypad.o(i.base_confirm_keypad_id_mode) refers to multi_channel.o(.bss) for multi + base_process_tx_keypad.o(i.base_confirm_keypad_id_mode) refers to function.o(.data) for function + base_process_tx_keypad.o(i.base_confirm_keypad_sn_mode) refers to base_process_pc_enter.o(i.get_base_match_code) for get_base_match_code + base_process_tx_keypad.o(i.base_confirm_keypad_sn_mode) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_tx_keypad.o(i.base_confirm_keypad_sn_mode) refers to base_process_tx_keypad.o(i.keypad_crc_check) for keypad_crc_check + base_process_tx_keypad.o(i.base_confirm_keypad_sn_mode) refers to common_math.o(i.crc16) for crc16 + base_process_tx_keypad.o(i.base_confirm_keypad_sn_mode) refers to base_process_tx_keypad.o(i.base_tx_to_keypad_sub) for base_tx_to_keypad_sub + base_process_tx_keypad.o(i.base_confirm_keypad_sn_mode) refers to multi_channel.o(.bss) for multi + base_process_tx_keypad.o(i.base_confirm_keypad_sn_mode) refers to function.o(.data) for function + base_process_tx_keypad.o(i.base_send_beacon_switch) refers to base_process_tx_keypad.o(.bss) for send_beacon + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_tx_keypad.o(i.check_send_ext_basic_beacon) for check_send_ext_basic_beacon + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_tx_keypad.o(i.keypad_idsn_clear) for keypad_idsn_clear + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_pc_enter.o(i.get_base_match_code) for get_base_match_code + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_pc_enter.o(i.get_base_id) for get_base_id + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to multi_channel.o(i.get_base_main_rfchannel) for get_base_main_rfchannel + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_pc_enter.o(i.get_base_log_mode) for get_base_log_mode + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_tx_keypad.o(i.get_ext_basicbeacon_startup_flag) for get_ext_basicbeacon_startup_flag + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_tx_keypad.o(i.keypad_crc_check) for keypad_crc_check + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to common_math.o(i.crc16) for crc16 + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_tx_keypad.o(i.base_tx_to_keypad_sub) for base_tx_to_keypad_sub + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_pc_enter.o(.data) for base_config + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_pc_enter.o(.bss) for basic_beacon + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_tx_keypad.o(.data) for beacon_type + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to function.o(.data) for function + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_core.o(.bss) for kernel + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to multi_channel.o(.bss) for multi + base_process_tx_keypad.o(i.base_tx_basic_beacon) refers to base_process_tx_keypad.o(.bss) for send_beacon + base_process_tx_keypad.o(i.base_tx_ext_basic_beacon) refers to base_process_pc_enter.o(i.get_base_id) for get_base_id + base_process_tx_keypad.o(i.base_tx_ext_basic_beacon) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_tx_keypad.o(i.base_tx_ext_basic_beacon) refers to base_process_tx_keypad.o(i.base_tx_to_keypad_sub) for base_tx_to_keypad_sub + base_process_tx_keypad.o(i.base_tx_ext_basic_beacon) refers to base_core.o(.data) for base_core + base_process_tx_keypad.o(i.base_tx_ext_basic_beacon) refers to base_process_pc_enter.o(.bss) for basic_ext_beacon + base_process_tx_keypad.o(i.base_tx_ext_basic_beacon) refers to multi_channel.o(.bss) for multi + base_process_tx_keypad.o(i.base_tx_ext_basic_beacon) refers to base_process_tx_keypad.o(.bss) for send_beacon + base_process_tx_keypad.o(i.base_tx_ext_vbeacon) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_tx_keypad.o(i.base_tx_ext_vbeacon) refers to multi_channel.o(i.get_base_main_rfchannel) for get_base_main_rfchannel + base_process_tx_keypad.o(i.base_tx_ext_vbeacon) refers to multi_channel.o(i.get_mainRF_usr_id) for get_mainRF_usr_id + base_process_tx_keypad.o(i.base_tx_ext_vbeacon) refers to base_process_tx_keypad.o(i.base_tx_to_keypad_sub) for base_tx_to_keypad_sub + base_process_tx_keypad.o(i.base_tx_ext_vbeacon) refers to base_core.o(.data) for base_core + base_process_tx_keypad.o(i.base_tx_ext_vbeacon) refers to base_process_pc_enter.o(.bss) for ext_vbeacon + base_process_tx_keypad.o(i.base_tx_ext_vbeacon) refers to base_process_tx_keypad.o(.bss) for send_beacon + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to fucntion_text_message.o(i.msg_recover_beacon_countdown) for msg_recover_beacon_countdown + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to base_process_pc_enter.o(i.get_base_log_mode) for get_base_log_mode + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to base_process_tx_keypad.o(i.base_tx_vote_beacon) for base_tx_vote_beacon + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to base_process_tx_keypad.o(i.base_tx_basic_beacon) for base_tx_basic_beacon + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to base_process_tx_keypad.o(i.base_confirm_keypad_id_mode) for base_confirm_keypad_id_mode + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) for base_confirm_keypad_crs2_mode + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to base_process_tx_keypad.o(i.base_confirm_keypad_sn_mode) for base_confirm_keypad_sn_mode + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to multi_channel.o(i.multi_chan_polling) for multi_chan_polling + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) for pc_transfer2keypad_data_fetch + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to fucntion_text_message.o(i.msg_issendtime) for msg_issendtime + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to base_process_tx_keypad.o(i.base_send_beacon_switch) for base_send_beacon_switch + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to base_process_tx_keypad.o(.bss) for send_beacon + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to function.o(.data) for function + base_process_tx_keypad.o(i.base_tx_keypad_beacon) refers to base_process_tx_keypad.o(.data) for beacon_type + base_process_tx_keypad.o(i.base_tx_to_keypad_sub) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_tx_keypad.o(i.base_tx_to_keypad_sub) refers to multi_channel.o(i.rf_modual__tx_counter) for rf_modual__tx_counter + base_process_tx_keypad.o(i.base_tx_to_keypad_sub) refers to function.o(.data) for function + base_process_tx_keypad.o(i.base_tx_to_keypad_sub) refers to multi_channel.o(.bss) for multi + base_process_tx_keypad.o(i.base_tx_to_keypad_sub) refers to platform.o(.data) for platform + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to base_process_tx_keypad.o(i.check_send_ext_vbeacon) for check_send_ext_vbeacon + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to base_process_tx_keypad.o(i.keypad_idsn_clear) for keypad_idsn_clear + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to base_process_tx_keypad.o(i.doule_ant_application) for doule_ant_application + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to base_process_pc_enter.o(i.get_base_match_code) for get_base_match_code + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to base_process_pc_enter.o(i.get_base_log_mode) for get_base_log_mode + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to common_math.o(i.crc16) for crc16 + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to multi_channel.o(i.get_base_main_rfchannel) for get_base_main_rfchannel + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to base_process_tx_keypad.o(i.get_ext_basicbeacon_startup_flag) for get_ext_basicbeacon_startup_flag + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to base_process_tx_keypad.o(i.keypad_crc_check) for keypad_crc_check + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to base_process_tx_keypad.o(i.base_tx_to_keypad_sub) for base_tx_to_keypad_sub + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to function.o(.data) for function + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to base_process_pc_enter.o(.data) for aux_att + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to base_process_pc_enter.o(.bss) for basic_beacon + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to multi_channel.o(.bss) for multi + base_process_tx_keypad.o(i.base_tx_vote_beacon) refers to base_process_tx_keypad.o(.bss) for send_beacon + base_process_tx_keypad.o(i.check_send_ext_basic_beacon) refers to base_process_tx_keypad.o(i.get_ext_basicbeacon_startup_flag) for get_ext_basicbeacon_startup_flag + base_process_tx_keypad.o(i.check_send_ext_basic_beacon) refers to base_process_tx_keypad.o(i.base_tx_ext_basic_beacon) for base_tx_ext_basic_beacon + base_process_tx_keypad.o(i.check_send_ext_basic_beacon) refers to base_process_tx_keypad.o(.data) for alternate + base_process_tx_keypad.o(i.check_send_ext_vbeacon) refers to base_process_tx_keypad.o(i.base_tx_ext_vbeacon) for base_tx_ext_vbeacon + base_process_tx_keypad.o(i.check_send_ext_vbeacon) refers to base_core.o(.bss) for kernel + base_process_tx_keypad.o(i.check_send_ext_vbeacon) refers to base_process_tx_keypad.o(.data) for alternate_flag + base_process_tx_keypad.o(i.check_send_ext_vbeacon) refers to base_process_pc_enter.o(.bss) for vote_beacon + base_process_tx_keypad.o(i.doule_ant_application) refers to base_process_tx_keypad.o(.data) for multi_ant_counter + base_process_tx_keypad.o(i.doule_ant_application) refers to platform.o(.data) for platform + base_process_tx_keypad.o(i.get_base_send_beacon_status) refers to base_process_tx_keypad.o(.bss) for send_beacon + base_process_tx_keypad.o(i.get_ext_basicbeacon_startup_flag) refers to base_process_tx_keypad.o(.data) for ext_basic_beacon_startup_flag + base_process_tx_keypad.o(i.keypad_crc_check) refers to function.o(.data) for function + base_process_tx_keypad.o(i.keypad_crc_check) refers to base_core.o(.bss) for kernel + base_process_tx_keypad.o(i.keypad_idsn_clear) refers to common_math.o(i.mem_set) for mem_set + base_process_tx_keypad.o(i.keypad_idsn_clear) refers to multi_channel.o(.bss) for multi + base_process_tx_keypad.o(i.keypad_idsn_save) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_tx_keypad.o(i.keypad_idsn_save) refers to platform.o(.data) for platform + base_process_tx_keypad.o(i.keypad_idsn_save) refers to multi_channel.o(.bss) for multi + base_process_tx_keypad.o(i.keypad_idsn_save) refers to function.o(.data) for function + base_process_tx_keypad.o(i.send_to_keypad_user_hardID) refers to common_math.o(i.mem_cpy) for mem_cpy + base_process_tx_keypad.o(i.send_to_keypad_user_hardID) refers to function.o(.data) for function + base_process_tx_keypad.o(i.send_to_keypad_user_hardID) refers to platform.o(.data) for platform + base_process_tx_keypad.o(i.set_ext_basicbeacon_startup_flag) refers to base_process_tx_keypad.o(.data) for ext_basic_beacon_startup_flag + base_process_tx_keypad.o(i.set_keypad_crc_config) refers to function_e2prom.o(i.base_write_e2prom) for base_write_e2prom + base_process_tx_keypad.o(i.set_keypad_crc_config) refers to function.o(.data) for function + base_process_tx_keypad.o(i.set_keypad_crc_config) refers to base_core.o(.bss) for kernel + base_timer.o(i.base_core_20ms_isr) refers to base_core.o(i.timer_20ms_function) for timer_20ms_function + base_timer.o(i.base_core_20ms_isr) refers to multi_channel.o(i.rf_error_warning) for rf_error_warning + base_timer.o(i.base_core_20ms_isr) refers to base_process_pc_enter.o(.bss) for basic_beacon + base_timer.o(i.base_core_20ms_isr) refers to base_timer.o(.data) for _0s5_cnt + base_timer.o(i.base_core_20ms_isr) refers to function.o(.data) for function + base_timer.o(i.base_core_20ms_isr) refers to base_process_pc_enter.o(.data) for aux_beats + base_timer.o(i.base_core_20ms_isr) refers to base_core.o(.bss) for kernel + base_timer.o(i.base_core_2ms5_isr) refers to base_process_tx_keypad.o(i.base_tx_keypad_beacon) for base_tx_keypad_beacon + base_timer.o(i.base_core_2ms5_isr) refers to vote__report.o(i.vote_data_report_interval) for vote_data_report_interval + common_math.o(i.Dec_to_Hex) refers to printf8.o(i.__0sprintf$8) for __2sprintf + common_math.o(i.Dec_to_Hex) refers to atoi.o(.text) for atoi + common_math.o(i.crc16) refers to common_math.o(.constdata) for crc_table + function_e2prom.o(i.base_read_e2prom) refers to common_math.o(i.mem_cpy) for mem_cpy + function_e2prom.o(i.base_read_e2prom) refers to platform.o(.data) for platform + function_e2prom.o(i.base_read_e2prom_parameter) refers to function_e2prom.o(i.base_read_e2prom) for base_read_e2prom + function_e2prom.o(i.base_read_e2prom_parameter) refers to common_math.o(i.mem_cpy) for mem_cpy + function_e2prom.o(i.base_read_e2prom_parameter) refers to common_math.o(i.mem_set) for mem_set + function_e2prom.o(i.base_read_e2prom_parameter) refers to base_process_pc_enter.o(i.assert_base_log_mode) for assert_base_log_mode + function_e2prom.o(i.base_read_e2prom_parameter) refers to base_process_pc_enter.o(i.assert_base_id) for assert_base_id + function_e2prom.o(i.base_read_e2prom_parameter) refers to base_process_tx_keypad.o(i.assert_base_channel) for assert_base_channel + function_e2prom.o(i.base_read_e2prom_parameter) refers to base_core.o(i.set_base_hard_firmware_info) for set_base_hard_firmware_info + function_e2prom.o(i.base_read_e2prom_parameter) refers to function_e2prom.o(i.calc_custom_rf_sync_code) for calc_custom_rf_sync_code + function_e2prom.o(i.base_read_e2prom_parameter) refers to function_e2prom.o(i.base_write_e2prom) for base_write_e2prom + function_e2prom.o(i.base_read_e2prom_parameter) refers to multi_channel.o(i.single_relevant_to_multi_chan) for single_relevant_to_multi_chan + function_e2prom.o(i.base_read_e2prom_parameter) refers to base_process_pc_enter.o(.bss) for base_name_log_mode + function_e2prom.o(i.base_read_e2prom_parameter) refers to function.o(.data) for function + function_e2prom.o(i.base_read_e2prom_parameter) refers to base_process_pc_enter.o(.data) for base_pwd_setup + function_e2prom.o(i.base_read_e2prom_parameter) refers to base_core.o(.bss) for kernel + function_e2prom.o(i.base_read_e2prom_parameter) refers to function_e2prom.o(.constdata) for OEM_CODE + function_e2prom.o(i.base_write_e2prom) refers to common_math.o(i.mem_cpy) for mem_cpy + function_e2prom.o(i.base_write_e2prom) refers to platform.o(.data) for platform + multi_channel.o(i.calc_next_multi_chan) refers to function.o(.data) for function + multi_channel.o(i.conver_id) refers to multi_channel.o(.bss) for multi + multi_channel.o(i.get_base_main_rfchannel) refers to multi_channel.o(.bss) for multi + multi_channel.o(i.get_error_info) refers to multi_channel.o(.bss) for multi + multi_channel.o(i.get_main_rf_hard_id) refers to multi_channel.o(.bss) for multi + multi_channel.o(i.get_whitelist_rfid) refers to multi_channel.o(.bss) for multi + multi_channel.o(i.multi_chan_init) refers to multi_channel.o(i.setup_multi_info) for setup_multi_info + multi_channel.o(i.multi_chan_init) refers to multi_channel.o(i.get_main_rf_hard_id) for get_main_rf_hard_id + multi_channel.o(i.multi_chan_init) refers to multi_channel.o(.bss) for multi + multi_channel.o(i.multi_chan_init) refers to function.o(.data) for function + multi_channel.o(i.multi_chan_init) refers to platform.o(.data) for platform + multi_channel.o(i.multi_chan_init) refers to base_process_pc_enter.o(.data) for multi_freq_setup + multi_channel.o(i.multi_chan_init) refers to base_core.o(.bss) for kernel + multi_channel.o(i.multi_chan_polling) refers to multi_channel.o(i.rf_modual__check) for rf_modual__check + multi_channel.o(i.multi_chan_polling) refers to multi_channel.o(.bss) for multi + multi_channel.o(i.multi_chan_polling) refers to function.o(.data) for function + multi_channel.o(i.multi_chan_polling) refers to multi_channel.o(.data) for switch_cycle_cnt + multi_channel.o(i.multi_chan_polling) refers to platform.o(.data) for platform + multi_channel.o(i.process_setup_multi_chan) refers to multi_channel.o(i.setup_multi_info) for setup_multi_info + multi_channel.o(i.process_setup_multi_chan) refers to function_e2prom.o(i.base_write_e2prom) for base_write_e2prom + multi_channel.o(i.process_setup_multi_chan) refers to multi_channel.o(i.e2prom_write_delay_ms) for e2prom_write_delay_ms + multi_channel.o(i.process_setup_multi_chan) refers to base_process_pc_enter.o(.data) for base_config + multi_channel.o(i.process_setup_single_chan) refers to multi_channel.o(i.single_relevant_to_multi_chan) for single_relevant_to_multi_chan + multi_channel.o(i.process_setup_single_chan) refers to multi_channel.o(i.setup_multi_info) for setup_multi_info + multi_channel.o(i.process_setup_single_chan) refers to function_e2prom.o(i.base_write_e2prom) for base_write_e2prom + multi_channel.o(i.process_setup_single_chan) refers to multi_channel.o(i.e2prom_write_delay_ms) for e2prom_write_delay_ms + multi_channel.o(i.process_setup_single_chan) refers to base_process_pc_enter.o(.data) for multi_freq_setup + multi_channel.o(i.rf_error_ack_pc) refers to common_math.o(i.mem_set) for mem_set + multi_channel.o(i.rf_error_ack_pc) refers to multi_channel.o(i.get_error_info) for get_error_info + multi_channel.o(i.rf_error_ack_pc) refers to base_core.o(.data) for base_core + multi_channel.o(i.rf_error_warning) refers to multi_channel.o(i.rf_error_ack_pc) for rf_error_ack_pc + multi_channel.o(i.rf_error_warning) refers to multi_channel.o(.data) for rf_error + multi_channel.o(i.rf_error_warning) refers to platform.o(.data) for platform + multi_channel.o(i.rf_modual__tx_counter) refers to multi_channel.o(.bss) for rf_modual + multi_channel.o(i.rf_modual__tx_interrupt_counter) refers to multi_channel.o(.bss) for rf_modual + multi_channel.o(i.setup_multi_info) refers to common_math.o(i.mem_set) for mem_set + multi_channel.o(i.setup_multi_info) refers to common_math.o(i.mem_cpy) for mem_cpy + multi_channel.o(i.setup_multi_info) refers to base_process_pc_enter.o(.data) for multi_freq_setup + multi_channel.o(i.setup_multi_info) refers to multi_channel.o(.bss) for multi + multi_channel.o(i.setup_multi_info) refers to platform.o(.data) for platform + multi_channel.o(i.single_relevant_to_multi_chan) refers to multi_channel.o(i.calc_next_multi_chan) for calc_next_multi_chan + multi_channel.o(i.single_relevant_to_multi_chan) refers to base_process_pc_enter.o(.data) for multi_freq_setup + queue_circle.o(i.queue_in) refers to common_math.o(i.mem_cpy) for mem_cpy + queue_circle.o(i.queue_in) refers to platform.o(.data) for platform + queue_circle.o(i.queue_out) refers to common_math.o(i.mem_cpy) for mem_cpy + queue_circle.o(i.queue_out) refers to platform.o(.data) for platform + queue_circle.o(i.queue_out_get_type) refers to platform.o(.data) for platform + queue_circle.o(i.queue_out_special) refers to common_math.o(i.mem_cpy) for mem_cpy + queue_circle.o(i.queue_out_special) refers to platform.o(.data) for platform + transfer_keypad_pc.o(i.keypad_transfer2pc_data_fetch) refers to queue_circle.o(i.queue_out) for queue_out + transfer_keypad_pc.o(i.keypad_transfer2pc_data_fetch) refers to base_process_pc_enter.o(i.base_tx_to_pc_sub) for base_tx_to_pc_sub + transfer_keypad_pc.o(i.keypad_transfer2pc_data_fetch) refers to platform.o(.data) for platform + transfer_keypad_pc.o(i.keypad_transfer2pc_data_fetch) refers to transfer_keypad_pc.o(.bss) for trans2pc_queue + transfer_keypad_pc.o(i.keypad_transfer2pc_data_save) refers to queue_circle.o(i.queue_in) for queue_in + transfer_keypad_pc.o(i.keypad_transfer2pc_data_save) refers to transfer_keypad_pc.o(.bss) for trans2pc_queue + transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) refers to queue_circle.o(i.queue_out) for queue_out + transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) refers to base_process_pc_enter.o(i.get_base_match_code) for get_base_match_code + transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) refers to base_process_tx_keypad.o(i.get_ext_basicbeacon_startup_flag) for get_ext_basicbeacon_startup_flag + transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) refers to base_process_tx_keypad.o(i.base_tx_to_keypad_sub) for base_tx_to_keypad_sub + transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) refers to common_math.o(i.crc16) for crc16 + transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) refers to multi_channel.o(i.get_mainRF_usr_id) for get_mainRF_usr_id + transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) refers to transfer_keypad_pc.o(.bss) for trans2kp_queue + transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) refers to multi_channel.o(.bss) for multi + transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) refers to function.o(.data) for function + transfer_keypad_pc.o(i.pc_transfer2keypad_data_save) refers to queue_circle.o(i.queue_in) for queue_in + transfer_keypad_pc.o(i.pc_transfer2keypad_data_save) refers to platform.o(.data) for platform + transfer_keypad_pc.o(i.pc_transfer2keypad_data_save) refers to transfer_keypad_pc.o(.bss) for trans2kp_queue + transfer_keypad_pc.o(i.transfer2kp_init_queue) refers to queue_circle.o(i.queue_init) for queue_init + transfer_keypad_pc.o(i.transfer2kp_init_queue) refers to transfer_keypad_pc.o(.bss) for trans2kp_buf + transfer_keypad_pc.o(i.transfer2pc_init_queue) refers to queue_circle.o(i.queue_init) for queue_init + transfer_keypad_pc.o(i.transfer2pc_init_queue) refers to transfer_keypad_pc.o(.bss) for trans2pc_buf + vote__process.o(i.vote_data_packing) refers to common_math.o(i.mem_set) for mem_set + vote__process.o(i.vote_data_packing) refers to base_process_pc_enter.o(i.get_base_id) for get_base_id + vote__process.o(i.vote_data_packing) refers to common_math.o(i.mem_cpy) for mem_cpy + vote__process.o(i.vote_data_packing) refers to base_core.o(i._debug_core__record_txpc_info_report) for _debug_core__record_txpc_info_report + vote__process.o(i.vote_data_packing) refers to base_process_pc_enter.o(i.base_tx_to_pc_sub) for base_tx_to_pc_sub + vote__process.o(i.vote_data_packing) refers to queue_circle.o(i.queue_out_get_type) for queue_out_get_type + vote__process.o(i.vote_data_packing) refers to vote__report.o(i.get_packing_parameter) for get_packing_parameter + vote__process.o(i.vote_data_packing) refers to queue_circle.o(i.queue_out_special) for queue_out_special + vote__process.o(i.vote_data_packing) refers to base_core.o(i._debug_core__record_txpc_info) for _debug_core__record_txpc_info + vote__process.o(i.vote_data_packing) refers to vote__process.o(.data) for packet_count + vote__process.o(i.vote_data_packing) refers to vote__process.o(.bss) for packet + vote__process.o(i.vote_data_store) refers to queue_circle.o(i.queue_in) for queue_in + vote__process.o(i.vote_data_store) refers to vote__process.o(.bss) for vote_queue + vote__process.o(i.vote_init_queue) refers to queue_circle.o(i.queue_init) for queue_init + vote__process.o(i.vote_init_queue) refers to vote__process.o(.bss) for vote_buf + vote__process.o(i.vote_status_clear_confirmed) refers to base_core.o(i._debug_core__record_pcack_info) for _debug_core__record_pcack_info + vote__process.o(i.vote_status_clear_confirmed) refers to common_math.o(i.mem_cpy) for mem_cpy + vote__process.o(i.vote_status_clear_confirmed) refers to platform.o(.data) for platform + vote__process.o(i.vote_status_clear_confirmed) refers to vote__process.o(.bss) for packet + vote__process.o(i.vote_status_clear_confirmed) refers to vote__process.o(.data) for packet_count + vote__process.o(i.vote_status_clear_confirmed) refers to base_core.o(.bss) for kernel + vote__report.o(i.get_packing_parameter) refers to base_process_pc_enter.o(.bss) for vote_beacon + vote__report.o(i.vote_data_parameter_init) refers to vote__process.o(i.vote_init_queue) for vote_init_queue + vote__report.o(i.vote_data_parameter_init) refers to vote__report.o(.data) for rpt_vote + vote__report.o(i.vote_data_report_interval) refers to vote__report.o(i.vote_data_report_to_pc) for vote_data_report_to_pc + vote__report.o(i.vote_data_report_interval) refers to vote__report.o(.data) for rpt_vote + vote__report.o(i.vote_data_report_startup) refers to vote__process.o(i.vote_status_reset_NOconfirmed) for vote_status_reset_NOconfirmed + vote__report.o(i.vote_data_report_startup) refers to vote__report.o(.data) for rpt_vote + vote__report.o(i.vote_data_report_to_pc) refers to vote__process.o(i.vote_data_packing) for vote_data_packing + vote__report.o(i.vote_data_report_to_pc) refers to vote__report.o(.data) for rpt_vote + fucntion_base_test.o(i.basetest_get_status) refers to fucntion_base_test.o(.bss) for base_test + fucntion_base_test.o(i.basetest_init) refers to fucntion_base_test.o(.bss) for base_test + fucntion_base_test.o(i.basetest_init) refers to fucntion_base_test.o(.data) for cur_send_cnt + fucntion_base_test.o(i.basetest_progress) refers to fucntion_base_test.o(i.basetest_init) for basetest_init + fucntion_base_test.o(i.basetest_progress) refers to fucntion_base_test.o(.bss) for base_test + fucntion_base_test.o(i.basetest_progress) refers to platform.o(.data) for platform + fucntion_base_test.o(i.basetest_progress) refers to fucntion_base_test.o(.data) for cur_send_cnt + fucntion_base_test.o(i.basetest_progress) refers to base_core.o(.data) for base_core + fucntion_base_test.o(i.basetest_rx_and_ack_pc) refers to fucntion_base_test.o(.bss) for base_test + fucntion_base_test.o(i.basetest_rx_and_ack_pc) refers to fucntion_base_test.o(.data) for cur_send_cnt + fucntion_fastmatch.o(i.check_fastmatch_lowerPA) refers to fucntion_fastmatch.o(.data) for fastmatch + fucntion_fastmatch.o(i.fastmatch_enter_exit) refers to fucntion_fastmatch.o(.data) for fastmatch + fucntion_fastmatch.o(i.fastmatch_enter_exit) refers to function.o(.data) for function + fucntion_fastmatch.o(i.fastmatch_enter_exit) refers to base_core.o(.data) for base_core + fucntion_fastmatch.o(i.fastmatch_enter_exit) refers to platform.o(.data) for platform + fucntion_fastmatch.o(i.fastmatch_load_info_to_vote_beacon) refers to fucntion_fastmatch.o(.data) for fastmatch + fucntion_fastmatch.o(i.fastmatch_load_info_to_vote_beacon) refers to base_core.o(.data) for base_core + fucntion_fastmatch.o(i.fastmatch_load_info_to_vote_beacon) refers to platform.o(.data) for platform + fucntion_fastmatch.o(i.fastmatch_load_info_to_vote_beacon) refers to function.o(.data) for function + fucntion_fastmatch.o(i.fastmatch_lowerPA_ack) refers to fucntion_fastmatch.o(i.fastmatch_lowerPA_ack_sub) for fastmatch_lowerPA_ack_sub + fucntion_fastmatch.o(i.fastmatch_lowerPA_ack) refers to fucntion_fastmatch.o(.data) for fastmatch + fucntion_fastmatch.o(i.fastmatch_lowerPA_ack_sub) refers to memseta.o(.text) for __aeabi_memclr4 + fucntion_fastmatch.o(i.fastmatch_lowerPA_ack_sub) refers to memmovea.o(.text) for __aeabi_memcpy + fucntion_fastmatch.o(i.fastmatch_lowerPA_ack_sub) refers to base_core.o(.data) for base_core + fucntion_fastmatch.o(i.fastmatch_lowerPA_setup) refers to fucntion_fastmatch.o(.data) for fastmatch + fucntion_fastmatch.o(i.fastmatch_status) refers to fucntion_fastmatch.o(.data) for fastmatch + fucntion_fastmatch.o(i.fastmatch_success_check) refers to fucntion_fastmatch.o(.data) for fastmatch + fucntion_fastmatch.o(i.fastmatch_switch) refers to fucntion_fastmatch.o(.data) for fastmatch + fucntion_fastmatch.o(i.fastmatch_switch) refers to base_core.o(.data) for base_core + fucntion_fastmatch.o(i.fastmatch_switch) refers to platform.o(.data) for platform + fucntion_text_message.o(i.Msg_TickHandler) refers to fucntion_text_message.o(.data) for msg_outtime_cnt + fucntion_text_message.o(i.Msg_TickHandler) refers to fucntion_text_message.o(.bss) for msg + fucntion_text_message.o(i.msg_clr_len) refers to fucntion_text_message.o(.bss) for msg + fucntion_text_message.o(i.msg_delay_us) refers to platform.o(i.basic_delay_us) for basic_delay_us + fucntion_text_message.o(i.msg_get_pc_data) refers to memseta.o(.text) for __aeabi_memclr + fucntion_text_message.o(i.msg_get_pc_data) refers to memmovea.o(.text) for __aeabi_memcpy + fucntion_text_message.o(i.msg_get_pc_data) refers to fucntion_text_message.o(.bss) for msg + fucntion_text_message.o(i.msg_get_pc_data) refers to fucntion_text_message.o(.data) for msg_outtime_cnt + fucntion_text_message.o(i.msg_get_status) refers to fucntion_text_message.o(.bss) for msg + fucntion_text_message.o(i.msg_issendtime) refers to fucntion_text_message.o(i.msg_set_status) for msg_set_status + fucntion_text_message.o(i.msg_issendtime) refers to base_core.o(.data) for base_core + fucntion_text_message.o(i.msg_issendtime) refers to fucntion_text_message.o(.bss) for msg + fucntion_text_message.o(i.msg_issendtime) refers to base_process_pc_enter.o(.data) for basic_beacon_crs2 + fucntion_text_message.o(i.msg_polling) refers to memmovea.o(.text) for __aeabi_memcpy + fucntion_text_message.o(i.msg_polling) refers to fucntion_text_message.o(i.msg_send) for msg_send + fucntion_text_message.o(i.msg_polling) refers to base_process_tx_keypad.o(i.base_send_beacon_switch) for base_send_beacon_switch + fucntion_text_message.o(i.msg_polling) refers to fucntion_text_message.o(.bss) for msg + fucntion_text_message.o(i.msg_recover_beacon_countdown) refers to fucntion_text_message.o(.bss) for msg + fucntion_text_message.o(i.msg_send) refers to memseta.o(.text) for __aeabi_memclr4 + fucntion_text_message.o(i.msg_send) refers to common_math.o(i.crc16) for crc16 + fucntion_text_message.o(i.msg_send) refers to fucntion_text_message.o(i.msg_tx_payload) for msg_tx_payload + fucntion_text_message.o(i.msg_send) refers to fucntion_text_message.o(i.msg_wait_rfsendOK) for msg_wait_rfsendOK + fucntion_text_message.o(i.msg_send) refers to fucntion_text_message.o(i.msg_delay_us) for msg_delay_us + fucntion_text_message.o(i.msg_send) refers to base_core.o(.data) for base_core + fucntion_text_message.o(i.msg_send) refers to fucntion_text_message.o(.bss) for msg + fucntion_text_message.o(i.msg_set_status) refers to fucntion_text_message.o(.bss) for msg + fucntion_text_message.o(i.msg_tx_payload) refers to rf24l01 - multi.o(i.set_tx_ok_flag) for set_tx_ok_flag + fucntion_text_message.o(i.msg_tx_payload) refers to base_core.o(.data) for base_core + fucntion_text_message.o(i.msg_tx_payload) refers to platform.o(.data) for platform + fucntion_text_message.o(i.msg_wait_rfsendOK) refers to rf24l01 - multi.o(i.get_tx_ok_flag) for get_tx_ok_flag + fucntion_text_message.o(i.msg_wait_rfsendOK) refers to fucntion_text_message.o(i.msg_delay_us) for msg_delay_us + function.o(i.function_init_all) refers to function.o(.data) for function + function.o(i.user__pc_cmd_ack) refers to memseta.o(.text) for __aeabi_memclr4 + function.o(i.user__pc_cmd_ack) refers to memmovea.o(.text) for __aeabi_memcpy + function.o(i.user__pc_cmd_ack) refers to base_core.o(.data) for base_core + function.o(.data) refers to function_whitelist.o(i.whitelist_init) for whitelist_init + function.o(.data) refers to function_whitelist.o(i.whitelist_enter) for whitelist_enter + function.o(.data) refers to function_whitelist.o(i.search_special_list) for search_special_list + function.o(.data) refers to function_whitelist.o(i.base_confirm_keypad_whitelist_request) for base_confirm_keypad_whitelist_request + function.o(.data) refers to function_whitelist.o(i.keypad_idsn_record_whitelist_request) for keypad_idsn_record_whitelist_request + function.o(.data) refers to fucntion_fastmatch.o(i.fastmatch_enter_exit) for fastmatch_enter_exit + function.o(.data) refers to fucntion_fastmatch.o(i.fastmatch_load_info_to_vote_beacon) for fastmatch_load_info_to_vote_beacon + function.o(.data) refers to fucntion_fastmatch.o(i.fastmatch_success_check) for fastmatch_success_check + function.o(.data) refers to fucntion_fastmatch.o(i.fastmatch_lowerPA_setup) for fastmatch_lowerPA_setup + function.o(.data) refers to fucntion_fastmatch.o(i.fastmatch_lowerPA_ack) for fastmatch_lowerPA_ack + function.o(.data) refers to fucntion_fastmatch.o(i.fastmatch_status) for fastmatch_status + function.o(.data) refers to transparentupgrade.o(i.update_kp_enter) for update_kp_enter + function.o(.data) refers to transparentupgrade.o(i.update_kp_progress) for update_kp_progress + function.o(.data) refers to transparentupgrade.o(i.save_keypad_ack_data) for save_keypad_ack_data + function.o(.data) refers to transparentupgrade.o(i.update_get_status) for update_get_status + function.o(.data) refers to transparentupgrade.o(i.update_monitor_sdk_connect) for update_monitor_sdk_connect + function.o(.data) refers to fucntion_base_test.o(i.basetest_progress) for basetest_progress + function.o(.data) refers to fucntion_base_test.o(i.basetest_init) for basetest_init + function.o(.data) refers to fucntion_base_test.o(i.basetest_get_status) for basetest_get_status + function.o(.data) refers to fucntion_base_test.o(i.basetest_rx_and_ack_pc) for basetest_rx_and_ack_pc + function.o(.data) refers to function_monitor_freq.o(i.auto_search_freq_enter) for auto_search_freq_enter + function.o(.data) refers to function_monitor_freq.o(i.monitor_rf_data) for monitor_rf_data + function.o(.data) refers to function_monitor_freq.o(i.monitor_freq_process) for monitor_freq_process + function.o(.data) refers to function_aes.o(i.aes_init) for aes_init + function.o(.data) refers to function_aes.o(i.process_pc_aes_config) for process_pc_aes_config + function.o(.data) refers to function_aes.o(i.aes_load_fastmatch_data) for aes_load_fastmatch_data + function.o(.data) refers to function_aes.o(i.aes_keycode_upgrade) for aes_keycode_upgrade + function.o(.data) refers to function_aes.o(i.rf_Encrypt) for rf_Encrypt + function.o(.data) refers to function_aes.o(i.rf_Decrypt) for rf_Decrypt + function.o(.data) refers to function_aes.o(i.get_aes_key) for get_aes_key + function.o(.data) refers to function_aes.o(i.get_aes_status) for get_aes_status + function.o(.data) refers to function_broadcast.o(i.broadcast_config) for broadcast_config + function.o(.data) refers to function_broadcast.o(i.startup_broadcast) for startup_broadcast + function.o(.data) refers to function_broadcast.o(i.process_keypad_broadcast_requst) for process_keypad_broadcast_requst + function.o(.data) refers to function_broadcast.o(i.det_blank_content) for det_blank_content + function.o(.data) refers to function.o(i.user__pc_transfer2keypad) for user__pc_transfer2keypad + function.o(.data) refers to function.o(i.user__pc_0x60cmd) for user__pc_0x60cmd + function.o(.data) refers to function.o(i.user__pc_0x61cmd) for user__pc_0x61cmd + function.o(.data) refers to function.o(i.user__pc_0x61cmd_type0x0B) for user__pc_0x61cmd_type0x0B + function.o(.data) refers to function.o(i.user__keypad_transfer2pc) for user__keypad_transfer2pc + function.o(.data) refers to function_debug.o(i._debug_function_enter) for _debug_function_enter + function.o(.data) refers to fucntion_text_message.o(i.msg_polling) for msg_polling + function.o(.data) refers to function_network.o(i.network_polling) for network_polling + function.o(.data) refers to function_network.o(i.network_get_netseq) for network_get_netseq + function.o(.data) refers to function_network.o(i.network_set_netseq_change) for network_set_netseq_change + function.o(.data) refers to function_network.o(i.network_get_pwd) for network_get_pwd + function.o(.data) refers to function_network.o(i.network_set_pwd) for network_set_pwd + function.o(.data) refers to function_network.o(i.network_get_name) for network_get_name + function.o(.data) refers to function_network.o(i.network_set_name) for network_set_name + function.o(.data) refers to function_network.o(i.network_get_nameview) for network_get_nameview + function.o(.data) refers to function_network.o(i.network_set_nameview) for network_set_nameview + function_aes.o(i.CmdXch) refers to function_aes.o(.constdata) for CmdTAB + function_aes.o(i.Decrypt) refers to aes.o(i.STM32_AES_ECB_Decrypt) for STM32_AES_ECB_Decrypt + function_aes.o(i.Decrypt) refers to aes.o(i.AES_Decrypt) for AES_Decrypt + function_aes.o(i.Decrypt) refers to function_aes.o(.bss) for aes + function_aes.o(i.Encrypt) refers to aes.o(i.STM32_AES_ECB_Encrypt) for STM32_AES_ECB_Encrypt + function_aes.o(i.Encrypt) refers to aes.o(i.AES_Encrypt) for AES_Encrypt + function_aes.o(i.Encrypt) refers to function_aes.o(.bss) for aes + function_aes.o(i.aes_init) refers to function_aes.o(i.read_AES_config) for read_AES_config + function_aes.o(i.aes_init) refers to function_aes.o(i.generate_default_key0_code) for generate_default_key0_code + function_aes.o(i.aes_init) refers to function_aes.o(i.read_keycode) for read_keycode + function_aes.o(i.aes_init) refers to function_aes.o(i.aes_test) for aes_test + function_aes.o(i.aes_init) refers to function.o(.data) for function + function_aes.o(i.aes_init) refers to function_aes.o(.bss) for aes + function_aes.o(i.aes_keycode_upgrade) refers to gd32f30x_timer.o(i.timer_counter_read) for timer_counter_read + function_aes.o(i.aes_keycode_upgrade) refers to rand.o(.text) for srand + function_aes.o(i.aes_keycode_upgrade) refers to function_aes.o(i.write_keycode) for write_keycode + function_aes.o(i.aes_keycode_upgrade) refers to function.o(.data) for function + function_aes.o(i.aes_keycode_upgrade) refers to function_aes.o(.bss) for aes + function_aes.o(i.aes_load_fastmatch_data) refers to memmovea.o(.text) for __aeabi_memcpy + function_aes.o(i.aes_load_fastmatch_data) refers to function.o(.data) for function + function_aes.o(i.aes_load_fastmatch_data) refers to function_aes.o(.bss) for aes + function_aes.o(i.aes_load_fastmatch_data) refers to base_core.o(.data) for base_core + function_aes.o(i.aes_load_fastmatch_data) refers to function_aes.o(.data) for aes_pos + function_aes.o(i.aes_test) refers to function_aes.o(i.rf_Encrypt) for rf_Encrypt + function_aes.o(i.aes_test) refers to function_aes.o(i.rf_Decrypt) for rf_Decrypt + function_aes.o(i.base_is_auto_match) refers to base_core.o(.data) for base_core + function_aes.o(i.generate_default_key0_code) refers to memseta.o(.text) for __aeabi_memclr + function_aes.o(i.generate_default_key0_code) refers to memmovea.o(.text) for __aeabi_memcpy + function_aes.o(i.generate_default_key0_code) refers to function_aes.o(i.Encrypt) for Encrypt + function_aes.o(i.generate_default_key0_code) refers to function_aes.o(.bss) for aes + function_aes.o(i.generate_default_key0_code) refers to function_aes.o(.constdata) for Keycode_Sunvote + function_aes.o(i.generate_default_key0_code) refers to aes.o(.constdata) for rsbox + function_aes.o(i.get_aes_key) refers to memmovea.o(.text) for __aeabi_memcpy + function_aes.o(i.get_aes_key) refers to function_aes.o(.bss) for aes + function_aes.o(i.get_aes_status) refers to function.o(.data) for function + function_aes.o(i.get_aes_status) refers to function_aes.o(.bss) for aes + function_aes.o(i.process_pc_aes_config) refers to function.o(i.user__pc_cmd_ack) for user__pc_cmd_ack + function_aes.o(i.process_pc_aes_config) refers to function_aes.o(.bss) for aes + function_aes.o(i.process_pc_aes_config) refers to platform.o(.data) for platform + function_aes.o(i.read_AES_config) refers to platform.o(.data) for platform + function_aes.o(i.read_AES_config) refers to function_aes.o(.bss) for aes + function_aes.o(i.read_keycode) refers to function_aes.o(i.Decrypt) for Decrypt + function_aes.o(i.read_keycode) refers to platform.o(.data) for platform + function_aes.o(i.read_keycode) refers to function_aes.o(.bss) for aes + function_aes.o(i.rf_Decrypt) refers to memmovea.o(.text) for __aeabi_memcpy + function_aes.o(i.rf_Decrypt) refers to function_aes.o(i.CmdXch) for CmdXch + function_aes.o(i.rf_Decrypt) refers to function_aes.o(i.base_is_auto_match) for base_is_auto_match + function_aes.o(i.rf_Decrypt) refers to function_aes.o(i.Decrypt) for Decrypt + function_aes.o(i.rf_Decrypt) refers to common_math.o(i.crc16) for crc16 + function_aes.o(i.rf_Decrypt) refers to function.o(.data) for function + function_aes.o(i.rf_Decrypt) refers to function_aes.o(.bss) for aes + function_aes.o(i.rf_Encrypt) refers to common_math.o(i.crc16) for crc16 + function_aes.o(i.rf_Encrypt) refers to memmovea.o(.text) for __aeabi_memcpy + function_aes.o(i.rf_Encrypt) refers to function_aes.o(i.CmdXch) for CmdXch + function_aes.o(i.rf_Encrypt) refers to function_aes.o(i.Encrypt) for Encrypt + function_aes.o(i.rf_Encrypt) refers to function_aes.o(i.base_is_auto_match) for base_is_auto_match + function_aes.o(i.rf_Encrypt) refers to function.o(.data) for function + function_aes.o(i.rf_Encrypt) refers to function_aes.o(.bss) for aes + function_aes.o(i.write_keycode) refers to function_aes.o(i.Encrypt) for Encrypt + function_aes.o(i.write_keycode) refers to function_aes.o(.bss) for aes + function_aes.o(i.write_keycode) refers to platform.o(.data) for platform + function_broadcast.o(i.base_broadcast_process_2ms5) refers to function_broadcast.o(i.base_broadcast_sub) for base_broadcast_sub + function_broadcast.o(i.base_broadcast_process_2ms5) refers to function.o(.data) for function + function_broadcast.o(i.base_broadcast_process_2ms5) refers to function_broadcast.o(.bss) for broadcast + function_broadcast.o(i.base_broadcast_process_2ms5) refers to base_core.o(.data) for base_core + function_broadcast.o(i.base_broadcast_sub) refers to memmovea.o(.text) for __aeabi_memcpy + function_broadcast.o(i.base_broadcast_sub) refers to common_math.o(i.crc16) for crc16 + function_broadcast.o(i.base_broadcast_sub) refers to base_core.o(.data) for base_core + function_broadcast.o(i.base_broadcast_sub) refers to function_broadcast.o(.bss) for broadcast + function_broadcast.o(i.broadcast_config) refers to memmovea.o(.text) for __aeabi_memcpy + function_broadcast.o(i.broadcast_config) refers to function.o(i.user__pc_cmd_ack) for user__pc_cmd_ack + function_broadcast.o(i.broadcast_config) refers to function_broadcast.o(.constdata) for .constdata + function_broadcast.o(i.broadcast_config) refers to function_broadcast.o(.bss) for broadcast + function_broadcast.o(i.det_blank_content) refers to function_broadcast.o(.bss) for broadcast + function_broadcast.o(i.det_blank_content) refers to base_core.o(.data) for base_core + function_broadcast.o(i.process_keypad_broadcast_requst) refers to function_broadcast.o(i.det_blank_content) for det_blank_content + function_broadcast.o(i.process_keypad_broadcast_requst) refers to function_broadcast.o(i.startup_broadcast) for startup_broadcast + function_broadcast.o(i.process_keypad_broadcast_requst) refers to function.o(.data) for function + function_broadcast.o(i.process_keypad_broadcast_requst) refers to function_broadcast.o(.bss) for broadcast + function_broadcast.o(i.startup_broadcast) refers to function.o(.data) for function + function_broadcast.o(i.startup_broadcast) refers to function_broadcast.o(.bss) for broadcast + function_broadcast.o(i.startup_broadcast) refers to base_core.o(.data) for base_core + function_debug.o(i._dbg_function__response_pc_cmd) refers to memmovea.o(.text) for __aeabi_memcpy + function_debug.o(i._dbg_function__response_pc_cmd) refers to memseta.o(.text) for __aeabi_memset + function_debug.o(i._dbg_function__response_pc_cmd) refers to platform.o(.data) for platform + function_debug.o(i._debug_function_enter) refers to memseta.o(.text) for __aeabi_memset + function_debug.o(i._debug_function_enter) refers to memmovea.o(.text) for __aeabi_memcpy + function_debug.o(i._debug_function_enter) refers to function_debug.o(i._dbg_function__response_pc_cmd) for _dbg_function__response_pc_cmd + function_monitor_freq.o(i.auto_search_freq_enter) refers to function_monitor_freq.o(.data) for monitor_freq + function_monitor_freq.o(i.auto_search_freq_enter) refers to base_core.o(.data) for base_core + function_monitor_freq.o(i.check_disturb) refers to function_monitor_freq.o(.data) for monitor_freq + function_monitor_freq.o(i.monitor_freq_ack_pc) refers to memseta.o(.text) for __aeabi_memclr4 + function_monitor_freq.o(i.monitor_freq_ack_pc) refers to memmovea.o(.text) for __aeabi_memcpy + function_monitor_freq.o(i.monitor_freq_ack_pc) refers to base_core.o(.data) for base_core + function_monitor_freq.o(i.monitor_freq_process) refers to function_monitor_freq.o(i.check_disturb) for check_disturb + function_monitor_freq.o(i.monitor_freq_process) refers to function_monitor_freq.o(i.monitor_freq_ack_pc) for monitor_freq_ack_pc + function_monitor_freq.o(i.monitor_freq_process) refers to function.o(.data) for function + function_monitor_freq.o(i.monitor_freq_process) refers to function_monitor_freq.o(.data) for monitor_freq + function_monitor_freq.o(i.monitor_freq_process) refers to base_core.o(.data) for base_core + function_monitor_freq.o(i.monitor_rf_data) refers to function.o(.data) for function + function_monitor_freq.o(i.monitor_rf_data) refers to base_core.o(.data) for base_core + function_monitor_freq.o(i.monitor_rf_data) refers to function_monitor_freq.o(.data) for monitor_freq + function_network.o(i.RandData) refers to rand.o(.text) for srand + function_network.o(i.RandData) refers to gd32f30x_timer.o(i.timer_counter_read) for timer_counter_read + function_network.o(i.RandData) refers to base_core.o(.data) for base_core + function_network.o(i.network_creat_random_delay) refers to function_network.o(i.network_randtime) for network_randtime + function_network.o(i.network_creat_random_delay) refers to function_network.o(.data) for Network + function_network.o(i.network_get_name) refers to function_network.o(.data) for Network + function_network.o(i.network_get_nameview) refers to function_network.o(.data) for Network + function_network.o(i.network_get_netseq) refers to function_network.o(.data) for Network + function_network.o(i.network_get_pwd) refers to function_network.o(.data) for Network + function_network.o(i.network_polling) refers to function_network.o(i.network_tx_beacon) for network_tx_beacon + function_network.o(i.network_polling) refers to function_network.o(i.network_creat_random_delay) for network_creat_random_delay + function_network.o(i.network_polling) refers to function_network.o(.data) for Network + function_network.o(i.network_polling) refers to base_core.o(.data) for base_core + function_network.o(i.network_polling) refers to platform.o(.data) for platform + function_network.o(i.network_randtime) refers to function_network.o(i.RandData) for RandData + function_network.o(i.network_randtime) refers to function_network.o(.data) for Network + function_network.o(i.network_set_name) refers to memmovea.o(.text) for __aeabi_memcpy + function_network.o(i.network_set_name) refers to function_network.o(.data) for Network + function_network.o(i.network_set_nameview) refers to function_network.o(.data) for Network + function_network.o(i.network_set_netseq_change) refers to function_network.o(.data) for Network + function_network.o(i.network_set_pwd) refers to function_network.o(.data) for Network + function_network.o(i.network_tx_beacon) refers to memseta.o(.text) for __aeabi_memclr4 + function_network.o(i.network_tx_beacon) refers to base_process_pc_enter.o(i.get_base_log_mode) for get_base_log_mode + function_network.o(i.network_tx_beacon) refers to common_math.o(i.crc16) for crc16 + function_network.o(i.network_tx_beacon) refers to base_core.o(.data) for base_core + function_network.o(i.network_tx_beacon) refers to function_network.o(.data) for Network + function_network.o(i.network_tx_beacon) refers to function.o(.data) for function + function_network.o(i.network_tx_beacon) refers to platform.o(.data) for platform + function_network.o(i.network_wait_rfsendOK) refers to rf24l01 - multi.o(i.get_tx_ok_flag) for get_tx_ok_flag + function_network.o(i.network_wait_rfsendOK) refers to platform.o(i.basic_delay_us) for basic_delay_us + function_whitelist.o(i.auth_all_keypad) refers to function_whitelist.o(.bss) for wlist + function_whitelist.o(i.auth_special_keypad) refers to function_whitelist.o(.bss) for wlist + function_whitelist.o(i.base_confirm_keypad_whitelist_request) refers to function_whitelist.o(.data) for list_request_flag + function_whitelist.o(i.base_confirm_keypad_whitelist_request) refers to base_core.o(.data) for base_core + function_whitelist.o(i.keypad_idsn_record_whitelist_request) refers to function_whitelist.o(.data) for list_sn + function_whitelist.o(i.search_special_list) refers to memcmp.o(.text) for memcmp + function_whitelist.o(i.search_special_list) refers to function_whitelist.o(.bss) for list + function_whitelist.o(i.search_special_list) refers to function_whitelist.o(.data) for list_valid_cnt + function_whitelist.o(i.whitelist__2ms5_call) refers to function_whitelist.o(i.auth_all_keypad) for auth_all_keypad + function_whitelist.o(i.whitelist__2ms5_call) refers to function_whitelist.o(i.whitelist__tx_authcode_to_keypad) for whitelist__tx_authcode_to_keypad + function_whitelist.o(i.whitelist__2ms5_call) refers to function.o(.data) for function + function_whitelist.o(i.whitelist__2ms5_call) refers to base_core.o(.data) for base_core + function_whitelist.o(i.whitelist__2ms5_call) refers to function_whitelist.o(.bss) for wlist + function_whitelist.o(i.whitelist__tx_authcode_to_keypad) refers to memseta.o(.text) for __aeabi_memclr + function_whitelist.o(i.whitelist__tx_authcode_to_keypad) refers to function.o(.data) for function + function_whitelist.o(i.whitelist__tx_authcode_to_keypad) refers to function_whitelist.o(.bss) for wlist + function_whitelist.o(i.whitelist__tx_authcode_to_keypad) refers to base_core.o(.data) for base_core + function_whitelist.o(i.whitelist_ack_pc) refers to memseta.o(.text) for __aeabi_memclr4 + function_whitelist.o(i.whitelist_ack_pc) refers to memmovea.o(.text) for __aeabi_memcpy + function_whitelist.o(i.whitelist_ack_pc) refers to base_core.o(.data) for base_core + function_whitelist.o(i.whitelist_add) refers to function_whitelist.o(i.calc_valid_list_cnt) for calc_valid_list_cnt + function_whitelist.o(i.whitelist_add) refers to function_whitelist.o(i.write_list_sub) for write_list_sub + function_whitelist.o(i.whitelist_add) refers to function_whitelist.o(.data) for list_valid_cnt + function_whitelist.o(i.whitelist_delete) refers to function_whitelist.o(i.calc_valid_list_cnt) for calc_valid_list_cnt + function_whitelist.o(i.whitelist_delete) refers to function_whitelist.o(i.search_special_list) for search_special_list + function_whitelist.o(i.whitelist_delete) refers to function_whitelist.o(i.auth_special_keypad) for auth_special_keypad + function_whitelist.o(i.whitelist_delete) refers to memseta.o(.text) for __aeabi_memset + function_whitelist.o(i.whitelist_delete) refers to function_whitelist.o(.bss) for wlist + function_whitelist.o(i.whitelist_enter) refers to function_whitelist.o(i.whitelist_write_1zone) for whitelist_write_1zone + function_whitelist.o(i.whitelist_enter) refers to function_whitelist.o(i.whitelist_read_1zone) for whitelist_read_1zone + function_whitelist.o(i.whitelist_enter) refers to memseta.o(.text) for __aeabi_memclr + function_whitelist.o(i.whitelist_enter) refers to function_whitelist.o(i.whitelist_ack_pc) for whitelist_ack_pc + function_whitelist.o(i.whitelist_enter) refers to function_whitelist.o(i.whitelist_add) for whitelist_add + function_whitelist.o(i.whitelist_enter) refers to function_whitelist.o(i.whitelist_delete) for whitelist_delete + function_whitelist.o(i.whitelist_init) refers to function_whitelist.o(.data) for list_request_flag + function_whitelist.o(i.whitelist_init) refers to function_whitelist.o(.bss) for list + function_whitelist.o(i.whitelist_read_1zone) refers to function_whitelist.o(i.get_offset) for get_offset + function_whitelist.o(i.whitelist_read_1zone) refers to function_whitelist.o(.bss) for list + function_whitelist.o(i.whitelist_write_1zone) refers to function_whitelist.o(i.whitelist_init) for whitelist_init + function_whitelist.o(i.whitelist_write_1zone) refers to function_whitelist.o(i.auth_all_keypad) for auth_all_keypad + function_whitelist.o(i.whitelist_write_1zone) refers to function_whitelist.o(i.calc_valid_list_cnt) for calc_valid_list_cnt + function_whitelist.o(i.whitelist_write_1zone) refers to function_whitelist.o(i.get_offset) for get_offset + function_whitelist.o(i.whitelist_write_1zone) refers to function_whitelist.o(i.write_list_sub) for write_list_sub + function_whitelist.o(i.write_list_sub) refers to function_whitelist.o(.bss) for list + function_whitelist.o(i.write_list_sub) refers to function_whitelist.o(.data) for list_valid_cnt + transparentupgrade.o(i.Upgrade_BeaconQuery) refers to memseta.o(.text) for __aeabi_memclr4 + transparentupgrade.o(i.Upgrade_BeaconQuery) refers to transparentupgrade.o(i.Upgrade_CRC) for Upgrade_CRC + transparentupgrade.o(i.Upgrade_BeaconQuery) refers to memmovea.o(.text) for __aeabi_memcpy + transparentupgrade.o(i.Upgrade_BeaconQuery) refers to transparentupgrade.o(i.Upgrade_TxPayload) for Upgrade_TxPayload + transparentupgrade.o(i.Upgrade_BeaconQuery) refers to transparentupgrade.o(i.Upgrade_WaitRfSendOK) for Upgrade_WaitRfSendOK + transparentupgrade.o(i.Upgrade_BeaconQuery) refers to transparentupgrade.o(i.Upgrade_DelayUs) for Upgrade_DelayUs + transparentupgrade.o(i.Upgrade_BeaconQuery) refers to transparentupgrade.o(.bss) for DownLoad + transparentupgrade.o(i.Upgrade_CRC) refers to common_math.o(i.crc16) for crc16 + transparentupgrade.o(i.Upgrade_CheckNextPackArrive) refers to memmovea.o(.text) for __aeabi_memcpy + transparentupgrade.o(i.Upgrade_CheckNextPackArrive) refers to transparentupgrade.o(.bss) for update + transparentupgrade.o(i.Upgrade_DelayUs) refers to transparentupgrade.o(i.basic_delay_us_update) for basic_delay_us_update + transparentupgrade.o(i.Upgrade_ParameterInit) refers to transparentupgrade.o(i.log_debug) for log_debug + transparentupgrade.o(i.Upgrade_ParameterInit) refers to transparentupgrade.o(.bss) for DownLoad + transparentupgrade.o(i.Upgrade_PassThrough_CheckHead) refers to transparentupgrade.o(.bss) for DownLoad + transparentupgrade.o(i.Upgrade_RfSendCallBack) refers to memseta.o(.text) for __aeabi_memclr4 + transparentupgrade.o(i.Upgrade_RfSendCallBack) refers to memmovea.o(.text) for __aeabi_memcpy + transparentupgrade.o(i.Upgrade_RfSendCallBack) refers to transparentupgrade.o(i.Upgrade_PassThrough_CheckHead) for Upgrade_PassThrough_CheckHead + transparentupgrade.o(i.Upgrade_RfSendCallBack) refers to transparentupgrade.o(i.Upgrade_CRC) for Upgrade_CRC + transparentupgrade.o(i.Upgrade_RfSendCallBack) refers to transparentupgrade.o(i.log_debug) for log_debug + transparentupgrade.o(i.Upgrade_RfSendCallBack) refers to transparentupgrade.o(.data) for PassThroughStep + transparentupgrade.o(i.Upgrade_RfSendCallBack) refers to transparentupgrade.o(.bss) for DownLoad + transparentupgrade.o(i.Upgrade_SendBeacon) refers to memseta.o(.text) for __aeabi_memclr4 + transparentupgrade.o(i.Upgrade_SendBeacon) refers to transparentupgrade.o(i.Upgrade_CRC) for Upgrade_CRC + transparentupgrade.o(i.Upgrade_SendBeacon) refers to transparentupgrade.o(i.Upgrade_TxPayload) for Upgrade_TxPayload + transparentupgrade.o(i.Upgrade_SendBeacon) refers to transparentupgrade.o(i.Upgrade_WaitRfSendOK) for Upgrade_WaitRfSendOK + transparentupgrade.o(i.Upgrade_SendBeacon) refers to transparentupgrade.o(i.Upgrade_DelayUs) for Upgrade_DelayUs + transparentupgrade.o(i.Upgrade_SendBeacon) refers to transparentupgrade.o(.bss) for DownLoad + transparentupgrade.o(i.Upgrade_SendPassThroughPack) refers to memseta.o(.text) for __aeabi_memclr4 + transparentupgrade.o(i.Upgrade_SendPassThroughPack) refers to transparentupgrade.o(i.Upgrade_TxPayload) for Upgrade_TxPayload + transparentupgrade.o(i.Upgrade_SendPassThroughPack) refers to transparentupgrade.o(i.Upgrade_WaitRfSendOK) for Upgrade_WaitRfSendOK + transparentupgrade.o(i.Upgrade_SendPassThroughPack) refers to transparentupgrade.o(i.Upgrade_DelayUs) for Upgrade_DelayUs + transparentupgrade.o(i.Upgrade_SendPassThroughPack) refers to transparentupgrade.o(.bss) for DownLoad + transparentupgrade.o(i.Upgrade_Start) refers to transparentupgrade.o(.data) for DownFSM + transparentupgrade.o(i.Upgrade_Start) refers to transparentupgrade.o(.bss) for DownLoad + transparentupgrade.o(i.Upgrade_Start) refers to base_core.o(.data) for base_core + transparentupgrade.o(i.Upgrade_StartGetNextPack) refers to transparentupgrade.o(i.update_request_pkt_to_pc) for update_request_pkt_to_pc + transparentupgrade.o(i.Upgrade_StartGetNextPack) refers to transparentupgrade.o(.bss) for update + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(i.Upgrade_SendBeacon) for Upgrade_SendBeacon + transparentupgrade.o(i.Upgrade_TickHandler) refers to memseta.o(.text) for __aeabi_memclr + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(i.Upgrade_StartGetNextPack) for Upgrade_StartGetNextPack + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(i.Upgrade_ClrBit) for Upgrade_ClrBit + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(i.log_debug) for log_debug + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(i.Upgrade_CheckNextPackArrive) for Upgrade_CheckNextPackArrive + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(i.Upgrade_CRC) for Upgrade_CRC + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(i.Upgrade_SendPassThroughPack) for Upgrade_SendPassThroughPack + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(i.Upgrade_DelayUs) for Upgrade_DelayUs + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(i.Upgrade_GetBit) for Upgrade_GetBit + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(i.Upgrade_BeaconQuery) for Upgrade_BeaconQuery + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(i.updat__exit) for updat__exit + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(.data) for TickTimeOut + transparentupgrade.o(i.Upgrade_TickHandler) refers to transparentupgrade.o(.bss) for DownLoad + transparentupgrade.o(i.Upgrade_TxPayload) refers to rf24l01 - multi.o(i.set_tx_ok_flag) for set_tx_ok_flag + transparentupgrade.o(i.Upgrade_TxPayload) refers to base_core.o(.data) for base_core + transparentupgrade.o(i.Upgrade_TxPayload) refers to platform.o(.data) for platform + transparentupgrade.o(i.Upgrade_WaitRfSendOK) refers to rf24l01 - multi.o(i.get_tx_ok_flag) for get_tx_ok_flag + transparentupgrade.o(i.Upgrade_WaitRfSendOK) refers to transparentupgrade.o(i.Upgrade_DelayUs) for Upgrade_DelayUs + transparentupgrade.o(i.save_keypad_ack_data) refers to transparentupgrade.o(i.Upgrade_RfSendCallBack) for Upgrade_RfSendCallBack + transparentupgrade.o(i.save_keypad_ack_data) refers to transparentupgrade.o(.bss) for update + transparentupgrade.o(i.updat__exit) refers to transparentupgrade.o(i.basic_delay_us_update) for basic_delay_us_update + transparentupgrade.o(i.updat__exit) refers to transparentupgrade.o(i.update_request_pkt_to_pc) for update_request_pkt_to_pc + transparentupgrade.o(i.updat__exit) refers to platform.o(.data) for platform + transparentupgrade.o(i.updat__exit) refers to base_core.o(.data) for base_core + transparentupgrade.o(i.updat__exit) refers to transparentupgrade.o(.bss) for update + transparentupgrade.o(i.update_2_timer) refers to transparentupgrade.o(i.Upgrade_TickHandler) for Upgrade_TickHandler + transparentupgrade.o(i.update_2_timer) refers to fucntion_text_message.o(i.Msg_TickHandler) for Msg_TickHandler + transparentupgrade.o(i.update_2_timer) refers to transparentupgrade.o(.bss) for update + transparentupgrade.o(i.update_kp_enter) refers to transparentupgrade.o(i.Upgrade_ParameterInit) for Upgrade_ParameterInit + transparentupgrade.o(i.update_kp_enter) refers to transparentupgrade.o(i.Upgrade_Start) for Upgrade_Start + transparentupgrade.o(i.update_kp_enter) refers to function.o(i.user__pc_cmd_ack) for user__pc_cmd_ack + transparentupgrade.o(i.update_kp_enter) refers to fucntion_text_message.o(i.msg_get_pc_data) for msg_get_pc_data + transparentupgrade.o(i.update_kp_enter) refers to memmovea.o(.text) for __aeabi_memcpy + transparentupgrade.o(i.update_kp_enter) refers to transparentupgrade.o(.bss) for update + transparentupgrade.o(i.update_kp_enter) refers to base_core.o(.data) for base_core + transparentupgrade.o(i.update_kp_enter) refers to transparentupgrade.o(.data) for DownFSM + transparentupgrade.o(i.update_request_pkt_to_pc) refers to base_core.o(.data) for base_core + aes.o(i.AES_Decrypt) refers to aes.o(i.decrypt) for decrypt + aes.o(i.AES_Decrypt) refers to memmovea.o(.text) for __aeabi_memcpy + aes.o(i.AES_Decrypt) refers to malloc.o(i.free) for free + aes.o(i.AES_Decrypt) refers to aes.o(.data) for Nc + aes.o(i.AES_Encrypt) refers to aes.o(i.encrypt) for encrypt + aes.o(i.AES_Encrypt) refers to memmovea.o(.text) for __aeabi_memcpy + aes.o(i.AES_Encrypt) refers to malloc.o(i.free) for free + aes.o(i.AES_Encrypt) refers to aes.o(.data) for Nc + aes.o(i.AddRoundKey) refers to aes.o(.bss) for RoundKey + aes.o(i.Base64Decode) refers to aes.o(i.GetBase64Value) for GetBase64Value + aes.o(i.Base64Encode) refers to aes.o(.data) for Base64Encode + aes.o(i.Cipher) refers to aes.o(i.AddRoundKey) for AddRoundKey + aes.o(i.Cipher) refers to aes.o(i.SubBytes) for SubBytes + aes.o(i.Cipher) refers to aes.o(i.ShiftRows) for ShiftRows + aes.o(i.Cipher) refers to aes.o(i.MixColumns) for MixColumns + aes.o(i.Cipher) refers to aes.o(.bss) for in + aes.o(i.Cipher) refers to aes.o(.data) for Nr + aes.o(i.InvCipher) refers to aes.o(i.AddRoundKey) for AddRoundKey + aes.o(i.InvCipher) refers to aes.o(i.InvShiftRows) for InvShiftRows + aes.o(i.InvCipher) refers to aes.o(i.InvSubBytes) for InvSubBytes + aes.o(i.InvCipher) refers to aes.o(i.InvMixColumns) for InvMixColumns + aes.o(i.InvCipher) refers to aes.o(.bss) for in + aes.o(i.InvCipher) refers to aes.o(.data) for Nr + aes.o(i.InvMixColumns) refers to aes.o(.bss) for state + aes.o(i.InvShiftRows) refers to aes.o(.bss) for state + aes.o(i.InvSubBytes) refers to aes.o(.bss) for state + aes.o(i.InvSubBytes) refers to aes.o(.constdata) for rsbox + aes.o(i.KeyExpansion) refers to memmovea.o(.text) for __aeabi_memcpy + aes.o(i.KeyExpansion) refers to aes.o(i.getSBoxValue) for getSBoxValue + aes.o(i.KeyExpansion) refers to aes.o(.data) for Nk + aes.o(i.KeyExpansion) refers to aes.o(.bss) for Key + aes.o(i.KeyExpansion) refers to aes.o(.constdata) for sbox + aes.o(i.MixColumns) refers to aes.o(.bss) for state + aes.o(i.STM32_AES_ECB_Decrypt) refers to crypto.o(i.AES_ECB_Decrypt_Init) for AES_ECB_Decrypt_Init + aes.o(i.STM32_AES_ECB_Decrypt) refers to crypto.o(i.AES_ECB_Decrypt_Append) for AES_ECB_Decrypt_Append + aes.o(i.STM32_AES_ECB_Decrypt) refers to crypto.o(i.AES_ECB_Decrypt_Finish) for AES_ECB_Decrypt_Finish + aes.o(i.STM32_AES_ECB_Encrypt) refers to crypto.o(i.AES_ECB_Encrypt_Init) for AES_ECB_Encrypt_Init + aes.o(i.STM32_AES_ECB_Encrypt) refers to crypto.o(i.AES_ECB_Encrypt_Append) for AES_ECB_Encrypt_Append + aes.o(i.STM32_AES_ECB_Encrypt) refers to crypto.o(i.AES_ECB_Encrypt_Finish) for AES_ECB_Encrypt_Finish + aes.o(i.ShiftRows) refers to aes.o(.bss) for state + aes.o(i.SubBytes) refers to aes.o(.bss) for state + aes.o(i.SubBytes) refers to aes.o(.constdata) for sbox + aes.o(i.decrypt) refers to malloc.o(i.malloc) for malloc + aes.o(i.decrypt) refers to memseta.o(.text) for __aeabi_memclr + aes.o(i.decrypt) refers to aes.o(i.KeyExpansion) for KeyExpansion + aes.o(i.decrypt) refers to aes.o(i.InvCipher) for InvCipher + aes.o(i.decrypt) refers to memmovea.o(.text) for __aeabi_memcpy + aes.o(i.decrypt) refers to aes.o(.data) for Nc + aes.o(i.decrypt) refers to aes.o(.bss) for Key + aes.o(i.encrypt) refers to malloc.o(i.malloc) for malloc + aes.o(i.encrypt) refers to memseta.o(.text) for __aeabi_memclr + aes.o(i.encrypt) refers to aes.o(i.KeyExpansion) for KeyExpansion + aes.o(i.encrypt) refers to aes.o(i.Cipher) for Cipher + aes.o(i.encrypt) refers to memmovea.o(.text) for __aeabi_memcpy + aes.o(i.encrypt) refers to aes.o(.data) for Nc + aes.o(i.encrypt) refers to aes.o(.bss) for Key + aes.o(i.getSBoxInvert) refers to aes.o(.constdata) for rsbox + aes.o(i.getSBoxValue) refers to aes.o(.constdata) for sbox + segger_rtt.o(i.SEGGER_RTT_AllocDownBuffer) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_AllocDownBuffer) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_AllocUpBuffer) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_AllocUpBuffer) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_ConfigDownBuffer) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_ConfigDownBuffer) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_ConfigUpBuffer) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_ConfigUpBuffer) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_GetKey) refers to segger_rtt.o(i.SEGGER_RTT_Read) for SEGGER_RTT_Read + segger_rtt.o(i.SEGGER_RTT_HasData) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_HasKey) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_HasKey) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_Init) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_PutChar) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_PutChar) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_PutCharSkip) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_PutCharSkip) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_PutCharSkipNoLock) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_Read) refers to segger_rtt.o(i.SEGGER_RTT_ReadNoLock) for SEGGER_RTT_ReadNoLock + segger_rtt.o(i.SEGGER_RTT_ReadNoLock) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_ReadNoLock) refers to memmovea.o(.text) for __aeabi_memcpy + segger_rtt.o(i.SEGGER_RTT_ReadNoLock) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_SetFlagsDownBuffer) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_SetFlagsDownBuffer) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_SetFlagsUpBuffer) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_SetFlagsUpBuffer) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_SetNameDownBuffer) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_SetNameDownBuffer) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_SetNameUpBuffer) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_SetNameUpBuffer) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_SetTerminal) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_SetTerminal) refers to segger_rtt.o(i._WriteBlocking) for _WriteBlocking + segger_rtt.o(i.SEGGER_RTT_SetTerminal) refers to segger_rtt.o(i._GetAvailWriteSpace) for _GetAvailWriteSpace + segger_rtt.o(i.SEGGER_RTT_SetTerminal) refers to segger_rtt.o(i._WriteNoCheck) for _WriteNoCheck + segger_rtt.o(i.SEGGER_RTT_SetTerminal) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_SetTerminal) refers to segger_rtt.o(.data) for _aTerminalId + segger_rtt.o(i.SEGGER_RTT_TerminalOut) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_TerminalOut) refers to strlen.o(.text) for strlen + segger_rtt.o(i.SEGGER_RTT_TerminalOut) refers to segger_rtt.o(i._GetAvailWriteSpace) for _GetAvailWriteSpace + segger_rtt.o(i.SEGGER_RTT_TerminalOut) refers to segger_rtt.o(i._PostTerminalSwitch) for _PostTerminalSwitch + segger_rtt.o(i.SEGGER_RTT_TerminalOut) refers to segger_rtt.o(i._WriteBlocking) for _WriteBlocking + segger_rtt.o(i.SEGGER_RTT_TerminalOut) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_TerminalOut) refers to segger_rtt.o(.data) for _ActiveTerminal + segger_rtt.o(i.SEGGER_RTT_WaitKey) refers to segger_rtt.o(i.SEGGER_RTT_GetKey) for SEGGER_RTT_GetKey + segger_rtt.o(i.SEGGER_RTT_Write) refers to segger_rtt.o(i._DoInit) for _DoInit + segger_rtt.o(i.SEGGER_RTT_Write) refers to segger_rtt.o(i.SEGGER_RTT_WriteNoLock) for SEGGER_RTT_WriteNoLock + segger_rtt.o(i.SEGGER_RTT_Write) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_WriteNoLock) refers to segger_rtt.o(i._GetAvailWriteSpace) for _GetAvailWriteSpace + segger_rtt.o(i.SEGGER_RTT_WriteNoLock) refers to segger_rtt.o(i._WriteNoCheck) for _WriteNoCheck + segger_rtt.o(i.SEGGER_RTT_WriteNoLock) refers to segger_rtt.o(i._WriteBlocking) for _WriteBlocking + segger_rtt.o(i.SEGGER_RTT_WriteNoLock) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_WriteSkipNoLock) refers to memmovea.o(.text) for __aeabi_memcpy + segger_rtt.o(i.SEGGER_RTT_WriteSkipNoLock) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i.SEGGER_RTT_WriteString) refers to strlen.o(.text) for strlen + segger_rtt.o(i.SEGGER_RTT_WriteString) refers to segger_rtt.o(i.SEGGER_RTT_Write) for SEGGER_RTT_Write + segger_rtt.o(i.SEGGER_RTT_WriteWithOverwriteNoLock) refers to memmovea.o(.text) for __aeabi_memcpy + segger_rtt.o(i.SEGGER_RTT_WriteWithOverwriteNoLock) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i._DoInit) refers to strcpy.o(.text) for strcpy + segger_rtt.o(i._DoInit) refers to segger_rtt.o(.bss) for _SEGGER_RTT + segger_rtt.o(i._PostTerminalSwitch) refers to segger_rtt.o(i._WriteBlocking) for _WriteBlocking + segger_rtt.o(i._PostTerminalSwitch) refers to segger_rtt.o(.data) for _aTerminalId + segger_rtt.o(i._WriteBlocking) refers to memmovea.o(.text) for __aeabi_memcpy + segger_rtt.o(i._WriteNoCheck) refers to memmovea.o(.text) for __aeabi_memcpy + segger_rtt_printf.o(i.SEGGER_RTT_printf) refers to segger_rtt_printf.o(i.SEGGER_RTT_vprintf) for SEGGER_RTT_vprintf + segger_rtt_printf.o(i.SEGGER_RTT_vprintf) refers to segger_rtt_printf.o(i._StoreChar) for _StoreChar + segger_rtt_printf.o(i.SEGGER_RTT_vprintf) refers to segger_rtt_printf.o(i._PrintInt) for _PrintInt + segger_rtt_printf.o(i.SEGGER_RTT_vprintf) refers to segger_rtt_printf.o(i._PrintUnsigned) for _PrintUnsigned + segger_rtt_printf.o(i.SEGGER_RTT_vprintf) refers to segger_rtt.o(i.SEGGER_RTT_Write) for SEGGER_RTT_Write + segger_rtt_printf.o(i._PrintInt) refers to segger_rtt_printf.o(i._StoreChar) for _StoreChar + segger_rtt_printf.o(i._PrintInt) refers to segger_rtt_printf.o(i._PrintUnsigned) for _PrintUnsigned + segger_rtt_printf.o(i._PrintUnsigned) refers to segger_rtt_printf.o(i._StoreChar) for _StoreChar + segger_rtt_printf.o(i._PrintUnsigned) refers to segger_rtt_printf.o(.constdata) for _aV2C + segger_rtt_printf.o(i._StoreChar) refers to segger_rtt.o(i.SEGGER_RTT_Write) for SEGGER_RTT_Write + crypto.o(i.AES_CBC_Decrypt_Append) refers to crypto.o(i.AES_general_SW_dec) for AES_general_SW_dec + crypto.o(i.AES_CBC_Decrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_CBC_Encrypt_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_CBC_Encrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_CCM_Decrypt_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_CCM_Decrypt_Finish) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_CCM_Decrypt_Init) refers to crypto.o(i.AES_CCM_Encrypt_Init) for AES_CCM_Encrypt_Init + crypto.o(i.AES_CCM_Encrypt_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_CCM_Encrypt_Finish) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_CCM_Encrypt_Init) refers to crypto.o(i.AES_keyschedule_enc_LL) for AES_keyschedule_enc_LL + crypto.o(i.AES_CCM_Encrypt_Init) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_CCM_Header_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_CFB_Decrypt_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_CFB_Decrypt_Init) refers to crypto.o(i.AES_CFB_Encrypt_Init) for AES_CFB_Encrypt_Init + crypto.o(i.AES_CFB_Encrypt_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_CFB_Encrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_CMAC_Decrypt_Append) refers to crypto.o(i.AES_CMAC_Encrypt_Append) for AES_CMAC_Encrypt_Append + crypto.o(i.AES_CMAC_Decrypt_Finish) refers to crypto.o(i.AES_CMAC_Encrypt_Append) for AES_CMAC_Encrypt_Append + crypto.o(i.AES_CMAC_Decrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_CMAC_Encrypt_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_CMAC_Encrypt_Finish) refers to crypto.o(i.AES_CMAC_Encrypt_Append) for AES_CMAC_Encrypt_Append + crypto.o(i.AES_CMAC_Encrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_CTR_Decrypt_Append) refers to crypto.o(i.AES_CTR_Encrypt_Append) for AES_CTR_Encrypt_Append + crypto.o(i.AES_CTR_Decrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_CTR_Encrypt_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_CTR_Encrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_ECB_Decrypt_Append) refers to crypto.o(i.AES_general_SW_dec) for AES_general_SW_dec + crypto.o(i.AES_ECB_Decrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_ECB_Encrypt_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_ECB_Encrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_GCM_Decrypt_Append) refers to crypto.o(i.AESgcmAppend) for AESgcmAppend + crypto.o(i.AES_GCM_Decrypt_Finish) refers to crypto.o(i.AESgcmFinal) for AESgcmFinal + crypto.o(i.AES_GCM_Decrypt_Init) refers to crypto.o(i.AES_GCM_Encrypt_Init) for AES_GCM_Encrypt_Init + crypto.o(i.AES_GCM_Encrypt_Append) refers to crypto.o(i.AESgcmAppend) for AESgcmAppend + crypto.o(i.AES_GCM_Encrypt_Finish) refers to crypto.o(i.AESgcmFinal) for AESgcmFinal + crypto.o(i.AES_GCM_Encrypt_Init) refers to crypto.o(i.AES_keyschedule_enc_LL) for AES_keyschedule_enc_LL + crypto.o(i.AES_GCM_Encrypt_Init) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_GCM_Encrypt_Init) refers to crypto.o(.constdata) for .constdata + crypto.o(i.AES_GCM_Header_Append) refers to crypto.o(i.gfmul) for gfmul + crypto.o(i.AES_KeyWrap_Decrypt_Append) refers to memseta.o(.text) for __aeabi_memclr4 + crypto.o(i.AES_KeyWrap_Decrypt_Append) refers to crypto.o(i.AES_general_SW_dec) for AES_general_SW_dec + crypto.o(i.AES_KeyWrap_Decrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_KeyWrap_Encrypt_Append) refers to memseta.o(.text) for __aeabi_memclr4 + crypto.o(i.AES_KeyWrap_Encrypt_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_KeyWrap_Encrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_OFB_Decrypt_Append) refers to crypto.o(i.AES_OFB_Encrypt_Append) for AES_OFB_Encrypt_Append + crypto.o(i.AES_OFB_Decrypt_Init) refers to crypto.o(i.AES_OFB_Encrypt_Init) for AES_OFB_Encrypt_Init + crypto.o(i.AES_OFB_Encrypt_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_OFB_Encrypt_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.AES_XTS_Common_Append) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_XTS_Common_Append) refers to crypto.o(i.AES_general_SW_dec) for AES_general_SW_dec + crypto.o(i.AES_XTS_Common_Init) refers to crypto.o(i.AES_keyschedule_enc_LL) for AES_keyschedule_enc_LL + crypto.o(i.AES_XTS_Common_Init) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AES_XTS_Common_Init) refers to crypto.o(i.AES_keyschedule_dec) for AES_keyschedule_dec + crypto.o(i.AES_XTS_Decrypt_Append) refers to crypto.o(i.AES_XTS_Common_Append) for AES_XTS_Common_Append + crypto.o(i.AES_XTS_Decrypt_Init) refers to crypto.o(i.AES_XTS_Common_Init) for AES_XTS_Common_Init + crypto.o(i.AES_XTS_Encrypt_Append) refers to crypto.o(i.AES_XTS_Common_Append) for AES_XTS_Common_Append + crypto.o(i.AES_XTS_Encrypt_Init) refers to crypto.o(i.AES_XTS_Common_Init) for AES_XTS_Common_Init + crypto.o(i.AES_general_SW_dec) refers to crypto.o(.constdata) for .constdata + crypto.o(i.AES_general_SW_enc) refers to crypto.o(.constdata) for .constdata + crypto.o(i.AES_keyschedule_dec) refers to crypto.o(i.AES_keyschedule_enc_LL) for AES_keyschedule_enc_LL + crypto.o(i.AES_keyschedule_dec) refers to crypto.o(.constdata) for .constdata + crypto.o(i.AES_keyschedule_enc) refers to crypto.o(i.AES_keyschedule_enc_LL) for AES_keyschedule_enc_LL + crypto.o(i.AES_keyschedule_enc_LL) refers to crypto.o(.constdata) for .constdata + crypto.o(i.AESgcmAppend) refers to crypto.o(i.gfmul) for gfmul + crypto.o(i.AESgcmAppend) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AESgcmFinal) refers to crypto.o(i.gfmul) for gfmul + crypto.o(i.AESgcmFinal) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.AESstdInit) refers to crypto.o(i.AES_keyschedule_dec) for AES_keyschedule_dec + crypto.o(i.AESstdInit) refers to crypto.o(i.AES_keyschedule_enc_LL) for AES_keyschedule_enc_LL + crypto.o(i.ARC4_Decrypt_Append) refers to crypto.o(i.ARC4_Encrypt_Append) for ARC4_Encrypt_Append + crypto.o(i.AddBig) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.AddBig) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.AddBig) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.AddBig) refers to crypto.o(i.Sub_Moduli_Big) for Sub_Moduli_Big + crypto.o(i.AddBig) refers to crypto.o(i.Add_Moduli_Big) for Add_Moduli_Big + crypto.o(i.AddBig) refers to crypto.o(i.SetZeroBig) for SetZeroBig + crypto.o(i.AddBig) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.AddBig) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.Add_Moduli_Big) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.Big_to_W8) refers to crypto.o(i.CountBytes) for CountBytes + crypto.o(i.Big_to_fixedW8) refers to crypto.o(i.CountBytes) for CountBytes + crypto.o(i.Big_to_fixedW8) refers to crypto.o(i.Big_to_W8) for Big_to_W8 + crypto.o(i.Binary_DoublePointMul) refers to crypto.o(i.ECCpoint2Monty) for ECCpoint2Monty + crypto.o(i.Binary_DoublePointMul) refers to crypto.o(i.ECCinitPoint) for ECCinitPoint + crypto.o(i.Binary_DoublePointMul) refers to crypto.o(i.ECCcopyPoint) for ECCcopyPoint + crypto.o(i.Binary_DoublePointMul) refers to crypto.o(i.MontyJacProjAddPoints) for MontyJacProjAddPoints + crypto.o(i.Binary_DoublePointMul) refers to crypto.o(i.MontyJacProjDoublePoint) for MontyJacProjDoublePoint + crypto.o(i.Binary_DoublePointMul) refers to crypto.o(i.GiveBit) for GiveBit + crypto.o(i.Binary_DoublePointMul) refers to crypto.o(i.ECCfreePoint) for ECCfreePoint + crypto.o(i.C25519keyExchange) refers to memmovea.o(.text) for __aeabi_memcpy + crypto.o(i.C25519keyExchange) refers to crypto.o(i.c25519_sm) for c25519_sm + crypto.o(i.C25519keyExchange) refers to crypto.o(i.fe25519_invert) for fe25519_invert + crypto.o(i.C25519keyExchange) refers to crypto.o(i.fe25519_mul) for fe25519_mul + crypto.o(i.C25519keyExchange) refers to crypto.o(i.fe25519_freeze) for fe25519_freeze + crypto.o(i.C25519keyGen) refers to crypto.o(i.C25519keyExchange) for C25519keyExchange + crypto.o(i.C25519keyGen) refers to crypto.o(.constdata) for .constdata + crypto.o(i.CHACHA_Decrypt_Append) refers to crypto.o(i.CHACHA_Encrypt_Append) for CHACHA_Encrypt_Append + crypto.o(i.CHACHA_Decrypt_Init) refers to crypto.o(i.CHACHA_Encrypt_Init) for CHACHA_Encrypt_Init + crypto.o(i.CHACHA_Encrypt_Append) refers to crypto.o(i.salsa20_wordtobyte) for salsa20_wordtobyte + crypto.o(i.CHACHA_Encrypt_Init) refers to crypto.o(.constdata) for .constdata + crypto.o(i.ChaCha20Poly1305_Append) refers to crypto.o(i.salsa20_wordtobyte) for salsa20_wordtobyte + crypto.o(i.ChaCha20Poly1305_Append) refers to crypto.o(i.Poly1305_Core_Update) for Poly1305_Core_Update + crypto.o(i.ChaCha20Poly1305_Decrypt_Append) refers to crypto.o(i.ChaCha20Poly1305_Append) for ChaCha20Poly1305_Append + crypto.o(i.ChaCha20Poly1305_Decrypt_Finish) refers to crypto.o(i.Poly1305_Core_Update) for Poly1305_Core_Update + crypto.o(i.ChaCha20Poly1305_Decrypt_Finish) refers to crypto.o(i.Poly1305_Core_Finish) for Poly1305_Core_Finish + crypto.o(i.ChaCha20Poly1305_Decrypt_Init) refers to crypto.o(i.ChaCha20Poly1305_Encrypt_Init) for ChaCha20Poly1305_Encrypt_Init + crypto.o(i.ChaCha20Poly1305_Encrypt_Append) refers to crypto.o(i.ChaCha20Poly1305_Append) for ChaCha20Poly1305_Append + crypto.o(i.ChaCha20Poly1305_Encrypt_Finish) refers to crypto.o(i.Poly1305_Core_Update) for Poly1305_Core_Update + crypto.o(i.ChaCha20Poly1305_Encrypt_Finish) refers to crypto.o(i.Poly1305_Core_Finish) for Poly1305_Core_Finish + crypto.o(i.ChaCha20Poly1305_Encrypt_Init) refers to crypto.o(i.salsa20_wordtobyte) for salsa20_wordtobyte + crypto.o(i.ChaCha20Poly1305_Encrypt_Init) refers to crypto.o(.constdata) for .constdata + crypto.o(i.ChaCha20Poly1305_Header_Append) refers to crypto.o(i.Poly1305_Core_Update) for Poly1305_Core_Update + crypto.o(i.CountBits) refers to crypto.o(i.IsZeroBig) for IsZeroBig + crypto.o(i.CountBytes) refers to crypto.o(i.IsZeroBig) for IsZeroBig + crypto.o(i.DES_CBC_Decrypt_Append) refers to crypto.o(i.desfunc) for desfunc + crypto.o(i.DES_CBC_Decrypt_Init) refers to crypto.o(i.DESstdInit) for DESstdInit + crypto.o(i.DES_CBC_Encrypt_Append) refers to crypto.o(i.desfunc) for desfunc + crypto.o(i.DES_CBC_Encrypt_Init) refers to crypto.o(i.DESstdInit) for DESstdInit + crypto.o(i.DES_ECB_Decrypt_Append) refers to crypto.o(i.desfunc) for desfunc + crypto.o(i.DES_ECB_Decrypt_Init) refers to crypto.o(i.DESstdInit) for DESstdInit + crypto.o(i.DES_ECB_Encrypt_Append) refers to crypto.o(i.desfunc) for desfunc + crypto.o(i.DES_ECB_Encrypt_Init) refers to crypto.o(i.DESstdInit) for DESstdInit + crypto.o(i.DESstdInit) refers to crypto.o(i.deskey) for deskey + crypto.o(i.DRBG_AES128_Block_cipher_df) refers to memmovea.o(.text) for __aeabi_memcpy4 + crypto.o(i.DRBG_AES128_Block_cipher_df) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.DRBG_AES128_Block_cipher_df) refers to crypto.o(i.AES_keyschedule_enc_LL) for AES_keyschedule_enc_LL + crypto.o(i.DRBG_AES128_Block_cipher_df) refers to crypto.o(.constdata) for .constdata + crypto.o(i.DRBG_AES128_Update) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.ECCcopyPoint) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.ECCfreeEC) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ECCfreePoint) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ECCfreePrivKey) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ECCgetPointCoordinate) refers to crypto.o(i.Big_to_fixedW8) for Big_to_fixedW8 + crypto.o(i.ECCgetPrivKeyValue) refers to crypto.o(i.Big_to_fixedW8) for Big_to_fixedW8 + crypto.o(i.ECCinitEC) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.ECCinitEC) refers to crypto.o(i.W8_to_Big) for W8_to_Big + crypto.o(i.ECCinitEC) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ECCinitPoint) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.ECCinitPoint) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ECCinitPoint) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.ECCinitPrivKey) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.ECCinitPrivKey) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.ECCkeyGen) refers to crypto.o(i.CountBits) for CountBits + crypto.o(i.ECCkeyGen) refers to crypto.o(i.RNGgenBytes) for RNGgenBytes + crypto.o(i.ECCkeyGen) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.ECCkeyGen) refers to crypto.o(i.IsZeroBig) for IsZeroBig + crypto.o(i.ECCkeyGen) refers to crypto.o(i.ECCinitPoint) for ECCinitPoint + crypto.o(i.ECCkeyGen) refers to crypto.o(i.ECCsetPointGenerator) for ECCsetPointGenerator + crypto.o(i.ECCkeyGen) refers to crypto.o(i.ECCscalarMul) for ECCscalarMul + crypto.o(i.ECCkeyGen) refers to crypto.o(i.ECCfreePoint) for ECCfreePoint + crypto.o(i.ECCpoint2Monty) refers to crypto.o(i.MontyMul) for MontyMul + crypto.o(i.ECCpointFromMonty) refers to crypto.o(i.MontyExit) for MontyExit + crypto.o(i.ECCscalarMul) refers to crypto.o(i.MontyInit) for MontyInit + crypto.o(i.ECCscalarMul) refers to crypto.o(i.NAF_Binary_PointMul) for NAF_Binary_PointMul + crypto.o(i.ECCscalarMul) refers to crypto.o(i.MontyKillAll) for MontyKillAll + crypto.o(i.ECCscalarMul) refers to crypto.o(i.Normalize) for Normalize + crypto.o(i.ECCsetPointCoordinate) refers to crypto.o(i.W8_to_Big) for W8_to_Big + crypto.o(i.ECCsetPointGenerator) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.ECCsetPointGenerator) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.ECCsetPrivKeyValue) refers to crypto.o(i.W8_to_Big) for W8_to_Big + crypto.o(i.ECCsymmetricPoint) refers to crypto.o(i.ECCcopyPoint) for ECCcopyPoint + crypto.o(i.ECCsymmetricPoint) refers to crypto.o(i.SubBig) for SubBig + crypto.o(i.ECCvalidatePubKey) refers to crypto.o(i.ECCinitPoint) for ECCinitPoint + crypto.o(i.ECCvalidatePubKey) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.ECCvalidatePubKey) refers to crypto.o(i.ECCcopyPoint) for ECCcopyPoint + crypto.o(i.ECCvalidatePubKey) refers to crypto.o(i.MontyInit) for MontyInit + crypto.o(i.ECCvalidatePubKey) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.ECCvalidatePubKey) refers to crypto.o(i.MontyMul) for MontyMul + crypto.o(i.ECCvalidatePubKey) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.ECCvalidatePubKey) refers to crypto.o(i.ModularAddBig) for ModularAddBig + crypto.o(i.ECCvalidatePubKey) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ECCvalidatePubKey) refers to crypto.o(i.MontyKillAll) for MontyKillAll + crypto.o(i.ECCvalidatePubKey) refers to crypto.o(i.ECCfreePoint) for ECCfreePoint + crypto.o(i.ECDSAfreeSign) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ECDSAgetSignature) refers to crypto.o(i.Big_to_fixedW8) for Big_to_fixedW8 + crypto.o(i.ECDSAinitSign) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.ECDSAinitSign) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ECDSAsetSignature) refers to crypto.o(i.W8_to_Big) for W8_to_Big + crypto.o(i.ECDSAsign) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.ECDSAsign) refers to crypto.o(i.ECCinitPoint) for ECCinitPoint + crypto.o(i.ECDSAsign) refers to crypto.o(i.ECCsetPointGenerator) for ECCsetPointGenerator + crypto.o(i.ECDSAsign) refers to crypto.o(i.MontyInit) for MontyInit + crypto.o(i.ECDSAsign) refers to crypto.o(i.CountBits) for CountBits + crypto.o(i.ECDSAsign) refers to crypto.o(i.RNGgenBytes) for RNGgenBytes + crypto.o(i.ECDSAsign) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.ECDSAsign) refers to crypto.o(i.IsZeroBig) for IsZeroBig + crypto.o(i.ECDSAsign) refers to crypto.o(i.NAF_Binary_PointMul) for NAF_Binary_PointMul + crypto.o(i.ECDSAsign) refers to crypto.o(i.Normalize) for Normalize + crypto.o(i.ECDSAsign) refers to crypto.o(i.AddBig) for AddBig + crypto.o(i.ECDSAsign) refers to crypto.o(i.SubBig) for SubBig + crypto.o(i.ECDSAsign) refers to crypto.o(i.MontyKillAll) for MontyKillAll + crypto.o(i.ECDSAsign) refers to crypto.o(i.ECCfreePoint) for ECCfreePoint + crypto.o(i.ECDSAsign) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ECDSAsign) refers to crypto.o(i.ModularInvBig) for ModularInvBig + crypto.o(i.ECDSAsign) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.ECDSAsign) refers to crypto.o(i.MontyMul) for MontyMul + crypto.o(i.ECDSAsign) refers to crypto.o(i.W8_to_Big) for W8_to_Big + crypto.o(i.ECDSAsign) refers to crypto.o(i.RightShift) for RightShift + crypto.o(i.ECDSAsign) refers to crypto.o(i.ModularAddBig) for ModularAddBig + crypto.o(i.ECDSAsign) refers to crypto.o(i.MontyExit) for MontyExit + crypto.o(i.ECDSAverify) refers to crypto.o(i.IsZeroBig) for IsZeroBig + crypto.o(i.ECDSAverify) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.ECDSAverify) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.ECDSAverify) refers to crypto.o(i.CountBits) for CountBits + crypto.o(i.ECDSAverify) refers to crypto.o(i.W8_to_Big) for W8_to_Big + crypto.o(i.ECDSAverify) refers to crypto.o(i.RightShift) for RightShift + crypto.o(i.ECDSAverify) refers to crypto.o(i.ModularInvBig) for ModularInvBig + crypto.o(i.ECDSAverify) refers to crypto.o(i.MontyInit) for MontyInit + crypto.o(i.ECDSAverify) refers to crypto.o(i.MontyMul) for MontyMul + crypto.o(i.ECDSAverify) refers to crypto.o(i.MontyKillR2) for MontyKillR2 + crypto.o(i.ECDSAverify) refers to crypto.o(i.MontyKillAll) for MontyKillAll + crypto.o(i.ECDSAverify) refers to crypto.o(i.ECCinitPoint) for ECCinitPoint + crypto.o(i.ECDSAverify) refers to crypto.o(i.ECCsetPointGenerator) for ECCsetPointGenerator + crypto.o(i.ECDSAverify) refers to crypto.o(i.Binary_DoublePointMul) for Binary_DoublePointMul + crypto.o(i.ECDSAverify) refers to crypto.o(i.Normalize) for Normalize + crypto.o(i.ECDSAverify) refers to crypto.o(i.SubBig) for SubBig + crypto.o(i.ECDSAverify) refers to crypto.o(i.ECCfreePoint) for ECCfreePoint + crypto.o(i.ECDSAverify) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ED25519keyGen) refers to crypto.o(i.SHA512_Init) for SHA512_Init + crypto.o(i.ED25519keyGen) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.ED25519keyGen) refers to crypto.o(i.SHA512_Finish) for SHA512_Finish + crypto.o(i.ED25519keyGen) refers to crypto.o(i.barrett_reduce) for barrett_reduce + crypto.o(i.ED25519keyGen) refers to crypto.o(i.ge25519_scalarmult_base) for ge25519_scalarmult_base + crypto.o(i.ED25519keyGen) refers to crypto.o(i.ge25519_pack) for ge25519_pack + crypto.o(i.ED25519keyGen) refers to memmovea.o(.text) for __aeabi_memmove + crypto.o(i.ED25519sign) refers to crypto.o(i.SHA512_Init) for SHA512_Init + crypto.o(i.ED25519sign) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.ED25519sign) refers to crypto.o(i.SHA512_Finish) for SHA512_Finish + crypto.o(i.ED25519sign) refers to crypto.o(i.barrett_reduce) for barrett_reduce + crypto.o(i.ED25519sign) refers to crypto.o(i.ge25519_scalarmult_base) for ge25519_scalarmult_base + crypto.o(i.ED25519sign) refers to crypto.o(i.ge25519_pack) for ge25519_pack + crypto.o(i.ED25519sign) refers to crypto.o(i.reduce_add_sub) for reduce_add_sub + crypto.o(i.ED25519verify) refers to crypto.o(i.ge25519_unpackneg_vartime) for ge25519_unpackneg_vartime + crypto.o(i.ED25519verify) refers to crypto.o(i.barrett_reduce) for barrett_reduce + crypto.o(i.ED25519verify) refers to crypto.o(i.SHA512_Init) for SHA512_Init + crypto.o(i.ED25519verify) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.ED25519verify) refers to crypto.o(i.SHA512_Finish) for SHA512_Finish + crypto.o(i.ED25519verify) refers to crypto.o(i.ge25519_double_scalarmult_vartime) for ge25519_double_scalarmult_vartime + crypto.o(i.ED25519verify) refers to crypto.o(i.ge25519_pack) for ge25519_pack + crypto.o(i.ED25519verify) refers to crypto.o(.constdata) for .constdata + crypto.o(i.FastDiv2) refers to crypto.o(i.IsZeroBig) for IsZeroBig + crypto.o(i.FastDivInnerBase) refers to crypto.o(i.SetZeroBig) for SetZeroBig + crypto.o(i.FastMul2) refers to crypto.o(i.IsZeroBig) for IsZeroBig + crypto.o(i.FastMulInnerBase) refers to crypto.o(i.IsZeroBig) for IsZeroBig + crypto.o(i.GenRndBN) refers to crypto.o(i.RNGgenBytes) for RNGgenBytes + crypto.o(i.GenRndBNmodN) refers to crypto.o(i.CountBits) for CountBits + crypto.o(i.GenRndBNmodN) refers to crypto.o(i.RNGgenBytes) for RNGgenBytes + crypto.o(i.GenRndBNmodN) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.HKDF_SHA512) refers to crypto.o(i.HMAC_SHA512_Init) for HMAC_SHA512_Init + crypto.o(i.HKDF_SHA512) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.HKDF_SHA512) refers to crypto.o(i.HMAC_SHA512_Finish) for HMAC_SHA512_Finish + crypto.o(i.HMAC_MD5_Append) refers to crypto.o(i.crl_u_MD5_Update) for crl_u_MD5_Update + crypto.o(i.HMAC_MD5_Finish) refers to crypto.o(i.MD5_Finish) for MD5_Finish + crypto.o(i.HMAC_MD5_Finish) refers to crypto.o(i.crl_u_MD5_Update) for crl_u_MD5_Update + crypto.o(i.HMAC_MD5_Init) refers to crypto.o(i.crl_u_MD5_Update) for crl_u_MD5_Update + crypto.o(i.HMAC_MD5_Init) refers to crypto.o(i.MD5_Finish) for MD5_Finish + crypto.o(i.HMAC_SHA1_Append) refers to crypto.o(i.SHA1_Append) for SHA1_Append + crypto.o(i.HMAC_SHA1_Finish) refers to crypto.o(i.SHA1_Finish) for SHA1_Finish + crypto.o(i.HMAC_SHA1_Finish) refers to crypto.o(i.SHA1_Append) for SHA1_Append + crypto.o(i.HMAC_SHA1_Init) refers to crypto.o(i.SHA1_Append) for SHA1_Append + crypto.o(i.HMAC_SHA1_Init) refers to crypto.o(i.SHA1_Finish) for SHA1_Finish + crypto.o(i.HMAC_SHA224_Append) refers to crypto.o(i.SHA256Update) for SHA256Update + crypto.o(i.HMAC_SHA224_Finish) refers to crypto.o(i.SHA224_Finish) for SHA224_Finish + crypto.o(i.HMAC_SHA224_Finish) refers to crypto.o(i.SHA256Update) for SHA256Update + crypto.o(i.HMAC_SHA224_Init) refers to crypto.o(i.SHA256Update) for SHA256Update + crypto.o(i.HMAC_SHA224_Init) refers to crypto.o(i.SHA224_Finish) for SHA224_Finish + crypto.o(i.HMAC_SHA256_Append) refers to crypto.o(i.SHA256Update) for SHA256Update + crypto.o(i.HMAC_SHA256_Finish) refers to crypto.o(i.SHA256_Finish) for SHA256_Finish + crypto.o(i.HMAC_SHA256_Finish) refers to crypto.o(i.SHA256Update) for SHA256Update + crypto.o(i.HMAC_SHA256_Init) refers to crypto.o(i.SHA256Update) for SHA256Update + crypto.o(i.HMAC_SHA256_Init) refers to crypto.o(i.SHA256_Finish) for SHA256_Finish + crypto.o(i.HMAC_SHA384_Append) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.HMAC_SHA384_Finish) refers to crypto.o(i.SHA384_Finish) for SHA384_Finish + crypto.o(i.HMAC_SHA384_Finish) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.HMAC_SHA384_Init) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.HMAC_SHA384_Init) refers to crypto.o(i.SHA384_Finish) for SHA384_Finish + crypto.o(i.HMAC_SHA512_Append) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.HMAC_SHA512_Finish) refers to crypto.o(i.SHA512_Finish) for SHA512_Finish + crypto.o(i.HMAC_SHA512_Finish) refers to crypto.o(i.SHA512_Init) for SHA512_Init + crypto.o(i.HMAC_SHA512_Finish) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.HMAC_SHA512_Init) refers to crypto.o(i.SHA512_Init) for SHA512_Init + crypto.o(i.HMAC_SHA512_Init) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.HMAC_SHA512_Init) refers to crypto.o(i.SHA512_Finish) for SHA512_Finish + crypto.o(i.MD5_Append) refers to crypto.o(i.crl_u_MD5_Update) for crl_u_MD5_Update + crypto.o(i.MD5_Finish) refers to crypto.o(i.crl_u_MD5_Finish) for crl_u_MD5_Finish + crypto.o(i.ModularAddBig) refers to crypto.o(i.AddBig) for AddBig + crypto.o(i.ModularAddBig) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.ModularAddBig) refers to crypto.o(i.SubBig) for SubBig + crypto.o(i.ModularExpSlidWin) refers to crypto.o(i.MontyInit) for MontyInit + crypto.o(i.ModularExpSlidWin) refers to crypto.o(i.MontyMul) for MontyMul + crypto.o(i.ModularExpSlidWin) refers to crypto.o(i.MontyKillR2) for MontyKillR2 + crypto.o(i.ModularExpSlidWin) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.ModularExpSlidWin) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.ModularExpSlidWin) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.ModularExpSlidWin) refers to crypto.o(i.MontyExit) for MontyExit + crypto.o(i.ModularExpSlidWin) refers to crypto.o(i.MontyKillAll) for MontyKillAll + crypto.o(i.ModularExpSlidWin) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ModularFastMul2) refers to crypto.o(i.FastMul2) for FastMul2 + crypto.o(i.ModularFastMul2) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.ModularFastMul2) refers to crypto.o(i.SubBig) for SubBig + crypto.o(i.ModularInvBig) refers to crypto.o(i.EvenBig) for EvenBig + crypto.o(i.ModularInvBig) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.ModularInvBig) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.ModularInvBig) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.ModularInvBig) refers to crypto.o(i.IsZeroBig) for IsZeroBig + crypto.o(i.ModularInvBig) refers to crypto.o(i.FastDiv2) for FastDiv2 + crypto.o(i.ModularInvBig) refers to crypto.o(i.AddBig) for AddBig + crypto.o(i.ModularInvBig) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.ModularInvBig) refers to crypto.o(i.SubBig) for SubBig + crypto.o(i.ModularInvBig) refers to crypto.o(i.SignBig) for SignBig + crypto.o(i.ModularInvBig) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.ModularSubBig) refers to crypto.o(i.SubBig) for SubBig + crypto.o(i.ModularSubBig) refers to crypto.o(i.SignBig) for SignBig + crypto.o(i.ModularSubBig) refers to crypto.o(i.AddBig) for AddBig + crypto.o(i.MontyExit) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.MontyExit) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.MontyExit) refers to crypto.o(i.MontyMul) for MontyMul + crypto.o(i.MontyExit) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.MontyInit) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.MontyInit) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.MontyInit) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.MontyInit) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.MontyInit) refers to crypto.o(i.CountBits) for CountBits + crypto.o(i.MontyInit) refers to crypto.o(i.LeftShift) for LeftShift + crypto.o(i.MontyInit) refers to crypto.o(i.SubBig) for SubBig + crypto.o(i.MontyInit) refers to crypto.o(i.FastMulInnerBase) for FastMulInnerBase + crypto.o(i.MontyInit) refers to crypto.o(i.MulBigbyUnInt) for MulBigbyUnInt + crypto.o(i.MontyInit) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.MontyJacProjAddPoints) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.MontyJacProjAddPoints) refers to crypto.o(i.ECCcopyPoint) for ECCcopyPoint + crypto.o(i.MontyJacProjAddPoints) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.MontyJacProjAddPoints) refers to crypto.o(i.MontyMul) for MontyMul + crypto.o(i.MontyJacProjAddPoints) refers to crypto.o(i.ModularSubBig) for ModularSubBig + crypto.o(i.MontyJacProjAddPoints) refers to crypto.o(i.IsZeroBig) for IsZeroBig + crypto.o(i.MontyJacProjAddPoints) refers to crypto.o(i.MontyJacProjDoublePoint) for MontyJacProjDoublePoint + crypto.o(i.MontyJacProjAddPoints) refers to crypto.o(i.ModularFastMul2) for ModularFastMul2 + crypto.o(i.MontyJacProjAddPoints) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.MontyJacProjDoublePoint) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.MontyJacProjDoublePoint) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.MontyJacProjDoublePoint) refers to crypto.o(i.MontyMul) for MontyMul + crypto.o(i.MontyJacProjDoublePoint) refers to crypto.o(i.ModularFastMul2) for ModularFastMul2 + crypto.o(i.MontyJacProjDoublePoint) refers to crypto.o(i.AddBig) for AddBig + crypto.o(i.MontyJacProjDoublePoint) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.MontyJacProjDoublePoint) refers to crypto.o(i.ModularSubBig) for ModularSubBig + crypto.o(i.MontyJacProjDoublePoint) refers to crypto.o(i.ModularAddBig) for ModularAddBig + crypto.o(i.MontyJacProjDoublePoint) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.MontyJacProjDoublePoint) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.MontyKillAll) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.MontyKillR2) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.MontyMul) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.MontyMul) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.MontyMul) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.MontyMul) refers to crypto.o(i.Sub_Moduli_Big) for Sub_Moduli_Big + crypto.o(i.MontyMul) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.MontyMul) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.MulBigbyUnInt) refers to crypto.o(i.SetZeroBig) for SetZeroBig + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(i.ECCinitPoint) for ECCinitPoint + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(i.ECCcopyPoint) for ECCcopyPoint + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(i.ECCpoint2Monty) for ECCpoint2Monty + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(i.GiveBit) for GiveBit + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(i.ECCsymmetricPoint) for ECCsymmetricPoint + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(i.MontyJacProjDoublePoint) for MontyJacProjDoublePoint + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(i.MontyJacProjAddPoints) for MontyJacProjAddPoints + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(i.ECCfreePoint) for ECCfreePoint + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.NAF_Binary_PointMul) refers to crypto.o(.constdata) for .constdata + crypto.o(i.Normalize) refers to crypto.o(i.ECCcopyPoint) for ECCcopyPoint + crypto.o(i.Normalize) refers to crypto.o(i.MontyExit) for MontyExit + crypto.o(i.Normalize) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.Normalize) refers to crypto.o(i.MontyMul) for MontyMul + crypto.o(i.Normalize) refers to crypto.o(i.ModularInvBig) for ModularInvBig + crypto.o(i.Normalize) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.Normalize) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.Normalize) refers to crypto.o(i.ECCpointFromMonty) for ECCpointFromMonty + crypto.o(i.Poly1305_Auth_Append) refers to crypto.o(i.Poly1305_Core_Update) for Poly1305_Core_Update + crypto.o(i.Poly1305_Auth_Finish) refers to crypto.o(i.Poly1305_Core_Finish) for Poly1305_Core_Finish + crypto.o(i.Poly1305_Auth_Init) refers to crypto.o(i.AESstdInit) for AESstdInit + crypto.o(i.Poly1305_Auth_Init) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.Poly1305_Verify_Append) refers to crypto.o(i.Poly1305_Auth_Append) for Poly1305_Auth_Append + crypto.o(i.Poly1305_Verify_Finish) refers to crypto.o(i.Poly1305_Core_Finish) for Poly1305_Core_Finish + crypto.o(i.Poly1305_Verify_Init) refers to crypto.o(i.Poly1305_Auth_Init) for Poly1305_Auth_Init + crypto.o(i.RNGgenBytes) refers to crypto.o(i.crl_DRBG_AES128_Generate) for crl_DRBG_AES128_Generate + crypto.o(i.RNGgenWords) refers to crypto.o(i.RNGgenBytes) for RNGgenBytes + crypto.o(i.RNGinit) refers to memseta.o(.text) for __aeabi_memclr4 + crypto.o(i.RNGinit) refers to memmovea.o(.text) for __aeabi_memcpy4 + crypto.o(i.RNGinit) refers to crypto.o(i.DRBG_AES128_Block_cipher_df) for DRBG_AES128_Block_cipher_df + crypto.o(i.RNGinit) refers to crypto.o(i.DRBG_AES128_Update) for DRBG_AES128_Update + crypto.o(i.RNGinit) refers to crypto.o(.constdata) for .constdata + crypto.o(i.RNGreseed) refers to memmovea.o(.text) for __aeabi_memcpy + crypto.o(i.RNGreseed) refers to crypto.o(i.DRBG_AES128_Block_cipher_df) for DRBG_AES128_Block_cipher_df + crypto.o(i.RNGreseed) refers to crypto.o(i.AES_keyschedule_enc_LL) for AES_keyschedule_enc_LL + crypto.o(i.RNGreseed) refers to crypto.o(i.DRBG_AES128_Update) for DRBG_AES128_Update + crypto.o(i.RSASP1) refers to crypto.o(i.crl_ModularExp) for crl_ModularExp + crypto.o(i.RSAVP1) refers to crypto.o(i.crl_ModularExp) for crl_ModularExp + crypto.o(i.RSA_PKCS1v15_Decrypt) refers to crypto.o(i.RSASP1) for RSASP1 + crypto.o(i.RSA_PKCS1v15_Encrypt) refers to crypto.o(i.crl_DRBG_AES128_Generate) for crl_DRBG_AES128_Generate + crypto.o(i.RSA_PKCS1v15_Encrypt) refers to crypto.o(i.RSAVP1) for RSAVP1 + crypto.o(i.RSA_PKCS1v15_Sign) refers to crypto.o(i.RSASP1) for RSASP1 + crypto.o(i.RSA_PKCS1v15_Verify) refers to crypto.o(i.RSAVP1) for RSAVP1 + crypto.o(i.SHA1Final) refers to crypto.o(i.SHA1Transform) for SHA1Transform + crypto.o(i.SHA1Final) refers to memmovea.o(.text) for __aeabi_memmove4 + crypto.o(i.SHA1Update) refers to memmovea.o(.text) for __aeabi_memcpy + crypto.o(i.SHA1Update) refers to crypto.o(i.SHA1Transform) for SHA1Transform + crypto.o(i.SHA1_Append) refers to memmovea.o(.text) for __aeabi_memcpy + crypto.o(i.SHA1_Append) refers to crypto.o(i.SHA1Transform) for SHA1Transform + crypto.o(i.SHA1_Finish) refers to crypto.o(i.SHA1Final) for SHA1Final + crypto.o(i.SHA224Final) refers to crypto.o(i.SHA256Transform) for SHA256Transform + crypto.o(i.SHA224Final) refers to memmovea.o(.text) for __aeabi_memmove4 + crypto.o(i.SHA224_Append) refers to crypto.o(i.SHA256Update) for SHA256Update + crypto.o(i.SHA224_Finish) refers to crypto.o(i.SHA224Final) for SHA224Final + crypto.o(i.SHA256Final) refers to crypto.o(i.SHA256Transform) for SHA256Transform + crypto.o(i.SHA256Final) refers to memmovea.o(.text) for __aeabi_memmove4 + crypto.o(i.SHA256Transform) refers to crypto.o(.constdata) for .constdata + crypto.o(i.SHA256Update) refers to memmovea.o(.text) for __aeabi_memcpy + crypto.o(i.SHA256Update) refers to crypto.o(i.SHA256Transform) for SHA256Transform + crypto.o(i.SHA256_Append) refers to crypto.o(i.SHA256Update) for SHA256Update + crypto.o(i.SHA256_Finish) refers to crypto.o(i.SHA256Final) for SHA256Final + crypto.o(i.SHA384Final) refers to crypto.o(i.SHA512Transform) for SHA512Transform + crypto.o(i.SHA384Final) refers to memseta.o(.text) for __aeabi_memclr4 + crypto.o(i.SHA384Final) refers to memmovea.o(.text) for __aeabi_memmove4 + crypto.o(i.SHA384_Append) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.SHA384_Finish) refers to crypto.o(i.SHA384Final) for SHA384Final + crypto.o(i.SHA512Final) refers to crypto.o(i.SHA512Transform) for SHA512Transform + crypto.o(i.SHA512Final) refers to memseta.o(.text) for __aeabi_memclr4 + crypto.o(i.SHA512Final) refers to memmovea.o(.text) for __aeabi_memmove4 + crypto.o(i.SHA512Transform) refers to crypto.o(.constdata) for .constdata + crypto.o(i.SHA512Update) refers to memmovea.o(.text) for __aeabi_memcpy + crypto.o(i.SHA512Update) refers to crypto.o(i.SHA512Transform) for SHA512Transform + crypto.o(i.SHA512_Append) refers to crypto.o(i.SHA512Update) for SHA512Update + crypto.o(i.SHA512_Finish) refers to crypto.o(i.SHA512Final) for SHA512Final + crypto.o(i.SubBig) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.SubBig) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.SubBig) refers to crypto.o(i.Add_Moduli_Big) for Add_Moduli_Big + crypto.o(i.SubBig) refers to crypto.o(i.Sub_Moduli_Big) for Sub_Moduli_Big + crypto.o(i.SubBig) refers to crypto.o(i.SetZeroBig) for SetZeroBig + crypto.o(i.SubBig) refers to crypto.o(i.InitBig) for InitBig + crypto.o(i.SubBig) refers to crypto.o(i.CopyBig) for CopyBig + crypto.o(i.SubBig) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.TDES_CBC_Decrypt_Append) refers to crypto.o(i.desfunc) for desfunc + crypto.o(i.TDES_CBC_Decrypt_Init) refers to crypto.o(i.TDESstdInit) for TDESstdInit + crypto.o(i.TDES_CBC_Encrypt_Append) refers to crypto.o(i.desfunc) for desfunc + crypto.o(i.TDES_CBC_Encrypt_Init) refers to crypto.o(i.TDESstdInit) for TDESstdInit + crypto.o(i.TDES_ECB_Decrypt_Append) refers to crypto.o(i.desfunc) for desfunc + crypto.o(i.TDES_ECB_Decrypt_Init) refers to crypto.o(i.TDESstdInit) for TDESstdInit + crypto.o(i.TDES_ECB_Encrypt_Append) refers to crypto.o(i.desfunc) for desfunc + crypto.o(i.TDES_ECB_Encrypt_Init) refers to crypto.o(i.TDESstdInit) for TDESstdInit + crypto.o(i.TDESstdInit) refers to crypto.o(i.deskey) for deskey + crypto.o(i.W8_to_Big) refers to crypto.o(i.SetZeroBig) for SetZeroBig + crypto.o(i.barrett_reduce) refers to crypto.o(i.reduce_add_sub) for reduce_add_sub + crypto.o(i.barrett_reduce) refers to crypto.o(.constdata) for .constdata + crypto.o(i.c25519_sm) refers to crypto.o(i.fe25519_add) for fe25519_add + crypto.o(i.c25519_sm) refers to crypto.o(i.fe25519_sub) for fe25519_sub + crypto.o(i.c25519_sm) refers to crypto.o(i.fe25519_mul) for fe25519_mul + crypto.o(i.c25519_sm) refers to crypto.o(i.reduceRS) for reduceRS + crypto.o(i.crl_DRBG_AES128_Generate) refers to crypto.o(i.DRBG_AES128_Block_cipher_df) for DRBG_AES128_Block_cipher_df + crypto.o(i.crl_DRBG_AES128_Generate) refers to crypto.o(i.AES_keyschedule_enc_LL) for AES_keyschedule_enc_LL + crypto.o(i.crl_DRBG_AES128_Generate) refers to crypto.o(i.DRBG_AES128_Update) for DRBG_AES128_Update + crypto.o(i.crl_DRBG_AES128_Generate) refers to crypto.o(i.AES_general_SW_enc) for AES_general_SW_enc + crypto.o(i.crl_DRBG_AES128_Instantiate) refers to memseta.o(.text) for __aeabi_memclr4 + crypto.o(i.crl_DRBG_AES128_Instantiate) refers to memmovea.o(.text) for __aeabi_memcpy4 + crypto.o(i.crl_DRBG_AES128_Instantiate) refers to crypto.o(i.DRBG_AES128_Block_cipher_df) for DRBG_AES128_Block_cipher_df + crypto.o(i.crl_DRBG_AES128_Instantiate) refers to crypto.o(i.DRBG_AES128_Update) for DRBG_AES128_Update + crypto.o(i.crl_DRBG_AES128_Instantiate) refers to crypto.o(.constdata) for .constdata + crypto.o(i.crl_DRBG_AES128_Reseed) refers to memmovea.o(.text) for __aeabi_memcpy + crypto.o(i.crl_DRBG_AES128_Reseed) refers to crypto.o(i.DRBG_AES128_Block_cipher_df) for DRBG_AES128_Block_cipher_df + crypto.o(i.crl_DRBG_AES128_Reseed) refers to crypto.o(i.AES_keyschedule_enc_LL) for AES_keyschedule_enc_LL + crypto.o(i.crl_DRBG_AES128_Reseed) refers to crypto.o(i.DRBG_AES128_Update) for DRBG_AES128_Update + crypto.o(i.crl_ModularExp) refers to crypto.o(i.StAllocBig) for StAllocBig + crypto.o(i.crl_ModularExp) refers to crypto.o(i.W8_to_Big) for W8_to_Big + crypto.o(i.crl_ModularExp) refers to crypto.o(i.CompareBig) for CompareBig + crypto.o(i.crl_ModularExp) refers to crypto.o(i.ModularExpSlidWin) for ModularExpSlidWin + crypto.o(i.crl_ModularExp) refers to crypto.o(i.CountBytes) for CountBytes + crypto.o(i.crl_ModularExp) refers to crypto.o(i.Big_to_W8) for Big_to_W8 + crypto.o(i.crl_ModularExp) refers to crypto.o(i.StFreeBig) for StFreeBig + crypto.o(i.crl_u_MD5_Finish) refers to crypto.o(i.crl_u_MD5_Update) for crl_u_MD5_Update + crypto.o(i.crl_u_MD5_Finish) refers to crypto.o(.constdata) for .constdata + crypto.o(i.crl_u_MD5_Update) refers to memmovea.o(.text) for __aeabi_memcpy + crypto.o(i.crl_u_MD5_Update) refers to crypto.o(i.md5_process) for md5_process + crypto.o(i.desfunc) refers to crypto.o(.constdata) for .constdata + crypto.o(i.deskey) refers to memmovea.o(.text) for __aeabi_memcpy4 + crypto.o(i.deskey) refers to crypto.o(.constdata) for .constdata + crypto.o(i.ed25519_add) refers to crypto.o(i.fe25519_sub) for fe25519_sub + crypto.o(i.ed25519_add) refers to crypto.o(i.fe25519_mul) for fe25519_mul + crypto.o(i.ed25519_add) refers to crypto.o(i.fe25519_add) for fe25519_add + crypto.o(i.ed25519_add) refers to crypto.o(.constdata) for .constdata + crypto.o(i.fe25519_add) refers to crypto.o(i.reduceRS) for reduceRS + crypto.o(i.fe25519_freeze) refers to crypto.o(i.fe25519_cmov) for fe25519_cmov + crypto.o(i.fe25519_getparity) refers to crypto.o(i.fe25519_freeze) for fe25519_freeze + crypto.o(i.fe25519_invert) refers to crypto.o(i.fe25519_mul) for fe25519_mul + crypto.o(i.fe25519_iseq_vartime) refers to crypto.o(i.fe25519_freeze) for fe25519_freeze + crypto.o(i.fe25519_mul) refers to crypto.o(i.reduceRS) for reduceRS + crypto.o(i.fe25519_mult121665) refers to crypto.o(i.reduceRS) for reduceRS + crypto.o(i.fe25519_neg) refers to crypto.o(i.fe25519_sub) for fe25519_sub + crypto.o(i.fe25519_pack) refers to crypto.o(i.fe25519_freeze) for fe25519_freeze + crypto.o(i.fe25519_pow2523) refers to crypto.o(i.fe25519_mul) for fe25519_mul + crypto.o(i.fe25519_square) refers to crypto.o(i.fe25519_mul) for fe25519_mul + crypto.o(i.ge25519_double_scalarmult_vartime) refers to crypto.o(i.ed25519_add) for ed25519_add + crypto.o(i.ge25519_double_scalarmult_vartime) refers to crypto.o(i.fe25519_mul) for fe25519_mul + crypto.o(i.ge25519_double_scalarmult_vartime) refers to crypto.o(i.fe25519_add) for fe25519_add + crypto.o(i.ge25519_double_scalarmult_vartime) refers to crypto.o(i.fe25519_sub) for fe25519_sub + crypto.o(i.ge25519_pack) refers to crypto.o(i.fe25519_invert) for fe25519_invert + crypto.o(i.ge25519_pack) refers to crypto.o(i.fe25519_mul) for fe25519_mul + crypto.o(i.ge25519_pack) refers to crypto.o(i.fe25519_freeze) for fe25519_freeze + crypto.o(i.ge25519_scalarmult_base) refers to crypto.o(i.fe25519_mul) for fe25519_mul + crypto.o(i.ge25519_scalarmult_base) refers to crypto.o(i.fe25519_add) for fe25519_add + crypto.o(i.ge25519_scalarmult_base) refers to crypto.o(i.fe25519_sub) for fe25519_sub + crypto.o(i.ge25519_scalarmult_base) refers to crypto.o(i.ed25519_add) for ed25519_add + crypto.o(i.ge25519_scalarmult_base) refers to crypto.o(i.fe25519_cmov) for fe25519_cmov + crypto.o(i.ge25519_scalarmult_base) refers to crypto.o(.constdata) for .constdata + crypto.o(i.ge25519_unpackneg_vartime) refers to crypto.o(i.fe25519_mul) for fe25519_mul + crypto.o(i.ge25519_unpackneg_vartime) refers to crypto.o(i.fe25519_sub) for fe25519_sub + crypto.o(i.ge25519_unpackneg_vartime) refers to crypto.o(i.fe25519_add) for fe25519_add + crypto.o(i.ge25519_unpackneg_vartime) refers to crypto.o(i.fe25519_pow2523) for fe25519_pow2523 + crypto.o(i.ge25519_unpackneg_vartime) refers to crypto.o(i.fe25519_iseq_vartime) for fe25519_iseq_vartime + crypto.o(i.ge25519_unpackneg_vartime) refers to crypto.o(i.fe25519_freeze) for fe25519_freeze + crypto.o(i.ge25519_unpackneg_vartime) refers to crypto.o(.constdata) for .constdata + crypto.o(i.gfmul) refers to crypto.o(.constdata) for .constdata + crypto.o(i.md5_process) refers to memmovea.o(.text) for __aeabi_memcpy + crypto.o(i.reduce_add_sub) refers to crypto.o(.constdata) for .constdata + crypto.o(i.sc25519_add) refers to crypto.o(i.reduce_add_sub) for reduce_add_sub + crypto.o(i.sc25519_from32bytes) refers to crypto.o(i.barrett_reduce) for barrett_reduce + crypto.o(i.sc25519_from64bytes) refers to crypto.o(i.barrett_reduce) for barrett_reduce + crypto.o(i.sc25519_mul) refers to crypto.o(i.barrett_reduce) for barrett_reduce + entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry10a.o(.ARM.Collect$$$$0000000F) for __rt_final_cpp + entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry11a.o(.ARM.Collect$$$$00000011) for __rt_final_exit + entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry12b.o(.ARM.Collect$$$$0000000E) for __rt_lib_shutdown_fini + entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry7b.o(.ARM.Collect$$$$00000008) for _main_clock + entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry8b.o(.ARM.Collect$$$$0000000A) for _main_cpp_init + entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry9a.o(.ARM.Collect$$$$0000000B) for _main_init + entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry5.o(.ARM.Collect$$$$00000004) for _main_scatterload + entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry2.o(.ARM.Collect$$$$00000001) for _main_stk + rand.o(.text) refers to rand.o(.data) for .data + printfb.o(i.__0fprintf$bare) refers to printfb.o(i._printf_core) for _printf_core + printfb.o(i.__0fprintf$bare) refers to fputc.o(i.fputc) for fputc + printfb.o(i.__0printf$bare) refers to printfb.o(i._printf_core) for _printf_core + printfb.o(i.__0printf$bare) refers to fputc.o(i.fputc) for fputc + printfb.o(i.__0printf$bare) refers to stdout.o(.data) for __stdout + printfb.o(i.__0snprintf$bare) refers to printfb.o(i._printf_core) for _printf_core + printfb.o(i.__0snprintf$bare) refers to printfb.o(i._snputc) for _snputc + printfb.o(i.__0sprintf$bare) refers to printfb.o(i._printf_core) for _printf_core + printfb.o(i.__0sprintf$bare) refers to printfb.o(i._sputc) for _sputc + printfb.o(i.__0vfprintf$bare) refers to printfb.o(i._printf_core) for _printf_core + printfb.o(i.__0vfprintf$bare) refers to fputc.o(i.fputc) for fputc + printfb.o(i.__0vprintf$bare) refers to printfb.o(i._printf_core) for _printf_core + printfb.o(i.__0vprintf$bare) refers to fputc.o(i.fputc) for fputc + printfb.o(i.__0vprintf$bare) refers to stdout.o(.data) for __stdout + printfb.o(i.__0vsnprintf$bare) refers to printfb.o(i._printf_core) for _printf_core + printfb.o(i.__0vsnprintf$bare) refers to printfb.o(i._snputc) for _snputc + printfb.o(i.__0vsprintf$bare) refers to printfb.o(i._printf_core) for _printf_core + printfb.o(i.__0vsprintf$bare) refers to printfb.o(i._sputc) for _sputc + printf0.o(i.__0fprintf$0) refers to printf0.o(i._printf_core) for _printf_core + printf0.o(i.__0fprintf$0) refers to fputc.o(i.fputc) for fputc + printf0.o(i.__0printf$0) refers to printf0.o(i._printf_core) for _printf_core + printf0.o(i.__0printf$0) refers to fputc.o(i.fputc) for fputc + printf0.o(i.__0printf$0) refers to stdout.o(.data) for __stdout + printf0.o(i.__0snprintf$0) refers to printf0.o(i._printf_core) for _printf_core + printf0.o(i.__0snprintf$0) refers to printf0.o(i._snputc) for _snputc + printf0.o(i.__0sprintf$0) refers to printf0.o(i._printf_core) for _printf_core + printf0.o(i.__0sprintf$0) refers to printf0.o(i._sputc) for _sputc + printf0.o(i.__0vfprintf$0) refers to printf0.o(i._printf_core) for _printf_core + printf0.o(i.__0vfprintf$0) refers to fputc.o(i.fputc) for fputc + printf0.o(i.__0vprintf$0) refers to printf0.o(i._printf_core) for _printf_core + printf0.o(i.__0vprintf$0) refers to fputc.o(i.fputc) for fputc + printf0.o(i.__0vprintf$0) refers to stdout.o(.data) for __stdout + printf0.o(i.__0vsnprintf$0) refers to printf0.o(i._printf_core) for _printf_core + printf0.o(i.__0vsnprintf$0) refers to printf0.o(i._snputc) for _snputc + printf0.o(i.__0vsprintf$0) refers to printf0.o(i._printf_core) for _printf_core + printf0.o(i.__0vsprintf$0) refers to printf0.o(i._sputc) for _sputc + printf1.o(i.__0fprintf$1) refers to printf1.o(i._printf_core) for _printf_core + printf1.o(i.__0fprintf$1) refers to fputc.o(i.fputc) for fputc + printf1.o(i.__0printf$1) refers to printf1.o(i._printf_core) for _printf_core + printf1.o(i.__0printf$1) refers to fputc.o(i.fputc) for fputc + printf1.o(i.__0printf$1) refers to stdout.o(.data) for __stdout + printf1.o(i.__0snprintf$1) refers to printf1.o(i._printf_core) for _printf_core + printf1.o(i.__0snprintf$1) refers to printf1.o(i._snputc) for _snputc + printf1.o(i.__0sprintf$1) refers to printf1.o(i._printf_core) for _printf_core + printf1.o(i.__0sprintf$1) refers to printf1.o(i._sputc) for _sputc + printf1.o(i.__0vfprintf$1) refers to printf1.o(i._printf_core) for _printf_core + printf1.o(i.__0vfprintf$1) refers to fputc.o(i.fputc) for fputc + printf1.o(i.__0vprintf$1) refers to printf1.o(i._printf_core) for _printf_core + printf1.o(i.__0vprintf$1) refers to fputc.o(i.fputc) for fputc + printf1.o(i.__0vprintf$1) refers to stdout.o(.data) for __stdout + printf1.o(i.__0vsnprintf$1) refers to printf1.o(i._printf_core) for _printf_core + printf1.o(i.__0vsnprintf$1) refers to printf1.o(i._snputc) for _snputc + printf1.o(i.__0vsprintf$1) refers to printf1.o(i._printf_core) for _printf_core + printf1.o(i.__0vsprintf$1) refers to printf1.o(i._sputc) for _sputc + printf1.o(i._printf_core) refers to uidiv.o(.text) for __aeabi_uidivmod + printf2.o(i.__0fprintf$2) refers to printf2.o(i._printf_core) for _printf_core + printf2.o(i.__0fprintf$2) refers to fputc.o(i.fputc) for fputc + printf2.o(i.__0printf$2) refers to printf2.o(i._printf_core) for _printf_core + printf2.o(i.__0printf$2) refers to fputc.o(i.fputc) for fputc + printf2.o(i.__0printf$2) refers to stdout.o(.data) for __stdout + printf2.o(i.__0snprintf$2) refers to printf2.o(i._printf_core) for _printf_core + printf2.o(i.__0snprintf$2) refers to printf2.o(i._snputc) for _snputc + printf2.o(i.__0sprintf$2) refers to printf2.o(i._printf_core) for _printf_core + printf2.o(i.__0sprintf$2) refers to printf2.o(i._sputc) for _sputc + printf2.o(i.__0vfprintf$2) refers to printf2.o(i._printf_core) for _printf_core + printf2.o(i.__0vfprintf$2) refers to fputc.o(i.fputc) for fputc + printf2.o(i.__0vprintf$2) refers to printf2.o(i._printf_core) for _printf_core + printf2.o(i.__0vprintf$2) refers to fputc.o(i.fputc) for fputc + printf2.o(i.__0vprintf$2) refers to stdout.o(.data) for __stdout + printf2.o(i.__0vsnprintf$2) refers to printf2.o(i._printf_core) for _printf_core + printf2.o(i.__0vsnprintf$2) refers to printf2.o(i._snputc) for _snputc + printf2.o(i.__0vsprintf$2) refers to printf2.o(i._printf_core) for _printf_core + printf2.o(i.__0vsprintf$2) refers to printf2.o(i._sputc) for _sputc + printf3.o(i.__0fprintf$3) refers to printf3.o(i._printf_core) for _printf_core + printf3.o(i.__0fprintf$3) refers to fputc.o(i.fputc) for fputc + printf3.o(i.__0printf$3) refers to printf3.o(i._printf_core) for _printf_core + printf3.o(i.__0printf$3) refers to fputc.o(i.fputc) for fputc + printf3.o(i.__0printf$3) refers to stdout.o(.data) for __stdout + printf3.o(i.__0snprintf$3) refers to printf3.o(i._printf_core) for _printf_core + printf3.o(i.__0snprintf$3) refers to printf3.o(i._snputc) for _snputc + printf3.o(i.__0sprintf$3) refers to printf3.o(i._printf_core) for _printf_core + printf3.o(i.__0sprintf$3) refers to printf3.o(i._sputc) for _sputc + printf3.o(i.__0vfprintf$3) refers to printf3.o(i._printf_core) for _printf_core + printf3.o(i.__0vfprintf$3) refers to fputc.o(i.fputc) for fputc + printf3.o(i.__0vprintf$3) refers to printf3.o(i._printf_core) for _printf_core + printf3.o(i.__0vprintf$3) refers to fputc.o(i.fputc) for fputc + printf3.o(i.__0vprintf$3) refers to stdout.o(.data) for __stdout + printf3.o(i.__0vsnprintf$3) refers to printf3.o(i._printf_core) for _printf_core + printf3.o(i.__0vsnprintf$3) refers to printf3.o(i._snputc) for _snputc + printf3.o(i.__0vsprintf$3) refers to printf3.o(i._printf_core) for _printf_core + printf3.o(i.__0vsprintf$3) refers to printf3.o(i._sputc) for _sputc + printf3.o(i._printf_core) refers to uidiv.o(.text) for __aeabi_uidivmod + printf4.o(i.__0fprintf$4) refers to printf4.o(i._printf_core) for _printf_core + printf4.o(i.__0fprintf$4) refers to fputc.o(i.fputc) for fputc + printf4.o(i.__0printf$4) refers to printf4.o(i._printf_core) for _printf_core + printf4.o(i.__0printf$4) refers to fputc.o(i.fputc) for fputc + printf4.o(i.__0printf$4) refers to stdout.o(.data) for __stdout + printf4.o(i.__0snprintf$4) refers to printf4.o(i._printf_core) for _printf_core + printf4.o(i.__0snprintf$4) refers to printf4.o(i._snputc) for _snputc + printf4.o(i.__0sprintf$4) refers to printf4.o(i._printf_core) for _printf_core + printf4.o(i.__0sprintf$4) refers to printf4.o(i._sputc) for _sputc + printf4.o(i.__0vfprintf$4) refers to printf4.o(i._printf_core) for _printf_core + printf4.o(i.__0vfprintf$4) refers to fputc.o(i.fputc) for fputc + printf4.o(i.__0vprintf$4) refers to printf4.o(i._printf_core) for _printf_core + printf4.o(i.__0vprintf$4) refers to fputc.o(i.fputc) for fputc + printf4.o(i.__0vprintf$4) refers to stdout.o(.data) for __stdout + printf4.o(i.__0vsnprintf$4) refers to printf4.o(i._printf_core) for _printf_core + printf4.o(i.__0vsnprintf$4) refers to printf4.o(i._snputc) for _snputc + printf4.o(i.__0vsprintf$4) refers to printf4.o(i._printf_core) for _printf_core + printf4.o(i.__0vsprintf$4) refers to printf4.o(i._sputc) for _sputc + printf4.o(i._printf_core) refers to uldiv.o(.text) for __aeabi_uldivmod + printf5.o(i.__0fprintf$5) refers to printf5.o(i._printf_core) for _printf_core + printf5.o(i.__0fprintf$5) refers to fputc.o(i.fputc) for fputc + printf5.o(i.__0printf$5) refers to printf5.o(i._printf_core) for _printf_core + printf5.o(i.__0printf$5) refers to fputc.o(i.fputc) for fputc + printf5.o(i.__0printf$5) refers to stdout.o(.data) for __stdout + printf5.o(i.__0snprintf$5) refers to printf5.o(i._printf_core) for _printf_core + printf5.o(i.__0snprintf$5) refers to printf5.o(i._snputc) for _snputc + printf5.o(i.__0sprintf$5) refers to printf5.o(i._printf_core) for _printf_core + printf5.o(i.__0sprintf$5) refers to printf5.o(i._sputc) for _sputc + printf5.o(i.__0vfprintf$5) refers to printf5.o(i._printf_core) for _printf_core + printf5.o(i.__0vfprintf$5) refers to fputc.o(i.fputc) for fputc + printf5.o(i.__0vprintf$5) refers to printf5.o(i._printf_core) for _printf_core + printf5.o(i.__0vprintf$5) refers to fputc.o(i.fputc) for fputc + printf5.o(i.__0vprintf$5) refers to stdout.o(.data) for __stdout + printf5.o(i.__0vsnprintf$5) refers to printf5.o(i._printf_core) for _printf_core + printf5.o(i.__0vsnprintf$5) refers to printf5.o(i._snputc) for _snputc + printf5.o(i.__0vsprintf$5) refers to printf5.o(i._printf_core) for _printf_core + printf5.o(i.__0vsprintf$5) refers to printf5.o(i._sputc) for _sputc + printf5.o(i._printf_core) refers to uldiv.o(.text) for __aeabi_uldivmod + printf6.o(i.__0fprintf$6) refers to printf6.o(i._printf_core) for _printf_core + printf6.o(i.__0fprintf$6) refers to fputc.o(i.fputc) for fputc + printf6.o(i.__0printf$6) refers to printf6.o(i._printf_core) for _printf_core + printf6.o(i.__0printf$6) refers to fputc.o(i.fputc) for fputc + printf6.o(i.__0printf$6) refers to stdout.o(.data) for __stdout + printf6.o(i.__0snprintf$6) refers to printf6.o(i._printf_core) for _printf_core + printf6.o(i.__0snprintf$6) refers to printf6.o(i._snputc) for _snputc + printf6.o(i.__0sprintf$6) refers to printf6.o(i._printf_core) for _printf_core + printf6.o(i.__0sprintf$6) refers to printf6.o(i._sputc) for _sputc + printf6.o(i.__0vfprintf$6) refers to printf6.o(i._printf_core) for _printf_core + printf6.o(i.__0vfprintf$6) refers to fputc.o(i.fputc) for fputc + printf6.o(i.__0vprintf$6) refers to printf6.o(i._printf_core) for _printf_core + printf6.o(i.__0vprintf$6) refers to fputc.o(i.fputc) for fputc + printf6.o(i.__0vprintf$6) refers to stdout.o(.data) for __stdout + printf6.o(i.__0vsnprintf$6) refers to printf6.o(i._printf_core) for _printf_core + printf6.o(i.__0vsnprintf$6) refers to printf6.o(i._snputc) for _snputc + printf6.o(i.__0vsprintf$6) refers to printf6.o(i._printf_core) for _printf_core + printf6.o(i.__0vsprintf$6) refers to printf6.o(i._sputc) for _sputc + printf6.o(i._printf_core) refers to printf6.o(i._printf_pre_padding) for _printf_pre_padding + printf6.o(i._printf_core) refers to uidiv.o(.text) for __aeabi_uidivmod + printf6.o(i._printf_core) refers to printf6.o(i._printf_post_padding) for _printf_post_padding + printf7.o(i.__0fprintf$7) refers to printf7.o(i._printf_core) for _printf_core + printf7.o(i.__0fprintf$7) refers to fputc.o(i.fputc) for fputc + printf7.o(i.__0printf$7) refers to printf7.o(i._printf_core) for _printf_core + printf7.o(i.__0printf$7) refers to fputc.o(i.fputc) for fputc + printf7.o(i.__0printf$7) refers to stdout.o(.data) for __stdout + printf7.o(i.__0snprintf$7) refers to printf7.o(i._printf_core) for _printf_core + printf7.o(i.__0snprintf$7) refers to printf7.o(i._snputc) for _snputc + printf7.o(i.__0sprintf$7) refers to printf7.o(i._printf_core) for _printf_core + printf7.o(i.__0sprintf$7) refers to printf7.o(i._sputc) for _sputc + printf7.o(i.__0vfprintf$7) refers to printf7.o(i._printf_core) for _printf_core + printf7.o(i.__0vfprintf$7) refers to fputc.o(i.fputc) for fputc + printf7.o(i.__0vprintf$7) refers to printf7.o(i._printf_core) for _printf_core + printf7.o(i.__0vprintf$7) refers to fputc.o(i.fputc) for fputc + printf7.o(i.__0vprintf$7) refers to stdout.o(.data) for __stdout + printf7.o(i.__0vsnprintf$7) refers to printf7.o(i._printf_core) for _printf_core + printf7.o(i.__0vsnprintf$7) refers to printf7.o(i._snputc) for _snputc + printf7.o(i.__0vsprintf$7) refers to printf7.o(i._printf_core) for _printf_core + printf7.o(i.__0vsprintf$7) refers to printf7.o(i._sputc) for _sputc + printf7.o(i._printf_core) refers to printf7.o(i._printf_pre_padding) for _printf_pre_padding + printf7.o(i._printf_core) refers to uldiv.o(.text) for __aeabi_uldivmod + printf7.o(i._printf_core) refers to printf7.o(i._printf_post_padding) for _printf_post_padding + printf8.o(i.__0fprintf$8) refers to printf8.o(i._printf_core) for _printf_core + printf8.o(i.__0fprintf$8) refers to fputc.o(i.fputc) for fputc + printf8.o(i.__0printf$8) refers to printf8.o(i._printf_core) for _printf_core + printf8.o(i.__0printf$8) refers to fputc.o(i.fputc) for fputc + printf8.o(i.__0printf$8) refers to stdout.o(.data) for __stdout + printf8.o(i.__0snprintf$8) refers to printf8.o(i._printf_core) for _printf_core + printf8.o(i.__0snprintf$8) refers to printf8.o(i._snputc) for _snputc + printf8.o(i.__0sprintf$8) refers to printf8.o(i._printf_core) for _printf_core + printf8.o(i.__0sprintf$8) refers to printf8.o(i._sputc) for _sputc + printf8.o(i.__0vfprintf$8) refers to printf8.o(i._printf_core) for _printf_core + printf8.o(i.__0vfprintf$8) refers to fputc.o(i.fputc) for fputc + printf8.o(i.__0vprintf$8) refers to printf8.o(i._printf_core) for _printf_core + printf8.o(i.__0vprintf$8) refers to fputc.o(i.fputc) for fputc + printf8.o(i.__0vprintf$8) refers to stdout.o(.data) for __stdout + printf8.o(i.__0vsnprintf$8) refers to printf8.o(i._printf_core) for _printf_core + printf8.o(i.__0vsnprintf$8) refers to printf8.o(i._snputc) for _snputc + printf8.o(i.__0vsprintf$8) refers to printf8.o(i._printf_core) for _printf_core + printf8.o(i.__0vsprintf$8) refers to printf8.o(i._sputc) for _sputc + printf8.o(i._printf_core) refers to printf8.o(i._printf_pre_padding) for _printf_pre_padding + printf8.o(i._printf_core) refers to uldiv.o(.text) for __aeabi_uldivmod + printf8.o(i._printf_core) refers to printf8.o(i._printf_post_padding) for _printf_post_padding + printfa.o(i.__0fprintf) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i.__0fprintf) refers to printfa.o(i._printf_core) for _printf_core + printfa.o(i.__0fprintf) refers to fputc.o(i.fputc) for fputc + printfa.o(i.__0printf) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i.__0printf) refers to printfa.o(i._printf_core) for _printf_core + printfa.o(i.__0printf) refers to fputc.o(i.fputc) for fputc + printfa.o(i.__0printf) refers to stdout.o(.data) for __stdout + printfa.o(i.__0snprintf) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i.__0snprintf) refers to printfa.o(i._printf_core) for _printf_core + printfa.o(i.__0snprintf) refers to printfa.o(i._snputc) for _snputc + printfa.o(i.__0sprintf) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i.__0sprintf) refers to printfa.o(i._printf_core) for _printf_core + printfa.o(i.__0sprintf) refers to printfa.o(i._sputc) for _sputc + printfa.o(i.__0vfprintf) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i.__0vfprintf) refers to printfa.o(i._printf_core) for _printf_core + printfa.o(i.__0vfprintf) refers to fputc.o(i.fputc) for fputc + printfa.o(i.__0vprintf) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i.__0vprintf) refers to printfa.o(i._printf_core) for _printf_core + printfa.o(i.__0vprintf) refers to fputc.o(i.fputc) for fputc + printfa.o(i.__0vprintf) refers to stdout.o(.data) for __stdout + printfa.o(i.__0vsnprintf) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i.__0vsnprintf) refers to printfa.o(i._printf_core) for _printf_core + printfa.o(i.__0vsnprintf) refers to printfa.o(i._snputc) for _snputc + printfa.o(i.__0vsprintf) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i.__0vsprintf) refers to printfa.o(i._printf_core) for _printf_core + printfa.o(i.__0vsprintf) refers to printfa.o(i._sputc) for _sputc + printfa.o(i._fp_digits) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i._fp_digits) refers to dmul.o(.text) for __aeabi_dmul + printfa.o(i._fp_digits) refers to ddiv.o(.text) for __aeabi_ddiv + printfa.o(i._fp_digits) refers to cdrcmple.o(.text) for __aeabi_cdrcmple + printfa.o(i._fp_digits) refers to dadd.o(.text) for __aeabi_dadd + printfa.o(i._fp_digits) refers to dfixul.o(.text) for __aeabi_d2ulz + printfa.o(i._fp_digits) refers to uldiv.o(.text) for __aeabi_uldivmod + printfa.o(i._printf_core) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i._printf_core) refers to printfa.o(i._printf_pre_padding) for _printf_pre_padding + printfa.o(i._printf_core) refers to uldiv.o(.text) for __aeabi_uldivmod + printfa.o(i._printf_core) refers to printfa.o(i._printf_post_padding) for _printf_post_padding + printfa.o(i._printf_core) refers to printfa.o(i._fp_digits) for _fp_digits + printfa.o(i._printf_core) refers to uidiv.o(.text) for __aeabi_uidivmod + printfa.o(i._printf_post_padding) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i._printf_pre_padding) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i._snputc) refers (Special) to iusefp.o(.text) for __I$use$fp + printfa.o(i._sputc) refers (Special) to iusefp.o(.text) for __I$use$fp + malloc.o(i.free) refers to mvars.o(.data) for __microlib_freelist + malloc.o(i.malloc) refers to mvars.o(.data) for __microlib_freelist_initialised + malloc.o(i.malloc) refers to mvars.o(.data) for __microlib_freelist + malloc.o(i.malloc) refers to startup_gd32f30x_hd.o(HEAP) for __heap_base + mallocr.o(i.__free$realloc) refers to mvars.o(.data) for __microlib_freelist + mallocr.o(i.__malloc$realloc) refers to mallocr.o(i.internal_alloc) for internal_alloc + mallocr.o(i.__malloc$realloc) refers to mvars.o(.data) for __microlib_freelist_initialised + mallocr.o(i.__malloc$realloc) refers to startup_gd32f30x_hd.o(HEAP) for __heap_base + mallocr.o(i.__malloc$realloc) refers to mvars.o(.data) for __microlib_freelist + mallocr.o(i.internal_alloc) refers to memmovea.o(.text) for __aeabi_memcpy + mallocr.o(i.internal_alloc) refers to mvars.o(.data) for __microlib_freelist + mallocr.o(i.realloc) refers to mallocr.o(i.__free$realloc) for __free$realloc + mallocr.o(i.realloc) refers to mallocr.o(i.internal_alloc) for internal_alloc + mallocr.o(i.realloc) refers to mallocr.o(i.__malloc$realloc) for __malloc$realloc + mallocr.o(i.realloc) refers to mvars.o(.data) for __microlib_freelist + malloca.o(i.__aligned_malloc) refers to mvars.o(.data) for __microlib_freelist_initialised + malloca.o(i.__aligned_malloc) refers to mvars.o(.data) for __microlib_freelist + malloca.o(i.__aligned_malloc) refers to startup_gd32f30x_hd.o(HEAP) for __heap_base + malloca.o(i.__free$memalign) refers to mvars.o(.data) for __microlib_freelist + malloca.o(i.__malloc$memalign) refers to malloca.o(i.__aligned_malloc) for __aligned_malloc + mallocra.o(i.__aligned_malloc$realloc) refers to mallocra.o(i.internal_alloc) for internal_alloc + mallocra.o(i.__aligned_malloc$realloc) refers to mvars.o(.data) for __microlib_freelist_initialised + mallocra.o(i.__aligned_malloc$realloc) refers to startup_gd32f30x_hd.o(HEAP) for __heap_base + mallocra.o(i.__aligned_malloc$realloc) refers to mvars.o(.data) for __microlib_freelist + mallocra.o(i.__free$realloc$memalign) refers to mvars.o(.data) for __microlib_freelist + mallocra.o(i.__malloc$realloc$memalign) refers to mallocra.o(i.__aligned_malloc$realloc) for __aligned_malloc$realloc + mallocra.o(i.__realloc$memalign) refers to mallocra.o(i.__free$realloc$memalign) for __free$realloc$memalign + mallocra.o(i.__realloc$memalign) refers to mallocra.o(i.internal_alloc) for internal_alloc + mallocra.o(i.__realloc$memalign) refers to mallocra.o(i.__malloc$realloc$memalign) for __malloc$realloc$memalign + mallocra.o(i.__realloc$memalign) refers to mvars.o(.data) for __microlib_freelist + mallocra.o(i.internal_alloc) refers to memmovea.o(.text) for __aeabi_memcpy + mallocra.o(i.internal_alloc) refers to mvars.o(.data) for __microlib_freelist + atoi.o(.text) refers to errno.o(i.__aeabi_errno_addr) for __aeabi_errno_addr + atoi.o(.text) refers to strtol.o(.text) for strtol + entry2.o(.ARM.Collect$$$$00000001) refers to entry2.o(.ARM.Collect$$$$00002712) for __lit__00000000 + entry2.o(.ARM.Collect$$$$00002712) refers to startup_gd32f30x_hd.o(STACK) for __initial_sp + entry2.o(__vectab_stack_and_reset_area) refers to startup_gd32f30x_hd.o(STACK) for __initial_sp + entry2.o(__vectab_stack_and_reset_area) refers to entry.o(.ARM.Collect$$$$00000000) for __main + entry5.o(.ARM.Collect$$$$00000004) refers to init.o(.text) for __scatterload + entry9a.o(.ARM.Collect$$$$0000000B) refers to main.o(i.main) for main + entry9b.o(.ARM.Collect$$$$0000000C) refers to main.o(i.main) for main + fputc.o(i.fputc) refers (Special) to iusesemip.o(.text) for __I$use$semihosting$fputc + fputc.o(i.fputc) refers (Special) to semi.o(.text) for __semihosting_library_function + uldiv.o(.text) refers to llushr.o(.text) for __aeabi_llsr + uldiv.o(.text) refers to llshl.o(.text) for __aeabi_llsl + errno.o(i.__aeabi_errno_addr) refers to errno.o(.data) for .data + errno.o(i.__read_errno) refers to errno.o(.data) for .data + errno.o(i.__set_errno) refers to errno.o(.data) for .data + strtol.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + strtol.o(.text) refers to _strtoul.o(.text) for _strtoul + strtol.o(.text) refers to errno.o(i.__aeabi_errno_addr) for __aeabi_errno_addr + dadd.o(.text) refers to llshl.o(.text) for __aeabi_llsl + dadd.o(.text) refers to llsshr.o(.text) for __aeabi_lasr + dadd.o(.text) refers to depilogue.o(.text) for _double_epilogue + dmul.o(.text) refers to depilogue.o(.text) for _double_epilogue + ddiv.o(.text) refers to depilogue.o(.text) for _double_round + dfixul.o(.text) refers to llushr.o(.text) for __aeabi_llsr + dfixul.o(.text) refers to llshl.o(.text) for __aeabi_llsl + init.o(.text) refers to entry5.o(.ARM.Collect$$$$00000004) for __main_after_scatterload + ctype_o.o(.text) refers to ctype_o.o(.constdata) for .constdata + ctype_o.o(.constdata) refers to ctype_o.o(.constdata) for __ctype_table + isalnum_o.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + isalpha_o.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + isblank_o.o(.text) refers to ctype_o.o(.constdata) for __ctype_table + iscntrl_o.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + isdigit_o.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + isgraph_o.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + islower_o.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + isprint_o.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + ispunct_o.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + isspace_o.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + isupper_o.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + isxdigit_o.o(.text) refers to ctype_o.o(.text) for __rt_ctype_table + _strtoul.o(.text) refers to _chval.o(.text) for _chval + _strtoul.o(.text) refers to errno.o(i.__aeabi_errno_addr) for __aeabi_errno_addr + depilogue.o(.text) refers to llshl.o(.text) for __aeabi_llsl + depilogue.o(.text) refers to llushr.o(.text) for __aeabi_llsr + + +============================================================================== + +Removing Unused input sections from the image. + + Removing main.o(.rev16_text), (4 bytes). + Removing main.o(.revsh_text), (4 bytes). + Removing gd32f30x_it.o(.rev16_text), (4 bytes). + Removing gd32f30x_it.o(.revsh_text), (4 bytes). + Removing custom_hid_itf.o(.rev16_text), (4 bytes). + Removing custom_hid_itf.o(.revsh_text), (4 bytes). + Removing gd32f30x_usbd_hw.o(.rev16_text), (4 bytes). + Removing gd32f30x_usbd_hw.o(.revsh_text), (4 bytes). + Removing system_gd32f30x.o(.rev16_text), (4 bytes). + Removing system_gd32f30x.o(.revsh_text), (4 bytes). + Removing system_gd32f30x.o(i.SystemCoreClockUpdate), (188 bytes). + Removing system_gd32f30x.o(.data), (4 bytes). + Removing gd32f30x_dma.o(.rev16_text), (4 bytes). + Removing gd32f30x_dma.o(.revsh_text), (4 bytes). + Removing gd32f30x_dma.o(i.dma_channel_disable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_channel_enable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_circulation_disable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_circulation_enable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_deinit), (112 bytes). + Removing gd32f30x_dma.o(i.dma_flag_clear), (16 bytes). + Removing gd32f30x_dma.o(i.dma_flag_get), (24 bytes). + Removing gd32f30x_dma.o(i.dma_init), (302 bytes). + Removing gd32f30x_dma.o(i.dma_interrupt_disable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_interrupt_enable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_interrupt_flag_clear), (16 bytes). + Removing gd32f30x_dma.o(i.dma_interrupt_flag_get), (130 bytes). + Removing gd32f30x_dma.o(i.dma_memory_address_config), (36 bytes). + Removing gd32f30x_dma.o(i.dma_memory_increase_disable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_memory_increase_enable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_memory_to_memory_disable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_memory_to_memory_enable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_memory_width_config), (58 bytes). + Removing gd32f30x_dma.o(i.dma_periph_address_config), (36 bytes). + Removing gd32f30x_dma.o(i.dma_periph_and_channel_check), (24 bytes). + Removing gd32f30x_dma.o(i.dma_periph_increase_disable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_periph_increase_enable), (50 bytes). + Removing gd32f30x_dma.o(i.dma_periph_width_config), (58 bytes). + Removing gd32f30x_dma.o(i.dma_priority_config), (58 bytes). + Removing gd32f30x_dma.o(i.dma_struct_para_init), (28 bytes). + Removing gd32f30x_dma.o(i.dma_transfer_direction_config), (84 bytes). + Removing gd32f30x_dma.o(i.dma_transfer_number_config), (38 bytes). + Removing gd32f30x_dma.o(i.dma_transfer_number_get), (34 bytes). + Removing gd32f30x_exmc.o(.rev16_text), (4 bytes). + Removing gd32f30x_exmc.o(.revsh_text), (4 bytes). + Removing gd32f30x_exmc.o(i.exmc_ecc_get), (12 bytes). + Removing gd32f30x_exmc.o(i.exmc_flag_clear), (20 bytes). + Removing gd32f30x_exmc.o(i.exmc_flag_get), (28 bytes). + Removing gd32f30x_exmc.o(i.exmc_interrupt_disable), (20 bytes). + Removing gd32f30x_exmc.o(i.exmc_interrupt_enable), (20 bytes). + Removing gd32f30x_exmc.o(i.exmc_interrupt_flag_clear), (22 bytes). + Removing gd32f30x_exmc.o(i.exmc_interrupt_flag_get), (38 bytes). + Removing gd32f30x_exmc.o(i.exmc_nand_deinit), (42 bytes). + Removing gd32f30x_exmc.o(i.exmc_nand_disable), (22 bytes). + Removing gd32f30x_exmc.o(i.exmc_nand_ecc_config), (48 bytes). + Removing gd32f30x_exmc.o(i.exmc_nand_enable), (22 bytes). + Removing gd32f30x_exmc.o(i.exmc_nand_init), (174 bytes). + Removing gd32f30x_exmc.o(i.exmc_nand_struct_para_init), (54 bytes). + Removing gd32f30x_exmc.o(i.exmc_norsram_deinit), (52 bytes). + Removing gd32f30x_exmc.o(i.exmc_norsram_disable), (22 bytes). + Removing gd32f30x_exmc.o(i.exmc_norsram_enable), (22 bytes). + Removing gd32f30x_exmc.o(i.exmc_norsram_init), (284 bytes). + Removing gd32f30x_exmc.o(i.exmc_norsram_page_size_config), (40 bytes). + Removing gd32f30x_exmc.o(i.exmc_norsram_struct_para_init), (106 bytes). + Removing gd32f30x_exmc.o(i.exmc_pccard_deinit), (40 bytes). + Removing gd32f30x_exmc.o(i.exmc_pccard_disable), (24 bytes). + Removing gd32f30x_exmc.o(i.exmc_pccard_enable), (24 bytes). + Removing gd32f30x_exmc.o(i.exmc_pccard_init), (192 bytes). + Removing gd32f30x_exmc.o(i.exmc_pccard_struct_para_init), (60 bytes). + Removing gd32f30x_exti.o(.rev16_text), (4 bytes). + Removing gd32f30x_exti.o(.revsh_text), (4 bytes). + Removing gd32f30x_exti.o(i.exti_deinit), (28 bytes). + Removing gd32f30x_exti.o(i.exti_event_disable), (16 bytes). + Removing gd32f30x_exti.o(i.exti_event_enable), (16 bytes). + Removing gd32f30x_exti.o(i.exti_flag_clear), (12 bytes). + Removing gd32f30x_exti.o(i.exti_flag_get), (24 bytes). + Removing gd32f30x_exti.o(i.exti_init), (184 bytes). + Removing gd32f30x_exti.o(i.exti_interrupt_disable), (16 bytes). + Removing gd32f30x_exti.o(i.exti_interrupt_enable), (16 bytes). + Removing gd32f30x_exti.o(i.exti_software_interrupt_disable), (16 bytes). + Removing gd32f30x_exti.o(i.exti_software_interrupt_enable), (16 bytes). + Removing gd32f30x_fmc.o(.rev16_text), (4 bytes). + Removing gd32f30x_fmc.o(.revsh_text), (4 bytes). + Removing gd32f30x_fmc.o(i.fmc_bank0_erase), (68 bytes). + Removing gd32f30x_fmc.o(i.fmc_bank0_lock), (20 bytes). + Removing gd32f30x_fmc.o(i.fmc_bank0_ready_wait), (34 bytes). + Removing gd32f30x_fmc.o(i.fmc_bank0_state_get), (48 bytes). + Removing gd32f30x_fmc.o(i.fmc_bank0_unlock), (36 bytes). + Removing gd32f30x_fmc.o(i.fmc_bank1_erase), (68 bytes). + Removing gd32f30x_fmc.o(i.fmc_bank1_lock), (20 bytes). + Removing gd32f30x_fmc.o(i.fmc_bank1_ready_wait), (34 bytes). + Removing gd32f30x_fmc.o(i.fmc_bank1_state_get), (48 bytes). + Removing gd32f30x_fmc.o(i.fmc_bank1_unlock), (36 bytes). + Removing gd32f30x_fmc.o(i.fmc_flag_clear), (32 bytes). + Removing gd32f30x_fmc.o(i.fmc_flag_get), (36 bytes). + Removing gd32f30x_fmc.o(i.fmc_halfword_program), (184 bytes). + Removing gd32f30x_fmc.o(i.fmc_interrupt_disable), (32 bytes). + Removing gd32f30x_fmc.o(i.fmc_interrupt_enable), (32 bytes). + Removing gd32f30x_fmc.o(i.fmc_interrupt_flag_clear), (32 bytes). + Removing gd32f30x_fmc.o(i.fmc_interrupt_flag_get), (108 bytes). + Removing gd32f30x_fmc.o(i.fmc_lock), (44 bytes). + Removing gd32f30x_fmc.o(i.fmc_mass_erase), (192 bytes). + Removing gd32f30x_fmc.o(i.fmc_page_erase), (228 bytes). + Removing gd32f30x_fmc.o(i.fmc_unlock), (68 bytes). + Removing gd32f30x_fmc.o(i.fmc_word_program), (184 bytes). + Removing gd32f30x_fmc.o(i.fmc_word_reprogram), (236 bytes). + Removing gd32f30x_fmc.o(i.fmc_wscnt_set), (24 bytes). + Removing gd32f30x_fmc.o(i.ob_data_get), (16 bytes). + Removing gd32f30x_fmc.o(i.ob_data_program), (68 bytes). + Removing gd32f30x_fmc.o(i.ob_erase), (140 bytes). + Removing gd32f30x_fmc.o(i.ob_lock), (20 bytes). + Removing gd32f30x_fmc.o(i.ob_security_protection_config), (132 bytes). + Removing gd32f30x_fmc.o(i.ob_spc_get), (24 bytes). + Removing gd32f30x_fmc.o(i.ob_unlock), (36 bytes). + Removing gd32f30x_fmc.o(i.ob_user_get), (16 bytes). + Removing gd32f30x_fmc.o(i.ob_user_write), (96 bytes). + Removing gd32f30x_fmc.o(i.ob_write_protection_enable), (164 bytes). + Removing gd32f30x_fmc.o(i.ob_write_protection_get), (12 bytes). + Removing gd32f30x_gpio.o(.rev16_text), (4 bytes). + Removing gd32f30x_gpio.o(.revsh_text), (4 bytes). + Removing gd32f30x_gpio.o(i.gpio_afio_deinit), (20 bytes). + Removing gd32f30x_gpio.o(i.gpio_bit_write), (10 bytes). + Removing gd32f30x_gpio.o(i.gpio_compensation_config), (24 bytes). + Removing gd32f30x_gpio.o(i.gpio_compensation_flag_get), (24 bytes). + Removing gd32f30x_gpio.o(i.gpio_deinit), (196 bytes). + Removing gd32f30x_gpio.o(i.gpio_event_output_config), (28 bytes). + Removing gd32f30x_gpio.o(i.gpio_event_output_disable), (20 bytes). + Removing gd32f30x_gpio.o(i.gpio_event_output_enable), (20 bytes). + Removing gd32f30x_gpio.o(i.gpio_exti_source_select), (152 bytes). + Removing gd32f30x_gpio.o(i.gpio_input_port_get), (8 bytes). + Removing gd32f30x_gpio.o(i.gpio_output_bit_get), (16 bytes). + Removing gd32f30x_gpio.o(i.gpio_output_port_get), (8 bytes). + Removing gd32f30x_gpio.o(i.gpio_pin_lock), (18 bytes). + Removing gd32f30x_gpio.o(i.gpio_pin_remap_config), (144 bytes). + Removing gd32f30x_gpio.o(i.gpio_port_write), (4 bytes). + Removing gd32f30x_misc.o(.rev16_text), (4 bytes). + Removing gd32f30x_misc.o(.revsh_text), (4 bytes). + Removing gd32f30x_misc.o(i.nvic_irq_disable), (24 bytes). + Removing gd32f30x_misc.o(i.nvic_vector_table_set), (24 bytes). + Removing gd32f30x_misc.o(i.system_lowpower_reset), (16 bytes). + Removing gd32f30x_misc.o(i.system_lowpower_set), (16 bytes). + Removing gd32f30x_misc.o(i.systick_clksource_set), (40 bytes). + Removing gd32f30x_pmu.o(.rev16_text), (4 bytes). + Removing gd32f30x_pmu.o(.revsh_text), (4 bytes). + Removing gd32f30x_pmu.o(i.pmu_backup_write_disable), (20 bytes). + Removing gd32f30x_pmu.o(i.pmu_backup_write_enable), (20 bytes). + Removing gd32f30x_pmu.o(i.pmu_deinit), (20 bytes). + Removing gd32f30x_pmu.o(i.pmu_flag_clear), (48 bytes). + Removing gd32f30x_pmu.o(i.pmu_flag_get), (24 bytes). + Removing gd32f30x_pmu.o(i.pmu_highdriver_mode_disable), (20 bytes). + Removing gd32f30x_pmu.o(i.pmu_highdriver_mode_enable), (20 bytes). + Removing gd32f30x_pmu.o(i.pmu_highdriver_switch_select), (44 bytes). + Removing gd32f30x_pmu.o(i.pmu_ldo_output_select), (28 bytes). + Removing gd32f30x_pmu.o(i.pmu_lowdriver_mode_disable), (20 bytes). + Removing gd32f30x_pmu.o(i.pmu_lowdriver_mode_enable), (20 bytes). + Removing gd32f30x_pmu.o(i.pmu_lowpower_driver_config), (28 bytes). + Removing gd32f30x_pmu.o(i.pmu_lvd_disable), (20 bytes). + Removing gd32f30x_pmu.o(i.pmu_lvd_select), (48 bytes). + Removing gd32f30x_pmu.o(i.pmu_normalpower_driver_config), (28 bytes). + Removing gd32f30x_pmu.o(i.pmu_to_deepsleepmode), (244 bytes). + Removing gd32f30x_pmu.o(i.pmu_to_sleepmode), (28 bytes). + Removing gd32f30x_pmu.o(i.pmu_to_standbymode), (52 bytes). + Removing gd32f30x_pmu.o(i.pmu_wakeup_pin_disable), (20 bytes). + Removing gd32f30x_pmu.o(i.pmu_wakeup_pin_enable), (20 bytes). + Removing gd32f30x_pmu.o(.bss), (16 bytes). + Removing gd32f30x_rcu.o(.rev16_text), (4 bytes). + Removing gd32f30x_rcu.o(.revsh_text), (4 bytes). + Removing gd32f30x_rcu.o(i.rcu_adc_clock_config), (108 bytes). + Removing gd32f30x_rcu.o(i.rcu_ahb_clock_config), (24 bytes). + Removing gd32f30x_rcu.o(i.rcu_all_reset_flag_clear), (20 bytes). + Removing gd32f30x_rcu.o(i.rcu_apb1_clock_config), (24 bytes). + Removing gd32f30x_rcu.o(i.rcu_apb2_clock_config), (24 bytes). + Removing gd32f30x_rcu.o(i.rcu_bkp_reset_disable), (20 bytes). + Removing gd32f30x_rcu.o(i.rcu_bkp_reset_enable), (20 bytes). + Removing gd32f30x_rcu.o(i.rcu_ck48m_clock_config), (28 bytes). + Removing gd32f30x_rcu.o(i.rcu_ckout0_config), (24 bytes). + Removing gd32f30x_rcu.o(i.rcu_deepsleep_voltage_set), (16 bytes). + Removing gd32f30x_rcu.o(i.rcu_deinit), (120 bytes). + Removing gd32f30x_rcu.o(i.rcu_flag_get), (36 bytes). + Removing gd32f30x_rcu.o(i.rcu_hxtal_clock_monitor_disable), (20 bytes). + Removing gd32f30x_rcu.o(i.rcu_hxtal_clock_monitor_enable), (20 bytes). + Removing gd32f30x_rcu.o(i.rcu_interrupt_disable), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_interrupt_enable), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_interrupt_flag_clear), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_interrupt_flag_get), (36 bytes). + Removing gd32f30x_rcu.o(i.rcu_irc8m_adjust_value_set), (28 bytes). + Removing gd32f30x_rcu.o(i.rcu_lxtal_drive_capability_config), (24 bytes). + Removing gd32f30x_rcu.o(i.rcu_osci_bypass_mode_disable), (100 bytes). + Removing gd32f30x_rcu.o(i.rcu_osci_bypass_mode_enable), (100 bytes). + Removing gd32f30x_rcu.o(i.rcu_osci_off), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_osci_on), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_osci_stab_wait), (272 bytes). + Removing gd32f30x_rcu.o(i.rcu_periph_clock_disable), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_periph_clock_sleep_disable), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_periph_clock_sleep_enable), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_periph_reset_disable), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_periph_reset_enable), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_pll_config), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_pllpresel_config), (24 bytes). + Removing gd32f30x_rcu.o(i.rcu_predv0_config), (32 bytes). + Removing gd32f30x_rcu.o(i.rcu_rtc_clock_config), (24 bytes). + Removing gd32f30x_rcu.o(i.rcu_system_clock_source_config), (24 bytes). + Removing gd32f30x_rcu.o(i.rcu_system_clock_source_get), (16 bytes). + Removing gd32f30x_spi.o(.rev16_text), (4 bytes). + Removing gd32f30x_spi.o(.revsh_text), (4 bytes). + Removing gd32f30x_spi.o(i.i2s_disable), (10 bytes). + Removing gd32f30x_spi.o(i.i2s_enable), (10 bytes). + Removing gd32f30x_spi.o(i.i2s_init), (28 bytes). + Removing gd32f30x_spi.o(i.i2s_psc_config), (170 bytes). + Removing gd32f30x_spi.o(i.qspi_disable), (14 bytes). + Removing gd32f30x_spi.o(i.qspi_enable), (14 bytes). + Removing gd32f30x_spi.o(i.qspi_io23_output_disable), (14 bytes). + Removing gd32f30x_spi.o(i.qspi_io23_output_enable), (14 bytes). + Removing gd32f30x_spi.o(i.qspi_read_enable), (14 bytes). + Removing gd32f30x_spi.o(i.qspi_write_enable), (14 bytes). + Removing gd32f30x_spi.o(i.spi_bidirectional_transfer_config), (26 bytes). + Removing gd32f30x_spi.o(i.spi_crc_error_clear), (10 bytes). + Removing gd32f30x_spi.o(i.spi_crc_get), (16 bytes). + Removing gd32f30x_spi.o(i.spi_crc_next), (10 bytes). + Removing gd32f30x_spi.o(i.spi_crc_off), (10 bytes). + Removing gd32f30x_spi.o(i.spi_crc_on), (10 bytes). + Removing gd32f30x_spi.o(i.spi_crc_polynomial_get), (8 bytes). + Removing gd32f30x_spi.o(i.spi_crc_polynomial_set), (4 bytes). + Removing gd32f30x_spi.o(i.spi_disable), (10 bytes). + Removing gd32f30x_spi.o(i.spi_dma_disable), (22 bytes). + Removing gd32f30x_spi.o(i.spi_dma_enable), (22 bytes). + Removing gd32f30x_spi.o(i.spi_i2s_data_frame_format_config), (16 bytes). + Removing gd32f30x_spi.o(i.spi_i2s_deinit), (88 bytes). + Removing gd32f30x_spi.o(i.spi_i2s_interrupt_disable), (48 bytes). + Removing gd32f30x_spi.o(i.spi_i2s_interrupt_enable), (48 bytes). + Removing gd32f30x_spi.o(i.spi_i2s_interrupt_flag_get), (112 bytes). + Removing gd32f30x_spi.o(i.spi_nss_internal_high), (10 bytes). + Removing gd32f30x_spi.o(i.spi_nss_internal_low), (10 bytes). + Removing gd32f30x_spi.o(i.spi_nss_output_disable), (10 bytes). + Removing gd32f30x_spi.o(i.spi_nss_output_enable), (10 bytes). + Removing gd32f30x_spi.o(i.spi_nssp_mode_disable), (10 bytes). + Removing gd32f30x_spi.o(i.spi_nssp_mode_enable), (10 bytes). + Removing gd32f30x_spi.o(i.spi_struct_para_init), (18 bytes). + Removing gd32f30x_spi.o(i.spi_ti_mode_disable), (10 bytes). + Removing gd32f30x_spi.o(i.spi_ti_mode_enable), (10 bytes). + Removing gd32f30x_timer.o(.rev16_text), (4 bytes). + Removing gd32f30x_timer.o(.revsh_text), (4 bytes). + Removing gd32f30x_timer.o(i.timer_auto_reload_shadow_disable), (10 bytes). + Removing gd32f30x_timer.o(i.timer_auto_reload_shadow_enable), (10 bytes). + Removing gd32f30x_timer.o(i.timer_automatic_output_disable), (10 bytes). + Removing gd32f30x_timer.o(i.timer_automatic_output_enable), (10 bytes). + Removing gd32f30x_timer.o(i.timer_break_config), (30 bytes). + Removing gd32f30x_timer.o(i.timer_break_disable), (10 bytes). + Removing gd32f30x_timer.o(i.timer_break_enable), (10 bytes). + Removing gd32f30x_timer.o(i.timer_break_struct_para_init), (18 bytes). + Removing gd32f30x_timer.o(i.timer_channel_capture_value_register_read), (42 bytes). + Removing gd32f30x_timer.o(i.timer_channel_complementary_output_polarity_config), (70 bytes). + Removing gd32f30x_timer.o(i.timer_channel_complementary_output_state_config), (70 bytes). + Removing gd32f30x_timer.o(i.timer_channel_control_shadow_config), (24 bytes). + Removing gd32f30x_timer.o(i.timer_channel_control_shadow_update_config), (26 bytes). + Removing gd32f30x_timer.o(i.timer_channel_dma_request_source_select), (26 bytes). + Removing gd32f30x_timer.o(i.timer_channel_input_capture_prescaler_config), (90 bytes). + Removing gd32f30x_timer.o(i.timer_channel_input_struct_para_init), (16 bytes). + Removing gd32f30x_timer.o(i.timer_channel_output_clear_config), (90 bytes). + Removing gd32f30x_timer.o(i.timer_channel_output_config), (492 bytes). + Removing gd32f30x_timer.o(i.timer_channel_output_fast_config), (90 bytes). + Removing gd32f30x_timer.o(i.timer_channel_output_mode_config), (90 bytes). + Removing gd32f30x_timer.o(i.timer_channel_output_polarity_config), (92 bytes). + Removing gd32f30x_timer.o(i.timer_channel_output_pulse_value_config), (38 bytes). + Removing gd32f30x_timer.o(i.timer_channel_output_shadow_config), (90 bytes). + Removing gd32f30x_timer.o(i.timer_channel_output_state_config), (92 bytes). + Removing gd32f30x_timer.o(i.timer_channel_output_struct_para_init), (16 bytes). + Removing gd32f30x_timer.o(i.timer_counter_alignment), (16 bytes). + Removing gd32f30x_timer.o(i.timer_counter_down_direction), (10 bytes). + Removing gd32f30x_timer.o(i.timer_counter_up_direction), (10 bytes). + Removing gd32f30x_timer.o(i.timer_deinit), (220 bytes). + Removing gd32f30x_timer.o(i.timer_disable), (10 bytes). + Removing gd32f30x_timer.o(i.timer_dma_disable), (8 bytes). + Removing gd32f30x_timer.o(i.timer_dma_enable), (8 bytes). + Removing gd32f30x_timer.o(i.timer_dma_transfer_config), (24 bytes). + Removing gd32f30x_timer.o(i.timer_event_software_generate), (8 bytes). + Removing gd32f30x_timer.o(i.timer_external_clock_mode0_config), (40 bytes). + Removing gd32f30x_timer.o(i.timer_external_clock_mode1_config), (32 bytes). + Removing gd32f30x_timer.o(i.timer_external_clock_mode1_disable), (10 bytes). + Removing gd32f30x_timer.o(i.timer_external_trigger_as_external_clock_config), (166 bytes). + Removing gd32f30x_timer.o(i.timer_external_trigger_config), (30 bytes). + Removing gd32f30x_timer.o(i.timer_flag_clear), (6 bytes). + Removing gd32f30x_timer.o(i.timer_flag_get), (16 bytes). + Removing gd32f30x_timer.o(i.timer_hall_mode_config), (26 bytes). + Removing gd32f30x_timer.o(i.timer_input_capture_config), (326 bytes). + Removing gd32f30x_timer.o(i.timer_input_pwm_capture_config), (356 bytes). + Removing gd32f30x_timer.o(i.timer_input_trigger_source_select), (16 bytes). + Removing gd32f30x_timer.o(i.timer_internal_clock_config), (10 bytes). + Removing gd32f30x_timer.o(i.timer_internal_trigger_as_external_clock_config), (32 bytes). + Removing gd32f30x_timer.o(i.timer_master_output_trigger_source_select), (16 bytes). + Removing gd32f30x_timer.o(i.timer_master_slave_mode_config), (26 bytes). + Removing gd32f30x_timer.o(i.timer_output_value_selection_config), (34 bytes). + Removing gd32f30x_timer.o(i.timer_prescaler_read), (10 bytes). + Removing gd32f30x_timer.o(i.timer_primary_output_config), (24 bytes). + Removing gd32f30x_timer.o(i.timer_quadrature_decoder_mode_config), (64 bytes). + Removing gd32f30x_timer.o(i.timer_repetition_value_config), (4 bytes). + Removing gd32f30x_timer.o(i.timer_single_pulse_mode_config), (26 bytes). + Removing gd32f30x_timer.o(i.timer_slave_mode_select), (16 bytes). + Removing gd32f30x_timer.o(i.timer_struct_para_init), (22 bytes). + Removing gd32f30x_timer.o(i.timer_update_event_disable), (10 bytes). + Removing gd32f30x_timer.o(i.timer_update_event_enable), (10 bytes). + Removing gd32f30x_timer.o(i.timer_update_source_config), (26 bytes). + Removing gd32f30x_timer.o(i.timer_write_chxval_register_config), (34 bytes). + Removing gd32f30x_usart.o(.rev16_text), (4 bytes). + Removing gd32f30x_usart.o(.revsh_text), (4 bytes). + Removing gd32f30x_usart.o(i.usart_address_config), (20 bytes). + Removing gd32f30x_usart.o(i.usart_baudrate_set), (144 bytes). + Removing gd32f30x_usart.o(i.usart_block_length_config), (28 bytes). + Removing gd32f30x_usart.o(i.usart_data_first_config), (20 bytes). + Removing gd32f30x_usart.o(i.usart_data_receive), (10 bytes). + Removing gd32f30x_usart.o(i.usart_data_transmit), (8 bytes). + Removing gd32f30x_usart.o(i.usart_deinit), (144 bytes). + Removing gd32f30x_usart.o(i.usart_disable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_dma_receive_config), (16 bytes). + Removing gd32f30x_usart.o(i.usart_dma_transmit_config), (16 bytes). + Removing gd32f30x_usart.o(i.usart_enable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_flag_clear), (26 bytes). + Removing gd32f30x_usart.o(i.usart_flag_get), (30 bytes). + Removing gd32f30x_usart.o(i.usart_guard_time_config), (24 bytes). + Removing gd32f30x_usart.o(i.usart_halfduplex_disable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_halfduplex_enable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_hardware_flow_cts_config), (16 bytes). + Removing gd32f30x_usart.o(i.usart_hardware_flow_rts_config), (16 bytes). + Removing gd32f30x_usart.o(i.usart_interrupt_disable), (26 bytes). + Removing gd32f30x_usart.o(i.usart_interrupt_enable), (26 bytes). + Removing gd32f30x_usart.o(i.usart_interrupt_flag_clear), (26 bytes). + Removing gd32f30x_usart.o(i.usart_interrupt_flag_get), (56 bytes). + Removing gd32f30x_usart.o(i.usart_invert_config), (104 bytes). + Removing gd32f30x_usart.o(i.usart_irda_lowpower_config), (20 bytes). + Removing gd32f30x_usart.o(i.usart_irda_mode_disable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_irda_mode_enable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_lin_break_detection_length_config), (20 bytes). + Removing gd32f30x_usart.o(i.usart_lin_mode_disable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_lin_mode_enable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_mute_mode_disable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_mute_mode_enable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_mute_mode_wakeup_config), (16 bytes). + Removing gd32f30x_usart.o(i.usart_parity_config), (16 bytes). + Removing gd32f30x_usart.o(i.usart_prescaler_config), (16 bytes). + Removing gd32f30x_usart.o(i.usart_receive_config), (16 bytes). + Removing gd32f30x_usart.o(i.usart_receiver_timeout_disable), (14 bytes). + Removing gd32f30x_usart.o(i.usart_receiver_timeout_enable), (14 bytes). + Removing gd32f30x_usart.o(i.usart_receiver_timeout_threshold_config), (20 bytes). + Removing gd32f30x_usart.o(i.usart_send_break), (10 bytes). + Removing gd32f30x_usart.o(i.usart_smartcard_autoretry_config), (26 bytes). + Removing gd32f30x_usart.o(i.usart_smartcard_mode_disable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_smartcard_mode_enable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_smartcard_mode_nack_disable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_smartcard_mode_nack_enable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_stop_bit_set), (16 bytes). + Removing gd32f30x_usart.o(i.usart_synchronous_clock_config), (34 bytes). + Removing gd32f30x_usart.o(i.usart_synchronous_clock_disable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_synchronous_clock_enable), (10 bytes). + Removing gd32f30x_usart.o(i.usart_transmit_config), (16 bytes). + Removing gd32f30x_usart.o(i.usart_word_length_set), (16 bytes). + Removing usbd_lld_core.o(.rev16_text), (4 bytes). + Removing usbd_lld_core.o(.revsh_text), (4 bytes). + Removing usbd_lld_core.o(i.user_buffer_free), (84 bytes). + Removing usbd_lld_int.o(.rev16_text), (4 bytes). + Removing usbd_lld_int.o(.revsh_text), (4 bytes). + Removing usbd_lld_int.o(i.usbd_int_hpst), (300 bytes). + Removing usbd_core.o(.rev16_text), (4 bytes). + Removing usbd_core.o(.revsh_text), (4 bytes). + Removing usbd_enum.o(.rev16_text), (4 bytes). + Removing usbd_enum.o(.revsh_text), (4 bytes). + Removing usbd_pwr.o(.rev16_text), (4 bytes). + Removing usbd_pwr.o(.revsh_text), (4 bytes). + Removing usbd_pwr.o(i.usbd_remote_wakeup_active), (42 bytes). + Removing usbd_transc.o(.rev16_text), (4 bytes). + Removing usbd_transc.o(.revsh_text), (4 bytes). + Removing custom_hid_core.o(.rev16_text), (4 bytes). + Removing custom_hid_core.o(.revsh_text), (4 bytes). + Removing buzzer.o(.rev16_text), (4 bytes). + Removing buzzer.o(.revsh_text), (4 bytes). + Removing i2c.o(.rev16_text), (4 bytes). + Removing i2c.o(.revsh_text), (4 bytes). + Removing i2c.o(i.i2c_init), (48 bytes). + Removing i2c.o(i.i2c_test_basic), (68 bytes). + Removing led.o(.rev16_text), (4 bytes). + Removing led.o(.revsh_text), (4 bytes). + Removing led.o(i.lcd_back_light_ctrl), (32 bytes). + Removing platform.o(.rev16_text), (4 bytes). + Removing platform.o(.revsh_text), (4 bytes). + Removing platform.o(i.CRC16), (84 bytes). + Removing platform.o(i.get_hard_flag), (12 bytes). + Removing platform.o(i.get_pc_communication_type), (12 bytes). + Removing platform.o(i.operation_debug_io), (80 bytes). + Removing platform.o(i.set_hard_flag), (12 bytes). + Removing platform.o(.constdata), (32 bytes). + Removing rf24l01 - multi.o(.rev16_text), (4 bytes). + Removing rf24l01 - multi.o(.revsh_text), (4 bytes). + Removing rf24l01 - multi.o(i.NRF24L01_Read_Rx_Payload), (124 bytes). + Removing rf24l01 - multi.o(i.NRF24L01_Read_Top_Fifo_Width), (68 bytes). + Removing rf24l01 - multi.o(i.RF24L01_ClrIRQ), (14 bytes). + Removing rf24l01 - multi.o(i.rf_Irq), (120 bytes). + Removing hw_mcuio.o(.rev16_text), (4 bytes). + Removing hw_mcuio.o(.revsh_text), (4 bytes). + Removing hw_mcuio.o(i.HW_GD_DelayUS), (18 bytes). + Removing base_core.o(i.debug_check_err), (40 bytes). + Removing base_process_rx_keypad.o(i.keypad_rf_data_fetch), (44 bytes). + Removing base_process_rx_keypad.o(i.keypad_rf_data_process), (26 bytes). + Removing common_math.o(i.Dec_to_Hex), (72 bytes). + Removing common_math.o(i.mem_cmp_const), (32 bytes). + Removing common_math.o(i.mem_search_const), (32 bytes). + Removing multi_channel.o(i.rf_modual__tx_interrupt_counter), (32 bytes). + Removing fucntion_fastmatch.o(i.fastmatch_switch), (48 bytes). + Removing fucntion_text_message.o(i.msg_clr_len), (16 bytes). + Removing fucntion_text_message.o(i.msg_get_status), (12 bytes). + Removing function.o(i.function_init_all), (16 bytes). + Removing function_aes.o(.rev16_text), (4 bytes). + Removing function_aes.o(.revsh_text), (4 bytes). + Removing function_broadcast.o(.data), (1 bytes). + Removing function_network.o(.rev16_text), (4 bytes). + Removing function_network.o(.revsh_text), (4 bytes). + Removing function_network.o(i.network_wait_rfsendOK), (34 bytes). + Removing transparentupgrade.o(i.Upgrade_GetNextPack), (2 bytes). + Removing aes.o(i.Base64Decode), (182 bytes). + Removing aes.o(i.Base64Encode), (192 bytes). + Removing aes.o(i.Buffercmp), (36 bytes). + Removing aes.o(i.GetBase64Value), (78 bytes). + Removing aes.o(i.getSBoxInvert), (12 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_AllocDownBuffer), (192 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_AllocUpBuffer), (192 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_ConfigDownBuffer), (168 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_ConfigUpBuffer), (168 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_GetKey), (32 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_HasData), (28 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_HasKey), (40 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_Init), (8 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_PutChar), (120 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_PutCharSkip), (104 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_PutCharSkipNoLock), (56 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_SetFlagsDownBuffer), (84 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_SetFlagsUpBuffer), (84 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_SetNameDownBuffer), (84 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_SetNameUpBuffer), (84 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_SetTerminal), (156 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_TerminalOut), (256 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_WaitKey), (14 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_WriteSkipNoLock), (176 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_WriteString), (26 bytes). + Removing segger_rtt.o(i.SEGGER_RTT_WriteWithOverwriteNoLock), (172 bytes). + Removing segger_rtt.o(i._PostTerminalSwitch), (36 bytes). + Removing segger_rtt.o(.data), (17 bytes). + Removing crypto.o(.rev16_text), (4 bytes). + Removing crypto.o(.revsh_text), (4 bytes). + Removing crypto.o(.rrx_text), (6 bytes). + Removing crypto.o(i.AES_CBC_Decrypt_Append), (584 bytes). + Removing crypto.o(i.AES_CBC_Decrypt_Finish), (26 bytes). + Removing crypto.o(i.AES_CBC_Decrypt_Init), (6 bytes). + Removing crypto.o(i.AES_CBC_Encrypt_Append), (424 bytes). + Removing crypto.o(i.AES_CBC_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.AES_CBC_Encrypt_Init), (6 bytes). + Removing crypto.o(i.AES_CCM_Decrypt_Append), (466 bytes). + Removing crypto.o(i.AES_CCM_Decrypt_Finish), (252 bytes). + Removing crypto.o(i.AES_CCM_Decrypt_Init), (4 bytes). + Removing crypto.o(i.AES_CCM_Encrypt_Append), (956 bytes). + Removing crypto.o(i.AES_CCM_Encrypt_Finish), (230 bytes). + Removing crypto.o(i.AES_CCM_Encrypt_Init), (560 bytes). + Removing crypto.o(i.AES_CCM_Header_Append), (588 bytes). + Removing crypto.o(i.AES_CFB_Decrypt_Append), (396 bytes). + Removing crypto.o(i.AES_CFB_Decrypt_Finish), (26 bytes). + Removing crypto.o(i.AES_CFB_Decrypt_Init), (4 bytes). + Removing crypto.o(i.AES_CFB_Encrypt_Append), (396 bytes). + Removing crypto.o(i.AES_CFB_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.AES_CFB_Encrypt_Init), (178 bytes). + Removing crypto.o(i.AES_CMAC_Decrypt_Append), (4 bytes). + Removing crypto.o(i.AES_CMAC_Decrypt_Finish), (180 bytes). + Removing crypto.o(i.AES_CMAC_Decrypt_Init), (46 bytes). + Removing crypto.o(i.AES_CMAC_Encrypt_Append), (884 bytes). + Removing crypto.o(i.AES_CMAC_Encrypt_Finish), (164 bytes). + Removing crypto.o(i.AES_CMAC_Encrypt_Init), (46 bytes). + Removing crypto.o(i.AES_CTR_Decrypt_Append), (16 bytes). + Removing crypto.o(i.AES_CTR_Decrypt_Finish), (26 bytes). + Removing crypto.o(i.AES_CTR_Decrypt_Init), (6 bytes). + Removing crypto.o(i.AES_CTR_Encrypt_Append), (604 bytes). + Removing crypto.o(i.AES_CTR_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.AES_CTR_Encrypt_Init), (6 bytes). + Removing crypto.o(i.AES_GCM_Decrypt_Append), (22 bytes). + Removing crypto.o(i.AES_GCM_Decrypt_Finish), (8 bytes). + Removing crypto.o(i.AES_GCM_Decrypt_Init), (4 bytes). + Removing crypto.o(i.AES_GCM_Encrypt_Append), (22 bytes). + Removing crypto.o(i.AES_GCM_Encrypt_Finish), (6 bytes). + Removing crypto.o(i.AES_GCM_Encrypt_Init), (1036 bytes). + Removing crypto.o(i.AES_GCM_Header_Append), (416 bytes). + Removing crypto.o(i.AES_KeyWrap_Decrypt_Append), (286 bytes). + Removing crypto.o(i.AES_KeyWrap_Decrypt_Finish), (50 bytes). + Removing crypto.o(i.AES_KeyWrap_Decrypt_Init), (20 bytes). + Removing crypto.o(i.AES_KeyWrap_Encrypt_Append), (352 bytes). + Removing crypto.o(i.AES_KeyWrap_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.AES_KeyWrap_Encrypt_Init), (20 bytes). + Removing crypto.o(i.AES_OFB_Decrypt_Append), (16 bytes). + Removing crypto.o(i.AES_OFB_Decrypt_Finish), (26 bytes). + Removing crypto.o(i.AES_OFB_Decrypt_Init), (4 bytes). + Removing crypto.o(i.AES_OFB_Encrypt_Append), (376 bytes). + Removing crypto.o(i.AES_OFB_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.AES_OFB_Encrypt_Init), (178 bytes). + Removing crypto.o(i.AES_XTS_Common_Append), (1098 bytes). + Removing crypto.o(i.AES_XTS_Common_Init), (218 bytes). + Removing crypto.o(i.AES_XTS_Decrypt_Append), (24 bytes). + Removing crypto.o(i.AES_XTS_Decrypt_Finish), (26 bytes). + Removing crypto.o(i.AES_XTS_Decrypt_Init), (6 bytes). + Removing crypto.o(i.AES_XTS_Encrypt_Append), (24 bytes). + Removing crypto.o(i.AES_XTS_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.AES_XTS_Encrypt_Init), (6 bytes). + Removing crypto.o(i.AES_keyschedule_enc), (34 bytes). + Removing crypto.o(i.AESgcmAppend), (988 bytes). + Removing crypto.o(i.AESgcmFinal), (452 bytes). + Removing crypto.o(i.ARC4_Decrypt_Append), (16 bytes). + Removing crypto.o(i.ARC4_Decrypt_Finish), (26 bytes). + Removing crypto.o(i.ARC4_Decrypt_Init), (132 bytes). + Removing crypto.o(i.ARC4_Encrypt_Append), (348 bytes). + Removing crypto.o(i.ARC4_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.ARC4_Encrypt_Init), (130 bytes). + Removing crypto.o(i.AddBig), (294 bytes). + Removing crypto.o(i.Add_Moduli_Big), (392 bytes). + Removing crypto.o(i.Big_to_W8), (100 bytes). + Removing crypto.o(i.Big_to_fixedW8), (74 bytes). + Removing crypto.o(i.Binary_DoublePointMul), (336 bytes). + Removing crypto.o(i.C25519keyExchange), (190 bytes). + Removing crypto.o(i.C25519keyGen), (84 bytes). + Removing crypto.o(i.CHACHA_Decrypt_Append), (16 bytes). + Removing crypto.o(i.CHACHA_Decrypt_Finish), (26 bytes). + Removing crypto.o(i.CHACHA_Decrypt_Init), (4 bytes). + Removing crypto.o(i.CHACHA_Encrypt_Append), (402 bytes). + Removing crypto.o(i.CHACHA_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.CHACHA_Encrypt_Init), (196 bytes). + Removing crypto.o(i.ChaCha20Poly1305_Append), (532 bytes). + Removing crypto.o(i.ChaCha20Poly1305_Decrypt_Append), (22 bytes). + Removing crypto.o(i.ChaCha20Poly1305_Decrypt_Finish), (190 bytes). + Removing crypto.o(i.ChaCha20Poly1305_Decrypt_Init), (4 bytes). + Removing crypto.o(i.ChaCha20Poly1305_Encrypt_Append), (22 bytes). + Removing crypto.o(i.ChaCha20Poly1305_Encrypt_Finish), (134 bytes). + Removing crypto.o(i.ChaCha20Poly1305_Encrypt_Init), (232 bytes). + Removing crypto.o(i.ChaCha20Poly1305_Header_Append), (236 bytes). + Removing crypto.o(i.CompareBig), (160 bytes). + Removing crypto.o(i.CopyBig), (98 bytes). + Removing crypto.o(i.CountBits), (52 bytes). + Removing crypto.o(i.CountBytes), (52 bytes). + Removing crypto.o(i.DES_CBC_Decrypt_Append), (196 bytes). + Removing crypto.o(i.DES_CBC_Decrypt_Finish), (26 bytes). + Removing crypto.o(i.DES_CBC_Decrypt_Init), (6 bytes). + Removing crypto.o(i.DES_CBC_Encrypt_Append), (160 bytes). + Removing crypto.o(i.DES_CBC_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.DES_CBC_Encrypt_Init), (6 bytes). + Removing crypto.o(i.DES_ECB_Decrypt_Append), (172 bytes). + Removing crypto.o(i.DES_ECB_Decrypt_Finish), (26 bytes). + Removing crypto.o(i.DES_ECB_Decrypt_Init), (6 bytes). + Removing crypto.o(i.DES_ECB_Encrypt_Append), (172 bytes). + Removing crypto.o(i.DES_ECB_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.DES_ECB_Encrypt_Init), (6 bytes). + Removing crypto.o(i.DESstdInit), (244 bytes). + Removing crypto.o(i.DRBG_AES128_Block_cipher_df), (376 bytes). + Removing crypto.o(i.DRBG_AES128_Update), (136 bytes). + Removing crypto.o(i.ECCcopyPoint), (108 bytes). + Removing crypto.o(i.ECCfreeEC), (124 bytes). + Removing crypto.o(i.ECCfreePoint), (66 bytes). + Removing crypto.o(i.ECCfreePrivKey), (46 bytes). + Removing crypto.o(i.ECCgetPointCoordinate), (192 bytes). + Removing crypto.o(i.ECCgetPointFlag), (12 bytes). + Removing crypto.o(i.ECCgetPrivKeyValue), (132 bytes). + Removing crypto.o(i.ECCinitEC), (480 bytes). + Removing crypto.o(i.ECCinitPoint), (208 bytes). + Removing crypto.o(i.ECCinitPrivKey), (110 bytes). + Removing crypto.o(i.ECCkeyGen), (416 bytes). + Removing crypto.o(i.ECCpoint2Monty), (70 bytes). + Removing crypto.o(i.ECCpointFromMonty), (72 bytes). + Removing crypto.o(i.ECCscalarMul), (244 bytes). + Removing crypto.o(i.ECCsetPointCoordinate), (82 bytes). + Removing crypto.o(i.ECCsetPointFlag), (8 bytes). + Removing crypto.o(i.ECCsetPointGenerator), (128 bytes). + Removing crypto.o(i.ECCsetPrivKeyValue), (40 bytes). + Removing crypto.o(i.ECCsymmetricPoint), (42 bytes). + Removing crypto.o(i.ECCvalidatePubKey), (560 bytes). + Removing crypto.o(i.ECDSAfreeSign), (56 bytes). + Removing crypto.o(i.ECDSAgetSignature), (180 bytes). + Removing crypto.o(i.ECDSAinitSign), (124 bytes). + Removing crypto.o(i.ECDSAsetSignature), (54 bytes). + Removing crypto.o(i.ECDSAsign), (1076 bytes). + Removing crypto.o(i.ECDSAverify), (726 bytes). + Removing crypto.o(i.ED25519keyGen), (206 bytes). + Removing crypto.o(i.ED25519sign), (782 bytes). + Removing crypto.o(i.ED25519verify), (412 bytes). + Removing crypto.o(i.EvenBig), (16 bytes). + Removing crypto.o(i.FastDiv2), (90 bytes). + Removing crypto.o(i.FastDivInnerBase), (62 bytes). + Removing crypto.o(i.FastMul2), (94 bytes). + Removing crypto.o(i.FastMulInnerBase), (92 bytes). + Removing crypto.o(i.GenRndBN), (146 bytes). + Removing crypto.o(i.GenRndBNmodN), (196 bytes). + Removing crypto.o(i.GiveBit), (30 bytes). + Removing crypto.o(i.HKDF_SHA512), (502 bytes). + Removing crypto.o(i.HMAC_MD5_Append), (52 bytes). + Removing crypto.o(i.HMAC_MD5_Finish), (180 bytes). + Removing crypto.o(i.HMAC_MD5_Init), (360 bytes). + Removing crypto.o(i.HMAC_SHA1_Append), (16 bytes). + Removing crypto.o(i.HMAC_SHA1_Finish), (160 bytes). + Removing crypto.o(i.HMAC_SHA1_Init), (352 bytes). + Removing crypto.o(i.HMAC_SHA224_Append), (52 bytes). + Removing crypto.o(i.HMAC_SHA224_Finish), (220 bytes). + Removing crypto.o(i.HMAC_SHA224_Init), (416 bytes). + Removing crypto.o(i.HMAC_SHA256_Append), (52 bytes). + Removing crypto.o(i.HMAC_SHA256_Finish), (220 bytes). + Removing crypto.o(i.HMAC_SHA256_Init), (416 bytes). + Removing crypto.o(i.HMAC_SHA384_Append), (36 bytes). + Removing crypto.o(i.HMAC_SHA384_Finish), (300 bytes). + Removing crypto.o(i.HMAC_SHA384_Init), (508 bytes). + Removing crypto.o(i.HMAC_SHA512_Append), (36 bytes). + Removing crypto.o(i.HMAC_SHA512_Finish), (166 bytes). + Removing crypto.o(i.HMAC_SHA512_Init), (328 bytes). + Removing crypto.o(i.InitBig), (66 bytes). + Removing crypto.o(i.IsZeroBig), (22 bytes). + Removing crypto.o(i.LeftShift), (116 bytes). + Removing crypto.o(i.MD5_Append), (42 bytes). + Removing crypto.o(i.MD5_Finish), (150 bytes). + Removing crypto.o(i.MD5_Init), (60 bytes). + Removing crypto.o(i.ModularAddBig), (68 bytes). + Removing crypto.o(i.ModularExpSlidWin), (596 bytes). + Removing crypto.o(i.ModularFastMul2), (60 bytes). + Removing crypto.o(i.ModularInvBig), (470 bytes). + Removing crypto.o(i.ModularSubBig), (52 bytes). + Removing crypto.o(i.MontyExit), (66 bytes). + Removing crypto.o(i.MontyInit), (338 bytes). + Removing crypto.o(i.MontyJacProjAddPoints), (618 bytes). + Removing crypto.o(i.MontyJacProjDoublePoint), (552 bytes). + Removing crypto.o(i.MontyKillAll), (26 bytes). + Removing crypto.o(i.MontyKillR2), (12 bytes). + Removing crypto.o(i.MontyMul), (352 bytes). + Removing crypto.o(i.MulBigbyUnInt), (90 bytes). + Removing crypto.o(i.NAF_Binary_PointMul), (640 bytes). + Removing crypto.o(i.Normalize), (274 bytes). + Removing crypto.o(i.Poly1305_Auth_Append), (212 bytes). + Removing crypto.o(i.Poly1305_Auth_Finish), (164 bytes). + Removing crypto.o(i.Poly1305_Auth_Init), (276 bytes). + Removing crypto.o(i.Poly1305_Core_Finish), (832 bytes). + Removing crypto.o(i.Poly1305_Core_Update), (1392 bytes). + Removing crypto.o(i.Poly1305_Verify_Append), (4 bytes). + Removing crypto.o(i.Poly1305_Verify_Finish), (148 bytes). + Removing crypto.o(i.Poly1305_Verify_Init), (4 bytes). + Removing crypto.o(i.RNGfree), (46 bytes). + Removing crypto.o(i.RNGgenBytes), (146 bytes). + Removing crypto.o(i.RNGgenWords), (6 bytes). + Removing crypto.o(i.RNGinit), (224 bytes). + Removing crypto.o(i.RNGreseed), (188 bytes). + Removing crypto.o(i.RSASP1), (96 bytes). + Removing crypto.o(i.RSAVP1), (34 bytes). + Removing crypto.o(i.RSA_PKCS1v15_Decrypt), (432 bytes). + Removing crypto.o(i.RSA_PKCS1v15_Encrypt), (488 bytes). + Removing crypto.o(i.RSA_PKCS1v15_Sign), (592 bytes). + Removing crypto.o(i.RSA_PKCS1v15_Verify), (764 bytes). + Removing crypto.o(i.RightShift), (108 bytes). + Removing crypto.o(i.SHA1Final), (482 bytes). + Removing crypto.o(i.SHA1Init), (48 bytes). + Removing crypto.o(i.SHA1Transform), (892 bytes). + Removing crypto.o(i.SHA1Update), (154 bytes). + Removing crypto.o(i.SHA1_Append), (188 bytes). + Removing crypto.o(i.SHA1_Finish), (150 bytes). + Removing crypto.o(i.SHA1_Init), (68 bytes). + Removing crypto.o(i.SHA224Final), (472 bytes). + Removing crypto.o(i.SHA224Init), (72 bytes). + Removing crypto.o(i.SHA224_Append), (42 bytes). + Removing crypto.o(i.SHA224_Finish), (150 bytes). + Removing crypto.o(i.SHA224_Init), (92 bytes). + Removing crypto.o(i.SHA256Final), (480 bytes). + Removing crypto.o(i.SHA256Init), (72 bytes). + Removing crypto.o(i.SHA256Transform), (600 bytes). + Removing crypto.o(i.SHA256Update), (154 bytes). + Removing crypto.o(i.SHA256_Append), (42 bytes). + Removing crypto.o(i.SHA256_Finish), (150 bytes). + Removing crypto.o(i.SHA256_Init), (92 bytes). + Removing crypto.o(i.SHA384Final), (528 bytes). + Removing crypto.o(i.SHA384Init), (140 bytes). + Removing crypto.o(i.SHA384_Append), (36 bytes). + Removing crypto.o(i.SHA384_Finish), (150 bytes). + Removing crypto.o(i.SHA384_Init), (160 bytes). + Removing crypto.o(i.SHA512Final), (528 bytes). + Removing crypto.o(i.SHA512Init), (140 bytes). + Removing crypto.o(i.SHA512Transform), (1296 bytes). + Removing crypto.o(i.SHA512Update), (164 bytes). + Removing crypto.o(i.SHA512_Append), (36 bytes). + Removing crypto.o(i.SHA512_Finish), (150 bytes). + Removing crypto.o(i.SHA512_Init), (160 bytes). + Removing crypto.o(i.STM32_GetCryptoLibrarySettings), (72 bytes). + Removing crypto.o(i.SetZeroBig), (38 bytes). + Removing crypto.o(i.SignBig), (10 bytes). + Removing crypto.o(i.StAllocBig), (66 bytes). + Removing crypto.o(i.StFreeBig), (36 bytes). + Removing crypto.o(i.SubBig), (212 bytes). + Removing crypto.o(i.Sub_Moduli_Big), (260 bytes). + Removing crypto.o(i.TDES_CBC_Decrypt_Append), (216 bytes). + Removing crypto.o(i.TDES_CBC_Decrypt_Finish), (26 bytes). + Removing crypto.o(i.TDES_CBC_Decrypt_Init), (6 bytes). + Removing crypto.o(i.TDES_CBC_Encrypt_Append), (184 bytes). + Removing crypto.o(i.TDES_CBC_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.TDES_CBC_Encrypt_Init), (6 bytes). + Removing crypto.o(i.TDES_ECB_Decrypt_Append), (192 bytes). + Removing crypto.o(i.TDES_ECB_Decrypt_Finish), (26 bytes). + Removing crypto.o(i.TDES_ECB_Decrypt_Init), (6 bytes). + Removing crypto.o(i.TDES_ECB_Encrypt_Append), (192 bytes). + Removing crypto.o(i.TDES_ECB_Encrypt_Finish), (26 bytes). + Removing crypto.o(i.TDES_ECB_Encrypt_Init), (6 bytes). + Removing crypto.o(i.TDESstdInit), (274 bytes). + Removing crypto.o(i.W32_to_W8), (82 bytes). + Removing crypto.o(i.W8_to_Big), (198 bytes). + Removing crypto.o(i.barrett_reduce), (396 bytes). + Removing crypto.o(i.c25519_sm), (1172 bytes). + Removing crypto.o(i.crl_DRBG_AES128_Generate), (478 bytes). + Removing crypto.o(i.crl_DRBG_AES128_Instantiate), (188 bytes). + Removing crypto.o(i.crl_DRBG_AES128_Reseed), (166 bytes). + Removing crypto.o(i.crl_ModularExp), (296 bytes). + Removing crypto.o(i.crl_u_MD5_Finish), (216 bytes). + Removing crypto.o(i.crl_u_MD5_Init), (40 bytes). + Removing crypto.o(i.crl_u_MD5_Update), (150 bytes). + Removing crypto.o(i.desfunc), (476 bytes). + Removing crypto.o(i.deskey), (564 bytes). + Removing crypto.o(i.ed25519_add), (220 bytes). + Removing crypto.o(i.fe25519_add), (64 bytes). + Removing crypto.o(i.fe25519_cmov), (156 bytes). + Removing crypto.o(i.fe25519_copy), (34 bytes). + Removing crypto.o(i.fe25519_freeze), (122 bytes). + Removing crypto.o(i.fe25519_getparity), (28 bytes). + Removing crypto.o(i.fe25519_invert), (548 bytes). + Removing crypto.o(i.fe25519_iseq_vartime), (110 bytes). + Removing crypto.o(i.fe25519_mul), (386 bytes). + Removing crypto.o(i.fe25519_mult121665), (64 bytes). + Removing crypto.o(i.fe25519_neg), (66 bytes). + Removing crypto.o(i.fe25519_pack), (56 bytes). + Removing crypto.o(i.fe25519_pow2523), (376 bytes). + Removing crypto.o(i.fe25519_setone), (22 bytes). + Removing crypto.o(i.fe25519_setzero), (20 bytes). + Removing crypto.o(i.fe25519_square), (6 bytes). + Removing crypto.o(i.fe25519_sub), (206 bytes). + Removing crypto.o(i.fe25519_unpack), (38 bytes). + Removing crypto.o(i.ge25519_double_scalarmult_vartime), (422 bytes). + Removing crypto.o(i.ge25519_pack), (124 bytes). + Removing crypto.o(i.ge25519_scalarmult_base), (404 bytes). + Removing crypto.o(i.ge25519_unpackneg_vartime), (416 bytes). + Removing crypto.o(i.gfmul), (364 bytes). + Removing crypto.o(i.md5_process), (2064 bytes). + Removing crypto.o(i.reduceRS), (114 bytes). + Removing crypto.o(i.reduce_add_sub), (176 bytes). + Removing crypto.o(i.salsa20_wordtobyte), (2060 bytes). + Removing crypto.o(i.sc25519_add), (60 bytes). + Removing crypto.o(i.sc25519_from32bytes), (64 bytes). + Removing crypto.o(i.sc25519_from64bytes), (50 bytes). + Removing crypto.o(i.sc25519_mul), (162 bytes). + Removing crypto.o(i.sc25519_to32bytes), (34 bytes). + Removing crypto.o(.constdata), (1 bytes). + Removing crypto.o(.constdata), (1 bytes). + Removing crypto.o(.constdata), (1 bytes). + Removing crypto.o(.constdata), (1 bytes). + Removing crypto.o(.constdata), (1 bytes). + Removing crypto.o(.constdata), (1 bytes). + Removing crypto.o(.constdata), (1 bytes). + Removing crypto.o(.constdata), (2 bytes). + Removing crypto.o(.constdata), (2 bytes). + Removing crypto.o(.constdata), (2 bytes). + Removing crypto.o(.constdata), (2 bytes). + Removing crypto.o(.constdata), (2 bytes). + Removing crypto.o(.constdata), (1 bytes). + Removing crypto.o(.constdata), (1 bytes). + Removing crypto.o(.constdata), (1 bytes). + Removing crypto.o(.constdata), (1 bytes). + Removing dadd.o(.text), (334 bytes). + Removing dmul.o(.text), (228 bytes). + Removing ddiv.o(.text), (222 bytes). + Removing dfixul.o(.text), (48 bytes). + Removing cdrcmple.o(.text), (48 bytes). + Removing depilogue.o(.text), (186 bytes). + +768 unused section(s) (total 85295 bytes) removed from the image. + +============================================================================== + +Image Symbol Table + + Local Symbols + + Symbol Name Value Ov Type Size Object(Section) + + ../clib/../cmprslib/zerorunl2.c 0x00000000 Number 0 __dczerorl2.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 isspace_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 isprint_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 islower_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 isgraph_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 isdigit_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 iscntrl_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 isblank_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 isalpha_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 isalnum_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 isxdigit_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 isupper_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 ctype_o.o ABSOLUTE + ../clib/microlib/ctype/ctype.c 0x00000000 Number 0 ispunct_o.o ABSOLUTE + ../clib/microlib/division.c 0x00000000 Number 0 uidiv.o ABSOLUTE + ../clib/microlib/division.c 0x00000000 Number 0 uldiv.o ABSOLUTE + ../clib/microlib/errno.c 0x00000000 Number 0 errno.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry7a.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry7b.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry8a.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry8b.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry5.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry9a.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry9b.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry10a.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry10b.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry11a.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry2.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry11b.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry12a.o ABSOLUTE + ../clib/microlib/init/entry.s 0x00000000 Number 0 entry12b.o ABSOLUTE + ../clib/microlib/longlong.c 0x00000000 Number 0 llsshr.o ABSOLUTE + ../clib/microlib/longlong.c 0x00000000 Number 0 llushr.o ABSOLUTE + ../clib/microlib/longlong.c 0x00000000 Number 0 llshl.o ABSOLUTE + ../clib/microlib/malloc/malloc.c 0x00000000 Number 0 malloc.o ABSOLUTE + ../clib/microlib/malloc/malloc.c 0x00000000 Number 0 mallocra.o ABSOLUTE + ../clib/microlib/malloc/malloc.c 0x00000000 Number 0 malloca.o ABSOLUTE + ../clib/microlib/malloc/malloc.c 0x00000000 Number 0 mallocr.o ABSOLUTE + ../clib/microlib/malloc/mvars.c 0x00000000 Number 0 mvars.o ABSOLUTE + ../clib/microlib/printf/printf.c 0x00000000 Number 0 printf7.o ABSOLUTE + ../clib/microlib/printf/printf.c 0x00000000 Number 0 printf8.o ABSOLUTE + ../clib/microlib/printf/printf.c 0x00000000 Number 0 printfa.o ABSOLUTE + ../clib/microlib/printf/printf.c 0x00000000 Number 0 printf6.o ABSOLUTE + ../clib/microlib/printf/printf.c 0x00000000 Number 0 printfb.o ABSOLUTE + ../clib/microlib/printf/printf.c 0x00000000 Number 0 printf0.o ABSOLUTE + ../clib/microlib/printf/printf.c 0x00000000 Number 0 printf1.o ABSOLUTE + ../clib/microlib/printf/printf.c 0x00000000 Number 0 printf2.o ABSOLUTE + ../clib/microlib/printf/printf.c 0x00000000 Number 0 printf3.o ABSOLUTE + ../clib/microlib/printf/printf.c 0x00000000 Number 0 printf4.o ABSOLUTE + ../clib/microlib/printf/printf.c 0x00000000 Number 0 printf5.o ABSOLUTE + ../clib/microlib/printf/stubs.s 0x00000000 Number 0 stubs.o ABSOLUTE + ../clib/microlib/stdio/fputc.c 0x00000000 Number 0 fputc.o ABSOLUTE + ../clib/microlib/stdio/semi.s 0x00000000 Number 0 semi.o ABSOLUTE + ../clib/microlib/stdio/streams.c 0x00000000 Number 0 stdout.o ABSOLUTE + ../clib/microlib/stdlib/rand.c 0x00000000 Number 0 rand.o ABSOLUTE + ../clib/microlib/string/memcmp.c 0x00000000 Number 0 memcmp.o ABSOLUTE + ../clib/microlib/string/memcpy.c 0x00000000 Number 0 memcpyb.o ABSOLUTE + ../clib/microlib/string/memcpy.c 0x00000000 Number 0 memmoveb.o ABSOLUTE + ../clib/microlib/string/memcpy.c 0x00000000 Number 0 memmovea.o ABSOLUTE + ../clib/microlib/string/memcpy.c 0x00000000 Number 0 memcpya.o ABSOLUTE + ../clib/microlib/string/memset.c 0x00000000 Number 0 memseta.o ABSOLUTE + ../clib/microlib/string/strcpy.c 0x00000000 Number 0 strcpy.o ABSOLUTE + ../clib/microlib/string/strlen.c 0x00000000 Number 0 strlen.o ABSOLUTE + ../clib/microlib/stubs.s 0x00000000 Number 0 iusefp.o ABSOLUTE + ../clib/microlib/stubs.s 0x00000000 Number 0 iusesemip.o ABSOLUTE + ../clib/scanf.c 0x00000000 Number 0 _strtoul.o ABSOLUTE + ../clib/scanf.c 0x00000000 Number 0 _chval.o ABSOLUTE + ../clib/scanf.c 0x00000000 Number 0 strtol.o ABSOLUTE + ../clib/scanf.c 0x00000000 Number 0 atoi.o ABSOLUTE + ../fplib/microlib/fpadd.c 0x00000000 Number 0 dadd.o ABSOLUTE + ../fplib/microlib/fpdiv.c 0x00000000 Number 0 ddiv.o ABSOLUTE + ../fplib/microlib/fpepilogue.c 0x00000000 Number 0 depilogue.o ABSOLUTE + ../fplib/microlib/fpfix.c 0x00000000 Number 0 dfixul.o ABSOLUTE + ../fplib/microlib/fpmul.c 0x00000000 Number 0 dmul.o ABSOLUTE + ..\Base_core\AESLIB\AES\AES.c 0x00000000 Number 0 aes.o ABSOLUTE + ..\Base_core\core_src\Queue_circle.c 0x00000000 Number 0 queue_circle.o ABSOLUTE + ..\Base_core\core_src\base_core.c 0x00000000 Number 0 base_core.o ABSOLUTE + ..\Base_core\core_src\base_process_pc_cmd_0x60.c 0x00000000 Number 0 base_process_pc_cmd_0x60.o ABSOLUTE + ..\Base_core\core_src\base_process_pc_cmd_0x61.c 0x00000000 Number 0 base_process_pc_cmd_0x61.o ABSOLUTE + ..\Base_core\core_src\base_process_pc_enter.c 0x00000000 Number 0 base_process_pc_enter.o ABSOLUTE + ..\Base_core\core_src\base_process_rx_keypad.c 0x00000000 Number 0 base_process_rx_keypad.o ABSOLUTE + ..\Base_core\core_src\base_process_tx_keypad.c 0x00000000 Number 0 base_process_tx_keypad.o ABSOLUTE + ..\Base_core\core_src\base_timer.c 0x00000000 Number 0 base_timer.o ABSOLUTE + ..\Base_core\core_src\common_math.c 0x00000000 Number 0 common_math.o ABSOLUTE + ..\Base_core\core_src\debug.c 0x00000000 Number 0 debug.o ABSOLUTE + ..\Base_core\core_src\function_e2prom.c 0x00000000 Number 0 function_e2prom.o ABSOLUTE + ..\Base_core\core_src\multi_channel.c 0x00000000 Number 0 multi_channel.o ABSOLUTE + ..\Base_core\core_src\transfer_keypad_pc.c 0x00000000 Number 0 transfer_keypad_pc.o ABSOLUTE + ..\Base_core\core_src\vote__process.c 0x00000000 Number 0 vote__process.o ABSOLUTE + ..\Base_core\core_src\vote__report.c 0x00000000 Number 0 vote__report.o ABSOLUTE + ..\Base_core\func_src\TransparentUpgrade.c 0x00000000 Number 0 transparentupgrade.o ABSOLUTE + ..\Base_core\func_src\fucntion_base_test.c 0x00000000 Number 0 fucntion_base_test.o ABSOLUTE + ..\Base_core\func_src\fucntion_fastmatch.c 0x00000000 Number 0 fucntion_fastmatch.o ABSOLUTE + ..\Base_core\func_src\fucntion_text_message.c 0x00000000 Number 0 fucntion_text_message.o ABSOLUTE + ..\Base_core\func_src\function.c 0x00000000 Number 0 function.o ABSOLUTE + ..\Base_core\func_src\function_AES.c 0x00000000 Number 0 function_aes.o ABSOLUTE + ..\Base_core\func_src\function_NFC.c 0x00000000 Number 0 function_nfc.o ABSOLUTE + ..\Base_core\func_src\function_T2_display.c 0x00000000 Number 0 function_t2_display.o ABSOLUTE + ..\Base_core\func_src\function_broadcast.c 0x00000000 Number 0 function_broadcast.o ABSOLUTE + ..\Base_core\func_src\function_debug.c 0x00000000 Number 0 function_debug.o ABSOLUTE + ..\Base_core\func_src\function_monitor_freq.c 0x00000000 Number 0 function_monitor_freq.o ABSOLUTE + ..\Base_core\func_src\function_network.c 0x00000000 Number 0 function_network.o ABSOLUTE + ..\Base_core\func_src\function_txmsg_beacon.c 0x00000000 Number 0 function_txmsg_beacon.o ABSOLUTE + ..\Base_core\func_src\function_update_keypad.c 0x00000000 Number 0 function_update_keypad.o ABSOLUTE + ..\Base_core\func_src\function_update_keypad_5G8.c 0x00000000 Number 0 function_update_keypad_5g8.o ABSOLUTE + ..\Base_core\func_src\function_upload_multipkt.c 0x00000000 Number 0 function_upload_multipkt.o ABSOLUTE + ..\Base_core\func_src\function_whitelist.c 0x00000000 Number 0 function_whitelist.o ABSOLUTE + ..\Base_core\user_driver\HW_MCUIO.c 0x00000000 Number 0 hw_mcuio.o ABSOLUTE + ..\Base_core\user_driver\RF24L01 - multi.c 0x00000000 Number 0 rf24l01 - multi.o ABSOLUTE + ..\Base_core\user_driver\buzzer.c 0x00000000 Number 0 buzzer.o ABSOLUTE + ..\Base_core\user_driver\i2c.c 0x00000000 Number 0 i2c.o ABSOLUTE + ..\Base_core\user_driver\led.c 0x00000000 Number 0 led.o ABSOLUTE + ..\Base_core\user_driver\platform.c 0x00000000 Number 0 platform.o ABSOLUTE + ..\Crypto_Sources_Files\crypto.c 0x00000000 Number 0 crypto.o ABSOLUTE + ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f30x_hd.s 0x00000000 Number 0 startup_gd32f30x_hd.o ABSOLUTE + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_dma.c 0x00000000 Number 0 gd32f30x_dma.o ABSOLUTE + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_exmc.c 0x00000000 Number 0 gd32f30x_exmc.o ABSOLUTE + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_exti.c 0x00000000 Number 0 gd32f30x_exti.o ABSOLUTE + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_fmc.c 0x00000000 Number 0 gd32f30x_fmc.o ABSOLUTE + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_gpio.c 0x00000000 Number 0 gd32f30x_gpio.o ABSOLUTE + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_misc.c 0x00000000 Number 0 gd32f30x_misc.o ABSOLUTE + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_pmu.c 0x00000000 Number 0 gd32f30x_pmu.o ABSOLUTE + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_rcu.c 0x00000000 Number 0 gd32f30x_rcu.o ABSOLUTE + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_spi.c 0x00000000 Number 0 gd32f30x_spi.o ABSOLUTE + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_timer.c 0x00000000 Number 0 gd32f30x_timer.o ABSOLUTE + ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_usart.c 0x00000000 Number 0 gd32f30x_usart.o ABSOLUTE + ..\Drivers\GD32F30x_usbd_library\class\device\hid\Source\custom_hid_core.c 0x00000000 Number 0 custom_hid_core.o ABSOLUTE + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_core.c 0x00000000 Number 0 usbd_core.o ABSOLUTE + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_enum.c 0x00000000 Number 0 usbd_enum.o ABSOLUTE + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_pwr.c 0x00000000 Number 0 usbd_pwr.o ABSOLUTE + ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_transc.c 0x00000000 Number 0 usbd_transc.o ABSOLUTE + ..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_core.c 0x00000000 Number 0 usbd_lld_core.o ABSOLUTE + ..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_int.c 0x00000000 Number 0 usbd_lld_int.o ABSOLUTE + ..\RTT\SEGGER_RTT.c 0x00000000 Number 0 segger_rtt.o ABSOLUTE + ..\RTT\SEGGER_RTT_printf.c 0x00000000 Number 0 segger_rtt_printf.o ABSOLUTE + ..\Src\custom_hid_itf.c 0x00000000 Number 0 custom_hid_itf.o ABSOLUTE + ..\Src\gd32f30x_it.c 0x00000000 Number 0 gd32f30x_it.o ABSOLUTE + ..\Src\gd32f30x_usbd_hw.c 0x00000000 Number 0 gd32f30x_usbd_hw.o ABSOLUTE + ..\Src\main.c 0x00000000 Number 0 main.o ABSOLUTE + ..\Src\system_gd32f30x.c 0x00000000 Number 0 system_gd32f30x.o ABSOLUTE + ..\\Base_core\\func_src\\function_AES.c 0x00000000 Number 0 function_aes.o ABSOLUTE + ..\\Base_core\\func_src\\function_network.c 0x00000000 Number 0 function_network.o ABSOLUTE + ..\\Base_core\\user_driver\\HW_MCUIO.c 0x00000000 Number 0 hw_mcuio.o ABSOLUTE + ..\\Base_core\\user_driver\\RF24L01 - multi.c 0x00000000 Number 0 rf24l01 - multi.o ABSOLUTE + ..\\Base_core\\user_driver\\buzzer.c 0x00000000 Number 0 buzzer.o ABSOLUTE + ..\\Base_core\\user_driver\\i2c.c 0x00000000 Number 0 i2c.o ABSOLUTE + ..\\Base_core\\user_driver\\led.c 0x00000000 Number 0 led.o ABSOLUTE + ..\\Base_core\\user_driver\\platform.c 0x00000000 Number 0 platform.o ABSOLUTE + ..\\Crypto_Sources_Files\\crypto.c 0x00000000 Number 0 crypto.o ABSOLUTE + ..\\Drivers\\GD32F30x_standard_peripheral\\Source\\gd32f30x_dma.c 0x00000000 Number 0 gd32f30x_dma.o ABSOLUTE + ..\\Drivers\\GD32F30x_standard_peripheral\\Source\\gd32f30x_exmc.c 0x00000000 Number 0 gd32f30x_exmc.o ABSOLUTE + ..\\Drivers\\GD32F30x_standard_peripheral\\Source\\gd32f30x_exti.c 0x00000000 Number 0 gd32f30x_exti.o ABSOLUTE + ..\\Drivers\\GD32F30x_standard_peripheral\\Source\\gd32f30x_fmc.c 0x00000000 Number 0 gd32f30x_fmc.o ABSOLUTE + ..\\Drivers\\GD32F30x_standard_peripheral\\Source\\gd32f30x_gpio.c 0x00000000 Number 0 gd32f30x_gpio.o ABSOLUTE + ..\\Drivers\\GD32F30x_standard_peripheral\\Source\\gd32f30x_misc.c 0x00000000 Number 0 gd32f30x_misc.o ABSOLUTE + ..\\Drivers\\GD32F30x_standard_peripheral\\Source\\gd32f30x_pmu.c 0x00000000 Number 0 gd32f30x_pmu.o ABSOLUTE + ..\\Drivers\\GD32F30x_standard_peripheral\\Source\\gd32f30x_rcu.c 0x00000000 Number 0 gd32f30x_rcu.o ABSOLUTE + ..\\Drivers\\GD32F30x_standard_peripheral\\Source\\gd32f30x_spi.c 0x00000000 Number 0 gd32f30x_spi.o ABSOLUTE + ..\\Drivers\\GD32F30x_standard_peripheral\\Source\\gd32f30x_timer.c 0x00000000 Number 0 gd32f30x_timer.o ABSOLUTE + ..\\Drivers\\GD32F30x_standard_peripheral\\Source\\gd32f30x_usart.c 0x00000000 Number 0 gd32f30x_usart.o ABSOLUTE + ..\\Drivers\\GD32F30x_usbd_library\\class\\device\\hid\\Source\\custom_hid_core.c 0x00000000 Number 0 custom_hid_core.o ABSOLUTE + ..\\Drivers\\GD32F30x_usbd_library\\device\\Source\\usbd_core.c 0x00000000 Number 0 usbd_core.o ABSOLUTE + ..\\Drivers\\GD32F30x_usbd_library\\device\\Source\\usbd_enum.c 0x00000000 Number 0 usbd_enum.o ABSOLUTE + ..\\Drivers\\GD32F30x_usbd_library\\device\\Source\\usbd_pwr.c 0x00000000 Number 0 usbd_pwr.o ABSOLUTE + ..\\Drivers\\GD32F30x_usbd_library\\device\\Source\\usbd_transc.c 0x00000000 Number 0 usbd_transc.o ABSOLUTE + ..\\Drivers\\GD32F30x_usbd_library\\usbd\\Source\\usbd_lld_core.c 0x00000000 Number 0 usbd_lld_core.o ABSOLUTE + ..\\Drivers\\GD32F30x_usbd_library\\usbd\\Source\\usbd_lld_int.c 0x00000000 Number 0 usbd_lld_int.o ABSOLUTE + ..\\Src\\custom_hid_itf.c 0x00000000 Number 0 custom_hid_itf.o ABSOLUTE + ..\\Src\\gd32f30x_it.c 0x00000000 Number 0 gd32f30x_it.o ABSOLUTE + ..\\Src\\gd32f30x_usbd_hw.c 0x00000000 Number 0 gd32f30x_usbd_hw.o ABSOLUTE + ..\\Src\\main.c 0x00000000 Number 0 main.o ABSOLUTE + ..\\Src\\system_gd32f30x.c 0x00000000 Number 0 system_gd32f30x.o ABSOLUTE + cdrcmple.s 0x00000000 Number 0 cdrcmple.o ABSOLUTE + dc.s 0x00000000 Number 0 dc.o ABSOLUTE + handlers.s 0x00000000 Number 0 handlers.o ABSOLUTE + init.s 0x00000000 Number 0 init.o ABSOLUTE + RESET 0x08000000 Section 304 startup_gd32f30x_hd.o(RESET) + .ARM.Collect$$$$00000000 0x08000130 Section 0 entry.o(.ARM.Collect$$$$00000000) + .ARM.Collect$$$$00000001 0x08000130 Section 4 entry2.o(.ARM.Collect$$$$00000001) + .ARM.Collect$$$$00000004 0x08000134 Section 4 entry5.o(.ARM.Collect$$$$00000004) + .ARM.Collect$$$$00000008 0x08000138 Section 0 entry7b.o(.ARM.Collect$$$$00000008) + .ARM.Collect$$$$0000000A 0x08000138 Section 0 entry8b.o(.ARM.Collect$$$$0000000A) + .ARM.Collect$$$$0000000B 0x08000138 Section 8 entry9a.o(.ARM.Collect$$$$0000000B) + .ARM.Collect$$$$0000000E 0x08000140 Section 4 entry12b.o(.ARM.Collect$$$$0000000E) + .ARM.Collect$$$$0000000F 0x08000144 Section 0 entry10a.o(.ARM.Collect$$$$0000000F) + .ARM.Collect$$$$00000011 0x08000144 Section 0 entry11a.o(.ARM.Collect$$$$00000011) + .ARM.Collect$$$$00002712 0x08000144 Section 4 entry2.o(.ARM.Collect$$$$00002712) + __lit__00000000 0x08000144 Data 4 entry2.o(.ARM.Collect$$$$00002712) + .text 0x08000148 Section 36 startup_gd32f30x_hd.o(.text) + $v0 0x08000148 Number 0 startup_gd32f30x_hd.o(.text) + .text 0x0800016c Section 0 rand.o(.text) + .text 0x08000190 Section 0 memmovea.o(.text) + .text 0x080001d0 Section 0 memseta.o(.text) + .text 0x080001f4 Section 0 memcmp.o(.text) + .text 0x0800020e Section 0 strcpy.o(.text) + .text 0x08000220 Section 36 init.o(.text) + .text 0x08000244 Section 0 __dczerorl2.o(.text) + i.AES_Decrypt 0x0800029c Section 0 aes.o(i.AES_Decrypt) + i.AES_ECB_Decrypt_Append 0x080002e0 Section 0 crypto.o(i.AES_ECB_Decrypt_Append) + i.AES_ECB_Decrypt_Finish 0x0800039a Section 0 crypto.o(i.AES_ECB_Decrypt_Finish) + i.AES_ECB_Decrypt_Init 0x080003b4 Section 0 crypto.o(i.AES_ECB_Decrypt_Init) + i.AES_ECB_Encrypt_Append 0x080003bc Section 0 crypto.o(i.AES_ECB_Encrypt_Append) + i.AES_ECB_Encrypt_Finish 0x08000476 Section 0 crypto.o(i.AES_ECB_Encrypt_Finish) + i.AES_ECB_Encrypt_Init 0x08000490 Section 0 crypto.o(i.AES_ECB_Encrypt_Init) + i.AES_Encrypt 0x08000498 Section 0 aes.o(i.AES_Encrypt) + i.AES_general_SW_dec 0x080004dc Section 0 crypto.o(i.AES_general_SW_dec) + i.AES_general_SW_enc 0x080007f8 Section 0 crypto.o(i.AES_general_SW_enc) + i.AES_keyschedule_dec 0x08000b1c Section 0 crypto.o(i.AES_keyschedule_dec) + i.AES_keyschedule_enc_LL 0x08000c74 Section 0 crypto.o(i.AES_keyschedule_enc_LL) + AES_keyschedule_enc_LL 0x08000c75 Thumb Code 470 crypto.o(i.AES_keyschedule_enc_LL) + i.AESstdInit 0x08000e50 Section 0 crypto.o(i.AESstdInit) + AESstdInit 0x08000e51 Thumb Code 326 crypto.o(i.AESstdInit) + i.AddRoundKey 0x08000f98 Section 0 aes.o(i.AddRoundKey) + i.Beep 0x08000fd8 Section 0 buzzer.o(i.Beep) + Beep 0x08000fd9 Thumb Code 2 buzzer.o(i.Beep) + i.BusFault_Handler 0x08000fda Section 0 gd32f30x_it.o(i.BusFault_Handler) + i.CLI 0x08000fde Section 0 platform.o(i.CLI) + i.Cipher 0x08000fe4 Section 0 aes.o(i.Cipher) + i.CmdXch 0x08001078 Section 0 function_aes.o(i.CmdXch) + CmdXch 0x08001079 Thumb Code 66 function_aes.o(i.CmdXch) + i.DebugMon_Handler 0x080010c0 Section 0 gd32f30x_it.o(i.DebugMon_Handler) + i.Decrypt 0x080010c4 Section 0 function_aes.o(i.Decrypt) + Decrypt 0x080010c5 Thumb Code 62 function_aes.o(i.Decrypt) + i.DelayUs 0x08001108 Section 0 rf24l01 - multi.o(i.DelayUs) + DelayUs 0x08001109 Thumb Code 12 rf24l01 - multi.o(i.DelayUs) + i.EE_ReadBytes 0x08001114 Section 0 i2c.o(i.EE_ReadBytes) + i.EE_WriteBytes 0x0800115c Section 0 i2c.o(i.EE_WriteBytes) + i.EXTI0_IRQHandler 0x080011d8 Section 0 gd32f30x_it.o(i.EXTI0_IRQHandler) + i.EXTI10_15_IRQHandler 0x08001208 Section 0 gd32f30x_it.o(i.EXTI10_15_IRQHandler) + i.Encrypt 0x08001240 Section 0 function_aes.o(i.Encrypt) + Encrypt 0x08001241 Thumb Code 62 function_aes.o(i.Encrypt) + i.GPIO_Init 0x08001284 Section 0 main.o(i.GPIO_Init) + i.HW_GD_CUSTOM_HID_REPORT_SEND 0x08001314 Section 0 hw_mcuio.o(i.HW_GD_CUSTOM_HID_REPORT_SEND) + i.HW_GD_Delay 0x0800132c Section 0 hw_mcuio.o(i.HW_GD_Delay) + i.HW_GD_GPIO_Init 0x08001346 Section 0 hw_mcuio.o(i.HW_GD_GPIO_Init) + i.HW_GD_GPIO_TogglePin 0x0800135a Section 0 hw_mcuio.o(i.HW_GD_GPIO_TogglePin) + i.HW_GD_GetTick 0x08001380 Section 0 hw_mcuio.o(i.HW_GD_GetTick) + i.HW_GD_IncTick 0x0800138c Section 0 hw_mcuio.o(i.HW_GD_IncTick) + i.HW_GD_SPI0_Init 0x0800139c Section 0 hw_mcuio.o(i.HW_GD_SPI0_Init) + i.HW_GD_SPI0_TransmitReceive 0x08001408 Section 0 hw_mcuio.o(i.HW_GD_SPI0_TransmitReceive) + i.HW_GD_SPI_TransmitReceiveOneByte 0x08001440 Section 0 hw_mcuio.o(i.HW_GD_SPI_TransmitReceiveOneByte) + i.HardFault_Handler 0x080014a0 Section 0 gd32f30x_it.o(i.HardFault_Handler) + i.InvCipher 0x080014a4 Section 0 aes.o(i.InvCipher) + i.InvMixColumns 0x08001538 Section 0 aes.o(i.InvMixColumns) + i.InvShiftRows 0x08001760 Section 0 aes.o(i.InvShiftRows) + i.InvSubBytes 0x080017a0 Section 0 aes.o(i.InvSubBytes) + i.KeyExpansion 0x080017d4 Section 0 aes.o(i.KeyExpansion) + i.MemManage_Handler 0x08001930 Section 0 gd32f30x_it.o(i.MemManage_Handler) + i.MixColumns 0x08001934 Section 0 aes.o(i.MixColumns) + i.Msg_TickHandler 0x08001a18 Section 0 fucntion_text_message.o(i.Msg_TickHandler) + i.NMI_Handler 0x08001a48 Section 0 gd32f30x_it.o(i.NMI_Handler) + i.NRF24L01_Clear_IRQ_Flag 0x08001a4c Section 0 rf24l01 - multi.o(i.NRF24L01_Clear_IRQ_Flag) + NRF24L01_Clear_IRQ_Flag 0x08001a4d Thumb Code 78 rf24l01 - multi.o(i.NRF24L01_Clear_IRQ_Flag) + i.NRF24L01_Flush_Rx_Fifo 0x08001aa4 Section 0 rf24l01 - multi.o(i.NRF24L01_Flush_Rx_Fifo) + NRF24L01_Flush_Rx_Fifo 0x08001aa5 Thumb Code 46 rf24l01 - multi.o(i.NRF24L01_Flush_Rx_Fifo) + i.NRF24L01_Flush_Tx_Fifo 0x08001adc Section 0 rf24l01 - multi.o(i.NRF24L01_Flush_Tx_Fifo) + NRF24L01_Flush_Tx_Fifo 0x08001add Thumb Code 46 rf24l01 - multi.o(i.NRF24L01_Flush_Tx_Fifo) + i.NRF24L01_Read_Buf 0x08001b14 Section 0 rf24l01 - multi.o(i.NRF24L01_Read_Buf) + i.NRF24L01_Read_Reg 0x08001b60 Section 0 rf24l01 - multi.o(i.NRF24L01_Read_Reg) + NRF24L01_Read_Reg 0x08001b61 Thumb Code 60 rf24l01 - multi.o(i.NRF24L01_Read_Reg) + i.NRF24L01_Read_Status_Register 0x08001ba4 Section 0 rf24l01 - multi.o(i.NRF24L01_Read_Status_Register) + NRF24L01_Read_Status_Register 0x08001ba5 Thumb Code 50 rf24l01 - multi.o(i.NRF24L01_Read_Status_Register) + i.NRF24L01_SetPA 0x08001be0 Section 0 rf24l01 - multi.o(i.NRF24L01_SetPA) + NRF24L01_SetPA 0x08001be1 Thumb Code 36 rf24l01 - multi.o(i.NRF24L01_SetPA) + i.NRF24L01_Set_RxAddr 0x08001c04 Section 0 rf24l01 - multi.o(i.NRF24L01_Set_RxAddr) + NRF24L01_Set_RxAddr 0x08001c05 Thumb Code 56 rf24l01 - multi.o(i.NRF24L01_Set_RxAddr) + i.NRF24L01_Set_Speed 0x08001c3c Section 0 rf24l01 - multi.o(i.NRF24L01_Set_Speed) + NRF24L01_Set_Speed 0x08001c3d Thumb Code 60 rf24l01 - multi.o(i.NRF24L01_Set_Speed) + i.NRF24L01_Set_TxAddr 0x08001c78 Section 0 rf24l01 - multi.o(i.NRF24L01_Set_TxAddr) + NRF24L01_Set_TxAddr 0x08001c79 Thumb Code 34 rf24l01 - multi.o(i.NRF24L01_Set_TxAddr) + i.NRF24L01_Write_Buf 0x08001c9c Section 0 rf24l01 - multi.o(i.NRF24L01_Write_Buf) + NRF24L01_Write_Buf 0x08001c9d Thumb Code 70 rf24l01 - multi.o(i.NRF24L01_Write_Buf) + i.NRF24L01_Write_Reg 0x08001cec Section 0 rf24l01 - multi.o(i.NRF24L01_Write_Reg) + NRF24L01_Write_Reg 0x08001ced Thumb Code 76 rf24l01 - multi.o(i.NRF24L01_Write_Reg) + i.NRF24L01_Write_Tx_Payload_NoAck 0x08001d48 Section 0 rf24l01 - multi.o(i.NRF24L01_Write_Tx_Payload_NoAck) + NRF24L01_Write_Tx_Payload_NoAck 0x08001d49 Thumb Code 76 rf24l01 - multi.o(i.NRF24L01_Write_Tx_Payload_NoAck) + i.NRF24L01_check 0x08001d9c Section 0 rf24l01 - multi.o(i.NRF24L01_check) + i.NVIC_SystemReset 0x08001df0 Section 0 platform.o(i.NVIC_SystemReset) + NVIC_SystemReset 0x08001df1 Thumb Code 30 platform.o(i.NVIC_SystemReset) + i.PendSV_Handler 0x08001e18 Section 0 gd32f30x_it.o(i.PendSV_Handler) + i.RF24L01_Chan 0x08001e1a Section 0 rf24l01 - multi.o(i.RF24L01_Chan) + RF24L01_Chan 0x08001e1b Thumb Code 20 rf24l01 - multi.o(i.RF24L01_Chan) + i.RF24L01_RxOn 0x08001e30 Section 0 rf24l01 - multi.o(i.RF24L01_RxOn) + RF24L01_RxOn 0x08001e31 Thumb Code 46 rf24l01 - multi.o(i.RF24L01_RxOn) + i.RF24L01_Set_Mode 0x08001e68 Section 0 rf24l01 - multi.o(i.RF24L01_Set_Mode) + RF24L01_Set_Mode 0x08001e69 Thumb Code 46 rf24l01 - multi.o(i.RF24L01_Set_Mode) + i.RandData 0x08001e98 Section 0 function_network.o(i.RandData) + i.SEGGER_RTT_Read 0x08001f0c Section 0 segger_rtt.o(i.SEGGER_RTT_Read) + i.SEGGER_RTT_ReadNoLock 0x08001f44 Section 0 segger_rtt.o(i.SEGGER_RTT_ReadNoLock) + i.SEGGER_RTT_Write 0x08001fdc Section 0 segger_rtt.o(i.SEGGER_RTT_Write) + i.SEGGER_RTT_WriteNoLock 0x08002024 Section 0 segger_rtt.o(i.SEGGER_RTT_WriteNoLock) + i.SEGGER_RTT_printf 0x080020a8 Section 0 segger_rtt_printf.o(i.SEGGER_RTT_printf) + i.SEGGER_RTT_vprintf 0x080020ca Section 0 segger_rtt_printf.o(i.SEGGER_RTT_vprintf) + i.SEI 0x080022d4 Section 0 platform.o(i.SEI) + i.SET_SDA_IN 0x080022d8 Section 0 i2c.o(i.SET_SDA_IN) + i.SET_SDA_OUT 0x08002308 Section 0 i2c.o(i.SET_SDA_OUT) + i.STM32_AES_ECB_Decrypt 0x08002338 Section 0 aes.o(i.STM32_AES_ECB_Decrypt) + i.STM32_AES_ECB_Encrypt 0x080023ac Section 0 aes.o(i.STM32_AES_ECB_Encrypt) + i.SVC_Handler 0x08002420 Section 0 gd32f30x_it.o(i.SVC_Handler) + i.ShiftRows 0x08002424 Section 0 aes.o(i.ShiftRows) + i.SubBytes 0x08002468 Section 0 aes.o(i.SubBytes) + i.SysTick_Handler 0x0800249c Section 0 gd32f30x_it.o(i.SysTick_Handler) + i.SystemInit 0x080024a4 Section 0 system_gd32f30x.o(i.SystemInit) + i.TIMER1_IRQHandler 0x08002514 Section 0 gd32f30x_it.o(i.TIMER1_IRQHandler) + i.TIMER1_Init 0x08002538 Section 0 main.o(i.TIMER1_Init) + i.TIMER2_IRQHandler 0x080025bc Section 0 gd32f30x_it.o(i.TIMER2_IRQHandler) + i.TIMER2_Init 0x080025e0 Section 0 main.o(i.TIMER2_Init) + i.TIMER3_IRQHandler 0x08002664 Section 0 gd32f30x_it.o(i.TIMER3_IRQHandler) + i.USBD_LP_CAN0_RX0_IRQHandler 0x0800267a Section 0 gd32f30x_it.o(i.USBD_LP_CAN0_RX0_IRQHandler) + i.Upgrade_BeaconQuery 0x08002684 Section 0 transparentupgrade.o(i.Upgrade_BeaconQuery) + i.Upgrade_CRC 0x08002748 Section 0 transparentupgrade.o(i.Upgrade_CRC) + i.Upgrade_CheckNextPackArrive 0x08002760 Section 0 transparentupgrade.o(i.Upgrade_CheckNextPackArrive) + i.Upgrade_ClrBit 0x08002788 Section 0 transparentupgrade.o(i.Upgrade_ClrBit) + i.Upgrade_DelayUs 0x080027b0 Section 0 transparentupgrade.o(i.Upgrade_DelayUs) + i.Upgrade_GetBit 0x080027bc Section 0 transparentupgrade.o(i.Upgrade_GetBit) + i.Upgrade_ParameterInit 0x080027ec Section 0 transparentupgrade.o(i.Upgrade_ParameterInit) + i.Upgrade_PassThrough_CheckHead 0x08002828 Section 0 transparentupgrade.o(i.Upgrade_PassThrough_CheckHead) + i.Upgrade_RfSendCallBack 0x080028b4 Section 0 transparentupgrade.o(i.Upgrade_RfSendCallBack) + i.Upgrade_SendBeacon 0x080029a4 Section 0 transparentupgrade.o(i.Upgrade_SendBeacon) + i.Upgrade_SendPassThroughPack 0x08002a8c Section 0 transparentupgrade.o(i.Upgrade_SendPassThroughPack) + i.Upgrade_Start 0x08002b70 Section 0 transparentupgrade.o(i.Upgrade_Start) + i.Upgrade_StartGetNextPack 0x08002ba4 Section 0 transparentupgrade.o(i.Upgrade_StartGetNextPack) + i.Upgrade_TickHandler 0x08002bc0 Section 0 transparentupgrade.o(i.Upgrade_TickHandler) + i.Upgrade_TxPayload 0x08002eb0 Section 0 transparentupgrade.o(i.Upgrade_TxPayload) + i.Upgrade_WaitRfSendOK 0x08002edc Section 0 transparentupgrade.o(i.Upgrade_WaitRfSendOK) + i.UsageFault_Handler 0x08002efe Section 0 gd32f30x_it.o(i.UsageFault_Handler) + i._0x60_basic_delay_ms 0x08002f02 Section 0 base_process_pc_cmd_0x60.o(i._0x60_basic_delay_ms) + i._0x61_AUX_CONFIG_sub 0x08002f24 Section 0 base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) + _0x61_AUX_CONFIG_sub 0x08002f25 Thumb Code 718 base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub) + i._0x61_soft_dog_sub 0x08003218 Section 0 base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) + i._24R1_delay_us 0x08003388 Section 0 rf24l01 - multi.o(i._24R1_delay_us) + _24R1_delay_us 0x08003389 Thumb Code 30 rf24l01 - multi.o(i._24R1_delay_us) + i._DoInit 0x080033a8 Section 0 segger_rtt.o(i._DoInit) + _DoInit 0x080033a9 Thumb Code 74 segger_rtt.o(i._DoInit) + i._GetAvailWriteSpace 0x08003418 Section 0 segger_rtt.o(i._GetAvailWriteSpace) + _GetAvailWriteSpace 0x08003419 Thumb Code 28 segger_rtt.o(i._GetAvailWriteSpace) + i._PrintInt 0x08003434 Section 0 segger_rtt_printf.o(i._PrintInt) + _PrintInt 0x08003435 Thumb Code 236 segger_rtt_printf.o(i._PrintInt) + i._PrintUnsigned 0x08003520 Section 0 segger_rtt_printf.o(i._PrintUnsigned) + _PrintUnsigned 0x08003521 Thumb Code 230 segger_rtt_printf.o(i._PrintUnsigned) + i._StoreChar 0x0800360c Section 0 segger_rtt_printf.o(i._StoreChar) + _StoreChar 0x0800360d Thumb Code 68 segger_rtt_printf.o(i._StoreChar) + i._WriteBlocking 0x08003650 Section 0 segger_rtt.o(i._WriteBlocking) + _WriteBlocking 0x08003651 Thumb Code 114 segger_rtt.o(i._WriteBlocking) + i._WriteNoCheck 0x080036c2 Section 0 segger_rtt.o(i._WriteNoCheck) + _WriteNoCheck 0x080036c3 Thumb Code 76 segger_rtt.o(i._WriteNoCheck) + i.__scatterload_copy 0x0800370e Section 14 handlers.o(i.__scatterload_copy) + i.__scatterload_null 0x0800371c Section 2 handlers.o(i.__scatterload_null) + i.__scatterload_zeroinit 0x0800371e Section 14 handlers.o(i.__scatterload_zeroinit) + i._dbg_function__response_pc_cmd 0x0800372c Section 0 function_debug.o(i._dbg_function__response_pc_cmd) + _dbg_function__response_pc_cmd 0x0800372d Thumb Code 102 function_debug.o(i._dbg_function__response_pc_cmd) + i._debug_core__RTT_read 0x08003798 Section 0 base_core.o(i._debug_core__RTT_read) + i._debug_core__init 0x080037fc Section 0 base_core.o(i._debug_core__init) + i._debug_core__init_parameter_datapos_change 0x08003800 Section 0 base_core.o(i._debug_core__init_parameter_datapos_change) + i._debug_core__printf 0x08003880 Section 0 base_core.o(i._debug_core__printf) + i._debug_core__record_ackkp_info 0x080039cc Section 0 base_core.o(i._debug_core__record_ackkp_info) + i._debug_core__record_pcack_info 0x080039f8 Section 0 base_core.o(i._debug_core__record_pcack_info) + i._debug_core__record_rxkp_info 0x080039fc Section 0 base_core.o(i._debug_core__record_rxkp_info) + i._debug_core__record_txpc_info 0x08003a44 Section 0 base_core.o(i._debug_core__record_txpc_info) + i._debug_core__record_txpc_info_report 0x08003a46 Section 0 base_core.o(i._debug_core__record_txpc_info_report) + i._debug_function_enter 0x08003a48 Section 0 function_debug.o(i._debug_function_enter) + i._debug_set_subject 0x08003a78 Section 0 base_core.o(i._debug_set_subject) + i._usb_bos_desc_get 0x08003a90 Section 0 usbd_enum.o(i._usb_bos_desc_get) + _usb_bos_desc_get 0x08003a91 Thumb Code 48 usbd_enum.o(i._usb_bos_desc_get) + i._usb_config_desc_get 0x08003ac0 Section 0 usbd_enum.o(i._usb_config_desc_get) + _usb_config_desc_get 0x08003ac1 Thumb Code 32 usbd_enum.o(i._usb_config_desc_get) + i._usb_dev_desc_get 0x08003ae0 Section 0 usbd_enum.o(i._usb_dev_desc_get) + _usb_dev_desc_get 0x08003ae1 Thumb Code 20 usbd_enum.o(i._usb_dev_desc_get) + i._usb_in0_transc 0x08003af4 Section 0 usbd_transc.o(i._usb_in0_transc) + i._usb_out0_transc 0x08003b46 Section 0 usbd_transc.o(i._usb_out0_transc) + i._usb_setup_transc 0x08003b8a Section 0 usbd_transc.o(i._usb_setup_transc) + i._usb_std_clearfeature 0x08003c32 Section 0 usbd_enum.o(i._usb_std_clearfeature) + _usb_std_clearfeature 0x08003c33 Thumb Code 124 usbd_enum.o(i._usb_std_clearfeature) + i._usb_std_getconfiguration 0x08003cae Section 0 usbd_enum.o(i._usb_std_getconfiguration) + _usb_std_getconfiguration 0x08003caf Thumb Code 60 usbd_enum.o(i._usb_std_getconfiguration) + i._usb_std_getdescriptor 0x08003cec Section 0 usbd_enum.o(i._usb_std_getdescriptor) + _usb_std_getdescriptor 0x08003ced Thumb Code 268 usbd_enum.o(i._usb_std_getdescriptor) + i._usb_std_getinterface 0x08003dfc Section 0 usbd_enum.o(i._usb_std_getinterface) + _usb_std_getinterface 0x08003dfd Thumb Code 62 usbd_enum.o(i._usb_std_getinterface) + i._usb_std_getstatus 0x08003e3c Section 0 usbd_enum.o(i._usb_std_getstatus) + _usb_std_getstatus 0x08003e3d Thumb Code 194 usbd_enum.o(i._usb_std_getstatus) + i._usb_std_reserved 0x08003f04 Section 0 usbd_enum.o(i._usb_std_reserved) + _usb_std_reserved 0x08003f05 Thumb Code 6 usbd_enum.o(i._usb_std_reserved) + i._usb_std_setaddress 0x08003f0a Section 0 usbd_enum.o(i._usb_std_setaddress) + _usb_std_setaddress 0x08003f0b Thumb Code 46 usbd_enum.o(i._usb_std_setaddress) + i._usb_std_setconfiguration 0x08003f38 Section 0 usbd_enum.o(i._usb_std_setconfiguration) + _usb_std_setconfiguration 0x08003f39 Thumb Code 160 usbd_enum.o(i._usb_std_setconfiguration) + i._usb_std_setdescriptor 0x08003fdc Section 0 usbd_enum.o(i._usb_std_setdescriptor) + _usb_std_setdescriptor 0x08003fdd Thumb Code 6 usbd_enum.o(i._usb_std_setdescriptor) + i._usb_std_setfeature 0x08003fe2 Section 0 usbd_enum.o(i._usb_std_setfeature) + _usb_std_setfeature 0x08003fe3 Thumb Code 112 usbd_enum.o(i._usb_std_setfeature) + i._usb_std_setinterface 0x08004052 Section 0 usbd_enum.o(i._usb_std_setinterface) + _usb_std_setinterface 0x08004053 Thumb Code 48 usbd_enum.o(i._usb_std_setinterface) + i._usb_std_synchframe 0x08004082 Section 0 usbd_enum.o(i._usb_std_synchframe) + _usb_std_synchframe 0x08004083 Thumb Code 6 usbd_enum.o(i._usb_std_synchframe) + i._usb_str_desc_get 0x08004088 Section 0 usbd_enum.o(i._usb_str_desc_get) + _usb_str_desc_get 0x08004089 Thumb Code 20 usbd_enum.o(i._usb_str_desc_get) + i.aes_init 0x0800409c Section 0 function_aes.o(i.aes_init) + i.aes_keycode_upgrade 0x080040d0 Section 0 function_aes.o(i.aes_keycode_upgrade) + i.aes_load_fastmatch_data 0x08004128 Section 0 function_aes.o(i.aes_load_fastmatch_data) + i.aes_test 0x08004194 Section 0 function_aes.o(i.aes_test) + aes_test 0x08004195 Thumb Code 116 function_aes.o(i.aes_test) + i.ant_sw 0x08004208 Section 0 platform.o(i.ant_sw) + i.assert_base_channel 0x0800423c Section 0 base_process_tx_keypad.o(i.assert_base_channel) + i.assert_base_id 0x080042ac Section 0 base_process_pc_enter.o(i.assert_base_id) + i.assert_base_log_mode 0x080042d0 Section 0 base_process_pc_enter.o(i.assert_base_log_mode) + i.auth_all_keypad 0x08004320 Section 0 function_whitelist.o(i.auth_all_keypad) + i.auth_special_keypad 0x0800434c Section 0 function_whitelist.o(i.auth_special_keypad) + i.auto_search_freq_enter 0x0800437c Section 0 function_monitor_freq.o(i.auto_search_freq_enter) + i.base_broadcast_process_2ms5 0x080043a0 Section 0 function_broadcast.o(i.base_broadcast_process_2ms5) + i.base_broadcast_sub 0x0800441c Section 0 function_broadcast.o(i.base_broadcast_sub) + base_broadcast_sub 0x0800441d Thumb Code 170 function_broadcast.o(i.base_broadcast_sub) + i.base_confirm_keypad_crs2_mode 0x080044d0 Section 0 base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) + base_confirm_keypad_crs2_mode 0x080044d1 Thumb Code 564 base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode) + i.base_confirm_keypad_id_mode 0x08004714 Section 0 base_process_tx_keypad.o(i.base_confirm_keypad_id_mode) + base_confirm_keypad_id_mode 0x08004715 Thumb Code 174 base_process_tx_keypad.o(i.base_confirm_keypad_id_mode) + i.base_confirm_keypad_sn_mode 0x080047cc Section 0 base_process_tx_keypad.o(i.base_confirm_keypad_sn_mode) + base_confirm_keypad_sn_mode 0x080047cd Thumb Code 270 base_process_tx_keypad.o(i.base_confirm_keypad_sn_mode) + i.base_confirm_keypad_whitelist_request 0x080048e4 Section 0 function_whitelist.o(i.base_confirm_keypad_whitelist_request) + i.base_core_20ms_isr 0x0800494c Section 0 base_timer.o(i.base_core_20ms_isr) + i.base_core_28ms_isr 0x080049d0 Section 0 base_timer.o(i.base_core_28ms_isr) + i.base_core_2ms5_isr 0x080049d2 Section 0 base_timer.o(i.base_core_2ms5_isr) + i.base_core_force_sysmode0 0x080049e0 Section 0 base_core.o(i.base_core_force_sysmode0) + i.base_core_init_all 0x08004a08 Section 0 base_core.o(i.base_core_init_all) + i.base_core_main_loop 0x08004a24 Section 0 base_core.o(i.base_core_main_loop) + i.base_is_auto_match 0x08004a50 Section 0 function_aes.o(i.base_is_auto_match) + i.base_process_keyapad_init 0x08004a74 Section 0 base_process_rx_keypad.o(i.base_process_keyapad_init) + i.base_process_pc_data 0x08004a8a Section 0 base_process_pc_enter.o(i.base_process_pc_data) + i.base_process_pc_init 0x08004aec Section 0 base_process_pc_enter.o(i.base_process_pc_init) + i.base_read_e2prom 0x08004af8 Section 0 function_e2prom.o(i.base_read_e2prom) + i.base_read_e2prom_parameter 0x08004b34 Section 0 function_e2prom.o(i.base_read_e2prom_parameter) + i.base_send_beacon_switch 0x08004e4c Section 0 base_process_tx_keypad.o(i.base_send_beacon_switch) + i.base_tx_basic_beacon 0x08004e58 Section 0 base_process_tx_keypad.o(i.base_tx_basic_beacon) + base_tx_basic_beacon 0x08004e59 Thumb Code 402 base_process_tx_keypad.o(i.base_tx_basic_beacon) + i.base_tx_ext_basic_beacon 0x08005010 Section 0 base_process_tx_keypad.o(i.base_tx_ext_basic_beacon) + base_tx_ext_basic_beacon 0x08005011 Thumb Code 86 base_process_tx_keypad.o(i.base_tx_ext_basic_beacon) + i.base_tx_ext_vbeacon 0x08005078 Section 0 base_process_tx_keypad.o(i.base_tx_ext_vbeacon) + base_tx_ext_vbeacon 0x08005079 Thumb Code 100 base_process_tx_keypad.o(i.base_tx_ext_vbeacon) + i.base_tx_keypad_beacon 0x080050ec Section 0 base_process_tx_keypad.o(i.base_tx_keypad_beacon) + i.base_tx_to_keypad_sub 0x080052c4 Section 0 base_process_tx_keypad.o(i.base_tx_to_keypad_sub) + i.base_tx_to_pc_sub 0x08005330 Section 0 base_process_pc_enter.o(i.base_tx_to_pc_sub) + i.base_tx_vote_beacon 0x08005384 Section 0 base_process_tx_keypad.o(i.base_tx_vote_beacon) + base_tx_vote_beacon 0x08005385 Thumb Code 548 base_process_tx_keypad.o(i.base_tx_vote_beacon) + i.base_write_e2prom 0x080055c4 Section 0 function_e2prom.o(i.base_write_e2prom) + i.basetest_get_status 0x080055f8 Section 0 fucntion_base_test.o(i.basetest_get_status) + i.basetest_init 0x0800560c Section 0 fucntion_base_test.o(i.basetest_init) + i.basetest_progress 0x08005628 Section 0 fucntion_base_test.o(i.basetest_progress) + i.basetest_rx_and_ack_pc 0x08005728 Section 0 fucntion_base_test.o(i.basetest_rx_and_ack_pc) + i.basic_delay_ms 0x08005780 Section 0 platform.o(i.basic_delay_ms) + i.basic_delay_us 0x080057a0 Section 0 platform.o(i.basic_delay_us) + i.basic_delay_us_update 0x080057be Section 0 transparentupgrade.o(i.basic_delay_us_update) + i.beep_ctrl 0x080057d8 Section 0 buzzer.o(i.beep_ctrl) + i.broadcast_config 0x080057ec Section 0 function_broadcast.o(i.broadcast_config) + i.calc_custom_rf_sync_code 0x080058f8 Section 0 function_e2prom.o(i.calc_custom_rf_sync_code) + i.calc_next_multi_chan 0x0800592c Section 0 multi_channel.o(i.calc_next_multi_chan) + calc_next_multi_chan 0x0800592d Thumb Code 28 multi_channel.o(i.calc_next_multi_chan) + i.calc_valid_list_cnt 0x0800594c Section 0 function_whitelist.o(i.calc_valid_list_cnt) + calc_valid_list_cnt 0x0800594d Thumb Code 58 function_whitelist.o(i.calc_valid_list_cnt) + i.check_disturb 0x08005988 Section 0 function_monitor_freq.o(i.check_disturb) + check_disturb 0x08005989 Thumb Code 52 function_monitor_freq.o(i.check_disturb) + i.check_fastmatch_lowerPA 0x080059c0 Section 0 fucntion_fastmatch.o(i.check_fastmatch_lowerPA) + i.check_send_ext_basic_beacon 0x080059d8 Section 0 base_process_tx_keypad.o(i.check_send_ext_basic_beacon) + check_send_ext_basic_beacon 0x080059d9 Thumb Code 42 base_process_tx_keypad.o(i.check_send_ext_basic_beacon) + i.check_send_ext_vbeacon 0x08005a08 Section 0 base_process_tx_keypad.o(i.check_send_ext_vbeacon) + check_send_ext_vbeacon 0x08005a09 Thumb Code 148 base_process_tx_keypad.o(i.check_send_ext_vbeacon) + i.conver_id 0x08005aac Section 0 multi_channel.o(i.conver_id) + i.core_debug_enter 0x08005ad4 Section 0 debug.o(i.core_debug_enter) + i.crc16 0x08005ad8 Section 0 common_math.o(i.crc16) + i.custom_hid_data_in 0x08005b2c Section 0 custom_hid_core.o(i.custom_hid_data_in) + custom_hid_data_in 0x08005b2d Thumb Code 2 custom_hid_core.o(i.custom_hid_data_in) + i.custom_hid_data_out 0x08005b30 Section 0 custom_hid_core.o(i.custom_hid_data_out) + custom_hid_data_out 0x08005b31 Thumb Code 66 custom_hid_core.o(i.custom_hid_data_out) + i.custom_hid_deinit 0x08005b78 Section 0 custom_hid_core.o(i.custom_hid_deinit) + custom_hid_deinit 0x08005b79 Thumb Code 26 custom_hid_core.o(i.custom_hid_deinit) + i.custom_hid_init 0x08005b94 Section 0 custom_hid_core.o(i.custom_hid_init) + custom_hid_init 0x08005b95 Thumb Code 118 custom_hid_core.o(i.custom_hid_init) + i.custom_hid_itfop_register 0x08005c18 Section 0 custom_hid_core.o(i.custom_hid_itfop_register) + i.custom_hid_report_send 0x08005c28 Section 0 custom_hid_core.o(i.custom_hid_report_send) + i.custom_hid_req_handler 0x08005c40 Section 0 custom_hid_core.o(i.custom_hid_req_handler) + custom_hid_req_handler 0x08005c41 Thumb Code 234 custom_hid_core.o(i.custom_hid_req_handler) + i.debug_check_allerr 0x08005d34 Section 0 base_core.o(i.debug_check_allerr) + i.debug_set_buf_bit 0x08005da0 Section 0 base_core.o(i.debug_set_buf_bit) + i.decrypt 0x08005dbc Section 0 aes.o(i.decrypt) + i.det_blank_content 0x08005e48 Section 0 function_broadcast.o(i.det_blank_content) + i.doule_ant_application 0x08005e80 Section 0 base_process_tx_keypad.o(i.doule_ant_application) + doule_ant_application 0x08005e81 Thumb Code 50 base_process_tx_keypad.o(i.doule_ant_application) + i.drv_spi_read_write_byte 0x08005ebc Section 0 rf24l01 - multi.o(i.drv_spi_read_write_byte) + drv_spi_read_write_byte 0x08005ebd Thumb Code 30 rf24l01 - multi.o(i.drv_spi_read_write_byte) + i.drv_spi_read_write_byte_N 0x08005eda Section 0 rf24l01 - multi.o(i.drv_spi_read_write_byte_N) + drv_spi_read_write_byte_N 0x08005edb Thumb Code 36 rf24l01 - multi.o(i.drv_spi_read_write_byte_N) + i.e2prom_write_delay_ms 0x08005efe Section 0 multi_channel.o(i.e2prom_write_delay_ms) + e2prom_write_delay_ms 0x08005eff Thumb Code 32 multi_channel.o(i.e2prom_write_delay_ms) + i.encrypt 0x08005f20 Section 0 aes.o(i.encrypt) + i.exti_interrupt_flag_clear 0x08005fa8 Section 0 gd32f30x_exti.o(i.exti_interrupt_flag_clear) + i.exti_interrupt_flag_get 0x08005fb4 Section 0 gd32f30x_exti.o(i.exti_interrupt_flag_get) + i.fastmatch_enter_exit 0x08005fd8 Section 0 fucntion_fastmatch.o(i.fastmatch_enter_exit) + i.fastmatch_load_info_to_vote_beacon 0x08006050 Section 0 fucntion_fastmatch.o(i.fastmatch_load_info_to_vote_beacon) + i.fastmatch_lowerPA_ack 0x0800610c Section 0 fucntion_fastmatch.o(i.fastmatch_lowerPA_ack) + i.fastmatch_lowerPA_ack_sub 0x0800612c Section 0 fucntion_fastmatch.o(i.fastmatch_lowerPA_ack_sub) + fastmatch_lowerPA_ack_sub 0x0800612d Thumb Code 66 fucntion_fastmatch.o(i.fastmatch_lowerPA_ack_sub) + i.fastmatch_lowerPA_setup 0x08006174 Section 0 fucntion_fastmatch.o(i.fastmatch_lowerPA_setup) + i.fastmatch_status 0x08006180 Section 0 fucntion_fastmatch.o(i.fastmatch_status) + i.fastmatch_success_check 0x0800618c Section 0 fucntion_fastmatch.o(i.fastmatch_success_check) + i.free 0x080061c8 Section 0 malloc.o(i.free) + i.generate_default_key0_code 0x08006218 Section 0 function_aes.o(i.generate_default_key0_code) + generate_default_key0_code 0x08006219 Thumb Code 88 function_aes.o(i.generate_default_key0_code) + i.getSBoxValue 0x0800627c Section 0 aes.o(i.getSBoxValue) + i.get_aes_key 0x08006288 Section 0 function_aes.o(i.get_aes_key) + i.get_aes_status 0x0800629c Section 0 function_aes.o(i.get_aes_status) + i.get_base_id 0x080062b8 Section 0 base_process_pc_enter.o(i.get_base_id) + i.get_base_log_mode 0x080062c4 Section 0 base_process_pc_enter.o(i.get_base_log_mode) + i.get_base_main_rfchannel 0x080062d0 Section 0 multi_channel.o(i.get_base_main_rfchannel) + i.get_base_match_code 0x080062dc Section 0 base_process_pc_enter.o(i.get_base_match_code) + i.get_base_send_beacon_status 0x08006318 Section 0 base_process_tx_keypad.o(i.get_base_send_beacon_status) + i.get_base_status 0x08006324 Section 0 base_core.o(i.get_base_status) + i.get_core_version 0x0800638c Section 0 base_core.o(i.get_core_version) + get_core_version 0x0800638d Thumb Code 14 base_core.o(i.get_core_version) + i.get_datapos 0x0800639c Section 0 base_core.o(i.get_datapos) + i.get_error_info 0x080063a8 Section 0 multi_channel.o(i.get_error_info) + get_error_info 0x080063a9 Thumb Code 56 multi_channel.o(i.get_error_info) + i.get_ext_basicbeacon_startup_flag 0x080063e8 Section 0 base_process_tx_keypad.o(i.get_ext_basicbeacon_startup_flag) + i.get_mainRF_usr_id 0x080063f4 Section 0 multi_channel.o(i.get_mainRF_usr_id) + i.get_main_rf_hard_id 0x080063f8 Section 0 multi_channel.o(i.get_main_rf_hard_id) + i.get_offset 0x08006404 Section 0 function_whitelist.o(i.get_offset) + get_offset 0x08006405 Thumb Code 10 function_whitelist.o(i.get_offset) + i.get_packing_parameter 0x08006410 Section 0 vote__report.o(i.get_packing_parameter) + i.get_pc_connect_status 0x080064c0 Section 0 base_core.o(i.get_pc_connect_status) + i.get_pc_connect_status_acc 0x080064cc Section 0 base_core.o(i.get_pc_connect_status_acc) + i.get_permit_dispaly_status 0x080064d8 Section 0 base_core.o(i.get_permit_dispaly_status) + i.get_stm32_chip_id 0x080064ec Section 0 platform.o(i.get_stm32_chip_id) + i.get_tx_ok_flag 0x08006520 Section 0 rf24l01 - multi.o(i.get_tx_ok_flag) + i.get_usb_status 0x0800652c Section 0 platform.o(i.get_usb_status) + i.get_whitelist_rfid 0x08006544 Section 0 multi_channel.o(i.get_whitelist_rfid) + i.gpio_bit_reset 0x08006554 Section 0 gd32f30x_gpio.o(i.gpio_bit_reset) + i.gpio_bit_set 0x08006558 Section 0 gd32f30x_gpio.o(i.gpio_bit_set) + i.gpio_config 0x0800655c Section 0 gd32f30x_usbd_hw.o(i.gpio_config) + i.gpio_init 0x08006574 Section 0 gd32f30x_gpio.o(i.gpio_init) + i.gpio_input_bit_get 0x08006630 Section 0 gd32f30x_gpio.o(i.gpio_input_bit_get) + i.i2c_delay 0x08006640 Section 0 i2c.o(i.i2c_delay) + i2c_delay 0x08006641 Thumb Code 14 i2c.o(i.i2c_delay) + i.i2c_read_byte 0x08006650 Section 0 i2c.o(i.i2c_read_byte) + i.i2c_send_byte 0x080066d4 Section 0 i2c.o(i.i2c_send_byte) + i.i2c_start 0x08006794 Section 0 i2c.o(i.i2c_start) + i.i2c_stop 0x080067dc Section 0 i2c.o(i.i2c_stop) + i.int_to_unicode 0x08006824 Section 0 usbd_enum.o(i.int_to_unicode) + int_to_unicode 0x08006825 Thumb Code 62 usbd_enum.o(i.int_to_unicode) + i.key_config 0x08006862 Section 0 custom_hid_itf.o(i.key_config) + key_config 0x08006863 Thumb Code 2 custom_hid_itf.o(i.key_config) + i.keypad_crc_check 0x08006864 Section 0 base_process_tx_keypad.o(i.keypad_crc_check) + i.keypad_crs2_mode 0x08006890 Section 0 base_process_rx_keypad.o(i.keypad_crs2_mode) + i.keypad_id_mode 0x080069c8 Section 0 base_process_rx_keypad.o(i.keypad_id_mode) + i.keypad_idsn_clear 0x08006b20 Section 0 base_process_tx_keypad.o(i.keypad_idsn_clear) + i.keypad_idsn_record_whitelist_request 0x08006b74 Section 0 function_whitelist.o(i.keypad_idsn_record_whitelist_request) + i.keypad_idsn_save 0x08006ba0 Section 0 base_process_tx_keypad.o(i.keypad_idsn_save) + i.keypad_rf_data_process_NO_fifo 0x08006ca0 Section 0 base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) + i.keypad_rf_data_save 0x08006eb8 Section 0 base_process_rx_keypad.o(i.keypad_rf_data_save) + i.keypad_sn_mode 0x08006ec8 Section 0 base_process_rx_keypad.o(i.keypad_sn_mode) + i.keypad_transfer2pc_data_fetch 0x08006f2c Section 0 transfer_keypad_pc.o(i.keypad_transfer2pc_data_fetch) + i.keypad_transfer2pc_data_save 0x08006f70 Section 0 transfer_keypad_pc.o(i.keypad_transfer2pc_data_save) + i.kprx_init_queue 0x08006f88 Section 0 base_process_rx_keypad.o(i.kprx_init_queue) + i.led1_control 0x08006fa0 Section 0 led.o(i.led1_control) + i.led2_control 0x08006fd0 Section 0 led.o(i.led2_control) + i.led_config 0x08007000 Section 0 custom_hid_itf.o(i.led_config) + led_config 0x08007001 Thumb Code 2 custom_hid_itf.o(i.led_config) + i.log_debug 0x08007002 Section 0 transparentupgrade.o(i.log_debug) + i.main 0x08007004 Section 0 main.o(i.main) + i.malloc 0x0800707c Section 0 malloc.o(i.malloc) + i.mem_compare 0x080070e8 Section 0 common_math.o(i.mem_compare) + i.mem_cpy 0x0800710a Section 0 common_math.o(i.mem_cpy) + i.mem_set 0x08007120 Section 0 common_math.o(i.mem_set) + i.monitor_freq_ack_pc 0x08007134 Section 0 function_monitor_freq.o(i.monitor_freq_ack_pc) + monitor_freq_ack_pc 0x08007135 Thumb Code 74 function_monitor_freq.o(i.monitor_freq_ack_pc) + i.monitor_freq_process 0x08007184 Section 0 function_monitor_freq.o(i.monitor_freq_process) + i.monitor_rf_data 0x08007280 Section 0 function_monitor_freq.o(i.monitor_rf_data) + i.msg_delay_us 0x080072f4 Section 0 fucntion_text_message.o(i.msg_delay_us) + i.msg_get_pc_data 0x08007300 Section 0 fucntion_text_message.o(i.msg_get_pc_data) + i.msg_issendtime 0x0800744c Section 0 fucntion_text_message.o(i.msg_issendtime) + i.msg_polling 0x080074b8 Section 0 fucntion_text_message.o(i.msg_polling) + i.msg_recover_beacon_countdown 0x08007510 Section 0 fucntion_text_message.o(i.msg_recover_beacon_countdown) + i.msg_send 0x08007540 Section 0 fucntion_text_message.o(i.msg_send) + i.msg_set_status 0x080075f8 Section 0 fucntion_text_message.o(i.msg_set_status) + i.msg_tx_payload 0x08007604 Section 0 fucntion_text_message.o(i.msg_tx_payload) + i.msg_wait_rfsendOK 0x08007630 Section 0 fucntion_text_message.o(i.msg_wait_rfsendOK) + i.multi_chan_init 0x08007654 Section 0 multi_channel.o(i.multi_chan_init) + i.multi_chan_polling 0x08007744 Section 0 multi_channel.o(i.multi_chan_polling) + i.network_creat_random_delay 0x080077d0 Section 0 function_network.o(i.network_creat_random_delay) + network_creat_random_delay 0x080077d1 Thumb Code 16 function_network.o(i.network_creat_random_delay) + i.network_get_name 0x080077e4 Section 0 function_network.o(i.network_get_name) + i.network_get_nameview 0x08007804 Section 0 function_network.o(i.network_get_nameview) + i.network_get_netseq 0x08007810 Section 0 function_network.o(i.network_get_netseq) + i.network_get_pwd 0x0800781c Section 0 function_network.o(i.network_get_pwd) + i.network_polling 0x08007828 Section 0 function_network.o(i.network_polling) + i.network_randtime 0x08007880 Section 0 function_network.o(i.network_randtime) + i.network_set_name 0x080078cc Section 0 function_network.o(i.network_set_name) + i.network_set_nameview 0x080078ec Section 0 function_network.o(i.network_set_nameview) + i.network_set_netseq_change 0x08007904 Section 0 function_network.o(i.network_set_netseq_change) + i.network_set_pwd 0x08007914 Section 0 function_network.o(i.network_set_pwd) + i.network_tx_beacon 0x08007920 Section 0 function_network.o(i.network_tx_beacon) + i.nvic_config 0x08007a7c Section 0 gd32f30x_usbd_hw.o(i.nvic_config) + i.nvic_irq_enable 0x08007a9c Section 0 gd32f30x_misc.o(i.nvic_irq_enable) + i.nvic_priority_group_set 0x08007b60 Section 0 gd32f30x_misc.o(i.nvic_priority_group_set) + i.pc_cmd_0x60_ack 0x08007b74 Section 0 base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_ack) + i.pc_cmd_0x60_process 0x08007bb4 Section 0 base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) + i.pc_cmd_0x61_ack 0x08007d9c Section 0 base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_ack) + i.pc_cmd_0x61_process 0x08007ddc Section 0 base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) + i.pc_transfer2keypad_data_fetch 0x08007fd8 Section 0 transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) + i.pc_transfer2keypad_data_save 0x08008074 Section 0 transfer_keypad_pc.o(i.pc_transfer2keypad_data_save) + i.pcrx_data_fetch 0x080080a0 Section 0 base_process_pc_enter.o(i.pcrx_data_fetch) + pcrx_data_fetch 0x080080a1 Thumb Code 22 base_process_pc_enter.o(i.pcrx_data_fetch) + i.pcrx_data_save 0x080080bc Section 0 base_process_pc_enter.o(i.pcrx_data_save) + i.pcrx_init_queue 0x080080d4 Section 0 base_process_pc_enter.o(i.pcrx_init_queue) + i.process_keypad_broadcast_requst 0x080080ec Section 0 function_broadcast.o(i.process_keypad_broadcast_requst) + i.process_pc_aes_config 0x08008130 Section 0 function_aes.o(i.process_pc_aes_config) + i.process_setup_multi_chan 0x08008190 Section 0 multi_channel.o(i.process_setup_multi_chan) + i.process_setup_single_chan 0x080081c4 Section 0 multi_channel.o(i.process_setup_single_chan) + i.queue_in 0x080081fc Section 0 queue_circle.o(i.queue_in) + i.queue_init 0x08008258 Section 0 queue_circle.o(i.queue_init) + i.queue_out 0x08008268 Section 0 queue_circle.o(i.queue_out) + i.queue_out_get_type 0x080082c0 Section 0 queue_circle.o(i.queue_out_get_type) + i.queue_out_special 0x080082f4 Section 0 queue_circle.o(i.queue_out_special) + i.rcu_clock_freq_get 0x08008360 Section 0 gd32f30x_rcu.o(i.rcu_clock_freq_get) + i.rcu_config 0x080084bc Section 0 gd32f30x_usbd_hw.o(i.rcu_config) + i.rcu_periph_clock_enable 0x08008574 Section 0 gd32f30x_rcu.o(i.rcu_periph_clock_enable) + i.rcu_usb_clock_config 0x08008594 Section 0 gd32f30x_rcu.o(i.rcu_usb_clock_config) + i.read_AES_config 0x080085ac Section 0 function_aes.o(i.read_AES_config) + read_AES_config 0x080085ad Thumb Code 48 function_aes.o(i.read_AES_config) + i.read_keycode 0x080085e4 Section 0 function_aes.o(i.read_keycode) + read_keycode 0x080085e5 Thumb Code 138 function_aes.o(i.read_keycode) + i.refresh_pc_connect_status 0x08008678 Section 0 base_core.o(i.refresh_pc_connect_status) + i.refresh_rcvRF_indicate 0x080086a0 Section 0 base_core.o(i.refresh_rcvRF_indicate) + i.rf_Decrypt 0x080086c8 Section 0 function_aes.o(i.rf_Decrypt) + i.rf_Encrypt 0x08008804 Section 0 function_aes.o(i.rf_Encrypt) + i.rf_SendPacket 0x08008928 Section 0 rf24l01 - multi.o(i.rf_SendPacket) + i.rf_error_ack_pc 0x080089ec Section 0 multi_channel.o(i.rf_error_ack_pc) + rf_error_ack_pc 0x080089ed Thumb Code 68 multi_channel.o(i.rf_error_ack_pc) + i.rf_error_warning 0x08008a34 Section 0 multi_channel.o(i.rf_error_warning) + i.rf_initial 0x08008a88 Section 0 rf24l01 - multi.o(i.rf_initial) + i.rf_modual__check 0x08008b30 Section 0 multi_channel.o(i.rf_modual__check) + i.rf_modual__tx_counter 0x08008b34 Section 0 multi_channel.o(i.rf_modual__tx_counter) + i.rf_set_PA_Mode 0x08008b50 Section 0 rf24l01 - multi.o(i.rf_set_PA_Mode) + i.rf_set_syncode 0x08008ba0 Section 0 rf24l01 - multi.o(i.rf_set_syncode) + i.rf_setfreq 0x08008bdc Section 0 rf24l01 - multi.o(i.rf_setfreq) + i.save_keypad_ack_data 0x08008bfc Section 0 transparentupgrade.o(i.save_keypad_ack_data) + i.search_special_list 0x08008c1c Section 0 function_whitelist.o(i.search_special_list) + i.send_to_keypad_user_hardID 0x08008c54 Section 0 base_process_tx_keypad.o(i.send_to_keypad_user_hardID) + i.serial_string_get 0x08008cb4 Section 0 usbd_enum.o(i.serial_string_get) + i.set_base_hard_firmware_info 0x08008d04 Section 0 base_core.o(i.set_base_hard_firmware_info) + i.set_ext_basicbeacon_startup_flag 0x08008d40 Section 0 base_process_tx_keypad.o(i.set_ext_basicbeacon_startup_flag) + i.set_keypad_crc_config 0x08008d4c Section 0 base_process_tx_keypad.o(i.set_keypad_crc_config) + i.set_pc_communication_type 0x08008d90 Section 0 platform.o(i.set_pc_communication_type) + i.set_tx_ok_flag 0x08008db8 Section 0 rf24l01 - multi.o(i.set_tx_ok_flag) + i.setup_multi_info 0x08008dc4 Section 0 multi_channel.o(i.setup_multi_info) + setup_multi_info 0x08008dc5 Thumb Code 90 multi_channel.o(i.setup_multi_info) + i.single_relevant_to_multi_chan 0x08008e2c Section 0 multi_channel.o(i.single_relevant_to_multi_chan) + i.spi_enable 0x08008e5c Section 0 gd32f30x_spi.o(i.spi_enable) + i.spi_i2s_data_receive 0x08008e66 Section 0 gd32f30x_spi.o(i.spi_i2s_data_receive) + i.spi_i2s_data_transmit 0x08008e6e Section 0 gd32f30x_spi.o(i.spi_i2s_data_transmit) + i.spi_i2s_flag_get 0x08008e72 Section 0 gd32f30x_spi.o(i.spi_i2s_flag_get) + i.spi_init 0x08008e82 Section 0 gd32f30x_spi.o(i.spi_init) + i.startup_broadcast 0x08008eb4 Section 0 function_broadcast.o(i.startup_broadcast) + i.system_clock_120m_hxtal 0x08008efc Section 0 system_gd32f30x.o(i.system_clock_120m_hxtal) + system_clock_120m_hxtal 0x08008efd Thumb Code 256 system_gd32f30x.o(i.system_clock_120m_hxtal) + i.system_clock_config 0x08009008 Section 0 system_gd32f30x.o(i.system_clock_config) + system_clock_config 0x08009009 Thumb Code 8 system_gd32f30x.o(i.system_clock_config) + i.timer_20ms_function 0x08009010 Section 0 base_core.o(i.timer_20ms_function) + i.timer_autoreload_value_config 0x080090a8 Section 0 gd32f30x_timer.o(i.timer_autoreload_value_config) + i.timer_counter_read 0x080090ac Section 0 gd32f30x_timer.o(i.timer_counter_read) + i.timer_counter_value_config 0x080090b4 Section 0 gd32f30x_timer.o(i.timer_counter_value_config) + i.timer_enable 0x080090b8 Section 0 gd32f30x_timer.o(i.timer_enable) + i.timer_init 0x080090c4 Section 0 gd32f30x_timer.o(i.timer_init) + i.timer_interrupt_disable 0x0800915c Section 0 gd32f30x_timer.o(i.timer_interrupt_disable) + i.timer_interrupt_enable 0x08009164 Section 0 gd32f30x_timer.o(i.timer_interrupt_enable) + i.timer_interrupt_flag_clear 0x0800916c Section 0 gd32f30x_timer.o(i.timer_interrupt_flag_clear) + i.timer_interrupt_flag_get 0x08009172 Section 0 gd32f30x_timer.o(i.timer_interrupt_flag_get) + i.timer_prescaler_config 0x0800918a Section 0 gd32f30x_timer.o(i.timer_prescaler_config) + i.transfer2kp_init_queue 0x08009198 Section 0 transfer_keypad_pc.o(i.transfer2kp_init_queue) + i.transfer2pc_init_queue 0x080091b0 Section 0 transfer_keypad_pc.o(i.transfer2pc_init_queue) + i.uart1_send_datas 0x080091c8 Section 0 platform.o(i.uart1_send_datas) + i.updat__exit 0x080091cc Section 0 transparentupgrade.o(i.updat__exit) + i.update_2_timer 0x08009204 Section 0 transparentupgrade.o(i.update_2_timer) + i.update_get_status 0x08009228 Section 0 transparentupgrade.o(i.update_get_status) + i.update_kp_enter 0x0800922c Section 0 transparentupgrade.o(i.update_kp_enter) + i.update_kp_progress 0x08009318 Section 0 transparentupgrade.o(i.update_kp_progress) + i.update_monitor_sdk_connect 0x0800931a Section 0 transparentupgrade.o(i.update_monitor_sdk_connect) + i.update_request_pkt_to_pc 0x0800931c Section 0 transparentupgrade.o(i.update_request_pkt_to_pc) + update_request_pkt_to_pc 0x0800931d Thumb Code 64 transparentupgrade.o(i.update_request_pkt_to_pc) + i.usb_ctl_out 0x08009360 Section 0 usbd_transc.o(i.usb_ctl_out) + usb_ctl_out 0x08009361 Thumb Code 18 usbd_transc.o(i.usb_ctl_out) + i.usb_ctl_status_in 0x08009372 Section 0 usbd_transc.o(i.usb_ctl_status_in) + usb_ctl_status_in 0x08009373 Thumb Code 20 usbd_transc.o(i.usb_ctl_status_in) + i.usb_stall_transc 0x08009386 Section 0 usbd_transc.o(i.usb_stall_transc) + usb_stall_transc 0x08009387 Thumb Code 22 usbd_transc.o(i.usb_stall_transc) + i.usb_transc_config 0x0800939c Section 0 usbd_core.o(i.usb_transc_config) + usb_transc_config 0x0800939d Thumb Code 8 usbd_core.o(i.usb_transc_config) + i.usb_transc_config 0x080093a4 Section 0 usbd_enum.o(i.usb_transc_config) + usb_transc_config 0x080093a5 Thumb Code 8 usbd_enum.o(i.usb_transc_config) + i.usb_transc_config 0x080093ac Section 0 custom_hid_core.o(i.usb_transc_config) + usb_transc_config 0x080093ad Thumb Code 8 custom_hid_core.o(i.usb_transc_config) + i.usbd_address_set 0x080093b4 Section 0 usbd_lld_core.o(i.usbd_address_set) + usbd_address_set 0x080093b5 Thumb Code 12 usbd_lld_core.o(i.usbd_address_set) + i.usbd_class_request 0x080093c4 Section 0 usbd_enum.o(i.usbd_class_request) + i.usbd_core_reset 0x080093e8 Section 0 usbd_lld_core.o(i.usbd_core_reset) + usbd_core_reset 0x080093e9 Thumb Code 34 usbd_lld_core.o(i.usbd_core_reset) + i.usbd_core_stop 0x08009410 Section 0 usbd_lld_core.o(i.usbd_core_stop) + usbd_core_stop 0x08009411 Thumb Code 20 usbd_lld_core.o(i.usbd_core_stop) + i.usbd_dp_pullup 0x08009428 Section 0 usbd_lld_core.o(i.usbd_dp_pullup) + usbd_dp_pullup 0x08009429 Thumb Code 30 usbd_lld_core.o(i.usbd_dp_pullup) + i.usbd_ep_data_read 0x0800944c Section 0 usbd_lld_core.o(i.usbd_ep_data_read) + usbd_ep_data_read 0x0800944d Thumb Code 148 usbd_lld_core.o(i.usbd_ep_data_read) + i.usbd_ep_data_write 0x080094ec Section 0 usbd_lld_core.o(i.usbd_ep_data_write) + usbd_ep_data_write 0x080094ed Thumb Code 84 usbd_lld_core.o(i.usbd_ep_data_write) + i.usbd_ep_deinit 0x0800954c Section 0 custom_hid_core.o(i.usbd_ep_deinit) + usbd_ep_deinit 0x0800954d Thumb Code 20 custom_hid_core.o(i.usbd_ep_deinit) + i.usbd_ep_disable 0x08009560 Section 0 usbd_lld_core.o(i.usbd_ep_disable) + usbd_ep_disable 0x08009561 Thumb Code 178 usbd_lld_core.o(i.usbd_ep_disable) + i.usbd_ep_init 0x08009618 Section 0 custom_hid_core.o(i.usbd_ep_init) + usbd_ep_init 0x08009619 Thumb Code 34 custom_hid_core.o(i.usbd_ep_init) + i.usbd_ep_recev 0x0800963a Section 0 usbd_core.o(i.usbd_ep_recev) + i.usbd_ep_reset 0x08009674 Section 0 usbd_lld_core.o(i.usbd_ep_reset) + usbd_ep_reset 0x08009675 Thumb Code 142 usbd_lld_core.o(i.usbd_ep_reset) + i.usbd_ep_rx_enable 0x08009710 Section 0 usbd_lld_core.o(i.usbd_ep_rx_enable) + usbd_ep_rx_enable 0x08009711 Thumb Code 42 usbd_lld_core.o(i.usbd_ep_rx_enable) + i.usbd_ep_send 0x08009740 Section 0 usbd_core.o(i.usbd_ep_send) + i.usbd_ep_setup 0x08009790 Section 0 usbd_lld_core.o(i.usbd_ep_setup) + usbd_ep_setup 0x08009791 Thumb Code 620 usbd_lld_core.o(i.usbd_ep_setup) + i.usbd_ep_stall_clear 0x08009a08 Section 0 usbd_lld_core.o(i.usbd_ep_stall_clear) + usbd_ep_stall_clear 0x08009a09 Thumb Code 220 usbd_lld_core.o(i.usbd_ep_stall_clear) + i.usbd_ep_stall_set 0x08009ae8 Section 0 usbd_lld_core.o(i.usbd_ep_stall_set) + usbd_ep_stall_set 0x08009ae9 Thumb Code 160 usbd_lld_core.o(i.usbd_ep_stall_set) + i.usbd_ep_status 0x08009b90 Section 0 usbd_lld_core.o(i.usbd_ep_status) + usbd_ep_status 0x08009b91 Thumb Code 30 usbd_lld_core.o(i.usbd_ep_status) + i.usbd_init 0x08009bb4 Section 0 usbd_core.o(i.usbd_init) + i.usbd_int_suspend 0x08009c24 Section 0 usbd_lld_int.o(i.usbd_int_suspend) + usbd_int_suspend 0x08009c25 Thumb Code 36 usbd_lld_int.o(i.usbd_int_suspend) + i.usbd_isr 0x08009c48 Section 0 usbd_lld_int.o(i.usbd_isr) + i.usbd_leave_suspend 0x08009ec8 Section 0 usbd_lld_core.o(i.usbd_leave_suspend) + usbd_leave_suspend 0x08009ec9 Thumb Code 24 usbd_lld_core.o(i.usbd_leave_suspend) + i.usbd_resume 0x08009ee4 Section 0 usbd_lld_core.o(i.usbd_resume) + usbd_resume 0x08009ee5 Thumb Code 24 usbd_lld_core.o(i.usbd_resume) + i.usbd_standard_request 0x08009f04 Section 0 usbd_enum.o(i.usbd_standard_request) + i.usbd_suspend 0x08009f20 Section 0 usbd_lld_core.o(i.usbd_suspend) + usbd_suspend 0x08009f21 Thumb Code 14 usbd_lld_core.o(i.usbd_suspend) + i.usbd_vendor_request 0x08009f34 Section 0 usbd_enum.o(i.usbd_vendor_request) + i.user_20ms_timer 0x08009f3a Section 0 platform.o(i.user_20ms_timer) + i.user_2ms5_timer 0x08009f44 Section 0 platform.o(i.user_2ms5_timer) + i.user__keypad_transfer2pc 0x08009f68 Section 0 function.o(i.user__keypad_transfer2pc) + i.user__pc_0x60cmd 0x08009f6a Section 0 function.o(i.user__pc_0x60cmd) + i.user__pc_0x61cmd 0x08009f6c Section 0 function.o(i.user__pc_0x61cmd) + i.user__pc_0x61cmd_type0x0B 0x08009f6e Section 0 function.o(i.user__pc_0x61cmd_type0x0B) + i.user__pc_cmd_ack 0x08009f70 Section 0 function.o(i.user__pc_cmd_ack) + i.user__pc_transfer2keypad 0x08009fc0 Section 0 function.o(i.user__pc_transfer2keypad) + i.vote_data_packing 0x08009fc4 Section 0 vote__process.o(i.vote_data_packing) + i.vote_data_parameter_init 0x0800a264 Section 0 vote__report.o(i.vote_data_parameter_init) + i.vote_data_report_interval 0x0800a27c Section 0 vote__report.o(i.vote_data_report_interval) + i.vote_data_report_startup 0x0800a2a8 Section 0 vote__report.o(i.vote_data_report_startup) + i.vote_data_report_to_pc 0x0800a2c4 Section 0 vote__report.o(i.vote_data_report_to_pc) + i.vote_data_store 0x0800a2f8 Section 0 vote__process.o(i.vote_data_store) + i.vote_init_queue 0x0800a310 Section 0 vote__process.o(i.vote_init_queue) + i.vote_status_clear_confirmed 0x0800a328 Section 0 vote__process.o(i.vote_status_clear_confirmed) + i.vote_status_reset_NOconfirmed 0x0800a48c Section 0 vote__process.o(i.vote_status_reset_NOconfirmed) + i.whitelist__2ms5_call 0x0800a490 Section 0 function_whitelist.o(i.whitelist__2ms5_call) + i.whitelist__tx_authcode_to_keypad 0x0800a4f0 Section 0 function_whitelist.o(i.whitelist__tx_authcode_to_keypad) + i.whitelist_ack_pc 0x0800a5dc Section 0 function_whitelist.o(i.whitelist_ack_pc) + whitelist_ack_pc 0x0800a5dd Thumb Code 66 function_whitelist.o(i.whitelist_ack_pc) + i.whitelist_add 0x0800a624 Section 0 function_whitelist.o(i.whitelist_add) + whitelist_add 0x0800a625 Thumb Code 90 function_whitelist.o(i.whitelist_add) + i.whitelist_delete 0x0800a684 Section 0 function_whitelist.o(i.whitelist_delete) + whitelist_delete 0x0800a685 Thumb Code 86 function_whitelist.o(i.whitelist_delete) + i.whitelist_enter 0x0800a6e0 Section 0 function_whitelist.o(i.whitelist_enter) + i.whitelist_init 0x0800a78c Section 0 function_whitelist.o(i.whitelist_init) + i.whitelist_read_1zone 0x0800a7cc Section 0 function_whitelist.o(i.whitelist_read_1zone) + whitelist_read_1zone 0x0800a7cd Thumb Code 66 function_whitelist.o(i.whitelist_read_1zone) + i.whitelist_write_1zone 0x0800a814 Section 0 function_whitelist.o(i.whitelist_write_1zone) + whitelist_write_1zone 0x0800a815 Thumb Code 58 function_whitelist.o(i.whitelist_write_1zone) + i.write_keycode 0x0800a850 Section 0 function_aes.o(i.write_keycode) + write_keycode 0x0800a851 Thumb Code 122 function_aes.o(i.write_keycode) + i.write_list_sub 0x0800a8d4 Section 0 function_whitelist.o(i.write_list_sub) + write_list_sub 0x0800a8d5 Thumb Code 44 function_whitelist.o(i.write_list_sub) + .constdata 0x0800a908 Section 16 usbd_lld_core.o(.constdata) + ep_type 0x0800a908 Data 16 usbd_lld_core.o(.constdata) + .constdata 0x0800a918 Section 32 custom_hid_core.o(.constdata) + .constdata 0x0800a938 Section 100 rf24l01 - multi.o(.constdata) + .constdata 0x0800a99c Section 32 common_math.o(.constdata) + .constdata 0x0800a9bc Section 9 function_e2prom.o(.constdata) + .constdata 0x0800a9c5 Section 69 function_aes.o(.constdata) + .constdata 0x0800aa0c Section 4 function_broadcast.o(.constdata) + .constdata 0x0800aa10 Section 767 aes.o(.constdata) + .constdata 0x0800ad0f Section 16 segger_rtt_printf.o(.constdata) + _aV2C 0x0800ad0f Data 16 segger_rtt_printf.o(.constdata) + .constdata 0x0800ad20 Section 7012 crypto.o(.constdata) + table_reduction8 0x0800b74c Data 512 crypto.o(.constdata) + table_reduction4 0x0800b94c Data 32 crypto.o(.constdata) + sha512_K 0x0800c270 Data 640 crypto.o(.constdata) + tau 0x0800c500 Data 16 crypto.o(.constdata) + m 0x0800c510 Data 32 crypto.o(.constdata) + mu 0x0800c530 Data 36 crypto.o(.constdata) + ge25519_ecd 0x0800c554 Data 32 crypto.o(.constdata) + ge25519_ec2d 0x0800c5f4 Data 32 crypto.o(.constdata) + ge25519_sqrtm1 0x0800c614 Data 32 crypto.o(.constdata) + pad 0x0800c6a4 Data 64 crypto.o(.constdata) + .conststring 0x0800c884 Section 77 base_core.o(.conststring) + .data 0x20000000 Section 4 gd32f30x_it.o(.data) + .data 0x20000004 Section 16 custom_hid_itf.o(.data) + .data 0x20000014 Section 72 usbd_lld_core.o(.data) + .data 0x2000005c Section 4 usbd_core.o(.data) + .data 0x20000060 Section 67 usbd_enum.o(.data) + _std_dev_req 0x20000060 Data 52 usbd_enum.o(.data) + std_desc_get 0x20000094 Data 12 usbd_enum.o(.data) + status 0x200000a0 Data 2 usbd_enum.o(.data) + config 0x200000a2 Data 1 usbd_enum.o(.data) + .data 0x200000a4 Section 520 custom_hid_core.o(.data) + usbd_language_id_desc 0x200000df Data 4 custom_hid_core.o(.data) + manufacturer_string 0x200000e3 Data 130 custom_hid_core.o(.data) + product_string 0x20000165 Data 130 custom_hid_core.o(.data) + serial_string 0x200001e7 Data 130 custom_hid_core.o(.data) + .data 0x200002ac Section 128 platform.o(.data) + pc_tcpip_usb_com_type_flag 0x200002b3 Data 1 platform.o(.data) + hard_200s_ver3 0x200002b4 Data 1 platform.o(.data) + .data 0x2000032c Section 1 rf24l01 - multi.o(.data) + tx_ok_flag 0x2000032c Data 1 rf24l01 - multi.o(.data) + .data 0x20000330 Section 4 hw_mcuio.o(.data) + systick 0x20000330 Data 4 hw_mcuio.o(.data) + .data 0x20000334 Section 109 base_core.o(.data) + .data 0x200003a1 Section 1 base_process_pc_cmd_0x61.o(.data) + oem_code_check_rslt 0x200003a1 Data 1 base_process_pc_cmd_0x61.o(.data) + .data 0x200003a2 Section 37 base_process_pc_enter.o(.data) + .data 0x200003c8 Section 4 base_process_rx_keypad.o(.data) + .data 0x200003cc Section 6 base_process_tx_keypad.o(.data) + ext_basic_beacon_startup_flag 0x200003cc Data 1 base_process_tx_keypad.o(.data) + beacon_type 0x200003cd Data 1 base_process_tx_keypad.o(.data) + alternate 0x200003ce Data 1 base_process_tx_keypad.o(.data) + multi_ant_counter 0x200003cf Data 1 base_process_tx_keypad.o(.data) + alternate_flag 0x200003d0 Data 1 base_process_tx_keypad.o(.data) + cur_type 0x200003d1 Data 1 base_process_tx_keypad.o(.data) + .data 0x200003d2 Section 1 base_timer.o(.data) + _0s5_cnt 0x200003d2 Data 1 base_timer.o(.data) + .data 0x200003d4 Section 9 multi_channel.o(.data) + rf_error 0x200003d4 Data 8 multi_channel.o(.data) + switch_cycle_cnt 0x200003dc Data 1 multi_channel.o(.data) + .data 0x200003dd Section 2 vote__process.o(.data) + packet_count 0x200003dd Data 1 vote__process.o(.data) + .data 0x200003df Section 4 vote__report.o(.data) + rpt_vote 0x200003df Data 4 vote__report.o(.data) + .data 0x200003e4 Section 7 fucntion_base_test.o(.data) + cur_send_cnt 0x200003e4 Data 2 fucntion_base_test.o(.data) + cur_recv_cnt 0x200003e6 Data 2 fucntion_base_test.o(.data) + .data 0x200003ec Section 7 fucntion_fastmatch.o(.data) + chan_trigger 0x200003f2 Data 1 fucntion_fastmatch.o(.data) + .data 0x200003f4 Section 8 fucntion_text_message.o(.data) + .data 0x200003fc Section 280 function.o(.data) + .data 0x20000514 Section 1 function_aes.o(.data) + aes_pos 0x20000514 Data 1 function_aes.o(.data) + .data 0x20000515 Section 6 function_monitor_freq.o(.data) + .data 0x2000051c Section 32 function_network.o(.data) + .data 0x2000053c Section 6 function_whitelist.o(.data) + .data 0x20000544 Section 20 transparentupgrade.o(.data) + TickTimeOut 0x20000548 Data 4 transparentupgrade.o(.data) + temp 0x2000054c Data 1 transparentupgrade.o(.data) + H_Tick 0x2000054e Data 2 transparentupgrade.o(.data) + PassThroughStep 0x20000550 Data 1 transparentupgrade.o(.data) + CRC 0x20000552 Data 2 transparentupgrade.o(.data) + T_SN 0x20000554 Data 4 transparentupgrade.o(.data) + .data 0x20000558 Section 79 aes.o(.data) + Base64Encode 0x20000566 Data 65 aes.o(.data) + .data 0x200005a8 Section 4 rand.o(.data) + _rand_state 0x200005a8 Data 4 rand.o(.data) + .data 0x200005ac Section 4 mvars.o(.data) + .data 0x200005b0 Section 4 mvars.o(.data) + .bss 0x200005b4 Section 188 main.o(.bss) + .bss 0x20000670 Section 67 custom_hid_core.o(.bss) + hid_handler 0x20000670 Data 67 custom_hid_core.o(.bss) + .bss 0x200006b4 Section 4208 base_core.o(.bss) + .bss 0x20001724 Section 1292 base_process_pc_enter.o(.bss) + .bss 0x20001c30 Section 987 base_process_rx_keypad.o(.bss) + .bss 0x2000200c Section 76 base_process_tx_keypad.o(.bss) + .bss 0x20002058 Section 286 multi_channel.o(.bss) + .bss 0x20002178 Section 1304 transfer_keypad_pc.o(.bss) + .bss 0x20002690 Section 7149 vote__process.o(.bss) + vote_buf 0x2000269c Data 6400 vote__process.o(.bss) + .bss 0x2000427e Section 12 fucntion_base_test.o(.bss) + .bss 0x2000428c Section 2148 fucntion_text_message.o(.bss) + .bss 0x20004af0 Section 67 function_aes.o(.bss) + .bss 0x20004b33 Section 4117 function_broadcast.o(.bss) + .bss 0x20005b48 Section 928 function_whitelist.o(.bss) + .bss 0x20005ee8 Section 2244 transparentupgrade.o(.bss) + .bss 0x200067ac Section 396 aes.o(.bss) + .bss 0x20006938 Section 4280 segger_rtt.o(.bss) + _acUpBuffer 0x200069e0 Data 4096 segger_rtt.o(.bss) + _acDownBuffer 0x200079e0 Data 16 segger_rtt.o(.bss) + HEAP 0x200079f0 Section 1024 startup_gd32f30x_hd.o(HEAP) + STACK 0x20007df0 Section 4096 startup_gd32f30x_hd.o(STACK) + .ARM.__AT_0x40006000 0x40006000 Section 64 usbd_lld_core.o(.ARM.__AT_0x40006000) + btable_ep 0x40006000 Data 64 usbd_lld_core.o(.ARM.__AT_0x40006000) + + Global Symbols + + Symbol Name Value Ov Type Size Object(Section) + + BuildAttributes$$THM_ISAv4$E$P$D$K$B$S$7EM$VFPi3$EXTD16$VFPS$VFMA$PE$A:L22UL41UL21$X:L11$S22US41US21$IEEE1$IW$USESV6$~STKCKD$USESV7$~SHL$OTIME$ROPI$EBA8$MICROLIB$REQ8$PRES8$EABIv2 0x00000000 Number 0 anon$$obj.o ABSOLUTE + __ARM_use_no_argv 0x00000000 Number 0 main.o ABSOLUTE + _printf_a 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_c 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_charcount 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_d 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_e 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_f 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_flags 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_fp_dec 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_fp_hex 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_g 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_i 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_int_dec 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_l 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_lc 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_ll 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_lld 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_lli 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_llo 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_llu 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_llx 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_longlong_dec 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_longlong_hex 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_longlong_oct 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_ls 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_mbtowc 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_n 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_o 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_p 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_percent 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_pre_padding 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_return_value 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_s 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_sizespec 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_str 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_truncate_signed 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_truncate_unsigned 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_u 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_wc 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_wctomb 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_widthprec 0x00000000 Number 0 stubs.o ABSOLUTE + _printf_x 0x00000000 Number 0 stubs.o ABSOLUTE + __arm_fini_ - Undefined Weak Reference + __cpp_initialize__aeabi_ - Undefined Weak Reference + __cxa_finalize - Undefined Weak Reference + _clock_init - Undefined Weak Reference + _microlib_exit - Undefined Weak Reference + __Vectors_Size 0x00000130 Number 0 startup_gd32f30x_hd.o ABSOLUTE + __Vectors 0x08000000 Data 4 startup_gd32f30x_hd.o(RESET) + __Vectors_End 0x08000130 Data 0 startup_gd32f30x_hd.o(RESET) + __main 0x08000131 Thumb Code 0 entry.o(.ARM.Collect$$$$00000000) + _main_stk 0x08000131 Thumb Code 0 entry2.o(.ARM.Collect$$$$00000001) + _main_scatterload 0x08000135 Thumb Code 0 entry5.o(.ARM.Collect$$$$00000004) + __main_after_scatterload 0x08000139 Thumb Code 0 entry5.o(.ARM.Collect$$$$00000004) + _main_clock 0x08000139 Thumb Code 0 entry7b.o(.ARM.Collect$$$$00000008) + _main_cpp_init 0x08000139 Thumb Code 0 entry8b.o(.ARM.Collect$$$$0000000A) + _main_init 0x08000139 Thumb Code 0 entry9a.o(.ARM.Collect$$$$0000000B) + __rt_lib_shutdown_fini 0x08000141 Thumb Code 0 entry12b.o(.ARM.Collect$$$$0000000E) + __rt_final_cpp 0x08000145 Thumb Code 0 entry10a.o(.ARM.Collect$$$$0000000F) + __rt_final_exit 0x08000145 Thumb Code 0 entry11a.o(.ARM.Collect$$$$00000011) + Reset_Handler 0x08000149 Thumb Code 8 startup_gd32f30x_hd.o(.text) + ADC0_1_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + ADC2_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + CAN0_EWMC_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + CAN0_RX1_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + DMA0_Channel0_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + DMA0_Channel1_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + DMA0_Channel2_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + DMA0_Channel3_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + DMA0_Channel4_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + DMA0_Channel5_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + DMA0_Channel6_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + DMA1_Channel0_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + DMA1_Channel1_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + DMA1_Channel2_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + DMA1_Channel3_4_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + EXMC_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + EXTI1_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + EXTI2_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + EXTI3_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + EXTI4_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + EXTI5_9_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + FMC_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + I2C0_ER_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + I2C0_EV_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + I2C1_ER_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + I2C1_EV_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + LVD_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + RCU_CTC_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + RTC_Alarm_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + RTC_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + SDIO_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + SPI0_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + SPI1_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + SPI2_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TAMPER_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TIMER0_BRK_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TIMER0_Channel_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TIMER0_TRG_CMT_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TIMER0_UP_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TIMER4_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TIMER5_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TIMER6_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TIMER7_BRK_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TIMER7_Channel_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TIMER7_TRG_CMT_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + TIMER7_UP_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + UART3_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + UART4_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + USART0_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + USART1_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + USART2_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + USBD_HP_CAN0_TX_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + USBD_WKUP_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + WWDGT_IRQHandler 0x08000163 Thumb Code 0 startup_gd32f30x_hd.o(.text) + rand 0x0800016d Thumb Code 20 rand.o(.text) + srand 0x08000181 Thumb Code 6 rand.o(.text) + ___aeabi_memcpy8$move 0x08000191 Thumb Code 0 memmovea.o(.text) + __aeabi_memcpy 0x08000191 Thumb Code 64 memmovea.o(.text) + __aeabi_memcpy4 0x08000191 Thumb Code 0 memmovea.o(.text) + __aeabi_memmove 0x08000191 Thumb Code 0 memmovea.o(.text) + __aeabi_memmove4 0x08000191 Thumb Code 0 memmovea.o(.text) + __aeabi_memmove8 0x08000191 Thumb Code 0 memmovea.o(.text) + __aeabi_memset 0x080001d1 Thumb Code 14 memseta.o(.text) + __aeabi_memset4 0x080001d1 Thumb Code 0 memseta.o(.text) + __aeabi_memset8 0x080001d1 Thumb Code 0 memseta.o(.text) + __aeabi_memclr 0x080001df Thumb Code 4 memseta.o(.text) + __aeabi_memclr4 0x080001df Thumb Code 0 memseta.o(.text) + __aeabi_memclr8 0x080001df Thumb Code 0 memseta.o(.text) + _memset$wrapper 0x080001e3 Thumb Code 18 memseta.o(.text) + memcmp 0x080001f5 Thumb Code 26 memcmp.o(.text) + strcpy 0x0800020f Thumb Code 18 strcpy.o(.text) + __scatterload 0x08000221 Thumb Code 28 init.o(.text) + __scatterload_rt2 0x08000221 Thumb Code 0 init.o(.text) + __decompress 0x08000245 Thumb Code 0 __dczerorl2.o(.text) + __decompress1 0x08000245 Thumb Code 86 __dczerorl2.o(.text) + AES_Decrypt 0x0800029d Thumb Code 62 aes.o(i.AES_Decrypt) + AES_ECB_Decrypt_Append 0x080002e1 Thumb Code 186 crypto.o(i.AES_ECB_Decrypt_Append) + AES_ECB_Decrypt_Finish 0x0800039b Thumb Code 26 crypto.o(i.AES_ECB_Decrypt_Finish) + AES_ECB_Decrypt_Init 0x080003b5 Thumb Code 6 crypto.o(i.AES_ECB_Decrypt_Init) + AES_ECB_Encrypt_Append 0x080003bd Thumb Code 186 crypto.o(i.AES_ECB_Encrypt_Append) + AES_ECB_Encrypt_Finish 0x08000477 Thumb Code 26 crypto.o(i.AES_ECB_Encrypt_Finish) + AES_ECB_Encrypt_Init 0x08000491 Thumb Code 6 crypto.o(i.AES_ECB_Encrypt_Init) + AES_Encrypt 0x08000499 Thumb Code 62 aes.o(i.AES_Encrypt) + AES_general_SW_dec 0x080004dd Thumb Code 782 crypto.o(i.AES_general_SW_dec) + AES_general_SW_enc 0x080007f9 Thumb Code 792 crypto.o(i.AES_general_SW_enc) + AES_keyschedule_dec 0x08000b1d Thumb Code 340 crypto.o(i.AES_keyschedule_dec) + AddRoundKey 0x08000f99 Thumb Code 56 aes.o(i.AddRoundKey) + BusFault_Handler 0x08000fdb Thumb Code 4 gd32f30x_it.o(i.BusFault_Handler) + CLI 0x08000fdf Thumb Code 4 platform.o(i.CLI) + Cipher 0x08000fe5 Thumb Code 132 aes.o(i.Cipher) + DebugMon_Handler 0x080010c1 Thumb Code 2 gd32f30x_it.o(i.DebugMon_Handler) + EE_ReadBytes 0x08001115 Thumb Code 72 i2c.o(i.EE_ReadBytes) + EE_WriteBytes 0x0800115d Thumb Code 122 i2c.o(i.EE_WriteBytes) + EXTI0_IRQHandler 0x080011d9 Thumb Code 40 gd32f30x_it.o(i.EXTI0_IRQHandler) + EXTI10_15_IRQHandler 0x08001209 Thumb Code 46 gd32f30x_it.o(i.EXTI10_15_IRQHandler) + GPIO_Init 0x08001285 Thumb Code 132 main.o(i.GPIO_Init) + HW_GD_CUSTOM_HID_REPORT_SEND 0x08001315 Thumb Code 18 hw_mcuio.o(i.HW_GD_CUSTOM_HID_REPORT_SEND) + HW_GD_Delay 0x0800132d Thumb Code 26 hw_mcuio.o(i.HW_GD_Delay) + HW_GD_GPIO_Init 0x08001347 Thumb Code 20 hw_mcuio.o(i.HW_GD_GPIO_Init) + HW_GD_GPIO_TogglePin 0x0800135b Thumb Code 38 hw_mcuio.o(i.HW_GD_GPIO_TogglePin) + HW_GD_GetTick 0x08001381 Thumb Code 6 hw_mcuio.o(i.HW_GD_GetTick) + HW_GD_IncTick 0x0800138d Thumb Code 12 hw_mcuio.o(i.HW_GD_IncTick) + HW_GD_SPI0_Init 0x0800139d Thumb Code 100 hw_mcuio.o(i.HW_GD_SPI0_Init) + HW_GD_SPI0_TransmitReceive 0x08001409 Thumb Code 50 hw_mcuio.o(i.HW_GD_SPI0_TransmitReceive) + HW_GD_SPI_TransmitReceiveOneByte 0x08001441 Thumb Code 96 hw_mcuio.o(i.HW_GD_SPI_TransmitReceiveOneByte) + HardFault_Handler 0x080014a1 Thumb Code 4 gd32f30x_it.o(i.HardFault_Handler) + InvCipher 0x080014a5 Thumb Code 132 aes.o(i.InvCipher) + InvMixColumns 0x08001539 Thumb Code 546 aes.o(i.InvMixColumns) + InvShiftRows 0x08001761 Thumb Code 60 aes.o(i.InvShiftRows) + InvSubBytes 0x080017a1 Thumb Code 42 aes.o(i.InvSubBytes) + KeyExpansion 0x080017d5 Thumb Code 324 aes.o(i.KeyExpansion) + MemManage_Handler 0x08001931 Thumb Code 4 gd32f30x_it.o(i.MemManage_Handler) + MixColumns 0x08001935 Thumb Code 222 aes.o(i.MixColumns) + Msg_TickHandler 0x08001a19 Thumb Code 40 fucntion_text_message.o(i.Msg_TickHandler) + NMI_Handler 0x08001a49 Thumb Code 2 gd32f30x_it.o(i.NMI_Handler) + NRF24L01_Read_Buf 0x08001b15 Thumb Code 68 rf24l01 - multi.o(i.NRF24L01_Read_Buf) + NRF24L01_check 0x08001d9d Thumb Code 76 rf24l01 - multi.o(i.NRF24L01_check) + PendSV_Handler 0x08001e19 Thumb Code 2 gd32f30x_it.o(i.PendSV_Handler) + RandData 0x08001e99 Thumb Code 106 function_network.o(i.RandData) + SEGGER_RTT_Read 0x08001f0d Thumb Code 56 segger_rtt.o(i.SEGGER_RTT_Read) + SEGGER_RTT_ReadNoLock 0x08001f45 Thumb Code 148 segger_rtt.o(i.SEGGER_RTT_ReadNoLock) + SEGGER_RTT_Write 0x08001fdd Thumb Code 68 segger_rtt.o(i.SEGGER_RTT_Write) + SEGGER_RTT_WriteNoLock 0x08002025 Thumb Code 126 segger_rtt.o(i.SEGGER_RTT_WriteNoLock) + SEGGER_RTT_printf 0x080020a9 Thumb Code 34 segger_rtt_printf.o(i.SEGGER_RTT_printf) + SEGGER_RTT_vprintf 0x080020cb Thumb Code 522 segger_rtt_printf.o(i.SEGGER_RTT_vprintf) + SEI 0x080022d5 Thumb Code 4 platform.o(i.SEI) + SET_SDA_IN 0x080022d9 Thumb Code 42 i2c.o(i.SET_SDA_IN) + SET_SDA_OUT 0x08002309 Thumb Code 42 i2c.o(i.SET_SDA_OUT) + STM32_AES_ECB_Decrypt 0x08002339 Thumb Code 116 aes.o(i.STM32_AES_ECB_Decrypt) + STM32_AES_ECB_Encrypt 0x080023ad Thumb Code 116 aes.o(i.STM32_AES_ECB_Encrypt) + SVC_Handler 0x08002421 Thumb Code 2 gd32f30x_it.o(i.SVC_Handler) + ShiftRows 0x08002425 Thumb Code 64 aes.o(i.ShiftRows) + SubBytes 0x08002469 Thumb Code 42 aes.o(i.SubBytes) + SysTick_Handler 0x0800249d Thumb Code 8 gd32f30x_it.o(i.SysTick_Handler) + SystemInit 0x080024a5 Thumb Code 100 system_gd32f30x.o(i.SystemInit) + TIMER1_IRQHandler 0x08002515 Thumb Code 32 gd32f30x_it.o(i.TIMER1_IRQHandler) + TIMER1_Init 0x08002539 Thumb Code 130 main.o(i.TIMER1_Init) + TIMER2_IRQHandler 0x080025bd Thumb Code 32 gd32f30x_it.o(i.TIMER2_IRQHandler) + TIMER2_Init 0x080025e1 Thumb Code 126 main.o(i.TIMER2_Init) + TIMER3_IRQHandler 0x08002665 Thumb Code 22 gd32f30x_it.o(i.TIMER3_IRQHandler) + USBD_LP_CAN0_RX0_IRQHandler 0x0800267b Thumb Code 8 gd32f30x_it.o(i.USBD_LP_CAN0_RX0_IRQHandler) + Upgrade_BeaconQuery 0x08002685 Thumb Code 190 transparentupgrade.o(i.Upgrade_BeaconQuery) + Upgrade_CRC 0x08002749 Thumb Code 22 transparentupgrade.o(i.Upgrade_CRC) + Upgrade_CheckNextPackArrive 0x08002761 Thumb Code 34 transparentupgrade.o(i.Upgrade_CheckNextPackArrive) + Upgrade_ClrBit 0x08002789 Thumb Code 40 transparentupgrade.o(i.Upgrade_ClrBit) + Upgrade_DelayUs 0x080027b1 Thumb Code 12 transparentupgrade.o(i.Upgrade_DelayUs) + Upgrade_GetBit 0x080027bd Thumb Code 48 transparentupgrade.o(i.Upgrade_GetBit) + Upgrade_ParameterInit 0x080027ed Thumb Code 46 transparentupgrade.o(i.Upgrade_ParameterInit) + Upgrade_PassThrough_CheckHead 0x08002829 Thumb Code 134 transparentupgrade.o(i.Upgrade_PassThrough_CheckHead) + Upgrade_RfSendCallBack 0x080028b5 Thumb Code 214 transparentupgrade.o(i.Upgrade_RfSendCallBack) + Upgrade_SendBeacon 0x080029a5 Thumb Code 226 transparentupgrade.o(i.Upgrade_SendBeacon) + Upgrade_SendPassThroughPack 0x08002a8d Thumb Code 224 transparentupgrade.o(i.Upgrade_SendPassThroughPack) + Upgrade_Start 0x08002b71 Thumb Code 36 transparentupgrade.o(i.Upgrade_Start) + Upgrade_StartGetNextPack 0x08002ba5 Thumb Code 24 transparentupgrade.o(i.Upgrade_StartGetNextPack) + Upgrade_TickHandler 0x08002bc1 Thumb Code 702 transparentupgrade.o(i.Upgrade_TickHandler) + Upgrade_TxPayload 0x08002eb1 Thumb Code 36 transparentupgrade.o(i.Upgrade_TxPayload) + Upgrade_WaitRfSendOK 0x08002edd Thumb Code 34 transparentupgrade.o(i.Upgrade_WaitRfSendOK) + UsageFault_Handler 0x08002eff Thumb Code 4 gd32f30x_it.o(i.UsageFault_Handler) + _0x60_basic_delay_ms 0x08002f03 Thumb Code 32 base_process_pc_cmd_0x60.o(i._0x60_basic_delay_ms) + _0x61_soft_dog_sub 0x08003219 Thumb Code 358 base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub) + __scatterload_copy 0x0800370f Thumb Code 14 handlers.o(i.__scatterload_copy) + __scatterload_null 0x0800371d Thumb Code 2 handlers.o(i.__scatterload_null) + __scatterload_zeroinit 0x0800371f Thumb Code 14 handlers.o(i.__scatterload_zeroinit) + _debug_core__RTT_read 0x08003799 Thumb Code 66 base_core.o(i._debug_core__RTT_read) + _debug_core__init 0x080037fd Thumb Code 2 base_core.o(i._debug_core__init) + _debug_core__init_parameter_datapos_change 0x08003801 Thumb Code 102 base_core.o(i._debug_core__init_parameter_datapos_change) + _debug_core__printf 0x08003881 Thumb Code 166 base_core.o(i._debug_core__printf) + _debug_core__record_ackkp_info 0x080039cd Thumb Code 38 base_core.o(i._debug_core__record_ackkp_info) + _debug_core__record_pcack_info 0x080039f9 Thumb Code 2 base_core.o(i._debug_core__record_pcack_info) + _debug_core__record_rxkp_info 0x080039fd Thumb Code 64 base_core.o(i._debug_core__record_rxkp_info) + _debug_core__record_txpc_info 0x08003a45 Thumb Code 2 base_core.o(i._debug_core__record_txpc_info) + _debug_core__record_txpc_info_report 0x08003a47 Thumb Code 2 base_core.o(i._debug_core__record_txpc_info_report) + _debug_function_enter 0x08003a49 Thumb Code 44 function_debug.o(i._debug_function_enter) + _debug_set_subject 0x08003a79 Thumb Code 18 base_core.o(i._debug_set_subject) + _usb_in0_transc 0x08003af5 Thumb Code 82 usbd_transc.o(i._usb_in0_transc) + _usb_out0_transc 0x08003b47 Thumb Code 68 usbd_transc.o(i._usb_out0_transc) + _usb_setup_transc 0x08003b8b Thumb Code 168 usbd_transc.o(i._usb_setup_transc) + aes_init 0x0800409d Thumb Code 44 function_aes.o(i.aes_init) + aes_keycode_upgrade 0x080040d1 Thumb Code 76 function_aes.o(i.aes_keycode_upgrade) + aes_load_fastmatch_data 0x08004129 Thumb Code 92 function_aes.o(i.aes_load_fastmatch_data) + ant_sw 0x08004209 Thumb Code 42 platform.o(i.ant_sw) + assert_base_channel 0x0800423d Thumb Code 104 base_process_tx_keypad.o(i.assert_base_channel) + assert_base_id 0x080042ad Thumb Code 30 base_process_pc_enter.o(i.assert_base_id) + assert_base_log_mode 0x080042d1 Thumb Code 70 base_process_pc_enter.o(i.assert_base_log_mode) + auth_all_keypad 0x08004321 Thumb Code 34 function_whitelist.o(i.auth_all_keypad) + auth_special_keypad 0x0800434d Thumb Code 42 function_whitelist.o(i.auth_special_keypad) + auto_search_freq_enter 0x0800437d Thumb Code 28 function_monitor_freq.o(i.auto_search_freq_enter) + base_broadcast_process_2ms5 0x080043a1 Thumb Code 106 function_broadcast.o(i.base_broadcast_process_2ms5) + base_confirm_keypad_whitelist_request 0x080048e5 Thumb Code 90 function_whitelist.o(i.base_confirm_keypad_whitelist_request) + base_core_20ms_isr 0x0800494d Thumb Code 108 base_timer.o(i.base_core_20ms_isr) + base_core_28ms_isr 0x080049d1 Thumb Code 2 base_timer.o(i.base_core_28ms_isr) + base_core_2ms5_isr 0x080049d3 Thumb Code 12 base_timer.o(i.base_core_2ms5_isr) + base_core_force_sysmode0 0x080049e1 Thumb Code 30 base_core.o(i.base_core_force_sysmode0) + base_core_init_all 0x08004a09 Thumb Code 28 base_core.o(i.base_core_init_all) + base_core_main_loop 0x08004a25 Thumb Code 34 base_core.o(i.base_core_main_loop) + base_is_auto_match 0x08004a51 Thumb Code 30 function_aes.o(i.base_is_auto_match) + base_process_keyapad_init 0x08004a75 Thumb Code 22 base_process_rx_keypad.o(i.base_process_keyapad_init) + base_process_pc_data 0x08004a8b Thumb Code 98 base_process_pc_enter.o(i.base_process_pc_data) + base_process_pc_init 0x08004aed Thumb Code 12 base_process_pc_enter.o(i.base_process_pc_init) + base_read_e2prom 0x08004af9 Thumb Code 54 function_e2prom.o(i.base_read_e2prom) + base_read_e2prom_parameter 0x08004b35 Thumb Code 736 function_e2prom.o(i.base_read_e2prom_parameter) + base_send_beacon_switch 0x08004e4d Thumb Code 6 base_process_tx_keypad.o(i.base_send_beacon_switch) + base_tx_keypad_beacon 0x080050ed Thumb Code 454 base_process_tx_keypad.o(i.base_tx_keypad_beacon) + base_tx_to_keypad_sub 0x080052c5 Thumb Code 96 base_process_tx_keypad.o(i.base_tx_to_keypad_sub) + base_tx_to_pc_sub 0x08005331 Thumb Code 80 base_process_pc_enter.o(i.base_tx_to_pc_sub) + base_write_e2prom 0x080055c5 Thumb Code 48 function_e2prom.o(i.base_write_e2prom) + basetest_get_status 0x080055f9 Thumb Code 14 fucntion_base_test.o(i.basetest_get_status) + basetest_init 0x0800560d Thumb Code 16 fucntion_base_test.o(i.basetest_init) + basetest_progress 0x08005629 Thumb Code 226 fucntion_base_test.o(i.basetest_progress) + basetest_rx_and_ack_pc 0x08005729 Thumb Code 72 fucntion_base_test.o(i.basetest_rx_and_ack_pc) + basic_delay_ms 0x08005781 Thumb Code 32 platform.o(i.basic_delay_ms) + basic_delay_us 0x080057a1 Thumb Code 30 platform.o(i.basic_delay_us) + basic_delay_us_update 0x080057bf Thumb Code 26 transparentupgrade.o(i.basic_delay_us_update) + beep_ctrl 0x080057d9 Thumb Code 18 buzzer.o(i.beep_ctrl) + broadcast_config 0x080057ed Thumb Code 254 function_broadcast.o(i.broadcast_config) + calc_custom_rf_sync_code 0x080058f9 Thumb Code 50 function_e2prom.o(i.calc_custom_rf_sync_code) + check_fastmatch_lowerPA 0x080059c1 Thumb Code 20 fucntion_fastmatch.o(i.check_fastmatch_lowerPA) + conver_id 0x08005aad Thumb Code 34 multi_channel.o(i.conver_id) + core_debug_enter 0x08005ad5 Thumb Code 2 debug.o(i.core_debug_enter) + crc16 0x08005ad9 Thumb Code 78 common_math.o(i.crc16) + custom_hid_itfop_register 0x08005c19 Thumb Code 16 custom_hid_core.o(i.custom_hid_itfop_register) + custom_hid_report_send 0x08005c29 Thumb Code 24 custom_hid_core.o(i.custom_hid_report_send) + debug_check_allerr 0x08005d35 Thumb Code 92 base_core.o(i.debug_check_allerr) + debug_set_buf_bit 0x08005da1 Thumb Code 26 base_core.o(i.debug_set_buf_bit) + decrypt 0x08005dbd Thumb Code 114 aes.o(i.decrypt) + det_blank_content 0x08005e49 Thumb Code 44 function_broadcast.o(i.det_blank_content) + encrypt 0x08005f21 Thumb Code 112 aes.o(i.encrypt) + exti_interrupt_flag_clear 0x08005fa9 Thumb Code 6 gd32f30x_exti.o(i.exti_interrupt_flag_clear) + exti_interrupt_flag_get 0x08005fb5 Thumb Code 32 gd32f30x_exti.o(i.exti_interrupt_flag_get) + fastmatch_enter_exit 0x08005fd9 Thumb Code 104 fucntion_fastmatch.o(i.fastmatch_enter_exit) + fastmatch_load_info_to_vote_beacon 0x08006051 Thumb Code 166 fucntion_fastmatch.o(i.fastmatch_load_info_to_vote_beacon) + fastmatch_lowerPA_ack 0x0800610d Thumb Code 28 fucntion_fastmatch.o(i.fastmatch_lowerPA_ack) + fastmatch_lowerPA_setup 0x08006175 Thumb Code 8 fucntion_fastmatch.o(i.fastmatch_lowerPA_setup) + fastmatch_status 0x08006181 Thumb Code 6 fucntion_fastmatch.o(i.fastmatch_status) + fastmatch_success_check 0x0800618d Thumb Code 54 fucntion_fastmatch.o(i.fastmatch_success_check) + free 0x080061c9 Thumb Code 76 malloc.o(i.free) + getSBoxValue 0x0800627d Thumb Code 8 aes.o(i.getSBoxValue) + get_aes_key 0x08006289 Thumb Code 16 function_aes.o(i.get_aes_key) + get_aes_status 0x0800629d Thumb Code 18 function_aes.o(i.get_aes_status) + get_base_id 0x080062b9 Thumb Code 6 base_process_pc_enter.o(i.get_base_id) + get_base_log_mode 0x080062c5 Thumb Code 6 base_process_pc_enter.o(i.get_base_log_mode) + get_base_main_rfchannel 0x080062d1 Thumb Code 6 multi_channel.o(i.get_base_main_rfchannel) + get_base_match_code 0x080062dd Thumb Code 50 base_process_pc_enter.o(i.get_base_match_code) + get_base_send_beacon_status 0x08006319 Thumb Code 6 base_process_tx_keypad.o(i.get_base_send_beacon_status) + get_base_status 0x08006325 Thumb Code 96 base_core.o(i.get_base_status) + get_datapos 0x0800639d Thumb Code 6 base_core.o(i.get_datapos) + get_ext_basicbeacon_startup_flag 0x080063e9 Thumb Code 6 base_process_tx_keypad.o(i.get_ext_basicbeacon_startup_flag) + get_mainRF_usr_id 0x080063f5 Thumb Code 4 multi_channel.o(i.get_mainRF_usr_id) + get_main_rf_hard_id 0x080063f9 Thumb Code 6 multi_channel.o(i.get_main_rf_hard_id) + get_packing_parameter 0x08006411 Thumb Code 172 vote__report.o(i.get_packing_parameter) + get_pc_connect_status 0x080064c1 Thumb Code 6 base_core.o(i.get_pc_connect_status) + get_pc_connect_status_acc 0x080064cd Thumb Code 6 base_core.o(i.get_pc_connect_status_acc) + get_permit_dispaly_status 0x080064d9 Thumb Code 14 base_core.o(i.get_permit_dispaly_status) + get_stm32_chip_id 0x080064ed Thumb Code 46 platform.o(i.get_stm32_chip_id) + get_tx_ok_flag 0x08006521 Thumb Code 6 rf24l01 - multi.o(i.get_tx_ok_flag) + get_usb_status 0x0800652d Thumb Code 18 platform.o(i.get_usb_status) + get_whitelist_rfid 0x08006545 Thumb Code 10 multi_channel.o(i.get_whitelist_rfid) + gpio_bit_reset 0x08006555 Thumb Code 4 gd32f30x_gpio.o(i.gpio_bit_reset) + gpio_bit_set 0x08006559 Thumb Code 4 gd32f30x_gpio.o(i.gpio_bit_set) + gpio_config 0x0800655d Thumb Code 18 gd32f30x_usbd_hw.o(i.gpio_config) + gpio_init 0x08006575 Thumb Code 188 gd32f30x_gpio.o(i.gpio_init) + gpio_input_bit_get 0x08006631 Thumb Code 16 gd32f30x_gpio.o(i.gpio_input_bit_get) + i2c_read_byte 0x08006651 Thumb Code 128 i2c.o(i.i2c_read_byte) + i2c_send_byte 0x080066d5 Thumb Code 188 i2c.o(i.i2c_send_byte) + i2c_start 0x08006795 Thumb Code 68 i2c.o(i.i2c_start) + i2c_stop 0x080067dd Thumb Code 68 i2c.o(i.i2c_stop) + keypad_crc_check 0x08006865 Thumb Code 34 base_process_tx_keypad.o(i.keypad_crc_check) + keypad_crs2_mode 0x08006891 Thumb Code 294 base_process_rx_keypad.o(i.keypad_crs2_mode) + keypad_id_mode 0x080069c9 Thumb Code 334 base_process_rx_keypad.o(i.keypad_id_mode) + keypad_idsn_clear 0x08006b21 Thumb Code 78 base_process_tx_keypad.o(i.keypad_idsn_clear) + keypad_idsn_record_whitelist_request 0x08006b75 Thumb Code 34 function_whitelist.o(i.keypad_idsn_record_whitelist_request) + keypad_idsn_save 0x08006ba1 Thumb Code 242 base_process_tx_keypad.o(i.keypad_idsn_save) + keypad_rf_data_process_NO_fifo 0x08006ca1 Thumb Code 522 base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo) + keypad_rf_data_save 0x08006eb9 Thumb Code 14 base_process_rx_keypad.o(i.keypad_rf_data_save) + keypad_sn_mode 0x08006ec9 Thumb Code 96 base_process_rx_keypad.o(i.keypad_sn_mode) + keypad_transfer2pc_data_fetch 0x08006f2d Thumb Code 60 transfer_keypad_pc.o(i.keypad_transfer2pc_data_fetch) + keypad_transfer2pc_data_save 0x08006f71 Thumb Code 18 transfer_keypad_pc.o(i.keypad_transfer2pc_data_save) + kprx_init_queue 0x08006f89 Thumb Code 16 base_process_rx_keypad.o(i.kprx_init_queue) + led1_control 0x08006fa1 Thumb Code 42 led.o(i.led1_control) + led2_control 0x08006fd1 Thumb Code 42 led.o(i.led2_control) + log_debug 0x08007003 Thumb Code 2 transparentupgrade.o(i.log_debug) + main 0x08007005 Thumb Code 98 main.o(i.main) + malloc 0x0800707d Thumb Code 92 malloc.o(i.malloc) + mem_compare 0x080070e9 Thumb Code 34 common_math.o(i.mem_compare) + mem_cpy 0x0800710b Thumb Code 22 common_math.o(i.mem_cpy) + mem_set 0x08007121 Thumb Code 20 common_math.o(i.mem_set) + monitor_freq_process 0x08007185 Thumb Code 240 function_monitor_freq.o(i.monitor_freq_process) + monitor_rf_data 0x08007281 Thumb Code 102 function_monitor_freq.o(i.monitor_rf_data) + msg_delay_us 0x080072f5 Thumb Code 12 fucntion_text_message.o(i.msg_delay_us) + msg_get_pc_data 0x08007301 Thumb Code 322 fucntion_text_message.o(i.msg_get_pc_data) + msg_issendtime 0x0800744d Thumb Code 96 fucntion_text_message.o(i.msg_issendtime) + msg_polling 0x080074b9 Thumb Code 78 fucntion_text_message.o(i.msg_polling) + msg_recover_beacon_countdown 0x08007511 Thumb Code 44 fucntion_text_message.o(i.msg_recover_beacon_countdown) + msg_send 0x08007541 Thumb Code 176 fucntion_text_message.o(i.msg_send) + msg_set_status 0x080075f9 Thumb Code 6 fucntion_text_message.o(i.msg_set_status) + msg_tx_payload 0x08007605 Thumb Code 36 fucntion_text_message.o(i.msg_tx_payload) + msg_wait_rfsendOK 0x08007631 Thumb Code 34 fucntion_text_message.o(i.msg_wait_rfsendOK) + multi_chan_init 0x08007655 Thumb Code 218 multi_channel.o(i.multi_chan_init) + multi_chan_polling 0x08007745 Thumb Code 124 multi_channel.o(i.multi_chan_polling) + network_get_name 0x080077e5 Thumb Code 28 function_network.o(i.network_get_name) + network_get_nameview 0x08007805 Thumb Code 6 function_network.o(i.network_get_nameview) + network_get_netseq 0x08007811 Thumb Code 6 function_network.o(i.network_get_netseq) + network_get_pwd 0x0800781d Thumb Code 6 function_network.o(i.network_get_pwd) + network_polling 0x08007829 Thumb Code 76 function_network.o(i.network_polling) + network_randtime 0x08007881 Thumb Code 72 function_network.o(i.network_randtime) + network_set_name 0x080078cd Thumb Code 28 function_network.o(i.network_set_name) + network_set_nameview 0x080078ed Thumb Code 18 function_network.o(i.network_set_nameview) + network_set_netseq_change 0x08007905 Thumb Code 12 function_network.o(i.network_set_netseq_change) + network_set_pwd 0x08007915 Thumb Code 6 function_network.o(i.network_set_pwd) + network_tx_beacon 0x08007921 Thumb Code 330 function_network.o(i.network_tx_beacon) + nvic_config 0x08007a7d Thumb Code 32 gd32f30x_usbd_hw.o(i.nvic_config) + nvic_irq_enable 0x08007a9d Thumb Code 186 gd32f30x_misc.o(i.nvic_irq_enable) + nvic_priority_group_set 0x08007b61 Thumb Code 10 gd32f30x_misc.o(i.nvic_priority_group_set) + pc_cmd_0x60_ack 0x08007b75 Thumb Code 64 base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_ack) + pc_cmd_0x60_process 0x08007bb5 Thumb Code 460 base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process) + pc_cmd_0x61_ack 0x08007d9d Thumb Code 64 base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_ack) + pc_cmd_0x61_process 0x08007ddd Thumb Code 476 base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process) + pc_transfer2keypad_data_fetch 0x08007fd9 Thumb Code 144 transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) + pc_transfer2keypad_data_save 0x08008075 Thumb Code 34 transfer_keypad_pc.o(i.pc_transfer2keypad_data_save) + pcrx_data_save 0x080080bd Thumb Code 18 base_process_pc_enter.o(i.pcrx_data_save) + pcrx_init_queue 0x080080d5 Thumb Code 16 base_process_pc_enter.o(i.pcrx_init_queue) + process_keypad_broadcast_requst 0x080080ed Thumb Code 60 function_broadcast.o(i.process_keypad_broadcast_requst) + process_pc_aes_config 0x08008131 Thumb Code 86 function_aes.o(i.process_pc_aes_config) + process_setup_multi_chan 0x08008191 Thumb Code 42 multi_channel.o(i.process_setup_multi_chan) + process_setup_single_chan 0x080081c5 Thumb Code 46 multi_channel.o(i.process_setup_single_chan) + queue_in 0x080081fd Thumb Code 86 queue_circle.o(i.queue_in) + queue_init 0x08008259 Thumb Code 14 queue_circle.o(i.queue_init) + queue_out 0x08008269 Thumb Code 84 queue_circle.o(i.queue_out) + queue_out_get_type 0x080082c1 Thumb Code 46 queue_circle.o(i.queue_out_get_type) + queue_out_special 0x080082f5 Thumb Code 104 queue_circle.o(i.queue_out_special) + rcu_clock_freq_get 0x08008361 Thumb Code 310 gd32f30x_rcu.o(i.rcu_clock_freq_get) + rcu_config 0x080084bd Thumb Code 168 gd32f30x_usbd_hw.o(i.rcu_config) + rcu_periph_clock_enable 0x08008575 Thumb Code 28 gd32f30x_rcu.o(i.rcu_periph_clock_enable) + rcu_usb_clock_config 0x08008595 Thumb Code 18 gd32f30x_rcu.o(i.rcu_usb_clock_config) + refresh_pc_connect_status 0x08008679 Thumb Code 30 base_core.o(i.refresh_pc_connect_status) + refresh_rcvRF_indicate 0x080086a1 Thumb Code 30 base_core.o(i.refresh_rcvRF_indicate) + rf_Decrypt 0x080086c9 Thumb Code 308 function_aes.o(i.rf_Decrypt) + rf_Encrypt 0x08008805 Thumb Code 282 function_aes.o(i.rf_Encrypt) + rf_SendPacket 0x08008929 Thumb Code 170 rf24l01 - multi.o(i.rf_SendPacket) + rf_error_warning 0x08008a35 Thumb Code 74 multi_channel.o(i.rf_error_warning) + rf_initial 0x08008a89 Thumb Code 162 rf24l01 - multi.o(i.rf_initial) + rf_modual__check 0x08008b31 Thumb Code 2 multi_channel.o(i.rf_modual__check) + rf_modual__tx_counter 0x08008b35 Thumb Code 24 multi_channel.o(i.rf_modual__tx_counter) + rf_set_PA_Mode 0x08008b51 Thumb Code 80 rf24l01 - multi.o(i.rf_set_PA_Mode) + rf_set_syncode 0x08008ba1 Thumb Code 52 rf24l01 - multi.o(i.rf_set_syncode) + rf_setfreq 0x08008bdd Thumb Code 30 rf24l01 - multi.o(i.rf_setfreq) + save_keypad_ack_data 0x08008bfd Thumb Code 26 transparentupgrade.o(i.save_keypad_ack_data) + search_special_list 0x08008c1d Thumb Code 48 function_whitelist.o(i.search_special_list) + send_to_keypad_user_hardID 0x08008c55 Thumb Code 86 base_process_tx_keypad.o(i.send_to_keypad_user_hardID) + serial_string_get 0x08008cb5 Thumb Code 70 usbd_enum.o(i.serial_string_get) + set_base_hard_firmware_info 0x08008d05 Thumb Code 52 base_core.o(i.set_base_hard_firmware_info) + set_ext_basicbeacon_startup_flag 0x08008d41 Thumb Code 6 base_process_tx_keypad.o(i.set_ext_basicbeacon_startup_flag) + set_keypad_crc_config 0x08008d4d Thumb Code 58 base_process_tx_keypad.o(i.set_keypad_crc_config) + set_pc_communication_type 0x08008d91 Thumb Code 26 platform.o(i.set_pc_communication_type) + set_tx_ok_flag 0x08008db9 Thumb Code 6 rf24l01 - multi.o(i.set_tx_ok_flag) + single_relevant_to_multi_chan 0x08008e2d Thumb Code 42 multi_channel.o(i.single_relevant_to_multi_chan) + spi_enable 0x08008e5d Thumb Code 10 gd32f30x_spi.o(i.spi_enable) + spi_i2s_data_receive 0x08008e67 Thumb Code 8 gd32f30x_spi.o(i.spi_i2s_data_receive) + spi_i2s_data_transmit 0x08008e6f Thumb Code 4 gd32f30x_spi.o(i.spi_i2s_data_transmit) + spi_i2s_flag_get 0x08008e73 Thumb Code 16 gd32f30x_spi.o(i.spi_i2s_flag_get) + spi_init 0x08008e83 Thumb Code 50 gd32f30x_spi.o(i.spi_init) + startup_broadcast 0x08008eb5 Thumb Code 58 function_broadcast.o(i.startup_broadcast) + timer_20ms_function 0x08009011 Thumb Code 142 base_core.o(i.timer_20ms_function) + timer_autoreload_value_config 0x080090a9 Thumb Code 4 gd32f30x_timer.o(i.timer_autoreload_value_config) + timer_counter_read 0x080090ad Thumb Code 8 gd32f30x_timer.o(i.timer_counter_read) + timer_counter_value_config 0x080090b5 Thumb Code 4 gd32f30x_timer.o(i.timer_counter_value_config) + timer_enable 0x080090b9 Thumb Code 10 gd32f30x_timer.o(i.timer_enable) + timer_init 0x080090c5 Thumb Code 122 gd32f30x_timer.o(i.timer_init) + timer_interrupt_disable 0x0800915d Thumb Code 8 gd32f30x_timer.o(i.timer_interrupt_disable) + timer_interrupt_enable 0x08009165 Thumb Code 8 gd32f30x_timer.o(i.timer_interrupt_enable) + timer_interrupt_flag_clear 0x0800916d Thumb Code 6 gd32f30x_timer.o(i.timer_interrupt_flag_clear) + timer_interrupt_flag_get 0x08009173 Thumb Code 24 gd32f30x_timer.o(i.timer_interrupt_flag_get) + timer_prescaler_config 0x0800918b Thumb Code 14 gd32f30x_timer.o(i.timer_prescaler_config) + transfer2kp_init_queue 0x08009199 Thumb Code 16 transfer_keypad_pc.o(i.transfer2kp_init_queue) + transfer2pc_init_queue 0x080091b1 Thumb Code 16 transfer_keypad_pc.o(i.transfer2pc_init_queue) + uart1_send_datas 0x080091c9 Thumb Code 2 platform.o(i.uart1_send_datas) + updat__exit 0x080091cd Thumb Code 42 transparentupgrade.o(i.updat__exit) + update_2_timer 0x08009205 Thumb Code 30 transparentupgrade.o(i.update_2_timer) + update_get_status 0x08009229 Thumb Code 4 transparentupgrade.o(i.update_get_status) + update_kp_enter 0x0800922d Thumb Code 224 transparentupgrade.o(i.update_kp_enter) + update_kp_progress 0x08009319 Thumb Code 2 transparentupgrade.o(i.update_kp_progress) + update_monitor_sdk_connect 0x0800931b Thumb Code 2 transparentupgrade.o(i.update_monitor_sdk_connect) + usbd_class_request 0x080093c5 Thumb Code 34 usbd_enum.o(i.usbd_class_request) + usbd_ep_recev 0x0800963b Thumb Code 56 usbd_core.o(i.usbd_ep_recev) + usbd_ep_send 0x08009741 Thumb Code 78 usbd_core.o(i.usbd_ep_send) + usbd_init 0x08009bb5 Thumb Code 92 usbd_core.o(i.usbd_init) + usbd_isr 0x08009c49 Thumb Code 622 usbd_lld_int.o(i.usbd_isr) + usbd_standard_request 0x08009f05 Thumb Code 22 usbd_enum.o(i.usbd_standard_request) + usbd_vendor_request 0x08009f35 Thumb Code 6 usbd_enum.o(i.usbd_vendor_request) + user_20ms_timer 0x08009f3b Thumb Code 8 platform.o(i.user_20ms_timer) + user_2ms5_timer 0x08009f45 Thumb Code 26 platform.o(i.user_2ms5_timer) + user__keypad_transfer2pc 0x08009f69 Thumb Code 2 function.o(i.user__keypad_transfer2pc) + user__pc_0x60cmd 0x08009f6b Thumb Code 2 function.o(i.user__pc_0x60cmd) + user__pc_0x61cmd 0x08009f6d Thumb Code 2 function.o(i.user__pc_0x61cmd) + user__pc_0x61cmd_type0x0B 0x08009f6f Thumb Code 2 function.o(i.user__pc_0x61cmd_type0x0B) + user__pc_cmd_ack 0x08009f71 Thumb Code 74 function.o(i.user__pc_cmd_ack) + user__pc_transfer2keypad 0x08009fc1 Thumb Code 2 function.o(i.user__pc_transfer2keypad) + vote_data_packing 0x08009fc5 Thumb Code 658 vote__process.o(i.vote_data_packing) + vote_data_parameter_init 0x0800a265 Thumb Code 20 vote__report.o(i.vote_data_parameter_init) + vote_data_report_interval 0x0800a27d Thumb Code 38 vote__report.o(i.vote_data_report_interval) + vote_data_report_startup 0x0800a2a9 Thumb Code 22 vote__report.o(i.vote_data_report_startup) + vote_data_report_to_pc 0x0800a2c5 Thumb Code 48 vote__report.o(i.vote_data_report_to_pc) + vote_data_store 0x0800a2f9 Thumb Code 18 vote__process.o(i.vote_data_store) + vote_init_queue 0x0800a311 Thumb Code 16 vote__process.o(i.vote_init_queue) + vote_status_clear_confirmed 0x0800a329 Thumb Code 338 vote__process.o(i.vote_status_clear_confirmed) + vote_status_reset_NOconfirmed 0x0800a48d Thumb Code 2 vote__process.o(i.vote_status_reset_NOconfirmed) + whitelist__2ms5_call 0x0800a491 Thumb Code 84 function_whitelist.o(i.whitelist__2ms5_call) + whitelist__tx_authcode_to_keypad 0x0800a4f1 Thumb Code 224 function_whitelist.o(i.whitelist__tx_authcode_to_keypad) + whitelist_enter 0x0800a6e1 Thumb Code 172 function_whitelist.o(i.whitelist_enter) + whitelist_init 0x0800a78d Thumb Code 46 function_whitelist.o(i.whitelist_init) + customhid_report_descriptor 0x0800a918 Data 32 custom_hid_core.o(.constdata) + rf_cs_port 0x0800a938 Data 16 rf24l01 - multi.o(.constdata) + rf_cs_pin 0x0800a948 Data 8 rf24l01 - multi.o(.constdata) + rf_it_port 0x0800a950 Data 16 rf24l01 - multi.o(.constdata) + rf_it_pin 0x0800a960 Data 8 rf24l01 - multi.o(.constdata) + rf_it_pin_nbr 0x0800a968 Data 4 rf24l01 - multi.o(.constdata) + rf_paTX_port 0x0800a96c Data 16 rf24l01 - multi.o(.constdata) + rf_paTX_pin 0x0800a97c Data 8 rf24l01 - multi.o(.constdata) + rf_ce_port 0x0800a984 Data 16 rf24l01 - multi.o(.constdata) + rf_ce_pin 0x0800a994 Data 8 rf24l01 - multi.o(.constdata) + crc_table 0x0800a99c Data 32 common_math.o(.constdata) + OEM_CODE 0x0800a9bc Data 9 function_e2prom.o(.constdata) + Keycode_Sunvote 0x0800a9c5 Data 33 function_aes.o(.constdata) + CmdTAB 0x0800a9e6 Data 36 function_aes.o(.constdata) + rsbox 0x0800aa10 Data 256 aes.o(.constdata) + sbox 0x0800ab10 Data 256 aes.o(.constdata) + Rcon 0x0800ac10 Data 255 aes.o(.constdata) + Sbox 0x0800ad24 Data 256 crypto.o(.constdata) + InvSbox 0x0800ae24 Data 256 crypto.o(.constdata) + rcon 0x0800af24 Data 40 crypto.o(.constdata) + enc_table 0x0800af4c Data 1024 crypto.o(.constdata) + dec_table 0x0800b34c Data 1024 crypto.o(.constdata) + SP1 0x0800b96c Data 256 crypto.o(.constdata) + SP2 0x0800ba6c Data 256 crypto.o(.constdata) + SP3 0x0800bb6c Data 256 crypto.o(.constdata) + SP4 0x0800bc6c Data 256 crypto.o(.constdata) + SP5 0x0800bd6c Data 256 crypto.o(.constdata) + SP6 0x0800be6c Data 256 crypto.o(.constdata) + SP7 0x0800bf6c Data 256 crypto.o(.constdata) + SP8 0x0800c06c Data 256 crypto.o(.constdata) + K256 0x0800c16c Data 256 crypto.o(.constdata) + sigma 0x0800c4f0 Data 16 crypto.o(.constdata) + ge25519_base 0x0800c574 Data 128 crypto.o(.constdata) + Region$$Table$$Base 0x0800c8d4 Number 0 anon$$obj.o(Region$$Table) + Region$$Table$$Limit 0x0800c8f4 Number 0 anon$$obj.o(Region$$Table) + Send_Buffer 0x20000000 Data 4 gd32f30x_it.o(.data) + fop_handler 0x20000004 Data 16 custom_hid_itf.o(.data) + usbd_core 0x20000014 Data 8 usbd_lld_core.o(.data) + usbd_drv_handler 0x2000001c Data 64 usbd_lld_core.o(.data) + usbd_int_fops 0x2000005c Data 4 usbd_core.o(.data) + custom_hid_dev_desc 0x200000a4 Data 18 custom_hid_core.o(.data) + custom_hid_config_desc 0x200000b6 Data 41 custom_hid_core.o(.data) + usbd_hid_strings 0x2000026c Data 16 custom_hid_core.o(.data) + custom_hid_desc 0x2000027c Data 16 custom_hid_core.o(.data) + custom_hid_class 0x2000028c Data 32 custom_hid_core.o(.data) + rx_uart_buf 0x200002ac Data 1 platform.o(.data) + _20ms_timer_count 0x200002ae Data 2 platform.o(.data) + _0s5_flag 0x200002b0 Data 1 platform.o(.data) + mainloop_20ms_flag 0x200002b1 Data 1 platform.o(.data) + mainloop_2ms5_flag 0x200002b2 Data 1 platform.o(.data) + platform 0x200002b8 Data 116 platform.o(.data) + base_core 0x20000334 Data 108 base_core.o(.data) + debug_subject 0x200003a0 Data 1 base_core.o(.data) + basic_beacon_crs2 0x200003a2 Data 6 base_process_pc_enter.o(.data) + base_config 0x200003a8 Data 8 base_process_pc_enter.o(.data) + base_mac 0x200003b0 Data 5 base_process_pc_enter.o(.data) + aux_beats 0x200003b5 Data 2 base_process_pc_enter.o(.data) + aux_att 0x200003b7 Data 4 base_process_pc_enter.o(.data) + multi_freq_setup 0x200003bb Data 8 base_process_pc_enter.o(.data) + base_pwd_setup 0x200003c3 Data 4 base_process_pc_enter.o(.data) + error_cnt 0x200003c8 Data 4 base_process_rx_keypad.o(.data) + pkt_cnt 0x200003de Data 1 vote__process.o(.data) + rx_rssi 0x200003e8 Data 1 fucntion_base_test.o(.data) + rssi_request_flag 0x200003e9 Data 1 fucntion_base_test.o(.data) + base_test_chan 0x200003ea Data 1 fucntion_base_test.o(.data) + fastmatch 0x200003ec Data 6 fucntion_fastmatch.o(.data) + msg_outtime_cnt 0x200003f4 Data 2 fucntion_text_message.o(.data) + Byte2Dex 0x200003f8 Data 4 fucntion_text_message.o(.data) + function 0x200003fc Data 280 function.o(.data) + monitor_freq 0x20000515 Data 6 function_monitor_freq.o(.data) + Network 0x2000051c Data 32 function_network.o(.data) + list_valid_cnt 0x2000053c Data 1 function_whitelist.o(.data) + list_request_flag 0x2000053d Data 1 function_whitelist.o(.data) + list_sn 0x2000053e Data 4 function_whitelist.o(.data) + DownFSM 0x20000544 Data 1 transparentupgrade.o(.data) + Nr 0x20000558 Data 4 aes.o(.data) + Nk 0x2000055c Data 4 aes.o(.data) + Nc 0x20000560 Data 4 aes.o(.data) + iKey 0x20000564 Data 1 aes.o(.data) + asBytes 0x20000565 Data 1 aes.o(.data) + __microlib_freelist 0x200005ac Data 4 mvars.o(.data) + __microlib_freelist_initialised 0x200005b0 Data 4 mvars.o(.data) + usbd_custom_hid 0x200005b4 Data 188 main.o(.bss) + kernel 0x200006b4 Data 48 base_core.o(.bss) + debug_rxkp 0x200006e4 Data 1000 base_core.o(.bss) + debug_ackkp 0x20000acc Data 1000 base_core.o(.bss) + debug_txpc 0x20000eb4 Data 1000 base_core.o(.bss) + debug_pcack 0x2000129c Data 1000 base_core.o(.bss) + debug_rxkpcnt 0x20001684 Data 80 base_core.o(.bss) + debug_ackkpcnt 0x200016d4 Data 80 base_core.o(.bss) + basic_beacon 0x20001724 Data 15 base_process_pc_enter.o(.bss) + basic_ext_beacon 0x20001733 Data 25 base_process_pc_enter.o(.bss) + vote_beacon 0x2000174c Data 62 base_process_pc_enter.o(.bss) + ext_vbeacon 0x2000178a Data 24 base_process_pc_enter.o(.bss) + base_hdinfo 0x200017a2 Data 14 base_process_pc_enter.o(.bss) + base_name_log_mode 0x200017b0 Data 14 base_process_pc_enter.o(.bss) + base_name_setup 0x200017be Data 14 base_process_pc_enter.o(.bss) + ext_vbeacon_2 0x200017cc Data 24 base_process_pc_enter.o(.bss) + pcrx_queue 0x200017e4 Data 12 base_process_pc_enter.o(.bss) + pcrx_buf 0x200017f0 Data 1088 base_process_pc_enter.o(.bss) + kprx_queue 0x20001c30 Data 12 base_process_rx_keypad.o(.bss) + kprx_buf 0x20001c3c Data 975 base_process_rx_keypad.o(.bss) + keypad_idsn 0x2000200c Data 61 base_process_tx_keypad.o(.bss) + send_beacon 0x2000204c Data 12 base_process_tx_keypad.o(.bss) + multi 0x20002058 Data 256 multi_channel.o(.bss) + rf_modual 0x20002158 Data 30 multi_channel.o(.bss) + trans2pc_queue 0x20002178 Data 12 transfer_keypad_pc.o(.bss) + trans2pc_buf 0x20002184 Data 640 transfer_keypad_pc.o(.bss) + trans2kp_queue 0x20002404 Data 12 transfer_keypad_pc.o(.bss) + trans2kp_buf 0x20002410 Data 640 transfer_keypad_pc.o(.bss) + vote_queue 0x20002690 Data 12 vote__process.o(.bss) + packet 0x20003f9c Data 737 vote__process.o(.bss) + base_test 0x2000427e Data 12 fucntion_base_test.o(.bss) + RF_Send_buf 0x2000428c Data 1057 fucntion_text_message.o(.bss) + msg 0x200046b0 Data 1088 fucntion_text_message.o(.bss) + aes 0x20004af0 Data 67 function_aes.o(.bss) + broadcast 0x20004b33 Data 4117 function_broadcast.o(.bss) + list 0x20005b48 Data 800 function_whitelist.o(.bss) + wlist 0x20005e68 Data 128 function_whitelist.o(.bss) + update 0x20005ee8 Data 1076 transparentupgrade.o(.bss) + DownLoad 0x2000631c Data 1168 transparentupgrade.o(.bss) + in 0x200067ac Data 16 aes.o(.bss) + out 0x200067bc Data 32 aes.o(.bss) + state 0x200067dc Data 16 aes.o(.bss) + RoundKey 0x200067ec Data 300 aes.o(.bss) + Key 0x20006918 Data 32 aes.o(.bss) + _SEGGER_RTT 0x20006938 Data 168 segger_rtt.o(.bss) + __heap_base 0x200079f0 Data 0 startup_gd32f30x_hd.o(HEAP) + __heap_limit 0x20007df0 Data 0 startup_gd32f30x_hd.o(HEAP) + __initial_sp 0x20008df0 Data 0 startup_gd32f30x_hd.o(STACK) + + + +============================================================================== + +Memory Map of the image + + Image Entry point : 0x08000131 + + Load Region LR_IROM1 (Base: 0x08000000, Size: 0x0000cea8, Max: 0x00080000, ABSOLUTE, COMPRESSED[0x0000cbb4]) + + Execution Region ER_IROM1 (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x0000c8f4, Max: 0x00080000, ABSOLUTE) + + Exec Addr Load Addr Size Type Attr Idx E Section Name Object + + 0x08000000 0x08000000 0x00000130 Data RO 2647 RESET startup_gd32f30x_hd.o + 0x08000130 0x08000130 0x00000000 Code RO 6732 * .ARM.Collect$$$$00000000 mc_w.l(entry.o) + 0x08000130 0x08000130 0x00000004 Code RO 7045 .ARM.Collect$$$$00000001 mc_w.l(entry2.o) + 0x08000134 0x08000134 0x00000004 Code RO 7048 .ARM.Collect$$$$00000004 mc_w.l(entry5.o) + 0x08000138 0x08000138 0x00000000 Code RO 7050 .ARM.Collect$$$$00000008 mc_w.l(entry7b.o) + 0x08000138 0x08000138 0x00000000 Code RO 7052 .ARM.Collect$$$$0000000A mc_w.l(entry8b.o) + 0x08000138 0x08000138 0x00000008 Code RO 7053 .ARM.Collect$$$$0000000B mc_w.l(entry9a.o) + 0x08000140 0x08000140 0x00000004 Code RO 7060 .ARM.Collect$$$$0000000E mc_w.l(entry12b.o) + 0x08000144 0x08000144 0x00000000 Code RO 7055 .ARM.Collect$$$$0000000F mc_w.l(entry10a.o) + 0x08000144 0x08000144 0x00000000 Code RO 7057 .ARM.Collect$$$$00000011 mc_w.l(entry11a.o) + 0x08000144 0x08000144 0x00000004 Code RO 7046 .ARM.Collect$$$$00002712 mc_w.l(entry2.o) + 0x08000148 0x08000148 0x00000024 Code RO 2648 .text startup_gd32f30x_hd.o + 0x0800016c 0x0800016c 0x00000024 Code RO 6735 .text mc_w.l(rand.o) + 0x08000190 0x08000190 0x00000040 Code RO 6740 .text mc_w.l(memmovea.o) + 0x080001d0 0x080001d0 0x00000024 Code RO 6742 .text mc_w.l(memseta.o) + 0x080001f4 0x080001f4 0x0000001a Code RO 6746 .text mc_w.l(memcmp.o) + 0x0800020e 0x0800020e 0x00000012 Code RO 6748 .text mc_w.l(strcpy.o) + 0x08000220 0x08000220 0x00000024 Code RO 7090 .text mc_w.l(init.o) + 0x08000244 0x08000244 0x00000056 Code RO 7142 .text mc_w.l(__dczerorl2.o) + 0x0800029a 0x0800029a 0x00000002 PAD + 0x0800029c 0x0800029c 0x00000044 Code RO 5696 i.AES_Decrypt aes.o + 0x080002e0 0x080002e0 0x000000ba Code RO 6121 i.AES_ECB_Decrypt_Append STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x0800039a 0x0800039a 0x0000001a Code RO 6122 i.AES_ECB_Decrypt_Finish STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x080003b4 0x080003b4 0x00000006 Code RO 6123 i.AES_ECB_Decrypt_Init STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x080003ba 0x080003ba 0x00000002 PAD + 0x080003bc 0x080003bc 0x000000ba Code RO 6124 i.AES_ECB_Encrypt_Append STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x08000476 0x08000476 0x0000001a Code RO 6125 i.AES_ECB_Encrypt_Finish STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x08000490 0x08000490 0x00000006 Code RO 6126 i.AES_ECB_Encrypt_Init STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x08000496 0x08000496 0x00000002 PAD + 0x08000498 0x08000498 0x00000044 Code RO 5697 i.AES_Encrypt aes.o + 0x080004dc 0x080004dc 0x0000031c Code RO 6154 i.AES_general_SW_dec STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x080007f8 0x080007f8 0x00000324 Code RO 6155 i.AES_general_SW_enc STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x08000b1c 0x08000b1c 0x00000158 Code RO 6156 i.AES_keyschedule_dec STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x08000c74 0x08000c74 0x000001dc Code RO 6158 i.AES_keyschedule_enc_LL STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x08000e50 0x08000e50 0x00000146 Code RO 6161 i.AESstdInit STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x08000f96 0x08000f96 0x00000002 PAD + 0x08000f98 0x08000f98 0x00000040 Code RO 5698 i.AddRoundKey aes.o + 0x08000fd8 0x08000fd8 0x00000002 Code RO 3155 i.Beep buzzer.o + 0x08000fda 0x08000fda 0x00000004 Code RO 194 i.BusFault_Handler gd32f30x_it.o + 0x08000fde 0x08000fde 0x00000004 Code RO 3295 i.CLI platform.o + 0x08000fe2 0x08000fe2 0x00000002 PAD + 0x08000fe4 0x08000fe4 0x00000094 Code RO 5702 i.Cipher aes.o + 0x08001078 0x08001078 0x00000048 Code RO 4871 i.CmdXch function_aes.o + 0x080010c0 0x080010c0 0x00000002 Code RO 195 i.DebugMon_Handler gd32f30x_it.o + 0x080010c2 0x080010c2 0x00000002 PAD + 0x080010c4 0x080010c4 0x00000044 Code RO 4872 i.Decrypt function_aes.o + 0x08001108 0x08001108 0x0000000c Code RO 3434 i.DelayUs rf24l01 - multi.o + 0x08001114 0x08001114 0x00000048 Code RO 3184 i.EE_ReadBytes i2c.o + 0x0800115c 0x0800115c 0x0000007a Code RO 3185 i.EE_WriteBytes i2c.o + 0x080011d6 0x080011d6 0x00000002 PAD + 0x080011d8 0x080011d8 0x00000030 Code RO 196 i.EXTI0_IRQHandler gd32f30x_it.o + 0x08001208 0x08001208 0x00000038 Code RO 197 i.EXTI10_15_IRQHandler gd32f30x_it.o + 0x08001240 0x08001240 0x00000044 Code RO 4873 i.Encrypt function_aes.o + 0x08001284 0x08001284 0x00000090 Code RO 3 i.GPIO_Init main.o + 0x08001314 0x08001314 0x00000018 Code RO 3625 i.HW_GD_CUSTOM_HID_REPORT_SEND hw_mcuio.o + 0x0800132c 0x0800132c 0x0000001a Code RO 3626 i.HW_GD_Delay hw_mcuio.o + 0x08001346 0x08001346 0x00000014 Code RO 3628 i.HW_GD_GPIO_Init hw_mcuio.o + 0x0800135a 0x0800135a 0x00000026 Code RO 3629 i.HW_GD_GPIO_TogglePin hw_mcuio.o + 0x08001380 0x08001380 0x0000000c Code RO 3630 i.HW_GD_GetTick hw_mcuio.o + 0x0800138c 0x0800138c 0x00000010 Code RO 3631 i.HW_GD_IncTick hw_mcuio.o + 0x0800139c 0x0800139c 0x0000006c Code RO 3632 i.HW_GD_SPI0_Init hw_mcuio.o + 0x08001408 0x08001408 0x00000038 Code RO 3633 i.HW_GD_SPI0_TransmitReceive hw_mcuio.o + 0x08001440 0x08001440 0x00000060 Code RO 3634 i.HW_GD_SPI_TransmitReceiveOneByte hw_mcuio.o + 0x080014a0 0x080014a0 0x00000004 Code RO 198 i.HardFault_Handler gd32f30x_it.o + 0x080014a4 0x080014a4 0x00000094 Code RO 5704 i.InvCipher aes.o + 0x08001538 0x08001538 0x00000228 Code RO 5705 i.InvMixColumns aes.o + 0x08001760 0x08001760 0x00000040 Code RO 5706 i.InvShiftRows aes.o + 0x080017a0 0x080017a0 0x00000034 Code RO 5707 i.InvSubBytes aes.o + 0x080017d4 0x080017d4 0x0000015c Code RO 5708 i.KeyExpansion aes.o + 0x08001930 0x08001930 0x00000004 Code RO 199 i.MemManage_Handler gd32f30x_it.o + 0x08001934 0x08001934 0x000000e4 Code RO 5709 i.MixColumns aes.o + 0x08001a18 0x08001a18 0x00000030 Code RO 4733 i.Msg_TickHandler fucntion_text_message.o + 0x08001a48 0x08001a48 0x00000002 Code RO 200 i.NMI_Handler gd32f30x_it.o + 0x08001a4a 0x08001a4a 0x00000002 PAD + 0x08001a4c 0x08001a4c 0x00000058 Code RO 3435 i.NRF24L01_Clear_IRQ_Flag rf24l01 - multi.o + 0x08001aa4 0x08001aa4 0x00000038 Code RO 3436 i.NRF24L01_Flush_Rx_Fifo rf24l01 - multi.o + 0x08001adc 0x08001adc 0x00000038 Code RO 3437 i.NRF24L01_Flush_Tx_Fifo rf24l01 - multi.o + 0x08001b14 0x08001b14 0x0000004c Code RO 3438 i.NRF24L01_Read_Buf rf24l01 - multi.o + 0x08001b60 0x08001b60 0x00000044 Code RO 3439 i.NRF24L01_Read_Reg rf24l01 - multi.o + 0x08001ba4 0x08001ba4 0x0000003c Code RO 3441 i.NRF24L01_Read_Status_Register rf24l01 - multi.o + 0x08001be0 0x08001be0 0x00000024 Code RO 3443 i.NRF24L01_SetPA rf24l01 - multi.o + 0x08001c04 0x08001c04 0x00000038 Code RO 3444 i.NRF24L01_Set_RxAddr rf24l01 - multi.o + 0x08001c3c 0x08001c3c 0x0000003c Code RO 3445 i.NRF24L01_Set_Speed rf24l01 - multi.o + 0x08001c78 0x08001c78 0x00000022 Code RO 3446 i.NRF24L01_Set_TxAddr rf24l01 - multi.o + 0x08001c9a 0x08001c9a 0x00000002 PAD + 0x08001c9c 0x08001c9c 0x00000050 Code RO 3447 i.NRF24L01_Write_Buf rf24l01 - multi.o + 0x08001cec 0x08001cec 0x0000005c Code RO 3448 i.NRF24L01_Write_Reg rf24l01 - multi.o + 0x08001d48 0x08001d48 0x00000054 Code RO 3449 i.NRF24L01_Write_Tx_Payload_NoAck rf24l01 - multi.o + 0x08001d9c 0x08001d9c 0x00000054 Code RO 3450 i.NRF24L01_check rf24l01 - multi.o + 0x08001df0 0x08001df0 0x00000028 Code RO 3297 i.NVIC_SystemReset platform.o + 0x08001e18 0x08001e18 0x00000002 Code RO 201 i.PendSV_Handler gd32f30x_it.o + 0x08001e1a 0x08001e1a 0x00000014 Code RO 3451 i.RF24L01_Chan rf24l01 - multi.o + 0x08001e2e 0x08001e2e 0x00000002 PAD + 0x08001e30 0x08001e30 0x00000038 Code RO 3453 i.RF24L01_RxOn rf24l01 - multi.o + 0x08001e68 0x08001e68 0x0000002e Code RO 3454 i.RF24L01_Set_Mode rf24l01 - multi.o + 0x08001e96 0x08001e96 0x00000002 PAD + 0x08001e98 0x08001e98 0x00000074 Code RO 5283 i.RandData function_network.o + 0x08001f0c 0x08001f0c 0x00000038 Code RO 5873 i.SEGGER_RTT_Read segger_rtt.o + 0x08001f44 0x08001f44 0x00000098 Code RO 5874 i.SEGGER_RTT_ReadNoLock segger_rtt.o + 0x08001fdc 0x08001fdc 0x00000048 Code RO 5882 i.SEGGER_RTT_Write segger_rtt.o + 0x08002024 0x08002024 0x00000084 Code RO 5883 i.SEGGER_RTT_WriteNoLock segger_rtt.o + 0x080020a8 0x080020a8 0x00000022 Code RO 6050 i.SEGGER_RTT_printf segger_rtt_printf.o + 0x080020ca 0x080020ca 0x0000020a Code RO 6051 i.SEGGER_RTT_vprintf segger_rtt_printf.o + 0x080022d4 0x080022d4 0x00000004 Code RO 3298 i.SEI platform.o + 0x080022d8 0x080022d8 0x00000030 Code RO 3186 i.SET_SDA_IN i2c.o + 0x08002308 0x08002308 0x00000030 Code RO 3187 i.SET_SDA_OUT i2c.o + 0x08002338 0x08002338 0x00000074 Code RO 5710 i.STM32_AES_ECB_Decrypt aes.o + 0x080023ac 0x080023ac 0x00000074 Code RO 5711 i.STM32_AES_ECB_Encrypt aes.o + 0x08002420 0x08002420 0x00000002 Code RO 202 i.SVC_Handler gd32f30x_it.o + 0x08002422 0x08002422 0x00000002 PAD + 0x08002424 0x08002424 0x00000044 Code RO 5712 i.ShiftRows aes.o + 0x08002468 0x08002468 0x00000034 Code RO 5713 i.SubBytes aes.o + 0x0800249c 0x0800249c 0x00000008 Code RO 203 i.SysTick_Handler gd32f30x_it.o + 0x080024a4 0x080024a4 0x00000070 Code RO 379 i.SystemInit system_gd32f30x.o + 0x08002514 0x08002514 0x00000024 Code RO 204 i.TIMER1_IRQHandler gd32f30x_it.o + 0x08002538 0x08002538 0x00000082 Code RO 4 i.TIMER1_Init main.o + 0x080025ba 0x080025ba 0x00000002 PAD + 0x080025bc 0x080025bc 0x00000024 Code RO 205 i.TIMER2_IRQHandler gd32f30x_it.o + 0x080025e0 0x080025e0 0x00000084 Code RO 5 i.TIMER2_Init main.o + 0x08002664 0x08002664 0x00000016 Code RO 206 i.TIMER3_IRQHandler gd32f30x_it.o + 0x0800267a 0x0800267a 0x00000008 Code RO 207 i.USBD_LP_CAN0_RX0_IRQHandler gd32f30x_it.o + 0x08002682 0x08002682 0x00000002 PAD + 0x08002684 0x08002684 0x000000c4 Code RO 5525 i.Upgrade_BeaconQuery transparentupgrade.o + 0x08002748 0x08002748 0x00000016 Code RO 5526 i.Upgrade_CRC transparentupgrade.o + 0x0800275e 0x0800275e 0x00000002 PAD + 0x08002760 0x08002760 0x00000028 Code RO 5527 i.Upgrade_CheckNextPackArrive transparentupgrade.o + 0x08002788 0x08002788 0x00000028 Code RO 5528 i.Upgrade_ClrBit transparentupgrade.o + 0x080027b0 0x080027b0 0x0000000c Code RO 5529 i.Upgrade_DelayUs transparentupgrade.o + 0x080027bc 0x080027bc 0x00000030 Code RO 5530 i.Upgrade_GetBit transparentupgrade.o + 0x080027ec 0x080027ec 0x0000003c Code RO 5532 i.Upgrade_ParameterInit transparentupgrade.o + 0x08002828 0x08002828 0x0000008c Code RO 5533 i.Upgrade_PassThrough_CheckHead transparentupgrade.o + 0x080028b4 0x080028b4 0x000000f0 Code RO 5534 i.Upgrade_RfSendCallBack transparentupgrade.o + 0x080029a4 0x080029a4 0x000000e8 Code RO 5535 i.Upgrade_SendBeacon transparentupgrade.o + 0x08002a8c 0x08002a8c 0x000000e4 Code RO 5536 i.Upgrade_SendPassThroughPack transparentupgrade.o + 0x08002b70 0x08002b70 0x00000034 Code RO 5537 i.Upgrade_Start transparentupgrade.o + 0x08002ba4 0x08002ba4 0x0000001c Code RO 5538 i.Upgrade_StartGetNextPack transparentupgrade.o + 0x08002bc0 0x08002bc0 0x000002f0 Code RO 5539 i.Upgrade_TickHandler transparentupgrade.o + 0x08002eb0 0x08002eb0 0x0000002c Code RO 5540 i.Upgrade_TxPayload transparentupgrade.o + 0x08002edc 0x08002edc 0x00000022 Code RO 5541 i.Upgrade_WaitRfSendOK transparentupgrade.o + 0x08002efe 0x08002efe 0x00000004 Code RO 208 i.UsageFault_Handler gd32f30x_it.o + 0x08002f02 0x08002f02 0x00000020 Code RO 3884 i._0x60_basic_delay_ms base_process_pc_cmd_0x60.o + 0x08002f22 0x08002f22 0x00000002 PAD + 0x08002f24 0x08002f24 0x000002f4 Code RO 3912 i._0x61_AUX_CONFIG_sub base_process_pc_cmd_0x61.o + 0x08003218 0x08003218 0x00000170 Code RO 3913 i._0x61_soft_dog_sub base_process_pc_cmd_0x61.o + 0x08003388 0x08003388 0x0000001e Code RO 3455 i._24R1_delay_us rf24l01 - multi.o + 0x080033a6 0x080033a6 0x00000002 PAD + 0x080033a8 0x080033a8 0x00000070 Code RO 5887 i._DoInit segger_rtt.o + 0x08003418 0x08003418 0x0000001c Code RO 5888 i._GetAvailWriteSpace segger_rtt.o + 0x08003434 0x08003434 0x000000ec Code RO 6052 i._PrintInt segger_rtt_printf.o + 0x08003520 0x08003520 0x000000ec Code RO 6053 i._PrintUnsigned segger_rtt_printf.o + 0x0800360c 0x0800360c 0x00000044 Code RO 6054 i._StoreChar segger_rtt_printf.o + 0x08003650 0x08003650 0x00000072 Code RO 5890 i._WriteBlocking segger_rtt.o + 0x080036c2 0x080036c2 0x0000004c Code RO 5891 i._WriteNoCheck segger_rtt.o + 0x0800370e 0x0800370e 0x0000000e Code RO 7136 i.__scatterload_copy mc_w.l(handlers.o) + 0x0800371c 0x0800371c 0x00000002 Code RO 7137 i.__scatterload_null mc_w.l(handlers.o) + 0x0800371e 0x0800371e 0x0000000e Code RO 7138 i.__scatterload_zeroinit mc_w.l(handlers.o) + 0x0800372c 0x0800372c 0x0000006c Code RO 5227 i._dbg_function__response_pc_cmd function_debug.o + 0x08003798 0x08003798 0x00000064 Code RO 3700 i._debug_core__RTT_read base_core.o + 0x080037fc 0x080037fc 0x00000002 Code RO 3701 i._debug_core__init base_core.o + 0x080037fe 0x080037fe 0x00000002 PAD + 0x08003800 0x08003800 0x00000080 Code RO 3702 i._debug_core__init_parameter_datapos_change base_core.o + 0x08003880 0x08003880 0x0000014c Code RO 3703 i._debug_core__printf base_core.o + 0x080039cc 0x080039cc 0x0000002c Code RO 3704 i._debug_core__record_ackkp_info base_core.o + 0x080039f8 0x080039f8 0x00000002 Code RO 3705 i._debug_core__record_pcack_info base_core.o + 0x080039fa 0x080039fa 0x00000002 PAD + 0x080039fc 0x080039fc 0x00000048 Code RO 3706 i._debug_core__record_rxkp_info base_core.o + 0x08003a44 0x08003a44 0x00000002 Code RO 3707 i._debug_core__record_txpc_info base_core.o + 0x08003a46 0x08003a46 0x00000002 Code RO 3708 i._debug_core__record_txpc_info_report base_core.o + 0x08003a48 0x08003a48 0x00000030 Code RO 5228 i._debug_function_enter function_debug.o + 0x08003a78 0x08003a78 0x00000018 Code RO 3709 i._debug_set_subject base_core.o + 0x08003a90 0x08003a90 0x00000030 Code RO 2853 i._usb_bos_desc_get usbd_enum.o + 0x08003ac0 0x08003ac0 0x00000020 Code RO 2854 i._usb_config_desc_get usbd_enum.o + 0x08003ae0 0x08003ae0 0x00000014 Code RO 2855 i._usb_dev_desc_get usbd_enum.o + 0x08003af4 0x08003af4 0x00000052 Code RO 3013 i._usb_in0_transc usbd_transc.o + 0x08003b46 0x08003b46 0x00000044 Code RO 3014 i._usb_out0_transc usbd_transc.o + 0x08003b8a 0x08003b8a 0x000000a8 Code RO 3015 i._usb_setup_transc usbd_transc.o + 0x08003c32 0x08003c32 0x0000007c Code RO 2856 i._usb_std_clearfeature usbd_enum.o + 0x08003cae 0x08003cae 0x0000003c Code RO 2857 i._usb_std_getconfiguration usbd_enum.o + 0x08003cea 0x08003cea 0x00000002 PAD + 0x08003cec 0x08003cec 0x00000110 Code RO 2858 i._usb_std_getdescriptor usbd_enum.o + 0x08003dfc 0x08003dfc 0x0000003e Code RO 2859 i._usb_std_getinterface usbd_enum.o + 0x08003e3a 0x08003e3a 0x00000002 PAD + 0x08003e3c 0x08003e3c 0x000000c8 Code RO 2860 i._usb_std_getstatus usbd_enum.o + 0x08003f04 0x08003f04 0x00000006 Code RO 2861 i._usb_std_reserved usbd_enum.o + 0x08003f0a 0x08003f0a 0x0000002e Code RO 2862 i._usb_std_setaddress usbd_enum.o + 0x08003f38 0x08003f38 0x000000a4 Code RO 2863 i._usb_std_setconfiguration usbd_enum.o + 0x08003fdc 0x08003fdc 0x00000006 Code RO 2864 i._usb_std_setdescriptor usbd_enum.o + 0x08003fe2 0x08003fe2 0x00000070 Code RO 2865 i._usb_std_setfeature usbd_enum.o + 0x08004052 0x08004052 0x00000030 Code RO 2866 i._usb_std_setinterface usbd_enum.o + 0x08004082 0x08004082 0x00000006 Code RO 2867 i._usb_std_synchframe usbd_enum.o + 0x08004088 0x08004088 0x00000014 Code RO 2868 i._usb_str_desc_get usbd_enum.o + 0x0800409c 0x0800409c 0x00000034 Code RO 4874 i.aes_init function_aes.o + 0x080040d0 0x080040d0 0x00000058 Code RO 4875 i.aes_keycode_upgrade function_aes.o + 0x08004128 0x08004128 0x0000006c Code RO 4876 i.aes_load_fastmatch_data function_aes.o + 0x08004194 0x08004194 0x00000074 Code RO 4877 i.aes_test function_aes.o + 0x08004208 0x08004208 0x00000034 Code RO 3299 i.ant_sw platform.o + 0x0800423c 0x0800423c 0x00000070 Code RO 4084 i.assert_base_channel base_process_tx_keypad.o + 0x080042ac 0x080042ac 0x00000024 Code RO 3942 i.assert_base_id base_process_pc_enter.o + 0x080042d0 0x080042d0 0x00000050 Code RO 3943 i.assert_base_log_mode base_process_pc_enter.o + 0x08004320 0x08004320 0x0000002c Code RO 5421 i.auth_all_keypad function_whitelist.o + 0x0800434c 0x0800434c 0x00000030 Code RO 5422 i.auth_special_keypad function_whitelist.o + 0x0800437c 0x0800437c 0x00000024 Code RO 5244 i.auto_search_freq_enter function_monitor_freq.o + 0x080043a0 0x080043a0 0x0000007c Code RO 5181 i.base_broadcast_process_2ms5 function_broadcast.o + 0x0800441c 0x0800441c 0x000000b4 Code RO 5182 i.base_broadcast_sub function_broadcast.o + 0x080044d0 0x080044d0 0x00000244 Code RO 4085 i.base_confirm_keypad_crs2_mode base_process_tx_keypad.o + 0x08004714 0x08004714 0x000000b8 Code RO 4086 i.base_confirm_keypad_id_mode base_process_tx_keypad.o + 0x080047cc 0x080047cc 0x00000118 Code RO 4087 i.base_confirm_keypad_sn_mode base_process_tx_keypad.o + 0x080048e4 0x080048e4 0x00000068 Code RO 5423 i.base_confirm_keypad_whitelist_request function_whitelist.o + 0x0800494c 0x0800494c 0x00000084 Code RO 4220 i.base_core_20ms_isr base_timer.o + 0x080049d0 0x080049d0 0x00000002 Code RO 4221 i.base_core_28ms_isr base_timer.o + 0x080049d2 0x080049d2 0x0000000c Code RO 4222 i.base_core_2ms5_isr base_timer.o + 0x080049de 0x080049de 0x00000002 PAD + 0x080049e0 0x080049e0 0x00000028 Code RO 3710 i.base_core_force_sysmode0 base_core.o + 0x08004a08 0x08004a08 0x0000001c Code RO 3711 i.base_core_init_all base_core.o + 0x08004a24 0x08004a24 0x0000002c Code RO 3712 i.base_core_main_loop base_core.o + 0x08004a50 0x08004a50 0x00000024 Code RO 4878 i.base_is_auto_match function_aes.o + 0x08004a74 0x08004a74 0x00000016 Code RO 4020 i.base_process_keyapad_init base_process_rx_keypad.o + 0x08004a8a 0x08004a8a 0x00000062 Code RO 3944 i.base_process_pc_data base_process_pc_enter.o + 0x08004aec 0x08004aec 0x0000000c Code RO 3945 i.base_process_pc_init base_process_pc_enter.o + 0x08004af8 0x08004af8 0x0000003c Code RO 4322 i.base_read_e2prom function_e2prom.o + 0x08004b34 0x08004b34 0x00000318 Code RO 4323 i.base_read_e2prom_parameter function_e2prom.o + 0x08004e4c 0x08004e4c 0x0000000c Code RO 4088 i.base_send_beacon_switch base_process_tx_keypad.o + 0x08004e58 0x08004e58 0x000001b8 Code RO 4089 i.base_tx_basic_beacon base_process_tx_keypad.o + 0x08005010 0x08005010 0x00000068 Code RO 4090 i.base_tx_ext_basic_beacon base_process_tx_keypad.o + 0x08005078 0x08005078 0x00000074 Code RO 4091 i.base_tx_ext_vbeacon base_process_tx_keypad.o + 0x080050ec 0x080050ec 0x000001d8 Code RO 4092 i.base_tx_keypad_beacon base_process_tx_keypad.o + 0x080052c4 0x080052c4 0x0000006c Code RO 4093 i.base_tx_to_keypad_sub base_process_tx_keypad.o + 0x08005330 0x08005330 0x00000054 Code RO 3946 i.base_tx_to_pc_sub base_process_pc_enter.o + 0x08005384 0x08005384 0x00000240 Code RO 4094 i.base_tx_vote_beacon base_process_tx_keypad.o + 0x080055c4 0x080055c4 0x00000034 Code RO 4324 i.base_write_e2prom function_e2prom.o + 0x080055f8 0x080055f8 0x00000014 Code RO 4637 i.basetest_get_status fucntion_base_test.o + 0x0800560c 0x0800560c 0x0000001c Code RO 4638 i.basetest_init fucntion_base_test.o + 0x08005628 0x08005628 0x00000100 Code RO 4639 i.basetest_progress fucntion_base_test.o + 0x08005728 0x08005728 0x00000058 Code RO 4640 i.basetest_rx_and_ack_pc fucntion_base_test.o + 0x08005780 0x08005780 0x00000020 Code RO 3300 i.basic_delay_ms platform.o + 0x080057a0 0x080057a0 0x0000001e Code RO 3301 i.basic_delay_us platform.o + 0x080057be 0x080057be 0x0000001a Code RO 5542 i.basic_delay_us_update transparentupgrade.o + 0x080057d8 0x080057d8 0x00000012 Code RO 3156 i.beep_ctrl buzzer.o + 0x080057ea 0x080057ea 0x00000002 PAD + 0x080057ec 0x080057ec 0x0000010c Code RO 5183 i.broadcast_config function_broadcast.o + 0x080058f8 0x080058f8 0x00000032 Code RO 4325 i.calc_custom_rf_sync_code function_e2prom.o + 0x0800592a 0x0800592a 0x00000002 PAD + 0x0800592c 0x0800592c 0x00000020 Code RO 4355 i.calc_next_multi_chan multi_channel.o + 0x0800594c 0x0800594c 0x0000003a Code RO 5424 i.calc_valid_list_cnt function_whitelist.o + 0x08005986 0x08005986 0x00000002 PAD + 0x08005988 0x08005988 0x00000038 Code RO 5245 i.check_disturb function_monitor_freq.o + 0x080059c0 0x080059c0 0x00000018 Code RO 4671 i.check_fastmatch_lowerPA fucntion_fastmatch.o + 0x080059d8 0x080059d8 0x00000030 Code RO 4095 i.check_send_ext_basic_beacon base_process_tx_keypad.o + 0x08005a08 0x08005a08 0x000000a4 Code RO 4096 i.check_send_ext_vbeacon base_process_tx_keypad.o + 0x08005aac 0x08005aac 0x00000028 Code RO 4356 i.conver_id multi_channel.o + 0x08005ad4 0x08005ad4 0x00000002 Code RO 4306 i.core_debug_enter debug.o + 0x08005ad6 0x08005ad6 0x00000002 PAD + 0x08005ad8 0x08005ad8 0x00000054 Code RO 4246 i.crc16 common_math.o + 0x08005b2c 0x08005b2c 0x00000002 Code RO 3067 i.custom_hid_data_in custom_hid_core.o + 0x08005b2e 0x08005b2e 0x00000002 PAD + 0x08005b30 0x08005b30 0x00000048 Code RO 3068 i.custom_hid_data_out custom_hid_core.o + 0x08005b78 0x08005b78 0x0000001a Code RO 3069 i.custom_hid_deinit custom_hid_core.o + 0x08005b92 0x08005b92 0x00000002 PAD + 0x08005b94 0x08005b94 0x00000084 Code RO 3070 i.custom_hid_init custom_hid_core.o + 0x08005c18 0x08005c18 0x00000010 Code RO 3071 i.custom_hid_itfop_register custom_hid_core.o + 0x08005c28 0x08005c28 0x00000018 Code RO 3072 i.custom_hid_report_send custom_hid_core.o + 0x08005c40 0x08005c40 0x000000f4 Code RO 3073 i.custom_hid_req_handler custom_hid_core.o + 0x08005d34 0x08005d34 0x0000006c Code RO 3713 i.debug_check_allerr base_core.o + 0x08005da0 0x08005da0 0x0000001a Code RO 3715 i.debug_set_buf_bit base_core.o + 0x08005dba 0x08005dba 0x00000002 PAD + 0x08005dbc 0x08005dbc 0x0000008c Code RO 5714 i.decrypt aes.o + 0x08005e48 0x08005e48 0x00000038 Code RO 5184 i.det_blank_content function_broadcast.o + 0x08005e80 0x08005e80 0x0000003c Code RO 4097 i.doule_ant_application base_process_tx_keypad.o + 0x08005ebc 0x08005ebc 0x0000001e Code RO 3456 i.drv_spi_read_write_byte rf24l01 - multi.o + 0x08005eda 0x08005eda 0x00000024 Code RO 3457 i.drv_spi_read_write_byte_N rf24l01 - multi.o + 0x08005efe 0x08005efe 0x00000020 Code RO 4357 i.e2prom_write_delay_ms multi_channel.o + 0x08005f1e 0x08005f1e 0x00000002 PAD + 0x08005f20 0x08005f20 0x00000088 Code RO 5715 i.encrypt aes.o + 0x08005fa8 0x08005fa8 0x0000000c Code RO 770 i.exti_interrupt_flag_clear gd32f30x_exti.o + 0x08005fb4 0x08005fb4 0x00000024 Code RO 771 i.exti_interrupt_flag_get gd32f30x_exti.o + 0x08005fd8 0x08005fd8 0x00000078 Code RO 4672 i.fastmatch_enter_exit fucntion_fastmatch.o + 0x08006050 0x08006050 0x000000bc Code RO 4673 i.fastmatch_load_info_to_vote_beacon fucntion_fastmatch.o + 0x0800610c 0x0800610c 0x00000020 Code RO 4674 i.fastmatch_lowerPA_ack fucntion_fastmatch.o + 0x0800612c 0x0800612c 0x00000048 Code RO 4675 i.fastmatch_lowerPA_ack_sub fucntion_fastmatch.o + 0x08006174 0x08006174 0x0000000c Code RO 4676 i.fastmatch_lowerPA_setup fucntion_fastmatch.o + 0x08006180 0x08006180 0x0000000c Code RO 4677 i.fastmatch_status fucntion_fastmatch.o + 0x0800618c 0x0800618c 0x0000003c Code RO 4678 i.fastmatch_success_check fucntion_fastmatch.o + 0x080061c8 0x080061c8 0x00000050 Code RO 7015 i.free mc_w.l(malloc.o) + 0x08006218 0x08006218 0x00000064 Code RO 4879 i.generate_default_key0_code function_aes.o + 0x0800627c 0x0800627c 0x0000000c Code RO 5717 i.getSBoxValue aes.o + 0x08006288 0x08006288 0x00000014 Code RO 4880 i.get_aes_key function_aes.o + 0x0800629c 0x0800629c 0x0000001c Code RO 4881 i.get_aes_status function_aes.o + 0x080062b8 0x080062b8 0x0000000c Code RO 3947 i.get_base_id base_process_pc_enter.o + 0x080062c4 0x080062c4 0x0000000c Code RO 3948 i.get_base_log_mode base_process_pc_enter.o + 0x080062d0 0x080062d0 0x0000000c Code RO 4358 i.get_base_main_rfchannel multi_channel.o + 0x080062dc 0x080062dc 0x0000003c Code RO 3949 i.get_base_match_code base_process_pc_enter.o + 0x08006318 0x08006318 0x0000000c Code RO 4098 i.get_base_send_beacon_status base_process_tx_keypad.o + 0x08006324 0x08006324 0x00000068 Code RO 3716 i.get_base_status base_core.o + 0x0800638c 0x0800638c 0x0000000e Code RO 3717 i.get_core_version base_core.o + 0x0800639a 0x0800639a 0x00000002 PAD + 0x0800639c 0x0800639c 0x0000000c Code RO 3718 i.get_datapos base_core.o + 0x080063a8 0x080063a8 0x00000040 Code RO 4359 i.get_error_info multi_channel.o + 0x080063e8 0x080063e8 0x0000000c Code RO 4099 i.get_ext_basicbeacon_startup_flag base_process_tx_keypad.o + 0x080063f4 0x080063f4 0x00000004 Code RO 4360 i.get_mainRF_usr_id multi_channel.o + 0x080063f8 0x080063f8 0x0000000c Code RO 4361 i.get_main_rf_hard_id multi_channel.o + 0x08006404 0x08006404 0x0000000a Code RO 5425 i.get_offset function_whitelist.o + 0x0800640e 0x0800640e 0x00000002 PAD + 0x08006410 0x08006410 0x000000b0 Code RO 4599 i.get_packing_parameter vote__report.o + 0x080064c0 0x080064c0 0x0000000c Code RO 3719 i.get_pc_connect_status base_core.o + 0x080064cc 0x080064cc 0x0000000c Code RO 3720 i.get_pc_connect_status_acc base_core.o + 0x080064d8 0x080064d8 0x00000014 Code RO 3721 i.get_permit_dispaly_status base_core.o + 0x080064ec 0x080064ec 0x00000034 Code RO 3304 i.get_stm32_chip_id platform.o + 0x08006520 0x08006520 0x0000000c Code RO 3458 i.get_tx_ok_flag rf24l01 - multi.o + 0x0800652c 0x0800652c 0x00000018 Code RO 3305 i.get_usb_status platform.o + 0x08006544 0x08006544 0x00000010 Code RO 4362 i.get_whitelist_rfid multi_channel.o + 0x08006554 0x08006554 0x00000004 Code RO 1073 i.gpio_bit_reset gd32f30x_gpio.o + 0x08006558 0x08006558 0x00000004 Code RO 1074 i.gpio_bit_set gd32f30x_gpio.o + 0x0800655c 0x0800655c 0x00000018 Code RO 346 i.gpio_config gd32f30x_usbd_hw.o + 0x08006574 0x08006574 0x000000bc Code RO 1083 i.gpio_init gd32f30x_gpio.o + 0x08006630 0x08006630 0x00000010 Code RO 1084 i.gpio_input_bit_get gd32f30x_gpio.o + 0x08006640 0x08006640 0x0000000e Code RO 3188 i.i2c_delay i2c.o + 0x0800664e 0x0800664e 0x00000002 PAD + 0x08006650 0x08006650 0x00000084 Code RO 3190 i.i2c_read_byte i2c.o + 0x080066d4 0x080066d4 0x000000c0 Code RO 3191 i.i2c_send_byte i2c.o + 0x08006794 0x08006794 0x00000048 Code RO 3192 i.i2c_start i2c.o + 0x080067dc 0x080067dc 0x00000048 Code RO 3193 i.i2c_stop i2c.o + 0x08006824 0x08006824 0x0000003e Code RO 2869 i.int_to_unicode usbd_enum.o + 0x08006862 0x08006862 0x00000002 Code RO 319 i.key_config custom_hid_itf.o + 0x08006864 0x08006864 0x0000002c Code RO 4100 i.keypad_crc_check base_process_tx_keypad.o + 0x08006890 0x08006890 0x00000138 Code RO 4021 i.keypad_crs2_mode base_process_rx_keypad.o + 0x080069c8 0x080069c8 0x00000158 Code RO 4022 i.keypad_id_mode base_process_rx_keypad.o + 0x08006b20 0x08006b20 0x00000054 Code RO 4101 i.keypad_idsn_clear base_process_tx_keypad.o + 0x08006b74 0x08006b74 0x0000002c Code RO 5426 i.keypad_idsn_record_whitelist_request function_whitelist.o + 0x08006ba0 0x08006ba0 0x00000100 Code RO 4102 i.keypad_idsn_save base_process_tx_keypad.o + 0x08006ca0 0x08006ca0 0x00000218 Code RO 4025 i.keypad_rf_data_process_NO_fifo base_process_rx_keypad.o + 0x08006eb8 0x08006eb8 0x0000000e Code RO 4026 i.keypad_rf_data_save base_process_rx_keypad.o + 0x08006ec6 0x08006ec6 0x00000002 PAD + 0x08006ec8 0x08006ec8 0x00000064 Code RO 4027 i.keypad_sn_mode base_process_rx_keypad.o + 0x08006f2c 0x08006f2c 0x00000044 Code RO 4514 i.keypad_transfer2pc_data_fetch transfer_keypad_pc.o + 0x08006f70 0x08006f70 0x00000018 Code RO 4515 i.keypad_transfer2pc_data_save transfer_keypad_pc.o + 0x08006f88 0x08006f88 0x00000018 Code RO 4028 i.kprx_init_queue base_process_rx_keypad.o + 0x08006fa0 0x08006fa0 0x00000030 Code RO 3264 i.led1_control led.o + 0x08006fd0 0x08006fd0 0x00000030 Code RO 3265 i.led2_control led.o + 0x08007000 0x08007000 0x00000002 Code RO 320 i.led_config custom_hid_itf.o + 0x08007002 0x08007002 0x00000002 Code RO 5543 i.log_debug transparentupgrade.o + 0x08007004 0x08007004 0x00000078 Code RO 6 i.main main.o + 0x0800707c 0x0800707c 0x0000006c Code RO 7016 i.malloc mc_w.l(malloc.o) + 0x080070e8 0x080070e8 0x00000022 Code RO 4248 i.mem_compare common_math.o + 0x0800710a 0x0800710a 0x00000016 Code RO 4249 i.mem_cpy common_math.o + 0x08007120 0x08007120 0x00000014 Code RO 4251 i.mem_set common_math.o + 0x08007134 0x08007134 0x00000050 Code RO 5246 i.monitor_freq_ack_pc function_monitor_freq.o + 0x08007184 0x08007184 0x000000fc Code RO 5247 i.monitor_freq_process function_monitor_freq.o + 0x08007280 0x08007280 0x00000074 Code RO 5248 i.monitor_rf_data function_monitor_freq.o + 0x080072f4 0x080072f4 0x0000000c Code RO 4735 i.msg_delay_us fucntion_text_message.o + 0x08007300 0x08007300 0x0000014c Code RO 4736 i.msg_get_pc_data fucntion_text_message.o + 0x0800744c 0x0800744c 0x0000006c Code RO 4738 i.msg_issendtime fucntion_text_message.o + 0x080074b8 0x080074b8 0x00000058 Code RO 4739 i.msg_polling fucntion_text_message.o + 0x08007510 0x08007510 0x00000030 Code RO 4740 i.msg_recover_beacon_countdown fucntion_text_message.o + 0x08007540 0x08007540 0x000000b8 Code RO 4741 i.msg_send fucntion_text_message.o + 0x080075f8 0x080075f8 0x0000000c Code RO 4742 i.msg_set_status fucntion_text_message.o + 0x08007604 0x08007604 0x0000002c Code RO 4743 i.msg_tx_payload fucntion_text_message.o + 0x08007630 0x08007630 0x00000022 Code RO 4744 i.msg_wait_rfsendOK fucntion_text_message.o + 0x08007652 0x08007652 0x00000002 PAD + 0x08007654 0x08007654 0x000000f0 Code RO 4363 i.multi_chan_init multi_channel.o + 0x08007744 0x08007744 0x0000008c Code RO 4364 i.multi_chan_polling multi_channel.o + 0x080077d0 0x080077d0 0x00000014 Code RO 5284 i.network_creat_random_delay function_network.o + 0x080077e4 0x080077e4 0x00000020 Code RO 5285 i.network_get_name function_network.o + 0x08007804 0x08007804 0x0000000c Code RO 5286 i.network_get_nameview function_network.o + 0x08007810 0x08007810 0x0000000c Code RO 5287 i.network_get_netseq function_network.o + 0x0800781c 0x0800781c 0x0000000c Code RO 5288 i.network_get_pwd function_network.o + 0x08007828 0x08007828 0x00000058 Code RO 5289 i.network_polling function_network.o + 0x08007880 0x08007880 0x0000004c Code RO 5290 i.network_randtime function_network.o + 0x080078cc 0x080078cc 0x00000020 Code RO 5291 i.network_set_name function_network.o + 0x080078ec 0x080078ec 0x00000018 Code RO 5292 i.network_set_nameview function_network.o + 0x08007904 0x08007904 0x00000010 Code RO 5293 i.network_set_netseq_change function_network.o + 0x08007914 0x08007914 0x0000000c Code RO 5294 i.network_set_pwd function_network.o + 0x08007920 0x08007920 0x0000015c Code RO 5295 i.network_tx_beacon function_network.o + 0x08007a7c 0x08007a7c 0x00000020 Code RO 347 i.nvic_config gd32f30x_usbd_hw.o + 0x08007a9c 0x08007a9c 0x000000c4 Code RO 1201 i.nvic_irq_enable gd32f30x_misc.o + 0x08007b60 0x08007b60 0x00000014 Code RO 1202 i.nvic_priority_group_set gd32f30x_misc.o + 0x08007b74 0x08007b74 0x00000040 Code RO 3885 i.pc_cmd_0x60_ack base_process_pc_cmd_0x60.o + 0x08007bb4 0x08007bb4 0x000001e8 Code RO 3886 i.pc_cmd_0x60_process base_process_pc_cmd_0x60.o + 0x08007d9c 0x08007d9c 0x00000040 Code RO 3914 i.pc_cmd_0x61_ack base_process_pc_cmd_0x61.o + 0x08007ddc 0x08007ddc 0x000001fc Code RO 3915 i.pc_cmd_0x61_process base_process_pc_cmd_0x61.o + 0x08007fd8 0x08007fd8 0x0000009c Code RO 4516 i.pc_transfer2keypad_data_fetch transfer_keypad_pc.o + 0x08008074 0x08008074 0x0000002c Code RO 4517 i.pc_transfer2keypad_data_save transfer_keypad_pc.o + 0x080080a0 0x080080a0 0x0000001c Code RO 3950 i.pcrx_data_fetch base_process_pc_enter.o + 0x080080bc 0x080080bc 0x00000018 Code RO 3951 i.pcrx_data_save base_process_pc_enter.o + 0x080080d4 0x080080d4 0x00000018 Code RO 3952 i.pcrx_init_queue base_process_pc_enter.o + 0x080080ec 0x080080ec 0x00000044 Code RO 5185 i.process_keypad_broadcast_requst function_broadcast.o + 0x08008130 0x08008130 0x00000060 Code RO 4882 i.process_pc_aes_config function_aes.o + 0x08008190 0x08008190 0x00000034 Code RO 4365 i.process_setup_multi_chan multi_channel.o + 0x080081c4 0x080081c4 0x00000038 Code RO 4366 i.process_setup_single_chan multi_channel.o + 0x080081fc 0x080081fc 0x0000005c Code RO 4478 i.queue_in queue_circle.o + 0x08008258 0x08008258 0x0000000e Code RO 4479 i.queue_init queue_circle.o + 0x08008266 0x08008266 0x00000002 PAD + 0x08008268 0x08008268 0x00000058 Code RO 4480 i.queue_out queue_circle.o + 0x080082c0 0x080082c0 0x00000034 Code RO 4481 i.queue_out_get_type queue_circle.o + 0x080082f4 0x080082f4 0x0000006c Code RO 4482 i.queue_out_special queue_circle.o + 0x08008360 0x08008360 0x0000015c Code RO 1400 i.rcu_clock_freq_get gd32f30x_rcu.o + 0x080084bc 0x080084bc 0x000000b8 Code RO 348 i.rcu_config gd32f30x_usbd_hw.o + 0x08008574 0x08008574 0x00000020 Code RO 1418 i.rcu_periph_clock_enable gd32f30x_rcu.o + 0x08008594 0x08008594 0x00000018 Code RO 1429 i.rcu_usb_clock_config gd32f30x_rcu.o + 0x080085ac 0x080085ac 0x00000038 Code RO 4883 i.read_AES_config function_aes.o + 0x080085e4 0x080085e4 0x00000094 Code RO 4884 i.read_keycode function_aes.o + 0x08008678 0x08008678 0x00000028 Code RO 3722 i.refresh_pc_connect_status base_core.o + 0x080086a0 0x080086a0 0x00000028 Code RO 3723 i.refresh_rcvRF_indicate base_core.o + 0x080086c8 0x080086c8 0x0000013c Code RO 4885 i.rf_Decrypt function_aes.o + 0x08008804 0x08008804 0x00000124 Code RO 4886 i.rf_Encrypt function_aes.o + 0x08008928 0x08008928 0x000000c4 Code RO 3460 i.rf_SendPacket rf24l01 - multi.o + 0x080089ec 0x080089ec 0x00000048 Code RO 4367 i.rf_error_ack_pc multi_channel.o + 0x08008a34 0x08008a34 0x00000054 Code RO 4368 i.rf_error_warning multi_channel.o + 0x08008a88 0x08008a88 0x000000a8 Code RO 3461 i.rf_initial rf24l01 - multi.o + 0x08008b30 0x08008b30 0x00000002 Code RO 4369 i.rf_modual__check multi_channel.o + 0x08008b32 0x08008b32 0x00000002 PAD + 0x08008b34 0x08008b34 0x0000001c Code RO 4370 i.rf_modual__tx_counter multi_channel.o + 0x08008b50 0x08008b50 0x00000050 Code RO 3462 i.rf_set_PA_Mode rf24l01 - multi.o + 0x08008ba0 0x08008ba0 0x0000003c Code RO 3463 i.rf_set_syncode rf24l01 - multi.o + 0x08008bdc 0x08008bdc 0x0000001e Code RO 3464 i.rf_setfreq rf24l01 - multi.o + 0x08008bfa 0x08008bfa 0x00000002 PAD + 0x08008bfc 0x08008bfc 0x00000020 Code RO 5544 i.save_keypad_ack_data transparentupgrade.o + 0x08008c1c 0x08008c1c 0x00000038 Code RO 5427 i.search_special_list function_whitelist.o + 0x08008c54 0x08008c54 0x00000060 Code RO 4103 i.send_to_keypad_user_hardID base_process_tx_keypad.o + 0x08008cb4 0x08008cb4 0x00000050 Code RO 2870 i.serial_string_get usbd_enum.o + 0x08008d04 0x08008d04 0x0000003c Code RO 3724 i.set_base_hard_firmware_info base_core.o + 0x08008d40 0x08008d40 0x0000000c Code RO 4104 i.set_ext_basicbeacon_startup_flag base_process_tx_keypad.o + 0x08008d4c 0x08008d4c 0x00000044 Code RO 4105 i.set_keypad_crc_config base_process_tx_keypad.o + 0x08008d90 0x08008d90 0x00000028 Code RO 3308 i.set_pc_communication_type platform.o + 0x08008db8 0x08008db8 0x0000000c Code RO 3465 i.set_tx_ok_flag rf24l01 - multi.o + 0x08008dc4 0x08008dc4 0x00000068 Code RO 4372 i.setup_multi_info multi_channel.o + 0x08008e2c 0x08008e2c 0x00000030 Code RO 4373 i.single_relevant_to_multi_chan multi_channel.o + 0x08008e5c 0x08008e5c 0x0000000a Code RO 1660 i.spi_enable gd32f30x_spi.o + 0x08008e66 0x08008e66 0x00000008 Code RO 1662 i.spi_i2s_data_receive gd32f30x_spi.o + 0x08008e6e 0x08008e6e 0x00000004 Code RO 1663 i.spi_i2s_data_transmit gd32f30x_spi.o + 0x08008e72 0x08008e72 0x00000010 Code RO 1665 i.spi_i2s_flag_get gd32f30x_spi.o + 0x08008e82 0x08008e82 0x00000032 Code RO 1669 i.spi_init gd32f30x_spi.o + 0x08008eb4 0x08008eb4 0x00000048 Code RO 5186 i.startup_broadcast function_broadcast.o + 0x08008efc 0x08008efc 0x0000010c Code RO 380 i.system_clock_120m_hxtal system_gd32f30x.o + 0x08009008 0x08009008 0x00000008 Code RO 381 i.system_clock_config system_gd32f30x.o + 0x08009010 0x08009010 0x00000098 Code RO 3725 i.timer_20ms_function base_core.o + 0x080090a8 0x080090a8 0x00000004 Code RO 1897 i.timer_autoreload_value_config gd32f30x_timer.o + 0x080090ac 0x080090ac 0x00000008 Code RO 1921 i.timer_counter_read gd32f30x_timer.o + 0x080090b4 0x080090b4 0x00000004 Code RO 1923 i.timer_counter_value_config gd32f30x_timer.o + 0x080090b8 0x080090b8 0x0000000a Code RO 1929 i.timer_enable gd32f30x_timer.o + 0x080090c2 0x080090c2 0x00000002 PAD + 0x080090c4 0x080090c4 0x00000098 Code RO 1939 i.timer_init gd32f30x_timer.o + 0x0800915c 0x0800915c 0x00000008 Code RO 1945 i.timer_interrupt_disable gd32f30x_timer.o + 0x08009164 0x08009164 0x00000008 Code RO 1946 i.timer_interrupt_enable gd32f30x_timer.o + 0x0800916c 0x0800916c 0x00000006 Code RO 1947 i.timer_interrupt_flag_clear gd32f30x_timer.o + 0x08009172 0x08009172 0x00000018 Code RO 1948 i.timer_interrupt_flag_get gd32f30x_timer.o + 0x0800918a 0x0800918a 0x0000000e Code RO 1952 i.timer_prescaler_config gd32f30x_timer.o + 0x08009198 0x08009198 0x00000018 Code RO 4518 i.transfer2kp_init_queue transfer_keypad_pc.o + 0x080091b0 0x080091b0 0x00000018 Code RO 4519 i.transfer2pc_init_queue transfer_keypad_pc.o + 0x080091c8 0x080091c8 0x00000002 Code RO 3309 i.uart1_send_datas platform.o + 0x080091ca 0x080091ca 0x00000002 PAD + 0x080091cc 0x080091cc 0x00000038 Code RO 5545 i.updat__exit transparentupgrade.o + 0x08009204 0x08009204 0x00000024 Code RO 5546 i.update_2_timer transparentupgrade.o + 0x08009228 0x08009228 0x00000004 Code RO 5547 i.update_get_status transparentupgrade.o + 0x0800922c 0x0800922c 0x000000ec Code RO 5548 i.update_kp_enter transparentupgrade.o + 0x08009318 0x08009318 0x00000002 Code RO 5549 i.update_kp_progress transparentupgrade.o + 0x0800931a 0x0800931a 0x00000002 Code RO 5550 i.update_monitor_sdk_connect transparentupgrade.o + 0x0800931c 0x0800931c 0x00000044 Code RO 5551 i.update_request_pkt_to_pc transparentupgrade.o + 0x08009360 0x08009360 0x00000012 Code RO 3016 i.usb_ctl_out usbd_transc.o + 0x08009372 0x08009372 0x00000014 Code RO 3017 i.usb_ctl_status_in usbd_transc.o + 0x08009386 0x08009386 0x00000016 Code RO 3018 i.usb_stall_transc usbd_transc.o + 0x0800939c 0x0800939c 0x00000008 Code RO 2803 i.usb_transc_config usbd_core.o + 0x080093a4 0x080093a4 0x00000008 Code RO 2871 i.usb_transc_config usbd_enum.o + 0x080093ac 0x080093ac 0x00000008 Code RO 3074 i.usb_transc_config custom_hid_core.o + 0x080093b4 0x080093b4 0x00000010 Code RO 2654 i.usbd_address_set usbd_lld_core.o + 0x080093c4 0x080093c4 0x00000022 Code RO 2872 i.usbd_class_request usbd_enum.o + 0x080093e6 0x080093e6 0x00000002 PAD + 0x080093e8 0x080093e8 0x00000028 Code RO 2655 i.usbd_core_reset usbd_lld_core.o + 0x08009410 0x08009410 0x00000018 Code RO 2656 i.usbd_core_stop usbd_lld_core.o + 0x08009428 0x08009428 0x00000024 Code RO 2657 i.usbd_dp_pullup usbd_lld_core.o + 0x0800944c 0x0800944c 0x000000a0 Code RO 2658 i.usbd_ep_data_read usbd_lld_core.o + 0x080094ec 0x080094ec 0x00000060 Code RO 2659 i.usbd_ep_data_write usbd_lld_core.o + 0x0800954c 0x0800954c 0x00000014 Code RO 3075 i.usbd_ep_deinit custom_hid_core.o + 0x08009560 0x08009560 0x000000b8 Code RO 2660 i.usbd_ep_disable usbd_lld_core.o + 0x08009618 0x08009618 0x00000022 Code RO 3076 i.usbd_ep_init custom_hid_core.o + 0x0800963a 0x0800963a 0x00000038 Code RO 2804 i.usbd_ep_recev usbd_core.o + 0x08009672 0x08009672 0x00000002 PAD + 0x08009674 0x08009674 0x0000009c Code RO 2661 i.usbd_ep_reset usbd_lld_core.o + 0x08009710 0x08009710 0x00000030 Code RO 2662 i.usbd_ep_rx_enable usbd_lld_core.o + 0x08009740 0x08009740 0x0000004e Code RO 2805 i.usbd_ep_send usbd_core.o + 0x0800978e 0x0800978e 0x00000002 PAD + 0x08009790 0x08009790 0x00000278 Code RO 2663 i.usbd_ep_setup usbd_lld_core.o + 0x08009a08 0x08009a08 0x000000e0 Code RO 2664 i.usbd_ep_stall_clear usbd_lld_core.o + 0x08009ae8 0x08009ae8 0x000000a8 Code RO 2665 i.usbd_ep_stall_set usbd_lld_core.o + 0x08009b90 0x08009b90 0x00000024 Code RO 2666 i.usbd_ep_status usbd_lld_core.o + 0x08009bb4 0x08009bb4 0x00000070 Code RO 2806 i.usbd_init usbd_core.o + 0x08009c24 0x08009c24 0x00000024 Code RO 2766 i.usbd_int_suspend usbd_lld_int.o + 0x08009c48 0x08009c48 0x00000280 Code RO 2767 i.usbd_isr usbd_lld_int.o + 0x08009ec8 0x08009ec8 0x0000001c Code RO 2667 i.usbd_leave_suspend usbd_lld_core.o + 0x08009ee4 0x08009ee4 0x00000020 Code RO 2668 i.usbd_resume usbd_lld_core.o + 0x08009f04 0x08009f04 0x0000001c Code RO 2873 i.usbd_standard_request usbd_enum.o + 0x08009f20 0x08009f20 0x00000014 Code RO 2669 i.usbd_suspend usbd_lld_core.o + 0x08009f34 0x08009f34 0x00000006 Code RO 2874 i.usbd_vendor_request usbd_enum.o + 0x08009f3a 0x08009f3a 0x00000008 Code RO 3310 i.user_20ms_timer platform.o + 0x08009f42 0x08009f42 0x00000002 PAD + 0x08009f44 0x08009f44 0x00000024 Code RO 3311 i.user_2ms5_timer platform.o + 0x08009f68 0x08009f68 0x00000002 Code RO 4816 i.user__keypad_transfer2pc function.o + 0x08009f6a 0x08009f6a 0x00000002 Code RO 4817 i.user__pc_0x60cmd function.o + 0x08009f6c 0x08009f6c 0x00000002 Code RO 4818 i.user__pc_0x61cmd function.o + 0x08009f6e 0x08009f6e 0x00000002 Code RO 4819 i.user__pc_0x61cmd_type0x0B function.o + 0x08009f70 0x08009f70 0x00000050 Code RO 4820 i.user__pc_cmd_ack function.o + 0x08009fc0 0x08009fc0 0x00000002 Code RO 4821 i.user__pc_transfer2keypad function.o + 0x08009fc2 0x08009fc2 0x00000002 PAD + 0x08009fc4 0x08009fc4 0x000002a0 Code RO 4559 i.vote_data_packing vote__process.o + 0x0800a264 0x0800a264 0x00000018 Code RO 4600 i.vote_data_parameter_init vote__report.o + 0x0800a27c 0x0800a27c 0x0000002c Code RO 4601 i.vote_data_report_interval vote__report.o + 0x0800a2a8 0x0800a2a8 0x0000001c Code RO 4602 i.vote_data_report_startup vote__report.o + 0x0800a2c4 0x0800a2c4 0x00000034 Code RO 4603 i.vote_data_report_to_pc vote__report.o + 0x0800a2f8 0x0800a2f8 0x00000018 Code RO 4560 i.vote_data_store vote__process.o + 0x0800a310 0x0800a310 0x00000018 Code RO 4561 i.vote_init_queue vote__process.o + 0x0800a328 0x0800a328 0x00000164 Code RO 4562 i.vote_status_clear_confirmed vote__process.o + 0x0800a48c 0x0800a48c 0x00000002 Code RO 4563 i.vote_status_reset_NOconfirmed vote__process.o + 0x0800a48e 0x0800a48e 0x00000002 PAD + 0x0800a490 0x0800a490 0x00000060 Code RO 5428 i.whitelist__2ms5_call function_whitelist.o + 0x0800a4f0 0x0800a4f0 0x000000ec Code RO 5429 i.whitelist__tx_authcode_to_keypad function_whitelist.o + 0x0800a5dc 0x0800a5dc 0x00000048 Code RO 5430 i.whitelist_ack_pc function_whitelist.o + 0x0800a624 0x0800a624 0x00000060 Code RO 5431 i.whitelist_add function_whitelist.o + 0x0800a684 0x0800a684 0x0000005c Code RO 5432 i.whitelist_delete function_whitelist.o + 0x0800a6e0 0x0800a6e0 0x000000ac Code RO 5433 i.whitelist_enter function_whitelist.o + 0x0800a78c 0x0800a78c 0x00000040 Code RO 5434 i.whitelist_init function_whitelist.o + 0x0800a7cc 0x0800a7cc 0x00000048 Code RO 5435 i.whitelist_read_1zone function_whitelist.o + 0x0800a814 0x0800a814 0x0000003a Code RO 5436 i.whitelist_write_1zone function_whitelist.o + 0x0800a84e 0x0800a84e 0x00000002 PAD + 0x0800a850 0x0800a850 0x00000084 Code RO 4887 i.write_keycode function_aes.o + 0x0800a8d4 0x0800a8d4 0x00000034 Code RO 5437 i.write_list_sub function_whitelist.o + 0x0800a908 0x0800a908 0x00000010 Data RO 2672 .constdata usbd_lld_core.o + 0x0800a918 0x0800a918 0x00000020 Data RO 3078 .constdata custom_hid_core.o + 0x0800a938 0x0800a938 0x00000064 Data RO 3466 .constdata rf24l01 - multi.o + 0x0800a99c 0x0800a99c 0x00000020 Data RO 4252 .constdata common_math.o + 0x0800a9bc 0x0800a9bc 0x00000009 Data RO 4326 .constdata function_e2prom.o + 0x0800a9c5 0x0800a9c5 0x00000045 Data RO 4889 .constdata function_aes.o + 0x0800aa0a 0x0800aa0a 0x00000002 PAD + 0x0800aa0c 0x0800aa0c 0x00000004 Data RO 5188 .constdata function_broadcast.o + 0x0800aa10 0x0800aa10 0x000002ff Data RO 5719 .constdata aes.o + 0x0800ad0f 0x0800ad0f 0x00000010 Data RO 6055 .constdata segger_rtt_printf.o + 0x0800ad1f 0x0800ad1f 0x00000001 PAD + 0x0800ad20 0x0800ad20 0x00001b64 Data RO 6401 .constdata STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib(crypto.o) + 0x0800c884 0x0800c884 0x0000004d Data RO 3727 .conststring base_core.o + 0x0800c8d1 0x0800c8d1 0x00000003 PAD + 0x0800c8d4 0x0800c8d4 0x00000020 Data RO 7134 Region$$Table anon$$obj.o + + + Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x0800c8f4, Size: 0x00008df0, Max: 0x00010000, ABSOLUTE, COMPRESSED[0x000002c0]) + + Exec Addr Load Addr Size Type Attr Idx E Section Name Object + + 0x20000000 COMPRESSED 0x00000004 Data RW 209 .data gd32f30x_it.o + 0x20000004 COMPRESSED 0x00000010 Data RW 321 .data custom_hid_itf.o + 0x20000014 COMPRESSED 0x00000048 Data RW 2673 .data usbd_lld_core.o + 0x2000005c COMPRESSED 0x00000004 Data RW 2807 .data usbd_core.o + 0x20000060 COMPRESSED 0x00000043 Data RW 2875 .data usbd_enum.o + 0x200000a3 COMPRESSED 0x00000001 PAD + 0x200000a4 COMPRESSED 0x00000208 Data RW 3079 .data custom_hid_core.o + 0x200002ac COMPRESSED 0x00000080 Data RW 3313 .data platform.o + 0x2000032c COMPRESSED 0x00000001 Data RW 3467 .data rf24l01 - multi.o + 0x2000032d COMPRESSED 0x00000003 PAD + 0x20000330 COMPRESSED 0x00000004 Data RW 3635 .data hw_mcuio.o + 0x20000334 COMPRESSED 0x0000006d Data RW 3728 .data base_core.o + 0x200003a1 COMPRESSED 0x00000001 Data RW 3916 .data base_process_pc_cmd_0x61.o + 0x200003a2 COMPRESSED 0x00000025 Data RW 3954 .data base_process_pc_enter.o + 0x200003c7 COMPRESSED 0x00000001 PAD + 0x200003c8 COMPRESSED 0x00000004 Data RW 4030 .data base_process_rx_keypad.o + 0x200003cc COMPRESSED 0x00000006 Data RW 4107 .data base_process_tx_keypad.o + 0x200003d2 COMPRESSED 0x00000001 Data RW 4223 .data base_timer.o + 0x200003d3 COMPRESSED 0x00000001 PAD + 0x200003d4 COMPRESSED 0x00000009 Data RW 4375 .data multi_channel.o + 0x200003dd COMPRESSED 0x00000002 Data RW 4565 .data vote__process.o + 0x200003df COMPRESSED 0x00000004 Data RW 4604 .data vote__report.o + 0x200003e3 COMPRESSED 0x00000001 PAD + 0x200003e4 COMPRESSED 0x00000007 Data RW 4642 .data fucntion_base_test.o + 0x200003eb COMPRESSED 0x00000001 PAD + 0x200003ec COMPRESSED 0x00000007 Data RW 4680 .data fucntion_fastmatch.o + 0x200003f3 COMPRESSED 0x00000001 PAD + 0x200003f4 COMPRESSED 0x00000008 Data RW 4746 .data fucntion_text_message.o + 0x200003fc COMPRESSED 0x00000118 Data RW 4822 .data function.o + 0x20000514 COMPRESSED 0x00000001 Data RW 4890 .data function_aes.o + 0x20000515 COMPRESSED 0x00000006 Data RW 5249 .data function_monitor_freq.o + 0x2000051b COMPRESSED 0x00000001 PAD + 0x2000051c COMPRESSED 0x00000020 Data RW 5297 .data function_network.o + 0x2000053c COMPRESSED 0x00000006 Data RW 5439 .data function_whitelist.o + 0x20000542 COMPRESSED 0x00000002 PAD + 0x20000544 COMPRESSED 0x00000014 Data RW 5553 .data transparentupgrade.o + 0x20000558 COMPRESSED 0x0000004f Data RW 5720 .data aes.o + 0x200005a7 COMPRESSED 0x00000001 PAD + 0x200005a8 COMPRESSED 0x00000004 Data RW 6736 .data mc_w.l(rand.o) + 0x200005ac COMPRESSED 0x00000004 Data RW 7068 .data mc_w.l(mvars.o) + 0x200005b0 COMPRESSED 0x00000004 Data RW 7069 .data mc_w.l(mvars.o) + 0x200005b4 - 0x000000bc Zero RW 7 .bss main.o + 0x20000670 - 0x00000043 Zero RW 3077 .bss custom_hid_core.o + 0x200006b3 COMPRESSED 0x00000001 PAD + 0x200006b4 - 0x00001070 Zero RW 3726 .bss base_core.o + 0x20001724 - 0x0000050c Zero RW 3953 .bss base_process_pc_enter.o + 0x20001c30 - 0x000003db Zero RW 4029 .bss base_process_rx_keypad.o + 0x2000200b COMPRESSED 0x00000001 PAD + 0x2000200c - 0x0000004c Zero RW 4106 .bss base_process_tx_keypad.o + 0x20002058 - 0x0000011e Zero RW 4374 .bss multi_channel.o + 0x20002176 COMPRESSED 0x00000002 PAD + 0x20002178 - 0x00000518 Zero RW 4520 .bss transfer_keypad_pc.o + 0x20002690 - 0x00001bed Zero RW 4564 .bss vote__process.o + 0x2000427d COMPRESSED 0x00000001 PAD + 0x2000427e - 0x0000000c Zero RW 4641 .bss fucntion_base_test.o + 0x2000428a COMPRESSED 0x00000002 PAD + 0x2000428c - 0x00000864 Zero RW 4745 .bss fucntion_text_message.o + 0x20004af0 - 0x00000043 Zero RW 4888 .bss function_aes.o + 0x20004b33 - 0x00001015 Zero RW 5187 .bss function_broadcast.o + 0x20005b48 - 0x000003a0 Zero RW 5438 .bss function_whitelist.o + 0x20005ee8 - 0x000008c4 Zero RW 5552 .bss transparentupgrade.o + 0x200067ac - 0x0000018c Zero RW 5718 .bss aes.o + 0x20006938 - 0x000010b8 Zero RW 5892 .bss segger_rtt.o + 0x200079f0 - 0x00000400 Zero RW 2646 HEAP startup_gd32f30x_hd.o + 0x20007df0 - 0x00001000 Zero RW 2645 STACK startup_gd32f30x_hd.o + + + + Load Region LR$$.ARM.__AT_0x40006000 (Base: 0x40006000, Size: 0x00000000, Max: 0x00000040, ABSOLUTE) + + Execution Region ER$$.ARM.__AT_0x40006000 (Exec base: 0x40006000, Load base: 0x40006000, Size: 0x00000040, Max: 0x00000040, ABSOLUTE, UNINIT) + + Exec Addr Load Addr Size Type Attr Idx E Section Name Object + + 0x40006000 - 0x00000040 Zero RW 2671 .ARM.__AT_0x40006000 usbd_lld_core.o + + +============================================================================== + +Image component sizes + + + Code (inc. data) RO Data RW Data ZI Data Debug Object Name + + 2380 170 767 79 396 13879 aes.o + 1420 352 77 109 4208 19549 base_core.o + 584 44 0 0 0 5110 base_process_pc_cmd_0x60.o + 1696 144 0 1 0 3777 base_process_pc_cmd_0x61.o + 470 62 0 37 1292 10063 base_process_pc_enter.o + 1352 90 0 4 987 6706 base_process_rx_keypad.o + 3840 288 0 6 76 19564 base_process_tx_keypad.o + 146 24 0 1 0 1591 base_timer.o + 20 0 0 0 0 2736 buzzer.o + 160 6 32 0 0 3258 common_math.o + 578 42 32 520 67 13708 custom_hid_core.o + 4 0 0 16 0 982 custom_hid_itf.o + 2 0 0 0 0 507 debug.o + 392 72 0 7 12 3500 fucntion_base_test.o + 520 68 0 7 0 5769 fucntion_fastmatch.o + 910 66 0 8 2148 7377 fucntion_text_message.o + 90 6 0 280 0 6778 function.o + 1796 142 69 1 67 14186 function_aes.o + 768 76 4 0 4117 4999 function_broadcast.o + 156 10 0 0 0 1408 function_debug.o + 954 66 9 0 0 4006 function_e2prom.o + 540 44 0 6 0 4085 function_monitor_freq.o + 800 90 0 32 0 8735 function_network.o + 1374 122 0 6 928 12636 function_whitelist.o + 48 10 0 0 0 1306 gd32f30x_exti.o + 212 0 0 0 0 2765 gd32f30x_gpio.o + 238 26 0 4 0 11621 gd32f30x_it.o + 216 20 0 0 0 1460 gd32f30x_misc.o + 404 48 0 0 0 2458 gd32f30x_rcu.o + 88 0 0 0 0 3782 gd32f30x_spi.o + 238 30 0 0 0 6814 gd32f30x_timer.o + 240 22 0 0 0 1513 gd32f30x_usbd_hw.o + 396 30 0 4 0 6138 hw_mcuio.o + 772 28 0 0 0 5473 i2c.o + 96 12 0 0 0 1118 led.o + 526 40 0 0 188 63537 main.o + 1038 132 0 9 286 13976 multi_channel.o + 324 56 0 128 0 12703 platform.o + 354 20 0 0 0 4153 queue_circle.o + 1718 160 100 1 0 21891 rf24l01 - multi.o + 742 52 0 0 4280 9284 segger_rtt.o + 1096 6 16 0 0 6073 segger_rtt_printf.o + 36 8 304 0 5120 868 startup_gd32f30x_hd.o + 388 24 0 0 0 2081 system_gd32f30x.o + 340 52 0 0 1304 4830 transfer_keypad_pc.o + 2632 194 0 20 2244 19006 transparentupgrade.o + 254 20 0 4 0 7179 usbd_core.o + 1444 46 0 67 0 19739 usbd_enum.o + 1900 118 16 72 64 11541 usbd_lld_core.o + 676 18 0 0 0 2679 usbd_lld_int.o + 378 0 0 0 0 8489 usbd_transc.o + 1078 46 0 2 7149 4490 vote__process.o + 324 54 0 4 0 3583 vote__report.o + + ---------------------------------------------------------------------- + 39234 3256 1464 1448 34940 435459 Object Totals + 0 0 32 0 0 0 (incl. Generated) + 86 0 6 13 7 0 (incl. Padding) + + ---------------------------------------------------------------------- + + Code (inc. data) RO Data RW Data ZI Data Debug Library Member Name + + 3182 36 7012 0 0 1504 crypto.o + 86 0 0 0 0 0 __dczerorl2.o + 0 0 0 0 0 0 entry.o + 0 0 0 0 0 0 entry10a.o + 0 0 0 0 0 0 entry11a.o + 4 0 0 0 0 0 entry12b.o + 8 4 0 0 0 0 entry2.o + 4 0 0 0 0 0 entry5.o + 0 0 0 0 0 0 entry7b.o + 0 0 0 0 0 0 entry8b.o + 8 4 0 0 0 0 entry9a.o + 30 0 0 0 0 0 handlers.o + 36 8 0 0 0 68 init.o + 188 20 0 0 0 160 malloc.o + 26 0 0 0 0 80 memcmp.o + 64 0 0 0 0 76 memmovea.o + 36 0 0 0 0 108 memseta.o + 0 0 0 8 0 0 mvars.o + 36 10 0 4 0 136 rand.o + 18 0 0 0 0 68 strcpy.o + + ---------------------------------------------------------------------- + 3734 82 7012 12 0 2200 Library Totals + 8 0 0 0 0 0 (incl. Padding) + + ---------------------------------------------------------------------- + + Code (inc. data) RO Data RW Data ZI Data Debug Library Name + + 3182 36 7012 0 0 1504 STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib + 544 46 0 12 0 696 mc_w.l + + ---------------------------------------------------------------------- + 3734 82 7012 12 0 2200 Library Totals + + ---------------------------------------------------------------------- + +============================================================================== + + + Code (inc. data) RO Data RW Data ZI Data Debug + + 42968 3338 8476 1460 34940 393083 Grand Totals + 42968 3338 8476 704 34940 393083 ELF Image Totals (compressed) + 42968 3338 8476 704 0 0 ROM Totals + +============================================================================== + + Total RO Size (Code + RO Data) 51444 ( 50.24kB) + Total RW Size (RW Data + ZI Data) 36400 ( 35.55kB) + Total ROM Size (Code + RO Data + RW Data) 52148 ( 50.93kB) + +============================================================================== + diff --git b/Proj/Listings/startup_gd32f30x_hd.lst a/Proj/Listings/startup_gd32f30x_hd.lst new file mode 100644 index 0000000..0810510 --- /dev/null +++ a/Proj/Listings/startup_gd32f30x_hd.lst @@ -0,0 +1,1715 @@ + + + +ARM Macro Assembler Page 1 + + + 1 00000000 ;/*! + 2 00000000 ; \file startup_gd32f30x_hd.s + 3 00000000 ; \brief start up file + 4 00000000 ; + 5 00000000 ; \version 2017-02-10, V1.0.0, firmware for GD32F30x + 6 00000000 ; \version 2018-10-10, V1.1.0, firmware for GD32F30x + 7 00000000 ; \version 2018-12-25, V2.0.0, firmware for GD32F30x + 8 00000000 ; \version 2020-09-30, V2.1.0, firmware for GD32F30x + 9 00000000 ;*/ + 10 00000000 ; + 11 00000000 ;/* + 12 00000000 ; Copyright (c) 2020, GigaDevice Semiconductor Inc. + 13 00000000 + 14 00000000 ; Redistribution and use in source and binary forms, + with or without modification, + 15 00000000 ;are permitted provided that the following conditions ar + e met: + 16 00000000 ; + 17 00000000 ; 1. Redistributions of source code must retain the a + bove copyright notice, this + 18 00000000 ; list of conditions and the following disclaimer. + + 19 00000000 ; 2. Redistributions in binary form must reproduce th + e above copyright notice, + 20 00000000 ; this list of conditions and the following discla + imer in the documentation + 21 00000000 ; and/or other materials provided with the distrib + ution. + 22 00000000 ; 3. Neither the name of the copyright holder nor the + names of its contributors + 23 00000000 ; may be used to endorse or promote products deriv + ed from this software without + 24 00000000 ; specific prior written permission. + 25 00000000 ; + 26 00000000 ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS + AND CONTRIBUTORS "AS IS" + 27 00000000 ;AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT N + OT LIMITED TO, THE IMPLIED + 28 00000000 ;WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICU + LAR PURPOSE ARE DISCLAIMED. + 29 00000000 ;IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS + BE LIABLE FOR ANY DIRECT, + 30 00000000 ;INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENT + IAL DAMAGES (INCLUDING, BUT + 31 00000000 ;NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERV + ICES; LOSS OF USE, DATA, OR + 32 00000000 ;PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND O + N ANY THEORY OF LIABILITY, + 33 00000000 ;WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDI + NG NEGLIGENCE OR OTHERWISE) + 34 00000000 ;ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVE + N IF ADVISED OF THE POSSIBILITY + 35 00000000 ;OF SUCH DAMAGE. + 36 00000000 ;*/ + 37 00000000 + 38 00000000 ; Stack Configuration + 39 00000000 ; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> + 40 00000000 ; + 41 00000000 + + + +ARM Macro Assembler Page 2 + + + 42 00000000 00001000 + Stack_Size + EQU 0x00001000 + 43 00000000 + 44 00000000 AREA STACK, NOINIT, READWRITE, ALIGN +=3 + 45 00000000 Stack_Mem + SPACE Stack_Size + 46 00001000 __initial_sp + 47 00001000 + 48 00001000 + 49 00001000 ; Heap Configuration + 50 00001000 ; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> + 51 00001000 ; + 52 00001000 + 53 00001000 00000400 + Heap_Size + EQU 0x00000400 + 54 00001000 + 55 00001000 AREA HEAP, NOINIT, READWRITE, ALIGN= +3 + 56 00000000 __heap_base + 57 00000000 Heap_Mem + SPACE Heap_Size + 58 00000400 __heap_limit + 59 00000400 + 60 00000400 PRESERVE8 + 61 00000400 THUMB + 62 00000400 + 63 00000400 ; /* reset Vector Mapped to at Address 0 * + / + 64 00000400 AREA RESET, DATA, READONLY + 65 00000000 EXPORT __Vectors + 66 00000000 EXPORT __Vectors_End + 67 00000000 EXPORT __Vectors_Size + 68 00000000 + 69 00000000 00000000 + __Vectors + DCD __initial_sp ; Top of Stack + 70 00000004 00000000 DCD Reset_Handler ; Reset Handler + 71 00000008 00000000 DCD NMI_Handler ; NMI Handler + 72 0000000C 00000000 DCD HardFault_Handler ; Hard Fault + Handler + 73 00000010 00000000 DCD MemManage_Handler + ; MPU Fault Handler + + 74 00000014 00000000 DCD BusFault_Handler + ; Bus Fault Handler + + 75 00000018 00000000 DCD UsageFault_Handler ; Usage Faul + t Handler + 76 0000001C 00000000 DCD 0 ; Reserved + 77 00000020 00000000 DCD 0 ; Reserved + 78 00000024 00000000 DCD 0 ; Reserved + 79 00000028 00000000 DCD 0 ; Reserved + 80 0000002C 00000000 DCD SVC_Handler ; SVCall Handler + 81 00000030 00000000 DCD DebugMon_Handler ; Debug Monito + r Handler + 82 00000034 00000000 DCD 0 ; Reserved + + + +ARM Macro Assembler Page 3 + + + 83 00000038 00000000 DCD PendSV_Handler ; PendSV Handler + + 84 0000003C 00000000 DCD SysTick_Handler + ; SysTick Handler + 85 00000040 + 86 00000040 ; /* external interrupts handler */ + 87 00000040 00000000 DCD WWDGT_IRQHandler ; 16:Window Wa + tchdog Timer + 88 00000044 00000000 DCD LVD_IRQHandler ; 17:LVD through + EXTI Line detect + 89 00000048 00000000 DCD TAMPER_IRQHandler ; 18:Tamper t + hrough EXTI Line de + tect + 90 0000004C 00000000 DCD RTC_IRQHandler ; 19:RTC through + EXTI Line + 91 00000050 00000000 DCD FMC_IRQHandler ; 20:FMC + 92 00000054 00000000 DCD RCU_CTC_IRQHandler + ; 21:RCU and CTC + 93 00000058 00000000 DCD EXTI0_IRQHandler + ; 22:EXTI Line 0 + 94 0000005C 00000000 DCD EXTI1_IRQHandler + ; 23:EXTI Line 1 + 95 00000060 00000000 DCD EXTI2_IRQHandler + ; 24:EXTI Line 2 + 96 00000064 00000000 DCD EXTI3_IRQHandler + ; 25:EXTI Line 3 + 97 00000068 00000000 DCD EXTI4_IRQHandler + ; 26:EXTI Line 4 + 98 0000006C 00000000 DCD DMA0_Channel0_IRQHandler + ; 27:DMA0 Channel0 + 99 00000070 00000000 DCD DMA0_Channel1_IRQHandler + ; 28:DMA0 Channel1 + 100 00000074 00000000 DCD DMA0_Channel2_IRQHandler + ; 29:DMA0 Channel2 + 101 00000078 00000000 DCD DMA0_Channel3_IRQHandler + ; 30:DMA0 Channel3 + 102 0000007C 00000000 DCD DMA0_Channel4_IRQHandler + ; 31:DMA0 Channel4 + 103 00000080 00000000 DCD DMA0_Channel5_IRQHandler + ; 32:DMA0 Channel5 + 104 00000084 00000000 DCD DMA0_Channel6_IRQHandler + ; 33:DMA0 Channel6 + 105 00000088 00000000 DCD ADC0_1_IRQHandler + ; 34:ADC0 and ADC1 + 106 0000008C 00000000 DCD USBD_HP_CAN0_TX_IRQHandler ; 35 + :USBD HP and CAN0 T + X + 107 00000090 00000000 DCD USBD_LP_CAN0_RX0_IRQHandler ; 3 + 6:USBD LP and CAN0 + RX0 + 108 00000094 00000000 DCD CAN0_RX1_IRQHandler + ; 37:CAN0 RX1 + 109 00000098 00000000 DCD CAN0_EWMC_IRQHandler + ; 38:CAN0 EWMC + 110 0000009C 00000000 DCD EXTI5_9_IRQHandler + ; 39:EXTI5 to EXTI9 + + 111 000000A0 00000000 DCD TIMER0_BRK_IRQHandler + ; 40:TIMER0 Break + + + +ARM Macro Assembler Page 4 + + + 112 000000A4 00000000 DCD TIMER0_UP_IRQHandler + ; 41:TIMER0 Update + 113 000000A8 00000000 DCD TIMER0_TRG_CMT_IRQHandler ; 42: + TIMER0 Trigger and + Commutation + 114 000000AC 00000000 DCD TIMER0_Channel_IRQHandler ; 43: + TIMER0 Channel Capt + ure Compare + 115 000000B0 00000000 DCD TIMER1_IRQHandler ; 44:TIMER1 + 116 000000B4 00000000 DCD TIMER2_IRQHandler ; 45:TIMER2 + 117 000000B8 00000000 DCD TIMER3_IRQHandler ; 46:TIMER3 + 118 000000BC 00000000 DCD I2C0_EV_IRQHandler + ; 47:I2C0 Event + 119 000000C0 00000000 DCD I2C0_ER_IRQHandler + ; 48:I2C0 Error + 120 000000C4 00000000 DCD I2C1_EV_IRQHandler + ; 49:I2C1 Event + 121 000000C8 00000000 DCD I2C1_ER_IRQHandler + ; 50:I2C1 Error + 122 000000CC 00000000 DCD SPI0_IRQHandler ; 51:SPI0 + 123 000000D0 00000000 DCD SPI1_IRQHandler ; 52:SPI1 + 124 000000D4 00000000 DCD USART0_IRQHandler ; 53:USART0 + 125 000000D8 00000000 DCD USART1_IRQHandler ; 54:USART1 + 126 000000DC 00000000 DCD USART2_IRQHandler ; 55:USART2 + 127 000000E0 00000000 DCD EXTI10_15_IRQHandler ; 56:EXTI1 + 0 to EXTI15 + 128 000000E4 00000000 DCD RTC_Alarm_IRQHandler + ; 57:RTC Alarm + 129 000000E8 00000000 DCD USBD_WKUP_IRQHandler + ; 58:USBD Wakeup + 130 000000EC 00000000 DCD TIMER7_BRK_IRQHandler + ; 59:TIMER7 Break + 131 000000F0 00000000 DCD TIMER7_UP_IRQHandler + ; 60:TIMER7 Update + + 132 000000F4 00000000 DCD TIMER7_TRG_CMT_IRQHandler ; 61: + TIMER7 Trigger and + Commutation + 133 000000F8 00000000 DCD TIMER7_Channel_IRQHandler ; 62: + TIMER7 Channel Capt + ure Compare + 134 000000FC 00000000 DCD ADC2_IRQHandler ; 63:ADC2 + 135 00000100 00000000 DCD EXMC_IRQHandler ; 64:EXMC + 136 00000104 00000000 DCD SDIO_IRQHandler ; 65:SDIO + 137 00000108 00000000 DCD TIMER4_IRQHandler ; 66:TIMER4 + 138 0000010C 00000000 DCD SPI2_IRQHandler ; 67:SPI2 + 139 00000110 00000000 DCD UART3_IRQHandler ; 68:UART3 + 140 00000114 00000000 DCD UART4_IRQHandler ; 69:UART4 + 141 00000118 00000000 DCD TIMER5_IRQHandler ; 70:TIMER5 + 142 0000011C 00000000 DCD TIMER6_IRQHandler ; 71:TIMER6 + 143 00000120 00000000 DCD DMA1_Channel0_IRQHandler + ; 72:DMA1 Channel0 + 144 00000124 00000000 DCD DMA1_Channel1_IRQHandler + ; 73:DMA1 Channel1 + 145 00000128 00000000 DCD DMA1_Channel2_IRQHandler + ; 74:DMA1 Channel2 + 146 0000012C 00000000 DCD DMA1_Channel3_4_IRQHandler ; 75 + :DMA1 Channel3 and + Channel4 + + + +ARM Macro Assembler Page 5 + + + 147 00000130 + 148 00000130 __Vectors_End + 149 00000130 + 150 00000130 00000130 + __Vectors_Size + EQU __Vectors_End - __Vectors + 151 00000130 + 152 00000130 AREA |.text|, CODE, READONLY + 153 00000000 + 154 00000000 ;/* reset Handler */ + 155 00000000 Reset_Handler + PROC + 156 00000000 EXPORT Reset_Handler + [WEAK] + 157 00000000 IMPORT SystemInit + 158 00000000 IMPORT __main + 159 00000000 4806 LDR R0, =SystemInit + 160 00000002 4780 BLX R0 + 161 00000004 4806 LDR R0, =__main + 162 00000006 4700 BX R0 + 163 00000008 ENDP + 164 00000008 + 165 00000008 ;/* dummy Exception Handlers */ + 166 00000008 NMI_Handler + PROC + 167 00000008 EXPORT NMI_Handler + [WEAK] + 168 00000008 E7FE B . + 169 0000000A ENDP + 171 0000000A HardFault_Handler + PROC + 172 0000000A EXPORT HardFault_Handler + [WEAK] + 173 0000000A E7FE B . + 174 0000000C ENDP + 176 0000000C MemManage_Handler + PROC + 177 0000000C EXPORT MemManage_Handler + [WEAK] + 178 0000000C E7FE B . + 179 0000000E ENDP + 181 0000000E BusFault_Handler + PROC + 182 0000000E EXPORT BusFault_Handler + [WEAK] + 183 0000000E E7FE B . + 184 00000010 ENDP + 186 00000010 UsageFault_Handler + PROC + 187 00000010 EXPORT UsageFault_Handler + [WEAK] + 188 00000010 E7FE B . + 189 00000012 ENDP + 190 00000012 SVC_Handler + PROC + 191 00000012 EXPORT SVC_Handler + [WEAK] + 192 00000012 E7FE B . + 193 00000014 ENDP + + + +ARM Macro Assembler Page 6 + + + 195 00000014 DebugMon_Handler + PROC + 196 00000014 EXPORT DebugMon_Handler + [WEAK] + 197 00000014 E7FE B . + 198 00000016 ENDP + 200 00000016 PendSV_Handler + PROC + 201 00000016 EXPORT PendSV_Handler + [WEAK] + 202 00000016 E7FE B . + 203 00000018 ENDP + 205 00000018 SysTick_Handler + PROC + 206 00000018 EXPORT SysTick_Handler + [WEAK] + 207 00000018 E7FE B . + 208 0000001A ENDP + 209 0000001A + 210 0000001A Default_Handler + PROC + 211 0000001A ; /* external interrupts handler */ + 212 0000001A EXPORT WWDGT_IRQHandler + [WEAK] + 213 0000001A EXPORT LVD_IRQHandler + [WEAK] + 214 0000001A EXPORT TAMPER_IRQHandler + [WEAK] + 215 0000001A EXPORT RTC_IRQHandler + [WEAK] + 216 0000001A EXPORT FMC_IRQHandler + [WEAK] + 217 0000001A EXPORT RCU_CTC_IRQHandler + [WEAK] + 218 0000001A EXPORT EXTI0_IRQHandler + [WEAK] + 219 0000001A EXPORT EXTI1_IRQHandler + [WEAK] + 220 0000001A EXPORT EXTI2_IRQHandler + [WEAK] + 221 0000001A EXPORT EXTI3_IRQHandler + [WEAK] + 222 0000001A EXPORT EXTI4_IRQHandler + [WEAK] + 223 0000001A EXPORT DMA0_Channel0_IRQHandler + [WEAK] + 224 0000001A EXPORT DMA0_Channel1_IRQHandler + [WEAK] + 225 0000001A EXPORT DMA0_Channel2_IRQHandler + [WEAK] + 226 0000001A EXPORT DMA0_Channel3_IRQHandler + [WEAK] + 227 0000001A EXPORT DMA0_Channel4_IRQHandler + [WEAK] + 228 0000001A EXPORT DMA0_Channel5_IRQHandler + [WEAK] + 229 0000001A EXPORT DMA0_Channel6_IRQHandler + [WEAK] + 230 0000001A EXPORT ADC0_1_IRQHandler + + + +ARM Macro Assembler Page 7 + + + [WEAK] + 231 0000001A EXPORT USBD_HP_CAN0_TX_IRQHandler + [WEAK] + 232 0000001A EXPORT USBD_LP_CAN0_RX0_IRQHandler + [WEAK] + 233 0000001A EXPORT CAN0_RX1_IRQHandler + [WEAK] + 234 0000001A EXPORT CAN0_EWMC_IRQHandler + [WEAK] + 235 0000001A EXPORT EXTI5_9_IRQHandler + [WEAK] + 236 0000001A EXPORT TIMER0_BRK_IRQHandler + [WEAK] + 237 0000001A EXPORT TIMER0_UP_IRQHandler + [WEAK] + 238 0000001A EXPORT TIMER0_TRG_CMT_IRQHandler + [WEAK] + 239 0000001A EXPORT TIMER0_Channel_IRQHandler + [WEAK] + 240 0000001A EXPORT TIMER1_IRQHandler + [WEAK] + 241 0000001A EXPORT TIMER2_IRQHandler + [WEAK] + 242 0000001A EXPORT TIMER3_IRQHandler + [WEAK] + 243 0000001A EXPORT I2C0_EV_IRQHandler + [WEAK] + 244 0000001A EXPORT I2C0_ER_IRQHandler + [WEAK] + 245 0000001A EXPORT I2C1_EV_IRQHandler + [WEAK] + 246 0000001A EXPORT I2C1_ER_IRQHandler + [WEAK] + 247 0000001A EXPORT SPI0_IRQHandler + [WEAK] + 248 0000001A EXPORT SPI1_IRQHandler + [WEAK] + 249 0000001A EXPORT USART0_IRQHandler + [WEAK] + 250 0000001A EXPORT USART1_IRQHandler + [WEAK] + 251 0000001A EXPORT USART2_IRQHandler + [WEAK] + 252 0000001A EXPORT EXTI10_15_IRQHandler + [WEAK] + 253 0000001A EXPORT RTC_Alarm_IRQHandler + [WEAK] + 254 0000001A EXPORT USBD_WKUP_IRQHandler + [WEAK] + 255 0000001A EXPORT TIMER7_BRK_IRQHandler + [WEAK] + 256 0000001A EXPORT TIMER7_UP_IRQHandler + [WEAK] + 257 0000001A EXPORT TIMER7_TRG_CMT_IRQHandler + [WEAK] + 258 0000001A EXPORT TIMER7_Channel_IRQHandler + [WEAK] + 259 0000001A EXPORT ADC2_IRQHandler + [WEAK] + + + +ARM Macro Assembler Page 8 + + + 260 0000001A EXPORT EXMC_IRQHandler + [WEAK] + 261 0000001A EXPORT SDIO_IRQHandler + [WEAK] + 262 0000001A EXPORT TIMER4_IRQHandler + [WEAK] + 263 0000001A EXPORT SPI2_IRQHandler + [WEAK] + 264 0000001A EXPORT UART3_IRQHandler + [WEAK] + 265 0000001A EXPORT UART4_IRQHandler + [WEAK] + 266 0000001A EXPORT TIMER5_IRQHandler + [WEAK] + 267 0000001A EXPORT TIMER6_IRQHandler + [WEAK] + 268 0000001A EXPORT DMA1_Channel0_IRQHandler + [WEAK] + 269 0000001A EXPORT DMA1_Channel1_IRQHandler + [WEAK] + 270 0000001A EXPORT DMA1_Channel2_IRQHandler + [WEAK] + 271 0000001A EXPORT DMA1_Channel3_4_IRQHandler + [WEAK] + 272 0000001A + 273 0000001A ;/* external interrupts handler */ + 274 0000001A WWDGT_IRQHandler + 275 0000001A LVD_IRQHandler + 276 0000001A TAMPER_IRQHandler + 277 0000001A RTC_IRQHandler + 278 0000001A FMC_IRQHandler + 279 0000001A RCU_CTC_IRQHandler + 280 0000001A EXTI0_IRQHandler + 281 0000001A EXTI1_IRQHandler + 282 0000001A EXTI2_IRQHandler + 283 0000001A EXTI3_IRQHandler + 284 0000001A EXTI4_IRQHandler + 285 0000001A DMA0_Channel0_IRQHandler + 286 0000001A DMA0_Channel1_IRQHandler + 287 0000001A DMA0_Channel2_IRQHandler + 288 0000001A DMA0_Channel3_IRQHandler + 289 0000001A DMA0_Channel4_IRQHandler + 290 0000001A DMA0_Channel5_IRQHandler + 291 0000001A DMA0_Channel6_IRQHandler + 292 0000001A ADC0_1_IRQHandler + 293 0000001A USBD_HP_CAN0_TX_IRQHandler + 294 0000001A USBD_LP_CAN0_RX0_IRQHandler + 295 0000001A CAN0_RX1_IRQHandler + 296 0000001A CAN0_EWMC_IRQHandler + 297 0000001A EXTI5_9_IRQHandler + 298 0000001A TIMER0_BRK_IRQHandler + 299 0000001A TIMER0_UP_IRQHandler + 300 0000001A TIMER0_TRG_CMT_IRQHandler + 301 0000001A TIMER0_Channel_IRQHandler + 302 0000001A TIMER1_IRQHandler + 303 0000001A TIMER2_IRQHandler + 304 0000001A TIMER3_IRQHandler + 305 0000001A I2C0_EV_IRQHandler + 306 0000001A I2C0_ER_IRQHandler + + + +ARM Macro Assembler Page 9 + + + 307 0000001A I2C1_EV_IRQHandler + 308 0000001A I2C1_ER_IRQHandler + 309 0000001A SPI0_IRQHandler + 310 0000001A SPI1_IRQHandler + 311 0000001A USART0_IRQHandler + 312 0000001A USART1_IRQHandler + 313 0000001A USART2_IRQHandler + 314 0000001A EXTI10_15_IRQHandler + 315 0000001A RTC_Alarm_IRQHandler + 316 0000001A USBD_WKUP_IRQHandler + 317 0000001A TIMER7_BRK_IRQHandler + 318 0000001A TIMER7_UP_IRQHandler + 319 0000001A TIMER7_TRG_CMT_IRQHandler + 320 0000001A TIMER7_Channel_IRQHandler + 321 0000001A ADC2_IRQHandler + 322 0000001A EXMC_IRQHandler + 323 0000001A SDIO_IRQHandler + 324 0000001A TIMER4_IRQHandler + 325 0000001A SPI2_IRQHandler + 326 0000001A UART3_IRQHandler + 327 0000001A UART4_IRQHandler + 328 0000001A TIMER5_IRQHandler + 329 0000001A TIMER6_IRQHandler + 330 0000001A DMA1_Channel0_IRQHandler + 331 0000001A DMA1_Channel1_IRQHandler + 332 0000001A DMA1_Channel2_IRQHandler + 333 0000001A DMA1_Channel3_4_IRQHandler + 334 0000001A + 335 0000001A E7FE B . + 336 0000001C ENDP + 337 0000001C + 338 0000001C ALIGN + 339 0000001C + 340 0000001C ; user Initial Stack & Heap + 341 0000001C + 342 0000001C IF :DEF:__MICROLIB + 343 0000001C + 344 0000001C EXPORT __initial_sp + 345 0000001C EXPORT __heap_base + 346 0000001C EXPORT __heap_limit + 347 0000001C + 348 0000001C ELSE + 363 ENDIF + 364 0000001C + 365 0000001C END + 00000000 + 00000000 +Command Line: --debug --xref --diag_suppress=9931 --cpu=Cortex-M4.fp.sp --apcs= +interwork --depend=.\objects\startup_gd32f30x_hd.d -o.\objects\startup_gd32f30x +_hd.o -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\ +2.1.0\Device\Include --predefine="__MICROLIB SETA 1" --predefine="__UVISION_VER +SION SETA 536" --predefine="GD32F30X_HD SETA 1" --list=.\listings\startup_gd32f +30x_hd.lst ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f30x_hd.s + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +Relocatable symbols + +STACK 00000000 + +Symbol: STACK + Definitions + At line 44 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + Uses + None +Comment: STACK unused +Stack_Mem 00000000 + +Symbol: Stack_Mem + Definitions + At line 45 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + Uses + None +Comment: Stack_Mem unused +__initial_sp 00001000 + +Symbol: __initial_sp + Definitions + At line 46 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + Uses + At line 69 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 344 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +3 symbols + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +Relocatable symbols + +HEAP 00000000 + +Symbol: HEAP + Definitions + At line 55 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + Uses + None +Comment: HEAP unused +Heap_Mem 00000000 + +Symbol: Heap_Mem + Definitions + At line 57 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + Uses + None +Comment: Heap_Mem unused +__heap_base 00000000 + +Symbol: __heap_base + Definitions + At line 56 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + Uses + At line 345 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s +Comment: __heap_base used once +__heap_limit 00000400 + +Symbol: __heap_limit + Definitions + At line 58 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + Uses + At line 346 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s +Comment: __heap_limit used once +4 symbols + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +Relocatable symbols + +RESET 00000000 + +Symbol: RESET + Definitions + At line 64 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + Uses + None +Comment: RESET unused +__Vectors 00000000 + +Symbol: __Vectors + Definitions + At line 69 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + Uses + At line 65 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 150 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +__Vectors_End 00000130 + +Symbol: __Vectors_End + Definitions + At line 148 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 66 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 150 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +3 symbols + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +Relocatable symbols + +.text 00000000 + +Symbol: .text + Definitions + At line 152 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + None +Comment: .text unused +ADC0_1_IRQHandler 0000001A + +Symbol: ADC0_1_IRQHandler + Definitions + At line 292 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 105 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 230 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +ADC2_IRQHandler 0000001A + +Symbol: ADC2_IRQHandler + Definitions + At line 321 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 134 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 259 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +BusFault_Handler 0000000E + +Symbol: BusFault_Handler + Definitions + At line 181 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 74 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 182 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +CAN0_EWMC_IRQHandler 0000001A + +Symbol: CAN0_EWMC_IRQHandler + Definitions + At line 296 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 109 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 234 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +CAN0_RX1_IRQHandler 0000001A + + + + +ARM Macro Assembler Page 2 Alphabetic symbol ordering +Relocatable symbols + +Symbol: CAN0_RX1_IRQHandler + Definitions + At line 295 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 108 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 233 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +DMA0_Channel0_IRQHandler 0000001A + +Symbol: DMA0_Channel0_IRQHandler + Definitions + At line 285 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 98 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 223 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +DMA0_Channel1_IRQHandler 0000001A + +Symbol: DMA0_Channel1_IRQHandler + Definitions + At line 286 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 99 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 224 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +DMA0_Channel2_IRQHandler 0000001A + +Symbol: DMA0_Channel2_IRQHandler + Definitions + At line 287 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 100 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 225 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +DMA0_Channel3_IRQHandler 0000001A + +Symbol: DMA0_Channel3_IRQHandler + Definitions + At line 288 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 101 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 226 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +DMA0_Channel4_IRQHandler 0000001A + + + +ARM Macro Assembler Page 3 Alphabetic symbol ordering +Relocatable symbols + + +Symbol: DMA0_Channel4_IRQHandler + Definitions + At line 289 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 102 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 227 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +DMA0_Channel5_IRQHandler 0000001A + +Symbol: DMA0_Channel5_IRQHandler + Definitions + At line 290 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 103 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 228 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +DMA0_Channel6_IRQHandler 0000001A + +Symbol: DMA0_Channel6_IRQHandler + Definitions + At line 291 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 104 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 229 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +DMA1_Channel0_IRQHandler 0000001A + +Symbol: DMA1_Channel0_IRQHandler + Definitions + At line 330 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 143 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 268 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +DMA1_Channel1_IRQHandler 0000001A + +Symbol: DMA1_Channel1_IRQHandler + Definitions + At line 331 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 144 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 269 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + + + + +ARM Macro Assembler Page 4 Alphabetic symbol ordering +Relocatable symbols + +DMA1_Channel2_IRQHandler 0000001A + +Symbol: DMA1_Channel2_IRQHandler + Definitions + At line 332 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 145 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 270 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +DMA1_Channel3_4_IRQHandler 0000001A + +Symbol: DMA1_Channel3_4_IRQHandler + Definitions + At line 333 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 146 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 271 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +DebugMon_Handler 00000014 + +Symbol: DebugMon_Handler + Definitions + At line 195 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 81 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 196 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +Default_Handler 0000001A + +Symbol: Default_Handler + Definitions + At line 210 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + None +Comment: Default_Handler unused +EXMC_IRQHandler 0000001A + +Symbol: EXMC_IRQHandler + Definitions + At line 322 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 135 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 260 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +EXTI0_IRQHandler 0000001A + + + + +ARM Macro Assembler Page 5 Alphabetic symbol ordering +Relocatable symbols + +Symbol: EXTI0_IRQHandler + Definitions + At line 280 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 93 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 218 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +EXTI10_15_IRQHandler 0000001A + +Symbol: EXTI10_15_IRQHandler + Definitions + At line 314 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 127 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 252 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +EXTI1_IRQHandler 0000001A + +Symbol: EXTI1_IRQHandler + Definitions + At line 281 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 94 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 219 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +EXTI2_IRQHandler 0000001A + +Symbol: EXTI2_IRQHandler + Definitions + At line 282 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 95 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 220 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +EXTI3_IRQHandler 0000001A + +Symbol: EXTI3_IRQHandler + Definitions + At line 283 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 96 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 221 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +EXTI4_IRQHandler 0000001A + + + +ARM Macro Assembler Page 6 Alphabetic symbol ordering +Relocatable symbols + + +Symbol: EXTI4_IRQHandler + Definitions + At line 284 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 97 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 222 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +EXTI5_9_IRQHandler 0000001A + +Symbol: EXTI5_9_IRQHandler + Definitions + At line 297 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 110 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 235 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +FMC_IRQHandler 0000001A + +Symbol: FMC_IRQHandler + Definitions + At line 278 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 91 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 216 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +HardFault_Handler 0000000A + +Symbol: HardFault_Handler + Definitions + At line 171 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 72 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 172 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +I2C0_ER_IRQHandler 0000001A + +Symbol: I2C0_ER_IRQHandler + Definitions + At line 306 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 119 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 244 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + + + + +ARM Macro Assembler Page 7 Alphabetic symbol ordering +Relocatable symbols + +I2C0_EV_IRQHandler 0000001A + +Symbol: I2C0_EV_IRQHandler + Definitions + At line 305 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 118 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 243 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +I2C1_ER_IRQHandler 0000001A + +Symbol: I2C1_ER_IRQHandler + Definitions + At line 308 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 121 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 246 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +I2C1_EV_IRQHandler 0000001A + +Symbol: I2C1_EV_IRQHandler + Definitions + At line 307 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 120 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 245 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +LVD_IRQHandler 0000001A + +Symbol: LVD_IRQHandler + Definitions + At line 275 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 88 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 213 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +MemManage_Handler 0000000C + +Symbol: MemManage_Handler + Definitions + At line 176 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 73 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 177 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + + + +ARM Macro Assembler Page 8 Alphabetic symbol ordering +Relocatable symbols + + +NMI_Handler 00000008 + +Symbol: NMI_Handler + Definitions + At line 166 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 71 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 167 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +PendSV_Handler 00000016 + +Symbol: PendSV_Handler + Definitions + At line 200 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 83 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 201 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +RCU_CTC_IRQHandler 0000001A + +Symbol: RCU_CTC_IRQHandler + Definitions + At line 279 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 92 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 217 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +RTC_Alarm_IRQHandler 0000001A + +Symbol: RTC_Alarm_IRQHandler + Definitions + At line 315 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 128 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 253 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +RTC_IRQHandler 0000001A + +Symbol: RTC_IRQHandler + Definitions + At line 277 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 90 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 215 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f + + + +ARM Macro Assembler Page 9 Alphabetic symbol ordering +Relocatable symbols + +30x_hd.s + +Reset_Handler 00000000 + +Symbol: Reset_Handler + Definitions + At line 155 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 70 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 156 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +SDIO_IRQHandler 0000001A + +Symbol: SDIO_IRQHandler + Definitions + At line 323 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 136 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 261 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +SPI0_IRQHandler 0000001A + +Symbol: SPI0_IRQHandler + Definitions + At line 309 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 122 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 247 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +SPI1_IRQHandler 0000001A + +Symbol: SPI1_IRQHandler + Definitions + At line 310 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 123 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 248 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +SPI2_IRQHandler 0000001A + +Symbol: SPI2_IRQHandler + Definitions + At line 325 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 138 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + + + +ARM Macro Assembler Page 10 Alphabetic symbol ordering +Relocatable symbols + + At line 263 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +SVC_Handler 00000012 + +Symbol: SVC_Handler + Definitions + At line 190 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 80 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 191 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +SysTick_Handler 00000018 + +Symbol: SysTick_Handler + Definitions + At line 205 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 84 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 206 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TAMPER_IRQHandler 0000001A + +Symbol: TAMPER_IRQHandler + Definitions + At line 276 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 89 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 214 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER0_BRK_IRQHandler 0000001A + +Symbol: TIMER0_BRK_IRQHandler + Definitions + At line 298 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 111 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 236 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER0_Channel_IRQHandler 0000001A + +Symbol: TIMER0_Channel_IRQHandler + Definitions + At line 301 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 114 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f + + + +ARM Macro Assembler Page 11 Alphabetic symbol ordering +Relocatable symbols + +30x_hd.s + At line 239 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER0_TRG_CMT_IRQHandler 0000001A + +Symbol: TIMER0_TRG_CMT_IRQHandler + Definitions + At line 300 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 113 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 238 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER0_UP_IRQHandler 0000001A + +Symbol: TIMER0_UP_IRQHandler + Definitions + At line 299 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 112 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 237 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER1_IRQHandler 0000001A + +Symbol: TIMER1_IRQHandler + Definitions + At line 302 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 115 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 240 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER2_IRQHandler 0000001A + +Symbol: TIMER2_IRQHandler + Definitions + At line 303 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 116 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 241 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER3_IRQHandler 0000001A + +Symbol: TIMER3_IRQHandler + Definitions + At line 304 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + + + +ARM Macro Assembler Page 12 Alphabetic symbol ordering +Relocatable symbols + + At line 117 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 242 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER4_IRQHandler 0000001A + +Symbol: TIMER4_IRQHandler + Definitions + At line 324 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 137 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 262 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER5_IRQHandler 0000001A + +Symbol: TIMER5_IRQHandler + Definitions + At line 328 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 141 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 266 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER6_IRQHandler 0000001A + +Symbol: TIMER6_IRQHandler + Definitions + At line 329 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 142 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 267 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER7_BRK_IRQHandler 0000001A + +Symbol: TIMER7_BRK_IRQHandler + Definitions + At line 317 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 130 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 255 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER7_Channel_IRQHandler 0000001A + +Symbol: TIMER7_Channel_IRQHandler + Definitions + At line 320 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + + + +ARM Macro Assembler Page 13 Alphabetic symbol ordering +Relocatable symbols + + Uses + At line 133 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 258 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER7_TRG_CMT_IRQHandler 0000001A + +Symbol: TIMER7_TRG_CMT_IRQHandler + Definitions + At line 319 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 132 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 257 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +TIMER7_UP_IRQHandler 0000001A + +Symbol: TIMER7_UP_IRQHandler + Definitions + At line 318 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 131 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 256 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +UART3_IRQHandler 0000001A + +Symbol: UART3_IRQHandler + Definitions + At line 326 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 139 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 264 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +UART4_IRQHandler 0000001A + +Symbol: UART4_IRQHandler + Definitions + At line 327 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 140 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 265 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +USART0_IRQHandler 0000001A + +Symbol: USART0_IRQHandler + Definitions + At line 311 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f + + + +ARM Macro Assembler Page 14 Alphabetic symbol ordering +Relocatable symbols + +30x_hd.s + Uses + At line 124 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 249 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +USART1_IRQHandler 0000001A + +Symbol: USART1_IRQHandler + Definitions + At line 312 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 125 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 250 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +USART2_IRQHandler 0000001A + +Symbol: USART2_IRQHandler + Definitions + At line 313 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 126 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 251 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +USBD_HP_CAN0_TX_IRQHandler 0000001A + +Symbol: USBD_HP_CAN0_TX_IRQHandler + Definitions + At line 293 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 106 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 231 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +USBD_LP_CAN0_RX0_IRQHandler 0000001A + +Symbol: USBD_LP_CAN0_RX0_IRQHandler + Definitions + At line 294 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 107 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 232 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +USBD_WKUP_IRQHandler 0000001A + +Symbol: USBD_WKUP_IRQHandler + Definitions + + + +ARM Macro Assembler Page 15 Alphabetic symbol ordering +Relocatable symbols + + At line 316 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 129 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + At line 254 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +UsageFault_Handler 00000010 + +Symbol: UsageFault_Handler + Definitions + At line 186 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 75 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 187 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +WWDGT_IRQHandler 0000001A + +Symbol: WWDGT_IRQHandler + Definitions + At line 274 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 87 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + At line 212 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + +72 symbols + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +Absolute symbols + +Heap_Size 00000400 + +Symbol: Heap_Size + Definitions + At line 53 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + Uses + At line 57 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s +Comment: Heap_Size used once +Stack_Size 00001000 + +Symbol: Stack_Size + Definitions + At line 42 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s + Uses + At line 45 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s +Comment: Stack_Size used once +__Vectors_Size 00000130 + +Symbol: __Vectors_Size + Definitions + At line 150 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 67 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f3 +0x_hd.s +Comment: __Vectors_Size used once +3 symbols + + + +ARM Macro Assembler Page 1 Alphabetic symbol ordering +External symbols + +SystemInit 00000000 + +Symbol: SystemInit + Definitions + At line 157 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 159 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s +Comment: SystemInit used once +__main 00000000 + +Symbol: __main + Definitions + At line 158 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s + Uses + At line 161 in file ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f +30x_hd.s +Comment: __main used once +2 symbols +423 symbols in table diff --git b/Proj/Objects/Base_GD303.axf a/Proj/Objects/Base_GD303.axf new file mode 100644 index 0000000..fae9fd4 --- /dev/null +++ a/Proj/Objects/Base_GD303.axf diff --git b/Proj/Objects/Base_GD303.build_log.htm a/Proj/Objects/Base_GD303.build_log.htm new file mode 100644 index 0000000..e75bd9e --- /dev/null +++ a/Proj/Objects/Base_GD303.build_log.htm @@ -0,0 +1,46 @@ + + +
+

礦ision Build Log

+

Tool Versions:

+IDE-Version: μVision V5.36.0.0 +Copyright (C) 2021 ARM Ltd and ARM Germany GmbH. All rights reserved. +License Information: d Microsoft, Microsoft, LIC=RC93N-YLQQB-8TQ3P-MHIHV-VJYCC-FP6J4 + +Tool Versions: +Toolchain: MDK-ARM Plus Version: 5.36.0.0 +Toolchain Path: C:\Keil_v5\ARM\ARMCC\Bin +C Compiler: Armcc.exe V5.06 update 7 (build 960) +Assembler: Armasm.exe V5.06 update 7 (build 960) +Linker/Locator: ArmLink.exe V5.06 update 7 (build 960) +Library Manager: ArmAr.exe V5.06 update 7 (build 960) +Hex Converter: FromElf.exe V5.06 update 7 (build 960) +CPU DLL: SARMCM3.DLL V5.36.0.0 +Dialog DLL: DCM.DLL V1.17.3.0 +Target DLL: Segger\JL2CM3.dll V2.99.36.0 +Dialog DLL: TCM.DLL V1.53.0.0 + +

Project:

+E:\C100B_S6\C100B_GD\Proj\Base_GD303.uvprojx +Project File Date: 07/21/2022 + +

Output:

+*** Using Compiler 'V5.06 update 7 (build 960)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin' +Build target 'C100B' +".\Objects\Base_GD303.axf" - 0 Error(s), 0 Warning(s). + +

Software Packages used:

+ +Package Vendor: GigaDevice + http://gd32mcu.com/data/documents/pack/GigaDevice.GD32F30x_DFP.2.1.0.pack + GigaDevice.GD32F30x_DFP.2.1.0 + GigaDevice GD32F30x Series Device Support and Examples + +

Collection of Component include folders:

+ C:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include + +

Collection of Component Files used:

+Build Time Elapsed: 00:00:01 +
+ + diff --git b/Proj/Objects/Base_GD303.hex a/Proj/Objects/Base_GD303.hex new file mode 100644 index 0000000..1e845ef --- /dev/null +++ a/Proj/Objects/Base_GD303.hex @@ -0,0 +1,3263 @@ +:020000040800F2 +:10000000F08D002049010008491A0008A1140008D9 +:1000100031190008DB0F0008FF2E00080000000067 +:100020000000000000000000000000002124000883 +:10003000C110000800000000191E00089D240008DF +:100040006301000863010008630100086301000800 +:100050006301000863010008D9110008630100086A +:1000600063010008630100086301000863010008E0 +:1000700063010008630100086301000863010008D0 +:1000800063010008630100086301000863010008C0 +:100090007B26000863010008630100086301000873 +:1000A00063010008630100086301000863010008A0 +:1000B00015250008BD250008652600086301000815 +:1000C0006301000863010008630100086301000880 +:1000D0006301000863010008630100086301000870 +:1000E00009120008630100086301000863010008A9 +:1000F0006301000863010008630100086301000850 +:10010000630100086301000863010008630100083F +:10011000630100086301000863010008630100082F +:10012000630100086301000863010008630100081F +:10013000DFF810D000F074F80048004705700008A0 +:10014000AFF30080F08D0020064880470648004746 +:10015000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE777 +:10016000FEE7FEE7A5240008310100080649074A1A +:100170000868504343F23902104408604008704751 +:100180000149086070470000A80500206D4EC64177 +:1001900010B5431A934209D28318881803E010F867 +:1001A000011D03F8011D521EF9D210BD40EA0103E2 +:1001B0009B0703D009E008C9121F08C0042AFAD21D +:1001C00003E011F8013B00F8013B521EF9D210BDCB +:1001D000D2B201E000F8012B491EFBD27047002289 +:1001E000F6E710B513460A4604461946FFF7F0FF36 +:1001F000204610BD30B504460020034600E05B1CDD +:10020000934203D2E05CCD5C401BF8D030BD034686 +:1002100011F8012B00F8012B002AF9D1184670477C +:10022000064C074D06E0E06840F0010394E8070043 +:1002300098471034AC42F6D3FFF77EFFD4C80008CD +:10024000F4C8000870B58C1810F8015B15F00703AE +:1002500001D110F8013B2A1106D110F8012B03E05F +:1002600010F8016B01F8016B5B1EF9D12B0705D467 +:100270000023521E0DD401F8013BFAE710F8013BB0 +:10028000CB1A921C03E013F8015B01F8015B521ECC +:10029000F9D5A142D8D3002070BD00002DE9F0416E +:1002A00007460C4615461E461EB980200B490860BD +:1002B00003E04FF480700949086010222946204667 +:1002C00005F07CFD8046102241463846FFF760FF6E +:1002D000404605F079FFBDE8F08100006005002090 +:1002E0002DE9F04784B01F46DDF830A091468846DE +:1002F000060018BFB8F1000F4AD0002F18BFBAF19E +:10030000000F45D0B9F1000FA8BF19F00F0F1EBFA5 +:1003100040F61D4004B0BDE8F087307910F0020FC0 +:100320001EBF40F61E4004B0BDE8F0870024B9F1BE +:10033000100FA8BF6D4625DB5FF0000004EB8001C5 +:1003400058F8011009BA45F82010401C0428F5DBC4 +:100350006846014606F12802736A00F0BFF84FF0C4 +:10036000000C00BF55F82C0004EB8C0100BA0CF116 +:10037000010C7850BCF1040FF4DB04F120001034C0 +:100380004845D9DDCAF8004004B00020BDE8F08738 +:1003900004B04FF44260BDE8F087002812BF002A85 +:1003A0004FF442607047017941F002010171002071 +:1003B00010607047032300F04BBD00002DE9F047AB +:1003C00084B01F46DDF830A091468846060018BF6D +:1003D000B8F1000F4AD0002F18BFBAF1000F45D076 +:1003E000B9F1000FA8BF19F00F0F1EBF40F61D4056 +:1003F00004B0BDE8F087307910F0020F1EBF40F660 +:100400001E4004B0BDE8F0870024B9F1100FA8BF6A +:100410006D4625DB5FF0000004EB800158F8011009 +:1004200009BA45F82010401C0428F5DB684601464F +:1004300006F12802736A00F0DFF94FF0000C00BFEC +:1004400055F82C0004EB8C0100BA0CF1010C78502B +:10045000BCF1040FF4DB04F1200010344845D9DD71 +:10046000CAF8004004B00020BDE8F08704B04FF4A3 +:100470004260BDE8F087002812BF002A4FF44260B6 +:100480007047017941F0020101710020106070474E +:10049000022300F0DDBC00002DE9F04180460C464F +:1004A00015461E4600271EB980200B49086003E050 +:1004B0004FF48070084908602946404605F030FD39 +:1004C0000746102239462046FFF762FE384605F0FF +:1004D0007BFEBDE8F0810000600500202DE9F80FEB +:1004E0004FF0030C0CEBE308DB1002EB431202F1BC +:1004F0006003BE4A4FF0010CC2F808C0D2F808C031 +:10050000D2F800C0CDF800C0BCF1FF3F08D1DDF843 +:1005100000C0C2F800C012680092002A00F0E68015 +:100520004268D3F804C0006882EA0C071A684240A7 +:1005300094466446AE483D0E02F0FF0A50F825602E +:10054000C4F3074550F82AA050F8255004F0FF0BDB +:1005500086EA3526C2F3072550F82BB050F825500F +:10056000A8F101084FEA35490CF0FF0550F8255075 +:1005700089EA3565754053F8106CC7F307496E403A +:100580004FEA1C6550F8299050F8255085EA392526 +:10059000C4F30729240E50F8299050F824404FEA5C +:1005A000394989EA3A6985EA090953F80C5CCCF3C0 +:1005B000074A89EA05054FEA1269C2F30742CCF3FC +:1005C000072C50F8299050F82AA050F8222050F813 +:1005D0002CC089EA3A2984EA3222C7F3072A4FEA73 +:1005E0003C4407F0FF0C50F82AA050F82CC04FEA0A +:1005F0003A4A8AEA3B6A84EA3C6C89EA0A0982EA56 +:100600000C0253F808AC53F804CC203B89EA0A09E1 +:1006100082EA0C04B8F1000F7ADD320EC4F3074C05 +:1006200050F8222050F82CC0EFB282EA3C22C9F3E5 +:10063000072C50F8277050F82CC009F0FF0A4FEA39 +:100640003C4C8CEA376C82EA0C02D3F800C050F8BC +:100650002AA082EA0C072A0E04F0FF0B50F822C0F1 +:10066000C6F3074250F82BB050F822208CEA322C07 +:10067000C4F30722240E50F8222050F824404FEAF9 +:10068000324282EA3A628CEA0202D3F804C0C5F32D +:10069000074A82EA0C0C4FEA196250F82AA050F877 +:1006A0002220C5F3072582EA3A22C6F3072AC9F3B6 +:1006B0000749F6B250F82AA050F8255050F8299072 +:1006C00050F826604FEA3A4A4FEA35458AEA3B6AD3 +:1006D00084EA392485EA366582EA0A026C40D3F856 +:1006E00008A0DD6882EA0A026C4024E70268D3F8B9 +:1006F00000C09C6882EA0C074268D3F804C082EA12 +:100700000C0C8268C0686240DC68444012E7FFE776 +:10071000384850FA85F200EB166C12789CF800C04D +:10072000C9F3072742EA0C62C4F3074CC75D10F80F +:100730000CC04FEA0C4C4CEA072C42EA0C02D3F8EE +:1007400000C082EA0C020A6050FA89F200EB156CD4 +:1007500012789CF800C0C4F3072742EA0C62C6F383 +:10076000074CC75D10F80CC04FEA0C4C4CEA072C44 +:1007700042EA0C02D3F804C082EA0C024A6050FA42 +:1007800084F200EB196C12789CF800C0C6F30727BE +:1007900042EA0C62C5F3074CC75D10F80CC04FEA83 +:1007A0000C4C4CEA072C42EA0C02D3F808C082EA4F +:1007B0000C028A6050FA86F200EB146C12789CF8F6 +:1007C00000C0C5F3072442EA0C62C9F3074C10F8D5 +:1007D0000CC0005D4FEA0C4C4CEA00201043DA6874 +:1007E0005040C860BDE8F80F70470000003002407C +:1007F0004CB3000824AE00082DE9F80F4FF0030CAD +:100800000CEBE308C24B4FF0010CC3F808C0D3F85F +:1008100008C0D3F800C0CDF800C0BCF1FF3F00F025 +:10082000E5804368D2F804C0006883EA0C071368C7 +:1008300080EA0304A4466346B6483D0ECCF307465F +:1008400050F8255050F8266004F0FF0985EA362557 +:10085000C3F3072650F8299050F8266007F0FF0AE6 +:100860004FEA364686EA396675401669C3F307498A +:100870006E404FEA1C6550F8299050F8255050F80A +:100880002AA085EA3925C4F307290CF0FF0B50F89C +:100890002990CCF3072C4FEA394989EA3A6985EA6D +:1008A0000905D2F81490C4F3074A85EA09054FEA0E +:1008B000136950F82AA050F82990240E89EA3A29A1 +:1008C000C7F3072AC7F30747DBB250F82AA050F84E +:1008D0002CC050F82BB050F8244050F8277050F836 +:1008E00023304FEA3A4A4FEA3C4C8AEA3B6A84EAB0 +:1008F00037248CEA336389EA0A0984EA030CD2F8C4 +:1009000018A0D3692032A8F1010889EA0A098CEA03 +:100910000304B8F1000F7CDD330EC5F3074C50F82B +:10092000233050F82CC0E7B283EA3C23C9F3072CEC +:1009300050F8277050F82CC006F0FF0A4FEA3C4CE4 +:100940008CEA376C83EA0C03D2F800C050F82AA076 +:1009500083EA0C072B0EC9F3074C50F8233050F8EC +:100960002CC005F0FF0B83EA3C23C4F3072CC5F32E +:10097000072550F82CC050F825504FEA3C4C8CEA23 +:100980003A6C83EA0C03D2F804C0C4F3074A83EA42 +:100990000C0C4FEA196350F82AA050F82330240EAB +:1009A00083EA3A23C6F3072AC6F3074650F82440E1 +:1009B00050F8266050F82AA084EA362409F0FF0691 +:1009C00050F82BB050F826604FEA3A4A4FEA3545C6 +:1009D0008AEA3B6A85EA366583EA0A036C40D2F804 +:1009E00008A0D56883EA0A036C4026E7DDF800C05A +:1009F000C3F800C01B68009363B14368D2F804C019 +:100A0000006883EA0C07136880EA030C63466446B7 +:100A100012E710E00368D2F800C0946883EA0C077C +:100A20004368D2F804C083EA0C0C8368C068634052 +:100A3000D468444000E7384850FA84F300EB166C61 +:100A40001B789CF800C0C9F3072743EA0C63C5F381 +:100A5000074CC75D10F80CC04FEA0C4C4CEA072C51 +:100A600043EA0C03D2F800C083EA0C030B6050FA8F +:100A700086F300EB156C1B789CF800C0C4F30727C5 +:100A800043EA0C63C9F3074CC75D10F80CC04FEA8A +:100A90000C4C4CEA072C43EA0C03D2F804C083EA5E +:100AA0000C034B6050FA85F300EB196C1B789CF833 +:100AB00000C0C6F3072743EA0C63C4F3074CC75DC5 +:100AC00010F80CC04FEA0C4C4CEA072C43EA0C031C +:100AD000D2F808C083EA0C038B6050FA89F300EB6C +:100AE000146C1B789CF800C0C5F3072443EA0C6320 +:100AF000C6F3074CD26810F80CC0005D4FEA0C4CEE +:100B00004CEA002018435040C860BDE8F80F704719 +:100B1000003002404CAF000824AD000870B50C4610 +:100B20008446002315462046B3EBA20F09DA00BF26 +:100B30005CF8231009BA40F823105B1CB3EBA20F3A +:100B4000F6DB214600F096F8E910052000EB4103A2 +:100B5000002BD8BF70BD04F11002454800F5C561F7 +:100B6000D2F800C000EB1C64CCF307452478455D47 +:100B700051F8244051F8255084EA3524CCF3072558 +:100B8000455D51F825504FEA354550FA8CFC9CF8EC +:100B900000C051F82CC085EA3C6C84EA0C0C42F889 +:100BA00004CB52F804CB00EB1C64CCF3074524784B +:100BB000455D51F8244051F8255084EA3524CCF3A2 +:100BC0000725455D51F825504FEA354550FA8CFC14 +:100BD0009CF800C051F82CC085EA3C6C84EA0C0CEF +:100BE00042F804CC52F808CB00EB1C64CCF3074568 +:100BF0002478455D51F8244051F8255084EA352485 +:100C0000CCF30725455D51F825504FEA354550FA9C +:100C10008CFC9CF800C051F82CC085EA3C6C84EA3E +:100C20000C0C42F808CC52F804CC00EB1C64CCF35A +:100C300007452478455D51F8244051F8255084EA51 +:100C40003524CCF30725455D51F825504FEA35454D +:100C500050FA8CFC9CF800C05B1E51F82CC085EA51 +:100C60003C6C84EA0C0C42F804CC7FF479AF70BD84 +:100C700024AD000870B400239510002D15DDA0F1FF +:100C8000040C081F12F0040F03D05CF8044F40F866 +:100C9000044FD21009D000BFDCF8044044605CF877 +:100CA000084F40F8084F521EF6D1684C042DA4F5A9 +:100CB000007005D0062D34D0082D6DD070BC704763 +:100CC000CA6800EB126CC2F307459CF800C0455D92 +:100CD0004CEA056CC2F30725455D2D0450FA82F6F7 +:100CE000367845EA06254CEA050C54F823600D6871 +:100CF0005B1C75408CEA050CC1F810C04D680A2BCE +:100D00008CEA050CC1F814C08D688CEA050C8CEADD +:100D10000202C1F818C0CA61B8BF1031D0DB70BC84 +:100D200070474A6900EB126CC2F307459CF800C09B +:100D3000455D4CEA056CC2F30725455D2D0450FA6C +:100D400082F6367845EA06254CEA050C54F823600D +:100D50000D685B1C75408CEA050CC1F818C04D6825 +:100D6000082B8CEA050CC1F81CC08D688CEA050CB8 +:100D7000C1F820C0CD688CEA050CC1F824C0A4BF1E +:100D800070BC70470D698CEA050C8CEA0202C1F850 +:100D900028C0CA621831C4E7CA6900EB126CC2F3FA +:100DA00007459CF800C0455D4CEA056CC2F3072579 +:100DB000455D2D0450FA82F6367845EA06254CEA60 +:100DC000050C54F823600D685B1C75408CEA050C1B +:100DD000C1F820C04D68072B8CEA050CC1F824C06F +:100DE0008D688CEA050CC1F828C0CD688CEA050C2A +:100DF000C1F82CC0A4BF70BC704750FA8CF52D7898 +:100E000000EB1C66367845EA0665CCF30746CCF362 +:100E1000072C865D10F80CC0360446EA0C2C45EA17 +:100E20000C0C0D698CEA050CC1F830C04D698CEAD8 +:100E3000050CC1F834C08D698CEA050C8CEA0202FD +:100E4000C1F838C0CA632031A6E7000024AF00080B +:100E50002DE9F0410E46002818BF002E04D003F003 +:100E600006012AB9022903D04FF44260BDE8F0819F +:100E7000D0F824C0BCF1100F1CBFBCF1180FBCF19E +:100E8000200F08D102290AD0D0F810C0ACF1010C13 +:100E9000BCF1100F03D340F61F40BDE8F081C260E3 +:100EA00090F804C002292CF0060C80F804C048D049 +:100EB000002141618161C1610162D0F810C0BCF1C3 +:100EC000000F3EDD1CF0010F4FF01804A2F10102EB +:100ED00004D012F8011F0906416101215FEA6C0C80 +:100EE0002FD0CF1701EB977727F00307CF1B55784B +:100EF0007F4204EBC70705FA07F721F00305054415 +:100F0000D5F8148047EA08076F614D1C4FEAE57871 +:100F100005EB987828F00308A5EB080512F8027F86 +:100F20006D4204EBC505AF404D1C25F0030505449B +:100F3000891CD5F81480BCF1010C47EA08076F61E1 +:100F4000CFD1017911F0010F0DD113F0010F86609F +:100F50001CBF062131EA030108D000F12801426AD2 +:100F60003046FFF7DBFD0020BDE8F08100F12801ED +:100F7000426A0020B0EBA20F09DA00BF56F8203019 +:100F80001BBA41F82030401CB0EBA20FF6DB08463C +:100F9000FFF770FEE7E7000030B5024613010020BE +:100FA00013E000210EE00A4C1C4404EB8004645C56 +:100FB000084D05EB81052D5C6C40064D05EB810568 +:100FC0002C54491C0429EEDB401C0428E9DB30BD0D +:100FD000EC670020DC670020704700BFFEE772B6B8 +:100FE0007047000070B5002600240DE0002508E0E1 +:100FF00005EB84001C49085C1C4901EB8501085580 +:101000006D1C042DF4DB641C042CEFDB0020FFF7C7 +:10101000C3FF012609E001F027FA01F003FA00F00E +:1010200089FC3046FFF7B8FF761C114800688642FD +:10103000F1DB01F019FA01F0F5F90D480068FFF74E +:10104000ABFF00240DE0002508E0084800EB850018 +:10105000005D05EB8401074A50546D1C042DF4DB40 +:10106000641C042CEFDB70BDAC670020DC67002043 +:1010700058050020BC670020024600210AE00F4B03 +:1010800013F81100904203D14800401C185C7047CF +:10109000481CC1B21229F2DB00210AE04800401CC2 +:1010A000064B185C904202D113F81100EFE7481C80 +:1010B000C1B21229F2DB0020E9E70000E6A900082E +:1010C00070470000FEB506460C4617461D46022D29 +:1010D00001D1012500E000250A484078012809D106 +:1010E00002A823463A461021CDE90005304601F01A +:1010F00023F905E02B463A4631462046FFF7CEF865 +:10110000FEBD0000F04A002010B504460A2002F09F +:101110003BF910BD2DE9F04104460E46174605F097 +:1011200039FBA02005F0D6FAC4F3072005F0D2FA67 +:10113000E0B205F0CFFA05F02DFBA12005F0CAFAC8 +:10114000002504E005F084FA7055681CC5B2BD4264 +:10115000F8DB05F043FB0120BDE8F0812DE9F04705 +:10116000054689461646002400BF281900F01F00D6 +:10117000C0F120008046311B884203DB301B00F0A9 +:10118000FF0800E000BF05F005FBA02005F0A2FA73 +:101190002919C1F3072005F09DFA2919C8B205F0F5 +:1011A00099FA002706E0E11919F8010005F092FA12 +:1011B000781CC7B24745F6DB05F010FB0A2004F0A7 +:1011C000DFFA04EB0800C4B2B44200DB00E0CCE775 +:1011D00000BFBDE8F087000010B5012004F0EAFE72 +:1011E00068B107488078032806D1152005490870A2 +:1011F0000222034804F018FD012004F0D5FE10BDC2 +:10120000B40500200000002010B54FF4005004F099 +:10121000D1FE78B108488078032807D11620074905 +:1012200088700222891C044804F0FEFC4FF4005030 +:1012300004F0BAFE10BD0000B4050020000000203C +:10124000FEB506460D4617461C46022C01D1012468 +:1012500000E000240A484078012809D102A82B4662 +:101260003A461021CDE90004304601F09FF805E030 +:1012700023463A4629463046FFF70EF9FEBD0000E8 +:10128000F04A002000B587B072211F4805F062F9CE +:1012900040F207111D4805F05DF94FF440711C48FC +:1012A00005F058F972200190102002900020039060 +:1012B0000420049001A9144800F045F840F20710FA +:1012C000019010200290002003900420049001A9B6 +:1012D0000E4800F038F88020019004200290002091 +:1012E000039001A9084800F02EF84FF440700190D7 +:1012F00010200290002003900420049001A90448CB +:1013000000F021F807B000BD0010014000080140C6 +:10131000000C014070B504460D462A46214602489D +:1013200004F082FC70BD0000B405002000B5014649 +:1013300000F026F8024600BF00F022F8801A88422A +:1013400000D300BDF8E770B505460C462846D4E941 +:101350000031E26805F00EF970BD70B504460D4627 +:101360002946204605F064F9012804D12946204683 +:1013700005F0F0F803E02946204605F0EDF870BDD1 +:1013800001480068704700003003002002480068F0 +:10139000401C0149086070473003002000B587B049 +:1013A00040F2026007F0E6F84FF4C06007F0E2F8A0 +:1013B00040F20C6007F0DEF8A02303221821104849 +:1013C00005F0D8F84023032204210D4805F0D2F897 +:1013D000002001904FF48270009000200290059050 +:1013E0004FF4007003901820069000200490694686 +:1013F000044807F046FD034807F030FD07B000BD84 +:1014000000080140003001402DE9F04104460D463E +:1014100016460027B8460BE015F8012B14F8011BFF +:10142000064800F00DF8074308F101001FFA80F8A4 +:10143000B045F1DB3846BDE8F081000000300140E6 +:101440002DE9F04105460E46174644F620644FF05C +:10145000000800BF0221284607F00BFD18B9201E26 +:10146000A4F10104F6D13146284607F000FD0CB97D +:101470004FF0010844F6206400BF0121284607F020 +:10148000F8FC18B9201EA4F10104F6D1284607F093 +:10149000EAFCC7B20CB94FF001084046BDE8F08144 +:1014A00000BFFEE770B5002600240DE0002508E02F +:1014B00005EB84001C49085C1C4901EB85010855BB +:1014C0006D1C042DF4DB641C042CEFDB1848006851 +:1014D000FFF762FD16480068461E09E000F040F97B +:1014E00000F05EF93046FFF757FD00F025F8761E54 +:1014F000002EF3DC00F034F900F052F90020FFF781 +:101500004BFD00240DE0002508E0084800EB8500B5 +:10151000005D084901EB840148556D1C042DF4DB86 +:10152000641C042CEFDB70BDAC670020DC6700207E +:1015300058050020BC6700202DE9FF47002107E186 +:10154000DFF8189219F801908DF80C90DFF80C92E2 +:1015500009F1040919F801908DF80890DFF8FC9161 +:1015600009F1080919F801908DF80490DFF8EC9161 +:1015700009F10C0919F801908DF80090012056E04E +:101580000DF10C09814419F8019C4FEAD91909EBB6 +:10159000C90909EB49090DF10C0A82441AF801AC9A +:1015A00089EA4A090DF10C0A0AF800900DF10809C0 +:1015B000814419F8019C4FEAD91909EBC90909EBD3 +:1015C00049090DF1080A82441AF801AC89EA4A096E +:1015D0000DF1080A0AF800900DF10409814419F888 +:1015E000019C4FEAD91909EBC90909EB49090DF129 +:1015F000040A82441AF801AC89EA4A090DF1040A86 +:101600000AF800900DEB000919F8019C4FEAD9196E +:1016100009EBC90909EB49090DEB000A1AF801ACFD +:1016200089EA4A0909F0FF090DF80090401C0428D6 +:10163000A6DB9DF80E909DF80FA089EA0A029DF89E +:101640000C909DF80FA089EA0A039DF80A909DF876 +:101650000BA089EA0A049DF808909DF80BA089EA7E +:101660000A069DF806909DF807A089EA0A079DF8EA +:1016700004909DF807A089EA0A059DF802909DF85C +:1016800003A089EA0A0C9DF800909DF803A089EA5E +:101690000A089DF80D9089EA020989EA06099DF871 +:1016A00009A089EA0A099DF804A089EA0A0989EAD9 +:1016B000070989EA0809DFF8A4A00AF801909DF853 +:1016C000099089EA030989EA040989EA05099DF86C +:1016D00005A089EA0A099DF800A089EA0A0989EAB1 +:1016E0000C09DFF878A00AF1040A0AF801909DF8C5 +:1016F0000C9089EA020989EA06099DF805A089EAA1 +:101700000A0989EA070989EA08099DF801A089EA16 +:101710000A09DFF848A00AF1080A0AF801909DF8C2 +:101720000D9089EA03099DF808A089EA0A0989EA67 +:10173000040989EA05099DF801A089EA0A0989EAEC +:101740000C09DFF818A00AF10C0A0AF80190491CEC +:101750000429FFF6F5AEBDE8FF870000DC67002036 +:101760000E49C8798A79CA714A798A710A794A71A7 +:101770000871087A897A094A117211468872487A82 +:10178000CA7A4A72C872087B497B044A11731146AF +:101790008A7B4A73CA7B8A73C8737047DC670020F0 +:1017A00000200FE000210AE0084A02EB8002525CB0 +:1017B000074B9A5C054B03EB80035A54491C0429E0 +:1017C000F2DB401C0428EDDB70470000DC670020E2 +:1017D00010AA0008F8B5002500264F4800688200CE +:1017E0004E494F48FEF7D4FC4B4804688CE0601E1D +:1017F0004B4901EB8000006800904748006894FB6B +:10180000F0F100FB114080BB9DF800709DF80100D5 +:101810008DF800009DF802008DF801009DF803008E +:101820008DF802008DF803709DF800003D49085CBA +:101830008DF800009DF80100085C8DF801009DF80E +:101840000200085C8DF802009DF80300085C8DF82A +:1018500003003148006894FBF0F03349085C9DF8C0 +:10186000001048408DF8000024E0FFE72A48006897 +:1018700006281FDD2848006894FBF0F100FB1140AA +:10188000042817D19DF8000004F0F8FC8DF8000042 +:101890009DF8010004F0F2FC8DF801009DF80200B3 +:1018A00004F0ECFC8DF802009DF8030004F0E6FC67 +:1018B0008DF80300A006050E17480078201A800650 +:1018C000060E1748805D9DF80010484014494855A1 +:1018D0000846304440789DF801104840104929449A +:1018E00048700F48304480789DF8021048400C49F9 +:1018F000294488700A483044C0789DF80310484055 +:1019000007492944C870641C08480068401C8000CE +:10191000A0423FF76CAFF8BD5C05002018690020BD +:10192000EC67002010AB000810AC00085805002040 +:1019300000BFFEE730B5002068E0364C235C245C35 +:10194000344D2D1D2D5C6C40324D08352D5C6C40A6 +:10195000304D0C352D5C84EA05022E4C255C241D8F +:10196000245C85EA0401CC0904EBC40404EB4404C0 +:1019700084EA4104E1B2274C245C81EA02056C4010 +:10198000244D2C542C1D245C08352D5C84EA050163 +:10199000CC0904EBC40404EB440484EA4104E1B23E +:1019A0001C4C241D245C81EA02056540194C241D51 +:1019B0002554241D245C174D0C352D5C84EA05014B +:1019C000CC0904EBC40404EB440484EA4104E1B20E +:1019D000104C0834245C81EA02056C400D4D08353A +:1019E0002C542C1D245C84EA0301CC0904EBC404B0 +:1019F00004EB440484EA4104E1B22C1D245C81EA36 +:101A000002056C40034D0C352C54401C042894DB1B +:101A100030BD0000DC6700200948008878B1084824 +:101A20000088401E80B20649088040B90020054960 +:101A30004870C1F82404C1F82804C1F82C04704788 +:101A4000F4030020B04600207047000070B5054642 +:101A50000C46002605F07005204600F0A3F8064667 +:101A60000E4A32F814100E4A52F8240004F072FDA7 +:101A70002146272004F022FA45EA0600214604F018 +:101A80001DFA064A32F81410054A52F8240004F0F0 +:101A900063FD204600F086F870BD000048A90008EC +:101AA00038A9000810B504460A4A32F814100A4A48 +:101AB00052F8240004F04EFD2146E22004F0FEF925 +:101AC000044A32F81410044A52F8240004F044FD89 +:101AD00010BD000048A9000838A9000810B5044648 +:101AE0000A4A32F814100A4A52F8240004F032FD6F +:101AF0002146E12004F0E2F9044A32F81410044AC5 +:101B000052F8240004F028FD10BD000048A9000888 +:101B100038A90008F0B5C1B005460E4617461C4668 +:101B20000D4A32F814100D4A52F8240004F012FD48 +:101B30002846214604F0C2F923463A46314601A818 +:101B400004F0CBF9044A32F81410044A52F8240085 +:101B500004F002FD41B0F0BD48A9000838A9000812 +:101B600070B505460C460D4A32F814100C4A52F86E +:101B7000240004F0EFFC2846214604F09FF921469A +:101B8000FF2004F09BF90646044A32F81410044A78 +:101B900052F8240004F0E0FC304670BD48A900086B +:101BA00038A9000870B504460B4A32F814100B4AE5 +:101BB00052F8240004F0CEFC2146072004F07EF900 +:101BC0000546054A32F81410044A52F8240004F07D +:101BD000C3FC284670BD000048A9000838A90008C9 +:101BE00070B504460D4629460620FFF7B9FF20F0E0 +:101BF000070604F0070006432A463146062000F097 +:101C000075F870BD2DE9F04104460E4615461F4695 +:101C1000052D01DD052000E028460546052C01DDE7 +:101C2000052000E02046044604F10A01C8B23B4604 +:101C30002A46314600F032F8BDE8F08170B505461D +:101C40000E46002431460620FFF78AFF044624F0A2 +:101C5000280415B944F0200408E0012D02D124F035 +:101C6000280403E0022D01D144F008043246214645 +:101C7000062000F03BF870BD70B505460C461646D0 +:101C8000052C01DD052000E02046044633462246AF +:101C90002946102000F002F870BD0000F0B5C1B078 +:101CA00005460E4617461C460E4A32F814100E4AD8 +:101CB00052F8240004F04EFC45F02000214604F0C8 +:101CC000FDF823463A4601A9304604F006F9054AD4 +:101CD00032F81410044A52F8240004F03DFC41B0DC +:101CE000F0BD000048A9000838A9000870B50546F5 +:101CF0000E461446104A32F81410104A52F82400C6 +:101D000004F028FC0E4A32F814100E4A52F824004F +:101D100004F020FC45F02000214604F0CFF82146D5 +:101D2000304604F0CBF8064A32F81410054A52F84F +:101D3000240004F011FC70BD94A9000884A90008D7 +:101D400048A9000838A9000870B5C0B006460D467D +:101D50001446202D00DC0DB940B070BD0D4A32F89C +:101D600014100D4A52F8240004F0F4FB2146B02070 +:101D700004F0A4F823462A466946304604F0ADF83C +:101D8000044A32F81410044A52F8240004F0E4FB28 +:101D900000BFE1E748A9000838A900087FB505465B +:101DA00011A103C9CDE902010020009001902B464A +:101DB000052202A91020FFF771FF2B460522694674 +:101DC0001020FFF7A7FE00240AE002A8005D1DF81E +:101DD0000410884202D0002004B070BD601CC4B260 +:101DE000052CF2DB0120F7E71122A3A4A5000000D7 +:101DF000BFF34F8F0648006800F4E06005490843D0 +:101E0000001D03490860BFF34F8F00BFFEE70000CD +:101E10000CED00E00000FA05704770B504460D4671 +:101E200004F07F012A460520FFF760FF70BD000027 +:101E300010B504460A4A32F814100A4A52F824002F +:101E400004F088FB2146012000F00EF8044A32F825 +:101E50001410044A52F8240004F07EFB10BD000068 +:101E600094A9000884A9000870B504460E46002510 +:101E700031460020FFF774FE054614B925F0010530 +:101E800003E0012C01D145F001053246294600202E +:101E9000FFF72CFF70BD00007CB50446194881692E +:101EA000684688477CB99DF800109DF801201144D0 +:101EB0009DF8022002EB01219DF803208818FEF70F +:101EC0005FF900207CBD012C14D10F4807F0EEF81B +:101ED0009DF800109DF8012011449DF8022002EBAE +:101EE00001219DF80320114445182846FEF748F9C2 +:101EF0000120E7E7FEF73AF9B0FBF4F104FB11002B +:101F0000E0E7000034030020001000402DE9F0411C +:101F100004460D461646EFF311808046202080F3DC +:101F2000118800BF00BF32462946204600F00AF85B +:101F3000074608F0FF0080F3118800BF00BF384655 +:101F4000BDE8F0812DE9F74F8346174600BF2248D0 +:101F5000007808B901F028FA00BF0BEB4B011E48CE +:101F6000603000EBC106DDF804903569D6F80CA0AE +:101F70004FF00008554515D9B068441BBC4201D24A +:101F8000204600E03846044670684119224648461B +:101F9000FEF7FEF8A044A1443F1B2544B068A842C8 +:101FA00000D10025AAEB0504BC4201D2204600E086 +:101FB000384604464CB17068411922464846FEF73F +:101FC000E7F8A044A1443F1B2544B8F1000F00D01E +:101FD00035614046BDE8FE8F386900202DE9F041AB +:101FE00004460D46164600BF0D48007808B901F0BA +:101FF000DBF900BFEFF311800746202080F3118842 +:1020000000BF00BF32462946204600F00BF880464C +:10201000F8B280F3118800BF00BF4046BDE8F081F0 +:10202000386900202DE9F047074688461646C24623 +:1020300007EB47011B4800EBC109D9F8140020B198 +:10204000012811D0022826D11EE0484601F0E4F90B +:102050000546B54201D2002405E0344632465146D9 +:10206000484601F02EFB18E0484601F0D5F9054638 +:10207000B54201D2284600E0304604462246514689 +:10208000484601F01EFB08E032465146484601F042 +:10209000DFFA044601E0002400BF00BF2046BDE88F +:1020A000F0870000506900200FB438B5044606A838 +:1020B00000906A462046059900F007F80546002082 +:1020C0000090284638BC5DF814FB2DE9F04F99B01C +:1020D00082460D46144603A8149040201590002017 +:1020E0001690CDF860A0179000BF2E786D1C06B931 +:1020F000DDE0252E79D100274FF0010900BF2E78B1 +:10210000232E12D02B2E0CD02D2E02D0302E10D1FB +:1021100003E047F001076D1C0EE047F002076D1C5D +:102120000AE047F004076D1C06E047F008076D1C45 +:1021300002E04FF0000900BF00BFB9F1000FDED18F +:102140004FF0000800BF2E78302E01DB392E00DD65 +:1021500007E06D1CA6F1300008EB880100EB410898 +:10216000F1E700BF002013902E782E2E12D16D1CA7 +:1021700000BF2E78302E01DB392E00DD09E06D1C0A +:10218000A6F13000139901EB810100EB410013909F +:10219000EFE700BF2E7800BF6C2E01D0682E02D171 +:1021A0006D1C2E7800E000E0F6E700BF702E5DD0D9 +:1021B00008DC252E6AD0582E35D0632E09D0642E27 +:1021C00069D113E0732E3CD0752E1DD0782E62D1CC +:1021D00028E02168081D2060D1F8009009F0FF0B6D +:1021E000594614A801F012FA56E058E02168081D7B +:1021F0002060D1F80090CDE900870A22494614A852 +:10220000139B01F017F947E02168081D2060D1F801 +:102210000090CDE900870A22494614A8139B01F0DB +:102220007FF939E000BF2168081D2060D1F80090D7 +:10223000CDE900871022494614A8139B01F070F9DC +:102240002AE02168081D2060D1F800B000BF9BF88B +:1022500000600BF1010B06B906E0314614A801F04D +:10226000D5F917980028F2DA00BF15E02168081D9B +:102270002060D1F80090002008210B461022CDE903 +:102280000010494614A801F04BF905E0252114A8D7 +:1022900001F0BCF900E000BF00BF6D1C03E0314657 +:1022A00014A801F0B3F917980028BFF61EAF00BFBD +:1022B000179800280ADD169820B103A95046169AEF +:1022C000FFF78CFEDDE9161008441790179819B037 +:1022D000BDE8F08F62B6704700B587B0182101A83D +:1022E000FDF77DFF4FF4007001904820029001201F +:1022F00003900320049001A90248FFF724F807B0D7 +:1023000000BD0000000C014000B587B0182101A8F5 +:10231000FDF765FF4FF4007001901020029001203E +:1023200003900320049001A90248FFF70CF807B0BE +:1023300000BD0000000C01402DE9F047C8B0064682 +:102340000F4690469946DDF844A1509C0025002098 +:1023500001908DF80C00BAF1000F02D110200B9003 +:1023600001E020200B900022414602A8FEF722F84F +:102370000546BDB901A84B463A463146009002A831 +:10238000FDF7AEFF05466DB901982060206800EBAF +:10239000090101AA02A8FEF700F805462068019984 +:1023A00008442060284648B0BDE8F0872DE9F04792 +:1023B000C8B006460F4690469946DDF844A1509CA9 +:1023C0000025002001908DF80C00BAF1000F02D119 +:1023D00010200B9001E020200B900022414602A823 +:1023E000FEF756F80546BDB901A84B463A463146B8 +:1023F000009002A8FDF7E2FF05466DB90198206044 +:10240000206800EB090101AA02A8FEF734F805468E +:102410002068019908442060284648B0BDE8F0874C +:10242000704700000F49087949790E4A1171114629 +:102430008A794A71CA798A71C871087A897A094A8F +:10244000117211468872487ACA7A4A72C872087B39 +:10245000C97B044A117311468A7BCA734A7B8A730B +:1024600048737047DC67002000200FE000210AE07D +:10247000084A02EB8002525C074B9A5C054B03EB67 +:1024800080035A54491C0429F2DB401C0428EDDB6C +:1024900070470000DC67002010AB000810B5FEF7A5 +:1024A00075FF10BD08B51848006840F47000164963 +:1024B00008601648006840F00100144908600846AA +:1024C000406840F0800048600020009002E00098E2 +:1024D000401C009044F6206100988842F7D3002009 +:1024E0000A494860C8620846006809490840074927 +:1024F00008604FF41F0088600846006820F48020C0 +:10250000086006F081FD08BD88ED00E00010024083 +:10251000FFFFF6FE10B50121880706F02AFE40B144 +:102520000121880706F022FE0249C868804707F0AB +:1025300009FD10BD340300201FB50020009001905C +:102540000290039040F2AF40ADF800000020ADF8DB +:102550000200ADF80400F92002900020ADF806005A +:102560008DF80C0069464FF0804006F0ABFD00226C +:1025700001211C2005F092FA00214FF0804006F066 +:1025800099FD002240F2AF414FF0804006F0FDFD82 +:10259000F921880706F088FD0121880706F0DEFD95 +:1025A0000121880706F0E2FD0121880706F0DAFD27 +:1025B0004FF0804006F080FD1FBD000010B50121E6 +:1025C000880706F0D6FD40B10121880706F0CEFD50 +:1025D00002490869804707F0B0FC10BD34030020B1 +:1025E0001FB50020009001900290039040F2AF4090 +:1025F000ADF800000020ADF80200ADF8040040F294 +:10260000CF7002900020ADF806008DF80C006946EE +:10261000134806F057FD002201211C2005F03EFA68 +:1026200000210F4806F046FD002240F2AF410C4861 +:1026300006F0ABFD40F2CF71094806F035FD0121EF +:10264000074806F08BFD0121054806F08FFD0121AA +:10265000034806F087FD024806F02EFD1FBD00006E +:102660000004004010B50121880706F082FD18B172 +:102670000121880706F07AFD10BD10B507F0E4FAD5 +:1026800010BD000000B591B0402101A8FDF7A7FDE5 +:102690002C4890F84E008DF804002A4890F84F001E +:1026A0008DF80500274890F850008DF80600254861 +:1026B00090F851008DF80700FE208DF808004820A2 +:1026C0008DF80900DE208DF80A007F208DF80B00C0 +:1026D00001208DF80C0002208DF80D0030221949E0 +:1026E0005231002000F030F800909DF800008DF885 +:1026F0000E009DF801008DF80F00124840788DF80B +:10270000100030220F49523105A8FDF741FD30215C +:102710000C485230FDF763FD00200A4981F8820021 +:10272000202101A800F0C4FB00F0D8FB142000F029 +:102730003FF8202109A800F0BBFB00F0CFFB11B04F +:1027400000BD00001C63002070B506460C4615460F +:102750002946204603F0C0F90646304670BD000009 +:1027600010B50446074890F8310440B14FF4806238 +:10277000044911312046FDF70BFD002010BD01205A +:10278000FCE70000E85E002030B50A46CD1701EBFB +:102790005575C5F3C703CD1701EB5575ED10A1EBCA +:1027A000C505ECB2C25C0125A540AA43C25430BDA8 +:1027B00010B50446204603F002F810BD30B50246BD +:1027C0000846CD1701EB5575C5F3C703CD1701EBCF +:1027D0005575ED10A1EBC505ECB2D05C0125A54007 +:1027E000284008B1012030BD0020FCE770B5054647 +:1027F0000E46144609482968C0F84E10A0F88860B3 +:10280000C0F88440C4F38F20044988800846B0F89B +:10281000881003A004F0F5FB70BD00001C630020CD +:102820000A433A257800000001464878AA2808D1D2 +:102830008878BB2805D1C878CC2802D10879DD2852 +:102840001FD01B4890F84E004A78904201D00220D9 +:102850007047174890F84F008A78904201D00220C4 +:10286000F6E7134890F85000CA78904201D0022051 +:10287000EEE70F4890F851000A79904201D002200B +:10288000E6E748797F2801D00120E1E78879DE2852 +:1028900001D00120DCE7C879482801D00120D7E722 +:1028A000087AFE2801D00120D2E70020D0E70000FE +:1028B0001C63002070B58AB005460C46242101A88F +:1028C000FDF78DFCE0B28DF80400224629460DF19B +:1028D0000500FDF75DFC01A8FFF7A6FFA0B99DF874 +:1028E0000E00822801D00AB070BD0120274908706F +:1028F0002748DDF8111001609DF80F002549087088 +:102900009DF810004870EEE72048007801283AD181 +:1029100000201E49087020220DF10501FFF714FF69 +:1029200006461C480088B0422CD11BA004F069FB6D +:102930001B4890F88200102810DA194890F882009D +:102940001749523101EB80001149096801601448B0 +:1029500090F88200401C124981F8820000200FE0AC +:1029600001AA411C515C49B10D490A31095C01AB16 +:10297000421C9A5C11430A4A0A321154411CC8B2E3 +:102980002028EDDBAFE700BFADE7000050050020D9 +:1029900054050020520500200A4352435400000011 +:1029A0001C63002070B58AB005460C46242101A89E +:1029B000FDF715FC0026344890F84E008DF8040011 +:1029C000314890F84F008DF805002F4890F85000DE +:1029D0008DF806002C4890F851008DF80700422031 +:1029E0008DF8080001208DF80900274800788DF83F +:1029F0000A008DF80B50FF208DF80C008DF80D00AB +:102A000000208DF80E008DF80F008DF810008DF865 +:102A100011001D4890F884008DF812001A4890F8B3 +:102A200085008DF81300184890F886008DF8140082 +:102A3000154890F887008DF81500134890F8880025 +:102A40008DF81600104890F889008DF817000E4890 +:102A500080788DF818001B2202A90020FFF774FE71 +:102A6000C6B28DF823600AE0202101A800F020FA08 +:102A700000F034FA3220FFF79BFE601EC4B2002C37 +:102A8000F2D10AB070BD00001C63002030B589B0DF +:102A9000054624216846FDF7A2FB344890F84E0015 +:102AA0008DF80000314890F84F008DF801002F4854 +:102AB00090F850008DF802002C4890F851008DF8E5 +:102AC0000300FE20294981F84A004821274880F860 +:102AD0004B10DE2180F84C107F2180F84D1090F8CB +:102AE0004A008DF80400214890F84B008DF805004D +:102AF0001E4890F84C008DF806001C4890F84D00D8 +:102B00008DF8070020208DF8080001208DF80900BD +:102B1000164890F88E048DF80A00144890F88F0437 +:102B20008DF80B00114800788DF80C008DF80D50D1 +:102B30002021684600F0BCF900F0D0F9C820FFF76A +:102B400037FE00240EE009498A31202202FB0410DE +:102B5000114600F0ADF900F0C1F91420FFF728FE8E +:102B6000601CC4B2202CEEDB09B030BD1C63002019 +:102B700010B501200749087007480078401C064935 +:102B8000087041F27070054908600548816B0020AB +:102B9000884710BD440500201C6300204805002024 +:102BA0003403002070B505460C460020034981F827 +:102BB000310421460A2006F0B1FB70BDE85E00201A +:102BC00070B5AF48006878B1AD480068401EAC49A8 +:102BD000086048B9AB48007830B1AA4800780528A9 +:102BE00002D00520A7490870A648007806287CD2A4 +:102BF000DFE800F0030443B9D8FE3EE11E210120C6 +:102C0000FFF7D0FEA0480088401C9F490880084676 +:102C10000088282830DD00219C48A0F88A1440F262 +:102C2000FF11A0F88C140120984908720020487206 +:102C3000302196485230FDF7D2FA0020934981F8AE +:102C400082009149088091498871FF2240218F4874 +:102C50000A30FDF7BDFA8D4A92F88A149079FFF791 +:102C6000A1FF002189480A30FFF78EFD0020874927 +:102C7000C871022083490870FFE08448B0F88A14C4 +:102C800083A004F0BEF98148C079012816D07F489E +:102C90008A30FFF765FD88B901207C49C8710020A2 +:102CA00048724FF480628A31FFF74EFD7749A1F8F0 +:102CB0008E040846B0F88A14A0F88C147348B0F853 +:102CC0008C0440F2FF11884219D07048407A401CB1 +:102CD000C0B26E494872C82801DDC82048726B49ED +:102CE00091F88C04FFF7D2FE00E0C5E04FF4487085 +:102CF000FFF75EFD654991F88C04FFF7C7FE634856 +:102D0000407A6249097A88422CDB6048C079012800 +:102D100028D100205D49C87100241EE021465B488F +:102D20000A30FFF74BFD70B1214658480A30FFF7D3 +:102D30002BFD5648A0F88A44024692F88A149079EE +:102D4000FFF730FF0DE051488088401EA04202D1BD +:102D500003204C490870601CC4B24C488088A042D3 +:102D6000DCDC00BF89E000204749088047488078C4 +:102D7000401C46498870202144480A30FDF72FFA4C +:102D8000042040490870414841784078401C3F4A3F +:102D90005070C82902DD0120114648703EA004F0A1 +:102DA00030F96AE0FFF76EFC37480088401C36496E +:102DB000088008460088322846DB0025002008806D +:102DC000002409E0214631480A30FFF7F7FC08B13A +:102DD000681C85B2601C84B22C488088A042F1DC5B +:102DE000294630A004F00DF92DB90520254900E051 +:102DF0002BE0087041E025488079401C2349887108 +:102E000008200872002416E0214620480A30FFF707 +:102E1000D5FC70B121461D480A30FFF7B5FC1B48B0 +:102E2000A0F88A44024692F88A149079FFF7BAFE15 +:102E300005E0601CC4B215488088A042E4DC00BFF5 +:102E400002201049087018E017E01E210220FFF749 +:102E5000A9FD0D480088401C0B49088008460088E1 +:102E6000282808DD00200649086007490880054930 +:102E7000087006F0ABF900E000BF00BF70BD0000B5 +:102E800048050020440500204E0500201C6300205A +:102E90000A533A2564000000444F574E5F51554590 +:102EA000525900000A4C4E756D3A2564000000002E +:102EB00070B505460C46002005F07EFF0549C86A3E +:102EC00080470646E1B204483246436A284698479E +:102ED000012070BD34030020B802002010B54FF46B +:102EE000FA7408E003F01CFB00B110BD0220FFF7EC +:102EF0005FFC601E84B2002CF4D100BFF5E700BF78 +:102F0000FEE7002107E048F2782100BF0A1EA1F188 +:102F1000010399B2FAD1021EA0F1010398B2F2D1D5 +:102F20007047000010B590B0044620798DF800007D +:102F300020791B287AD2DFE800F0791E0E5B2A790F +:102F4000797979AA9E8A7A7979C6C17979CBCADDED +:102F5000CCEFF0EDEC000D22A649601D04F0D5F891 +:102F600001F0B6F90D22A349C02002F02BFB01208D +:102F70008DF8000000BF0D220DF101019D4804F005 +:102F8000C4F80E2269460B2004F008FF2EE1062249 +:102F90009949601D04F0B9F8984890F8820028B16A +:102FA000964890F882009449491E88709248401EC5 +:102FB000807820B19048401E8078042803DD0120ED +:102FC0008D49491E88708C48401E80788C49497A0A +:102FD000884204DD8A48407A8749491E88708649BC +:102FE000491EC87805F0D4F804208DF8000000BF11 +:102FF000824890F88400292800D1F7E07F4890F8B3 +:103000008400282800D1F1E07C4890F8840033281F +:1030100000D1EBE006220DF10101774804F075F8CC +:10302000072269460B2004F0B9FEDFE0D8E07348C0 +:1030300090F87F0000B9D9E003227249601D04F0C6 +:1030400064F803226F49D82002F0BCFA00BF6B4835 +:1030500090F87F0000B9C9E00B208DF80000032232 +:103060000DF10101674804F050F8042269460B2075 +:1030700004F094FEBAE0614890F8800000B9B5E031 +:103080006079012802D11E205F49487000BF5B486B +:1030900090F8800000B9A9E009208DF800005A4896 +:1030A0004078002801DD012000E000208DF80100BB +:1030B000022269460B2004F071FE97E04F48816AB6 +:1030C0002046884700BF4D49C86A80478EE000BF50 +:1030D0008CE018224D49601D04F017F84B48401E43 +:1030E000807818B1012005F02BFE02E0002005F0E9 +:1030F00027FE00BF15208DF8000018220DF10101F8 +:10310000424804F002F8192269460B2004F046FEFA +:103110006CE029E058E000E01AE00D223C49601D17 +:1031200003F0F3FF01F0D4F834480C21D0F80C215F +:103130003748401C90473149D1F8FC0080470D22A8 +:103140003349C02002F03EFA17208DF8000000BF7E +:103150000D220DF101012E4803F0D7FF0E22694622 +:103160000B2004F01BFE41E003222A49601D03F0FE +:10317000CCFF2848401EC178807801EB00204EF635 +:103180006021884207DDEA202249491E88706021BB +:103190002048401EC1701F4A521ED378927803EB1C +:1031A000022290B2154AD2F8041188471349D1F887 +:1031B000FC008047032217494FF4856002F002FAB1 +:1031C00019208DF8000000BF03220DF10101114804 +:1031D00003F09BFF042269460B2004F0DFFD05E0AD +:1031E0000648D0F8E4102046884700BF00BF10B062 +:1031F00010BD0000B1170020BC030020FC0300201C +:1032000058200020B8030020B50300203417002008 +:10321000BF170020C40300202DE9F0418CB0044604 +:10322000002620798DF810002079072871D2DFE878 +:1032300000F09A0427286271900008226946402015 +:1032400001F05AFC0822A11D684603F04DFF40B969 +:1032500000204B490870084600788DF811000225BF +:103260000DE0012046490870084600788DF81100ED +:1032700008220DF11201684603F047FF0A2574E0A9 +:1032800000BF6079042810DD00208DF811004C206B +:103290008DF812004F208DF8130043208DF8140094 +:1032A0004B208DF81500062524E002208DF8100033 +:1032B00060798DF81100207902280BD161795022B4 +:1032C00002EB01102F4910220B6A0DF112019847F1 +:1032D00012250FE06179502202EB011029491022DA +:1032E000CB69A11D984710220DF11201A01D03F01A +:1032F0000CFF122539E008220DF11201402001F0E7 +:10330000FBFB03208DF8100000208DF811000A252A +:103310002BE028E00822A11D402002F053F903F021 +:103320006BF80746A01D02F0E7FA804615483A46BA +:103330000421C36B4046984700208DF811008DF89A +:10334000120008220DF11301A01D03F0DEFE0B2573 +:103350000BE000208DF811000A4801690DF1120000 +:1033600088470E2501E0012600BF00BF26B92A4686 +:1033700004A9092004F012FD0CB0BDE8F0810000A2 +:10338000A1030020B8020020002106E01E2100BF9A +:103390000A1EA1F1010399B2FAD1021EA0F10103A4 +:1033A00098B2F3D17047000010B5124C0320206191 +:1033B000606111A0A0611349E1614FF48051216265 +:1033C0000021A1626162E1620BA020660E49616684 +:1033D0001021A16600212167E16661670BA1E01D54 +:1033E000FCF715FF0AA12046FCF711FF2020A07171 +:1033F00010BD0000386900205465726D696E616C03 +:1034000000000000E0690020E079002052545400E0 +:10341000534547474552000010B501460A69CB683D +:103420009A4204D88C68641EE41AA01801E0D41AE9 +:10343000601E10BD2DE9FC5F06460F469246984679 +:10344000DDE90C45002F01DA784200E0384683467A +:103450004FF0010903E09BFBFAFB09F10109D34599 +:10346000F9DAC84500D9C14634B1002F03DB05F0B5 +:103470000400042800D1641E05F0020010B1B8F168 +:10348000000F11D005F0010070B96CB108E0641EA6 +:103490002021304600F0BAF8F068002800DA02E097 +:1034A0000CB1A145F3D300BFF068002836DB002F34 +:1034B00005DA7F422D21304600F0A8F807E005F03C +:1034C0000400042803D12B21304600F09FF8F06857 +:1034D000002823DB05F00200022814D105F00100CA +:1034E00088B9B8F1000F0ED16CB108E0641E30212C +:1034F000304600F08BF8F068002800DA02E00CB1EA +:10350000A145F3D300BFF068002807DB43465246CD +:1035100039463046CDE9004500F002F8BDE8FC9F91 +:103520002DE9FC5F8046894615461E460C9CCDF869 +:1035300004900127BB4605E00198B0FBF5F001902F +:103540000BF1010B0198A842F6D25E4500D9B346B3 +:103550000D9800F00100D0B9CCB10D9800F0020038 +:10356000022803D116B93020009001E020200090FD +:1035700009E0641E4046009900F048F8D8F80C00B5 +:10358000002800DA02E00CB1A345F2D300BFD8F85E +:103590000C00002835DB09E0012E01D9761E04E07D +:1035A000B9FBF7FAAA4500D201E06F43F4E700BF88 +:1035B00000BFB9FBF7FA0AFB1799134810F80A1075 +:1035C000404600F023F8D8F80C00002800DA03E0A9 +:1035D000B7FBF5F7002FECD100BF0D9800F001000C +:1035E00078B174B109E0641E2021404600F00EF865 +:1035F000D8F80C00002800DA02E00CB1A345F2D3A1 +:1036000000BFBDE8FC9F00000FAD000870B5044688 +:103610000E46A568681C6168814206D3206846553D +:10362000681CA060E068401CE060D4E9011088429A +:103630000DD1A26821682069FEF7D0FCA1688842FC +:1036400003D04FF0FF30E06001E00020A06070BDCB +:103650002DE9F0470446894617464FF0000AE56811 +:1036600000BFD4F81080A84503D9A8EB0500461E7A +:1036700004E0A5EB0800401CA1680E1AA068401BDE +:10368000B04201D9304601E0A068401B0646BE4268 +:1036900001D2304600E03846064661684819324695 +:1036A0004946FCF775FDB244B144BF1B3544A068E0 +:1036B000A84200D10025E560002FD2D15046BDE8D8 +:1036C000F0872DE9F047044689461546E668A0686C +:1036D000871BAF4208D9616888192A464946FCF71A +:1036E00057FD7019E06010E0B846616888194246DD +:1036F0004946FCF74DFDA5EB070809EB07014246DB +:103700006068FCF745FDC4F80C80BDE8F08702E076 +:1037100008C8121F08C1002AFAD17047704700205C +:1037200001E001C1121F002AFBD1704770B590B0B3 +:1037300004460E461546382D00DD38252A4631460A +:1037400002A8FCF725FDC5F1380102AA5019202274 +:10375000FCF73EFD61208DF8000063208DF801002C +:103760006B208DF802002D208DF8030020788DF855 +:10377000040060788DF80500A0788DF806003A20E6 +:103780008DF807000348402142696846904710B011 +:1037900070BD0000B80200201FB50020009001900D +:1037A0000290039010226946FEF7B0FBA0B19DF88D +:1037B0000000312802D0322808D102E000F060F881 +:1037C00009E006A10020FEF76FFC04E004A1002040 +:1037D000FEF76AFC00BF00BF1FBD0000320A0000F8 +:1037E000556E737570706F7274656420696E737452 +:1037F00072756374696F6E73210A00007047000070 +:1038000010B500242CE004EBC40101EB0411164AAE +:1038100088181921FCF7E3FC04EBC40101EB041147 +:10382000124A88181921FCF7DAFC04EBC40101EBF9 +:1038300004110F4A88181921FCF7D1FC04EBC401CC +:1038400001EB04110B4A88181921FCF7C8FC002071 +:10385000094921F81400094921F81400601CC4B278 +:10386000282CD0DB10BD0000E4060020CC0A00208C +:10387000B40E00209C12002084160020D4160020D4 +:10388000F8B5002602F056FA07462748427827493D +:103890000020FEF709FC07F0030018B124A1002066 +:1038A000FEF702FC002437E0254830F814000090B1 +:1038B000244830F81430621C23A10020FEF7F4FBEA +:1038C000002600251AE004EBC40000EB0410274991 +:1038D0000844435D2A4626A10020FEF7E5FB701C44 +:1038E000C6B2052E08DD00261EA10020FEF7DCFB77 +:1038F00041F2883001F054FF681CC5B221480078BD +:103900008542E0DB20A10020FEF7CEFB41F28830AB +:1039100001F046FF601CC4B2282CC5DB1BA10020AF +:10392000FEF7C2FBF8BD00004C17002084C8000859 +:103930004B657970616420525820455252210A002B +:10394000D416002084160020534E3A2530336420CC +:1039500052785F636E743A25642041434B5F636E17 +:10396000743A25640A20202020000000E40600208C +:1039700072784B505B253033645D3D3078253032B2 +:10398000782C2000A00300200A0000000A2A2A2A1E +:103990002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A87 +:1039A0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A77 +:1039B0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A67 +:1039C0002A2A2A2A2A2A2A0A0000000010B5CA78C0 +:1039D00072B1CA78282A0BDCCA78521E054B33F81C +:1039E0001220521C93B2CA78521E024C24F8123094 +:1039F00010BD0000D41600207047000010B504462A +:103A0000A079D0B1A079282817DCE27A511EA279DA +:103A1000521E02EBC20303EB0212084BD01802F055 +:103A2000BFF9A079401E064931F81000401C81B250 +:103A3000A079401E024A22F8101010BDE4060020B2 +:103A4000841600207047704730B591B004460625B3 +:103A50002022402101A8FCF7BBFB2A4604F1080103 +:103A600001A8FCF795FB402201A902A0FFF75EFE2A +:103A700011B030BD66756E000146C21700EB527280 +:103A8000C2F3C702014B1A7070470000A003002068 +:103A900010B50346D3F8A400806868B153F8A40FAA +:103AA000806880781C68A468E47840EA042010806C +:103AB00053F8A409806810BD0020108000BFFAE709 +:103AC00010B5034653F8A40F406880781C686468FA +:103AD000E47840EA0420108053F8A409406810BD3F +:103AE0000346D3F8A400006800781080D3F8A4003F +:103AF0000068704770B504460D46E07C50B100BFC9 +:103B0000D4F8AC10A06C0022CB6A1146984700BFD5 +:103B10000021E174A078032808D1D4F8A800006936 +:103B200020B1D4F8A800016920468847204605F056 +:103B300017FC607830B1D4F8AC00C16820468847E3 +:103B40000020607070BD2DE9F04104460D46A0785C +:103B5000032808D1D4F8A800406920B1D4F8A800FF +:103B600041692046884705EB450704F1140606EB3A +:103B7000870000210A460B4641600281438100BF55 +:103B8000204605F0F6FBBDE8F0812DE9F041044642 +:103B90000F460125D4F8AC0000221146036B04F156 +:103BA0000B0098470646082E04D0204605F0EBFB94 +:103BB000BDE8F081E07A00F0600020B1202809D053 +:103BC000402815D10DE004F10B01204606F09AF9CA +:103BD00005460EE004F10B01204605F0F3FB054617 +:103BE00007E004F10B01204606F0A4F9054600E0C9 +:103BF00000BF00BFC5B9B4F8110018B9204605F0E0 +:103C0000B8FB14E0E07A00F0800048B100BF4C201F +:103C1000035B00212046A26C05F092FD00BF06E088 +:103C2000204605F09DFB02E0204605F0ACFB00BFFE +:103C3000BEE770B504460D460026287800F0030064 +:103C400020B101282ED002282DD111E0A078022821 +:103C500002D0032809D100E000BF6888012803D101 +:103C600000212172002070BD00E000BF00BF1BE0FA +:103C70002E79A078032814D1688890B98EB1802E4F +:103C80000FD000BFD4F8AC003146826B204690477D +:103C900000BFD4F8A8002946C268204690470020FB +:103CA000E1E701E000E000BF00BF0120DBE770B505 +:103CB00004460E460125A078022802D0032808D128 +:103CC00003E0207800B9002504E0207800B1002549 +:103CD00000E000BF00BF35B901231A46214604F1B8 +:103CE000440005F05FFB284670BD00002DE9F04759 +:103CF00006460D460027B8464FF0010906F1440478 +:103D0000287800F0030020B101284BD0022852D1BE +:103D100050E06888070A95F80280102F3FD2DFE84C +:103D200007F03E08182331323334353E3E3E3E3EE6 +:103D30003E36781E304951F8203004F108024146E1 +:103D4000304698476060E888402801D108202081EB +:103D500026E0781E284951F8203004F10802414637 +:103D60003046984760601BE0B8F1060F09DA781E0C +:103D7000214951F8203004F1080241463046984765 +:103D800060600DE000BF00BF00BF00BF08E004F1AD +:103D9000080241463046FFF77BFE606000E000BF4E +:103DA00000BF09E0D6F8A8002946C268304690470F +:103DB000814601E000E000BF00BF2089C8B1E8886B +:103DC000B8B12089E988884201DA208900E0E888D2 +:103DD00020812189B6F81100814208DA20892188E2 +:103DE00090FBF1F201FB120008B90121F1744FF0D0 +:103DF00000094846BDE8F0879400002070B50446ED +:103E00000D46A078012804D0022803D0032810D141 +:103E100001E00FE00EE0287950B9D4F8A800411C69 +:103E200001231A4604F1440005F0BCFA002070BDDD +:103E300000E000BF00BF0120F9E700002DE9F041DC +:103E400004460E4635790127307800F0030020B192 +:103E5000012823D0022845D126E0A078022802D0EC +:103E6000032818D100E000BF207918B101202449AF +:103E7000087002E0002022490870207A30B1204802 +:103E8000007840F002001E49087002E000201C4942 +:103E90000870002700E000BF00BF24E0A0780328DE +:103EA00001D105B900271EE0A078032819D105F03B +:103EB000800080280BD105F07F0000EB400104F169 +:103EC000440000EB810080780D49087008E005EBA4 +:103ED000450104F1140000EB810080780849087066 +:103EE000002700E000BF00BF37B902231A4604498B +:103EF00004F1440005F056FA3846BDE8F0810000B0 +:103F0000A00000200246012070470246888888B938 +:103F1000C88878B9887800F07F00507090780328BE +:103F200008D0507810B10220907001E0012090700C +:103F3000002070470120FCE770B504460D460126BD +:103F4000A8782549087008460078012842D8A0784A +:103F500001283CD0022802D0032839D110E01E48A5 +:103F6000007858B1D4F8A80042681B480178204670 +:103F700090471948007820700320A070002628E0A0 +:103F80001548007860B9D4F8A80082681248017812 +:103F9000204690471048007820700220A07014E05E +:103FA00020780D49097888420FD02178D4F8A800EC +:103FB000826820469047084800782070D4F8A8000E +:103FC00042680548017820469047002601E000E05D +:103FD00000BF00BF304670BDA20000200246002096 +:103FE000704770B504460D460026287800F003009F +:103FF00020B1012828D0022827D111E0A07802287A +:1040000002D0032809D100E000BF6888012803D14D +:1040100001212172002070BD00E000BF00BF15E04B +:104020002E79A07803280ED1688860B95EB1802E01 +:1040300009D000BFD4F8AC003146426B204690470F +:1040400000BF0020E7E701E000E000BF00BF012063 +:10405000E1E702469078012804D0022803D0032823 +:104060000BD101E00AE009E0087928B98878D2F894 +:10407000A83058700020704700E000BF00BF01204A +:10408000F9E702460020704710B50346D3F8A44074 +:10409000E46854F821000478148010BD10B50A4873 +:1040A00090F8900000B910BD04F080FA0120074993 +:1040B000487002F0B1F804F095FA00BF00F06AF819 +:1040C0000028FBD000BFEEE7FC030020F04A0020F0 +:1040D00070B5124890F8900000B970BD1048007893 +:1040E00000B9FAE70E48807800B1F6E70D4804F011 +:1040F000DDFF0546FCF744F8002407E0FCF736F83E +:10410000C1B2074823300155601CC4B2202CF5DB36 +:104110000348233006F09CFB00BFDEE7FC030020D1 +:10412000F04A00200010004010B50446154890F8F1 +:10413000900000B910BD1448007800B9FAE713499F +:10414000086A8047032801DD132060711048007859 +:1041500080F001000E4908700B480078A0730846F3 +:10416000007808B10320A07207482330084A12786B +:10417000102313FB02011A4604F10F00FCF708F8A4 +:1041800000BFD7E7FC030020F04A002034030020E2 +:104190001405002030B589B01C208DF800001120D6 +:1041A0008DF801008DF802008DF803008DF80400F1 +:1041B00013208DF80500062406E004F15B00C0B270 +:1041C0000DF80400601CC4B2212CF6DB684604F034 +:1041D00019FB20208DF80000684604F075FA2020B5 +:1041E0008DF800009DF80600612809D19DF81D009A +:1041F000782805D19DF81E00792801D1012500E01D +:104200000025284609B030BD10B5044644B101214F +:10421000084802F09FF90221074802F09DF907E0E3 +:104220000221054802F096F90121024802F094F9B2 +:1042300010BD00000008014000100140194890F82E +:104240007B0020B1174890F87B001749887015480B +:1042500090F87C00A0B114488078022802D1012097 +:1042600011498870104880781A2802D119200E4907 +:1042700088700D488078502802D14F200A498870F4 +:1042800009488078002806DD07488078054991F8BC +:104290007510884204DD01200349887000207047B2 +:1042A0000120FCE7FC030020A80300200748407819 +:1042B000012803DB05484078202804DD012003495C +:1042C0004870002070470120FCE70000A803002090 +:1042D000114890F87D0020B10F4890F87D000F49FB +:1042E00048700D4890F8810030B10C48407804289F +:1042F00002DA04200949487008484078012803DBA5 +:1043000006484078092804DD01200449487000204F +:1043100070470120FCE70000FC030020B0170020DC +:104320000221084AD17000219180002006E0064950 +:1043300001EB800100220A60411C88B2C828F6DB2C +:1043400070470000685E0020485B002001460020A6 +:1043500008E0094A02EB800201EB80031B6813604E +:10436000421CD0B21E28F4DB0122034B9B1FDA70E3 +:1043700000229A80704700006E5E002010B5002079 +:1043800005494870087008710449886A80470249E5 +:1043900048710120C87010BD1505002034030020AD +:1043A00010B51A4890F8C40000B910BD1848C07B79 +:1043B00000B9FAE71648407C802800DBF5E7144A8C +:1043C000517C907C00F02AF81148407C401CC1B21E +:1043D0000F484174807C00EB80220E4800EB4200C5 +:1043E000407881420FDB002109484174007C401C69 +:1043F000C1B2074801740A2905DB0021C1730648D0 +:10440000816B0120884700BFCFE70000FC0300203C +:10441000335B0020364B00203403002070B58AB097 +:1044200004460D4620208DF80400274881690DF1CF +:10443000050088472449086A8047032801DC3120A9 +:1044400000E032208DF8090000208DF80A008DF878 +:104450000B001D49886C8047014604EB84221B48F1 +:1044600010F8120061F31F10C0B28DF81000002088 +:104470008DF8110004EB8421144800EB41004078D2 +:104480008DF812008DF8135004EB84220F4800EBD6 +:104490004200801C00EB0511102205A8FBF778FEF6 +:1044A0001B210DF1090001F017FBC0B28DF82400AB +:1044B0000549C86A8047064603483146426B01A851 +:1044C00090470AB070BD000034030020364B002036 +:1044D0002DE9F04190B0804620208DF800000DF1CC +:1044E000010001F0FBFE00208DF806008DF80700AA +:1044F000B8F1010F23D1002618208DF8050081485E +:1045000090F87F0080B380484078002801DD0120CA +:1045100000E000207C498978002901DD012100E0CC +:10452000002100EB41007849C978002901DD012113 +:1045300000E0002100EB81008DF806001AE005265E +:1045400019208DF805006F4890F87F0060B16E4823 +:104550004078002801DD012000E000206A498978C8 +:10456000002902DD012101E004E0002100EB41000F +:104570008DF806000025BDE06448C07AA84200D14D +:10458000B6E0634890F8200000286DD1002426E0B2 +:1045900005EB4502C2EB85135C4A0C321A44521CEF +:1045A000331903EB430302EB43019DF80500FFF7CA +:1045B0000DFA05EB4502C2EB8513544A0C321A443E +:1045C000521C331903EB430302EB430002AA0523F9 +:1045D00003FB04211A4602F098FD601CC4B2052CAE +:1045E000D6DB484890F8840033287CD1454890F8C1 +:1045F0008500012877D102F035F9002873D0042412 +:10460000002004EB4401062202EB41010DF80100F9 +:1046100004EB4401072202EB41010DF8010004EB19 +:104620004401082202EB41010DF8010004EB4401B2 +:10463000092202EB41010DF801001D210DF10500D9 +:1046400001F04AFA0746381204EB44010A2202EB51 +:1046500041010DF80100F8B204EB44010B2202EB1A +:1046600041010DF801003EE0002426E005EB450283 +:10467000C2EB8513254A0C321A44521C331903EB42 +:10468000430302EB43019DF80500FFF79FF905EB9B +:104690004502C2EB85131D4A0C321A44521C3319D1 +:1046A00003EB430302EB430002AA052303FB0421AF +:1046B0001A4602F02AFD601CC4B2042CD6DBFF208F +:1046C0008DF81C008DF81D008DF81E001A210DF1CB +:1046D000050001F001FA074638128DF81F00F8B204 +:1046E0008DF8200000BF2946684600F0EBFD00BFB2 +:1046F000681CC5B20548007AA8423FF73DAF10B02C +:10470000BDE8F081FC030020B70300205820002002 +:10471000B406002070B588B01C208DF800000DF1A3 +:10472000010001F0DBFD15208DF80500002442E0BA +:104730002448C07AA04200D13BE0002515E004EBFC +:104740004402C2EB84131F4A0C321A44521C05EB7C +:10475000450302EB43000DF10602022303FB052192 +:104760001A4602F0D2FC681CC5B20A2DE7DB1648D7 +:1047700090F88400332817D1134890F88500012859 +:1047800012D102F06FF878B100208DF81A001621CE +:104790000DF1050001F0A0F9064630128DF81B005E +:1047A000F0B28DF81C0000BF2146684600F08AFD7B +:1047B00000BF601CC4B20348007AA042B8DC08B055 +:1047C00070BD000058200020FC0300202DE9F041BE +:1047D00090B0064623208DF800000DF1010001F095 +:1047E0007DFD16208DF80500012E01D1002000E08E +:1047F00005208046002569E03848C07AA84200D1EB +:1048000062E0002417E005EB4502C2EB8513334A52 +:104810000C321A44521C08EB040303EB430302EB73 +:1048200043000DF10602062303FB04211A4602F0A1 +:104830006CFC601CC4B2052CE5DB294890F88400B0 +:1048400033283CD1264890F88500012837D102F062 +:1048500009F8A0B30424002004EB4401062202EB73 +:1048600041010DF8010004EB4401072202EB410174 +:104870000DF8010004EB4401082202EB41010DF8A0 +:10488000010004EB4401092202EB41010DF8010093 +:104890001D210DF1050001F01FF90746381204EB48 +:1048A00044010A2202EB41010DF80100F8B204EBC9 +:1048B00044010B2202EB41010DF8010000BF294623 +:1048C000684600F0FFFC00BF681CC5B20348007AD0 +:1048D000A84291DC10B0BDE8F08100005820002013 +:1048E000FC03002010B58AB01548007810B90020EC +:1048F0000AB010BD00201249087020208DF8000079 +:10490000104881690DF1010088471A208DF80500D3 +:1049100001208DF806000C480068CDF80700094911 +:10492000886A80478DF80B000649086B804704466B +:1049300004482146426B684690470120D8E70000B2 +:104940003D050020340300203E05002010B51A4824 +:10495000007A1949C97900EB012084B2601C84B245 +:1049600020121549C8710846047204F051FB13481F +:104970000078401CC0B211490870192819DB0020CA +:1049800008700F4890F8800038B10E48407820B188 +:104990000C484078401E0B4948700B48807828B975 +:1049A0000A48806A401C0949886202E000200749E1 +:1049B000886204F03FF810BD24170020D2030020C5 +:1049C000FC030020B50300204C170020B406002093 +:1049D000704710B500F08AFB05F050FC10BD0000D8 +:1049E00010B5002006498870002205210448C01C2B +:1049F00002F096FB0020034981F8200010BD000062 +:104A00004C170020B406002010B500F093F802F017 +:104A100021FE05F027FC00F069F800F02BF8FEF706 +:104A2000EDFE10BD10B500F030F802F07FFAFEF791 +:104A3000B3FE0548807D28B10020034988750349ED +:104A4000C86E804710BD0000B4060020FC030020A3 +:104A500010B50749086A8047032804D00449086A4A +:104A60008047062801D1012010BD0020FCE700008E +:104A70003403002010B502F087FA04F08DFB02F039 +:104A80004FF8012000F0E2F910BD00B591B0684682 +:104A900003F006FB08B911B000BD9DF801006028C5 +:104AA00003D09DF80100612809D19DF8020030B1C2 +:104AB00001F002FC9DF80210884200D0EBE703F001 +:104AC000DBFD9DF80100602803D1684603F072F811 +:104AD0000AE09DF80100612803D1684603F07EF9E1 +:104AE00002E0684603F0C6FA00BFD4E710B503F051 +:104AF000F1FA04F05DFB10BD70B5C0B005460E467E +:104B00001446601CC2B20A486946036A28469847A0 +:104B10009DF80000F52808D1224631460DF101002C +:104B200002F0F3FA012040B070BD0020FBE7000066 +:104B3000B802002010B5C0B00D226946C020FFF7B2 +:104B4000DBFF88B10D22B349684602F0DEFA0D2280 +:104B5000B149684602F0D9FAB0480C21D0F80C21CE +:104B6000AD48401C904709E00120AA49491E487001 +:104B700000220C21A748401C02F0D2FAFFF7A8FB44 +:104B8000032269464FF48560FFF7B6FF78B1032230 +:104B9000A349684602F0B9FAA14A521ED378927826 +:104BA00003EB022290B29D4AD2F8041188470722F3 +:104BB00069460020FFF7A0FF28B1072299496846FF +:104BC00002F0A3FA1EE00121964A521E5170917024 +:104BD00011460979D27801EB022188B20120011235 +:104BE000904A521ED170114608718979527901EBB1 +:104BF000022188B2012001128A4A521E51711146C7 +:104C0000887100BFFFF752FBFFF718FB0D226946C2 +:104C10000820FFF771FF28B10D228349684602F092 +:104C200074FA05E0FF2206217F48C01C02F078FAE2 +:104C300004F068F8042269461820FFF75DFF28B1E8 +:104C400004227A49684602F060FA04E0FF22042157 +:104C5000764802F065FA062269463020FFF74CFFDD +:104C600028B106227249684602F04FFA0AE0002095 +:104C70006F49491E48704870C87008710A20487111 +:104C8000082088711A226946A020FFF735FFE0B19D +:104C90001A226849684602F038FA604890F8C40061 +:104CA000C0B16448401E80780E2813D16148401E70 +:104CB000C07814280ED15949D1F8D400804748B99A +:104CC00001205D4981F8200004E000221A215948A2 +:104CD00002F026FA082269464020FFF70DFF60B176 +:104CE0000020554988859DF80000402811D068466D +:104CF00000F002FE504988850BE0092422466946EF +:104D00004E4802F002FA22466946402000F05AFC62 +:104D100000BF04226946D020FFF7EEFE28B104222E +:104D20004749684602F0F1F904E0002204214448B2 +:104D300002F0F6F903226946D820FFF7DDFE28B11C +:104D400003224049684602F0E0F906E001203D49AF +:104D5000491E487000208870C87006226946F020FD +:104D6000FFF7CAFE48B306223749684602F0CDF97C +:104D70002A4890F8820028B1284890F882003249E9 +:104D8000491E88703048401E807820B12E48401E51 +:104D90008078042803DD01202B49491E88702A48A9 +:104DA000401EC0781F49491E8978884219D01D4984 +:104DB000491E887804F03AF813E0184890F8820009 +:104DC00030B1164890F882001F49491E887003E0F0 +:104DD00001201D49491E88701249491E887804F037 +:104DE00025F8012269464FF4A070FFF785FE20B137 +:104DF0009DF800001049C8750AE0084890F8850041 +:104E000018B101200C49C87502E000200A49C87594 +:104E100040B010BDB1170020BF170020FC030020D8 +:104E2000C4030020A9030020A3170020B103002021 +:104E3000251700204D170020B4060020BCA900084B +:104E4000A3030020B8030020BC0300200149087020 +:104E5000704700004C20002030B58BB000F0BCFD46 +:104E600008B10BB030BD01F05BFE20208DF80400CE +:104E70000DF1050001F032FA10208DF8090001F063 +:104E80001BFA8DF80A00A5208DF80B0001F020FA1E +:104E90008DF80C00554840798DF80D005348807905 +:104EA0008DF80E0008220DF10F01514802F02DF986 +:104EB0004F48401EC07800F00F008DF8110001F03F +:104EC00001FA022803D001F0FDF9052805D19DF86B +:104ED000110040F080008DF811004648007820B1A4 +:104EE000012815D0022837D120E001208DF81700C5 +:104EF0000C2206A9404802F008F9404890F88400C6 +:104F00001E2801D1012000E002203A49087027E064 +:104F100003208DF81700092206A9394802F0F5F898 +:104F200034480078401C3349087019E002208DF89D +:104F30001700344840788DF818003348007A8DF80F +:104F4000190004220DF11A012F48001D02F0DDF8AE +:104F500000202849087003E000202649087000BF9F +:104F600000BF002435E02848C07AA04200D12EE0DE +:104F700001F03AFA20B12448001D005D8DF80C00C4 +:104F80001E4890F884001E280CD01C4890F884001D +:104F9000332817D1194890F88500012812D101F063 +:104FA00061FC78B11A210DF1090000F095FD05466C +:104FB00028128DF82300E8B28DF8240020208DF807 +:104FC000040000BF214601A800F07CF900BF601C6E +:104FD000C4B20D48007AA042C5DC03200B4908701A +:104FE00000204870887000BF3BE70000A803002045 +:104FF00025170020CD030020B2170020FC0300205D +:10500000C1060020BB030020582000204C200020B7 +:1050100010B588B01F208DF80000134881690DF18C +:105020000100884710208DF8050001F045F98DF842 +:10503000060018220DF107010C4802F066F8002462 +:1050400005E02146684600F03DF9601CC4B20848FE +:10505000007AA042F5DC0320064908700020487061 +:10506000887008B010BD0000340300203417002001 +:10507000582000204C20002030B589B004461F2065 +:105080008DF80400154881690DF10500884733202B +:105090008DF8090034B917220DF10A01104802F009 +:1050A00034F805E017220DF10A010E4802F02DF840 +:1050B00001F00EF98DF8230001F09CF90546294610 +:1050C00001A800F0FFF8032007490870084640785F +:1050D000401C48700020887009B030BD34030020A7 +:1050E0008B170020CD1700204C20002010B502F0B7 +:1050F0000FFA7048007800B910BD6E480078082893 +:1051000079D2DFE800F0D20412153A576AA701F00D +:10511000D9F8032806DD684890F87A0010B100F04D +:1051200031F901E0FFF798FEC0E000F02BF9BDE097 +:1051300060488078401CC0B25E4988700A2813DA43 +:105140005D48D0F8F410012088475B48007850B1E2 +:1051500001F0B8F8082803D001F0B4F8092802D10A +:10516000554908698047A1E05348D0F8F410002061 +:10517000884704204F49087098E001F0A3F80328FD +:1051800005DCFFF7C7FA06204A49087011E001F074 +:1051900099F8032807DD484890F87A0018B10120F3 +:1051A000FFF796F902E00120FFF710FB05204149C7 +:1051B00008707BE001F086F8032807DD3E4890F890 +:1051C0007A0018B10220FFF783F902E00220FFF70E +:1051D000FDFA06203749087068E002F0B3FA02F0E1 +:1051E000FBFE48B1002033494872087233484860DA +:1051F000072008702DE058E02F4890F8340068B17F +:105200002D49486C804748B100202A4948720872ED +:105210002948C06B4860072008701AE001F052F876 +:10522000032803DD244890F87A0048B921484078E3 +:10523000022805DB00201F494870FFF70DFE08E03B +:1052400002F004F910B900F09DF802E00020FFF729 +:10525000FDFD2BE017494868804770B11548407A3A +:10526000401C144948720846407A50281CDB012033 +:10527000134908700F49087016E00E49097A491C55 +:105280000C4A11720C4991F884101E2901D1142086 +:1052900000E050200749097A814204DB0121084AD5 +:1052A0001170044A117000BF00E000BF00BF00BFD2 +:1052B00022E700004C200020FC030020D97F0008DA +:1052C000CD03002030B591B005460C462878401C2F +:1052D000C2B26946284601F018FF124890F87E00D5 +:1052E00060B19DF80000001FC0B28DF800009DF86D +:1052F00000200DF10101081D01F007FF0A49085DBA +:1053000003F018FC0748D0F8A41068468847064800 +:10531000025D9DF800100548436A0DF101009847B1 +:1053200011B030BDFC03002058200020B80200203E +:1053300010B590B00446F5208DF80000AA208DF835 +:1053400001008DF802002078401CC2B20DF103016B +:10535000204601F0DAFE9DF80320D21CC2F1400283 +:10536000D1B29DF803206B461A44D01C002201F0F4 +:10537000D7FE0348402142696846904710B010BDEF +:10538000B802002030B58BB000F03EFB08B10BB086 +:1053900030BD01F0C5FB8448D0F8D010002088470C +:1053A000012800D1F3E700F06BFD7F4890F87F0003 +:1053B00040B17D4890F87F00002879D07B48C078C4 +:1053C0000028FAD020208DF804000DF1050000F02F +:1053D00085FF00F077FF032801DC132000E0142094 +:1053E0008DF8090000F06EFF032806DD6E4890F886 +:1053F0007A0010B117208DF809006D48C0798DF83A +:105400000A006B48007A8DF80B001A2203A969483C +:1054100001F07BFE6448007878B100F053FF082863 +:1054200003D000F04FFF092807D16248401E807862 +:1054300040F040008DF80D0006E05E48401E807888 +:1054400020F040008DF80D005748016A01A88847F8 +:1054500028B15549D1F8B000804700285DD100F04F +:1054600031FF032852DD504890F87A00F0B317203E +:105470008DF8090004220DF121014F4801F045FE8D +:105480004D48401E4079401C4B49491E4871084612 +:105490004079072801DD002048714748401E4079C7 +:1054A0008DF8200000F00EFF052802D1012001E058 +:1054B0006FE000204049491E497808438DF82100DB +:1054C0003D48401E80788DF822003749D1F8F80019 +:1054D00080478DF82300344890F88400282804D0B1 +:1054E000314890F8840029280AD100E00EE01B2101 +:1054F0000DF1090000F0F0FAC0B28DF824000CE0C4 +:105500002D48401E00798DF8240006E0A5208DF876 +:10551000210000F0DDFE8DF82200002435E0274850 +:10552000C07AA04200D12EE000F05EFF20B12348F7 +:10553000001D005D8DF822001B4890F884001E2895 +:105540000CD0194890F88400332817D1164890F8E9 +:105550008500012812D101F085F978B11A210DF1E9 +:10556000090000F0B9FA054628128DF82300E8B2C8 +:105570008DF8240020208DF8040000BF214601A8EA +:10558000FFF7A0FE00BF601CC4B20C48007AA04226 +:10559000C5DC03200A49087008464078401C487062 +:1055A0000020887000BFF2E6FC030020B703002053 +:1055B000241700204D170020A303002058200020AE +:1055C0004C20002070B5C0B006460C461546F520AC +:1055D0008DF800002A460DF10101204601F095FDED +:1055E000681CC2B203486946C36930469847012027 +:1055F00040B070BDB80200200348407808B10120D7 +:1056000070470020FCE700007E4200200020034994 +:105610004870034908800349088070477E42002093 +:10562000E4030020E603002030B59BB03748407803 +:10563000082866D2DFE800F065040D10393D575B9D +:10564000324AD078324A116B8847FF202F49487080 +:1056500058E0FFF7DBFF55E02C4800892B49C9884B +:1056600000EB01212B480088401C80B2294A1080A1 +:10567000814200DC46E020208DF84400002403E055 +:1056800011A80455601CC4B2202CF9DB2249C86A59 +:105690008047054620482946426B11A890471B4A7F +:1056A000907A1B4AD16888472CE000201B4908806B +:1056B00028E09DF80400202801D01BB030BD9DF8E3 +:1056C000050000B1F9E79DF80600012800D0F4E7D5 +:1056D0009DF80700022800D0EFE710480088401C22 +:1056E0000E4908800EE000200D4908700AE00D48C0 +:1056F000007800B906E00649486B80470849087001 +:1057000000E000BF00BF00BFD7E700007E420020DE +:10571000B8020020E403002034030020E603002048 +:10572000E8030020E9030020114A4368136003895D +:105730009380837A9371521E52780A700C4A521EDB +:1057400092784A700A4A521E12798A70094A12885F +:105750001212CA70074A12780A71074A1288121286 +:105760004A71054A12788A71044A1278CA717047E0 +:105770007F420020E4030020E6030020E80300202D +:10578000002107E048F2782100BF0A1EA1F10103C1 +:1057900099B2FAD1021EA0F1010398B2F2D170477A +:1057A000002106E01E2100BF0A1EA1F1010399B2EB +:1057B000FAD1021EA0F1010398B2F3D17047002183 +:1057C00005E01E2100BF0A1EA1F10101FBD1021E4E +:1057D000A0F10100F5D1704710B504464FF4C8712F +:1057E0004FF4E150FBF7F8FB10BD000070B586B038 +:1057F0000446002002900390049005903B48006806 +:1058000001900126E0780B2804D00C2808D00D2840 +:105810005FD158E03648A1880180A17981705AE0B3 +:105820002079012802D02079022822D1A07980286D +:1058300000DB50E02079401EC5B2217905EB8522BE +:105840002B48C01C00F81210617905EB852200EB93 +:105850004200417005EB85222549C91C01EB42013C +:10586000891CA27901EB02101022E11DFAF790FCCD +:1058700028E0207900F0800020B3A079802800DBA8 +:1058800029E0207920F08000401EC5B205EB85217B +:105890001748C01C00EB410040788DF80500A07946 +:1058A0008DF8060005EB85221148C01C00EB420074 +:1058B000801CA27900EB021110220DF10700FAF70B +:1058C00067FC132607E00B4861680160A16841602E +:1058D00001E0002600BF00BF2EB1E178334601AAE7 +:1058E000602004F045FB06B070BD00000CAA000863 +:1058F000334B00203A5B002010B502460023002401 +:10590000002108E0505C1844C3B2081D105C20441C +:10591000C4B2481CC1B20429F4DB83F0A50384F0AF +:10592000A50403EB042080B210BD0000014601F184 +:105930000800C0B20246044B93F87530984201DD6E +:10594000012070471046FCE7FC03002010B501461B +:105950000020002314E04FF6FF7404EA83028C5CFD +:105960004CB9541C0C5D34B9941C0C5D1CB9D41C8E +:105970000C5D04B902E0441CE0B200BF5C1CA3B2A1 +:105980000A2BE8DB10BD00000C480078401CC0B2B8 +:105990000A490870FA2801DA0020704700200749F8 +:1059A0000870084640782D2803DB0020487001204D +:1059B000F3E70020014948700220EEE715050020BA +:1059C0000448007820B10348007908B101207047ED +:1059D0000020FCE7EC03002010B500F005FD08B93D +:1059E000002010BD0748007880F0010005490870CC +:1059F0000846007818B1FFF70BFB0120F1E7002003 +:105A0000EFE70000CE03002010B5244890F82100F5 +:105A100080B32348007880F001002149087048B322 +:105A20001E4890F82300A0B11C4890F8240080B1D3 +:105A30001C48007818B90020FFF71EFB02E0012087 +:105A4000FFF71AFB1748007880F00100154908702D +:105A50000EE0124890F8230018B10020FFF70CFB6D +:105A600006E00E4890F8240010B10120FFF704FB77 +:105A7000012010BDFFE7094890F8220060B10A48F4 +:105A8000807848B90020054981F8220081F821007A +:105A900081F8230081F824000020EAE7B406002002 +:105AA000D0030020D10300204C1700200246002123 +:105AB00007E00748405C904201D108467047481C07 +:105AC000C1B20348407A8842F3DCFF20F6E70000C9 +:105AD000582000207047000070B5024600201CE0EE +:105AE00003134FF6FF7404EA00101478E51704EB73 +:105AF000157583EA25150C4E36F8155068400313CA +:105B00004FF6FF7404EA0010147804F00F045C40B0 +:105B1000354635F814406040521C0C1EA1F10105B9 +:105B2000A9B2DDD170BD00009CA90008704700003B +:105B300070B505460E46D5F8B040012E18D1207834 +:105B4000F52805D16078AA2802D1A078AA2802D029 +:105B50002046FFF7BFFF002003F01AF90548C16C8B +:105B6000E01C8847402322460121284603F065FDBA +:105B700070BD00003403002070B504460D4681213D +:105B8000204603F0E3FC0121204603F0DFFC002067 +:105B900070BD000070B504460E4643211B48FAF75D +:105BA0001EFB1B4B4FF4A0720021204603F034FD76 +:105BB000174BDB1D4FF480720021204603F02CFDB3 +:105BC0004023124A0121204603F037FD1148816924 +:105BD000C4F88810C169C4F884100C48C4F8B00037 +:105BE000D4F8B40078B100250BE0D4F8B40050F834 +:105BF000250020B1D4F8B41051F825008047681C66 +:105C0000C5B2042DF1D3002070BD00007006002045 +:105C1000D10000208C020020024619B1C2F8B41055 +:105C2000002070470220FCE770B506460C4615467A +:105C30002B4622468121304603F082FD002070BDB4 +:105C40002DE9F04105460C460127D5F8B060607893 +:105C50000C2865D2DFE800F0642D394364640664E3 +:105C6000644D595F60882221B1EB202F0ED1E0886E +:105C7000202801D9202000E0E088024600232B499B +:105C800005F1440003F092FB002711E06088212118 +:105C9000B1EB202F0CD1E088092801D9092000E0C0 +:105CA000E08802460023224905F1440003F07EFB10 +:105CB00037E0E088022807D100230222314605F1AF +:105CC000440003F073FB00272BE00023012206F1C0 +:105CD000410105F1440003F069FB002721E00023A6 +:105CE000012206F1420105F1440003F05FFB0027A9 +:105CF00017E0A07886F84000E2880023314605F1DD +:105D0000140003F053FB00270BE06088001286F8B4 +:105D10004100002705E0A07886F84200002700E057 +:105D200000BF00BF3846BDE8F081000018A9000898 +:105D3000C800002010B50020002126E000220CE061 +:105D400001EBC10303EB0113114C23449B5CFF2BBC +:105D500001D040F00100531CDAB20E4B1B789A427E +:105D6000EEDB0D4B33F811400A4B1B78B4EBC30F3D +:105D700007DB0A4B33F81140064B1B78B4EBC30F1B +:105D800001DA40F002004B1CD9B22829D6DB10BD45 +:105D9000E4060020A003002084160020D416002072 +:105DA00030B500220023C1F3C70201F00703845C71 +:105DB00001259D402C43845430BD00002DE9F04165 +:105DC00005460E4690461A490868C11700EBD16196 +:105DD0004911184A116010460068801D1649086074 +:105DE000102001F04BF9074610213846FAF7F7F971 +:105DF000002403E0305D11490855641C0D4800681B +:105E0000B4EB800FF6DB002403E0285D0C49085555 +:105E1000641C102CF9DBFBF7DDFCFBF743FB1022C5 +:105E200008493846FAF7B4F93846BDE8F081000071 +:105E3000600500205C05002058050020186900203E +:105E4000AC670020BC67002010B50A48007978B91B +:105E5000084890F8060858B900210748C173074957 +:105E6000886E80470548816B01208847012010BD5E +:105E70000020FCE7334B0020335B0020340300207C +:105E800010B50C480078401CC0B20A4908700A28B6 +:105E90000ADD084600780C2801DD0020087006485D +:105EA000416D0120884703E00348416D0020884789 +:105EB00010BD0000CF030020B802002033B581B030 +:105EC0000D460122694601A8FBF79EFA044614B963 +:105ED0009DF800003EBD0020FCE72DE9F04104469E +:105EE0000D4616469846324629462046FBF78CFA60 +:105EF000074617B90120BDE8F0810020FBE700212B +:105F000007E048F2782100BF0A1EA1F1010399B20F +:105F1000FAD1021EA0F1010398B2F2D1704700003D +:105F20002DE9F04105460E4619490868C11700EBF6 +:105F3000D1614911174A116010460068801D164949 +:105F40000860104600688700102001F097F880462E +:105F500010214046FAF743F9002403E0305D0F4971 +:105F60000855641CBC42F9DB002403E0285D0C49A1 +:105F70000855641C102CF9DBFBF72CFCFBF732F8FE +:105F8000102208494046FAF703F94046BDE8F0817F +:105F9000600500205C0500205805002018690020DD +:105FA000AC670020BC670020014908607047000012 +:105FB0001404014001460748006800EA0102054850 +:105FC0001438006800EA010312B10BB101207047D8 +:105FD0000020FCE71404014070B5044660792828CD +:105FE00019D1A07900B970BD012015490870607AF7 +:105FF000217A00EB012012494880A079012802D1C2 +:106000000020487002E051200D4948700D49D1F838 +:10601000A000804712E00A48007878B100200849C3 +:1060200008700949C86A804705460749886A804759 +:10603000064606482946826A3046904700BFD2E7A6 +:10604000EC030020FC03002034030020B8020020F1 +:1060500070B504462848007808B9002070BD27486C +:106060000078B8B92649C86A804705462249487869 +:1060700024498A6A294690470120A0722049886AEB +:106080008047E0721C484088001220731A488078CC +:10609000607323E01A49C86A804706461849886A2F +:1060A0008047054617483146826A28469047164879 +:1060B00090F87A0068B10120A0721149886A80477F +:1060C000E0720D484088001220730B48807860739E +:1060D00004E00020A072E072207360730A48D0F8D8 +:1060E0009C10204688470548007880F0010003494D +:1060F00008700120B2E70000EC030020F20300204A +:1061000034030020B8020020FC03002008B50F2053 +:106110008DF80000044800798DF8010002226946DC +:106120000B2000F003F808BDEC03002070B590B020 +:1061300004460D46164640216846FAF750F81F20DF +:106140008DF80000E1208DF801000949C8698047F9 +:106150008DF802008DF803403246294601A8FAF76F +:1061600017F80348416C6846884710B070BD0000BE +:10617000340300204179014A11717047EC0300207B +:106180000148007870470000EC03002001460D48EC +:10619000007808B9002070470A48408800280EDDC2 +:1061A00048780A7800EB0220064A5288904206D1CD +:1061B00004484088401C034A50800120EBE700203F +:1061C000E9E70000EC03002010B5002821D0114BB6 +:1061D0000022001F196803E0814203D80A4649687B +:1061E0000029F9D152B11368841A9C4204D1006885 +:1061F00018441060104602E0506000E0186039B1A9 +:1062000002680B1A934203D10B681A440260496872 +:10621000416010BDAC05002010B520211448F9F7ED +:10622000DEFF2022134912482030F9F7B1FF002485 +:106230000AE00F482030005D0F49095D48400C49D5 +:1062400020310855601CC4B2202CF2DB0023084A20 +:106250003032074901F12000FAF7F2FF0023044A27 +:106260002032A2F1100101F12000FAF7E9FF10BD80 +:10627000F34A0020C5A9000810AA000801460148F9 +:10628000405C704710AB000810B50446202202495C +:106290002046F9F77DFF10BD134B0020044890F80D +:1062A000900008B90020704702480078FBE7000022 +:1062B000FC030020F04A00200148407870470000AD +:1062C000A80300200148407870470000B017002064 +:1062D00001480079704700005820002010B504469E +:1062E0000B484078032803D009484078062808D195 +:1062F000AA202070BB206070CC20A070DD20E07050 +:1063000004E004222146034800F0FFFE10BD000017 +:10631000B0170020B103002001480078704700004A +:106320004C20002017488078282803D104201649E3 +:10633000C87224E01348807810280FD11248C07A20 +:10634000032807D01048C07A022803D002200E4943 +:10635000C87214E003200C49C87210E00948807824 +:1063600018B101200849C87209E00648807818B9B8 +:1063700005200549C87202E000200349C87202489E +:10638000C07A70474C170020B40600200421017029 +:10639000022141700021817070470000014840785F +:1063A000704700004C17002030B501460022002045 +:1063B00010E00B4C235C03EB43040A4D05EB440453 +:1063C000A478082C04DD441CE5B2541C0D55E2B23F +:1063D000441CE0B2024C647A8442EADC0A7030BDAC +:1063E0005820002058210020014800787047000004 +:1063F000CC0300200020704701480078704700005F +:1064000058200020014601EB810040007047000049 +:10641000F0B503460C4606251F201E781D2E46D2D9 +:10642000DFE806F0450F1C1E2124274545452A2C90 +:106430002F3145454545454534383C454545454062 +:1064400041001E4EB67806F07F06052E03D10421CA +:1064500007261E7001E0082103252BE0042129E016 +:1064600002210C2526E00121172523E00221092520 +:1064700020E0012115251DE004211BE00121162546 +:1064800018E0042116E002210B2513E0032110255A +:106490003C200FE0032110253C200BE001211B25AF +:1064A0003C2007E000BF02211A253C2002E0012128 +:1064B000162500BF00BF21701570F0BD4C170020DD +:1064C0000148007870470000B406002001480079B8 +:1064D00070470000B40600200348017B0020024AF8 +:1064E0001073084670470000B40600201EB5014630 +:1064F000002009E083061A0E084B1344D3F8E8374E +:106500004DF82030431CD8B20328F3DB009B0B600E +:10651000019B4B60029B8B601EBD000000F0FF1FC3 +:1065200001480078704700002C03002000BF044899 +:106530008078052801D1012070470020FCE7000089 +:10654000B40500200248C07A0149085C7047000089 +:1065500058200020416170470161704710B54FF429 +:10656000807303221021024800F004F810BD0000DF +:1065700000080140F0B5044616460025002201F04F +:106580000F0501F0100747B1042E05D145F00305B2 +:10659000E76B1F43E76300E0354300201EE001275F +:1065A00087401F40C7B122684FEA800C0F2707FAC7 +:1065B0000CF7BA43870005FA07F73A43282904D1B4 +:1065C000012787401F40676105E0482903D1012763 +:1065D00087401F4027612260471CB8B20828DED3DD +:1065E000082022E0012787401F40E7B16268A0F140 +:1065F00008074FEA870C0F2707FA0CF7BA43A0F1F8 +:106600000807BF0005FA07F73A43282904D10127F4 +:1066100087401F40676105E0482903D10127874073 +:106620001F4027616260471CB8B21028DAD3F0BD62 +:1066300002469068084008B1012070470020FCE73E +:10664000002101E04A1C91B28142FBDB704700004F +:1066500070B50024FBF740FE00251BE06006040E29 +:106660004FF480711A48FFF777FF0520FFF7E8FF26 +:106670004FF400711648FFF7DBFF08B144F0010446 +:106680004FF480711248FFF765FF0520FFF7D8FF30 +:10669000681CC5B2082DE1DBFBF736FE4FF4007134 +:1066A0000B48FFF757FF0520FFF7CAFF4FF4807133 +:1066B0000748FFF751FF0520FFF7C2FF4FF4807135 +:1066C0000348FFF747FF0520FFF7BAFF204670BDDC +:1066D000000C014070B50546FBF716FE002427E0CC +:1066E00005FA04F000F0800040B14FF40071284832 +:1066F000FFF732FF0520FFF7A3FF07E04FF400711B +:106700002348FFF727FF0520FFF79AFF4FF480711A +:106710001F48FFF721FF0520FFF792FF4FF480711C +:106720001B48FFF717FF0520FFF78AFF601CC4B264 +:10673000082CD5DBFBF7D0FD4FF480711448FFF730 +:106740000BFF0520FFF77CFF002413E04FF40071DE +:106750000F48FFF76DFF58B94FF480710C48FFF7F1 +:10676000F9FE0520FFF76CFFFBF7CEFD012070BDA1 +:10677000601CC4B2642CE9DB4FF480710448FFF75D +:10678000E9FE0520FFF75CFFFBF7BEFD0020EEE70A +:10679000000C014010B54FF400710F48FFF7DCFE0C +:1067A0000520FFF74DFF4FF480710B48FFF7D4FE33 +:1067B0000520FFF745FF4FF400710748FFF7CAFEB9 +:1067C0000520FFF73DFF4FF480710348FFF7C2FE3D +:1067D0000520FFF735FF10BD000C014010B54FF448 +:1067E00000710F48FFF7B6FE0520FFF729FF4FF4B1 +:1067F00080710B48FFF7B0FE0520FFF721FF4FF433 +:1068000000710748FFF7A8FE0520FFF719FF4FF4B6 +:1068100080710348FFF79EFE0520FFF711FF10BDB2 +:10682000000C014030B50B46002100BF16E00A24E1 +:10683000B4EB107F05D9302404EB107403F8114039 +:1068400005E0412404EB10740A3C03F811400001F8 +:1068500000254C00641C1D554C1CE1B29142E6DB46 +:1068600030BD704710B50849D1F8B000804708B175 +:10687000002010BD044890F8850008B90020F8E712 +:106880000248C07DF5E70000FC030020B4060020AC +:10689000F0B591B004460F46474890F8800028B103 +:1068A0004648407810B9002011B0F0BDA0780C28FF +:1068B00007D1607A042804D13F48D0F8D0100120D5 +:1068C00088473D48007808B3FFF7FCFC082803D050 +:1068D000FFF7F8FC092819D1374890F87F0010B16C +:1068E0003748C07820B13749086A8047082806D160 +:1068F0003148C168E01C884708B90020D4E72E4819 +:1069000041692046884708B10020CDE7A0780428D7 +:1069100005D1162625781B2D15DD1B2513E0A07843 +:10692000092802D11C261B250DE0A078072802D0DB +:10693000A078082802D11B261B2504E015262578FF +:10694000102D00DD10258DF804602A460DF105019B +:10695000A01C00F0DAFB607C012814D11649D1F8A4 +:1069600000018047227CE17B02EB0121884204D0B8 +:106970001149D1F80001804758B901A803F0BCFCC7 +:1069800038B9002090E701A803F0B6FC08B9002050 +:106990008AE73A460421E01C00F002F908B9002019 +:1069A00082E72046FDF72AF80348416A04F10F0008 +:1069B0008847012078E70000FC030020B503002091 +:1069C000B7030020340300202DE9F04391B00546C1 +:1069D0000E464FF003090022402101A800F0A0FB61 +:1069E00005274FF004082879242857D2DFE800F063 +:1069F000121C1E2024285656565656565656564990 +:106A00004E5656562C2D2E2F303132333456565684 +:106A100056394344404880780E2803D10D244FF066 +:106A2000090800E00A243DE001243BE0022439E0AB +:106A30004FF00A08032435E04FF00708052431E041 +:106A40004FF0140806242DE000BF00BF00BF00BFB8 +:106A500000BF00BF00BF00BF4FF01508042404278B +:106A600020E00C244FF00308052702208DF80700D2 +:106A70004FF0040916E000BF4FF004080C2404276F +:106A800010E04FF004080C2404270BE04FF014082A +:106A90000B242248416AA81C884703E0002011B05B +:106AA000BDE8F08300BF8DF80440A8788DF805009C +:106AB000E8788DF8060001AA02EB0901E8194246C0 +:106AC00000F023FB28790F2802D101208DF8070060 +:106AD0002879222802D02879232809D19DF8070097 +:106AE0001F2805DB9DF807001F38C0B28DF807008E +:106AF00001A803F001FC08B90020D0E72846FCF704 +:106B00007DFF32460221A81C00F04AF808B9002097 +:106B1000C5E70120C3E700004C170020FC0300205C +:106B200070B500241DE0002104EB4400C0EB84128A +:106B30000F488154002510E004EB4401C1EB84129E +:106B40000B491144491C05EB450201EB42000022B0 +:106B5000062100F0E5FA681CC5B20A2DECDB601CCA +:106B6000C4B203480C38407AA042DCDC70BD00009F +:106B700064200020014688780B280AD1487A03282F +:106B800007D10548D1F8032002600120034A1070A4 +:106B900070470020FCE700003E0500203D05002076 +:106BA0002DE9F04106460F461446062F02DD00206F +:106BB000BDE8F081042C01DB0020F9E735490868C5 +:106BC000804704EB4400C0EB84113348455C0A2D38 +:106BD0005ADA04EB4400C0EB84122F481044401CE6 +:106BE00005EB450200EB42013A46304600F08DFAD3 +:106BF0002A4890F87A0060B1012104EB4400C0EB10 +:106C0000841225481044401C05EB450200EB42006D +:106C10000171B07B012829D12049D1F800018047BA +:106C2000727B317B02EB0121884204D01B49D1F8F1 +:106C30000001804768B90B2104EB4400C0EB8412CB +:106C400015481044401C05EB450200EB4200017161 +:106C50000CE00A2104EB4400C0EB84120E481044FF +:106C6000401C05EB450200EB4200017104EB4400BF +:106C7000C0EB84110848405C401CC1B204EB4400E6 +:106C8000C0EB8412044881540249486880470120BF +:106C90008EE70000B802002064200020FC030020E2 +:106CA0002DE9F04106467078042801DABDE8F0814C +:106CB0007E49086B804728B97C48816E701C8847E4 +:106CC00000B1F3E77948D0F8A810701C884700B9E4 +:106CD000ECE73078FEF7EAFE0746FF2800D1E5E74B +:106CE000741CFFF7BFFD002847D06079912808D0B9 +:106CF0006079922805D06079932802D06079942831 +:106D00003BD16A4890F8850002280BD1207FE17EB4 +:106D100000EB012085B21621601DFEF7DDFEA842C2 +:106D20002AD0C3E7614890F88500032817D1207F57 +:106D3000E17E00EB012085B21621601DFEF7CCFE3E +:106D4000A84219D094F82000E17F00EB012085B221 +:106D50001A21601DFEF7C0FEA8420DD0A6E794F8E8 +:106D60002000E17F00EB012085B21A21601DFEF7B3 +:106D7000B3FEA84200D099E700BF6079912814D0F3 +:106D80006079922811D0607993280ED06079942888 +:106D90000BD0464890F8340038B14448016C204686 +:106DA000884710B101F07CFC80E7404890F87E00F5 +:106DB00048BB6079932802D1A0790E2819D0FFF73B +:106DC00081FA032815D0FFF77DFA062811D037483D +:106DD000007838B1FFF776FA08280AD0FFF772FA80 +:106DE000092806D004223249601C00F07DF900B960 +:106DF0005CE72078001FC2B2611C601D00F085F9BD +:106E00002078001F20706078802800DA4EE701F0BB +:106E100047FC6078912804D139462046FFF7D4FD1D +:106E200041E06078922804D13946204600F04CF8C1 +:106E300039E01E4890F87A0050B16078932802D06B +:106E40006078942804D139462046FFF721FD2AE0D6 +:106E50002078182815D16078A178884211D16078FF +:106E6000E17888420DD160782179884209D1607833 +:106E70006179884205D10F480068401C0D490860BF +:106E800014E70A48D0F8E81020468847074890F8E9 +:106E9000340028B10548016C2046884700B105E759 +:106EA000204600F065F800BF00E70000FC0300206A +:106EB000B1030020C803002010B504462046FFF7A8 +:106EC000EFFE012010BD000030B589B004460D462C +:106ED000A0780C2807D1607A042804D11248D0F891 +:106EE000D0100120884714208DF8040010220DF1E5 +:106EF0000501A01C00F009F901A803F0FDF910B983 +:106F0000002009B030BD2046FCF778FD2A46062156 +:106F1000E01CFFF745FE08B90020F2E70248416A8D +:106F2000E01D88470120ECE7FC03002010B592B07B +:106F30000D490868804740230A2201A90B4801F047 +:106F400093F9044608494868804714B9002012B0F4 +:106F500010BD9DF80400801CC0B28DF8040001A88B +:106F6000FEF7E6F90120F2E7B802002078210020C0 +:106F700010B5044640230A222146024801F03EF99A +:106F800010BD00007821002010B541230F220249D6 +:106F9000024801F061F910BD3C1C0020301C0020AB +:106FA00010B50446012C04D104210848FFF7D2FA99 +:106FB0000AE0022C04D104210448FAF7CEF903E0D8 +:106FC00004210248FFF7C8FA10BD00000008014084 +:106FD00010B50446012C04D102210848FFF7BAFA83 +:106FE0000AE0022C04D102210448FAF7B6F903E0C2 +:106FF00002210248FFF7B0FA10BD0000000801406E +:107000007047704701F05AFA17491848FEF704FE16 +:10701000174A1849154802F0CDFD00F02FFDFFF783 +:107020009DFAFAF72FF900BF1048D0F8AC0081683C +:107030000120884705200D49887000BFFAF7AEF996 +:10704000FBF77AFAFBF7CCFA00BF084880780328F0 +:10705000FBD109494868804704E0074988688047B0 +:1070600000F02AFAF9E7000004000020B40500202F +:107070008C0200207C02002034030020F0B50B308D +:10708000154D20F007010024144A0FE003688B42DD +:107090000BD38B4205D95E1A43184768C3E90067D2 +:1070A00000E04368136002C004E0021D106800287D +:1070B000ECD12046002802D1286808B10020F0BD9C +:1070C000064A07481060074A121A22F00702C0E970 +:1070D000002401202860D7E7B0050020AC0500207F +:1070E000F4790020F07D002030B503460C460021E5 +:1070F00007E0585C655CA84201D0002030BD481C08 +:10710000C1B29142F5DB0120F8E710B5034600203B +:1071100003E01C5C0C54441CE0B29042F9DB10BD4F +:1071200010B50346002002E01A54441CE0B2884225 +:10713000FADB10BD30B591B004460D46402101A8E0 +:10714000F9F74DF81F208DF80400E1208DF80500B7 +:107150000B49C86980478DF806000A208DF80700A2 +:107160002A46214602A8F9F713F80549886D804799 +:1071700018B10348416C01A8884711B030BD000028 +:107180003403002000B589B03A4890F8600008B98F +:1071900009B000BDFEF7F8FB012802D0022865D136 +:1071A00051E03548C078002840D033480079314953 +:1071B00091F87510884218DD00202F49C87003200F +:1071C0008DF804002D49886A80478DF805004D2010 +:1071D0008DF8060014208DF8070005208DF80800B2 +:1071E000052101A8FFF7A6FF2CE023484079401CA9 +:1071F0002149487108460079401C087108464079C9 +:10720000002806DD084640791A4991F87510884231 +:1072100002DD0120184948710020174908704870A4 +:107220000A465079154A516A88470BE003208DF8C9 +:1072300004001249886A80478DF80500022101A8E0 +:10724000FFF778FF13E00C48C07800B9A0E70020F2 +:107250000949C87004208DF80400084640798DF86B +:107260000500022101A8FFF765FF00E000BF00BF95 +:1072700000BF8DE7FC03002015050020340300202B +:1072800010B50446184890F8600008B9002010BDF9 +:107290006079102805D11549886A8047217A88428B +:1072A00014D06079132802D06079142805D10F49D1 +:1072B000886A8047A17F884208D06079172810D15A +:1072C0000A49886A8047E17F88420AD108484078A5 +:1072D000FA2804DA06484078401C05494870012025 +:1072E000D5E70020D3E70000FC0300203403002092 +:1072F0001505002010B50446A0B2FEF751FA10BDE6 +:1073000010B504464F48D0F82404B8B94FF484614E +:107310004C48801CF8F763FFA0794A49C1F828045B +:10732000217AE07901EB00104649C1F83004217A56 +:10733000E07901EB001098B1012010BD217AE079CD +:1073400001EB00103F49D1F83014884201D10220EE +:10735000F3E7217AE07901EB00103A49C1F83004F3 +:107360003848D0F824043030B0F5846F12D90020AA +:10737000344948704FF484613248801CF8F72FFF7D +:1073800000203049C1F82404C1F82804C1F82C04B5 +:107390000320D2E72B48D0F82C04401C2949C1F81F +:1073A0002C040846D0F82C04D1F82814884212D9AD +:1073B0000020244948704FF484612248801CF8F76B +:1073C0000EFF00201F49C1F82404C1F82804C1F8A9 +:1073D0002C040420B1E71B49D1F82424891C50183F +:1073E000302204F10901F8F7D3FE1648D0F824043E +:1073F00030301449C1F8240405201349088011488D +:10740000D0F83004401C0F49D1F82814884216D314 +:107410000C48D0F824040B49C1F83404012048700A +:10742000084690F82304401C81F823040020C1F88A +:107430003804012081F83D04002003490880002021 +:107440007BE70000B0460020F403002010B5174988 +:10745000086D8047052801D0002010BD14484078F1 +:1074600008B90020F9E71348407907280BD100201C +:1074700010494871012000F0BFF80B200C4981F839 +:107480003C040120E9E70A48D0F83804401C0849C8 +:10749000C1F838040846D0F83804B0F5967F03D90F +:1074A00000204870C1F838040020D6E734030020DB +:1074B000B0460020A203002010B51348007800B9A0 +:1074C00010BD114890F83D0490B100200E4981F89C +:1074D0003D040846811CD0F824240C48F8F758FED7 +:1074E00000200949C1F82404C1F82804C1F82C047B +:1074F000064800F025F80220FDF7A8FC002002490C +:10750000087000BFDCE70000B04600208C4200207D +:107510000A4890F83C0480B1084890F83C040B28D5 +:1075200003DD0B20054981F83C04044890F83C0435 +:10753000401E024981F83C0400BF7047B04600205D +:1075400070B58AB0054628216846F8F748FE00263F +:1075500000242748816968468847FE208DF804008A +:1075600048208DF80500DE208DF806009E208DF85D +:1075700007002048B0F834041F30C0F347108DF8DE +:10758000080001208DF809009DF8080041012846F7 +:10759000FEF7A2FA064630128DF80A00F0B28DF816 +:1075A0000B00144890F823048DF80C0013210DF102 +:1075B0000D00F8F714FE2021684600F023F800F0D3 +:1075C00037F8C820FFF796FE0BE02819202100F0BD +:1075D00019F800F02DF83220FFF78CFE04F120009E +:1075E00084B20448D0F83404A042EED80AB070BD8A +:1075F00034030020B04600200149087070470000A5 +:10760000B046002070B505460C46002001F0D4FBC2 +:107610000549C86A80470646E1B204483246436AD3 +:1076200028469847012070BD34030020B80200208E +:1076300010B54FF4FA7408E0FEF772FF00B110BD08 +:107640000220FFF757FE601E84B2002CF4D100BF69 +:10765000F5E7000070B50125002035494872002487 +:1076600015E0FF20324908553248005DFF2807D059 +:107670003048005DFE2803D02E48005DFB2804D171 +:107680002B48407A401C2A494872601CC4B2042C22 +:10769000E7DBFF202649C87200241FE02548005D73 +:1076A000FB280FD0FE2807D0FF2813D120480470F4 +:1076B00000201F4988720EE02846691CCDB21C4983 +:1076C0000C5408E01A48C5722846691CCDB2184906 +:1076D0000C5400E000BF00BF601CC4B2042CDDDB12 +:1076E000002406E0124A105D134A916B8847601C23 +:1076F000C4B20F48407AA042F4DC104880780C49AC +:10770000497A884203DD0A48407A0C49887001F0C2 +:1077100059FB0B48808D48B1FEF76EFE06460849BE +:10772000888D05493246CB6B0421984770BD000017 +:107730005820002072040020B8020020BB03002063 +:10774000B406002070B51E48407A012800DC70BDE8 +:107750001C49086B804700B1F9E71B480078401CC2 +:10776000C0B2194908700A2800DAF0E7002016496B +:10777000087001F0DDF912480578002405E0104991 +:10778000601C085C0855601CC4B20D48407A401E5D +:10779000A042F4DC0A48407A401E09490D540024F6 +:1077A00008E0074B195D1B1D185D084B9A6A90474E +:1077B000601CC4B20248407AA042F2DC00BFC6E7B7 +:1077C00058200020FC030020DC030020B802002029 +:1077D00010B54FF4C87000F053F80149087010BD9F +:1077E0001C05002002460C2901DA002070470448DD +:1077F00083681360C3685360006990600120F5E7F7 +:107800001C0500200148407D704700001C05002039 +:1078100001484078704700001C050020014880881E +:10782000704700001C05002070B504461148807D9B +:1078300078B100200F4988750F49C86A804705460E +:107840000D49886A804706460C482946826A3046B8 +:10785000904774B10748007858B106480078401E38 +:10786000044908700846007818B900F059F8FFF785 +:10787000AFFF70BD1C05002034030020B8020020BB +:107880002DE9F04106461048808B10B90120FAF727 +:1078900003FB0D48808BFA2803DD00200A4988830A +:1078A00004E00948808B401C07498883B5082846B6 +:1078B000FAF7F2FA0446281903498969471A024877 +:1078C00084613846BDE8F0811C05002070B505468E +:1078D0000C460C2C01DD002070BD224629460248D2 +:1078E000F8F756FC0120F7E72405002018B1012124 +:1078F000034A517502E00021014A517570470000AA +:107900001C05002002484078401C0149487070471F +:107910001C05002001498880704700001C050020DC +:1079200030B58BB0282101A8F8F759FC20208DF83C +:1079300004004E4881690DF10500884751208DF8FB +:1079400009004B4840788DF80A004A48007858B141 +:10795000FEF7B8FC082803D0FEF7B4FC092803D1D1 +:1079600002208DF80B0002E001208DF80B003F494A +:10797000886A80478DF80C0000208DF80D008DF886 +:107980000E008DF80F008DF810008DF811003848AA +:10799000407D30B19DF8110040F001008DF81100DC +:1079A00005E09DF8110000F0FD008DF811002F4951 +:1079B000086D8047042806D19DF8110040F00200B0 +:1079C0008DF8110005E09DF8110000F0FD008DF824 +:1079D00011009DF80B00022806D19DF8110040F01F +:1079E00004008DF8110005E09DF8110000F0FB0087 +:1079F0008DF811001E488088000A8DF812001C487E +:107A000000798DF8130000208DF814008DF8150012 +:107A100017488168CDF81610C168CDF81A100069B2 +:107A2000CDF81E001B210DF10900FEF755F80446A4 +:107A3000200A8DF82300E0B28DF8240001200C49C3 +:107A400088750A49C86A804705460B482946826AF4 +:107A5000002090470549C86A8047054603482946E3 +:107A6000426B01A890470BB030BD000034030020EA +:107A70001C050020FC030020B802002010B54FF4C4 +:107A8000A06000F06DF800220221142000F006F83A +:107A900000220121132000F001F810BD2DE9F04172 +:107AA00003460D46164600240027A0462A480068D3 +:107AB00000F4E060B0F5E06F03D100BF4FF00408C0 +:107AC00030E02548006800F4E060B0F5C06F03D1F5 +:107AD00001274FF0030825E01F48006800F4E0602C +:107AE000B0F5A06F02D10227B8461BE01A48006823 +:107AF00000F4E060B0F5806F03D103274FF0010878 +:107B000010E01548006800F4E060B0F5407F03D154 +:107B100004274FF0000805E04FF4A06000F020F8C3 +:107B20000227B846C7F1040005FA00F4C8F10401C1 +:107B30000F20C8403040044324010848C45403F0D7 +:107B40001F01012088405911890001F1E021C1F88D +:107B50000001BDE8F08100000CED00E000E400E071 +:107B600002490143024A1160704700000000FA0513 +:107B70000CED00E070B590B004460D4616460022AC +:107B800040216846FFF7CCFA1F208DF80000E02066 +:107B90008DF80100FEF790FB8DF802008DF8034090 +:107BA000324601A92846FFF7B0FA6846FDF7C0FB48 +:107BB00010B070BD38B50446E078102875D2DFE803 +:107BC00000F0D61E086D2475789683D6D6A1A2A3A0 +:107BD000D0A90E226A49201DFFF797FA0E226849A4 +:107BE0003020FDF7EFFC6648401E407A032805D19F +:107BF0000922644904F10D00FFF787FA00BF0E2245 +:107C00005F490120FFF7B6FFB7E020795E49497868 +:107C1000884208D0FBF7F4FD207AFBF72DFF002007 +:107C200058490D394883607957498978884204D08A +:107C3000012054490D3981F8220060790E2811D1B4 +:107C4000A07914280ED160794F498978884209D0EB +:107C50004E49D1F8CC00804701204A490D3981F8BE +:107C600020000AE060790E2802D1A079142804D0FF +:107C7000002044490D3981F820001A224249491C4C +:107C8000201DFFF742FA1A223F49491CA020FDF7A8 +:107C900099FC3E48C1692046884700BF1A223A49EC +:107CA000491C0320FFF766FF67E060E002F0FCFA82 +:107CB00063E001200090201D02F036FB012269469E +:107CC0000620FFF757FF58E0304890F87A0000B9D7 +:107CD00053E004222E49201DFFF717FA04222C49F5 +:107CE000D020FDF76FFC0520FBF70BF900BF2748FC +:107CF00090F87A0000B940E0042225490720FFF7F8 +:107D000039FF3AE000BF00BF2048D0F8C810204635 +:107D1000884732E0207901280DD117221D49201D06 +:107D2000FFF7F3F9012017490D3981F823000020EE +:107D300081F822000FE0207902280CD11722164981 +:107D4000201DFFF7E2F901200E490D3981F82400CA +:107D5000002081F8220001200A490D3981F8210014 +:107D600000BF17220B490E20FFF704FF05E007486C +:107D7000D0F8DC102046884700BF00BF012038BD86 +:107D800025170020C10600204C170020FC0300200E +:107D9000A30300208B170020CD17002070B590B0F2 +:107DA00004460D461646002240216846FFF7B8F902 +:107DB0001F208DF80000E1208DF80100FEF77CFA0D +:107DC0008DF802008DF80340324601A92846FFF7DE +:107DD0009CF96846FDF7ACFA10B070BD30B589B0BB +:107DE0000446E0781B2876D2DFE800F0DC360E4946 +:107DF0003C5A4F63DC767A95999AA5A6A7DCDCDC21 +:107E0000DCDCA8BCBDD2CE0007226B49201DFFF7E9 +:107E10007CF9FCF74BFAFCF711FA6749491E8878A0 +:107E200000F0D0F9FEF7E8FA05466349491EC87923 +:107E30006249CA6A29469047002508E05E49491E02 +:107E4000C8795E49CA6A29469047681CC5B25C4831 +:107E5000407AA842F2DC00BF072257490120FFF711 +:107E60009DFFA5E00D225749201DFFF74EF900F0B8 +:107E700049FF0D2253490820FDF7A4FB00BF0D2246 +:107E800050490320FFF78AFF92E004224E49201D4B +:107E9000FFF73BF904224C491820FDF793FB00BF84 +:107EA00001A8FEF71BFA042201A90520FFF776FFBF +:107EB0007EE001208DF804004048012201A9C36939 +:107EC0002E2098473D4988688047012201A9072054 +:107ED000FFF764FF6CE065E02046FBF79DF967E083 +:107EE0002079012802D0207902280DD1207901289B +:107EF00001D0012000E000208DF80400012201A93A +:107F00000A20FFF74BFF05E02079042802D12F4912 +:107F1000486E80474CE02046FBF704F848E047E015 +:107F20002A4801A9C26D20469047092201A90D20C7 +:107F3000FFF734FF3CE03BE03AE039E0244880784A +:107F400058B160791E2808D000202149887000228D +:107F500005211F48C01CFFF7E3F81C48816B204631 +:107F6000884725E000BF1948D0F898102046884778 +:107F7000E078182807D1217909B1012100E000211A +:107F8000084600F0E3FE13E0207900F0DFFE00BFBA +:107F90001048C07D8DF80400012201A91920FFF7C7 +:107FA000FDFE05E00948D0F8E0102046884700BFF4 +:107FB00000BF012009B030BDA9030020B802002095 +:107FC00058200020A3170020B1030020FC0300204C +:107FD0004C170020B406002030B593B040230A228D +:107FE00002A9214800F040F910B9002013B030BDBB +:107FF0009DF80800001DC0B28DF804000DF10500C9 +:10800000FEF76CF9FEF7F0F960B1002405E02146B7 +:1080100001A8FDF757F9601CC4B21448007AA042C9 +:10802000F5DC1FE0124890F884001E2813D1104898 +:1080300090F8850078B11A210DF10900FDF74CFD8B +:10804000054628128DF82300E8B28DF82400202080 +:108050008DF8040000BFFEF7CDF90546294601A8BA +:10806000FDF730F90120C1E704240020582000204A +:10807000FC03002070B50446074908688047402388 +:108080000A222146054800F0B9F805460249486829 +:108090008047284670BD0000B8020020042400205C +:1080A00070B50446402311222146034800F0DCF855 +:1080B0000546284670BD0000E417002010B50446B0 +:1080C000402311222146024800F098F810BD00001C +:1080D000E417002010B5402311220249024800F0A5 +:1080E000BBF810BDF0170020E417002010B50446BF +:1080F0000D4890F8C40008B9002010BD012C07D12C +:10810000FDF7A2FE08B10020F7E70848C47409E0B3 +:108110000648C07C30B100210448C17400F0CAFE9A +:108120000120EAE70020E8E7FC030020335B0020A1 +:1081300010B588B00446E078182814D12079124987 +:10814000087060798870F5208DF8000020798DF82E +:10815000010060798DF802000C4803226946C3696A +:108160004FF484609847084800788DF8000006486E +:1081700080788DF8010002236A461721612001F002 +:10818000F7FE08B010BD0000F04A0020B802002041 +:1081900010B504460948847000F014FE0622084910 +:1081A000F020FDF70FFA0A20FDF7A9FE0722034988 +:1081B000491C0020FDF706FA10BD0000A8030020AE +:1081C000BC03002010B50446204600F02FFE00F04E +:1081D000F9FD06220749F020FDF7F4F90A20FDF722 +:1081E0008EFE054884700722411C0020FDF7EAF945 +:1081F00010BD0000BC030020A80300202DE9F041C1 +:108200000446884615461E4612490868804720885D +:108210006188884204D1A088A84201DB002712E0CF +:108220006288A06802FB060132464046FEF76DFFF9 +:108230006088401C90FBF5F105FB11006080A08870 +:10824000401CA08001270349486880473846BDE8A4 +:10825000F0810000B802002010B5816044880480DD +:108260000024848010BD00002DE9F04104468846BA +:1082700017461D4611490868804720886188884252 +:1082800003D1A08808B9002612E02288A16802FB69 +:1082900005102A464146FEF738FF2088401C90FB17 +:1082A000F7F107FB11002080A088401EA080012666 +:1082B0000249486880473046BDE8F081B802002096 +:1082C00070B504460E460A490868804720886188D0 +:1082D000884203D1A08808B9002503E020887043B4 +:1082E000A1680D5C024948688047284670BD0000BF +:1082F000B80200202DE9F0470446884617461D467F +:10830000DDF82090154908688047208861888842F8 +:1083100003D1A08808B900261AE020886843A16824 +:10832000085C484501D0022612E02288A16802FBC1 +:1083300005102A464146FEF7E8FE2088401C90FBC7 +:10834000F7F107FB11002080A088401EA0800126C5 +:108350000249486880473046BDE8F087B8020020EF +:108360002DE9F04F8CB0074600200A904AA090E813 +:10837000004CC068CDE905BECDF810A007900FF203 +:108380001C1ADAE9000ACDE9020A0FF2101ADAE93A +:10839000000ACDE9000A44484068C0F381000B9010 +:1083A0000B9820B1012804D002283FD103E03F4AB6 +:1083B0003EE03F4A3CE03C48406800F4803CBCF56D +:1083C000803F12D13848C06A00F08048B8F1000FF1 +:1083D00001D1374B00E0374B3348406800F4003997 +:1083E000B9F5003F02D15B0800E0334B2E484068EE +:1083F000C0F383412C48406800F0006008B141F0B0 +:1084000010012948406800F0804008B141F0200187 +:108410000F2901D2891C06E00F2903D33E2901D878 +:10842000491C00E03F2103FB01F201E01F4A00BFAD +:1084300000BF1D484068C0F3031504A8465D22FA3A +:1084400006F419484068C0F3022502A8465D24FAE4 +:1084500006F0099014484068C0F3C2251DF8056075 +:1084600024FA06F0089037B1012F06D0022F06D06B +:10847000032F0AD106E00A9208E00A9406E0099860 +:108480000A9003E008980A9000E000BF00BF0A9835 +:108490000CB0BDE8F08F00000000000000000000FC +:1084A00001020304060708090010024000127A00C6 +:1084B0000024F400006CDC0200093D0010B500202F +:1084C000FFF74EFF044640F2026000F053F82548E3 +:1084D000844204D14FF4800000F05CF815E022489B +:1084E000844203D1002000F055F80EE01F4884427A +:1084F00004D14FF4400000F04DF806E01C488442DF +:1085000003D14FF4000000F045F840F2026000F0A3 +:1085100031F840F2036000F02DF840F2046000F002 +:1085200029F840F2056000F025F84FF4C06000F033 +:1085300021F840F2177000F01DF84FF4E06000F0F1 +:1085400019F840F2017000F015F840F2027000F0E6 +:1085500011F840F20C6000F00DF840F20F7000F0DE +:1085600009F810BD006CDC0200A24A0400D8B8056E +:10857000000E2707064A02EB9011096800F01F035E +:1085800001229A401143024B03EB90121160704795 +:1085900000100240044A516821F4400141EA0002FF +:1085A000014B5A6070470000001002401CB50B4898 +:1085B00003226946036A4FF4846098479DF80000DF +:1085C000F52807D19DF80100054908709DF80200C3 +:1085D000887002E00020024908701CBDB80200202B +:1085E000F04A00201FB5224810226946036A900114 +:1085F000984700240EE0C4F10E001DF80000C4F1FD +:108600000F011DF801104840C4F10F010DF80100E1 +:10861000601CC4B20F2CEEDB16480378C21C00F1BC +:1086200023016846F8F74EFD114810226946036A97 +:108630004FF48260984700240EE0C4F10E001DF84C +:108640000000C4F10F011DF801104840C4F10F01F2 +:108650000DF80100601CC4B20F2CEEDB0548037856 +:10866000C21C00F133016846F8F72CFD1FBD000065 +:10867000B8020020F04A002010B50748816C0220A3 +:1086800088470120054908700020488001200871B2 +:108690000020C88010BD0000B8020020B4060020F1 +:1086A00010B50748407A00B910BD0020044948724F +:1086B00088720448C16C0120884700BFF4E70000BD +:1086C000B4060020B8020020F0B58DB005464B4836 +:1086D00090F8900010B901200DB0F0BD4848007826 +:1086E00008B90120F8E72122294604A8F7F750FD30 +:1086F0009DF81500F8F7C0FC061E01DD8DF8156029 +:1087000006240DE004A8005D80F0A50604A9601C05 +:10871000085C80F055000855601C0E54A01CC4B2C3 +:108720001F2CEFDB00240DE0C4F11F0004A9085C3E +:10873000C4F1200104AA515C4840C4F12001505406 +:10874000601CC4B21A2CEFDB00240CE004F116000C +:1087500004A9085CA11D04AA515C484004F116015B +:108760005054601CC4B20B2CF0DB10220DF116012A +:108770006846F7F70DFDFCF76BF940B12048037828 +:10878000C21C0DF116016846F8F79CFC18E09DF834 +:1087900015004C2809D01A48037800F123020DF186 +:1087A00016016846F8F78EFC0AE015480378C21CEB +:1087B0000DF116016846F8F785FC13208DF81500B9 +:1087C000212204A92846F7F7E3FCE87F002803DC10 +:1087D00095F8200000280FDD1A21681DFDF77CF9AF +:1087E0000746E87FB0EB272F04D1F8B295F82010A8 +:1087F000884201D000206FE701206DE7FC030020D4 +:10880000F04A0020F0B589B00546454890F8900040 +:1088100008B909B0F0BD4348007800B9F9E71A215A +:10882000681DFDF759F907463812E87785F820707A +:1088300020202870212229466846F7F7A9FC68798C +:10884000F8F71AFC061E01DD8DF805609DF805009D +:10885000412803D09DF8050042280FD19DF809005A +:1088600028280BD14C208DF805002E480378C21C17 +:108870000DF10601A81DF8F7E3FC14E0FCF7E8F899 +:1088800040B128480378C21C0DF10601A81DF8F775 +:10889000D7FC08E02348037800F123020DF106011C +:1088A000A81DF8F7CDFC00240CE004F11600285CAC +:1088B000A11D1DF80110484004F116010DF801003A +:1088C000601CC4B20B2CF0DB072409E0601E1DF80D +:1088D00000001DF8041048400DF80400601CC4B2EC +:1088E000212CF3DB06240FE01DF8040080F0550670 +:1088F000601C1DF8000080F0A5000DF80400601C4D +:108900000DF80060A01CC4B21F2CEDDB21226946CB +:108910002846F7F73DFC2020287000BF79E70000CB +:10892000FC030020F04A002070B506460D461446B0 +:10893000284A32F81410284A52F82400FDF70AFE9B +:1089400021460020F9F790FA244A32F81410244AFC +:1089500052F82400FDF7FEFD2146E120FDF7AEFAB6 +:108960001E4A32F814101E4A52F82400FDF7F4FD96 +:10897000202D00DD2025FDF723F840B1194A32F8FB +:108980001410194A52F82400FDF7E4FD07E0154AD7 +:1089900032F81410144A52F82400FDF7DDFD2025AA +:1089A000224629463046F9F7CFF90A4A32F8141020 +:1089B000094A52F82400FDF7CFFD3220F8F7A4FB56 +:1089C000044A32F81410044A52F82400FDF7C2FD9C +:1089D00070BD000094A9000884A9000848A90008F7 +:1089E00038A900087CA900086CA9000800B591B05E +:1089F0000022402101A8FEF793FB1F208DF8040000 +:108A0000E1208DF805000A49C86980478DF8060005 +:108A10000A208DF8070006208DF808000DF10900E6 +:108A2000FDF7C2FC0248416C01A8884711B000BDA7 +:108A30003403002010B512480078012800D010BD82 +:108A40000F484068401C0E49486040F2DC518842A3 +:108A50000ED20B4840686421B0FBF1F201FB12001A +:108A600058B90848816D01208847FFF7BFFF04E02F +:108A70000220034908700020486000BFDFE70000C3 +:108A8000D4030020B802002010B504462046F9F7B0 +:108A900085F921467020F8F7D9FF224601211D20D3 +:108AA000F9F724F9224620211120F9F71FF922466F +:108AB0001E210020F9F71AF9224600210120F9F7BA +:108AC00015F9224601210220F9F710F92246032167 +:108AD0000846F9F70BF9154890F87400012803D1FE +:108AE0002146F9F7ABF80CE0104890F87400022822 +:108AF00003D12146F9F7A2F803E021460020F9F757 +:108B00009DF821460320F9F76BF8224605214AF229 +:108B1000554000F045F82046F8F7E0FF2046F8F70A +:108B2000C1FF2046F9F784F910BD0000FC030020C6 +:108B30007047000000EB4001044A12F81110491C74 +:108B400000EB4002014B03F812107047582100203F +:108B500070B504460D46FCF733FF20B129460720C7 +:108B6000F9F73EF81BE0012C04D0022C07D0032CAF +:108B70000FD109E029460220F9F732F80EE0294624 +:108B80000120F9F72DF809E029460020F9F728F827 +:108B900004E029460320F9F723F800BF00BF70BDA9 +:108BA0007CB504460D4616460AA103C9CDE900016D +:108BB00020128DF80200E0B28DF8030032462946FB +:108BC0006846F9F759F833462A4669460020F9F70E +:108BD00019F87CBD1998A4250100000070B5054660 +:108BE0000C46F8F7FCF921462846F9F716F9204615 +:108BF000F9F71EF9F9F76EFB70BD000010B50446D9 +:108C00000548007C28B12178601CF9F753FE01204B +:108C100010BD0020FCE70000E85E002070B50546AE +:108C200000240DE0094800EB840104222846F7F7F0 +:108C3000E1FA18B9054800EB840070BD601C84B2ED +:108C4000034800788442EDDB0020F6E7485B002013 +:108C50003C05002030B591B004460D462078401CFC +:108C6000C2B269462046FEF750FA104890F87E00DE +:108C700060B19DF80000001FC0B28DF800009DF8A3 +:108C800000200DF10101081DFEF73FFA0748D0F85A +:108C9000A410684688479DF8001005482A46436A94 +:108CA0000DF10100984711B030BD0000FC03002019 +:108CB000B80200202DE9F04104462078062813D0A0 +:108CC0000E480568001D0668001D07683D4455B143 +:108CD0000822A11C2846FDF7A5FD042204F112017B +:108CE0003046FDF79FFD06E00549086810B1608039 +:108CF000010CA18000BFBDE8F0810000E8F7FF1F74 +:108D000000210240A0200C4988720C4890F87000A5 +:108D100048700D2088700120C870084890F87100D4 +:108D2000C872064890F8721003480173034890F81F +:108D30007310014841737047A2170020FC03002004 +:108D40000149087070470000CC03002010B50446AC +:108D50000D4890F8850058B10B49D1F8B000804714 +:108D600018B101200949C87505E00848C47502E03A +:108D700000200649C8750122044917314FF4A0703C +:108D8000FCF720FC10BD0000FC030020B40600200E +:108D90000649097801B1704728B90121034A1170C9 +:108DA0000349044A516100BFF5E70000B302002007 +:108DB00015130008B8020020014908707047000030 +:108DC0002C03002010B5164880781649087200223E +:108DD00004211448001DFEF7A3F91248027A011D70 +:108DE0000F48C01CFEF791F90E48C07A0D49097A68 +:108DF000884204DA00210B48C27A001D8154002405 +:108E000008E0084B195D1B1D185D074B9A6A9047D7 +:108E1000601CC4B20348407AA042F2DC10BD0000DE +:108E2000BB03002058200020B802002010B50446E3 +:108E30000948C4700146C878FCF778FD06490871F6 +:108E40000879FCF773FD044948714879FCF76EFD19 +:108E50000149887110BD0000BB030020016841F08A +:108E60004001016070470146C86880B27047C16028 +:108E7000704702469068084008B101207047002002 +:108E8000FCE702460020106800F441500B681843CC +:108E90004B6818438B681843CB6818430B69184319 +:108EA0004B6918438B6918431060D36923F400633E +:108EB000D361704710B50E4890F8C40000B910BDDA +:108EC0000C48C07B012800D1F9E70B48816B0020DA +:108ED00088470848007D401CC1B206480175012141 +:108EE000C173002101744174817400BFE7E7000081 +:108EF000FC030020335B002034030020002000210D +:108F00003E4A126842F480323C4B1A6000BF401C5B +:108F10003A4A126802F4003119B94FF6FF729042D2 +:108F2000F5D1364A126802F400320AB900BFFEE7F2 +:108F3000324AD26942F08052304BDA61304A1268CC +:108F400042F440422E4B1A602C4A52682B4B5A6016 +:108F50001A4652685A601A46526842F480625A6051 +:108F60001A46526822F440325A601A46526842F455 +:108F700040325A601A465268224B1A401F4B5A60C0 +:108F80001A46526842F450125A601A46126842F069 +:108F900080721A6000BF194A126802F00072002A3B +:108FA000F9D0174A126842F48032154B1A6000BF9C +:108FB000134A526802F48032002AF9D0104A12682B +:108FC00042F400320E4B1A6000BF0D4A526802F4A0 +:108FD0000032002AF9D0094A526822F00302074BF6 +:108FE0005A601A46526842F002025A6000BF034AB1 +:108FF000526802F00802002AF9D0704700100240BF +:1090000000700040FFFFC3B710B5FFF777FF10BD3A +:1090100010B50120224988750846407A70B9084683 +:10902000807A401CC0B28872052807DD0020887253 +:10903000012048721B48C16C002088471848007AFC +:10904000401CC0B21649087219280EDD00200872B3 +:1090500014498869804720B11248816C02208847F2 +:1090600003E01048816C012088470D484088401C6F +:1090700080B20B49488040F2DC51884203DD002079 +:109080000749087048800648C088401C80B20449DF +:10909000C880322802DD00200871C88010BD0000A1 +:1090A000B4060020B8020020C162704701460020CB +:1090B000486A704741627047016841F001010160F0 +:1090C000704700000A8882621D4A90420ED0B0F1BB +:1090D000804F0BD01B4A904208D01B4A904205D0CB +:1090E0001A4A904202D01A4A90420BD1026822F0EA +:1090F0007002026002684B881A43026002688B8823 +:109100001A4302608A68C262124A90420AD0124A26 +:10911000904207D0026822F4407202600268CB8855 +:109120001A430260064A904202D0094A904201D195 +:109130000A7B0263426942F001024261704700000B +:10914000002C01400004004000080040000C0040DA +:10915000003401400010004000140040C2688A43FF +:10916000C2607047C2680A43C2607047CA43026166 +:1091700070470246D06800EA01031069084010B148 +:109180000BB1012070470020FCE781621AB94369E6 +:1091900043F001034361704710B540230A2202499E +:1091A0000248FFF759F810BD1024002004240020C5 +:1091B00010B540230A2202490248FFF74DF810BDBE +:1091C00084210020782100207047000010B50A4853 +:1091D000816B032088474FF47A70FCF7F0FA074858 +:1091E000816B01208847002005490874002109206F +:1091F00000F094F810BD0000B802002034030020F5 +:10920000E85E002010B50748C068401C0549C860EA +:10921000052805D30020C860F9F7D2FCF8F7FCFB5D +:1092200010BD0000E85E00200020704738B50446FD +:109230002079012802D0072865D140E03348A16891 +:109240000160E1684160218A0181E079012822D131 +:109250002E48807901062D48C07901EB00412B484A +:10926000007A01EB00212948407A0D1828488169CD +:109270006846884725484079244A127900EB022045 +:1092800081B22A466846F9F7B1FA01201F490874ED +:10929000F9F76EFC0CE0E079022809D100201B49A7 +:1092A000087405201B4908701948816B0120884704 +:1092B0001A23221D1621612000F05AFE24E01A23F1 +:1092C000221D1621612000F053FE60791E2803D173 +:1092D0002046FEF715F815E0207A15280BDC217AD8 +:1092E00001EB41020949113101EB0210302204F176 +:1092F0000901F6F74DFF207A152803D10120034913 +:1093000081F8310400E000BF00BF38BDE85E0020F6 +:1093100034030020440500207047704730B589B001 +:1093200005460C4618208DF80400E1208DF8050054 +:109330000A49C86980478DF8060016208DF8070095 +:109340008DF8085020128DF80900E0B28DF80A005F +:109350000248416C01A8884709B030BD34030020A1 +:1093600010B50446D4F8AC000021826A204690472C +:1093700010BD10B50446D4F8AC10A06C0022CB6A26 +:109380001146984710BD70B504460025D4F8AC00CE +:109390002946426B2046904700BF70BD4160028164 +:1093A000438170474160028143817047416002817F +:1093B00043817047417841F08001014A1160704754 +:1093C0004C5C004070B504460D46A078032808D1D7 +:1093D000287930B9D4F8A8002946C26820469047B9 +:1093E00070BD0120FCE70000012008490860002052 +:1093F0000860091D086005491031086003480068CD +:1094000040F41F400149086070470000405C004084 +:109410000120044908600020091D08600320091F7D +:1094200008607047405C004010B50446012C04D130 +:1094300001020548FDF790F804E04FF480710248FE +:10944000FDF788F810BD000000080140F0B50346A4 +:109450000024002500266AB9214800EB0110C068ED +:10946000C0F309051E4800EB011080681D4F07EB93 +:10947000400627E0012A23D11B4F07EB8100D0F8DB +:10948000000C00F0400068B1154800EB0110406886 +:10949000C0F30905124800EB01100068114F07EBFB +:1094A00040060FE00E4800EB0110C068C0F309054C +:1094B0000B4800EB011080680A4F07EB400601E003 +:1094C0000020F0BD002405E036F8047B1F809B1CC3 +:1094D000601C84B2681CB4EB500FF5D32846F0E74B +:1094E00000600040006000400050004070B58AB14C +:1094F000134D05EB01152D68124E06EB45040023B4 +:1095000003E0058820C4801C5B1C551CB3EB550F81 +:10951000F7D300BF0A4B03EB01135A6000BF0A4C9C +:1095200004EB8103D3F8003C48F6BF74234083F07A +:109530003003054D05EB8104C4F8003C00BF70BD4D +:1095400000600040006000400050004070B50446DC +:109550000D46D4F8AC002946426A2046904770BDBB +:1095600030B5034601F07F00CA1142B300BF294C59 +:1095700004EB8002D2F8002C02F040027AB100BF66 +:1095800004EB8002D2F8002C48F68F74224042F09F +:109590004002204D05EB8004C4F8002C00BF00BF42 +:1095A00000BF1C4C04EB8002D2F8002C48F6BF74BC +:1095B0002240184D05EB8004C4F8002C28E000BFC1 +:1095C000144C04EB8002D2F8002C02F480427AB1F1 +:1095D00000BF04EB8002D2F8002C48F68F742240C2 +:1095E00042F480420B4D05EB8004C4F8002C00BF10 +:1095F00000BF00BF074C04EB8002D2F8002C4BF6F2 +:109600008F742240034D05EB8004C4F8002C00BF8A +:1096100030BD0000005000402DE9F04104460D46E9 +:1096200016461F46D4F8AC003B4632462946D0F8D1 +:1096300020C02046E047BDE8F0812DE9F041044616 +:109640000D4616461F4605F07F0000EB400104F171 +:10965000140000EB810800233A4631464046FFF7EC +:109660009DFED4F8AC002946826A20469047BDE8AA +:10967000F081000030B50246002002F14401A02331 +:10968000204C23600023636040230B803039A360AB +:109690000B800B883E2B0AD90B884FF6FF7404EA27 +:1096A00043135B1E43F40043164CE36006E00B8853 +:1096B0005B1C23F001035B02124CE36001200FE00E +:1096C000114C04EB8003D3F8003C48F68F74A3439D +:1096D00003430D4D05EB8004C4F8003C431CD8B295 +:1096E0000428EDD3094B1B689BB2084C236043F25E +:1096F000202323608023054C4C3423600123937086 +:1097000030BD00000060004000500040005C0040A0 +:1097100010B500BF4A06094B03EBD252D2F8002C19 +:109720004BF68F731A4082F440524B06034C04EB05 +:10973000D353C3F8002C00BF10BD00000050004000 +:109740002DE9F0470546894616461F4609F07F0A6F +:109750000AEB4A0105F1440000EB8108B8F800006B +:10976000B84201DD384601E0B8F800000446D5F8FB +:10977000AC0022465146C36A30469847381B82B235 +:10978000311923464046FFF709FEBDE8F087000087 +:109790002DE9F04305460C469E7806F07F00998837 +:1097A000002793F803C00CF0030CDFF8508258F840 +:1097B0002CC04CEA000CDFF8489209EB8008C8F88E +:1097C00000CC4FEAE61CBCF1000F62D000EB400871 +:1097D00005F1440C0CEB88073980B4B9DFF824C2DA +:1097E0000CEB001CCCF8002000BFC84608EB800C36 +:1097F000DCF800CC48F6BF780CEA080C8CF0200CA2 +:1098000009EB8008C8F800CCF6E0012CFCD1DFF8A9 +:10981000F08108EB800CDCF800CC4CF4807C48F63E +:109820008F780CEA080CDFF8D89109EB8008C8F8AB +:1098300000CC1FFA82FCDFF8CC8108EB0018C8F8D6 +:1098400000C04FEA124CDFF8BC8108EB0018C8F8E2 +:1098500008C000BFC84608EB800CDCF800CC48F616 +:10986000BF780CEA080C8CF0300C09EB8008C8F8C3 +:1098700000CC00BF00BFC84608EB800CDCF800CC71 +:109880004BF68F780CEA080C09EB8008C8F800CC7E +:10989000B2E000EB400805F1140C0CEB88073980AE +:1098A00034B9DFF860C10CEB001CCCF808204EE0A6 +:1098B000012C4CD1DFF8488108EB800CDCF800CC9F +:1098C0004CF4807C48F68F780CEA080CDFF8309175 +:1098D00009EB8008C8F800CC00BFC84608EB800C34 +:1098E000DCF800CC48F68F780CEA080C4CF0400C01 +:1098F00009EB8008C8F800CC00BF1FFA82FCDFF833 +:10990000048108EB0018C8F800C04FEA124CDFF8D9 +:10991000F48008EB0018C8F808C03E290BD9A4460B +:10992000CCEB411C4CF4004CDFF8D88008EB00185D +:10993000C8F804C00BE001F1010C2CF0010C4FEA57 +:109940004C2CDFF8C08008EB0018C8F804C03E2992 +:109950000CD94FF0010CCCEB411C4CF4004CDFF85F +:10996000A48008EB0018C8F80CC00BE001F1010C52 +:109970002CF0010C4FEA4C2CDFF8888008EB001823 +:10998000C8F80CC09CB900BFDFF8748008EB800CED +:10999000DCF800CC4BF68F780CEA080C8CF4005CF9 +:1099A000DFF85C9009EB8008C8F800CC24E0012CBB +:1099B00022D100BFDFF8488008EB800CDCF800CC37 +:1099C0004BF68F780CEA080CDFF8349009EB80082E +:1099D000C8F800CC00BF00BFC84608EB800CDCF81C +:1099E00000CC48F6BF780CEA080C8CF0200C09EB90 +:1099F0008008C8F800CC00BFBDE8F08308A90008C3 +:109A0000005000400060004030B5024601F07F0089 +:109A1000CB1193B300BF334C04EB8003D3F8003C6D +:109A200003F040037BB100BF04EB8003D3F8003C9C +:109A300048F68F74234043F040032A4D05EB800421 +:109A4000C4F8003C00BF00BF002400EB400502F159 +:109A5000440303EB85039C7000BF224C04EB80039E +:109A6000D3F8003C48F6BF74234083F030031D4D0B +:109A700005EB8004C4F8003C33E0FFE700BF194C5D +:109A800004EB8003D3F8003C03F480437BB100BFB8 +:109A900004EB8003D3F8003C48F68F74234043F472 +:109AA0008043104D05EB8004C4F8003C00BF00BFAC +:109AB000002400EB400502F1140303EB85039C70C6 +:109AC00000BF084C04EB8003D3F8003C4BF68F74C6 +:109AD000234083F44053034D05EB8004C4F8003C5D +:109AE00000BF30BD0050004030B5024601F07F009D +:109AF000A8B900BF244B1B6848F6BF74234083F00D +:109B00001003214C236000BF00BF23461B684BF6A7 +:109B10008F74234083F480531B4C236033E0CB11BC +:109B2000C3B1012400EB400502F1440303EB8503BC +:109B30009C7000BF154C04EB8003D3F8003C48F642 +:109B4000BF74234083F01003104D05EB8004C4F86C +:109B5000003C18E0012400EB400502F1140303EB84 +:109B600085039C7000BF094C04EB8003D3F8003CD4 +:109B70004BF68F74234083F48053044D05EB80042F +:109B8000C4F8003C00BF30BD005C00400050004005 +:109B900010B503464806064C04EBD050D0F8002C14 +:109BA000C81110B102F0300010BD0020FCE7000029 +:109BB0000050004070B504460D4616460820144972 +:109BC00008700120487040024880084644607434A0 +:109BD000256366630F48A0630F4844F874090F4972 +:109BE000A1670F49E167D4F8A4004068C07900F08C +:109BF0004000400920710121E171D4F8AC100868DF +:109C00008047D4F8A410C968C868FFF753F870BD3E +:109C1000140000201C0000208B3B0008473B00087C +:109C2000F53A000810B50446A078E0700420A07052 +:109C3000E07930B100BFD4F8AC100869804700BFAC +:109C400001E00321A17110BD2DE9FC419A48006893 +:109C500080B20190984800689749091F096801F48B +:109C60007F410840009095484468BDF8000000F42A +:109C7000004000287DD0A5E0BDF8040000F00F05ED +:109C8000BDF8040000F01000002860D08C4901EB02 +:109C90008500D0F8000C00F4004000281FD000BF61 +:109CA00001EB8500D0F8000C40F68F710840844A23 +:109CB00002EB8501C1F8000C00BF114601EB8500E5 +:109CC000D0F8000C00F4006060B14DB905EB45011F +:109CD00004F1740050F8212029462046904770E096 +:109CE000BDE8FC8105EB450104F1140000EB8106A1 +:109CF0007068D4F8AC1000220B6B294698470746D1 +:109D00007068384470607089384470817089318916 +:109D1000884202DA3088B84212DD05EB450104F1D1 +:109D2000740000EB8100406880B105EB450104F14F +:109D3000740000EB8100294642682046904705E008 +:109D4000D4F8AC002946826A2046904739E05C4945 +:109D500001EB8500D0F8000C00F0800088B300BF54 +:109D600001EB8500D0F8000C48F60F710840544A0A +:109D700000E030E002EB8501C1F8000C00BF05EB0C +:109D8000450104F1440000EB8106308990B905EBF0 +:109D9000450104F1740000EB8100806880B105EB9F +:109DA000450104F1740000EB8100294682682046D9 +:109DB000904705E03389294620467268FFF7C0FCCA +:109DC00000BF00BF3C48006880B2019000F4004032 +:109DD00000287FF451AFBDF8000000F4805070B14E +:109DE0006FF4805034490860E078A070607A30B930 +:109DF00000BFD4F8AC104869804700BF00BFBDF871 +:109E0000000000F4006060B12B48001F006800F003 +:109E1000100030B92046FFF705FF6FF400602649B7 +:109E20000860BDF8000000F4007058B16FF40070D5 +:109E3000214908602348006820B122480068016871 +:109E400020468847BDF8000000F4807018B36FF416 +:109E5000807019490860A079E8B1A079401EC1B2AC +:109E6000A171C1B9607A50B11348001F006820F099 +:109E700010001149091F0860002161720BE00E48B3 +:109E8000001F006840F010000B49091F0860032103 +:109E9000A17101216172BDF8000000F4806040B141 +:109EA0006FF4806004490860D4F8AC00C1692046B2 +:109EB000884700BF14E70000445C00401400002005 +:109EC000005000405C0000200548006820F00400BD +:109ED000034908600846006820F0080008607047E1 +:109EE000405C004005494968097A012905D10449C7 +:109EF000096841F01001024A116070471400002007 +:109F0000405C004070B505460C466078034951F846 +:109F1000202021462846904770BD000060000020A8 +:109F20000348006840F00C000149086070470000D9 +:109F3000405C004002460120704710B5FFF762F90F +:109F400010BD000010B5012005490870FAF728FA85 +:109F500000F09EFA0348C16C0220884710BD000043 +:109F6000B2020020B8020020704770477047704767 +:109F7000F0B589B004460D4616461F46202101A8BB +:109F8000F6F72DF91F208DF8040004F00F0040F0C3 +:109F9000E0008DF805000949C86980478DF8060082 +:109FA0008DF807503A46314602A8F6F7F1F8034813 +:109FB000416C01A8884709B0F0BD000034030020BF +:109FC00070470000F0B59DB00446002240210DA866 +:109FD000FDF7A6F81F208DF83400E0208DF835003D +:109FE000FCF76AF98DF8360005208DF837008DF8FA +:109FF000384099480078A0422DDB04EB440000EB88 +:10A0000084109649084490F84100022823D104EBBB +:10A01000440101EB8411914B194491F8402004EB69 +:10A02000440101EB8411C8180DF13901FDF76DF8F9 +:10A030000DA8F9F708FD04EB440000EB84108749F4 +:10A04000084490F842008DF834000DA8FBF770F931 +:10A0500001201DB0F0BD20218148FEF731F90546F1 +:10A0600075B9FF208DF8380000208DF839008DF883 +:10A070003A008DF83B000DA8FBF75AF90020E8E7FD +:10A080000A950CAA0BA90AA8FCF7C2F98DF83400AE +:10A0900004EB440101EB8411704A8818002240212E +:10A0A000FDF73EF89DF8280004EB440101EB841114 +:10A0B0006A4A5054012004EB440101EB841111441D +:10A0C00081F8400004EB440101EB8411114481F854 +:10A0D000410061480470002694E0701CC6B2202341 +:10A0E000C82202A95E480095FEF704F90746012F31 +:10A0F00050D102A92046F9F7A5FC9DF828000D28AB +:10A1000020D1012004EB440101EB8411534A114496 +:10A1100004EB440202EB8412504B1A4492F84020A4 +:10A12000885404EB440000EB84101946084490F86E +:10A130004000401C04EB440101EB84111A46114419 +:10A1400081F8400004EB440000EB8410434A1044C3 +:10A1500004EB440202EB8412404B1A4492F8402074 +:10A1600081189DF830200DF10900FCF7CEFF04EBBB +:10A17000440000EB84103949084490F840009DF8F1 +:10A180003010084404EB440101EB8411334A1144BC +:10A1900081F840001FB19DF82C00864231DBFF2082 +:10A1A00004EB440101EB84112C4A114404EB4402FA +:10A1B00002EB8412294B1A4492F840208854FF2164 +:10A1C00004EB440000EB84101A46024404EB440004 +:10A1D00000EB8410184490F84000401C115404EB2C +:10A1E000440000EB84101946084490F84000801C9D +:10A1F00004EB440101EB84111A46114481F840003C +:10A2000005E000BF9DF82C008642FFF666AF00BF58 +:10A2100004EB440101EB8411104B194491F84020E8 +:10A2200004EB440101EB8411C8180DF13901FCF76E +:10A230006CFF9DF8340004EB440101EB8411074AE4 +:10A24000114481F842000DA8F9F7FDFB0DA8FBF7BA +:10A250006FF80120FDE60000DD0300209C3F002098 +:10A260009026002010B500F053F8002002494870F5 +:10A2700088700870C87010BDDF03002010B5094851 +:10A28000C078401CC0B20749C870022800DA10BD6F +:10A2900000200449C8700120887000F013F800BF46 +:10A2A000F5E70000DF03002010B500F0EFF8012013 +:10A2B00003494870887000200870C87010BD000005 +:10A2C000DF03002010B50B48407890B109480078B2 +:10A2D00009280EDA0748807858B106480078401CF3 +:10A2E000044908700878FFF76DFE024948700020A5 +:10A2F000887010BDDF03002010B504462023C8225B +:10A3000021460248FDF77AFF10BD0000902600208C +:10A3100010B52023C82202490248FDF79DFF10BD59 +:10A320009C26002090260020FEB50746002600242B +:10A330000CE0385D10B1385D0A2800DD08E0385DBA +:10A340000DF80400701CC6B2601CC4B20A2CF0DB0D +:10A3500000BF06B9FEBD494908688047002410E0E7 +:10A3600000201DF8041001EB410202EB8111444A68 +:10A37000114481F841001DF80400F9F73DFB601C11 +:10A38000C4B2B442ECDB3F480078864203DB0020D5 +:10A390003C4908706CE0012501245FE004EB4400B7 +:10A3A00000EB84103649084490F8410000B953E0AE +:10A3B0003548C08B401C3449C883022005EB450159 +:10A3C00001EB85112E4A114481F84100AC4202D1C3 +:10A3D000681CC5B240E004EB440303EB8413DFF8D0 +:10A3E000A0C0634493F8402005EB450303EB8513BD +:10A3F00003EB0C0104EB440303EB841303EB0C00AD +:10A40000FCF783FE04EB440000EB84101C49084475 +:10A4100090F8400005EB450101EB8511184A114405 +:10A4200081F8400004EB440000EB8410114608441E +:10A4300090F8420005EB450101EB8511114481F8CC +:10A440004200002004EB440101EB8411114481F827 +:10A450004100681CC5B200BF601CC4B20948007846 +:10A4600084429BDD07480078801B0649087000BFC6 +:10A4700002494868804700BF6CE70000B80200202E +:10A480009C3F0020DD030020B40600207047000040 +:10A4900010B51448007800B910BD1349486D8047C5 +:10A4A00038B91248807820B9012010498870F9F72E +:10A4B00037FF0E48C07800B9EEE70C488088401C92 +:10A4C00080B20A498880C82802DA00F011F807E053 +:10A4D00000200649C870888008460021C0F8061090 +:10A4E00000BFD9E7FC03002034030020685E002091 +:10A4F00010B588B03648007810B13648C07810B929 +:10A50000002008B010BD1C208DF800003248816981 +:10A510000DF10100884730208DF8050000208DF8EE +:10A5200006008DF8070014208DF8080004208DF82F +:10A53000090013210DF10A00F5F751FE2548C078F6 +:10A5400001283AD1FF208DF806008DF80700214838 +:10A5500090F87F001F4991F87E10884203DB0020AD +:10A560001C4981F87F001B4890F87F10801D10F86F +:10A5700021008DF80E00174890F87F10801D00EB29 +:10A58000810040788DF80F00124890F87F10801DF0 +:10A5900000EB810080788DF810000E4890F87F1055 +:10A5A000801D00EB8100C0788DF81100094890F8FB +:10A5B0007F00401C074981F87F000749C86A80472F +:10A5C000044605482146426B68469047012098E7BB +:10A5D000FC030020685E00203403002030B591B0F9 +:10A5E00004460D46402101A8F5F7F9FD3C208DF801 +:10A5F0000400E1208DF805000949C86980478DF8FD +:10A6000006000E208DF807002A46214602A8F5F71D +:10A61000BFFD0348416C01A8884711B030BD000060 +:10A62000340300202DE9F04107464FF6FF78384605 +:10A63000FBF78CF90546124800782844C82806DC48 +:10A640002A4639460E48007800F044F914E00C48D8 +:10A650000078C0F1C800C6B23246394608480078D2 +:10A6600000F038F9344605E00120A04028EA00084F +:10A67000601CC4B2AC42F7DB4046BDE8F08100008C +:10A680003C0500202DE9F04106464FF6FF773046A5 +:10A69000FBF75CF905461E2D00DD1E250F4880F8EE +:10A6A0007E50002414E006EB8400FEF7B7FAB0F108 +:10A6B000000803D10120A040874307E03046F9F7A6 +:10A6C00045FEAA2204214046F5F782FD601C84B2B3 +:10A6D000AC42E8DB3846BDE8F0810000685E00204F +:10A6E00070B590B00446207901280BD0022804D020 +:10A6F00004281DD0052845D11FE06079A11D00F078 +:10A7000089F800BF60790DF1020100F05FF820B90F +:10A7100028210DF10200F5F762FD01208DF80000FF +:10A7200060798DF801002A216846FFF757FF2AE07B +:10A73000A01DFFF777FF054604E0A01DFFF7A2FF6D +:10A74000054600BF02208DF80000C5F3090040F265 +:10A75000FF31884201D1012000E000208DF8010086 +:10A76000002608E045FA06F000F00101B01C0DF8E3 +:10A770000010701CC6B20A2EF4DB0C216846FFF7ED +:10A780002DFF00E000BF00BF10B070BD00210B4ADC +:10A7900011700B4A1170002006E00A4901EB80019C +:10A7A00000220A60411C88B2C828F6DB0021064A54 +:10A7B000D170918091701180704700003D0500209C +:10A7C0003C050020485B0020685E00202DE9F04138 +:10A7D00006460F46142E02DB0020BDE8F08130460D +:10A7E000FBF710FE054600240DE04FF6FF7000EA6F +:10A7F000840807EB08002919054A02EB8101096862 +:10A800000160601C84B20A2CEFDB0120E5E7000048 +:10A81000485B00202DE9F04104460E46142C02DB73 +:10A820000020BDE8F0811CB9FFF7B0FFF9F778FD13 +:10A830003046FBF78BF805462046FBF7E3FD07465D +:10A840002A46F8B2314600F045F80120E9E7000059 +:10A8500030B589B005461D480378C21C01A92846B9 +:10A86000F6F7EEFC002409E001A8005D611C01AAD6 +:10A87000515C4840611C5054601CC4B20F2CF3DB87 +:10A880001348102201A9C369900198470F48037823 +:10A89000C21C01A905F11000F6F7D2FC002409E062 +:10A8A00001A8005D611C01AA515C4840611C505424 +:10A8B000601CC4B20F2CF3DB0548102201A9C36948 +:10A8C0004FF48260984709B030BD0000F04A002084 +:10A8D000B802002030B50346002009E01C18084DDE +:10A8E00005EB840401EB80052D682560441CA0B2B3 +:10A8F0009042F3DB034C24781444024D2C7030BD9D +:10A90000485B00203C05002000020000000400001D +:10A91000000000000006000006FFFF09FFA101097A +:10A92000FF954075081580257F810009FF954075CA +:10A93000081580257F9100C000140140000C0140E3 +:10A9400000140140001001400020100008004000E9 +:10A9500000140140001401400014014000100140A7 +:10A9600000402000100080000E0504070014014084 +:10A970000014014000140140001001400008400094 +:10A9800002001000001401400014014000140140B6 +:10A990000010014000108000040020000000211081 +:10A9A000422063308440A550C660E7700881299139 +:10A9B0004AA16BB18CC1ADD1CEE1EFF14053554E00 +:10A9C000564F54450053756E566F7465313939389A +:10A9D000264A61636B50656931393732436F6F6C5A +:10A9E000426F62393900104E134114421543164428 +:10A9F000174518461947204A304B404D9151925205 +:10AA000093539454A05AB05BC05C00000100000056 +:10AA100052096AD53036A538BF40A39E81F3D7FBD3 +:10AA20007CE339829B2FFF87348E4344C4DEE9CB1D +:10AA3000547B9432A6C2233DEE4C950B42FAC34E92 +:10AA4000082EA16628D924B2765BA2496D8BD12548 +:10AA500072F8F66486689816D4A45CCC5D65B692EC +:10AA60006C704850FDEDB9DA5E154657A78D9D8490 +:10AA700090D8AB008CBCD30AF7E45805B8B34506B0 +:10AA8000D02C1E8FCA3F0F02C1AFBD0301138A6BCA +:10AA90003A9111414F67DCEA97F2CFCEF0B4E673FA +:10AAA00096AC7422E7AD3585E2F937E81C75DF6EA8 +:10AAB00047F11A711D29C5896FB7620EAA18BE1B0E +:10AAC000FC563E4BC6D279209ADBC0FE78CD5AF4B4 +:10AAD0001FDDA8338807C731B11210592780EC5FFA +:10AAE00060517FA919B54A0D2DE57A9F93C99CEF56 +:10AAF000A0E03B4DAE2AF5B0C8EBBB3C8353996157 +:10AB0000172B047EBA77D626E169146355210C7D94 +:10AB1000637C777BF26B6FC53001672BFED7AB761A +:10AB2000CA82C97DFA5947F0ADD4A2AF9CA472C0C5 +:10AB3000B7FD9326363FF7CC34A5E5F171D8311532 +:10AB400004C723C31896059A071280E2EB27B27553 +:10AB500009832C1A1B6E5AA0523BD6B329E32F84CB +:10AB600053D100ED20FCB15B6ACBBE394A4C58CFC3 +:10AB7000D0EFAAFB434D338545F9027F503C9FA897 +:10AB800051A3408F929D38F5BCB6DA2110FFF3D265 +:10AB9000CD0C13EC5F974417C4A77E3D645D197319 +:10ABA00060814FDC222A908846EEB814DE5E0BDB13 +:10ABB000E0323A0A4906245CC2D3AC629195E4794A +:10ABC000E7C8376D8DD54EA96C56F4EA657AAE08A4 +:10ABD000BA78252E1CA6B4C6E8DD741F4BBD8B8A3F +:10ABE000703EB5664803F60E613557B986C11D9EA5 +:10ABF000E1F8981169D98E949B1E87E9CE5528DF1C +:10AC00008CA1890DBFE6426841992D0FB054BB1647 +:10AC10008D01020408102040801B366CD8AB4D9A81 +:10AC20002F5EBC63C697356AD4B37DFAEFC5913900 +:10AC300072E4D3BD61C29F254A943366CC831D3A2A +:10AC400074E8CB8D01020408102040801B366CD8BC +:10AC5000AB4D9A2F5EBC63C697356AD4B37DFAEFCD +:10AC6000C5913972E4D3BD61C29F254A943366CC45 +:10AC7000831D3A74E8CB8D01020408102040801B2C +:10AC8000366CD8AB4D9A2F5EBC63C697356AD4B389 +:10AC90007DFAEFC5913972E4D3BD61C29F254A9414 +:10ACA0003366CC831D3A74E8CB8D01020408102072 +:10ACB00040801B366CD8AB4D9A2F5EBC63C697356F +:10ACC0006AD4B37DFAEFC5913972E4D3BD61C29FF6 +:10ACD000254A943366CC831D3A74E8CB8D01020477 +:10ACE00008102040801B366CD8AB4D9A2F5EBC6399 +:10ACF000C697356AD4B37DFAEFC5913972E4D3BDF6 +:10AD000061C29F254A943366CC831D3A74E8CB30E8 +:10AD100031323334353637383941424344454600C1 +:10AD200009000000637C777BF26B6FC53001672BF5 +:10AD3000FED7AB76CA82C97DFA5947F0ADD4A2AF2F +:10AD40009CA472C0B7FD9326363FF7CC34A5E5F13D +:10AD500071D8311504C723C31896059A071280E2EB +:10AD6000EB27B27509832C1A1B6E5AA0523BD6B33F +:10AD700029E32F8453D100ED20FCB15B6ACBBE39AF +:10AD80004A4C58CFD0EFAAFB434D338545F9027F9B +:10AD9000503C9FA851A3408F929D38F5BCB6DA2154 +:10ADA00010FFF3D2CD0C13EC5F974417C4A77E3D80 +:10ADB000645D197360814FDC222A908846EEB814D6 +:10ADC000DE5E0BDBE0323A0A4906245CC2D3AC6299 +:10ADD0009195E479E7C8376D8DD54EA96C56F4EAA4 +:10ADE000657AAE08BA78252E1CA6B4C6E8DD741FB5 +:10ADF0004BBD8B8A703EB5664803F60E613557B978 +:10AE000086C11D9EE1F8981169D98E949B1E87E931 +:10AE1000CE5528DF8CA1890DBFE6426841992D0FE0 +:10AE2000B054BB1652096AD53036A538BF40A39E30 +:10AE300081F3D7FB7CE339829B2FFF87348E434419 +:10AE4000C4DEE9CB547B9432A6C2233DEE4C950B75 +:10AE500042FAC34E082EA16628D924B2765BA249D5 +:10AE60006D8BD12572F8F66486689816D4A45CCCF4 +:10AE70005D65B6926C704850FDEDB9DA5E154657C7 +:10AE8000A78D9D8490D8AB008CBCD30AF7E45805FD +:10AE9000B8B34506D02C1E8FCA3F0F02C1AFBD0309 +:10AEA00001138A6B3A9111414F67DCEA97F2CFCEDA +:10AEB000F0B4E67396AC7422E7AD3585E2F937E875 +:10AEC0001C75DF6E47F11A711D29C5896FB7620EB7 +:10AED000AA18BE1BFC563E4BC6D279209ADBC0FE98 +:10AEE00078CD5AF41FDDA8338807C731B112105945 +:10AEF0002780EC5F60517FA919B54A0D2DE57A9F37 +:10AF000093C99CEFA0E03B4DAE2AF5B0C8EBBB3C2B +:10AF100083539961172B047EBA77D626E1691463AF +:10AF200055210C7D0000000100000002000000041B +:10AF30000000000800000010000000200000004099 +:10AF4000000000800000001B00000036A56363C6FF +:10AF5000847C7CF8997777EE8D7B7BF60DF2F2FF9F +:10AF6000BD6B6BD6B16F6FDE54C5C591503030608C +:10AF700003010102A96767CE7D2B2B5619FEFEE760 +:10AF800062D7D7B5E6ABAB4D9A7676EC45CACA8F99 +:10AF90009D82821F40C9C989877D7DFA15FAFAEF23 +:10AFA000EB5959B2C947478E0BF0F0FBECADAD4100 +:10AFB00067D4D4B3FDA2A25FEAAFAF45BF9C9C2388 +:10AFC000F7A4A453967272E45BC0C09BC2B7B77576 +:10AFD0001CFDFDE1AE93933D6A26264C5A36366C35 +:10AFE000413F3F7E02F7F7F54FCCCC835C343468A9 +:10AFF000F4A5A55134E5E5D108F1F1F9937171E2B9 +:10B0000073D8D8AB533131623F15152A0C040408AC +:10B0100052C7C795652323465EC3C39D28181830C1 +:10B02000A19696370F05050AB59A9A2F0907070EBC +:10B03000361212249B80801B3DE2E2DF26EBEBCD33 +:10B040006927274ECDB2B27F9F7575EA1B09091299 +:10B050009E83831D742C2C582E1A1A342D1B1B36DC +:10B06000B26E6EDCEE5A5AB4FBA0A05BF65252A44C +:10B070004D3B3B7661D6D6B7CEB3B37D7B29295203 +:10B080003EE3E3DD712F2F5E97848413F55353A6BF +:10B0900068D1D1B9000000002CEDEDC16020204046 +:10B0A0001FFCFCE3C8B1B179ED5B5BB6BE6A6AD444 +:10B0B00046CBCB8DD9BEBE674B393972DE4A4A9436 +:10B0C000D44C4C98E85858B04ACFCF856BD0D0BB01 +:10B0D0002AEFEFC5E5AAAA4F16FBFBEDC543438651 +:10B0E000D74D4D9A5533336694858511CF45458AA2 +:10B0F00010F9F9E906020204817F7FFEF05050A0AA +:10B10000443C3C78BA9F9F25E3A8A84BF35151A239 +:10B11000FEA3A35DC04040808A8F8F05AD92923F11 +:10B12000BC9D9D214838387004F5F5F1DFBCBC6347 +:10B13000C1B6B67775DADAAF63212142301010203C +:10B140001AFFFFE50EF3F3FD6DD2D2BF4CCDCD81DA +:10B15000140C0C18351313262FECECC3E15F5FBE03 +:10B16000A2979735CC4444883917172E57C4C493F7 +:10B17000F2A7A755827E7EFC473D3D7AAC6464C849 +:10B18000E75D5DBA2B191932957373E6A06060C054 +:10B1900098818119D14F4F9E7FDCDCA36622224427 +:10B1A0007E2A2A54AB90903B8388880BCA46468CF3 +:10B1B00029EEEEC7D3B8B86B3C14142879DEDEA7AD +:10B1C000E25E5EBC1D0B0B1676DBDBAD3BE0E0DB2D +:10B1D000563232644E3A3A741E0A0A14DB494992D6 +:10B1E0000A06060C6C242448E45C5CB85DC2C29F6D +:10B1F0006ED3D3BDEFACAC43A66262C4A8919139C3 +:10B20000A495953137E4E4D38B7979F232E7E7D529 +:10B2100043C8C88B5937376EB76D6DDA8C8D8D0189 +:10B2200064D5D5B1D24E4E9CE0A9A949B46C6CD876 +:10B23000FA5656AC07F4F4F325EAEACFAF6565CACF +:10B240008E7A7AF4E9AEAE4718080810D5BABA6F0C +:10B25000887878F06F25254A722E2E5C241C1C38C5 +:10B26000F1A6A657C7B4B47351C6C69723E8E8CB76 +:10B270007CDDDDA19C7474E8211F1F3EDD4B4B96E5 +:10B28000DCBDBD61868B8B0D858A8A0F907070E066 +:10B29000423E3E7CC4B5B571AA6666CCD84848909B +:10B2A0000503030601F6F6F7120E0E1CA36161C238 +:10B2B0005F35356AF95757AED0B9B96991868617A7 +:10B2C00058C1C199271D1D3AB99E9E2738E1E1D981 +:10B2D00013F8F8EBB398982B33111122BB6969D29C +:10B2E00070D9D9A9898E8E07A7949433B69B9B2DCC +:10B2F000221E1E3C9287871520E9E9C949CECE87D8 +:10B30000FF5555AA782828507ADFDFA58F8C8C034B +:10B31000F8A1A15980898909170D0D1ADABFBF65F7 +:10B3200031E6E6D7C6424284B86868D0C34141825C +:10B33000B0999929772D2D5A110F0F1ECBB0B07BE4 +:10B34000FC5454A8D6BBBB6D3A16162C50A7F4512A +:10B350005365417EC3A4171A965E273ACB6BAB3B6D +:10B36000F1459D1FAB58FAAC9303E34B55FA3020DF +:10B37000F66D76AD9176CC88254C02F5FCD7E54F7D +:10B38000D7CB2AC5804435268FA362B5495AB1DE92 +:10B39000671BBA25980EEA45E1C0FE5D02752FC312 +:10B3A00012F04C81A397468DC6F9D36BE75F8F03EC +:10B3B000959C9215EB7A6DBFDA5952952D83BED4C8 +:10B3C000D32174582969E04944C8C98E6A89C27575 +:10B3D00078798EF46B3E5899DD71B927B64FE1BE8E +:10B3E00017AD88F066AC20C9B43ACE7D184ADF6349 +:10B3F00082311AE560335197457F5362E07764B13B +:10B4000084AE6BBB1CA081FE942B08F95868487071 +:10B4100019FD458F876CDE94B7F87B5223D373AB4D +:10B42000E2024B72578F1FE32AAB55660728EBB237 +:10B4300003C2B52F9A7BC586A50837D3F28728307B +:10B44000B2A5BF23BA6A03025C8216ED2B1CCF8A19 +:10B4500092B479A7F0F207F3A1E2694ECDF4DA6570 +:10B46000D5BE05061F6234D18AFEA6C49D532E3474 +:10B47000A055F3A232E18A0575EBF6A439EC830BF3 +:10B48000AAEF6040069F715E51106EBDF98A213EA1 +:10B490003D06DD96AE053EDD46BDE64DB58D5491CB +:10B4A000055DC4716FD40604FF15506024FB981924 +:10B4B00097E9BDD6CC434089779ED967BD42E8B0B5 +:10B4C000888B8907385B19E7DBEEC879470A7CA1CE +:10B4D000E90F427CC91E84F80000000083868009C1 +:10B4E00048ED2B32AC70111E4E725A6CFBFF0EFDF4 +:10B4F0005638850F1ED5AE3D27392D3664D90F0A33 +:10B5000021A65C68D1545B9B3A2E3624B1670A0CA5 +:10B510000FE75793D296EEB49E919B1B4FC5C08008 +:10B52000A220DC61694B775A161A121C0ABA93E200 +:10B53000E52AA0C043E0223C1D171B120B0D090E8B +:10B54000ADC78BF2B9A8B62DC8A91E148519F1573D +:10B550004C0775AFBBDD99EEFD607FA39F2601F719 +:10B56000BCF5725CC53B6644347EFB5B7629438B3D +:10B57000DCC623CB68FCEDB663F1E4B8CADC31D796 +:10B5800010856342402297132011C6847D244A858A +:10B59000F83DBBD21132F9AE6DA129C74B2F9E1DCC +:10B5A000F330B2DCEC52860DD0E3C1776C16B32BCE +:10B5B00099B970A9FA4894112264E947C48CFCA88F +:10B5C0001A3FF0A0D82C7D56EF903322C74E498702 +:10B5D000C1D138D9FEA2CA8C360BD498CF81F5A63A +:10B5E00028DE7AA5268EB7DAA4BFAD3FE49D3A2CBB +:10B5F0000D9278509BCC5F6A62467E54C2138DF6E2 +:10B60000E8B8D8905EF7392EF5AFC382BE805D9F53 +:10B610007C93D069A92DD56FB31225CF3B99ACC8C7 +:10B62000A77D18106E639CE87BBB3BDB097826CDB9 +:10B63000F418596E01B79AECA89A4F83656E95E697 +:10B640007EE6FFAA08CFBC21E6E815EFD99BE7BA52 +:10B65000CE366F4AD4099FEAD67CB029AFB2A43166 +:10B6600031233F2A3094A5C6C066A23537BC4E743C +:10B67000A6CA82FCB0D090E015D8A7334A9804F14E +:10B68000F7DAEC410E50CD7F2FF691178DD64D761F +:10B690004DB0EF43544DAACCDF0496E4E3B5D19E00 +:10B6A0001B886A4CB81F2CC17F51654604EA5E9D19 +:10B6B0005D358C01737487FA2E410BFB5A1D67B3FD +:10B6C00052D2DB92335610E91347D66D8C61D79A6C +:10B6D0007A0CA1378E14F859893C13EBEE27A9CECA +:10B6E00035C961B7EDE51CE13CB1477A59DFD29C21 +:10B6F0003F73F25579CE1418BF37C773EACDF753AD +:10B700005BAAFD5F146F3DDF86DB447881F3AFCA2F +:10B710003EC468B92C3424385F40A3C272C31D16DE +:10B720000C25E2BC8B493C2841950DFF7101A839DD +:10B73000DEB30C089CE4B4D890C156646184CB7B22 +:10B7400070B632D5745C6C484257B8D00000C20164 +:10B75000840346020807CA068C044E05100ED20F59 +:10B76000940D560C1809DA089C0A5E0B201CE21D89 +:10B77000A41F661E281BEA1AAC186E193012F213A9 +:10B78000B41176103815FA14BC167E174038823979 +:10B79000C43B063A483F8A3ECC3C0E3D5036923779 +:10B7A000D435163458319A30DC321E336024A22549 +:10B7B000E42726266823AA22EC202E21702AB22B09 +:10B7C000F4293628782DBA2CFC2E3E2F8070427139 +:10B7D0000473C67288774A760C74CE75907E527F59 +:10B7E000147DD67C98795A781C7ADE7BA06C626DC9 +:10B7F000246FE66EA86B6A6A2C68EE69B0627263A9 +:10B800003461F660B8657A643C66FE67C0480249F8 +:10B81000444B864AC84F0A4E4C4C8E4DD046124778 +:10B8200054459644D8411A405C429E43E054225508 +:10B830006457A656E8532A526C50AE51F05A325B08 +:10B840007459B658F85D3A5C7C5EBE5F00E1C2E0B8 +:10B8500084E246E308E6CAE78CE54EE410EFD2EE58 +:10B8600094EC56ED18E8DAE99CEB5EEA20FDE2FC88 +:10B87000A4FE66FF28FAEAFBACF96EF830F3F2F2A8 +:10B88000B4F076F138F4FAF5BCF77EF640D982D8F8 +:10B89000C4DA06DB48DE8ADFCCDD0EDC50D792D678 +:10B8A000D4D416D558D09AD1DCD31ED260C5A2C448 +:10B8B000E4C626C768C2AAC3ECC12EC070CBB2CA08 +:10B8C000F4C836C978CCBACDFCCF3ECE8091429038 +:10B8D0000492C69388964A970C95CE94909F529E58 +:10B8E000149CD69D98985A991C9BDE9AA08D628CC8 +:10B8F000248EE68FA88A6A8B2C89EE88B0837282A8 +:10B900003480F681B8847A853C87FE86C0A902A877 +:10B9100044AA86ABC8AE0AAF4CAD8EACD0A712A677 +:10B9200054A496A5D8A01AA15CA39EA2E0B522B407 +:10B9300064B6A6B7E8B22AB36CB1AEB0F0BB32BA07 +:10B9400074B8B6B9F8BC3ABD7CBFBEBE0000201CBE +:10B95000403860248070A06CC048E05400E120FDB5 +:10B9600040D960C58091A08DC0A9E0B50004010157 +:10B9700000000000000001000404010104000101B6 +:10B9800004040100040000000000010000040000A5 +:10B99000000401010404010100040000040400018A +:10B9A0000400010100000001040000000404000084 +:10B9B0000004000100040001000401000004010073 +:10B9C0000000010100000101040400010400010065 +:10B9D0000400000104000001040001000000000058 +:10B9E0000404000004040100000000010000010044 +:10B9F0000404010104000000000001010004010131 +:10BA0000000000010000000100040000040001012A +:10BA10000000010000040100040000010004000017 +:10BA200004000000040400010404010004040101F6 +:10BA300004000100000001010404000104000001F1 +:10BA400004040000040401000004010104040000D7 +:10BA500000040001000400010000000004000100D7 +:10BA6000000401000000000004000101208010809B +:10BA70000080008000800000208010000000100086 +:10BA80002000000020001080208000802000008026 +:10BA900020801080008010800000008000800080E6 +:10BAA0000000100020000000200010800080100026 +:10BAB00020001000208000800000000000000080B6 +:10BAC0000080000020801000000010802000100086 +:10BAD0002000008000000000008010002080000096 +:10BAE0000080108000001080208000000000000016 +:10BAF00020801000200010800000100020800080B6 +:10BB00000000108000801080008000000000108085 +:10BB10000080008020000000208010802080100025 +:10BB20002000000000800000000000802080000055 +:10BB30000080108000001000200000802000100015 +:10BB40002080008020000080200010000080100075 +:10BB500000000000008000802080000000000080C5 +:10BB6000200010802080108000801000080200005B +:10BB7000000202080000000008000208000200089D +:10BB80000000000008020200000200080800020095 +:10BB9000080000080800000800000200080202086F +:10BBA000080002000000020808020000000000086F +:10BBB000080000000002020800020000000202006B +:10BBC000000002080800020808020200080200083B +:10BBD0000002020000000200080200080800000045 +:10BBE000080202080002000000000008000202082B +:10BBF0000000000808000200080200000000020027 +:10BC0000000202080002000800000000000200001C +:10BC100008000200080202080002000808000008EC +:10BC200000020000000000000800020808020008EE +:10BC300000000200000000080802020808000000DE +:10BC400008020200000202000800000800000208CA +:10BC500008020008080200000000020808020200B2 +:10BC60000800000008000208000202000120800015 +:10BC700081200000812000008000000080208000E2 +:10BC80008100800001008000012000000000000011 +:10BC900000208000002080008120800081000000C2 +:10BCA0000000000080008000010080000100000012 +:10BCB00000200000000080000120800080000000C3 +:10BCC0000000800001200000802000008100800032 +:10BCD00001000000802000008000800000200000A3 +:10BCE0008020800081208000810000008000800092 +:10BCF0000100800000208000812080008100000081 +:10BD000000000000000000000020800080200000F3 +:10BD10008000800081008000010000000120800080 +:10BD20008120000081200000800000008120800030 +:10BD300081000000010000000020000001008000E0 +:10BD40000120000080208000810080000120000090 +:10BD500080200000000080000120800080000000A2 +:10BD60000000800000200000802080000001000012 +:10BD70000001080200000802000100420000080063 +:10BD8000000100000000004000000802000108401F +:10BD9000000008000001000200010840000100420C +:10BDA00000000842000108000000004000000002FE +:10BDB00000000840000008400000000000010040B2 +:10BDC0000001084200010842000100020000084290 +:10BDD00000010040000000000000004200010802D5 +:10BDE00000000002000000420001080000000800FE +:10BDF00000010042000100000000000200000040BD +:10BE00000000080200010042000108400001000299 +:10BE10000000004000000842000108020001084044 +:10BE2000000100000000000200000842000108427A +:10BE30000001080000000042000108420000080262 +:10BE4000000000000000084000000042000108005F +:10BE50000001000200010040000008000000000096 +:10BE6000000008400001080200010040100000200E +:10BE70000000402000400000104040200000402012 +:10BE80001000000010404020000040000040002052 +:10BE90001040400000004000100000201000400052 +:10BEA00000400020000000201040000000000000C2 +:10BEB0001000400010400020004000000040400002 +:10BEC0001040002010000000100040201000402012 +:10BED00000000000104040000040402010400000E2 +:10BEE00000404000004040200000002000400020B2 +:10BEF0001000000010004020004040001040402092 +:10BF00000000400010400000100000200000400031 +:10BF10000040002000000020104000001000002021 +:10BF200010404020004040000000402010404000F1 +:10BF300000404020000000001000402010000000E1 +:10BF40000040000000004020104040000040000081 +:10BF50001000400010400020000000000040402081 +:10BF600000000020100040001040002000002000D1 +:10BF70000200200402080004000000000008000085 +:10BF8000020800040208200000082004020820041F +:10BF90000000200000000000020000040200000079 +:10BFA0000000000402002004020800000008000451 +:10BFB0000208200002002000000800040200000423 +:10BFC00000002004000820040200200000002004DB +:10BFD00000080000020800000208200400082000F9 +:10BFE000020000000000000400082000000000041F +:10BFF00000082000000020000208000402080004DD +:10C0000002002004020020040200000002002000C0 +:10C0100000000004000800040000200000082004C4 +:10C0200002080000020820000008200402080000A6 +:10C030000200000402082004000020040008200080 +:10C0400000000000020000000208200400000000C0 +:10C050000208200000002004000800000200000484 +:10C06000000800040008000002002000401000103A +:10C070000010000000000400401004100000001038 +:10C0800040100010400000000000001040000400BC +:10C0900000000410401004100010040000100410F0 +:10C0A00040100400001000004000000000000410D8 +:10C0B00040000010001000104010000000100400AC +:10C0C0004000040040000410001004104010000064 +:10C0D00000000000000000004000041040000010BC +:10C0E0000010001040100400000004004010040084 +:10C0F00000000400001004100010000040000000C8 +:10C100004000041000100000401004000010001057 +:10C110004000000040000010000004104000041027 +:10C12000000000100000040040100010000000009B +:10C1300040100410400004004000001000000410F3 +:10C14000001000104010001000000000401004100B +:10C150000010040000100400401000004010000017 +:10C16000400004000000001000100410982F8A42C4 +:10C1700091443771CFFBC0B5A5DBB5E95BC2563939 +:10C18000F111F159A4823F92D55E1CAB98AA07D851 +:10C19000015B8312BE853124C37D0C55745DBE7274 +:10C1A000FEB1DE80A706DC9B74F19BC1C1699BE4F4 +:10C1B0008647BEEFC69DC10FCCA10C246F2CE92D84 +:10C1C000AA84744ADCA9B05CDA88F97652513E98A8 +:10C1D0006DC631A8C82703B0C77F59BFF30BE0C6AF +:10C1E0004791A7D55163CA0667292914850AB7273D +:10C1F00038211B2EFC6D2C4D130D385354730A65DA +:10C20000BB0A6A762EC9C281852C7292A1E8BFA2B0 +:10C210004B661AA8708B4BC2A3516CC719E892D118 +:10C22000240699D685350EF470A06A1016C1A4199B +:10C23000086C371E4C774827B5BCB034B30C1C399A +:10C240004AAAD84E4FCA9C5BF36F2E68EE828F7459 +:10C250006F63A5781478C8840802C78CFAFFBE9073 +:10C26000EB6C50A4F7A3F9BEF27871C60000000091 +:10C2700022AE28D7982F8A42CD65EF23914437719B +:10C280002F3B4DECCFFBC0B5BCDB8981A5DBB5E90D +:10C2900038B548F35BC2563919D005B6F111F159DA +:10C2A0009B4F19AFA4823F9218816DDAD55E1CAB0B +:10C2B000420203A398AA07D8BE6F7045015B8312A0 +:10C2C0008CB2E44EBE853124E2B4FFD5C37D0C555B +:10C2D0006F897BF2745DBE72B196163BFEB1DE8053 +:10C2E0003512C725A706DC9B942669CF74F19BC144 +:10C2F000D24AF19EC1699BE4E3254F388647BEEFE1 +:10C30000B5D58C8BC69DC10F659CAC77CCA10C2498 +:10C3100075022B596F2CE92D83E4A66EAA84744A0A +:10C32000D4FB41BDDCA9B05CB5531183DA88F97642 +:10C33000ABDF66EE52513E981032B42D6DC631A877 +:10C340003F21FB98C82703B0E40EEFBEC77F59BF5B +:10C35000C28FA83DF30BE0C625A70A934791A7D546 +:10C360006F8203E05163CA06706E0E0A67292914B2 +:10C37000FC2FD246850AB72726C9265C38211B2EFA +:10C38000ED2AC45AFC6D2C4DDFB3959D130D385327 +:10C39000DE63AF8B54730A65A8B2773CBB0A6A763A +:10C3A000E6AEED472EC9C2813B358214852C7292D0 +:10C3B0006403F14CA1E8BFA2013042BC4B661AA84D +:10C3C0009197F8D0708B4BC230BE5406A3516CC706 +:10C3D0001852EFD619E892D110A96555240699D6BE +:10C3E0002A20715785350EF4B8D1BB3270A06A107F +:10C3F000C8D0D2B816C1A41953AB4151086C371E2E +:10C4000099EB8EDF4C774827A8489BE1B5BCB03448 +:10C41000635AC9C5B30C1C39CB8A41E34AAAD84E2A +:10C4200073E363774FCA9C5BA3B8B2D6F36F2E68F1 +:10C43000FCB2EF5DEE828F74602F17436F63A578B7 +:10C4400072ABF0A11478C884EC39641A0802C78C66 +:10C45000281E6323FAFFBE90E9BD82DEEB6C50A478 +:10C460001579C6B2F7A3F9BE2B5372E3F27871C601 +:10C470009C6126EACE3E27CA07C2C021C7B886D132 +:10C480001EEBE0CDD67DDAEA78D16EEE7F4F7DF5FA +:10C49000BA6F1772AA67F006A698C8A2C57D630A8C +:10C4A000AE0DF9BE04983F111B471C13350B711BD1 +:10C4B000847D0423F577DB289324C7407BABCA3205 +:10C4C000BCBEC9150ABE9E3C4C0D109CC4671D43E2 +:10C4D000B6423ECBBED4C54C2A7E65FC9C297F5912 +:10C4E000ECFAD63AAB6FCB5F1758474A8C19446CBD +:10C4F000657870616E642033322D62797465206BCB +:10C50000657870616E642031362D62797465206BB8 +:10C51000EDD3F55C1A631258D69CF7A2DEF9DE144F +:10C5200000000000000000000000000000000010FB +:10C530001B132C0AA3E59CEDA72963085D210621A6 +:10C54000EBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:10C550000F000000A3785913CA4DEB75ABD84141C9 +:10C560004D0A700098E879777940C78C73FE6F2B7D +:10C57000EE6C03521AD5258F602D56C9B2A72595AA +:10C5800060C72C695CDCD6FD31E2A4C0FE536ECDE1 +:10C59000D33669215866666666666666666666664E +:10C5A000666666666666666666666666666666662B +:10C5B00066666666010000000000000000000000E2 +:10C5C000000000000000000000000000000000006B +:10C5D00000000000A3DDB7A5B38ADE6DF5525177E8 +:10C5E000809FF0207DE3AB648E4EEA6665768BD744 +:10C5F0000F5F876759F1B226949BD6EB56B18382C1 +:10C600009A14E00030D1F3EEF2808E19E7FCDF5689 +:10C61000DCD90624B0A00E4A271BEEC478E42FAD67 +:10C620000618432FA7D7FB3D99004D2B0BDFC14FB9 +:10C630008024832B800040002000100008000400AC +:10C640000200010000008000000040000000200007 +:10C6500000001000000008000000040000000200BC +:10C6600000000100008000000040000000200000E9 +:10C67000001000000008000000040000000200009C +:10C6800000010000800000004000000020000000C9 +:10C69000100000000800000004000000020000007C +:10C6A0000100000080000000000000000000000009 +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D000000000000000000000000000000000005A +:10C6E000000000000000000000000000000000004A +:10C6F0000000000063636362636363626363636299 +:10C7000063636362C998989BAAFBFBF9C998989BDD +:10C71000AAFBFBF950349790FACF6C693357F4F2C7 +:10C7200099AC0F0B7BDA06EE81156A87B2429E75D3 +:10C730002BEE917E882B2E7F093E44F8BB7CDA8D50 +:10C7400090924BF3854B61EC8C7525143709FF995A +:10C75000A79BB46A871775210B6250353C6BAFAC51 +:10C760009BF01BC63303F90E3861A93B040A0697F8 +:10C770009FFA1D51E2D8D4B1DAB97D8ADEB37B1DB0 +:10C780004149664CCB5BEFB411E2923ECF51E923B5 +:10C790008E188F6F03020100070605040B0A0908B3 +:10C7A0000F0E0D0CFD74AAD6FA72AFD2F178A6DA8C +:10C7B000FE76ABD60BCF92B6F1BD3D6400C59BBEF5 +:10C7C000FEB330684E74FFB6BFC9C2D2BF0C596CFD +:10C7D00041BF6904BCF7F747033E3595BC326CF99D +:10C7E000FD8D05FDE8A3AA3CEB9D9FA957AFF35033 +:10C7F000AA22F6AD7D0F395E9692A6F7C13D55A7E8 +:10C800006B1FA30A1A70F9148CE25FE34DDF0A4430 +:10C8100026C0A94E35874347B9651CA4F4BA16E073 +:10C82000D27ABFAED1329954685785F09CED9310FF +:10C830004E972CBE7F1D1113174A94E38BA707F365 +:10C84000C5302B4D0000000000000000010000007A +:10C85000FFFFFFFF01000000FFFFFFFF00000000DF +:10C8600000000000000000000000000000000000C8 +:10C8700001000000000000000100000001000000B5 +:10C88000010000000A0A0A0A0A2A2A2A2A2A2A2A4F +:10C890002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AF8 +:10C8A0002A2A2A2A2A2044617461706F733D256404 +:10C8B000202A2A2A2A2A2A2A2A2A2A2A2A2A2A2AE2 +:10C8C0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A0AE8 +:10C8D00000000000F4C8000800000020B4050000BB +:10C8E00044020008B4CB0008B40500203C880000D6 +:10C8F0001E37000811120114016368140801700248 +:10C90000100813E993140811941B0829041AB50C94 +:10C9100013219F1408C99E1B08E50413759614087B +:10C9200091971C0861952419081AED241A4D0413D7 +:10C93000E99A1B0809044B919B50133D3E140833A0 +:10C940003C1408053F1B08E30429081A0B041AEDE0 +:10C95000141ADD081AAF081A390813FD3D140853DC +:10C96000401B08830413E13A1B08C1041A890C41D7 +:10C9700013120132021640702F10EA100902010250 +:10C98000030109022913010125C0320904330203FE +:10C990001C092111CA1322201607058103402D010D +:10C9A0000705010710080403090410035312551268 +:10C9B0004E1256124F1254027345140C0343123197 +:10C9C0001A300202774203831A0322DF1B20E3049A +:10C9D0001365011B20E7041AA40C1AB60441136C5A +:10C9E000023320FF13955B1B08790413415C820816 +:10C9F0001A2D101A3104B94C120F1408D52214083C +:10CA0000F11D14082D131408ED641B081508132DCF +:10CA1000651C085D110C19041329891408DD8B1B92 +:10CA20000851048113898A9B08A11013A16F1B0868 +:10CA3000D10441130942CC08D95768818BC9911898 +:10CA4000138D631408094A1B08250413D3491B08D6 +:10CA50004D041AD10413DD621B08B9042AC5041A57 +:10CA6000811419081AF92C1A45941B558C28124E5A +:10CA70001B0819101BB96ED012531B089D0C1BBD4F +:10CA8000804819081AC1C01ACD041AD904811AE1C4 +:10CA900054014A021501138DA71408E1A61B081DB5 +:10CAA000A013E5481408756B2A082A13D95F1408E7 +:10CAB00051601C088D611419041A0D041A8104298F +:10CAC0001C1B2D92C812931408FD8B1B08290C1AED +:10CAD0001B0C29181B29562819041BF955184A57ED +:10CAE000141B7D43381272140885711B08D2DC3385 +:10CAF00001505AFF8C1907E32902139D401C08318D +:10CB0000814012411B08D10C1305881408C98614F2 +:10CB10000889621B089D040912D61AED6C13B58EA4 +:10CB20001408ED801408495E1408C19F1B086B04AB +:10CB30001A6D041A6F041A690413493A1C08B9746F +:10CB40005812781B0811041B0579F419081A1508E6 +:10CB500013E5772B08CD1419041AED0481323C2318 +:10CB60003F12280D4331303042414243444546474D +:10CB700071022B645280593DE03A48494A4B4C4D72 +:10CB80004E4F505152535455565758595A6162633B +:10CB90006465666768696A6B6C6D6E6F70717273DD +:10CBA0007475767778797A30313233343536373870 +:04CBB000392B2F00EE +:0400000508000131BD +:00000001FF diff --git b/Proj/Objects/Base_GD303.htm a/Proj/Objects/Base_GD303.htm new file mode 100644 index 0000000..00ccd9f --- /dev/null +++ a/Proj/Objects/Base_GD303.htm @@ -0,0 +1,4082 @@ + + +Static Call Graph - [.\Objects\Base_GD303.axf] +
+

Static Call Graph for image .\Objects\Base_GD303.axf


+

#<CALLGRAPH># ARM Linker, 5060960: Last Updated: Fri Jul 22 11:18:01 2022 +

+

Maximum Stack Usage = 564 bytes + Unknown(Cycles, Untraceable Function Pointers)

+Call chain for Maximum Stack Depth:

+aes_init ⇒ aes_test ⇒ rf_Decrypt ⇒ Decrypt ⇒ STM32_AES_ECB_Decrypt ⇒ AES_ECB_Decrypt_Append ⇒ AES_general_SW_dec +

+

+Mutually Recursive functions +

  • ADC0_1_IRQHandler   ⇒   ADC0_1_IRQHandler
    + +

    +

    +Function Pointers +

      +
    • ADC0_1_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • ADC2_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • BusFault_Handler from gd32f30x_it.o(i.BusFault_Handler) referenced from startup_gd32f30x_hd.o(RESET) +
    • CAN0_EWMC_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • CAN0_RX1_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • CLI from platform.o(i.CLI) referenced 2 times from platform.o(.data) +
    • DMA0_Channel0_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • DMA0_Channel1_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • DMA0_Channel2_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • DMA0_Channel3_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • DMA0_Channel4_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • DMA0_Channel5_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • DMA0_Channel6_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • DMA1_Channel0_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • DMA1_Channel1_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • DMA1_Channel2_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • DMA1_Channel3_4_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • DebugMon_Handler from gd32f30x_it.o(i.DebugMon_Handler) referenced from startup_gd32f30x_hd.o(RESET) +
    • EE_ReadBytes from i2c.o(i.EE_ReadBytes) referenced 2 times from platform.o(.data) +
    • EE_WriteBytes from i2c.o(i.EE_WriteBytes) referenced 2 times from platform.o(.data) +
    • EXMC_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • EXTI0_IRQHandler from gd32f30x_it.o(i.EXTI0_IRQHandler) referenced from startup_gd32f30x_hd.o(RESET) +
    • EXTI10_15_IRQHandler from gd32f30x_it.o(i.EXTI10_15_IRQHandler) referenced from startup_gd32f30x_hd.o(RESET) +
    • EXTI1_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • EXTI2_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • EXTI3_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • EXTI4_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • EXTI5_9_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • FMC_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • HW_GD_CUSTOM_HID_REPORT_SEND from hw_mcuio.o(i.HW_GD_CUSTOM_HID_REPORT_SEND) referenced 2 times from platform.o(.data) +
    • HW_GD_CUSTOM_HID_REPORT_SEND from hw_mcuio.o(i.HW_GD_CUSTOM_HID_REPORT_SEND) referenced from platform.o(i.set_pc_communication_type) +
    • HW_GD_Delay from hw_mcuio.o(i.HW_GD_Delay) referenced 2 times from platform.o(.data) +
    • HardFault_Handler from gd32f30x_it.o(i.HardFault_Handler) referenced from startup_gd32f30x_hd.o(RESET) +
    • I2C0_ER_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • I2C0_EV_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • I2C1_ER_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • I2C1_EV_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • LVD_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • MemManage_Handler from gd32f30x_it.o(i.MemManage_Handler) referenced from startup_gd32f30x_hd.o(RESET) +
    • NMI_Handler from gd32f30x_it.o(i.NMI_Handler) referenced from startup_gd32f30x_hd.o(RESET) +
    • NVIC_SystemReset from platform.o(i.NVIC_SystemReset) referenced 2 times from platform.o(.data) +
    • PendSV_Handler from gd32f30x_it.o(i.PendSV_Handler) referenced from startup_gd32f30x_hd.o(RESET) +
    • RCU_CTC_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • RTC_Alarm_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • RTC_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • Reset_Handler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • SDIO_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • SEI from platform.o(i.SEI) referenced 2 times from platform.o(.data) +
    • SPI0_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • SPI1_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • SPI2_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • SVC_Handler from gd32f30x_it.o(i.SVC_Handler) referenced from startup_gd32f30x_hd.o(RESET) +
    • SysTick_Handler from gd32f30x_it.o(i.SysTick_Handler) referenced from startup_gd32f30x_hd.o(RESET) +
    • SystemInit from system_gd32f30x.o(i.SystemInit) referenced from startup_gd32f30x_hd.o(.text) +
    • TAMPER_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER0_BRK_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER0_Channel_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER0_TRG_CMT_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER0_UP_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER1_IRQHandler from gd32f30x_it.o(i.TIMER1_IRQHandler) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER2_IRQHandler from gd32f30x_it.o(i.TIMER2_IRQHandler) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER3_IRQHandler from gd32f30x_it.o(i.TIMER3_IRQHandler) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER4_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER5_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER6_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER7_BRK_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER7_Channel_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER7_TRG_CMT_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • TIMER7_UP_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • UART3_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • UART4_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • USART0_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • USART1_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • USART2_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • USBD_HP_CAN0_TX_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • USBD_LP_CAN0_RX0_IRQHandler from gd32f30x_it.o(i.USBD_LP_CAN0_RX0_IRQHandler) referenced from startup_gd32f30x_hd.o(RESET) +
    • USBD_WKUP_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • UsageFault_Handler from gd32f30x_it.o(i.UsageFault_Handler) referenced from startup_gd32f30x_hd.o(RESET) +
    • WWDGT_IRQHandler from startup_gd32f30x_hd.o(.text) referenced from startup_gd32f30x_hd.o(RESET) +
    • __main from entry.o(.ARM.Collect$$$$00000000) referenced from startup_gd32f30x_hd.o(.text) +
    • _debug_function_enter from function_debug.o(i._debug_function_enter) referenced 2 times from function.o(.data) +
    • _usb_config_desc_get from usbd_enum.o(i._usb_config_desc_get) referenced 2 times from usbd_enum.o(.data) +
    • _usb_dev_desc_get from usbd_enum.o(i._usb_dev_desc_get) referenced 2 times from usbd_enum.o(.data) +
    • _usb_in0_transc from usbd_transc.o(i._usb_in0_transc) referenced from usbd_core.o(i.usbd_init) +
    • _usb_out0_transc from usbd_transc.o(i._usb_out0_transc) referenced from usbd_core.o(i.usbd_init) +
    • _usb_setup_transc from usbd_transc.o(i._usb_setup_transc) referenced from usbd_core.o(i.usbd_init) +
    • _usb_std_clearfeature from usbd_enum.o(i._usb_std_clearfeature) referenced 2 times from usbd_enum.o(.data) +
    • _usb_std_getconfiguration from usbd_enum.o(i._usb_std_getconfiguration) referenced 2 times from usbd_enum.o(.data) +
    • _usb_std_getdescriptor from usbd_enum.o(i._usb_std_getdescriptor) referenced 2 times from usbd_enum.o(.data) +
    • _usb_std_getinterface from usbd_enum.o(i._usb_std_getinterface) referenced 2 times from usbd_enum.o(.data) +
    • _usb_std_getstatus from usbd_enum.o(i._usb_std_getstatus) referenced 2 times from usbd_enum.o(.data) +
    • _usb_std_reserved from usbd_enum.o(i._usb_std_reserved) referenced 4 times from usbd_enum.o(.data) +
    • _usb_std_setaddress from usbd_enum.o(i._usb_std_setaddress) referenced 2 times from usbd_enum.o(.data) +
    • _usb_std_setconfiguration from usbd_enum.o(i._usb_std_setconfiguration) referenced 2 times from usbd_enum.o(.data) +
    • _usb_std_setdescriptor from usbd_enum.o(i._usb_std_setdescriptor) referenced 2 times from usbd_enum.o(.data) +
    • _usb_std_setfeature from usbd_enum.o(i._usb_std_setfeature) referenced 2 times from usbd_enum.o(.data) +
    • _usb_std_setinterface from usbd_enum.o(i._usb_std_setinterface) referenced 2 times from usbd_enum.o(.data) +
    • _usb_std_synchframe from usbd_enum.o(i._usb_std_synchframe) referenced 2 times from usbd_enum.o(.data) +
    • _usb_str_desc_get from usbd_enum.o(i._usb_str_desc_get) referenced 2 times from usbd_enum.o(.data) +
    • aes_init from function_aes.o(i.aes_init) referenced 2 times from function.o(.data) +
    • aes_keycode_upgrade from function_aes.o(i.aes_keycode_upgrade) referenced 2 times from function.o(.data) +
    • aes_load_fastmatch_data from function_aes.o(i.aes_load_fastmatch_data) referenced 2 times from function.o(.data) +
    • ant_sw from platform.o(i.ant_sw) referenced 2 times from platform.o(.data) +
    • auto_search_freq_enter from function_monitor_freq.o(i.auto_search_freq_enter) referenced 2 times from function.o(.data) +
    • base_confirm_keypad_whitelist_request from function_whitelist.o(i.base_confirm_keypad_whitelist_request) referenced 2 times from function.o(.data) +
    • base_core_20ms_isr from base_timer.o(i.base_core_20ms_isr) referenced 2 times from base_core.o(.data) +
    • base_core_28ms_isr from base_timer.o(i.base_core_28ms_isr) referenced 2 times from base_core.o(.data) +
    • base_core_2ms5_isr from base_timer.o(i.base_core_2ms5_isr) referenced 2 times from base_core.o(.data) +
    • base_core_force_sysmode0 from base_core.o(i.base_core_force_sysmode0) referenced 2 times from base_core.o(.data) +
    • base_core_init_all from base_core.o(i.base_core_init_all) referenced 2 times from base_core.o(.data) +
    • base_core_main_loop from base_core.o(i.base_core_main_loop) referenced 2 times from base_core.o(.data) +
    • base_send_beacon_switch from base_process_tx_keypad.o(i.base_send_beacon_switch) referenced 2 times from base_core.o(.data) +
    • base_tx_to_pc_sub from base_process_pc_enter.o(i.base_tx_to_pc_sub) referenced 2 times from base_core.o(.data) +
    • basetest_get_status from fucntion_base_test.o(i.basetest_get_status) referenced 2 times from function.o(.data) +
    • basetest_init from fucntion_base_test.o(i.basetest_init) referenced 2 times from function.o(.data) +
    • basetest_progress from fucntion_base_test.o(i.basetest_progress) referenced 2 times from function.o(.data) +
    • basetest_rx_and_ack_pc from fucntion_base_test.o(i.basetest_rx_and_ack_pc) referenced 2 times from function.o(.data) +
    • beep_ctrl from buzzer.o(i.beep_ctrl) referenced 2 times from platform.o(.data) +
    • broadcast_config from function_broadcast.o(i.broadcast_config) referenced 2 times from function.o(.data) +
    • custom_hid_data_in from custom_hid_core.o(i.custom_hid_data_in) referenced 2 times from custom_hid_core.o(.data) +
    • custom_hid_data_out from custom_hid_core.o(i.custom_hid_data_out) referenced 2 times from custom_hid_core.o(.data) +
    • custom_hid_deinit from custom_hid_core.o(i.custom_hid_deinit) referenced 2 times from custom_hid_core.o(.data) +
    • custom_hid_init from custom_hid_core.o(i.custom_hid_init) referenced 2 times from custom_hid_core.o(.data) +
    • custom_hid_req_handler from custom_hid_core.o(i.custom_hid_req_handler) referenced 2 times from custom_hid_core.o(.data) +
    • det_blank_content from function_broadcast.o(i.det_blank_content) referenced 2 times from function.o(.data) +
    • fastmatch_enter_exit from fucntion_fastmatch.o(i.fastmatch_enter_exit) referenced 2 times from function.o(.data) +
    • fastmatch_load_info_to_vote_beacon from fucntion_fastmatch.o(i.fastmatch_load_info_to_vote_beacon) referenced 2 times from function.o(.data) +
    • fastmatch_lowerPA_ack from fucntion_fastmatch.o(i.fastmatch_lowerPA_ack) referenced 2 times from function.o(.data) +
    • fastmatch_lowerPA_setup from fucntion_fastmatch.o(i.fastmatch_lowerPA_setup) referenced 2 times from function.o(.data) +
    • fastmatch_status from fucntion_fastmatch.o(i.fastmatch_status) referenced 2 times from function.o(.data) +
    • fastmatch_success_check from fucntion_fastmatch.o(i.fastmatch_success_check) referenced 2 times from function.o(.data) +
    • get_aes_key from function_aes.o(i.get_aes_key) referenced 2 times from function.o(.data) +
    • get_aes_status from function_aes.o(i.get_aes_status) referenced 2 times from function.o(.data) +
    • get_base_id from base_process_pc_enter.o(i.get_base_id) referenced 2 times from base_core.o(.data) +
    • get_base_log_mode from base_process_pc_enter.o(i.get_base_log_mode) referenced 2 times from base_core.o(.data) +
    • get_base_main_rfchannel from multi_channel.o(i.get_base_main_rfchannel) referenced 2 times from base_core.o(.data) +
    • get_base_match_code from base_process_pc_enter.o(i.get_base_match_code) referenced 2 times from base_core.o(.data) +
    • get_base_send_beacon_status from base_process_tx_keypad.o(i.get_base_send_beacon_status) referenced 2 times from base_core.o(.data) +
    • get_base_status from base_core.o(i.get_base_status) referenced 2 times from base_core.o(.data) +
    • get_core_version from base_core.o(i.get_core_version) referenced 2 times from base_core.o(.data) +
    • get_datapos from base_core.o(i.get_datapos) referenced 2 times from base_core.o(.data) +
    • get_main_rf_hard_id from multi_channel.o(i.get_main_rf_hard_id) referenced 2 times from base_core.o(.data) +
    • get_pc_connect_status from base_core.o(i.get_pc_connect_status) referenced 2 times from base_core.o(.data) +
    • get_pc_connect_status_acc from base_core.o(i.get_pc_connect_status_acc) referenced 2 times from base_core.o(.data) +
    • get_permit_dispaly_status from base_core.o(i.get_permit_dispaly_status) referenced 2 times from base_core.o(.data) +
    • get_stm32_chip_id from platform.o(i.get_stm32_chip_id) referenced 2 times from platform.o(.data) +
    • get_usb_status from platform.o(i.get_usb_status) referenced 2 times from platform.o(.data) +
    • get_whitelist_rfid from multi_channel.o(i.get_whitelist_rfid) referenced 2 times from base_core.o(.data) +
    • key_config from custom_hid_itf.o(i.key_config) referenced 2 times from custom_hid_itf.o(.data) +
    • keypad_idsn_record_whitelist_request from function_whitelist.o(i.keypad_idsn_record_whitelist_request) referenced 2 times from function.o(.data) +
    • keypad_rf_data_save from base_process_rx_keypad.o(i.keypad_rf_data_save) referenced 2 times from base_core.o(.data) +
    • led1_control from led.o(i.led1_control) referenced 2 times from platform.o(.data) +
    • led2_control from led.o(i.led2_control) referenced 2 times from platform.o(.data) +
    • led_config from custom_hid_itf.o(i.led_config) referenced 2 times from custom_hid_itf.o(.data) +
    • main from main.o(i.main) referenced from entry9a.o(.ARM.Collect$$$$0000000B) +
    • monitor_freq_process from function_monitor_freq.o(i.monitor_freq_process) referenced 2 times from function.o(.data) +
    • monitor_rf_data from function_monitor_freq.o(i.monitor_rf_data) referenced 2 times from function.o(.data) +
    • msg_polling from fucntion_text_message.o(i.msg_polling) referenced 2 times from function.o(.data) +
    • network_get_name from function_network.o(i.network_get_name) referenced 2 times from function.o(.data) +
    • network_get_nameview from function_network.o(i.network_get_nameview) referenced 2 times from function.o(.data) +
    • network_get_netseq from function_network.o(i.network_get_netseq) referenced 2 times from function.o(.data) +
    • network_get_pwd from function_network.o(i.network_get_pwd) referenced 2 times from function.o(.data) +
    • network_polling from function_network.o(i.network_polling) referenced 2 times from function.o(.data) +
    • network_set_name from function_network.o(i.network_set_name) referenced 2 times from function.o(.data) +
    • network_set_nameview from function_network.o(i.network_set_nameview) referenced 2 times from function.o(.data) +
    • network_set_netseq_change from function_network.o(i.network_set_netseq_change) referenced 2 times from function.o(.data) +
    • network_set_pwd from function_network.o(i.network_set_pwd) referenced 2 times from function.o(.data) +
    • pc_transfer2keypad_data_fetch from transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch) referenced from base_process_tx_keypad.o(i.base_tx_keypad_beacon) +
    • pcrx_data_save from base_process_pc_enter.o(i.pcrx_data_save) referenced 2 times from base_core.o(.data) +
    • process_keypad_broadcast_requst from function_broadcast.o(i.process_keypad_broadcast_requst) referenced 2 times from function.o(.data) +
    • process_pc_aes_config from function_aes.o(i.process_pc_aes_config) referenced 2 times from function.o(.data) +
    • process_setup_single_chan from multi_channel.o(i.process_setup_single_chan) referenced 2 times from base_core.o(.data) +
    • rf_Decrypt from function_aes.o(i.rf_Decrypt) referenced 2 times from function.o(.data) +
    • rf_Encrypt from function_aes.o(i.rf_Encrypt) referenced 2 times from function.o(.data) +
    • rf_SendPacket from rf24l01 - multi.o(i.rf_SendPacket) referenced 2 times from platform.o(.data) +
    • rf_initial from rf24l01 - multi.o(i.rf_initial) referenced 2 times from platform.o(.data) +
    • rf_set_PA_Mode from rf24l01 - multi.o(i.rf_set_PA_Mode) referenced 2 times from platform.o(.data) +
    • rf_set_syncode from rf24l01 - multi.o(i.rf_set_syncode) referenced 2 times from platform.o(.data) +
    • rf_setfreq from rf24l01 - multi.o(i.rf_setfreq) referenced 2 times from platform.o(.data) +
    • save_keypad_ack_data from transparentupgrade.o(i.save_keypad_ack_data) referenced 2 times from function.o(.data) +
    • search_special_list from function_whitelist.o(i.search_special_list) referenced 2 times from function.o(.data) +
    • send_to_keypad_user_hardID from base_process_tx_keypad.o(i.send_to_keypad_user_hardID) referenced 2 times from base_core.o(.data) +
    • startup_broadcast from function_broadcast.o(i.startup_broadcast) referenced 2 times from function.o(.data) +
    • uart1_send_datas from platform.o(i.uart1_send_datas) referenced 2 times from platform.o(.data) +
    • update_get_status from transparentupgrade.o(i.update_get_status) referenced 2 times from function.o(.data) +
    • update_kp_enter from transparentupgrade.o(i.update_kp_enter) referenced 2 times from function.o(.data) +
    • update_kp_progress from transparentupgrade.o(i.update_kp_progress) referenced 2 times from function.o(.data) +
    • update_monitor_sdk_connect from transparentupgrade.o(i.update_monitor_sdk_connect) referenced 2 times from function.o(.data) +
    • usbd_address_set from usbd_lld_core.o(i.usbd_address_set) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_core_reset from usbd_lld_core.o(i.usbd_core_reset) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_core_stop from usbd_lld_core.o(i.usbd_core_stop) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_dp_pullup from usbd_lld_core.o(i.usbd_dp_pullup) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_ep_data_read from usbd_lld_core.o(i.usbd_ep_data_read) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_ep_data_write from usbd_lld_core.o(i.usbd_ep_data_write) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_ep_disable from usbd_lld_core.o(i.usbd_ep_disable) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_ep_reset from usbd_lld_core.o(i.usbd_ep_reset) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_ep_rx_enable from usbd_lld_core.o(i.usbd_ep_rx_enable) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_ep_setup from usbd_lld_core.o(i.usbd_ep_setup) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_ep_stall_clear from usbd_lld_core.o(i.usbd_ep_stall_clear) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_ep_stall_set from usbd_lld_core.o(i.usbd_ep_stall_set) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_ep_status from usbd_lld_core.o(i.usbd_ep_status) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_leave_suspend from usbd_lld_core.o(i.usbd_leave_suspend) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_resume from usbd_lld_core.o(i.usbd_resume) referenced 2 times from usbd_lld_core.o(.data) +
    • usbd_suspend from usbd_lld_core.o(i.usbd_suspend) referenced 2 times from usbd_lld_core.o(.data) +
    • user__keypad_transfer2pc from function.o(i.user__keypad_transfer2pc) referenced 2 times from function.o(.data) +
    • user__pc_0x60cmd from function.o(i.user__pc_0x60cmd) referenced 2 times from function.o(.data) +
    • user__pc_0x61cmd from function.o(i.user__pc_0x61cmd) referenced 2 times from function.o(.data) +
    • user__pc_0x61cmd_type0x0B from function.o(i.user__pc_0x61cmd_type0x0B) referenced 2 times from function.o(.data) +
    • user__pc_transfer2keypad from function.o(i.user__pc_transfer2keypad) referenced 2 times from function.o(.data) +
    • whitelist_enter from function_whitelist.o(i.whitelist_enter) referenced 2 times from function.o(.data) +
    • whitelist_init from function_whitelist.o(i.whitelist_init) referenced 2 times from function.o(.data) +
    +

    +

    +Global Symbols +

    +

    __main (Thumb, 0 bytes, Stack size unknown bytes, entry.o(.ARM.Collect$$$$00000000)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(.text) +
    +

    _main_stk (Thumb, 0 bytes, Stack size unknown bytes, entry2.o(.ARM.Collect$$$$00000001)) + +

    _main_scatterload (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004)) +

    [Calls]

    • >>   __scatterload +
    + +

    __main_after_scatterload (Thumb, 0 bytes, Stack size unknown bytes, entry5.o(.ARM.Collect$$$$00000004)) +

    [Called By]

    • >>   __scatterload +
    + +

    _main_clock (Thumb, 0 bytes, Stack size unknown bytes, entry7b.o(.ARM.Collect$$$$00000008)) + +

    _main_cpp_init (Thumb, 0 bytes, Stack size unknown bytes, entry8b.o(.ARM.Collect$$$$0000000A)) + +

    _main_init (Thumb, 0 bytes, Stack size unknown bytes, entry9a.o(.ARM.Collect$$$$0000000B)) + +

    __rt_lib_shutdown_fini (Thumb, 0 bytes, Stack size unknown bytes, entry12b.o(.ARM.Collect$$$$0000000E)) + +

    __rt_final_cpp (Thumb, 0 bytes, Stack size unknown bytes, entry10a.o(.ARM.Collect$$$$0000000F)) + +

    __rt_final_exit (Thumb, 0 bytes, Stack size unknown bytes, entry11a.o(.ARM.Collect$$$$00000011)) + +

    Reset_Handler (Thumb, 8 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    ADC0_1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +

    [Calls]

    • >>   ADC0_1_IRQHandler +
    +
    [Called By]
    • >>   ADC0_1_IRQHandler +
    +
    [Address Reference Count : 1]
    • startup_gd32f30x_hd.o(RESET) +
    +

    ADC2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    CAN0_EWMC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    CAN0_RX1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    DMA0_Channel0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    DMA0_Channel1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    DMA0_Channel2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    DMA0_Channel3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    DMA0_Channel4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    DMA0_Channel5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    DMA0_Channel6_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    DMA1_Channel0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    DMA1_Channel1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    DMA1_Channel2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    DMA1_Channel3_4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    EXMC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    EXTI1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    EXTI2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    EXTI3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    EXTI4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    EXTI5_9_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    FMC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    I2C0_ER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    I2C0_EV_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    I2C1_ER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    I2C1_EV_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    LVD_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    RCU_CTC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    RTC_Alarm_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    RTC_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    SDIO_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    SPI0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    SPI1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    SPI2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TAMPER_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER0_BRK_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER0_Channel_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER0_TRG_CMT_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER0_UP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER5_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER6_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER7_BRK_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER7_Channel_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER7_TRG_CMT_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER7_UP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    UART3_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    UART4_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    USART0_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    USART1_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    USART2_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    USBD_HP_CAN0_TX_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    USBD_WKUP_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    WWDGT_IRQHandler (Thumb, 0 bytes, Stack size 0 bytes, startup_gd32f30x_hd.o(.text)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    rand (Thumb, 20 bytes, Stack size 0 bytes, rand.o(.text)) +

    [Called By]

    • >>   RandData +
    • >>   aes_keycode_upgrade +
    + +

    srand (Thumb, 6 bytes, Stack size 0 bytes, rand.o(.text)) +

    [Called By]

    • >>   RandData +
    • >>   aes_keycode_upgrade +
    + +

    ___aeabi_memcpy8$move (Thumb, 0 bytes, Stack size 8 bytes, memmovea.o(.text), UNUSED) + +

    __aeabi_memcpy (Thumb, 64 bytes, Stack size 8 bytes, memmovea.o(.text)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = __aeabi_memcpy +
    +
    [Called By]
    • >>   msg_polling +
    • >>   fastmatch_lowerPA_ack_sub +
    • >>   whitelist_ack_pc +
    • >>   monitor_freq_ack_pc +
    • >>   _dbg_function__response_pc_cmd +
    • >>   base_broadcast_sub +
    • >>   AES_Encrypt +
    • >>   AES_Decrypt +
    • >>   generate_default_key0_code +
    • >>   update_kp_enter +
    • >>   rf_Encrypt +
    • >>   rf_Decrypt +
    • >>   network_set_name +
    • >>   get_aes_key +
    • >>   broadcast_config +
    • >>   aes_load_fastmatch_data +
    • >>   _debug_function_enter +
    • >>   user__pc_cmd_ack +
    • >>   msg_get_pc_data +
    • >>   SEGGER_RTT_ReadNoLock +
    • >>   _WriteNoCheck +
    • >>   _WriteBlocking +
    • >>   encrypt +
    • >>   decrypt +
    • >>   KeyExpansion +
    • >>   Upgrade_RfSendCallBack +
    • >>   Upgrade_CheckNextPackArrive +
    • >>   Upgrade_BeaconQuery +
    + +

    __aeabi_memcpy4 (Thumb, 0 bytes, Stack size 8 bytes, memmovea.o(.text), UNUSED) + +

    __aeabi_memmove (Thumb, 0 bytes, Stack size 8 bytes, memmovea.o(.text), UNUSED) + +

    __aeabi_memmove4 (Thumb, 0 bytes, Stack size 8 bytes, memmovea.o(.text), UNUSED) + +

    __aeabi_memmove8 (Thumb, 0 bytes, Stack size 8 bytes, memmovea.o(.text), UNUSED) + +

    __aeabi_memset (Thumb, 14 bytes, Stack size 0 bytes, memseta.o(.text)) +

    [Called By]

    • >>   whitelist_delete +
    • >>   _dbg_function__response_pc_cmd +
    • >>   _debug_function_enter +
    • >>   Upgrade_TickHandler +
    • >>   _memset$wrapper +
    • >>   __aeabi_memclr +
    + +

    __aeabi_memset4 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED) + +

    __aeabi_memset8 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED) + +

    __aeabi_memclr (Thumb, 4 bytes, Stack size 0 bytes, memseta.o(.text)) +

    [Calls]

    • >>   __aeabi_memset +
    +
    [Called By]
    • >>   custom_hid_init +
    • >>   _debug_core__init_parameter_datapos_change +
    • >>   whitelist__tx_authcode_to_keypad +
    • >>   generate_default_key0_code +
    • >>   whitelist_enter +
    • >>   msg_send +
    • >>   msg_get_pc_data +
    • >>   encrypt +
    • >>   decrypt +
    • >>   Upgrade_TickHandler +
    • >>   Upgrade_BeaconQuery +
    + +

    __aeabi_memclr4 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text)) +

    [Called By]

    • >>   SET_SDA_OUT +
    • >>   SET_SDA_IN +
    • >>   fastmatch_lowerPA_ack_sub +
    • >>   whitelist_ack_pc +
    • >>   network_tx_beacon +
    • >>   monitor_freq_ack_pc +
    • >>   user__pc_cmd_ack +
    • >>   msg_send +
    • >>   Upgrade_SendPassThroughPack +
    • >>   Upgrade_SendBeacon +
    • >>   Upgrade_RfSendCallBack +
    • >>   Upgrade_BeaconQuery +
    + +

    __aeabi_memclr8 (Thumb, 0 bytes, Stack size 0 bytes, memseta.o(.text), UNUSED) + +

    _memset$wrapper (Thumb, 18 bytes, Stack size 8 bytes, memseta.o(.text), UNUSED) +

    [Calls]

    • >>   __aeabi_memset +
    + +

    memcmp (Thumb, 26 bytes, Stack size 12 bytes, memcmp.o(.text)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = memcmp +
    +
    [Called By]
    • >>   search_special_list +
    + +

    strcpy (Thumb, 18 bytes, Stack size 0 bytes, strcpy.o(.text)) +

    [Called By]

    • >>   _DoInit +
    + +

    __scatterload (Thumb, 28 bytes, Stack size 0 bytes, init.o(.text)) +

    [Calls]

    • >>   __main_after_scatterload +
    +
    [Called By]
    • >>   _main_scatterload +
    + +

    __scatterload_rt2 (Thumb, 0 bytes, Stack size 0 bytes, init.o(.text), UNUSED) + +

    __decompress (Thumb, 0 bytes, Stack size unknown bytes, __dczerorl2.o(.text), UNUSED) + +

    __decompress1 (Thumb, 86 bytes, Stack size unknown bytes, __dczerorl2.o(.text), UNUSED) + +

    AES_Decrypt (Thumb, 62 bytes, Stack size 24 bytes, aes.o(i.AES_Decrypt)) +

    [Stack]

    • Max Depth = 112
    • Call Chain = AES_Decrypt ⇒ decrypt ⇒ InvCipher ⇒ InvMixColumns +
    +
    [Calls]
    • >>   decrypt +
    • >>   __aeabi_memcpy +
    • >>   free +
    +
    [Called By]
    • >>   Decrypt +
    + +

    AES_ECB_Decrypt_Append (Thumb, 186 bytes, Stack size 48 bytes, crypto.o(i.AES_ECB_Decrypt_Append)) +

    [Stack]

    • Max Depth = 84
    • Call Chain = AES_ECB_Decrypt_Append ⇒ AES_general_SW_dec +
    +
    [Calls]
    • >>   AES_general_SW_dec +
    +
    [Called By]
    • >>   STM32_AES_ECB_Decrypt +
    + +

    AES_ECB_Decrypt_Finish (Thumb, 26 bytes, Stack size 0 bytes, crypto.o(i.AES_ECB_Decrypt_Finish)) +

    [Called By]

    • >>   STM32_AES_ECB_Decrypt +
    + +

    AES_ECB_Decrypt_Init (Thumb, 6 bytes, Stack size 0 bytes, crypto.o(i.AES_ECB_Decrypt_Init)) +

    [Stack]

    • Max Depth = 52
    • Call Chain = AES_ECB_Decrypt_Init ⇒ AESstdInit ⇒ AES_keyschedule_dec ⇒ AES_keyschedule_enc_LL +
    +
    [Calls]
    • >>   AESstdInit +
    +
    [Called By]
    • >>   STM32_AES_ECB_Decrypt +
    + +

    AES_ECB_Encrypt_Append (Thumb, 186 bytes, Stack size 48 bytes, crypto.o(i.AES_ECB_Encrypt_Append)) +

    [Stack]

    • Max Depth = 84
    • Call Chain = AES_ECB_Encrypt_Append ⇒ AES_general_SW_enc +
    +
    [Calls]
    • >>   AES_general_SW_enc +
    +
    [Called By]
    • >>   STM32_AES_ECB_Encrypt +
    + +

    AES_ECB_Encrypt_Finish (Thumb, 26 bytes, Stack size 0 bytes, crypto.o(i.AES_ECB_Encrypt_Finish)) +

    [Called By]

    • >>   STM32_AES_ECB_Encrypt +
    + +

    AES_ECB_Encrypt_Init (Thumb, 6 bytes, Stack size 0 bytes, crypto.o(i.AES_ECB_Encrypt_Init)) +

    [Stack]

    • Max Depth = 52
    • Call Chain = AES_ECB_Encrypt_Init ⇒ AESstdInit ⇒ AES_keyschedule_dec ⇒ AES_keyschedule_enc_LL +
    +
    [Calls]
    • >>   AESstdInit +
    +
    [Called By]
    • >>   STM32_AES_ECB_Encrypt +
    + +

    AES_Encrypt (Thumb, 62 bytes, Stack size 24 bytes, aes.o(i.AES_Encrypt)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = AES_Encrypt ⇒ encrypt ⇒ KeyExpansion ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   encrypt +
    • >>   __aeabi_memcpy +
    • >>   free +
    +
    [Called By]
    • >>   Encrypt +
    + +

    AES_general_SW_dec (Thumb, 782 bytes, Stack size 36 bytes, crypto.o(i.AES_general_SW_dec)) +

    [Stack]

    • Max Depth = 36
    • Call Chain = AES_general_SW_dec +
    +
    [Called By]
    • >>   AES_ECB_Decrypt_Append +
    + +

    AES_general_SW_enc (Thumb, 792 bytes, Stack size 36 bytes, crypto.o(i.AES_general_SW_enc)) +

    [Stack]

    • Max Depth = 36
    • Call Chain = AES_general_SW_enc +
    +
    [Called By]
    • >>   AES_ECB_Encrypt_Append +
    + +

    AES_keyschedule_dec (Thumb, 340 bytes, Stack size 16 bytes, crypto.o(i.AES_keyschedule_dec)) +

    [Stack]

    • Max Depth = 28
    • Call Chain = AES_keyschedule_dec ⇒ AES_keyschedule_enc_LL +
    +
    [Calls]
    • >>   AES_keyschedule_enc_LL +
    +
    [Called By]
    • >>   AESstdInit +
    + +

    AddRoundKey (Thumb, 56 bytes, Stack size 12 bytes, aes.o(i.AddRoundKey)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = AddRoundKey +
    +
    [Called By]
    • >>   InvCipher +
    • >>   Cipher +
    + +

    BusFault_Handler (Thumb, 4 bytes, Stack size 0 bytes, gd32f30x_it.o(i.BusFault_Handler)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    CLI (Thumb, 4 bytes, Stack size 0 bytes, platform.o(i.CLI)) +

    [Called By]

    • >>   rf_setfreq +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    Cipher (Thumb, 132 bytes, Stack size 16 bytes, aes.o(i.Cipher)) +

    [Stack]

    • Max Depth = 28
    • Call Chain = Cipher ⇒ MixColumns +
    +
    [Calls]
    • >>   SubBytes +
    • >>   ShiftRows +
    • >>   MixColumns +
    • >>   AddRoundKey +
    +
    [Called By]
    • >>   encrypt +
    + +

    DebugMon_Handler (Thumb, 2 bytes, Stack size 0 bytes, gd32f30x_it.o(i.DebugMon_Handler)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    EE_ReadBytes (Thumb, 72 bytes, Stack size 24 bytes, i2c.o(i.EE_ReadBytes)) +

    [Stack]

    • Max Depth = 108
    • Call Chain = EE_ReadBytes ⇒ i2c_send_byte ⇒ SET_SDA_OUT ⇒ HW_GD_GPIO_Init ⇒ gpio_init +
    +
    [Calls]
    • >>   i2c_stop +
    • >>   i2c_start +
    • >>   i2c_send_byte +
    • >>   i2c_read_byte +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    EE_WriteBytes (Thumb, 122 bytes, Stack size 32 bytes, i2c.o(i.EE_WriteBytes)) +

    [Stack]

    • Max Depth = 116
    • Call Chain = EE_WriteBytes ⇒ i2c_send_byte ⇒ SET_SDA_OUT ⇒ HW_GD_GPIO_Init ⇒ gpio_init +
    +
    [Calls]
    • >>   basic_delay_ms +
    • >>   i2c_stop +
    • >>   i2c_start +
    • >>   i2c_send_byte +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    EXTI0_IRQHandler (Thumb, 40 bytes, Stack size 8 bytes, gd32f30x_it.o(i.EXTI0_IRQHandler)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = EXTI0_IRQHandler ⇒ custom_hid_report_send ⇒ usbd_ep_send +
    +
    [Calls]
    • >>   exti_interrupt_flag_get +
    • >>   exti_interrupt_flag_clear +
    • >>   custom_hid_report_send +
    +
    [Address Reference Count : 1]
    • startup_gd32f30x_hd.o(RESET) +
    +

    EXTI10_15_IRQHandler (Thumb, 46 bytes, Stack size 8 bytes, gd32f30x_it.o(i.EXTI10_15_IRQHandler)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = EXTI10_15_IRQHandler ⇒ custom_hid_report_send ⇒ usbd_ep_send +
    +
    [Calls]
    • >>   exti_interrupt_flag_get +
    • >>   exti_interrupt_flag_clear +
    • >>   custom_hid_report_send +
    +
    [Address Reference Count : 1]
    • startup_gd32f30x_hd.o(RESET) +
    +

    GPIO_Init (Thumb, 132 bytes, Stack size 32 bytes, main.o(i.GPIO_Init)) +

    [Stack]

    • Max Depth = 68
    • Call Chain = GPIO_Init ⇒ HW_GD_GPIO_Init ⇒ gpio_init +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   HW_GD_GPIO_Init +
    +
    [Called By]
    • >>   main +
    + +

    HW_GD_CUSTOM_HID_REPORT_SEND (Thumb, 18 bytes, Stack size 16 bytes, hw_mcuio.o(i.HW_GD_CUSTOM_HID_REPORT_SEND)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = HW_GD_CUSTOM_HID_REPORT_SEND ⇒ custom_hid_report_send ⇒ usbd_ep_send +
    +
    [Calls]
    • >>   custom_hid_report_send +
    +
    [Address Reference Count : 2]
    • platform.o(i.set_pc_communication_type) +
    • platform.o(.data) +
    +

    HW_GD_Delay (Thumb, 26 bytes, Stack size 4 bytes, hw_mcuio.o(i.HW_GD_Delay)) +

    [Stack]

    • Max Depth = 4
    • Call Chain = HW_GD_Delay +
    +
    [Calls]
    • >>   HW_GD_GetTick +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    HW_GD_GPIO_Init (Thumb, 20 bytes, Stack size 16 bytes, hw_mcuio.o(i.HW_GD_GPIO_Init)) +

    [Stack]

    • Max Depth = 36
    • Call Chain = HW_GD_GPIO_Init ⇒ gpio_init +
    +
    [Calls]
    • >>   gpio_init +
    +
    [Called By]
    • >>   GPIO_Init +
    • >>   SET_SDA_OUT +
    • >>   SET_SDA_IN +
    + +

    HW_GD_GPIO_TogglePin (Thumb, 38 bytes, Stack size 16 bytes, hw_mcuio.o(i.HW_GD_GPIO_TogglePin)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = HW_GD_GPIO_TogglePin +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_input_bit_get +
    • >>   gpio_bit_set +
    +
    [Called By]
    • >>   led2_control +
    • >>   led1_control +
    + +

    HW_GD_GetTick (Thumb, 6 bytes, Stack size 0 bytes, hw_mcuio.o(i.HW_GD_GetTick)) +

    [Called By]

    • >>   HW_GD_Delay +
    + +

    HW_GD_IncTick (Thumb, 12 bytes, Stack size 0 bytes, hw_mcuio.o(i.HW_GD_IncTick)) +

    [Called By]

    • >>   SysTick_Handler +
    + +

    HW_GD_SPI0_Init (Thumb, 100 bytes, Stack size 32 bytes, hw_mcuio.o(i.HW_GD_SPI0_Init)) +

    [Stack]

    • Max Depth = 52
    • Call Chain = HW_GD_SPI0_Init ⇒ gpio_init +
    +
    [Calls]
    • >>   rcu_periph_clock_enable +
    • >>   gpio_init +
    • >>   spi_init +
    • >>   spi_enable +
    +
    [Called By]
    • >>   main +
    + +

    HW_GD_SPI0_TransmitReceive (Thumb, 50 bytes, Stack size 24 bytes, hw_mcuio.o(i.HW_GD_SPI0_TransmitReceive)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Called By]
    • >>   drv_spi_read_write_byte_N +
    • >>   drv_spi_read_write_byte +
    + +

    HW_GD_SPI_TransmitReceiveOneByte (Thumb, 96 bytes, Stack size 24 bytes, hw_mcuio.o(i.HW_GD_SPI_TransmitReceiveOneByte)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   spi_i2s_flag_get +
    • >>   spi_i2s_data_transmit +
    • >>   spi_i2s_data_receive +
    +
    [Called By]
    • >>   HW_GD_SPI0_TransmitReceive +
    + +

    HardFault_Handler (Thumb, 4 bytes, Stack size 0 bytes, gd32f30x_it.o(i.HardFault_Handler)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    InvCipher (Thumb, 132 bytes, Stack size 16 bytes, aes.o(i.InvCipher)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = InvCipher ⇒ InvMixColumns +
    +
    [Calls]
    • >>   InvSubBytes +
    • >>   InvShiftRows +
    • >>   InvMixColumns +
    • >>   AddRoundKey +
    +
    [Called By]
    • >>   decrypt +
    + +

    InvMixColumns (Thumb, 546 bytes, Stack size 48 bytes, aes.o(i.InvMixColumns)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = InvMixColumns +
    +
    [Called By]
    • >>   InvCipher +
    + +

    InvShiftRows (Thumb, 60 bytes, Stack size 0 bytes, aes.o(i.InvShiftRows)) +

    [Called By]

    • >>   InvCipher +
    + +

    InvSubBytes (Thumb, 42 bytes, Stack size 0 bytes, aes.o(i.InvSubBytes)) +

    [Called By]

    • >>   InvCipher +
    + +

    KeyExpansion (Thumb, 324 bytes, Stack size 24 bytes, aes.o(i.KeyExpansion)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = KeyExpansion ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   getSBoxValue +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   encrypt +
    • >>   decrypt +
    + +

    MemManage_Handler (Thumb, 4 bytes, Stack size 0 bytes, gd32f30x_it.o(i.MemManage_Handler)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    MixColumns (Thumb, 222 bytes, Stack size 12 bytes, aes.o(i.MixColumns)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = MixColumns +
    +
    [Called By]
    • >>   Cipher +
    + +

    Msg_TickHandler (Thumb, 40 bytes, Stack size 0 bytes, fucntion_text_message.o(i.Msg_TickHandler)) +

    [Called By]

    • >>   update_2_timer +
    + +

    NMI_Handler (Thumb, 2 bytes, Stack size 0 bytes, gd32f30x_it.o(i.NMI_Handler)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    NRF24L01_Read_Buf (Thumb, 68 bytes, Stack size 280 bytes, rf24l01 - multi.o(i.NRF24L01_Read_Buf)) +

    [Stack]

    • Max Depth = 352
    • Call Chain = NRF24L01_Read_Buf ⇒ drv_spi_read_write_byte_N ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   drv_spi_read_write_byte_N +
    • >>   drv_spi_read_write_byte +
    +
    [Called By]
    • >>   NRF24L01_check +
    + +

    NRF24L01_check (Thumb, 76 bytes, Stack size 32 bytes, rf24l01 - multi.o(i.NRF24L01_check)) +

    [Stack]

    • Max Depth = 384
    • Call Chain = NRF24L01_check ⇒ NRF24L01_Read_Buf ⇒ drv_spi_read_write_byte_N ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   NRF24L01_Read_Buf +
    • >>   NRF24L01_Write_Buf +
    +
    [Called By]
    • >>   rf_initial +
    + +

    PendSV_Handler (Thumb, 2 bytes, Stack size 0 bytes, gd32f30x_it.o(i.PendSV_Handler)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    RandData (Thumb, 106 bytes, Stack size 24 bytes, function_network.o(i.RandData)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = RandData +
    +
    [Calls]
    • >>   timer_counter_read +
    • >>   srand +
    • >>   rand +
    +
    [Called By]
    • >>   network_randtime +
    + +

    SEGGER_RTT_Read (Thumb, 56 bytes, Stack size 24 bytes, segger_rtt.o(i.SEGGER_RTT_Read)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = SEGGER_RTT_Read ⇒ SEGGER_RTT_ReadNoLock ⇒ _DoInit +
    +
    [Calls]
    • >>   SEGGER_RTT_ReadNoLock +
    +
    [Called By]
    • >>   _debug_core__RTT_read +
    + +

    SEGGER_RTT_ReadNoLock (Thumb, 148 bytes, Stack size 48 bytes, segger_rtt.o(i.SEGGER_RTT_ReadNoLock)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = SEGGER_RTT_ReadNoLock ⇒ _DoInit +
    +
    [Calls]
    • >>   _DoInit +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   SEGGER_RTT_Read +
    + +

    SEGGER_RTT_Write (Thumb, 68 bytes, Stack size 24 bytes, segger_rtt.o(i.SEGGER_RTT_Write)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = SEGGER_RTT_Write ⇒ SEGGER_RTT_WriteNoLock ⇒ _WriteNoCheck ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   SEGGER_RTT_WriteNoLock +
    • >>   _DoInit +
    +
    [Called By]
    • >>   SEGGER_RTT_vprintf +
    • >>   _StoreChar +
    + +

    SEGGER_RTT_WriteNoLock (Thumb, 126 bytes, Stack size 32 bytes, segger_rtt.o(i.SEGGER_RTT_WriteNoLock)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = SEGGER_RTT_WriteNoLock ⇒ _WriteNoCheck ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   _WriteNoCheck +
    • >>   _WriteBlocking +
    • >>   _GetAvailWriteSpace +
    +
    [Called By]
    • >>   SEGGER_RTT_Write +
    + +

    SEGGER_RTT_printf (Thumb, 34 bytes, Stack size 32 bytes, segger_rtt_printf.o(i.SEGGER_RTT_printf)) +

    [Stack]

    • Max Depth = 376
    • Call Chain = SEGGER_RTT_printf ⇒ SEGGER_RTT_vprintf ⇒ _PrintInt ⇒ _PrintUnsigned ⇒ _StoreChar ⇒ SEGGER_RTT_Write ⇒ SEGGER_RTT_WriteNoLock ⇒ _WriteNoCheck ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   SEGGER_RTT_vprintf +
    +
    [Called By]
    • >>   _debug_core__printf +
    • >>   _debug_core__RTT_read +
    + +

    SEGGER_RTT_vprintf (Thumb, 522 bytes, Stack size 136 bytes, segger_rtt_printf.o(i.SEGGER_RTT_vprintf)) +

    [Stack]

    • Max Depth = 344
    • Call Chain = SEGGER_RTT_vprintf ⇒ _PrintInt ⇒ _PrintUnsigned ⇒ _StoreChar ⇒ SEGGER_RTT_Write ⇒ SEGGER_RTT_WriteNoLock ⇒ _WriteNoCheck ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   _StoreChar +
    • >>   _PrintUnsigned +
    • >>   _PrintInt +
    • >>   SEGGER_RTT_Write +
    +
    [Called By]
    • >>   SEGGER_RTT_printf +
    + +

    SEI (Thumb, 4 bytes, Stack size 0 bytes, platform.o(i.SEI)) +

    [Called By]

    • >>   rf_setfreq +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    SET_SDA_IN (Thumb, 42 bytes, Stack size 32 bytes, i2c.o(i.SET_SDA_IN)) +

    [Stack]

    • Max Depth = 68
    • Call Chain = SET_SDA_IN ⇒ HW_GD_GPIO_Init ⇒ gpio_init +
    +
    [Calls]
    • >>   HW_GD_GPIO_Init +
    • >>   __aeabi_memclr4 +
    +
    [Called By]
    • >>   i2c_send_byte +
    • >>   i2c_read_byte +
    + +

    SET_SDA_OUT (Thumb, 42 bytes, Stack size 32 bytes, i2c.o(i.SET_SDA_OUT)) +

    [Stack]

    • Max Depth = 68
    • Call Chain = SET_SDA_OUT ⇒ HW_GD_GPIO_Init ⇒ gpio_init +
    +
    [Calls]
    • >>   HW_GD_GPIO_Init +
    • >>   __aeabi_memclr4 +
    +
    [Called By]
    • >>   i2c_send_byte +
    • >>   i2c_read_byte +
    + +

    STM32_AES_ECB_Decrypt (Thumb, 116 bytes, Stack size 320 bytes, aes.o(i.STM32_AES_ECB_Decrypt)) +

    [Stack]

    • Max Depth = 404
    • Call Chain = STM32_AES_ECB_Decrypt ⇒ AES_ECB_Decrypt_Append ⇒ AES_general_SW_dec +
    +
    [Calls]
    • >>   AES_ECB_Decrypt_Init +
    • >>   AES_ECB_Decrypt_Finish +
    • >>   AES_ECB_Decrypt_Append +
    +
    [Called By]
    • >>   Decrypt +
    + +

    STM32_AES_ECB_Encrypt (Thumb, 116 bytes, Stack size 320 bytes, aes.o(i.STM32_AES_ECB_Encrypt)) +

    [Stack]

    • Max Depth = 404
    • Call Chain = STM32_AES_ECB_Encrypt ⇒ AES_ECB_Encrypt_Append ⇒ AES_general_SW_enc +
    +
    [Calls]
    • >>   AES_ECB_Encrypt_Init +
    • >>   AES_ECB_Encrypt_Finish +
    • >>   AES_ECB_Encrypt_Append +
    +
    [Called By]
    • >>   Encrypt +
    + +

    SVC_Handler (Thumb, 2 bytes, Stack size 0 bytes, gd32f30x_it.o(i.SVC_Handler)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    ShiftRows (Thumb, 64 bytes, Stack size 0 bytes, aes.o(i.ShiftRows)) +

    [Called By]

    • >>   Cipher +
    + +

    SubBytes (Thumb, 42 bytes, Stack size 0 bytes, aes.o(i.SubBytes)) +

    [Called By]

    • >>   Cipher +
    + +

    SysTick_Handler (Thumb, 8 bytes, Stack size 8 bytes, gd32f30x_it.o(i.SysTick_Handler)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = SysTick_Handler +
    +
    [Calls]
    • >>   HW_GD_IncTick +
    +
    [Address Reference Count : 1]
    • startup_gd32f30x_hd.o(RESET) +
    +

    SystemInit (Thumb, 100 bytes, Stack size 8 bytes, system_gd32f30x.o(i.SystemInit)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = SystemInit ⇒ system_clock_config +
    +
    [Calls]
    • >>   system_clock_config +
    +
    [Address Reference Count : 1]
    • startup_gd32f30x_hd.o(.text) +
    +

    TIMER1_IRQHandler (Thumb, 32 bytes, Stack size 8 bytes, gd32f30x_it.o(i.TIMER1_IRQHandler)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = TIMER1_IRQHandler ⇒ user_2ms5_timer ⇒ base_broadcast_process_2ms5 ⇒ base_broadcast_sub ⇒ crc16 +
    +
    [Calls]
    • >>   user_2ms5_timer +
    • >>   timer_interrupt_flag_get +
    • >>   timer_interrupt_flag_clear +
    +
    [Address Reference Count : 1]
    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER1_Init (Thumb, 130 bytes, Stack size 24 bytes, main.o(i.TIMER1_Init)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = TIMER1_Init ⇒ nvic_irq_enable +
    +
    [Calls]
    • >>   timer_prescaler_config +
    • >>   timer_interrupt_flag_clear +
    • >>   timer_interrupt_enable +
    • >>   timer_interrupt_disable +
    • >>   timer_init +
    • >>   timer_enable +
    • >>   timer_counter_value_config +
    • >>   timer_autoreload_value_config +
    • >>   nvic_irq_enable +
    +
    [Called By]
    • >>   main +
    + +

    TIMER2_IRQHandler (Thumb, 32 bytes, Stack size 8 bytes, gd32f30x_it.o(i.TIMER2_IRQHandler)) +

    [Stack]

    • Max Depth = 144
    • Call Chain = TIMER2_IRQHandler ⇒ user_20ms_timer ⇒ update_2_timer ⇒ Upgrade_TickHandler ⇒ Upgrade_BeaconQuery ⇒ Upgrade_CRC ⇒ crc16 +
    +
    [Calls]
    • >>   user_20ms_timer +
    • >>   timer_interrupt_flag_get +
    • >>   timer_interrupt_flag_clear +
    +
    [Address Reference Count : 1]
    • startup_gd32f30x_hd.o(RESET) +
    +

    TIMER2_Init (Thumb, 126 bytes, Stack size 24 bytes, main.o(i.TIMER2_Init)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = TIMER2_Init ⇒ nvic_irq_enable +
    +
    [Calls]
    • >>   timer_prescaler_config +
    • >>   timer_interrupt_flag_clear +
    • >>   timer_interrupt_enable +
    • >>   timer_interrupt_disable +
    • >>   timer_init +
    • >>   timer_enable +
    • >>   timer_counter_value_config +
    • >>   timer_autoreload_value_config +
    • >>   nvic_irq_enable +
    +
    [Called By]
    • >>   main +
    + +

    TIMER3_IRQHandler (Thumb, 22 bytes, Stack size 8 bytes, gd32f30x_it.o(i.TIMER3_IRQHandler)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = TIMER3_IRQHandler +
    +
    [Calls]
    • >>   timer_interrupt_flag_get +
    • >>   timer_interrupt_flag_clear +
    +
    [Address Reference Count : 1]
    • startup_gd32f30x_hd.o(RESET) +
    +

    USBD_LP_CAN0_RX0_IRQHandler (Thumb, 8 bytes, Stack size 8 bytes, gd32f30x_it.o(i.USBD_LP_CAN0_RX0_IRQHandler)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = USBD_LP_CAN0_RX0_IRQHandler ⇒ usbd_isr ⇒ usbd_ep_send +
    +
    [Calls]
    • >>   usbd_isr +
    +
    [Address Reference Count : 1]
    • startup_gd32f30x_hd.o(RESET) +
    +

    Upgrade_BeaconQuery (Thumb, 190 bytes, Stack size 72 bytes, transparentupgrade.o(i.Upgrade_BeaconQuery)) +

    [Stack]

    • Max Depth = 104
    • Call Chain = Upgrade_BeaconQuery ⇒ Upgrade_CRC ⇒ crc16 +
    +
    [Calls]
    • >>   Upgrade_WaitRfSendOK +
    • >>   Upgrade_TxPayload +
    • >>   Upgrade_DelayUs +
    • >>   Upgrade_CRC +
    • >>   __aeabi_memclr4 +
    • >>   __aeabi_memclr +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   Upgrade_TickHandler +
    + +

    Upgrade_CRC (Thumb, 22 bytes, Stack size 16 bytes, transparentupgrade.o(i.Upgrade_CRC)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = Upgrade_CRC ⇒ crc16 +
    +
    [Calls]
    • >>   crc16 +
    +
    [Called By]
    • >>   Upgrade_TickHandler +
    • >>   Upgrade_SendBeacon +
    • >>   Upgrade_RfSendCallBack +
    • >>   Upgrade_BeaconQuery +
    + +

    Upgrade_CheckNextPackArrive (Thumb, 34 bytes, Stack size 8 bytes, transparentupgrade.o(i.Upgrade_CheckNextPackArrive)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = Upgrade_CheckNextPackArrive ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   Upgrade_TickHandler +
    + +

    Upgrade_ClrBit (Thumb, 40 bytes, Stack size 12 bytes, transparentupgrade.o(i.Upgrade_ClrBit)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = Upgrade_ClrBit +
    +
    [Called By]
    • >>   Upgrade_TickHandler +
    + +

    Upgrade_DelayUs (Thumb, 12 bytes, Stack size 8 bytes, transparentupgrade.o(i.Upgrade_DelayUs)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = Upgrade_DelayUs +
    +
    [Calls]
    • >>   basic_delay_us_update +
    +
    [Called By]
    • >>   Upgrade_WaitRfSendOK +
    • >>   Upgrade_TickHandler +
    • >>   Upgrade_SendPassThroughPack +
    • >>   Upgrade_SendBeacon +
    • >>   Upgrade_BeaconQuery +
    + +

    Upgrade_GetBit (Thumb, 48 bytes, Stack size 12 bytes, transparentupgrade.o(i.Upgrade_GetBit)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = Upgrade_GetBit +
    +
    [Called By]
    • >>   Upgrade_TickHandler +
    + +

    Upgrade_ParameterInit (Thumb, 46 bytes, Stack size 16 bytes, transparentupgrade.o(i.Upgrade_ParameterInit)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = Upgrade_ParameterInit +
    +
    [Calls]
    • >>   log_debug +
    +
    [Called By]
    • >>   update_kp_enter +
    + +

    Upgrade_PassThrough_CheckHead (Thumb, 134 bytes, Stack size 0 bytes, transparentupgrade.o(i.Upgrade_PassThrough_CheckHead)) +

    [Called By]

    • >>   Upgrade_RfSendCallBack +
    + +

    Upgrade_RfSendCallBack (Thumb, 214 bytes, Stack size 56 bytes, transparentupgrade.o(i.Upgrade_RfSendCallBack)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = Upgrade_RfSendCallBack ⇒ Upgrade_CRC ⇒ crc16 +
    +
    [Calls]
    • >>   log_debug +
    • >>   Upgrade_PassThrough_CheckHead +
    • >>   Upgrade_CRC +
    • >>   __aeabi_memclr4 +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   save_keypad_ack_data +
    + +

    Upgrade_SendBeacon (Thumb, 226 bytes, Stack size 56 bytes, transparentupgrade.o(i.Upgrade_SendBeacon)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = Upgrade_SendBeacon ⇒ Upgrade_CRC ⇒ crc16 +
    +
    [Calls]
    • >>   Upgrade_WaitRfSendOK +
    • >>   Upgrade_TxPayload +
    • >>   Upgrade_DelayUs +
    • >>   Upgrade_CRC +
    • >>   __aeabi_memclr4 +
    +
    [Called By]
    • >>   Upgrade_TickHandler +
    + +

    Upgrade_SendPassThroughPack (Thumb, 224 bytes, Stack size 48 bytes, transparentupgrade.o(i.Upgrade_SendPassThroughPack)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = Upgrade_SendPassThroughPack ⇒ Upgrade_WaitRfSendOK ⇒ Upgrade_DelayUs +
    +
    [Calls]
    • >>   Upgrade_WaitRfSendOK +
    • >>   Upgrade_TxPayload +
    • >>   Upgrade_DelayUs +
    • >>   __aeabi_memclr4 +
    +
    [Called By]
    • >>   Upgrade_TickHandler +
    + +

    Upgrade_Start (Thumb, 36 bytes, Stack size 8 bytes, transparentupgrade.o(i.Upgrade_Start)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = Upgrade_Start +
    +
    [Called By]
    • >>   update_kp_enter +
    + +

    Upgrade_StartGetNextPack (Thumb, 24 bytes, Stack size 16 bytes, transparentupgrade.o(i.Upgrade_StartGetNextPack)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = Upgrade_StartGetNextPack ⇒ update_request_pkt_to_pc +
    +
    [Calls]
    • >>   update_request_pkt_to_pc +
    +
    [Called By]
    • >>   Upgrade_TickHandler +
    + +

    Upgrade_TickHandler (Thumb, 702 bytes, Stack size 16 bytes, transparentupgrade.o(i.Upgrade_TickHandler)) +

    [Stack]

    • Max Depth = 120
    • Call Chain = Upgrade_TickHandler ⇒ Upgrade_BeaconQuery ⇒ Upgrade_CRC ⇒ crc16 +
    +
    [Calls]
    • >>   updat__exit +
    • >>   log_debug +
    • >>   Upgrade_StartGetNextPack +
    • >>   Upgrade_SendPassThroughPack +
    • >>   Upgrade_SendBeacon +
    • >>   Upgrade_GetBit +
    • >>   Upgrade_DelayUs +
    • >>   Upgrade_ClrBit +
    • >>   Upgrade_CheckNextPackArrive +
    • >>   Upgrade_CRC +
    • >>   Upgrade_BeaconQuery +
    • >>   __aeabi_memclr +
    • >>   __aeabi_memset +
    +
    [Called By]
    • >>   update_2_timer +
    + +

    Upgrade_TxPayload (Thumb, 36 bytes, Stack size 16 bytes, transparentupgrade.o(i.Upgrade_TxPayload)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = Upgrade_TxPayload +
    +
    [Calls]
    • >>   set_tx_ok_flag +
    +
    [Called By]
    • >>   Upgrade_SendPassThroughPack +
    • >>   Upgrade_SendBeacon +
    • >>   Upgrade_BeaconQuery +
    + +

    Upgrade_WaitRfSendOK (Thumb, 34 bytes, Stack size 8 bytes, transparentupgrade.o(i.Upgrade_WaitRfSendOK)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = Upgrade_WaitRfSendOK ⇒ Upgrade_DelayUs +
    +
    [Calls]
    • >>   get_tx_ok_flag +
    • >>   Upgrade_DelayUs +
    +
    [Called By]
    • >>   Upgrade_SendPassThroughPack +
    • >>   Upgrade_SendBeacon +
    • >>   Upgrade_BeaconQuery +
    + +

    UsageFault_Handler (Thumb, 4 bytes, Stack size 0 bytes, gd32f30x_it.o(i.UsageFault_Handler)) +
    [Address Reference Count : 1]

    • startup_gd32f30x_hd.o(RESET) +
    +

    _0x60_basic_delay_ms (Thumb, 32 bytes, Stack size 0 bytes, base_process_pc_cmd_0x60.o(i._0x60_basic_delay_ms)) +

    [Called By]

    • >>   pc_cmd_0x60_process +
    + +

    _0x61_soft_dog_sub (Thumb, 358 bytes, Stack size 72 bytes, base_process_pc_cmd_0x61.o(i._0x61_soft_dog_sub)) +

    [Stack]

    • Max Depth = 352
    • Call Chain = _0x61_soft_dog_sub ⇒ base_read_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_compare +
    • >>   calc_custom_rf_sync_code +
    • >>   base_read_e2prom +
    • >>   pc_cmd_0x61_ack +
    • >>   mem_cpy +
    • >>   base_write_e2prom +
    • >>   get_main_rf_hard_id +
    +
    [Called By]
    • >>   pc_cmd_0x61_process +
    + +

    __scatterload_copy (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_copy), UNUSED) + +

    __scatterload_null (Thumb, 2 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_null), UNUSED) + +

    __scatterload_zeroinit (Thumb, 14 bytes, Stack size unknown bytes, handlers.o(i.__scatterload_zeroinit), UNUSED) + +

    _debug_core__RTT_read (Thumb, 66 bytes, Stack size 24 bytes, base_core.o(i._debug_core__RTT_read)) +

    [Stack]

    • Max Depth = 424
    • Call Chain = _debug_core__RTT_read ⇒ _debug_core__printf ⇒ SEGGER_RTT_printf ⇒ SEGGER_RTT_vprintf ⇒ _PrintInt ⇒ _PrintUnsigned ⇒ _StoreChar ⇒ SEGGER_RTT_Write ⇒ SEGGER_RTT_WriteNoLock ⇒ _WriteNoCheck ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   SEGGER_RTT_printf +
    • >>   SEGGER_RTT_Read +
    • >>   _debug_core__printf +
    +
    [Called By]
    • >>   base_core_main_loop +
    + +

    _debug_core__init (Thumb, 2 bytes, Stack size 0 bytes, base_core.o(i._debug_core__init)) +

    [Called By]

    • >>   base_core_init_all +
    + +

    _debug_core__init_parameter_datapos_change (Thumb, 102 bytes, Stack size 8 bytes, base_core.o(i._debug_core__init_parameter_datapos_change)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = _debug_core__init_parameter_datapos_change +
    +
    [Calls]
    • >>   __aeabi_memclr +
    +
    [Called By]
    • >>   pc_cmd_0x60_process +
    + +

    _debug_core__printf (Thumb, 166 bytes, Stack size 24 bytes, base_core.o(i._debug_core__printf)) +

    [Stack]

    • Max Depth = 400
    • Call Chain = _debug_core__printf ⇒ SEGGER_RTT_printf ⇒ SEGGER_RTT_vprintf ⇒ _PrintInt ⇒ _PrintUnsigned ⇒ _StoreChar ⇒ SEGGER_RTT_Write ⇒ SEGGER_RTT_WriteNoLock ⇒ _WriteNoCheck ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   SEGGER_RTT_printf +
    • >>   debug_check_allerr +
    • >>   basic_delay_us +
    +
    [Called By]
    • >>   _debug_core__RTT_read +
    + +

    _debug_core__record_ackkp_info (Thumb, 38 bytes, Stack size 8 bytes, base_core.o(i._debug_core__record_ackkp_info)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = _debug_core__record_ackkp_info +
    +
    [Called By]
    • >>   base_confirm_keypad_crs2_mode +
    + +

    _debug_core__record_pcack_info (Thumb, 2 bytes, Stack size 0 bytes, base_core.o(i._debug_core__record_pcack_info)) +

    [Called By]

    • >>   vote_status_clear_confirmed +
    + +

    _debug_core__record_rxkp_info (Thumb, 64 bytes, Stack size 8 bytes, base_core.o(i._debug_core__record_rxkp_info)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = _debug_core__record_rxkp_info ⇒ debug_set_buf_bit +
    +
    [Calls]
    • >>   debug_set_buf_bit +
    +
    [Called By]
    • >>   keypad_sn_mode +
    • >>   keypad_id_mode +
    • >>   keypad_crs2_mode +
    + +

    _debug_core__record_txpc_info (Thumb, 2 bytes, Stack size 0 bytes, base_core.o(i._debug_core__record_txpc_info)) +

    [Called By]

    • >>   vote_data_packing +
    + +

    _debug_core__record_txpc_info_report (Thumb, 2 bytes, Stack size 0 bytes, base_core.o(i._debug_core__record_txpc_info_report)) +

    [Called By]

    • >>   vote_data_packing +
    + +

    _debug_function_enter (Thumb, 44 bytes, Stack size 80 bytes, function_debug.o(i._debug_function_enter)) +

    [Stack]

    • Max Depth = 168
    • Call Chain = _debug_function_enter ⇒ _dbg_function__response_pc_cmd ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   _dbg_function__response_pc_cmd +
    • >>   __aeabi_memset +
    • >>   __aeabi_memcpy +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    _debug_set_subject (Thumb, 18 bytes, Stack size 0 bytes, base_core.o(i._debug_set_subject)) +

    [Called By]

    • >>   pc_cmd_0x60_process +
    + +

    _usb_in0_transc (Thumb, 82 bytes, Stack size 16 bytes, usbd_transc.o(i._usb_in0_transc)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = _usb_in0_transc ⇒ usb_ctl_out +
    +
    [Calls]
    • >>   usb_ctl_out +
    +
    [Address Reference Count : 1]
    • usbd_core.o(i.usbd_init) +
    +

    _usb_out0_transc (Thumb, 68 bytes, Stack size 24 bytes, usbd_transc.o(i._usb_out0_transc)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = _usb_out0_transc ⇒ usb_ctl_status_in +
    +
    [Calls]
    • >>   usb_ctl_status_in +
    +
    [Address Reference Count : 1]
    • usbd_core.o(i.usbd_init) +
    +

    _usb_setup_transc (Thumb, 168 bytes, Stack size 24 bytes, usbd_transc.o(i._usb_setup_transc)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = _usb_setup_transc ⇒ usbd_ep_send +
    +
    [Calls]
    • >>   usb_stall_transc +
    • >>   usb_ctl_status_in +
    • >>   usb_ctl_out +
    • >>   usbd_vendor_request +
    • >>   usbd_standard_request +
    • >>   usbd_class_request +
    • >>   usbd_ep_send +
    +
    [Address Reference Count : 1]
    • usbd_core.o(i.usbd_init) +
    +

    aes_init (Thumb, 44 bytes, Stack size 8 bytes, function_aes.o(i.aes_init)) +

    [Stack]

    • Max Depth = 564
    • Call Chain = aes_init ⇒ aes_test ⇒ rf_Decrypt ⇒ Decrypt ⇒ STM32_AES_ECB_Decrypt ⇒ AES_ECB_Decrypt_Append ⇒ AES_general_SW_dec +
    +
    [Calls]
    • >>   read_keycode +
    • >>   read_AES_config +
    • >>   generate_default_key0_code +
    • >>   aes_test +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    aes_keycode_upgrade (Thumb, 76 bytes, Stack size 16 bytes, function_aes.o(i.aes_keycode_upgrade)) +

    [Stack]

    • Max Depth = 500
    • Call Chain = aes_keycode_upgrade ⇒ write_keycode ⇒ Encrypt ⇒ STM32_AES_ECB_Encrypt ⇒ AES_ECB_Encrypt_Append ⇒ AES_general_SW_enc +
    +
    [Calls]
    • >>   timer_counter_read +
    • >>   write_keycode +
    • >>   srand +
    • >>   rand +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    aes_load_fastmatch_data (Thumb, 92 bytes, Stack size 8 bytes, function_aes.o(i.aes_load_fastmatch_data)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = aes_load_fastmatch_data ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memcpy +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    ant_sw (Thumb, 42 bytes, Stack size 8 bytes, platform.o(i.ant_sw)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = ant_sw +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    assert_base_channel (Thumb, 104 bytes, Stack size 0 bytes, base_process_tx_keypad.o(i.assert_base_channel)) +

    [Called By]

    • >>   pc_cmd_0x61_process +
    • >>   base_read_e2prom_parameter +
    + +

    assert_base_id (Thumb, 30 bytes, Stack size 0 bytes, base_process_pc_enter.o(i.assert_base_id)) +

    [Called By]

    • >>   pc_cmd_0x61_process +
    • >>   base_read_e2prom_parameter +
    + +

    assert_base_log_mode (Thumb, 70 bytes, Stack size 0 bytes, base_process_pc_enter.o(i.assert_base_log_mode)) +

    [Called By]

    • >>   _0x61_AUX_CONFIG_sub +
    • >>   base_read_e2prom_parameter +
    + +

    auth_all_keypad (Thumb, 34 bytes, Stack size 0 bytes, function_whitelist.o(i.auth_all_keypad)) +

    [Called By]

    • >>   whitelist__2ms5_call +
    • >>   whitelist_write_1zone +
    + +

    auth_special_keypad (Thumb, 42 bytes, Stack size 0 bytes, function_whitelist.o(i.auth_special_keypad)) +

    [Called By]

    • >>   whitelist_delete +
    + +

    auto_search_freq_enter (Thumb, 28 bytes, Stack size 8 bytes, function_monitor_freq.o(i.auto_search_freq_enter)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = auto_search_freq_enter +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    base_broadcast_process_2ms5 (Thumb, 106 bytes, Stack size 8 bytes, function_broadcast.o(i.base_broadcast_process_2ms5)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = base_broadcast_process_2ms5 ⇒ base_broadcast_sub ⇒ crc16 +
    +
    [Calls]
    • >>   base_broadcast_sub +
    +
    [Called By]
    • >>   user_2ms5_timer +
    + +

    base_confirm_keypad_whitelist_request (Thumb, 90 bytes, Stack size 48 bytes, function_whitelist.o(i.base_confirm_keypad_whitelist_request)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = base_confirm_keypad_whitelist_request +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    base_core_20ms_isr (Thumb, 108 bytes, Stack size 8 bytes, base_timer.o(i.base_core_20ms_isr)) +

    [Stack]

    • Max Depth = 100
    • Call Chain = base_core_20ms_isr ⇒ rf_error_warning ⇒ rf_error_ack_pc ⇒ get_error_info +
    +
    [Calls]
    • >>   timer_20ms_function +
    • >>   rf_error_warning +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    base_core_28ms_isr (Thumb, 2 bytes, Stack size 0 bytes, base_timer.o(i.base_core_28ms_isr)) +
    [Address Reference Count : 1]

    • base_core.o(.data) +
    +

    base_core_2ms5_isr (Thumb, 12 bytes, Stack size 8 bytes, base_timer.o(i.base_core_2ms5_isr)) +

    [Stack]

    • Max Depth = 240
    • Call Chain = base_core_2ms5_isr ⇒ vote_data_report_interval ⇒ vote_data_report_to_pc ⇒ vote_data_packing ⇒ base_tx_to_pc_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   vote_data_report_interval +
    • >>   base_tx_keypad_beacon +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    base_core_force_sysmode0 (Thumb, 30 bytes, Stack size 8 bytes, base_core.o(i.base_core_force_sysmode0)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = base_core_force_sysmode0 ⇒ mem_set +
    +
    [Calls]
    • >>   mem_set +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    base_core_init_all (Thumb, 28 bytes, Stack size 8 bytes, base_core.o(i.base_core_init_all)) +

    [Stack]

    • Max Depth = 552
    • Call Chain = base_core_init_all ⇒ base_read_e2prom_parameter ⇒ base_read_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   vote_data_parameter_init +
    • >>   multi_chan_init +
    • >>   base_read_e2prom_parameter +
    • >>   base_process_pc_init +
    • >>   base_process_keyapad_init +
    • >>   _debug_core__init +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    base_core_main_loop (Thumb, 34 bytes, Stack size 8 bytes, base_core.o(i.base_core_main_loop)) +

    [Stack]

    • Max Depth = 488
    • Call Chain = base_core_main_loop ⇒ base_process_pc_data ⇒ pc_cmd_0x61_process ⇒ _0x61_AUX_CONFIG_sub ⇒ process_setup_multi_chan ⇒ base_write_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   keypad_transfer2pc_data_fetch +
    • >>   base_process_pc_data +
    • >>   _debug_core__RTT_read +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    base_is_auto_match (Thumb, 30 bytes, Stack size 8 bytes, function_aes.o(i.base_is_auto_match)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = base_is_auto_match +
    +
    [Called By]
    • >>   rf_Encrypt +
    • >>   rf_Decrypt +
    + +

    base_process_keyapad_init (Thumb, 22 bytes, Stack size 8 bytes, base_process_rx_keypad.o(i.base_process_keyapad_init)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = base_process_keyapad_init ⇒ keypad_idsn_clear ⇒ mem_set +
    +
    [Calls]
    • >>   base_send_beacon_switch +
    • >>   transfer2kp_init_queue +
    • >>   keypad_idsn_clear +
    • >>   kprx_init_queue +
    +
    [Called By]
    • >>   base_core_init_all +
    + +

    base_process_pc_data (Thumb, 98 bytes, Stack size 72 bytes, base_process_pc_enter.o(i.base_process_pc_data)) +

    [Stack]

    • Max Depth = 480
    • Call Chain = base_process_pc_data ⇒ pc_cmd_0x61_process ⇒ _0x61_AUX_CONFIG_sub ⇒ process_setup_multi_chan ⇒ base_write_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   pc_cmd_0x61_process +
    • >>   pc_cmd_0x60_process +
    • >>   get_base_id +
    • >>   refresh_pc_connect_status +
    • >>   pc_transfer2keypad_data_save +
    • >>   pcrx_data_fetch +
    +
    [Called By]
    • >>   base_core_main_loop +
    + +

    base_process_pc_init (Thumb, 12 bytes, Stack size 8 bytes, base_process_pc_enter.o(i.base_process_pc_init)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = base_process_pc_init ⇒ transfer2pc_init_queue ⇒ queue_init +
    +
    [Calls]
    • >>   transfer2pc_init_queue +
    • >>   pcrx_init_queue +
    +
    [Called By]
    • >>   base_core_init_all +
    + +

    base_read_e2prom (Thumb, 54 bytes, Stack size 272 bytes, function_e2prom.o(i.base_read_e2prom)) +

    [Stack]

    • Max Depth = 280
    • Call Chain = base_read_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    +
    [Called By]
    • >>   _0x61_soft_dog_sub +
    • >>   base_read_e2prom_parameter +
    + +

    base_read_e2prom_parameter (Thumb, 736 bytes, Stack size 264 bytes, function_e2prom.o(i.base_read_e2prom_parameter)) +

    [Stack]

    • Max Depth = 544
    • Call Chain = base_read_e2prom_parameter ⇒ base_read_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   calc_custom_rf_sync_code +
    • >>   base_read_e2prom +
    • >>   assert_base_log_mode +
    • >>   assert_base_id +
    • >>   assert_base_channel +
    • >>   mem_cpy +
    • >>   base_write_e2prom +
    • >>   mem_set +
    • >>   set_base_hard_firmware_info +
    • >>   single_relevant_to_multi_chan +
    +
    [Called By]
    • >>   base_core_init_all +
    + +

    base_send_beacon_switch (Thumb, 6 bytes, Stack size 0 bytes, base_process_tx_keypad.o(i.base_send_beacon_switch)) +

    [Called By]

    • >>   msg_polling +
    • >>   base_process_keyapad_init +
    • >>   base_tx_keypad_beacon +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    base_tx_keypad_beacon (Thumb, 454 bytes, Stack size 8 bytes, base_process_tx_keypad.o(i.base_tx_keypad_beacon)) +

    [Stack]

    • Max Depth = 208
    • Call Chain = base_tx_keypad_beacon ⇒ base_tx_vote_beacon ⇒ check_send_ext_vbeacon ⇒ base_tx_ext_vbeacon ⇒ base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   get_base_log_mode +
    • >>   base_send_beacon_switch +
    • >>   pc_transfer2keypad_data_fetch +
    • >>   multi_chan_polling +
    • >>   msg_recover_beacon_countdown +
    • >>   msg_issendtime +
    • >>   base_tx_vote_beacon +
    • >>   base_tx_basic_beacon +
    • >>   base_confirm_keypad_sn_mode +
    • >>   base_confirm_keypad_id_mode +
    • >>   base_confirm_keypad_crs2_mode +
    +
    [Called By]
    • >>   base_core_2ms5_isr +
    + +

    base_tx_to_keypad_sub (Thumb, 96 bytes, Stack size 80 bytes, base_process_tx_keypad.o(i.base_tx_to_keypad_sub)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   rf_modual__tx_counter +
    +
    [Called By]
    • >>   pc_transfer2keypad_data_fetch +
    • >>   base_tx_vote_beacon +
    • >>   base_tx_ext_vbeacon +
    • >>   base_tx_ext_basic_beacon +
    • >>   base_tx_basic_beacon +
    • >>   base_confirm_keypad_sn_mode +
    • >>   base_confirm_keypad_id_mode +
    • >>   base_confirm_keypad_crs2_mode +
    + +

    base_tx_to_pc_sub (Thumb, 80 bytes, Stack size 72 bytes, base_process_pc_enter.o(i.base_tx_to_pc_sub)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = base_tx_to_pc_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   mem_set +
    +
    [Called By]
    • >>   pc_cmd_0x61_ack +
    • >>   pc_cmd_0x60_ack +
    • >>   keypad_transfer2pc_data_fetch +
    • >>   vote_data_packing +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    base_write_e2prom (Thumb, 48 bytes, Stack size 272 bytes, function_e2prom.o(i.base_write_e2prom)) +

    [Stack]

    • Max Depth = 280
    • Call Chain = base_write_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    +
    [Called By]
    • >>   set_keypad_crc_config +
    • >>   process_setup_multi_chan +
    • >>   pc_cmd_0x61_process +
    • >>   _0x61_soft_dog_sub +
    • >>   _0x61_AUX_CONFIG_sub +
    • >>   pc_cmd_0x60_process +
    • >>   process_setup_single_chan +
    • >>   base_read_e2prom_parameter +
    + +

    basetest_get_status (Thumb, 14 bytes, Stack size 0 bytes, fucntion_base_test.o(i.basetest_get_status)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    basetest_init (Thumb, 16 bytes, Stack size 0 bytes, fucntion_base_test.o(i.basetest_init)) +

    [Called By]

    • >>   basetest_progress +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    basetest_progress (Thumb, 226 bytes, Stack size 120 bytes, fucntion_base_test.o(i.basetest_progress)) +

    [Stack]

    • Max Depth = 120
    • Call Chain = basetest_progress +
    +
    [Calls]
    • >>   basetest_init +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    basetest_rx_and_ack_pc (Thumb, 72 bytes, Stack size 0 bytes, fucntion_base_test.o(i.basetest_rx_and_ack_pc)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    basic_delay_ms (Thumb, 32 bytes, Stack size 0 bytes, platform.o(i.basic_delay_ms)) +

    [Called By]

    • >>   EE_WriteBytes +
    + +

    basic_delay_us (Thumb, 30 bytes, Stack size 0 bytes, platform.o(i.basic_delay_us)) +

    [Called By]

    • >>   _debug_core__printf +
    • >>   msg_delay_us +
    + +

    basic_delay_us_update (Thumb, 26 bytes, Stack size 0 bytes, transparentupgrade.o(i.basic_delay_us_update)) +

    [Called By]

    • >>   updat__exit +
    • >>   Upgrade_DelayUs +
    + +

    beep_ctrl (Thumb, 18 bytes, Stack size 8 bytes, buzzer.o(i.beep_ctrl)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = beep_ctrl +
    +
    [Calls]
    • >>   Beep +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    broadcast_config (Thumb, 254 bytes, Stack size 40 bytes, function_broadcast.o(i.broadcast_config)) +

    [Stack]

    • Max Depth = 104
    • Call Chain = broadcast_config ⇒ user__pc_cmd_ack ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   user__pc_cmd_ack +
    • >>   __aeabi_memcpy +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    calc_custom_rf_sync_code (Thumb, 50 bytes, Stack size 8 bytes, function_e2prom.o(i.calc_custom_rf_sync_code)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = calc_custom_rf_sync_code +
    +
    [Called By]
    • >>   _0x61_soft_dog_sub +
    • >>   base_read_e2prom_parameter +
    + +

    check_fastmatch_lowerPA (Thumb, 20 bytes, Stack size 0 bytes, fucntion_fastmatch.o(i.check_fastmatch_lowerPA)) +

    [Called By]

    • >>   rf_set_PA_Mode +
    • >>   rf_SendPacket +
    + +

    conver_id (Thumb, 34 bytes, Stack size 0 bytes, multi_channel.o(i.conver_id)) +

    [Called By]

    • >>   keypad_rf_data_process_NO_fifo +
    + +

    core_debug_enter (Thumb, 2 bytes, Stack size 0 bytes, debug.o(i.core_debug_enter)) +

    [Called By]

    • >>   custom_hid_data_out +
    + +

    crc16 (Thumb, 78 bytes, Stack size 16 bytes, common_math.o(i.crc16)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = crc16 +
    +
    [Called By]
    • >>   pc_transfer2keypad_data_fetch +
    • >>   base_tx_vote_beacon +
    • >>   base_tx_basic_beacon +
    • >>   base_confirm_keypad_sn_mode +
    • >>   base_confirm_keypad_id_mode +
    • >>   base_confirm_keypad_crs2_mode +
    • >>   keypad_rf_data_process_NO_fifo +
    • >>   network_tx_beacon +
    • >>   base_broadcast_sub +
    • >>   rf_Encrypt +
    • >>   rf_Decrypt +
    • >>   msg_send +
    • >>   Upgrade_CRC +
    + +

    custom_hid_itfop_register (Thumb, 16 bytes, Stack size 0 bytes, custom_hid_core.o(i.custom_hid_itfop_register)) +

    [Called By]

    • >>   main +
    + +

    custom_hid_report_send (Thumb, 24 bytes, Stack size 16 bytes, custom_hid_core.o(i.custom_hid_report_send)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = custom_hid_report_send ⇒ usbd_ep_send +
    +
    [Calls]
    • >>   usbd_ep_send +
    +
    [Called By]
    • >>   EXTI10_15_IRQHandler +
    • >>   EXTI0_IRQHandler +
    • >>   HW_GD_CUSTOM_HID_REPORT_SEND +
    + +

    debug_check_allerr (Thumb, 92 bytes, Stack size 8 bytes, base_core.o(i.debug_check_allerr)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = debug_check_allerr +
    +
    [Called By]
    • >>   _debug_core__printf +
    + +

    debug_set_buf_bit (Thumb, 26 bytes, Stack size 12 bytes, base_core.o(i.debug_set_buf_bit)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = debug_set_buf_bit +
    +
    [Called By]
    • >>   _debug_core__record_rxkp_info +
    + +

    decrypt (Thumb, 114 bytes, Stack size 24 bytes, aes.o(i.decrypt)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = decrypt ⇒ InvCipher ⇒ InvMixColumns +
    +
    [Calls]
    • >>   KeyExpansion +
    • >>   InvCipher +
    • >>   __aeabi_memclr +
    • >>   __aeabi_memcpy +
    • >>   malloc +
    +
    [Called By]
    • >>   AES_Decrypt +
    + +

    det_blank_content (Thumb, 44 bytes, Stack size 8 bytes, function_broadcast.o(i.det_blank_content)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = det_blank_content +
    +
    [Called By]
    • >>   process_keypad_broadcast_requst +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    encrypt (Thumb, 112 bytes, Stack size 24 bytes, aes.o(i.encrypt)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = encrypt ⇒ KeyExpansion ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   KeyExpansion +
    • >>   Cipher +
    • >>   __aeabi_memclr +
    • >>   __aeabi_memcpy +
    • >>   malloc +
    +
    [Called By]
    • >>   AES_Encrypt +
    + +

    exti_interrupt_flag_clear (Thumb, 6 bytes, Stack size 0 bytes, gd32f30x_exti.o(i.exti_interrupt_flag_clear)) +

    [Called By]

    • >>   EXTI10_15_IRQHandler +
    • >>   EXTI0_IRQHandler +
    + +

    exti_interrupt_flag_get (Thumb, 32 bytes, Stack size 0 bytes, gd32f30x_exti.o(i.exti_interrupt_flag_get)) +

    [Called By]

    • >>   EXTI10_15_IRQHandler +
    • >>   EXTI0_IRQHandler +
    + +

    fastmatch_enter_exit (Thumb, 104 bytes, Stack size 16 bytes, fucntion_fastmatch.o(i.fastmatch_enter_exit)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = fastmatch_enter_exit +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    fastmatch_load_info_to_vote_beacon (Thumb, 166 bytes, Stack size 16 bytes, fucntion_fastmatch.o(i.fastmatch_load_info_to_vote_beacon)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = fastmatch_load_info_to_vote_beacon +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    fastmatch_lowerPA_ack (Thumb, 28 bytes, Stack size 8 bytes, fucntion_fastmatch.o(i.fastmatch_lowerPA_ack)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = fastmatch_lowerPA_ack ⇒ fastmatch_lowerPA_ack_sub ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   fastmatch_lowerPA_ack_sub +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    fastmatch_lowerPA_setup (Thumb, 8 bytes, Stack size 0 bytes, fucntion_fastmatch.o(i.fastmatch_lowerPA_setup)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    fastmatch_status (Thumb, 6 bytes, Stack size 0 bytes, fucntion_fastmatch.o(i.fastmatch_status)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    fastmatch_success_check (Thumb, 54 bytes, Stack size 0 bytes, fucntion_fastmatch.o(i.fastmatch_success_check)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    free (Thumb, 76 bytes, Stack size 8 bytes, malloc.o(i.free)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = free +
    +
    [Called By]
    • >>   AES_Encrypt +
    • >>   AES_Decrypt +
    + +

    getSBoxValue (Thumb, 8 bytes, Stack size 0 bytes, aes.o(i.getSBoxValue)) +

    [Called By]

    • >>   KeyExpansion +
    + +

    get_aes_key (Thumb, 16 bytes, Stack size 8 bytes, function_aes.o(i.get_aes_key)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = get_aes_key ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memcpy +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    get_aes_status (Thumb, 18 bytes, Stack size 0 bytes, function_aes.o(i.get_aes_status)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    get_base_id (Thumb, 6 bytes, Stack size 0 bytes, base_process_pc_enter.o(i.get_base_id)) +

    [Called By]

    • >>   pc_cmd_0x61_ack +
    • >>   pc_cmd_0x60_ack +
    • >>   base_process_pc_data +
    • >>   vote_data_packing +
    • >>   base_tx_ext_basic_beacon +
    • >>   base_tx_basic_beacon +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    get_base_log_mode (Thumb, 6 bytes, Stack size 0 bytes, base_process_pc_enter.o(i.get_base_log_mode)) +

    [Called By]

    • >>   base_tx_keypad_beacon +
    • >>   base_tx_vote_beacon +
    • >>   base_tx_basic_beacon +
    • >>   keypad_rf_data_process_NO_fifo +
    • >>   keypad_crs2_mode +
    • >>   network_tx_beacon +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    get_base_main_rfchannel (Thumb, 6 bytes, Stack size 0 bytes, multi_channel.o(i.get_base_main_rfchannel)) +

    [Called By]

    • >>   base_tx_vote_beacon +
    • >>   base_tx_ext_vbeacon +
    • >>   base_tx_basic_beacon +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    get_base_match_code (Thumb, 50 bytes, Stack size 8 bytes, base_process_pc_enter.o(i.get_base_match_code)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = get_base_match_code ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    +
    [Called By]
    • >>   pc_cmd_0x61_process +
    • >>   pc_transfer2keypad_data_fetch +
    • >>   base_tx_vote_beacon +
    • >>   base_tx_basic_beacon +
    • >>   base_confirm_keypad_sn_mode +
    • >>   base_confirm_keypad_id_mode +
    • >>   base_confirm_keypad_crs2_mode +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    get_base_send_beacon_status (Thumb, 6 bytes, Stack size 0 bytes, base_process_tx_keypad.o(i.get_base_send_beacon_status)) +
    [Address Reference Count : 1]

    • base_core.o(.data) +
    +

    get_base_status (Thumb, 96 bytes, Stack size 0 bytes, base_core.o(i.get_base_status)) +
    [Address Reference Count : 1]

    • base_core.o(.data) +
    +

    get_datapos (Thumb, 6 bytes, Stack size 0 bytes, base_core.o(i.get_datapos)) +
    [Address Reference Count : 1]

    • base_core.o(.data) +
    +

    get_ext_basicbeacon_startup_flag (Thumb, 6 bytes, Stack size 0 bytes, base_process_tx_keypad.o(i.get_ext_basicbeacon_startup_flag)) +

    [Called By]

    • >>   pc_transfer2keypad_data_fetch +
    • >>   check_send_ext_basic_beacon +
    • >>   base_tx_vote_beacon +
    • >>   base_tx_basic_beacon +
    + +

    get_mainRF_usr_id (Thumb, 4 bytes, Stack size 0 bytes, multi_channel.o(i.get_mainRF_usr_id)) +

    [Called By]

    • >>   pc_transfer2keypad_data_fetch +
    • >>   base_tx_ext_vbeacon +
    + +

    get_main_rf_hard_id (Thumb, 6 bytes, Stack size 0 bytes, multi_channel.o(i.get_main_rf_hard_id)) +

    [Called By]

    • >>   pc_cmd_0x61_process +
    • >>   _0x61_soft_dog_sub +
    • >>   multi_chan_init +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    get_packing_parameter (Thumb, 172 bytes, Stack size 20 bytes, vote__report.o(i.get_packing_parameter)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = get_packing_parameter +
    +
    [Called By]
    • >>   vote_data_packing +
    + +

    get_pc_connect_status (Thumb, 6 bytes, Stack size 0 bytes, base_core.o(i.get_pc_connect_status)) +
    [Address Reference Count : 1]

    • base_core.o(.data) +
    +

    get_pc_connect_status_acc (Thumb, 6 bytes, Stack size 0 bytes, base_core.o(i.get_pc_connect_status_acc)) +
    [Address Reference Count : 1]

    • base_core.o(.data) +
    +

    get_permit_dispaly_status (Thumb, 14 bytes, Stack size 0 bytes, base_core.o(i.get_permit_dispaly_status)) +
    [Address Reference Count : 1]

    • base_core.o(.data) +
    +

    get_stm32_chip_id (Thumb, 46 bytes, Stack size 20 bytes, platform.o(i.get_stm32_chip_id)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = get_stm32_chip_id +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    get_tx_ok_flag (Thumb, 6 bytes, Stack size 0 bytes, rf24l01 - multi.o(i.get_tx_ok_flag)) +

    [Called By]

    • >>   msg_wait_rfsendOK +
    • >>   Upgrade_WaitRfSendOK +
    + +

    get_usb_status (Thumb, 18 bytes, Stack size 0 bytes, platform.o(i.get_usb_status)) +
    [Address Reference Count : 1]

    • platform.o(.data) +
    +

    get_whitelist_rfid (Thumb, 10 bytes, Stack size 0 bytes, multi_channel.o(i.get_whitelist_rfid)) +
    [Address Reference Count : 1]

    • base_core.o(.data) +
    +

    gpio_bit_reset (Thumb, 4 bytes, Stack size 0 bytes, gd32f30x_gpio.o(i.gpio_bit_reset)) +

    [Called By]

    • >>   GPIO_Init +
    • >>   usbd_dp_pullup +
    • >>   NRF24L01_Read_Buf +
    • >>   RF24L01_RxOn +
    • >>   NRF24L01_Write_Tx_Payload_NoAck +
    • >>   NRF24L01_Write_Reg +
    • >>   NRF24L01_Write_Buf +
    • >>   NRF24L01_Read_Status_Register +
    • >>   NRF24L01_Read_Reg +
    • >>   NRF24L01_Flush_Tx_Fifo +
    • >>   NRF24L01_Flush_Rx_Fifo +
    • >>   NRF24L01_Clear_IRQ_Flag +
    • >>   rf_SendPacket +
    • >>   ant_sw +
    • >>   HW_GD_GPIO_TogglePin +
    • >>   led2_control +
    • >>   led1_control +
    • >>   i2c_stop +
    • >>   i2c_start +
    • >>   i2c_send_byte +
    • >>   i2c_read_byte +
    + +

    gpio_bit_set (Thumb, 4 bytes, Stack size 0 bytes, gd32f30x_gpio.o(i.gpio_bit_set)) +

    [Called By]

    • >>   usbd_dp_pullup +
    • >>   NRF24L01_Read_Buf +
    • >>   RF24L01_RxOn +
    • >>   NRF24L01_Write_Tx_Payload_NoAck +
    • >>   NRF24L01_Write_Reg +
    • >>   NRF24L01_Write_Buf +
    • >>   NRF24L01_Read_Status_Register +
    • >>   NRF24L01_Read_Reg +
    • >>   NRF24L01_Flush_Tx_Fifo +
    • >>   NRF24L01_Flush_Rx_Fifo +
    • >>   NRF24L01_Clear_IRQ_Flag +
    • >>   rf_SendPacket +
    • >>   ant_sw +
    • >>   HW_GD_GPIO_TogglePin +
    • >>   led2_control +
    • >>   led1_control +
    • >>   i2c_stop +
    • >>   i2c_start +
    • >>   i2c_send_byte +
    • >>   i2c_read_byte +
    + +

    gpio_config (Thumb, 18 bytes, Stack size 8 bytes, gd32f30x_usbd_hw.o(i.gpio_config)) +

    [Stack]

    • Max Depth = 28
    • Call Chain = gpio_config ⇒ gpio_init +
    +
    [Calls]
    • >>   gpio_init +
    +
    [Called By]
    • >>   main +
    + +

    gpio_init (Thumb, 188 bytes, Stack size 20 bytes, gd32f30x_gpio.o(i.gpio_init)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = gpio_init +
    +
    [Called By]
    • >>   gpio_config +
    • >>   HW_GD_SPI0_Init +
    • >>   HW_GD_GPIO_Init +
    + +

    gpio_input_bit_get (Thumb, 16 bytes, Stack size 0 bytes, gd32f30x_gpio.o(i.gpio_input_bit_get)) +

    [Called By]

    • >>   HW_GD_GPIO_TogglePin +
    • >>   i2c_send_byte +
    • >>   i2c_read_byte +
    + +

    i2c_read_byte (Thumb, 128 bytes, Stack size 16 bytes, i2c.o(i.i2c_read_byte)) +

    [Stack]

    • Max Depth = 84
    • Call Chain = i2c_read_byte ⇒ SET_SDA_OUT ⇒ HW_GD_GPIO_Init ⇒ gpio_init +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_input_bit_get +
    • >>   gpio_bit_set +
    • >>   i2c_delay +
    • >>   SET_SDA_OUT +
    • >>   SET_SDA_IN +
    +
    [Called By]
    • >>   EE_ReadBytes +
    + +

    i2c_send_byte (Thumb, 188 bytes, Stack size 16 bytes, i2c.o(i.i2c_send_byte)) +

    [Stack]

    • Max Depth = 84
    • Call Chain = i2c_send_byte ⇒ SET_SDA_OUT ⇒ HW_GD_GPIO_Init ⇒ gpio_init +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_input_bit_get +
    • >>   gpio_bit_set +
    • >>   i2c_delay +
    • >>   SET_SDA_OUT +
    • >>   SET_SDA_IN +
    +
    [Called By]
    • >>   EE_WriteBytes +
    • >>   EE_ReadBytes +
    + +

    i2c_start (Thumb, 68 bytes, Stack size 8 bytes, i2c.o(i.i2c_start)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = i2c_start +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   i2c_delay +
    +
    [Called By]
    • >>   EE_WriteBytes +
    • >>   EE_ReadBytes +
    + +

    i2c_stop (Thumb, 68 bytes, Stack size 8 bytes, i2c.o(i.i2c_stop)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = i2c_stop +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   i2c_delay +
    +
    [Called By]
    • >>   EE_WriteBytes +
    • >>   EE_ReadBytes +
    + +

    keypad_crc_check (Thumb, 34 bytes, Stack size 8 bytes, base_process_tx_keypad.o(i.keypad_crc_check)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = keypad_crc_check +
    +
    [Called By]
    • >>   base_tx_vote_beacon +
    • >>   base_tx_basic_beacon +
    • >>   base_confirm_keypad_sn_mode +
    • >>   base_confirm_keypad_id_mode +
    • >>   base_confirm_keypad_crs2_mode +
    • >>   keypad_rf_data_process_NO_fifo +
    + +

    keypad_crs2_mode (Thumb, 294 bytes, Stack size 88 bytes, base_process_rx_keypad.o(i.keypad_crs2_mode)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = keypad_crs2_mode ⇒ vote_data_store ⇒ queue_in ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   get_base_log_mode +
    • >>   _debug_core__record_rxkp_info +
    • >>   vote_data_store +
    • >>   keypad_idsn_save +
    +
    [Called By]
    • >>   keypad_rf_data_process_NO_fifo +
    + +

    keypad_id_mode (Thumb, 334 bytes, Stack size 96 bytes, base_process_rx_keypad.o(i.keypad_id_mode)) +

    [Stack]

    • Max Depth = 136
    • Call Chain = keypad_id_mode ⇒ vote_data_store ⇒ queue_in ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   mem_set +
    • >>   _debug_core__record_rxkp_info +
    • >>   vote_data_store +
    • >>   keypad_idsn_save +
    +
    [Called By]
    • >>   keypad_rf_data_process_NO_fifo +
    + +

    keypad_idsn_clear (Thumb, 78 bytes, Stack size 16 bytes, base_process_tx_keypad.o(i.keypad_idsn_clear)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = keypad_idsn_clear ⇒ mem_set +
    +
    [Calls]
    • >>   mem_set +
    +
    [Called By]
    • >>   base_process_keyapad_init +
    • >>   base_tx_vote_beacon +
    • >>   base_tx_basic_beacon +
    + +

    keypad_idsn_record_whitelist_request (Thumb, 34 bytes, Stack size 0 bytes, function_whitelist.o(i.keypad_idsn_record_whitelist_request)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    keypad_idsn_save (Thumb, 242 bytes, Stack size 24 bytes, base_process_tx_keypad.o(i.keypad_idsn_save)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = keypad_idsn_save ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    +
    [Called By]
    • >>   keypad_sn_mode +
    • >>   keypad_id_mode +
    • >>   keypad_crs2_mode +
    + +

    keypad_rf_data_process_NO_fifo (Thumb, 522 bytes, Stack size 24 bytes, base_process_rx_keypad.o(i.keypad_rf_data_process_NO_fifo)) +

    [Stack]

    • Max Depth = 160
    • Call Chain = keypad_rf_data_process_NO_fifo ⇒ keypad_id_mode ⇒ vote_data_store ⇒ queue_in ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_compare +
    • >>   mem_cpy +
    • >>   get_base_log_mode +
    • >>   refresh_rcvRF_indicate +
    • >>   keypad_transfer2pc_data_save +
    • >>   keypad_crc_check +
    • >>   crc16 +
    • >>   conver_id +
    • >>   keypad_sn_mode +
    • >>   keypad_id_mode +
    • >>   keypad_crs2_mode +
    +
    [Called By]
    • >>   keypad_rf_data_save +
    + +

    keypad_rf_data_save (Thumb, 14 bytes, Stack size 8 bytes, base_process_rx_keypad.o(i.keypad_rf_data_save)) +

    [Stack]

    • Max Depth = 168
    • Call Chain = keypad_rf_data_save ⇒ keypad_rf_data_process_NO_fifo ⇒ keypad_id_mode ⇒ vote_data_store ⇒ queue_in ⇒ mem_cpy +
    +
    [Calls]
    • >>   keypad_rf_data_process_NO_fifo +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    keypad_sn_mode (Thumb, 96 bytes, Stack size 48 bytes, base_process_rx_keypad.o(i.keypad_sn_mode)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = keypad_sn_mode ⇒ vote_data_store ⇒ queue_in ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   _debug_core__record_rxkp_info +
    • >>   vote_data_store +
    • >>   keypad_idsn_save +
    +
    [Called By]
    • >>   keypad_rf_data_process_NO_fifo +
    + +

    keypad_transfer2pc_data_fetch (Thumb, 60 bytes, Stack size 80 bytes, transfer_keypad_pc.o(i.keypad_transfer2pc_data_fetch)) +

    [Stack]

    • Max Depth = 160
    • Call Chain = keypad_transfer2pc_data_fetch ⇒ base_tx_to_pc_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   base_tx_to_pc_sub +
    • >>   queue_out +
    +
    [Called By]
    • >>   base_core_main_loop +
    + +

    keypad_transfer2pc_data_save (Thumb, 18 bytes, Stack size 8 bytes, transfer_keypad_pc.o(i.keypad_transfer2pc_data_save)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = keypad_transfer2pc_data_save ⇒ queue_in ⇒ mem_cpy +
    +
    [Calls]
    • >>   queue_in +
    +
    [Called By]
    • >>   keypad_rf_data_process_NO_fifo +
    + +

    kprx_init_queue (Thumb, 16 bytes, Stack size 8 bytes, base_process_rx_keypad.o(i.kprx_init_queue)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = kprx_init_queue ⇒ queue_init +
    +
    [Calls]
    • >>   queue_init +
    +
    [Called By]
    • >>   base_process_keyapad_init +
    + +

    led1_control (Thumb, 42 bytes, Stack size 8 bytes, led.o(i.led1_control)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = led1_control ⇒ HW_GD_GPIO_TogglePin +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   HW_GD_GPIO_TogglePin +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    led2_control (Thumb, 42 bytes, Stack size 8 bytes, led.o(i.led2_control)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = led2_control ⇒ HW_GD_GPIO_TogglePin +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   HW_GD_GPIO_TogglePin +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    log_debug (Thumb, 2 bytes, Stack size 0 bytes, transparentupgrade.o(i.log_debug)) +

    [Called By]

    • >>   Upgrade_TickHandler +
    • >>   Upgrade_RfSendCallBack +
    • >>   Upgrade_ParameterInit +
    + +

    main (Thumb, 98 bytes, Stack size 0 bytes, main.o(i.main)) +

    [Stack]

    • Max Depth = 92
    • Call Chain = main ⇒ rcu_config ⇒ rcu_clock_freq_get +
    +
    [Calls]
    • >>   usbd_init +
    • >>   rcu_config +
    • >>   nvic_config +
    • >>   msg_polling +
    • >>   gpio_config +
    • >>   custom_hid_itfop_register +
    • >>   HW_GD_SPI0_Init +
    • >>   TIMER2_Init +
    • >>   TIMER1_Init +
    • >>   GPIO_Init +
    +
    [Address Reference Count : 1]
    • entry9a.o(.ARM.Collect$$$$0000000B) +
    +

    malloc (Thumb, 92 bytes, Stack size 20 bytes, malloc.o(i.malloc)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = malloc +
    +
    [Called By]
    • >>   encrypt +
    • >>   decrypt +
    + +

    mem_compare (Thumb, 34 bytes, Stack size 12 bytes, common_math.o(i.mem_compare)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = mem_compare +
    +
    [Called By]
    • >>   _0x61_soft_dog_sub +
    • >>   keypad_rf_data_process_NO_fifo +
    + +

    mem_cpy (Thumb, 22 bytes, Stack size 8 bytes, common_math.o(i.mem_cpy)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = mem_cpy +
    +
    [Called By]
    • >>   base_read_e2prom +
    • >>   pc_cmd_0x61_process +
    • >>   pc_cmd_0x61_ack +
    • >>   _0x61_soft_dog_sub +
    • >>   _0x61_AUX_CONFIG_sub +
    • >>   vote_status_clear_confirmed +
    • >>   base_write_e2prom +
    • >>   pc_cmd_0x60_process +
    • >>   pc_cmd_0x60_ack +
    • >>   send_to_keypad_user_hardID +
    • >>   get_base_match_code +
    • >>   base_tx_to_pc_sub +
    • >>   base_read_e2prom_parameter +
    • >>   vote_data_packing +
    • >>   queue_out_special +
    • >>   setup_multi_info +
    • >>   base_tx_to_keypad_sub +
    • >>   base_tx_vote_beacon +
    • >>   base_tx_ext_vbeacon +
    • >>   base_tx_ext_basic_beacon +
    • >>   base_tx_basic_beacon +
    • >>   base_confirm_keypad_sn_mode +
    • >>   base_confirm_keypad_id_mode +
    • >>   base_confirm_keypad_crs2_mode +
    • >>   keypad_idsn_save +
    • >>   keypad_sn_mode +
    • >>   keypad_rf_data_process_NO_fifo +
    • >>   keypad_id_mode +
    • >>   keypad_crs2_mode +
    • >>   queue_out +
    • >>   queue_in +
    + +

    mem_set (Thumb, 20 bytes, Stack size 8 bytes, common_math.o(i.mem_set)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = mem_set +
    +
    [Called By]
    • >>   pc_cmd_0x61_process +
    • >>   pc_cmd_0x61_ack +
    • >>   pc_cmd_0x60_ack +
    • >>   base_tx_to_pc_sub +
    • >>   base_read_e2prom_parameter +
    • >>   base_core_force_sysmode0 +
    • >>   vote_data_packing +
    • >>   setup_multi_info +
    • >>   rf_error_ack_pc +
    • >>   keypad_idsn_clear +
    • >>   keypad_id_mode +
    + +

    monitor_freq_process (Thumb, 240 bytes, Stack size 40 bytes, function_monitor_freq.o(i.monitor_freq_process)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = monitor_freq_process ⇒ monitor_freq_ack_pc ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   monitor_freq_ack_pc +
    • >>   check_disturb +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    monitor_rf_data (Thumb, 102 bytes, Stack size 8 bytes, function_monitor_freq.o(i.monitor_rf_data)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = monitor_rf_data +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    msg_delay_us (Thumb, 12 bytes, Stack size 8 bytes, fucntion_text_message.o(i.msg_delay_us)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = msg_delay_us +
    +
    [Calls]
    • >>   basic_delay_us +
    +
    [Called By]
    • >>   msg_wait_rfsendOK +
    • >>   msg_send +
    + +

    msg_get_pc_data (Thumb, 322 bytes, Stack size 8 bytes, fucntion_text_message.o(i.msg_get_pc_data)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = msg_get_pc_data ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memclr +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   update_kp_enter +
    + +

    msg_issendtime (Thumb, 96 bytes, Stack size 8 bytes, fucntion_text_message.o(i.msg_issendtime)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = msg_issendtime +
    +
    [Calls]
    • >>   msg_set_status +
    +
    [Called By]
    • >>   base_tx_keypad_beacon +
    + +

    msg_polling (Thumb, 78 bytes, Stack size 8 bytes, fucntion_text_message.o(i.msg_polling)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = msg_polling ⇒ msg_send ⇒ crc16 +
    +
    [Calls]
    • >>   base_send_beacon_switch +
    • >>   msg_send +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   main +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    msg_recover_beacon_countdown (Thumb, 44 bytes, Stack size 0 bytes, fucntion_text_message.o(i.msg_recover_beacon_countdown)) +

    [Called By]

    • >>   base_tx_keypad_beacon +
    + +

    msg_send (Thumb, 176 bytes, Stack size 56 bytes, fucntion_text_message.o(i.msg_send)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = msg_send ⇒ crc16 +
    +
    [Calls]
    • >>   crc16 +
    • >>   msg_wait_rfsendOK +
    • >>   msg_tx_payload +
    • >>   msg_delay_us +
    • >>   __aeabi_memclr4 +
    • >>   __aeabi_memclr +
    +
    [Called By]
    • >>   msg_polling +
    + +

    msg_set_status (Thumb, 6 bytes, Stack size 0 bytes, fucntion_text_message.o(i.msg_set_status)) +

    [Called By]

    • >>   msg_issendtime +
    + +

    msg_tx_payload (Thumb, 36 bytes, Stack size 16 bytes, fucntion_text_message.o(i.msg_tx_payload)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = msg_tx_payload +
    +
    [Calls]
    • >>   set_tx_ok_flag +
    +
    [Called By]
    • >>   msg_send +
    + +

    msg_wait_rfsendOK (Thumb, 34 bytes, Stack size 8 bytes, fucntion_text_message.o(i.msg_wait_rfsendOK)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = msg_wait_rfsendOK ⇒ msg_delay_us +
    +
    [Calls]
    • >>   get_tx_ok_flag +
    • >>   msg_delay_us +
    +
    [Called By]
    • >>   msg_send +
    + +

    multi_chan_init (Thumb, 218 bytes, Stack size 16 bytes, multi_channel.o(i.multi_chan_init)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = multi_chan_init ⇒ setup_multi_info ⇒ mem_cpy +
    +
    [Calls]
    • >>   get_main_rf_hard_id +
    • >>   setup_multi_info +
    +
    [Called By]
    • >>   base_core_init_all +
    + +

    multi_chan_polling (Thumb, 124 bytes, Stack size 16 bytes, multi_channel.o(i.multi_chan_polling)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = multi_chan_polling +
    +
    [Calls]
    • >>   rf_modual__check +
    +
    [Called By]
    • >>   base_tx_keypad_beacon +
    + +

    network_get_name (Thumb, 28 bytes, Stack size 0 bytes, function_network.o(i.network_get_name)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    network_get_nameview (Thumb, 6 bytes, Stack size 0 bytes, function_network.o(i.network_get_nameview)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    network_get_netseq (Thumb, 6 bytes, Stack size 0 bytes, function_network.o(i.network_get_netseq)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    network_get_pwd (Thumb, 6 bytes, Stack size 0 bytes, function_network.o(i.network_get_pwd)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    network_polling (Thumb, 76 bytes, Stack size 16 bytes, function_network.o(i.network_polling)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = network_polling ⇒ network_tx_beacon ⇒ crc16 +
    +
    [Calls]
    • >>   network_tx_beacon +
    • >>   network_creat_random_delay +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    network_randtime (Thumb, 72 bytes, Stack size 24 bytes, function_network.o(i.network_randtime)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = network_randtime ⇒ RandData +
    +
    [Calls]
    • >>   RandData +
    +
    [Called By]
    • >>   network_creat_random_delay +
    + +

    network_set_name (Thumb, 28 bytes, Stack size 16 bytes, function_network.o(i.network_set_name)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = network_set_name ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memcpy +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    network_set_nameview (Thumb, 18 bytes, Stack size 0 bytes, function_network.o(i.network_set_nameview)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    network_set_netseq_change (Thumb, 12 bytes, Stack size 0 bytes, function_network.o(i.network_set_netseq_change)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    network_set_pwd (Thumb, 6 bytes, Stack size 0 bytes, function_network.o(i.network_set_pwd)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    network_tx_beacon (Thumb, 330 bytes, Stack size 56 bytes, function_network.o(i.network_tx_beacon)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = network_tx_beacon ⇒ crc16 +
    +
    [Calls]
    • >>   get_base_log_mode +
    • >>   crc16 +
    • >>   __aeabi_memclr4 +
    +
    [Called By]
    • >>   network_polling +
    + +

    nvic_config (Thumb, 32 bytes, Stack size 8 bytes, gd32f30x_usbd_hw.o(i.nvic_config)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = nvic_config ⇒ nvic_irq_enable +
    +
    [Calls]
    • >>   nvic_priority_group_set +
    • >>   nvic_irq_enable +
    +
    [Called By]
    • >>   main +
    + +

    nvic_irq_enable (Thumb, 186 bytes, Stack size 24 bytes, gd32f30x_misc.o(i.nvic_irq_enable)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = nvic_irq_enable +
    +
    [Calls]
    • >>   nvic_priority_group_set +
    +
    [Called By]
    • >>   nvic_config +
    • >>   TIMER2_Init +
    • >>   TIMER1_Init +
    + +

    nvic_priority_group_set (Thumb, 10 bytes, Stack size 0 bytes, gd32f30x_misc.o(i.nvic_priority_group_set)) +

    [Called By]

    • >>   nvic_irq_enable +
    • >>   nvic_config +
    + +

    pc_cmd_0x60_ack (Thumb, 64 bytes, Stack size 80 bytes, base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_ack)) +

    [Stack]

    • Max Depth = 160
    • Call Chain = pc_cmd_0x60_ack ⇒ base_tx_to_pc_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   mem_set +
    • >>   get_base_id +
    • >>   base_tx_to_pc_sub +
    +
    [Called By]
    • >>   pc_cmd_0x60_process +
    + +

    pc_cmd_0x60_process (Thumb, 460 bytes, Stack size 16 bytes, base_process_pc_cmd_0x60.o(i.pc_cmd_0x60_process)) +

    [Stack]

    • Max Depth = 296
    • Call Chain = pc_cmd_0x60_process ⇒ base_write_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   vote_status_clear_confirmed +
    • >>   vote_data_report_startup +
    • >>   mem_cpy +
    • >>   base_write_e2prom +
    • >>   pc_cmd_0x60_ack +
    • >>   _0x60_basic_delay_ms +
    • >>   _debug_set_subject +
    • >>   _debug_core__init_parameter_datapos_change +
    +
    [Called By]
    • >>   base_process_pc_data +
    + +

    pc_cmd_0x61_ack (Thumb, 64 bytes, Stack size 80 bytes, base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_ack)) +

    [Stack]

    • Max Depth = 160
    • Call Chain = pc_cmd_0x61_ack ⇒ base_tx_to_pc_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   mem_set +
    • >>   get_base_id +
    • >>   base_tx_to_pc_sub +
    +
    [Called By]
    • >>   pc_cmd_0x61_process +
    • >>   _0x61_soft_dog_sub +
    • >>   _0x61_AUX_CONFIG_sub +
    + +

    pc_cmd_0x61_process (Thumb, 476 bytes, Stack size 48 bytes, base_process_pc_cmd_0x61.o(i.pc_cmd_0x61_process)) +

    [Stack]

    • Max Depth = 408
    • Call Chain = pc_cmd_0x61_process ⇒ _0x61_AUX_CONFIG_sub ⇒ process_setup_multi_chan ⇒ base_write_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   set_keypad_crc_config +
    • >>   assert_base_id +
    • >>   assert_base_channel +
    • >>   pc_cmd_0x61_ack +
    • >>   _0x61_soft_dog_sub +
    • >>   _0x61_AUX_CONFIG_sub +
    • >>   mem_cpy +
    • >>   base_write_e2prom +
    • >>   process_setup_single_chan +
    • >>   mem_set +
    • >>   get_main_rf_hard_id +
    • >>   get_base_match_code +
    • >>   set_base_hard_firmware_info +
    +
    [Called By]
    • >>   base_process_pc_data +
    + +

    pc_transfer2keypad_data_fetch (Thumb, 144 bytes, Stack size 88 bytes, transfer_keypad_pc.o(i.pc_transfer2keypad_data_fetch)) +

    [Stack]

    • Max Depth = 176
    • Call Chain = pc_transfer2keypad_data_fetch ⇒ base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   get_base_match_code +
    • >>   get_mainRF_usr_id +
    • >>   get_ext_basicbeacon_startup_flag +
    • >>   base_tx_to_keypad_sub +
    • >>   crc16 +
    • >>   queue_out +
    +
    [Called By]
    • >>   base_tx_keypad_beacon +
    +
    [Address Reference Count : 1]
    • base_process_tx_keypad.o(i.base_tx_keypad_beacon) +
    +

    pc_transfer2keypad_data_save (Thumb, 34 bytes, Stack size 16 bytes, transfer_keypad_pc.o(i.pc_transfer2keypad_data_save)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = pc_transfer2keypad_data_save ⇒ queue_in ⇒ mem_cpy +
    +
    [Calls]
    • >>   queue_in +
    +
    [Called By]
    • >>   base_process_pc_data +
    + +

    pcrx_data_save (Thumb, 18 bytes, Stack size 8 bytes, base_process_pc_enter.o(i.pcrx_data_save)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = pcrx_data_save ⇒ queue_in ⇒ mem_cpy +
    +
    [Calls]
    • >>   queue_in +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    pcrx_init_queue (Thumb, 16 bytes, Stack size 8 bytes, base_process_pc_enter.o(i.pcrx_init_queue)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = pcrx_init_queue ⇒ queue_init +
    +
    [Calls]
    • >>   queue_init +
    +
    [Called By]
    • >>   base_process_pc_init +
    + +

    process_keypad_broadcast_requst (Thumb, 60 bytes, Stack size 8 bytes, function_broadcast.o(i.process_keypad_broadcast_requst)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = process_keypad_broadcast_requst ⇒ startup_broadcast +
    +
    [Calls]
    • >>   startup_broadcast +
    • >>   det_blank_content +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    process_pc_aes_config (Thumb, 86 bytes, Stack size 40 bytes, function_aes.o(i.process_pc_aes_config)) +

    [Stack]

    • Max Depth = 104
    • Call Chain = process_pc_aes_config ⇒ user__pc_cmd_ack ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   user__pc_cmd_ack +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    process_setup_multi_chan (Thumb, 42 bytes, Stack size 8 bytes, multi_channel.o(i.process_setup_multi_chan)) +

    [Stack]

    • Max Depth = 288
    • Call Chain = process_setup_multi_chan ⇒ base_write_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   base_write_e2prom +
    • >>   setup_multi_info +
    • >>   e2prom_write_delay_ms +
    +
    [Called By]
    • >>   _0x61_AUX_CONFIG_sub +
    + +

    process_setup_single_chan (Thumb, 46 bytes, Stack size 8 bytes, multi_channel.o(i.process_setup_single_chan)) +

    [Stack]

    • Max Depth = 288
    • Call Chain = process_setup_single_chan ⇒ base_write_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   base_write_e2prom +
    • >>   setup_multi_info +
    • >>   e2prom_write_delay_ms +
    • >>   single_relevant_to_multi_chan +
    +
    [Called By]
    • >>   pc_cmd_0x61_process +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    queue_in (Thumb, 86 bytes, Stack size 24 bytes, queue_circle.o(i.queue_in)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = queue_in ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    +
    [Called By]
    • >>   pcrx_data_save +
    • >>   vote_data_store +
    • >>   keypad_transfer2pc_data_save +
    • >>   pc_transfer2keypad_data_save +
    + +

    queue_init (Thumb, 14 bytes, Stack size 8 bytes, queue_circle.o(i.queue_init)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = queue_init +
    +
    [Called By]
    • >>   vote_init_queue +
    • >>   transfer2kp_init_queue +
    • >>   kprx_init_queue +
    • >>   transfer2pc_init_queue +
    • >>   pcrx_init_queue +
    + +

    queue_out (Thumb, 84 bytes, Stack size 24 bytes, queue_circle.o(i.queue_out)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = queue_out ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    +
    [Called By]
    • >>   keypad_transfer2pc_data_fetch +
    • >>   pc_transfer2keypad_data_fetch +
    • >>   pcrx_data_fetch +
    + +

    queue_out_get_type (Thumb, 46 bytes, Stack size 16 bytes, queue_circle.o(i.queue_out_get_type)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = queue_out_get_type +
    +
    [Called By]
    • >>   vote_data_packing +
    + +

    queue_out_special (Thumb, 104 bytes, Stack size 32 bytes, queue_circle.o(i.queue_out_special)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = queue_out_special ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    +
    [Called By]
    • >>   vote_data_packing +
    + +

    rcu_clock_freq_get (Thumb, 310 bytes, Stack size 84 bytes, gd32f30x_rcu.o(i.rcu_clock_freq_get)) +

    [Stack]

    • Max Depth = 84
    • Call Chain = rcu_clock_freq_get +
    +
    [Called By]
    • >>   rcu_config +
    + +

    rcu_config (Thumb, 168 bytes, Stack size 8 bytes, gd32f30x_usbd_hw.o(i.rcu_config)) +

    [Stack]

    • Max Depth = 92
    • Call Chain = rcu_config ⇒ rcu_clock_freq_get +
    +
    [Calls]
    • >>   rcu_usb_clock_config +
    • >>   rcu_periph_clock_enable +
    • >>   rcu_clock_freq_get +
    +
    [Called By]
    • >>   main +
    + +

    rcu_periph_clock_enable (Thumb, 28 bytes, Stack size 0 bytes, gd32f30x_rcu.o(i.rcu_periph_clock_enable)) +

    [Called By]

    • >>   rcu_config +
    • >>   HW_GD_SPI0_Init +
    + +

    rcu_usb_clock_config (Thumb, 18 bytes, Stack size 0 bytes, gd32f30x_rcu.o(i.rcu_usb_clock_config)) +

    [Called By]

    • >>   rcu_config +
    + +

    refresh_pc_connect_status (Thumb, 30 bytes, Stack size 8 bytes, base_core.o(i.refresh_pc_connect_status)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = refresh_pc_connect_status +
    +
    [Called By]
    • >>   base_process_pc_data +
    + +

    refresh_rcvRF_indicate (Thumb, 30 bytes, Stack size 8 bytes, base_core.o(i.refresh_rcvRF_indicate)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = refresh_rcvRF_indicate +
    +
    [Called By]
    • >>   keypad_rf_data_process_NO_fifo +
    + +

    rf_Decrypt (Thumb, 308 bytes, Stack size 72 bytes, function_aes.o(i.rf_Decrypt)) +

    [Stack]

    • Max Depth = 508
    • Call Chain = rf_Decrypt ⇒ Decrypt ⇒ STM32_AES_ECB_Decrypt ⇒ AES_ECB_Decrypt_Append ⇒ AES_general_SW_dec +
    +
    [Calls]
    • >>   crc16 +
    • >>   base_is_auto_match +
    • >>   Decrypt +
    • >>   CmdXch +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   aes_test +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    rf_Encrypt (Thumb, 282 bytes, Stack size 56 bytes, function_aes.o(i.rf_Encrypt)) +

    [Stack]

    • Max Depth = 492
    • Call Chain = rf_Encrypt ⇒ Encrypt ⇒ STM32_AES_ECB_Encrypt ⇒ AES_ECB_Encrypt_Append ⇒ AES_general_SW_enc +
    +
    [Calls]
    • >>   crc16 +
    • >>   base_is_auto_match +
    • >>   Encrypt +
    • >>   CmdXch +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   aes_test +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    rf_SendPacket (Thumb, 170 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.rf_SendPacket)) +

    [Stack]

    • Max Depth = 360
    • Call Chain = rf_SendPacket ⇒ NRF24L01_Write_Tx_Payload_NoAck ⇒ drv_spi_read_write_byte_N ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   check_fastmatch_lowerPA +
    • >>   drv_spi_read_write_byte +
    • >>   RF24L01_Set_Mode +
    • >>   NRF24L01_Write_Tx_Payload_NoAck +
    • >>   DelayUs +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    rf_error_warning (Thumb, 74 bytes, Stack size 8 bytes, multi_channel.o(i.rf_error_warning)) +

    [Stack]

    • Max Depth = 92
    • Call Chain = rf_error_warning ⇒ rf_error_ack_pc ⇒ get_error_info +
    +
    [Calls]
    • >>   rf_error_ack_pc +
    +
    [Called By]
    • >>   base_core_20ms_isr +
    + +

    rf_initial (Thumb, 162 bytes, Stack size 8 bytes, rf24l01 - multi.o(i.rf_initial)) +

    [Stack]

    • Max Depth = 408
    • Call Chain = rf_initial ⇒ rf_set_syncode ⇒ NRF24L01_Set_RxAddr ⇒ NRF24L01_Write_Buf ⇒ drv_spi_read_write_byte_N ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   NRF24L01_check +
    • >>   RF24L01_RxOn +
    • >>   NRF24L01_Write_Reg +
    • >>   NRF24L01_Set_Speed +
    • >>   NRF24L01_SetPA +
    • >>   NRF24L01_Flush_Tx_Fifo +
    • >>   NRF24L01_Flush_Rx_Fifo +
    • >>   NRF24L01_Clear_IRQ_Flag +
    • >>   rf_set_syncode +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    rf_modual__check (Thumb, 2 bytes, Stack size 0 bytes, multi_channel.o(i.rf_modual__check)) +

    [Called By]

    • >>   multi_chan_polling +
    + +

    rf_modual__tx_counter (Thumb, 24 bytes, Stack size 0 bytes, multi_channel.o(i.rf_modual__tx_counter)) +

    [Called By]

    • >>   base_tx_to_keypad_sub +
    + +

    rf_set_PA_Mode (Thumb, 80 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.rf_set_PA_Mode)) +

    [Stack]

    • Max Depth = 120
    • Call Chain = rf_set_PA_Mode ⇒ NRF24L01_SetPA ⇒ NRF24L01_Write_Reg ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   check_fastmatch_lowerPA +
    • >>   NRF24L01_SetPA +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    rf_set_syncode (Thumb, 52 bytes, Stack size 24 bytes, rf24l01 - multi.o(i.rf_set_syncode)) +

    [Stack]

    • Max Depth = 400
    • Call Chain = rf_set_syncode ⇒ NRF24L01_Set_RxAddr ⇒ NRF24L01_Write_Buf ⇒ drv_spi_read_write_byte_N ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   NRF24L01_Set_TxAddr +
    • >>   NRF24L01_Set_RxAddr +
    +
    [Called By]
    • >>   rf_initial +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    rf_setfreq (Thumb, 30 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.rf_setfreq)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = rf_setfreq ⇒ RF24L01_RxOn ⇒ RF24L01_Set_Mode ⇒ NRF24L01_Write_Reg ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   RF24L01_RxOn +
    • >>   RF24L01_Chan +
    • >>   SEI +
    • >>   CLI +
    +
    [Address Reference Count : 1]
    • platform.o(.data) +
    +

    save_keypad_ack_data (Thumb, 26 bytes, Stack size 8 bytes, transparentupgrade.o(i.save_keypad_ack_data)) +

    [Stack]

    • Max Depth = 96
    • Call Chain = save_keypad_ack_data ⇒ Upgrade_RfSendCallBack ⇒ Upgrade_CRC ⇒ crc16 +
    +
    [Calls]
    • >>   Upgrade_RfSendCallBack +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    search_special_list (Thumb, 48 bytes, Stack size 16 bytes, function_whitelist.o(i.search_special_list)) +

    [Stack]

    • Max Depth = 28
    • Call Chain = search_special_list ⇒ memcmp +
    +
    [Calls]
    • >>   memcmp +
    +
    [Called By]
    • >>   whitelist_delete +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    send_to_keypad_user_hardID (Thumb, 86 bytes, Stack size 80 bytes, base_process_tx_keypad.o(i.send_to_keypad_user_hardID)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = send_to_keypad_user_hardID ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    +
    [Address Reference Count : 1]
    • base_core.o(.data) +
    +

    serial_string_get (Thumb, 70 bytes, Stack size 24 bytes, usbd_enum.o(i.serial_string_get)) +

    [Stack]

    • Max Depth = 36
    • Call Chain = serial_string_get ⇒ int_to_unicode +
    +
    [Calls]
    • >>   int_to_unicode +
    +
    [Called By]
    • >>   usbd_init +
    + +

    set_base_hard_firmware_info (Thumb, 52 bytes, Stack size 0 bytes, base_core.o(i.set_base_hard_firmware_info)) +

    [Called By]

    • >>   pc_cmd_0x61_process +
    • >>   base_read_e2prom_parameter +
    + +

    set_ext_basicbeacon_startup_flag (Thumb, 6 bytes, Stack size 0 bytes, base_process_tx_keypad.o(i.set_ext_basicbeacon_startup_flag)) +

    [Called By]

    • >>   _0x61_AUX_CONFIG_sub +
    + +

    set_keypad_crc_config (Thumb, 58 bytes, Stack size 8 bytes, base_process_tx_keypad.o(i.set_keypad_crc_config)) +

    [Stack]

    • Max Depth = 288
    • Call Chain = set_keypad_crc_config ⇒ base_write_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   base_write_e2prom +
    +
    [Called By]
    • >>   pc_cmd_0x61_process +
    + +

    set_pc_communication_type (Thumb, 26 bytes, Stack size 0 bytes, platform.o(i.set_pc_communication_type)) +

    [Called By]

    • >>   custom_hid_data_out +
    + +

    set_tx_ok_flag (Thumb, 6 bytes, Stack size 0 bytes, rf24l01 - multi.o(i.set_tx_ok_flag)) +

    [Called By]

    • >>   msg_tx_payload +
    • >>   Upgrade_TxPayload +
    + +

    single_relevant_to_multi_chan (Thumb, 42 bytes, Stack size 8 bytes, multi_channel.o(i.single_relevant_to_multi_chan)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = single_relevant_to_multi_chan +
    +
    [Calls]
    • >>   calc_next_multi_chan +
    +
    [Called By]
    • >>   process_setup_single_chan +
    • >>   base_read_e2prom_parameter +
    + +

    spi_enable (Thumb, 10 bytes, Stack size 0 bytes, gd32f30x_spi.o(i.spi_enable)) +

    [Called By]

    • >>   HW_GD_SPI0_Init +
    + +

    spi_i2s_data_receive (Thumb, 8 bytes, Stack size 0 bytes, gd32f30x_spi.o(i.spi_i2s_data_receive)) +

    [Called By]

    • >>   HW_GD_SPI_TransmitReceiveOneByte +
    + +

    spi_i2s_data_transmit (Thumb, 4 bytes, Stack size 0 bytes, gd32f30x_spi.o(i.spi_i2s_data_transmit)) +

    [Called By]

    • >>   HW_GD_SPI_TransmitReceiveOneByte +
    + +

    spi_i2s_flag_get (Thumb, 16 bytes, Stack size 0 bytes, gd32f30x_spi.o(i.spi_i2s_flag_get)) +

    [Called By]

    • >>   HW_GD_SPI_TransmitReceiveOneByte +
    + +

    spi_init (Thumb, 50 bytes, Stack size 0 bytes, gd32f30x_spi.o(i.spi_init)) +

    [Called By]

    • >>   HW_GD_SPI0_Init +
    + +

    startup_broadcast (Thumb, 58 bytes, Stack size 8 bytes, function_broadcast.o(i.startup_broadcast)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = startup_broadcast +
    +
    [Called By]
    • >>   process_keypad_broadcast_requst +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    timer_20ms_function (Thumb, 142 bytes, Stack size 8 bytes, base_core.o(i.timer_20ms_function)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = timer_20ms_function +
    +
    [Called By]
    • >>   base_core_20ms_isr +
    + +

    timer_autoreload_value_config (Thumb, 4 bytes, Stack size 0 bytes, gd32f30x_timer.o(i.timer_autoreload_value_config)) +

    [Called By]

    • >>   TIMER2_Init +
    • >>   TIMER1_Init +
    + +

    timer_counter_read (Thumb, 8 bytes, Stack size 0 bytes, gd32f30x_timer.o(i.timer_counter_read)) +

    [Called By]

    • >>   RandData +
    • >>   aes_keycode_upgrade +
    + +

    timer_counter_value_config (Thumb, 4 bytes, Stack size 0 bytes, gd32f30x_timer.o(i.timer_counter_value_config)) +

    [Called By]

    • >>   TIMER2_Init +
    • >>   TIMER1_Init +
    + +

    timer_enable (Thumb, 10 bytes, Stack size 0 bytes, gd32f30x_timer.o(i.timer_enable)) +

    [Called By]

    • >>   TIMER2_Init +
    • >>   TIMER1_Init +
    + +

    timer_init (Thumb, 122 bytes, Stack size 0 bytes, gd32f30x_timer.o(i.timer_init)) +

    [Called By]

    • >>   TIMER2_Init +
    • >>   TIMER1_Init +
    + +

    timer_interrupt_disable (Thumb, 8 bytes, Stack size 0 bytes, gd32f30x_timer.o(i.timer_interrupt_disable)) +

    [Called By]

    • >>   TIMER2_Init +
    • >>   TIMER1_Init +
    + +

    timer_interrupt_enable (Thumb, 8 bytes, Stack size 0 bytes, gd32f30x_timer.o(i.timer_interrupt_enable)) +

    [Called By]

    • >>   TIMER2_Init +
    • >>   TIMER1_Init +
    + +

    timer_interrupt_flag_clear (Thumb, 6 bytes, Stack size 0 bytes, gd32f30x_timer.o(i.timer_interrupt_flag_clear)) +

    [Called By]

    • >>   TIMER3_IRQHandler +
    • >>   TIMER2_IRQHandler +
    • >>   TIMER1_IRQHandler +
    • >>   TIMER2_Init +
    • >>   TIMER1_Init +
    + +

    timer_interrupt_flag_get (Thumb, 24 bytes, Stack size 0 bytes, gd32f30x_timer.o(i.timer_interrupt_flag_get)) +

    [Called By]

    • >>   TIMER3_IRQHandler +
    • >>   TIMER2_IRQHandler +
    • >>   TIMER1_IRQHandler +
    + +

    timer_prescaler_config (Thumb, 14 bytes, Stack size 0 bytes, gd32f30x_timer.o(i.timer_prescaler_config)) +

    [Called By]

    • >>   TIMER2_Init +
    • >>   TIMER1_Init +
    + +

    transfer2kp_init_queue (Thumb, 16 bytes, Stack size 8 bytes, transfer_keypad_pc.o(i.transfer2kp_init_queue)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = transfer2kp_init_queue ⇒ queue_init +
    +
    [Calls]
    • >>   queue_init +
    +
    [Called By]
    • >>   base_process_keyapad_init +
    + +

    transfer2pc_init_queue (Thumb, 16 bytes, Stack size 8 bytes, transfer_keypad_pc.o(i.transfer2pc_init_queue)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = transfer2pc_init_queue ⇒ queue_init +
    +
    [Calls]
    • >>   queue_init +
    +
    [Called By]
    • >>   base_process_pc_init +
    + +

    uart1_send_datas (Thumb, 2 bytes, Stack size 0 bytes, platform.o(i.uart1_send_datas)) +
    [Address Reference Count : 1]

    • platform.o(.data) +
    +

    updat__exit (Thumb, 42 bytes, Stack size 8 bytes, transparentupgrade.o(i.updat__exit)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = updat__exit ⇒ update_request_pkt_to_pc +
    +
    [Calls]
    • >>   basic_delay_us_update +
    • >>   update_request_pkt_to_pc +
    +
    [Called By]
    • >>   Upgrade_TickHandler +
    + +

    update_2_timer (Thumb, 30 bytes, Stack size 8 bytes, transparentupgrade.o(i.update_2_timer)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = update_2_timer ⇒ Upgrade_TickHandler ⇒ Upgrade_BeaconQuery ⇒ Upgrade_CRC ⇒ crc16 +
    +
    [Calls]
    • >>   Msg_TickHandler +
    • >>   Upgrade_TickHandler +
    +
    [Called By]
    • >>   user_20ms_timer +
    + +

    update_get_status (Thumb, 4 bytes, Stack size 0 bytes, transparentupgrade.o(i.update_get_status)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    update_kp_enter (Thumb, 224 bytes, Stack size 16 bytes, transparentupgrade.o(i.update_kp_enter)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = update_kp_enter ⇒ user__pc_cmd_ack ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   user__pc_cmd_ack +
    • >>   msg_get_pc_data +
    • >>   Upgrade_Start +
    • >>   Upgrade_ParameterInit +
    • >>   __aeabi_memcpy +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    update_kp_progress (Thumb, 2 bytes, Stack size 0 bytes, transparentupgrade.o(i.update_kp_progress)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    update_monitor_sdk_connect (Thumb, 2 bytes, Stack size 0 bytes, transparentupgrade.o(i.update_monitor_sdk_connect)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    usbd_class_request (Thumb, 34 bytes, Stack size 16 bytes, usbd_enum.o(i.usbd_class_request)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = usbd_class_request +
    +
    [Called By]
    • >>   _usb_setup_transc +
    + +

    usbd_ep_recev (Thumb, 56 bytes, Stack size 24 bytes, usbd_core.o(i.usbd_ep_recev)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = usbd_ep_recev +
    +
    [Calls]
    • >>   usb_transc_config +
    +
    [Called By]
    • >>   custom_hid_init +
    • >>   custom_hid_data_out +
    + +

    usbd_ep_send (Thumb, 78 bytes, Stack size 32 bytes, usbd_core.o(i.usbd_ep_send)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = usbd_ep_send +
    +
    [Calls]
    • >>   usb_transc_config +
    +
    [Called By]
    • >>   usbd_isr +
    • >>   custom_hid_report_send +
    • >>   _usb_setup_transc +
    + +

    usbd_init (Thumb, 92 bytes, Stack size 16 bytes, usbd_core.o(i.usbd_init)) +

    [Stack]

    • Max Depth = 52
    • Call Chain = usbd_init ⇒ serial_string_get ⇒ int_to_unicode +
    +
    [Calls]
    • >>   serial_string_get +
    +
    [Called By]
    • >>   main +
    + +

    usbd_isr (Thumb, 622 bytes, Stack size 32 bytes, usbd_lld_int.o(i.usbd_isr)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = usbd_isr ⇒ usbd_ep_send +
    +
    [Calls]
    • >>   usbd_ep_send +
    • >>   usbd_int_suspend +
    +
    [Called By]
    • >>   USBD_LP_CAN0_RX0_IRQHandler +
    + +

    usbd_standard_request (Thumb, 22 bytes, Stack size 16 bytes, usbd_enum.o(i.usbd_standard_request)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = usbd_standard_request +
    +
    [Called By]
    • >>   _usb_setup_transc +
    + +

    usbd_vendor_request (Thumb, 6 bytes, Stack size 0 bytes, usbd_enum.o(i.usbd_vendor_request)) +

    [Called By]

    • >>   _usb_setup_transc +
    + +

    user_20ms_timer (Thumb, 8 bytes, Stack size 8 bytes, platform.o(i.user_20ms_timer)) +

    [Stack]

    • Max Depth = 136
    • Call Chain = user_20ms_timer ⇒ update_2_timer ⇒ Upgrade_TickHandler ⇒ Upgrade_BeaconQuery ⇒ Upgrade_CRC ⇒ crc16 +
    +
    [Calls]
    • >>   update_2_timer +
    +
    [Called By]
    • >>   TIMER2_IRQHandler +
    + +

    user_2ms5_timer (Thumb, 26 bytes, Stack size 8 bytes, platform.o(i.user_2ms5_timer)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = user_2ms5_timer ⇒ base_broadcast_process_2ms5 ⇒ base_broadcast_sub ⇒ crc16 +
    +
    [Calls]
    • >>   whitelist__2ms5_call +
    • >>   base_broadcast_process_2ms5 +
    +
    [Called By]
    • >>   TIMER1_IRQHandler +
    + +

    user__keypad_transfer2pc (Thumb, 2 bytes, Stack size 0 bytes, function.o(i.user__keypad_transfer2pc)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    user__pc_0x60cmd (Thumb, 2 bytes, Stack size 0 bytes, function.o(i.user__pc_0x60cmd)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    user__pc_0x61cmd (Thumb, 2 bytes, Stack size 0 bytes, function.o(i.user__pc_0x61cmd)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    user__pc_0x61cmd_type0x0B (Thumb, 2 bytes, Stack size 0 bytes, function.o(i.user__pc_0x61cmd_type0x0B)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    user__pc_cmd_ack (Thumb, 74 bytes, Stack size 56 bytes, function.o(i.user__pc_cmd_ack)) +

    [Stack]

    • Max Depth = 64
    • Call Chain = user__pc_cmd_ack ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memclr4 +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   update_kp_enter +
    • >>   process_pc_aes_config +
    • >>   broadcast_config +
    + +

    user__pc_transfer2keypad (Thumb, 2 bytes, Stack size 0 bytes, function.o(i.user__pc_transfer2keypad)) +
    [Address Reference Count : 1]

    • function.o(.data) +
    +

    vote_data_packing (Thumb, 658 bytes, Stack size 136 bytes, vote__process.o(i.vote_data_packing)) +

    [Stack]

    • Max Depth = 216
    • Call Chain = vote_data_packing ⇒ base_tx_to_pc_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   mem_set +
    • >>   get_base_id +
    • >>   base_tx_to_pc_sub +
    • >>   _debug_core__record_txpc_info_report +
    • >>   _debug_core__record_txpc_info +
    • >>   get_packing_parameter +
    • >>   queue_out_special +
    • >>   queue_out_get_type +
    +
    [Called By]
    • >>   vote_data_report_to_pc +
    + +

    vote_data_parameter_init (Thumb, 20 bytes, Stack size 8 bytes, vote__report.o(i.vote_data_parameter_init)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = vote_data_parameter_init ⇒ vote_init_queue ⇒ queue_init +
    +
    [Calls]
    • >>   vote_init_queue +
    +
    [Called By]
    • >>   base_core_init_all +
    + +

    vote_data_report_interval (Thumb, 38 bytes, Stack size 8 bytes, vote__report.o(i.vote_data_report_interval)) +

    [Stack]

    • Max Depth = 232
    • Call Chain = vote_data_report_interval ⇒ vote_data_report_to_pc ⇒ vote_data_packing ⇒ base_tx_to_pc_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   vote_data_report_to_pc +
    +
    [Called By]
    • >>   base_core_2ms5_isr +
    + +

    vote_data_report_startup (Thumb, 22 bytes, Stack size 8 bytes, vote__report.o(i.vote_data_report_startup)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = vote_data_report_startup +
    +
    [Calls]
    • >>   vote_status_reset_NOconfirmed +
    +
    [Called By]
    • >>   pc_cmd_0x60_process +
    + +

    vote_data_report_to_pc (Thumb, 48 bytes, Stack size 8 bytes, vote__report.o(i.vote_data_report_to_pc)) +

    [Stack]

    • Max Depth = 224
    • Call Chain = vote_data_report_to_pc ⇒ vote_data_packing ⇒ base_tx_to_pc_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   vote_data_packing +
    +
    [Called By]
    • >>   vote_data_report_interval +
    + +

    vote_data_store (Thumb, 18 bytes, Stack size 8 bytes, vote__process.o(i.vote_data_store)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = vote_data_store ⇒ queue_in ⇒ mem_cpy +
    +
    [Calls]
    • >>   queue_in +
    +
    [Called By]
    • >>   keypad_sn_mode +
    • >>   keypad_id_mode +
    • >>   keypad_crs2_mode +
    + +

    vote_init_queue (Thumb, 16 bytes, Stack size 8 bytes, vote__process.o(i.vote_init_queue)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = vote_init_queue ⇒ queue_init +
    +
    [Calls]
    • >>   queue_init +
    +
    [Called By]
    • >>   vote_data_parameter_init +
    + +

    vote_status_clear_confirmed (Thumb, 338 bytes, Stack size 32 bytes, vote__process.o(i.vote_status_clear_confirmed)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = vote_status_clear_confirmed ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   _debug_core__record_pcack_info +
    +
    [Called By]
    • >>   pc_cmd_0x60_process +
    + +

    vote_status_reset_NOconfirmed (Thumb, 2 bytes, Stack size 0 bytes, vote__process.o(i.vote_status_reset_NOconfirmed)) +

    [Called By]

    • >>   vote_data_report_startup +
    + +

    whitelist__2ms5_call (Thumb, 84 bytes, Stack size 8 bytes, function_whitelist.o(i.whitelist__2ms5_call)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = whitelist__2ms5_call ⇒ whitelist__tx_authcode_to_keypad +
    +
    [Calls]
    • >>   whitelist__tx_authcode_to_keypad +
    • >>   auth_all_keypad +
    +
    [Called By]
    • >>   user_2ms5_timer +
    + +

    whitelist__tx_authcode_to_keypad (Thumb, 224 bytes, Stack size 40 bytes, function_whitelist.o(i.whitelist__tx_authcode_to_keypad)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = whitelist__tx_authcode_to_keypad +
    +
    [Calls]
    • >>   __aeabi_memclr +
    +
    [Called By]
    • >>   whitelist__2ms5_call +
    + +

    whitelist_enter (Thumb, 172 bytes, Stack size 80 bytes, function_whitelist.o(i.whitelist_enter)) +

    [Stack]

    • Max Depth = 168
    • Call Chain = whitelist_enter ⇒ whitelist_ack_pc ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   whitelist_write_1zone +
    • >>   whitelist_read_1zone +
    • >>   whitelist_delete +
    • >>   whitelist_add +
    • >>   whitelist_ack_pc +
    • >>   __aeabi_memclr +
    +
    [Address Reference Count : 1]
    • function.o(.data) +
    +

    whitelist_init (Thumb, 46 bytes, Stack size 0 bytes, function_whitelist.o(i.whitelist_init)) +

    [Called By]

    • >>   whitelist_write_1zone +
    +
    [Address Reference Count : 1]
    • function.o(.data) +

    +

    +Local Symbols +

    +

    key_config (Thumb, 2 bytes, Stack size 0 bytes, custom_hid_itf.o(i.key_config)) +
    [Address Reference Count : 1]

    • custom_hid_itf.o(.data) +
    +

    led_config (Thumb, 2 bytes, Stack size 0 bytes, custom_hid_itf.o(i.led_config)) +
    [Address Reference Count : 1]

    • custom_hid_itf.o(.data) +
    +

    system_clock_120m_hxtal (Thumb, 256 bytes, Stack size 0 bytes, system_gd32f30x.o(i.system_clock_120m_hxtal)) +

    [Called By]

    • >>   system_clock_config +
    + +

    system_clock_config (Thumb, 8 bytes, Stack size 8 bytes, system_gd32f30x.o(i.system_clock_config)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = system_clock_config +
    +
    [Calls]
    • >>   system_clock_120m_hxtal +
    +
    [Called By]
    • >>   SystemInit +
    + +

    usbd_address_set (Thumb, 12 bytes, Stack size 0 bytes, usbd_lld_core.o(i.usbd_address_set)) +
    [Address Reference Count : 1]

    • usbd_lld_core.o(.data) +
    +

    usbd_core_reset (Thumb, 34 bytes, Stack size 0 bytes, usbd_lld_core.o(i.usbd_core_reset)) +
    [Address Reference Count : 1]

    • usbd_lld_core.o(.data) +
    +

    usbd_core_stop (Thumb, 20 bytes, Stack size 0 bytes, usbd_lld_core.o(i.usbd_core_stop)) +
    [Address Reference Count : 1]

    • usbd_lld_core.o(.data) +
    +

    usbd_dp_pullup (Thumb, 30 bytes, Stack size 8 bytes, usbd_lld_core.o(i.usbd_dp_pullup)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = usbd_dp_pullup +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    +
    [Address Reference Count : 1]
    • usbd_lld_core.o(.data) +
    +

    usbd_ep_data_read (Thumb, 148 bytes, Stack size 20 bytes, usbd_lld_core.o(i.usbd_ep_data_read)) +

    [Stack]

    • Max Depth = 20
    • Call Chain = usbd_ep_data_read +
    +
    [Address Reference Count : 1]
    • usbd_lld_core.o(.data) +
    +

    usbd_ep_data_write (Thumb, 84 bytes, Stack size 16 bytes, usbd_lld_core.o(i.usbd_ep_data_write)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = usbd_ep_data_write +
    +
    [Address Reference Count : 1]
    • usbd_lld_core.o(.data) +
    +

    usbd_ep_disable (Thumb, 178 bytes, Stack size 12 bytes, usbd_lld_core.o(i.usbd_ep_disable)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = usbd_ep_disable +
    +
    [Address Reference Count : 1]
    • usbd_lld_core.o(.data) +
    +

    usbd_ep_reset (Thumb, 142 bytes, Stack size 12 bytes, usbd_lld_core.o(i.usbd_ep_reset)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = usbd_ep_reset +
    +
    [Address Reference Count : 1]
    • usbd_lld_core.o(.data) +
    +

    usbd_ep_rx_enable (Thumb, 42 bytes, Stack size 8 bytes, usbd_lld_core.o(i.usbd_ep_rx_enable)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = usbd_ep_rx_enable +
    +
    [Address Reference Count : 1]
    • usbd_lld_core.o(.data) +
    +

    usbd_ep_setup (Thumb, 620 bytes, Stack size 28 bytes, usbd_lld_core.o(i.usbd_ep_setup)) +

    [Stack]

    • Max Depth = 28
    • Call Chain = usbd_ep_setup +
    +
    [Address Reference Count : 1]
    • usbd_lld_core.o(.data) +
    +

    usbd_ep_stall_clear (Thumb, 220 bytes, Stack size 12 bytes, usbd_lld_core.o(i.usbd_ep_stall_clear)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = usbd_ep_stall_clear +
    +
    [Address Reference Count : 1]
    • usbd_lld_core.o(.data) +
    +

    usbd_ep_stall_set (Thumb, 160 bytes, Stack size 12 bytes, usbd_lld_core.o(i.usbd_ep_stall_set)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = usbd_ep_stall_set +
    +
    [Address Reference Count : 1]
    • usbd_lld_core.o(.data) +
    +

    usbd_ep_status (Thumb, 30 bytes, Stack size 8 bytes, usbd_lld_core.o(i.usbd_ep_status)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = usbd_ep_status +
    +
    [Address Reference Count : 1]
    • usbd_lld_core.o(.data) +
    +

    usbd_leave_suspend (Thumb, 24 bytes, Stack size 0 bytes, usbd_lld_core.o(i.usbd_leave_suspend)) +
    [Address Reference Count : 1]

    • usbd_lld_core.o(.data) +
    +

    usbd_resume (Thumb, 24 bytes, Stack size 0 bytes, usbd_lld_core.o(i.usbd_resume)) +
    [Address Reference Count : 1]

    • usbd_lld_core.o(.data) +
    +

    usbd_suspend (Thumb, 14 bytes, Stack size 0 bytes, usbd_lld_core.o(i.usbd_suspend)) +
    [Address Reference Count : 1]

    • usbd_lld_core.o(.data) +
    +

    usbd_int_suspend (Thumb, 36 bytes, Stack size 8 bytes, usbd_lld_int.o(i.usbd_int_suspend)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = usbd_int_suspend +
    +
    [Called By]
    • >>   usbd_isr +
    + +

    usb_transc_config (Thumb, 8 bytes, Stack size 0 bytes, usbd_core.o(i.usb_transc_config)) +

    [Called By]

    • >>   usbd_ep_recev +
    • >>   usbd_ep_send +
    + +

    _usb_bos_desc_get (Thumb, 48 bytes, Stack size 8 bytes, usbd_enum.o(i._usb_bos_desc_get)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = _usb_bos_desc_get +
    +
    [Called By]
    • >>   _usb_std_getdescriptor +
    + +

    _usb_config_desc_get (Thumb, 32 bytes, Stack size 8 bytes, usbd_enum.o(i._usb_config_desc_get)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = _usb_config_desc_get +
    +
    [Address Reference Count : 1]
    • usbd_enum.o(.data) +
    +

    _usb_dev_desc_get (Thumb, 20 bytes, Stack size 0 bytes, usbd_enum.o(i._usb_dev_desc_get)) +
    [Address Reference Count : 1]

    • usbd_enum.o(.data) +
    +

    _usb_std_clearfeature (Thumb, 124 bytes, Stack size 16 bytes, usbd_enum.o(i._usb_std_clearfeature)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = _usb_std_clearfeature +
    +
    [Address Reference Count : 1]
    • usbd_enum.o(.data) +
    +

    _usb_std_getconfiguration (Thumb, 60 bytes, Stack size 16 bytes, usbd_enum.o(i._usb_std_getconfiguration)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = _usb_std_getconfiguration +
    +
    [Calls]
    • >>   usb_transc_config +
    +
    [Address Reference Count : 1]
    • usbd_enum.o(.data) +
    +

    _usb_std_getdescriptor (Thumb, 268 bytes, Stack size 32 bytes, usbd_enum.o(i._usb_std_getdescriptor)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = _usb_std_getdescriptor ⇒ _usb_bos_desc_get +
    +
    [Calls]
    • >>   _usb_bos_desc_get +
    +
    [Address Reference Count : 1]
    • usbd_enum.o(.data) +
    +

    _usb_std_getinterface (Thumb, 62 bytes, Stack size 16 bytes, usbd_enum.o(i._usb_std_getinterface)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = _usb_std_getinterface +
    +
    [Calls]
    • >>   usb_transc_config +
    +
    [Address Reference Count : 1]
    • usbd_enum.o(.data) +
    +

    _usb_std_getstatus (Thumb, 194 bytes, Stack size 24 bytes, usbd_enum.o(i._usb_std_getstatus)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = _usb_std_getstatus +
    +
    [Calls]
    • >>   usb_transc_config +
    +
    [Address Reference Count : 1]
    • usbd_enum.o(.data) +
    +

    _usb_std_reserved (Thumb, 6 bytes, Stack size 0 bytes, usbd_enum.o(i._usb_std_reserved)) +
    [Address Reference Count : 1]

    • usbd_enum.o(.data) +
    +

    _usb_std_setaddress (Thumb, 46 bytes, Stack size 0 bytes, usbd_enum.o(i._usb_std_setaddress)) +
    [Address Reference Count : 1]

    • usbd_enum.o(.data) +
    +

    _usb_std_setconfiguration (Thumb, 160 bytes, Stack size 16 bytes, usbd_enum.o(i._usb_std_setconfiguration)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = _usb_std_setconfiguration +
    +
    [Address Reference Count : 1]
    • usbd_enum.o(.data) +
    +

    _usb_std_setdescriptor (Thumb, 6 bytes, Stack size 0 bytes, usbd_enum.o(i._usb_std_setdescriptor)) +
    [Address Reference Count : 1]

    • usbd_enum.o(.data) +
    +

    _usb_std_setfeature (Thumb, 112 bytes, Stack size 16 bytes, usbd_enum.o(i._usb_std_setfeature)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = _usb_std_setfeature +
    +
    [Address Reference Count : 1]
    • usbd_enum.o(.data) +
    +

    _usb_std_setinterface (Thumb, 48 bytes, Stack size 0 bytes, usbd_enum.o(i._usb_std_setinterface)) +
    [Address Reference Count : 1]

    • usbd_enum.o(.data) +
    +

    _usb_std_synchframe (Thumb, 6 bytes, Stack size 0 bytes, usbd_enum.o(i._usb_std_synchframe)) +
    [Address Reference Count : 1]

    • usbd_enum.o(.data) +
    +

    _usb_str_desc_get (Thumb, 20 bytes, Stack size 8 bytes, usbd_enum.o(i._usb_str_desc_get)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = _usb_str_desc_get +
    +
    [Address Reference Count : 1]
    • usbd_enum.o(.data) +
    +

    int_to_unicode (Thumb, 62 bytes, Stack size 12 bytes, usbd_enum.o(i.int_to_unicode)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = int_to_unicode +
    +
    [Called By]
    • >>   serial_string_get +
    + +

    usb_transc_config (Thumb, 8 bytes, Stack size 0 bytes, usbd_enum.o(i.usb_transc_config)) +

    [Called By]

    • >>   _usb_std_getstatus +
    • >>   _usb_std_getinterface +
    • >>   _usb_std_getconfiguration +
    + +

    usb_ctl_out (Thumb, 18 bytes, Stack size 8 bytes, usbd_transc.o(i.usb_ctl_out)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = usb_ctl_out +
    +
    [Called By]
    • >>   _usb_setup_transc +
    • >>   _usb_in0_transc +
    + +

    usb_ctl_status_in (Thumb, 20 bytes, Stack size 8 bytes, usbd_transc.o(i.usb_ctl_status_in)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = usb_ctl_status_in +
    +
    [Called By]
    • >>   _usb_setup_transc +
    • >>   _usb_out0_transc +
    + +

    usb_stall_transc (Thumb, 22 bytes, Stack size 16 bytes, usbd_transc.o(i.usb_stall_transc)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = usb_stall_transc +
    +
    [Called By]
    • >>   _usb_setup_transc +
    + +

    custom_hid_data_in (Thumb, 2 bytes, Stack size 0 bytes, custom_hid_core.o(i.custom_hid_data_in)) +
    [Address Reference Count : 1]

    • custom_hid_core.o(.data) +
    +

    custom_hid_data_out (Thumb, 66 bytes, Stack size 16 bytes, custom_hid_core.o(i.custom_hid_data_out)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = custom_hid_data_out ⇒ usbd_ep_recev +
    +
    [Calls]
    • >>   set_pc_communication_type +
    • >>   core_debug_enter +
    • >>   usbd_ep_recev +
    +
    [Address Reference Count : 1]
    • custom_hid_core.o(.data) +
    +

    custom_hid_deinit (Thumb, 26 bytes, Stack size 16 bytes, custom_hid_core.o(i.custom_hid_deinit)) +

    [Stack]

    • Max Depth = 32
    • Call Chain = custom_hid_deinit ⇒ usbd_ep_deinit +
    +
    [Calls]
    • >>   usbd_ep_deinit +
    +
    [Address Reference Count : 1]
    • custom_hid_core.o(.data) +
    +

    custom_hid_init (Thumb, 118 bytes, Stack size 16 bytes, custom_hid_core.o(i.custom_hid_init)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = custom_hid_init ⇒ usbd_ep_init +
    +
    [Calls]
    • >>   usbd_ep_init +
    • >>   usbd_ep_recev +
    • >>   __aeabi_memclr +
    +
    [Address Reference Count : 1]
    • custom_hid_core.o(.data) +
    +

    custom_hid_req_handler (Thumb, 234 bytes, Stack size 24 bytes, custom_hid_core.o(i.custom_hid_req_handler)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = custom_hid_req_handler +
    +
    [Calls]
    • >>   usb_transc_config +
    +
    [Address Reference Count : 1]
    • custom_hid_core.o(.data) +
    +

    usb_transc_config (Thumb, 8 bytes, Stack size 0 bytes, custom_hid_core.o(i.usb_transc_config)) +

    [Called By]

    • >>   custom_hid_req_handler +
    + +

    usbd_ep_deinit (Thumb, 20 bytes, Stack size 16 bytes, custom_hid_core.o(i.usbd_ep_deinit)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = usbd_ep_deinit +
    +
    [Called By]
    • >>   custom_hid_deinit +
    + +

    usbd_ep_init (Thumb, 34 bytes, Stack size 24 bytes, custom_hid_core.o(i.usbd_ep_init)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = usbd_ep_init +
    +
    [Called By]
    • >>   custom_hid_init +
    + +

    Beep (Thumb, 2 bytes, Stack size 0 bytes, buzzer.o(i.Beep)) +

    [Called By]

    • >>   beep_ctrl +
    + +

    i2c_delay (Thumb, 14 bytes, Stack size 0 bytes, i2c.o(i.i2c_delay)) +

    [Called By]

    • >>   i2c_stop +
    • >>   i2c_start +
    • >>   i2c_send_byte +
    • >>   i2c_read_byte +
    + +

    NVIC_SystemReset (Thumb, 30 bytes, Stack size 0 bytes, platform.o(i.NVIC_SystemReset)) +
    [Address Reference Count : 1]

    • platform.o(.data) +
    +

    DelayUs (Thumb, 12 bytes, Stack size 8 bytes, rf24l01 - multi.o(i.DelayUs)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = DelayUs +
    +
    [Calls]
    • >>   _24R1_delay_us +
    +
    [Called By]
    • >>   rf_SendPacket +
    + +

    NRF24L01_Clear_IRQ_Flag (Thumb, 78 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.NRF24L01_Clear_IRQ_Flag)) +

    [Stack]

    • Max Depth = 104
    • Call Chain = NRF24L01_Clear_IRQ_Flag ⇒ NRF24L01_Read_Status_Register ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   drv_spi_read_write_byte +
    • >>   NRF24L01_Read_Status_Register +
    +
    [Called By]
    • >>   rf_initial +
    + +

    NRF24L01_Flush_Rx_Fifo (Thumb, 46 bytes, Stack size 8 bytes, rf24l01 - multi.o(i.NRF24L01_Flush_Rx_Fifo)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = NRF24L01_Flush_Rx_Fifo ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   drv_spi_read_write_byte +
    +
    [Called By]
    • >>   rf_initial +
    + +

    NRF24L01_Flush_Tx_Fifo (Thumb, 46 bytes, Stack size 8 bytes, rf24l01 - multi.o(i.NRF24L01_Flush_Tx_Fifo)) +

    [Stack]

    • Max Depth = 80
    • Call Chain = NRF24L01_Flush_Tx_Fifo ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   drv_spi_read_write_byte +
    +
    [Called By]
    • >>   rf_initial +
    + +

    NRF24L01_Read_Reg (Thumb, 60 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.NRF24L01_Read_Reg)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = NRF24L01_Read_Reg ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   drv_spi_read_write_byte +
    +
    [Called By]
    • >>   RF24L01_Set_Mode +
    • >>   NRF24L01_Set_Speed +
    • >>   NRF24L01_SetPA +
    + +

    NRF24L01_Read_Status_Register (Thumb, 50 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.NRF24L01_Read_Status_Register)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = NRF24L01_Read_Status_Register ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   drv_spi_read_write_byte +
    +
    [Called By]
    • >>   NRF24L01_Clear_IRQ_Flag +
    + +

    NRF24L01_SetPA (Thumb, 36 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.NRF24L01_SetPA)) +

    [Stack]

    • Max Depth = 104
    • Call Chain = NRF24L01_SetPA ⇒ NRF24L01_Write_Reg ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   NRF24L01_Write_Reg +
    • >>   NRF24L01_Read_Reg +
    +
    [Called By]
    • >>   rf_set_PA_Mode +
    • >>   rf_initial +
    + +

    NRF24L01_Set_RxAddr (Thumb, 56 bytes, Stack size 24 bytes, rf24l01 - multi.o(i.NRF24L01_Set_RxAddr)) +

    [Stack]

    • Max Depth = 376
    • Call Chain = NRF24L01_Set_RxAddr ⇒ NRF24L01_Write_Buf ⇒ drv_spi_read_write_byte_N ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   NRF24L01_Write_Buf +
    +
    [Called By]
    • >>   rf_set_syncode +
    + +

    NRF24L01_Set_Speed (Thumb, 60 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.NRF24L01_Set_Speed)) +

    [Stack]

    • Max Depth = 104
    • Call Chain = NRF24L01_Set_Speed ⇒ NRF24L01_Write_Reg ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   NRF24L01_Write_Reg +
    • >>   NRF24L01_Read_Reg +
    +
    [Called By]
    • >>   rf_initial +
    + +

    NRF24L01_Set_TxAddr (Thumb, 34 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.NRF24L01_Set_TxAddr)) +

    [Stack]

    • Max Depth = 368
    • Call Chain = NRF24L01_Set_TxAddr ⇒ NRF24L01_Write_Buf ⇒ drv_spi_read_write_byte_N ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   NRF24L01_Write_Buf +
    +
    [Called By]
    • >>   rf_set_syncode +
    + +

    NRF24L01_Write_Buf (Thumb, 70 bytes, Stack size 280 bytes, rf24l01 - multi.o(i.NRF24L01_Write_Buf)) +

    [Stack]

    • Max Depth = 352
    • Call Chain = NRF24L01_Write_Buf ⇒ drv_spi_read_write_byte_N ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   drv_spi_read_write_byte_N +
    • >>   drv_spi_read_write_byte +
    +
    [Called By]
    • >>   NRF24L01_check +
    • >>   NRF24L01_Set_TxAddr +
    • >>   NRF24L01_Set_RxAddr +
    + +

    NRF24L01_Write_Reg (Thumb, 76 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.NRF24L01_Write_Reg)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = NRF24L01_Write_Reg ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   drv_spi_read_write_byte +
    +
    [Called By]
    • >>   RF24L01_Set_Mode +
    • >>   RF24L01_Chan +
    • >>   NRF24L01_Set_Speed +
    • >>   NRF24L01_SetPA +
    • >>   rf_initial +
    + +

    NRF24L01_Write_Tx_Payload_NoAck (Thumb, 76 bytes, Stack size 272 bytes, rf24l01 - multi.o(i.NRF24L01_Write_Tx_Payload_NoAck)) +

    [Stack]

    • Max Depth = 344
    • Call Chain = NRF24L01_Write_Tx_Payload_NoAck ⇒ drv_spi_read_write_byte_N ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   drv_spi_read_write_byte_N +
    • >>   drv_spi_read_write_byte +
    +
    [Called By]
    • >>   rf_SendPacket +
    + +

    RF24L01_Chan (Thumb, 20 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.RF24L01_Chan)) +

    [Stack]

    • Max Depth = 104
    • Call Chain = RF24L01_Chan ⇒ NRF24L01_Write_Reg ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   NRF24L01_Write_Reg +
    +
    [Called By]
    • >>   rf_setfreq +
    + +

    RF24L01_RxOn (Thumb, 46 bytes, Stack size 8 bytes, rf24l01 - multi.o(i.RF24L01_RxOn)) +

    [Stack]

    • Max Depth = 112
    • Call Chain = RF24L01_RxOn ⇒ RF24L01_Set_Mode ⇒ NRF24L01_Write_Reg ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   gpio_bit_reset +
    • >>   gpio_bit_set +
    • >>   RF24L01_Set_Mode +
    +
    [Called By]
    • >>   rf_setfreq +
    • >>   rf_initial +
    + +

    RF24L01_Set_Mode (Thumb, 46 bytes, Stack size 16 bytes, rf24l01 - multi.o(i.RF24L01_Set_Mode)) +

    [Stack]

    • Max Depth = 104
    • Call Chain = RF24L01_Set_Mode ⇒ NRF24L01_Write_Reg ⇒ drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   NRF24L01_Write_Reg +
    • >>   NRF24L01_Read_Reg +
    +
    [Called By]
    • >>   RF24L01_RxOn +
    • >>   rf_SendPacket +
    + +

    _24R1_delay_us (Thumb, 30 bytes, Stack size 0 bytes, rf24l01 - multi.o(i._24R1_delay_us)) +

    [Called By]

    • >>   DelayUs +
    + +

    drv_spi_read_write_byte (Thumb, 30 bytes, Stack size 24 bytes, rf24l01 - multi.o(i.drv_spi_read_write_byte)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = drv_spi_read_write_byte ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   HW_GD_SPI0_TransmitReceive +
    +
    [Called By]
    • >>   NRF24L01_Read_Buf +
    • >>   NRF24L01_Write_Tx_Payload_NoAck +
    • >>   NRF24L01_Write_Reg +
    • >>   NRF24L01_Write_Buf +
    • >>   NRF24L01_Read_Status_Register +
    • >>   NRF24L01_Read_Reg +
    • >>   NRF24L01_Flush_Tx_Fifo +
    • >>   NRF24L01_Flush_Rx_Fifo +
    • >>   NRF24L01_Clear_IRQ_Flag +
    • >>   rf_SendPacket +
    + +

    drv_spi_read_write_byte_N (Thumb, 36 bytes, Stack size 24 bytes, rf24l01 - multi.o(i.drv_spi_read_write_byte_N)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = drv_spi_read_write_byte_N ⇒ HW_GD_SPI0_TransmitReceive ⇒ HW_GD_SPI_TransmitReceiveOneByte +
    +
    [Calls]
    • >>   HW_GD_SPI0_TransmitReceive +
    +
    [Called By]
    • >>   NRF24L01_Read_Buf +
    • >>   NRF24L01_Write_Tx_Payload_NoAck +
    • >>   NRF24L01_Write_Buf +
    + +

    get_core_version (Thumb, 14 bytes, Stack size 0 bytes, base_core.o(i.get_core_version)) +
    [Address Reference Count : 1]

    • base_core.o(.data) +
    +

    _0x61_AUX_CONFIG_sub (Thumb, 718 bytes, Stack size 72 bytes, base_process_pc_cmd_0x61.o(i._0x61_AUX_CONFIG_sub)) +

    [Stack]

    • Max Depth = 360
    • Call Chain = _0x61_AUX_CONFIG_sub ⇒ process_setup_multi_chan ⇒ base_write_e2prom ⇒ mem_cpy +
    +
    [Calls]
    • >>   set_ext_basicbeacon_startup_flag +
    • >>   process_setup_multi_chan +
    • >>   assert_base_log_mode +
    • >>   pc_cmd_0x61_ack +
    • >>   mem_cpy +
    • >>   base_write_e2prom +
    +
    [Called By]
    • >>   pc_cmd_0x61_process +
    + +

    pcrx_data_fetch (Thumb, 22 bytes, Stack size 16 bytes, base_process_pc_enter.o(i.pcrx_data_fetch)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = pcrx_data_fetch ⇒ queue_out ⇒ mem_cpy +
    +
    [Calls]
    • >>   queue_out +
    +
    [Called By]
    • >>   base_process_pc_data +
    + +

    base_confirm_keypad_crs2_mode (Thumb, 564 bytes, Stack size 88 bytes, base_process_tx_keypad.o(i.base_confirm_keypad_crs2_mode)) +

    [Stack]

    • Max Depth = 176
    • Call Chain = base_confirm_keypad_crs2_mode ⇒ base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   get_base_match_code +
    • >>   _debug_core__record_ackkp_info +
    • >>   base_tx_to_keypad_sub +
    • >>   keypad_crc_check +
    • >>   crc16 +
    +
    [Called By]
    • >>   base_tx_keypad_beacon +
    + +

    base_confirm_keypad_id_mode (Thumb, 174 bytes, Stack size 48 bytes, base_process_tx_keypad.o(i.base_confirm_keypad_id_mode)) +

    [Stack]

    • Max Depth = 136
    • Call Chain = base_confirm_keypad_id_mode ⇒ base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   get_base_match_code +
    • >>   base_tx_to_keypad_sub +
    • >>   keypad_crc_check +
    • >>   crc16 +
    +
    [Called By]
    • >>   base_tx_keypad_beacon +
    + +

    base_confirm_keypad_sn_mode (Thumb, 270 bytes, Stack size 88 bytes, base_process_tx_keypad.o(i.base_confirm_keypad_sn_mode)) +

    [Stack]

    • Max Depth = 176
    • Call Chain = base_confirm_keypad_sn_mode ⇒ base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   get_base_match_code +
    • >>   base_tx_to_keypad_sub +
    • >>   keypad_crc_check +
    • >>   crc16 +
    +
    [Called By]
    • >>   base_tx_keypad_beacon +
    + +

    base_tx_basic_beacon (Thumb, 402 bytes, Stack size 56 bytes, base_process_tx_keypad.o(i.base_tx_basic_beacon)) +

    [Stack]

    • Max Depth = 192
    • Call Chain = base_tx_basic_beacon ⇒ check_send_ext_basic_beacon ⇒ base_tx_ext_basic_beacon ⇒ base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   get_base_match_code +
    • >>   get_base_main_rfchannel +
    • >>   get_base_log_mode +
    • >>   get_base_id +
    • >>   get_ext_basicbeacon_startup_flag +
    • >>   base_tx_to_keypad_sub +
    • >>   check_send_ext_basic_beacon +
    • >>   keypad_idsn_clear +
    • >>   keypad_crc_check +
    • >>   crc16 +
    +
    [Called By]
    • >>   base_tx_keypad_beacon +
    + +

    base_tx_ext_basic_beacon (Thumb, 86 bytes, Stack size 40 bytes, base_process_tx_keypad.o(i.base_tx_ext_basic_beacon)) +

    [Stack]

    • Max Depth = 128
    • Call Chain = base_tx_ext_basic_beacon ⇒ base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   get_base_id +
    • >>   base_tx_to_keypad_sub +
    +
    [Called By]
    • >>   check_send_ext_basic_beacon +
    + +

    base_tx_ext_vbeacon (Thumb, 100 bytes, Stack size 48 bytes, base_process_tx_keypad.o(i.base_tx_ext_vbeacon)) +

    [Stack]

    • Max Depth = 136
    • Call Chain = base_tx_ext_vbeacon ⇒ base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   get_base_main_rfchannel +
    • >>   get_mainRF_usr_id +
    • >>   base_tx_to_keypad_sub +
    +
    [Called By]
    • >>   check_send_ext_vbeacon +
    + +

    base_tx_vote_beacon (Thumb, 548 bytes, Stack size 56 bytes, base_process_tx_keypad.o(i.base_tx_vote_beacon)) +

    [Stack]

    • Max Depth = 200
    • Call Chain = base_tx_vote_beacon ⇒ check_send_ext_vbeacon ⇒ base_tx_ext_vbeacon ⇒ base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   get_base_match_code +
    • >>   get_base_main_rfchannel +
    • >>   get_base_log_mode +
    • >>   get_ext_basicbeacon_startup_flag +
    • >>   base_tx_to_keypad_sub +
    • >>   doule_ant_application +
    • >>   check_send_ext_vbeacon +
    • >>   keypad_idsn_clear +
    • >>   keypad_crc_check +
    • >>   crc16 +
    +
    [Called By]
    • >>   base_tx_keypad_beacon +
    + +

    check_send_ext_basic_beacon (Thumb, 42 bytes, Stack size 8 bytes, base_process_tx_keypad.o(i.check_send_ext_basic_beacon)) +

    [Stack]

    • Max Depth = 136
    • Call Chain = check_send_ext_basic_beacon ⇒ base_tx_ext_basic_beacon ⇒ base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   get_ext_basicbeacon_startup_flag +
    • >>   base_tx_ext_basic_beacon +
    +
    [Called By]
    • >>   base_tx_basic_beacon +
    + +

    check_send_ext_vbeacon (Thumb, 148 bytes, Stack size 8 bytes, base_process_tx_keypad.o(i.check_send_ext_vbeacon)) +

    [Stack]

    • Max Depth = 144
    • Call Chain = check_send_ext_vbeacon ⇒ base_tx_ext_vbeacon ⇒ base_tx_to_keypad_sub ⇒ mem_cpy +
    +
    [Calls]
    • >>   base_tx_ext_vbeacon +
    +
    [Called By]
    • >>   base_tx_vote_beacon +
    + +

    doule_ant_application (Thumb, 50 bytes, Stack size 8 bytes, base_process_tx_keypad.o(i.doule_ant_application)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = doule_ant_application +
    +
    [Called By]
    • >>   base_tx_vote_beacon +
    + +

    calc_next_multi_chan (Thumb, 28 bytes, Stack size 0 bytes, multi_channel.o(i.calc_next_multi_chan)) +

    [Called By]

    • >>   single_relevant_to_multi_chan +
    + +

    e2prom_write_delay_ms (Thumb, 32 bytes, Stack size 0 bytes, multi_channel.o(i.e2prom_write_delay_ms)) +

    [Called By]

    • >>   process_setup_multi_chan +
    • >>   process_setup_single_chan +
    + +

    get_error_info (Thumb, 56 bytes, Stack size 12 bytes, multi_channel.o(i.get_error_info)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = get_error_info +
    +
    [Called By]
    • >>   rf_error_ack_pc +
    + +

    rf_error_ack_pc (Thumb, 68 bytes, Stack size 72 bytes, multi_channel.o(i.rf_error_ack_pc)) +

    [Stack]

    • Max Depth = 84
    • Call Chain = rf_error_ack_pc ⇒ get_error_info +
    +
    [Calls]
    • >>   mem_set +
    • >>   get_error_info +
    +
    [Called By]
    • >>   rf_error_warning +
    + +

    setup_multi_info (Thumb, 90 bytes, Stack size 8 bytes, multi_channel.o(i.setup_multi_info)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = setup_multi_info ⇒ mem_cpy +
    +
    [Calls]
    • >>   mem_cpy +
    • >>   mem_set +
    +
    [Called By]
    • >>   process_setup_multi_chan +
    • >>   process_setup_single_chan +
    • >>   multi_chan_init +
    + +

    fastmatch_lowerPA_ack_sub (Thumb, 66 bytes, Stack size 80 bytes, fucntion_fastmatch.o(i.fastmatch_lowerPA_ack_sub)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = fastmatch_lowerPA_ack_sub ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memclr4 +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   fastmatch_lowerPA_ack +
    + +

    CmdXch (Thumb, 66 bytes, Stack size 0 bytes, function_aes.o(i.CmdXch)) +

    [Called By]

    • >>   rf_Encrypt +
    • >>   rf_Decrypt +
    + +

    Decrypt (Thumb, 62 bytes, Stack size 32 bytes, function_aes.o(i.Decrypt)) +

    [Stack]

    • Max Depth = 436
    • Call Chain = Decrypt ⇒ STM32_AES_ECB_Decrypt ⇒ AES_ECB_Decrypt_Append ⇒ AES_general_SW_dec +
    +
    [Calls]
    • >>   STM32_AES_ECB_Decrypt +
    • >>   AES_Decrypt +
    +
    [Called By]
    • >>   read_keycode +
    • >>   rf_Decrypt +
    + +

    Encrypt (Thumb, 62 bytes, Stack size 32 bytes, function_aes.o(i.Encrypt)) +

    [Stack]

    • Max Depth = 436
    • Call Chain = Encrypt ⇒ STM32_AES_ECB_Encrypt ⇒ AES_ECB_Encrypt_Append ⇒ AES_general_SW_enc +
    +
    [Calls]
    • >>   STM32_AES_ECB_Encrypt +
    • >>   AES_Encrypt +
    +
    [Called By]
    • >>   write_keycode +
    • >>   generate_default_key0_code +
    • >>   rf_Encrypt +
    + +

    aes_test (Thumb, 116 bytes, Stack size 48 bytes, function_aes.o(i.aes_test)) +

    [Stack]

    • Max Depth = 556
    • Call Chain = aes_test ⇒ rf_Decrypt ⇒ Decrypt ⇒ STM32_AES_ECB_Decrypt ⇒ AES_ECB_Decrypt_Append ⇒ AES_general_SW_dec +
    +
    [Calls]
    • >>   rf_Encrypt +
    • >>   rf_Decrypt +
    +
    [Called By]
    • >>   aes_init +
    + +

    generate_default_key0_code (Thumb, 88 bytes, Stack size 8 bytes, function_aes.o(i.generate_default_key0_code)) +

    [Stack]

    • Max Depth = 444
    • Call Chain = generate_default_key0_code ⇒ Encrypt ⇒ STM32_AES_ECB_Encrypt ⇒ AES_ECB_Encrypt_Append ⇒ AES_general_SW_enc +
    +
    [Calls]
    • >>   Encrypt +
    • >>   __aeabi_memclr +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   aes_init +
    + +

    read_AES_config (Thumb, 48 bytes, Stack size 16 bytes, function_aes.o(i.read_AES_config)) +

    [Stack]

    • Max Depth = 16
    • Call Chain = read_AES_config +
    +
    [Called By]
    • >>   aes_init +
    + +

    read_keycode (Thumb, 138 bytes, Stack size 24 bytes, function_aes.o(i.read_keycode)) +

    [Stack]

    • Max Depth = 460
    • Call Chain = read_keycode ⇒ Decrypt ⇒ STM32_AES_ECB_Decrypt ⇒ AES_ECB_Decrypt_Append ⇒ AES_general_SW_dec +
    +
    [Calls]
    • >>   Decrypt +
    +
    [Called By]
    • >>   aes_init +
    + +

    write_keycode (Thumb, 122 bytes, Stack size 48 bytes, function_aes.o(i.write_keycode)) +

    [Stack]

    • Max Depth = 484
    • Call Chain = write_keycode ⇒ Encrypt ⇒ STM32_AES_ECB_Encrypt ⇒ AES_ECB_Encrypt_Append ⇒ AES_general_SW_enc +
    +
    [Calls]
    • >>   Encrypt +
    +
    [Called By]
    • >>   aes_keycode_upgrade +
    + +

    base_broadcast_sub (Thumb, 170 bytes, Stack size 56 bytes, function_broadcast.o(i.base_broadcast_sub)) +

    [Stack]

    • Max Depth = 72
    • Call Chain = base_broadcast_sub ⇒ crc16 +
    +
    [Calls]
    • >>   crc16 +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   base_broadcast_process_2ms5 +
    + +

    _dbg_function__response_pc_cmd (Thumb, 102 bytes, Stack size 80 bytes, function_debug.o(i._dbg_function__response_pc_cmd)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = _dbg_function__response_pc_cmd ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memset +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   _debug_function_enter +
    + +

    check_disturb (Thumb, 52 bytes, Stack size 0 bytes, function_monitor_freq.o(i.check_disturb)) +

    [Called By]

    • >>   monitor_freq_process +
    + +

    monitor_freq_ack_pc (Thumb, 74 bytes, Stack size 80 bytes, function_monitor_freq.o(i.monitor_freq_ack_pc)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = monitor_freq_ack_pc ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memclr4 +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   monitor_freq_process +
    + +

    network_creat_random_delay (Thumb, 16 bytes, Stack size 8 bytes, function_network.o(i.network_creat_random_delay)) +

    [Stack]

    • Max Depth = 56
    • Call Chain = network_creat_random_delay ⇒ network_randtime ⇒ RandData +
    +
    [Calls]
    • >>   network_randtime +
    +
    [Called By]
    • >>   network_polling +
    + +

    calc_valid_list_cnt (Thumb, 58 bytes, Stack size 8 bytes, function_whitelist.o(i.calc_valid_list_cnt)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = calc_valid_list_cnt +
    +
    [Called By]
    • >>   whitelist_write_1zone +
    • >>   whitelist_delete +
    • >>   whitelist_add +
    + +

    get_offset (Thumb, 10 bytes, Stack size 0 bytes, function_whitelist.o(i.get_offset)) +

    [Called By]

    • >>   whitelist_write_1zone +
    • >>   whitelist_read_1zone +
    + +

    whitelist_ack_pc (Thumb, 66 bytes, Stack size 80 bytes, function_whitelist.o(i.whitelist_ack_pc)) +

    [Stack]

    • Max Depth = 88
    • Call Chain = whitelist_ack_pc ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memclr4 +
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   whitelist_enter +
    + +

    whitelist_add (Thumb, 90 bytes, Stack size 24 bytes, function_whitelist.o(i.whitelist_add)) +

    [Stack]

    • Max Depth = 36
    • Call Chain = whitelist_add ⇒ write_list_sub +
    +
    [Calls]
    • >>   write_list_sub +
    • >>   calc_valid_list_cnt +
    +
    [Called By]
    • >>   whitelist_enter +
    + +

    whitelist_delete (Thumb, 86 bytes, Stack size 24 bytes, function_whitelist.o(i.whitelist_delete)) +

    [Stack]

    • Max Depth = 52
    • Call Chain = whitelist_delete ⇒ search_special_list ⇒ memcmp +
    +
    [Calls]
    • >>   auth_special_keypad +
    • >>   calc_valid_list_cnt +
    • >>   search_special_list +
    • >>   __aeabi_memset +
    +
    [Called By]
    • >>   whitelist_enter +
    + +

    whitelist_read_1zone (Thumb, 66 bytes, Stack size 24 bytes, function_whitelist.o(i.whitelist_read_1zone)) +

    [Stack]

    • Max Depth = 24
    • Call Chain = whitelist_read_1zone +
    +
    [Calls]
    • >>   get_offset +
    +
    [Called By]
    • >>   whitelist_enter +
    + +

    whitelist_write_1zone (Thumb, 58 bytes, Stack size 24 bytes, function_whitelist.o(i.whitelist_write_1zone)) +

    [Stack]

    • Max Depth = 36
    • Call Chain = whitelist_write_1zone ⇒ write_list_sub +
    +
    [Calls]
    • >>   auth_all_keypad +
    • >>   write_list_sub +
    • >>   get_offset +
    • >>   calc_valid_list_cnt +
    • >>   whitelist_init +
    +
    [Called By]
    • >>   whitelist_enter +
    + +

    write_list_sub (Thumb, 44 bytes, Stack size 12 bytes, function_whitelist.o(i.write_list_sub)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = write_list_sub +
    +
    [Called By]
    • >>   whitelist_write_1zone +
    • >>   whitelist_add +
    + +

    update_request_pkt_to_pc (Thumb, 64 bytes, Stack size 48 bytes, transparentupgrade.o(i.update_request_pkt_to_pc)) +

    [Stack]

    • Max Depth = 48
    • Call Chain = update_request_pkt_to_pc +
    +
    [Called By]
    • >>   updat__exit +
    • >>   Upgrade_StartGetNextPack +
    + +

    _DoInit (Thumb, 74 bytes, Stack size 8 bytes, segger_rtt.o(i._DoInit)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = _DoInit +
    +
    [Calls]
    • >>   strcpy +
    +
    [Called By]
    • >>   SEGGER_RTT_Write +
    • >>   SEGGER_RTT_ReadNoLock +
    + +

    _GetAvailWriteSpace (Thumb, 28 bytes, Stack size 8 bytes, segger_rtt.o(i._GetAvailWriteSpace)) +

    [Stack]

    • Max Depth = 8
    • Call Chain = _GetAvailWriteSpace +
    +
    [Called By]
    • >>   SEGGER_RTT_WriteNoLock +
    + +

    _WriteBlocking (Thumb, 114 bytes, Stack size 32 bytes, segger_rtt.o(i._WriteBlocking)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = _WriteBlocking ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   SEGGER_RTT_WriteNoLock +
    + +

    _WriteNoCheck (Thumb, 76 bytes, Stack size 32 bytes, segger_rtt.o(i._WriteNoCheck)) +

    [Stack]

    • Max Depth = 40
    • Call Chain = _WriteNoCheck ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   __aeabi_memcpy +
    +
    [Called By]
    • >>   SEGGER_RTT_WriteNoLock +
    + +

    _PrintInt (Thumb, 236 bytes, Stack size 48 bytes, segger_rtt_printf.o(i._PrintInt)) +

    [Stack]

    • Max Depth = 208
    • Call Chain = _PrintInt ⇒ _PrintUnsigned ⇒ _StoreChar ⇒ SEGGER_RTT_Write ⇒ SEGGER_RTT_WriteNoLock ⇒ _WriteNoCheck ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   _StoreChar +
    • >>   _PrintUnsigned +
    +
    [Called By]
    • >>   SEGGER_RTT_vprintf +
    + +

    _PrintUnsigned (Thumb, 230 bytes, Stack size 48 bytes, segger_rtt_printf.o(i._PrintUnsigned)) +

    [Stack]

    • Max Depth = 160
    • Call Chain = _PrintUnsigned ⇒ _StoreChar ⇒ SEGGER_RTT_Write ⇒ SEGGER_RTT_WriteNoLock ⇒ _WriteNoCheck ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   _StoreChar +
    +
    [Called By]
    • >>   SEGGER_RTT_vprintf +
    • >>   _PrintInt +
    + +

    _StoreChar (Thumb, 68 bytes, Stack size 16 bytes, segger_rtt_printf.o(i._StoreChar)) +

    [Stack]

    • Max Depth = 112
    • Call Chain = _StoreChar ⇒ SEGGER_RTT_Write ⇒ SEGGER_RTT_WriteNoLock ⇒ _WriteNoCheck ⇒ __aeabi_memcpy +
    +
    [Calls]
    • >>   SEGGER_RTT_Write +
    +
    [Called By]
    • >>   SEGGER_RTT_vprintf +
    • >>   _PrintUnsigned +
    • >>   _PrintInt +
    + +

    AES_keyschedule_enc_LL (Thumb, 470 bytes, Stack size 12 bytes, crypto.o(i.AES_keyschedule_enc_LL)) +

    [Stack]

    • Max Depth = 12
    • Call Chain = AES_keyschedule_enc_LL +
    +
    [Called By]
    • >>   AESstdInit +
    • >>   AES_keyschedule_dec +
    + +

    AESstdInit (Thumb, 326 bytes, Stack size 24 bytes, crypto.o(i.AESstdInit)) +

    [Stack]

    • Max Depth = 52
    • Call Chain = AESstdInit ⇒ AES_keyschedule_dec ⇒ AES_keyschedule_enc_LL +
    +
    [Calls]
    • >>   AES_keyschedule_enc_LL +
    • >>   AES_keyschedule_dec +
    +
    [Called By]
    • >>   AES_ECB_Encrypt_Init +
    • >>   AES_ECB_Decrypt_Init +
    +

    +

    +Undefined Global Symbols +


    diff --git b/Proj/Objects/Base_GD303.lnp a/Proj/Objects/Base_GD303.lnp new file mode 100644 index 0000000..41924e5 --- /dev/null +++ a/Proj/Objects/Base_GD303.lnp @@ -0,0 +1,72 @@ +--cpu=Cortex-M4.fp.sp +".\objects\main.o" +".\objects\gd32f30x_it.o" +".\objects\custom_hid_itf.o" +".\objects\gd32f30x_usbd_hw.o" +".\objects\system_gd32f30x.o" +".\objects\gd32f30x_dma.o" +".\objects\gd32f30x_exmc.o" +".\objects\gd32f30x_exti.o" +".\objects\gd32f30x_fmc.o" +".\objects\gd32f30x_gpio.o" +".\objects\gd32f30x_misc.o" +".\objects\gd32f30x_pmu.o" +".\objects\gd32f30x_rcu.o" +".\objects\gd32f30x_spi.o" +".\objects\gd32f30x_timer.o" +".\objects\gd32f30x_usart.o" +".\objects\startup_gd32f30x_hd.o" +".\objects\usbd_lld_core.o" +".\objects\usbd_lld_int.o" +".\objects\usbd_core.o" +".\objects\usbd_enum.o" +".\objects\usbd_pwr.o" +".\objects\usbd_transc.o" +".\objects\custom_hid_core.o" +".\objects\buzzer.o" +".\objects\i2c.o" +".\objects\led.o" +".\objects\platform.o" +".\objects\rf24l01 - multi.o" +".\objects\hw_mcuio.o" +".\objects\base_core.o" +".\objects\base_process_pc_cmd_0x60.o" +".\objects\base_process_pc_cmd_0x61.o" +".\objects\base_process_pc_enter.o" +".\objects\base_process_rx_keypad.o" +".\objects\base_process_tx_keypad.o" +".\objects\base_timer.o" +".\objects\common_math.o" +".\objects\debug.o" +".\objects\function_e2prom.o" +".\objects\multi_channel.o" +".\objects\queue_circle.o" +".\objects\transfer_keypad_pc.o" +".\objects\vote__process.o" +".\objects\vote__report.o" +".\objects\fucntion_base_test.o" +".\objects\fucntion_fastmatch.o" +".\objects\fucntion_text_message.o" +".\objects\function.o" +".\objects\function_aes.o" +".\objects\function_broadcast.o" +".\objects\function_debug.o" +".\objects\function_monitor_freq.o" +".\objects\function_network.o" +".\objects\function_nfc.o" +".\objects\function_t2_display.o" +".\objects\function_txmsg_beacon.o" +".\objects\function_update_keypad.o" +".\objects\function_update_keypad_5g8.o" +".\objects\function_upload_multipkt.o" +".\objects\function_whitelist.o" +".\objects\transparentupgrade.o" +".\objects\aes.o" +"..\Base_core\AESLIB\STM32_Cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib" +"..\Base_core\AESLIB\STM32_Cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib" +".\objects\segger_rtt.o" +".\objects\segger_rtt_printf.o" +--library_type=microlib --strict --scatter ".\Objects\Base_GD303.sct" +--summary_stderr --info summarysizes --map --load_addr_map_info --xref --callgraph --symbols +--info sizes --info totals --info unused --info veneers +--list ".\Listings\Base_GD303.map" -o .\Objects\Base_GD303.axf \ No newline at end of file diff --git b/Proj/Objects/Base_GD303.sct a/Proj/Objects/Base_GD303.sct new file mode 100644 index 0000000..7e916d9 --- /dev/null +++ a/Proj/Objects/Base_GD303.sct @@ -0,0 +1,16 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00080000 { ; load region size_region + ER_IROM1 0x08000000 0x00080000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x00010000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git b/Proj/Objects/Base_GD303_C100B.dep a/Proj/Objects/Base_GD303_C100B.dep new file mode 100644 index 0000000..cad904c --- /dev/null +++ a/Proj/Objects/Base_GD303_C100B.dep @@ -0,0 +1,1577 @@ +Dependencies for Project 'Base_GD303', Target 'C100B': (DO NOT MODIFY !) +CompilerVersion: 5060960::V5.06 update 7 (build 960)::.\ARMCC +F (..\Src\main.c)(0x62DA1660)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\main.o --omf_browse .\objects\main.crf --depend .\objects\main.d) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h)(0x62D51236) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h)(0x61CC215C) +I (..\inc\usbd_hw.h)(0x61CC2161) +I (..\Base_core\user_lib\platform.h)(0x6296E86F) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (..\Base_core\user_lib\HW_MCUIO.h)(0x62D8F349) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +F (..\Src\gd32f30x_it.c)(0x62D9FE06)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_it.o --omf_browse .\objects\gd32f30x_it.crf --depend .\objects\gd32f30x_it.d) +I (..\inc\gd32f30x_it.h)(0x61CC2161) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_int.h)(0x61CC215D) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_pwr.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h)(0x62D51236) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h)(0x61CC215C) +I (..\Base_core\user_lib\HW_MCUIO.h)(0x62D8F349) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\user_lib\platform.h)(0x6296E86F) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +F (..\Src\custom_hid_itf.c)(0x62D4F5F9)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\custom_hid_itf.o --omf_browse .\objects\custom_hid_itf.crf --depend .\objects\custom_hid_itf.d) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h)(0x62D51236) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h)(0x61CC215C) +F (..\Src\gd32f30x_usbd_hw.c)(0x62DA15E4)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_usbd_hw.o --omf_browse .\objects\gd32f30x_usbd_hw.crf --depend .\objects\gd32f30x_usbd_hw.d) +I (..\inc\usbd_hw.h)(0x61CC2161) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Utilities\gd32f303e_eval.c)(0x62D4F722)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f303e_eval.o --omf_browse .\objects\gd32f303e_eval.crf --depend .\objects\gd32f303e_eval.d) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Utilities\gd32f303e_eval.h)(0x61CC215B) +F (..\Src\system_gd32f30x.c)(0x62D111FA)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\system_gd32f30x.o --omf_browse .\objects\system_gd32f30x.crf --depend .\objects\system_gd32f30x.d) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_dma.c)(0x61CC215B)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_dma.o --omf_browse .\objects\gd32f30x_dma.crf --depend .\objects\gd32f30x_dma.d) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) +F (..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_exmc.c)(0x61CC215B)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_exmc.o --omf_browse .\objects\gd32f30x_exmc.crf --depend .\objects\gd32f30x_exmc.d) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +F (..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_exti.c)(0x61CC215B)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_exti.o --omf_browse .\objects\gd32f30x_exti.crf --depend .\objects\gd32f30x_exti.d) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_fmc.c)(0x61CC215B)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_fmc.o --omf_browse .\objects\gd32f30x_fmc.crf --depend .\objects\gd32f30x_fmc.d) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_gpio.c)(0x621F1039)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_gpio.o --omf_browse .\objects\gd32f30x_gpio.crf --depend .\objects\gd32f30x_gpio.d) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_misc.c)(0x61CC215B)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_misc.o --omf_browse .\objects\gd32f30x_misc.crf --depend .\objects\gd32f30x_misc.d) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_pmu.c)(0x621F2C7F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_pmu.o --omf_browse .\objects\gd32f30x_pmu.crf --depend .\objects\gd32f30x_pmu.d) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_rcu.c)(0x61CC215B)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_rcu.o --omf_browse .\objects\gd32f30x_rcu.crf --depend .\objects\gd32f30x_rcu.d) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_spi.c)(0x61CC215B)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_spi.o --omf_browse .\objects\gd32f30x_spi.crf --depend .\objects\gd32f30x_spi.d) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_timer.c)(0x61CC215B)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_timer.o --omf_browse .\objects\gd32f30x_timer.crf --depend .\objects\gd32f30x_timer.d) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_usart.c)(0x61CC215B)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\gd32f30x_usart.o --omf_browse .\objects\gd32f30x_usart.crf --depend .\objects\gd32f30x_usart.d) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f30x_hd.s)(0x62D4D0D1)(--cpu Cortex-M4.fp.sp -g --apcs=interwork --pd "__MICROLIB SETA 1" -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include --pd "__UVISION_VERSION SETA 536" --pd "GD32F30X_HD SETA 1" --list .\listings\startup_gd32f30x_hd.lst --xref -o .\objects\startup_gd32f30x_hd.o --depend .\objects\startup_gd32f30x_hd.d) +F (..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_core.c)(0x62D1022C)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\usbd_lld_core.o --omf_browse .\objects\usbd_lld_core.crf --depend .\objects\usbd_lld_core.d) +I (..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_core.h)(0x61CC215D) +I (..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_regs.h)(0x61CC215D) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h)(0x61CC215C) +F (..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_int.c)(0x61CC215D)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\usbd_lld_int.o --omf_browse .\objects\usbd_lld_int.crf --depend .\objects\usbd_lld_int.d) +I (..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_int.h)(0x61CC215D) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_pwr.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_core.h)(0x61CC215D) +I (..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_regs.h)(0x61CC215D) +F (..\Drivers\GD32F30x_usbd_library\device\Source\usbd_core.c)(0x61CC215C)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\usbd_core.o --omf_browse .\objects\usbd_core.crf --depend .\objects\usbd_core.d) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_transc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_core.h)(0x61CC215D) +I (..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_regs.h)(0x61CC215D) +F (..\Drivers\GD32F30x_usbd_library\device\Source\usbd_enum.c)(0x61CC215C)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\usbd_enum.o --omf_browse .\objects\usbd_enum.crf --depend .\objects\usbd_enum.d) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_transc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_usbd_library\device\Source\usbd_pwr.c)(0x61CC215C)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\usbd_pwr.o --omf_browse .\objects\usbd_pwr.crf --depend .\objects\usbd_pwr.d) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_pwr.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_usbd_library\device\Source\usbd_transc.c)(0x61CC215C)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\usbd_transc.o --omf_browse .\objects\usbd_transc.crf --depend .\objects\usbd_transc.d) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_transc.h)(0x61CC215C) +F (..\Drivers\GD32F30x_usbd_library\class\device\hid\Source\custom_hid_core.c)(0x62D8FE36)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\custom_hid_core.o --omf_browse .\objects\custom_hid_core.crf --depend .\objects\custom_hid_core.d) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_transc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h)(0x62D51236) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +F (..\Base_core\user_driver\A5130_5G8.c)(0x62D66DB5)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\a5130_5g8.o --omf_browse .\objects\a5130_5g8.crf --depend .\objects\a5130_5g8.d) +F (..\Base_core\user_driver\cc2500_1101 - multi.C)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o ".\objects\cc2500_1101 - multi.o" --omf_browse ".\objects\cc2500_1101 - multi.crf" --depend ".\objects\cc2500_1101 - multi.d") +I (..\Base_core\user_lib\cc2500_1101.h)(0x6296E86F) +I (..\Base_core\user_lib\platform.h)(0x6296E86F) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\user_driver\char_std8x16.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\char_std8x16.o --omf_browse .\objects\char_std8x16.crf --depend .\objects\char_std8x16.d) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +F (..\Base_core\user_driver\Chinese_12x12.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\chinese_12x12.o --omf_browse .\objects\chinese_12x12.crf --depend .\objects\chinese_12x12.d) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +F (..\Base_core\user_driver\lcd_driver.c)(0x62D60CF4)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\lcd_driver.o --omf_browse .\objects\lcd_driver.crf --depend .\objects\lcd_driver.d) +F (..\Base_core\user_driver\MF522.c)(0x62D60CF4)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\mf522.o --omf_browse .\objects\mf522.crf --depend .\objects\mf522.d) +I (..\Base_core\user_lib\MF522.h)(0x6296E86F) +F (..\Base_core\user_driver\buzzer.c)(0x62D8F4B9)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\buzzer.o --omf_browse .\objects\buzzer.crf --depend .\objects\buzzer.d) +I (..\Base_core\user_lib\HW_MCUIO.h)(0x62D8F349) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Base_core\user_lib\platform.h)(0x6296E86F) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +F (..\Base_core\user_driver\i2c.c)(0x62D66D0C)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\i2c.o --omf_browse .\objects\i2c.crf --depend .\objects\i2c.d) +I (..\Base_core\user_lib\HW_MCUIO.h)(0x62D8F349) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Base_core\user_lib\platform.h)(0x6296E86F) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +F (..\Base_core\user_driver\led.c)(0x62D76603)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\led.o --omf_browse .\objects\led.crf --depend .\objects\led.d) +I (..\Base_core\user_lib\HW_MCUIO.h)(0x62D8F349) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Base_core\user_lib\platform.h)(0x6296E86F) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +F (..\Base_core\user_driver\platform.c)(0x62DA0ECE)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\platform.o --omf_browse .\objects\platform.crf --depend .\objects\platform.d) +I (..\Base_core\user_lib\platform.h)(0x6296E86F) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\user_lib\HW_MCUIO.h)(0x62D8F349) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (..\inc\usbd_hw.h)(0x61CC2161) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h)(0x62D51236) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h)(0x61CC215C) +F (..\Base_core\user_driver\RF24L01 - multi.c)(0x62D7C31C)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o ".\objects\rf24l01 - multi.o" --omf_browse ".\objects\rf24l01 - multi.crf" --depend ".\objects\rf24l01 - multi.d") +I (..\Base_core\user_lib\RF24L01.h)(0x62D66D77) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\user_lib\platform.h)(0x6296E86F) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (..\Base_core\user_lib\HW_MCUIO.h)(0x62D8F349) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Base_core\user_driver\HW_MCUIO.c)(0x62DA16BC)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\hw_mcuio.o --omf_browse .\objects\hw_mcuio.crf --depend .\objects\hw_mcuio.d) +I (..\Base_core\user_lib\HW_MCUIO.h)(0x62D8F349) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h)(0x62D51236) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h)(0x61CC215C) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h)(0x62D761A2) +I (..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h)(0x61CC215C) +I (..\inc\usbd_conf.h)(0x62D5079E) +I (..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h)(0x61CC215C) +I (..\inc\usbd_hw.h)(0x61CC2161) +F (..\Base_core\core_src\base_core.c)(0x62CD0F7D)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\base_core.o --omf_browse .\objects\base_core.crf --depend .\objects\base_core.d) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (..\RTT\SEGGER_RTT.h)(0x6296E86F) +I (..\RTT\SEGGER_RTT_Conf.h)(0x62BC0973) +F (..\Base_core\core_src\base_process_pc_cmd_0x60.c)(0x62C6A733)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\base_process_pc_cmd_0x60.o --omf_browse .\objects\base_process_pc_cmd_0x60.crf --depend .\objects\base_process_pc_cmd_0x60.d) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\core_src\base_process_pc_cmd_0x61.c)(0x62BBBC4C)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\base_process_pc_cmd_0x61.o --omf_browse .\objects\base_process_pc_cmd_0x61.crf --depend .\objects\base_process_pc_cmd_0x61.d) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\core_src\base_process_pc_enter.c)(0x62D90819)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\base_process_pc_enter.o --omf_browse .\objects\base_process_pc_enter.crf --depend .\objects\base_process_pc_enter.d) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\core_src\base_process_rx_keypad.c)(0x62B967D0)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\base_process_rx_keypad.o --omf_browse .\objects\base_process_rx_keypad.crf --depend .\objects\base_process_rx_keypad.d) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\core_src\base_process_tx_keypad.c)(0x62BBFB8B)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\base_process_tx_keypad.o --omf_browse .\objects\base_process_tx_keypad.crf --depend .\objects\base_process_tx_keypad.d) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\core_src\base_timer.c)(0x62DA16E7)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\base_timer.o --omf_browse .\objects\base_timer.crf --depend .\objects\base_timer.d) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\core_src\common_math.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\common_math.o --omf_browse .\objects\common_math.crf --depend .\objects\common_math.d) +I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374) +I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +F (..\Base_core\core_src\debug.c)(0x62B952C4)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\debug.o --omf_browse .\objects\debug.crf --depend .\objects\debug.d) +I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374) +I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\core_src\function_e2prom.c)(0x62B51B17)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_e2prom.o --omf_browse .\objects\function_e2prom.crf --depend .\objects\function_e2prom.d) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\core_src\multi_channel.c)(0x62BBBC4C)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\multi_channel.o --omf_browse .\objects\multi_channel.crf --depend .\objects\multi_channel.d) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\core_src\Queue_circle.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\queue_circle.o --omf_browse .\objects\queue_circle.crf --depend .\objects\queue_circle.d) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +F (..\Base_core\core_src\transfer_keypad_pc.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\transfer_keypad_pc.o --omf_browse .\objects\transfer_keypad_pc.crf --depend .\objects\transfer_keypad_pc.d) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\core_src\vote__process.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\vote__process.o --omf_browse .\objects\vote__process.crf --depend .\objects\vote__process.d) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +F (..\Base_core\core_src\vote__report.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\vote__report.o --omf_browse .\objects\vote__report.crf --depend .\objects\vote__report.d) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\func_src\fucntion_base_test.c)(0x6296FF18)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\fucntion_base_test.o --omf_browse .\objects\fucntion_base_test.crf --depend .\objects\fucntion_base_test.d) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +F (..\Base_core\func_src\fucntion_fastmatch.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\fucntion_fastmatch.o --omf_browse .\objects\fucntion_fastmatch.crf --depend .\objects\fucntion_fastmatch.d) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +F (..\Base_core\func_src\fucntion_text_message.c)(0x62B53A30)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\fucntion_text_message.o --omf_browse .\objects\fucntion_text_message.crf --depend .\objects\fucntion_text_message.d) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Base_core\core_lib\base_pc_protocol.h)(0x62B2CF1D) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +F (..\Base_core\func_src\function.c)(0x62B912A1)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function.o --omf_browse .\objects\function.crf --depend .\objects\function.d) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +F (..\Base_core\func_src\function_AES.c)(0x62D8F66E)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_aes.o --omf_browse .\objects\function_aes.crf --depend .\objects\function_aes.d) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (..\Base_core\AESLIB\AES\AES.h)(0x62D8FA06) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\crypto.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\config.h)(0x6296E86F) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/types.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/macros.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/err_codes.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/sk.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/aes.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/Common/aes_low_level.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/Common/aes_common.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/ECB/aes_ecb.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CBC/aes_cbc.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CTR/aes_ctr.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CFB/aes_cfb.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/OFB/aes_ofb.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/XTS/aes_xts.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/GCM/aes_gcm.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CCM/aes_ccm.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CMAC/aes_cmac.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/KEYWRAP/aes_keywrap.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/des.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/Common/des_common.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/ECB/des_ecb.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/CBC/des_cbc.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/tdes.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/Common/tdes_common.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/ECB/tdes_ecb.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/CBC/tdes_cbc.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\ARC4/arc4.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/hash.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/hash_common.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/MD5/md5.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/MD5/hmac_md5.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA1/sha1.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA1/hmac_sha1.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA224/sha224.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/sha256_sha224_transform.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA224/hmac_sha224.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA256/sha256.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA256/hmac_sha256.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA384/sha384.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/sha512_sha384_transform.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA384/hmac_sha384.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/sha512.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/hmac_sha512.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/hkdf512.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/math.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/bn.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/conv.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/arith.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/monty.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/modular.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/rng_bn.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/../../../RNG/rng.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/../../../RNG/DRBG_AES128/drbg.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/rsa.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/PKCS#1v15/rsa_pkcs1v15.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/LowLevel/rsa_low_level.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\ECC/ecc.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\ECC/../Common_ecc_rsa/MATH/math.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\POLY1305/poly1305.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\ED25519/ed25519.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\C25519/c25519.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\CHACHA/chacha.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\CHACHA20-POLY1305/chacha20-poly1305.h)(0x6296E86F) +I (..\Base_core\user_lib\HW_MCUIO.h)(0x62D8F349) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Base_core\func_src\function_broadcast.c)(0x62B50FB4)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_broadcast.o --omf_browse .\objects\function_broadcast.crf --depend .\objects\function_broadcast.d) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\func_src\function_debug.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_debug.o --omf_browse .\objects\function_debug.crf --depend .\objects\function_debug.d) +I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374) +I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +F (..\Base_core\func_src\function_monitor_freq.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_monitor_freq.o --omf_browse .\objects\function_monitor_freq.crf --depend .\objects\function_monitor_freq.d) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +F (..\Base_core\func_src\function_network.c)(0x62D7C5E4)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_network.o --omf_browse .\objects\function_network.crf --depend .\objects\function_network.d) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\base_core.h)(0x62B3D44A) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) +I (..\Base_core\user_lib\HW_MCUIO.h)(0x62D8F349) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h)(0x62D10AED) +I (..\Drivers\CMSIS\core_cm4.h)(0x61CC215C) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Drivers\CMSIS\core_cmInstr.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cmFunc.h)(0x61CC215C) +I (..\Drivers\CMSIS\core_cm4_simd.h)(0x61CC215C) +I (..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h)(0x61CC215C) +I (..\inc\gd32f30x_libopt.h)(0x61CC2161) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h)(0x61CC215C) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h)(0x61CC215B) +I (..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h)(0x61CC215C) +F (..\Base_core\func_src\function_NFC.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_nfc.o --omf_browse .\objects\function_nfc.crf --depend .\objects\function_nfc.d) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\func_src\function_T2_display.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_t2_display.o --omf_browse .\objects\function_t2_display.crf --depend .\objects\function_t2_display.d) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\user_lib\dot.h)(0x6296E86F) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\func_src\function_txmsg_beacon.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_txmsg_beacon.o --omf_browse .\objects\function_txmsg_beacon.crf --depend .\objects\function_txmsg_beacon.d) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +F (..\Base_core\func_src\function_update_keypad.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_update_keypad.o --omf_browse .\objects\function_update_keypad.crf --depend .\objects\function_update_keypad.d) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +F (..\Base_core\func_src\function_update_keypad_5G8.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_update_keypad_5g8.o --omf_browse .\objects\function_update_keypad_5g8.crf --depend .\objects\function_update_keypad_5g8.d) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +F (..\Base_core\func_src\function_upload_multipkt.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_upload_multipkt.o --omf_browse .\objects\function_upload_multipkt.crf --depend .\objects\function_upload_multipkt.d) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +F (..\Base_core\func_src\function_whitelist.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\function_whitelist.o --omf_browse .\objects\function_whitelist.crf --depend .\objects\function_whitelist.d) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (..\Base_core\core_lib\function_interface.h)(0x62B3D5D0) +F (..\Base_core\func_src\TransparentUpgrade.c)(0x62B912A1)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\transparentupgrade.o --omf_browse .\objects\transparentupgrade.crf --depend .\objects\transparentupgrade.d) +I (..\Base_core\core_lib\base_core_user.h)(0x62B4322A) +I (..\Base_core\user_lib\function.h)(0x62B53A4F) +I (..\inc\base_config.h)(0x62BBB799) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (..\Base_core\core_lib\platform_interface.h)(0x62BBBC4B) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +F (..\Base_core\AESLIB\AES\AES.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\aes.o --omf_browse .\objects\aes.crf --depend .\objects\aes.d) +I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) +I (C:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374) +I (C:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378) +I (C:\Keil_v5\ARM\ARMCC\include\ctype.h)(0x60252376) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +I (C:\Keil_v5\ARM\ARMCC\include\stdbool.h)(0x6025237C) +I (C:\Keil_v5\ARM\ARMCC\include\stddef.h)(0x6025237E) +I (C:\Keil_v5\ARM\ARMCC\include\stdint.h)(0x6025237E) +I (..\Base_core\AESLIB\AES\AES.h)(0x62D8FA06) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\crypto.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\config.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/types.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/macros.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/err_codes.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/sk.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/aes.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/Common/aes_low_level.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/Common/aes_common.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/ECB/aes_ecb.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CBC/aes_cbc.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CTR/aes_ctr.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CFB/aes_cfb.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/OFB/aes_ofb.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/XTS/aes_xts.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/GCM/aes_gcm.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CCM/aes_ccm.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CMAC/aes_cmac.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/KEYWRAP/aes_keywrap.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/des.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/Common/des_common.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/ECB/des_ecb.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/CBC/des_cbc.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/tdes.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/Common/tdes_common.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/ECB/tdes_ecb.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/CBC/tdes_cbc.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\ARC4/arc4.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/hash.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/hash_common.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/MD5/md5.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/MD5/hmac_md5.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA1/sha1.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA1/hmac_sha1.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA224/sha224.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/sha256_sha224_transform.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA224/hmac_sha224.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA256/sha256.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA256/hmac_sha256.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA384/sha384.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/sha512_sha384_transform.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA384/hmac_sha384.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/sha512.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/hmac_sha512.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/hkdf512.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/math.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/bn.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/conv.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/arith.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/monty.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/modular.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/rng_bn.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/../../../RNG/rng.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/../../../RNG/DRBG_AES128/drbg.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/rsa.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/PKCS#1v15/rsa_pkcs1v15.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/LowLevel/rsa_low_level.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\ECC/ecc.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\ECC/../Common_ecc_rsa/MATH/math.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\POLY1305/poly1305.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\ED25519/ed25519.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\C25519/c25519.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\CHACHA/chacha.h)(0x6296E86F) +I (..\Base_core\AESLIB\STM32_Cryptographic\Inc\CHACHA20-POLY1305/chacha20-poly1305.h)(0x6296E86F) +F (..\Base_core\AESLIB\STM32_Cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_otslsm1elfspf.lib)(0x6296E86F)() +F (..\Base_core\AESLIB\STM32_Cryptographic\Lib\STM32CryptographicV3.0.0_CM4_KEIL_slsm1elfspf.lib)(0x6296E86F)() +F (..\RTT\SEGGER_RTT.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\segger_rtt.o --omf_browse .\objects\segger_rtt.crf --depend .\objects\segger_rtt.d) +I (..\RTT\SEGGER_RTT.h)(0x6296E86F) +I (..\RTT\SEGGER_RTT_Conf.h)(0x62BC0973) +I (C:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) +F (..\RTT\SEGGER_RTT_printf.c)(0x6296E86F)(-c --cpu Cortex-M4.fp.sp -D__MICROLIB -g -O0 --apcs=interwork --split_sections -I ..\inc -I ..\Drivers\CMSIS\GD\GD32F30x\Include -I ..\Drivers\GD32F30x_standard_peripheral\Include -I ..\Drivers\GD32F30x_usbd_library\usbd\Include -I ..\Drivers\GD32F30x_usbd_library\device\Include -I ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include -I ..\Drivers\CMSIS -I ..\Base_core\core_lib -I ..\Base_core\user_lib -I ..\Base_core\AESLIB\AES -I ..\Base_core\AESLIB\STM32_Cryptographic\Inc -I ..\Utilities -I ..\RTT --c99 -IC:\Users\Administrator\AppData\Local\Arm\Packs\GigaDevice\GD32F30x_DFP\2.1.0\Device\Include -D__UVISION_VERSION="536" -DGD32F30X_HD -DUSE_STDPERIPH_DRIVER -DGD32F30X_HD -o .\objects\segger_rtt_printf.o --omf_browse .\objects\segger_rtt_printf.crf --depend .\objects\segger_rtt_printf.d) +I (..\RTT\SEGGER_RTT.h)(0x6296E86F) +I (..\RTT\SEGGER_RTT_Conf.h)(0x62BC0973) +I (C:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) +I (C:\Keil_v5\ARM\ARMCC\include\stdarg.h)(0x60252376) diff --git b/Proj/Objects/ExtDll.iex a/Proj/Objects/ExtDll.iex new file mode 100644 index 0000000..6c0896e --- /dev/null +++ a/Proj/Objects/ExtDll.iex @@ -0,0 +1,2 @@ +[EXTDLL] +Count=0 diff --git b/Proj/Objects/a5130_5g8.d a/Proj/Objects/a5130_5g8.d new file mode 100644 index 0000000..0871dad --- /dev/null +++ a/Proj/Objects/a5130_5g8.d @@ -0,0 +1 @@ +.\objects\a5130_5g8.o: ..\Base_core\user_driver\A5130_5G8.c diff --git b/Proj/Objects/aes.crf a/Proj/Objects/aes.crf new file mode 100644 index 0000000..7f0ab0b --- /dev/null +++ a/Proj/Objects/aes.crf diff --git b/Proj/Objects/aes.d a/Proj/Objects/aes.d new file mode 100644 index 0000000..6c947e1 --- /dev/null +++ a/Proj/Objects/aes.d @@ -0,0 +1,75 @@ +.\objects\aes.o: ..\Base_core\AESLIB\AES\AES.c +.\objects\aes.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h +.\objects\aes.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h +.\objects\aes.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h +.\objects\aes.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\ctype.h +.\objects\aes.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\aes.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h +.\objects\aes.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stddef.h +.\objects\aes.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\aes.o: ..\Base_core\AESLIB\AES\AES.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\crypto.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\config.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/types.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/macros.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/err_codes.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/err_codes.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/sk.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/aes.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/Common/aes_low_level.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/Common/aes_common.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/ECB/aes_ecb.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CBC/aes_cbc.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CTR/aes_ctr.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CFB/aes_cfb.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/OFB/aes_ofb.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/XTS/aes_xts.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/GCM/aes_gcm.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CCM/aes_ccm.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CMAC/aes_cmac.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/KEYWRAP/aes_keywrap.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/des.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/Common/des_common.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/ECB/des_ecb.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/CBC/des_cbc.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/tdes.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/Common/tdes_common.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/ECB/tdes_ecb.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/CBC/tdes_cbc.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\ARC4/arc4.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/hash.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/hash_common.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/MD5/md5.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/MD5/hmac_md5.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA1/sha1.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA1/hmac_sha1.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA224/sha224.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/sha256_sha224_transform.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA224/hmac_sha224.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA256/sha256.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA256/hmac_sha256.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA384/sha384.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/sha512_sha384_transform.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA384/hmac_sha384.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/sha512.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/hmac_sha512.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/hkdf512.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/math.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/bn.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/conv.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/arith.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/monty.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/modular.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/rng_bn.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/../../../RNG/rng.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/../../../RNG/DRBG_AES128/drbg.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/rsa.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/PKCS#1v15/rsa_pkcs1v15.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/LowLevel/rsa_low_level.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\ECC/ecc.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\ECC/../Common_ecc_rsa/MATH/math.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\POLY1305/poly1305.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\ED25519/ed25519.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\C25519/c25519.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\CHACHA/chacha.h +.\objects\aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\CHACHA20-POLY1305/chacha20-poly1305.h diff --git b/Proj/Objects/aes.o a/Proj/Objects/aes.o new file mode 100644 index 0000000..54391e1 --- /dev/null +++ a/Proj/Objects/aes.o diff --git b/Proj/Objects/base_core.crf a/Proj/Objects/base_core.crf new file mode 100644 index 0000000..eb39885 --- /dev/null +++ a/Proj/Objects/base_core.crf diff --git b/Proj/Objects/base_core.d a/Proj/Objects/base_core.d new file mode 100644 index 0000000..6fb6dfb --- /dev/null +++ a/Proj/Objects/base_core.d @@ -0,0 +1,10 @@ +.\objects\base_core.o: ..\Base_core\core_src\base_core.c +.\objects\base_core.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\base_core.o: ..\Base_core\core_lib\base_core.h +.\objects\base_core.o: ..\inc\base_config.h +.\objects\base_core.o: ..\Base_core\core_lib\base_core_user.h +.\objects\base_core.o: ..\Base_core\core_lib\platform_interface.h +.\objects\base_core.o: ..\Base_core\core_lib\function_interface.h +.\objects\base_core.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\base_core.o: ..\RTT\SEGGER_RTT.h +.\objects\base_core.o: ..\RTT\SEGGER_RTT_Conf.h diff --git b/Proj/Objects/base_core.o a/Proj/Objects/base_core.o new file mode 100644 index 0000000..d1da6ba --- /dev/null +++ a/Proj/Objects/base_core.o diff --git b/Proj/Objects/base_process_5g8_rx.crf a/Proj/Objects/base_process_5g8_rx.crf new file mode 100644 index 0000000..0150a20 --- /dev/null +++ a/Proj/Objects/base_process_5g8_rx.crf diff --git b/Proj/Objects/base_process_5g8_rx.d a/Proj/Objects/base_process_5g8_rx.d new file mode 100644 index 0000000..f540d80 --- /dev/null +++ a/Proj/Objects/base_process_5g8_rx.d @@ -0,0 +1,7 @@ +.\objects\base_process_5g8_rx.o: ..\Base_core\core_src\base_process_5G8_rx.c +.\objects\base_process_5g8_rx.o: ..\Base_core\core_lib\base_core.h +.\objects\base_process_5g8_rx.o: ..\inc\base_config.h +.\objects\base_process_5g8_rx.o: ..\Base_core\core_lib\base_core_user.h +.\objects\base_process_5g8_rx.o: ..\Base_core\core_lib\platform_interface.h +.\objects\base_process_5g8_rx.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\base_process_5g8_rx.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/base_process_5g8_rx.o a/Proj/Objects/base_process_5g8_rx.o new file mode 100644 index 0000000..35250b3 --- /dev/null +++ a/Proj/Objects/base_process_5g8_rx.o diff --git b/Proj/Objects/base_process_5g8_tx.crf a/Proj/Objects/base_process_5g8_tx.crf new file mode 100644 index 0000000..b01a839 --- /dev/null +++ a/Proj/Objects/base_process_5g8_tx.crf diff --git b/Proj/Objects/base_process_5g8_tx.d a/Proj/Objects/base_process_5g8_tx.d new file mode 100644 index 0000000..8c9e8ec --- /dev/null +++ a/Proj/Objects/base_process_5g8_tx.d @@ -0,0 +1,7 @@ +.\objects\base_process_5g8_tx.o: ..\Base_core\core_src\base_process_5G8_tx.c +.\objects\base_process_5g8_tx.o: ..\Base_core\core_lib\base_core_user.h +.\objects\base_process_5g8_tx.o: ..\Base_core\core_lib\base_core.h +.\objects\base_process_5g8_tx.o: ..\inc\base_config.h +.\objects\base_process_5g8_tx.o: ..\Base_core\core_lib\platform_interface.h +.\objects\base_process_5g8_tx.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\base_process_5g8_tx.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/base_process_5g8_tx.o a/Proj/Objects/base_process_5g8_tx.o new file mode 100644 index 0000000..c2fe7e5 --- /dev/null +++ a/Proj/Objects/base_process_5g8_tx.o diff --git b/Proj/Objects/base_process_pc_cmd_0x60.crf a/Proj/Objects/base_process_pc_cmd_0x60.crf new file mode 100644 index 0000000..09b04e9 --- /dev/null +++ a/Proj/Objects/base_process_pc_cmd_0x60.crf diff --git b/Proj/Objects/base_process_pc_cmd_0x60.d a/Proj/Objects/base_process_pc_cmd_0x60.d new file mode 100644 index 0000000..717e818 --- /dev/null +++ a/Proj/Objects/base_process_pc_cmd_0x60.d @@ -0,0 +1,7 @@ +.\objects\base_process_pc_cmd_0x60.o: ..\Base_core\core_src\base_process_pc_cmd_0x60.c +.\objects\base_process_pc_cmd_0x60.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\base_process_pc_cmd_0x60.o: ..\Base_core\core_lib\base_core.h +.\objects\base_process_pc_cmd_0x60.o: ..\inc\base_config.h +.\objects\base_process_pc_cmd_0x60.o: ..\Base_core\core_lib\base_core_user.h +.\objects\base_process_pc_cmd_0x60.o: ..\Base_core\core_lib\platform_interface.h +.\objects\base_process_pc_cmd_0x60.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/base_process_pc_cmd_0x60.o a/Proj/Objects/base_process_pc_cmd_0x60.o new file mode 100644 index 0000000..264e1e3 --- /dev/null +++ a/Proj/Objects/base_process_pc_cmd_0x60.o diff --git b/Proj/Objects/base_process_pc_cmd_0x61.crf a/Proj/Objects/base_process_pc_cmd_0x61.crf new file mode 100644 index 0000000..5bf9b2d --- /dev/null +++ a/Proj/Objects/base_process_pc_cmd_0x61.crf diff --git b/Proj/Objects/base_process_pc_cmd_0x61.d a/Proj/Objects/base_process_pc_cmd_0x61.d new file mode 100644 index 0000000..5f18e34 --- /dev/null +++ a/Proj/Objects/base_process_pc_cmd_0x61.d @@ -0,0 +1,7 @@ +.\objects\base_process_pc_cmd_0x61.o: ..\Base_core\core_src\base_process_pc_cmd_0x61.c +.\objects\base_process_pc_cmd_0x61.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\base_process_pc_cmd_0x61.o: ..\Base_core\core_lib\base_core.h +.\objects\base_process_pc_cmd_0x61.o: ..\inc\base_config.h +.\objects\base_process_pc_cmd_0x61.o: ..\Base_core\core_lib\base_core_user.h +.\objects\base_process_pc_cmd_0x61.o: ..\Base_core\core_lib\platform_interface.h +.\objects\base_process_pc_cmd_0x61.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/base_process_pc_cmd_0x61.o a/Proj/Objects/base_process_pc_cmd_0x61.o new file mode 100644 index 0000000..dd78893 --- /dev/null +++ a/Proj/Objects/base_process_pc_cmd_0x61.o diff --git b/Proj/Objects/base_process_pc_enter.crf a/Proj/Objects/base_process_pc_enter.crf new file mode 100644 index 0000000..d292635 --- /dev/null +++ a/Proj/Objects/base_process_pc_enter.crf diff --git b/Proj/Objects/base_process_pc_enter.d a/Proj/Objects/base_process_pc_enter.d new file mode 100644 index 0000000..e385fef --- /dev/null +++ a/Proj/Objects/base_process_pc_enter.d @@ -0,0 +1,7 @@ +.\objects\base_process_pc_enter.o: ..\Base_core\core_src\base_process_pc_enter.c +.\objects\base_process_pc_enter.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\base_process_pc_enter.o: ..\Base_core\core_lib\base_core.h +.\objects\base_process_pc_enter.o: ..\inc\base_config.h +.\objects\base_process_pc_enter.o: ..\Base_core\core_lib\base_core_user.h +.\objects\base_process_pc_enter.o: ..\Base_core\core_lib\platform_interface.h +.\objects\base_process_pc_enter.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/base_process_pc_enter.o a/Proj/Objects/base_process_pc_enter.o new file mode 100644 index 0000000..27241d6 --- /dev/null +++ a/Proj/Objects/base_process_pc_enter.o diff --git b/Proj/Objects/base_process_rx_keypad.crf a/Proj/Objects/base_process_rx_keypad.crf new file mode 100644 index 0000000..bcb5790 --- /dev/null +++ a/Proj/Objects/base_process_rx_keypad.crf diff --git b/Proj/Objects/base_process_rx_keypad.d a/Proj/Objects/base_process_rx_keypad.d new file mode 100644 index 0000000..4b15efe --- /dev/null +++ a/Proj/Objects/base_process_rx_keypad.d @@ -0,0 +1,7 @@ +.\objects\base_process_rx_keypad.o: ..\Base_core\core_src\base_process_rx_keypad.c +.\objects\base_process_rx_keypad.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\base_process_rx_keypad.o: ..\Base_core\core_lib\base_core.h +.\objects\base_process_rx_keypad.o: ..\inc\base_config.h +.\objects\base_process_rx_keypad.o: ..\Base_core\core_lib\base_core_user.h +.\objects\base_process_rx_keypad.o: ..\Base_core\core_lib\platform_interface.h +.\objects\base_process_rx_keypad.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/base_process_rx_keypad.o a/Proj/Objects/base_process_rx_keypad.o new file mode 100644 index 0000000..9d25a65 --- /dev/null +++ a/Proj/Objects/base_process_rx_keypad.o diff --git b/Proj/Objects/base_process_tx_keypad.crf a/Proj/Objects/base_process_tx_keypad.crf new file mode 100644 index 0000000..de4c4a6 --- /dev/null +++ a/Proj/Objects/base_process_tx_keypad.crf diff --git b/Proj/Objects/base_process_tx_keypad.d a/Proj/Objects/base_process_tx_keypad.d new file mode 100644 index 0000000..004062c --- /dev/null +++ a/Proj/Objects/base_process_tx_keypad.d @@ -0,0 +1,7 @@ +.\objects\base_process_tx_keypad.o: ..\Base_core\core_src\base_process_tx_keypad.c +.\objects\base_process_tx_keypad.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\base_process_tx_keypad.o: ..\Base_core\core_lib\base_core.h +.\objects\base_process_tx_keypad.o: ..\inc\base_config.h +.\objects\base_process_tx_keypad.o: ..\Base_core\core_lib\base_core_user.h +.\objects\base_process_tx_keypad.o: ..\Base_core\core_lib\platform_interface.h +.\objects\base_process_tx_keypad.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/base_process_tx_keypad.o a/Proj/Objects/base_process_tx_keypad.o new file mode 100644 index 0000000..fd61b99 --- /dev/null +++ a/Proj/Objects/base_process_tx_keypad.o diff --git b/Proj/Objects/base_timer.crf a/Proj/Objects/base_timer.crf new file mode 100644 index 0000000..ca061bc --- /dev/null +++ a/Proj/Objects/base_timer.crf diff --git b/Proj/Objects/base_timer.d a/Proj/Objects/base_timer.d new file mode 100644 index 0000000..64fb5d5 --- /dev/null +++ a/Proj/Objects/base_timer.d @@ -0,0 +1,7 @@ +.\objects\base_timer.o: ..\Base_core\core_src\base_timer.c +.\objects\base_timer.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\base_timer.o: ..\Base_core\core_lib\base_core.h +.\objects\base_timer.o: ..\inc\base_config.h +.\objects\base_timer.o: ..\Base_core\core_lib\base_core_user.h +.\objects\base_timer.o: ..\Base_core\core_lib\platform_interface.h +.\objects\base_timer.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/base_timer.o a/Proj/Objects/base_timer.o new file mode 100644 index 0000000..d8ea2ea --- /dev/null +++ a/Proj/Objects/base_timer.o diff --git b/Proj/Objects/buzzer.crf a/Proj/Objects/buzzer.crf new file mode 100644 index 0000000..137c8d3 --- /dev/null +++ a/Proj/Objects/buzzer.crf diff --git b/Proj/Objects/buzzer.d a/Proj/Objects/buzzer.d new file mode 100644 index 0000000..fe605bc --- /dev/null +++ a/Proj/Objects/buzzer.d @@ -0,0 +1,41 @@ +.\objects\buzzer.o: ..\Base_core\user_driver\buzzer.c +.\objects\buzzer.o: ..\Base_core\user_lib\HW_MCUIO.h +.\objects\buzzer.o: ..\Base_core\user_lib\function.h +.\objects\buzzer.o: ..\inc\base_config.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\buzzer.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\buzzer.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\buzzer.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\buzzer.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\buzzer.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\buzzer.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\buzzer.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\buzzer.o: ..\inc\gd32f30x_libopt.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\buzzer.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\buzzer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\buzzer.o: ..\Base_core\user_lib\platform.h +.\objects\buzzer.o: ..\Base_core\core_lib\platform_interface.h +.\objects\buzzer.o: ..\Base_core\core_lib\base_core_user.h diff --git b/Proj/Objects/buzzer.o a/Proj/Objects/buzzer.o new file mode 100644 index 0000000..fbb6965 --- /dev/null +++ a/Proj/Objects/buzzer.o diff --git b/Proj/Objects/cc2500_1101 - multi.crf a/Proj/Objects/cc2500_1101 - multi.crf new file mode 100644 index 0000000..d71d841 --- /dev/null +++ a/Proj/Objects/cc2500_1101 - multi.crf diff --git b/Proj/Objects/cc2500_1101 - multi.d a/Proj/Objects/cc2500_1101 - multi.d new file mode 100644 index 0000000..dcda266 --- /dev/null +++ a/Proj/Objects/cc2500_1101 - multi.d @@ -0,0 +1,8 @@ +.\objects\cc2500_1101 - multi.o: ..\Base_core\user_driver\cc2500_1101 - multi.C +.\objects\cc2500_1101 - multi.o: ..\Base_core\user_lib\cc2500_1101.h +.\objects\cc2500_1101 - multi.o: ..\Base_core\user_lib\platform.h +.\objects\cc2500_1101 - multi.o: ..\Base_core\core_lib\platform_interface.h +.\objects\cc2500_1101 - multi.o: ..\Base_core\user_lib\function.h +.\objects\cc2500_1101 - multi.o: ..\inc\base_config.h +.\objects\cc2500_1101 - multi.o: ..\Base_core\core_lib\base_core_user.h +.\objects\cc2500_1101 - multi.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/cc2500_1101 - multi.o a/Proj/Objects/cc2500_1101 - multi.o new file mode 100644 index 0000000..42a2364 --- /dev/null +++ a/Proj/Objects/cc2500_1101 - multi.o diff --git b/Proj/Objects/char_std8x16.crf a/Proj/Objects/char_std8x16.crf new file mode 100644 index 0000000..186e7da --- /dev/null +++ a/Proj/Objects/char_std8x16.crf diff --git b/Proj/Objects/char_std8x16.d a/Proj/Objects/char_std8x16.d new file mode 100644 index 0000000..c8f1769 --- /dev/null +++ a/Proj/Objects/char_std8x16.d @@ -0,0 +1,3 @@ +.\objects\char_std8x16.o: ..\Base_core\user_driver\char_std8x16.c +.\objects\char_std8x16.o: ..\Base_core\user_lib\function.h +.\objects\char_std8x16.o: ..\inc\base_config.h diff --git b/Proj/Objects/char_std8x16.o a/Proj/Objects/char_std8x16.o new file mode 100644 index 0000000..7855daf --- /dev/null +++ a/Proj/Objects/char_std8x16.o diff --git b/Proj/Objects/chinese_12x12.crf a/Proj/Objects/chinese_12x12.crf new file mode 100644 index 0000000..7aab7da --- /dev/null +++ a/Proj/Objects/chinese_12x12.crf diff --git b/Proj/Objects/chinese_12x12.d a/Proj/Objects/chinese_12x12.d new file mode 100644 index 0000000..157e0a3 --- /dev/null +++ a/Proj/Objects/chinese_12x12.d @@ -0,0 +1,3 @@ +.\objects\chinese_12x12.o: ..\Base_core\user_driver\Chinese_12x12.c +.\objects\chinese_12x12.o: ..\Base_core\user_lib\function.h +.\objects\chinese_12x12.o: ..\inc\base_config.h diff --git b/Proj/Objects/chinese_12x12.o a/Proj/Objects/chinese_12x12.o new file mode 100644 index 0000000..d87a92e --- /dev/null +++ a/Proj/Objects/chinese_12x12.o diff --git b/Proj/Objects/common_math.crf a/Proj/Objects/common_math.crf new file mode 100644 index 0000000..04e6c62 --- /dev/null +++ a/Proj/Objects/common_math.crf diff --git b/Proj/Objects/common_math.d a/Proj/Objects/common_math.d new file mode 100644 index 0000000..2eb9ca4 --- /dev/null +++ a/Proj/Objects/common_math.d @@ -0,0 +1,4 @@ +.\objects\common_math.o: ..\Base_core\core_src\common_math.c +.\objects\common_math.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h +.\objects\common_math.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h +.\objects\common_math.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h diff --git b/Proj/Objects/common_math.o a/Proj/Objects/common_math.o new file mode 100644 index 0000000..b85de61 --- /dev/null +++ a/Proj/Objects/common_math.o diff --git b/Proj/Objects/custom_hid_core.crf a/Proj/Objects/custom_hid_core.crf new file mode 100644 index 0000000..8b9bc8f --- /dev/null +++ a/Proj/Objects/custom_hid_core.crf diff --git b/Proj/Objects/custom_hid_core.d a/Proj/Objects/custom_hid_core.d new file mode 100644 index 0000000..1685ca0 --- /dev/null +++ a/Proj/Objects/custom_hid_core.d @@ -0,0 +1,43 @@ +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Source\custom_hid_core.c +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_transc.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\custom_hid_core.o: ..\inc\usbd_conf.h +.\objects\custom_hid_core.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\custom_hid_core.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\custom_hid_core.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\custom_hid_core.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\custom_hid_core.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\custom_hid_core.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\custom_hid_core.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\custom_hid_core.o: ..\inc\gd32f30x_libopt.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\custom_hid_core.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h +.\objects\custom_hid_core.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h +.\objects\custom_hid_core.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\custom_hid_core.o: ..\Base_core\core_lib\base_core_user.h diff --git b/Proj/Objects/custom_hid_core.o a/Proj/Objects/custom_hid_core.o new file mode 100644 index 0000000..5feb4f5 --- /dev/null +++ a/Proj/Objects/custom_hid_core.o diff --git b/Proj/Objects/custom_hid_itf.crf a/Proj/Objects/custom_hid_itf.crf new file mode 100644 index 0000000..8d6d8ea --- /dev/null +++ a/Proj/Objects/custom_hid_itf.crf diff --git b/Proj/Objects/custom_hid_itf.d a/Proj/Objects/custom_hid_itf.d new file mode 100644 index 0000000..63bda68 --- /dev/null +++ a/Proj/Objects/custom_hid_itf.d @@ -0,0 +1,40 @@ +.\objects\custom_hid_itf.o: ..\Src\custom_hid_itf.c +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\custom_hid_itf.o: ..\inc\usbd_conf.h +.\objects\custom_hid_itf.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\custom_hid_itf.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\custom_hid_itf.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\custom_hid_itf.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\custom_hid_itf.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\custom_hid_itf.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\custom_hid_itf.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\custom_hid_itf.o: ..\inc\gd32f30x_libopt.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\custom_hid_itf.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\custom_hid_itf.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h diff --git b/Proj/Objects/custom_hid_itf.o a/Proj/Objects/custom_hid_itf.o new file mode 100644 index 0000000..9c4dc2a --- /dev/null +++ a/Proj/Objects/custom_hid_itf.o diff --git b/Proj/Objects/debug.crf a/Proj/Objects/debug.crf new file mode 100644 index 0000000..1411e2a --- /dev/null +++ a/Proj/Objects/debug.crf diff --git b/Proj/Objects/debug.d a/Proj/Objects/debug.d new file mode 100644 index 0000000..0c0bf54 --- /dev/null +++ a/Proj/Objects/debug.d @@ -0,0 +1,9 @@ +.\objects\debug.o: ..\Base_core\core_src\debug.c +.\objects\debug.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h +.\objects\debug.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h +.\objects\debug.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\debug.o: ..\Base_core\core_lib\platform_interface.h +.\objects\debug.o: ..\Base_core\core_lib\base_core_user.h +.\objects\debug.o: ..\Base_core\core_lib\base_core.h +.\objects\debug.o: ..\inc\base_config.h +.\objects\debug.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/debug.o a/Proj/Objects/debug.o new file mode 100644 index 0000000..db5ec25 --- /dev/null +++ a/Proj/Objects/debug.o diff --git b/Proj/Objects/fucntion_base_test.crf a/Proj/Objects/fucntion_base_test.crf new file mode 100644 index 0000000..8baf988 --- /dev/null +++ a/Proj/Objects/fucntion_base_test.crf diff --git b/Proj/Objects/fucntion_base_test.d a/Proj/Objects/fucntion_base_test.d new file mode 100644 index 0000000..d5539b1 --- /dev/null +++ a/Proj/Objects/fucntion_base_test.d @@ -0,0 +1,5 @@ +.\objects\fucntion_base_test.o: ..\Base_core\func_src\fucntion_base_test.c +.\objects\fucntion_base_test.o: ..\Base_core\core_lib\function_interface.h +.\objects\fucntion_base_test.o: ..\Base_core\core_lib\platform_interface.h +.\objects\fucntion_base_test.o: ..\Base_core\core_lib\base_core_user.h +.\objects\fucntion_base_test.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h diff --git b/Proj/Objects/fucntion_base_test.o a/Proj/Objects/fucntion_base_test.o new file mode 100644 index 0000000..bfc62f7 --- /dev/null +++ a/Proj/Objects/fucntion_base_test.o diff --git b/Proj/Objects/fucntion_fastmatch.crf a/Proj/Objects/fucntion_fastmatch.crf new file mode 100644 index 0000000..a56b9c9 --- /dev/null +++ a/Proj/Objects/fucntion_fastmatch.crf diff --git b/Proj/Objects/fucntion_fastmatch.d a/Proj/Objects/fucntion_fastmatch.d new file mode 100644 index 0000000..e946b61 --- /dev/null +++ a/Proj/Objects/fucntion_fastmatch.d @@ -0,0 +1,7 @@ +.\objects\fucntion_fastmatch.o: ..\Base_core\func_src\fucntion_fastmatch.c +.\objects\fucntion_fastmatch.o: ..\Base_core\core_lib\function_interface.h +.\objects\fucntion_fastmatch.o: ..\Base_core\core_lib\platform_interface.h +.\objects\fucntion_fastmatch.o: ..\Base_core\core_lib\base_core_user.h +.\objects\fucntion_fastmatch.o: ..\Base_core\user_lib\function.h +.\objects\fucntion_fastmatch.o: ..\inc\base_config.h +.\objects\fucntion_fastmatch.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h diff --git b/Proj/Objects/fucntion_fastmatch.o a/Proj/Objects/fucntion_fastmatch.o new file mode 100644 index 0000000..0ad3741 --- /dev/null +++ a/Proj/Objects/fucntion_fastmatch.o diff --git b/Proj/Objects/fucntion_text_message.crf a/Proj/Objects/fucntion_text_message.crf new file mode 100644 index 0000000..b55cdfe --- /dev/null +++ a/Proj/Objects/fucntion_text_message.crf diff --git b/Proj/Objects/fucntion_text_message.d a/Proj/Objects/fucntion_text_message.d new file mode 100644 index 0000000..9f184b0 --- /dev/null +++ a/Proj/Objects/fucntion_text_message.d @@ -0,0 +1,9 @@ +.\objects\fucntion_text_message.o: ..\Base_core\func_src\fucntion_text_message.c +.\objects\fucntion_text_message.o: ..\Base_core\core_lib\base_core_user.h +.\objects\fucntion_text_message.o: ..\Base_core\user_lib\function.h +.\objects\fucntion_text_message.o: ..\inc\base_config.h +.\objects\fucntion_text_message.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\fucntion_text_message.o: ..\Base_core\core_lib\platform_interface.h +.\objects\fucntion_text_message.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\fucntion_text_message.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\fucntion_text_message.o: ..\Base_core\core_lib\base_core.h diff --git b/Proj/Objects/fucntion_text_message.o a/Proj/Objects/fucntion_text_message.o new file mode 100644 index 0000000..4b2eb78 --- /dev/null +++ a/Proj/Objects/fucntion_text_message.o diff --git b/Proj/Objects/function.crf a/Proj/Objects/function.crf new file mode 100644 index 0000000..cc5800f --- /dev/null +++ a/Proj/Objects/function.crf diff --git b/Proj/Objects/function.d a/Proj/Objects/function.d new file mode 100644 index 0000000..956196d --- /dev/null +++ a/Proj/Objects/function.d @@ -0,0 +1,7 @@ +.\objects\function.o: ..\Base_core\func_src\function.c +.\objects\function.o: ..\Base_core\core_lib\platform_interface.h +.\objects\function.o: ..\Base_core\core_lib\function_interface.h +.\objects\function.o: ..\Base_core\user_lib\function.h +.\objects\function.o: ..\inc\base_config.h +.\objects\function.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h diff --git b/Proj/Objects/function.o a/Proj/Objects/function.o new file mode 100644 index 0000000..e39f34e --- /dev/null +++ a/Proj/Objects/function.o diff --git b/Proj/Objects/function_aes.crf a/Proj/Objects/function_aes.crf new file mode 100644 index 0000000..e0e3344 --- /dev/null +++ a/Proj/Objects/function_aes.crf diff --git b/Proj/Objects/function_aes.d a/Proj/Objects/function_aes.d new file mode 100644 index 0000000..4366356 --- /dev/null +++ a/Proj/Objects/function_aes.d @@ -0,0 +1,109 @@ +.\objects\function_aes.o: ..\Base_core\func_src\function_AES.c +.\objects\function_aes.o: ..\Base_core\core_lib\function_interface.h +.\objects\function_aes.o: ..\Base_core\core_lib\platform_interface.h +.\objects\function_aes.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_aes.o: ..\Base_core\user_lib\function.h +.\objects\function_aes.o: ..\inc\base_config.h +.\objects\function_aes.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\function_aes.o: ..\Base_core\AESLIB\AES\AES.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\crypto.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\config.h +.\objects\function_aes.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\function_aes.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/types.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/macros.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/err_codes.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/err_codes.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common/sk.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/aes.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/Common/aes_low_level.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/Common/aes_common.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/ECB/aes_ecb.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CBC/aes_cbc.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CTR/aes_ctr.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CFB/aes_cfb.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/OFB/aes_ofb.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/XTS/aes_xts.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/GCM/aes_gcm.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CCM/aes_ccm.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/CMAC/aes_cmac.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\AES/KEYWRAP/aes_keywrap.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/des.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/Common/des_common.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/ECB/des_ecb.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\DES/CBC/des_cbc.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/tdes.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/Common/tdes_common.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/ECB/tdes_ecb.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\TDES/CBC/tdes_cbc.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\ARC4/arc4.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/hash.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/hash_common.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/MD5/md5.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/MD5/hmac_md5.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA1/sha1.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA1/hmac_sha1.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA224/sha224.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/sha256_sha224_transform.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA224/hmac_sha224.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA256/sha256.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA256/hmac_sha256.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA384/sha384.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/Common/sha512_sha384_transform.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA384/hmac_sha384.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/sha512.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/hmac_sha512.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\HASH/SHA512/hkdf512.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/math.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/bn.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/conv.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/arith.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/monty.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/modular.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/rng_bn.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/../../../RNG/rng.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\Common_ecc_rsa/MATH/BN/../../../RNG/DRBG_AES128/drbg.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/rsa.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/PKCS#1v15/rsa_pkcs1v15.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\RSA/LowLevel/rsa_low_level.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\ECC/ecc.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\ECC/../Common_ecc_rsa/MATH/math.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\POLY1305/poly1305.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\ED25519/ed25519.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\C25519/c25519.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\CHACHA/chacha.h +.\objects\function_aes.o: ..\Base_core\AESLIB\STM32_Cryptographic\Inc\CHACHA20-POLY1305/chacha20-poly1305.h +.\objects\function_aes.o: ..\Base_core\user_lib\HW_MCUIO.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\function_aes.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\function_aes.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\function_aes.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\function_aes.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\function_aes.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\function_aes.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\function_aes.o: ..\inc\gd32f30x_libopt.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\function_aes.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\function_aes.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/function_aes.o a/Proj/Objects/function_aes.o new file mode 100644 index 0000000..cd63cd1 --- /dev/null +++ a/Proj/Objects/function_aes.o diff --git b/Proj/Objects/function_broadcast.crf a/Proj/Objects/function_broadcast.crf new file mode 100644 index 0000000..cd9a4ef --- /dev/null +++ a/Proj/Objects/function_broadcast.crf diff --git b/Proj/Objects/function_broadcast.d a/Proj/Objects/function_broadcast.d new file mode 100644 index 0000000..ce13516 --- /dev/null +++ a/Proj/Objects/function_broadcast.d @@ -0,0 +1,6 @@ +.\objects\function_broadcast.o: ..\Base_core\func_src\function_broadcast.c +.\objects\function_broadcast.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_broadcast.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\function_broadcast.o: ..\Base_core\user_lib\function.h +.\objects\function_broadcast.o: ..\inc\base_config.h +.\objects\function_broadcast.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/function_broadcast.o a/Proj/Objects/function_broadcast.o new file mode 100644 index 0000000..ce55652 --- /dev/null +++ a/Proj/Objects/function_broadcast.o diff --git b/Proj/Objects/function_debug.crf a/Proj/Objects/function_debug.crf new file mode 100644 index 0000000..6fa0b73 --- /dev/null +++ a/Proj/Objects/function_debug.crf diff --git b/Proj/Objects/function_debug.d a/Proj/Objects/function_debug.d new file mode 100644 index 0000000..f170dc2 --- /dev/null +++ a/Proj/Objects/function_debug.d @@ -0,0 +1,5 @@ +.\objects\function_debug.o: ..\Base_core\func_src\function_debug.c +.\objects\function_debug.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h +.\objects\function_debug.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h +.\objects\function_debug.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\function_debug.o: ..\Base_core\core_lib\platform_interface.h diff --git b/Proj/Objects/function_debug.o a/Proj/Objects/function_debug.o new file mode 100644 index 0000000..3dfed32 --- /dev/null +++ a/Proj/Objects/function_debug.o diff --git b/Proj/Objects/function_e2prom.crf a/Proj/Objects/function_e2prom.crf new file mode 100644 index 0000000..fb39ead --- /dev/null +++ a/Proj/Objects/function_e2prom.crf diff --git b/Proj/Objects/function_e2prom.d a/Proj/Objects/function_e2prom.d new file mode 100644 index 0000000..65737fe --- /dev/null +++ a/Proj/Objects/function_e2prom.d @@ -0,0 +1,7 @@ +.\objects\function_e2prom.o: ..\Base_core\core_src\function_e2prom.c +.\objects\function_e2prom.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\function_e2prom.o: ..\Base_core\core_lib\base_core.h +.\objects\function_e2prom.o: ..\inc\base_config.h +.\objects\function_e2prom.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_e2prom.o: ..\Base_core\core_lib\platform_interface.h +.\objects\function_e2prom.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/function_e2prom.o a/Proj/Objects/function_e2prom.o new file mode 100644 index 0000000..678ceeb --- /dev/null +++ a/Proj/Objects/function_e2prom.o diff --git b/Proj/Objects/function_monitor_freq.crf a/Proj/Objects/function_monitor_freq.crf new file mode 100644 index 0000000..9dcc986 --- /dev/null +++ a/Proj/Objects/function_monitor_freq.crf diff --git b/Proj/Objects/function_monitor_freq.d a/Proj/Objects/function_monitor_freq.d new file mode 100644 index 0000000..8636602 --- /dev/null +++ a/Proj/Objects/function_monitor_freq.d @@ -0,0 +1,7 @@ +.\objects\function_monitor_freq.o: ..\Base_core\func_src\function_monitor_freq.c +.\objects\function_monitor_freq.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_monitor_freq.o: ..\Base_core\core_lib\platform_interface.h +.\objects\function_monitor_freq.o: ..\Base_core\user_lib\function.h +.\objects\function_monitor_freq.o: ..\inc\base_config.h +.\objects\function_monitor_freq.o: ..\Base_core\core_lib\function_interface.h +.\objects\function_monitor_freq.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h diff --git b/Proj/Objects/function_monitor_freq.o a/Proj/Objects/function_monitor_freq.o new file mode 100644 index 0000000..7dd8f8d --- /dev/null +++ a/Proj/Objects/function_monitor_freq.o diff --git b/Proj/Objects/function_network.crf a/Proj/Objects/function_network.crf new file mode 100644 index 0000000..dd8eabc --- /dev/null +++ a/Proj/Objects/function_network.crf diff --git b/Proj/Objects/function_network.d a/Proj/Objects/function_network.d new file mode 100644 index 0000000..5db896e --- /dev/null +++ a/Proj/Objects/function_network.d @@ -0,0 +1,44 @@ +.\objects\function_network.o: ..\Base_core\func_src\function_network.c +.\objects\function_network.o: ..\Base_core\core_lib\function_interface.h +.\objects\function_network.o: ..\Base_core\core_lib\platform_interface.h +.\objects\function_network.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_network.o: ..\Base_core\core_lib\base_core.h +.\objects\function_network.o: ..\inc\base_config.h +.\objects\function_network.o: ..\Base_core\user_lib\function.h +.\objects\function_network.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\function_network.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h +.\objects\function_network.o: ..\Base_core\user_lib\HW_MCUIO.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\function_network.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\function_network.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\function_network.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\function_network.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\function_network.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\function_network.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\function_network.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\function_network.o: ..\inc\gd32f30x_libopt.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\function_network.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\function_network.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/function_network.o a/Proj/Objects/function_network.o new file mode 100644 index 0000000..6bcb31d --- /dev/null +++ a/Proj/Objects/function_network.o diff --git b/Proj/Objects/function_nfc.crf a/Proj/Objects/function_nfc.crf new file mode 100644 index 0000000..4e787b0 --- /dev/null +++ a/Proj/Objects/function_nfc.crf diff --git b/Proj/Objects/function_nfc.d a/Proj/Objects/function_nfc.d new file mode 100644 index 0000000..305750b --- /dev/null +++ a/Proj/Objects/function_nfc.d @@ -0,0 +1,7 @@ +.\objects\function_nfc.o: ..\Base_core\func_src\function_NFC.c +.\objects\function_nfc.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_nfc.o: ..\Base_core\user_lib\function.h +.\objects\function_nfc.o: ..\inc\base_config.h +.\objects\function_nfc.o: ..\Base_core\core_lib\platform_interface.h +.\objects\function_nfc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\function_nfc.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/function_nfc.o a/Proj/Objects/function_nfc.o new file mode 100644 index 0000000..2550522 --- /dev/null +++ a/Proj/Objects/function_nfc.o diff --git b/Proj/Objects/function_t2_display.crf a/Proj/Objects/function_t2_display.crf new file mode 100644 index 0000000..7153c9b --- /dev/null +++ a/Proj/Objects/function_t2_display.crf diff --git b/Proj/Objects/function_t2_display.d a/Proj/Objects/function_t2_display.d new file mode 100644 index 0000000..3026e45 --- /dev/null +++ a/Proj/Objects/function_t2_display.d @@ -0,0 +1,7 @@ +.\objects\function_t2_display.o: ..\Base_core\func_src\function_T2_display.c +.\objects\function_t2_display.o: ..\Base_core\core_lib\platform_interface.h +.\objects\function_t2_display.o: ..\Base_core\user_lib\dot.h +.\objects\function_t2_display.o: ..\Base_core\user_lib\function.h +.\objects\function_t2_display.o: ..\inc\base_config.h +.\objects\function_t2_display.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_t2_display.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/function_t2_display.o a/Proj/Objects/function_t2_display.o new file mode 100644 index 0000000..50babc8 --- /dev/null +++ a/Proj/Objects/function_t2_display.o diff --git b/Proj/Objects/function_txmsg_beacon.crf a/Proj/Objects/function_txmsg_beacon.crf new file mode 100644 index 0000000..b6fec08 --- /dev/null +++ a/Proj/Objects/function_txmsg_beacon.crf diff --git b/Proj/Objects/function_txmsg_beacon.d a/Proj/Objects/function_txmsg_beacon.d new file mode 100644 index 0000000..7ee128e --- /dev/null +++ a/Proj/Objects/function_txmsg_beacon.d @@ -0,0 +1,7 @@ +.\objects\function_txmsg_beacon.o: ..\Base_core\func_src\function_txmsg_beacon.c +.\objects\function_txmsg_beacon.o: ..\Base_core\core_lib\platform_interface.h +.\objects\function_txmsg_beacon.o: ..\Base_core\core_lib\function_interface.h +.\objects\function_txmsg_beacon.o: ..\Base_core\user_lib\function.h +.\objects\function_txmsg_beacon.o: ..\inc\base_config.h +.\objects\function_txmsg_beacon.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_txmsg_beacon.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h diff --git b/Proj/Objects/function_txmsg_beacon.o a/Proj/Objects/function_txmsg_beacon.o new file mode 100644 index 0000000..6b45178 --- /dev/null +++ a/Proj/Objects/function_txmsg_beacon.o diff --git b/Proj/Objects/function_update_keypad.crf a/Proj/Objects/function_update_keypad.crf new file mode 100644 index 0000000..7bcc89a --- /dev/null +++ a/Proj/Objects/function_update_keypad.crf diff --git b/Proj/Objects/function_update_keypad.d a/Proj/Objects/function_update_keypad.d new file mode 100644 index 0000000..7e25324 --- /dev/null +++ a/Proj/Objects/function_update_keypad.d @@ -0,0 +1,6 @@ +.\objects\function_update_keypad.o: ..\Base_core\func_src\function_update_keypad.c +.\objects\function_update_keypad.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_update_keypad.o: ..\Base_core\user_lib\function.h +.\objects\function_update_keypad.o: ..\inc\base_config.h +.\objects\function_update_keypad.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\function_update_keypad.o: ..\Base_core\core_lib\platform_interface.h diff --git b/Proj/Objects/function_update_keypad.o a/Proj/Objects/function_update_keypad.o new file mode 100644 index 0000000..c539089 --- /dev/null +++ a/Proj/Objects/function_update_keypad.o diff --git b/Proj/Objects/function_update_keypad_5g8.crf a/Proj/Objects/function_update_keypad_5g8.crf new file mode 100644 index 0000000..f3ffdc1 --- /dev/null +++ a/Proj/Objects/function_update_keypad_5g8.crf diff --git b/Proj/Objects/function_update_keypad_5g8.d a/Proj/Objects/function_update_keypad_5g8.d new file mode 100644 index 0000000..3b87835 --- /dev/null +++ a/Proj/Objects/function_update_keypad_5g8.d @@ -0,0 +1,6 @@ +.\objects\function_update_keypad_5g8.o: ..\Base_core\func_src\function_update_keypad_5G8.c +.\objects\function_update_keypad_5g8.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_update_keypad_5g8.o: ..\Base_core\core_lib\platform_interface.h +.\objects\function_update_keypad_5g8.o: ..\Base_core\user_lib\function.h +.\objects\function_update_keypad_5g8.o: ..\inc\base_config.h +.\objects\function_update_keypad_5g8.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h diff --git b/Proj/Objects/function_update_keypad_5g8.o a/Proj/Objects/function_update_keypad_5g8.o new file mode 100644 index 0000000..571e8b8 --- /dev/null +++ a/Proj/Objects/function_update_keypad_5g8.o diff --git b/Proj/Objects/function_upload_multipkt.crf a/Proj/Objects/function_upload_multipkt.crf new file mode 100644 index 0000000..b6fec08 --- /dev/null +++ a/Proj/Objects/function_upload_multipkt.crf diff --git b/Proj/Objects/function_upload_multipkt.d a/Proj/Objects/function_upload_multipkt.d new file mode 100644 index 0000000..d6113bc --- /dev/null +++ a/Proj/Objects/function_upload_multipkt.d @@ -0,0 +1,7 @@ +.\objects\function_upload_multipkt.o: ..\Base_core\func_src\function_upload_multipkt.c +.\objects\function_upload_multipkt.o: ..\Base_core\core_lib\platform_interface.h +.\objects\function_upload_multipkt.o: ..\Base_core\core_lib\function_interface.h +.\objects\function_upload_multipkt.o: ..\Base_core\user_lib\function.h +.\objects\function_upload_multipkt.o: ..\inc\base_config.h +.\objects\function_upload_multipkt.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_upload_multipkt.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h diff --git b/Proj/Objects/function_upload_multipkt.o a/Proj/Objects/function_upload_multipkt.o new file mode 100644 index 0000000..bdb0feb --- /dev/null +++ a/Proj/Objects/function_upload_multipkt.o diff --git b/Proj/Objects/function_whitelist.crf a/Proj/Objects/function_whitelist.crf new file mode 100644 index 0000000..efc2076 --- /dev/null +++ a/Proj/Objects/function_whitelist.crf diff --git b/Proj/Objects/function_whitelist.d a/Proj/Objects/function_whitelist.d new file mode 100644 index 0000000..04925c0 --- /dev/null +++ a/Proj/Objects/function_whitelist.d @@ -0,0 +1,7 @@ +.\objects\function_whitelist.o: ..\Base_core\func_src\function_whitelist.c +.\objects\function_whitelist.o: ..\Base_core\core_lib\base_core_user.h +.\objects\function_whitelist.o: ..\Base_core\user_lib\function.h +.\objects\function_whitelist.o: ..\inc\base_config.h +.\objects\function_whitelist.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h +.\objects\function_whitelist.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\function_whitelist.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/function_whitelist.o a/Proj/Objects/function_whitelist.o new file mode 100644 index 0000000..eea2df9 --- /dev/null +++ a/Proj/Objects/function_whitelist.o diff --git b/Proj/Objects/gd32f303e_eval.crf a/Proj/Objects/gd32f303e_eval.crf new file mode 100644 index 0000000..b0ddcc7 --- /dev/null +++ a/Proj/Objects/gd32f303e_eval.crf diff --git b/Proj/Objects/gd32f303e_eval.d a/Proj/Objects/gd32f303e_eval.d new file mode 100644 index 0000000..2c85c74 --- /dev/null +++ a/Proj/Objects/gd32f303e_eval.d @@ -0,0 +1,35 @@ +.\objects\gd32f303e_eval.o: ..\Utilities\gd32f303e_eval.c +.\objects\gd32f303e_eval.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f303e_eval.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f303e_eval.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f303e_eval.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f303e_eval.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f303e_eval.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f303e_eval.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f303e_eval.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f303e_eval.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f303e_eval.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\gd32f303e_eval.o: ..\Utilities\gd32f303e_eval.h diff --git b/Proj/Objects/gd32f303e_eval.o a/Proj/Objects/gd32f303e_eval.o new file mode 100644 index 0000000..2e511ab --- /dev/null +++ a/Proj/Objects/gd32f303e_eval.o diff --git b/Proj/Objects/gd32f30x_dma.crf a/Proj/Objects/gd32f30x_dma.crf new file mode 100644 index 0000000..828dc8e --- /dev/null +++ a/Proj/Objects/gd32f30x_dma.crf diff --git b/Proj/Objects/gd32f30x_dma.d a/Proj/Objects/gd32f30x_dma.d new file mode 100644 index 0000000..82264a1 --- /dev/null +++ a/Proj/Objects/gd32f30x_dma.d @@ -0,0 +1,36 @@ +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_dma.c +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_dma.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_dma.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_dma.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_dma.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_dma.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_dma.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_dma.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_dma.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_dma.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_dma.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\gd32f30x_dma.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h diff --git b/Proj/Objects/gd32f30x_dma.o a/Proj/Objects/gd32f30x_dma.o new file mode 100644 index 0000000..14ead91 --- /dev/null +++ a/Proj/Objects/gd32f30x_dma.o diff --git b/Proj/Objects/gd32f30x_exmc.crf a/Proj/Objects/gd32f30x_exmc.crf new file mode 100644 index 0000000..1989df9 --- /dev/null +++ a/Proj/Objects/gd32f30x_exmc.crf diff --git b/Proj/Objects/gd32f30x_exmc.d a/Proj/Objects/gd32f30x_exmc.d new file mode 100644 index 0000000..32b9e99 --- /dev/null +++ a/Proj/Objects/gd32f30x_exmc.d @@ -0,0 +1,35 @@ +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_exmc.c +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\gd32f30x_exmc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_exmc.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_exmc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_exmc.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_exmc.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_exmc.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_exmc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_exmc.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_exmc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_exmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/gd32f30x_exmc.o a/Proj/Objects/gd32f30x_exmc.o new file mode 100644 index 0000000..3955636 --- /dev/null +++ a/Proj/Objects/gd32f30x_exmc.o diff --git b/Proj/Objects/gd32f30x_exti.crf a/Proj/Objects/gd32f30x_exti.crf new file mode 100644 index 0000000..9690146 --- /dev/null +++ a/Proj/Objects/gd32f30x_exti.crf diff --git b/Proj/Objects/gd32f30x_exti.d a/Proj/Objects/gd32f30x_exti.d new file mode 100644 index 0000000..23c8d05 --- /dev/null +++ a/Proj/Objects/gd32f30x_exti.d @@ -0,0 +1,35 @@ +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_exti.c +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_exti.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_exti.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_exti.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_exti.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_exti.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_exti.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_exti.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_exti.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_exti.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_exti.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/gd32f30x_exti.o a/Proj/Objects/gd32f30x_exti.o new file mode 100644 index 0000000..3ad4c11 --- /dev/null +++ a/Proj/Objects/gd32f30x_exti.o diff --git b/Proj/Objects/gd32f30x_fmc.crf a/Proj/Objects/gd32f30x_fmc.crf new file mode 100644 index 0000000..9b0f2db --- /dev/null +++ a/Proj/Objects/gd32f30x_fmc.crf diff --git b/Proj/Objects/gd32f30x_fmc.d a/Proj/Objects/gd32f30x_fmc.d new file mode 100644 index 0000000..c73d1de --- /dev/null +++ a/Proj/Objects/gd32f30x_fmc.d @@ -0,0 +1,35 @@ +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_fmc.c +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_fmc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_fmc.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_fmc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_fmc.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_fmc.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_fmc.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_fmc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_fmc.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_fmc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_fmc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/gd32f30x_fmc.o a/Proj/Objects/gd32f30x_fmc.o new file mode 100644 index 0000000..9b1dadb --- /dev/null +++ a/Proj/Objects/gd32f30x_fmc.o diff --git b/Proj/Objects/gd32f30x_gpio.crf a/Proj/Objects/gd32f30x_gpio.crf new file mode 100644 index 0000000..2158dd8 --- /dev/null +++ a/Proj/Objects/gd32f30x_gpio.crf diff --git b/Proj/Objects/gd32f30x_gpio.d a/Proj/Objects/gd32f30x_gpio.d new file mode 100644 index 0000000..47787ba --- /dev/null +++ a/Proj/Objects/gd32f30x_gpio.d @@ -0,0 +1,35 @@ +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_gpio.c +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_gpio.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_gpio.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_gpio.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_gpio.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_gpio.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_gpio.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_gpio.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_gpio.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_gpio.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_gpio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/gd32f30x_gpio.o a/Proj/Objects/gd32f30x_gpio.o new file mode 100644 index 0000000..fd38304 --- /dev/null +++ a/Proj/Objects/gd32f30x_gpio.o diff --git b/Proj/Objects/gd32f30x_it.crf a/Proj/Objects/gd32f30x_it.crf new file mode 100644 index 0000000..cb50065 --- /dev/null +++ a/Proj/Objects/gd32f30x_it.crf diff --git b/Proj/Objects/gd32f30x_it.d a/Proj/Objects/gd32f30x_it.d new file mode 100644 index 0000000..b74171c --- /dev/null +++ a/Proj/Objects/gd32f30x_it.d @@ -0,0 +1,49 @@ +.\objects\gd32f30x_it.o: ..\Src\gd32f30x_it.c +.\objects\gd32f30x_it.o: ..\inc\gd32f30x_it.h +.\objects\gd32f30x_it.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_it.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_it.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_it.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_it.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_it.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_it.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_it.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_it.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_int.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\gd32f30x_it.o: ..\inc\usbd_conf.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_pwr.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h +.\objects\gd32f30x_it.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h +.\objects\gd32f30x_it.o: ..\Base_core\user_lib\HW_MCUIO.h +.\objects\gd32f30x_it.o: ..\Base_core\user_lib\function.h +.\objects\gd32f30x_it.o: ..\inc\base_config.h +.\objects\gd32f30x_it.o: ..\Base_core\user_lib\platform.h +.\objects\gd32f30x_it.o: ..\Base_core\core_lib\platform_interface.h +.\objects\gd32f30x_it.o: ..\Base_core\core_lib\base_core_user.h diff --git b/Proj/Objects/gd32f30x_it.o a/Proj/Objects/gd32f30x_it.o new file mode 100644 index 0000000..0a4c3fa --- /dev/null +++ a/Proj/Objects/gd32f30x_it.o diff --git b/Proj/Objects/gd32f30x_misc.crf a/Proj/Objects/gd32f30x_misc.crf new file mode 100644 index 0000000..a0a9323 --- /dev/null +++ a/Proj/Objects/gd32f30x_misc.crf diff --git b/Proj/Objects/gd32f30x_misc.d a/Proj/Objects/gd32f30x_misc.d new file mode 100644 index 0000000..7269a9f --- /dev/null +++ a/Proj/Objects/gd32f30x_misc.d @@ -0,0 +1,35 @@ +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_misc.c +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_misc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_misc.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_misc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_misc.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_misc.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_misc.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_misc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_misc.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_misc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_misc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/gd32f30x_misc.o a/Proj/Objects/gd32f30x_misc.o new file mode 100644 index 0000000..6f2d226 --- /dev/null +++ a/Proj/Objects/gd32f30x_misc.o diff --git b/Proj/Objects/gd32f30x_pmu.crf a/Proj/Objects/gd32f30x_pmu.crf new file mode 100644 index 0000000..4fab7a9 --- /dev/null +++ a/Proj/Objects/gd32f30x_pmu.crf diff --git b/Proj/Objects/gd32f30x_pmu.d a/Proj/Objects/gd32f30x_pmu.d new file mode 100644 index 0000000..40954e9 --- /dev/null +++ a/Proj/Objects/gd32f30x_pmu.d @@ -0,0 +1,35 @@ +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_pmu.c +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_pmu.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_pmu.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_pmu.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_pmu.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_pmu.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_pmu.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_pmu.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_pmu.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_pmu.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_pmu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/gd32f30x_pmu.o a/Proj/Objects/gd32f30x_pmu.o new file mode 100644 index 0000000..619eb56 --- /dev/null +++ a/Proj/Objects/gd32f30x_pmu.o diff --git b/Proj/Objects/gd32f30x_rcu.crf a/Proj/Objects/gd32f30x_rcu.crf new file mode 100644 index 0000000..1003915 --- /dev/null +++ a/Proj/Objects/gd32f30x_rcu.crf diff --git b/Proj/Objects/gd32f30x_rcu.d a/Proj/Objects/gd32f30x_rcu.d new file mode 100644 index 0000000..ea462bd --- /dev/null +++ a/Proj/Objects/gd32f30x_rcu.d @@ -0,0 +1,35 @@ +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_rcu.c +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_rcu.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_rcu.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_rcu.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_rcu.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_rcu.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_rcu.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_rcu.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_rcu.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_rcu.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_rcu.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/gd32f30x_rcu.o a/Proj/Objects/gd32f30x_rcu.o new file mode 100644 index 0000000..b33995a --- /dev/null +++ a/Proj/Objects/gd32f30x_rcu.o diff --git b/Proj/Objects/gd32f30x_spi.crf a/Proj/Objects/gd32f30x_spi.crf new file mode 100644 index 0000000..d34ba97 --- /dev/null +++ a/Proj/Objects/gd32f30x_spi.crf diff --git b/Proj/Objects/gd32f30x_spi.d a/Proj/Objects/gd32f30x_spi.d new file mode 100644 index 0000000..b885276 --- /dev/null +++ a/Proj/Objects/gd32f30x_spi.d @@ -0,0 +1,35 @@ +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_spi.c +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_spi.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_spi.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_spi.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_spi.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_spi.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_spi.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_spi.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_spi.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_spi.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_spi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/gd32f30x_spi.o a/Proj/Objects/gd32f30x_spi.o new file mode 100644 index 0000000..a688976 --- /dev/null +++ a/Proj/Objects/gd32f30x_spi.o diff --git b/Proj/Objects/gd32f30x_timer.crf a/Proj/Objects/gd32f30x_timer.crf new file mode 100644 index 0000000..824b226 --- /dev/null +++ a/Proj/Objects/gd32f30x_timer.crf diff --git b/Proj/Objects/gd32f30x_timer.d a/Proj/Objects/gd32f30x_timer.d new file mode 100644 index 0000000..dc74eff --- /dev/null +++ a/Proj/Objects/gd32f30x_timer.d @@ -0,0 +1,35 @@ +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_timer.c +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_timer.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_timer.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_timer.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_timer.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_timer.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_timer.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_timer.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_timer.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_timer.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_timer.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/gd32f30x_timer.o a/Proj/Objects/gd32f30x_timer.o new file mode 100644 index 0000000..07407b1 --- /dev/null +++ a/Proj/Objects/gd32f30x_timer.o diff --git b/Proj/Objects/gd32f30x_usart.crf a/Proj/Objects/gd32f30x_usart.crf new file mode 100644 index 0000000..55ee1e8 --- /dev/null +++ a/Proj/Objects/gd32f30x_usart.crf diff --git b/Proj/Objects/gd32f30x_usart.d a/Proj/Objects/gd32f30x_usart.d new file mode 100644 index 0000000..312734b --- /dev/null +++ a/Proj/Objects/gd32f30x_usart.d @@ -0,0 +1,35 @@ +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Source\gd32f30x_usart.c +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_usart.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_usart.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_usart.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_usart.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_usart.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_usart.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_usart.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_usart.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_usart.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_usart.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/gd32f30x_usart.o a/Proj/Objects/gd32f30x_usart.o new file mode 100644 index 0000000..b3478a7 --- /dev/null +++ a/Proj/Objects/gd32f30x_usart.o diff --git b/Proj/Objects/gd32f30x_usbd_hw.crf a/Proj/Objects/gd32f30x_usbd_hw.crf new file mode 100644 index 0000000..0d24858 --- /dev/null +++ a/Proj/Objects/gd32f30x_usbd_hw.crf diff --git b/Proj/Objects/gd32f30x_usbd_hw.d a/Proj/Objects/gd32f30x_usbd_hw.d new file mode 100644 index 0000000..e74c4c9 --- /dev/null +++ a/Proj/Objects/gd32f30x_usbd_hw.d @@ -0,0 +1,36 @@ +.\objects\gd32f30x_usbd_hw.o: ..\Src\gd32f30x_usbd_hw.c +.\objects\gd32f30x_usbd_hw.o: ..\inc\usbd_hw.h +.\objects\gd32f30x_usbd_hw.o: ..\inc\usbd_conf.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\gd32f30x_usbd_hw.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\gd32f30x_usbd_hw.o: ..\inc\gd32f30x_libopt.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\gd32f30x_usbd_hw.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/gd32f30x_usbd_hw.o a/Proj/Objects/gd32f30x_usbd_hw.o new file mode 100644 index 0000000..1be4646 --- /dev/null +++ a/Proj/Objects/gd32f30x_usbd_hw.o diff --git b/Proj/Objects/grp_list_5g8.crf a/Proj/Objects/grp_list_5g8.crf new file mode 100644 index 0000000..d3f0e20 --- /dev/null +++ a/Proj/Objects/grp_list_5g8.crf diff --git b/Proj/Objects/grp_list_5g8.d a/Proj/Objects/grp_list_5g8.d new file mode 100644 index 0000000..05549b2 --- /dev/null +++ a/Proj/Objects/grp_list_5g8.d @@ -0,0 +1,7 @@ +.\objects\grp_list_5g8.o: ..\Base_core\core_src\grp_list_5G8.c +.\objects\grp_list_5g8.o: ..\Base_core\core_lib\base_core.h +.\objects\grp_list_5g8.o: ..\inc\base_config.h +.\objects\grp_list_5g8.o: ..\Base_core\core_lib\base_core_user.h +.\objects\grp_list_5g8.o: ..\Base_core\core_lib\platform_interface.h +.\objects\grp_list_5g8.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\grp_list_5g8.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/grp_list_5g8.o a/Proj/Objects/grp_list_5g8.o new file mode 100644 index 0000000..582b950 --- /dev/null +++ a/Proj/Objects/grp_list_5g8.o diff --git b/Proj/Objects/hw_mcuio.crf a/Proj/Objects/hw_mcuio.crf new file mode 100644 index 0000000..626e8b4 --- /dev/null +++ a/Proj/Objects/hw_mcuio.crf diff --git b/Proj/Objects/hw_mcuio.d a/Proj/Objects/hw_mcuio.d new file mode 100644 index 0000000..7495772 --- /dev/null +++ a/Proj/Objects/hw_mcuio.d @@ -0,0 +1,45 @@ +.\objects\hw_mcuio.o: ..\Base_core\user_driver\HW_MCUIO.c +.\objects\hw_mcuio.o: ..\Base_core\user_lib\HW_MCUIO.h +.\objects\hw_mcuio.o: ..\Base_core\user_lib\function.h +.\objects\hw_mcuio.o: ..\inc\base_config.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\hw_mcuio.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\hw_mcuio.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\hw_mcuio.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\hw_mcuio.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\hw_mcuio.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\hw_mcuio.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\hw_mcuio.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\hw_mcuio.o: ..\inc\gd32f30x_libopt.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\hw_mcuio.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\hw_mcuio.o: ..\inc\usbd_conf.h +.\objects\hw_mcuio.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h +.\objects\hw_mcuio.o: ..\inc\usbd_hw.h diff --git b/Proj/Objects/hw_mcuio.o a/Proj/Objects/hw_mcuio.o new file mode 100644 index 0000000..f742c3f --- /dev/null +++ a/Proj/Objects/hw_mcuio.o diff --git b/Proj/Objects/i2c.crf a/Proj/Objects/i2c.crf new file mode 100644 index 0000000..e8f818c --- /dev/null +++ a/Proj/Objects/i2c.crf diff --git b/Proj/Objects/i2c.d a/Proj/Objects/i2c.d new file mode 100644 index 0000000..fcdb7c2 --- /dev/null +++ a/Proj/Objects/i2c.d @@ -0,0 +1,40 @@ +.\objects\i2c.o: ..\Base_core\user_driver\i2c.c +.\objects\i2c.o: ..\Base_core\user_lib\HW_MCUIO.h +.\objects\i2c.o: ..\Base_core\user_lib\function.h +.\objects\i2c.o: ..\inc\base_config.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\i2c.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\i2c.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\i2c.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\i2c.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\i2c.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\i2c.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\i2c.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\i2c.o: ..\inc\gd32f30x_libopt.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\i2c.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\i2c.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\i2c.o: ..\Base_core\user_lib\platform.h +.\objects\i2c.o: ..\Base_core\core_lib\platform_interface.h diff --git b/Proj/Objects/i2c.o a/Proj/Objects/i2c.o new file mode 100644 index 0000000..198118a --- /dev/null +++ a/Proj/Objects/i2c.o diff --git b/Proj/Objects/lcd_driver.d a/Proj/Objects/lcd_driver.d new file mode 100644 index 0000000..11413b2 --- /dev/null +++ a/Proj/Objects/lcd_driver.d @@ -0,0 +1 @@ +.\objects\lcd_driver.o: ..\Base_core\user_driver\lcd_driver.c diff --git b/Proj/Objects/led.crf a/Proj/Objects/led.crf new file mode 100644 index 0000000..0ff5126 --- /dev/null +++ a/Proj/Objects/led.crf diff --git b/Proj/Objects/led.d a/Proj/Objects/led.d new file mode 100644 index 0000000..cb618b4 --- /dev/null +++ a/Proj/Objects/led.d @@ -0,0 +1,40 @@ +.\objects\led.o: ..\Base_core\user_driver\led.c +.\objects\led.o: ..\Base_core\user_lib\HW_MCUIO.h +.\objects\led.o: ..\Base_core\user_lib\function.h +.\objects\led.o: ..\inc\base_config.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\led.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\led.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\led.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\led.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\led.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\led.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\led.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\led.o: ..\inc\gd32f30x_libopt.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\led.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\led.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\led.o: ..\Base_core\user_lib\platform.h +.\objects\led.o: ..\Base_core\core_lib\platform_interface.h diff --git b/Proj/Objects/led.o a/Proj/Objects/led.o new file mode 100644 index 0000000..9910f2c --- /dev/null +++ a/Proj/Objects/led.o diff --git b/Proj/Objects/main.crf a/Proj/Objects/main.crf new file mode 100644 index 0000000..5d05eac --- /dev/null +++ a/Proj/Objects/main.crf diff --git b/Proj/Objects/main.d a/Proj/Objects/main.d new file mode 100644 index 0000000..9205be6 --- /dev/null +++ a/Proj/Objects/main.d @@ -0,0 +1,48 @@ +.\objects\main.o: ..\Src\main.c +.\objects\main.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h +.\objects\main.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h +.\objects\main.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\main.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\main.o: ..\inc\usbd_conf.h +.\objects\main.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\main.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\main.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\main.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\main.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\main.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\main.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\main.o: ..\inc\gd32f30x_libopt.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\main.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\main.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\main.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h +.\objects\main.o: ..\inc\usbd_hw.h +.\objects\main.o: ..\Base_core\user_lib\platform.h +.\objects\main.o: ..\Base_core\core_lib\platform_interface.h +.\objects\main.o: ..\Base_core\core_lib\base_core_user.h +.\objects\main.o: ..\Base_core\core_lib\function_interface.h +.\objects\main.o: ..\Base_core\user_lib\HW_MCUIO.h +.\objects\main.o: ..\Base_core\user_lib\function.h +.\objects\main.o: ..\inc\base_config.h diff --git b/Proj/Objects/main.o a/Proj/Objects/main.o new file mode 100644 index 0000000..f1c4e94 --- /dev/null +++ a/Proj/Objects/main.o diff --git b/Proj/Objects/mf522.d a/Proj/Objects/mf522.d new file mode 100644 index 0000000..6254bd6 --- /dev/null +++ a/Proj/Objects/mf522.d @@ -0,0 +1,2 @@ +.\objects\mf522.o: ..\Base_core\user_driver\MF522.c +.\objects\mf522.o: ..\Base_core\user_lib\MF522.h diff --git b/Proj/Objects/multi_channel.crf a/Proj/Objects/multi_channel.crf new file mode 100644 index 0000000..d73fe82 --- /dev/null +++ a/Proj/Objects/multi_channel.crf diff --git b/Proj/Objects/multi_channel.d a/Proj/Objects/multi_channel.d new file mode 100644 index 0000000..f98ae5c --- /dev/null +++ a/Proj/Objects/multi_channel.d @@ -0,0 +1,7 @@ +.\objects\multi_channel.o: ..\Base_core\core_src\multi_channel.c +.\objects\multi_channel.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\multi_channel.o: ..\Base_core\core_lib\base_core.h +.\objects\multi_channel.o: ..\inc\base_config.h +.\objects\multi_channel.o: ..\Base_core\core_lib\base_core_user.h +.\objects\multi_channel.o: ..\Base_core\core_lib\platform_interface.h +.\objects\multi_channel.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/multi_channel.o a/Proj/Objects/multi_channel.o new file mode 100644 index 0000000..1ce9ad4 --- /dev/null +++ a/Proj/Objects/multi_channel.o diff --git b/Proj/Objects/platform.crf a/Proj/Objects/platform.crf new file mode 100644 index 0000000..5c590e3 --- /dev/null +++ a/Proj/Objects/platform.crf diff --git b/Proj/Objects/platform.d a/Proj/Objects/platform.d new file mode 100644 index 0000000..31ee24f --- /dev/null +++ a/Proj/Objects/platform.d @@ -0,0 +1,48 @@ +.\objects\platform.o: ..\Base_core\user_driver\platform.c +.\objects\platform.o: ..\Base_core\user_lib\platform.h +.\objects\platform.o: ..\Base_core\core_lib\platform_interface.h +.\objects\platform.o: ..\Base_core\user_lib\HW_MCUIO.h +.\objects\platform.o: ..\Base_core\user_lib\function.h +.\objects\platform.o: ..\inc\base_config.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\platform.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\platform.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\platform.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\platform.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\platform.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\platform.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\platform.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\platform.o: ..\inc\gd32f30x_libopt.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\platform.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\platform.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\platform.o: ..\Base_core\core_lib\function_interface.h +.\objects\platform.o: ..\inc\usbd_hw.h +.\objects\platform.o: ..\inc\usbd_conf.h +.\objects\platform.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\custom_hid_core.h +.\objects\platform.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h +.\objects\platform.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\platform.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\platform.o: ..\Drivers\GD32F30x_usbd_library\class\device\hid\Include\usb_hid.h diff --git b/Proj/Objects/platform.o a/Proj/Objects/platform.o new file mode 100644 index 0000000..7a82742 --- /dev/null +++ a/Proj/Objects/platform.o diff --git b/Proj/Objects/queue_circle.crf a/Proj/Objects/queue_circle.crf new file mode 100644 index 0000000..ed50d52 --- /dev/null +++ a/Proj/Objects/queue_circle.crf diff --git b/Proj/Objects/queue_circle.d a/Proj/Objects/queue_circle.d new file mode 100644 index 0000000..b160509 --- /dev/null +++ a/Proj/Objects/queue_circle.d @@ -0,0 +1,5 @@ +.\objects\queue_circle.o: ..\Base_core\core_src\Queue_circle.c +.\objects\queue_circle.o: ..\Base_core\core_lib\base_core_user.h +.\objects\queue_circle.o: ..\Base_core\core_lib\base_core.h +.\objects\queue_circle.o: ..\inc\base_config.h +.\objects\queue_circle.o: ..\Base_core\core_lib\platform_interface.h diff --git b/Proj/Objects/queue_circle.o a/Proj/Objects/queue_circle.o new file mode 100644 index 0000000..8bb6e6f --- /dev/null +++ a/Proj/Objects/queue_circle.o diff --git b/Proj/Objects/rf24l01 - multi.crf a/Proj/Objects/rf24l01 - multi.crf new file mode 100644 index 0000000..07404a5 --- /dev/null +++ a/Proj/Objects/rf24l01 - multi.crf diff --git b/Proj/Objects/rf24l01 - multi.d a/Proj/Objects/rf24l01 - multi.d new file mode 100644 index 0000000..9079bc4 --- /dev/null +++ a/Proj/Objects/rf24l01 - multi.d @@ -0,0 +1,43 @@ +.\objects\rf24l01 - multi.o: ..\Base_core\user_driver\RF24L01 - multi.c +.\objects\rf24l01 - multi.o: ..\Base_core\user_lib\RF24L01.h +.\objects\rf24l01 - multi.o: ..\Base_core\user_lib\function.h +.\objects\rf24l01 - multi.o: ..\inc\base_config.h +.\objects\rf24l01 - multi.o: ..\Base_core\user_lib\platform.h +.\objects\rf24l01 - multi.o: ..\Base_core\core_lib\platform_interface.h +.\objects\rf24l01 - multi.o: ..\Base_core\core_lib\base_core_user.h +.\objects\rf24l01 - multi.o: ..\Base_core\core_lib\function_interface.h +.\objects\rf24l01 - multi.o: ..\Base_core\user_lib\HW_MCUIO.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\rf24l01 - multi.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\rf24l01 - multi.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\rf24l01 - multi.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\rf24l01 - multi.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\rf24l01 - multi.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\rf24l01 - multi.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\rf24l01 - multi.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\rf24l01 - multi.o: ..\inc\gd32f30x_libopt.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\rf24l01 - multi.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\rf24l01 - multi.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/rf24l01 - multi.o a/Proj/Objects/rf24l01 - multi.o new file mode 100644 index 0000000..cf75330 --- /dev/null +++ a/Proj/Objects/rf24l01 - multi.o diff --git b/Proj/Objects/segger_rtt.crf a/Proj/Objects/segger_rtt.crf new file mode 100644 index 0000000..30ed593 --- /dev/null +++ a/Proj/Objects/segger_rtt.crf diff --git b/Proj/Objects/segger_rtt.d a/Proj/Objects/segger_rtt.d new file mode 100644 index 0000000..76ea498 --- /dev/null +++ a/Proj/Objects/segger_rtt.d @@ -0,0 +1,4 @@ +.\objects\segger_rtt.o: ..\RTT\SEGGER_RTT.c +.\objects\segger_rtt.o: ..\RTT\SEGGER_RTT.h +.\objects\segger_rtt.o: ..\RTT\SEGGER_RTT_Conf.h +.\objects\segger_rtt.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h diff --git b/Proj/Objects/segger_rtt.o a/Proj/Objects/segger_rtt.o new file mode 100644 index 0000000..b83ee7c --- /dev/null +++ a/Proj/Objects/segger_rtt.o diff --git b/Proj/Objects/segger_rtt_printf.crf a/Proj/Objects/segger_rtt_printf.crf new file mode 100644 index 0000000..00c148d --- /dev/null +++ a/Proj/Objects/segger_rtt_printf.crf diff --git b/Proj/Objects/segger_rtt_printf.d a/Proj/Objects/segger_rtt_printf.d new file mode 100644 index 0000000..0cfb656 --- /dev/null +++ a/Proj/Objects/segger_rtt_printf.d @@ -0,0 +1,5 @@ +.\objects\segger_rtt_printf.o: ..\RTT\SEGGER_RTT_printf.c +.\objects\segger_rtt_printf.o: ..\RTT\SEGGER_RTT.h +.\objects\segger_rtt_printf.o: ..\RTT\SEGGER_RTT_Conf.h +.\objects\segger_rtt_printf.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h +.\objects\segger_rtt_printf.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdarg.h diff --git b/Proj/Objects/segger_rtt_printf.o a/Proj/Objects/segger_rtt_printf.o new file mode 100644 index 0000000..afe353b --- /dev/null +++ a/Proj/Objects/segger_rtt_printf.o diff --git b/Proj/Objects/startup_gd32f30x_hd.d a/Proj/Objects/startup_gd32f30x_hd.d new file mode 100644 index 0000000..6864e91 --- /dev/null +++ a/Proj/Objects/startup_gd32f30x_hd.d @@ -0,0 +1 @@ +.\objects\startup_gd32f30x_hd.o: ..\Drivers\CMSIS\GD\GD32F30x\Source\ARM\startup_gd32f30x_hd.s diff --git b/Proj/Objects/startup_gd32f30x_hd.o a/Proj/Objects/startup_gd32f30x_hd.o new file mode 100644 index 0000000..199e9b0 --- /dev/null +++ a/Proj/Objects/startup_gd32f30x_hd.o diff --git b/Proj/Objects/system_gd32f30x.crf a/Proj/Objects/system_gd32f30x.crf new file mode 100644 index 0000000..23bfced --- /dev/null +++ a/Proj/Objects/system_gd32f30x.crf diff --git b/Proj/Objects/system_gd32f30x.d a/Proj/Objects/system_gd32f30x.d new file mode 100644 index 0000000..c69da99 --- /dev/null +++ a/Proj/Objects/system_gd32f30x.d @@ -0,0 +1,34 @@ +.\objects\system_gd32f30x.o: ..\Src\system_gd32f30x.c +.\objects\system_gd32f30x.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\system_gd32f30x.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\system_gd32f30x.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\system_gd32f30x.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\system_gd32f30x.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\system_gd32f30x.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\system_gd32f30x.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\system_gd32f30x.o: ..\inc\gd32f30x_libopt.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\system_gd32f30x.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\system_gd32f30x.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/system_gd32f30x.o a/Proj/Objects/system_gd32f30x.o new file mode 100644 index 0000000..082b4c4 --- /dev/null +++ a/Proj/Objects/system_gd32f30x.o diff --git b/Proj/Objects/transfer_keypad_pc.crf a/Proj/Objects/transfer_keypad_pc.crf new file mode 100644 index 0000000..1980a40 --- /dev/null +++ a/Proj/Objects/transfer_keypad_pc.crf diff --git b/Proj/Objects/transfer_keypad_pc.d a/Proj/Objects/transfer_keypad_pc.d new file mode 100644 index 0000000..548b015 --- /dev/null +++ a/Proj/Objects/transfer_keypad_pc.d @@ -0,0 +1,7 @@ +.\objects\transfer_keypad_pc.o: ..\Base_core\core_src\transfer_keypad_pc.c +.\objects\transfer_keypad_pc.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\transfer_keypad_pc.o: ..\Base_core\core_lib\base_core.h +.\objects\transfer_keypad_pc.o: ..\inc\base_config.h +.\objects\transfer_keypad_pc.o: ..\Base_core\core_lib\base_core_user.h +.\objects\transfer_keypad_pc.o: ..\Base_core\core_lib\platform_interface.h +.\objects\transfer_keypad_pc.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/transfer_keypad_pc.o a/Proj/Objects/transfer_keypad_pc.o new file mode 100644 index 0000000..9a5dcce --- /dev/null +++ a/Proj/Objects/transfer_keypad_pc.o diff --git b/Proj/Objects/transparentupgrade.crf a/Proj/Objects/transparentupgrade.crf new file mode 100644 index 0000000..5c81cc7 --- /dev/null +++ a/Proj/Objects/transparentupgrade.crf diff --git b/Proj/Objects/transparentupgrade.d a/Proj/Objects/transparentupgrade.d new file mode 100644 index 0000000..16e5891 --- /dev/null +++ a/Proj/Objects/transparentupgrade.d @@ -0,0 +1,7 @@ +.\objects\transparentupgrade.o: ..\Base_core\func_src\TransparentUpgrade.c +.\objects\transparentupgrade.o: ..\Base_core\core_lib\base_core_user.h +.\objects\transparentupgrade.o: ..\Base_core\user_lib\function.h +.\objects\transparentupgrade.o: ..\inc\base_config.h +.\objects\transparentupgrade.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\string.h +.\objects\transparentupgrade.o: ..\Base_core\core_lib\platform_interface.h +.\objects\transparentupgrade.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h diff --git b/Proj/Objects/transparentupgrade.o a/Proj/Objects/transparentupgrade.o new file mode 100644 index 0000000..91e93c3 --- /dev/null +++ a/Proj/Objects/transparentupgrade.o diff --git b/Proj/Objects/usbd_core.crf a/Proj/Objects/usbd_core.crf new file mode 100644 index 0000000..d218000 --- /dev/null +++ a/Proj/Objects/usbd_core.crf diff --git b/Proj/Objects/usbd_core.d a/Proj/Objects/usbd_core.d new file mode 100644 index 0000000..2689fb8 --- /dev/null +++ a/Proj/Objects/usbd_core.d @@ -0,0 +1,41 @@ +.\objects\usbd_core.o: ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_core.c +.\objects\usbd_core.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\usbd_core.o: ..\inc\usbd_conf.h +.\objects\usbd_core.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_core.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\usbd_core.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\usbd_core.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\usbd_core.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\usbd_core.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\usbd_core.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\usbd_core.o: ..\inc\gd32f30x_libopt.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\usbd_core.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_transc.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_core.h +.\objects\usbd_core.o: ..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_regs.h diff --git b/Proj/Objects/usbd_core.o a/Proj/Objects/usbd_core.o new file mode 100644 index 0000000..a550331 --- /dev/null +++ a/Proj/Objects/usbd_core.o diff --git b/Proj/Objects/usbd_enum.crf a/Proj/Objects/usbd_enum.crf new file mode 100644 index 0000000..b526f60 --- /dev/null +++ a/Proj/Objects/usbd_enum.crf diff --git b/Proj/Objects/usbd_enum.d a/Proj/Objects/usbd_enum.d new file mode 100644 index 0000000..81473b0 --- /dev/null +++ a/Proj/Objects/usbd_enum.d @@ -0,0 +1,39 @@ +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_enum.c +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\usbd_enum.o: ..\inc\usbd_conf.h +.\objects\usbd_enum.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_enum.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\usbd_enum.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\usbd_enum.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\usbd_enum.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\usbd_enum.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\usbd_enum.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\usbd_enum.o: ..\inc\gd32f30x_libopt.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\usbd_enum.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\usbd_enum.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_transc.h diff --git b/Proj/Objects/usbd_enum.o a/Proj/Objects/usbd_enum.o new file mode 100644 index 0000000..4d7f9ed --- /dev/null +++ a/Proj/Objects/usbd_enum.o diff --git b/Proj/Objects/usbd_lld_core.crf a/Proj/Objects/usbd_lld_core.crf new file mode 100644 index 0000000..d7268a5 --- /dev/null +++ a/Proj/Objects/usbd_lld_core.crf diff --git b/Proj/Objects/usbd_lld_core.d a/Proj/Objects/usbd_lld_core.d new file mode 100644 index 0000000..188bf81 --- /dev/null +++ a/Proj/Objects/usbd_lld_core.d @@ -0,0 +1,40 @@ +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_core.c +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_core.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_regs.h +.\objects\usbd_lld_core.o: ..\inc\usbd_conf.h +.\objects\usbd_lld_core.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_lld_core.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\usbd_lld_core.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\usbd_lld_core.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\usbd_lld_core.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\usbd_lld_core.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\usbd_lld_core.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\usbd_lld_core.o: ..\inc\gd32f30x_libopt.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\usbd_lld_core.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\usbd_lld_core.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h diff --git b/Proj/Objects/usbd_lld_core.o a/Proj/Objects/usbd_lld_core.o new file mode 100644 index 0000000..d5da24e --- /dev/null +++ a/Proj/Objects/usbd_lld_core.o diff --git b/Proj/Objects/usbd_lld_int.crf a/Proj/Objects/usbd_lld_int.crf new file mode 100644 index 0000000..0d9af47 --- /dev/null +++ a/Proj/Objects/usbd_lld_int.crf diff --git b/Proj/Objects/usbd_lld_int.d a/Proj/Objects/usbd_lld_int.d new file mode 100644 index 0000000..f64964d --- /dev/null +++ a/Proj/Objects/usbd_lld_int.d @@ -0,0 +1,42 @@ +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_usbd_library\usbd\Source\usbd_lld_int.c +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_int.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\usbd_lld_int.o: ..\inc\usbd_conf.h +.\objects\usbd_lld_int.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_lld_int.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\usbd_lld_int.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\usbd_lld_int.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\usbd_lld_int.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\usbd_lld_int.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\usbd_lld_int.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\usbd_lld_int.o: ..\inc\gd32f30x_libopt.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\usbd_lld_int.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_pwr.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_core.h +.\objects\usbd_lld_int.o: ..\Drivers\GD32F30x_usbd_library\usbd\Include\usbd_lld_regs.h diff --git b/Proj/Objects/usbd_lld_int.o a/Proj/Objects/usbd_lld_int.o new file mode 100644 index 0000000..2035d80 --- /dev/null +++ a/Proj/Objects/usbd_lld_int.o diff --git b/Proj/Objects/usbd_pwr.crf a/Proj/Objects/usbd_pwr.crf new file mode 100644 index 0000000..40f3e1b --- /dev/null +++ a/Proj/Objects/usbd_pwr.crf diff --git b/Proj/Objects/usbd_pwr.d a/Proj/Objects/usbd_pwr.d new file mode 100644 index 0000000..7516cb0 --- /dev/null +++ a/Proj/Objects/usbd_pwr.d @@ -0,0 +1,38 @@ +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_pwr.c +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_pwr.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\usbd_pwr.o: ..\inc\usbd_conf.h +.\objects\usbd_pwr.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_pwr.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\usbd_pwr.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\usbd_pwr.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\usbd_pwr.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\usbd_pwr.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\usbd_pwr.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\usbd_pwr.o: ..\inc\gd32f30x_libopt.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\usbd_pwr.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\usbd_pwr.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h diff --git b/Proj/Objects/usbd_pwr.o a/Proj/Objects/usbd_pwr.o new file mode 100644 index 0000000..ad949b3 --- /dev/null +++ a/Proj/Objects/usbd_pwr.o diff --git b/Proj/Objects/usbd_transc.crf a/Proj/Objects/usbd_transc.crf new file mode 100644 index 0000000..3896e30 --- /dev/null +++ a/Proj/Objects/usbd_transc.crf diff --git b/Proj/Objects/usbd_transc.d a/Proj/Objects/usbd_transc.d new file mode 100644 index 0000000..e688206 --- /dev/null +++ a/Proj/Objects/usbd_transc.d @@ -0,0 +1,39 @@ +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_usbd_library\device\Source\usbd_transc.c +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_enum.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_core.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usb_ch9_std.h +.\objects\usbd_transc.o: ..\inc\usbd_conf.h +.\objects\usbd_transc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_transc.o: ..\Drivers\CMSIS\core_cm4.h +.\objects\usbd_transc.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h +.\objects\usbd_transc.o: ..\Drivers\CMSIS\core_cmInstr.h +.\objects\usbd_transc.o: ..\Drivers\CMSIS\core_cmFunc.h +.\objects\usbd_transc.o: ..\Drivers\CMSIS\core_cm4_simd.h +.\objects\usbd_transc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\system_gd32f30x.h +.\objects\usbd_transc.o: ..\inc\gd32f30x_libopt.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rcu.h +.\objects\usbd_transc.o: ..\Drivers\CMSIS\GD\GD32F30x\Include\gd32f30x.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_adc.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_can.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_crc.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_ctc.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dac.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dbg.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_dma.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exti.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fmc.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_fwdgt.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_gpio.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_i2c.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_pmu.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_bkp.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_rtc.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_sdio.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_spi.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_timer.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_usart.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_wwdgt.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_misc.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_enet.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_standard_peripheral\Include\gd32f30x_exmc.h +.\objects\usbd_transc.o: ..\Drivers\GD32F30x_usbd_library\device\Include\usbd_transc.h diff --git b/Proj/Objects/usbd_transc.o a/Proj/Objects/usbd_transc.o new file mode 100644 index 0000000..ecefeb7 --- /dev/null +++ a/Proj/Objects/usbd_transc.o diff --git b/Proj/Objects/vote__process.crf a/Proj/Objects/vote__process.crf new file mode 100644 index 0000000..5e092a7 --- /dev/null +++ a/Proj/Objects/vote__process.crf diff --git b/Proj/Objects/vote__process.d a/Proj/Objects/vote__process.d new file mode 100644 index 0000000..82189e3 --- /dev/null +++ a/Proj/Objects/vote__process.d @@ -0,0 +1,5 @@ +.\objects\vote__process.o: ..\Base_core\core_src\vote__process.c +.\objects\vote__process.o: ..\Base_core\core_lib\base_core.h +.\objects\vote__process.o: ..\inc\base_config.h +.\objects\vote__process.o: ..\Base_core\core_lib\base_core_user.h +.\objects\vote__process.o: ..\Base_core\core_lib\platform_interface.h diff --git b/Proj/Objects/vote__process.o a/Proj/Objects/vote__process.o new file mode 100644 index 0000000..a20444f --- /dev/null +++ a/Proj/Objects/vote__process.o diff --git b/Proj/Objects/vote__report.crf a/Proj/Objects/vote__report.crf new file mode 100644 index 0000000..ac622a0 --- /dev/null +++ a/Proj/Objects/vote__report.crf diff --git b/Proj/Objects/vote__report.d a/Proj/Objects/vote__report.d new file mode 100644 index 0000000..ea64b9a --- /dev/null +++ a/Proj/Objects/vote__report.d @@ -0,0 +1,7 @@ +.\objects\vote__report.o: ..\Base_core\core_src\vote__report.c +.\objects\vote__report.o: ..\Base_core\core_lib\base_pc_protocol.h +.\objects\vote__report.o: ..\Base_core\core_lib\base_core.h +.\objects\vote__report.o: ..\inc\base_config.h +.\objects\vote__report.o: ..\Base_core\core_lib\base_core_user.h +.\objects\vote__report.o: ..\Base_core\core_lib\platform_interface.h +.\objects\vote__report.o: ..\Base_core\core_lib\function_interface.h diff --git b/Proj/Objects/vote__report.o a/Proj/Objects/vote__report.o new file mode 100644 index 0000000..7ed2e81 --- /dev/null +++ a/Proj/Objects/vote__report.o diff --git b/RTT/Global.h a/RTT/Global.h new file mode 100644 index 0000000..3891936 --- /dev/null +++ a/RTT/Global.h @@ -0,0 +1,113 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.30 * +* * +********************************************************************** +---------------------------------------------------------------------- +File : Global.h +Purpose : Global types + In case your application already has a Global.h, you should + merge the files. In order to use Segger code, the types + U8, U16, U32, I8, I16, I32 need to be defined in Global.h; + additional definitions do not hurt. +Revision: $Rev: 12501 $ +---------------------------END-OF-HEADER------------------------------ +*/ + +#ifndef GLOBAL_H // Guard against multiple inclusion +#define GLOBAL_H + +#define U8 unsigned char +#define I8 signed char +#define U16 unsigned short +#define I16 signed short +#ifdef __x86_64__ +#define U32 unsigned +#define I32 int +#else +#define U32 unsigned long +#define I32 signed long +#endif + +// +// CC_NO_LONG_SUPPORT can be defined to compile test +// without long support for compilers that do not +// support C99 and its long type. +// +#ifdef CC_NO_LONG_SUPPORT + #define PTR_ADDR U32 +#else // Supports long type. +#if defined(_WIN32) && !defined(__clang__) && !defined(__MINGW32__) + // + // Microsoft VC6 compiler related + // + #define U64 unsigned __int64 + #define U128 unsigned __int128 + #define I64 __int64 + #define I128 __int128 + #if _MSC_VER <= 1200 + #define U64_C(x) x##UI64 + #else + #define U64_C(x) x##ULL + #endif +#else + // + // C99 compliant compiler + // + #define U64 unsigned long long + #define I64 signed long long + #define U64_C(x) x##ULL +#endif + +#if (defined(_WIN64) || defined(__LP64__)) // 64-bit symbols used by Visual Studio and GCC, maybe others as well. + #define PTR_ADDR U64 +#else + #define PTR_ADDR U32 +#endif +#endif // Supports long type. + +#endif // Avoid multiple inclusion + +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER.h a/RTT/SEGGER.h new file mode 100644 index 0000000..aa3b94a --- /dev/null +++ a/RTT/SEGGER.h @@ -0,0 +1,248 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.30 * +* * +********************************************************************** +---------------------------------------------------------------------- +File : SEGGER.h +Purpose : Global types etc & general purpose utility functions +Revision: $Rev: 18102 $ +---------------------------END-OF-HEADER------------------------------ +*/ + +#ifndef SEGGER_H // Guard against multiple inclusion +#define SEGGER_H + +#include // For va_list. +#include "Global.h" // Type definitions: U8, U16, U32, I8, I16, I32 + +#if defined(__cplusplus) +extern "C" { /* Make sure we have C-declarations in C++ programs */ +#endif + +/********************************************************************* +* +* Keywords/specifiers +* +********************************************************************** +*/ + +#ifndef INLINE + #if (defined(__ICCARM__) || defined(__RX) || defined(__ICCRX__)) + // + // Other known compilers. + // + #define INLINE inline + #else + #if (defined(_WIN32) && !defined(__clang__)) + // + // Microsoft VC6 and newer. + // Force inlining without cost checking. + // + #define INLINE __forceinline + #elif defined(__GNUC__) || defined(__clang__) + // + // Force inlining with GCC + clang + // + #define INLINE inline __attribute__((always_inline)) + #elif (defined(__CC_ARM)) + // + // Force inlining with ARMCC (Keil) + // + #define INLINE __inline + #else + // + // Unknown compilers. + // + #define INLINE + #endif + #endif +#endif + +/********************************************************************* +* +* Function-like macros +* +********************************************************************** +*/ + +#define SEGGER_COUNTOF(a) (sizeof((a))/sizeof((a)[0])) +#define SEGGER_MIN(a,b) (((a) < (b)) ? (a) : (b)) +#define SEGGER_MAX(a,b) (((a) > (b)) ? (a) : (b)) + +#ifndef SEGGER_USE_PARA // Some compiler complain about unused parameters. + #define SEGGER_USE_PARA(Para) (void)Para // This works for most compilers. +#endif + +#define SEGGER_ADDR2PTR(Type, Addr) (/*lint -e(923) -e(9078)*/((Type*)((PTR_ADDR)(Addr)))) // Allow cast from address to pointer. +#define SEGGER_PTR2ADDR(p) (/*lint -e(923) -e(9078)*/((PTR_ADDR)(p))) // Allow cast from pointer to address. +#define SEGGER_PTR2PTR(Type, p) (/*lint -e(740) -e(826) -e(9079) -e(9087)*/((Type*)(p))) // Allow cast from one pointer type to another (ignore different size). +#define SEGGER_PTR_DISTANCE(p0, p1) (SEGGER_PTR2ADDR(p0) - SEGGER_PTR2ADDR(p1)) + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +#define SEGGER_PRINTF_FLAG_ADJLEFT (1 << 0) +#define SEGGER_PRINTF_FLAG_SIGNFORCE (1 << 1) +#define SEGGER_PRINTF_FLAG_SIGNSPACE (1 << 2) +#define SEGGER_PRINTF_FLAG_PRECEED (1 << 3) +#define SEGGER_PRINTF_FLAG_ZEROPAD (1 << 4) +#define SEGGER_PRINTF_FLAG_NEGATIVE (1 << 5) + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef struct { + char* pBuffer; + int BufferSize; + int Cnt; +} SEGGER_BUFFER_DESC; + +typedef struct { + unsigned int CacheLineSize; // 0: No Cache. Most Systems such as ARM9 use a 32 bytes cache line size. + void (*pfDMB) (void); // Optional DMB function for Data Memory Barrier to make sure all memory operations are completed. + void (*pfClean) (void *p, unsigned long NumBytes); // Optional clean function for cached memory. + void (*pfInvalidate)(void *p, unsigned long NumBytes); // Optional invalidate function for cached memory. +} SEGGER_CACHE_CONFIG; + +typedef struct SEGGER_SNPRINTF_CONTEXT_struct SEGGER_SNPRINTF_CONTEXT; + +struct SEGGER_SNPRINTF_CONTEXT_struct { + void* pContext; // Application specific context. + SEGGER_BUFFER_DESC* pBufferDesc; // Buffer descriptor to use for output. + void (*pfFlush)(SEGGER_SNPRINTF_CONTEXT* pContext); // Callback executed once the buffer is full. Callback decides if the buffer gets cleared to store more or not. +}; + +typedef struct { + void (*pfStoreChar) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, char c); + int (*pfPrintUnsigned) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, U32 v, unsigned Base, char Flags, int Width, int Precision); + int (*pfPrintInt) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, I32 v, unsigned Base, char Flags, int Width, int Precision); +} SEGGER_PRINTF_API; + +typedef void (*SEGGER_pFormatter)(SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, const SEGGER_PRINTF_API* pApi, va_list* pParamList, char Lead, int Width, int Precision); + +typedef struct SEGGER_PRINTF_FORMATTER { + struct SEGGER_PRINTF_FORMATTER* pNext; // Pointer to next formatter. + SEGGER_pFormatter pfFormatter; // Formatter function. + char Specifier; // Format specifier. +} SEGGER_PRINTF_FORMATTER; + +typedef struct { + U32 (*pfGetHPTimestamp)(void); // Mandatory, pfGetHPTimestamp + int (*pfGetUID) (U8 abUID[16]); // Optional, pfGetUID +} SEGGER_BSP_API; + +/********************************************************************* +* +* Utility functions +* +********************************************************************** +*/ + +// +// Memory operations. +// +void SEGGER_ARM_memcpy(void* pDest, const void* pSrc, int NumBytes); +void SEGGER_memcpy (void* pDest, const void* pSrc, unsigned NumBytes); +void SEGGER_memxor (void* pDest, const void* pSrc, unsigned NumBytes); + +// +// String functions. +// +int SEGGER_atoi (const char* s); +int SEGGER_isalnum (int c); +int SEGGER_isalpha (int c); +unsigned SEGGER_strlen (const char* s); +int SEGGER_tolower (int c); +int SEGGER_strcasecmp (const char* sText1, const char* sText2); +int SEGGER_strncasecmp(const char *sText1, const char *sText2, unsigned Count); + +// +// Buffer/printf related. +// +void SEGGER_StoreChar (SEGGER_BUFFER_DESC* pBufferDesc, char c); +void SEGGER_PrintUnsigned(SEGGER_BUFFER_DESC* pBufferDesc, U32 v, unsigned Base, int Precision); +void SEGGER_PrintInt (SEGGER_BUFFER_DESC* pBufferDesc, I32 v, unsigned Base, int Precision); +int SEGGER_snprintf (char* pBuffer, int BufferSize, const char* sFormat, ...); +int SEGGER_vsnprintf (char* pBuffer, int BufferSize, const char* sFormat, va_list ParamList); +int SEGGER_vsnprintfEx (SEGGER_SNPRINTF_CONTEXT* pContext, const char* sFormat, va_list ParamList); + +int SEGGER_PRINTF_AddFormatter (SEGGER_PRINTF_FORMATTER* pFormatter, SEGGER_pFormatter pfFormatter, char c); +void SEGGER_PRINTF_AddDoubleFormatter (void); +void SEGGER_PRINTF_AddIPFormatter (void); +void SEGGER_PRINTF_AddBLUEFormatter (void); +void SEGGER_PRINTF_AddCONNECTFormatter(void); +void SEGGER_PRINTF_AddSSLFormatter (void); +void SEGGER_PRINTF_AddSSHFormatter (void); +void SEGGER_PRINTF_AddHTMLFormatter (void); + +// +// BSP abstraction API. +// +int SEGGER_BSP_GetUID (U8 abUID[16]); +int SEGGER_BSP_GetUID32(U32* pUID); +void SEGGER_BSP_SetAPI (const SEGGER_BSP_API* pAPI); +void SEGGER_BSP_SeedUID (void); + +// +// Other API. +// +void SEGGER_VERSION_GetString(char acText[8], unsigned Version); + +#if defined(__cplusplus) +} /* Make sure we have C-declarations in C++ programs */ +#endif + +#endif // Avoid multiple inclusion + +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER_RTT.c a/RTT/SEGGER_RTT.c new file mode 100644 index 0000000..2e55cbe --- /dev/null +++ a/RTT/SEGGER_RTT.c @@ -0,0 +1,1744 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2018 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* conditions are met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this list of conditions and the following disclaimer. * +* * +* o Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the following * +* disclaimer in the documentation and/or other materials provided * +* with the distribution. * +* * +* o Neither the name of SEGGER Microcontroller GmbH * +* nor the names of its contributors may be used to endorse or * +* promote products derived from this software without specific * +* prior written permission. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 6.30b * +* * +********************************************************************** +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT.c +Purpose : Implementation of SEGGER real-time transfer (RTT) which + allows real-time communication on targets which support + debugger memory accesses while the CPU is running. +Revision: $Rev: 9599 $ + +Additional information: + Type "int" is assumed to be 32-bits in size + H->T Host to target communication + T->H Target to host communication + + RTT channel 0 is always present and reserved for Terminal usage. + Name is fixed to "Terminal" + + Effective buffer size: SizeOfBuffer - 1 + + WrOff == RdOff: Buffer is empty + WrOff == (RdOff - 1): Buffer is full + WrOff > RdOff: Free space includes wrap-around + WrOff < RdOff: Used space includes wrap-around + (WrOff == (SizeOfBuffer - 1)) && (RdOff == 0): + Buffer full and wrap-around after next byte + + +---------------------------------------------------------------------- +*/ + +#include "SEGGER_RTT.h" + +#include // for memcpy + +/********************************************************************* +* +* Configuration, default values +* +********************************************************************** +*/ + +#ifndef BUFFER_SIZE_UP + #define BUFFER_SIZE_UP 1024 // Size of the buffer for terminal output of target, up to host +#endif + +#ifndef BUFFER_SIZE_DOWN + #define BUFFER_SIZE_DOWN 16 // Size of the buffer for terminal input to target from host (Usually keyboard input) +#endif + +#ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS + #define SEGGER_RTT_MAX_NUM_UP_BUFFERS 2 // Number of up-buffers (T->H) available on this target +#endif + +#ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS + #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS 2 // Number of down-buffers (H->T) available on this target +#endif + +#ifndef SEGGER_RTT_BUFFER_SECTION + #if defined(SEGGER_RTT_SECTION) + #define SEGGER_RTT_BUFFER_SECTION SEGGER_RTT_SECTION + #endif +#endif + +#ifndef SEGGER_RTT_ALIGNMENT + #define SEGGER_RTT_ALIGNMENT 0 +#endif + +#ifndef SEGGER_RTT_BUFFER_ALIGNMENT + #define SEGGER_RTT_BUFFER_ALIGNMENT 0 +#endif + +#ifndef SEGGER_RTT_MODE_DEFAULT + #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP +#endif + +#ifndef SEGGER_RTT_LOCK + #define SEGGER_RTT_LOCK() +#endif + +#ifndef SEGGER_RTT_UNLOCK + #define SEGGER_RTT_UNLOCK() +#endif + +#ifndef STRLEN + #define STRLEN(a) strlen((a)) +#endif + +#ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP + #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 +#endif + +#ifndef SEGGER_RTT_MEMCPY + #ifdef MEMCPY + #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) MEMCPY((pDest), (pSrc), (NumBytes)) + #else + #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) memcpy((pDest), (pSrc), (NumBytes)) + #endif +#endif + +#ifndef MIN + #define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX + #define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif +// +// For some environments, NULL may not be defined until certain headers are included +// +#ifndef NULL + #define NULL 0 +#endif + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ +#if (defined __ICCARM__) || (defined __ICCRX__) + #define RTT_PRAGMA(P) _Pragma(#P) +#endif + +#if SEGGER_RTT_ALIGNMENT || SEGGER_RTT_BUFFER_ALIGNMENT + #if (defined __GNUC__) + #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) + #elif (defined __ICCARM__) || (defined __ICCRX__) + #define PRAGMA(A) _Pragma(#A) +#define SEGGER_RTT_ALIGN(Var, Alignment) RTT_PRAGMA(data_alignment=Alignment) \ + Var + #elif (defined __CC_ARM) + #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) + #else + #error "Alignment not supported for this compiler." + #endif +#else + #define SEGGER_RTT_ALIGN(Var, Alignment) Var +#endif + +#if defined(SEGGER_RTT_SECTION) || defined (SEGGER_RTT_BUFFER_SECTION) + #if (defined __GNUC__) + #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section))) Var + #elif (defined __ICCARM__) || (defined __ICCRX__) +#define SEGGER_RTT_PUT_SECTION(Var, Section) RTT_PRAGMA(location=Section) \ + Var + #elif (defined __CC_ARM) + #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section), zero_init)) Var + #else + #error "Section placement not supported for this compiler." + #endif +#else + #define SEGGER_RTT_PUT_SECTION(Var, Section) Var +#endif + + +#if SEGGER_RTT_ALIGNMENT + #define SEGGER_RTT_CB_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_ALIGNMENT) +#else + #define SEGGER_RTT_CB_ALIGN(Var) Var +#endif + +#if SEGGER_RTT_BUFFER_ALIGNMENT + #define SEGGER_RTT_BUFFER_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_BUFFER_ALIGNMENT) +#else + #define SEGGER_RTT_BUFFER_ALIGN(Var) Var +#endif + + +#if defined(SEGGER_RTT_SECTION) + #define SEGGER_RTT_PUT_CB_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_SECTION) +#else + #define SEGGER_RTT_PUT_CB_SECTION(Var) Var +#endif + +#if defined(SEGGER_RTT_BUFFER_SECTION) + #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_BUFFER_SECTION) +#else + #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) Var +#endif + +/********************************************************************* +* +* Static const data +* +********************************************************************** +*/ + +static unsigned char _aTerminalId[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ +// +// RTT Control Block and allocate buffers for channel 0 +// +SEGGER_RTT_PUT_CB_SECTION(SEGGER_RTT_CB_ALIGN(SEGGER_RTT_CB _SEGGER_RTT)); + +SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acUpBuffer [BUFFER_SIZE_UP])); +SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acDownBuffer[BUFFER_SIZE_DOWN])); + +static char _ActiveTerminal; + +/********************************************************************* +* +* Static functions +* +********************************************************************** +*/ + +/********************************************************************* +* +* _DoInit() +* +* Function description +* Initializes the control block an buffers. +* May only be called via INIT() to avoid overriding settings. +* +*/ +#define INIT() do { \ + if (_SEGGER_RTT.acID[0] == '\0') { _DoInit(); } \ + } while (0) +static void _DoInit(void) { + SEGGER_RTT_CB* p; + // + // Initialize control block + // + p = &_SEGGER_RTT; + p->MaxNumUpBuffers = SEGGER_RTT_MAX_NUM_UP_BUFFERS; + p->MaxNumDownBuffers = SEGGER_RTT_MAX_NUM_DOWN_BUFFERS; + // + // Initialize up buffer 0 + // + p->aUp[0].sName = "Terminal"; + p->aUp[0].pBuffer = _acUpBuffer; + p->aUp[0].SizeOfBuffer = sizeof(_acUpBuffer); + p->aUp[0].RdOff = 0u; + p->aUp[0].WrOff = 0u; + p->aUp[0].Flags = SEGGER_RTT_MODE_DEFAULT; + // + // Initialize down buffer 0 + // + p->aDown[0].sName = "Terminal"; + p->aDown[0].pBuffer = _acDownBuffer; + p->aDown[0].SizeOfBuffer = sizeof(_acDownBuffer); + p->aDown[0].RdOff = 0u; + p->aDown[0].WrOff = 0u; + p->aDown[0].Flags = SEGGER_RTT_MODE_DEFAULT; + // + // Finish initialization of the control block. + // Copy Id string in three steps to make sure "SEGGER RTT" is not found + // in initializer memory (usually flash) by J-Link + // + strcpy(&p->acID[7], "RTT"); + strcpy(&p->acID[0], "SEGGER"); + p->acID[6] = ' '; +} + +/********************************************************************* +* +* _WriteBlocking() +* +* Function description +* Stores a specified number of characters in SEGGER RTT ring buffer +* and updates the associated write pointer which is periodically +* read by the host. +* The caller is responsible for managing the write chunk sizes as +* _WriteBlocking() will block until all data has been posted successfully. +* +* Parameters +* pRing Ring buffer to post to. +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* >= 0 - Number of bytes written into buffer. +*/ +static unsigned _WriteBlocking(SEGGER_RTT_BUFFER_UP* pRing, const char* pBuffer, unsigned NumBytes) { + unsigned NumBytesToWrite; + unsigned NumBytesWritten; + unsigned RdOff; + unsigned WrOff; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + char* pDst; +#endif + // + // Write data to buffer and handle wrap-around if necessary + // + NumBytesWritten = 0u; + WrOff = pRing->WrOff; + do { + RdOff = pRing->RdOff; // May be changed by host (debug probe) in the meantime + if (RdOff > WrOff) { + NumBytesToWrite = RdOff - WrOff - 1u; + } else { + NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u); + } + NumBytesToWrite = MIN(NumBytesToWrite, (pRing->SizeOfBuffer - WrOff)); // Number of bytes that can be written until buffer wrap-around + NumBytesToWrite = MIN(NumBytesToWrite, NumBytes); +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = pRing->pBuffer + WrOff; + NumBytesWritten += NumBytesToWrite; + NumBytes -= NumBytesToWrite; + WrOff += NumBytesToWrite; + while (NumBytesToWrite--) { + *pDst++ = *pBuffer++; + }; +#else + SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pBuffer, NumBytesToWrite); + NumBytesWritten += NumBytesToWrite; + pBuffer += NumBytesToWrite; + NumBytes -= NumBytesToWrite; + WrOff += NumBytesToWrite; +#endif + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0u; + } + pRing->WrOff = WrOff; + } while (NumBytes); + // + return NumBytesWritten; +} + +/********************************************************************* +* +* _WriteNoCheck() +* +* Function description +* Stores a specified number of characters in SEGGER RTT ring buffer +* and updates the associated write pointer which is periodically +* read by the host. +* It is callers responsibility to make sure data actually fits in buffer. +* +* Parameters +* pRing Ring buffer to post to. +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Notes +* (1) If there might not be enough space in the "Up"-buffer, call _WriteBlocking +*/ +static void _WriteNoCheck(SEGGER_RTT_BUFFER_UP* pRing, const char* pData, unsigned NumBytes) { + unsigned NumBytesAtOnce; + unsigned WrOff; + unsigned Rem; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + char* pDst; +#endif + + WrOff = pRing->WrOff; + Rem = pRing->SizeOfBuffer - WrOff; + if (Rem > NumBytes) { + // + // All data fits before wrap around + // +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = pRing->pBuffer + WrOff; + WrOff += NumBytes; + while (NumBytes--) { + *pDst++ = *pData++; + }; + pRing->WrOff = WrOff; +#else + SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, NumBytes); + pRing->WrOff = WrOff + NumBytes; +#endif + } else { + // + // We reach the end of the buffer, so need to wrap around + // +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = pRing->pBuffer + WrOff; + NumBytesAtOnce = Rem; + while (NumBytesAtOnce--) { + *pDst++ = *pData++; + }; + pDst = pRing->pBuffer; + NumBytesAtOnce = NumBytes - Rem; + while (NumBytesAtOnce--) { + *pDst++ = *pData++; + }; + pRing->WrOff = NumBytes - Rem; +#else + NumBytesAtOnce = Rem; + SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, NumBytesAtOnce); + NumBytesAtOnce = NumBytes - Rem; + SEGGER_RTT_MEMCPY(pRing->pBuffer, pData + Rem, NumBytesAtOnce); + pRing->WrOff = NumBytesAtOnce; +#endif + } +} + +/********************************************************************* +* +* _PostTerminalSwitch() +* +* Function description +* Switch terminal to the given terminal ID. It is the caller's +* responsibility to ensure the terminal ID is correct and there is +* enough space in the buffer for this to complete successfully. +* +* Parameters +* pRing Ring buffer to post to. +* TerminalId Terminal ID to switch to. +*/ +static void _PostTerminalSwitch(SEGGER_RTT_BUFFER_UP* pRing, unsigned char TerminalId) { + unsigned char ac[2]; + + ac[0] = 0xFFu; + ac[1] = _aTerminalId[TerminalId]; // Caller made already sure that TerminalId does not exceed our terminal limit + _WriteBlocking(pRing, (const char*)ac, 2u); +} + +/********************************************************************* +* +* _GetAvailWriteSpace() +* +* Function description +* Returns the number of bytes that can be written to the ring +* buffer without blocking. +* +* Parameters +* pRing Ring buffer to check. +* +* Return value +* Number of bytes that are free in the buffer. +*/ +static unsigned _GetAvailWriteSpace(SEGGER_RTT_BUFFER_UP* pRing) { + unsigned RdOff; + unsigned WrOff; + unsigned r; + // + // Avoid warnings regarding volatile access order. It's not a problem + // in this case, but dampen compiler enthusiasm. + // + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + if (RdOff <= WrOff) { + r = pRing->SizeOfBuffer - 1u - WrOff + RdOff; + } else { + r = RdOff - WrOff - 1u; + } + return r; +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* SEGGER_RTT_ReadNoLock() +* +* Function description +* Reads characters from SEGGER real-time-terminal control block +* which have been previously stored by the host. +* Do not lock against interrupts and multiple access. +* +* Parameters +* BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. +* BufferSize Size of the target application buffer. +* +* Return value +* Number of bytes that have been read. +*/ +unsigned SEGGER_RTT_ReadNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) { + unsigned NumBytesRem; + unsigned NumBytesRead; + unsigned RdOff; + unsigned WrOff; + unsigned char* pBuffer; + SEGGER_RTT_BUFFER_DOWN* pRing; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + const char* pSrc; +#endif + // + INIT(); + pRing = &_SEGGER_RTT.aDown[BufferIndex]; + pBuffer = (unsigned char*)pData; + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + NumBytesRead = 0u; + // + // Read from current read position to wrap-around of buffer, first + // + if (RdOff > WrOff) { + NumBytesRem = pRing->SizeOfBuffer - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pSrc = pRing->pBuffer + RdOff; + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, pRing->pBuffer + RdOff, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + // + // Handle wrap-around of buffer + // + if (RdOff == pRing->SizeOfBuffer) { + RdOff = 0u; + } + } + // + // Read remaining items of buffer + // + NumBytesRem = WrOff - RdOff; + NumBytesRem = MIN(NumBytesRem, BufferSize); + if (NumBytesRem > 0u) { +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pSrc = pRing->pBuffer + RdOff; + NumBytesRead += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; + while (NumBytesRem--) { + *pBuffer++ = *pSrc++; + }; +#else + SEGGER_RTT_MEMCPY(pBuffer, pRing->pBuffer + RdOff, NumBytesRem); + NumBytesRead += NumBytesRem; + pBuffer += NumBytesRem; + BufferSize -= NumBytesRem; + RdOff += NumBytesRem; +#endif + } + if (NumBytesRead) { + pRing->RdOff = RdOff; + } + // + return NumBytesRead; +} + +/********************************************************************* +* +* SEGGER_RTT_Read +* +* Function description +* Reads characters from SEGGER real-time-terminal control block +* which have been previously stored by the host. +* +* Parameters +* BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to. +* BufferSize Size of the target application buffer. +* +* Return value +* Number of bytes that have been read. +*/ +unsigned SEGGER_RTT_Read(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) { + unsigned NumBytesRead; + // + SEGGER_RTT_LOCK(); + // + // Call the non-locking read function + // + NumBytesRead = SEGGER_RTT_ReadNoLock(BufferIndex, pBuffer, BufferSize); + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return NumBytesRead; +} + +/********************************************************************* +* +* SEGGER_RTT_WriteWithOverwriteNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block. +* SEGGER_RTT_WriteWithOverwriteNoLock does not lock the application +* and overwrites data if the data does not fit into the buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, data is overwritten. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +* (3) Do not use SEGGER_RTT_WriteWithOverwriteNoLock if a J-Link +* connection reads RTT data. +*/ +void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + const char* pData; + SEGGER_RTT_BUFFER_UP* pRing; + unsigned Avail; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + char* pDst; +#endif + + pData = (const char *)pBuffer; + // + // Get "to-host" ring buffer and copy some elements into local variables. + // + pRing = &_SEGGER_RTT.aUp[BufferIndex]; + // + // Check if we will overwrite data and need to adjust the RdOff. + // + if (pRing->WrOff == pRing->RdOff) { + Avail = pRing->SizeOfBuffer - 1u; + } else if ( pRing->WrOff < pRing->RdOff) { + Avail = pRing->RdOff - pRing->WrOff - 1u; + } else { + Avail = pRing->RdOff - pRing->WrOff - 1u + pRing->SizeOfBuffer; + } + if (NumBytes > Avail) { + pRing->RdOff += (NumBytes - Avail); + while (pRing->RdOff >= pRing->SizeOfBuffer) { + pRing->RdOff -= pRing->SizeOfBuffer; + } + } + // + // Write all data, no need to check the RdOff, but possibly handle multiple wrap-arounds + // + Avail = pRing->SizeOfBuffer - pRing->WrOff; + do { + if (Avail > NumBytes) { + // + // Last round + // +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = pRing->pBuffer + pRing->WrOff; + Avail = NumBytes; + while (NumBytes--) { + *pDst++ = *pData++; + }; + pRing->WrOff += Avail; +#else + SEGGER_RTT_MEMCPY(pRing->pBuffer + pRing->WrOff, pData, NumBytes); + pRing->WrOff += NumBytes; +#endif + break; + } else { + // + // Wrap-around necessary, write until wrap-around and reset WrOff + // +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = pRing->pBuffer + pRing->WrOff; + NumBytes -= Avail; + while (Avail--) { + *pDst++ = *pData++; + }; + pRing->WrOff = 0; +#else + SEGGER_RTT_MEMCPY(pRing->pBuffer + pRing->WrOff, pData, Avail); + pData += Avail; + pRing->WrOff = 0; + NumBytes -= Avail; +#endif + Avail = (pRing->SizeOfBuffer - 1); + } + } while (NumBytes); +} + +/********************************************************************* +* +* SEGGER_RTT_WriteSkipNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block which is then read by the host. +* SEGGER_RTT_WriteSkipNoLock does not lock the application and +* skips all data, if the data does not fit into the buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, all data is dropped. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +*/ +unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + const char* pData; + SEGGER_RTT_BUFFER_UP* pRing; + unsigned Avail; + unsigned RdOff; + unsigned WrOff; + unsigned Rem; +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + char* pDst; +#endif + + pData = (const char *)pBuffer; + // + // Get "to-host" ring buffer and copy some elements into local variables. + // + pRing = &_SEGGER_RTT.aUp[BufferIndex]; + RdOff = pRing->RdOff; + WrOff = pRing->WrOff; + // + // Handle the most common cases fastest. + // Which is: + // RdOff <= WrOff -> Space until wrap around is free. + // AND + // WrOff + NumBytes < SizeOfBuffer -> No Wrap around necessary. + // + // OR + // + // RdOff > WrOff -> Space until RdOff - 1 is free. + // AND + // WrOff + NumBytes < RdOff -> Data fits into buffer + // + if (RdOff <= WrOff) { + // + // Get space until WrOff will be at wrap around. + // + Avail = pRing->SizeOfBuffer - 1u - WrOff ; + if (Avail >= NumBytes) { +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = pRing->pBuffer + WrOff; + WrOff += NumBytes; + while (NumBytes--) { + *pDst++ = *pData++; + }; + pRing->WrOff = WrOff; +#else + SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, NumBytes); + pRing->WrOff = WrOff + NumBytes; +#endif + return 1; + } + // + // If data did not fit into space until wrap around calculate complete space in buffer. + // + Avail += RdOff; + // + // If there is still no space for the whole of this output, don't bother. + // + if (Avail >= NumBytes) { + // + // OK, we have enough space in buffer. Copy in one or 2 chunks + // + Rem = pRing->SizeOfBuffer - WrOff; // Space until end of buffer + if (Rem > NumBytes) { +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = pRing->pBuffer + WrOff; + WrOff += NumBytes; + while (NumBytes--) { + *pDst++ = *pData++; + }; + pRing->WrOff = WrOff; +#else + SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, NumBytes); + pRing->WrOff = WrOff + NumBytes; +#endif + } else { + // + // We reach the end of the buffer, so need to wrap around + // +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = pRing->pBuffer + WrOff; + NumBytes -= Rem; + WrOff = NumBytes; + do { + *pDst++ = *pData++; + } while (--Rem); + pDst = pRing->pBuffer; + do { + *pDst++ = *pData++; + } while (--NumBytes); + pRing->WrOff = WrOff; +#else + SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, Rem); + SEGGER_RTT_MEMCPY(pRing->pBuffer, pData + Rem, NumBytes - Rem); + pRing->WrOff = NumBytes - Rem; +#endif + } + return 1; + } + } else { + Avail = RdOff - WrOff - 1u; + if (Avail >= NumBytes) { +#if SEGGER_RTT_MEMCPY_USE_BYTELOOP + pDst = pRing->pBuffer + WrOff; + WrOff += NumBytes; + while (NumBytes--) { + *pDst++ = *pData++; + }; + pRing->WrOff = WrOff; +#else + SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, NumBytes); + pRing->WrOff = WrOff + NumBytes; +#endif + return 1; + } + } + // + // If we reach this point no data has been written + // + return 0; +} + +/********************************************************************* +* +* SEGGER_RTT_WriteNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block which is then read by the host. +* SEGGER_RTT_WriteNoLock does not lock the application. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +*/ +unsigned SEGGER_RTT_WriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + unsigned Status; + unsigned Avail; + const char* pData; + SEGGER_RTT_BUFFER_UP* pRing; + + pData = (const char *)pBuffer; + // + // Get "to-host" ring buffer. + // + pRing = &_SEGGER_RTT.aUp[BufferIndex]; + // + // How we output depends upon the mode... + // + switch (pRing->Flags) { + case SEGGER_RTT_MODE_NO_BLOCK_SKIP: + // + // If we are in skip mode and there is no space for the whole + // of this output, don't bother. + // + Avail = _GetAvailWriteSpace(pRing); + if (Avail < NumBytes) { + Status = 0u; + } else { + Status = NumBytes; + _WriteNoCheck(pRing, pData, NumBytes); + } + break; + case SEGGER_RTT_MODE_NO_BLOCK_TRIM: + // + // If we are in trim mode, trim to what we can output without blocking. + // + Avail = _GetAvailWriteSpace(pRing); + Status = Avail < NumBytes ? Avail : NumBytes; + _WriteNoCheck(pRing, pData, Status); + break; + case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: + // + // If we are in blocking mode, output everything. + // + Status = _WriteBlocking(pRing, pData, NumBytes); + break; + default: + Status = 0u; + break; + } + // + // Finish up. + // + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_Write +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block which is then read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +*/ +unsigned SEGGER_RTT_Write(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) { + unsigned Status; + // + INIT(); + SEGGER_RTT_LOCK(); + // + // Call the non-locking write function + // + Status = SEGGER_RTT_WriteNoLock(BufferIndex, pBuffer, NumBytes); + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_WriteString +* +* Function description +* Stores string in SEGGER RTT control block. +* This data is read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* s Pointer to string. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +* (2) String passed to this function has to be \0 terminated +* (3) \0 termination character is *not* stored in RTT buffer +*/ +unsigned SEGGER_RTT_WriteString(unsigned BufferIndex, const char* s) { + unsigned Len; + + Len = STRLEN(s); + return SEGGER_RTT_Write(BufferIndex, s, Len); +} + +/********************************************************************* +* +* SEGGER_RTT_PutCharSkipNoLock +* +* Function description +* Stores a single character/byte in SEGGER RTT buffer. +* SEGGER_RTT_PutCharSkipNoLock does not lock the application and +* skips the byte, if it does not fit into the buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* c Byte to be stored. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, the character is dropped. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +*/ + +unsigned SEGGER_RTT_PutCharSkipNoLock(unsigned BufferIndex, char c) { + SEGGER_RTT_BUFFER_UP* pRing; + unsigned WrOff; + unsigned Status; + // + // Get "to-host" ring buffer. + // + pRing = &_SEGGER_RTT.aUp[BufferIndex]; + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0; + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) { + pRing->pBuffer[pRing->WrOff] = c; + pRing->WrOff = WrOff; + Status = 1; + } else { + Status = 0; + } + // + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_PutCharSkip +* +* Function description +* Stores a single character/byte in SEGGER RTT buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* c Byte to be stored. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, the character is dropped. +*/ + +unsigned SEGGER_RTT_PutCharSkip(unsigned BufferIndex, char c) { + SEGGER_RTT_BUFFER_UP* pRing; + unsigned WrOff; + unsigned Status; + // + // Prepare + // + INIT(); + SEGGER_RTT_LOCK(); + // + // Get "to-host" ring buffer. + // + pRing = &_SEGGER_RTT.aUp[BufferIndex]; + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0; + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) { + pRing->pBuffer[pRing->WrOff] = c; + pRing->WrOff = WrOff; + Status = 1; + } else { + Status = 0; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return Status; +} + + /********************************************************************* +* +* SEGGER_RTT_PutChar +* +* Function description +* Stores a single character/byte in SEGGER RTT buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* c Byte to be stored. +* +* Return value +* Number of bytes which have been stored in the "Up"-buffer. +* +* Notes +* (1) Data is stored according to buffer flags. +*/ + +unsigned SEGGER_RTT_PutChar(unsigned BufferIndex, char c) { + SEGGER_RTT_BUFFER_UP* pRing; + unsigned WrOff; + unsigned Status; + // + // Prepare + // + INIT(); + SEGGER_RTT_LOCK(); + // + // Get "to-host" ring buffer. + // + pRing = &_SEGGER_RTT.aUp[BufferIndex]; + // + // Get write position and handle wrap-around if necessary + // + WrOff = pRing->WrOff + 1; + if (WrOff == pRing->SizeOfBuffer) { + WrOff = 0; + } + // + // Wait for free space if mode is set to blocking + // + if (pRing->Flags == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) { + while (WrOff == pRing->RdOff) { + ; + } + } + // + // Output byte if free space is available + // + if (WrOff != pRing->RdOff) { + pRing->pBuffer[pRing->WrOff] = c; + pRing->WrOff = WrOff; + Status = 1; + } else { + Status = 0; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + // + return Status; +} + +/********************************************************************* +* +* SEGGER_RTT_GetKey +* +* Function description +* Reads one character from the SEGGER RTT buffer. +* Host has previously stored data there. +* +* Return value +* < 0 - No character available (buffer empty). +* >= 0 - Character which has been read. (Possible values: 0 - 255) +* +* Notes +* (1) This function is only specified for accesses to RTT buffer 0. +*/ +int SEGGER_RTT_GetKey(void) { + char c; + int r; + + r = (int)SEGGER_RTT_Read(0u, &c, 1u); + if (r == 1) { + r = (int)(unsigned char)c; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_WaitKey +* +* Function description +* Waits until at least one character is avaible in the SEGGER RTT buffer. +* Once a character is available, it is read and this function returns. +* +* Return value +* >=0 - Character which has been read. +* +* Notes +* (1) This function is only specified for accesses to RTT buffer 0 +* (2) This function is blocking if no character is present in RTT buffer +*/ +int SEGGER_RTT_WaitKey(void) { + int r; + + do { + r = SEGGER_RTT_GetKey(); + } while (r < 0); + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_HasKey +* +* Function description +* Checks if at least one character for reading is available in the SEGGER RTT buffer. +* +* Return value +* == 0 - No characters are available to read. +* == 1 - At least one character is available. +* +* Notes +* (1) This function is only specified for accesses to RTT buffer 0 +*/ +int SEGGER_RTT_HasKey(void) { + unsigned RdOff; + int r; + + INIT(); + RdOff = _SEGGER_RTT.aDown[0].RdOff; + if (RdOff != _SEGGER_RTT.aDown[0].WrOff) { + r = 1; + } else { + r = 0; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_HasData +* +* Function description +* Check if there is data from the host in the given buffer. +* +* Return value: +* ==0: No data +* !=0: Data in buffer +* +*/ +unsigned SEGGER_RTT_HasData(unsigned BufferIndex) { + SEGGER_RTT_BUFFER_DOWN* pRing; + unsigned v; + + pRing = &_SEGGER_RTT.aDown[BufferIndex]; + v = pRing->WrOff; + return v - pRing->RdOff; +} + +/********************************************************************* +* +* SEGGER_RTT_AllocDownBuffer +* +* Function description +* Run-time configuration of the next down-buffer (H->T). +* The next buffer, which is not used yet is configured. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* +* Return value +* >= 0 - O.K. Buffer Index +* < 0 - Error +*/ +int SEGGER_RTT_AllocDownBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int BufferIndex; + + INIT(); + SEGGER_RTT_LOCK(); + BufferIndex = 0; + do { + if (_SEGGER_RTT.aDown[BufferIndex].pBuffer == NULL) { + break; + } + BufferIndex++; + } while (BufferIndex < _SEGGER_RTT.MaxNumDownBuffers); + if (BufferIndex < _SEGGER_RTT.MaxNumDownBuffers) { + _SEGGER_RTT.aDown[BufferIndex].sName = sName; + _SEGGER_RTT.aDown[BufferIndex].pBuffer = (char*)pBuffer; + _SEGGER_RTT.aDown[BufferIndex].SizeOfBuffer = BufferSize; + _SEGGER_RTT.aDown[BufferIndex].RdOff = 0u; + _SEGGER_RTT.aDown[BufferIndex].WrOff = 0u; + _SEGGER_RTT.aDown[BufferIndex].Flags = Flags; + } else { + BufferIndex = -1; + } + SEGGER_RTT_UNLOCK(); + return BufferIndex; +} + +/********************************************************************* +* +* SEGGER_RTT_AllocUpBuffer +* +* Function description +* Run-time configuration of the next up-buffer (T->H). +* The next buffer, which is not used yet is configured. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* +* Return value +* >= 0 - O.K. Buffer Index +* < 0 - Error +*/ +int SEGGER_RTT_AllocUpBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int BufferIndex; + + INIT(); + SEGGER_RTT_LOCK(); + BufferIndex = 0; + do { + if (_SEGGER_RTT.aUp[BufferIndex].pBuffer == NULL) { + break; + } + BufferIndex++; + } while (BufferIndex < _SEGGER_RTT.MaxNumUpBuffers); + if (BufferIndex < _SEGGER_RTT.MaxNumUpBuffers) { + _SEGGER_RTT.aUp[BufferIndex].sName = sName; + _SEGGER_RTT.aUp[BufferIndex].pBuffer = (char*)pBuffer; + _SEGGER_RTT.aUp[BufferIndex].SizeOfBuffer = BufferSize; + _SEGGER_RTT.aUp[BufferIndex].RdOff = 0u; + _SEGGER_RTT.aUp[BufferIndex].WrOff = 0u; + _SEGGER_RTT.aUp[BufferIndex].Flags = Flags; + } else { + BufferIndex = -1; + } + SEGGER_RTT_UNLOCK(); + return BufferIndex; +} + +/********************************************************************* +* +* SEGGER_RTT_ConfigUpBuffer +* +* Function description +* Run-time configuration of a specific up-buffer (T->H). +* Buffer to be configured is specified by index. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* BufferIndex Index of the buffer to configure. +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* +* Return value +* >= 0 - O.K. +* < 0 - Error +* +* Additional information +* Buffer 0 is configured on compile-time. +* May only be called once per buffer. +* Buffer name and flags can be reconfigured using the appropriate functions. +*/ +int SEGGER_RTT_ConfigUpBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int r; + + INIT(); + if (BufferIndex < (unsigned)_SEGGER_RTT.MaxNumUpBuffers) { + SEGGER_RTT_LOCK(); + if (BufferIndex > 0u) { + _SEGGER_RTT.aUp[BufferIndex].sName = sName; + _SEGGER_RTT.aUp[BufferIndex].pBuffer = (char*)pBuffer; + _SEGGER_RTT.aUp[BufferIndex].SizeOfBuffer = BufferSize; + _SEGGER_RTT.aUp[BufferIndex].RdOff = 0u; + _SEGGER_RTT.aUp[BufferIndex].WrOff = 0u; + } + _SEGGER_RTT.aUp[BufferIndex].Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_ConfigDownBuffer +* +* Function description +* Run-time configuration of a specific down-buffer (H->T). +* Buffer to be configured is specified by index. +* This includes: Buffer address, size, name, flags, ... +* +* Parameters +* BufferIndex Index of the buffer to configure. +* sName Pointer to a constant name string. +* pBuffer Pointer to a buffer to be used. +* BufferSize Size of the buffer. +* Flags Operating modes. Define behavior if buffer is full (not enough space for entire message). +* +* Return value +* >= 0 O.K. +* < 0 Error +* +* Additional information +* Buffer 0 is configured on compile-time. +* May only be called once per buffer. +* Buffer name and flags can be reconfigured using the appropriate functions. +*/ +int SEGGER_RTT_ConfigDownBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) { + int r; + + INIT(); + if (BufferIndex < (unsigned)_SEGGER_RTT.MaxNumDownBuffers) { + SEGGER_RTT_LOCK(); + if (BufferIndex > 0u) { + _SEGGER_RTT.aDown[BufferIndex].sName = sName; + _SEGGER_RTT.aDown[BufferIndex].pBuffer = (char*)pBuffer; + _SEGGER_RTT.aDown[BufferIndex].SizeOfBuffer = BufferSize; + _SEGGER_RTT.aDown[BufferIndex].RdOff = 0u; + _SEGGER_RTT.aDown[BufferIndex].WrOff = 0u; + } + _SEGGER_RTT.aDown[BufferIndex].Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetNameUpBuffer +* +* Function description +* Run-time configuration of a specific up-buffer name (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer to renamed. +* sName Pointer to a constant name string. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetNameUpBuffer(unsigned BufferIndex, const char* sName) { + int r; + + INIT(); + if (BufferIndex < (unsigned)_SEGGER_RTT.MaxNumUpBuffers) { + SEGGER_RTT_LOCK(); + _SEGGER_RTT.aUp[BufferIndex].sName = sName; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetNameDownBuffer +* +* Function description +* Run-time configuration of a specific Down-buffer name (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer to renamed. +* sName Pointer to a constant name string. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetNameDownBuffer(unsigned BufferIndex, const char* sName) { + int r; + + INIT(); + if (BufferIndex < (unsigned)_SEGGER_RTT.MaxNumDownBuffers) { + SEGGER_RTT_LOCK(); + _SEGGER_RTT.aDown[BufferIndex].sName = sName; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetFlagsUpBuffer +* +* Function description +* Run-time configuration of specific up-buffer flags (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer. +* Flags Flags to set for the buffer. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetFlagsUpBuffer(unsigned BufferIndex, unsigned Flags) { + int r; + + INIT(); + if (BufferIndex < (unsigned)_SEGGER_RTT.MaxNumUpBuffers) { + SEGGER_RTT_LOCK(); + _SEGGER_RTT.aUp[BufferIndex].Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_SetFlagsDownBuffer +* +* Function description +* Run-time configuration of specific Down-buffer flags (T->H). +* Buffer to be configured is specified by index. +* +* Parameters +* BufferIndex Index of the buffer to renamed. +* Flags Flags to set for the buffer. +* +* Return value +* >= 0 O.K. +* < 0 Error +*/ +int SEGGER_RTT_SetFlagsDownBuffer(unsigned BufferIndex, unsigned Flags) { + int r; + + INIT(); + if (BufferIndex < (unsigned)_SEGGER_RTT.MaxNumDownBuffers) { + SEGGER_RTT_LOCK(); + _SEGGER_RTT.aDown[BufferIndex].Flags = Flags; + SEGGER_RTT_UNLOCK(); + r = 0; + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_Init +* +* Function description +* Initializes the RTT Control Block. +* Should be used in RAM targets, at start of the application. +* +*/ +void SEGGER_RTT_Init (void) { + _DoInit(); +} + +/********************************************************************* +* +* SEGGER_RTT_SetTerminal +* +* Function description +* Sets the terminal to be used for output on channel 0. +* +* Parameters +* TerminalId Index of the terminal. +* +* Return value +* >= 0 O.K. +* < 0 Error (e.g. if RTT is configured for non-blocking mode and there was no space in the buffer to set the new terminal Id) +*/ +int SEGGER_RTT_SetTerminal (char TerminalId) { + unsigned char ac[2]; + SEGGER_RTT_BUFFER_UP* pRing; + unsigned Avail; + int r; + // + INIT(); + // + r = 0; + ac[0] = 0xFFu; + if ((unsigned char)TerminalId < (unsigned char)sizeof(_aTerminalId)) { // We only support a certain number of channels + ac[1] = _aTerminalId[(unsigned char)TerminalId]; + pRing = &_SEGGER_RTT.aUp[0]; // Buffer 0 is always reserved for terminal I/O, so we can use index 0 here, fixed + SEGGER_RTT_LOCK(); // Lock to make sure that no other task is writing into buffer, while we are and number of free bytes in buffer does not change downwards after checking and before writing + if ((pRing->Flags & SEGGER_RTT_MODE_MASK) == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) { + _ActiveTerminal = TerminalId; + _WriteBlocking(pRing, (const char*)ac, 2u); + } else { // Skipping mode or trim mode? => We cannot trim this command so handling is the same for both modes + Avail = _GetAvailWriteSpace(pRing); + if (Avail >= 2) { + _ActiveTerminal = TerminalId; // Only change active terminal in case of success + _WriteNoCheck(pRing, (const char*)ac, 2u); + } else { + r = -1; + } + } + SEGGER_RTT_UNLOCK(); + } else { + r = -1; + } + return r; +} + +/********************************************************************* +* +* SEGGER_RTT_TerminalOut +* +* Function description +* Writes a string to the given terminal +* without changing the terminal for channel 0. +* +* Parameters +* TerminalId Index of the terminal. +* s String to be printed on the terminal. +* +* Return value +* >= 0 - Number of bytes written. +* < 0 - Error. +* +*/ +int SEGGER_RTT_TerminalOut (char TerminalId, const char* s) { + int Status; + unsigned FragLen; + unsigned Avail; + SEGGER_RTT_BUFFER_UP* pRing; + // + INIT(); + // + // Validate terminal ID. + // + if (TerminalId < (char)sizeof(_aTerminalId)) { // We only support a certain number of channels + // + // Get "to-host" ring buffer. + // + pRing = &_SEGGER_RTT.aUp[0]; + // + // Need to be able to change terminal, write data, change back. + // Compute the fixed and variable sizes. + // + FragLen = STRLEN(s); + // + // How we output depends upon the mode... + // + SEGGER_RTT_LOCK(); + Avail = _GetAvailWriteSpace(pRing); + switch (pRing->Flags & SEGGER_RTT_MODE_MASK) { + case SEGGER_RTT_MODE_NO_BLOCK_SKIP: + // + // If we are in skip mode and there is no space for the whole + // of this output, don't bother switching terminals at all. + // + if (Avail < (FragLen + 4u)) { + Status = 0; + } else { + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, FragLen); + _PostTerminalSwitch(pRing, _ActiveTerminal); + } + break; + case SEGGER_RTT_MODE_NO_BLOCK_TRIM: + // + // If we are in trim mode and there is not enough space for everything, + // trim the output but always include the terminal switch. If no room + // for terminal switch, skip that totally. + // + if (Avail < 4u) { + Status = -1; + } else { + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, (FragLen < (Avail - 4u)) ? FragLen : (Avail - 4u)); + _PostTerminalSwitch(pRing, _ActiveTerminal); + } + break; + case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL: + // + // If we are in blocking mode, output everything. + // + _PostTerminalSwitch(pRing, TerminalId); + Status = (int)_WriteBlocking(pRing, s, FragLen); + _PostTerminalSwitch(pRing, _ActiveTerminal); + break; + default: + Status = -1; + break; + } + // + // Finish up. + // + SEGGER_RTT_UNLOCK(); + } else { + Status = -1; + } + return Status; +} + + +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER_RTT.h a/RTT/SEGGER_RTT.h new file mode 100644 index 0000000..9ab87cf --- /dev/null +++ a/RTT/SEGGER_RTT.h @@ -0,0 +1,251 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2018 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* conditions are met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this list of conditions and the following disclaimer. * +* * +* o Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the following * +* disclaimer in the documentation and/or other materials provided * +* with the distribution. * +* * +* o Neither the name of SEGGER Microcontroller GmbH * +* nor the names of its contributors may be used to endorse or * +* promote products derived from this software without specific * +* prior written permission. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 6.30b * +* * +********************************************************************** +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT.h +Purpose : Implementation of SEGGER real-time transfer which allows + real-time communication on targets which support debugger + memory accesses while the CPU is running. +Revision: $Rev: 9599 $ +---------------------------------------------------------------------- +*/ + +#ifndef SEGGER_RTT_H +#define SEGGER_RTT_H + +#include "SEGGER_RTT_Conf.h" + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +// +// Description for a circular buffer (also called "ring buffer") +// which is used as up-buffer (T->H) +// +typedef struct { + const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" + char* pBuffer; // Pointer to start of buffer + unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. + unsigned WrOff; // Position of next item to be written by either target. + volatile unsigned RdOff; // Position of next item to be read by host. Must be volatile since it may be modified by host. + unsigned Flags; // Contains configuration flags +} SEGGER_RTT_BUFFER_UP; + +// +// Description for a circular buffer (also called "ring buffer") +// which is used as down-buffer (H->T) +// +typedef struct { + const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" + char* pBuffer; // Pointer to start of buffer + unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. + volatile unsigned WrOff; // Position of next item to be written by host. Must be volatile since it may be modified by host. + unsigned RdOff; // Position of next item to be read by target (down-buffer). + unsigned Flags; // Contains configuration flags +} SEGGER_RTT_BUFFER_DOWN; + +// +// RTT control block which describes the number of buffers available +// as well as the configuration for each buffer +// +// +typedef struct { + char acID[16]; // Initialized to "SEGGER RTT" + int MaxNumUpBuffers; // Initialized to SEGGER_RTT_MAX_NUM_UP_BUFFERS (type. 2) + int MaxNumDownBuffers; // Initialized to SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (type. 2) + SEGGER_RTT_BUFFER_UP aUp[SEGGER_RTT_MAX_NUM_UP_BUFFERS]; // Up buffers, transferring information up from target via debug probe to host + SEGGER_RTT_BUFFER_DOWN aDown[SEGGER_RTT_MAX_NUM_DOWN_BUFFERS]; // Down buffers, transferring information down from host via debug probe to target +} SEGGER_RTT_CB; + +/********************************************************************* +* +* Global data +* +********************************************************************** +*/ +extern SEGGER_RTT_CB _SEGGER_RTT; + +/********************************************************************* +* +* RTT API functions +* +********************************************************************** +*/ +#ifdef __cplusplus + extern "C" { +#endif +int SEGGER_RTT_AllocDownBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_AllocUpBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_ConfigUpBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_ConfigDownBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); +int SEGGER_RTT_GetKey (void); +unsigned SEGGER_RTT_HasData (unsigned BufferIndex); +int SEGGER_RTT_HasKey (void); +void SEGGER_RTT_Init (void); +unsigned SEGGER_RTT_Read (unsigned BufferIndex, void* pBuffer, unsigned BufferSize); +unsigned SEGGER_RTT_ReadNoLock (unsigned BufferIndex, void* pData, unsigned BufferSize); +int SEGGER_RTT_SetNameDownBuffer (unsigned BufferIndex, const char* sName); +int SEGGER_RTT_SetNameUpBuffer (unsigned BufferIndex, const char* sName); +int SEGGER_RTT_SetFlagsDownBuffer (unsigned BufferIndex, unsigned Flags); +int SEGGER_RTT_SetFlagsUpBuffer (unsigned BufferIndex, unsigned Flags); +int SEGGER_RTT_WaitKey (void); +unsigned SEGGER_RTT_Write (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteSkipNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_WriteString (unsigned BufferIndex, const char* s); +void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); +unsigned SEGGER_RTT_PutChar (unsigned BufferIndex, char c); +unsigned SEGGER_RTT_PutCharSkip (unsigned BufferIndex, char c); +unsigned SEGGER_RTT_PutCharSkipNoLock (unsigned BufferIndex, char c); +// +// Function macro for performance optimization +// +#define SEGGER_RTT_HASDATA(n) (_SEGGER_RTT.aDown[n].WrOff - _SEGGER_RTT.aDown[n].RdOff) + +/********************************************************************* +* +* RTT "Terminal" API functions +* +********************************************************************** +*/ +int SEGGER_RTT_SetTerminal (char TerminalId); +int SEGGER_RTT_TerminalOut (char TerminalId, const char* s); + +/********************************************************************* +* +* RTT printf functions (require SEGGER_RTT_printf.c) +* +********************************************************************** +*/ +int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...); +#ifdef __cplusplus + } +#endif + +/********************************************************************* +* +* Defines +* +********************************************************************** +*/ + +// +// Operating modes. Define behavior if buffer is full (not enough space for entire message) +// +#define SEGGER_RTT_MODE_NO_BLOCK_SKIP (0U) // Skip. Do not block, output nothing. (Default) +#define SEGGER_RTT_MODE_NO_BLOCK_TRIM (1U) // Trim: Do not block, output as much as fits. +#define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL (2U) // Block: Wait until there is space in the buffer. +#define SEGGER_RTT_MODE_MASK (3U) + +// +// Control sequences, based on ANSI. +// Can be used to control color, and clear the screen +// +#define RTT_CTRL_RESET "" // Reset to default colors +#define RTT_CTRL_CLEAR "" // Clear screen, reposition cursor to top left + +#define RTT_CTRL_TEXT_BLACK "" +#define RTT_CTRL_TEXT_RED "" +#define RTT_CTRL_TEXT_GREEN "" +#define RTT_CTRL_TEXT_YELLOW "" +#define RTT_CTRL_TEXT_BLUE "" +#define RTT_CTRL_TEXT_MAGENTA "" +#define RTT_CTRL_TEXT_CYAN "" +#define RTT_CTRL_TEXT_WHITE "" + +#define RTT_CTRL_TEXT_BRIGHT_BLACK "" +#define RTT_CTRL_TEXT_BRIGHT_RED "" +#define RTT_CTRL_TEXT_BRIGHT_GREEN "" +#define RTT_CTRL_TEXT_BRIGHT_YELLOW "" +#define RTT_CTRL_TEXT_BRIGHT_BLUE "" +#define RTT_CTRL_TEXT_BRIGHT_MAGENTA "" +#define RTT_CTRL_TEXT_BRIGHT_CYAN "" +#define RTT_CTRL_TEXT_BRIGHT_WHITE "" + +#define RTT_CTRL_BG_BLACK "" +#define RTT_CTRL_BG_RED "" +#define RTT_CTRL_BG_GREEN "" +#define RTT_CTRL_BG_YELLOW "" +#define RTT_CTRL_BG_BLUE "" +#define RTT_CTRL_BG_MAGENTA "" +#define RTT_CTRL_BG_CYAN "" +#define RTT_CTRL_BG_WHITE "" + +#define RTT_CTRL_BG_BRIGHT_BLACK "" +#define RTT_CTRL_BG_BRIGHT_RED "" +#define RTT_CTRL_BG_BRIGHT_GREEN "" +#define RTT_CTRL_BG_BRIGHT_YELLOW "" +#define RTT_CTRL_BG_BRIGHT_BLUE "" +#define RTT_CTRL_BG_BRIGHT_MAGENTA "" +#define RTT_CTRL_BG_BRIGHT_CYAN "" +#define RTT_CTRL_BG_BRIGHT_WHITE "" + + +#endif + +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER_RTT_ASM_ARMv7M.S a/RTT/SEGGER_RTT_ASM_ARMv7M.S new file mode 100644 index 0000000..cbbc52f --- /dev/null +++ a/RTT/SEGGER_RTT_ASM_ARMv7M.S @@ -0,0 +1,242 @@ +/********************************************************************* +* (c) SEGGER Microcontroller GmbH * +* The Embedded Experts * +* www.segger.com * +********************************************************************** + +-------------------------- END-OF-HEADER ----------------------------- + +File : SEGGER_RTT_ASM_ARMv7M.S +Purpose : Assembler implementation of RTT functions for ARMv7M + +Additional information: + This module is written to be assembler-independent and works with + GCC and clang (Embedded Studio) and IAR. +*/ + +#define SEGGER_RTT_ASM // Used to control processed input from header file +#include "SEGGER_RTT.h" + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ + +#define _CCIAR 0 +#define _CCCLANG 1 + +#if (defined __SES_ARM) || (defined __GNUC__) || (defined __clang__) + #define _CC_TYPE _CCCLANG + #define _PUB_SYM .global + #define _EXT_SYM .extern + #define _END .end + #define _WEAK .weak + #define _THUMB_FUNC .thumb_func + #define _THUMB_CODE .code 16 + #define _WORD .word + #define _SECTION(Sect, Type, AlignExp) .section Sect ##, "ax" + #define _ALIGN(Exp) .align Exp + #define _PLACE_LITS .ltorg + #define _DATA_SECT_START + #define _C_STARTUP _start + #define _STACK_END __stack_end__ + #define _RAMFUNC + // + // .text => Link to flash + // .fast => Link to RAM + // OtherSect => Usually link to RAM + // Alignment is 2^x + // +#elif defined (__IASMARM__) + #define _CC_TYPE _CCIAR + #define _PUB_SYM PUBLIC + #define _EXT_SYM EXTERN + #define _END END + #define _WEAK _WEAK + #define _THUMB_FUNC + #define _THUMB_CODE THUMB + #define _WORD DCD + #define _SECTION(Sect, Type, AlignExp) SECTION Sect ## : ## Type ## :REORDER:NOROOT ## (AlignExp) + #define _ALIGN(Exp) alignrom Exp + #define _PLACE_LITS + #define _DATA_SECT_START DATA + #define _C_STARTUP __iar_program_start + #define _STACK_END sfe(CSTACK) + #define _RAMFUNC SECTION_TYPE SHT_PROGBITS, SHF_WRITE | SHF_EXECINSTR + // + // .text => Link to flash + // .textrw => Link to RAM + // OtherSect => Usually link to RAM + // NOROOT => Allows linker to throw away the function, if not referenced + // Alignment is 2^x + // +#endif + +#if (_CC_TYPE == _CCIAR) + NAME SEGGER_RTT_ASM_ARMv7M +#else + .syntax unified +#endif + +#if defined (RTT_USE_ASM) && (RTT_USE_ASM == 1) + #define SHT_PROGBITS 0x1 + +/********************************************************************* +* +* Public / external symbols +* +********************************************************************** +*/ + + _EXT_SYM __aeabi_memcpy + _EXT_SYM __aeabi_memcpy4 + _EXT_SYM _SEGGER_RTT + + _PUB_SYM SEGGER_RTT_ASM_WriteSkipNoLock + +/********************************************************************* +* +* SEGGER_RTT_WriteSkipNoLock +* +* Function description +* Stores a specified number of characters in SEGGER RTT +* control block which is then read by the host. +* SEGGER_RTT_WriteSkipNoLock does not lock the application and +* skips all data, if the data does not fit into the buffer. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal"). +* pBuffer Pointer to character array. Does not need to point to a \0 terminated string. +* NumBytes Number of bytes to be stored in the SEGGER RTT control block. +* MUST be > 0!!! +* This is done for performance reasons, so no initial check has do be done. +* +* Return value +* 1: Data has been copied +* 0: No space, data has not been copied +* +* Notes +* (1) If there is not enough space in the "Up"-buffer, all data is dropped. +* (2) For performance reasons this function does not call Init() +* and may only be called after RTT has been initialized. +* Either by calling SEGGER_RTT_Init() or calling another RTT API function first. +*/ + _SECTION(.text, CODE, 2) + _ALIGN(2) + _THUMB_FUNC +SEGGER_RTT_ASM_WriteSkipNoLock: // unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pData, unsigned NumBytes) { + // + // Cases: + // 1) RdOff <= WrOff => Space until wrap-around is sufficient + // 2) RdOff <= WrOff => Space after wrap-around needed (copy in 2 chunks) + // 3) RdOff < WrOff => No space in buf + // 4) RdOff > WrOff => Space is sufficient + // 5) RdOff > WrOff => No space in buf + // + // 1) is the most common case for large buffers and assuming that J-Link reads the data fast enough + // + // Register usage: + // R0 Temporary needed as RdOff, register later on + // R1 pData + // R2 + // R3 register. Hold free for subroutine calls + // R4 + // R5 pRing->pBuffer + // R6 pRing (Points to active struct SEGGER_RTT_BUFFER_DOWN) + // R7 WrOff + // + PUSH {R4-R7} + ADD R3,R0,R0, LSL #+1 + LDR.W R0,=_SEGGER_RTT // pRing = &_SEGGER_RTT.aUp[BufferIndex]; + ADD R0,R0,R3, LSL #+3 + ADD R6,R0,#+24 + LDR R0,[R6, #+16] // RdOff = pRing->RdOff; + LDR R7,[R6, #+12] // WrOff = pRing->WrOff; + LDR R5,[R6, #+4] // pRing->pBuffer + CMP R7,R0 + BCC.N _CheckCase4 // if (RdOff <= WrOff) { => Case 1), 2) or 3) + // + // Handling for case 1, later on identical to case 4 + // + LDR R3,[R6, #+8] // Avail = pRing->SizeOfBuffer - WrOff - 1u; => Space until wrap-around (assume 1 byte not usable for case that RdOff == 0) + SUBS R4,R3,R7 // (Used in case we jump into case 2 afterwards) + SUBS R3,R4,#+1 // + CMP R3,R2 + BCC.N _CheckCase2 // if (Avail >= NumBytes) { => Case 1)? +_Case4: + ADDS R5,R7,R5 // pBuffer += WrOff + ADDS R0,R2,R7 // v = WrOff + NumBytes + // + // 2x unrolling for the copy loop that is used most of the time + // This is a special optimization for small SystemView packets and makes them even faster + // + _ALIGN(2) +_LoopCopyStraight: // memcpy(pRing->pBuffer + WrOff, pData, NumBytes); + LDRB R3,[R1], #+1 + STRB R3,[R5], #+1 // *pDest++ = *pSrc++ + SUBS R2,R2,#+1 + BEQ _CSDone + LDRB R3,[R1], #+1 + STRB R3,[R5], #+1 // *pDest++ = *pSrc++ + SUBS R2,R2,#+1 + BNE _LoopCopyStraight +_CSDone: +#if _CORE_NEEDS_DMB // Do not slow down cores that do not need a DMB instruction here + DMB // Cortex-M7 may delay memory writes and also change the order in which the writes happen. Therefore, make sure that all buffer writes are finished, before updating the in the struct +#endif + STR R0,[R6, #+12] // pRing->WrOff = WrOff + NumBytes; + MOVS R0,#+1 + POP {R4-R7} + BX LR // Return 1 +_CheckCase2: + ADDS R0,R0,R3 // Avail += RdOff; => Space incl. wrap-around + CMP R0,R2 + BCC.N _Case3 // if (Avail >= NumBytes) { => Case 2? => If not, we have case 3) (does not fit) + // + // Handling for case 2 + // + ADDS R0,R7,R5 // v = pRing->pBuffer + WrOff => Do not change pRing->pBuffer here because 2nd chunk needs org. value + SUBS R2,R2,R4 // NumBytes -= Rem; (Rem = pRing->SizeOfBuffer - WrOff; => Space until end of buffer) +_LoopCopyBeforeWrapAround: // memcpy(pRing->pBuffer + WrOff, pData, Rem); => Copy 1st chunk + LDRB R3,[R1], #+1 + STRB R3,[R0], #+1 // *pDest++ = *pSrc++ + SUBS R4,R4,#+1 + BNE _LoopCopyBeforeWrapAround + // + // Special case: First check that assumed RdOff == 0 calculated that last element before wrap-around could not be used + // But 2nd check (considering space until wrap-around and until RdOff) revealed that RdOff is not 0, so we can use the last element + // In this case, we may use a copy straight until buffer end anyway without needing to copy 2 chunks + // Therefore, check if 2nd memcpy is necessary at all + // + ADDS R4,R2,#+0 // Save (needed as counter in loop but must be written to after the loop). Also use this inst to update the flags to skip 2nd loop if possible + BEQ.N _No2ChunkNeeded // if (NumBytes) { +_LoopCopyAfterWrapAround: // memcpy(pRing->pBuffer, pData + Rem, NumBytes); + LDRB R3,[R1], #+1 // pData already points to the next src byte due to copy loop increment before this loop + STRB R3,[R5], #+1 // *pDest++ = *pSrc++ + SUBS R2,R2,#+1 + BNE _LoopCopyAfterWrapAround +_No2ChunkNeeded: +#if _CORE_NEEDS_DMB // Do not slow down cores that do not need a DMB instruction here + DMB // Cortex-M7 may delay memory writes and also change the order in which the writes happen. Therefore, make sure that all buffer writes are finished, before updating the in the struct +#endif + STR R4,[R6, #+12] // pRing->WrOff = NumBytes; => Must be written after copying data because J-Link may read control block asynchronously while writing into buffer + MOVS R0,#+1 + POP {R4-R7} + BX LR // Return 1 +_CheckCase4: + SUBS R0,R0,R7 + SUBS R0,R0,#+1 // Avail = RdOff - WrOff - 1u; + CMP R0,R2 + BCS.N _Case4 // if (Avail >= NumBytes) { => Case 4) == 1) ? => If not, we have case 5) == 3) (does not fit) +_Case3: + MOVS R0,#+0 + POP {R4-R7} + BX LR // Return 0 + _PLACE_LITS + +#endif // defined (RTT_USE_ASM) && (RTT_USE_ASM == 1) + _END + +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER_RTT_Conf.h a/RTT/SEGGER_RTT_Conf.h new file mode 100644 index 0000000..1c7aeda --- /dev/null +++ a/RTT/SEGGER_RTT_Conf.h @@ -0,0 +1,332 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2018 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* conditions are met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this list of conditions and the following disclaimer. * +* * +* o Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the following * +* disclaimer in the documentation and/or other materials provided * +* with the distribution. * +* * +* o Neither the name of SEGGER Microcontroller GmbH * +* nor the names of its contributors may be used to endorse or * +* promote products derived from this software without specific * +* prior written permission. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 6.30b * +* * +********************************************************************** +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT_Conf.h +Purpose : Implementation of SEGGER real-time transfer (RTT) which + allows real-time communication on targets which support + debugger memory accesses while the CPU is running. +Revision: $Rev: 9599 $ + +*/ + +#ifndef SEGGER_RTT_CONF_H +#define SEGGER_RTT_CONF_H + +#ifdef __IAR_SYSTEMS_ICC__ + #include +#endif + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ + +#define SEGGER_RTT_MAX_NUM_UP_BUFFERS (3) // Max. number of up-buffers (T->H) available on this target (Default: 3) +#define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (3) // Max. number of down-buffers (H->T) available on this target (Default: 3) + +#define BUFFER_SIZE_UP (4096)//(1024) // Size of the buffer for terminal output of target, up to host (Default: 1k) +#define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16) + +#define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) + +#define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0) + +#define USE_RTT_ASM (0) // Use assembler version of SEGGER_RTT.c when 1 + +/********************************************************************* +* +* RTT memcpy configuration +* +* memcpy() is good for large amounts of data, +* but the overhead is big for small amounts, which are usually stored via RTT. +* With SEGGER_RTT_MEMCPY_USE_BYTELOOP a simple byte loop can be used instead. +* +* SEGGER_RTT_MEMCPY() can be used to replace standard memcpy() in RTT functions. +* This is may be required with memory access restrictions, +* such as on Cortex-A devices with MMU. +*/ +#define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 // 0: Use memcpy/SEGGER_RTT_MEMCPY, 1: Use a simple byte-loop +// +// Example definition of SEGGER_RTT_MEMCPY to external memcpy with GCC toolchains and Cortex-A targets +// +//#if ((defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)) && (defined (__ARM_ARCH_7A__)) +// #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) SEGGER_memcpy((pDest), (pSrc), (NumBytes)) +//#endif + +// +// Target is not allowed to perform other RTT operations while string still has not been stored completely. +// Otherwise we would probably end up with a mixed string in the buffer. +// If using RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here. +// +// SEGGER_RTT_MAX_INTERRUPT_PRIORITY can be used in the sample lock routines on Cortex-M3/4. +// Make sure to mask all interrupts which can send RTT data, i.e. generate SystemView events, or cause task switches. +// When high-priority interrupts must not be masked while sending RTT data, SEGGER_RTT_MAX_INTERRUPT_PRIORITY needs to be adjusted accordingly. +// (Higher priority = lower priority number) +// Default value for embOS: 128u +// Default configuration in FreeRTOS: configMAX_SYSCALL_INTERRUPT_PRIORITY: ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) +// In case of doubt mask all interrupts: 1 << (8 - BASEPRI_PRIO_BITS) i.e. 1 << 5 when 3 bits are implemented in NVIC +// or define SEGGER_RTT_LOCK() to completely disable interrupts. +// + +#define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20) + +/********************************************************************* +* +* RTT lock configuration for SEGGER Embedded Studio, +* Rowley CrossStudio and GCC +*/ +#if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__) + #ifdef __ARM_ARCH_6M__ + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + __asm volatile ("mrs %0, primask \n\t" \ + "mov r1, $1 \n\t" \ + "msr primask, r1 \n\t" \ + : "=r" (LockState) \ + : \ + : "r1" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \ + : \ + : "r" (LockState) \ + : \ + ); \ + } + + #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + __asm volatile ("mrs %0, basepri \n\t" \ + "mov r1, %1 \n\t" \ + "msr basepri, r1 \n\t" \ + : "=r" (LockState) \ + : "i"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY) \ + : "r1" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("msr basepri, %0 \n\t" \ + : \ + : "r" (LockState) \ + : \ + ); \ + } + + #elif defined(__ARM_ARCH_7A__) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + __asm volatile ("mrs r1, CPSR \n\t" \ + "mov %0, r1 \n\t" \ + "orr r1, r1, #0xC0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : "=r" (LockState) \ + : \ + : "r1" \ + ); + + #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ + "mrs r1, CPSR \n\t" \ + "bic r1, r1, #0xC0 \n\t" \ + "and r0, r0, #0xC0 \n\t" \ + "orr r1, r1, r0 \n\t" \ + "msr CPSR_c, r1 \n\t" \ + : \ + : "r" (LockState) \ + : "r0", "r1" \ + ); \ + } +#else + #define SEGGER_RTT_LOCK() + #define SEGGER_RTT_UNLOCK() + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for IAR EWARM +*/ +#ifdef __ICCARM__ + #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + LockState = __get_PRIMASK(); \ + __set_PRIMASK(1); + + #define SEGGER_RTT_UNLOCK() __set_PRIMASK(LockState); \ + } + #elif ((defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || (defined (__ARM7M__) && (__CORE__ == __ARM7M__))) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + LockState = __get_BASEPRI(); \ + __set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); + + #define SEGGER_RTT_UNLOCK() __set_BASEPRI(LockState); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for IAR RX +*/ +#ifdef __ICCRX__ + #define SEGGER_RTT_LOCK() { \ + unsigned long LockState; \ + LockState = __get_interrupt_state(); \ + __disable_interrupt(); + + #define SEGGER_RTT_UNLOCK() __set_interrupt_state(LockState); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration for IAR RL78 +*/ +#ifdef __ICCRL78__ + #define SEGGER_RTT_LOCK() { \ + __istate_t LockState; \ + LockState = __get_interrupt_state(); \ + __disable_interrupt(); + + #define SEGGER_RTT_UNLOCK() __set_interrupt_state(LockState); \ + } +#endif + +/********************************************************************* +* +* RTT lock configuration for KEIL ARM +*/ +#ifdef __CC_ARM + #if (defined __TARGET_ARCH_6S_M) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + register unsigned char PRIMASK __asm( "primask"); \ + LockState = PRIMASK; \ + PRIMASK = 1u; \ + __schedule_barrier(); + + #define SEGGER_RTT_UNLOCK() PRIMASK = LockState; \ + __schedule_barrier(); \ + } + #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + register unsigned char BASEPRI __asm( "basepri"); \ + LockState = BASEPRI; \ + BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY; \ + __schedule_barrier(); + + #define SEGGER_RTT_UNLOCK() BASEPRI = LockState; \ + __schedule_barrier(); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration for TI ARM +*/ +#ifdef __TI_ARM__ + #if defined (__TI_ARM_V6M0__) + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + LockState = __get_PRIMASK(); \ + __set_PRIMASK(1); + + #define SEGGER_RTT_UNLOCK() __set_PRIMASK(LockState); \ + } + #elif (defined (__TI_ARM_V7M3__) || defined (__TI_ARM_V7M4__)) + #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY + #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) + #endif + #define SEGGER_RTT_LOCK() { \ + unsigned int LockState; \ + LockState = OS_GetBASEPRI(); \ + OS_SetBASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); + + #define SEGGER_RTT_UNLOCK() OS_SetBASEPRI(LockState); \ + } + #endif +#endif + +/********************************************************************* +* +* RTT lock configuration fallback +*/ +#ifndef SEGGER_RTT_LOCK + #define SEGGER_RTT_LOCK() // Lock RTT (nestable) (i.e. disable interrupts) +#endif + +#ifndef SEGGER_RTT_UNLOCK + #define SEGGER_RTT_UNLOCK() // Unlock RTT (nestable) (i.e. enable previous interrupt lock state) +#endif + +#endif +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER_RTT_printf.c a/RTT/SEGGER_RTT_printf.c new file mode 100644 index 0000000..498c7f8 --- /dev/null +++ a/RTT/SEGGER_RTT_printf.c @@ -0,0 +1,515 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2018 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER RTT * Real Time Transfer for embedded targets * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the RTT protocol and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* conditions are met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this list of conditions and the following disclaimer. * +* * +* o Redistributions in binary form must reproduce the above * +* copyright notice, this list of conditions and the following * +* disclaimer in the documentation and/or other materials provided * +* with the distribution. * +* * +* o Neither the name of SEGGER Microcontroller GmbH * +* nor the names of its contributors may be used to endorse or * +* promote products derived from this software without specific * +* prior written permission. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* RTT version: 6.30b * +* * +********************************************************************** +---------------------------END-OF-HEADER------------------------------ +File : SEGGER_RTT_printf.c +Purpose : Replacement for printf to write formatted data via RTT +Revision: $Rev: 9599 $ +---------------------------------------------------------------------- +*/ +#include "SEGGER_RTT.h" +#include "SEGGER_RTT_Conf.h" + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ + +#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE + #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64) +#endif + +#include +#include + + +#define FORMAT_FLAG_LEFT_JUSTIFY (1u << 0) +#define FORMAT_FLAG_PAD_ZERO (1u << 1) +#define FORMAT_FLAG_PRINT_SIGN (1u << 2) +#define FORMAT_FLAG_ALTERNATE (1u << 3) + +/********************************************************************* +* +* Types +* +********************************************************************** +*/ + +typedef struct { + char* pBuffer; + unsigned BufferSize; + unsigned Cnt; + + int ReturnValue; + + unsigned RTTBufferIndex; +} SEGGER_RTT_PRINTF_DESC; + +/********************************************************************* +* +* Function prototypes +* +********************************************************************** +*/ +int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList); + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ +/********************************************************************* +* +* _StoreChar +*/ +static void _StoreChar(SEGGER_RTT_PRINTF_DESC * p, char c) { + unsigned Cnt; + + Cnt = p->Cnt; + if ((Cnt + 1u) <= p->BufferSize) { + *(p->pBuffer + Cnt) = c; + p->Cnt = Cnt + 1u; + p->ReturnValue++; + } + // + // Write part of string, when the buffer is full + // + if (p->Cnt == p->BufferSize) { + if (SEGGER_RTT_Write(p->RTTBufferIndex, p->pBuffer, p->Cnt) != p->Cnt) { + p->ReturnValue = -1; + } else { + p->Cnt = 0u; + } + } +} + +/********************************************************************* +* +* _PrintUnsigned +*/ +static void _PrintUnsigned(SEGGER_RTT_PRINTF_DESC * pBufferDesc, unsigned v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { + static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + unsigned Div; + unsigned Digit; + unsigned Number; + unsigned Width; + char c; + + Number = v; + Digit = 1u; + // + // Get actual field width + // + Width = 1u; + while (Number >= Base) { + Number = (Number / Base); + Width++; + } + if (NumDigits > Width) { + Width = NumDigits; + } + // + // Print leading chars if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) { + if (FieldWidth != 0u) { + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) { + c = '0'; + } else { + c = ' '; + } + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, c); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + if (pBufferDesc->ReturnValue >= 0) { + // + // Compute Digit. + // Loop until Digit has the value of the highest digit required. + // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100. + // + while (1) { + if (NumDigits > 1u) { // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned) + NumDigits--; + } else { + Div = v / Digit; + if (Div < Base) { // Is our divider big enough to extract the highest digit from value? => Done + break; + } + } + Digit *= Base; + } + // + // Output digits + // + do { + Div = v / Digit; + v -= Div * Digit; + _StoreChar(pBufferDesc, _aV2C[Div]); + if (pBufferDesc->ReturnValue < 0) { + break; + } + Digit /= Base; + } while (Digit); + // + // Print trailing spaces if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + } +} + +/********************************************************************* +* +* _PrintInt +*/ +static void _PrintInt(SEGGER_RTT_PRINTF_DESC * pBufferDesc, int v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { + unsigned Width; + int Number; + + Number = (v < 0) ? -v : v; + + // + // Get actual field width + // + Width = 1u; + while (Number >= (int)Base) { + Number = (Number / (int)Base); + Width++; + } + if (NumDigits > Width) { + Width = NumDigits; + } + if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) { + FieldWidth--; + } + + // + // Print leading spaces if necessary + // + if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + // + // Print sign if necessary + // + if (pBufferDesc->ReturnValue >= 0) { + if (v < 0) { + v = -v; + _StoreChar(pBufferDesc, '-'); + } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) { + _StoreChar(pBufferDesc, '+'); + } else { + + } + if (pBufferDesc->ReturnValue >= 0) { + // + // Print leading zeros if necessary + // + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, '0'); + if (pBufferDesc->ReturnValue < 0) { + break; + } + } + } + } + if (pBufferDesc->ReturnValue >= 0) { + // + // Print number without sign + // + _PrintUnsigned(pBufferDesc, (unsigned)v, Base, NumDigits, FieldWidth, FormatFlags); + } + } + } +} + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ +/********************************************************************* +* +* SEGGER_RTT_vprintf +* +* Function description +* Stores a formatted string in SEGGER RTT control block. +* This data is read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") +* sFormat Pointer to format string +* pParamList Pointer to the list of arguments for the format string +* +* Return values +* >= 0: Number of bytes which have been stored in the "Up"-buffer. +* < 0: Error +*/ +int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList) { + char c; + SEGGER_RTT_PRINTF_DESC BufferDesc; + int v; + unsigned NumDigits; + unsigned FormatFlags; + unsigned FieldWidth; + char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE]; + + BufferDesc.pBuffer = acBuffer; + BufferDesc.BufferSize = SEGGER_RTT_PRINTF_BUFFER_SIZE; + BufferDesc.Cnt = 0u; + BufferDesc.RTTBufferIndex = BufferIndex; + BufferDesc.ReturnValue = 0; + + do { + c = *sFormat; + sFormat++; + if (c == 0u) { + break; + } + if (c == '%') { + // + // Filter out flags + // + FormatFlags = 0u; + v = 1; + do { + c = *sFormat; + switch (c) { + case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break; + case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO; sFormat++; break; + case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN; sFormat++; break; + case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE; sFormat++; break; + default: v = 0; break; + } + } while (v); + // + // filter out field with + // + FieldWidth = 0u; + do { + c = *sFormat; + if ((c < '0') || (c > '9')) { + break; + } + sFormat++; + FieldWidth = (FieldWidth * 10u) + ((unsigned)c - '0'); + } while (1); + + // + // Filter out precision (number of digits to display) + // + NumDigits = 0u; + c = *sFormat; + if (c == '.') { + sFormat++; + do { + c = *sFormat; + if ((c < '0') || (c > '9')) { + break; + } + sFormat++; + NumDigits = NumDigits * 10u + ((unsigned)c - '0'); + } while (1); + } + // + // Filter out length modifier + // + c = *sFormat; + do { + if ((c == 'l') || (c == 'h')) { + sFormat++; + c = *sFormat; + } else { + break; + } + } while (1); + // + // Handle specifiers + // + switch (c) { + case 'c': { + char c0; + v = va_arg(*pParamList, int); + c0 = (char)v; + _StoreChar(&BufferDesc, c0); + break; + } + case 'd': + v = va_arg(*pParamList, int); + _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'u': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'x': + case 'X': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags); + break; + case 's': + { + const char * s = va_arg(*pParamList, const char *); + do { + c = *s; + s++; + if (c == '\0') { + break; + } + _StoreChar(&BufferDesc, c); + } while (BufferDesc.ReturnValue >= 0); + } + break; + case 'p': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u); + break; + case '%': + _StoreChar(&BufferDesc, '%'); + break; + default: + break; + } + sFormat++; + } else { + _StoreChar(&BufferDesc, c); + } + } while (BufferDesc.ReturnValue >= 0); + + if (BufferDesc.ReturnValue > 0) { + // + // Write remaining data, if any + // + if (BufferDesc.Cnt != 0u) { + SEGGER_RTT_Write(BufferIndex, acBuffer, BufferDesc.Cnt); + } + BufferDesc.ReturnValue += (int)BufferDesc.Cnt; + } + return BufferDesc.ReturnValue; +} + +/********************************************************************* +* +* SEGGER_RTT_printf +* +* Function description +* Stores a formatted string in SEGGER RTT control block. +* This data is read by the host. +* +* Parameters +* BufferIndex Index of "Up"-buffer to be used. (e.g. 0 for "Terminal") +* sFormat Pointer to format string, followed by the arguments for conversion +* +* Return values +* >= 0: Number of bytes which have been stored in the "Up"-buffer. +* < 0: Error +* +* Notes +* (1) Conversion specifications have following syntax: +* %[flags][FieldWidth][.Precision]ConversionSpecifier +* (2) Supported flags: +* -: Left justify within the field width +* +: Always print sign extension for signed conversions +* 0: Pad with 0 instead of spaces. Ignored when using '-'-flag or precision +* Supported conversion specifiers: +* c: Print the argument as one char +* d: Print the argument as a signed integer +* u: Print the argument as an unsigned integer +* x: Print the argument as an hexadecimal integer +* s: Print the string pointed to by the argument +* p: Print the argument as an 8-digit hexadecimal integer. (Argument shall be a pointer to void.) +*/ +int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...) { + int r; + va_list ParamList; + + va_start(ParamList, sFormat); + r = SEGGER_RTT_vprintf(BufferIndex, sFormat, &ParamList); + va_end(ParamList); + return r; +} +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER_SYSVIEW.c a/RTT/SEGGER_SYSVIEW.c new file mode 100644 index 0000000..0e33c14 --- /dev/null +++ a/RTT/SEGGER_SYSVIEW.c @@ -0,0 +1,3063 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.30 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- + +File : SEGGER_SYSVIEW.c +Purpose : System visualization API implementation. +Revision: $Rev: 22278 $ + +Additional information: + Packet format: + Packets with IDs 0..23 are standard packets with known structure. + For efficiency, they do *NOT* contain a length field. + + + Packets with IDs 24..31 are standard packets with extendible + structure and contain a length field. + + + Packet ID 31 is used for SystemView extended events. + + + Packets with IDs >= 32 always contain a length field. + + + Packet IDs: + 0.. 31 : Standard packets, known by SystemView. + 32..1023 : OS-definable packets, described in a SystemView description file. + 1024..2047 : User-definable packets, described in a SystemView description file. + 2048..32767: Undefined. + + Data encoding: + Basic types (int, short, char, ...): + Basic types are encoded little endian with most-significant bit variant + encoding. + Each encoded byte contains 7 data bits [6:0] and the MSB continuation bit. + The continuation bit indicates whether the next byte belongs to the data + (bit set) or this is the last byte (bit clear). + The most significant bits of data are encoded first, proceeding to the + least significant bits in the final byte (little endian). + + Example encoding: + Data: 0x1F4 (500) + Encoded: 0xF4 (First 7 data bits 74 | Continuation bit) + 0x03 (Second 7 data bits 03, no continuation) + + Data: 0xFFFFFFFF + Encoded: 0xFF 0xFF 0xFF 0xFF 0x0F + + Data: 0xA2 (162), 0x03 (3), 0x7000 + Encoded: 0xA2 0x01 0x03 0x80 0xE0 0x01 + + Byte arrays and strings: + Byte arrays and strings are encoded as followed by the raw data. + NumBytes is encoded as a basic type with a theoretical maximum of 4G. + + Example encoding: + Data: "Hello World\0" (0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 0x00) + Encoded: 0x0B 0x48 0x65 0x6C 0x6C 0x6F 0x20 0x57 0x6F 0x72 0x6C 0x64 + + Examples packets: + 01 F4 03 80 80 10 // Overflow packet. Data is a single U32. + This packet means: 500 packets lost, Timestamp is 0x40000 + + 02 0F 50 // ISR(15) Enter. Timestamp 80 (0x50) + + 03 20 // ISR Exit. Timestamp 32 (0x20) (Shortest possible packet.) + + Sample code for user defined Packets: + #define MY_ID 0x400 // Any value between 0x400 and 0x7FF + void SendMyPacket(unsigned Para0, unsigned Para1, const char* s) { + U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + MAX_STR_LEN + 1]; + U8* pPayload; + // + pPayload = SEGGER_SYSVIEW_PPREPARE_PACKET(aPacket); // Prepare the packet for SystemView + pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0); // Add the first parameter to the packet + pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1); // Add the second parameter to the packet + pPayload = SEGGER_SYSVIEW_EncodeString(pPayload, s, MAX_STR_LEN); // Add the string to the packet + // + SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, MY_ID); // Send the packet with EventId = MY_ID + } + + #define MY_ID_1 0x401 + void SendOnePara(unsigned Para0) { + SEGGER_SYSVIEW_RecordU32(MY_ID_1, Para0); + } + +*/ + +/********************************************************************* +* +* #include section +* +********************************************************************** +*/ + +#define SEGGER_SYSVIEW_C // For EXTERN statements in SEGGER_SYSVIEW.h + +#include +#include +#include +#include "SEGGER_SYSVIEW_Int.h" +#include "SEGGER_RTT.h" + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ +#if SEGGER_SYSVIEW_ID_SHIFT + #define SHRINK_ID(Id) (((Id) - _SYSVIEW_Globals.RAMBaseAddress) >> SEGGER_SYSVIEW_ID_SHIFT) +#else + #define SHRINK_ID(Id) ((Id) - _SYSVIEW_Globals.RAMBaseAddress) +#endif + +#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 + #define CHANNEL_ID_UP SEGGER_SYSVIEW_RTT_CHANNEL + #define CHANNEL_ID_DOWN SEGGER_SYSVIEW_RTT_CHANNEL +#else + #define CHANNEL_ID_UP _SYSVIEW_Globals.UpChannel + #define CHANNEL_ID_DOWN _SYSVIEW_Globals.DownChannel +#endif + +#if SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE + #if (SEGGER_SYSVIEW_RTT_BUFFER_SIZE % SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE) + #error "SEGGER_SYSVIEW_RTT_BUFFER_SIZE must be a multiple of SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE" + #endif +#endif + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ +// Timestamps may be less than full 32-bits, in which case we need to zero +// the unused bits to properly handle overflows. +// Note that this is a quite common scenario, as a 32-bit time such as +// SysTick might be scaled down to reduce bandwith +// or a 16-bit hardware time might be used. +#if SEGGER_SYSVIEW_TIMESTAMP_BITS < 32 // Eliminate unused bits in case hardware timestamps are less than 32 bits + #define MAKE_DELTA_32BIT(Delta) Delta <<= 32 - SEGGER_SYSVIEW_TIMESTAMP_BITS; \ + Delta >>= 32 - SEGGER_SYSVIEW_TIMESTAMP_BITS; +#else + #define MAKE_DELTA_32BIT(Delta) +#endif + + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ +#define ENABLE_STATE_OFF 0 +#define ENABLE_STATE_ON 1 +#define ENABLE_STATE_DROPPING 2 + +#define FORMAT_FLAG_LEFT_JUSTIFY (1u << 0) +#define FORMAT_FLAG_PAD_ZERO (1u << 1) +#define FORMAT_FLAG_PRINT_SIGN (1u << 2) +#define FORMAT_FLAG_ALTERNATE (1u << 3) + +#define MODULE_EVENT_OFFSET (512) + +/********************************************************************* +* +* Types, local +* +********************************************************************** +*/ +typedef struct { + U8* pBuffer; + U8* pPayload; + U8* pPayloadStart; + U32 Options; + unsigned Cnt; +} SEGGER_SYSVIEW_PRINTF_DESC; + +typedef struct { + U8 EnableState; // 0: Disabled, 1: Enabled, (2: Dropping) + U8 UpChannel; + U8 RecursionCnt; + U32 SysFreq; + U32 CPUFreq; + U32 LastTxTimeStamp; + U32 RAMBaseAddress; +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + U32 PacketCount; +#else + U32 DropCount; + U8 DownChannel; +#endif + U32 DisabledEvents; + const SEGGER_SYSVIEW_OS_API* pOSAPI; + SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC* pfSendSysDesc; +} SEGGER_SYSVIEW_GLOBALS; + +/********************************************************************* +* +* Function prototypes, required +* +********************************************************************** +*/ +static void _SendPacket(U8* pStartPacket, U8* pEndPacket, unsigned int EventId); + +/********************************************************************* +* +* Static data +* +********************************************************************** +*/ +static const U8 _abSync[10] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +#if SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE + #ifdef SEGGER_SYSVIEW_SECTION + // + // Alignment + special section required + // + #if (defined __GNUC__) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __ICCARM__) || (defined __ICCRX__) + #pragma location=SEGGER_SYSVIEW_SECTION + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + #pragma location=SEGGER_SYSVIEW_SECTION + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __CC_ARM) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #else + #error "Do not know how to place SystemView buffers in specific section" + #endif + #else + // + // Only alignment required + // + #if (defined __GNUC__) + __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __ICCARM__) || (defined __ICCRX__) + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __CC_ARM) + __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #else + #error "Do not know how to align SystemView buffers to cache line size" + #endif + #endif +#else + #ifdef SEGGER_SYSVIEW_SECTION + // + // Only special section required + // + #if (defined __GNUC__) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __ICCARM__) || (defined __ICCRX__) + #pragma location=SEGGER_SYSVIEW_SECTION + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + #pragma location=SEGGER_SYSVIEW_SECTION + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __CC_ARM) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #else + #error "Do not know how to place SystemView buffers in specific section" + #endif + #else + // + // Neither special section nor alignment required + // + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #endif +#endif + +#ifdef SEGGER_SYSVIEW_SECTION + #if (defined __GNUC__) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION))) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined __ICCARM__) || (defined __ICCRX__) + #pragma location=SEGGER_SYSVIEW_SECTION + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #pragma location=SEGGER_SYSVIEW_SECTION + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #elif (defined __CC_ARM) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + __attribute__ ((section (SEGGER_SYSVIEW_SECTION), zero_init)) static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #else + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #endif +#else + #if SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE + #if (defined __GNUC__) + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE] __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))); + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + static char _DownBuffer[8] __attribute__ ((aligned (SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE))); // Small, fixed-size buffer, for back-channel comms + #endif + #elif (defined(__ICCARM__)) + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #else + #error "Don't know how to place _SEGGER_RTT, _acUpBuffer, _acDownBuffer cache-line aligned" + #endif + #else + static char _UpBuffer [SEGGER_SYSVIEW_RTT_BUFFER_SIZE]; + #if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + static char _DownBuffer[8]; // Small, fixed-size buffer, for back-channel comms + #endif + #endif +#endif + +static SEGGER_SYSVIEW_GLOBALS _SYSVIEW_Globals; + +static SEGGER_SYSVIEW_MODULE* _pFirstModule; +static U8 _NumModules; + +/********************************************************************* +* +* Static code +* +********************************************************************** +*/ + +#define ENCODE_U32(pDest, Value) { \ + U8* pSysviewPointer; \ + U32 SysViewData; \ + pSysviewPointer = pDest; \ + SysViewData = Value; \ + while(SysViewData > 0x7F) { \ + *pSysviewPointer++ = (U8)(SysViewData | 0x80); \ + SysViewData >>= 7; \ + }; \ + *pSysviewPointer++ = (U8)SysViewData; \ + pDest = pSysviewPointer; \ + }; + + + +#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) +static U8 _aPacket[SEGGER_SYSVIEW_MAX_PACKET_SIZE]; + +#define RECORD_START(PacketSize) SEGGER_SYSVIEW_LOCK(); \ + pPayloadStart = _PreparePacket(_aPacket); + +#define RECORD_END() SEGGER_SYSVIEW_UNLOCK() + +#else + +#define RECORD_START(PacketSize) U8 aPacket[(PacketSize)]; \ + pPayloadStart = _PreparePacket(aPacket); \ + +#define RECORD_END() + +#endif + +/********************************************************************* +* +* _EncodeData() +* +* Function description +* Encode a byte buffer in variable-length format. +* +* Parameters +* pPayload - Pointer to where string will be encoded. +* pSrc - Pointer to data buffer to be encoded. +* NumBytes - Number of bytes in the buffer to be encoded. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +* +* Additional information +* The data is encoded as a count byte followed by the contents +* of the data buffer. +* Make sure NumBytes + 1 bytes are free for the payload. +*/ +static U8* _EncodeData(U8* pPayload, const char* pSrc, unsigned int NumBytes) { + unsigned int n; + // + n = 0; + *pPayload++ = NumBytes; + while (n < NumBytes) { + *pPayload++ = *pSrc++; + n++; + } + return pPayload; +} + +/********************************************************************* +* +* _EncodeStr() +* +* Function description +* Encode a string in variable-length format. +* +* Parameters +* pPayload - Pointer to where string will be encoded. +* pText - String to encode. +* Limit - Maximum number of characters to encode from string. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +* +* Additional information +* The string is encoded as a count byte followed by the contents +* of the string. +* No more than 1 + Limit bytes will be encoded to the payload. +*/ +static U8 *_EncodeStr(U8 *pPayload, const char *pText, unsigned int Limit) { + unsigned int n; + unsigned int Len; + // + // Compute string len + // + Len = 0; + if (pText != NULL) { + while(*(pText + Len) != 0) { + Len++; + } + if (Len > Limit) { + Len = Limit; + } + } + // + // Write Len + // + if (Len < 255) { + *pPayload++ = Len; + } else { + *pPayload++ = 255; + *pPayload++ = (Len & 255); + *pPayload++ = ((Len >> 8) & 255); + } + // + // copy string + // + n = 0; + while (n < Len) { + *pPayload++ = *pText++; + n++; + } + return pPayload; +} + +/********************************************************************* +* +* _PreparePacket() +* +* Function description +* Prepare a SystemView event packet header. +* +* Parameters +* pPacket - Pointer to start of packet to initialize. +* +* Return value +* Pointer to first byte of packet payload. +* +* Additional information +* The payload length and evnetId are not initialized. +* PreparePacket only reserves space for them and they are +* computed and filled in by the sending function. +*/ +static U8* _PreparePacket(U8* pPacket) { + return pPacket + 4; +} + +/********************************************************************* +* +* _HandleIncomingPacket() +* +* Function description +* Read an incoming command from the down channel and process it. +* +* Additional information +* This function is called each time after sending a packet. +* Processing incoming packets is done asynchronous. SystemView might +* already have sent event packets after the host has sent a command. +*/ +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) +static void _HandleIncomingPacket(void) { + U8 Cmd; + int Status; + // + Status = SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); + if (Status > 0) { + switch (Cmd) { + case SEGGER_SYSVIEW_COMMAND_ID_START: + SEGGER_SYSVIEW_Start(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_STOP: + SEGGER_SYSVIEW_Stop(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_SYSTIME: + SEGGER_SYSVIEW_RecordSystime(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_TASKLIST: + SEGGER_SYSVIEW_SendTaskList(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_SYSDESC: + SEGGER_SYSVIEW_GetSysDesc(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_NUMMODULES: + SEGGER_SYSVIEW_SendNumModules(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_MODULEDESC: + SEGGER_SYSVIEW_SendModuleDescription(); + break; + case SEGGER_SYSVIEW_COMMAND_ID_GET_MODULE: + Status = SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); + if (Status > 0) { + SEGGER_SYSVIEW_SendModule(Cmd); + } + break; + case SEGGER_SYSVIEW_COMMAND_ID_HEARTBEAT: + break; + default: + if (Cmd >= 128) { // Unknown extended command. Dummy read its parameter. + SEGGER_RTT_ReadNoLock(CHANNEL_ID_DOWN, &Cmd, 1); + } + break; + } + } +} +#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + +/********************************************************************* +* +* _TrySendOverflowPacket() +* +* Function description +* Try to transmit an SystemView Overflow packet containing the +* number of dropped packets. +* +* Additional information +* Format as follows: +* 01 Max. packet len is 1 + 5 + 5 = 11 +* +* Example packets sent +* 01 20 40 +* +* Return value +* !=0: Success, Message sent (stored in RTT-Buffer) +* ==0: Buffer full, Message *NOT* stored +* +*/ +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) +static int _TrySendOverflowPacket(void) { + U32 TimeStamp; + I32 Delta; + int Status; + U8 aPacket[11]; + U8* pPayload; + + aPacket[0] = SYSVIEW_EVTID_OVERFLOW; // 1 + pPayload = &aPacket[1]; + ENCODE_U32(pPayload, _SYSVIEW_Globals.DropCount); + // + // Compute time stamp delta and append it to packet. + // + TimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); + Delta = TimeStamp - _SYSVIEW_Globals.LastTxTimeStamp; + MAKE_DELTA_32BIT(Delta); + ENCODE_U32(pPayload, Delta); + // + // Try to store packet in RTT buffer and update time stamp when this was successful + // + Status = SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, aPacket, pPayload - aPacket); + SEGGER_SYSVIEW_ON_EVENT_RECORDED(pPayload - aPacket); + if (Status) { + _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; + _SYSVIEW_Globals.EnableState--; // EnableState has been 2, will be 1. Always. + } else { + _SYSVIEW_Globals.DropCount++; + } + // + return Status; +} +#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + +/********************************************************************* +* +* _SendSyncInfo() +* +* Function description +* Send SystemView sync packet and system information in +* post mortem mode. +* +* Additional information +* Sync is 10 * 0x00 without timestamp +*/ +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) +static void _SendSyncInfo(void) { + // + // Add sync packet ( 10 * 0x00) + // Send system description + // Send system time + // Send task list + // Send module description + // Send module information + // + SEGGER_RTT_WriteWithOverwriteNoLock(CHANNEL_ID_UP, _abSync, 10); + SEGGER_SYSVIEW_ON_EVENT_RECORDED(10); + SEGGER_SYSVIEW_RecordVoid(SYSVIEW_EVTID_TRACE_START); + { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); + RECORD_END(); + } + if (_SYSVIEW_Globals.pfSendSysDesc) { + _SYSVIEW_Globals.pfSendSysDesc(); + } + SEGGER_SYSVIEW_RecordSystime(); + SEGGER_SYSVIEW_SendTaskList(); + if (_NumModules > 0) { + int n; + SEGGER_SYSVIEW_SendNumModules(); + for (n = 0; n < _NumModules; n++) { + SEGGER_SYSVIEW_SendModule(n); + } + SEGGER_SYSVIEW_SendModuleDescription(); + } +} +#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + +/********************************************************************* +* +* _SendPacket() +* +* Function description +* Send a SystemView packet over RTT. RTT channel and mode are +* configured by macros when the SystemView component is initialized. +* This function takes care of maintaining the packet drop count +* and sending overflow packets when necessary. +* The packet must be passed without Id and Length because this +* function prepends it to the packet before transmission. +* +* Parameters +* pStartPacket - Pointer to start of packet payload. +* There must be at least 4 bytes free to prepend Id and Length. +* pEndPacket - Pointer to end of packet payload. +* EventId - Id of the event to send. +* +*/ +static void _SendPacket(U8* pStartPacket, U8* pEndPacket, unsigned int EventId) { + unsigned int NumBytes; + U32 TimeStamp; + U32 Delta; +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + int Status; +#endif + +#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0) + SEGGER_SYSVIEW_LOCK(); +#endif + +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + if (_SYSVIEW_Globals.EnableState == 0) { + goto SendDone; + } +#else + if (_SYSVIEW_Globals.EnableState == 1) { // Enabled, no dropped packets remaining + goto Send; + } + if (_SYSVIEW_Globals.EnableState == 0) { + goto SendDone; + } + // + // Handle buffer full situations: + // Have packets been dropped before because buffer was full? + // In this case try to send and overflow packet. + // + if (_SYSVIEW_Globals.EnableState == 2) { + _TrySendOverflowPacket(); + if (_SYSVIEW_Globals.EnableState != 1) { + goto SendDone; + } + } +Send: +#endif + // + // Check if event is disabled from being recorded. + // + if (EventId < 32) { + if (_SYSVIEW_Globals.DisabledEvents & ((U32)1u << EventId)) { + goto SendDone; + } + } + // + // Prepare actual packet. + // If it is a known packet, prepend eventId only, + // otherwise prepend packet length and eventId. + // + if (EventId < 24) { + *--pStartPacket = EventId; + } else { + NumBytes = pEndPacket - pStartPacket; + if (NumBytes > 127) { + *--pStartPacket = (NumBytes >> 7); + *--pStartPacket = NumBytes | 0x80; + } else { + *--pStartPacket = NumBytes; + } + if (EventId > 127) { + *--pStartPacket = (EventId >> 7); + *--pStartPacket = EventId | 0x80; + } else { + *--pStartPacket = EventId; + } + } + // + // Compute time stamp delta and append it to packet. + // + TimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); + Delta = TimeStamp - _SYSVIEW_Globals.LastTxTimeStamp; + MAKE_DELTA_32BIT(Delta); + ENCODE_U32(pEndPacket, Delta); +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + // + // Store packet in RTT buffer by overwriting old data and update time stamp + // + SEGGER_RTT_WriteWithOverwriteNoLock(CHANNEL_ID_UP, pStartPacket, pEndPacket - pStartPacket); + SEGGER_SYSVIEW_ON_EVENT_RECORDED(pEndPacket - pStartPacket); + _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; +#else + // + // Try to store packet in RTT buffer and update time stamp when this was successful + // + Status = SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, pStartPacket, pEndPacket - pStartPacket); + SEGGER_SYSVIEW_ON_EVENT_RECORDED(pEndPacket - pStartPacket); + if (Status) { + _SYSVIEW_Globals.LastTxTimeStamp = TimeStamp; + } else { + _SYSVIEW_Globals.EnableState++; // EnableState has been 1, will be 2. Always. + } +#endif + +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + // + // Add sync and system information periodically if we are in post mortem mode + // + if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. + _SYSVIEW_Globals.RecursionCnt = 1; + if (_SYSVIEW_Globals.PacketCount++ & (1 << SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT)) { + _SendSyncInfo(); + _SYSVIEW_Globals.PacketCount = 0; + } + _SYSVIEW_Globals.RecursionCnt = 0; + } +SendDone: + ; // Avoid "label at end of compound statement" error when using static buffer +#else +SendDone: + // + // Check if host is sending data which needs to be processed. + // Note that since this code is called for every packet, it is very time critical, so we do + // only what is really needed here, which is checking if there is any data + // + if (SEGGER_RTT_HASDATA(CHANNEL_ID_DOWN)) { + if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. + _SYSVIEW_Globals.RecursionCnt = 1; + _HandleIncomingPacket(); + _SYSVIEW_Globals.RecursionCnt = 0; + } + } +#endif + // +#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0) + SEGGER_SYSVIEW_UNLOCK(); // We are done. Unlock and return +#endif +} + +#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list +/********************************************************************* +* +* _VPrintHost() +* +* Function description +* Send a format string and its parameters to the host. +* +* Parameters +* s Pointer to format string. +* Options Options to be sent to the host. +* pParamList Pointer to the list of arguments for the format string. +*/ +static int _VPrintHost(const char* s, U32 Options, va_list* pParamList) { + U32 aParas[SEGGER_SYSVIEW_MAX_ARGUMENTS]; + U32* pParas; + U32 NumArguments; + const char* p; + char c; + U8* pPayload; + U8* pPayloadStart; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + U8 HasNonScalar; + + HasNonScalar = 0; +#endif + // + // Count number of arguments by counting '%' characters in string. + // If enabled, check for non-scalar modifier flags to format string on the target. + // + p = s; + NumArguments = 0; + for (;;) { + c = *p++; + if (c == 0) { + break; + } + if (c == '%') { + c = *p; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT == 0 + aParas[NumArguments++] = va_arg(*pParamList, int); + if (NumArguments == SEGGER_SYSVIEW_MAX_ARGUMENTS) { + break; + } +#else + if (c == 's') { + HasNonScalar = 1; + break; + } else { + aParas[NumArguments++] = va_arg(*pParamList, int); + if (NumArguments == SEGGER_SYSVIEW_MAX_ARGUMENTS) { + break; + } + } +#endif + } + } + +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + if (HasNonScalar) { + return -1; + } +#endif + // + // Send string and parameters to host + // + { + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_ARGUMENTS * SEGGER_SYSVIEW_QUANTA_U32); + pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); + ENCODE_U32(pPayload, Options); + ENCODE_U32(pPayload, NumArguments); + pParas = aParas; + while (NumArguments--) { + ENCODE_U32(pPayload, (*pParas)); + pParas++; + } + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + RECORD_END(); + } + return 0; +} + +/********************************************************************* +* +* _StoreChar() +* +* Function description +* Stores a character in the printf-buffer and sends the buffer when +* it is filled. +* +* Parameters +* p Pointer to the buffer description. +* c Character to be printed. +*/ +static void _StoreChar(SEGGER_SYSVIEW_PRINTF_DESC * p, char c) { + unsigned int Cnt; + U8* pPayload; + U32 Options; + + Cnt = p->Cnt; + if ((Cnt + 1u) <= SEGGER_SYSVIEW_MAX_STRING_LEN) { + *(p->pPayload++) = c; + p->Cnt = Cnt + 1u; + } + // + // Write part of string, when the buffer is full + // + if (p->Cnt == SEGGER_SYSVIEW_MAX_STRING_LEN) { + *(p->pPayloadStart) = p->Cnt; + pPayload = p->pPayload; + Options = p->Options; + ENCODE_U32(pPayload, Options); + ENCODE_U32(pPayload, 0); + _SendPacket(p->pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + p->pPayloadStart = _PreparePacket(p->pBuffer); + p->pPayload = p->pPayloadStart + 1u; + p->Cnt = 0u; + } +} + +/********************************************************************* +* +* _PrintUnsigned() +* +* Function description +* Print an unsigned integer with the given formatting into the +* formatted string. +* +* Parameters +* pBufferDesc Pointer to the buffer description. +* v Value to be printed. +* Base Base of the value. +* NumDigits Number of digits to be printed. +* FieldWidth Width of the printed field. +* FormatFlags Flags for formatting the value. +*/ +static void _PrintUnsigned(SEGGER_SYSVIEW_PRINTF_DESC * pBufferDesc, unsigned int v, unsigned int Base, unsigned int NumDigits, unsigned int FieldWidth, unsigned int FormatFlags) { + static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + unsigned int Div; + unsigned int Digit; + unsigned int Number; + unsigned int Width; + char c; + + Number = v; + Digit = 1u; + // + // Get actual field width + // + Width = 1u; + while (Number >= Base) { + Number = (Number / Base); + Width++; + } + if (NumDigits > Width) { + Width = NumDigits; + } + // + // Print leading chars if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) { + if (FieldWidth != 0u) { + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) { + c = '0'; + } else { + c = ' '; + } + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, c); + } + } + } + // + // Compute Digit. + // Loop until Digit has the value of the highest digit required. + // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100. + // + while (1) { + if (NumDigits > 1u) { // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned) + NumDigits--; + } else { + Div = v / Digit; + if (Div < Base) { // Is our divider big enough to extract the highest digit from value? => Done + break; + } + } + Digit *= Base; + } + // + // Output digits + // + do { + Div = v / Digit; + v -= Div * Digit; + _StoreChar(pBufferDesc, _aV2C[Div]); + Digit /= Base; + } while (Digit); + // + // Print trailing spaces if necessary + // + if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + } + } + } +} + +/********************************************************************* +* +* _PrintInt() +* +* Function description +* Print a signed integer with the given formatting into the +* formatted string. +* +* Parameters +* pBufferDesc Pointer to the buffer description. +* v Value to be printed. +* Base Base of the value. +* NumDigits Number of digits to be printed. +* FieldWidth Width of the printed field. +* FormatFlags Flags for formatting the value. +*/ +static void _PrintInt(SEGGER_SYSVIEW_PRINTF_DESC * pBufferDesc, int v, unsigned int Base, unsigned int NumDigits, unsigned int FieldWidth, unsigned int FormatFlags) { + unsigned int Width; + int Number; + + Number = (v < 0) ? -v : v; + + // + // Get actual field width + // + Width = 1u; + while (Number >= (int)Base) { + Number = (Number / (int)Base); + Width++; + } + if (NumDigits > Width) { + Width = NumDigits; + } + if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) { + FieldWidth--; + } + + // + // Print leading spaces if necessary + // + if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, ' '); + } + } + } + // + // Print sign if necessary + // + if (v < 0) { + v = -v; + _StoreChar(pBufferDesc, '-'); + } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) { + _StoreChar(pBufferDesc, '+'); + } else { + + } + // + // Print leading zeros if necessary + // + if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) { + if (FieldWidth != 0u) { + while ((FieldWidth != 0u) && (Width < FieldWidth)) { + FieldWidth--; + _StoreChar(pBufferDesc, '0'); + } + } + } + // + // Print number without sign + // + _PrintUnsigned(pBufferDesc, (unsigned int)v, Base, NumDigits, FieldWidth, FormatFlags); +} + +/********************************************************************* +* +* _VPrintTarget() +* +* Function description +* Stores a formatted string. +* This data is read by the host. +* +* Parameters +* sFormat Pointer to format string. +* Options Options to be sent to the host. +* pParamList Pointer to the list of arguments for the format string. +*/ +static void _VPrintTarget(const char* sFormat, U32 Options, va_list* pParamList) { + SEGGER_SYSVIEW_PRINTF_DESC BufferDesc; + char c; + int v; + unsigned int NumDigits; + unsigned int FormatFlags; + unsigned int FieldWidth; + U8* pPayloadStart; +#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 1 + 2 * SEGGER_SYSVIEW_QUANTA_U32); + SEGGER_SYSVIEW_LOCK(); +#else + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 1 + 2 * SEGGER_SYSVIEW_QUANTA_U32); +#endif + +#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 + BufferDesc.pBuffer = aPacket; +#else + BufferDesc.pBuffer = _aPacket; +#endif + BufferDesc.Cnt = 0u; + BufferDesc.pPayloadStart = pPayloadStart; + BufferDesc.pPayload = BufferDesc.pPayloadStart + 1u; + BufferDesc.Options = Options; + + do { + c = *sFormat; + sFormat++; + if (c == 0u) { + break; + } + if (c == '%') { + // + // Filter out flags + // + FormatFlags = 0u; + v = 1; + do { + c = *sFormat; + switch (c) { + case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break; + case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO; sFormat++; break; + case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN; sFormat++; break; + case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE; sFormat++; break; + default: v = 0; break; + } + } while (v); + // + // filter out field with + // + FieldWidth = 0u; + do { + c = *sFormat; + if ((c < '0') || (c > '9')) { + break; + } + sFormat++; + FieldWidth = (FieldWidth * 10u) + ((unsigned int)c - '0'); + } while (1); + + // + // Filter out precision (number of digits to display) + // + NumDigits = 0u; + c = *sFormat; + if (c == '.') { + sFormat++; + do { + c = *sFormat; + if ((c < '0') || (c > '9')) { + break; + } + sFormat++; + NumDigits = NumDigits * 10u + ((unsigned int)c - '0'); + } while (1); + } + // + // Filter out length modifier + // + c = *sFormat; + do { + if ((c == 'l') || (c == 'h')) { + c = *sFormat; + sFormat++; + } else { + break; + } + } while (1); + // + // Handle specifiers + // + switch (c) { + case 'c': { + char c0; + v = va_arg(*pParamList, int); + c0 = (char)v; + _StoreChar(&BufferDesc, c0); + break; + } + case 'd': + v = va_arg(*pParamList, int); + _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'u': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned int)v, 10u, NumDigits, FieldWidth, FormatFlags); + break; + case 'x': + case 'X': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, NumDigits, FieldWidth, FormatFlags); + break; + case 'p': + v = va_arg(*pParamList, int); + _PrintUnsigned(&BufferDesc, (unsigned int)v, 16u, 8u, 8u, 0u); + break; + case '%': + _StoreChar(&BufferDesc, '%'); + break; + default: + break; + } + sFormat++; + } else { + _StoreChar(&BufferDesc, c); + } + } while (*sFormat); + + // + // Write remaining data, if any + // + if (BufferDesc.Cnt != 0u) { + *(BufferDesc.pPayloadStart) = BufferDesc.Cnt; + ENCODE_U32(BufferDesc.pPayload, BufferDesc.Options); + ENCODE_U32(BufferDesc.pPayload, 0); + _SendPacket(BufferDesc.pPayloadStart, BufferDesc.pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + } +#if SEGGER_SYSVIEW_USE_STATIC_BUFFER == 0 + SEGGER_SYSVIEW_UNLOCK(); + RECORD_END(); +#else + RECORD_END(); +#endif +} +#endif // SEGGER_SYSVIEW_EXCLUDE_PRINTF + +/********************************************************************* +* +* Public code +* +********************************************************************** +*/ + +/********************************************************************* +* +* SEGGER_SYSVIEW_Init() +* +* Function description +* Initializes the SYSVIEW module. +* Must be called before the Systemview Application connects to +* the system. +* +* Parameters +* SysFreq - Frequency of timestamp, usually CPU core clock frequency. +* CPUFreq - CPU core clock frequency. +* pOSAPI - Pointer to the API structure for OS-specific functions. +* pfSendSysDesc - Pointer to record system description callback function. +* +* Additional information +* This function initializes the RTT channel used to transport +* SEGGER SystemView packets. +* The channel is assigned the label "SysView" for client software +* to identify the SystemView channel. +* +* The channel is configured with the macro SEGGER_SYSVIEW_RTT_CHANNEL. +*/ +void SEGGER_SYSVIEW_Init(U32 SysFreq, U32 CPUFreq, const SEGGER_SYSVIEW_OS_API *pOSAPI, SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC pfSendSysDesc) { +#ifdef SEGGER_RTT_SECTION + // + // Explicitly initialize the RTT Control Block if it is in its dedicated section. + // + SEGGER_RTT_Init(); +#endif +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) +#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 + SEGGER_RTT_ConfigUpBuffer(SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); +#else + _SYSVIEW_Globals.UpChannel = SEGGER_RTT_AllocUpBuffer ("SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); +#endif + _SYSVIEW_Globals.RAMBaseAddress = SEGGER_SYSVIEW_ID_BASE; + _SYSVIEW_Globals.LastTxTimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); + _SYSVIEW_Globals.pOSAPI = pOSAPI; + _SYSVIEW_Globals.SysFreq = SysFreq; + _SYSVIEW_Globals.CPUFreq = CPUFreq; + _SYSVIEW_Globals.pfSendSysDesc = pfSendSysDesc; + _SYSVIEW_Globals.EnableState = 0; + _SYSVIEW_Globals.PacketCount = 0; +#else // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) +#if SEGGER_SYSVIEW_RTT_CHANNEL > 0 + SEGGER_RTT_ConfigUpBuffer (SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); + SEGGER_RTT_ConfigDownBuffer (SEGGER_SYSVIEW_RTT_CHANNEL, "SysView", &_DownBuffer[0], sizeof(_DownBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); +#else + _SYSVIEW_Globals.UpChannel = SEGGER_RTT_AllocUpBuffer ("SysView", &_UpBuffer[0], sizeof(_UpBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); + _SYSVIEW_Globals.DownChannel = _SYSVIEW_Globals.UpChannel; + SEGGER_RTT_ConfigDownBuffer (_SYSVIEW_Globals.DownChannel, "SysView", &_DownBuffer[0], sizeof(_DownBuffer), SEGGER_RTT_MODE_NO_BLOCK_SKIP); +#endif + _SYSVIEW_Globals.RAMBaseAddress = SEGGER_SYSVIEW_ID_BASE; + _SYSVIEW_Globals.LastTxTimeStamp = SEGGER_SYSVIEW_GET_TIMESTAMP(); + _SYSVIEW_Globals.pOSAPI = pOSAPI; + _SYSVIEW_Globals.SysFreq = SysFreq; + _SYSVIEW_Globals.CPUFreq = CPUFreq; + _SYSVIEW_Globals.pfSendSysDesc = pfSendSysDesc; + _SYSVIEW_Globals.EnableState = 0; +#endif // (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SetRAMBase() +* +* Function description +* Sets the RAM base address, which is subtracted from IDs in order +* to save bandwidth. +* +* Parameters +* RAMBaseAddress - Lowest RAM Address. (i.e. 0x20000000 on most Cortex-M) +*/ +void SEGGER_SYSVIEW_SetRAMBase(U32 RAMBaseAddress) { + _SYSVIEW_Globals.RAMBaseAddress = RAMBaseAddress; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordVoid() +* +* Function description +* Formats and sends a SystemView packet with an empty payload. +* +* Parameters +* EventID - SystemView event ID. +*/ +void SEGGER_SYSVIEW_RecordVoid(unsigned int EventID) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32() +* +* Function description +* Formats and sends a SystemView packet containing a single U32 +* parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Value - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32(unsigned int EventID, U32 Value) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Value); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x2() +* +* Function description +* Formats and sends a SystemView packet containing 2 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x2(unsigned int EventID, U32 Para0, U32 Para1) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x3() +* +* Function description +* Formats and sends a SystemView packet containing 3 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x3(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 3 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x4() +* +* Function description +* Formats and sends a SystemView packet containing 4 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x4(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x5() +* +* Function description +* Formats and sends a SystemView packet containing 5 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x5(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 5 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x6() +* +* Function description +* Formats and sends a SystemView packet containing 6 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +* Para5 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x6(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 6 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + ENCODE_U32(pPayload, Para5); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x7() +* +* Function description +* Formats and sends a SystemView packet containing 7 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +* Para5 - The 32-bit parameter encoded to SystemView packet payload. +* Para6 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x7(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 7 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + ENCODE_U32(pPayload, Para5); + ENCODE_U32(pPayload, Para6); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x8() +* +* Function description +* Formats and sends a SystemView packet containing 8 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +* Para5 - The 32-bit parameter encoded to SystemView packet payload. +* Para6 - The 32-bit parameter encoded to SystemView packet payload. +* Para7 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x8(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 8 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + ENCODE_U32(pPayload, Para5); + ENCODE_U32(pPayload, Para6); + ENCODE_U32(pPayload, Para7); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x9() +* +* Function description +* Formats and sends a SystemView packet containing 9 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +* Para5 - The 32-bit parameter encoded to SystemView packet payload. +* Para6 - The 32-bit parameter encoded to SystemView packet payload. +* Para7 - The 32-bit parameter encoded to SystemView packet payload. +* Para8 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x9(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 9 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + ENCODE_U32(pPayload, Para5); + ENCODE_U32(pPayload, Para6); + ENCODE_U32(pPayload, Para7); + ENCODE_U32(pPayload, Para8); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordU32x10() +* +* Function description +* Formats and sends a SystemView packet containing 10 U32 parameter payload. +* +* Parameters +* EventID - SystemView event ID. +* Para0 - The 32-bit parameter encoded to SystemView packet payload. +* Para1 - The 32-bit parameter encoded to SystemView packet payload. +* Para2 - The 32-bit parameter encoded to SystemView packet payload. +* Para3 - The 32-bit parameter encoded to SystemView packet payload. +* Para4 - The 32-bit parameter encoded to SystemView packet payload. +* Para5 - The 32-bit parameter encoded to SystemView packet payload. +* Para6 - The 32-bit parameter encoded to SystemView packet payload. +* Para7 - The 32-bit parameter encoded to SystemView packet payload. +* Para8 - The 32-bit parameter encoded to SystemView packet payload. +* Para9 - The 32-bit parameter encoded to SystemView packet payload. +*/ +void SEGGER_SYSVIEW_RecordU32x10(unsigned int EventID, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8, U32 Para9) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 10 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, Para0); + ENCODE_U32(pPayload, Para1); + ENCODE_U32(pPayload, Para2); + ENCODE_U32(pPayload, Para3); + ENCODE_U32(pPayload, Para4); + ENCODE_U32(pPayload, Para5); + ENCODE_U32(pPayload, Para6); + ENCODE_U32(pPayload, Para7); + ENCODE_U32(pPayload, Para8); + ENCODE_U32(pPayload, Para9); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordString() +* +* Function description +* Formats and sends a SystemView packet containing a string. +* +* Parameters +* EventID - SystemView event ID. +* pString - The string to be sent in the SystemView packet payload. +* +* Additional information +* The string is encoded as a count byte followed by the contents +* of the string. +* No more than SEGGER_SYSVIEW_MAX_STRING_LEN bytes will be encoded to the payload. +*/ +void SEGGER_SYSVIEW_RecordString(unsigned int EventID, const char* pString) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = _EncodeStr(pPayloadStart, pString, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, EventID); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_Start() +* +* Function description +* Start recording SystemView events. +* +* This function is triggered by the SystemView Application on connect. +* For single-shot or post-mortem mode recording, it needs to be called +* by the application. +* +* Additional information +* This function enables transmission of SystemView packets recorded +* by subsequent trace calls and records a SystemView Start event. +* +* As part of start, a SystemView Init packet is sent, containing the system +* frequency. The list of current tasks, the current system time and the +* system description string is sent, too. +* +* Notes +* SEGGER_SYSVIEW_Start and SEGGER_SYSVIEW_Stop do not nest. +* When SEGGER_SYSVIEW_CAN_RESTART is 1, each received start command +* records the system information. This is required to enable restart +* of recordings when SystemView unexpectedly disconnects without sending +* a stop command before. +*/ +void SEGGER_SYSVIEW_Start(void) { +#if (SEGGER_SYSVIEW_CAN_RESTART == 0) + if (_SYSVIEW_Globals.EnableState == 0) { +#endif + _SYSVIEW_Globals.EnableState = 1; +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE == 1) + _SendSyncInfo(); +#else + SEGGER_SYSVIEW_LOCK(); + SEGGER_RTT_WriteSkipNoLock(CHANNEL_ID_UP, _abSync, 10); + SEGGER_SYSVIEW_UNLOCK(); + SEGGER_SYSVIEW_ON_EVENT_RECORDED(10); + SEGGER_SYSVIEW_RecordVoid(SYSVIEW_EVTID_TRACE_START); + { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); + RECORD_END(); + } + if (_SYSVIEW_Globals.pfSendSysDesc) { + _SYSVIEW_Globals.pfSendSysDesc(); + } + SEGGER_SYSVIEW_RecordSystime(); + SEGGER_SYSVIEW_SendTaskList(); + SEGGER_SYSVIEW_SendNumModules(); +#endif +#if (SEGGER_SYSVIEW_CAN_RESTART == 0) + } +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_Stop() +* +* Function description +* Stop recording SystemView events. +* +* This function is triggered by the SystemView Application on disconnect. +* For single-shot or post-mortem mode recording, it can be called +* by the application. +* +* Additional information +* This function disables transmission of SystemView packets recorded +* by subsequent trace calls. If transmission is enabled when +* this function is called, a single SystemView Stop event is recorded +* to the trace, send, and then trace transmission is halted. +*/ +void SEGGER_SYSVIEW_Stop(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + if (_SYSVIEW_Globals.EnableState) { + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TRACE_STOP); + _SYSVIEW_Globals.EnableState = 0; + } + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_GetChannelID() +* +* Function description +* Returns the RTT / channel ID used by SystemView. +*/ +int SEGGER_SYSVIEW_GetChannelID(void) { + return CHANNEL_ID_UP; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_GetSysDesc() +* +* Function description +* Triggers a send of the system information and description. +* +*/ +void SEGGER_SYSVIEW_GetSysDesc(void) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, _SYSVIEW_Globals.SysFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.CPUFreq); + ENCODE_U32(pPayload, _SYSVIEW_Globals.RAMBaseAddress); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_ID_SHIFT); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_INIT); + RECORD_END(); + if (_SYSVIEW_Globals.pfSendSysDesc) { + _SYSVIEW_Globals.pfSendSysDesc(); + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendTaskInfo() +* +* Function description +* Send a Task Info Packet, containing TaskId for identification, +* task priority and task name. +* +* Parameters +* pInfo - Pointer to task information to send. +*/ +void SEGGER_SYSVIEW_SendTaskInfo(const SEGGER_SYSVIEW_TASKINFO *pInfo) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32 + 1 + 32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); + ENCODE_U32(pPayload, pInfo->Prio); + pPayload = _EncodeStr(pPayload, pInfo->sName, 32); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_INFO); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SHRINK_ID(pInfo->TaskID)); + ENCODE_U32(pPayload, pInfo->StackBase); + ENCODE_U32(pPayload, pInfo->StackSize); + ENCODE_U32(pPayload, 0); // Stack End, future use + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_STACK_INFO); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendTaskList() +* +* Function description +* Send all tasks descriptors to the host. +*/ +void SEGGER_SYSVIEW_SendTaskList(void) { + if (_SYSVIEW_Globals.pOSAPI && _SYSVIEW_Globals.pOSAPI->pfSendTaskList) { + _SYSVIEW_Globals.pOSAPI->pfSendTaskList(); + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendSysDesc() +* +* Function description +* Send the system description string to the host. +* The system description is used by the Systemview Application +* to identify the current application and handle events accordingly. +* +* The system description is usually called by the system description +* callback, to ensure it is only sent when the SystemView Application +* is connected. +* +* Parameters +* sSysDesc - Pointer to the 0-terminated system description string. +* +* Additional information +* One system description string may not exceed SEGGER_SYSVIEW_MAX_STRING_LEN characters. +* Multiple description strings can be recorded. +* +* The Following items can be described in a system description string. +* Each item is identified by its identifier, followed by '=' and the value. +* Items are separated by ','. +*/ +void SEGGER_SYSVIEW_SendSysDesc(const char *sSysDesc) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = _EncodeStr(pPayloadStart, sSysDesc, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_SYSDESC); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordSystime() +* +* Function description +* Formats and sends a SystemView Systime containing a single U64 or U32 +* parameter payload. +*/ +void SEGGER_SYSVIEW_RecordSystime(void) { + U64 Systime; + + if (_SYSVIEW_Globals.pOSAPI && _SYSVIEW_Globals.pOSAPI->pfGetTime) { + Systime = _SYSVIEW_Globals.pOSAPI->pfGetTime(); + SEGGER_SYSVIEW_RecordU32x2(SYSVIEW_EVTID_SYSTIME_US, + (U32)(Systime), + (U32)(Systime >> 32)); + } else { + SEGGER_SYSVIEW_RecordU32(SYSVIEW_EVTID_SYSTIME_CYCLES, SEGGER_SYSVIEW_GET_TIMESTAMP()); + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordEnterISR() +* +* Function description +* Format and send an ISR entry event. +* +* Additional information +* Example packets sent +* 02 0F 50 // ISR(15) Enter. Timestamp is 80 (0x50) +*/ +void SEGGER_SYSVIEW_RecordEnterISR(void) { + unsigned v; + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + v = SEGGER_SYSVIEW_GET_INTERRUPT_ID(); + ENCODE_U32(pPayload, v); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_ISR_ENTER); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordExitISR() +* +* Function description +* Format and send an ISR exit event. +* +* Additional information +* Format as follows: +* 03 // Max. packet len is 6 +* +* Example packets sent +* 03 20 // ISR Exit. Timestamp is 32 (0x20) +*/ +void SEGGER_SYSVIEW_RecordExitISR(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_ISR_EXIT); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordExitISRToScheduler() +* +* Function description +* Format and send an ISR exit into scheduler event. +* +* Additional information +* Format as follows: +* 18 // Max. packet len is 6 +* +* Example packets sent +* 18 20 // ISR Exit to Scheduler. Timestamp is 32 (0x20) +*/ +void SEGGER_SYSVIEW_RecordExitISRToScheduler(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_ISR_TO_SCHEDULER); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordEnterTimer() +* +* Function description +* Format and send a Timer entry event. +* +* Parameters +* TimerId - Id of the timer which starts. +*/ +void SEGGER_SYSVIEW_RecordEnterTimer(U32 TimerId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SHRINK_ID(TimerId)); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TIMER_ENTER); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordExitTimer() +* +* Function description +* Format and send a Timer exit event. +*/ +void SEGGER_SYSVIEW_RecordExitTimer(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TIMER_EXIT); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordEndCall() +* +* Function description +* Format and send an End API Call event without return value. +* +* Parameters +* EventID - Id of API function which ends. +*/ +void SEGGER_SYSVIEW_RecordEndCall(unsigned int EventID) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, EventID); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_END_CALL); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordEndCallU32() +* +* Function description +* Format and send an End API Call event with return value. +* +* Parameters +* EventID - Id of API function which ends. +* Para0 - Return value which will be returned by the API function. +*/ +void SEGGER_SYSVIEW_RecordEndCallU32(unsigned int EventID, U32 Para0) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, EventID); + ENCODE_U32(pPayload, Para0); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_END_CALL); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnIdle() +* +* Function description +* Record an Idle event. +*/ +void SEGGER_SYSVIEW_OnIdle(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_IDLE); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskCreate() +* +* Function description +* Record a Task Create event. The Task Create event corresponds +* to creating a task in the OS. +* +* Parameters +* TaskId - Task ID of created task. +*/ +void SEGGER_SYSVIEW_OnTaskCreate(U32 TaskId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + TaskId = SHRINK_ID(TaskId); + ENCODE_U32(pPayload, TaskId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_CREATE); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskTerminate() +* +* Function description +* Record a Task termination event. +* The Task termination event corresponds to terminating a task in +* the OS. If the TaskId is the currently active task, +* SEGGER_SYSVIEW_OnTaskStopExec may be used, either. +* +* Parameters +* TaskId - Task ID of terminated task. +*/ +void SEGGER_SYSVIEW_OnTaskTerminate(U32 TaskId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + TaskId = SHRINK_ID(TaskId); + ENCODE_U32(pPayload, TaskId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_TERMINATE); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskStartExec() +* +* Function description +* Record a Task Start Execution event. The Task Start event +* corresponds to when a task has started to execute rather than +* when it is ready to execute. +* +* Parameters +* TaskId - Task ID of task that started to execute. +*/ +void SEGGER_SYSVIEW_OnTaskStartExec(U32 TaskId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + TaskId = SHRINK_ID(TaskId); + ENCODE_U32(pPayload, TaskId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_START_EXEC); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskStopExec() +* +* Function description +* Record a Task Stop Execution event. The Task Stop event +* corresponds to when a task stops executing and terminates. +*/ +void SEGGER_SYSVIEW_OnTaskStopExec(void) { + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE); + // + _SendPacket(pPayloadStart, pPayloadStart, SYSVIEW_EVTID_TASK_STOP_EXEC); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskStartReady() +* +* Function description +* Record a Task Start Ready event. +* +* Parameters +* TaskId - Task ID of task that started to execute. +*/ +void SEGGER_SYSVIEW_OnTaskStartReady(U32 TaskId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + TaskId = SHRINK_ID(TaskId); + ENCODE_U32(pPayload, TaskId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_START_READY); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_OnTaskStopReady() +* +* Function description +* Record a Task Stop Ready event. +* +* Parameters +* TaskId - Task ID of task that completed execution. +* Cause - Reason for task to stop (i.e. Idle/Sleep) +*/ +void SEGGER_SYSVIEW_OnTaskStopReady(U32 TaskId, unsigned int Cause) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + TaskId = SHRINK_ID(TaskId); + ENCODE_U32(pPayload, TaskId); + ENCODE_U32(pPayload, Cause); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_TASK_STOP_READY); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_MarkStart() +* +* Function description +* Record a Performance Marker Start event to start measuring runtime. +* +* Parameters +* MarkerId - User defined ID for the marker. +*/ +void SEGGER_SYSVIEW_MarkStart(unsigned MarkerId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, MarkerId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MARK_START); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_MarkStop() +* +* Function description +* Record a Performance Marker Stop event to stop measuring runtime. +* +* Parameters +* MarkerId - User defined ID for the marker. +*/ +void SEGGER_SYSVIEW_MarkStop(unsigned MarkerId) { + U8 * pPayload; + U8 * pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, MarkerId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MARK_STOP); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_Mark() +* +* Function description +* Record a Performance Marker intermediate event. +* +* Parameters +* MarkerId - User defined ID for the marker. +*/ +void SEGGER_SYSVIEW_Mark(unsigned int MarkerId) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_MARK); + ENCODE_U32(pPayload, MarkerId); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_NameMarker() +* +* Function description +* Send the name of a Performance Marker to be displayed in SystemView. +* +* Marker names are usually set in the system description +* callback, to ensure it is only sent when the SystemView Application +* is connected. +* +* Parameters +* MarkerId - User defined ID for the marker. +* sName - Pointer to the marker name. (Max. SEGGER_SYSVIEW_MAX_STRING_LEN Bytes) +*/ +void SEGGER_SYSVIEW_NameMarker(unsigned int MarkerId, const char* sName) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SYSVIEW_EVTID_EX_NAME_MARKER); + ENCODE_U32(pPayload, MarkerId); + pPayload = _EncodeStr(pPayload, sName, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_EX); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_NameResource() +* +* Function description +* Send the name of a resource to be displayed in SystemView. +* +* Marker names are usually set in the system description +* callback, to ensure it is only sent when the SystemView Application +* is connected. +* +* Parameters +* ResourceId - Id of the resource to be named. i.e. its address. +* sName - Pointer to the resource name. (Max. SEGGER_SYSVIEW_MAX_STRING_LEN Bytes) +*/ +void SEGGER_SYSVIEW_NameResource(U32 ResourceId, const char* sName) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = pPayloadStart; + ENCODE_U32(pPayload, SHRINK_ID(ResourceId)); + pPayload = _EncodeStr(pPayload, sName, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_NAME_RESOURCE); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendPacket() +* +* Function description +* Send an event packet. +* +* Parameters +* pPacket - Pointer to the start of the packet. +* pPayloadEnd - Pointer to the end of the payload. +* Make sure there are at least 5 bytes free after the payload. +* EventId - Id of the event packet. +* +* Return value +* !=0: Success, Message sent. +* ==0: Buffer full, Message *NOT* sent. +*/ +int SEGGER_SYSVIEW_SendPacket(U8* pPacket, U8* pPayloadEnd, unsigned int EventId) { +#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) + SEGGER_SYSVIEW_LOCK(); +#endif + _SendPacket(pPacket + 4, pPayloadEnd, EventId); +#if (SEGGER_SYSVIEW_USE_STATIC_BUFFER == 1) + SEGGER_SYSVIEW_UNLOCK(); +#endif + return 0; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_EncodeU32() +* +* Function description +* Encode a U32 in variable-length format. +* +* Parameters +* pPayload - Pointer to where U32 will be encoded. +* Value - The 32-bit value to be encoded. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +*/ +U8* SEGGER_SYSVIEW_EncodeU32(U8* pPayload, U32 Value) { + ENCODE_U32(pPayload, Value); + return pPayload; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_EncodeString() +* +* Function description +* Encode a string in variable-length format. +* +* Parameters +* pPayload - Pointer to where string will be encoded. +* s - String to encode. +* MaxLen - Maximum number of characters to encode from string. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +* +* Additional information +* The string is encoded as a count byte followed by the contents +* of the string. +* No more than 1 + MaxLen bytes will be encoded to the payload. +*/ +U8* SEGGER_SYSVIEW_EncodeString(U8* pPayload, const char* s, unsigned int MaxLen) { + return _EncodeStr(pPayload, s, MaxLen); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_EncodeData() +* +* Function description +* Encode a byte buffer in variable-length format. +* +* Parameters +* pPayload - Pointer to where string will be encoded. +* pSrc - Pointer to data buffer to be encoded. +* NumBytes - Number of bytes in the buffer to be encoded. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +* +* Additional information +* The data is encoded as a count byte followed by the contents +* of the data buffer. +* Make sure NumBytes + 1 bytes are free for the payload. +*/ +U8* SEGGER_SYSVIEW_EncodeData(U8 *pPayload, const char* pSrc, unsigned int NumBytes) { + return _EncodeData(pPayload, pSrc, NumBytes); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_EncodeId() +* +* Function description +* Encode a 32-bit Id in shrunken variable-length format. +* +* Parameters +* pPayload - Pointer to where the Id will be encoded. +* Id - The 32-bit value to be encoded. +* +* Return value +* Pointer to the byte following the value, i.e. the first free +* byte in the payload and the next position to store payload +* content. +* +* Additional information +* The parameters to shrink an Id can be configured in +* SEGGER_SYSVIEW_Conf.h and via SEGGER_SYSVIEW_SetRAMBase(). +* SEGGER_SYSVIEW_ID_BASE: Lowest Id reported by the application. +* (i.e. 0x20000000 when all Ids are an address in this RAM) +* SEGGER_SYSVIEW_ID_SHIFT: Number of bits to shift the Id to +* save bandwidth. (i.e. 2 when Ids are 4 byte aligned) +*/ +U8* SEGGER_SYSVIEW_EncodeId(U8* pPayload, U32 Id) { + Id = SHRINK_ID(Id); + ENCODE_U32(pPayload, Id); + return pPayload; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_ShrinkId() +* +* Function description +* Get the shrunken value of an Id for further processing like in +* SEGGER_SYSVIEW_NameResource(). +* +* Parameters +* Id - The 32-bit value to be shrunken. +* +* Return value +* Shrunken Id. +* +* Additional information +* The parameters to shrink an Id can be configured in +* SEGGER_SYSVIEW_Conf.h and via SEGGER_SYSVIEW_SetRAMBase(). +* SEGGER_SYSVIEW_ID_BASE: Lowest Id reported by the application. +* (i.e. 0x20000000 when all Ids are an address in this RAM) +* SEGGER_SYSVIEW_ID_SHIFT: Number of bits to shift the Id to +* save bandwidth. (i.e. 2 when Ids are 4 byte aligned) +*/ +U32 SEGGER_SYSVIEW_ShrinkId(U32 Id) { + return SHRINK_ID(Id); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RegisterModule() +* +* Function description +* Register a middleware module for recording its events. +* +* Parameters +* pModule - The middleware module information. +* +* Additional information +* SEGGER_SYSVIEW_MODULE elements: +* sDescription - Pointer to a string containing the module name and optionally the module event description. +* NumEvents - Number of events the module wants to register. +* EventOffset - Offset to be added to the event Ids. Out parameter, set by this function. Do not modify after calling this function. +* pfSendModuleDesc - Callback function pointer to send more detailed module description to SystemView Application. +* pNext - Pointer to next registered module. Out parameter, set by this function. Do not modify after calling this function. +*/ +void SEGGER_SYSVIEW_RegisterModule(SEGGER_SYSVIEW_MODULE* pModule) { + SEGGER_SYSVIEW_LOCK(); + if (_pFirstModule == 0) { + // + // No module registered, yet. + // Start list with new module. + // EventOffset is the base offset for modules + // + pModule->EventOffset = MODULE_EVENT_OFFSET; + pModule->pNext = 0; + _pFirstModule = pModule; + _NumModules = 1; + } else { + // + // Registreded module(s) present. + // Prepend new module in list. + // EventOffset set from number of events and offset of previous module. + // + pModule->EventOffset = _pFirstModule->EventOffset + _pFirstModule->NumEvents; + pModule->pNext = _pFirstModule; + _pFirstModule = pModule; + _NumModules++; + } + SEGGER_SYSVIEW_SendModule(0); + if (pModule->pfSendModuleDesc) { + pModule->pfSendModuleDesc(); + } + SEGGER_SYSVIEW_UNLOCK(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_RecordModuleDescription() +* +* Function description +* Sends detailed information of a registered module to the host. +* +* Parameters +* pModule - Pointer to the described module. +* sDescription - Pointer to a description string. +*/ +void SEGGER_SYSVIEW_RecordModuleDescription(const SEGGER_SYSVIEW_MODULE* pModule, const char* sDescription) { + U8 ModuleId; + SEGGER_SYSVIEW_MODULE* p; + + p = _pFirstModule; + ModuleId = 0; + do { + if (p == pModule) { + break; + } + ModuleId++; + p = p->pNext; + } while (p); + { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = pPayloadStart; + // + // Send module description + // Send event offset and number of events + // + ENCODE_U32(pPayload, ModuleId); + ENCODE_U32(pPayload, (pModule->EventOffset)); + pPayload = _EncodeStr(pPayload, sDescription, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MODULEDESC); + RECORD_END(); + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendModule() +* +* Function description +* Sends the information of a registered module to the host. +* +* Parameters +* ModuleId - Id of the requested module. +*/ +void SEGGER_SYSVIEW_SendModule(U8 ModuleId) { + SEGGER_SYSVIEW_MODULE* pModule; + U32 n; + + if (_pFirstModule != 0) { + pModule = _pFirstModule; + for (n = 0; n < ModuleId; n++) { + pModule = pModule->pNext; + if (pModule == 0) { + break; + } + } + if (pModule != 0) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + 1 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = pPayloadStart; + // + // Send module description + // Send event offset and number of events + // + ENCODE_U32(pPayload, ModuleId); + ENCODE_U32(pPayload, (pModule->EventOffset)); + pPayload = _EncodeStr(pPayload, pModule->sModule, SEGGER_SYSVIEW_MAX_STRING_LEN); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_MODULEDESC); + RECORD_END(); + } + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendModuleDescription() +* +* Function description +* Triggers a send of the registered module descriptions. +* +*/ +void SEGGER_SYSVIEW_SendModuleDescription(void) { + SEGGER_SYSVIEW_MODULE* pModule; + + if (_pFirstModule != 0) { + pModule = _pFirstModule; + do { + if (pModule->pfSendModuleDesc) { + pModule->pfSendModuleDesc(); + } + pModule = pModule->pNext; + } while (pModule); + } +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_SendNumModules() +* +* Function description +* Send the number of registered modules to the host. +*/ +void SEGGER_SYSVIEW_SendNumModules(void) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2*SEGGER_SYSVIEW_QUANTA_U32); + pPayload = pPayloadStart; + ENCODE_U32(pPayload, _NumModules); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_NUMMODULES); + RECORD_END(); +} + +#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list + +/********************************************************************* +* +* SEGGER_SYSVIEW_PrintfHostEx() +* +* Function description +* Print a string which is formatted on the host by the SystemView Application +* with Additional information. +* +* Parameters +* s - String to be formatted. +* Options - Options for the string. i.e. Log level. +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_PrintfHostEx(const char* s, U32 Options, ...) { + va_list ParamList; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + + va_start(ParamList, Options); + r = _VPrintHost(s, Options, &ParamList); + va_end(ParamList); + + if (r == -1) { + va_start(ParamList, Options); + _VPrintTarget(s, Options, &ParamList); + va_end(ParamList); + } +#else + va_start(ParamList, Options); + _VPrintHost(s, Options, &ParamList); + va_end(ParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_PrintfHost() +* +* Function description +* Print a string which is formatted on the host by the SystemView Application. +* +* Parameters +* s - String to be formatted. +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_PrintfHost(const char* s, ...) { + va_list ParamList; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + + va_start(ParamList, s); + r = _VPrintHost(s, SEGGER_SYSVIEW_LOG, &ParamList); + va_end(ParamList); + + if (r == -1) { + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_LOG, &ParamList); + va_end(ParamList); + } +#else + va_start(ParamList, s); + _VPrintHost(s, SEGGER_SYSVIEW_LOG, &ParamList); + va_end(ParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_WarnfHost() +* +* Function description +* Print a warnin string which is formatted on the host by +* the SystemView Application. +* +* Parameters +* s - String to be formatted. +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_WarnfHost(const char* s, ...) { + va_list ParamList; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + + va_start(ParamList, s); + r = _VPrintHost(s, SEGGER_SYSVIEW_WARNING, &ParamList); + va_end(ParamList); + + if (r == -1) { + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, &ParamList); + va_end(ParamList); + } +#else + va_start(ParamList, s); + _VPrintHost(s, SEGGER_SYSVIEW_WARNING, &ParamList); + va_end(ParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_ErrorfHost() +* +* Function description +* Print an error string which is formatted on the host by +* the SystemView Application. +* +* Parameters +* s - String to be formatted. +* +* Additional information +* All format arguments are treated as 32-bit scalar values. +*/ +void SEGGER_SYSVIEW_ErrorfHost(const char* s, ...) { + va_list ParamList; +#if SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + int r; + + va_start(ParamList, s); + r = _VPrintHost(s, SEGGER_SYSVIEW_ERROR, &ParamList); + va_end(ParamList); + + if (r == -1) { + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamList); + va_end(ParamList); + } +#else + va_start(ParamList, s); + _VPrintHost(s, SEGGER_SYSVIEW_ERROR, &ParamList); + va_end(ParamList); +#endif +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_PrintfTargetEx() +* +* Function description +* Print a string which is formatted on the target before sent to +* the host with Additional information. +* +* Parameters +* s - String to be formatted. +* Options - Options for the string. i.e. Log level. +*/ +void SEGGER_SYSVIEW_PrintfTargetEx(const char* s, U32 Options, ...) { + va_list ParamList; + + va_start(ParamList, Options); + _VPrintTarget(s, Options, &ParamList); + va_end(ParamList); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_PrintfTarget() +* +* Function description +* Print a string which is formatted on the target before sent to +* the host. +* +* Parameters +* s - String to be formatted. +*/ +void SEGGER_SYSVIEW_PrintfTarget(const char* s, ...) { + va_list ParamList; + + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_LOG, &ParamList); + va_end(ParamList); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_WarnfTarget() +* +* Function description +* Print a warning string which is formatted on the target before +* sent to the host. +* +* Parameters +* s - String to be formatted. +*/ +void SEGGER_SYSVIEW_WarnfTarget(const char* s, ...) { + va_list ParamList; + + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_WARNING, &ParamList); + va_end(ParamList); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_ErrorfTarget() +* +* Function description +* Print an error string which is formatted on the target before +* sent to the host. +* +* Parameters +* s - String to be formatted. +*/ +void SEGGER_SYSVIEW_ErrorfTarget(const char* s, ...) { + va_list ParamList; + + va_start(ParamList, s); + _VPrintTarget(s, SEGGER_SYSVIEW_ERROR, &ParamList); + va_end(ParamList); +} +#endif // SEGGER_SYSVIEW_EXCLUDE_PRINTF + +/********************************************************************* +* +* SEGGER_SYSVIEW_Print() +* +* Function description +* Print a string to the host. +* +* Parameters +* s - String to sent. +*/ +void SEGGER_SYSVIEW_Print(const char* s) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_LOG); + ENCODE_U32(pPayload, 0); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_Warn() +* +* Function description +* Print a warning string to the host. +* +* Parameters +* s - String to sent. +*/ +void SEGGER_SYSVIEW_Warn(const char* s) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_WARNING); + ENCODE_U32(pPayload, 0); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_Error() +* +* Function description +* Print an error string to the host. +* +* Parameters +* s - String to sent. +*/ +void SEGGER_SYSVIEW_Error(const char* s) { + U8* pPayload; + U8* pPayloadStart; + RECORD_START(SEGGER_SYSVIEW_INFO_SIZE + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN); + // + pPayload = _EncodeStr(pPayloadStart, s, SEGGER_SYSVIEW_MAX_STRING_LEN); + ENCODE_U32(pPayload, SEGGER_SYSVIEW_ERROR); + ENCODE_U32(pPayload, 0); + _SendPacket(pPayloadStart, pPayload, SYSVIEW_EVTID_PRINT_FORMATTED); + RECORD_END(); +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_EnableEvents() +* +* Function description +* Enable standard SystemView events to be generated. +* +* Parameters +* EnableMask - Events to be enabled. +*/ +void SEGGER_SYSVIEW_EnableEvents(U32 EnableMask) { + _SYSVIEW_Globals.DisabledEvents &= ~EnableMask; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_DisableEvents() +* +* Function description +* Disable standard SystemView events to not be generated. +* +* Parameters +* DisableMask - Events to be disabled. +*/ +void SEGGER_SYSVIEW_DisableEvents(U32 DisableMask) { + _SYSVIEW_Globals.DisabledEvents |= DisableMask; +} + +/********************************************************************* +* +* SEGGER_SYSVIEW_IsStarted() +* +* Function description +* Handle incoming packets if any and check if recording is started. +* +* Return value +* 0: Recording not started. +* > 0: Recording started. +*/ +int SEGGER_SYSVIEW_IsStarted(void) { +#if (SEGGER_SYSVIEW_POST_MORTEM_MODE != 1) + // + // Check if host is sending data which needs to be processed. + // + if (SEGGER_RTT_HASDATA(CHANNEL_ID_DOWN)) { + if (_SYSVIEW_Globals.RecursionCnt == 0) { // Avoid uncontrolled nesting. This way, this routine can call itself once, but no more often than that. + _SYSVIEW_Globals.RecursionCnt = 1; + _HandleIncomingPacket(); + _SYSVIEW_Globals.RecursionCnt = 0; + } + } +#endif + return _SYSVIEW_Globals.EnableState; +} + + +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER_SYSVIEW.h a/RTT/SEGGER_SYSVIEW.h new file mode 100644 index 0000000..fad2bca --- /dev/null +++ a/RTT/SEGGER_SYSVIEW.h @@ -0,0 +1,370 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.30 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- +File : SEGGER_SYSVIEW.h +Purpose : System visualization API. +Revision: $Rev: 21292 $ +*/ + +#ifndef SEGGER_SYSVIEW_H +#define SEGGER_SYSVIEW_H + +/********************************************************************* +* +* #include Section +* +********************************************************************** +*/ + +#include "SEGGER.h" +#include "SEGGER_SYSVIEW_ConfDefaults.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ + +#define SEGGER_SYSVIEW_MAJOR 3 +#define SEGGER_SYSVIEW_MINOR 10 +#define SEGGER_SYSVIEW_REV 0 +#define SEGGER_SYSVIEW_VERSION ((SEGGER_SYSVIEW_MAJOR * 10000) + (SEGGER_SYSVIEW_MINOR * 100) + SEGGER_SYSVIEW_REV) + +#define SEGGER_SYSVIEW_INFO_SIZE 9 // Minimum size, which has to be reserved for a packet. 1-2 byte of message type, 0-2 byte of payload length, 1-5 bytes of timestamp. +#define SEGGER_SYSVIEW_QUANTA_U32 5 // Maximum number of bytes to encode a U32, should be reserved for each 32-bit value in a packet. + +#define SEGGER_SYSVIEW_LOG (0u) +#define SEGGER_SYSVIEW_WARNING (1u) +#define SEGGER_SYSVIEW_ERROR (2u) +#define SEGGER_SYSVIEW_FLAG_APPEND (1u << 6) + +#define SEGGER_SYSVIEW_PREPARE_PACKET(p) (p) + 4 +// +// SystemView events. First 32 IDs from 0 .. 31 are reserved for these +// +#define SYSVIEW_EVTID_NOP 0 // Dummy packet. +#define SYSVIEW_EVTID_OVERFLOW 1 +#define SYSVIEW_EVTID_ISR_ENTER 2 +#define SYSVIEW_EVTID_ISR_EXIT 3 +#define SYSVIEW_EVTID_TASK_START_EXEC 4 +#define SYSVIEW_EVTID_TASK_STOP_EXEC 5 +#define SYSVIEW_EVTID_TASK_START_READY 6 +#define SYSVIEW_EVTID_TASK_STOP_READY 7 +#define SYSVIEW_EVTID_TASK_CREATE 8 +#define SYSVIEW_EVTID_TASK_INFO 9 +#define SYSVIEW_EVTID_TRACE_START 10 +#define SYSVIEW_EVTID_TRACE_STOP 11 +#define SYSVIEW_EVTID_SYSTIME_CYCLES 12 +#define SYSVIEW_EVTID_SYSTIME_US 13 +#define SYSVIEW_EVTID_SYSDESC 14 +#define SYSVIEW_EVTID_MARK_START 15 +#define SYSVIEW_EVTID_MARK_STOP 16 +#define SYSVIEW_EVTID_IDLE 17 +#define SYSVIEW_EVTID_ISR_TO_SCHEDULER 18 +#define SYSVIEW_EVTID_TIMER_ENTER 19 +#define SYSVIEW_EVTID_TIMER_EXIT 20 +#define SYSVIEW_EVTID_STACK_INFO 21 +#define SYSVIEW_EVTID_MODULEDESC 22 + +#define SYSVIEW_EVTID_INIT 24 +#define SYSVIEW_EVTID_NAME_RESOURCE 25 +#define SYSVIEW_EVTID_PRINT_FORMATTED 26 +#define SYSVIEW_EVTID_NUMMODULES 27 +#define SYSVIEW_EVTID_END_CALL 28 +#define SYSVIEW_EVTID_TASK_TERMINATE 29 + +#define SYSVIEW_EVTID_EX 31 +// +// SystemView extended events. Sent with ID 31. +// +#define SYSVIEW_EVTID_EX_MARK 0 +#define SYSVIEW_EVTID_EX_NAME_MARKER 1 +// +// Event masks to disable/enable events +// +#define SYSVIEW_EVTMASK_NOP (1 << SYSVIEW_EVTID_NOP) +#define SYSVIEW_EVTMASK_OVERFLOW (1 << SYSVIEW_EVTID_OVERFLOW) +#define SYSVIEW_EVTMASK_ISR_ENTER (1 << SYSVIEW_EVTID_ISR_ENTER) +#define SYSVIEW_EVTMASK_ISR_EXIT (1 << SYSVIEW_EVTID_ISR_EXIT) +#define SYSVIEW_EVTMASK_TASK_START_EXEC (1 << SYSVIEW_EVTID_TASK_START_EXEC) +#define SYSVIEW_EVTMASK_TASK_STOP_EXEC (1 << SYSVIEW_EVTID_TASK_STOP_EXEC) +#define SYSVIEW_EVTMASK_TASK_START_READY (1 << SYSVIEW_EVTID_TASK_START_READY) +#define SYSVIEW_EVTMASK_TASK_STOP_READY (1 << SYSVIEW_EVTID_TASK_STOP_READY) +#define SYSVIEW_EVTMASK_TASK_CREATE (1 << SYSVIEW_EVTID_TASK_CREATE) +#define SYSVIEW_EVTMASK_TASK_INFO (1 << SYSVIEW_EVTID_TASK_INFO) +#define SYSVIEW_EVTMASK_TRACE_START (1 << SYSVIEW_EVTID_TRACE_START) +#define SYSVIEW_EVTMASK_TRACE_STOP (1 << SYSVIEW_EVTID_TRACE_STOP) +#define SYSVIEW_EVTMASK_SYSTIME_CYCLES (1 << SYSVIEW_EVTID_SYSTIME_CYCLES) +#define SYSVIEW_EVTMASK_SYSTIME_US (1 << SYSVIEW_EVTID_SYSTIME_US) +#define SYSVIEW_EVTMASK_SYSDESC (1 << SYSVIEW_EVTID_SYSDESC) +#define SYSVIEW_EVTMASK_USER_START (1 << SYSVIEW_EVTID_USER_START) +#define SYSVIEW_EVTMASK_USER_STOP (1 << SYSVIEW_EVTID_USER_STOP) +#define SYSVIEW_EVTMASK_IDLE (1 << SYSVIEW_EVTID_IDLE) +#define SYSVIEW_EVTMASK_ISR_TO_SCHEDULER (1 << SYSVIEW_EVTID_ISR_TO_SCHEDULER) +#define SYSVIEW_EVTMASK_TIMER_ENTER (1 << SYSVIEW_EVTID_TIMER_ENTER) +#define SYSVIEW_EVTMASK_TIMER_EXIT (1 << SYSVIEW_EVTID_TIMER_EXIT) +#define SYSVIEW_EVTMASK_STACK_INFO (1 << SYSVIEW_EVTID_STACK_INFO) +#define SYSVIEW_EVTMASK_MODULEDESC (1 << SYSVIEW_EVTID_MODULEDESC) + +#define SYSVIEW_EVTMASK_INIT (1 << SYSVIEW_EVTID_INIT) +#define SYSVIEW_EVTMASK_NAME_RESOURCE (1 << SYSVIEW_EVTID_NAME_RESOURCE) +#define SYSVIEW_EVTMASK_PRINT_FORMATTED (1 << SYSVIEW_EVTID_PRINT_FORMATTED) +#define SYSVIEW_EVTMASK_NUMMODULES (1 << SYSVIEW_EVTID_NUMMODULES) +#define SYSVIEW_EVTMASK_END_CALL (1 << SYSVIEW_EVTID_END_CALL) +#define SYSVIEW_EVTMASK_TASK_TERMINATE (1 << SYSVIEW_EVTID_TASK_TERMINATE) + +#define SYSVIEW_EVTMASK_EX (1 << SYSVIEW_EVTID_EX) + +#define SYSVIEW_EVTMASK_ALL_INTERRUPTS ( SYSVIEW_EVTMASK_ISR_ENTER \ + | SYSVIEW_EVTMASK_ISR_EXIT \ + | SYSVIEW_EVTMASK_ISR_TO_SCHEDULER) +#define SYSVIEW_EVTMASK_ALL_TASKS ( SYSVIEW_EVTMASK_TASK_START_EXEC \ + | SYSVIEW_EVTMASK_TASK_STOP_EXEC \ + | SYSVIEW_EVTMASK_TASK_START_READY \ + | SYSVIEW_EVTMASK_TASK_STOP_READY \ + | SYSVIEW_EVTMASK_TASK_CREATE \ + | SYSVIEW_EVTMASK_TASK_INFO \ + | SYSVIEW_EVTMASK_STACK_INFO \ + | SYSVIEW_EVTMASK_TASK_TERMINATE) + +/********************************************************************* +* +* Structures +* +********************************************************************** +*/ + +typedef struct { + U32 TaskID; + const char* sName; + U32 Prio; + U32 StackBase; + U32 StackSize; +} SEGGER_SYSVIEW_TASKINFO; + +typedef struct SEGGER_SYSVIEW_MODULE_STRUCT SEGGER_SYSVIEW_MODULE; + +struct SEGGER_SYSVIEW_MODULE_STRUCT { + const char* sModule; + U32 NumEvents; + U32 EventOffset; + void (*pfSendModuleDesc)(void); + SEGGER_SYSVIEW_MODULE* pNext; +}; + +typedef void (SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC)(void); + + +/********************************************************************* +* +* Global data +* +********************************************************************** +*/ + +#ifdef EXTERN + #undef EXTERN +#endif + +#ifndef SEGGER_SYSVIEW_C // Defined in SEGGER_SYSVIEW.c which includes this header beside other C-files + #define EXTERN extern +#else + #define EXTERN +#endif + +EXTERN unsigned int SEGGER_SYSVIEW_TickCnt; +EXTERN unsigned int SEGGER_SYSVIEW_InterruptId; + +#undef EXTERN + +/********************************************************************* +* +* API functions +* +********************************************************************** +*/ + +typedef struct { + U64 (*pfGetTime) (void); + void (*pfSendTaskList) (void); +} SEGGER_SYSVIEW_OS_API; + +/********************************************************************* +* +* Control and initialization functions +*/ +void SEGGER_SYSVIEW_Init (U32 SysFreq, U32 CPUFreq, const SEGGER_SYSVIEW_OS_API *pOSAPI, SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC pfSendSysDesc); +void SEGGER_SYSVIEW_SetRAMBase (U32 RAMBaseAddress); +void SEGGER_SYSVIEW_Start (void); +void SEGGER_SYSVIEW_Stop (void); +void SEGGER_SYSVIEW_GetSysDesc (void); +void SEGGER_SYSVIEW_SendTaskList (void); +void SEGGER_SYSVIEW_SendTaskInfo (const SEGGER_SYSVIEW_TASKINFO* pInfo); +void SEGGER_SYSVIEW_SendSysDesc (const char* sSysDesc); +int SEGGER_SYSVIEW_IsStarted (void); +int SEGGER_SYSVIEW_GetChannelID (void); + +/********************************************************************* +* +* Event recording functions +*/ +void SEGGER_SYSVIEW_RecordVoid (unsigned int EventId); +void SEGGER_SYSVIEW_RecordU32 (unsigned int EventId, U32 Para0); +void SEGGER_SYSVIEW_RecordU32x2 (unsigned int EventId, U32 Para0, U32 Para1); +void SEGGER_SYSVIEW_RecordU32x3 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2); +void SEGGER_SYSVIEW_RecordU32x4 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3); +void SEGGER_SYSVIEW_RecordU32x5 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4); +void SEGGER_SYSVIEW_RecordU32x6 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5); +void SEGGER_SYSVIEW_RecordU32x7 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6); +void SEGGER_SYSVIEW_RecordU32x8 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7); +void SEGGER_SYSVIEW_RecordU32x9 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8); +void SEGGER_SYSVIEW_RecordU32x10 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8, U32 Para9); +void SEGGER_SYSVIEW_RecordString (unsigned int EventId, const char* pString); +void SEGGER_SYSVIEW_RecordSystime (void); +void SEGGER_SYSVIEW_RecordEnterISR (void); +void SEGGER_SYSVIEW_RecordExitISR (void); +void SEGGER_SYSVIEW_RecordExitISRToScheduler (void); +void SEGGER_SYSVIEW_RecordEnterTimer (U32 TimerId); +void SEGGER_SYSVIEW_RecordExitTimer (void); +void SEGGER_SYSVIEW_RecordEndCall (unsigned int EventID); +void SEGGER_SYSVIEW_RecordEndCallU32 (unsigned int EventID, U32 Para0); + +void SEGGER_SYSVIEW_OnIdle (void); +void SEGGER_SYSVIEW_OnTaskCreate (U32 TaskId); +void SEGGER_SYSVIEW_OnTaskTerminate (U32 TaskId); +void SEGGER_SYSVIEW_OnTaskStartExec (U32 TaskId); +void SEGGER_SYSVIEW_OnTaskStopExec (void); +void SEGGER_SYSVIEW_OnTaskStartReady (U32 TaskId); +void SEGGER_SYSVIEW_OnTaskStopReady (U32 TaskId, unsigned int Cause); +void SEGGER_SYSVIEW_MarkStart (unsigned int MarkerId); +void SEGGER_SYSVIEW_MarkStop (unsigned int MarkerId); +void SEGGER_SYSVIEW_Mark (unsigned int MarkerId); +void SEGGER_SYSVIEW_NameMarker (unsigned int MarkerId, const char* sName); + +void SEGGER_SYSVIEW_NameResource (U32 ResourceId, const char* sName); + +int SEGGER_SYSVIEW_SendPacket (U8* pPacket, U8* pPayloadEnd, unsigned int EventId); + +/********************************************************************* +* +* Event parameter encoding functions +*/ +U8* SEGGER_SYSVIEW_EncodeU32 (U8* pPayload, U32 Value); +U8* SEGGER_SYSVIEW_EncodeData (U8* pPayload, const char* pSrc, unsigned int Len); +U8* SEGGER_SYSVIEW_EncodeString (U8* pPayload, const char* s, unsigned int MaxLen); +U8* SEGGER_SYSVIEW_EncodeId (U8* pPayload, U32 Id); +U32 SEGGER_SYSVIEW_ShrinkId (U32 Id); + + +/********************************************************************* +* +* Middleware module registration +*/ +void SEGGER_SYSVIEW_RegisterModule (SEGGER_SYSVIEW_MODULE* pModule); +void SEGGER_SYSVIEW_RecordModuleDescription (const SEGGER_SYSVIEW_MODULE* pModule, const char* sDescription); +void SEGGER_SYSVIEW_SendModule (U8 ModuleId); +void SEGGER_SYSVIEW_SendModuleDescription (void); +void SEGGER_SYSVIEW_SendNumModules (void); + +/********************************************************************* +* +* printf-Style functions +*/ +#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list +void SEGGER_SYSVIEW_PrintfHostEx (const char* s, U32 Options, ...); +void SEGGER_SYSVIEW_PrintfTargetEx (const char* s, U32 Options, ...); +void SEGGER_SYSVIEW_PrintfHost (const char* s, ...); +void SEGGER_SYSVIEW_PrintfTarget (const char* s, ...); +void SEGGER_SYSVIEW_WarnfHost (const char* s, ...); +void SEGGER_SYSVIEW_WarnfTarget (const char* s, ...); +void SEGGER_SYSVIEW_ErrorfHost (const char* s, ...); +void SEGGER_SYSVIEW_ErrorfTarget (const char* s, ...); +#endif + +void SEGGER_SYSVIEW_Print (const char* s); +void SEGGER_SYSVIEW_Warn (const char* s); +void SEGGER_SYSVIEW_Error (const char* s); + +/********************************************************************* +* +* Run-time configuration functions +*/ +void SEGGER_SYSVIEW_EnableEvents (U32 EnableMask); +void SEGGER_SYSVIEW_DisableEvents (U32 DisableMask); + +/********************************************************************* +* +* Application-provided functions +*/ +void SEGGER_SYSVIEW_Conf (void); +U32 SEGGER_SYSVIEW_X_GetTimestamp (void); +U32 SEGGER_SYSVIEW_X_GetInterruptId (void); + +void SEGGER_SYSVIEW_X_StartComm (void); +void SEGGER_SYSVIEW_X_OnEventRecorded (unsigned NumBytes); + +#ifdef __cplusplus +} +#endif + +/********************************************************************* +* +* Compatibility API defines +*/ +#define SEGGER_SYSVIEW_OnUserStart SEGGER_SYSVIEW_MarkStart +#define SEGGER_SYSVIEW_OnUserStop SEGGER_SYSVIEW_MarkStop + +#endif + +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER_SYSVIEW_Conf.h a/RTT/SEGGER_SYSVIEW_Conf.h new file mode 100644 index 0000000..5b28023 --- /dev/null +++ a/RTT/SEGGER_SYSVIEW_Conf.h @@ -0,0 +1,85 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.30 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- + +File : SEGGER_SYSVIEW_Conf.h +Purpose : SEGGER SystemView configuration file. + Set defines which deviate from the defaults (see SEGGER_SYSVIEW_ConfDefaults.h) here. +Revision: $Rev: 21292 $ + +Additional information: + Required defines which must be set are: + SEGGER_SYSVIEW_GET_TIMESTAMP + SEGGER_SYSVIEW_GET_INTERRUPT_ID + For known compilers and cores, these might be set to good defaults + in SEGGER_SYSVIEW_ConfDefaults.h. + + SystemView needs a (nestable) locking mechanism. + If not defined, the RTT locking mechanism is used, + which then needs to be properly configured. +*/ + +#ifndef SEGGER_SYSVIEW_CONF_H +#define SEGGER_SYSVIEW_CONF_H + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ + +/********************************************************************* +* TODO: Add your defines here. * +********************************************************************** +*/ + + +#endif // SEGGER_SYSVIEW_CONF_H + +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER_SYSVIEW_ConfDefaults.h a/RTT/SEGGER_SYSVIEW_ConfDefaults.h new file mode 100644 index 0000000..74019b5 --- /dev/null +++ a/RTT/SEGGER_SYSVIEW_ConfDefaults.h @@ -0,0 +1,553 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.30 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- +File : SEGGER_SYSVIEW_ConfDefaults.h +Purpose : Defines defaults for configurable defines used in + SEGGER SystemView. +Revision: $Rev: 21319 $ +*/ + +#ifndef SEGGER_SYSVIEW_CONFDEFAULTS_H +#define SEGGER_SYSVIEW_CONFDEFAULTS_H + +/********************************************************************* +* +* #include Section +* +********************************************************************** +*/ + +#include "SEGGER_SYSVIEW_Conf.h" +#include "SEGGER_RTT_Conf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ +// +// Use auto-detection for SEGGER_SYSVIEW_CORE define +// based on compiler-/toolchain-specific defines +// to define SEGGER_SYSVIEW_GET_INTERRUPT_ID and SEGGER_SYSVIEW_GET_TIMESTAMP +// +#define SEGGER_SYSVIEW_CORE_OTHER 0 +#define SEGGER_SYSVIEW_CORE_CM0 1 // Cortex-M0/M0+/M1 +#define SEGGER_SYSVIEW_CORE_CM3 2 // Cortex-M3/M4/M7 +#define SEGGER_SYSVIEW_CORE_RX 3 // Renesas RX +#ifndef SEGGER_SYSVIEW_CORE + #if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __SEGGER_CC__) || (defined __GNUC__) || (defined __clang__) + #if (defined __ARM_ARCH_6M__) || (defined __ARM_ARCH_8M_BASE__) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif + #elif defined(__ICCARM__) + #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) \ + || (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) \ + || (defined (__ARM7M__) && (__CORE__ == __ARM7M__)) \ + || (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) \ + || (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif + #elif defined(__CC_ARM) + #if (defined(__TARGET_ARCH_6S_M)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif + #elif defined(__TI_ARM__) + #ifdef __TI_ARM_V6M0__ + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 + #elif (defined(__TI_ARM_V7M3__) || defined(__TI_ARM_V7M4__)) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 + #endif + #elif defined(__ICCRX__) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX + #elif defined(__RX) + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX + #endif + + #ifndef SEGGER_SYSVIEW_CORE + #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_OTHER + #endif +#endif + + +/********************************************************************* +* +* Defines, defaults +* +********************************************************************** +*/ +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_APP_NAME +* +* Description +* The application name to be displayed in SystemView. +* Default +* "SystemView-enabled Application" +* Notes +* Convenience define to be used for SEGGER_SYSVIEW_SendSysDesc(). +*/ +#ifndef SEGGER_SYSVIEW_APP_NAME + #define SEGGER_SYSVIEW_APP_NAME "SystemView-enabled Application" +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_DEVICE_NAME +* +* Description +* The target device name to be displayed in SystemView. +* Default +* "undefined device" +* Notes +* Convenience define to be used for SEGGER_SYSVIEW_SendSysDesc(). +*/ +#ifndef SEGGER_SYSVIEW_DEVICE_NAME + #define SEGGER_SYSVIEW_DEVICE_NAME "undefined device" +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_GET_INTERRUPT_ID() +* +* Description +* Function macro to retrieve the Id of the currently active +* interrupt. +* Default +* Call user-supplied function SEGGER_SYSVIEW_X_GetInterruptId(). +* Notes +* For some known compilers and cores, a ready-to-use, core-specific +* default is set. +* ARMv7M: Read ICSR[8:0] (active vector) +* ARMv6M: Read ICSR[5:0] (active vector) +*/ +#ifndef SEGGER_SYSVIEW_GET_INTERRUPT_ID + #if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3 + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x1FF) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[8:0] = active vector) + #elif SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM0 + #if defined(__ICCARM__) + #if (__VER__ > 6010000) + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() (__get_IPSR()) // Workaround for IAR, which might do a byte-access to 0xE000ED04. Read IPSR instead. + #else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F) // Older versions of IAR do not include __get_IPSR, but might also not optimize to byte-access. + #endif + #else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32*)(0xE000ED04)) & 0x3F) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[5:0] = active vector) + #endif + #else + #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() SEGGER_SYSVIEW_X_GetInterruptId() // Get the currently active interrupt Id from the user-provided function. + #endif +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_GET_TIMESTAMP() +* +* Description +* Function macro to retrieve a system timestamp for SYSVIEW events. +* Default +* Call user-supplied function SEGGER_SYSVIEW_X_GetTimestamp(). +* Notes +* For some known compilers and cores, a ready-to-use, core-specific +* default is set. +* ARMv7M: Read Cortex-M Cycle Count register. +* +* The system timestamp clock frequency has to be passed in +* SEGGER_SYSVIEW_Init(). +*/ +#ifndef SEGGER_SYSVIEW_GET_TIMESTAMP + #if defined (SEGGER_SYSVIEW_CORE) && (SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3) + #define SEGGER_SYSVIEW_GET_TIMESTAMP() (*(U32 *)(0xE0001004)) // Retrieve a system timestamp. Cortex-M cycle counter. + #else + #define SEGGER_SYSVIEW_GET_TIMESTAMP() SEGGER_SYSVIEW_X_GetTimestamp() // Retrieve a system timestamp via user-defined function + #endif +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_TIMESTAMP_BITS +* +* Description +* Number of valid (low-order) bits delivered in system timestamp. +* Default +* 32 +* Notes +* Value has to match system timestamp clock source. +*/ +// Define number of valid bits low-order delivered by clock source. +#ifndef SEGGER_SYSVIEW_TIMESTAMP_BITS + #define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_RTT_CHANNEL +* +* Description +* The RTT channel that SystemView will use. +* Default +* 0: Auto selection. +* Notes +* Value has to be lower than SEGGER_RTT_MAX_NUM_UP_BUFFERS. +*/ +#ifndef SEGGER_SYSVIEW_RTT_CHANNEL + #define SEGGER_SYSVIEW_RTT_CHANNEL 0 +#endif +// Sanity check of RTT channel +#if (SEGGER_SYSVIEW_RTT_CHANNEL == 0) && (SEGGER_RTT_MAX_NUM_UP_BUFFERS < 2) + #error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > 1!" +#elif (SEGGER_SYSVIEW_RTT_CHANNEL >= SEGGER_RTT_MAX_NUM_UP_BUFFERS) + #error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > SEGGER_SYSVIEW_RTT_CHANNEL!" +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_RTT_BUFFER_SIZE +* +* Description +* Number of bytes that SystemView uses for the RTT buffer. +* Default +* 1024 +*/ +#ifndef SEGGER_SYSVIEW_RTT_BUFFER_SIZE + #define SEGGER_SYSVIEW_RTT_BUFFER_SIZE 1024 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_SECTION +* +* Description +* Section to place the SystemView RTT Buffer into. +* Default +* undefined: Do not place into a specific section. +* Notes +* If SEGGER_RTT_SECTION is defined, the default changes to use +* this section for the SystemView RTT Buffer, too. +*/ +#if !(defined SEGGER_SYSVIEW_SECTION) && (defined SEGGER_RTT_SECTION) + #define SEGGER_SYSVIEW_SECTION SEGGER_RTT_SECTION +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE +* +* Description +* Largest cache line size (in bytes) in the target system. +* Default +* 0 +* Notes +* Required in systems with caches to make sure that the SystemView +* RTT buffer can be aligned accordingly. +*/ +#ifndef SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE + #define SEGGER_SYSVIEW_CPU_CACHE_LINE_SIZE 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_ID_BASE +* +* Description +* Lowest Id reported by the application. +* Default +* 0 +* Notes +* Value is usually subtracted from mailboxes, semaphores, tasks, +* .... addresses, to compress event parameters. +* Should be the lowest RAM address of the system. +*/ +#ifndef SEGGER_SYSVIEW_ID_BASE + #define SEGGER_SYSVIEW_ID_BASE 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_ID_SHIFT +* +* Description +* Number of bits to shift Ids. +* Default +* 0 +* Notes +* Ids are shifted to compress event parameters. +* Should match the alignment of Ids (addresses), +* e.g. 2 when Ids are 4 byte aligned. +*/ +#ifndef SEGGER_SYSVIEW_ID_SHIFT + #define SEGGER_SYSVIEW_ID_SHIFT 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_MAX_ARGUMENTS +* +* Description +* Maximum number of arguments which are handled with SystemView +* print routines or may be encoded in one recording function. +* routines. +* Default +* 16 +*/ +#ifndef SEGGER_SYSVIEW_MAX_ARGUMENTS + #define SEGGER_SYSVIEW_MAX_ARGUMENTS 16 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_MAX_STRING_LEN +* +* Description +* Maximum string length which can be used in SystemView print and +* system description routines. +* Default +* 128 +*/ +#ifndef SEGGER_SYSVIEW_MAX_STRING_LEN + #define SEGGER_SYSVIEW_MAX_STRING_LEN 128 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT +* +* Description +* If enabled, on SEGGER_SYSVIEW_PrintHost, check the format string +* and if it includes unsupported formatters, use formatting on the +* target instead. +* Default +* 0: Disabled. +*/ +#ifndef SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT + #define SEGGER_SYSVIEW_PRINTF_IMPLICIT_FORMAT 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_USE_INTERNAL_RECORDER +* +* Description +* If set, an internal recorder, such as UART or IP is used. +* Default +* 0: Disabled. +* Notes +* Convenience define to be used by SEGGER_SYSVIEW_Conf(), +* such as in embOS configuration to enable Cortex-M cycle counter. +*/ +#ifndef SEGGER_SYSVIEW_USE_INTERNAL_RECORDER + #define SEGGER_SYSVIEW_USE_INTERNAL_RECORDER 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_CAN_RESTART +* +* Description +* If enabled, send the SystemView start sequence on every start +* command, not just on the first one. +* Enables restart when SystemView disconnected unexpectedly. +* Default +* 1: Enabled +*/ +#ifndef SEGGER_SYSVIEW_CAN_RESTART + #define SEGGER_SYSVIEW_CAN_RESTART 1 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_START_ON_INIT +* +* Description +* Enable calling SEGGER_SYSVIEW_Start() after initialization. +* Default +* 0: Disabled. +* Notes +* Convenience define to be used by SEGGER_SYSVIEW_Conf(), +* such as in embOS configuration. +*/ +#ifndef SEGGER_SYSVIEW_START_ON_INIT + #define SEGGER_SYSVIEW_START_ON_INIT 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_USE_STATIC_BUFFER +* +* Description +* If enabled, use a static buffer instead of a buffer on the stack +* for SystemView event packets. +* Default +* 1: Enabled. +* Notes +* If enabled, the static memory use by SystemView is increased by +* the maximum packet size. SystemView is locked on entry of a +* recording function. +* If disabled, the stack usage by SystemView recording functions +* might be increased by up to the maximum packet size. SystemView +* is locked when writing the packet to the RTT buffer. +*/ +#ifndef SEGGER_SYSVIEW_USE_STATIC_BUFFER + #define SEGGER_SYSVIEW_USE_STATIC_BUFFER 1 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_MAX_PACKET_SIZE +* +* Description +* Maximum packet size for a SystemView event. +* Default +* Automatically calculated. +* Notes +* The maximum packet size is mainly defined by the maximum string +* length and the maximum number of arguments. +*/ +#ifndef SEGGER_SYSVIEW_MAX_PACKET_SIZE + #define SEGGER_SYSVIEW_MAX_PACKET_SIZE (SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_ARGUMENTS * SEGGER_SYSVIEW_QUANTA_U32) +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_POST_MORTEM_MODE +* +* Description +* If enabled, SystemView records for post-mortem analysis instead +* of real-time analysis. +* Default +* 0: Disabled. +* Notes +* For more information refer to +* https://www.segger.com/products/development-tools/systemview/technology/post-mortem-mode +*/ +#ifndef SEGGER_SYSVIEW_POST_MORTEM_MODE + #define SEGGER_SYSVIEW_POST_MORTEM_MODE 0 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT +* +* Description +* Configure how frequently syncronization is sent in post-mortem +* mode. +* Default +* 8: (1 << 8) = Every 256 Events. +* Notes +* In post-mortem mode, at least one sync has to be in the RTT buffer. +* Recommended sync frequency: Buffer Size / 16 +* For more information refer to +* https://www.segger.com/products/development-tools/systemview/technology/post-mortem-mode +*/ +#ifndef SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT + #define SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT 8 +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_ON_EVENT_RECORDED() +* +* Description +* Function macro to notify recorder about a new event in buffer. +* Default +* undefined: Do not notify recorder. +* Notes +* Used for non-J-Link recorder, +* such as to enable transmission via UART or notify IP task. +*/ +#ifndef SEGGER_SYSVIEW_ON_EVENT_RECORDED + #define SEGGER_SYSVIEW_ON_EVENT_RECORDED(NumBytes) +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_LOCK() +* +* Description +* Function macro to (nestable) lock SystemView recording. +* Default +* Use RTT Locking mechanism (defined by SEGGER_RTT_LOCK()). +* Notes +* If SystemView recording is not locked, recording events from +* interrupts and tasks may lead to unpredictable, undefined, event +* data. +*/ +#ifndef SEGGER_SYSVIEW_LOCK + #define SEGGER_SYSVIEW_LOCK() SEGGER_RTT_LOCK() +#endif + +/********************************************************************* +* +* Define: SEGGER_SYSVIEW_UNLOCK +* +* Description +* Function macro to unlock SystemView recording. +* Default +* Use RTT Unlocking mechanism (defined by SEGGER_RTT_UNLOCK()). +*/ +#ifndef SEGGER_SYSVIEW_UNLOCK + #define SEGGER_SYSVIEW_UNLOCK() SEGGER_RTT_UNLOCK() +#endif + +#ifdef __cplusplus +} +#endif + +#endif + +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER_SYSVIEW_Config_NoOS.c a/RTT/SEGGER_SYSVIEW_Config_NoOS.c new file mode 100644 index 0000000..4976346 --- /dev/null +++ a/RTT/SEGGER_SYSVIEW_Config_NoOS.c @@ -0,0 +1,153 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.30 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- + +File : SEGGER_SYSVIEW_Config_NoOS.c +Purpose : Sample setup configuration of SystemView without an OS. +Revision: $Rev: 9599 $ +*/ +#include "SEGGER_SYSVIEW.h" +#include "SEGGER_SYSVIEW_Conf.h" + +// SystemcoreClock can be used in most CMSIS compatible projects. +// In non-CMSIS projects define SYSVIEW_CPU_FREQ. +extern unsigned int SystemCoreClock; + +/********************************************************************* +* +* Defines, configurable +* +********************************************************************** +*/ +// The application name to be displayed in SystemViewer +#define SYSVIEW_APP_NAME "Gavin-Demo Application" + +// The target device name +#define SYSVIEW_DEVICE_NAME "Cortex-M4" + +// Frequency of the timestamp. Must match SEGGER_SYSVIEW_Conf.h +#define SYSVIEW_TIMESTAMP_FREQ (SystemCoreClock) + +// System Frequency. SystemcoreClock is used in most CMSIS compatible projects. +#define SYSVIEW_CPU_FREQ (SystemCoreClock) + +// The lowest RAM address used for IDs (pointers) +#define SYSVIEW_RAM_BASE (0x20000000) + +// Define as 1 if the Cortex-M cycle counter is used as SystemView timestamp. Must match SEGGER_SYSVIEW_Conf.h +#ifndef USE_CYCCNT_TIMESTAMP + #define USE_CYCCNT_TIMESTAMP 1 +#endif + +// Define as 1 if the Cortex-M cycle counter is used and there might be no debugger attached while recording. +#ifndef ENABLE_DWT_CYCCNT + #define ENABLE_DWT_CYCCNT (USE_CYCCNT_TIMESTAMP & SEGGER_SYSVIEW_POST_MORTEM_MODE) +#endif + +/********************************************************************* +* +* Defines, fixed +* +********************************************************************** +*/ +#define DEMCR (*(volatile unsigned long*) (0xE000EDFCuL)) // Debug Exception and Monitor Control Register +#define TRACEENA_BIT (1uL << 24) // Trace enable bit +#define DWT_CTRL (*(volatile unsigned long*) (0xE0001000uL)) // DWT Control Register +#define NOCYCCNT_BIT (1uL << 25) // Cycle counter support bit +#define CYCCNTENA_BIT (1uL << 0) // Cycle counter enable bit + +/********************************************************************* +* +* _cbSendSystemDesc() +* +* Function description +* Sends SystemView description strings. +*/ +static void _cbSendSystemDesc(void) { + SEGGER_SYSVIEW_SendSysDesc("N="SYSVIEW_APP_NAME",D="SYSVIEW_DEVICE_NAME); + SEGGER_SYSVIEW_SendSysDesc("I#15=SysTick"); + //SEGGER_SYSVIEW_SendSysDesc("I#93=OTG_HS_IRQHandler"); + SEGGER_SYSVIEW_SendSysDesc("I#56=rfIRQ-0"); + SEGGER_SYSVIEW_SendSysDesc("I#26=rfIRQ-2"); + SEGGER_SYSVIEW_SendSysDesc("I#39=rfIRQ-3"); + + SEGGER_SYSVIEW_SendSysDesc("I#44=Timer2.5ms"); +} + +/********************************************************************* +* +* Global functions +* +********************************************************************** +*/ +void SEGGER_SYSVIEW_Conf(void) { +#if USE_CYCCNT_TIMESTAMP +#if ENABLE_DWT_CYCCNT + // + // If no debugger is connected, the DWT must be enabled by the application + // + if ((DEMCR & TRACEENA_BIT) == 0) { + DEMCR |= TRACEENA_BIT; + } +#endif + // + // The cycle counter must be activated in order + // to use time related functions. + // + if ((DWT_CTRL & NOCYCCNT_BIT) == 0) { // Cycle counter supported? + if ((DWT_CTRL & CYCCNTENA_BIT) == 0) { // Cycle counter not enabled? + DWT_CTRL |= CYCCNTENA_BIT; // Enable Cycle counter + } + } +#endif + SEGGER_SYSVIEW_Init(SYSVIEW_TIMESTAMP_FREQ, SYSVIEW_CPU_FREQ, + 0, _cbSendSystemDesc); + SEGGER_SYSVIEW_SetRAMBase(SYSVIEW_RAM_BASE); +} + +/*************************** End of file ****************************/ diff --git b/RTT/SEGGER_SYSVIEW_Int.h a/RTT/SEGGER_SYSVIEW_Int.h new file mode 100644 index 0000000..05c737d --- /dev/null +++ a/RTT/SEGGER_SYSVIEW_Int.h @@ -0,0 +1,99 @@ +/********************************************************************* +* SEGGER Microcontroller GmbH * +* The Embedded Experts * +********************************************************************** +* * +* (c) 1995 - 2021 SEGGER Microcontroller GmbH * +* * +* www.segger.com Support: support@segger.com * +* * +********************************************************************** +* * +* SEGGER SystemView * Real-time application analysis * +* * +********************************************************************** +* * +* All rights reserved. * +* * +* SEGGER strongly recommends to not make any changes * +* to or modify the source code of this software in order to stay * +* compatible with the SystemView and RTT protocol, and J-Link. * +* * +* Redistribution and use in source and binary forms, with or * +* without modification, are permitted provided that the following * +* condition is met: * +* * +* o Redistributions of source code must retain the above copyright * +* notice, this condition and the following disclaimer. * +* * +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * +* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * +* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * +* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * +* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * +* DAMAGE. * +* * +********************************************************************** +* * +* SystemView version: 3.30 * +* * +********************************************************************** +-------------------------- END-OF-HEADER ----------------------------- +File : SEGGER_SYSVIEW_Int.h +Purpose : SEGGER SystemView internal header. +Revision: $Rev: 21281 $ +*/ + +#ifndef SEGGER_SYSVIEW_INT_H +#define SEGGER_SYSVIEW_INT_H + +/********************************************************************* +* +* #include Section +* +********************************************************************** +*/ + +#include "SEGGER_SYSVIEW.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/********************************************************************* +* +* Private data types +* +********************************************************************** +*/ +// +// Commands that Host can send to target +// +typedef enum { + SEGGER_SYSVIEW_COMMAND_ID_START = 1, + SEGGER_SYSVIEW_COMMAND_ID_STOP, + SEGGER_SYSVIEW_COMMAND_ID_GET_SYSTIME, + SEGGER_SYSVIEW_COMMAND_ID_GET_TASKLIST, + SEGGER_SYSVIEW_COMMAND_ID_GET_SYSDESC, + SEGGER_SYSVIEW_COMMAND_ID_GET_NUMMODULES, + SEGGER_SYSVIEW_COMMAND_ID_GET_MODULEDESC, + SEGGER_SYSVIEW_COMMAND_ID_HEARTBEAT = 127, + // Extended commands: Commands >= 128 have a second parameter + SEGGER_SYSVIEW_COMMAND_ID_GET_MODULE = 128 +} SEGGER_SYSVIEW_COMMAND_ID; + +#ifdef __cplusplus +} +#endif + +#endif + +/*************************** End of file ****************************/ diff --git b/Src/custom_hid_itf.c a/Src/custom_hid_itf.c new file mode 100644 index 0000000..36e9ac5 --- /dev/null +++ a/Src/custom_hid_itf.c @@ -0,0 +1,71 @@ +/*! + \file custom_hid_itf.c + \brief custom HID interface driver + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "custom_hid_core.h" + +/* local function prototypes ('static') */ +static void key_config(void); +static void led_config(void); + +hid_fop_handler fop_handler = { + .periph_config = {key_config, led_config} +}; + +/*! + \brief configure the keys + \param[in] none + \param[out] none + \retval none +*/ +static void key_config(void) +{ + /* keys configuration */ +// gd_eval_key_init(KEY_TAMPER, KEY_MODE_EXTI); +// gd_eval_key_init(KEY_WAKEUP, KEY_MODE_EXTI); +} + +/*! + \brief configure the leds + \param[in] none + \param[out] none + \retval none +*/ +static void led_config(void) +{ + /* initialize LEDs */ +// gd_eval_led_init(LED2); +// gd_eval_led_init(LED3); +// gd_eval_led_init(LED4); +// gd_eval_led_init(LED5); +} diff --git b/Src/gd32f30x_it.c a/Src/gd32f30x_it.c new file mode 100644 index 0000000..a8f8dfb --- /dev/null +++ a/Src/gd32f30x_it.c @@ -0,0 +1,256 @@ +/*! + \file gd32f30x_it.c + \brief main interrupt service routines + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32f30x_it.h" +#include "usbd_lld_int.h" +#include "custom_hid_core.h" +#include "HW_MCUIO.h" +#include "platform.h" +#include "base_core_user.h" +extern usb_dev usbd_custom_hid; + +uint8_t Send_Buffer[4] = {0x00, 0x01, 0x00, 0x01}; + +/*! + \brief this function handles NMI exception + \param[in] none + \param[out] none + \retval none +*/ +void NMI_Handler(void) +{ +} + +/*! + \brief this function handles HardFault exception + \param[in] none + \param[out] none + \retval none +*/ +void HardFault_Handler(void) +{ + /* if Hard Fault exception occurs, go to infinite loop */ + while (1); +} + +/*! + \brief this function handles MemManage exception + \param[in] none + \param[out] none + \retval none +*/ +void MemManage_Handler(void) +{ + /* if Memory Manage exception occurs, go to infinite loop */ + while (1); +} + +/*! + \brief this function handles BusFault exception + \param[in] none + \param[out] none + \retval none +*/ +void BusFault_Handler(void) +{ + /* if Bus Fault exception occurs, go to infinite loop */ + while (1); +} + +/*! + \brief this function handles UsageFault exception + \param[in] none + \param[out] none + \retval none +*/ +void UsageFault_Handler(void) +{ + /* if Usage Fault exception occurs, go to infinite loop */ + while (1); +} + +/*! + \brief this function handles SVC exception + \param[in] none + \param[out] none + \retval none +*/ +void SVC_Handler(void) +{ +} + +/*! + \brief this function handles DebugMon exception + \param[in] none + \param[out] none + \retval none +*/ +void DebugMon_Handler(void) +{ +} + +/*! + \brief this function handles PendSV exception + \param[in] none + \param[out] none + \retval none +*/ +void PendSV_Handler(void) +{ +} + +/*! + \brief this function handles SysTick exception + \param[in] none + \param[out] none + \retval none +*/ +void SysTick_Handler(void) +{ + HW_GD_IncTick(); +} + +void TIMER1_IRQHandler(void) +{ + if (RESET != timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_UP)) + { + timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP); + + base_core.timer_2ms5_enter(); + void user_2ms5_timer(void); + user_2ms5_timer(); + } +} + +void TIMER2_IRQHandler(void) +{ + if (RESET != timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_UP)) + { + timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP); + + base_core.timer_20ms_enter(); + + void user_20ms_timer(void); + user_20ms_timer(); + } +} + +void TIMER3_IRQHandler(void) +{ + if (RESET != timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_UP)) + { + timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP); + //isr + } +} +/*! + \brief this function handles USBD interrupt + \param[in] none + \param[out] none + \retval none +*/ +void USBD_LP_CAN0_RX0_IRQHandler (void) +{ + usbd_isr(); +} + +/*! + \brief this function handles EXTI0_1_IRQ Handler. + \param[in] none + \param[out] none + \retval none +*/ +void EXTI0_IRQHandler (void) +{ + if (RESET != exti_interrupt_flag_get(EXTI_0)) {//(WAKEUP_KEY_EXTI_LINE)) { + if (USBD_CONFIGURED == usbd_custom_hid.cur_status) { + Send_Buffer[0] = 0x15U; + +// if (RESET == gd_eval_key_state_get(KEY_WAKEUP)) { +// if(Send_Buffer[1]) { +// Send_Buffer[1] = 0x00U; +// } else { +// Send_Buffer[1] = 0x01U; +// } +// } + + custom_hid_report_send (&usbd_custom_hid, Send_Buffer, 2U); + } + + /* clear the EXTI line interrupt flag */ + exti_interrupt_flag_clear(EXTI_0); + } +} + +/*! + \brief this function handles EXTI14_15_IRQ Handler. + \param[in] none + \param[out] none + \retval none +*/ +void EXTI10_15_IRQHandler (void) +{ + if (RESET != exti_interrupt_flag_get(EXTI_13)) {//(TAMPER_KEY_EXTI_LINE)) { + if(USBD_CONFIGURED == usbd_custom_hid.cur_status) { + Send_Buffer[2] = 0x16U; + +// if (RESET == gd_eval_key_state_get(KEY_TAMPER)) { +// if(Send_Buffer[3]) { +// Send_Buffer[3] = 0x00U; +// } else { +// Send_Buffer[3] = 0x01U; +// } +// } + custom_hid_report_send (&usbd_custom_hid, &Send_Buffer[2], 2U); + } + + /* clear the EXTI line interrupt flag */ + exti_interrupt_flag_clear(EXTI_13); + } +} + +#ifdef USBD_LOWPWR_MODE_ENABLE + +/*! + \brief this function handles USBD wakeup interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void USBD_WKUP_IRQHandler (void) +{ + exti_interrupt_flag_clear(EXTI_18); +} + +#endif /* USBD_LOWPWR_MODE_ENABLE */ diff --git b/Src/gd32f30x_usbd_hw.c a/Src/gd32f30x_usbd_hw.c new file mode 100644 index 0000000..dcb55dd --- /dev/null +++ a/Src/gd32f30x_usbd_hw.c @@ -0,0 +1,110 @@ +/*! + \file gd32f30x_usbd_hw.c + \brief usbd hardware configure file + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_hw.h" + +/*! + \brief configure the different system clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + uint32_t system_clock = rcu_clock_freq_get(CK_SYS); + + /* enable USB pull-up pin clock */ + rcu_periph_clock_enable(RCC_AHBPeriph_GPIO_PULLUP); + + if (48000000U == system_clock) { + rcu_usb_clock_config(RCU_CKUSB_CKPLL_DIV1); + } else if (72000000U == system_clock) { + rcu_usb_clock_config(RCU_CKUSB_CKPLL_DIV1_5); + } else if (96000000U == system_clock) { + rcu_usb_clock_config(RCU_CKUSB_CKPLL_DIV2); + } else if (120000000U == system_clock) { + rcu_usb_clock_config(RCU_CKUSB_CKPLL_DIV2_5); + } else { + /* reserved */ + } + + /* GPIO clock */ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_GPIOC); + rcu_periph_clock_enable(RCU_GPIOD); + rcu_periph_clock_enable(RCU_AF); + + /* enable USB APB1 clock */ + rcu_periph_clock_enable(RCU_USBD); + + /* Timer clock */ + rcu_periph_clock_enable(RCU_TIMER1); + rcu_periph_clock_enable(RCU_TIMER2); + rcu_periph_clock_enable(RCU_TIMER3); + + /* SPI clock */ + rcu_periph_clock_enable(RCU_SPI0); + rcu_periph_clock_enable(RCU_SPI2); +} + +/*! + \brief configure the gpio peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* configure usb pull-up pin */ + gpio_init(USB_PULLUP, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, USB_PULLUP_PIN); +} + +/*! + \brief configure interrupt priority + \param[in] none + \param[out] none + \retval none +*/ +void nvic_config(void) +{ + /* 2 bits for preemption priority, 2 bits for subpriority */ + nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); + + /* enable the USB low priority interrupt */ + nvic_irq_enable((uint8_t)USBD_LP_CAN0_RX0_IRQn, 2U, 0U); + + /* enable the USB low priority interrupt */ + nvic_irq_enable((uint8_t)USBD_HP_CAN0_TX_IRQn, 1U, 0U); +} diff --git b/Src/main.c a/Src/main.c new file mode 100644 index 0000000..88967bd --- /dev/null +++ a/Src/main.c @@ -0,0 +1,193 @@ +/*! + \file main.c + \brief construct a USB custom HID device + + \version 2020-08-01, V3.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "custom_hid_core.h" +#include "usbd_hw.h" + +#include "platform.h" +#include "base_core_user.h" +#include "function_interface.h" +#include "platform_interface.h" +#include "HW_MCUIO.h" + +//????"function.h" ???"base_config.h"??????,????????1K?????, +//???????????,????????????????????1K?????1mS, +//??????????????20220624 +#include "function.h"//#include "base_config.h" +usb_dev usbd_custom_hid; + +void TIMER1_Init(void); +void TIMER2_Init(void); +void GPIO_Init(void); + +extern hid_fop_handler fop_handler; + + + +/*! + \brief main routine + \param[in] none + \param[out] none + \retval none +*/ + +int main(void) +{ + /* system clocks configuration */ + rcu_config(); + +// /* GPIO configuration */ +// gpio_config(); + + custom_hid_itfop_register(&usbd_custom_hid, &fop_handler); + + /* USB device configuration */ + usbd_init(&usbd_custom_hid, &custom_hid_desc, &custom_hid_class); + + /* NVIC configuration */ + nvic_config(); + + /* GPIO configuration */ + gpio_config(); + + GPIO_Init(); + /* enabled USB pull-up */ + usbd_connect(&usbd_custom_hid); + + HW_RF_SPI_Init(); + + TIMER1_Init(); + TIMER2_Init(); + + + while (USBD_CONFIGURED != usbd_custom_hid.cur_status) { + /* wait for standard USB enumeration is finished */ + } + + base_core.core_init();////??????????? + while(1){ + base_core.core_loop(); + msg_polling();//function.msg__polling(); + //uint8_t Send_buf[64] = {0x00}; + //custom_hid_report_send (&usbd_custom_hid, Send_buf, 64U); + } +} + +void TIMER1_Init(void) +{ + timer_parameter_struct initpara = {0}; + + initpara.prescaler = 1200 - 1;// 120M / 1200 = 100KHz + initpara.alignedmode = TIMER_COUNTER_EDGE; + initpara.counterdirection = TIMER_COUNTER_UP; + initpara.period = 250 - 1; + initpara.clockdivision = TIMER_CKDIV_DIV1; + initpara.repetitioncounter = 0; + timer_init(TIMER1, &initpara); + + nvic_irq_enable(TIMER1_IRQn, 1, 0); + + timer_counter_value_config(TIMER1, 0); + timer_prescaler_config(TIMER1, 1200 - 1, TIMER_PSC_RELOAD_NOW); + timer_autoreload_value_config(TIMER1, 250 - 1); + timer_interrupt_disable(TIMER1, TIMER_INT_UP); + timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP); + timer_interrupt_enable(TIMER1, TIMER_INT_UP); + timer_enable(TIMER1); +} + +void TIMER2_Init(void) +{ + timer_parameter_struct initpara = {0}; + + initpara.prescaler = 1200 - 1;// 120M / 1200 = 100KHz + initpara.alignedmode = TIMER_COUNTER_EDGE; + initpara.counterdirection = TIMER_COUNTER_UP; + initpara.period = 2000 - 1; + initpara.clockdivision = TIMER_CKDIV_DIV1; + initpara.repetitioncounter = 0; + timer_init(TIMER2, &initpara); + + nvic_irq_enable(TIMER1_IRQn, 1, 0); + + timer_counter_value_config(TIMER2, 0); + timer_prescaler_config(TIMER2, 1200 - 1, TIMER_PSC_RELOAD_NOW); + timer_autoreload_value_config(TIMER2, 2000 - 1); + timer_interrupt_disable(TIMER2, TIMER_INT_UP); + timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP); + timer_interrupt_enable(TIMER2, TIMER_INT_UP); + timer_enable(TIMER2); +} + +void GPIO_Init(void) +{ + HW_GPIO_InitTypeDef GPIO_InitStruct; + + /*Configure GPIO pin Output Level */ + HW_GPIO_ResetPin(GPIOC, GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6); + + /*Configure GPIO pin Output Level */ + HW_GPIO_ResetPin(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_8); + + /*Configure GPIO pin Output Level */ + HW_GPIO_ResetPin(GPIOB, GPIO_PIN_8|GPIO_PIN_9); + + /*Configure GPIO pins : PC1 PC4 PC5 PC6 */ + GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; + GPIO_InitStruct.Mode = HW_GPIO_MODE_OUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = HW_GPIO_SPEED_VERY_HIGH; + HW_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /*Configure GPIO pins : PA0 PA1 PA2 PA8 */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_8; + GPIO_InitStruct.Mode = HW_GPIO_MODE_OUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = HW_GPIO_SPEED_VERY_HIGH; + HW_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pin : PC7 */ + GPIO_InitStruct.Pin = GPIO_PIN_7; + GPIO_InitStruct.Mode = HW_GPIO_MODE_FLOATING;//GPIO_MODE_IT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HW_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /*Configure GPIO pins : PB8 PB9 */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; + GPIO_InitStruct.Mode = HW_GPIO_MODE_OUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = HW_GPIO_SPEED_VERY_HIGH; + HW_GPIO_Init(GPIOB, &GPIO_InitStruct); + +} diff --git b/Src/system_gd32f30x.c a/Src/system_gd32f30x.c new file mode 100644 index 0000000..390f34c --- /dev/null +++ a/Src/system_gd32f30x.c @@ -0,0 +1,991 @@ +/*! + \file system_gd32f30x.c + \brief CMSIS Cortex-M4 Device Peripheral Access Layer Source File for + GD32F30x Device Series +*/ + +/* Copyright (c) 2012 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + * + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + ---------------------------------------------------------------------------*/ +/* This file refers the CMSIS standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32f30x.h" + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +/* select a system clock by uncommenting the following line */ +/* use IRC8M */ +//#define __SYSTEM_CLOCK_IRC8M (uint32_t)(__IRC8M) +//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000) +//#define __SYSTEM_CLOCK_120M_PLL_IRC8M (uint32_t)(120000000) + +/* use HXTAL(XD series CK_HXTAL = 8M, CL series CK_HXTAL = 25M) */ +//#define __SYSTEM_CLOCK_HXTAL (uint32_t)(__HXTAL) +//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) +#define __SYSTEM_CLOCK_120M_PLL_HXTAL (uint32_t)(120000000) + +#define SEL_IRC8M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLL 0x02U +#define RCU_MODIFY {volatile uint32_t i; \ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV2; \ + for(i=0;i<20000;i++);} + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_IRC8M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_IRC8M; +static void system_clock_8m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_IRC8M; +static void system_clock_48m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M; +static void system_clock_72m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M; +static void system_clock_108m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_IRC8M; +static void system_clock_120m_irc8m(void); + +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL; +static void system_clock_48m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; +static void system_clock_72m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; +static void system_clock_108m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_120M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_120M_PLL_HXTAL; +static void system_clock_120m_hxtal(void); +#endif /* __SYSTEM_CLOCK_IRC8M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit (void) +{ + /* FPU settings */ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + /* reset the RCU clock configuration to the default reset state */ + /* Set IRC8MEN bit */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + RCU_MODIFY + + /* Reset CFG0 and CFG1 registers */ + RCU_CFG0 = 0x00000000U; + RCU_CFG1 = 0x00000000U; + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + /* reset HXTALEN, CKMEN and PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x009f0000U; +#elif defined(GD32F30X_CL) + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN |RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00ff0000U; +#endif + + /* reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* configure the system clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_IRC8M + system_clock_8m_irc8m(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) + system_clock_48m_irc8m(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) + system_clock_72m_irc8m(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) + system_clock_108m_irc8m(); +#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC8M) + system_clock_120m_irc8m(); + +#elif defined (__SYSTEM_CLOCK_HXTAL) + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) + system_clock_48m_hxtal(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) + system_clock_72m_hxtal(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) + system_clock_108m_hxtal(); +#elif defined (__SYSTEM_CLOCK_120M_PLL_HXTAL) + system_clock_120m_hxtal(); +#endif /* __SYSTEM_CLOCK_IRC8M */ +} + +#ifdef __SYSTEM_CLOCK_IRC8M +/*! + \brief configure the system clock to 8M by IRC8M + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_8m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select IRC8M as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_IRC8M; + + /* wait until IRC8M is selected as system clock */ + while(0U != (RCU_CFG0 & RCU_SCSS_IRC8M)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +/*! + \brief configure the system clock to 48M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* LDO output voltage high mode */ + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL12; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +/*! + \brief configure the system clock to 72M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + }while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* LDO output voltage high mode */ + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL18; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +/*! + \brief configure the system clock to 108M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + }while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* LDO output voltage high mode */ + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL27; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC8M) +/*! + \brief configure the system clock to 120M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_120m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + }while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* LDO output voltage high mode */ + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 30 = 120 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL30; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_HXTAL) +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(0 == (RCU_CFG0 & RCU_SCSS_HXTAL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +/*! + \brief configure the system clock to 48M by PLL which selects HXTAL(8M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + /* select HXTAL/2 as clock source */ + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0); + + /* CK_PLL = (CK_HXTAL/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL12; + +#elif defined(GD32F30X_CL) + /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_PLL_MUL12); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PLLPRESEL | RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } +#endif /* GD32F30X_HD and GD32F30X_XD */ + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +/*! + \brief configure the system clock to 72M by PLL which selects HXTAL(8M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + /* select HXTAL/2 as clock source */ + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0); + + /* CK_PLL = (CK_HXTAL/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL18; + +#elif defined(GD32F30X_CL) + /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_PLL_MUL18); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PLLPRESEL | RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } +#endif /* GD32F30X_HD and GD32F30X_XD */ + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(8M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + /* select HXTAL/2 as clock source */ + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0); + + /* CK_PLL = (CK_HXTAL/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL27; + +#elif defined(GD32F30X_CL) + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_PLL_MUL27); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PLLPRESEL | RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } +#endif /* GD32F30X_HD and GD32F30X_XD */ + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_120M_PLL_HXTAL) +/*! + \brief configure the system clock to 120M by PLL which selects HXTAL(8M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_120m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + RCU_APB1EN |= RCU_APB1EN_PMUEN; + PMU_CTL |= PMU_CTL_LDOVS; + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + /* select HXTAL/2 as clock source */ + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0); + + /* CK_PLL = (CK_HXTAL/2) * 30 = 120 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= RCU_PLL_MUL15;//RCU_PLL_MUL30; + +#elif defined(GD32F30X_CL) + /* CK_PLL = (CK_PREDIV0) * 30 = 120 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_PLL_MUL30); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PLLPRESEL | RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PLLPRESRC_HXTAL | RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0U){ + } +#endif /* GD32F30X_HD and GD32F30X_XD */ + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* enable the high-drive to extend the clock frequency to 120 MHz */ + PMU_CTL |= PMU_CTL_HDEN; + while(0U == (PMU_CS & PMU_CS_HDRF)){ + } + + /* select the high-drive mode */ + PMU_CTL |= PMU_CTL_HDS; + while(0U == (PMU_CS & PMU_CS_HDSRF)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} +#endif /* __SYSTEM_CLOCK_IRC8M */ + +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate (void) +{ + uint32_t sws; + uint32_t pllsel, pllpresel, predv0sel, pllmf,ck_src; +#ifdef GD32F30X_CL + uint32_t predv0, predv1, pll1mf; +#endif /* GD32F30X_CL */ + + sws = GET_BITS(RCU_CFG0, 2, 3); + switch(sws){ + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL, IRC48M or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + if (RCU_PLLSRC_HXTAL_IRC48M == pllsel) { + /* PLL clock source is HXTAL or IRC48M */ + pllpresel = (RCU_CFG1 & RCU_CFG1_PLLPRESEL); + + if(RCU_PLLPRESRC_HXTAL == pllpresel){ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + }else{ + /* PLL clock source is IRC48 */ + ck_src = IRC48M_VALUE; + } + +#if (defined(GD32F30X_HD) || defined(GD32F30X_XD)) + predv0sel = (RCU_CFG0 & RCU_CFG0_PREDV0); + /* PREDV0 input source clock divided by 2 */ + if(RCU_CFG0_PREDV0 == predv0sel){ + ck_src = HXTAL_VALUE/2U; + } +#elif defined(GD32F30X_CL) + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src/predv1)*pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; +#endif /* GD32F30X_HD and GD32F30X_XD */ + }else{ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE/2U; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + if((RCU_CFG0 & RCU_CFG0_PLLMF_5)){ + pllmf |= 0x20U; + } + + if( pllmf >= 15U){ + pllmf += 1U; + }else{ + pllmf += 2U; + } + if(pllmf > 61U){ + pllmf = 63U; + } + SystemCoreClock = ck_src*pllmf; + #ifdef GD32F30X_CL + if(15U == pllmf){ + SystemCoreClock = ck_src*6U + ck_src/2U; + } + #endif /* GD32F30X_CL */ + + break; + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } + +} diff --git b/Utilities/Binary/USBD/bin/LCD.bin a/Utilities/Binary/USBD/bin/LCD.bin new file mode 100644 index 0000000..983d4f1 --- /dev/null +++ a/Utilities/Binary/USBD/bin/LCD.bin diff --git b/Utilities/Binary/USBD/bin/LED.bin a/Utilities/Binary/USBD/bin/LED.bin new file mode 100644 index 0000000..c366764 --- /dev/null +++ a/Utilities/Binary/USBD/bin/LED.bin diff --git b/Utilities/Binary/USBD/hex/LCD.hex a/Utilities/Binary/USBD/hex/LCD.hex new file mode 100644 index 0000000..612f0cb --- /dev/null +++ a/Utilities/Binary/USBD/hex/LCD.hex @@ -0,0 +1,2889 @@ +:020000040800F2 +:10400000C8040020454100089B4100089341000876 +:10401000974100088D41000811420008000000008F +:10402000000000000000000000000000C741000880 +:104030009141000800000000C5410008C941000886 +:104040005F4100085F4100085F4100085F410008D0 +:104050005F4100085F4100085F4100085F410008C0 +:104060005F4100085F4100085F4100085F410008B0 +:104070005F4100085F4100085F4100085F410008A0 +:104080005F4100085F4100085F4100085F41000890 +:104090005F4100085F4100085F4100085F41000880 +:1040A0005F4100085F4100085F4100085F41000870 +:1040B0005F4100085F4100085F4100085F41000860 +:1040C0005F4100085F4100085F4100085F41000850 +:1040D0005F4100085F4100085F4100085F41000840 +:1040E0005F4100085F4100085F4100085F41000830 +:1040F0005F4100085F4100085F4100085F41000820 +:104100005F4100085F4100085F4100085F4100080F +:104110005F4100085F4100085F4100085F410008FF +:104120005F4100085F4100085F4100085F410008EF +:10413000DFF80CD000F018F800480047CD4D00081B +:10414000C80400200648804706480047FEE7FEE70F +:10415000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE737 +:10416000D141000831410008064C074D06E0E068E7 +:1041700040F0010394E8070098471034AC42F6D3AE +:10418000FFF7DAFF6CF300088CF3000800BFFEE7CE +:10419000704700BFFEE700BFFEE7704710B500287C +:1041A00007DA0A07140E054A00F00F031B1FD45448 +:1041B00003E00A07130E024A135410BD18ED00E085 +:1041C00000E400E07047704710B500F0B7F910BD8B +:1041D00010B50D48006840F001000B490860002050 +:1041E0004860C862084600680849084006490860F7 +:1041F0004FF41F0088600846006820F480200860A3 +:1042000001F004F810BD000000100240FFFFF6FEB0 +:1042100000BFFEE702E008C8121F08C1002AFAD159 +:1042200070477047002001E001C1121F002AFBD136 +:1042300070470000FEB50646B348DFF8D0C20090D4 +:10424000BCF800C00CF14F0C1FFA8CF3DFF8C0C2B1 +:10425000BCF800C00CF1450C1FFA8CF2DFF8ACC2C0 +:10426000BCF800C00CF1280C1FFA8CF1DFF8A0C2DA +:10427000BCF800C00CF11E0C1FFA8CF000F01FFD02 +:10428000A148DFF888C20090BCF800C00CF14F0CC8 +:104290001FFA8CF3DFF87CC2BCF800C00CF1450CAF +:1042A0001FFA8CF2DFF864C2BCF800C00CF1280CD5 +:1042B0001FFA8CF1DFF85CC2BCF800C00CF11E0CD8 +:1042C0001FFA8CF000F0FBFC8F48DFF84CC2009026 +:1042D000BCF800C00CF14F0C1FFA8CF3DFF830C2B1 +:1042E000BCF800C00CF1450C1FFA8CF2DFF828C2B4 +:1042F000BCF800C00CF1280C1FFA8CF1DFF810C2DA +:10430000BCF800C00CF11E0C1FFA8CF000F0D7FCBA +:104310007D48DFF804C20090BCF800C00CF14F0CDF +:104320001FFA8CF3DFF8ECC1BCF800C00CF1450CAF +:104330001FFA8CF2DFF8E0C1BCF800C00CF1280CC9 +:104340001FFA8CF1DFF8CCC1BCF800C00CF11E0CD8 +:104350001FFA8CF000F0B3FC1827704D4FF6FF7079 +:104360006F498880002411E06D484068009015F87E +:10437000012BE1001E3188B269490B68019349683D +:104380000291BE2100F0FCFA601C84B2BC42EBDB5F +:1043900036B1012E29D0022E4CD0032E6FD16FE002 +:1043A0006048DFF868C10090BCF800C00CF14F0C09 +:1043B0001FFA8CF3DFF858C1BCF800C00CF1450CB3 +:1043C0001FFA8CF2DFF844C1BCF800C00CF1280CD5 +:1043D0001FFA8CF1DFF838C1BCF800C00CF11E0CDC +:1043E0001FFA8CF000F06BFC8BE04E48DFF81CC12C +:1043F0000090BCF800C00CF14F0C1FFA8CF3DFF8F2 +:1044000014C1BCF800C00CF1450C1FFA8CF2DFF8A7 +:10441000FCC0BCF800C00CF1280C1FFA8CF1DFF8CE +:10442000F4C0BCF800C00CF11E0C1FFA8CF000F0B8 +:1044300046FC66E03B48DFF8E0C00090BCF800C0F6 +:104440000CF14F0C1FFA8CF3DFF8C4C0BCF800C0AD +:104450000CF1450C1FFA8CF2DFF8BCC0BCF800C0B0 +:104460000CF1280C1FFA8CF1DFF8A4C0BCF800C0D6 +:104470000CF11E0C1FFA8CF000F021FC41E024E04E +:104480002848DFF894C00090BCF800C00CF14F0C35 +:104490001FFA8CF3DFF87CC0BCF800C00CF1450CAF +:1044A0001FFA8CF2DFF870C0BCF800C00CF1280CC9 +:1044B0001FFA8CF1DFF85CC0BCF800C00CF11E0CD8 +:1044C0001FFA8CF000F0FBFB1BE0144D4FF478401A +:1044D00013498880002411E011484068009015F8C5 +:1044E000012BE1001E3188B20D490B680193496828 +:1044F0000291BE2100F044FA601C84B2BC42EBDBA6 +:1045000000BF00BFFEBD0000247A000806000020A6 +:104510000000002002000020080000200C00002005 +:10452000280000209C6D00080349086000BF024974 +:1045300009680029FBD1704730000020044800685A +:1045400020B103480068401E014908607047000020 +:104550003000002000B597B04FF4A16000F08AFD54 +:1045600040F2056000F086FD40F2066000F082FD3A +:104570004FF4C16000F07EFD4CF20373032218215A +:10458000234800F0A3F94FF6807303221821214835 +:1045900000F09CF90423032218211E4800F096F92C +:1045A0003023032218211A4800F090F94FF40073C9 +:1045B00003221821184800F089F900200190029088 +:1045C0000390022004900A20059002200690052006 +:1045D000079001200890002009900A900B900C9001 +:1045E00001200D9000200E900F901090119010203F +:1045F000129000201390149001A81590169008A80E +:1046000000F018F8012000F009F817B000BD000014 +:10461000001401400018014000200140C100A1F138 +:10462000C041096841F00102C100A1F1C0410A6026 +:104630007047000070B50021002200230468E400E8 +:10464000A4F1C0442168414C2140D0E90B4544EA23 +:104650004504856A2C43456A44EA0524056A2C43CF +:10466000C56944EA852485692C43456944EA0534D3 +:10467000056944EA4534856844EA8534C56844EAF6 +:10468000C53445682C432143446B247E641E04F0EA +:104690000F04456B6D696D1EF02606EA05152C4367 +:1046A000456B2D696D1E4FF47F4606EA05252C43A8 +:1046B000456BAD896D1E4FF4702606EA05452C4307 +:1046C000456BAD682C43456B6D682C43456B2D687D +:1046D00044EA0502C46A082C01D141F04001846813 +:1046E000012C20D1846B247E641E04F00F04856BA2 +:1046F0006D696D1EF02606EA05152C43856B2D6944 +:104700006D1E4FF47F4606EA05252C43856BAD8967 +:104710006D1E4FF4702606EA05452C43856B2D6807 +:1047200044EA050301E06FF070430468E400A4F17B +:10473000C04421600468E400A4F1C04462600468DD +:10474000E400A4F1C044C4F8043170BD8100F7FF57 +:104750000146002231F812004B88984200DA01220B +:1047600031F812008B88984200DA022231F81200E8 +:10477000CB88984200DA032231F8120000B90422F3 +:10478000D0B2704710B504460B4931F8140000F060 +:1047900071FC0A4951F82430094951F824000322D8 +:1047A000102100F093F8054850F82400044951F80E +:1047B0002410486110BD000078000020480000204F +:1047C00038000020034951F82010034A52F82020F5 +:1047D000516170474800002038000020034951F81B +:1047E0002010034A52F82020116170474800002031 +:1047F000380000202F4B1B884633984212DA2D4B8D +:104800001B881E3398420DDD2B4B1B881E339942AB +:1048100008DD294B1B884633994203DA13885B1C59 +:10482000138046E0254B1B884633984212DA234B0F +:104830001B881E3398420DDD1F4B1B881E33994287 +:1048400008DD1D4B1B884633994203DA53885B1CF5 +:1048500053802EE0174B1B884633984212DA154BD3 +:104860001B881E3398420DDD154B1B881E33994261 +:1048700008DD134B1B884633994203DA93885B1C8F +:10488000938016E00D4B1B884633984211DA0B4B90 +:104890001B881E3398420CDD094B1B881E3399423E +:1048A00007DD074B1B884633994202DAD3885B1C2D +:1048B000D380704700000020060000200200002086 +:1048C000080000204161704701617047F0B50C4657 +:1048D00016460025002204F00F0514F0100F08D032 +:1048E000042E05D145F00305C76B1F43C76300E0E5 +:1048F0003543002118E001278F401F4212D0026883 +:104900004FEA810C0F2707FA0CF7BA438F0005FA1C +:1049100007F73A43282C01D1436102E0482C00D12B +:10492000036102604F1CB9B20829E4D308211CE0DE +:1049300001278F401F4216D04268A1F108074FEAB5 +:10494000870C0F2707FA0CF7BA43A1F10807BF003D +:1049500005FA07F73A43282C01D1436102E0482CBD +:1049600000D1036142604F1CB9B21029E0D3F0BD01 +:1049700002469068084201D0012070470020FCE701 +:104980000FB42DE9F04706460F4690460025002457 +:10499000A146A246BDF82C0000284DD100BF48E03A +:1049A000A8F1200005EB00104D4911F80090BDF86A +:1049B0002E00F0B9002419E0C4F1070049FA00F014 +:1049C00010F0010F08D0BDF830203B1999B2731BCD +:1049D00098B200F09EF907E0BDF832203B1999B279 +:1049E000731B98B200F095F9601C84B2082CE3DBCD +:1049F0001DE0002419E0C4F1070049FA00F010F0AE +:104A0000010F08D0BDF830207B1999B2331998B244 +:104A100000F07FF907E0BDF832207B1999B2331915 +:104A200098B200F076F9601C84B2082CE3DB681CB5 +:104A300085B2102DB4DB4EE0BDF82C0001284AD120 +:104A4000002546E0A8F1200000EB400005EBC00087 +:104A5000244931F810A0BDF82E00E0B9002417E079 +:104A60004AFA04F010F0010F08D0BDF830203B19CD +:104A700099B2731B98B200F04CF907E0BDF83220F0 +:104A80003B1999B2731B98B200F043F9601C84B2D1 +:104A9000102CE5DB1BE0002417E04AFA04F010F0CC +:104AA000010F08D0BDF830207B1999B2331998B2A4 +:104AB00000F02FF907E0BDF832207B1999B23319C5 +:104AC00098B200F026F9601C84B2102CE5DB681C5B +:104AD00085B2182DB6DBBDE8F0075DF814FB0000C9 +:104AE000C4550008C45B000830B504460025002109 +:104AF000084600F00CF800F01AF800BF03E04FF091 +:104B0000CA4004806D1CB5F5963FF8D330BD10B592 +:104B100003460C4619464E2000F050F921464F201E +:104B200000F04CF910BD4FF0CA41088070472220B8 +:104B30004FF0C8410880704700B50121002000F007 +:104B40003DF94AF6A401032000F038F900210C20B9 +:104B500000F034F940F60C010D2000F02FF94FF46D +:104B60002C510E2000F02AF9B0211E2000F026F969 +:104B700042F63F31012000F021F94FF4C0610220DC +:104B800000F01CF90021102000F018F946F2700125 +:104B9000112000F013F90021052000F00FF9002189 +:104BA000062000F00BF94EF61C71162000F006F9F5 +:104BB0000321172000F002F940F23321072000F012 +:104BC000FDF800210B2000F0F9F800210F2000F083 +:104BD000F5F80021412000F0F1F80021422000F01A +:104BE000EDF80021482000F0E9F840F23F1149209B +:104BF00000F0E4F800214A2000F0E0F800214B200A +:104C000000F0DCF84FF46F41442000F0D7F80021A9 +:104C1000452000F0D3F840F23F11462000F0CEF8D6 +:104C200040F20771302000F0C9F84FF401713120D3 +:104C300000F0C4F84FF40171322000F0BFF840F2E8 +:104C40000251332000F0BAF840F20751342000F04E +:104C5000B5F84FF40171352000F0B0F84FF4017150 +:104C6000362000F0ABF840F20251372000F0A6F8F1 +:104C700040F202313A2000F0A1F840F202313B202C +:104C800000F09CF80021232000F098F80021242057 +:104C900000F094F84FF40041252000F08FF8002137 +:104CA0004E2000F08BF800214F2000F087F84CF2E6 +:104CB000503301E0581E83B2002BFBDC00BD2DE910 +:104CC000F84F04460E4617469946DDF828B02546AB +:104CD000B046381B401CA9EB0601491C4843009014 +:104CE0004FF0000A10E03BF8022B4146284600F046 +:104CF00010F8681C85B2BD4204DD08F101001FFAFE +:104D000080F825460AF1010A00988245EBD3BDE8F8 +:104D1000F88F70B506460C461546F02E02DCB4F549 +:104D2000A07F00DD70BD21463046FFF7F0FEFFF7A3 +:104D3000FEFE2846FFF7F7FE00BFF3E72DE9F04738 +:104D400006460F4690469946DDF820A034463D467B +:104D500000BF06E0524629462046FFF7DAFF601CF6 +:104D600084B24445F6DB3D4606E0524629462046DD +:104D7000FFF7CFFF681C85B24D45F6DB444606E0E1 +:104D8000524629462046FFF7C4FF601E84B2B44253 +:104D9000F6DC4D4606E0524629462046FFF7B9FFAD +:104DA000681E85B2BD42F6DCBDE8F08701464FF0D3 +:104DB000C84211804FF0CA42108870474FF0C84275 +:104DC00010804FF0CA421180704700008AB0002066 +:104DD000089009900025974BD3E90012D3E902030C +:104DE000CDE90603CDE9041200264FF480414803C3 +:104DF00000F036F90020FFF7C5FC0120FFF7C2FCE8 +:104E00000220FFF7BFFC0320FFF7BCFC00F002FA12 +:104E1000FFF7A0FB00F0F4FA3220FFF785FB00203B +:104E2000FFF7C4FF84490880FFF786FE4FF6FF7046 +:104E3000FFF75AFE81484FF48F73C722C8210090B4 +:104E40002820FFF73CFF1F204FF49B73E6220A2126 +:104E500000900846FFF772FF1F20794988804FF6BF +:104E6000FF70C8800120488000200880002461E095 +:104E70007348406804AB00901A5D724B1B88143372 +:104E800099B2714B1B882333082707FB043398B270 +:104E90006B4B1F6802975B6803933B46FFF770FDFF +:104EA0006748406805AB00901A5D664B1B88143359 +:104EB00099B2664B1B882333082707FB043398B24B +:104EC0005F4B1F6802975B6803933B46FFF758FDF3 +:104ED0005B48406806AB00901A5D5D4B1B8814333D +:104EE00099B2594B1B882333082707FB043398B228 +:104EF000534B1F6802975B6803933B46FFF740FDE7 +:104F00004F48406807AB00901A5D514B1B88143323 +:104F100099B24E4B1B882333082707FB043398B202 +:104F2000474B1F6802975B6803933B46FFF728FDDA +:104F3000601C84B2042C9BDB4648424F00903F88A3 +:104F40004F37BBB2404F3F884537BAB23D4F3F88DD +:104F50002837B9B23C4F3F881E37B8B2FFF7AFFED3 +:104F60003C48384F00903F884F37BBB2374F3F889F +:104F70004537BAB2334F3F882837B9B2334F3F88ED +:104F80001E37B8B2FFF79BFE3248314F00903F8882 +:104F90004F37BBB22C4F3F884537BAB22C4F3F88B2 +:104FA0002837B9B2284F3F881E37B8B2FFF787FEBF +:104FB0002848274F00903F884F37BBB2234F3F8888 +:104FC0004537BAB2224F3F882837B9B21F4F3F88C2 +:104FD0001E37B8B2FFF773FE2BE000F063FA01282A +:104FE00011D1681CC5B21C48008800F0ADF9C0F5AD +:104FF000A07087B21948008800F091F9804608AA8D +:105000003946FFF7F7FB142D13D108A8FFF7A0FBD3 +:105010000646304600F099FA3046FFF70BF90020BB +:10502000ADF82600ADF82400ADF82200ADF8200060 +:105030000025D2E7B455000826000020AC86000801 +:1050400028000020060000200000002002000020B0 +:1050500008000020247A0008C6000020C4000020B8 +:10506000024A0A400243024B1A60704780FFFF1F4A +:1050700008ED00E0064901EB9011096800F01F03FC +:1050800001229A401143024A02EB901211607047CC +:105090000010024010B5044624B120210448FFF757 +:1050A00013FC03E020210248FFF70CFC10BD0000B8 +:1050B0000008014010B5044624B110210448FFF750 +:1050C00003FC03E010210248FFF7FCFB10BD0000C9 +:1050D0000018014010B540210148FFF749FC10BD00 +:1050E0000008014010B5044624B180210448FFF7B0 +:1050F000EBFB03E080210248FFF7E4FB10BD00005A +:1051000000080140002000213C4A126842F480322D +:105110003A4B1A6000BF401C384A126802F4003152 +:1051200011B9B0F5006FF6D1344A126812F4003F9D +:1051300001D100BFFEE7314AD26942F080522F4BC5 +:10514000DA612F4A126842F440422D4B1A602B4A12 +:1051500052682A4B5A601A4652685A601A46526878 +:1051600042F480625A601A46526822F440325A6011 +:105170001A46526842F440325A601A465268214B2D +:105180001A401E4B5A601A4652681F4B1A431B4B5B +:105190005A601A46126842F080721A6000BF174ABD +:1051A000126812F0007FFAD0154A126842F4803279 +:1051B000134B1A6000BF124A526812F4803FFAD0B3 +:1051C0000F4A126842F400320D4B1A6000BF0C4ABD +:1051D000526812F4003FFAD0084A526822F00302E3 +:1051E000064B5A601A46526842F002025A6000BFEB +:1051F000024A526812F0080FFAD0704700100240BD +:1052000000700040FFFFC3B70000340810B5FFF77F +:1052100079FF10BD10B5124800684FF47A71B0FBE9 +:10522000F1F4601EB0F1807F01D301200FE0601E19 +:105230004FF0E02148610F214FF0FF30FEF7AEFF45 +:1052400000204FF0E021886107200861002008B1AC +:1052500000BFFEE70021481EFEF7A0FF10BD0000C2 +:105260003400002010B500F0FBF808B1002010BD9C +:1052700000F03CF9002000F04AF9D22000F047F994 +:1052800000F0F6F8F3E72DE9F04704460D46002656 +:105290000027B046B146D22000F06CF806469220B6 +:1052A00000F068F80746D22000F064F880469220AB +:1052B00000F060F88146B6EB080101D40A4600E030 +:1052C0004A42062A07DCB7EB090001D4024600E097 +:1052D0004242062A02DD0020BDE8F08706EB080006 +:1052E00000EBD071C1F34F01218007EB090000EB07 +:1052F000D071C1F34F0129800120EDE710B500F016 +:10530000AFF808B1002010BD00F0F0F8002000F068 +:10531000FEF8922000F0FBF800F0AAF8F3E703464D +:1053200000BFA3F5967202EB0210C0EB022240F61A +:10533000DE50B2FBF0F081B2002901DDF02901DD81 +:10534000002070470846FCE7034600BFA3F1DC02DB +:10535000C2EB821000EB022240F62E60B2FBF0F0AE +:1053600081B2002902DDB1F5A07F01DD0020704788 +:105370000846FCE72DE9FE430646002400250027E9 +:10538000A04600BF0CE0D22E04D1FFF76BFF2DF832 +:10539000140003E0FFF7B2FF2DF81400601C84B284 +:1053A000052CF0DB002416E0601C85B20FE03DF810 +:1053B00014003DF81510884207DD3DF814803DF8D3 +:1053C00015002DF814002DF81580681C85B2052DE8 +:1053D000EDDB601C84B2042CE6DB0027012405E031 +:1053E0003DF81400384487B2601C84B2042CF7DB0B +:1053F000032097FBF0F01FFA80F84046BDE8FE83DB +:1054000010B540F20260FFF735FE40F20660FFF78C +:1054100031FE2023032210210F48FFF757FA802383 +:10542000032210210C48FFF751FA402303220421E4 +:105430000948FFF74BFA1023032219460748FFF7E4 +:1054400045FA2023032204210448FFF73FFA1021E4 +:105450000248FFF739FA10BD00080140001801406A +:1054600010B520210148FFF783FA10BD0018014054 +:1054700070B50024002510E04FF6FF7000EA4404E8 +:105480000120FFF707FE0020FFF704FEFFF722FED2 +:1054900008B1601C84B2681CC5B20C2DECDB204640 +:1054A00070BD000010B50024FFF7DAFF90B901E0ED +:1054B000601CC4B20B490C48FFF7E5FE012801D07F +:1054C000142CF5DB142C0BDB002007490880054960 +:1054D000088010BD00200449088002490880F8E7D0 +:1054E0000120F6E7C6000020C400002010B500200F +:1054F000FFF7D0FD0120FFF7DDFD0120FFF7F2FDF2 +:105500000120FFF7C7FD0020FFF7D4FD10BD70B5E7 +:1055100006460020FFF7BEFD002413E0C4F107009B +:1055200046FA00F000F001052846FFF7DBFD0020F9 +:10553000FFF7B0FD0120FFF7ADFD0020FFF7AAFD4A +:10554000601CC4B2082CE9DB70BD10B50446002015 +:10555000FFF738F90120FFF735F90220FFF732F99C +:105560000320FFF72FF934B1012C08D0022C0AD008 +:10557000032C10D10BE00020FFF730F918E00120D8 +:10558000FFF72CF914E00220FFF728F910E00320C0 +:10559000FFF724F90CE00020FFF720F90120FFF7C6 +:1055A0001DF90220FFF71AF90320FFF717F900BFD2 +:1055B00000BF10BD4C4544324C4544334C45443447 +:1055C0004C454435000000000000000000000000D1 +:1055D000000000000000183C3C3C18181800181887 +:1055E0000000000000666666240000000000000065 +:1055F000000000000000006C6CFE6C6C6CFE6C6CBB +:105600000000000018187CC6C2C07C0686C67C1844 +:105610001800000000000000C2C60C183060C686EA +:10562000000000000000386C6C3876DCCCCCCC7606 +:10563000000000000030303060000000000000007A +:105640000000000000000C18303030303030180CF2 +:1056500000000000000030180C0C0C0C0C0C183072 +:10566000000000000000000000663CFF3C660000F7 +:1056700000000000000000000018187E181800004C +:1056800000000000000000000000000000181818D2 +:105690003000000000000000000000FE00000000DC +:1056A00000000000000000000000000000001818CA +:1056B000000000000000000002060C183060C080EE +:1056C0000000000000007CC6C6CED6D6E6C6C67C6A +:1056D0000000000000001838781818181818187EF4 +:1056E0000000000000007CC6060C183060C0C6FE3A +:1056F0000000000000007CC606063C060606C67CCC +:105700000000000000000C1C3C6CCCFE0C0C0C1EBD +:10571000000000000000FEC0C0C0FC0E0606C67CF3 +:105720000000000000003860C0C0FCC6C6C6C67CD1 +:10573000000000000000FEC606060C1830303030B5 +:105740000000000000007CC6C6C67CC6C6C6C67C7B +:105750000000000000007CC6C6C67E0606060C7867 +:1057600000000000000000001818000000181800D9 +:105770000000000000000000181800000018183099 +:1057800000000000000000060C18306030180C0605 +:1057900000000000000000000000FE0000FE00000D +:1057A000000000000000006030180C060C1830608B +:1057B0000000000000007CC6C60C1818180018185D +:1057C000000000000000007CC6C6DEDEDEDCC07C1F +:1057D00000000000000010386CC6C6FEC6C6C6C673 +:1057E000000000000000FC6666667C66666666FC7B +:1057F0000000000000003C66C2C0C0C0C0C2663CE1 +:10580000000000000000F86C6666666666666CF86C +:10581000000000000000FE6662687868606266FE54 +:10582000000000000000FE6662687868606060F05A +:105830000000000000003C66C2C0C0DEC6C6663A7A +:10584000000000000000C6C6C6C6FEC6C6C6C6C664 +:105850000000000000003C18181818181818183C10 +:105860000000000000001E0C0C0C0C0CCCCCCC7802 +:10587000000000000000E6666C6C78786C6666E6F6 +:10588000000000000000F06060606060606266FE22 +:10589000000000000000C6EEFEFED6C6C6C6C6C6A4 +:1058A000000000000000C6E6F6FEDECEC6C6C6C694 +:1058B000000000000000386CC6C6C6C6C6C66C38FC +:1058C000000000000000FC6666667C60606060F0BE +:1058D0000000000000007CC6C6C6C6C6C6D6DE7C78 +:1058E0000C0E00000000FC6666667C6C666666E670 +:1058F0000000000000007CC6C660380C06C6C67CEE +:105900000000000000007E7E5A1818181818183C75 +:10591000000000000000C6C6C6C6C6C6C6C6C67C15 +:10592000000000000000C6C6C6C6C6C6C66C381059 +:10593000000000000000C6C6C6C6C6D6D6FE6C6C07 +:10594000000000000000C6C66C6C38386C6CC6C61F +:10595000000000000000666666663C181818183CD7 +:10596000000000000000FEC6860C183060C2C6FEB3 +:105970000000000000003C30303030303030303C2F +:105980000000000000000080C0E070381C0E06021D +:105990000000000000003C0C0C0C0C0C0C0C0C3C2F +:1059A0000000000010386CC600000000000000007D +:1059B00000000000000000000000000000000000E7 +:1059C00000FF000030301800000000000000000060 +:1059D000000000000000000000780C7CCCCCCC76ED +:1059E000000000000000E06060786C66666666DCBF +:1059F0000000000000000000007CC6C0C0C0C67CE3 +:105A00000000000000001C0C0C3C6CCCCCCCCC7614 +:105A10000000000000000000007CC6FEC0C0C67C84 +:105A2000000000000000386C6460F060606060F0AE +:105A300000000000000000000076CCCCCCCCCC7C78 +:105A40000CCC78000000E060606C7666666666E606 +:105A50000000000000001818003818181818183C2A +:105A60000000000000000606000E060606060606F8 +:105A700066663C000000E06060666C78786C66E604 +:105A80000000000000003818181818181818183CE2 +:105A9000000000000000000000ECFED6D6D6D6D6EE +:105AA000000000000000000000DC666666666666B6 +:105AB0000000000000000000007CC6C6C6C6C67C10 +:105AC000000000000000000000DC66666666667C80 +:105AD0006060F000000000000076CCCCCCCCCC7C28 +:105AE0000C0C1E000000000000DC7662606060F0BC +:105AF0000000000000000000007CC660380CC67C7E +:105B0000000000000000103030FC30303030361C17 +:105B1000000000000000000000CCCCCCCCCCCC7647 +:105B200000000000000000000066666666663C1823 +:105B3000000000000000000000C6C6C6D6D6FE6CFD +:105B4000000000000000000000C66C3838386CC649 +:105B5000000000000000000000C6C6C6C6C6C67E23 +:105B6000060CF8000000000000FECC183060C6FEF5 +:105B70000000000000000E18181870181818180EF1 +:105B8000000000000000181818180018181818183D +:105B9000000000000000701818180E18181818706F +:105BA00000000000000076DC0000000000000000A3 +:105BB000000000000000000010386CC6C6C6FE00E1 +:105BC00000000000000000000000000000000000D5 +:105BD00000000000000000000000000000000000C5 +:105BE00000000000000000000000000000000000B5 +:105BF0000000000000008001800180018001800120 +:105C0000800180018001800180018001800180018C +:105C10000000000080018001000000000000000082 +:105C20000000000000000000CC00CC00CC00CC0044 +:105C3000CC00CC00000000000000000000000000CC +:105C40000000000000000000000000000000000054 +:105C50000000000000000000000000000000000044 +:105C6000600C600C600C30063006FE1FFE1F300614 +:105C700038071803FE1FFE1F180318038C018C0140 +:105C80008C01000000008000E003F80F9C0E8C1CCB +:105C90008C188C009800F801E007800E801C8C188E +:105CA0008C189C18B80CF00FE003800080000000F6 +:105CB000000000000000000000000E181B0C110C7A +:105CC00011061106110311039B018E01C038C06C2F +:105CD00060446044304430441844186C0C38000070 +:105CE000000000000000E001F00338071806180665 +:105CF0003003F001F000F8009C310E33061E061C44 +:105D0000061C063FFC73F0210000000000000000AC +:105D100000000000000000000C000C000C000C0053 +:105D20000C000C000000000000000000000000005B +:105D30000000000000000000000000000000000063 +:105D4000000000000000000200038001C000C0004D +:105D50006000600030003000300030003000300063 +:105D60003000300060006000C000C000800100030F +:105D700000020000000020006000C00080018001DF +:105D800000030003000600060006000600060006E9 +:105D9000000600060003000380018001C0006000CF +:105DA00020000000000000000000000000000000D3 +:105DB000C000C000D806F807E00130033807000033 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE00080018001800180018001FC3FFC3F800137 +:105DF000800180018001800100000000000000009F +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E200000000000000080018001000100018000EE +:105E30000000000000000000000000000000000062 +:105E4000000000000000000000000000E007E00784 +:105E50000000000000000000000000000000000042 +:105E60000000000000000000000000000000000032 +:105E70000000000000000000000000000000000022 +:105E8000000000000000C000C00000000000000092 +:105E9000000000000000000C000C000600060006D8 +:105EA0000003000300038003800180018001C00023 +:105EB000C000C000600060000000000000000000A2 +:105EC000000000000000E003F007380E180C0C186A +:105ED0000C180C180C180C180C180C180C180C18A2 +:105EE000180C380EF007E00300000000000000006E +:105EF00000000000000000018001C001F0019801D5 +:105F00008801800180018001800180018001800181 +:105F1000800180018001800100000000000000007D +:105F2000000000000000E003F80F180C0C180C181B +:105F300000180018000C000600038001C00060007B +:105F400030001800FC1FFC1F0000000000000000D3 +:105F5000000000000000E001F807180E0C0C0C0C0B +:105F6000000C0006C003C007000C001800180C1835 +:105F70000C18180CF807E0030000000000000000F7 +:105F8000000000000000000C000E000F000F800D4C +:105F9000C00C600C600C300C180C0C0CFC3FFC3F6F +:105FA000000C000C000C000C0000000000000000C1 +:105FB000000000000000F80FF80F180018000C0097 +:105FC000EC03FC071C0E001C0018001800180C182D +:105FD0001C0C180EF807E003000000000000000091 +:105FE000000000000000C007F00F381C181818004F +:105FF0000C00CC03EC0F3C0E1C1C0C180C180C18DD +:10600000181C380EF007E00300000000000000003C +:10601000000000000000FC1FFC1F000C0006000632 +:10602000000380038001C001C000E0006000600048 +:106030007000300030003000000000000000000060 +:10604000000000000000E003F007380E180C180CE8 +:10605000180C3806F007F007180C0C180C180C1860 +:106060000C18380CF80FE0030000000000000000DE +:10607000000000000000E003F007380E1C0C0C18B4 +:106080000C180C181C1C381EF81BE0190018000C0A +:10609000000C1C0EF807F0010000000000000000DA +:1060A00000000000000000000000000000000000F0 +:1060B00080018001000000000000000000000000DE +:1060C00000000000800180010000000000000000CE +:1060D00000000000000000000000000000000000C0 +:1060E00080018001000000000000000000000000AE +:1060F000000000008001800100010001800000001C +:10610000000000000000000000000000000000008F +:10611000000000000010001C800FE003F8001800D1 +:10612000F800E003800F001C0010000000000000D9 +:10613000000000000000000000000000000000005F +:1061400000000000F81F000000000000F81F000021 +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:106170000000000008003800F001C007001F0018F0 +:10618000001FC007F00138000800000000000000F8 +:10619000000000000000E003F80F180C0C180C18A9 +:1061A0000018000C000600038001C000C000C00001 +:1061B00000000000C000C00000000000000000005F +:1061C0000000000000000000E00718180420C229A9 +:1061D000224A114409440944094409221113E20CDA +:1061E000024004201818E007000000000000000032 +:1061F00000000000000080038003C006C006C00647 +:10620000600C600C301830183018F83FF83F1C70E4 +:106210000C600C6006C006C000000000000000001A +:10622000000000000000FC03FC0F0C0C0C180C1804 +:106230000C180C0CFC07FC0F0C180C300C300C303C +:106240000C300C18FC1FFC070000000000000000D0 +:10625000000000000000C007F01F38381C300C7030 +:10626000066006000600060006000600060006603E +:106270000C701C30F01FE007000000000000000060 +:10628000000000000000FE03FE0F060E06180618B0 +:106290000630063006300630063006300630061866 +:1062A0000618060EFE0FFE030000000000000000AE +:1062B000000000000000FC3FFC3F0C000C000C0044 +:1062C0000C000C00FC1FFC1F0C000C000C000C0050 +:1062D0000C000C00FC3FFC3F000000000000000030 +:1062E000000000000000F83FF83F180018001800F8 +:1062F00018001800F81FF81F1800180018001800E0 +:10630000180018001800180000000000000000002D +:10631000000000000000E00FF83F3C780E6006E04F +:1063200007C00300030003FE03FE03C007C006C04E +:106330000EC03CF0F83FE00F00000000000000003D +:106340000000000000000C300C300C300C300C3021 +:106350000C300C30FC3FFC3F0C300C300C300C305F +:106360000C300C300C300C3000000000000000003D +:106370000000000000008001800180018001800198 +:106380008001800180018001800180018001800105 +:1063900080018001800180010000000000000000F9 +:1063A00000000000000000060006000600060006CF +:1063B0000006000600060006000600060006180695 +:1063C00018063807F003E00100000000000000009C +:1063D00000000000000006300618060C0606060342 +:1063E0008601C60066007600DE008E010603060602 +:1063F000060C0618063006600000000000000000D1 +:106400000000000000001800180018001800180014 +:1064100018001800180018001800180018001800BC +:1064200018001800F81FF81F00000000000000000E +:106430000000000000000EE01EF01EF01EF036D836 +:1064400036D836D836D866CC66CC66CCC6C6C6C674 +:10645000C6C6C6C686C386C3000000000000000092 +:106460000000000000000C301C303C303C306C3030 +:106470006C30CC30CC308C310C330C330C360C36C9 +:106480000C3C0C3C0C380C300000000000000000FC +:10649000000000000000E007F81F1C380E700660C6 +:1064A00003C003C003C003C003C003C003C0066031 +:1064B0000E701C38F81FE00700000000000000000C +:1064C000000000000000FC0FFC1F0C380C300C30EA +:1064D0000C300C300C18FC1FFC070C000C000C00DE +:1064E0000C000C000C000C0000000000000000007C +:1064F000000000000000E007F81F1C380E70066066 +:1065000003E003C003C003C003C003C007E0066389 +:106510000E3F1C3CF83FE0F700C000000000000008 +:10652000000000000000FE0FFE1F06380630063097 +:1065300006300638FE1FFE0706030606060C061880 +:10654000061806300630066000000000000000005B +:10655000000000000000E003F80F1C0C0C180C18E1 +:106560000C001C00F803E00F001E00380630063057 +:106570000E301C1CF80FE0070000000000000000B7 +:10658000000000000000FE7FFE7F8001800180018E +:1065900080018001800180018001800180018001F3 +:1065A00080018001800180010000000000000000E7 +:1065B0000000000000000C300C300C300C300C30AF +:1065C0000C300C300C300C300C300C300C300C30EB +:1065D0000C301818F81FE007000000000000000051 +:1065E00000000000000003600630063006300C1882 +:1065F0000C180C18180C180C380E300630067007E2 +:1066000060036003C001C001000000000000000042 +:106610000000000000000360C361C361C361663312 +:10662000663366336633663366336C1B6C1B6C1BD8 +:106630002C1A3C1E380E380E00000000000000002E +:106640000000000000000FE00C7018303018700CD3 +:10665000600EC00780038003C003E006700C301C8E +:1066600018180C300E6007E0000000000000000069 +:1066700000000000000003C006600C301C38381811 +:10668000300C6006E007C0038001800180018001BA +:1066900080018001800180010000000000000000F6 +:1066A000000000000000FC7FFC7F0060003000184C +:1066B000000C000600038001C000600030001800DC +:1066C0000C000600FE7FFE7F0000000000000000BE +:1066D000000000000000E003E003600060006000D4 +:1066E00060006000600060006000600060006000AA +:1066F0006000600060006000600060006000E00317 +:10670000E003000000003000300060006000600026 +:10671000C000C000C000C0018001800180010003F2 +:106720000003000300060006000000000000000057 +:10673000000000000000E003E0030003000300038A +:106740000003000300030003000300030003000331 +:106750000003000300030003000300030003E00341 +:10676000E003000000000000C001C00160036003FE +:10677000600330063006180C180C00000000000002 +:106780000000000000000000000000000000000009 +:1067900000000000000000000000000000000000F9 +:1067A00000000000000000000000000000000000E9 +:1067B000000000000000FFFFFFFF000000000000DD +:1067C0000000000000000C000C000C000C000C008D +:1067D0000C000000000000000000000000000000AD +:1067E00000000000000000000000000000000000A9 +:1067F0000000000000000000000000000000000099 +:10680000F003F8071C0C0C0C000FF00FF80C0C0C2C +:106810000C0C1C0FF80FF018000000000000000026 +:1068200000000000000018001800180018001800F0 +:10683000D803F80F380C1818181818181818181842 +:106840001818380CF80FD8030000000000000000F2 +:106850000000000000000000000000000000000038 +:10686000C003F007300E180C1800180018001800AC +:10687000180C300EF007C0030000000000000000FC +:106880000000000000000018001800180018001890 +:10689000C01BF01F301C18181818181818181818D2 +:1068A0001818301CF01FC01B000000000000000082 +:1068B00000000000000000000000000000000000D8 +:1068C000C003F00F300C1818F81FF81F180018003C +:1068D0003818301CF00FC007000000000000000056 +:1068E000000000000000800FC00FC000C000C0000A +:1068F000F007F007C000C000C000C000C000C0002A +:10690000C000C000C000C000000000000000000087 +:106910000000000000000000000000000000000077 +:10692000E00DF80F180E0C0C0C0C0C0C0C0C0C0CD5 +:106930000C0C180EF80FE00D000C0C0C1C06F807E0 +:10694000F0010000000018001800180018001800DE +:10695000D807F80F381C181818181818181818180D +:106960001818181818181818000000000000000067 +:10697000000000000000C000C00000000000000097 +:10698000C000C000C000C000C000C000C000C00007 +:10699000C000C000C000C0000000000000000000F7 +:1069A000000000000000C000C00000000000000067 +:1069B000C000C000C000C000C000C000C000C000D7 +:1069C000C000C000C000C000C000C000C000F8008F +:1069D0007800000000000C000C000C000C000C0003 +:1069E0000C0C0C060C038C01CC006C00FC009C0110 +:1069F0008C030C030C060C0C0000000000000000CF +:106A0000000000000000C000C000C000C000C000C6 +:106A1000C000C000C000C000C000C000C000C00076 +:106A2000C000C000C000C000000000000000000066 +:106A30000000000000000000000000000000000056 +:106A40007C3CFF7EC7E383C183C183C183C183C113 +:106A500083C183C183C183C1000000000000000026 +:106A60000000000000000000000000000000000026 +:106A70009807F80F381C181818181818181818182C +:106A80001818181818181818000000000000000046 +:106A900000000000000000000000000000000000F6 +:106AA000C003F00F300C18181818181818181818F8 +:106AB0001818300CF00FC0030000000000000000A8 +:106AC00000000000000000000000000000000000C6 +:106AD000D803F80F380C18181818181818181818A0 +:106AE0001818380CF80FD8031800180018001800F0 +:106AF000180000000000000000000000000000007E +:106B0000C01BF01F301C181818181818181818185F +:106B10001818301CF01FC01B0018001800180018AF +:106B2000001800000000000000000000000000004D +:106B3000B007F0037000300030003000300030004B +:106B40003000300030003000000000000000000085 +:106B50000000000000000000000000000000000035 +:106B6000E003F003380E180C3800F003C007000CE7 +:106B7000180C380EF007E0030000000000000000D1 +:106B800000000000000000008000C000C000C00045 +:106B9000F007F007C000C000C000C000C000C00087 +:106BA000C000C000C0078007000000000000000017 +:106BB00000000000000000000000000000000000D5 +:106BC0001818181818181818181818181818181845 +:106BD0001818381CF01FE019000000000000000029 +:106BE00000000000000000000000000000000000A5 +:106BF0000C18180C180C180C300630063006600300 +:106C000060036003C001C00100000000000000003C +:106C10000000000000000000000000000000000074 +:106C2000C141C141C3616363636363633636363612 +:106C300036361C1C1C1C1C1C000000000000000040 +:106C40000000000000000000000000000000000044 +:106C50001C38381C300C600660036003600360035E +:106C60006006300C381C1C380000000000000000DA +:106C70000000000000000000000000000000000014 +:106C80001830301830187018600C600CE00CC0061A +:106C9000C00680038003800380018001C001F000F2 +:106CA0007000000000000000000000000000000074 +:106CB000FC1FFC1F000C000600038001C0006000E8 +:106CC00030001800FC1FFC1F000000000000000046 +:106CD00000000000000000038001C000C000C000F0 +:106CE000C000C000C00060006000300060004000D4 +:106CF000C000C000C000C000C000C0008001000390 +:106D000000000000000080018001800180018001FE +:106D1000800180018001800180018001800180016B +:106D2000800180018001800180018001800180015B +:106D30008001000000006000C000C00180018001EF +:106D400080018001800100030003000600030001B0 +:106D5000800180018001800180018001C00060000D +:106D60000000000000000000000000000000000023 +:106D700000000000F010F81F080F000000000000E5 +:106D80000000000000000000000000000000000003 +:106D900000000000001028002800011BFFFFFFFF7B +:106DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:106DB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:106DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:106DD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:106DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:106DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:106E0000FFFFFFFFFFFFFFFFFFFF3BFFD8FE76FE08 +:106E100034F614F614F6F4F515F697FE3BFFFFFF73 +:106E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:106E3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:106E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:106E5000FFFFFFFF7DFFF2F58EF54BEDC9EC47EC30 +:106E6000C5EBA5EB64EB24EB04EB25EB67EB0AEC3D +:106E70000FF57CFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:106E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:106E9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:106EA000BFFFEBEC29EDAAED6AED2AEDE9ECA9ECC8 +:106EB00048EC08ECC7EBA7EB66EB25EBE5EAA4EAA8 +:106EC00063EA42EA46EB7CFFFFFFFFFFFFFFFFFFA5 +:106ED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:106EE000FFFFFFFFFFFFFFFFFFFFFFFFBEFF90F56C +:106EF00004EC4AED6BED6BED4AED0AEDC9EC89EC63 +:106F000048EC07ECC7EB86EB66EB26EB06EBE5EA15 +:106F1000C5EAA4EA23EA80E94CF47CFFFFFFFFFF07 +:106F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:106F3000FFFFFFFFFFFFFFFFFFFFF9FE8AEC26ECDC +:106F4000C9EC0AED0AED0AED0AEDC9ECA9EC68EC12 +:106F500028ECE7EBA7EB86EB46EB26EB05EBE5EA47 +:106F6000C5EAA4EA84EA64EAC1E9A5EA35FEFFFFBE +:106F7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:106F8000FFFFFFFFFFFFFFFFD9FEA6EBE6EB69EC7B +:106F900089ECA9ECC9ECC9ECC9EC89EC68EC48ECCB +:106FA00008ECC7EBA7EB66EB46EB26EB05EBC5EA77 +:106FB000A5EAA4EA84EA64EA44EAE2E9C1E914F64B +:106FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:106FD000FFFFFFFFFFFFD9FE65EBA6EB08EC28ECF7 +:106FE00048EC68EC69EC89EC68EC48EC28EC08ECBF +:106FF000C7EBA7EB86EB66EB26EB05EBE5EAC5EA0C +:10700000A5EA84EA64EA64EA44EA43EA03EAA1E915 +:10701000F4F5FFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:10702000FFFFFFFFBEFFC8EB25EBA7EBC7EBE7EBCE +:1070300008EC28EC28EC28EC28EC08ECE7EBC7EB94 +:10704000A7EB86EB66EB46EB05EB05EBE5EAC5EA5D +:10705000A4EA84EA64EA44EA44EA23EA23EAC2E9C5 +:1070600043EA3BFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:10707000FFFFFFFF30F5A3EA66EB86EBA7EBC7EB5C +:10708000C7EBE7EBE7EBE7EBE7EBC7EBC7EBA7EB10 +:1070900086EB66EB46EB26EB05EBE5EAC5EAA5EAEF +:1070A00084EA84EA64EA44EA44EA23EA03EA03EA73 +:1070B00060E9CAEBFFFFFFFFFFFFFFFFFFFFFFFFDE +:1070C000FFFFFFFF20EA06EB46EB46EB86EB87EB84 +:1070D000A7EBA7EBA7EBC7EBA7EBA7EB86EB86EB42 +:1070E00066EB46EB26EB05EBE5EAC5EAC5EAA4EA62 +:1070F00084EA64EA64EA44EA24EA23EA03EA03EA63 +:10710000E3E920E15CFFFFFFFFFFFFFFFFFFFFFF61 +:10711000FFFF0FF542EA05EB05EB26EB46EB46EBEE +:1071200066EB66EB66EB66EB66EB66EB46EB46EB17 +:1071300046EB06EB05EBE5EAC5EAC5EAA4EA84EA14 +:1071400064EA64EA44EA43EA23EA03EA03EAE3E995 +:10715000E3E961E988EBFFFFFFFFFFFFFFFFFFFFB0 +:10716000FFFFE5EAA4EAE5EAE5EA05EB25EB26EB15 +:1071700046EB46EB46EB46EB46EB46EB26EB25EBC8 +:1071800005EB05EBE5EAC5EAA5EAA5EAA4EA84EA87 +:1071900064EA64EA44EA24EA23EA03EA03EAE3E964 +:1071A000E3E9E3E9E1E9FFFFFFFFFFFFFFFFFFFF87 +:1071B000FFFF43EAA4EAC5EAC5EAE5EA05EB05EB09 +:1071C00025EB25EB26EB26EB26EB25EB05EB05EB7C +:1071D000E5EAE5EAC5EAA5EAA5EA84EA84EA64EA1A +:1071E00064EA44EA24EA23EA23EA03EA03EAE3E955 +:1071F00003EAE3E9C2E91AFFFFFFFFFFFFFFFFFF1A +:10720000FAEE43EAA4EAA5EAC5EAC5EAC5EAE5EA70 +:10721000E5EA05EB05EB05EB05EBE5EAE5EAE5EA72 +:10722000C5EAC5EAA4EAA5EA84EA84EA64EA64EA6B +:1072300044EA43EA23EA23EA03EA03EAE3E903EA46 +:1072400003EAE3E981E9D5EDFFFFFFFFFFFFFFF769 +:1072500058DE23EA84EA84EAA4EAA5EAC5EAC5EA94 +:10726000C5EAC5EAC5EAE5EAC5EAC5EAC5EAC5EA86 +:10727000A5EAA5EAA4EA84EA84EA64EA64EA44EABC +:1072800044EA23EA23EA03EA03EAE3E9E3E9E3E978 +:10729000E3E9E3E9A1E953DDFFF7FFFFFFFF9EE725 +:1072A00038C643EA64EA84EAA4EAA5EAA4EAC5EA9D +:1072B000C5EAC5EAC5EAC5EAC5EAA5EAA5EAA4EAB7 +:1072C000A5EA84EA84EA64EA64EA64EA44EA44EA0D +:1072D00023EA23EA03EA03EA03EAE3E9E3E9E3E969 +:1072E000E3E9E3E9A2E933CD9FE7FFFFFFFF1CDFFE +:1072F00039BE83EA64EA84EA84EAA4EAA4EAA5EA55 +:10730000A5EAA5EAA5EAA5EAA5EAA5EAA4EAA4EA07 +:1073100084EA84EA84EA64EA64EA44EA44EA44EAFD +:1073200024EA23EA03EA03EAE3E9E3E9E3E9E3E938 +:10733000E3E9E3E9C2E975CDFDCEFFFFDFFF5AC601 +:107340003BB6C4EA44EA84EA84EA84EAA5EAA4EA09 +:10735000A4EAA4EAA4EAA4EAA4EAA4EA84EA84EAFD +:1073600084EA64EA64EA64EA44EA44EA23EA23EA4F +:1073700023EA03EA03EAE3E903EAE3E9E3E9E3E909 +:1073800003EAE3E9C2E9B7BD5ABEDFFFDFFFD8B5C4 +:107390007CA663EAA4EA84EA84EAA5EAA4EAA4EA69 +:1073A000A4EAA4EAA4EAA5EAA4EA84EA84EA84EACC +:1073B00084EA64EA64EA44EA44EA44EA23EA23EA1F +:1073C00003EA03EA03EAE3E903EAE3E9E3E903EAB8 +:1073D000E3E903EAC2E1F9B5B8ADBEF7BFF797AD8F +:1073E0003B9E24E205EB84EAA4EAA5EAA5EAA5EA25 +:1073F000A5EAA5EAA5EAA4EAA4EA84EA84EA84EA7A +:1074000064EA64EA64EA64EA44EA44EA23EA23EACE +:1074100003EA03EA03EA03EA03EAE3E9E3E9E3E967 +:1074200003EA23EA81E11AA677A5BEF7BEF776A59F +:10743000FA9D86D263F205EBA4EAC5EAC5EAC5EA7D +:10744000C5EAC5EAA5EAA5EAA5EAA4EA84EA84EAC7 +:1074500064EA64EA64EA64EA44EA44EA23EA23EA7E +:1074600003EA03EA03EA03EA03EAE3E903EA03EAD5 +:1074700023F2C3D9A2D91A96369DBEF79EF756A518 +:10748000B99D4BBBC1F105EB05EBE5EAE5EAE5EAA1 +:10749000C5EAC5EAC5EAC5EAA5EAA5EA84EA84EA36 +:1074A00084EA64EA64EA44EA44EA44EA24EA23EA2D +:1074B00023EA03EA03EA03EAE3E9E3E9E3E903F29F +:1074C000E3D941C966C2F995369D9EF79EF7359D71 +:1074D00098A53194A0F944EA66EB26EBE5EA05EBC2 +:1074E00005EB05EBE5EAC5EAC5EAA5EAA4EA84EA04 +:1074F00084EA84EA64EA44EA44EA44EA24EA24EABC +:1075000023EA03EA03EA03EAE3E9E3E923F2E3E136 +:1075100063B120D16D9BB89D56A59EF79EF7359D12 +:1075200077A51595E2D923F264EAA7EB66EB46EB63 +:1075300066EB46EB26EBE5EAC5EAA5EAA4EAA4EA8F +:1075400084EA84EA64EA64EA44EA44EA44EA23EA2C +:1075500023EA03EA03EA03EAE3E923FAE3D903A10E +:1075600043B100C9938C97A576ADBEF7DFFF55A553 +:10757000569D76A50BA302FA44EA64EA66EBC7EBD4 +:10758000C7EBA7EB66EB26EBC5EAC5EAC5EAA4EABA +:10759000A5EA84EA84EA64EA64EA44EA44EA43EA5B +:1075A00024EA03EA03EA03F203F283C1E29023A18F +:1075B00001C14892369D77A5D8BDDEFFFFFFD7BD3C +:1075C000369D77A531A466C223F264EA84EAE5EA2F +:1075D000C7EBE7EBA7EB46EBE5EAE5EAC5EAC5EA68 +:1075E000A5EAA4EA84EA84EA64EA64EA44EA24EACA +:1075F00023EA43F223F2C3D1E290A280029902A9C6 +:1076000064A1CF8B36A5B8AD9ACEDFFFFFFF99D628 +:1076100056A598A5B3ACAE9B23DA64F2A4EAA5EA1A +:10762000C5EA26EB66EB66EB46EBE5EAC5EAC5EA9A +:10763000A4EA84EA84EA64EA64EA64F264F284FA1A +:1076400023E2A3C123A18270A280E290029902A941 +:107650000C83529C77A559C6DBDEFFFFFFFF5DEF71 +:1076600056A5F9B5D4AC71B46D8B02F284F2A5EADB +:10767000C5EAC5EAA5EAA5E284E2C5E205EB05EBA9 +:1076800025EB25F305F3E5F2A4EA44DAC3C1239917 +:10769000C388A2808278A280C288E29080A0CB7A40 +:1076A000319C729C19BE7ACE3CEFFFFFFFFFFFFFBB +:1076B00058CEB8AD39C671B492BC6E8B64DA84F220 +:1076C000C5F2C5EAA5EA84EA44E203DAC3D183C974 +:1076D00062C102B102A1E298C290C288C288C28887 +:1076E000C288A288C280A280A288A290EC72529C1A +:1076F000119C97AD39C69ACEFFFFFFFFFFFFFFFF3A +:10770000BEF796AD7AC618CE30B450BCAE9BA7BAC1 +:1077100084E2A4FAA4EA64E244E223DAE3D1C3D126 +:10772000A3C163B943B123A903A10299E390C39014 +:10773000C288C2888288818045790D7BF09B10A425 +:10774000D4A496ADF8BD9EF7FFFFFFFFFFFFFFFF3C +:10775000FFFF3CE7B7B51DD7BBDE0FBCCEB3EFAB29 +:107760002BA365C263EA63F244E204DAE3D1C3D136 +:10777000A3C963B943B123A923A10299E298E29076 +:10778000A290618803796A7A6E8BCF9B11A4728C68 +:10779000B38C35A53CE7FFFFFFFFFFFFFFFFFFFFB7 +:1077A000FFFFFFFFBAD618BE7EE7BEEF55CDD2CCA5 +:1077B000B2CC8DB30BA367AA03D2E2E9C2D9A3D19D +:1077C00082C962C142B922A902A9E2A0A198C288D5 +:1077D00065796A7A2D8B8F93AFA311A48F6BD06BD1 +:1077E000928CDBDEFFFFFFFFFFFFFFFFFFFFFFFFCE +:1077F000FFFFFFFFFFFFDADE59C69EEFFFFFFFFF2F +:1078000018E6EEC38CC38DBB6CABEB9A88A247AA7B +:10781000E5A9C5A1A5A1A591C68907828A7AEC82AE +:107820002D934EA38EA38F934E73293A8B4A728C5D +:107830003CE7FFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10784000FFFFFFFFFFFFFFFF1BE779CE7DEFFFFF8D +:10785000FFFFFBEE95DD91CC8CCBE9C2EABAEABA28 +:10786000CAAAA9AAA9A2AAA2AA9AAAA2CBA26EABA4 +:10787000AF9B6E832D6B6A426629093AB394BEF7BB +:10788000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10789000FFFFFFFFFFFFFFFFFFFF9EF79AD6BAD65D +:1078A000FFFFFFFFFFFF7EEFDBDE39D655CDB2C411 +:1078B0002FC4EFC3EEBBEFB3F0AB109C118C6E6B1B +:1078C0000D5BAB4AE8310419EC5A38C6FFFFFFFFE5 +:1078D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:1078E000FFFFFFFFFFFFFFFFFFFFFFFFFFFF7DEF3A +:1078F00038C6FBDEBEF77EEF3DDFFCCE9BC63AB658 +:10790000D8A5779DD58C737CB06B4F630D53AC526B +:107910006B4A29420C6399D6FFFFFFFFFFFFFFFF71 +:10792000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10793000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10794000FFFF7DEFBAD69AD6BAD67ACE19BED8B591 +:1079500076A5F594938C127CB06BB06BAF733184C9 +:1079600055AD1CE7FFFFFFFFFFFFFFFFFFFFFFFF1E +:10797000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10798000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10799000FFFFFFFFFFFFFFFF9DF73CE71CE7DBDE7C +:1079A0009AD67ACE59CE59CE9AD6FBDE7DEFFFFF1E +:1079B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:1079C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:1079D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:1079E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:1079F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:107A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:107A1000FFFFFFFFFFFFFFFFFFFFFFFF001028003A +:107A20002800011BFFFFFFFFFFFFFFFFFFFFFFFF1E +:107A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:107A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:107A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:107A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:107A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:107A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:107A9000FFFFFFFFDCEFB8DF95D774CF73CF75D74B +:107AA00097DFDBEFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:107AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:107AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:107AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFF95D748 +:107AE0004DC707B708B708AF08A7E79EC796C68E69 +:107AF000A586A57EA47EE99653C7FEFFFFFFFFFF84 +:107B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:107B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:107B2000FFFFFFFFFFFFFFFFDDF74FC728BF6AD74B +:107B30004BCF4BC72ABF2AB709AFE9A6E89EC89624 +:107B4000C78EA786A786A67E8576836EEA96DBEF2C +:107B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:107B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:107B7000FFFFFFFFFFFF50C707AF4AC74BCF4BCFF9 +:107B80004BC72ABF2AB709AF09A7E8A6E89EC8963F +:107B9000C78EA786A786A67EA67E8676856E636636 +:107BA000EC9EFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:107BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:107BC000FFFFFDF7E8A608AF2AB72ABF2ABF2AC7DA +:107BD0002ABF2ABF0AB709AF09A7E89EE896C89648 +:107BE000C78EC786A786A77E867E86768676866EB1 +:107BF0006466646EBAE7FFFFFFFFFFFFFFFFFFFF52 +:107C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:107C1000DBEFC596E8A609AF09B72AB72AB72AB796 +:107C20002AB70AB709AF09A7E9A6E89EC896C78E82 +:107C3000C78EA786A786A67EA67E86768676866E61 +:107C4000856E6566425E97D7FFFFFFFFFFFFFFFF70 +:107C5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDDF75E +:107C6000A58EE89EE89E09A709AF09AF09AF09AF45 +:107C700009AF09AF09A7E9A6E89EE896C896C78E9E +:107C8000A786A786A77EA67EA67686768676866E49 +:107C9000866E656E65664256B9E7FFFFFFFFFFFF20 +:107CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFC68E8E +:107CB000C78EC896E89EE89EE9A609A709A709A766 +:107CC00009A7E9A6E89EE89EE896C896C78EC78EE3 +:107CD000A786A786A67EA67E867686768676866E1A +:107CE000856E856E65666566635EFFFFFFFFFFFF5D +:107CF000FFFFFFFFFFFFFFFFFFFFFFFF30B7A6867D +:107D0000C78EC896C896E896E89EE89EE89EE89ECC +:107D1000E89EE89EE89EC896C896C78EC78EA7863E +:107D2000A786A77EA67EA67686768676866E856EE2 +:107D3000656E856E65666566445ECA8EFFFFFFFFF1 +:107D4000FFFFFFFFFFFFFFFFFFFFFFFF8476A78618 +:107D5000C78EC78EC88EC896C896E896E896E896ED +:107D6000E896C896C896C88EC78EC78EA786A7867F +:107D7000A77EA67E867E867686768676866E856EDB +:107D8000656E65666566656665664256BAE7FFFFBD +:107D9000FFFFFFFFFFFFFFFFFFFF52BF8576A786B4 +:107DA000A786C786C78EC78EC78EC88EC896C89648 +:107DB000C88EC78EC78EC78EC78EA786A786A77E9A +:107DC000A67EA67E867686768676866E856E656EBD +:107DD000856E6566656665666566445EEC9EFFFF5A +:107DE000FFFFFFFFFFFFFFFFFFFFC88E867EA77E1E +:107DF000A786A786A786C786C78EC78EC78EC78E5B +:107E0000C78EC78EC786A786A786A786A77EA67EAB +:107E1000A67EA676867686768676866E856E656E74 +:107E200065666566656665666566655E6366FFFFD1 +:107E3000FFFFFFFFFFFFFFFFFFFF636E867EA67E53 +:107E4000A67EA77EA786A786A786A786A786A786DB +:107E5000A786A786A786A786A77EA77EA67EA67EDC +:107E60008676867686768676866E856E656E856E75 +:107E7000656665666566656665666566435EDCEFD4 +:107E8000FFFFFFFFFFFFFFFF7CEF846E8676A67E7D +:107E9000A67EA67EA67EA77EA77EA786A786A786A5 +:107EA000A786A77EA77EA67EA67EA67E867E8676EF +:107EB000867686768676866E866E656E856E656655 +:107EC000656665666566656665666566435E37CF49 +:107ED000FFFFFFFFFFFFFFFFB9CE846E8676867639 +:107EE0008676A67EA67EA67EA67EA67EA67EA67E9A +:107EF000A67EA67EA67EA67EA67E867686768676DA +:107F000086768676866E866E856E856E6566656615 +:107F1000656665666566656665666566635E94B694 +:107F2000FFFFFFFFFFFF7EEF79C6846E86768676C1 +:107F300086768676A676A67EA67EA67EA67EA67E79 +:107F4000867E867E867E8676867686768676867639 +:107F50008676866E856E856E856E656665666566F7 +:107F6000656665666566656665666566635E75B663 +:107F70003EE7FFFFFFFFDBD63BC6A476867686761C +:107F80008676867686768676867EA67EA67EA67E91 +:107F9000A676A676A67686768676867686768676A1 +:107FA000866E866E656E856E656E656665666566EF +:107FB000656665666566656665666566635E57B631 +:107FC0007BCEFFFFFFFF19BE1BC6A57686768676A1 +:107FD00086768676A676A676A676A6768676867641 +:107FE0008676867686768676867686768676866EB9 +:107FF000866E856E856E656E6566656665666566A8 +:10800000656665666566656665666566635E19BE16 +:10801000F9B5FFFFFFFFB7ADDABD877E86768676BE +:10802000867686768676A676867686768676867650 +:10803000867686768676867686768676866E866E70 +:10804000866E856E656E856E656665666566656657 +:10805000656665666566656665666566635EDABD06 +:10806000D8ADDFFFFFFF77A599B5276EC786867667 +:108070008676867EA67EA67EA67E867686768676A0 +:10808000867686768676867686768676866E866E20 +:10809000856E656E856E6566656665666566656630 +:1080A000656665666566656665668566E35599B568 +:1080B00097ADBEF7DFFF56A578ADE96DA676A77E32 +:1080C000867EA67EA67EA67EA67EA67E867E8676F8 +:1080D000867686768676867686768676866E866ED0 +:1080E000856E856E656E65666566656665666566E0 +:1080F00065666566656665668566E45DC55D79ADE0 +:1081000077A59EF7BEF7369D58A58C758466C78EF9 +:10811000A67EA77EA77EA67EA67EA67EA67EA67E3D +:10812000A67E86768676867686768676866E866E57 +:10813000856E856E856E656665666566656665666F +:1081400065666566656685662566634D886558ADB6 +:10815000369D9EF79EF7359D77A5F184A4666566EA +:10816000C896A786A786A786A786A786A67EA67E88 +:10817000A67EA6768676867686768676866E866EE7 +:10818000866E856E656E656E656665666566656636 +:108190006566656685664566C344A34DED7458A55E +:1081A000369D9EF7BEF7159D77A5F5942566856EDD +:1081B000656EE89EC78EC78EC78EC78EA786A67EC1 +:1081C000A67EA67E86768676867686768676866E87 +:1081D000866E866E856E856E656E6566656665669D +:1081E0006566A566255E623C0345824D938C77A546 +:1081F00076ADBEF7FFFF159D77A576A5EB6CA46E57 +:10820000866E866EC88EE89EE89EE896C88EA78623 +:10821000A67EA67EA67EA6768676867686768676E6 +:10822000866E866E856E856E856665666566856614 +:10823000C56E444D022CA33C2245885C359D569D5D +:10824000F8BDDFFFFFFF96B557A576A5F28CC66592 +:10825000A56E86768676A77EE89EE99EC896C78636 +:10826000A77EA67EA67EA67EA6768676867686766D +:10827000866E866E856E656E856E856EC56E045ED5 +:10828000E22BC22B4234A23CC344707C559DB8AD56 +:1082900059CEFFFFFFFF9AD6369D77ADB3958F7C01 +:1082A0006566A6768676A67EA67EA786C88EC896C2 +:1082B000A786A77EA67EA67EA67E8676867686760C +:1082C0008676866EA66EA66EC676A45502344123C7 +:1082D000A12B022C4234A134ED63328D56A59BCEE6 +:1082E0009AD6FFFFFFFFBEF735A5F9B5749DB2958D +:1082F0006D74656EA676867EA67EA67E867666768A +:108300006676667E867EA77EA786C786C77EA67EA1 +:10831000667605666455833C812381238123A123EE +:10832000C22B022C4134CB5B1185138D19BE59C66B +:108330009EF7FFFFFFFFFFFF59CEB8AD3AC6918D04 +:10834000B2956E74256EC67EA67EA67E867666760D +:10835000456E0566E45DA455444D0345A33C623477 +:1083600022340234E22BE22BC22BC22BA12BA12BF5 +:10837000E12BE12BAB5BF184F07C97AD39C679CE74 +:10838000FFFFFFFFFFFFFFFFDFFF96AD7BC699C634 +:108390009085D18DAF7C4865C57EA67E8676667653 +:1083A000456E2566E55DC45D6455244DE344A33CFC +:1083B000623C42342234022CE22BC22BC12BC0235C +:1083C0008433ED63F07C107D349597B5D7BDBEF74F +:1083D000FFFFFFFFFFFFFFFFFFFF3CE7B7B5FCD646 +:1083E000FBD6908DB08D70858C6CA76DC576856E33 +:1083F000656E2566E55DA4558455444DE344A33C74 +:10840000623C42342234022CE12BE123832B894B42 +:108410006E74EF7C107DD28C939455A53CEFFFFFDA +:10842000FFFFFFFFFFFFFFFFFFFFFFFFDBDE19BEC8 +:108430005EE79FF775AE54A6329E6F85AC6C2865DB +:10844000A5654466045EE4558455434D0345C23C2E +:10845000823C6234212CC233853BAA534D6CAE74EE +:10846000EE74F0848F6BD073938CFBE6FFFFFFFFFD +:10847000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDBDE51 +:1084800039C6BFF7FFFFFFFFF8C6AD7DCE7DAE7DDD +:108490004D75CB6CC95CC75CA654854C65442544BE +:1084A000E643E74BEA534B648C6CAD6CCD6CF07CCF +:1084B0006D632A42CC5231843CE7FFFFFFFFFFFF90 +:1084C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:1084D0003CE738C6FFFFFFFFFFFFDFFFD6BEEF8D93 +:1084E000AB75AC75AC758B754B6D2A6DEA64CA645F +:1084F000CA64CB64CB64CB640E758F7C6E63E83941 +:10850000C831E839B394BEF7FFFFFFFFFFFFFFFF5D +:10851000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:10852000FFFFDFFF59CEFBDEFFFFFFFFFFFFBFFFB7 +:108530005DE7B8C654AE1196F08DAF858E856F8518 +:108540002F85F084907CF073ED5A4A4A093A8629C7 +:10855000CB5A9AD6FFFFFFFFFFFFFFFFFFFFFFFF92 +:10856000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:10857000FFFFFFFFFFFF7DEF79CEFBDE9EF77EEF73 +:108580003DDFDCD67BCEFABD98AD37A5B5943384FC +:10859000B1734F630E5BCC526B4A09426E6B38C6A7 +:1085A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:1085B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:1085C000FFFFFFFFFFFFFFFFFFFFBEF7DBDE7ACEFF +:1085D0007ACE59C639BED8B577A515959384F1736F +:1085E0006F632E5B6F6B318476AD5DEFFFFFFFFF36 +:1085F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:10860000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10861000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:10862000DFFF7DEF1CE7DBDE9AD679CE59CE7ACE1E +:10863000DBDE7DEFDFFFFFFFFFFFFFFFFFFFFFFF41 +:10864000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:10865000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:10866000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:10867000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:10868000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10869000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:1086A000FFFFFFFF0010A0005700011BFFFFFFFFAF +:1086B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:1086C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:1086D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:1086E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:1086F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10870000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10871000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10872000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10873000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10874000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:10875000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:10876000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:10877000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:10878000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:10879000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:1087A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:1087B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:1087C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:1087D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:1087E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:1087F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10880000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10881000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10882000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10883000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10884000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10885000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10886000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10887000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10888000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:10889000FFFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFEF +:1088A000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:1088B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:1088C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:1088D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:1088E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:1088F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10890000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10891000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10892000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10893000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:10894000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:10895000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10896000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10897000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10898000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10899000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:1089A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:1089B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:1089C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:1089D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:1089E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:1089F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:108A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:108A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:108A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:108A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:108A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:108A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:108A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:108A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:108A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:108A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:108AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:108AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:108AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:108AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:108AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:108AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:108B0000FEFFFEFFFEFFFFFFFFFFFEFFFFFFFEFF7A +:108B1000DFFFDFFFDFFFFFFFFFFFDFFFFFFFDFFF05 +:108B2000DFFFFFFFFFFFDEFFDEFFFFFFDEFFFEFFD9 +:108B3000FFFFFFFFFEFFFEFFFEFFFEFFFEFFFEFF4B +:108B4000FEFFFEFFFEFFFEFFFEFFFEFFFFFFFEFF3C +:108B5000FEFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF46 +:108B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:108B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:108B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:108B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:108BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:108BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:108BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:108BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:108BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:108BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:108C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:108C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:108C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:108C3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:108C4000FEFFFEFFFFFFFFFFFFFFFFFFFFFFDFFF56 +:108C5000FEFFFEFFFEFFFEFFFEFFFEFFFEFFFDFF2D +:108C6000FEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFF1C +:108C7000FEFFFEFFFDFFFDFFFDFFFDFFFDFFFDFF12 +:108C8000FDFFFDFFFDFFDFFFFFFFFFFFFFFFFFFF1A +:108C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:108CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:108CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:108CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:108CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:108CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:108CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:108D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:108D1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:108D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:108D3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:108D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:108D5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:108D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:108D7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:108D8000FFFFFFFFDFF7DFF7DFF7FFFFDFF7FFFF93 +:108D9000FFF7FEF7FEF7FEF7FFF7FEF7FEF7FFFF20 +:108DA000DEEF5EE77FE77FE75EE75EDF5EE75FE7D8 +:108DB0007FE75FE77EE79EE7FFF7FFF7FFF7FFF745 +:108DC000FFF7FFF7FFF7DFF7FFFFDFF7DFF7FFF74B +:108DD000DFF7FFFFFFFFDFF7FFFFFFFFFFFFFFFFF3 +:108DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:108DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:108E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:108E1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:108E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:108E3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:108E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:108E5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:108E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:108E7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:108E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:108E9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:108EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:108EB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:108EC0009EEF5DE71CDFBBCE9BCE5BC699AD58A580 +:108ED000B78C377CF673F673F673F673D56BB56B98 +:108EE0009463335B335B1253F2521353535B13534C +:108EF0001353335B1153525BB363B363B363B36315 +:108F0000B363F46B1574B794189D38A51BBE7BCE64 +:108F1000BBD6DBD61CDF7DEFBEF7FFFFFFFFFFFFF9 +:108F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:108F3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:108F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:108F5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:108F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:108F7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:108F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:108F9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:108FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:108FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:108FC000FFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFB2 +:108FD000FFFFFFFFFFFFFFFFFFFFFFFFDDFFFEFFC4 +:108FE000FEFFFEFFFEFFFEFFDDF7FEF7FEF7FFF7D9 +:108FF000DFEFBEE77EDF5EDF3CB618951674B46324 +:10900000765B55539563B563167416741574357491 +:10901000D373B273926B716BF27B127C127C327CD5 +:10902000738497ADD7B5D7B5D8B5F8B519BEF8B52F +:109030009ACE5DE77DEF7DEF7DEF7DEF7DEF1CE765 +:1090400038C6F7BDF7BDD8B5D9B556A55384F27B60 +:10905000D173B16B916BEE5A2F63D273B59499AD06 +:109060005CC63EE73EE7BFF7BFF7BFF7BFFFBFF7FE +:10907000DFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:10908000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10909000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:1090A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:1090B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:1090C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:1090D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:1090E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:1090F000FFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFF82 +:10910000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10911000FFFFFFFFFFFFFEFFFEFFFEFFDDFFFEFF85 +:10912000FEFFFFFFFFFFFFF7BFEFFFD699A53684D5 +:1091300073637363B573B573387C387CF773B66B40 +:1091400093631153726314741895DBB55CC67FE7A3 +:109150009FEFBFF7DFF7DFF7DFF7DFF7FFFFFFFF77 +:10916000DFF7DFF7DFF7DFF7FFFFDFF7DFF7DFF727 +:10917000DFF79EEFFFFFFFFFFFFFFFFFBEF7BEF72A +:10918000DFFFDFFFBEF7DFF7DFF7DFF7FFF7FFF700 +:10919000FFFFDFF7FFF7BFEFDFF7DFF7BEF77EE791 +:1091A0007BC6D8B5F59CD1731184728C97B5DBDE84 +:1091B0007EEFFFFFFFFFFFFFBEF7FFFFFFFFFFFF99 +:1091C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:1091D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:1091E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:1091F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:10920000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10921000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:10922000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:10923000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:10924000FFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFF4E +:10925000FFFFFFFFDFFFFFFFFFFFFFFFFFF7FDD671 +:10926000D9ADF694357CD46BB56B377C387C3784BC +:10927000B573546B746BB473F99C9BAD7DCEDDD626 +:109280005DE7BFF7FFFFDFF7FFFFFFFFFFFFFFFF18 +:10929000DFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF1E +:1092A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:1092B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:1092C000DFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFCF +:1092D000FFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFBE +:1092E000FFFFDFF7DFF7DFF7DFFF7EF71CE7DBDEEF +:1092F0009AD618C6D7BD38C659CEDFFFFFFFFFFF8D +:10930000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:10931000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:10932000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:10933000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:10934000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:10935000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:10936000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10937000FFFFFFFFFFFFFFFFFFFFDFFFDFFFFFFF3D +:10938000FFFFFEFFFEFFFFFFFFFFFEFFFEFFFFFFF1 +:10939000FFFFDFF7DFF71FDFBAAD978CD56BF56BFB +:1093A000167415741574D46BB363357CF894D9AD09 +:1093B0007BC6FDD67EEFDEF7FEFFFEF7FDFFFDFF6D +:1093C000DEFFFEFFFEFFFEFFFEFFDEFFFEFFDEFF15 +:1093D000FEFFFEFFFEFFFFFFFEFFFFFFFFFFFFFFA1 +:1093E000FFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFAD +:1093F000FFFFFFFFFFFFFFFFFFFFFFFFDFFFDFFFBD +:10940000FFFFDFFFDFFFFEFFFEFFFEFFFEFFFEFFB1 +:10941000FEFFFEFFFEFFFEFFFEFFFFFFFEFFFEFF63 +:10942000DEFFFFFFDEFFFEFFDFFFDFFFFFFFDFFFEF +:10943000DFFFDFFFDFFFBEF77DEFFFFFFFFFFFFF77 +:10944000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:10945000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:10946000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:10947000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10948000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10949000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:1094A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:1094B000FFFFFFFFFFFFFFFFDFFFDFFFFFFFFFFFFC +:1094C000FEFFFEFFFEFFFEFFFEFFFFF7DFF75EE79A +:1094D0005BC6589D357C7463D673187CD66BF67367 +:1094E0001674F894B9AD7BC69FE7FFF7FFF7FFFF4F +:1094F000FFF7FFF7FEFFFEFFFDFFFDFFFDFFFDFF96 +:10950000FEFFFEFFFEFFFEFFFEFFFEFFFEFFFFFF72 +:10951000FEFFFEFFFEFFDEFFFFFFFFFFFFFFFFFF7F +:10952000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:10953000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:10954000FFFFFFFFFFFFFEFFFEFFFFFFFFFFFFFF2D +:10955000FEFFFFFFFFFFFEFFFFFFFFFFFFFFFFFF1D +:10956000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:10957000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:10958000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:10959000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:1095A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:1095B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:1095C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:1095D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:1095E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:1095F000BEF7FFFFFFFFFFFFFFFFFEFFDEF7DEF717 +:10960000FFFFFFFFDFF7BFEF5DE7BBAD367C7263A7 +:10961000D46B567C3574D46BD46BF88C5BC65FE727 +:10962000FFF7FFF7FFF7FFFFFFFFFEFFFEFFFFFF64 +:10963000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:10964000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:10965000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:10966000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:10967000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10968000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10969000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:1096A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:1096B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:1096C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:1096D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:1096E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:1096F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10970000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10971000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10972000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10973000FFFFFFFFFFFFFFFFFEFFFCFFFDF7DFF76F +:10974000FFF75FE7D794F15A946B387C7984956B77 +:10975000535B96849DC6FFF7DFEFFFF7FCF7FDF73D +:10976000DDF7FDFFFEFFFFFFFFFFFFFFFFFFFFFF36 +:10977000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:10978000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:10979000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:1097A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:1097B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:1097C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:1097D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:1097E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:1097F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10980000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10981000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10982000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10983000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10984000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10985000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10986000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10987000DFFFFFFFDFFFDFFFFFF7FFF73EDF75844E +:10988000936BD5735784D46B7263147C3CBE5EE7D4 +:10989000BFEFDFF7DFF7BEF7DEF7FEFFFEFFFEFFED +:1098A000DDFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:1098B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:1098C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:1098D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:1098E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:1098F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10990000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10991000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10992000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:10993000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:10994000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10995000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10996000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10997000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10998000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10999000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:1099A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:1099B000FFFFBEF7FFFF1CE778ADF57BB673187CA1 +:1099C000D873966B77845BBE5EDFFDF7FDFFFDFF0E +:1099D000FEFFDEFFFEFFDFFFDFFFBFFFDFFFDFFF7A +:1099E000DFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFA9 +:1099F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:109A0000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFF68 +:109A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:109A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:109A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:109A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:109A5000FFFFFEFFFEFFFEFFFFFFFFFFFFFFFFFF19 +:109A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:109A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:109A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:109A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:109AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:109AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:109AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:109AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFB6 +:109AE000DFFFDFFFFFFFFFFFDFFFDFFFFFFFDFF72E +:109AF0009EE77BC6557CB563F773387CF673F473C9 +:109B000077A53DE7FFFFDEFFDEFFFFFFFFFFFFFF63 +:109B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:109B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:109B3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:109B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:109B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:109B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:109B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:109B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:109B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:109BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:109BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:109BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:109BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:109BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:109BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:109C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:109C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFBEFF95 +:109C2000FFFFFFFFFFFFFEFFFDFFDEF75DE778A50B +:109C3000B36BB46B7884377CF5735584FAB5FFF752 +:109C4000DFF7FFFFDFFFDFFFFFFFFFFFFFFFFFFF8C +:109C5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:109C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:109C7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:109C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:109C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:109CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:109CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:109CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:109CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:109CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:109CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:109D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:109D1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:109D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:109D3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:109D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:109D5000FFFFFFFFFFFFFFFFFFFFFEFFFEFFFEFF16 +:109D6000FEFFFFFFBEEFFFF7BEEF97A53063F67370 +:109D70005884F67B3363F89C9FEFFFFFDEF7FFFF0D +:109D8000FEFFFFFFFFFFDFFFFFFFFFFFFFFFFFFF04 +:109D9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:109DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:109DB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:109DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:109DD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:109DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:109DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:109E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:109E1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:109E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:109E3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:109E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:109E5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:109E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:109E7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:109E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:109E9000FFFFFFFFFFFFFFFFFEFFFEFFFEFFFEFFD6 +:109EA000DEF7DFF79EE7F694B363367C998CF673A2 +:109EB0003363DBB5BFF7FFFFFEFFFEFFFEFFFEFFD4 +:109EC000FEFFDEFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:109ED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:109EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:109EF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:109F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:109F1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:109F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:109F3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:109F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:109F5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:109F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:109F7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:109F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:109F9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:109FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:109FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:109FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:109FD000FFFFFFFFFFFFFEFFFEFFFEFFFFFFFFFF94 +:109FE0007FE7179DD473167C5A7CF773B46BFAB570 +:109FF0007FEFFFF7FEFFFDFFFEFFFFFFFFFFFFFF0D +:10A00000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:10A01000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:10A02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:10A03000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:10A04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:10A05000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:10A06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:10A07000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10A08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:10A09000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:10A0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:10A0B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10A0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10A0D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:10A0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10A0F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:10A10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:10A11000FFFFFFFFFFFFDEFFFFFFDFF7BFEFB9AD80 +:10A12000F473167C377C3884D5739AA57EE7DEF706 +:10A13000FEF7FEFFFFFFFFFFDFFFFFFFFFFFFFFF59 +:10A14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:10A15000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:10A16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:10A17000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:10A18000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:10A19000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:10A1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:10A1B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:10A1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:10A1D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:10A1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:10A1F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10A20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:10A21000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:10A22000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:10A23000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:10A24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:10A25000FFFFFFFFFFFFDFF7DFF7DDD6968CD4733C +:10A2600037843784D573978C3EE7FFFFFEF7FDFFF9 +:10A27000FDFFFFFFDFFFDFFFDFFFFFFFFFFFFFFF50 +:10A28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:10A29000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:10A2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:10A2B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:10A2C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:10A2D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:10A2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10A2F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10A30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:10A31000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:10A32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:10A33000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:10A34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:10A35000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10A36000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10A37000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:10A38000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:10A39000FFFFFFFFFFFF9EEF1AB692639884377CA2 +:10A3A000167C147CFDDEFFF7FEFFDEFFDEFFDEFF26 +:10A3B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:10A3C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:10A3D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:10A3E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:10A3F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:10A40000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:10A41000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:10A42000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:10A43000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:10A44000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:10A45000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:10A46000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10A47000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10A48000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:10A49000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:10A4A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10A4B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:10A4C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:10A4D000DFFFBEF7BEF7127C147C7784577C956350 +:10A4E0005AA5DFF7DFF7FFFFFFFFFFFFDFFFDFFF0B +:10A4F000FFFFFFFFFEFFFDFFFDFFFEFFFEFFFEFF74 +:10A50000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:10A51000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:10A52000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:10A53000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:10A54000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:10A55000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:10A56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:10A57000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:10A58000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:10A59000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:10A5A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:10A5B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:10A5C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:10A5D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:10A5E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:10A5F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:10A60000FFFFFFFFFDFFFFFFDFFFFFFFDEF7FEFFA6 +:10A61000DFF77CC6B573597C3774567CD273DCD6B1 +:10A62000FFFFDFF7FFFFDEFFFFFFFFFFFFFFFFFF83 +:10A63000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:10A64000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:10A65000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:10A66000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10A67000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10A68000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:10A69000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10A6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10A6B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10A6C000FFFFFEFFFEFFDDF7FEFFBEF7FFFFDFFF30 +:10A6D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10A6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10A6F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:10A70000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10A71000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10A72000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:10A73000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:10A74000FFFFFFFFFFFFFFFFFFFFFFFFDEF7DFF76A +:10A7500078ADD5733884577C1574D794DFF7FFFF35 +:10A76000DFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:10A77000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:10A78000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:10A79000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:10A7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10A7B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10A7C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10A7D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10A7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10A7F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10A80000FFFFFFFFFFFFDFF7DFF7DFF7FFFFDFFFF0 +:10A81000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10A82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10A83000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10A84000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10A85000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10A86000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:10A87000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:10A88000FFFFFFFFDFFFFFFFDEF7FEFFBEEF379D9D +:10A89000F57358845984147499ADDFF7DFF7DFF747 +:10A8A000FFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFD8 +:10A8B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:10A8C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:10A8D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10A8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10A8F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10A90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10A91000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:10A92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:10A93000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10A94000FFFFFFFFFFFFBFEF7BC677ADD394BEF7DE +:10A95000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10A96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10A97000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10A98000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10A99000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10A9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10A9B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:10A9C000FFFFFFFFDFFFFFFFFEF75DDF337C377C1C +:10A9D000387C1774D46BDCD6DFF7FFFFFFFFFFFF77 +:10A9E000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:10A9F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10AA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:10AA1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:10AA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:10AA3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:10AA4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:10AA5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:10AA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:10AA7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:10AA8000DFFFDFF7DFF71674315B4F5BFCD6DEF7D5 +:10AA9000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10AAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:10AAB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:10AAC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:10AAD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:10AAE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:10AAF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:10AB0000DFFFFFFFDFF7FFF7DFF7347C387C3A7CAD +:10AB1000397C9363DCCEDFFFFFFFFFFFFFFFFFFF0A +:10AB2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:10AB3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:10AB4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:10AB5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:10AB6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:10AB7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:10AB8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:10AB9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:10ABA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:10ABB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFC5 +:10ABC000BFF7FFFF948C545B315BFED69FEFFFFF16 +:10ABD000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:10ABE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:10ABF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:10AC0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:10AC1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:10AC2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:10AC3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:10AC4000FFFFFFFFDEF7DFF71374D56B5B843A7C01 +:10AC500054637EE7FEF7FEFFFEFFFEFFFFFFFFFFF0 +:10AC6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:10AC7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:10AC8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:10AC9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:10ACA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:10ACB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:10ACC000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:10ACD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:10ACE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:10ACF000FFFFFFFFFFFFFFFFDFFFDFFFDFF7FFFFCC +:10AD00009FEFFAB50F5B7263FED6DFF7FFFFFFFF21 +:10AD1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:10AD2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10AD3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:10AD4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:10AD5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:10AD6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:10AD7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF03 +:10AD8000DFFFDFFFBFEF147C16747984397CB56B6D +:10AD90009CCE7DE7DDF7FFFFFFFFFFFFFFFFFFFF1B +:10ADA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:10ADB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:10ADC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:10ADD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:10ADE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:10ADF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:10AE0000FFFFFFFFFFFFDFF7FFFFFFFFFFFFFFFF7A +:10AE1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:10AE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:10AE3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFF74A +:10AE40007BC6305B9263FDD6BFEFDFF7DFF7FFFF16 +:10AE5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:10AE6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:10AE7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:10AE8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:10AE9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:10AEA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:10AEB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:10AEC000BEF7BEF756841774597C387CF46B97A58F +:10AED000DFF7FFFFDFFFFFF7FFFFFFFFFFFFFFFFD2 +:10AEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:10AEF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:10AF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:10AF1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:10AF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF51 +:10AF3000DFFFDFFFDFFFDFFFDFFFDFFFDFFFDFFF21 +:10AF4000FFF7FFF7FFF7FFF7FFFFFFFFFFFFFFFF31 +:10AF5000FFFFFFF7FFF7FFF7FFF7FFF7FFF7FFF739 +:10AF6000FFF7FFF7FFFFFFFFFFFFFFF7FFF7FFF719 +:10AF7000FFF7FFF7FFF7FFFFFFFFDFF7DFF79CCEDD +:10AF8000505B31533ED7FEF7FFFFDFFFDFFFFFFFD0 +:10AF9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:10AFA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:10AFB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:10AFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:10AFD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:10AFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:10AFF000FFFFFFFFFFFFFFFFFFFFFFFFDEFFBEF7CB +:10B00000FFFF57A5F7735A84187C367CD58CFEF762 +:10B01000BDF7DFFFDFFFFFFFFFFFFFFFFFFFFFFFCA +:10B02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:10B03000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:10B04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:10B05000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:10B06000FFFFFFFFFFF7FFFFFFFFFFFFFFFFFFF700 +:10B07000DFF79EEF9EE73DDF1CDF1CD71CDF1CD7F0 +:10B08000FCCE9AC639B639B639B639B639B639B6FC +:10B0900039B639B619B639B63AB63AB63AB63AB654 +:10B0A0003AB639B639B639B639B639B659B639B607 +:10B0B0003AB63AB61BAE7CBEDECE1ED7FED6716364 +:10B0C000B2635FD7BFE7DEF7DEF7FFFFFFFFFFFFEB +:10B0D000DFFFDFFFFFFFFFFFFEFFFEFFFFFFFFFFC2 +:10B0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:10B0F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:10B10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:10B11000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:10B12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:10B13000FFFFFFFFFFFFFFFFFFFFFEFFFEFFFFF729 +:10B140007CC6D56B597C1774167CD3733DE7DFFF43 +:10B15000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:10B16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:10B17000BEF7FFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10B18000FFFFFFFFFFFFFFFFDFF7DEF7DFF7DFF770 +:10B19000FFFFDFFFFFFFDFF79EEF9EEF9EEF1CD765 +:10B1A0005DDFFCCE7ABE59BEF8B5B7AD559D779D33 +:10B1B00077955695779D19AED8A5D8A5F9ADF9A57F +:10B1C0001AA61AA619A619A61AA61AA61AA61AA681 +:10B1D0001AA61AA61AA61AA61AA698959895989528 +:10B1E00098959895778D778D788D988D788D998DA8 +:10B1F000998D9A8D9A8DBB9539853A8D735BB46321 +:10B200001A959042535B915B136C17955CBEFDD60B +:10B210007EE7BFF7DFF7BFF7FEFFFEFFFEFFFFFF92 +:10B22000DFFFFFFFFFFFDFFFFEFFFFFFFFFFFFFF6F +:10B23000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:10B24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:10B25000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:10B26000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:10B27000FFFFFFFFFFFFFFFFFFFFFFFFFFFFBFEF2E +:10B28000D373587C397C587CF5735BC6FFFFFFFF96 +:10B29000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:10B2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:10B2B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:10B2C000FFFFDFFFBEF73CE77DEF18BE38C69ACE22 +:10B2D00059C6D7B5D7B559C69ACEFBDEFCD6DFF72F +:10B2E000BFEFDFF7FFF7DFF7DFF7FFF7FFF7FFF756 +:10B2F000FFF7DFEFFFF7FFF7FFF7FFF7FFF7FFF7C6 +:10B30000FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF78D +:10B31000FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF77D +:10B32000DFEFFFEFDFE7DFE7FFEFDFE73DD7FCC64B +:10B330003AAEB8A5F79DB6959795D2639363577CBF +:10B340001453F4521553365316531553545B32535A +:10B3500010530F4BD1631695BDCE9FEFDFF7FFFF64 +:10B36000DFF7FFFFFEFFFEFFFEFFFEFFFFFFFFFF19 +:10B37000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:10B38000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:10B39000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:10B3A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:10B3B000FFFFFFFFFFFFFFFFFFFFDFFFDFFFF37375 +:10B3C000367C587C587C577CF373DFF7FFFFFFFF18 +:10B3D000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10B3E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:10B3F000DFFFBEF7DFFF7DEF5DE71BDF1CDF3CE714 +:10B40000FBDE1CDF9DEF7DEFBEF7BEF7DFF7FFFF32 +:10B41000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:10B42000FFFFFFFFDFF7FFFFFFFFFFFFFFFFFFFF54 +:10B43000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:10B44000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:10B45000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10B46000FFFFFFFFFFFFFFFFDEF7DEF7FFF7FFFF46 +:10B47000DFF7DFF7FFEFFFEF517412741ED79AA5C5 +:10B480005684B56B125BD54AF65236533553555335 +:10B49000334B13433343534B13531253B46B389D05 +:10B4A000FED6FFF7FEF7DDF7FEFFFFFFFFFFFFFF12 +:10B4B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:10B4C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:10B4D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:10B4E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:10B4F000FFFFFFFFFFFFFFFFDFFFDFF7FABDD373A3 +:10B50000587C397C377CB46BFDD6DFF7FFFFFFFF3B +:10B51000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:10B52000FFFFFFFFFFFFFFFFFFFFFFFFDFFFBEF794 +:10B530009EF77DEFDFFFBEF7DFF7DFF7FFFFDFFFEF +:10B54000FFFFDFFFDFF7FFFFFFFFFFFFFFFFFFFF53 +:10B55000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:10B56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:10B57000FFFFFFFFFFFFFFFFFEFFFFFFFFFFFEFFDD +:10B58000FFFFFFFFFEFFFEFFFFFFFFFFFFFFFFFFCD +:10B59000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFBC +:10B5A000FEFFDFFFDFFFFFFFFEFFDEFFFEFFFEFF10 +:10B5B000FEFFFEFFBFEF169D948C7FEFDFF7DFF7F6 +:10B5C000FFF7DEEF9EE7BDCE9AA5156C3253134B05 +:10B5D000354B364B374B374B365336531553135386 +:10B5E000525BF3733AB6BFEFFFFFFFFFFFFFFEFFB3 +:10B5F000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:10B60000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:10B61000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:10B62000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:10B63000FFFFFFFFFFFFDFFFFFFF9FEF3163167C80 +:10B640007984397C577C315BDFEFFFFFFEFFFFFF22 +:10B65000FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFB +:10B66000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10B67000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:10B68000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10B69000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10B6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10B6B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10B6C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10B6D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10B6E000FFFFFFFFFFFFFFFFFFFFFEFFFEFFDEF795 +:10B6F000FFFFBEF717A5D37B9FF7BFFFDFFFFEFF5E +:10B70000FDFFFDF7FDF7FEF7FEF7FFF73EDFB9A5FA +:10B71000F56B3453154B164B364B36533653165385 +:10B7200015533453F24A36741EDFDFFFFFFFFEFF6E +:10B73000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:10B74000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:10B75000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:10B76000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:10B77000FFFFDFFFDFFFFFFFFFF75CC6B46B5884FE +:10B78000387C5874167C589DFFF7DDF7FEFFFFFFED +:10B79000FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFBA +:10B7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10B7B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10B7C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10B7D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10B7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10B7F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10B80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10B81000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10B82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10B83000BEEFB7B5738CBFFFFFFFDEFFDEFFFEFF7D +:10B84000FEFFFFFFFFFFFEFFFEFFFEFFFEFFDFF735 +:10B85000FFF73BBEB26B31537553F44A164B164B90 +:10B860003753F64A1653F44AB56BFEDEDFF7FEFF98 +:10B87000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:10B88000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:10B89000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:10B8A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:10B8B000FFFFFFFFFFFFDEF7FFF7D2737884597CAD +:10B8C0003874587CD573BFEFFEF7FDFFFEFFFFFF16 +:10B8D000FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF79 +:10B8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10B8F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10B90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:10B91000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:10B92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10B93000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10B94000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10B95000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10B96000FFFFFFFFFFFFFFFFFFFFFFFFFFF79EEF60 +:10B9700059C6D494FFFFFFFFDEFFFEFFFEFFFFFF6F +:10B98000FFFFDFFFFFFFDFFFDFFFFEFFFEFFBDF773 +:10B99000FEFFDEF7BEF777A56F32545335531653CB +:10B9A000F64A5753164B35533453F473FFF7FDF7EC +:10B9B000FEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF99 +:10B9C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:10B9D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10B9E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10B9F000FFFFFFFFFFFFFFFF7EE7505B377C597CB7 +:10BA0000587C5774736BFFFFFEF7FDFFFEFFFFFFCF +:10BA1000FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF37 +:10BA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:10BA3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:10BA4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:10BA5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:10BA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:10BA7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:10BA8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:10BA9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:10BAA000FFFFFFFFFFFFFFFFFFFFFFFFBEEF7EE790 +:10BAB000F494BFEFFFF7FFFFFFFFDEFFFEFFFFFF86 +:10BAC000FFFFFFFFFFFFDFFFFFFFFFFFFEFFFEFFA8 +:10BAD000DEFFFFFFBFF7BFF7F88C32533453154B2F +:10BAE0003653154B144B5553F34A535B9FE7FEF700 +:10BAF000FEFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF58 +:10BB0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:10BB1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:10BB2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:10BB3000FFFFDFFFFFFFFFFF5BC6B46B387C587C65 +:10BB4000577C577CF37BDFF7FFFFFEFFFFFFFFFF14 +:10BB5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:10BB6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:10BB7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:10BB8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:10BB9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:10BBA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:10BBB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:10BBC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:10BBD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:10BBE000FFFFDFFFFFFFFFFFDFFFDFF73CE755ADA4 +:10BBF000BEF7DFFFFFFFFFFFDFFFFFFFFFFFFFFFDE +:10BC0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:10BC1000FFFFDFFFFFFFDFF79FEF335B365B164B66 +:10BC2000154B7553354B154B345351535FDFFFF7AD +:10BC3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:10BC4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:10BC5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:10BC6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:10BC7000FFFFFFFFFEFFFEFFFAB5F77B397C577C25 +:10BC8000577C577CF37BFFFFFFFFFFFFFFFFFFFFAA +:10BC9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:10BCA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:10BCB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:10BCC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:10BCD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:10BCE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:10BCF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:10BD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:10BD1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10BD2000FFFFFFFFFFFFDFFFFFFF5DEFD7BDBEF7A8 +:10BD3000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10BD4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:10BD5000FFFFFFFFFFFFFFF7DFF7325B1653174BC5 +:10BD6000354B344B144B565333533474FFF7DFF7D2 +:10BD7000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:10BD8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:10BD9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:10BDA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:10BDB000FFFFFFFFFEFFFEFF98AD177C397C577C2D +:10BDC000577C587CF273DFF7FFFFFEFFFFFFFFFF9A +:10BDD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:10BDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:10BDF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:10BE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:10BE1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:10BE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:10BE3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:10BE4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:10BE5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:10BE6000FFFFDFFFFFFFFFFFBEF71CE7DFFFFFFF66 +:10BE70009EF7FFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:10BE8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:10BE9000FFFFFFFFFFFFFEF7DFEF31531553164B98 +:10BEA000354B344B5453F44A525BFCCE9FEFDFF7D3 +:10BEB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:10BEC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:10BED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:10BEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:10BEF000FFFFFFFFFFFFFFFFB9AD177C397C577CC9 +:10BF0000577C597CD273FFF7FFFFFEFFFEFFFFFF58 +:10BF1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:10BF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:10BF3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:10BF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:10BF5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:10BF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:10BF7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:10BF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:10BF9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:10BFA000FFFFDFFFFFFFDFFFFFFFFFFFFFFF7DEF73 +:10BFB000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:10BFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF82 +:10BFD000FEFFFEFFFEFFFEFFDCC6324BF44A164BAF +:10BFE000154B13533253535BBDCEBFEFFFFFDFFF43 +:10BFF000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:10C00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:10C01000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:10C02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:10C03000FFFFFFFFFFFFFEF7D9B5177C397C387C87 +:10C04000587C597C9163FFF7FFFFFEFFFEFFFFFF67 +:10C05000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10C06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:10C07000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:10C08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:10C09000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10C0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10C0B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:10C0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10C0D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:10C0E000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10C0F000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:10C10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF40 +:10C11000FEFFFFFFFFFFBFEF935B144B3653165339 +:10C120001453325B505B5EE7BFEFFFFFBEF7FFFFCC +:10C13000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:10C14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:10C15000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:10C16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:10C17000FFFFDFFFFEFFFEF7DCD6746B397C587CD7 +:10C18000377C397CF473DDCEDFF7FFFFFEFFFFFF66 +:10C19000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:10C1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:10C1B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:10C1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:10C1D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10C1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:10C1F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:10C20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:10C21000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:10C22000DFFF5DEF5DEFFFFFFFFFFFFFFFFFFFFFA2 +:10C23000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:10C24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:10C25000FFFFBFF7BFF795843553154B575BF44A83 +:10C26000135396849FEF7DEFFFFFFFFFFFFFFFFF5C +:10C27000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:10C28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:10C29000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:10C2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:10C2B000FFFFFFFFFEFFFEFF7EE7125B5984577C06 +:10C2C000377C597C377C1474FFF7DFFFFFFFFFFFDB +:10C2D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10C2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:10C2F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:10C30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:10C31000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:10C32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:10C33000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10C34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10C35000FFFFFFFFFFFFFFFFFFFFDFF7FFFFFFFF15 +:10C36000FBDEF7BDDFFFBEF7FFFFFFFFFFFFFFFFB5 +:10C37000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:10C38000FFFFFFFFFFFFFFFFFFFFDFFFFFFFBFF725 +:10C39000DFF73EDF347C115316531553F34A946B89 +:10C3A0001CBEFFF7BFF7FEFFFEFFFFFFFFFFFFFF13 +:10C3B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:10C3C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:10C3D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:10C3E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:10C3F000FFFFFFFFFEFFFDFFDFF7978C5884367CC1 +:10C40000787C397C387C946BFDD6FFFFFEFFFFFF04 +:10C41000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:10C42000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:10C43000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:10C44000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10C45000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10C46000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:10C47000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:10C48000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10C49000FFFFFFFFFFFFFFFFFFFFDFF79EEFB7B5D7 +:10C4A000738CDFFFDFFFFFFFDFFFFFFFFFFFFFFFFB +:10C4B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:10C4C000FFFFFFFFFFFFFFFFFFFFDFFF9FF7BFF74C +:10C4D0003BBE525B545B144B1453325317957EE7AB +:10C4E000DFF7BFF7FFFFDEFFFFFFFFFFFFFFFFFFED +:10C4F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:10C50000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:10C51000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:10C52000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:10C53000FFFFFFFFFEFFFDFFFFF7FED6546377848A +:10C54000577C397C397C377C347C9EEFDEFFFEFFE4 +:10C55000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:10C56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:10C57000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:10C58000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:10C59000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:10C5A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:10C5B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:10C5C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:10C5D000FFFFFFFFFFFFFFFFDFF75DE7738C938C2B +:10C5E000DFF79EF7FFFFDFFFFFFFDFFFFFFFFFFF2C +:10C5F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:10C60000FFFFFFFFFFFFFFFFDFFFFFFF5DE7958CF1 +:10C61000F1523453D4425653557C5FDFDEEFDDF7E1 +:10C62000FDFFFEFFDFFFDFFFFFFFFFFFFFFFFFFF5D +:10C63000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:10C64000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10C65000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10C66000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:10C67000FFFFFFFFFFFFFFFFFFFFDFFF7384F47388 +:10C68000997C196C587C577CD46BF794BFEFFFFFF3 +:10C69000DEFFFEFFFEFFDFFFDFFFFFFFFFFFFFFF0D +:10C6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10C6B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10C6C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10C6D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:10C6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:10C6F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:10C70000FFFFFFFFFEFFFDFFFCF7FEFFFFFFFFFF48 +:10C71000FFF7FFF79FEFFFFF1ABE0F6397ADFFFF15 +:10C72000DDF7FEFFFEFFFFFFFFFFFFFFFFFFFFFF45 +:10C73000FFFFFFFFFDFFFDFFFEFFDEFFDFFFBFF797 +:10C74000FFFFDFFFDFFFFDEFFFEF9B9DB3421653BF +:10C75000155BF25A758C7FEFDFFFDFFFFFFFFFFFF6 +:10C76000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:10C77000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:10C78000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10C79000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10C7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10C7B000FFFFFFFFFFFFFFFFFFFFFFFFFFF7B26B72 +:10C7C000777C5874587C377C9884D46B78A5BFEFFD +:10C7D000DFF7FFFFDEFFDFFFFFFFFFFFFFFFFFFFD2 +:10C7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10C7F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10C80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10C81000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10C82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10C83000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10C84000FEFFFFFFFFFFFFFFDFFFFFFFFEFFFDFF1C +:10C85000FEFFBFF77EEFF27B0F63DDDEBFF7DFF792 +:10C86000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:10C87000FFFFFFFFFFFFDFFFBFFFBFFFDFFFDFFFA8 +:10C88000FFFFBDF7FEFFFBB57263525BF24A125326 +:10C890007AA57EE7FFFFDEF7DFFFDFFFFFFFFFFF89 +:10C8A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:10C8B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10C8C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10C8D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10C8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10C8F000FFFFFFFFFFFFFFFFFFFFFFFFDFFF7FE700 +:10C90000D36B567C597C397C387C587CD4735584E5 +:10C910003EDFFFF7DEF7FEFFFEFFFEFFFEFFFEFF3E +:10C92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10C93000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10C94000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10C95000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10C96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10C97000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10C98000FEFFFFFFDFFFDFFFBFFFDFFFBDF7DDF7CC +:10C990005DE7D5942F63B5947FEFDFF7FFFFFFFFCF +:10C9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF98 +:10C9B000FEFFFEFFBFFFFFFFDFFFFEF7DDF7FEF725 +:10C9C000BFF779ADB373F45AD252D4733BB69FE735 +:10C9D000FFF7FEF7FEFFDDFFFFFFFFFFFFFFFFFF9B +:10C9E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10C9F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:10CA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:10CA1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:10CA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:10CA3000FFFFFFFFFFFFFFFFFFFFFFFFBEF7FFFF4F +:10CA40007EE774841674387C397C597C587C167463 +:10CA5000D36B3ABEBFEFFEF7FEF7FEFFFEFFFEFF11 +:10CA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:10CA7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:10CA8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:10CA9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:10CAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:10CAB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:10CAC000FFFFFEFFFDFFFDFFDEFFBEF7FEDE39A527 +:10CAD0003163137C5BC6FFFFBFF7DFF7DFFFDFFFCC +:10CAE000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF77 +:10CAF000FEFFFEFFFEF7FEF7DEF7FEF71DDF57A590 +:10CB0000726BB2529673F99CFEDEDFF7FFF7DDEF32 +:10CB1000FEF7FFFFDFFFDFFFFFFFFFFFFFFFFFFF6E +:10CB2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:10CB3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:10CB4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:10CB5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:10CB6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:10CB7000FFFFFFFFFFFFFFFFFFFFFEFFFFFFDFFFE6 +:10CB8000FFFFFFFFD684F46B377C5984387C597CD7 +:10CB9000788493637784FCD6DFEFFFF7FFF7FFFF1E +:10CBA000FFFFFEFFFEFFFEFFFFFFFFFFFFFFFFFF98 +:10CBB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:10CBC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:10CBD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:10CBE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:10CBF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:10CC0000FEFFFEF7FEF7BFEFFCD6179D315BD57335 +:10CC1000DBB5BFF7DFF7FFFFFEFFFEFFFEFFFFFF05 +:10CC2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:10CC3000FFFFFFFFFDF79DEFBCCE978CF35A5363C8 +:10CC4000968CFCD6FEF7FFFFFFFFFEF7FEFFFEFF10 +:10CC5000FFFFFFFFDFFFDFFFFFFFFFFFFFFFFFFF24 +:10CC6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:10CC7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:10CC8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:10CC9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:10CCA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:10CCB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:10CCC000FFFFFFFFFFF79CCE305B567C587CF7736D +:10CCD000397C387C387CB36B1474DECEBFEFFFF741 +:10CCE000FFFFFEFFFEFFFDFFFFFFFFFFFFFFFFFF58 +:10CCF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:10CD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10CD1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:10CD2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF14 +:10CD3000FFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFF0B +:10CD4000FFF79EEFBDCED473315B515BF9ADFFEFC2 +:10CD5000DFF7DFFFFFFFFEFFFDFFFDFFFEFFFEFF32 +:10CD6000FFFFFEFFFEFFFEFFDFFFDFFFFFFFFFFF16 +:10CD7000BFF7FEDE988CD052F0527584DDD6DFF717 +:10CD8000FFF7FEF7FEF7FCFFFDFFFEFFFFFFFFFFD3 +:10CD9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:10CDA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:10CDB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:10CDC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:10CDD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:10CDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:10CDF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:10CE0000FFFFFFFFFFFFDFF7DFF7B9B55163F573F2 +:10CE100078841774587C577C778415749363BAAD03 +:10CE20009FEFFFF79EEFFFFFFFFFFFFFFFFFDFF723 +:10CE3000FFFFDFFFFFFFFFFFDFFFDFFFDFFFDFFFA2 +:10CE4000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:10CE5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:10CE6000FFFFFFFFDFFFDFFFDFFFFFFFFFFFFFFF32 +:10CE7000FFFFDFFFFFFFFFFFBFEFDFF7DFEFBDCEFD +:10CE8000377C325B7263B16B19B6DFF7BDE7FFF732 +:10CE9000FEF7FFFFFEFFFEFFFEFFFDFFFEFFFEFFB2 +:10CEA000FFFFFFFFFFFFDFF7FFFF9EEF5EE7D59C71 +:10CEB000CD524F63B894BED6DFF7FEF7FDF7FDF70E +:10CEC000FFFFDFFFBFFFFEFFFFFFFFFFFFFFFFFFD3 +:10CED000FFFFFFFFFDFFFDFFFFFFFFFFFFFFFFFF66 +:10CEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:10CEF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:10CF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:10CF1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:10CF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:10CF3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:10CF4000FFFFFFFFFFFFDFFFDFFFDFFF5EE71ABE30 +:10CF5000D26BB36B767C587C577C587C787C16748B +:10CF6000D46BF473389DFED6DFF7FFF7DFF7DFF7FA +:10CF7000FFFFDFFFDFFFDEFFFFFFFFFFFFFFFFFF22 +:10CF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:10CF9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:10CFA000FFFFFFFFDFFFFFFFDFFFFFFFFFFFDFF7F9 +:10CFB000DFF7FFF7FFF71EDF78A57584D373315BCA +:10CFC00073639AADFDD6DEF7BDF7DEF7FEFFFFFF18 +:10CFD000DEFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFA2 +:10CFE000DFF7DFF7BFF77BCEB494B0735284F8BDA0 +:10CFF0001DDFBFF7FDF7DDF7FEFFFFFFDFFFBFFF20 +:10D00000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:10D01000FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF21 +:10D02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:10D03000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:10D04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10D05000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:10D06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:10D07000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:10D08000FFFFFFFFBFFFDFFFDFFFBEF7FEFFDFF7A2 +:10D09000DFF79BC6F68CD56BF66B587C387C387CFA +:10D0A000587C377CF673D46B127CF59CB7B59ACE5E +:10D0B0009EEFFFFFFFFFFFFFDFFFDFFFDFFFDFFF71 +:10D0C000DFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10D0D000FFFFFFFFFFFFFFFFFFFFFFFFDFFFDFFFA0 +:10D0E000DFFFDFFFDFFFFFFFDFFFFFFF1CE73AC6C9 +:10D0F00077ADF694137C926B9363D46B399D9BC68A +:10D10000DDF7FEF7FFFFBFF7DFFFBFFFDFFFDFFF4A +:10D11000DEFFDEFFDFFFDFFFDFFFDFFFDFFF3DE7DB +:10D12000D7B59594137CD69C19C65EE7DFF7FFFF51 +:10D13000FFFFFFFFDEFFDEFFDFFFFFFFFFFFFFFF61 +:10D14000FEFFFDFFFDFFFFFFFFFFFFFFFEFFFEFFF6 +:10D15000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:10D16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:10D17000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:10D18000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:10D19000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:10D1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:10D1B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:10D1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10D1D000FFFFFFFFDFFF5EE7B7AD7384D273F47329 +:10D1E0001674377C587C597C5A7C3974F76B95637C +:10D1F000B56336745A95FAAD3ABEDCD65EE7BFEF3A +:10D20000DFF7DFF7FEF7FEF7FEF7FEFFFEFFFEFF9C +:10D21000FFFFFFFFFFFFDEF7DEF7FFF7BFEF9FE740 +:10D220003DD7BCCE1AB6DAADF78C557C92639463C9 +:10D23000D56BD46B958456A5BAD6DEF7FEFFFDFFFD +:10D24000DFFFDFFFFFFFFFFFDFFFDFFFFFFFFFFF6E +:10D25000DFF7FFF7FFF7DFF7DBD6F8B5938C328403 +:10D2600056A5BBD6BEF7DFFFDFFFDFFFFFFFFFFFE7 +:10D27000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:10D28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:10D29000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:10D2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:10D2B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10D2C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10D2D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:10D2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:10D2F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:10D30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:10D31000FFFFFFFFFFFFDFF7DFF7FFF7FFF71ED786 +:10D32000BAAD557CD46BF5731674577C577C367C3C +:10D3300077849784367C567CF673756B54633363BD +:10D340005363946B167C988CD994F994F99C1A9D2C +:10D350001A9DFA9CF99C988C988CD573946B956B5C +:10D360007463956BB673177C956BB673578499A5E8 +:10D370001EDFFFF7DFF7FFF7FFFFDFFFDEFFFEFF38 +:10D38000FFFFFFFFDFFFBEF7FFFFFFFFBEF7DFFF7F +:10D390007EEFFCDE55A55184149D1CDFDFF7FFFFF7 +:10D3A000FFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFAD +:10D3B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:10D3C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:10D3D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:10D3E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:10D3F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:10D40000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:10D41000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:10D42000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:10D43000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10D44000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10D45000FFFFFFFFFFFFFFFFDEF7BEF7FFFFFFF756 +:10D46000FFF7FFF7FFF7DFEF5FE7D9AD9484916334 +:10D47000716372635263D473F673F873397C5984A1 +:10D48000387C798459845984998C5884387C177CE9 +:10D49000177C177C377CB46B535B74637163916B3F +:10D4A0007484D9B59CCE7EE7FFF7FFF7BEEFFEF799 +:10D4B000FEF7FEF7FEF7FFFFFFFFFFFFFFFFFFFF97 +:10D4C000FFFFBEF7DFFFDFFFDFFFDFFF18C692942D +:10D4D00055AD3DE7DFF7BFF7DFF7DFFFDFF7FFFF12 +:10D4E000FFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF6C +:10D4F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:10D50000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:10D51000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:10D52000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:10D53000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:10D54000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:10D55000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:10D56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:10D57000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:10D58000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:10D59000FFFFFFFFFFFFFEFFFEFFFEFFFFFFFFFF9E +:10D5A000FFFFFEF7FEF7FEF7FFF7DFF7FFFFDFF7FE +:10D5B000BFF75EEF5EEF3EE7BDCE9CC67BC6D9AD42 +:10D5C000379D379D379D379D16953ABE5BBE7BC60E +:10D5D0009CCEDCCE5DDF5EE77EE79EEFDFF7FFFFF0 +:10D5E000FFF7FFFFFEF7FEFFDCF7FCF7FCF7FDFFA0 +:10D5F000FDFFFEFFFEFFFEFFFFFFFFFFFFFFDFFF60 +:10D60000FFFF7DEF59CE96B518C61CE77DEFBEF73C +:10D61000DFFFDFFFBFF7FFFFDFFFFFFFFFFFFFFFC2 +:10D62000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:10D63000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10D64000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10D65000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:10D66000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10D67000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10D68000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10D69000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10D6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10D6B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10D6C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:10D6D000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFF5C +:10D6E000FEFFFEFFFEFFFEFFFFFFFFFFFFFFFFFF4E +:10D6F000DFFFFFFFDFFFFFFFFFFFFFF7FFF7FFF792 +:10D70000FFF7FFF7FFF7FFF7FFF7FFFFFFFFFFFF51 +:10D71000FFFFFFFFFFFFFFFFFEFFFEFFDFFFDFFF5B +:10D72000DFFFDFFFDFFFFFFFDFFFFFFFFFFFFEFF8A +:10D73000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10D74000DFFF9EF75DEFDFFFFFFFFFFFFFFFFFFF44 +:10D75000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFA +:10D76000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:10D77000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10D78000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10D79000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10D7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10D7B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10D7C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10D7D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10D7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10D7F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:10D80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10D81000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10D82000FFFFFEFFFEFFFEFFFFFFFFFFFFFFFFFF0B +:10D83000FEFFFEFFFEFFFEFFFEFFFFFFFFFFFFFFFD +:10D84000DFFFDFFFDFFFDFFFDFFFDFFFDFFFDFFFE8 +:10D85000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFFDA +:10D86000FEFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFE9 +:10D87000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:10D88000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:10D89000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:10D8A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10D8B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10D8C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10D8D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10D8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10D8F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10D90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10D91000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10D92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10D93000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10D94000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10D95000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10D96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10D97000FEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFBF +:10D98000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:10D99000FFFFFFFFFFFFFFFFFFFFFFFFFDFFFDFF9B +:10D9A000FDFFFDFFFEFFFEFFFFFFFFFFFFFFFFFF8D +:10D9B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10D9C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10D9D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10D9E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:10D9F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:10DA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:10DA1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:10DA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:10DA3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:10DA4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:10DA5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:10DA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:10DA7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:10DA8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:10DA9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:10DAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:10DAB000FFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFF77 +:10DAC000FFFFFFFFFFFFFFFFFFFFFEFFFEFFFEFF69 +:10DAD000FEFFFEFFFEFFFEFFFEFFFEFFFFFFFFFF5C +:10DAE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:10DAF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:10DB0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:10DB1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:10DB2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:10DB3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:10DB4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:10DB5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:10DB6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:10DB7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:10DB8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:10DB9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:10DBA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:10DBB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:10DBC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:10DBD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:10DBE000FFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFF46 +:10DBF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:10DC0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:10DC1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:10DC2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF05 +:10DC3000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:10DC4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:10DC5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:10DC6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:10DC7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:10DC8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:10DC9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:10DCA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:10DCB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:10DCC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:10DCD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:10DCE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:10DCF000FFFFFFFFFFFFFFFFFFFFDFFFBEF7FFFF9D +:10DD0000DFFFDFFFDFFFBEF7FFFFFFFFFFFFDFFFEC +:10DD1000DFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFF53 +:10DD2000DFFFDFFFDFFFBEF7FFFFFFFFFFFFFFFFAC +:10DD3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:10DD4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:10DD5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:10DD6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:10DD7000FFFFFFFFFFFFDFFFDFFFFFFFFFFFDFFF13 +:10DD8000BEF7FFFFDFFFFFFFFFFFFFFFFFFFFFFF0C +:10DD9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:10DDA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:10DDB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:10DDC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:10DDD000FFFFFFFFFFFFFFFFBEF7FFFFDFFFBEF705 +:10DDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:10DDF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10DE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:10DE1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:10DE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:10DE3000FFFFDFFFFFFFFFFFFFFFFFFFFFFFDFFF32 +:10DE4000DFFFBEF79EF7DFFFBEF7DFFFFFFFDFFF5D +:10DE5000FFFFDFFFFFFFFFFFFFFFFFFFFFFFBEF73B +:10DE6000FBDE3CE7BEF7DFFFFFFFFFFFFFFFFFFF2B +:10DE7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:10DE8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:10DE9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:10DEA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:10DEB000FFFFFFFFFFFFDFFFDFFFDFFFDFFFDFFF12 +:10DEC000DFFFDFFFDFFFDFFFFFFFFFFFFFFFFFFFE2 +:10DED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:10DEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:10DEF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:10DF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:10DF1000FFFFFFFFDFFFBEF75DEF7DEFBEF7DFFF27 +:10DF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:10DF3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:10DF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:10DF5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:10DF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:10DF7000FFFFFFFFFFFFFFFFBEF7FFFF5DEF55ADA8 +:10DF8000494AE318A21065290C6396B5BEF7DFFF76 +:10DF9000FFFFDFFFDFFFFFFFFFFFDFFFDFFFD7BD7B +:10DFA00020000421B6B5BEF7DFFFFFFFFFFFFFFF34 +:10DFB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:10DFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:10DFD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:10DFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:10DFF000FFFFFFFFFFFFD39C0842494A2842694ABE +:10E00000EF7BB6B5BEF7BEF7FFFFFFFFFFFFFFFFD9 +:10E01000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:10E02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:10E03000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10E04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:10E05000FFFFFFFFDFFFBAD62000A210D7BDDFFF12 +:10E06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:10E07000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10E08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10E09000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:10E0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10E0B000FFFFFFFFFFFFDFFFFFFFDBDEE3182000B6 +:10E0C00020002000410800006108000028423CE7D1 +:10E0D000BEF7FFFFFFFFFFFFFFFFDFFFDFFFF39C48 +:10E0E000610841088A52FFFFDFFFFFFFFFFFFFFFCC +:10E0F000FFFFFFFFFFFFDFFFDFFFFFFFFFFFFFFF70 +:10E10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:10E11000FFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFF2F +:10E12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:10E13000FFFFFFFFFFFFEF7B20002000000000003B +:10E1400000002000C7393CE7FFFFFFFFFFFFFFFF94 +:10E15000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:10E16000FFFFDFFFDFFFFFFFFFFFFFFFFFFFFFFFFF +:10E17000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:10E18000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:10E19000FFFFFFFFDFFF79CE20000000C739BEF789 +:10E1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:10E1B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10E1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:10E1D000FFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFF6F +:10E1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:10E1F000FFFFFFFFDFFFDFFF5DEFA2100000200049 +:10E200002421EF7B9AD6BAD64D6B2000C318AE738B +:10E21000BEF7FFFFFFFFFFFFFFFFFFFFDFFF9EF7E0 +:10E2200079CEEB5ABAD6BEF7DFFFFFFFFFFFFFFF45 +:10E23000FFFFFFFFBEF7DFFF9EF79AD67DEFBEF729 +:10E24000FFFFDFFFFFFFBEF7FFFFFFFFFFFFFFFF47 +:10E25000FFFFFFFFDFFFFFFFFFFF5DEFBAD6FFFF0E +:10E26000FFFFDFFFFFFFFFFFDFFFDFFFDFFFFFFF3E +:10E27000FFFFFFFFFFFFCF7B00008210AA524D6B14 +:10E28000084200004108E3181CE7BEF7FFFFFFFF4C +:10E29000FFFFFFFFDFFFFFFFDFFFDFFFFFFF9EF757 +:10E2A000FBDEBAD6FFFFFFFFBEF7BEF7FFFFFFFFA3 +:10E2B000FFFFFFFFFFFFFFFF9EF7FFFFFFFFBEF720 +:10E2C000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10E2D000FFFFFFFFDFFFDFFF1CE7EB5A38C6DFFF62 +:10E2E000FFFFFFFFFFFFFFFFFFFFDFFFFFFFDFFF7E +:10E2F000FFFF5DEFBAD65DEFDFFFBEF7FFFFDFFF89 +:10E30000FFFFBEF7FFFFFFFFFFFFFFFFDFFFFFFF86 +:10E31000FFFF7DEF9AD65DEFFFFFFFFFDFFFDFFF1F +:10E32000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:10E33000FFFFDFFFFFFFDFFFB29400004108C73996 +:10E34000BAD6FFFF9EF7DFFFFFFFDBDED7BD9EF7EC +:10E35000DFFFDFFFFFFFFFFFFFFFFFFFFFFFF7BD57 +:10E360006108821014A5FFFFFFFFFFFFFFFFFFFF03 +:10E37000FFFF7DEF7DEFC7394108200000008631A7 +:10E38000E3184108694A1CE7DFFFFFFFFFFFFFFFBB +:10E39000FFFFFFFFDFFF96B5E318200020004108D4 +:10E3A000694A82106108D39CDFFFFFFFDFFFFFFF98 +:10E3B000FFFFFFFFFFFF108400006108B294DFFF42 +:10E3C000DFFF59CE821000008A52FFFFDFFFDFFF20 +:10E3D000FFFFFFFFFFFFBEF7FFFF59CE8631410869 +:10E3E00020004108A2101084DFFFFFFFFFFFFFFFA6 +:10E3F000FFFFFFFFFFFFDFFFAA52410808423CE793 +:10E40000BEF7BEF7452941082842FBDEFFFFFFFFAC +:10E41000FFFFFFFFDFFFBAD682104108B294BEF7BC +:10E42000FFFFFFFFFFFFFFFFDFFFDFFFBEF7718C86 +:10E43000E318200000002000E318718CDFFFDFFFED +:10E44000DFFFDFFFFFFFFFFFFFFFBEF77DEFB294AF +:10E45000C318410800004108E31814A5FFFFBEF7E8 +:10E46000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10E47000FFFFFFFFDFFFDFFF494A20008210D7BD0B +:10E48000DFFFBEF7DFFFDFFFDFFFFFFFFFFF9EF7CE +:10E49000BEF7FFFFBEF7FFFFFFFFFFFFFFFF18C63E +:10E4A000000061081084DFFFFFFFFFFFFFFFFFFF99 +:10E4B000FFFFBEF7652941082000A2104529610829 +:10E4C0002000000045291CE7BEF7FFFFFFFFFFFF0C +:10E4D000FFFFFFFF1CE76108200061082421A6312F +:10E4E000200000002000EB5ABEF7DFFFFFFFFFFF18 +:10E4F000FFFFFFFFFFFFCF7B00008210B294FFFF02 +:10E50000DFFFFFFFE739200004215DEFDFFFDFFFC2 +:10E51000FFFFFFFFDFFFDFFFDBDEC3182000E31894 +:10E52000A6318A52821000008A52FFFFFFFFDFFFF0 +:10E53000FFFFFFFFFFFFDFFF1CE782102000718C51 +:10E54000BEF759CE200061082C63BEF7FFFFFFFF26 +:10E55000FFFFFFFFFFFFDBDE000020008E73DFFF09 +:10E56000FFFFFFFFFFFFFFFFDFFFBEF7CF7B0000D6 +:10E570002000821086316529200061088E73BEF765 +:10E58000BEF7FFFFFFFFFFFFFFFFDFFF96B5200095 +:10E590002000C31808422842000061081084DFFFF1 +:10E5A000BEF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:10E5B000FFFFFFFFDFFFFFFFE7390000E3181CE765 +:10E5C000DFFFDFFFAA520842E739E739E739694A36 +:10E5D000DBDEDFFFDFFFFFFFFFFFFFFFFFFFF7BD1A +:10E5E000200020004D6BFFFFFFFFFFFFFFFFFFFF3D +:10E5F000DFFF5DEF61082000E739B6B57DEFBAD6E1 +:10E600008210000045291CE7BEF7FFFFFFFFFFFF58 +:10E61000FFFFFFFF0C63610861080C63BAD67DEF52 +:10E62000929420002000CB5ADFFFFFFFDFFFFFFFA7 +:10E63000FFFFFFFFFFFFCF7B00006108B294FFFFE9 +:10E64000FFFFDFFF494A200082103CE7BEF7FFFFD3 +:10E65000DFFFFFFFDFFFFFFF4D6B00008210494A25 +:10E6600055AD55ADCF7B2000200014A5FFFFDFFF87 +:10E67000FFFFFFFFFFFFFFFFDFFF8A5200002421A3 +:10E680003CE7452900002421D7BDDFFFDFFFFFFF66 +:10E69000FFFFFFFFFFFFDBDE000000006D6BDFFF11 +:10E6A000FFFFFFFFFFFFFFFFDFFFFBDE000020009B +:10E6B000452934A5BEF7BEF759CE718C1CE7DFFFA4 +:10E6C000DFFFFFFFFFFFFFFFFFFFDFFF084220002C +:10E6D000A2100C6375AD55AD2C6300002000F7BD92 +:10E6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:10E6F000FFFFFFFFDFFFBEF78E7341084108FBDE1F +:10E700009EF7DFFF4529200000002000200061085F +:10E710002C63FFFFFFFFFFFFFFFFFFFFFFFFF7BDC2 +:10E72000000020008E73BEF7FFFFFFFFFFFFFFFF1B +:10E73000FFFFDBDE00006108EF7BDFFFDFFFFFFF95 +:10E740002421000045291CE7DFFFFFFFFFFFFFFF3B +:10E75000FFFFDFFFA63100000421D7BDDFFFDFFF91 +:10E76000DFFF821000002C63DFFFDFFFFFFFFFFFF2 +:10E77000FFFFFFFFFFFFEF7B00006108B294FFFF88 +:10E78000BEF7DFFFC7390000E318FBDEFFFFDFFF46 +:10E79000FFFFDFFFDFFFBEF7242120000000200085 +:10E7A00000000000000000002000CB5ABEF7FFFF71 +:10E7B000FFFFFFFFDFFFDFFFBEF7FBDE610820008A +:10E7C0008A52000041080C63BEF7BEF7FFFFFFFF4F +:10E7D000FFFFFFFFFFFFDBDE000000006D6BDFFFD0 +:10E7E000FFFFFFFFFFFFFFFFDFFF96B500002000E8 +:10E7F0008E739EF7FFFFBEF7BEF7DFFFDFFFDFFF81 +:10E80000FFFFFFFFFFFFFFFFDFFF9EF7A2102000CB +:10E810000000000000002000200020000000718C9B +:10E82000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10E83000FFFFFFFFFFFFDFFF59CE00000000EB5A94 +:10E84000DFFFBEF7BEF714A514A5E3180000E31818 +:10E8500075ADDFFFBEF7FFFFFFFFFFFFFFFF38C60D +:10E8600000004108718CFFFFFFFFFFFFFFFFFFFF6C +:10E87000FFFF9EF7200041086D6BDFFF9EF77DEFE5 +:10E88000C31800004529FBDEFFFFFFFFFFFFFFFF6E +:10E89000FFFFDFFF0C636108C318F7BDBEF7DFFFA2 +:10E8A00018C620002000CB5ADFFFFFFFFFFFFFFF4D +:10E8B000FFFFFFFFFFFFAE7300008210B294DFFF87 +:10E8C000DFFF929400004108A6319EF7DFFFDFFFD3 +:10E8D000FFFFDFFFBEF7FFFF28420000652992948B +:10E8E000518CF39CB29492949294D39CFFFFDFFFDF +:10E8F000DFFFFFFFFFFFFFFFFFFFFFFF8A52200048 +:10E90000000000000421D7BDFFFFFFFFFFFFFFFF56 +:10E91000FFFFFFFFFFFFDBDE000000006D6BFFFF6E +:10E92000FFFFFFFFFFFFFFFFFFFF18C620000000F3 +:10E93000718CDFFF9EF7FFFFBEF7DFFFFFFFDFFFFA +:10E94000FFFFBEF7FFFFFFFFFFFFBEF704218210AE +:10E95000A631EF7BB294718CD39C108414A5F7BDC3 +:10E96000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10E97000FFFFFFFFDFFFDFFFDFFFCF7B410820004E +:10E98000E318B29496B5518CC31800006108694A27 +:10E99000BEF7FFFFDFFFFFFFFFFFFFFFFFFF38C6F0 +:10E9A000200020009294FFFFFFFFFFFFFFFFFFFF0B +:10E9B000FFFFDFFF452900006108CB5A8E73C318A3 +:10E9C0000000000045291CE7FFFFFFFFFFFFFFFFDE +:10E9D000FFFFDFFFDBDE41086108A63134A5EF7BD6 +:10E9E000610800002000AA52FFFFDFFFFFFFFFFFCA +:10E9F000FFFFFFFFFFFFCF7B00000000452908421B +:10EA0000E31800000000A2103084FFFFBEF7FFFFF4 +:10EA1000FFFFDFFFFFFFFFFF38C620000000EB5ABB +:10EA20007DEF55AD86318A52FBDEDFFFFFFFFFFF32 +:10EA3000DFFFFFFFFFFFFFFFDFFF9EF779CE200024 +:10EA400020000000CB5ABEF7FFFFFFFFFFFFFFFFD4 +:10EA5000FFFFFFFFFFFFDBDE00002000CF7BBEF7E4 +:10EA6000FFFFFFFFFFFFFFFFDFFFDFFF694A4108F6 +:10EA70004108108438C6718CA2102C635DEFDFFF53 +:10EA8000DFFFFFFFFFFFFFFFFFFFDFFF14A5000019 +:10EA90000000EF7B3CE7B294C3182C63BEF7DFFFA6 +:10EAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:10EAB000FFFFFFFFDFFFDFFFDFFFDFFFF39CA210A1 +:10EAC000000020000000200000008210494ABAD651 +:10EAD000BEF7BEF7DFFFFFFFFFFFFFFFFFFF96B5AB +:10EAE000200041083084DFFFFFFFFFFFFFFFFFFF33 +:10EAF000FFFFDFFF9EF7494A200000000000821060 +:10EB0000200000004529FBDEFFFFFFFFFFFFFFFFA6 +:10EB1000FFFFFFFFBEF755AD821000000000410867 +:10EB2000410820004108CB5AFFFFDFFFDFFFFFFF56 +:10EB3000FFFFFFFFFFFFAE730000000000000000BA +:10EB400020004108C318CF7B9EF7FFFFBEF7FFFFF1 +:10EB5000FFFFBEF7FFFFBEF7FFFF14A582102000E6 +:10EB6000410820000000A210AA52FFFFFFFFFFFF94 +:10EB7000FFFFDFFFFFFFDFFFDFFFFFFFBEF7694A99 +:10EB800020004529F7BDDFFFFFFFFFFFFFFFFFFF6D +:10EB9000FFFFFFFFDFFFBAD6000020008E73BEF735 +:10EBA000FFFFFFFFFFFFFFFFFFFFBEF75DEF284204 +:10EBB00020000000200000002000C3181084DFFFA8 +:10EBC000DFFFDFFFFFFFFFFFFFFFFFFF7DEF9294FF +:10EBD0000000200020000000200082104D6BBEF7D6 +:10EBE000DFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:10EBF000FFFFDFFFFFFFDFFFFFFFBEF7DFFF1CE7C9 +:10EC0000D39C694AA631C739CB5AB2945DEFDFFF76 +:10EC1000BEF7FFFFFFFFFFFFFFFFFFFFFFFF9EF7B6 +:10EC2000D39C6D6B14A5BEF7FFFFFFFFFFFFFFFF37 +:10EC3000BEF79EF7D7BDD7BDD7BD1084CF7BEF7B86 +:10EC4000410800000842BEF7BEF7FFFFFFFFFFFFCD +:10EC5000FFFFFFFFDFFFBEF7BAD61084084208426D +:10EC60009294F39C6D6BB294DFFFDFFFFFFFFFFF19 +:10EC7000FFFFFFFFFFFFFBDE718C6D6B6D6B4D6B5C +:10EC80006D6B518C59CEBEF7DFFFDFFFDFFFBEF7A4 +:10EC9000FFFFFFFFDFFFFFFFDFFFBEF7DBDE518C73 +:10ECA000694AC739CB5AB2945DEFFFFFFFFFDFFF20 +:10ECB000FFFFDFFFFFFFDFFFDFFFDFFFFFFF1CE7DF +:10ECC000518CCF7B7DEFDFFFDFFFFFFFDFFFFFFF1B +:10ECD000FFFFFFFFDFFF9EF755AD8E73F39CDFFF55 +:10ECE000FFFFFFFFFFFFFFFFDFFFDFFFDFFFFFFF94 +:10ECF000D7BD6D6BE739E7390C6375ADBEF7DFFF44 +:10ED0000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10ED100079CE8E73E739C739CB5A96B5BEF7DFFF88 +:10ED2000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:10ED3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:10ED4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:10ED5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:10ED6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:10ED7000DFFF7DEFC31800000421694AAA52E3189F +:10ED8000000082104D6BBEF7FFFFFFFFFFFFFFFF8C +:10ED9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:10EDA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:10EDB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:10EDC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:10EDD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:10EDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10EDF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:10EE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:10EE1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:10EE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:10EE3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:10EE4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:10EE5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:10EE6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:10EE7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:10EE8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:10EE9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:10EEA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:10EEB000FFFFBEF7FFFFA631410820000000000061 +:10EEC0004108AA52BAD6DFFFFFFFFFFFFFFFFFFF97 +:10EED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:10EEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:10EEF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:10EF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:10EF1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:10EF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:10EF3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:10EF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:10EF5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:10EF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:10EF7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:10EF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:10EF9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:10EFA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:10EFB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:10EFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:10EFD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:10EFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:10EFF000FFFF9EF7BEF7DFFF5DEF55AD518C92949A +:10F0000079CEBEF7DFFFFFFFFFFFFFFFFFFFFFFF30 +:10F01000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:10F02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10F03000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:10F04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:10F05000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:10F06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10F07000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10F08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:10F09000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10F0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:10F0B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:10F0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:10F0D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:10F0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:10F0F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:10F10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:10F11000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:10F12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:10F13000FFFFDFFFFFFFDFFFBEF7FFFFBEF7FFFFB1 +:10F14000BEF7DFFFFFFFBEF7FFFFFFFFFFFFFFFF81 +:10F15000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:10F16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:10F17000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:10F18000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:10F19000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:10F1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10F1B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:10F1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:10F1D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:10F1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:10F1F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:10F20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:10F21000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:10F22000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:10F23000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:10F24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:10F25000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:10F26000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:10F27000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:10F28000FFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFAE +:10F29000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10F2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10F2B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:10F2C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:10F2D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:10F2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:10F2F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:10F30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10F31000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10F32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:10F33000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:10F34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:10F35000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:10F36000FFFFFFFFFFFFFFFFFFFFFFFF8CF3000822 +:10F3700000000020C80000001442000854F40008F7 +:10F38000C800002000040000244200081400780097 +:10F39000DC000A006400C800506C65617365207071 +:10F3A000726573732074686520627574746F6E2162 +:10F3B000000000000000000000000000000000004D +:10F3C000000E2707001C0140001C0140001C0140EA +:10F3D000001C0140010000000200000004000000C9 +:10F3E000080000000E0611070002000004000000E3 +:10F3F000000400000800000000080140000801406F +:10F40000020602060706070607060706000801406F +:10F4100000100140001C0140001C014001000000E0 +:10F42000002000002000000010000000020604067A +:10F430000706070601000000002000002000000071 +:10F440001000000000020505000D05040628170A3B +:04F4500000000000B8 +:04000005080041317D +:00000001FF diff --git b/Utilities/Binary/USBD/hex/LED.hex a/Utilities/Binary/USBD/hex/LED.hex new file mode 100644 index 0000000..d05722e --- /dev/null +++ a/Utilities/Binary/USBD/hex/LED.hex @@ -0,0 +1,101 @@ +:020000040800F2 +:1040000098040020454100089B41000893410008A6 +:10401000974100088D41000811420008000000008F +:10402000000000000000000000000000C741000880 +:104030009141000800000000C5410008C941000886 +:104040005F4100085F4100085F4100085F410008D0 +:104050005F4100085F4100085F4100085F410008C0 +:104060005F4100085F4100085F4100085F410008B0 +:104070005F4100085F4100085F4100085F410008A0 +:104080005F4100085F4100085F4100085F41000890 +:104090005F4100085F4100085F4100085F41000880 +:1040A0005F4100085F4100085F4100085F41000870 +:1040B0005F4100085F4100085F4100085F41000860 +:1040C0005F4100085F4100085F4100085F41000850 +:1040D0005F4100085F4100085F4100085F41000840 +:1040E0005F4100085F4100085F4100085F41000830 +:1040F0005F4100085F4100085F4100085F41000820 +:104100005F4100085F4100085F4100085F4100080F +:104110005F4100085F4100085F4100085F410008FF +:104120005F4100085F4100085F4100085F410008EF +:10413000DFF80CD000F018F800480047754300087D +:10414000980400200648804706480047FEE7FEE73F +:10415000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE737 +:10416000D141000831410008064C074D06E0E068E7 +:1041700040F0010394E8070098471034AC42F6D3AE +:10418000FFF7DAFF684500088845000800BFFEE732 +:10419000704700BFFEE700BFFEE7704710B500287C +:1041A00007DA0A07140E054A00F00F031B1FD45448 +:1041B00003E00A07130E024A135410BD18ED00E085 +:1041C00000E400E07047704710B500F03DF810BD06 +:1041D00010B50D48006840F001000B490860002050 +:1041E0004860C862084600680849084006490860F7 +:1041F0004FF41F0088600846006820F480200860A3 +:1042000000F086F910BD000000100240FFFFF6FE2E +:1042100000BFFEE702E008C8121F08C1002AFAD159 +:1042200070477047002001E001C1121F002AFBD136 +:10423000704700000349086000BF0249096800296F +:10424000FBD17047000000200448006820B10348FB +:104250000068401E0149086070470000000000200F +:1042600010B504460B4931F8140000F0BDF80A49B6 +:1042700051F82430094951F824000322102100F09C +:1042800027F8054850F82400044951F824104861E3 +:1042900010BD000048000020180000200800002089 +:1042A000034951F82010034A52F820205161704709 +:1042B0001800002008000020034951F82010034A8C +:1042C00052F82020116170471800002008000020DB +:1042D000F0B50C4616460025002204F00F0514F038 +:1042E000100F08D0042E05D145F00305C76B1F43FE +:1042F000C76300E03543002118E001278F401F42CB +:1043000012D002684FEA810C0F2707FA0CF7BA4364 +:104310008F0005FA07F73A43282C01D1436102E0E8 +:10432000482C00D1036102604F1CB9B20829E4D3C4 +:1043300008211CE001278F401F4216D04268A1F1DE +:1043400008074FEA870C0F2707FA0CF7BA43A1F1C9 +:104350000807BF0005FA07F73A43282C01D143614B +:1043600002E0482C00D1036142604F1CB9B2102911 +:10437000E0D3F0BD4FF48041480300F02BF800205B +:10438000FFF76EFF0120FFF76BFF0220FFF768FFCA +:1043900000F0C2F81DE00020FFF78EFFC820FFF7F5 +:1043A00049FF0120FFF788FFC820FFF743FF0220E5 +:1043B000FFF782FFC820FFF73DFF0020FFF770FFE7 +:1043C0000120FFF76DFF0220FFF76AFFC820FFF70B +:1043D00031FFE0E7024A0A400243024B1A6070478D +:1043E00080FFFF1F08ED00E0064901EB901109680E +:1043F00000F01F0301229A401143024A02EB90127F +:104400001160704700100240002000213C4A1268F1 +:1044100042F480323A4B1A6000BF401C384A12689E +:1044200002F4003111B9B0F5006FF6D1344A1268C8 +:1044300012F4003F01D100BFFEE7314AD26942F0D9 +:1044400080522F4BDA612F4A126842F440422D4BC2 +:104450001A602B4A52682A4B5A601A4652685A60B0 +:104460001A46526842F480625A601A46526822F430 +:1044700040325A601A46526842F440325A601A4634 +:104480005268214B1A401E4B5A601A4652681F4B05 +:104490001A431B4B5A601A46126842F080721A6027 +:1044A00000BF174A126812F0007FFAD0154A12684E +:1044B00042F48032134B1A6000BF124A526812F461 +:1044C000803FFAD00F4A126842F400320D4B1A6056 +:1044D00000BF0C4A526812F4003FFAD0084A5268F2 +:1044E00022F00302064B5A601A46526842F002025A +:1044F0005A6000BF024A526812F0080FFAD07047A3 +:104500000010024000700040FFFFC3B700003408F5 +:1045100010B5FFF779FF10BD10B5124800684FF4D1 +:104520007A71B0FBF1F4601EB0F1807F01D30120FD +:104530000FE0601E4FF0E02148610F214FF0FF3087 +:10454000FFF72CFE00204FF0E02188610720086172 +:10455000002008B100BFFEE70021481EFFF71EFE45 +:1045600010BD000004000020884500080000002065 +:1045700094000000144200081C460008940000202B +:10458000040400002442000800000000000E270779 +:10459000001C0140001C0140001C0140001C0140A7 +:1045A00001000000020000000400000008000000FC +:1045B0000E061107000200000400000000040000C5 +:1045C0000800000000080140000801400206020641 +:1045D000070607060706070600080140001001400D +:1045E000001C0140001C01400100000000200000F0 +:1045F000200000001000000002060406070607065F +:104600000100000000200000200000001000000059 +:0C46100000020505000D05040628170A2D +:04000005080041317D +:00000001FF diff --git b/Utilities/Binary/USBFS/bin/LCD.bin a/Utilities/Binary/USBFS/bin/LCD.bin new file mode 100644 index 0000000..622a54e --- /dev/null +++ a/Utilities/Binary/USBFS/bin/LCD.bin diff --git b/Utilities/Binary/USBFS/bin/LED.bin a/Utilities/Binary/USBFS/bin/LED.bin new file mode 100644 index 0000000..20091aa --- /dev/null +++ a/Utilities/Binary/USBFS/bin/LED.bin diff --git b/Utilities/Binary/USBFS/hex/LCD.hex a/Utilities/Binary/USBFS/hex/LCD.hex new file mode 100644 index 0000000..16a2318 --- /dev/null +++ a/Utilities/Binary/USBFS/hex/LCD.hex @@ -0,0 +1,2892 @@ +:020000040800F2 +:10400000C004002065410008BB410008B34100081E +:10401000B7410008AD41000831420008000000002F +:10402000000000000000000000000000E741000860 +:10403000B141000800000000E5410008E941000826 +:104040007F4100087F4100087F4100087F41000850 +:104050007F4100087F4100087F4100087F41000840 +:104060007F4100087F4100087F4100087F41000830 +:104070007F4100087F4100087F4100087F41000820 +:104080007F4100087F4100087F4100087F41000810 +:104090007F4100087F4100087F4100087F41000800 +:1040A0007F4100087F4100087F4100087F410008F0 +:1040B0007F4100087F4100087F4100087F410008E0 +:1040C0007F4100087F4100087F4100087F410008D0 +:1040D0007F4100087F4100087F4100087F410008C0 +:1040E0007F4100087F4100087F4100087F410008B0 +:1040F0007F4100087F4100087F4100080000000068 +:104100007F410008000000007F4100087F41000857 +:104110007F4100087F4100087F4100087F4100087F +:104120007F4100087F4100087F4100087F4100086F +:104130007F4100087F4100087F4100087F4100085F +:104140007F4100087F4100087F4100087F4100084F +:10415000DFF80CD000F018F800480047E54D0008E3 +:10416000C00400200648804706480047FEE7FEE7F7 +:10417000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE717 +:10418000F141000851410008064C074D06E0E06887 +:1041900040F0010394E8070098471034AC42F6D38E +:1041A000FFF7DAFFA8F30008C8F3000800BFFEE736 +:1041B000704700BFFEE700BFFEE7704710B500285C +:1041C00007DA0A07140E054A00F00F031B1FD45428 +:1041D00003E00A07130E024A135410BD18ED00E065 +:1041E00000E400E07047704710B500F0B7F910BD6B +:1041F00010B50D48006840F001000B490860002030 +:104200004860C862084600680849084006490860D6 +:104210004FF47F0088600846006820F48020086022 +:1042200001F012F810BD000000100240FFFFF6EA96 +:1042300000BFFEE702E008C8121F08C1002AFAD139 +:1042400070477047002001E001C1121F002AFBD116 +:1042500070470000FEB50646B348DFF8D0C20090B4 +:10426000BCF800C00CF14F0C1FFA8CF3DFF8C0C291 +:10427000BCF800C00CF1450C1FFA8CF2DFF8ACC2A0 +:10428000BCF800C00CF1280C1FFA8CF1DFF8A0C2BA +:10429000BCF800C00CF11E0C1FFA8CF000F01BFDE6 +:1042A000A148DFF888C20090BCF800C00CF14F0CA8 +:1042B0001FFA8CF3DFF87CC2BCF800C00CF1450C8F +:1042C0001FFA8CF2DFF864C2BCF800C00CF1280CB5 +:1042D0001FFA8CF1DFF85CC2BCF800C00CF11E0CB8 +:1042E0001FFA8CF000F0F7FC8F48DFF84CC200900A +:1042F000BCF800C00CF14F0C1FFA8CF3DFF830C291 +:10430000BCF800C00CF1450C1FFA8CF2DFF828C293 +:10431000BCF800C00CF1280C1FFA8CF1DFF810C2B9 +:10432000BCF800C00CF11E0C1FFA8CF000F0D3FC9E +:104330007D48DFF804C20090BCF800C00CF14F0CBF +:104340001FFA8CF3DFF8ECC1BCF800C00CF1450C8F +:104350001FFA8CF2DFF8E0C1BCF800C00CF1280CA9 +:104360001FFA8CF1DFF8CCC1BCF800C00CF11E0CB8 +:104370001FFA8CF000F0AFFC1827704D4FF6FF705D +:104380006F498880002411E06D484068009015F85E +:10439000012BE1001E3188B269490B68019349681D +:1043A0000291BE2100F0F8FA601C84B2BC42EBDB43 +:1043B00036B1012E29D0022E4CD0032E6FD16FE0E2 +:1043C0006048DFF868C10090BCF800C00CF14F0CE9 +:1043D0001FFA8CF3DFF858C1BCF800C00CF1450C93 +:1043E0001FFA8CF2DFF844C1BCF800C00CF1280CB5 +:1043F0001FFA8CF1DFF838C1BCF800C00CF11E0CBC +:104400001FFA8CF000F067FC8BE04E48DFF81CC10F +:104410000090BCF800C00CF14F0C1FFA8CF3DFF8D1 +:1044200014C1BCF800C00CF1450C1FFA8CF2DFF887 +:10443000FCC0BCF800C00CF1280C1FFA8CF1DFF8AE +:10444000F4C0BCF800C00CF11E0C1FFA8CF000F098 +:1044500042FC66E03B48DFF8E0C00090BCF800C0DA +:104460000CF14F0C1FFA8CF3DFF8C4C0BCF800C08D +:104470000CF1450C1FFA8CF2DFF8BCC0BCF800C090 +:104480000CF1280C1FFA8CF1DFF8A4C0BCF800C0B6 +:104490000CF11E0C1FFA8CF000F01DFC41E024E032 +:1044A0002848DFF894C00090BCF800C00CF14F0C15 +:1044B0001FFA8CF3DFF87CC0BCF800C00CF1450C8F +:1044C0001FFA8CF2DFF870C0BCF800C00CF1280CA9 +:1044D0001FFA8CF1DFF85CC0BCF800C00CF11E0CB8 +:1044E0001FFA8CF000F0F7FB1BE0144D4FF47840FE +:1044F00013498880002411E011484068009015F8A5 +:10450000012BE1001E3188B20D490B680193496807 +:104510000291BE2100F040FA601C84B2BC42EBDB89 +:1045200000BF00BFFEBD0000607A0008060000204A +:104530000000002002000020080000200C000020E5 +:1045400028000020D86D00080349086000BF024918 +:1045500009680029FBD1704730000020044800683A +:1045600020B103480068401E014908607047000000 +:104570003000002000B597B04FF4A16000F086FD38 +:1045800040F2056000F082FD40F2066000F07EFD22 +:104590004FF4C16000F07AFD4CF20373032218213E +:1045A000224800F09FF94FF680730322182120481B +:1045B00000F098F90423032218211D4800F092F915 +:1045C000302303221821194800F08CF9802303229C +:1045D0001821164800F086F90020019002900390FF +:1045E000022004900A2005900220069005200790E2 +:1045F0000020089009900A900B900C9001200D90DB +:1046000000200E900F90109011901020129000201A +:104610001390149001A81590169008A800F016F8B1 +:10462000012000F007F817B000BD000000140140A1 +:1046300000180140C100A1F1C041096841F0010228 +:10464000C100A1F1C0410A607047000070B50021AF +:10465000002200230468E400A4F1C0442168414C16 +:104660002140D0E90B4544EA4504856A2C43456A5C +:1046700044EA0524056A2C43C56944EA8524856912 +:104680002C43456944EA0534056944EA45348568A4 +:1046900044EA8534C56844EAC53445682C4321435F +:1046A000446B247E641E04F00F04456B6D696D1E1F +:1046B000F02606EA05152C43456B2D696D1E4FF457 +:1046C0007F4606EA05252C43456BAD896D1E4FF4E8 +:1046D000702606EA05452C43456BAD682C43456BB7 +:1046E0006D682C43456B2D6844EA0502C46A082CAA +:1046F00001D141F040018468012C20D1846B247EDB +:10470000641E04F00F04856B6D696D1EF02606EAC9 +:1047100005152C43856B2D696D1E4FF47F4606EA07 +:1047200005252C43856BAD896D1E4FF4702606EA76 +:1047300005452C43856B2D6844EA050301E06FF0C5 +:1047400070430468E400A4F1C04421600468E400FC +:10475000A4F1C04462600468E400A4F1C044C4F859 +:10476000043170BD8100F7FF0146002231F81200CC +:104770004B88984200DA012231F812008B88984267 +:1047800000DA022231F81200CB88984200DA0322C4 +:1047900031F8120000B90422D0B2704710B50446B7 +:1047A0000B4931F8140000F071FC0A4951F824302B +:1047B000094951F824000322102100F093F805481C +:1047C00050F82400044951F82410486110BD00003D +:1047D000780000204800002038000020034951F8EC +:1047E0002010034A52F820205161704748000020F1 +:1047F00038000020034951F82010034A52F82020C5 +:104800001161704748000020380000202F4B1B88A2 +:104810004633984212DA2D4B1B881E3398420DDD29 +:104820002B4B1B881E33994208DD294B1B884633CE +:10483000994203DA13885B1C138046E0254B1B88E2 +:104840004633984212DA234B1B881E3398420DDD03 +:104850001F4B1B881E33994208DD1D4B1B884633B6 +:10486000994203DA53885B1C53802EE0174B1B8858 +:104870004633984212DA154B1B881E3398420DDDE1 +:10488000154B1B881E33994208DD134B1B8846339A +:10489000994203DA93885B1C938016E00D4B1B88CA +:1048A0004633984211DA0B4B1B881E3398420CDDBD +:1048B000094B1B881E33994207DD074B1B88463383 +:1048C000994202DAD3885B1CD38070470000002035 +:1048D000060000200200002008000020416170470F +:1048E00001617047F0B50C4616460025002204F021 +:1048F0000F0514F0100F08D0042E05D145F0030564 +:10490000C76B1F43C76300E03543002118E0012750 +:104910008F401F4212D002684FEA810C0F2707FA1E +:104920000CF7BA438F0005FA07F73A43282C01D158 +:10493000436102E0482C00D1036102604F1CB9B210 +:104940000829E4D308211CE001278F401F4216D01C +:104950004268A1F108074FEA870C0F2707FA0CF706 +:10496000BA43A1F10807BF0005FA07F73A43282C1C +:1049700001D1436102E0482C00D1036142604F1C29 +:10498000B9B21029E0D3F0BD02469068084201D0C8 +:10499000012070470020FCE70FB42DE9F0470646E0 +:1049A0000F46904600250024A146A246BDF82C00E3 +:1049B00000284DD100BF48E0A8F1200005EB001011 +:1049C0004D4911F80090BDF82E00F0B9002419E00F +:1049D000C4F1070049FA00F010F0010F08D0BDF84B +:1049E00030203B1999B2731B98B200F09EF907E092 +:1049F000BDF832203B1999B2731B98B200F095F9BB +:104A0000601C84B2082CE3DB1DE0002419E0C4F133 +:104A1000070049FA00F010F0010F08D0BDF830206F +:104A20007B1999B2331998B200F07FF907E0BDF80D +:104A300032207B1999B2331998B200F076F9601CD4 +:104A400084B2082CE3DB681C85B2102DB4DB4EE089 +:104A5000BDF82C0001284AD1002546E0A8F120002D +:104A600000EB400005EBC000244931F810A0BDF870 +:104A70002E00E0B9002417E04AFA04F010F0010F0C +:104A800008D0BDF830203B1999B2731B98B200F0E2 +:104A90004CF907E0BDF832203B1999B2731B98B26C +:104AA00000F043F9601C84B2102CE5DB1BE000240D +:104AB00017E04AFA04F010F0010F08D0BDF83020DA +:104AC0007B1999B2331998B200F02FF907E0BDF8BD +:104AD00032207B1999B2331998B200F026F9601C84 +:104AE00084B2102CE5DB681C85B2182DB6DBBDE85E +:104AF000F0075DF814FB000000560008005C000899 +:104B000030B5044600250021084600F00CF800F0FE +:104B10001AF800BF03E04FF0C24004806D1CB5F5E9 +:104B2000963FF8D330BD10B503460C4619464E20CB +:104B300000F050F921464F2000F04CF910BD4FF025 +:104B4000C2410880704722204FF0C0410880704762 +:104B500000B50121002000F03DF94AF6A401032030 +:104B600000F038F900210C2000F034F940F60C0177 +:104B70000D2000F02FF94FF42C510E2000F02AF9EF +:104B8000B0211E2000F026F942F63F31012000F04E +:104B900021F94FF4C061022000F01CF9002110201F +:104BA00000F018F946F27001112000F013F900210D +:104BB000052000F00FF90021062000F00BF94EF659 +:104BC0001C71162000F006F90321172000F002F9ED +:104BD00040F23321072000F0FDF800210B2000F007 +:104BE000F9F800210F2000F0F5F80021412000F035 +:104BF000F1F80021422000F0EDF80021482000F0FB +:104C0000E9F840F23F11492000F0E4F800214A2081 +:104C100000F0E0F800214B2000F0DCF84FF46F4189 +:104C2000442000F0D7F80021452000F0D3F840F2EE +:104C30003F11462000F0CEF840F20771302000F01E +:104C4000C9F84FF40171312000F0C4F84FF401713C +:104C5000322000F0BFF840F20251332000F0BAF8E1 +:104C600040F20751342000F0B5F84FF401713520BF +:104C700000F0B0F84FF40171362000F0ABF840F2CC +:104C80000251372000F0A6F840F202313A2000F03D +:104C9000A1F840F202313B2000F09CF800212320D3 +:104CA00000F098F80021242000F094F84FF400411F +:104CB000252000F08FF800214E2000F08BF8002115 +:104CC0004F2000F087F84CF2503301E0581E83B2B9 +:104CD000002BFBDC00BD2DE9F84F04460E461746BD +:104CE0009946DDF828B02546B046381B401CA9EB94 +:104CF0000601491C484300904FF0000A10E03BF8C1 +:104D0000022B4146284600F010F8681C85B2BD42CF +:104D100004DD08F101001FFA80F825460AF1010AB6 +:104D200000988245EBD3BDE8F88F70B506460C4677 +:104D30001546F02E02DCB4F5A07F00DD70BD2146E3 +:104D40003046FFF7F0FEFFF7FEFE2846FFF7F7FEBE +:104D500000BFF3E72DE9F04706460F469046994617 +:104D6000DDF820A034463D4600BF06E05246294605 +:104D70002046FFF7DAFF601C84B24445F6DB3D466F +:104D800006E0524629462046FFF7CFFF681C85B251 +:104D90004D45F6DB444606E0524629462046FFF7DD +:104DA000C4FF601E84B2B442F6DC4D4606E05246B3 +:104DB00029462046FFF7B9FF681E85B2BD42F6DCE2 +:104DC000BDE8F08701464FF0C04211804FF0C2426B +:104DD000108870474FF0C04210804FF0C2421180DF +:104DE000704700008AB00020089009900025974B7A +:104DF000D3E90012D3E90203CDE90603CDE9041299 +:104E000000264FF48041480300F036F90020FFF7F8 +:104E1000C5FC0120FFF7C2FC0220FFF7BFFC032006 +:104E2000FFF7BCFC00F014FAFFF7A4FB00F006FB50 +:104E30003220FFF789FB0020FFF7C4FF8449088078 +:104E4000FFF786FE4FF6FF70FFF75AFE81484FF4DA +:104E50008F73C722C82100902820FFF73CFF1F2036 +:104E60004FF49B73E6220A2100900846FFF772FF79 +:104E70001F20794988804FF6FF70C8800120488044 +:104E800000200880002461E07348406804AB009073 +:104E90001A5D724B1B88143399B2714B1B882333F4 +:104EA000082707FB043398B26B4B1F6802975B68B7 +:104EB00003933B46FFF770FD6748406805AB0090E1 +:104EC0001A5D664B1B88143399B2664B1B882333DB +:104ED000082707FB043398B25F4B1F6802975B6893 +:104EE00003933B46FFF758FD5B48406806AB0090D4 +:104EF0001A5D5D4B1B88143399B2594B1B882333C1 +:104F0000082707FB043398B2534B1F6802975B686E +:104F100003933B46FFF740FD4F48406807AB0090C6 +:104F20001A5D514B1B88143399B24E4B1B882333A7 +:104F3000082707FB043398B2474B1F6802975B684A +:104F400003933B46FFF728FD601C84B2042C9BDBD7 +:104F50004648424F00903F884F37BBB2404F3F8892 +:104F60004537BAB23D4F3F882837B9B23C4F3F88EA +:104F70001E37B8B2FFF7AFFE3C48384F00903F886D +:104F80004F37BBB2374F3F884537BAB2334F3F88B0 +:104F90002837B9B2334F3F881E37B8B2FFF79BFEB0 +:104FA0003248314F00903F884F37BBB22C4F3F887B +:104FB0004537BAB22C4F3F882837B9B2284F3F88BF +:104FC0001E37B8B2FFF787FE2848274F00903F886A +:104FD0004F37BBB2234F3F884537BAB2224F3F8885 +:104FE0002837B9B21F4F3F881E37B8B2FFF773FE9C +:104FF0002BE000F075FA012811D1681CC5B21C48DD +:10500000008800F0BFF9C0F5A07087B21948008889 +:1050100000F0A3F9804608AA3946FFF7F7FB142DE4 +:1050200013D108A8FFF7A0FB0646304600F0ABFA04 +:105030003046FFF70FF90020ADF82600ADF8240048 +:10504000ADF82200ADF820000025D2E7F0550008A9 +:1050500026000020E8860008280000200600002026 +:10506000000000200200002008000020607A0008F4 +:10507000B8000020B6000020024A0A400243024B5A +:105080001A60704780FFFF1F08ED00E0064901EB42 +:105090009011096800F01F0301229A401143024A4F +:1050A00002EB9012116070470010024010B50446E8 +:1050B00024B120210448FFF713FC03E0202102481B +:1050C000FFF70CFC10BD00000008014010B50446BD +:1050D00024B110210448FFF703FC03E0102102482B +:1050E000FFF7FCFB10BD00000018014010B5402187 +:1050F0000148FFF749FC10BD0008014010B5044607 +:1051000024B180210448FFF7EBFB03E08021024833 +:10511000FFF7E4FB10BD0000000801400020002163 +:10512000434A126842F48032414B1A6000BF401C6F +:105130003F4A126802F4003111B9B0F5006FF6D1A0 +:105140003B4A126812F4003F01D100BFFEE7384A23 +:10515000D26942F08052364BDA61364A126842F424 +:105160004042344B1A60324A5268314B5A601A46F8 +:1051700052685A601A46526842F480625A601A466F +:1051800052682D4B1A402A4B5A601A4652682B4BD4 +:105190001A43274B5A601A46D26A294B1A40244BAD +:1051A000DA621A46D26A274B1A43214BDA621A4650 +:1051B000126842F080621A6000BF1D4A126812F045 +:1051C000006FFAD01A4A126842F08072184B1A60C7 +:1051D00000BF174A126812F0007FFAD0154A126811 +:1051E00042F48032134B1A6000BF124A526812F424 +:1051F000803FFAD00F4A126842F400320D4B1A6019 +:1052000000BF0C4A526812F4003FFAD0084A5268B4 +:1052100022F00302064B5A601A46526842F002021C +:105220005A6000BF024A526812F0080FFAD0704765 +:105230000010024000700040FFFFC39F00003520B7 +:1052400000F0FEBF4906010010B5FFF767FF10BD73 +:1052500010B5124800684FF47A71B0FBF1F4601E8B +:10526000B0F1807F01D301200FE0601E4FF0E021FC +:1052700048610F214FF0FF30FEF7A0FF00204FF0F4 +:10528000E021886107200861002008B100BFFEE727 +:105290000021481EFEF792FF10BD000034000020E0 +:1052A00010B500F0FBF808B1002010BD00F03CF98B +:1052B000002000F04AF9D22000F047F900F0F6F89B +:1052C000F3E72DE9F04704460D4600260027B046D7 +:1052D000B146D22000F06CF80646922000F068F843 +:1052E0000746D22000F064F88046922000F060F873 +:1052F0008146B6EB080101D40A4600E04A42062A7C +:1053000007DCB7EB090001D4024600E04242062A5E +:1053100002DD0020BDE8F08706EB080000EBD0714D +:10532000C1F34F01218007EB090000EBD071C1F3FD +:105330004F0129800120EDE710B500F0AFF808B16A +:10534000002010BD00F0F0F8002000F0FEF89220E0 +:1053500000F0FBF800F0AAF8F3E7034600BFA3F55E +:10536000967202EB0210C0EB022240F6DE50B2FB56 +:10537000F0F081B2002901DDF02901DD0020704745 +:105380000846FCE7034600BFA3F1DC02C2EB821033 +:1053900000EB022240F62E60B2FBF0F081B2002951 +:1053A00002DDB1F5A07F01DD002070470846FCE773 +:1053B0002DE9FE430646002400250027A04600BF35 +:1053C0000CE0D22E04D1FFF76BFF2DF8140003E0A0 +:1053D000FFF7B2FF2DF81400601C84B2052CF0DB3F +:1053E000002416E0601C85B20FE03DF814003DF883 +:1053F0001510884207DD3DF814803DF815002DF8A2 +:1054000014002DF81580681C85B2052DEDDB601C9D +:1054100084B2042CE6DB0027012405E03DF81400EB +:10542000384487B2601C84B2042CF7DB032097FB5E +:10543000F0F01FFA80F84046BDE8FE8310B540F258 +:105440000260FFF723FE40F20660FFF71FFE2023F5 +:10545000032210210F48FFF745FA80230322102171 +:105460000C48FFF73FFA4023032204210948FFF7C5 +:1054700039FA1023032219460748FFF733FA20238D +:10548000032204210448FFF72DFA10210248FFF7F8 +:1054900027FA10BD000801400018014010B5202176 +:1054A0000148FFF771FA10BD0018014070B50024E3 +:1054B000002510E04FF6FF7000EA44040120FFF7DA +:1054C000F5FD0020FFF7F2FDFFF710FE08B1601CAC +:1054D00084B2681CC5B20C2DECDB204670BD000008 +:1054E00010B50024FFF7DAFF90B901E0601CC4B2E8 +:1054F0000B490C48FFF7E5FE012801D0142CF5DB21 +:10550000142C0BDB0020074908800549088010BDDA +:1055100000200449088002490880F8E70120F6E7E6 +:10552000B8000020B600002010B50020FFF7BEFD37 +:105530000120FFF7CBFD0120FFF7E0FD0120FFF781 +:10554000B5FD0020FFF7C2FD10BD70B50646002076 +:10555000FFF7ACFD002413E0C4F1070046FA00F0A9 +:1055600000F001052846FFF7C9FD0020FFF79EFD6A +:105570000120FFF79BFD0020FFF798FD601CC4B2DF +:10558000082CE9DB70BD10B504460020FFF726F9B2 +:105590000120FFF723F90220FFF720F90320FFF78E +:1055A0001DF934B1012C08D0022C0AD0032C10D1E3 +:1055B0000BE00020FFF71EF918E00120FFF71AF9B1 +:1055C00014E00220FFF716F910E00320FFF712F9AC +:1055D0000CE00020FFF70EF90120FFF70BF9022085 +:1055E000FFF708F90320FFF705F900BF00BF10BD62 +:1055F0004C4544324C4544334C4544344C45443589 +:10560000000000000000000000000000000000009A +:105610000000183C3C3C1818180018180000000046 +:105620000066666624000000000000000000000024 +:105630000000006C6CFE6C6C6CFE6C6C000000007A +:1056400018187CC6C2C07C0686C67C1818000000EC +:1056500000000000C2C60C183060C68600000000C2 +:105660000000386C6C3876DCCCCCCC7600000000C6 +:10567000003030306000000000000000000000003A +:1056800000000C18303030303030180C00000000B2 +:10569000000030180C0C0C0C0C0C18300000000032 +:1056A0000000000000663CFF3C66000000000000B7 +:1056B000000000000018187E18180000000000000C +:1056C0000000000000000000001818183000000062 +:1056D00000000000000000FE0000000000000000CC +:1056E000000000000000000000001818000000008A +:1056F0000000000002060C183060C08000000000AE +:1057000000007CC6C6CED6D6E6C6C67C0000000029 +:1057100000001838781818181818187E00000000B3 +:1057200000007CC6060C183060C0C6FE00000000F9 +:1057300000007CC606063C060606C67C000000008B +:1057400000000C1C3C6CCCFE0C0C0C1E000000007D +:105750000000FEC0C0C0FC0E0606C67C00000000B3 +:1057600000003860C0C0FCC6C6C6C67C0000000091 +:105770000000FEC606060C18303030300000000075 +:1057800000007CC6C6C67CC6C6C6C67C000000003B +:1057900000007CC6C6C67E0606060C780000000027 +:1057A0000000000018180000001818000000000099 +:1057B0000000000018180000001818300000000059 +:1057C000000000060C18306030180C0600000000C5 +:1057D000000000000000FE0000FE000000000000CD +:1057E0000000006030180C060C183060000000004B +:1057F00000007CC6C60C181818001818000000001D +:105800000000007CC6C6DEDEDEDCC07C00000000DE +:10581000000010386CC6C6FEC6C6C6C60000000032 +:105820000000FC6666667C66666666FC000000003A +:1058300000003C66C2C0C0C0C0C2663C00000000A0 +:105840000000F86C6666666666666CF8000000002C +:105850000000FE6662687868606266FE0000000014 +:105860000000FE6662687868606060F0000000001A +:1058700000003C66C2C0C0DEC6C6663A000000003A +:105880000000C6C6C6C6FEC6C6C6C6C60000000024 +:1058900000003C18181818181818183C00000000D0 +:1058A00000001E0C0C0C0C0CCCCCCC7800000000C2 +:1058B0000000E6666C6C78786C6666E600000000B6 +:1058C0000000F06060606060606266FE00000000E2 +:1058D0000000C6EEFEFED6C6C6C6C6C60000000064 +:1058E0000000C6E6F6FEDECEC6C6C6C60000000054 +:1058F0000000386CC6C6C6C6C6C66C3800000000BC +:105900000000FC6666667C60606060F0000000007D +:1059100000007CC6C6C6C6C6C6D6DE7C0C0E00001D +:105920000000FC6666667C6C666666E60000000049 +:1059300000007CC6C660380C06C6C67C00000000AD +:1059400000007E7E5A1818181818183C0000000035 +:105950000000C6C6C6C6C6C6C6C6C67C00000000D5 +:105960000000C6C6C6C6C6C6C66C38100000000019 +:105970000000C6C6C6C6C6D6D6FE6C6C00000000C7 +:105980000000C6C66C6C38386C6CC6C600000000DF +:105990000000666666663C181818183C0000000097 +:1059A0000000FEC6860C183060C2C6FE0000000073 +:1059B00000003C30303030303030303C00000000EF +:1059C00000000080C0E070381C0E060200000000DD +:1059D00000003C0C0C0C0C0C0C0C0C3C00000000EF +:1059E00010386CC60000000000000000000000003D +:1059F00000000000000000000000000000FF0000A8 +:105A0000303018000000000000000000000000001E +:105A10000000000000780C7CCCCCCC7600000000AC +:105A20000000E06060786C66666666DC000000007E +:105A300000000000007CC6C0C0C0C67C00000000A2 +:105A400000001C0C0C3C6CCCCCCCCC7600000000D4 +:105A500000000000007CC6FEC0C0C67C0000000044 +:105A60000000386C6460F060606060F0000000006E +:105A7000000000000076CCCCCCCCCC7C0CCC7800E8 +:105A80000000E060606C7666666666E60000000016 +:105A900000001818003818181818183C00000000EA +:105AA00000000606000E06060606060666663C00B0 +:105AB0000000E06060666C78786C66E600000000CC +:105AC00000003818181818181818183C00000000A2 +:105AD0000000000000ECFED6D6D6D6D600000000AE +:105AE0000000000000DC6666666666660000000076 +:105AF00000000000007CC6C6C6C6C67C00000000D0 +:105B00000000000000DC66666666667C6060F0008F +:105B1000000000000076CCCCCCCCCC7C0C0C1E0061 +:105B20000000000000DC7662606060F000000000B1 +:105B300000000000007CC660380CC67C000000003D +:105B40000000103030FC30303030361C00000000D7 +:105B50000000000000CCCCCCCCCCCC760000000007 +:105B6000000000000066666666663C1800000000E3 +:105B70000000000000C6C6C6D6D6FE6C00000000BD +:105B80000000000000C66C3838386CC60000000009 +:105B90000000000000C6C6C6C6C6C67E060CF800D9 +:105BA0000000000000FECC183060C6FE00000000BF +:105BB00000000E18181870181818180E00000000B1 +:105BC00000001818181800181818181800000000FD +:105BD0000000701818180E1818181870000000002F +:105BE000000076DC00000000000000000000000063 +:105BF0000000000010386CC6C6C6FE0000000000A1 +:105C00000000000000000000000000000000000094 +:105C10000000000000000000000000000000000084 +:105C20000000000000000000000000000000000074 +:105C300000008001800180018001800180018001DD +:105C4000800180018001800180018001000000004E +:105C50008001800100000000000000000000000042 +:105C600000000000CC00CC00CC00CC00CC00CC006C +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C9000000000000000000000000000600C600C2C +:105CA000600C30063006FE1FFE1F30063807180352 +:105CB000FE1FFE1F180318038C018C018C010000CD +:105CC00000008000E003F80F9C0E8C1C8C188C00E8 +:105CD0009800F801E007800E801C8C188C189C1826 +:105CE000B80CF00FE003800080000000000000000E +:105CF0000000000000000E181B0C110C110611060C +:105D0000110311039B018E01C038C06C60446044D4 +:105D1000304430441844186C0C3800000000000077 +:105D20000000E001F0033807180618063003F00100 +:105D3000F000F8009C310E33061E061C061C063FC0 +:105D4000FC73F021000000000000000000000000D3 +:105D5000000000000C000C000C000C000C000C00FB +:105D60000000000000000000000000000000000033 +:105D70000000000000000000000000000000000023 +:105D80000000000200038001C000C000600060004D +:105D90003000300030003000300030003000300083 +:105DA00060006000C000C00080010003000200002D +:105DB000000020006000C00080018001000300039B +:105DC00000060006000600060006000600060006A3 +:105DD0000003000380018001C0006000200000007B +:105DE000000000000000000000000000C000C00033 +:105DF000D806F807E0013003380700000000000073 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000008001800180 +:105E2000800180018001FC3FFC3F800180018001F6 +:105E30008001800100000000000000000000000060 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E600000008001800100010001800000000000AE +:105E70000000000000000000000000000000000022 +:105E80000000000000000000E007E0070000000044 +:105E90000000000000000000000000000000000002 +:105EA00000000000000000000000000000000000F2 +:105EB00000000000000000000000000000000000E2 +:105EC0000000C000C0000000000000000000000052 +:105ED0000000000C000C0006000600060003000392 +:105EE00000038003800180018001C000C000C00069 +:105EF00060006000000000000000000000000000E2 +:105F00000000E003F007380E180C0C180C180C18E1 +:105F10000C180C180C180C180C180C18180C380E3F +:105F2000F007E00300000000000000000000000097 +:105F3000000000018001C001F0019801880180018A +:105F40008001800180018001800180018001800149 +:105F5000800180010000000000000000000000003F +:105F60000000E003F80F180C0C180C1800180018AB +:105F7000000C000600038001C00060003000180023 +:105F8000FC1FFC1F000000000000000000000000DB +:105F90000000E001F807180E0C0C0C0C000C0006B9 +:105FA000C003C007000C001800180C180C18180CBF +:105FB000F807E003000000000000000000000000FF +:105FC0000000000C000E000F000F800DC00C600CD4 +:105FD000600C300C180C0C0CFC3FFC3F000C000C4F +:105FE000000C000C00000000000000000000000099 +:105FF0000000F80FF80F180018000C00EC03FC0765 +:106000001C0E001C0018001800180C181C0C180E90 +:10601000F807E0030000000000000000000000009E +:106020000000C007F00F381C181818000C00CC0333 +:10603000EC0F3C0E1C1C0C180C180C18181C380EFD +:10604000F007E00300000000000000000000000076 +:106050000000FC1FFC1F000C00060006000380036C +:106060008001C001C000E0006000600070003000EE +:1060700030003000000000000000000000000000C0 +:106080000000E003F007380E180C180C180C380646 +:10609000F007F007180C0C180C180C180C18380C1A +:1060A000F80FE00300000000000000000000000006 +:1060B0000000E003F007380E1C0C0C180C180C182C +:1060C0001C1C381EF81BE0190018000C000C1C0EDC +:1060D000F807F001000000000000000000000000D0 +:1060E00000000000000000000000000080018001AE +:1060F00000000000000000000000000000000000A0 +:10610000800180010000000000000000000000008D +:10611000000000000000000000000000800180017D +:10612000000000000000000000000000000000006F +:1061300080018001000100018000000000000000DB +:10614000000000000000000000000000000000004F +:106150000010001C800FE003F8001800F800E003B6 +:10616000800F001C00100000000000000000000074 +:10617000000000000000000000000000000000001F +:10618000F81F000000000000F81F000000000000E1 +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00008003800F001C007001F0018001FC007CA +:1061C000F00138000800000000000000000000009E +:1061D0000000E003F80F180C0C180C180018000C45 +:1061E000000600038001C000C000C00000000000E5 +:1061F000C000C0000000000000000000000000001F +:1062000000000000E00718180420C229224A1144A7 +:1062100009440944094409221113E20C02400420F4 +:106220001818E00700000000000000000000000057 +:10623000000080038003C006C006C006600C600C2E +:10624000301830183018F83FF83F1C700C600C60A4 +:1062500006C006C0000000000000000000000000B2 +:106260000000FC03FC0F0C0C0C180C180C180C0C88 +:10627000FC07FC0F0C180C300C300C300C300C18D8 +:10628000FC1FFC07000000000000000000000000F0 +:106290000000C007F01F38381C300C700660060084 +:1062A0000600060006000600060006600C701C30A2 +:1062B000F01FE007000000000000000000000000E8 +:1062C0000000FE03FE0F060E061806180630063004 +:1062D0000630063006300630063006180618060E60 +:1062E000FE0FFE03000000000000000000000000A0 +:1062F0000000FC3FFC3F0C000C000C000C000C00EC +:10630000FC1FFC1F0C000C000C000C000C000C000F +:10631000FC3FFC3F00000000000000000000000007 +:106320000000F83FF83F1800180018001800180087 +:10633000F81FF81F1800180018001800180018009F +:10634000180018000000000000000000000000001D +:106350000000E00FF83F3C780E6006E007C0030045 +:10636000030003FE03FE03C007C006C00EC03CF0DE +:10637000F83FE00F000000000000000000000000F7 +:1063800000000C300C300C300C300C300C300C3069 +:10639000FC3FFC3F0C300C300C300C300C300C301F +:1063A0000C300C3000000000000000000000000075 +:1063B0000000800180018001800180018001800156 +:1063C00080018001800180018001800180018001C5 +:1063D00080018001000000000000000000000000BB +:1063E0000000000600060006000600060006000683 +:1063F0000006000600060006000618061806380704 +:10640000F003E001000000000000000000000000B8 +:10641000000006300618060C060606038601C600B4 +:1064200066007600DE008E0106030606060C0618DE +:1064300006300660000000000000000000000000C0 +:1064400000001800180018001800180018001800A4 +:10645000180018001800180018001800180018007C +:10646000F81FF81F000000000000000000000000FE +:1064700000000EE01EF01EF01EF036D836D836D8DA +:1064800036D866CC66CC66CCC6C6C6C6C6C6C6C638 +:1064900086C386C30000000000000000000000006A +:1064A00000000C301C303C303C306C306C30CC3058 +:1064B000CC308C310C330C330C360C360C3C0C3C91 +:1064C0000C380C300000000000000000000000004C +:1064D0000000E007F81F1C380E70066003C003C000 +:1064E00003C003C003C003C003C006600E701C38A5 +:1064F000F81FE0070000000000000000000000009E +:106500000000FC0FFC1F0C380C300C300C300C3031 +:106510000C18FC1FFC070C000C000C000C000C00FD +:106520000C000C0000000000000000000000000053 +:106530000000E007F81F1C380E70066003E003C07F +:1065400003C003C003C003C007E006630E3F1C3C4A +:10655000F83FE0F700C0000000000000000000006D +:106560000000FE0FFE1F06380630063006300638E3 +:10657000FE1FFE0706030606060C06180618063060 +:10658000063006600000000000000000000000006F +:106590000000E003F80F1C0C0C180C180C001C0079 +:1065A000F803E00F001E0038063006300E301C1CC9 +:1065B000F80FE007000000000000000000000000ED +:1065C0000000FE7FFE7F800180018001800180014C +:1065D00080018001800180018001800180018001B3 +:1065E00080018001000000000000000000000000A9 +:1065F00000000C300C300C300C300C300C300C30F7 +:106600000C300C300C300C300C300C300C301818B6 +:10661000F81FE0070000000000000000000000007C +:10662000000003600630063006300C180C180C18F9 +:10663000180C180C380E3006300670076003600323 +:10664000C001C001000000000000000000000000C8 +:1066500000000360C361C361C361663366336633A0 +:106660006633663366336C1B6C1B6C1B2C1A3C1E2A +:10667000380E380E0000000000000000000000008E +:1066800000000FE00C7018303018700C600EC0075E +:1066900080038003C003E006700C301C18180C3017 +:1066A0000E6007E000000000000000000000000095 +:1066B000000003C006600C301C383818300C60062F +:1066C000E007C0038001800180018001800180011A +:1066D00080018001000000000000000000000000B8 +:1066E0000000FC7FFC7F006000300018000C0006FA +:1066F00000038001C0006000300018000C0006009C +:10670000FE7FFE7F0000000000000000000000008F +:106710000000E003E00360006000600060006000D3 +:106720006000600060006000600060006000600069 +:1067300060006000600060006000E003E0030000B3 +:10674000000030003000600060006000C000C00049 +:10675000C000C0018001800180010003000300032C +:10676000000600060000000000000000000000001D +:106770000000E003E0030003000300030003000344 +:1067800000030003000300030003000300030003F1 +:1067900000030003000300030003E003E003000024 +:1067A00000000000C001C001600360036003300608 +:1067B0003006180C180C000000000000000000005B +:1067C00000000000000000000000000000000000C9 +:1067D00000000000000000000000000000000000B9 +:1067E00000000000000000000000000000000000A9 +:1067F0000000FFFFFFFF000000000000000000009D +:1068000000000C000C000C000C000C000C00000040 +:106810000000000000000000000000000000000078 +:106820000000000000000000000000000000000068 +:10683000000000000000000000000000F003F80766 +:106840001C0C0C0C000FF00FF80C0C0C0C0C1C0F9B +:10685000F80FF01800000000000000000000000029 +:10686000000018001800180018001800D803F80FCE +:10687000380C181818181818181818181818380C70 +:10688000F80FD80300000000000000000000000026 +:10689000000000000000000000000000C003F0073E +:1068A000300E180C1800180018001800180C300EC4 +:1068B000F007C0030000000000000000000000001E +:1068C000000000180018001800180018C01BF01F66 +:1068D000301C181818181818181818181818301C00 +:1068E000F01FC01B000000000000000000000000BE +:1068F000000000000000000000000000C003F00FD6 +:10690000300C1818F81FF81F180018003818301C21 +:10691000F00FC007000000000000000000000000B1 +:106920000000800FC00FC000C000C000F007F007DB +:10693000C000C000C000C000C000C000C000C00057 +:10694000C000C000000000000000000000000000C7 +:10695000000000000000000000000000E00DF80F43 +:10696000180E0C0C0C0C0C0C0C0C0C0C0C0C180E4B +:10697000F80FE00D000C0C0C1C06F807F0010000ED +:10698000000018001800180018001800D807F80FA9 +:10699000381C181818181818181818181818181853 +:1069A0001818181800000000000000000000000087 +:1069B0000000C000C000000000000000C000C000D7 +:1069C000C000C000C000C000C000C000C000C000C7 +:1069D000C000C00000000000000000000000000037 +:1069E0000000C000C000000000000000C000C000A7 +:1069F000C000C000C000C000C000C000C000C00097 +:106A0000C000C000C000C000C000F8007800000056 +:106A100000000C000C000C000C000C000C0C0C0610 +:106A20000C038C01CC006C00FC009C018C030C035B +:106A30000C060C0C0000000000000000000000002C +:106A40000000C000C000C000C000C000C000C00006 +:106A5000C000C000C000C000C000C000C000C00036 +:106A6000C000C000000000000000000000000000A6 +:106A70000000000000000000000000007C3CFF7EE1 +:106A8000C7E383C183C183C183C183C183C183C180 +:106A900083C183C10000000000000000000000006E +:106AA0000000000000000000000000009807F80F40 +:106AB000381C181818181818181818181818181832 +:106AC0001818181800000000000000000000000066 +:106AD000000000000000000000000000C003F00FF4 +:106AE000300C181818181818181818181818300C0E +:106AF000F00FC003000000000000000000000000D4 +:106B0000000000000000000000000000D803F80FA3 +:106B1000380C181818181818181818181818380CCD +:106B2000F80FD8031800180018001800180000000B +:106B3000000000000000000000000000C01BF01F6B +:106B4000301C181818181818181818181818301C8D +:106B5000F01FC01B001800180018001800180000D3 +:106B6000000000000000000000000000B007F0037B +:106B70007000300030003000300030003000300055 +:106B800030003000000000000000000000000000A5 +:106B9000000000000000000000000000E003F0031F +:106BA000380E180C3800F003C007000C180C380E13 +:106BB000F007E003000000000000000000000000FB +:106BC000000000008000C000C000C000F007F00717 +:106BD000C000C000C000C000C000C000C000C000B5 +:106BE000C007800700000000000000000000000057 +:106BF0000000000000000000000000001818181835 +:106C00001818181818181818181818181818381CE0 +:106C1000F01FE0190000000000000000000000006C +:106C20000000000000000000000000000C18180C1C +:106C3000180C180C30063006300660036003600341 +:106C4000C001C001000000000000000000000000C2 +:106C5000000000000000000000000000C141C14130 +:106C6000C3616363636363633636363636361C1C32 +:106C70001C1C1C1C000000000000000000000000A4 +:106C80000000000000000000000000001C38381C5C +:106C9000300C600660036003600360036006300C24 +:106CA000381C1C380000000000000000000000003C +:106CB0000000000000000000000000001830301844 +:106CC00030187018600C600CE00CC006C006800321 +:106CD0008003800380018001C001F000700000008B +:106CE000000000000000000000000000FC1FFC1F6E +:106CF000000C000600038001C00060003000180096 +:106D0000FC1FFC1F0000000000000000000000004D +:106D1000000000038001C000C000C000C000C0002F +:106D2000C00060006000300060004000C000C00093 +:106D3000C000C000C000C0008001000300000000CF +:106D400000008001800180018001800180018001BC +:106D5000800180018001800180018001800180012B +:106D6000800180018001800180018001800100009C +:106D700000006000C000C00180018001800180012E +:106D80008001000300030006000300018001800170 +:106D90008001800180018001C000600000000000CF +:106DA00000000000000000000000000000000000E3 +:106DB000F010F81F080F00000000000000000000A5 +:106DC00000000000000000000000000000000000C3 +:106DD000001028002800011BFFFFFFFFFFFFFFFF3F +:106DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:106DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:106E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:106E1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:106E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:106E3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:106E4000FFFFFFFFFFFF3BFFD8FE76FE34F614F690 +:106E500014F6F4F515F697FE3BFFFFFFFFFFFFFF6B +:106E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:106E7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:106E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:106E90007DFFF2F58EF54BEDC9EC47ECC5EBA5EBAC +:106EA00064EB24EB04EB25EB67EB0AEC0FF57CFFBE +:106EB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:106EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:106ED000FFFFFFFFFFFFFFFFFFFFFFFFBFFFEBEC29 +:106EE00029EDAAED6AED2AEDE9ECA9EC48EC08ECF5 +:106EF000C7EBA7EB66EB25EBE5EAA4EA63EA42EA17 +:106F000046EB7CFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:106F1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:106F2000FFFFFFFFFFFFFFFFBEFF90F504EC4AED00 +:106F30006BED6BED4AED0AEDC9EC89EC48EC07EC22 +:106F4000C7EB86EB66EB26EB06EBE5EAC5EAA4EABF +:106F500023EA80E94CF47CFFFFFFFFFFFFFFFFFF08 +:106F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:106F7000FFFFFFFFFFFFF9FE8AEC26ECC9EC0AEDEC +:106F80000AED0AED0AEDC9ECA9EC68EC28ECE7EB98 +:106F9000A7EB86EB46EB26EB05EBE5EAC5EAA4EAB0 +:106FA00084EA64EAC1E9A5EA35FEFFFFFFFFFFFFBF +:106FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:106FC000FFFFFFFFD9FEA6EBE6EB69EC89ECA9EC2D +:106FD000C9ECC9ECC9EC89EC68EC48EC08ECC7EBEF +:106FE000A7EB66EB46EB26EB05EBC5EAA5EAA4EAC0 +:106FF00084EA64EA44EAE2E9C1E914F6FFFFFFFF2C +:10700000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:10701000FFFFD9FE65EBA6EB08EC28EC48EC68EC2A +:1070200069EC89EC68EC48EC28EC08ECC7EBA7EBC2 +:1070300086EB66EB26EB05EBE5EAC5EAA5EA84EA12 +:1070400064EA64EA44EA43EA03EAA1E9F4F5FFFFEB +:10705000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:10706000BEFFC8EB25EBA7EBC7EBE7EB08EC28EC82 +:1070700028EC28EC28EC08ECE7EBC7EBA7EB86EB59 +:1070800066EB46EB05EB05EBE5EAC5EAA4EA84EA24 +:1070900064EA44EA44EA23EA23EAC2E943EA3BFF1A +:1070A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:1070B00030F5A3EA66EB86EBA7EBC7EBC7EBE7EB94 +:1070C000E7EBE7EBE7EBC7EBC7EBA7EB86EB66EB92 +:1070D00046EB26EB05EBE5EAC5EAA5EA84EA84EA95 +:1070E00064EA44EA44EA23EA03EA03EA60E9CAEB11 +:1070F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:1071000020EA06EB46EB46EB86EB87EBA7EBA7EB1B +:10711000A7EBC7EBA7EBA7EB86EB86EB66EB46EBA3 +:1071200026EB05EBE5EAC5EAC5EAA4EA84EA64EAE7 +:1071300064EA44EA24EA23EA03EA03EAE3E920E111 +:107140005CFFFFFFFFFFFFFFFFFFFFFFFFFF0FF5EC +:1071500042EA05EB05EB26EB46EB46EB66EB66EB0E +:1071600066EB66EB66EB66EB46EB46EB46EB06EB57 +:1071700005EBE5EAC5EAC5EAA4EA84EA64EA64EA5A +:1071800044EA43EA23EA03EA03EAE3E9E3E961E9DB +:1071900088EBFFFFFFFFFFFFFFFFFFFFFFFFE5EAB9 +:1071A000A4EAE5EAE5EA05EB25EB26EB46EB46EB40 +:1071B00046EB46EB46EB46EB26EB25EB05EB05EB0A +:1071C000E5EAC5EAA5EAA5EAA4EA84EA64EA64EA8B +:1071D00044EA24EA23EA03EA03EAE3E9E3E9E3E928 +:1071E000E1E9FFFFFFFFFFFFFFFFFFFFFFFF43EAB4 +:1071F000A4EAC5EAC5EAE5EA05EB05EB25EB25EBD4 +:1072000026EB26EB26EB25EB05EB05EBE5EAE5EABD +:10721000C5EAA5EAA5EA84EA84EA64EA64EA44EAFB +:1072200024EA23EA23EA03EA03EAE3E903EAE3E9D7 +:10723000C2E91AFFFFFFFFFFFFFFFFFFFAEE43EA7D +:10724000A4EAA5EAC5EAC5EAC5EAE5EAE5EA05EB86 +:1072500005EB05EB05EBE5EAE5EAE5EAC5EAC5EA93 +:10726000A4EAA5EA84EA84EA64EA64EA44EA43EA2E +:1072700023EA23EA03EA03EAE3E903EA03EAE3E9A8 +:1072800081E9D5EDFFFFFFFFFFFFFFF758DE23EA9F +:1072900084EA84EAA4EAA5EAC5EAC5EAC5EAC5EA39 +:1072A000C5EAE5EAC5EAC5EAC5EAC5EAA5EAA5EA86 +:1072B000A4EA84EA84EA64EA64EA44EA44EA23EA5F +:1072C00023EA03EA03EAE3E9E3E9E3E9E3E9E3E9DB +:1072D000A1E953DDFFF7FFFFFFFF9EE738C643EA52 +:1072E00064EA84EAA4EAA5EAA4EAC5EAC5EAC5EA2A +:1072F000C5EAC5EAC5EAA5EAA5EAA4EAA5EA84EAD8 +:1073000084EA64EA64EA64EA44EA44EA23EA23EAAF +:1073100003EA03EA03EAE3E9E3E9E3E9E3E9E3E9AA +:10732000A2E933CD9FE7FFFFFFFF1CDF39BE83EAF1 +:1073300064EA84EA84EAA4EAA4EAA5EAA5EAA5EA5A +:10734000A5EAA5EAA5EAA5EAA4EAA4EA84EA84EA09 +:1073500084EA64EA64EA44EA44EA44EA24EA23EA7E +:1073600003EA03EAE3E9E3E9E3E9E3E9E3E9E3E97B +:10737000C2E975CDFDCEFFFFDFFF5AC63BB6C4EABA +:1073800044EA84EA84EA84EAA5EAA4EAA4EAA4EA4C +:10739000A4EAA4EAA4EAA4EA84EA84EA84EA64EA1D +:1073A00064EA64EA44EA44EA23EA23EA23EA03EAD1 +:1073B00003EAE3E903EAE3E9E3E9E3E903EAE3E90A +:1073C000C2E9B7BD5ABEDFFFDFFFD8B57CA663EACE +:1073D000A4EA84EA84EAA5EAA4EAA4EAA4EAA4EA7C +:1073E000A4EAA5EAA4EA84EA84EA84EA84EA64EAEC +:1073F00064EA44EA44EA44EA23EA23EA03EA03EAC1 +:1074000003EAE3E903EAE3E9E3E903EAE3E903EA98 +:10741000C2E1F9B5B8ADBEF7BFF797AD3B9E24E228 +:1074200005EB84EAA4EAA5EAA5EAA5EAA5EAA5EAA5 +:10743000A5EAA4EAA4EA84EA84EA84EA64EA64EABB +:1074400064EA64EA44EA44EA23EA23EA03EA03EA50 +:1074500003EA03EA03EAE3E9E3E9E3E903EA23EA07 +:1074600081E11AA677A5BEF7BEF776A5FA9D86D26A +:1074700063F205EBA4EAC5EAC5EAC5EAC5EAC5EACE +:10748000A5EAA5EAA5EAA4EA84EA84EA64EA64EA49 +:1074900064EA64EA44EA44EA23EA23EA03EA03EA00 +:1074A00003EA03EA03EAE3E903EA03EA23F2C3D9BE +:1074B000A2D91A96369DBEF79EF756A5B99D4BBB2D +:1074C000C1F105EB05EBE5EAE5EAE5EAC5EAC5EA5F +:1074D000C5EAC5EAA5EAA5EA84EA84EA84EA64EA98 +:1074E00064EA44EA44EA44EA24EA23EA23EA03EAAF +:1074F00003EA03EAE3E9E3E9E3E903F2E3D941C993 +:1075000066C2F995369D9EF79EF7359D98A53194F4 +:10751000A0F944EA66EB26EBE5EA05EB05EB05EBA3 +:10752000E5EAC5EAC5EAA5EAA4EA84EA84EA84EAC7 +:1075300064EA44EA44EA44EA24EA24EA23EA03EA5D +:1075400003EA03EAE3E9E3E923F2E3E163B120D1EB +:107550006D9BB89D56A59EF79EF7359D77A5159511 +:10756000E2D923F264EAA7EB66EB46EB66EB46EB67 +:1075700026EBE5EAC5EAA5EAA4EAA4EA84EA84EAF5 +:1075800064EA64EA44EA44EA44EA23EA23EA03EACE +:1075900003EA03EAE3E923FAE3D903A143B100C90B +:1075A000938C97A576ADBEF7DFFF55A5569D76A5C2 +:1075B0000BA302FA44EA64EA66EBC7EBC7EBA7EB5E +:1075C00066EB26EBC5EAC5EAC5EAA4EAA5EA84EAC1 +:1075D00084EA64EA64EA44EA44EA43EA24EA03EA1D +:1075E00003EA03F203F283C1E29023A101C14892AE +:1075F000369D77A5D8BDDEFFFFFFD7BD369D77A5A9 +:1076000031A466C223F264EA84EAE5EAC7EBE7EB59 +:10761000A7EB46EBE5EAE5EAC5EAC5EAA5EAA4EA8E +:1076200084EA84EA64EA64EA44EA24EA23EA43F264 +:1076300023F2C3D1E290A280029902A964A1CF8B68 +:1076400036A5B8AD9ACEDFFFFFFF99D656A598A50F +:10765000B3ACAE9B23DA64F2A4EAA5EAC5EA26EB52 +:1076600066EB66EB46EBE5EAC5EAC5EAA4EA84EA1E +:1076700084EA64EA64EA64F264F284FA23E2A3C16D +:1076800023A18270A280E290029902A90C83529CED +:1076900077A559C6DBDEFFFFFFFF5DEF56A5F9B505 +:1076A000D4AC71B46D8B02F284F2A5EAC5EAC5EAE6 +:1076B000A5EAA5E284E2C5E205EB05EB25EB25F39F +:1076C00005F3E5F2A4EA44DAC3C12399C388A28092 +:1076D0008278A280C288E29080A0CB7A319C729C92 +:1076E00019BE7ACE3CEFFFFFFFFFFFFF58CEB8ADCB +:1076F00039C671B492BC6E8B64DA84F2C5F2C5EA05 +:10770000A5EA84EA44E203DAC3D183C962C102B1C3 +:1077100002A1E298C290C288C288C288C288A288A8 +:10772000C280A280A288A290EC72529C119C97AD5C +:1077300039C69ACEFFFFFFFFFFFFFFFFBEF796ADF2 +:107740007AC618CE30B450BCAE9BA7BA84E2A4FA75 +:10775000A4EA64E244E223DAE3D1C3D1A3C163B96A +:1077600043B123A903A10299E390C390C288C288C0 +:107770008288818045790D7BF09B10A4D4A496ADBE +:10778000F8BD9EF7FFFFFFFFFFFFFFFFFFFF3CE796 +:10779000B7B51DD7BBDE0FBCCEB3EFAB2BA365C215 +:1077A00063EA63F244E204DAE3D1C3D1A3C963B963 +:1077B00043B123A923A10299E298E290A2906188A3 +:1077C00003796A7A6E8BCF9B11A4728CB38C35A52A +:1077D0003CE7FFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:1077E000BAD618BE7EE7BEEF55CDD2CCB2CC8DB3A3 +:1077F0000BA367AA03D2E2E9C2D9A3D182C962C1AD +:1078000042B922A902A9E2A0A198C28865796A7A40 +:107810002D8B8F93AFA311A48F6BD06B928CDBDE7B +:10782000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10783000FFFFDADE59C69EEFFFFFFFFF18E6EEC33B +:107840008CC38DBB6CABEB9A88A247AAE5A9C5A1F6 +:10785000A5A1A591C68907828A7AEC822D934EA3B1 +:107860008EA38F934E73293A8B4A728C3CE7FFFFAD +:10787000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10788000FFFFFFFF1BE779CE7DEFFFFFFFFFFBEE62 +:1078900095DD91CC8CCBE9C2EABAEABACAAAA9AA08 +:1078A000A9A2AAA2AA9AAAA2CBA26EABAF9B6E83F0 +:1078B0002D6B6A426629093AB394BEF7FFFFFFFFBA +:1078C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:1078D000FFFFFFFFFFFF9EF79AD6BAD6FFFFFFFF1D +:1078E000FFFF7EEFDBDE39D655CDB2C42FC4EFC328 +:1078F000EEBBEFB3F0AB109C118C6E6B0D5BAB4A23 +:10790000E8310419EC5A38C6FFFFFFFFFFFFFFFF05 +:10791000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10792000FFFFFFFFFFFFFFFFFFFF7DEF38C6FBDE1E +:10793000BEF77EEF3DDFFCCE9BC63AB6D8A5779D5D +:10794000D58C737CB06B4F630D53AC526B4A29429C +:107950000C6399D6FFFFFFFFFFFFFFFFFFFFFFFF55 +:10796000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10797000FFFFFFFFFFFFFFFFFFFFFFFFFFFF7DEFA9 +:10798000BAD69AD6BAD67ACE19BED8B576A5F59417 +:10799000938C127CB06BB06BAF73318455AD1CE728 +:1079A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:1079B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:1079C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:1079D000FFFFFFFF9DF73CE71CE7DBDE9AD67ACE80 +:1079E00059CE59CE9AD6FBDE7DEFFFFFFFFFFFFF9A +:1079F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:107A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:107A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:107A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:107A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:107A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:107A5000FFFFFFFFFFFFFFFF001028002800011BB2 +:107A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:107A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:107A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:107A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:107AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:107AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:107AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:107AD000DCEFB8DF95D774CF73CF75D797DFDBEFC7 +:107AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:107AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:107B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:107B1000FFFFFFFFFFFFFFFFFFFF95D74DC707B731 +:107B200008B708AF08A7E79EC796C68EA586A57EAC +:107B3000A47EE99653C7FEFFFFFFFFFFFFFFFFFF95 +:107B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:107B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:107B6000FFFFFFFFDDF74FC728BF6AD74BCF4BC7DB +:107B70002ABF2AB709AFE9A6E89EC896C78EA7868E +:107B8000A786A67E8576836EEA96DBEFFFFFFFFF72 +:107B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:107BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:107BB000FFFF50C707AF4AC74BCF4BCF4BC72ABFBA +:107BC0002AB709AF09A7E8A6E89EC896C78EA78678 +:107BD000A786A67EA67E8676856E6366EC9EFFFFF0 +:107BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:107BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF79F +:107C0000E8A608AF2AB72ABF2ABF2AC72ABF2ABFB9 +:107C10000AB709AF09A7E89EE896C896C78EC78637 +:107C2000A786A77E867E86768676866E6466646E76 +:107C3000BAE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:107C4000FFFFFFFFFFFFFFFFFFFFFFFFDBEFC5961B +:107C5000E8A609AF09B72AB72AB72AB72AB70AB7D9 +:107C600009AF09A7E9A6E89EC896C78EC78EA78662 +:107C7000A786A67EA67E86768676866E856E6566E5 +:107C8000425E97D7FFFFFFFFFFFFFFFFFFFFFFFFF2 +:107C9000FFFFFFFFFFFFFFFFFFFFDDF7A58EE89E61 +:107CA000E89E09A709AF09AF09AF09AF09AF09AF4E +:107CB00009A7E9A6E89EE896C896C78EA786A78674 +:107CC000A77EA67EA67686768676866E866E656E9C +:107CD00065664256B9E7FFFFFFFFFFFFFFFFFFFFAB +:107CE000FFFFFFFFFFFFFFFFFFFFC68EC78EC89697 +:107CF000E89EE89EE9A609A709A709A709A7E9A69A +:107D0000E89EE89EE896C896C78EC78EA786A78687 +:107D1000A67EA67E867686768676866E856E856E4D +:107D200065666566635EFFFFFFFFFFFFFFFFFFFF06 +:107D3000FFFFFFFFFFFFFFFF30B7A686C78EC89685 +:107D4000C896E896E89EE89EE89EE89EE89EE89E33 +:107D5000E89EC896C896C78EC78EA786A786A77EB8 +:107D6000A67EA67686768676866E856E656E856E2E +:107D700065666566445ECA8EFFFFFFFFFFFFFFFF7B +:107D8000FFFFFFFFFFFFFFFF8476A786C78EC78E2A +:107D9000C88EC896C896E896E896E896E896C8967B +:107DA000C896C88EC78EC78EA786A786A77EA67ED2 +:107DB000867E867686768676866E856E656E656646 +:107DC0006566656665664256BAE7FFFFFFFFFFFF1F +:107DD000FFFFFFFFFFFF52BF8576A786A786C786F6 +:107DE000C78EC78EC78EC88EC896C896C88EC78ED7 +:107DF000C78EC78EC78EA786A786A77EA67EA67EBD +:107E0000867686768676866E856E656E856E656606 +:107E1000656665666566445EEC9EFFFFFFFFFFFFDB +:107E2000FFFFFFFFFFFFC88E867EA77EA786A7867F +:107E3000A786C786C78EC78EC78EC78EC78EC78ECA +:107E4000C786A786A786A786A77EA67EA67EA676D5 +:107E5000867686768676866E856E656E65666566DE +:107E6000656665666566655E6366FFFFFFFFFFFF2B +:107E7000FFFFFFFFFFFF636E867EA67EA67EA77EC6 +:107E8000A786A786A786A786A786A786A786A7868A +:107E9000A786A786A77EA77EA67EA67E86768676FE +:107EA00086768676866E856E656E856E6566656697 +:107EB0006566656665666566435EDCEFFFFFFFFF2E +:107EC000FFFFFFFF7CEF846E8676A67EA67EA67EF1 +:107ED000A67EA77EA77EA786A786A786A786A77E5B +:107EE000A77EA67EA67EA67E867E86768676867609 +:107EF0008676866E866E656E856E65666566656677 +:107F00006566656665666566435E37CFFFFFFFFFA2 +:107F1000FFFFFFFFB9CE846E867686768676A67ED4 +:107F2000A67EA67EA67EA67EA67EA67EA67EA67E31 +:107F3000A67EA67EA67E86768676867686768676E9 +:107F4000866E866E856E856E656665666566656637 +:107F50006566656665666566635E94B6FFFFFFFFEE +:107F6000FFFF7EEF79C6846E867686768676867685 +:107F7000A676A67EA67EA67EA67EA67E867E867E29 +:107F8000867E867686768676867686768676866E11 +:107F9000856E856E856E6566656665666566656611 +:107FA0006566656665666566635E75B63EE7FFFF96 +:107FB000FFFFDBD63BC6A476867686768676867607 +:107FC00086768676867EA67EA67EA67EA676A67611 +:107FD000A67686768676867686768676866E866EB1 +:107FE000656E856E656E6566656665666566656601 +:107FF0006566656665666566635E57B67BCEFFFF40 +:10800000FFFF19BE1BC6A5768676867686768676AF +:10801000A676A676A676A676867686768676867600 +:1080200086768676867686768676866E866E856E89 +:10803000856E656E656665666566656665666566B8 +:108040006566656665666566635E19BEF9B5FFFFC0 +:10805000FFFFB7ADDABD877E867686768676867632 +:108060008676A67686768676867686768676867610 +:108070008676867686768676866E866E866E856E41 +:10808000656E856E65666566656665666566656668 +:108090006566656665666566635EDABDD8ADDFFFF9 +:1080A000FFFF77A599B5276EC78686768676867E8A +:1080B000A67EA67EA67E8676867686768676867668 +:1080C0008676867686768676866E866E856E656E12 +:1080D000856E656665666566656665666566656620 +:1080E0006566656665668566E35599B597ADBEF7C5 +:1080F000DFFF56A578ADE96DA676A77E867EA67EC3 +:10810000A67EA67EA67EA67E867E867686768676E7 +:108110008676867686768676866E866E856E856EA1 +:10812000656E6566656665666566656665666566EF +:10813000656665668566E45DC55D79AD77A59EF784 +:10814000BEF7369D58A58C758466C78EA67EA77E21 +:10815000A77EA67EA67EA67EA67EA67EA67E867626 +:108160008676867686768676866E866E856E856E51 +:10817000856E65666566656665666566656665667F +:10818000656685662566634D886558AD369D9EF7A4 +:108190009EF7359D77A5F184A4666566C896A78687 +:1081A000A786A786A786A786A67EA67EA67EA67693 +:1081B0008676867686768676866E866E866E856E00 +:1081C000656E656E65666566656665666566656647 +:1081D00085664566C344A34DED7458A5369D9EF74C +:1081E000BEF7159D77A5F5942566856E656EE89EAC +:1081F000C78EC78EC78EC78EA786A67EA67EA67E92 +:1082000086768676867686768676866E866E866EA6 +:10821000856E856E656E6566656665666566A5666E +:10822000255E623C0345824D938C77A576ADBEF703 +:10823000FFFF159D77A576A5EB6CA46E866E866E06 +:10824000C88EE89EE89EE896C88EA786A67EA67E83 +:10825000A67EA6768676867686768676866E866E06 +:10826000856E856E8566656665668566C56E444DF8 +:10827000022CA33C2245885C359D569DF8BDDFFF4E +:10828000FFFF96B557A576A5F28CC665A56E8676D6 +:108290008676A77EE89EE99EC896C786A77EA67EBC +:1082A000A67EA67EA676867686768676866E866E8E +:1082B000856E656E856E856EC56E045EE22BC22B83 +:1082C0004234A23CC344707C559DB8AD59CEFFFFEB +:1082D000FFFF9AD6369D77ADB3958F7C6566A676FF +:1082E0008676A67EA67EA786C88EC896A786A77E17 +:1082F000A67EA67EA67E8676867686768676866E2E +:10830000A66EA66EC676A45502344123A12B022C7C +:108310004234A134ED63328D56A59BCE9AD6FFFF31 +:10832000FFFFBEF735A5F9B5749DB2956D74656E06 +:10833000A676867EA67EA67E867666766676667E3D +:10834000867EA77EA786C786C77EA67E66760566DA +:108350006455833C812381238123A123C22B022CDA +:108360004134CB5B1185138D19BE59C69EF7FFFFB3 +:10837000FFFFFFFF59CEB8AD3AC6918DB2956E742E +:10838000256EC67EA67EA67E86766676456E0566D8 +:10839000E45DA455444D0345A33C623422340234C9 +:1083A000E22BE22BC22BC22BA12BA12BE12BE12B29 +:1083B000AB5BF184F07C97AD39C679CEFFFFFFFF50 +:1083C000FFFFFFFFDFFF96AD7BC699C69085D18D7D +:1083D000AF7C4865C57EA67E86766676456E256648 +:1083E000E55DC45D6455244DE344A33C623C4234E6 +:1083F0002234022CE22BC22BC12BC0238433ED6329 +:10840000F07C107D349597B5D7BDBEF7FFFFFFFF19 +:10841000FFFFFFFFFFFF3CE7B7B5FCD6FBD6908D13 +:10842000B08D70858C6CA76DC576856E656E256682 +:10843000E55DA4558455444DE344A33C623C42347D +:108440002234022CE12BE123832B894B6E74EF7CC9 +:10845000107DD28C939455A53CEFFFFFFFFFFFFFEB +:10846000FFFFFFFFFFFFFFFFDBDE19BE5EE79FF7A9 +:1084700075AE54A6329E6F85AC6C2865A5654466C2 +:10848000045EE4558455434D0345C23C823C62344E +:10849000212CC233853BAA534D6CAE74EE74F0842C +:1084A0008F6BD073938CFBE6FFFFFFFFFFFFFFFF97 +:1084B000FFFFFFFFFFFFFFFFFFFFDBDE39C6BFF758 +:1084C000FFFFFFFFF8C6AD7DCE7DAE7D4D75CB6C59 +:1084D000C95CC75CA654854C65442544E643E74B1C +:1084E000EA534B648C6CAD6CCD6CF07C6D632A42AE +:1084F000CC5231843CE7FFFFFFFFFFFFFFFFFFFF90 +:10850000FFFFFFFFFFFFFFFFFFFFFFFF3CE738C656 +:10851000FFFFFFFFFFFFDFFFD6BEEF8DAB75AC7532 +:10852000AC758B754B6D2A6DEA64CA64CA64CB6402 +:10853000CB64CB640E758F7C6E63E839C831E83943 +:10854000B394BEF7FFFFFFFFFFFFFFFFFFFFFFFF3B +:10855000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF4B +:1085600059CEFBDEFFFFFFFFFFFFBFFF5DE7B8C691 +:1085700054AE1196F08DAF858E856F852F85F08472 +:10858000907CF073ED5A4A4A093A8629CB5A9AD61A +:10859000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:1085A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:1085B000FFFF7DEF79CEFBDE9EF77EEF3DDFDCD661 +:1085C0007BCEFABD98AD37A5B5943384B1734F63B4 +:1085D0000E5BCC526B4A09426E6B38C6FFFFFFFF41 +:1085E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:1085F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:10860000FFFFFFFFFFFFBEF7DBDE7ACE7ACE59C653 +:1086100039BED8B577A515959384F1736F632E5B3A +:108620006F6B318476AD5DEFFFFFFFFFFFFFFFFF54 +:10863000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:10864000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:10865000FFFFFFFFFFFFFFFFFFFFFFFFDFFF7DEFDC +:108660001CE7DBDE9AD679CE59CE7ACEDBDE7DEF03 +:10867000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:10868000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10869000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:1086A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:1086B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:1086C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:1086D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:1086E0000010A0005700011BFFFFFFFFFFFFFFFF6F +:1086F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10870000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10871000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10872000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10873000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10874000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:10875000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:10876000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:10877000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:10878000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:10879000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:1087A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:1087B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:1087C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:1087D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:1087E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:1087F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10880000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10881000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10882000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10883000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10884000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10885000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10886000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10887000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10888000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:10889000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:1088A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:1088B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:1088C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFB9 +:1088D000FEFFFEFFFEFFFEFFFEFFFEFFFEFFFFFFAF +:1088E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:1088F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10890000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10891000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10892000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10893000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:10894000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:10895000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10896000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10897000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10898000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10899000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:1089A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:1089B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:1089C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:1089D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:1089E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:1089F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:108A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:108A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:108A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:108A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:108A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:108A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:108A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:108A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:108A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:108A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:108AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:108AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:108AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:108AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:108AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:108AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:108B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:108B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:108B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:108B3000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFF47 +:108B4000FEFFFFFFFFFFFEFFFFFFFEFFDFFFDFFF78 +:108B5000DFFFFFFFFFFFDFFFFFFFDFFFDFFFFFFFA5 +:108B6000FFFFDEFFDEFFFFFFDEFFFEFFFFFFFFFF79 +:108B7000FEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFF0D +:108B8000FEFFFEFFFEFFFEFFFFFFFEFFFEFFFFFFFB +:108B9000FFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFF05 +:108BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:108BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:108BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:108BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:108BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:108BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:108C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:108C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:108C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:108C3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:108C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:108C5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:108C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:108C7000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFF06 +:108C8000FFFFFFFFFFFFFFFFFFFFDFFFFEFFFEFF16 +:108C9000FEFFFEFFFEFFFEFFFEFFFDFFFEFFFEFFED +:108CA000FEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFDC +:108CB000FDFFFDFFFDFFFDFFFDFFFDFFFDFFFDFFD4 +:108CC000FDFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:108CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:108CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:108CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:108D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:108D1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:108D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:108D3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:108D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:108D5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:108D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:108D7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:108D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:108D9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:108DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:108DB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:108DC000DFF7DFF7DFF7FFFFDFF7FFFFFFF7FEF764 +:108DD000FEF7FEF7FFF7FEF7FEF7FFFFDEEF5EE7B9 +:108DE0007FE77FE75EE75EDF5EE75FE77FE75FE7FE +:108DF0007EE79EE7FFF7FFF7FFF7FFF7FFF7FFF7C5 +:108E0000FFF7DFF7FFFFDFF7DFF7FFF7DFF7FFFF22 +:108E1000FFFFDFF7FFFFFFFFFFFFFFFFFFFFFFFF8A +:108E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:108E3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:108E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:108E5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:108E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:108E7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:108E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:108E9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:108EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:108EB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:108EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:108ED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:108EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:108EF000FFFFFFFFFFFFFFFFFFFFFFFF9EEF5DE7AD +:108F00001CDFBBCE9BCE5BC699AD58A5B78C377C1A +:108F1000F673F673F673F673D56BB56B9463335BC8 +:108F2000335B1253F2521353535B13531353335B9C +:108F30001153525BB363B363B363B363B363F46B53 +:108F40001574B794189D38A51BBE7BCEBBD6DBD657 +:108F50001CDF7DEFBEF7FFFFFFFFFFFFFFFFFFFFFF +:108F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:108F7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:108F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:108F9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:108FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:108FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:108FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:108FD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:108FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:108FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:10900000FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF71 +:10901000FFFFFFFFFFFFFFFFDDFFFEFFFEFFFEFF85 +:10902000FEFFFEFFDDF7FEF7FEF7FFF7DFEFBEE71F +:109030007EDF5EDF3CB618951674B463765B5553DD +:109040009563B5631674167415743574D373B2735F +:10905000926B716BF27B127C127C327C738497ADC5 +:10906000D7B5D7B5D8B5F8B519BEF8B59ACE5DE77E +:109070007DEF7DEF7DEF7DEF7DEF1CE738C6F7BD1F +:10908000F7BDD8B5D9B556A55384F27BD173B16B72 +:10909000916BEE5A2F63D273B59499AD5CC63EE7DF +:1090A0003EE7BFF7BFF7BFF7BFFFBFF7DFFFDFFF49 +:1090B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:1090C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:1090D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:1090E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:1090F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10910000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10911000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:10912000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:10913000FFFFFFFFFFFFFEFFFEFFFFFFFFFFFFFF41 +:10914000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:10915000FFFFFEFFFEFFFEFFDDFFFEFFFEFFFFFF46 +:10916000FFFFFFF7BFEFFFD699A5368473637363E4 +:10917000B573B573387C387CF773B66B9363115352 +:10918000726314741895DBB55CC67FE79FEFBFF779 +:10919000DFF7DFF7DFF7DFF7FFFFFFFFDFF7DFF7CF +:1091A000DFF7DFF7FFFFDFF7DFF7DFF7DFF79EEF30 +:1091B000FFFFFFFFFFFFFFFFBEF7BEF7DFFFDFFF91 +:1091C000BEF7DFF7DFF7DFF7FFF7FFF7FFFFDFF7A8 +:1091D000FFF7BFEFDFF7DFF7BEF77EE77BC6D8B557 +:1091E000F59CD1731184728C97B5DBDE7EEFFFFFA7 +:1091F000FFFFFFFFBEF7FFFFFFFFFFFFFFFFFFFFC8 +:10920000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10921000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:10922000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:10923000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:10924000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:10925000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:10926000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:10927000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:10928000FFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFF0E +:10929000DFFFFFFFFFFFFFFFFFF7FDD6D9ADF6941D +:1092A000357CD46BB56B377C387C3784B573546BA5 +:1092B000746BB473F99C9BAD7DCEDDD65DE7BFF7D3 +:1092C000FFFFDFF7FFFFFFFFFFFFFFFFDFFFFFFFF6 +:1092D000FFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFBE +:1092E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:1092F000FFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFF9E +:10930000FFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10931000FFFFFFFFFFFFDFFFFFFFFFFFFFFFDFF7A5 +:10932000DFF7DFF7DFFF7EF71CE7DBDE9AD618C634 +:10933000D7BD38C659CEDFFFFFFFFFFFFFFFFFFF9E +:10934000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:10935000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:10936000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10937000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10938000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:10939000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:1093A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:1093B000FFFFFFFFFFFFDFFFDFFFFFFFFFFFFEFFFE +:1093C000FEFFFFFFFFFFFEFFFEFFFFFFFFFFDFF7D8 +:1093D000DFF71FDFBAAD978CD56BF56B167415747C +:1093E0001574D46BB363357CF894D9AD7BC6FDD6C8 +:1093F0007EEFDEF7FEFFFEF7FDFFFDFFDEFFFEFF67 +:10940000FEFFFEFFFEFFDEFFFEFFDEFFFEFFFEFFB4 +:10941000FEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF5E +:10942000FFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFF6C +:10943000FFFFFFFFFFFFFFFFDFFFDFFFFFFFDFFF9C +:10944000DFFFFEFFFEFFFEFFFEFFFEFFFEFFFEFF53 +:10945000FEFFFEFFFEFFFFFFFEFFFEFFDEFFFFFF42 +:10946000DEFFFEFFDFFFDFFFFFFFDFFFDFFFDFFFCE +:10947000DFFFBEF77DEFFFFFFFFFFFFFFFFFFFFFF7 +:10948000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10949000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:1094A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:1094B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:1094C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:1094D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:1094E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:1094F000FFFFFFFFDFFFDFFFFFFFFFFFFEFFFEFFBE +:10950000FEFFFEFFFEFFFFF7DFF75EE75BC6589D3D +:10951000357C7463D673187CD66BF6731674F89426 +:10952000B9AD7BC69FE7FFF7FFF7FFFFFFF7FFF738 +:10953000FEFFFEFFFDFFFDFFFDFFFDFFFEFFFEFF47 +:10954000FEFFFEFFFEFFFEFFFEFFFFFFFEFFFEFF32 +:10955000FEFFDEFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:10956000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:10957000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:10958000FFFFFEFFFEFFFFFFFFFFFFFFFEFFFFFFEE +:10959000FFFFFEFFFFFFFFFFFFFFFFFFDFFFFFFFFC +:1095A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:1095B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:1095C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:1095D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:1095E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:1095F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:10960000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:10961000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:10962000FFFFFFFFFFFFFFFFFFFFFFFFBEF7FFFF93 +:10963000FFFFFFFFFFFFFEFFDEF7DEF7FFFFFFFF8D +:10964000DFF7BFEF5DE7BBAD367C7263D46B567C52 +:109650003574D46BD46BF88C5BC65FE7FFF7FFF70C +:10966000FFF7FFFFFFFFFEFFFEFFFFFFFFFFFFFF14 +:10967000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10968000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10969000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:1096A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:1096B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:1096C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:1096D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:1096E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:1096F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10970000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10971000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10972000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10973000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:10974000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:10975000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:10976000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:10977000FFFFFFFFFEFFFCFFFDF7DFF7FFF75FE7EF +:10978000D794F15A946B387C7984956B535B9684AB +:109790009DC6FFF7DFEFFFF7FCF7FDF7DDF7FDFFF5 +:1097A000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:1097B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:1097C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:1097D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:1097E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:1097F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10980000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10981000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10982000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10983000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10984000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10985000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10986000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10987000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:10988000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:10989000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:1098A000FFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFE8 +:1098B000DFFFDFFFFFF7FFF73EDF7584936BD573A4 +:1098C0005784D46B7263147C3CBE5EE7BFEFDFF756 +:1098D000DFF7BEF7DEF7FEFFFEFFFEFFDDFFFEFF58 +:1098E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:1098F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10990000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10991000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10992000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:10993000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:10994000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10995000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10996000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10997000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10998000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10999000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:1099A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:1099B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:1099C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:1099D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:1099E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFBEF7D0 +:1099F000FFFF1CE778ADF57BB673187CD873966BC8 +:109A000077845BBE5EDFFDF7FDFFFDFFFEFFDEFF3F +:109A1000FEFFDFFFDFFFBFFFDFFFDFFFDFFFFFFF37 +:109A2000FFFFFFFFFFFFFEFFFEFFFFFFFFFFFFFF48 +:109A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:109A4000FFFFFFFFFFFFFFFFFEFFFEFFFFFFFFFF28 +:109A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:109A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:109A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:109A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFE7 +:109A9000FEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:109AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:109AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:109AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:109AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:109AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:109AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:109B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:109B1000FFFFFFFFFFFFFFFFFFFFDFFFDFFFDFFFB5 +:109B2000FFFFFFFFDFFFDFFFFFFFDFF79EE77BC6E3 +:109B3000557CB563F773387CF673F47377A53DE70E +:109B4000FFFFDEFFDEFFFFFFFFFFFFFFFFFFFFFF67 +:109B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15 +:109B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:109B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:109B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:109B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:109BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:109BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:109BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:109BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:109BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:109BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:109C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:109C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:109C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:109C3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:109C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:109C5000FFFFFFFFFFFFFFFFFFFFBEFFFFFFFFFF55 +:109C6000FFFFFEFFFDFFDEF75DE778A5B36BB46B8A +:109C70007884377CF5735584FAB5FFF7DFF7FFFF7B +:109C8000DFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:109C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:109CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:109CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:109CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:109CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:109CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:109CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:109D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:109D1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:109D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:109D3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:109D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:109D5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:109D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:109D7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:109D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:109D9000FFFFFFFFFFFFFEFFFEFFFEFFFEFFFFFFD7 +:109DA000BEEFFFF7BEEF97A53063F6735884F67BDE +:109DB0003363F89C9FEFFFFFDEF7FFFFFEFFFFFF1F +:109DC000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:109DD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:109DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:109DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:109E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:109E1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:109E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:109E3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:109E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:109E5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:109E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:109E7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:109E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:109E9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:109EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:109EB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:109EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:109ED000FFFFFFFFFEFFFEFFFEFFFEFFDEF7DFF7E7 +:109EE0009EE7F694B363367C998CF6733363DBB5E7 +:109EF000BFF7FFFFFEFFFEFFFEFFFEFFFEFFDEFFE0 +:109F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:109F1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:109F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:109F3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:109F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:109F5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:109F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:109F7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:109F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:109F9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:109FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:109FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:109FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:109FD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:109FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:109FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:10A00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:10A01000FFFFFEFFFEFFFEFFFFFFFFFF7FE7179D35 +:10A02000D473167C5A7CF773B46BFAB57FEFFFF7E5 +:10A03000FEFFFDFFFEFFFFFFFFFFFFFFFEFFFFFF35 +:10A04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:10A05000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:10A06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:10A07000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10A08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:10A09000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:10A0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:10A0B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10A0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10A0D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:10A0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10A0F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:10A10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:10A11000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:10A12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:10A13000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:10A14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:10A15000FFFFDEFFFFFFDFF7BFEFB9ADF473167C43 +:10A16000377C3884D5739AA57EE7DEF7FEF7FEFFCD +:10A17000FFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFF0F +:10A18000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:10A19000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:10A1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:10A1B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:10A1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:10A1D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:10A1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:10A1F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10A20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:10A21000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:10A22000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:10A23000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:10A24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:10A25000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:10A26000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:10A27000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:10A28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:10A29000FFFFDFF7DFF7DDD6968CD4733784378482 +:10A2A000D573978C3EE7FFFFFEF7FDFFFDFFFFFF35 +:10A2B000DFFFDFFFDFFFFFFFFFFFFFFFFFFFFFFF0E +:10A2C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:10A2D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:10A2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10A2F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10A30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D +:10A31000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:10A32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:10A33000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:10A34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:10A35000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10A36000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10A37000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:10A38000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:10A39000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:10A3A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:10A3B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:10A3C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:10A3D000FFFF9EEF1AB692639884377C167C147C3C +:10A3E000FDDEFFF7FEFFDEFFDEFFDEFFFFFFFFFF0C +:10A3F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:10A40000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:10A41000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:10A42000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:10A43000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:10A44000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:10A45000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:10A46000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10A47000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10A48000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:10A49000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:10A4A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10A4B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:10A4C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:10A4D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:10A4E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:10A4F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C +:10A50000FFFFFFFFFFFFFFFFFFFFFFFFDFFFBEF7C4 +:10A51000BEF7127C147C7784577C95635AA5DFF7CD +:10A52000DFF7FFFFFFFFFFFFDFFFDFFFFFFFFFFFA3 +:10A53000FEFFFDFFFDFFFEFFFEFFFEFFFFFFFFFF33 +:10A54000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:10A55000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:10A56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:10A57000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:10A58000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:10A59000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:10A5A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:10A5B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:10A5C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:10A5D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:10A5E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:10A5F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:10A60000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:10A61000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:10A62000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:10A63000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A +:10A64000FDFFFFFFDFFFFFFFDEF7FEFFDFF77CC64A +:10A65000B573597C3774567CD273DCD6FFFFDFF7B5 +:10A66000FFFFDEFFFFFFFFFFFFFFFFFFFFFFFFFF1B +:10A67000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10A68000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:10A69000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10A6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10A6B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10A6C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10A6D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10A6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10A6F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF6B +:10A70000FEFFDDF7FEFFBEF7FFFFDFFFFFFFFFFFEE +:10A71000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10A72000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:10A73000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:10A74000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:10A75000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:10A76000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:10A77000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9 +:10A78000FFFFFFFFFFFFFFFFDEF7DFF778ADD573B9 +:10A790003884577C1574D794DFF7FFFFDFF7FFFF8E +:10A7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10A7B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9 +:10A7C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10A7D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10A7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10A7F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10A80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10A81000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10A82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10A83000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10A84000FFFFDFF7DFF7DFF7FFFFDFFFFFFFFFFFB0 +:10A85000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10A86000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:10A87000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:10A88000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:10A89000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8 +:10A8A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:10A8B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8 +:10A8C000DFFFFFFFDEF7FEFFBEEF379DF573588415 +:10A8D0005984147499ADDFF7DFF7DFF7FFFFFFFF4F +:10A8E000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:10A8F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10A90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10A91000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47 +:10A92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:10A93000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10A94000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10A95000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10A96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10A97000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10A98000FFFFBFEF7BC677ADD394BEF7FFFFFFFF9E +:10A99000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10A9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10A9B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:10A9C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:10A9D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87 +:10A9E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10A9F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10AA0000DFFFFFFFFEF75DDF337C377C387C177498 +:10AA1000D46BDCD6DFF7FFFFFFFFFFFFFFFFDFFF99 +:10AA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:10AA3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:10AA4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:10AA5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:10AA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:10AA7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:10AA8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:10AA9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:10AAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:10AAB000FFFFFFFFFFFFFFFFFFFFFFFFDFFFDFF7EE +:10AAC000DFF71674315B4F5BFCD6DEF7FEFFFFFF4E +:10AAD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:10AAE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:10AAF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:10AB0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:10AB1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:10AB2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:10AB3000FFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFF45 +:10AB4000DFF7FFF7DFF7347C387C3A7C397C93639E +:10AB5000DCCEDFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10AB6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:10AB7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:10AB8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:10AB9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:10ABA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:10ABB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:10ABC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:10ABD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:10ABE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:10ABF000FFFFFFFFFFFFFFFFFFFFDFFFBFF7FFFFCD +:10AC0000948C545B315BFED69FEFFFFFFEFFFFFF8E +:10AC1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:10AC2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:10AC3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:10AC4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:10AC5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04 +:10AC6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:10AC7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:10AC8000DEF7DFF71374D56B5B843A7C54637EE7A1 +:10AC9000FEF7FEFFFEFFFEFFFFFFFFFFFFFFFFFFD0 +:10ACA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:10ACB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:10ACC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:10ACD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:10ACE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:10ACF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF84 +:10AD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:10AD1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:10AD2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10AD3000FFFFFFFFDFFFDFFFDFF7FFFF9FEFFAB54A +:10AD40000F5B7263FED6DFF7FFFFFFFFFFFFFFFF22 +:10AD5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:10AD6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:10AD7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:10AD8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:10AD9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:10ADA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:10ADB000FFFFFFFFFFFFFFFFFFFFDFFFDFFFDFFF03 +:10ADC000BFEF147C16747984397CB56B9CCE7DE71B +:10ADD000DDF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:10ADE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:10ADF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:10AE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:10AE1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:10AE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:10AE3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:10AE4000FFFFDFF7FFFFFFFFFFFFFFFFFFFFFFFF3A +:10AE5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:10AE6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:10AE7000FFFFFFFFFFFFFFFFFFFFDFF77BC6305B3A +:10AE80009263FDD6BFEFDFF7DFF7FFFFFFFFFFFFA6 +:10AE9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:10AEA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:10AEB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:10AEC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:10AED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:10AEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:10AEF000FFFFFFFFFFFFFFFFFFFFFFFFBEF7BEF7F4 +:10AF000056841774597C387CF46B97A5DFF7FFFFE4 +:10AF1000DFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFF69 +:10AF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:10AF3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:10AF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:10AF5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:10AF6000FFFFFFFFFFFFFFFFFFFFDFFFDFFFDFFF51 +:10AF7000DFFFDFFFDFFFDFFFDFFFDFFFFFF7FFF7B1 +:10AF8000FFF7FFF7FFFFFFFFFFFFFFFFFFFFFFF7E9 +:10AF9000FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF701 +:10AFA000FFFFFFFFFFFFFFF7FFF7FFF7FFF7FFF7D9 +:10AFB000FFF7FFFFFFFFDFF7DFF79CCE505B31535A +:10AFC0003ED7FEF7FFFFDFFFDFFFFFFFFFFFFFFFC3 +:10AFD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:10AFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:10AFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:10B00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:10B01000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:10B02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:10B03000FFFFFFFFFFFFFFFFDEFFBEF7FFFF57A58C +:10B04000F7735A84187C367CD58CFEF7BDF7DFFF8A +:10B05000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:10B06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10B07000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:10B08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:10B09000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:10B0A000FFF7FFFFFFFFFFFFFFFFFFF7DFF79EEF59 +:10B0B0009EE73DDF1CDF1CD71CDF1CD7FCCE9AC6E9 +:10B0C00039B639B639B639B639B639B639B639B608 +:10B0D00019B639B63AB63AB63AB63AB63AB639B613 +:10B0E00039B639B639B639B659B639B63AB63AB6C6 +:10B0F0001BAE7CBEDECE1ED7FED67163B2635FD7B9 +:10B10000BFE7DEF7DEF7FFFFFFFFFFFFDFFFDFFF39 +:10B11000FFFFFFFFFEFFFEFFFFFFFFFFFFFFFFFF41 +:10B12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:10B13000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:10B14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:10B15000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:10B16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:10B17000FFFFFFFFFFFFFEFFFEFFFFF77CC6D56B63 +:10B18000597C1774167CD3733DE7DFFFFEFFFFFF8A +:10B19000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:10B1A000FFFFFFFFFFFFFFFFFFFFFFFFBEF7FFFFF8 +:10B1B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:10B1C000FFFFFFFFDFF7DEF7DFF7DFF7FFFFDFFF50 +:10B1D000FFFFDFF79EEF9EEF9EEF1CD75DDFFCCEFB +:10B1E0007ABE59BEF8B5B7AD559D779D7795569502 +:10B1F000779D19AED8A5D8A5F9ADF9A51AA61AA6B6 +:10B2000019A619A61AA61AA61AA61AA61AA61AA640 +:10B210001AA61AA61AA6989598959895989598950D +:10B22000778D778D788D988D788D998D998D9A8D74 +:10B230009A8DBB9539853A8D735BB4631A959042AC +:10B24000535B915B136C17955CBEFDD67EE7BFF731 +:10B25000DFF7BFF7FEFFFEFFFEFFFFFFDFFFFFFF91 +:10B26000FFFFDFFFFEFFFFFFFFFFFFFFFFFFFFFF0F +:10B27000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:10B28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:10B29000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:10B2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:10B2B000FFFFFFFFFFFFFFFFFFFFBFEFD373587CD0 +:10B2C000397C587CF5735BC6FFFFFFFFFEFFFFFF75 +:10B2D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10B2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10B2F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF7E +:10B30000BEF73CE77DEF18BE38C69ACE59C6D7B512 +:10B31000D7B559C69ACEFBDEFCD6DFF7BFEFDFF715 +:10B32000FFF7DFF7DFF7FFF7FFF7FFF7FFF7DFEFD5 +:10B33000FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF75D +:10B34000FFF7FFF7FFF7FFF7FFF7FFF7FFF7FFF74D +:10B35000FFF7FFF7FFF7FFF7FFF7FFF7DFEFFFEF6D +:10B36000DFE7DFE7FFEFDFE73DD7FCC63AAEB8A582 +:10B37000F79DB6959795D2639363577C1453F45217 +:10B380001553365316531553545B325310530F4B0A +:10B39000D1631695BDCE9FEFDFF7FFFFDFF7FFFF0D +:10B3A000FEFFFEFFFEFFFEFFFFFFFFFFFFFFFFFFB1 +:10B3B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:10B3C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:10B3D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:10B3E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:10B3F000FFFFFFFFFFFFDFFFDFFFF373367C587CAB +:10B40000587C577CF373DFF7FFFFFFFFFEFFFFFF62 +:10B41000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:10B42000FFFFFFFFFFFFFFFFFFFFFFFFDFFFBEF795 +:10B43000DFFF7DEF5DE71BDF1CDF3CE7FBDE1CDF92 +:10B440009DEF7DEFBEF7BEF7DFF7FFFFFFFFFFFFCA +:10B45000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10B46000DFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:10B47000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:10B48000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:10B49000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10B4A000FFFFFFFFDEF7DEF7FFF7FFFFDFF7DFF756 +:10B4B000FFEFFFEF517412741ED79AA55684B56B37 +:10B4C000125BD54AF652365335535553334B13431B +:10B4D0003343534B13531253B46B389DFED6FFF7CF +:10B4E000FEF7DDF7FEFFFFFFFFFFFFFFFFFFFFFFA0 +:10B4F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C +:10B50000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:10B51000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:10B52000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B +:10B53000FFFFFFFFDFFFDFF7FABDD373587C397CD5 +:10B54000377CB46BFDD6DFF7FFFFFFFFFFFFFFFF88 +:10B55000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:10B56000FFFFFFFFFFFFFFFFDFFFBEF79EF77DEF4F +:10B57000DFFFBEF7DFF7DFF7FFFFDFFFFFFFDFFFD4 +:10B58000DFF7FFFFFFFFFFFFFFFFFFFFFFFFDFFF13 +:10B59000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:10B5A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:10B5B000FFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFF9D +:10B5C000FEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:10B5D000FFFFFFFFFFFFFFFFFFFFFEFFFEFFDFFF9D +:10B5E000DFFFFFFFFEFFDEFFFEFFFEFFFEFFFEFFB1 +:10B5F000BFEF169D948C7FEFDFF7DFF7FFF7DEEFED +:10B600009EE7BDCE9AA5156C3253134B354B364B86 +:10B61000374B374B3653365315531353525BF37333 +:10B620003AB6BFEFFFFFFFFFFFFFFEFFFEFFFFFF8A +:10B63000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:10B64000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:10B65000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +:10B66000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA +:10B67000FFFFDFFFFFFF9FEF3163167C7984397C8A +:10B68000577C315BDFEFFFFFFEFFFFFFFFFFFFFF98 +:10B69000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:10B6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10B6B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10B6C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10B6D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10B6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:10B6F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:10B70000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10B71000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:10B72000FFFFFFFFFFFFFEFFFEFFDEF7FFFFBEF79D +:10B7300017A5D37B9FF7BFFFDFFFFEFFFDFFFDF7E0 +:10B74000FDF7FEF7FEF7FFF73EDFB9A5F56B3453C3 +:10B75000154B164B364B365336531653155334533D +:10B76000F24A36741EDFDFFFFFFFFEFFFEFFFFFF22 +:10B77000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9 +:10B78000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9 +:10B79000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9 +:10B7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFC9 +:10B7B000DFFFFFFFFFF75CC6B46B5884387C58741A +:10B7C000167C589DFFF7DDF7FEFFFFFFFFFFFFFF31 +:10B7D000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10B7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10B7F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10B80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10B81000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10B82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10B83000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10B84000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10B85000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:10B86000FFFFFFFFFFFFFFFFFFFFFFFFBEEFB7B5CB +:10B87000738CBFFFFFFFDEFFDEFFFEFFFEFFFFFF5B +:10B88000FFFFFEFFFEFFFEFFFEFFDFF7FFF73BBE01 +:10B89000B26B31537553F44A164B164B3753F64A75 +:10B8A0001653F44AB56BFEDEDFF7FEFFFEFFFFFF27 +:10B8B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:10B8C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88 +:10B8D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10B8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10B8F000FFFFDEF7FFF7D2737884597C3874587CE9 +:10B90000D573BFEFFEF7FDFFFEFFFFFFFFFFFFFF59 +:10B91000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10B92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10B93000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10B94000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10B95000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10B96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10B97000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10B98000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10B99000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10B9A000FFFFFFFFFFFFFFFFFFF79EEF59C6D49495 +:10B9B000FFFFFFFFDEFFFEFFFEFFFFFFFFFFDFFFDA +:10B9C000FFFFDFFFDFFFFEFFFEFFBDF7FEFFDEF73D +:10B9D000BEF777A56F32545335531653F64A575373 +:10B9E000164B35533453F473FFF7FDF7FEFFFFFF9B +:10B9F000FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF58 +:10BA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:10BA1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:10BA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:10BA3000FFFFFFFF7EE7505B377C597C587C5774D3 +:10BA4000736BFFFFFEF7FDFFFEFFFFFFFFFFFFFF32 +:10BA5000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10BA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:10BA7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:10BA8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:10BA9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:10BAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:10BAB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:10BAC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:10BAD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:10BAE000FFFFFFFFFFFFFFFFBEEF7EE7F494BFEF16 +:10BAF000FFF7FFFFFFFFDEFFFEFFFFFFFFFFFFFF80 +:10BB0000FFFFDFFFFFFFFFFFFEFFFEFFDEFFFFFF88 +:10BB1000BFF7BFF7F88C32533453154B3653154BE0 +:10BB2000144B5553F34A535B9FE7FEF7FEFFFFFFAD +:10BB3000FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF16 +:10BB4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:10BB5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:10BB6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF05 +:10BB7000FFFFFFFF5BC6B46B387C587C577C577C5B +:10BB8000F37BDFF7FFFFFEFFFFFFFFFFFFFFFFFF7E +:10BB9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:10BBA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:10BBB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:10BBC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:10BBD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:10BBE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:10BBF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:10BC0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:10BC1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF54 +:10BC2000FFFFFFFFDFFFDFF73CE755ADBEF7DFFFAC +:10BC3000FFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFF34 +:10BC4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF24 +:10BC5000FFFFDFF79FEF335B365B164B154B7553DA +:10BC6000354B154B345351535FDFFFF7FFFFFFFF99 +:10BC7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:10BC8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4 +:10BC9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:10BCA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:10BCB000FEFFFEFFFAB5F77B397C577C577C577C3B +:10BCC000F37BFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:10BCD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:10BCE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:10BCF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:10BD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:10BD1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10BD2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:10BD3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:10BD4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:10BD5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:10BD6000FFFFDFFFFFFF5DEFD7BDBEF7FFFFDFFF88 +:10BD7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3 +:10BD8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3 +:10BD9000FFFFFFF7DFF7325B1653174B354B344B82 +:10BDA000144B565333533474FFF7DFF7BFFFFFFFD5 +:10BDB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:10BDC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:10BDD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73 +:10BDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:10BDF000FEFFFEFF98AD177C397C577C577C587C42 +:10BE0000F273DFF7FFFFFEFFFFFFFFFFFFFFFFFF04 +:10BE1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:10BE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:10BE3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:10BE4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:10BE5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:10BE6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:10BE7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:10BE8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:10BE9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFD2 +:10BEA000FFFFFFFFBEF71CE7DFFFFFFF9EF7FFFF6F +:10BEB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:10BEC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:10BED000FFFFFEF7DFEF31531553164B354B344B55 +:10BEE0005453F44A525BFCCE9FEFDFF7FFFFFFFF96 +:10BEF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:10BF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:10BF1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:10BF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:10BF3000FFFFFFFFB9AD177C397C577C577C597CDC +:10BF4000D273FFF7FFFFFEFFFEFFFFFFFFFFFFFFC4 +:10BF5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:10BF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:10BF7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:10BF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:10BF9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:10BFA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:10BFB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:10BFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:10BFD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF91 +:10BFE000FFFFDFFFFFFFFFFFFFFF7DEFFFFFDFFF33 +:10BFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:10C00000FFFFFFFFFFFFFFFFFFFFFEFFFEFFFEFF43 +:10C01000FEFFFEFFDCC6324BF44A164B154B1353A2 +:10C020003253535BBDCEBFEFFFFFDFFFDFFFFFFFEC +:10C03000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:10C04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:10C05000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10C06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 +:10C07000FFFFFEF7D9B5177C397C387C587C597C9A +:10C080009163FFF7FFFFFEFFFEFFFFFFFFFFFFFFD4 +:10C09000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10C0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10C0B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:10C0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10C0D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:10C0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:10C0F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:10C10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:10C11000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF4F +:10C12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF3F +:10C13000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:10C14000FFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFF01 +:10C15000FFFFBFEF935B144B365316531453325B00 +:10C16000505B5EE7BFEFFFFFBEF7FFFFFFFFFFFF84 +:10C17000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:10C18000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:10C19000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF +:10C1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFBF +:10C1B000FEFFFEF7DCD6746B397C587C377C397C0B +:10C1C000F473DDCEDFF7FFFFFEFFFFFFFFFFFFFF92 +:10C1D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10C1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:10C1F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:10C20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:10C21000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:10C22000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:10C23000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:10C24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:10C25000FFFFFFFFFFFFFFFFFFFFFFFFDFFF5DEFC0 +:10C260005DEFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:10C27000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:10C28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF706 +:10C29000BFF795843553154B575BF44A1353968477 +:10C2A0009FEF7DEFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10C2B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:10C2C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10C2D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10C2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:10C2F000FEFFFEFF7EE7125B5984577C377C597C3A +:10C30000377C1474FFF7DFFFFFFFFFFFFFFFFFFF26 +:10C31000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:10C32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:10C33000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10C34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10C35000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:10C36000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:10C37000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:10C38000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:10C39000FFFFFFFFFFFFDFF7FFFFFFFFFBDEF7BD44 +:10C3A000DFFFBEF7FFFFFFFFFFFFFFFFFFFFFFFF06 +:10C3B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:10C3C000FFFFFFFFFFFFDFFFFFFFBFF7DFF73EDFEE +:10C3D000347C115316531553F34A946B1CBEFFF76C +:10C3E000BFF7FEFFFEFFFFFFFFFFFFFFFFFFFFFFA7 +:10C3F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D +:10C40000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:10C41000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:10C42000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:10C43000FEFFFDFFDFF7978C5884367C787C397CD3 +:10C44000387C946BFDD6FFFFFEFFFFFFFFFFFFFF71 +:10C45000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10C46000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:10C47000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:10C48000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10C49000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:10C4A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C +:10C4B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C +:10C4C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:10C4D000FFFFFFFFFFFFDFF79EEFB7B5738CDFFFB6 +:10C4E000DFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFF9C +:10C4F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C +:10C50000FFFFFFFFFFFFDFFF9FF7BFF73BBE525B61 +:10C51000545B144B1453325317957EE7DFF7BFF784 +:10C52000FFFFDEFFFFFFFFFFFFFFFFFFFFFFFFFF3C +:10C53000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B +:10C54000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:10C55000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:10C56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:10C57000FEFFFDFFFFF7FED654637784577C397CBE +:10C58000397C377C347C9EEFDEFFFEFFFFFFFFFF30 +:10C59000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:10C5A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:10C5B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:10C5C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:10C5D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:10C5E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B +:10C5F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B +:10C60000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:10C61000FFFFFFFFDFF75DE7738C938CDFF79EF77B +:10C62000FFFFDFFFFFFFDFFFFFFFFFFFFFFFFFFF5A +:10C63000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +:10C64000FFFFFFFFDFFFFFFF5DE7958CF1523453E3 +:10C65000D4425653557C5FDFDEEFDDF7FDFFFEFF72 +:10C66000DFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF1A +:10C67000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10C68000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10C69000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10C6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10C6B000FFFFFFFFFFFFDFFF7384F473997C196CAA +:10C6C000587C577CD46BF794BFEFFFFFDEFFFEFF73 +:10C6D000FEFFDFFFDFFFFFFFFFFFFFFFFFFFFFFFAB +:10C6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:10C6F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:10C70000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:10C71000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:10C72000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19 +:10C73000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09 +:10C74000FEFFFDFFFCF7FEFFFFFFFFFFFFF7FFF718 +:10C750009FEFFFFF1ABE0F6397ADFFFFDDF7FEFFF0 +:10C76000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA +:10C77000FDFFFDFFFEFFDEFFDFFFBFF7FFFFDFFF77 +:10C78000DFFFFDEFFFEF9B9DB3421653155BF25A9F +:10C79000758C7FEFDFFFDFFFFFFFFFFFFFFFFFFF76 +:10C7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99 +:10C7B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10C7C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10C7D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10C7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10C7F000FFFFFFFFFFFFFFFFFFF7B26B777C58746F +:10C80000587C377C9884D46B78A5BFEFDFF7FFFFA7 +:10C81000DEFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10C82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10C83000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10C84000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:10C85000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:10C86000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8 +:10C87000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFC9 +:10C88000FFFFFFFFDFFFFFFFFEFFFDFFFEFFBFF724 +:10C890007EEFF27B0F63DDDEBFF7DFF7FEFFFFFF0A +:10C8A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98 +:10C8B000FFFFDFFFBFFFBFFFDFFFDFFFFFFFBDF7B2 +:10C8C000FEFFFBB57263525BF24A12537AA57EE714 +:10C8D000FFFFDEF7DFFFDFFFFFFFFFFFFFFFFFFFD1 +:10C8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10C8F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10C90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:10C91000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10C92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10C93000FFFFFFFFFFFFFFFFDFFF7FE7D36B567CAB +:10C94000597C397C387C587CD47355843EDFFFF7A2 +:10C95000DEF7FEFFFEFFFEFFFEFFFEFFFFFFFFFF15 +:10C96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10C97000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10C98000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10C99000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:10C9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:10C9B000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFF88 +:10C9C000DFFFDFFFBFFFDFFFBDF7DDF75DE7D594DA +:10C9D0002F63B5947FEFDFF7FFFFFFFFFFFFFFFF40 +:10C9E000FFFFFFFFFFFFFFFFFFFFFEFFFEFFFEFF5A +:10C9F000BFFFFFFFDFFFFEF7DDF7FEF7BFF779AD03 +:10CA0000B373F45AD252D4733BB69FE7FFF7FEF7E5 +:10CA1000FEFFDDFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10CA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:10CA3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:10CA4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:10CA5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:10CA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:10CA7000FFFFFFFFFFFFFFFFBEF7FFFF7EE77484AE +:10CA80001674387C397C597C587C1674D36B3ABE4A +:10CA9000BFEFFEF7FEF7FEFFFEFFFEFFFFFFFFFF0B +:10CAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:10CAB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:10CAC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:10CAD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:10CAE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:10CAF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF47 +:10CB0000FDFFFDFFDEFFBEF7FEDE39A53163137CBE +:10CB10005BC6FFFFBFF7DFF7DFFFDFFFDFFFFFFFD2 +:10CB2000FFFFFFFFFFFFFFFFFFFFFEFFFEFFFEFF18 +:10CB3000FEF7FEF7DEF7FEF71DDF57A5726BB25268 +:10CB40009673F99CFEDEDFF7FFF7DDEFFEF7FFFFE0 +:10CB5000DFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:10CB6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:10CB7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:10CB8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:10CB9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:10CBA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:10CBB000FFFFFFFFFFFFFEFFFFFFDFFFFFFFFFFFA6 +:10CBC000D684F46B377C5984387C597C78849363A1 +:10CBD0007784FCD6DFEFFFF7FFF7FFFFFFFFFEFFD5 +:10CBE000FEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF57 +:10CBF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:10CC0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:10CC1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:10CC2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:10CC3000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFEF70E +:10CC4000FEF7BFEFFCD6179D315BD573DBB5BFF7A1 +:10CC5000DFF7FFFFFEFFFEFFFEFFFFFFFFFFFFFF0F +:10CC6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:10CC7000FDF79DEFBCCE978CF35A5363968CFCD690 +:10CC8000FEF7FFFFFFFFFEF7FEFFFEFFFFFFFFFFC8 +:10CC9000DFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:10CCA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:10CCB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:10CCC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:10CCD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:10CCE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:10CCF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:10CD0000FFF79CCE305B567C587CF773397C387CBF +:10CD1000387CB36B1474DECEBFEFFFF7FFFFFEFF6E +:10CD2000FEFFFDFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:10CD3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:10CD4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3 +:10CD5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3 +:10CD6000FFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFD4 +:10CD7000FFFFFFFFFFFFFFFFFFF7FFFFFFF79EEF44 +:10CD8000BDCED473315B515BF9ADFFEFDFF7DFFF51 +:10CD9000FFFFFEFFFDFFFDFFFEFFFEFFFFFFFEFFAB +:10CDA000FEFFFEFFDFFFDFFFFFFFFFFFBFF7FEDE3F +:10CDB000988CD052F0527584DDD6DFF7FFF7FEF77E +:10CDC000FEF7FCFFFDFFFEFFFFFFFFFFFFFFFFFF82 +:10CDD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63 +:10CDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:10CDF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:10CE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32 +:10CE1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:10CE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:10CE3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:10CE4000FFFFDFF7DFF7B9B55163F5737884177427 +:10CE5000587C577C778415749363BAAD9FEFFFF7C6 +:10CE60009EEFFFFFFFFFFFFFFFFFDFF7FFFFDFFF8B +:10CE7000FFFFFFFFDFFFDFFFDFFFDFFFDFFFFFFF62 +:10CE8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:10CE9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:10CEA000DFFFDFFFDFFFFFFFFFFFFFFFFFFFDFFF12 +:10CEB000FFFFFFFFBFEFDFF7DFEFBDCE377C325B59 +:10CEC0007263B16B19B6DFF7BDE7FFF7FEF7FFFF3F +:10CED000FEFFFEFFFEFFFDFFFEFFFEFFFFFFFFFF69 +:10CEE000FFFFDFF7FFFF9EEF5EE7D59CCD524F635C +:10CEF000B894BED6DFF7FEF7FDF7FDF7FFFFDFFFC3 +:10CF0000BFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:10CF1000FDFFFDFFFFFFFFFFFFFFFFFFFFFFFFFF25 +:10CF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:10CF3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:10CF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:10CF5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:10CF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:10CF7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:10CF8000FFFFDFFFDFFFDFFF5EE71ABED26BB36B91 +:10CF9000767C587C577C587C787C1674D46BF47300 +:10CFA000389DFED6DFF7FFF7DFF7DFF7FFFFDFFF84 +:10CFB000DFFFDEFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:10CFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:10CFD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:10CFE000DFFFFFFFDFFFFFFFFFFFDFF7DFF7FFF7E9 +:10CFF000FFF71EDF78A57584D373315B73639AAD39 +:10D00000FDD6DEF7BDF7DEF7FEFFFFFFDEFFFFFF19 +:10D01000FFFFFFFFFFFFFFFFDFFFFFFFDFF7DFF790 +:10D02000BFF77BCEB494B0735284F8BD1DDFBFF759 +:10D03000FDF7DDF7FEFFFFFFDFFFBFFFDFFFFFFFB5 +:10D04000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10D05000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:10D06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:10D07000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:10D08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10D09000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10D0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:10D0B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10D0C000BFFFDFFFDFFFBEF7FEFFDFF7DFF79BC627 +:10D0D000F68CD56BF66B587C387C387C587C377C6A +:10D0E000F673D46B127CF59CB7B59ACE9EEFFFFF1A +:10D0F000FFFFFFFFDFFFDFFFDFFFDFFFDFFFDFFF00 +:10D10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:10D11000FFFFFFFFFFFFFFFFDFFFDFFFDFFFDFFF9F +:10D12000DFFFFFFFDFFFFFFF1CE73AC677ADF69496 +:10D13000137C926B9363D46B399D9BC6DDF7FEF72E +:10D14000FFFFBFF7DFFFBFFFDFFFDFFFDEFFDEFF19 +:10D15000DFFFDFFFDFFFDFFFDFFF3DE7D7B59594A0 +:10D16000137CD69C19C65EE7DFF7FFFFFFFFFFFFCA +:10D17000DEFFDEFFDFFFFFFFFFFFFFFFFEFFFDFF24 +:10D18000FDFFFFFFFFFFFFFFFEFFFEFFFFFFFFFFB3 +:10D19000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:10D1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F +:10D1B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:10D1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10D1D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:10D1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:10D1F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:10D20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:10D21000DFFF5EE7B7AD7384D273F4731674377CA7 +:10D22000587C597C5A7C3974F76B9563B5633674B6 +:10D230005A95FAAD3ABEDCD65EE7BFEFDFF7DFF70F +:10D24000FEF7FEF7FEF7FEFFFEFFFEFFFFFFFFFF0C +:10D25000FFFFDEF7DEF7FFF7BFEF9FE73DD7BCCE5E +:10D260001AB6DAADF78C557C92639463D56BD46BA8 +:10D27000958456A5BAD6DEF7FEFFFDFFDFFFDFFF80 +:10D28000FFFFFFFFDFFFDFFFFFFFFFFFDFF7FFF71E +:10D29000FFF7DFF7DBD6F8B5938C328456A5BBD603 +:10D2A000BEF7DFFFDFFFDFFFFFFFFFFFFFFFFFFF37 +:10D2B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10D2C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10D2D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:10D2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E +:10D2F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:10D30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D +:10D31000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:10D32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10D33000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10D34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:10D35000FFFFDFF7DFF7FFF7FFF71ED7BAAD557C0A +:10D36000D46BF5731674577C577C367C778497841E +:10D37000367C567CF673756B546333635363946BDE +:10D38000167C988CD994F994F99C1A9D1A9DFA9C54 +:10D39000F99C988C988CD573946B956B7463956B92 +:10D3A000B673177C956BB673578499A51EDFFFF78C +:10D3B000DFF7FFF7FFFFDFFFDEFFFEFFFFFFFFFFEF +:10D3C000DFFFBEF7FFFFFFFFBEF7DFFF7EEFFCDEF4 +:10D3D00055A55184149D1CDFDFF7FFFFFFFFFFFF02 +:10D3E000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF6D +:10D3F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D +:10D40000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C +:10D41000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C +:10D42000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C +:10D43000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC +:10D44000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC +:10D45000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC +:10D46000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC +:10D47000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC +:10D48000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC +:10D49000FFFFFFFFDEF7BEF7FFFFFFF7FFF7FFF726 +:10D4A000FFF7DFEF5FE7D9AD948491637163726337 +:10D4B0005263D473F673F873397C5984387C798459 +:10D4C00059845984998C5884387C177C177C177C34 +:10D4D000377CB46B535B74637163916B7484D9B59F +:10D4E0009CCE7EE7FFF7FFF7BEEFFEF7FEF7FEF7F5 +:10D4F000FEF7FFFFFFFFFFFFFFFFFFFFFFFFBEF78E +:10D50000DFFFDFFFDFFFDFFF18C6929455AD3DE779 +:10D51000DFF7BFF7DFF7DFFFDFF7FFFFFFFFFFFFFB +:10D52000FFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFF2B +:10D53000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB +:10D54000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:10D55000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB +:10D56000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB +:10D57000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB +:10D58000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB +:10D59000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B +:10D5A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B +:10D5B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B +:10D5C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B +:10D5D000FFFFFEFFFEFFFEFFFFFFFFFFFFFFFEF767 +:10D5E000FEF7FEF7FFF7DFF7FFFFDFF7BFF75EEFAE +:10D5F0005EEF3EE7BDCE9CC67BC6D9AD379D379D5D +:10D60000379D379D16953ABE5BBE7BC69CCEDCCE61 +:10D610005DDF5EE77EE79EEFDFF7FFFFFFF7FFFFCF +:10D62000FEF7FEFFDCF7FCF7FCF7FDFFFDFFFEFF5A +:10D63000FEFFFEFFFFFFFFFFFFFFDFFFFFFF7DEFAE +:10D6400059CE96B518C61CE77DEFBEF7DFFFDFFFAA +:10D65000BFF7FFFFDFFFFFFFFFFFFFFFFFFFDFFF62 +:10D66000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA +:10D67000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA +:10D68000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA +:10D69000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A +:10D6A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A +:10D6B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A +:10D6C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A +:10D6D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A +:10D6E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A +:10D6F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A +:10D70000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29 +:10D71000FFFFFFFFFFFFFFFFFEFFFEFFFEFFFEFF1D +:10D72000FEFFFEFFFFFFFFFFFFFFFFFFDFFFFFFF2B +:10D73000DFFFFFFFFFFFFFF7FFF7FFF7FFF7FFF741 +:10D74000FFF7FFF7FFF7FFFFFFFFFFFFFFFFFFFF01 +:10D75000FFFFFFFFFEFFFEFFDFFFDFFFDFFFDFFF5B +:10D76000DFFFFFFFDFFFFFFFFFFFFEFFFEFFFFFF0B +:10D77000FFFFFFFFFFFFFFFFFFFFFFFFDFFF9EF742 +:10D780005DEFDFFFFFFFFFFFFFFFFFFFDFFFFFFF9B +:10D79000FFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFF9A +:10D7A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89 +:10D7B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79 +:10D7C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69 +:10D7D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 +:10D7E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10D7F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39 +:10D80000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28 +:10D81000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18 +:10D82000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08 +:10D83000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8 +:10D84000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8 +:10D85000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFD9 +:10D86000FEFFFEFFFFFFFFFFFFFFFFFFFEFFFEFFCC +:10D87000FEFFFEFFFEFFFFFFFFFFFFFFDFFFDFFFFB +:10D88000DFFFDFFFDFFFDFFFDFFFDFFFFFFFFFFF68 +:10D89000FFFFFFFFFFFFFFFFFEFFFEFFFEFFFFFF9B +:10D8A000FFFFFFFFFFFFFFFFFFFFDFFFDFFFFFFFC8 +:10D8B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78 +:10D8C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68 +:10D8D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58 +:10D8E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48 +:10D8F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38 +:10D90000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27 +:10D91000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17 +:10D92000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07 +:10D93000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7 +:10D94000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7 +:10D95000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7 +:10D96000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7 +:10D97000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7 +:10D98000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7 +:10D99000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97 +:10D9A000FFFFFFFFFFFFFFFFFFFFFFFFFEFFFEFF89 +:10D9B000FEFFFEFFFEFFFEFFFEFFFEFFFEFFFFFF7E +:10D9C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67 +:10D9D000FFFFFFFFFFFFFFFFFDFFFDFFFDFFFDFF5F +:10D9E000FEFFFEFFFFFFFFFFFFFFFFFFFFFFFFFF49 +:10D9F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37 +:10DA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26 +:10DA1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16 +:10DA2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06 +:10DA3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6 +:10DA4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6 +:10DA5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6 +:10DA6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6 +:10DA7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6 +:10DA8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6 +:10DA9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96 +:10DAA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86 +:10DAB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76 +:10DAC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66 +:10DAD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56 +:10DAE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46 +:10DAF000FFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFF37 +:10DB0000FFFFFFFFFFFFFEFFFEFFFEFFFEFFFEFF2A +:10DB1000FEFFFEFFFEFFFEFFFFFFFFFFFFFFFFFF19 +:10DB2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05 +:10DB3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5 +:10DB4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5 +:10DB5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5 +:10DB6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5 +:10DB7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5 +:10DB8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5 +:10DB9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95 +:10DBA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85 +:10DBB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75 +:10DBC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65 +:10DBD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55 +:10DBE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45 +:10DBF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35 +:10DC0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24 +:10DC1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14 +:10DC2000FFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFF05 +:10DC3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4 +:10DC4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4 +:10DC5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4 +:10DC6000FFFFFFFFFFFFFFFFFFFFFEFFFEFFFFFFC6 +:10DC7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4 +:10DC8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4 +:10DC9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94 +:10DCA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84 +:10DCB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74 +:10DCC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64 +:10DCD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54 +:10DCE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44 +:10DCF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34 +:10DD0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:10DD1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13 +:10DD2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03 +:10DD3000FFFFFFFFFFFFDFFFBEF7FFFFDFFFDFFF9C +:10DD4000DFFFBEF7FFFFFFFFFFFFDFFFDFFFFFFF8C +:10DD5000DFFFFFFFFFFFFFFFFFFFFFFFDFFFDFFF33 +:10DD6000DFFFBEF7FFFFFFFFFFFFFFFFFFFFFFFF2C +:10DD7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:10DD8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:10DD9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:10DDA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:10DDB000FFFFDFFFDFFFFFFFFFFFDFFFBEF7FFFF1C +:10DDC000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:10DDD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53 +:10DDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:10DDF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10DE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22 +:10DE1000FFFFFFFFBEF7FFFFDFFFBEF7FFFFFFFFC4 +:10DE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:10DE3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:10DE4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:10DE5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:10DE6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFE2 +:10DE7000FFFFFFFFFFFFFFFFFFFFDFFFDFFFBEF73B +:10DE80009EF7DFFFBEF7DFFFFFFFDFFFFFFFDFFFD4 +:10DE9000FFFFFFFFFFFFFFFFFFFFBEF7FBDE3CE7DB +:10DEA000BEF7DFFFFFFFFFFFFFFFFFFFFFFFFFFFEB +:10DEB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:10DEC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:10DED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:10DEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:10DEF000FFFFDFFFDFFFDFFFDFFFDFFFDFFFDFFF12 +:10DF0000DFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:10DF1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11 +:10DF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:10DF3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:10DF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:10DF5000DFFFBEF75DEF7DEFBEF7DFFFFFFFFFFFE7 +:10DF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:10DF7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:10DF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:10DF9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:10DFA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:10DFB000FFFFFFFFBEF7FFFF5DEF55AD494AE318D6 +:10DFC000A21065290C6396B5BEF7DFFFFFFFDFFFE8 +:10DFD000DFFFFFFFFFFFDFFFDFFFD7BD20000421D2 +:10DFE000B6B5BEF7DFFFFFFFFFFFFFFFFFFFFFFF3D +:10DFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:10E00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:10E01000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:10E02000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:10E03000FFFFD39C0842494A2842694AEF7BB6B5A4 +:10E04000BEF7BEF7FFFFFFFFFFFFFFFFFFFFFFFF72 +:10E05000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0 +:10E06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:10E07000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10E08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10E09000DFFFBAD62000A210D7BDDFFFFFFFFFFFD2 +:10E0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10E0B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:10E0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:10E0D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:10E0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:10E0F000FFFFDFFFFFFFDBDEE31820002000200032 +:10E10000410800006108000028423CE7BEF7FFFF1D +:10E11000FFFFFFFFFFFFDFFFDFFFF39C6108410808 +:10E120008A52FFFFDFFFFFFFFFFFFFFFFFFFFFFF41 +:10E13000FFFFDFFFDFFFFFFFFFFFFFFFFFFFFFFF2F +:10E14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:10E15000FFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFEF +:10E16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:10E17000FFFFEF7B200020000000000000002000D7 +:10E18000C7393CE7FFFFFFFFFFFFFFFFFFFFFFFF78 +:10E19000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFAF +:10E1A000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:10E1B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10E1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:10E1D000DFFF79CE20000000C739BEF7FFFFFFFF49 +:10E1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:10E1F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:10E20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:10E21000FFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:10E22000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:10E23000DFFFDFFF5DEFA210000020002421EF7B55 +:10E240009AD6BAD64D6B2000C318AE73BEF7FFFF47 +:10E25000FFFFFFFFFFFFFFFFDFFF9EF779CEEB5AC7 +:10E26000BAD6BEF7DFFFFFFFFFFFFFFFFFFFFFFF95 +:10E27000BEF7DFFF9EF79AD67DEFBEF7FFFFDFFF09 +:10E28000FFFFBEF7FFFFFFFFFFFFFFFFFFFFFFFFE7 +:10E29000DFFFFFFFFFFF5DEFBAD6FFFFFFFFDFFFEE +:10E2A000FFFFFFFFDFFFDFFFDFFFFFFFFFFFFFFFDE +:10E2B000FFFFCF7B00008210AA524D6B0842000086 +:10E2C0004108E3181CE7BEF7FFFFFFFFFFFFFFFF5A +:10E2D000DFFFFFFFDFFFDFFFFFFF9EF7FBDEBAD6AA +:10E2E000FFFFFFFFBEF7BEF7FFFFFFFFFFFFFFFFD0 +:10E2F000FFFFFFFF9EF7FFFFFFFFBEF7DFFFFFFF00 +:10E30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D +:10E31000DFFFDFFF1CE7EB5A38C6DFFFFFFFFFFF21 +:10E32000FFFFFFFFFFFFDFFFFFFFDFFFFFFF5DEFEF +:10E33000BAD65DEFDFFFBEF7FFFFDFFFFFFFBEF7DF +:10E34000FFFFFFFFFFFFFFFFDFFFFFFFFFFF7DEF8F +:10E350009AD65DEFFFFFFFFFDFFFDFFFFFFFDFFF6D +:10E36000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFDD +:10E37000FFFFDFFFB29400004108C739BAD6FFFFA4 +:10E380009EF7DFFFFFFFDBDED7BD9EF7DFFFDFFF7E +:10E39000FFFFFFFFFFFFFFFFFFFFF7BD61088210D8 +:10E3A00014A5FFFFFFFFFFFFFFFFFFFFFFFF7DEF54 +:10E3B0007DEFC7394108200000008631E31841088D +:10E3C000694A1CE7DFFFFFFFFFFFFFFFFFFFFFFFC3 +:10E3D000DFFF96B5E318200020004108694A82104B +:10E3E0006108D39CDFFFFFFFDFFFFFFFFFFFFFFFA1 +:10E3F000FFFF108400006108B294DFFFDFFF59CEF9 +:10E40000821000008A52FFFFDFFFDFFFFFFFFFFFE8 +:10E41000FFFFBEF7FFFF59CE8631410820004108BB +:10E42000A2101084DFFFFFFFFFFFFFFFFFFFFFFFD2 +:10E43000FFFFDFFFAA52410808423CE7BEF7BEF7E4 +:10E44000452941082842FBDEFFFFFFFFFFFFFFFFDA +:10E45000DFFFBAD682104108B294BEF7FFFFFFFF7C +:10E46000FFFFFFFFDFFFDFFFBEF7718CE318200027 +:10E4700000002000E318718CDFFFDFFFDFFFDFFF0C +:10E48000FFFFFFFFFFFFBEF77DEFB294C318410807 +:10E4900000004108E31814A5FFFFBEF7FFFFFFFFD0 +:10E4A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C +:10E4B000DFFFDFFF494A20008210D7BDDFFFBEF734 +:10E4C000DFFFDFFFDFFFFFFFFFFF9EF7BEF7FFFF6E +:10E4D000BEF7FFFFFFFFFFFFFFFF18C60000610848 +:10E4E0001084DFFFFFFFFFFFFFFFFFFFFFFFBEF70F +:10E4F000652941082000A21045296108200000007C +:10E5000045291CE7BEF7FFFFFFFFFFFFFFFFFFFFEF +:10E510001CE76108200061082421A63120000000CA +:10E520002000EB5ABEF7DFFFFFFFFFFFFFFFFFFFFB +:10E53000FFFFCF7B00008210B294FFFFDFFFFFFFE1 +:10E54000E739200004215DEFDFFFDFFFFFFFFFFF62 +:10E55000DFFFDFFFDBDEC3182000E318A6318A529D +:10E56000821000008A52FFFFFFFFDFFFFFFFFFFF67 +:10E57000FFFFDFFF1CE782102000718CBEF759CE31 +:10E58000200061082C63BEF7FFFFFFFFFFFFFFFFC6 +:10E59000FFFFDBDE000020008E73DFFFFFFFFFFFC9 +:10E5A000FFFFFFFFDFFFBEF7CF7B000020008210E0 +:10E5B00086316529200061088E73BEF7BEF7FFFF24 +:10E5C000FFFFFFFFFFFFDFFF96B520002000C3180D +:10E5D00008422842000061081084DFFFBEF7FFFFF9 +:10E5E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B +:10E5F000DFFFFFFFE7390000E3181CE7DFFFDFFF65 +:10E60000AA520842E739E739E739694ADBDEDFFF1A +:10E61000DFFFFFFFFFFFFFFFFFFFF7BD2000200030 +:10E620004D6BFFFFFFFFFFFFFFFFFFFFDFFF5DEF12 +:10E6300061082000E739B6B57DEFBAD68210000038 +:10E6400045291CE7BEF7FFFFFFFFFFFFFFFFFFFFAE +:10E650000C63610861080C63BAD67DEF92942000C8 +:10E660002000CB5ADFFFFFFFDFFFFFFFFFFFFFFFB1 +:10E67000FFFFCF7B00006108B294FFFFFFFFDFFFC9 +:10E68000494A200082103CE7BEF7FFFFDFFFFFFF93 +:10E69000DFFFFFFF4D6B00008210494A55AD55ADBD +:10E6A000CF7B2000200014A5FFFFDFFFFFFFFFFF4F +:10E6B000FFFFFFFFDFFF8A52000024213CE74529CE +:10E6C00000002421D7BDDFFFDFFFFFFFFFFFFFFFBB +:10E6D000FFFFDBDE000000006D6BDFFFFFFFFFFFD1 +:10E6E000FFFFFFFFDFFFFBDE00002000452934A510 +:10E6F000BEF7BEF759CE718C1CE7DFFFDFFFFFFFCF +:10E70000FFFFFFFFFFFFDFFF08422000A2100C63A6 +:10E7100075AD55AD2C6300002000F7BDFFFFFFFF76 +:10E72000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9 +:10E73000DFFFBEF78E7341084108FBDE9EF7DFFF67 +:10E740004529200000002000200061082C63FFFF05 +:10E75000FFFFFFFFFFFFFFFFFFFFF7BD00002000EF +:10E760008E73BEF7FFFFFFFFFFFFFFFFFFFFDBDE44 +:10E7700000006108EF7BDFFFDFFFFFFF24210000C7 +:10E7800045291CE7DFFFFFFFFFFFFFFFFFFFDFFF64 +:10E79000A63100000421D7BDDFFFDFFFDFFF8210BD +:10E7A00000002C63DFFFDFFFFFFFFFFFFFFFFFFF26 +:10E7B000FFFFEF7B00006108B294FFFFBEF7DFFFB1 +:10E7C000C7390000E318FBDEFFFFDFFFFFFFDFFFBD +:10E7D000DFFFBEF724212000000020000000000021 +:10E7E000000000002000CB5ABEF7FFFFFFFFFFFF35 +:10E7F000DFFFDFFFBEF7FBDE610820008A5200006A +:10E8000041080C63BEF7BEF7FFFFFFFFFFFFFFFFEE +:10E81000FFFFDBDE000000006D6BDFFFFFFFFFFF8F +:10E82000FFFFFFFFDFFF96B5000020008E739EF70D +:10E83000FFFFBEF7BEF7DFFFDFFFDFFFFFFFFFFFDA +:10E84000FFFFFFFFDFFF9EF7A21020000000000087 +:10E8500000002000200020000000718CDFFFFFFF7F +:10E86000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8 +:10E87000FFFFDFFF59CE00000000EB5ADFFFBEF7BD +:10E88000BEF714A514A5E3180000E31875ADDFFF6B +:10E89000BEF7FFFFFFFFFFFFFFFF38C60000410884 +:10E8A000718CFFFFFFFFFFFFFFFFFFFFFFFF9EF7E2 +:10E8B000200041086D6BDFFF9EF77DEFC31800005D +:10E8C0004529FBDEFFFFFFFFFFFFFFFFFFFFDFFF2D +:10E8D0000C636108C318F7BDBEF7DFFF18C6200040 +:10E8E0002000CB5ADFFFFFFFFFFFFFFFFFFFFFFF0F +:10E8F000FFFFAE7300008210B294DFFFDFFF92943F +:10E9000000004108A6319EF7DFFFDFFFFFFFDFFFBA +:10E91000BEF7FFFF2842000065299294518CF39CBA +:10E92000B29492949294D39CFFFFDFFFDFFFFFFF2E +:10E93000FFFFFFFFFFFFFFFF8A52200000000000E3 +:10E940000421D7BDFFFFFFFFFFFFFFFFFFFFFFFF1A +:10E95000FFFFDBDE000000006D6BFFFFFFFFFFFF2E +:10E96000FFFFFFFFFFFF18C620000000718CDFFFD4 +:10E970009EF7FFFFBEF7DFFFFFFFDFFFFFFFBEF7E2 +:10E98000FFFFFFFFFFFFBEF704218210A631EF7BE0 +:10E99000B294718CD39C108414A5F7BDDFFFFFFFE8 +:10E9A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77 +:10E9B000DFFFDFFFDFFFCF7B41082000E318B294C9 +:10E9C00096B5518CC31800006108694ABEF7FFFF75 +:10E9D000DFFFFFFFFFFFFFFFFFFF38C62000200023 +:10E9E0009294FFFFFFFFFFFFFFFFFFFFFFFFDFFF2F +:10E9F000452900006108CB5A8E73C318000000003F +:10EA000045291CE7FFFFFFFFFFFFFFFFFFFFDFFFC1 +:10EA1000DBDE41086108A63134A5EF7B6108000008 +:10EA20002000AA52FFFFDFFFFFFFFFFFFFFFFFFFF6 +:10EA3000FFFFCF7B0000000045290842E3180000DB +:10EA40000000A2103084FFFFBEF7FFFFFFFFDFFFD3 +:10EA5000FFFFFFFF38C620000000EB5A7DEF55ADE9 +:10EA600086318A52FBDEDFFFFFFFFFFFDFFFFFFF84 +:10EA7000FFFFFFFFDFFF9EF779CE200020000000A0 +:10EA8000CB5ABEF7FFFFFFFFFFFFFFFFFFFFFFFFB8 +:10EA9000FFFFDBDE00002000CF7BBEF7FFFFFFFFA4 +:10EAA000FFFFFFFFDFFFDFFF694A410841081084D5 +:10EAB00038C6718CA2102C635DEFDFFFDFFFFFFF14 +:10EAC000FFFFFFFFFFFFDFFF14A500000000EF7B4B +:10EAD0003CE7B294C3182C63BEF7DFFFFFFFFFFFD4 +:10EAE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36 +:10EAF000DFFFDFFFDFFFDFFFF39CA210000020003D +:10EB00000000200000008210494ABAD6BEF7BEF7C6 +:10EB1000DFFFFFFFFFFFFFFFFFFF96B5200041086B +:10EB20003084DFFFFFFFFFFFFFFFFFFFFFFFDFFF7F +:10EB30009EF7494A200000000000821020000000DB +:10EB40004529FBDEFFFFFFFFFFFFFFFFFFFFFFFF8A +:10EB5000BEF755AD821000000000410841082000BA +:10EB60004108CB5AFFFFDFFFDFFFFFFFFFFFFFFF83 +:10EB7000FFFFAE730000000000000000200041080D +:10EB8000C318CF7B9EF7FFFFBEF7FFFFFFFFBEF767 +:10EB9000FFFFBEF7FFFF14A58210200041082000F0 +:10EBA0000000A210AA52FFFFFFFFFFFFFFFFDFFFE1 +:10EBB000FFFFDFFFDFFFFFFFBEF7694A20004529A7 +:10EBC000F7BDDFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:10EBD000DFFFBAD6000020008E73BEF7FFFFFFFFF5 +:10EBE000FFFFFFFFFFFFBEF75DEF284220000000A0 +:10EBF000200000002000C3181084DFFFDFFFDFFFCC +:10EC0000FFFFFFFFFFFFFFFF7DEF9294000020005A +:10EC100020000000200082104D6BBEF7DFFFDFFFF9 +:10EC2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFF14 +:10EC3000FFFFDFFFFFFFBEF7DFFF1CE7D39C694A42 +:10EC4000A631C739CB5AB2945DEFDFFFBEF7FFFFA5 +:10EC5000FFFFFFFFFFFFFFFFFFFF9EF7D39C6D6BE2 +:10EC600014A5BEF7FFFFFFFFFFFFFFFFBEF79EF7F4 +:10EC7000D7BDD7BDD7BD1084CF7BEF7B4108000047 +:10EC80000842BEF7BEF7FFFFFFFFFFFFFFFFFFFFDA +:10EC9000DFFFBEF7BAD61084084208429294F39C74 +:10ECA0006D6BB294DFFFDFFFFFFFFFFFFFFFFFFF92 +:10ECB000FFFFFBDE718C6D6B6D6B4D6B6D6B518C63 +:10ECC00059CEBEF7DFFFDFFFDFFFBEF7FFFFFFFF1D +:10ECD000DFFFFFFFDFFFBEF7DBDE518C694AC7397C +:10ECE000CB5AB2945DEFFFFFFFFFDFFFFFFFDFFFB7 +:10ECF000FFFFDFFFDFFFDFFFFFFF1CE7518CCF7B54 +:10ED00007DEFDFFFDFFFFFFFDFFFFFFFFFFFFFFF05 +:10ED1000DFFF9EF755AD8E73F39CDFFFFFFFFFFF14 +:10ED2000FFFFFFFFDFFFDFFFDFFFFFFFD7BD6D6BE3 +:10ED3000E739E7390C6375ADBEF7DFFFDFFFFFFF93 +:10ED4000FFFFFFFFFFFFFFFFFFFFFFFF79CE8E7387 +:10ED5000E739C739CB5A96B5BEF7DFFFDFFFFFFFB4 +:10ED6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3 +:10ED7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3 +:10ED8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93 +:10ED9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83 +:10EDA000FFFFFFFFFFFFFFFFFFFFFFFFDFFF7DEF25 +:10EDB000C31800000421694AAA52E3180000821017 +:10EDC0004D6BBEF7FFFFFFFFFFFFFFFFFFFFFFFFE2 +:10EDD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43 +:10EDE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33 +:10EDF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23 +:10EE0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12 +:10EE1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02 +:10EE2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2 +:10EE3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2 +:10EE4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2 +:10EE5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2 +:10EE6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2 +:10EE7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2 +:10EE8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:10EE9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82 +:10EEA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72 +:10EEB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +:10EEC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +:10EED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42 +:10EEE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFBEF77B +:10EEF000FFFFA63141082000000000004108AA528F +:10EF0000BAD6DFFFFFFFFFFFFFFFFFFFFFFFFFFF9F +:10EF1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01 +:10EF2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1 +:10EF3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 +:10EF4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1 +:10EF5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1 +:10EF6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1 +:10EF7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1 +:10EF8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91 +:10EF9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81 +:10EFA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71 +:10EFB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61 +:10EFC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51 +:10EFD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 +:10EFE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31 +:10EFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21 +:10F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10 +:10F01000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +:10F02000FFFFFFFFFFFFFFFFFFFFFFFFFFFF9EF759 +:10F03000BEF7DFFF5DEF55AD518C929479CEBEF7F0 +:10F04000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0 +:10F05000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0 +:10F06000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0 +:10F07000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0 +:10F08000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90 +:10F09000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80 +:10F0A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70 +:10F0B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60 +:10F0C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50 +:10F0D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:10F0E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30 +:10F0F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20 +:10F10000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F +:10F11000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +:10F12000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF +:10F13000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF +:10F14000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF +:10F15000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF +:10F16000FFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFCF +:10F17000FFFFDFFFBEF7FFFFBEF7FFFFBEF7DFFFBA +:10F18000FFFFBEF7FFFFFFFFFFFFFFFFFFFFFFFFD8 +:10F19000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F +:10F1A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F +:10F1B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F +:10F1C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F +:10F1D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F +:10F1E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F +:10F1F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F +:10F20000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E +:10F21000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +:10F22000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE +:10F23000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE +:10F24000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE +:10F25000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE +:10F26000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE +:10F27000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E +:10F28000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E +:10F29000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E +:10F2A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E +:10F2B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E +:10F2C000FFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFF6E +:10F2D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E +:10F2E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E +:10F2F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E +:10F30000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D +:10F31000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD +:10F32000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED +:10F33000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD +:10F34000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD +:10F35000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD +:10F36000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD +:10F37000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D +:10F38000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D +:10F39000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D +:10F3A000FFFFFFFFFFFFFFFFC8F300080000002082 +:10F3B000BC0000003442000884F40008BC000020B7 +:10F3C000040400004442000814007800DC000A0035 +:10F3D0006400C800506C656173652070726573735A +:10F3E0002074686520627574746F6E2100000000DF +:10F3F000000000000000000000000000000E2707D1 +:10F4000000100140001001400018014000180140A8 +:10F4100001000000040000000100000002000000E4 +:10F420000E061107000200000400000000040000A6 +:10F430000800000000080140000801400206020622 +:10F4400004060406060606060008014000100140F6 +:10F45000000C0140010000000020000000400000FE +:10F460000206040603060000010000000020000060 +:10F4700000400000000201000D0E062828000000D8 +:04F480000000000088 +:04000005080041515D +:00000001FF diff --git b/Utilities/Binary/USBFS/hex/LED.hex a/Utilities/Binary/USBFS/hex/LED.hex new file mode 100644 index 0000000..69f8da8 --- /dev/null +++ a/Utilities/Binary/USBFS/hex/LED.hex @@ -0,0 +1,105 @@ +:020000040800F2 +:104000008804002065410008BB410008B341000856 +:10401000B7410008AD41000831420008000000002F +:10402000000000000000000000000000E741000860 +:10403000B141000800000000E5410008E941000826 +:104040007F4100087F4100087F4100087F41000850 +:104050007F4100087F4100087F4100087F41000840 +:104060007F4100087F4100087F4100087F41000830 +:104070007F4100087F4100087F4100087F41000820 +:104080007F4100087F4100087F4100087F41000810 +:104090007F4100087F4100087F4100087F41000800 +:1040A0007F4100087F4100087F4100087F410008F0 +:1040B0007F4100087F4100087F4100087F410008E0 +:1040C0007F4100087F4100087F4100087F410008D0 +:1040D0007F4100087F4100087F4100087F410008C0 +:1040E0007F4100087F4100087F4100087F410008B0 +:1040F0007F4100087F4100087F4100080000000068 +:104100007F410008000000007F4100087F41000857 +:104110007F4100087F4100087F4100087F4100087F +:104120007F4100087F4100087F4100087F4100086F +:104130007F4100087F4100087F4100087F4100085F +:104140007F4100087F4100087F4100087F4100084F +:10415000DFF80CD000F018F800480047954300083D +:10416000880400200648804706480047FEE7FEE72F +:10417000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE717 +:10418000F141000851410008064C074D06E0E06887 +:1041900040F0010394E8070098471034AC42F6D38E +:1041A000FFF7DAFFAC450008CC45000800BFFEE78A +:1041B000704700BFFEE700BFFEE7704710B500285C +:1041C00007DA0A07140E054A00F00F031B1FD45428 +:1041D00003E00A07130E024A135410BD18ED00E065 +:1041E00000E400E07047704710B500F03DF810BDE6 +:1041F00010B50D48006840F001000B490860002030 +:104200004860C862084600680849084006490860D6 +:104210004FF47F0088600846006820F48020086022 +:1042200000F098F910BD000000100240FFFFF6EA10 +:1042300000BFFEE702E008C8121F08C1002AFAD139 +:1042400070477047002001E001C1121F002AFBD116 +:10425000704700000349086000BF0249096800294F +:10426000FBD17047000000200448006820B10348DB +:104270000068401E014908607047000000000020EF +:1042800010B504460B4931F8140000F0BDF80A4996 +:1042900051F82430094951F824000322102100F07C +:1042A00027F8054850F82400044951F824104861C3 +:1042B00010BD000048000020180000200800002069 +:1042C000034951F82010034A52F8202051617047E9 +:1042D0001800002008000020034951F82010034A6C +:1042E00052F82020116170471800002008000020BB +:1042F000F0B50C4616460025002204F00F0514F018 +:10430000100F08D0042E05D145F00305C76B1F43DD +:10431000C76300E03543002118E001278F401F42AA +:1043200012D002684FEA810C0F2707FA0CF7BA4344 +:104330008F0005FA07F73A43282C01D1436102E0C8 +:10434000482C00D1036102604F1CB9B20829E4D3A4 +:1043500008211CE001278F401F4216D04268A1F1BE +:1043600008074FEA870C0F2707FA0CF7BA43A1F1A9 +:104370000807BF0005FA07F73A43282C01D143612B +:1043800002E0482C00D1036142604F1CB9B21029F1 +:10439000E0D3F0BD4FF48041480300F02BF800203B +:1043A000FFF76EFF0120FFF76BFF0220FFF768FFAA +:1043B00000F0D4F81DE00020FFF78EFFC820FFF7C3 +:1043C00049FF0120FFF788FFC820FFF743FF0220C5 +:1043D000FFF782FFC820FFF73DFF0020FFF770FFC7 +:1043E0000120FFF76DFF0220FFF76AFFC820FFF7EB +:1043F00031FFE0E7024A0A400243024B1A6070476D +:1044000080FFFF1F08ED00E0064901EB90110968ED +:1044100000F01F0301229A401143024A02EB90125E +:10442000116070470010024000200021434A1268CA +:1044300042F48032414B1A6000BF401C3F4A126870 +:1044400002F4003111B9B0F5006FF6D13B4A1268A1 +:1044500012F4003F01D100BFFEE7384AD26942F0B2 +:104460008052364BDA61364A126842F44042344B8D +:104470001A60324A5268314B5A601A4652685A6082 +:104480001A46526842F480625A601A4652682D4BAE +:104490001A402A4B5A601A4652682B4B1A43274B34 +:1044A0005A601A46D26A294B1A40244BDA621A46DD +:1044B000D26A274B1A43214BDA621A46126842F03D +:1044C00080621A6000BF1D4A126812F0006FFAD0B5 +:1044D0001A4A126842F08072184B1A6000BF174ADD +:1044E000126812F0007FFAD0154A126842F4803246 +:1044F000134B1A6000BF124A526812F4803FFAD080 +:104500000F4A126842F400320D4B1A6000BF0C4A89 +:10451000526812F4003FFAD0084A526822F00302AF +:10452000064B5A601A46526842F002025A6000BFB7 +:10453000024A526812F0080FFAD070470010024089 +:1045400000700040FFFFC39F0000352000F0FEBF59 +:104550004906010010B5FFF767FF10BD10B51248FE +:1045600000684FF47A71B0FBF1F4601EB0F1807F07 +:1045700001D301200FE0601E4FF0E02148610F21C0 +:104580004FF0FF30FFF71AFE00204FF0E021886166 +:1045900007200861002008B100BFFEE70021481E87 +:1045A000FFF70CFE10BD000004000020CC45000801 +:1045B0000000002088000000344200085446000833 +:1045C00088000020000400004442000800000000B1 +:1045D000000E2707001001400010014000180140A4 +:1045E000001801400100000004000000010000006C +:1045F000020000000E061107000200000400000087 +:10460000000400000800000000080140000801400C +:104610000206020604060406060606060008014015 +:1046200000100140000C01400100000000200000CB +:10463000004000000206040603060000010000001E +:104640000020000000400000000201000D0E0628BE +:04465000280000003E +:04000005080041515D +:00000001FF diff --git b/Utilities/LCD_Commom/lcd_font.c a/Utilities/LCD_Commom/lcd_font.c new file mode 100644 index 0000000..fdccf64 --- /dev/null +++ a/Utilities/LCD_Commom/lcd_font.c @@ -0,0 +1,1004 @@ +/*! + \file lcd_font.h + \brief file of LCD font + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2018, GigaDevice Semiconductor Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "lcd_font.h" +#include + +const uint16_t ASCII16x24_Table [] = { +/* Space ' ' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '!' */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '"' */ + 0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '#' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60, + 0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318, + 0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000, +/* '$' */ + 0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C, + 0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C, + 0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, +/* '%' */ + 0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611, + 0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460, + 0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000, +/* '&' */ + 0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0, + 0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06, + 0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* ''' */ + 0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '(' */ + 0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000, +/* ')' */ + 0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000, +/* '*' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '+' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* ',' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, +/* '-' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '.' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '/' */ + 0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, + 0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0, + 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '0' */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C, + 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '1' */ + 0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '2' */ + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '3' */ + 0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600, + 0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '4' */ + 0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60, + 0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00, + 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '5' */ + 0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC, + 0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '6' */ + 0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC, + 0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '7' */ + 0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380, + 0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '8' */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638, + 0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38, + 0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '9' */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C, + 0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C, + 0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* ':' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* ';' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000, +/* '<' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0, + 0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '=' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '>' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0, + 0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '?' */ + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00, + 0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '@' */ + 0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411, + 0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004, + 0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'A' */ + 0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60, + 0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C, + 0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'B' */ + 0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C, + 0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C, + 0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'C' */ + 0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C, + 0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'D' */ + 0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006, + 0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06, + 0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'E' */ + 0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'F' */ + 0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'G' */ + 0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003, + 0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C, + 0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'H' */ + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'I' */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'J' */ + 0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738, + 0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'K' */ + 0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6, + 0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'L' */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'M' */ + 0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836, + 0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6, + 0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'N' */ + 0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC, + 0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C, + 0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'O' */ + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'P' */ + 0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'Q' */ + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C, + 0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'R' */ + 0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806, + 0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'S' */ + 0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C, + 0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C, + 0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'T' */ + 0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'U' */ + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'V' */ + 0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C, + 0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'W' */ + 0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366, + 0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C, + 0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'X' */ + 0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0, + 0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C, + 0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'Y' */ + 0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660, + 0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'Z' */ + 0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600, + 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006, + 0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '[' */ + 0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000, +/* '\' */ + 0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0, + 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* ']' */ + 0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000, +/* '^' */ + 0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630, + 0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '_' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* ''' */ + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'a' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8, + 0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C, + 0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'b' */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'c' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0, + 0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30, + 0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'd' */ + 0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'e' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30, + 0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'f' */ + 0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'g' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8, + 0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18, + 0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000, +/* 'h' */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'i' */ + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'j' */ + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000, +/* 'k' */ + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C, + 0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C, + 0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'l' */ + 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'm' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF, + 0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, + 0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'n' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'o' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30, + 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'p' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000, +/* 'q' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000, +/* 'r' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0, + 0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 's' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0, + 0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 't' */ + 0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'u' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818, + 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38, + 0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'v' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18, + 0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'w' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1, + 0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C, + 0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'x' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38, + 0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30, + 0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* 'y' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830, + 0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380, + 0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000, +/* 'z' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/* '{' */ + 0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000, +/* '|' */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, +/* '}' */ + 0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000, +/* '~' */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}; + +const uint16_t ASCII8x16_Table[] = { +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00, +0x18,0x18,0x7C,0xC6,0xC2,0xC0,0x7C,0x06,0x86,0xC6,0x7C,0x18,0x18,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xC2,0xC6,0x0C,0x18,0x30,0x60,0xC6,0x86,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0x6C,0x38,0x76,0xDC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00,0x00, +0x00,0x00,0x30,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6,0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0x0C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xDC,0xC0,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xDE,0xC6,0xC6,0x66,0x3A,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0xE6,0x66,0x6C,0x6C,0x78,0x78,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xDE,0x7C,0x0C,0x0E,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C,0x06,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x7E,0x7E,0x5A,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x10,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0x6C,0x6C,0x38,0x38,0x6C,0x6C,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC6,0x86,0x0C,0x18,0x30,0x60,0xC2,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x02,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,0x00, +0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, +0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66,0x66,0x66,0x66,0xDC,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x1C,0x0C,0x0C,0x3C,0x6C,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00, +0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, +0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xEC,0xFE,0xD6,0xD6,0xD6,0xD6,0xD6,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0x0C,0x1E,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x76,0x62,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x60,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x30,0x30,0xFC,0x30,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0xF8,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0xCC,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00, +0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00,0x00 +}; + +const uint16_t ASCII12x12_Table [] = { + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x2000,0x0000,0x0000, + 0x0000,0x5000,0x5000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0900,0x0900,0x1200,0x7f00,0x1200,0x7f00,0x1200,0x2400,0x2400,0x0000,0x0000, + 0x1000,0x3800,0x5400,0x5000,0x5000,0x3800,0x1400,0x5400,0x5400,0x3800,0x1000,0x0000, + 0x0000,0x3080,0x4900,0x4900,0x4a00,0x32c0,0x0520,0x0920,0x0920,0x10c0,0x0000,0x0000, + 0x0000,0x0c00,0x1200,0x1200,0x1400,0x1800,0x2500,0x2300,0x2300,0x1d80,0x0000,0x0000, + 0x0000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0800,0x1000,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x1000, + 0x0000,0x4000,0x2000,0x2000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x2000,0x2000, + 0x0000,0x2000,0x7000,0x2000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x4000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x0000,0x0000, + 0x0000,0x1000,0x1000,0x1000,0x2000,0x2000,0x2000,0x2000,0x4000,0x4000,0x0000,0x0000, + 0x0000,0x1000,0x2800,0x4400,0x4400,0x4400,0x4400,0x4400,0x2800,0x1000,0x0000,0x0000, + 0x0000,0x1000,0x3000,0x5000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000, + 0x0000,0x3000,0x4800,0x4400,0x0400,0x0800,0x1000,0x2000,0x4000,0x7c00,0x0000,0x0000, + 0x0000,0x3000,0x4800,0x0400,0x0800,0x1000,0x0800,0x4400,0x4800,0x3000,0x0000,0x0000, + 0x0000,0x0800,0x1800,0x1800,0x2800,0x2800,0x4800,0x7c00,0x0800,0x0800,0x0000,0x0000, + 0x0000,0x3c00,0x2000,0x4000,0x7000,0x4800,0x0400,0x4400,0x4800,0x3000,0x0000,0x0000, + 0x0000,0x1800,0x2400,0x4000,0x5000,0x6800,0x4400,0x4400,0x2800,0x1000,0x0000,0x0000, + 0x0000,0x7c00,0x0400,0x0800,0x1000,0x1000,0x1000,0x2000,0x2000,0x2000,0x0000,0x0000, + 0x0000,0x1000,0x2800,0x4400,0x2800,0x1000,0x2800,0x4400,0x2800,0x1000,0x0000,0x0000, + 0x0000,0x1000,0x2800,0x4400,0x4400,0x2c00,0x1400,0x0400,0x4800,0x3000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x4000, + 0x0000,0x0000,0x0400,0x0800,0x3000,0x4000,0x3000,0x0800,0x0400,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x4000,0x2000,0x1800,0x0400,0x1800,0x2000,0x4000,0x0000,0x0000,0x0000, + 0x0000,0x3800,0x6400,0x4400,0x0400,0x0800,0x1000,0x1000,0x0000,0x1000,0x0000,0x0000, + 0x0000,0x0f80,0x1040,0x2ea0,0x51a0,0x5120,0x5120,0x5120,0x5320,0x4dc0,0x2020,0x1040, + 0x0000,0x0800,0x1400,0x1400,0x1400,0x2200,0x3e00,0x2200,0x4100,0x4100,0x0000,0x0000, + 0x0000,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x0000,0x0000, + 0x0000,0x0e00,0x1100,0x2100,0x2000,0x2000,0x2000,0x2100,0x1100,0x0e00,0x0000,0x0000, + 0x0000,0x3c00,0x2200,0x2100,0x2100,0x2100,0x2100,0x2100,0x2200,0x3c00,0x0000,0x0000, + 0x0000,0x3e00,0x2000,0x2000,0x2000,0x3e00,0x2000,0x2000,0x2000,0x3e00,0x0000,0x0000, + 0x0000,0x3e00,0x2000,0x2000,0x2000,0x3c00,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, + 0x0000,0x0e00,0x1100,0x2100,0x2000,0x2700,0x2100,0x2100,0x1100,0x0e00,0x0000,0x0000, + 0x0000,0x2100,0x2100,0x2100,0x2100,0x3f00,0x2100,0x2100,0x2100,0x2100,0x0000,0x0000, + 0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, + 0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x4800,0x3000,0x0000,0x0000, + 0x0000,0x2200,0x2400,0x2800,0x2800,0x3800,0x2800,0x2400,0x2400,0x2200,0x0000,0x0000, + 0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x3e00,0x0000,0x0000, + 0x0000,0x2080,0x3180,0x3180,0x3180,0x2a80,0x2a80,0x2a80,0x2a80,0x2480,0x0000,0x0000, + 0x0000,0x2100,0x3100,0x3100,0x2900,0x2900,0x2500,0x2300,0x2300,0x2100,0x0000,0x0000, + 0x0000,0x0c00,0x1200,0x2100,0x2100,0x2100,0x2100,0x2100,0x1200,0x0c00,0x0000,0x0000, + 0x0000,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000, + 0x0000,0x0c00,0x1200,0x2100,0x2100,0x2100,0x2100,0x2100,0x1600,0x0d00,0x0100,0x0000, + 0x0000,0x3e00,0x2100,0x2100,0x2100,0x3e00,0x2400,0x2200,0x2100,0x2080,0x0000,0x0000, + 0x0000,0x1c00,0x2200,0x2200,0x2000,0x1c00,0x0200,0x2200,0x2200,0x1c00,0x0000,0x0000, + 0x0000,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000, + 0x0000,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x1200,0x0c00,0x0000,0x0000, + 0x0000,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x1400,0x0800,0x0000,0x0000, + 0x0000,0x4440,0x4a40,0x2a40,0x2a80,0x2a80,0x2a80,0x2a80,0x2a80,0x1100,0x0000,0x0000, + 0x0000,0x4100,0x2200,0x1400,0x1400,0x0800,0x1400,0x1400,0x2200,0x4100,0x0000,0x0000, + 0x0000,0x4100,0x2200,0x2200,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000, + 0x0000,0x7e00,0x0200,0x0400,0x0800,0x1000,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000, + 0x0000,0x3000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, + 0x0000,0x4000,0x4000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x1000,0x0000,0x0000, + 0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, + 0x0000,0x1000,0x2800,0x2800,0x2800,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00, + 0x4000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x3800,0x4400,0x0400,0x3c00,0x4400,0x4400,0x3c00,0x0000,0x0000, + 0x0000,0x4000,0x4000,0x5800,0x6400,0x4400,0x4400,0x4400,0x6400,0x5800,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x3000,0x4800,0x4000,0x4000,0x4000,0x4800,0x3000,0x0000,0x0000, + 0x0000,0x0400,0x0400,0x3400,0x4c00,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x3800,0x4400,0x4400,0x7c00,0x4000,0x4400,0x3800,0x0000,0x0000, + 0x0000,0x6000,0x4000,0xe000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x3400,0x4c00,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0400,0x4400, + 0x0000,0x4000,0x4000,0x5800,0x6400,0x4400,0x4400,0x4400,0x4400,0x4400,0x0000,0x0000, + 0x0000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, + 0x0000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000, + 0x0000,0x4000,0x4000,0x4800,0x5000,0x6000,0x5000,0x5000,0x4800,0x4800,0x0000,0x0000, + 0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x5200,0x6d00,0x4900,0x4900,0x4900,0x4900,0x4900,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x5800,0x6400,0x4400,0x4400,0x4400,0x4400,0x4400,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x3800,0x4400,0x4400,0x4400,0x4400,0x4400,0x3800,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x5800,0x6400,0x4400,0x4400,0x4400,0x6400,0x5800,0x4000,0x4000, + 0x0000,0x0000,0x0000,0x3400,0x4c00,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0400,0x0400, + 0x0000,0x0000,0x0000,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x3000,0x4800,0x4000,0x3000,0x0800,0x4800,0x3000,0x0000,0x0000, + 0x0000,0x4000,0x4000,0xe000,0x4000,0x4000,0x4000,0x4000,0x4000,0x6000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x4400,0x4400,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x4400,0x4400,0x2800,0x2800,0x2800,0x2800,0x1000,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x4900,0x4900,0x5500,0x5500,0x5500,0x5500,0x2200,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x4400,0x2800,0x2800,0x1000,0x2800,0x2800,0x4400,0x0000,0x0000, + 0x0000,0x0000,0x0000,0x4400,0x4400,0x2800,0x2800,0x2800,0x1000,0x1000,0x1000,0x1000, + 0x0000,0x0000,0x0000,0x7800,0x0800,0x1000,0x2000,0x2000,0x4000,0x7800,0x0000,0x0000, + 0x0000,0x1000,0x2000,0x2000,0x2000,0x2000,0x4000,0x2000,0x2000,0x2000,0x2000,0x2000, + 0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000, + 0x0000,0x4000,0x2000,0x2000,0x2000,0x2000,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000, + 0x0000,0x0000,0x0000,0x0000,0x7400,0x5800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, + 0x0000,0x0000,0x7000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x7000,0x0000,0x0000}; + +const uint16_t ASCII8x12_Table [] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00, + 0x00,0x00,0x00,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x14,0x14,0x3e,0x14,0x28,0x7c,0x28,0x28,0x00, + 0x00,0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x14,0x54,0x38,0x10, + 0x00,0x00,0x00,0x44,0xa8,0xa8,0x50,0x14,0x1a,0x2a,0x24,0x00, + 0x00,0x00,0x00,0x20,0x50,0x50,0x20,0xe8,0x98,0x98,0x60,0x00, + 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x40,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, + 0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x00,0x00,0x00,0x40,0xe0,0x40,0xa0,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00, + 0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x80,0x80,0x00, + 0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00, + 0x00,0x00,0x00,0x20,0x60,0xa0,0x20,0x20,0x20,0x20,0x20,0x00, + 0x00,0x00,0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x80,0xf0,0x00, + 0x00,0x00,0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00, + 0x00,0x00,0x00,0x10,0x30,0x50,0x50,0x90,0xf8,0x10,0x10,0x00, + 0x00,0x00,0x00,0x70,0x40,0x80,0xe0,0x10,0x10,0x90,0x60,0x00, + 0x00,0x00,0x00,0x60,0x90,0x80,0xa0,0xd0,0x90,0x90,0x60,0x00, + 0x00,0x00,0x00,0xf0,0x10,0x20,0x20,0x20,0x40,0x40,0x40,0x00, + 0x00,0x00,0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00, + 0x00,0x00,0x00,0x60,0x90,0x90,0xb0,0x50,0x10,0x90,0x60,0x00, + 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x40,0x00, + 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x40,0x40, + 0x00,0x00,0x00,0x00,0x00,0x10,0x60,0x80,0x60,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xf0,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x10,0x60,0x80,0x00,0x00, + 0x00,0x00,0x00,0x60,0x90,0x10,0x20,0x40,0x40,0x00,0x40,0x00, + 0x00,0x00,0x00,0x1c,0x22,0x5b,0xa5,0xa5,0xa5,0xa5,0x9e,0x41, + 0x00,0x00,0x00,0x20,0x50,0x50,0x50,0x50,0x70,0x88,0x88,0x00, + 0x00,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0x88,0xf0,0x00, + 0x00,0x00,0x00,0x38,0x44,0x84,0x80,0x80,0x84,0x44,0x38,0x00, + 0x00,0x00,0x00,0xe0,0x90,0x88,0x88,0x88,0x88,0x90,0xe0,0x00, + 0x00,0x00,0x00,0xf8,0x80,0x80,0xf8,0x80,0x80,0x80,0xf8,0x00, + 0x00,0x00,0x00,0x78,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x00, + 0x00,0x00,0x00,0x38,0x44,0x84,0x80,0x9c,0x84,0x44,0x38,0x00, + 0x00,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x88,0x00, + 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, + 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x90,0x90,0x60,0x00, + 0x00,0x00,0x00,0x88,0x90,0xa0,0xe0,0xa0,0x90,0x90,0x88,0x00, + 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xf0,0x00, + 0x00,0x00,0x00,0x82,0xc6,0xc6,0xaa,0xaa,0xaa,0xaa,0x92,0x00, + 0x00,0x00,0x00,0x84,0xc4,0xa4,0xa4,0x94,0x94,0x8c,0x84,0x00, + 0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x48,0x30,0x00, + 0x00,0x00,0x00,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x80,0x00, + 0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x58,0x34,0x04, + 0x00,0x00,0x00,0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x42,0x00, + 0x00,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x88,0x70,0x00, + 0x00,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, + 0x00,0x00,0x00,0x84,0x84,0x84,0x84,0x84,0x84,0x48,0x30,0x00, + 0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x50,0x50,0x50,0x20,0x00, + 0x00,0x00,0x00,0x92,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x44,0x00, + 0x00,0x00,0x00,0x84,0x48,0x48,0x30,0x30,0x48,0x48,0x84,0x00, + 0x00,0x00,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00, + 0x00,0x00,0x00,0xf8,0x08,0x10,0x20,0x20,0x40,0x80,0xf8,0x00, + 0x00,0x00,0x00,0xc0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, + 0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x20,0x20,0x00, + 0x00,0x00,0x00,0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x00,0x00,0x00,0x40,0xa0,0xa0,0xa0,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, + 0x00,0x00,0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x70,0x90,0x90,0x70,0x00, + 0x00,0x00,0x00,0x80,0x80,0xa0,0xd0,0x90,0x90,0xd0,0xa0,0x00, + 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00, + 0x00,0x00,0x00,0x10,0x10,0x50,0xb0,0x90,0x90,0xb0,0x50,0x00, + 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0xf0,0x80,0x90,0x60,0x00, + 0x00,0x00,0x00,0xc0,0x80,0xc0,0x80,0x80,0x80,0x80,0x80,0x00, + 0x00,0x00,0x00,0x00,0x00,0x50,0xb0,0x90,0x90,0xb0,0x50,0x10, + 0x00,0x00,0x00,0x80,0x80,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00, + 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00, + 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80, + 0x00,0x00,0x00,0x80,0x80,0x90,0xa0,0xc0,0xa0,0x90,0x90,0x00, + 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, + 0x00,0x00,0x00,0x00,0x00,0xa6,0xda,0x92,0x92,0x92,0x92,0x00, + 0x00,0x00,0x00,0x00,0x00,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00, + 0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00, + 0x00,0x00,0x00,0x00,0x00,0xa0,0xd0,0x90,0x90,0xd0,0xa0,0x80, + 0x00,0x00,0x00,0x00,0x00,0x50,0xb0,0x90,0x90,0xb0,0x50,0x10, + 0x00,0x00,0x00,0x00,0x00,0xa0,0xc0,0x80,0x80,0x80,0x80,0x00, + 0x00,0x00,0x00,0x00,0x00,0xe0,0x90,0x40,0x20,0x90,0x60,0x00, + 0x00,0x00,0x00,0x80,0x80,0xc0,0x80,0x80,0x80,0x80,0xc0,0x00, + 0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xb0,0x50,0x00, + 0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x50,0x20,0x00, + 0x00,0x00,0x00,0x00,0x00,0x92,0xaa,0xaa,0xaa,0xaa,0x44,0x00, + 0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00, + 0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x50,0x50,0x20,0x20,0x20, + 0x00,0x00,0x00,0x00,0x00,0xf0,0x10,0x20,0x40,0x80,0xf0,0x00, + 0x00,0x00,0x00,0xc0,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80, + 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, + 0x00,0x00,0x00,0xc0,0x40,0x40,0x40,0x20,0x40,0x40,0x40,0x40, + 0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xb0,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xe0,0xa0,0xa0,0xa0,0xa0,0xa0,0xe0,0x00}; + +const uint16_t ASCII8x8_Table [] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, + 0xa0, 0xa0, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x24, 0x24, 0xfe, 0x48, 0xfc, 0x48, 0x48, + 0x38, 0x54, 0x50, 0x38, 0x14, 0x14, 0x54, 0x38, + 0x44, 0xa8, 0xa8, 0x50, 0x14, 0x1a, 0x2a, 0x24, + 0x10, 0x28, 0x28, 0x10, 0x74, 0x4c, 0x4c, 0x30, + 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, + 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, + 0x00, 0x00, 0x24, 0x18, 0x3c, 0x18, 0x24, 0x00, + 0x00, 0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, + 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x20, + 0x18, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x18, + 0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x38, 0x44, 0x00, 0x04, 0x08, 0x10, 0x20, 0x7c, + 0x18, 0x24, 0x04, 0x18, 0x04, 0x04, 0x24, 0x18, + 0x04, 0x0c, 0x14, 0x24, 0x44, 0x7e, 0x04, 0x04, + 0x3c, 0x20, 0x20, 0x38, 0x04, 0x04, 0x24, 0x18, + 0x18, 0x24, 0x20, 0x38, 0x24, 0x24, 0x24, 0x18, + 0x3c, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x10, + 0x18, 0x24, 0x24, 0x18, 0x24, 0x24, 0x24, 0x18, + 0x18, 0x24, 0x24, 0x24, 0x1c, 0x04, 0x24, 0x18, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x10, 0x00, + 0x00, 0x00, 0x04, 0x18, 0x20, 0x18, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x18, 0x04, 0x18, 0x20, 0x00, + 0x18, 0x24, 0x04, 0x08, 0x10, 0x10, 0x00, 0x10, + 0x3c, 0x42, 0x99, 0xa5, 0xa5, 0x9d, 0x42, 0x38, + 0x38, 0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x44, + 0x78, 0x44, 0x44, 0x78, 0x44, 0x44, 0x44, 0x78, + 0x1c, 0x22, 0x42, 0x40, 0x40, 0x42, 0x22, 0x1c, + 0x70, 0x48, 0x44, 0x44, 0x44, 0x44, 0x48, 0x70, + 0x7c, 0x40, 0x40, 0x7c, 0x40, 0x40, 0x40, 0x7c, + 0x3c, 0x20, 0x20, 0x38, 0x20, 0x20, 0x20, 0x20, + 0x1c, 0x22, 0x42, 0x40, 0x4e, 0x42, 0x22, 0x1c, + 0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x24, 0x24, 0x18, + 0x44, 0x48, 0x50, 0x70, 0x50, 0x48, 0x48, 0x44, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, + 0x82, 0xc6, 0xc6, 0xaa, 0xaa, 0xaa, 0xaa, 0x92, + 0x42, 0x62, 0x52, 0x52, 0x4a, 0x4a, 0x46, 0x42, + 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, + 0x78, 0x44, 0x44, 0x44, 0x78, 0x40, 0x40, 0x40, + 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x2c, 0x1a, + 0x78, 0x44, 0x44, 0x78, 0x50, 0x48, 0x44, 0x42, + 0x38, 0x44, 0x40, 0x38, 0x04, 0x44, 0x44, 0x38, + 0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, + 0x44, 0x44, 0x28, 0x28, 0x28, 0x28, 0x28, 0x10, + 0x92, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x44, + 0x42, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x42, + 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x7c, 0x04, 0x08, 0x10, 0x10, 0x20, 0x40, 0x7c, + 0x1c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1c, + 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04, + 0x1c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x1c, + 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x04, 0x1c, 0x24, 0x24, 0x1c, + 0x20, 0x20, 0x28, 0x34, 0x24, 0x24, 0x34, 0x28, + 0x00, 0x00, 0x18, 0x24, 0x20, 0x20, 0x24, 0x18, + 0x04, 0x04, 0x14, 0x2c, 0x24, 0x24, 0x2c, 0x14, + 0x00, 0x00, 0x18, 0x24, 0x3c, 0x20, 0x24, 0x18, + 0x00, 0x18, 0x10, 0x10, 0x18, 0x10, 0x10, 0x10, + 0x00, 0x18, 0x24, 0x24, 0x18, 0x04, 0x24, 0x18, + 0x20, 0x20, 0x28, 0x34, 0x24, 0x24, 0x24, 0x24, + 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x08, 0x00, 0x08, 0x08, 0x08, 0x08, 0x28, 0x10, + 0x20, 0x20, 0x24, 0x28, 0x30, 0x28, 0x24, 0x24, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x00, 0x00, 0xa6, 0xda, 0x92, 0x92, 0x92, 0x92, + 0x00, 0x00, 0x28, 0x34, 0x24, 0x24, 0x24, 0x24, + 0x00, 0x00, 0x18, 0x24, 0x24, 0x24, 0x24, 0x18, + 0x00, 0x28, 0x34, 0x24, 0x38, 0x20, 0x20, 0x20, + 0x00, 0x14, 0x2c, 0x24, 0x1c, 0x04, 0x04, 0x04, + 0x00, 0x00, 0x2c, 0x30, 0x20, 0x20, 0x20, 0x20, + 0x00, 0x00, 0x18, 0x24, 0x10, 0x08, 0x24, 0x18, + 0x00, 0x10, 0x38, 0x10, 0x10, 0x10, 0x10, 0x18, + 0x00, 0x00, 0x24, 0x24, 0x24, 0x24, 0x2c, 0x14, + 0x00, 0x00, 0x44, 0x44, 0x28, 0x28, 0x28, 0x10, + 0x00, 0x00, 0x92, 0xaa, 0xaa, 0xaa, 0xaa, 0x44, + 0x00, 0x00, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, + 0x00, 0x28, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, + 0x00, 0x00, 0x3c, 0x04, 0x08, 0x10, 0x20, 0x3c, + 0x00, 0x08, 0x10, 0x10, 0x20, 0x10, 0x10, 0x08, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x00, 0x10, 0x08, 0x08, 0x04, 0x08, 0x08, 0x10, + 0x00, 0x00, 0x00, 0x60, 0x92, 0x0c, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + + +const unsigned char ASCII16[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* " " */ + 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00, /* "!" */ + 0x00,0x00,0x6C,0x6C,0x24,0x24,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00, /* """ */ + 0x00,0x24,0x24,0x24,0x24,0xFE,0x48,0x48,0x48,0x48,0xFC,0x90,0x90,0x90,0x90,0x00, /* "#" */ + 0x00,0x10,0x3C,0x54,0x92,0x90,0x50,0x38,0x14,0x12,0x12,0x92,0x54,0x78,0x10,0x00, /* "$" */ + 0x00,0x00,0x22,0x5C,0x94,0xA8,0x48,0x10,0x10,0x24,0x2A,0x52,0x54,0x88,0x00,0x00, /* "%" */ + 0x00,0x00,0x30,0x48,0x48,0x50,0x20,0x6E,0x54,0x94,0x8C,0x88,0x8A,0x74,0x00,0x00, /* "&" */ + 0x00,0x00,0x30,0x30,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* "'" */ + 0x00,0x04,0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x04,0x00, /* "(" */ + 0x00,0x80,0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x80,0x00, /* ")" */ + 0x00,0x00,0x00,0x00,0x10,0x54,0x38,0x10,0x38,0x54,0x10,0x00,0x00,0x00,0x00,0x00, /* "*" */ + 0x00,0x00,0x00,0x10,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00, /* "+" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x20,0x00, /* "," */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* "-" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00, /* "." */ + 0x00,0x00,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x80,0x00,0x00, /* "/" */ + 0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00, /* "0" */ + 0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, /* "1" */ + 0x00,0x00,0x38,0x44,0x82,0x82,0x04,0x08,0x10,0x20,0x40,0x82,0x84,0xFC,0x00,0x00, /* "2" */ + 0x00,0x00,0x38,0x44,0x82,0x02,0x04,0x38,0x04,0x02,0x02,0x82,0x44,0x38,0x00,0x00, /* "3" */ + 0x00,0x00,0x04,0x0C,0x14,0x14,0x24,0x24,0x44,0x44,0xFE,0x04,0x04,0x0E,0x00,0x00, /* "4" */ + 0x00,0x00,0xFC,0x80,0x80,0x80,0xB8,0xC4,0x82,0x02,0x02,0x82,0x84,0x78,0x00,0x00, /* "5" */ + 0x00,0x00,0x3C,0x42,0x82,0x80,0xB8,0xC4,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00, /* "6" */ + 0x00,0x00,0x7E,0x42,0x82,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x10,0x10,0x00,0x00, /* "7" */ + 0x00,0x00,0x38,0x44,0x82,0x82,0x44,0x38,0x44,0x82,0x82,0x82,0x44,0x38,0x00,0x00, /* "8" */ + 0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x46,0x3A,0x02,0x82,0x44,0x38,0x00,0x00, /* "9" */ + 0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00, /* ":" */ + 0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x20,0x00,0x00, /* ";" */ + 0x00,0x00,0x00,0x00,0x06,0x18,0x60,0x80,0x60,0x18,0x06,0x00,0x00,0x00,0x00,0x00, /* "<" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00, /* "=" */ + 0x00,0x00,0x00,0x00,0xC0,0x30,0x0C,0x02,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00, /* ">" */ + 0x00,0x38,0x44,0x82,0x82,0x02,0x04,0x08,0x10,0x10,0x10,0x00,0x10,0x10,0x00,0x00, /* "?" */ + 0x00,0x00,0x38,0x44,0x82,0x9A,0xAA,0xAA,0xAA,0xAA,0xAA,0x96,0x80,0x42,0x3C,0x00, /* "@" */ + 0x00,0x00,0x10,0x10,0x10,0x28,0x28,0x28,0x44,0x44,0x7C,0x44,0x44,0xEE,0x00,0x00, /* "A" */ + 0x00,0x00,0xFC,0x42,0x42,0x42,0x42,0x7C,0x42,0x42,0x42,0x42,0x42,0xFC,0x00,0x00, /* "B" */ + 0x00,0x00,0x3C,0x44,0x82,0x80,0x80,0x80,0x80,0x80,0x82,0x82,0x44,0x38,0x00,0x00, /* "C" */ + 0x00,0x00,0xF8,0x44,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x44,0xF8,0x00,0x00, /* "D" */ + 0x00,0x00,0xFC,0x44,0x42,0x40,0x44,0x7C,0x44,0x40,0x40,0x42,0x44,0xFC,0x00,0x00, /* "E" */ + 0x00,0x00,0xFC,0x44,0x42,0x40,0x44,0x7C,0x44,0x40,0x40,0x40,0x40,0xF0,0x00,0x00, /* "F" */ + 0x00,0x00,0x34,0x4C,0x82,0x80,0x80,0x80,0x8E,0x84,0x84,0x84,0x4C,0x34,0x00,0x00, /* "G" */ + 0x00,0x00,0xEE,0x44,0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44,0x44,0xEE,0x00,0x00, /* "H" */ + 0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00, /* "I" */ + 0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x88,0x88,0x70,0x00,0x00, /* "J" */ + 0x00,0x00,0xEE,0x44,0x48,0x48,0x50,0x60,0x50,0x48,0x48,0x44,0x44,0xEE,0x00,0x00, /* "K" */ + 0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x42,0x44,0xFC,0x00,0x00, /* "L" */ + 0x00,0x00,0xC6,0x44,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x44,0x44,0x44,0xEE,0x00,0x00, /* "M" */ + 0x00,0x00,0xCE,0x44,0x64,0x64,0x64,0x54,0x54,0x4C,0x4C,0x4C,0x44,0xE4,0x00,0x00, /* "N" */ + 0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00, /* "O" */ + 0x00,0x00,0xF8,0x44,0x42,0x42,0x42,0x44,0x78,0x40,0x40,0x40,0x40,0xE0,0x00,0x00, /* "P" */ + 0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xBA,0x44,0x3C,0x02,0x00, /* "Q" */ + 0x00,0x00,0xF0,0x48,0x44,0x44,0x44,0x48,0x70,0x48,0x44,0x44,0x44,0xE6,0x00,0x00, /* "R" */ + 0x00,0x00,0x3C,0x44,0x82,0x80,0x40,0x30,0x0C,0x02,0x02,0x82,0x44,0x78,0x00,0x00, /* "S" */ + 0x00,0x00,0x7C,0x54,0x92,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, /* "T" */ + 0x00,0x00,0xEE,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x38,0x00,0x00, /* "U" */ + 0x00,0x00,0xEE,0x44,0x44,0x44,0x44,0x28,0x28,0x28,0x28,0x10,0x10,0x10,0x00,0x00, /* "V" */ + 0x00,0x00,0xEE,0x44,0x54,0x54,0x54,0x54,0x54,0x54,0x28,0x28,0x28,0x28,0x00,0x00, /* "W" */ + 0x00,0x00,0xEE,0x44,0x44,0x28,0x28,0x10,0x10,0x28,0x28,0x44,0x44,0xEE,0x00,0x00, /* "X" */ + 0x00,0x00,0xEE,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, /* "Y" */ + 0x00,0x00,0x7E,0x44,0x84,0x08,0x08,0x10,0x20,0x20,0x40,0x82,0x84,0xFC,0x00,0x00, /* "Z" */ + 0x00,0x1C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1C,0x00, /* "[" */ + 0x00,0x00,0xEE,0x44,0x54,0x54,0xFE,0x54,0x54,0x54,0x28,0x28,0x28,0x28,0x00,0x00, /* "\" */ + 0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00, /* "]" */ + 0x00,0x30,0x48,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* "^" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00, /* "_" */ + 0x00,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* "`" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x84,0x04,0x7C,0x84,0x84,0x8C,0x76,0x00,0x00, /* "a" */ + 0x00,0x00,0xC0,0x40,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x42,0x64,0x58,0x00,0x00, /* "b" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x80,0x80,0x80,0x80,0x44,0x38,0x00,0x00, /* "c" */ + 0x00,0x00,0x0C,0x04,0x04,0x04,0x34,0x4C,0x84,0x84,0x84,0x84,0x4C,0x36,0x00,0x00, /* "d" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x84,0x84,0xFC,0x80,0x80,0x84,0x78,0x00,0x00, /* "e" */ + 0x00,0x00,0x18,0x24,0x20,0x20,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* "f" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x3A,0x44,0x44,0x78,0x80,0x7C,0x82,0x82,0x7C,0x00, /* "g" */ + 0x00,0x00,0xC0,0x40,0x40,0x40,0x58,0x64,0x44,0x44,0x44,0x44,0x44,0xEE,0x00,0x00, /* "h" */ + 0x00,0x00,0x10,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00, /* "i" */ + 0x00,0x00,0x10,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0x60,0x00, /* "j" */ + 0x00,0x00,0xC0,0x40,0x40,0x40,0x5C,0x48,0x50,0x60,0x50,0x48,0x44,0xEE,0x00,0x00, /* "k" */ + 0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x10,0x10,0x39,0x00,0x00, /* "l" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0xAC,0xD2,0x92,0x92,0x92,0x92,0x92,0xD6,0x00,0x00, /* "m" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x58,0xE4,0x44,0x44,0x44,0x44,0x44,0xEE,0x00,0x00, /* "n" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00, /* "o" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x64,0x42,0x42,0x42,0x64,0x58,0x40,0xE0,0x00, /* "p" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x4C,0x84,0x84,0x84,0x4C,0x34,0x04,0x0E,0x00, /* "q" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x30,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00, /* "r" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x88,0x84,0x60,0x18,0x84,0x44,0x78,0x00,0x00, /* "s" */ + 0x00,0x00,0x00,0x20,0x20,0x20,0xF8,0x20,0x20,0x20,0x20,0x20,0x24,0x18,0x00,0x00, /* "t" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x42,0x42,0x42,0x42,0x42,0x46,0x3A,0x00,0x00, /* "u" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x44,0x44,0x28,0x28,0x28,0x10,0x10,0x00,0x00, /* "v" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x44,0x44,0x54,0x54,0x28,0x28,0x28,0x00,0x00, /* "w" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x44,0x28,0x10,0x10,0x28,0x44,0xEE,0x00,0x00, /* "x" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x44,0x44,0x28,0x28,0x10,0x10,0xA0,0xC0,0x00, /* "y" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x44,0x88,0x10,0x20,0x42,0x84,0xFC,0x00,0x00, /* "z" */ + 0x00,0x0C,0x10,0x10,0x10,0x10,0x10,0x60,0x10,0x10,0x10,0x10,0x10,0x10,0x0C,0x00, /* "{" */ + 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00, /* "|" */ + 0x00,0xC0,0x20,0x20,0x20,0x20,0x20,0x18,0x20,0x20,0x20,0x20,0x20,0x20,0xC0,0x00, /* "}" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x72,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* "~" */ + 0x00, +}; + +/* Digital tube font */ +const unsigned char sz32[]={ + /* "0" */ + 0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x1F,0xE0,0x00,0x01,0x80,0x06,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x01,0x80,0x06,0x00,0x00,0x1F,0xE0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x1F,0xE0,0x00, + /* "1" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x03,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x07,0x80,0x00,0x00,0x03,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, + /* "2" */ + 0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x3F,0xF0,0x00,0x00,0xFF,0xF0,0x00,0x01,0xFF,0xE0,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x1F,0xE3,0x00,0x00,0x7F,0xF8,0x00,0x00,0x7F,0xF8,0x00,0x00,0x1F,0xE0,0x00,0x03,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x1F,0xF0,0x00,0x00,0x3F,0xF8,0x00,0x00,0x3F,0xFC,0x00,0x00,0x1F,0xFE,0x00, + /* "3" */ + 0x00,0x00,0x00,0x00,0x03,0xFF,0x80,0x00,0x01,0xFF,0xC0,0x00,0x00,0xFF,0xC0,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x7F,0x8C,0x00,0x01,0xFF,0xE0,0x00,0x01,0xFF,0xF0,0x00,0x00,0x7F,0x80,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x18,0x00,0x00,0x7F,0x80,0x00,0x00,0xFF,0xC0,0x00,0x01,0xFF,0xC0,0x00,0x03,0xFF,0x80,0x00, + /* "4" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0x03,0x80,0x07,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0x1F,0xE3,0x00,0x00,0x7F,0xF8,0x00,0x00,0x7F,0xFC,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00, + /* "5" */ + 0x00,0x00,0x00,0x00,0x00,0x1F,0xFC,0x00,0x00,0x3F,0xF8,0x00,0x00,0x3F,0xF0,0x00,0x00,0x1F,0xE0,0x00,0x01,0x80,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0x1F,0xE0,0x00,0x00,0x7F,0xF8,0x00,0x00,0x7F,0xF8,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x06,0x00,0x00,0x3F,0xE0,0x00,0x00,0x7F,0xF0,0x00,0x00,0xFF,0xF0,0x00,0x01,0xFF,0xE0,0x00, + /* "6" */ + 0x00,0x00,0x00,0x00,0x00,0x1F,0xFC,0x00,0x00,0x3F,0xF8,0x00,0x00,0x3F,0xF0,0x00,0x00,0x1F,0xE0,0x00,0x01,0x80,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0xC0,0x00,0x00,0x03,0x1F,0xE0,0x00,0x00,0x7F,0xF8,0x00,0x00,0x7F,0xFC,0x00,0x00,0x1F,0xE0,0x00,0x03,0x00,0x03,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x01,0x80,0x06,0x00,0x00,0x1F,0xE0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x1F,0xE0,0x00, + /* "7" */ + 0x00,0x00,0x00,0x00,0x07,0xFF,0xE0,0x00,0x03,0xFF,0xC0,0x00,0x01,0xFF,0x88,0x00,0x00,0xFF,0x18,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00, + /* "8" */ + 0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x1F,0xE0,0x00,0x01,0x80,0x06,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0x1F,0xE3,0x00,0x00,0x7F,0xF8,0x00,0x00,0x7F,0xFC,0x00,0x00,0x1F,0xE0,0x00,0x03,0x00,0x03,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x01,0x80,0x06,0x00,0x00,0x1F,0xE0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x1F,0xE0,0x00, + /* "9" */ + 0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x1F,0xE0,0x00,0x01,0x80,0x06,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0xC0,0x0F,0x00,0x03,0x1F,0xE3,0x00,0x00,0x7F,0xF8,0x00,0x00,0x7F,0xFC,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x06,0x00,0x00,0x1F,0xE0,0x00,0x00,0x3F,0xF0,0x00,0x00,0x7F,0xF0,0x00,0x00,0xFF,0xE0,0x00, + /* "." */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /* ":" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x0F,0x80,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /* "%" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x06,0x00,0x0F,0xE0,0x06,0x00,0x00,0x00,0x0C,0x00,0x30,0x18,0x18,0x00,0x30,0x18,0x18,0x00,0x30,0x18,0x30,0x00,0x30,0x18,0x30,0x00,0x30,0x18,0x60,0x00,0x30,0x08,0xC0,0x00,0x07,0xC0,0xC0,0x00,0x0F,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x00,0x06,0x07,0xC0,0x00,0x06,0x30,0x18,0x00,0x0C,0x30,0x18,0x00,0x0C,0x30,0x18,0x00,0x18,0x30,0x18,0x00,0x30,0x30,0x18,0x00,0x30,0x30,0x18,0x00,0x60,0x00,0x00,0x00,0xC0,0x0F,0xE0,0x00,0xC0,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /* "隆忙" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0xE0,0x00,0x08,0x87,0xFC,0x00,0x08,0x8E,0x03,0x00,0x08,0x98,0x01,0x80,0x07,0x18,0x00,0x80,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x0C,0x03,0x00,0x00,0x07,0xFC,0x00,0x00,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /* "-" */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF0,0x00,0x00,0x7F,0xF0,0x00,0x00,0x7F,0xE0,0x00,0x00,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00, +}; + +const typefont_GB162 hz16[] = { + "鏄",0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x04,0x40,0x44,0x44,0x24,0x44,0x14,0x48,0x14,0x50,0x04,0x40,0xFF,0xFE,0x00,0x00, + "绀",0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00, + "娴",0x00,0x04,0x27,0xC4,0x14,0x44,0x14,0x54,0x85,0x54,0x45,0x54,0x45,0x54,0x15,0x54,0x15,0x54,0x25,0x54,0xE5,0x54,0x21,0x04,0x22,0x84,0x22,0x44,0x24,0x14,0x08,0x08, + "璇",0x00,0x28,0x20,0x24,0x10,0x24,0x10,0x20,0x07,0xFE,0x00,0x20,0xF0,0x20,0x17,0xE0,0x11,0x20,0x11,0x10,0x11,0x10,0x15,0x10,0x19,0xCA,0x17,0x0A,0x02,0x06,0x00,0x02, + 0x00, +}; + +/* song typeface bold small 2 font */ +const typefont_GB242 hz24[] = +{ + "鏄",0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0x00,0x0F,0x03,0xC0,0x0C,0x00,0x40,0x1F,0xF8,0x60,0x18,0x00,0x60,0x08,0x00,0x40,0x0E,0x01,0xC0,0x07,0xFF,0x00,0x00,0x00,0x00,0x01,0x84,0x00,0x01,0x84,0x00,0x19,0x87,0x80,0x0F,0x8C,0xE0,0x07,0x8C,0x20,0x00,0xCC,0x00,0x03,0xFF,0xE0,0x1F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + "绀",0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x1F,0xFF,0xC0,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x3F,0xFF,0xE0,0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x06,0x13,0x00,0x0C,0x13,0xC0,0x0C,0x18,0xF0,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + "娴",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x39,0xFC,0x30,0x1F,0xCC,0x30,0x07,0x06,0xB0,0x0F,0x06,0xF0,0x19,0x07,0xB0,0x31,0x37,0xB0,0x31,0x36,0xF0,0x1F,0x27,0xF0,0x01,0x67,0xF0,0x01,0xE5,0xF0,0x01,0xE1,0xF0,0x00,0x41,0xF0,0x0C,0xF8,0xB0,0x3C,0xD8,0x30,0x00,0x8C,0x30,0x00,0x80,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + "璇",0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x60,0x0C,0x03,0x70,0x0C,0x03,0x30,0x00,0x3F,0xE0,0x00,0x3F,0x80,0x08,0x01,0x00,0x3C,0x01,0x80,0x04,0x7F,0x80,0x04,0x7D,0x80,0x0C,0x00,0x80,0x0C,0x10,0xC0,0x0C,0x10,0xC0,0x0C,0x18,0x40,0x0C,0x1C,0x60,0x0F,0x7E,0x60,0x06,0x70,0x30,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00, +}; + +font_struct font16x24 = +{ + ASCII16x24_Table, + 16, /* width */ + 24, /* height */ +}; + +font_struct font8x16 = +{ + ASCII8x16_Table, + 8, /* width */ + 16, /* height */ +}; + +font_struct font12x12 = +{ + ASCII12x12_Table, + 12, /* width */ + 12, /* height */ +}; + +font_struct font8x12 = +{ + ASCII8x12_Table, + 8, /* width */ + 12, /* height */ +}; + + +font_struct font8x8 = +{ + ASCII8x8_Table, + 8, /* width */ + 8, /* height */ +}; diff --git b/Utilities/LCD_Commom/lcd_font.h a/Utilities/LCD_Commom/lcd_font.h new file mode 100644 index 0000000..ec9caae --- /dev/null +++ a/Utilities/LCD_Commom/lcd_font.h @@ -0,0 +1,81 @@ +/*! + \file lcd_font.h + \brief the header file of LCD font + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2018, GigaDevice Semiconductor Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef LCD_FONTS_H +#define LCD_FONTS_H + +#include + +typedef struct { + const uint16_t *table; + + uint16_t width; + uint16_t height; +} font_struct; + +typedef struct +{ + unsigned char index[3]; + char mask[32]; +} typefont_GB162; + +typedef struct +{ + unsigned char index[3]; + char mask[72]; +} typefont_GB242; + +#define hz16_num 100 +#define hz24_num 100 + +extern font_struct font16x24; +extern font_struct font12x12; +extern font_struct font8x16; +extern font_struct font8x12; +extern font_struct font8x8; + +extern const unsigned char ASCII16[]; +extern const unsigned char sz32[]; + +extern const typefont_GB162 hz16[]; +extern const typefont_GB242 hz24[]; + +#define LINE(x) ((x) * (((font_struct *)lcd_font_get())->height)) + +#endif /* LCD_FONTS_H */ + diff --git b/Utilities/LCD_Commom/lcd_log.c a/Utilities/LCD_Commom/lcd_log.c new file mode 100644 index 0000000..c1e2ef6 --- /dev/null +++ a/Utilities/LCD_Commom/lcd_log.c @@ -0,0 +1,249 @@ +/*! + \file lcd_log.c + \brief this file provides all the LCD Log firmware functions + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2018, GigaDevice Semiconductor Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "lcd_log.h" +#include "usb_lcd_conf.h" + +#include + +LCD_LOG_line LCD_CacheBuffer[LCD_CACHE_DEPTH]; +uint32_t LCD_LineColor; +uint16_t LCD_CacheBuffer_xptr; +uint16_t LCD_CacheBuffer_yptr_top; +uint16_t LCD_CacheBuffer_yptr_bottom; + +uint16_t LCD_CacheBuffer_yptr_top_bak; +uint16_t LCD_CacheBuffer_yptr_bottom_bak; + +ControlStatus LCD_CacheBuffer_yptr_invert; +ControlStatus LCD_ScrollActive; +ControlStatus LCD_Lock; +ControlStatus LCD_Scrolled; +uint16_t LCD_ScrollBackStep; + +/*! + \brief initialize the LCD Log module + \param[in] none + \param[out] none + \retval none +*/ +void lcd_log_init (void) +{ + lcd_log_deinit(); + + lcd_clear(LCD_COLOR_BLACK); +} + +/*! + \brief de-initialize the LCD Log module + \param[in] none + \param[out] none + \retval none +*/ +void lcd_log_deinit (void) +{ + LCD_LineColor = LCD_LOG_TEXT_COLOR; + LCD_CacheBuffer_xptr = 0; + LCD_CacheBuffer_yptr_top = 0; + LCD_CacheBuffer_yptr_bottom = 0; + + LCD_CacheBuffer_yptr_top_bak = 0; + LCD_CacheBuffer_yptr_bottom_bak = 0; + + LCD_CacheBuffer_yptr_invert= ENABLE; + LCD_ScrollActive = DISABLE; + LCD_Lock = DISABLE; + LCD_Scrolled = DISABLE; + LCD_ScrollBackStep = 0; +} + +/*! + \brief display the application header (title) on the LCD screen + \param[in] ptitle: pointer to the string to be displayed + \param[in] start_x: x location + \param[out] none + \retval none +*/ +void lcd_log_header_set (uint8_t *ptitle, uint16_t start_x) +{ + lcd_font_set(&font8x16); + + lcd_text_color_set(LCD_COLOR_BLUE); + + lcd_rectangle_fill(LCD_HEADER_X, LCD_HEADER_Y, LCD_FLAG_WIDTH, LCD_FLAG_HEIGHT); + + lcd_background_color_set(LCD_COLOR_BLUE); + lcd_text_color_set(LCD_COLOR_RED); + + lcd_vertical_string_display(LCD_HEADER_LINE, start_x, ptitle); + + lcd_background_color_set(LCD_COLOR_BLACK); +} + +/*! + \brief display the application footer (status) on the LCD screen + \param[in] pstatus: pointer to the string to be displayed + \param[in] start_x: x location + \param[out] none + \retval none +*/ +void lcd_log_footer_set (uint8_t *pstatus, uint16_t start_x) +{ + lcd_text_color_set(LCD_COLOR_BLUE); + + lcd_rectangle_fill(LCD_FOOTER_X, LCD_FOOTER_Y, LCD_FLAG_WIDTH, LCD_FLAG_HEIGHT); + + lcd_background_color_set(LCD_COLOR_BLUE); + lcd_text_color_set(LCD_COLOR_RED); + + lcd_vertical_string_display(LCD_FOOTER_LINE, start_x, pstatus); + + lcd_background_color_set(LCD_COLOR_BLACK); +} + +/*! + \brief clear the text zone + \param[in] start_x, start_y, end_x, end_y: zone location + \param[out] none + \retval none +*/ +void lcd_log_textzone_clear (uint16_t start_x, + uint16_t start_y, + uint16_t width, + uint16_t height) +{ + lcd_rectangle_fill(start_x, start_y, width, height); +} + +/*! + \brief redirect the printf to the LCD + \param[in] ch: character to be displayed + \param[in] f: output file pointer + \param[out] none + \retval none +*/ +LCD_LOG_PUTCHAR +{ + font_struct *cFont = lcd_font_get(); + uint32_t idx; + + if (LCD_Lock == DISABLE) { + if (LCD_ScrollActive == ENABLE) { + LCD_CacheBuffer_yptr_bottom = LCD_CacheBuffer_yptr_bottom_bak; + LCD_CacheBuffer_yptr_top = LCD_CacheBuffer_yptr_top_bak; + LCD_ScrollActive = DISABLE; + LCD_Scrolled = DISABLE; + LCD_ScrollBackStep = 0; + } + + if ((LCD_CacheBuffer_xptr < LCD_FLAG_HEIGHT / cFont->width) && (ch != '\n')) { + if (ch != '\r') { + LCD_CacheBuffer[LCD_CacheBuffer_yptr_bottom].line[LCD_CacheBuffer_xptr++] = (uint16_t)ch; + } + } else { + if (LCD_CacheBuffer_yptr_top >= LCD_CacheBuffer_yptr_bottom) { + if (LCD_CacheBuffer_yptr_invert == DISABLE) { + LCD_CacheBuffer_yptr_top++; + + if (LCD_CacheBuffer_yptr_top == LCD_CACHE_DEPTH) { + LCD_CacheBuffer_yptr_top = 0; + } + } else { + LCD_CacheBuffer_yptr_invert= DISABLE; + } + } + + for (idx = LCD_CacheBuffer_xptr; idx < LCD_FLAG_HEIGHT / cFont->width; idx++) { + LCD_CacheBuffer[LCD_CacheBuffer_yptr_bottom].line[LCD_CacheBuffer_xptr++] = ' '; + } + + LCD_CacheBuffer[LCD_CacheBuffer_yptr_bottom].color = LCD_LineColor; + LCD_CacheBuffer_xptr = 0; + LCD_LOG_UpdateDisplay(); + LCD_CacheBuffer_yptr_bottom ++; + + if (LCD_CacheBuffer_yptr_bottom == LCD_CACHE_DEPTH) { + LCD_CacheBuffer_yptr_bottom = 0; + LCD_CacheBuffer_yptr_top = 1; + LCD_CacheBuffer_yptr_invert = ENABLE; + } + + if ((ch != '\n') && (ch != '\r')) { + LCD_CacheBuffer[LCD_CacheBuffer_yptr_bottom].line[LCD_CacheBuffer_xptr++] = (uint16_t)ch; + } + } + } + + return ch; +} + +/*! + \brief update the text area display + \param[in] none + \param[out] none + \retval none +*/ +void LCD_LOG_UpdateDisplay (void) +{ + uint8_t cnt = 0 ; + uint16_t length = 0 ; + uint16_t ptr = 0, index = 0; + + font_struct *cFont = lcd_font_get(); + + if ((LCD_CacheBuffer_yptr_bottom < (YWINDOW_SIZE - 1)) && (LCD_CacheBuffer_yptr_bottom >= LCD_CacheBuffer_yptr_top)) { + lcd_text_color_set (LCD_CacheBuffer[cnt + LCD_CacheBuffer_yptr_bottom].color); + lcd_vertical_string_display ((YWINDOW_MIN + LCD_CacheBuffer_yptr_bottom) * cFont->height, 0, (uint8_t *)(LCD_CacheBuffer[cnt + LCD_CacheBuffer_yptr_bottom].line)); + } else { + if (LCD_CacheBuffer_yptr_bottom < LCD_CacheBuffer_yptr_top) { + /* Virtual length for rolling */ + length = LCD_CACHE_DEPTH + LCD_CacheBuffer_yptr_bottom ; + } else { + length = LCD_CacheBuffer_yptr_bottom; + } + + ptr = length - YWINDOW_SIZE + 1; + + for (cnt = 0; cnt < YWINDOW_SIZE; cnt ++) { + index = (cnt + ptr ) % LCD_CACHE_DEPTH; + + lcd_text_color_set (LCD_CacheBuffer[index].color); + lcd_vertical_string_display ((cnt + YWINDOW_MIN) * cFont->height, 0, (uint8_t *)(LCD_CacheBuffer[index].line)); + } + } +} diff --git b/Utilities/LCD_Commom/lcd_log.h a/Utilities/LCD_Commom/lcd_log.h new file mode 100644 index 0000000..0b44afb --- /dev/null +++ a/Utilities/LCD_Commom/lcd_log.h @@ -0,0 +1,104 @@ +/*! + \file lcd_log.h + \brief header for the lcd_log.c file + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2018, GigaDevice Semiconductor Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef __LCD_LOG_H +#define __LCD_LOG_H + +#include "usb_conf.h" +#include "usb_lcd_conf.h" +#include + +extern uint32_t LCD_LineColor; + +#define LCD_ErrLog(...) do { \ + LCD_LineColor = LCD_COLOR_RED;\ + printf("ERROR: ") ;\ + printf(__VA_ARGS__);\ + LCD_LineColor = LCD_LOG_DEFAULT_COLOR;\ + }while (0) + +#define LCD_UsrLog(...) do { \ + LCD_LineColor = LCD_LOG_TEXT_COLOR;\ + printf(__VA_ARGS__);\ + } while (0) + + +#define LCD_DbgLog(...) do { \ + LCD_LineColor = LCD_COLOR_RED;\ + printf(__VA_ARGS__);\ + LCD_LineColor = LCD_LOG_DEFAULT_COLOR;\ + }while (0) + +#define LCD_DevInformation(...) do { \ + LCD_LineColor = LCD_COLOR_BLUE; \ + printf(__VA_ARGS__); \ + LCD_LineColor = LCD_LOG_DEFAULT_COLOR; \ + }while(0) + +#if (LCD_SCROLL_ENABLED == 1) + #define LCD_CACHE_DEPTH (YWINDOW_SIZE + CACHE_SIZE) +#else + #define LCD_CACHE_DEPTH YWINDOW_SIZE +#endif + +typedef struct _LCD_LOG_line +{ + uint8_t line[128]; + uint32_t color; +}LCD_LOG_line; + +/* initialize the LCD Log module */ +void lcd_log_init (void); +/* de-initialize the LCD Log module */ +void lcd_log_deinit (void); +/* display the application header (title) on the LCD screen */ +void lcd_log_header_set (uint8_t *ptitle, uint16_t start_x); +/* display the application footer (status) on the LCD screen */ +void lcd_log_footer_set (uint8_t *pstatus, uint16_t start_x); +/* clear the text zone */ +void lcd_log_textzone_clear (uint16_t start_x, + uint16_t start_y, + uint16_t end_x, + uint16_t end_y); + +void LCD_LOG_UpdateDisplay (void); + + +#endif /* __LCD_LOG_H */ + diff --git b/Utilities/Third_Party/fat_fs/00history.txt a/Utilities/Third_Party/fat_fs/00history.txt new file mode 100644 index 0000000..db12a9e --- /dev/null +++ a/Utilities/Third_Party/fat_fs/00history.txt @@ -0,0 +1,330 @@ +---------------------------------------------------------------------------- + Revision history of FatFs module +---------------------------------------------------------------------------- + +R0.00 (February 26, 2006) + + Prototype. + + + +R0.01 (April 29, 2006) + + The first release. + + + +R0.02 (June 01, 2006) + + Added FAT12 support. + Removed unbuffered mode. + Fixed a problem on small (<32M) partition. + + + +R0.02a (June 10, 2006) + + Added a configuration option (_FS_MINIMUM). + + + +R0.03 (September 22, 2006) + + Added f_rename(). + Changed option _FS_MINIMUM to _FS_MINIMIZE. + + + +R0.03a (December 11, 2006) + + Improved cluster scan algorithm to write files fast. + Fixed f_mkdir() creates incorrect directory on FAT32. + + + +R0.04 (February 04, 2007) + + Added f_mkfs(). + Supported multiple drive system. + Changed some interfaces for multiple drive system. + Changed f_mountdrv() to f_mount(). + + + +R0.04a (April 01, 2007) + + Supported multiple partitions on a physical drive. + Added a capability of extending file size to f_lseek(). + Added minimization level 3. + Fixed an endian sensitive code in f_mkfs(). + + + +R0.04b (May 05, 2007) + + Added a configuration option _USE_NTFLAG. + Added FSINFO support. + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (<= csize) collapses the file object. + + + +R0.05 (August 25, 2007) + + Changed arguments of f_read(), f_write() and f_mkfs(). + Fixed f_mkfs() on FAT32 creates incorrect FSINFO. + Fixed f_mkdir() on FAT32 creates incorrect directory. + + + +R0.05a (February 03, 2008) + + Added f_truncate() and f_utime(). + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read() can be mistruncated. + Fixed cached sector is not flushed when create and close without write. + + + +R0.06 (April 01, 2008) + + Added fputc(), fputs(), fprintf() and fgets(). + Improved performance of f_lseek() on moving to the same or following cluster. + + + +R0.07 (April 01, 2009) + + Merged Tiny-FatFs as a configuration option. (_FS_TINY) + Added long file name feature. (_USE_LFN) + Added multiple code page feature. (_CODE_PAGE) + Added re-entrancy for multitask operation. (_FS_REENTRANT) + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + + + +R0.07a (April 14, 2009) + + Septemberarated out OS dependent code on reentrant cfg. + Added multiple sector size feature. + + + +R0.07c (June 21, 2009) + + Fixed f_unlink() can return FR_OK on error. + Fixed wrong cache control in f_lseek(). + Added relative path feature. + Added f_chdir() and f_chdrive(). + Added proper case conversion to extended character. + + + +R0.07e (November 03, 2009) + + Septemberarated out configuration options from ff.h to ffconf.h. + Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH. + Fixed name matching error on the 13 character boundary. + Added a configuration option, _LFN_UNICODE. + Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. + + + +R0.08 (May 15, 2010) + + Added a memory configuration option. (_USE_LFN = 3) + Added file lock feature. (_FS_SHARE) + Added fast seek feature. (_USE_FASTSEEK) + Changed some types on the API, XCHAR->TCHAR. + Changed .fname in the FILINFO structure on Unicode cfg. + String functions support UTF-8 encoding files on Unicode cfg. + + + +R0.08a (August 16, 2010) + + Added f_getcwd(). (_FS_RPATH = 2) + Added sector erase feature. (_USE_ERASE) + Moved file lock semaphore table from fs object to the bss. + Fixed f_mkfs() creates wrong FAT32 volume. + + + +R0.08b (January 15, 2011) + + Fast seek feature is also applied to f_read() and f_write(). + f_lseek() reports required table size on creating CLMP. + Extended format syntax of f_printf(). + Ignores duplicated directory separators in given path name. + + + +R0.09 (September 06, 2011) + + f_mkfs() supports multiple partition to complete the multiple partition feature. + Added f_fdisk(). + + + +R0.09a (August 27, 2012) + + Changed f_open() and f_opendir() reject null object pointer to avoid crash. + Changed option name _FS_SHARE to _FS_LOCK. + Fixed assertion failure due to OS/2 EA on FAT12/16 volume. + + + +R0.09b (January 24, 2013) + + Added f_setlabel() and f_getlabel(). + + + +R0.10 (October 02, 2013) + + Added selection of character encoding on the file. (_STRF_ENCODE) + Added f_closedir(). + Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO) + Added forced mount feature with changes of f_mount(). + Improved behavior of volume auto detection. + Improved write throughput of f_puts() and f_printf(). + Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). + Fixed f_write() can be truncated when the file size is close to 4GB. + Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect value on error. + + + +R0.10a (January 15, 2014) + + Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) + Added a configuration option of minimum sector size. (_MIN_SS) + 2nd argument of f_rename() can have a drive number and it will be ignored. + Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10) + Fixed f_close() invalidates the file object without volume lock. + Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10) + Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07) + + + +R0.10b (May 19, 2014) + + Fixed a hard error in the disk I/O layer can collapse the directory entry. + Fixed LFN entry is not deleted when delete/rename an object with lossy converted SFN. (appeared at R0.07) + + + +R0.10c (November 09, 2014) + + Added a configuration option for the platforms without RTC. (_FS_NORTC) + Changed option name _USE_ERASE to _USE_TRIM. + Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b) + Fixed a potential problem of FAT access that can appear on disk error. + Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08) + + + +R0.11 (February 09, 2015) + + Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND) + Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c) + Fixed _FS_NORTC option does not work properly. (appeared at R0.10c) + + + +R0.11a (September 05, 2015) + + Fixed wrong media change can lead a deadlock at thread-safe configuration. + Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE) + Removed some code pages actually not exist on the standard systems. (_CODE_PAGE) + Fixed errors in the case conversion teble of code page 437 and 850 (ff.c). + Fixed errors in the case conversion teble of Unicode (cc*.c). + + + +R0.12 (April 12, 2016) + + Added support for exFAT file system. (_FS_EXFAT) + Added f_expand(). (_USE_EXPAND) + Changed some members in FINFO structure and behavior of f_readdir(). + Added an option _USE_CHMOD. + Removed an option _WORD_ACCESS. + Fixed errors in the case conversion table of Unicode (cc*.c). + + + +R0.12a (July 10, 2016) + + Added support for creating exFAT volume with some changes of f_mkfs(). + Added a file open method FA_OPEN_APPEND. An f_lseek() following f_open() is no longer needed. + f_forward() is available regardless of _FS_TINY. + Fixed f_mkfs() creates wrong volume. (appeared at R0.12) + Fixed wrong memory read in create_name(). (appeared at R0.12) + Fixed compilation fails at some configurations, _USE_FASTSEEK and _USE_FORWARD. + + + +R0.12b (September 04, 2016) + + Made f_rename() be able to rename objects with the same name but case. + Fixed an error in the case conversion teble of code page 866. (ff.c) + Fixed writing data is truncated at the file offset 4GiB on the exFAT volume. (appeared at R0.12) + Fixed creating a file in the root directory of exFAT volume can fail. (appeared at R0.12) + Fixed f_mkfs() creating exFAT volume with too small cluster size can collapse unallocated memory. (appeared at R0.12) + Fixed wrong object name can be returned when read directory at Unicode cfg. (appeared at R0.12) + Fixed large file allocation/removing on the exFAT volume collapses allocation bitmap. (appeared at R0.12) + Fixed some internal errors in f_expand() and f_lseek(). (appeared at R0.12) + + + +R0.12c (March 04, 2017) + + Improved write throughput at the fragmented file on the exFAT volume. + Made memory usage for exFAT be able to be reduced as decreasing _MAX_LFN. + Fixed successive f_getfree() can return wrong count on the FAT12/16 volume. (appeared at R0.12) + Fixed configuration option _VOLUMES cannot be set 10. (appeared at R0.10c) + + + +R0.13 (May 21, 2017) + + Changed heading character of configuration keywords "_" to "FF_". + Removed ASCII-only configuration, FF_CODE_PAGE = 1. Use FF_CODE_PAGE = 437 instead. + Added f_setcp(), run-time code page configuration. (FF_CODE_PAGE = 0) + Improved cluster allocation time on stretch a deep buried cluster chain. + Improved processing time of f_mkdir() with large cluster size by using FF_USE_LFN = 3. + Improved NoFatChain flag of the fragmented file to be set after it is truncated and got contiguous. + Fixed archive attribute is left not set when a file on the exFAT volume is renamed. (appeared at R0.12) + Fixed exFAT FAT entry can be collapsed when write or lseek operation to the existing file is done. (appeared at R0.12c) + Fixed creating a file can fail when a new cluster allocation to the exFAT directory occures. (appeared at R0.12c) + + + +R0.13a (October 14, 2017) + + Added support for UTF-8 encoding on the API. (FF_LFN_UNICODE = 2) + Added options for file name output buffer. (FF_LFN_BUF, FF_SFN_BUF). + Added dynamic memory allocation option for working buffer of f_mkfs() and f_fdisk(). + Fixed f_fdisk() and f_mkfs() create the partition table with wrong CHS parameters. (appeared at R0.09) + Fixed f_unlink() can cause lost clusters at fragmented file on the exFAT volume. (appeared at R0.12c) + Fixed f_setlabel() rejects some valid characters for exFAT volume. (appeared at R0.12) + + + +R0.13b (April 07, 2018) + + Added support for UTF-32 encoding on the API. (FF_LFN_UNICODE = 3) + Added support for Unix style volume ID. (FF_STR_VOLUME_ID = 2) + Fixed accesing any object on the exFAT root directory beyond the cluster boundary can fail. (appeared at R0.12c) + Fixed f_setlabel() does not reject some invalid characters. (appeared at R0.09b) + + + +R0.13c (October 14, 2018) + Supported stdint.h for C99 and later. (integer.h was included in ff.h) + Fixed reading a directory gets infinite loop when the last directory entry is not empty. (appeared at R0.12) + Fixed creating a sub-directory in the fragmented sub-directory on the exFAT volume collapses FAT chain of the parent directory. (appeared at R0.12) + Fixed f_getcwd() cause output buffer overrun when the buffer has a valid drive number. (appeared at R0.13b) + diff --git b/Utilities/Third_Party/fat_fs/00readme.txt a/Utilities/Third_Party/fat_fs/00readme.txt new file mode 100644 index 0000000..dcccbdb --- /dev/null +++ a/Utilities/Third_Party/fat_fs/00readme.txt @@ -0,0 +1,21 @@ +FatFs Module Source Files R0.13c + + +FILES + + 00readme.txt This file. + 00history.txt Revision history. + ff.c FatFs module. + ffconf.h Configuration file of FatFs module. + ff.h Common include file for FatFs and application module. + diskio.h Common include file for FatFs and disk I/O module. + diskio.c An example of glue function to attach existing disk I/O module to FatFs. + ffunicode.c Optional Unicode utility functions. + ffsystem.c An example of optional O/S related functions. + + + Low level disk I/O module is not included in this archive because the FatFs + module is only a generic file system layer and it does not depend on any specific + storage device. You need to provide a low level disk I/O module written to + control the storage device that attached to the target system. + diff --git b/Utilities/Third_Party/fat_fs/inc/diskio.h a/Utilities/Third_Party/fat_fs/inc/diskio.h new file mode 100644 index 0000000..4c145f5 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/inc/diskio.h @@ -0,0 +1,79 @@ +/*-----------------------------------------------------------------------/ +/ Low level disk interface modlue include file (C)ChaN, 2014 / +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO_DEFINED +#define _DISKIO_DEFINED + +#ifdef __cplusplus +extern "C" { +#endif + +#define _USE_WRITE 1 /* 1: Enable disk_write function */ +#define _USE_IOCTL 1 /* 1: Enable disk_ioctl function */ + +#include "ff.h" + +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + + +DSTATUS disk_initialize (BYTE pdrv); +DSTATUS disk_status (BYTE pdrv); +DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); +DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); +DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); +DWORD get_fattime (void); + +/* Disk Status Bits (DSTATUS) */ + +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + + +/* Command code for disk_ioctrl fucntion */ + +/* Generic command (Used by FatFs) */ +#define CTRL_SYNC 0 /* Complete pending write process (needed at _FS_READONLY == 0) */ +#define GET_SECTOR_COUNT 1 /* Get media size (needed at _USE_MKFS == 1) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (needed at _MAX_SS != _MIN_SS) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at _USE_MKFS == 1) */ +#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at _USE_TRIM == 1) */ + +/* Generic command (Not used by FatFs) */ +#define CTRL_POWER 5 /* Get/Set power status */ +#define CTRL_LOCK 6 /* Lock/Unlock media removal */ +#define CTRL_EJECT 7 /* Eject media */ +#define CTRL_FORMAT 8 /* Create physical format on the media */ + +/* MMC/SDC specific ioctl command */ +#define MMC_GET_TYPE 10 /* Get card type */ +#define MMC_GET_CSD 11 /* Get CSD */ +#define MMC_GET_CID 12 /* Get CID */ +#define MMC_GET_OCR 13 /* Get OCR */ +#define MMC_GET_SDSTAT 14 /* Get SD status */ + +/* ATA/CF specific ioctl command */ +#define ATA_GET_REV 20 /* Get F/W revision */ +#define ATA_GET_MODEL 21 /* Get model name */ +#define ATA_GET_SN 22 /* Get serial number */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git b/Utilities/Third_Party/fat_fs/inc/fattime.h a/Utilities/Third_Party/fat_fs/inc/fattime.h new file mode 100644 index 0000000..94b7068 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/inc/fattime.h @@ -0,0 +1,7 @@ +#ifndef FATTIME_H_ + +#include "integer.h" + +DWORD get_fattime (void); + +#endif diff --git b/Utilities/Third_Party/fat_fs/inc/ff.h a/Utilities/Third_Party/fat_fs/inc/ff.h new file mode 100644 index 0000000..a0792b2 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/inc/ff.h @@ -0,0 +1,405 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem module R0.13c / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2018, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: + +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/ +/----------------------------------------------------------------------------*/ + + +#ifndef FF_DEFINED +#define FF_DEFINED 86604 /* Revision ID */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ffconf.h" /* FatFs configuration options */ + +#if FF_DEFINED != FFCONF_DEF +#error Wrong configuration file (ffconf.h). +#endif + + +/* Integer types used for FatFs API */ + +#if defined(_WIN32) /* Main development platform */ +#define FF_INTDEF 2 +#include +typedef unsigned __int64 QWORD; +#elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus) /* C99 or later */ +#define FF_INTDEF 2 +#include +typedef unsigned int UINT; /* int must be 16-bit or 32-bit */ +typedef unsigned char BYTE; /* char must be 8-bit */ +typedef uint16_t WORD; /* 16-bit unsigned integer */ +typedef uint16_t WCHAR; /* 16-bit unsigned integer */ +typedef uint32_t DWORD; /* 32-bit unsigned integer */ +typedef uint64_t QWORD; /* 64-bit unsigned integer */ +#else /* Earlier than C99 */ +#define FF_INTDEF 1 +typedef unsigned int UINT; /* int must be 16-bit or 32-bit */ +typedef unsigned char BYTE; /* char must be 8-bit */ +typedef unsigned short WORD; /* 16-bit unsigned integer */ +typedef unsigned short WCHAR; /* 16-bit unsigned integer */ +typedef unsigned long DWORD; /* 32-bit unsigned integer */ +#endif + + +/* Definitions of volume management */ + +#if FF_MULTI_PARTITION /* Multiple partition configuration */ +typedef struct { + BYTE pd; /* Physical drive number */ + BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */ +} PARTITION; +extern PARTITION VolToPart[]; /* Volume - Partition resolution table */ +#endif + +#if FF_STR_VOLUME_ID +#ifndef FF_VOLUME_STRS +extern const char* VolumeStr[FF_VOLUMES]; /* User defied volume ID */ +#endif +#endif + + + +/* Type of path name strings on FatFs API */ + +#ifndef _INC_TCHAR +#define _INC_TCHAR + +#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* Unicode in UTF-16 encoding */ +typedef WCHAR TCHAR; +#define _T(x) L ## x +#define _TEXT(x) L ## x +#elif FF_USE_LFN && FF_LFN_UNICODE == 2 /* Unicode in UTF-8 encoding */ +typedef char TCHAR; +#define _T(x) u8 ## x +#define _TEXT(x) u8 ## x +#elif FF_USE_LFN && FF_LFN_UNICODE == 3 /* Unicode in UTF-32 encoding */ +typedef DWORD TCHAR; +#define _T(x) U ## x +#define _TEXT(x) U ## x +#elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3) +#error Wrong FF_LFN_UNICODE setting +#else /* ANSI/OEM code in SBCS/DBCS */ +typedef char TCHAR; +#define _T(x) x +#define _TEXT(x) x +#endif + +#endif + + + +/* Type of file size variables */ + +#if FF_FS_EXFAT +#if FF_INTDEF != 2 +#error exFAT feature wants C99 or later +#endif +typedef QWORD FSIZE_t; +#else +typedef DWORD FSIZE_t; +#endif + + + +/* Filesystem object structure (FATFS) */ + +typedef struct { + BYTE fs_type; /* Filesystem type (0:not mounted) */ + BYTE pdrv; /* Associated physical drive */ + BYTE n_fats; /* Number of FATs (1 or 2) */ + BYTE wflag; /* win[] flag (b0:dirty) */ + BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */ + WORD id; /* Volume mount ID */ + WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ + WORD csize; /* Cluster size [sectors] */ +#if FF_MAX_SS != FF_MIN_SS + WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */ +#endif +#if FF_USE_LFN + WCHAR* lfnbuf; /* LFN working buffer */ +#endif +#if FF_FS_EXFAT + BYTE* dirbuf; /* Directory entry block scratchpad buffer for exFAT */ +#endif +#if FF_FS_REENTRANT + FF_SYNC_t sobj; /* Identifier of sync object */ +#endif +#if !FF_FS_READONLY + DWORD last_clst; /* Last allocated cluster */ + DWORD free_clst; /* Number of free clusters */ +#endif +#if FF_FS_RPATH + DWORD cdir; /* Current directory start cluster (0:root) */ +#if FF_FS_EXFAT + DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */ + DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */ + DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */ +#endif +#endif + DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */ + DWORD fsize; /* Size of an FAT [sectors] */ + DWORD volbase; /* Volume base sector */ + DWORD fatbase; /* FAT base sector */ + DWORD dirbase; /* Root directory base sector/cluster */ + DWORD database; /* Data base sector */ +#if FF_FS_EXFAT + DWORD bitbase; /* Allocation bitmap base sector */ +#endif + DWORD winsect; /* Current sector appearing in the win[] */ + BYTE win[FF_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */ +} FATFS; + + + +/* Object ID and allocation information (FFOBJID) */ + +typedef struct { + FATFS* fs; /* Pointer to the hosting volume of this object */ + WORD id; /* Hosting volume mount ID */ + BYTE attr; /* Object attribute */ + BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:fragmented in this session, b2:sub-directory stretched) */ + DWORD sclust; /* Object data start cluster (0:no cluster or root directory) */ + FSIZE_t objsize; /* Object size (valid when sclust != 0) */ +#if FF_FS_EXFAT + DWORD n_cont; /* Size of first fragment - 1 (valid when stat == 3) */ + DWORD n_frag; /* Size of last fragment needs to be written to FAT (valid when not zero) */ + DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */ + DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */ + DWORD c_ofs; /* Offset in the containing directory (valid when file object and sclust != 0) */ +#endif +#if FF_FS_LOCK + UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */ +#endif +} FFOBJID; + + + +/* File object structure (FIL) */ + +typedef struct { + FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */ + BYTE flag; /* File status flags */ + BYTE err; /* Abort flag (error code) */ + FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */ + DWORD clust; /* Current cluster of fpter (invalid when fptr is 0) */ + DWORD sect; /* Sector number appearing in buf[] (0:invalid) */ +#if !FF_FS_READONLY + DWORD dir_sect; /* Sector number containing the directory entry (not used at exFAT) */ + BYTE* dir_ptr; /* Pointer to the directory entry in the win[] (not used at exFAT) */ +#endif +#if FF_USE_FASTSEEK + DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */ +#endif +#if !FF_FS_TINY + BYTE buf[FF_MAX_SS]; /* File private data read/write window */ +#endif +} FIL; + + + +/* Directory object structure (DIR) */ + +typedef struct { + FFOBJID obj; /* Object identifier */ + DWORD dptr; /* Current read/write offset */ + DWORD clust; /* Current cluster */ + DWORD sect; /* Current sector (0:Read operation has terminated) */ + BYTE* dir; /* Pointer to the directory item in the win[] */ + BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */ +#if FF_USE_LFN + DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */ +#endif +#if FF_USE_FIND + const TCHAR* pat; /* Pointer to the name matching pattern */ +#endif +} DIR; + + + +/* File information structure (FILINFO) */ + +typedef struct { + FSIZE_t fsize; /* File size */ + WORD fdate; /* Modified date */ + WORD ftime; /* Modified time */ + BYTE fattrib; /* File attribute */ +#if FF_USE_LFN + TCHAR altname[FF_SFN_BUF + 1];/* Altenative file name */ + TCHAR fname[FF_LFN_BUF + 1]; /* Primary file name */ +#else + TCHAR fname[12 + 1]; /* File name */ +#endif +} FILINFO; + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* (0) Succeeded */ + FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ + FR_INT_ERR, /* (2) Assertion failed */ + FR_NOT_READY, /* (3) The physical drive cannot work */ + FR_NO_FILE, /* (4) Could not find the file */ + FR_NO_PATH, /* (5) Could not find the path */ + FR_INVALID_NAME, /* (6) The path name format is invalid */ + FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ + FR_EXIST, /* (8) Access denied due to prohibited access */ + FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ + FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ + FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ + FR_NOT_ENABLED, /* (12) The volume has no work area */ + FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ + FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ + FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ + FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ + FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ + FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */ + FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */ +FRESULT f_close (FIL* fp); /* Close an open file object */ +FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */ +FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */ +FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */ +FRESULT f_truncate (FIL* fp); /* Truncate the file */ +FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */ +FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */ +FRESULT f_closedir (DIR* dp); /* Close an open directory */ +FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */ +FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */ +FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */ +FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */ +FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */ +FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ +FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */ +FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */ +FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */ +FRESULT f_chdir (const TCHAR* path); /* Change current directory */ +FRESULT f_chdrive (const TCHAR* path); /* Change current drive */ +FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */ +FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */ +FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */ +FRESULT f_setlabel (const TCHAR* label); /* Set volume label */ +FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */ +FRESULT f_expand (FIL* fp, FSIZE_t szf, BYTE opt); /* Allocate a contiguous block to the file */ +FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */ +FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len); /* Create a FAT volume */ +FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work); /* Divide a physical drive into some partitions */ +FRESULT f_setcp (WORD cp); /* Set current code page */ +int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */ +int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */ +int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */ +TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */ + +#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize)) +#define f_error(fp) ((fp)->err) +#define f_tell(fp) ((fp)->fptr) +#define f_size(fp) ((fp)->obj.objsize) +#define f_rewind(fp) f_lseek((fp), 0) +#define f_rewinddir(dp) f_readdir((dp), 0) +#define f_rmdir(path) f_unlink(path) +#define f_unmount(path) f_mount(0, path, 0) + +#ifndef EOF +#define EOF (-1) +#endif + + + + +/*--------------------------------------------------------------*/ +/* Additional user defined functions */ + +/* RTC function */ +#if !FF_FS_READONLY && !FF_FS_NORTC +DWORD get_fattime (void); +#endif + +/* LFN support functions */ +#if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */ +WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */ +WCHAR ff_uni2oem (DWORD uni, WORD cp); /* Unicode to OEM code conversion */ +DWORD ff_wtoupper (DWORD uni); /* Unicode upper-case conversion */ +#endif +#if FF_USE_LFN == 3 /* Dynamic memory allocation */ +void* ff_memalloc (UINT msize); /* Allocate memory block */ +void ff_memfree (void* mblock); /* Free memory block */ +#endif + +/* Sync functions */ +#if FF_FS_REENTRANT +int ff_cre_syncobj (BYTE vol, FF_SYNC_t* sobj); /* Create a sync object */ +int ff_req_grant (FF_SYNC_t sobj); /* Lock sync object */ +void ff_rel_grant (FF_SYNC_t sobj); /* Unlock sync object */ +int ff_del_syncobj (FF_SYNC_t sobj); /* Delete a sync object */ +#endif + + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access mode and open method flags (3rd argument of f_open) */ +#define FA_READ 0x01 +#define FA_WRITE 0x02 +#define FA_OPEN_EXISTING 0x00 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define FA_OPEN_APPEND 0x30 + +/* Fast seek controls (2nd argument of f_lseek) */ +#define CREATE_LINKMAP ((FSIZE_t)0 - 1) + +/* Format options (2nd argument of f_mkfs) */ +#define FM_FAT 0x01 +#define FM_FAT32 0x02 +#define FM_EXFAT 0x04 +#define FM_ANY 0x07 +#define FM_SFD 0x08 + +/* Filesystem type (FATFS.fs_type) */ +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 +#define FS_EXFAT 4 + +/* File attribute bits for directory entry (FILINFO.fattrib) */ +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ + + +#ifdef __cplusplus +} +#endif + +#endif /* FF_DEFINED */ diff --git b/Utilities/Third_Party/fat_fs/inc/ff_gen_drv.h a/Utilities/Third_Party/fat_fs/inc/ff_gen_drv.h new file mode 100644 index 0000000..786d603 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/inc/ff_gen_drv.h @@ -0,0 +1,84 @@ +/*! + \file ff_gen_drv.h + \brief header for ff_gen_drv.c module + + \version 2021-05-20, V1.0.0, firmware for GD32 USBFS +*/ + +/* + Copyright (c) 2021, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef __FF_GEN_DRV_H +#define __FF_GEN_DRV_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "diskio.h" +#include "ff.h" +#include "stdint.h" + +/* Disk IO Driver structure definition */ +typedef struct +{ + DSTATUS (*disk_initialize) (BYTE); /*!< Initialize Disk Drive */ + DSTATUS (*disk_status) (BYTE); /*!< Get Disk Status */ + DRESULT (*disk_read) (BYTE, BYTE*, DWORD, UINT); /*!< Read Sector(s) */ +#if _USE_WRITE == 1 + DRESULT (*disk_write) (BYTE, const BYTE*, DWORD, UINT); /*!< Write Sector(s) when _USE_WRITE = 0 */ +#endif /* _USE_WRITE == 1 */ +#if _USE_IOCTL == 1 + DRESULT (*disk_ioctl) (BYTE, BYTE, void*); /*!< I/O control operation when _USE_IOCTL = 1 */ +#endif /* _USE_IOCTL == 1 */ + +}Diskio_drvTypeDef; + +/* Global Disk IO Drivers structure definition */ +typedef struct +{ + uint8_t is_initialized[_VOLUMES]; + const Diskio_drvTypeDef *drv[_VOLUMES]; + uint8_t lun[_VOLUMES]; + volatile uint8_t nbr; + +}Disk_drvTypeDef; + + +uint8_t FATFS_LinkDriver(const Diskio_drvTypeDef *drv, char *path); +uint8_t FATFS_UnLinkDriver(char *path); +uint8_t FATFS_LinkDriverEx(const Diskio_drvTypeDef *drv, char *path, BYTE lun); +uint8_t FATFS_UnLinkDriverEx(char *path, BYTE lun); +uint8_t FATFS_GetAttachedDriversNbr(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __FF_GEN_DRV_H */ + diff --git b/Utilities/Third_Party/fat_fs/inc/ffconf.h a/Utilities/Third_Party/fat_fs/inc/ffconf.h new file mode 100644 index 0000000..e7d5ff6 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/inc/ffconf.h @@ -0,0 +1,292 @@ +/*---------------------------------------------------------------------------/ +/ FatFs Functional Configurations +/---------------------------------------------------------------------------*/ + +#define FFCONF_DEF 86604 /* Revision ID */ + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_READONLY 0 +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ + + +#define FF_FS_MINIMIZE 0 +/* This option defines minimization level to remove some basic API functions. +/ +/ 0: Basic functions are fully enabled. +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() +/ are removed. +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. +/ 3: f_lseek() function is removed in addition to 2. */ + + +#define FF_USE_STRFUNC 0 +/* This option switches string functions, f_gets(), f_putc(), f_puts() and f_printf(). +/ +/ 0: Disable string functions. +/ 1: Enable without LF-CRLF conversion. +/ 2: Enable with LF-CRLF conversion. */ + + +#define FF_USE_FIND 0 +/* This option switches filtered directory read functions, f_findfirst() and +/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ + + +#define FF_USE_MKFS 1 +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ + + +#define _USE_FASTSEEK 1 +/* This option switches fast seek function. (0:Disable or 1:Enable) */ + + +#define FF_USE_EXPAND 0 +/* This option switches f_expand function. (0:Disable or 1:Enable) */ + + +#define FF_USE_CHMOD 0 +/* This option switches attribute manipulation functions, f_chmod() and f_utime(). +/ (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */ + + +#define FF_USE_LABEL 0 +/* This option switches volume label functions, f_getlabel() and f_setlabel(). +/ (0:Disable or 1:Enable) */ + + +#define FF_USE_FORWARD 0 +/* This option switches f_forward() function. (0:Disable or 1:Enable) */ + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/---------------------------------------------------------------------------*/ + +#define FF_CODE_PAGE 932 +/* This option specifies the OEM code page to be used on the target system. +/ Incorrect code page setting can cause a file open failure. +/ +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +/ 0 - Include all code pages above and configured by f_setcp() +*/ + + +#define FF_USE_LFN 1 + +#define FF_MAX_LFN 255 +/* The FF_USE_LFN switches the support for LFN (long file name). +/ +/ 0: Disable LFN. FF_MAX_LFN has no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ To enable the LFN, ffunicode.c needs to be added to the project. The LFN function +/ requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and +/ additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled. +/ The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can +/ be in range of 12 to 255. It is recommended to be set 255 to fully support LFN +/ specification. +/ When use stack for the working buffer, take care on stack overflow. When use heap +/ memory for the working buffer, memory management functions, ff_memalloc() and +/ ff_memfree() in ffsystem.c, need to be added to the project. */ + + +#define FF_LFN_UNICODE 0 +/* This option switches the character encoding on the API when LFN is enabled. +/ +/ 0: ANSI/OEM in current CP (TCHAR = char) +/ 1: Unicode in UTF-16 (TCHAR = WCHAR) +/ 2: Unicode in UTF-8 (TCHAR = char) +/ 3: Unicode in UTF-32 (TCHAR = DWORD) +/ +/ Also behavior of string I/O functions will be affected by this option. +/ When LFN is not enabled, this option has no effect. */ + + +#define FF_LFN_BUF 255 +#define FF_SFN_BUF 12 +/* This set of options defines size of file name members in the FILINFO structure +/ which is used to read out directory items. These values should be suffcient for +/ the file names to read. The maximum possible length of the read file name depends +/ on character encoding. When LFN is not enabled, these options have no effect. */ + + +#define FF_STRF_ENCODE 3 +/* When FF_LFN_UNICODE >= 1 with LFN enabled, string I/O functions, f_gets(), +/ f_putc(), f_puts and f_printf() convert the character encoding in it. +/ This option selects assumption of character encoding ON THE FILE to be +/ read/written via those functions. +/ +/ 0: ANSI/OEM in current CP +/ 1: Unicode in UTF-16LE +/ 2: Unicode in UTF-16BE +/ 3: Unicode in UTF-8 +*/ + + +#define FF_FS_RPATH 0 +/* This option configures support for relative path. +/ +/ 0: Disable relative path and remove related functions. +/ 1: Enable relative path. f_chdir() and f_chdrive() are available. +/ 2: f_getcwd() function is available in addition to 1. +*/ + + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ + +#define _VOLUMES 2 + +#define FF_VOLUMES 5 +/* Number of volumes (logical drives) to be used. (1-10) */ + + +#define FF_STR_VOLUME_ID 0 +#define FF_VOLUME_STRS "RAM","NAND","CF","SD","SD2","USB","USB2","USB3" +/* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings. +/ When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive +/ number in the path name. FF_VOLUME_STRS defines the volume ID strings for each +/ logical drives. Number of items must not be less than FF_VOLUMES. Valid +/ characters for the volume ID strings are A-Z, a-z and 0-9, however, they are +/ compared in case-insensitive. If FF_STR_VOLUME_ID >= 1 and FF_VOLUME_STRS is +/ not defined, a user defined volume string table needs to be defined as: +/ +/ const char* VolumeStr[FF_VOLUMES] = {"ram","flash","sd","usb",... +*/ + + +#define FF_MULTI_PARTITION 0 +/* This option switches support for multiple volumes on the physical drive. +/ By default (0), each logical drive number is bound to the same physical drive +/ number and only an FAT volume found on the physical drive will be mounted. +/ When this function is enabled (1), each logical drive number can be bound to +/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() +/ funciton will be available. */ + + +#define FF_MIN_SS 512 +#define FF_MAX_SS 512 + +/* This set of options configures the range of sector size to be supported. (512, +/ 1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and +/ harddisk. But a larger value may be required for on-board flash memory and some +/ type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured +/ for variable sector size mode and disk_ioctl() function needs to implement +/ GET_SECTOR_SIZE command. */ + + +#define FF_USE_TRIM 0 +/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable) +/ To enable Trim function, also CTRL_TRIM command should be implemented to the +/ disk_ioctl() function. */ + + +#define FF_FS_NOFSINFO 0 +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this +/ option, and f_getfree() function at first time after volume mount will force +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. +/ +/ bit0=0: Use free cluster count in the FSINFO if available. +/ bit0=1: Do not trust free cluster count in the FSINFO. +/ bit1=0: Use last allocated cluster number in the FSINFO if available. +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. +*/ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes. +/ Instead of private sector buffer eliminated from the file object, common sector +/ buffer in the filesystem object (FATFS) is used for the file data transfer. */ + + +#define FF_FS_EXFAT 1 +/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable) +/ To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1) +/ Note that enabling exFAT discards ANSI C (C89) compatibility. */ + + +#define FF_FS_NORTC 0 +#define FF_NORTC_MON 1 +#define FF_NORTC_MDAY 1 +#define FF_NORTC_YEAR 2018 +/* The option FF_FS_NORTC switches timestamp functiton. If the system does not have +/ any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable +/ the timestamp function. Every object modified by FatFs will have a fixed timestamp +/ defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time. +/ To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be +/ added to the project to read current time form real-time clock. FF_NORTC_MON, +/ FF_NORTC_MDAY and FF_NORTC_YEAR have no effect. +/ These options have no effect at read-only configuration (FF_FS_READONLY = 1). */ + + +#define FF_FS_LOCK 0 +/* The option FF_FS_LOCK switches file lock function to control duplicated file open +/ and illegal operation to open objects. This option must be 0 when FF_FS_READONLY +/ is 1. +/ +/ 0: Disable file lock function. To avoid volume corruption, application program +/ should avoid illegal open, remove and rename to the open objects. +/ >0: Enable file lock function. The value defines how many files/sub-directories +/ can be opened simultaneously under file lock control. Note that the file +/ lock control is independent of re-entrancy. */ + + +/* #include // O/S definitions */ +#define FF_FS_REENTRANT 0 +#define FF_FS_TIMEOUT 1000 +#define FF_SYNC_t HANDLE +/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs +/ module itself. Note that regardless of this option, file access to different +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() +/ and f_fdisk() function, are always not re-entrant. Only file/directory access +/ to the same volume is under control of this function. +/ +/ 0: Disable re-entrancy. FF_FS_TIMEOUT and FF_SYNC_t have no effect. +/ 1: Enable re-entrancy. Also user provided synchronization handlers, +/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() +/ function, must be added to the project. Samples are available in +/ option/syscall.c. +/ +/ The FF_FS_TIMEOUT defines timeout period in unit of time tick. +/ The FF_SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, +/ SemaphoreHandle_t and etc. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.h. */ + + + +/*--- End of configuration options ---*/ diff --git b/Utilities/Third_Party/fat_fs/inc/integer.h a/Utilities/Third_Party/fat_fs/inc/integer.h new file mode 100644 index 0000000..2741b70 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/inc/integer.h @@ -0,0 +1,46 @@ +/*-------------------------------------------*/ +/* Integer type definitions for FatFs module */ +/*-------------------------------------------*/ + +#ifndef _INTEGER + +#if 0 +#include +#else + +#include "usb_conf.h" + +/* These types must be 16-bit, 32-bit or larger integer */ +typedef int INT; +typedef unsigned int UINT; + +/* These types must be 8-bit integer */ +typedef signed char CHAR; +typedef unsigned char UCHAR; +typedef unsigned char BYTE; + +/* These types must be 16-bit integer */ +typedef short SHORT; +typedef unsigned short USHORT; +typedef unsigned short WORD; +typedef unsigned short WCHAR; + +/* These types must be 32-bit integer */ +typedef long LONG; +typedef unsigned long ULONG; +typedef unsigned long DWORD; + +/* Boolean type */ +// typedef enum { FALSE = 0, TRUE } BOOL; +#include +//typedef bool BOOL; +#ifndef FALSE +#define FALSE false +#define TRUE true +#endif + + +#endif + +#define _INTEGER +#endif diff --git b/Utilities/Third_Party/fat_fs/readme.txt a/Utilities/Third_Party/fat_fs/readme.txt new file mode 100644 index 0000000..689e973 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/readme.txt @@ -0,0 +1,110 @@ +FatFs Module Source Files R0.07e (C)ChaN, 2009 + + +FILES + + ffconf.h Configuration file for FatFs module. + ff.h Common include file for FatFs and application module. + ff.c FatFs module. + diskio.h Common include file for FatFs and disk I/O module. + diskio.c Skeleton of low level disk I/O module. + integer.h Alternative type definitions for integer variables. + option Optional external functions. + + Low level disk I/O module is not included in this archive because the FatFs + module is only a generic file system layer and not depend on any specific + storage device. You have to provide a low level disk I/O module that written + to control your storage device. + + + +AGREEMENTS + + FatFs module is an open source software to implement FAT file system to + small embedded systems. This is a free software and is opened for education, + research and commercial developments under license policy of following trems. + + Copyright (C) 2009, ChaN, all right reserved. + + * The FatFs module is a free software and there is NO WARRANTY. + * No restriction on use. You can use, modify and redistribute it for + personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. + * Redistributions of source code must retain the above copyright notice. + + + +REVISION HISTORY + + Feb 26, 2006 R0.00 Prototype + + Apr 29, 2006 R0.01 First release. + + Jun 01, 2006 R0.02 Added FAT12. + Removed unbuffered mode. + Fixed a problem on small (<32M) patition. + + Jun 10, 2006 R0.02a Added a configuration option _FS_MINIMUM. + + Sep 22, 2006 R0.03 Added f_rename. + Changed option _FS_MINIMUM to _FS_MINIMIZE. + + Dec 11, 2006 R0.03a Improved cluster scan algolithm to write files fast. + Fixed f_mkdir creates incorrect directory on FAT32. + + Feb 04, 2007 R0.04 Supported multiple drive system. (FatFs) + Changed some APIs for multiple drive system. + Added f_mkfs. (FatFs) + Added _USE_FAT32 option. (Tiny-FatFs) + + Apr 01, 2007 R0.04a Supported multiple partitions on a plysical drive. (FatFs) + Fixed an endian sensitive code in f_mkfs. (FatFs) + Added a capability of extending the file size to f_lseek. + Added minimization level 3. + Fixed a problem that can collapse a sector when recreate an + existing file in any sub-directory at non FAT32 cfg. (Tiny-FatFs) + + May 05, 2007 R0.04b Added _USE_NTFLAG option. + Added FSInfo support. + Fixed some problems corresponds to FAT32. (Tiny-FatFs) + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (0 < ofs <= csize) collapses the file object. + + Aug 25, 2007 R0.05 Changed arguments of f_read, f_write. + Changed arguments of f_mkfs. (FatFs) + Fixed f_mkfs on FAT32 creates incorrect FSInfo. (FatFs) + Fixed f_mkdir on FAT32 creates incorrect directory. (FatFs) + + Feb 03, 2008 R0.05a Added f_truncate(). + Added f_utime(). + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read() can be mistruncated. + Fixed cached sector is not flushed when create and close without write. + + Apr 01, 2008 R0.06 Added f_forward(). (Tiny-FatFs) + Added string functions: fputc(), fputs(), fprintf() and fgets(). + Improved performance of f_lseek() on move to the same or following cluster. + + Apr 01, 2009, R0.07 Merged Tiny-FatFs as a buffer configuration option. + Added long file name support. + Added multiple code page support. + Added re-entrancy for multitask operation. + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + + Apr 14, 2009, R0.07a Separated out OS dependent code on reentrant cfg. + Added multiple sector size support. + + Jun 21, 2009, R0.07c Fixed f_unlink() may return FR_OK on error. + Fixed wrong cache control in f_lseek(). + Added relative path feature. + Added f_chdir(). + Added f_chdrive(). + Added proper case conversion for extended characters. + + Nov 03,'2009 R0.07e Separated out configuration options from ff.h to ffconf.h. + Added a configuration option, _LFN_UNICODE. + Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. + Fixed name matching error on the 13 char boundary. + Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. diff --git b/Utilities/Third_Party/fat_fs/src/diskio.c a/Utilities/Third_Party/fat_fs/src/diskio.c new file mode 100644 index 0000000..05a47b7 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/src/diskio.c @@ -0,0 +1,164 @@ +/*! + \file diskio.c + \brief Low level disk interface driver + + \version 2021-05-20, V1.0.0, firmware for GD32 USBFS +*/ + +/* + Copyright (c) 2021, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* Includes ------------------------------------------------------------------*/ +#include "diskio.h" +#include "ff_gen_drv.h" + +#if defined ( __GNUC__ ) +#ifndef __weak +#define __weak __attribute__((weak)) +#endif +#endif + +extern Disk_drvTypeDef disk; + +/*! + \brief Gets Disk Status + \param[in] pdrv: Physical drive number (0..) + \param[out] none + \retval DSTATUS: Operation status +*/ +DSTATUS disk_status ( + BYTE pdrv /* Physical drive number to identify the drive */ +) +{ + DSTATUS stat; + + stat = disk.drv[pdrv]->disk_status(disk.lun[pdrv]); + + return stat; +} + +/*! + \brief Initializes a Drive + \param[in] pdrv: Physical drive number (0..) + \param[out] none + \retval DSTATUS: Operation status +*/ +DSTATUS disk_initialize ( + BYTE pdrv /* Physical drive nmuber to identify the drive */ +) +{ + DSTATUS stat = RES_OK; + + if (disk.is_initialized[pdrv] == 0) { + disk.is_initialized[pdrv] = 1; + stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]); + } + + return stat; +} + +/*! + \brief Reads Sector(s) + \param[in] pdrv: Physical drive number (0..) + \param[in] buff: Data buffer to store read data + \param[in] sector: Sector address (LBA) + \param[in] count: Number of sectors to write (1..128) + \param[out] none + \retval DRESULT: Operation result +*/ +DRESULT disk_read ( + BYTE pdrv, /* Physical drive nmuber to identify the drive */ + BYTE *buff, /* Data buffer to store read data */ + DWORD sector, /* Sector address in LBA */ + UINT count /* Number of sectors to read */ +) +{ + DRESULT res; + + res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count); + + return res; +} + +/*! + \brief Writes Sector(s) + \param[in] pdrv: Physical drive number (0..) + \param[in] buff: Data to be written + \param[in] sector: Sector address (LBA) + \param[in] count: Number of sectors to write (1..128) + \param[out] none + \retval DRESULT: Operation result +*/ +#if _USE_WRITE == 1 +DRESULT disk_write ( + BYTE pdrv, /* Physical drive nmuber to identify the drive */ + const BYTE *buff, /* Data to be written */ + DWORD sector, /* Sector address in LBA */ + UINT count /* Number of sectors to write */ +) +{ + DRESULT res; + + res = disk.drv[pdrv]->disk_write(disk.lun[pdrv], buff, sector, count); + + return res; +} +#endif /* _USE_WRITE == 1 */ + +/*! + \brief I/O control operation + \param[in] pdrv: Physical drive number (0..) + \param[in] cmd: Control code + \param[in] buff: Buffer to send/receive control data + \param[out] none + \retval DRESULT: Operation result +*/ +#if _USE_IOCTL == 1 +DRESULT disk_ioctl ( + BYTE pdrv, /* Physical drive nmuber (0..) */ + BYTE cmd, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + + res = disk.drv[pdrv]->disk_ioctl(disk.lun[pdrv], cmd, buff); + + return res; +} +#endif /* _USE_IOCTL == 1 */ + +/*! + \brief Gets Time from RTC + \param[in] none + \param[out] none + \retval Time in DWORD +*/ +__weak DWORD get_fattime (void) +{ + return 0; +} diff --git b/Utilities/Third_Party/fat_fs/src/fattime.c a/Utilities/Third_Party/fat_fs/src/fattime.c new file mode 100644 index 0000000..2e16b4a --- /dev/null +++ a/Utilities/Third_Party/fat_fs/src/fattime.c @@ -0,0 +1,11 @@ + + +#include "integer.h" +#include "fattime.h" +//#include "rtc.h" //RPi + +DWORD get_fattime (void) +{ + return 0; +} + diff --git b/Utilities/Third_Party/fat_fs/src/ff.c a/Utilities/Third_Party/fat_fs/src/ff.c new file mode 100644 index 0000000..290f577 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/src/ff.c @@ -0,0 +1,6554 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem Module R0.13c / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2018, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/ +/----------------------------------------------------------------------------*/ + + +#include "ff.h" /* Declarations of FatFs API */ +#include "diskio.h" /* Declarations of device I/O functions */ + + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if FF_DEFINED != 86604 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + + +/* Limits and boundaries */ +#define MAX_DIR 0x200000 /* Max size of FAT directory */ +#define MAX_DIR_EX 0x10000000 /* Max size of exFAT directory */ +#define MAX_FAT12 0xFF5 /* Max FAT12 clusters (differs from specs, but right for real DOS/Windows behavior) */ +#define MAX_FAT16 0xFFF5 /* Max FAT16 clusters (differs from specs, but right for real DOS/Windows behavior) */ +#define MAX_FAT32 0x0FFFFFF5 /* Max FAT32 clusters (not specified, practical limit) */ +#define MAX_EXFAT 0x7FFFFFFD /* Max exFAT clusters (differs from specs, implementation limit) */ + + +/* Character code support macros */ +#define IsUpper(c) ((c) >= 'A' && (c) <= 'Z') +#define IsLower(c) ((c) >= 'a' && (c) <= 'z') +#define IsDigit(c) ((c) >= '0' && (c) <= '9') +#define IsSurrogate(c) ((c) >= 0xD800 && (c) <= 0xDFFF) +#define IsSurrogateH(c) ((c) >= 0xD800 && (c) <= 0xDBFF) +#define IsSurrogateL(c) ((c) >= 0xDC00 && (c) <= 0xDFFF) + + +/* Additional file access control and file status flags for internal use */ +#define FA_SEEKEND 0x20 /* Seek to end of the file on file open */ +#define FA_MODIFIED 0x40 /* File has been modified */ +#define FA_DIRTY 0x80 /* FIL.buf[] needs to be written-back */ + + +/* Additional file attribute bits for internal use */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_MASK 0x3F /* Mask of defined bits */ + + +/* Name status flags in fn[11] */ +#define NSFLAG 11 /* Index of the name status byte */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ +#define NS_NOLFN 0x40 /* Do not find LFN */ +#define NS_NONAME 0x80 /* Not followed */ + + +/* exFAT directory entry types */ +#define ET_BITMAP 0x81 /* Allocation bitmap */ +#define ET_UPCASE 0x82 /* Up-case table */ +#define ET_VLABEL 0x83 /* Volume label */ +#define ET_FILEDIR 0x85 /* File and directory */ +#define ET_STREAM 0xC0 /* Stream extension */ +#define ET_FILENAME 0xC1 /* Name extension */ + + +/* FatFs refers the FAT structure as simple byte array instead of structure member +/ because the C structure is not binary compatible between different platforms */ + +#define BS_JmpBoot 0 /* x86 jump instruction (3-byte) */ +#define BS_OEMName 3 /* OEM name (8-byte) */ +#define BPB_BytsPerSec 11 /* Sector size [byte] (WORD) */ +#define BPB_SecPerClus 13 /* Cluster size [sector] (BYTE) */ +#define BPB_RsvdSecCnt 14 /* Size of reserved area [sector] (WORD) */ +#define BPB_NumFATs 16 /* Number of FATs (BYTE) */ +#define BPB_RootEntCnt 17 /* Size of root directory area for FAT [entry] (WORD) */ +#define BPB_TotSec16 19 /* Volume size (16-bit) [sector] (WORD) */ +#define BPB_Media 21 /* Media descriptor byte (BYTE) */ +#define BPB_FATSz16 22 /* FAT size (16-bit) [sector] (WORD) */ +#define BPB_SecPerTrk 24 /* Number of sectors per track for int13h [sector] (WORD) */ +#define BPB_NumHeads 26 /* Number of heads for int13h (WORD) */ +#define BPB_HiddSec 28 /* Volume offset from top of the drive (DWORD) */ +#define BPB_TotSec32 32 /* Volume size (32-bit) [sector] (DWORD) */ +#define BS_DrvNum 36 /* Physical drive number for int13h (BYTE) */ +#define BS_NTres 37 /* WindowsNT error flag (BYTE) */ +#define BS_BootSig 38 /* Extended boot signature (BYTE) */ +#define BS_VolID 39 /* Volume serial number (DWORD) */ +#define BS_VolLab 43 /* Volume label string (8-byte) */ +#define BS_FilSysType 54 /* Filesystem type string (8-byte) */ +#define BS_BootCode 62 /* Boot code (448-byte) */ +#define BS_55AA 510 /* Signature word (WORD) */ + +#define BPB_FATSz32 36 /* FAT32: FAT size [sector] (DWORD) */ +#define BPB_ExtFlags32 40 /* FAT32: Extended flags (WORD) */ +#define BPB_FSVer32 42 /* FAT32: Filesystem version (WORD) */ +#define BPB_RootClus32 44 /* FAT32: Root directory cluster (DWORD) */ +#define BPB_FSInfo32 48 /* FAT32: Offset of FSINFO sector (WORD) */ +#define BPB_BkBootSec32 50 /* FAT32: Offset of backup boot sector (WORD) */ +#define BS_DrvNum32 64 /* FAT32: Physical drive number for int13h (BYTE) */ +#define BS_NTres32 65 /* FAT32: Error flag (BYTE) */ +#define BS_BootSig32 66 /* FAT32: Extended boot signature (BYTE) */ +#define BS_VolID32 67 /* FAT32: Volume serial number (DWORD) */ +#define BS_VolLab32 71 /* FAT32: Volume label string (8-byte) */ +#define BS_FilSysType32 82 /* FAT32: Filesystem type string (8-byte) */ +#define BS_BootCode32 90 /* FAT32: Boot code (420-byte) */ + +#define BPB_ZeroedEx 11 /* exFAT: MBZ field (53-byte) */ +#define BPB_VolOfsEx 64 /* exFAT: Volume offset from top of the drive [sector] (QWORD) */ +#define BPB_TotSecEx 72 /* exFAT: Volume size [sector] (QWORD) */ +#define BPB_FatOfsEx 80 /* exFAT: FAT offset from top of the volume [sector] (DWORD) */ +#define BPB_FatSzEx 84 /* exFAT: FAT size [sector] (DWORD) */ +#define BPB_DataOfsEx 88 /* exFAT: Data offset from top of the volume [sector] (DWORD) */ +#define BPB_NumClusEx 92 /* exFAT: Number of clusters (DWORD) */ +#define BPB_RootClusEx 96 /* exFAT: Root directory start cluster (DWORD) */ +#define BPB_VolIDEx 100 /* exFAT: Volume serial number (DWORD) */ +#define BPB_FSVerEx 104 /* exFAT: Filesystem version (WORD) */ +#define BPB_VolFlagEx 106 /* exFAT: Volume flags (WORD) */ +#define BPB_BytsPerSecEx 108 /* exFAT: Log2 of sector size in unit of byte (BYTE) */ +#define BPB_SecPerClusEx 109 /* exFAT: Log2 of cluster size in unit of sector (BYTE) */ +#define BPB_NumFATsEx 110 /* exFAT: Number of FATs (BYTE) */ +#define BPB_DrvNumEx 111 /* exFAT: Physical drive number for int13h (BYTE) */ +#define BPB_PercInUseEx 112 /* exFAT: Percent in use (BYTE) */ +#define BPB_RsvdEx 113 /* exFAT: Reserved (7-byte) */ +#define BS_BootCodeEx 120 /* exFAT: Boot code (390-byte) */ + +#define DIR_Name 0 /* Short file name (11-byte) */ +#define DIR_Attr 11 /* Attribute (BYTE) */ +#define DIR_NTres 12 /* Lower case flag (BYTE) */ +#define DIR_CrtTime10 13 /* Created time sub-second (BYTE) */ +#define DIR_CrtTime 14 /* Created time (DWORD) */ +#define DIR_LstAccDate 18 /* Last accessed date (WORD) */ +#define DIR_FstClusHI 20 /* Higher 16-bit of first cluster (WORD) */ +#define DIR_ModTime 22 /* Modified time (DWORD) */ +#define DIR_FstClusLO 26 /* Lower 16-bit of first cluster (WORD) */ +#define DIR_FileSize 28 /* File size (DWORD) */ +#define LDIR_Ord 0 /* LFN: LFN order and LLE flag (BYTE) */ +#define LDIR_Attr 11 /* LFN: LFN attribute (BYTE) */ +#define LDIR_Type 12 /* LFN: Entry type (BYTE) */ +#define LDIR_Chksum 13 /* LFN: Checksum of the SFN (BYTE) */ +#define LDIR_FstClusLO 26 /* LFN: MBZ field (WORD) */ +#define XDIR_Type 0 /* exFAT: Type of exFAT directory entry (BYTE) */ +#define XDIR_NumLabel 1 /* exFAT: Number of volume label characters (BYTE) */ +#define XDIR_Label 2 /* exFAT: Volume label (11-WORD) */ +#define XDIR_CaseSum 4 /* exFAT: Sum of case conversion table (DWORD) */ +#define XDIR_NumSec 1 /* exFAT: Number of secondary entries (BYTE) */ +#define XDIR_SetSum 2 /* exFAT: Sum of the set of directory entries (WORD) */ +#define XDIR_Attr 4 /* exFAT: File attribute (WORD) */ +#define XDIR_CrtTime 8 /* exFAT: Created time (DWORD) */ +#define XDIR_ModTime 12 /* exFAT: Modified time (DWORD) */ +#define XDIR_AccTime 16 /* exFAT: Last accessed time (DWORD) */ +#define XDIR_CrtTime10 20 /* exFAT: Created time subsecond (BYTE) */ +#define XDIR_ModTime10 21 /* exFAT: Modified time subsecond (BYTE) */ +#define XDIR_CrtTZ 22 /* exFAT: Created timezone (BYTE) */ +#define XDIR_ModTZ 23 /* exFAT: Modified timezone (BYTE) */ +#define XDIR_AccTZ 24 /* exFAT: Last accessed timezone (BYTE) */ +#define XDIR_GenFlags 33 /* exFAT: General secondary flags (BYTE) */ +#define XDIR_NumName 35 /* exFAT: Number of file name characters (BYTE) */ +#define XDIR_NameHash 36 /* exFAT: Hash of file name (WORD) */ +#define XDIR_ValidFileSize 40 /* exFAT: Valid file size (QWORD) */ +#define XDIR_FstClus 52 /* exFAT: First cluster of the file data (DWORD) */ +#define XDIR_FileSize 56 /* exFAT: File/Directory size (QWORD) */ + +#define SZDIRE 32 /* Size of a directory entry */ +#define DDEM 0xE5 /* Deleted directory entry mark set to DIR_Name[0] */ +#define RDDEM 0x05 /* Replacement of the character collides with DDEM */ +#define LLEF 0x40 /* Last long entry flag in LDIR_Ord */ + +#define FSI_LeadSig 0 /* FAT32 FSI: Leading signature (DWORD) */ +#define FSI_StrucSig 484 /* FAT32 FSI: Structure signature (DWORD) */ +#define FSI_Free_Count 488 /* FAT32 FSI: Number of free clusters (DWORD) */ +#define FSI_Nxt_Free 492 /* FAT32 FSI: Last allocated cluster (DWORD) */ + +#define MBR_Table 446 /* MBR: Offset of partition table in the MBR */ +#define SZ_PTE 16 /* MBR: Size of a partition table entry */ +#define PTE_Boot 0 /* MBR PTE: Boot indicator */ +#define PTE_StHead 1 /* MBR PTE: Start head */ +#define PTE_StSec 2 /* MBR PTE: Start sector */ +#define PTE_StCyl 3 /* MBR PTE: Start cylinder */ +#define PTE_System 4 /* MBR PTE: System ID */ +#define PTE_EdHead 5 /* MBR PTE: End head */ +#define PTE_EdSec 6 /* MBR PTE: End sector */ +#define PTE_EdCyl 7 /* MBR PTE: End cylinder */ +#define PTE_StLba 8 /* MBR PTE: Start in LBA */ +#define PTE_SizLba 12 /* MBR PTE: Size in LBA */ + + +/* Post process on fatal error in the file operations */ +#define ABORT(fs, res) { fp->err = (BYTE)(res); LEAVE_FF(fs, res); } + + +/* Re-entrancy related */ +#if FF_FS_REENTRANT +#if FF_USE_LFN == 1 +#error Static LFN work area cannot be used at thread-safe configuration +#endif +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } +#else +#define LEAVE_FF(fs, res) return res +#endif + + +/* Definitions of volume - physical location conversion */ +#if FF_MULTI_PARTITION +#define LD2PD(vol) VolToPart[vol].pd /* Get physical drive number */ +#define LD2PT(vol) VolToPart[vol].pt /* Get partition index */ +#else +#define LD2PD(vol) (BYTE)(vol) /* Each logical drive is bound to the same physical drive number */ +#define LD2PT(vol) 0 /* Find first valid partition or in SFD */ +#endif + + +/* Definitions of sector size */ +#if (FF_MAX_SS < FF_MIN_SS) || (FF_MAX_SS != 512 && FF_MAX_SS != 1024 && FF_MAX_SS != 2048 && FF_MAX_SS != 4096) || (FF_MIN_SS != 512 && FF_MIN_SS != 1024 && FF_MIN_SS != 2048 && FF_MIN_SS != 4096) +#error Wrong sector size configuration +#endif +#if FF_MAX_SS == FF_MIN_SS +#define SS(fs) ((UINT)FF_MAX_SS) /* Fixed sector size */ +#else +#define SS(fs) ((fs)->ssize) /* Variable sector size */ +#endif + + +/* Timestamp */ +#if FF_FS_NORTC == 1 +#if FF_NORTC_YEAR < 1980 || FF_NORTC_YEAR > 2107 || FF_NORTC_MON < 1 || FF_NORTC_MON > 12 || FF_NORTC_MDAY < 1 || FF_NORTC_MDAY > 31 +#error Invalid FF_FS_NORTC settings +#endif +#define GET_FATTIME() ((DWORD)(FF_NORTC_YEAR - 1980) << 25 | (DWORD)FF_NORTC_MON << 21 | (DWORD)FF_NORTC_MDAY << 16) +#else +#define GET_FATTIME() get_fattime() +#endif + + +/* File lock controls */ +#if FF_FS_LOCK != 0 +#if FF_FS_READONLY +#error FF_FS_LOCK must be 0 at read-only configuration +#endif +typedef struct { + FATFS *fs; /* Object ID 1, volume (NULL:blank entry) */ + DWORD clu; /* Object ID 2, containing directory (0:root) */ + DWORD ofs; /* Object ID 3, offset in the directory */ + WORD ctr; /* Object open counter, 0:none, 0x01..0xFF:read mode open count, 0x100:write mode */ +} FILESEM; +#endif + + +/* SBCS up-case tables (\x80-\xFF) */ +#define TBL_CT437 {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT720 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT737 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xEF,0xF5,0xF0,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT771 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC,0xDE,0xDE, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFE,0xFF} +#define TBL_CT775 {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT850 {0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41, \ + 0x45,0x92,0x92,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x4F,0x9C,0x4F,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0x41,0x41,0x41,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0x41,0x41,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0x45,0x45,0x45,0x49,0x49,0x49,0x49,0xD9,0xDA,0xDB,0xDC,0xDD,0x49,0xDF, \ + 0x4F,0xE1,0x4F,0x4F,0x4F,0x4F,0xE6,0xE8,0xE8,0x55,0x55,0x55,0x59,0x59,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT852 {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0xAC, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} +#define TBL_CT855 {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F, \ + 0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF, \ + 0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT857 {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0x49,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT860 {0x80,0x9A,0x90,0x8F,0x8E,0x91,0x86,0x80,0x89,0x89,0x92,0x8B,0x8C,0x98,0x8E,0x8F, \ + 0x90,0x91,0x92,0x8C,0x99,0xA9,0x96,0x9D,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x86,0x8B,0x9F,0x96,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT861 {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x8B,0x8B,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x8D,0x55,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA4,0xA5,0xA6,0xA7,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT862 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT863 {0x43,0x55,0x45,0x41,0x41,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x41,0x8F, \ + 0x45,0x45,0x45,0x4F,0x45,0x49,0x55,0x55,0x98,0x4F,0x55,0x9B,0x9C,0x55,0x55,0x9F, \ + 0xA0,0xA1,0x4F,0x55,0xA4,0xA5,0xA6,0xA7,0x49,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT864 {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT865 {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT866 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define TBL_CT869 {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x86,0x9C,0x8D,0x8F,0x90, \ + 0x91,0x90,0x92,0x95,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xA4,0xA5,0xA6,0xD9,0xDA,0xDB,0xDC,0xA7,0xA8,0xDF, \ + 0xA9,0xAA,0xAC,0xAD,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xCF,0xCF,0xD0,0xEF, \ + 0xF0,0xF1,0xD1,0xD2,0xD3,0xF5,0xD4,0xF7,0xF8,0xF9,0xD5,0x96,0x95,0x98,0xFE,0xFF} + + +/* DBCS code range |----- 1st byte -----| |----------- 2nd byte -----------| */ +#define TBL_DC932 {0x81, 0x9F, 0xE0, 0xFC, 0x40, 0x7E, 0x80, 0xFC, 0x00, 0x00} +#define TBL_DC936 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0x80, 0xFE, 0x00, 0x00} +#define TBL_DC949 {0x81, 0xFE, 0x00, 0x00, 0x41, 0x5A, 0x61, 0x7A, 0x81, 0xFE} +#define TBL_DC950 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0xA1, 0xFE, 0x00, 0x00} + + +/* Macros for table definitions */ +#define MERGE_2STR(a, b) a ## b +#define MKCVTBL(hd, cp) MERGE_2STR(hd, cp) + + + + +/*-------------------------------------------------------------------------- + + Module Private Work Area + +---------------------------------------------------------------------------*/ +/* Remark: Variables defined here without initial value shall be guaranteed +/ zero/null at start-up. If not, the linker option or start-up routine is +/ not compliance with C standard. */ + +/*--------------------------------*/ +/* File/Volume controls */ +/*--------------------------------*/ + +#if FF_VOLUMES < 1 || FF_VOLUMES > 10 +#error Wrong FF_VOLUMES setting +#endif +static FATFS* FatFs[FF_VOLUMES]; /* Pointer to the filesystem objects (logical drives) */ +static WORD Fsid; /* Filesystem mount ID */ + +#if FF_FS_RPATH != 0 +static BYTE CurrVol; /* Current drive */ +#endif + +#if FF_FS_LOCK != 0 +static FILESEM Files[FF_FS_LOCK]; /* Open object lock semaphores */ +#endif + +#if FF_STR_VOLUME_ID +#ifdef FF_VOLUME_STRS +static const char* const VolumeStr[FF_VOLUMES] = {FF_VOLUME_STRS}; /* Pre-defined volume ID */ +#endif +#endif + + +/*--------------------------------*/ +/* LFN/Directory working buffer */ +/*--------------------------------*/ + +#if FF_USE_LFN == 0 /* Non-LFN configuration */ +#if FF_FS_EXFAT +#error LFN must be enabled when enable exFAT +#endif +#define DEF_NAMBUF +#define INIT_NAMBUF(fs) +#define FREE_NAMBUF() +#define LEAVE_MKFS(res) return res + +#else /* LFN configurations */ +#if FF_MAX_LFN < 12 || FF_MAX_LFN > 255 +#error Wrong setting of FF_MAX_LFN +#endif +#if FF_LFN_BUF < FF_SFN_BUF || FF_SFN_BUF < 12 +#error Wrong setting of FF_LFN_BUF or FF_SFN_BUF +#endif +#if FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3 +#error Wrong setting of FF_LFN_UNICODE +#endif +static const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* FAT: Offset of LFN characters in the directory entry */ +#define MAXDIRB(nc) ((nc + 44U) / 15 * SZDIRE) /* exFAT: Size of directory entry block scratchpad buffer needed for the name length */ + +#if FF_USE_LFN == 1 /* LFN enabled with static working buffer */ +#if FF_FS_EXFAT +static BYTE DirBuf[MAXDIRB(FF_MAX_LFN)]; /* Directory entry block scratchpad buffer */ +#endif +static WCHAR LfnBuf[FF_MAX_LFN + 1]; /* LFN working buffer */ +#define DEF_NAMBUF +#define INIT_NAMBUF(fs) +#define FREE_NAMBUF() +#define LEAVE_MKFS(res) return res + +#elif FF_USE_LFN == 2 /* LFN enabled with dynamic working buffer on the stack */ +#if FF_FS_EXFAT +#define DEF_NAMBUF WCHAR lbuf[FF_MAX_LFN+1]; BYTE dbuf[MAXDIRB(FF_MAX_LFN)]; /* LFN working buffer and directory entry block scratchpad buffer */ +#define INIT_NAMBUF(fs) { (fs)->lfnbuf = lbuf; (fs)->dirbuf = dbuf; } +#define FREE_NAMBUF() +#else +#define DEF_NAMBUF WCHAR lbuf[FF_MAX_LFN+1]; /* LFN working buffer */ +#define INIT_NAMBUF(fs) { (fs)->lfnbuf = lbuf; } +#define FREE_NAMBUF() +#endif +#define LEAVE_MKFS(res) return res + +#elif FF_USE_LFN == 3 /* LFN enabled with dynamic working buffer on the heap */ +#if FF_FS_EXFAT +#define DEF_NAMBUF WCHAR *lfn; /* Pointer to LFN working buffer and directory entry block scratchpad buffer */ +#define INIT_NAMBUF(fs) { lfn = ff_memalloc((FF_MAX_LFN+1)*2 + MAXDIRB(FF_MAX_LFN)); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; (fs)->dirbuf = (BYTE*)(lfn+FF_MAX_LFN+1); } +#define FREE_NAMBUF() ff_memfree(lfn) +#else +#define DEF_NAMBUF WCHAR *lfn; /* Pointer to LFN working buffer */ +#define INIT_NAMBUF(fs) { lfn = ff_memalloc((FF_MAX_LFN+1)*2); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; } +#define FREE_NAMBUF() ff_memfree(lfn) +#endif +#define LEAVE_MKFS(res) { if (!work) ff_memfree(buf); return res; } +#define MAX_MALLOC 0x8000 /* Must be >=FF_MAX_SS */ + +#else +#error Wrong setting of FF_USE_LFN + +#endif /* FF_USE_LFN == 1 */ +#endif /* FF_USE_LFN == 0 */ + + + +/*--------------------------------*/ +/* Code conversion tables */ +/*--------------------------------*/ + +#if FF_CODE_PAGE == 0 /* Run-time code page configuration */ +#define CODEPAGE CodePage +static WORD CodePage; /* Current code page */ +static const BYTE *ExCvt, *DbcTbl; /* Pointer to current SBCS up-case table and DBCS code range table below */ + +static const BYTE Ct437[] = TBL_CT437; +static const BYTE Ct720[] = TBL_CT720; +static const BYTE Ct737[] = TBL_CT737; +static const BYTE Ct771[] = TBL_CT771; +static const BYTE Ct775[] = TBL_CT775; +static const BYTE Ct850[] = TBL_CT850; +static const BYTE Ct852[] = TBL_CT852; +static const BYTE Ct855[] = TBL_CT855; +static const BYTE Ct857[] = TBL_CT857; +static const BYTE Ct860[] = TBL_CT860; +static const BYTE Ct861[] = TBL_CT861; +static const BYTE Ct862[] = TBL_CT862; +static const BYTE Ct863[] = TBL_CT863; +static const BYTE Ct864[] = TBL_CT864; +static const BYTE Ct865[] = TBL_CT865; +static const BYTE Ct866[] = TBL_CT866; +static const BYTE Ct869[] = TBL_CT869; +static const BYTE Dc932[] = TBL_DC932; +static const BYTE Dc936[] = TBL_DC936; +static const BYTE Dc949[] = TBL_DC949; +static const BYTE Dc950[] = TBL_DC950; + +#elif FF_CODE_PAGE < 900 /* Static code page configuration (SBCS) */ +#define CODEPAGE FF_CODE_PAGE +static const BYTE ExCvt[] = MKCVTBL(TBL_CT, FF_CODE_PAGE); + +#else /* Static code page configuration (DBCS) */ +#define CODEPAGE FF_CODE_PAGE +static const BYTE DbcTbl[] = MKCVTBL(TBL_DC, FF_CODE_PAGE); + +#endif + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Load/Store multi-byte word in the FAT structure */ +/*-----------------------------------------------------------------------*/ + +static WORD ld_word (const BYTE* ptr) /* Load a 2-byte little-endian word */ +{ + WORD rv; + + rv = ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +static DWORD ld_dword (const BYTE* ptr) /* Load a 4-byte little-endian word */ +{ + DWORD rv; + + rv = ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +#if FF_FS_EXFAT +static QWORD ld_qword (const BYTE* ptr) /* Load an 8-byte little-endian word */ +{ + QWORD rv; + + rv = ptr[7]; + rv = rv << 8 | ptr[6]; + rv = rv << 8 | ptr[5]; + rv = rv << 8 | ptr[4]; + rv = rv << 8 | ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} +#endif + +#if !FF_FS_READONLY +static void st_word (BYTE* ptr, WORD val) /* Store a 2-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +static void st_dword (BYTE* ptr, DWORD val) /* Store a 4-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} + +#if FF_FS_EXFAT +static void st_qword (BYTE* ptr, QWORD val) /* Store an 8-byte word in little-endian */ +{ + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; val >>= 8; + *ptr++ = (BYTE)val; +} +#endif +#endif /* !FF_FS_READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static void mem_cpy (void* dst, const void* src, UINT cnt) +{ + BYTE *d = (BYTE*)dst; + const BYTE *s = (const BYTE*)src; + + if (cnt != 0) { + do { + *d++ = *s++; + } while (--cnt); + } +} + + +/* Fill memory block */ +static void mem_set (void* dst, int val, UINT cnt) +{ + BYTE *d = (BYTE*)dst; + + do { + *d++ = (BYTE)val; + } while (--cnt); +} + + +/* Compare memory block */ +static int mem_cmp (const void* dst, const void* src, UINT cnt) /* ZR:same, NZ:different */ +{ + const BYTE *d = (const BYTE *)dst, *s = (const BYTE *)src; + int r = 0; + + do { + r = *d++ - *s++; + } while (--cnt && r == 0); + + return r; +} + + +/* Check if chr is contained in the string */ +static int chk_chr (const char* str, int chr) /* NZ:contained, ZR:not contained */ +{ + while (*str && *str != chr) str++; + return *str; +} + + +/* Test if the character is DBC 1st byte */ +static int dbc_1st (BYTE c) +{ +#if FF_CODE_PAGE == 0 /* Variable code page */ + if (DbcTbl && c >= DbcTbl[0]) { + if (c <= DbcTbl[1]) return 1; /* 1st byte range 1 */ + if (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1; /* 1st byte range 2 */ + } +#elif FF_CODE_PAGE >= 900 /* DBCS fixed code page */ + if (c >= DbcTbl[0]) { + if (c <= DbcTbl[1]) return 1; + if (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1; + } +#else /* SBCS fixed code page */ + if (c != 0) return 0; /* Always false */ +#endif + return 0; +} + + +/* Test if the character is DBC 2nd byte */ +static int dbc_2nd (BYTE c) +{ +#if FF_CODE_PAGE == 0 /* Variable code page */ + if (DbcTbl && c >= DbcTbl[4]) { + if (c <= DbcTbl[5]) return 1; /* 2nd byte range 1 */ + if (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1; /* 2nd byte range 2 */ + if (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1; /* 2nd byte range 3 */ + } +#elif FF_CODE_PAGE >= 900 /* DBCS fixed code page */ + if (c >= DbcTbl[4]) { + if (c <= DbcTbl[5]) return 1; + if (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1; + if (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1; + } +#else /* SBCS fixed code page */ + if (c != 0) return 0; /* Always false */ +#endif + return 0; +} + + +#if FF_USE_LFN + +/* Get a character from TCHAR string in defined API encodeing */ +static DWORD tchar2uni ( /* Returns character in UTF-16 encoding (>=0x10000 on double encoding unit, 0xFFFFFFFF on decode error) */ + const TCHAR** str /* Pointer to pointer to TCHAR string in configured encoding */ +) +{ + DWORD uc; + const TCHAR *p = *str; + +#if FF_LFN_UNICODE == 1 /* UTF-16 input */ + WCHAR wc; + + uc = *p++; /* Get a unit */ + if (IsSurrogate(uc)) { /* Surrogate? */ + wc = *p++; /* Get low surrogate */ + if (!IsSurrogateH(uc) || !IsSurrogateL(wc)) return 0xFFFFFFFF; /* Wrong surrogate? */ + uc = uc << 16 | wc; + } + +#elif FF_LFN_UNICODE == 2 /* UTF-8 input */ + BYTE b; + int nf; + + uc = (BYTE)*p++; /* Get a unit */ + if (uc & 0x80) { /* Multiple byte code? */ + if ((uc & 0xE0) == 0xC0) { /* 2-byte sequence? */ + uc &= 0x1F; nf = 1; + } else { + if ((uc & 0xF0) == 0xE0) { /* 3-byte sequence? */ + uc &= 0x0F; nf = 2; + } else { + if ((uc & 0xF8) == 0xF0) { /* 4-byte sequence? */ + uc &= 0x07; nf = 3; + } else { /* Wrong sequence */ + return 0xFFFFFFFF; + } + } + } + do { /* Get trailing bytes */ + b = (BYTE)*p++; + if ((b & 0xC0) != 0x80) return 0xFFFFFFFF; /* Wrong sequence? */ + uc = uc << 6 | (b & 0x3F); + } while (--nf != 0); + if (uc < 0x80 || IsSurrogate(uc) || uc >= 0x110000) return 0xFFFFFFFF; /* Wrong code? */ + if (uc >= 0x010000) uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF); /* Make a surrogate pair if needed */ + } + +#elif FF_LFN_UNICODE == 3 /* UTF-32 input */ + uc = (TCHAR)*p++; /* Get a unit */ + if (uc >= 0x110000) return 0xFFFFFFFF; /* Wrong code? */ + if (uc >= 0x010000) uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF); /* Make a surrogate pair if needed */ + +#else /* ANSI/OEM input */ + BYTE b; + WCHAR wc; + + wc = (BYTE)*p++; /* Get a byte */ + if (dbc_1st((BYTE)wc)) { /* Is it a DBC 1st byte? */ + b = (BYTE)*p++; /* Get 2nd byte */ + if (!dbc_2nd(b)) return 0xFFFFFFFF; /* Invalid code? */ + wc = (wc << 8) + b; /* Make a DBC */ + } + if (wc != 0) { + wc = ff_oem2uni(wc, CODEPAGE); /* ANSI/OEM ==> Unicode */ + if (wc == 0) return 0xFFFFFFFF; /* Invalid code? */ + } + uc = wc; + +#endif + *str = p; /* Next read pointer */ + return uc; +} + + +/* Output a TCHAR string in defined API encoding */ +static BYTE put_utf ( /* Returns number of encoding units written (0:buffer overflow or wrong encoding) */ + DWORD chr, /* UTF-16 encoded character (Double encoding unit char if >=0x10000) */ + TCHAR* buf, /* Output buffer */ + UINT szb /* Size of the buffer */ +) +{ +#if FF_LFN_UNICODE == 1 /* UTF-16 output */ + WCHAR hs, wc; + + hs = (WCHAR)(chr >> 16); + wc = (WCHAR)chr; + if (hs == 0) { /* Single encoding unit? */ + if (szb < 1 || IsSurrogate(wc)) return 0; /* Buffer overflow or wrong code? */ + *buf = wc; + return 1; + } + if (szb < 2 || !IsSurrogateH(hs) || !IsSurrogateL(wc)) return 0; /* Buffer overflow or wrong surrogate? */ + *buf++ = hs; + *buf++ = wc; + return 2; + +#elif FF_LFN_UNICODE == 2 /* UTF-8 output */ + DWORD hc; + + if (chr < 0x80) { /* Single byte code? */ + if (szb < 1) return 0; /* Buffer overflow? */ + *buf = (TCHAR)chr; + return 1; + } + if (chr < 0x800) { /* 2-byte sequence? */ + if (szb < 2) return 0; /* Buffer overflow? */ + *buf++ = (TCHAR)(0xC0 | (chr >> 6 & 0x1F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 2; + } + if (chr < 0x10000) { /* 3-byte sequence? */ + if (szb < 3 || IsSurrogate(chr)) return 0; /* Buffer overflow or wrong code? */ + *buf++ = (TCHAR)(0xE0 | (chr >> 12 & 0x0F)); + *buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 3; + } + /* 4-byte sequence */ + if (szb < 4) return 0; /* Buffer overflow? */ + hc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6; /* Get high 10 bits */ + chr = (chr & 0xFFFF) - 0xDC00; /* Get low 10 bits */ + if (hc >= 0x100000 || chr >= 0x400) return 0; /* Wrong surrogate? */ + chr = (hc | chr) + 0x10000; + *buf++ = (TCHAR)(0xF0 | (chr >> 18 & 0x07)); + *buf++ = (TCHAR)(0x80 | (chr >> 12 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 4; + +#elif FF_LFN_UNICODE == 3 /* UTF-32 output */ + DWORD hc; + + if (szb < 1) return 0; /* Buffer overflow? */ + if (chr >= 0x10000) { /* Out of BMP? */ + hc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6; /* Get high 10 bits */ + chr = (chr & 0xFFFF) - 0xDC00; /* Get low 10 bits */ + if (hc >= 0x100000 || chr >= 0x400) return 0; /* Wrong surrogate? */ + chr = (hc | chr) + 0x10000; + } + *buf++ = (TCHAR)chr; + return 1; + +#else /* ANSI/OEM output */ + WCHAR wc; + + wc = ff_uni2oem(chr, CODEPAGE); + if (wc >= 0x100) { /* Is this a DBC? */ + if (szb < 2) return 0; + *buf++ = (char)(wc >> 8); /* Store DBC 1st byte */ + *buf++ = (TCHAR)wc; /* Store DBC 2nd byte */ + return 2; + } + if (wc == 0 || szb < 1) return 0; /* Invalid char or buffer overflow? */ + *buf++ = (TCHAR)wc; /* Store the character */ + return 1; +#endif +} +#endif /* FF_USE_LFN */ + + +#if FF_FS_REENTRANT +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +static int lock_fs ( /* 1:Ok, 0:timeout */ + FATFS* fs /* Filesystem object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static void unlock_fs ( + FATFS* fs, /* Filesystem object */ + FRESULT res /* Result code to be returned */ +) +{ + if (fs && res != FR_NOT_ENABLED && res != FR_INVALID_DRIVE && res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} + +#endif + + + +#if FF_FS_LOCK != 0 +/*-----------------------------------------------------------------------*/ +/* File lock control functions */ +/*-----------------------------------------------------------------------*/ + +static FRESULT chk_lock ( /* Check if the file can be accessed */ + DIR* dp, /* Directory object pointing the file to be checked */ + int acc /* Desired access type (0:Read mode open, 1:Write mode open, 2:Delete or rename) */ +) +{ + UINT i, be; + + /* Search open object table for the object */ + be = 0; + for (i = 0; i < FF_FS_LOCK; i++) { + if (Files[i].fs) { /* Existing entry */ + if (Files[i].fs == dp->obj.fs && /* Check if the object matches with an open object */ + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } else { /* Blank entry */ + be = 1; + } + } + if (i == FF_FS_LOCK) { /* The object has not been opened */ + return (!be && acc != 2) ? FR_TOO_MANY_OPEN_FILES : FR_OK; /* Is there a blank entry for new object? */ + } + + /* The object was opened. Reject any open against writing file and all write mode open */ + return (acc != 0 || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK; +} + + +static int enq_lock (void) /* Check if an entry is available for a new object */ +{ + UINT i; + + for (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ; + return (i == FF_FS_LOCK) ? 0 : 1; +} + + +static UINT inc_lock ( /* Increment object open counter and returns its index (0:Internal error) */ + DIR* dp, /* Directory object pointing the file to register or increment */ + int acc /* Desired access (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i; + + + for (i = 0; i < FF_FS_LOCK; i++) { /* Find the object */ + if (Files[i].fs == dp->obj.fs && + Files[i].clu == dp->obj.sclust && + Files[i].ofs == dp->dptr) break; + } + + if (i == FF_FS_LOCK) { /* Not opened. Register it as new. */ + for (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ; + if (i == FF_FS_LOCK) return 0; /* No free entry to register (int err) */ + Files[i].fs = dp->obj.fs; + Files[i].clu = dp->obj.sclust; + Files[i].ofs = dp->dptr; + Files[i].ctr = 0; + } + + if (acc >= 1 && Files[i].ctr) return 0; /* Access violation (int err) */ + + Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1; /* Set semaphore value */ + + return i + 1; /* Index number origin from 1 */ +} + + +static FRESULT dec_lock ( /* Decrement object open counter */ + UINT i /* Semaphore index (1..) */ +) +{ + WORD n; + FRESULT res; + + + if (--i < FF_FS_LOCK) { /* Index number origin from 0 */ + n = Files[i].ctr; + if (n == 0x100) n = 0; /* If write mode open, delete the entry */ + if (n > 0) n--; /* Decrement read mode open count */ + Files[i].ctr = n; + if (n == 0) Files[i].fs = 0; /* Delete the entry if open count gets zero */ + res = FR_OK; + } else { + res = FR_INT_ERR; /* Invalid index nunber */ + } + return res; +} + + +static void clear_lock ( /* Clear lock entries of the volume */ + FATFS *fs +) +{ + UINT i; + + for (i = 0; i < FF_FS_LOCK; i++) { + if (Files[i].fs == fs) Files[i].fs = 0; + } +} + +#endif /* FF_FS_LOCK != 0 */ + + + +/*-----------------------------------------------------------------------*/ +/* Move/Flush disk access window in the filesystem object */ +/*-----------------------------------------------------------------------*/ +#if !FF_FS_READONLY +static FRESULT sync_window ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs /* Filesystem object */ +) +{ + FRESULT res = FR_OK; + + + if (fs->wflag) { /* Is the disk access window dirty */ + if (disk_write(fs->pdrv, fs->win, fs->winsect, 1) == RES_OK) { /* Write back the window */ + fs->wflag = 0; /* Clear window dirty flag */ + if (fs->winsect - fs->fatbase < fs->fsize) { /* Is it in the 1st FAT? */ + if (fs->n_fats == 2) disk_write(fs->pdrv, fs->win, fs->winsect + fs->fsize, 1); /* Reflect it to 2nd FAT if needed */ + } + } else { + res = FR_DISK_ERR; + } + } + return res; +} +#endif + + +static FRESULT move_window ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs, /* Filesystem object */ + DWORD sector /* Sector number to make appearance in the fs->win[] */ +) +{ + FRESULT res = FR_OK; + + + if (sector != fs->winsect) { /* Window offset changed? */ +#if !FF_FS_READONLY + res = sync_window(fs); /* Write-back changes */ +#endif + if (res == FR_OK) { /* Fill sector window with new data */ + if (disk_read(fs->pdrv, fs->win, sector, 1) != RES_OK) { + sector = 0xFFFFFFFF; /* Invalidate window if read data is not valid */ + res = FR_DISK_ERR; + } + fs->winsect = sector; + } + } + return res; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Synchronize filesystem and data on the storage */ +/*-----------------------------------------------------------------------*/ + +static FRESULT sync_fs ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS* fs /* Filesystem object */ +) +{ + FRESULT res; + + + res = sync_window(fs); + if (res == FR_OK) { + if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { /* FAT32: Update FSInfo sector if needed */ + /* Create FSInfo structure */ + mem_set(fs->win, 0, sizeof fs->win); + st_word(fs->win + BS_55AA, 0xAA55); + st_dword(fs->win + FSI_LeadSig, 0x41615252); + st_dword(fs->win + FSI_StrucSig, 0x61417272); + st_dword(fs->win + FSI_Free_Count, fs->free_clst); + st_dword(fs->win + FSI_Nxt_Free, fs->last_clst); + /* Write it into the FSInfo sector */ + fs->winsect = fs->volbase + 1; + disk_write(fs->pdrv, fs->win, fs->winsect, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the lower layer */ + if (disk_ioctl(fs->pdrv, CTRL_SYNC, 0) != RES_OK) res = FR_DISK_ERR; + } + + return res; +} + +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Get physical sector number from cluster number */ +/*-----------------------------------------------------------------------*/ + +static DWORD clst2sect ( /* !=0:Sector number, 0:Failed (invalid cluster#) */ + FATFS* fs, /* Filesystem object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; /* Cluster number is origin from 2 */ + if (clst >= fs->n_fatent - 2) return 0; /* Is it invalid cluster number? */ + return fs->database + fs->csize * clst; /* Start sector number of the cluster */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +static DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x7FFFFFFF:Cluster status */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst /* Cluster number to get the value */ +) +{ + UINT wc, bc; + DWORD val; + FATFS *fs = obj->fs; + + + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ + val = 1; /* Internal error */ + + } else { + val = 0xFFFFFFFF; /* Default value falls on disk error */ + + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc = fs->win[bc++ % SS(fs)]; /* Get 1st byte of the entry */ + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break; + wc |= fs->win[bc % SS(fs)] << 8; /* Merge 2nd byte of the entry */ + val = (clst & 1) ? (wc >> 4) : (wc & 0xFFF); /* Adjust bit position */ + break; + + case FS_FAT16 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) != FR_OK) break; + val = ld_word(fs->win + clst * 2 % SS(fs)); /* Simple WORD array */ + break; + + case FS_FAT32 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x0FFFFFFF; /* Simple DWORD array but mask out upper 4 bits */ + break; +#if FF_FS_EXFAT + case FS_EXFAT : + if ((obj->objsize != 0 && obj->sclust != 0) || obj->stat == 0) { /* Object except root dir must have valid data length */ + DWORD cofs = clst - obj->sclust; /* Offset from start cluster */ + DWORD clen = (DWORD)((obj->objsize - 1) / SS(fs)) / fs->csize; /* Number of clusters - 1 */ + + if (obj->stat == 2 && cofs <= clen) { /* Is it a contiguous chain? */ + val = (cofs == clen) ? 0x7FFFFFFF : clst + 1; /* No data on the FAT, generate the value */ + break; + } + if (obj->stat == 3 && cofs < obj->n_cont) { /* Is it in the 1st fragment? */ + val = clst + 1; /* Generate the value */ + break; + } + if (obj->stat != 2) { /* Get value from FAT if FAT chain is valid */ + if (obj->n_frag != 0) { /* Is it on the growing edge? */ + val = 0x7FFFFFFF; /* Generate EOC */ + } else { + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break; + val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x7FFFFFFF; + } + break; + } + } + /* go to default */ +#endif + default: + val = 1; /* Internal error */ + } + } + + return val; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + +static FRESULT put_fat ( /* FR_OK(0):succeeded, !=0:error */ + FATFS* fs, /* Corresponding filesystem object */ + DWORD clst, /* FAT index number (cluster number) to be changed */ + DWORD val /* New value to be set to the entry */ +) +{ + UINT bc; + BYTE *p; + FRESULT res = FR_INT_ERR; + + + if (clst >= 2 && clst < fs->n_fatent) { /* Check if in valid range */ + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; /* bc: byte offset of the entry */ + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = fs->win + bc++ % SS(fs); + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; /* Put 1st byte */ + fs->wflag = 1; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = fs->win + bc % SS(fs); + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); /* Put 2nd byte */ + fs->wflag = 1; + break; + + case FS_FAT16 : + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + st_word(fs->win + clst * 2 % SS(fs), (WORD)val); /* Simple WORD array */ + fs->wflag = 1; + break; + + case FS_FAT32 : +#if FF_FS_EXFAT + case FS_EXFAT : +#endif + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + val = (val & 0x0FFFFFFF) | (ld_dword(fs->win + clst * 4 % SS(fs)) & 0xF0000000); + } + st_dword(fs->win + clst * 4 % SS(fs), val); + fs->wflag = 1; + break; + } + } + return res; +} + +#endif /* !FF_FS_READONLY */ + + + + +#if FF_FS_EXFAT && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* exFAT: Accessing FAT and Allocation Bitmap */ +/*-----------------------------------------------------------------------*/ + +/*--------------------------------------*/ +/* Find a contiguous free cluster block */ +/*--------------------------------------*/ + +static DWORD find_bitmap ( /* 0:Not found, 2..:Cluster block found, 0xFFFFFFFF:Disk error */ + FATFS* fs, /* Filesystem object */ + DWORD clst, /* Cluster number to scan from */ + DWORD ncl /* Number of contiguous clusters to find (1..) */ +) +{ + BYTE bm, bv; + UINT i; + DWORD val, scl, ctr; + + + clst -= 2; /* The first bit in the bitmap corresponds to cluster #2 */ + if (clst >= fs->n_fatent - 2) clst = 0; + scl = val = clst; ctr = 0; + for (;;) { + if (move_window(fs, fs->bitbase + val / 8 / SS(fs)) != FR_OK) return 0xFFFFFFFF; + i = val / 8 % SS(fs); bm = 1 << (val % 8); + do { + do { + bv = fs->win[i] & bm; bm <<= 1; /* Get bit value */ + if (++val >= fs->n_fatent - 2) { /* Next cluster (with wrap-around) */ + val = 0; bm = 0; i = SS(fs); + } + if (bv == 0) { /* Is it a free cluster? */ + if (++ctr == ncl) return scl + 2; /* Check if run length is sufficient for required */ + } else { + scl = val; ctr = 0; /* Encountered a cluster in-use, restart to scan */ + } + if (val == clst) return 0; /* All cluster scanned? */ + } while (bm != 0); + bm = 1; + } while (++i < SS(fs)); + } +} + + +/*----------------------------------------*/ +/* Set/Clear a block of allocation bitmap */ +/*----------------------------------------*/ + +static FRESULT change_bitmap ( + FATFS* fs, /* Filesystem object */ + DWORD clst, /* Cluster number to change from */ + DWORD ncl, /* Number of clusters to be changed */ + int bv /* bit value to be set (0 or 1) */ +) +{ + BYTE bm; + UINT i; + DWORD sect; + + + clst -= 2; /* The first bit corresponds to cluster #2 */ + sect = fs->bitbase + clst / 8 / SS(fs); /* Sector address */ + i = clst / 8 % SS(fs); /* Byte offset in the sector */ + bm = 1 << (clst % 8); /* Bit mask in the byte */ + for (;;) { + if (move_window(fs, sect++) != FR_OK) return FR_DISK_ERR; + do { + do { + if (bv == (int)((fs->win[i] & bm) != 0)) return FR_INT_ERR; /* Is the bit expected value? */ + fs->win[i] ^= bm; /* Flip the bit */ + fs->wflag = 1; + if (--ncl == 0) return FR_OK; /* All bits processed? */ + } while (bm <<= 1); /* Next bit */ + bm = 1; + } while (++i < SS(fs)); /* Next byte */ + i = 0; + } +} + + +/*---------------------------------------------*/ +/* Fill the first fragment of the FAT chain */ +/*---------------------------------------------*/ + +static FRESULT fill_first_frag ( + FFOBJID* obj /* Pointer to the corresponding object */ +) +{ + FRESULT res; + DWORD cl, n; + + + if (obj->stat == 3) { /* Has the object been changed 'fragmented' in this session? */ + for (cl = obj->sclust, n = obj->n_cont; n; cl++, n--) { /* Create cluster chain on the FAT */ + res = put_fat(obj->fs, cl, cl + 1); + if (res != FR_OK) return res; + } + obj->stat = 0; /* Change status 'FAT chain is valid' */ + } + return FR_OK; +} + + +/*---------------------------------------------*/ +/* Fill the last fragment of the FAT chain */ +/*---------------------------------------------*/ + +static FRESULT fill_last_frag ( + FFOBJID* obj, /* Pointer to the corresponding object */ + DWORD lcl, /* Last cluster of the fragment */ + DWORD term /* Value to set the last FAT entry */ +) +{ + FRESULT res; + + + while (obj->n_frag > 0) { /* Create the chain of last fragment */ + res = put_fat(obj->fs, lcl - obj->n_frag + 1, (obj->n_frag > 1) ? lcl - obj->n_frag + 2 : term); + if (res != FR_OK) return res; + obj->n_frag--; + } + return FR_OK; +} + +#endif /* FF_FS_EXFAT && !FF_FS_READONLY */ + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ + +static FRESULT remove_chain ( /* FR_OK(0):succeeded, !=0:error */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst, /* Cluster to remove a chain from */ + DWORD pclst /* Previous cluster of clst (0 if entire chain) */ +) +{ + FRESULT res = FR_OK; + DWORD nxt; + FATFS *fs = obj->fs; +#if FF_FS_EXFAT || FF_USE_TRIM + DWORD scl = clst, ecl = clst; +#endif +#if FF_USE_TRIM + DWORD rt[2]; +#endif + + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Check if in valid range */ + + /* Mark the previous cluster 'EOC' on the FAT if it exists */ + if (pclst != 0 && (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT || obj->stat != 2)) { + res = put_fat(fs, pclst, 0xFFFFFFFF); + if (res != FR_OK) return res; + } + + /* Remove the chain */ + do { + nxt = get_fat(obj, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) return FR_INT_ERR; /* Internal error? */ + if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error? */ + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + res = put_fat(fs, clst, 0); /* Mark the cluster 'free' on the FAT */ + if (res != FR_OK) return res; + } + if (fs->free_clst < fs->n_fatent - 2) { /* Update FSINFO */ + fs->free_clst++; + fs->fsi_flag |= 1; + } +#if FF_FS_EXFAT || FF_USE_TRIM + if (ecl + 1 == nxt) { /* Is next cluster contiguous? */ + ecl = nxt; + } else { /* End of contiguous cluster block */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = change_bitmap(fs, scl, ecl - scl + 1, 0); /* Mark the cluster block 'free' on the bitmap */ + if (res != FR_OK) return res; + } +#endif +#if FF_USE_TRIM + rt[0] = clst2sect(fs, scl); /* Start of data area freed */ + rt[1] = clst2sect(fs, ecl) + fs->csize - 1; /* End of data area freed */ + disk_ioctl(fs->pdrv, CTRL_TRIM, rt); /* Inform device the data in the block is no longer needed */ +#endif + scl = ecl = nxt; + } +#endif + clst = nxt; /* Next cluster */ + } while (clst < fs->n_fatent); /* Repeat while not the last link */ + +#if FF_FS_EXFAT + /* Some post processes for chain status */ + if (fs->fs_type == FS_EXFAT) { + if (pclst == 0) { /* Has the entire chain been removed? */ + obj->stat = 0; /* Change the chain status 'initial' */ + } else { + if (obj->stat == 0) { /* Is it a fragmented chain from the beginning of this session? */ + clst = obj->sclust; /* Follow the chain to check if it gets contiguous */ + while (clst != pclst) { + nxt = get_fat(obj, clst); + if (nxt < 2) return FR_INT_ERR; + if (nxt == 0xFFFFFFFF) return FR_DISK_ERR; + if (nxt != clst + 1) break; /* Not contiguous? */ + clst++; + } + if (clst == pclst) { /* Has the chain got contiguous again? */ + obj->stat = 2; /* Change the chain status 'contiguous' */ + } + } else { + if (obj->stat == 3 && pclst >= obj->sclust && pclst <= obj->sclust + obj->n_cont) { /* Was the chain fragmented in this session and got contiguous again? */ + obj->stat = 2; /* Change the chain status 'contiguous' */ + } + } + } + } +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch a chain or Create a new chain */ +/*-----------------------------------------------------------------------*/ + +static DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + FFOBJID* obj, /* Corresponding object */ + DWORD clst /* Cluster# to stretch, 0:Create a new chain */ +) +{ + DWORD cs, ncl, scl; + FRESULT res; + FATFS *fs = obj->fs; + + + if (clst == 0) { /* Create a new chain */ + scl = fs->last_clst; /* Suggested cluster to start to find */ + if (scl == 0 || scl >= fs->n_fatent) scl = 1; + } + else { /* Stretch a chain */ + cs = get_fat(obj, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* Test for insanity */ + if (cs == 0xFFFFFFFF) return cs; /* Test for disk error */ + if (cs < fs->n_fatent) return cs; /* It is already followed by next cluster */ + scl = clst; /* Cluster to start to find */ + } + if (fs->free_clst == 0) return 0; /* No free cluster */ + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + ncl = find_bitmap(fs, scl, 1); /* Find a free cluster */ + if (ncl == 0 || ncl == 0xFFFFFFFF) return ncl; /* No free cluster or hard error? */ + res = change_bitmap(fs, ncl, 1, 1); /* Mark the cluster 'in use' */ + if (res == FR_INT_ERR) return 1; + if (res == FR_DISK_ERR) return 0xFFFFFFFF; + if (clst == 0) { /* Is it a new chain? */ + obj->stat = 2; /* Set status 'contiguous' */ + } else { /* It is a stretched chain */ + if (obj->stat == 2 && ncl != scl + 1) { /* Is the chain got fragmented? */ + obj->n_cont = scl - obj->sclust; /* Set size of the contiguous part */ + obj->stat = 3; /* Change status 'just fragmented' */ + } + } + if (obj->stat != 2) { /* Is the file non-contiguous? */ + if (ncl == clst + 1) { /* Is the cluster next to previous one? */ + obj->n_frag = obj->n_frag ? obj->n_frag + 1 : 2; /* Increment size of last framgent */ + } else { /* New fragment */ + if (obj->n_frag == 0) obj->n_frag = 1; + res = fill_last_frag(obj, clst, ncl); /* Fill last fragment on the FAT and link it to new one */ + if (res == FR_OK) obj->n_frag = 1; + } + } + } else +#endif + { /* On the FAT/FAT32 volume */ + ncl = 0; + if (scl == clst) { /* Stretching an existing chain? */ + ncl = scl + 1; /* Test if next cluster is free */ + if (ncl >= fs->n_fatent) ncl = 2; + cs = get_fat(obj, ncl); /* Get next cluster status */ + if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* Test for error */ + if (cs != 0) { /* Not free? */ + cs = fs->last_clst; /* Start at suggested cluster if it is valid */ + if (cs >= 2 && cs < fs->n_fatent) scl = cs; + ncl = 0; + } + } + if (ncl == 0) { /* The new cluster cannot be contiguous and find another fragment */ + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= fs->n_fatent) { /* Check wrap-around */ + ncl = 2; + if (ncl > scl) return 0; /* No free cluster found? */ + } + cs = get_fat(obj, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster? */ + if (cs == 1 || cs == 0xFFFFFFFF) return cs; /* Test for error */ + if (ncl == scl) return 0; /* No free cluster found? */ + } + } + res = put_fat(fs, ncl, 0xFFFFFFFF); /* Mark the new cluster 'EOC' */ + if (res == FR_OK && clst != 0) { + res = put_fat(fs, clst, ncl); /* Link it from the previous one if needed */ + } + } + + if (res == FR_OK) { /* Update FSINFO if function succeeded. */ + fs->last_clst = ncl; + if (fs->free_clst <= fs->n_fatent - 2) fs->free_clst--; + fs->fsi_flag |= 1; + } else { + ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; /* Failed. Generate error status */ + } + + return ncl; /* Return new cluster number or error status */ +} + +#endif /* !FF_FS_READONLY */ + + + + +#if FF_USE_FASTSEEK +/*-----------------------------------------------------------------------*/ +/* FAT handling - Convert offset into cluster with link map table */ +/*-----------------------------------------------------------------------*/ + +static DWORD clmt_clust ( /* <2:Error, >=2:Cluster number */ + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File offset to be converted to cluster# */ +) +{ + DWORD cl, ncl, *tbl; + FATFS *fs = fp->obj.fs; + + + tbl = fp->cltbl + 1; /* Top of CLMT */ + cl = (DWORD)(ofs / SS(fs) / fs->csize); /* Cluster order from top of the file */ + for (;;) { + ncl = *tbl++; /* Number of cluters in the fragment */ + if (ncl == 0) return 0; /* End of table? (error) */ + if (cl < ncl) break; /* In this fragment? */ + cl -= ncl; tbl++; /* Next fragment */ + } + return cl + *tbl; /* Return the cluster number */ +} + +#endif /* FF_USE_FASTSEEK */ + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Fill a cluster with zeros */ +/*-----------------------------------------------------------------------*/ + +#if !FF_FS_READONLY +static FRESULT dir_clear ( /* Returns FR_OK or FR_DISK_ERR */ + FATFS *fs, /* Filesystem object */ + DWORD clst /* Directory table to clear */ +) +{ + DWORD sect; + UINT n, szb; + BYTE *ibuf; + + + if (sync_window(fs) != FR_OK) return FR_DISK_ERR; /* Flush disk access window */ + sect = clst2sect(fs, clst); /* Top of the cluster */ + fs->winsect = sect; /* Set window to top of the cluster */ + mem_set(fs->win, 0, sizeof fs->win); /* Clear window buffer */ +#if FF_USE_LFN == 3 /* Quick table clear by using multi-secter write */ + /* Allocate a temporary buffer */ + for (szb = ((DWORD)fs->csize * SS(fs) >= MAX_MALLOC) ? MAX_MALLOC : fs->csize * SS(fs), ibuf = 0; szb > SS(fs) && (ibuf = ff_memalloc(szb)) == 0; szb /= 2) ; + if (szb > SS(fs)) { /* Buffer allocated? */ + mem_set(ibuf, 0, szb); + szb /= SS(fs); /* Bytes -> Sectors */ + for (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ; /* Fill the cluster with 0 */ + ff_memfree(ibuf); + } else +#endif + { + ibuf = fs->win; szb = 1; /* Use window buffer (many single-sector writes may take a time) */ + for (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ; /* Fill the cluster with 0 */ + } + return (n == fs->csize) ? FR_OK : FR_DISK_ERR; +} +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Set directory index */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_sdi ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to directory object */ + DWORD ofs /* Offset of directory table */ +) +{ + DWORD csz, clst; + FATFS *fs = dp->obj.fs; + + + if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR) || ofs % SZDIRE) { /* Check range of offset and alignment */ + return FR_INT_ERR; + } + dp->dptr = ofs; /* Set current offset */ + clst = dp->obj.sclust; /* Table start cluster (0:root) */ + if (clst == 0 && fs->fs_type >= FS_FAT32) { /* Replace cluster# 0 with root cluster# */ + clst = fs->dirbase; + if (FF_FS_EXFAT) dp->obj.stat = 0; /* exFAT: Root dir has an FAT chain */ + } + + if (clst == 0) { /* Static table (root-directory on the FAT volume) */ + if (ofs / SZDIRE >= fs->n_rootdir) return FR_INT_ERR; /* Is index out of range? */ + dp->sect = fs->dirbase; + + } else { /* Dynamic table (sub-directory or root-directory on the FAT32/exFAT volume) */ + csz = (DWORD)fs->csize * SS(fs); /* Bytes per cluster */ + while (ofs >= csz) { /* Follow cluster chain */ + clst = get_fat(&dp->obj, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR; /* Reached to end of table or internal error */ + ofs -= csz; + } + dp->sect = clst2sect(fs, clst); + } + dp->clust = clst; /* Current cluster# */ + if (dp->sect == 0) return FR_INT_ERR; + dp->sect += ofs / SS(fs); /* Sector# of the directory entry */ + dp->dir = fs->win + (ofs % SS(fs)); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory table index next */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_next ( /* FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ + DIR* dp, /* Pointer to the directory object */ + int stretch /* 0: Do not stretch table, 1: Stretch table if needed */ +) +{ + DWORD ofs, clst; + FATFS *fs = dp->obj.fs; + + + ofs = dp->dptr + SZDIRE; /* Next entry */ + if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR)) dp->sect = 0; /* Disable it if the offset reached the max value */ + if (dp->sect == 0) return FR_NO_FILE; /* Report EOT if it has been disabled */ + + if (ofs % SS(fs) == 0) { /* Sector changed? */ + dp->sect++; /* Next sector */ + + if (dp->clust == 0) { /* Static table */ + if (ofs / SZDIRE >= fs->n_rootdir) { /* Report EOT if it reached end of static table */ + dp->sect = 0; return FR_NO_FILE; + } + } + else { /* Dynamic table */ + if ((ofs / SS(fs) & (fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(&dp->obj, dp->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst >= fs->n_fatent) { /* It reached end of dynamic table */ +#if !FF_FS_READONLY + if (!stretch) { /* If no stretch, report EOT */ + dp->sect = 0; return FR_NO_FILE; + } + clst = create_chain(&dp->obj, dp->clust); /* Allocate a cluster */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; /* Internal error */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (dir_clear(fs, clst) != FR_OK) return FR_DISK_ERR; /* Clean up the stretched table */ + if (FF_FS_EXFAT) dp->obj.stat |= 4; /* exFAT: The directory has been stretched */ +#else + if (!stretch) dp->sect = 0; /* (this line is to suppress compiler warning) */ + dp->sect = 0; return FR_NO_FILE; /* Report EOT */ +#endif + } + dp->clust = clst; /* Initialize data for new cluster */ + dp->sect = clst2sect(fs, clst); + } + } + } + dp->dptr = ofs; /* Current entry */ + dp->dir = fs->win + ofs % SS(fs); /* Pointer to the entry in the win[] */ + + return FR_OK; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Directory handling - Reserve a block of directory entries */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_alloc ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to the directory object */ + UINT nent /* Number of contiguous entries to allocate */ +) +{ + FRESULT res; + UINT n; + FATFS *fs = dp->obj.fs; + + + res = dir_sdi(dp, 0); + if (res == FR_OK) { + n = 0; + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; +#if FF_FS_EXFAT + if ((fs->fs_type == FS_EXFAT) ? (int)((dp->dir[XDIR_Type] & 0x80) == 0) : (int)(dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0)) { +#else + if (dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0) { +#endif + if (++n == nent) break; /* A block of contiguous free entries is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dp, 1); + } while (res == FR_OK); /* Next entry with table stretch enabled */ + } + + if (res == FR_NO_FILE) res = FR_DENIED; /* No directory entry to allocate */ + return res; +} + +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT: Directory handling - Load/Store start cluster number */ +/*-----------------------------------------------------------------------*/ + +static DWORD ld_clust ( /* Returns the top cluster value of the SFN entry */ + FATFS* fs, /* Pointer to the fs object */ + const BYTE* dir /* Pointer to the key entry */ +) +{ + DWORD cl; + + cl = ld_word(dir + DIR_FstClusLO); + if (fs->fs_type == FS_FAT32) { + cl |= (DWORD)ld_word(dir + DIR_FstClusHI) << 16; + } + + return cl; +} + + +#if !FF_FS_READONLY +static void st_clust ( + FATFS* fs, /* Pointer to the fs object */ + BYTE* dir, /* Pointer to the key entry */ + DWORD cl /* Value to be set */ +) +{ + st_word(dir + DIR_FstClusLO, (WORD)cl); + if (fs->fs_type == FS_FAT32) { + st_word(dir + DIR_FstClusHI, (WORD)(cl >> 16)); + } +} +#endif + + + +#if FF_USE_LFN +/*--------------------------------------------------------*/ +/* FAT-LFN: Compare a part of file name with an LFN entry */ +/*--------------------------------------------------------*/ + +static int cmp_lfn ( /* 1:matched, 0:not matched */ + const WCHAR* lfnbuf, /* Pointer to the LFN working buffer to be compared */ + BYTE* dir /* Pointer to the directory entry containing the part of LFN */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc != 0) { + if (i >= FF_MAX_LFN || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) { /* Compare it */ + return 0; /* Not matched */ + } + wc = uc; + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) return 0; /* Last segment matched but different length */ + + return 1; /* The part of LFN matched */ +} + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT +/*-----------------------------------------------------*/ +/* FAT-LFN: Pick a part of file name from an LFN entry */ +/*-----------------------------------------------------*/ + +static int pick_lfn ( /* 1:succeeded, 0:buffer overflow or invalid LFN entry */ + WCHAR* lfnbuf, /* Pointer to the LFN working buffer */ + BYTE* dir /* Pointer to the LFN entry */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + if (ld_word(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO is 0 */ + + i = ((dir[LDIR_Ord] & ~LLEF) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = ld_word(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc != 0) { + if (i >= FF_MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if (dir[LDIR_Ord] & LLEF) { /* Put terminator if it is the last LFN part */ + if (i >= FF_MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return 1; /* The part of LFN is valid */ +} +#endif + + +#if !FF_FS_READONLY +/*-----------------------------------------*/ +/* FAT-LFN: Create an entry of LFN entries */ +/*-----------------------------------------*/ + +static void put_lfn ( + const WCHAR* lfn, /* Pointer to the LFN */ + BYTE* dir, /* Pointer to the LFN entry to be created */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* Checksum of the corresponding SFN */ +) +{ + UINT i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set checksum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + st_word(dir + LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN working buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfn[i++]; /* Get an effective character */ + st_word(dir + LfnOfs[s], wc); /* Put it */ + if (wc == 0) wc = 0xFFFF; /* Padding characters for left locations */ + } while (++s < 13); + if (wc == 0xFFFF || !lfn[i]) ord |= LLEF; /* Last LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_LFN */ + + + +#if FF_USE_LFN && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Create a Numbered SFN */ +/*-----------------------------------------------------------------------*/ + +static void gen_numname ( + BYTE* dst, /* Pointer to the buffer to store numbered SFN */ + const BYTE* src, /* Pointer to SFN */ + const WCHAR* lfn, /* Pointer to LFN */ + UINT seq /* Sequence number */ +) +{ + BYTE ns[8], c; + UINT i, j; + WCHAR wc; + DWORD sr; + + + mem_cpy(dst, src, 11); + + if (seq > 5) { /* In case of many collisions, generate a hash number instead of sequential number */ + sr = seq; + while (*lfn) { /* Create a CRC as hash value */ + wc = *lfn++; + for (i = 0; i < 16; i++) { + sr = (sr << 1) + (wc & 1); + wc >>= 1; + if (sr & 0x10000) sr ^= 0x11021; + } + } + seq = (UINT)sr; + } + + /* itoa (hexdecimal) */ + i = 7; + do { + c = (BYTE)((seq % 16) + '0'); + if (c > '9') c += 7; + ns[i--] = c; + seq /= 16; + } while (seq); + ns[i] = '~'; + + /* Append the number to the SFN body */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (dbc_1st(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif /* FF_USE_LFN && !FF_FS_READONLY */ + + + +#if FF_USE_LFN +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Calculate checksum of an SFN entry */ +/*-----------------------------------------------------------------------*/ + +static BYTE sum_sfn ( + const BYTE* dir /* Pointer to the SFN entry */ +) +{ + BYTE sum = 0; + UINT n = 11; + + do { + sum = (sum >> 1) + (sum << 7) + *dir++; + } while (--n); + return sum; +} + +#endif /* FF_USE_LFN */ + + + +#if FF_FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* exFAT: Checksum */ +/*-----------------------------------------------------------------------*/ + +static WORD xdir_sum ( /* Get checksum of the directoly entry block */ + const BYTE* dir /* Directory entry block to be calculated */ +) +{ + UINT i, szblk; + WORD sum; + + + szblk = (dir[XDIR_NumSec] + 1) * SZDIRE; /* Number of bytes of the entry block */ + for (i = sum = 0; i < szblk; i++) { + if (i == XDIR_SetSum) { /* Skip 2-byte sum field */ + i++; + } else { + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + dir[i]; + } + } + return sum; +} + + + +static WORD xname_sum ( /* Get check sum (to be used as hash) of the file name */ + const WCHAR* name /* File name to be calculated */ +) +{ + WCHAR chr; + WORD sum = 0; + + + while ((chr = *name++) != 0) { + chr = (WCHAR)ff_wtoupper(chr); /* File name needs to be up-case converted */ + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr & 0xFF); + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr >> 8); + } + return sum; +} + + +#if !FF_FS_READONLY && FF_USE_MKFS +static DWORD xsum32 ( /* Returns 32-bit checksum */ + BYTE dat, /* Byte to be calculated (byte-by-byte processing) */ + DWORD sum /* Previous sum value */ +) +{ + sum = ((sum & 1) ? 0x80000000 : 0) + (sum >> 1) + dat; + return sum; +} +#endif + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 +/*------------------------------------------------------*/ +/* exFAT: Get object information from a directory block */ +/*------------------------------------------------------*/ + +static void get_xfileinfo ( + BYTE* dirb, /* Pointer to the direcotry entry block 85+C0+C1s */ + FILINFO* fno /* Buffer to store the extracted file information */ +) +{ + WCHAR wc, hs; + UINT di, si, nc; + + /* Get file name from the entry block */ + si = SZDIRE * 2; /* 1st C1 entry */ + nc = 0; hs = 0; di = 0; + while (nc < dirb[XDIR_NumName]) { + if (si >= MAXDIRB(FF_MAX_LFN)) { di = 0; break; } /* Truncated directory block? */ + if ((si % SZDIRE) == 0) si += 2; /* Skip entry type field */ + wc = ld_word(dirb + si); si += 2; nc++; /* Get a character */ + if (hs == 0 && IsSurrogate(wc)) { /* Is it a surrogate? */ + hs = wc; continue; /* Get low surrogate */ + } + wc = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di); /* Store it in API encoding */ + if (wc == 0) { di = 0; break; } /* Buffer overflow or wrong encoding? */ + di += wc; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + if (di == 0) fno->fname[di++] = '?'; /* Inaccessible object name? */ + fno->fname[di] = 0; /* Terminate the name */ + fno->altname[0] = 0; /* exFAT does not support SFN */ + + fno->fattrib = dirb[XDIR_Attr]; /* Attribute */ + fno->fsize = (fno->fattrib & AM_DIR) ? 0 : ld_qword(dirb + XDIR_FileSize); /* Size */ + fno->ftime = ld_word(dirb + XDIR_ModTime + 0); /* Time */ + fno->fdate = ld_word(dirb + XDIR_ModTime + 2); /* Date */ +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 */ + + +/*-----------------------------------*/ +/* exFAT: Get a directry entry block */ +/*-----------------------------------*/ + +static FRESULT load_xdir ( /* FR_INT_ERR: invalid entry block */ + DIR* dp /* Reading direcotry object pointing top of the entry block to load */ +) +{ + FRESULT res; + UINT i, sz_ent; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the on-memory direcotry entry block 85+C0+C1s */ + + + /* Load file-directory entry */ + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != ET_FILEDIR) return FR_INT_ERR; /* Invalid order */ + mem_cpy(dirb + 0 * SZDIRE, dp->dir, SZDIRE); + sz_ent = (dirb[XDIR_NumSec] + 1) * SZDIRE; + if (sz_ent < 3 * SZDIRE || sz_ent > 19 * SZDIRE) return FR_INT_ERR; + + /* Load stream-extension entry */ + res = dir_next(dp, 0); + if (res == FR_NO_FILE) res = FR_INT_ERR; /* It cannot be */ + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != ET_STREAM) return FR_INT_ERR; /* Invalid order */ + mem_cpy(dirb + 1 * SZDIRE, dp->dir, SZDIRE); + if (MAXDIRB(dirb[XDIR_NumName]) > sz_ent) return FR_INT_ERR; + + /* Load file-name entries */ + i = 2 * SZDIRE; /* Name offset to load */ + do { + res = dir_next(dp, 0); + if (res == FR_NO_FILE) res = FR_INT_ERR; /* It cannot be */ + if (res != FR_OK) return res; + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) return res; + if (dp->dir[XDIR_Type] != ET_FILENAME) return FR_INT_ERR; /* Invalid order */ + if (i < MAXDIRB(FF_MAX_LFN)) mem_cpy(dirb + i, dp->dir, SZDIRE); + } while ((i += SZDIRE) < sz_ent); + + /* Sanity check (do it for only accessible object) */ + if (i <= MAXDIRB(FF_MAX_LFN)) { + if (xdir_sum(dirb) != ld_word(dirb + XDIR_SetSum)) return FR_INT_ERR; + } + return FR_OK; +} + + +/*------------------------------------------------------------------*/ +/* exFAT: Initialize object allocation info with loaded entry block */ +/*------------------------------------------------------------------*/ + +static void init_alloc_info ( + FATFS* fs, /* Filesystem object */ + FFOBJID* obj /* Object allocation information to be initialized */ +) +{ + obj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus); /* Start cluster */ + obj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize); /* Size */ + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; /* Allocation status */ + obj->n_frag = 0; /* No last fragment info */ +} + + + +#if !FF_FS_READONLY || FF_FS_RPATH != 0 +/*------------------------------------------------*/ +/* exFAT: Load the object's directory entry block */ +/*------------------------------------------------*/ + +static FRESULT load_obj_xdir ( + DIR* dp, /* Blank directory object to be used to access containing direcotry */ + const FFOBJID* obj /* Object with its containing directory information */ +) +{ + FRESULT res; + + /* Open object containing directory */ + dp->obj.fs = obj->fs; + dp->obj.sclust = obj->c_scl; + dp->obj.stat = (BYTE)obj->c_size; + dp->obj.objsize = obj->c_size & 0xFFFFFF00; + dp->obj.n_frag = 0; + dp->blk_ofs = obj->c_ofs; + + res = dir_sdi(dp, dp->blk_ofs); /* Goto object's entry block */ + if (res == FR_OK) { + res = load_xdir(dp); /* Load the object's entry block */ + } + return res; +} +#endif + + +#if !FF_FS_READONLY +/*----------------------------------------*/ +/* exFAT: Store the directory entry block */ +/*----------------------------------------*/ + +static FRESULT store_xdir ( + DIR* dp /* Pointer to the direcotry object */ +) +{ + FRESULT res; + UINT nent; + BYTE* dirb = dp->obj.fs->dirbuf; /* Pointer to the direcotry entry block 85+C0+C1s */ + + /* Create set sum */ + st_word(dirb + XDIR_SetSum, xdir_sum(dirb)); + nent = dirb[XDIR_NumSec] + 1; + + /* Store the direcotry entry block to the directory */ + res = dir_sdi(dp, dp->blk_ofs); + while (res == FR_OK) { + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) break; + mem_cpy(dp->dir, dirb, SZDIRE); + dp->obj.fs->wflag = 1; + if (--nent == 0) break; + dirb += SZDIRE; + res = dir_next(dp, 0); + } + return (res == FR_OK || res == FR_DISK_ERR) ? res : FR_INT_ERR; +} + + + +/*-------------------------------------------*/ +/* exFAT: Create a new directory enrty block */ +/*-------------------------------------------*/ + +static void create_xdir ( + BYTE* dirb, /* Pointer to the direcotry entry block buffer */ + const WCHAR* lfn /* Pointer to the object name */ +) +{ + UINT i; + BYTE nc1, nlen; + WCHAR wc; + + + /* Create file-directory and stream-extension entry */ + mem_set(dirb, 0, 2 * SZDIRE); + dirb[0 * SZDIRE + XDIR_Type] = ET_FILEDIR; + dirb[1 * SZDIRE + XDIR_Type] = ET_STREAM; + + /* Create file-name entries */ + i = SZDIRE * 2; /* Top of file_name entries */ + nlen = nc1 = 0; wc = 1; + do { + dirb[i++] = ET_FILENAME; dirb[i++] = 0; + do { /* Fill name field */ + if (wc != 0 && (wc = lfn[nlen]) != 0) nlen++; /* Get a character if exist */ + st_word(dirb + i, wc); /* Store it */ + i += 2; + } while (i % SZDIRE != 0); + nc1++; + } while (lfn[nlen]); /* Fill next entry if any char follows */ + + dirb[XDIR_NumName] = nlen; /* Set name length */ + dirb[XDIR_NumSec] = 1 + nc1; /* Set secondary count (C0 + C1s) */ + st_word(dirb + XDIR_NameHash, xname_sum(lfn)); /* Set name hash */ +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_FS_EXFAT */ + + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ + +#define DIR_READ_FILE(dp) dir_read(dp, 0) +#define DIR_READ_LABEL(dp) dir_read(dp, 1) + +static FRESULT dir_read ( + DIR* dp, /* Pointer to the directory object */ + int vol /* Filtered by 0:file/directory or 1:volume label */ +) +{ + FRESULT res = FR_NO_FILE; + FATFS *fs = dp->obj.fs; + BYTE attr, b; +#if FF_USE_LFN + BYTE ord = 0xFF, sum = 0xFF; +#endif + + while (dp->sect) { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + b = dp->dir[DIR_Name]; /* Test for the entry type */ + if (b == 0) { + res = FR_NO_FILE; break; /* Reached to end of the directory */ + } +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + if (FF_USE_LABEL && vol) { + if (b == ET_VLABEL) break; /* Volume label entry? */ + } else { + if (b == ET_FILEDIR) { /* Start of the file entry block? */ + dp->blk_ofs = dp->dptr; /* Get location of the block */ + res = load_xdir(dp); /* Load the entry block */ + if (res == FR_OK) { + dp->obj.attr = fs->dirbuf[XDIR_Attr] & AM_MASK; /* Get attribute */ + } + break; + } + } + } else +#endif + { /* On the FAT/FAT32 volume */ + dp->obj.attr = attr = dp->dir[DIR_Attr] & AM_MASK; /* Get attribute */ +#if FF_USE_LFN /* LFN configuration */ + if (b == DDEM || b == '.' || (int)((attr & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (attr == AM_LFN) { /* An LFN entry is found */ + if (b & LLEF) { /* Is it start of an LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + b &= (BYTE)~LLEF; ord = b; + dp->blk_ofs = dp->dptr; + } + /* Check LFN validity and capture it */ + ord = (b == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord != 0 || sum != sum_sfn(dp->dir)) { /* Is there a valid LFN? */ + dp->blk_ofs = 0xFFFFFFFF; /* It has no LFN. */ + } + break; + } + } +#else /* Non LFN configuration */ + if (b != DDEM && b != '.' && attr != AM_LFN && (int)((attr & ~AM_ARC) == AM_VOL) == vol) { /* Is it a valid entry? */ + break; + } +#endif + } + res = dir_next(dp, 0); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dp->sect = 0; /* Terminate the read operation on error or EOT */ + return res; +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_USE_LABEL || FF_FS_RPATH >= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_find ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp /* Pointer to the directory object with the file name */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; + BYTE c; +#if FF_USE_LFN + BYTE a, ord, sum; +#endif + + res = dir_sdi(dp, 0); /* Rewind directory object */ + if (res != FR_OK) return res; +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + BYTE nc; + UINT di, ni; + WORD hash = xname_sum(fs->lfnbuf); /* Hash value of the name to find */ + + while ((res = DIR_READ_FILE(dp)) == FR_OK) { /* Read an item */ +#if FF_MAX_LFN < 255 + if (fs->dirbuf[XDIR_NumName] > FF_MAX_LFN) continue; /* Skip comparison if inaccessible object name */ +#endif + if (ld_word(fs->dirbuf + XDIR_NameHash) != hash) continue; /* Skip comparison if hash mismatched */ + for (nc = fs->dirbuf[XDIR_NumName], di = SZDIRE * 2, ni = 0; nc; nc--, di += 2, ni++) { /* Compare the name */ + if ((di % SZDIRE) == 0) di += 2; + if (ff_wtoupper(ld_word(fs->dirbuf + di)) != ff_wtoupper(fs->lfnbuf[ni])) break; + } + if (nc == 0 && !fs->lfnbuf[ni]) break; /* Name matched? */ + } + return res; + } +#endif + /* On the FAT/FAT32 volume */ +#if FF_USE_LFN + ord = sum = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ +#endif + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + c = dp->dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if FF_USE_LFN /* LFN configuration */ + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; + if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (!(dp->fn[NSFLAG] & NS_NOLFN)) { + if (c & LLEF) { /* Is it start of LFN sequence? */ + sum = dp->dir[LDIR_Chksum]; + c &= (BYTE)~LLEF; ord = c; /* LFN start order */ + dp->blk_ofs = dp->dptr; /* Start offset of LFN */ + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (ord == 0 && sum == sum_sfn(dp->dir)) break; /* LFN matched? */ + if (!(dp->fn[NSFLAG] & NS_LOSS) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* SFN matched? */ + ord = 0xFF; dp->blk_ofs = 0xFFFFFFFF; /* Reset LFN sequence */ + } + } +#else /* Non LFN configuration */ + dp->obj.attr = dp->dir[DIR_Attr] & AM_MASK; + if (!(dp->dir[DIR_Attr] & AM_VOL) && !mem_cmp(dp->dir, dp->fn, 11)) break; /* Is it a valid entry? */ +#endif + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_register ( /* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */ + DIR* dp /* Target directory with object name to be created */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if FF_USE_LFN /* LFN configuration */ + UINT n, nlen, nent; + BYTE sn[12], sum; + + + if (dp->fn[NSFLAG] & (NS_DOT | NS_NONAME)) return FR_INVALID_NAME; /* Check name validity */ + for (nlen = 0; fs->lfnbuf[nlen]; nlen++) ; /* Get lfn length */ + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + nent = (nlen + 14) / 15 + 2; /* Number of entries to allocate (85+C0+C1s) */ + res = dir_alloc(dp, nent); /* Allocate directory entries */ + if (res != FR_OK) return res; + dp->blk_ofs = dp->dptr - SZDIRE * (nent - 1); /* Set the allocated entry block offset */ + + if (dp->obj.stat & 4) { /* Has the directory been stretched by new allocation? */ + dp->obj.stat &= ~4; + res = fill_first_frag(&dp->obj); /* Fill the first fragment on the FAT if needed */ + if (res != FR_OK) return res; + res = fill_last_frag(&dp->obj, dp->clust, 0xFFFFFFFF); /* Fill the last fragment on the FAT if needed */ + if (res != FR_OK) return res; + if (dp->obj.sclust != 0) { /* Is it a sub-directory? */ + DIR dj; + + res = load_obj_xdir(&dj, &dp->obj); /* Load the object status */ + if (res != FR_OK) return res; + dp->obj.objsize += (DWORD)fs->csize * SS(fs); /* Increase the directory size by cluster size */ + st_qword(fs->dirbuf + XDIR_FileSize, dp->obj.objsize); /* Update the allocation status */ + st_qword(fs->dirbuf + XDIR_ValidFileSize, dp->obj.objsize); + fs->dirbuf[XDIR_GenFlags] = dp->obj.stat | 1; + res = store_xdir(&dj); /* Store the object status */ + if (res != FR_OK) return res; + } + } + + create_xdir(fs->dirbuf, fs->lfnbuf); /* Create on-memory directory block to be written later */ + return FR_OK; + } +#endif + /* On the FAT/FAT32 volume */ + mem_cpy(sn, dp->fn, 12); + if (sn[NSFLAG] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + dp->fn[NSFLAG] = NS_NOLFN; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(dp->fn, sn, fs->lfnbuf, n); /* Generate a numbered name */ + res = dir_find(dp); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + dp->fn[NSFLAG] = sn[NSFLAG]; + } + + /* Create an SFN with/without LFNs. */ + nent = (sn[NSFLAG] & NS_LFN) ? (nlen + 12) / 13 + 1 : 1; /* Number of entries to allocate */ + res = dir_alloc(dp, nent); /* Allocate entries */ + if (res == FR_OK && --nent) { /* Set LFN entry if needed */ + res = dir_sdi(dp, dp->dptr - nent * SZDIRE); + if (res == FR_OK) { + sum = sum_sfn(dp->fn); /* Checksum value of the SFN tied to the LFN */ + do { /* Store LFN entries in bottom first */ + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + put_lfn(fs->lfnbuf, dp->dir, (BYTE)nent, sum); + fs->wflag = 1; + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK && --nent); + } + } + +#else /* Non LFN configuration */ + res = dir_alloc(dp, 1); /* Allocate an entry for SFN */ + +#endif + + /* Set SFN entry */ + if (res == FR_OK) { + res = move_window(fs, dp->sect); + if (res == FR_OK) { + mem_set(dp->dir, 0, SZDIRE); /* Clean the entry */ + mem_cpy(dp->dir + DIR_Name, dp->fn, 11); /* Put SFN */ +#if FF_USE_LFN + dp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT); /* Put NT flag */ +#endif + fs->wflag = 1; + } + } + + return res; +} + +#endif /* !FF_FS_READONLY */ + + + +#if !FF_FS_READONLY && FF_FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ + +static FRESULT dir_remove ( /* FR_OK:Succeeded, FR_DISK_ERR:A disk error */ + DIR* dp /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; + FATFS *fs = dp->obj.fs; +#if FF_USE_LFN /* LFN configuration */ + DWORD last = dp->dptr; + + res = (dp->blk_ofs == 0xFFFFFFFF) ? FR_OK : dir_sdi(dp, dp->blk_ofs); /* Goto top of the entry block if LFN is exist */ + if (res == FR_OK) { + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) break; + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + dp->dir[XDIR_Type] &= 0x7F; /* Clear the entry InUse flag. */ + } else { /* On the FAT/FAT32 volume */ + dp->dir[DIR_Name] = DDEM; /* Mark the entry 'deleted'. */ + } + fs->wflag = 1; + if (dp->dptr >= last) break; /* If reached last entry then all entries of the object has been deleted. */ + res = dir_next(dp, 0); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } +#else /* Non LFN configuration */ + + res = move_window(fs, dp->sect); + if (res == FR_OK) { + dp->dir[DIR_Name] = DDEM; /* Mark the entry 'deleted'.*/ + fs->wflag = 1; + } +#endif + + return res; +} + +#endif /* !FF_FS_READONLY && FF_FS_MINIMIZE == 0 */ + + + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ + +static void get_fileinfo ( + DIR* dp, /* Pointer to the directory object */ + FILINFO* fno /* Pointer to the file information to be filled */ +) +{ + UINT si, di; +#if FF_USE_LFN + WCHAR wc, hs; + FATFS *fs = dp->obj.fs; +#else + TCHAR c; +#endif + + + fno->fname[0] = 0; /* Invaidate file info */ + if (dp->sect == 0) return; /* Exit if read pointer has reached end of directory */ + +#if FF_USE_LFN /* LFN configuration */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + get_xfileinfo(fs->dirbuf, fno); + return; + } else +#endif + { /* On the FAT/FAT32 volume */ + if (dp->blk_ofs != 0xFFFFFFFF) { /* Get LFN if available */ + si = di = hs = 0; + while (fs->lfnbuf[si] != 0) { + wc = fs->lfnbuf[si++]; /* Get an LFN character (UTF-16) */ + if (hs == 0 && IsSurrogate(wc)) { /* Is it a surrogate? */ + hs = wc; continue; /* Get low surrogate */ + } + wc = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di); /* Store it in UTF-16 or UTF-8 encoding */ + if (wc == 0) { di = 0; break; } /* Invalid char or buffer overflow? */ + di += wc; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + fno->fname[di] = 0; /* Terminate the LFN (null string means LFN is invalid) */ + } + } + + si = di = 0; + while (si < 11) { /* Get SFN from SFN entry */ + wc = dp->dir[si++]; /* Get a char */ + if (wc == ' ') continue; /* Skip padding spaces */ + if (wc == RDDEM) wc = DDEM; /* Restore replaced DDEM character */ + if (si == 9 && di < FF_SFN_BUF) fno->altname[di++] = '.'; /* Insert a . if extension is exist */ +#if FF_LFN_UNICODE >= 1 /* Unicode output */ + if (dbc_1st((BYTE)wc) && si != 8 && si != 11 && dbc_2nd(dp->dir[si])) { /* Make a DBC if needed */ + wc = wc << 8 | dp->dir[si++]; + } + wc = ff_oem2uni(wc, CODEPAGE); /* ANSI/OEM -> Unicode */ + if (wc == 0) { di = 0; break; } /* Wrong char in the current code page? */ + wc = put_utf(wc, &fno->altname[di], FF_SFN_BUF - di); /* Store it in Unicode */ + if (wc == 0) { di = 0; break; } /* Buffer overflow? */ + di += wc; +#else /* ANSI/OEM output */ + fno->altname[di++] = (TCHAR)wc; /* Store it without any conversion */ +#endif + } + fno->altname[di] = 0; /* Terminate the SFN (null string means SFN is invalid) */ + + if (fno->fname[0] == 0) { /* If LFN is invalid, altname[] needs to be copied to fname[] */ + if (di == 0) { /* If LFN and SFN both are invalid, this object is inaccesible */ + fno->fname[di++] = '?'; + } else { + for (si = di = 0; fno->altname[si]; si++, di++) { /* Copy altname[] to fname[] with case information */ + wc = (WCHAR)fno->altname[si]; + if (IsUpper(wc) && (dp->dir[DIR_NTres] & ((si >= 9) ? NS_EXT : NS_BODY))) wc += 0x20; + fno->fname[di] = (TCHAR)wc; + } + } + fno->fname[di] = 0; /* Terminate the LFN */ + if (!dp->dir[DIR_NTres]) fno->altname[0] = 0; /* Altname is not needed if neither LFN nor case info is exist. */ + } + +#else /* Non-LFN configuration */ + si = di = 0; + while (si < 11) { /* Copy name body and extension */ + c = (TCHAR)dp->dir[si++]; + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = DDEM; /* Restore replaced DDEM character */ + if (si == 9) fno->fname[di++] = '.';/* Insert a . if extension is exist */ + fno->fname[di++] = c; + } + fno->fname[di] = 0; +#endif + + fno->fattrib = dp->dir[DIR_Attr]; /* Attribute */ + fno->fsize = ld_dword(dp->dir + DIR_FileSize); /* Size */ + fno->ftime = ld_word(dp->dir + DIR_ModTime + 0); /* Time */ + fno->fdate = ld_word(dp->dir + DIR_ModTime + 2); /* Date */ +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 */ + + + +#if FF_USE_FIND && FF_FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Pattern matching */ +/*-----------------------------------------------------------------------*/ + +static DWORD get_achar ( /* Get a character and advances ptr */ + const TCHAR** ptr /* Pointer to pointer to the ANSI/OEM or Unicode string */ +) +{ + DWORD chr; + + +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 /* Unicode input */ + chr = tchar2uni(ptr); + if (chr == 0xFFFFFFFF) chr = 0; /* Wrong UTF encoding is recognized as end of the string */ + chr = ff_wtoupper(chr); + +#else /* ANSI/OEM input */ + chr = (BYTE)*(*ptr)++; /* Get a byte */ + if (IsLower(chr)) chr -= 0x20; /* To upper ASCII char */ +#if FF_CODE_PAGE == 0 + if (ExCvt && chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#elif FF_CODE_PAGE < 900 + if (chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#endif +#if FF_CODE_PAGE == 0 || FF_CODE_PAGE >= 900 + if (dbc_1st((BYTE)chr)) { /* Get DBC 2nd byte if needed */ + chr = dbc_2nd((BYTE)**ptr) ? chr << 8 | (BYTE)*(*ptr)++ : 0; + } +#endif + +#endif + return chr; +} + + +static int pattern_matching ( /* 0:not matched, 1:matched */ + const TCHAR* pat, /* Matching pattern */ + const TCHAR* nam, /* String to be tested */ + int skip, /* Number of pre-skip chars (number of ?s) */ + int inf /* Infinite search (* specified) */ +) +{ + const TCHAR *pp, *np; + DWORD pc, nc; + int nm, nx; + + + while (skip--) { /* Pre-skip name chars */ + if (!get_achar(&nam)) return 0; /* Branch mismatched if less name chars */ + } + if (*pat == 0 && inf) return 1; /* (short circuit) */ + + do { + pp = pat; np = nam; /* Top of pattern and name to match */ + for (;;) { + if (*pp == '?' || *pp == '*') { /* Wildcard? */ + nm = nx = 0; + do { /* Analyze the wildcard block */ + if (*pp++ == '?') nm++; else nx = 1; + } while (*pp == '?' || *pp == '*'); + if (pattern_matching(pp, np, nm, nx)) return 1; /* Test new branch (recurs upto number of wildcard blocks in the pattern) */ + nc = *np; break; /* Branch mismatched */ + } + pc = get_achar(&pp); /* Get a pattern char */ + nc = get_achar(&np); /* Get a name char */ + if (pc != nc) break; /* Branch mismatched? */ + if (pc == 0) return 1; /* Branch matched? (matched at end of both strings) */ + } + get_achar(&nam); /* nam++ */ + } while (inf && nc); /* Retry until end of name if infinite search is specified */ + + return 0; +} + +#endif /* FF_USE_FIND && FF_FS_MINIMIZE <= 1 */ + + + +/*-----------------------------------------------------------------------*/ +/* Pick a top segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static FRESULT create_name ( /* FR_OK: successful, FR_INVALID_NAME: could not create */ + DIR* dp, /* Pointer to the directory object */ + const TCHAR** path /* Pointer to pointer to the segment in the path string */ +) +{ +#if FF_USE_LFN /* LFN configuration */ + BYTE b, cf; + WCHAR wc, *lfn; + DWORD uc; + UINT i, ni, si, di; + const TCHAR *p; + + + /* Create LFN into LFN working buffer */ + p = *path; lfn = dp->obj.fs->lfnbuf; di = 0; + for (;;) { + uc = tchar2uni(&p); /* Get a character */ + if (uc == 0xFFFFFFFF) return FR_INVALID_NAME; /* Invalid code or UTF decode error */ + if (uc >= 0x10000) lfn[di++] = (WCHAR)(uc >> 16); /* Store high surrogate if needed */ + wc = (WCHAR)uc; + if (wc < ' ' || wc == '/' || wc == '\\') break; /* Break if end of the path or a separator is found */ + if (wc < 0x80 && chk_chr("\"*:<>\?|\x7F", wc)) return FR_INVALID_NAME; /* Reject illegal characters for LFN */ + if (di >= FF_MAX_LFN) return FR_INVALID_NAME; /* Reject too long name */ + lfn[di++] = wc; /* Store the Unicode character */ + } + while (*p == '/' || *p == '\\') p++; /* Skip duplicated separators if exist */ + *path = p; /* Return pointer to the next segment */ + cf = (wc < ' ') ? NS_LAST : 0; /* Set last segment flag if end of the path */ + +#if FF_FS_RPATH != 0 + if ((di == 1 && lfn[di - 1] == '.') || + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { /* Is this segment a dot name? */ + lfn[di] = 0; + for (i = 0; i < 11; i++) { /* Create dot name for SFN entry */ + dp->fn[i] = (i < di) ? '.' : ' '; + } + dp->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Snip off trailing spaces and dots if exist */ + wc = lfn[di - 1]; + if (wc != ' ' && wc != '.') break; + di--; + } + lfn[di] = 0; /* LFN is created into the working buffer */ + if (di == 0) return FR_INVALID_NAME; /* Reject null name */ + + /* Create SFN in directory form */ + for (si = 0; lfn[si] == ' '; si++) ; /* Remove leading spaces */ + if (si > 0 || lfn[si] == '.') cf |= NS_LOSS | NS_LFN; /* Is there any leading space or dot? */ + while (di > 0 && lfn[di - 1] != '.') di--; /* Find last dot (di<=si: no extension) */ + + mem_set(dp->fn, ' ', 11); + i = b = 0; ni = 8; + for (;;) { + wc = lfn[si++]; /* Get an LFN character */ + if (wc == 0) break; /* Break on end of the LFN */ + if (wc == ' ' || (wc == '.' && si != di)) { /* Remove embedded spaces and dots */ + cf |= NS_LOSS | NS_LFN; + continue; + } + + if (i >= ni || si == di) { /* End of field? */ + if (ni == 11) { /* Name extension overflow? */ + cf |= NS_LOSS | NS_LFN; + break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Name body overflow? */ + if (si > di) break; /* No name extension? */ + si = di; i = 8; ni = 11; b <<= 2; /* Enter name extension */ + continue; + } + + if (wc >= 0x80) { /* Is this a non-ASCII character? */ + cf |= NS_LFN; /* LFN entry needs to be created */ +#if FF_CODE_PAGE == 0 + if (ExCvt) { /* At SBCS */ + wc = ff_uni2oem(wc, CODEPAGE); /* Unicode ==> ANSI/OEM code */ + if (wc & 0x80) wc = ExCvt[wc & 0x7F]; /* Convert extended character to upper (SBCS) */ + } else { /* At DBCS */ + wc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE); /* Unicode ==> Upper convert ==> ANSI/OEM code */ + } +#elif FF_CODE_PAGE < 900 /* SBCS cfg */ + wc = ff_uni2oem(wc, CODEPAGE); /* Unicode ==> ANSI/OEM code */ + if (wc & 0x80) wc = ExCvt[wc & 0x7F]; /* Convert extended character to upper (SBCS) */ +#else /* DBCS cfg */ + wc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE); /* Unicode ==> Upper convert ==> ANSI/OEM code */ +#endif + } + + if (wc >= 0x100) { /* Is this a DBC? */ + if (i >= ni - 1) { /* Field overflow? */ + cf |= NS_LOSS | NS_LFN; + i = ni; continue; /* Next field */ + } + dp->fn[i++] = (BYTE)(wc >> 8); /* Put 1st byte */ + } else { /* SBC */ + if (wc == 0 || chk_chr("+,;=[]", wc)) { /* Replace illegal characters for SFN if needed */ + wc = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ + } else { + if (IsUpper(wc)) { /* ASCII upper case? */ + b |= 2; + } + if (IsLower(wc)) { /* ASCII lower case? */ + b |= 1; wc -= 0x20; + } + } + } + dp->fn[i++] = (BYTE)wc; + } + + if (dp->fn[0] == DDEM) dp->fn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + + if (ni == 8) b <<= 2; /* Shift capital flags if no extension */ + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) cf |= NS_LFN; /* LFN entry needs to be created if composite capitals */ + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended character, NT flags are created */ + if (b & 0x01) cf |= NS_EXT; /* NT flag (Extension has small capital letters only) */ + if (b & 0x04) cf |= NS_BODY; /* NT flag (Body has small capital letters only) */ + } + + dp->fn[NSFLAG] = cf; /* SFN is created into dp->fn[] */ + + return FR_OK; + + +#else /* FF_USE_LFN : Non-LFN configuration */ + BYTE c, d, *sfn; + UINT ni, si, i; + const char *p; + + /* Create file name in directory form */ + p = *path; sfn = dp->fn; + mem_set(sfn, ' ', 11); + si = i = 0; ni = 8; +#if FF_FS_RPATH != 0 + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = (BYTE)p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; + *path = p + si; /* Return pointer to the next segment */ + sfn[NSFLAG] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of the path */ + return FR_OK; + } +#endif + for (;;) { + c = (BYTE)p[si++]; /* Get a byte */ + if (c <= ' ') break; /* Break if end of the path name */ + if (c == '/' || c == '\\') { /* Break if a separator is found */ + while (p[si] == '/' || p[si] == '\\') si++; /* Skip duplicated separator if exist */ + break; + } + if (c == '.' || i >= ni) { /* End of body or field overflow? */ + if (ni == 11 || c != '.') return FR_INVALID_NAME; /* Field overflow or invalid dot? */ + i = 8; ni = 11; /* Enter file extension field */ + continue; + } +#if FF_CODE_PAGE == 0 + if (ExCvt && c >= 0x80) { /* Is SBC extended character? */ + c = ExCvt[c & 0x7F]; /* To upper SBC extended character */ + } +#elif FF_CODE_PAGE < 900 + if (c >= 0x80) { /* Is SBC extended character? */ + c = ExCvt[c & 0x7F]; /* To upper SBC extended character */ + } +#endif + if (dbc_1st(c)) { /* Check if it is a DBC 1st byte */ + d = (BYTE)p[si++]; /* Get 2nd byte */ + if (!dbc_2nd(d) || i >= ni - 1) return FR_INVALID_NAME; /* Reject invalid DBC */ + sfn[i++] = c; + sfn[i++] = d; + } else { /* SBC */ + if (chk_chr("\"*+,:;<=>\?[]|\x7F", c)) return FR_INVALID_NAME; /* Reject illegal chrs for SFN */ + if (IsLower(c)) c -= 0x20; /* To upper */ + sfn[i++] = c; + } + } + *path = p + si; /* Return pointer to the next segment */ + if (i == 0) return FR_INVALID_NAME; /* Reject nul string */ + + if (sfn[0] == DDEM) sfn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ + sfn[NSFLAG] = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of the path */ + + return FR_OK; +#endif /* FF_USE_LFN */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR* dp, /* Directory object to return last directory and found object */ + const TCHAR* path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE ns; + FATFS *fs = dp->obj.fs; + + +#if FF_FS_RPATH != 0 + if (*path != '/' && *path != '\\') { /* Without heading separator */ + dp->obj.sclust = fs->cdir; /* Start from current directory */ + } else +#endif + { /* With heading separator */ + while (*path == '/' || *path == '\\') path++; /* Strip heading separator */ + dp->obj.sclust = 0; /* Start from root directory */ + } +#if FF_FS_EXFAT + dp->obj.n_frag = 0; /* Invalidate last fragment counter of the object */ +#if FF_FS_RPATH != 0 + if (fs->fs_type == FS_EXFAT && dp->obj.sclust) { /* exFAT: Retrieve the sub-directory's status */ + DIR dj; + + dp->obj.c_scl = fs->cdc_scl; + dp->obj.c_size = fs->cdc_size; + dp->obj.c_ofs = fs->cdc_ofs; + res = load_obj_xdir(&dj, &dp->obj); + if (res != FR_OK) return res; + dp->obj.objsize = ld_dword(fs->dirbuf + XDIR_FileSize); + dp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + } +#endif +#endif + + if ((UINT)*path < ' ') { /* Null path name is the origin directory itself */ + dp->fn[NSFLAG] = NS_NONAME; + res = dir_sdi(dp, 0); + + } else { /* Follow path */ + for (;;) { + res = create_name(dp, &path); /* Get a segment name of the path */ + if (res != FR_OK) break; + res = dir_find(dp); /* Find an object with the segment name */ + ns = dp->fn[NSFLAG]; + if (res != FR_OK) { /* Failed to find the object */ + if (res == FR_NO_FILE) { /* Object is not found */ + if (FF_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exist, stay there */ + if (!(ns & NS_LAST)) continue; /* Continue to follow if not last segment */ + dp->fn[NSFLAG] = NS_NONAME; + res = FR_OK; + } else { /* Could not find the object */ + if (!(ns & NS_LAST)) res = FR_NO_PATH; /* Adjust error code if not last segment */ + } + } + break; + } + if (ns & NS_LAST) break; /* Last segment matched. Function completed. */ + /* Get into the sub-directory */ + if (!(dp->obj.attr & AM_DIR)) { /* It is not a sub-directory and cannot follow */ + res = FR_NO_PATH; break; + } +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* Save containing directory information for next dir */ + dp->obj.c_scl = dp->obj.sclust; + dp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat; + dp->obj.c_ofs = dp->blk_ofs; + init_alloc_info(fs, &dp->obj); /* Open next directory */ + } else +#endif + { + dp->obj.sclust = ld_clust(fs, fs->win + dp->dptr % SS(fs)); /* Open next directory */ + } + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get logical drive number from path name */ +/*-----------------------------------------------------------------------*/ + +static int get_ldnumber ( /* Returns logical drive number (-1:invalid drive number or null pointer) */ + const TCHAR** path /* Pointer to pointer to the path name */ +) +{ + const TCHAR *tp, *tt; + TCHAR tc; + int i, vol = -1; +#if FF_STR_VOLUME_ID /* Find string volume ID */ + const char *sp; + char c; +#endif + + tt = tp = *path; + if (!tp) return vol; /* Invalid path name? */ + do tc = *tt++; while ((UINT)tc >= (FF_USE_LFN ? ' ' : '!') && tc != ':'); /* Find a colon in the path */ + + if (tc == ':') { /* DOS/Windows style volume ID? */ + i = FF_VOLUMES; + if (IsDigit(*tp) && tp + 2 == tt) { /* Is there a numeric volume ID + colon? */ + i = (int)*tp - '0'; /* Get the LD number */ + } +#if FF_STR_VOLUME_ID == 1 /* Arbitrary string is enabled */ + else { + i = 0; + do { + sp = VolumeStr[i]; tp = *path; /* This string volume ID and path name */ + do { /* Compare the volume ID with path name */ + c = *sp++; tc = *tp++; + if (IsLower(c)) c -= 0x20; + if (IsLower(tc)) tc -= 0x20; + } while (c && (TCHAR)c == tc); + } while ((c || tp != tt) && ++i < FF_VOLUMES); /* Repeat for each id until pattern match */ + } +#endif + if (i < FF_VOLUMES) { /* If a volume ID is found, get the drive number and strip it */ + vol = i; /* Drive number */ + *path = tt; /* Snip the drive prefix off */ + } + return vol; + } +#if FF_STR_VOLUME_ID == 2 /* Unix style volume ID is enabled */ + if (*tp == '/') { + i = 0; + do { + sp = VolumeStr[i]; tp = *path; /* This string volume ID and path name */ + do { /* Compare the volume ID with path name */ + c = *sp++; tc = *(++tp); + if (IsLower(c)) c -= 0x20; + if (IsLower(tc)) tc -= 0x20; + } while (c && (TCHAR)c == tc); + } while ((c || (tc != '/' && (UINT)tc >= (FF_USE_LFN ? ' ' : '!'))) && ++i < FF_VOLUMES); /* Repeat for each ID until pattern match */ + if (i < FF_VOLUMES) { /* If a volume ID is found, get the drive number and strip it */ + vol = i; /* Drive number */ + *path = tp; /* Snip the drive prefix off */ + return vol; + } + } +#endif + /* No drive prefix is found */ +#if FF_FS_RPATH != 0 + vol = CurrVol; /* Default drive is current drive */ +#else + vol = 0; /* Default drive is 0 */ +#endif + return vol; /* Return the default drive */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load a sector and check if it is an FAT VBR */ +/*-----------------------------------------------------------------------*/ + +static BYTE check_fs ( /* 0:FAT, 1:exFAT, 2:Valid BS but not FAT, 3:Not a BS, 4:Disk error */ + FATFS* fs, /* Filesystem object */ + DWORD sect /* Sector# (lba) to load and check if it is an FAT-VBR or not */ +) +{ + fs->wflag = 0; fs->winsect = 0xFFFFFFFF; /* Invaidate window */ + if (move_window(fs, sect) != FR_OK) return 4; /* Load boot record */ + + if (ld_word(fs->win + BS_55AA) != 0xAA55) return 3; /* Check boot record signature (always here regardless of the sector size) */ + +#if FF_FS_EXFAT + if (!mem_cmp(fs->win + BS_JmpBoot, "\xEB\x76\x90" "EXFAT ", 11)) return 1; /* Check if exFAT VBR */ +#endif + if (fs->win[BS_JmpBoot] == 0xE9 || fs->win[BS_JmpBoot] == 0xEB || fs->win[BS_JmpBoot] == 0xE8) { /* Valid JumpBoot code? */ + if (!mem_cmp(fs->win + BS_FilSysType, "FAT", 3)) return 0; /* Is it an FAT VBR? */ + if (!mem_cmp(fs->win + BS_FilSysType32, "FAT32", 5)) return 0; /* Is it an FAT32 VBR? */ + } + return 2; /* Valid BS but not FAT */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Determine logical drive number and mount the volume if needed */ +/*-----------------------------------------------------------------------*/ + +static FRESULT find_volume ( /* FR_OK(0): successful, !=0: an error occurred */ + const TCHAR** path, /* Pointer to pointer to the path name (drive number) */ + FATFS** rfs, /* Pointer to pointer to the found filesystem object */ + BYTE mode /* !=0: Check write protection for write access */ +) +{ + BYTE fmt, *pt; + int vol; + DSTATUS stat; + DWORD bsect, fasize, tsect, sysect, nclst, szbfat, br[4]; + WORD nrsv; + FATFS *fs; + UINT i; + + + /* Get logical drive number */ + *rfs = 0; + vol = get_ldnumber(path); + if (vol < 0) return FR_INVALID_DRIVE; + + /* Check if the filesystem object is valid or not */ + fs = FatFs[vol]; /* Get pointer to the filesystem object */ + if (!fs) return FR_NOT_ENABLED; /* Is the filesystem object available? */ +#if FF_FS_REENTRANT + if (!lock_fs(fs)) return FR_TIMEOUT; /* Lock the volume */ +#endif + *rfs = fs; /* Return pointer to the filesystem object */ + + mode &= (BYTE)~FA_READ; /* Desired access mode, write access or not */ + if (fs->fs_type != 0) { /* If the volume has been mounted */ + stat = disk_status(fs->pdrv); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized */ + if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check write protection if needed */ + return FR_WRITE_PROTECTED; + } + return FR_OK; /* The filesystem object is valid */ + } + } + + /* The filesystem object is not valid. */ + /* Following code attempts to mount the volume. (analyze BPB and initialize the filesystem object) */ + + fs->fs_type = 0; /* Clear the filesystem object */ + fs->pdrv = LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->pdrv); /* Initialize the physical drive */ + if (stat & STA_NOINIT) { /* Check if the initialization succeeded */ + return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */ + } + if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; + } +#if FF_MAX_SS != FF_MIN_SS /* Get sector size (multiple sector size cfg only) */ + if (disk_ioctl(fs->pdrv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK) return FR_DISK_ERR; + if (SS(fs) > FF_MAX_SS || SS(fs) < FF_MIN_SS || (SS(fs) & (SS(fs) - 1))) return FR_DISK_ERR; +#endif + + /* Find an FAT partition on the drive. Supports only generic partitioning rules, FDISK (MBR) and SFD (w/o partition). */ + bsect = 0; + fmt = check_fs(fs, bsect); /* Load sector 0 and check if it is an FAT-VBR as SFD */ + if (fmt == 2 || (fmt < 2 && LD2PT(vol) != 0)) { /* Not an FAT-VBR or forced partition number */ + for (i = 0; i < 4; i++) { /* Get partition offset */ + pt = fs->win + (MBR_Table + i * SZ_PTE); + br[i] = pt[PTE_System] ? ld_dword(pt + PTE_StLba) : 0; + } + i = LD2PT(vol); /* Partition number: 0:auto, 1-4:forced */ + if (i != 0) i--; + do { /* Find an FAT volume */ + bsect = br[i]; + fmt = bsect ? check_fs(fs, bsect) : 3; /* Check the partition */ + } while (LD2PT(vol) == 0 && fmt >= 2 && ++i < 4); + } + if (fmt == 4) return FR_DISK_ERR; /* An error occured in the disk I/O layer */ + if (fmt >= 2) return FR_NO_FILESYSTEM; /* No FAT volume is found */ + + /* An FAT volume is found (bsect). Following code initializes the filesystem object */ + +#if FF_FS_EXFAT + if (fmt == 1) { + QWORD maxlba; + DWORD so, cv, bcl; + + for (i = BPB_ZeroedEx; i < BPB_ZeroedEx + 53 && fs->win[i] == 0; i++) ; /* Check zero filler */ + if (i < BPB_ZeroedEx + 53) return FR_NO_FILESYSTEM; + + if (ld_word(fs->win + BPB_FSVerEx) != 0x100) return FR_NO_FILESYSTEM; /* Check exFAT version (must be version 1.0) */ + + if (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) { /* (BPB_BytsPerSecEx must be equal to the physical sector size) */ + return FR_NO_FILESYSTEM; + } + + maxlba = ld_qword(fs->win + BPB_TotSecEx) + bsect; /* Last LBA + 1 of the volume */ + if (maxlba >= 0x100000000) return FR_NO_FILESYSTEM; /* (It cannot be handled in 32-bit LBA) */ + + fs->fsize = ld_dword(fs->win + BPB_FatSzEx); /* Number of sectors per FAT */ + + fs->n_fats = fs->win[BPB_NumFATsEx]; /* Number of FATs */ + if (fs->n_fats != 1) return FR_NO_FILESYSTEM; /* (Supports only 1 FAT) */ + + fs->csize = 1 << fs->win[BPB_SecPerClusEx]; /* Cluster size */ + if (fs->csize == 0) return FR_NO_FILESYSTEM; /* (Must be 1..32768) */ + + nclst = ld_dword(fs->win + BPB_NumClusEx); /* Number of clusters */ + if (nclst > MAX_EXFAT) return FR_NO_FILESYSTEM; /* (Too many clusters) */ + fs->n_fatent = nclst + 2; + + /* Boundaries and Limits */ + fs->volbase = bsect; + fs->database = bsect + ld_dword(fs->win + BPB_DataOfsEx); + fs->fatbase = bsect + ld_dword(fs->win + BPB_FatOfsEx); + if (maxlba < (QWORD)fs->database + nclst * fs->csize) return FR_NO_FILESYSTEM; /* (Volume size must not be smaller than the size requiered) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClusEx); + + /* Get bitmap location and check if it is contiguous (implementation assumption) */ + so = i = 0; + for (;;) { /* Find the bitmap entry in the root directory (in only first cluster) */ + if (i == 0) { + if (so >= fs->csize) return FR_NO_FILESYSTEM; /* Not found? */ + if (move_window(fs, clst2sect(fs, fs->dirbase) + so) != FR_OK) return FR_DISK_ERR; + so++; + } + if (fs->win[i] == ET_BITMAP) break; /* Is it a bitmap entry? */ + i = (i + SZDIRE) % SS(fs); /* Next entry */ + } + bcl = ld_dword(fs->win + i + 20); /* Bitmap cluster */ + if (bcl < 2 || bcl >= fs->n_fatent) return FR_NO_FILESYSTEM; + fs->bitbase = fs->database + fs->csize * (bcl - 2); /* Bitmap sector */ + for (;;) { /* Check if bitmap is contiguous */ + if (move_window(fs, fs->fatbase + bcl / (SS(fs) / 4)) != FR_OK) return FR_DISK_ERR; + cv = ld_dword(fs->win + bcl % (SS(fs) / 4) * 4); + if (cv == 0xFFFFFFFF) break; /* Last link? */ + if (cv != ++bcl) return FR_NO_FILESYSTEM; /* Fragmented? */ + } + +#if !FF_FS_READONLY + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ +#endif + fmt = FS_EXFAT; /* FAT sub-type */ + } else +#endif /* FF_FS_EXFAT */ + { + if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_BytsPerSec must be equal to the physical sector size) */ + + fasize = ld_word(fs->win + BPB_FATSz16); /* Number of sectors per FAT */ + if (fasize == 0) fasize = ld_dword(fs->win + BPB_FATSz32); + fs->fsize = fasize; + + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FATs */ + if (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */ + fasize *= fs->n_fats; /* Number of sectors for FAT area */ + + fs->csize = fs->win[BPB_SecPerClus]; /* Cluster size */ + if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM; /* (Must be power of 2) */ + + fs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt); /* Number of root directory entries */ + if (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM; /* (Must be sector aligned) */ + + tsect = ld_word(fs->win + BPB_TotSec16); /* Number of sectors on the volume */ + if (tsect == 0) tsect = ld_dword(fs->win + BPB_TotSec32); + + nrsv = ld_word(fs->win + BPB_RsvdSecCnt); /* Number of reserved sectors */ + if (nrsv == 0) return FR_NO_FILESYSTEM; /* (Must not be 0) */ + + /* Determine the FAT sub type */ + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE); /* RSV + FAT + DIR */ + if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ + if (nclst == 0) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + fmt = 0; + if (nclst <= MAX_FAT32) fmt = FS_FAT32; + if (nclst <= MAX_FAT16) fmt = FS_FAT16; + if (nclst <= MAX_FAT12) fmt = FS_FAT12; + if (fmt == 0) return FR_NO_FILESYSTEM; + + /* Boundaries and Limits */ + fs->n_fatent = nclst + 2; /* Number of FAT entries */ + fs->volbase = bsect; /* Volume start sector */ + fs->fatbase = bsect + nrsv; /* FAT start sector */ + fs->database = bsect + sysect; /* Data start sector */ + if (fmt == FS_FAT32) { + if (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM; /* (Must be FAT32 revision 0.0) */ + if (fs->n_rootdir != 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ + fs->dirbase = ld_dword(fs->win + BPB_RootClus32); /* Root directory start cluster */ + szbfat = fs->n_fatent * 4; /* (Needed FAT size) */ + } else { + if (fs->n_rootdir == 0) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ + fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ + szbfat = (fmt == FS_FAT16) ? /* (Needed FAT size) */ + fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); + } + if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM; /* (BPB_FATSz must not be less than the size needed) */ + +#if !FF_FS_READONLY + /* Get FSInfo if available */ + fs->last_clst = fs->free_clst = 0xFFFFFFFF; /* Initialize cluster allocation information */ + fs->fsi_flag = 0x80; +#if (FF_FS_NOFSINFO & 3) != 3 + if (fmt == FS_FAT32 /* Allow to update FSInfo only if BPB_FSInfo32 == 1 */ + && ld_word(fs->win + BPB_FSInfo32) == 1 + && move_window(fs, bsect + 1) == FR_OK) + { + fs->fsi_flag = 0; + if (ld_word(fs->win + BS_55AA) == 0xAA55 /* Load FSInfo data if available */ + && ld_dword(fs->win + FSI_LeadSig) == 0x41615252 + && ld_dword(fs->win + FSI_StrucSig) == 0x61417272) + { +#if (FF_FS_NOFSINFO & 1) == 0 + fs->free_clst = ld_dword(fs->win + FSI_Free_Count); +#endif +#if (FF_FS_NOFSINFO & 2) == 0 + fs->last_clst = ld_dword(fs->win + FSI_Nxt_Free); +#endif + } + } +#endif /* (FF_FS_NOFSINFO & 3) != 3 */ +#endif /* !FF_FS_READONLY */ + } + + fs->fs_type = fmt; /* FAT sub-type */ + fs->id = ++Fsid; /* Volume mount ID */ +#if FF_USE_LFN == 1 + fs->lfnbuf = LfnBuf; /* Static LFN working buffer */ +#if FF_FS_EXFAT + fs->dirbuf = DirBuf; /* Static directory block scratchpad buuffer */ +#endif +#endif +#if FF_FS_RPATH != 0 + fs->cdir = 0; /* Initialize current directory */ +#endif +#if FF_FS_LOCK != 0 /* Clear file lock semaphores */ + clear_lock(fs); +#endif + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/directory object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static FRESULT validate ( /* Returns FR_OK or FR_INVALID_OBJECT */ + FFOBJID* obj, /* Pointer to the FFOBJID, the 1st member in the FIL/DIR object, to check validity */ + FATFS** rfs /* Pointer to pointer to the owner filesystem object to return */ +) +{ + FRESULT res = FR_INVALID_OBJECT; + + + if (obj && obj->fs && obj->fs->fs_type && obj->id == obj->fs->id) { /* Test if the object is valid */ +#if FF_FS_REENTRANT + if (lock_fs(obj->fs)) { /* Obtain the filesystem object */ + if (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the phsical drive is kept initialized */ + res = FR_OK; + } else { + unlock_fs(obj->fs, FR_OK); + } + } else { + res = FR_TIMEOUT; + } +#else + if (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the phsical drive is kept initialized */ + res = FR_OK; + } +#endif + } + *rfs = (res == FR_OK) ? obj->fs : 0; /* Corresponding filesystem object */ + return res; +} + + + + +/*--------------------------------------------------------------------------- + + Public Functions (FatFs API) + +----------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Logical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + FATFS* fs, /* Pointer to the filesystem object (NULL:unmount)*/ + const TCHAR* path, /* Logical drive number to be mounted/unmounted */ + BYTE opt /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */ +) +{ + FATFS *cfs; + int vol; + FRESULT res; + const TCHAR *rp = path; + + + /* Get logical drive number */ + vol = get_ldnumber(&rp); + if (vol < 0) return FR_INVALID_DRIVE; + cfs = FatFs[vol]; /* Pointer to fs object */ + + if (cfs) { +#if FF_FS_LOCK != 0 + clear_lock(cfs); +#endif +#if FF_FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR; +#endif + cfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if FF_FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + if (opt == 0) return FR_OK; /* Do not mount now, it will be mounted later */ + + res = find_volume(&path, &fs, 0); /* Force mounted the volume */ + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL* fp, /* Pointer to the blank file object */ + const TCHAR* path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; +#if !FF_FS_READONLY + DWORD dw, cl, bcs, clst, sc; + FSIZE_t ofs; +#endif + DEF_NAMBUF + + + if (!fp) return FR_INVALID_OBJECT; + + /* Get logical drive number */ + mode &= FF_FS_READONLY ? FA_READ : FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_CREATE_NEW | FA_OPEN_ALWAYS | FA_OPEN_APPEND; + res = find_volume(&path, &fs, mode); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ +#if !FF_FS_READONLY /* Read/Write configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Origin directory itself? */ + res = FR_INVALID_NAME; + } +#if FF_FS_LOCK != 0 + else { + res = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0); /* Check if the file can be used */ + } +#endif + } + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) { /* There is no file to open, create a new entry */ +#if FF_FS_LOCK != 0 + res = enq_lock() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES; +#else + res = dir_register(&dj); +#endif + } + mode |= FA_CREATE_ALWAYS; /* File is created */ + } + else { /* Any object with the same name is already existing */ + if (dj.obj.attr & (AM_RDO | AM_DIR)) { /* Cannot overwrite it (R/O or DIR) */ + res = FR_DENIED; + } else { + if (mode & FA_CREATE_NEW) res = FR_EXIST; /* Cannot create as new file */ + } + } + if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate the file if overwrite mode */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + /* Get current allocation info */ + fp->obj.fs = fs; + init_alloc_info(fs, &fp->obj); + /* Set directory entry block initial state */ + mem_set(fs->dirbuf + 2, 0, 30); /* Clear 85 entry except for NumSec */ + mem_set(fs->dirbuf + 38, 0, 26); /* Clear C0 entry except for NumName and NameHash */ + fs->dirbuf[XDIR_Attr] = AM_ARC; + st_dword(fs->dirbuf + XDIR_CrtTime, GET_FATTIME()); + fs->dirbuf[XDIR_GenFlags] = 1; + res = store_xdir(&dj); + if (res == FR_OK && fp->obj.sclust != 0) { /* Remove the cluster chain if exist */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fs->last_clst = fp->obj.sclust - 1; /* Reuse the cluster hole */ + } + } else +#endif + { + /* Set directory entry initial state */ + cl = ld_clust(fs, dj.dir); /* Get current cluster chain */ + st_dword(dj.dir + DIR_CrtTime, GET_FATTIME()); /* Set created time */ + dj.dir[DIR_Attr] = AM_ARC; /* Reset attribute */ + st_clust(fs, dj.dir, 0); /* Reset file allocation info */ + st_dword(dj.dir + DIR_FileSize, 0); + fs->wflag = 1; + if (cl != 0) { /* Remove the cluster chain if exist */ + dw = fs->winsect; + res = remove_chain(&dj.obj, cl, 0); + if (res == FR_OK) { + res = move_window(fs, dw); + fs->last_clst = cl - 1; /* Reuse the cluster hole */ + } + } + } + } + } + else { /* Open an existing file */ + if (res == FR_OK) { /* Is the object exsiting? */ + if (dj.obj.attr & AM_DIR) { /* File open against a directory */ + res = FR_NO_FILE; + } else { + if ((mode & FA_WRITE) && (dj.obj.attr & AM_RDO)) { /* Write mode open against R/O file */ + res = FR_DENIED; + } + } + } + } + if (res == FR_OK) { + if (mode & FA_CREATE_ALWAYS) mode |= FA_MODIFIED; /* Set file change flag if created or overwritten */ + fp->dir_sect = fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; +#if FF_FS_LOCK != 0 + fp->obj.lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0); /* Lock the file for this session */ + if (fp->obj.lockid == 0) res = FR_INT_ERR; +#endif + } +#else /* R/O configuration */ + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { /* Is it origin directory itself? */ + res = FR_INVALID_NAME; + } else { + if (dj.obj.attr & AM_DIR) { /* Is it a directory? */ + res = FR_NO_FILE; + } + } + } +#endif + + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fp->obj.c_scl = dj.obj.sclust; /* Get containing directory info */ + fp->obj.c_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fp->obj.c_ofs = dj.blk_ofs; + init_alloc_info(fs, &fp->obj); + } else +#endif + { + fp->obj.sclust = ld_clust(fs, dj.dir); /* Get object allocation info */ + fp->obj.objsize = ld_dword(dj.dir + DIR_FileSize); + } +#if FF_USE_FASTSEEK + fp->cltbl = 0; /* Disable fast seek mode */ +#endif + fp->obj.fs = fs; /* Validate the file object */ + fp->obj.id = fs->id; + fp->flag = mode; /* Set file access mode */ + fp->err = 0; /* Clear error flag */ + fp->sect = 0; /* Invalidate current data sector */ + fp->fptr = 0; /* Set file pointer top of the file */ +#if !FF_FS_READONLY +#if !FF_FS_TINY + mem_set(fp->buf, 0, sizeof fp->buf); /* Clear sector buffer */ +#endif + if ((mode & FA_SEEKEND) && fp->obj.objsize > 0) { /* Seek to end of file if FA_OPEN_APPEND is specified */ + fp->fptr = fp->obj.objsize; /* Offset to seek */ + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size in byte */ + clst = fp->obj.sclust; /* Follow the cluster chain */ + for (ofs = fp->obj.objsize; res == FR_OK && ofs > bcs; ofs -= bcs) { + clst = get_fat(&fp->obj, clst); + if (clst <= 1) res = FR_INT_ERR; + if (clst == 0xFFFFFFFF) res = FR_DISK_ERR; + } + fp->clust = clst; + if (res == FR_OK && ofs % SS(fs)) { /* Fill sector buffer if not on the sector boundary */ + if ((sc = clst2sect(fs, clst)) == 0) { + res = FR_INT_ERR; + } else { + fp->sect = sc + (DWORD)(ofs / SS(fs)); +#if !FF_FS_TINY + if (disk_read(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) res = FR_DISK_ERR; +#endif + } + } + } +#endif + } + + FREE_NAMBUF(); + } + + if (res != FR_OK) fp->obj.fs = 0; /* Invalidate file object on error */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL* fp, /* Pointer to the file object */ + void* buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT* br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, cc, csect; + BYTE *rbuff = (BYTE*)buff; + + + *br = 0; /* Clear read byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + remain = fp->obj.objsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until btr bytes read */ + btr -= rcnt, *br += rcnt, rbuff += rcnt, fp->fptr += rcnt) { + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow cluster chain from the origin */ + } else { /* Middle or end of the file */ +#if FF_USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = get_fat(&fp->obj, fp->clust); /* Follow cluster chain on the FAT */ + } + } + if (clst < 2) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + sect = clst2sect(fs, fp->clust); /* Get current sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btr / SS(fs); /* When remaining bytes >= sector size, */ + if (cc > 0) { /* Read maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_read(fs->pdrv, rbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR); +#if !FF_FS_READONLY && FF_FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */ +#if FF_FS_TINY + if (fs->wflag && fs->winsect - sect < cc) { + mem_cpy(rbuff + ((fs->winsect - sect) * SS(fs)), fs->win, SS(fs)); + } +#else + if ((fp->flag & FA_DIRTY) && fp->sect - sect < cc) { + mem_cpy(rbuff + ((fp->sect - sect) * SS(fs)), fp->buf, SS(fs)); + } +#endif +#endif + rcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !FF_FS_TINY + if (fp->sect != sect) { /* Load data sector if not in cache */ +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Fill sector cache */ + } +#endif + fp->sect = sect; + } + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (rcnt > btr) rcnt = btr; /* Clip it by btr if needed */ +#if FF_FS_TINY + if (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window */ + mem_cpy(rbuff, fs->win + fp->fptr % SS(fs), rcnt); /* Extract partial sector */ +#else + mem_cpy(rbuff, fp->buf + fp->fptr % SS(fs), rcnt); /* Extract partial sector */ +#endif + } + + LEAVE_FF(fs, FR_OK); +} + + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL* fp, /* Pointer to the file object */ + const void* buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT* bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + UINT wcnt, cc, csect; + const BYTE *wbuff = (const BYTE*)buff; + + + *bw = 0; /* Clear write byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); /* Check validity */ + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + /* Check fptr wrap-around (file size cannot reach 4 GiB at FAT volume) */ + if ((!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) && (DWORD)(fp->fptr + btw) < (DWORD)fp->fptr) { + btw = (UINT)(0xFFFFFFFF - (DWORD)fp->fptr); + } + + for ( ; btw; /* Repeat until all data written */ + btw -= wcnt, *bw += wcnt, wbuff += wcnt, fp->fptr += wcnt, fp->obj.objsize = (fp->fptr > fp->obj.objsize) ? fp->fptr : fp->obj.objsize) { + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + csect = (UINT)(fp->fptr / SS(fs)) & (fs->csize - 1); /* Sector offset in the cluster */ + if (csect == 0) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->obj.sclust; /* Follow from the origin */ + if (clst == 0) { /* If no cluster is allocated, */ + clst = create_chain(&fp->obj, 0); /* create a new cluster chain */ + } + } else { /* On the middle or end of the file */ +#if FF_USE_FASTSEEK + if (fp->cltbl) { + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + } else +#endif + { + clst = create_chain(&fp->obj, fp->clust); /* Follow or stretch cluster chain on the FAT */ + } + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + if (fp->obj.sclust == 0) fp->obj.sclust = clst; /* Set start cluster if the first write */ + } +#if FF_FS_TINY + if (fs->winsect == fp->sect && sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Write-back sector cache */ +#else + if (fp->flag & FA_DIRTY) { /* Write-back sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + sect = clst2sect(fs, fp->clust); /* Get current sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; + cc = btw / SS(fs); /* When remaining bytes >= sector size, */ + if (cc > 0) { /* Write maximum contiguous sectors directly */ + if (csect + cc > fs->csize) { /* Clip at cluster boundary */ + cc = fs->csize - csect; + } + if (disk_write(fs->pdrv, wbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR); +#if FF_FS_MINIMIZE <= 2 +#if FF_FS_TINY + if (fs->winsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fs->win, wbuff + ((fs->winsect - sect) * SS(fs)), SS(fs)); + fs->wflag = 0; + } +#else + if (fp->sect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), SS(fs)); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif +#endif + wcnt = SS(fs) * cc; /* Number of bytes transferred */ + continue; + } +#if FF_FS_TINY + if (fp->fptr >= fp->obj.objsize) { /* Avoid silly cache filling on the growing edge */ + if (sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR); + fs->winsect = sect; + } +#else + if (fp->sect != sect && /* Fill sector cache with file data */ + fp->fptr < fp->obj.objsize && + disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +#endif + fp->sect = sect; + } + wcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (wcnt > btw) wcnt = btw; /* Clip it by btw if needed */ +#if FF_FS_TINY + if (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window */ + mem_cpy(fs->win + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ + fs->wflag = 1; +#else + mem_cpy(fp->buf + fp->fptr % SS(fs), wbuff, wcnt); /* Fit data to the sector */ + fp->flag |= FA_DIRTY; +#endif + } + + fp->flag |= FA_MODIFIED; /* Set file change flag */ + + LEAVE_FF(fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD tm; + BYTE *dir; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) { + if (fp->flag & FA_MODIFIED) { /* Is there any change to the file? */ +#if !FF_FS_TINY + if (fp->flag & FA_DIRTY) { /* Write-back cached data if needed */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) LEAVE_FF(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + /* Update the directory entry */ + tm = GET_FATTIME(); /* Modified time */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + res = fill_first_frag(&fp->obj); /* Fill first fragment on the FAT if needed */ + if (res == FR_OK) { + res = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF); /* Fill last fragment on the FAT if needed */ + } + if (res == FR_OK) { + DIR dj; + DEF_NAMBUF + + INIT_NAMBUF(fs); + res = load_obj_xdir(&dj, &fp->obj); /* Load directory entry block */ + if (res == FR_OK) { + fs->dirbuf[XDIR_Attr] |= AM_ARC; /* Set archive attribute to indicate that the file has been changed */ + fs->dirbuf[XDIR_GenFlags] = fp->obj.stat | 1; /* Update file allocation information */ + st_dword(fs->dirbuf + XDIR_FstClus, fp->obj.sclust); + st_qword(fs->dirbuf + XDIR_FileSize, fp->obj.objsize); + st_qword(fs->dirbuf + XDIR_ValidFileSize, fp->obj.objsize); + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Update modified time */ + fs->dirbuf[XDIR_ModTime10] = 0; + st_dword(fs->dirbuf + XDIR_AccTime, 0); + res = store_xdir(&dj); /* Restore it to the directory */ + if (res == FR_OK) { + res = sync_fs(fs); + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + FREE_NAMBUF(); + } + } else +#endif + { + res = move_window(fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive attribute to indicate that the file has been changed */ + st_clust(fp->obj.fs, dir, fp->obj.sclust); /* Update file allocation information */ + st_dword(dir + DIR_FileSize, (DWORD)fp->obj.objsize); /* Update file size */ + st_dword(dir + DIR_ModTime, tm); /* Update modified time */ + st_word(dir + DIR_LstAccDate, 0); + fs->wflag = 1; + res = sync_fs(fs); /* Restore it to the directory */ + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL* fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + +#if !FF_FS_READONLY + res = f_sync(fp); /* Flush cached data */ + if (res == FR_OK) +#endif + { + res = validate(&fp->obj, &fs); /* Lock volume */ + if (res == FR_OK) { +#if FF_FS_LOCK != 0 + res = dec_lock(fp->obj.lockid); /* Decrement file open counter */ + if (res == FR_OK) fp->obj.fs = 0; /* Invalidate file object */ +#else + fp->obj.fs = 0; /* Invalidate file object */ +#endif +#if FF_FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + } + return res; +} + + + + +#if FF_FS_RPATH >= 1 +/*-----------------------------------------------------------------------*/ +/* Change Current Directory or Current Drive, Get Current Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chdrive ( + const TCHAR* path /* Drive number to set */ +) +{ + int vol; + + + /* Get logical drive number */ + vol = get_ldnumber(&path); + if (vol < 0) return FR_INVALID_DRIVE; + CurrVol = (BYTE)vol; /* Set it as current volume */ + + return FR_OK; +} + + + +FRESULT f_chdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ +#if FF_STR_VOLUME_ID == 2 + UINT i; +#endif + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { /* Is it the start directory itself? */ + fs->cdir = dj.obj.sclust; +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdc_scl = dj.obj.c_scl; + fs->cdc_size = dj.obj.c_size; + fs->cdc_ofs = dj.obj.c_ofs; + } +#endif + } else { + if (dj.obj.attr & AM_DIR) { /* It is a sub-directory */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdir = ld_dword(fs->dirbuf + XDIR_FstClus); /* Sub-directory cluster */ + fs->cdc_scl = dj.obj.sclust; /* Save containing directory information */ + fs->cdc_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fs->cdc_ofs = dj.blk_ofs; + } else +#endif + { + fs->cdir = ld_clust(fs, dj.dir); /* Sub-directory cluster */ + } + } else { + res = FR_NO_PATH; /* Reached but a file */ + } + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; +#if FF_STR_VOLUME_ID == 2 /* Also current drive is changed at Unix style volume ID */ + if (res == FR_OK) { + for (i = FF_VOLUMES - 1; i && fs != FatFs[i]; i--) ; /* Set current drive */ + CurrVol = (BYTE)i; + } +#endif + } + + LEAVE_FF(fs, res); +} + + +#if FF_FS_RPATH >= 2 +FRESULT f_getcwd ( + TCHAR* buff, /* Pointer to the directory path */ + UINT len /* Size of buff in unit of TCHAR */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT i, n; + DWORD ccl; + TCHAR *tp = buff; +#if FF_VOLUMES >= 2 + UINT vl; +#endif +#if FF_STR_VOLUME_ID + const char *vp; +#endif + FILINFO fno; + DEF_NAMBUF + + + /* Get logical drive */ + buff[0] = 0; /* Set null string to get current volume */ + res = find_volume((const TCHAR**)&buff, &fs, 0); /* Get current volume */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + + /* Follow parent directories and create the path */ + i = len; /* Bottom of buffer (directory stack base) */ + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { /* (Cannot do getcwd on exFAT and returns root path) */ + dj.obj.sclust = fs->cdir; /* Start to follow upper directory from current directory */ + while ((ccl = dj.obj.sclust) != 0) { /* Repeat while current directory is a sub-directory */ + res = dir_sdi(&dj, 1 * SZDIRE); /* Get parent directory */ + if (res != FR_OK) break; + res = move_window(fs, dj.sect); + if (res != FR_OK) break; + dj.obj.sclust = ld_clust(fs, dj.dir); /* Goto parent directory */ + res = dir_sdi(&dj, 0); + if (res != FR_OK) break; + do { /* Find the entry links to the child directory */ + res = DIR_READ_FILE(&dj); + if (res != FR_OK) break; + if (ccl == ld_clust(fs, dj.dir)) break; /* Found the entry */ + res = dir_next(&dj, 0); + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */ + if (res != FR_OK) break; + get_fileinfo(&dj, &fno); /* Get the directory name and push it to the buffer */ + for (n = 0; fno.fname[n]; n++) ; /* Name length */ + if (i < n + 1) { /* Insufficient space to store the path name? */ + res = FR_NOT_ENOUGH_CORE; break; + } + while (n) buff[--i] = fno.fname[--n]; /* Stack the name */ + buff[--i] = '/'; + } + } + if (res == FR_OK) { + if (i == len) buff[--i] = '/'; /* Is it the root-directory? */ +#if FF_VOLUMES >= 2 /* Put drive prefix */ + vl = 0; +#if FF_STR_VOLUME_ID >= 1 /* String volume ID */ + for (n = 0, vp = (const char*)VolumeStr[CurrVol]; vp[n]; n++) ; + if (i >= n + 2) { + if (FF_STR_VOLUME_ID == 2) *tp++ = (TCHAR)'/'; + for (vl = 0; vl < n; *tp++ = (TCHAR)vp[vl], vl++) ; + if (FF_STR_VOLUME_ID == 1) *tp++ = (TCHAR)':'; + vl++; + } +#else /* Numeric volume ID */ + if (i >= 3) { + *tp++ = (TCHAR)'0' + CurrVol; + *tp++ = (TCHAR)':'; + vl = 2; + } +#endif + if (vl == 0) res = FR_NOT_ENOUGH_CORE; +#endif + /* Add current directory path */ + if (res == FR_OK) { + do *tp++ = buff[i++]; while (i < len); /* Copy stacked path string */ + } + } + FREE_NAMBUF(); + } + + *tp = 0; + LEAVE_FF(fs, res); +} + +#endif /* FF_FS_RPATH >= 2 */ +#endif /* FF_FS_RPATH >= 1 */ + + + +#if FF_FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File Read/Write Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t ofs /* File pointer from top of file */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, bcs, nsect; + FSIZE_t ifptr; +#if FF_USE_FASTSEEK + DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl; +#endif + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) res = (FRESULT)fp->err; +#if FF_FS_EXFAT && !FF_FS_READONLY + if (res == FR_OK && fs->fs_type == FS_EXFAT) { + res = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF); /* Fill last fragment on the FAT if needed */ + } +#endif + if (res != FR_OK) LEAVE_FF(fs, res); + +#if FF_USE_FASTSEEK + if (fp->cltbl) { /* Fast seek */ + if (ofs == CREATE_LINKMAP) { /* Create CLMT */ + tbl = fp->cltbl; + tlen = *tbl++; ulen = 2; /* Given table size and required table size */ + cl = fp->obj.sclust; /* Origin of the chain */ + if (cl != 0) { + do { + /* Get a fragment */ + tcl = cl; ncl = 0; ulen += 2; /* Top, length and used items */ + do { + pcl = cl; ncl++; + cl = get_fat(&fp->obj, cl); + if (cl <= 1) ABORT(fs, FR_INT_ERR); + if (cl == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + } while (cl == pcl + 1); + if (ulen <= tlen) { /* Store the length and top of the fragment */ + *tbl++ = ncl; *tbl++ = tcl; + } + } while (cl < fs->n_fatent); /* Repeat until end of chain */ + } + *fp->cltbl = ulen; /* Number of items used */ + if (ulen <= tlen) { + *tbl = 0; /* Terminate table */ + } else { + res = FR_NOT_ENOUGH_CORE; /* Given table size is smaller than required */ + } + } else { /* Fast seek */ + if (ofs > fp->obj.objsize) ofs = fp->obj.objsize; /* Clip offset at the file size */ + fp->fptr = ofs; /* Set file pointer */ + if (ofs > 0) { + fp->clust = clmt_clust(fp, ofs - 1); + dsc = clst2sect(fs, fp->clust); + if (dsc == 0) ABORT(fs, FR_INT_ERR); + dsc += (DWORD)((ofs - 1) / SS(fs)) & (fs->csize - 1); + if (fp->fptr % SS(fs) && dsc != fp->sect) { /* Refill sector cache if needed */ +#if !FF_FS_TINY +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, dsc, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Load current sector */ +#endif + fp->sect = dsc; + } + } + } + } else +#endif + + /* Normal Seek */ + { +#if FF_FS_EXFAT + if (fs->fs_type != FS_EXFAT && ofs >= 0x100000000) ofs = 0xFFFFFFFF; /* Clip at 4 GiB - 1 if at FATxx */ +#endif + if (ofs > fp->obj.objsize && (FF_FS_READONLY || !(fp->flag & FA_WRITE))) { /* In read-only mode, clip offset with the file size */ + ofs = fp->obj.objsize; + } + ifptr = fp->fptr; + fp->fptr = nsect = 0; + if (ofs > 0) { + bcs = (DWORD)fs->csize * SS(fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(FSIZE_t)(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->clust; + } else { /* When seek to back cluster, */ + clst = fp->obj.sclust; /* start from the first cluster */ +#if !FF_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(&fp->obj, 0); + if (clst == 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->obj.sclust = clst; + } +#endif + fp->clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ + ofs -= bcs; fp->fptr += bcs; +#if !FF_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + if (FF_FS_EXFAT && fp->fptr > fp->obj.objsize) { /* No FAT chain object needs correct objsize to generate FAT value */ + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + clst = create_chain(&fp->obj, clst); /* Follow chain with forceed stretch */ + if (clst == 0) { /* Clip file size in case of disk full */ + ofs = 0; break; + } + } else +#endif + { + clst = get_fat(&fp->obj, clst); /* Follow cluster chain if not in write mode */ + } + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fs->n_fatent) ABORT(fs, FR_INT_ERR); + fp->clust = clst; + } + fp->fptr += ofs; + if (ofs % SS(fs)) { + nsect = clst2sect(fs, clst); /* Current sector */ + if (nsect == 0) ABORT(fs, FR_INT_ERR); + nsect += (DWORD)(ofs / SS(fs)); + } + } + } + if (!FF_FS_READONLY && fp->fptr > fp->obj.objsize) { /* Set file change flag if the file size is extended */ + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + if (fp->fptr % SS(fs) && nsect != fp->sect) { /* Fill sector cache if needed */ +#if !FF_FS_TINY +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, nsect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); /* Fill sector cache */ +#endif + fp->sect = nsect; + } + } + + LEAVE_FF(fs, res); +} + + + +#if FF_FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directory Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR* dp, /* Pointer to directory object to create */ + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMBUF + + + if (!dp) return FR_INVALID_OBJECT; + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + dp->obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(dp, path); /* Follow the path to the directory */ + if (res == FR_OK) { /* Follow completed */ + if (!(dp->fn[NSFLAG] & NS_NONAME)) { /* It is not the origin directory itself */ + if (dp->obj.attr & AM_DIR) { /* This object is a sub-directory */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + dp->obj.c_scl = dp->obj.sclust; /* Get containing directory inforamation */ + dp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat; + dp->obj.c_ofs = dp->blk_ofs; + init_alloc_info(fs, &dp->obj); /* Get object allocation info */ + } else +#endif + { + dp->obj.sclust = ld_clust(fs, dp->dir); /* Get object allocation info */ + } + } else { /* This object is a file */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + dp->obj.id = fs->id; + res = dir_sdi(dp, 0); /* Rewind directory */ +#if FF_FS_LOCK != 0 + if (res == FR_OK) { + if (dp->obj.sclust != 0) { + dp->obj.lockid = inc_lock(dp, 0); /* Lock the sub directory */ + if (!dp->obj.lockid) res = FR_TOO_MANY_OPEN_FILES; + } else { + dp->obj.lockid = 0; /* Root directory need not to be locked */ + } + } +#endif + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + if (res != FR_OK) dp->obj.fs = 0; /* Invalidate the directory object if function faild */ + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Close Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_closedir ( + DIR *dp /* Pointer to the directory object to be closed */ +) +{ + FRESULT res; + FATFS *fs; + + + res = validate(&dp->obj, &fs); /* Check validity of the file object */ + if (res == FR_OK) { +#if FF_FS_LOCK != 0 + if (dp->obj.lockid) res = dec_lock(dp->obj.lockid); /* Decrement sub-directory open counter */ + if (res == FR_OK) dp->obj.fs = 0; /* Invalidate directory object */ +#else + dp->obj.fs = 0; /* Invalidate directory object */ +#endif +#if FF_FS_REENTRANT + unlock_fs(fs, FR_OK); /* Unlock volume */ +#endif + } + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entries in Sequence */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMBUF + + + res = validate(&dp->obj, &fs); /* Check validity of the directory object */ + if (res == FR_OK) { + if (!fno) { + res = dir_sdi(dp, 0); /* Rewind the directory object */ + } else { + INIT_NAMBUF(fs); + res = DIR_READ_FILE(dp); /* Read an item */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory */ + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dp, fno); /* Get the object information */ + res = dir_next(dp, 0); /* Increment index for next */ + if (res == FR_NO_FILE) res = FR_OK; /* Ignore end of directory now */ + } + FREE_NAMBUF(); + } + } + LEAVE_FF(fs, res); +} + + + +#if FF_USE_FIND +/*-----------------------------------------------------------------------*/ +/* Find Next File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findnext ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to the file information structure */ +) +{ + FRESULT res; + + + for (;;) { + res = f_readdir(dp, fno); /* Get a directory item */ + if (res != FR_OK || !fno || !fno->fname[0]) break; /* Terminate if any error or end of directory */ + if (pattern_matching(dp->pat, fno->fname, 0, 0)) break; /* Test for the file name */ +#if FF_USE_LFN && FF_USE_FIND == 2 + if (pattern_matching(dp->pat, fno->altname, 0, 0)) break; /* Test for alternative name if exist */ +#endif + } + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Find First File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findfirst ( + DIR* dp, /* Pointer to the blank directory object */ + FILINFO* fno, /* Pointer to the file information structure */ + const TCHAR* path, /* Pointer to the directory to open */ + const TCHAR* pattern /* Pointer to the matching pattern */ +) +{ + FRESULT res; + + + dp->pat = pattern; /* Save pointer to pattern string */ + res = f_opendir(dp, path); /* Open the target directory */ + if (res == FR_OK) { + res = f_findnext(dp, fno); /* Find the first item */ + } + return res; +} + +#endif /* FF_USE_FIND */ + + + +#if FF_FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const TCHAR* path, /* Pointer to the file path */ + FILINFO* fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &dj.obj.fs, 0); + if (res == FR_OK) { + INIT_NAMBUF(dj.obj.fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.fn[NSFLAG] & NS_NONAME) { /* It is origin directory */ + res = FR_INVALID_NAME; + } else { /* Found an object */ + if (fno) get_fileinfo(&dj, fno); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(dj.obj.fs, res); +} + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const TCHAR* path, /* Logical drive number */ + DWORD* nclst, /* Pointer to a variable to return number of free clusters */ + FATFS** fatfs /* Pointer to return pointer to corresponding filesystem object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD nfree, clst, sect, stat; + UINT i; + FFOBJID obj; + + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + if (res == FR_OK) { + *fatfs = fs; /* Return ptr to the fs object */ + /* If free_clst is valid, return it without full FAT scan */ + if (fs->free_clst <= fs->n_fatent - 2) { + *nclst = fs->free_clst; + } else { + /* Scan FAT to obtain number of free clusters */ + nfree = 0; + if (fs->fs_type == FS_FAT12) { /* FAT12: Scan bit field FAT entries */ + clst = 2; obj.fs = fs; + do { + stat = get_fat(&obj, clst); + if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (stat == 1) { res = FR_INT_ERR; break; } + if (stat == 0) nfree++; + } while (++clst < fs->n_fatent); + } else { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* exFAT: Scan allocation bitmap */ + BYTE bm; + UINT b; + + clst = fs->n_fatent - 2; /* Number of clusters */ + sect = fs->bitbase; /* Bitmap sector */ + i = 0; /* Offset in the sector */ + do { /* Counts numbuer of bits with zero in the bitmap */ + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + } + for (b = 8, bm = fs->win[i]; b && clst; b--, clst--) { + if (!(bm & 1)) nfree++; + bm >>= 1; + } + i = (i + 1) % SS(fs); + } while (clst); + } else +#endif + { /* FAT16/32: Scan WORD/DWORD FAT entries */ + clst = fs->n_fatent; /* Number of entries */ + sect = fs->fatbase; /* Top of the FAT */ + i = 0; /* Offset in the sector */ + do { /* Counts numbuer of entries with zero in the FAT */ + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + } + if (fs->fs_type == FS_FAT16) { + if (ld_word(fs->win + i) == 0) nfree++; + i += 2; + } else { + if ((ld_dword(fs->win + i) & 0x0FFFFFFF) == 0) nfree++; + i += 4; + } + i %= SS(fs); + } while (--clst); + } + } + *nclst = nfree; /* Return the free clusters */ + fs->free_clst = nfree; /* Now free_clst is valid */ + fs->fsi_flag |= 1; /* FAT32: FSInfo is to be updated */ + } + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL* fp /* Pointer to the file object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD ncl; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + if (fp->fptr < fp->obj.objsize) { /* Process when fptr is not on the eof */ + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fp->obj.sclust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(&fp->obj, fp->clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fs->n_fatent) { + res = remove_chain(&fp->obj, ncl, fp->clust); + } + } + fp->obj.objsize = fp->fptr; /* Set file size to current read/write point */ + fp->flag |= FA_MODIFIED; +#if !FF_FS_TINY + if (res == FR_OK && (fp->flag & FA_DIRTY)) { + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) { + res = FR_DISK_ERR; + } else { + fp->flag &= (BYTE)~FA_DIRTY; + } + } +#endif + if (res != FR_OK) ABORT(fs, res); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const TCHAR* path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + DWORD dclst = 0; + FATFS *fs; +#if FF_FS_EXFAT + FFOBJID obj; +#endif + DEF_NAMBUF + + + /* Get logical drive */ + res = find_volume(&path, &fs, FA_WRITE); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (FF_FS_RPATH && res == FR_OK && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; /* Cannot remove dot entry */ + } +#if FF_FS_LOCK != 0 + if (res == FR_OK) res = chk_lock(&dj, 2); /* Check if it is an open object */ +#endif + if (res == FR_OK) { /* The object is accessible */ + if (dj.fn[NSFLAG] & NS_NONAME) { + res = FR_INVALID_NAME; /* Cannot remove the origin directory */ + } else { + if (dj.obj.attr & AM_RDO) { + res = FR_DENIED; /* Cannot remove R/O object */ + } + } + if (res == FR_OK) { +#if FF_FS_EXFAT + obj.fs = fs; + if (fs->fs_type == FS_EXFAT) { + init_alloc_info(fs, &obj); + dclst = obj.sclust; + } else +#endif + { + dclst = ld_clust(fs, dj.dir); + } + if (dj.obj.attr & AM_DIR) { /* Is it a sub-directory? */ +#if FF_FS_RPATH != 0 + if (dclst == fs->cdir) { /* Is it the current directory? */ + res = FR_DENIED; + } else +#endif + { + sdj.obj.fs = fs; /* Open the sub-directory */ + sdj.obj.sclust = dclst; +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + sdj.obj.objsize = obj.objsize; + sdj.obj.stat = obj.stat; + } +#endif + res = dir_sdi(&sdj, 0); + if (res == FR_OK) { + res = DIR_READ_FILE(&sdj); /* Test if the directory is empty */ + if (res == FR_OK) res = FR_DENIED; /* Not empty? */ + if (res == FR_NO_FILE) res = FR_OK; /* Empty? */ + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj); /* Remove the directory entry */ + if (res == FR_OK && dclst != 0) { /* Remove the cluster chain if exist */ +#if FF_FS_EXFAT + res = remove_chain(&obj, dclst, 0); +#else + res = remove_chain(&dj.obj, dclst, 0); +#endif + } + if (res == FR_OK) res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const TCHAR* path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + FFOBJID sobj; + FATFS *fs; + DWORD dcl, pcl, tm; + DEF_NAMBUF + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Name collision? */ + if (FF_FS_RPATH && res == FR_NO_FILE && (dj.fn[NSFLAG] & NS_DOT)) { /* Invalid name? */ + res = FR_INVALID_NAME; + } + if (res == FR_NO_FILE) { /* It is clear to create a new directory */ + sobj.fs = fs; /* New object id to create a new chain */ + dcl = create_chain(&sobj, 0); /* Allocate a cluster for the new directory */ + res = FR_OK; + if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster? */ + if (dcl == 1) res = FR_INT_ERR; /* Any insanity? */ + if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR; /* Disk error? */ + tm = GET_FATTIME(); + if (res == FR_OK) { + res = dir_clear(fs, dcl); /* Clean up the new table */ + if (res == FR_OK) { + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { /* Create dot entries (FAT only) */ + mem_set(fs->win + DIR_Name, ' ', 11); /* Create "." entry */ + fs->win[DIR_Name] = '.'; + fs->win[DIR_Attr] = AM_DIR; + st_dword(fs->win + DIR_ModTime, tm); + st_clust(fs, fs->win, dcl); + mem_cpy(fs->win + SZDIRE, fs->win, SZDIRE); /* Create ".." entry */ + fs->win[SZDIRE + 1] = '.'; pcl = dj.obj.sclust; + st_clust(fs, fs->win + SZDIRE, pcl); + fs->wflag = 1; + } + res = dir_register(&dj); /* Register the object to the parent directoy */ + } + } + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* Initialize directory entry block */ + st_dword(fs->dirbuf + XDIR_ModTime, tm); /* Created time */ + st_dword(fs->dirbuf + XDIR_FstClus, dcl); /* Table start cluster */ + st_dword(fs->dirbuf + XDIR_FileSize, (DWORD)fs->csize * SS(fs)); /* File size needs to be valid */ + st_dword(fs->dirbuf + XDIR_ValidFileSize, (DWORD)fs->csize * SS(fs)); + fs->dirbuf[XDIR_GenFlags] = 3; /* Initialize the object flag */ + fs->dirbuf[XDIR_Attr] = AM_DIR; /* Attribute */ + res = store_xdir(&dj); + } else +#endif + { + st_dword(dj.dir + DIR_ModTime, tm); /* Created time */ + st_clust(fs, dj.dir, dcl); /* Table start cluster */ + dj.dir[DIR_Attr] = AM_DIR; /* Attribute */ + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } else { + remove_chain(&sobj, dcl, 0); /* Could not register, remove the allocated cluster */ + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename a File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const TCHAR* path_old, /* Pointer to the object name to be renamed */ + const TCHAR* path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR djo, djn; + FATFS *fs; + BYTE buf[FF_FS_EXFAT ? SZDIRE * 2 : SZDIRE], *dir; + DWORD dw; + DEF_NAMBUF + + + get_ldnumber(&path_new); /* Snip the drive number of new name off */ + res = find_volume(&path_old, &fs, FA_WRITE); /* Get logical drive of the old object */ + if (res == FR_OK) { + djo.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&djo, path_old); /* Check old object */ + if (res == FR_OK && (djo.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check validity of name */ +#if FF_FS_LOCK != 0 + if (res == FR_OK) { + res = chk_lock(&djo, 2); + } +#endif + if (res == FR_OK) { /* Object to be renamed is found */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* At exFAT volume */ + BYTE nf, nn; + WORD nh; + + mem_cpy(buf, fs->dirbuf, SZDIRE * 2); /* Save 85+C0 entry of old object */ + mem_cpy(&djn, &djo, sizeof djo); + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) { /* Is new name already in use by any other object? */ + res = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST; + } + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + nf = fs->dirbuf[XDIR_NumSec]; nn = fs->dirbuf[XDIR_NumName]; + nh = ld_word(fs->dirbuf + XDIR_NameHash); + mem_cpy(fs->dirbuf, buf, SZDIRE * 2); /* Restore 85+C0 entry */ + fs->dirbuf[XDIR_NumSec] = nf; fs->dirbuf[XDIR_NumName] = nn; + st_word(fs->dirbuf + XDIR_NameHash, nh); + if (!(fs->dirbuf[XDIR_Attr] & AM_DIR)) fs->dirbuf[XDIR_Attr] |= AM_ARC; /* Set archive attribute if it is a file */ +/* Start of critical section where an interruption can cause a cross-link */ + res = store_xdir(&djn); + } + } + } else +#endif + { /* At FAT/FAT32 volume */ + mem_cpy(buf, djo.dir, SZDIRE); /* Save directory entry of the object */ + mem_cpy(&djn, &djo, sizeof (DIR)); /* Duplicate the directory object */ + res = follow_path(&djn, path_new); /* Make sure if new object name is not in use */ + if (res == FR_OK) { /* Is new name already in use by any other object? */ + res = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST; + } + if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + dir = djn.dir; /* Copy directory entry of the object except name */ + mem_cpy(dir + 13, buf + 13, SZDIRE - 13); + dir[DIR_Attr] = buf[DIR_Attr]; + if (!(dir[DIR_Attr] & AM_DIR)) dir[DIR_Attr] |= AM_ARC; /* Set archive attribute if it is a file */ + fs->wflag = 1; + if ((dir[DIR_Attr] & AM_DIR) && djo.obj.sclust != djn.obj.sclust) { /* Update .. entry in the sub-directory if needed */ + dw = clst2sect(fs, ld_clust(fs, dir)); + if (dw == 0) { + res = FR_INT_ERR; + } else { +/* Start of critical section where an interruption can cause a cross-link */ + res = move_window(fs, dw); + dir = fs->win + SZDIRE * 1; /* Ptr to .. entry */ + if (res == FR_OK && dir[1] == '.') { + st_clust(fs, dir, djn.obj.sclust); + fs->wflag = 1; + } + } + } + } + } + } + if (res == FR_OK) { + res = dir_remove(&djo); /* Remove old entry */ + if (res == FR_OK) { + res = sync_fs(fs); + } + } +/* End of the critical section */ + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_FS_MINIMIZE == 0 */ +#endif /* FF_FS_MINIMIZE <= 1 */ +#endif /* FF_FS_MINIMIZE <= 2 */ + + + +#if FF_USE_CHMOD && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Change Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const TCHAR* path, /* Pointer to the file path */ + BYTE attr, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->dirbuf[XDIR_Attr] = (attr & mask) | (fs->dirbuf[XDIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + res = store_xdir(&dj); + } else +#endif + { + dj.dir[DIR_Attr] = (attr & mask) | (dj.dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const TCHAR* path, /* Pointer to the file/directory name */ + const FILINFO* fno /* Pointer to the timestamp to be set */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + DEF_NAMBUF + + + res = find_volume(&path, &fs, FA_WRITE); /* Get logical drive */ + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME; /* Check object validity */ + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + st_dword(fs->dirbuf + XDIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime); + res = store_xdir(&dj); + } else +#endif + { + st_dword(dj.dir + DIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime); + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +#endif /* FF_USE_CHMOD && !FF_FS_READONLY */ + + + +#if FF_USE_LABEL +/*-----------------------------------------------------------------------*/ +/* Get Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getlabel ( + const TCHAR* path, /* Logical drive number */ + TCHAR* label, /* Buffer to store the volume label */ + DWORD* vsn /* Variable to store the volume serial number */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + UINT si, di; + WCHAR wc; + + /* Get logical drive */ + res = find_volume(&path, &fs, 0); + + /* Get volume label */ + if (res == FR_OK && label) { + dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = DIR_READ_LABEL(&dj); /* Find a volume label entry */ + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + WCHAR hs; + + for (si = di = hs = 0; si < dj.dir[XDIR_NumLabel]; si++) { /* Extract volume label from 83 entry */ + wc = ld_word(dj.dir + XDIR_Label + si * 2); + if (hs == 0 && IsSurrogate(wc)) { /* Is the code a surrogate? */ + hs = wc; continue; + } + wc = put_utf((DWORD)hs << 16 | wc, &label[di], 4); + if (wc == 0) { di = 0; break; } + di += wc; + hs = 0; + } + if (hs != 0) di = 0; /* Broken surrogate pair? */ + label[di] = 0; + } else +#endif + { + si = di = 0; /* Extract volume label from AM_VOL entry */ + while (si < 11) { + wc = dj.dir[si++]; +#if FF_USE_LFN && FF_LFN_UNICODE >= 1 /* Unicode output */ + if (dbc_1st((BYTE)wc) && si < 11) wc = wc << 8 | dj.dir[si++]; /* Is it a DBC? */ + wc = ff_oem2uni(wc, CODEPAGE); /* Convert it into Unicode */ + if (wc != 0) wc = put_utf(wc, &label[di], 4); /* Put it in Unicode */ + if (wc == 0) { di = 0; break; } + di += wc; +#else /* ANSI/OEM output */ + label[di++] = (TCHAR)wc; +#endif + } + do { /* Truncate trailing spaces */ + label[di] = 0; + if (di == 0) break; + } while (label[--di] == ' '); + } + } + } + if (res == FR_NO_FILE) { /* No label entry and return nul string */ + label[0] = 0; + res = FR_OK; + } + } + + /* Get volume serial number */ + if (res == FR_OK && vsn) { + res = move_window(fs, fs->volbase); + if (res == FR_OK) { + switch (fs->fs_type) { + case FS_EXFAT: + di = BPB_VolIDEx; break; + + case FS_FAT32: + di = BS_VolID32; break; + + default: + di = BS_VolID; + } + *vsn = ld_dword(fs->win + di); + } + } + + LEAVE_FF(fs, res); +} + + + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Set Volume Label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setlabel ( + const TCHAR* label /* Volume label to set with heading logical drive number */ +) +{ + FRESULT res; + DIR dj; + FATFS *fs; + BYTE dirvn[22]; + UINT di; + WCHAR wc; + static const char badchr[] = "+.,;=[]/\\\"*:<>\?|\x7F"; /* [0..] for FAT, [7..] for exFAT */ +#if FF_USE_LFN + DWORD dc; +#endif + + /* Get logical drive */ + res = find_volume(&label, &fs, FA_WRITE); + if (res != FR_OK) LEAVE_FF(fs, res); + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { /* On the exFAT volume */ + mem_set(dirvn, 0, 22); + di = 0; + while ((UINT)*label >= ' ') { /* Create volume label */ + dc = tchar2uni(&label); /* Get a Unicode character */ + if (dc >= 0x10000) { + if (dc == 0xFFFFFFFF || di >= 10) { /* Wrong surrogate or buffer overflow */ + dc = 0; + } else { + st_word(dirvn + di * 2, (WCHAR)(dc >> 16)); di++; + } + } + if (dc == 0 || chk_chr(badchr + 7, (int)dc) || di >= 11) { /* Check validity of the volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + st_word(dirvn + di * 2, (WCHAR)dc); di++; + } + } else +#endif + { /* On the FAT/FAT32 volume */ + mem_set(dirvn, ' ', 11); + di = 0; + while ((UINT)*label >= ' ') { /* Create volume label */ +#if FF_USE_LFN + dc = tchar2uni(&label); + wc = (dc < 0x10000) ? ff_uni2oem(ff_wtoupper(dc), CODEPAGE) : 0; +#else /* ANSI/OEM input */ + wc = (BYTE)*label++; + if (dbc_1st((BYTE)wc)) wc = dbc_2nd((BYTE)*label) ? wc << 8 | (BYTE)*label++ : 0; + if (IsLower(wc)) wc -= 0x20; /* To upper ASCII characters */ +#if FF_CODE_PAGE == 0 + if (ExCvt && wc >= 0x80) wc = ExCvt[wc - 0x80]; /* To upper extended characters (SBCS cfg) */ +#elif FF_CODE_PAGE < 900 + if (wc >= 0x80) wc = ExCvt[wc - 0x80]; /* To upper extended characters (SBCS cfg) */ +#endif +#endif + if (wc == 0 || chk_chr(badchr + 0, (int)wc) || di >= (UINT)((wc >= 0x100) ? 10 : 11)) { /* Reject invalid characters for volume label */ + LEAVE_FF(fs, FR_INVALID_NAME); + } + if (wc >= 0x100) dirvn[di++] = (BYTE)(wc >> 8); + dirvn[di++] = (BYTE)wc; + } + if (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ + while (di && dirvn[di - 1] == ' ') di--; /* Snip trailing spaces */ + } + + /* Set volume label */ + dj.obj.fs = fs; dj.obj.sclust = 0; /* Open root directory */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = DIR_READ_LABEL(&dj); /* Get volume label entry */ + if (res == FR_OK) { + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_NumLabel] = (BYTE)di; /* Change the volume label */ + mem_cpy(dj.dir + XDIR_Label, dirvn, 22); + } else { + if (di != 0) { + mem_cpy(dj.dir, dirvn, 11); /* Change the volume label */ + } else { + dj.dir[DIR_Name] = DDEM; /* Remove the volume label */ + } + } + fs->wflag = 1; + res = sync_fs(fs); + } else { /* No volume label entry or an error */ + if (res == FR_NO_FILE) { + res = FR_OK; + if (di != 0) { /* Create a volume label entry */ + res = dir_alloc(&dj, 1); /* Allocate an entry */ + if (res == FR_OK) { + mem_set(dj.dir, 0, SZDIRE); /* Clean the entry */ + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { + dj.dir[XDIR_Type] = ET_VLABEL; /* Create volume label entry */ + dj.dir[XDIR_NumLabel] = (BYTE)di; + mem_cpy(dj.dir + XDIR_Label, dirvn, 22); + } else { + dj.dir[DIR_Attr] = AM_VOL; /* Create volume label entry */ + mem_cpy(dj.dir, dirvn, 11); + } + fs->wflag = 1; + res = sync_fs(fs); + } + } + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_LABEL */ + + + +#if FF_USE_EXPAND && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Allocate a Contiguous Blocks to the File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_expand ( + FIL* fp, /* Pointer to the file object */ + FSIZE_t fsz, /* File size to be expanded to */ + BYTE opt /* Operation mode 0:Find and prepare or 1:Find and allocate */ +) +{ + FRESULT res; + FATFS *fs; + DWORD n, clst, stcl, scl, ncl, tcl, lclst; + + + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (fsz == 0 || fp->obj.objsize != 0 || !(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED); +#if FF_FS_EXFAT + if (fs->fs_type != FS_EXFAT && fsz >= 0x100000000) LEAVE_FF(fs, FR_DENIED); /* Check if in size limit */ +#endif + n = (DWORD)fs->csize * SS(fs); /* Cluster size */ + tcl = (DWORD)(fsz / n) + ((fsz & (n - 1)) ? 1 : 0); /* Number of clusters required */ + stcl = fs->last_clst; lclst = 0; + if (stcl < 2 || stcl >= fs->n_fatent) stcl = 2; + +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + scl = find_bitmap(fs, stcl, tcl); /* Find a contiguous cluster block */ + if (scl == 0) res = FR_DENIED; /* No contiguous cluster block was found */ + if (scl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) { /* A contiguous free area is found */ + if (opt) { /* Allocate it now */ + res = change_bitmap(fs, scl, tcl, 1); /* Mark the cluster block 'in use' */ + lclst = scl + tcl - 1; + } else { /* Set it as suggested point for next allocation */ + lclst = scl - 1; + } + } + } else +#endif + { + scl = clst = stcl; ncl = 0; + for (;;) { /* Find a contiguous cluster block */ + n = get_fat(&fp->obj, clst); + if (++clst >= fs->n_fatent) clst = 2; + if (n == 1) { res = FR_INT_ERR; break; } + if (n == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (n == 0) { /* Is it a free cluster? */ + if (++ncl == tcl) break; /* Break if a contiguous cluster block is found */ + } else { + scl = clst; ncl = 0; /* Not a free cluster */ + } + if (clst == stcl) { res = FR_DENIED; break; } /* No contiguous cluster? */ + } + if (res == FR_OK) { /* A contiguous free area is found */ + if (opt) { /* Allocate it now */ + for (clst = scl, n = tcl; n; clst++, n--) { /* Create a cluster chain on the FAT */ + res = put_fat(fs, clst, (n == 1) ? 0xFFFFFFFF : clst + 1); + if (res != FR_OK) break; + lclst = clst; + } + } else { /* Set it as suggested point for next allocation */ + lclst = scl - 1; + } + } + } + + if (res == FR_OK) { + fs->last_clst = lclst; /* Set suggested start cluster to start next */ + if (opt) { /* Is it allocated now? */ + fp->obj.sclust = scl; /* Update object allocation information */ + fp->obj.objsize = fsz; + if (FF_FS_EXFAT) fp->obj.stat = 2; /* Set status 'contiguous chain' */ + fp->flag |= FA_MODIFIED; + if (fs->free_clst <= fs->n_fatent - 2) { /* Update FSINFO */ + fs->free_clst -= tcl; + fs->fsi_flag |= 1; + } + } + } + + LEAVE_FF(fs, res); +} + +#endif /* FF_USE_EXPAND && !FF_FS_READONLY */ + + + +#if FF_USE_FORWARD +/*-----------------------------------------------------------------------*/ +/* Forward Data to the Stream Directly */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_forward ( + FIL* fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btf, /* Number of bytes to forward */ + UINT* bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + FATFS *fs; + DWORD clst, sect; + FSIZE_t remain; + UINT rcnt, csect; + BYTE *dbuf; + + + *bf = 0; /* Clear transfer byte counter */ + res = validate(&fp->obj, &fs); /* Check validity of the file object */ + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res); + if (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */ + + remain = fp->obj.objsize - fp->fptr; + if (btf > remain) btf = (UINT)remain; /* Truncate btf by remaining bytes */ + + for ( ; btf && (*func)(0, 0); /* Repeat until all data transferred or stream goes busy */ + fp->fptr += rcnt, *bf += rcnt, btf -= rcnt) { + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); /* Sector offset in the cluster */ + if (fp->fptr % SS(fs) == 0) { /* On the sector boundary? */ + if (csect == 0) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->obj.sclust : get_fat(&fp->obj, fp->clust); + if (clst <= 1) ABORT(fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + } + sect = clst2sect(fs, fp->clust); /* Get current data sector */ + if (sect == 0) ABORT(fs, FR_INT_ERR); + sect += csect; +#if FF_FS_TINY + if (move_window(fs, sect) != FR_OK) ABORT(fs, FR_DISK_ERR); /* Move sector window to the file data */ + dbuf = fs->win; +#else + if (fp->sect != sect) { /* Fill sector cache with file data */ +#if !FF_FS_READONLY + if (fp->flag & FA_DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + fp->flag &= (BYTE)~FA_DIRTY; + } +#endif + if (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR); + } + dbuf = fp->buf; +#endif + fp->sect = sect; + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); /* Number of bytes left in the sector */ + if (rcnt > btf) rcnt = btf; /* Clip it by btr if needed */ + rcnt = (*func)(dbuf + ((UINT)fp->fptr % SS(fs)), rcnt); /* Forward the file data */ + if (rcnt == 0) ABORT(fs, FR_INT_ERR); + } + + LEAVE_FF(fs, FR_OK); +} +#endif /* FF_USE_FORWARD */ + + + +#if FF_USE_MKFS && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create an FAT/exFAT volume */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkfs ( + const TCHAR* path, /* Logical drive number */ + BYTE opt, /* Format option */ + DWORD au, /* Size of allocation unit (cluster) [byte] */ + void* work, /* Pointer to working buffer (null: use heap memory) */ + UINT len /* Size of working buffer [byte] */ +) +{ + const UINT n_fats = 1; /* Number of FATs for FAT/FAT32 volume (1 or 2) */ + const UINT n_rootdir = 512; /* Number of root directory entries for FAT volume */ + static const WORD cst[] = {1, 4, 16, 64, 256, 512, 0}; /* Cluster size boundary for FAT volume (4Ks unit) */ + static const WORD cst32[] = {1, 2, 4, 8, 16, 32, 0}; /* Cluster size boundary for FAT32 volume (128Ks unit) */ + BYTE fmt, sys, *buf, *pte, pdrv, part; + WORD ss; /* Sector size */ + DWORD szb_buf, sz_buf, sz_blk, n_clst, pau, sect, nsect, n; + DWORD b_vol, b_fat, b_data; /* Base LBA for volume, fat, data */ + DWORD sz_vol, sz_rsv, sz_fat, sz_dir; /* Size for volume, fat, dir, data */ + UINT i; + int vol; + DSTATUS stat; +#if FF_USE_TRIM || FF_FS_EXFAT + DWORD tbl[3]; +#endif + + + /* Check mounted drive and clear work area */ + vol = get_ldnumber(&path); /* Get target logical drive */ + if (vol < 0) return FR_INVALID_DRIVE; + if (FatFs[vol]) FatFs[vol]->fs_type = 0; /* Clear the volume if mounted */ + pdrv = LD2PD(vol); /* Physical drive */ + part = LD2PT(vol); /* Partition (0:create as new, 1-4:get from partition table) */ + + /* Check physical drive status */ + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(pdrv, GET_BLOCK_SIZE, &sz_blk) != RES_OK || !sz_blk || sz_blk > 32768 || (sz_blk & (sz_blk - 1))) sz_blk = 1; /* Erase block to align data area */ +#if FF_MAX_SS != FF_MIN_SS /* Get sector size of the medium if variable sector size cfg. */ + if (disk_ioctl(pdrv, GET_SECTOR_SIZE, &ss) != RES_OK) return FR_DISK_ERR; + if (ss > FF_MAX_SS || ss < FF_MIN_SS || (ss & (ss - 1))) return FR_DISK_ERR; +#else + ss = FF_MAX_SS; +#endif + if ((au != 0 && au < ss) || au > 0x1000000 || (au & (au - 1))) return FR_INVALID_PARAMETER; /* Check if au is valid */ + au /= ss; /* Cluster size in unit of sector */ + + /* Get working buffer */ +#if FF_USE_LFN == 3 + if (!work) { /* Use heap memory for working buffer */ + for (szb_buf = MAX_MALLOC, buf = 0; szb_buf >= ss && (buf = ff_memalloc(szb_buf)) == 0; szb_buf /= 2) ; + sz_buf = szb_buf / ss; /* Size of working buffer (sector) */ + } else +#endif + { + buf = (BYTE*)work; /* Working buffer */ + sz_buf = len / ss; /* Size of working buffer (sector) */ + szb_buf = sz_buf * ss; /* Size of working buffer (byte) */ + } + if (!buf || sz_buf == 0) return FR_NOT_ENOUGH_CORE; + + /* Determine where the volume to be located (b_vol, sz_vol) */ + if (FF_MULTI_PARTITION && part != 0) { + /* Get partition information from partition table in the MBR */ + if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Load MBR */ + if (ld_word(buf + BS_55AA) != 0xAA55) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if MBR is valid */ + pte = buf + (MBR_Table + (part - 1) * SZ_PTE); + if (pte[PTE_System] == 0) LEAVE_MKFS(FR_MKFS_ABORTED); /* No partition? */ + b_vol = ld_dword(pte + PTE_StLba); /* Get volume start sector */ + sz_vol = ld_dword(pte + PTE_SizLba); /* Get volume size */ + } else { + /* Create a single-partition in this function */ + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_vol) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + b_vol = (opt & FM_SFD) ? 0 : 63; /* Volume start sector */ + if (sz_vol < b_vol) LEAVE_MKFS(FR_MKFS_ABORTED); + sz_vol -= b_vol; /* Volume size */ + } + if (sz_vol < 128) LEAVE_MKFS(FR_MKFS_ABORTED); /* Check if volume size is >=128s */ + + /* Pre-determine the FAT type */ + do { + if (FF_FS_EXFAT && (opt & FM_EXFAT)) { /* exFAT possible? */ + if ((opt & FM_ANY) == FM_EXFAT || sz_vol >= 0x4000000 || au > 128) { /* exFAT only, vol >= 64Ms or au > 128s ? */ + fmt = FS_EXFAT; break; + } + } + if (au > 128) LEAVE_MKFS(FR_INVALID_PARAMETER); /* Too large au for FAT/FAT32 */ + if (opt & FM_FAT32) { /* FAT32 possible? */ + if ((opt & FM_ANY) == FM_FAT32 || !(opt & FM_FAT)) { /* FAT32 only or no-FAT? */ + fmt = FS_FAT32; break; + } + } + if (!(opt & FM_FAT)) LEAVE_MKFS(FR_INVALID_PARAMETER); /* no-FAT? */ + fmt = FS_FAT16; + } while (0); + +#if FF_FS_EXFAT + if (fmt == FS_EXFAT) { /* Create an exFAT volume */ + DWORD szb_bit, szb_case, sum, nb, cl; + WCHAR ch, si; + UINT j, st; + BYTE b; + + if (sz_vol < 0x1000) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume? */ +#if FF_USE_TRIM + tbl[0] = b_vol; tbl[1] = b_vol + sz_vol - 1; /* Inform the device the volume area may be erased */ + disk_ioctl(pdrv, CTRL_TRIM, tbl); +#endif + /* Determine FAT location, data location and number of clusters */ + if (au == 0) { /* au auto-selection */ + au = 8; + if (sz_vol >= 0x80000) au = 64; /* >= 512Ks */ + if (sz_vol >= 0x4000000) au = 256; /* >= 64Ms */ + } + b_fat = b_vol + 32; /* FAT start at offset 32 */ + sz_fat = ((sz_vol / au + 2) * 4 + ss - 1) / ss; /* Number of FAT sectors */ + b_data = (b_fat + sz_fat + sz_blk - 1) & ~(sz_blk - 1); /* Align data area to the erase block boundary */ + if (b_data >= sz_vol / 2) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume? */ + n_clst = (sz_vol - (b_data - b_vol)) / au; /* Number of clusters */ + if (n_clst <16) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too few clusters? */ + if (n_clst > MAX_EXFAT) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too many clusters? */ + + szb_bit = (n_clst + 7) / 8; /* Size of allocation bitmap */ + tbl[0] = (szb_bit + au * ss - 1) / (au * ss); /* Number of allocation bitmap clusters */ + + /* Create a compressed up-case table */ + sect = b_data + au * tbl[0]; /* Table start sector */ + sum = 0; /* Table checksum to be stored in the 82 entry */ + st = 0; si = 0; i = 0; j = 0; szb_case = 0; + do { + switch (st) { + case 0: + ch = (WCHAR)ff_wtoupper(si); /* Get an up-case char */ + if (ch != si) { + si++; break; /* Store the up-case char if exist */ + } + for (j = 1; (WCHAR)(si + j) && (WCHAR)(si + j) == ff_wtoupper((WCHAR)(si + j)); j++) ; /* Get run length of no-case block */ + if (j >= 128) { + ch = 0xFFFF; st = 2; break; /* Compress the no-case block if run is >= 128 */ + } + st = 1; /* Do not compress short run */ + /* go to next case */ + case 1: + ch = si++; /* Fill the short run */ + if (--j == 0) st = 0; + break; + + default: + ch = (WCHAR)j; si += (WCHAR)j; /* Number of chars to skip */ + st = 0; + } + sum = xsum32(buf[i + 0] = (BYTE)ch, sum); /* Put it into the write buffer */ + sum = xsum32(buf[i + 1] = (BYTE)(ch >> 8), sum); + i += 2; szb_case += 2; + if (si == 0 || i == szb_buf) { /* Write buffered data when buffer full or end of process */ + n = (i + ss - 1) / ss; + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; i = 0; + } + } while (si); + tbl[1] = (szb_case + au * ss - 1) / (au * ss); /* Number of up-case table clusters */ + tbl[2] = 1; /* Number of root dir clusters */ + + /* Initialize the allocation bitmap */ + sect = b_data; nsect = (szb_bit + ss - 1) / ss; /* Start of bitmap and number of sectors */ + nb = tbl[0] + tbl[1] + tbl[2]; /* Number of clusters in-use by system */ + do { + mem_set(buf, 0, szb_buf); + for (i = 0; nb >= 8 && i < szb_buf; buf[i++] = 0xFF, nb -= 8) ; + for (b = 1; nb != 0 && i < szb_buf; buf[i] |= b, b <<= 1, nb--) ; + n = (nsect > sz_buf) ? sz_buf : nsect; /* Write the buffered data */ + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + + /* Initialize the FAT */ + sect = b_fat; nsect = sz_fat; /* Start of FAT and number of FAT sectors */ + j = nb = cl = 0; + do { + mem_set(buf, 0, szb_buf); i = 0; /* Clear work area and reset write index */ + if (cl == 0) { /* Set entry 0 and 1 */ + st_dword(buf + i, 0xFFFFFFF8); i += 4; cl++; + st_dword(buf + i, 0xFFFFFFFF); i += 4; cl++; + } + do { /* Create chains of bitmap, up-case and root dir */ + while (nb != 0 && i < szb_buf) { /* Create a chain */ + st_dword(buf + i, (nb > 1) ? cl + 1 : 0xFFFFFFFF); + i += 4; cl++; nb--; + } + if (nb == 0 && j < 3) nb = tbl[j++]; /* Next chain */ + } while (nb != 0 && i < szb_buf); + n = (nsect > sz_buf) ? sz_buf : nsect; /* Write the buffered data */ + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + + /* Initialize the root directory */ + mem_set(buf, 0, szb_buf); + buf[SZDIRE * 0 + 0] = ET_VLABEL; /* Volume label entry */ + buf[SZDIRE * 1 + 0] = ET_BITMAP; /* Bitmap entry */ + st_dword(buf + SZDIRE * 1 + 20, 2); /* cluster */ + st_dword(buf + SZDIRE * 1 + 24, szb_bit); /* size */ + buf[SZDIRE * 2 + 0] = ET_UPCASE; /* Up-case table entry */ + st_dword(buf + SZDIRE * 2 + 4, sum); /* sum */ + st_dword(buf + SZDIRE * 2 + 20, 2 + tbl[0]); /* cluster */ + st_dword(buf + SZDIRE * 2 + 24, szb_case); /* size */ + sect = b_data + au * (tbl[0] + tbl[1]); nsect = au; /* Start of the root directory and number of sectors */ + do { /* Fill root directory sectors */ + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + mem_set(buf, 0, ss); + sect += n; nsect -= n; + } while (nsect); + + /* Create two set of the exFAT VBR blocks */ + sect = b_vol; + for (n = 0; n < 2; n++) { + /* Main record (+0) */ + mem_set(buf, 0, ss); + mem_cpy(buf + BS_JmpBoot, "\xEB\x76\x90" "EXFAT ", 11); /* Boot jump code (x86), OEM name */ + st_dword(buf + BPB_VolOfsEx, b_vol); /* Volume offset in the physical drive [sector] */ + st_dword(buf + BPB_TotSecEx, sz_vol); /* Volume size [sector] */ + st_dword(buf + BPB_FatOfsEx, b_fat - b_vol); /* FAT offset [sector] */ + st_dword(buf + BPB_FatSzEx, sz_fat); /* FAT size [sector] */ + st_dword(buf + BPB_DataOfsEx, b_data - b_vol); /* Data offset [sector] */ + st_dword(buf + BPB_NumClusEx, n_clst); /* Number of clusters */ + st_dword(buf + BPB_RootClusEx, 2 + tbl[0] + tbl[1]); /* Root dir cluster # */ + st_dword(buf + BPB_VolIDEx, GET_FATTIME()); /* VSN */ + st_word(buf + BPB_FSVerEx, 0x100); /* Filesystem version (1.00) */ + for (buf[BPB_BytsPerSecEx] = 0, i = ss; i >>= 1; buf[BPB_BytsPerSecEx]++) ; /* Log2 of sector size [byte] */ + for (buf[BPB_SecPerClusEx] = 0, i = au; i >>= 1; buf[BPB_SecPerClusEx]++) ; /* Log2 of cluster size [sector] */ + buf[BPB_NumFATsEx] = 1; /* Number of FATs */ + buf[BPB_DrvNumEx] = 0x80; /* Drive number (for int13) */ + st_word(buf + BS_BootCodeEx, 0xFEEB); /* Boot code (x86) */ + st_word(buf + BS_55AA, 0xAA55); /* Signature (placed here regardless of sector size) */ + for (i = sum = 0; i < ss; i++) { /* VBR checksum */ + if (i != BPB_VolFlagEx && i != BPB_VolFlagEx + 1 && i != BPB_PercInUseEx) sum = xsum32(buf[i], sum); + } + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + /* Extended bootstrap record (+1..+8) */ + mem_set(buf, 0, ss); + st_word(buf + ss - 2, 0xAA55); /* Signature (placed at end of sector) */ + for (j = 1; j < 9; j++) { + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ; /* VBR checksum */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + /* OEM/Reserved record (+9..+10) */ + mem_set(buf, 0, ss); + for ( ; j < 11; j++) { + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ; /* VBR checksum */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + /* Sum record (+11) */ + for (i = 0; i < ss; i += 4) st_dword(buf + i, sum); /* Fill with checksum value */ + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + } + + } else +#endif /* FF_FS_EXFAT */ + { /* Create an FAT/FAT32 volume */ + do { + pau = au; + /* Pre-determine number of clusters and FAT sub-type */ + if (fmt == FS_FAT32) { /* FAT32 volume */ + if (pau == 0) { /* au auto-selection */ + n = sz_vol / 0x20000; /* Volume size in unit of 128KS */ + for (i = 0, pau = 1; cst32[i] && cst32[i] <= n; i++, pau <<= 1) ; /* Get from table */ + } + n_clst = sz_vol / pau; /* Number of clusters */ + sz_fat = (n_clst * 4 + 8 + ss - 1) / ss; /* FAT size [sector] */ + sz_rsv = 32; /* Number of reserved sectors */ + sz_dir = 0; /* No static directory */ + if (n_clst <= MAX_FAT16 || n_clst > MAX_FAT32) LEAVE_MKFS(FR_MKFS_ABORTED); + } else { /* FAT volume */ + if (pau == 0) { /* au auto-selection */ + n = sz_vol / 0x1000; /* Volume size in unit of 4KS */ + for (i = 0, pau = 1; cst[i] && cst[i] <= n; i++, pau <<= 1) ; /* Get from table */ + } + n_clst = sz_vol / pau; + if (n_clst > MAX_FAT12) { + n = n_clst * 2 + 4; /* FAT size [byte] */ + } else { + fmt = FS_FAT12; + n = (n_clst * 3 + 1) / 2 + 3; /* FAT size [byte] */ + } + sz_fat = (n + ss - 1) / ss; /* FAT size [sector] */ + sz_rsv = 1; /* Number of reserved sectors */ + sz_dir = (DWORD)n_rootdir * SZDIRE / ss; /* Rootdir size [sector] */ + } + b_fat = b_vol + sz_rsv; /* FAT base */ + b_data = b_fat + sz_fat * n_fats + sz_dir; /* Data base */ + + /* Align data base to erase block boundary (for flash memory media) */ + n = ((b_data + sz_blk - 1) & ~(sz_blk - 1)) - b_data; /* Next nearest erase block from current data base */ + if (fmt == FS_FAT32) { /* FAT32: Move FAT base */ + sz_rsv += n; b_fat += n; + } else { /* FAT: Expand FAT size */ + sz_fat += n / n_fats; + } + + /* Determine number of clusters and final check of validity of the FAT sub-type */ + if (sz_vol < b_data + pau * 16 - b_vol) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too small volume */ + n_clst = (sz_vol - sz_rsv - sz_fat * n_fats - sz_dir) / pau; + if (fmt == FS_FAT32) { + if (n_clst <= MAX_FAT16) { /* Too few clusters for FAT32 */ + if (au == 0 && (au = pau / 2) != 0) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + } + if (fmt == FS_FAT16) { + if (n_clst > MAX_FAT16) { /* Too many clusters for FAT16 */ + if (au == 0 && (pau * 2) <= 64) { + au = pau * 2; continue; /* Adjust cluster size and retry */ + } + if ((opt & FM_FAT32)) { + fmt = FS_FAT32; continue; /* Switch type to FAT32 and retry */ + } + if (au == 0 && (au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + if (n_clst <= MAX_FAT12) { /* Too few clusters for FAT16 */ + if (au == 0 && (au = pau * 2) <= 128) continue; /* Adjust cluster size and retry */ + LEAVE_MKFS(FR_MKFS_ABORTED); + } + } + if (fmt == FS_FAT12 && n_clst > MAX_FAT12) LEAVE_MKFS(FR_MKFS_ABORTED); /* Too many clusters for FAT12 */ + + /* Ok, it is the valid cluster configuration */ + break; + } while (1); + +#if FF_USE_TRIM + tbl[0] = b_vol; tbl[1] = b_vol + sz_vol - 1; /* Inform the device the volume area can be erased */ + disk_ioctl(pdrv, CTRL_TRIM, tbl); +#endif + /* Create FAT VBR */ + mem_set(buf, 0, ss); + mem_cpy(buf + BS_JmpBoot, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code (x86), OEM name */ + st_word(buf + BPB_BytsPerSec, ss); /* Sector size [byte] */ + buf[BPB_SecPerClus] = (BYTE)pau; /* Cluster size [sector] */ + st_word(buf + BPB_RsvdSecCnt, (WORD)sz_rsv); /* Size of reserved area */ + buf[BPB_NumFATs] = (BYTE)n_fats; /* Number of FATs */ + st_word(buf + BPB_RootEntCnt, (WORD)((fmt == FS_FAT32) ? 0 : n_rootdir)); /* Number of root directory entries */ + if (sz_vol < 0x10000) { + st_word(buf + BPB_TotSec16, (WORD)sz_vol); /* Volume size in 16-bit LBA */ + } else { + st_dword(buf + BPB_TotSec32, sz_vol); /* Volume size in 32-bit LBA */ + } + buf[BPB_Media] = 0xF8; /* Media descriptor byte */ + st_word(buf + BPB_SecPerTrk, 63); /* Number of sectors per track (for int13) */ + st_word(buf + BPB_NumHeads, 255); /* Number of heads (for int13) */ + st_dword(buf + BPB_HiddSec, b_vol); /* Volume offset in the physical drive [sector] */ + if (fmt == FS_FAT32) { + st_dword(buf + BS_VolID32, GET_FATTIME()); /* VSN */ + st_dword(buf + BPB_FATSz32, sz_fat); /* FAT size [sector] */ + st_dword(buf + BPB_RootClus32, 2); /* Root directory cluster # (2) */ + st_word(buf + BPB_FSInfo32, 1); /* Offset of FSINFO sector (VBR + 1) */ + st_word(buf + BPB_BkBootSec32, 6); /* Offset of backup VBR (VBR + 6) */ + buf[BS_DrvNum32] = 0x80; /* Drive number (for int13) */ + buf[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(buf + BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ + } else { + st_dword(buf + BS_VolID, GET_FATTIME()); /* VSN */ + st_word(buf + BPB_FATSz16, (WORD)sz_fat); /* FAT size [sector] */ + buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */ + buf[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(buf + BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ + } + st_word(buf + BS_55AA, 0xAA55); /* Signature (offset is fixed here regardless of sector size) */ + if (disk_write(pdrv, buf, b_vol, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the VBR sector */ + + /* Create FSINFO record if needed */ + if (fmt == FS_FAT32) { + disk_write(pdrv, buf, b_vol + 6, 1); /* Write backup VBR (VBR + 6) */ + mem_set(buf, 0, ss); + st_dword(buf + FSI_LeadSig, 0x41615252); + st_dword(buf + FSI_StrucSig, 0x61417272); + st_dword(buf + FSI_Free_Count, n_clst - 1); /* Number of free clusters */ + st_dword(buf + FSI_Nxt_Free, 2); /* Last allocated cluster# */ + st_word(buf + BS_55AA, 0xAA55); + disk_write(pdrv, buf, b_vol + 7, 1); /* Write backup FSINFO (VBR + 7) */ + disk_write(pdrv, buf, b_vol + 1, 1); /* Write original FSINFO (VBR + 1) */ + } + + /* Initialize FAT area */ + mem_set(buf, 0, (UINT)szb_buf); + sect = b_fat; /* FAT start sector */ + for (i = 0; i < n_fats; i++) { /* Initialize FATs each */ + if (fmt == FS_FAT32) { + st_dword(buf + 0, 0xFFFFFFF8); /* Entry 0 */ + st_dword(buf + 4, 0xFFFFFFFF); /* Entry 1 */ + st_dword(buf + 8, 0x0FFFFFFF); /* Entry 2 (root directory) */ + } else { + st_dword(buf + 0, (fmt == FS_FAT12) ? 0xFFFFF8 : 0xFFFFFFF8); /* Entry 0 and 1 */ + } + nsect = sz_fat; /* Number of FAT sectors */ + do { /* Fill FAT sectors */ + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + mem_set(buf, 0, ss); + sect += n; nsect -= n; + } while (nsect); + } + + /* Initialize root directory (fill with zero) */ + nsect = (fmt == FS_FAT32) ? pau : sz_dir; /* Number of root directory sectors */ + do { + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + sect += n; nsect -= n; + } while (nsect); + } + + /* Determine system ID in the partition table */ + if (FF_FS_EXFAT && fmt == FS_EXFAT) { + sys = 0x07; /* HPFS/NTFS/exFAT */ + } else { + if (fmt == FS_FAT32) { + sys = 0x0C; /* FAT32X */ + } else { + if (sz_vol >= 0x10000) { + sys = 0x06; /* FAT12/16 (large) */ + } else { + sys = (fmt == FS_FAT16) ? 0x04 : 0x01; /* FAT16 : FAT12 */ + } + } + } + + /* Update partition information */ + if (FF_MULTI_PARTITION && part != 0) { /* Created in the existing partition */ + /* Update system ID in the partition table */ + if (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Read the MBR */ + buf[MBR_Table + (part - 1) * SZ_PTE + PTE_System] = sys; /* Set system ID */ + if (disk_write(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it back to the MBR */ + } else { /* Created as a new single partition */ + if (!(opt & FM_SFD)) { /* Create partition table if in FDISK format */ + mem_set(buf, 0, ss); + st_word(buf + BS_55AA, 0xAA55); /* MBR signature */ + pte = buf + MBR_Table; /* Create partition table for single partition in the drive */ + pte[PTE_Boot] = 0; /* Boot indicator */ + pte[PTE_StHead] = 1; /* Start head */ + pte[PTE_StSec] = 1; /* Start sector */ + pte[PTE_StCyl] = 0; /* Start cylinder */ + pte[PTE_System] = sys; /* System type */ + n = (b_vol + sz_vol) / (63 * 255); /* (End CHS may be invalid) */ + pte[PTE_EdHead] = 254; /* End head */ + pte[PTE_EdSec] = (BYTE)(((n >> 2) & 0xC0) | 63); /* End sector */ + pte[PTE_EdCyl] = (BYTE)n; /* End cylinder */ + st_dword(pte + PTE_StLba, b_vol); /* Start offset in LBA */ + st_dword(pte + PTE_SizLba, sz_vol); /* Size in sectors */ + if (disk_write(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); /* Write it to the MBR */ + } + } + + if (disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) LEAVE_MKFS(FR_DISK_ERR); + + LEAVE_MKFS(FR_OK); +} + + + +#if FF_MULTI_PARTITION +/*-----------------------------------------------------------------------*/ +/* Create Partition Table on the Physical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_fdisk ( + BYTE pdrv, /* Physical drive number */ + const DWORD* szt, /* Pointer to the size table for each partitions */ + void* work /* Pointer to the working buffer (null: use heap memory) */ +) +{ + UINT i, n, sz_cyl, tot_cyl, b_cyl, e_cyl, p_cyl; + BYTE s_hd, e_hd, *p, *buf = (BYTE*)work; + DSTATUS stat; + DWORD sz_disk, sz_part, s_part; + FRESULT res; + + + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_disk)) return FR_DISK_ERR; + + buf = (BYTE*)work; +#if FF_USE_LFN == 3 + if (!buf) buf = ff_memalloc(FF_MAX_SS); /* Use heap memory for working buffer */ +#endif + if (!buf) return FR_NOT_ENOUGH_CORE; + + /* Determine the CHS without any consideration of the drive geometry */ + for (n = 16; n < 256 && sz_disk / n / 63 > 1024; n *= 2) ; + if (n == 256) n--; + e_hd = (BYTE)(n - 1); + sz_cyl = 63 * n; + tot_cyl = sz_disk / sz_cyl; + + /* Create partition table */ + mem_set(buf, 0, FF_MAX_SS); + p = buf + MBR_Table; b_cyl = 0; + for (i = 0; i < 4; i++, p += SZ_PTE) { + p_cyl = (szt[i] <= 100U) ? (DWORD)tot_cyl * szt[i] / 100 : szt[i] / sz_cyl; /* Number of cylinders */ + if (p_cyl == 0) continue; + s_part = (DWORD)sz_cyl * b_cyl; + sz_part = (DWORD)sz_cyl * p_cyl; + if (i == 0) { /* Exclude first track of cylinder 0 */ + s_hd = 1; + s_part += 63; sz_part -= 63; + } else { + s_hd = 0; + } + e_cyl = b_cyl + p_cyl - 1; /* End cylinder */ + if (e_cyl >= tot_cyl) LEAVE_MKFS(FR_INVALID_PARAMETER); + + /* Set partition table */ + p[1] = s_hd; /* Start head */ + p[2] = (BYTE)(((b_cyl >> 2) & 0xC0) | 1); /* Start sector */ + p[3] = (BYTE)b_cyl; /* Start cylinder */ + p[4] = 0x07; /* System type (temporary setting) */ + p[5] = e_hd; /* End head */ + p[6] = (BYTE)(((e_cyl >> 2) & 0xC0) | 63); /* End sector */ + p[7] = (BYTE)e_cyl; /* End cylinder */ + st_dword(p + 8, s_part); /* Start sector in LBA */ + st_dword(p + 12, sz_part); /* Number of sectors */ + + /* Next partition */ + b_cyl += p_cyl; + } + st_word(p, 0xAA55); /* MBR signature (always at offset 510) */ + + /* Write it to the MBR */ + res = (disk_write(pdrv, buf, 0, 1) == RES_OK && disk_ioctl(pdrv, CTRL_SYNC, 0) == RES_OK) ? FR_OK : FR_DISK_ERR; + LEAVE_MKFS(res); +} + +#endif /* FF_MULTI_PARTITION */ +#endif /* FF_USE_MKFS && !FF_FS_READONLY */ + + + + +#if FF_USE_STRFUNC +#if FF_USE_LFN && FF_LFN_UNICODE && (FF_STRF_ENCODE < 0 || FF_STRF_ENCODE > 3) +#error Wrong FF_STRF_ENCODE setting +#endif +/*-----------------------------------------------------------------------*/ +/* Get a String from the File */ +/*-----------------------------------------------------------------------*/ + +TCHAR* f_gets ( + TCHAR* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer (items) */ + FIL* fp /* Pointer to the file object */ +) +{ + int nc = 0; + TCHAR *p = buff; + BYTE s[4]; + UINT rc; + DWORD dc; +#if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE <= 2 + WCHAR wc; +#endif +#if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE == 3 + UINT ct; +#endif + +#if FF_USE_LFN && FF_LFN_UNICODE /* With code conversion (Unicode API) */ + /* Make a room for the character and terminator */ + if (FF_LFN_UNICODE == 1) len -= (FF_STRF_ENCODE == 0) ? 1 : 2; + if (FF_LFN_UNICODE == 2) len -= (FF_STRF_ENCODE == 0) ? 3 : 4; + if (FF_LFN_UNICODE == 3) len -= 1; + while (nc < len) { +#if FF_STRF_ENCODE == 0 /* Read a character in ANSI/OEM */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + wc = s[0]; + if (dbc_1st((BYTE)wc)) { + f_read(fp, s, 1, &rc); + if (rc != 1 || !dbc_2nd(s[0])) continue; + wc = wc << 8 | s[0]; + } + dc = ff_oem2uni(wc, CODEPAGE); + if (dc == 0) continue; +#elif FF_STRF_ENCODE == 1 || FF_STRF_ENCODE == 2 /* Read a character in UTF-16LE/BE */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + dc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1]; + if (IsSurrogateL(dc)) continue; + if (IsSurrogateH(dc)) { + f_read(fp, s, 2, &rc); + if (rc != 2) break; + wc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1]; + if (!IsSurrogateL(wc)) continue; + dc = ((dc & 0x3FF) + 0x40) << 10 | (wc & 0x3FF); + } +#else /* Read a character in UTF-8 */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + dc = s[0]; + if (dc >= 0x80) { /* Multi-byte character? */ + ct = 0; + if ((dc & 0xE0) == 0xC0) { dc &= 0x1F; ct = 1; } /* 2-byte? */ + if ((dc & 0xF0) == 0xE0) { dc &= 0x0F; ct = 2; } /* 3-byte? */ + if ((dc & 0xF8) == 0xF0) { dc &= 0x07; ct = 3; } /* 4-byte? */ + if (ct == 0) continue; + f_read(fp, s, ct, &rc); /* Get trailing bytes */ + if (rc != ct) break; + rc = 0; + do { /* Merge trailing bytes */ + if ((s[rc] & 0xC0) != 0x80) break; + dc = dc << 6 | (s[rc] & 0x3F); + } while (++rc < ct); + if (rc != ct || dc < 0x80 || IsSurrogate(dc) || dc >= 0x110000) continue; /* Wrong encoding? */ + } +#endif + if (FF_USE_STRFUNC == 2 && dc == '\r') continue; /* Strip \r off if needed */ +#if FF_LFN_UNICODE == 1 || FF_LFN_UNICODE == 3 /* Output it in UTF-16/32 encoding */ + if (FF_LFN_UNICODE == 1 && dc >= 0x10000) { /* Out of BMP at UTF-16? */ + *p++ = (TCHAR)(0xD800 | ((dc >> 10) - 0x40)); nc++; /* Make and output high surrogate */ + dc = 0xDC00 | (dc & 0x3FF); /* Make low surrogate */ + } + *p++ = (TCHAR)dc; nc++; + if (dc == '\n') break; /* End of line? */ +#elif FF_LFN_UNICODE == 2 /* Output it in UTF-8 encoding */ + if (dc < 0x80) { /* 1-byte */ + *p++ = (TCHAR)dc; + nc++; + if (dc == '\n') break; /* End of line? */ + } else { + if (dc < 0x800) { /* 2-byte */ + *p++ = (TCHAR)(0xC0 | (dc >> 6 & 0x1F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 2; + } else { + if (dc < 0x10000) { /* 3-byte */ + *p++ = (TCHAR)(0xE0 | (dc >> 12 & 0x0F)); + *p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 3; + } else { /* 4-byte */ + *p++ = (TCHAR)(0xF0 | (dc >> 18 & 0x07)); + *p++ = (TCHAR)(0x80 | (dc >> 12 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 4; + } + } + } +#endif + } + +#else /* Byte-by-byte without any conversion (ANSI/OEM API) */ + len -= 1; /* Make a room for the terminator */ + while (nc < len) { + f_read(fp, s, 1, &rc); + if (rc != 1) break; + dc = s[0]; + if (FF_USE_STRFUNC == 2 && dc == '\r') continue; + *p++ = (TCHAR)dc; nc++; + if (dc == '\n') break; + } +#endif + + *p = 0; /* Terminate the string */ + return nc ? buff : 0; /* When no data read due to EOF or error, return with error. */ +} + + + + +#if !FF_FS_READONLY +#include +/*-----------------------------------------------------------------------*/ +/* Put a Character to the File */ +/*-----------------------------------------------------------------------*/ + +typedef struct { /* Putchar output buffer and work area */ + FIL *fp; /* Ptr to the writing file */ + int idx, nchr; /* Write index of buf[] (-1:error), number of encoding units written */ +#if FF_USE_LFN && FF_LFN_UNICODE == 1 + WCHAR hs; +#elif FF_USE_LFN && FF_LFN_UNICODE == 2 + BYTE bs[4]; + UINT wi, ct; +#endif + BYTE buf[64]; /* Write buffer */ +} putbuff; + + +static void putc_bfd ( /* Buffered write with code conversion */ + putbuff* pb, + TCHAR c +) +{ + UINT n; + int i, nc; +#if FF_USE_LFN && FF_LFN_UNICODE + WCHAR hs, wc; +#if FF_LFN_UNICODE == 2 + DWORD dc; + TCHAR *tp; +#endif +#endif + + if (FF_USE_STRFUNC == 2 && c == '\n') { /* LF -> CRLF conversion */ + putc_bfd(pb, '\r'); + } + + i = pb->idx; /* Write index of pb->buf[] */ + if (i < 0) return; + nc = pb->nchr; /* Write unit counter */ + +#if FF_USE_LFN && FF_LFN_UNICODE +#if FF_LFN_UNICODE == 1 /* UTF-16 input */ + if (IsSurrogateH(c)) { + pb->hs = c; return; + } + hs = pb->hs; pb->hs = 0; + if (hs != 0) { + if (!IsSurrogateL(c)) hs = 0; + } else { + if (IsSurrogateL(c)) return; + } + wc = c; +#elif FF_LFN_UNICODE == 2 /* UTF-8 input */ + for (;;) { + if (pb->ct == 0) { /* Out of multi-byte sequence? */ + pb->bs[pb->wi = 0] = (BYTE)c; /* Save 1st byte */ + if ((BYTE)c < 0x80) break; /* 1-byte? */ + if (((BYTE)c & 0xE0) == 0xC0) pb->ct = 1; /* 2-byte? */ + if (((BYTE)c & 0xF0) == 0xE0) pb->ct = 2; /* 3-byte? */ + if (((BYTE)c & 0xF1) == 0xF0) pb->ct = 3; /* 4-byte? */ + return; + } else { /* In the multi-byte sequence */ + if (((BYTE)c & 0xC0) != 0x80) { /* Broken sequence? */ + pb->ct = 0; continue; + } + pb->bs[++pb->wi] = (BYTE)c; /* Save the trailing byte */ + if (--pb->ct == 0) break; /* End of multi-byte sequence? */ + return; + } + } + tp = (TCHAR*)pb->bs; + dc = tchar2uni(&tp); /* UTF-8 ==> UTF-16 */ + if (dc == 0xFFFFFFFF) return; + wc = (WCHAR)dc; + hs = (WCHAR)(dc >> 16); +#elif FF_LFN_UNICODE == 3 /* UTF-32 input */ + if (IsSurrogate(c) || c >= 0x110000) return; + if (c >= 0x10000) { + hs = (WCHAR)(0xD800 | ((c >> 10) - 0x40)); /* Make high surrogate */ + wc = 0xDC00 | (c & 0x3FF); /* Make low surrogate */ + } else { + hs = 0; + wc = (WCHAR)c; + } +#endif + +#if FF_STRF_ENCODE == 1 /* Write a character in UTF-16LE */ + if (hs != 0) { + st_word(&pb->buf[i], hs); + i += 2; + nc++; + } + st_word(&pb->buf[i], wc); + i += 2; +#elif FF_STRF_ENCODE == 2 /* Write a character in UTF-16BE */ + if (hs != 0) { + pb->buf[i++] = (BYTE)(hs >> 8); + pb->buf[i++] = (BYTE)hs; + nc++; + } + pb->buf[i++] = (BYTE)(wc >> 8); + pb->buf[i++] = (BYTE)wc; +#elif FF_STRF_ENCODE == 3 /* Write it in UTF-8 */ + if (hs != 0) { /* 4-byte */ + nc += 3; + hs = (hs & 0x3FF) + 0x40; + pb->buf[i++] = (BYTE)(0xF0 | hs >> 8); + pb->buf[i++] = (BYTE)(0x80 | (hs >> 2 & 0x3F)); + pb->buf[i++] = (BYTE)(0x80 | (hs & 3) << 4 | (wc >> 6 & 0x0F)); + pb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F)); + } else { + if (wc < 0x80) { /* 1-byte */ + pb->buf[i++] = (BYTE)wc; + } else { + if (wc < 0x800) { /* 2-byte */ + nc += 1; + pb->buf[i++] = (BYTE)(0xC0 | wc >> 6); + } else { /* 3-byte */ + nc += 2; + pb->buf[i++] = (BYTE)(0xE0 | wc >> 12); + pb->buf[i++] = (BYTE)(0x80 | (wc >> 6 & 0x3F)); + } + pb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F)); + } + } +#else /* Write it in ANSI/OEM */ + if (hs != 0) return; + wc = ff_uni2oem(wc, CODEPAGE); /* UTF-16 ==> ANSI/OEM */ + if (wc == 0) return; + if (wc >= 0x100) { + pb->buf[i++] = (BYTE)(wc >> 8); nc++; + } + pb->buf[i++] = (BYTE)wc; +#endif + +#else /* ANSI/OEM input (without re-encode) */ + pb->buf[i++] = (BYTE)c; +#endif + + if (i >= (int)(sizeof pb->buf) - 4) { /* Write buffered characters to the file */ + f_write(pb->fp, pb->buf, (UINT)i, &n); + i = (n == (UINT)i) ? 0 : -1; + } + pb->idx = i; + pb->nchr = nc + 1; +} + + +static int putc_flush ( /* Flush left characters in the buffer */ + putbuff* pb +) +{ + UINT nw; + + if ( pb->idx >= 0 /* Flush buffered characters to the file */ + && f_write(pb->fp, pb->buf, (UINT)pb->idx, &nw) == FR_OK + && (UINT)pb->idx == nw) return pb->nchr; + return EOF; +} + + +static void putc_init ( /* Initialize write buffer */ + putbuff* pb, + FIL* fp +) +{ + mem_set(pb, 0, sizeof (putbuff)); + pb->fp = fp; +} + + + +int f_putc ( + TCHAR c, /* A character to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + + + putc_init(&pb, fp); + putc_bfd(&pb, c); /* Put the character */ + return putc_flush(&pb); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a String to the File */ +/*-----------------------------------------------------------------------*/ + +int f_puts ( + const TCHAR* str, /* Pointer to the string to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + putbuff pb; + + + putc_init(&pb, fp); + while (*str) putc_bfd(&pb, *str++); /* Put the string */ + return putc_flush(&pb); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a Formatted String to the File */ +/*-----------------------------------------------------------------------*/ + +int f_printf ( + FIL* fp, /* Pointer to the file object */ + const TCHAR* fmt, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + putbuff pb; + BYTE f, r; + UINT i, j, w; + DWORD v; + TCHAR c, d, str[32], *p; + + + putc_init(&pb, fp); + + va_start(arp, fmt); + + for (;;) { + c = *fmt++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape character */ + putc_bfd(&pb, c); + continue; + } + w = f = 0; + c = *fmt++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *fmt++; + } else { + if (c == '-') { /* Flag: left justified */ + f = 2; c = *fmt++; + } + } + if (c == '*') { /* Minimum width by argument */ + w = va_arg(arp, int); + c = *fmt++; + } else { + while (IsDigit(c)) { /* Minimum width */ + w = w * 10 + c - '0'; + c = *fmt++; + } + } + if (c == 'l' || c == 'L') { /* Type prefix: Size is long int */ + f |= 4; c = *fmt++; + } + if (c == 0) break; + d = c; + if (IsLower(d)) d -= 0x20; + switch (d) { /* Atgument type is... */ + case 'S' : /* String */ + p = va_arg(arp, TCHAR*); + for (j = 0; p[j]; j++) ; + if (!(f & 2)) { /* Right padded */ + while (j++ < w) putc_bfd(&pb, ' ') ; + } + while (*p) putc_bfd(&pb, *p++) ; /* String body */ + while (j++ < w) putc_bfd(&pb, ' ') ; /* Left padded */ + continue; + + case 'C' : /* Character */ + putc_bfd(&pb, (TCHAR)va_arg(arp, int)); continue; + + case 'B' : /* Unsigned binary */ + r = 2; break; + + case 'O' : /* Unsigned octal */ + r = 8; break; + + case 'D' : /* Signed decimal */ + case 'U' : /* Unsigned decimal */ + r = 10; break; + + case 'X' : /* Unsigned hexdecimal */ + r = 16; break; + + default: /* Unknown type (pass-through) */ + putc_bfd(&pb, c); continue; + } + + /* Get an argument and put it in numeral */ + v = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int)); + if (d == 'D' && (v & 0x80000000)) { + v = 0 - v; + f |= 8; + } + i = 0; + do { + d = (TCHAR)(v % r); v /= r; + if (d > 9) d += (c == 'x') ? 0x27 : 0x07; + str[i++] = d + '0'; + } while (v && i < sizeof str / sizeof *str); + if (f & 8) str[i++] = '-'; + j = i; d = (f & 1) ? '0' : ' '; + if (!(f & 2)) { + while (j++ < w) putc_bfd(&pb, d); /* Right pad */ + } + do { + putc_bfd(&pb, str[--i]); /* Number body */ + } while (i); + while (j++ < w) putc_bfd(&pb, d); /* Left pad */ + } + + va_end(arp); + + return putc_flush(&pb); +} + +#endif /* !FF_FS_READONLY */ +#endif /* FF_USE_STRFUNC */ + + + +#if FF_CODE_PAGE == 0 +/*-----------------------------------------------------------------------*/ +/* Set Active Codepage for the Path Name */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setcp ( + WORD cp /* Value to be set as active code page */ +) +{ + static const WORD validcp[] = { 437, 720, 737, 771, 775, 850, 852, 857, 860, 861, 862, 863, 864, 865, 866, 869, 932, 936, 949, 950, 0}; + static const BYTE* const tables[] = {Ct437, Ct720, Ct737, Ct771, Ct775, Ct850, Ct852, Ct857, Ct860, Ct861, Ct862, Ct863, Ct864, Ct865, Ct866, Ct869, Dc932, Dc936, Dc949, Dc950, 0}; + UINT i; + + + for (i = 0; validcp[i] != 0 && validcp[i] != cp; i++) ; /* Find the code page */ + if (validcp[i] != cp) return FR_INVALID_PARAMETER; /* Not found? */ + + CodePage = cp; + if (cp >= 900) { /* DBCS */ + ExCvt = 0; + DbcTbl = tables[i]; + } else { /* SBCS */ + ExCvt = tables[i]; + DbcTbl = 0; + } + return FR_OK; +} +#endif /* FF_CODE_PAGE == 0 */ + diff --git b/Utilities/Third_Party/fat_fs/src/ff_gen_drv.c a/Utilities/Third_Party/fat_fs/src/ff_gen_drv.c new file mode 100644 index 0000000..2528ed8 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/src/ff_gen_drv.c @@ -0,0 +1,128 @@ +/*! + \file ff_gen_drv.c + \brief FatFs generic low level driver + + \version 2021-05-20, V1.0.0, firmware for GD32 USBFS +*/ + +/* + Copyright (c) 2021, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "ff_gen_drv.h" + + +Disk_drvTypeDef disk = {{0},{0},{0},0}; + +/*! + \brief Links a compatible diskio driver/lun id and increments the number of active linked drivers + \note The number of linked drivers (volumes) is up to 10 due to FatFs limits + \param[in] drv: pointer to the disk IO Driver structure + \param[in] path: pointer to the logical drive path + \param[in] lun: only used for USB Key Disk to add multi-lun management else the parameter must be equal to 0 + \param[out] none + \retval Returns 0 in case of success, otherwise 1 +*/ +uint8_t FATFS_LinkDriverEx(const Diskio_drvTypeDef *drv, char *path, uint8_t lun) +{ + uint8_t ret = 1; + uint8_t DiskNum = 0; + + if(disk.nbr < _VOLUMES) { + disk.is_initialized[disk.nbr] = 0; + disk.drv[disk.nbr] = drv; + disk.lun[disk.nbr] = lun; + DiskNum = disk.nbr++; + path[0] = DiskNum + '0'; + path[1] = ':'; + path[2] = '/'; + path[3] = 0; + ret = 0; + } + + return ret; +} + +/*! + \brief Links a compatible diskio driver/lun id and increments the number of active linked drivers + \note The number of linked drivers (volumes) is up to 10 due to FatFs limits + \param[in] drv: pointer to the disk IO Driver structure + \param[in] path: pointer to the logical drive path + \param[out] none + \retval Returns 0 in case of success, otherwise 1 +*/ +uint8_t FATFS_LinkDriver(const Diskio_drvTypeDef *drv, char *path) +{ + return FATFS_LinkDriverEx(drv, path, 0); +} + +/*! + \brief Unlinks a diskio driver and decrements the number of active linked drivers + \param[in] path: pointer to the logical drive path + \param[in] lun: only used for USB Key Disk to add multi-lun management else the parameter must be equal to 0 + \param[out] none + \retval Returns 0 in case of success, otherwise 1 +*/ +uint8_t FATFS_UnLinkDriverEx(char *path, uint8_t lun) +{ + uint8_t DiskNum = 0; + uint8_t ret = 1; + + if (disk.nbr >= 1) { + DiskNum = path[0] - '0'; + + if (disk.drv[DiskNum] != 0) { + disk.drv[DiskNum] = 0; + disk.lun[DiskNum] = 0; + disk.nbr--; + ret = 0; + } + } + + return ret; +} + +/*! + \brief Unlinks a diskio driver and decrements the number of active linked drivers + \param[in] path: pointer to the logical drive path + \param[out] none + \retval Returns 0 in case of success, otherwise 1 +*/ +uint8_t FATFS_UnLinkDriver(char *path) +{ + return FATFS_UnLinkDriverEx(path, 0); +} + +/*! + \brief Gets number of linked drivers to the FatFs module + \param[in] none + \param[out] none + \retval Number of attached drivers +*/ +uint8_t FATFS_GetAttachedDriversNbr(void) +{ + return disk.nbr; +} diff --git b/Utilities/Third_Party/fat_fs/src/ffsystem.c a/Utilities/Third_Party/fat_fs/src/ffsystem.c new file mode 100644 index 0000000..b88ce15 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/src/ffsystem.c @@ -0,0 +1,170 @@ +/*------------------------------------------------------------------------*/ +/* Sample Code of OS Dependent Functions for FatFs */ +/* (C)ChaN, 2018 */ +/*------------------------------------------------------------------------*/ + + +#include "ff.h" + + +#if FF_USE_LFN == 3 /* Dynamic memory allocation */ + +/*------------------------------------------------------------------------*/ +/* Allocate a memory block */ +/*------------------------------------------------------------------------*/ + +void* ff_memalloc ( /* Returns pointer to the allocated memory block (null if not enough core) */ + UINT msize /* Number of bytes to allocate */ +) +{ + return malloc(msize); /* Allocate a new memory block with POSIX API */ +} + + +/*------------------------------------------------------------------------*/ +/* Free a memory block */ +/*------------------------------------------------------------------------*/ + +void ff_memfree ( + void* mblock /* Pointer to the memory block to free (nothing to do if null) */ +) +{ + free(mblock); /* Free the memory block with POSIX API */ +} + +#endif + + + +#if FF_FS_REENTRANT /* Mutal exclusion */ + +/*------------------------------------------------------------------------*/ +/* Create a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount() function to create a new +/ synchronization object for the volume, such as semaphore and mutex. +/ When a 0 is returned, the f_mount() function fails with FR_INT_ERR. +*/ + +//const osMutexDef_t Mutex[FF_VOLUMES]; /* Table of CMSIS-RTOS mutex */ + + +int ff_cre_syncobj ( /* 1:Function succeeded, 0:Could not create the sync object */ + BYTE vol, /* Corresponding volume (logical drive number) */ + FF_SYNC_t* sobj /* Pointer to return the created sync object */ +) +{ + /* Win32 */ + *sobj = CreateMutex(NULL, FALSE, NULL); + return (int)(*sobj != INVALID_HANDLE_VALUE); + + /* uITRON */ +// T_CSEM csem = {TA_TPRI,1,1}; +// *sobj = acre_sem(&csem); +// return (int)(*sobj > 0); + + /* uC/OS-II */ +// OS_ERR err; +// *sobj = OSMutexCreate(0, &err); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ +// *sobj = xSemaphoreCreateMutex(); +// return (int)(*sobj != NULL); + + /* CMSIS-RTOS */ +// *sobj = osMutexCreate(&Mutex[vol]); +// return (int)(*sobj != NULL); +} + + +/*------------------------------------------------------------------------*/ +/* Delete a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount() function to delete a synchronization +/ object that created with ff_cre_syncobj() function. When a 0 is returned, +/ the f_mount() function fails with FR_INT_ERR. +*/ + +int ff_del_syncobj ( /* 1:Function succeeded, 0:Could not delete due to an error */ + FF_SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ +) +{ + /* Win32 */ + return (int)CloseHandle(sobj); + + /* uITRON */ +// return (int)(del_sem(sobj) == E_OK); + + /* uC/OS-II */ +// OS_ERR err; +// OSMutexDel(sobj, OS_DEL_ALWAYS, &err); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ +// vSemaphoreDelete(sobj); +// return 1; + + /* CMSIS-RTOS */ +// return (int)(osMutexDelete(sobj) == osOK); +} + + +/*------------------------------------------------------------------------*/ +/* Request Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on entering file functions to lock the volume. +/ When a 0 is returned, the file function fails with FR_TIMEOUT. +*/ + +int ff_req_grant ( /* 1:Got a grant to access the volume, 0:Could not get a grant */ + FF_SYNC_t sobj /* Sync object to wait */ +) +{ + /* Win32 */ + return (int)(WaitForSingleObject(sobj, FF_FS_TIMEOUT) == WAIT_OBJECT_0); + + /* uITRON */ +// return (int)(wai_sem(sobj) == E_OK); + + /* uC/OS-II */ +// OS_ERR err; +// OSMutexPend(sobj, FF_FS_TIMEOUT, &err)); +// return (int)(err == OS_NO_ERR); + + /* FreeRTOS */ +// return (int)(xSemaphoreTake(sobj, FF_FS_TIMEOUT) == pdTRUE); + + /* CMSIS-RTOS */ +// return (int)(osMutexWait(sobj, FF_FS_TIMEOUT) == osOK); +} + + +/*------------------------------------------------------------------------*/ +/* Release Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on leaving file functions to unlock the volume. +*/ + +void ff_rel_grant ( + FF_SYNC_t sobj /* Sync object to be signaled */ +) +{ + /* Win32 */ + ReleaseMutex(sobj); + + /* uITRON */ +// sig_sem(sobj); + + /* uC/OS-II */ +// OSMutexPost(sobj); + + /* FreeRTOS */ +// xSemaphoreGive(sobj); + + /* CMSIS-RTOS */ +// osMutexRelease(sobj); +} + +#endif + diff --git b/Utilities/Third_Party/fat_fs/src/ffunicode.c a/Utilities/Third_Party/fat_fs/src/ffunicode.c new file mode 100644 index 0000000..349901b --- /dev/null +++ a/Utilities/Third_Party/fat_fs/src/ffunicode.c @@ -0,0 +1,15597 @@ +/*------------------------------------------------------------------------*/ +/* Unicode handling functions for FatFs R0.13c */ +/*------------------------------------------------------------------------*/ +/* This module will occupy a huge memory in the .const section when the / +/ FatFs is configured for LFN with DBCS. If the system has any Unicode / +/ utilitiy for the code conversion, this module should be modified to use / +/ that function to avoid silly memory consumption. / +/-------------------------------------------------------------------------*/ +/* +/ Copyright (C) 2018, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +*/ + + +#include "ff.h" + +#if FF_USE_LFN /* This module will be blanked at non-LFN configuration */ + +#if FF_DEFINED != 86604 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + +#define MERGE2(a, b) a ## b +#define CVTBL(tbl, cp) MERGE2(tbl, cp) + + +/*------------------------------------------------------------------------*/ +/* Code Conversion Tables */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE == 932 || FF_CODE_PAGE == 0 /* Japanese */ +static const WCHAR uni2oem932[] = { /* Unicode --> Shift_JIS pairs */ + 0x00A7, 0x8198, 0x00A8, 0x814E, 0x00B0, 0x818B, 0x00B1, 0x817D, 0x00B4, 0x814C, 0x00B6, 0x81F7, 0x00D7, 0x817E, 0x00F7, 0x8180, + 0x0391, 0x839F, 0x0392, 0x83A0, 0x0393, 0x83A1, 0x0394, 0x83A2, 0x0395, 0x83A3, 0x0396, 0x83A4, 0x0397, 0x83A5, 0x0398, 0x83A6, + 0x0399, 0x83A7, 0x039A, 0x83A8, 0x039B, 0x83A9, 0x039C, 0x83AA, 0x039D, 0x83AB, 0x039E, 0x83AC, 0x039F, 0x83AD, 0x03A0, 0x83AE, + 0x03A1, 0x83AF, 0x03A3, 0x83B0, 0x03A4, 0x83B1, 0x03A5, 0x83B2, 0x03A6, 0x83B3, 0x03A7, 0x83B4, 0x03A8, 0x83B5, 0x03A9, 0x83B6, + 0x03B1, 0x83BF, 0x03B2, 0x83C0, 0x03B3, 0x83C1, 0x03B4, 0x83C2, 0x03B5, 0x83C3, 0x03B6, 0x83C4, 0x03B7, 0x83C5, 0x03B8, 0x83C6, + 0x03B9, 0x83C7, 0x03BA, 0x83C8, 0x03BB, 0x83C9, 0x03BC, 0x83CA, 0x03BD, 0x83CB, 0x03BE, 0x83CC, 0x03BF, 0x83CD, 0x03C0, 0x83CE, + 0x03C1, 0x83CF, 0x03C3, 0x83D0, 0x03C4, 0x83D1, 0x03C5, 0x83D2, 0x03C6, 0x83D3, 0x03C7, 0x83D4, 0x03C8, 0x83D5, 0x03C9, 0x83D6, + 0x0401, 0x8446, 0x0410, 0x8440, 0x0411, 0x8441, 0x0412, 0x8442, 0x0413, 0x8443, 0x0414, 0x8444, 0x0415, 0x8445, 0x0416, 0x8447, + 0x0417, 0x8448, 0x0418, 0x8449, 0x0419, 0x844A, 0x041A, 0x844B, 0x041B, 0x844C, 0x041C, 0x844D, 0x041D, 0x844E, 0x041E, 0x844F, + 0x041F, 0x8450, 0x0420, 0x8451, 0x0421, 0x8452, 0x0422, 0x8453, 0x0423, 0x8454, 0x0424, 0x8455, 0x0425, 0x8456, 0x0426, 0x8457, + 0x0427, 0x8458, 0x0428, 0x8459, 0x0429, 0x845A, 0x042A, 0x845B, 0x042B, 0x845C, 0x042C, 0x845D, 0x042D, 0x845E, 0x042E, 0x845F, + 0x042F, 0x8460, 0x0430, 0x8470, 0x0431, 0x8471, 0x0432, 0x8472, 0x0433, 0x8473, 0x0434, 0x8474, 0x0435, 0x8475, 0x0436, 0x8477, + 0x0437, 0x8478, 0x0438, 0x8479, 0x0439, 0x847A, 0x043A, 0x847B, 0x043B, 0x847C, 0x043C, 0x847D, 0x043D, 0x847E, 0x043E, 0x8480, + 0x043F, 0x8481, 0x0440, 0x8482, 0x0441, 0x8483, 0x0442, 0x8484, 0x0443, 0x8485, 0x0444, 0x8486, 0x0445, 0x8487, 0x0446, 0x8488, + 0x0447, 0x8489, 0x0448, 0x848A, 0x0449, 0x848B, 0x044A, 0x848C, 0x044B, 0x848D, 0x044C, 0x848E, 0x044D, 0x848F, 0x044E, 0x8490, + 0x044F, 0x8491, 0x0451, 0x8476, 0x2010, 0x815D, 0x2015, 0x815C, 0x2018, 0x8165, 0x2019, 0x8166, 0x201C, 0x8167, 0x201D, 0x8168, + 0x2020, 0x81F5, 0x2021, 0x81F6, 0x2025, 0x8164, 0x2026, 0x8163, 0x2030, 0x81F1, 0x2032, 0x818C, 0x2033, 0x818D, 0x203B, 0x81A6, + 0x2103, 0x818E, 0x2116, 0x8782, 0x2121, 0x8784, 0x212B, 0x81F0, 0x2160, 0x8754, 0x2161, 0x8755, 0x2162, 0x8756, 0x2163, 0x8757, + 0x2164, 0x8758, 0x2165, 0x8759, 0x2166, 0x875A, 0x2167, 0x875B, 0x2168, 0x875C, 0x2169, 0x875D, 0x2170, 0xFA40, 0x2171, 0xFA41, + 0x2172, 0xFA42, 0x2173, 0xFA43, 0x2174, 0xFA44, 0x2175, 0xFA45, 0x2176, 0xFA46, 0x2177, 0xFA47, 0x2178, 0xFA48, 0x2179, 0xFA49, + 0x2190, 0x81A9, 0x2191, 0x81AA, 0x2192, 0x81A8, 0x2193, 0x81AB, 0x21D2, 0x81CB, 0x21D4, 0x81CC, 0x2200, 0x81CD, 0x2202, 0x81DD, + 0x2203, 0x81CE, 0x2207, 0x81DE, 0x2208, 0x81B8, 0x220B, 0x81B9, 0x2211, 0x8794, 0x221A, 0x81E3, 0x221D, 0x81E5, 0x221E, 0x8187, + 0x221F, 0x8798, 0x2220, 0x81DA, 0x2225, 0x8161, 0x2227, 0x81C8, 0x2228, 0x81C9, 0x2229, 0x81BF, 0x222A, 0x81BE, 0x222B, 0x81E7, + 0x222C, 0x81E8, 0x222E, 0x8793, 0x2234, 0x8188, 0x2235, 0x81E6, 0x223D, 0x81E4, 0x2252, 0x81E0, 0x2260, 0x8182, 0x2261, 0x81DF, + 0x2266, 0x8185, 0x2267, 0x8186, 0x226A, 0x81E1, 0x226B, 0x81E2, 0x2282, 0x81BC, 0x2283, 0x81BD, 0x2286, 0x81BA, 0x2287, 0x81BB, + 0x22A5, 0x81DB, 0x22BF, 0x8799, 0x2312, 0x81DC, 0x2460, 0x8740, 0x2461, 0x8741, 0x2462, 0x8742, 0x2463, 0x8743, 0x2464, 0x8744, + 0x2465, 0x8745, 0x2466, 0x8746, 0x2467, 0x8747, 0x2468, 0x8748, 0x2469, 0x8749, 0x246A, 0x874A, 0x246B, 0x874B, 0x246C, 0x874C, + 0x246D, 0x874D, 0x246E, 0x874E, 0x246F, 0x874F, 0x2470, 0x8750, 0x2471, 0x8751, 0x2472, 0x8752, 0x2473, 0x8753, 0x2500, 0x849F, + 0x2501, 0x84AA, 0x2502, 0x84A0, 0x2503, 0x84AB, 0x250C, 0x84A1, 0x250F, 0x84AC, 0x2510, 0x84A2, 0x2513, 0x84AD, 0x2514, 0x84A4, + 0x2517, 0x84AF, 0x2518, 0x84A3, 0x251B, 0x84AE, 0x251C, 0x84A5, 0x251D, 0x84BA, 0x2520, 0x84B5, 0x2523, 0x84B0, 0x2524, 0x84A7, + 0x2525, 0x84BC, 0x2528, 0x84B7, 0x252B, 0x84B2, 0x252C, 0x84A6, 0x252F, 0x84B6, 0x2530, 0x84BB, 0x2533, 0x84B1, 0x2534, 0x84A8, + 0x2537, 0x84B8, 0x2538, 0x84BD, 0x253B, 0x84B3, 0x253C, 0x84A9, 0x253F, 0x84B9, 0x2542, 0x84BE, 0x254B, 0x84B4, 0x25A0, 0x81A1, + 0x25A1, 0x81A0, 0x25B2, 0x81A3, 0x25B3, 0x81A2, 0x25BC, 0x81A5, 0x25BD, 0x81A4, 0x25C6, 0x819F, 0x25C7, 0x819E, 0x25CB, 0x819B, + 0x25CE, 0x819D, 0x25CF, 0x819C, 0x25EF, 0x81FC, 0x2605, 0x819A, 0x2606, 0x8199, 0x2640, 0x818A, 0x2642, 0x8189, 0x266A, 0x81F4, + 0x266D, 0x81F3, 0x266F, 0x81F2, 0x3000, 0x8140, 0x3001, 0x8141, 0x3002, 0x8142, 0x3003, 0x8156, 0x3005, 0x8158, 0x3006, 0x8159, + 0x3007, 0x815A, 0x3008, 0x8171, 0x3009, 0x8172, 0x300A, 0x8173, 0x300B, 0x8174, 0x300C, 0x8175, 0x300D, 0x8176, 0x300E, 0x8177, + 0x300F, 0x8178, 0x3010, 0x8179, 0x3011, 0x817A, 0x3012, 0x81A7, 0x3013, 0x81AC, 0x3014, 0x816B, 0x3015, 0x816C, 0x301D, 0x8780, + 0x301F, 0x8781, 0x3041, 0x829F, 0x3042, 0x82A0, 0x3043, 0x82A1, 0x3044, 0x82A2, 0x3045, 0x82A3, 0x3046, 0x82A4, 0x3047, 0x82A5, + 0x3048, 0x82A6, 0x3049, 0x82A7, 0x304A, 0x82A8, 0x304B, 0x82A9, 0x304C, 0x82AA, 0x304D, 0x82AB, 0x304E, 0x82AC, 0x304F, 0x82AD, + 0x3050, 0x82AE, 0x3051, 0x82AF, 0x3052, 0x82B0, 0x3053, 0x82B1, 0x3054, 0x82B2, 0x3055, 0x82B3, 0x3056, 0x82B4, 0x3057, 0x82B5, + 0x3058, 0x82B6, 0x3059, 0x82B7, 0x305A, 0x82B8, 0x305B, 0x82B9, 0x305C, 0x82BA, 0x305D, 0x82BB, 0x305E, 0x82BC, 0x305F, 0x82BD, + 0x3060, 0x82BE, 0x3061, 0x82BF, 0x3062, 0x82C0, 0x3063, 0x82C1, 0x3064, 0x82C2, 0x3065, 0x82C3, 0x3066, 0x82C4, 0x3067, 0x82C5, + 0x3068, 0x82C6, 0x3069, 0x82C7, 0x306A, 0x82C8, 0x306B, 0x82C9, 0x306C, 0x82CA, 0x306D, 0x82CB, 0x306E, 0x82CC, 0x306F, 0x82CD, + 0x3070, 0x82CE, 0x3071, 0x82CF, 0x3072, 0x82D0, 0x3073, 0x82D1, 0x3074, 0x82D2, 0x3075, 0x82D3, 0x3076, 0x82D4, 0x3077, 0x82D5, + 0x3078, 0x82D6, 0x3079, 0x82D7, 0x307A, 0x82D8, 0x307B, 0x82D9, 0x307C, 0x82DA, 0x307D, 0x82DB, 0x307E, 0x82DC, 0x307F, 0x82DD, + 0x3080, 0x82DE, 0x3081, 0x82DF, 0x3082, 0x82E0, 0x3083, 0x82E1, 0x3084, 0x82E2, 0x3085, 0x82E3, 0x3086, 0x82E4, 0x3087, 0x82E5, + 0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9, 0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED, + 0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1, 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, 0x309E, 0x8155, + 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, 0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, 0x30A8, 0x8347, + 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, 0x30AC, 0x834B, 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, 0x30B0, 0x834F, + 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, 0x30B4, 0x8353, 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, 0x30B8, 0x8357, + 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, 0x30BC, 0x835B, 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, 0x30C0, 0x835F, + 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, 0x30C4, 0x8363, 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, 0x30C8, 0x8367, + 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, 0x30CC, 0x836B, 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, 0x30D0, 0x836F, + 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, 0x30D4, 0x8373, 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, 0x30D8, 0x8377, + 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, 0x30DC, 0x837B, 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, 0x30E0, 0x8380, + 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, 0x30E4, 0x8384, 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, 0x30E8, 0x8388, + 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, 0x30EC, 0x838C, 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, 0x30F0, 0x8390, + 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, 0x30F4, 0x8394, 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, 0x30FC, 0x815B, + 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, 0x3232, 0x878B, 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, 0x32A6, 0x8787, + 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, 0x330D, 0x8769, 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, 0x3323, 0x876B, + 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, 0x3336, 0x8766, 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, 0x334D, 0x8762, + 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, 0x337C, 0x878F, 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, 0x338F, 0x8773, + 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, 0x33A1, 0x8775, 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, 0x4E01, 0x929A, + 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, 0x4E09, 0x8E4F, 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, 0x4E0E, 0x975E, + 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, 0x4E15, 0x98A1, 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, 0x4E19, 0x95B8, + 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, 0x4E28, 0xFA68, 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, 0x4E32, 0x8BF8, + 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, 0x4E3B, 0x8EE5, 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, 0x4E43, 0x9454, + 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, 0x4E4E, 0x8CC1, 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, 0x4E57, 0x8FE6, + 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, 0x4E5E, 0x8CEE, 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, 0x4E73, 0x93FB, + 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, 0x4E85, 0x98AB, 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, 0x4E8A, 0x98AD, + 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, 0x4E91, 0x895D, 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, 0x4E98, 0x986A, + 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, 0x4E9E, 0x98B1, 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, 0x4EA2, 0x98B4, + 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, 0x4EA8, 0x8B9C, 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, 0x4EAE, 0x97BA, + 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, 0x4EBA, 0x906C, 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, 0x4EC4, 0x98BA, + 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, 0x4ECB, 0x89EE, 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, 0x4ED4, 0x8E65, + 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, 0x4ED8, 0x9574, 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, 0x4EDF, 0x98C0, + 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, 0x4EE5, 0x88C8, 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, 0x4EF2, 0x9287, + 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, 0x4EFC, 0xFA6A, 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, 0x4F09, 0x98C2, + 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, 0x4F0F, 0x959A, 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, 0x4F1C, 0x98E5, + 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, 0x4F34, 0x94BA, 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, 0x4F3A, 0x8E66, + 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, 0x4F46, 0x9241, 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, 0x4F4F, 0x8F5A, + 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, 0x4F55, 0x89BD, 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, 0x4F5A, 0x98C3, + 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, 0x4F5E, 0x9B43, 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, 0x4F73, 0x89C0, + 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, 0x4F7C, 0x8CF1, 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, 0x4F88, 0x98CA, + 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, 0x4F8F, 0x98CB, 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, 0x4F96, 0x98D3, + 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, 0x4F9D, 0x88CB, 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, 0x4FAD, 0x9699, + 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, 0x4FB6, 0x97B5, 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, 0x4FC4, 0x89E2, + 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, 0x4FCE, 0x98D7, 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, 0x4FD7, 0x91AD, + 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, 0x4FDD, 0x95DB, 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, 0x4FE4, 0x98DD, + 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, 0x4FF3, 0x946F, 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, 0x4FFA, 0x89B4, + 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, 0x5006, 0x98ED, 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, 0x500F, 0xE0C5, + 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, 0x5016, 0x8CF4, 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, 0x501F, 0x8ED8, + 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, 0x5024, 0x926C, 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, 0x5029, 0x98E8, + 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, 0x502D, 0x9860, 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, 0x5042, 0xFA7A, + 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, 0x5048, 0x98F3, 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, 0x5055, 0x98F1, + 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, 0x5065, 0x8C92, 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, 0x5074, 0x91A4, + 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, 0x507D, 0x8B55, 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, 0x5091, 0x8C86, + 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, 0x509A, 0x98F9, 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, 0x50B3, 0x9942, + 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, 0x50BE, 0x8C58, 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, 0x50CA, 0x9941, + 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, 0x50D5, 0x966C, 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, 0x50DE, 0x9945, + 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, 0x50ED, 0x9947, 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, 0x50F9, 0x994A, + 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, 0x5102, 0x994E, 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, 0x5114, 0x9951, + 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, 0x511A, 0x9952, 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, 0x5132, 0x96D7, + 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, 0x513C, 0x9956, 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, 0x5143, 0x8CB3, + 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, 0x5147, 0x8BA2, 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, 0x514B, 0x8D8E, + 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, 0x5150, 0x8E99, 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, 0x515C, 0x8A95, + 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, 0x5168, 0x9153, 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, 0x516C, 0x8CF6, + 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, 0x5175, 0x95BA, 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, 0x517C, 0x8C93, + 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, 0x5186, 0x897E, 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, 0x518D, 0x8DC4, + 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, 0x5192, 0x9660, 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, 0x5197, 0x8FE7, + 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, 0x51A2, 0x996E, 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, 0x51A8, 0x9579, + 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, 0x51AC, 0x937E, 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, 0x51B3, 0x9972, + 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, 0x51B7, 0x97E2, 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, 0x51C5, 0x9978, + 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, 0x51CC, 0x97BD, 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, 0x51DC, 0xEAA3, + 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, 0x51E6, 0x8F88, 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, 0x51EC, 0xFA83, + 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, 0x51F5, 0x9981, 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, 0x51FA, 0x8F6F, + 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, 0x5203, 0x906E, 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, 0x5208, 0x8AA0, + 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, 0x5211, 0x8C59, 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, 0x521D, 0x8F89, + 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, 0x5229, 0x9798, 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, 0x5233, 0x998A, + 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, 0x5239, 0x998B, 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, 0x5244, 0x998D, + 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, 0x524C, 0x998F, 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, 0x5256, 0x9655, + 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, 0x5264, 0x8DDC, 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, 0x526F, 0x959B, + 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, 0x5273, 0x9995, 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, 0x527F, 0x9996, + 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, 0x5289, 0x97AB, 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, 0x5294, 0x9999, + 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, 0x52A0, 0x89C1, 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, 0x52AA, 0x9377, + 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, 0x52AF, 0xFB77, 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, 0x52B9, 0x8CF8, + 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, 0x52C1, 0x99A4, 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, 0x52C9, 0x95D7, + 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, 0x52D7, 0x99A6, 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, 0x52DD, 0x8F9F, + 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, 0x52E2, 0x90A8, 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, 0x52E7, 0x8AA9, + 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, 0x52F8, 0x99AE, 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, 0x52FF, 0x96DC, + 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, 0x5305, 0x95EF, 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, 0x530D, 0x99B3, + 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, 0x5316, 0x89BB, 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, 0x531D, 0x9178, + 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, 0x5324, 0xFA8B, 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, 0x5333, 0x99BB, + 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, 0x533B, 0x88E3, 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, 0x5343, 0x90E7, + 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, 0x5348, 0x8CDF, 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, 0x5351, 0x94DA, + 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, 0x5357, 0x93EC, 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, 0x535E, 0x99C4, + 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, 0x536E, 0x99C6, 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, 0x5372, 0xFA8C, + 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, 0x5377, 0x99C9, 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, 0x5382, 0x99CA, + 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, 0x5398, 0x97D0, 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, 0x53A5, 0x99CE, + 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, 0x53AD, 0x897D, 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, 0x53B3, 0x8CB5, + 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, 0x53C3, 0x99D2, 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, 0x53CB, 0x9746, + 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, 0x53D4, 0x8F66, 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, 0x53DB, 0x94BE, + 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, 0x53E2, 0x9170, 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, 0x53E8, 0x99D9, + 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, 0x53EC, 0x8FA2, 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, 0x53F0, 0x91E4, + 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, 0x53F6, 0x8A90, 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, 0x5401, 0x99DC, + 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, 0x5409, 0x8B67, 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, 0x540D, 0x96BC, + 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, 0x5411, 0x8CFC, 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, 0x5420, 0x9669, + 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, 0x542C, 0x99DF, 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, 0x5438, 0x8B7A, + 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, 0x543D, 0x99DD, 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, 0x5446, 0x95F0, + 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, 0x544E, 0x99E6, 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, 0x546A, 0x8EF4, + 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, 0x5475, 0x99E8, 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, 0x547C, 0x8CC4, + 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, 0x5486, 0x99F4, 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, 0x548E, 0x99E9, + 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, 0x549C, 0xFA91, 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, 0x54A8, 0x99FC, + 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, 0x54AF, 0x9A5D, 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, 0x54BC, 0x9A44, + 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, 0x54C1, 0x9569, 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, 0x54C8, 0x99FB, + 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, 0x54E2, 0x9A4E, 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, 0x54E9, 0x9689, + 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, 0x54FA, 0x9A4D, 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, 0x5506, 0x8DB4, + 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, 0x5514, 0x9A49, 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, 0x5531, 0x8FA5, + 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, 0x553E, 0x91C1, 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, 0x5546, 0x8FA4, + 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, 0x5556, 0x9A56, 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, 0x5563, 0x9A51, + 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, 0x5580, 0x9A5C, 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, 0x5587, 0x9A68, + 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, 0x5598, 0x9A62, 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, 0x559D, 0x8A85, + 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, 0x55A8, 0x9A69, 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, 0x55AC, 0x8BAA, + 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, 0x55C4, 0x9A6D, 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, 0x55DA, 0x9A6A, + 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, 0x55E4, 0x9A6F, 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, 0x55FE, 0x9A74, + 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, 0x5616, 0x9A73, 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, 0x5629, 0x89DC, + 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, 0x5634, 0x9A7B, 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, 0x564C, 0x9158, + 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, 0x5664, 0x9A81, 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, 0x566C, 0x9A83, + 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, 0x5680, 0x9A86, 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, 0x568F, 0x9A8A, + 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, 0x56A5, 0x9A8B, 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, 0x56BC, 0x9A90, + 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, 0x56C3, 0x9A92, 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, 0x56D3, 0x9A97, + 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, 0x56DB, 0x8E6C, 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, 0x56EE, 0x9A99, + 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, 0x56F9, 0x9A9A, 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, 0x5700, 0x9A9B, + 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, 0x5709, 0x9A9E, 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, 0x5712, 0x8980, + 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, 0x571C, 0x9AA6, 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, 0x5728, 0x8DDD, + 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, 0x5738, 0x9AA9, 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, 0x5747, 0x8BCF, + 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, 0x5750, 0x8DBF, 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, 0x5764, 0x8DA3, + 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, 0x576A, 0x92D8, 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, 0x5789, 0x9AB3, + 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, 0x57A2, 0x8D43, 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, 0x57AC, 0xFA98, + 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, 0x57C3, 0x9ABA, 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, 0x57CB, 0x9684, + 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, 0x57D4, 0x9ABC, 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, 0x57E0, 0x9575, + 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, 0x57F9, 0x947C, 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, 0x5802, 0x93B0, + 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, 0x580B, 0x9AC2, 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, 0x5821, 0x9AC6, + 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, 0x5830, 0x8981, 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, 0x583A, 0x8DE4, + 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, 0x584A, 0x89F2, 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, 0x5854, 0x9383, + 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, 0x585A, 0x92CB, 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, 0x586B, 0x9355, + 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, 0x5879, 0x9ACD, 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, 0x5893, 0x95E6, + 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, 0x589F, 0x9AD0, 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, 0x58B2, 0xFA9E, + 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, 0x58BA, 0x9AD2, 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, 0x58C5, 0x9AD7, + 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, 0x58D1, 0x9AD9, 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, 0x58D8, 0x9ADC, + 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, 0x58DF, 0x9AE0, 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, 0x58EC, 0x9070, + 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, 0x58F1, 0x88EB, 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, 0x58FA, 0x9AE2, + 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, 0x5902, 0x9AE7, 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, 0x590F, 0x89C4, + 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, 0x5918, 0x99C7, 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, 0x591C, 0x96E9, + 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, 0x5929, 0x9356, 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, 0x592D, 0x9AEE, + 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, 0x5937, 0x88CE, 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, 0x5947, 0x8AEF, + 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, 0x594F, 0x9174, 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, 0x5954, 0x967A, + 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, 0x595A, 0x9AF6, 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, 0x5962, 0x9AF8, + 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, 0x5968, 0x8FA7, 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, 0x596E, 0x95B1, + 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, 0x597D, 0x8D44, 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, 0x5984, 0x96CF, + 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, 0x5996, 0x9764, 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, 0x59A3, 0x9B45, + 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, 0x59AC, 0x9369, 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, 0x59BB, 0x8DC8, + 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, 0x59CB, 0x8E6E, 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, 0x59D4, 0x88CF, + 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, 0x59E5, 0x8957, 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, 0x59EB, 0x9550, + 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, 0x5A01, 0x88D0, 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, 0x5A18, 0x96BA, + 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, 0x5A20, 0x9050, 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, 0x5A35, 0x9B56, + 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, 0x5A41, 0x984B, 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, 0x5A62, 0x9B58, + 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, 0x5A7F, 0x96B9, 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, 0x5ABC, 0x9B5B, + 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, 0x5AC2, 0x9B5E, 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, 0x5AD0, 0x9B6B, + 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, 0x5AE3, 0x9B60, 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, 0x5AFB, 0x9B66, + 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, 0x5B16, 0x9B69, 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, 0x5B30, 0x8964, + 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, 0x5B40, 0x9B71, 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, 0x5B51, 0x9B72, + 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, 0x5B57, 0x8E9A, 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, 0x5B5C, 0x8E79, + 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, 0x5B64, 0x8CC7, 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, 0x5B6B, 0x91B7, + 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, 0x5B75, 0x9B7A, 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, 0x5B83, 0x9B80, + 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, 0x5B89, 0x88C0, 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, 0x5B8F, 0x8D47, + 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, 0x5B99, 0x9288, 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, 0x5B9D, 0x95F3, + 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, 0x5BA4, 0x8EBA, 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, 0x5BB0, 0x8DC9, + 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, 0x5BB6, 0x89C6, 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, 0x5BC0, 0xFAA7, + 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, 0x5BC5, 0x93D0, 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, 0x5BCC, 0x9578, + 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, 0x5BD4, 0x9B86, 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, 0x5BDE, 0x9B8B, + 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, 0x5BE4, 0x9B88, 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, 0x5BE8, 0x9ECB, + 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, 0x5BEE, 0x97BE, 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, 0x5BF6, 0x9B8F, + 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, 0x5BFF, 0x8EF5, 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, 0x5C05, 0x9B91, + 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, 0x5C09, 0x88D1, 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, 0x5C0E, 0x93B1, + 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, 0x5C16, 0x90EB, 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, 0x5C22, 0x9B97, + 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, 0x5C31, 0x8F41, 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, 0x5C3B, 0x904B, + 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, 0x5C3F, 0x9441, 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, 0x5C46, 0x9B9C, + 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, 0x5C4D, 0x8E72, 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, 0x5C51, 0x8BFB, + 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, 0x5C60, 0x936A, 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, 0x5C6C, 0x9BA2, + 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, 0x5C76, 0x9BA5, 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, 0x5C91, 0x9BA8, + 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, 0x5CA8, 0x915A, 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, 0x5CB1, 0x91D0, + 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, 0x5CB8, 0x8ADD, 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, 0x5CBE, 0x9BB1, + 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, 0x5CE0, 0x93BB, 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, 0x5CEA, 0x9BB9, + 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, 0x5CF5, 0xFAAE, 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, 0x5CFD, 0x9BB5, + 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, 0x5D11, 0x9BC0, 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, 0x5D17, 0x9BBC, + 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, 0x5D1B, 0x9BBF, 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, 0x5D29, 0x95F6, + 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, 0x5D4E, 0x9BC8, 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, 0x5D5C, 0x9BBD, + 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, 0x5D6F, 0x8DB5, 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, 0x5D84, 0x9BCE, + 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, 0x5D90, 0x9BD5, 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, 0x5DAE, 0x9BD3, + 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, 0x5DBA, 0x97E4, 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, 0x5DCC, 0x8ADE, + 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, 0x5DD3, 0x9BDA, 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, 0x5DDE, 0x8F42, + 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, 0x5DE6, 0x8DB6, 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, 0x5DEE, 0x8DB7, + 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, 0x5DF4, 0x9462, 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, 0x5DFD, 0x9246, + 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, 0x5E06, 0x94BF, 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, 0x5E16, 0x929F, + 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, 0x5E1D, 0x92E9, 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, 0x5E2F, 0x91D1, + 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, 0x5E37, 0x9BE7, 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, 0x5E43, 0x9BE9, + 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, 0x5E4C, 0x9679, 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, 0x5E57, 0x9BEC, + 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, 0x5E63, 0x95BC, 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, 0x5E74, 0x944E, + 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, 0x5E79, 0x8AB2, 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, 0x5E7D, 0x9748, + 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, 0x5E83, 0x8D4C, 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, 0x5E8F, 0x8F98, + 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, 0x5E9A, 0x8D4D, 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, 0x5EA7, 0x8DC0, + 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, 0x5EB6, 0x8F8E, 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, 0x5EC2, 0x9BF9, + 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, 0x5ECA, 0x984C, 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, 0x5ED6, 0x9C40, + 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, 0x5EDF, 0x955F, 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, 0x5EE3, 0x9C41, + 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, 0x5EF0, 0x9C4C, 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, 0x5EF6, 0x8984, + 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, 0x5EFB, 0x89F4, 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, 0x5F01, 0x95D9, + 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, 0x5F0A, 0x95BE, 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, 0x5F0F, 0x8EAE, + 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, 0x5F14, 0x92A2, 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, 0x5F18, 0x8D4F, + 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, 0x5F25, 0x96ED, 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, 0x5F2D, 0x9C58, + 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, 0x5F35, 0x92A3, 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, 0x5F3E, 0x9265, + 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, 0x5F4A, 0x8BAE, 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, 0x5F53, 0x9396, + 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, 0x5F5C, 0x9C53, 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, 0x5F66, 0x9546, + 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, 0x5F6B, 0x92A4, 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, 0x5F71, 0x8965, + 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, 0x5F7C, 0x94DE, 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, 0x5F82, 0x9C68, + 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, 0x5F87, 0x9C6D, 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, 0x5F8C, 0x8CE3, + 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, 0x5F93, 0x8F5D, 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, 0x5F9E, 0x9C6E, + 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, 0x5FA9, 0x959C, 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, 0x5FB3, 0x93BF, + 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, 0x5FBC, 0x9C74, 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, 0x5FCC, 0x8AF5, + 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, 0x5FD8, 0x9659, 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, 0x5FDE, 0xFABB, + 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, 0x5FF0, 0x9CAB, 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, 0x5FFB, 0x9C76, + 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, 0x600F, 0x9C89, 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, 0x6016, 0x957C, + 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, 0x601D, 0x8E76, 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, 0x6026, 0x9C88, + 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, 0x602A, 0x89F6, 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, 0x603A, 0x9C8A, + 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, 0x6046, 0x9C91, 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, 0x6050, 0x8BB0, + 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, 0x605A, 0x9C8B, 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, 0x6062, 0x89F8, + 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, 0x6068, 0x8DA6, 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, 0x606C, 0x9C97, + 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, 0x6075, 0x8C62, 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, 0x6084, 0x9C9F, + 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, 0x608B, 0x9CA5, 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, 0x6094, 0x89F7, + 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, 0x609B, 0x9CA0, 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, 0x60A6, 0x8978, + 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, 0x60B2, 0x94DF, 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, 0x60B6, 0x96E3, + 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, 0x60C5, 0x8FEE, 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, 0x60D3, 0x9CA9, + 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, 0x60DC, 0x90C9, 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, 0x60E1, 0x9CA6, + 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, 0x60F0, 0x91C4, 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, 0x60F4, 0x9CB6, + 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, 0x60FA, 0x9CB7, 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, 0x6103, 0x9CB8, + 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, 0x610D, 0x9CBC, 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, 0x6115, 0x9CB1, + 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, 0x6120, 0xFAC1, 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, 0x612C, 0x9CC5, + 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, 0x613C, 0x9CC4, 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, 0x6142, 0x9CC8, + 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, 0x614A, 0x9CC2, 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, 0x614E, 0x9054, + 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, 0x6159, 0x9CCD, 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, 0x6162, 0x969D, + 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, 0x6168, 0x8A53, 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, 0x6170, 0x88D4, + 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, 0x6175, 0x9CD7, 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, 0x6182, 0x974A, + 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, 0x6190, 0x97F7, 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, 0x6198, 0xFAC6, + 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, 0x61A7, 0x93B2, 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, 0x61AE, 0x9CE1, + 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, 0x61BE, 0x8AB6, 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, 0x61C8, 0x9CE6, + 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, 0x61CC, 0x9CE2, 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, 0x61E6, 0x9CED, + 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, 0x61F7, 0x9CE5, 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, 0x61FD, 0x9CF3, + 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, 0x6208, 0x9CF7, 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, 0x620D, 0x9CF9, + 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, 0x6212, 0x89FA, 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, 0x621A, 0x90CA, + 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, 0x621F, 0x8C81, 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, 0x622E, 0x9D43, + 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, 0x6233, 0x9D46, 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, 0x623F, 0x965B, + 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, 0x6248, 0xE7BB, 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, 0x624E, 0x9D48, + 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, 0x625B, 0x9D4B, 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, 0x6268, 0x9D4D, + 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, 0x6279, 0x94E1, 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, 0x6280, 0x8B5A, + 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, 0x6289, 0x9D50, 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, 0x6293, 0x9D53, + 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, 0x6297, 0x8D52, 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, 0x629E, 0x91F0, + 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, 0x62B1, 0x95F8, 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, 0x62BC, 0x899F, + 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, 0x62C6, 0x9D5D, 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, 0x62CA, 0x9D62, + 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, 0x62D0, 0x89FB, 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, 0x62D4, 0x9D55, + 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, 0x62DB, 0x8FB5, 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, 0x62E1, 0x8A67, + 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, 0x62EF, 0x9D6D, 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, 0x62F6, 0x8E41, + 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, 0x6301, 0x8E9D, 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, 0x6309, 0x88C2, + 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, 0x631F, 0x8BB2, 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, 0x632F, 0x9055, + 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, 0x633F, 0x917D, 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, 0x634F, 0x9D73, + 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, 0x635C, 0x917B, 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, 0x636B, 0x9D7E, + 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, 0x6377, 0x8FB7, 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, 0x6383, 0x917C, + 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, 0x638E, 0x9D75, 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, 0x6398, 0x8C40, + 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, 0x63A1, 0x8DCC, 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, 0x63A7, 0x8D54, + 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, 0x63AB, 0x9D77, 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, 0x63B5, 0x9D7D, + 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, 0x63C3, 0x91B5, 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, 0x63CF, 0x9560, + 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, 0x63DA, 0x9767, 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, 0x63E9, 0x9D82, + 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, 0x63F6, 0x9D88, 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, 0x640F, 0x9D93, + 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, 0x641C, 0x9D72, 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, 0x642D, 0x938B, + 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, 0x643E, 0x8DEF, 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, 0x6460, 0xFACA, + 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, 0x6476, 0x9D96, 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, 0x6488, 0x9D9D, + 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, 0x649A, 0x9451, 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, 0x64A5, 0x9D9B, + 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, 0x64AE, 0x8E42, 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, 0x64BB, 0x9DA3, + 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, 0x64C5, 0x9DA1, 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, 0x64D2, 0x9DA0, + 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, 0x64E0, 0x9DA9, 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, 0x64E6, 0x8E43, + 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, 0x64F1, 0x9DA6, 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, 0x64FA, 0x9DB2, + 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, 0x6505, 0x9DB7, 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, 0x6523, 0x9DB9, + 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, 0x652C, 0x9DAE, 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, 0x6536, 0x9DBE, + 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, 0x653B, 0x8D55, 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, 0x6548, 0x9DC1, + 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, 0x6551, 0x8B7E, 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, 0x6558, 0x9DC5, + 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, 0x6562, 0x8AB8, 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, 0x6570, 0x9094, + 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, 0x6577, 0x957E, 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, 0x6587, 0x95B6, + 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, 0x658E, 0x8DD6, 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, 0x6599, 0x97BF, + 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, 0x65A1, 0x88B4, 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, 0x65AB, 0x9DCF, + 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, 0x65B0, 0x9056, 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, 0x65BD, 0x8E7B, + 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, 0x65C5, 0x97B7, 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, 0x65CF, 0x91B0, + 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, 0x65DB, 0x9DD7, 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, 0x65E5, 0x93FA, + 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, 0x65E9, 0x9181, 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, 0x65FA, 0x89A0, + 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, 0x6603, 0x9DDE, 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, 0x660A, 0x9DDD, + 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, 0x6613, 0x88D5, 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, 0x661E, 0xFAD3, + 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, 0x6625, 0x8F74, 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, 0x662E, 0xFAD2, + 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, 0x6635, 0x9DE1, 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, 0x663F, 0x9E45, + 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, 0x6644, 0x9DE6, 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, 0x6652, 0x8E4E, + 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, 0x665E, 0x9DE9, 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, 0x6665, 0xFAD5, + 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, 0x6669, 0x94D3, 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, 0x6673, 0xFAD9, + 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, 0x6681, 0x8BC5, 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, 0x6688, 0x9DF2, + 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, 0x6696, 0x9267, 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, 0x669D, 0x9DF7, + 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, 0x66AB, 0x8E62, 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, 0x66B8, 0x9E41, + 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, 0x66BF, 0xFADD, 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, 0x66C9, 0x9DFA, + 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, 0x66DC, 0x976A, 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, 0x66E9, 0x9E47, + 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, 0x66F4, 0x8D58, 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, 0x66F9, 0x9182, + 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, 0x66FD, 0x915D, 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, 0x6703, 0x98F0, + 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, 0x670D, 0x959E, 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, 0x6715, 0x92BD, + 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, 0x671D, 0x92A9, 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, 0x6727, 0x9E4F, + 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, 0x672C, 0x967B, 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, 0x6734, 0x9670, + 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, 0x673A, 0x8AF7, 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, 0x6746, 0x9E57, + 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, 0x6750, 0x8DDE, 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, 0x6759, 0x9E5A, + 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, 0x6760, 0x9E59, 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, 0x6764, 0x9E5C, + 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, 0x676D, 0x8D59, 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, 0x6772, 0x9DDC, + 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, 0x677C, 0x9E60, 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, 0x6787, 0x94F8, + 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, 0x6790, 0x90CD, 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, 0x679C, 0x89CA, + 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, 0x67A2, 0x9095, 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, 0x67B3, 0x9E6B, + 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, 0x67B8, 0x9E6D, 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, 0x67C1, 0x91C6, + 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, 0x67CE, 0x9E74, 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, 0x67D3, 0x90F5, + 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, 0x67DD, 0x9E70, 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, 0x67E7, 0x9E76, + 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, 0x67EF, 0x9E68, 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, 0x67F5, 0x8DF2, + 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, 0x6801, 0xFAE5, 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, 0x6813, 0x90F0, + 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, 0x6821, 0x8D5A, 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, 0x682B, 0x9E81, + 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, 0x6839, 0x8DAA, 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, 0x6841, 0x8C85, + 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, 0x6846, 0x9E79, 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, 0x6850, 0x8BCB, + 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, 0x6854, 0x8B6A, 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, 0x685F, 0x8E56, + 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, 0x6876, 0x89B1, 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, 0x6881, 0x97C0, + 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, 0x688F, 0x9E87, 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, 0x689B, 0x9E8B, + 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, 0x68A2, 0x8FBD, 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, 0x68AD, 0x9E88, + 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, 0x68B3, 0x9E80, 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, 0x68BA, 0x9E92, + 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, 0x68C8, 0xFA64, 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, 0x68CD, 0x9E9E, + 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, 0x68D5, 0x9EA1, 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, 0x68DF, 0x938F, + 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, 0x68E7, 0x9EA0, 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, 0x68F9, 0x9EA8, + 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, 0x6904, 0x9EA4, 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, 0x690C, 0x9E9D, + 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, 0x6912, 0x9EA3, 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, 0x691C, 0x8C9F, + 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, 0x6925, 0x9EA7, 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, 0x6930, 0x9EBD, + 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, 0x693D, 0x9EBB, 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, 0x6954, 0x9EB6, + 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, 0x695C, 0x9EB3, 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, 0x6961, 0x9EBE, + 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, 0x696B, 0x9EB5, 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, 0x6973, 0x9480, + 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, 0x6978, 0x9EB4, 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, 0x697E, 0x9EB7, + 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, 0x698E, 0x897C, 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, 0x6998, 0xFAEB, + 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, 0x69A7, 0x9ED0, 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, 0x69B4, 0x9ED6, + 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, 0x69C1, 0x9EC7, 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, 0x69CB, 0x8D5C, + 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, 0x69D0, 0x9EC5, 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, 0x69DD, 0x9ECD, + 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, 0x69E8, 0x9ED8, 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, 0x69F9, 0x9EDD, + 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, 0x6A02, 0x9ED9, 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, 0x6A0C, 0x9EEC, + 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, 0x6A17, 0x9294, 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, 0x6A1F, 0x8FBE, + 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, 0x6A29, 0x8CA0, 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, 0x6A30, 0xFAED, + 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, 0x6A39, 0x8EF7, 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, 0x6A46, 0xFAEF, + 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, 0x6A58, 0x8B6B, 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, 0x6A62, 0x9EF1, + 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, 0x6A73, 0xFAF0, 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, 0x6A80, 0x9268, + 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, 0x6A90, 0x9EF7, 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, 0x6AA2, 0x9EFB, + 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, 0x6AAE, 0x9E8D, 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, 0x6AC1, 0x9EE8, + 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, 0x6AD3, 0x9845, 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, 0x6ADF, 0x9F4A, + 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, 0x6AEA, 0x9F4D, 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, 0x6B05, 0x9F4F, + 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, 0x6B1D, 0x8954, 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, 0x6B23, 0x8BD3, + 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, 0x6B38, 0x9F56, 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, 0x6B3E, 0x8ABC, + 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, 0x6B4C, 0x89CC, 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, 0x6B54, 0x9F60, + 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, 0x6B61, 0x9F63, 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, 0x6B66, 0x9590, + 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, 0x6B73, 0x8DCE, 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, 0x6B7B, 0x8E80, + 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, 0x6B84, 0x9F68, 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, 0x6B8B, 0x8E63, + 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, 0x6B98, 0x9F6B, 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, 0x6BAB, 0x9F70, + 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, 0x6BB3, 0x9F74, 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, 0x6BBA, 0x8E45, + 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, 0x6BC0, 0x9ACA, 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, 0x6BCD, 0x95EA, + 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, 0x6BD4, 0x94E4, 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, 0x6BDF, 0x9F7A, + 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, 0x6BF3, 0x9F7D, 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, 0x6C13, 0x9F82, + 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, 0x6C23, 0x9F86, 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, 0x6C38, 0x8969, + 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, 0x6C41, 0x8F60, 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, 0x6C55, 0x9F88, + 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, 0x6C5D, 0x93F0, 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, 0x6C62, 0x9F89, + 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, 0x6C70, 0x91BF, 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, 0x6C7D, 0x8B44, + 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, 0x6C83, 0x9780, 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, 0x6C8D, 0x9F8C, + 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, 0x6C96, 0x89AB, 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, 0x6CA1, 0x9676, + 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, 0x6CB1, 0x9F9D, 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, 0x6CBA, 0x9F9F, + 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, 0x6CBE, 0x9F9E, 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, 0x6CC5, 0x9F9A, + 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, 0x6CD3, 0x9F97, 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, 0x6CDA, 0xFAF9, + 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, 0x6CE2, 0x9467, 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, 0x6CEA, 0x9FA3, + 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, 0x6CF3, 0x896A, 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, 0x6D12, 0x9FAD, + 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, 0x6D1E, 0x93B4, 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, 0x6D2A, 0x8D5E, + 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, 0x6D35, 0x9FAB, 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, 0x6D3D, 0x9FA8, + 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, 0x6D45, 0x90F3, 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, 0x6D63, 0x9FAF, + 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, 0x6D6A, 0x9851, 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, 0x6D74, 0x9781, + 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, 0x6D85, 0x9FB8, 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, 0x6D8E, 0x9FB5, + 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, 0x6D99, 0x97DC, 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, 0x6DAF, 0x8A55, + 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, 0x6DBC, 0x97C1, 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, 0x6DC7, 0x9FBD, + 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, 0x6DD1, 0x8F69, 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, 0x6DD9, 0x9FC8, + 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, 0x6DE6, 0x9FBE, 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, 0x6DEC, 0x9FC1, + 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, 0x6DF3, 0x8F7E, 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, 0x6DF9, 0x9FB9, + 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, 0x6E05, 0x90B4, 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, 0x6E0A, 0x9FBB, + 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, 0x6E19, 0x9FD0, 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, 0x6E1F, 0x9FD9, + 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, 0x6E24, 0x9FDD, 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, 0x6E29, 0x89B7, + 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, 0x6E2E, 0x9FCF, 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, 0x6E3A, 0x9FDB, + 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, 0x6E4A, 0x96A9, 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, 0x6E58, 0x8FC3, + 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, 0x6E67, 0x974E, 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, 0x6E72, 0x9FD1, + 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, 0x6E80, 0x969E, 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, 0x6E90, 0x8CB9, + 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, 0x6E9D, 0x8D61, 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, 0x6EAA, 0x9FE2, + 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, 0x6EB7, 0x9FE5, 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, 0x6EC2, 0x9FEF, + 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, 0x6ECB, 0x8EA0, 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, 0x6ED4, 0x9FEB, + 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, 0x6EEC, 0x9FF4, 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, 0x6EF7, 0xE042, + 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, 0x6F01, 0x8B99, 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, 0x6F0F, 0x9852, + 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, 0x6F15, 0x9186, 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, 0x6F2B, 0x969F, + 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, 0x6F38, 0x9151, 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, 0x6F45, 0x8AC1, + 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, 0x6F5C, 0x90F6, 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, 0x6F6D, 0xE04B, + 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, 0x6F74, 0xE06B, 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, 0x6F80, 0xE047, + 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, 0x6F86, 0xE043, 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, 0x6F97, 0x8AC0, + 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, 0x6FAA, 0xE059, 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, 0x6FB9, 0xE057, + 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, 0x6FC3, 0x945A, 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, 0x6FD8, 0xE05E, + 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, 0x6FE1, 0x9447, 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, 0x6FEE, 0xE060, + 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, 0x6FF5, 0xFB4D, 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, 0x7001, 0xE066, + 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, 0x700B, 0xE063, 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, 0x7018, 0xE06D, + 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, 0x701E, 0x93D2, 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, 0x7028, 0xFB50, + 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, 0x703E, 0xE070, 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, 0x7063, 0xE073, + 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, 0x7078, 0x8B84, 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, 0x7089, 0x9846, + 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, 0x7099, 0xE074, 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, 0x70AE, 0xE07B, + 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, 0x70B9, 0x935F, 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, 0x70CB, 0xE07D, + 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, 0x70DF, 0xE07C, 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, 0x7104, 0xFB54, + 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, 0x7119, 0xE084, 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, 0x7126, 0x8FC5, + 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, 0x7147, 0xFB57, 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, 0x7155, 0xE086, + 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, 0x7162, 0xE089, 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, 0x7167, 0x8FC6, + 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, 0x717D, 0x90F8, 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, 0x718F, 0xE08D, + 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, 0x719F, 0x8F6E, 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, 0x71B9, 0xE094, + 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, 0x71C8, 0x9395, 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, 0x71D2, 0xE096, + 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, 0x71DF, 0x9A7A, 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, 0x71E7, 0xE09C, + 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, 0x71F5, 0xE09D, 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, 0x71FE, 0xFB5A, + 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, 0x7210, 0xE0A2, 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, 0x722C, 0xE0A6, + 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, 0x7235, 0x8EDD, 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, 0x723C, 0xE0AA, + 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, 0x7240, 0xE0AC, 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, 0x724B, 0xE0AE, + 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, 0x7259, 0x89E5, 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, 0x7261, 0x89B2, + 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, 0x7272, 0x90B5, 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, 0x727E, 0xE0B1, + 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, 0x7287, 0xE0B4, 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, 0x72A2, 0xE0B7, + 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, 0x72B1, 0xFB5B, 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, 0x72BE, 0xFB5C, + 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, 0x72C6, 0xE0BC, 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, 0x72D7, 0x8BE7, + 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, 0x72E1, 0xE0C2, 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, 0x72ED, 0x8BB7, + 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, 0x72FC, 0x9854, 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, 0x7317, 0xE0C6, + 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, 0x731F, 0x97C2, 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, 0x732A, 0x9296, + 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, 0x7334, 0xE0CB, 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, 0x733F, 0x898E, + 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, 0x734F, 0xE0D1, 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, 0x736A, 0xE0D4, + 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, 0x7377, 0xFB5F, 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, 0x7384, 0x8CBA, + 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, 0x7396, 0x8BE8, 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, 0x73BB, 0xE0DE, + 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, 0x73C8, 0xE0DB, 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, 0x73CE, 0xE0DD, + 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, 0x73E0, 0x8EEC, 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, 0x73ED, 0x94C7, + 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, 0x73F8, 0xE0E7, 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, 0x7406, 0x979D, + 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, 0x7425, 0xE0E6, 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, 0x742E, 0xFB6A, + 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, 0x7435, 0x94FA, 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, 0x7441, 0xE0EE, + 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, 0x745B, 0x896C, 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, 0x7460, 0x97DA, + 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, 0x7469, 0xE0F0, 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, 0x7473, 0x8DBA, + 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, 0x7489, 0xFB6C, 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, 0x74A2, 0xE0E3, + 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, 0x74CA, 0xE0F9, 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, 0x74E0, 0xE140, + 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, 0x74E7, 0xE142, 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, 0x74F1, 0xE147, + 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, 0x74F8, 0xE148, 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, 0x7505, 0xE14C, + 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, 0x7511, 0x8D99, 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, 0x751A, 0x9072, + 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, 0x7523, 0x8E59, 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, 0x752B, 0x95E1, + 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, 0x7531, 0x9752, 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, 0x7538, 0x99B2, + 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, 0x7544, 0xE156, 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, 0x754B, 0x9DC0, + 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, 0x7551, 0x94A8, 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, 0x755B, 0xE15A, + 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, 0x7562, 0x954C, 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, 0x7567, 0xE15F, + 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, 0x756D, 0xE161, 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, 0x7574, 0xE166, + 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, 0x757F, 0x8B45, 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, 0x7589, 0xE168, + 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, 0x758F, 0x9160, 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, 0x759D, 0xE16C, + 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, 0x75B1, 0xE176, 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, 0x75B8, 0xE174, + 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, 0x75BE, 0x8EBE, 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, 0x75C7, 0x8FC7, + 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, 0x75D4, 0x8EA4, 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, 0x75DB, 0x92C9, + 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, 0x75E9, 0x9189, 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, 0x75F4, 0x9273, + 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, 0x75FF, 0xE17E, 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, 0x760D, 0xE187, + 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, 0x7622, 0xE18D, 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, 0x7634, 0xE18F, + 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, 0x7647, 0xE192, 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, 0x7656, 0x95C8, + 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, 0x7662, 0xE198, 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, 0x766A, 0xE19B, + 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, 0x7676, 0xE1A0, 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, 0x767C, 0xE1A2, + 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, 0x7682, 0xFB70, 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, 0x7687, 0x8D63, + 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, 0x7690, 0x8E48, 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, 0x769A, 0xE1AB, + 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, 0x76A6, 0xFB74, 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, 0x76B7, 0xEA89, + 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, 0x76BF, 0x8E4D, 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, 0x76C8, 0x896D, + 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, 0x76D6, 0xE1B3, 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, 0x76DE, 0xE1B5, + 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, 0x76E4, 0x94D5, 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, 0x76EE, 0x96DA, + 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, 0x76FB, 0xE1BB, 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, 0x7707, 0xE1BD, + 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, 0x770C, 0x8CA7, 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, 0x7720, 0x96B0, + 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, 0x7729, 0xE1BF, 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, 0x773C, 0x8AE1, + 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, 0x775A, 0xE1C8, 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, 0x7765, 0xE1CC, + 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, 0x7779, 0xE1CF, 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, 0x778E, 0xE1D0, + 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, 0x77A5, 0x95CB, 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, 0x77B3, 0x93B5, + 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, 0x77BC, 0xE1D9, 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, 0x77CD, 0xE1DD, + 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, 0x77DC, 0xE1E0, 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, 0x77E7, 0x948A, + 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, 0x77EF, 0x8BB8, 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, 0x780C, 0xE1E4, + 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, 0x7820, 0xE1E7, 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, 0x7827, 0x8B6D, + 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, 0x783F, 0x8D7B, 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, 0x7864, 0xFB7A, + 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, 0x7872, 0x94A1, 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, 0x7881, 0x8CE9, + 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, 0x788D, 0x8A56, 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, 0x7895, 0x8DEA, + 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, 0x78A7, 0x95C9, 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, 0x78B5, 0xE1F1, + 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, 0x78C1, 0x8EA5, 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, 0x78CB, 0xE1F6, + 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, 0x78DA, 0xE241, 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, 0x78EF, 0x88E9, + 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, 0x7907, 0xE244, 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, 0x7919, 0xE247, + 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, 0x792C, 0xE248, 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, 0x793E, 0x8ED0, + 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, 0x7948, 0x8B46, 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, 0x7955, 0xE24F, + 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, 0x795D, 0x8F6A, 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, 0x7962, 0x9449, + 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, 0x7977, 0x9398, 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, 0x7981, 0x8BD6, + 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, 0x798D, 0x89D0, 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, 0x799B, 0xFB83, + 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, 0x79AA, 0xE257, 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, 0x79B9, 0xE25A, + 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, 0x79BF, 0x93C3, 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, 0x79CB, 0x8F48, + 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, 0x79D8, 0x94E9, 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, 0x79E4, 0x9489, + 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, 0x79EC, 0xE25F, 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, 0x7A08, 0xE262, + 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, 0x7A14, 0x96AB, 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, 0x7A1A, 0x9274, + 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, 0x7A2E, 0x8EED, 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, 0x7A3B, 0xE26A, + 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, 0x7A3F, 0x8D65, 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, 0x7A46, 0x9673, + 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, 0x7A4F, 0x89B8, 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, 0x7A62, 0xE271, + 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, 0x7A70, 0xE274, 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, 0x7A7A, 0x8BF3, + 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, 0x7A83, 0x90DE, 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, 0x7A93, 0x918B, + 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, 0x7A98, 0xE27A, 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, 0x7AAE, 0x8B87, + 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, 0x7ABA, 0x894D, 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, 0x7AC5, 0xE281, + 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, 0x7ACB, 0x97A7, 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, 0x7AD2, 0x9AF2, + 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, 0x7ADA, 0xE28C, 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, 0x7AE0, 0x8FCD, + 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, 0x7AE5, 0x93B6, 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, 0x7AEB, 0xFB87, + 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, 0x7AF6, 0x8BA3, 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, 0x7AFF, 0x8AC6, + 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, 0x7B08, 0x8B88, 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, 0x7B11, 0x8FCE, + 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, 0x7B1E, 0xE29A, 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, 0x7B28, 0xE29C, + 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, 0x7B36, 0xE29D, 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, 0x7B48, 0x94A4, + 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, 0x7B4D, 0xE2A1, 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, 0x7B52, 0x939B, + 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, 0x7B65, 0xE2A6, 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, 0x7B70, 0xE2A9, + 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, 0x7B7A, 0xE29F, 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, 0x7B8D, 0xE2B0, + 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, 0x7B95, 0x96A5, 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, 0x7B9A, 0xE2B2, + 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, 0x7B9F, 0xE2AF, 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, 0x7BB1, 0x94A0, + 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, 0x7BC1, 0xE2B9, 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, 0x7BC9, 0x927A, + 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, 0x7BDD, 0xE2BE, 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, 0x7BE6, 0xE2C2, + 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, 0x7BF6, 0xE2CC, 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, 0x7C0D, 0xE2CB, + 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, 0x7C14, 0xE2C1, 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, 0x7C23, 0xE2CD, + 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, 0x7C37, 0xE2D1, 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, 0x7C3F, 0x95EB, + 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, 0x7C4D, 0x90D0, 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, 0x7C56, 0xE2DD, + 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, 0x7C64, 0xE2DC, 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, 0x7C75, 0xE2E0, + 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, 0x7C83, 0xE2E1, 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, 0x7C90, 0xE2E2, + 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, 0x7C98, 0x9453, 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, 0x7CA2, 0xE2E5, + 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, 0x7CA8, 0xE2E8, 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, 0x7CB1, 0xE2EB, + 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, 0x7CBD, 0xE2EE, 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, 0x7CC5, 0xE2F0, + 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, 0x7CD6, 0x939C, 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, 0x7CDF, 0x918C, + 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, 0x7CEF, 0xE2F7, 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, 0x7CF8, 0x8E85, + 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, 0x7D00, 0x8B49, 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, 0x7D06, 0xE2FC, + 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, 0x7D10, 0x9552, 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, 0x7D18, 0x8D68, + 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, 0x7D1C, 0xE341, 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, 0x7D2B, 0x8E87, + 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, 0x7D30, 0x8DD7, 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, 0x7D39, 0x8FD0, + 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, 0x7D43, 0x8CBC, 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, 0x7D48, 0xFB8A, + 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, 0x7D4F, 0xE351, 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, 0x7D5C, 0xFB8B, + 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, 0x7D63, 0xE352, 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, 0x7D71, 0x939D, + 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, 0x7D76, 0x90E2, 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, 0x7D8F, 0xE356, + 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, 0x7D9B, 0xE358, 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, 0x7DA2, 0xE361, + 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, 0x7DAD, 0x88DB, 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, 0x7DB1, 0x8D6A, + 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, 0x7DB7, 0xFB8C, 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, 0x7DBD, 0xE35E, + 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, 0x7DCA, 0x8BD9, 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, 0x7DD2, 0x8F8F, + 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, 0x7DDA, 0x90FC, 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, 0x7DE0, 0x92F7, + 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, 0x7DE9, 0x8AC9, 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, 0x7DF4, 0x97FB, + 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, 0x7E05, 0xE36E, 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, 0x7E12, 0xE372, + 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, 0x7E21, 0xE371, 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, 0x7E2B, 0x9644, + 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, 0x7E35, 0xE37B, 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, 0x7E3B, 0xE37A, + 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, 0x7E43, 0xE37D, 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, 0x7E4D, 0x8F4A, + 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, 0x7E56, 0xE384, 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, 0x7E5E, 0xE385, + 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, 0x7E6A, 0xE389, 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, 0x7E7B, 0xE38C, + 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, 0x7E82, 0x8E5B, 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, 0x7E8A, 0xFA5C, + 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, 0x7E90, 0xE396, 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, 0x7E96, 0xE399, + 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, 0x7F38, 0xE39D, 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, 0x7F4C, 0xE3A0, + 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, 0x7F51, 0xE3A4, 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, 0x7F5F, 0xE3A8, + 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, 0x7F69, 0xE3AB, 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, 0x7F70, 0x94B1, + 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, 0x7F78, 0xE3AD, 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, 0x7F85, 0x9785, + 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, 0x7F8A, 0x9772, 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, 0x7F9A, 0xE3B7, + 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, 0x7FA3, 0xE3B8, 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, 0x7FAE, 0xE3BC, + 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, 0x7FB8, 0xE3BE, 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, 0x7FC5, 0xE3C0, + 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, 0x7FD2, 0x8F4B, 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, 0x7FE1, 0xE3C5, + 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, 0x7FF0, 0x8ACB, 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, 0x7FFC, 0x9783, + 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, 0x8004, 0xE3CC, 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, 0x800C, 0x8EA7, + 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, 0x8017, 0x96D5, 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, 0x8021, 0xE3D2, + 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, 0x803B, 0xE3D5, 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, 0x804A, 0xE3D6, + 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, 0x805A, 0xE3DA, 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, 0x8062, 0xE3DC, + 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, 0x8072, 0xE3DF, 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, 0x8077, 0x9045, + 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, 0x807F, 0xE3E4, 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, 0x8087, 0x94A3, + 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, 0x8093, 0xE3E9, 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, 0x809B, 0xE3E8, + 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, 0x80A5, 0x94EC, 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, 0x80AD, 0xE3EB, + 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, 0x80B4, 0x8DE6, 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, 0x80C6, 0x925F, + 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, 0x80D9, 0xE3F0, 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, 0x80DE, 0x9645, + 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, 0x80EF, 0xE3F6, 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, 0x80FC, 0xE445, + 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, 0x8106, 0x90C6, 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, 0x810A, 0x90D2, + 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, 0x8129, 0xE3F9, 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, 0x8139, 0x92AF, + 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, 0x814E, 0x9074, 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, 0x8154, 0x8D6F, + 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, 0x8166, 0xE449, 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, 0x8171, 0xE446, + 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, 0x817A, 0x9142, 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, 0x8183, 0xE44B, + 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, 0x8193, 0xE455, 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, 0x819D, 0x9547, + 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, 0x81A8, 0x9663, 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, 0x81B5, 0xE458, + 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, 0x81BE, 0xE459, 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, 0x81C6, 0x89B0, + 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, 0x81D1, 0xE461, 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, 0x81DA, 0xE465, + 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, 0x81E5, 0x89E7, 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, 0x81ED, 0x8F4C, + 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, 0x81FB, 0xE46A, 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, 0x8202, 0xE46D, + 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, 0x8209, 0x9DA8, 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, 0x820E, 0x8EC9, + 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, 0x8217, 0x95DC, 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, 0x821E, 0x9591, + 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, 0x822B, 0xE475, 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, 0x8235, 0x91C7, + 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, 0x8239, 0x9144, 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, 0x8259, 0xE479, + 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, 0x8262, 0xE480, 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, 0x826A, 0xE482, + 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, 0x8271, 0xE485, 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, 0x8278, 0xE487, + 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, 0x8292, 0xE48A, 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, 0x82A5, 0x8A48, + 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, 0x82AD, 0x946D, 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, 0x82B8, 0x8C7C, + 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, 0x82C5, 0x8AA1, 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, 0x82D4, 0x91DB, + 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, 0x82DC, 0xE49C, 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, 0x82E3, 0xE490, + 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, 0x82EB, 0x93CF, 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, 0x82F9, 0xE499, + 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, 0x8302, 0x96CE, 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, 0x8306, 0xE49B, + 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, 0x8317, 0xE4AA, 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, 0x8328, 0x88EF, + 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, 0x8332, 0xE4A2, 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, 0x8338, 0x91F9, + 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, 0x8349, 0x9190, 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, 0x8352, 0x8D72, + 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, 0x8375, 0xE4B9, 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, 0x837F, 0xFB95, + 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, 0x838A, 0xE4B5, 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, 0x839A, 0xE4AD, + 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, 0x83A2, 0xE4B0, 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, 0x83B1, 0x9789, + 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, 0x83C5, 0x909B, 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, 0x83CE, 0xE4C0, + 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, 0x83DC, 0x8DD8, 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, 0x83EB, 0xE4BF, + 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, 0x83F2, 0xE4C9, 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, 0x83FB, 0xE4D0, + 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, 0x8407, 0xE4C7, 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, 0x840E, 0x88DE, + 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, 0x8429, 0x948B, 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, 0x8435, 0xE4E0, + 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, 0x8446, 0xE4DC, 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, 0x8457, 0x9298, + 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, 0x8463, 0x939F, 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, 0x846C, 0x9192, + 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, 0x8471, 0x944B, 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, 0x847A, 0x9598, + 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, 0x8490, 0x8F4E, 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, 0x849F, 0xE4E5, + 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, 0x84B4, 0xFB99, 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, 0x84BC, 0x9193, + 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, 0x84C6, 0xE4EC, 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, 0x84CD, 0xE4E7, + 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, 0x84D9, 0xE4E6, 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, 0x84EE, 0x9840, + 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, 0x8500, 0x8EC1, 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, 0x8514, 0xE4F7, + 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, 0x851A, 0x8955, 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, 0x852C, 0xE4F4, + 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, 0x8540, 0xE4F9, 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, 0x8549, 0x8FD4, + 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, 0x8553, 0xFB9A, 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, 0x8559, 0xFB9B, + 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, 0x8569, 0x93A0, 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, 0x8577, 0xE550, + 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, 0x8587, 0xE54E, 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, 0x8591, 0xE547, + 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, 0x859B, 0xE54C, 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, 0x85A8, 0xE549, + 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, 0x85AC, 0x96F2, 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, 0x85B9, 0xE556, + 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, 0x85CD, 0x9795, 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, 0x85DC, 0xE55B, + 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, 0x85E9, 0x94CB, 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, 0x85FA, 0xE561, + 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, 0x8606, 0xE562, 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, 0x8613, 0xE55E, + 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, 0x8622, 0xE563, 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, 0x863F, 0xE566, + 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, 0x8654, 0xE569, 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, 0x865E, 0x8BF1, + 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, 0x8671, 0xE56C, 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, 0x868B, 0xE571, + 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, 0x86A3, 0xE56E, 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, 0x86AB, 0xE57A, + 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, 0x86C4, 0xE575, 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, 0x86CB, 0x9260, + 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, 0x86D9, 0x8A5E, 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, 0x86E4, 0x94B8, + 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, 0x86EE, 0x94D8, 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, 0x86FB, 0xE588, + 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, 0x8703, 0xE587, 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, 0x870A, 0xE58D, + 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, 0x8718, 0x9277, 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, 0x8729, 0xE593, + 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, 0x873F, 0xE58F, 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, 0x874E, 0xE599, + 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, 0x8759, 0xE59E, 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, 0x8766, 0x89DA, + 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, 0x8774, 0xE59A, 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, 0x8782, 0xE5A5, + 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, 0x87AB, 0xE5AC, 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, 0x87BB, 0xE5B1, + 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, 0x87C6, 0xE5B0, 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, 0x87D2, 0xE5BB, + 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, 0x87F6, 0xE5B8, 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, 0x87FE, 0xE5B7, + 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, 0x880E, 0xE5BA, 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, 0x8816, 0xE5BD, + 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, 0x8827, 0xE5C4, 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, 0x883B, 0xE5C5, + 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, 0x8846, 0x8F4F, 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, 0x8853, 0x8F70, + 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, 0x885D, 0x8FD5, 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, 0x8863, 0x88DF, + 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, 0x8872, 0xE5D3, 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, 0x887E, 0xE5CE, + 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, 0x8888, 0x8C55, 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, 0x8896, 0x91B3, + 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, 0x88A2, 0xE5D9, 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, 0x88B0, 0xE5DC, + 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, 0x88B7, 0x88BF, 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, 0x88C3, 0xE5DF, + 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, 0x88D4, 0xE5E1, 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, 0x88DC, 0x95E2, + 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, 0x88E8, 0xE5E9, 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, 0x88F5, 0xFBA2, + 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, 0x88FD, 0x90BB, 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, 0x8907, 0x95A1, + 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, 0x8912, 0x964A, 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, 0x891E, 0xE5F0, + 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, 0x8936, 0xE5F7, 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, 0x8943, 0xE5EF, + 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, 0x8956, 0x89A6, 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, 0x8964, 0xE641, + 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, 0x896F, 0xE644, 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, 0x897E, 0xE647, + 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, 0x8986, 0x95A2, 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, 0x898B, 0x8CA9, + 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, 0x8997, 0x9460, 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, 0x89A6, 0xE64F, + 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, 0x89AC, 0xE650, 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, 0x89BA, 0xE653, + 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, 0x89D2, 0x8A70, 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, 0x89E3, 0x89F0, + 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, 0x89F8, 0xE65C, 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, 0x8A08, 0x8C76, + 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, 0x8A10, 0xE65F, 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, 0x8A17, 0x91F5, + 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, 0x8A1F, 0x8FD7, 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, 0x8A2D, 0x90DD, + 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, 0x8A36, 0xE664, 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, 0x8A3C, 0x8FD8, + 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, 0x8A50, 0x8DBC, 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, 0x8A55, 0x955D, + 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, 0x8A62, 0xE66D, 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, 0x8A6B, 0x986C, + 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, 0x8A70, 0x8B6C, 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, 0x8A79, 0xFBA5, + 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, 0x8A85, 0xE66E, 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, 0x8A8D, 0x9446, + 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, 0x8A98, 0x9755, 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, 0x8AA1, 0xE672, + 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, 0x8AA6, 0xE675, 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, 0x8AAD, 0x93C7, + 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, 0x8ABC, 0x8B62, 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, 0x8AC4, 0xE678, + 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, 0x8ACD, 0xE679, 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, 0x8ADA, 0xE67B, + 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, 0x8ADF, 0xFBA8, 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, 0x8AE4, 0xE680, + 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, 0x8AED, 0x9740, 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, 0x8AF6, 0xFBAA, + 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, 0x8AFE, 0x91F8, 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, 0x8B04, 0x93A3, + 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, 0x8B10, 0xE68D, 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, 0x8B19, 0x8CAA, + 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, 0x8B20, 0xE68F, 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, 0x8B2B, 0xE693, + 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, 0x8B3E, 0xE694, 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, 0x8B4E, 0xE699, + 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, 0x8B58, 0x8EAF, 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, 0x8B5F, 0xE69F, + 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, 0x8B6F, 0xE6A1, 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, 0x8B74, 0xE6A2, + 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, 0x8B80, 0xE6A4, 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, 0x8B8E, 0xE6A6, + 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, 0x8B96, 0xE6A9, 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, 0x8C3A, 0xE6AC, + 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, 0x8C48, 0xE6AF, 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, 0x8C50, 0xE6B2, + 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, 0x8C62, 0xE6B4, 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, 0x8C78, 0xE6B6, + 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, 0x8C82, 0xE6B8, 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, 0x8C8C, 0x9665, + 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, 0x8C98, 0xE6C0, 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, 0x8CA1, 0x8DE0, + 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, 0x8CA9, 0x94CC, 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, 0x8CAD, 0xE6C2, + 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, 0x8CB2, 0xE6C5, 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, 0x8CB7, 0x9483, + 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, 0x8CBD, 0xE6C4, 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, 0x8CC2, 0x9847, + 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, 0x8CC8, 0xE6C9, 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, 0x8CD1, 0x93F6, + 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, 0x8CDC, 0x8E92, 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, 0x8CE3, 0xE6CC, + 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, 0x8CED, 0x9371, 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, 0x8CFB, 0xE6D0, + 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, 0x8D05, 0xE6D2, 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, 0x8D0B, 0x8AE4, + 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, 0x8D12, 0xFBAF, 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, 0x8D64, 0x90D4, + 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, 0x8D6D, 0xE6DE, 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, 0x8D74, 0x958B, + 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, 0x8D85, 0x92B4, 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, 0x8DA8, 0x9096, + 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, 0x8DC2, 0xE6E3, 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, 0x8DD6, 0xE6E8, + 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, 0x8DDF, 0xE6EE, 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, 0x8DEA, 0xE6EC, + 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, 0x8DF5, 0x9148, 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, 0x8E09, 0xE6F2, + 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, 0x8E1D, 0xE6F4, 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, 0x8E30, 0xE6FA, + 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, 0x8E44, 0x92FB, 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, 0x8E4A, 0xE6FC, + 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, 0x8E59, 0xE745, 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, 0x8E64, 0xE746, + 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, 0x8E7C, 0xE74D, 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, 0x8E87, 0xE74F, + 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, 0x8E91, 0xE755, 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, 0x8EA1, 0xE759, + 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, 0x8EAF, 0x8BEB, 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, 0x8EC5, 0xE75F, + 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, 0x8ECB, 0xE761, 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, 0x8ED2, 0x8CAC, + 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, 0x8EE3, 0xE763, 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, 0x8EFC, 0xE764, + 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, 0x8F05, 0xE769, 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, 0x8F12, 0xE76B, + 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, 0x8F19, 0xE76C, 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, 0x8F1F, 0xE76F, + 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, 0x8F2F, 0x8F53, 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, 0x8F3B, 0xE774, + 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, 0x8F44, 0x8A8D, 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, 0x8F4C, 0xE779, + 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, 0x8F5C, 0xE77E, 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, 0x8F63, 0xE781, + 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, 0x8F9E, 0x8EAB, 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, 0x8FA8, 0x999E, + 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, 0x8FB0, 0x9243, 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, 0x8FBA, 0x95D3, + 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, 0x8FC2, 0x8949, 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, 0x8FD1, 0x8BDF, + 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, 0x8FE5, 0xE78A, 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, 0x8FEB, 0x9497, + 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, 0x8FF4, 0xE78F, 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, 0x8FFA, 0xE792, + 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, 0x9003, 0x93A6, 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, 0x900D, 0xE796, + 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, 0x9011, 0xE793, 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, 0x9016, 0xE798, + 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, 0x901D, 0x90C0, 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, 0x9021, 0xE795, + 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, 0x902E, 0x91DF, 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, 0x9036, 0xE79B, + 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, 0x903E, 0xE7A5, 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, 0x9047, 0x8BF6, + 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, 0x904D, 0x95D5, 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, 0x9051, 0xE7A1, + 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, 0x9055, 0x88E1, 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, 0x905C, 0x91BB, + 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, 0x9063, 0x8CAD, 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, 0x9069, 0x934B, + 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, 0x9072, 0xE7AD, 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, 0x9078, 0x9149, + 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, 0x907F, 0x94F0, 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, 0x9083, 0xE284, + 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, 0x908A, 0xE7B2, 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, 0x90A6, 0x964D, + 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, 0x90B1, 0xE7B7, 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, 0x90CA, 0x8D78, + 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, 0x90E1, 0x8C53, 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, 0x90ED, 0x8A73, + 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, 0x9102, 0xE7BD, 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, 0x9127, 0xFBB9, + 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, 0x9149, 0x93D1, 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, 0x914D, 0x947A, + 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, 0x9156, 0xE7C3, 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, 0x9165, 0xE7C6, + 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, 0x9172, 0xE7C9, 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, 0x9178, 0x8E5F, + 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, 0x918B, 0xE7CA, 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, 0x9197, 0x94AE, + 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, 0x91AA, 0xE7D0, 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, 0x91B5, 0xE7D1, + 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, 0x91C1, 0xE7D5, 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, 0x91C9, 0xE7D6, + 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, 0x91CE, 0x96EC, 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, 0x91D6, 0xE7D9, + 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, 0x91DB, 0xE7DC, 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, 0x91DF, 0xE7DA, + 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, 0x91E5, 0xFBC0, 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, 0x91EE, 0xFBBE, + 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, 0x91FF, 0xE7E1, 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, 0x920E, 0x8A62, + 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, 0x9215, 0xE7E4, 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, 0x9234, 0x97E9, + 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, 0x923C, 0xFBC6, 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, 0x9245, 0xE7E8, + 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, 0x924E, 0xFBC7, 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, 0x9259, 0xFBC8, + 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, 0x9262, 0x94AB, 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, 0x9271, 0x8D7A, + 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, 0x9280, 0x8BE2, 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, 0x9291, 0x914C, + 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, 0x9298, 0x96C1, 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, 0x92A7, 0xFBCC, + 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, 0x92CF, 0xE7F5, 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, 0x92D5, 0xFBD4, + 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, 0x92E4, 0x8F9B, 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, 0x92ED, 0x8973, + 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, 0x92F9, 0xFA65, 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, 0x92FF, 0xFBDC, + 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, 0x9310, 0x908D, 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, 0x931D, 0xFBDD, + 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, 0x9322, 0xE841, 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, 0x9328, 0x9564, + 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, 0x932F, 0x8DF6, 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, 0x933B, 0xE846, + 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, 0x934D, 0x9374, 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, 0x935B, 0x9262, + 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, 0x936E, 0xE84A, 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, 0x937E, 0x8FDF, + 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, 0x9397, 0x9199, 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, 0x93AC, 0xE84D, + 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, 0x93B9, 0xE850, 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, 0x93D0, 0xE858, + 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, 0x93D8, 0xE855, 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, 0x93E4, 0xE85A, + 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, 0x9403, 0xE85E, 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, 0x9414, 0xE85C, + 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, 0x9421, 0xE864, 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, 0x9436, 0xE861, + 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, 0x9444, 0xE868, 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, 0x9452, 0xE867, + 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, 0x945E, 0xE86C, 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, 0x9470, 0xE86F, + 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, 0x947D, 0xE872, 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, 0x9577, 0x92B7, + 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, 0x9587, 0xE879, 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, 0x958F, 0x895B, + 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, 0x9594, 0xE87B, 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, 0x95A0, 0xE880, + 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, 0x95A5, 0x94B4, 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, 0x95B2, 0x897B, + 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, 0x95BE, 0xE887, 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, 0x95CC, 0xE88C, + 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, 0x95D6, 0xE88F, 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, 0x95E2, 0xE893, + 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, 0x9628, 0xE895, 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, 0x9632, 0x9668, + 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, 0x9642, 0xE898, 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, 0x964D, 0x8D7E, + 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, 0x965C, 0xE89D, 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, 0x9662, 0x8940, + 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, 0x9666, 0xE8A1, 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, 0x9672, 0xE8A2, + 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, 0x9677, 0xE89C, 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, 0x9685, 0x8BF7, + 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, 0x968B, 0xE440, 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, 0x9694, 0x8A75, + 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, 0x9699, 0x8C84, 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, 0x96A0, 0x8942, + 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, 0x96AA, 0xE8A8, 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, 0x96B2, 0xE8AB, + 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, 0x96B8, 0xE8AF, 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, 0x96C0, 0x909D, + 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, 0x96C6, 0x8F57, 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, 0x96CC, 0x8E93, + 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, 0x96D5, 0xE8B8, 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, 0x96DC, 0xE8B6, + 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, 0x96EA, 0x90E1, 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, 0x96F6, 0x97EB, + 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, 0x9700, 0x8EF9, 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, 0x9708, 0xE8BC, + 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, 0x970F, 0xE8C0, 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, 0x9719, 0xE8C2, + 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, 0x9727, 0x96B6, 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, 0x9733, 0xFBED, + 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, 0x973D, 0xE8C7, 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, 0x9744, 0xE8C9, + 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, 0x974D, 0xFBF0, 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, 0x9755, 0xFBF3, + 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, 0x975E, 0x94F1, 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, 0x9764, 0xE8D0, + 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, 0x976B, 0xE8D4, 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, 0x9779, 0xE8D6, + 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, 0x9784, 0x8A93, 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, 0x978D, 0x88C6, + 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, 0x979C, 0xE8DF, 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, 0x97A8, 0xE8E0, + 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, 0x97B4, 0xE8E4, 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, 0x97CB, 0xE8E8, + 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, 0x97EE, 0x9442, 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, 0x97F6, 0xE8EE, + 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, 0x9802, 0x92B8, 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, 0x9808, 0x907B, + 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, 0x9811, 0x8AE6, 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, 0x9818, 0x97CC, + 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, 0x982C, 0x966A, 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, 0x9838, 0xE8F2, + 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, 0x9846, 0xE8F7, 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, 0x984E, 0x8A7B, + 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, 0x9857, 0xFBF4, 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, 0x9865, 0xFBF5, + 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, 0x9870, 0xE8FC, 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, 0x98A8, 0x9597, + 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, 0x98B6, 0xE946, 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, 0x98DB, 0x94F2, + 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, 0x98E9, 0xE94A, 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, 0x98EF, 0x94D1, + 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, 0x98FD, 0x964F, 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, 0x9909, 0xE94D, + 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, 0x9912, 0xE94E, 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, 0x991D, 0xE952, + 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, 0x9924, 0xE954, 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, 0x992E, 0xE957, + 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, 0x9945, 0xE95C, 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, 0x9950, 0xE95D, + 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, 0x9957, 0x8BC0, 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, 0x9999, 0x8D81, + 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, 0x99AC, 0x946E, 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, 0x99B4, 0x93E9, + 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, 0x99C5, 0x8977, 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, 0x99D1, 0xE96D, + 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, 0x99DB, 0xE96A, 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, 0x99ED, 0xE96E, + 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, 0x99F8, 0xE973, 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, 0x9A05, 0xE976, + 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, 0x9A13, 0x8CB1, 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, 0x9A30, 0x93AB, + 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, 0x9A42, 0xE97C, 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, 0x9A4E, 0xFBFB, + 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, 0x9A5B, 0xE983, 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, 0x9A65, 0xE987, + 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, 0x9AA8, 0x8D9C, 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, 0x9ABC, 0xE98E, + 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, 0x9AD1, 0xE991, 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, 0x9AD9, 0xFBFC, + 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, 0x9AE2, 0xE996, 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, 0x9AEB, 0xE99A, + 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, 0x9AF1, 0xE99D, 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, 0x9B06, 0xE9A0, + 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, 0x9B22, 0xE9A4, 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, 0x9B28, 0xE9A8, + 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, 0x9B2F, 0xE9AC, 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, 0x9B3C, 0x8B53, + 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, 0x9B44, 0xE9AE, 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, 0x9B4F, 0xE9B0, + 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, 0x9B5A, 0x8B9B, 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, 0x9B75, 0xFC41, + 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, 0x9B91, 0xE9B8, 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, 0x9B97, 0xE9BA, + 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, 0x9BAA, 0x968E, 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, 0x9BB1, 0xFC44, + 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, 0x9BC0, 0xE9BF, 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, 0x9BCF, 0xE9C3, + 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, 0x9BD6, 0x8E49, 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, 0x9BE3, 0xE9C6, + 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, 0x9BF1, 0xE9CD, 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, 0x9C04, 0xE9D8, + 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, 0x9C0A, 0xE9D7, 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, 0x9C12, 0xE9D6, + 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, 0x9C1B, 0xE9DA, 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, 0x9C2D, 0x9568, + 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, 0x9C32, 0xE9E0, 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, 0x9C3E, 0xE9E2, + 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, 0x9C52, 0x9690, 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, 0x9C67, 0xE9E5, + 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, 0x9CE7, 0xE9E8, 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, 0x9CF0, 0xE9EA, + 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, 0x9D03, 0xE9EE, 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, 0x9D09, 0xE9EB, + 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, 0x9D1B, 0x8995, 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, 0x9D28, 0x8A9B, + 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, 0x9D3B, 0x8D83, 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, 0x9D44, 0xE9F5, + 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, 0x9D51, 0xEA43, 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, 0x9D5E, 0xEA41, + 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, 0x9D6B, 0xFC48, 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, 0x9D72, 0xEA46, + 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, 0x9D8F, 0x8C7B, 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, 0x9DAB, 0xEA49, + 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, 0x9DB8, 0xEA53, 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, 0x9DC2, 0xEA57, + 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, 0x9DD3, 0xEA59, 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, 0x9DEF, 0xEA5D, + 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, 0x9DFA, 0x8DEB, 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, 0x9E1B, 0xEA60, + 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, 0x9E79, 0xEA63, 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, 0x9E88, 0xEA66, + 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, 0x9E92, 0xEA69, 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, 0x9E9D, 0xEA6C, + 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, 0x9EA9, 0xEA6E, 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, 0x9EB9, 0x8D8D, + 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, 0x9EBE, 0x9F80, 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, 0x9ECD, 0x8B6F, + 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, 0x9ED1, 0xFC4B, 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, 0x9ED9, 0x96D9, + 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, 0x9EDE, 0xEA79, 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, 0x9EEF, 0xEA7E, + 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, 0x9EF9, 0xEA83, 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, 0x9F07, 0xEA87, + 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, 0x9F15, 0xEA8A, 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, 0x9F3B, 0x9540, + 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, 0x9F4E, 0xE6D8, 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, 0x9F5F, 0xEA92, + 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, 0x9F63, 0xEA91, 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, 0x9F6C, 0xEA97, + 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, 0x9F8D, 0x97B4, 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, 0x9FA0, 0xEA9E, + 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, 0xFA0F, 0xFA9B, 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, 0xFA13, 0xFAE8, + 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, 0xFA17, 0xFB75, 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, 0xFA1B, 0xFB82, + 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, 0xFA1F, 0xFB9D, 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, 0xFA23, 0xFBB1, + 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, 0xFA27, 0xFBD3, 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, 0xFA2B, 0xFBF7, + 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, 0xFF02, 0xFA57, 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, 0xFF06, 0x8195, + 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, 0xFF0A, 0x8196, 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, 0xFF0E, 0x8144, + 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, 0xFF12, 0x8251, 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, 0xFF16, 0x8255, + 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, 0xFF1A, 0x8146, 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, 0xFF1E, 0x8184, + 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, 0xFF22, 0x8261, 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, 0xFF26, 0x8265, + 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, 0xFF2A, 0x8269, 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, 0xFF2E, 0x826D, + 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, 0xFF32, 0x8271, 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, 0xFF36, 0x8275, + 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, 0xFF3A, 0x8279, 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, 0xFF3E, 0x814F, + 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, 0xFF42, 0x8282, 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, 0xFF46, 0x8286, + 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, 0xFF4A, 0x828A, 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, 0xFF4E, 0x828E, + 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, 0xFF52, 0x8292, 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, 0xFF56, 0x8296, + 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, 0xFF5A, 0x829A, 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, 0xFF5E, 0x8160, + 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, 0xFF64, 0x00A4, 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, 0xFF68, 0x00A8, + 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, 0xFF6C, 0x00AC, 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, 0xFF70, 0x00B0, + 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, 0xFF74, 0x00B4, 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, 0xFF78, 0x00B8, + 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, 0xFF7C, 0x00BC, 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, 0xFF80, 0x00C0, + 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, 0xFF84, 0x00C4, 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, 0xFF88, 0x00C8, + 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, 0xFF8C, 0x00CC, 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, 0xFF90, 0x00D0, + 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, 0xFF94, 0x00D4, 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, 0xFF98, 0x00D8, + 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, 0xFF9C, 0x00DC, 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, 0xFFE0, 0x8191, + 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, 0xFFE4, 0xFA55, 0xFFE5, 0x818F, 0, 0 +}; + +static const WCHAR oem2uni932[] = { /* Shift_JIS --> Unicode pairs */ + 0x00A1, 0xFF61, 0x00A2, 0xFF62, 0x00A3, 0xFF63, 0x00A4, 0xFF64, 0x00A5, 0xFF65, 0x00A6, 0xFF66, 0x00A7, 0xFF67, 0x00A8, 0xFF68, + 0x00A9, 0xFF69, 0x00AA, 0xFF6A, 0x00AB, 0xFF6B, 0x00AC, 0xFF6C, 0x00AD, 0xFF6D, 0x00AE, 0xFF6E, 0x00AF, 0xFF6F, 0x00B0, 0xFF70, + 0x00B1, 0xFF71, 0x00B2, 0xFF72, 0x00B3, 0xFF73, 0x00B4, 0xFF74, 0x00B5, 0xFF75, 0x00B6, 0xFF76, 0x00B7, 0xFF77, 0x00B8, 0xFF78, + 0x00B9, 0xFF79, 0x00BA, 0xFF7A, 0x00BB, 0xFF7B, 0x00BC, 0xFF7C, 0x00BD, 0xFF7D, 0x00BE, 0xFF7E, 0x00BF, 0xFF7F, 0x00C0, 0xFF80, + 0x00C1, 0xFF81, 0x00C2, 0xFF82, 0x00C3, 0xFF83, 0x00C4, 0xFF84, 0x00C5, 0xFF85, 0x00C6, 0xFF86, 0x00C7, 0xFF87, 0x00C8, 0xFF88, + 0x00C9, 0xFF89, 0x00CA, 0xFF8A, 0x00CB, 0xFF8B, 0x00CC, 0xFF8C, 0x00CD, 0xFF8D, 0x00CE, 0xFF8E, 0x00CF, 0xFF8F, 0x00D0, 0xFF90, + 0x00D1, 0xFF91, 0x00D2, 0xFF92, 0x00D3, 0xFF93, 0x00D4, 0xFF94, 0x00D5, 0xFF95, 0x00D6, 0xFF96, 0x00D7, 0xFF97, 0x00D8, 0xFF98, + 0x00D9, 0xFF99, 0x00DA, 0xFF9A, 0x00DB, 0xFF9B, 0x00DC, 0xFF9C, 0x00DD, 0xFF9D, 0x00DE, 0xFF9E, 0x00DF, 0xFF9F, 0x8140, 0x3000, + 0x8141, 0x3001, 0x8142, 0x3002, 0x8143, 0xFF0C, 0x8144, 0xFF0E, 0x8145, 0x30FB, 0x8146, 0xFF1A, 0x8147, 0xFF1B, 0x8148, 0xFF1F, + 0x8149, 0xFF01, 0x814A, 0x309B, 0x814B, 0x309C, 0x814C, 0x00B4, 0x814D, 0xFF40, 0x814E, 0x00A8, 0x814F, 0xFF3E, 0x8150, 0xFFE3, + 0x8151, 0xFF3F, 0x8152, 0x30FD, 0x8153, 0x30FE, 0x8154, 0x309D, 0x8155, 0x309E, 0x8156, 0x3003, 0x8157, 0x4EDD, 0x8158, 0x3005, + 0x8159, 0x3006, 0x815A, 0x3007, 0x815B, 0x30FC, 0x815C, 0x2015, 0x815D, 0x2010, 0x815E, 0xFF0F, 0x815F, 0xFF3C, 0x8160, 0xFF5E, + 0x8161, 0x2225, 0x8162, 0xFF5C, 0x8163, 0x2026, 0x8164, 0x2025, 0x8165, 0x2018, 0x8166, 0x2019, 0x8167, 0x201C, 0x8168, 0x201D, + 0x8169, 0xFF08, 0x816A, 0xFF09, 0x816B, 0x3014, 0x816C, 0x3015, 0x816D, 0xFF3B, 0x816E, 0xFF3D, 0x816F, 0xFF5B, 0x8170, 0xFF5D, + 0x8171, 0x3008, 0x8172, 0x3009, 0x8173, 0x300A, 0x8174, 0x300B, 0x8175, 0x300C, 0x8176, 0x300D, 0x8177, 0x300E, 0x8178, 0x300F, + 0x8179, 0x3010, 0x817A, 0x3011, 0x817B, 0xFF0B, 0x817C, 0xFF0D, 0x817D, 0x00B1, 0x817E, 0x00D7, 0x8180, 0x00F7, 0x8181, 0xFF1D, + 0x8182, 0x2260, 0x8183, 0xFF1C, 0x8184, 0xFF1E, 0x8185, 0x2266, 0x8186, 0x2267, 0x8187, 0x221E, 0x8188, 0x2234, 0x8189, 0x2642, + 0x818A, 0x2640, 0x818B, 0x00B0, 0x818C, 0x2032, 0x818D, 0x2033, 0x818E, 0x2103, 0x818F, 0xFFE5, 0x8190, 0xFF04, 0x8191, 0xFFE0, + 0x8192, 0xFFE1, 0x8193, 0xFF05, 0x8194, 0xFF03, 0x8195, 0xFF06, 0x8196, 0xFF0A, 0x8197, 0xFF20, 0x8198, 0x00A7, 0x8199, 0x2606, + 0x819A, 0x2605, 0x819B, 0x25CB, 0x819C, 0x25CF, 0x819D, 0x25CE, 0x819E, 0x25C7, 0x819F, 0x25C6, 0x81A0, 0x25A1, 0x81A1, 0x25A0, + 0x81A2, 0x25B3, 0x81A3, 0x25B2, 0x81A4, 0x25BD, 0x81A5, 0x25BC, 0x81A6, 0x203B, 0x81A7, 0x3012, 0x81A8, 0x2192, 0x81A9, 0x2190, + 0x81AA, 0x2191, 0x81AB, 0x2193, 0x81AC, 0x3013, 0x81B8, 0x2208, 0x81B9, 0x220B, 0x81BA, 0x2286, 0x81BB, 0x2287, 0x81BC, 0x2282, + 0x81BD, 0x2283, 0x81BE, 0x222A, 0x81BF, 0x2229, 0x81C8, 0x2227, 0x81C9, 0x2228, 0x81CA, 0xFFE2, 0x81CB, 0x21D2, 0x81CC, 0x21D4, + 0x81CD, 0x2200, 0x81CE, 0x2203, 0x81DA, 0x2220, 0x81DB, 0x22A5, 0x81DC, 0x2312, 0x81DD, 0x2202, 0x81DE, 0x2207, 0x81DF, 0x2261, + 0x81E0, 0x2252, 0x81E1, 0x226A, 0x81E2, 0x226B, 0x81E3, 0x221A, 0x81E4, 0x223D, 0x81E5, 0x221D, 0x81E6, 0x2235, 0x81E7, 0x222B, + 0x81E8, 0x222C, 0x81F0, 0x212B, 0x81F1, 0x2030, 0x81F2, 0x266F, 0x81F3, 0x266D, 0x81F4, 0x266A, 0x81F5, 0x2020, 0x81F6, 0x2021, + 0x81F7, 0x00B6, 0x81FC, 0x25EF, 0x824F, 0xFF10, 0x8250, 0xFF11, 0x8251, 0xFF12, 0x8252, 0xFF13, 0x8253, 0xFF14, 0x8254, 0xFF15, + 0x8255, 0xFF16, 0x8256, 0xFF17, 0x8257, 0xFF18, 0x8258, 0xFF19, 0x8260, 0xFF21, 0x8261, 0xFF22, 0x8262, 0xFF23, 0x8263, 0xFF24, + 0x8264, 0xFF25, 0x8265, 0xFF26, 0x8266, 0xFF27, 0x8267, 0xFF28, 0x8268, 0xFF29, 0x8269, 0xFF2A, 0x826A, 0xFF2B, 0x826B, 0xFF2C, + 0x826C, 0xFF2D, 0x826D, 0xFF2E, 0x826E, 0xFF2F, 0x826F, 0xFF30, 0x8270, 0xFF31, 0x8271, 0xFF32, 0x8272, 0xFF33, 0x8273, 0xFF34, + 0x8274, 0xFF35, 0x8275, 0xFF36, 0x8276, 0xFF37, 0x8277, 0xFF38, 0x8278, 0xFF39, 0x8279, 0xFF3A, 0x8281, 0xFF41, 0x8282, 0xFF42, + 0x8283, 0xFF43, 0x8284, 0xFF44, 0x8285, 0xFF45, 0x8286, 0xFF46, 0x8287, 0xFF47, 0x8288, 0xFF48, 0x8289, 0xFF49, 0x828A, 0xFF4A, + 0x828B, 0xFF4B, 0x828C, 0xFF4C, 0x828D, 0xFF4D, 0x828E, 0xFF4E, 0x828F, 0xFF4F, 0x8290, 0xFF50, 0x8291, 0xFF51, 0x8292, 0xFF52, + 0x8293, 0xFF53, 0x8294, 0xFF54, 0x8295, 0xFF55, 0x8296, 0xFF56, 0x8297, 0xFF57, 0x8298, 0xFF58, 0x8299, 0xFF59, 0x829A, 0xFF5A, + 0x829F, 0x3041, 0x82A0, 0x3042, 0x82A1, 0x3043, 0x82A2, 0x3044, 0x82A3, 0x3045, 0x82A4, 0x3046, 0x82A5, 0x3047, 0x82A6, 0x3048, + 0x82A7, 0x3049, 0x82A8, 0x304A, 0x82A9, 0x304B, 0x82AA, 0x304C, 0x82AB, 0x304D, 0x82AC, 0x304E, 0x82AD, 0x304F, 0x82AE, 0x3050, + 0x82AF, 0x3051, 0x82B0, 0x3052, 0x82B1, 0x3053, 0x82B2, 0x3054, 0x82B3, 0x3055, 0x82B4, 0x3056, 0x82B5, 0x3057, 0x82B6, 0x3058, + 0x82B7, 0x3059, 0x82B8, 0x305A, 0x82B9, 0x305B, 0x82BA, 0x305C, 0x82BB, 0x305D, 0x82BC, 0x305E, 0x82BD, 0x305F, 0x82BE, 0x3060, + 0x82BF, 0x3061, 0x82C0, 0x3062, 0x82C1, 0x3063, 0x82C2, 0x3064, 0x82C3, 0x3065, 0x82C4, 0x3066, 0x82C5, 0x3067, 0x82C6, 0x3068, + 0x82C7, 0x3069, 0x82C8, 0x306A, 0x82C9, 0x306B, 0x82CA, 0x306C, 0x82CB, 0x306D, 0x82CC, 0x306E, 0x82CD, 0x306F, 0x82CE, 0x3070, + 0x82CF, 0x3071, 0x82D0, 0x3072, 0x82D1, 0x3073, 0x82D2, 0x3074, 0x82D3, 0x3075, 0x82D4, 0x3076, 0x82D5, 0x3077, 0x82D6, 0x3078, + 0x82D7, 0x3079, 0x82D8, 0x307A, 0x82D9, 0x307B, 0x82DA, 0x307C, 0x82DB, 0x307D, 0x82DC, 0x307E, 0x82DD, 0x307F, 0x82DE, 0x3080, + 0x82DF, 0x3081, 0x82E0, 0x3082, 0x82E1, 0x3083, 0x82E2, 0x3084, 0x82E3, 0x3085, 0x82E4, 0x3086, 0x82E5, 0x3087, 0x82E6, 0x3088, + 0x82E7, 0x3089, 0x82E8, 0x308A, 0x82E9, 0x308B, 0x82EA, 0x308C, 0x82EB, 0x308D, 0x82EC, 0x308E, 0x82ED, 0x308F, 0x82EE, 0x3090, + 0x82EF, 0x3091, 0x82F0, 0x3092, 0x82F1, 0x3093, 0x8340, 0x30A1, 0x8341, 0x30A2, 0x8342, 0x30A3, 0x8343, 0x30A4, 0x8344, 0x30A5, + 0x8345, 0x30A6, 0x8346, 0x30A7, 0x8347, 0x30A8, 0x8348, 0x30A9, 0x8349, 0x30AA, 0x834A, 0x30AB, 0x834B, 0x30AC, 0x834C, 0x30AD, + 0x834D, 0x30AE, 0x834E, 0x30AF, 0x834F, 0x30B0, 0x8350, 0x30B1, 0x8351, 0x30B2, 0x8352, 0x30B3, 0x8353, 0x30B4, 0x8354, 0x30B5, + 0x8355, 0x30B6, 0x8356, 0x30B7, 0x8357, 0x30B8, 0x8358, 0x30B9, 0x8359, 0x30BA, 0x835A, 0x30BB, 0x835B, 0x30BC, 0x835C, 0x30BD, + 0x835D, 0x30BE, 0x835E, 0x30BF, 0x835F, 0x30C0, 0x8360, 0x30C1, 0x8361, 0x30C2, 0x8362, 0x30C3, 0x8363, 0x30C4, 0x8364, 0x30C5, + 0x8365, 0x30C6, 0x8366, 0x30C7, 0x8367, 0x30C8, 0x8368, 0x30C9, 0x8369, 0x30CA, 0x836A, 0x30CB, 0x836B, 0x30CC, 0x836C, 0x30CD, + 0x836D, 0x30CE, 0x836E, 0x30CF, 0x836F, 0x30D0, 0x8370, 0x30D1, 0x8371, 0x30D2, 0x8372, 0x30D3, 0x8373, 0x30D4, 0x8374, 0x30D5, + 0x8375, 0x30D6, 0x8376, 0x30D7, 0x8377, 0x30D8, 0x8378, 0x30D9, 0x8379, 0x30DA, 0x837A, 0x30DB, 0x837B, 0x30DC, 0x837C, 0x30DD, + 0x837D, 0x30DE, 0x837E, 0x30DF, 0x8380, 0x30E0, 0x8381, 0x30E1, 0x8382, 0x30E2, 0x8383, 0x30E3, 0x8384, 0x30E4, 0x8385, 0x30E5, + 0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9, 0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED, + 0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1, 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, 0x8395, 0x30F5, + 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, 0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, 0x83A5, 0x0397, + 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, 0x83A9, 0x039B, 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, 0x83AD, 0x039F, + 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, 0x83B1, 0x03A4, 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, 0x83B5, 0x03A8, + 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, 0x83C1, 0x03B3, 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, 0x83C5, 0x03B7, + 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, 0x83C9, 0x03BB, 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, 0x83CD, 0x03BF, + 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, 0x83D1, 0x03C4, 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, 0x83D5, 0x03C8, + 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, 0x8442, 0x0412, 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, 0x8446, 0x0401, + 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, 0x844A, 0x0419, 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, 0x844E, 0x041D, + 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, 0x8452, 0x0421, 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, 0x8456, 0x0425, + 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, 0x845A, 0x0429, 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, 0x845E, 0x042D, + 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, 0x8471, 0x0431, 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, 0x8475, 0x0435, + 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, 0x8479, 0x0438, 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, 0x847D, 0x043C, + 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, 0x8482, 0x0440, 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, 0x8486, 0x0444, + 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, 0x848A, 0x0448, 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, 0x848E, 0x044C, + 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, 0x849F, 0x2500, 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, 0x84A3, 0x2518, + 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, 0x84A7, 0x2524, 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, 0x84AB, 0x2503, + 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, 0x84AF, 0x2517, 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, 0x84B3, 0x253B, + 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, 0x84B7, 0x2528, 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, 0x84BB, 0x2530, + 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, 0x8740, 0x2460, 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, 0x8744, 0x2464, + 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, 0x8748, 0x2468, 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, 0x874C, 0x246C, + 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, 0x8750, 0x2470, 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, 0x8754, 0x2160, + 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, 0x8758, 0x2164, 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, 0x875C, 0x2168, + 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, 0x8761, 0x3322, 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, 0x8765, 0x3303, + 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, 0x8769, 0x330D, 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, 0x876D, 0x334A, + 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, 0x8771, 0x339E, 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, 0x8775, 0x33A1, + 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, 0x8782, 0x2116, 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, 0x8786, 0x32A5, + 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, 0x878A, 0x3231, 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, 0x878E, 0x337D, + 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, 0x8798, 0x221F, 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, 0x88A1, 0x5A03, + 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, 0x88A5, 0x6328, 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, 0x88A9, 0x831C, + 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, 0x88AD, 0x6E25, 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, 0x88B1, 0x9BF5, + 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, 0x88B5, 0x6271, 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, 0x88B9, 0x98F4, + 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, 0x88BD, 0x6216, 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, 0x88C1, 0x5EB5, + 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, 0x88C5, 0x95C7, 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, 0x88C9, 0x4F0A, + 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, 0x88CD, 0x56F2, 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, 0x88D1, 0x5C09, + 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, 0x88D5, 0x6613, 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, 0x88D9, 0x7570, + 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, 0x88DD, 0x80C3, 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, 0x88E1, 0x9055, + 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, 0x88E5, 0x4EA5, 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, 0x88E9, 0x78EF, + 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, 0x88ED, 0x9038, 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, 0x88F1, 0x9C2F, + 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, 0x88F5, 0x54E1, 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, 0x88F9, 0x98F2, + 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, 0x8940, 0x9662, 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, 0x8944, 0x540B, + 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, 0x8948, 0x7FBD, 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, 0x894C, 0x9D5C, + 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, 0x8950, 0x81FC, 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, 0x8954, 0x6B1D, + 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, 0x8958, 0x53A9, 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, 0x895C, 0x5642, + 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, 0x8960, 0x834F, 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, 0x8964, 0x5B30, + 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, 0x8968, 0x6804, 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, 0x896C, 0x745B, + 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, 0x8970, 0x82F1, 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, 0x8974, 0x6DB2, + 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, 0x8978, 0x60A6, 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, 0x897C, 0x698E, + 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, 0x8981, 0x5830, 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, 0x8985, 0x6028, + 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, 0x8989, 0x6F14, 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, 0x898D, 0x71D5, + 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, 0x8991, 0x82D1, 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, 0x8995, 0x9D1B, + 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, 0x8999, 0x7525, 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, 0x899D, 0x5F80, + 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, 0x89A1, 0x6A2A, 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, 0x89A5, 0x7FC1, + 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, 0x89A9, 0x9EC4, 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, 0x89AD, 0x5104, + 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, 0x89B1, 0x6876, 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, 0x89B5, 0x5378, + 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, 0x89B9, 0x97F3, 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, 0x89BD, 0x4F55, + 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, 0x89C1, 0x52A0, 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, 0x89C5, 0x5AC1, + 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, 0x89C9, 0x6687, 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, 0x89CD, 0x6CB3, + 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, 0x89D1, 0x79BE, 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, 0x89D5, 0x82DB, + 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, 0x89D9, 0x83D3, 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, 0x89DD, 0x8CA8, + 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, 0x89E1, 0x868A, 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, 0x89E5, 0x7259, + 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, 0x89E9, 0x86FE, 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, 0x89ED, 0x99D5, + 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, 0x89F1, 0x56DE, 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, 0x89F5, 0x5FEB, + 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, 0x89F9, 0x61D0, 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, 0x8A40, 0x9B41, + 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, 0x8A44, 0x7070, 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, 0x8A48, 0x82A5, + 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, 0x8A4C, 0x8C9D, 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, 0x8A50, 0x54B3, + 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, 0x8A54, 0x6982, 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, 0x8A58, 0x8857, + 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, 0x8A5C, 0x6D6C, 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, 0x8A60, 0x67FF, + 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, 0x8A64, 0x5687, 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, 0x8A68, 0x64B9, + 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, 0x8A6C, 0x7372, 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, 0x8A70, 0x89D2, + 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, 0x8A74, 0x95A3, 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, 0x8A78, 0x5CB3, + 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, 0x8A7C, 0x639B, 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, 0x8A81, 0x68B6, + 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, 0x8A85, 0x559D, 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, 0x8A89, 0x6E07, + 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, 0x8A8D, 0x8F44, 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, 0x8A91, 0x691B, + 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, 0x8A95, 0x515C, 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, 0x8A99, 0x938C, + 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, 0x8A9D, 0x8305, 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, 0x8AA1, 0x82C5, + 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, 0x8AA5, 0x51A0, 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, 0x8AA9, 0x52E7, + 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, 0x8AAD, 0x59E6, 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, 0x8AB1, 0x5E72, + 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, 0x8AB5, 0x6163, 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, 0x8AB9, 0x67D1, + 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, 0x8ABD, 0x6B53, 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, 0x8AC1, 0x6F45, + 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, 0x8AC5, 0x770B, 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, 0x8AC9, 0x7DE9, + 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, 0x8ACD, 0x8266, 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, 0x8AD1, 0x8CAB, + 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, 0x8AD5, 0x9591, 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, 0x8AD9, 0x9928, + 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, 0x8ADD, 0x5CB8, 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, 0x8AE1, 0x773C, + 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, 0x8AE5, 0x96C1, 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, 0x8AE9, 0x4F01, + 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, 0x8AED, 0x5668, 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, 0x8AF1, 0x5BC4, + 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, 0x8AF5, 0x5FCC, 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, 0x8AF9, 0x65E2, + 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, 0x8B40, 0x6A5F, 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, 0x8B44, 0x6C7D, + 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, 0x8B48, 0x7A00, 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, 0x8B4C, 0x8A18, + 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, 0x8B50, 0x8F1D, 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, 0x8B54, 0x4E80, + 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, 0x8B58, 0x5B9C, 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, 0x8B5C, 0x6B3A, + 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, 0x8B60, 0x7FA9, 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, 0x8B64, 0x63AC, + 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, 0x8B68, 0x5403, 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, 0x8B6C, 0x8A70, + 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, 0x8B70, 0x5374, 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, 0x8B74, 0x9006, + 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, 0x8B78, 0x4F11, 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, 0x8B7C, 0x5F13, + 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, 0x8B81, 0x6C42, 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, 0x8B85, 0x7403, + 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, 0x8B89, 0x7D1A, 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, 0x8B8D, 0x725B, + 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, 0x8B91, 0x62D2, 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, 0x8B95, 0x865A, + 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, 0x8B99, 0x6F01, 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, 0x8B9D, 0x4EAB, + 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, 0x8BA1, 0x50D1, 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, 0x8BA5, 0x51F6, + 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, 0x8BA9, 0x53EB, 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, 0x8BAD, 0x5F37, + 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, 0x8BB1, 0x606D, 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, 0x8BB5, 0x6CC1, + 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, 0x8BB9, 0x80F8, 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, 0x8BBD, 0x90F7, + 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, 0x8BC1, 0x9A5A, 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, 0x8BC5, 0x6681, + 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, 0x8BC9, 0x6975, 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, 0x8BCD, 0x50C5, + 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, 0x8BD1, 0x9326, 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, 0x8BD5, 0x7434, + 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, 0x8BD9, 0x7DCA, 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, 0x8BDD, 0x895F, + 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, 0x8BE1, 0x541F, 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, 0x8BE5, 0x53E5, + 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, 0x8BE9, 0x77E9, 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, 0x8BED, 0x99C8, + 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, 0x8BF1, 0x865E, 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, 0x8BF5, 0x5BD3, + 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, 0x8BF9, 0x6ADB, 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, 0x8C40, 0x6398, + 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, 0x8C44, 0x8F61, 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, 0x8C48, 0x7C82, + 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, 0x8C4C, 0x936C, 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, 0x8C50, 0x8A13, + 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, 0x8C54, 0x5366, 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, 0x8C58, 0x50BE, + 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, 0x8C5C, 0x572D, 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, 0x8C60, 0x5F62, + 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, 0x8C64, 0x6167, 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, 0x8C68, 0x656C, + 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, 0x8C6C, 0x7566, 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, 0x8C70, 0x7D99, + 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, 0x8C74, 0x834A, 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, 0x8C78, 0x8B66, + 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, 0x8C7C, 0x82B8, 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, 0x8C81, 0x621F, + 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, 0x8C85, 0x6841, 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, 0x8C89, 0x6F54, + 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, 0x8C8D, 0x8A23, 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, 0x8C91, 0x5026, + 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, 0x8C95, 0x5263, 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, 0x8C99, 0x5ACC, + 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, 0x8C9D, 0x62F3, 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, 0x8CA1, 0x727D, + 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, 0x8CA5, 0x786F, 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, 0x8CA9, 0x898B, + 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, 0x8CAD, 0x9063, 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, 0x8CB1, 0x9A13, + 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, 0x8CB5, 0x53B3, 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, 0x8CB9, 0x6E90, + 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, 0x8CBD, 0x8237, 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, 0x8CC1, 0x4E4E, + 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, 0x8CC5, 0x56FA, 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, 0x8CC9, 0x5EAB, + 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, 0x8CCD, 0x67AF, 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, 0x8CD1, 0x88B4, + 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, 0x8CD5, 0x864E, 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, 0x8CD9, 0x96C7, + 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, 0x8CDD, 0x4E92, 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, 0x8CE1, 0x543E, + 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, 0x8CE5, 0x609F, 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, 0x8CE9, 0x7881, + 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, 0x8CED, 0x9190, 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, 0x8CF1, 0x4F7C, + 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, 0x8CF5, 0x5149, 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, 0x8CF9, 0x52FE, + 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, 0x8D40, 0x540E, 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, 0x8D44, 0x597D, + 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, 0x8D48, 0x5DE5, 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, 0x8D4C, 0x5E83, + 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, 0x8D50, 0x6052, 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, 0x8D54, 0x63A7, + 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, 0x8D58, 0x66F4, 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, 0x8D5C, 0x69CB, + 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, 0x8D60, 0x6E2F, 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, 0x8D64, 0x786C, + 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, 0x8D68, 0x7D18, 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, 0x8D6C, 0x8003, + 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, 0x8D70, 0x818F, 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, 0x8D74, 0x8861, + 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, 0x8D78, 0x90CA, 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, 0x8D7C, 0x92FC, + 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, 0x8D81, 0x9999, 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, 0x8D85, 0x52AB, + 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, 0x8D89, 0x62F7, 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, 0x8D8D, 0x9EB9, + 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, 0x8D91, 0x56FD, 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, 0x8D95, 0x9ED2, + 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, 0x8D99, 0x7511, 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, 0x8D9D, 0x72DB, + 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, 0x8DA1, 0x4ECA, 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, 0x8DA5, 0x5A5A, + 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, 0x8DA9, 0x6606, 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, 0x8DAD, 0x75D5, + 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, 0x8DB1, 0x4E9B, 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, 0x8DB5, 0x5D6F, + 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, 0x8DB9, 0x6C99, 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, 0x8DBD, 0x9396, + 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, 0x8DC1, 0x632B, 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, 0x8DC5, 0x6700, + 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, 0x8DC9, 0x5BB0, 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, 0x8DCD, 0x683D, + 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, 0x8DD1, 0x91C7, 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, 0x8DD5, 0x796D, + 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, 0x8DD9, 0x88C1, 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, 0x8DDD, 0x5728, + 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, 0x8DE1, 0x51B4, 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, 0x8DE5, 0x698A, + 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, 0x8DE9, 0x57FC, 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, 0x8DED, 0x524A, + 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, 0x8DF1, 0x6714, 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, 0x8DF5, 0x7D22, + 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, 0x8DF9, 0x7B39, 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, 0x8E40, 0x5BDF, + 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, 0x8E44, 0x672D, 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, 0x8E48, 0x7690, + 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, 0x8E4C, 0x9BAB, 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, 0x8E50, 0x5098, + 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, 0x8E54, 0x6492, 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, 0x8E58, 0x73CA, + 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, 0x8E5C, 0x8695, 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, 0x8E60, 0x9910, + 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, 0x8E64, 0x4ED5, 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, 0x8E68, 0x523A, + 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, 0x8E6C, 0x56DB, 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, 0x8E70, 0x59FF, + 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, 0x8E74, 0x5E2B, 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, 0x8E78, 0x652F, + 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, 0x8E7C, 0x65E8, 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, 0x8E81, 0x6C0F, + 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, 0x8E85, 0x7CF8, 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, 0x8E89, 0x8102, + 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, 0x8E8D, 0x8A69, 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, 0x8E91, 0x8CC7, + 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, 0x8E95, 0x6B6F, 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, 0x8E99, 0x5150, + 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, 0x8E9D, 0x6301, 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, 0x8EA1, 0x6CBB, + 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, 0x8EA5, 0x78C1, 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, 0x8EA9, 0x81EA, + 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, 0x8EAD, 0x9E7F, 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, 0x8EB1, 0x7AFA, + 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, 0x8EB5, 0x4E03, 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, 0x8EB9, 0x5AC9, + 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, 0x8EBD, 0x6F06, 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, 0x8EC1, 0x8500, + 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, 0x8EC5, 0x829D, 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, 0x8EC9, 0x820E, + 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, 0x8ECD, 0x8D66, 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, 0x8ED1, 0x7D17, + 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, 0x8ED5, 0x906E, 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, 0x8ED9, 0x52FA, + 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, 0x8EDD, 0x7235, 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, 0x8EE1, 0x82E5, + 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, 0x8EE5, 0x4E3B, 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, 0x8EE9, 0x6731, + 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, 0x8EED, 0x7A2E, 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, 0x8EF1, 0x9996, + 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, 0x8EF5, 0x5BFF, 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, 0x8EF9, 0x9700, + 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, 0x8F40, 0x5B97, 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, 0x8F44, 0x6101, + 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, 0x8F48, 0x79CB, 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, 0x8F4C, 0x81ED, + 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, 0x8F50, 0x8972, 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, 0x8F54, 0x9031, + 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, 0x8F58, 0x919C, 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, 0x8F5C, 0x5341, + 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, 0x8F60, 0x6C41, 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, 0x8F64, 0x91CD, + 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, 0x8F68, 0x5BBF, 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, 0x8F6C, 0x7C9B, + 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, 0x8F70, 0x8853, 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, 0x8F74, 0x6625, + 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, 0x8F78, 0x99FF, 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, 0x8F7C, 0x696F, + 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, 0x8F81, 0x6F64, 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, 0x8F85, 0x9075, + 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, 0x8F89, 0x521D, 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, 0x8F8D, 0x6E1A, + 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, 0x8F91, 0x66F8, 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, 0x8F95, 0x52A9, + 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, 0x8F99, 0x5F90, 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, 0x8F9D, 0x50B7, + 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, 0x8FA1, 0x5347, 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, 0x8FA5, 0x5531, + 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, 0x8FA9, 0x5A3C, 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, 0x8FAD, 0x5C11, + 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, 0x8FB1, 0x5EE0, 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, 0x8FB5, 0x62DB, + 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, 0x8FB9, 0x660C, 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, 0x8FBD, 0x68A2, + 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, 0x8FC1, 0x6D88, 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, 0x8FC5, 0x7126, + 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, 0x8FC9, 0x785D, 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, 0x8FCD, 0x7AE0, + 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, 0x8FD1, 0x8096, 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, 0x8FD5, 0x885D, + 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, 0x8FD9, 0x8A54, 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, 0x8FDD, 0x91A4, + 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, 0x8FE1, 0x969C, 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, 0x8FE5, 0x4E1E, + 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, 0x8FE9, 0x57CE, 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, 0x8FED, 0x5E38, + 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, 0x8FF1, 0x6756, 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, 0x8FF5, 0x7A63, + 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, 0x8FF9, 0x9320, 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, 0x9040, 0x62ED, + 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, 0x9044, 0x7E54, 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, 0x9048, 0x98DF, + 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, 0x904C, 0x4F38, 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, 0x9050, 0x5A20, + 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, 0x9054, 0x614E, 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, 0x9058, 0x68EE, + 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, 0x905C, 0x7533, 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, 0x9060, 0x79E6, + 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, 0x9064, 0x85AA, 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, 0x9068, 0x8F9B, + 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, 0x906C, 0x4EBA, 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, 0x9070, 0x58EC, + 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, 0x9074, 0x814E, 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, 0x9078, 0x976D, + 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, 0x907C, 0x9162, 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, 0x9081, 0x5439, + 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, 0x9085, 0x6C34, 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, 0x9089, 0x7FE0, + 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, 0x908D, 0x9310, 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, 0x9091, 0x9AC4, + 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, 0x9095, 0x67A2, 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, 0x9099, 0x6749, + 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, 0x909D, 0x96C0, 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, 0x90A1, 0x5BF8, + 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, 0x90A5, 0x662F, 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, 0x90A9, 0x59D3, + 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, 0x90AD, 0x653F, 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, 0x90B1, 0x68F2, + 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, 0x90B5, 0x7272, 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, 0x90B9, 0x8056, + 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, 0x90BD, 0x8AA0, 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, 0x90C1, 0x9192, + 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, 0x90C5, 0x7A0E, 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, 0x90C9, 0x60DC, + 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, 0x90CD, 0x6790, 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, 0x90D1, 0x7E3E, + 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, 0x90D5, 0x8DE1, 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, 0x90D9, 0x62D9, + 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, 0x90DD, 0x8A2D, 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, 0x90E1, 0x96EA, + 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, 0x90E5, 0x4ED9, 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, 0x90E9, 0x5BA3, + 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, 0x90ED, 0x6226, 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, 0x90F1, 0x6834, + 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, 0x90F5, 0x67D3, 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, 0x90F9, 0x65CB, + 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, 0x9140, 0x7E4A, 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, 0x9144, 0x8239, + 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, 0x9148, 0x8DF5, 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, 0x914C, 0x9291, + 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, 0x9150, 0x5584, 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, 0x9154, 0x7985, + 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, 0x9158, 0x564C, 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, 0x915C, 0x66FE, + 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, 0x9160, 0x758F, 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, 0x9164, 0x79DF, + 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, 0x9168, 0x8607, 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, 0x916C, 0x9F20, + 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, 0x9170, 0x53E2, 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, 0x9174, 0x594F, + 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, 0x9178, 0x531D, 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, 0x917C, 0x6383, + 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, 0x9181, 0x65E9, 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, 0x9185, 0x69FD, + 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, 0x9189, 0x75E9, 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, 0x918D, 0x7DCF, + 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, 0x9191, 0x8358, 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, 0x9195, 0x88C5, + 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, 0x9199, 0x9397, 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, 0x919D, 0x5897, + 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, 0x91A1, 0x8D08, 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, 0x91A5, 0x5247, + 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, 0x91A9, 0x675F, 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, 0x91AD, 0x4FD7, + 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, 0x91B1, 0x7D9A, 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, 0x91B5, 0x63C3, + 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, 0x91B9, 0x640D, 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, 0x91BD, 0x591A, + 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, 0x91C1, 0x553E, 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, 0x91C5, 0x6253, + 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, 0x91C9, 0x9640, 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, 0x91CD, 0x5806, + 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, 0x91D1, 0x5E2F, 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, 0x91D5, 0x6234, + 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, 0x91D9, 0x80CE, 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, 0x91DD, 0x8CB8, + 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, 0x91E1, 0x9EDB, 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, 0x91E5, 0x5927, + 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, 0x91E9, 0x9DF9, 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, 0x91ED, 0x5544, + 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, 0x91F1, 0x62D3, 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, 0x91F5, 0x8A17, + 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, 0x91F9, 0x8338, 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, 0x9240, 0x53E9, + 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, 0x9244, 0x596A, 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, 0x9248, 0x8FBF, + 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, 0x924C, 0x9C48, 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, 0x9250, 0x5358, + 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, 0x9254, 0x63A2, 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, 0x9258, 0x6E5B, + 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, 0x925C, 0x7BAA, 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, 0x9260, 0x86CB, + 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, 0x9264, 0x58C7, 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, 0x9268, 0x6A80, + 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, 0x926C, 0x5024, 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, 0x9270, 0x6065, + 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, 0x9274, 0x7A1A, 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, 0x9278, 0x9045, + 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, 0x927C, 0x7AF9, 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, 0x9281, 0x79E9, + 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, 0x9285, 0x7740, 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, 0x9289, 0x5FE0, + 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, 0x928D, 0x6CE8, 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, 0x9291, 0x914E, + 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, 0x9295, 0x7026, 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, 0x9299, 0x8CAF, + 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, 0x929D, 0x558B, 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, 0x92A1, 0x5E81, + 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, 0x92A5, 0x5FB4, 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, 0x92A9, 0x671D, + 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, 0x92AD, 0x773A, 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, 0x92B1, 0x8776, + 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, 0x92B5, 0x8DF3, 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, 0x92B9, 0x9CE5, + 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, 0x92BD, 0x6715, 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, 0x92C1, 0x93AE, + 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, 0x92C5, 0x690E, 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, 0x92C9, 0x75DB, + 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, 0x92CD, 0x63B4, 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, 0x92D1, 0x67D8, + 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, 0x92D5, 0x9354, 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, 0x92D9, 0x58F7, + 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, 0x92DD, 0x540A, 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, 0x92E1, 0x4F4E, + 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, 0x92E5, 0x8C9E, 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, 0x92E9, 0x5E1D, + 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, 0x92ED, 0x5F1F, 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, 0x92F1, 0x63D0, + 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, 0x92F5, 0x798E, 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, 0x92F9, 0x8A02, + 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, 0x9340, 0x90B8, 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, 0x9344, 0x6CE5, + 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, 0x9348, 0x6EF4, 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, 0x934C, 0x93D1, + 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, 0x9350, 0x64A4, 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, 0x9354, 0x5178, + 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, 0x9358, 0x5E97, 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, 0x935C, 0x8CBC, + 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, 0x9360, 0x4F1D, 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, 0x9364, 0x96FB, + 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, 0x9368, 0x5857, 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, 0x936C, 0x6597, + 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, 0x9370, 0x83DF, 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, 0x9374, 0x934D, + 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, 0x9378, 0x5EA6, 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, 0x937C, 0x5012, + 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, 0x9381, 0x5200, 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, 0x9385, 0x5957, + 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, 0x9389, 0x60BC, 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, 0x938D, 0x6843, + 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, 0x9391, 0x6DD8, 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, 0x9395, 0x71C8, + 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, 0x9399, 0x7B49, 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, 0x939D, 0x7D71, + 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, 0x93A1, 0x85E4, 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, 0x93A5, 0x8E0F, + 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, 0x93A9, 0x9676, 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, 0x93AD, 0x50CD, + 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, 0x93B1, 0x5C0E, 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, 0x93B5, 0x77B3, + 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, 0x93B9, 0x9053, 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, 0x93BD, 0x533F, + 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, 0x93C1, 0x7279, 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, 0x93C5, 0x6BD2, + 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, 0x93C9, 0x6A61, 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, 0x93CD, 0x5C4A, + 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, 0x93D1, 0x9149, 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, 0x93D5, 0x60C7, + 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, 0x93D9, 0x9041, 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, 0x93DD, 0x920D, + 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, 0x93E1, 0x4E4D, 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, 0x93E5, 0x7058, + 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, 0x93E9, 0x99B4, 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, 0x93ED, 0x6960, + 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, 0x93F1, 0x4E8C, 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, 0x93F5, 0x5302, + 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, 0x93F9, 0x5EFF, 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, 0x9440, 0x5982, + 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, 0x9444, 0x598A, 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, 0x9448, 0x79B0, + 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, 0x944C, 0x732B, 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, 0x9450, 0x637B, + 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, 0x9454, 0x4E43, 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, 0x9458, 0x56A2, + 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, 0x945C, 0x80FD, 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, 0x9460, 0x8997, + 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, 0x9464, 0x64AD, 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, 0x9468, 0x6D3E, + 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, 0x946C, 0x7F75, 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, 0x9470, 0x5EC3, + 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, 0x9474, 0x676F, 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, 0x9478, 0x80BA, + 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, 0x947C, 0x57F9, 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, 0x9481, 0x7164, + 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, 0x9485, 0x8CE0, 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, 0x9489, 0x79E4, + 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, 0x948D, 0x5265, 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, 0x9491, 0x6CCA, + 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, 0x9495, 0x8236, 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, 0x9499, 0x6F20, + 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, 0x949D, 0x99C1, 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, 0x94A1, 0x7872, + 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, 0x94A5, 0x6AE8, 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, 0x94A9, 0x7560, + 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, 0x94AD, 0x767A, 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, 0x94B1, 0x7F70, + 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, 0x94B5, 0x9CE9, 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, 0x94B9, 0x96BC, + 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, 0x94BD, 0x53CD, 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, 0x94C1, 0x6591, + 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, 0x94C5, 0x7248, 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, 0x94C9, 0x7E41, + 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, 0x94CD, 0x7BC4, 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, 0x94D1, 0x98EF, + 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, 0x94D5, 0x76E4, 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, 0x94D9, 0x532A, + 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, 0x94DD, 0x5E87, 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, 0x94E1, 0x6279, + 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, 0x94E5, 0x6CCC, 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, 0x94E9, 0x79D8, + 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, 0x94ED, 0x88AB, 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, 0x94F1, 0x975E, + 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, 0x94F5, 0x5099, 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, 0x94F9, 0x6BD8, + 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, 0x9540, 0x9F3B, 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, 0x9544, 0x758B, + 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, 0x9548, 0x83F1, 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, 0x954C, 0x7562, + 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, 0x9550, 0x59EB, 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, 0x9554, 0x8B2C, + 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, 0x9558, 0x6C37, 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, 0x955C, 0x8868, + 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, 0x9560, 0x63CF, 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, 0x9564, 0x9328, + 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, 0x9568, 0x9C2D, 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, 0x956C, 0x6D5C, + 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, 0x9570, 0x983B, 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, 0x9574, 0x4ED8, + 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, 0x9578, 0x5BCC, 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, 0x957C, 0x6016, + 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, 0x9581, 0x666E, 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, 0x9585, 0x8150, + 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, 0x9589, 0x8CA0, 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, 0x958D, 0x9644, + 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, 0x9591, 0x821E, 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, 0x9595, 0x5C01, + 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, 0x9599, 0x8557, 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, 0x959D, 0x5E45, + 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, 0x95A1, 0x8907, 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, 0x95A5, 0x6255, + 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, 0x95A9, 0x9B92, 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, 0x95AD, 0x58B3, + 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, 0x95B1, 0x596E, 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, 0x95B5, 0x96F0, + 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, 0x95B9, 0x4F75, 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, 0x95BD, 0x5E73, + 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, 0x95C1, 0x853D, 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, 0x95C5, 0x9801, + 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, 0x95C9, 0x78A7, 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, 0x95CD, 0x7B86, + 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, 0x95D1, 0x7BC7, 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, 0x95D5, 0x904D, + 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, 0x95D9, 0x5F01, 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, 0x95DD, 0x92EA, + 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, 0x95E1, 0x752B, 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, 0x95E5, 0x52DF, + 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, 0x95E9, 0x66AE, 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, 0x95ED, 0x5023, + 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, 0x95F1, 0x5831, 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, 0x95F5, 0x5CEF, + 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, 0x95F9, 0x6367, 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, 0x9640, 0x6CD5, + 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, 0x9644, 0x7E2B, 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, 0x9648, 0x84EC, + 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, 0x964C, 0x8C4A, 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, 0x9650, 0x9CF3, + 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, 0x9654, 0x508D, 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, 0x9658, 0x5E3D, + 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, 0x965C, 0x66B4, 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, 0x9660, 0x5192, + 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, 0x9664, 0x8B00, 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, 0x9668, 0x9632, + 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, 0x966C, 0x50D5, 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, 0x9670, 0x6734, + 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, 0x9674, 0x91E6, 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, 0x9678, 0x5800, + 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, 0x967C, 0x7FFB, 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, 0x9681, 0x78E8, + 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, 0x9685, 0x59B9, 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, 0x9689, 0x54E9, + 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, 0x968D, 0x6795, 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, 0x9691, 0x685D, + 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, 0x9695, 0x62B9, 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, 0x9699, 0x4FAD, + 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, 0x969D, 0x6162, 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, 0x96A1, 0x5473, + 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, 0x96A5, 0x7B95, 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, 0x96A9, 0x6E4A, + 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, 0x96AD, 0x5999, 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, 0x96B1, 0x52D9, + 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, 0x96B5, 0x77DB, 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, 0x96B9, 0x5A7F, + 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, 0x96BD, 0x547D, 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, 0x96C1, 0x9298, + 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, 0x96C5, 0x6EC5, 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, 0x96C9, 0x7DEC, + 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, 0x96CD, 0x6A21, 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, 0x96D1, 0x6BDB, + 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, 0x96D5, 0x8017, 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, 0x96D9, 0x9ED9, + 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, 0x96DD, 0x9905, 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, 0x96E1, 0x8CB0, + 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, 0x96E5, 0x9580, 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, 0x96E9, 0x591C, + 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, 0x96ED, 0x5F25, 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, 0x96F1, 0x7D04, + 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, 0x96F5, 0x9756, 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, 0x96F9, 0x6109, + 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, 0x9740, 0x8AED, 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, 0x9744, 0x512A, + 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, 0x9748, 0x5E7D, 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, 0x974C, 0x6709, + 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, 0x9750, 0x7336, 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, 0x9754, 0x88D5, + 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, 0x9758, 0x90F5, 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, 0x975C, 0x4E88, + 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, 0x9760, 0x8F3F, 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, 0x9764, 0x5996, + 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, 0x9768, 0x63FA, 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, 0x976C, 0x69D8, + 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, 0x9770, 0x7528, 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, 0x9774, 0x8449, + 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, 0x9778, 0x8E0A, 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, 0x977C, 0x617E, + 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, 0x9781, 0x6D74, 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, 0x9785, 0x7F85, + 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, 0x9789, 0x83B1, 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, 0x978D, 0x7D61, + 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, 0x9791, 0x5375, 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, 0x9795, 0x85CD, + 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, 0x9799, 0x540F, 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, 0x979D, 0x7406, + 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, 0x97A1, 0x88E1, 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, 0x97A5, 0x5F8B, + 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, 0x97A9, 0x63A0, 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, 0x97AD, 0x6E9C, + 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, 0x97B1, 0x7C92, 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, 0x97B5, 0x4FB6, + 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, 0x97B9, 0x4E86, 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, 0x97BD, 0x51CC, + 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, 0x97C1, 0x6DBC, 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, 0x97C5, 0x7A1C, + 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, 0x97C9, 0x907C, 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, 0x97CD, 0x529B, + 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, 0x97D1, 0x6797, 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, 0x97D5, 0x81E8, + 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, 0x97D9, 0x9E9F, 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, 0x97DD, 0x7D2F, + 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, 0x97E1, 0x4F8B, 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, 0x97E5, 0x601C, + 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, 0x97E9, 0x9234, 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, 0x97ED, 0x9E97, + 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, 0x97F1, 0x5217, 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, 0x97F5, 0x5EC9, + 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, 0x97F9, 0x7149, 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, 0x9840, 0x84EE, + 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, 0x9844, 0x9B6F, 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, 0x9848, 0x8DEF, + 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, 0x984C, 0x5ECA, 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, 0x9850, 0x6994, + 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, 0x9854, 0x72FC, 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, 0x9858, 0x874B, + 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, 0x985C, 0x7984, 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, 0x9860, 0x502D, + 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, 0x9864, 0x8CC4, 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, 0x9868, 0x9DF2, + 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, 0x986C, 0x8A6B, 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, 0x9870, 0x6E7E, + 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, 0x98A0, 0x4E10, 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, 0x98A4, 0x4E36, + 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, 0x98A8, 0x4E56, 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, 0x98AC, 0x8C6B, + 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, 0x98B0, 0x4E8E, 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, 0x98B4, 0x4EA2, + 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, 0x98B8, 0x4ECE, 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, 0x98BC, 0x4EC2, + 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, 0x98C0, 0x4EDF, 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, 0x98C4, 0x4F30, + 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, 0x98C8, 0x4F47, 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, 0x98CC, 0x4F98, + 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, 0x98D0, 0x4F91, 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, 0x98D4, 0x5118, + 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, 0x98D8, 0x4FD8, 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, 0x98DC, 0x4FD0, + 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, 0x98E0, 0x5028, 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, 0x98E4, 0x5005, + 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, 0x98E8, 0x5029, 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, 0x98EC, 0x5011, + 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, 0x98F0, 0x6703, 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, 0x98F4, 0x505A, + 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, 0x98F8, 0x5080, 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, 0x98FC, 0x50B2, + 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, 0x9943, 0x50C2, 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, 0x9947, 0x50ED, + 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, 0x994B, 0x50F5, 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, 0x994F, 0x5116, + 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, 0x9953, 0x5121, 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, 0x9957, 0x513B, + 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, 0x995B, 0x514C, 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, 0x995F, 0x5169, + 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, 0x9963, 0x5182, 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, 0x9967, 0x518F, + 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, 0x996B, 0x5196, 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, 0x996F, 0x51A9, + 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, 0x9973, 0x51B1, 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, 0x9977, 0x51BD, + 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, 0x997B, 0x51E0, 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, 0x9980, 0x51F0, + 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, 0x9984, 0x520B, 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, 0x9988, 0x522A, + 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, 0x998C, 0x524F, 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, 0x9990, 0x525E, + 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, 0x9994, 0x5269, 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, 0x9998, 0x528D, + 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, 0x999C, 0x5288, 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, 0x99A0, 0x52AC, + 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, 0x99A4, 0x52C1, 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, 0x99A8, 0x52E3, + 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, 0x99AC, 0x52F3, 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, 0x99B0, 0x5306, + 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, 0x99B4, 0x5310, 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, 0x99B8, 0x5323, + 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, 0x99BC, 0x5338, 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, 0x99C0, 0x4E17, + 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, 0x99C4, 0x535E, 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, 0x99C8, 0x537B, + 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, 0x99CC, 0x53A0, 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, 0x99D0, 0x53B0, + 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, 0x99D4, 0x96D9, 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, 0x99D8, 0x53EE, + 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, 0x99DC, 0x5401, 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, 0x99E0, 0x542D, + 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, 0x99E4, 0x5429, 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, 0x99E8, 0x5475, + 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, 0x99EC, 0x5477, 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, 0x99F0, 0x5480, + 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, 0x99F4, 0x5486, 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, 0x99F8, 0x54A5, + 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, 0x99FC, 0x54A8, 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, 0x9A43, 0x54BE, + 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, 0x9A47, 0x54E6, 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, 0x9A4B, 0x54EE, + 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, 0x9A4F, 0x5539, 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, 0x9A53, 0x552E, + 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, 0x9A57, 0x5557, 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, 0x9A5B, 0x5599, + 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, 0x9A5F, 0x559F, 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, 0x9A63, 0x559E, + 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, 0x9A67, 0x55A9, 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, 0x9A6B, 0x55C5, + 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, 0x9A6F, 0x55E4, 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, 0x9A73, 0x5616, + 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, 0x9A77, 0x55F9, 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, 0x9A7B, 0x5634, + 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, 0x9A80, 0x566B, 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, 0x9A84, 0x566A, + 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, 0x9A88, 0x56A0, 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, 0x9A8C, 0x56AE, + 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, 0x9A90, 0x56BC, 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, 0x9A94, 0x56C8, + 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, 0x9A98, 0x56D7, 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, 0x9A9C, 0x56FF, + 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, 0x9AA0, 0x570B, 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, 0x9AA4, 0x5716, + 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, 0x9AA8, 0x5737, 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, 0x9AAC, 0x5740, + 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, 0x9AB0, 0x5788, 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, 0x9AB4, 0x5793, + 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, 0x9AB8, 0x57AA, 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, 0x9ABC, 0x57D4, + 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, 0x9AC0, 0x57D6, 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, 0x9AC4, 0x581D, + 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, 0x9AC8, 0x584B, 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, 0x9ACC, 0x583D, + 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, 0x9AD0, 0x589F, 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, 0x9AD4, 0x58BB, + 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, 0x9AD8, 0x58D3, 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, 0x9ADC, 0x58D8, + 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, 0x9AE0, 0x58DF, 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, 0x9AE4, 0x58FB, + 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, 0x9AE8, 0x590A, 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, 0x9AEC, 0x5925, + 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, 0x9AF0, 0x5938, 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, 0x9AF4, 0x5950, + 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, 0x9AF8, 0x5962, 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, 0x9AFC, 0x5969, + 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, 0x9B43, 0x4F5E, 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, 0x9B47, 0x59C6, + 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, 0x9B4B, 0x59D9, 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, 0x9B4F, 0x5A11, + 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, 0x9B53, 0x5A40, 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, 0x9B57, 0x5A36, + 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, 0x9B5B, 0x5ABC, 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, 0x9B5F, 0x5ABD, + 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, 0x9B63, 0x5AE9, 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, 0x9B67, 0x5B0C, + 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, 0x9B6B, 0x5AD0, 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, 0x9B6F, 0x5B43, + 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, 0x9B73, 0x5B55, 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, 0x9B77, 0x5B69, + 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, 0x9B7B, 0x5B78, 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, 0x9B80, 0x5B83, + 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, 0x9B84, 0x5BC7, 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, 0x9B88, 0x5BE4, + 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, 0x9B8C, 0x5BE5, 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, 0x9B90, 0x5BF3, + 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, 0x9B94, 0x5C0D, 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, 0x9B98, 0x5C28, + 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, 0x9B9C, 0x5C46, 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, 0x9BA0, 0x5C4F, + 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, 0x9BA4, 0x4E62, 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, 0x9BA8, 0x5C91, + 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, 0x9BAC, 0x5CBB, 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, 0x9BB0, 0x5CC5, + 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, 0x9BB4, 0x5CE9, 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, 0x9BB8, 0x5D8C, + 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, 0x9BBC, 0x5D17, 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, 0x9BC0, 0x5D11, + 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, 0x9BC4, 0x5D19, 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, 0x9BC8, 0x5D4E, + 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, 0x9BCC, 0x5D76, 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, 0x9BD0, 0x5DA2, + 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, 0x9BD4, 0x5DBD, 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, 0x9BD8, 0x5DC9, + 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, 0x9BDC, 0x5DD6, 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, 0x9BE0, 0x5DF5, + 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, 0x9BE4, 0x5E11, 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, 0x9BE8, 0x5E44, + 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, 0x9BEC, 0x5E57, 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, 0x9BF0, 0x5E64, + 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, 0x9BF4, 0x5E7A, 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, 0x9BF8, 0x5EC1, + 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, 0x9BFC, 0x5ECF, 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, 0x9C43, 0x5EDA, + 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, 0x9C47, 0x5EE8, 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, 0x9C4B, 0x5EF3, + 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, 0x9C4F, 0x5EFE, 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, 0x9C53, 0x5F5C, + 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, 0x9C57, 0x5F29, 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, 0x9C5B, 0x5F48, + 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, 0x9C5F, 0x5F51, 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, 0x9C63, 0x5F61, + 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, 0x9C67, 0x5F83, 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, 0x9C6B, 0x5F88, + 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, 0x9C6F, 0x5F99, 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, 0x9C73, 0x5FAD, + 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, 0x9C77, 0x5FE4, 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, 0x9C7B, 0x60B3, + 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, 0x9C80, 0x6019, 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, 0x9C84, 0x6031, + 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, 0x9C88, 0x6026, 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, 0x9C8C, 0x6041, + 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, 0x9C90, 0x604A, 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, 0x9C94, 0x6043, + 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, 0x9C98, 0x606B, 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, 0x9C9C, 0x60E7, + 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, 0x9CA0, 0x609B, 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, 0x9CA4, 0x60A7, + 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, 0x9CA8, 0x60E0, 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, 0x9CAC, 0x60BD, + 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, 0x9CB0, 0x614D, 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, 0x9CB4, 0x60F7, + 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, 0x9CB8, 0x6103, 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, 0x9CBC, 0x610D, + 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, 0x9CC0, 0x6128, 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, 0x9CC4, 0x613C, + 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, 0x9CC8, 0x6142, 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, 0x9CCC, 0x6158, + 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, 0x9CD0, 0x6174, 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, 0x9CD4, 0x615F, + 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, 0x9CD8, 0x6199, 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, 0x9CDC, 0x6194, + 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, 0x9CE0, 0x61AB, 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, 0x9CE4, 0x61C9, + 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, 0x9CE8, 0x61C6, 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, 0x9CEC, 0x61CD, + 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, 0x9CF0, 0x61FA, 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, 0x9CF4, 0x61FC, + 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, 0x9CF8, 0x6209, 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, 0x9CFC, 0x621B, + 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, 0x9D43, 0x622E, 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, 0x9D47, 0x6241, + 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, 0x9D4B, 0x625B, 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, 0x9D4F, 0x6282, + 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, 0x9D53, 0x6293, 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, 0x9D57, 0x6294, + 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, 0x9D5B, 0x62CF, 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, 0x9D5F, 0x62C8, + 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, 0x9D63, 0x62C2, 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, 0x9D67, 0x630C, + 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, 0x9D6B, 0x6302, 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, 0x9D6F, 0x6350, + 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, 0x9D73, 0x634F, 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, 0x9D77, 0x63AB, + 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, 0x9D7B, 0x6389, 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, 0x9D80, 0x6369, + 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, 0x9D84, 0x63C6, 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, 0x9D88, 0x63F6, + 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, 0x9D8C, 0x6406, 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, 0x9D90, 0x651D, + 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, 0x9D94, 0x6467, 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, 0x9D98, 0x652A, + 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, 0x9D9C, 0x64A9, 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, 0x9DA0, 0x64D2, + 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, 0x9DA4, 0x64D8, 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, 0x9DA8, 0x8209, + 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, 0x9DAC, 0x64E3, 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, 0x9DB0, 0x64F4, + 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, 0x9DB4, 0x64FD, 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, 0x9DB8, 0x6524, + 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, 0x9DBC, 0x6535, 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, 0x9DC0, 0x754B, + 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, 0x9DC4, 0x654D, 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, 0x9DC8, 0x6572, + 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, 0x9DCC, 0x8B8A, 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, 0x9DD0, 0x65B7, + 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, 0x9DD4, 0x65C4, 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, 0x9DD8, 0x65D9, + 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, 0x9DDC, 0x6772, 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, 0x9DE0, 0x6773, + 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, 0x9DE4, 0x661C, 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, 0x9DE8, 0x6641, + 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, 0x9DEC, 0x6667, 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, 0x9DF0, 0x6670, + 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, 0x9DF4, 0x6689, 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, 0x9DF8, 0x66C1, + 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, 0x9DFC, 0x66BC, 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, 0x9E43, 0x66DA, + 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, 0x9E47, 0x66E9, 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, 0x9E4B, 0x670F, + 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, 0x9E4F, 0x6727, 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, 0x9E53, 0x6736, + 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, 0x9E57, 0x6746, 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, 0x9E5B, 0x6763, + 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, 0x9E5F, 0x67A9, 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, 0x9E63, 0x678B, + 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, 0x9E67, 0x67B7, 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, 0x9E6B, 0x67B3, + 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, 0x9E6F, 0x67DE, 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, 0x9E73, 0x67B9, + 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, 0x9E77, 0x6A9C, 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, 0x9E7B, 0x6840, + 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, 0x9E80, 0x68B3, 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, 0x9E84, 0x6877, + 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, 0x9E88, 0x68AD, 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, 0x9E8C, 0x6883, + 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, 0x9E90, 0x68B5, 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, 0x9E94, 0x688D, + 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, 0x9E98, 0x6908, 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, 0x9E9C, 0x68E1, + 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, 0x9EA0, 0x68E7, 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, 0x9EA4, 0x6904, + 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, 0x9EA8, 0x68F9, 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, 0x9EAC, 0x692A, + 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, 0x9EB0, 0x68C6, 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, 0x9EB4, 0x6978, + 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, 0x9EB8, 0x696E, 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, 0x9EBC, 0x6959, + 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, 0x9EC0, 0x695D, 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, 0x9EC4, 0x69AE, + 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, 0x9EC8, 0x69D3, 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, 0x9ECC, 0x69CA, + 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, 0x9ED0, 0x69A7, 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, 0x9ED4, 0x699C, + 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, 0x9ED8, 0x69E8, 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, 0x9EDC, 0x6B0A, + 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, 0x9EE0, 0x6A05, 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, 0x9EE4, 0x6A14, + 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, 0x9EE8, 0x6AC1, 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, 0x9EEC, 0x6A0C, + 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, 0x9EF0, 0x6A47, 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, 0x9EF4, 0x6A48, + 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, 0x9EF8, 0x6A8D, 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, 0x9EFC, 0x6AA3, + 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, 0x9F43, 0x6AC3, 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, 0x9F47, 0x6AAC, + 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, 0x9F4B, 0x6AAA, 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, 0x9F4F, 0x6B05, + 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, 0x9F53, 0x6B16, 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, 0x9F57, 0x6B37, + 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, 0x9F5B, 0x6B47, 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, 0x9F5F, 0x6B59, + 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, 0x9F63, 0x6B61, 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, 0x9F67, 0x6B80, + 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, 0x9F6B, 0x6B98, 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, 0x9F6F, 0x6BAA, + 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, 0x9F73, 0x6BB1, 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, 0x9F77, 0x6BC6, + 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, 0x9F7B, 0x6BEC, 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, 0x9F80, 0x9EBE, + 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, 0x9F84, 0x6C1B, 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, 0x9F88, 0x6C55, + 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, 0x9F8C, 0x6C8D, 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, 0x9F90, 0x6C7E, + 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, 0x9F94, 0x6C90, 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, 0x9F98, 0x6CBD, + 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, 0x9F9C, 0x6CAE, 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, 0x9FA0, 0x6CDB, + 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, 0x9FA4, 0x6D1F, 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, 0x9FA8, 0x6D3D, + 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, 0x9FAC, 0x6D33, 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, 0x9FB0, 0x6D93, + 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, 0x9FB4, 0x6D59, 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, 0x9FB8, 0x6D85, + 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, 0x9FBC, 0x6DB5, 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, 0x9FC0, 0x6DC6, + 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, 0x9FC4, 0x6DE8, 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, 0x9FC8, 0x6DD9, + 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, 0x9FCC, 0x6DEE, 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, 0x9FD0, 0x6E19, + 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, 0x9FD4, 0x6E23, 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, 0x9FD8, 0x6E4D, + 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, 0x9FDC, 0x6E4E, 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, 0x9FE0, 0x6E38, + 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, 0x9FE4, 0x6EC9, 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, 0x9FE8, 0x6EAF, + 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, 0x9FEC, 0x6ED5, 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, 0x9FF0, 0x6E9F, + 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, 0x9FF4, 0x6EEC, 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, 0x9FF8, 0x6EF2, + 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, 0x9FFC, 0x6ECC, 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, 0xE043, 0x6F86, + 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, 0xE047, 0x6F80, 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, 0xE04B, 0x6F6D, + 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, 0xE04F, 0x6F8E, 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, 0xE053, 0x6FB3, + 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, 0xE057, 0x6FB9, 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, 0xE05B, 0x6FD5, + 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, 0xE05F, 0x6FF1, 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, 0xE063, 0x700B, + 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, 0xE067, 0x700F, 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, 0xE06B, 0x6F74, + 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, 0xE06F, 0x7030, 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, 0xE073, 0x7063, + 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, 0xE077, 0x70F1, 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, 0xE07B, 0x70AE, + 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, 0xE080, 0x70D9, 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, 0xE084, 0x7119, + 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, 0xE088, 0x7166, 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, 0xE08C, 0x716C, + 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, 0xE090, 0x7195, 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, 0xE094, 0x71B9, + 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, 0xE098, 0x71D4, 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, 0xE09C, 0x71E7, + 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, 0xE0A0, 0x71FF, 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, 0xE0A4, 0x7228, + 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, 0xE0A8, 0x7232, 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, 0xE0AC, 0x7240, + 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, 0xE0B0, 0x7274, 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, 0xE0B4, 0x7287, + 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, 0xE0B8, 0x72A7, 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, 0xE0BC, 0x72C6, + 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, 0xE0C0, 0x72E2, 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, 0xE0C4, 0x72F7, + 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, 0xE0C8, 0x731C, 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, 0xE0CC, 0x732F, + 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, 0xE0D0, 0x734E, 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, 0xE0D4, 0x736A, + 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, 0xE0D8, 0x7375, 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, 0xE0DC, 0x73B3, + 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, 0xE0E0, 0x73E5, 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, 0xE0E4, 0x7405, + 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, 0xE0E8, 0x7432, 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, 0xE0EC, 0x745F, + 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, 0xE0F0, 0x7469, 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, 0xE0F4, 0x7476, + 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, 0xE0F8, 0x74A7, 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, 0xE0FC, 0x73F1, + 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, 0xE143, 0x74E9, 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, 0xE147, 0x74F1, + 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, 0xE14B, 0x7503, 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, 0xE14F, 0x750D, + 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, 0xE153, 0x7526, 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, 0xE157, 0x754D, + 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, 0xE15B, 0x7546, 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, 0xE15F, 0x7567, + 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, 0xE163, 0x7576, 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, 0xE167, 0x758A, + 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, 0xE16B, 0x759A, 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, 0xE16F, 0x75C2, + 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, 0xE173, 0x75BD, 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, 0xE177, 0x75CD, + 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, 0xE17B, 0x75E3, 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, 0xE180, 0x75FC, + 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, 0xE184, 0x75F2, 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, 0xE188, 0x7609, + 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, 0xE18C, 0x7621, 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, 0xE190, 0x7630, + 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, 0xE194, 0x7646, 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, 0xE198, 0x7662, + 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, 0xE19C, 0x7667, 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, 0xE1A0, 0x7676, + 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, 0xE1A4, 0x7683, 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, 0xE1A8, 0x7696, + 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, 0xE1AC, 0x76B0, 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, 0xE1B0, 0x76BA, + 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, 0xE1B4, 0x76D2, 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, 0xE1B8, 0x76E7, + 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, 0xE1BC, 0x7708, 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, 0xE1C0, 0x7724, + 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, 0xE1C4, 0x771B, 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, 0xE1C8, 0x775A, + 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, 0xE1CC, 0x7765, 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, 0xE1D0, 0x778E, + 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, 0xE1D4, 0x779E, 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, 0xE1D8, 0x77BF, + 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, 0xE1DC, 0x77C7, 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, 0xE1E0, 0x77DC, + 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, 0xE1E4, 0x780C, 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, 0xE1E8, 0x792A, + 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, 0xE1EC, 0x7886, 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, 0xE1F0, 0x78A3, + 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, 0xE1F4, 0x78D1, 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, 0xE1F8, 0x78BE, + 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, 0xE1FC, 0x78EC, 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, 0xE243, 0x78F4, + 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, 0xE247, 0x7919, 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, 0xE24B, 0x7960, + 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, 0xE24F, 0x7955, 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, 0xE253, 0x798A, + 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, 0xE257, 0x79AA, 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, 0xE25B, 0x79BA, + 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, 0xE25F, 0x79EC, 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, 0xE263, 0x7A0D, + 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, 0xE267, 0x7A1F, 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, 0xE26B, 0x7A3E, + 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, 0xE26F, 0x7A49, 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, 0xE273, 0x9F9D, + 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, 0xE277, 0x7A88, 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, 0xE27B, 0x7A96, + 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, 0xE280, 0x7AB6, 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, 0xE284, 0x9083, + 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, 0xE288, 0x7ACF, 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, 0xE28C, 0x7ADA, + 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, 0xE290, 0x7AE6, 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, 0xE294, 0x7B0F, + 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, 0xE298, 0x7B18, 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, 0xE29C, 0x7B28, + 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, 0xE2A0, 0x7B04, 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, 0xE2A4, 0x7B45, + 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, 0xE2A8, 0x7B67, 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, 0xE2AC, 0x7B6E, + 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, 0xE2B0, 0x7B8D, 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, 0xE2B4, 0x7B92, + 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, 0xE2B8, 0x7BCB, 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, 0xE2BC, 0x7BB4, + 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, 0xE2C0, 0x7C11, 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, 0xE2C4, 0x7C60, + 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, 0xE2C8, 0x7BF3, 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, 0xE2CC, 0x7BF6, + 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, 0xE2D0, 0x7C1F, 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, 0xE2D4, 0x7C4C, + 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, 0xE2D8, 0x7C40, 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, 0xE2DC, 0x7C64, + 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, 0xE2E0, 0x7C75, 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, 0xE2E4, 0x7CAD, + 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, 0xE2E8, 0x7CA8, 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, 0xE2EC, 0x7CAE, + 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, 0xE2F0, 0x7CC5, 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, 0xE2F4, 0x7CDC, + 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, 0xE2F8, 0x7CF2, 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, 0xE2FC, 0x7D06, + 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, 0xE343, 0x7D0A, 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, 0xE347, 0x7D32, + 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, 0xE34B, 0x7D73, 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, 0xE34F, 0x7D68, + 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, 0xE353, 0x7D93, 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, 0xE357, 0x7D7D, + 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, 0xE35B, 0x7DA3, 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, 0xE35F, 0x7DAB, + 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, 0xE363, 0x7DDC, 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, 0xE367, 0x7DD8, + 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, 0xE36B, 0x7DFB, 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, 0xE36F, 0x7E0A, + 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, 0xE373, 0x7E31, 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, 0xE377, 0x7E22, + 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, 0xE37B, 0x7E35, 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, 0xE380, 0x7E32, + 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, 0xE384, 0x7E56, 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, 0xE388, 0x7E79, + 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, 0xE38C, 0x7E7B, 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, 0xE390, 0x8FAE, + 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, 0xE394, 0x7E8C, 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, 0xE398, 0x7E94, + 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, 0xE39C, 0x7E9C, 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, 0xE3A0, 0x7F4C, + 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, 0xE3A4, 0x7F51, 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, 0xE3A8, 0x7F5F, + 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, 0xE3AC, 0x7F67, 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, 0xE3B0, 0x7F83, + 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, 0xE3B4, 0x7F94, 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, 0xE3B8, 0x7FA3, + 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, 0xE3BC, 0x7FAE, 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, 0xE3C0, 0x7FC5, + 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, 0xE3C4, 0x7FD4, 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, 0xE3C8, 0x7FF3, + 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, 0xE3CC, 0x8004, 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, 0xE3D0, 0x8019, + 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, 0xE3D4, 0x803F, 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, 0xE3D8, 0x8052, + 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, 0xE3DC, 0x8062, 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, 0xE3E0, 0x8070, + 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, 0xE3E4, 0x807F, 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, 0xE3E8, 0x809B, + 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, 0xE3EC, 0x5190, 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, 0xE3F0, 0x80D9, + 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, 0xE3F4, 0x80D6, 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, 0xE3F8, 0x811B, + 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, 0xE3FC, 0x814B, 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, 0xE443, 0x8153, + 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, 0xE447, 0x816E, 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, 0xE44B, 0x8183, + 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, 0xE44F, 0x8182, 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, 0xE453, 0x81A3, + 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, 0xE457, 0x81B0, 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, 0xE45B, 0x81BD, + 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, 0xE45F, 0x81C9, 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, 0xE463, 0x81D8, + 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, 0xE467, 0x81E0, 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, 0xE46B, 0x81FE, + 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, 0xE46F, 0x8207, 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, 0xE473, 0x8216, + 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, 0xE477, 0x8233, 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, 0xE47B, 0x825D, + 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, 0xE480, 0x8262, 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, 0xE484, 0x822E, + 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, 0xE488, 0x827E, 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, 0xE48C, 0x829F, + 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, 0xE490, 0x82E3, 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, 0xE494, 0x82F3, + 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, 0xE498, 0x82FB, 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, 0xE49C, 0x82DC, + 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, 0xE4A0, 0x8334, 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, 0xE4A4, 0x8340, + 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, 0xE4A8, 0x832F, 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, 0xE4AC, 0x8385, + 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, 0xE4B0, 0x83A2, 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, 0xE4B4, 0x8387, + 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, 0xE4B8, 0x8373, 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, 0xE4BC, 0x83A8, + 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, 0xE4C0, 0x83CE, 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, 0xE4C4, 0x840B, + 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, 0xE4C8, 0x83E0, 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, 0xE4CC, 0x8420, + 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, 0xE4D0, 0x83FB, 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, 0xE4D4, 0x855A, + 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, 0xE4D8, 0x84AD, 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, 0xE4DC, 0x8446, + 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, 0xE4E0, 0x8435, 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, 0xE4E4, 0x84BF, + 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, 0xE4E8, 0x84BB, 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, 0xE4EC, 0x84C6, + 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, 0xE4F0, 0x84FF, 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, 0xE4F4, 0x852C, + 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, 0xE4F8, 0x84FC, 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, 0xE4FC, 0x8548, + 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, 0xE543, 0x8555, 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, 0xE547, 0x8591, + 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, 0xE54B, 0x8594, 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, 0xE54F, 0x859C, + 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, 0xE553, 0x85C9, 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, 0xE557, 0x85D0, + 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, 0xE55B, 0x85DC, 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, 0xE55F, 0x860B, + 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, 0xE563, 0x8622, 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, 0xE567, 0x864D, + 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, 0xE56B, 0x8667, 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, 0xE56F, 0x86A9, + 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, 0xE573, 0x86B6, 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, 0xE577, 0x86B0, + 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, 0xE57B, 0x86D4, 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, 0xE580, 0x86DF, + 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, 0xE584, 0x8706, 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, 0xE588, 0x86FB, + 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, 0xE58C, 0x86F9, 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, 0xE590, 0x8737, + 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, 0xE594, 0x871A, 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, 0xE598, 0x874C, + 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, 0xE59C, 0x8768, 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, 0xE5A0, 0x8763, + 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, 0xE5A4, 0x879F, 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, 0xE5A8, 0x87BD, + 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, 0xE5AC, 0x87AB, 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, 0xE5B0, 0x87C6, + 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, 0xE5B4, 0x87E0, 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, 0xE5B8, 0x87F6, + 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, 0xE5BC, 0x8811, 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, 0xE5C0, 0x8821, + 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, 0xE5C4, 0x8827, 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, 0xE5C8, 0x8852, + 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, 0xE5CC, 0x886B, 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, 0xE5D0, 0x8875, + 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, 0xE5D4, 0x8882, 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, 0xE5D8, 0x8899, + 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, 0xE5DC, 0x88B0, 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, 0xE5E0, 0x88C4, + 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, 0xE5E4, 0x88DD, 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, 0xE5E8, 0x88F4, + 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, 0xE5EC, 0x890C, 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, 0xE5F0, 0x891E, + 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, 0xE5F4, 0x8941, 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, 0xE5F8, 0x8938, + 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, 0xE5FC, 0x895E, 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, 0xE643, 0x896A, + 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, 0xE647, 0x897E, 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, 0xE64B, 0x8993, + 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, 0xE64F, 0x89A6, 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, 0xE653, 0x89BA, + 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, 0xE657, 0x89DA, 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, 0xE65B, 0x89F4, + 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, 0xE65F, 0x8A10, 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, 0xE663, 0x8A25, + 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, 0xE667, 0x8A52, 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, 0xE66B, 0x8A6D, + 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, 0xE66F, 0x8A82, 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, 0xE673, 0x8A91, + 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, 0xE677, 0x8AA3, 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, 0xE67B, 0x8ADA, + 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, 0xE680, 0x8AE4, 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, 0xE684, 0x8AE2, + 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, 0xE688, 0x8B0C, 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, 0xE68C, 0x8B16, + 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, 0xE690, 0x8B33, 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, 0xE694, 0x8B3E, + 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, 0xE698, 0x8B4F, 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, 0xE69C, 0x8B5B, + 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, 0xE6A0, 0x8B6C, 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, 0xE6A4, 0x8B80, + 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, 0xE6A8, 0x8B93, 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, 0xE6AC, 0x8C3A, + 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, 0xE6B0, 0x8C4C, 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, 0xE6B4, 0x8C62, + 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, 0xE6B8, 0x8C82, 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, 0xE6BC, 0x8C8D, + 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, 0xE6C0, 0x8C98, 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, 0xE6C4, 0x8CBD, + 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, 0xE6C8, 0x8CB6, 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, 0xE6CC, 0x8CE3, + 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, 0xE6D0, 0x8CFB, 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, 0xE6D4, 0x8D07, + 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, 0xE6D8, 0x9F4E, 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, 0xE6DC, 0x8D16, + 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, 0xE6E0, 0x8D73, 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, 0xE6E4, 0x8DBE, + 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, 0xE6E8, 0x8DD6, 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, 0xE6EC, 0x8DEA, + 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, 0xE6F0, 0x8DFC, 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, 0xE6F4, 0x8E1D, + 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, 0xE6F8, 0x8E42, 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, 0xE6FC, 0x8E4A, + 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, 0xE743, 0x8E50, 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, 0xE747, 0x8E60, + 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, 0xE74B, 0x8E76, 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, 0xE74F, 0x8E87, + 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, 0xE753, 0x8E8A, 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, 0xE757, 0x8E99, + 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, 0xE75B, 0x8EB0, 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, 0xE75F, 0x8EC5, + 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, 0xE763, 0x8EE3, 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, 0xE767, 0x8EFE, + 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, 0xE76B, 0x8F12, 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, 0xE76F, 0x8F1F, + 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, 0xE773, 0x8F33, 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, 0xE777, 0x8F42, + 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, 0xE77B, 0x8F46, 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, 0xE780, 0x8F62, + 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, 0xE784, 0x8F9F, 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, 0xE788, 0x8FB7, + 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, 0xE78C, 0x8FEA, 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, 0xE790, 0x9005, + 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, 0xE794, 0x9015, 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, 0xE798, 0x9016, + 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, 0xE79C, 0x9035, 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, 0xE7A0, 0x9050, + 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, 0xE7A4, 0x9049, 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, 0xE7A8, 0x905E, + 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, 0xE7AC, 0x96A8, 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, 0xE7B0, 0x9081, + 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, 0xE7B4, 0x908F, 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, 0xE7B8, 0x90B5, + 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, 0xE7BC, 0x90DB, 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, 0xE7C0, 0x9132, + 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, 0xE7C4, 0x9158, 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, 0xE7C8, 0x9173, + 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, 0xE7CC, 0x9182, 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, 0xE7D0, 0x91AA, + 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, 0xE7D4, 0x91C0, 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, 0xE7D8, 0x91D0, + 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, 0xE7DC, 0x91DB, 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, 0xE7E0, 0x921E, + 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, 0xE7E4, 0x9215, 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, 0xE7E8, 0x9245, + 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, 0xE7EC, 0x9295, 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, 0xE7F0, 0x929C, + 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, 0xE7F4, 0x925A, 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, 0xE7F8, 0x92E9, + 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, 0xE7FC, 0x932E, 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, 0xE843, 0x9323, + 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, 0xE847, 0x935C, 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, 0xE84B, 0x9356, + 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, 0xE84F, 0x9394, 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, 0xE853, 0x93E8, + 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, 0xE857, 0x93DD, 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, 0xE85B, 0x941A, + 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, 0xE85F, 0x9407, 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, 0xE863, 0x9435, + 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, 0xE867, 0x9452, 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, 0xE86B, 0x9462, + 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, 0xE86F, 0x9470, 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, 0xE873, 0x945A, + 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, 0xE877, 0x947F, 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, 0xE87B, 0x9594, + 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, 0xE880, 0x95A0, 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, 0xE884, 0x95BC, + 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, 0xE888, 0x95CA, 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, 0xE88C, 0x95CC, + 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, 0xE890, 0x95DC, 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, 0xE894, 0x9621, + 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, 0xE898, 0x9642, 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, 0xE89C, 0x9677, + 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, 0xE8A0, 0x965F, 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, 0xE8A4, 0x968D, + 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, 0xE8A8, 0x96AA, 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, 0xE8AC, 0x96B0, + 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, 0xE8B0, 0x96B9, 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, 0xE8B4, 0x96CD, + 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, 0xE8B8, 0x96D5, 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, 0xE8BC, 0x9708, + 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, 0xE8C0, 0x970F, 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, 0xE8C4, 0x972A, + 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, 0xE8C8, 0x973E, 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, 0xE8CC, 0x9742, + 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, 0xE8D0, 0x9764, 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, 0xE8D4, 0x976B, + 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, 0xE8D8, 0x977C, 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, 0xE8DC, 0x978B, + 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, 0xE8E0, 0x97A8, 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, 0xE8E4, 0x97B4, + 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, 0xE8E8, 0x97CB, 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, 0xE8EC, 0x97F2, + 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, 0xE8F0, 0x980F, 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, 0xE8F4, 0x9821, + 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, 0xE8F8, 0x984F, 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, 0xE8FC, 0x9870, + 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, 0xE943, 0x98AA, 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, 0xE947, 0x98C4, + 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, 0xE94B, 0x98EB, 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, 0xE94F, 0x9914, + 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, 0xE953, 0x991E, 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, 0xE957, 0x992E, + 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, 0xE95B, 0x9949, 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, 0xE95F, 0x9951, + 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, 0xE963, 0x9997, 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, 0xE967, 0x99AE, + 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, 0xE96B, 0x99DD, 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, 0xE96F, 0x99EE, + 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, 0xE973, 0x99F8, 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, 0xE977, 0x99E2, + 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, 0xE97B, 0x9A45, 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, 0xE980, 0x9A3E, + 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, 0xE984, 0x9A57, 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, 0xE988, 0x9A64, + 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, 0xE98C, 0x9AAD, 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, 0xE990, 0x9ACF, + 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, 0xE994, 0x9ADE, 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, 0xE998, 0x9AE6, + 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, 0xE99C, 0x9AF4, 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, 0xE9A0, 0x9B06, + 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, 0xE9A4, 0x9B22, 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, 0xE9A8, 0x9B28, + 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, 0xE9AC, 0x9B2F, 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, 0xE9B0, 0x9B4F, + 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, 0xE9B4, 0x9B58, 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, 0xE9B8, 0x9B91, + 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, 0xE9BC, 0x9BA0, 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, 0xE9C0, 0x9BCA, + 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, 0xE9C4, 0x9BD1, 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, 0xE9C8, 0x9BE4, + 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, 0xE9CC, 0x9BF2, 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, 0xE9D0, 0x9C14, + 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, 0xE9D4, 0x9C06, 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, 0xE9D8, 0x9C04, + 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, 0xE9DC, 0x9C24, 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, 0xE9E0, 0x9C32, + 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, 0xE9E4, 0x9C60, 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, 0xE9E8, 0x9CE7, + 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, 0xE9EC, 0x9D08, 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, 0xE9F0, 0x9D2A, + 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, 0xE9F4, 0x9D1F, 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, 0xE9F8, 0x9D41, + 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, 0xE9FC, 0x9D48, 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, 0xEA43, 0x9D51, + 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, 0xEA47, 0x9D89, 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, 0xEA4B, 0x9D7A, + 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, 0xEA4F, 0x9DB2, 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, 0xEA53, 0x9DB8, + 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, 0xEA57, 0x9DC2, 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, 0xEA5B, 0x9DE6, + 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, 0xEA5F, 0x9E1A, 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, 0xEA63, 0x9E79, + 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, 0xEA67, 0x9E8B, 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, 0xEA6B, 0x9E91, + 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, 0xEA6F, 0x9EB8, 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, 0xEA73, 0x9ECC, + 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, 0xEA77, 0x9ED4, 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, 0xEA7B, 0x9EE0, + 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, 0xEA80, 0x9EF4, 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, 0xEA84, 0x9EFB, + 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, 0xEA88, 0x9F08, 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, 0xEA8C, 0x9F2C, + 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, 0xEA90, 0x9F54, 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, 0xEA94, 0x9F61, + 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, 0xEA98, 0x9F6A, 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, 0xEA9C, 0x9F95, + 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, 0xEAA0, 0x69C7, 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, 0xEAA4, 0x7199, + 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, 0xFA43, 0x2173, 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, 0xFA47, 0x2177, + 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, 0xFA56, 0xFF07, 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, 0xFA5E, 0x9348, + 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, 0xFA62, 0x70BB, 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, 0xFA66, 0x66FB, + 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, 0xFA6A, 0x4EFC, 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, 0xFA6E, 0x4F56, + 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, 0xFA72, 0x4F94, 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, 0xFA76, 0x4FFF, + 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, 0xFA7A, 0x5042, 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, 0xFA7E, 0x514A, + 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, 0xFA83, 0x51EC, 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, 0xFA87, 0x52C0, + 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, 0xFA8B, 0x5324, 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, 0xFA8F, 0x53DD, + 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, 0xFA93, 0x54A9, 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, 0xFA97, 0x5765, + 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, 0xFA9B, 0xFA0F, 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, 0xFA9F, 0x590B, + 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, 0xFAA3, 0x5963, 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, 0xFAA7, 0x5BC0, + 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, 0xFAAB, 0x5C1E, 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, 0xFAAF, 0x5D27, + 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, 0xFAB3, 0x5D6D, 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, 0xFAB7, 0x5F21, + 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, 0xFABB, 0x5FDE, 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, 0xFABF, 0x60DE, + 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, 0xFAC3, 0x6111, 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, 0xFAC7, 0x6213, + 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, 0xFACB, 0x649D, 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, 0xFACF, 0x6615, + 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, 0xFAD3, 0x661E, 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, 0xFAD7, 0x6659, + 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, 0xFADB, 0x66A0, 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, 0xFADF, 0x670E, + 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, 0xFAE3, 0x6852, 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, 0xFAE7, 0x68CF, + 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, 0xFAEB, 0x6998, 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, 0xFAEF, 0x6A46, + 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, 0xFAF3, 0x6AE4, 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, 0xFAF7, 0x6C86, + 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, 0xFAFB, 0x6D87, 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, 0xFB42, 0x6DCF, + 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, 0xFB46, 0x6E39, 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, 0xFB4A, 0x6EBF, + 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, 0xFB4E, 0x7005, 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, 0xFB52, 0x70AB, + 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, 0xFB56, 0x7146, 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, 0xFB5A, 0x71FE, + 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, 0xFB5E, 0xFA16, 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, 0xFB62, 0x73D6, + 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, 0xFB66, 0x73F5, 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, 0xFB6A, 0x742E, + 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, 0xFB6E, 0x7501, 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, 0xFB72, 0x769E, + 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, 0xFB76, 0x7746, 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, 0xFB7A, 0x7864, + 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, 0xFB7E, 0xFA19, 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, 0xFB83, 0x799B, + 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, 0xFB87, 0x7AEB, 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, 0xFB8B, 0x7D5C, + 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, 0xFB8F, 0x7E52, 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, 0xFB93, 0x8301, + 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, 0xFB97, 0x83F6, 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, 0xFB9B, 0x8559, + 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, 0xFB9F, 0xFA20, 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, 0xFBA3, 0x8A12, + 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, 0xFBA7, 0x8ABE, 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, 0xFBAB, 0x8B53, + 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, 0xFBAF, 0x8D12, 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, 0xFBB3, 0xFA24, + 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, 0xFBB7, 0xFA26, 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, 0xFBBB, 0x91D7, + 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, 0xFBBF, 0x91E4, 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, 0xFBC3, 0x920A, + 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, 0xFBC7, 0x924E, 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, 0xFBCB, 0x9267, + 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, 0xFBCF, 0x92E7, 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, 0xFBD3, 0xFA27, + 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, 0xFBD7, 0x9325, 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, 0xFBDB, 0x931E, + 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, 0xFBDF, 0x9370, 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, 0xFBE3, 0x93DE, + 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, 0xFBE7, 0x9448, 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, 0xFBEB, 0x969D, + 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, 0xFBEF, 0x9743, 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, 0xFBF3, 0x9755, + 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, 0xFBF7, 0xFA2B, 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, 0xFBFB, 0x9A4E, + 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, 0xFC42, 0x9B72, 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, 0xFC46, 0x9C00, + 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, 0xFC4A, 0x9E19, 0xFC4B, 0x9ED1, 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 936 || FF_CODE_PAGE == 0 /* Simplified Chinese */ +static const WCHAR uni2oem936[] = { /* Unicode --> GBK pairs */ + 0x00A4, 0xA1E8, 0x00A7, 0xA1EC, 0x00A8, 0xA1A7, 0x00B0, 0xA1E3, 0x00B1, 0xA1C0, 0x00B7, 0xA1A4, 0x00D7, 0xA1C1, 0x00E0, 0xA8A4, + 0x00E1, 0xA8A2, 0x00E8, 0xA8A8, 0x00E9, 0xA8A6, 0x00EA, 0xA8BA, 0x00EC, 0xA8AC, 0x00ED, 0xA8AA, 0x00F2, 0xA8B0, 0x00F3, 0xA8AE, + 0x00F7, 0xA1C2, 0x00F9, 0xA8B4, 0x00FA, 0xA8B2, 0x00FC, 0xA8B9, 0x0101, 0xA8A1, 0x0113, 0xA8A5, 0x011B, 0xA8A7, 0x012B, 0xA8A9, + 0x0144, 0xA8BD, 0x0148, 0xA8BE, 0x014D, 0xA8AD, 0x016B, 0xA8B1, 0x01CE, 0xA8A3, 0x01D0, 0xA8AB, 0x01D2, 0xA8AF, 0x01D4, 0xA8B3, + 0x01D6, 0xA8B5, 0x01D8, 0xA8B6, 0x01DA, 0xA8B7, 0x01DC, 0xA8B8, 0x0251, 0xA8BB, 0x0261, 0xA8C0, 0x02C7, 0xA1A6, 0x02C9, 0xA1A5, + 0x02CA, 0xA840, 0x02CB, 0xA841, 0x02D9, 0xA842, 0x0391, 0xA6A1, 0x0392, 0xA6A2, 0x0393, 0xA6A3, 0x0394, 0xA6A4, 0x0395, 0xA6A5, + 0x0396, 0xA6A6, 0x0397, 0xA6A7, 0x0398, 0xA6A8, 0x0399, 0xA6A9, 0x039A, 0xA6AA, 0x039B, 0xA6AB, 0x039C, 0xA6AC, 0x039D, 0xA6AD, + 0x039E, 0xA6AE, 0x039F, 0xA6AF, 0x03A0, 0xA6B0, 0x03A1, 0xA6B1, 0x03A3, 0xA6B2, 0x03A4, 0xA6B3, 0x03A5, 0xA6B4, 0x03A6, 0xA6B5, + 0x03A7, 0xA6B6, 0x03A8, 0xA6B7, 0x03A9, 0xA6B8, 0x03B1, 0xA6C1, 0x03B2, 0xA6C2, 0x03B3, 0xA6C3, 0x03B4, 0xA6C4, 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, 0x03B7, 0xA6C7, 0x03B8, 0xA6C8, 0x03B9, 0xA6C9, 0x03BA, 0xA6CA, 0x03BB, 0xA6CB, 0x03BC, 0xA6CC, 0x03BD, 0xA6CD, + 0x03BE, 0xA6CE, 0x03BF, 0xA6CF, 0x03C0, 0xA6D0, 0x03C1, 0xA6D1, 0x03C3, 0xA6D2, 0x03C4, 0xA6D3, 0x03C5, 0xA6D4, 0x03C6, 0xA6D5, + 0x03C7, 0xA6D6, 0x03C8, 0xA6D7, 0x03C9, 0xA6D8, 0x0401, 0xA7A7, 0x0410, 0xA7A1, 0x0411, 0xA7A2, 0x0412, 0xA7A3, 0x0413, 0xA7A4, + 0x0414, 0xA7A5, 0x0415, 0xA7A6, 0x0416, 0xA7A8, 0x0417, 0xA7A9, 0x0418, 0xA7AA, 0x0419, 0xA7AB, 0x041A, 0xA7AC, 0x041B, 0xA7AD, + 0x041C, 0xA7AE, 0x041D, 0xA7AF, 0x041E, 0xA7B0, 0x041F, 0xA7B1, 0x0420, 0xA7B2, 0x0421, 0xA7B3, 0x0422, 0xA7B4, 0x0423, 0xA7B5, + 0x0424, 0xA7B6, 0x0425, 0xA7B7, 0x0426, 0xA7B8, 0x0427, 0xA7B9, 0x0428, 0xA7BA, 0x0429, 0xA7BB, 0x042A, 0xA7BC, 0x042B, 0xA7BD, + 0x042C, 0xA7BE, 0x042D, 0xA7BF, 0x042E, 0xA7C0, 0x042F, 0xA7C1, 0x0430, 0xA7D1, 0x0431, 0xA7D2, 0x0432, 0xA7D3, 0x0433, 0xA7D4, + 0x0434, 0xA7D5, 0x0435, 0xA7D6, 0x0436, 0xA7D8, 0x0437, 0xA7D9, 0x0438, 0xA7DA, 0x0439, 0xA7DB, 0x043A, 0xA7DC, 0x043B, 0xA7DD, + 0x043C, 0xA7DE, 0x043D, 0xA7DF, 0x043E, 0xA7E0, 0x043F, 0xA7E1, 0x0440, 0xA7E2, 0x0441, 0xA7E3, 0x0442, 0xA7E4, 0x0443, 0xA7E5, + 0x0444, 0xA7E6, 0x0445, 0xA7E7, 0x0446, 0xA7E8, 0x0447, 0xA7E9, 0x0448, 0xA7EA, 0x0449, 0xA7EB, 0x044A, 0xA7EC, 0x044B, 0xA7ED, + 0x044C, 0xA7EE, 0x044D, 0xA7EF, 0x044E, 0xA7F0, 0x044F, 0xA7F1, 0x0451, 0xA7D7, 0x2010, 0xA95C, 0x2013, 0xA843, 0x2014, 0xA1AA, + 0x2015, 0xA844, 0x2016, 0xA1AC, 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, 0x2025, 0xA845, 0x2026, 0xA1AD, + 0x2030, 0xA1EB, 0x2032, 0xA1E4, 0x2033, 0xA1E5, 0x2035, 0xA846, 0x203B, 0xA1F9, 0x20AC, 0x0080, 0x2103, 0xA1E6, 0x2105, 0xA847, + 0x2109, 0xA848, 0x2116, 0xA1ED, 0x2121, 0xA959, 0x2160, 0xA2F1, 0x2161, 0xA2F2, 0x2162, 0xA2F3, 0x2163, 0xA2F4, 0x2164, 0xA2F5, + 0x2165, 0xA2F6, 0x2166, 0xA2F7, 0x2167, 0xA2F8, 0x2168, 0xA2F9, 0x2169, 0xA2FA, 0x216A, 0xA2FB, 0x216B, 0xA2FC, 0x2170, 0xA2A1, + 0x2171, 0xA2A2, 0x2172, 0xA2A3, 0x2173, 0xA2A4, 0x2174, 0xA2A5, 0x2175, 0xA2A6, 0x2176, 0xA2A7, 0x2177, 0xA2A8, 0x2178, 0xA2A9, + 0x2179, 0xA2AA, 0x2190, 0xA1FB, 0x2191, 0xA1FC, 0x2192, 0xA1FA, 0x2193, 0xA1FD, 0x2196, 0xA849, 0x2197, 0xA84A, 0x2198, 0xA84B, + 0x2199, 0xA84C, 0x2208, 0xA1CA, 0x220F, 0xA1C7, 0x2211, 0xA1C6, 0x2215, 0xA84D, 0x221A, 0xA1CC, 0x221D, 0xA1D8, 0x221E, 0xA1DE, + 0x221F, 0xA84E, 0x2220, 0xA1CF, 0x2223, 0xA84F, 0x2225, 0xA1CE, 0x2227, 0xA1C4, 0x2228, 0xA1C5, 0x2229, 0xA1C9, 0x222A, 0xA1C8, + 0x222B, 0xA1D2, 0x222E, 0xA1D3, 0x2234, 0xA1E0, 0x2235, 0xA1DF, 0x2236, 0xA1C3, 0x2237, 0xA1CB, 0x223D, 0xA1D7, 0x2248, 0xA1D6, + 0x224C, 0xA1D5, 0x2252, 0xA850, 0x2260, 0xA1D9, 0x2261, 0xA1D4, 0x2264, 0xA1DC, 0x2265, 0xA1DD, 0x2266, 0xA851, 0x2267, 0xA852, + 0x226E, 0xA1DA, 0x226F, 0xA1DB, 0x2295, 0xA892, 0x2299, 0xA1D1, 0x22A5, 0xA1CD, 0x22BF, 0xA853, 0x2312, 0xA1D0, 0x2460, 0xA2D9, + 0x2461, 0xA2DA, 0x2462, 0xA2DB, 0x2463, 0xA2DC, 0x2464, 0xA2DD, 0x2465, 0xA2DE, 0x2466, 0xA2DF, 0x2467, 0xA2E0, 0x2468, 0xA2E1, + 0x2469, 0xA2E2, 0x2474, 0xA2C5, 0x2475, 0xA2C6, 0x2476, 0xA2C7, 0x2477, 0xA2C8, 0x2478, 0xA2C9, 0x2479, 0xA2CA, 0x247A, 0xA2CB, + 0x247B, 0xA2CC, 0x247C, 0xA2CD, 0x247D, 0xA2CE, 0x247E, 0xA2CF, 0x247F, 0xA2D0, 0x2480, 0xA2D1, 0x2481, 0xA2D2, 0x2482, 0xA2D3, + 0x2483, 0xA2D4, 0x2484, 0xA2D5, 0x2485, 0xA2D6, 0x2486, 0xA2D7, 0x2487, 0xA2D8, 0x2488, 0xA2B1, 0x2489, 0xA2B2, 0x248A, 0xA2B3, + 0x248B, 0xA2B4, 0x248C, 0xA2B5, 0x248D, 0xA2B6, 0x248E, 0xA2B7, 0x248F, 0xA2B8, 0x2490, 0xA2B9, 0x2491, 0xA2BA, 0x2492, 0xA2BB, + 0x2493, 0xA2BC, 0x2494, 0xA2BD, 0x2495, 0xA2BE, 0x2496, 0xA2BF, 0x2497, 0xA2C0, 0x2498, 0xA2C1, 0x2499, 0xA2C2, 0x249A, 0xA2C3, + 0x249B, 0xA2C4, 0x2500, 0xA9A4, 0x2501, 0xA9A5, 0x2502, 0xA9A6, 0x2503, 0xA9A7, 0x2504, 0xA9A8, 0x2505, 0xA9A9, 0x2506, 0xA9AA, + 0x2507, 0xA9AB, 0x2508, 0xA9AC, 0x2509, 0xA9AD, 0x250A, 0xA9AE, 0x250B, 0xA9AF, 0x250C, 0xA9B0, 0x250D, 0xA9B1, 0x250E, 0xA9B2, + 0x250F, 0xA9B3, 0x2510, 0xA9B4, 0x2511, 0xA9B5, 0x2512, 0xA9B6, 0x2513, 0xA9B7, 0x2514, 0xA9B8, 0x2515, 0xA9B9, 0x2516, 0xA9BA, + 0x2517, 0xA9BB, 0x2518, 0xA9BC, 0x2519, 0xA9BD, 0x251A, 0xA9BE, 0x251B, 0xA9BF, 0x251C, 0xA9C0, 0x251D, 0xA9C1, 0x251E, 0xA9C2, + 0x251F, 0xA9C3, 0x2520, 0xA9C4, 0x2521, 0xA9C5, 0x2522, 0xA9C6, 0x2523, 0xA9C7, 0x2524, 0xA9C8, 0x2525, 0xA9C9, 0x2526, 0xA9CA, + 0x2527, 0xA9CB, 0x2528, 0xA9CC, 0x2529, 0xA9CD, 0x252A, 0xA9CE, 0x252B, 0xA9CF, 0x252C, 0xA9D0, 0x252D, 0xA9D1, 0x252E, 0xA9D2, + 0x252F, 0xA9D3, 0x2530, 0xA9D4, 0x2531, 0xA9D5, 0x2532, 0xA9D6, 0x2533, 0xA9D7, 0x2534, 0xA9D8, 0x2535, 0xA9D9, 0x2536, 0xA9DA, + 0x2537, 0xA9DB, 0x2538, 0xA9DC, 0x2539, 0xA9DD, 0x253A, 0xA9DE, 0x253B, 0xA9DF, 0x253C, 0xA9E0, 0x253D, 0xA9E1, 0x253E, 0xA9E2, + 0x253F, 0xA9E3, 0x2540, 0xA9E4, 0x2541, 0xA9E5, 0x2542, 0xA9E6, 0x2543, 0xA9E7, 0x2544, 0xA9E8, 0x2545, 0xA9E9, 0x2546, 0xA9EA, + 0x2547, 0xA9EB, 0x2548, 0xA9EC, 0x2549, 0xA9ED, 0x254A, 0xA9EE, 0x254B, 0xA9EF, 0x2550, 0xA854, 0x2551, 0xA855, 0x2552, 0xA856, + 0x2553, 0xA857, 0x2554, 0xA858, 0x2555, 0xA859, 0x2556, 0xA85A, 0x2557, 0xA85B, 0x2558, 0xA85C, 0x2559, 0xA85D, 0x255A, 0xA85E, + 0x255B, 0xA85F, 0x255C, 0xA860, 0x255D, 0xA861, 0x255E, 0xA862, 0x255F, 0xA863, 0x2560, 0xA864, 0x2561, 0xA865, 0x2562, 0xA866, + 0x2563, 0xA867, 0x2564, 0xA868, 0x2565, 0xA869, 0x2566, 0xA86A, 0x2567, 0xA86B, 0x2568, 0xA86C, 0x2569, 0xA86D, 0x256A, 0xA86E, + 0x256B, 0xA86F, 0x256C, 0xA870, 0x256D, 0xA871, 0x256E, 0xA872, 0x256F, 0xA873, 0x2570, 0xA874, 0x2571, 0xA875, 0x2572, 0xA876, + 0x2573, 0xA877, 0x2581, 0xA878, 0x2582, 0xA879, 0x2583, 0xA87A, 0x2584, 0xA87B, 0x2585, 0xA87C, 0x2586, 0xA87D, 0x2587, 0xA87E, + 0x2588, 0xA880, 0x2589, 0xA881, 0x258A, 0xA882, 0x258B, 0xA883, 0x258C, 0xA884, 0x258D, 0xA885, 0x258E, 0xA886, 0x258F, 0xA887, + 0x2593, 0xA888, 0x2594, 0xA889, 0x2595, 0xA88A, 0x25A0, 0xA1F6, 0x25A1, 0xA1F5, 0x25B2, 0xA1F8, 0x25B3, 0xA1F7, 0x25BC, 0xA88B, + 0x25BD, 0xA88C, 0x25C6, 0xA1F4, 0x25C7, 0xA1F3, 0x25CB, 0xA1F0, 0x25CE, 0xA1F2, 0x25CF, 0xA1F1, 0x25E2, 0xA88D, 0x25E3, 0xA88E, + 0x25E4, 0xA88F, 0x25E5, 0xA890, 0x2605, 0xA1EF, 0x2606, 0xA1EE, 0x2609, 0xA891, 0x2640, 0xA1E2, 0x2642, 0xA1E1, 0x3000, 0xA1A1, + 0x3001, 0xA1A2, 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3005, 0xA1A9, 0x3006, 0xA965, 0x3007, 0xA996, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BE, 0x3011, 0xA1BF, + 0x3012, 0xA893, 0x3013, 0xA1FE, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3016, 0xA1BC, 0x3017, 0xA1BD, 0x301D, 0xA894, 0x301E, 0xA895, + 0x3021, 0xA940, 0x3022, 0xA941, 0x3023, 0xA942, 0x3024, 0xA943, 0x3025, 0xA944, 0x3026, 0xA945, 0x3027, 0xA946, 0x3028, 0xA947, + 0x3029, 0xA948, 0x3041, 0xA4A1, 0x3042, 0xA4A2, 0x3043, 0xA4A3, 0x3044, 0xA4A4, 0x3045, 0xA4A5, 0x3046, 0xA4A6, 0x3047, 0xA4A7, + 0x3048, 0xA4A8, 0x3049, 0xA4A9, 0x304A, 0xA4AA, 0x304B, 0xA4AB, 0x304C, 0xA4AC, 0x304D, 0xA4AD, 0x304E, 0xA4AE, 0x304F, 0xA4AF, + 0x3050, 0xA4B0, 0x3051, 0xA4B1, 0x3052, 0xA4B2, 0x3053, 0xA4B3, 0x3054, 0xA4B4, 0x3055, 0xA4B5, 0x3056, 0xA4B6, 0x3057, 0xA4B7, + 0x3058, 0xA4B8, 0x3059, 0xA4B9, 0x305A, 0xA4BA, 0x305B, 0xA4BB, 0x305C, 0xA4BC, 0x305D, 0xA4BD, 0x305E, 0xA4BE, 0x305F, 0xA4BF, + 0x3060, 0xA4C0, 0x3061, 0xA4C1, 0x3062, 0xA4C2, 0x3063, 0xA4C3, 0x3064, 0xA4C4, 0x3065, 0xA4C5, 0x3066, 0xA4C6, 0x3067, 0xA4C7, + 0x3068, 0xA4C8, 0x3069, 0xA4C9, 0x306A, 0xA4CA, 0x306B, 0xA4CB, 0x306C, 0xA4CC, 0x306D, 0xA4CD, 0x306E, 0xA4CE, 0x306F, 0xA4CF, + 0x3070, 0xA4D0, 0x3071, 0xA4D1, 0x3072, 0xA4D2, 0x3073, 0xA4D3, 0x3074, 0xA4D4, 0x3075, 0xA4D5, 0x3076, 0xA4D6, 0x3077, 0xA4D7, + 0x3078, 0xA4D8, 0x3079, 0xA4D9, 0x307A, 0xA4DA, 0x307B, 0xA4DB, 0x307C, 0xA4DC, 0x307D, 0xA4DD, 0x307E, 0xA4DE, 0x307F, 0xA4DF, + 0x3080, 0xA4E0, 0x3081, 0xA4E1, 0x3082, 0xA4E2, 0x3083, 0xA4E3, 0x3084, 0xA4E4, 0x3085, 0xA4E5, 0x3086, 0xA4E6, 0x3087, 0xA4E7, + 0x3088, 0xA4E8, 0x3089, 0xA4E9, 0x308A, 0xA4EA, 0x308B, 0xA4EB, 0x308C, 0xA4EC, 0x308D, 0xA4ED, 0x308E, 0xA4EE, 0x308F, 0xA4EF, + 0x3090, 0xA4F0, 0x3091, 0xA4F1, 0x3092, 0xA4F2, 0x3093, 0xA4F3, 0x309B, 0xA961, 0x309C, 0xA962, 0x309D, 0xA966, 0x309E, 0xA967, + 0x30A1, 0xA5A1, 0x30A2, 0xA5A2, 0x30A3, 0xA5A3, 0x30A4, 0xA5A4, 0x30A5, 0xA5A5, 0x30A6, 0xA5A6, 0x30A7, 0xA5A7, 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, 0x30AA, 0xA5AA, 0x30AB, 0xA5AB, 0x30AC, 0xA5AC, 0x30AD, 0xA5AD, 0x30AE, 0xA5AE, 0x30AF, 0xA5AF, 0x30B0, 0xA5B0, + 0x30B1, 0xA5B1, 0x30B2, 0xA5B2, 0x30B3, 0xA5B3, 0x30B4, 0xA5B4, 0x30B5, 0xA5B5, 0x30B6, 0xA5B6, 0x30B7, 0xA5B7, 0x30B8, 0xA5B8, + 0x30B9, 0xA5B9, 0x30BA, 0xA5BA, 0x30BB, 0xA5BB, 0x30BC, 0xA5BC, 0x30BD, 0xA5BD, 0x30BE, 0xA5BE, 0x30BF, 0xA5BF, 0x30C0, 0xA5C0, + 0x30C1, 0xA5C1, 0x30C2, 0xA5C2, 0x30C3, 0xA5C3, 0x30C4, 0xA5C4, 0x30C5, 0xA5C5, 0x30C6, 0xA5C6, 0x30C7, 0xA5C7, 0x30C8, 0xA5C8, + 0x30C9, 0xA5C9, 0x30CA, 0xA5CA, 0x30CB, 0xA5CB, 0x30CC, 0xA5CC, 0x30CD, 0xA5CD, 0x30CE, 0xA5CE, 0x30CF, 0xA5CF, 0x30D0, 0xA5D0, + 0x30D1, 0xA5D1, 0x30D2, 0xA5D2, 0x30D3, 0xA5D3, 0x30D4, 0xA5D4, 0x30D5, 0xA5D5, 0x30D6, 0xA5D6, 0x30D7, 0xA5D7, 0x30D8, 0xA5D8, + 0x30D9, 0xA5D9, 0x30DA, 0xA5DA, 0x30DB, 0xA5DB, 0x30DC, 0xA5DC, 0x30DD, 0xA5DD, 0x30DE, 0xA5DE, 0x30DF, 0xA5DF, 0x30E0, 0xA5E0, + 0x30E1, 0xA5E1, 0x30E2, 0xA5E2, 0x30E3, 0xA5E3, 0x30E4, 0xA5E4, 0x30E5, 0xA5E5, 0x30E6, 0xA5E6, 0x30E7, 0xA5E7, 0x30E8, 0xA5E8, + 0x30E9, 0xA5E9, 0x30EA, 0xA5EA, 0x30EB, 0xA5EB, 0x30EC, 0xA5EC, 0x30ED, 0xA5ED, 0x30EE, 0xA5EE, 0x30EF, 0xA5EF, 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, 0x30F2, 0xA5F2, 0x30F3, 0xA5F3, 0x30F4, 0xA5F4, 0x30F5, 0xA5F5, 0x30F6, 0xA5F6, 0x30FC, 0xA960, 0x30FD, 0xA963, + 0x30FE, 0xA964, 0x3105, 0xA8C5, 0x3106, 0xA8C6, 0x3107, 0xA8C7, 0x3108, 0xA8C8, 0x3109, 0xA8C9, 0x310A, 0xA8CA, 0x310B, 0xA8CB, + 0x310C, 0xA8CC, 0x310D, 0xA8CD, 0x310E, 0xA8CE, 0x310F, 0xA8CF, 0x3110, 0xA8D0, 0x3111, 0xA8D1, 0x3112, 0xA8D2, 0x3113, 0xA8D3, + 0x3114, 0xA8D4, 0x3115, 0xA8D5, 0x3116, 0xA8D6, 0x3117, 0xA8D7, 0x3118, 0xA8D8, 0x3119, 0xA8D9, 0x311A, 0xA8DA, 0x311B, 0xA8DB, + 0x311C, 0xA8DC, 0x311D, 0xA8DD, 0x311E, 0xA8DE, 0x311F, 0xA8DF, 0x3120, 0xA8E0, 0x3121, 0xA8E1, 0x3122, 0xA8E2, 0x3123, 0xA8E3, + 0x3124, 0xA8E4, 0x3125, 0xA8E5, 0x3126, 0xA8E6, 0x3127, 0xA8E7, 0x3128, 0xA8E8, 0x3129, 0xA8E9, 0x3220, 0xA2E5, 0x3221, 0xA2E6, + 0x3222, 0xA2E7, 0x3223, 0xA2E8, 0x3224, 0xA2E9, 0x3225, 0xA2EA, 0x3226, 0xA2EB, 0x3227, 0xA2EC, 0x3228, 0xA2ED, 0x3229, 0xA2EE, + 0x3231, 0xA95A, 0x32A3, 0xA949, 0x338E, 0xA94A, 0x338F, 0xA94B, 0x339C, 0xA94C, 0x339D, 0xA94D, 0x339E, 0xA94E, 0x33A1, 0xA94F, + 0x33C4, 0xA950, 0x33CE, 0xA951, 0x33D1, 0xA952, 0x33D2, 0xA953, 0x33D5, 0xA954, 0x4E00, 0xD2BB, 0x4E01, 0xB6A1, 0x4E02, 0x8140, + 0x4E03, 0xC6DF, 0x4E04, 0x8141, 0x4E05, 0x8142, 0x4E06, 0x8143, 0x4E07, 0xCDF2, 0x4E08, 0xD5C9, 0x4E09, 0xC8FD, 0x4E0A, 0xC9CF, + 0x4E0B, 0xCFC2, 0x4E0C, 0xD8A2, 0x4E0D, 0xB2BB, 0x4E0E, 0xD3EB, 0x4E0F, 0x8144, 0x4E10, 0xD8A4, 0x4E11, 0xB3F3, 0x4E12, 0x8145, + 0x4E13, 0xD7A8, 0x4E14, 0xC7D2, 0x4E15, 0xD8A7, 0x4E16, 0xCAC0, 0x4E17, 0x8146, 0x4E18, 0xC7F0, 0x4E19, 0xB1FB, 0x4E1A, 0xD2B5, + 0x4E1B, 0xB4D4, 0x4E1C, 0xB6AB, 0x4E1D, 0xCBBF, 0x4E1E, 0xD8A9, 0x4E1F, 0x8147, 0x4E20, 0x8148, 0x4E21, 0x8149, 0x4E22, 0xB6AA, + 0x4E23, 0x814A, 0x4E24, 0xC1BD, 0x4E25, 0xD1CF, 0x4E26, 0x814B, 0x4E27, 0xC9A5, 0x4E28, 0xD8AD, 0x4E29, 0x814C, 0x4E2A, 0xB8F6, + 0x4E2B, 0xD1BE, 0x4E2C, 0xE3DC, 0x4E2D, 0xD6D0, 0x4E2E, 0x814D, 0x4E2F, 0x814E, 0x4E30, 0xB7E1, 0x4E31, 0x814F, 0x4E32, 0xB4AE, + 0x4E33, 0x8150, 0x4E34, 0xC1D9, 0x4E35, 0x8151, 0x4E36, 0xD8BC, 0x4E37, 0x8152, 0x4E38, 0xCDE8, 0x4E39, 0xB5A4, 0x4E3A, 0xCEAA, + 0x4E3B, 0xD6F7, 0x4E3C, 0x8153, 0x4E3D, 0xC0F6, 0x4E3E, 0xBED9, 0x4E3F, 0xD8AF, 0x4E40, 0x8154, 0x4E41, 0x8155, 0x4E42, 0x8156, + 0x4E43, 0xC4CB, 0x4E44, 0x8157, 0x4E45, 0xBEC3, 0x4E46, 0x8158, 0x4E47, 0xD8B1, 0x4E48, 0xC3B4, 0x4E49, 0xD2E5, 0x4E4A, 0x8159, + 0x4E4B, 0xD6AE, 0x4E4C, 0xCEDA, 0x4E4D, 0xD5A7, 0x4E4E, 0xBAF5, 0x4E4F, 0xB7A6, 0x4E50, 0xC0D6, 0x4E51, 0x815A, 0x4E52, 0xC6B9, + 0x4E53, 0xC5D2, 0x4E54, 0xC7C7, 0x4E55, 0x815B, 0x4E56, 0xB9D4, 0x4E57, 0x815C, 0x4E58, 0xB3CB, 0x4E59, 0xD2D2, 0x4E5A, 0x815D, + 0x4E5B, 0x815E, 0x4E5C, 0xD8BF, 0x4E5D, 0xBEC5, 0x4E5E, 0xC6F2, 0x4E5F, 0xD2B2, 0x4E60, 0xCFB0, 0x4E61, 0xCFE7, 0x4E62, 0x815F, + 0x4E63, 0x8160, 0x4E64, 0x8161, 0x4E65, 0x8162, 0x4E66, 0xCAE9, 0x4E67, 0x8163, 0x4E68, 0x8164, 0x4E69, 0xD8C0, 0x4E6A, 0x8165, + 0x4E6B, 0x8166, 0x4E6C, 0x8167, 0x4E6D, 0x8168, 0x4E6E, 0x8169, 0x4E6F, 0x816A, 0x4E70, 0xC2F2, 0x4E71, 0xC2D2, 0x4E72, 0x816B, + 0x4E73, 0xC8E9, 0x4E74, 0x816C, 0x4E75, 0x816D, 0x4E76, 0x816E, 0x4E77, 0x816F, 0x4E78, 0x8170, 0x4E79, 0x8171, 0x4E7A, 0x8172, + 0x4E7B, 0x8173, 0x4E7C, 0x8174, 0x4E7D, 0x8175, 0x4E7E, 0xC7AC, 0x4E7F, 0x8176, 0x4E80, 0x8177, 0x4E81, 0x8178, 0x4E82, 0x8179, + 0x4E83, 0x817A, 0x4E84, 0x817B, 0x4E85, 0x817C, 0x4E86, 0xC1CB, 0x4E87, 0x817D, 0x4E88, 0xD3E8, 0x4E89, 0xD5F9, 0x4E8A, 0x817E, + 0x4E8B, 0xCAC2, 0x4E8C, 0xB6FE, 0x4E8D, 0xD8A1, 0x4E8E, 0xD3DA, 0x4E8F, 0xBFF7, 0x4E90, 0x8180, 0x4E91, 0xD4C6, 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, 0x4E94, 0xCEE5, 0x4E95, 0xBEAE, 0x4E96, 0x8181, 0x4E97, 0x8182, 0x4E98, 0xD8A8, 0x4E99, 0x8183, 0x4E9A, 0xD1C7, + 0x4E9B, 0xD0A9, 0x4E9C, 0x8184, 0x4E9D, 0x8185, 0x4E9E, 0x8186, 0x4E9F, 0xD8BD, 0x4EA0, 0xD9EF, 0x4EA1, 0xCDF6, 0x4EA2, 0xBFBA, + 0x4EA3, 0x8187, 0x4EA4, 0xBDBB, 0x4EA5, 0xBAA5, 0x4EA6, 0xD2E0, 0x4EA7, 0xB2FA, 0x4EA8, 0xBAE0, 0x4EA9, 0xC4B6, 0x4EAA, 0x8188, + 0x4EAB, 0xCFED, 0x4EAC, 0xBEA9, 0x4EAD, 0xCDA4, 0x4EAE, 0xC1C1, 0x4EAF, 0x8189, 0x4EB0, 0x818A, 0x4EB1, 0x818B, 0x4EB2, 0xC7D7, + 0x4EB3, 0xD9F1, 0x4EB4, 0x818C, 0x4EB5, 0xD9F4, 0x4EB6, 0x818D, 0x4EB7, 0x818E, 0x4EB8, 0x818F, 0x4EB9, 0x8190, 0x4EBA, 0xC8CB, + 0x4EBB, 0xD8E9, 0x4EBC, 0x8191, 0x4EBD, 0x8192, 0x4EBE, 0x8193, 0x4EBF, 0xD2DA, 0x4EC0, 0xCAB2, 0x4EC1, 0xC8CA, 0x4EC2, 0xD8EC, + 0x4EC3, 0xD8EA, 0x4EC4, 0xD8C6, 0x4EC5, 0xBDF6, 0x4EC6, 0xC6CD, 0x4EC7, 0xB3F0, 0x4EC8, 0x8194, 0x4EC9, 0xD8EB, 0x4ECA, 0xBDF1, + 0x4ECB, 0xBDE9, 0x4ECC, 0x8195, 0x4ECD, 0xC8D4, 0x4ECE, 0xB4D3, 0x4ECF, 0x8196, 0x4ED0, 0x8197, 0x4ED1, 0xC2D8, 0x4ED2, 0x8198, + 0x4ED3, 0xB2D6, 0x4ED4, 0xD7D0, 0x4ED5, 0xCACB, 0x4ED6, 0xCBFB, 0x4ED7, 0xD5CC, 0x4ED8, 0xB8B6, 0x4ED9, 0xCFC9, 0x4EDA, 0x8199, + 0x4EDB, 0x819A, 0x4EDC, 0x819B, 0x4EDD, 0xD9DA, 0x4EDE, 0xD8F0, 0x4EDF, 0xC7AA, 0x4EE0, 0x819C, 0x4EE1, 0xD8EE, 0x4EE2, 0x819D, + 0x4EE3, 0xB4FA, 0x4EE4, 0xC1EE, 0x4EE5, 0xD2D4, 0x4EE6, 0x819E, 0x4EE7, 0x819F, 0x4EE8, 0xD8ED, 0x4EE9, 0x81A0, 0x4EEA, 0xD2C7, + 0x4EEB, 0xD8EF, 0x4EEC, 0xC3C7, 0x4EED, 0x81A1, 0x4EEE, 0x81A2, 0x4EEF, 0x81A3, 0x4EF0, 0xD1F6, 0x4EF1, 0x81A4, 0x4EF2, 0xD6D9, + 0x4EF3, 0xD8F2, 0x4EF4, 0x81A5, 0x4EF5, 0xD8F5, 0x4EF6, 0xBCFE, 0x4EF7, 0xBCDB, 0x4EF8, 0x81A6, 0x4EF9, 0x81A7, 0x4EFA, 0x81A8, + 0x4EFB, 0xC8CE, 0x4EFC, 0x81A9, 0x4EFD, 0xB7DD, 0x4EFE, 0x81AA, 0x4EFF, 0xB7C2, 0x4F00, 0x81AB, 0x4F01, 0xC6F3, 0x4F02, 0x81AC, + 0x4F03, 0x81AD, 0x4F04, 0x81AE, 0x4F05, 0x81AF, 0x4F06, 0x81B0, 0x4F07, 0x81B1, 0x4F08, 0x81B2, 0x4F09, 0xD8F8, 0x4F0A, 0xD2C1, + 0x4F0B, 0x81B3, 0x4F0C, 0x81B4, 0x4F0D, 0xCEE9, 0x4F0E, 0xBCBF, 0x4F0F, 0xB7FC, 0x4F10, 0xB7A5, 0x4F11, 0xD0DD, 0x4F12, 0x81B5, + 0x4F13, 0x81B6, 0x4F14, 0x81B7, 0x4F15, 0x81B8, 0x4F16, 0x81B9, 0x4F17, 0xD6DA, 0x4F18, 0xD3C5, 0x4F19, 0xBBEF, 0x4F1A, 0xBBE1, + 0x4F1B, 0xD8F1, 0x4F1C, 0x81BA, 0x4F1D, 0x81BB, 0x4F1E, 0xC9A1, 0x4F1F, 0xCEB0, 0x4F20, 0xB4AB, 0x4F21, 0x81BC, 0x4F22, 0xD8F3, + 0x4F23, 0x81BD, 0x4F24, 0xC9CB, 0x4F25, 0xD8F6, 0x4F26, 0xC2D7, 0x4F27, 0xD8F7, 0x4F28, 0x81BE, 0x4F29, 0x81BF, 0x4F2A, 0xCEB1, + 0x4F2B, 0xD8F9, 0x4F2C, 0x81C0, 0x4F2D, 0x81C1, 0x4F2E, 0x81C2, 0x4F2F, 0xB2AE, 0x4F30, 0xB9C0, 0x4F31, 0x81C3, 0x4F32, 0xD9A3, + 0x4F33, 0x81C4, 0x4F34, 0xB0E9, 0x4F35, 0x81C5, 0x4F36, 0xC1E6, 0x4F37, 0x81C6, 0x4F38, 0xC9EC, 0x4F39, 0x81C7, 0x4F3A, 0xCBC5, + 0x4F3B, 0x81C8, 0x4F3C, 0xCBC6, 0x4F3D, 0xD9A4, 0x4F3E, 0x81C9, 0x4F3F, 0x81CA, 0x4F40, 0x81CB, 0x4F41, 0x81CC, 0x4F42, 0x81CD, + 0x4F43, 0xB5E8, 0x4F44, 0x81CE, 0x4F45, 0x81CF, 0x4F46, 0xB5AB, 0x4F47, 0x81D0, 0x4F48, 0x81D1, 0x4F49, 0x81D2, 0x4F4A, 0x81D3, + 0x4F4B, 0x81D4, 0x4F4C, 0x81D5, 0x4F4D, 0xCEBB, 0x4F4E, 0xB5CD, 0x4F4F, 0xD7A1, 0x4F50, 0xD7F4, 0x4F51, 0xD3D3, 0x4F52, 0x81D6, + 0x4F53, 0xCCE5, 0x4F54, 0x81D7, 0x4F55, 0xBACE, 0x4F56, 0x81D8, 0x4F57, 0xD9A2, 0x4F58, 0xD9DC, 0x4F59, 0xD3E0, 0x4F5A, 0xD8FD, + 0x4F5B, 0xB7F0, 0x4F5C, 0xD7F7, 0x4F5D, 0xD8FE, 0x4F5E, 0xD8FA, 0x4F5F, 0xD9A1, 0x4F60, 0xC4E3, 0x4F61, 0x81D9, 0x4F62, 0x81DA, + 0x4F63, 0xD3B6, 0x4F64, 0xD8F4, 0x4F65, 0xD9DD, 0x4F66, 0x81DB, 0x4F67, 0xD8FB, 0x4F68, 0x81DC, 0x4F69, 0xC5E5, 0x4F6A, 0x81DD, + 0x4F6B, 0x81DE, 0x4F6C, 0xC0D0, 0x4F6D, 0x81DF, 0x4F6E, 0x81E0, 0x4F6F, 0xD1F0, 0x4F70, 0xB0DB, 0x4F71, 0x81E1, 0x4F72, 0x81E2, + 0x4F73, 0xBCD1, 0x4F74, 0xD9A6, 0x4F75, 0x81E3, 0x4F76, 0xD9A5, 0x4F77, 0x81E4, 0x4F78, 0x81E5, 0x4F79, 0x81E6, 0x4F7A, 0x81E7, + 0x4F7B, 0xD9AC, 0x4F7C, 0xD9AE, 0x4F7D, 0x81E8, 0x4F7E, 0xD9AB, 0x4F7F, 0xCAB9, 0x4F80, 0x81E9, 0x4F81, 0x81EA, 0x4F82, 0x81EB, + 0x4F83, 0xD9A9, 0x4F84, 0xD6B6, 0x4F85, 0x81EC, 0x4F86, 0x81ED, 0x4F87, 0x81EE, 0x4F88, 0xB3DE, 0x4F89, 0xD9A8, 0x4F8A, 0x81EF, + 0x4F8B, 0xC0FD, 0x4F8C, 0x81F0, 0x4F8D, 0xCACC, 0x4F8E, 0x81F1, 0x4F8F, 0xD9AA, 0x4F90, 0x81F2, 0x4F91, 0xD9A7, 0x4F92, 0x81F3, + 0x4F93, 0x81F4, 0x4F94, 0xD9B0, 0x4F95, 0x81F5, 0x4F96, 0x81F6, 0x4F97, 0xB6B1, 0x4F98, 0x81F7, 0x4F99, 0x81F8, 0x4F9A, 0x81F9, + 0x4F9B, 0xB9A9, 0x4F9C, 0x81FA, 0x4F9D, 0xD2C0, 0x4F9E, 0x81FB, 0x4F9F, 0x81FC, 0x4FA0, 0xCFC0, 0x4FA1, 0x81FD, 0x4FA2, 0x81FE, + 0x4FA3, 0xC2C2, 0x4FA4, 0x8240, 0x4FA5, 0xBDC4, 0x4FA6, 0xD5EC, 0x4FA7, 0xB2E0, 0x4FA8, 0xC7C8, 0x4FA9, 0xBFEB, 0x4FAA, 0xD9AD, + 0x4FAB, 0x8241, 0x4FAC, 0xD9AF, 0x4FAD, 0x8242, 0x4FAE, 0xCEEA, 0x4FAF, 0xBAEE, 0x4FB0, 0x8243, 0x4FB1, 0x8244, 0x4FB2, 0x8245, + 0x4FB3, 0x8246, 0x4FB4, 0x8247, 0x4FB5, 0xC7D6, 0x4FB6, 0x8248, 0x4FB7, 0x8249, 0x4FB8, 0x824A, 0x4FB9, 0x824B, 0x4FBA, 0x824C, + 0x4FBB, 0x824D, 0x4FBC, 0x824E, 0x4FBD, 0x824F, 0x4FBE, 0x8250, 0x4FBF, 0xB1E3, 0x4FC0, 0x8251, 0x4FC1, 0x8252, 0x4FC2, 0x8253, + 0x4FC3, 0xB4D9, 0x4FC4, 0xB6ED, 0x4FC5, 0xD9B4, 0x4FC6, 0x8254, 0x4FC7, 0x8255, 0x4FC8, 0x8256, 0x4FC9, 0x8257, 0x4FCA, 0xBFA1, + 0x4FCB, 0x8258, 0x4FCC, 0x8259, 0x4FCD, 0x825A, 0x4FCE, 0xD9DE, 0x4FCF, 0xC7CE, 0x4FD0, 0xC0FE, 0x4FD1, 0xD9B8, 0x4FD2, 0x825B, + 0x4FD3, 0x825C, 0x4FD4, 0x825D, 0x4FD5, 0x825E, 0x4FD6, 0x825F, 0x4FD7, 0xCBD7, 0x4FD8, 0xB7FD, 0x4FD9, 0x8260, 0x4FDA, 0xD9B5, + 0x4FDB, 0x8261, 0x4FDC, 0xD9B7, 0x4FDD, 0xB1A3, 0x4FDE, 0xD3E1, 0x4FDF, 0xD9B9, 0x4FE0, 0x8262, 0x4FE1, 0xD0C5, 0x4FE2, 0x8263, + 0x4FE3, 0xD9B6, 0x4FE4, 0x8264, 0x4FE5, 0x8265, 0x4FE6, 0xD9B1, 0x4FE7, 0x8266, 0x4FE8, 0xD9B2, 0x4FE9, 0xC1A9, 0x4FEA, 0xD9B3, + 0x4FEB, 0x8267, 0x4FEC, 0x8268, 0x4FED, 0xBCF3, 0x4FEE, 0xD0DE, 0x4FEF, 0xB8A9, 0x4FF0, 0x8269, 0x4FF1, 0xBEE3, 0x4FF2, 0x826A, + 0x4FF3, 0xD9BD, 0x4FF4, 0x826B, 0x4FF5, 0x826C, 0x4FF6, 0x826D, 0x4FF7, 0x826E, 0x4FF8, 0xD9BA, 0x4FF9, 0x826F, 0x4FFA, 0xB0B3, + 0x4FFB, 0x8270, 0x4FFC, 0x8271, 0x4FFD, 0x8272, 0x4FFE, 0xD9C2, 0x4FFF, 0x8273, 0x5000, 0x8274, 0x5001, 0x8275, 0x5002, 0x8276, + 0x5003, 0x8277, 0x5004, 0x8278, 0x5005, 0x8279, 0x5006, 0x827A, 0x5007, 0x827B, 0x5008, 0x827C, 0x5009, 0x827D, 0x500A, 0x827E, + 0x500B, 0x8280, 0x500C, 0xD9C4, 0x500D, 0xB1B6, 0x500E, 0x8281, 0x500F, 0xD9BF, 0x5010, 0x8282, 0x5011, 0x8283, 0x5012, 0xB5B9, + 0x5013, 0x8284, 0x5014, 0xBEF3, 0x5015, 0x8285, 0x5016, 0x8286, 0x5017, 0x8287, 0x5018, 0xCCC8, 0x5019, 0xBAF2, 0x501A, 0xD2D0, + 0x501B, 0x8288, 0x501C, 0xD9C3, 0x501D, 0x8289, 0x501E, 0x828A, 0x501F, 0xBDE8, 0x5020, 0x828B, 0x5021, 0xB3AB, 0x5022, 0x828C, + 0x5023, 0x828D, 0x5024, 0x828E, 0x5025, 0xD9C5, 0x5026, 0xBEEB, 0x5027, 0x828F, 0x5028, 0xD9C6, 0x5029, 0xD9BB, 0x502A, 0xC4DF, + 0x502B, 0x8290, 0x502C, 0xD9BE, 0x502D, 0xD9C1, 0x502E, 0xD9C0, 0x502F, 0x8291, 0x5030, 0x8292, 0x5031, 0x8293, 0x5032, 0x8294, + 0x5033, 0x8295, 0x5034, 0x8296, 0x5035, 0x8297, 0x5036, 0x8298, 0x5037, 0x8299, 0x5038, 0x829A, 0x5039, 0x829B, 0x503A, 0xD5AE, + 0x503B, 0x829C, 0x503C, 0xD6B5, 0x503D, 0x829D, 0x503E, 0xC7E3, 0x503F, 0x829E, 0x5040, 0x829F, 0x5041, 0x82A0, 0x5042, 0x82A1, + 0x5043, 0xD9C8, 0x5044, 0x82A2, 0x5045, 0x82A3, 0x5046, 0x82A4, 0x5047, 0xBCD9, 0x5048, 0xD9CA, 0x5049, 0x82A5, 0x504A, 0x82A6, + 0x504B, 0x82A7, 0x504C, 0xD9BC, 0x504D, 0x82A8, 0x504E, 0xD9CB, 0x504F, 0xC6AB, 0x5050, 0x82A9, 0x5051, 0x82AA, 0x5052, 0x82AB, + 0x5053, 0x82AC, 0x5054, 0x82AD, 0x5055, 0xD9C9, 0x5056, 0x82AE, 0x5057, 0x82AF, 0x5058, 0x82B0, 0x5059, 0x82B1, 0x505A, 0xD7F6, + 0x505B, 0x82B2, 0x505C, 0xCDA3, 0x505D, 0x82B3, 0x505E, 0x82B4, 0x505F, 0x82B5, 0x5060, 0x82B6, 0x5061, 0x82B7, 0x5062, 0x82B8, + 0x5063, 0x82B9, 0x5064, 0x82BA, 0x5065, 0xBDA1, 0x5066, 0x82BB, 0x5067, 0x82BC, 0x5068, 0x82BD, 0x5069, 0x82BE, 0x506A, 0x82BF, + 0x506B, 0x82C0, 0x506C, 0xD9CC, 0x506D, 0x82C1, 0x506E, 0x82C2, 0x506F, 0x82C3, 0x5070, 0x82C4, 0x5071, 0x82C5, 0x5072, 0x82C6, + 0x5073, 0x82C7, 0x5074, 0x82C8, 0x5075, 0x82C9, 0x5076, 0xC5BC, 0x5077, 0xCDB5, 0x5078, 0x82CA, 0x5079, 0x82CB, 0x507A, 0x82CC, + 0x507B, 0xD9CD, 0x507C, 0x82CD, 0x507D, 0x82CE, 0x507E, 0xD9C7, 0x507F, 0xB3A5, 0x5080, 0xBFFE, 0x5081, 0x82CF, 0x5082, 0x82D0, + 0x5083, 0x82D1, 0x5084, 0x82D2, 0x5085, 0xB8B5, 0x5086, 0x82D3, 0x5087, 0x82D4, 0x5088, 0xC0FC, 0x5089, 0x82D5, 0x508A, 0x82D6, + 0x508B, 0x82D7, 0x508C, 0x82D8, 0x508D, 0xB0F8, 0x508E, 0x82D9, 0x508F, 0x82DA, 0x5090, 0x82DB, 0x5091, 0x82DC, 0x5092, 0x82DD, + 0x5093, 0x82DE, 0x5094, 0x82DF, 0x5095, 0x82E0, 0x5096, 0x82E1, 0x5097, 0x82E2, 0x5098, 0x82E3, 0x5099, 0x82E4, 0x509A, 0x82E5, + 0x509B, 0x82E6, 0x509C, 0x82E7, 0x509D, 0x82E8, 0x509E, 0x82E9, 0x509F, 0x82EA, 0x50A0, 0x82EB, 0x50A1, 0x82EC, 0x50A2, 0x82ED, + 0x50A3, 0xB4F6, 0x50A4, 0x82EE, 0x50A5, 0xD9CE, 0x50A6, 0x82EF, 0x50A7, 0xD9CF, 0x50A8, 0xB4A2, 0x50A9, 0xD9D0, 0x50AA, 0x82F0, + 0x50AB, 0x82F1, 0x50AC, 0xB4DF, 0x50AD, 0x82F2, 0x50AE, 0x82F3, 0x50AF, 0x82F4, 0x50B0, 0x82F5, 0x50B1, 0x82F6, 0x50B2, 0xB0C1, + 0x50B3, 0x82F7, 0x50B4, 0x82F8, 0x50B5, 0x82F9, 0x50B6, 0x82FA, 0x50B7, 0x82FB, 0x50B8, 0x82FC, 0x50B9, 0x82FD, 0x50BA, 0xD9D1, + 0x50BB, 0xC9B5, 0x50BC, 0x82FE, 0x50BD, 0x8340, 0x50BE, 0x8341, 0x50BF, 0x8342, 0x50C0, 0x8343, 0x50C1, 0x8344, 0x50C2, 0x8345, + 0x50C3, 0x8346, 0x50C4, 0x8347, 0x50C5, 0x8348, 0x50C6, 0x8349, 0x50C7, 0x834A, 0x50C8, 0x834B, 0x50C9, 0x834C, 0x50CA, 0x834D, + 0x50CB, 0x834E, 0x50CC, 0x834F, 0x50CD, 0x8350, 0x50CE, 0x8351, 0x50CF, 0xCFF1, 0x50D0, 0x8352, 0x50D1, 0x8353, 0x50D2, 0x8354, + 0x50D3, 0x8355, 0x50D4, 0x8356, 0x50D5, 0x8357, 0x50D6, 0xD9D2, 0x50D7, 0x8358, 0x50D8, 0x8359, 0x50D9, 0x835A, 0x50DA, 0xC1C5, + 0x50DB, 0x835B, 0x50DC, 0x835C, 0x50DD, 0x835D, 0x50DE, 0x835E, 0x50DF, 0x835F, 0x50E0, 0x8360, 0x50E1, 0x8361, 0x50E2, 0x8362, + 0x50E3, 0x8363, 0x50E4, 0x8364, 0x50E5, 0x8365, 0x50E6, 0xD9D6, 0x50E7, 0xC9AE, 0x50E8, 0x8366, 0x50E9, 0x8367, 0x50EA, 0x8368, + 0x50EB, 0x8369, 0x50EC, 0xD9D5, 0x50ED, 0xD9D4, 0x50EE, 0xD9D7, 0x50EF, 0x836A, 0x50F0, 0x836B, 0x50F1, 0x836C, 0x50F2, 0x836D, + 0x50F3, 0xCBDB, 0x50F4, 0x836E, 0x50F5, 0xBDA9, 0x50F6, 0x836F, 0x50F7, 0x8370, 0x50F8, 0x8371, 0x50F9, 0x8372, 0x50FA, 0x8373, + 0x50FB, 0xC6A7, 0x50FC, 0x8374, 0x50FD, 0x8375, 0x50FE, 0x8376, 0x50FF, 0x8377, 0x5100, 0x8378, 0x5101, 0x8379, 0x5102, 0x837A, + 0x5103, 0x837B, 0x5104, 0x837C, 0x5105, 0x837D, 0x5106, 0xD9D3, 0x5107, 0xD9D8, 0x5108, 0x837E, 0x5109, 0x8380, 0x510A, 0x8381, + 0x510B, 0xD9D9, 0x510C, 0x8382, 0x510D, 0x8383, 0x510E, 0x8384, 0x510F, 0x8385, 0x5110, 0x8386, 0x5111, 0x8387, 0x5112, 0xC8E5, + 0x5113, 0x8388, 0x5114, 0x8389, 0x5115, 0x838A, 0x5116, 0x838B, 0x5117, 0x838C, 0x5118, 0x838D, 0x5119, 0x838E, 0x511A, 0x838F, + 0x511B, 0x8390, 0x511C, 0x8391, 0x511D, 0x8392, 0x511E, 0x8393, 0x511F, 0x8394, 0x5120, 0x8395, 0x5121, 0xC0DC, 0x5122, 0x8396, + 0x5123, 0x8397, 0x5124, 0x8398, 0x5125, 0x8399, 0x5126, 0x839A, 0x5127, 0x839B, 0x5128, 0x839C, 0x5129, 0x839D, 0x512A, 0x839E, + 0x512B, 0x839F, 0x512C, 0x83A0, 0x512D, 0x83A1, 0x512E, 0x83A2, 0x512F, 0x83A3, 0x5130, 0x83A4, 0x5131, 0x83A5, 0x5132, 0x83A6, + 0x5133, 0x83A7, 0x5134, 0x83A8, 0x5135, 0x83A9, 0x5136, 0x83AA, 0x5137, 0x83AB, 0x5138, 0x83AC, 0x5139, 0x83AD, 0x513A, 0x83AE, + 0x513B, 0x83AF, 0x513C, 0x83B0, 0x513D, 0x83B1, 0x513E, 0x83B2, 0x513F, 0xB6F9, 0x5140, 0xD8A3, 0x5141, 0xD4CA, 0x5142, 0x83B3, + 0x5143, 0xD4AA, 0x5144, 0xD0D6, 0x5145, 0xB3E4, 0x5146, 0xD5D7, 0x5147, 0x83B4, 0x5148, 0xCFC8, 0x5149, 0xB9E2, 0x514A, 0x83B5, + 0x514B, 0xBFCB, 0x514C, 0x83B6, 0x514D, 0xC3E2, 0x514E, 0x83B7, 0x514F, 0x83B8, 0x5150, 0x83B9, 0x5151, 0xB6D2, 0x5152, 0x83BA, + 0x5153, 0x83BB, 0x5154, 0xCDC3, 0x5155, 0xD9EE, 0x5156, 0xD9F0, 0x5157, 0x83BC, 0x5158, 0x83BD, 0x5159, 0x83BE, 0x515A, 0xB5B3, + 0x515B, 0x83BF, 0x515C, 0xB6B5, 0x515D, 0x83C0, 0x515E, 0x83C1, 0x515F, 0x83C2, 0x5160, 0x83C3, 0x5161, 0x83C4, 0x5162, 0xBEA4, + 0x5163, 0x83C5, 0x5164, 0x83C6, 0x5165, 0xC8EB, 0x5166, 0x83C7, 0x5167, 0x83C8, 0x5168, 0xC8AB, 0x5169, 0x83C9, 0x516A, 0x83CA, + 0x516B, 0xB0CB, 0x516C, 0xB9AB, 0x516D, 0xC1F9, 0x516E, 0xD9E2, 0x516F, 0x83CB, 0x5170, 0xC0BC, 0x5171, 0xB9B2, 0x5172, 0x83CC, + 0x5173, 0xB9D8, 0x5174, 0xD0CB, 0x5175, 0xB1F8, 0x5176, 0xC6E4, 0x5177, 0xBEDF, 0x5178, 0xB5E4, 0x5179, 0xD7C8, 0x517A, 0x83CD, + 0x517B, 0xD1F8, 0x517C, 0xBCE6, 0x517D, 0xCADE, 0x517E, 0x83CE, 0x517F, 0x83CF, 0x5180, 0xBCBD, 0x5181, 0xD9E6, 0x5182, 0xD8E7, + 0x5183, 0x83D0, 0x5184, 0x83D1, 0x5185, 0xC4DA, 0x5186, 0x83D2, 0x5187, 0x83D3, 0x5188, 0xB8D4, 0x5189, 0xC8BD, 0x518A, 0x83D4, + 0x518B, 0x83D5, 0x518C, 0xB2E1, 0x518D, 0xD4D9, 0x518E, 0x83D6, 0x518F, 0x83D7, 0x5190, 0x83D8, 0x5191, 0x83D9, 0x5192, 0xC3B0, + 0x5193, 0x83DA, 0x5194, 0x83DB, 0x5195, 0xC3E1, 0x5196, 0xDAA2, 0x5197, 0xC8DF, 0x5198, 0x83DC, 0x5199, 0xD0B4, 0x519A, 0x83DD, + 0x519B, 0xBEFC, 0x519C, 0xC5A9, 0x519D, 0x83DE, 0x519E, 0x83DF, 0x519F, 0x83E0, 0x51A0, 0xB9DA, 0x51A1, 0x83E1, 0x51A2, 0xDAA3, + 0x51A3, 0x83E2, 0x51A4, 0xD4A9, 0x51A5, 0xDAA4, 0x51A6, 0x83E3, 0x51A7, 0x83E4, 0x51A8, 0x83E5, 0x51A9, 0x83E6, 0x51AA, 0x83E7, + 0x51AB, 0xD9FB, 0x51AC, 0xB6AC, 0x51AD, 0x83E8, 0x51AE, 0x83E9, 0x51AF, 0xB7EB, 0x51B0, 0xB1F9, 0x51B1, 0xD9FC, 0x51B2, 0xB3E5, + 0x51B3, 0xBEF6, 0x51B4, 0x83EA, 0x51B5, 0xBFF6, 0x51B6, 0xD2B1, 0x51B7, 0xC0E4, 0x51B8, 0x83EB, 0x51B9, 0x83EC, 0x51BA, 0x83ED, + 0x51BB, 0xB6B3, 0x51BC, 0xD9FE, 0x51BD, 0xD9FD, 0x51BE, 0x83EE, 0x51BF, 0x83EF, 0x51C0, 0xBEBB, 0x51C1, 0x83F0, 0x51C2, 0x83F1, + 0x51C3, 0x83F2, 0x51C4, 0xC6E0, 0x51C5, 0x83F3, 0x51C6, 0xD7BC, 0x51C7, 0xDAA1, 0x51C8, 0x83F4, 0x51C9, 0xC1B9, 0x51CA, 0x83F5, + 0x51CB, 0xB5F2, 0x51CC, 0xC1E8, 0x51CD, 0x83F6, 0x51CE, 0x83F7, 0x51CF, 0xBCF5, 0x51D0, 0x83F8, 0x51D1, 0xB4D5, 0x51D2, 0x83F9, + 0x51D3, 0x83FA, 0x51D4, 0x83FB, 0x51D5, 0x83FC, 0x51D6, 0x83FD, 0x51D7, 0x83FE, 0x51D8, 0x8440, 0x51D9, 0x8441, 0x51DA, 0x8442, + 0x51DB, 0xC1DD, 0x51DC, 0x8443, 0x51DD, 0xC4FD, 0x51DE, 0x8444, 0x51DF, 0x8445, 0x51E0, 0xBCB8, 0x51E1, 0xB7B2, 0x51E2, 0x8446, + 0x51E3, 0x8447, 0x51E4, 0xB7EF, 0x51E5, 0x8448, 0x51E6, 0x8449, 0x51E7, 0x844A, 0x51E8, 0x844B, 0x51E9, 0x844C, 0x51EA, 0x844D, + 0x51EB, 0xD9EC, 0x51EC, 0x844E, 0x51ED, 0xC6BE, 0x51EE, 0x844F, 0x51EF, 0xBFAD, 0x51F0, 0xBBCB, 0x51F1, 0x8450, 0x51F2, 0x8451, + 0x51F3, 0xB5CA, 0x51F4, 0x8452, 0x51F5, 0xDBC9, 0x51F6, 0xD0D7, 0x51F7, 0x8453, 0x51F8, 0xCDB9, 0x51F9, 0xB0BC, 0x51FA, 0xB3F6, + 0x51FB, 0xBBF7, 0x51FC, 0xDBCA, 0x51FD, 0xBAAF, 0x51FE, 0x8454, 0x51FF, 0xD4E4, 0x5200, 0xB5B6, 0x5201, 0xB5F3, 0x5202, 0xD8D6, + 0x5203, 0xC8D0, 0x5204, 0x8455, 0x5205, 0x8456, 0x5206, 0xB7D6, 0x5207, 0xC7D0, 0x5208, 0xD8D7, 0x5209, 0x8457, 0x520A, 0xBFAF, + 0x520B, 0x8458, 0x520C, 0x8459, 0x520D, 0xDBBB, 0x520E, 0xD8D8, 0x520F, 0x845A, 0x5210, 0x845B, 0x5211, 0xD0CC, 0x5212, 0xBBAE, + 0x5213, 0x845C, 0x5214, 0x845D, 0x5215, 0x845E, 0x5216, 0xEBBE, 0x5217, 0xC1D0, 0x5218, 0xC1F5, 0x5219, 0xD4F2, 0x521A, 0xB8D5, + 0x521B, 0xB4B4, 0x521C, 0x845F, 0x521D, 0xB3F5, 0x521E, 0x8460, 0x521F, 0x8461, 0x5220, 0xC9BE, 0x5221, 0x8462, 0x5222, 0x8463, + 0x5223, 0x8464, 0x5224, 0xC5D0, 0x5225, 0x8465, 0x5226, 0x8466, 0x5227, 0x8467, 0x5228, 0xC5D9, 0x5229, 0xC0FB, 0x522A, 0x8468, + 0x522B, 0xB1F0, 0x522C, 0x8469, 0x522D, 0xD8D9, 0x522E, 0xB9CE, 0x522F, 0x846A, 0x5230, 0xB5BD, 0x5231, 0x846B, 0x5232, 0x846C, + 0x5233, 0xD8DA, 0x5234, 0x846D, 0x5235, 0x846E, 0x5236, 0xD6C6, 0x5237, 0xCBA2, 0x5238, 0xC8AF, 0x5239, 0xC9B2, 0x523A, 0xB4CC, + 0x523B, 0xBFCC, 0x523C, 0x846F, 0x523D, 0xB9F4, 0x523E, 0x8470, 0x523F, 0xD8DB, 0x5240, 0xD8DC, 0x5241, 0xB6E7, 0x5242, 0xBCC1, + 0x5243, 0xCCEA, 0x5244, 0x8471, 0x5245, 0x8472, 0x5246, 0x8473, 0x5247, 0x8474, 0x5248, 0x8475, 0x5249, 0x8476, 0x524A, 0xCFF7, + 0x524B, 0x8477, 0x524C, 0xD8DD, 0x524D, 0xC7B0, 0x524E, 0x8478, 0x524F, 0x8479, 0x5250, 0xB9D0, 0x5251, 0xBDA3, 0x5252, 0x847A, + 0x5253, 0x847B, 0x5254, 0xCCDE, 0x5255, 0x847C, 0x5256, 0xC6CA, 0x5257, 0x847D, 0x5258, 0x847E, 0x5259, 0x8480, 0x525A, 0x8481, + 0x525B, 0x8482, 0x525C, 0xD8E0, 0x525D, 0x8483, 0x525E, 0xD8DE, 0x525F, 0x8484, 0x5260, 0x8485, 0x5261, 0xD8DF, 0x5262, 0x8486, + 0x5263, 0x8487, 0x5264, 0x8488, 0x5265, 0xB0FE, 0x5266, 0x8489, 0x5267, 0xBEE7, 0x5268, 0x848A, 0x5269, 0xCAA3, 0x526A, 0xBCF4, + 0x526B, 0x848B, 0x526C, 0x848C, 0x526D, 0x848D, 0x526E, 0x848E, 0x526F, 0xB8B1, 0x5270, 0x848F, 0x5271, 0x8490, 0x5272, 0xB8EE, + 0x5273, 0x8491, 0x5274, 0x8492, 0x5275, 0x8493, 0x5276, 0x8494, 0x5277, 0x8495, 0x5278, 0x8496, 0x5279, 0x8497, 0x527A, 0x8498, + 0x527B, 0x8499, 0x527C, 0x849A, 0x527D, 0xD8E2, 0x527E, 0x849B, 0x527F, 0xBDCB, 0x5280, 0x849C, 0x5281, 0xD8E4, 0x5282, 0xD8E3, + 0x5283, 0x849D, 0x5284, 0x849E, 0x5285, 0x849F, 0x5286, 0x84A0, 0x5287, 0x84A1, 0x5288, 0xC5FC, 0x5289, 0x84A2, 0x528A, 0x84A3, + 0x528B, 0x84A4, 0x528C, 0x84A5, 0x528D, 0x84A6, 0x528E, 0x84A7, 0x528F, 0x84A8, 0x5290, 0xD8E5, 0x5291, 0x84A9, 0x5292, 0x84AA, + 0x5293, 0xD8E6, 0x5294, 0x84AB, 0x5295, 0x84AC, 0x5296, 0x84AD, 0x5297, 0x84AE, 0x5298, 0x84AF, 0x5299, 0x84B0, 0x529A, 0x84B1, + 0x529B, 0xC1A6, 0x529C, 0x84B2, 0x529D, 0xC8B0, 0x529E, 0xB0EC, 0x529F, 0xB9A6, 0x52A0, 0xBCD3, 0x52A1, 0xCEF1, 0x52A2, 0xDBBD, + 0x52A3, 0xC1D3, 0x52A4, 0x84B3, 0x52A5, 0x84B4, 0x52A6, 0x84B5, 0x52A7, 0x84B6, 0x52A8, 0xB6AF, 0x52A9, 0xD6FA, 0x52AA, 0xC5AC, + 0x52AB, 0xBDD9, 0x52AC, 0xDBBE, 0x52AD, 0xDBBF, 0x52AE, 0x84B7, 0x52AF, 0x84B8, 0x52B0, 0x84B9, 0x52B1, 0xC0F8, 0x52B2, 0xBEA2, + 0x52B3, 0xC0CD, 0x52B4, 0x84BA, 0x52B5, 0x84BB, 0x52B6, 0x84BC, 0x52B7, 0x84BD, 0x52B8, 0x84BE, 0x52B9, 0x84BF, 0x52BA, 0x84C0, + 0x52BB, 0x84C1, 0x52BC, 0x84C2, 0x52BD, 0x84C3, 0x52BE, 0xDBC0, 0x52BF, 0xCAC6, 0x52C0, 0x84C4, 0x52C1, 0x84C5, 0x52C2, 0x84C6, + 0x52C3, 0xB2AA, 0x52C4, 0x84C7, 0x52C5, 0x84C8, 0x52C6, 0x84C9, 0x52C7, 0xD3C2, 0x52C8, 0x84CA, 0x52C9, 0xC3E3, 0x52CA, 0x84CB, + 0x52CB, 0xD1AB, 0x52CC, 0x84CC, 0x52CD, 0x84CD, 0x52CE, 0x84CE, 0x52CF, 0x84CF, 0x52D0, 0xDBC2, 0x52D1, 0x84D0, 0x52D2, 0xC0D5, + 0x52D3, 0x84D1, 0x52D4, 0x84D2, 0x52D5, 0x84D3, 0x52D6, 0xDBC3, 0x52D7, 0x84D4, 0x52D8, 0xBFB1, 0x52D9, 0x84D5, 0x52DA, 0x84D6, + 0x52DB, 0x84D7, 0x52DC, 0x84D8, 0x52DD, 0x84D9, 0x52DE, 0x84DA, 0x52DF, 0xC4BC, 0x52E0, 0x84DB, 0x52E1, 0x84DC, 0x52E2, 0x84DD, + 0x52E3, 0x84DE, 0x52E4, 0xC7DA, 0x52E5, 0x84DF, 0x52E6, 0x84E0, 0x52E7, 0x84E1, 0x52E8, 0x84E2, 0x52E9, 0x84E3, 0x52EA, 0x84E4, + 0x52EB, 0x84E5, 0x52EC, 0x84E6, 0x52ED, 0x84E7, 0x52EE, 0x84E8, 0x52EF, 0x84E9, 0x52F0, 0xDBC4, 0x52F1, 0x84EA, 0x52F2, 0x84EB, + 0x52F3, 0x84EC, 0x52F4, 0x84ED, 0x52F5, 0x84EE, 0x52F6, 0x84EF, 0x52F7, 0x84F0, 0x52F8, 0x84F1, 0x52F9, 0xD9E8, 0x52FA, 0xC9D7, + 0x52FB, 0x84F2, 0x52FC, 0x84F3, 0x52FD, 0x84F4, 0x52FE, 0xB9B4, 0x52FF, 0xCEF0, 0x5300, 0xD4C8, 0x5301, 0x84F5, 0x5302, 0x84F6, + 0x5303, 0x84F7, 0x5304, 0x84F8, 0x5305, 0xB0FC, 0x5306, 0xB4D2, 0x5307, 0x84F9, 0x5308, 0xD0D9, 0x5309, 0x84FA, 0x530A, 0x84FB, + 0x530B, 0x84FC, 0x530C, 0x84FD, 0x530D, 0xD9E9, 0x530E, 0x84FE, 0x530F, 0xDECB, 0x5310, 0xD9EB, 0x5311, 0x8540, 0x5312, 0x8541, + 0x5313, 0x8542, 0x5314, 0x8543, 0x5315, 0xD8B0, 0x5316, 0xBBAF, 0x5317, 0xB1B1, 0x5318, 0x8544, 0x5319, 0xB3D7, 0x531A, 0xD8CE, + 0x531B, 0x8545, 0x531C, 0x8546, 0x531D, 0xD4D1, 0x531E, 0x8547, 0x531F, 0x8548, 0x5320, 0xBDB3, 0x5321, 0xBFEF, 0x5322, 0x8549, + 0x5323, 0xCFBB, 0x5324, 0x854A, 0x5325, 0x854B, 0x5326, 0xD8D0, 0x5327, 0x854C, 0x5328, 0x854D, 0x5329, 0x854E, 0x532A, 0xB7CB, + 0x532B, 0x854F, 0x532C, 0x8550, 0x532D, 0x8551, 0x532E, 0xD8D1, 0x532F, 0x8552, 0x5330, 0x8553, 0x5331, 0x8554, 0x5332, 0x8555, + 0x5333, 0x8556, 0x5334, 0x8557, 0x5335, 0x8558, 0x5336, 0x8559, 0x5337, 0x855A, 0x5338, 0x855B, 0x5339, 0xC6A5, 0x533A, 0xC7F8, + 0x533B, 0xD2BD, 0x533C, 0x855C, 0x533D, 0x855D, 0x533E, 0xD8D2, 0x533F, 0xC4E4, 0x5340, 0x855E, 0x5341, 0xCAAE, 0x5342, 0x855F, + 0x5343, 0xC7A7, 0x5344, 0x8560, 0x5345, 0xD8A6, 0x5346, 0x8561, 0x5347, 0xC9FD, 0x5348, 0xCEE7, 0x5349, 0xBBDC, 0x534A, 0xB0EB, + 0x534B, 0x8562, 0x534C, 0x8563, 0x534D, 0x8564, 0x534E, 0xBBAA, 0x534F, 0xD0AD, 0x5350, 0x8565, 0x5351, 0xB1B0, 0x5352, 0xD7E4, + 0x5353, 0xD7BF, 0x5354, 0x8566, 0x5355, 0xB5A5, 0x5356, 0xC2F4, 0x5357, 0xC4CF, 0x5358, 0x8567, 0x5359, 0x8568, 0x535A, 0xB2A9, + 0x535B, 0x8569, 0x535C, 0xB2B7, 0x535D, 0x856A, 0x535E, 0xB1E5, 0x535F, 0xDFB2, 0x5360, 0xD5BC, 0x5361, 0xBFA8, 0x5362, 0xC2AC, + 0x5363, 0xD8D5, 0x5364, 0xC2B1, 0x5365, 0x856B, 0x5366, 0xD8D4, 0x5367, 0xCED4, 0x5368, 0x856C, 0x5369, 0xDAE0, 0x536A, 0x856D, + 0x536B, 0xCEC0, 0x536C, 0x856E, 0x536D, 0x856F, 0x536E, 0xD8B4, 0x536F, 0xC3AE, 0x5370, 0xD3A1, 0x5371, 0xCEA3, 0x5372, 0x8570, + 0x5373, 0xBCB4, 0x5374, 0xC8B4, 0x5375, 0xC2D1, 0x5376, 0x8571, 0x5377, 0xBEED, 0x5378, 0xD0B6, 0x5379, 0x8572, 0x537A, 0xDAE1, + 0x537B, 0x8573, 0x537C, 0x8574, 0x537D, 0x8575, 0x537E, 0x8576, 0x537F, 0xC7E4, 0x5380, 0x8577, 0x5381, 0x8578, 0x5382, 0xB3A7, + 0x5383, 0x8579, 0x5384, 0xB6F2, 0x5385, 0xCCFC, 0x5386, 0xC0FA, 0x5387, 0x857A, 0x5388, 0x857B, 0x5389, 0xC0F7, 0x538A, 0x857C, + 0x538B, 0xD1B9, 0x538C, 0xD1E1, 0x538D, 0xD8C7, 0x538E, 0x857D, 0x538F, 0x857E, 0x5390, 0x8580, 0x5391, 0x8581, 0x5392, 0x8582, + 0x5393, 0x8583, 0x5394, 0x8584, 0x5395, 0xB2DE, 0x5396, 0x8585, 0x5397, 0x8586, 0x5398, 0xC0E5, 0x5399, 0x8587, 0x539A, 0xBAF1, + 0x539B, 0x8588, 0x539C, 0x8589, 0x539D, 0xD8C8, 0x539E, 0x858A, 0x539F, 0xD4AD, 0x53A0, 0x858B, 0x53A1, 0x858C, 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, 0x53A4, 0x858D, 0x53A5, 0xD8CA, 0x53A6, 0xCFC3, 0x53A7, 0x858E, 0x53A8, 0xB3F8, 0x53A9, 0xBEC7, 0x53AA, 0x858F, + 0x53AB, 0x8590, 0x53AC, 0x8591, 0x53AD, 0x8592, 0x53AE, 0xD8CB, 0x53AF, 0x8593, 0x53B0, 0x8594, 0x53B1, 0x8595, 0x53B2, 0x8596, + 0x53B3, 0x8597, 0x53B4, 0x8598, 0x53B5, 0x8599, 0x53B6, 0xDBCC, 0x53B7, 0x859A, 0x53B8, 0x859B, 0x53B9, 0x859C, 0x53BA, 0x859D, + 0x53BB, 0xC8A5, 0x53BC, 0x859E, 0x53BD, 0x859F, 0x53BE, 0x85A0, 0x53BF, 0xCFD8, 0x53C0, 0x85A1, 0x53C1, 0xC8FE, 0x53C2, 0xB2CE, + 0x53C3, 0x85A2, 0x53C4, 0x85A3, 0x53C5, 0x85A4, 0x53C6, 0x85A5, 0x53C7, 0x85A6, 0x53C8, 0xD3D6, 0x53C9, 0xB2E6, 0x53CA, 0xBCB0, + 0x53CB, 0xD3D1, 0x53CC, 0xCBAB, 0x53CD, 0xB7B4, 0x53CE, 0x85A7, 0x53CF, 0x85A8, 0x53D0, 0x85A9, 0x53D1, 0xB7A2, 0x53D2, 0x85AA, + 0x53D3, 0x85AB, 0x53D4, 0xCAE5, 0x53D5, 0x85AC, 0x53D6, 0xC8A1, 0x53D7, 0xCADC, 0x53D8, 0xB1E4, 0x53D9, 0xD0F0, 0x53DA, 0x85AD, + 0x53DB, 0xC5D1, 0x53DC, 0x85AE, 0x53DD, 0x85AF, 0x53DE, 0x85B0, 0x53DF, 0xDBC5, 0x53E0, 0xB5FE, 0x53E1, 0x85B1, 0x53E2, 0x85B2, + 0x53E3, 0xBFDA, 0x53E4, 0xB9C5, 0x53E5, 0xBEE4, 0x53E6, 0xC1ED, 0x53E7, 0x85B3, 0x53E8, 0xDFB6, 0x53E9, 0xDFB5, 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, 0x53EC, 0xD5D9, 0x53ED, 0xB0C8, 0x53EE, 0xB6A3, 0x53EF, 0xBFC9, 0x53F0, 0xCCA8, 0x53F1, 0xDFB3, 0x53F2, 0xCAB7, + 0x53F3, 0xD3D2, 0x53F4, 0x85B4, 0x53F5, 0xD8CF, 0x53F6, 0xD2B6, 0x53F7, 0xBAC5, 0x53F8, 0xCBBE, 0x53F9, 0xCCBE, 0x53FA, 0x85B5, + 0x53FB, 0xDFB7, 0x53FC, 0xB5F0, 0x53FD, 0xDFB4, 0x53FE, 0x85B6, 0x53FF, 0x85B7, 0x5400, 0x85B8, 0x5401, 0xD3F5, 0x5402, 0x85B9, + 0x5403, 0xB3D4, 0x5404, 0xB8F7, 0x5405, 0x85BA, 0x5406, 0xDFBA, 0x5407, 0x85BB, 0x5408, 0xBACF, 0x5409, 0xBCAA, 0x540A, 0xB5F5, + 0x540B, 0x85BC, 0x540C, 0xCDAC, 0x540D, 0xC3FB, 0x540E, 0xBAF3, 0x540F, 0xC0F4, 0x5410, 0xCDC2, 0x5411, 0xCFF2, 0x5412, 0xDFB8, + 0x5413, 0xCFC5, 0x5414, 0x85BD, 0x5415, 0xC2C0, 0x5416, 0xDFB9, 0x5417, 0xC2F0, 0x5418, 0x85BE, 0x5419, 0x85BF, 0x541A, 0x85C0, + 0x541B, 0xBEFD, 0x541C, 0x85C1, 0x541D, 0xC1DF, 0x541E, 0xCDCC, 0x541F, 0xD2F7, 0x5420, 0xB7CD, 0x5421, 0xDFC1, 0x5422, 0x85C2, + 0x5423, 0xDFC4, 0x5424, 0x85C3, 0x5425, 0x85C4, 0x5426, 0xB7F1, 0x5427, 0xB0C9, 0x5428, 0xB6D6, 0x5429, 0xB7D4, 0x542A, 0x85C5, + 0x542B, 0xBAAC, 0x542C, 0xCCFD, 0x542D, 0xBFD4, 0x542E, 0xCBB1, 0x542F, 0xC6F4, 0x5430, 0x85C6, 0x5431, 0xD6A8, 0x5432, 0xDFC5, + 0x5433, 0x85C7, 0x5434, 0xCEE2, 0x5435, 0xB3B3, 0x5436, 0x85C8, 0x5437, 0x85C9, 0x5438, 0xCEFC, 0x5439, 0xB4B5, 0x543A, 0x85CA, + 0x543B, 0xCEC7, 0x543C, 0xBAF0, 0x543D, 0x85CB, 0x543E, 0xCEE1, 0x543F, 0x85CC, 0x5440, 0xD1BD, 0x5441, 0x85CD, 0x5442, 0x85CE, + 0x5443, 0xDFC0, 0x5444, 0x85CF, 0x5445, 0x85D0, 0x5446, 0xB4F4, 0x5447, 0x85D1, 0x5448, 0xB3CA, 0x5449, 0x85D2, 0x544A, 0xB8E6, + 0x544B, 0xDFBB, 0x544C, 0x85D3, 0x544D, 0x85D4, 0x544E, 0x85D5, 0x544F, 0x85D6, 0x5450, 0xC4C5, 0x5451, 0x85D7, 0x5452, 0xDFBC, + 0x5453, 0xDFBD, 0x5454, 0xDFBE, 0x5455, 0xC5BB, 0x5456, 0xDFBF, 0x5457, 0xDFC2, 0x5458, 0xD4B1, 0x5459, 0xDFC3, 0x545A, 0x85D8, + 0x545B, 0xC7BA, 0x545C, 0xCED8, 0x545D, 0x85D9, 0x545E, 0x85DA, 0x545F, 0x85DB, 0x5460, 0x85DC, 0x5461, 0x85DD, 0x5462, 0xC4D8, + 0x5463, 0x85DE, 0x5464, 0xDFCA, 0x5465, 0x85DF, 0x5466, 0xDFCF, 0x5467, 0x85E0, 0x5468, 0xD6DC, 0x5469, 0x85E1, 0x546A, 0x85E2, + 0x546B, 0x85E3, 0x546C, 0x85E4, 0x546D, 0x85E5, 0x546E, 0x85E6, 0x546F, 0x85E7, 0x5470, 0x85E8, 0x5471, 0xDFC9, 0x5472, 0xDFDA, + 0x5473, 0xCEB6, 0x5474, 0x85E9, 0x5475, 0xBAC7, 0x5476, 0xDFCE, 0x5477, 0xDFC8, 0x5478, 0xC5DE, 0x5479, 0x85EA, 0x547A, 0x85EB, + 0x547B, 0xC9EB, 0x547C, 0xBAF4, 0x547D, 0xC3FC, 0x547E, 0x85EC, 0x547F, 0x85ED, 0x5480, 0xBED7, 0x5481, 0x85EE, 0x5482, 0xDFC6, + 0x5483, 0x85EF, 0x5484, 0xDFCD, 0x5485, 0x85F0, 0x5486, 0xC5D8, 0x5487, 0x85F1, 0x5488, 0x85F2, 0x5489, 0x85F3, 0x548A, 0x85F4, + 0x548B, 0xD5A6, 0x548C, 0xBACD, 0x548D, 0x85F5, 0x548E, 0xBECC, 0x548F, 0xD3BD, 0x5490, 0xB8C0, 0x5491, 0x85F6, 0x5492, 0xD6E4, + 0x5493, 0x85F7, 0x5494, 0xDFC7, 0x5495, 0xB9BE, 0x5496, 0xBFA7, 0x5497, 0x85F8, 0x5498, 0x85F9, 0x5499, 0xC1FC, 0x549A, 0xDFCB, + 0x549B, 0xDFCC, 0x549C, 0x85FA, 0x549D, 0xDFD0, 0x549E, 0x85FB, 0x549F, 0x85FC, 0x54A0, 0x85FD, 0x54A1, 0x85FE, 0x54A2, 0x8640, + 0x54A3, 0xDFDB, 0x54A4, 0xDFE5, 0x54A5, 0x8641, 0x54A6, 0xDFD7, 0x54A7, 0xDFD6, 0x54A8, 0xD7C9, 0x54A9, 0xDFE3, 0x54AA, 0xDFE4, + 0x54AB, 0xE5EB, 0x54AC, 0xD2A7, 0x54AD, 0xDFD2, 0x54AE, 0x8642, 0x54AF, 0xBFA9, 0x54B0, 0x8643, 0x54B1, 0xD4DB, 0x54B2, 0x8644, + 0x54B3, 0xBFC8, 0x54B4, 0xDFD4, 0x54B5, 0x8645, 0x54B6, 0x8646, 0x54B7, 0x8647, 0x54B8, 0xCFCC, 0x54B9, 0x8648, 0x54BA, 0x8649, + 0x54BB, 0xDFDD, 0x54BC, 0x864A, 0x54BD, 0xD1CA, 0x54BE, 0x864B, 0x54BF, 0xDFDE, 0x54C0, 0xB0A7, 0x54C1, 0xC6B7, 0x54C2, 0xDFD3, + 0x54C3, 0x864C, 0x54C4, 0xBAE5, 0x54C5, 0x864D, 0x54C6, 0xB6DF, 0x54C7, 0xCDDB, 0x54C8, 0xB9FE, 0x54C9, 0xD4D5, 0x54CA, 0x864E, + 0x54CB, 0x864F, 0x54CC, 0xDFDF, 0x54CD, 0xCFEC, 0x54CE, 0xB0A5, 0x54CF, 0xDFE7, 0x54D0, 0xDFD1, 0x54D1, 0xD1C6, 0x54D2, 0xDFD5, + 0x54D3, 0xDFD8, 0x54D4, 0xDFD9, 0x54D5, 0xDFDC, 0x54D6, 0x8650, 0x54D7, 0xBBA9, 0x54D8, 0x8651, 0x54D9, 0xDFE0, 0x54DA, 0xDFE1, + 0x54DB, 0x8652, 0x54DC, 0xDFE2, 0x54DD, 0xDFE6, 0x54DE, 0xDFE8, 0x54DF, 0xD3B4, 0x54E0, 0x8653, 0x54E1, 0x8654, 0x54E2, 0x8655, + 0x54E3, 0x8656, 0x54E4, 0x8657, 0x54E5, 0xB8E7, 0x54E6, 0xC5B6, 0x54E7, 0xDFEA, 0x54E8, 0xC9DA, 0x54E9, 0xC1A8, 0x54EA, 0xC4C4, + 0x54EB, 0x8658, 0x54EC, 0x8659, 0x54ED, 0xBFDE, 0x54EE, 0xCFF8, 0x54EF, 0x865A, 0x54F0, 0x865B, 0x54F1, 0x865C, 0x54F2, 0xD5DC, + 0x54F3, 0xDFEE, 0x54F4, 0x865D, 0x54F5, 0x865E, 0x54F6, 0x865F, 0x54F7, 0x8660, 0x54F8, 0x8661, 0x54F9, 0x8662, 0x54FA, 0xB2B8, + 0x54FB, 0x8663, 0x54FC, 0xBADF, 0x54FD, 0xDFEC, 0x54FE, 0x8664, 0x54FF, 0xDBC1, 0x5500, 0x8665, 0x5501, 0xD1E4, 0x5502, 0x8666, + 0x5503, 0x8667, 0x5504, 0x8668, 0x5505, 0x8669, 0x5506, 0xCBF4, 0x5507, 0xB4BD, 0x5508, 0x866A, 0x5509, 0xB0A6, 0x550A, 0x866B, + 0x550B, 0x866C, 0x550C, 0x866D, 0x550D, 0x866E, 0x550E, 0x866F, 0x550F, 0xDFF1, 0x5510, 0xCCC6, 0x5511, 0xDFF2, 0x5512, 0x8670, + 0x5513, 0x8671, 0x5514, 0xDFED, 0x5515, 0x8672, 0x5516, 0x8673, 0x5517, 0x8674, 0x5518, 0x8675, 0x5519, 0x8676, 0x551A, 0x8677, + 0x551B, 0xDFE9, 0x551C, 0x8678, 0x551D, 0x8679, 0x551E, 0x867A, 0x551F, 0x867B, 0x5520, 0xDFEB, 0x5521, 0x867C, 0x5522, 0xDFEF, + 0x5523, 0xDFF0, 0x5524, 0xBBBD, 0x5525, 0x867D, 0x5526, 0x867E, 0x5527, 0xDFF3, 0x5528, 0x8680, 0x5529, 0x8681, 0x552A, 0xDFF4, + 0x552B, 0x8682, 0x552C, 0xBBA3, 0x552D, 0x8683, 0x552E, 0xCADB, 0x552F, 0xCEA8, 0x5530, 0xE0A7, 0x5531, 0xB3AA, 0x5532, 0x8684, + 0x5533, 0xE0A6, 0x5534, 0x8685, 0x5535, 0x8686, 0x5536, 0x8687, 0x5537, 0xE0A1, 0x5538, 0x8688, 0x5539, 0x8689, 0x553A, 0x868A, + 0x553B, 0x868B, 0x553C, 0xDFFE, 0x553D, 0x868C, 0x553E, 0xCDD9, 0x553F, 0xDFFC, 0x5540, 0x868D, 0x5541, 0xDFFA, 0x5542, 0x868E, + 0x5543, 0xBFD0, 0x5544, 0xD7C4, 0x5545, 0x868F, 0x5546, 0xC9CC, 0x5547, 0x8690, 0x5548, 0x8691, 0x5549, 0xDFF8, 0x554A, 0xB0A1, + 0x554B, 0x8692, 0x554C, 0x8693, 0x554D, 0x8694, 0x554E, 0x8695, 0x554F, 0x8696, 0x5550, 0xDFFD, 0x5551, 0x8697, 0x5552, 0x8698, + 0x5553, 0x8699, 0x5554, 0x869A, 0x5555, 0xDFFB, 0x5556, 0xE0A2, 0x5557, 0x869B, 0x5558, 0x869C, 0x5559, 0x869D, 0x555A, 0x869E, + 0x555B, 0x869F, 0x555C, 0xE0A8, 0x555D, 0x86A0, 0x555E, 0x86A1, 0x555F, 0x86A2, 0x5560, 0x86A3, 0x5561, 0xB7C8, 0x5562, 0x86A4, + 0x5563, 0x86A5, 0x5564, 0xC6A1, 0x5565, 0xC9B6, 0x5566, 0xC0B2, 0x5567, 0xDFF5, 0x5568, 0x86A6, 0x5569, 0x86A7, 0x556A, 0xC5BE, + 0x556B, 0x86A8, 0x556C, 0xD8C4, 0x556D, 0xDFF9, 0x556E, 0xC4F6, 0x556F, 0x86A9, 0x5570, 0x86AA, 0x5571, 0x86AB, 0x5572, 0x86AC, + 0x5573, 0x86AD, 0x5574, 0x86AE, 0x5575, 0xE0A3, 0x5576, 0xE0A4, 0x5577, 0xE0A5, 0x5578, 0xD0A5, 0x5579, 0x86AF, 0x557A, 0x86B0, + 0x557B, 0xE0B4, 0x557C, 0xCCE4, 0x557D, 0x86B1, 0x557E, 0xE0B1, 0x557F, 0x86B2, 0x5580, 0xBFA6, 0x5581, 0xE0AF, 0x5582, 0xCEB9, + 0x5583, 0xE0AB, 0x5584, 0xC9C6, 0x5585, 0x86B3, 0x5586, 0x86B4, 0x5587, 0xC0AE, 0x5588, 0xE0AE, 0x5589, 0xBAED, 0x558A, 0xBAB0, + 0x558B, 0xE0A9, 0x558C, 0x86B5, 0x558D, 0x86B6, 0x558E, 0x86B7, 0x558F, 0xDFF6, 0x5590, 0x86B8, 0x5591, 0xE0B3, 0x5592, 0x86B9, + 0x5593, 0x86BA, 0x5594, 0xE0B8, 0x5595, 0x86BB, 0x5596, 0x86BC, 0x5597, 0x86BD, 0x5598, 0xB4AD, 0x5599, 0xE0B9, 0x559A, 0x86BE, + 0x559B, 0x86BF, 0x559C, 0xCFB2, 0x559D, 0xBAC8, 0x559E, 0x86C0, 0x559F, 0xE0B0, 0x55A0, 0x86C1, 0x55A1, 0x86C2, 0x55A2, 0x86C3, + 0x55A3, 0x86C4, 0x55A4, 0x86C5, 0x55A5, 0x86C6, 0x55A6, 0x86C7, 0x55A7, 0xD0FA, 0x55A8, 0x86C8, 0x55A9, 0x86C9, 0x55AA, 0x86CA, + 0x55AB, 0x86CB, 0x55AC, 0x86CC, 0x55AD, 0x86CD, 0x55AE, 0x86CE, 0x55AF, 0x86CF, 0x55B0, 0x86D0, 0x55B1, 0xE0AC, 0x55B2, 0x86D1, + 0x55B3, 0xD4FB, 0x55B4, 0x86D2, 0x55B5, 0xDFF7, 0x55B6, 0x86D3, 0x55B7, 0xC5E7, 0x55B8, 0x86D4, 0x55B9, 0xE0AD, 0x55BA, 0x86D5, + 0x55BB, 0xD3F7, 0x55BC, 0x86D6, 0x55BD, 0xE0B6, 0x55BE, 0xE0B7, 0x55BF, 0x86D7, 0x55C0, 0x86D8, 0x55C1, 0x86D9, 0x55C2, 0x86DA, + 0x55C3, 0x86DB, 0x55C4, 0xE0C4, 0x55C5, 0xD0E1, 0x55C6, 0x86DC, 0x55C7, 0x86DD, 0x55C8, 0x86DE, 0x55C9, 0xE0BC, 0x55CA, 0x86DF, + 0x55CB, 0x86E0, 0x55CC, 0xE0C9, 0x55CD, 0xE0CA, 0x55CE, 0x86E1, 0x55CF, 0x86E2, 0x55D0, 0x86E3, 0x55D1, 0xE0BE, 0x55D2, 0xE0AA, + 0x55D3, 0xC9A4, 0x55D4, 0xE0C1, 0x55D5, 0x86E4, 0x55D6, 0xE0B2, 0x55D7, 0x86E5, 0x55D8, 0x86E6, 0x55D9, 0x86E7, 0x55DA, 0x86E8, + 0x55DB, 0x86E9, 0x55DC, 0xCAC8, 0x55DD, 0xE0C3, 0x55DE, 0x86EA, 0x55DF, 0xE0B5, 0x55E0, 0x86EB, 0x55E1, 0xCECB, 0x55E2, 0x86EC, + 0x55E3, 0xCBC3, 0x55E4, 0xE0CD, 0x55E5, 0xE0C6, 0x55E6, 0xE0C2, 0x55E7, 0x86ED, 0x55E8, 0xE0CB, 0x55E9, 0x86EE, 0x55EA, 0xE0BA, + 0x55EB, 0xE0BF, 0x55EC, 0xE0C0, 0x55ED, 0x86EF, 0x55EE, 0x86F0, 0x55EF, 0xE0C5, 0x55F0, 0x86F1, 0x55F1, 0x86F2, 0x55F2, 0xE0C7, + 0x55F3, 0xE0C8, 0x55F4, 0x86F3, 0x55F5, 0xE0CC, 0x55F6, 0x86F4, 0x55F7, 0xE0BB, 0x55F8, 0x86F5, 0x55F9, 0x86F6, 0x55FA, 0x86F7, + 0x55FB, 0x86F8, 0x55FC, 0x86F9, 0x55FD, 0xCBD4, 0x55FE, 0xE0D5, 0x55FF, 0x86FA, 0x5600, 0xE0D6, 0x5601, 0xE0D2, 0x5602, 0x86FB, + 0x5603, 0x86FC, 0x5604, 0x86FD, 0x5605, 0x86FE, 0x5606, 0x8740, 0x5607, 0x8741, 0x5608, 0xE0D0, 0x5609, 0xBCCE, 0x560A, 0x8742, + 0x560B, 0x8743, 0x560C, 0xE0D1, 0x560D, 0x8744, 0x560E, 0xB8C2, 0x560F, 0xD8C5, 0x5610, 0x8745, 0x5611, 0x8746, 0x5612, 0x8747, + 0x5613, 0x8748, 0x5614, 0x8749, 0x5615, 0x874A, 0x5616, 0x874B, 0x5617, 0x874C, 0x5618, 0xD0EA, 0x5619, 0x874D, 0x561A, 0x874E, + 0x561B, 0xC2EF, 0x561C, 0x874F, 0x561D, 0x8750, 0x561E, 0xE0CF, 0x561F, 0xE0BD, 0x5620, 0x8751, 0x5621, 0x8752, 0x5622, 0x8753, + 0x5623, 0xE0D4, 0x5624, 0xE0D3, 0x5625, 0x8754, 0x5626, 0x8755, 0x5627, 0xE0D7, 0x5628, 0x8756, 0x5629, 0x8757, 0x562A, 0x8758, + 0x562B, 0x8759, 0x562C, 0xE0DC, 0x562D, 0xE0D8, 0x562E, 0x875A, 0x562F, 0x875B, 0x5630, 0x875C, 0x5631, 0xD6F6, 0x5632, 0xB3B0, + 0x5633, 0x875D, 0x5634, 0xD7EC, 0x5635, 0x875E, 0x5636, 0xCBBB, 0x5637, 0x875F, 0x5638, 0x8760, 0x5639, 0xE0DA, 0x563A, 0x8761, + 0x563B, 0xCEFB, 0x563C, 0x8762, 0x563D, 0x8763, 0x563E, 0x8764, 0x563F, 0xBAD9, 0x5640, 0x8765, 0x5641, 0x8766, 0x5642, 0x8767, + 0x5643, 0x8768, 0x5644, 0x8769, 0x5645, 0x876A, 0x5646, 0x876B, 0x5647, 0x876C, 0x5648, 0x876D, 0x5649, 0x876E, 0x564A, 0x876F, + 0x564B, 0x8770, 0x564C, 0xE0E1, 0x564D, 0xE0DD, 0x564E, 0xD2AD, 0x564F, 0x8771, 0x5650, 0x8772, 0x5651, 0x8773, 0x5652, 0x8774, + 0x5653, 0x8775, 0x5654, 0xE0E2, 0x5655, 0x8776, 0x5656, 0x8777, 0x5657, 0xE0DB, 0x5658, 0xE0D9, 0x5659, 0xE0DF, 0x565A, 0x8778, + 0x565B, 0x8779, 0x565C, 0xE0E0, 0x565D, 0x877A, 0x565E, 0x877B, 0x565F, 0x877C, 0x5660, 0x877D, 0x5661, 0x877E, 0x5662, 0xE0DE, + 0x5663, 0x8780, 0x5664, 0xE0E4, 0x5665, 0x8781, 0x5666, 0x8782, 0x5667, 0x8783, 0x5668, 0xC6F7, 0x5669, 0xD8AC, 0x566A, 0xD4EB, + 0x566B, 0xE0E6, 0x566C, 0xCAC9, 0x566D, 0x8784, 0x566E, 0x8785, 0x566F, 0x8786, 0x5670, 0x8787, 0x5671, 0xE0E5, 0x5672, 0x8788, + 0x5673, 0x8789, 0x5674, 0x878A, 0x5675, 0x878B, 0x5676, 0xB8C1, 0x5677, 0x878C, 0x5678, 0x878D, 0x5679, 0x878E, 0x567A, 0x878F, + 0x567B, 0xE0E7, 0x567C, 0xE0E8, 0x567D, 0x8790, 0x567E, 0x8791, 0x567F, 0x8792, 0x5680, 0x8793, 0x5681, 0x8794, 0x5682, 0x8795, + 0x5683, 0x8796, 0x5684, 0x8797, 0x5685, 0xE0E9, 0x5686, 0xE0E3, 0x5687, 0x8798, 0x5688, 0x8799, 0x5689, 0x879A, 0x568A, 0x879B, + 0x568B, 0x879C, 0x568C, 0x879D, 0x568D, 0x879E, 0x568E, 0xBABF, 0x568F, 0xCCE7, 0x5690, 0x879F, 0x5691, 0x87A0, 0x5692, 0x87A1, + 0x5693, 0xE0EA, 0x5694, 0x87A2, 0x5695, 0x87A3, 0x5696, 0x87A4, 0x5697, 0x87A5, 0x5698, 0x87A6, 0x5699, 0x87A7, 0x569A, 0x87A8, + 0x569B, 0x87A9, 0x569C, 0x87AA, 0x569D, 0x87AB, 0x569E, 0x87AC, 0x569F, 0x87AD, 0x56A0, 0x87AE, 0x56A1, 0x87AF, 0x56A2, 0x87B0, + 0x56A3, 0xCFF9, 0x56A4, 0x87B1, 0x56A5, 0x87B2, 0x56A6, 0x87B3, 0x56A7, 0x87B4, 0x56A8, 0x87B5, 0x56A9, 0x87B6, 0x56AA, 0x87B7, + 0x56AB, 0x87B8, 0x56AC, 0x87B9, 0x56AD, 0x87BA, 0x56AE, 0x87BB, 0x56AF, 0xE0EB, 0x56B0, 0x87BC, 0x56B1, 0x87BD, 0x56B2, 0x87BE, + 0x56B3, 0x87BF, 0x56B4, 0x87C0, 0x56B5, 0x87C1, 0x56B6, 0x87C2, 0x56B7, 0xC8C2, 0x56B8, 0x87C3, 0x56B9, 0x87C4, 0x56BA, 0x87C5, + 0x56BB, 0x87C6, 0x56BC, 0xBDC0, 0x56BD, 0x87C7, 0x56BE, 0x87C8, 0x56BF, 0x87C9, 0x56C0, 0x87CA, 0x56C1, 0x87CB, 0x56C2, 0x87CC, + 0x56C3, 0x87CD, 0x56C4, 0x87CE, 0x56C5, 0x87CF, 0x56C6, 0x87D0, 0x56C7, 0x87D1, 0x56C8, 0x87D2, 0x56C9, 0x87D3, 0x56CA, 0xC4D2, + 0x56CB, 0x87D4, 0x56CC, 0x87D5, 0x56CD, 0x87D6, 0x56CE, 0x87D7, 0x56CF, 0x87D8, 0x56D0, 0x87D9, 0x56D1, 0x87DA, 0x56D2, 0x87DB, + 0x56D3, 0x87DC, 0x56D4, 0xE0EC, 0x56D5, 0x87DD, 0x56D6, 0x87DE, 0x56D7, 0xE0ED, 0x56D8, 0x87DF, 0x56D9, 0x87E0, 0x56DA, 0xC7F4, + 0x56DB, 0xCBC4, 0x56DC, 0x87E1, 0x56DD, 0xE0EE, 0x56DE, 0xBBD8, 0x56DF, 0xD8B6, 0x56E0, 0xD2F2, 0x56E1, 0xE0EF, 0x56E2, 0xCDC5, + 0x56E3, 0x87E2, 0x56E4, 0xB6DA, 0x56E5, 0x87E3, 0x56E6, 0x87E4, 0x56E7, 0x87E5, 0x56E8, 0x87E6, 0x56E9, 0x87E7, 0x56EA, 0x87E8, + 0x56EB, 0xE0F1, 0x56EC, 0x87E9, 0x56ED, 0xD4B0, 0x56EE, 0x87EA, 0x56EF, 0x87EB, 0x56F0, 0xC0A7, 0x56F1, 0xB4D1, 0x56F2, 0x87EC, + 0x56F3, 0x87ED, 0x56F4, 0xCEA7, 0x56F5, 0xE0F0, 0x56F6, 0x87EE, 0x56F7, 0x87EF, 0x56F8, 0x87F0, 0x56F9, 0xE0F2, 0x56FA, 0xB9CC, + 0x56FB, 0x87F1, 0x56FC, 0x87F2, 0x56FD, 0xB9FA, 0x56FE, 0xCDBC, 0x56FF, 0xE0F3, 0x5700, 0x87F3, 0x5701, 0x87F4, 0x5702, 0x87F5, + 0x5703, 0xC6D4, 0x5704, 0xE0F4, 0x5705, 0x87F6, 0x5706, 0xD4B2, 0x5707, 0x87F7, 0x5708, 0xC8A6, 0x5709, 0xE0F6, 0x570A, 0xE0F5, + 0x570B, 0x87F8, 0x570C, 0x87F9, 0x570D, 0x87FA, 0x570E, 0x87FB, 0x570F, 0x87FC, 0x5710, 0x87FD, 0x5711, 0x87FE, 0x5712, 0x8840, + 0x5713, 0x8841, 0x5714, 0x8842, 0x5715, 0x8843, 0x5716, 0x8844, 0x5717, 0x8845, 0x5718, 0x8846, 0x5719, 0x8847, 0x571A, 0x8848, + 0x571B, 0x8849, 0x571C, 0xE0F7, 0x571D, 0x884A, 0x571E, 0x884B, 0x571F, 0xCDC1, 0x5720, 0x884C, 0x5721, 0x884D, 0x5722, 0x884E, + 0x5723, 0xCAA5, 0x5724, 0x884F, 0x5725, 0x8850, 0x5726, 0x8851, 0x5727, 0x8852, 0x5728, 0xD4DA, 0x5729, 0xDBD7, 0x572A, 0xDBD9, + 0x572B, 0x8853, 0x572C, 0xDBD8, 0x572D, 0xB9E7, 0x572E, 0xDBDC, 0x572F, 0xDBDD, 0x5730, 0xB5D8, 0x5731, 0x8854, 0x5732, 0x8855, + 0x5733, 0xDBDA, 0x5734, 0x8856, 0x5735, 0x8857, 0x5736, 0x8858, 0x5737, 0x8859, 0x5738, 0x885A, 0x5739, 0xDBDB, 0x573A, 0xB3A1, + 0x573B, 0xDBDF, 0x573C, 0x885B, 0x573D, 0x885C, 0x573E, 0xBBF8, 0x573F, 0x885D, 0x5740, 0xD6B7, 0x5741, 0x885E, 0x5742, 0xDBE0, + 0x5743, 0x885F, 0x5744, 0x8860, 0x5745, 0x8861, 0x5746, 0x8862, 0x5747, 0xBEF9, 0x5748, 0x8863, 0x5749, 0x8864, 0x574A, 0xB7BB, + 0x574B, 0x8865, 0x574C, 0xDBD0, 0x574D, 0xCCAE, 0x574E, 0xBFB2, 0x574F, 0xBBB5, 0x5750, 0xD7F8, 0x5751, 0xBFD3, 0x5752, 0x8866, + 0x5753, 0x8867, 0x5754, 0x8868, 0x5755, 0x8869, 0x5756, 0x886A, 0x5757, 0xBFE9, 0x5758, 0x886B, 0x5759, 0x886C, 0x575A, 0xBCE1, + 0x575B, 0xCCB3, 0x575C, 0xDBDE, 0x575D, 0xB0D3, 0x575E, 0xCEEB, 0x575F, 0xB7D8, 0x5760, 0xD7B9, 0x5761, 0xC6C2, 0x5762, 0x886D, + 0x5763, 0x886E, 0x5764, 0xC0A4, 0x5765, 0x886F, 0x5766, 0xCCB9, 0x5767, 0x8870, 0x5768, 0xDBE7, 0x5769, 0xDBE1, 0x576A, 0xC6BA, + 0x576B, 0xDBE3, 0x576C, 0x8871, 0x576D, 0xDBE8, 0x576E, 0x8872, 0x576F, 0xC5F7, 0x5770, 0x8873, 0x5771, 0x8874, 0x5772, 0x8875, + 0x5773, 0xDBEA, 0x5774, 0x8876, 0x5775, 0x8877, 0x5776, 0xDBE9, 0x5777, 0xBFC0, 0x5778, 0x8878, 0x5779, 0x8879, 0x577A, 0x887A, + 0x577B, 0xDBE6, 0x577C, 0xDBE5, 0x577D, 0x887B, 0x577E, 0x887C, 0x577F, 0x887D, 0x5780, 0x887E, 0x5781, 0x8880, 0x5782, 0xB4B9, + 0x5783, 0xC0AC, 0x5784, 0xC2A2, 0x5785, 0xDBE2, 0x5786, 0xDBE4, 0x5787, 0x8881, 0x5788, 0x8882, 0x5789, 0x8883, 0x578A, 0x8884, + 0x578B, 0xD0CD, 0x578C, 0xDBED, 0x578D, 0x8885, 0x578E, 0x8886, 0x578F, 0x8887, 0x5790, 0x8888, 0x5791, 0x8889, 0x5792, 0xC0DD, + 0x5793, 0xDBF2, 0x5794, 0x888A, 0x5795, 0x888B, 0x5796, 0x888C, 0x5797, 0x888D, 0x5798, 0x888E, 0x5799, 0x888F, 0x579A, 0x8890, + 0x579B, 0xB6E2, 0x579C, 0x8891, 0x579D, 0x8892, 0x579E, 0x8893, 0x579F, 0x8894, 0x57A0, 0xDBF3, 0x57A1, 0xDBD2, 0x57A2, 0xB9B8, + 0x57A3, 0xD4AB, 0x57A4, 0xDBEC, 0x57A5, 0x8895, 0x57A6, 0xBFD1, 0x57A7, 0xDBF0, 0x57A8, 0x8896, 0x57A9, 0xDBD1, 0x57AA, 0x8897, + 0x57AB, 0xB5E6, 0x57AC, 0x8898, 0x57AD, 0xDBEB, 0x57AE, 0xBFE5, 0x57AF, 0x8899, 0x57B0, 0x889A, 0x57B1, 0x889B, 0x57B2, 0xDBEE, + 0x57B3, 0x889C, 0x57B4, 0xDBF1, 0x57B5, 0x889D, 0x57B6, 0x889E, 0x57B7, 0x889F, 0x57B8, 0xDBF9, 0x57B9, 0x88A0, 0x57BA, 0x88A1, + 0x57BB, 0x88A2, 0x57BC, 0x88A3, 0x57BD, 0x88A4, 0x57BE, 0x88A5, 0x57BF, 0x88A6, 0x57C0, 0x88A7, 0x57C1, 0x88A8, 0x57C2, 0xB9A1, + 0x57C3, 0xB0A3, 0x57C4, 0x88A9, 0x57C5, 0x88AA, 0x57C6, 0x88AB, 0x57C7, 0x88AC, 0x57C8, 0x88AD, 0x57C9, 0x88AE, 0x57CA, 0x88AF, + 0x57CB, 0xC2F1, 0x57CC, 0x88B0, 0x57CD, 0x88B1, 0x57CE, 0xB3C7, 0x57CF, 0xDBEF, 0x57D0, 0x88B2, 0x57D1, 0x88B3, 0x57D2, 0xDBF8, + 0x57D3, 0x88B4, 0x57D4, 0xC6D2, 0x57D5, 0xDBF4, 0x57D6, 0x88B5, 0x57D7, 0x88B6, 0x57D8, 0xDBF5, 0x57D9, 0xDBF7, 0x57DA, 0xDBF6, + 0x57DB, 0x88B7, 0x57DC, 0x88B8, 0x57DD, 0xDBFE, 0x57DE, 0x88B9, 0x57DF, 0xD3F2, 0x57E0, 0xB2BA, 0x57E1, 0x88BA, 0x57E2, 0x88BB, + 0x57E3, 0x88BC, 0x57E4, 0xDBFD, 0x57E5, 0x88BD, 0x57E6, 0x88BE, 0x57E7, 0x88BF, 0x57E8, 0x88C0, 0x57E9, 0x88C1, 0x57EA, 0x88C2, + 0x57EB, 0x88C3, 0x57EC, 0x88C4, 0x57ED, 0xDCA4, 0x57EE, 0x88C5, 0x57EF, 0xDBFB, 0x57F0, 0x88C6, 0x57F1, 0x88C7, 0x57F2, 0x88C8, + 0x57F3, 0x88C9, 0x57F4, 0xDBFA, 0x57F5, 0x88CA, 0x57F6, 0x88CB, 0x57F7, 0x88CC, 0x57F8, 0xDBFC, 0x57F9, 0xC5E0, 0x57FA, 0xBBF9, + 0x57FB, 0x88CD, 0x57FC, 0x88CE, 0x57FD, 0xDCA3, 0x57FE, 0x88CF, 0x57FF, 0x88D0, 0x5800, 0xDCA5, 0x5801, 0x88D1, 0x5802, 0xCCC3, + 0x5803, 0x88D2, 0x5804, 0x88D3, 0x5805, 0x88D4, 0x5806, 0xB6D1, 0x5807, 0xDDC0, 0x5808, 0x88D5, 0x5809, 0x88D6, 0x580A, 0x88D7, + 0x580B, 0xDCA1, 0x580C, 0x88D8, 0x580D, 0xDCA2, 0x580E, 0x88D9, 0x580F, 0x88DA, 0x5810, 0x88DB, 0x5811, 0xC7B5, 0x5812, 0x88DC, + 0x5813, 0x88DD, 0x5814, 0x88DE, 0x5815, 0xB6E9, 0x5816, 0x88DF, 0x5817, 0x88E0, 0x5818, 0x88E1, 0x5819, 0xDCA7, 0x581A, 0x88E2, + 0x581B, 0x88E3, 0x581C, 0x88E4, 0x581D, 0x88E5, 0x581E, 0xDCA6, 0x581F, 0x88E6, 0x5820, 0xDCA9, 0x5821, 0xB1A4, 0x5822, 0x88E7, + 0x5823, 0x88E8, 0x5824, 0xB5CC, 0x5825, 0x88E9, 0x5826, 0x88EA, 0x5827, 0x88EB, 0x5828, 0x88EC, 0x5829, 0x88ED, 0x582A, 0xBFB0, + 0x582B, 0x88EE, 0x582C, 0x88EF, 0x582D, 0x88F0, 0x582E, 0x88F1, 0x582F, 0x88F2, 0x5830, 0xD1DF, 0x5831, 0x88F3, 0x5832, 0x88F4, + 0x5833, 0x88F5, 0x5834, 0x88F6, 0x5835, 0xB6C2, 0x5836, 0x88F7, 0x5837, 0x88F8, 0x5838, 0x88F9, 0x5839, 0x88FA, 0x583A, 0x88FB, + 0x583B, 0x88FC, 0x583C, 0x88FD, 0x583D, 0x88FE, 0x583E, 0x8940, 0x583F, 0x8941, 0x5840, 0x8942, 0x5841, 0x8943, 0x5842, 0x8944, + 0x5843, 0x8945, 0x5844, 0xDCA8, 0x5845, 0x8946, 0x5846, 0x8947, 0x5847, 0x8948, 0x5848, 0x8949, 0x5849, 0x894A, 0x584A, 0x894B, + 0x584B, 0x894C, 0x584C, 0xCBFA, 0x584D, 0xEBF3, 0x584E, 0x894D, 0x584F, 0x894E, 0x5850, 0x894F, 0x5851, 0xCBDC, 0x5852, 0x8950, + 0x5853, 0x8951, 0x5854, 0xCBFE, 0x5855, 0x8952, 0x5856, 0x8953, 0x5857, 0x8954, 0x5858, 0xCCC1, 0x5859, 0x8955, 0x585A, 0x8956, + 0x585B, 0x8957, 0x585C, 0x8958, 0x585D, 0x8959, 0x585E, 0xC8FB, 0x585F, 0x895A, 0x5860, 0x895B, 0x5861, 0x895C, 0x5862, 0x895D, + 0x5863, 0x895E, 0x5864, 0x895F, 0x5865, 0xDCAA, 0x5866, 0x8960, 0x5867, 0x8961, 0x5868, 0x8962, 0x5869, 0x8963, 0x586A, 0x8964, + 0x586B, 0xCCEE, 0x586C, 0xDCAB, 0x586D, 0x8965, 0x586E, 0x8966, 0x586F, 0x8967, 0x5870, 0x8968, 0x5871, 0x8969, 0x5872, 0x896A, + 0x5873, 0x896B, 0x5874, 0x896C, 0x5875, 0x896D, 0x5876, 0x896E, 0x5877, 0x896F, 0x5878, 0x8970, 0x5879, 0x8971, 0x587A, 0x8972, + 0x587B, 0x8973, 0x587C, 0x8974, 0x587D, 0x8975, 0x587E, 0xDBD3, 0x587F, 0x8976, 0x5880, 0xDCAF, 0x5881, 0xDCAC, 0x5882, 0x8977, + 0x5883, 0xBEB3, 0x5884, 0x8978, 0x5885, 0xCAFB, 0x5886, 0x8979, 0x5887, 0x897A, 0x5888, 0x897B, 0x5889, 0xDCAD, 0x588A, 0x897C, + 0x588B, 0x897D, 0x588C, 0x897E, 0x588D, 0x8980, 0x588E, 0x8981, 0x588F, 0x8982, 0x5890, 0x8983, 0x5891, 0x8984, 0x5892, 0xC9CA, + 0x5893, 0xC4B9, 0x5894, 0x8985, 0x5895, 0x8986, 0x5896, 0x8987, 0x5897, 0x8988, 0x5898, 0x8989, 0x5899, 0xC7BD, 0x589A, 0xDCAE, + 0x589B, 0x898A, 0x589C, 0x898B, 0x589D, 0x898C, 0x589E, 0xD4F6, 0x589F, 0xD0E6, 0x58A0, 0x898D, 0x58A1, 0x898E, 0x58A2, 0x898F, + 0x58A3, 0x8990, 0x58A4, 0x8991, 0x58A5, 0x8992, 0x58A6, 0x8993, 0x58A7, 0x8994, 0x58A8, 0xC4AB, 0x58A9, 0xB6D5, 0x58AA, 0x8995, + 0x58AB, 0x8996, 0x58AC, 0x8997, 0x58AD, 0x8998, 0x58AE, 0x8999, 0x58AF, 0x899A, 0x58B0, 0x899B, 0x58B1, 0x899C, 0x58B2, 0x899D, + 0x58B3, 0x899E, 0x58B4, 0x899F, 0x58B5, 0x89A0, 0x58B6, 0x89A1, 0x58B7, 0x89A2, 0x58B8, 0x89A3, 0x58B9, 0x89A4, 0x58BA, 0x89A5, + 0x58BB, 0x89A6, 0x58BC, 0xDBD4, 0x58BD, 0x89A7, 0x58BE, 0x89A8, 0x58BF, 0x89A9, 0x58C0, 0x89AA, 0x58C1, 0xB1DA, 0x58C2, 0x89AB, + 0x58C3, 0x89AC, 0x58C4, 0x89AD, 0x58C5, 0xDBD5, 0x58C6, 0x89AE, 0x58C7, 0x89AF, 0x58C8, 0x89B0, 0x58C9, 0x89B1, 0x58CA, 0x89B2, + 0x58CB, 0x89B3, 0x58CC, 0x89B4, 0x58CD, 0x89B5, 0x58CE, 0x89B6, 0x58CF, 0x89B7, 0x58D0, 0x89B8, 0x58D1, 0xDBD6, 0x58D2, 0x89B9, + 0x58D3, 0x89BA, 0x58D4, 0x89BB, 0x58D5, 0xBABE, 0x58D6, 0x89BC, 0x58D7, 0x89BD, 0x58D8, 0x89BE, 0x58D9, 0x89BF, 0x58DA, 0x89C0, + 0x58DB, 0x89C1, 0x58DC, 0x89C2, 0x58DD, 0x89C3, 0x58DE, 0x89C4, 0x58DF, 0x89C5, 0x58E0, 0x89C6, 0x58E1, 0x89C7, 0x58E2, 0x89C8, + 0x58E3, 0x89C9, 0x58E4, 0xC8C0, 0x58E5, 0x89CA, 0x58E6, 0x89CB, 0x58E7, 0x89CC, 0x58E8, 0x89CD, 0x58E9, 0x89CE, 0x58EA, 0x89CF, + 0x58EB, 0xCABF, 0x58EC, 0xC8C9, 0x58ED, 0x89D0, 0x58EE, 0xD7B3, 0x58EF, 0x89D1, 0x58F0, 0xC9F9, 0x58F1, 0x89D2, 0x58F2, 0x89D3, + 0x58F3, 0xBFC7, 0x58F4, 0x89D4, 0x58F5, 0x89D5, 0x58F6, 0xBAF8, 0x58F7, 0x89D6, 0x58F8, 0x89D7, 0x58F9, 0xD2BC, 0x58FA, 0x89D8, + 0x58FB, 0x89D9, 0x58FC, 0x89DA, 0x58FD, 0x89DB, 0x58FE, 0x89DC, 0x58FF, 0x89DD, 0x5900, 0x89DE, 0x5901, 0x89DF, 0x5902, 0xE2BA, + 0x5903, 0x89E0, 0x5904, 0xB4A6, 0x5905, 0x89E1, 0x5906, 0x89E2, 0x5907, 0xB1B8, 0x5908, 0x89E3, 0x5909, 0x89E4, 0x590A, 0x89E5, + 0x590B, 0x89E6, 0x590C, 0x89E7, 0x590D, 0xB8B4, 0x590E, 0x89E8, 0x590F, 0xCFC4, 0x5910, 0x89E9, 0x5911, 0x89EA, 0x5912, 0x89EB, + 0x5913, 0x89EC, 0x5914, 0xD9E7, 0x5915, 0xCFA6, 0x5916, 0xCDE2, 0x5917, 0x89ED, 0x5918, 0x89EE, 0x5919, 0xD9ED, 0x591A, 0xB6E0, + 0x591B, 0x89EF, 0x591C, 0xD2B9, 0x591D, 0x89F0, 0x591E, 0x89F1, 0x591F, 0xB9BB, 0x5920, 0x89F2, 0x5921, 0x89F3, 0x5922, 0x89F4, + 0x5923, 0x89F5, 0x5924, 0xE2B9, 0x5925, 0xE2B7, 0x5926, 0x89F6, 0x5927, 0xB4F3, 0x5928, 0x89F7, 0x5929, 0xCCEC, 0x592A, 0xCCAB, + 0x592B, 0xB7F2, 0x592C, 0x89F8, 0x592D, 0xD8B2, 0x592E, 0xD1EB, 0x592F, 0xBABB, 0x5930, 0x89F9, 0x5931, 0xCAA7, 0x5932, 0x89FA, + 0x5933, 0x89FB, 0x5934, 0xCDB7, 0x5935, 0x89FC, 0x5936, 0x89FD, 0x5937, 0xD2C4, 0x5938, 0xBFE4, 0x5939, 0xBCD0, 0x593A, 0xB6E1, + 0x593B, 0x89FE, 0x593C, 0xDEC5, 0x593D, 0x8A40, 0x593E, 0x8A41, 0x593F, 0x8A42, 0x5940, 0x8A43, 0x5941, 0xDEC6, 0x5942, 0xDBBC, + 0x5943, 0x8A44, 0x5944, 0xD1D9, 0x5945, 0x8A45, 0x5946, 0x8A46, 0x5947, 0xC6E6, 0x5948, 0xC4CE, 0x5949, 0xB7EE, 0x594A, 0x8A47, + 0x594B, 0xB7DC, 0x594C, 0x8A48, 0x594D, 0x8A49, 0x594E, 0xBFFC, 0x594F, 0xD7E0, 0x5950, 0x8A4A, 0x5951, 0xC6F5, 0x5952, 0x8A4B, + 0x5953, 0x8A4C, 0x5954, 0xB1BC, 0x5955, 0xDEC8, 0x5956, 0xBDB1, 0x5957, 0xCCD7, 0x5958, 0xDECA, 0x5959, 0x8A4D, 0x595A, 0xDEC9, + 0x595B, 0x8A4E, 0x595C, 0x8A4F, 0x595D, 0x8A50, 0x595E, 0x8A51, 0x595F, 0x8A52, 0x5960, 0xB5EC, 0x5961, 0x8A53, 0x5962, 0xC9DD, + 0x5963, 0x8A54, 0x5964, 0x8A55, 0x5965, 0xB0C2, 0x5966, 0x8A56, 0x5967, 0x8A57, 0x5968, 0x8A58, 0x5969, 0x8A59, 0x596A, 0x8A5A, + 0x596B, 0x8A5B, 0x596C, 0x8A5C, 0x596D, 0x8A5D, 0x596E, 0x8A5E, 0x596F, 0x8A5F, 0x5970, 0x8A60, 0x5971, 0x8A61, 0x5972, 0x8A62, + 0x5973, 0xC5AE, 0x5974, 0xC5AB, 0x5975, 0x8A63, 0x5976, 0xC4CC, 0x5977, 0x8A64, 0x5978, 0xBCE9, 0x5979, 0xCBFD, 0x597A, 0x8A65, + 0x597B, 0x8A66, 0x597C, 0x8A67, 0x597D, 0xBAC3, 0x597E, 0x8A68, 0x597F, 0x8A69, 0x5980, 0x8A6A, 0x5981, 0xE5F9, 0x5982, 0xC8E7, + 0x5983, 0xE5FA, 0x5984, 0xCDFD, 0x5985, 0x8A6B, 0x5986, 0xD7B1, 0x5987, 0xB8BE, 0x5988, 0xC2E8, 0x5989, 0x8A6C, 0x598A, 0xC8D1, + 0x598B, 0x8A6D, 0x598C, 0x8A6E, 0x598D, 0xE5FB, 0x598E, 0x8A6F, 0x598F, 0x8A70, 0x5990, 0x8A71, 0x5991, 0x8A72, 0x5992, 0xB6CA, + 0x5993, 0xBCCB, 0x5994, 0x8A73, 0x5995, 0x8A74, 0x5996, 0xD1FD, 0x5997, 0xE6A1, 0x5998, 0x8A75, 0x5999, 0xC3EE, 0x599A, 0x8A76, + 0x599B, 0x8A77, 0x599C, 0x8A78, 0x599D, 0x8A79, 0x599E, 0xE6A4, 0x599F, 0x8A7A, 0x59A0, 0x8A7B, 0x59A1, 0x8A7C, 0x59A2, 0x8A7D, + 0x59A3, 0xE5FE, 0x59A4, 0xE6A5, 0x59A5, 0xCDD7, 0x59A6, 0x8A7E, 0x59A7, 0x8A80, 0x59A8, 0xB7C1, 0x59A9, 0xE5FC, 0x59AA, 0xE5FD, + 0x59AB, 0xE6A3, 0x59AC, 0x8A81, 0x59AD, 0x8A82, 0x59AE, 0xC4DD, 0x59AF, 0xE6A8, 0x59B0, 0x8A83, 0x59B1, 0x8A84, 0x59B2, 0xE6A7, + 0x59B3, 0x8A85, 0x59B4, 0x8A86, 0x59B5, 0x8A87, 0x59B6, 0x8A88, 0x59B7, 0x8A89, 0x59B8, 0x8A8A, 0x59B9, 0xC3C3, 0x59BA, 0x8A8B, + 0x59BB, 0xC6DE, 0x59BC, 0x8A8C, 0x59BD, 0x8A8D, 0x59BE, 0xE6AA, 0x59BF, 0x8A8E, 0x59C0, 0x8A8F, 0x59C1, 0x8A90, 0x59C2, 0x8A91, + 0x59C3, 0x8A92, 0x59C4, 0x8A93, 0x59C5, 0x8A94, 0x59C6, 0xC4B7, 0x59C7, 0x8A95, 0x59C8, 0x8A96, 0x59C9, 0x8A97, 0x59CA, 0xE6A2, + 0x59CB, 0xCABC, 0x59CC, 0x8A98, 0x59CD, 0x8A99, 0x59CE, 0x8A9A, 0x59CF, 0x8A9B, 0x59D0, 0xBDE3, 0x59D1, 0xB9C3, 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, 0x59D4, 0xCEAF, 0x59D5, 0x8A9C, 0x59D6, 0x8A9D, 0x59D7, 0xE6A9, 0x59D8, 0xE6B0, 0x59D9, 0x8A9E, 0x59DA, 0xD2A6, + 0x59DB, 0x8A9F, 0x59DC, 0xBDAA, 0x59DD, 0xE6AD, 0x59DE, 0x8AA0, 0x59DF, 0x8AA1, 0x59E0, 0x8AA2, 0x59E1, 0x8AA3, 0x59E2, 0x8AA4, + 0x59E3, 0xE6AF, 0x59E4, 0x8AA5, 0x59E5, 0xC0D1, 0x59E6, 0x8AA6, 0x59E7, 0x8AA7, 0x59E8, 0xD2CC, 0x59E9, 0x8AA8, 0x59EA, 0x8AA9, + 0x59EB, 0x8AAA, 0x59EC, 0xBCA7, 0x59ED, 0x8AAB, 0x59EE, 0x8AAC, 0x59EF, 0x8AAD, 0x59F0, 0x8AAE, 0x59F1, 0x8AAF, 0x59F2, 0x8AB0, + 0x59F3, 0x8AB1, 0x59F4, 0x8AB2, 0x59F5, 0x8AB3, 0x59F6, 0x8AB4, 0x59F7, 0x8AB5, 0x59F8, 0x8AB6, 0x59F9, 0xE6B1, 0x59FA, 0x8AB7, + 0x59FB, 0xD2F6, 0x59FC, 0x8AB8, 0x59FD, 0x8AB9, 0x59FE, 0x8ABA, 0x59FF, 0xD7CB, 0x5A00, 0x8ABB, 0x5A01, 0xCDFE, 0x5A02, 0x8ABC, + 0x5A03, 0xCDDE, 0x5A04, 0xC2A6, 0x5A05, 0xE6AB, 0x5A06, 0xE6AC, 0x5A07, 0xBDBF, 0x5A08, 0xE6AE, 0x5A09, 0xE6B3, 0x5A0A, 0x8ABD, + 0x5A0B, 0x8ABE, 0x5A0C, 0xE6B2, 0x5A0D, 0x8ABF, 0x5A0E, 0x8AC0, 0x5A0F, 0x8AC1, 0x5A10, 0x8AC2, 0x5A11, 0xE6B6, 0x5A12, 0x8AC3, + 0x5A13, 0xE6B8, 0x5A14, 0x8AC4, 0x5A15, 0x8AC5, 0x5A16, 0x8AC6, 0x5A17, 0x8AC7, 0x5A18, 0xC4EF, 0x5A19, 0x8AC8, 0x5A1A, 0x8AC9, + 0x5A1B, 0x8ACA, 0x5A1C, 0xC4C8, 0x5A1D, 0x8ACB, 0x5A1E, 0x8ACC, 0x5A1F, 0xBEEA, 0x5A20, 0xC9EF, 0x5A21, 0x8ACD, 0x5A22, 0x8ACE, + 0x5A23, 0xE6B7, 0x5A24, 0x8ACF, 0x5A25, 0xB6F0, 0x5A26, 0x8AD0, 0x5A27, 0x8AD1, 0x5A28, 0x8AD2, 0x5A29, 0xC3E4, 0x5A2A, 0x8AD3, + 0x5A2B, 0x8AD4, 0x5A2C, 0x8AD5, 0x5A2D, 0x8AD6, 0x5A2E, 0x8AD7, 0x5A2F, 0x8AD8, 0x5A30, 0x8AD9, 0x5A31, 0xD3E9, 0x5A32, 0xE6B4, + 0x5A33, 0x8ADA, 0x5A34, 0xE6B5, 0x5A35, 0x8ADB, 0x5A36, 0xC8A2, 0x5A37, 0x8ADC, 0x5A38, 0x8ADD, 0x5A39, 0x8ADE, 0x5A3A, 0x8ADF, + 0x5A3B, 0x8AE0, 0x5A3C, 0xE6BD, 0x5A3D, 0x8AE1, 0x5A3E, 0x8AE2, 0x5A3F, 0x8AE3, 0x5A40, 0xE6B9, 0x5A41, 0x8AE4, 0x5A42, 0x8AE5, + 0x5A43, 0x8AE6, 0x5A44, 0x8AE7, 0x5A45, 0x8AE8, 0x5A46, 0xC6C5, 0x5A47, 0x8AE9, 0x5A48, 0x8AEA, 0x5A49, 0xCDF1, 0x5A4A, 0xE6BB, + 0x5A4B, 0x8AEB, 0x5A4C, 0x8AEC, 0x5A4D, 0x8AED, 0x5A4E, 0x8AEE, 0x5A4F, 0x8AEF, 0x5A50, 0x8AF0, 0x5A51, 0x8AF1, 0x5A52, 0x8AF2, + 0x5A53, 0x8AF3, 0x5A54, 0x8AF4, 0x5A55, 0xE6BC, 0x5A56, 0x8AF5, 0x5A57, 0x8AF6, 0x5A58, 0x8AF7, 0x5A59, 0x8AF8, 0x5A5A, 0xBBE9, + 0x5A5B, 0x8AF9, 0x5A5C, 0x8AFA, 0x5A5D, 0x8AFB, 0x5A5E, 0x8AFC, 0x5A5F, 0x8AFD, 0x5A60, 0x8AFE, 0x5A61, 0x8B40, 0x5A62, 0xE6BE, + 0x5A63, 0x8B41, 0x5A64, 0x8B42, 0x5A65, 0x8B43, 0x5A66, 0x8B44, 0x5A67, 0xE6BA, 0x5A68, 0x8B45, 0x5A69, 0x8B46, 0x5A6A, 0xC0B7, + 0x5A6B, 0x8B47, 0x5A6C, 0x8B48, 0x5A6D, 0x8B49, 0x5A6E, 0x8B4A, 0x5A6F, 0x8B4B, 0x5A70, 0x8B4C, 0x5A71, 0x8B4D, 0x5A72, 0x8B4E, + 0x5A73, 0x8B4F, 0x5A74, 0xD3A4, 0x5A75, 0xE6BF, 0x5A76, 0xC9F4, 0x5A77, 0xE6C3, 0x5A78, 0x8B50, 0x5A79, 0x8B51, 0x5A7A, 0xE6C4, + 0x5A7B, 0x8B52, 0x5A7C, 0x8B53, 0x5A7D, 0x8B54, 0x5A7E, 0x8B55, 0x5A7F, 0xD0F6, 0x5A80, 0x8B56, 0x5A81, 0x8B57, 0x5A82, 0x8B58, + 0x5A83, 0x8B59, 0x5A84, 0x8B5A, 0x5A85, 0x8B5B, 0x5A86, 0x8B5C, 0x5A87, 0x8B5D, 0x5A88, 0x8B5E, 0x5A89, 0x8B5F, 0x5A8A, 0x8B60, + 0x5A8B, 0x8B61, 0x5A8C, 0x8B62, 0x5A8D, 0x8B63, 0x5A8E, 0x8B64, 0x5A8F, 0x8B65, 0x5A90, 0x8B66, 0x5A91, 0x8B67, 0x5A92, 0xC3BD, + 0x5A93, 0x8B68, 0x5A94, 0x8B69, 0x5A95, 0x8B6A, 0x5A96, 0x8B6B, 0x5A97, 0x8B6C, 0x5A98, 0x8B6D, 0x5A99, 0x8B6E, 0x5A9A, 0xC3C4, + 0x5A9B, 0xE6C2, 0x5A9C, 0x8B6F, 0x5A9D, 0x8B70, 0x5A9E, 0x8B71, 0x5A9F, 0x8B72, 0x5AA0, 0x8B73, 0x5AA1, 0x8B74, 0x5AA2, 0x8B75, + 0x5AA3, 0x8B76, 0x5AA4, 0x8B77, 0x5AA5, 0x8B78, 0x5AA6, 0x8B79, 0x5AA7, 0x8B7A, 0x5AA8, 0x8B7B, 0x5AA9, 0x8B7C, 0x5AAA, 0xE6C1, + 0x5AAB, 0x8B7D, 0x5AAC, 0x8B7E, 0x5AAD, 0x8B80, 0x5AAE, 0x8B81, 0x5AAF, 0x8B82, 0x5AB0, 0x8B83, 0x5AB1, 0x8B84, 0x5AB2, 0xE6C7, + 0x5AB3, 0xCFB1, 0x5AB4, 0x8B85, 0x5AB5, 0xEBF4, 0x5AB6, 0x8B86, 0x5AB7, 0x8B87, 0x5AB8, 0xE6CA, 0x5AB9, 0x8B88, 0x5ABA, 0x8B89, + 0x5ABB, 0x8B8A, 0x5ABC, 0x8B8B, 0x5ABD, 0x8B8C, 0x5ABE, 0xE6C5, 0x5ABF, 0x8B8D, 0x5AC0, 0x8B8E, 0x5AC1, 0xBCDE, 0x5AC2, 0xC9A9, + 0x5AC3, 0x8B8F, 0x5AC4, 0x8B90, 0x5AC5, 0x8B91, 0x5AC6, 0x8B92, 0x5AC7, 0x8B93, 0x5AC8, 0x8B94, 0x5AC9, 0xBCB5, 0x5ACA, 0x8B95, + 0x5ACB, 0x8B96, 0x5ACC, 0xCFD3, 0x5ACD, 0x8B97, 0x5ACE, 0x8B98, 0x5ACF, 0x8B99, 0x5AD0, 0x8B9A, 0x5AD1, 0x8B9B, 0x5AD2, 0xE6C8, + 0x5AD3, 0x8B9C, 0x5AD4, 0xE6C9, 0x5AD5, 0x8B9D, 0x5AD6, 0xE6CE, 0x5AD7, 0x8B9E, 0x5AD8, 0xE6D0, 0x5AD9, 0x8B9F, 0x5ADA, 0x8BA0, + 0x5ADB, 0x8BA1, 0x5ADC, 0xE6D1, 0x5ADD, 0x8BA2, 0x5ADE, 0x8BA3, 0x5ADF, 0x8BA4, 0x5AE0, 0xE6CB, 0x5AE1, 0xB5D5, 0x5AE2, 0x8BA5, + 0x5AE3, 0xE6CC, 0x5AE4, 0x8BA6, 0x5AE5, 0x8BA7, 0x5AE6, 0xE6CF, 0x5AE7, 0x8BA8, 0x5AE8, 0x8BA9, 0x5AE9, 0xC4DB, 0x5AEA, 0x8BAA, + 0x5AEB, 0xE6C6, 0x5AEC, 0x8BAB, 0x5AED, 0x8BAC, 0x5AEE, 0x8BAD, 0x5AEF, 0x8BAE, 0x5AF0, 0x8BAF, 0x5AF1, 0xE6CD, 0x5AF2, 0x8BB0, + 0x5AF3, 0x8BB1, 0x5AF4, 0x8BB2, 0x5AF5, 0x8BB3, 0x5AF6, 0x8BB4, 0x5AF7, 0x8BB5, 0x5AF8, 0x8BB6, 0x5AF9, 0x8BB7, 0x5AFA, 0x8BB8, + 0x5AFB, 0x8BB9, 0x5AFC, 0x8BBA, 0x5AFD, 0x8BBB, 0x5AFE, 0x8BBC, 0x5AFF, 0x8BBD, 0x5B00, 0x8BBE, 0x5B01, 0x8BBF, 0x5B02, 0x8BC0, + 0x5B03, 0x8BC1, 0x5B04, 0x8BC2, 0x5B05, 0x8BC3, 0x5B06, 0x8BC4, 0x5B07, 0x8BC5, 0x5B08, 0x8BC6, 0x5B09, 0xE6D2, 0x5B0A, 0x8BC7, + 0x5B0B, 0x8BC8, 0x5B0C, 0x8BC9, 0x5B0D, 0x8BCA, 0x5B0E, 0x8BCB, 0x5B0F, 0x8BCC, 0x5B10, 0x8BCD, 0x5B11, 0x8BCE, 0x5B12, 0x8BCF, + 0x5B13, 0x8BD0, 0x5B14, 0x8BD1, 0x5B15, 0x8BD2, 0x5B16, 0xE6D4, 0x5B17, 0xE6D3, 0x5B18, 0x8BD3, 0x5B19, 0x8BD4, 0x5B1A, 0x8BD5, + 0x5B1B, 0x8BD6, 0x5B1C, 0x8BD7, 0x5B1D, 0x8BD8, 0x5B1E, 0x8BD9, 0x5B1F, 0x8BDA, 0x5B20, 0x8BDB, 0x5B21, 0x8BDC, 0x5B22, 0x8BDD, + 0x5B23, 0x8BDE, 0x5B24, 0x8BDF, 0x5B25, 0x8BE0, 0x5B26, 0x8BE1, 0x5B27, 0x8BE2, 0x5B28, 0x8BE3, 0x5B29, 0x8BE4, 0x5B2A, 0x8BE5, + 0x5B2B, 0x8BE6, 0x5B2C, 0x8BE7, 0x5B2D, 0x8BE8, 0x5B2E, 0x8BE9, 0x5B2F, 0x8BEA, 0x5B30, 0x8BEB, 0x5B31, 0x8BEC, 0x5B32, 0xE6D5, + 0x5B33, 0x8BED, 0x5B34, 0xD9F8, 0x5B35, 0x8BEE, 0x5B36, 0x8BEF, 0x5B37, 0xE6D6, 0x5B38, 0x8BF0, 0x5B39, 0x8BF1, 0x5B3A, 0x8BF2, + 0x5B3B, 0x8BF3, 0x5B3C, 0x8BF4, 0x5B3D, 0x8BF5, 0x5B3E, 0x8BF6, 0x5B3F, 0x8BF7, 0x5B40, 0xE6D7, 0x5B41, 0x8BF8, 0x5B42, 0x8BF9, + 0x5B43, 0x8BFA, 0x5B44, 0x8BFB, 0x5B45, 0x8BFC, 0x5B46, 0x8BFD, 0x5B47, 0x8BFE, 0x5B48, 0x8C40, 0x5B49, 0x8C41, 0x5B4A, 0x8C42, + 0x5B4B, 0x8C43, 0x5B4C, 0x8C44, 0x5B4D, 0x8C45, 0x5B4E, 0x8C46, 0x5B4F, 0x8C47, 0x5B50, 0xD7D3, 0x5B51, 0xE6DD, 0x5B52, 0x8C48, + 0x5B53, 0xE6DE, 0x5B54, 0xBFD7, 0x5B55, 0xD4D0, 0x5B56, 0x8C49, 0x5B57, 0xD7D6, 0x5B58, 0xB4E6, 0x5B59, 0xCBEF, 0x5B5A, 0xE6DA, + 0x5B5B, 0xD8C3, 0x5B5C, 0xD7CE, 0x5B5D, 0xD0A2, 0x5B5E, 0x8C4A, 0x5B5F, 0xC3CF, 0x5B60, 0x8C4B, 0x5B61, 0x8C4C, 0x5B62, 0xE6DF, + 0x5B63, 0xBCBE, 0x5B64, 0xB9C2, 0x5B65, 0xE6DB, 0x5B66, 0xD1A7, 0x5B67, 0x8C4D, 0x5B68, 0x8C4E, 0x5B69, 0xBAA2, 0x5B6A, 0xC2CF, + 0x5B6B, 0x8C4F, 0x5B6C, 0xD8AB, 0x5B6D, 0x8C50, 0x5B6E, 0x8C51, 0x5B6F, 0x8C52, 0x5B70, 0xCAEB, 0x5B71, 0xE5EE, 0x5B72, 0x8C53, + 0x5B73, 0xE6DC, 0x5B74, 0x8C54, 0x5B75, 0xB7F5, 0x5B76, 0x8C55, 0x5B77, 0x8C56, 0x5B78, 0x8C57, 0x5B79, 0x8C58, 0x5B7A, 0xC8E6, + 0x5B7B, 0x8C59, 0x5B7C, 0x8C5A, 0x5B7D, 0xC4F5, 0x5B7E, 0x8C5B, 0x5B7F, 0x8C5C, 0x5B80, 0xE5B2, 0x5B81, 0xC4FE, 0x5B82, 0x8C5D, + 0x5B83, 0xCBFC, 0x5B84, 0xE5B3, 0x5B85, 0xD5AC, 0x5B86, 0x8C5E, 0x5B87, 0xD3EE, 0x5B88, 0xCAD8, 0x5B89, 0xB0B2, 0x5B8A, 0x8C5F, + 0x5B8B, 0xCBCE, 0x5B8C, 0xCDEA, 0x5B8D, 0x8C60, 0x5B8E, 0x8C61, 0x5B8F, 0xBAEA, 0x5B90, 0x8C62, 0x5B91, 0x8C63, 0x5B92, 0x8C64, + 0x5B93, 0xE5B5, 0x5B94, 0x8C65, 0x5B95, 0xE5B4, 0x5B96, 0x8C66, 0x5B97, 0xD7DA, 0x5B98, 0xB9D9, 0x5B99, 0xD6E6, 0x5B9A, 0xB6A8, + 0x5B9B, 0xCDF0, 0x5B9C, 0xD2CB, 0x5B9D, 0xB1A6, 0x5B9E, 0xCAB5, 0x5B9F, 0x8C67, 0x5BA0, 0xB3E8, 0x5BA1, 0xC9F3, 0x5BA2, 0xBFCD, + 0x5BA3, 0xD0FB, 0x5BA4, 0xCAD2, 0x5BA5, 0xE5B6, 0x5BA6, 0xBBC2, 0x5BA7, 0x8C68, 0x5BA8, 0x8C69, 0x5BA9, 0x8C6A, 0x5BAA, 0xCFDC, + 0x5BAB, 0xB9AC, 0x5BAC, 0x8C6B, 0x5BAD, 0x8C6C, 0x5BAE, 0x8C6D, 0x5BAF, 0x8C6E, 0x5BB0, 0xD4D7, 0x5BB1, 0x8C6F, 0x5BB2, 0x8C70, + 0x5BB3, 0xBAA6, 0x5BB4, 0xD1E7, 0x5BB5, 0xCFFC, 0x5BB6, 0xBCD2, 0x5BB7, 0x8C71, 0x5BB8, 0xE5B7, 0x5BB9, 0xC8DD, 0x5BBA, 0x8C72, + 0x5BBB, 0x8C73, 0x5BBC, 0x8C74, 0x5BBD, 0xBFED, 0x5BBE, 0xB1F6, 0x5BBF, 0xCBDE, 0x5BC0, 0x8C75, 0x5BC1, 0x8C76, 0x5BC2, 0xBCC5, + 0x5BC3, 0x8C77, 0x5BC4, 0xBCC4, 0x5BC5, 0xD2FA, 0x5BC6, 0xC3DC, 0x5BC7, 0xBFDC, 0x5BC8, 0x8C78, 0x5BC9, 0x8C79, 0x5BCA, 0x8C7A, + 0x5BCB, 0x8C7B, 0x5BCC, 0xB8BB, 0x5BCD, 0x8C7C, 0x5BCE, 0x8C7D, 0x5BCF, 0x8C7E, 0x5BD0, 0xC3C2, 0x5BD1, 0x8C80, 0x5BD2, 0xBAAE, + 0x5BD3, 0xD4A2, 0x5BD4, 0x8C81, 0x5BD5, 0x8C82, 0x5BD6, 0x8C83, 0x5BD7, 0x8C84, 0x5BD8, 0x8C85, 0x5BD9, 0x8C86, 0x5BDA, 0x8C87, + 0x5BDB, 0x8C88, 0x5BDC, 0x8C89, 0x5BDD, 0xC7DE, 0x5BDE, 0xC4AF, 0x5BDF, 0xB2EC, 0x5BE0, 0x8C8A, 0x5BE1, 0xB9D1, 0x5BE2, 0x8C8B, + 0x5BE3, 0x8C8C, 0x5BE4, 0xE5BB, 0x5BE5, 0xC1C8, 0x5BE6, 0x8C8D, 0x5BE7, 0x8C8E, 0x5BE8, 0xD5AF, 0x5BE9, 0x8C8F, 0x5BEA, 0x8C90, + 0x5BEB, 0x8C91, 0x5BEC, 0x8C92, 0x5BED, 0x8C93, 0x5BEE, 0xE5BC, 0x5BEF, 0x8C94, 0x5BF0, 0xE5BE, 0x5BF1, 0x8C95, 0x5BF2, 0x8C96, + 0x5BF3, 0x8C97, 0x5BF4, 0x8C98, 0x5BF5, 0x8C99, 0x5BF6, 0x8C9A, 0x5BF7, 0x8C9B, 0x5BF8, 0xB4E7, 0x5BF9, 0xB6D4, 0x5BFA, 0xCBC2, + 0x5BFB, 0xD1B0, 0x5BFC, 0xB5BC, 0x5BFD, 0x8C9C, 0x5BFE, 0x8C9D, 0x5BFF, 0xCAD9, 0x5C00, 0x8C9E, 0x5C01, 0xB7E2, 0x5C02, 0x8C9F, + 0x5C03, 0x8CA0, 0x5C04, 0xC9E4, 0x5C05, 0x8CA1, 0x5C06, 0xBDAB, 0x5C07, 0x8CA2, 0x5C08, 0x8CA3, 0x5C09, 0xCEBE, 0x5C0A, 0xD7F0, + 0x5C0B, 0x8CA4, 0x5C0C, 0x8CA5, 0x5C0D, 0x8CA6, 0x5C0E, 0x8CA7, 0x5C0F, 0xD0A1, 0x5C10, 0x8CA8, 0x5C11, 0xC9D9, 0x5C12, 0x8CA9, + 0x5C13, 0x8CAA, 0x5C14, 0xB6FB, 0x5C15, 0xE6D8, 0x5C16, 0xBCE2, 0x5C17, 0x8CAB, 0x5C18, 0xB3BE, 0x5C19, 0x8CAC, 0x5C1A, 0xC9D0, + 0x5C1B, 0x8CAD, 0x5C1C, 0xE6D9, 0x5C1D, 0xB3A2, 0x5C1E, 0x8CAE, 0x5C1F, 0x8CAF, 0x5C20, 0x8CB0, 0x5C21, 0x8CB1, 0x5C22, 0xDECC, + 0x5C23, 0x8CB2, 0x5C24, 0xD3C8, 0x5C25, 0xDECD, 0x5C26, 0x8CB3, 0x5C27, 0xD2A2, 0x5C28, 0x8CB4, 0x5C29, 0x8CB5, 0x5C2A, 0x8CB6, + 0x5C2B, 0x8CB7, 0x5C2C, 0xDECE, 0x5C2D, 0x8CB8, 0x5C2E, 0x8CB9, 0x5C2F, 0x8CBA, 0x5C30, 0x8CBB, 0x5C31, 0xBECD, 0x5C32, 0x8CBC, + 0x5C33, 0x8CBD, 0x5C34, 0xDECF, 0x5C35, 0x8CBE, 0x5C36, 0x8CBF, 0x5C37, 0x8CC0, 0x5C38, 0xCAAC, 0x5C39, 0xD2FC, 0x5C3A, 0xB3DF, + 0x5C3B, 0xE5EA, 0x5C3C, 0xC4E1, 0x5C3D, 0xBEA1, 0x5C3E, 0xCEB2, 0x5C3F, 0xC4F2, 0x5C40, 0xBED6, 0x5C41, 0xC6A8, 0x5C42, 0xB2E3, + 0x5C43, 0x8CC1, 0x5C44, 0x8CC2, 0x5C45, 0xBED3, 0x5C46, 0x8CC3, 0x5C47, 0x8CC4, 0x5C48, 0xC7FC, 0x5C49, 0xCCEB, 0x5C4A, 0xBDEC, + 0x5C4B, 0xCEDD, 0x5C4C, 0x8CC5, 0x5C4D, 0x8CC6, 0x5C4E, 0xCABA, 0x5C4F, 0xC6C1, 0x5C50, 0xE5EC, 0x5C51, 0xD0BC, 0x5C52, 0x8CC7, + 0x5C53, 0x8CC8, 0x5C54, 0x8CC9, 0x5C55, 0xD5B9, 0x5C56, 0x8CCA, 0x5C57, 0x8CCB, 0x5C58, 0x8CCC, 0x5C59, 0xE5ED, 0x5C5A, 0x8CCD, + 0x5C5B, 0x8CCE, 0x5C5C, 0x8CCF, 0x5C5D, 0x8CD0, 0x5C5E, 0xCAF4, 0x5C5F, 0x8CD1, 0x5C60, 0xCDC0, 0x5C61, 0xC2C5, 0x5C62, 0x8CD2, + 0x5C63, 0xE5EF, 0x5C64, 0x8CD3, 0x5C65, 0xC2C4, 0x5C66, 0xE5F0, 0x5C67, 0x8CD4, 0x5C68, 0x8CD5, 0x5C69, 0x8CD6, 0x5C6A, 0x8CD7, + 0x5C6B, 0x8CD8, 0x5C6C, 0x8CD9, 0x5C6D, 0x8CDA, 0x5C6E, 0xE5F8, 0x5C6F, 0xCDCD, 0x5C70, 0x8CDB, 0x5C71, 0xC9BD, 0x5C72, 0x8CDC, + 0x5C73, 0x8CDD, 0x5C74, 0x8CDE, 0x5C75, 0x8CDF, 0x5C76, 0x8CE0, 0x5C77, 0x8CE1, 0x5C78, 0x8CE2, 0x5C79, 0xD2D9, 0x5C7A, 0xE1A8, + 0x5C7B, 0x8CE3, 0x5C7C, 0x8CE4, 0x5C7D, 0x8CE5, 0x5C7E, 0x8CE6, 0x5C7F, 0xD3EC, 0x5C80, 0x8CE7, 0x5C81, 0xCBEA, 0x5C82, 0xC6F1, + 0x5C83, 0x8CE8, 0x5C84, 0x8CE9, 0x5C85, 0x8CEA, 0x5C86, 0x8CEB, 0x5C87, 0x8CEC, 0x5C88, 0xE1AC, 0x5C89, 0x8CED, 0x5C8A, 0x8CEE, + 0x5C8B, 0x8CEF, 0x5C8C, 0xE1A7, 0x5C8D, 0xE1A9, 0x5C8E, 0x8CF0, 0x5C8F, 0x8CF1, 0x5C90, 0xE1AA, 0x5C91, 0xE1AF, 0x5C92, 0x8CF2, + 0x5C93, 0x8CF3, 0x5C94, 0xB2ED, 0x5C95, 0x8CF4, 0x5C96, 0xE1AB, 0x5C97, 0xB8DA, 0x5C98, 0xE1AD, 0x5C99, 0xE1AE, 0x5C9A, 0xE1B0, + 0x5C9B, 0xB5BA, 0x5C9C, 0xE1B1, 0x5C9D, 0x8CF5, 0x5C9E, 0x8CF6, 0x5C9F, 0x8CF7, 0x5CA0, 0x8CF8, 0x5CA1, 0x8CF9, 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, 0x5CA4, 0x8CFA, 0x5CA5, 0x8CFB, 0x5CA6, 0x8CFC, 0x5CA7, 0x8CFD, 0x5CA8, 0x8CFE, 0x5CA9, 0xD1D2, 0x5CAA, 0x8D40, + 0x5CAB, 0xE1B6, 0x5CAC, 0xE1B5, 0x5CAD, 0xC1EB, 0x5CAE, 0x8D41, 0x5CAF, 0x8D42, 0x5CB0, 0x8D43, 0x5CB1, 0xE1B7, 0x5CB2, 0x8D44, + 0x5CB3, 0xD4C0, 0x5CB4, 0x8D45, 0x5CB5, 0xE1B2, 0x5CB6, 0x8D46, 0x5CB7, 0xE1BA, 0x5CB8, 0xB0B6, 0x5CB9, 0x8D47, 0x5CBA, 0x8D48, + 0x5CBB, 0x8D49, 0x5CBC, 0x8D4A, 0x5CBD, 0xE1B4, 0x5CBE, 0x8D4B, 0x5CBF, 0xBFF9, 0x5CC0, 0x8D4C, 0x5CC1, 0xE1B9, 0x5CC2, 0x8D4D, + 0x5CC3, 0x8D4E, 0x5CC4, 0xE1BB, 0x5CC5, 0x8D4F, 0x5CC6, 0x8D50, 0x5CC7, 0x8D51, 0x5CC8, 0x8D52, 0x5CC9, 0x8D53, 0x5CCA, 0x8D54, + 0x5CCB, 0xE1BE, 0x5CCC, 0x8D55, 0x5CCD, 0x8D56, 0x5CCE, 0x8D57, 0x5CCF, 0x8D58, 0x5CD0, 0x8D59, 0x5CD1, 0x8D5A, 0x5CD2, 0xE1BC, + 0x5CD3, 0x8D5B, 0x5CD4, 0x8D5C, 0x5CD5, 0x8D5D, 0x5CD6, 0x8D5E, 0x5CD7, 0x8D5F, 0x5CD8, 0x8D60, 0x5CD9, 0xD6C5, 0x5CDA, 0x8D61, + 0x5CDB, 0x8D62, 0x5CDC, 0x8D63, 0x5CDD, 0x8D64, 0x5CDE, 0x8D65, 0x5CDF, 0x8D66, 0x5CE0, 0x8D67, 0x5CE1, 0xCFBF, 0x5CE2, 0x8D68, + 0x5CE3, 0x8D69, 0x5CE4, 0xE1BD, 0x5CE5, 0xE1BF, 0x5CE6, 0xC2CD, 0x5CE7, 0x8D6A, 0x5CE8, 0xB6EB, 0x5CE9, 0x8D6B, 0x5CEA, 0xD3F8, + 0x5CEB, 0x8D6C, 0x5CEC, 0x8D6D, 0x5CED, 0xC7CD, 0x5CEE, 0x8D6E, 0x5CEF, 0x8D6F, 0x5CF0, 0xB7E5, 0x5CF1, 0x8D70, 0x5CF2, 0x8D71, + 0x5CF3, 0x8D72, 0x5CF4, 0x8D73, 0x5CF5, 0x8D74, 0x5CF6, 0x8D75, 0x5CF7, 0x8D76, 0x5CF8, 0x8D77, 0x5CF9, 0x8D78, 0x5CFA, 0x8D79, + 0x5CFB, 0xBEFE, 0x5CFC, 0x8D7A, 0x5CFD, 0x8D7B, 0x5CFE, 0x8D7C, 0x5CFF, 0x8D7D, 0x5D00, 0x8D7E, 0x5D01, 0x8D80, 0x5D02, 0xE1C0, + 0x5D03, 0xE1C1, 0x5D04, 0x8D81, 0x5D05, 0x8D82, 0x5D06, 0xE1C7, 0x5D07, 0xB3E7, 0x5D08, 0x8D83, 0x5D09, 0x8D84, 0x5D0A, 0x8D85, + 0x5D0B, 0x8D86, 0x5D0C, 0x8D87, 0x5D0D, 0x8D88, 0x5D0E, 0xC6E9, 0x5D0F, 0x8D89, 0x5D10, 0x8D8A, 0x5D11, 0x8D8B, 0x5D12, 0x8D8C, + 0x5D13, 0x8D8D, 0x5D14, 0xB4DE, 0x5D15, 0x8D8E, 0x5D16, 0xD1C2, 0x5D17, 0x8D8F, 0x5D18, 0x8D90, 0x5D19, 0x8D91, 0x5D1A, 0x8D92, + 0x5D1B, 0xE1C8, 0x5D1C, 0x8D93, 0x5D1D, 0x8D94, 0x5D1E, 0xE1C6, 0x5D1F, 0x8D95, 0x5D20, 0x8D96, 0x5D21, 0x8D97, 0x5D22, 0x8D98, + 0x5D23, 0x8D99, 0x5D24, 0xE1C5, 0x5D25, 0x8D9A, 0x5D26, 0xE1C3, 0x5D27, 0xE1C2, 0x5D28, 0x8D9B, 0x5D29, 0xB1C0, 0x5D2A, 0x8D9C, + 0x5D2B, 0x8D9D, 0x5D2C, 0x8D9E, 0x5D2D, 0xD5B8, 0x5D2E, 0xE1C4, 0x5D2F, 0x8D9F, 0x5D30, 0x8DA0, 0x5D31, 0x8DA1, 0x5D32, 0x8DA2, + 0x5D33, 0x8DA3, 0x5D34, 0xE1CB, 0x5D35, 0x8DA4, 0x5D36, 0x8DA5, 0x5D37, 0x8DA6, 0x5D38, 0x8DA7, 0x5D39, 0x8DA8, 0x5D3A, 0x8DA9, + 0x5D3B, 0x8DAA, 0x5D3C, 0x8DAB, 0x5D3D, 0xE1CC, 0x5D3E, 0xE1CA, 0x5D3F, 0x8DAC, 0x5D40, 0x8DAD, 0x5D41, 0x8DAE, 0x5D42, 0x8DAF, + 0x5D43, 0x8DB0, 0x5D44, 0x8DB1, 0x5D45, 0x8DB2, 0x5D46, 0x8DB3, 0x5D47, 0xEFFA, 0x5D48, 0x8DB4, 0x5D49, 0x8DB5, 0x5D4A, 0xE1D3, + 0x5D4B, 0xE1D2, 0x5D4C, 0xC7B6, 0x5D4D, 0x8DB6, 0x5D4E, 0x8DB7, 0x5D4F, 0x8DB8, 0x5D50, 0x8DB9, 0x5D51, 0x8DBA, 0x5D52, 0x8DBB, + 0x5D53, 0x8DBC, 0x5D54, 0x8DBD, 0x5D55, 0x8DBE, 0x5D56, 0x8DBF, 0x5D57, 0x8DC0, 0x5D58, 0xE1C9, 0x5D59, 0x8DC1, 0x5D5A, 0x8DC2, + 0x5D5B, 0xE1CE, 0x5D5C, 0x8DC3, 0x5D5D, 0xE1D0, 0x5D5E, 0x8DC4, 0x5D5F, 0x8DC5, 0x5D60, 0x8DC6, 0x5D61, 0x8DC7, 0x5D62, 0x8DC8, + 0x5D63, 0x8DC9, 0x5D64, 0x8DCA, 0x5D65, 0x8DCB, 0x5D66, 0x8DCC, 0x5D67, 0x8DCD, 0x5D68, 0x8DCE, 0x5D69, 0xE1D4, 0x5D6A, 0x8DCF, + 0x5D6B, 0xE1D1, 0x5D6C, 0xE1CD, 0x5D6D, 0x8DD0, 0x5D6E, 0x8DD1, 0x5D6F, 0xE1CF, 0x5D70, 0x8DD2, 0x5D71, 0x8DD3, 0x5D72, 0x8DD4, + 0x5D73, 0x8DD5, 0x5D74, 0xE1D5, 0x5D75, 0x8DD6, 0x5D76, 0x8DD7, 0x5D77, 0x8DD8, 0x5D78, 0x8DD9, 0x5D79, 0x8DDA, 0x5D7A, 0x8DDB, + 0x5D7B, 0x8DDC, 0x5D7C, 0x8DDD, 0x5D7D, 0x8DDE, 0x5D7E, 0x8DDF, 0x5D7F, 0x8DE0, 0x5D80, 0x8DE1, 0x5D81, 0x8DE2, 0x5D82, 0xE1D6, + 0x5D83, 0x8DE3, 0x5D84, 0x8DE4, 0x5D85, 0x8DE5, 0x5D86, 0x8DE6, 0x5D87, 0x8DE7, 0x5D88, 0x8DE8, 0x5D89, 0x8DE9, 0x5D8A, 0x8DEA, + 0x5D8B, 0x8DEB, 0x5D8C, 0x8DEC, 0x5D8D, 0x8DED, 0x5D8E, 0x8DEE, 0x5D8F, 0x8DEF, 0x5D90, 0x8DF0, 0x5D91, 0x8DF1, 0x5D92, 0x8DF2, + 0x5D93, 0x8DF3, 0x5D94, 0x8DF4, 0x5D95, 0x8DF5, 0x5D96, 0x8DF6, 0x5D97, 0x8DF7, 0x5D98, 0x8DF8, 0x5D99, 0xE1D7, 0x5D9A, 0x8DF9, + 0x5D9B, 0x8DFA, 0x5D9C, 0x8DFB, 0x5D9D, 0xE1D8, 0x5D9E, 0x8DFC, 0x5D9F, 0x8DFD, 0x5DA0, 0x8DFE, 0x5DA1, 0x8E40, 0x5DA2, 0x8E41, + 0x5DA3, 0x8E42, 0x5DA4, 0x8E43, 0x5DA5, 0x8E44, 0x5DA6, 0x8E45, 0x5DA7, 0x8E46, 0x5DA8, 0x8E47, 0x5DA9, 0x8E48, 0x5DAA, 0x8E49, + 0x5DAB, 0x8E4A, 0x5DAC, 0x8E4B, 0x5DAD, 0x8E4C, 0x5DAE, 0x8E4D, 0x5DAF, 0x8E4E, 0x5DB0, 0x8E4F, 0x5DB1, 0x8E50, 0x5DB2, 0x8E51, + 0x5DB3, 0x8E52, 0x5DB4, 0x8E53, 0x5DB5, 0x8E54, 0x5DB6, 0x8E55, 0x5DB7, 0xE1DA, 0x5DB8, 0x8E56, 0x5DB9, 0x8E57, 0x5DBA, 0x8E58, + 0x5DBB, 0x8E59, 0x5DBC, 0x8E5A, 0x5DBD, 0x8E5B, 0x5DBE, 0x8E5C, 0x5DBF, 0x8E5D, 0x5DC0, 0x8E5E, 0x5DC1, 0x8E5F, 0x5DC2, 0x8E60, + 0x5DC3, 0x8E61, 0x5DC4, 0x8E62, 0x5DC5, 0xE1DB, 0x5DC6, 0x8E63, 0x5DC7, 0x8E64, 0x5DC8, 0x8E65, 0x5DC9, 0x8E66, 0x5DCA, 0x8E67, + 0x5DCB, 0x8E68, 0x5DCC, 0x8E69, 0x5DCD, 0xCEA1, 0x5DCE, 0x8E6A, 0x5DCF, 0x8E6B, 0x5DD0, 0x8E6C, 0x5DD1, 0x8E6D, 0x5DD2, 0x8E6E, + 0x5DD3, 0x8E6F, 0x5DD4, 0x8E70, 0x5DD5, 0x8E71, 0x5DD6, 0x8E72, 0x5DD7, 0x8E73, 0x5DD8, 0x8E74, 0x5DD9, 0x8E75, 0x5DDA, 0x8E76, + 0x5DDB, 0xE7DD, 0x5DDC, 0x8E77, 0x5DDD, 0xB4A8, 0x5DDE, 0xD6DD, 0x5DDF, 0x8E78, 0x5DE0, 0x8E79, 0x5DE1, 0xD1B2, 0x5DE2, 0xB3B2, + 0x5DE3, 0x8E7A, 0x5DE4, 0x8E7B, 0x5DE5, 0xB9A4, 0x5DE6, 0xD7F3, 0x5DE7, 0xC7C9, 0x5DE8, 0xBEDE, 0x5DE9, 0xB9AE, 0x5DEA, 0x8E7C, + 0x5DEB, 0xCED7, 0x5DEC, 0x8E7D, 0x5DED, 0x8E7E, 0x5DEE, 0xB2EE, 0x5DEF, 0xDBCF, 0x5DF0, 0x8E80, 0x5DF1, 0xBCBA, 0x5DF2, 0xD2D1, + 0x5DF3, 0xCBC8, 0x5DF4, 0xB0CD, 0x5DF5, 0x8E81, 0x5DF6, 0x8E82, 0x5DF7, 0xCFEF, 0x5DF8, 0x8E83, 0x5DF9, 0x8E84, 0x5DFA, 0x8E85, + 0x5DFB, 0x8E86, 0x5DFC, 0x8E87, 0x5DFD, 0xD9E3, 0x5DFE, 0xBDED, 0x5DFF, 0x8E88, 0x5E00, 0x8E89, 0x5E01, 0xB1D2, 0x5E02, 0xCAD0, + 0x5E03, 0xB2BC, 0x5E04, 0x8E8A, 0x5E05, 0xCBA7, 0x5E06, 0xB7AB, 0x5E07, 0x8E8B, 0x5E08, 0xCAA6, 0x5E09, 0x8E8C, 0x5E0A, 0x8E8D, + 0x5E0B, 0x8E8E, 0x5E0C, 0xCFA3, 0x5E0D, 0x8E8F, 0x5E0E, 0x8E90, 0x5E0F, 0xE0F8, 0x5E10, 0xD5CA, 0x5E11, 0xE0FB, 0x5E12, 0x8E91, + 0x5E13, 0x8E92, 0x5E14, 0xE0FA, 0x5E15, 0xC5C1, 0x5E16, 0xCCFB, 0x5E17, 0x8E93, 0x5E18, 0xC1B1, 0x5E19, 0xE0F9, 0x5E1A, 0xD6E3, + 0x5E1B, 0xB2AF, 0x5E1C, 0xD6C4, 0x5E1D, 0xB5DB, 0x5E1E, 0x8E94, 0x5E1F, 0x8E95, 0x5E20, 0x8E96, 0x5E21, 0x8E97, 0x5E22, 0x8E98, + 0x5E23, 0x8E99, 0x5E24, 0x8E9A, 0x5E25, 0x8E9B, 0x5E26, 0xB4F8, 0x5E27, 0xD6A1, 0x5E28, 0x8E9C, 0x5E29, 0x8E9D, 0x5E2A, 0x8E9E, + 0x5E2B, 0x8E9F, 0x5E2C, 0x8EA0, 0x5E2D, 0xCFAF, 0x5E2E, 0xB0EF, 0x5E2F, 0x8EA1, 0x5E30, 0x8EA2, 0x5E31, 0xE0FC, 0x5E32, 0x8EA3, + 0x5E33, 0x8EA4, 0x5E34, 0x8EA5, 0x5E35, 0x8EA6, 0x5E36, 0x8EA7, 0x5E37, 0xE1A1, 0x5E38, 0xB3A3, 0x5E39, 0x8EA8, 0x5E3A, 0x8EA9, + 0x5E3B, 0xE0FD, 0x5E3C, 0xE0FE, 0x5E3D, 0xC3B1, 0x5E3E, 0x8EAA, 0x5E3F, 0x8EAB, 0x5E40, 0x8EAC, 0x5E41, 0x8EAD, 0x5E42, 0xC3DD, + 0x5E43, 0x8EAE, 0x5E44, 0xE1A2, 0x5E45, 0xB7F9, 0x5E46, 0x8EAF, 0x5E47, 0x8EB0, 0x5E48, 0x8EB1, 0x5E49, 0x8EB2, 0x5E4A, 0x8EB3, + 0x5E4B, 0x8EB4, 0x5E4C, 0xBBCF, 0x5E4D, 0x8EB5, 0x5E4E, 0x8EB6, 0x5E4F, 0x8EB7, 0x5E50, 0x8EB8, 0x5E51, 0x8EB9, 0x5E52, 0x8EBA, + 0x5E53, 0x8EBB, 0x5E54, 0xE1A3, 0x5E55, 0xC4BB, 0x5E56, 0x8EBC, 0x5E57, 0x8EBD, 0x5E58, 0x8EBE, 0x5E59, 0x8EBF, 0x5E5A, 0x8EC0, + 0x5E5B, 0xE1A4, 0x5E5C, 0x8EC1, 0x5E5D, 0x8EC2, 0x5E5E, 0xE1A5, 0x5E5F, 0x8EC3, 0x5E60, 0x8EC4, 0x5E61, 0xE1A6, 0x5E62, 0xB4B1, + 0x5E63, 0x8EC5, 0x5E64, 0x8EC6, 0x5E65, 0x8EC7, 0x5E66, 0x8EC8, 0x5E67, 0x8EC9, 0x5E68, 0x8ECA, 0x5E69, 0x8ECB, 0x5E6A, 0x8ECC, + 0x5E6B, 0x8ECD, 0x5E6C, 0x8ECE, 0x5E6D, 0x8ECF, 0x5E6E, 0x8ED0, 0x5E6F, 0x8ED1, 0x5E70, 0x8ED2, 0x5E71, 0x8ED3, 0x5E72, 0xB8C9, + 0x5E73, 0xC6BD, 0x5E74, 0xC4EA, 0x5E75, 0x8ED4, 0x5E76, 0xB2A2, 0x5E77, 0x8ED5, 0x5E78, 0xD0D2, 0x5E79, 0x8ED6, 0x5E7A, 0xE7DB, + 0x5E7B, 0xBBC3, 0x5E7C, 0xD3D7, 0x5E7D, 0xD3C4, 0x5E7E, 0x8ED7, 0x5E7F, 0xB9E3, 0x5E80, 0xE2CF, 0x5E81, 0x8ED8, 0x5E82, 0x8ED9, + 0x5E83, 0x8EDA, 0x5E84, 0xD7AF, 0x5E85, 0x8EDB, 0x5E86, 0xC7EC, 0x5E87, 0xB1D3, 0x5E88, 0x8EDC, 0x5E89, 0x8EDD, 0x5E8A, 0xB4B2, + 0x5E8B, 0xE2D1, 0x5E8C, 0x8EDE, 0x5E8D, 0x8EDF, 0x5E8E, 0x8EE0, 0x5E8F, 0xD0F2, 0x5E90, 0xC2AE, 0x5E91, 0xE2D0, 0x5E92, 0x8EE1, + 0x5E93, 0xBFE2, 0x5E94, 0xD3A6, 0x5E95, 0xB5D7, 0x5E96, 0xE2D2, 0x5E97, 0xB5EA, 0x5E98, 0x8EE2, 0x5E99, 0xC3ED, 0x5E9A, 0xB8FD, + 0x5E9B, 0x8EE3, 0x5E9C, 0xB8AE, 0x5E9D, 0x8EE4, 0x5E9E, 0xC5D3, 0x5E9F, 0xB7CF, 0x5EA0, 0xE2D4, 0x5EA1, 0x8EE5, 0x5EA2, 0x8EE6, + 0x5EA3, 0x8EE7, 0x5EA4, 0x8EE8, 0x5EA5, 0xE2D3, 0x5EA6, 0xB6C8, 0x5EA7, 0xD7F9, 0x5EA8, 0x8EE9, 0x5EA9, 0x8EEA, 0x5EAA, 0x8EEB, + 0x5EAB, 0x8EEC, 0x5EAC, 0x8EED, 0x5EAD, 0xCDA5, 0x5EAE, 0x8EEE, 0x5EAF, 0x8EEF, 0x5EB0, 0x8EF0, 0x5EB1, 0x8EF1, 0x5EB2, 0x8EF2, + 0x5EB3, 0xE2D8, 0x5EB4, 0x8EF3, 0x5EB5, 0xE2D6, 0x5EB6, 0xCAFC, 0x5EB7, 0xBFB5, 0x5EB8, 0xD3B9, 0x5EB9, 0xE2D5, 0x5EBA, 0x8EF4, + 0x5EBB, 0x8EF5, 0x5EBC, 0x8EF6, 0x5EBD, 0x8EF7, 0x5EBE, 0xE2D7, 0x5EBF, 0x8EF8, 0x5EC0, 0x8EF9, 0x5EC1, 0x8EFA, 0x5EC2, 0x8EFB, + 0x5EC3, 0x8EFC, 0x5EC4, 0x8EFD, 0x5EC5, 0x8EFE, 0x5EC6, 0x8F40, 0x5EC7, 0x8F41, 0x5EC8, 0x8F42, 0x5EC9, 0xC1AE, 0x5ECA, 0xC0C8, + 0x5ECB, 0x8F43, 0x5ECC, 0x8F44, 0x5ECD, 0x8F45, 0x5ECE, 0x8F46, 0x5ECF, 0x8F47, 0x5ED0, 0x8F48, 0x5ED1, 0xE2DB, 0x5ED2, 0xE2DA, + 0x5ED3, 0xC0AA, 0x5ED4, 0x8F49, 0x5ED5, 0x8F4A, 0x5ED6, 0xC1CE, 0x5ED7, 0x8F4B, 0x5ED8, 0x8F4C, 0x5ED9, 0x8F4D, 0x5EDA, 0x8F4E, + 0x5EDB, 0xE2DC, 0x5EDC, 0x8F4F, 0x5EDD, 0x8F50, 0x5EDE, 0x8F51, 0x5EDF, 0x8F52, 0x5EE0, 0x8F53, 0x5EE1, 0x8F54, 0x5EE2, 0x8F55, + 0x5EE3, 0x8F56, 0x5EE4, 0x8F57, 0x5EE5, 0x8F58, 0x5EE6, 0x8F59, 0x5EE7, 0x8F5A, 0x5EE8, 0xE2DD, 0x5EE9, 0x8F5B, 0x5EEA, 0xE2DE, + 0x5EEB, 0x8F5C, 0x5EEC, 0x8F5D, 0x5EED, 0x8F5E, 0x5EEE, 0x8F5F, 0x5EEF, 0x8F60, 0x5EF0, 0x8F61, 0x5EF1, 0x8F62, 0x5EF2, 0x8F63, + 0x5EF3, 0x8F64, 0x5EF4, 0xDBC8, 0x5EF5, 0x8F65, 0x5EF6, 0xD1D3, 0x5EF7, 0xCDA2, 0x5EF8, 0x8F66, 0x5EF9, 0x8F67, 0x5EFA, 0xBDA8, + 0x5EFB, 0x8F68, 0x5EFC, 0x8F69, 0x5EFD, 0x8F6A, 0x5EFE, 0xDEC3, 0x5EFF, 0xD8A5, 0x5F00, 0xBFAA, 0x5F01, 0xDBCD, 0x5F02, 0xD2EC, + 0x5F03, 0xC6FA, 0x5F04, 0xC5AA, 0x5F05, 0x8F6B, 0x5F06, 0x8F6C, 0x5F07, 0x8F6D, 0x5F08, 0xDEC4, 0x5F09, 0x8F6E, 0x5F0A, 0xB1D7, + 0x5F0B, 0xDFAE, 0x5F0C, 0x8F6F, 0x5F0D, 0x8F70, 0x5F0E, 0x8F71, 0x5F0F, 0xCABD, 0x5F10, 0x8F72, 0x5F11, 0xDFB1, 0x5F12, 0x8F73, + 0x5F13, 0xB9AD, 0x5F14, 0x8F74, 0x5F15, 0xD2FD, 0x5F16, 0x8F75, 0x5F17, 0xB8A5, 0x5F18, 0xBAEB, 0x5F19, 0x8F76, 0x5F1A, 0x8F77, + 0x5F1B, 0xB3DA, 0x5F1C, 0x8F78, 0x5F1D, 0x8F79, 0x5F1E, 0x8F7A, 0x5F1F, 0xB5DC, 0x5F20, 0xD5C5, 0x5F21, 0x8F7B, 0x5F22, 0x8F7C, + 0x5F23, 0x8F7D, 0x5F24, 0x8F7E, 0x5F25, 0xC3D6, 0x5F26, 0xCFD2, 0x5F27, 0xBBA1, 0x5F28, 0x8F80, 0x5F29, 0xE5F3, 0x5F2A, 0xE5F2, + 0x5F2B, 0x8F81, 0x5F2C, 0x8F82, 0x5F2D, 0xE5F4, 0x5F2E, 0x8F83, 0x5F2F, 0xCDE4, 0x5F30, 0x8F84, 0x5F31, 0xC8F5, 0x5F32, 0x8F85, + 0x5F33, 0x8F86, 0x5F34, 0x8F87, 0x5F35, 0x8F88, 0x5F36, 0x8F89, 0x5F37, 0x8F8A, 0x5F38, 0x8F8B, 0x5F39, 0xB5AF, 0x5F3A, 0xC7BF, + 0x5F3B, 0x8F8C, 0x5F3C, 0xE5F6, 0x5F3D, 0x8F8D, 0x5F3E, 0x8F8E, 0x5F3F, 0x8F8F, 0x5F40, 0xECB0, 0x5F41, 0x8F90, 0x5F42, 0x8F91, + 0x5F43, 0x8F92, 0x5F44, 0x8F93, 0x5F45, 0x8F94, 0x5F46, 0x8F95, 0x5F47, 0x8F96, 0x5F48, 0x8F97, 0x5F49, 0x8F98, 0x5F4A, 0x8F99, + 0x5F4B, 0x8F9A, 0x5F4C, 0x8F9B, 0x5F4D, 0x8F9C, 0x5F4E, 0x8F9D, 0x5F4F, 0x8F9E, 0x5F50, 0xE5E6, 0x5F51, 0x8F9F, 0x5F52, 0xB9E9, + 0x5F53, 0xB5B1, 0x5F54, 0x8FA0, 0x5F55, 0xC2BC, 0x5F56, 0xE5E8, 0x5F57, 0xE5E7, 0x5F58, 0xE5E9, 0x5F59, 0x8FA1, 0x5F5A, 0x8FA2, + 0x5F5B, 0x8FA3, 0x5F5C, 0x8FA4, 0x5F5D, 0xD2CD, 0x5F5E, 0x8FA5, 0x5F5F, 0x8FA6, 0x5F60, 0x8FA7, 0x5F61, 0xE1EA, 0x5F62, 0xD0CE, + 0x5F63, 0x8FA8, 0x5F64, 0xCDAE, 0x5F65, 0x8FA9, 0x5F66, 0xD1E5, 0x5F67, 0x8FAA, 0x5F68, 0x8FAB, 0x5F69, 0xB2CA, 0x5F6A, 0xB1EB, + 0x5F6B, 0x8FAC, 0x5F6C, 0xB1F2, 0x5F6D, 0xC5ED, 0x5F6E, 0x8FAD, 0x5F6F, 0x8FAE, 0x5F70, 0xD5C3, 0x5F71, 0xD3B0, 0x5F72, 0x8FAF, + 0x5F73, 0xE1DC, 0x5F74, 0x8FB0, 0x5F75, 0x8FB1, 0x5F76, 0x8FB2, 0x5F77, 0xE1DD, 0x5F78, 0x8FB3, 0x5F79, 0xD2DB, 0x5F7A, 0x8FB4, + 0x5F7B, 0xB3B9, 0x5F7C, 0xB1CB, 0x5F7D, 0x8FB5, 0x5F7E, 0x8FB6, 0x5F7F, 0x8FB7, 0x5F80, 0xCDF9, 0x5F81, 0xD5F7, 0x5F82, 0xE1DE, + 0x5F83, 0x8FB8, 0x5F84, 0xBEB6, 0x5F85, 0xB4FD, 0x5F86, 0x8FB9, 0x5F87, 0xE1DF, 0x5F88, 0xBADC, 0x5F89, 0xE1E0, 0x5F8A, 0xBBB2, + 0x5F8B, 0xC2C9, 0x5F8C, 0xE1E1, 0x5F8D, 0x8FBA, 0x5F8E, 0x8FBB, 0x5F8F, 0x8FBC, 0x5F90, 0xD0EC, 0x5F91, 0x8FBD, 0x5F92, 0xCDBD, + 0x5F93, 0x8FBE, 0x5F94, 0x8FBF, 0x5F95, 0xE1E2, 0x5F96, 0x8FC0, 0x5F97, 0xB5C3, 0x5F98, 0xC5C7, 0x5F99, 0xE1E3, 0x5F9A, 0x8FC1, + 0x5F9B, 0x8FC2, 0x5F9C, 0xE1E4, 0x5F9D, 0x8FC3, 0x5F9E, 0x8FC4, 0x5F9F, 0x8FC5, 0x5FA0, 0x8FC6, 0x5FA1, 0xD3F9, 0x5FA2, 0x8FC7, + 0x5FA3, 0x8FC8, 0x5FA4, 0x8FC9, 0x5FA5, 0x8FCA, 0x5FA6, 0x8FCB, 0x5FA7, 0x8FCC, 0x5FA8, 0xE1E5, 0x5FA9, 0x8FCD, 0x5FAA, 0xD1AD, + 0x5FAB, 0x8FCE, 0x5FAC, 0x8FCF, 0x5FAD, 0xE1E6, 0x5FAE, 0xCEA2, 0x5FAF, 0x8FD0, 0x5FB0, 0x8FD1, 0x5FB1, 0x8FD2, 0x5FB2, 0x8FD3, + 0x5FB3, 0x8FD4, 0x5FB4, 0x8FD5, 0x5FB5, 0xE1E7, 0x5FB6, 0x8FD6, 0x5FB7, 0xB5C2, 0x5FB8, 0x8FD7, 0x5FB9, 0x8FD8, 0x5FBA, 0x8FD9, + 0x5FBB, 0x8FDA, 0x5FBC, 0xE1E8, 0x5FBD, 0xBBD5, 0x5FBE, 0x8FDB, 0x5FBF, 0x8FDC, 0x5FC0, 0x8FDD, 0x5FC1, 0x8FDE, 0x5FC2, 0x8FDF, + 0x5FC3, 0xD0C4, 0x5FC4, 0xE2E0, 0x5FC5, 0xB1D8, 0x5FC6, 0xD2E4, 0x5FC7, 0x8FE0, 0x5FC8, 0x8FE1, 0x5FC9, 0xE2E1, 0x5FCA, 0x8FE2, + 0x5FCB, 0x8FE3, 0x5FCC, 0xBCC9, 0x5FCD, 0xC8CC, 0x5FCE, 0x8FE4, 0x5FCF, 0xE2E3, 0x5FD0, 0xECFE, 0x5FD1, 0xECFD, 0x5FD2, 0xDFAF, + 0x5FD3, 0x8FE5, 0x5FD4, 0x8FE6, 0x5FD5, 0x8FE7, 0x5FD6, 0xE2E2, 0x5FD7, 0xD6BE, 0x5FD8, 0xCDFC, 0x5FD9, 0xC3A6, 0x5FDA, 0x8FE8, + 0x5FDB, 0x8FE9, 0x5FDC, 0x8FEA, 0x5FDD, 0xE3C3, 0x5FDE, 0x8FEB, 0x5FDF, 0x8FEC, 0x5FE0, 0xD6D2, 0x5FE1, 0xE2E7, 0x5FE2, 0x8FED, + 0x5FE3, 0x8FEE, 0x5FE4, 0xE2E8, 0x5FE5, 0x8FEF, 0x5FE6, 0x8FF0, 0x5FE7, 0xD3C7, 0x5FE8, 0x8FF1, 0x5FE9, 0x8FF2, 0x5FEA, 0xE2EC, + 0x5FEB, 0xBFEC, 0x5FEC, 0x8FF3, 0x5FED, 0xE2ED, 0x5FEE, 0xE2E5, 0x5FEF, 0x8FF4, 0x5FF0, 0x8FF5, 0x5FF1, 0xB3C0, 0x5FF2, 0x8FF6, + 0x5FF3, 0x8FF7, 0x5FF4, 0x8FF8, 0x5FF5, 0xC4EE, 0x5FF6, 0x8FF9, 0x5FF7, 0x8FFA, 0x5FF8, 0xE2EE, 0x5FF9, 0x8FFB, 0x5FFA, 0x8FFC, + 0x5FFB, 0xD0C3, 0x5FFC, 0x8FFD, 0x5FFD, 0xBAF6, 0x5FFE, 0xE2E9, 0x5FFF, 0xB7DE, 0x6000, 0xBBB3, 0x6001, 0xCCAC, 0x6002, 0xCBCB, + 0x6003, 0xE2E4, 0x6004, 0xE2E6, 0x6005, 0xE2EA, 0x6006, 0xE2EB, 0x6007, 0x8FFE, 0x6008, 0x9040, 0x6009, 0x9041, 0x600A, 0xE2F7, + 0x600B, 0x9042, 0x600C, 0x9043, 0x600D, 0xE2F4, 0x600E, 0xD4F5, 0x600F, 0xE2F3, 0x6010, 0x9044, 0x6011, 0x9045, 0x6012, 0xC5AD, + 0x6013, 0x9046, 0x6014, 0xD5FA, 0x6015, 0xC5C2, 0x6016, 0xB2C0, 0x6017, 0x9047, 0x6018, 0x9048, 0x6019, 0xE2EF, 0x601A, 0x9049, + 0x601B, 0xE2F2, 0x601C, 0xC1AF, 0x601D, 0xCBBC, 0x601E, 0x904A, 0x601F, 0x904B, 0x6020, 0xB5A1, 0x6021, 0xE2F9, 0x6022, 0x904C, + 0x6023, 0x904D, 0x6024, 0x904E, 0x6025, 0xBCB1, 0x6026, 0xE2F1, 0x6027, 0xD0D4, 0x6028, 0xD4B9, 0x6029, 0xE2F5, 0x602A, 0xB9D6, + 0x602B, 0xE2F6, 0x602C, 0x904F, 0x602D, 0x9050, 0x602E, 0x9051, 0x602F, 0xC7D3, 0x6030, 0x9052, 0x6031, 0x9053, 0x6032, 0x9054, + 0x6033, 0x9055, 0x6034, 0x9056, 0x6035, 0xE2F0, 0x6036, 0x9057, 0x6037, 0x9058, 0x6038, 0x9059, 0x6039, 0x905A, 0x603A, 0x905B, + 0x603B, 0xD7DC, 0x603C, 0xEDA1, 0x603D, 0x905C, 0x603E, 0x905D, 0x603F, 0xE2F8, 0x6040, 0x905E, 0x6041, 0xEDA5, 0x6042, 0xE2FE, + 0x6043, 0xCAD1, 0x6044, 0x905F, 0x6045, 0x9060, 0x6046, 0x9061, 0x6047, 0x9062, 0x6048, 0x9063, 0x6049, 0x9064, 0x604A, 0x9065, + 0x604B, 0xC1B5, 0x604C, 0x9066, 0x604D, 0xBBD0, 0x604E, 0x9067, 0x604F, 0x9068, 0x6050, 0xBFD6, 0x6051, 0x9069, 0x6052, 0xBAE3, + 0x6053, 0x906A, 0x6054, 0x906B, 0x6055, 0xCBA1, 0x6056, 0x906C, 0x6057, 0x906D, 0x6058, 0x906E, 0x6059, 0xEDA6, 0x605A, 0xEDA3, + 0x605B, 0x906F, 0x605C, 0x9070, 0x605D, 0xEDA2, 0x605E, 0x9071, 0x605F, 0x9072, 0x6060, 0x9073, 0x6061, 0x9074, 0x6062, 0xBBD6, + 0x6063, 0xEDA7, 0x6064, 0xD0F4, 0x6065, 0x9075, 0x6066, 0x9076, 0x6067, 0xEDA4, 0x6068, 0xBADE, 0x6069, 0xB6F7, 0x606A, 0xE3A1, + 0x606B, 0xB6B2, 0x606C, 0xCCF1, 0x606D, 0xB9A7, 0x606E, 0x9077, 0x606F, 0xCFA2, 0x6070, 0xC7A1, 0x6071, 0x9078, 0x6072, 0x9079, + 0x6073, 0xBFD2, 0x6074, 0x907A, 0x6075, 0x907B, 0x6076, 0xB6F1, 0x6077, 0x907C, 0x6078, 0xE2FA, 0x6079, 0xE2FB, 0x607A, 0xE2FD, + 0x607B, 0xE2FC, 0x607C, 0xC4D5, 0x607D, 0xE3A2, 0x607E, 0x907D, 0x607F, 0xD3C1, 0x6080, 0x907E, 0x6081, 0x9080, 0x6082, 0x9081, + 0x6083, 0xE3A7, 0x6084, 0xC7C4, 0x6085, 0x9082, 0x6086, 0x9083, 0x6087, 0x9084, 0x6088, 0x9085, 0x6089, 0xCFA4, 0x608A, 0x9086, + 0x608B, 0x9087, 0x608C, 0xE3A9, 0x608D, 0xBAB7, 0x608E, 0x9088, 0x608F, 0x9089, 0x6090, 0x908A, 0x6091, 0x908B, 0x6092, 0xE3A8, + 0x6093, 0x908C, 0x6094, 0xBBDA, 0x6095, 0x908D, 0x6096, 0xE3A3, 0x6097, 0x908E, 0x6098, 0x908F, 0x6099, 0x9090, 0x609A, 0xE3A4, + 0x609B, 0xE3AA, 0x609C, 0x9091, 0x609D, 0xE3A6, 0x609E, 0x9092, 0x609F, 0xCEF2, 0x60A0, 0xD3C6, 0x60A1, 0x9093, 0x60A2, 0x9094, + 0x60A3, 0xBBBC, 0x60A4, 0x9095, 0x60A5, 0x9096, 0x60A6, 0xD4C3, 0x60A7, 0x9097, 0x60A8, 0xC4FA, 0x60A9, 0x9098, 0x60AA, 0x9099, + 0x60AB, 0xEDA8, 0x60AC, 0xD0FC, 0x60AD, 0xE3A5, 0x60AE, 0x909A, 0x60AF, 0xC3F5, 0x60B0, 0x909B, 0x60B1, 0xE3AD, 0x60B2, 0xB1AF, + 0x60B3, 0x909C, 0x60B4, 0xE3B2, 0x60B5, 0x909D, 0x60B6, 0x909E, 0x60B7, 0x909F, 0x60B8, 0xBCC2, 0x60B9, 0x90A0, 0x60BA, 0x90A1, + 0x60BB, 0xE3AC, 0x60BC, 0xB5BF, 0x60BD, 0x90A2, 0x60BE, 0x90A3, 0x60BF, 0x90A4, 0x60C0, 0x90A5, 0x60C1, 0x90A6, 0x60C2, 0x90A7, + 0x60C3, 0x90A8, 0x60C4, 0x90A9, 0x60C5, 0xC7E9, 0x60C6, 0xE3B0, 0x60C7, 0x90AA, 0x60C8, 0x90AB, 0x60C9, 0x90AC, 0x60CA, 0xBEAA, + 0x60CB, 0xCDEF, 0x60CC, 0x90AD, 0x60CD, 0x90AE, 0x60CE, 0x90AF, 0x60CF, 0x90B0, 0x60D0, 0x90B1, 0x60D1, 0xBBF3, 0x60D2, 0x90B2, + 0x60D3, 0x90B3, 0x60D4, 0x90B4, 0x60D5, 0xCCE8, 0x60D6, 0x90B5, 0x60D7, 0x90B6, 0x60D8, 0xE3AF, 0x60D9, 0x90B7, 0x60DA, 0xE3B1, + 0x60DB, 0x90B8, 0x60DC, 0xCFA7, 0x60DD, 0xE3AE, 0x60DE, 0x90B9, 0x60DF, 0xCEA9, 0x60E0, 0xBBDD, 0x60E1, 0x90BA, 0x60E2, 0x90BB, + 0x60E3, 0x90BC, 0x60E4, 0x90BD, 0x60E5, 0x90BE, 0x60E6, 0xB5EB, 0x60E7, 0xBEE5, 0x60E8, 0xB2D2, 0x60E9, 0xB3CD, 0x60EA, 0x90BF, + 0x60EB, 0xB1B9, 0x60EC, 0xE3AB, 0x60ED, 0xB2D1, 0x60EE, 0xB5AC, 0x60EF, 0xB9DF, 0x60F0, 0xB6E8, 0x60F1, 0x90C0, 0x60F2, 0x90C1, + 0x60F3, 0xCFEB, 0x60F4, 0xE3B7, 0x60F5, 0x90C2, 0x60F6, 0xBBCC, 0x60F7, 0x90C3, 0x60F8, 0x90C4, 0x60F9, 0xC8C7, 0x60FA, 0xD0CA, + 0x60FB, 0x90C5, 0x60FC, 0x90C6, 0x60FD, 0x90C7, 0x60FE, 0x90C8, 0x60FF, 0x90C9, 0x6100, 0xE3B8, 0x6101, 0xB3EE, 0x6102, 0x90CA, + 0x6103, 0x90CB, 0x6104, 0x90CC, 0x6105, 0x90CD, 0x6106, 0xEDA9, 0x6107, 0x90CE, 0x6108, 0xD3FA, 0x6109, 0xD3E4, 0x610A, 0x90CF, + 0x610B, 0x90D0, 0x610C, 0x90D1, 0x610D, 0xEDAA, 0x610E, 0xE3B9, 0x610F, 0xD2E2, 0x6110, 0x90D2, 0x6111, 0x90D3, 0x6112, 0x90D4, + 0x6113, 0x90D5, 0x6114, 0x90D6, 0x6115, 0xE3B5, 0x6116, 0x90D7, 0x6117, 0x90D8, 0x6118, 0x90D9, 0x6119, 0x90DA, 0x611A, 0xD3DE, + 0x611B, 0x90DB, 0x611C, 0x90DC, 0x611D, 0x90DD, 0x611E, 0x90DE, 0x611F, 0xB8D0, 0x6120, 0xE3B3, 0x6121, 0x90DF, 0x6122, 0x90E0, + 0x6123, 0xE3B6, 0x6124, 0xB7DF, 0x6125, 0x90E1, 0x6126, 0xE3B4, 0x6127, 0xC0A2, 0x6128, 0x90E2, 0x6129, 0x90E3, 0x612A, 0x90E4, + 0x612B, 0xE3BA, 0x612C, 0x90E5, 0x612D, 0x90E6, 0x612E, 0x90E7, 0x612F, 0x90E8, 0x6130, 0x90E9, 0x6131, 0x90EA, 0x6132, 0x90EB, + 0x6133, 0x90EC, 0x6134, 0x90ED, 0x6135, 0x90EE, 0x6136, 0x90EF, 0x6137, 0x90F0, 0x6138, 0x90F1, 0x6139, 0x90F2, 0x613A, 0x90F3, + 0x613B, 0x90F4, 0x613C, 0x90F5, 0x613D, 0x90F6, 0x613E, 0x90F7, 0x613F, 0xD4B8, 0x6140, 0x90F8, 0x6141, 0x90F9, 0x6142, 0x90FA, + 0x6143, 0x90FB, 0x6144, 0x90FC, 0x6145, 0x90FD, 0x6146, 0x90FE, 0x6147, 0x9140, 0x6148, 0xB4C8, 0x6149, 0x9141, 0x614A, 0xE3BB, + 0x614B, 0x9142, 0x614C, 0xBBC5, 0x614D, 0x9143, 0x614E, 0xC9F7, 0x614F, 0x9144, 0x6150, 0x9145, 0x6151, 0xC9E5, 0x6152, 0x9146, + 0x6153, 0x9147, 0x6154, 0x9148, 0x6155, 0xC4BD, 0x6156, 0x9149, 0x6157, 0x914A, 0x6158, 0x914B, 0x6159, 0x914C, 0x615A, 0x914D, + 0x615B, 0x914E, 0x615C, 0x914F, 0x615D, 0xEDAB, 0x615E, 0x9150, 0x615F, 0x9151, 0x6160, 0x9152, 0x6161, 0x9153, 0x6162, 0xC2FD, + 0x6163, 0x9154, 0x6164, 0x9155, 0x6165, 0x9156, 0x6166, 0x9157, 0x6167, 0xBBDB, 0x6168, 0xBFAE, 0x6169, 0x9158, 0x616A, 0x9159, + 0x616B, 0x915A, 0x616C, 0x915B, 0x616D, 0x915C, 0x616E, 0x915D, 0x616F, 0x915E, 0x6170, 0xCEBF, 0x6171, 0x915F, 0x6172, 0x9160, + 0x6173, 0x9161, 0x6174, 0x9162, 0x6175, 0xE3BC, 0x6176, 0x9163, 0x6177, 0xBFB6, 0x6178, 0x9164, 0x6179, 0x9165, 0x617A, 0x9166, + 0x617B, 0x9167, 0x617C, 0x9168, 0x617D, 0x9169, 0x617E, 0x916A, 0x617F, 0x916B, 0x6180, 0x916C, 0x6181, 0x916D, 0x6182, 0x916E, + 0x6183, 0x916F, 0x6184, 0x9170, 0x6185, 0x9171, 0x6186, 0x9172, 0x6187, 0x9173, 0x6188, 0x9174, 0x6189, 0x9175, 0x618A, 0x9176, + 0x618B, 0xB1EF, 0x618C, 0x9177, 0x618D, 0x9178, 0x618E, 0xD4F7, 0x618F, 0x9179, 0x6190, 0x917A, 0x6191, 0x917B, 0x6192, 0x917C, + 0x6193, 0x917D, 0x6194, 0xE3BE, 0x6195, 0x917E, 0x6196, 0x9180, 0x6197, 0x9181, 0x6198, 0x9182, 0x6199, 0x9183, 0x619A, 0x9184, + 0x619B, 0x9185, 0x619C, 0x9186, 0x619D, 0xEDAD, 0x619E, 0x9187, 0x619F, 0x9188, 0x61A0, 0x9189, 0x61A1, 0x918A, 0x61A2, 0x918B, + 0x61A3, 0x918C, 0x61A4, 0x918D, 0x61A5, 0x918E, 0x61A6, 0x918F, 0x61A7, 0xE3BF, 0x61A8, 0xBAA9, 0x61A9, 0xEDAC, 0x61AA, 0x9190, + 0x61AB, 0x9191, 0x61AC, 0xE3BD, 0x61AD, 0x9192, 0x61AE, 0x9193, 0x61AF, 0x9194, 0x61B0, 0x9195, 0x61B1, 0x9196, 0x61B2, 0x9197, + 0x61B3, 0x9198, 0x61B4, 0x9199, 0x61B5, 0x919A, 0x61B6, 0x919B, 0x61B7, 0xE3C0, 0x61B8, 0x919C, 0x61B9, 0x919D, 0x61BA, 0x919E, + 0x61BB, 0x919F, 0x61BC, 0x91A0, 0x61BD, 0x91A1, 0x61BE, 0xBAB6, 0x61BF, 0x91A2, 0x61C0, 0x91A3, 0x61C1, 0x91A4, 0x61C2, 0xB6AE, + 0x61C3, 0x91A5, 0x61C4, 0x91A6, 0x61C5, 0x91A7, 0x61C6, 0x91A8, 0x61C7, 0x91A9, 0x61C8, 0xD0B8, 0x61C9, 0x91AA, 0x61CA, 0xB0C3, + 0x61CB, 0xEDAE, 0x61CC, 0x91AB, 0x61CD, 0x91AC, 0x61CE, 0x91AD, 0x61CF, 0x91AE, 0x61D0, 0x91AF, 0x61D1, 0xEDAF, 0x61D2, 0xC0C1, + 0x61D3, 0x91B0, 0x61D4, 0xE3C1, 0x61D5, 0x91B1, 0x61D6, 0x91B2, 0x61D7, 0x91B3, 0x61D8, 0x91B4, 0x61D9, 0x91B5, 0x61DA, 0x91B6, + 0x61DB, 0x91B7, 0x61DC, 0x91B8, 0x61DD, 0x91B9, 0x61DE, 0x91BA, 0x61DF, 0x91BB, 0x61E0, 0x91BC, 0x61E1, 0x91BD, 0x61E2, 0x91BE, + 0x61E3, 0x91BF, 0x61E4, 0x91C0, 0x61E5, 0x91C1, 0x61E6, 0xC5B3, 0x61E7, 0x91C2, 0x61E8, 0x91C3, 0x61E9, 0x91C4, 0x61EA, 0x91C5, + 0x61EB, 0x91C6, 0x61EC, 0x91C7, 0x61ED, 0x91C8, 0x61EE, 0x91C9, 0x61EF, 0x91CA, 0x61F0, 0x91CB, 0x61F1, 0x91CC, 0x61F2, 0x91CD, + 0x61F3, 0x91CE, 0x61F4, 0x91CF, 0x61F5, 0xE3C2, 0x61F6, 0x91D0, 0x61F7, 0x91D1, 0x61F8, 0x91D2, 0x61F9, 0x91D3, 0x61FA, 0x91D4, + 0x61FB, 0x91D5, 0x61FC, 0x91D6, 0x61FD, 0x91D7, 0x61FE, 0x91D8, 0x61FF, 0xDCB2, 0x6200, 0x91D9, 0x6201, 0x91DA, 0x6202, 0x91DB, + 0x6203, 0x91DC, 0x6204, 0x91DD, 0x6205, 0x91DE, 0x6206, 0xEDB0, 0x6207, 0x91DF, 0x6208, 0xB8EA, 0x6209, 0x91E0, 0x620A, 0xCEEC, + 0x620B, 0xEAA7, 0x620C, 0xD0E7, 0x620D, 0xCAF9, 0x620E, 0xC8D6, 0x620F, 0xCFB7, 0x6210, 0xB3C9, 0x6211, 0xCED2, 0x6212, 0xBDE4, + 0x6213, 0x91E1, 0x6214, 0x91E2, 0x6215, 0xE3DE, 0x6216, 0xBBF2, 0x6217, 0xEAA8, 0x6218, 0xD5BD, 0x6219, 0x91E3, 0x621A, 0xC6DD, + 0x621B, 0xEAA9, 0x621C, 0x91E4, 0x621D, 0x91E5, 0x621E, 0x91E6, 0x621F, 0xEAAA, 0x6220, 0x91E7, 0x6221, 0xEAAC, 0x6222, 0xEAAB, + 0x6223, 0x91E8, 0x6224, 0xEAAE, 0x6225, 0xEAAD, 0x6226, 0x91E9, 0x6227, 0x91EA, 0x6228, 0x91EB, 0x6229, 0x91EC, 0x622A, 0xBDD8, + 0x622B, 0x91ED, 0x622C, 0xEAAF, 0x622D, 0x91EE, 0x622E, 0xC2BE, 0x622F, 0x91EF, 0x6230, 0x91F0, 0x6231, 0x91F1, 0x6232, 0x91F2, + 0x6233, 0xB4C1, 0x6234, 0xB4F7, 0x6235, 0x91F3, 0x6236, 0x91F4, 0x6237, 0xBBA7, 0x6238, 0x91F5, 0x6239, 0x91F6, 0x623A, 0x91F7, + 0x623B, 0x91F8, 0x623C, 0x91F9, 0x623D, 0xECE6, 0x623E, 0xECE5, 0x623F, 0xB7BF, 0x6240, 0xCBF9, 0x6241, 0xB1E2, 0x6242, 0x91FA, + 0x6243, 0xECE7, 0x6244, 0x91FB, 0x6245, 0x91FC, 0x6246, 0x91FD, 0x6247, 0xC9C8, 0x6248, 0xECE8, 0x6249, 0xECE9, 0x624A, 0x91FE, + 0x624B, 0xCAD6, 0x624C, 0xDED0, 0x624D, 0xB2C5, 0x624E, 0xD4FA, 0x624F, 0x9240, 0x6250, 0x9241, 0x6251, 0xC6CB, 0x6252, 0xB0C7, + 0x6253, 0xB4F2, 0x6254, 0xC8D3, 0x6255, 0x9242, 0x6256, 0x9243, 0x6257, 0x9244, 0x6258, 0xCDD0, 0x6259, 0x9245, 0x625A, 0x9246, + 0x625B, 0xBFB8, 0x625C, 0x9247, 0x625D, 0x9248, 0x625E, 0x9249, 0x625F, 0x924A, 0x6260, 0x924B, 0x6261, 0x924C, 0x6262, 0x924D, + 0x6263, 0xBFDB, 0x6264, 0x924E, 0x6265, 0x924F, 0x6266, 0xC7A4, 0x6267, 0xD6B4, 0x6268, 0x9250, 0x6269, 0xC0A9, 0x626A, 0xDED1, + 0x626B, 0xC9A8, 0x626C, 0xD1EF, 0x626D, 0xC5A4, 0x626E, 0xB0E7, 0x626F, 0xB3B6, 0x6270, 0xC8C5, 0x6271, 0x9251, 0x6272, 0x9252, + 0x6273, 0xB0E2, 0x6274, 0x9253, 0x6275, 0x9254, 0x6276, 0xB7F6, 0x6277, 0x9255, 0x6278, 0x9256, 0x6279, 0xC5FA, 0x627A, 0x9257, + 0x627B, 0x9258, 0x627C, 0xB6F3, 0x627D, 0x9259, 0x627E, 0xD5D2, 0x627F, 0xB3D0, 0x6280, 0xBCBC, 0x6281, 0x925A, 0x6282, 0x925B, + 0x6283, 0x925C, 0x6284, 0xB3AD, 0x6285, 0x925D, 0x6286, 0x925E, 0x6287, 0x925F, 0x6288, 0x9260, 0x6289, 0xBEF1, 0x628A, 0xB0D1, + 0x628B, 0x9261, 0x628C, 0x9262, 0x628D, 0x9263, 0x628E, 0x9264, 0x628F, 0x9265, 0x6290, 0x9266, 0x6291, 0xD2D6, 0x6292, 0xCAE3, + 0x6293, 0xD7A5, 0x6294, 0x9267, 0x6295, 0xCDB6, 0x6296, 0xB6B6, 0x6297, 0xBFB9, 0x6298, 0xD5DB, 0x6299, 0x9268, 0x629A, 0xB8A7, + 0x629B, 0xC5D7, 0x629C, 0x9269, 0x629D, 0x926A, 0x629E, 0x926B, 0x629F, 0xDED2, 0x62A0, 0xBFD9, 0x62A1, 0xC2D5, 0x62A2, 0xC7C0, + 0x62A3, 0x926C, 0x62A4, 0xBBA4, 0x62A5, 0xB1A8, 0x62A6, 0x926D, 0x62A7, 0x926E, 0x62A8, 0xC5EA, 0x62A9, 0x926F, 0x62AA, 0x9270, + 0x62AB, 0xC5FB, 0x62AC, 0xCCA7, 0x62AD, 0x9271, 0x62AE, 0x9272, 0x62AF, 0x9273, 0x62B0, 0x9274, 0x62B1, 0xB1A7, 0x62B2, 0x9275, + 0x62B3, 0x9276, 0x62B4, 0x9277, 0x62B5, 0xB5D6, 0x62B6, 0x9278, 0x62B7, 0x9279, 0x62B8, 0x927A, 0x62B9, 0xC4A8, 0x62BA, 0x927B, + 0x62BB, 0xDED3, 0x62BC, 0xD1BA, 0x62BD, 0xB3E9, 0x62BE, 0x927C, 0x62BF, 0xC3F2, 0x62C0, 0x927D, 0x62C1, 0x927E, 0x62C2, 0xB7F7, + 0x62C3, 0x9280, 0x62C4, 0xD6F4, 0x62C5, 0xB5A3, 0x62C6, 0xB2F0, 0x62C7, 0xC4B4, 0x62C8, 0xC4E9, 0x62C9, 0xC0AD, 0x62CA, 0xDED4, + 0x62CB, 0x9281, 0x62CC, 0xB0E8, 0x62CD, 0xC5C4, 0x62CE, 0xC1E0, 0x62CF, 0x9282, 0x62D0, 0xB9D5, 0x62D1, 0x9283, 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, 0x62D4, 0xB0CE, 0x62D5, 0x9284, 0x62D6, 0xCDCF, 0x62D7, 0xDED6, 0x62D8, 0xBED0, 0x62D9, 0xD7BE, 0x62DA, 0xDED5, + 0x62DB, 0xD5D0, 0x62DC, 0xB0DD, 0x62DD, 0x9285, 0x62DE, 0x9286, 0x62DF, 0xC4E2, 0x62E0, 0x9287, 0x62E1, 0x9288, 0x62E2, 0xC2A3, + 0x62E3, 0xBCF0, 0x62E4, 0x9289, 0x62E5, 0xD3B5, 0x62E6, 0xC0B9, 0x62E7, 0xC5A1, 0x62E8, 0xB2A6, 0x62E9, 0xD4F1, 0x62EA, 0x928A, + 0x62EB, 0x928B, 0x62EC, 0xC0A8, 0x62ED, 0xCAC3, 0x62EE, 0xDED7, 0x62EF, 0xD5FC, 0x62F0, 0x928C, 0x62F1, 0xB9B0, 0x62F2, 0x928D, + 0x62F3, 0xC8AD, 0x62F4, 0xCBA9, 0x62F5, 0x928E, 0x62F6, 0xDED9, 0x62F7, 0xBFBD, 0x62F8, 0x928F, 0x62F9, 0x9290, 0x62FA, 0x9291, + 0x62FB, 0x9292, 0x62FC, 0xC6B4, 0x62FD, 0xD7A7, 0x62FE, 0xCAB0, 0x62FF, 0xC4C3, 0x6300, 0x9293, 0x6301, 0xB3D6, 0x6302, 0xB9D2, + 0x6303, 0x9294, 0x6304, 0x9295, 0x6305, 0x9296, 0x6306, 0x9297, 0x6307, 0xD6B8, 0x6308, 0xEAFC, 0x6309, 0xB0B4, 0x630A, 0x9298, + 0x630B, 0x9299, 0x630C, 0x929A, 0x630D, 0x929B, 0x630E, 0xBFE6, 0x630F, 0x929C, 0x6310, 0x929D, 0x6311, 0xCCF4, 0x6312, 0x929E, + 0x6313, 0x929F, 0x6314, 0x92A0, 0x6315, 0x92A1, 0x6316, 0xCDDA, 0x6317, 0x92A2, 0x6318, 0x92A3, 0x6319, 0x92A4, 0x631A, 0xD6BF, + 0x631B, 0xC2CE, 0x631C, 0x92A5, 0x631D, 0xCECE, 0x631E, 0xCCA2, 0x631F, 0xD0AE, 0x6320, 0xC4D3, 0x6321, 0xB5B2, 0x6322, 0xDED8, + 0x6323, 0xD5F5, 0x6324, 0xBCB7, 0x6325, 0xBBD3, 0x6326, 0x92A6, 0x6327, 0x92A7, 0x6328, 0xB0A4, 0x6329, 0x92A8, 0x632A, 0xC5B2, + 0x632B, 0xB4EC, 0x632C, 0x92A9, 0x632D, 0x92AA, 0x632E, 0x92AB, 0x632F, 0xD5F1, 0x6330, 0x92AC, 0x6331, 0x92AD, 0x6332, 0xEAFD, + 0x6333, 0x92AE, 0x6334, 0x92AF, 0x6335, 0x92B0, 0x6336, 0x92B1, 0x6337, 0x92B2, 0x6338, 0x92B3, 0x6339, 0xDEDA, 0x633A, 0xCDA6, + 0x633B, 0x92B4, 0x633C, 0x92B5, 0x633D, 0xCDEC, 0x633E, 0x92B6, 0x633F, 0x92B7, 0x6340, 0x92B8, 0x6341, 0x92B9, 0x6342, 0xCEE6, + 0x6343, 0xDEDC, 0x6344, 0x92BA, 0x6345, 0xCDB1, 0x6346, 0xC0A6, 0x6347, 0x92BB, 0x6348, 0x92BC, 0x6349, 0xD7BD, 0x634A, 0x92BD, + 0x634B, 0xDEDB, 0x634C, 0xB0C6, 0x634D, 0xBAB4, 0x634E, 0xC9D3, 0x634F, 0xC4F3, 0x6350, 0xBEE8, 0x6351, 0x92BE, 0x6352, 0x92BF, + 0x6353, 0x92C0, 0x6354, 0x92C1, 0x6355, 0xB2B6, 0x6356, 0x92C2, 0x6357, 0x92C3, 0x6358, 0x92C4, 0x6359, 0x92C5, 0x635A, 0x92C6, + 0x635B, 0x92C7, 0x635C, 0x92C8, 0x635D, 0x92C9, 0x635E, 0xC0CC, 0x635F, 0xCBF0, 0x6360, 0x92CA, 0x6361, 0xBCF1, 0x6362, 0xBBBB, + 0x6363, 0xB5B7, 0x6364, 0x92CB, 0x6365, 0x92CC, 0x6366, 0x92CD, 0x6367, 0xC5F5, 0x6368, 0x92CE, 0x6369, 0xDEE6, 0x636A, 0x92CF, + 0x636B, 0x92D0, 0x636C, 0x92D1, 0x636D, 0xDEE3, 0x636E, 0xBEDD, 0x636F, 0x92D2, 0x6370, 0x92D3, 0x6371, 0xDEDF, 0x6372, 0x92D4, + 0x6373, 0x92D5, 0x6374, 0x92D6, 0x6375, 0x92D7, 0x6376, 0xB4B7, 0x6377, 0xBDDD, 0x6378, 0x92D8, 0x6379, 0x92D9, 0x637A, 0xDEE0, + 0x637B, 0xC4ED, 0x637C, 0x92DA, 0x637D, 0x92DB, 0x637E, 0x92DC, 0x637F, 0x92DD, 0x6380, 0xCFC6, 0x6381, 0x92DE, 0x6382, 0xB5E0, + 0x6383, 0x92DF, 0x6384, 0x92E0, 0x6385, 0x92E1, 0x6386, 0x92E2, 0x6387, 0xB6DE, 0x6388, 0xCADA, 0x6389, 0xB5F4, 0x638A, 0xDEE5, + 0x638B, 0x92E3, 0x638C, 0xD5C6, 0x638D, 0x92E4, 0x638E, 0xDEE1, 0x638F, 0xCCCD, 0x6390, 0xC6FE, 0x6391, 0x92E5, 0x6392, 0xC5C5, + 0x6393, 0x92E6, 0x6394, 0x92E7, 0x6395, 0x92E8, 0x6396, 0xD2B4, 0x6397, 0x92E9, 0x6398, 0xBEF2, 0x6399, 0x92EA, 0x639A, 0x92EB, + 0x639B, 0x92EC, 0x639C, 0x92ED, 0x639D, 0x92EE, 0x639E, 0x92EF, 0x639F, 0x92F0, 0x63A0, 0xC2D3, 0x63A1, 0x92F1, 0x63A2, 0xCCBD, + 0x63A3, 0xB3B8, 0x63A4, 0x92F2, 0x63A5, 0xBDD3, 0x63A6, 0x92F3, 0x63A7, 0xBFD8, 0x63A8, 0xCDC6, 0x63A9, 0xD1DA, 0x63AA, 0xB4EB, + 0x63AB, 0x92F4, 0x63AC, 0xDEE4, 0x63AD, 0xDEDD, 0x63AE, 0xDEE7, 0x63AF, 0x92F5, 0x63B0, 0xEAFE, 0x63B1, 0x92F6, 0x63B2, 0x92F7, + 0x63B3, 0xC2B0, 0x63B4, 0xDEE2, 0x63B5, 0x92F8, 0x63B6, 0x92F9, 0x63B7, 0xD6C0, 0x63B8, 0xB5A7, 0x63B9, 0x92FA, 0x63BA, 0xB2F4, + 0x63BB, 0x92FB, 0x63BC, 0xDEE8, 0x63BD, 0x92FC, 0x63BE, 0xDEF2, 0x63BF, 0x92FD, 0x63C0, 0x92FE, 0x63C1, 0x9340, 0x63C2, 0x9341, + 0x63C3, 0x9342, 0x63C4, 0xDEED, 0x63C5, 0x9343, 0x63C6, 0xDEF1, 0x63C7, 0x9344, 0x63C8, 0x9345, 0x63C9, 0xC8E0, 0x63CA, 0x9346, + 0x63CB, 0x9347, 0x63CC, 0x9348, 0x63CD, 0xD7E1, 0x63CE, 0xDEEF, 0x63CF, 0xC3E8, 0x63D0, 0xCCE1, 0x63D1, 0x9349, 0x63D2, 0xB2E5, + 0x63D3, 0x934A, 0x63D4, 0x934B, 0x63D5, 0x934C, 0x63D6, 0xD2BE, 0x63D7, 0x934D, 0x63D8, 0x934E, 0x63D9, 0x934F, 0x63DA, 0x9350, + 0x63DB, 0x9351, 0x63DC, 0x9352, 0x63DD, 0x9353, 0x63DE, 0xDEEE, 0x63DF, 0x9354, 0x63E0, 0xDEEB, 0x63E1, 0xCED5, 0x63E2, 0x9355, + 0x63E3, 0xB4A7, 0x63E4, 0x9356, 0x63E5, 0x9357, 0x63E6, 0x9358, 0x63E7, 0x9359, 0x63E8, 0x935A, 0x63E9, 0xBFAB, 0x63EA, 0xBEBE, + 0x63EB, 0x935B, 0x63EC, 0x935C, 0x63ED, 0xBDD2, 0x63EE, 0x935D, 0x63EF, 0x935E, 0x63F0, 0x935F, 0x63F1, 0x9360, 0x63F2, 0xDEE9, + 0x63F3, 0x9361, 0x63F4, 0xD4AE, 0x63F5, 0x9362, 0x63F6, 0xDEDE, 0x63F7, 0x9363, 0x63F8, 0xDEEA, 0x63F9, 0x9364, 0x63FA, 0x9365, + 0x63FB, 0x9366, 0x63FC, 0x9367, 0x63FD, 0xC0BF, 0x63FE, 0x9368, 0x63FF, 0xDEEC, 0x6400, 0xB2F3, 0x6401, 0xB8E9, 0x6402, 0xC2A7, + 0x6403, 0x9369, 0x6404, 0x936A, 0x6405, 0xBDC1, 0x6406, 0x936B, 0x6407, 0x936C, 0x6408, 0x936D, 0x6409, 0x936E, 0x640A, 0x936F, + 0x640B, 0xDEF5, 0x640C, 0xDEF8, 0x640D, 0x9370, 0x640E, 0x9371, 0x640F, 0xB2AB, 0x6410, 0xB4A4, 0x6411, 0x9372, 0x6412, 0x9373, + 0x6413, 0xB4EA, 0x6414, 0xC9A6, 0x6415, 0x9374, 0x6416, 0x9375, 0x6417, 0x9376, 0x6418, 0x9377, 0x6419, 0x9378, 0x641A, 0x9379, + 0x641B, 0xDEF6, 0x641C, 0xCBD1, 0x641D, 0x937A, 0x641E, 0xB8E3, 0x641F, 0x937B, 0x6420, 0xDEF7, 0x6421, 0xDEFA, 0x6422, 0x937C, + 0x6423, 0x937D, 0x6424, 0x937E, 0x6425, 0x9380, 0x6426, 0xDEF9, 0x6427, 0x9381, 0x6428, 0x9382, 0x6429, 0x9383, 0x642A, 0xCCC2, + 0x642B, 0x9384, 0x642C, 0xB0E1, 0x642D, 0xB4EE, 0x642E, 0x9385, 0x642F, 0x9386, 0x6430, 0x9387, 0x6431, 0x9388, 0x6432, 0x9389, + 0x6433, 0x938A, 0x6434, 0xE5BA, 0x6435, 0x938B, 0x6436, 0x938C, 0x6437, 0x938D, 0x6438, 0x938E, 0x6439, 0x938F, 0x643A, 0xD0AF, + 0x643B, 0x9390, 0x643C, 0x9391, 0x643D, 0xB2EB, 0x643E, 0x9392, 0x643F, 0xEBA1, 0x6440, 0x9393, 0x6441, 0xDEF4, 0x6442, 0x9394, + 0x6443, 0x9395, 0x6444, 0xC9E3, 0x6445, 0xDEF3, 0x6446, 0xB0DA, 0x6447, 0xD2A1, 0x6448, 0xB1F7, 0x6449, 0x9396, 0x644A, 0xCCAF, + 0x644B, 0x9397, 0x644C, 0x9398, 0x644D, 0x9399, 0x644E, 0x939A, 0x644F, 0x939B, 0x6450, 0x939C, 0x6451, 0x939D, 0x6452, 0xDEF0, + 0x6453, 0x939E, 0x6454, 0xCBA4, 0x6455, 0x939F, 0x6456, 0x93A0, 0x6457, 0x93A1, 0x6458, 0xD5AA, 0x6459, 0x93A2, 0x645A, 0x93A3, + 0x645B, 0x93A4, 0x645C, 0x93A5, 0x645D, 0x93A6, 0x645E, 0xDEFB, 0x645F, 0x93A7, 0x6460, 0x93A8, 0x6461, 0x93A9, 0x6462, 0x93AA, + 0x6463, 0x93AB, 0x6464, 0x93AC, 0x6465, 0x93AD, 0x6466, 0x93AE, 0x6467, 0xB4DD, 0x6468, 0x93AF, 0x6469, 0xC4A6, 0x646A, 0x93B0, + 0x646B, 0x93B1, 0x646C, 0x93B2, 0x646D, 0xDEFD, 0x646E, 0x93B3, 0x646F, 0x93B4, 0x6470, 0x93B5, 0x6471, 0x93B6, 0x6472, 0x93B7, + 0x6473, 0x93B8, 0x6474, 0x93B9, 0x6475, 0x93BA, 0x6476, 0x93BB, 0x6477, 0x93BC, 0x6478, 0xC3FE, 0x6479, 0xC4A1, 0x647A, 0xDFA1, + 0x647B, 0x93BD, 0x647C, 0x93BE, 0x647D, 0x93BF, 0x647E, 0x93C0, 0x647F, 0x93C1, 0x6480, 0x93C2, 0x6481, 0x93C3, 0x6482, 0xC1CC, + 0x6483, 0x93C4, 0x6484, 0xDEFC, 0x6485, 0xBEEF, 0x6486, 0x93C5, 0x6487, 0xC6B2, 0x6488, 0x93C6, 0x6489, 0x93C7, 0x648A, 0x93C8, + 0x648B, 0x93C9, 0x648C, 0x93CA, 0x648D, 0x93CB, 0x648E, 0x93CC, 0x648F, 0x93CD, 0x6490, 0x93CE, 0x6491, 0xB3C5, 0x6492, 0xC8F6, + 0x6493, 0x93CF, 0x6494, 0x93D0, 0x6495, 0xCBBA, 0x6496, 0xDEFE, 0x6497, 0x93D1, 0x6498, 0x93D2, 0x6499, 0xDFA4, 0x649A, 0x93D3, + 0x649B, 0x93D4, 0x649C, 0x93D5, 0x649D, 0x93D6, 0x649E, 0xD7B2, 0x649F, 0x93D7, 0x64A0, 0x93D8, 0x64A1, 0x93D9, 0x64A2, 0x93DA, + 0x64A3, 0x93DB, 0x64A4, 0xB3B7, 0x64A5, 0x93DC, 0x64A6, 0x93DD, 0x64A7, 0x93DE, 0x64A8, 0x93DF, 0x64A9, 0xC1C3, 0x64AA, 0x93E0, + 0x64AB, 0x93E1, 0x64AC, 0xC7CB, 0x64AD, 0xB2A5, 0x64AE, 0xB4E9, 0x64AF, 0x93E2, 0x64B0, 0xD7AB, 0x64B1, 0x93E3, 0x64B2, 0x93E4, + 0x64B3, 0x93E5, 0x64B4, 0x93E6, 0x64B5, 0xC4EC, 0x64B6, 0x93E7, 0x64B7, 0xDFA2, 0x64B8, 0xDFA3, 0x64B9, 0x93E8, 0x64BA, 0xDFA5, + 0x64BB, 0x93E9, 0x64BC, 0xBAB3, 0x64BD, 0x93EA, 0x64BE, 0x93EB, 0x64BF, 0x93EC, 0x64C0, 0xDFA6, 0x64C1, 0x93ED, 0x64C2, 0xC0DE, + 0x64C3, 0x93EE, 0x64C4, 0x93EF, 0x64C5, 0xC9C3, 0x64C6, 0x93F0, 0x64C7, 0x93F1, 0x64C8, 0x93F2, 0x64C9, 0x93F3, 0x64CA, 0x93F4, + 0x64CB, 0x93F5, 0x64CC, 0x93F6, 0x64CD, 0xB2D9, 0x64CE, 0xC7E6, 0x64CF, 0x93F7, 0x64D0, 0xDFA7, 0x64D1, 0x93F8, 0x64D2, 0xC7DC, + 0x64D3, 0x93F9, 0x64D4, 0x93FA, 0x64D5, 0x93FB, 0x64D6, 0x93FC, 0x64D7, 0xDFA8, 0x64D8, 0xEBA2, 0x64D9, 0x93FD, 0x64DA, 0x93FE, + 0x64DB, 0x9440, 0x64DC, 0x9441, 0x64DD, 0x9442, 0x64DE, 0xCBD3, 0x64DF, 0x9443, 0x64E0, 0x9444, 0x64E1, 0x9445, 0x64E2, 0xDFAA, + 0x64E3, 0x9446, 0x64E4, 0xDFA9, 0x64E5, 0x9447, 0x64E6, 0xB2C1, 0x64E7, 0x9448, 0x64E8, 0x9449, 0x64E9, 0x944A, 0x64EA, 0x944B, + 0x64EB, 0x944C, 0x64EC, 0x944D, 0x64ED, 0x944E, 0x64EE, 0x944F, 0x64EF, 0x9450, 0x64F0, 0x9451, 0x64F1, 0x9452, 0x64F2, 0x9453, + 0x64F3, 0x9454, 0x64F4, 0x9455, 0x64F5, 0x9456, 0x64F6, 0x9457, 0x64F7, 0x9458, 0x64F8, 0x9459, 0x64F9, 0x945A, 0x64FA, 0x945B, + 0x64FB, 0x945C, 0x64FC, 0x945D, 0x64FD, 0x945E, 0x64FE, 0x945F, 0x64FF, 0x9460, 0x6500, 0xC5CA, 0x6501, 0x9461, 0x6502, 0x9462, + 0x6503, 0x9463, 0x6504, 0x9464, 0x6505, 0x9465, 0x6506, 0x9466, 0x6507, 0x9467, 0x6508, 0x9468, 0x6509, 0xDFAB, 0x650A, 0x9469, + 0x650B, 0x946A, 0x650C, 0x946B, 0x650D, 0x946C, 0x650E, 0x946D, 0x650F, 0x946E, 0x6510, 0x946F, 0x6511, 0x9470, 0x6512, 0xD4DC, + 0x6513, 0x9471, 0x6514, 0x9472, 0x6515, 0x9473, 0x6516, 0x9474, 0x6517, 0x9475, 0x6518, 0xC8C1, 0x6519, 0x9476, 0x651A, 0x9477, + 0x651B, 0x9478, 0x651C, 0x9479, 0x651D, 0x947A, 0x651E, 0x947B, 0x651F, 0x947C, 0x6520, 0x947D, 0x6521, 0x947E, 0x6522, 0x9480, + 0x6523, 0x9481, 0x6524, 0x9482, 0x6525, 0xDFAC, 0x6526, 0x9483, 0x6527, 0x9484, 0x6528, 0x9485, 0x6529, 0x9486, 0x652A, 0x9487, + 0x652B, 0xBEF0, 0x652C, 0x9488, 0x652D, 0x9489, 0x652E, 0xDFAD, 0x652F, 0xD6A7, 0x6530, 0x948A, 0x6531, 0x948B, 0x6532, 0x948C, + 0x6533, 0x948D, 0x6534, 0xEAB7, 0x6535, 0xEBB6, 0x6536, 0xCAD5, 0x6537, 0x948E, 0x6538, 0xD8FC, 0x6539, 0xB8C4, 0x653A, 0x948F, + 0x653B, 0xB9A5, 0x653C, 0x9490, 0x653D, 0x9491, 0x653E, 0xB7C5, 0x653F, 0xD5FE, 0x6540, 0x9492, 0x6541, 0x9493, 0x6542, 0x9494, + 0x6543, 0x9495, 0x6544, 0x9496, 0x6545, 0xB9CA, 0x6546, 0x9497, 0x6547, 0x9498, 0x6548, 0xD0A7, 0x6549, 0xF4CD, 0x654A, 0x9499, + 0x654B, 0x949A, 0x654C, 0xB5D0, 0x654D, 0x949B, 0x654E, 0x949C, 0x654F, 0xC3F4, 0x6550, 0x949D, 0x6551, 0xBEC8, 0x6552, 0x949E, + 0x6553, 0x949F, 0x6554, 0x94A0, 0x6555, 0xEBB7, 0x6556, 0xB0BD, 0x6557, 0x94A1, 0x6558, 0x94A2, 0x6559, 0xBDCC, 0x655A, 0x94A3, + 0x655B, 0xC1B2, 0x655C, 0x94A4, 0x655D, 0xB1D6, 0x655E, 0xB3A8, 0x655F, 0x94A5, 0x6560, 0x94A6, 0x6561, 0x94A7, 0x6562, 0xB8D2, + 0x6563, 0xC9A2, 0x6564, 0x94A8, 0x6565, 0x94A9, 0x6566, 0xB6D8, 0x6567, 0x94AA, 0x6568, 0x94AB, 0x6569, 0x94AC, 0x656A, 0x94AD, + 0x656B, 0xEBB8, 0x656C, 0xBEB4, 0x656D, 0x94AE, 0x656E, 0x94AF, 0x656F, 0x94B0, 0x6570, 0xCAFD, 0x6571, 0x94B1, 0x6572, 0xC7C3, + 0x6573, 0x94B2, 0x6574, 0xD5FB, 0x6575, 0x94B3, 0x6576, 0x94B4, 0x6577, 0xB7F3, 0x6578, 0x94B5, 0x6579, 0x94B6, 0x657A, 0x94B7, + 0x657B, 0x94B8, 0x657C, 0x94B9, 0x657D, 0x94BA, 0x657E, 0x94BB, 0x657F, 0x94BC, 0x6580, 0x94BD, 0x6581, 0x94BE, 0x6582, 0x94BF, + 0x6583, 0x94C0, 0x6584, 0x94C1, 0x6585, 0x94C2, 0x6586, 0x94C3, 0x6587, 0xCEC4, 0x6588, 0x94C4, 0x6589, 0x94C5, 0x658A, 0x94C6, + 0x658B, 0xD5AB, 0x658C, 0xB1F3, 0x658D, 0x94C7, 0x658E, 0x94C8, 0x658F, 0x94C9, 0x6590, 0xECB3, 0x6591, 0xB0DF, 0x6592, 0x94CA, + 0x6593, 0xECB5, 0x6594, 0x94CB, 0x6595, 0x94CC, 0x6596, 0x94CD, 0x6597, 0xB6B7, 0x6598, 0x94CE, 0x6599, 0xC1CF, 0x659A, 0x94CF, + 0x659B, 0xF5FA, 0x659C, 0xD0B1, 0x659D, 0x94D0, 0x659E, 0x94D1, 0x659F, 0xD5E5, 0x65A0, 0x94D2, 0x65A1, 0xCED3, 0x65A2, 0x94D3, + 0x65A3, 0x94D4, 0x65A4, 0xBDEF, 0x65A5, 0xB3E2, 0x65A6, 0x94D5, 0x65A7, 0xB8AB, 0x65A8, 0x94D6, 0x65A9, 0xD5B6, 0x65AA, 0x94D7, + 0x65AB, 0xEDBD, 0x65AC, 0x94D8, 0x65AD, 0xB6CF, 0x65AE, 0x94D9, 0x65AF, 0xCBB9, 0x65B0, 0xD0C2, 0x65B1, 0x94DA, 0x65B2, 0x94DB, + 0x65B3, 0x94DC, 0x65B4, 0x94DD, 0x65B5, 0x94DE, 0x65B6, 0x94DF, 0x65B7, 0x94E0, 0x65B8, 0x94E1, 0x65B9, 0xB7BD, 0x65BA, 0x94E2, + 0x65BB, 0x94E3, 0x65BC, 0xECB6, 0x65BD, 0xCAA9, 0x65BE, 0x94E4, 0x65BF, 0x94E5, 0x65C0, 0x94E6, 0x65C1, 0xC5D4, 0x65C2, 0x94E7, + 0x65C3, 0xECB9, 0x65C4, 0xECB8, 0x65C5, 0xC2C3, 0x65C6, 0xECB7, 0x65C7, 0x94E8, 0x65C8, 0x94E9, 0x65C9, 0x94EA, 0x65CA, 0x94EB, + 0x65CB, 0xD0FD, 0x65CC, 0xECBA, 0x65CD, 0x94EC, 0x65CE, 0xECBB, 0x65CF, 0xD7E5, 0x65D0, 0x94ED, 0x65D1, 0x94EE, 0x65D2, 0xECBC, + 0x65D3, 0x94EF, 0x65D4, 0x94F0, 0x65D5, 0x94F1, 0x65D6, 0xECBD, 0x65D7, 0xC6EC, 0x65D8, 0x94F2, 0x65D9, 0x94F3, 0x65DA, 0x94F4, + 0x65DB, 0x94F5, 0x65DC, 0x94F6, 0x65DD, 0x94F7, 0x65DE, 0x94F8, 0x65DF, 0x94F9, 0x65E0, 0xCEDE, 0x65E1, 0x94FA, 0x65E2, 0xBCC8, + 0x65E3, 0x94FB, 0x65E4, 0x94FC, 0x65E5, 0xC8D5, 0x65E6, 0xB5A9, 0x65E7, 0xBEC9, 0x65E8, 0xD6BC, 0x65E9, 0xD4E7, 0x65EA, 0x94FD, + 0x65EB, 0x94FE, 0x65EC, 0xD1AE, 0x65ED, 0xD0F1, 0x65EE, 0xEAB8, 0x65EF, 0xEAB9, 0x65F0, 0xEABA, 0x65F1, 0xBAB5, 0x65F2, 0x9540, + 0x65F3, 0x9541, 0x65F4, 0x9542, 0x65F5, 0x9543, 0x65F6, 0xCAB1, 0x65F7, 0xBFF5, 0x65F8, 0x9544, 0x65F9, 0x9545, 0x65FA, 0xCDFA, + 0x65FB, 0x9546, 0x65FC, 0x9547, 0x65FD, 0x9548, 0x65FE, 0x9549, 0x65FF, 0x954A, 0x6600, 0xEAC0, 0x6601, 0x954B, 0x6602, 0xB0BA, + 0x6603, 0xEABE, 0x6604, 0x954C, 0x6605, 0x954D, 0x6606, 0xC0A5, 0x6607, 0x954E, 0x6608, 0x954F, 0x6609, 0x9550, 0x660A, 0xEABB, + 0x660B, 0x9551, 0x660C, 0xB2FD, 0x660D, 0x9552, 0x660E, 0xC3F7, 0x660F, 0xBBE8, 0x6610, 0x9553, 0x6611, 0x9554, 0x6612, 0x9555, + 0x6613, 0xD2D7, 0x6614, 0xCEF4, 0x6615, 0xEABF, 0x6616, 0x9556, 0x6617, 0x9557, 0x6618, 0x9558, 0x6619, 0xEABC, 0x661A, 0x9559, + 0x661B, 0x955A, 0x661C, 0x955B, 0x661D, 0xEAC3, 0x661E, 0x955C, 0x661F, 0xD0C7, 0x6620, 0xD3B3, 0x6621, 0x955D, 0x6622, 0x955E, + 0x6623, 0x955F, 0x6624, 0x9560, 0x6625, 0xB4BA, 0x6626, 0x9561, 0x6627, 0xC3C1, 0x6628, 0xD7F2, 0x6629, 0x9562, 0x662A, 0x9563, + 0x662B, 0x9564, 0x662C, 0x9565, 0x662D, 0xD5D1, 0x662E, 0x9566, 0x662F, 0xCAC7, 0x6630, 0x9567, 0x6631, 0xEAC5, 0x6632, 0x9568, + 0x6633, 0x9569, 0x6634, 0xEAC4, 0x6635, 0xEAC7, 0x6636, 0xEAC6, 0x6637, 0x956A, 0x6638, 0x956B, 0x6639, 0x956C, 0x663A, 0x956D, + 0x663B, 0x956E, 0x663C, 0xD6E7, 0x663D, 0x956F, 0x663E, 0xCFD4, 0x663F, 0x9570, 0x6640, 0x9571, 0x6641, 0xEACB, 0x6642, 0x9572, + 0x6643, 0xBBCE, 0x6644, 0x9573, 0x6645, 0x9574, 0x6646, 0x9575, 0x6647, 0x9576, 0x6648, 0x9577, 0x6649, 0x9578, 0x664A, 0x9579, + 0x664B, 0xBDFA, 0x664C, 0xC9CE, 0x664D, 0x957A, 0x664E, 0x957B, 0x664F, 0xEACC, 0x6650, 0x957C, 0x6651, 0x957D, 0x6652, 0xC9B9, + 0x6653, 0xCFFE, 0x6654, 0xEACA, 0x6655, 0xD4CE, 0x6656, 0xEACD, 0x6657, 0xEACF, 0x6658, 0x957E, 0x6659, 0x9580, 0x665A, 0xCDED, + 0x665B, 0x9581, 0x665C, 0x9582, 0x665D, 0x9583, 0x665E, 0x9584, 0x665F, 0xEAC9, 0x6660, 0x9585, 0x6661, 0xEACE, 0x6662, 0x9586, + 0x6663, 0x9587, 0x6664, 0xCEEE, 0x6665, 0x9588, 0x6666, 0xBBDE, 0x6667, 0x9589, 0x6668, 0xB3BF, 0x6669, 0x958A, 0x666A, 0x958B, + 0x666B, 0x958C, 0x666C, 0x958D, 0x666D, 0x958E, 0x666E, 0xC6D5, 0x666F, 0xBEB0, 0x6670, 0xCEFA, 0x6671, 0x958F, 0x6672, 0x9590, + 0x6673, 0x9591, 0x6674, 0xC7E7, 0x6675, 0x9592, 0x6676, 0xBEA7, 0x6677, 0xEAD0, 0x6678, 0x9593, 0x6679, 0x9594, 0x667A, 0xD6C7, + 0x667B, 0x9595, 0x667C, 0x9596, 0x667D, 0x9597, 0x667E, 0xC1C0, 0x667F, 0x9598, 0x6680, 0x9599, 0x6681, 0x959A, 0x6682, 0xD4DD, + 0x6683, 0x959B, 0x6684, 0xEAD1, 0x6685, 0x959C, 0x6686, 0x959D, 0x6687, 0xCFBE, 0x6688, 0x959E, 0x6689, 0x959F, 0x668A, 0x95A0, + 0x668B, 0x95A1, 0x668C, 0xEAD2, 0x668D, 0x95A2, 0x668E, 0x95A3, 0x668F, 0x95A4, 0x6690, 0x95A5, 0x6691, 0xCAEE, 0x6692, 0x95A6, + 0x6693, 0x95A7, 0x6694, 0x95A8, 0x6695, 0x95A9, 0x6696, 0xC5AF, 0x6697, 0xB0B5, 0x6698, 0x95AA, 0x6699, 0x95AB, 0x669A, 0x95AC, + 0x669B, 0x95AD, 0x669C, 0x95AE, 0x669D, 0xEAD4, 0x669E, 0x95AF, 0x669F, 0x95B0, 0x66A0, 0x95B1, 0x66A1, 0x95B2, 0x66A2, 0x95B3, + 0x66A3, 0x95B4, 0x66A4, 0x95B5, 0x66A5, 0x95B6, 0x66A6, 0x95B7, 0x66A7, 0xEAD3, 0x66A8, 0xF4DF, 0x66A9, 0x95B8, 0x66AA, 0x95B9, + 0x66AB, 0x95BA, 0x66AC, 0x95BB, 0x66AD, 0x95BC, 0x66AE, 0xC4BA, 0x66AF, 0x95BD, 0x66B0, 0x95BE, 0x66B1, 0x95BF, 0x66B2, 0x95C0, + 0x66B3, 0x95C1, 0x66B4, 0xB1A9, 0x66B5, 0x95C2, 0x66B6, 0x95C3, 0x66B7, 0x95C4, 0x66B8, 0x95C5, 0x66B9, 0xE5DF, 0x66BA, 0x95C6, + 0x66BB, 0x95C7, 0x66BC, 0x95C8, 0x66BD, 0x95C9, 0x66BE, 0xEAD5, 0x66BF, 0x95CA, 0x66C0, 0x95CB, 0x66C1, 0x95CC, 0x66C2, 0x95CD, + 0x66C3, 0x95CE, 0x66C4, 0x95CF, 0x66C5, 0x95D0, 0x66C6, 0x95D1, 0x66C7, 0x95D2, 0x66C8, 0x95D3, 0x66C9, 0x95D4, 0x66CA, 0x95D5, + 0x66CB, 0x95D6, 0x66CC, 0x95D7, 0x66CD, 0x95D8, 0x66CE, 0x95D9, 0x66CF, 0x95DA, 0x66D0, 0x95DB, 0x66D1, 0x95DC, 0x66D2, 0x95DD, + 0x66D3, 0x95DE, 0x66D4, 0x95DF, 0x66D5, 0x95E0, 0x66D6, 0x95E1, 0x66D7, 0x95E2, 0x66D8, 0x95E3, 0x66D9, 0xCAEF, 0x66DA, 0x95E4, + 0x66DB, 0xEAD6, 0x66DC, 0xEAD7, 0x66DD, 0xC6D8, 0x66DE, 0x95E5, 0x66DF, 0x95E6, 0x66E0, 0x95E7, 0x66E1, 0x95E8, 0x66E2, 0x95E9, + 0x66E3, 0x95EA, 0x66E4, 0x95EB, 0x66E5, 0x95EC, 0x66E6, 0xEAD8, 0x66E7, 0x95ED, 0x66E8, 0x95EE, 0x66E9, 0xEAD9, 0x66EA, 0x95EF, + 0x66EB, 0x95F0, 0x66EC, 0x95F1, 0x66ED, 0x95F2, 0x66EE, 0x95F3, 0x66EF, 0x95F4, 0x66F0, 0xD4BB, 0x66F1, 0x95F5, 0x66F2, 0xC7FA, + 0x66F3, 0xD2B7, 0x66F4, 0xB8FC, 0x66F5, 0x95F6, 0x66F6, 0x95F7, 0x66F7, 0xEAC2, 0x66F8, 0x95F8, 0x66F9, 0xB2DC, 0x66FA, 0x95F9, + 0x66FB, 0x95FA, 0x66FC, 0xC2FC, 0x66FD, 0x95FB, 0x66FE, 0xD4F8, 0x66FF, 0xCCE6, 0x6700, 0xD7EE, 0x6701, 0x95FC, 0x6702, 0x95FD, + 0x6703, 0x95FE, 0x6704, 0x9640, 0x6705, 0x9641, 0x6706, 0x9642, 0x6707, 0x9643, 0x6708, 0xD4C2, 0x6709, 0xD3D0, 0x670A, 0xEBC3, + 0x670B, 0xC5F3, 0x670C, 0x9644, 0x670D, 0xB7FE, 0x670E, 0x9645, 0x670F, 0x9646, 0x6710, 0xEBD4, 0x6711, 0x9647, 0x6712, 0x9648, + 0x6713, 0x9649, 0x6714, 0xCBB7, 0x6715, 0xEBDE, 0x6716, 0x964A, 0x6717, 0xC0CA, 0x6718, 0x964B, 0x6719, 0x964C, 0x671A, 0x964D, + 0x671B, 0xCDFB, 0x671C, 0x964E, 0x671D, 0xB3AF, 0x671E, 0x964F, 0x671F, 0xC6DA, 0x6720, 0x9650, 0x6721, 0x9651, 0x6722, 0x9652, + 0x6723, 0x9653, 0x6724, 0x9654, 0x6725, 0x9655, 0x6726, 0xEBFC, 0x6727, 0x9656, 0x6728, 0xC4BE, 0x6729, 0x9657, 0x672A, 0xCEB4, + 0x672B, 0xC4A9, 0x672C, 0xB1BE, 0x672D, 0xD4FD, 0x672E, 0x9658, 0x672F, 0xCAF5, 0x6730, 0x9659, 0x6731, 0xD6EC, 0x6732, 0x965A, + 0x6733, 0x965B, 0x6734, 0xC6D3, 0x6735, 0xB6E4, 0x6736, 0x965C, 0x6737, 0x965D, 0x6738, 0x965E, 0x6739, 0x965F, 0x673A, 0xBBFA, + 0x673B, 0x9660, 0x673C, 0x9661, 0x673D, 0xD0E0, 0x673E, 0x9662, 0x673F, 0x9663, 0x6740, 0xC9B1, 0x6741, 0x9664, 0x6742, 0xD4D3, + 0x6743, 0xC8A8, 0x6744, 0x9665, 0x6745, 0x9666, 0x6746, 0xB8CB, 0x6747, 0x9667, 0x6748, 0xE8BE, 0x6749, 0xC9BC, 0x674A, 0x9668, + 0x674B, 0x9669, 0x674C, 0xE8BB, 0x674D, 0x966A, 0x674E, 0xC0EE, 0x674F, 0xD0D3, 0x6750, 0xB2C4, 0x6751, 0xB4E5, 0x6752, 0x966B, + 0x6753, 0xE8BC, 0x6754, 0x966C, 0x6755, 0x966D, 0x6756, 0xD5C8, 0x6757, 0x966E, 0x6758, 0x966F, 0x6759, 0x9670, 0x675A, 0x9671, + 0x675B, 0x9672, 0x675C, 0xB6C5, 0x675D, 0x9673, 0x675E, 0xE8BD, 0x675F, 0xCAF8, 0x6760, 0xB8DC, 0x6761, 0xCCF5, 0x6762, 0x9674, + 0x6763, 0x9675, 0x6764, 0x9676, 0x6765, 0xC0B4, 0x6766, 0x9677, 0x6767, 0x9678, 0x6768, 0xD1EE, 0x6769, 0xE8BF, 0x676A, 0xE8C2, + 0x676B, 0x9679, 0x676C, 0x967A, 0x676D, 0xBABC, 0x676E, 0x967B, 0x676F, 0xB1AD, 0x6770, 0xBDDC, 0x6771, 0x967C, 0x6772, 0xEABD, + 0x6773, 0xE8C3, 0x6774, 0x967D, 0x6775, 0xE8C6, 0x6776, 0x967E, 0x6777, 0xE8CB, 0x6778, 0x9680, 0x6779, 0x9681, 0x677A, 0x9682, + 0x677B, 0x9683, 0x677C, 0xE8CC, 0x677D, 0x9684, 0x677E, 0xCBC9, 0x677F, 0xB0E5, 0x6780, 0x9685, 0x6781, 0xBCAB, 0x6782, 0x9686, + 0x6783, 0x9687, 0x6784, 0xB9B9, 0x6785, 0x9688, 0x6786, 0x9689, 0x6787, 0xE8C1, 0x6788, 0x968A, 0x6789, 0xCDF7, 0x678A, 0x968B, + 0x678B, 0xE8CA, 0x678C, 0x968C, 0x678D, 0x968D, 0x678E, 0x968E, 0x678F, 0x968F, 0x6790, 0xCEF6, 0x6791, 0x9690, 0x6792, 0x9691, + 0x6793, 0x9692, 0x6794, 0x9693, 0x6795, 0xD5ED, 0x6796, 0x9694, 0x6797, 0xC1D6, 0x6798, 0xE8C4, 0x6799, 0x9695, 0x679A, 0xC3B6, + 0x679B, 0x9696, 0x679C, 0xB9FB, 0x679D, 0xD6A6, 0x679E, 0xE8C8, 0x679F, 0x9697, 0x67A0, 0x9698, 0x67A1, 0x9699, 0x67A2, 0xCAE0, + 0x67A3, 0xD4E6, 0x67A4, 0x969A, 0x67A5, 0xE8C0, 0x67A6, 0x969B, 0x67A7, 0xE8C5, 0x67A8, 0xE8C7, 0x67A9, 0x969C, 0x67AA, 0xC7B9, + 0x67AB, 0xB7E3, 0x67AC, 0x969D, 0x67AD, 0xE8C9, 0x67AE, 0x969E, 0x67AF, 0xBFDD, 0x67B0, 0xE8D2, 0x67B1, 0x969F, 0x67B2, 0x96A0, + 0x67B3, 0xE8D7, 0x67B4, 0x96A1, 0x67B5, 0xE8D5, 0x67B6, 0xBCDC, 0x67B7, 0xBCCF, 0x67B8, 0xE8DB, 0x67B9, 0x96A2, 0x67BA, 0x96A3, + 0x67BB, 0x96A4, 0x67BC, 0x96A5, 0x67BD, 0x96A6, 0x67BE, 0x96A7, 0x67BF, 0x96A8, 0x67C0, 0x96A9, 0x67C1, 0xE8DE, 0x67C2, 0x96AA, + 0x67C3, 0xE8DA, 0x67C4, 0xB1FA, 0x67C5, 0x96AB, 0x67C6, 0x96AC, 0x67C7, 0x96AD, 0x67C8, 0x96AE, 0x67C9, 0x96AF, 0x67CA, 0x96B0, + 0x67CB, 0x96B1, 0x67CC, 0x96B2, 0x67CD, 0x96B3, 0x67CE, 0x96B4, 0x67CF, 0xB0D8, 0x67D0, 0xC4B3, 0x67D1, 0xB8CC, 0x67D2, 0xC6E2, + 0x67D3, 0xC8BE, 0x67D4, 0xC8E1, 0x67D5, 0x96B5, 0x67D6, 0x96B6, 0x67D7, 0x96B7, 0x67D8, 0xE8CF, 0x67D9, 0xE8D4, 0x67DA, 0xE8D6, + 0x67DB, 0x96B8, 0x67DC, 0xB9F1, 0x67DD, 0xE8D8, 0x67DE, 0xD7F5, 0x67DF, 0x96B9, 0x67E0, 0xC4FB, 0x67E1, 0x96BA, 0x67E2, 0xE8DC, + 0x67E3, 0x96BB, 0x67E4, 0x96BC, 0x67E5, 0xB2E9, 0x67E6, 0x96BD, 0x67E7, 0x96BE, 0x67E8, 0x96BF, 0x67E9, 0xE8D1, 0x67EA, 0x96C0, + 0x67EB, 0x96C1, 0x67EC, 0xBCED, 0x67ED, 0x96C2, 0x67EE, 0x96C3, 0x67EF, 0xBFC2, 0x67F0, 0xE8CD, 0x67F1, 0xD6F9, 0x67F2, 0x96C4, + 0x67F3, 0xC1F8, 0x67F4, 0xB2F1, 0x67F5, 0x96C5, 0x67F6, 0x96C6, 0x67F7, 0x96C7, 0x67F8, 0x96C8, 0x67F9, 0x96C9, 0x67FA, 0x96CA, + 0x67FB, 0x96CB, 0x67FC, 0x96CC, 0x67FD, 0xE8DF, 0x67FE, 0x96CD, 0x67FF, 0xCAC1, 0x6800, 0xE8D9, 0x6801, 0x96CE, 0x6802, 0x96CF, + 0x6803, 0x96D0, 0x6804, 0x96D1, 0x6805, 0xD5A4, 0x6806, 0x96D2, 0x6807, 0xB1EA, 0x6808, 0xD5BB, 0x6809, 0xE8CE, 0x680A, 0xE8D0, + 0x680B, 0xB6B0, 0x680C, 0xE8D3, 0x680D, 0x96D3, 0x680E, 0xE8DD, 0x680F, 0xC0B8, 0x6810, 0x96D4, 0x6811, 0xCAF7, 0x6812, 0x96D5, + 0x6813, 0xCBA8, 0x6814, 0x96D6, 0x6815, 0x96D7, 0x6816, 0xC6DC, 0x6817, 0xC0F5, 0x6818, 0x96D8, 0x6819, 0x96D9, 0x681A, 0x96DA, + 0x681B, 0x96DB, 0x681C, 0x96DC, 0x681D, 0xE8E9, 0x681E, 0x96DD, 0x681F, 0x96DE, 0x6820, 0x96DF, 0x6821, 0xD0A3, 0x6822, 0x96E0, + 0x6823, 0x96E1, 0x6824, 0x96E2, 0x6825, 0x96E3, 0x6826, 0x96E4, 0x6827, 0x96E5, 0x6828, 0x96E6, 0x6829, 0xE8F2, 0x682A, 0xD6EA, + 0x682B, 0x96E7, 0x682C, 0x96E8, 0x682D, 0x96E9, 0x682E, 0x96EA, 0x682F, 0x96EB, 0x6830, 0x96EC, 0x6831, 0x96ED, 0x6832, 0xE8E0, + 0x6833, 0xE8E1, 0x6834, 0x96EE, 0x6835, 0x96EF, 0x6836, 0x96F0, 0x6837, 0xD1F9, 0x6838, 0xBACB, 0x6839, 0xB8F9, 0x683A, 0x96F1, + 0x683B, 0x96F2, 0x683C, 0xB8F1, 0x683D, 0xD4D4, 0x683E, 0xE8EF, 0x683F, 0x96F3, 0x6840, 0xE8EE, 0x6841, 0xE8EC, 0x6842, 0xB9F0, + 0x6843, 0xCCD2, 0x6844, 0xE8E6, 0x6845, 0xCEA6, 0x6846, 0xBFF2, 0x6847, 0x96F4, 0x6848, 0xB0B8, 0x6849, 0xE8F1, 0x684A, 0xE8F0, + 0x684B, 0x96F5, 0x684C, 0xD7C0, 0x684D, 0x96F6, 0x684E, 0xE8E4, 0x684F, 0x96F7, 0x6850, 0xCDA9, 0x6851, 0xC9A3, 0x6852, 0x96F8, + 0x6853, 0xBBB8, 0x6854, 0xBDDB, 0x6855, 0xE8EA, 0x6856, 0x96F9, 0x6857, 0x96FA, 0x6858, 0x96FB, 0x6859, 0x96FC, 0x685A, 0x96FD, + 0x685B, 0x96FE, 0x685C, 0x9740, 0x685D, 0x9741, 0x685E, 0x9742, 0x685F, 0x9743, 0x6860, 0xE8E2, 0x6861, 0xE8E3, 0x6862, 0xE8E5, + 0x6863, 0xB5B5, 0x6864, 0xE8E7, 0x6865, 0xC7C5, 0x6866, 0xE8EB, 0x6867, 0xE8ED, 0x6868, 0xBDB0, 0x6869, 0xD7AE, 0x686A, 0x9744, + 0x686B, 0xE8F8, 0x686C, 0x9745, 0x686D, 0x9746, 0x686E, 0x9747, 0x686F, 0x9748, 0x6870, 0x9749, 0x6871, 0x974A, 0x6872, 0x974B, + 0x6873, 0x974C, 0x6874, 0xE8F5, 0x6875, 0x974D, 0x6876, 0xCDB0, 0x6877, 0xE8F6, 0x6878, 0x974E, 0x6879, 0x974F, 0x687A, 0x9750, + 0x687B, 0x9751, 0x687C, 0x9752, 0x687D, 0x9753, 0x687E, 0x9754, 0x687F, 0x9755, 0x6880, 0x9756, 0x6881, 0xC1BA, 0x6882, 0x9757, + 0x6883, 0xE8E8, 0x6884, 0x9758, 0x6885, 0xC3B7, 0x6886, 0xB0F0, 0x6887, 0x9759, 0x6888, 0x975A, 0x6889, 0x975B, 0x688A, 0x975C, + 0x688B, 0x975D, 0x688C, 0x975E, 0x688D, 0x975F, 0x688E, 0x9760, 0x688F, 0xE8F4, 0x6890, 0x9761, 0x6891, 0x9762, 0x6892, 0x9763, + 0x6893, 0xE8F7, 0x6894, 0x9764, 0x6895, 0x9765, 0x6896, 0x9766, 0x6897, 0xB9A3, 0x6898, 0x9767, 0x6899, 0x9768, 0x689A, 0x9769, + 0x689B, 0x976A, 0x689C, 0x976B, 0x689D, 0x976C, 0x689E, 0x976D, 0x689F, 0x976E, 0x68A0, 0x976F, 0x68A1, 0x9770, 0x68A2, 0xC9D2, + 0x68A3, 0x9771, 0x68A4, 0x9772, 0x68A5, 0x9773, 0x68A6, 0xC3CE, 0x68A7, 0xCEE0, 0x68A8, 0xC0E6, 0x68A9, 0x9774, 0x68AA, 0x9775, + 0x68AB, 0x9776, 0x68AC, 0x9777, 0x68AD, 0xCBF3, 0x68AE, 0x9778, 0x68AF, 0xCCDD, 0x68B0, 0xD0B5, 0x68B1, 0x9779, 0x68B2, 0x977A, + 0x68B3, 0xCAE1, 0x68B4, 0x977B, 0x68B5, 0xE8F3, 0x68B6, 0x977C, 0x68B7, 0x977D, 0x68B8, 0x977E, 0x68B9, 0x9780, 0x68BA, 0x9781, + 0x68BB, 0x9782, 0x68BC, 0x9783, 0x68BD, 0x9784, 0x68BE, 0x9785, 0x68BF, 0x9786, 0x68C0, 0xBCEC, 0x68C1, 0x9787, 0x68C2, 0xE8F9, + 0x68C3, 0x9788, 0x68C4, 0x9789, 0x68C5, 0x978A, 0x68C6, 0x978B, 0x68C7, 0x978C, 0x68C8, 0x978D, 0x68C9, 0xC3DE, 0x68CA, 0x978E, + 0x68CB, 0xC6E5, 0x68CC, 0x978F, 0x68CD, 0xB9F7, 0x68CE, 0x9790, 0x68CF, 0x9791, 0x68D0, 0x9792, 0x68D1, 0x9793, 0x68D2, 0xB0F4, + 0x68D3, 0x9794, 0x68D4, 0x9795, 0x68D5, 0xD7D8, 0x68D6, 0x9796, 0x68D7, 0x9797, 0x68D8, 0xBCAC, 0x68D9, 0x9798, 0x68DA, 0xC5EF, + 0x68DB, 0x9799, 0x68DC, 0x979A, 0x68DD, 0x979B, 0x68DE, 0x979C, 0x68DF, 0x979D, 0x68E0, 0xCCC4, 0x68E1, 0x979E, 0x68E2, 0x979F, + 0x68E3, 0xE9A6, 0x68E4, 0x97A0, 0x68E5, 0x97A1, 0x68E6, 0x97A2, 0x68E7, 0x97A3, 0x68E8, 0x97A4, 0x68E9, 0x97A5, 0x68EA, 0x97A6, + 0x68EB, 0x97A7, 0x68EC, 0x97A8, 0x68ED, 0x97A9, 0x68EE, 0xC9AD, 0x68EF, 0x97AA, 0x68F0, 0xE9A2, 0x68F1, 0xC0E2, 0x68F2, 0x97AB, + 0x68F3, 0x97AC, 0x68F4, 0x97AD, 0x68F5, 0xBFC3, 0x68F6, 0x97AE, 0x68F7, 0x97AF, 0x68F8, 0x97B0, 0x68F9, 0xE8FE, 0x68FA, 0xB9D7, + 0x68FB, 0x97B1, 0x68FC, 0xE8FB, 0x68FD, 0x97B2, 0x68FE, 0x97B3, 0x68FF, 0x97B4, 0x6900, 0x97B5, 0x6901, 0xE9A4, 0x6902, 0x97B6, + 0x6903, 0x97B7, 0x6904, 0x97B8, 0x6905, 0xD2CE, 0x6906, 0x97B9, 0x6907, 0x97BA, 0x6908, 0x97BB, 0x6909, 0x97BC, 0x690A, 0x97BD, + 0x690B, 0xE9A3, 0x690C, 0x97BE, 0x690D, 0xD6B2, 0x690E, 0xD7B5, 0x690F, 0x97BF, 0x6910, 0xE9A7, 0x6911, 0x97C0, 0x6912, 0xBDB7, + 0x6913, 0x97C1, 0x6914, 0x97C2, 0x6915, 0x97C3, 0x6916, 0x97C4, 0x6917, 0x97C5, 0x6918, 0x97C6, 0x6919, 0x97C7, 0x691A, 0x97C8, + 0x691B, 0x97C9, 0x691C, 0x97CA, 0x691D, 0x97CB, 0x691E, 0x97CC, 0x691F, 0xE8FC, 0x6920, 0xE8FD, 0x6921, 0x97CD, 0x6922, 0x97CE, + 0x6923, 0x97CF, 0x6924, 0xE9A1, 0x6925, 0x97D0, 0x6926, 0x97D1, 0x6927, 0x97D2, 0x6928, 0x97D3, 0x6929, 0x97D4, 0x692A, 0x97D5, + 0x692B, 0x97D6, 0x692C, 0x97D7, 0x692D, 0xCDD6, 0x692E, 0x97D8, 0x692F, 0x97D9, 0x6930, 0xD2AC, 0x6931, 0x97DA, 0x6932, 0x97DB, + 0x6933, 0x97DC, 0x6934, 0xE9B2, 0x6935, 0x97DD, 0x6936, 0x97DE, 0x6937, 0x97DF, 0x6938, 0x97E0, 0x6939, 0xE9A9, 0x693A, 0x97E1, + 0x693B, 0x97E2, 0x693C, 0x97E3, 0x693D, 0xB4AA, 0x693E, 0x97E4, 0x693F, 0xB4BB, 0x6940, 0x97E5, 0x6941, 0x97E6, 0x6942, 0xE9AB, + 0x6943, 0x97E7, 0x6944, 0x97E8, 0x6945, 0x97E9, 0x6946, 0x97EA, 0x6947, 0x97EB, 0x6948, 0x97EC, 0x6949, 0x97ED, 0x694A, 0x97EE, + 0x694B, 0x97EF, 0x694C, 0x97F0, 0x694D, 0x97F1, 0x694E, 0x97F2, 0x694F, 0x97F3, 0x6950, 0x97F4, 0x6951, 0x97F5, 0x6952, 0x97F6, + 0x6953, 0x97F7, 0x6954, 0xD0A8, 0x6955, 0x97F8, 0x6956, 0x97F9, 0x6957, 0xE9A5, 0x6958, 0x97FA, 0x6959, 0x97FB, 0x695A, 0xB3FE, + 0x695B, 0x97FC, 0x695C, 0x97FD, 0x695D, 0xE9AC, 0x695E, 0xC0E3, 0x695F, 0x97FE, 0x6960, 0xE9AA, 0x6961, 0x9840, 0x6962, 0x9841, + 0x6963, 0xE9B9, 0x6964, 0x9842, 0x6965, 0x9843, 0x6966, 0xE9B8, 0x6967, 0x9844, 0x6968, 0x9845, 0x6969, 0x9846, 0x696A, 0x9847, + 0x696B, 0xE9AE, 0x696C, 0x9848, 0x696D, 0x9849, 0x696E, 0xE8FA, 0x696F, 0x984A, 0x6970, 0x984B, 0x6971, 0xE9A8, 0x6972, 0x984C, + 0x6973, 0x984D, 0x6974, 0x984E, 0x6975, 0x984F, 0x6976, 0x9850, 0x6977, 0xBFAC, 0x6978, 0xE9B1, 0x6979, 0xE9BA, 0x697A, 0x9851, + 0x697B, 0x9852, 0x697C, 0xC2A5, 0x697D, 0x9853, 0x697E, 0x9854, 0x697F, 0x9855, 0x6980, 0xE9AF, 0x6981, 0x9856, 0x6982, 0xB8C5, + 0x6983, 0x9857, 0x6984, 0xE9AD, 0x6985, 0x9858, 0x6986, 0xD3DC, 0x6987, 0xE9B4, 0x6988, 0xE9B5, 0x6989, 0xE9B7, 0x698A, 0x9859, + 0x698B, 0x985A, 0x698C, 0x985B, 0x698D, 0xE9C7, 0x698E, 0x985C, 0x698F, 0x985D, 0x6990, 0x985E, 0x6991, 0x985F, 0x6992, 0x9860, + 0x6993, 0x9861, 0x6994, 0xC0C6, 0x6995, 0xE9C5, 0x6996, 0x9862, 0x6997, 0x9863, 0x6998, 0xE9B0, 0x6999, 0x9864, 0x699A, 0x9865, + 0x699B, 0xE9BB, 0x699C, 0xB0F1, 0x699D, 0x9866, 0x699E, 0x9867, 0x699F, 0x9868, 0x69A0, 0x9869, 0x69A1, 0x986A, 0x69A2, 0x986B, + 0x69A3, 0x986C, 0x69A4, 0x986D, 0x69A5, 0x986E, 0x69A6, 0x986F, 0x69A7, 0xE9BC, 0x69A8, 0xD5A5, 0x69A9, 0x9870, 0x69AA, 0x9871, + 0x69AB, 0xE9BE, 0x69AC, 0x9872, 0x69AD, 0xE9BF, 0x69AE, 0x9873, 0x69AF, 0x9874, 0x69B0, 0x9875, 0x69B1, 0xE9C1, 0x69B2, 0x9876, + 0x69B3, 0x9877, 0x69B4, 0xC1F1, 0x69B5, 0x9878, 0x69B6, 0x9879, 0x69B7, 0xC8B6, 0x69B8, 0x987A, 0x69B9, 0x987B, 0x69BA, 0x987C, + 0x69BB, 0xE9BD, 0x69BC, 0x987D, 0x69BD, 0x987E, 0x69BE, 0x9880, 0x69BF, 0x9881, 0x69C0, 0x9882, 0x69C1, 0xE9C2, 0x69C2, 0x9883, + 0x69C3, 0x9884, 0x69C4, 0x9885, 0x69C5, 0x9886, 0x69C6, 0x9887, 0x69C7, 0x9888, 0x69C8, 0x9889, 0x69C9, 0x988A, 0x69CA, 0xE9C3, + 0x69CB, 0x988B, 0x69CC, 0xE9B3, 0x69CD, 0x988C, 0x69CE, 0xE9B6, 0x69CF, 0x988D, 0x69D0, 0xBBB1, 0x69D1, 0x988E, 0x69D2, 0x988F, + 0x69D3, 0x9890, 0x69D4, 0xE9C0, 0x69D5, 0x9891, 0x69D6, 0x9892, 0x69D7, 0x9893, 0x69D8, 0x9894, 0x69D9, 0x9895, 0x69DA, 0x9896, + 0x69DB, 0xBCF7, 0x69DC, 0x9897, 0x69DD, 0x9898, 0x69DE, 0x9899, 0x69DF, 0xE9C4, 0x69E0, 0xE9C6, 0x69E1, 0x989A, 0x69E2, 0x989B, + 0x69E3, 0x989C, 0x69E4, 0x989D, 0x69E5, 0x989E, 0x69E6, 0x989F, 0x69E7, 0x98A0, 0x69E8, 0x98A1, 0x69E9, 0x98A2, 0x69EA, 0x98A3, + 0x69EB, 0x98A4, 0x69EC, 0x98A5, 0x69ED, 0xE9CA, 0x69EE, 0x98A6, 0x69EF, 0x98A7, 0x69F0, 0x98A8, 0x69F1, 0x98A9, 0x69F2, 0xE9CE, + 0x69F3, 0x98AA, 0x69F4, 0x98AB, 0x69F5, 0x98AC, 0x69F6, 0x98AD, 0x69F7, 0x98AE, 0x69F8, 0x98AF, 0x69F9, 0x98B0, 0x69FA, 0x98B1, + 0x69FB, 0x98B2, 0x69FC, 0x98B3, 0x69FD, 0xB2DB, 0x69FE, 0x98B4, 0x69FF, 0xE9C8, 0x6A00, 0x98B5, 0x6A01, 0x98B6, 0x6A02, 0x98B7, + 0x6A03, 0x98B8, 0x6A04, 0x98B9, 0x6A05, 0x98BA, 0x6A06, 0x98BB, 0x6A07, 0x98BC, 0x6A08, 0x98BD, 0x6A09, 0x98BE, 0x6A0A, 0xB7AE, + 0x6A0B, 0x98BF, 0x6A0C, 0x98C0, 0x6A0D, 0x98C1, 0x6A0E, 0x98C2, 0x6A0F, 0x98C3, 0x6A10, 0x98C4, 0x6A11, 0x98C5, 0x6A12, 0x98C6, + 0x6A13, 0x98C7, 0x6A14, 0x98C8, 0x6A15, 0x98C9, 0x6A16, 0x98CA, 0x6A17, 0xE9CB, 0x6A18, 0xE9CC, 0x6A19, 0x98CB, 0x6A1A, 0x98CC, + 0x6A1B, 0x98CD, 0x6A1C, 0x98CE, 0x6A1D, 0x98CF, 0x6A1E, 0x98D0, 0x6A1F, 0xD5C1, 0x6A20, 0x98D1, 0x6A21, 0xC4A3, 0x6A22, 0x98D2, + 0x6A23, 0x98D3, 0x6A24, 0x98D4, 0x6A25, 0x98D5, 0x6A26, 0x98D6, 0x6A27, 0x98D7, 0x6A28, 0xE9D8, 0x6A29, 0x98D8, 0x6A2A, 0xBAE1, + 0x6A2B, 0x98D9, 0x6A2C, 0x98DA, 0x6A2D, 0x98DB, 0x6A2E, 0x98DC, 0x6A2F, 0xE9C9, 0x6A30, 0x98DD, 0x6A31, 0xD3A3, 0x6A32, 0x98DE, + 0x6A33, 0x98DF, 0x6A34, 0x98E0, 0x6A35, 0xE9D4, 0x6A36, 0x98E1, 0x6A37, 0x98E2, 0x6A38, 0x98E3, 0x6A39, 0x98E4, 0x6A3A, 0x98E5, + 0x6A3B, 0x98E6, 0x6A3C, 0x98E7, 0x6A3D, 0xE9D7, 0x6A3E, 0xE9D0, 0x6A3F, 0x98E8, 0x6A40, 0x98E9, 0x6A41, 0x98EA, 0x6A42, 0x98EB, + 0x6A43, 0x98EC, 0x6A44, 0xE9CF, 0x6A45, 0x98ED, 0x6A46, 0x98EE, 0x6A47, 0xC7C1, 0x6A48, 0x98EF, 0x6A49, 0x98F0, 0x6A4A, 0x98F1, + 0x6A4B, 0x98F2, 0x6A4C, 0x98F3, 0x6A4D, 0x98F4, 0x6A4E, 0x98F5, 0x6A4F, 0x98F6, 0x6A50, 0xE9D2, 0x6A51, 0x98F7, 0x6A52, 0x98F8, + 0x6A53, 0x98F9, 0x6A54, 0x98FA, 0x6A55, 0x98FB, 0x6A56, 0x98FC, 0x6A57, 0x98FD, 0x6A58, 0xE9D9, 0x6A59, 0xB3C8, 0x6A5A, 0x98FE, + 0x6A5B, 0xE9D3, 0x6A5C, 0x9940, 0x6A5D, 0x9941, 0x6A5E, 0x9942, 0x6A5F, 0x9943, 0x6A60, 0x9944, 0x6A61, 0xCFF0, 0x6A62, 0x9945, + 0x6A63, 0x9946, 0x6A64, 0x9947, 0x6A65, 0xE9CD, 0x6A66, 0x9948, 0x6A67, 0x9949, 0x6A68, 0x994A, 0x6A69, 0x994B, 0x6A6A, 0x994C, + 0x6A6B, 0x994D, 0x6A6C, 0x994E, 0x6A6D, 0x994F, 0x6A6E, 0x9950, 0x6A6F, 0x9951, 0x6A70, 0x9952, 0x6A71, 0xB3F7, 0x6A72, 0x9953, + 0x6A73, 0x9954, 0x6A74, 0x9955, 0x6A75, 0x9956, 0x6A76, 0x9957, 0x6A77, 0x9958, 0x6A78, 0x9959, 0x6A79, 0xE9D6, 0x6A7A, 0x995A, + 0x6A7B, 0x995B, 0x6A7C, 0xE9DA, 0x6A7D, 0x995C, 0x6A7E, 0x995D, 0x6A7F, 0x995E, 0x6A80, 0xCCB4, 0x6A81, 0x995F, 0x6A82, 0x9960, + 0x6A83, 0x9961, 0x6A84, 0xCFAD, 0x6A85, 0x9962, 0x6A86, 0x9963, 0x6A87, 0x9964, 0x6A88, 0x9965, 0x6A89, 0x9966, 0x6A8A, 0x9967, + 0x6A8B, 0x9968, 0x6A8C, 0x9969, 0x6A8D, 0x996A, 0x6A8E, 0xE9D5, 0x6A8F, 0x996B, 0x6A90, 0xE9DC, 0x6A91, 0xE9DB, 0x6A92, 0x996C, + 0x6A93, 0x996D, 0x6A94, 0x996E, 0x6A95, 0x996F, 0x6A96, 0x9970, 0x6A97, 0xE9DE, 0x6A98, 0x9971, 0x6A99, 0x9972, 0x6A9A, 0x9973, + 0x6A9B, 0x9974, 0x6A9C, 0x9975, 0x6A9D, 0x9976, 0x6A9E, 0x9977, 0x6A9F, 0x9978, 0x6AA0, 0xE9D1, 0x6AA1, 0x9979, 0x6AA2, 0x997A, + 0x6AA3, 0x997B, 0x6AA4, 0x997C, 0x6AA5, 0x997D, 0x6AA6, 0x997E, 0x6AA7, 0x9980, 0x6AA8, 0x9981, 0x6AA9, 0xE9DD, 0x6AAA, 0x9982, + 0x6AAB, 0xE9DF, 0x6AAC, 0xC3CA, 0x6AAD, 0x9983, 0x6AAE, 0x9984, 0x6AAF, 0x9985, 0x6AB0, 0x9986, 0x6AB1, 0x9987, 0x6AB2, 0x9988, + 0x6AB3, 0x9989, 0x6AB4, 0x998A, 0x6AB5, 0x998B, 0x6AB6, 0x998C, 0x6AB7, 0x998D, 0x6AB8, 0x998E, 0x6AB9, 0x998F, 0x6ABA, 0x9990, + 0x6ABB, 0x9991, 0x6ABC, 0x9992, 0x6ABD, 0x9993, 0x6ABE, 0x9994, 0x6ABF, 0x9995, 0x6AC0, 0x9996, 0x6AC1, 0x9997, 0x6AC2, 0x9998, + 0x6AC3, 0x9999, 0x6AC4, 0x999A, 0x6AC5, 0x999B, 0x6AC6, 0x999C, 0x6AC7, 0x999D, 0x6AC8, 0x999E, 0x6AC9, 0x999F, 0x6ACA, 0x99A0, + 0x6ACB, 0x99A1, 0x6ACC, 0x99A2, 0x6ACD, 0x99A3, 0x6ACE, 0x99A4, 0x6ACF, 0x99A5, 0x6AD0, 0x99A6, 0x6AD1, 0x99A7, 0x6AD2, 0x99A8, + 0x6AD3, 0x99A9, 0x6AD4, 0x99AA, 0x6AD5, 0x99AB, 0x6AD6, 0x99AC, 0x6AD7, 0x99AD, 0x6AD8, 0x99AE, 0x6AD9, 0x99AF, 0x6ADA, 0x99B0, + 0x6ADB, 0x99B1, 0x6ADC, 0x99B2, 0x6ADD, 0x99B3, 0x6ADE, 0x99B4, 0x6ADF, 0x99B5, 0x6AE0, 0x99B6, 0x6AE1, 0x99B7, 0x6AE2, 0x99B8, + 0x6AE3, 0x99B9, 0x6AE4, 0x99BA, 0x6AE5, 0x99BB, 0x6AE6, 0x99BC, 0x6AE7, 0x99BD, 0x6AE8, 0x99BE, 0x6AE9, 0x99BF, 0x6AEA, 0x99C0, + 0x6AEB, 0x99C1, 0x6AEC, 0x99C2, 0x6AED, 0x99C3, 0x6AEE, 0x99C4, 0x6AEF, 0x99C5, 0x6AF0, 0x99C6, 0x6AF1, 0x99C7, 0x6AF2, 0x99C8, + 0x6AF3, 0x99C9, 0x6AF4, 0x99CA, 0x6AF5, 0x99CB, 0x6AF6, 0x99CC, 0x6AF7, 0x99CD, 0x6AF8, 0x99CE, 0x6AF9, 0x99CF, 0x6AFA, 0x99D0, + 0x6AFB, 0x99D1, 0x6AFC, 0x99D2, 0x6AFD, 0x99D3, 0x6AFE, 0x99D4, 0x6AFF, 0x99D5, 0x6B00, 0x99D6, 0x6B01, 0x99D7, 0x6B02, 0x99D8, + 0x6B03, 0x99D9, 0x6B04, 0x99DA, 0x6B05, 0x99DB, 0x6B06, 0x99DC, 0x6B07, 0x99DD, 0x6B08, 0x99DE, 0x6B09, 0x99DF, 0x6B0A, 0x99E0, + 0x6B0B, 0x99E1, 0x6B0C, 0x99E2, 0x6B0D, 0x99E3, 0x6B0E, 0x99E4, 0x6B0F, 0x99E5, 0x6B10, 0x99E6, 0x6B11, 0x99E7, 0x6B12, 0x99E8, + 0x6B13, 0x99E9, 0x6B14, 0x99EA, 0x6B15, 0x99EB, 0x6B16, 0x99EC, 0x6B17, 0x99ED, 0x6B18, 0x99EE, 0x6B19, 0x99EF, 0x6B1A, 0x99F0, + 0x6B1B, 0x99F1, 0x6B1C, 0x99F2, 0x6B1D, 0x99F3, 0x6B1E, 0x99F4, 0x6B1F, 0x99F5, 0x6B20, 0xC7B7, 0x6B21, 0xB4CE, 0x6B22, 0xBBB6, + 0x6B23, 0xD0C0, 0x6B24, 0xECA3, 0x6B25, 0x99F6, 0x6B26, 0x99F7, 0x6B27, 0xC5B7, 0x6B28, 0x99F8, 0x6B29, 0x99F9, 0x6B2A, 0x99FA, + 0x6B2B, 0x99FB, 0x6B2C, 0x99FC, 0x6B2D, 0x99FD, 0x6B2E, 0x99FE, 0x6B2F, 0x9A40, 0x6B30, 0x9A41, 0x6B31, 0x9A42, 0x6B32, 0xD3FB, + 0x6B33, 0x9A43, 0x6B34, 0x9A44, 0x6B35, 0x9A45, 0x6B36, 0x9A46, 0x6B37, 0xECA4, 0x6B38, 0x9A47, 0x6B39, 0xECA5, 0x6B3A, 0xC6DB, + 0x6B3B, 0x9A48, 0x6B3C, 0x9A49, 0x6B3D, 0x9A4A, 0x6B3E, 0xBFEE, 0x6B3F, 0x9A4B, 0x6B40, 0x9A4C, 0x6B41, 0x9A4D, 0x6B42, 0x9A4E, + 0x6B43, 0xECA6, 0x6B44, 0x9A4F, 0x6B45, 0x9A50, 0x6B46, 0xECA7, 0x6B47, 0xD0AA, 0x6B48, 0x9A51, 0x6B49, 0xC7B8, 0x6B4A, 0x9A52, + 0x6B4B, 0x9A53, 0x6B4C, 0xB8E8, 0x6B4D, 0x9A54, 0x6B4E, 0x9A55, 0x6B4F, 0x9A56, 0x6B50, 0x9A57, 0x6B51, 0x9A58, 0x6B52, 0x9A59, + 0x6B53, 0x9A5A, 0x6B54, 0x9A5B, 0x6B55, 0x9A5C, 0x6B56, 0x9A5D, 0x6B57, 0x9A5E, 0x6B58, 0x9A5F, 0x6B59, 0xECA8, 0x6B5A, 0x9A60, + 0x6B5B, 0x9A61, 0x6B5C, 0x9A62, 0x6B5D, 0x9A63, 0x6B5E, 0x9A64, 0x6B5F, 0x9A65, 0x6B60, 0x9A66, 0x6B61, 0x9A67, 0x6B62, 0xD6B9, + 0x6B63, 0xD5FD, 0x6B64, 0xB4CB, 0x6B65, 0xB2BD, 0x6B66, 0xCEE4, 0x6B67, 0xC6E7, 0x6B68, 0x9A68, 0x6B69, 0x9A69, 0x6B6A, 0xCDE1, + 0x6B6B, 0x9A6A, 0x6B6C, 0x9A6B, 0x6B6D, 0x9A6C, 0x6B6E, 0x9A6D, 0x6B6F, 0x9A6E, 0x6B70, 0x9A6F, 0x6B71, 0x9A70, 0x6B72, 0x9A71, + 0x6B73, 0x9A72, 0x6B74, 0x9A73, 0x6B75, 0x9A74, 0x6B76, 0x9A75, 0x6B77, 0x9A76, 0x6B78, 0x9A77, 0x6B79, 0xB4F5, 0x6B7A, 0x9A78, + 0x6B7B, 0xCBC0, 0x6B7C, 0xBCDF, 0x6B7D, 0x9A79, 0x6B7E, 0x9A7A, 0x6B7F, 0x9A7B, 0x6B80, 0x9A7C, 0x6B81, 0xE9E2, 0x6B82, 0xE9E3, + 0x6B83, 0xD1EA, 0x6B84, 0xE9E5, 0x6B85, 0x9A7D, 0x6B86, 0xB4F9, 0x6B87, 0xE9E4, 0x6B88, 0x9A7E, 0x6B89, 0xD1B3, 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, 0x6B8C, 0x9A80, 0x6B8D, 0xE9E8, 0x6B8E, 0x9A81, 0x6B8F, 0x9A82, 0x6B90, 0x9A83, 0x6B91, 0x9A84, 0x6B92, 0xE9E6, + 0x6B93, 0xE9E7, 0x6B94, 0x9A85, 0x6B95, 0x9A86, 0x6B96, 0xD6B3, 0x6B97, 0x9A87, 0x6B98, 0x9A88, 0x6B99, 0x9A89, 0x6B9A, 0xE9E9, + 0x6B9B, 0xE9EA, 0x6B9C, 0x9A8A, 0x6B9D, 0x9A8B, 0x6B9E, 0x9A8C, 0x6B9F, 0x9A8D, 0x6BA0, 0x9A8E, 0x6BA1, 0xE9EB, 0x6BA2, 0x9A8F, + 0x6BA3, 0x9A90, 0x6BA4, 0x9A91, 0x6BA5, 0x9A92, 0x6BA6, 0x9A93, 0x6BA7, 0x9A94, 0x6BA8, 0x9A95, 0x6BA9, 0x9A96, 0x6BAA, 0xE9EC, + 0x6BAB, 0x9A97, 0x6BAC, 0x9A98, 0x6BAD, 0x9A99, 0x6BAE, 0x9A9A, 0x6BAF, 0x9A9B, 0x6BB0, 0x9A9C, 0x6BB1, 0x9A9D, 0x6BB2, 0x9A9E, + 0x6BB3, 0xECAF, 0x6BB4, 0xC5B9, 0x6BB5, 0xB6CE, 0x6BB6, 0x9A9F, 0x6BB7, 0xD2F3, 0x6BB8, 0x9AA0, 0x6BB9, 0x9AA1, 0x6BBA, 0x9AA2, + 0x6BBB, 0x9AA3, 0x6BBC, 0x9AA4, 0x6BBD, 0x9AA5, 0x6BBE, 0x9AA6, 0x6BBF, 0xB5EE, 0x6BC0, 0x9AA7, 0x6BC1, 0xBBD9, 0x6BC2, 0xECB1, + 0x6BC3, 0x9AA8, 0x6BC4, 0x9AA9, 0x6BC5, 0xD2E3, 0x6BC6, 0x9AAA, 0x6BC7, 0x9AAB, 0x6BC8, 0x9AAC, 0x6BC9, 0x9AAD, 0x6BCA, 0x9AAE, + 0x6BCB, 0xCEE3, 0x6BCC, 0x9AAF, 0x6BCD, 0xC4B8, 0x6BCE, 0x9AB0, 0x6BCF, 0xC3BF, 0x6BD0, 0x9AB1, 0x6BD1, 0x9AB2, 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, 0x6BD4, 0xB1C8, 0x6BD5, 0xB1CF, 0x6BD6, 0xB1D1, 0x6BD7, 0xC5FE, 0x6BD8, 0x9AB3, 0x6BD9, 0xB1D0, 0x6BDA, 0x9AB4, + 0x6BDB, 0xC3AB, 0x6BDC, 0x9AB5, 0x6BDD, 0x9AB6, 0x6BDE, 0x9AB7, 0x6BDF, 0x9AB8, 0x6BE0, 0x9AB9, 0x6BE1, 0xD5B1, 0x6BE2, 0x9ABA, + 0x6BE3, 0x9ABB, 0x6BE4, 0x9ABC, 0x6BE5, 0x9ABD, 0x6BE6, 0x9ABE, 0x6BE7, 0x9ABF, 0x6BE8, 0x9AC0, 0x6BE9, 0x9AC1, 0x6BEA, 0xEBA4, + 0x6BEB, 0xBAC1, 0x6BEC, 0x9AC2, 0x6BED, 0x9AC3, 0x6BEE, 0x9AC4, 0x6BEF, 0xCCBA, 0x6BF0, 0x9AC5, 0x6BF1, 0x9AC6, 0x6BF2, 0x9AC7, + 0x6BF3, 0xEBA5, 0x6BF4, 0x9AC8, 0x6BF5, 0xEBA7, 0x6BF6, 0x9AC9, 0x6BF7, 0x9ACA, 0x6BF8, 0x9ACB, 0x6BF9, 0xEBA8, 0x6BFA, 0x9ACC, + 0x6BFB, 0x9ACD, 0x6BFC, 0x9ACE, 0x6BFD, 0xEBA6, 0x6BFE, 0x9ACF, 0x6BFF, 0x9AD0, 0x6C00, 0x9AD1, 0x6C01, 0x9AD2, 0x6C02, 0x9AD3, + 0x6C03, 0x9AD4, 0x6C04, 0x9AD5, 0x6C05, 0xEBA9, 0x6C06, 0xEBAB, 0x6C07, 0xEBAA, 0x6C08, 0x9AD6, 0x6C09, 0x9AD7, 0x6C0A, 0x9AD8, + 0x6C0B, 0x9AD9, 0x6C0C, 0x9ADA, 0x6C0D, 0xEBAC, 0x6C0E, 0x9ADB, 0x6C0F, 0xCACF, 0x6C10, 0xD8B5, 0x6C11, 0xC3F1, 0x6C12, 0x9ADC, + 0x6C13, 0xC3A5, 0x6C14, 0xC6F8, 0x6C15, 0xEBAD, 0x6C16, 0xC4CA, 0x6C17, 0x9ADD, 0x6C18, 0xEBAE, 0x6C19, 0xEBAF, 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, 0x6C1C, 0x9ADE, 0x6C1D, 0x9ADF, 0x6C1E, 0x9AE0, 0x6C1F, 0xB7FA, 0x6C20, 0x9AE1, 0x6C21, 0xEBB1, 0x6C22, 0xC7E2, + 0x6C23, 0x9AE2, 0x6C24, 0xEBB3, 0x6C25, 0x9AE3, 0x6C26, 0xBAA4, 0x6C27, 0xD1F5, 0x6C28, 0xB0B1, 0x6C29, 0xEBB2, 0x6C2A, 0xEBB4, + 0x6C2B, 0x9AE4, 0x6C2C, 0x9AE5, 0x6C2D, 0x9AE6, 0x6C2E, 0xB5AA, 0x6C2F, 0xC2C8, 0x6C30, 0xC7E8, 0x6C31, 0x9AE7, 0x6C32, 0xEBB5, + 0x6C33, 0x9AE8, 0x6C34, 0xCBAE, 0x6C35, 0xE3DF, 0x6C36, 0x9AE9, 0x6C37, 0x9AEA, 0x6C38, 0xD3C0, 0x6C39, 0x9AEB, 0x6C3A, 0x9AEC, + 0x6C3B, 0x9AED, 0x6C3C, 0x9AEE, 0x6C3D, 0xD9DB, 0x6C3E, 0x9AEF, 0x6C3F, 0x9AF0, 0x6C40, 0xCDA1, 0x6C41, 0xD6AD, 0x6C42, 0xC7F3, + 0x6C43, 0x9AF1, 0x6C44, 0x9AF2, 0x6C45, 0x9AF3, 0x6C46, 0xD9E0, 0x6C47, 0xBBE3, 0x6C48, 0x9AF4, 0x6C49, 0xBABA, 0x6C4A, 0xE3E2, + 0x6C4B, 0x9AF5, 0x6C4C, 0x9AF6, 0x6C4D, 0x9AF7, 0x6C4E, 0x9AF8, 0x6C4F, 0x9AF9, 0x6C50, 0xCFAB, 0x6C51, 0x9AFA, 0x6C52, 0x9AFB, + 0x6C53, 0x9AFC, 0x6C54, 0xE3E0, 0x6C55, 0xC9C7, 0x6C56, 0x9AFD, 0x6C57, 0xBAB9, 0x6C58, 0x9AFE, 0x6C59, 0x9B40, 0x6C5A, 0x9B41, + 0x6C5B, 0xD1B4, 0x6C5C, 0xE3E1, 0x6C5D, 0xC8EA, 0x6C5E, 0xB9AF, 0x6C5F, 0xBDAD, 0x6C60, 0xB3D8, 0x6C61, 0xCEDB, 0x6C62, 0x9B42, + 0x6C63, 0x9B43, 0x6C64, 0xCCC0, 0x6C65, 0x9B44, 0x6C66, 0x9B45, 0x6C67, 0x9B46, 0x6C68, 0xE3E8, 0x6C69, 0xE3E9, 0x6C6A, 0xCDF4, + 0x6C6B, 0x9B47, 0x6C6C, 0x9B48, 0x6C6D, 0x9B49, 0x6C6E, 0x9B4A, 0x6C6F, 0x9B4B, 0x6C70, 0xCCAD, 0x6C71, 0x9B4C, 0x6C72, 0xBCB3, + 0x6C73, 0x9B4D, 0x6C74, 0xE3EA, 0x6C75, 0x9B4E, 0x6C76, 0xE3EB, 0x6C77, 0x9B4F, 0x6C78, 0x9B50, 0x6C79, 0xD0DA, 0x6C7A, 0x9B51, + 0x6C7B, 0x9B52, 0x6C7C, 0x9B53, 0x6C7D, 0xC6FB, 0x6C7E, 0xB7DA, 0x6C7F, 0x9B54, 0x6C80, 0x9B55, 0x6C81, 0xC7DF, 0x6C82, 0xD2CA, + 0x6C83, 0xCED6, 0x6C84, 0x9B56, 0x6C85, 0xE3E4, 0x6C86, 0xE3EC, 0x6C87, 0x9B57, 0x6C88, 0xC9F2, 0x6C89, 0xB3C1, 0x6C8A, 0x9B58, + 0x6C8B, 0x9B59, 0x6C8C, 0xE3E7, 0x6C8D, 0x9B5A, 0x6C8E, 0x9B5B, 0x6C8F, 0xC6E3, 0x6C90, 0xE3E5, 0x6C91, 0x9B5C, 0x6C92, 0x9B5D, + 0x6C93, 0xEDB3, 0x6C94, 0xE3E6, 0x6C95, 0x9B5E, 0x6C96, 0x9B5F, 0x6C97, 0x9B60, 0x6C98, 0x9B61, 0x6C99, 0xC9B3, 0x6C9A, 0x9B62, + 0x6C9B, 0xC5E6, 0x6C9C, 0x9B63, 0x6C9D, 0x9B64, 0x6C9E, 0x9B65, 0x6C9F, 0xB9B5, 0x6CA0, 0x9B66, 0x6CA1, 0xC3BB, 0x6CA2, 0x9B67, + 0x6CA3, 0xE3E3, 0x6CA4, 0xC5BD, 0x6CA5, 0xC1A4, 0x6CA6, 0xC2D9, 0x6CA7, 0xB2D7, 0x6CA8, 0x9B68, 0x6CA9, 0xE3ED, 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, 0x6CAC, 0x9B69, 0x6CAD, 0xE3F0, 0x6CAE, 0xBEDA, 0x6CAF, 0x9B6A, 0x6CB0, 0x9B6B, 0x6CB1, 0xE3FB, 0x6CB2, 0xE3F5, + 0x6CB3, 0xBAD3, 0x6CB4, 0x9B6C, 0x6CB5, 0x9B6D, 0x6CB6, 0x9B6E, 0x6CB7, 0x9B6F, 0x6CB8, 0xB7D0, 0x6CB9, 0xD3CD, 0x6CBA, 0x9B70, + 0x6CBB, 0xD6CE, 0x6CBC, 0xD5D3, 0x6CBD, 0xB9C1, 0x6CBE, 0xD5B4, 0x6CBF, 0xD1D8, 0x6CC0, 0x9B71, 0x6CC1, 0x9B72, 0x6CC2, 0x9B73, + 0x6CC3, 0x9B74, 0x6CC4, 0xD0B9, 0x6CC5, 0xC7F6, 0x6CC6, 0x9B75, 0x6CC7, 0x9B76, 0x6CC8, 0x9B77, 0x6CC9, 0xC8AA, 0x6CCA, 0xB2B4, + 0x6CCB, 0x9B78, 0x6CCC, 0xC3DA, 0x6CCD, 0x9B79, 0x6CCE, 0x9B7A, 0x6CCF, 0x9B7B, 0x6CD0, 0xE3EE, 0x6CD1, 0x9B7C, 0x6CD2, 0x9B7D, + 0x6CD3, 0xE3FC, 0x6CD4, 0xE3EF, 0x6CD5, 0xB7A8, 0x6CD6, 0xE3F7, 0x6CD7, 0xE3F4, 0x6CD8, 0x9B7E, 0x6CD9, 0x9B80, 0x6CDA, 0x9B81, + 0x6CDB, 0xB7BA, 0x6CDC, 0x9B82, 0x6CDD, 0x9B83, 0x6CDE, 0xC5A2, 0x6CDF, 0x9B84, 0x6CE0, 0xE3F6, 0x6CE1, 0xC5DD, 0x6CE2, 0xB2A8, + 0x6CE3, 0xC6FC, 0x6CE4, 0x9B85, 0x6CE5, 0xC4E0, 0x6CE6, 0x9B86, 0x6CE7, 0x9B87, 0x6CE8, 0xD7A2, 0x6CE9, 0x9B88, 0x6CEA, 0xC0E1, + 0x6CEB, 0xE3F9, 0x6CEC, 0x9B89, 0x6CED, 0x9B8A, 0x6CEE, 0xE3FA, 0x6CEF, 0xE3FD, 0x6CF0, 0xCCA9, 0x6CF1, 0xE3F3, 0x6CF2, 0x9B8B, + 0x6CF3, 0xD3BE, 0x6CF4, 0x9B8C, 0x6CF5, 0xB1C3, 0x6CF6, 0xEDB4, 0x6CF7, 0xE3F1, 0x6CF8, 0xE3F2, 0x6CF9, 0x9B8D, 0x6CFA, 0xE3F8, + 0x6CFB, 0xD0BA, 0x6CFC, 0xC6C3, 0x6CFD, 0xD4F3, 0x6CFE, 0xE3FE, 0x6CFF, 0x9B8E, 0x6D00, 0x9B8F, 0x6D01, 0xBDE0, 0x6D02, 0x9B90, + 0x6D03, 0x9B91, 0x6D04, 0xE4A7, 0x6D05, 0x9B92, 0x6D06, 0x9B93, 0x6D07, 0xE4A6, 0x6D08, 0x9B94, 0x6D09, 0x9B95, 0x6D0A, 0x9B96, + 0x6D0B, 0xD1F3, 0x6D0C, 0xE4A3, 0x6D0D, 0x9B97, 0x6D0E, 0xE4A9, 0x6D0F, 0x9B98, 0x6D10, 0x9B99, 0x6D11, 0x9B9A, 0x6D12, 0xC8F7, + 0x6D13, 0x9B9B, 0x6D14, 0x9B9C, 0x6D15, 0x9B9D, 0x6D16, 0x9B9E, 0x6D17, 0xCFB4, 0x6D18, 0x9B9F, 0x6D19, 0xE4A8, 0x6D1A, 0xE4AE, + 0x6D1B, 0xC2E5, 0x6D1C, 0x9BA0, 0x6D1D, 0x9BA1, 0x6D1E, 0xB6B4, 0x6D1F, 0x9BA2, 0x6D20, 0x9BA3, 0x6D21, 0x9BA4, 0x6D22, 0x9BA5, + 0x6D23, 0x9BA6, 0x6D24, 0x9BA7, 0x6D25, 0xBDF2, 0x6D26, 0x9BA8, 0x6D27, 0xE4A2, 0x6D28, 0x9BA9, 0x6D29, 0x9BAA, 0x6D2A, 0xBAE9, + 0x6D2B, 0xE4AA, 0x6D2C, 0x9BAB, 0x6D2D, 0x9BAC, 0x6D2E, 0xE4AC, 0x6D2F, 0x9BAD, 0x6D30, 0x9BAE, 0x6D31, 0xB6FD, 0x6D32, 0xD6DE, + 0x6D33, 0xE4B2, 0x6D34, 0x9BAF, 0x6D35, 0xE4AD, 0x6D36, 0x9BB0, 0x6D37, 0x9BB1, 0x6D38, 0x9BB2, 0x6D39, 0xE4A1, 0x6D3A, 0x9BB3, + 0x6D3B, 0xBBEE, 0x6D3C, 0xCDDD, 0x6D3D, 0xC7A2, 0x6D3E, 0xC5C9, 0x6D3F, 0x9BB4, 0x6D40, 0x9BB5, 0x6D41, 0xC1F7, 0x6D42, 0x9BB6, + 0x6D43, 0xE4A4, 0x6D44, 0x9BB7, 0x6D45, 0xC7B3, 0x6D46, 0xBDAC, 0x6D47, 0xBDBD, 0x6D48, 0xE4A5, 0x6D49, 0x9BB8, 0x6D4A, 0xD7C7, + 0x6D4B, 0xB2E2, 0x6D4C, 0x9BB9, 0x6D4D, 0xE4AB, 0x6D4E, 0xBCC3, 0x6D4F, 0xE4AF, 0x6D50, 0x9BBA, 0x6D51, 0xBBEB, 0x6D52, 0xE4B0, + 0x6D53, 0xC5A8, 0x6D54, 0xE4B1, 0x6D55, 0x9BBB, 0x6D56, 0x9BBC, 0x6D57, 0x9BBD, 0x6D58, 0x9BBE, 0x6D59, 0xD5E3, 0x6D5A, 0xBFA3, + 0x6D5B, 0x9BBF, 0x6D5C, 0xE4BA, 0x6D5D, 0x9BC0, 0x6D5E, 0xE4B7, 0x6D5F, 0x9BC1, 0x6D60, 0xE4BB, 0x6D61, 0x9BC2, 0x6D62, 0x9BC3, + 0x6D63, 0xE4BD, 0x6D64, 0x9BC4, 0x6D65, 0x9BC5, 0x6D66, 0xC6D6, 0x6D67, 0x9BC6, 0x6D68, 0x9BC7, 0x6D69, 0xBAC6, 0x6D6A, 0xC0CB, + 0x6D6B, 0x9BC8, 0x6D6C, 0x9BC9, 0x6D6D, 0x9BCA, 0x6D6E, 0xB8A1, 0x6D6F, 0xE4B4, 0x6D70, 0x9BCB, 0x6D71, 0x9BCC, 0x6D72, 0x9BCD, + 0x6D73, 0x9BCE, 0x6D74, 0xD4A1, 0x6D75, 0x9BCF, 0x6D76, 0x9BD0, 0x6D77, 0xBAA3, 0x6D78, 0xBDFE, 0x6D79, 0x9BD1, 0x6D7A, 0x9BD2, + 0x6D7B, 0x9BD3, 0x6D7C, 0xE4BC, 0x6D7D, 0x9BD4, 0x6D7E, 0x9BD5, 0x6D7F, 0x9BD6, 0x6D80, 0x9BD7, 0x6D81, 0x9BD8, 0x6D82, 0xCDBF, + 0x6D83, 0x9BD9, 0x6D84, 0x9BDA, 0x6D85, 0xC4F9, 0x6D86, 0x9BDB, 0x6D87, 0x9BDC, 0x6D88, 0xCFFB, 0x6D89, 0xC9E6, 0x6D8A, 0x9BDD, + 0x6D8B, 0x9BDE, 0x6D8C, 0xD3BF, 0x6D8D, 0x9BDF, 0x6D8E, 0xCFD1, 0x6D8F, 0x9BE0, 0x6D90, 0x9BE1, 0x6D91, 0xE4B3, 0x6D92, 0x9BE2, + 0x6D93, 0xE4B8, 0x6D94, 0xE4B9, 0x6D95, 0xCCE9, 0x6D96, 0x9BE3, 0x6D97, 0x9BE4, 0x6D98, 0x9BE5, 0x6D99, 0x9BE6, 0x6D9A, 0x9BE7, + 0x6D9B, 0xCCCE, 0x6D9C, 0x9BE8, 0x6D9D, 0xC0D4, 0x6D9E, 0xE4B5, 0x6D9F, 0xC1B0, 0x6DA0, 0xE4B6, 0x6DA1, 0xCED0, 0x6DA2, 0x9BE9, + 0x6DA3, 0xBBC1, 0x6DA4, 0xB5D3, 0x6DA5, 0x9BEA, 0x6DA6, 0xC8F3, 0x6DA7, 0xBDA7, 0x6DA8, 0xD5C7, 0x6DA9, 0xC9AC, 0x6DAA, 0xB8A2, + 0x6DAB, 0xE4CA, 0x6DAC, 0x9BEB, 0x6DAD, 0x9BEC, 0x6DAE, 0xE4CC, 0x6DAF, 0xD1C4, 0x6DB0, 0x9BED, 0x6DB1, 0x9BEE, 0x6DB2, 0xD2BA, + 0x6DB3, 0x9BEF, 0x6DB4, 0x9BF0, 0x6DB5, 0xBAAD, 0x6DB6, 0x9BF1, 0x6DB7, 0x9BF2, 0x6DB8, 0xBAD4, 0x6DB9, 0x9BF3, 0x6DBA, 0x9BF4, + 0x6DBB, 0x9BF5, 0x6DBC, 0x9BF6, 0x6DBD, 0x9BF7, 0x6DBE, 0x9BF8, 0x6DBF, 0xE4C3, 0x6DC0, 0xB5ED, 0x6DC1, 0x9BF9, 0x6DC2, 0x9BFA, + 0x6DC3, 0x9BFB, 0x6DC4, 0xD7CD, 0x6DC5, 0xE4C0, 0x6DC6, 0xCFFD, 0x6DC7, 0xE4BF, 0x6DC8, 0x9BFC, 0x6DC9, 0x9BFD, 0x6DCA, 0x9BFE, + 0x6DCB, 0xC1DC, 0x6DCC, 0xCCCA, 0x6DCD, 0x9C40, 0x6DCE, 0x9C41, 0x6DCF, 0x9C42, 0x6DD0, 0x9C43, 0x6DD1, 0xCAE7, 0x6DD2, 0x9C44, + 0x6DD3, 0x9C45, 0x6DD4, 0x9C46, 0x6DD5, 0x9C47, 0x6DD6, 0xC4D7, 0x6DD7, 0x9C48, 0x6DD8, 0xCCD4, 0x6DD9, 0xE4C8, 0x6DDA, 0x9C49, + 0x6DDB, 0x9C4A, 0x6DDC, 0x9C4B, 0x6DDD, 0xE4C7, 0x6DDE, 0xE4C1, 0x6DDF, 0x9C4C, 0x6DE0, 0xE4C4, 0x6DE1, 0xB5AD, 0x6DE2, 0x9C4D, + 0x6DE3, 0x9C4E, 0x6DE4, 0xD3D9, 0x6DE5, 0x9C4F, 0x6DE6, 0xE4C6, 0x6DE7, 0x9C50, 0x6DE8, 0x9C51, 0x6DE9, 0x9C52, 0x6DEA, 0x9C53, + 0x6DEB, 0xD2F9, 0x6DEC, 0xB4E3, 0x6DED, 0x9C54, 0x6DEE, 0xBBB4, 0x6DEF, 0x9C55, 0x6DF0, 0x9C56, 0x6DF1, 0xC9EE, 0x6DF2, 0x9C57, + 0x6DF3, 0xB4BE, 0x6DF4, 0x9C58, 0x6DF5, 0x9C59, 0x6DF6, 0x9C5A, 0x6DF7, 0xBBEC, 0x6DF8, 0x9C5B, 0x6DF9, 0xD1CD, 0x6DFA, 0x9C5C, + 0x6DFB, 0xCCED, 0x6DFC, 0xEDB5, 0x6DFD, 0x9C5D, 0x6DFE, 0x9C5E, 0x6DFF, 0x9C5F, 0x6E00, 0x9C60, 0x6E01, 0x9C61, 0x6E02, 0x9C62, + 0x6E03, 0x9C63, 0x6E04, 0x9C64, 0x6E05, 0xC7E5, 0x6E06, 0x9C65, 0x6E07, 0x9C66, 0x6E08, 0x9C67, 0x6E09, 0x9C68, 0x6E0A, 0xD4A8, + 0x6E0B, 0x9C69, 0x6E0C, 0xE4CB, 0x6E0D, 0xD7D5, 0x6E0E, 0xE4C2, 0x6E0F, 0x9C6A, 0x6E10, 0xBDA5, 0x6E11, 0xE4C5, 0x6E12, 0x9C6B, + 0x6E13, 0x9C6C, 0x6E14, 0xD3E6, 0x6E15, 0x9C6D, 0x6E16, 0xE4C9, 0x6E17, 0xC9F8, 0x6E18, 0x9C6E, 0x6E19, 0x9C6F, 0x6E1A, 0xE4BE, + 0x6E1B, 0x9C70, 0x6E1C, 0x9C71, 0x6E1D, 0xD3E5, 0x6E1E, 0x9C72, 0x6E1F, 0x9C73, 0x6E20, 0xC7FE, 0x6E21, 0xB6C9, 0x6E22, 0x9C74, + 0x6E23, 0xD4FC, 0x6E24, 0xB2B3, 0x6E25, 0xE4D7, 0x6E26, 0x9C75, 0x6E27, 0x9C76, 0x6E28, 0x9C77, 0x6E29, 0xCEC2, 0x6E2A, 0x9C78, + 0x6E2B, 0xE4CD, 0x6E2C, 0x9C79, 0x6E2D, 0xCEBC, 0x6E2E, 0x9C7A, 0x6E2F, 0xB8DB, 0x6E30, 0x9C7B, 0x6E31, 0x9C7C, 0x6E32, 0xE4D6, + 0x6E33, 0x9C7D, 0x6E34, 0xBFCA, 0x6E35, 0x9C7E, 0x6E36, 0x9C80, 0x6E37, 0x9C81, 0x6E38, 0xD3CE, 0x6E39, 0x9C82, 0x6E3A, 0xC3EC, + 0x6E3B, 0x9C83, 0x6E3C, 0x9C84, 0x6E3D, 0x9C85, 0x6E3E, 0x9C86, 0x6E3F, 0x9C87, 0x6E40, 0x9C88, 0x6E41, 0x9C89, 0x6E42, 0x9C8A, + 0x6E43, 0xC5C8, 0x6E44, 0xE4D8, 0x6E45, 0x9C8B, 0x6E46, 0x9C8C, 0x6E47, 0x9C8D, 0x6E48, 0x9C8E, 0x6E49, 0x9C8F, 0x6E4A, 0x9C90, + 0x6E4B, 0x9C91, 0x6E4C, 0x9C92, 0x6E4D, 0xCDC4, 0x6E4E, 0xE4CF, 0x6E4F, 0x9C93, 0x6E50, 0x9C94, 0x6E51, 0x9C95, 0x6E52, 0x9C96, + 0x6E53, 0xE4D4, 0x6E54, 0xE4D5, 0x6E55, 0x9C97, 0x6E56, 0xBAFE, 0x6E57, 0x9C98, 0x6E58, 0xCFE6, 0x6E59, 0x9C99, 0x6E5A, 0x9C9A, + 0x6E5B, 0xD5BF, 0x6E5C, 0x9C9B, 0x6E5D, 0x9C9C, 0x6E5E, 0x9C9D, 0x6E5F, 0xE4D2, 0x6E60, 0x9C9E, 0x6E61, 0x9C9F, 0x6E62, 0x9CA0, + 0x6E63, 0x9CA1, 0x6E64, 0x9CA2, 0x6E65, 0x9CA3, 0x6E66, 0x9CA4, 0x6E67, 0x9CA5, 0x6E68, 0x9CA6, 0x6E69, 0x9CA7, 0x6E6A, 0x9CA8, + 0x6E6B, 0xE4D0, 0x6E6C, 0x9CA9, 0x6E6D, 0x9CAA, 0x6E6E, 0xE4CE, 0x6E6F, 0x9CAB, 0x6E70, 0x9CAC, 0x6E71, 0x9CAD, 0x6E72, 0x9CAE, + 0x6E73, 0x9CAF, 0x6E74, 0x9CB0, 0x6E75, 0x9CB1, 0x6E76, 0x9CB2, 0x6E77, 0x9CB3, 0x6E78, 0x9CB4, 0x6E79, 0x9CB5, 0x6E7A, 0x9CB6, + 0x6E7B, 0x9CB7, 0x6E7C, 0x9CB8, 0x6E7D, 0x9CB9, 0x6E7E, 0xCDE5, 0x6E7F, 0xCAAA, 0x6E80, 0x9CBA, 0x6E81, 0x9CBB, 0x6E82, 0x9CBC, + 0x6E83, 0xC0A3, 0x6E84, 0x9CBD, 0x6E85, 0xBDA6, 0x6E86, 0xE4D3, 0x6E87, 0x9CBE, 0x6E88, 0x9CBF, 0x6E89, 0xB8C8, 0x6E8A, 0x9CC0, + 0x6E8B, 0x9CC1, 0x6E8C, 0x9CC2, 0x6E8D, 0x9CC3, 0x6E8E, 0x9CC4, 0x6E8F, 0xE4E7, 0x6E90, 0xD4B4, 0x6E91, 0x9CC5, 0x6E92, 0x9CC6, + 0x6E93, 0x9CC7, 0x6E94, 0x9CC8, 0x6E95, 0x9CC9, 0x6E96, 0x9CCA, 0x6E97, 0x9CCB, 0x6E98, 0xE4DB, 0x6E99, 0x9CCC, 0x6E9A, 0x9CCD, + 0x6E9B, 0x9CCE, 0x6E9C, 0xC1EF, 0x6E9D, 0x9CCF, 0x6E9E, 0x9CD0, 0x6E9F, 0xE4E9, 0x6EA0, 0x9CD1, 0x6EA1, 0x9CD2, 0x6EA2, 0xD2E7, + 0x6EA3, 0x9CD3, 0x6EA4, 0x9CD4, 0x6EA5, 0xE4DF, 0x6EA6, 0x9CD5, 0x6EA7, 0xE4E0, 0x6EA8, 0x9CD6, 0x6EA9, 0x9CD7, 0x6EAA, 0xCFAA, + 0x6EAB, 0x9CD8, 0x6EAC, 0x9CD9, 0x6EAD, 0x9CDA, 0x6EAE, 0x9CDB, 0x6EAF, 0xCBDD, 0x6EB0, 0x9CDC, 0x6EB1, 0xE4DA, 0x6EB2, 0xE4D1, + 0x6EB3, 0x9CDD, 0x6EB4, 0xE4E5, 0x6EB5, 0x9CDE, 0x6EB6, 0xC8DC, 0x6EB7, 0xE4E3, 0x6EB8, 0x9CDF, 0x6EB9, 0x9CE0, 0x6EBA, 0xC4E7, + 0x6EBB, 0xE4E2, 0x6EBC, 0x9CE1, 0x6EBD, 0xE4E1, 0x6EBE, 0x9CE2, 0x6EBF, 0x9CE3, 0x6EC0, 0x9CE4, 0x6EC1, 0xB3FC, 0x6EC2, 0xE4E8, + 0x6EC3, 0x9CE5, 0x6EC4, 0x9CE6, 0x6EC5, 0x9CE7, 0x6EC6, 0x9CE8, 0x6EC7, 0xB5E1, 0x6EC8, 0x9CE9, 0x6EC9, 0x9CEA, 0x6ECA, 0x9CEB, + 0x6ECB, 0xD7CC, 0x6ECC, 0x9CEC, 0x6ECD, 0x9CED, 0x6ECE, 0x9CEE, 0x6ECF, 0xE4E6, 0x6ED0, 0x9CEF, 0x6ED1, 0xBBAC, 0x6ED2, 0x9CF0, + 0x6ED3, 0xD7D2, 0x6ED4, 0xCCCF, 0x6ED5, 0xEBF8, 0x6ED6, 0x9CF1, 0x6ED7, 0xE4E4, 0x6ED8, 0x9CF2, 0x6ED9, 0x9CF3, 0x6EDA, 0xB9F6, + 0x6EDB, 0x9CF4, 0x6EDC, 0x9CF5, 0x6EDD, 0x9CF6, 0x6EDE, 0xD6CD, 0x6EDF, 0xE4D9, 0x6EE0, 0xE4DC, 0x6EE1, 0xC2FA, 0x6EE2, 0xE4DE, + 0x6EE3, 0x9CF7, 0x6EE4, 0xC2CB, 0x6EE5, 0xC0C4, 0x6EE6, 0xC2D0, 0x6EE7, 0x9CF8, 0x6EE8, 0xB1F5, 0x6EE9, 0xCCB2, 0x6EEA, 0x9CF9, + 0x6EEB, 0x9CFA, 0x6EEC, 0x9CFB, 0x6EED, 0x9CFC, 0x6EEE, 0x9CFD, 0x6EEF, 0x9CFE, 0x6EF0, 0x9D40, 0x6EF1, 0x9D41, 0x6EF2, 0x9D42, + 0x6EF3, 0x9D43, 0x6EF4, 0xB5CE, 0x6EF5, 0x9D44, 0x6EF6, 0x9D45, 0x6EF7, 0x9D46, 0x6EF8, 0x9D47, 0x6EF9, 0xE4EF, 0x6EFA, 0x9D48, + 0x6EFB, 0x9D49, 0x6EFC, 0x9D4A, 0x6EFD, 0x9D4B, 0x6EFE, 0x9D4C, 0x6EFF, 0x9D4D, 0x6F00, 0x9D4E, 0x6F01, 0x9D4F, 0x6F02, 0xC6AF, + 0x6F03, 0x9D50, 0x6F04, 0x9D51, 0x6F05, 0x9D52, 0x6F06, 0xC6E1, 0x6F07, 0x9D53, 0x6F08, 0x9D54, 0x6F09, 0xE4F5, 0x6F0A, 0x9D55, + 0x6F0B, 0x9D56, 0x6F0C, 0x9D57, 0x6F0D, 0x9D58, 0x6F0E, 0x9D59, 0x6F0F, 0xC2A9, 0x6F10, 0x9D5A, 0x6F11, 0x9D5B, 0x6F12, 0x9D5C, + 0x6F13, 0xC0EC, 0x6F14, 0xD1DD, 0x6F15, 0xE4EE, 0x6F16, 0x9D5D, 0x6F17, 0x9D5E, 0x6F18, 0x9D5F, 0x6F19, 0x9D60, 0x6F1A, 0x9D61, + 0x6F1B, 0x9D62, 0x6F1C, 0x9D63, 0x6F1D, 0x9D64, 0x6F1E, 0x9D65, 0x6F1F, 0x9D66, 0x6F20, 0xC4AE, 0x6F21, 0x9D67, 0x6F22, 0x9D68, + 0x6F23, 0x9D69, 0x6F24, 0xE4ED, 0x6F25, 0x9D6A, 0x6F26, 0x9D6B, 0x6F27, 0x9D6C, 0x6F28, 0x9D6D, 0x6F29, 0xE4F6, 0x6F2A, 0xE4F4, + 0x6F2B, 0xC2FE, 0x6F2C, 0x9D6E, 0x6F2D, 0xE4DD, 0x6F2E, 0x9D6F, 0x6F2F, 0xE4F0, 0x6F30, 0x9D70, 0x6F31, 0xCAFE, 0x6F32, 0x9D71, + 0x6F33, 0xD5C4, 0x6F34, 0x9D72, 0x6F35, 0x9D73, 0x6F36, 0xE4F1, 0x6F37, 0x9D74, 0x6F38, 0x9D75, 0x6F39, 0x9D76, 0x6F3A, 0x9D77, + 0x6F3B, 0x9D78, 0x6F3C, 0x9D79, 0x6F3D, 0x9D7A, 0x6F3E, 0xD1FA, 0x6F3F, 0x9D7B, 0x6F40, 0x9D7C, 0x6F41, 0x9D7D, 0x6F42, 0x9D7E, + 0x6F43, 0x9D80, 0x6F44, 0x9D81, 0x6F45, 0x9D82, 0x6F46, 0xE4EB, 0x6F47, 0xE4EC, 0x6F48, 0x9D83, 0x6F49, 0x9D84, 0x6F4A, 0x9D85, + 0x6F4B, 0xE4F2, 0x6F4C, 0x9D86, 0x6F4D, 0xCEAB, 0x6F4E, 0x9D87, 0x6F4F, 0x9D88, 0x6F50, 0x9D89, 0x6F51, 0x9D8A, 0x6F52, 0x9D8B, + 0x6F53, 0x9D8C, 0x6F54, 0x9D8D, 0x6F55, 0x9D8E, 0x6F56, 0x9D8F, 0x6F57, 0x9D90, 0x6F58, 0xC5CB, 0x6F59, 0x9D91, 0x6F5A, 0x9D92, + 0x6F5B, 0x9D93, 0x6F5C, 0xC7B1, 0x6F5D, 0x9D94, 0x6F5E, 0xC2BA, 0x6F5F, 0x9D95, 0x6F60, 0x9D96, 0x6F61, 0x9D97, 0x6F62, 0xE4EA, + 0x6F63, 0x9D98, 0x6F64, 0x9D99, 0x6F65, 0x9D9A, 0x6F66, 0xC1CA, 0x6F67, 0x9D9B, 0x6F68, 0x9D9C, 0x6F69, 0x9D9D, 0x6F6A, 0x9D9E, + 0x6F6B, 0x9D9F, 0x6F6C, 0x9DA0, 0x6F6D, 0xCCB6, 0x6F6E, 0xB3B1, 0x6F6F, 0x9DA1, 0x6F70, 0x9DA2, 0x6F71, 0x9DA3, 0x6F72, 0xE4FB, + 0x6F73, 0x9DA4, 0x6F74, 0xE4F3, 0x6F75, 0x9DA5, 0x6F76, 0x9DA6, 0x6F77, 0x9DA7, 0x6F78, 0xE4FA, 0x6F79, 0x9DA8, 0x6F7A, 0xE4FD, + 0x6F7B, 0x9DA9, 0x6F7C, 0xE4FC, 0x6F7D, 0x9DAA, 0x6F7E, 0x9DAB, 0x6F7F, 0x9DAC, 0x6F80, 0x9DAD, 0x6F81, 0x9DAE, 0x6F82, 0x9DAF, + 0x6F83, 0x9DB0, 0x6F84, 0xB3CE, 0x6F85, 0x9DB1, 0x6F86, 0x9DB2, 0x6F87, 0x9DB3, 0x6F88, 0xB3BA, 0x6F89, 0xE4F7, 0x6F8A, 0x9DB4, + 0x6F8B, 0x9DB5, 0x6F8C, 0xE4F9, 0x6F8D, 0xE4F8, 0x6F8E, 0xC5EC, 0x6F8F, 0x9DB6, 0x6F90, 0x9DB7, 0x6F91, 0x9DB8, 0x6F92, 0x9DB9, + 0x6F93, 0x9DBA, 0x6F94, 0x9DBB, 0x6F95, 0x9DBC, 0x6F96, 0x9DBD, 0x6F97, 0x9DBE, 0x6F98, 0x9DBF, 0x6F99, 0x9DC0, 0x6F9A, 0x9DC1, + 0x6F9B, 0x9DC2, 0x6F9C, 0xC0BD, 0x6F9D, 0x9DC3, 0x6F9E, 0x9DC4, 0x6F9F, 0x9DC5, 0x6FA0, 0x9DC6, 0x6FA1, 0xD4E8, 0x6FA2, 0x9DC7, + 0x6FA3, 0x9DC8, 0x6FA4, 0x9DC9, 0x6FA5, 0x9DCA, 0x6FA6, 0x9DCB, 0x6FA7, 0xE5A2, 0x6FA8, 0x9DCC, 0x6FA9, 0x9DCD, 0x6FAA, 0x9DCE, + 0x6FAB, 0x9DCF, 0x6FAC, 0x9DD0, 0x6FAD, 0x9DD1, 0x6FAE, 0x9DD2, 0x6FAF, 0x9DD3, 0x6FB0, 0x9DD4, 0x6FB1, 0x9DD5, 0x6FB2, 0x9DD6, + 0x6FB3, 0xB0C4, 0x6FB4, 0x9DD7, 0x6FB5, 0x9DD8, 0x6FB6, 0xE5A4, 0x6FB7, 0x9DD9, 0x6FB8, 0x9DDA, 0x6FB9, 0xE5A3, 0x6FBA, 0x9DDB, + 0x6FBB, 0x9DDC, 0x6FBC, 0x9DDD, 0x6FBD, 0x9DDE, 0x6FBE, 0x9DDF, 0x6FBF, 0x9DE0, 0x6FC0, 0xBCA4, 0x6FC1, 0x9DE1, 0x6FC2, 0xE5A5, + 0x6FC3, 0x9DE2, 0x6FC4, 0x9DE3, 0x6FC5, 0x9DE4, 0x6FC6, 0x9DE5, 0x6FC7, 0x9DE6, 0x6FC8, 0x9DE7, 0x6FC9, 0xE5A1, 0x6FCA, 0x9DE8, + 0x6FCB, 0x9DE9, 0x6FCC, 0x9DEA, 0x6FCD, 0x9DEB, 0x6FCE, 0x9DEC, 0x6FCF, 0x9DED, 0x6FD0, 0x9DEE, 0x6FD1, 0xE4FE, 0x6FD2, 0xB1F4, + 0x6FD3, 0x9DEF, 0x6FD4, 0x9DF0, 0x6FD5, 0x9DF1, 0x6FD6, 0x9DF2, 0x6FD7, 0x9DF3, 0x6FD8, 0x9DF4, 0x6FD9, 0x9DF5, 0x6FDA, 0x9DF6, + 0x6FDB, 0x9DF7, 0x6FDC, 0x9DF8, 0x6FDD, 0x9DF9, 0x6FDE, 0xE5A8, 0x6FDF, 0x9DFA, 0x6FE0, 0xE5A9, 0x6FE1, 0xE5A6, 0x6FE2, 0x9DFB, + 0x6FE3, 0x9DFC, 0x6FE4, 0x9DFD, 0x6FE5, 0x9DFE, 0x6FE6, 0x9E40, 0x6FE7, 0x9E41, 0x6FE8, 0x9E42, 0x6FE9, 0x9E43, 0x6FEA, 0x9E44, + 0x6FEB, 0x9E45, 0x6FEC, 0x9E46, 0x6FED, 0x9E47, 0x6FEE, 0xE5A7, 0x6FEF, 0xE5AA, 0x6FF0, 0x9E48, 0x6FF1, 0x9E49, 0x6FF2, 0x9E4A, + 0x6FF3, 0x9E4B, 0x6FF4, 0x9E4C, 0x6FF5, 0x9E4D, 0x6FF6, 0x9E4E, 0x6FF7, 0x9E4F, 0x6FF8, 0x9E50, 0x6FF9, 0x9E51, 0x6FFA, 0x9E52, + 0x6FFB, 0x9E53, 0x6FFC, 0x9E54, 0x6FFD, 0x9E55, 0x6FFE, 0x9E56, 0x6FFF, 0x9E57, 0x7000, 0x9E58, 0x7001, 0x9E59, 0x7002, 0x9E5A, + 0x7003, 0x9E5B, 0x7004, 0x9E5C, 0x7005, 0x9E5D, 0x7006, 0x9E5E, 0x7007, 0x9E5F, 0x7008, 0x9E60, 0x7009, 0x9E61, 0x700A, 0x9E62, + 0x700B, 0x9E63, 0x700C, 0x9E64, 0x700D, 0x9E65, 0x700E, 0x9E66, 0x700F, 0x9E67, 0x7010, 0x9E68, 0x7011, 0xC6D9, 0x7012, 0x9E69, + 0x7013, 0x9E6A, 0x7014, 0x9E6B, 0x7015, 0x9E6C, 0x7016, 0x9E6D, 0x7017, 0x9E6E, 0x7018, 0x9E6F, 0x7019, 0x9E70, 0x701A, 0xE5AB, + 0x701B, 0xE5AD, 0x701C, 0x9E71, 0x701D, 0x9E72, 0x701E, 0x9E73, 0x701F, 0x9E74, 0x7020, 0x9E75, 0x7021, 0x9E76, 0x7022, 0x9E77, + 0x7023, 0xE5AC, 0x7024, 0x9E78, 0x7025, 0x9E79, 0x7026, 0x9E7A, 0x7027, 0x9E7B, 0x7028, 0x9E7C, 0x7029, 0x9E7D, 0x702A, 0x9E7E, + 0x702B, 0x9E80, 0x702C, 0x9E81, 0x702D, 0x9E82, 0x702E, 0x9E83, 0x702F, 0x9E84, 0x7030, 0x9E85, 0x7031, 0x9E86, 0x7032, 0x9E87, + 0x7033, 0x9E88, 0x7034, 0x9E89, 0x7035, 0xE5AF, 0x7036, 0x9E8A, 0x7037, 0x9E8B, 0x7038, 0x9E8C, 0x7039, 0xE5AE, 0x703A, 0x9E8D, + 0x703B, 0x9E8E, 0x703C, 0x9E8F, 0x703D, 0x9E90, 0x703E, 0x9E91, 0x703F, 0x9E92, 0x7040, 0x9E93, 0x7041, 0x9E94, 0x7042, 0x9E95, + 0x7043, 0x9E96, 0x7044, 0x9E97, 0x7045, 0x9E98, 0x7046, 0x9E99, 0x7047, 0x9E9A, 0x7048, 0x9E9B, 0x7049, 0x9E9C, 0x704A, 0x9E9D, + 0x704B, 0x9E9E, 0x704C, 0xB9E0, 0x704D, 0x9E9F, 0x704E, 0x9EA0, 0x704F, 0xE5B0, 0x7050, 0x9EA1, 0x7051, 0x9EA2, 0x7052, 0x9EA3, + 0x7053, 0x9EA4, 0x7054, 0x9EA5, 0x7055, 0x9EA6, 0x7056, 0x9EA7, 0x7057, 0x9EA8, 0x7058, 0x9EA9, 0x7059, 0x9EAA, 0x705A, 0x9EAB, + 0x705B, 0x9EAC, 0x705C, 0x9EAD, 0x705D, 0x9EAE, 0x705E, 0xE5B1, 0x705F, 0x9EAF, 0x7060, 0x9EB0, 0x7061, 0x9EB1, 0x7062, 0x9EB2, + 0x7063, 0x9EB3, 0x7064, 0x9EB4, 0x7065, 0x9EB5, 0x7066, 0x9EB6, 0x7067, 0x9EB7, 0x7068, 0x9EB8, 0x7069, 0x9EB9, 0x706A, 0x9EBA, + 0x706B, 0xBBF0, 0x706C, 0xECE1, 0x706D, 0xC3F0, 0x706E, 0x9EBB, 0x706F, 0xB5C6, 0x7070, 0xBBD2, 0x7071, 0x9EBC, 0x7072, 0x9EBD, + 0x7073, 0x9EBE, 0x7074, 0x9EBF, 0x7075, 0xC1E9, 0x7076, 0xD4EE, 0x7077, 0x9EC0, 0x7078, 0xBEC4, 0x7079, 0x9EC1, 0x707A, 0x9EC2, + 0x707B, 0x9EC3, 0x707C, 0xD7C6, 0x707D, 0x9EC4, 0x707E, 0xD4D6, 0x707F, 0xB2D3, 0x7080, 0xECBE, 0x7081, 0x9EC5, 0x7082, 0x9EC6, + 0x7083, 0x9EC7, 0x7084, 0x9EC8, 0x7085, 0xEAC1, 0x7086, 0x9EC9, 0x7087, 0x9ECA, 0x7088, 0x9ECB, 0x7089, 0xC2AF, 0x708A, 0xB4B6, + 0x708B, 0x9ECC, 0x708C, 0x9ECD, 0x708D, 0x9ECE, 0x708E, 0xD1D7, 0x708F, 0x9ECF, 0x7090, 0x9ED0, 0x7091, 0x9ED1, 0x7092, 0xB3B4, + 0x7093, 0x9ED2, 0x7094, 0xC8B2, 0x7095, 0xBFBB, 0x7096, 0xECC0, 0x7097, 0x9ED3, 0x7098, 0x9ED4, 0x7099, 0xD6CB, 0x709A, 0x9ED5, + 0x709B, 0x9ED6, 0x709C, 0xECBF, 0x709D, 0xECC1, 0x709E, 0x9ED7, 0x709F, 0x9ED8, 0x70A0, 0x9ED9, 0x70A1, 0x9EDA, 0x70A2, 0x9EDB, + 0x70A3, 0x9EDC, 0x70A4, 0x9EDD, 0x70A5, 0x9EDE, 0x70A6, 0x9EDF, 0x70A7, 0x9EE0, 0x70A8, 0x9EE1, 0x70A9, 0x9EE2, 0x70AA, 0x9EE3, + 0x70AB, 0xECC5, 0x70AC, 0xBEE6, 0x70AD, 0xCCBF, 0x70AE, 0xC5DA, 0x70AF, 0xBEBC, 0x70B0, 0x9EE4, 0x70B1, 0xECC6, 0x70B2, 0x9EE5, + 0x70B3, 0xB1FE, 0x70B4, 0x9EE6, 0x70B5, 0x9EE7, 0x70B6, 0x9EE8, 0x70B7, 0xECC4, 0x70B8, 0xD5A8, 0x70B9, 0xB5E3, 0x70BA, 0x9EE9, + 0x70BB, 0xECC2, 0x70BC, 0xC1B6, 0x70BD, 0xB3E3, 0x70BE, 0x9EEA, 0x70BF, 0x9EEB, 0x70C0, 0xECC3, 0x70C1, 0xCBB8, 0x70C2, 0xC0C3, + 0x70C3, 0xCCFE, 0x70C4, 0x9EEC, 0x70C5, 0x9EED, 0x70C6, 0x9EEE, 0x70C7, 0x9EEF, 0x70C8, 0xC1D2, 0x70C9, 0x9EF0, 0x70CA, 0xECC8, + 0x70CB, 0x9EF1, 0x70CC, 0x9EF2, 0x70CD, 0x9EF3, 0x70CE, 0x9EF4, 0x70CF, 0x9EF5, 0x70D0, 0x9EF6, 0x70D1, 0x9EF7, 0x70D2, 0x9EF8, + 0x70D3, 0x9EF9, 0x70D4, 0x9EFA, 0x70D5, 0x9EFB, 0x70D6, 0x9EFC, 0x70D7, 0x9EFD, 0x70D8, 0xBAE6, 0x70D9, 0xC0D3, 0x70DA, 0x9EFE, + 0x70DB, 0xD6F2, 0x70DC, 0x9F40, 0x70DD, 0x9F41, 0x70DE, 0x9F42, 0x70DF, 0xD1CC, 0x70E0, 0x9F43, 0x70E1, 0x9F44, 0x70E2, 0x9F45, + 0x70E3, 0x9F46, 0x70E4, 0xBFBE, 0x70E5, 0x9F47, 0x70E6, 0xB7B3, 0x70E7, 0xC9D5, 0x70E8, 0xECC7, 0x70E9, 0xBBE2, 0x70EA, 0x9F48, + 0x70EB, 0xCCCC, 0x70EC, 0xBDFD, 0x70ED, 0xC8C8, 0x70EE, 0x9F49, 0x70EF, 0xCFA9, 0x70F0, 0x9F4A, 0x70F1, 0x9F4B, 0x70F2, 0x9F4C, + 0x70F3, 0x9F4D, 0x70F4, 0x9F4E, 0x70F5, 0x9F4F, 0x70F6, 0x9F50, 0x70F7, 0xCDE9, 0x70F8, 0x9F51, 0x70F9, 0xC5EB, 0x70FA, 0x9F52, + 0x70FB, 0x9F53, 0x70FC, 0x9F54, 0x70FD, 0xB7E9, 0x70FE, 0x9F55, 0x70FF, 0x9F56, 0x7100, 0x9F57, 0x7101, 0x9F58, 0x7102, 0x9F59, + 0x7103, 0x9F5A, 0x7104, 0x9F5B, 0x7105, 0x9F5C, 0x7106, 0x9F5D, 0x7107, 0x9F5E, 0x7108, 0x9F5F, 0x7109, 0xD1C9, 0x710A, 0xBAB8, + 0x710B, 0x9F60, 0x710C, 0x9F61, 0x710D, 0x9F62, 0x710E, 0x9F63, 0x710F, 0x9F64, 0x7110, 0xECC9, 0x7111, 0x9F65, 0x7112, 0x9F66, + 0x7113, 0xECCA, 0x7114, 0x9F67, 0x7115, 0xBBC0, 0x7116, 0xECCB, 0x7117, 0x9F68, 0x7118, 0xECE2, 0x7119, 0xB1BA, 0x711A, 0xB7D9, + 0x711B, 0x9F69, 0x711C, 0x9F6A, 0x711D, 0x9F6B, 0x711E, 0x9F6C, 0x711F, 0x9F6D, 0x7120, 0x9F6E, 0x7121, 0x9F6F, 0x7122, 0x9F70, + 0x7123, 0x9F71, 0x7124, 0x9F72, 0x7125, 0x9F73, 0x7126, 0xBDB9, 0x7127, 0x9F74, 0x7128, 0x9F75, 0x7129, 0x9F76, 0x712A, 0x9F77, + 0x712B, 0x9F78, 0x712C, 0x9F79, 0x712D, 0x9F7A, 0x712E, 0x9F7B, 0x712F, 0xECCC, 0x7130, 0xD1E6, 0x7131, 0xECCD, 0x7132, 0x9F7C, + 0x7133, 0x9F7D, 0x7134, 0x9F7E, 0x7135, 0x9F80, 0x7136, 0xC8BB, 0x7137, 0x9F81, 0x7138, 0x9F82, 0x7139, 0x9F83, 0x713A, 0x9F84, + 0x713B, 0x9F85, 0x713C, 0x9F86, 0x713D, 0x9F87, 0x713E, 0x9F88, 0x713F, 0x9F89, 0x7140, 0x9F8A, 0x7141, 0x9F8B, 0x7142, 0x9F8C, + 0x7143, 0x9F8D, 0x7144, 0x9F8E, 0x7145, 0xECD1, 0x7146, 0x9F8F, 0x7147, 0x9F90, 0x7148, 0x9F91, 0x7149, 0x9F92, 0x714A, 0xECD3, + 0x714B, 0x9F93, 0x714C, 0xBBCD, 0x714D, 0x9F94, 0x714E, 0xBCE5, 0x714F, 0x9F95, 0x7150, 0x9F96, 0x7151, 0x9F97, 0x7152, 0x9F98, + 0x7153, 0x9F99, 0x7154, 0x9F9A, 0x7155, 0x9F9B, 0x7156, 0x9F9C, 0x7157, 0x9F9D, 0x7158, 0x9F9E, 0x7159, 0x9F9F, 0x715A, 0x9FA0, + 0x715B, 0x9FA1, 0x715C, 0xECCF, 0x715D, 0x9FA2, 0x715E, 0xC9B7, 0x715F, 0x9FA3, 0x7160, 0x9FA4, 0x7161, 0x9FA5, 0x7162, 0x9FA6, + 0x7163, 0x9FA7, 0x7164, 0xC3BA, 0x7165, 0x9FA8, 0x7166, 0xECE3, 0x7167, 0xD5D5, 0x7168, 0xECD0, 0x7169, 0x9FA9, 0x716A, 0x9FAA, + 0x716B, 0x9FAB, 0x716C, 0x9FAC, 0x716D, 0x9FAD, 0x716E, 0xD6F3, 0x716F, 0x9FAE, 0x7170, 0x9FAF, 0x7171, 0x9FB0, 0x7172, 0xECD2, + 0x7173, 0xECCE, 0x7174, 0x9FB1, 0x7175, 0x9FB2, 0x7176, 0x9FB3, 0x7177, 0x9FB4, 0x7178, 0xECD4, 0x7179, 0x9FB5, 0x717A, 0xECD5, + 0x717B, 0x9FB6, 0x717C, 0x9FB7, 0x717D, 0xC9BF, 0x717E, 0x9FB8, 0x717F, 0x9FB9, 0x7180, 0x9FBA, 0x7181, 0x9FBB, 0x7182, 0x9FBC, + 0x7183, 0x9FBD, 0x7184, 0xCFA8, 0x7185, 0x9FBE, 0x7186, 0x9FBF, 0x7187, 0x9FC0, 0x7188, 0x9FC1, 0x7189, 0x9FC2, 0x718A, 0xD0DC, + 0x718B, 0x9FC3, 0x718C, 0x9FC4, 0x718D, 0x9FC5, 0x718E, 0x9FC6, 0x718F, 0xD1AC, 0x7190, 0x9FC7, 0x7191, 0x9FC8, 0x7192, 0x9FC9, + 0x7193, 0x9FCA, 0x7194, 0xC8DB, 0x7195, 0x9FCB, 0x7196, 0x9FCC, 0x7197, 0x9FCD, 0x7198, 0xECD6, 0x7199, 0xCEF5, 0x719A, 0x9FCE, + 0x719B, 0x9FCF, 0x719C, 0x9FD0, 0x719D, 0x9FD1, 0x719E, 0x9FD2, 0x719F, 0xCAEC, 0x71A0, 0xECDA, 0x71A1, 0x9FD3, 0x71A2, 0x9FD4, + 0x71A3, 0x9FD5, 0x71A4, 0x9FD6, 0x71A5, 0x9FD7, 0x71A6, 0x9FD8, 0x71A7, 0x9FD9, 0x71A8, 0xECD9, 0x71A9, 0x9FDA, 0x71AA, 0x9FDB, + 0x71AB, 0x9FDC, 0x71AC, 0xB0BE, 0x71AD, 0x9FDD, 0x71AE, 0x9FDE, 0x71AF, 0x9FDF, 0x71B0, 0x9FE0, 0x71B1, 0x9FE1, 0x71B2, 0x9FE2, + 0x71B3, 0xECD7, 0x71B4, 0x9FE3, 0x71B5, 0xECD8, 0x71B6, 0x9FE4, 0x71B7, 0x9FE5, 0x71B8, 0x9FE6, 0x71B9, 0xECE4, 0x71BA, 0x9FE7, + 0x71BB, 0x9FE8, 0x71BC, 0x9FE9, 0x71BD, 0x9FEA, 0x71BE, 0x9FEB, 0x71BF, 0x9FEC, 0x71C0, 0x9FED, 0x71C1, 0x9FEE, 0x71C2, 0x9FEF, + 0x71C3, 0xC8BC, 0x71C4, 0x9FF0, 0x71C5, 0x9FF1, 0x71C6, 0x9FF2, 0x71C7, 0x9FF3, 0x71C8, 0x9FF4, 0x71C9, 0x9FF5, 0x71CA, 0x9FF6, + 0x71CB, 0x9FF7, 0x71CC, 0x9FF8, 0x71CD, 0x9FF9, 0x71CE, 0xC1C7, 0x71CF, 0x9FFA, 0x71D0, 0x9FFB, 0x71D1, 0x9FFC, 0x71D2, 0x9FFD, + 0x71D3, 0x9FFE, 0x71D4, 0xECDC, 0x71D5, 0xD1E0, 0x71D6, 0xA040, 0x71D7, 0xA041, 0x71D8, 0xA042, 0x71D9, 0xA043, 0x71DA, 0xA044, + 0x71DB, 0xA045, 0x71DC, 0xA046, 0x71DD, 0xA047, 0x71DE, 0xA048, 0x71DF, 0xA049, 0x71E0, 0xECDB, 0x71E1, 0xA04A, 0x71E2, 0xA04B, + 0x71E3, 0xA04C, 0x71E4, 0xA04D, 0x71E5, 0xD4EF, 0x71E6, 0xA04E, 0x71E7, 0xECDD, 0x71E8, 0xA04F, 0x71E9, 0xA050, 0x71EA, 0xA051, + 0x71EB, 0xA052, 0x71EC, 0xA053, 0x71ED, 0xA054, 0x71EE, 0xDBC6, 0x71EF, 0xA055, 0x71F0, 0xA056, 0x71F1, 0xA057, 0x71F2, 0xA058, + 0x71F3, 0xA059, 0x71F4, 0xA05A, 0x71F5, 0xA05B, 0x71F6, 0xA05C, 0x71F7, 0xA05D, 0x71F8, 0xA05E, 0x71F9, 0xECDE, 0x71FA, 0xA05F, + 0x71FB, 0xA060, 0x71FC, 0xA061, 0x71FD, 0xA062, 0x71FE, 0xA063, 0x71FF, 0xA064, 0x7200, 0xA065, 0x7201, 0xA066, 0x7202, 0xA067, + 0x7203, 0xA068, 0x7204, 0xA069, 0x7205, 0xA06A, 0x7206, 0xB1AC, 0x7207, 0xA06B, 0x7208, 0xA06C, 0x7209, 0xA06D, 0x720A, 0xA06E, + 0x720B, 0xA06F, 0x720C, 0xA070, 0x720D, 0xA071, 0x720E, 0xA072, 0x720F, 0xA073, 0x7210, 0xA074, 0x7211, 0xA075, 0x7212, 0xA076, + 0x7213, 0xA077, 0x7214, 0xA078, 0x7215, 0xA079, 0x7216, 0xA07A, 0x7217, 0xA07B, 0x7218, 0xA07C, 0x7219, 0xA07D, 0x721A, 0xA07E, + 0x721B, 0xA080, 0x721C, 0xA081, 0x721D, 0xECDF, 0x721E, 0xA082, 0x721F, 0xA083, 0x7220, 0xA084, 0x7221, 0xA085, 0x7222, 0xA086, + 0x7223, 0xA087, 0x7224, 0xA088, 0x7225, 0xA089, 0x7226, 0xA08A, 0x7227, 0xA08B, 0x7228, 0xECE0, 0x7229, 0xA08C, 0x722A, 0xD7A6, + 0x722B, 0xA08D, 0x722C, 0xC5C0, 0x722D, 0xA08E, 0x722E, 0xA08F, 0x722F, 0xA090, 0x7230, 0xEBBC, 0x7231, 0xB0AE, 0x7232, 0xA091, + 0x7233, 0xA092, 0x7234, 0xA093, 0x7235, 0xBEF4, 0x7236, 0xB8B8, 0x7237, 0xD2AF, 0x7238, 0xB0D6, 0x7239, 0xB5F9, 0x723A, 0xA094, + 0x723B, 0xD8B3, 0x723C, 0xA095, 0x723D, 0xCBAC, 0x723E, 0xA096, 0x723F, 0xE3DD, 0x7240, 0xA097, 0x7241, 0xA098, 0x7242, 0xA099, + 0x7243, 0xA09A, 0x7244, 0xA09B, 0x7245, 0xA09C, 0x7246, 0xA09D, 0x7247, 0xC6AC, 0x7248, 0xB0E6, 0x7249, 0xA09E, 0x724A, 0xA09F, + 0x724B, 0xA0A0, 0x724C, 0xC5C6, 0x724D, 0xEBB9, 0x724E, 0xA0A1, 0x724F, 0xA0A2, 0x7250, 0xA0A3, 0x7251, 0xA0A4, 0x7252, 0xEBBA, + 0x7253, 0xA0A5, 0x7254, 0xA0A6, 0x7255, 0xA0A7, 0x7256, 0xEBBB, 0x7257, 0xA0A8, 0x7258, 0xA0A9, 0x7259, 0xD1C0, 0x725A, 0xA0AA, + 0x725B, 0xC5A3, 0x725C, 0xA0AB, 0x725D, 0xEAF2, 0x725E, 0xA0AC, 0x725F, 0xC4B2, 0x7260, 0xA0AD, 0x7261, 0xC4B5, 0x7262, 0xC0CE, + 0x7263, 0xA0AE, 0x7264, 0xA0AF, 0x7265, 0xA0B0, 0x7266, 0xEAF3, 0x7267, 0xC4C1, 0x7268, 0xA0B1, 0x7269, 0xCEEF, 0x726A, 0xA0B2, + 0x726B, 0xA0B3, 0x726C, 0xA0B4, 0x726D, 0xA0B5, 0x726E, 0xEAF0, 0x726F, 0xEAF4, 0x7270, 0xA0B6, 0x7271, 0xA0B7, 0x7272, 0xC9FC, + 0x7273, 0xA0B8, 0x7274, 0xA0B9, 0x7275, 0xC7A3, 0x7276, 0xA0BA, 0x7277, 0xA0BB, 0x7278, 0xA0BC, 0x7279, 0xCCD8, 0x727A, 0xCEFE, + 0x727B, 0xA0BD, 0x727C, 0xA0BE, 0x727D, 0xA0BF, 0x727E, 0xEAF5, 0x727F, 0xEAF6, 0x7280, 0xCFAC, 0x7281, 0xC0E7, 0x7282, 0xA0C0, + 0x7283, 0xA0C1, 0x7284, 0xEAF7, 0x7285, 0xA0C2, 0x7286, 0xA0C3, 0x7287, 0xA0C4, 0x7288, 0xA0C5, 0x7289, 0xA0C6, 0x728A, 0xB6BF, + 0x728B, 0xEAF8, 0x728C, 0xA0C7, 0x728D, 0xEAF9, 0x728E, 0xA0C8, 0x728F, 0xEAFA, 0x7290, 0xA0C9, 0x7291, 0xA0CA, 0x7292, 0xEAFB, + 0x7293, 0xA0CB, 0x7294, 0xA0CC, 0x7295, 0xA0CD, 0x7296, 0xA0CE, 0x7297, 0xA0CF, 0x7298, 0xA0D0, 0x7299, 0xA0D1, 0x729A, 0xA0D2, + 0x729B, 0xA0D3, 0x729C, 0xA0D4, 0x729D, 0xA0D5, 0x729E, 0xA0D6, 0x729F, 0xEAF1, 0x72A0, 0xA0D7, 0x72A1, 0xA0D8, 0x72A2, 0xA0D9, + 0x72A3, 0xA0DA, 0x72A4, 0xA0DB, 0x72A5, 0xA0DC, 0x72A6, 0xA0DD, 0x72A7, 0xA0DE, 0x72A8, 0xA0DF, 0x72A9, 0xA0E0, 0x72AA, 0xA0E1, + 0x72AB, 0xA0E2, 0x72AC, 0xC8AE, 0x72AD, 0xE1EB, 0x72AE, 0xA0E3, 0x72AF, 0xB7B8, 0x72B0, 0xE1EC, 0x72B1, 0xA0E4, 0x72B2, 0xA0E5, + 0x72B3, 0xA0E6, 0x72B4, 0xE1ED, 0x72B5, 0xA0E7, 0x72B6, 0xD7B4, 0x72B7, 0xE1EE, 0x72B8, 0xE1EF, 0x72B9, 0xD3CC, 0x72BA, 0xA0E8, + 0x72BB, 0xA0E9, 0x72BC, 0xA0EA, 0x72BD, 0xA0EB, 0x72BE, 0xA0EC, 0x72BF, 0xA0ED, 0x72C0, 0xA0EE, 0x72C1, 0xE1F1, 0x72C2, 0xBFF1, + 0x72C3, 0xE1F0, 0x72C4, 0xB5D2, 0x72C5, 0xA0EF, 0x72C6, 0xA0F0, 0x72C7, 0xA0F1, 0x72C8, 0xB1B7, 0x72C9, 0xA0F2, 0x72CA, 0xA0F3, + 0x72CB, 0xA0F4, 0x72CC, 0xA0F5, 0x72CD, 0xE1F3, 0x72CE, 0xE1F2, 0x72CF, 0xA0F6, 0x72D0, 0xBAFC, 0x72D1, 0xA0F7, 0x72D2, 0xE1F4, + 0x72D3, 0xA0F8, 0x72D4, 0xA0F9, 0x72D5, 0xA0FA, 0x72D6, 0xA0FB, 0x72D7, 0xB9B7, 0x72D8, 0xA0FC, 0x72D9, 0xBED1, 0x72DA, 0xA0FD, + 0x72DB, 0xA0FE, 0x72DC, 0xAA40, 0x72DD, 0xAA41, 0x72DE, 0xC4FC, 0x72DF, 0xAA42, 0x72E0, 0xBADD, 0x72E1, 0xBDC6, 0x72E2, 0xAA43, + 0x72E3, 0xAA44, 0x72E4, 0xAA45, 0x72E5, 0xAA46, 0x72E6, 0xAA47, 0x72E7, 0xAA48, 0x72E8, 0xE1F5, 0x72E9, 0xE1F7, 0x72EA, 0xAA49, + 0x72EB, 0xAA4A, 0x72EC, 0xB6C0, 0x72ED, 0xCFC1, 0x72EE, 0xCAA8, 0x72EF, 0xE1F6, 0x72F0, 0xD5F8, 0x72F1, 0xD3FC, 0x72F2, 0xE1F8, + 0x72F3, 0xE1FC, 0x72F4, 0xE1F9, 0x72F5, 0xAA4B, 0x72F6, 0xAA4C, 0x72F7, 0xE1FA, 0x72F8, 0xC0EA, 0x72F9, 0xAA4D, 0x72FA, 0xE1FE, + 0x72FB, 0xE2A1, 0x72FC, 0xC0C7, 0x72FD, 0xAA4E, 0x72FE, 0xAA4F, 0x72FF, 0xAA50, 0x7300, 0xAA51, 0x7301, 0xE1FB, 0x7302, 0xAA52, + 0x7303, 0xE1FD, 0x7304, 0xAA53, 0x7305, 0xAA54, 0x7306, 0xAA55, 0x7307, 0xAA56, 0x7308, 0xAA57, 0x7309, 0xAA58, 0x730A, 0xE2A5, + 0x730B, 0xAA59, 0x730C, 0xAA5A, 0x730D, 0xAA5B, 0x730E, 0xC1D4, 0x730F, 0xAA5C, 0x7310, 0xAA5D, 0x7311, 0xAA5E, 0x7312, 0xAA5F, + 0x7313, 0xE2A3, 0x7314, 0xAA60, 0x7315, 0xE2A8, 0x7316, 0xB2FE, 0x7317, 0xE2A2, 0x7318, 0xAA61, 0x7319, 0xAA62, 0x731A, 0xAA63, + 0x731B, 0xC3CD, 0x731C, 0xB2C2, 0x731D, 0xE2A7, 0x731E, 0xE2A6, 0x731F, 0xAA64, 0x7320, 0xAA65, 0x7321, 0xE2A4, 0x7322, 0xE2A9, + 0x7323, 0xAA66, 0x7324, 0xAA67, 0x7325, 0xE2AB, 0x7326, 0xAA68, 0x7327, 0xAA69, 0x7328, 0xAA6A, 0x7329, 0xD0C9, 0x732A, 0xD6ED, + 0x732B, 0xC3A8, 0x732C, 0xE2AC, 0x732D, 0xAA6B, 0x732E, 0xCFD7, 0x732F, 0xAA6C, 0x7330, 0xAA6D, 0x7331, 0xE2AE, 0x7332, 0xAA6E, + 0x7333, 0xAA6F, 0x7334, 0xBAEF, 0x7335, 0xAA70, 0x7336, 0xAA71, 0x7337, 0xE9E0, 0x7338, 0xE2AD, 0x7339, 0xE2AA, 0x733A, 0xAA72, + 0x733B, 0xAA73, 0x733C, 0xAA74, 0x733D, 0xAA75, 0x733E, 0xBBAB, 0x733F, 0xD4B3, 0x7340, 0xAA76, 0x7341, 0xAA77, 0x7342, 0xAA78, + 0x7343, 0xAA79, 0x7344, 0xAA7A, 0x7345, 0xAA7B, 0x7346, 0xAA7C, 0x7347, 0xAA7D, 0x7348, 0xAA7E, 0x7349, 0xAA80, 0x734A, 0xAA81, + 0x734B, 0xAA82, 0x734C, 0xAA83, 0x734D, 0xE2B0, 0x734E, 0xAA84, 0x734F, 0xAA85, 0x7350, 0xE2AF, 0x7351, 0xAA86, 0x7352, 0xE9E1, + 0x7353, 0xAA87, 0x7354, 0xAA88, 0x7355, 0xAA89, 0x7356, 0xAA8A, 0x7357, 0xE2B1, 0x7358, 0xAA8B, 0x7359, 0xAA8C, 0x735A, 0xAA8D, + 0x735B, 0xAA8E, 0x735C, 0xAA8F, 0x735D, 0xAA90, 0x735E, 0xAA91, 0x735F, 0xAA92, 0x7360, 0xE2B2, 0x7361, 0xAA93, 0x7362, 0xAA94, + 0x7363, 0xAA95, 0x7364, 0xAA96, 0x7365, 0xAA97, 0x7366, 0xAA98, 0x7367, 0xAA99, 0x7368, 0xAA9A, 0x7369, 0xAA9B, 0x736A, 0xAA9C, + 0x736B, 0xAA9D, 0x736C, 0xE2B3, 0x736D, 0xCCA1, 0x736E, 0xAA9E, 0x736F, 0xE2B4, 0x7370, 0xAA9F, 0x7371, 0xAAA0, 0x7372, 0xAB40, + 0x7373, 0xAB41, 0x7374, 0xAB42, 0x7375, 0xAB43, 0x7376, 0xAB44, 0x7377, 0xAB45, 0x7378, 0xAB46, 0x7379, 0xAB47, 0x737A, 0xAB48, + 0x737B, 0xAB49, 0x737C, 0xAB4A, 0x737D, 0xAB4B, 0x737E, 0xE2B5, 0x737F, 0xAB4C, 0x7380, 0xAB4D, 0x7381, 0xAB4E, 0x7382, 0xAB4F, + 0x7383, 0xAB50, 0x7384, 0xD0FE, 0x7385, 0xAB51, 0x7386, 0xAB52, 0x7387, 0xC2CA, 0x7388, 0xAB53, 0x7389, 0xD3F1, 0x738A, 0xAB54, + 0x738B, 0xCDF5, 0x738C, 0xAB55, 0x738D, 0xAB56, 0x738E, 0xE7E0, 0x738F, 0xAB57, 0x7390, 0xAB58, 0x7391, 0xE7E1, 0x7392, 0xAB59, + 0x7393, 0xAB5A, 0x7394, 0xAB5B, 0x7395, 0xAB5C, 0x7396, 0xBEC1, 0x7397, 0xAB5D, 0x7398, 0xAB5E, 0x7399, 0xAB5F, 0x739A, 0xAB60, + 0x739B, 0xC2EA, 0x739C, 0xAB61, 0x739D, 0xAB62, 0x739E, 0xAB63, 0x739F, 0xE7E4, 0x73A0, 0xAB64, 0x73A1, 0xAB65, 0x73A2, 0xE7E3, + 0x73A3, 0xAB66, 0x73A4, 0xAB67, 0x73A5, 0xAB68, 0x73A6, 0xAB69, 0x73A7, 0xAB6A, 0x73A8, 0xAB6B, 0x73A9, 0xCDE6, 0x73AA, 0xAB6C, + 0x73AB, 0xC3B5, 0x73AC, 0xAB6D, 0x73AD, 0xAB6E, 0x73AE, 0xE7E2, 0x73AF, 0xBBB7, 0x73B0, 0xCFD6, 0x73B1, 0xAB6F, 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, 0x73B4, 0xAB70, 0x73B5, 0xAB71, 0x73B6, 0xAB72, 0x73B7, 0xE7E8, 0x73B8, 0xAB73, 0x73B9, 0xAB74, 0x73BA, 0xE7F4, + 0x73BB, 0xB2A3, 0x73BC, 0xAB75, 0x73BD, 0xAB76, 0x73BE, 0xAB77, 0x73BF, 0xAB78, 0x73C0, 0xE7EA, 0x73C1, 0xAB79, 0x73C2, 0xE7E6, + 0x73C3, 0xAB7A, 0x73C4, 0xAB7B, 0x73C5, 0xAB7C, 0x73C6, 0xAB7D, 0x73C7, 0xAB7E, 0x73C8, 0xE7EC, 0x73C9, 0xE7EB, 0x73CA, 0xC9BA, + 0x73CB, 0xAB80, 0x73CC, 0xAB81, 0x73CD, 0xD5E4, 0x73CE, 0xAB82, 0x73CF, 0xE7E5, 0x73D0, 0xB7A9, 0x73D1, 0xE7E7, 0x73D2, 0xAB83, + 0x73D3, 0xAB84, 0x73D4, 0xAB85, 0x73D5, 0xAB86, 0x73D6, 0xAB87, 0x73D7, 0xAB88, 0x73D8, 0xAB89, 0x73D9, 0xE7EE, 0x73DA, 0xAB8A, + 0x73DB, 0xAB8B, 0x73DC, 0xAB8C, 0x73DD, 0xAB8D, 0x73DE, 0xE7F3, 0x73DF, 0xAB8E, 0x73E0, 0xD6E9, 0x73E1, 0xAB8F, 0x73E2, 0xAB90, + 0x73E3, 0xAB91, 0x73E4, 0xAB92, 0x73E5, 0xE7ED, 0x73E6, 0xAB93, 0x73E7, 0xE7F2, 0x73E8, 0xAB94, 0x73E9, 0xE7F1, 0x73EA, 0xAB95, + 0x73EB, 0xAB96, 0x73EC, 0xAB97, 0x73ED, 0xB0E0, 0x73EE, 0xAB98, 0x73EF, 0xAB99, 0x73F0, 0xAB9A, 0x73F1, 0xAB9B, 0x73F2, 0xE7F5, + 0x73F3, 0xAB9C, 0x73F4, 0xAB9D, 0x73F5, 0xAB9E, 0x73F6, 0xAB9F, 0x73F7, 0xABA0, 0x73F8, 0xAC40, 0x73F9, 0xAC41, 0x73FA, 0xAC42, + 0x73FB, 0xAC43, 0x73FC, 0xAC44, 0x73FD, 0xAC45, 0x73FE, 0xAC46, 0x73FF, 0xAC47, 0x7400, 0xAC48, 0x7401, 0xAC49, 0x7402, 0xAC4A, + 0x7403, 0xC7F2, 0x7404, 0xAC4B, 0x7405, 0xC0C5, 0x7406, 0xC0ED, 0x7407, 0xAC4C, 0x7408, 0xAC4D, 0x7409, 0xC1F0, 0x740A, 0xE7F0, + 0x740B, 0xAC4E, 0x740C, 0xAC4F, 0x740D, 0xAC50, 0x740E, 0xAC51, 0x740F, 0xE7F6, 0x7410, 0xCBF6, 0x7411, 0xAC52, 0x7412, 0xAC53, + 0x7413, 0xAC54, 0x7414, 0xAC55, 0x7415, 0xAC56, 0x7416, 0xAC57, 0x7417, 0xAC58, 0x7418, 0xAC59, 0x7419, 0xAC5A, 0x741A, 0xE8A2, + 0x741B, 0xE8A1, 0x741C, 0xAC5B, 0x741D, 0xAC5C, 0x741E, 0xAC5D, 0x741F, 0xAC5E, 0x7420, 0xAC5F, 0x7421, 0xAC60, 0x7422, 0xD7C1, + 0x7423, 0xAC61, 0x7424, 0xAC62, 0x7425, 0xE7FA, 0x7426, 0xE7F9, 0x7427, 0xAC63, 0x7428, 0xE7FB, 0x7429, 0xAC64, 0x742A, 0xE7F7, + 0x742B, 0xAC65, 0x742C, 0xE7FE, 0x742D, 0xAC66, 0x742E, 0xE7FD, 0x742F, 0xAC67, 0x7430, 0xE7FC, 0x7431, 0xAC68, 0x7432, 0xAC69, + 0x7433, 0xC1D5, 0x7434, 0xC7D9, 0x7435, 0xC5FD, 0x7436, 0xC5C3, 0x7437, 0xAC6A, 0x7438, 0xAC6B, 0x7439, 0xAC6C, 0x743A, 0xAC6D, + 0x743B, 0xAC6E, 0x743C, 0xC7ED, 0x743D, 0xAC6F, 0x743E, 0xAC70, 0x743F, 0xAC71, 0x7440, 0xAC72, 0x7441, 0xE8A3, 0x7442, 0xAC73, + 0x7443, 0xAC74, 0x7444, 0xAC75, 0x7445, 0xAC76, 0x7446, 0xAC77, 0x7447, 0xAC78, 0x7448, 0xAC79, 0x7449, 0xAC7A, 0x744A, 0xAC7B, + 0x744B, 0xAC7C, 0x744C, 0xAC7D, 0x744D, 0xAC7E, 0x744E, 0xAC80, 0x744F, 0xAC81, 0x7450, 0xAC82, 0x7451, 0xAC83, 0x7452, 0xAC84, + 0x7453, 0xAC85, 0x7454, 0xAC86, 0x7455, 0xE8A6, 0x7456, 0xAC87, 0x7457, 0xE8A5, 0x7458, 0xAC88, 0x7459, 0xE8A7, 0x745A, 0xBAF7, + 0x745B, 0xE7F8, 0x745C, 0xE8A4, 0x745D, 0xAC89, 0x745E, 0xC8F0, 0x745F, 0xC9AA, 0x7460, 0xAC8A, 0x7461, 0xAC8B, 0x7462, 0xAC8C, + 0x7463, 0xAC8D, 0x7464, 0xAC8E, 0x7465, 0xAC8F, 0x7466, 0xAC90, 0x7467, 0xAC91, 0x7468, 0xAC92, 0x7469, 0xAC93, 0x746A, 0xAC94, + 0x746B, 0xAC95, 0x746C, 0xAC96, 0x746D, 0xE8A9, 0x746E, 0xAC97, 0x746F, 0xAC98, 0x7470, 0xB9E5, 0x7471, 0xAC99, 0x7472, 0xAC9A, + 0x7473, 0xAC9B, 0x7474, 0xAC9C, 0x7475, 0xAC9D, 0x7476, 0xD1FE, 0x7477, 0xE8A8, 0x7478, 0xAC9E, 0x7479, 0xAC9F, 0x747A, 0xACA0, + 0x747B, 0xAD40, 0x747C, 0xAD41, 0x747D, 0xAD42, 0x747E, 0xE8AA, 0x747F, 0xAD43, 0x7480, 0xE8AD, 0x7481, 0xE8AE, 0x7482, 0xAD44, + 0x7483, 0xC1A7, 0x7484, 0xAD45, 0x7485, 0xAD46, 0x7486, 0xAD47, 0x7487, 0xE8AF, 0x7488, 0xAD48, 0x7489, 0xAD49, 0x748A, 0xAD4A, + 0x748B, 0xE8B0, 0x748C, 0xAD4B, 0x748D, 0xAD4C, 0x748E, 0xE8AC, 0x748F, 0xAD4D, 0x7490, 0xE8B4, 0x7491, 0xAD4E, 0x7492, 0xAD4F, + 0x7493, 0xAD50, 0x7494, 0xAD51, 0x7495, 0xAD52, 0x7496, 0xAD53, 0x7497, 0xAD54, 0x7498, 0xAD55, 0x7499, 0xAD56, 0x749A, 0xAD57, + 0x749B, 0xAD58, 0x749C, 0xE8AB, 0x749D, 0xAD59, 0x749E, 0xE8B1, 0x749F, 0xAD5A, 0x74A0, 0xAD5B, 0x74A1, 0xAD5C, 0x74A2, 0xAD5D, + 0x74A3, 0xAD5E, 0x74A4, 0xAD5F, 0x74A5, 0xAD60, 0x74A6, 0xAD61, 0x74A7, 0xE8B5, 0x74A8, 0xE8B2, 0x74A9, 0xE8B3, 0x74AA, 0xAD62, + 0x74AB, 0xAD63, 0x74AC, 0xAD64, 0x74AD, 0xAD65, 0x74AE, 0xAD66, 0x74AF, 0xAD67, 0x74B0, 0xAD68, 0x74B1, 0xAD69, 0x74B2, 0xAD6A, + 0x74B3, 0xAD6B, 0x74B4, 0xAD6C, 0x74B5, 0xAD6D, 0x74B6, 0xAD6E, 0x74B7, 0xAD6F, 0x74B8, 0xAD70, 0x74B9, 0xAD71, 0x74BA, 0xE8B7, + 0x74BB, 0xAD72, 0x74BC, 0xAD73, 0x74BD, 0xAD74, 0x74BE, 0xAD75, 0x74BF, 0xAD76, 0x74C0, 0xAD77, 0x74C1, 0xAD78, 0x74C2, 0xAD79, + 0x74C3, 0xAD7A, 0x74C4, 0xAD7B, 0x74C5, 0xAD7C, 0x74C6, 0xAD7D, 0x74C7, 0xAD7E, 0x74C8, 0xAD80, 0x74C9, 0xAD81, 0x74CA, 0xAD82, + 0x74CB, 0xAD83, 0x74CC, 0xAD84, 0x74CD, 0xAD85, 0x74CE, 0xAD86, 0x74CF, 0xAD87, 0x74D0, 0xAD88, 0x74D1, 0xAD89, 0x74D2, 0xE8B6, + 0x74D3, 0xAD8A, 0x74D4, 0xAD8B, 0x74D5, 0xAD8C, 0x74D6, 0xAD8D, 0x74D7, 0xAD8E, 0x74D8, 0xAD8F, 0x74D9, 0xAD90, 0x74DA, 0xAD91, + 0x74DB, 0xAD92, 0x74DC, 0xB9CF, 0x74DD, 0xAD93, 0x74DE, 0xF0AC, 0x74DF, 0xAD94, 0x74E0, 0xF0AD, 0x74E1, 0xAD95, 0x74E2, 0xC6B0, + 0x74E3, 0xB0EA, 0x74E4, 0xC8BF, 0x74E5, 0xAD96, 0x74E6, 0xCDDF, 0x74E7, 0xAD97, 0x74E8, 0xAD98, 0x74E9, 0xAD99, 0x74EA, 0xAD9A, + 0x74EB, 0xAD9B, 0x74EC, 0xAD9C, 0x74ED, 0xAD9D, 0x74EE, 0xCECD, 0x74EF, 0xEAB1, 0x74F0, 0xAD9E, 0x74F1, 0xAD9F, 0x74F2, 0xADA0, + 0x74F3, 0xAE40, 0x74F4, 0xEAB2, 0x74F5, 0xAE41, 0x74F6, 0xC6BF, 0x74F7, 0xB4C9, 0x74F8, 0xAE42, 0x74F9, 0xAE43, 0x74FA, 0xAE44, + 0x74FB, 0xAE45, 0x74FC, 0xAE46, 0x74FD, 0xAE47, 0x74FE, 0xAE48, 0x74FF, 0xEAB3, 0x7500, 0xAE49, 0x7501, 0xAE4A, 0x7502, 0xAE4B, + 0x7503, 0xAE4C, 0x7504, 0xD5E7, 0x7505, 0xAE4D, 0x7506, 0xAE4E, 0x7507, 0xAE4F, 0x7508, 0xAE50, 0x7509, 0xAE51, 0x750A, 0xAE52, + 0x750B, 0xAE53, 0x750C, 0xAE54, 0x750D, 0xDDF9, 0x750E, 0xAE55, 0x750F, 0xEAB4, 0x7510, 0xAE56, 0x7511, 0xEAB5, 0x7512, 0xAE57, + 0x7513, 0xEAB6, 0x7514, 0xAE58, 0x7515, 0xAE59, 0x7516, 0xAE5A, 0x7517, 0xAE5B, 0x7518, 0xB8CA, 0x7519, 0xDFB0, 0x751A, 0xC9F5, + 0x751B, 0xAE5C, 0x751C, 0xCCF0, 0x751D, 0xAE5D, 0x751E, 0xAE5E, 0x751F, 0xC9FA, 0x7520, 0xAE5F, 0x7521, 0xAE60, 0x7522, 0xAE61, + 0x7523, 0xAE62, 0x7524, 0xAE63, 0x7525, 0xC9FB, 0x7526, 0xAE64, 0x7527, 0xAE65, 0x7528, 0xD3C3, 0x7529, 0xCBA6, 0x752A, 0xAE66, + 0x752B, 0xB8A6, 0x752C, 0xF0AE, 0x752D, 0xB1C2, 0x752E, 0xAE67, 0x752F, 0xE5B8, 0x7530, 0xCCEF, 0x7531, 0xD3C9, 0x7532, 0xBCD7, + 0x7533, 0xC9EA, 0x7534, 0xAE68, 0x7535, 0xB5E7, 0x7536, 0xAE69, 0x7537, 0xC4D0, 0x7538, 0xB5E9, 0x7539, 0xAE6A, 0x753A, 0xEEAE, + 0x753B, 0xBBAD, 0x753C, 0xAE6B, 0x753D, 0xAE6C, 0x753E, 0xE7DE, 0x753F, 0xAE6D, 0x7540, 0xEEAF, 0x7541, 0xAE6E, 0x7542, 0xAE6F, + 0x7543, 0xAE70, 0x7544, 0xAE71, 0x7545, 0xB3A9, 0x7546, 0xAE72, 0x7547, 0xAE73, 0x7548, 0xEEB2, 0x7549, 0xAE74, 0x754A, 0xAE75, + 0x754B, 0xEEB1, 0x754C, 0xBDE7, 0x754D, 0xAE76, 0x754E, 0xEEB0, 0x754F, 0xCEB7, 0x7550, 0xAE77, 0x7551, 0xAE78, 0x7552, 0xAE79, + 0x7553, 0xAE7A, 0x7554, 0xC5CF, 0x7555, 0xAE7B, 0x7556, 0xAE7C, 0x7557, 0xAE7D, 0x7558, 0xAE7E, 0x7559, 0xC1F4, 0x755A, 0xDBCE, + 0x755B, 0xEEB3, 0x755C, 0xD0F3, 0x755D, 0xAE80, 0x755E, 0xAE81, 0x755F, 0xAE82, 0x7560, 0xAE83, 0x7561, 0xAE84, 0x7562, 0xAE85, + 0x7563, 0xAE86, 0x7564, 0xAE87, 0x7565, 0xC2D4, 0x7566, 0xC6E8, 0x7567, 0xAE88, 0x7568, 0xAE89, 0x7569, 0xAE8A, 0x756A, 0xB7AC, + 0x756B, 0xAE8B, 0x756C, 0xAE8C, 0x756D, 0xAE8D, 0x756E, 0xAE8E, 0x756F, 0xAE8F, 0x7570, 0xAE90, 0x7571, 0xAE91, 0x7572, 0xEEB4, + 0x7573, 0xAE92, 0x7574, 0xB3EB, 0x7575, 0xAE93, 0x7576, 0xAE94, 0x7577, 0xAE95, 0x7578, 0xBBFB, 0x7579, 0xEEB5, 0x757A, 0xAE96, + 0x757B, 0xAE97, 0x757C, 0xAE98, 0x757D, 0xAE99, 0x757E, 0xAE9A, 0x757F, 0xE7DC, 0x7580, 0xAE9B, 0x7581, 0xAE9C, 0x7582, 0xAE9D, + 0x7583, 0xEEB6, 0x7584, 0xAE9E, 0x7585, 0xAE9F, 0x7586, 0xBDAE, 0x7587, 0xAEA0, 0x7588, 0xAF40, 0x7589, 0xAF41, 0x758A, 0xAF42, + 0x758B, 0xF1E2, 0x758C, 0xAF43, 0x758D, 0xAF44, 0x758E, 0xAF45, 0x758F, 0xCAE8, 0x7590, 0xAF46, 0x7591, 0xD2C9, 0x7592, 0xF0DA, + 0x7593, 0xAF47, 0x7594, 0xF0DB, 0x7595, 0xAF48, 0x7596, 0xF0DC, 0x7597, 0xC1C6, 0x7598, 0xAF49, 0x7599, 0xB8ED, 0x759A, 0xBECE, + 0x759B, 0xAF4A, 0x759C, 0xAF4B, 0x759D, 0xF0DE, 0x759E, 0xAF4C, 0x759F, 0xC5B1, 0x75A0, 0xF0DD, 0x75A1, 0xD1F1, 0x75A2, 0xAF4D, + 0x75A3, 0xF0E0, 0x75A4, 0xB0CC, 0x75A5, 0xBDEA, 0x75A6, 0xAF4E, 0x75A7, 0xAF4F, 0x75A8, 0xAF50, 0x75A9, 0xAF51, 0x75AA, 0xAF52, + 0x75AB, 0xD2DF, 0x75AC, 0xF0DF, 0x75AD, 0xAF53, 0x75AE, 0xB4AF, 0x75AF, 0xB7E8, 0x75B0, 0xF0E6, 0x75B1, 0xF0E5, 0x75B2, 0xC6A3, + 0x75B3, 0xF0E1, 0x75B4, 0xF0E2, 0x75B5, 0xB4C3, 0x75B6, 0xAF54, 0x75B7, 0xAF55, 0x75B8, 0xF0E3, 0x75B9, 0xD5EE, 0x75BA, 0xAF56, + 0x75BB, 0xAF57, 0x75BC, 0xCCDB, 0x75BD, 0xBED2, 0x75BE, 0xBCB2, 0x75BF, 0xAF58, 0x75C0, 0xAF59, 0x75C1, 0xAF5A, 0x75C2, 0xF0E8, + 0x75C3, 0xF0E7, 0x75C4, 0xF0E4, 0x75C5, 0xB2A1, 0x75C6, 0xAF5B, 0x75C7, 0xD6A2, 0x75C8, 0xD3B8, 0x75C9, 0xBEB7, 0x75CA, 0xC8AC, + 0x75CB, 0xAF5C, 0x75CC, 0xAF5D, 0x75CD, 0xF0EA, 0x75CE, 0xAF5E, 0x75CF, 0xAF5F, 0x75D0, 0xAF60, 0x75D1, 0xAF61, 0x75D2, 0xD1F7, + 0x75D3, 0xAF62, 0x75D4, 0xD6CC, 0x75D5, 0xBADB, 0x75D6, 0xF0E9, 0x75D7, 0xAF63, 0x75D8, 0xB6BB, 0x75D9, 0xAF64, 0x75DA, 0xAF65, + 0x75DB, 0xCDB4, 0x75DC, 0xAF66, 0x75DD, 0xAF67, 0x75DE, 0xC6A6, 0x75DF, 0xAF68, 0x75E0, 0xAF69, 0x75E1, 0xAF6A, 0x75E2, 0xC1A1, + 0x75E3, 0xF0EB, 0x75E4, 0xF0EE, 0x75E5, 0xAF6B, 0x75E6, 0xF0ED, 0x75E7, 0xF0F0, 0x75E8, 0xF0EC, 0x75E9, 0xAF6C, 0x75EA, 0xBBBE, + 0x75EB, 0xF0EF, 0x75EC, 0xAF6D, 0x75ED, 0xAF6E, 0x75EE, 0xAF6F, 0x75EF, 0xAF70, 0x75F0, 0xCCB5, 0x75F1, 0xF0F2, 0x75F2, 0xAF71, + 0x75F3, 0xAF72, 0x75F4, 0xB3D5, 0x75F5, 0xAF73, 0x75F6, 0xAF74, 0x75F7, 0xAF75, 0x75F8, 0xAF76, 0x75F9, 0xB1D4, 0x75FA, 0xAF77, + 0x75FB, 0xAF78, 0x75FC, 0xF0F3, 0x75FD, 0xAF79, 0x75FE, 0xAF7A, 0x75FF, 0xF0F4, 0x7600, 0xF0F6, 0x7601, 0xB4E1, 0x7602, 0xAF7B, + 0x7603, 0xF0F1, 0x7604, 0xAF7C, 0x7605, 0xF0F7, 0x7606, 0xAF7D, 0x7607, 0xAF7E, 0x7608, 0xAF80, 0x7609, 0xAF81, 0x760A, 0xF0FA, + 0x760B, 0xAF82, 0x760C, 0xF0F8, 0x760D, 0xAF83, 0x760E, 0xAF84, 0x760F, 0xAF85, 0x7610, 0xF0F5, 0x7611, 0xAF86, 0x7612, 0xAF87, + 0x7613, 0xAF88, 0x7614, 0xAF89, 0x7615, 0xF0FD, 0x7616, 0xAF8A, 0x7617, 0xF0F9, 0x7618, 0xF0FC, 0x7619, 0xF0FE, 0x761A, 0xAF8B, + 0x761B, 0xF1A1, 0x761C, 0xAF8C, 0x761D, 0xAF8D, 0x761E, 0xAF8E, 0x761F, 0xCEC1, 0x7620, 0xF1A4, 0x7621, 0xAF8F, 0x7622, 0xF1A3, + 0x7623, 0xAF90, 0x7624, 0xC1F6, 0x7625, 0xF0FB, 0x7626, 0xCADD, 0x7627, 0xAF91, 0x7628, 0xAF92, 0x7629, 0xB4F1, 0x762A, 0xB1F1, + 0x762B, 0xCCB1, 0x762C, 0xAF93, 0x762D, 0xF1A6, 0x762E, 0xAF94, 0x762F, 0xAF95, 0x7630, 0xF1A7, 0x7631, 0xAF96, 0x7632, 0xAF97, + 0x7633, 0xF1AC, 0x7634, 0xD5CE, 0x7635, 0xF1A9, 0x7636, 0xAF98, 0x7637, 0xAF99, 0x7638, 0xC8B3, 0x7639, 0xAF9A, 0x763A, 0xAF9B, + 0x763B, 0xAF9C, 0x763C, 0xF1A2, 0x763D, 0xAF9D, 0x763E, 0xF1AB, 0x763F, 0xF1A8, 0x7640, 0xF1A5, 0x7641, 0xAF9E, 0x7642, 0xAF9F, + 0x7643, 0xF1AA, 0x7644, 0xAFA0, 0x7645, 0xB040, 0x7646, 0xB041, 0x7647, 0xB042, 0x7648, 0xB043, 0x7649, 0xB044, 0x764A, 0xB045, + 0x764B, 0xB046, 0x764C, 0xB0A9, 0x764D, 0xF1AD, 0x764E, 0xB047, 0x764F, 0xB048, 0x7650, 0xB049, 0x7651, 0xB04A, 0x7652, 0xB04B, + 0x7653, 0xB04C, 0x7654, 0xF1AF, 0x7655, 0xB04D, 0x7656, 0xF1B1, 0x7657, 0xB04E, 0x7658, 0xB04F, 0x7659, 0xB050, 0x765A, 0xB051, + 0x765B, 0xB052, 0x765C, 0xF1B0, 0x765D, 0xB053, 0x765E, 0xF1AE, 0x765F, 0xB054, 0x7660, 0xB055, 0x7661, 0xB056, 0x7662, 0xB057, + 0x7663, 0xD1A2, 0x7664, 0xB058, 0x7665, 0xB059, 0x7666, 0xB05A, 0x7667, 0xB05B, 0x7668, 0xB05C, 0x7669, 0xB05D, 0x766A, 0xB05E, + 0x766B, 0xF1B2, 0x766C, 0xB05F, 0x766D, 0xB060, 0x766E, 0xB061, 0x766F, 0xF1B3, 0x7670, 0xB062, 0x7671, 0xB063, 0x7672, 0xB064, + 0x7673, 0xB065, 0x7674, 0xB066, 0x7675, 0xB067, 0x7676, 0xB068, 0x7677, 0xB069, 0x7678, 0xB9EF, 0x7679, 0xB06A, 0x767A, 0xB06B, + 0x767B, 0xB5C7, 0x767C, 0xB06C, 0x767D, 0xB0D7, 0x767E, 0xB0D9, 0x767F, 0xB06D, 0x7680, 0xB06E, 0x7681, 0xB06F, 0x7682, 0xD4ED, + 0x7683, 0xB070, 0x7684, 0xB5C4, 0x7685, 0xB071, 0x7686, 0xBDD4, 0x7687, 0xBBCA, 0x7688, 0xF0A7, 0x7689, 0xB072, 0x768A, 0xB073, + 0x768B, 0xB8DE, 0x768C, 0xB074, 0x768D, 0xB075, 0x768E, 0xF0A8, 0x768F, 0xB076, 0x7690, 0xB077, 0x7691, 0xB0A8, 0x7692, 0xB078, + 0x7693, 0xF0A9, 0x7694, 0xB079, 0x7695, 0xB07A, 0x7696, 0xCDEE, 0x7697, 0xB07B, 0x7698, 0xB07C, 0x7699, 0xF0AA, 0x769A, 0xB07D, + 0x769B, 0xB07E, 0x769C, 0xB080, 0x769D, 0xB081, 0x769E, 0xB082, 0x769F, 0xB083, 0x76A0, 0xB084, 0x76A1, 0xB085, 0x76A2, 0xB086, + 0x76A3, 0xB087, 0x76A4, 0xF0AB, 0x76A5, 0xB088, 0x76A6, 0xB089, 0x76A7, 0xB08A, 0x76A8, 0xB08B, 0x76A9, 0xB08C, 0x76AA, 0xB08D, + 0x76AB, 0xB08E, 0x76AC, 0xB08F, 0x76AD, 0xB090, 0x76AE, 0xC6A4, 0x76AF, 0xB091, 0x76B0, 0xB092, 0x76B1, 0xD6E5, 0x76B2, 0xF1E4, + 0x76B3, 0xB093, 0x76B4, 0xF1E5, 0x76B5, 0xB094, 0x76B6, 0xB095, 0x76B7, 0xB096, 0x76B8, 0xB097, 0x76B9, 0xB098, 0x76BA, 0xB099, + 0x76BB, 0xB09A, 0x76BC, 0xB09B, 0x76BD, 0xB09C, 0x76BE, 0xB09D, 0x76BF, 0xC3F3, 0x76C0, 0xB09E, 0x76C1, 0xB09F, 0x76C2, 0xD3DB, + 0x76C3, 0xB0A0, 0x76C4, 0xB140, 0x76C5, 0xD6D1, 0x76C6, 0xC5E8, 0x76C7, 0xB141, 0x76C8, 0xD3AF, 0x76C9, 0xB142, 0x76CA, 0xD2E6, + 0x76CB, 0xB143, 0x76CC, 0xB144, 0x76CD, 0xEEC1, 0x76CE, 0xB0BB, 0x76CF, 0xD5B5, 0x76D0, 0xD1CE, 0x76D1, 0xBCE0, 0x76D2, 0xBAD0, + 0x76D3, 0xB145, 0x76D4, 0xBFF8, 0x76D5, 0xB146, 0x76D6, 0xB8C7, 0x76D7, 0xB5C1, 0x76D8, 0xC5CC, 0x76D9, 0xB147, 0x76DA, 0xB148, + 0x76DB, 0xCAA2, 0x76DC, 0xB149, 0x76DD, 0xB14A, 0x76DE, 0xB14B, 0x76DF, 0xC3CB, 0x76E0, 0xB14C, 0x76E1, 0xB14D, 0x76E2, 0xB14E, + 0x76E3, 0xB14F, 0x76E4, 0xB150, 0x76E5, 0xEEC2, 0x76E6, 0xB151, 0x76E7, 0xB152, 0x76E8, 0xB153, 0x76E9, 0xB154, 0x76EA, 0xB155, + 0x76EB, 0xB156, 0x76EC, 0xB157, 0x76ED, 0xB158, 0x76EE, 0xC4BF, 0x76EF, 0xB6A2, 0x76F0, 0xB159, 0x76F1, 0xEDEC, 0x76F2, 0xC3A4, + 0x76F3, 0xB15A, 0x76F4, 0xD6B1, 0x76F5, 0xB15B, 0x76F6, 0xB15C, 0x76F7, 0xB15D, 0x76F8, 0xCFE0, 0x76F9, 0xEDEF, 0x76FA, 0xB15E, + 0x76FB, 0xB15F, 0x76FC, 0xC5CE, 0x76FD, 0xB160, 0x76FE, 0xB6DC, 0x76FF, 0xB161, 0x7700, 0xB162, 0x7701, 0xCAA1, 0x7702, 0xB163, + 0x7703, 0xB164, 0x7704, 0xEDED, 0x7705, 0xB165, 0x7706, 0xB166, 0x7707, 0xEDF0, 0x7708, 0xEDF1, 0x7709, 0xC3BC, 0x770A, 0xB167, + 0x770B, 0xBFB4, 0x770C, 0xB168, 0x770D, 0xEDEE, 0x770E, 0xB169, 0x770F, 0xB16A, 0x7710, 0xB16B, 0x7711, 0xB16C, 0x7712, 0xB16D, + 0x7713, 0xB16E, 0x7714, 0xB16F, 0x7715, 0xB170, 0x7716, 0xB171, 0x7717, 0xB172, 0x7718, 0xB173, 0x7719, 0xEDF4, 0x771A, 0xEDF2, + 0x771B, 0xB174, 0x771C, 0xB175, 0x771D, 0xB176, 0x771E, 0xB177, 0x771F, 0xD5E6, 0x7720, 0xC3DF, 0x7721, 0xB178, 0x7722, 0xEDF3, + 0x7723, 0xB179, 0x7724, 0xB17A, 0x7725, 0xB17B, 0x7726, 0xEDF6, 0x7727, 0xB17C, 0x7728, 0xD5A3, 0x7729, 0xD1A3, 0x772A, 0xB17D, + 0x772B, 0xB17E, 0x772C, 0xB180, 0x772D, 0xEDF5, 0x772E, 0xB181, 0x772F, 0xC3D0, 0x7730, 0xB182, 0x7731, 0xB183, 0x7732, 0xB184, + 0x7733, 0xB185, 0x7734, 0xB186, 0x7735, 0xEDF7, 0x7736, 0xBFF4, 0x7737, 0xBEEC, 0x7738, 0xEDF8, 0x7739, 0xB187, 0x773A, 0xCCF7, + 0x773B, 0xB188, 0x773C, 0xD1DB, 0x773D, 0xB189, 0x773E, 0xB18A, 0x773F, 0xB18B, 0x7740, 0xD7C5, 0x7741, 0xD5F6, 0x7742, 0xB18C, + 0x7743, 0xEDFC, 0x7744, 0xB18D, 0x7745, 0xB18E, 0x7746, 0xB18F, 0x7747, 0xEDFB, 0x7748, 0xB190, 0x7749, 0xB191, 0x774A, 0xB192, + 0x774B, 0xB193, 0x774C, 0xB194, 0x774D, 0xB195, 0x774E, 0xB196, 0x774F, 0xB197, 0x7750, 0xEDF9, 0x7751, 0xEDFA, 0x7752, 0xB198, + 0x7753, 0xB199, 0x7754, 0xB19A, 0x7755, 0xB19B, 0x7756, 0xB19C, 0x7757, 0xB19D, 0x7758, 0xB19E, 0x7759, 0xB19F, 0x775A, 0xEDFD, + 0x775B, 0xBEA6, 0x775C, 0xB1A0, 0x775D, 0xB240, 0x775E, 0xB241, 0x775F, 0xB242, 0x7760, 0xB243, 0x7761, 0xCBAF, 0x7762, 0xEEA1, + 0x7763, 0xB6BD, 0x7764, 0xB244, 0x7765, 0xEEA2, 0x7766, 0xC4C0, 0x7767, 0xB245, 0x7768, 0xEDFE, 0x7769, 0xB246, 0x776A, 0xB247, + 0x776B, 0xBDDE, 0x776C, 0xB2C7, 0x776D, 0xB248, 0x776E, 0xB249, 0x776F, 0xB24A, 0x7770, 0xB24B, 0x7771, 0xB24C, 0x7772, 0xB24D, + 0x7773, 0xB24E, 0x7774, 0xB24F, 0x7775, 0xB250, 0x7776, 0xB251, 0x7777, 0xB252, 0x7778, 0xB253, 0x7779, 0xB6C3, 0x777A, 0xB254, + 0x777B, 0xB255, 0x777C, 0xB256, 0x777D, 0xEEA5, 0x777E, 0xD8BA, 0x777F, 0xEEA3, 0x7780, 0xEEA6, 0x7781, 0xB257, 0x7782, 0xB258, + 0x7783, 0xB259, 0x7784, 0xC3E9, 0x7785, 0xB3F2, 0x7786, 0xB25A, 0x7787, 0xB25B, 0x7788, 0xB25C, 0x7789, 0xB25D, 0x778A, 0xB25E, + 0x778B, 0xB25F, 0x778C, 0xEEA7, 0x778D, 0xEEA4, 0x778E, 0xCFB9, 0x778F, 0xB260, 0x7790, 0xB261, 0x7791, 0xEEA8, 0x7792, 0xC2F7, + 0x7793, 0xB262, 0x7794, 0xB263, 0x7795, 0xB264, 0x7796, 0xB265, 0x7797, 0xB266, 0x7798, 0xB267, 0x7799, 0xB268, 0x779A, 0xB269, + 0x779B, 0xB26A, 0x779C, 0xB26B, 0x779D, 0xB26C, 0x779E, 0xB26D, 0x779F, 0xEEA9, 0x77A0, 0xEEAA, 0x77A1, 0xB26E, 0x77A2, 0xDEAB, + 0x77A3, 0xB26F, 0x77A4, 0xB270, 0x77A5, 0xC6B3, 0x77A6, 0xB271, 0x77A7, 0xC7C6, 0x77A8, 0xB272, 0x77A9, 0xD6F5, 0x77AA, 0xB5C9, + 0x77AB, 0xB273, 0x77AC, 0xCBB2, 0x77AD, 0xB274, 0x77AE, 0xB275, 0x77AF, 0xB276, 0x77B0, 0xEEAB, 0x77B1, 0xB277, 0x77B2, 0xB278, + 0x77B3, 0xCDAB, 0x77B4, 0xB279, 0x77B5, 0xEEAC, 0x77B6, 0xB27A, 0x77B7, 0xB27B, 0x77B8, 0xB27C, 0x77B9, 0xB27D, 0x77BA, 0xB27E, + 0x77BB, 0xD5B0, 0x77BC, 0xB280, 0x77BD, 0xEEAD, 0x77BE, 0xB281, 0x77BF, 0xF6C4, 0x77C0, 0xB282, 0x77C1, 0xB283, 0x77C2, 0xB284, + 0x77C3, 0xB285, 0x77C4, 0xB286, 0x77C5, 0xB287, 0x77C6, 0xB288, 0x77C7, 0xB289, 0x77C8, 0xB28A, 0x77C9, 0xB28B, 0x77CA, 0xB28C, + 0x77CB, 0xB28D, 0x77CC, 0xB28E, 0x77CD, 0xDBC7, 0x77CE, 0xB28F, 0x77CF, 0xB290, 0x77D0, 0xB291, 0x77D1, 0xB292, 0x77D2, 0xB293, + 0x77D3, 0xB294, 0x77D4, 0xB295, 0x77D5, 0xB296, 0x77D6, 0xB297, 0x77D7, 0xB4A3, 0x77D8, 0xB298, 0x77D9, 0xB299, 0x77DA, 0xB29A, + 0x77DB, 0xC3AC, 0x77DC, 0xF1E6, 0x77DD, 0xB29B, 0x77DE, 0xB29C, 0x77DF, 0xB29D, 0x77E0, 0xB29E, 0x77E1, 0xB29F, 0x77E2, 0xCAB8, + 0x77E3, 0xD2D3, 0x77E4, 0xB2A0, 0x77E5, 0xD6AA, 0x77E6, 0xB340, 0x77E7, 0xEFF2, 0x77E8, 0xB341, 0x77E9, 0xBED8, 0x77EA, 0xB342, + 0x77EB, 0xBDC3, 0x77EC, 0xEFF3, 0x77ED, 0xB6CC, 0x77EE, 0xB0AB, 0x77EF, 0xB343, 0x77F0, 0xB344, 0x77F1, 0xB345, 0x77F2, 0xB346, + 0x77F3, 0xCAAF, 0x77F4, 0xB347, 0x77F5, 0xB348, 0x77F6, 0xEDB6, 0x77F7, 0xB349, 0x77F8, 0xEDB7, 0x77F9, 0xB34A, 0x77FA, 0xB34B, + 0x77FB, 0xB34C, 0x77FC, 0xB34D, 0x77FD, 0xCEF9, 0x77FE, 0xB7AF, 0x77FF, 0xBFF3, 0x7800, 0xEDB8, 0x7801, 0xC2EB, 0x7802, 0xC9B0, + 0x7803, 0xB34E, 0x7804, 0xB34F, 0x7805, 0xB350, 0x7806, 0xB351, 0x7807, 0xB352, 0x7808, 0xB353, 0x7809, 0xEDB9, 0x780A, 0xB354, + 0x780B, 0xB355, 0x780C, 0xC6F6, 0x780D, 0xBFB3, 0x780E, 0xB356, 0x780F, 0xB357, 0x7810, 0xB358, 0x7811, 0xEDBC, 0x7812, 0xC5F8, + 0x7813, 0xB359, 0x7814, 0xD1D0, 0x7815, 0xB35A, 0x7816, 0xD7A9, 0x7817, 0xEDBA, 0x7818, 0xEDBB, 0x7819, 0xB35B, 0x781A, 0xD1E2, + 0x781B, 0xB35C, 0x781C, 0xEDBF, 0x781D, 0xEDC0, 0x781E, 0xB35D, 0x781F, 0xEDC4, 0x7820, 0xB35E, 0x7821, 0xB35F, 0x7822, 0xB360, + 0x7823, 0xEDC8, 0x7824, 0xB361, 0x7825, 0xEDC6, 0x7826, 0xEDCE, 0x7827, 0xD5E8, 0x7828, 0xB362, 0x7829, 0xEDC9, 0x782A, 0xB363, + 0x782B, 0xB364, 0x782C, 0xEDC7, 0x782D, 0xEDBE, 0x782E, 0xB365, 0x782F, 0xB366, 0x7830, 0xC5E9, 0x7831, 0xB367, 0x7832, 0xB368, + 0x7833, 0xB369, 0x7834, 0xC6C6, 0x7835, 0xB36A, 0x7836, 0xB36B, 0x7837, 0xC9E9, 0x7838, 0xD4D2, 0x7839, 0xEDC1, 0x783A, 0xEDC2, + 0x783B, 0xEDC3, 0x783C, 0xEDC5, 0x783D, 0xB36C, 0x783E, 0xC0F9, 0x783F, 0xB36D, 0x7840, 0xB4A1, 0x7841, 0xB36E, 0x7842, 0xB36F, + 0x7843, 0xB370, 0x7844, 0xB371, 0x7845, 0xB9E8, 0x7846, 0xB372, 0x7847, 0xEDD0, 0x7848, 0xB373, 0x7849, 0xB374, 0x784A, 0xB375, + 0x784B, 0xB376, 0x784C, 0xEDD1, 0x784D, 0xB377, 0x784E, 0xEDCA, 0x784F, 0xB378, 0x7850, 0xEDCF, 0x7851, 0xB379, 0x7852, 0xCEF8, + 0x7853, 0xB37A, 0x7854, 0xB37B, 0x7855, 0xCBB6, 0x7856, 0xEDCC, 0x7857, 0xEDCD, 0x7858, 0xB37C, 0x7859, 0xB37D, 0x785A, 0xB37E, + 0x785B, 0xB380, 0x785C, 0xB381, 0x785D, 0xCFF5, 0x785E, 0xB382, 0x785F, 0xB383, 0x7860, 0xB384, 0x7861, 0xB385, 0x7862, 0xB386, + 0x7863, 0xB387, 0x7864, 0xB388, 0x7865, 0xB389, 0x7866, 0xB38A, 0x7867, 0xB38B, 0x7868, 0xB38C, 0x7869, 0xB38D, 0x786A, 0xEDD2, + 0x786B, 0xC1F2, 0x786C, 0xD3B2, 0x786D, 0xEDCB, 0x786E, 0xC8B7, 0x786F, 0xB38E, 0x7870, 0xB38F, 0x7871, 0xB390, 0x7872, 0xB391, + 0x7873, 0xB392, 0x7874, 0xB393, 0x7875, 0xB394, 0x7876, 0xB395, 0x7877, 0xBCEF, 0x7878, 0xB396, 0x7879, 0xB397, 0x787A, 0xB398, + 0x787B, 0xB399, 0x787C, 0xC5F0, 0x787D, 0xB39A, 0x787E, 0xB39B, 0x787F, 0xB39C, 0x7880, 0xB39D, 0x7881, 0xB39E, 0x7882, 0xB39F, + 0x7883, 0xB3A0, 0x7884, 0xB440, 0x7885, 0xB441, 0x7886, 0xB442, 0x7887, 0xEDD6, 0x7888, 0xB443, 0x7889, 0xB5EF, 0x788A, 0xB444, + 0x788B, 0xB445, 0x788C, 0xC2B5, 0x788D, 0xB0AD, 0x788E, 0xCBE9, 0x788F, 0xB446, 0x7890, 0xB447, 0x7891, 0xB1AE, 0x7892, 0xB448, + 0x7893, 0xEDD4, 0x7894, 0xB449, 0x7895, 0xB44A, 0x7896, 0xB44B, 0x7897, 0xCDEB, 0x7898, 0xB5E2, 0x7899, 0xB44C, 0x789A, 0xEDD5, + 0x789B, 0xEDD3, 0x789C, 0xEDD7, 0x789D, 0xB44D, 0x789E, 0xB44E, 0x789F, 0xB5FA, 0x78A0, 0xB44F, 0x78A1, 0xEDD8, 0x78A2, 0xB450, + 0x78A3, 0xEDD9, 0x78A4, 0xB451, 0x78A5, 0xEDDC, 0x78A6, 0xB452, 0x78A7, 0xB1CC, 0x78A8, 0xB453, 0x78A9, 0xB454, 0x78AA, 0xB455, + 0x78AB, 0xB456, 0x78AC, 0xB457, 0x78AD, 0xB458, 0x78AE, 0xB459, 0x78AF, 0xB45A, 0x78B0, 0xC5F6, 0x78B1, 0xBCEE, 0x78B2, 0xEDDA, + 0x78B3, 0xCCBC, 0x78B4, 0xB2EA, 0x78B5, 0xB45B, 0x78B6, 0xB45C, 0x78B7, 0xB45D, 0x78B8, 0xB45E, 0x78B9, 0xEDDB, 0x78BA, 0xB45F, + 0x78BB, 0xB460, 0x78BC, 0xB461, 0x78BD, 0xB462, 0x78BE, 0xC4EB, 0x78BF, 0xB463, 0x78C0, 0xB464, 0x78C1, 0xB4C5, 0x78C2, 0xB465, + 0x78C3, 0xB466, 0x78C4, 0xB467, 0x78C5, 0xB0F5, 0x78C6, 0xB468, 0x78C7, 0xB469, 0x78C8, 0xB46A, 0x78C9, 0xEDDF, 0x78CA, 0xC0DA, + 0x78CB, 0xB4E8, 0x78CC, 0xB46B, 0x78CD, 0xB46C, 0x78CE, 0xB46D, 0x78CF, 0xB46E, 0x78D0, 0xC5CD, 0x78D1, 0xB46F, 0x78D2, 0xB470, + 0x78D3, 0xB471, 0x78D4, 0xEDDD, 0x78D5, 0xBFC4, 0x78D6, 0xB472, 0x78D7, 0xB473, 0x78D8, 0xB474, 0x78D9, 0xEDDE, 0x78DA, 0xB475, + 0x78DB, 0xB476, 0x78DC, 0xB477, 0x78DD, 0xB478, 0x78DE, 0xB479, 0x78DF, 0xB47A, 0x78E0, 0xB47B, 0x78E1, 0xB47C, 0x78E2, 0xB47D, + 0x78E3, 0xB47E, 0x78E4, 0xB480, 0x78E5, 0xB481, 0x78E6, 0xB482, 0x78E7, 0xB483, 0x78E8, 0xC4A5, 0x78E9, 0xB484, 0x78EA, 0xB485, + 0x78EB, 0xB486, 0x78EC, 0xEDE0, 0x78ED, 0xB487, 0x78EE, 0xB488, 0x78EF, 0xB489, 0x78F0, 0xB48A, 0x78F1, 0xB48B, 0x78F2, 0xEDE1, + 0x78F3, 0xB48C, 0x78F4, 0xEDE3, 0x78F5, 0xB48D, 0x78F6, 0xB48E, 0x78F7, 0xC1D7, 0x78F8, 0xB48F, 0x78F9, 0xB490, 0x78FA, 0xBBC7, + 0x78FB, 0xB491, 0x78FC, 0xB492, 0x78FD, 0xB493, 0x78FE, 0xB494, 0x78FF, 0xB495, 0x7900, 0xB496, 0x7901, 0xBDB8, 0x7902, 0xB497, + 0x7903, 0xB498, 0x7904, 0xB499, 0x7905, 0xEDE2, 0x7906, 0xB49A, 0x7907, 0xB49B, 0x7908, 0xB49C, 0x7909, 0xB49D, 0x790A, 0xB49E, + 0x790B, 0xB49F, 0x790C, 0xB4A0, 0x790D, 0xB540, 0x790E, 0xB541, 0x790F, 0xB542, 0x7910, 0xB543, 0x7911, 0xB544, 0x7912, 0xB545, + 0x7913, 0xEDE4, 0x7914, 0xB546, 0x7915, 0xB547, 0x7916, 0xB548, 0x7917, 0xB549, 0x7918, 0xB54A, 0x7919, 0xB54B, 0x791A, 0xB54C, + 0x791B, 0xB54D, 0x791C, 0xB54E, 0x791D, 0xB54F, 0x791E, 0xEDE6, 0x791F, 0xB550, 0x7920, 0xB551, 0x7921, 0xB552, 0x7922, 0xB553, + 0x7923, 0xB554, 0x7924, 0xEDE5, 0x7925, 0xB555, 0x7926, 0xB556, 0x7927, 0xB557, 0x7928, 0xB558, 0x7929, 0xB559, 0x792A, 0xB55A, + 0x792B, 0xB55B, 0x792C, 0xB55C, 0x792D, 0xB55D, 0x792E, 0xB55E, 0x792F, 0xB55F, 0x7930, 0xB560, 0x7931, 0xB561, 0x7932, 0xB562, + 0x7933, 0xB563, 0x7934, 0xEDE7, 0x7935, 0xB564, 0x7936, 0xB565, 0x7937, 0xB566, 0x7938, 0xB567, 0x7939, 0xB568, 0x793A, 0xCABE, + 0x793B, 0xECEA, 0x793C, 0xC0F1, 0x793D, 0xB569, 0x793E, 0xC9E7, 0x793F, 0xB56A, 0x7940, 0xECEB, 0x7941, 0xC6EE, 0x7942, 0xB56B, + 0x7943, 0xB56C, 0x7944, 0xB56D, 0x7945, 0xB56E, 0x7946, 0xECEC, 0x7947, 0xB56F, 0x7948, 0xC6ED, 0x7949, 0xECED, 0x794A, 0xB570, + 0x794B, 0xB571, 0x794C, 0xB572, 0x794D, 0xB573, 0x794E, 0xB574, 0x794F, 0xB575, 0x7950, 0xB576, 0x7951, 0xB577, 0x7952, 0xB578, + 0x7953, 0xECF0, 0x7954, 0xB579, 0x7955, 0xB57A, 0x7956, 0xD7E6, 0x7957, 0xECF3, 0x7958, 0xB57B, 0x7959, 0xB57C, 0x795A, 0xECF1, + 0x795B, 0xECEE, 0x795C, 0xECEF, 0x795D, 0xD7A3, 0x795E, 0xC9F1, 0x795F, 0xCBEE, 0x7960, 0xECF4, 0x7961, 0xB57D, 0x7962, 0xECF2, + 0x7963, 0xB57E, 0x7964, 0xB580, 0x7965, 0xCFE9, 0x7966, 0xB581, 0x7967, 0xECF6, 0x7968, 0xC6B1, 0x7969, 0xB582, 0x796A, 0xB583, + 0x796B, 0xB584, 0x796C, 0xB585, 0x796D, 0xBCC0, 0x796E, 0xB586, 0x796F, 0xECF5, 0x7970, 0xB587, 0x7971, 0xB588, 0x7972, 0xB589, + 0x7973, 0xB58A, 0x7974, 0xB58B, 0x7975, 0xB58C, 0x7976, 0xB58D, 0x7977, 0xB5BB, 0x7978, 0xBBF6, 0x7979, 0xB58E, 0x797A, 0xECF7, + 0x797B, 0xB58F, 0x797C, 0xB590, 0x797D, 0xB591, 0x797E, 0xB592, 0x797F, 0xB593, 0x7980, 0xD9F7, 0x7981, 0xBDFB, 0x7982, 0xB594, + 0x7983, 0xB595, 0x7984, 0xC2BB, 0x7985, 0xECF8, 0x7986, 0xB596, 0x7987, 0xB597, 0x7988, 0xB598, 0x7989, 0xB599, 0x798A, 0xECF9, + 0x798B, 0xB59A, 0x798C, 0xB59B, 0x798D, 0xB59C, 0x798E, 0xB59D, 0x798F, 0xB8A3, 0x7990, 0xB59E, 0x7991, 0xB59F, 0x7992, 0xB5A0, + 0x7993, 0xB640, 0x7994, 0xB641, 0x7995, 0xB642, 0x7996, 0xB643, 0x7997, 0xB644, 0x7998, 0xB645, 0x7999, 0xB646, 0x799A, 0xECFA, + 0x799B, 0xB647, 0x799C, 0xB648, 0x799D, 0xB649, 0x799E, 0xB64A, 0x799F, 0xB64B, 0x79A0, 0xB64C, 0x79A1, 0xB64D, 0x79A2, 0xB64E, + 0x79A3, 0xB64F, 0x79A4, 0xB650, 0x79A5, 0xB651, 0x79A6, 0xB652, 0x79A7, 0xECFB, 0x79A8, 0xB653, 0x79A9, 0xB654, 0x79AA, 0xB655, + 0x79AB, 0xB656, 0x79AC, 0xB657, 0x79AD, 0xB658, 0x79AE, 0xB659, 0x79AF, 0xB65A, 0x79B0, 0xB65B, 0x79B1, 0xB65C, 0x79B2, 0xB65D, + 0x79B3, 0xECFC, 0x79B4, 0xB65E, 0x79B5, 0xB65F, 0x79B6, 0xB660, 0x79B7, 0xB661, 0x79B8, 0xB662, 0x79B9, 0xD3ED, 0x79BA, 0xD8AE, + 0x79BB, 0xC0EB, 0x79BC, 0xB663, 0x79BD, 0xC7DD, 0x79BE, 0xBACC, 0x79BF, 0xB664, 0x79C0, 0xD0E3, 0x79C1, 0xCBBD, 0x79C2, 0xB665, + 0x79C3, 0xCDBA, 0x79C4, 0xB666, 0x79C5, 0xB667, 0x79C6, 0xB8D1, 0x79C7, 0xB668, 0x79C8, 0xB669, 0x79C9, 0xB1FC, 0x79CA, 0xB66A, + 0x79CB, 0xC7EF, 0x79CC, 0xB66B, 0x79CD, 0xD6D6, 0x79CE, 0xB66C, 0x79CF, 0xB66D, 0x79D0, 0xB66E, 0x79D1, 0xBFC6, 0x79D2, 0xC3EB, + 0x79D3, 0xB66F, 0x79D4, 0xB670, 0x79D5, 0xEFF5, 0x79D6, 0xB671, 0x79D7, 0xB672, 0x79D8, 0xC3D8, 0x79D9, 0xB673, 0x79DA, 0xB674, + 0x79DB, 0xB675, 0x79DC, 0xB676, 0x79DD, 0xB677, 0x79DE, 0xB678, 0x79DF, 0xD7E2, 0x79E0, 0xB679, 0x79E1, 0xB67A, 0x79E2, 0xB67B, + 0x79E3, 0xEFF7, 0x79E4, 0xB3D3, 0x79E5, 0xB67C, 0x79E6, 0xC7D8, 0x79E7, 0xD1ED, 0x79E8, 0xB67D, 0x79E9, 0xD6C8, 0x79EA, 0xB67E, + 0x79EB, 0xEFF8, 0x79EC, 0xB680, 0x79ED, 0xEFF6, 0x79EE, 0xB681, 0x79EF, 0xBBFD, 0x79F0, 0xB3C6, 0x79F1, 0xB682, 0x79F2, 0xB683, + 0x79F3, 0xB684, 0x79F4, 0xB685, 0x79F5, 0xB686, 0x79F6, 0xB687, 0x79F7, 0xB688, 0x79F8, 0xBDD5, 0x79F9, 0xB689, 0x79FA, 0xB68A, + 0x79FB, 0xD2C6, 0x79FC, 0xB68B, 0x79FD, 0xBBE0, 0x79FE, 0xB68C, 0x79FF, 0xB68D, 0x7A00, 0xCFA1, 0x7A01, 0xB68E, 0x7A02, 0xEFFC, + 0x7A03, 0xEFFB, 0x7A04, 0xB68F, 0x7A05, 0xB690, 0x7A06, 0xEFF9, 0x7A07, 0xB691, 0x7A08, 0xB692, 0x7A09, 0xB693, 0x7A0A, 0xB694, + 0x7A0B, 0xB3CC, 0x7A0C, 0xB695, 0x7A0D, 0xC9D4, 0x7A0E, 0xCBB0, 0x7A0F, 0xB696, 0x7A10, 0xB697, 0x7A11, 0xB698, 0x7A12, 0xB699, + 0x7A13, 0xB69A, 0x7A14, 0xEFFE, 0x7A15, 0xB69B, 0x7A16, 0xB69C, 0x7A17, 0xB0DE, 0x7A18, 0xB69D, 0x7A19, 0xB69E, 0x7A1A, 0xD6C9, + 0x7A1B, 0xB69F, 0x7A1C, 0xB6A0, 0x7A1D, 0xB740, 0x7A1E, 0xEFFD, 0x7A1F, 0xB741, 0x7A20, 0xB3ED, 0x7A21, 0xB742, 0x7A22, 0xB743, + 0x7A23, 0xF6D5, 0x7A24, 0xB744, 0x7A25, 0xB745, 0x7A26, 0xB746, 0x7A27, 0xB747, 0x7A28, 0xB748, 0x7A29, 0xB749, 0x7A2A, 0xB74A, + 0x7A2B, 0xB74B, 0x7A2C, 0xB74C, 0x7A2D, 0xB74D, 0x7A2E, 0xB74E, 0x7A2F, 0xB74F, 0x7A30, 0xB750, 0x7A31, 0xB751, 0x7A32, 0xB752, + 0x7A33, 0xCEC8, 0x7A34, 0xB753, 0x7A35, 0xB754, 0x7A36, 0xB755, 0x7A37, 0xF0A2, 0x7A38, 0xB756, 0x7A39, 0xF0A1, 0x7A3A, 0xB757, + 0x7A3B, 0xB5BE, 0x7A3C, 0xBCDA, 0x7A3D, 0xBBFC, 0x7A3E, 0xB758, 0x7A3F, 0xB8E5, 0x7A40, 0xB759, 0x7A41, 0xB75A, 0x7A42, 0xB75B, + 0x7A43, 0xB75C, 0x7A44, 0xB75D, 0x7A45, 0xB75E, 0x7A46, 0xC4C2, 0x7A47, 0xB75F, 0x7A48, 0xB760, 0x7A49, 0xB761, 0x7A4A, 0xB762, + 0x7A4B, 0xB763, 0x7A4C, 0xB764, 0x7A4D, 0xB765, 0x7A4E, 0xB766, 0x7A4F, 0xB767, 0x7A50, 0xB768, 0x7A51, 0xF0A3, 0x7A52, 0xB769, + 0x7A53, 0xB76A, 0x7A54, 0xB76B, 0x7A55, 0xB76C, 0x7A56, 0xB76D, 0x7A57, 0xCBEB, 0x7A58, 0xB76E, 0x7A59, 0xB76F, 0x7A5A, 0xB770, + 0x7A5B, 0xB771, 0x7A5C, 0xB772, 0x7A5D, 0xB773, 0x7A5E, 0xB774, 0x7A5F, 0xB775, 0x7A60, 0xB776, 0x7A61, 0xB777, 0x7A62, 0xB778, + 0x7A63, 0xB779, 0x7A64, 0xB77A, 0x7A65, 0xB77B, 0x7A66, 0xB77C, 0x7A67, 0xB77D, 0x7A68, 0xB77E, 0x7A69, 0xB780, 0x7A6A, 0xB781, + 0x7A6B, 0xB782, 0x7A6C, 0xB783, 0x7A6D, 0xB784, 0x7A6E, 0xB785, 0x7A6F, 0xB786, 0x7A70, 0xF0A6, 0x7A71, 0xB787, 0x7A72, 0xB788, + 0x7A73, 0xB789, 0x7A74, 0xD1A8, 0x7A75, 0xB78A, 0x7A76, 0xBEBF, 0x7A77, 0xC7EE, 0x7A78, 0xF1B6, 0x7A79, 0xF1B7, 0x7A7A, 0xBFD5, + 0x7A7B, 0xB78B, 0x7A7C, 0xB78C, 0x7A7D, 0xB78D, 0x7A7E, 0xB78E, 0x7A7F, 0xB4A9, 0x7A80, 0xF1B8, 0x7A81, 0xCDBB, 0x7A82, 0xB78F, + 0x7A83, 0xC7D4, 0x7A84, 0xD5AD, 0x7A85, 0xB790, 0x7A86, 0xF1B9, 0x7A87, 0xB791, 0x7A88, 0xF1BA, 0x7A89, 0xB792, 0x7A8A, 0xB793, + 0x7A8B, 0xB794, 0x7A8C, 0xB795, 0x7A8D, 0xC7CF, 0x7A8E, 0xB796, 0x7A8F, 0xB797, 0x7A90, 0xB798, 0x7A91, 0xD2A4, 0x7A92, 0xD6CF, + 0x7A93, 0xB799, 0x7A94, 0xB79A, 0x7A95, 0xF1BB, 0x7A96, 0xBDD1, 0x7A97, 0xB4B0, 0x7A98, 0xBEBD, 0x7A99, 0xB79B, 0x7A9A, 0xB79C, + 0x7A9B, 0xB79D, 0x7A9C, 0xB4DC, 0x7A9D, 0xCED1, 0x7A9E, 0xB79E, 0x7A9F, 0xBFDF, 0x7AA0, 0xF1BD, 0x7AA1, 0xB79F, 0x7AA2, 0xB7A0, + 0x7AA3, 0xB840, 0x7AA4, 0xB841, 0x7AA5, 0xBFFA, 0x7AA6, 0xF1BC, 0x7AA7, 0xB842, 0x7AA8, 0xF1BF, 0x7AA9, 0xB843, 0x7AAA, 0xB844, + 0x7AAB, 0xB845, 0x7AAC, 0xF1BE, 0x7AAD, 0xF1C0, 0x7AAE, 0xB846, 0x7AAF, 0xB847, 0x7AB0, 0xB848, 0x7AB1, 0xB849, 0x7AB2, 0xB84A, + 0x7AB3, 0xF1C1, 0x7AB4, 0xB84B, 0x7AB5, 0xB84C, 0x7AB6, 0xB84D, 0x7AB7, 0xB84E, 0x7AB8, 0xB84F, 0x7AB9, 0xB850, 0x7ABA, 0xB851, + 0x7ABB, 0xB852, 0x7ABC, 0xB853, 0x7ABD, 0xB854, 0x7ABE, 0xB855, 0x7ABF, 0xC1FE, 0x7AC0, 0xB856, 0x7AC1, 0xB857, 0x7AC2, 0xB858, + 0x7AC3, 0xB859, 0x7AC4, 0xB85A, 0x7AC5, 0xB85B, 0x7AC6, 0xB85C, 0x7AC7, 0xB85D, 0x7AC8, 0xB85E, 0x7AC9, 0xB85F, 0x7ACA, 0xB860, + 0x7ACB, 0xC1A2, 0x7ACC, 0xB861, 0x7ACD, 0xB862, 0x7ACE, 0xB863, 0x7ACF, 0xB864, 0x7AD0, 0xB865, 0x7AD1, 0xB866, 0x7AD2, 0xB867, + 0x7AD3, 0xB868, 0x7AD4, 0xB869, 0x7AD5, 0xB86A, 0x7AD6, 0xCAFA, 0x7AD7, 0xB86B, 0x7AD8, 0xB86C, 0x7AD9, 0xD5BE, 0x7ADA, 0xB86D, + 0x7ADB, 0xB86E, 0x7ADC, 0xB86F, 0x7ADD, 0xB870, 0x7ADE, 0xBEBA, 0x7ADF, 0xBEB9, 0x7AE0, 0xD5C2, 0x7AE1, 0xB871, 0x7AE2, 0xB872, + 0x7AE3, 0xBFA2, 0x7AE4, 0xB873, 0x7AE5, 0xCDAF, 0x7AE6, 0xF1B5, 0x7AE7, 0xB874, 0x7AE8, 0xB875, 0x7AE9, 0xB876, 0x7AEA, 0xB877, + 0x7AEB, 0xB878, 0x7AEC, 0xB879, 0x7AED, 0xBDDF, 0x7AEE, 0xB87A, 0x7AEF, 0xB6CB, 0x7AF0, 0xB87B, 0x7AF1, 0xB87C, 0x7AF2, 0xB87D, + 0x7AF3, 0xB87E, 0x7AF4, 0xB880, 0x7AF5, 0xB881, 0x7AF6, 0xB882, 0x7AF7, 0xB883, 0x7AF8, 0xB884, 0x7AF9, 0xD6F1, 0x7AFA, 0xF3C3, + 0x7AFB, 0xB885, 0x7AFC, 0xB886, 0x7AFD, 0xF3C4, 0x7AFE, 0xB887, 0x7AFF, 0xB8CD, 0x7B00, 0xB888, 0x7B01, 0xB889, 0x7B02, 0xB88A, + 0x7B03, 0xF3C6, 0x7B04, 0xF3C7, 0x7B05, 0xB88B, 0x7B06, 0xB0CA, 0x7B07, 0xB88C, 0x7B08, 0xF3C5, 0x7B09, 0xB88D, 0x7B0A, 0xF3C9, + 0x7B0B, 0xCBF1, 0x7B0C, 0xB88E, 0x7B0D, 0xB88F, 0x7B0E, 0xB890, 0x7B0F, 0xF3CB, 0x7B10, 0xB891, 0x7B11, 0xD0A6, 0x7B12, 0xB892, + 0x7B13, 0xB893, 0x7B14, 0xB1CA, 0x7B15, 0xF3C8, 0x7B16, 0xB894, 0x7B17, 0xB895, 0x7B18, 0xB896, 0x7B19, 0xF3CF, 0x7B1A, 0xB897, + 0x7B1B, 0xB5D1, 0x7B1C, 0xB898, 0x7B1D, 0xB899, 0x7B1E, 0xF3D7, 0x7B1F, 0xB89A, 0x7B20, 0xF3D2, 0x7B21, 0xB89B, 0x7B22, 0xB89C, + 0x7B23, 0xB89D, 0x7B24, 0xF3D4, 0x7B25, 0xF3D3, 0x7B26, 0xB7FB, 0x7B27, 0xB89E, 0x7B28, 0xB1BF, 0x7B29, 0xB89F, 0x7B2A, 0xF3CE, + 0x7B2B, 0xF3CA, 0x7B2C, 0xB5DA, 0x7B2D, 0xB8A0, 0x7B2E, 0xF3D0, 0x7B2F, 0xB940, 0x7B30, 0xB941, 0x7B31, 0xF3D1, 0x7B32, 0xB942, + 0x7B33, 0xF3D5, 0x7B34, 0xB943, 0x7B35, 0xB944, 0x7B36, 0xB945, 0x7B37, 0xB946, 0x7B38, 0xF3CD, 0x7B39, 0xB947, 0x7B3A, 0xBCE3, + 0x7B3B, 0xB948, 0x7B3C, 0xC1FD, 0x7B3D, 0xB949, 0x7B3E, 0xF3D6, 0x7B3F, 0xB94A, 0x7B40, 0xB94B, 0x7B41, 0xB94C, 0x7B42, 0xB94D, + 0x7B43, 0xB94E, 0x7B44, 0xB94F, 0x7B45, 0xF3DA, 0x7B46, 0xB950, 0x7B47, 0xF3CC, 0x7B48, 0xB951, 0x7B49, 0xB5C8, 0x7B4A, 0xB952, + 0x7B4B, 0xBDEE, 0x7B4C, 0xF3DC, 0x7B4D, 0xB953, 0x7B4E, 0xB954, 0x7B4F, 0xB7A4, 0x7B50, 0xBFF0, 0x7B51, 0xD6FE, 0x7B52, 0xCDB2, + 0x7B53, 0xB955, 0x7B54, 0xB4F0, 0x7B55, 0xB956, 0x7B56, 0xB2DF, 0x7B57, 0xB957, 0x7B58, 0xF3D8, 0x7B59, 0xB958, 0x7B5A, 0xF3D9, + 0x7B5B, 0xC9B8, 0x7B5C, 0xB959, 0x7B5D, 0xF3DD, 0x7B5E, 0xB95A, 0x7B5F, 0xB95B, 0x7B60, 0xF3DE, 0x7B61, 0xB95C, 0x7B62, 0xF3E1, + 0x7B63, 0xB95D, 0x7B64, 0xB95E, 0x7B65, 0xB95F, 0x7B66, 0xB960, 0x7B67, 0xB961, 0x7B68, 0xB962, 0x7B69, 0xB963, 0x7B6A, 0xB964, + 0x7B6B, 0xB965, 0x7B6C, 0xB966, 0x7B6D, 0xB967, 0x7B6E, 0xF3DF, 0x7B6F, 0xB968, 0x7B70, 0xB969, 0x7B71, 0xF3E3, 0x7B72, 0xF3E2, + 0x7B73, 0xB96A, 0x7B74, 0xB96B, 0x7B75, 0xF3DB, 0x7B76, 0xB96C, 0x7B77, 0xBFEA, 0x7B78, 0xB96D, 0x7B79, 0xB3EF, 0x7B7A, 0xB96E, + 0x7B7B, 0xF3E0, 0x7B7C, 0xB96F, 0x7B7D, 0xB970, 0x7B7E, 0xC7A9, 0x7B7F, 0xB971, 0x7B80, 0xBCF2, 0x7B81, 0xB972, 0x7B82, 0xB973, + 0x7B83, 0xB974, 0x7B84, 0xB975, 0x7B85, 0xF3EB, 0x7B86, 0xB976, 0x7B87, 0xB977, 0x7B88, 0xB978, 0x7B89, 0xB979, 0x7B8A, 0xB97A, + 0x7B8B, 0xB97B, 0x7B8C, 0xB97C, 0x7B8D, 0xB9BF, 0x7B8E, 0xB97D, 0x7B8F, 0xB97E, 0x7B90, 0xF3E4, 0x7B91, 0xB980, 0x7B92, 0xB981, + 0x7B93, 0xB982, 0x7B94, 0xB2AD, 0x7B95, 0xBBFE, 0x7B96, 0xB983, 0x7B97, 0xCBE3, 0x7B98, 0xB984, 0x7B99, 0xB985, 0x7B9A, 0xB986, + 0x7B9B, 0xB987, 0x7B9C, 0xF3ED, 0x7B9D, 0xF3E9, 0x7B9E, 0xB988, 0x7B9F, 0xB989, 0x7BA0, 0xB98A, 0x7BA1, 0xB9DC, 0x7BA2, 0xF3EE, + 0x7BA3, 0xB98B, 0x7BA4, 0xB98C, 0x7BA5, 0xB98D, 0x7BA6, 0xF3E5, 0x7BA7, 0xF3E6, 0x7BA8, 0xF3EA, 0x7BA9, 0xC2E1, 0x7BAA, 0xF3EC, + 0x7BAB, 0xF3EF, 0x7BAC, 0xF3E8, 0x7BAD, 0xBCFD, 0x7BAE, 0xB98E, 0x7BAF, 0xB98F, 0x7BB0, 0xB990, 0x7BB1, 0xCFE4, 0x7BB2, 0xB991, + 0x7BB3, 0xB992, 0x7BB4, 0xF3F0, 0x7BB5, 0xB993, 0x7BB6, 0xB994, 0x7BB7, 0xB995, 0x7BB8, 0xF3E7, 0x7BB9, 0xB996, 0x7BBA, 0xB997, + 0x7BBB, 0xB998, 0x7BBC, 0xB999, 0x7BBD, 0xB99A, 0x7BBE, 0xB99B, 0x7BBF, 0xB99C, 0x7BC0, 0xB99D, 0x7BC1, 0xF3F2, 0x7BC2, 0xB99E, + 0x7BC3, 0xB99F, 0x7BC4, 0xB9A0, 0x7BC5, 0xBA40, 0x7BC6, 0xD7AD, 0x7BC7, 0xC6AA, 0x7BC8, 0xBA41, 0x7BC9, 0xBA42, 0x7BCA, 0xBA43, + 0x7BCB, 0xBA44, 0x7BCC, 0xF3F3, 0x7BCD, 0xBA45, 0x7BCE, 0xBA46, 0x7BCF, 0xBA47, 0x7BD0, 0xBA48, 0x7BD1, 0xF3F1, 0x7BD2, 0xBA49, + 0x7BD3, 0xC2A8, 0x7BD4, 0xBA4A, 0x7BD5, 0xBA4B, 0x7BD6, 0xBA4C, 0x7BD7, 0xBA4D, 0x7BD8, 0xBA4E, 0x7BD9, 0xB8DD, 0x7BDA, 0xF3F5, + 0x7BDB, 0xBA4F, 0x7BDC, 0xBA50, 0x7BDD, 0xF3F4, 0x7BDE, 0xBA51, 0x7BDF, 0xBA52, 0x7BE0, 0xBA53, 0x7BE1, 0xB4DB, 0x7BE2, 0xBA54, + 0x7BE3, 0xBA55, 0x7BE4, 0xBA56, 0x7BE5, 0xF3F6, 0x7BE6, 0xF3F7, 0x7BE7, 0xBA57, 0x7BE8, 0xBA58, 0x7BE9, 0xBA59, 0x7BEA, 0xF3F8, + 0x7BEB, 0xBA5A, 0x7BEC, 0xBA5B, 0x7BED, 0xBA5C, 0x7BEE, 0xC0BA, 0x7BEF, 0xBA5D, 0x7BF0, 0xBA5E, 0x7BF1, 0xC0E9, 0x7BF2, 0xBA5F, + 0x7BF3, 0xBA60, 0x7BF4, 0xBA61, 0x7BF5, 0xBA62, 0x7BF6, 0xBA63, 0x7BF7, 0xC5F1, 0x7BF8, 0xBA64, 0x7BF9, 0xBA65, 0x7BFA, 0xBA66, + 0x7BFB, 0xBA67, 0x7BFC, 0xF3FB, 0x7BFD, 0xBA68, 0x7BFE, 0xF3FA, 0x7BFF, 0xBA69, 0x7C00, 0xBA6A, 0x7C01, 0xBA6B, 0x7C02, 0xBA6C, + 0x7C03, 0xBA6D, 0x7C04, 0xBA6E, 0x7C05, 0xBA6F, 0x7C06, 0xBA70, 0x7C07, 0xB4D8, 0x7C08, 0xBA71, 0x7C09, 0xBA72, 0x7C0A, 0xBA73, + 0x7C0B, 0xF3FE, 0x7C0C, 0xF3F9, 0x7C0D, 0xBA74, 0x7C0E, 0xBA75, 0x7C0F, 0xF3FC, 0x7C10, 0xBA76, 0x7C11, 0xBA77, 0x7C12, 0xBA78, + 0x7C13, 0xBA79, 0x7C14, 0xBA7A, 0x7C15, 0xBA7B, 0x7C16, 0xF3FD, 0x7C17, 0xBA7C, 0x7C18, 0xBA7D, 0x7C19, 0xBA7E, 0x7C1A, 0xBA80, + 0x7C1B, 0xBA81, 0x7C1C, 0xBA82, 0x7C1D, 0xBA83, 0x7C1E, 0xBA84, 0x7C1F, 0xF4A1, 0x7C20, 0xBA85, 0x7C21, 0xBA86, 0x7C22, 0xBA87, + 0x7C23, 0xBA88, 0x7C24, 0xBA89, 0x7C25, 0xBA8A, 0x7C26, 0xF4A3, 0x7C27, 0xBBC9, 0x7C28, 0xBA8B, 0x7C29, 0xBA8C, 0x7C2A, 0xF4A2, + 0x7C2B, 0xBA8D, 0x7C2C, 0xBA8E, 0x7C2D, 0xBA8F, 0x7C2E, 0xBA90, 0x7C2F, 0xBA91, 0x7C30, 0xBA92, 0x7C31, 0xBA93, 0x7C32, 0xBA94, + 0x7C33, 0xBA95, 0x7C34, 0xBA96, 0x7C35, 0xBA97, 0x7C36, 0xBA98, 0x7C37, 0xBA99, 0x7C38, 0xF4A4, 0x7C39, 0xBA9A, 0x7C3A, 0xBA9B, + 0x7C3B, 0xBA9C, 0x7C3C, 0xBA9D, 0x7C3D, 0xBA9E, 0x7C3E, 0xBA9F, 0x7C3F, 0xB2BE, 0x7C40, 0xF4A6, 0x7C41, 0xF4A5, 0x7C42, 0xBAA0, + 0x7C43, 0xBB40, 0x7C44, 0xBB41, 0x7C45, 0xBB42, 0x7C46, 0xBB43, 0x7C47, 0xBB44, 0x7C48, 0xBB45, 0x7C49, 0xBB46, 0x7C4A, 0xBB47, + 0x7C4B, 0xBB48, 0x7C4C, 0xBB49, 0x7C4D, 0xBCAE, 0x7C4E, 0xBB4A, 0x7C4F, 0xBB4B, 0x7C50, 0xBB4C, 0x7C51, 0xBB4D, 0x7C52, 0xBB4E, + 0x7C53, 0xBB4F, 0x7C54, 0xBB50, 0x7C55, 0xBB51, 0x7C56, 0xBB52, 0x7C57, 0xBB53, 0x7C58, 0xBB54, 0x7C59, 0xBB55, 0x7C5A, 0xBB56, + 0x7C5B, 0xBB57, 0x7C5C, 0xBB58, 0x7C5D, 0xBB59, 0x7C5E, 0xBB5A, 0x7C5F, 0xBB5B, 0x7C60, 0xBB5C, 0x7C61, 0xBB5D, 0x7C62, 0xBB5E, + 0x7C63, 0xBB5F, 0x7C64, 0xBB60, 0x7C65, 0xBB61, 0x7C66, 0xBB62, 0x7C67, 0xBB63, 0x7C68, 0xBB64, 0x7C69, 0xBB65, 0x7C6A, 0xBB66, + 0x7C6B, 0xBB67, 0x7C6C, 0xBB68, 0x7C6D, 0xBB69, 0x7C6E, 0xBB6A, 0x7C6F, 0xBB6B, 0x7C70, 0xBB6C, 0x7C71, 0xBB6D, 0x7C72, 0xBB6E, + 0x7C73, 0xC3D7, 0x7C74, 0xD9E1, 0x7C75, 0xBB6F, 0x7C76, 0xBB70, 0x7C77, 0xBB71, 0x7C78, 0xBB72, 0x7C79, 0xBB73, 0x7C7A, 0xBB74, + 0x7C7B, 0xC0E0, 0x7C7C, 0xF4CC, 0x7C7D, 0xD7D1, 0x7C7E, 0xBB75, 0x7C7F, 0xBB76, 0x7C80, 0xBB77, 0x7C81, 0xBB78, 0x7C82, 0xBB79, + 0x7C83, 0xBB7A, 0x7C84, 0xBB7B, 0x7C85, 0xBB7C, 0x7C86, 0xBB7D, 0x7C87, 0xBB7E, 0x7C88, 0xBB80, 0x7C89, 0xB7DB, 0x7C8A, 0xBB81, + 0x7C8B, 0xBB82, 0x7C8C, 0xBB83, 0x7C8D, 0xBB84, 0x7C8E, 0xBB85, 0x7C8F, 0xBB86, 0x7C90, 0xBB87, 0x7C91, 0xF4CE, 0x7C92, 0xC1A3, + 0x7C93, 0xBB88, 0x7C94, 0xBB89, 0x7C95, 0xC6C9, 0x7C96, 0xBB8A, 0x7C97, 0xB4D6, 0x7C98, 0xD5B3, 0x7C99, 0xBB8B, 0x7C9A, 0xBB8C, + 0x7C9B, 0xBB8D, 0x7C9C, 0xF4D0, 0x7C9D, 0xF4CF, 0x7C9E, 0xF4D1, 0x7C9F, 0xCBDA, 0x7CA0, 0xBB8E, 0x7CA1, 0xBB8F, 0x7CA2, 0xF4D2, + 0x7CA3, 0xBB90, 0x7CA4, 0xD4C1, 0x7CA5, 0xD6E0, 0x7CA6, 0xBB91, 0x7CA7, 0xBB92, 0x7CA8, 0xBB93, 0x7CA9, 0xBB94, 0x7CAA, 0xB7E0, + 0x7CAB, 0xBB95, 0x7CAC, 0xBB96, 0x7CAD, 0xBB97, 0x7CAE, 0xC1B8, 0x7CAF, 0xBB98, 0x7CB0, 0xBB99, 0x7CB1, 0xC1BB, 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, 0x7CB4, 0xBB9A, 0x7CB5, 0xBB9B, 0x7CB6, 0xBB9C, 0x7CB7, 0xBB9D, 0x7CB8, 0xBB9E, 0x7CB9, 0xB4E2, 0x7CBA, 0xBB9F, + 0x7CBB, 0xBBA0, 0x7CBC, 0xF4D4, 0x7CBD, 0xF4D5, 0x7CBE, 0xBEAB, 0x7CBF, 0xBC40, 0x7CC0, 0xBC41, 0x7CC1, 0xF4D6, 0x7CC2, 0xBC42, + 0x7CC3, 0xBC43, 0x7CC4, 0xBC44, 0x7CC5, 0xF4DB, 0x7CC6, 0xBC45, 0x7CC7, 0xF4D7, 0x7CC8, 0xF4DA, 0x7CC9, 0xBC46, 0x7CCA, 0xBAFD, + 0x7CCB, 0xBC47, 0x7CCC, 0xF4D8, 0x7CCD, 0xF4D9, 0x7CCE, 0xBC48, 0x7CCF, 0xBC49, 0x7CD0, 0xBC4A, 0x7CD1, 0xBC4B, 0x7CD2, 0xBC4C, + 0x7CD3, 0xBC4D, 0x7CD4, 0xBC4E, 0x7CD5, 0xB8E2, 0x7CD6, 0xCCC7, 0x7CD7, 0xF4DC, 0x7CD8, 0xBC4F, 0x7CD9, 0xB2DA, 0x7CDA, 0xBC50, + 0x7CDB, 0xBC51, 0x7CDC, 0xC3D3, 0x7CDD, 0xBC52, 0x7CDE, 0xBC53, 0x7CDF, 0xD4E3, 0x7CE0, 0xBFB7, 0x7CE1, 0xBC54, 0x7CE2, 0xBC55, + 0x7CE3, 0xBC56, 0x7CE4, 0xBC57, 0x7CE5, 0xBC58, 0x7CE6, 0xBC59, 0x7CE7, 0xBC5A, 0x7CE8, 0xF4DD, 0x7CE9, 0xBC5B, 0x7CEA, 0xBC5C, + 0x7CEB, 0xBC5D, 0x7CEC, 0xBC5E, 0x7CED, 0xBC5F, 0x7CEE, 0xBC60, 0x7CEF, 0xC5B4, 0x7CF0, 0xBC61, 0x7CF1, 0xBC62, 0x7CF2, 0xBC63, + 0x7CF3, 0xBC64, 0x7CF4, 0xBC65, 0x7CF5, 0xBC66, 0x7CF6, 0xBC67, 0x7CF7, 0xBC68, 0x7CF8, 0xF4E9, 0x7CF9, 0xBC69, 0x7CFA, 0xBC6A, + 0x7CFB, 0xCFB5, 0x7CFC, 0xBC6B, 0x7CFD, 0xBC6C, 0x7CFE, 0xBC6D, 0x7CFF, 0xBC6E, 0x7D00, 0xBC6F, 0x7D01, 0xBC70, 0x7D02, 0xBC71, + 0x7D03, 0xBC72, 0x7D04, 0xBC73, 0x7D05, 0xBC74, 0x7D06, 0xBC75, 0x7D07, 0xBC76, 0x7D08, 0xBC77, 0x7D09, 0xBC78, 0x7D0A, 0xCEC9, + 0x7D0B, 0xBC79, 0x7D0C, 0xBC7A, 0x7D0D, 0xBC7B, 0x7D0E, 0xBC7C, 0x7D0F, 0xBC7D, 0x7D10, 0xBC7E, 0x7D11, 0xBC80, 0x7D12, 0xBC81, + 0x7D13, 0xBC82, 0x7D14, 0xBC83, 0x7D15, 0xBC84, 0x7D16, 0xBC85, 0x7D17, 0xBC86, 0x7D18, 0xBC87, 0x7D19, 0xBC88, 0x7D1A, 0xBC89, + 0x7D1B, 0xBC8A, 0x7D1C, 0xBC8B, 0x7D1D, 0xBC8C, 0x7D1E, 0xBC8D, 0x7D1F, 0xBC8E, 0x7D20, 0xCBD8, 0x7D21, 0xBC8F, 0x7D22, 0xCBF7, + 0x7D23, 0xBC90, 0x7D24, 0xBC91, 0x7D25, 0xBC92, 0x7D26, 0xBC93, 0x7D27, 0xBDF4, 0x7D28, 0xBC94, 0x7D29, 0xBC95, 0x7D2A, 0xBC96, + 0x7D2B, 0xD7CF, 0x7D2C, 0xBC97, 0x7D2D, 0xBC98, 0x7D2E, 0xBC99, 0x7D2F, 0xC0DB, 0x7D30, 0xBC9A, 0x7D31, 0xBC9B, 0x7D32, 0xBC9C, + 0x7D33, 0xBC9D, 0x7D34, 0xBC9E, 0x7D35, 0xBC9F, 0x7D36, 0xBCA0, 0x7D37, 0xBD40, 0x7D38, 0xBD41, 0x7D39, 0xBD42, 0x7D3A, 0xBD43, + 0x7D3B, 0xBD44, 0x7D3C, 0xBD45, 0x7D3D, 0xBD46, 0x7D3E, 0xBD47, 0x7D3F, 0xBD48, 0x7D40, 0xBD49, 0x7D41, 0xBD4A, 0x7D42, 0xBD4B, + 0x7D43, 0xBD4C, 0x7D44, 0xBD4D, 0x7D45, 0xBD4E, 0x7D46, 0xBD4F, 0x7D47, 0xBD50, 0x7D48, 0xBD51, 0x7D49, 0xBD52, 0x7D4A, 0xBD53, + 0x7D4B, 0xBD54, 0x7D4C, 0xBD55, 0x7D4D, 0xBD56, 0x7D4E, 0xBD57, 0x7D4F, 0xBD58, 0x7D50, 0xBD59, 0x7D51, 0xBD5A, 0x7D52, 0xBD5B, + 0x7D53, 0xBD5C, 0x7D54, 0xBD5D, 0x7D55, 0xBD5E, 0x7D56, 0xBD5F, 0x7D57, 0xBD60, 0x7D58, 0xBD61, 0x7D59, 0xBD62, 0x7D5A, 0xBD63, + 0x7D5B, 0xBD64, 0x7D5C, 0xBD65, 0x7D5D, 0xBD66, 0x7D5E, 0xBD67, 0x7D5F, 0xBD68, 0x7D60, 0xBD69, 0x7D61, 0xBD6A, 0x7D62, 0xBD6B, + 0x7D63, 0xBD6C, 0x7D64, 0xBD6D, 0x7D65, 0xBD6E, 0x7D66, 0xBD6F, 0x7D67, 0xBD70, 0x7D68, 0xBD71, 0x7D69, 0xBD72, 0x7D6A, 0xBD73, + 0x7D6B, 0xBD74, 0x7D6C, 0xBD75, 0x7D6D, 0xBD76, 0x7D6E, 0xD0F5, 0x7D6F, 0xBD77, 0x7D70, 0xBD78, 0x7D71, 0xBD79, 0x7D72, 0xBD7A, + 0x7D73, 0xBD7B, 0x7D74, 0xBD7C, 0x7D75, 0xBD7D, 0x7D76, 0xBD7E, 0x7D77, 0xF4EA, 0x7D78, 0xBD80, 0x7D79, 0xBD81, 0x7D7A, 0xBD82, + 0x7D7B, 0xBD83, 0x7D7C, 0xBD84, 0x7D7D, 0xBD85, 0x7D7E, 0xBD86, 0x7D7F, 0xBD87, 0x7D80, 0xBD88, 0x7D81, 0xBD89, 0x7D82, 0xBD8A, + 0x7D83, 0xBD8B, 0x7D84, 0xBD8C, 0x7D85, 0xBD8D, 0x7D86, 0xBD8E, 0x7D87, 0xBD8F, 0x7D88, 0xBD90, 0x7D89, 0xBD91, 0x7D8A, 0xBD92, + 0x7D8B, 0xBD93, 0x7D8C, 0xBD94, 0x7D8D, 0xBD95, 0x7D8E, 0xBD96, 0x7D8F, 0xBD97, 0x7D90, 0xBD98, 0x7D91, 0xBD99, 0x7D92, 0xBD9A, + 0x7D93, 0xBD9B, 0x7D94, 0xBD9C, 0x7D95, 0xBD9D, 0x7D96, 0xBD9E, 0x7D97, 0xBD9F, 0x7D98, 0xBDA0, 0x7D99, 0xBE40, 0x7D9A, 0xBE41, + 0x7D9B, 0xBE42, 0x7D9C, 0xBE43, 0x7D9D, 0xBE44, 0x7D9E, 0xBE45, 0x7D9F, 0xBE46, 0x7DA0, 0xBE47, 0x7DA1, 0xBE48, 0x7DA2, 0xBE49, + 0x7DA3, 0xBE4A, 0x7DA4, 0xBE4B, 0x7DA5, 0xBE4C, 0x7DA6, 0xF4EB, 0x7DA7, 0xBE4D, 0x7DA8, 0xBE4E, 0x7DA9, 0xBE4F, 0x7DAA, 0xBE50, + 0x7DAB, 0xBE51, 0x7DAC, 0xBE52, 0x7DAD, 0xBE53, 0x7DAE, 0xF4EC, 0x7DAF, 0xBE54, 0x7DB0, 0xBE55, 0x7DB1, 0xBE56, 0x7DB2, 0xBE57, + 0x7DB3, 0xBE58, 0x7DB4, 0xBE59, 0x7DB5, 0xBE5A, 0x7DB6, 0xBE5B, 0x7DB7, 0xBE5C, 0x7DB8, 0xBE5D, 0x7DB9, 0xBE5E, 0x7DBA, 0xBE5F, + 0x7DBB, 0xBE60, 0x7DBC, 0xBE61, 0x7DBD, 0xBE62, 0x7DBE, 0xBE63, 0x7DBF, 0xBE64, 0x7DC0, 0xBE65, 0x7DC1, 0xBE66, 0x7DC2, 0xBE67, + 0x7DC3, 0xBE68, 0x7DC4, 0xBE69, 0x7DC5, 0xBE6A, 0x7DC6, 0xBE6B, 0x7DC7, 0xBE6C, 0x7DC8, 0xBE6D, 0x7DC9, 0xBE6E, 0x7DCA, 0xBE6F, + 0x7DCB, 0xBE70, 0x7DCC, 0xBE71, 0x7DCD, 0xBE72, 0x7DCE, 0xBE73, 0x7DCF, 0xBE74, 0x7DD0, 0xBE75, 0x7DD1, 0xBE76, 0x7DD2, 0xBE77, + 0x7DD3, 0xBE78, 0x7DD4, 0xBE79, 0x7DD5, 0xBE7A, 0x7DD6, 0xBE7B, 0x7DD7, 0xBE7C, 0x7DD8, 0xBE7D, 0x7DD9, 0xBE7E, 0x7DDA, 0xBE80, + 0x7DDB, 0xBE81, 0x7DDC, 0xBE82, 0x7DDD, 0xBE83, 0x7DDE, 0xBE84, 0x7DDF, 0xBE85, 0x7DE0, 0xBE86, 0x7DE1, 0xBE87, 0x7DE2, 0xBE88, + 0x7DE3, 0xBE89, 0x7DE4, 0xBE8A, 0x7DE5, 0xBE8B, 0x7DE6, 0xBE8C, 0x7DE7, 0xBE8D, 0x7DE8, 0xBE8E, 0x7DE9, 0xBE8F, 0x7DEA, 0xBE90, + 0x7DEB, 0xBE91, 0x7DEC, 0xBE92, 0x7DED, 0xBE93, 0x7DEE, 0xBE94, 0x7DEF, 0xBE95, 0x7DF0, 0xBE96, 0x7DF1, 0xBE97, 0x7DF2, 0xBE98, + 0x7DF3, 0xBE99, 0x7DF4, 0xBE9A, 0x7DF5, 0xBE9B, 0x7DF6, 0xBE9C, 0x7DF7, 0xBE9D, 0x7DF8, 0xBE9E, 0x7DF9, 0xBE9F, 0x7DFA, 0xBEA0, + 0x7DFB, 0xBF40, 0x7DFC, 0xBF41, 0x7DFD, 0xBF42, 0x7DFE, 0xBF43, 0x7DFF, 0xBF44, 0x7E00, 0xBF45, 0x7E01, 0xBF46, 0x7E02, 0xBF47, + 0x7E03, 0xBF48, 0x7E04, 0xBF49, 0x7E05, 0xBF4A, 0x7E06, 0xBF4B, 0x7E07, 0xBF4C, 0x7E08, 0xBF4D, 0x7E09, 0xBF4E, 0x7E0A, 0xBF4F, + 0x7E0B, 0xBF50, 0x7E0C, 0xBF51, 0x7E0D, 0xBF52, 0x7E0E, 0xBF53, 0x7E0F, 0xBF54, 0x7E10, 0xBF55, 0x7E11, 0xBF56, 0x7E12, 0xBF57, + 0x7E13, 0xBF58, 0x7E14, 0xBF59, 0x7E15, 0xBF5A, 0x7E16, 0xBF5B, 0x7E17, 0xBF5C, 0x7E18, 0xBF5D, 0x7E19, 0xBF5E, 0x7E1A, 0xBF5F, + 0x7E1B, 0xBF60, 0x7E1C, 0xBF61, 0x7E1D, 0xBF62, 0x7E1E, 0xBF63, 0x7E1F, 0xBF64, 0x7E20, 0xBF65, 0x7E21, 0xBF66, 0x7E22, 0xBF67, + 0x7E23, 0xBF68, 0x7E24, 0xBF69, 0x7E25, 0xBF6A, 0x7E26, 0xBF6B, 0x7E27, 0xBF6C, 0x7E28, 0xBF6D, 0x7E29, 0xBF6E, 0x7E2A, 0xBF6F, + 0x7E2B, 0xBF70, 0x7E2C, 0xBF71, 0x7E2D, 0xBF72, 0x7E2E, 0xBF73, 0x7E2F, 0xBF74, 0x7E30, 0xBF75, 0x7E31, 0xBF76, 0x7E32, 0xBF77, + 0x7E33, 0xBF78, 0x7E34, 0xBF79, 0x7E35, 0xBF7A, 0x7E36, 0xBF7B, 0x7E37, 0xBF7C, 0x7E38, 0xBF7D, 0x7E39, 0xBF7E, 0x7E3A, 0xBF80, + 0x7E3B, 0xF7E3, 0x7E3C, 0xBF81, 0x7E3D, 0xBF82, 0x7E3E, 0xBF83, 0x7E3F, 0xBF84, 0x7E40, 0xBF85, 0x7E41, 0xB7B1, 0x7E42, 0xBF86, + 0x7E43, 0xBF87, 0x7E44, 0xBF88, 0x7E45, 0xBF89, 0x7E46, 0xBF8A, 0x7E47, 0xF4ED, 0x7E48, 0xBF8B, 0x7E49, 0xBF8C, 0x7E4A, 0xBF8D, + 0x7E4B, 0xBF8E, 0x7E4C, 0xBF8F, 0x7E4D, 0xBF90, 0x7E4E, 0xBF91, 0x7E4F, 0xBF92, 0x7E50, 0xBF93, 0x7E51, 0xBF94, 0x7E52, 0xBF95, + 0x7E53, 0xBF96, 0x7E54, 0xBF97, 0x7E55, 0xBF98, 0x7E56, 0xBF99, 0x7E57, 0xBF9A, 0x7E58, 0xBF9B, 0x7E59, 0xBF9C, 0x7E5A, 0xBF9D, + 0x7E5B, 0xBF9E, 0x7E5C, 0xBF9F, 0x7E5D, 0xBFA0, 0x7E5E, 0xC040, 0x7E5F, 0xC041, 0x7E60, 0xC042, 0x7E61, 0xC043, 0x7E62, 0xC044, + 0x7E63, 0xC045, 0x7E64, 0xC046, 0x7E65, 0xC047, 0x7E66, 0xC048, 0x7E67, 0xC049, 0x7E68, 0xC04A, 0x7E69, 0xC04B, 0x7E6A, 0xC04C, + 0x7E6B, 0xC04D, 0x7E6C, 0xC04E, 0x7E6D, 0xC04F, 0x7E6E, 0xC050, 0x7E6F, 0xC051, 0x7E70, 0xC052, 0x7E71, 0xC053, 0x7E72, 0xC054, + 0x7E73, 0xC055, 0x7E74, 0xC056, 0x7E75, 0xC057, 0x7E76, 0xC058, 0x7E77, 0xC059, 0x7E78, 0xC05A, 0x7E79, 0xC05B, 0x7E7A, 0xC05C, + 0x7E7B, 0xC05D, 0x7E7C, 0xC05E, 0x7E7D, 0xC05F, 0x7E7E, 0xC060, 0x7E7F, 0xC061, 0x7E80, 0xC062, 0x7E81, 0xC063, 0x7E82, 0xD7EB, + 0x7E83, 0xC064, 0x7E84, 0xC065, 0x7E85, 0xC066, 0x7E86, 0xC067, 0x7E87, 0xC068, 0x7E88, 0xC069, 0x7E89, 0xC06A, 0x7E8A, 0xC06B, + 0x7E8B, 0xC06C, 0x7E8C, 0xC06D, 0x7E8D, 0xC06E, 0x7E8E, 0xC06F, 0x7E8F, 0xC070, 0x7E90, 0xC071, 0x7E91, 0xC072, 0x7E92, 0xC073, + 0x7E93, 0xC074, 0x7E94, 0xC075, 0x7E95, 0xC076, 0x7E96, 0xC077, 0x7E97, 0xC078, 0x7E98, 0xC079, 0x7E99, 0xC07A, 0x7E9A, 0xC07B, + 0x7E9B, 0xF4EE, 0x7E9C, 0xC07C, 0x7E9D, 0xC07D, 0x7E9E, 0xC07E, 0x7E9F, 0xE6F9, 0x7EA0, 0xBEC0, 0x7EA1, 0xE6FA, 0x7EA2, 0xBAEC, + 0x7EA3, 0xE6FB, 0x7EA4, 0xCFCB, 0x7EA5, 0xE6FC, 0x7EA6, 0xD4BC, 0x7EA7, 0xBCB6, 0x7EA8, 0xE6FD, 0x7EA9, 0xE6FE, 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, 0x7EAC, 0xCEB3, 0x7EAD, 0xE7A1, 0x7EAE, 0xC080, 0x7EAF, 0xB4BF, 0x7EB0, 0xE7A2, 0x7EB1, 0xC9B4, 0x7EB2, 0xB8D9, + 0x7EB3, 0xC4C9, 0x7EB4, 0xC081, 0x7EB5, 0xD7DD, 0x7EB6, 0xC2DA, 0x7EB7, 0xB7D7, 0x7EB8, 0xD6BD, 0x7EB9, 0xCEC6, 0x7EBA, 0xB7C4, + 0x7EBB, 0xC082, 0x7EBC, 0xC083, 0x7EBD, 0xC5A6, 0x7EBE, 0xE7A3, 0x7EBF, 0xCFDF, 0x7EC0, 0xE7A4, 0x7EC1, 0xE7A5, 0x7EC2, 0xE7A6, + 0x7EC3, 0xC1B7, 0x7EC4, 0xD7E9, 0x7EC5, 0xC9F0, 0x7EC6, 0xCFB8, 0x7EC7, 0xD6AF, 0x7EC8, 0xD6D5, 0x7EC9, 0xE7A7, 0x7ECA, 0xB0ED, + 0x7ECB, 0xE7A8, 0x7ECC, 0xE7A9, 0x7ECD, 0xC9DC, 0x7ECE, 0xD2EF, 0x7ECF, 0xBEAD, 0x7ED0, 0xE7AA, 0x7ED1, 0xB0F3, 0x7ED2, 0xC8DE, + 0x7ED3, 0xBDE1, 0x7ED4, 0xE7AB, 0x7ED5, 0xC8C6, 0x7ED6, 0xC084, 0x7ED7, 0xE7AC, 0x7ED8, 0xBBE6, 0x7ED9, 0xB8F8, 0x7EDA, 0xD1A4, + 0x7EDB, 0xE7AD, 0x7EDC, 0xC2E7, 0x7EDD, 0xBEF8, 0x7EDE, 0xBDCA, 0x7EDF, 0xCDB3, 0x7EE0, 0xE7AE, 0x7EE1, 0xE7AF, 0x7EE2, 0xBEEE, + 0x7EE3, 0xD0E5, 0x7EE4, 0xC085, 0x7EE5, 0xCBE7, 0x7EE6, 0xCCD0, 0x7EE7, 0xBCCC, 0x7EE8, 0xE7B0, 0x7EE9, 0xBCA8, 0x7EEA, 0xD0F7, + 0x7EEB, 0xE7B1, 0x7EEC, 0xC086, 0x7EED, 0xD0F8, 0x7EEE, 0xE7B2, 0x7EEF, 0xE7B3, 0x7EF0, 0xB4C2, 0x7EF1, 0xE7B4, 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, 0x7EF4, 0xCEAC, 0x7EF5, 0xC3E0, 0x7EF6, 0xE7B7, 0x7EF7, 0xB1C1, 0x7EF8, 0xB3F1, 0x7EF9, 0xC087, 0x7EFA, 0xE7B8, + 0x7EFB, 0xE7B9, 0x7EFC, 0xD7DB, 0x7EFD, 0xD5C0, 0x7EFE, 0xE7BA, 0x7EFF, 0xC2CC, 0x7F00, 0xD7BA, 0x7F01, 0xE7BB, 0x7F02, 0xE7BC, + 0x7F03, 0xE7BD, 0x7F04, 0xBCEA, 0x7F05, 0xC3E5, 0x7F06, 0xC0C2, 0x7F07, 0xE7BE, 0x7F08, 0xE7BF, 0x7F09, 0xBCA9, 0x7F0A, 0xC088, + 0x7F0B, 0xE7C0, 0x7F0C, 0xE7C1, 0x7F0D, 0xE7B6, 0x7F0E, 0xB6D0, 0x7F0F, 0xE7C2, 0x7F10, 0xC089, 0x7F11, 0xE7C3, 0x7F12, 0xE7C4, + 0x7F13, 0xBBBA, 0x7F14, 0xB5DE, 0x7F15, 0xC2C6, 0x7F16, 0xB1E0, 0x7F17, 0xE7C5, 0x7F18, 0xD4B5, 0x7F19, 0xE7C6, 0x7F1A, 0xB8BF, + 0x7F1B, 0xE7C8, 0x7F1C, 0xE7C7, 0x7F1D, 0xB7EC, 0x7F1E, 0xC08A, 0x7F1F, 0xE7C9, 0x7F20, 0xB2F8, 0x7F21, 0xE7CA, 0x7F22, 0xE7CB, + 0x7F23, 0xE7CC, 0x7F24, 0xE7CD, 0x7F25, 0xE7CE, 0x7F26, 0xE7CF, 0x7F27, 0xE7D0, 0x7F28, 0xD3A7, 0x7F29, 0xCBF5, 0x7F2A, 0xE7D1, + 0x7F2B, 0xE7D2, 0x7F2C, 0xE7D3, 0x7F2D, 0xE7D4, 0x7F2E, 0xC9C9, 0x7F2F, 0xE7D5, 0x7F30, 0xE7D6, 0x7F31, 0xE7D7, 0x7F32, 0xE7D8, + 0x7F33, 0xE7D9, 0x7F34, 0xBDC9, 0x7F35, 0xE7DA, 0x7F36, 0xF3BE, 0x7F37, 0xC08B, 0x7F38, 0xB8D7, 0x7F39, 0xC08C, 0x7F3A, 0xC8B1, + 0x7F3B, 0xC08D, 0x7F3C, 0xC08E, 0x7F3D, 0xC08F, 0x7F3E, 0xC090, 0x7F3F, 0xC091, 0x7F40, 0xC092, 0x7F41, 0xC093, 0x7F42, 0xF3BF, + 0x7F43, 0xC094, 0x7F44, 0xF3C0, 0x7F45, 0xF3C1, 0x7F46, 0xC095, 0x7F47, 0xC096, 0x7F48, 0xC097, 0x7F49, 0xC098, 0x7F4A, 0xC099, + 0x7F4B, 0xC09A, 0x7F4C, 0xC09B, 0x7F4D, 0xC09C, 0x7F4E, 0xC09D, 0x7F4F, 0xC09E, 0x7F50, 0xB9DE, 0x7F51, 0xCDF8, 0x7F52, 0xC09F, + 0x7F53, 0xC0A0, 0x7F54, 0xD8E8, 0x7F55, 0xBAB1, 0x7F56, 0xC140, 0x7F57, 0xC2DE, 0x7F58, 0xEEB7, 0x7F59, 0xC141, 0x7F5A, 0xB7A3, + 0x7F5B, 0xC142, 0x7F5C, 0xC143, 0x7F5D, 0xC144, 0x7F5E, 0xC145, 0x7F5F, 0xEEB9, 0x7F60, 0xC146, 0x7F61, 0xEEB8, 0x7F62, 0xB0D5, + 0x7F63, 0xC147, 0x7F64, 0xC148, 0x7F65, 0xC149, 0x7F66, 0xC14A, 0x7F67, 0xC14B, 0x7F68, 0xEEBB, 0x7F69, 0xD5D6, 0x7F6A, 0xD7EF, + 0x7F6B, 0xC14C, 0x7F6C, 0xC14D, 0x7F6D, 0xC14E, 0x7F6E, 0xD6C3, 0x7F6F, 0xC14F, 0x7F70, 0xC150, 0x7F71, 0xEEBD, 0x7F72, 0xCAF0, + 0x7F73, 0xC151, 0x7F74, 0xEEBC, 0x7F75, 0xC152, 0x7F76, 0xC153, 0x7F77, 0xC154, 0x7F78, 0xC155, 0x7F79, 0xEEBE, 0x7F7A, 0xC156, + 0x7F7B, 0xC157, 0x7F7C, 0xC158, 0x7F7D, 0xC159, 0x7F7E, 0xEEC0, 0x7F7F, 0xC15A, 0x7F80, 0xC15B, 0x7F81, 0xEEBF, 0x7F82, 0xC15C, + 0x7F83, 0xC15D, 0x7F84, 0xC15E, 0x7F85, 0xC15F, 0x7F86, 0xC160, 0x7F87, 0xC161, 0x7F88, 0xC162, 0x7F89, 0xC163, 0x7F8A, 0xD1F2, + 0x7F8B, 0xC164, 0x7F8C, 0xC7BC, 0x7F8D, 0xC165, 0x7F8E, 0xC3C0, 0x7F8F, 0xC166, 0x7F90, 0xC167, 0x7F91, 0xC168, 0x7F92, 0xC169, + 0x7F93, 0xC16A, 0x7F94, 0xB8E1, 0x7F95, 0xC16B, 0x7F96, 0xC16C, 0x7F97, 0xC16D, 0x7F98, 0xC16E, 0x7F99, 0xC16F, 0x7F9A, 0xC1E7, + 0x7F9B, 0xC170, 0x7F9C, 0xC171, 0x7F9D, 0xF4C6, 0x7F9E, 0xD0DF, 0x7F9F, 0xF4C7, 0x7FA0, 0xC172, 0x7FA1, 0xCFDB, 0x7FA2, 0xC173, + 0x7FA3, 0xC174, 0x7FA4, 0xC8BA, 0x7FA5, 0xC175, 0x7FA6, 0xC176, 0x7FA7, 0xF4C8, 0x7FA8, 0xC177, 0x7FA9, 0xC178, 0x7FAA, 0xC179, + 0x7FAB, 0xC17A, 0x7FAC, 0xC17B, 0x7FAD, 0xC17C, 0x7FAE, 0xC17D, 0x7FAF, 0xF4C9, 0x7FB0, 0xF4CA, 0x7FB1, 0xC17E, 0x7FB2, 0xF4CB, + 0x7FB3, 0xC180, 0x7FB4, 0xC181, 0x7FB5, 0xC182, 0x7FB6, 0xC183, 0x7FB7, 0xC184, 0x7FB8, 0xD9FA, 0x7FB9, 0xB8FE, 0x7FBA, 0xC185, + 0x7FBB, 0xC186, 0x7FBC, 0xE5F1, 0x7FBD, 0xD3F0, 0x7FBE, 0xC187, 0x7FBF, 0xF4E0, 0x7FC0, 0xC188, 0x7FC1, 0xCECC, 0x7FC2, 0xC189, + 0x7FC3, 0xC18A, 0x7FC4, 0xC18B, 0x7FC5, 0xB3E1, 0x7FC6, 0xC18C, 0x7FC7, 0xC18D, 0x7FC8, 0xC18E, 0x7FC9, 0xC18F, 0x7FCA, 0xF1B4, + 0x7FCB, 0xC190, 0x7FCC, 0xD2EE, 0x7FCD, 0xC191, 0x7FCE, 0xF4E1, 0x7FCF, 0xC192, 0x7FD0, 0xC193, 0x7FD1, 0xC194, 0x7FD2, 0xC195, + 0x7FD3, 0xC196, 0x7FD4, 0xCFE8, 0x7FD5, 0xF4E2, 0x7FD6, 0xC197, 0x7FD7, 0xC198, 0x7FD8, 0xC7CC, 0x7FD9, 0xC199, 0x7FDA, 0xC19A, + 0x7FDB, 0xC19B, 0x7FDC, 0xC19C, 0x7FDD, 0xC19D, 0x7FDE, 0xC19E, 0x7FDF, 0xB5D4, 0x7FE0, 0xB4E4, 0x7FE1, 0xF4E4, 0x7FE2, 0xC19F, + 0x7FE3, 0xC1A0, 0x7FE4, 0xC240, 0x7FE5, 0xF4E3, 0x7FE6, 0xF4E5, 0x7FE7, 0xC241, 0x7FE8, 0xC242, 0x7FE9, 0xF4E6, 0x7FEA, 0xC243, + 0x7FEB, 0xC244, 0x7FEC, 0xC245, 0x7FED, 0xC246, 0x7FEE, 0xF4E7, 0x7FEF, 0xC247, 0x7FF0, 0xBAB2, 0x7FF1, 0xB0BF, 0x7FF2, 0xC248, + 0x7FF3, 0xF4E8, 0x7FF4, 0xC249, 0x7FF5, 0xC24A, 0x7FF6, 0xC24B, 0x7FF7, 0xC24C, 0x7FF8, 0xC24D, 0x7FF9, 0xC24E, 0x7FFA, 0xC24F, + 0x7FFB, 0xB7AD, 0x7FFC, 0xD2ED, 0x7FFD, 0xC250, 0x7FFE, 0xC251, 0x7FFF, 0xC252, 0x8000, 0xD2AB, 0x8001, 0xC0CF, 0x8002, 0xC253, + 0x8003, 0xBFBC, 0x8004, 0xEBA3, 0x8005, 0xD5DF, 0x8006, 0xEAC8, 0x8007, 0xC254, 0x8008, 0xC255, 0x8009, 0xC256, 0x800A, 0xC257, + 0x800B, 0xF1F3, 0x800C, 0xB6F8, 0x800D, 0xCBA3, 0x800E, 0xC258, 0x800F, 0xC259, 0x8010, 0xC4CD, 0x8011, 0xC25A, 0x8012, 0xF1E7, + 0x8013, 0xC25B, 0x8014, 0xF1E8, 0x8015, 0xB8FB, 0x8016, 0xF1E9, 0x8017, 0xBAC4, 0x8018, 0xD4C5, 0x8019, 0xB0D2, 0x801A, 0xC25C, + 0x801B, 0xC25D, 0x801C, 0xF1EA, 0x801D, 0xC25E, 0x801E, 0xC25F, 0x801F, 0xC260, 0x8020, 0xF1EB, 0x8021, 0xC261, 0x8022, 0xF1EC, + 0x8023, 0xC262, 0x8024, 0xC263, 0x8025, 0xF1ED, 0x8026, 0xF1EE, 0x8027, 0xF1EF, 0x8028, 0xF1F1, 0x8029, 0xF1F0, 0x802A, 0xC5D5, + 0x802B, 0xC264, 0x802C, 0xC265, 0x802D, 0xC266, 0x802E, 0xC267, 0x802F, 0xC268, 0x8030, 0xC269, 0x8031, 0xF1F2, 0x8032, 0xC26A, + 0x8033, 0xB6FA, 0x8034, 0xC26B, 0x8035, 0xF1F4, 0x8036, 0xD2AE, 0x8037, 0xDEC7, 0x8038, 0xCBCA, 0x8039, 0xC26C, 0x803A, 0xC26D, + 0x803B, 0xB3DC, 0x803C, 0xC26E, 0x803D, 0xB5A2, 0x803E, 0xC26F, 0x803F, 0xB9A2, 0x8040, 0xC270, 0x8041, 0xC271, 0x8042, 0xC4F4, + 0x8043, 0xF1F5, 0x8044, 0xC272, 0x8045, 0xC273, 0x8046, 0xF1F6, 0x8047, 0xC274, 0x8048, 0xC275, 0x8049, 0xC276, 0x804A, 0xC1C4, + 0x804B, 0xC1FB, 0x804C, 0xD6B0, 0x804D, 0xF1F7, 0x804E, 0xC277, 0x804F, 0xC278, 0x8050, 0xC279, 0x8051, 0xC27A, 0x8052, 0xF1F8, + 0x8053, 0xC27B, 0x8054, 0xC1AA, 0x8055, 0xC27C, 0x8056, 0xC27D, 0x8057, 0xC27E, 0x8058, 0xC6B8, 0x8059, 0xC280, 0x805A, 0xBEDB, + 0x805B, 0xC281, 0x805C, 0xC282, 0x805D, 0xC283, 0x805E, 0xC284, 0x805F, 0xC285, 0x8060, 0xC286, 0x8061, 0xC287, 0x8062, 0xC288, + 0x8063, 0xC289, 0x8064, 0xC28A, 0x8065, 0xC28B, 0x8066, 0xC28C, 0x8067, 0xC28D, 0x8068, 0xC28E, 0x8069, 0xF1F9, 0x806A, 0xB4CF, + 0x806B, 0xC28F, 0x806C, 0xC290, 0x806D, 0xC291, 0x806E, 0xC292, 0x806F, 0xC293, 0x8070, 0xC294, 0x8071, 0xF1FA, 0x8072, 0xC295, + 0x8073, 0xC296, 0x8074, 0xC297, 0x8075, 0xC298, 0x8076, 0xC299, 0x8077, 0xC29A, 0x8078, 0xC29B, 0x8079, 0xC29C, 0x807A, 0xC29D, + 0x807B, 0xC29E, 0x807C, 0xC29F, 0x807D, 0xC2A0, 0x807E, 0xC340, 0x807F, 0xEDB2, 0x8080, 0xEDB1, 0x8081, 0xC341, 0x8082, 0xC342, + 0x8083, 0xCBE0, 0x8084, 0xD2DE, 0x8085, 0xC343, 0x8086, 0xCBC1, 0x8087, 0xD5D8, 0x8088, 0xC344, 0x8089, 0xC8E2, 0x808A, 0xC345, + 0x808B, 0xC0DF, 0x808C, 0xBCA1, 0x808D, 0xC346, 0x808E, 0xC347, 0x808F, 0xC348, 0x8090, 0xC349, 0x8091, 0xC34A, 0x8092, 0xC34B, + 0x8093, 0xEBC1, 0x8094, 0xC34C, 0x8095, 0xC34D, 0x8096, 0xD0A4, 0x8097, 0xC34E, 0x8098, 0xD6E2, 0x8099, 0xC34F, 0x809A, 0xB6C7, + 0x809B, 0xB8D8, 0x809C, 0xEBC0, 0x809D, 0xB8CE, 0x809E, 0xC350, 0x809F, 0xEBBF, 0x80A0, 0xB3A6, 0x80A1, 0xB9C9, 0x80A2, 0xD6AB, + 0x80A3, 0xC351, 0x80A4, 0xB7F4, 0x80A5, 0xB7CA, 0x80A6, 0xC352, 0x80A7, 0xC353, 0x80A8, 0xC354, 0x80A9, 0xBCE7, 0x80AA, 0xB7BE, + 0x80AB, 0xEBC6, 0x80AC, 0xC355, 0x80AD, 0xEBC7, 0x80AE, 0xB0B9, 0x80AF, 0xBFCF, 0x80B0, 0xC356, 0x80B1, 0xEBC5, 0x80B2, 0xD3FD, + 0x80B3, 0xC357, 0x80B4, 0xEBC8, 0x80B5, 0xC358, 0x80B6, 0xC359, 0x80B7, 0xEBC9, 0x80B8, 0xC35A, 0x80B9, 0xC35B, 0x80BA, 0xB7CE, + 0x80BB, 0xC35C, 0x80BC, 0xEBC2, 0x80BD, 0xEBC4, 0x80BE, 0xC9F6, 0x80BF, 0xD6D7, 0x80C0, 0xD5CD, 0x80C1, 0xD0B2, 0x80C2, 0xEBCF, + 0x80C3, 0xCEB8, 0x80C4, 0xEBD0, 0x80C5, 0xC35D, 0x80C6, 0xB5A8, 0x80C7, 0xC35E, 0x80C8, 0xC35F, 0x80C9, 0xC360, 0x80CA, 0xC361, + 0x80CB, 0xC362, 0x80CC, 0xB1B3, 0x80CD, 0xEBD2, 0x80CE, 0xCCA5, 0x80CF, 0xC363, 0x80D0, 0xC364, 0x80D1, 0xC365, 0x80D2, 0xC366, + 0x80D3, 0xC367, 0x80D4, 0xC368, 0x80D5, 0xC369, 0x80D6, 0xC5D6, 0x80D7, 0xEBD3, 0x80D8, 0xC36A, 0x80D9, 0xEBD1, 0x80DA, 0xC5DF, + 0x80DB, 0xEBCE, 0x80DC, 0xCAA4, 0x80DD, 0xEBD5, 0x80DE, 0xB0FB, 0x80DF, 0xC36B, 0x80E0, 0xC36C, 0x80E1, 0xBAFA, 0x80E2, 0xC36D, + 0x80E3, 0xC36E, 0x80E4, 0xD8B7, 0x80E5, 0xF1E3, 0x80E6, 0xC36F, 0x80E7, 0xEBCA, 0x80E8, 0xEBCB, 0x80E9, 0xEBCC, 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, 0x80EC, 0xE6C0, 0x80ED, 0xEBD9, 0x80EE, 0xC370, 0x80EF, 0xBFE8, 0x80F0, 0xD2C8, 0x80F1, 0xEBD7, 0x80F2, 0xEBDC, + 0x80F3, 0xB8EC, 0x80F4, 0xEBD8, 0x80F5, 0xC371, 0x80F6, 0xBDBA, 0x80F7, 0xC372, 0x80F8, 0xD0D8, 0x80F9, 0xC373, 0x80FA, 0xB0B7, + 0x80FB, 0xC374, 0x80FC, 0xEBDD, 0x80FD, 0xC4DC, 0x80FE, 0xC375, 0x80FF, 0xC376, 0x8100, 0xC377, 0x8101, 0xC378, 0x8102, 0xD6AC, + 0x8103, 0xC379, 0x8104, 0xC37A, 0x8105, 0xC37B, 0x8106, 0xB4E0, 0x8107, 0xC37C, 0x8108, 0xC37D, 0x8109, 0xC2F6, 0x810A, 0xBCB9, + 0x810B, 0xC37E, 0x810C, 0xC380, 0x810D, 0xEBDA, 0x810E, 0xEBDB, 0x810F, 0xD4E0, 0x8110, 0xC6EA, 0x8111, 0xC4D4, 0x8112, 0xEBDF, + 0x8113, 0xC5A7, 0x8114, 0xD9F5, 0x8115, 0xC381, 0x8116, 0xB2B1, 0x8117, 0xC382, 0x8118, 0xEBE4, 0x8119, 0xC383, 0x811A, 0xBDC5, + 0x811B, 0xC384, 0x811C, 0xC385, 0x811D, 0xC386, 0x811E, 0xEBE2, 0x811F, 0xC387, 0x8120, 0xC388, 0x8121, 0xC389, 0x8122, 0xC38A, + 0x8123, 0xC38B, 0x8124, 0xC38C, 0x8125, 0xC38D, 0x8126, 0xC38E, 0x8127, 0xC38F, 0x8128, 0xC390, 0x8129, 0xC391, 0x812A, 0xC392, + 0x812B, 0xC393, 0x812C, 0xEBE3, 0x812D, 0xC394, 0x812E, 0xC395, 0x812F, 0xB8AC, 0x8130, 0xC396, 0x8131, 0xCDD1, 0x8132, 0xEBE5, + 0x8133, 0xC397, 0x8134, 0xC398, 0x8135, 0xC399, 0x8136, 0xEBE1, 0x8137, 0xC39A, 0x8138, 0xC1B3, 0x8139, 0xC39B, 0x813A, 0xC39C, + 0x813B, 0xC39D, 0x813C, 0xC39E, 0x813D, 0xC39F, 0x813E, 0xC6A2, 0x813F, 0xC3A0, 0x8140, 0xC440, 0x8141, 0xC441, 0x8142, 0xC442, + 0x8143, 0xC443, 0x8144, 0xC444, 0x8145, 0xC445, 0x8146, 0xCCF3, 0x8147, 0xC446, 0x8148, 0xEBE6, 0x8149, 0xC447, 0x814A, 0xC0B0, + 0x814B, 0xD2B8, 0x814C, 0xEBE7, 0x814D, 0xC448, 0x814E, 0xC449, 0x814F, 0xC44A, 0x8150, 0xB8AF, 0x8151, 0xB8AD, 0x8152, 0xC44B, + 0x8153, 0xEBE8, 0x8154, 0xC7BB, 0x8155, 0xCDF3, 0x8156, 0xC44C, 0x8157, 0xC44D, 0x8158, 0xC44E, 0x8159, 0xEBEA, 0x815A, 0xEBEB, + 0x815B, 0xC44F, 0x815C, 0xC450, 0x815D, 0xC451, 0x815E, 0xC452, 0x815F, 0xC453, 0x8160, 0xEBED, 0x8161, 0xC454, 0x8162, 0xC455, + 0x8163, 0xC456, 0x8164, 0xC457, 0x8165, 0xD0C8, 0x8166, 0xC458, 0x8167, 0xEBF2, 0x8168, 0xC459, 0x8169, 0xEBEE, 0x816A, 0xC45A, + 0x816B, 0xC45B, 0x816C, 0xC45C, 0x816D, 0xEBF1, 0x816E, 0xC8F9, 0x816F, 0xC45D, 0x8170, 0xD1FC, 0x8171, 0xEBEC, 0x8172, 0xC45E, + 0x8173, 0xC45F, 0x8174, 0xEBE9, 0x8175, 0xC460, 0x8176, 0xC461, 0x8177, 0xC462, 0x8178, 0xC463, 0x8179, 0xB8B9, 0x817A, 0xCFD9, + 0x817B, 0xC4E5, 0x817C, 0xEBEF, 0x817D, 0xEBF0, 0x817E, 0xCCDA, 0x817F, 0xCDC8, 0x8180, 0xB0F2, 0x8181, 0xC464, 0x8182, 0xEBF6, + 0x8183, 0xC465, 0x8184, 0xC466, 0x8185, 0xC467, 0x8186, 0xC468, 0x8187, 0xC469, 0x8188, 0xEBF5, 0x8189, 0xC46A, 0x818A, 0xB2B2, + 0x818B, 0xC46B, 0x818C, 0xC46C, 0x818D, 0xC46D, 0x818E, 0xC46E, 0x818F, 0xB8E0, 0x8190, 0xC46F, 0x8191, 0xEBF7, 0x8192, 0xC470, + 0x8193, 0xC471, 0x8194, 0xC472, 0x8195, 0xC473, 0x8196, 0xC474, 0x8197, 0xC475, 0x8198, 0xB1EC, 0x8199, 0xC476, 0x819A, 0xC477, + 0x819B, 0xCCC5, 0x819C, 0xC4A4, 0x819D, 0xCFA5, 0x819E, 0xC478, 0x819F, 0xC479, 0x81A0, 0xC47A, 0x81A1, 0xC47B, 0x81A2, 0xC47C, + 0x81A3, 0xEBF9, 0x81A4, 0xC47D, 0x81A5, 0xC47E, 0x81A6, 0xECA2, 0x81A7, 0xC480, 0x81A8, 0xC5F2, 0x81A9, 0xC481, 0x81AA, 0xEBFA, + 0x81AB, 0xC482, 0x81AC, 0xC483, 0x81AD, 0xC484, 0x81AE, 0xC485, 0x81AF, 0xC486, 0x81B0, 0xC487, 0x81B1, 0xC488, 0x81B2, 0xC489, + 0x81B3, 0xC9C5, 0x81B4, 0xC48A, 0x81B5, 0xC48B, 0x81B6, 0xC48C, 0x81B7, 0xC48D, 0x81B8, 0xC48E, 0x81B9, 0xC48F, 0x81BA, 0xE2DF, + 0x81BB, 0xEBFE, 0x81BC, 0xC490, 0x81BD, 0xC491, 0x81BE, 0xC492, 0x81BF, 0xC493, 0x81C0, 0xCDCE, 0x81C1, 0xECA1, 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, 0x81C4, 0xC494, 0x81C5, 0xC495, 0x81C6, 0xD2DC, 0x81C7, 0xC496, 0x81C8, 0xC497, 0x81C9, 0xC498, 0x81CA, 0xEBFD, + 0x81CB, 0xC499, 0x81CC, 0xEBFB, 0x81CD, 0xC49A, 0x81CE, 0xC49B, 0x81CF, 0xC49C, 0x81D0, 0xC49D, 0x81D1, 0xC49E, 0x81D2, 0xC49F, + 0x81D3, 0xC4A0, 0x81D4, 0xC540, 0x81D5, 0xC541, 0x81D6, 0xC542, 0x81D7, 0xC543, 0x81D8, 0xC544, 0x81D9, 0xC545, 0x81DA, 0xC546, + 0x81DB, 0xC547, 0x81DC, 0xC548, 0x81DD, 0xC549, 0x81DE, 0xC54A, 0x81DF, 0xC54B, 0x81E0, 0xC54C, 0x81E1, 0xC54D, 0x81E2, 0xC54E, + 0x81E3, 0xB3BC, 0x81E4, 0xC54F, 0x81E5, 0xC550, 0x81E6, 0xC551, 0x81E7, 0xEAB0, 0x81E8, 0xC552, 0x81E9, 0xC553, 0x81EA, 0xD7D4, + 0x81EB, 0xC554, 0x81EC, 0xF4AB, 0x81ED, 0xB3F4, 0x81EE, 0xC555, 0x81EF, 0xC556, 0x81F0, 0xC557, 0x81F1, 0xC558, 0x81F2, 0xC559, + 0x81F3, 0xD6C1, 0x81F4, 0xD6C2, 0x81F5, 0xC55A, 0x81F6, 0xC55B, 0x81F7, 0xC55C, 0x81F8, 0xC55D, 0x81F9, 0xC55E, 0x81FA, 0xC55F, + 0x81FB, 0xD5E9, 0x81FC, 0xBECA, 0x81FD, 0xC560, 0x81FE, 0xF4A7, 0x81FF, 0xC561, 0x8200, 0xD2A8, 0x8201, 0xF4A8, 0x8202, 0xF4A9, + 0x8203, 0xC562, 0x8204, 0xF4AA, 0x8205, 0xBECB, 0x8206, 0xD3DF, 0x8207, 0xC563, 0x8208, 0xC564, 0x8209, 0xC565, 0x820A, 0xC566, + 0x820B, 0xC567, 0x820C, 0xC9E0, 0x820D, 0xC9E1, 0x820E, 0xC568, 0x820F, 0xC569, 0x8210, 0xF3C2, 0x8211, 0xC56A, 0x8212, 0xCAE6, + 0x8213, 0xC56B, 0x8214, 0xCCF2, 0x8215, 0xC56C, 0x8216, 0xC56D, 0x8217, 0xC56E, 0x8218, 0xC56F, 0x8219, 0xC570, 0x821A, 0xC571, + 0x821B, 0xE2B6, 0x821C, 0xCBB4, 0x821D, 0xC572, 0x821E, 0xCEE8, 0x821F, 0xD6DB, 0x8220, 0xC573, 0x8221, 0xF4AD, 0x8222, 0xF4AE, + 0x8223, 0xF4AF, 0x8224, 0xC574, 0x8225, 0xC575, 0x8226, 0xC576, 0x8227, 0xC577, 0x8228, 0xF4B2, 0x8229, 0xC578, 0x822A, 0xBABD, + 0x822B, 0xF4B3, 0x822C, 0xB0E3, 0x822D, 0xF4B0, 0x822E, 0xC579, 0x822F, 0xF4B1, 0x8230, 0xBDA2, 0x8231, 0xB2D5, 0x8232, 0xC57A, + 0x8233, 0xF4B6, 0x8234, 0xF4B7, 0x8235, 0xB6E6, 0x8236, 0xB2B0, 0x8237, 0xCFCF, 0x8238, 0xF4B4, 0x8239, 0xB4AC, 0x823A, 0xC57B, + 0x823B, 0xF4B5, 0x823C, 0xC57C, 0x823D, 0xC57D, 0x823E, 0xF4B8, 0x823F, 0xC57E, 0x8240, 0xC580, 0x8241, 0xC581, 0x8242, 0xC582, + 0x8243, 0xC583, 0x8244, 0xF4B9, 0x8245, 0xC584, 0x8246, 0xC585, 0x8247, 0xCDA7, 0x8248, 0xC586, 0x8249, 0xF4BA, 0x824A, 0xC587, + 0x824B, 0xF4BB, 0x824C, 0xC588, 0x824D, 0xC589, 0x824E, 0xC58A, 0x824F, 0xF4BC, 0x8250, 0xC58B, 0x8251, 0xC58C, 0x8252, 0xC58D, + 0x8253, 0xC58E, 0x8254, 0xC58F, 0x8255, 0xC590, 0x8256, 0xC591, 0x8257, 0xC592, 0x8258, 0xCBD2, 0x8259, 0xC593, 0x825A, 0xF4BD, + 0x825B, 0xC594, 0x825C, 0xC595, 0x825D, 0xC596, 0x825E, 0xC597, 0x825F, 0xF4BE, 0x8260, 0xC598, 0x8261, 0xC599, 0x8262, 0xC59A, + 0x8263, 0xC59B, 0x8264, 0xC59C, 0x8265, 0xC59D, 0x8266, 0xC59E, 0x8267, 0xC59F, 0x8268, 0xF4BF, 0x8269, 0xC5A0, 0x826A, 0xC640, + 0x826B, 0xC641, 0x826C, 0xC642, 0x826D, 0xC643, 0x826E, 0xF4DE, 0x826F, 0xC1BC, 0x8270, 0xBCE8, 0x8271, 0xC644, 0x8272, 0xC9AB, + 0x8273, 0xD1DE, 0x8274, 0xE5F5, 0x8275, 0xC645, 0x8276, 0xC646, 0x8277, 0xC647, 0x8278, 0xC648, 0x8279, 0xDCB3, 0x827A, 0xD2D5, + 0x827B, 0xC649, 0x827C, 0xC64A, 0x827D, 0xDCB4, 0x827E, 0xB0AC, 0x827F, 0xDCB5, 0x8280, 0xC64B, 0x8281, 0xC64C, 0x8282, 0xBDDA, + 0x8283, 0xC64D, 0x8284, 0xDCB9, 0x8285, 0xC64E, 0x8286, 0xC64F, 0x8287, 0xC650, 0x8288, 0xD8C2, 0x8289, 0xC651, 0x828A, 0xDCB7, + 0x828B, 0xD3F3, 0x828C, 0xC652, 0x828D, 0xC9D6, 0x828E, 0xDCBA, 0x828F, 0xDCB6, 0x8290, 0xC653, 0x8291, 0xDCBB, 0x8292, 0xC3A2, + 0x8293, 0xC654, 0x8294, 0xC655, 0x8295, 0xC656, 0x8296, 0xC657, 0x8297, 0xDCBC, 0x8298, 0xDCC5, 0x8299, 0xDCBD, 0x829A, 0xC658, + 0x829B, 0xC659, 0x829C, 0xCEDF, 0x829D, 0xD6A5, 0x829E, 0xC65A, 0x829F, 0xDCCF, 0x82A0, 0xC65B, 0x82A1, 0xDCCD, 0x82A2, 0xC65C, + 0x82A3, 0xC65D, 0x82A4, 0xDCD2, 0x82A5, 0xBDE6, 0x82A6, 0xC2AB, 0x82A7, 0xC65E, 0x82A8, 0xDCB8, 0x82A9, 0xDCCB, 0x82AA, 0xDCCE, + 0x82AB, 0xDCBE, 0x82AC, 0xB7D2, 0x82AD, 0xB0C5, 0x82AE, 0xDCC7, 0x82AF, 0xD0BE, 0x82B0, 0xDCC1, 0x82B1, 0xBBA8, 0x82B2, 0xC65F, + 0x82B3, 0xB7BC, 0x82B4, 0xDCCC, 0x82B5, 0xC660, 0x82B6, 0xC661, 0x82B7, 0xDCC6, 0x82B8, 0xDCBF, 0x82B9, 0xC7DB, 0x82BA, 0xC662, + 0x82BB, 0xC663, 0x82BC, 0xC664, 0x82BD, 0xD1BF, 0x82BE, 0xDCC0, 0x82BF, 0xC665, 0x82C0, 0xC666, 0x82C1, 0xDCCA, 0x82C2, 0xC667, + 0x82C3, 0xC668, 0x82C4, 0xDCD0, 0x82C5, 0xC669, 0x82C6, 0xC66A, 0x82C7, 0xCEAD, 0x82C8, 0xDCC2, 0x82C9, 0xC66B, 0x82CA, 0xDCC3, + 0x82CB, 0xDCC8, 0x82CC, 0xDCC9, 0x82CD, 0xB2D4, 0x82CE, 0xDCD1, 0x82CF, 0xCBD5, 0x82D0, 0xC66C, 0x82D1, 0xD4B7, 0x82D2, 0xDCDB, + 0x82D3, 0xDCDF, 0x82D4, 0xCCA6, 0x82D5, 0xDCE6, 0x82D6, 0xC66D, 0x82D7, 0xC3E7, 0x82D8, 0xDCDC, 0x82D9, 0xC66E, 0x82DA, 0xC66F, + 0x82DB, 0xBFC1, 0x82DC, 0xDCD9, 0x82DD, 0xC670, 0x82DE, 0xB0FA, 0x82DF, 0xB9B6, 0x82E0, 0xDCE5, 0x82E1, 0xDCD3, 0x82E2, 0xC671, + 0x82E3, 0xDCC4, 0x82E4, 0xDCD6, 0x82E5, 0xC8F4, 0x82E6, 0xBFE0, 0x82E7, 0xC672, 0x82E8, 0xC673, 0x82E9, 0xC674, 0x82EA, 0xC675, + 0x82EB, 0xC9BB, 0x82EC, 0xC676, 0x82ED, 0xC677, 0x82EE, 0xC678, 0x82EF, 0xB1BD, 0x82F0, 0xC679, 0x82F1, 0xD3A2, 0x82F2, 0xC67A, + 0x82F3, 0xC67B, 0x82F4, 0xDCDA, 0x82F5, 0xC67C, 0x82F6, 0xC67D, 0x82F7, 0xDCD5, 0x82F8, 0xC67E, 0x82F9, 0xC6BB, 0x82FA, 0xC680, + 0x82FB, 0xDCDE, 0x82FC, 0xC681, 0x82FD, 0xC682, 0x82FE, 0xC683, 0x82FF, 0xC684, 0x8300, 0xC685, 0x8301, 0xD7C2, 0x8302, 0xC3AF, + 0x8303, 0xB7B6, 0x8304, 0xC7D1, 0x8305, 0xC3A9, 0x8306, 0xDCE2, 0x8307, 0xDCD8, 0x8308, 0xDCEB, 0x8309, 0xDCD4, 0x830A, 0xC686, + 0x830B, 0xC687, 0x830C, 0xDCDD, 0x830D, 0xC688, 0x830E, 0xBEA5, 0x830F, 0xDCD7, 0x8310, 0xC689, 0x8311, 0xDCE0, 0x8312, 0xC68A, + 0x8313, 0xC68B, 0x8314, 0xDCE3, 0x8315, 0xDCE4, 0x8316, 0xC68C, 0x8317, 0xDCF8, 0x8318, 0xC68D, 0x8319, 0xC68E, 0x831A, 0xDCE1, + 0x831B, 0xDDA2, 0x831C, 0xDCE7, 0x831D, 0xC68F, 0x831E, 0xC690, 0x831F, 0xC691, 0x8320, 0xC692, 0x8321, 0xC693, 0x8322, 0xC694, + 0x8323, 0xC695, 0x8324, 0xC696, 0x8325, 0xC697, 0x8326, 0xC698, 0x8327, 0xBCEB, 0x8328, 0xB4C4, 0x8329, 0xC699, 0x832A, 0xC69A, + 0x832B, 0xC3A3, 0x832C, 0xB2E7, 0x832D, 0xDCFA, 0x832E, 0xC69B, 0x832F, 0xDCF2, 0x8330, 0xC69C, 0x8331, 0xDCEF, 0x8332, 0xC69D, + 0x8333, 0xDCFC, 0x8334, 0xDCEE, 0x8335, 0xD2F0, 0x8336, 0xB2E8, 0x8337, 0xC69E, 0x8338, 0xC8D7, 0x8339, 0xC8E3, 0x833A, 0xDCFB, + 0x833B, 0xC69F, 0x833C, 0xDCED, 0x833D, 0xC6A0, 0x833E, 0xC740, 0x833F, 0xC741, 0x8340, 0xDCF7, 0x8341, 0xC742, 0x8342, 0xC743, + 0x8343, 0xDCF5, 0x8344, 0xC744, 0x8345, 0xC745, 0x8346, 0xBEA3, 0x8347, 0xDCF4, 0x8348, 0xC746, 0x8349, 0xB2DD, 0x834A, 0xC747, + 0x834B, 0xC748, 0x834C, 0xC749, 0x834D, 0xC74A, 0x834E, 0xC74B, 0x834F, 0xDCF3, 0x8350, 0xBCF6, 0x8351, 0xDCE8, 0x8352, 0xBBC4, + 0x8353, 0xC74C, 0x8354, 0xC0F3, 0x8355, 0xC74D, 0x8356, 0xC74E, 0x8357, 0xC74F, 0x8358, 0xC750, 0x8359, 0xC751, 0x835A, 0xBCD4, + 0x835B, 0xDCE9, 0x835C, 0xDCEA, 0x835D, 0xC752, 0x835E, 0xDCF1, 0x835F, 0xDCF6, 0x8360, 0xDCF9, 0x8361, 0xB5B4, 0x8362, 0xC753, + 0x8363, 0xC8D9, 0x8364, 0xBBE7, 0x8365, 0xDCFE, 0x8366, 0xDCFD, 0x8367, 0xD3AB, 0x8368, 0xDDA1, 0x8369, 0xDDA3, 0x836A, 0xDDA5, + 0x836B, 0xD2F1, 0x836C, 0xDDA4, 0x836D, 0xDDA6, 0x836E, 0xDDA7, 0x836F, 0xD2A9, 0x8370, 0xC754, 0x8371, 0xC755, 0x8372, 0xC756, + 0x8373, 0xC757, 0x8374, 0xC758, 0x8375, 0xC759, 0x8376, 0xC75A, 0x8377, 0xBAC9, 0x8378, 0xDDA9, 0x8379, 0xC75B, 0x837A, 0xC75C, + 0x837B, 0xDDB6, 0x837C, 0xDDB1, 0x837D, 0xDDB4, 0x837E, 0xC75D, 0x837F, 0xC75E, 0x8380, 0xC75F, 0x8381, 0xC760, 0x8382, 0xC761, + 0x8383, 0xC762, 0x8384, 0xC763, 0x8385, 0xDDB0, 0x8386, 0xC6CE, 0x8387, 0xC764, 0x8388, 0xC765, 0x8389, 0xC0F2, 0x838A, 0xC766, + 0x838B, 0xC767, 0x838C, 0xC768, 0x838D, 0xC769, 0x838E, 0xC9AF, 0x838F, 0xC76A, 0x8390, 0xC76B, 0x8391, 0xC76C, 0x8392, 0xDCEC, + 0x8393, 0xDDAE, 0x8394, 0xC76D, 0x8395, 0xC76E, 0x8396, 0xC76F, 0x8397, 0xC770, 0x8398, 0xDDB7, 0x8399, 0xC771, 0x839A, 0xC772, + 0x839B, 0xDCF0, 0x839C, 0xDDAF, 0x839D, 0xC773, 0x839E, 0xDDB8, 0x839F, 0xC774, 0x83A0, 0xDDAC, 0x83A1, 0xC775, 0x83A2, 0xC776, + 0x83A3, 0xC777, 0x83A4, 0xC778, 0x83A5, 0xC779, 0x83A6, 0xC77A, 0x83A7, 0xC77B, 0x83A8, 0xDDB9, 0x83A9, 0xDDB3, 0x83AA, 0xDDAD, + 0x83AB, 0xC4AA, 0x83AC, 0xC77C, 0x83AD, 0xC77D, 0x83AE, 0xC77E, 0x83AF, 0xC780, 0x83B0, 0xDDA8, 0x83B1, 0xC0B3, 0x83B2, 0xC1AB, + 0x83B3, 0xDDAA, 0x83B4, 0xDDAB, 0x83B5, 0xC781, 0x83B6, 0xDDB2, 0x83B7, 0xBBF1, 0x83B8, 0xDDB5, 0x83B9, 0xD3A8, 0x83BA, 0xDDBA, + 0x83BB, 0xC782, 0x83BC, 0xDDBB, 0x83BD, 0xC3A7, 0x83BE, 0xC783, 0x83BF, 0xC784, 0x83C0, 0xDDD2, 0x83C1, 0xDDBC, 0x83C2, 0xC785, + 0x83C3, 0xC786, 0x83C4, 0xC787, 0x83C5, 0xDDD1, 0x83C6, 0xC788, 0x83C7, 0xB9BD, 0x83C8, 0xC789, 0x83C9, 0xC78A, 0x83CA, 0xBED5, + 0x83CB, 0xC78B, 0x83CC, 0xBEFA, 0x83CD, 0xC78C, 0x83CE, 0xC78D, 0x83CF, 0xBACA, 0x83D0, 0xC78E, 0x83D1, 0xC78F, 0x83D2, 0xC790, + 0x83D3, 0xC791, 0x83D4, 0xDDCA, 0x83D5, 0xC792, 0x83D6, 0xDDC5, 0x83D7, 0xC793, 0x83D8, 0xDDBF, 0x83D9, 0xC794, 0x83DA, 0xC795, + 0x83DB, 0xC796, 0x83DC, 0xB2CB, 0x83DD, 0xDDC3, 0x83DE, 0xC797, 0x83DF, 0xDDCB, 0x83E0, 0xB2A4, 0x83E1, 0xDDD5, 0x83E2, 0xC798, + 0x83E3, 0xC799, 0x83E4, 0xC79A, 0x83E5, 0xDDBE, 0x83E6, 0xC79B, 0x83E7, 0xC79C, 0x83E8, 0xC79D, 0x83E9, 0xC6D0, 0x83EA, 0xDDD0, + 0x83EB, 0xC79E, 0x83EC, 0xC79F, 0x83ED, 0xC7A0, 0x83EE, 0xC840, 0x83EF, 0xC841, 0x83F0, 0xDDD4, 0x83F1, 0xC1E2, 0x83F2, 0xB7C6, + 0x83F3, 0xC842, 0x83F4, 0xC843, 0x83F5, 0xC844, 0x83F6, 0xC845, 0x83F7, 0xC846, 0x83F8, 0xDDCE, 0x83F9, 0xDDCF, 0x83FA, 0xC847, + 0x83FB, 0xC848, 0x83FC, 0xC849, 0x83FD, 0xDDC4, 0x83FE, 0xC84A, 0x83FF, 0xC84B, 0x8400, 0xC84C, 0x8401, 0xDDBD, 0x8402, 0xC84D, + 0x8403, 0xDDCD, 0x8404, 0xCCD1, 0x8405, 0xC84E, 0x8406, 0xDDC9, 0x8407, 0xC84F, 0x8408, 0xC850, 0x8409, 0xC851, 0x840A, 0xC852, + 0x840B, 0xDDC2, 0x840C, 0xC3C8, 0x840D, 0xC6BC, 0x840E, 0xCEAE, 0x840F, 0xDDCC, 0x8410, 0xC853, 0x8411, 0xDDC8, 0x8412, 0xC854, + 0x8413, 0xC855, 0x8414, 0xC856, 0x8415, 0xC857, 0x8416, 0xC858, 0x8417, 0xC859, 0x8418, 0xDDC1, 0x8419, 0xC85A, 0x841A, 0xC85B, + 0x841B, 0xC85C, 0x841C, 0xDDC6, 0x841D, 0xC2DC, 0x841E, 0xC85D, 0x841F, 0xC85E, 0x8420, 0xC85F, 0x8421, 0xC860, 0x8422, 0xC861, + 0x8423, 0xC862, 0x8424, 0xD3A9, 0x8425, 0xD3AA, 0x8426, 0xDDD3, 0x8427, 0xCFF4, 0x8428, 0xC8F8, 0x8429, 0xC863, 0x842A, 0xC864, + 0x842B, 0xC865, 0x842C, 0xC866, 0x842D, 0xC867, 0x842E, 0xC868, 0x842F, 0xC869, 0x8430, 0xC86A, 0x8431, 0xDDE6, 0x8432, 0xC86B, + 0x8433, 0xC86C, 0x8434, 0xC86D, 0x8435, 0xC86E, 0x8436, 0xC86F, 0x8437, 0xC870, 0x8438, 0xDDC7, 0x8439, 0xC871, 0x843A, 0xC872, + 0x843B, 0xC873, 0x843C, 0xDDE0, 0x843D, 0xC2E4, 0x843E, 0xC874, 0x843F, 0xC875, 0x8440, 0xC876, 0x8441, 0xC877, 0x8442, 0xC878, + 0x8443, 0xC879, 0x8444, 0xC87A, 0x8445, 0xC87B, 0x8446, 0xDDE1, 0x8447, 0xC87C, 0x8448, 0xC87D, 0x8449, 0xC87E, 0x844A, 0xC880, + 0x844B, 0xC881, 0x844C, 0xC882, 0x844D, 0xC883, 0x844E, 0xC884, 0x844F, 0xC885, 0x8450, 0xC886, 0x8451, 0xDDD7, 0x8452, 0xC887, + 0x8453, 0xC888, 0x8454, 0xC889, 0x8455, 0xC88A, 0x8456, 0xC88B, 0x8457, 0xD6F8, 0x8458, 0xC88C, 0x8459, 0xDDD9, 0x845A, 0xDDD8, + 0x845B, 0xB8F0, 0x845C, 0xDDD6, 0x845D, 0xC88D, 0x845E, 0xC88E, 0x845F, 0xC88F, 0x8460, 0xC890, 0x8461, 0xC6CF, 0x8462, 0xC891, + 0x8463, 0xB6AD, 0x8464, 0xC892, 0x8465, 0xC893, 0x8466, 0xC894, 0x8467, 0xC895, 0x8468, 0xC896, 0x8469, 0xDDE2, 0x846A, 0xC897, + 0x846B, 0xBAF9, 0x846C, 0xD4E1, 0x846D, 0xDDE7, 0x846E, 0xC898, 0x846F, 0xC899, 0x8470, 0xC89A, 0x8471, 0xB4D0, 0x8472, 0xC89B, + 0x8473, 0xDDDA, 0x8474, 0xC89C, 0x8475, 0xBFFB, 0x8476, 0xDDE3, 0x8477, 0xC89D, 0x8478, 0xDDDF, 0x8479, 0xC89E, 0x847A, 0xDDDD, + 0x847B, 0xC89F, 0x847C, 0xC8A0, 0x847D, 0xC940, 0x847E, 0xC941, 0x847F, 0xC942, 0x8480, 0xC943, 0x8481, 0xC944, 0x8482, 0xB5D9, + 0x8483, 0xC945, 0x8484, 0xC946, 0x8485, 0xC947, 0x8486, 0xC948, 0x8487, 0xDDDB, 0x8488, 0xDDDC, 0x8489, 0xDDDE, 0x848A, 0xC949, + 0x848B, 0xBDAF, 0x848C, 0xDDE4, 0x848D, 0xC94A, 0x848E, 0xDDE5, 0x848F, 0xC94B, 0x8490, 0xC94C, 0x8491, 0xC94D, 0x8492, 0xC94E, + 0x8493, 0xC94F, 0x8494, 0xC950, 0x8495, 0xC951, 0x8496, 0xC952, 0x8497, 0xDDF5, 0x8498, 0xC953, 0x8499, 0xC3C9, 0x849A, 0xC954, + 0x849B, 0xC955, 0x849C, 0xCBE2, 0x849D, 0xC956, 0x849E, 0xC957, 0x849F, 0xC958, 0x84A0, 0xC959, 0x84A1, 0xDDF2, 0x84A2, 0xC95A, + 0x84A3, 0xC95B, 0x84A4, 0xC95C, 0x84A5, 0xC95D, 0x84A6, 0xC95E, 0x84A7, 0xC95F, 0x84A8, 0xC960, 0x84A9, 0xC961, 0x84AA, 0xC962, + 0x84AB, 0xC963, 0x84AC, 0xC964, 0x84AD, 0xC965, 0x84AE, 0xC966, 0x84AF, 0xD8E1, 0x84B0, 0xC967, 0x84B1, 0xC968, 0x84B2, 0xC6D1, + 0x84B3, 0xC969, 0x84B4, 0xDDF4, 0x84B5, 0xC96A, 0x84B6, 0xC96B, 0x84B7, 0xC96C, 0x84B8, 0xD5F4, 0x84B9, 0xDDF3, 0x84BA, 0xDDF0, + 0x84BB, 0xC96D, 0x84BC, 0xC96E, 0x84BD, 0xDDEC, 0x84BE, 0xC96F, 0x84BF, 0xDDEF, 0x84C0, 0xC970, 0x84C1, 0xDDE8, 0x84C2, 0xC971, + 0x84C3, 0xC972, 0x84C4, 0xD0EE, 0x84C5, 0xC973, 0x84C6, 0xC974, 0x84C7, 0xC975, 0x84C8, 0xC976, 0x84C9, 0xC8D8, 0x84CA, 0xDDEE, + 0x84CB, 0xC977, 0x84CC, 0xC978, 0x84CD, 0xDDE9, 0x84CE, 0xC979, 0x84CF, 0xC97A, 0x84D0, 0xDDEA, 0x84D1, 0xCBF2, 0x84D2, 0xC97B, + 0x84D3, 0xDDED, 0x84D4, 0xC97C, 0x84D5, 0xC97D, 0x84D6, 0xB1CD, 0x84D7, 0xC97E, 0x84D8, 0xC980, 0x84D9, 0xC981, 0x84DA, 0xC982, + 0x84DB, 0xC983, 0x84DC, 0xC984, 0x84DD, 0xC0B6, 0x84DE, 0xC985, 0x84DF, 0xBCBB, 0x84E0, 0xDDF1, 0x84E1, 0xC986, 0x84E2, 0xC987, + 0x84E3, 0xDDF7, 0x84E4, 0xC988, 0x84E5, 0xDDF6, 0x84E6, 0xDDEB, 0x84E7, 0xC989, 0x84E8, 0xC98A, 0x84E9, 0xC98B, 0x84EA, 0xC98C, + 0x84EB, 0xC98D, 0x84EC, 0xC5EE, 0x84ED, 0xC98E, 0x84EE, 0xC98F, 0x84EF, 0xC990, 0x84F0, 0xDDFB, 0x84F1, 0xC991, 0x84F2, 0xC992, + 0x84F3, 0xC993, 0x84F4, 0xC994, 0x84F5, 0xC995, 0x84F6, 0xC996, 0x84F7, 0xC997, 0x84F8, 0xC998, 0x84F9, 0xC999, 0x84FA, 0xC99A, + 0x84FB, 0xC99B, 0x84FC, 0xDEA4, 0x84FD, 0xC99C, 0x84FE, 0xC99D, 0x84FF, 0xDEA3, 0x8500, 0xC99E, 0x8501, 0xC99F, 0x8502, 0xC9A0, + 0x8503, 0xCA40, 0x8504, 0xCA41, 0x8505, 0xCA42, 0x8506, 0xCA43, 0x8507, 0xCA44, 0x8508, 0xCA45, 0x8509, 0xCA46, 0x850A, 0xCA47, + 0x850B, 0xCA48, 0x850C, 0xDDF8, 0x850D, 0xCA49, 0x850E, 0xCA4A, 0x850F, 0xCA4B, 0x8510, 0xCA4C, 0x8511, 0xC3EF, 0x8512, 0xCA4D, + 0x8513, 0xC2FB, 0x8514, 0xCA4E, 0x8515, 0xCA4F, 0x8516, 0xCA50, 0x8517, 0xD5E1, 0x8518, 0xCA51, 0x8519, 0xCA52, 0x851A, 0xCEB5, + 0x851B, 0xCA53, 0x851C, 0xCA54, 0x851D, 0xCA55, 0x851E, 0xCA56, 0x851F, 0xDDFD, 0x8520, 0xCA57, 0x8521, 0xB2CC, 0x8522, 0xCA58, + 0x8523, 0xCA59, 0x8524, 0xCA5A, 0x8525, 0xCA5B, 0x8526, 0xCA5C, 0x8527, 0xCA5D, 0x8528, 0xCA5E, 0x8529, 0xCA5F, 0x852A, 0xCA60, + 0x852B, 0xC4E8, 0x852C, 0xCADF, 0x852D, 0xCA61, 0x852E, 0xCA62, 0x852F, 0xCA63, 0x8530, 0xCA64, 0x8531, 0xCA65, 0x8532, 0xCA66, + 0x8533, 0xCA67, 0x8534, 0xCA68, 0x8535, 0xCA69, 0x8536, 0xCA6A, 0x8537, 0xC7BE, 0x8538, 0xDDFA, 0x8539, 0xDDFC, 0x853A, 0xDDFE, + 0x853B, 0xDEA2, 0x853C, 0xB0AA, 0x853D, 0xB1CE, 0x853E, 0xCA6B, 0x853F, 0xCA6C, 0x8540, 0xCA6D, 0x8541, 0xCA6E, 0x8542, 0xCA6F, + 0x8543, 0xDEAC, 0x8544, 0xCA70, 0x8545, 0xCA71, 0x8546, 0xCA72, 0x8547, 0xCA73, 0x8548, 0xDEA6, 0x8549, 0xBDB6, 0x854A, 0xC8EF, + 0x854B, 0xCA74, 0x854C, 0xCA75, 0x854D, 0xCA76, 0x854E, 0xCA77, 0x854F, 0xCA78, 0x8550, 0xCA79, 0x8551, 0xCA7A, 0x8552, 0xCA7B, + 0x8553, 0xCA7C, 0x8554, 0xCA7D, 0x8555, 0xCA7E, 0x8556, 0xDEA1, 0x8557, 0xCA80, 0x8558, 0xCA81, 0x8559, 0xDEA5, 0x855A, 0xCA82, + 0x855B, 0xCA83, 0x855C, 0xCA84, 0x855D, 0xCA85, 0x855E, 0xDEA9, 0x855F, 0xCA86, 0x8560, 0xCA87, 0x8561, 0xCA88, 0x8562, 0xCA89, + 0x8563, 0xCA8A, 0x8564, 0xDEA8, 0x8565, 0xCA8B, 0x8566, 0xCA8C, 0x8567, 0xCA8D, 0x8568, 0xDEA7, 0x8569, 0xCA8E, 0x856A, 0xCA8F, + 0x856B, 0xCA90, 0x856C, 0xCA91, 0x856D, 0xCA92, 0x856E, 0xCA93, 0x856F, 0xCA94, 0x8570, 0xCA95, 0x8571, 0xCA96, 0x8572, 0xDEAD, + 0x8573, 0xCA97, 0x8574, 0xD4CC, 0x8575, 0xCA98, 0x8576, 0xCA99, 0x8577, 0xCA9A, 0x8578, 0xCA9B, 0x8579, 0xDEB3, 0x857A, 0xDEAA, + 0x857B, 0xDEAE, 0x857C, 0xCA9C, 0x857D, 0xCA9D, 0x857E, 0xC0D9, 0x857F, 0xCA9E, 0x8580, 0xCA9F, 0x8581, 0xCAA0, 0x8582, 0xCB40, + 0x8583, 0xCB41, 0x8584, 0xB1A1, 0x8585, 0xDEB6, 0x8586, 0xCB42, 0x8587, 0xDEB1, 0x8588, 0xCB43, 0x8589, 0xCB44, 0x858A, 0xCB45, + 0x858B, 0xCB46, 0x858C, 0xCB47, 0x858D, 0xCB48, 0x858E, 0xCB49, 0x858F, 0xDEB2, 0x8590, 0xCB4A, 0x8591, 0xCB4B, 0x8592, 0xCB4C, + 0x8593, 0xCB4D, 0x8594, 0xCB4E, 0x8595, 0xCB4F, 0x8596, 0xCB50, 0x8597, 0xCB51, 0x8598, 0xCB52, 0x8599, 0xCB53, 0x859A, 0xCB54, + 0x859B, 0xD1A6, 0x859C, 0xDEB5, 0x859D, 0xCB55, 0x859E, 0xCB56, 0x859F, 0xCB57, 0x85A0, 0xCB58, 0x85A1, 0xCB59, 0x85A2, 0xCB5A, + 0x85A3, 0xCB5B, 0x85A4, 0xDEAF, 0x85A5, 0xCB5C, 0x85A6, 0xCB5D, 0x85A7, 0xCB5E, 0x85A8, 0xDEB0, 0x85A9, 0xCB5F, 0x85AA, 0xD0BD, + 0x85AB, 0xCB60, 0x85AC, 0xCB61, 0x85AD, 0xCB62, 0x85AE, 0xDEB4, 0x85AF, 0xCAED, 0x85B0, 0xDEB9, 0x85B1, 0xCB63, 0x85B2, 0xCB64, + 0x85B3, 0xCB65, 0x85B4, 0xCB66, 0x85B5, 0xCB67, 0x85B6, 0xCB68, 0x85B7, 0xDEB8, 0x85B8, 0xCB69, 0x85B9, 0xDEB7, 0x85BA, 0xCB6A, + 0x85BB, 0xCB6B, 0x85BC, 0xCB6C, 0x85BD, 0xCB6D, 0x85BE, 0xCB6E, 0x85BF, 0xCB6F, 0x85C0, 0xCB70, 0x85C1, 0xDEBB, 0x85C2, 0xCB71, + 0x85C3, 0xCB72, 0x85C4, 0xCB73, 0x85C5, 0xCB74, 0x85C6, 0xCB75, 0x85C7, 0xCB76, 0x85C8, 0xCB77, 0x85C9, 0xBDE5, 0x85CA, 0xCB78, + 0x85CB, 0xCB79, 0x85CC, 0xCB7A, 0x85CD, 0xCB7B, 0x85CE, 0xCB7C, 0x85CF, 0xB2D8, 0x85D0, 0xC3EA, 0x85D1, 0xCB7D, 0x85D2, 0xCB7E, + 0x85D3, 0xDEBA, 0x85D4, 0xCB80, 0x85D5, 0xC5BA, 0x85D6, 0xCB81, 0x85D7, 0xCB82, 0x85D8, 0xCB83, 0x85D9, 0xCB84, 0x85DA, 0xCB85, + 0x85DB, 0xCB86, 0x85DC, 0xDEBC, 0x85DD, 0xCB87, 0x85DE, 0xCB88, 0x85DF, 0xCB89, 0x85E0, 0xCB8A, 0x85E1, 0xCB8B, 0x85E2, 0xCB8C, + 0x85E3, 0xCB8D, 0x85E4, 0xCCD9, 0x85E5, 0xCB8E, 0x85E6, 0xCB8F, 0x85E7, 0xCB90, 0x85E8, 0xCB91, 0x85E9, 0xB7AA, 0x85EA, 0xCB92, + 0x85EB, 0xCB93, 0x85EC, 0xCB94, 0x85ED, 0xCB95, 0x85EE, 0xCB96, 0x85EF, 0xCB97, 0x85F0, 0xCB98, 0x85F1, 0xCB99, 0x85F2, 0xCB9A, + 0x85F3, 0xCB9B, 0x85F4, 0xCB9C, 0x85F5, 0xCB9D, 0x85F6, 0xCB9E, 0x85F7, 0xCB9F, 0x85F8, 0xCBA0, 0x85F9, 0xCC40, 0x85FA, 0xCC41, + 0x85FB, 0xD4E5, 0x85FC, 0xCC42, 0x85FD, 0xCC43, 0x85FE, 0xCC44, 0x85FF, 0xDEBD, 0x8600, 0xCC45, 0x8601, 0xCC46, 0x8602, 0xCC47, + 0x8603, 0xCC48, 0x8604, 0xCC49, 0x8605, 0xDEBF, 0x8606, 0xCC4A, 0x8607, 0xCC4B, 0x8608, 0xCC4C, 0x8609, 0xCC4D, 0x860A, 0xCC4E, + 0x860B, 0xCC4F, 0x860C, 0xCC50, 0x860D, 0xCC51, 0x860E, 0xCC52, 0x860F, 0xCC53, 0x8610, 0xCC54, 0x8611, 0xC4A2, 0x8612, 0xCC55, + 0x8613, 0xCC56, 0x8614, 0xCC57, 0x8615, 0xCC58, 0x8616, 0xDEC1, 0x8617, 0xCC59, 0x8618, 0xCC5A, 0x8619, 0xCC5B, 0x861A, 0xCC5C, + 0x861B, 0xCC5D, 0x861C, 0xCC5E, 0x861D, 0xCC5F, 0x861E, 0xCC60, 0x861F, 0xCC61, 0x8620, 0xCC62, 0x8621, 0xCC63, 0x8622, 0xCC64, + 0x8623, 0xCC65, 0x8624, 0xCC66, 0x8625, 0xCC67, 0x8626, 0xCC68, 0x8627, 0xDEBE, 0x8628, 0xCC69, 0x8629, 0xDEC0, 0x862A, 0xCC6A, + 0x862B, 0xCC6B, 0x862C, 0xCC6C, 0x862D, 0xCC6D, 0x862E, 0xCC6E, 0x862F, 0xCC6F, 0x8630, 0xCC70, 0x8631, 0xCC71, 0x8632, 0xCC72, + 0x8633, 0xCC73, 0x8634, 0xCC74, 0x8635, 0xCC75, 0x8636, 0xCC76, 0x8637, 0xCC77, 0x8638, 0xD5BA, 0x8639, 0xCC78, 0x863A, 0xCC79, + 0x863B, 0xCC7A, 0x863C, 0xDEC2, 0x863D, 0xCC7B, 0x863E, 0xCC7C, 0x863F, 0xCC7D, 0x8640, 0xCC7E, 0x8641, 0xCC80, 0x8642, 0xCC81, + 0x8643, 0xCC82, 0x8644, 0xCC83, 0x8645, 0xCC84, 0x8646, 0xCC85, 0x8647, 0xCC86, 0x8648, 0xCC87, 0x8649, 0xCC88, 0x864A, 0xCC89, + 0x864B, 0xCC8A, 0x864C, 0xCC8B, 0x864D, 0xF2AE, 0x864E, 0xBBA2, 0x864F, 0xC2B2, 0x8650, 0xC5B0, 0x8651, 0xC2C7, 0x8652, 0xCC8C, + 0x8653, 0xCC8D, 0x8654, 0xF2AF, 0x8655, 0xCC8E, 0x8656, 0xCC8F, 0x8657, 0xCC90, 0x8658, 0xCC91, 0x8659, 0xCC92, 0x865A, 0xD0E9, + 0x865B, 0xCC93, 0x865C, 0xCC94, 0x865D, 0xCC95, 0x865E, 0xD3DD, 0x865F, 0xCC96, 0x8660, 0xCC97, 0x8661, 0xCC98, 0x8662, 0xEBBD, + 0x8663, 0xCC99, 0x8664, 0xCC9A, 0x8665, 0xCC9B, 0x8666, 0xCC9C, 0x8667, 0xCC9D, 0x8668, 0xCC9E, 0x8669, 0xCC9F, 0x866A, 0xCCA0, + 0x866B, 0xB3E6, 0x866C, 0xF2B0, 0x866D, 0xCD40, 0x866E, 0xF2B1, 0x866F, 0xCD41, 0x8670, 0xCD42, 0x8671, 0xCAAD, 0x8672, 0xCD43, + 0x8673, 0xCD44, 0x8674, 0xCD45, 0x8675, 0xCD46, 0x8676, 0xCD47, 0x8677, 0xCD48, 0x8678, 0xCD49, 0x8679, 0xBAE7, 0x867A, 0xF2B3, + 0x867B, 0xF2B5, 0x867C, 0xF2B4, 0x867D, 0xCBE4, 0x867E, 0xCFBA, 0x867F, 0xF2B2, 0x8680, 0xCAB4, 0x8681, 0xD2CF, 0x8682, 0xC2EC, + 0x8683, 0xCD4A, 0x8684, 0xCD4B, 0x8685, 0xCD4C, 0x8686, 0xCD4D, 0x8687, 0xCD4E, 0x8688, 0xCD4F, 0x8689, 0xCD50, 0x868A, 0xCEC3, + 0x868B, 0xF2B8, 0x868C, 0xB0F6, 0x868D, 0xF2B7, 0x868E, 0xCD51, 0x868F, 0xCD52, 0x8690, 0xCD53, 0x8691, 0xCD54, 0x8692, 0xCD55, + 0x8693, 0xF2BE, 0x8694, 0xCD56, 0x8695, 0xB2CF, 0x8696, 0xCD57, 0x8697, 0xCD58, 0x8698, 0xCD59, 0x8699, 0xCD5A, 0x869A, 0xCD5B, + 0x869B, 0xCD5C, 0x869C, 0xD1C1, 0x869D, 0xF2BA, 0x869E, 0xCD5D, 0x869F, 0xCD5E, 0x86A0, 0xCD5F, 0x86A1, 0xCD60, 0x86A2, 0xCD61, + 0x86A3, 0xF2BC, 0x86A4, 0xD4E9, 0x86A5, 0xCD62, 0x86A6, 0xCD63, 0x86A7, 0xF2BB, 0x86A8, 0xF2B6, 0x86A9, 0xF2BF, 0x86AA, 0xF2BD, + 0x86AB, 0xCD64, 0x86AC, 0xF2B9, 0x86AD, 0xCD65, 0x86AE, 0xCD66, 0x86AF, 0xF2C7, 0x86B0, 0xF2C4, 0x86B1, 0xF2C6, 0x86B2, 0xCD67, + 0x86B3, 0xCD68, 0x86B4, 0xF2CA, 0x86B5, 0xF2C2, 0x86B6, 0xF2C0, 0x86B7, 0xCD69, 0x86B8, 0xCD6A, 0x86B9, 0xCD6B, 0x86BA, 0xF2C5, + 0x86BB, 0xCD6C, 0x86BC, 0xCD6D, 0x86BD, 0xCD6E, 0x86BE, 0xCD6F, 0x86BF, 0xCD70, 0x86C0, 0xD6FB, 0x86C1, 0xCD71, 0x86C2, 0xCD72, + 0x86C3, 0xCD73, 0x86C4, 0xF2C1, 0x86C5, 0xCD74, 0x86C6, 0xC7F9, 0x86C7, 0xC9DF, 0x86C8, 0xCD75, 0x86C9, 0xF2C8, 0x86CA, 0xB9C6, + 0x86CB, 0xB5B0, 0x86CC, 0xCD76, 0x86CD, 0xCD77, 0x86CE, 0xF2C3, 0x86CF, 0xF2C9, 0x86D0, 0xF2D0, 0x86D1, 0xF2D6, 0x86D2, 0xCD78, + 0x86D3, 0xCD79, 0x86D4, 0xBBD7, 0x86D5, 0xCD7A, 0x86D6, 0xCD7B, 0x86D7, 0xCD7C, 0x86D8, 0xF2D5, 0x86D9, 0xCDDC, 0x86DA, 0xCD7D, + 0x86DB, 0xD6EB, 0x86DC, 0xCD7E, 0x86DD, 0xCD80, 0x86DE, 0xF2D2, 0x86DF, 0xF2D4, 0x86E0, 0xCD81, 0x86E1, 0xCD82, 0x86E2, 0xCD83, + 0x86E3, 0xCD84, 0x86E4, 0xB8F2, 0x86E5, 0xCD85, 0x86E6, 0xCD86, 0x86E7, 0xCD87, 0x86E8, 0xCD88, 0x86E9, 0xF2CB, 0x86EA, 0xCD89, + 0x86EB, 0xCD8A, 0x86EC, 0xCD8B, 0x86ED, 0xF2CE, 0x86EE, 0xC2F9, 0x86EF, 0xCD8C, 0x86F0, 0xD5DD, 0x86F1, 0xF2CC, 0x86F2, 0xF2CD, + 0x86F3, 0xF2CF, 0x86F4, 0xF2D3, 0x86F5, 0xCD8D, 0x86F6, 0xCD8E, 0x86F7, 0xCD8F, 0x86F8, 0xF2D9, 0x86F9, 0xD3BC, 0x86FA, 0xCD90, + 0x86FB, 0xCD91, 0x86FC, 0xCD92, 0x86FD, 0xCD93, 0x86FE, 0xB6EA, 0x86FF, 0xCD94, 0x8700, 0xCAF1, 0x8701, 0xCD95, 0x8702, 0xB7E4, + 0x8703, 0xF2D7, 0x8704, 0xCD96, 0x8705, 0xCD97, 0x8706, 0xCD98, 0x8707, 0xF2D8, 0x8708, 0xF2DA, 0x8709, 0xF2DD, 0x870A, 0xF2DB, + 0x870B, 0xCD99, 0x870C, 0xCD9A, 0x870D, 0xF2DC, 0x870E, 0xCD9B, 0x870F, 0xCD9C, 0x8710, 0xCD9D, 0x8711, 0xCD9E, 0x8712, 0xD1D1, + 0x8713, 0xF2D1, 0x8714, 0xCD9F, 0x8715, 0xCDC9, 0x8716, 0xCDA0, 0x8717, 0xCECF, 0x8718, 0xD6A9, 0x8719, 0xCE40, 0x871A, 0xF2E3, + 0x871B, 0xCE41, 0x871C, 0xC3DB, 0x871D, 0xCE42, 0x871E, 0xF2E0, 0x871F, 0xCE43, 0x8720, 0xCE44, 0x8721, 0xC0AF, 0x8722, 0xF2EC, + 0x8723, 0xF2DE, 0x8724, 0xCE45, 0x8725, 0xF2E1, 0x8726, 0xCE46, 0x8727, 0xCE47, 0x8728, 0xCE48, 0x8729, 0xF2E8, 0x872A, 0xCE49, + 0x872B, 0xCE4A, 0x872C, 0xCE4B, 0x872D, 0xCE4C, 0x872E, 0xF2E2, 0x872F, 0xCE4D, 0x8730, 0xCE4E, 0x8731, 0xF2E7, 0x8732, 0xCE4F, + 0x8733, 0xCE50, 0x8734, 0xF2E6, 0x8735, 0xCE51, 0x8736, 0xCE52, 0x8737, 0xF2E9, 0x8738, 0xCE53, 0x8739, 0xCE54, 0x873A, 0xCE55, + 0x873B, 0xF2DF, 0x873C, 0xCE56, 0x873D, 0xCE57, 0x873E, 0xF2E4, 0x873F, 0xF2EA, 0x8740, 0xCE58, 0x8741, 0xCE59, 0x8742, 0xCE5A, + 0x8743, 0xCE5B, 0x8744, 0xCE5C, 0x8745, 0xCE5D, 0x8746, 0xCE5E, 0x8747, 0xD3AC, 0x8748, 0xF2E5, 0x8749, 0xB2F5, 0x874A, 0xCE5F, + 0x874B, 0xCE60, 0x874C, 0xF2F2, 0x874D, 0xCE61, 0x874E, 0xD0AB, 0x874F, 0xCE62, 0x8750, 0xCE63, 0x8751, 0xCE64, 0x8752, 0xCE65, + 0x8753, 0xF2F5, 0x8754, 0xCE66, 0x8755, 0xCE67, 0x8756, 0xCE68, 0x8757, 0xBBC8, 0x8758, 0xCE69, 0x8759, 0xF2F9, 0x875A, 0xCE6A, + 0x875B, 0xCE6B, 0x875C, 0xCE6C, 0x875D, 0xCE6D, 0x875E, 0xCE6E, 0x875F, 0xCE6F, 0x8760, 0xF2F0, 0x8761, 0xCE70, 0x8762, 0xCE71, + 0x8763, 0xF2F6, 0x8764, 0xF2F8, 0x8765, 0xF2FA, 0x8766, 0xCE72, 0x8767, 0xCE73, 0x8768, 0xCE74, 0x8769, 0xCE75, 0x876A, 0xCE76, + 0x876B, 0xCE77, 0x876C, 0xCE78, 0x876D, 0xCE79, 0x876E, 0xF2F3, 0x876F, 0xCE7A, 0x8770, 0xF2F1, 0x8771, 0xCE7B, 0x8772, 0xCE7C, + 0x8773, 0xCE7D, 0x8774, 0xBAFB, 0x8775, 0xCE7E, 0x8776, 0xB5FB, 0x8777, 0xCE80, 0x8778, 0xCE81, 0x8779, 0xCE82, 0x877A, 0xCE83, + 0x877B, 0xF2EF, 0x877C, 0xF2F7, 0x877D, 0xF2ED, 0x877E, 0xF2EE, 0x877F, 0xCE84, 0x8780, 0xCE85, 0x8781, 0xCE86, 0x8782, 0xF2EB, + 0x8783, 0xF3A6, 0x8784, 0xCE87, 0x8785, 0xF3A3, 0x8786, 0xCE88, 0x8787, 0xCE89, 0x8788, 0xF3A2, 0x8789, 0xCE8A, 0x878A, 0xCE8B, + 0x878B, 0xF2F4, 0x878C, 0xCE8C, 0x878D, 0xC8DA, 0x878E, 0xCE8D, 0x878F, 0xCE8E, 0x8790, 0xCE8F, 0x8791, 0xCE90, 0x8792, 0xCE91, + 0x8793, 0xF2FB, 0x8794, 0xCE92, 0x8795, 0xCE93, 0x8796, 0xCE94, 0x8797, 0xF3A5, 0x8798, 0xCE95, 0x8799, 0xCE96, 0x879A, 0xCE97, + 0x879B, 0xCE98, 0x879C, 0xCE99, 0x879D, 0xCE9A, 0x879E, 0xCE9B, 0x879F, 0xC3F8, 0x87A0, 0xCE9C, 0x87A1, 0xCE9D, 0x87A2, 0xCE9E, + 0x87A3, 0xCE9F, 0x87A4, 0xCEA0, 0x87A5, 0xCF40, 0x87A6, 0xCF41, 0x87A7, 0xCF42, 0x87A8, 0xF2FD, 0x87A9, 0xCF43, 0x87AA, 0xCF44, + 0x87AB, 0xF3A7, 0x87AC, 0xF3A9, 0x87AD, 0xF3A4, 0x87AE, 0xCF45, 0x87AF, 0xF2FC, 0x87B0, 0xCF46, 0x87B1, 0xCF47, 0x87B2, 0xCF48, + 0x87B3, 0xF3AB, 0x87B4, 0xCF49, 0x87B5, 0xF3AA, 0x87B6, 0xCF4A, 0x87B7, 0xCF4B, 0x87B8, 0xCF4C, 0x87B9, 0xCF4D, 0x87BA, 0xC2DD, + 0x87BB, 0xCF4E, 0x87BC, 0xCF4F, 0x87BD, 0xF3AE, 0x87BE, 0xCF50, 0x87BF, 0xCF51, 0x87C0, 0xF3B0, 0x87C1, 0xCF52, 0x87C2, 0xCF53, + 0x87C3, 0xCF54, 0x87C4, 0xCF55, 0x87C5, 0xCF56, 0x87C6, 0xF3A1, 0x87C7, 0xCF57, 0x87C8, 0xCF58, 0x87C9, 0xCF59, 0x87CA, 0xF3B1, + 0x87CB, 0xF3AC, 0x87CC, 0xCF5A, 0x87CD, 0xCF5B, 0x87CE, 0xCF5C, 0x87CF, 0xCF5D, 0x87D0, 0xCF5E, 0x87D1, 0xF3AF, 0x87D2, 0xF2FE, + 0x87D3, 0xF3AD, 0x87D4, 0xCF5F, 0x87D5, 0xCF60, 0x87D6, 0xCF61, 0x87D7, 0xCF62, 0x87D8, 0xCF63, 0x87D9, 0xCF64, 0x87DA, 0xCF65, + 0x87DB, 0xF3B2, 0x87DC, 0xCF66, 0x87DD, 0xCF67, 0x87DE, 0xCF68, 0x87DF, 0xCF69, 0x87E0, 0xF3B4, 0x87E1, 0xCF6A, 0x87E2, 0xCF6B, + 0x87E3, 0xCF6C, 0x87E4, 0xCF6D, 0x87E5, 0xF3A8, 0x87E6, 0xCF6E, 0x87E7, 0xCF6F, 0x87E8, 0xCF70, 0x87E9, 0xCF71, 0x87EA, 0xF3B3, + 0x87EB, 0xCF72, 0x87EC, 0xCF73, 0x87ED, 0xCF74, 0x87EE, 0xF3B5, 0x87EF, 0xCF75, 0x87F0, 0xCF76, 0x87F1, 0xCF77, 0x87F2, 0xCF78, + 0x87F3, 0xCF79, 0x87F4, 0xCF7A, 0x87F5, 0xCF7B, 0x87F6, 0xCF7C, 0x87F7, 0xCF7D, 0x87F8, 0xCF7E, 0x87F9, 0xD0B7, 0x87FA, 0xCF80, + 0x87FB, 0xCF81, 0x87FC, 0xCF82, 0x87FD, 0xCF83, 0x87FE, 0xF3B8, 0x87FF, 0xCF84, 0x8800, 0xCF85, 0x8801, 0xCF86, 0x8802, 0xCF87, + 0x8803, 0xD9F9, 0x8804, 0xCF88, 0x8805, 0xCF89, 0x8806, 0xCF8A, 0x8807, 0xCF8B, 0x8808, 0xCF8C, 0x8809, 0xCF8D, 0x880A, 0xF3B9, + 0x880B, 0xCF8E, 0x880C, 0xCF8F, 0x880D, 0xCF90, 0x880E, 0xCF91, 0x880F, 0xCF92, 0x8810, 0xCF93, 0x8811, 0xCF94, 0x8812, 0xCF95, + 0x8813, 0xF3B7, 0x8814, 0xCF96, 0x8815, 0xC8E4, 0x8816, 0xF3B6, 0x8817, 0xCF97, 0x8818, 0xCF98, 0x8819, 0xCF99, 0x881A, 0xCF9A, + 0x881B, 0xF3BA, 0x881C, 0xCF9B, 0x881D, 0xCF9C, 0x881E, 0xCF9D, 0x881F, 0xCF9E, 0x8820, 0xCF9F, 0x8821, 0xF3BB, 0x8822, 0xB4C0, + 0x8823, 0xCFA0, 0x8824, 0xD040, 0x8825, 0xD041, 0x8826, 0xD042, 0x8827, 0xD043, 0x8828, 0xD044, 0x8829, 0xD045, 0x882A, 0xD046, + 0x882B, 0xD047, 0x882C, 0xD048, 0x882D, 0xD049, 0x882E, 0xD04A, 0x882F, 0xD04B, 0x8830, 0xD04C, 0x8831, 0xD04D, 0x8832, 0xEEC3, + 0x8833, 0xD04E, 0x8834, 0xD04F, 0x8835, 0xD050, 0x8836, 0xD051, 0x8837, 0xD052, 0x8838, 0xD053, 0x8839, 0xF3BC, 0x883A, 0xD054, + 0x883B, 0xD055, 0x883C, 0xF3BD, 0x883D, 0xD056, 0x883E, 0xD057, 0x883F, 0xD058, 0x8840, 0xD1AA, 0x8841, 0xD059, 0x8842, 0xD05A, + 0x8843, 0xD05B, 0x8844, 0xF4AC, 0x8845, 0xD0C6, 0x8846, 0xD05C, 0x8847, 0xD05D, 0x8848, 0xD05E, 0x8849, 0xD05F, 0x884A, 0xD060, + 0x884B, 0xD061, 0x884C, 0xD0D0, 0x884D, 0xD1DC, 0x884E, 0xD062, 0x884F, 0xD063, 0x8850, 0xD064, 0x8851, 0xD065, 0x8852, 0xD066, + 0x8853, 0xD067, 0x8854, 0xCFCE, 0x8855, 0xD068, 0x8856, 0xD069, 0x8857, 0xBDD6, 0x8858, 0xD06A, 0x8859, 0xD1C3, 0x885A, 0xD06B, + 0x885B, 0xD06C, 0x885C, 0xD06D, 0x885D, 0xD06E, 0x885E, 0xD06F, 0x885F, 0xD070, 0x8860, 0xD071, 0x8861, 0xBAE2, 0x8862, 0xE1E9, + 0x8863, 0xD2C2, 0x8864, 0xF1C2, 0x8865, 0xB2B9, 0x8866, 0xD072, 0x8867, 0xD073, 0x8868, 0xB1ED, 0x8869, 0xF1C3, 0x886A, 0xD074, + 0x886B, 0xC9C0, 0x886C, 0xB3C4, 0x886D, 0xD075, 0x886E, 0xD9F2, 0x886F, 0xD076, 0x8870, 0xCBA5, 0x8871, 0xD077, 0x8872, 0xF1C4, + 0x8873, 0xD078, 0x8874, 0xD079, 0x8875, 0xD07A, 0x8876, 0xD07B, 0x8877, 0xD6D4, 0x8878, 0xD07C, 0x8879, 0xD07D, 0x887A, 0xD07E, + 0x887B, 0xD080, 0x887C, 0xD081, 0x887D, 0xF1C5, 0x887E, 0xF4C0, 0x887F, 0xF1C6, 0x8880, 0xD082, 0x8881, 0xD4AC, 0x8882, 0xF1C7, + 0x8883, 0xD083, 0x8884, 0xB0C0, 0x8885, 0xF4C1, 0x8886, 0xD084, 0x8887, 0xD085, 0x8888, 0xF4C2, 0x8889, 0xD086, 0x888A, 0xD087, + 0x888B, 0xB4FC, 0x888C, 0xD088, 0x888D, 0xC5DB, 0x888E, 0xD089, 0x888F, 0xD08A, 0x8890, 0xD08B, 0x8891, 0xD08C, 0x8892, 0xCCBB, + 0x8893, 0xD08D, 0x8894, 0xD08E, 0x8895, 0xD08F, 0x8896, 0xD0E4, 0x8897, 0xD090, 0x8898, 0xD091, 0x8899, 0xD092, 0x889A, 0xD093, + 0x889B, 0xD094, 0x889C, 0xCDE0, 0x889D, 0xD095, 0x889E, 0xD096, 0x889F, 0xD097, 0x88A0, 0xD098, 0x88A1, 0xD099, 0x88A2, 0xF1C8, + 0x88A3, 0xD09A, 0x88A4, 0xD9F3, 0x88A5, 0xD09B, 0x88A6, 0xD09C, 0x88A7, 0xD09D, 0x88A8, 0xD09E, 0x88A9, 0xD09F, 0x88AA, 0xD0A0, + 0x88AB, 0xB1BB, 0x88AC, 0xD140, 0x88AD, 0xCFAE, 0x88AE, 0xD141, 0x88AF, 0xD142, 0x88B0, 0xD143, 0x88B1, 0xB8A4, 0x88B2, 0xD144, + 0x88B3, 0xD145, 0x88B4, 0xD146, 0x88B5, 0xD147, 0x88B6, 0xD148, 0x88B7, 0xF1CA, 0x88B8, 0xD149, 0x88B9, 0xD14A, 0x88BA, 0xD14B, + 0x88BB, 0xD14C, 0x88BC, 0xF1CB, 0x88BD, 0xD14D, 0x88BE, 0xD14E, 0x88BF, 0xD14F, 0x88C0, 0xD150, 0x88C1, 0xB2C3, 0x88C2, 0xC1D1, + 0x88C3, 0xD151, 0x88C4, 0xD152, 0x88C5, 0xD7B0, 0x88C6, 0xF1C9, 0x88C7, 0xD153, 0x88C8, 0xD154, 0x88C9, 0xF1CC, 0x88CA, 0xD155, + 0x88CB, 0xD156, 0x88CC, 0xD157, 0x88CD, 0xD158, 0x88CE, 0xF1CE, 0x88CF, 0xD159, 0x88D0, 0xD15A, 0x88D1, 0xD15B, 0x88D2, 0xD9F6, + 0x88D3, 0xD15C, 0x88D4, 0xD2E1, 0x88D5, 0xD4A3, 0x88D6, 0xD15D, 0x88D7, 0xD15E, 0x88D8, 0xF4C3, 0x88D9, 0xC8B9, 0x88DA, 0xD15F, + 0x88DB, 0xD160, 0x88DC, 0xD161, 0x88DD, 0xD162, 0x88DE, 0xD163, 0x88DF, 0xF4C4, 0x88E0, 0xD164, 0x88E1, 0xD165, 0x88E2, 0xF1CD, + 0x88E3, 0xF1CF, 0x88E4, 0xBFE3, 0x88E5, 0xF1D0, 0x88E6, 0xD166, 0x88E7, 0xD167, 0x88E8, 0xF1D4, 0x88E9, 0xD168, 0x88EA, 0xD169, + 0x88EB, 0xD16A, 0x88EC, 0xD16B, 0x88ED, 0xD16C, 0x88EE, 0xD16D, 0x88EF, 0xD16E, 0x88F0, 0xF1D6, 0x88F1, 0xF1D1, 0x88F2, 0xD16F, + 0x88F3, 0xC9D1, 0x88F4, 0xC5E1, 0x88F5, 0xD170, 0x88F6, 0xD171, 0x88F7, 0xD172, 0x88F8, 0xC2E3, 0x88F9, 0xB9FC, 0x88FA, 0xD173, + 0x88FB, 0xD174, 0x88FC, 0xF1D3, 0x88FD, 0xD175, 0x88FE, 0xF1D5, 0x88FF, 0xD176, 0x8900, 0xD177, 0x8901, 0xD178, 0x8902, 0xB9D3, + 0x8903, 0xD179, 0x8904, 0xD17A, 0x8905, 0xD17B, 0x8906, 0xD17C, 0x8907, 0xD17D, 0x8908, 0xD17E, 0x8909, 0xD180, 0x890A, 0xF1DB, + 0x890B, 0xD181, 0x890C, 0xD182, 0x890D, 0xD183, 0x890E, 0xD184, 0x890F, 0xD185, 0x8910, 0xBAD6, 0x8911, 0xD186, 0x8912, 0xB0FD, + 0x8913, 0xF1D9, 0x8914, 0xD187, 0x8915, 0xD188, 0x8916, 0xD189, 0x8917, 0xD18A, 0x8918, 0xD18B, 0x8919, 0xF1D8, 0x891A, 0xF1D2, + 0x891B, 0xF1DA, 0x891C, 0xD18C, 0x891D, 0xD18D, 0x891E, 0xD18E, 0x891F, 0xD18F, 0x8920, 0xD190, 0x8921, 0xF1D7, 0x8922, 0xD191, + 0x8923, 0xD192, 0x8924, 0xD193, 0x8925, 0xC8EC, 0x8926, 0xD194, 0x8927, 0xD195, 0x8928, 0xD196, 0x8929, 0xD197, 0x892A, 0xCDCA, + 0x892B, 0xF1DD, 0x892C, 0xD198, 0x892D, 0xD199, 0x892E, 0xD19A, 0x892F, 0xD19B, 0x8930, 0xE5BD, 0x8931, 0xD19C, 0x8932, 0xD19D, + 0x8933, 0xD19E, 0x8934, 0xF1DC, 0x8935, 0xD19F, 0x8936, 0xF1DE, 0x8937, 0xD1A0, 0x8938, 0xD240, 0x8939, 0xD241, 0x893A, 0xD242, + 0x893B, 0xD243, 0x893C, 0xD244, 0x893D, 0xD245, 0x893E, 0xD246, 0x893F, 0xD247, 0x8940, 0xD248, 0x8941, 0xF1DF, 0x8942, 0xD249, + 0x8943, 0xD24A, 0x8944, 0xCFE5, 0x8945, 0xD24B, 0x8946, 0xD24C, 0x8947, 0xD24D, 0x8948, 0xD24E, 0x8949, 0xD24F, 0x894A, 0xD250, + 0x894B, 0xD251, 0x894C, 0xD252, 0x894D, 0xD253, 0x894E, 0xD254, 0x894F, 0xD255, 0x8950, 0xD256, 0x8951, 0xD257, 0x8952, 0xD258, + 0x8953, 0xD259, 0x8954, 0xD25A, 0x8955, 0xD25B, 0x8956, 0xD25C, 0x8957, 0xD25D, 0x8958, 0xD25E, 0x8959, 0xD25F, 0x895A, 0xD260, + 0x895B, 0xD261, 0x895C, 0xD262, 0x895D, 0xD263, 0x895E, 0xF4C5, 0x895F, 0xBDF3, 0x8960, 0xD264, 0x8961, 0xD265, 0x8962, 0xD266, + 0x8963, 0xD267, 0x8964, 0xD268, 0x8965, 0xD269, 0x8966, 0xF1E0, 0x8967, 0xD26A, 0x8968, 0xD26B, 0x8969, 0xD26C, 0x896A, 0xD26D, + 0x896B, 0xD26E, 0x896C, 0xD26F, 0x896D, 0xD270, 0x896E, 0xD271, 0x896F, 0xD272, 0x8970, 0xD273, 0x8971, 0xD274, 0x8972, 0xD275, + 0x8973, 0xD276, 0x8974, 0xD277, 0x8975, 0xD278, 0x8976, 0xD279, 0x8977, 0xD27A, 0x8978, 0xD27B, 0x8979, 0xD27C, 0x897A, 0xD27D, + 0x897B, 0xF1E1, 0x897C, 0xD27E, 0x897D, 0xD280, 0x897E, 0xD281, 0x897F, 0xCEF7, 0x8980, 0xD282, 0x8981, 0xD2AA, 0x8982, 0xD283, + 0x8983, 0xF1FB, 0x8984, 0xD284, 0x8985, 0xD285, 0x8986, 0xB8B2, 0x8987, 0xD286, 0x8988, 0xD287, 0x8989, 0xD288, 0x898A, 0xD289, + 0x898B, 0xD28A, 0x898C, 0xD28B, 0x898D, 0xD28C, 0x898E, 0xD28D, 0x898F, 0xD28E, 0x8990, 0xD28F, 0x8991, 0xD290, 0x8992, 0xD291, + 0x8993, 0xD292, 0x8994, 0xD293, 0x8995, 0xD294, 0x8996, 0xD295, 0x8997, 0xD296, 0x8998, 0xD297, 0x8999, 0xD298, 0x899A, 0xD299, + 0x899B, 0xD29A, 0x899C, 0xD29B, 0x899D, 0xD29C, 0x899E, 0xD29D, 0x899F, 0xD29E, 0x89A0, 0xD29F, 0x89A1, 0xD2A0, 0x89A2, 0xD340, + 0x89A3, 0xD341, 0x89A4, 0xD342, 0x89A5, 0xD343, 0x89A6, 0xD344, 0x89A7, 0xD345, 0x89A8, 0xD346, 0x89A9, 0xD347, 0x89AA, 0xD348, + 0x89AB, 0xD349, 0x89AC, 0xD34A, 0x89AD, 0xD34B, 0x89AE, 0xD34C, 0x89AF, 0xD34D, 0x89B0, 0xD34E, 0x89B1, 0xD34F, 0x89B2, 0xD350, + 0x89B3, 0xD351, 0x89B4, 0xD352, 0x89B5, 0xD353, 0x89B6, 0xD354, 0x89B7, 0xD355, 0x89B8, 0xD356, 0x89B9, 0xD357, 0x89BA, 0xD358, + 0x89BB, 0xD359, 0x89BC, 0xD35A, 0x89BD, 0xD35B, 0x89BE, 0xD35C, 0x89BF, 0xD35D, 0x89C0, 0xD35E, 0x89C1, 0xBCFB, 0x89C2, 0xB9DB, + 0x89C3, 0xD35F, 0x89C4, 0xB9E6, 0x89C5, 0xC3D9, 0x89C6, 0xCAD3, 0x89C7, 0xEAE8, 0x89C8, 0xC0C0, 0x89C9, 0xBEF5, 0x89CA, 0xEAE9, + 0x89CB, 0xEAEA, 0x89CC, 0xEAEB, 0x89CD, 0xD360, 0x89CE, 0xEAEC, 0x89CF, 0xEAED, 0x89D0, 0xEAEE, 0x89D1, 0xEAEF, 0x89D2, 0xBDC7, + 0x89D3, 0xD361, 0x89D4, 0xD362, 0x89D5, 0xD363, 0x89D6, 0xF5FB, 0x89D7, 0xD364, 0x89D8, 0xD365, 0x89D9, 0xD366, 0x89DA, 0xF5FD, + 0x89DB, 0xD367, 0x89DC, 0xF5FE, 0x89DD, 0xD368, 0x89DE, 0xF5FC, 0x89DF, 0xD369, 0x89E0, 0xD36A, 0x89E1, 0xD36B, 0x89E2, 0xD36C, + 0x89E3, 0xBDE2, 0x89E4, 0xD36D, 0x89E5, 0xF6A1, 0x89E6, 0xB4A5, 0x89E7, 0xD36E, 0x89E8, 0xD36F, 0x89E9, 0xD370, 0x89EA, 0xD371, + 0x89EB, 0xF6A2, 0x89EC, 0xD372, 0x89ED, 0xD373, 0x89EE, 0xD374, 0x89EF, 0xF6A3, 0x89F0, 0xD375, 0x89F1, 0xD376, 0x89F2, 0xD377, + 0x89F3, 0xECB2, 0x89F4, 0xD378, 0x89F5, 0xD379, 0x89F6, 0xD37A, 0x89F7, 0xD37B, 0x89F8, 0xD37C, 0x89F9, 0xD37D, 0x89FA, 0xD37E, + 0x89FB, 0xD380, 0x89FC, 0xD381, 0x89FD, 0xD382, 0x89FE, 0xD383, 0x89FF, 0xD384, 0x8A00, 0xD1D4, 0x8A01, 0xD385, 0x8A02, 0xD386, + 0x8A03, 0xD387, 0x8A04, 0xD388, 0x8A05, 0xD389, 0x8A06, 0xD38A, 0x8A07, 0xD9EA, 0x8A08, 0xD38B, 0x8A09, 0xD38C, 0x8A0A, 0xD38D, + 0x8A0B, 0xD38E, 0x8A0C, 0xD38F, 0x8A0D, 0xD390, 0x8A0E, 0xD391, 0x8A0F, 0xD392, 0x8A10, 0xD393, 0x8A11, 0xD394, 0x8A12, 0xD395, + 0x8A13, 0xD396, 0x8A14, 0xD397, 0x8A15, 0xD398, 0x8A16, 0xD399, 0x8A17, 0xD39A, 0x8A18, 0xD39B, 0x8A19, 0xD39C, 0x8A1A, 0xD39D, + 0x8A1B, 0xD39E, 0x8A1C, 0xD39F, 0x8A1D, 0xD3A0, 0x8A1E, 0xD440, 0x8A1F, 0xD441, 0x8A20, 0xD442, 0x8A21, 0xD443, 0x8A22, 0xD444, + 0x8A23, 0xD445, 0x8A24, 0xD446, 0x8A25, 0xD447, 0x8A26, 0xD448, 0x8A27, 0xD449, 0x8A28, 0xD44A, 0x8A29, 0xD44B, 0x8A2A, 0xD44C, + 0x8A2B, 0xD44D, 0x8A2C, 0xD44E, 0x8A2D, 0xD44F, 0x8A2E, 0xD450, 0x8A2F, 0xD451, 0x8A30, 0xD452, 0x8A31, 0xD453, 0x8A32, 0xD454, + 0x8A33, 0xD455, 0x8A34, 0xD456, 0x8A35, 0xD457, 0x8A36, 0xD458, 0x8A37, 0xD459, 0x8A38, 0xD45A, 0x8A39, 0xD45B, 0x8A3A, 0xD45C, + 0x8A3B, 0xD45D, 0x8A3C, 0xD45E, 0x8A3D, 0xD45F, 0x8A3E, 0xF6A4, 0x8A3F, 0xD460, 0x8A40, 0xD461, 0x8A41, 0xD462, 0x8A42, 0xD463, + 0x8A43, 0xD464, 0x8A44, 0xD465, 0x8A45, 0xD466, 0x8A46, 0xD467, 0x8A47, 0xD468, 0x8A48, 0xEEBA, 0x8A49, 0xD469, 0x8A4A, 0xD46A, + 0x8A4B, 0xD46B, 0x8A4C, 0xD46C, 0x8A4D, 0xD46D, 0x8A4E, 0xD46E, 0x8A4F, 0xD46F, 0x8A50, 0xD470, 0x8A51, 0xD471, 0x8A52, 0xD472, + 0x8A53, 0xD473, 0x8A54, 0xD474, 0x8A55, 0xD475, 0x8A56, 0xD476, 0x8A57, 0xD477, 0x8A58, 0xD478, 0x8A59, 0xD479, 0x8A5A, 0xD47A, + 0x8A5B, 0xD47B, 0x8A5C, 0xD47C, 0x8A5D, 0xD47D, 0x8A5E, 0xD47E, 0x8A5F, 0xD480, 0x8A60, 0xD481, 0x8A61, 0xD482, 0x8A62, 0xD483, + 0x8A63, 0xD484, 0x8A64, 0xD485, 0x8A65, 0xD486, 0x8A66, 0xD487, 0x8A67, 0xD488, 0x8A68, 0xD489, 0x8A69, 0xD48A, 0x8A6A, 0xD48B, + 0x8A6B, 0xD48C, 0x8A6C, 0xD48D, 0x8A6D, 0xD48E, 0x8A6E, 0xD48F, 0x8A6F, 0xD490, 0x8A70, 0xD491, 0x8A71, 0xD492, 0x8A72, 0xD493, + 0x8A73, 0xD494, 0x8A74, 0xD495, 0x8A75, 0xD496, 0x8A76, 0xD497, 0x8A77, 0xD498, 0x8A78, 0xD499, 0x8A79, 0xD5B2, 0x8A7A, 0xD49A, + 0x8A7B, 0xD49B, 0x8A7C, 0xD49C, 0x8A7D, 0xD49D, 0x8A7E, 0xD49E, 0x8A7F, 0xD49F, 0x8A80, 0xD4A0, 0x8A81, 0xD540, 0x8A82, 0xD541, + 0x8A83, 0xD542, 0x8A84, 0xD543, 0x8A85, 0xD544, 0x8A86, 0xD545, 0x8A87, 0xD546, 0x8A88, 0xD547, 0x8A89, 0xD3FE, 0x8A8A, 0xCCDC, + 0x8A8B, 0xD548, 0x8A8C, 0xD549, 0x8A8D, 0xD54A, 0x8A8E, 0xD54B, 0x8A8F, 0xD54C, 0x8A90, 0xD54D, 0x8A91, 0xD54E, 0x8A92, 0xD54F, + 0x8A93, 0xCAC4, 0x8A94, 0xD550, 0x8A95, 0xD551, 0x8A96, 0xD552, 0x8A97, 0xD553, 0x8A98, 0xD554, 0x8A99, 0xD555, 0x8A9A, 0xD556, + 0x8A9B, 0xD557, 0x8A9C, 0xD558, 0x8A9D, 0xD559, 0x8A9E, 0xD55A, 0x8A9F, 0xD55B, 0x8AA0, 0xD55C, 0x8AA1, 0xD55D, 0x8AA2, 0xD55E, + 0x8AA3, 0xD55F, 0x8AA4, 0xD560, 0x8AA5, 0xD561, 0x8AA6, 0xD562, 0x8AA7, 0xD563, 0x8AA8, 0xD564, 0x8AA9, 0xD565, 0x8AAA, 0xD566, + 0x8AAB, 0xD567, 0x8AAC, 0xD568, 0x8AAD, 0xD569, 0x8AAE, 0xD56A, 0x8AAF, 0xD56B, 0x8AB0, 0xD56C, 0x8AB1, 0xD56D, 0x8AB2, 0xD56E, + 0x8AB3, 0xD56F, 0x8AB4, 0xD570, 0x8AB5, 0xD571, 0x8AB6, 0xD572, 0x8AB7, 0xD573, 0x8AB8, 0xD574, 0x8AB9, 0xD575, 0x8ABA, 0xD576, + 0x8ABB, 0xD577, 0x8ABC, 0xD578, 0x8ABD, 0xD579, 0x8ABE, 0xD57A, 0x8ABF, 0xD57B, 0x8AC0, 0xD57C, 0x8AC1, 0xD57D, 0x8AC2, 0xD57E, + 0x8AC3, 0xD580, 0x8AC4, 0xD581, 0x8AC5, 0xD582, 0x8AC6, 0xD583, 0x8AC7, 0xD584, 0x8AC8, 0xD585, 0x8AC9, 0xD586, 0x8ACA, 0xD587, + 0x8ACB, 0xD588, 0x8ACC, 0xD589, 0x8ACD, 0xD58A, 0x8ACE, 0xD58B, 0x8ACF, 0xD58C, 0x8AD0, 0xD58D, 0x8AD1, 0xD58E, 0x8AD2, 0xD58F, + 0x8AD3, 0xD590, 0x8AD4, 0xD591, 0x8AD5, 0xD592, 0x8AD6, 0xD593, 0x8AD7, 0xD594, 0x8AD8, 0xD595, 0x8AD9, 0xD596, 0x8ADA, 0xD597, + 0x8ADB, 0xD598, 0x8ADC, 0xD599, 0x8ADD, 0xD59A, 0x8ADE, 0xD59B, 0x8ADF, 0xD59C, 0x8AE0, 0xD59D, 0x8AE1, 0xD59E, 0x8AE2, 0xD59F, + 0x8AE3, 0xD5A0, 0x8AE4, 0xD640, 0x8AE5, 0xD641, 0x8AE6, 0xD642, 0x8AE7, 0xD643, 0x8AE8, 0xD644, 0x8AE9, 0xD645, 0x8AEA, 0xD646, + 0x8AEB, 0xD647, 0x8AEC, 0xD648, 0x8AED, 0xD649, 0x8AEE, 0xD64A, 0x8AEF, 0xD64B, 0x8AF0, 0xD64C, 0x8AF1, 0xD64D, 0x8AF2, 0xD64E, + 0x8AF3, 0xD64F, 0x8AF4, 0xD650, 0x8AF5, 0xD651, 0x8AF6, 0xD652, 0x8AF7, 0xD653, 0x8AF8, 0xD654, 0x8AF9, 0xD655, 0x8AFA, 0xD656, + 0x8AFB, 0xD657, 0x8AFC, 0xD658, 0x8AFD, 0xD659, 0x8AFE, 0xD65A, 0x8AFF, 0xD65B, 0x8B00, 0xD65C, 0x8B01, 0xD65D, 0x8B02, 0xD65E, + 0x8B03, 0xD65F, 0x8B04, 0xD660, 0x8B05, 0xD661, 0x8B06, 0xD662, 0x8B07, 0xE5C0, 0x8B08, 0xD663, 0x8B09, 0xD664, 0x8B0A, 0xD665, + 0x8B0B, 0xD666, 0x8B0C, 0xD667, 0x8B0D, 0xD668, 0x8B0E, 0xD669, 0x8B0F, 0xD66A, 0x8B10, 0xD66B, 0x8B11, 0xD66C, 0x8B12, 0xD66D, + 0x8B13, 0xD66E, 0x8B14, 0xD66F, 0x8B15, 0xD670, 0x8B16, 0xD671, 0x8B17, 0xD672, 0x8B18, 0xD673, 0x8B19, 0xD674, 0x8B1A, 0xD675, + 0x8B1B, 0xD676, 0x8B1C, 0xD677, 0x8B1D, 0xD678, 0x8B1E, 0xD679, 0x8B1F, 0xD67A, 0x8B20, 0xD67B, 0x8B21, 0xD67C, 0x8B22, 0xD67D, + 0x8B23, 0xD67E, 0x8B24, 0xD680, 0x8B25, 0xD681, 0x8B26, 0xF6A5, 0x8B27, 0xD682, 0x8B28, 0xD683, 0x8B29, 0xD684, 0x8B2A, 0xD685, + 0x8B2B, 0xD686, 0x8B2C, 0xD687, 0x8B2D, 0xD688, 0x8B2E, 0xD689, 0x8B2F, 0xD68A, 0x8B30, 0xD68B, 0x8B31, 0xD68C, 0x8B32, 0xD68D, + 0x8B33, 0xD68E, 0x8B34, 0xD68F, 0x8B35, 0xD690, 0x8B36, 0xD691, 0x8B37, 0xD692, 0x8B38, 0xD693, 0x8B39, 0xD694, 0x8B3A, 0xD695, + 0x8B3B, 0xD696, 0x8B3C, 0xD697, 0x8B3D, 0xD698, 0x8B3E, 0xD699, 0x8B3F, 0xD69A, 0x8B40, 0xD69B, 0x8B41, 0xD69C, 0x8B42, 0xD69D, + 0x8B43, 0xD69E, 0x8B44, 0xD69F, 0x8B45, 0xD6A0, 0x8B46, 0xD740, 0x8B47, 0xD741, 0x8B48, 0xD742, 0x8B49, 0xD743, 0x8B4A, 0xD744, + 0x8B4B, 0xD745, 0x8B4C, 0xD746, 0x8B4D, 0xD747, 0x8B4E, 0xD748, 0x8B4F, 0xD749, 0x8B50, 0xD74A, 0x8B51, 0xD74B, 0x8B52, 0xD74C, + 0x8B53, 0xD74D, 0x8B54, 0xD74E, 0x8B55, 0xD74F, 0x8B56, 0xD750, 0x8B57, 0xD751, 0x8B58, 0xD752, 0x8B59, 0xD753, 0x8B5A, 0xD754, + 0x8B5B, 0xD755, 0x8B5C, 0xD756, 0x8B5D, 0xD757, 0x8B5E, 0xD758, 0x8B5F, 0xD759, 0x8B60, 0xD75A, 0x8B61, 0xD75B, 0x8B62, 0xD75C, + 0x8B63, 0xD75D, 0x8B64, 0xD75E, 0x8B65, 0xD75F, 0x8B66, 0xBEAF, 0x8B67, 0xD760, 0x8B68, 0xD761, 0x8B69, 0xD762, 0x8B6A, 0xD763, + 0x8B6B, 0xD764, 0x8B6C, 0xC6A9, 0x8B6D, 0xD765, 0x8B6E, 0xD766, 0x8B6F, 0xD767, 0x8B70, 0xD768, 0x8B71, 0xD769, 0x8B72, 0xD76A, + 0x8B73, 0xD76B, 0x8B74, 0xD76C, 0x8B75, 0xD76D, 0x8B76, 0xD76E, 0x8B77, 0xD76F, 0x8B78, 0xD770, 0x8B79, 0xD771, 0x8B7A, 0xD772, + 0x8B7B, 0xD773, 0x8B7C, 0xD774, 0x8B7D, 0xD775, 0x8B7E, 0xD776, 0x8B7F, 0xD777, 0x8B80, 0xD778, 0x8B81, 0xD779, 0x8B82, 0xD77A, + 0x8B83, 0xD77B, 0x8B84, 0xD77C, 0x8B85, 0xD77D, 0x8B86, 0xD77E, 0x8B87, 0xD780, 0x8B88, 0xD781, 0x8B89, 0xD782, 0x8B8A, 0xD783, + 0x8B8B, 0xD784, 0x8B8C, 0xD785, 0x8B8D, 0xD786, 0x8B8E, 0xD787, 0x8B8F, 0xD788, 0x8B90, 0xD789, 0x8B91, 0xD78A, 0x8B92, 0xD78B, + 0x8B93, 0xD78C, 0x8B94, 0xD78D, 0x8B95, 0xD78E, 0x8B96, 0xD78F, 0x8B97, 0xD790, 0x8B98, 0xD791, 0x8B99, 0xD792, 0x8B9A, 0xD793, + 0x8B9B, 0xD794, 0x8B9C, 0xD795, 0x8B9D, 0xD796, 0x8B9E, 0xD797, 0x8B9F, 0xD798, 0x8BA0, 0xDAA5, 0x8BA1, 0xBCC6, 0x8BA2, 0xB6A9, + 0x8BA3, 0xB8BC, 0x8BA4, 0xC8CF, 0x8BA5, 0xBCA5, 0x8BA6, 0xDAA6, 0x8BA7, 0xDAA7, 0x8BA8, 0xCCD6, 0x8BA9, 0xC8C3, 0x8BAA, 0xDAA8, + 0x8BAB, 0xC6FD, 0x8BAC, 0xD799, 0x8BAD, 0xD1B5, 0x8BAE, 0xD2E9, 0x8BAF, 0xD1B6, 0x8BB0, 0xBCC7, 0x8BB1, 0xD79A, 0x8BB2, 0xBDB2, + 0x8BB3, 0xBBE4, 0x8BB4, 0xDAA9, 0x8BB5, 0xDAAA, 0x8BB6, 0xD1C8, 0x8BB7, 0xDAAB, 0x8BB8, 0xD0ED, 0x8BB9, 0xB6EF, 0x8BBA, 0xC2DB, + 0x8BBB, 0xD79B, 0x8BBC, 0xCBCF, 0x8BBD, 0xB7ED, 0x8BBE, 0xC9E8, 0x8BBF, 0xB7C3, 0x8BC0, 0xBEF7, 0x8BC1, 0xD6A4, 0x8BC2, 0xDAAC, + 0x8BC3, 0xDAAD, 0x8BC4, 0xC6C0, 0x8BC5, 0xD7E7, 0x8BC6, 0xCAB6, 0x8BC7, 0xD79C, 0x8BC8, 0xD5A9, 0x8BC9, 0xCBDF, 0x8BCA, 0xD5EF, + 0x8BCB, 0xDAAE, 0x8BCC, 0xD6DF, 0x8BCD, 0xB4CA, 0x8BCE, 0xDAB0, 0x8BCF, 0xDAAF, 0x8BD0, 0xD79D, 0x8BD1, 0xD2EB, 0x8BD2, 0xDAB1, + 0x8BD3, 0xDAB2, 0x8BD4, 0xDAB3, 0x8BD5, 0xCAD4, 0x8BD6, 0xDAB4, 0x8BD7, 0xCAAB, 0x8BD8, 0xDAB5, 0x8BD9, 0xDAB6, 0x8BDA, 0xB3CF, + 0x8BDB, 0xD6EF, 0x8BDC, 0xDAB7, 0x8BDD, 0xBBB0, 0x8BDE, 0xB5AE, 0x8BDF, 0xDAB8, 0x8BE0, 0xDAB9, 0x8BE1, 0xB9EE, 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, 0x8BE4, 0xDABA, 0x8BE5, 0xB8C3, 0x8BE6, 0xCFEA, 0x8BE7, 0xB2EF, 0x8BE8, 0xDABB, 0x8BE9, 0xDABC, 0x8BEA, 0xD79E, + 0x8BEB, 0xBDEB, 0x8BEC, 0xCEDC, 0x8BED, 0xD3EF, 0x8BEE, 0xDABD, 0x8BEF, 0xCEF3, 0x8BF0, 0xDABE, 0x8BF1, 0xD3D5, 0x8BF2, 0xBBE5, + 0x8BF3, 0xDABF, 0x8BF4, 0xCBB5, 0x8BF5, 0xCBD0, 0x8BF6, 0xDAC0, 0x8BF7, 0xC7EB, 0x8BF8, 0xD6EE, 0x8BF9, 0xDAC1, 0x8BFA, 0xC5B5, + 0x8BFB, 0xB6C1, 0x8BFC, 0xDAC2, 0x8BFD, 0xB7CC, 0x8BFE, 0xBFCE, 0x8BFF, 0xDAC3, 0x8C00, 0xDAC4, 0x8C01, 0xCBAD, 0x8C02, 0xDAC5, + 0x8C03, 0xB5F7, 0x8C04, 0xDAC6, 0x8C05, 0xC1C2, 0x8C06, 0xD7BB, 0x8C07, 0xDAC7, 0x8C08, 0xCCB8, 0x8C09, 0xD79F, 0x8C0A, 0xD2EA, + 0x8C0B, 0xC4B1, 0x8C0C, 0xDAC8, 0x8C0D, 0xB5FD, 0x8C0E, 0xBBD1, 0x8C0F, 0xDAC9, 0x8C10, 0xD0B3, 0x8C11, 0xDACA, 0x8C12, 0xDACB, + 0x8C13, 0xCEBD, 0x8C14, 0xDACC, 0x8C15, 0xDACD, 0x8C16, 0xDACE, 0x8C17, 0xB2F7, 0x8C18, 0xDAD1, 0x8C19, 0xDACF, 0x8C1A, 0xD1E8, + 0x8C1B, 0xDAD0, 0x8C1C, 0xC3D5, 0x8C1D, 0xDAD2, 0x8C1E, 0xD7A0, 0x8C1F, 0xDAD3, 0x8C20, 0xDAD4, 0x8C21, 0xDAD5, 0x8C22, 0xD0BB, + 0x8C23, 0xD2A5, 0x8C24, 0xB0F9, 0x8C25, 0xDAD6, 0x8C26, 0xC7AB, 0x8C27, 0xDAD7, 0x8C28, 0xBDF7, 0x8C29, 0xC3A1, 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, 0x8C2C, 0xC3FD, 0x8C2D, 0xCCB7, 0x8C2E, 0xDADA, 0x8C2F, 0xDADB, 0x8C30, 0xC0BE, 0x8C31, 0xC6D7, 0x8C32, 0xDADC, + 0x8C33, 0xDADD, 0x8C34, 0xC7B4, 0x8C35, 0xDADE, 0x8C36, 0xDADF, 0x8C37, 0xB9C8, 0x8C38, 0xD840, 0x8C39, 0xD841, 0x8C3A, 0xD842, + 0x8C3B, 0xD843, 0x8C3C, 0xD844, 0x8C3D, 0xD845, 0x8C3E, 0xD846, 0x8C3F, 0xD847, 0x8C40, 0xD848, 0x8C41, 0xBBED, 0x8C42, 0xD849, + 0x8C43, 0xD84A, 0x8C44, 0xD84B, 0x8C45, 0xD84C, 0x8C46, 0xB6B9, 0x8C47, 0xF4F8, 0x8C48, 0xD84D, 0x8C49, 0xF4F9, 0x8C4A, 0xD84E, + 0x8C4B, 0xD84F, 0x8C4C, 0xCDE3, 0x8C4D, 0xD850, 0x8C4E, 0xD851, 0x8C4F, 0xD852, 0x8C50, 0xD853, 0x8C51, 0xD854, 0x8C52, 0xD855, + 0x8C53, 0xD856, 0x8C54, 0xD857, 0x8C55, 0xF5B9, 0x8C56, 0xD858, 0x8C57, 0xD859, 0x8C58, 0xD85A, 0x8C59, 0xD85B, 0x8C5A, 0xEBE0, + 0x8C5B, 0xD85C, 0x8C5C, 0xD85D, 0x8C5D, 0xD85E, 0x8C5E, 0xD85F, 0x8C5F, 0xD860, 0x8C60, 0xD861, 0x8C61, 0xCFF3, 0x8C62, 0xBBBF, + 0x8C63, 0xD862, 0x8C64, 0xD863, 0x8C65, 0xD864, 0x8C66, 0xD865, 0x8C67, 0xD866, 0x8C68, 0xD867, 0x8C69, 0xD868, 0x8C6A, 0xBAC0, + 0x8C6B, 0xD4A5, 0x8C6C, 0xD869, 0x8C6D, 0xD86A, 0x8C6E, 0xD86B, 0x8C6F, 0xD86C, 0x8C70, 0xD86D, 0x8C71, 0xD86E, 0x8C72, 0xD86F, + 0x8C73, 0xE1D9, 0x8C74, 0xD870, 0x8C75, 0xD871, 0x8C76, 0xD872, 0x8C77, 0xD873, 0x8C78, 0xF5F4, 0x8C79, 0xB1AA, 0x8C7A, 0xB2F2, + 0x8C7B, 0xD874, 0x8C7C, 0xD875, 0x8C7D, 0xD876, 0x8C7E, 0xD877, 0x8C7F, 0xD878, 0x8C80, 0xD879, 0x8C81, 0xD87A, 0x8C82, 0xF5F5, + 0x8C83, 0xD87B, 0x8C84, 0xD87C, 0x8C85, 0xF5F7, 0x8C86, 0xD87D, 0x8C87, 0xD87E, 0x8C88, 0xD880, 0x8C89, 0xBAD1, 0x8C8A, 0xF5F6, + 0x8C8B, 0xD881, 0x8C8C, 0xC3B2, 0x8C8D, 0xD882, 0x8C8E, 0xD883, 0x8C8F, 0xD884, 0x8C90, 0xD885, 0x8C91, 0xD886, 0x8C92, 0xD887, + 0x8C93, 0xD888, 0x8C94, 0xF5F9, 0x8C95, 0xD889, 0x8C96, 0xD88A, 0x8C97, 0xD88B, 0x8C98, 0xF5F8, 0x8C99, 0xD88C, 0x8C9A, 0xD88D, + 0x8C9B, 0xD88E, 0x8C9C, 0xD88F, 0x8C9D, 0xD890, 0x8C9E, 0xD891, 0x8C9F, 0xD892, 0x8CA0, 0xD893, 0x8CA1, 0xD894, 0x8CA2, 0xD895, + 0x8CA3, 0xD896, 0x8CA4, 0xD897, 0x8CA5, 0xD898, 0x8CA6, 0xD899, 0x8CA7, 0xD89A, 0x8CA8, 0xD89B, 0x8CA9, 0xD89C, 0x8CAA, 0xD89D, + 0x8CAB, 0xD89E, 0x8CAC, 0xD89F, 0x8CAD, 0xD8A0, 0x8CAE, 0xD940, 0x8CAF, 0xD941, 0x8CB0, 0xD942, 0x8CB1, 0xD943, 0x8CB2, 0xD944, + 0x8CB3, 0xD945, 0x8CB4, 0xD946, 0x8CB5, 0xD947, 0x8CB6, 0xD948, 0x8CB7, 0xD949, 0x8CB8, 0xD94A, 0x8CB9, 0xD94B, 0x8CBA, 0xD94C, + 0x8CBB, 0xD94D, 0x8CBC, 0xD94E, 0x8CBD, 0xD94F, 0x8CBE, 0xD950, 0x8CBF, 0xD951, 0x8CC0, 0xD952, 0x8CC1, 0xD953, 0x8CC2, 0xD954, + 0x8CC3, 0xD955, 0x8CC4, 0xD956, 0x8CC5, 0xD957, 0x8CC6, 0xD958, 0x8CC7, 0xD959, 0x8CC8, 0xD95A, 0x8CC9, 0xD95B, 0x8CCA, 0xD95C, + 0x8CCB, 0xD95D, 0x8CCC, 0xD95E, 0x8CCD, 0xD95F, 0x8CCE, 0xD960, 0x8CCF, 0xD961, 0x8CD0, 0xD962, 0x8CD1, 0xD963, 0x8CD2, 0xD964, + 0x8CD3, 0xD965, 0x8CD4, 0xD966, 0x8CD5, 0xD967, 0x8CD6, 0xD968, 0x8CD7, 0xD969, 0x8CD8, 0xD96A, 0x8CD9, 0xD96B, 0x8CDA, 0xD96C, + 0x8CDB, 0xD96D, 0x8CDC, 0xD96E, 0x8CDD, 0xD96F, 0x8CDE, 0xD970, 0x8CDF, 0xD971, 0x8CE0, 0xD972, 0x8CE1, 0xD973, 0x8CE2, 0xD974, + 0x8CE3, 0xD975, 0x8CE4, 0xD976, 0x8CE5, 0xD977, 0x8CE6, 0xD978, 0x8CE7, 0xD979, 0x8CE8, 0xD97A, 0x8CE9, 0xD97B, 0x8CEA, 0xD97C, + 0x8CEB, 0xD97D, 0x8CEC, 0xD97E, 0x8CED, 0xD980, 0x8CEE, 0xD981, 0x8CEF, 0xD982, 0x8CF0, 0xD983, 0x8CF1, 0xD984, 0x8CF2, 0xD985, + 0x8CF3, 0xD986, 0x8CF4, 0xD987, 0x8CF5, 0xD988, 0x8CF6, 0xD989, 0x8CF7, 0xD98A, 0x8CF8, 0xD98B, 0x8CF9, 0xD98C, 0x8CFA, 0xD98D, + 0x8CFB, 0xD98E, 0x8CFC, 0xD98F, 0x8CFD, 0xD990, 0x8CFE, 0xD991, 0x8CFF, 0xD992, 0x8D00, 0xD993, 0x8D01, 0xD994, 0x8D02, 0xD995, + 0x8D03, 0xD996, 0x8D04, 0xD997, 0x8D05, 0xD998, 0x8D06, 0xD999, 0x8D07, 0xD99A, 0x8D08, 0xD99B, 0x8D09, 0xD99C, 0x8D0A, 0xD99D, + 0x8D0B, 0xD99E, 0x8D0C, 0xD99F, 0x8D0D, 0xD9A0, 0x8D0E, 0xDA40, 0x8D0F, 0xDA41, 0x8D10, 0xDA42, 0x8D11, 0xDA43, 0x8D12, 0xDA44, + 0x8D13, 0xDA45, 0x8D14, 0xDA46, 0x8D15, 0xDA47, 0x8D16, 0xDA48, 0x8D17, 0xDA49, 0x8D18, 0xDA4A, 0x8D19, 0xDA4B, 0x8D1A, 0xDA4C, + 0x8D1B, 0xDA4D, 0x8D1C, 0xDA4E, 0x8D1D, 0xB1B4, 0x8D1E, 0xD5EA, 0x8D1F, 0xB8BA, 0x8D20, 0xDA4F, 0x8D21, 0xB9B1, 0x8D22, 0xB2C6, + 0x8D23, 0xD4F0, 0x8D24, 0xCFCD, 0x8D25, 0xB0DC, 0x8D26, 0xD5CB, 0x8D27, 0xBBF5, 0x8D28, 0xD6CA, 0x8D29, 0xB7B7, 0x8D2A, 0xCCB0, + 0x8D2B, 0xC6B6, 0x8D2C, 0xB1E1, 0x8D2D, 0xB9BA, 0x8D2E, 0xD6FC, 0x8D2F, 0xB9E1, 0x8D30, 0xB7A1, 0x8D31, 0xBCFA, 0x8D32, 0xEADA, + 0x8D33, 0xEADB, 0x8D34, 0xCCF9, 0x8D35, 0xB9F3, 0x8D36, 0xEADC, 0x8D37, 0xB4FB, 0x8D38, 0xC3B3, 0x8D39, 0xB7D1, 0x8D3A, 0xBAD8, + 0x8D3B, 0xEADD, 0x8D3C, 0xD4F4, 0x8D3D, 0xEADE, 0x8D3E, 0xBCD6, 0x8D3F, 0xBBDF, 0x8D40, 0xEADF, 0x8D41, 0xC1DE, 0x8D42, 0xC2B8, + 0x8D43, 0xD4DF, 0x8D44, 0xD7CA, 0x8D45, 0xEAE0, 0x8D46, 0xEAE1, 0x8D47, 0xEAE4, 0x8D48, 0xEAE2, 0x8D49, 0xEAE3, 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, 0x8D4C, 0xB6C4, 0x8D4D, 0xEAE5, 0x8D4E, 0xCAEA, 0x8D4F, 0xC9CD, 0x8D50, 0xB4CD, 0x8D51, 0xDA50, 0x8D52, 0xDA51, + 0x8D53, 0xE2D9, 0x8D54, 0xC5E2, 0x8D55, 0xEAE6, 0x8D56, 0xC0B5, 0x8D57, 0xDA52, 0x8D58, 0xD7B8, 0x8D59, 0xEAE7, 0x8D5A, 0xD7AC, + 0x8D5B, 0xC8FC, 0x8D5C, 0xD8D3, 0x8D5D, 0xD8CD, 0x8D5E, 0xD4DE, 0x8D5F, 0xDA53, 0x8D60, 0xD4F9, 0x8D61, 0xC9C4, 0x8D62, 0xD3AE, + 0x8D63, 0xB8D3, 0x8D64, 0xB3E0, 0x8D65, 0xDA54, 0x8D66, 0xC9E2, 0x8D67, 0xF4F6, 0x8D68, 0xDA55, 0x8D69, 0xDA56, 0x8D6A, 0xDA57, + 0x8D6B, 0xBAD5, 0x8D6C, 0xDA58, 0x8D6D, 0xF4F7, 0x8D6E, 0xDA59, 0x8D6F, 0xDA5A, 0x8D70, 0xD7DF, 0x8D71, 0xDA5B, 0x8D72, 0xDA5C, + 0x8D73, 0xF4F1, 0x8D74, 0xB8B0, 0x8D75, 0xD5D4, 0x8D76, 0xB8CF, 0x8D77, 0xC6F0, 0x8D78, 0xDA5D, 0x8D79, 0xDA5E, 0x8D7A, 0xDA5F, + 0x8D7B, 0xDA60, 0x8D7C, 0xDA61, 0x8D7D, 0xDA62, 0x8D7E, 0xDA63, 0x8D7F, 0xDA64, 0x8D80, 0xDA65, 0x8D81, 0xB3C3, 0x8D82, 0xDA66, + 0x8D83, 0xDA67, 0x8D84, 0xF4F2, 0x8D85, 0xB3AC, 0x8D86, 0xDA68, 0x8D87, 0xDA69, 0x8D88, 0xDA6A, 0x8D89, 0xDA6B, 0x8D8A, 0xD4BD, + 0x8D8B, 0xC7F7, 0x8D8C, 0xDA6C, 0x8D8D, 0xDA6D, 0x8D8E, 0xDA6E, 0x8D8F, 0xDA6F, 0x8D90, 0xDA70, 0x8D91, 0xF4F4, 0x8D92, 0xDA71, + 0x8D93, 0xDA72, 0x8D94, 0xF4F3, 0x8D95, 0xDA73, 0x8D96, 0xDA74, 0x8D97, 0xDA75, 0x8D98, 0xDA76, 0x8D99, 0xDA77, 0x8D9A, 0xDA78, + 0x8D9B, 0xDA79, 0x8D9C, 0xDA7A, 0x8D9D, 0xDA7B, 0x8D9E, 0xDA7C, 0x8D9F, 0xCCCB, 0x8DA0, 0xDA7D, 0x8DA1, 0xDA7E, 0x8DA2, 0xDA80, + 0x8DA3, 0xC8A4, 0x8DA4, 0xDA81, 0x8DA5, 0xDA82, 0x8DA6, 0xDA83, 0x8DA7, 0xDA84, 0x8DA8, 0xDA85, 0x8DA9, 0xDA86, 0x8DAA, 0xDA87, + 0x8DAB, 0xDA88, 0x8DAC, 0xDA89, 0x8DAD, 0xDA8A, 0x8DAE, 0xDA8B, 0x8DAF, 0xDA8C, 0x8DB0, 0xDA8D, 0x8DB1, 0xF4F5, 0x8DB2, 0xDA8E, + 0x8DB3, 0xD7E3, 0x8DB4, 0xC5BF, 0x8DB5, 0xF5C0, 0x8DB6, 0xDA8F, 0x8DB7, 0xDA90, 0x8DB8, 0xF5BB, 0x8DB9, 0xDA91, 0x8DBA, 0xF5C3, + 0x8DBB, 0xDA92, 0x8DBC, 0xF5C2, 0x8DBD, 0xDA93, 0x8DBE, 0xD6BA, 0x8DBF, 0xF5C1, 0x8DC0, 0xDA94, 0x8DC1, 0xDA95, 0x8DC2, 0xDA96, + 0x8DC3, 0xD4BE, 0x8DC4, 0xF5C4, 0x8DC5, 0xDA97, 0x8DC6, 0xF5CC, 0x8DC7, 0xDA98, 0x8DC8, 0xDA99, 0x8DC9, 0xDA9A, 0x8DCA, 0xDA9B, + 0x8DCB, 0xB0CF, 0x8DCC, 0xB5F8, 0x8DCD, 0xDA9C, 0x8DCE, 0xF5C9, 0x8DCF, 0xF5CA, 0x8DD0, 0xDA9D, 0x8DD1, 0xC5DC, 0x8DD2, 0xDA9E, + 0x8DD3, 0xDA9F, 0x8DD4, 0xDAA0, 0x8DD5, 0xDB40, 0x8DD6, 0xF5C5, 0x8DD7, 0xF5C6, 0x8DD8, 0xDB41, 0x8DD9, 0xDB42, 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, 0x8DDC, 0xDB43, 0x8DDD, 0xBEE0, 0x8DDE, 0xF5C8, 0x8DDF, 0xB8FA, 0x8DE0, 0xDB44, 0x8DE1, 0xDB45, 0x8DE2, 0xDB46, + 0x8DE3, 0xF5D0, 0x8DE4, 0xF5D3, 0x8DE5, 0xDB47, 0x8DE6, 0xDB48, 0x8DE7, 0xDB49, 0x8DE8, 0xBFE7, 0x8DE9, 0xDB4A, 0x8DEA, 0xB9F2, + 0x8DEB, 0xF5BC, 0x8DEC, 0xF5CD, 0x8DED, 0xDB4B, 0x8DEE, 0xDB4C, 0x8DEF, 0xC2B7, 0x8DF0, 0xDB4D, 0x8DF1, 0xDB4E, 0x8DF2, 0xDB4F, + 0x8DF3, 0xCCF8, 0x8DF4, 0xDB50, 0x8DF5, 0xBCF9, 0x8DF6, 0xDB51, 0x8DF7, 0xF5CE, 0x8DF8, 0xF5CF, 0x8DF9, 0xF5D1, 0x8DFA, 0xB6E5, + 0x8DFB, 0xF5D2, 0x8DFC, 0xDB52, 0x8DFD, 0xF5D5, 0x8DFE, 0xDB53, 0x8DFF, 0xDB54, 0x8E00, 0xDB55, 0x8E01, 0xDB56, 0x8E02, 0xDB57, + 0x8E03, 0xDB58, 0x8E04, 0xDB59, 0x8E05, 0xF5BD, 0x8E06, 0xDB5A, 0x8E07, 0xDB5B, 0x8E08, 0xDB5C, 0x8E09, 0xF5D4, 0x8E0A, 0xD3BB, + 0x8E0B, 0xDB5D, 0x8E0C, 0xB3EC, 0x8E0D, 0xDB5E, 0x8E0E, 0xDB5F, 0x8E0F, 0xCCA4, 0x8E10, 0xDB60, 0x8E11, 0xDB61, 0x8E12, 0xDB62, + 0x8E13, 0xDB63, 0x8E14, 0xF5D6, 0x8E15, 0xDB64, 0x8E16, 0xDB65, 0x8E17, 0xDB66, 0x8E18, 0xDB67, 0x8E19, 0xDB68, 0x8E1A, 0xDB69, + 0x8E1B, 0xDB6A, 0x8E1C, 0xDB6B, 0x8E1D, 0xF5D7, 0x8E1E, 0xBEE1, 0x8E1F, 0xF5D8, 0x8E20, 0xDB6C, 0x8E21, 0xDB6D, 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, 0x8E24, 0xDB6E, 0x8E25, 0xDB6F, 0x8E26, 0xDB70, 0x8E27, 0xDB71, 0x8E28, 0xDB72, 0x8E29, 0xB2C8, 0x8E2A, 0xD7D9, + 0x8E2B, 0xDB73, 0x8E2C, 0xF5D9, 0x8E2D, 0xDB74, 0x8E2E, 0xF5DA, 0x8E2F, 0xF5DC, 0x8E30, 0xDB75, 0x8E31, 0xF5E2, 0x8E32, 0xDB76, + 0x8E33, 0xDB77, 0x8E34, 0xDB78, 0x8E35, 0xF5E0, 0x8E36, 0xDB79, 0x8E37, 0xDB7A, 0x8E38, 0xDB7B, 0x8E39, 0xF5DF, 0x8E3A, 0xF5DD, + 0x8E3B, 0xDB7C, 0x8E3C, 0xDB7D, 0x8E3D, 0xF5E1, 0x8E3E, 0xDB7E, 0x8E3F, 0xDB80, 0x8E40, 0xF5DE, 0x8E41, 0xF5E4, 0x8E42, 0xF5E5, + 0x8E43, 0xDB81, 0x8E44, 0xCCE3, 0x8E45, 0xDB82, 0x8E46, 0xDB83, 0x8E47, 0xE5BF, 0x8E48, 0xB5B8, 0x8E49, 0xF5E3, 0x8E4A, 0xF5E8, + 0x8E4B, 0xCCA3, 0x8E4C, 0xDB84, 0x8E4D, 0xDB85, 0x8E4E, 0xDB86, 0x8E4F, 0xDB87, 0x8E50, 0xDB88, 0x8E51, 0xF5E6, 0x8E52, 0xF5E7, + 0x8E53, 0xDB89, 0x8E54, 0xDB8A, 0x8E55, 0xDB8B, 0x8E56, 0xDB8C, 0x8E57, 0xDB8D, 0x8E58, 0xDB8E, 0x8E59, 0xF5BE, 0x8E5A, 0xDB8F, + 0x8E5B, 0xDB90, 0x8E5C, 0xDB91, 0x8E5D, 0xDB92, 0x8E5E, 0xDB93, 0x8E5F, 0xDB94, 0x8E60, 0xDB95, 0x8E61, 0xDB96, 0x8E62, 0xDB97, + 0x8E63, 0xDB98, 0x8E64, 0xDB99, 0x8E65, 0xDB9A, 0x8E66, 0xB1C4, 0x8E67, 0xDB9B, 0x8E68, 0xDB9C, 0x8E69, 0xF5BF, 0x8E6A, 0xDB9D, + 0x8E6B, 0xDB9E, 0x8E6C, 0xB5C5, 0x8E6D, 0xB2E4, 0x8E6E, 0xDB9F, 0x8E6F, 0xF5EC, 0x8E70, 0xF5E9, 0x8E71, 0xDBA0, 0x8E72, 0xB6D7, + 0x8E73, 0xDC40, 0x8E74, 0xF5ED, 0x8E75, 0xDC41, 0x8E76, 0xF5EA, 0x8E77, 0xDC42, 0x8E78, 0xDC43, 0x8E79, 0xDC44, 0x8E7A, 0xDC45, + 0x8E7B, 0xDC46, 0x8E7C, 0xF5EB, 0x8E7D, 0xDC47, 0x8E7E, 0xDC48, 0x8E7F, 0xB4DA, 0x8E80, 0xDC49, 0x8E81, 0xD4EA, 0x8E82, 0xDC4A, + 0x8E83, 0xDC4B, 0x8E84, 0xDC4C, 0x8E85, 0xF5EE, 0x8E86, 0xDC4D, 0x8E87, 0xB3F9, 0x8E88, 0xDC4E, 0x8E89, 0xDC4F, 0x8E8A, 0xDC50, + 0x8E8B, 0xDC51, 0x8E8C, 0xDC52, 0x8E8D, 0xDC53, 0x8E8E, 0xDC54, 0x8E8F, 0xF5EF, 0x8E90, 0xF5F1, 0x8E91, 0xDC55, 0x8E92, 0xDC56, + 0x8E93, 0xDC57, 0x8E94, 0xF5F0, 0x8E95, 0xDC58, 0x8E96, 0xDC59, 0x8E97, 0xDC5A, 0x8E98, 0xDC5B, 0x8E99, 0xDC5C, 0x8E9A, 0xDC5D, + 0x8E9B, 0xDC5E, 0x8E9C, 0xF5F2, 0x8E9D, 0xDC5F, 0x8E9E, 0xF5F3, 0x8E9F, 0xDC60, 0x8EA0, 0xDC61, 0x8EA1, 0xDC62, 0x8EA2, 0xDC63, + 0x8EA3, 0xDC64, 0x8EA4, 0xDC65, 0x8EA5, 0xDC66, 0x8EA6, 0xDC67, 0x8EA7, 0xDC68, 0x8EA8, 0xDC69, 0x8EA9, 0xDC6A, 0x8EAA, 0xDC6B, + 0x8EAB, 0xC9ED, 0x8EAC, 0xB9AA, 0x8EAD, 0xDC6C, 0x8EAE, 0xDC6D, 0x8EAF, 0xC7FB, 0x8EB0, 0xDC6E, 0x8EB1, 0xDC6F, 0x8EB2, 0xB6E3, + 0x8EB3, 0xDC70, 0x8EB4, 0xDC71, 0x8EB5, 0xDC72, 0x8EB6, 0xDC73, 0x8EB7, 0xDC74, 0x8EB8, 0xDC75, 0x8EB9, 0xDC76, 0x8EBA, 0xCCC9, + 0x8EBB, 0xDC77, 0x8EBC, 0xDC78, 0x8EBD, 0xDC79, 0x8EBE, 0xDC7A, 0x8EBF, 0xDC7B, 0x8EC0, 0xDC7C, 0x8EC1, 0xDC7D, 0x8EC2, 0xDC7E, + 0x8EC3, 0xDC80, 0x8EC4, 0xDC81, 0x8EC5, 0xDC82, 0x8EC6, 0xDC83, 0x8EC7, 0xDC84, 0x8EC8, 0xDC85, 0x8EC9, 0xDC86, 0x8ECA, 0xDC87, + 0x8ECB, 0xDC88, 0x8ECC, 0xDC89, 0x8ECD, 0xDC8A, 0x8ECE, 0xEAA6, 0x8ECF, 0xDC8B, 0x8ED0, 0xDC8C, 0x8ED1, 0xDC8D, 0x8ED2, 0xDC8E, + 0x8ED3, 0xDC8F, 0x8ED4, 0xDC90, 0x8ED5, 0xDC91, 0x8ED6, 0xDC92, 0x8ED7, 0xDC93, 0x8ED8, 0xDC94, 0x8ED9, 0xDC95, 0x8EDA, 0xDC96, + 0x8EDB, 0xDC97, 0x8EDC, 0xDC98, 0x8EDD, 0xDC99, 0x8EDE, 0xDC9A, 0x8EDF, 0xDC9B, 0x8EE0, 0xDC9C, 0x8EE1, 0xDC9D, 0x8EE2, 0xDC9E, + 0x8EE3, 0xDC9F, 0x8EE4, 0xDCA0, 0x8EE5, 0xDD40, 0x8EE6, 0xDD41, 0x8EE7, 0xDD42, 0x8EE8, 0xDD43, 0x8EE9, 0xDD44, 0x8EEA, 0xDD45, + 0x8EEB, 0xDD46, 0x8EEC, 0xDD47, 0x8EED, 0xDD48, 0x8EEE, 0xDD49, 0x8EEF, 0xDD4A, 0x8EF0, 0xDD4B, 0x8EF1, 0xDD4C, 0x8EF2, 0xDD4D, + 0x8EF3, 0xDD4E, 0x8EF4, 0xDD4F, 0x8EF5, 0xDD50, 0x8EF6, 0xDD51, 0x8EF7, 0xDD52, 0x8EF8, 0xDD53, 0x8EF9, 0xDD54, 0x8EFA, 0xDD55, + 0x8EFB, 0xDD56, 0x8EFC, 0xDD57, 0x8EFD, 0xDD58, 0x8EFE, 0xDD59, 0x8EFF, 0xDD5A, 0x8F00, 0xDD5B, 0x8F01, 0xDD5C, 0x8F02, 0xDD5D, + 0x8F03, 0xDD5E, 0x8F04, 0xDD5F, 0x8F05, 0xDD60, 0x8F06, 0xDD61, 0x8F07, 0xDD62, 0x8F08, 0xDD63, 0x8F09, 0xDD64, 0x8F0A, 0xDD65, + 0x8F0B, 0xDD66, 0x8F0C, 0xDD67, 0x8F0D, 0xDD68, 0x8F0E, 0xDD69, 0x8F0F, 0xDD6A, 0x8F10, 0xDD6B, 0x8F11, 0xDD6C, 0x8F12, 0xDD6D, + 0x8F13, 0xDD6E, 0x8F14, 0xDD6F, 0x8F15, 0xDD70, 0x8F16, 0xDD71, 0x8F17, 0xDD72, 0x8F18, 0xDD73, 0x8F19, 0xDD74, 0x8F1A, 0xDD75, + 0x8F1B, 0xDD76, 0x8F1C, 0xDD77, 0x8F1D, 0xDD78, 0x8F1E, 0xDD79, 0x8F1F, 0xDD7A, 0x8F20, 0xDD7B, 0x8F21, 0xDD7C, 0x8F22, 0xDD7D, + 0x8F23, 0xDD7E, 0x8F24, 0xDD80, 0x8F25, 0xDD81, 0x8F26, 0xDD82, 0x8F27, 0xDD83, 0x8F28, 0xDD84, 0x8F29, 0xDD85, 0x8F2A, 0xDD86, + 0x8F2B, 0xDD87, 0x8F2C, 0xDD88, 0x8F2D, 0xDD89, 0x8F2E, 0xDD8A, 0x8F2F, 0xDD8B, 0x8F30, 0xDD8C, 0x8F31, 0xDD8D, 0x8F32, 0xDD8E, + 0x8F33, 0xDD8F, 0x8F34, 0xDD90, 0x8F35, 0xDD91, 0x8F36, 0xDD92, 0x8F37, 0xDD93, 0x8F38, 0xDD94, 0x8F39, 0xDD95, 0x8F3A, 0xDD96, + 0x8F3B, 0xDD97, 0x8F3C, 0xDD98, 0x8F3D, 0xDD99, 0x8F3E, 0xDD9A, 0x8F3F, 0xDD9B, 0x8F40, 0xDD9C, 0x8F41, 0xDD9D, 0x8F42, 0xDD9E, + 0x8F43, 0xDD9F, 0x8F44, 0xDDA0, 0x8F45, 0xDE40, 0x8F46, 0xDE41, 0x8F47, 0xDE42, 0x8F48, 0xDE43, 0x8F49, 0xDE44, 0x8F4A, 0xDE45, + 0x8F4B, 0xDE46, 0x8F4C, 0xDE47, 0x8F4D, 0xDE48, 0x8F4E, 0xDE49, 0x8F4F, 0xDE4A, 0x8F50, 0xDE4B, 0x8F51, 0xDE4C, 0x8F52, 0xDE4D, + 0x8F53, 0xDE4E, 0x8F54, 0xDE4F, 0x8F55, 0xDE50, 0x8F56, 0xDE51, 0x8F57, 0xDE52, 0x8F58, 0xDE53, 0x8F59, 0xDE54, 0x8F5A, 0xDE55, + 0x8F5B, 0xDE56, 0x8F5C, 0xDE57, 0x8F5D, 0xDE58, 0x8F5E, 0xDE59, 0x8F5F, 0xDE5A, 0x8F60, 0xDE5B, 0x8F61, 0xDE5C, 0x8F62, 0xDE5D, + 0x8F63, 0xDE5E, 0x8F64, 0xDE5F, 0x8F65, 0xDE60, 0x8F66, 0xB3B5, 0x8F67, 0xD4FE, 0x8F68, 0xB9EC, 0x8F69, 0xD0F9, 0x8F6A, 0xDE61, + 0x8F6B, 0xE9ED, 0x8F6C, 0xD7AA, 0x8F6D, 0xE9EE, 0x8F6E, 0xC2D6, 0x8F6F, 0xC8ED, 0x8F70, 0xBAE4, 0x8F71, 0xE9EF, 0x8F72, 0xE9F0, + 0x8F73, 0xE9F1, 0x8F74, 0xD6E1, 0x8F75, 0xE9F2, 0x8F76, 0xE9F3, 0x8F77, 0xE9F5, 0x8F78, 0xE9F4, 0x8F79, 0xE9F6, 0x8F7A, 0xE9F7, + 0x8F7B, 0xC7E1, 0x8F7C, 0xE9F8, 0x8F7D, 0xD4D8, 0x8F7E, 0xE9F9, 0x8F7F, 0xBDCE, 0x8F80, 0xDE62, 0x8F81, 0xE9FA, 0x8F82, 0xE9FB, + 0x8F83, 0xBDCF, 0x8F84, 0xE9FC, 0x8F85, 0xB8A8, 0x8F86, 0xC1BE, 0x8F87, 0xE9FD, 0x8F88, 0xB1B2, 0x8F89, 0xBBD4, 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, 0x8F8C, 0xDE63, 0x8F8D, 0xEAA1, 0x8F8E, 0xEAA2, 0x8F8F, 0xEAA3, 0x8F90, 0xB7F8, 0x8F91, 0xBCAD, 0x8F92, 0xDE64, + 0x8F93, 0xCAE4, 0x8F94, 0xE0CE, 0x8F95, 0xD4AF, 0x8F96, 0xCFBD, 0x8F97, 0xD5B7, 0x8F98, 0xEAA4, 0x8F99, 0xD5DE, 0x8F9A, 0xEAA5, + 0x8F9B, 0xD0C1, 0x8F9C, 0xB9BC, 0x8F9D, 0xDE65, 0x8F9E, 0xB4C7, 0x8F9F, 0xB1D9, 0x8FA0, 0xDE66, 0x8FA1, 0xDE67, 0x8FA2, 0xDE68, + 0x8FA3, 0xC0B1, 0x8FA4, 0xDE69, 0x8FA5, 0xDE6A, 0x8FA6, 0xDE6B, 0x8FA7, 0xDE6C, 0x8FA8, 0xB1E6, 0x8FA9, 0xB1E7, 0x8FAA, 0xDE6D, + 0x8FAB, 0xB1E8, 0x8FAC, 0xDE6E, 0x8FAD, 0xDE6F, 0x8FAE, 0xDE70, 0x8FAF, 0xDE71, 0x8FB0, 0xB3BD, 0x8FB1, 0xC8E8, 0x8FB2, 0xDE72, + 0x8FB3, 0xDE73, 0x8FB4, 0xDE74, 0x8FB5, 0xDE75, 0x8FB6, 0xE5C1, 0x8FB7, 0xDE76, 0x8FB8, 0xDE77, 0x8FB9, 0xB1DF, 0x8FBA, 0xDE78, + 0x8FBB, 0xDE79, 0x8FBC, 0xDE7A, 0x8FBD, 0xC1C9, 0x8FBE, 0xB4EF, 0x8FBF, 0xDE7B, 0x8FC0, 0xDE7C, 0x8FC1, 0xC7A8, 0x8FC2, 0xD3D8, + 0x8FC3, 0xDE7D, 0x8FC4, 0xC6F9, 0x8FC5, 0xD1B8, 0x8FC6, 0xDE7E, 0x8FC7, 0xB9FD, 0x8FC8, 0xC2F5, 0x8FC9, 0xDE80, 0x8FCA, 0xDE81, + 0x8FCB, 0xDE82, 0x8FCC, 0xDE83, 0x8FCD, 0xDE84, 0x8FCE, 0xD3AD, 0x8FCF, 0xDE85, 0x8FD0, 0xD4CB, 0x8FD1, 0xBDFC, 0x8FD2, 0xDE86, + 0x8FD3, 0xE5C2, 0x8FD4, 0xB7B5, 0x8FD5, 0xE5C3, 0x8FD6, 0xDE87, 0x8FD7, 0xDE88, 0x8FD8, 0xBBB9, 0x8FD9, 0xD5E2, 0x8FDA, 0xDE89, + 0x8FDB, 0xBDF8, 0x8FDC, 0xD4B6, 0x8FDD, 0xCEA5, 0x8FDE, 0xC1AC, 0x8FDF, 0xB3D9, 0x8FE0, 0xDE8A, 0x8FE1, 0xDE8B, 0x8FE2, 0xCCF6, + 0x8FE3, 0xDE8C, 0x8FE4, 0xE5C6, 0x8FE5, 0xE5C4, 0x8FE6, 0xE5C8, 0x8FE7, 0xDE8D, 0x8FE8, 0xE5CA, 0x8FE9, 0xE5C7, 0x8FEA, 0xB5CF, + 0x8FEB, 0xC6C8, 0x8FEC, 0xDE8E, 0x8FED, 0xB5FC, 0x8FEE, 0xE5C5, 0x8FEF, 0xDE8F, 0x8FF0, 0xCAF6, 0x8FF1, 0xDE90, 0x8FF2, 0xDE91, + 0x8FF3, 0xE5C9, 0x8FF4, 0xDE92, 0x8FF5, 0xDE93, 0x8FF6, 0xDE94, 0x8FF7, 0xC3D4, 0x8FF8, 0xB1C5, 0x8FF9, 0xBCA3, 0x8FFA, 0xDE95, + 0x8FFB, 0xDE96, 0x8FFC, 0xDE97, 0x8FFD, 0xD7B7, 0x8FFE, 0xDE98, 0x8FFF, 0xDE99, 0x9000, 0xCDCB, 0x9001, 0xCBCD, 0x9002, 0xCACA, + 0x9003, 0xCCD3, 0x9004, 0xE5CC, 0x9005, 0xE5CB, 0x9006, 0xC4E6, 0x9007, 0xDE9A, 0x9008, 0xDE9B, 0x9009, 0xD1A1, 0x900A, 0xD1B7, + 0x900B, 0xE5CD, 0x900C, 0xDE9C, 0x900D, 0xE5D0, 0x900E, 0xDE9D, 0x900F, 0xCDB8, 0x9010, 0xD6F0, 0x9011, 0xE5CF, 0x9012, 0xB5DD, + 0x9013, 0xDE9E, 0x9014, 0xCDBE, 0x9015, 0xDE9F, 0x9016, 0xE5D1, 0x9017, 0xB6BA, 0x9018, 0xDEA0, 0x9019, 0xDF40, 0x901A, 0xCDA8, + 0x901B, 0xB9E4, 0x901C, 0xDF41, 0x901D, 0xCAC5, 0x901E, 0xB3D1, 0x901F, 0xCBD9, 0x9020, 0xD4EC, 0x9021, 0xE5D2, 0x9022, 0xB7EA, + 0x9023, 0xDF42, 0x9024, 0xDF43, 0x9025, 0xDF44, 0x9026, 0xE5CE, 0x9027, 0xDF45, 0x9028, 0xDF46, 0x9029, 0xDF47, 0x902A, 0xDF48, + 0x902B, 0xDF49, 0x902C, 0xDF4A, 0x902D, 0xE5D5, 0x902E, 0xB4FE, 0x902F, 0xE5D6, 0x9030, 0xDF4B, 0x9031, 0xDF4C, 0x9032, 0xDF4D, + 0x9033, 0xDF4E, 0x9034, 0xDF4F, 0x9035, 0xE5D3, 0x9036, 0xE5D4, 0x9037, 0xDF50, 0x9038, 0xD2DD, 0x9039, 0xDF51, 0x903A, 0xDF52, + 0x903B, 0xC2DF, 0x903C, 0xB1C6, 0x903D, 0xDF53, 0x903E, 0xD3E2, 0x903F, 0xDF54, 0x9040, 0xDF55, 0x9041, 0xB6DD, 0x9042, 0xCBEC, + 0x9043, 0xDF56, 0x9044, 0xE5D7, 0x9045, 0xDF57, 0x9046, 0xDF58, 0x9047, 0xD3F6, 0x9048, 0xDF59, 0x9049, 0xDF5A, 0x904A, 0xDF5B, + 0x904B, 0xDF5C, 0x904C, 0xDF5D, 0x904D, 0xB1E9, 0x904E, 0xDF5E, 0x904F, 0xB6F4, 0x9050, 0xE5DA, 0x9051, 0xE5D8, 0x9052, 0xE5D9, + 0x9053, 0xB5C0, 0x9054, 0xDF5F, 0x9055, 0xDF60, 0x9056, 0xDF61, 0x9057, 0xD2C5, 0x9058, 0xE5DC, 0x9059, 0xDF62, 0x905A, 0xDF63, + 0x905B, 0xE5DE, 0x905C, 0xDF64, 0x905D, 0xDF65, 0x905E, 0xDF66, 0x905F, 0xDF67, 0x9060, 0xDF68, 0x9061, 0xDF69, 0x9062, 0xE5DD, + 0x9063, 0xC7B2, 0x9064, 0xDF6A, 0x9065, 0xD2A3, 0x9066, 0xDF6B, 0x9067, 0xDF6C, 0x9068, 0xE5DB, 0x9069, 0xDF6D, 0x906A, 0xDF6E, + 0x906B, 0xDF6F, 0x906C, 0xDF70, 0x906D, 0xD4E2, 0x906E, 0xD5DA, 0x906F, 0xDF71, 0x9070, 0xDF72, 0x9071, 0xDF73, 0x9072, 0xDF74, + 0x9073, 0xDF75, 0x9074, 0xE5E0, 0x9075, 0xD7F1, 0x9076, 0xDF76, 0x9077, 0xDF77, 0x9078, 0xDF78, 0x9079, 0xDF79, 0x907A, 0xDF7A, + 0x907B, 0xDF7B, 0x907C, 0xDF7C, 0x907D, 0xE5E1, 0x907E, 0xDF7D, 0x907F, 0xB1DC, 0x9080, 0xD1FB, 0x9081, 0xDF7E, 0x9082, 0xE5E2, + 0x9083, 0xE5E4, 0x9084, 0xDF80, 0x9085, 0xDF81, 0x9086, 0xDF82, 0x9087, 0xDF83, 0x9088, 0xE5E3, 0x9089, 0xDF84, 0x908A, 0xDF85, + 0x908B, 0xE5E5, 0x908C, 0xDF86, 0x908D, 0xDF87, 0x908E, 0xDF88, 0x908F, 0xDF89, 0x9090, 0xDF8A, 0x9091, 0xD2D8, 0x9092, 0xDF8B, + 0x9093, 0xB5CB, 0x9094, 0xDF8C, 0x9095, 0xE7DF, 0x9096, 0xDF8D, 0x9097, 0xDAF5, 0x9098, 0xDF8E, 0x9099, 0xDAF8, 0x909A, 0xDF8F, + 0x909B, 0xDAF6, 0x909C, 0xDF90, 0x909D, 0xDAF7, 0x909E, 0xDF91, 0x909F, 0xDF92, 0x90A0, 0xDF93, 0x90A1, 0xDAFA, 0x90A2, 0xD0CF, + 0x90A3, 0xC4C7, 0x90A4, 0xDF94, 0x90A5, 0xDF95, 0x90A6, 0xB0EE, 0x90A7, 0xDF96, 0x90A8, 0xDF97, 0x90A9, 0xDF98, 0x90AA, 0xD0B0, + 0x90AB, 0xDF99, 0x90AC, 0xDAF9, 0x90AD, 0xDF9A, 0x90AE, 0xD3CA, 0x90AF, 0xBAAA, 0x90B0, 0xDBA2, 0x90B1, 0xC7F1, 0x90B2, 0xDF9B, + 0x90B3, 0xDAFC, 0x90B4, 0xDAFB, 0x90B5, 0xC9DB, 0x90B6, 0xDAFD, 0x90B7, 0xDF9C, 0x90B8, 0xDBA1, 0x90B9, 0xD7DE, 0x90BA, 0xDAFE, + 0x90BB, 0xC1DA, 0x90BC, 0xDF9D, 0x90BD, 0xDF9E, 0x90BE, 0xDBA5, 0x90BF, 0xDF9F, 0x90C0, 0xDFA0, 0x90C1, 0xD3F4, 0x90C2, 0xE040, + 0x90C3, 0xE041, 0x90C4, 0xDBA7, 0x90C5, 0xDBA4, 0x90C6, 0xE042, 0x90C7, 0xDBA8, 0x90C8, 0xE043, 0x90C9, 0xE044, 0x90CA, 0xBDBC, + 0x90CB, 0xE045, 0x90CC, 0xE046, 0x90CD, 0xE047, 0x90CE, 0xC0C9, 0x90CF, 0xDBA3, 0x90D0, 0xDBA6, 0x90D1, 0xD6A3, 0x90D2, 0xE048, + 0x90D3, 0xDBA9, 0x90D4, 0xE049, 0x90D5, 0xE04A, 0x90D6, 0xE04B, 0x90D7, 0xDBAD, 0x90D8, 0xE04C, 0x90D9, 0xE04D, 0x90DA, 0xE04E, + 0x90DB, 0xDBAE, 0x90DC, 0xDBAC, 0x90DD, 0xBAC2, 0x90DE, 0xE04F, 0x90DF, 0xE050, 0x90E0, 0xE051, 0x90E1, 0xBFA4, 0x90E2, 0xDBAB, + 0x90E3, 0xE052, 0x90E4, 0xE053, 0x90E5, 0xE054, 0x90E6, 0xDBAA, 0x90E7, 0xD4C7, 0x90E8, 0xB2BF, 0x90E9, 0xE055, 0x90EA, 0xE056, + 0x90EB, 0xDBAF, 0x90EC, 0xE057, 0x90ED, 0xB9F9, 0x90EE, 0xE058, 0x90EF, 0xDBB0, 0x90F0, 0xE059, 0x90F1, 0xE05A, 0x90F2, 0xE05B, + 0x90F3, 0xE05C, 0x90F4, 0xB3BB, 0x90F5, 0xE05D, 0x90F6, 0xE05E, 0x90F7, 0xE05F, 0x90F8, 0xB5A6, 0x90F9, 0xE060, 0x90FA, 0xE061, + 0x90FB, 0xE062, 0x90FC, 0xE063, 0x90FD, 0xB6BC, 0x90FE, 0xDBB1, 0x90FF, 0xE064, 0x9100, 0xE065, 0x9101, 0xE066, 0x9102, 0xB6F5, + 0x9103, 0xE067, 0x9104, 0xDBB2, 0x9105, 0xE068, 0x9106, 0xE069, 0x9107, 0xE06A, 0x9108, 0xE06B, 0x9109, 0xE06C, 0x910A, 0xE06D, + 0x910B, 0xE06E, 0x910C, 0xE06F, 0x910D, 0xE070, 0x910E, 0xE071, 0x910F, 0xE072, 0x9110, 0xE073, 0x9111, 0xE074, 0x9112, 0xE075, + 0x9113, 0xE076, 0x9114, 0xE077, 0x9115, 0xE078, 0x9116, 0xE079, 0x9117, 0xE07A, 0x9118, 0xE07B, 0x9119, 0xB1C9, 0x911A, 0xE07C, + 0x911B, 0xE07D, 0x911C, 0xE07E, 0x911D, 0xE080, 0x911E, 0xDBB4, 0x911F, 0xE081, 0x9120, 0xE082, 0x9121, 0xE083, 0x9122, 0xDBB3, + 0x9123, 0xDBB5, 0x9124, 0xE084, 0x9125, 0xE085, 0x9126, 0xE086, 0x9127, 0xE087, 0x9128, 0xE088, 0x9129, 0xE089, 0x912A, 0xE08A, + 0x912B, 0xE08B, 0x912C, 0xE08C, 0x912D, 0xE08D, 0x912E, 0xE08E, 0x912F, 0xDBB7, 0x9130, 0xE08F, 0x9131, 0xDBB6, 0x9132, 0xE090, + 0x9133, 0xE091, 0x9134, 0xE092, 0x9135, 0xE093, 0x9136, 0xE094, 0x9137, 0xE095, 0x9138, 0xE096, 0x9139, 0xDBB8, 0x913A, 0xE097, + 0x913B, 0xE098, 0x913C, 0xE099, 0x913D, 0xE09A, 0x913E, 0xE09B, 0x913F, 0xE09C, 0x9140, 0xE09D, 0x9141, 0xE09E, 0x9142, 0xE09F, + 0x9143, 0xDBB9, 0x9144, 0xE0A0, 0x9145, 0xE140, 0x9146, 0xDBBA, 0x9147, 0xE141, 0x9148, 0xE142, 0x9149, 0xD3CF, 0x914A, 0xF4FA, + 0x914B, 0xC7F5, 0x914C, 0xD7C3, 0x914D, 0xC5E4, 0x914E, 0xF4FC, 0x914F, 0xF4FD, 0x9150, 0xF4FB, 0x9151, 0xE143, 0x9152, 0xBEC6, + 0x9153, 0xE144, 0x9154, 0xE145, 0x9155, 0xE146, 0x9156, 0xE147, 0x9157, 0xD0EF, 0x9158, 0xE148, 0x9159, 0xE149, 0x915A, 0xB7D3, + 0x915B, 0xE14A, 0x915C, 0xE14B, 0x915D, 0xD4CD, 0x915E, 0xCCAA, 0x915F, 0xE14C, 0x9160, 0xE14D, 0x9161, 0xF5A2, 0x9162, 0xF5A1, + 0x9163, 0xBAA8, 0x9164, 0xF4FE, 0x9165, 0xCBD6, 0x9166, 0xE14E, 0x9167, 0xE14F, 0x9168, 0xE150, 0x9169, 0xF5A4, 0x916A, 0xC0D2, + 0x916B, 0xE151, 0x916C, 0xB3EA, 0x916D, 0xE152, 0x916E, 0xCDAA, 0x916F, 0xF5A5, 0x9170, 0xF5A3, 0x9171, 0xBDB4, 0x9172, 0xF5A8, + 0x9173, 0xE153, 0x9174, 0xF5A9, 0x9175, 0xBDCD, 0x9176, 0xC3B8, 0x9177, 0xBFE1, 0x9178, 0xCBE1, 0x9179, 0xF5AA, 0x917A, 0xE154, + 0x917B, 0xE155, 0x917C, 0xE156, 0x917D, 0xF5A6, 0x917E, 0xF5A7, 0x917F, 0xC4F0, 0x9180, 0xE157, 0x9181, 0xE158, 0x9182, 0xE159, + 0x9183, 0xE15A, 0x9184, 0xE15B, 0x9185, 0xF5AC, 0x9186, 0xE15C, 0x9187, 0xB4BC, 0x9188, 0xE15D, 0x9189, 0xD7ED, 0x918A, 0xE15E, + 0x918B, 0xB4D7, 0x918C, 0xF5AB, 0x918D, 0xF5AE, 0x918E, 0xE15F, 0x918F, 0xE160, 0x9190, 0xF5AD, 0x9191, 0xF5AF, 0x9192, 0xD0D1, + 0x9193, 0xE161, 0x9194, 0xE162, 0x9195, 0xE163, 0x9196, 0xE164, 0x9197, 0xE165, 0x9198, 0xE166, 0x9199, 0xE167, 0x919A, 0xC3D1, + 0x919B, 0xC8A9, 0x919C, 0xE168, 0x919D, 0xE169, 0x919E, 0xE16A, 0x919F, 0xE16B, 0x91A0, 0xE16C, 0x91A1, 0xE16D, 0x91A2, 0xF5B0, + 0x91A3, 0xF5B1, 0x91A4, 0xE16E, 0x91A5, 0xE16F, 0x91A6, 0xE170, 0x91A7, 0xE171, 0x91A8, 0xE172, 0x91A9, 0xE173, 0x91AA, 0xF5B2, + 0x91AB, 0xE174, 0x91AC, 0xE175, 0x91AD, 0xF5B3, 0x91AE, 0xF5B4, 0x91AF, 0xF5B5, 0x91B0, 0xE176, 0x91B1, 0xE177, 0x91B2, 0xE178, + 0x91B3, 0xE179, 0x91B4, 0xF5B7, 0x91B5, 0xF5B6, 0x91B6, 0xE17A, 0x91B7, 0xE17B, 0x91B8, 0xE17C, 0x91B9, 0xE17D, 0x91BA, 0xF5B8, + 0x91BB, 0xE17E, 0x91BC, 0xE180, 0x91BD, 0xE181, 0x91BE, 0xE182, 0x91BF, 0xE183, 0x91C0, 0xE184, 0x91C1, 0xE185, 0x91C2, 0xE186, + 0x91C3, 0xE187, 0x91C4, 0xE188, 0x91C5, 0xE189, 0x91C6, 0xE18A, 0x91C7, 0xB2C9, 0x91C8, 0xE18B, 0x91C9, 0xD3D4, 0x91CA, 0xCACD, + 0x91CB, 0xE18C, 0x91CC, 0xC0EF, 0x91CD, 0xD6D8, 0x91CE, 0xD2B0, 0x91CF, 0xC1BF, 0x91D0, 0xE18D, 0x91D1, 0xBDF0, 0x91D2, 0xE18E, + 0x91D3, 0xE18F, 0x91D4, 0xE190, 0x91D5, 0xE191, 0x91D6, 0xE192, 0x91D7, 0xE193, 0x91D8, 0xE194, 0x91D9, 0xE195, 0x91DA, 0xE196, + 0x91DB, 0xE197, 0x91DC, 0xB8AA, 0x91DD, 0xE198, 0x91DE, 0xE199, 0x91DF, 0xE19A, 0x91E0, 0xE19B, 0x91E1, 0xE19C, 0x91E2, 0xE19D, + 0x91E3, 0xE19E, 0x91E4, 0xE19F, 0x91E5, 0xE1A0, 0x91E6, 0xE240, 0x91E7, 0xE241, 0x91E8, 0xE242, 0x91E9, 0xE243, 0x91EA, 0xE244, + 0x91EB, 0xE245, 0x91EC, 0xE246, 0x91ED, 0xE247, 0x91EE, 0xE248, 0x91EF, 0xE249, 0x91F0, 0xE24A, 0x91F1, 0xE24B, 0x91F2, 0xE24C, + 0x91F3, 0xE24D, 0x91F4, 0xE24E, 0x91F5, 0xE24F, 0x91F6, 0xE250, 0x91F7, 0xE251, 0x91F8, 0xE252, 0x91F9, 0xE253, 0x91FA, 0xE254, + 0x91FB, 0xE255, 0x91FC, 0xE256, 0x91FD, 0xE257, 0x91FE, 0xE258, 0x91FF, 0xE259, 0x9200, 0xE25A, 0x9201, 0xE25B, 0x9202, 0xE25C, + 0x9203, 0xE25D, 0x9204, 0xE25E, 0x9205, 0xE25F, 0x9206, 0xE260, 0x9207, 0xE261, 0x9208, 0xE262, 0x9209, 0xE263, 0x920A, 0xE264, + 0x920B, 0xE265, 0x920C, 0xE266, 0x920D, 0xE267, 0x920E, 0xE268, 0x920F, 0xE269, 0x9210, 0xE26A, 0x9211, 0xE26B, 0x9212, 0xE26C, + 0x9213, 0xE26D, 0x9214, 0xE26E, 0x9215, 0xE26F, 0x9216, 0xE270, 0x9217, 0xE271, 0x9218, 0xE272, 0x9219, 0xE273, 0x921A, 0xE274, + 0x921B, 0xE275, 0x921C, 0xE276, 0x921D, 0xE277, 0x921E, 0xE278, 0x921F, 0xE279, 0x9220, 0xE27A, 0x9221, 0xE27B, 0x9222, 0xE27C, + 0x9223, 0xE27D, 0x9224, 0xE27E, 0x9225, 0xE280, 0x9226, 0xE281, 0x9227, 0xE282, 0x9228, 0xE283, 0x9229, 0xE284, 0x922A, 0xE285, + 0x922B, 0xE286, 0x922C, 0xE287, 0x922D, 0xE288, 0x922E, 0xE289, 0x922F, 0xE28A, 0x9230, 0xE28B, 0x9231, 0xE28C, 0x9232, 0xE28D, + 0x9233, 0xE28E, 0x9234, 0xE28F, 0x9235, 0xE290, 0x9236, 0xE291, 0x9237, 0xE292, 0x9238, 0xE293, 0x9239, 0xE294, 0x923A, 0xE295, + 0x923B, 0xE296, 0x923C, 0xE297, 0x923D, 0xE298, 0x923E, 0xE299, 0x923F, 0xE29A, 0x9240, 0xE29B, 0x9241, 0xE29C, 0x9242, 0xE29D, + 0x9243, 0xE29E, 0x9244, 0xE29F, 0x9245, 0xE2A0, 0x9246, 0xE340, 0x9247, 0xE341, 0x9248, 0xE342, 0x9249, 0xE343, 0x924A, 0xE344, + 0x924B, 0xE345, 0x924C, 0xE346, 0x924D, 0xE347, 0x924E, 0xE348, 0x924F, 0xE349, 0x9250, 0xE34A, 0x9251, 0xE34B, 0x9252, 0xE34C, + 0x9253, 0xE34D, 0x9254, 0xE34E, 0x9255, 0xE34F, 0x9256, 0xE350, 0x9257, 0xE351, 0x9258, 0xE352, 0x9259, 0xE353, 0x925A, 0xE354, + 0x925B, 0xE355, 0x925C, 0xE356, 0x925D, 0xE357, 0x925E, 0xE358, 0x925F, 0xE359, 0x9260, 0xE35A, 0x9261, 0xE35B, 0x9262, 0xE35C, + 0x9263, 0xE35D, 0x9264, 0xE35E, 0x9265, 0xE35F, 0x9266, 0xE360, 0x9267, 0xE361, 0x9268, 0xE362, 0x9269, 0xE363, 0x926A, 0xE364, + 0x926B, 0xE365, 0x926C, 0xE366, 0x926D, 0xE367, 0x926E, 0xE368, 0x926F, 0xE369, 0x9270, 0xE36A, 0x9271, 0xE36B, 0x9272, 0xE36C, + 0x9273, 0xE36D, 0x9274, 0xBCF8, 0x9275, 0xE36E, 0x9276, 0xE36F, 0x9277, 0xE370, 0x9278, 0xE371, 0x9279, 0xE372, 0x927A, 0xE373, + 0x927B, 0xE374, 0x927C, 0xE375, 0x927D, 0xE376, 0x927E, 0xE377, 0x927F, 0xE378, 0x9280, 0xE379, 0x9281, 0xE37A, 0x9282, 0xE37B, + 0x9283, 0xE37C, 0x9284, 0xE37D, 0x9285, 0xE37E, 0x9286, 0xE380, 0x9287, 0xE381, 0x9288, 0xE382, 0x9289, 0xE383, 0x928A, 0xE384, + 0x928B, 0xE385, 0x928C, 0xE386, 0x928D, 0xE387, 0x928E, 0xF6C6, 0x928F, 0xE388, 0x9290, 0xE389, 0x9291, 0xE38A, 0x9292, 0xE38B, + 0x9293, 0xE38C, 0x9294, 0xE38D, 0x9295, 0xE38E, 0x9296, 0xE38F, 0x9297, 0xE390, 0x9298, 0xE391, 0x9299, 0xE392, 0x929A, 0xE393, + 0x929B, 0xE394, 0x929C, 0xE395, 0x929D, 0xE396, 0x929E, 0xE397, 0x929F, 0xE398, 0x92A0, 0xE399, 0x92A1, 0xE39A, 0x92A2, 0xE39B, + 0x92A3, 0xE39C, 0x92A4, 0xE39D, 0x92A5, 0xE39E, 0x92A6, 0xE39F, 0x92A7, 0xE3A0, 0x92A8, 0xE440, 0x92A9, 0xE441, 0x92AA, 0xE442, + 0x92AB, 0xE443, 0x92AC, 0xE444, 0x92AD, 0xE445, 0x92AE, 0xF6C7, 0x92AF, 0xE446, 0x92B0, 0xE447, 0x92B1, 0xE448, 0x92B2, 0xE449, + 0x92B3, 0xE44A, 0x92B4, 0xE44B, 0x92B5, 0xE44C, 0x92B6, 0xE44D, 0x92B7, 0xE44E, 0x92B8, 0xE44F, 0x92B9, 0xE450, 0x92BA, 0xE451, + 0x92BB, 0xE452, 0x92BC, 0xE453, 0x92BD, 0xE454, 0x92BE, 0xE455, 0x92BF, 0xE456, 0x92C0, 0xE457, 0x92C1, 0xE458, 0x92C2, 0xE459, + 0x92C3, 0xE45A, 0x92C4, 0xE45B, 0x92C5, 0xE45C, 0x92C6, 0xE45D, 0x92C7, 0xE45E, 0x92C8, 0xF6C8, 0x92C9, 0xE45F, 0x92CA, 0xE460, + 0x92CB, 0xE461, 0x92CC, 0xE462, 0x92CD, 0xE463, 0x92CE, 0xE464, 0x92CF, 0xE465, 0x92D0, 0xE466, 0x92D1, 0xE467, 0x92D2, 0xE468, + 0x92D3, 0xE469, 0x92D4, 0xE46A, 0x92D5, 0xE46B, 0x92D6, 0xE46C, 0x92D7, 0xE46D, 0x92D8, 0xE46E, 0x92D9, 0xE46F, 0x92DA, 0xE470, + 0x92DB, 0xE471, 0x92DC, 0xE472, 0x92DD, 0xE473, 0x92DE, 0xE474, 0x92DF, 0xE475, 0x92E0, 0xE476, 0x92E1, 0xE477, 0x92E2, 0xE478, + 0x92E3, 0xE479, 0x92E4, 0xE47A, 0x92E5, 0xE47B, 0x92E6, 0xE47C, 0x92E7, 0xE47D, 0x92E8, 0xE47E, 0x92E9, 0xE480, 0x92EA, 0xE481, + 0x92EB, 0xE482, 0x92EC, 0xE483, 0x92ED, 0xE484, 0x92EE, 0xE485, 0x92EF, 0xE486, 0x92F0, 0xE487, 0x92F1, 0xE488, 0x92F2, 0xE489, + 0x92F3, 0xE48A, 0x92F4, 0xE48B, 0x92F5, 0xE48C, 0x92F6, 0xE48D, 0x92F7, 0xE48E, 0x92F8, 0xE48F, 0x92F9, 0xE490, 0x92FA, 0xE491, + 0x92FB, 0xE492, 0x92FC, 0xE493, 0x92FD, 0xE494, 0x92FE, 0xE495, 0x92FF, 0xE496, 0x9300, 0xE497, 0x9301, 0xE498, 0x9302, 0xE499, + 0x9303, 0xE49A, 0x9304, 0xE49B, 0x9305, 0xE49C, 0x9306, 0xE49D, 0x9307, 0xE49E, 0x9308, 0xE49F, 0x9309, 0xE4A0, 0x930A, 0xE540, + 0x930B, 0xE541, 0x930C, 0xE542, 0x930D, 0xE543, 0x930E, 0xE544, 0x930F, 0xE545, 0x9310, 0xE546, 0x9311, 0xE547, 0x9312, 0xE548, + 0x9313, 0xE549, 0x9314, 0xE54A, 0x9315, 0xE54B, 0x9316, 0xE54C, 0x9317, 0xE54D, 0x9318, 0xE54E, 0x9319, 0xE54F, 0x931A, 0xE550, + 0x931B, 0xE551, 0x931C, 0xE552, 0x931D, 0xE553, 0x931E, 0xE554, 0x931F, 0xE555, 0x9320, 0xE556, 0x9321, 0xE557, 0x9322, 0xE558, + 0x9323, 0xE559, 0x9324, 0xE55A, 0x9325, 0xE55B, 0x9326, 0xE55C, 0x9327, 0xE55D, 0x9328, 0xE55E, 0x9329, 0xE55F, 0x932A, 0xE560, + 0x932B, 0xE561, 0x932C, 0xE562, 0x932D, 0xE563, 0x932E, 0xE564, 0x932F, 0xE565, 0x9330, 0xE566, 0x9331, 0xE567, 0x9332, 0xE568, + 0x9333, 0xE569, 0x9334, 0xE56A, 0x9335, 0xE56B, 0x9336, 0xE56C, 0x9337, 0xE56D, 0x9338, 0xE56E, 0x9339, 0xE56F, 0x933A, 0xE570, + 0x933B, 0xE571, 0x933C, 0xE572, 0x933D, 0xE573, 0x933E, 0xF6C9, 0x933F, 0xE574, 0x9340, 0xE575, 0x9341, 0xE576, 0x9342, 0xE577, + 0x9343, 0xE578, 0x9344, 0xE579, 0x9345, 0xE57A, 0x9346, 0xE57B, 0x9347, 0xE57C, 0x9348, 0xE57D, 0x9349, 0xE57E, 0x934A, 0xE580, + 0x934B, 0xE581, 0x934C, 0xE582, 0x934D, 0xE583, 0x934E, 0xE584, 0x934F, 0xE585, 0x9350, 0xE586, 0x9351, 0xE587, 0x9352, 0xE588, + 0x9353, 0xE589, 0x9354, 0xE58A, 0x9355, 0xE58B, 0x9356, 0xE58C, 0x9357, 0xE58D, 0x9358, 0xE58E, 0x9359, 0xE58F, 0x935A, 0xE590, + 0x935B, 0xE591, 0x935C, 0xE592, 0x935D, 0xE593, 0x935E, 0xE594, 0x935F, 0xE595, 0x9360, 0xE596, 0x9361, 0xE597, 0x9362, 0xE598, + 0x9363, 0xE599, 0x9364, 0xE59A, 0x9365, 0xE59B, 0x9366, 0xE59C, 0x9367, 0xE59D, 0x9368, 0xE59E, 0x9369, 0xE59F, 0x936A, 0xF6CA, + 0x936B, 0xE5A0, 0x936C, 0xE640, 0x936D, 0xE641, 0x936E, 0xE642, 0x936F, 0xE643, 0x9370, 0xE644, 0x9371, 0xE645, 0x9372, 0xE646, + 0x9373, 0xE647, 0x9374, 0xE648, 0x9375, 0xE649, 0x9376, 0xE64A, 0x9377, 0xE64B, 0x9378, 0xE64C, 0x9379, 0xE64D, 0x937A, 0xE64E, + 0x937B, 0xE64F, 0x937C, 0xE650, 0x937D, 0xE651, 0x937E, 0xE652, 0x937F, 0xE653, 0x9380, 0xE654, 0x9381, 0xE655, 0x9382, 0xE656, + 0x9383, 0xE657, 0x9384, 0xE658, 0x9385, 0xE659, 0x9386, 0xE65A, 0x9387, 0xE65B, 0x9388, 0xE65C, 0x9389, 0xE65D, 0x938A, 0xE65E, + 0x938B, 0xE65F, 0x938C, 0xE660, 0x938D, 0xE661, 0x938E, 0xE662, 0x938F, 0xF6CC, 0x9390, 0xE663, 0x9391, 0xE664, 0x9392, 0xE665, + 0x9393, 0xE666, 0x9394, 0xE667, 0x9395, 0xE668, 0x9396, 0xE669, 0x9397, 0xE66A, 0x9398, 0xE66B, 0x9399, 0xE66C, 0x939A, 0xE66D, + 0x939B, 0xE66E, 0x939C, 0xE66F, 0x939D, 0xE670, 0x939E, 0xE671, 0x939F, 0xE672, 0x93A0, 0xE673, 0x93A1, 0xE674, 0x93A2, 0xE675, + 0x93A3, 0xE676, 0x93A4, 0xE677, 0x93A5, 0xE678, 0x93A6, 0xE679, 0x93A7, 0xE67A, 0x93A8, 0xE67B, 0x93A9, 0xE67C, 0x93AA, 0xE67D, + 0x93AB, 0xE67E, 0x93AC, 0xE680, 0x93AD, 0xE681, 0x93AE, 0xE682, 0x93AF, 0xE683, 0x93B0, 0xE684, 0x93B1, 0xE685, 0x93B2, 0xE686, + 0x93B3, 0xE687, 0x93B4, 0xE688, 0x93B5, 0xE689, 0x93B6, 0xE68A, 0x93B7, 0xE68B, 0x93B8, 0xE68C, 0x93B9, 0xE68D, 0x93BA, 0xE68E, + 0x93BB, 0xE68F, 0x93BC, 0xE690, 0x93BD, 0xE691, 0x93BE, 0xE692, 0x93BF, 0xE693, 0x93C0, 0xE694, 0x93C1, 0xE695, 0x93C2, 0xE696, + 0x93C3, 0xE697, 0x93C4, 0xE698, 0x93C5, 0xE699, 0x93C6, 0xE69A, 0x93C7, 0xE69B, 0x93C8, 0xE69C, 0x93C9, 0xE69D, 0x93CA, 0xF6CB, + 0x93CB, 0xE69E, 0x93CC, 0xE69F, 0x93CD, 0xE6A0, 0x93CE, 0xE740, 0x93CF, 0xE741, 0x93D0, 0xE742, 0x93D1, 0xE743, 0x93D2, 0xE744, + 0x93D3, 0xE745, 0x93D4, 0xE746, 0x93D5, 0xE747, 0x93D6, 0xF7E9, 0x93D7, 0xE748, 0x93D8, 0xE749, 0x93D9, 0xE74A, 0x93DA, 0xE74B, + 0x93DB, 0xE74C, 0x93DC, 0xE74D, 0x93DD, 0xE74E, 0x93DE, 0xE74F, 0x93DF, 0xE750, 0x93E0, 0xE751, 0x93E1, 0xE752, 0x93E2, 0xE753, + 0x93E3, 0xE754, 0x93E4, 0xE755, 0x93E5, 0xE756, 0x93E6, 0xE757, 0x93E7, 0xE758, 0x93E8, 0xE759, 0x93E9, 0xE75A, 0x93EA, 0xE75B, + 0x93EB, 0xE75C, 0x93EC, 0xE75D, 0x93ED, 0xE75E, 0x93EE, 0xE75F, 0x93EF, 0xE760, 0x93F0, 0xE761, 0x93F1, 0xE762, 0x93F2, 0xE763, + 0x93F3, 0xE764, 0x93F4, 0xE765, 0x93F5, 0xE766, 0x93F6, 0xE767, 0x93F7, 0xE768, 0x93F8, 0xE769, 0x93F9, 0xE76A, 0x93FA, 0xE76B, + 0x93FB, 0xE76C, 0x93FC, 0xE76D, 0x93FD, 0xE76E, 0x93FE, 0xE76F, 0x93FF, 0xE770, 0x9400, 0xE771, 0x9401, 0xE772, 0x9402, 0xE773, + 0x9403, 0xE774, 0x9404, 0xE775, 0x9405, 0xE776, 0x9406, 0xE777, 0x9407, 0xE778, 0x9408, 0xE779, 0x9409, 0xE77A, 0x940A, 0xE77B, + 0x940B, 0xE77C, 0x940C, 0xE77D, 0x940D, 0xE77E, 0x940E, 0xE780, 0x940F, 0xE781, 0x9410, 0xE782, 0x9411, 0xE783, 0x9412, 0xE784, + 0x9413, 0xE785, 0x9414, 0xE786, 0x9415, 0xE787, 0x9416, 0xE788, 0x9417, 0xE789, 0x9418, 0xE78A, 0x9419, 0xE78B, 0x941A, 0xE78C, + 0x941B, 0xE78D, 0x941C, 0xE78E, 0x941D, 0xE78F, 0x941E, 0xE790, 0x941F, 0xE791, 0x9420, 0xE792, 0x9421, 0xE793, 0x9422, 0xE794, + 0x9423, 0xE795, 0x9424, 0xE796, 0x9425, 0xE797, 0x9426, 0xE798, 0x9427, 0xE799, 0x9428, 0xE79A, 0x9429, 0xE79B, 0x942A, 0xE79C, + 0x942B, 0xE79D, 0x942C, 0xE79E, 0x942D, 0xE79F, 0x942E, 0xE7A0, 0x942F, 0xE840, 0x9430, 0xE841, 0x9431, 0xE842, 0x9432, 0xE843, + 0x9433, 0xE844, 0x9434, 0xE845, 0x9435, 0xE846, 0x9436, 0xE847, 0x9437, 0xE848, 0x9438, 0xE849, 0x9439, 0xE84A, 0x943A, 0xE84B, + 0x943B, 0xE84C, 0x943C, 0xE84D, 0x943D, 0xE84E, 0x943E, 0xF6CD, 0x943F, 0xE84F, 0x9440, 0xE850, 0x9441, 0xE851, 0x9442, 0xE852, + 0x9443, 0xE853, 0x9444, 0xE854, 0x9445, 0xE855, 0x9446, 0xE856, 0x9447, 0xE857, 0x9448, 0xE858, 0x9449, 0xE859, 0x944A, 0xE85A, + 0x944B, 0xE85B, 0x944C, 0xE85C, 0x944D, 0xE85D, 0x944E, 0xE85E, 0x944F, 0xE85F, 0x9450, 0xE860, 0x9451, 0xE861, 0x9452, 0xE862, + 0x9453, 0xE863, 0x9454, 0xE864, 0x9455, 0xE865, 0x9456, 0xE866, 0x9457, 0xE867, 0x9458, 0xE868, 0x9459, 0xE869, 0x945A, 0xE86A, + 0x945B, 0xE86B, 0x945C, 0xE86C, 0x945D, 0xE86D, 0x945E, 0xE86E, 0x945F, 0xE86F, 0x9460, 0xE870, 0x9461, 0xE871, 0x9462, 0xE872, + 0x9463, 0xE873, 0x9464, 0xE874, 0x9465, 0xE875, 0x9466, 0xE876, 0x9467, 0xE877, 0x9468, 0xE878, 0x9469, 0xE879, 0x946A, 0xE87A, + 0x946B, 0xF6CE, 0x946C, 0xE87B, 0x946D, 0xE87C, 0x946E, 0xE87D, 0x946F, 0xE87E, 0x9470, 0xE880, 0x9471, 0xE881, 0x9472, 0xE882, + 0x9473, 0xE883, 0x9474, 0xE884, 0x9475, 0xE885, 0x9476, 0xE886, 0x9477, 0xE887, 0x9478, 0xE888, 0x9479, 0xE889, 0x947A, 0xE88A, + 0x947B, 0xE88B, 0x947C, 0xE88C, 0x947D, 0xE88D, 0x947E, 0xE88E, 0x947F, 0xE88F, 0x9480, 0xE890, 0x9481, 0xE891, 0x9482, 0xE892, + 0x9483, 0xE893, 0x9484, 0xE894, 0x9485, 0xEEC4, 0x9486, 0xEEC5, 0x9487, 0xEEC6, 0x9488, 0xD5EB, 0x9489, 0xB6A4, 0x948A, 0xEEC8, + 0x948B, 0xEEC7, 0x948C, 0xEEC9, 0x948D, 0xEECA, 0x948E, 0xC7A5, 0x948F, 0xEECB, 0x9490, 0xEECC, 0x9491, 0xE895, 0x9492, 0xB7B0, + 0x9493, 0xB5F6, 0x9494, 0xEECD, 0x9495, 0xEECF, 0x9496, 0xE896, 0x9497, 0xEECE, 0x9498, 0xE897, 0x9499, 0xB8C6, 0x949A, 0xEED0, + 0x949B, 0xEED1, 0x949C, 0xEED2, 0x949D, 0xB6DB, 0x949E, 0xB3AE, 0x949F, 0xD6D3, 0x94A0, 0xC4C6, 0x94A1, 0xB1B5, 0x94A2, 0xB8D6, + 0x94A3, 0xEED3, 0x94A4, 0xEED4, 0x94A5, 0xD4BF, 0x94A6, 0xC7D5, 0x94A7, 0xBEFB, 0x94A8, 0xCED9, 0x94A9, 0xB9B3, 0x94AA, 0xEED6, + 0x94AB, 0xEED5, 0x94AC, 0xEED8, 0x94AD, 0xEED7, 0x94AE, 0xC5A5, 0x94AF, 0xEED9, 0x94B0, 0xEEDA, 0x94B1, 0xC7AE, 0x94B2, 0xEEDB, + 0x94B3, 0xC7AF, 0x94B4, 0xEEDC, 0x94B5, 0xB2A7, 0x94B6, 0xEEDD, 0x94B7, 0xEEDE, 0x94B8, 0xEEDF, 0x94B9, 0xEEE0, 0x94BA, 0xEEE1, + 0x94BB, 0xD7EA, 0x94BC, 0xEEE2, 0x94BD, 0xEEE3, 0x94BE, 0xBCD8, 0x94BF, 0xEEE4, 0x94C0, 0xD3CB, 0x94C1, 0xCCFA, 0x94C2, 0xB2AC, + 0x94C3, 0xC1E5, 0x94C4, 0xEEE5, 0x94C5, 0xC7A6, 0x94C6, 0xC3AD, 0x94C7, 0xE898, 0x94C8, 0xEEE6, 0x94C9, 0xEEE7, 0x94CA, 0xEEE8, + 0x94CB, 0xEEE9, 0x94CC, 0xEEEA, 0x94CD, 0xEEEB, 0x94CE, 0xEEEC, 0x94CF, 0xE899, 0x94D0, 0xEEED, 0x94D1, 0xEEEE, 0x94D2, 0xEEEF, + 0x94D3, 0xE89A, 0x94D4, 0xE89B, 0x94D5, 0xEEF0, 0x94D6, 0xEEF1, 0x94D7, 0xEEF2, 0x94D8, 0xEEF4, 0x94D9, 0xEEF3, 0x94DA, 0xE89C, + 0x94DB, 0xEEF5, 0x94DC, 0xCDAD, 0x94DD, 0xC2C1, 0x94DE, 0xEEF6, 0x94DF, 0xEEF7, 0x94E0, 0xEEF8, 0x94E1, 0xD5A1, 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, 0x94E4, 0xEEFA, 0x94E5, 0xEEFB, 0x94E6, 0xE89D, 0x94E7, 0xEEFC, 0x94E8, 0xEEFD, 0x94E9, 0xEFA1, 0x94EA, 0xEEFE, + 0x94EB, 0xEFA2, 0x94EC, 0xB8F5, 0x94ED, 0xC3FA, 0x94EE, 0xEFA3, 0x94EF, 0xEFA4, 0x94F0, 0xBDC2, 0x94F1, 0xD2BF, 0x94F2, 0xB2F9, + 0x94F3, 0xEFA5, 0x94F4, 0xEFA6, 0x94F5, 0xEFA7, 0x94F6, 0xD2F8, 0x94F7, 0xEFA8, 0x94F8, 0xD6FD, 0x94F9, 0xEFA9, 0x94FA, 0xC6CC, + 0x94FB, 0xE89E, 0x94FC, 0xEFAA, 0x94FD, 0xEFAB, 0x94FE, 0xC1B4, 0x94FF, 0xEFAC, 0x9500, 0xCFFA, 0x9501, 0xCBF8, 0x9502, 0xEFAE, + 0x9503, 0xEFAD, 0x9504, 0xB3FA, 0x9505, 0xB9F8, 0x9506, 0xEFAF, 0x9507, 0xEFB0, 0x9508, 0xD0E2, 0x9509, 0xEFB1, 0x950A, 0xEFB2, + 0x950B, 0xB7E6, 0x950C, 0xD0BF, 0x950D, 0xEFB3, 0x950E, 0xEFB4, 0x950F, 0xEFB5, 0x9510, 0xC8F1, 0x9511, 0xCCE0, 0x9512, 0xEFB6, + 0x9513, 0xEFB7, 0x9514, 0xEFB8, 0x9515, 0xEFB9, 0x9516, 0xEFBA, 0x9517, 0xD5E0, 0x9518, 0xEFBB, 0x9519, 0xB4ED, 0x951A, 0xC3AA, + 0x951B, 0xEFBC, 0x951C, 0xE89F, 0x951D, 0xEFBD, 0x951E, 0xEFBE, 0x951F, 0xEFBF, 0x9520, 0xE8A0, 0x9521, 0xCEFD, 0x9522, 0xEFC0, + 0x9523, 0xC2E0, 0x9524, 0xB4B8, 0x9525, 0xD7B6, 0x9526, 0xBDF5, 0x9527, 0xE940, 0x9528, 0xCFC7, 0x9529, 0xEFC3, 0x952A, 0xEFC1, + 0x952B, 0xEFC2, 0x952C, 0xEFC4, 0x952D, 0xB6A7, 0x952E, 0xBCFC, 0x952F, 0xBEE2, 0x9530, 0xC3CC, 0x9531, 0xEFC5, 0x9532, 0xEFC6, + 0x9533, 0xE941, 0x9534, 0xEFC7, 0x9535, 0xEFCF, 0x9536, 0xEFC8, 0x9537, 0xEFC9, 0x9538, 0xEFCA, 0x9539, 0xC7C2, 0x953A, 0xEFF1, + 0x953B, 0xB6CD, 0x953C, 0xEFCB, 0x953D, 0xE942, 0x953E, 0xEFCC, 0x953F, 0xEFCD, 0x9540, 0xB6C6, 0x9541, 0xC3BE, 0x9542, 0xEFCE, + 0x9543, 0xE943, 0x9544, 0xEFD0, 0x9545, 0xEFD1, 0x9546, 0xEFD2, 0x9547, 0xD5F2, 0x9548, 0xE944, 0x9549, 0xEFD3, 0x954A, 0xC4F7, + 0x954B, 0xE945, 0x954C, 0xEFD4, 0x954D, 0xC4F8, 0x954E, 0xEFD5, 0x954F, 0xEFD6, 0x9550, 0xB8E4, 0x9551, 0xB0F7, 0x9552, 0xEFD7, + 0x9553, 0xEFD8, 0x9554, 0xEFD9, 0x9555, 0xE946, 0x9556, 0xEFDA, 0x9557, 0xEFDB, 0x9558, 0xEFDC, 0x9559, 0xEFDD, 0x955A, 0xE947, + 0x955B, 0xEFDE, 0x955C, 0xBEB5, 0x955D, 0xEFE1, 0x955E, 0xEFDF, 0x955F, 0xEFE0, 0x9560, 0xE948, 0x9561, 0xEFE2, 0x9562, 0xEFE3, + 0x9563, 0xC1CD, 0x9564, 0xEFE4, 0x9565, 0xEFE5, 0x9566, 0xEFE6, 0x9567, 0xEFE7, 0x9568, 0xEFE8, 0x9569, 0xEFE9, 0x956A, 0xEFEA, + 0x956B, 0xEFEB, 0x956C, 0xEFEC, 0x956D, 0xC0D8, 0x956E, 0xE949, 0x956F, 0xEFED, 0x9570, 0xC1AD, 0x9571, 0xEFEE, 0x9572, 0xEFEF, + 0x9573, 0xEFF0, 0x9574, 0xE94A, 0x9575, 0xE94B, 0x9576, 0xCFE2, 0x9577, 0xE94C, 0x9578, 0xE94D, 0x9579, 0xE94E, 0x957A, 0xE94F, + 0x957B, 0xE950, 0x957C, 0xE951, 0x957D, 0xE952, 0x957E, 0xE953, 0x957F, 0xB3A4, 0x9580, 0xE954, 0x9581, 0xE955, 0x9582, 0xE956, + 0x9583, 0xE957, 0x9584, 0xE958, 0x9585, 0xE959, 0x9586, 0xE95A, 0x9587, 0xE95B, 0x9588, 0xE95C, 0x9589, 0xE95D, 0x958A, 0xE95E, + 0x958B, 0xE95F, 0x958C, 0xE960, 0x958D, 0xE961, 0x958E, 0xE962, 0x958F, 0xE963, 0x9590, 0xE964, 0x9591, 0xE965, 0x9592, 0xE966, + 0x9593, 0xE967, 0x9594, 0xE968, 0x9595, 0xE969, 0x9596, 0xE96A, 0x9597, 0xE96B, 0x9598, 0xE96C, 0x9599, 0xE96D, 0x959A, 0xE96E, + 0x959B, 0xE96F, 0x959C, 0xE970, 0x959D, 0xE971, 0x959E, 0xE972, 0x959F, 0xE973, 0x95A0, 0xE974, 0x95A1, 0xE975, 0x95A2, 0xE976, + 0x95A3, 0xE977, 0x95A4, 0xE978, 0x95A5, 0xE979, 0x95A6, 0xE97A, 0x95A7, 0xE97B, 0x95A8, 0xE97C, 0x95A9, 0xE97D, 0x95AA, 0xE97E, + 0x95AB, 0xE980, 0x95AC, 0xE981, 0x95AD, 0xE982, 0x95AE, 0xE983, 0x95AF, 0xE984, 0x95B0, 0xE985, 0x95B1, 0xE986, 0x95B2, 0xE987, + 0x95B3, 0xE988, 0x95B4, 0xE989, 0x95B5, 0xE98A, 0x95B6, 0xE98B, 0x95B7, 0xE98C, 0x95B8, 0xE98D, 0x95B9, 0xE98E, 0x95BA, 0xE98F, + 0x95BB, 0xE990, 0x95BC, 0xE991, 0x95BD, 0xE992, 0x95BE, 0xE993, 0x95BF, 0xE994, 0x95C0, 0xE995, 0x95C1, 0xE996, 0x95C2, 0xE997, + 0x95C3, 0xE998, 0x95C4, 0xE999, 0x95C5, 0xE99A, 0x95C6, 0xE99B, 0x95C7, 0xE99C, 0x95C8, 0xE99D, 0x95C9, 0xE99E, 0x95CA, 0xE99F, + 0x95CB, 0xE9A0, 0x95CC, 0xEA40, 0x95CD, 0xEA41, 0x95CE, 0xEA42, 0x95CF, 0xEA43, 0x95D0, 0xEA44, 0x95D1, 0xEA45, 0x95D2, 0xEA46, + 0x95D3, 0xEA47, 0x95D4, 0xEA48, 0x95D5, 0xEA49, 0x95D6, 0xEA4A, 0x95D7, 0xEA4B, 0x95D8, 0xEA4C, 0x95D9, 0xEA4D, 0x95DA, 0xEA4E, + 0x95DB, 0xEA4F, 0x95DC, 0xEA50, 0x95DD, 0xEA51, 0x95DE, 0xEA52, 0x95DF, 0xEA53, 0x95E0, 0xEA54, 0x95E1, 0xEA55, 0x95E2, 0xEA56, + 0x95E3, 0xEA57, 0x95E4, 0xEA58, 0x95E5, 0xEA59, 0x95E6, 0xEA5A, 0x95E7, 0xEA5B, 0x95E8, 0xC3C5, 0x95E9, 0xE3C5, 0x95EA, 0xC9C1, + 0x95EB, 0xE3C6, 0x95EC, 0xEA5C, 0x95ED, 0xB1D5, 0x95EE, 0xCECA, 0x95EF, 0xB4B3, 0x95F0, 0xC8F2, 0x95F1, 0xE3C7, 0x95F2, 0xCFD0, + 0x95F3, 0xE3C8, 0x95F4, 0xBCE4, 0x95F5, 0xE3C9, 0x95F6, 0xE3CA, 0x95F7, 0xC3C6, 0x95F8, 0xD5A2, 0x95F9, 0xC4D6, 0x95FA, 0xB9EB, + 0x95FB, 0xCEC5, 0x95FC, 0xE3CB, 0x95FD, 0xC3F6, 0x95FE, 0xE3CC, 0x95FF, 0xEA5D, 0x9600, 0xB7A7, 0x9601, 0xB8F3, 0x9602, 0xBAD2, + 0x9603, 0xE3CD, 0x9604, 0xE3CE, 0x9605, 0xD4C4, 0x9606, 0xE3CF, 0x9607, 0xEA5E, 0x9608, 0xE3D0, 0x9609, 0xD1CB, 0x960A, 0xE3D1, + 0x960B, 0xE3D2, 0x960C, 0xE3D3, 0x960D, 0xE3D4, 0x960E, 0xD1D6, 0x960F, 0xE3D5, 0x9610, 0xB2FB, 0x9611, 0xC0BB, 0x9612, 0xE3D6, + 0x9613, 0xEA5F, 0x9614, 0xC0AB, 0x9615, 0xE3D7, 0x9616, 0xE3D8, 0x9617, 0xE3D9, 0x9618, 0xEA60, 0x9619, 0xE3DA, 0x961A, 0xE3DB, + 0x961B, 0xEA61, 0x961C, 0xB8B7, 0x961D, 0xDAE2, 0x961E, 0xEA62, 0x961F, 0xB6D3, 0x9620, 0xEA63, 0x9621, 0xDAE4, 0x9622, 0xDAE3, + 0x9623, 0xEA64, 0x9624, 0xEA65, 0x9625, 0xEA66, 0x9626, 0xEA67, 0x9627, 0xEA68, 0x9628, 0xEA69, 0x9629, 0xEA6A, 0x962A, 0xDAE6, + 0x962B, 0xEA6B, 0x962C, 0xEA6C, 0x962D, 0xEA6D, 0x962E, 0xC8EE, 0x962F, 0xEA6E, 0x9630, 0xEA6F, 0x9631, 0xDAE5, 0x9632, 0xB7C0, + 0x9633, 0xD1F4, 0x9634, 0xD2F5, 0x9635, 0xD5F3, 0x9636, 0xBDD7, 0x9637, 0xEA70, 0x9638, 0xEA71, 0x9639, 0xEA72, 0x963A, 0xEA73, + 0x963B, 0xD7E8, 0x963C, 0xDAE8, 0x963D, 0xDAE7, 0x963E, 0xEA74, 0x963F, 0xB0A2, 0x9640, 0xCDD3, 0x9641, 0xEA75, 0x9642, 0xDAE9, + 0x9643, 0xEA76, 0x9644, 0xB8BD, 0x9645, 0xBCCA, 0x9646, 0xC2BD, 0x9647, 0xC2A4, 0x9648, 0xB3C2, 0x9649, 0xDAEA, 0x964A, 0xEA77, + 0x964B, 0xC2AA, 0x964C, 0xC4B0, 0x964D, 0xBDB5, 0x964E, 0xEA78, 0x964F, 0xEA79, 0x9650, 0xCFDE, 0x9651, 0xEA7A, 0x9652, 0xEA7B, + 0x9653, 0xEA7C, 0x9654, 0xDAEB, 0x9655, 0xC9C2, 0x9656, 0xEA7D, 0x9657, 0xEA7E, 0x9658, 0xEA80, 0x9659, 0xEA81, 0x965A, 0xEA82, + 0x965B, 0xB1DD, 0x965C, 0xEA83, 0x965D, 0xEA84, 0x965E, 0xEA85, 0x965F, 0xDAEC, 0x9660, 0xEA86, 0x9661, 0xB6B8, 0x9662, 0xD4BA, + 0x9663, 0xEA87, 0x9664, 0xB3FD, 0x9665, 0xEA88, 0x9666, 0xEA89, 0x9667, 0xDAED, 0x9668, 0xD4C9, 0x9669, 0xCFD5, 0x966A, 0xC5E3, + 0x966B, 0xEA8A, 0x966C, 0xDAEE, 0x966D, 0xEA8B, 0x966E, 0xEA8C, 0x966F, 0xEA8D, 0x9670, 0xEA8E, 0x9671, 0xEA8F, 0x9672, 0xDAEF, + 0x9673, 0xEA90, 0x9674, 0xDAF0, 0x9675, 0xC1EA, 0x9676, 0xCCD5, 0x9677, 0xCFDD, 0x9678, 0xEA91, 0x9679, 0xEA92, 0x967A, 0xEA93, + 0x967B, 0xEA94, 0x967C, 0xEA95, 0x967D, 0xEA96, 0x967E, 0xEA97, 0x967F, 0xEA98, 0x9680, 0xEA99, 0x9681, 0xEA9A, 0x9682, 0xEA9B, + 0x9683, 0xEA9C, 0x9684, 0xEA9D, 0x9685, 0xD3E7, 0x9686, 0xC2A1, 0x9687, 0xEA9E, 0x9688, 0xDAF1, 0x9689, 0xEA9F, 0x968A, 0xEAA0, + 0x968B, 0xCBE5, 0x968C, 0xEB40, 0x968D, 0xDAF2, 0x968E, 0xEB41, 0x968F, 0xCBE6, 0x9690, 0xD2FE, 0x9691, 0xEB42, 0x9692, 0xEB43, + 0x9693, 0xEB44, 0x9694, 0xB8F4, 0x9695, 0xEB45, 0x9696, 0xEB46, 0x9697, 0xDAF3, 0x9698, 0xB0AF, 0x9699, 0xCFB6, 0x969A, 0xEB47, + 0x969B, 0xEB48, 0x969C, 0xD5CF, 0x969D, 0xEB49, 0x969E, 0xEB4A, 0x969F, 0xEB4B, 0x96A0, 0xEB4C, 0x96A1, 0xEB4D, 0x96A2, 0xEB4E, + 0x96A3, 0xEB4F, 0x96A4, 0xEB50, 0x96A5, 0xEB51, 0x96A6, 0xEB52, 0x96A7, 0xCBED, 0x96A8, 0xEB53, 0x96A9, 0xEB54, 0x96AA, 0xEB55, + 0x96AB, 0xEB56, 0x96AC, 0xEB57, 0x96AD, 0xEB58, 0x96AE, 0xEB59, 0x96AF, 0xEB5A, 0x96B0, 0xDAF4, 0x96B1, 0xEB5B, 0x96B2, 0xEB5C, + 0x96B3, 0xE3C4, 0x96B4, 0xEB5D, 0x96B5, 0xEB5E, 0x96B6, 0xC1A5, 0x96B7, 0xEB5F, 0x96B8, 0xEB60, 0x96B9, 0xF6BF, 0x96BA, 0xEB61, + 0x96BB, 0xEB62, 0x96BC, 0xF6C0, 0x96BD, 0xF6C1, 0x96BE, 0xC4D1, 0x96BF, 0xEB63, 0x96C0, 0xC8B8, 0x96C1, 0xD1E3, 0x96C2, 0xEB64, + 0x96C3, 0xEB65, 0x96C4, 0xD0DB, 0x96C5, 0xD1C5, 0x96C6, 0xBCAF, 0x96C7, 0xB9CD, 0x96C8, 0xEB66, 0x96C9, 0xEFF4, 0x96CA, 0xEB67, + 0x96CB, 0xEB68, 0x96CC, 0xB4C6, 0x96CD, 0xD3BA, 0x96CE, 0xF6C2, 0x96CF, 0xB3FB, 0x96D0, 0xEB69, 0x96D1, 0xEB6A, 0x96D2, 0xF6C3, + 0x96D3, 0xEB6B, 0x96D4, 0xEB6C, 0x96D5, 0xB5F1, 0x96D6, 0xEB6D, 0x96D7, 0xEB6E, 0x96D8, 0xEB6F, 0x96D9, 0xEB70, 0x96DA, 0xEB71, + 0x96DB, 0xEB72, 0x96DC, 0xEB73, 0x96DD, 0xEB74, 0x96DE, 0xEB75, 0x96DF, 0xEB76, 0x96E0, 0xF6C5, 0x96E1, 0xEB77, 0x96E2, 0xEB78, + 0x96E3, 0xEB79, 0x96E4, 0xEB7A, 0x96E5, 0xEB7B, 0x96E6, 0xEB7C, 0x96E7, 0xEB7D, 0x96E8, 0xD3EA, 0x96E9, 0xF6A7, 0x96EA, 0xD1A9, + 0x96EB, 0xEB7E, 0x96EC, 0xEB80, 0x96ED, 0xEB81, 0x96EE, 0xEB82, 0x96EF, 0xF6A9, 0x96F0, 0xEB83, 0x96F1, 0xEB84, 0x96F2, 0xEB85, + 0x96F3, 0xF6A8, 0x96F4, 0xEB86, 0x96F5, 0xEB87, 0x96F6, 0xC1E3, 0x96F7, 0xC0D7, 0x96F8, 0xEB88, 0x96F9, 0xB1A2, 0x96FA, 0xEB89, + 0x96FB, 0xEB8A, 0x96FC, 0xEB8B, 0x96FD, 0xEB8C, 0x96FE, 0xCEED, 0x96FF, 0xEB8D, 0x9700, 0xD0E8, 0x9701, 0xF6AB, 0x9702, 0xEB8E, + 0x9703, 0xEB8F, 0x9704, 0xCFF6, 0x9705, 0xEB90, 0x9706, 0xF6AA, 0x9707, 0xD5F0, 0x9708, 0xF6AC, 0x9709, 0xC3B9, 0x970A, 0xEB91, + 0x970B, 0xEB92, 0x970C, 0xEB93, 0x970D, 0xBBF4, 0x970E, 0xF6AE, 0x970F, 0xF6AD, 0x9710, 0xEB94, 0x9711, 0xEB95, 0x9712, 0xEB96, + 0x9713, 0xC4DE, 0x9714, 0xEB97, 0x9715, 0xEB98, 0x9716, 0xC1D8, 0x9717, 0xEB99, 0x9718, 0xEB9A, 0x9719, 0xEB9B, 0x971A, 0xEB9C, + 0x971B, 0xEB9D, 0x971C, 0xCBAA, 0x971D, 0xEB9E, 0x971E, 0xCFBC, 0x971F, 0xEB9F, 0x9720, 0xEBA0, 0x9721, 0xEC40, 0x9722, 0xEC41, + 0x9723, 0xEC42, 0x9724, 0xEC43, 0x9725, 0xEC44, 0x9726, 0xEC45, 0x9727, 0xEC46, 0x9728, 0xEC47, 0x9729, 0xEC48, 0x972A, 0xF6AF, + 0x972B, 0xEC49, 0x972C, 0xEC4A, 0x972D, 0xF6B0, 0x972E, 0xEC4B, 0x972F, 0xEC4C, 0x9730, 0xF6B1, 0x9731, 0xEC4D, 0x9732, 0xC2B6, + 0x9733, 0xEC4E, 0x9734, 0xEC4F, 0x9735, 0xEC50, 0x9736, 0xEC51, 0x9737, 0xEC52, 0x9738, 0xB0D4, 0x9739, 0xC5F9, 0x973A, 0xEC53, + 0x973B, 0xEC54, 0x973C, 0xEC55, 0x973D, 0xEC56, 0x973E, 0xF6B2, 0x973F, 0xEC57, 0x9740, 0xEC58, 0x9741, 0xEC59, 0x9742, 0xEC5A, + 0x9743, 0xEC5B, 0x9744, 0xEC5C, 0x9745, 0xEC5D, 0x9746, 0xEC5E, 0x9747, 0xEC5F, 0x9748, 0xEC60, 0x9749, 0xEC61, 0x974A, 0xEC62, + 0x974B, 0xEC63, 0x974C, 0xEC64, 0x974D, 0xEC65, 0x974E, 0xEC66, 0x974F, 0xEC67, 0x9750, 0xEC68, 0x9751, 0xEC69, 0x9752, 0xC7E0, + 0x9753, 0xF6A6, 0x9754, 0xEC6A, 0x9755, 0xEC6B, 0x9756, 0xBEB8, 0x9757, 0xEC6C, 0x9758, 0xEC6D, 0x9759, 0xBEB2, 0x975A, 0xEC6E, + 0x975B, 0xB5E5, 0x975C, 0xEC6F, 0x975D, 0xEC70, 0x975E, 0xB7C7, 0x975F, 0xEC71, 0x9760, 0xBFBF, 0x9761, 0xC3D2, 0x9762, 0xC3E6, + 0x9763, 0xEC72, 0x9764, 0xEC73, 0x9765, 0xD8CC, 0x9766, 0xEC74, 0x9767, 0xEC75, 0x9768, 0xEC76, 0x9769, 0xB8EF, 0x976A, 0xEC77, + 0x976B, 0xEC78, 0x976C, 0xEC79, 0x976D, 0xEC7A, 0x976E, 0xEC7B, 0x976F, 0xEC7C, 0x9770, 0xEC7D, 0x9771, 0xEC7E, 0x9772, 0xEC80, + 0x9773, 0xBDF9, 0x9774, 0xD1A5, 0x9775, 0xEC81, 0x9776, 0xB0D0, 0x9777, 0xEC82, 0x9778, 0xEC83, 0x9779, 0xEC84, 0x977A, 0xEC85, + 0x977B, 0xEC86, 0x977C, 0xF7B0, 0x977D, 0xEC87, 0x977E, 0xEC88, 0x977F, 0xEC89, 0x9780, 0xEC8A, 0x9781, 0xEC8B, 0x9782, 0xEC8C, + 0x9783, 0xEC8D, 0x9784, 0xEC8E, 0x9785, 0xF7B1, 0x9786, 0xEC8F, 0x9787, 0xEC90, 0x9788, 0xEC91, 0x9789, 0xEC92, 0x978A, 0xEC93, + 0x978B, 0xD0AC, 0x978C, 0xEC94, 0x978D, 0xB0B0, 0x978E, 0xEC95, 0x978F, 0xEC96, 0x9790, 0xEC97, 0x9791, 0xF7B2, 0x9792, 0xF7B3, + 0x9793, 0xEC98, 0x9794, 0xF7B4, 0x9795, 0xEC99, 0x9796, 0xEC9A, 0x9797, 0xEC9B, 0x9798, 0xC7CA, 0x9799, 0xEC9C, 0x979A, 0xEC9D, + 0x979B, 0xEC9E, 0x979C, 0xEC9F, 0x979D, 0xECA0, 0x979E, 0xED40, 0x979F, 0xED41, 0x97A0, 0xBECF, 0x97A1, 0xED42, 0x97A2, 0xED43, + 0x97A3, 0xF7B7, 0x97A4, 0xED44, 0x97A5, 0xED45, 0x97A6, 0xED46, 0x97A7, 0xED47, 0x97A8, 0xED48, 0x97A9, 0xED49, 0x97AA, 0xED4A, + 0x97AB, 0xF7B6, 0x97AC, 0xED4B, 0x97AD, 0xB1DE, 0x97AE, 0xED4C, 0x97AF, 0xF7B5, 0x97B0, 0xED4D, 0x97B1, 0xED4E, 0x97B2, 0xF7B8, + 0x97B3, 0xED4F, 0x97B4, 0xF7B9, 0x97B5, 0xED50, 0x97B6, 0xED51, 0x97B7, 0xED52, 0x97B8, 0xED53, 0x97B9, 0xED54, 0x97BA, 0xED55, + 0x97BB, 0xED56, 0x97BC, 0xED57, 0x97BD, 0xED58, 0x97BE, 0xED59, 0x97BF, 0xED5A, 0x97C0, 0xED5B, 0x97C1, 0xED5C, 0x97C2, 0xED5D, + 0x97C3, 0xED5E, 0x97C4, 0xED5F, 0x97C5, 0xED60, 0x97C6, 0xED61, 0x97C7, 0xED62, 0x97C8, 0xED63, 0x97C9, 0xED64, 0x97CA, 0xED65, + 0x97CB, 0xED66, 0x97CC, 0xED67, 0x97CD, 0xED68, 0x97CE, 0xED69, 0x97CF, 0xED6A, 0x97D0, 0xED6B, 0x97D1, 0xED6C, 0x97D2, 0xED6D, + 0x97D3, 0xED6E, 0x97D4, 0xED6F, 0x97D5, 0xED70, 0x97D6, 0xED71, 0x97D7, 0xED72, 0x97D8, 0xED73, 0x97D9, 0xED74, 0x97DA, 0xED75, + 0x97DB, 0xED76, 0x97DC, 0xED77, 0x97DD, 0xED78, 0x97DE, 0xED79, 0x97DF, 0xED7A, 0x97E0, 0xED7B, 0x97E1, 0xED7C, 0x97E2, 0xED7D, + 0x97E3, 0xED7E, 0x97E4, 0xED80, 0x97E5, 0xED81, 0x97E6, 0xCEA4, 0x97E7, 0xC8CD, 0x97E8, 0xED82, 0x97E9, 0xBAAB, 0x97EA, 0xE8B8, + 0x97EB, 0xE8B9, 0x97EC, 0xE8BA, 0x97ED, 0xBEC2, 0x97EE, 0xED83, 0x97EF, 0xED84, 0x97F0, 0xED85, 0x97F1, 0xED86, 0x97F2, 0xED87, + 0x97F3, 0xD2F4, 0x97F4, 0xED88, 0x97F5, 0xD4CF, 0x97F6, 0xC9D8, 0x97F7, 0xED89, 0x97F8, 0xED8A, 0x97F9, 0xED8B, 0x97FA, 0xED8C, + 0x97FB, 0xED8D, 0x97FC, 0xED8E, 0x97FD, 0xED8F, 0x97FE, 0xED90, 0x97FF, 0xED91, 0x9800, 0xED92, 0x9801, 0xED93, 0x9802, 0xED94, + 0x9803, 0xED95, 0x9804, 0xED96, 0x9805, 0xED97, 0x9806, 0xED98, 0x9807, 0xED99, 0x9808, 0xED9A, 0x9809, 0xED9B, 0x980A, 0xED9C, + 0x980B, 0xED9D, 0x980C, 0xED9E, 0x980D, 0xED9F, 0x980E, 0xEDA0, 0x980F, 0xEE40, 0x9810, 0xEE41, 0x9811, 0xEE42, 0x9812, 0xEE43, + 0x9813, 0xEE44, 0x9814, 0xEE45, 0x9815, 0xEE46, 0x9816, 0xEE47, 0x9817, 0xEE48, 0x9818, 0xEE49, 0x9819, 0xEE4A, 0x981A, 0xEE4B, + 0x981B, 0xEE4C, 0x981C, 0xEE4D, 0x981D, 0xEE4E, 0x981E, 0xEE4F, 0x981F, 0xEE50, 0x9820, 0xEE51, 0x9821, 0xEE52, 0x9822, 0xEE53, + 0x9823, 0xEE54, 0x9824, 0xEE55, 0x9825, 0xEE56, 0x9826, 0xEE57, 0x9827, 0xEE58, 0x9828, 0xEE59, 0x9829, 0xEE5A, 0x982A, 0xEE5B, + 0x982B, 0xEE5C, 0x982C, 0xEE5D, 0x982D, 0xEE5E, 0x982E, 0xEE5F, 0x982F, 0xEE60, 0x9830, 0xEE61, 0x9831, 0xEE62, 0x9832, 0xEE63, + 0x9833, 0xEE64, 0x9834, 0xEE65, 0x9835, 0xEE66, 0x9836, 0xEE67, 0x9837, 0xEE68, 0x9838, 0xEE69, 0x9839, 0xEE6A, 0x983A, 0xEE6B, + 0x983B, 0xEE6C, 0x983C, 0xEE6D, 0x983D, 0xEE6E, 0x983E, 0xEE6F, 0x983F, 0xEE70, 0x9840, 0xEE71, 0x9841, 0xEE72, 0x9842, 0xEE73, + 0x9843, 0xEE74, 0x9844, 0xEE75, 0x9845, 0xEE76, 0x9846, 0xEE77, 0x9847, 0xEE78, 0x9848, 0xEE79, 0x9849, 0xEE7A, 0x984A, 0xEE7B, + 0x984B, 0xEE7C, 0x984C, 0xEE7D, 0x984D, 0xEE7E, 0x984E, 0xEE80, 0x984F, 0xEE81, 0x9850, 0xEE82, 0x9851, 0xEE83, 0x9852, 0xEE84, + 0x9853, 0xEE85, 0x9854, 0xEE86, 0x9855, 0xEE87, 0x9856, 0xEE88, 0x9857, 0xEE89, 0x9858, 0xEE8A, 0x9859, 0xEE8B, 0x985A, 0xEE8C, + 0x985B, 0xEE8D, 0x985C, 0xEE8E, 0x985D, 0xEE8F, 0x985E, 0xEE90, 0x985F, 0xEE91, 0x9860, 0xEE92, 0x9861, 0xEE93, 0x9862, 0xEE94, + 0x9863, 0xEE95, 0x9864, 0xEE96, 0x9865, 0xEE97, 0x9866, 0xEE98, 0x9867, 0xEE99, 0x9868, 0xEE9A, 0x9869, 0xEE9B, 0x986A, 0xEE9C, + 0x986B, 0xEE9D, 0x986C, 0xEE9E, 0x986D, 0xEE9F, 0x986E, 0xEEA0, 0x986F, 0xEF40, 0x9870, 0xEF41, 0x9871, 0xEF42, 0x9872, 0xEF43, + 0x9873, 0xEF44, 0x9874, 0xEF45, 0x9875, 0xD2B3, 0x9876, 0xB6A5, 0x9877, 0xC7EA, 0x9878, 0xF1FC, 0x9879, 0xCFEE, 0x987A, 0xCBB3, + 0x987B, 0xD0EB, 0x987C, 0xE7EF, 0x987D, 0xCDE7, 0x987E, 0xB9CB, 0x987F, 0xB6D9, 0x9880, 0xF1FD, 0x9881, 0xB0E4, 0x9882, 0xCBCC, + 0x9883, 0xF1FE, 0x9884, 0xD4A4, 0x9885, 0xC2AD, 0x9886, 0xC1EC, 0x9887, 0xC6C4, 0x9888, 0xBEB1, 0x9889, 0xF2A1, 0x988A, 0xBCD5, + 0x988B, 0xEF46, 0x988C, 0xF2A2, 0x988D, 0xF2A3, 0x988E, 0xEF47, 0x988F, 0xF2A4, 0x9890, 0xD2C3, 0x9891, 0xC6B5, 0x9892, 0xEF48, + 0x9893, 0xCDC7, 0x9894, 0xF2A5, 0x9895, 0xEF49, 0x9896, 0xD3B1, 0x9897, 0xBFC5, 0x9898, 0xCCE2, 0x9899, 0xEF4A, 0x989A, 0xF2A6, + 0x989B, 0xF2A7, 0x989C, 0xD1D5, 0x989D, 0xB6EE, 0x989E, 0xF2A8, 0x989F, 0xF2A9, 0x98A0, 0xB5DF, 0x98A1, 0xF2AA, 0x98A2, 0xF2AB, + 0x98A3, 0xEF4B, 0x98A4, 0xB2FC, 0x98A5, 0xF2AC, 0x98A6, 0xF2AD, 0x98A7, 0xC8A7, 0x98A8, 0xEF4C, 0x98A9, 0xEF4D, 0x98AA, 0xEF4E, + 0x98AB, 0xEF4F, 0x98AC, 0xEF50, 0x98AD, 0xEF51, 0x98AE, 0xEF52, 0x98AF, 0xEF53, 0x98B0, 0xEF54, 0x98B1, 0xEF55, 0x98B2, 0xEF56, + 0x98B3, 0xEF57, 0x98B4, 0xEF58, 0x98B5, 0xEF59, 0x98B6, 0xEF5A, 0x98B7, 0xEF5B, 0x98B8, 0xEF5C, 0x98B9, 0xEF5D, 0x98BA, 0xEF5E, + 0x98BB, 0xEF5F, 0x98BC, 0xEF60, 0x98BD, 0xEF61, 0x98BE, 0xEF62, 0x98BF, 0xEF63, 0x98C0, 0xEF64, 0x98C1, 0xEF65, 0x98C2, 0xEF66, + 0x98C3, 0xEF67, 0x98C4, 0xEF68, 0x98C5, 0xEF69, 0x98C6, 0xEF6A, 0x98C7, 0xEF6B, 0x98C8, 0xEF6C, 0x98C9, 0xEF6D, 0x98CA, 0xEF6E, + 0x98CB, 0xEF6F, 0x98CC, 0xEF70, 0x98CD, 0xEF71, 0x98CE, 0xB7E7, 0x98CF, 0xEF72, 0x98D0, 0xEF73, 0x98D1, 0xECA9, 0x98D2, 0xECAA, + 0x98D3, 0xECAB, 0x98D4, 0xEF74, 0x98D5, 0xECAC, 0x98D6, 0xEF75, 0x98D7, 0xEF76, 0x98D8, 0xC6AE, 0x98D9, 0xECAD, 0x98DA, 0xECAE, + 0x98DB, 0xEF77, 0x98DC, 0xEF78, 0x98DD, 0xEF79, 0x98DE, 0xB7C9, 0x98DF, 0xCAB3, 0x98E0, 0xEF7A, 0x98E1, 0xEF7B, 0x98E2, 0xEF7C, + 0x98E3, 0xEF7D, 0x98E4, 0xEF7E, 0x98E5, 0xEF80, 0x98E6, 0xEF81, 0x98E7, 0xE2B8, 0x98E8, 0xF7CF, 0x98E9, 0xEF82, 0x98EA, 0xEF83, + 0x98EB, 0xEF84, 0x98EC, 0xEF85, 0x98ED, 0xEF86, 0x98EE, 0xEF87, 0x98EF, 0xEF88, 0x98F0, 0xEF89, 0x98F1, 0xEF8A, 0x98F2, 0xEF8B, + 0x98F3, 0xEF8C, 0x98F4, 0xEF8D, 0x98F5, 0xEF8E, 0x98F6, 0xEF8F, 0x98F7, 0xEF90, 0x98F8, 0xEF91, 0x98F9, 0xEF92, 0x98FA, 0xEF93, + 0x98FB, 0xEF94, 0x98FC, 0xEF95, 0x98FD, 0xEF96, 0x98FE, 0xEF97, 0x98FF, 0xEF98, 0x9900, 0xEF99, 0x9901, 0xEF9A, 0x9902, 0xEF9B, + 0x9903, 0xEF9C, 0x9904, 0xEF9D, 0x9905, 0xEF9E, 0x9906, 0xEF9F, 0x9907, 0xEFA0, 0x9908, 0xF040, 0x9909, 0xF041, 0x990A, 0xF042, + 0x990B, 0xF043, 0x990C, 0xF044, 0x990D, 0xF7D0, 0x990E, 0xF045, 0x990F, 0xF046, 0x9910, 0xB2CD, 0x9911, 0xF047, 0x9912, 0xF048, + 0x9913, 0xF049, 0x9914, 0xF04A, 0x9915, 0xF04B, 0x9916, 0xF04C, 0x9917, 0xF04D, 0x9918, 0xF04E, 0x9919, 0xF04F, 0x991A, 0xF050, + 0x991B, 0xF051, 0x991C, 0xF052, 0x991D, 0xF053, 0x991E, 0xF054, 0x991F, 0xF055, 0x9920, 0xF056, 0x9921, 0xF057, 0x9922, 0xF058, + 0x9923, 0xF059, 0x9924, 0xF05A, 0x9925, 0xF05B, 0x9926, 0xF05C, 0x9927, 0xF05D, 0x9928, 0xF05E, 0x9929, 0xF05F, 0x992A, 0xF060, + 0x992B, 0xF061, 0x992C, 0xF062, 0x992D, 0xF063, 0x992E, 0xF7D1, 0x992F, 0xF064, 0x9930, 0xF065, 0x9931, 0xF066, 0x9932, 0xF067, + 0x9933, 0xF068, 0x9934, 0xF069, 0x9935, 0xF06A, 0x9936, 0xF06B, 0x9937, 0xF06C, 0x9938, 0xF06D, 0x9939, 0xF06E, 0x993A, 0xF06F, + 0x993B, 0xF070, 0x993C, 0xF071, 0x993D, 0xF072, 0x993E, 0xF073, 0x993F, 0xF074, 0x9940, 0xF075, 0x9941, 0xF076, 0x9942, 0xF077, + 0x9943, 0xF078, 0x9944, 0xF079, 0x9945, 0xF07A, 0x9946, 0xF07B, 0x9947, 0xF07C, 0x9948, 0xF07D, 0x9949, 0xF07E, 0x994A, 0xF080, + 0x994B, 0xF081, 0x994C, 0xF082, 0x994D, 0xF083, 0x994E, 0xF084, 0x994F, 0xF085, 0x9950, 0xF086, 0x9951, 0xF087, 0x9952, 0xF088, + 0x9953, 0xF089, 0x9954, 0xF7D3, 0x9955, 0xF7D2, 0x9956, 0xF08A, 0x9957, 0xF08B, 0x9958, 0xF08C, 0x9959, 0xF08D, 0x995A, 0xF08E, + 0x995B, 0xF08F, 0x995C, 0xF090, 0x995D, 0xF091, 0x995E, 0xF092, 0x995F, 0xF093, 0x9960, 0xF094, 0x9961, 0xF095, 0x9962, 0xF096, + 0x9963, 0xE2BB, 0x9964, 0xF097, 0x9965, 0xBCA2, 0x9966, 0xF098, 0x9967, 0xE2BC, 0x9968, 0xE2BD, 0x9969, 0xE2BE, 0x996A, 0xE2BF, + 0x996B, 0xE2C0, 0x996C, 0xE2C1, 0x996D, 0xB7B9, 0x996E, 0xD2FB, 0x996F, 0xBDA4, 0x9970, 0xCACE, 0x9971, 0xB1A5, 0x9972, 0xCBC7, + 0x9973, 0xF099, 0x9974, 0xE2C2, 0x9975, 0xB6FC, 0x9976, 0xC8C4, 0x9977, 0xE2C3, 0x9978, 0xF09A, 0x9979, 0xF09B, 0x997A, 0xBDC8, + 0x997B, 0xF09C, 0x997C, 0xB1FD, 0x997D, 0xE2C4, 0x997E, 0xF09D, 0x997F, 0xB6F6, 0x9980, 0xE2C5, 0x9981, 0xC4D9, 0x9982, 0xF09E, + 0x9983, 0xF09F, 0x9984, 0xE2C6, 0x9985, 0xCFDA, 0x9986, 0xB9DD, 0x9987, 0xE2C7, 0x9988, 0xC0A1, 0x9989, 0xF0A0, 0x998A, 0xE2C8, + 0x998B, 0xB2F6, 0x998C, 0xF140, 0x998D, 0xE2C9, 0x998E, 0xF141, 0x998F, 0xC1F3, 0x9990, 0xE2CA, 0x9991, 0xE2CB, 0x9992, 0xC2F8, + 0x9993, 0xE2CC, 0x9994, 0xE2CD, 0x9995, 0xE2CE, 0x9996, 0xCAD7, 0x9997, 0xD8B8, 0x9998, 0xD9E5, 0x9999, 0xCFE3, 0x999A, 0xF142, + 0x999B, 0xF143, 0x999C, 0xF144, 0x999D, 0xF145, 0x999E, 0xF146, 0x999F, 0xF147, 0x99A0, 0xF148, 0x99A1, 0xF149, 0x99A2, 0xF14A, + 0x99A3, 0xF14B, 0x99A4, 0xF14C, 0x99A5, 0xF0A5, 0x99A6, 0xF14D, 0x99A7, 0xF14E, 0x99A8, 0xDCB0, 0x99A9, 0xF14F, 0x99AA, 0xF150, + 0x99AB, 0xF151, 0x99AC, 0xF152, 0x99AD, 0xF153, 0x99AE, 0xF154, 0x99AF, 0xF155, 0x99B0, 0xF156, 0x99B1, 0xF157, 0x99B2, 0xF158, + 0x99B3, 0xF159, 0x99B4, 0xF15A, 0x99B5, 0xF15B, 0x99B6, 0xF15C, 0x99B7, 0xF15D, 0x99B8, 0xF15E, 0x99B9, 0xF15F, 0x99BA, 0xF160, + 0x99BB, 0xF161, 0x99BC, 0xF162, 0x99BD, 0xF163, 0x99BE, 0xF164, 0x99BF, 0xF165, 0x99C0, 0xF166, 0x99C1, 0xF167, 0x99C2, 0xF168, + 0x99C3, 0xF169, 0x99C4, 0xF16A, 0x99C5, 0xF16B, 0x99C6, 0xF16C, 0x99C7, 0xF16D, 0x99C8, 0xF16E, 0x99C9, 0xF16F, 0x99CA, 0xF170, + 0x99CB, 0xF171, 0x99CC, 0xF172, 0x99CD, 0xF173, 0x99CE, 0xF174, 0x99CF, 0xF175, 0x99D0, 0xF176, 0x99D1, 0xF177, 0x99D2, 0xF178, + 0x99D3, 0xF179, 0x99D4, 0xF17A, 0x99D5, 0xF17B, 0x99D6, 0xF17C, 0x99D7, 0xF17D, 0x99D8, 0xF17E, 0x99D9, 0xF180, 0x99DA, 0xF181, + 0x99DB, 0xF182, 0x99DC, 0xF183, 0x99DD, 0xF184, 0x99DE, 0xF185, 0x99DF, 0xF186, 0x99E0, 0xF187, 0x99E1, 0xF188, 0x99E2, 0xF189, + 0x99E3, 0xF18A, 0x99E4, 0xF18B, 0x99E5, 0xF18C, 0x99E6, 0xF18D, 0x99E7, 0xF18E, 0x99E8, 0xF18F, 0x99E9, 0xF190, 0x99EA, 0xF191, + 0x99EB, 0xF192, 0x99EC, 0xF193, 0x99ED, 0xF194, 0x99EE, 0xF195, 0x99EF, 0xF196, 0x99F0, 0xF197, 0x99F1, 0xF198, 0x99F2, 0xF199, + 0x99F3, 0xF19A, 0x99F4, 0xF19B, 0x99F5, 0xF19C, 0x99F6, 0xF19D, 0x99F7, 0xF19E, 0x99F8, 0xF19F, 0x99F9, 0xF1A0, 0x99FA, 0xF240, + 0x99FB, 0xF241, 0x99FC, 0xF242, 0x99FD, 0xF243, 0x99FE, 0xF244, 0x99FF, 0xF245, 0x9A00, 0xF246, 0x9A01, 0xF247, 0x9A02, 0xF248, + 0x9A03, 0xF249, 0x9A04, 0xF24A, 0x9A05, 0xF24B, 0x9A06, 0xF24C, 0x9A07, 0xF24D, 0x9A08, 0xF24E, 0x9A09, 0xF24F, 0x9A0A, 0xF250, + 0x9A0B, 0xF251, 0x9A0C, 0xF252, 0x9A0D, 0xF253, 0x9A0E, 0xF254, 0x9A0F, 0xF255, 0x9A10, 0xF256, 0x9A11, 0xF257, 0x9A12, 0xF258, + 0x9A13, 0xF259, 0x9A14, 0xF25A, 0x9A15, 0xF25B, 0x9A16, 0xF25C, 0x9A17, 0xF25D, 0x9A18, 0xF25E, 0x9A19, 0xF25F, 0x9A1A, 0xF260, + 0x9A1B, 0xF261, 0x9A1C, 0xF262, 0x9A1D, 0xF263, 0x9A1E, 0xF264, 0x9A1F, 0xF265, 0x9A20, 0xF266, 0x9A21, 0xF267, 0x9A22, 0xF268, + 0x9A23, 0xF269, 0x9A24, 0xF26A, 0x9A25, 0xF26B, 0x9A26, 0xF26C, 0x9A27, 0xF26D, 0x9A28, 0xF26E, 0x9A29, 0xF26F, 0x9A2A, 0xF270, + 0x9A2B, 0xF271, 0x9A2C, 0xF272, 0x9A2D, 0xF273, 0x9A2E, 0xF274, 0x9A2F, 0xF275, 0x9A30, 0xF276, 0x9A31, 0xF277, 0x9A32, 0xF278, + 0x9A33, 0xF279, 0x9A34, 0xF27A, 0x9A35, 0xF27B, 0x9A36, 0xF27C, 0x9A37, 0xF27D, 0x9A38, 0xF27E, 0x9A39, 0xF280, 0x9A3A, 0xF281, + 0x9A3B, 0xF282, 0x9A3C, 0xF283, 0x9A3D, 0xF284, 0x9A3E, 0xF285, 0x9A3F, 0xF286, 0x9A40, 0xF287, 0x9A41, 0xF288, 0x9A42, 0xF289, + 0x9A43, 0xF28A, 0x9A44, 0xF28B, 0x9A45, 0xF28C, 0x9A46, 0xF28D, 0x9A47, 0xF28E, 0x9A48, 0xF28F, 0x9A49, 0xF290, 0x9A4A, 0xF291, + 0x9A4B, 0xF292, 0x9A4C, 0xF293, 0x9A4D, 0xF294, 0x9A4E, 0xF295, 0x9A4F, 0xF296, 0x9A50, 0xF297, 0x9A51, 0xF298, 0x9A52, 0xF299, + 0x9A53, 0xF29A, 0x9A54, 0xF29B, 0x9A55, 0xF29C, 0x9A56, 0xF29D, 0x9A57, 0xF29E, 0x9A58, 0xF29F, 0x9A59, 0xF2A0, 0x9A5A, 0xF340, + 0x9A5B, 0xF341, 0x9A5C, 0xF342, 0x9A5D, 0xF343, 0x9A5E, 0xF344, 0x9A5F, 0xF345, 0x9A60, 0xF346, 0x9A61, 0xF347, 0x9A62, 0xF348, + 0x9A63, 0xF349, 0x9A64, 0xF34A, 0x9A65, 0xF34B, 0x9A66, 0xF34C, 0x9A67, 0xF34D, 0x9A68, 0xF34E, 0x9A69, 0xF34F, 0x9A6A, 0xF350, + 0x9A6B, 0xF351, 0x9A6C, 0xC2ED, 0x9A6D, 0xD4A6, 0x9A6E, 0xCDD4, 0x9A6F, 0xD1B1, 0x9A70, 0xB3DB, 0x9A71, 0xC7FD, 0x9A72, 0xF352, + 0x9A73, 0xB2B5, 0x9A74, 0xC2BF, 0x9A75, 0xE6E0, 0x9A76, 0xCABB, 0x9A77, 0xE6E1, 0x9A78, 0xE6E2, 0x9A79, 0xBED4, 0x9A7A, 0xE6E3, + 0x9A7B, 0xD7A4, 0x9A7C, 0xCDD5, 0x9A7D, 0xE6E5, 0x9A7E, 0xBCDD, 0x9A7F, 0xE6E4, 0x9A80, 0xE6E6, 0x9A81, 0xE6E7, 0x9A82, 0xC2EE, + 0x9A83, 0xF353, 0x9A84, 0xBDBE, 0x9A85, 0xE6E8, 0x9A86, 0xC2E6, 0x9A87, 0xBAA7, 0x9A88, 0xE6E9, 0x9A89, 0xF354, 0x9A8A, 0xE6EA, + 0x9A8B, 0xB3D2, 0x9A8C, 0xD1E9, 0x9A8D, 0xF355, 0x9A8E, 0xF356, 0x9A8F, 0xBFA5, 0x9A90, 0xE6EB, 0x9A91, 0xC6EF, 0x9A92, 0xE6EC, + 0x9A93, 0xE6ED, 0x9A94, 0xF357, 0x9A95, 0xF358, 0x9A96, 0xE6EE, 0x9A97, 0xC6AD, 0x9A98, 0xE6EF, 0x9A99, 0xF359, 0x9A9A, 0xC9A7, + 0x9A9B, 0xE6F0, 0x9A9C, 0xE6F1, 0x9A9D, 0xE6F2, 0x9A9E, 0xE5B9, 0x9A9F, 0xE6F3, 0x9AA0, 0xE6F4, 0x9AA1, 0xC2E2, 0x9AA2, 0xE6F5, + 0x9AA3, 0xE6F6, 0x9AA4, 0xD6E8, 0x9AA5, 0xE6F7, 0x9AA6, 0xF35A, 0x9AA7, 0xE6F8, 0x9AA8, 0xB9C7, 0x9AA9, 0xF35B, 0x9AAA, 0xF35C, + 0x9AAB, 0xF35D, 0x9AAC, 0xF35E, 0x9AAD, 0xF35F, 0x9AAE, 0xF360, 0x9AAF, 0xF361, 0x9AB0, 0xF7BB, 0x9AB1, 0xF7BA, 0x9AB2, 0xF362, + 0x9AB3, 0xF363, 0x9AB4, 0xF364, 0x9AB5, 0xF365, 0x9AB6, 0xF7BE, 0x9AB7, 0xF7BC, 0x9AB8, 0xBAA1, 0x9AB9, 0xF366, 0x9ABA, 0xF7BF, + 0x9ABB, 0xF367, 0x9ABC, 0xF7C0, 0x9ABD, 0xF368, 0x9ABE, 0xF369, 0x9ABF, 0xF36A, 0x9AC0, 0xF7C2, 0x9AC1, 0xF7C1, 0x9AC2, 0xF7C4, + 0x9AC3, 0xF36B, 0x9AC4, 0xF36C, 0x9AC5, 0xF7C3, 0x9AC6, 0xF36D, 0x9AC7, 0xF36E, 0x9AC8, 0xF36F, 0x9AC9, 0xF370, 0x9ACA, 0xF371, + 0x9ACB, 0xF7C5, 0x9ACC, 0xF7C6, 0x9ACD, 0xF372, 0x9ACE, 0xF373, 0x9ACF, 0xF374, 0x9AD0, 0xF375, 0x9AD1, 0xF7C7, 0x9AD2, 0xF376, + 0x9AD3, 0xCBE8, 0x9AD4, 0xF377, 0x9AD5, 0xF378, 0x9AD6, 0xF379, 0x9AD7, 0xF37A, 0x9AD8, 0xB8DF, 0x9AD9, 0xF37B, 0x9ADA, 0xF37C, + 0x9ADB, 0xF37D, 0x9ADC, 0xF37E, 0x9ADD, 0xF380, 0x9ADE, 0xF381, 0x9ADF, 0xF7D4, 0x9AE0, 0xF382, 0x9AE1, 0xF7D5, 0x9AE2, 0xF383, + 0x9AE3, 0xF384, 0x9AE4, 0xF385, 0x9AE5, 0xF386, 0x9AE6, 0xF7D6, 0x9AE7, 0xF387, 0x9AE8, 0xF388, 0x9AE9, 0xF389, 0x9AEA, 0xF38A, + 0x9AEB, 0xF7D8, 0x9AEC, 0xF38B, 0x9AED, 0xF7DA, 0x9AEE, 0xF38C, 0x9AEF, 0xF7D7, 0x9AF0, 0xF38D, 0x9AF1, 0xF38E, 0x9AF2, 0xF38F, + 0x9AF3, 0xF390, 0x9AF4, 0xF391, 0x9AF5, 0xF392, 0x9AF6, 0xF393, 0x9AF7, 0xF394, 0x9AF8, 0xF395, 0x9AF9, 0xF7DB, 0x9AFA, 0xF396, + 0x9AFB, 0xF7D9, 0x9AFC, 0xF397, 0x9AFD, 0xF398, 0x9AFE, 0xF399, 0x9AFF, 0xF39A, 0x9B00, 0xF39B, 0x9B01, 0xF39C, 0x9B02, 0xF39D, + 0x9B03, 0xD7D7, 0x9B04, 0xF39E, 0x9B05, 0xF39F, 0x9B06, 0xF3A0, 0x9B07, 0xF440, 0x9B08, 0xF7DC, 0x9B09, 0xF441, 0x9B0A, 0xF442, + 0x9B0B, 0xF443, 0x9B0C, 0xF444, 0x9B0D, 0xF445, 0x9B0E, 0xF446, 0x9B0F, 0xF7DD, 0x9B10, 0xF447, 0x9B11, 0xF448, 0x9B12, 0xF449, + 0x9B13, 0xF7DE, 0x9B14, 0xF44A, 0x9B15, 0xF44B, 0x9B16, 0xF44C, 0x9B17, 0xF44D, 0x9B18, 0xF44E, 0x9B19, 0xF44F, 0x9B1A, 0xF450, + 0x9B1B, 0xF451, 0x9B1C, 0xF452, 0x9B1D, 0xF453, 0x9B1E, 0xF454, 0x9B1F, 0xF7DF, 0x9B20, 0xF455, 0x9B21, 0xF456, 0x9B22, 0xF457, + 0x9B23, 0xF7E0, 0x9B24, 0xF458, 0x9B25, 0xF459, 0x9B26, 0xF45A, 0x9B27, 0xF45B, 0x9B28, 0xF45C, 0x9B29, 0xF45D, 0x9B2A, 0xF45E, + 0x9B2B, 0xF45F, 0x9B2C, 0xF460, 0x9B2D, 0xF461, 0x9B2E, 0xF462, 0x9B2F, 0xDBCB, 0x9B30, 0xF463, 0x9B31, 0xF464, 0x9B32, 0xD8AA, + 0x9B33, 0xF465, 0x9B34, 0xF466, 0x9B35, 0xF467, 0x9B36, 0xF468, 0x9B37, 0xF469, 0x9B38, 0xF46A, 0x9B39, 0xF46B, 0x9B3A, 0xF46C, + 0x9B3B, 0xE5F7, 0x9B3C, 0xB9ED, 0x9B3D, 0xF46D, 0x9B3E, 0xF46E, 0x9B3F, 0xF46F, 0x9B40, 0xF470, 0x9B41, 0xBFFD, 0x9B42, 0xBBEA, + 0x9B43, 0xF7C9, 0x9B44, 0xC6C7, 0x9B45, 0xF7C8, 0x9B46, 0xF471, 0x9B47, 0xF7CA, 0x9B48, 0xF7CC, 0x9B49, 0xF7CB, 0x9B4A, 0xF472, + 0x9B4B, 0xF473, 0x9B4C, 0xF474, 0x9B4D, 0xF7CD, 0x9B4E, 0xF475, 0x9B4F, 0xCEBA, 0x9B50, 0xF476, 0x9B51, 0xF7CE, 0x9B52, 0xF477, + 0x9B53, 0xF478, 0x9B54, 0xC4A7, 0x9B55, 0xF479, 0x9B56, 0xF47A, 0x9B57, 0xF47B, 0x9B58, 0xF47C, 0x9B59, 0xF47D, 0x9B5A, 0xF47E, + 0x9B5B, 0xF480, 0x9B5C, 0xF481, 0x9B5D, 0xF482, 0x9B5E, 0xF483, 0x9B5F, 0xF484, 0x9B60, 0xF485, 0x9B61, 0xF486, 0x9B62, 0xF487, + 0x9B63, 0xF488, 0x9B64, 0xF489, 0x9B65, 0xF48A, 0x9B66, 0xF48B, 0x9B67, 0xF48C, 0x9B68, 0xF48D, 0x9B69, 0xF48E, 0x9B6A, 0xF48F, + 0x9B6B, 0xF490, 0x9B6C, 0xF491, 0x9B6D, 0xF492, 0x9B6E, 0xF493, 0x9B6F, 0xF494, 0x9B70, 0xF495, 0x9B71, 0xF496, 0x9B72, 0xF497, + 0x9B73, 0xF498, 0x9B74, 0xF499, 0x9B75, 0xF49A, 0x9B76, 0xF49B, 0x9B77, 0xF49C, 0x9B78, 0xF49D, 0x9B79, 0xF49E, 0x9B7A, 0xF49F, + 0x9B7B, 0xF4A0, 0x9B7C, 0xF540, 0x9B7D, 0xF541, 0x9B7E, 0xF542, 0x9B7F, 0xF543, 0x9B80, 0xF544, 0x9B81, 0xF545, 0x9B82, 0xF546, + 0x9B83, 0xF547, 0x9B84, 0xF548, 0x9B85, 0xF549, 0x9B86, 0xF54A, 0x9B87, 0xF54B, 0x9B88, 0xF54C, 0x9B89, 0xF54D, 0x9B8A, 0xF54E, + 0x9B8B, 0xF54F, 0x9B8C, 0xF550, 0x9B8D, 0xF551, 0x9B8E, 0xF552, 0x9B8F, 0xF553, 0x9B90, 0xF554, 0x9B91, 0xF555, 0x9B92, 0xF556, + 0x9B93, 0xF557, 0x9B94, 0xF558, 0x9B95, 0xF559, 0x9B96, 0xF55A, 0x9B97, 0xF55B, 0x9B98, 0xF55C, 0x9B99, 0xF55D, 0x9B9A, 0xF55E, + 0x9B9B, 0xF55F, 0x9B9C, 0xF560, 0x9B9D, 0xF561, 0x9B9E, 0xF562, 0x9B9F, 0xF563, 0x9BA0, 0xF564, 0x9BA1, 0xF565, 0x9BA2, 0xF566, + 0x9BA3, 0xF567, 0x9BA4, 0xF568, 0x9BA5, 0xF569, 0x9BA6, 0xF56A, 0x9BA7, 0xF56B, 0x9BA8, 0xF56C, 0x9BA9, 0xF56D, 0x9BAA, 0xF56E, + 0x9BAB, 0xF56F, 0x9BAC, 0xF570, 0x9BAD, 0xF571, 0x9BAE, 0xF572, 0x9BAF, 0xF573, 0x9BB0, 0xF574, 0x9BB1, 0xF575, 0x9BB2, 0xF576, + 0x9BB3, 0xF577, 0x9BB4, 0xF578, 0x9BB5, 0xF579, 0x9BB6, 0xF57A, 0x9BB7, 0xF57B, 0x9BB8, 0xF57C, 0x9BB9, 0xF57D, 0x9BBA, 0xF57E, + 0x9BBB, 0xF580, 0x9BBC, 0xF581, 0x9BBD, 0xF582, 0x9BBE, 0xF583, 0x9BBF, 0xF584, 0x9BC0, 0xF585, 0x9BC1, 0xF586, 0x9BC2, 0xF587, + 0x9BC3, 0xF588, 0x9BC4, 0xF589, 0x9BC5, 0xF58A, 0x9BC6, 0xF58B, 0x9BC7, 0xF58C, 0x9BC8, 0xF58D, 0x9BC9, 0xF58E, 0x9BCA, 0xF58F, + 0x9BCB, 0xF590, 0x9BCC, 0xF591, 0x9BCD, 0xF592, 0x9BCE, 0xF593, 0x9BCF, 0xF594, 0x9BD0, 0xF595, 0x9BD1, 0xF596, 0x9BD2, 0xF597, + 0x9BD3, 0xF598, 0x9BD4, 0xF599, 0x9BD5, 0xF59A, 0x9BD6, 0xF59B, 0x9BD7, 0xF59C, 0x9BD8, 0xF59D, 0x9BD9, 0xF59E, 0x9BDA, 0xF59F, + 0x9BDB, 0xF5A0, 0x9BDC, 0xF640, 0x9BDD, 0xF641, 0x9BDE, 0xF642, 0x9BDF, 0xF643, 0x9BE0, 0xF644, 0x9BE1, 0xF645, 0x9BE2, 0xF646, + 0x9BE3, 0xF647, 0x9BE4, 0xF648, 0x9BE5, 0xF649, 0x9BE6, 0xF64A, 0x9BE7, 0xF64B, 0x9BE8, 0xF64C, 0x9BE9, 0xF64D, 0x9BEA, 0xF64E, + 0x9BEB, 0xF64F, 0x9BEC, 0xF650, 0x9BED, 0xF651, 0x9BEE, 0xF652, 0x9BEF, 0xF653, 0x9BF0, 0xF654, 0x9BF1, 0xF655, 0x9BF2, 0xF656, + 0x9BF3, 0xF657, 0x9BF4, 0xF658, 0x9BF5, 0xF659, 0x9BF6, 0xF65A, 0x9BF7, 0xF65B, 0x9BF8, 0xF65C, 0x9BF9, 0xF65D, 0x9BFA, 0xF65E, + 0x9BFB, 0xF65F, 0x9BFC, 0xF660, 0x9BFD, 0xF661, 0x9BFE, 0xF662, 0x9BFF, 0xF663, 0x9C00, 0xF664, 0x9C01, 0xF665, 0x9C02, 0xF666, + 0x9C03, 0xF667, 0x9C04, 0xF668, 0x9C05, 0xF669, 0x9C06, 0xF66A, 0x9C07, 0xF66B, 0x9C08, 0xF66C, 0x9C09, 0xF66D, 0x9C0A, 0xF66E, + 0x9C0B, 0xF66F, 0x9C0C, 0xF670, 0x9C0D, 0xF671, 0x9C0E, 0xF672, 0x9C0F, 0xF673, 0x9C10, 0xF674, 0x9C11, 0xF675, 0x9C12, 0xF676, + 0x9C13, 0xF677, 0x9C14, 0xF678, 0x9C15, 0xF679, 0x9C16, 0xF67A, 0x9C17, 0xF67B, 0x9C18, 0xF67C, 0x9C19, 0xF67D, 0x9C1A, 0xF67E, + 0x9C1B, 0xF680, 0x9C1C, 0xF681, 0x9C1D, 0xF682, 0x9C1E, 0xF683, 0x9C1F, 0xF684, 0x9C20, 0xF685, 0x9C21, 0xF686, 0x9C22, 0xF687, + 0x9C23, 0xF688, 0x9C24, 0xF689, 0x9C25, 0xF68A, 0x9C26, 0xF68B, 0x9C27, 0xF68C, 0x9C28, 0xF68D, 0x9C29, 0xF68E, 0x9C2A, 0xF68F, + 0x9C2B, 0xF690, 0x9C2C, 0xF691, 0x9C2D, 0xF692, 0x9C2E, 0xF693, 0x9C2F, 0xF694, 0x9C30, 0xF695, 0x9C31, 0xF696, 0x9C32, 0xF697, + 0x9C33, 0xF698, 0x9C34, 0xF699, 0x9C35, 0xF69A, 0x9C36, 0xF69B, 0x9C37, 0xF69C, 0x9C38, 0xF69D, 0x9C39, 0xF69E, 0x9C3A, 0xF69F, + 0x9C3B, 0xF6A0, 0x9C3C, 0xF740, 0x9C3D, 0xF741, 0x9C3E, 0xF742, 0x9C3F, 0xF743, 0x9C40, 0xF744, 0x9C41, 0xF745, 0x9C42, 0xF746, + 0x9C43, 0xF747, 0x9C44, 0xF748, 0x9C45, 0xF749, 0x9C46, 0xF74A, 0x9C47, 0xF74B, 0x9C48, 0xF74C, 0x9C49, 0xF74D, 0x9C4A, 0xF74E, + 0x9C4B, 0xF74F, 0x9C4C, 0xF750, 0x9C4D, 0xF751, 0x9C4E, 0xF752, 0x9C4F, 0xF753, 0x9C50, 0xF754, 0x9C51, 0xF755, 0x9C52, 0xF756, + 0x9C53, 0xF757, 0x9C54, 0xF758, 0x9C55, 0xF759, 0x9C56, 0xF75A, 0x9C57, 0xF75B, 0x9C58, 0xF75C, 0x9C59, 0xF75D, 0x9C5A, 0xF75E, + 0x9C5B, 0xF75F, 0x9C5C, 0xF760, 0x9C5D, 0xF761, 0x9C5E, 0xF762, 0x9C5F, 0xF763, 0x9C60, 0xF764, 0x9C61, 0xF765, 0x9C62, 0xF766, + 0x9C63, 0xF767, 0x9C64, 0xF768, 0x9C65, 0xF769, 0x9C66, 0xF76A, 0x9C67, 0xF76B, 0x9C68, 0xF76C, 0x9C69, 0xF76D, 0x9C6A, 0xF76E, + 0x9C6B, 0xF76F, 0x9C6C, 0xF770, 0x9C6D, 0xF771, 0x9C6E, 0xF772, 0x9C6F, 0xF773, 0x9C70, 0xF774, 0x9C71, 0xF775, 0x9C72, 0xF776, + 0x9C73, 0xF777, 0x9C74, 0xF778, 0x9C75, 0xF779, 0x9C76, 0xF77A, 0x9C77, 0xF77B, 0x9C78, 0xF77C, 0x9C79, 0xF77D, 0x9C7A, 0xF77E, + 0x9C7B, 0xF780, 0x9C7C, 0xD3E3, 0x9C7D, 0xF781, 0x9C7E, 0xF782, 0x9C7F, 0xF6CF, 0x9C80, 0xF783, 0x9C81, 0xC2B3, 0x9C82, 0xF6D0, + 0x9C83, 0xF784, 0x9C84, 0xF785, 0x9C85, 0xF6D1, 0x9C86, 0xF6D2, 0x9C87, 0xF6D3, 0x9C88, 0xF6D4, 0x9C89, 0xF786, 0x9C8A, 0xF787, + 0x9C8B, 0xF6D6, 0x9C8C, 0xF788, 0x9C8D, 0xB1AB, 0x9C8E, 0xF6D7, 0x9C8F, 0xF789, 0x9C90, 0xF6D8, 0x9C91, 0xF6D9, 0x9C92, 0xF6DA, + 0x9C93, 0xF78A, 0x9C94, 0xF6DB, 0x9C95, 0xF6DC, 0x9C96, 0xF78B, 0x9C97, 0xF78C, 0x9C98, 0xF78D, 0x9C99, 0xF78E, 0x9C9A, 0xF6DD, + 0x9C9B, 0xF6DE, 0x9C9C, 0xCFCA, 0x9C9D, 0xF78F, 0x9C9E, 0xF6DF, 0x9C9F, 0xF6E0, 0x9CA0, 0xF6E1, 0x9CA1, 0xF6E2, 0x9CA2, 0xF6E3, + 0x9CA3, 0xF6E4, 0x9CA4, 0xC0F0, 0x9CA5, 0xF6E5, 0x9CA6, 0xF6E6, 0x9CA7, 0xF6E7, 0x9CA8, 0xF6E8, 0x9CA9, 0xF6E9, 0x9CAA, 0xF790, + 0x9CAB, 0xF6EA, 0x9CAC, 0xF791, 0x9CAD, 0xF6EB, 0x9CAE, 0xF6EC, 0x9CAF, 0xF792, 0x9CB0, 0xF6ED, 0x9CB1, 0xF6EE, 0x9CB2, 0xF6EF, + 0x9CB3, 0xF6F0, 0x9CB4, 0xF6F1, 0x9CB5, 0xF6F2, 0x9CB6, 0xF6F3, 0x9CB7, 0xF6F4, 0x9CB8, 0xBEA8, 0x9CB9, 0xF793, 0x9CBA, 0xF6F5, + 0x9CBB, 0xF6F6, 0x9CBC, 0xF6F7, 0x9CBD, 0xF6F8, 0x9CBE, 0xF794, 0x9CBF, 0xF795, 0x9CC0, 0xF796, 0x9CC1, 0xF797, 0x9CC2, 0xF798, + 0x9CC3, 0xC8FA, 0x9CC4, 0xF6F9, 0x9CC5, 0xF6FA, 0x9CC6, 0xF6FB, 0x9CC7, 0xF6FC, 0x9CC8, 0xF799, 0x9CC9, 0xF79A, 0x9CCA, 0xF6FD, + 0x9CCB, 0xF6FE, 0x9CCC, 0xF7A1, 0x9CCD, 0xF7A2, 0x9CCE, 0xF7A3, 0x9CCF, 0xF7A4, 0x9CD0, 0xF7A5, 0x9CD1, 0xF79B, 0x9CD2, 0xF79C, + 0x9CD3, 0xF7A6, 0x9CD4, 0xF7A7, 0x9CD5, 0xF7A8, 0x9CD6, 0xB1EE, 0x9CD7, 0xF7A9, 0x9CD8, 0xF7AA, 0x9CD9, 0xF7AB, 0x9CDA, 0xF79D, + 0x9CDB, 0xF79E, 0x9CDC, 0xF7AC, 0x9CDD, 0xF7AD, 0x9CDE, 0xC1DB, 0x9CDF, 0xF7AE, 0x9CE0, 0xF79F, 0x9CE1, 0xF7A0, 0x9CE2, 0xF7AF, + 0x9CE3, 0xF840, 0x9CE4, 0xF841, 0x9CE5, 0xF842, 0x9CE6, 0xF843, 0x9CE7, 0xF844, 0x9CE8, 0xF845, 0x9CE9, 0xF846, 0x9CEA, 0xF847, + 0x9CEB, 0xF848, 0x9CEC, 0xF849, 0x9CED, 0xF84A, 0x9CEE, 0xF84B, 0x9CEF, 0xF84C, 0x9CF0, 0xF84D, 0x9CF1, 0xF84E, 0x9CF2, 0xF84F, + 0x9CF3, 0xF850, 0x9CF4, 0xF851, 0x9CF5, 0xF852, 0x9CF6, 0xF853, 0x9CF7, 0xF854, 0x9CF8, 0xF855, 0x9CF9, 0xF856, 0x9CFA, 0xF857, + 0x9CFB, 0xF858, 0x9CFC, 0xF859, 0x9CFD, 0xF85A, 0x9CFE, 0xF85B, 0x9CFF, 0xF85C, 0x9D00, 0xF85D, 0x9D01, 0xF85E, 0x9D02, 0xF85F, + 0x9D03, 0xF860, 0x9D04, 0xF861, 0x9D05, 0xF862, 0x9D06, 0xF863, 0x9D07, 0xF864, 0x9D08, 0xF865, 0x9D09, 0xF866, 0x9D0A, 0xF867, + 0x9D0B, 0xF868, 0x9D0C, 0xF869, 0x9D0D, 0xF86A, 0x9D0E, 0xF86B, 0x9D0F, 0xF86C, 0x9D10, 0xF86D, 0x9D11, 0xF86E, 0x9D12, 0xF86F, + 0x9D13, 0xF870, 0x9D14, 0xF871, 0x9D15, 0xF872, 0x9D16, 0xF873, 0x9D17, 0xF874, 0x9D18, 0xF875, 0x9D19, 0xF876, 0x9D1A, 0xF877, + 0x9D1B, 0xF878, 0x9D1C, 0xF879, 0x9D1D, 0xF87A, 0x9D1E, 0xF87B, 0x9D1F, 0xF87C, 0x9D20, 0xF87D, 0x9D21, 0xF87E, 0x9D22, 0xF880, + 0x9D23, 0xF881, 0x9D24, 0xF882, 0x9D25, 0xF883, 0x9D26, 0xF884, 0x9D27, 0xF885, 0x9D28, 0xF886, 0x9D29, 0xF887, 0x9D2A, 0xF888, + 0x9D2B, 0xF889, 0x9D2C, 0xF88A, 0x9D2D, 0xF88B, 0x9D2E, 0xF88C, 0x9D2F, 0xF88D, 0x9D30, 0xF88E, 0x9D31, 0xF88F, 0x9D32, 0xF890, + 0x9D33, 0xF891, 0x9D34, 0xF892, 0x9D35, 0xF893, 0x9D36, 0xF894, 0x9D37, 0xF895, 0x9D38, 0xF896, 0x9D39, 0xF897, 0x9D3A, 0xF898, + 0x9D3B, 0xF899, 0x9D3C, 0xF89A, 0x9D3D, 0xF89B, 0x9D3E, 0xF89C, 0x9D3F, 0xF89D, 0x9D40, 0xF89E, 0x9D41, 0xF89F, 0x9D42, 0xF8A0, + 0x9D43, 0xF940, 0x9D44, 0xF941, 0x9D45, 0xF942, 0x9D46, 0xF943, 0x9D47, 0xF944, 0x9D48, 0xF945, 0x9D49, 0xF946, 0x9D4A, 0xF947, + 0x9D4B, 0xF948, 0x9D4C, 0xF949, 0x9D4D, 0xF94A, 0x9D4E, 0xF94B, 0x9D4F, 0xF94C, 0x9D50, 0xF94D, 0x9D51, 0xF94E, 0x9D52, 0xF94F, + 0x9D53, 0xF950, 0x9D54, 0xF951, 0x9D55, 0xF952, 0x9D56, 0xF953, 0x9D57, 0xF954, 0x9D58, 0xF955, 0x9D59, 0xF956, 0x9D5A, 0xF957, + 0x9D5B, 0xF958, 0x9D5C, 0xF959, 0x9D5D, 0xF95A, 0x9D5E, 0xF95B, 0x9D5F, 0xF95C, 0x9D60, 0xF95D, 0x9D61, 0xF95E, 0x9D62, 0xF95F, + 0x9D63, 0xF960, 0x9D64, 0xF961, 0x9D65, 0xF962, 0x9D66, 0xF963, 0x9D67, 0xF964, 0x9D68, 0xF965, 0x9D69, 0xF966, 0x9D6A, 0xF967, + 0x9D6B, 0xF968, 0x9D6C, 0xF969, 0x9D6D, 0xF96A, 0x9D6E, 0xF96B, 0x9D6F, 0xF96C, 0x9D70, 0xF96D, 0x9D71, 0xF96E, 0x9D72, 0xF96F, + 0x9D73, 0xF970, 0x9D74, 0xF971, 0x9D75, 0xF972, 0x9D76, 0xF973, 0x9D77, 0xF974, 0x9D78, 0xF975, 0x9D79, 0xF976, 0x9D7A, 0xF977, + 0x9D7B, 0xF978, 0x9D7C, 0xF979, 0x9D7D, 0xF97A, 0x9D7E, 0xF97B, 0x9D7F, 0xF97C, 0x9D80, 0xF97D, 0x9D81, 0xF97E, 0x9D82, 0xF980, + 0x9D83, 0xF981, 0x9D84, 0xF982, 0x9D85, 0xF983, 0x9D86, 0xF984, 0x9D87, 0xF985, 0x9D88, 0xF986, 0x9D89, 0xF987, 0x9D8A, 0xF988, + 0x9D8B, 0xF989, 0x9D8C, 0xF98A, 0x9D8D, 0xF98B, 0x9D8E, 0xF98C, 0x9D8F, 0xF98D, 0x9D90, 0xF98E, 0x9D91, 0xF98F, 0x9D92, 0xF990, + 0x9D93, 0xF991, 0x9D94, 0xF992, 0x9D95, 0xF993, 0x9D96, 0xF994, 0x9D97, 0xF995, 0x9D98, 0xF996, 0x9D99, 0xF997, 0x9D9A, 0xF998, + 0x9D9B, 0xF999, 0x9D9C, 0xF99A, 0x9D9D, 0xF99B, 0x9D9E, 0xF99C, 0x9D9F, 0xF99D, 0x9DA0, 0xF99E, 0x9DA1, 0xF99F, 0x9DA2, 0xF9A0, + 0x9DA3, 0xFA40, 0x9DA4, 0xFA41, 0x9DA5, 0xFA42, 0x9DA6, 0xFA43, 0x9DA7, 0xFA44, 0x9DA8, 0xFA45, 0x9DA9, 0xFA46, 0x9DAA, 0xFA47, + 0x9DAB, 0xFA48, 0x9DAC, 0xFA49, 0x9DAD, 0xFA4A, 0x9DAE, 0xFA4B, 0x9DAF, 0xFA4C, 0x9DB0, 0xFA4D, 0x9DB1, 0xFA4E, 0x9DB2, 0xFA4F, + 0x9DB3, 0xFA50, 0x9DB4, 0xFA51, 0x9DB5, 0xFA52, 0x9DB6, 0xFA53, 0x9DB7, 0xFA54, 0x9DB8, 0xFA55, 0x9DB9, 0xFA56, 0x9DBA, 0xFA57, + 0x9DBB, 0xFA58, 0x9DBC, 0xFA59, 0x9DBD, 0xFA5A, 0x9DBE, 0xFA5B, 0x9DBF, 0xFA5C, 0x9DC0, 0xFA5D, 0x9DC1, 0xFA5E, 0x9DC2, 0xFA5F, + 0x9DC3, 0xFA60, 0x9DC4, 0xFA61, 0x9DC5, 0xFA62, 0x9DC6, 0xFA63, 0x9DC7, 0xFA64, 0x9DC8, 0xFA65, 0x9DC9, 0xFA66, 0x9DCA, 0xFA67, + 0x9DCB, 0xFA68, 0x9DCC, 0xFA69, 0x9DCD, 0xFA6A, 0x9DCE, 0xFA6B, 0x9DCF, 0xFA6C, 0x9DD0, 0xFA6D, 0x9DD1, 0xFA6E, 0x9DD2, 0xFA6F, + 0x9DD3, 0xFA70, 0x9DD4, 0xFA71, 0x9DD5, 0xFA72, 0x9DD6, 0xFA73, 0x9DD7, 0xFA74, 0x9DD8, 0xFA75, 0x9DD9, 0xFA76, 0x9DDA, 0xFA77, + 0x9DDB, 0xFA78, 0x9DDC, 0xFA79, 0x9DDD, 0xFA7A, 0x9DDE, 0xFA7B, 0x9DDF, 0xFA7C, 0x9DE0, 0xFA7D, 0x9DE1, 0xFA7E, 0x9DE2, 0xFA80, + 0x9DE3, 0xFA81, 0x9DE4, 0xFA82, 0x9DE5, 0xFA83, 0x9DE6, 0xFA84, 0x9DE7, 0xFA85, 0x9DE8, 0xFA86, 0x9DE9, 0xFA87, 0x9DEA, 0xFA88, + 0x9DEB, 0xFA89, 0x9DEC, 0xFA8A, 0x9DED, 0xFA8B, 0x9DEE, 0xFA8C, 0x9DEF, 0xFA8D, 0x9DF0, 0xFA8E, 0x9DF1, 0xFA8F, 0x9DF2, 0xFA90, + 0x9DF3, 0xFA91, 0x9DF4, 0xFA92, 0x9DF5, 0xFA93, 0x9DF6, 0xFA94, 0x9DF7, 0xFA95, 0x9DF8, 0xFA96, 0x9DF9, 0xFA97, 0x9DFA, 0xFA98, + 0x9DFB, 0xFA99, 0x9DFC, 0xFA9A, 0x9DFD, 0xFA9B, 0x9DFE, 0xFA9C, 0x9DFF, 0xFA9D, 0x9E00, 0xFA9E, 0x9E01, 0xFA9F, 0x9E02, 0xFAA0, + 0x9E03, 0xFB40, 0x9E04, 0xFB41, 0x9E05, 0xFB42, 0x9E06, 0xFB43, 0x9E07, 0xFB44, 0x9E08, 0xFB45, 0x9E09, 0xFB46, 0x9E0A, 0xFB47, + 0x9E0B, 0xFB48, 0x9E0C, 0xFB49, 0x9E0D, 0xFB4A, 0x9E0E, 0xFB4B, 0x9E0F, 0xFB4C, 0x9E10, 0xFB4D, 0x9E11, 0xFB4E, 0x9E12, 0xFB4F, + 0x9E13, 0xFB50, 0x9E14, 0xFB51, 0x9E15, 0xFB52, 0x9E16, 0xFB53, 0x9E17, 0xFB54, 0x9E18, 0xFB55, 0x9E19, 0xFB56, 0x9E1A, 0xFB57, + 0x9E1B, 0xFB58, 0x9E1C, 0xFB59, 0x9E1D, 0xFB5A, 0x9E1E, 0xFB5B, 0x9E1F, 0xC4F1, 0x9E20, 0xF0AF, 0x9E21, 0xBCA6, 0x9E22, 0xF0B0, + 0x9E23, 0xC3F9, 0x9E24, 0xFB5C, 0x9E25, 0xC5B8, 0x9E26, 0xD1BB, 0x9E27, 0xFB5D, 0x9E28, 0xF0B1, 0x9E29, 0xF0B2, 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, 0x9E2C, 0xF0B5, 0x9E2D, 0xD1BC, 0x9E2E, 0xFB5E, 0x9E2F, 0xD1EC, 0x9E30, 0xFB5F, 0x9E31, 0xF0B7, 0x9E32, 0xF0B6, + 0x9E33, 0xD4A7, 0x9E34, 0xFB60, 0x9E35, 0xCDD2, 0x9E36, 0xF0B8, 0x9E37, 0xF0BA, 0x9E38, 0xF0B9, 0x9E39, 0xF0BB, 0x9E3A, 0xF0BC, + 0x9E3B, 0xFB61, 0x9E3C, 0xFB62, 0x9E3D, 0xB8EB, 0x9E3E, 0xF0BD, 0x9E3F, 0xBAE8, 0x9E40, 0xFB63, 0x9E41, 0xF0BE, 0x9E42, 0xF0BF, + 0x9E43, 0xBEE9, 0x9E44, 0xF0C0, 0x9E45, 0xB6EC, 0x9E46, 0xF0C1, 0x9E47, 0xF0C2, 0x9E48, 0xF0C3, 0x9E49, 0xF0C4, 0x9E4A, 0xC8B5, + 0x9E4B, 0xF0C5, 0x9E4C, 0xF0C6, 0x9E4D, 0xFB64, 0x9E4E, 0xF0C7, 0x9E4F, 0xC5F4, 0x9E50, 0xFB65, 0x9E51, 0xF0C8, 0x9E52, 0xFB66, + 0x9E53, 0xFB67, 0x9E54, 0xFB68, 0x9E55, 0xF0C9, 0x9E56, 0xFB69, 0x9E57, 0xF0CA, 0x9E58, 0xF7BD, 0x9E59, 0xFB6A, 0x9E5A, 0xF0CB, + 0x9E5B, 0xF0CC, 0x9E5C, 0xF0CD, 0x9E5D, 0xFB6B, 0x9E5E, 0xF0CE, 0x9E5F, 0xFB6C, 0x9E60, 0xFB6D, 0x9E61, 0xFB6E, 0x9E62, 0xFB6F, + 0x9E63, 0xF0CF, 0x9E64, 0xBAD7, 0x9E65, 0xFB70, 0x9E66, 0xF0D0, 0x9E67, 0xF0D1, 0x9E68, 0xF0D2, 0x9E69, 0xF0D3, 0x9E6A, 0xF0D4, + 0x9E6B, 0xF0D5, 0x9E6C, 0xF0D6, 0x9E6D, 0xF0D8, 0x9E6E, 0xFB71, 0x9E6F, 0xFB72, 0x9E70, 0xD3A5, 0x9E71, 0xF0D7, 0x9E72, 0xFB73, + 0x9E73, 0xF0D9, 0x9E74, 0xFB74, 0x9E75, 0xFB75, 0x9E76, 0xFB76, 0x9E77, 0xFB77, 0x9E78, 0xFB78, 0x9E79, 0xFB79, 0x9E7A, 0xFB7A, + 0x9E7B, 0xFB7B, 0x9E7C, 0xFB7C, 0x9E7D, 0xFB7D, 0x9E7E, 0xF5BA, 0x9E7F, 0xC2B9, 0x9E80, 0xFB7E, 0x9E81, 0xFB80, 0x9E82, 0xF7E4, + 0x9E83, 0xFB81, 0x9E84, 0xFB82, 0x9E85, 0xFB83, 0x9E86, 0xFB84, 0x9E87, 0xF7E5, 0x9E88, 0xF7E6, 0x9E89, 0xFB85, 0x9E8A, 0xFB86, + 0x9E8B, 0xF7E7, 0x9E8C, 0xFB87, 0x9E8D, 0xFB88, 0x9E8E, 0xFB89, 0x9E8F, 0xFB8A, 0x9E90, 0xFB8B, 0x9E91, 0xFB8C, 0x9E92, 0xF7E8, + 0x9E93, 0xC2B4, 0x9E94, 0xFB8D, 0x9E95, 0xFB8E, 0x9E96, 0xFB8F, 0x9E97, 0xFB90, 0x9E98, 0xFB91, 0x9E99, 0xFB92, 0x9E9A, 0xFB93, + 0x9E9B, 0xFB94, 0x9E9C, 0xFB95, 0x9E9D, 0xF7EA, 0x9E9E, 0xFB96, 0x9E9F, 0xF7EB, 0x9EA0, 0xFB97, 0x9EA1, 0xFB98, 0x9EA2, 0xFB99, + 0x9EA3, 0xFB9A, 0x9EA4, 0xFB9B, 0x9EA5, 0xFB9C, 0x9EA6, 0xC2F3, 0x9EA7, 0xFB9D, 0x9EA8, 0xFB9E, 0x9EA9, 0xFB9F, 0x9EAA, 0xFBA0, + 0x9EAB, 0xFC40, 0x9EAC, 0xFC41, 0x9EAD, 0xFC42, 0x9EAE, 0xFC43, 0x9EAF, 0xFC44, 0x9EB0, 0xFC45, 0x9EB1, 0xFC46, 0x9EB2, 0xFC47, + 0x9EB3, 0xFC48, 0x9EB4, 0xF4F0, 0x9EB5, 0xFC49, 0x9EB6, 0xFC4A, 0x9EB7, 0xFC4B, 0x9EB8, 0xF4EF, 0x9EB9, 0xFC4C, 0x9EBA, 0xFC4D, + 0x9EBB, 0xC2E9, 0x9EBC, 0xFC4E, 0x9EBD, 0xF7E1, 0x9EBE, 0xF7E2, 0x9EBF, 0xFC4F, 0x9EC0, 0xFC50, 0x9EC1, 0xFC51, 0x9EC2, 0xFC52, + 0x9EC3, 0xFC53, 0x9EC4, 0xBBC6, 0x9EC5, 0xFC54, 0x9EC6, 0xFC55, 0x9EC7, 0xFC56, 0x9EC8, 0xFC57, 0x9EC9, 0xD9E4, 0x9ECA, 0xFC58, + 0x9ECB, 0xFC59, 0x9ECC, 0xFC5A, 0x9ECD, 0xCAF2, 0x9ECE, 0xC0E8, 0x9ECF, 0xF0A4, 0x9ED0, 0xFC5B, 0x9ED1, 0xBADA, 0x9ED2, 0xFC5C, + 0x9ED3, 0xFC5D, 0x9ED4, 0xC7AD, 0x9ED5, 0xFC5E, 0x9ED6, 0xFC5F, 0x9ED7, 0xFC60, 0x9ED8, 0xC4AC, 0x9ED9, 0xFC61, 0x9EDA, 0xFC62, + 0x9EDB, 0xF7EC, 0x9EDC, 0xF7ED, 0x9EDD, 0xF7EE, 0x9EDE, 0xFC63, 0x9EDF, 0xF7F0, 0x9EE0, 0xF7EF, 0x9EE1, 0xFC64, 0x9EE2, 0xF7F1, + 0x9EE3, 0xFC65, 0x9EE4, 0xFC66, 0x9EE5, 0xF7F4, 0x9EE6, 0xFC67, 0x9EE7, 0xF7F3, 0x9EE8, 0xFC68, 0x9EE9, 0xF7F2, 0x9EEA, 0xF7F5, + 0x9EEB, 0xFC69, 0x9EEC, 0xFC6A, 0x9EED, 0xFC6B, 0x9EEE, 0xFC6C, 0x9EEF, 0xF7F6, 0x9EF0, 0xFC6D, 0x9EF1, 0xFC6E, 0x9EF2, 0xFC6F, + 0x9EF3, 0xFC70, 0x9EF4, 0xFC71, 0x9EF5, 0xFC72, 0x9EF6, 0xFC73, 0x9EF7, 0xFC74, 0x9EF8, 0xFC75, 0x9EF9, 0xEDE9, 0x9EFA, 0xFC76, + 0x9EFB, 0xEDEA, 0x9EFC, 0xEDEB, 0x9EFD, 0xFC77, 0x9EFE, 0xF6BC, 0x9EFF, 0xFC78, 0x9F00, 0xFC79, 0x9F01, 0xFC7A, 0x9F02, 0xFC7B, + 0x9F03, 0xFC7C, 0x9F04, 0xFC7D, 0x9F05, 0xFC7E, 0x9F06, 0xFC80, 0x9F07, 0xFC81, 0x9F08, 0xFC82, 0x9F09, 0xFC83, 0x9F0A, 0xFC84, + 0x9F0B, 0xF6BD, 0x9F0C, 0xFC85, 0x9F0D, 0xF6BE, 0x9F0E, 0xB6A6, 0x9F0F, 0xFC86, 0x9F10, 0xD8BE, 0x9F11, 0xFC87, 0x9F12, 0xFC88, + 0x9F13, 0xB9C4, 0x9F14, 0xFC89, 0x9F15, 0xFC8A, 0x9F16, 0xFC8B, 0x9F17, 0xD8BB, 0x9F18, 0xFC8C, 0x9F19, 0xDCB1, 0x9F1A, 0xFC8D, + 0x9F1B, 0xFC8E, 0x9F1C, 0xFC8F, 0x9F1D, 0xFC90, 0x9F1E, 0xFC91, 0x9F1F, 0xFC92, 0x9F20, 0xCAF3, 0x9F21, 0xFC93, 0x9F22, 0xF7F7, + 0x9F23, 0xFC94, 0x9F24, 0xFC95, 0x9F25, 0xFC96, 0x9F26, 0xFC97, 0x9F27, 0xFC98, 0x9F28, 0xFC99, 0x9F29, 0xFC9A, 0x9F2A, 0xFC9B, + 0x9F2B, 0xFC9C, 0x9F2C, 0xF7F8, 0x9F2D, 0xFC9D, 0x9F2E, 0xFC9E, 0x9F2F, 0xF7F9, 0x9F30, 0xFC9F, 0x9F31, 0xFCA0, 0x9F32, 0xFD40, + 0x9F33, 0xFD41, 0x9F34, 0xFD42, 0x9F35, 0xFD43, 0x9F36, 0xFD44, 0x9F37, 0xF7FB, 0x9F38, 0xFD45, 0x9F39, 0xF7FA, 0x9F3A, 0xFD46, + 0x9F3B, 0xB1C7, 0x9F3C, 0xFD47, 0x9F3D, 0xF7FC, 0x9F3E, 0xF7FD, 0x9F3F, 0xFD48, 0x9F40, 0xFD49, 0x9F41, 0xFD4A, 0x9F42, 0xFD4B, + 0x9F43, 0xFD4C, 0x9F44, 0xF7FE, 0x9F45, 0xFD4D, 0x9F46, 0xFD4E, 0x9F47, 0xFD4F, 0x9F48, 0xFD50, 0x9F49, 0xFD51, 0x9F4A, 0xFD52, + 0x9F4B, 0xFD53, 0x9F4C, 0xFD54, 0x9F4D, 0xFD55, 0x9F4E, 0xFD56, 0x9F4F, 0xFD57, 0x9F50, 0xC6EB, 0x9F51, 0xECB4, 0x9F52, 0xFD58, + 0x9F53, 0xFD59, 0x9F54, 0xFD5A, 0x9F55, 0xFD5B, 0x9F56, 0xFD5C, 0x9F57, 0xFD5D, 0x9F58, 0xFD5E, 0x9F59, 0xFD5F, 0x9F5A, 0xFD60, + 0x9F5B, 0xFD61, 0x9F5C, 0xFD62, 0x9F5D, 0xFD63, 0x9F5E, 0xFD64, 0x9F5F, 0xFD65, 0x9F60, 0xFD66, 0x9F61, 0xFD67, 0x9F62, 0xFD68, + 0x9F63, 0xFD69, 0x9F64, 0xFD6A, 0x9F65, 0xFD6B, 0x9F66, 0xFD6C, 0x9F67, 0xFD6D, 0x9F68, 0xFD6E, 0x9F69, 0xFD6F, 0x9F6A, 0xFD70, + 0x9F6B, 0xFD71, 0x9F6C, 0xFD72, 0x9F6D, 0xFD73, 0x9F6E, 0xFD74, 0x9F6F, 0xFD75, 0x9F70, 0xFD76, 0x9F71, 0xFD77, 0x9F72, 0xFD78, + 0x9F73, 0xFD79, 0x9F74, 0xFD7A, 0x9F75, 0xFD7B, 0x9F76, 0xFD7C, 0x9F77, 0xFD7D, 0x9F78, 0xFD7E, 0x9F79, 0xFD80, 0x9F7A, 0xFD81, + 0x9F7B, 0xFD82, 0x9F7C, 0xFD83, 0x9F7D, 0xFD84, 0x9F7E, 0xFD85, 0x9F7F, 0xB3DD, 0x9F80, 0xF6B3, 0x9F81, 0xFD86, 0x9F82, 0xFD87, + 0x9F83, 0xF6B4, 0x9F84, 0xC1E4, 0x9F85, 0xF6B5, 0x9F86, 0xF6B6, 0x9F87, 0xF6B7, 0x9F88, 0xF6B8, 0x9F89, 0xF6B9, 0x9F8A, 0xF6BA, + 0x9F8B, 0xC8A3, 0x9F8C, 0xF6BB, 0x9F8D, 0xFD88, 0x9F8E, 0xFD89, 0x9F8F, 0xFD8A, 0x9F90, 0xFD8B, 0x9F91, 0xFD8C, 0x9F92, 0xFD8D, + 0x9F93, 0xFD8E, 0x9F94, 0xFD8F, 0x9F95, 0xFD90, 0x9F96, 0xFD91, 0x9F97, 0xFD92, 0x9F98, 0xFD93, 0x9F99, 0xC1FA, 0x9F9A, 0xB9A8, + 0x9F9B, 0xEDE8, 0x9F9C, 0xFD94, 0x9F9D, 0xFD95, 0x9F9E, 0xFD96, 0x9F9F, 0xB9EA, 0x9FA0, 0xD9DF, 0x9FA1, 0xFD97, 0x9FA2, 0xFD98, + 0x9FA3, 0xFD99, 0x9FA4, 0xFD9A, 0x9FA5, 0xFD9B, 0xF92C, 0xFD9C, 0xF979, 0xFD9D, 0xF995, 0xFD9E, 0xF9E7, 0xFD9F, 0xF9F1, 0xFDA0, + 0xFA0C, 0xFE40, 0xFA0D, 0xFE41, 0xFA0E, 0xFE42, 0xFA0F, 0xFE43, 0xFA11, 0xFE44, 0xFA13, 0xFE45, 0xFA14, 0xFE46, 0xFA18, 0xFE47, + 0xFA1F, 0xFE48, 0xFA20, 0xFE49, 0xFA21, 0xFE4A, 0xFA23, 0xFE4B, 0xFA24, 0xFE4C, 0xFA27, 0xFE4D, 0xFA28, 0xFE4E, 0xFA29, 0xFE4F, + 0xFE30, 0xA955, 0xFE31, 0xA6F2, 0xFE33, 0xA6F4, 0xFE34, 0xA6F5, 0xFE35, 0xA6E0, 0xFE36, 0xA6E1, 0xFE37, 0xA6F0, 0xFE38, 0xA6F1, + 0xFE39, 0xA6E2, 0xFE3A, 0xA6E3, 0xFE3B, 0xA6EE, 0xFE3C, 0xA6EF, 0xFE3D, 0xA6E6, 0xFE3E, 0xA6E7, 0xFE3F, 0xA6E4, 0xFE40, 0xA6E5, + 0xFE41, 0xA6E8, 0xFE42, 0xA6E9, 0xFE43, 0xA6EA, 0xFE44, 0xA6EB, 0xFE49, 0xA968, 0xFE4A, 0xA969, 0xFE4B, 0xA96A, 0xFE4C, 0xA96B, + 0xFE4D, 0xA96C, 0xFE4E, 0xA96D, 0xFE4F, 0xA96E, 0xFE50, 0xA96F, 0xFE51, 0xA970, 0xFE52, 0xA971, 0xFE54, 0xA972, 0xFE55, 0xA973, + 0xFE56, 0xA974, 0xFE57, 0xA975, 0xFE59, 0xA976, 0xFE5A, 0xA977, 0xFE5B, 0xA978, 0xFE5C, 0xA979, 0xFE5D, 0xA97A, 0xFE5E, 0xA97B, + 0xFE5F, 0xA97C, 0xFE60, 0xA97D, 0xFE61, 0xA97E, 0xFE62, 0xA980, 0xFE63, 0xA981, 0xFE64, 0xA982, 0xFE65, 0xA983, 0xFE66, 0xA984, + 0xFE68, 0xA985, 0xFE69, 0xA986, 0xFE6A, 0xA987, 0xFE6B, 0xA988, 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA1E7, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA3DC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA1AB, 0xFFE0, 0xA1E9, 0xFFE1, 0xA1EA, 0xFFE2, 0xA956, 0xFFE3, 0xA3FE, 0xFFE4, 0xA957, 0xFFE5, 0xA3A4, + 0, 0 +}; + +static const WCHAR oem2uni936[] = { /* GBK --> Unicode pairs */ + 0x0080, 0x20AC, 0x8140, 0x4E02, 0x8141, 0x4E04, 0x8142, 0x4E05, 0x8143, 0x4E06, 0x8144, 0x4E0F, 0x8145, 0x4E12, 0x8146, 0x4E17, + 0x8147, 0x4E1F, 0x8148, 0x4E20, 0x8149, 0x4E21, 0x814A, 0x4E23, 0x814B, 0x4E26, 0x814C, 0x4E29, 0x814D, 0x4E2E, 0x814E, 0x4E2F, + 0x814F, 0x4E31, 0x8150, 0x4E33, 0x8151, 0x4E35, 0x8152, 0x4E37, 0x8153, 0x4E3C, 0x8154, 0x4E40, 0x8155, 0x4E41, 0x8156, 0x4E42, + 0x8157, 0x4E44, 0x8158, 0x4E46, 0x8159, 0x4E4A, 0x815A, 0x4E51, 0x815B, 0x4E55, 0x815C, 0x4E57, 0x815D, 0x4E5A, 0x815E, 0x4E5B, + 0x815F, 0x4E62, 0x8160, 0x4E63, 0x8161, 0x4E64, 0x8162, 0x4E65, 0x8163, 0x4E67, 0x8164, 0x4E68, 0x8165, 0x4E6A, 0x8166, 0x4E6B, + 0x8167, 0x4E6C, 0x8168, 0x4E6D, 0x8169, 0x4E6E, 0x816A, 0x4E6F, 0x816B, 0x4E72, 0x816C, 0x4E74, 0x816D, 0x4E75, 0x816E, 0x4E76, + 0x816F, 0x4E77, 0x8170, 0x4E78, 0x8171, 0x4E79, 0x8172, 0x4E7A, 0x8173, 0x4E7B, 0x8174, 0x4E7C, 0x8175, 0x4E7D, 0x8176, 0x4E7F, + 0x8177, 0x4E80, 0x8178, 0x4E81, 0x8179, 0x4E82, 0x817A, 0x4E83, 0x817B, 0x4E84, 0x817C, 0x4E85, 0x817D, 0x4E87, 0x817E, 0x4E8A, + 0x8180, 0x4E90, 0x8181, 0x4E96, 0x8182, 0x4E97, 0x8183, 0x4E99, 0x8184, 0x4E9C, 0x8185, 0x4E9D, 0x8186, 0x4E9E, 0x8187, 0x4EA3, + 0x8188, 0x4EAA, 0x8189, 0x4EAF, 0x818A, 0x4EB0, 0x818B, 0x4EB1, 0x818C, 0x4EB4, 0x818D, 0x4EB6, 0x818E, 0x4EB7, 0x818F, 0x4EB8, + 0x8190, 0x4EB9, 0x8191, 0x4EBC, 0x8192, 0x4EBD, 0x8193, 0x4EBE, 0x8194, 0x4EC8, 0x8195, 0x4ECC, 0x8196, 0x4ECF, 0x8197, 0x4ED0, + 0x8198, 0x4ED2, 0x8199, 0x4EDA, 0x819A, 0x4EDB, 0x819B, 0x4EDC, 0x819C, 0x4EE0, 0x819D, 0x4EE2, 0x819E, 0x4EE6, 0x819F, 0x4EE7, + 0x81A0, 0x4EE9, 0x81A1, 0x4EED, 0x81A2, 0x4EEE, 0x81A3, 0x4EEF, 0x81A4, 0x4EF1, 0x81A5, 0x4EF4, 0x81A6, 0x4EF8, 0x81A7, 0x4EF9, + 0x81A8, 0x4EFA, 0x81A9, 0x4EFC, 0x81AA, 0x4EFE, 0x81AB, 0x4F00, 0x81AC, 0x4F02, 0x81AD, 0x4F03, 0x81AE, 0x4F04, 0x81AF, 0x4F05, + 0x81B0, 0x4F06, 0x81B1, 0x4F07, 0x81B2, 0x4F08, 0x81B3, 0x4F0B, 0x81B4, 0x4F0C, 0x81B5, 0x4F12, 0x81B6, 0x4F13, 0x81B7, 0x4F14, + 0x81B8, 0x4F15, 0x81B9, 0x4F16, 0x81BA, 0x4F1C, 0x81BB, 0x4F1D, 0x81BC, 0x4F21, 0x81BD, 0x4F23, 0x81BE, 0x4F28, 0x81BF, 0x4F29, + 0x81C0, 0x4F2C, 0x81C1, 0x4F2D, 0x81C2, 0x4F2E, 0x81C3, 0x4F31, 0x81C4, 0x4F33, 0x81C5, 0x4F35, 0x81C6, 0x4F37, 0x81C7, 0x4F39, + 0x81C8, 0x4F3B, 0x81C9, 0x4F3E, 0x81CA, 0x4F3F, 0x81CB, 0x4F40, 0x81CC, 0x4F41, 0x81CD, 0x4F42, 0x81CE, 0x4F44, 0x81CF, 0x4F45, + 0x81D0, 0x4F47, 0x81D1, 0x4F48, 0x81D2, 0x4F49, 0x81D3, 0x4F4A, 0x81D4, 0x4F4B, 0x81D5, 0x4F4C, 0x81D6, 0x4F52, 0x81D7, 0x4F54, + 0x81D8, 0x4F56, 0x81D9, 0x4F61, 0x81DA, 0x4F62, 0x81DB, 0x4F66, 0x81DC, 0x4F68, 0x81DD, 0x4F6A, 0x81DE, 0x4F6B, 0x81DF, 0x4F6D, + 0x81E0, 0x4F6E, 0x81E1, 0x4F71, 0x81E2, 0x4F72, 0x81E3, 0x4F75, 0x81E4, 0x4F77, 0x81E5, 0x4F78, 0x81E6, 0x4F79, 0x81E7, 0x4F7A, + 0x81E8, 0x4F7D, 0x81E9, 0x4F80, 0x81EA, 0x4F81, 0x81EB, 0x4F82, 0x81EC, 0x4F85, 0x81ED, 0x4F86, 0x81EE, 0x4F87, 0x81EF, 0x4F8A, + 0x81F0, 0x4F8C, 0x81F1, 0x4F8E, 0x81F2, 0x4F90, 0x81F3, 0x4F92, 0x81F4, 0x4F93, 0x81F5, 0x4F95, 0x81F6, 0x4F96, 0x81F7, 0x4F98, + 0x81F8, 0x4F99, 0x81F9, 0x4F9A, 0x81FA, 0x4F9C, 0x81FB, 0x4F9E, 0x81FC, 0x4F9F, 0x81FD, 0x4FA1, 0x81FE, 0x4FA2, 0x8240, 0x4FA4, + 0x8241, 0x4FAB, 0x8242, 0x4FAD, 0x8243, 0x4FB0, 0x8244, 0x4FB1, 0x8245, 0x4FB2, 0x8246, 0x4FB3, 0x8247, 0x4FB4, 0x8248, 0x4FB6, + 0x8249, 0x4FB7, 0x824A, 0x4FB8, 0x824B, 0x4FB9, 0x824C, 0x4FBA, 0x824D, 0x4FBB, 0x824E, 0x4FBC, 0x824F, 0x4FBD, 0x8250, 0x4FBE, + 0x8251, 0x4FC0, 0x8252, 0x4FC1, 0x8253, 0x4FC2, 0x8254, 0x4FC6, 0x8255, 0x4FC7, 0x8256, 0x4FC8, 0x8257, 0x4FC9, 0x8258, 0x4FCB, + 0x8259, 0x4FCC, 0x825A, 0x4FCD, 0x825B, 0x4FD2, 0x825C, 0x4FD3, 0x825D, 0x4FD4, 0x825E, 0x4FD5, 0x825F, 0x4FD6, 0x8260, 0x4FD9, + 0x8261, 0x4FDB, 0x8262, 0x4FE0, 0x8263, 0x4FE2, 0x8264, 0x4FE4, 0x8265, 0x4FE5, 0x8266, 0x4FE7, 0x8267, 0x4FEB, 0x8268, 0x4FEC, + 0x8269, 0x4FF0, 0x826A, 0x4FF2, 0x826B, 0x4FF4, 0x826C, 0x4FF5, 0x826D, 0x4FF6, 0x826E, 0x4FF7, 0x826F, 0x4FF9, 0x8270, 0x4FFB, + 0x8271, 0x4FFC, 0x8272, 0x4FFD, 0x8273, 0x4FFF, 0x8274, 0x5000, 0x8275, 0x5001, 0x8276, 0x5002, 0x8277, 0x5003, 0x8278, 0x5004, + 0x8279, 0x5005, 0x827A, 0x5006, 0x827B, 0x5007, 0x827C, 0x5008, 0x827D, 0x5009, 0x827E, 0x500A, 0x8280, 0x500B, 0x8281, 0x500E, + 0x8282, 0x5010, 0x8283, 0x5011, 0x8284, 0x5013, 0x8285, 0x5015, 0x8286, 0x5016, 0x8287, 0x5017, 0x8288, 0x501B, 0x8289, 0x501D, + 0x828A, 0x501E, 0x828B, 0x5020, 0x828C, 0x5022, 0x828D, 0x5023, 0x828E, 0x5024, 0x828F, 0x5027, 0x8290, 0x502B, 0x8291, 0x502F, + 0x8292, 0x5030, 0x8293, 0x5031, 0x8294, 0x5032, 0x8295, 0x5033, 0x8296, 0x5034, 0x8297, 0x5035, 0x8298, 0x5036, 0x8299, 0x5037, + 0x829A, 0x5038, 0x829B, 0x5039, 0x829C, 0x503B, 0x829D, 0x503D, 0x829E, 0x503F, 0x829F, 0x5040, 0x82A0, 0x5041, 0x82A1, 0x5042, + 0x82A2, 0x5044, 0x82A3, 0x5045, 0x82A4, 0x5046, 0x82A5, 0x5049, 0x82A6, 0x504A, 0x82A7, 0x504B, 0x82A8, 0x504D, 0x82A9, 0x5050, + 0x82AA, 0x5051, 0x82AB, 0x5052, 0x82AC, 0x5053, 0x82AD, 0x5054, 0x82AE, 0x5056, 0x82AF, 0x5057, 0x82B0, 0x5058, 0x82B1, 0x5059, + 0x82B2, 0x505B, 0x82B3, 0x505D, 0x82B4, 0x505E, 0x82B5, 0x505F, 0x82B6, 0x5060, 0x82B7, 0x5061, 0x82B8, 0x5062, 0x82B9, 0x5063, + 0x82BA, 0x5064, 0x82BB, 0x5066, 0x82BC, 0x5067, 0x82BD, 0x5068, 0x82BE, 0x5069, 0x82BF, 0x506A, 0x82C0, 0x506B, 0x82C1, 0x506D, + 0x82C2, 0x506E, 0x82C3, 0x506F, 0x82C4, 0x5070, 0x82C5, 0x5071, 0x82C6, 0x5072, 0x82C7, 0x5073, 0x82C8, 0x5074, 0x82C9, 0x5075, + 0x82CA, 0x5078, 0x82CB, 0x5079, 0x82CC, 0x507A, 0x82CD, 0x507C, 0x82CE, 0x507D, 0x82CF, 0x5081, 0x82D0, 0x5082, 0x82D1, 0x5083, + 0x82D2, 0x5084, 0x82D3, 0x5086, 0x82D4, 0x5087, 0x82D5, 0x5089, 0x82D6, 0x508A, 0x82D7, 0x508B, 0x82D8, 0x508C, 0x82D9, 0x508E, + 0x82DA, 0x508F, 0x82DB, 0x5090, 0x82DC, 0x5091, 0x82DD, 0x5092, 0x82DE, 0x5093, 0x82DF, 0x5094, 0x82E0, 0x5095, 0x82E1, 0x5096, + 0x82E2, 0x5097, 0x82E3, 0x5098, 0x82E4, 0x5099, 0x82E5, 0x509A, 0x82E6, 0x509B, 0x82E7, 0x509C, 0x82E8, 0x509D, 0x82E9, 0x509E, + 0x82EA, 0x509F, 0x82EB, 0x50A0, 0x82EC, 0x50A1, 0x82ED, 0x50A2, 0x82EE, 0x50A4, 0x82EF, 0x50A6, 0x82F0, 0x50AA, 0x82F1, 0x50AB, + 0x82F2, 0x50AD, 0x82F3, 0x50AE, 0x82F4, 0x50AF, 0x82F5, 0x50B0, 0x82F6, 0x50B1, 0x82F7, 0x50B3, 0x82F8, 0x50B4, 0x82F9, 0x50B5, + 0x82FA, 0x50B6, 0x82FB, 0x50B7, 0x82FC, 0x50B8, 0x82FD, 0x50B9, 0x82FE, 0x50BC, 0x8340, 0x50BD, 0x8341, 0x50BE, 0x8342, 0x50BF, + 0x8343, 0x50C0, 0x8344, 0x50C1, 0x8345, 0x50C2, 0x8346, 0x50C3, 0x8347, 0x50C4, 0x8348, 0x50C5, 0x8349, 0x50C6, 0x834A, 0x50C7, + 0x834B, 0x50C8, 0x834C, 0x50C9, 0x834D, 0x50CA, 0x834E, 0x50CB, 0x834F, 0x50CC, 0x8350, 0x50CD, 0x8351, 0x50CE, 0x8352, 0x50D0, + 0x8353, 0x50D1, 0x8354, 0x50D2, 0x8355, 0x50D3, 0x8356, 0x50D4, 0x8357, 0x50D5, 0x8358, 0x50D7, 0x8359, 0x50D8, 0x835A, 0x50D9, + 0x835B, 0x50DB, 0x835C, 0x50DC, 0x835D, 0x50DD, 0x835E, 0x50DE, 0x835F, 0x50DF, 0x8360, 0x50E0, 0x8361, 0x50E1, 0x8362, 0x50E2, + 0x8363, 0x50E3, 0x8364, 0x50E4, 0x8365, 0x50E5, 0x8366, 0x50E8, 0x8367, 0x50E9, 0x8368, 0x50EA, 0x8369, 0x50EB, 0x836A, 0x50EF, + 0x836B, 0x50F0, 0x836C, 0x50F1, 0x836D, 0x50F2, 0x836E, 0x50F4, 0x836F, 0x50F6, 0x8370, 0x50F7, 0x8371, 0x50F8, 0x8372, 0x50F9, + 0x8373, 0x50FA, 0x8374, 0x50FC, 0x8375, 0x50FD, 0x8376, 0x50FE, 0x8377, 0x50FF, 0x8378, 0x5100, 0x8379, 0x5101, 0x837A, 0x5102, + 0x837B, 0x5103, 0x837C, 0x5104, 0x837D, 0x5105, 0x837E, 0x5108, 0x8380, 0x5109, 0x8381, 0x510A, 0x8382, 0x510C, 0x8383, 0x510D, + 0x8384, 0x510E, 0x8385, 0x510F, 0x8386, 0x5110, 0x8387, 0x5111, 0x8388, 0x5113, 0x8389, 0x5114, 0x838A, 0x5115, 0x838B, 0x5116, + 0x838C, 0x5117, 0x838D, 0x5118, 0x838E, 0x5119, 0x838F, 0x511A, 0x8390, 0x511B, 0x8391, 0x511C, 0x8392, 0x511D, 0x8393, 0x511E, + 0x8394, 0x511F, 0x8395, 0x5120, 0x8396, 0x5122, 0x8397, 0x5123, 0x8398, 0x5124, 0x8399, 0x5125, 0x839A, 0x5126, 0x839B, 0x5127, + 0x839C, 0x5128, 0x839D, 0x5129, 0x839E, 0x512A, 0x839F, 0x512B, 0x83A0, 0x512C, 0x83A1, 0x512D, 0x83A2, 0x512E, 0x83A3, 0x512F, + 0x83A4, 0x5130, 0x83A5, 0x5131, 0x83A6, 0x5132, 0x83A7, 0x5133, 0x83A8, 0x5134, 0x83A9, 0x5135, 0x83AA, 0x5136, 0x83AB, 0x5137, + 0x83AC, 0x5138, 0x83AD, 0x5139, 0x83AE, 0x513A, 0x83AF, 0x513B, 0x83B0, 0x513C, 0x83B1, 0x513D, 0x83B2, 0x513E, 0x83B3, 0x5142, + 0x83B4, 0x5147, 0x83B5, 0x514A, 0x83B6, 0x514C, 0x83B7, 0x514E, 0x83B8, 0x514F, 0x83B9, 0x5150, 0x83BA, 0x5152, 0x83BB, 0x5153, + 0x83BC, 0x5157, 0x83BD, 0x5158, 0x83BE, 0x5159, 0x83BF, 0x515B, 0x83C0, 0x515D, 0x83C1, 0x515E, 0x83C2, 0x515F, 0x83C3, 0x5160, + 0x83C4, 0x5161, 0x83C5, 0x5163, 0x83C6, 0x5164, 0x83C7, 0x5166, 0x83C8, 0x5167, 0x83C9, 0x5169, 0x83CA, 0x516A, 0x83CB, 0x516F, + 0x83CC, 0x5172, 0x83CD, 0x517A, 0x83CE, 0x517E, 0x83CF, 0x517F, 0x83D0, 0x5183, 0x83D1, 0x5184, 0x83D2, 0x5186, 0x83D3, 0x5187, + 0x83D4, 0x518A, 0x83D5, 0x518B, 0x83D6, 0x518E, 0x83D7, 0x518F, 0x83D8, 0x5190, 0x83D9, 0x5191, 0x83DA, 0x5193, 0x83DB, 0x5194, + 0x83DC, 0x5198, 0x83DD, 0x519A, 0x83DE, 0x519D, 0x83DF, 0x519E, 0x83E0, 0x519F, 0x83E1, 0x51A1, 0x83E2, 0x51A3, 0x83E3, 0x51A6, + 0x83E4, 0x51A7, 0x83E5, 0x51A8, 0x83E6, 0x51A9, 0x83E7, 0x51AA, 0x83E8, 0x51AD, 0x83E9, 0x51AE, 0x83EA, 0x51B4, 0x83EB, 0x51B8, + 0x83EC, 0x51B9, 0x83ED, 0x51BA, 0x83EE, 0x51BE, 0x83EF, 0x51BF, 0x83F0, 0x51C1, 0x83F1, 0x51C2, 0x83F2, 0x51C3, 0x83F3, 0x51C5, + 0x83F4, 0x51C8, 0x83F5, 0x51CA, 0x83F6, 0x51CD, 0x83F7, 0x51CE, 0x83F8, 0x51D0, 0x83F9, 0x51D2, 0x83FA, 0x51D3, 0x83FB, 0x51D4, + 0x83FC, 0x51D5, 0x83FD, 0x51D6, 0x83FE, 0x51D7, 0x8440, 0x51D8, 0x8441, 0x51D9, 0x8442, 0x51DA, 0x8443, 0x51DC, 0x8444, 0x51DE, + 0x8445, 0x51DF, 0x8446, 0x51E2, 0x8447, 0x51E3, 0x8448, 0x51E5, 0x8449, 0x51E6, 0x844A, 0x51E7, 0x844B, 0x51E8, 0x844C, 0x51E9, + 0x844D, 0x51EA, 0x844E, 0x51EC, 0x844F, 0x51EE, 0x8450, 0x51F1, 0x8451, 0x51F2, 0x8452, 0x51F4, 0x8453, 0x51F7, 0x8454, 0x51FE, + 0x8455, 0x5204, 0x8456, 0x5205, 0x8457, 0x5209, 0x8458, 0x520B, 0x8459, 0x520C, 0x845A, 0x520F, 0x845B, 0x5210, 0x845C, 0x5213, + 0x845D, 0x5214, 0x845E, 0x5215, 0x845F, 0x521C, 0x8460, 0x521E, 0x8461, 0x521F, 0x8462, 0x5221, 0x8463, 0x5222, 0x8464, 0x5223, + 0x8465, 0x5225, 0x8466, 0x5226, 0x8467, 0x5227, 0x8468, 0x522A, 0x8469, 0x522C, 0x846A, 0x522F, 0x846B, 0x5231, 0x846C, 0x5232, + 0x846D, 0x5234, 0x846E, 0x5235, 0x846F, 0x523C, 0x8470, 0x523E, 0x8471, 0x5244, 0x8472, 0x5245, 0x8473, 0x5246, 0x8474, 0x5247, + 0x8475, 0x5248, 0x8476, 0x5249, 0x8477, 0x524B, 0x8478, 0x524E, 0x8479, 0x524F, 0x847A, 0x5252, 0x847B, 0x5253, 0x847C, 0x5255, + 0x847D, 0x5257, 0x847E, 0x5258, 0x8480, 0x5259, 0x8481, 0x525A, 0x8482, 0x525B, 0x8483, 0x525D, 0x8484, 0x525F, 0x8485, 0x5260, + 0x8486, 0x5262, 0x8487, 0x5263, 0x8488, 0x5264, 0x8489, 0x5266, 0x848A, 0x5268, 0x848B, 0x526B, 0x848C, 0x526C, 0x848D, 0x526D, + 0x848E, 0x526E, 0x848F, 0x5270, 0x8490, 0x5271, 0x8491, 0x5273, 0x8492, 0x5274, 0x8493, 0x5275, 0x8494, 0x5276, 0x8495, 0x5277, + 0x8496, 0x5278, 0x8497, 0x5279, 0x8498, 0x527A, 0x8499, 0x527B, 0x849A, 0x527C, 0x849B, 0x527E, 0x849C, 0x5280, 0x849D, 0x5283, + 0x849E, 0x5284, 0x849F, 0x5285, 0x84A0, 0x5286, 0x84A1, 0x5287, 0x84A2, 0x5289, 0x84A3, 0x528A, 0x84A4, 0x528B, 0x84A5, 0x528C, + 0x84A6, 0x528D, 0x84A7, 0x528E, 0x84A8, 0x528F, 0x84A9, 0x5291, 0x84AA, 0x5292, 0x84AB, 0x5294, 0x84AC, 0x5295, 0x84AD, 0x5296, + 0x84AE, 0x5297, 0x84AF, 0x5298, 0x84B0, 0x5299, 0x84B1, 0x529A, 0x84B2, 0x529C, 0x84B3, 0x52A4, 0x84B4, 0x52A5, 0x84B5, 0x52A6, + 0x84B6, 0x52A7, 0x84B7, 0x52AE, 0x84B8, 0x52AF, 0x84B9, 0x52B0, 0x84BA, 0x52B4, 0x84BB, 0x52B5, 0x84BC, 0x52B6, 0x84BD, 0x52B7, + 0x84BE, 0x52B8, 0x84BF, 0x52B9, 0x84C0, 0x52BA, 0x84C1, 0x52BB, 0x84C2, 0x52BC, 0x84C3, 0x52BD, 0x84C4, 0x52C0, 0x84C5, 0x52C1, + 0x84C6, 0x52C2, 0x84C7, 0x52C4, 0x84C8, 0x52C5, 0x84C9, 0x52C6, 0x84CA, 0x52C8, 0x84CB, 0x52CA, 0x84CC, 0x52CC, 0x84CD, 0x52CD, + 0x84CE, 0x52CE, 0x84CF, 0x52CF, 0x84D0, 0x52D1, 0x84D1, 0x52D3, 0x84D2, 0x52D4, 0x84D3, 0x52D5, 0x84D4, 0x52D7, 0x84D5, 0x52D9, + 0x84D6, 0x52DA, 0x84D7, 0x52DB, 0x84D8, 0x52DC, 0x84D9, 0x52DD, 0x84DA, 0x52DE, 0x84DB, 0x52E0, 0x84DC, 0x52E1, 0x84DD, 0x52E2, + 0x84DE, 0x52E3, 0x84DF, 0x52E5, 0x84E0, 0x52E6, 0x84E1, 0x52E7, 0x84E2, 0x52E8, 0x84E3, 0x52E9, 0x84E4, 0x52EA, 0x84E5, 0x52EB, + 0x84E6, 0x52EC, 0x84E7, 0x52ED, 0x84E8, 0x52EE, 0x84E9, 0x52EF, 0x84EA, 0x52F1, 0x84EB, 0x52F2, 0x84EC, 0x52F3, 0x84ED, 0x52F4, + 0x84EE, 0x52F5, 0x84EF, 0x52F6, 0x84F0, 0x52F7, 0x84F1, 0x52F8, 0x84F2, 0x52FB, 0x84F3, 0x52FC, 0x84F4, 0x52FD, 0x84F5, 0x5301, + 0x84F6, 0x5302, 0x84F7, 0x5303, 0x84F8, 0x5304, 0x84F9, 0x5307, 0x84FA, 0x5309, 0x84FB, 0x530A, 0x84FC, 0x530B, 0x84FD, 0x530C, + 0x84FE, 0x530E, 0x8540, 0x5311, 0x8541, 0x5312, 0x8542, 0x5313, 0x8543, 0x5314, 0x8544, 0x5318, 0x8545, 0x531B, 0x8546, 0x531C, + 0x8547, 0x531E, 0x8548, 0x531F, 0x8549, 0x5322, 0x854A, 0x5324, 0x854B, 0x5325, 0x854C, 0x5327, 0x854D, 0x5328, 0x854E, 0x5329, + 0x854F, 0x532B, 0x8550, 0x532C, 0x8551, 0x532D, 0x8552, 0x532F, 0x8553, 0x5330, 0x8554, 0x5331, 0x8555, 0x5332, 0x8556, 0x5333, + 0x8557, 0x5334, 0x8558, 0x5335, 0x8559, 0x5336, 0x855A, 0x5337, 0x855B, 0x5338, 0x855C, 0x533C, 0x855D, 0x533D, 0x855E, 0x5340, + 0x855F, 0x5342, 0x8560, 0x5344, 0x8561, 0x5346, 0x8562, 0x534B, 0x8563, 0x534C, 0x8564, 0x534D, 0x8565, 0x5350, 0x8566, 0x5354, + 0x8567, 0x5358, 0x8568, 0x5359, 0x8569, 0x535B, 0x856A, 0x535D, 0x856B, 0x5365, 0x856C, 0x5368, 0x856D, 0x536A, 0x856E, 0x536C, + 0x856F, 0x536D, 0x8570, 0x5372, 0x8571, 0x5376, 0x8572, 0x5379, 0x8573, 0x537B, 0x8574, 0x537C, 0x8575, 0x537D, 0x8576, 0x537E, + 0x8577, 0x5380, 0x8578, 0x5381, 0x8579, 0x5383, 0x857A, 0x5387, 0x857B, 0x5388, 0x857C, 0x538A, 0x857D, 0x538E, 0x857E, 0x538F, + 0x8580, 0x5390, 0x8581, 0x5391, 0x8582, 0x5392, 0x8583, 0x5393, 0x8584, 0x5394, 0x8585, 0x5396, 0x8586, 0x5397, 0x8587, 0x5399, + 0x8588, 0x539B, 0x8589, 0x539C, 0x858A, 0x539E, 0x858B, 0x53A0, 0x858C, 0x53A1, 0x858D, 0x53A4, 0x858E, 0x53A7, 0x858F, 0x53AA, + 0x8590, 0x53AB, 0x8591, 0x53AC, 0x8592, 0x53AD, 0x8593, 0x53AF, 0x8594, 0x53B0, 0x8595, 0x53B1, 0x8596, 0x53B2, 0x8597, 0x53B3, + 0x8598, 0x53B4, 0x8599, 0x53B5, 0x859A, 0x53B7, 0x859B, 0x53B8, 0x859C, 0x53B9, 0x859D, 0x53BA, 0x859E, 0x53BC, 0x859F, 0x53BD, + 0x85A0, 0x53BE, 0x85A1, 0x53C0, 0x85A2, 0x53C3, 0x85A3, 0x53C4, 0x85A4, 0x53C5, 0x85A5, 0x53C6, 0x85A6, 0x53C7, 0x85A7, 0x53CE, + 0x85A8, 0x53CF, 0x85A9, 0x53D0, 0x85AA, 0x53D2, 0x85AB, 0x53D3, 0x85AC, 0x53D5, 0x85AD, 0x53DA, 0x85AE, 0x53DC, 0x85AF, 0x53DD, + 0x85B0, 0x53DE, 0x85B1, 0x53E1, 0x85B2, 0x53E2, 0x85B3, 0x53E7, 0x85B4, 0x53F4, 0x85B5, 0x53FA, 0x85B6, 0x53FE, 0x85B7, 0x53FF, + 0x85B8, 0x5400, 0x85B9, 0x5402, 0x85BA, 0x5405, 0x85BB, 0x5407, 0x85BC, 0x540B, 0x85BD, 0x5414, 0x85BE, 0x5418, 0x85BF, 0x5419, + 0x85C0, 0x541A, 0x85C1, 0x541C, 0x85C2, 0x5422, 0x85C3, 0x5424, 0x85C4, 0x5425, 0x85C5, 0x542A, 0x85C6, 0x5430, 0x85C7, 0x5433, + 0x85C8, 0x5436, 0x85C9, 0x5437, 0x85CA, 0x543A, 0x85CB, 0x543D, 0x85CC, 0x543F, 0x85CD, 0x5441, 0x85CE, 0x5442, 0x85CF, 0x5444, + 0x85D0, 0x5445, 0x85D1, 0x5447, 0x85D2, 0x5449, 0x85D3, 0x544C, 0x85D4, 0x544D, 0x85D5, 0x544E, 0x85D6, 0x544F, 0x85D7, 0x5451, + 0x85D8, 0x545A, 0x85D9, 0x545D, 0x85DA, 0x545E, 0x85DB, 0x545F, 0x85DC, 0x5460, 0x85DD, 0x5461, 0x85DE, 0x5463, 0x85DF, 0x5465, + 0x85E0, 0x5467, 0x85E1, 0x5469, 0x85E2, 0x546A, 0x85E3, 0x546B, 0x85E4, 0x546C, 0x85E5, 0x546D, 0x85E6, 0x546E, 0x85E7, 0x546F, + 0x85E8, 0x5470, 0x85E9, 0x5474, 0x85EA, 0x5479, 0x85EB, 0x547A, 0x85EC, 0x547E, 0x85ED, 0x547F, 0x85EE, 0x5481, 0x85EF, 0x5483, + 0x85F0, 0x5485, 0x85F1, 0x5487, 0x85F2, 0x5488, 0x85F3, 0x5489, 0x85F4, 0x548A, 0x85F5, 0x548D, 0x85F6, 0x5491, 0x85F7, 0x5493, + 0x85F8, 0x5497, 0x85F9, 0x5498, 0x85FA, 0x549C, 0x85FB, 0x549E, 0x85FC, 0x549F, 0x85FD, 0x54A0, 0x85FE, 0x54A1, 0x8640, 0x54A2, + 0x8641, 0x54A5, 0x8642, 0x54AE, 0x8643, 0x54B0, 0x8644, 0x54B2, 0x8645, 0x54B5, 0x8646, 0x54B6, 0x8647, 0x54B7, 0x8648, 0x54B9, + 0x8649, 0x54BA, 0x864A, 0x54BC, 0x864B, 0x54BE, 0x864C, 0x54C3, 0x864D, 0x54C5, 0x864E, 0x54CA, 0x864F, 0x54CB, 0x8650, 0x54D6, + 0x8651, 0x54D8, 0x8652, 0x54DB, 0x8653, 0x54E0, 0x8654, 0x54E1, 0x8655, 0x54E2, 0x8656, 0x54E3, 0x8657, 0x54E4, 0x8658, 0x54EB, + 0x8659, 0x54EC, 0x865A, 0x54EF, 0x865B, 0x54F0, 0x865C, 0x54F1, 0x865D, 0x54F4, 0x865E, 0x54F5, 0x865F, 0x54F6, 0x8660, 0x54F7, + 0x8661, 0x54F8, 0x8662, 0x54F9, 0x8663, 0x54FB, 0x8664, 0x54FE, 0x8665, 0x5500, 0x8666, 0x5502, 0x8667, 0x5503, 0x8668, 0x5504, + 0x8669, 0x5505, 0x866A, 0x5508, 0x866B, 0x550A, 0x866C, 0x550B, 0x866D, 0x550C, 0x866E, 0x550D, 0x866F, 0x550E, 0x8670, 0x5512, + 0x8671, 0x5513, 0x8672, 0x5515, 0x8673, 0x5516, 0x8674, 0x5517, 0x8675, 0x5518, 0x8676, 0x5519, 0x8677, 0x551A, 0x8678, 0x551C, + 0x8679, 0x551D, 0x867A, 0x551E, 0x867B, 0x551F, 0x867C, 0x5521, 0x867D, 0x5525, 0x867E, 0x5526, 0x8680, 0x5528, 0x8681, 0x5529, + 0x8682, 0x552B, 0x8683, 0x552D, 0x8684, 0x5532, 0x8685, 0x5534, 0x8686, 0x5535, 0x8687, 0x5536, 0x8688, 0x5538, 0x8689, 0x5539, + 0x868A, 0x553A, 0x868B, 0x553B, 0x868C, 0x553D, 0x868D, 0x5540, 0x868E, 0x5542, 0x868F, 0x5545, 0x8690, 0x5547, 0x8691, 0x5548, + 0x8692, 0x554B, 0x8693, 0x554C, 0x8694, 0x554D, 0x8695, 0x554E, 0x8696, 0x554F, 0x8697, 0x5551, 0x8698, 0x5552, 0x8699, 0x5553, + 0x869A, 0x5554, 0x869B, 0x5557, 0x869C, 0x5558, 0x869D, 0x5559, 0x869E, 0x555A, 0x869F, 0x555B, 0x86A0, 0x555D, 0x86A1, 0x555E, + 0x86A2, 0x555F, 0x86A3, 0x5560, 0x86A4, 0x5562, 0x86A5, 0x5563, 0x86A6, 0x5568, 0x86A7, 0x5569, 0x86A8, 0x556B, 0x86A9, 0x556F, + 0x86AA, 0x5570, 0x86AB, 0x5571, 0x86AC, 0x5572, 0x86AD, 0x5573, 0x86AE, 0x5574, 0x86AF, 0x5579, 0x86B0, 0x557A, 0x86B1, 0x557D, + 0x86B2, 0x557F, 0x86B3, 0x5585, 0x86B4, 0x5586, 0x86B5, 0x558C, 0x86B6, 0x558D, 0x86B7, 0x558E, 0x86B8, 0x5590, 0x86B9, 0x5592, + 0x86BA, 0x5593, 0x86BB, 0x5595, 0x86BC, 0x5596, 0x86BD, 0x5597, 0x86BE, 0x559A, 0x86BF, 0x559B, 0x86C0, 0x559E, 0x86C1, 0x55A0, + 0x86C2, 0x55A1, 0x86C3, 0x55A2, 0x86C4, 0x55A3, 0x86C5, 0x55A4, 0x86C6, 0x55A5, 0x86C7, 0x55A6, 0x86C8, 0x55A8, 0x86C9, 0x55A9, + 0x86CA, 0x55AA, 0x86CB, 0x55AB, 0x86CC, 0x55AC, 0x86CD, 0x55AD, 0x86CE, 0x55AE, 0x86CF, 0x55AF, 0x86D0, 0x55B0, 0x86D1, 0x55B2, + 0x86D2, 0x55B4, 0x86D3, 0x55B6, 0x86D4, 0x55B8, 0x86D5, 0x55BA, 0x86D6, 0x55BC, 0x86D7, 0x55BF, 0x86D8, 0x55C0, 0x86D9, 0x55C1, + 0x86DA, 0x55C2, 0x86DB, 0x55C3, 0x86DC, 0x55C6, 0x86DD, 0x55C7, 0x86DE, 0x55C8, 0x86DF, 0x55CA, 0x86E0, 0x55CB, 0x86E1, 0x55CE, + 0x86E2, 0x55CF, 0x86E3, 0x55D0, 0x86E4, 0x55D5, 0x86E5, 0x55D7, 0x86E6, 0x55D8, 0x86E7, 0x55D9, 0x86E8, 0x55DA, 0x86E9, 0x55DB, + 0x86EA, 0x55DE, 0x86EB, 0x55E0, 0x86EC, 0x55E2, 0x86ED, 0x55E7, 0x86EE, 0x55E9, 0x86EF, 0x55ED, 0x86F0, 0x55EE, 0x86F1, 0x55F0, + 0x86F2, 0x55F1, 0x86F3, 0x55F4, 0x86F4, 0x55F6, 0x86F5, 0x55F8, 0x86F6, 0x55F9, 0x86F7, 0x55FA, 0x86F8, 0x55FB, 0x86F9, 0x55FC, + 0x86FA, 0x55FF, 0x86FB, 0x5602, 0x86FC, 0x5603, 0x86FD, 0x5604, 0x86FE, 0x5605, 0x8740, 0x5606, 0x8741, 0x5607, 0x8742, 0x560A, + 0x8743, 0x560B, 0x8744, 0x560D, 0x8745, 0x5610, 0x8746, 0x5611, 0x8747, 0x5612, 0x8748, 0x5613, 0x8749, 0x5614, 0x874A, 0x5615, + 0x874B, 0x5616, 0x874C, 0x5617, 0x874D, 0x5619, 0x874E, 0x561A, 0x874F, 0x561C, 0x8750, 0x561D, 0x8751, 0x5620, 0x8752, 0x5621, + 0x8753, 0x5622, 0x8754, 0x5625, 0x8755, 0x5626, 0x8756, 0x5628, 0x8757, 0x5629, 0x8758, 0x562A, 0x8759, 0x562B, 0x875A, 0x562E, + 0x875B, 0x562F, 0x875C, 0x5630, 0x875D, 0x5633, 0x875E, 0x5635, 0x875F, 0x5637, 0x8760, 0x5638, 0x8761, 0x563A, 0x8762, 0x563C, + 0x8763, 0x563D, 0x8764, 0x563E, 0x8765, 0x5640, 0x8766, 0x5641, 0x8767, 0x5642, 0x8768, 0x5643, 0x8769, 0x5644, 0x876A, 0x5645, + 0x876B, 0x5646, 0x876C, 0x5647, 0x876D, 0x5648, 0x876E, 0x5649, 0x876F, 0x564A, 0x8770, 0x564B, 0x8771, 0x564F, 0x8772, 0x5650, + 0x8773, 0x5651, 0x8774, 0x5652, 0x8775, 0x5653, 0x8776, 0x5655, 0x8777, 0x5656, 0x8778, 0x565A, 0x8779, 0x565B, 0x877A, 0x565D, + 0x877B, 0x565E, 0x877C, 0x565F, 0x877D, 0x5660, 0x877E, 0x5661, 0x8780, 0x5663, 0x8781, 0x5665, 0x8782, 0x5666, 0x8783, 0x5667, + 0x8784, 0x566D, 0x8785, 0x566E, 0x8786, 0x566F, 0x8787, 0x5670, 0x8788, 0x5672, 0x8789, 0x5673, 0x878A, 0x5674, 0x878B, 0x5675, + 0x878C, 0x5677, 0x878D, 0x5678, 0x878E, 0x5679, 0x878F, 0x567A, 0x8790, 0x567D, 0x8791, 0x567E, 0x8792, 0x567F, 0x8793, 0x5680, + 0x8794, 0x5681, 0x8795, 0x5682, 0x8796, 0x5683, 0x8797, 0x5684, 0x8798, 0x5687, 0x8799, 0x5688, 0x879A, 0x5689, 0x879B, 0x568A, + 0x879C, 0x568B, 0x879D, 0x568C, 0x879E, 0x568D, 0x879F, 0x5690, 0x87A0, 0x5691, 0x87A1, 0x5692, 0x87A2, 0x5694, 0x87A3, 0x5695, + 0x87A4, 0x5696, 0x87A5, 0x5697, 0x87A6, 0x5698, 0x87A7, 0x5699, 0x87A8, 0x569A, 0x87A9, 0x569B, 0x87AA, 0x569C, 0x87AB, 0x569D, + 0x87AC, 0x569E, 0x87AD, 0x569F, 0x87AE, 0x56A0, 0x87AF, 0x56A1, 0x87B0, 0x56A2, 0x87B1, 0x56A4, 0x87B2, 0x56A5, 0x87B3, 0x56A6, + 0x87B4, 0x56A7, 0x87B5, 0x56A8, 0x87B6, 0x56A9, 0x87B7, 0x56AA, 0x87B8, 0x56AB, 0x87B9, 0x56AC, 0x87BA, 0x56AD, 0x87BB, 0x56AE, + 0x87BC, 0x56B0, 0x87BD, 0x56B1, 0x87BE, 0x56B2, 0x87BF, 0x56B3, 0x87C0, 0x56B4, 0x87C1, 0x56B5, 0x87C2, 0x56B6, 0x87C3, 0x56B8, + 0x87C4, 0x56B9, 0x87C5, 0x56BA, 0x87C6, 0x56BB, 0x87C7, 0x56BD, 0x87C8, 0x56BE, 0x87C9, 0x56BF, 0x87CA, 0x56C0, 0x87CB, 0x56C1, + 0x87CC, 0x56C2, 0x87CD, 0x56C3, 0x87CE, 0x56C4, 0x87CF, 0x56C5, 0x87D0, 0x56C6, 0x87D1, 0x56C7, 0x87D2, 0x56C8, 0x87D3, 0x56C9, + 0x87D4, 0x56CB, 0x87D5, 0x56CC, 0x87D6, 0x56CD, 0x87D7, 0x56CE, 0x87D8, 0x56CF, 0x87D9, 0x56D0, 0x87DA, 0x56D1, 0x87DB, 0x56D2, + 0x87DC, 0x56D3, 0x87DD, 0x56D5, 0x87DE, 0x56D6, 0x87DF, 0x56D8, 0x87E0, 0x56D9, 0x87E1, 0x56DC, 0x87E2, 0x56E3, 0x87E3, 0x56E5, + 0x87E4, 0x56E6, 0x87E5, 0x56E7, 0x87E6, 0x56E8, 0x87E7, 0x56E9, 0x87E8, 0x56EA, 0x87E9, 0x56EC, 0x87EA, 0x56EE, 0x87EB, 0x56EF, + 0x87EC, 0x56F2, 0x87ED, 0x56F3, 0x87EE, 0x56F6, 0x87EF, 0x56F7, 0x87F0, 0x56F8, 0x87F1, 0x56FB, 0x87F2, 0x56FC, 0x87F3, 0x5700, + 0x87F4, 0x5701, 0x87F5, 0x5702, 0x87F6, 0x5705, 0x87F7, 0x5707, 0x87F8, 0x570B, 0x87F9, 0x570C, 0x87FA, 0x570D, 0x87FB, 0x570E, + 0x87FC, 0x570F, 0x87FD, 0x5710, 0x87FE, 0x5711, 0x8840, 0x5712, 0x8841, 0x5713, 0x8842, 0x5714, 0x8843, 0x5715, 0x8844, 0x5716, + 0x8845, 0x5717, 0x8846, 0x5718, 0x8847, 0x5719, 0x8848, 0x571A, 0x8849, 0x571B, 0x884A, 0x571D, 0x884B, 0x571E, 0x884C, 0x5720, + 0x884D, 0x5721, 0x884E, 0x5722, 0x884F, 0x5724, 0x8850, 0x5725, 0x8851, 0x5726, 0x8852, 0x5727, 0x8853, 0x572B, 0x8854, 0x5731, + 0x8855, 0x5732, 0x8856, 0x5734, 0x8857, 0x5735, 0x8858, 0x5736, 0x8859, 0x5737, 0x885A, 0x5738, 0x885B, 0x573C, 0x885C, 0x573D, + 0x885D, 0x573F, 0x885E, 0x5741, 0x885F, 0x5743, 0x8860, 0x5744, 0x8861, 0x5745, 0x8862, 0x5746, 0x8863, 0x5748, 0x8864, 0x5749, + 0x8865, 0x574B, 0x8866, 0x5752, 0x8867, 0x5753, 0x8868, 0x5754, 0x8869, 0x5755, 0x886A, 0x5756, 0x886B, 0x5758, 0x886C, 0x5759, + 0x886D, 0x5762, 0x886E, 0x5763, 0x886F, 0x5765, 0x8870, 0x5767, 0x8871, 0x576C, 0x8872, 0x576E, 0x8873, 0x5770, 0x8874, 0x5771, + 0x8875, 0x5772, 0x8876, 0x5774, 0x8877, 0x5775, 0x8878, 0x5778, 0x8879, 0x5779, 0x887A, 0x577A, 0x887B, 0x577D, 0x887C, 0x577E, + 0x887D, 0x577F, 0x887E, 0x5780, 0x8880, 0x5781, 0x8881, 0x5787, 0x8882, 0x5788, 0x8883, 0x5789, 0x8884, 0x578A, 0x8885, 0x578D, + 0x8886, 0x578E, 0x8887, 0x578F, 0x8888, 0x5790, 0x8889, 0x5791, 0x888A, 0x5794, 0x888B, 0x5795, 0x888C, 0x5796, 0x888D, 0x5797, + 0x888E, 0x5798, 0x888F, 0x5799, 0x8890, 0x579A, 0x8891, 0x579C, 0x8892, 0x579D, 0x8893, 0x579E, 0x8894, 0x579F, 0x8895, 0x57A5, + 0x8896, 0x57A8, 0x8897, 0x57AA, 0x8898, 0x57AC, 0x8899, 0x57AF, 0x889A, 0x57B0, 0x889B, 0x57B1, 0x889C, 0x57B3, 0x889D, 0x57B5, + 0x889E, 0x57B6, 0x889F, 0x57B7, 0x88A0, 0x57B9, 0x88A1, 0x57BA, 0x88A2, 0x57BB, 0x88A3, 0x57BC, 0x88A4, 0x57BD, 0x88A5, 0x57BE, + 0x88A6, 0x57BF, 0x88A7, 0x57C0, 0x88A8, 0x57C1, 0x88A9, 0x57C4, 0x88AA, 0x57C5, 0x88AB, 0x57C6, 0x88AC, 0x57C7, 0x88AD, 0x57C8, + 0x88AE, 0x57C9, 0x88AF, 0x57CA, 0x88B0, 0x57CC, 0x88B1, 0x57CD, 0x88B2, 0x57D0, 0x88B3, 0x57D1, 0x88B4, 0x57D3, 0x88B5, 0x57D6, + 0x88B6, 0x57D7, 0x88B7, 0x57DB, 0x88B8, 0x57DC, 0x88B9, 0x57DE, 0x88BA, 0x57E1, 0x88BB, 0x57E2, 0x88BC, 0x57E3, 0x88BD, 0x57E5, + 0x88BE, 0x57E6, 0x88BF, 0x57E7, 0x88C0, 0x57E8, 0x88C1, 0x57E9, 0x88C2, 0x57EA, 0x88C3, 0x57EB, 0x88C4, 0x57EC, 0x88C5, 0x57EE, + 0x88C6, 0x57F0, 0x88C7, 0x57F1, 0x88C8, 0x57F2, 0x88C9, 0x57F3, 0x88CA, 0x57F5, 0x88CB, 0x57F6, 0x88CC, 0x57F7, 0x88CD, 0x57FB, + 0x88CE, 0x57FC, 0x88CF, 0x57FE, 0x88D0, 0x57FF, 0x88D1, 0x5801, 0x88D2, 0x5803, 0x88D3, 0x5804, 0x88D4, 0x5805, 0x88D5, 0x5808, + 0x88D6, 0x5809, 0x88D7, 0x580A, 0x88D8, 0x580C, 0x88D9, 0x580E, 0x88DA, 0x580F, 0x88DB, 0x5810, 0x88DC, 0x5812, 0x88DD, 0x5813, + 0x88DE, 0x5814, 0x88DF, 0x5816, 0x88E0, 0x5817, 0x88E1, 0x5818, 0x88E2, 0x581A, 0x88E3, 0x581B, 0x88E4, 0x581C, 0x88E5, 0x581D, + 0x88E6, 0x581F, 0x88E7, 0x5822, 0x88E8, 0x5823, 0x88E9, 0x5825, 0x88EA, 0x5826, 0x88EB, 0x5827, 0x88EC, 0x5828, 0x88ED, 0x5829, + 0x88EE, 0x582B, 0x88EF, 0x582C, 0x88F0, 0x582D, 0x88F1, 0x582E, 0x88F2, 0x582F, 0x88F3, 0x5831, 0x88F4, 0x5832, 0x88F5, 0x5833, + 0x88F6, 0x5834, 0x88F7, 0x5836, 0x88F8, 0x5837, 0x88F9, 0x5838, 0x88FA, 0x5839, 0x88FB, 0x583A, 0x88FC, 0x583B, 0x88FD, 0x583C, + 0x88FE, 0x583D, 0x8940, 0x583E, 0x8941, 0x583F, 0x8942, 0x5840, 0x8943, 0x5841, 0x8944, 0x5842, 0x8945, 0x5843, 0x8946, 0x5845, + 0x8947, 0x5846, 0x8948, 0x5847, 0x8949, 0x5848, 0x894A, 0x5849, 0x894B, 0x584A, 0x894C, 0x584B, 0x894D, 0x584E, 0x894E, 0x584F, + 0x894F, 0x5850, 0x8950, 0x5852, 0x8951, 0x5853, 0x8952, 0x5855, 0x8953, 0x5856, 0x8954, 0x5857, 0x8955, 0x5859, 0x8956, 0x585A, + 0x8957, 0x585B, 0x8958, 0x585C, 0x8959, 0x585D, 0x895A, 0x585F, 0x895B, 0x5860, 0x895C, 0x5861, 0x895D, 0x5862, 0x895E, 0x5863, + 0x895F, 0x5864, 0x8960, 0x5866, 0x8961, 0x5867, 0x8962, 0x5868, 0x8963, 0x5869, 0x8964, 0x586A, 0x8965, 0x586D, 0x8966, 0x586E, + 0x8967, 0x586F, 0x8968, 0x5870, 0x8969, 0x5871, 0x896A, 0x5872, 0x896B, 0x5873, 0x896C, 0x5874, 0x896D, 0x5875, 0x896E, 0x5876, + 0x896F, 0x5877, 0x8970, 0x5878, 0x8971, 0x5879, 0x8972, 0x587A, 0x8973, 0x587B, 0x8974, 0x587C, 0x8975, 0x587D, 0x8976, 0x587F, + 0x8977, 0x5882, 0x8978, 0x5884, 0x8979, 0x5886, 0x897A, 0x5887, 0x897B, 0x5888, 0x897C, 0x588A, 0x897D, 0x588B, 0x897E, 0x588C, + 0x8980, 0x588D, 0x8981, 0x588E, 0x8982, 0x588F, 0x8983, 0x5890, 0x8984, 0x5891, 0x8985, 0x5894, 0x8986, 0x5895, 0x8987, 0x5896, + 0x8988, 0x5897, 0x8989, 0x5898, 0x898A, 0x589B, 0x898B, 0x589C, 0x898C, 0x589D, 0x898D, 0x58A0, 0x898E, 0x58A1, 0x898F, 0x58A2, + 0x8990, 0x58A3, 0x8991, 0x58A4, 0x8992, 0x58A5, 0x8993, 0x58A6, 0x8994, 0x58A7, 0x8995, 0x58AA, 0x8996, 0x58AB, 0x8997, 0x58AC, + 0x8998, 0x58AD, 0x8999, 0x58AE, 0x899A, 0x58AF, 0x899B, 0x58B0, 0x899C, 0x58B1, 0x899D, 0x58B2, 0x899E, 0x58B3, 0x899F, 0x58B4, + 0x89A0, 0x58B5, 0x89A1, 0x58B6, 0x89A2, 0x58B7, 0x89A3, 0x58B8, 0x89A4, 0x58B9, 0x89A5, 0x58BA, 0x89A6, 0x58BB, 0x89A7, 0x58BD, + 0x89A8, 0x58BE, 0x89A9, 0x58BF, 0x89AA, 0x58C0, 0x89AB, 0x58C2, 0x89AC, 0x58C3, 0x89AD, 0x58C4, 0x89AE, 0x58C6, 0x89AF, 0x58C7, + 0x89B0, 0x58C8, 0x89B1, 0x58C9, 0x89B2, 0x58CA, 0x89B3, 0x58CB, 0x89B4, 0x58CC, 0x89B5, 0x58CD, 0x89B6, 0x58CE, 0x89B7, 0x58CF, + 0x89B8, 0x58D0, 0x89B9, 0x58D2, 0x89BA, 0x58D3, 0x89BB, 0x58D4, 0x89BC, 0x58D6, 0x89BD, 0x58D7, 0x89BE, 0x58D8, 0x89BF, 0x58D9, + 0x89C0, 0x58DA, 0x89C1, 0x58DB, 0x89C2, 0x58DC, 0x89C3, 0x58DD, 0x89C4, 0x58DE, 0x89C5, 0x58DF, 0x89C6, 0x58E0, 0x89C7, 0x58E1, + 0x89C8, 0x58E2, 0x89C9, 0x58E3, 0x89CA, 0x58E5, 0x89CB, 0x58E6, 0x89CC, 0x58E7, 0x89CD, 0x58E8, 0x89CE, 0x58E9, 0x89CF, 0x58EA, + 0x89D0, 0x58ED, 0x89D1, 0x58EF, 0x89D2, 0x58F1, 0x89D3, 0x58F2, 0x89D4, 0x58F4, 0x89D5, 0x58F5, 0x89D6, 0x58F7, 0x89D7, 0x58F8, + 0x89D8, 0x58FA, 0x89D9, 0x58FB, 0x89DA, 0x58FC, 0x89DB, 0x58FD, 0x89DC, 0x58FE, 0x89DD, 0x58FF, 0x89DE, 0x5900, 0x89DF, 0x5901, + 0x89E0, 0x5903, 0x89E1, 0x5905, 0x89E2, 0x5906, 0x89E3, 0x5908, 0x89E4, 0x5909, 0x89E5, 0x590A, 0x89E6, 0x590B, 0x89E7, 0x590C, + 0x89E8, 0x590E, 0x89E9, 0x5910, 0x89EA, 0x5911, 0x89EB, 0x5912, 0x89EC, 0x5913, 0x89ED, 0x5917, 0x89EE, 0x5918, 0x89EF, 0x591B, + 0x89F0, 0x591D, 0x89F1, 0x591E, 0x89F2, 0x5920, 0x89F3, 0x5921, 0x89F4, 0x5922, 0x89F5, 0x5923, 0x89F6, 0x5926, 0x89F7, 0x5928, + 0x89F8, 0x592C, 0x89F9, 0x5930, 0x89FA, 0x5932, 0x89FB, 0x5933, 0x89FC, 0x5935, 0x89FD, 0x5936, 0x89FE, 0x593B, 0x8A40, 0x593D, + 0x8A41, 0x593E, 0x8A42, 0x593F, 0x8A43, 0x5940, 0x8A44, 0x5943, 0x8A45, 0x5945, 0x8A46, 0x5946, 0x8A47, 0x594A, 0x8A48, 0x594C, + 0x8A49, 0x594D, 0x8A4A, 0x5950, 0x8A4B, 0x5952, 0x8A4C, 0x5953, 0x8A4D, 0x5959, 0x8A4E, 0x595B, 0x8A4F, 0x595C, 0x8A50, 0x595D, + 0x8A51, 0x595E, 0x8A52, 0x595F, 0x8A53, 0x5961, 0x8A54, 0x5963, 0x8A55, 0x5964, 0x8A56, 0x5966, 0x8A57, 0x5967, 0x8A58, 0x5968, + 0x8A59, 0x5969, 0x8A5A, 0x596A, 0x8A5B, 0x596B, 0x8A5C, 0x596C, 0x8A5D, 0x596D, 0x8A5E, 0x596E, 0x8A5F, 0x596F, 0x8A60, 0x5970, + 0x8A61, 0x5971, 0x8A62, 0x5972, 0x8A63, 0x5975, 0x8A64, 0x5977, 0x8A65, 0x597A, 0x8A66, 0x597B, 0x8A67, 0x597C, 0x8A68, 0x597E, + 0x8A69, 0x597F, 0x8A6A, 0x5980, 0x8A6B, 0x5985, 0x8A6C, 0x5989, 0x8A6D, 0x598B, 0x8A6E, 0x598C, 0x8A6F, 0x598E, 0x8A70, 0x598F, + 0x8A71, 0x5990, 0x8A72, 0x5991, 0x8A73, 0x5994, 0x8A74, 0x5995, 0x8A75, 0x5998, 0x8A76, 0x599A, 0x8A77, 0x599B, 0x8A78, 0x599C, + 0x8A79, 0x599D, 0x8A7A, 0x599F, 0x8A7B, 0x59A0, 0x8A7C, 0x59A1, 0x8A7D, 0x59A2, 0x8A7E, 0x59A6, 0x8A80, 0x59A7, 0x8A81, 0x59AC, + 0x8A82, 0x59AD, 0x8A83, 0x59B0, 0x8A84, 0x59B1, 0x8A85, 0x59B3, 0x8A86, 0x59B4, 0x8A87, 0x59B5, 0x8A88, 0x59B6, 0x8A89, 0x59B7, + 0x8A8A, 0x59B8, 0x8A8B, 0x59BA, 0x8A8C, 0x59BC, 0x8A8D, 0x59BD, 0x8A8E, 0x59BF, 0x8A8F, 0x59C0, 0x8A90, 0x59C1, 0x8A91, 0x59C2, + 0x8A92, 0x59C3, 0x8A93, 0x59C4, 0x8A94, 0x59C5, 0x8A95, 0x59C7, 0x8A96, 0x59C8, 0x8A97, 0x59C9, 0x8A98, 0x59CC, 0x8A99, 0x59CD, + 0x8A9A, 0x59CE, 0x8A9B, 0x59CF, 0x8A9C, 0x59D5, 0x8A9D, 0x59D6, 0x8A9E, 0x59D9, 0x8A9F, 0x59DB, 0x8AA0, 0x59DE, 0x8AA1, 0x59DF, + 0x8AA2, 0x59E0, 0x8AA3, 0x59E1, 0x8AA4, 0x59E2, 0x8AA5, 0x59E4, 0x8AA6, 0x59E6, 0x8AA7, 0x59E7, 0x8AA8, 0x59E9, 0x8AA9, 0x59EA, + 0x8AAA, 0x59EB, 0x8AAB, 0x59ED, 0x8AAC, 0x59EE, 0x8AAD, 0x59EF, 0x8AAE, 0x59F0, 0x8AAF, 0x59F1, 0x8AB0, 0x59F2, 0x8AB1, 0x59F3, + 0x8AB2, 0x59F4, 0x8AB3, 0x59F5, 0x8AB4, 0x59F6, 0x8AB5, 0x59F7, 0x8AB6, 0x59F8, 0x8AB7, 0x59FA, 0x8AB8, 0x59FC, 0x8AB9, 0x59FD, + 0x8ABA, 0x59FE, 0x8ABB, 0x5A00, 0x8ABC, 0x5A02, 0x8ABD, 0x5A0A, 0x8ABE, 0x5A0B, 0x8ABF, 0x5A0D, 0x8AC0, 0x5A0E, 0x8AC1, 0x5A0F, + 0x8AC2, 0x5A10, 0x8AC3, 0x5A12, 0x8AC4, 0x5A14, 0x8AC5, 0x5A15, 0x8AC6, 0x5A16, 0x8AC7, 0x5A17, 0x8AC8, 0x5A19, 0x8AC9, 0x5A1A, + 0x8ACA, 0x5A1B, 0x8ACB, 0x5A1D, 0x8ACC, 0x5A1E, 0x8ACD, 0x5A21, 0x8ACE, 0x5A22, 0x8ACF, 0x5A24, 0x8AD0, 0x5A26, 0x8AD1, 0x5A27, + 0x8AD2, 0x5A28, 0x8AD3, 0x5A2A, 0x8AD4, 0x5A2B, 0x8AD5, 0x5A2C, 0x8AD6, 0x5A2D, 0x8AD7, 0x5A2E, 0x8AD8, 0x5A2F, 0x8AD9, 0x5A30, + 0x8ADA, 0x5A33, 0x8ADB, 0x5A35, 0x8ADC, 0x5A37, 0x8ADD, 0x5A38, 0x8ADE, 0x5A39, 0x8ADF, 0x5A3A, 0x8AE0, 0x5A3B, 0x8AE1, 0x5A3D, + 0x8AE2, 0x5A3E, 0x8AE3, 0x5A3F, 0x8AE4, 0x5A41, 0x8AE5, 0x5A42, 0x8AE6, 0x5A43, 0x8AE7, 0x5A44, 0x8AE8, 0x5A45, 0x8AE9, 0x5A47, + 0x8AEA, 0x5A48, 0x8AEB, 0x5A4B, 0x8AEC, 0x5A4C, 0x8AED, 0x5A4D, 0x8AEE, 0x5A4E, 0x8AEF, 0x5A4F, 0x8AF0, 0x5A50, 0x8AF1, 0x5A51, + 0x8AF2, 0x5A52, 0x8AF3, 0x5A53, 0x8AF4, 0x5A54, 0x8AF5, 0x5A56, 0x8AF6, 0x5A57, 0x8AF7, 0x5A58, 0x8AF8, 0x5A59, 0x8AF9, 0x5A5B, + 0x8AFA, 0x5A5C, 0x8AFB, 0x5A5D, 0x8AFC, 0x5A5E, 0x8AFD, 0x5A5F, 0x8AFE, 0x5A60, 0x8B40, 0x5A61, 0x8B41, 0x5A63, 0x8B42, 0x5A64, + 0x8B43, 0x5A65, 0x8B44, 0x5A66, 0x8B45, 0x5A68, 0x8B46, 0x5A69, 0x8B47, 0x5A6B, 0x8B48, 0x5A6C, 0x8B49, 0x5A6D, 0x8B4A, 0x5A6E, + 0x8B4B, 0x5A6F, 0x8B4C, 0x5A70, 0x8B4D, 0x5A71, 0x8B4E, 0x5A72, 0x8B4F, 0x5A73, 0x8B50, 0x5A78, 0x8B51, 0x5A79, 0x8B52, 0x5A7B, + 0x8B53, 0x5A7C, 0x8B54, 0x5A7D, 0x8B55, 0x5A7E, 0x8B56, 0x5A80, 0x8B57, 0x5A81, 0x8B58, 0x5A82, 0x8B59, 0x5A83, 0x8B5A, 0x5A84, + 0x8B5B, 0x5A85, 0x8B5C, 0x5A86, 0x8B5D, 0x5A87, 0x8B5E, 0x5A88, 0x8B5F, 0x5A89, 0x8B60, 0x5A8A, 0x8B61, 0x5A8B, 0x8B62, 0x5A8C, + 0x8B63, 0x5A8D, 0x8B64, 0x5A8E, 0x8B65, 0x5A8F, 0x8B66, 0x5A90, 0x8B67, 0x5A91, 0x8B68, 0x5A93, 0x8B69, 0x5A94, 0x8B6A, 0x5A95, + 0x8B6B, 0x5A96, 0x8B6C, 0x5A97, 0x8B6D, 0x5A98, 0x8B6E, 0x5A99, 0x8B6F, 0x5A9C, 0x8B70, 0x5A9D, 0x8B71, 0x5A9E, 0x8B72, 0x5A9F, + 0x8B73, 0x5AA0, 0x8B74, 0x5AA1, 0x8B75, 0x5AA2, 0x8B76, 0x5AA3, 0x8B77, 0x5AA4, 0x8B78, 0x5AA5, 0x8B79, 0x5AA6, 0x8B7A, 0x5AA7, + 0x8B7B, 0x5AA8, 0x8B7C, 0x5AA9, 0x8B7D, 0x5AAB, 0x8B7E, 0x5AAC, 0x8B80, 0x5AAD, 0x8B81, 0x5AAE, 0x8B82, 0x5AAF, 0x8B83, 0x5AB0, + 0x8B84, 0x5AB1, 0x8B85, 0x5AB4, 0x8B86, 0x5AB6, 0x8B87, 0x5AB7, 0x8B88, 0x5AB9, 0x8B89, 0x5ABA, 0x8B8A, 0x5ABB, 0x8B8B, 0x5ABC, + 0x8B8C, 0x5ABD, 0x8B8D, 0x5ABF, 0x8B8E, 0x5AC0, 0x8B8F, 0x5AC3, 0x8B90, 0x5AC4, 0x8B91, 0x5AC5, 0x8B92, 0x5AC6, 0x8B93, 0x5AC7, + 0x8B94, 0x5AC8, 0x8B95, 0x5ACA, 0x8B96, 0x5ACB, 0x8B97, 0x5ACD, 0x8B98, 0x5ACE, 0x8B99, 0x5ACF, 0x8B9A, 0x5AD0, 0x8B9B, 0x5AD1, + 0x8B9C, 0x5AD3, 0x8B9D, 0x5AD5, 0x8B9E, 0x5AD7, 0x8B9F, 0x5AD9, 0x8BA0, 0x5ADA, 0x8BA1, 0x5ADB, 0x8BA2, 0x5ADD, 0x8BA3, 0x5ADE, + 0x8BA4, 0x5ADF, 0x8BA5, 0x5AE2, 0x8BA6, 0x5AE4, 0x8BA7, 0x5AE5, 0x8BA8, 0x5AE7, 0x8BA9, 0x5AE8, 0x8BAA, 0x5AEA, 0x8BAB, 0x5AEC, + 0x8BAC, 0x5AED, 0x8BAD, 0x5AEE, 0x8BAE, 0x5AEF, 0x8BAF, 0x5AF0, 0x8BB0, 0x5AF2, 0x8BB1, 0x5AF3, 0x8BB2, 0x5AF4, 0x8BB3, 0x5AF5, + 0x8BB4, 0x5AF6, 0x8BB5, 0x5AF7, 0x8BB6, 0x5AF8, 0x8BB7, 0x5AF9, 0x8BB8, 0x5AFA, 0x8BB9, 0x5AFB, 0x8BBA, 0x5AFC, 0x8BBB, 0x5AFD, + 0x8BBC, 0x5AFE, 0x8BBD, 0x5AFF, 0x8BBE, 0x5B00, 0x8BBF, 0x5B01, 0x8BC0, 0x5B02, 0x8BC1, 0x5B03, 0x8BC2, 0x5B04, 0x8BC3, 0x5B05, + 0x8BC4, 0x5B06, 0x8BC5, 0x5B07, 0x8BC6, 0x5B08, 0x8BC7, 0x5B0A, 0x8BC8, 0x5B0B, 0x8BC9, 0x5B0C, 0x8BCA, 0x5B0D, 0x8BCB, 0x5B0E, + 0x8BCC, 0x5B0F, 0x8BCD, 0x5B10, 0x8BCE, 0x5B11, 0x8BCF, 0x5B12, 0x8BD0, 0x5B13, 0x8BD1, 0x5B14, 0x8BD2, 0x5B15, 0x8BD3, 0x5B18, + 0x8BD4, 0x5B19, 0x8BD5, 0x5B1A, 0x8BD6, 0x5B1B, 0x8BD7, 0x5B1C, 0x8BD8, 0x5B1D, 0x8BD9, 0x5B1E, 0x8BDA, 0x5B1F, 0x8BDB, 0x5B20, + 0x8BDC, 0x5B21, 0x8BDD, 0x5B22, 0x8BDE, 0x5B23, 0x8BDF, 0x5B24, 0x8BE0, 0x5B25, 0x8BE1, 0x5B26, 0x8BE2, 0x5B27, 0x8BE3, 0x5B28, + 0x8BE4, 0x5B29, 0x8BE5, 0x5B2A, 0x8BE6, 0x5B2B, 0x8BE7, 0x5B2C, 0x8BE8, 0x5B2D, 0x8BE9, 0x5B2E, 0x8BEA, 0x5B2F, 0x8BEB, 0x5B30, + 0x8BEC, 0x5B31, 0x8BED, 0x5B33, 0x8BEE, 0x5B35, 0x8BEF, 0x5B36, 0x8BF0, 0x5B38, 0x8BF1, 0x5B39, 0x8BF2, 0x5B3A, 0x8BF3, 0x5B3B, + 0x8BF4, 0x5B3C, 0x8BF5, 0x5B3D, 0x8BF6, 0x5B3E, 0x8BF7, 0x5B3F, 0x8BF8, 0x5B41, 0x8BF9, 0x5B42, 0x8BFA, 0x5B43, 0x8BFB, 0x5B44, + 0x8BFC, 0x5B45, 0x8BFD, 0x5B46, 0x8BFE, 0x5B47, 0x8C40, 0x5B48, 0x8C41, 0x5B49, 0x8C42, 0x5B4A, 0x8C43, 0x5B4B, 0x8C44, 0x5B4C, + 0x8C45, 0x5B4D, 0x8C46, 0x5B4E, 0x8C47, 0x5B4F, 0x8C48, 0x5B52, 0x8C49, 0x5B56, 0x8C4A, 0x5B5E, 0x8C4B, 0x5B60, 0x8C4C, 0x5B61, + 0x8C4D, 0x5B67, 0x8C4E, 0x5B68, 0x8C4F, 0x5B6B, 0x8C50, 0x5B6D, 0x8C51, 0x5B6E, 0x8C52, 0x5B6F, 0x8C53, 0x5B72, 0x8C54, 0x5B74, + 0x8C55, 0x5B76, 0x8C56, 0x5B77, 0x8C57, 0x5B78, 0x8C58, 0x5B79, 0x8C59, 0x5B7B, 0x8C5A, 0x5B7C, 0x8C5B, 0x5B7E, 0x8C5C, 0x5B7F, + 0x8C5D, 0x5B82, 0x8C5E, 0x5B86, 0x8C5F, 0x5B8A, 0x8C60, 0x5B8D, 0x8C61, 0x5B8E, 0x8C62, 0x5B90, 0x8C63, 0x5B91, 0x8C64, 0x5B92, + 0x8C65, 0x5B94, 0x8C66, 0x5B96, 0x8C67, 0x5B9F, 0x8C68, 0x5BA7, 0x8C69, 0x5BA8, 0x8C6A, 0x5BA9, 0x8C6B, 0x5BAC, 0x8C6C, 0x5BAD, + 0x8C6D, 0x5BAE, 0x8C6E, 0x5BAF, 0x8C6F, 0x5BB1, 0x8C70, 0x5BB2, 0x8C71, 0x5BB7, 0x8C72, 0x5BBA, 0x8C73, 0x5BBB, 0x8C74, 0x5BBC, + 0x8C75, 0x5BC0, 0x8C76, 0x5BC1, 0x8C77, 0x5BC3, 0x8C78, 0x5BC8, 0x8C79, 0x5BC9, 0x8C7A, 0x5BCA, 0x8C7B, 0x5BCB, 0x8C7C, 0x5BCD, + 0x8C7D, 0x5BCE, 0x8C7E, 0x5BCF, 0x8C80, 0x5BD1, 0x8C81, 0x5BD4, 0x8C82, 0x5BD5, 0x8C83, 0x5BD6, 0x8C84, 0x5BD7, 0x8C85, 0x5BD8, + 0x8C86, 0x5BD9, 0x8C87, 0x5BDA, 0x8C88, 0x5BDB, 0x8C89, 0x5BDC, 0x8C8A, 0x5BE0, 0x8C8B, 0x5BE2, 0x8C8C, 0x5BE3, 0x8C8D, 0x5BE6, + 0x8C8E, 0x5BE7, 0x8C8F, 0x5BE9, 0x8C90, 0x5BEA, 0x8C91, 0x5BEB, 0x8C92, 0x5BEC, 0x8C93, 0x5BED, 0x8C94, 0x5BEF, 0x8C95, 0x5BF1, + 0x8C96, 0x5BF2, 0x8C97, 0x5BF3, 0x8C98, 0x5BF4, 0x8C99, 0x5BF5, 0x8C9A, 0x5BF6, 0x8C9B, 0x5BF7, 0x8C9C, 0x5BFD, 0x8C9D, 0x5BFE, + 0x8C9E, 0x5C00, 0x8C9F, 0x5C02, 0x8CA0, 0x5C03, 0x8CA1, 0x5C05, 0x8CA2, 0x5C07, 0x8CA3, 0x5C08, 0x8CA4, 0x5C0B, 0x8CA5, 0x5C0C, + 0x8CA6, 0x5C0D, 0x8CA7, 0x5C0E, 0x8CA8, 0x5C10, 0x8CA9, 0x5C12, 0x8CAA, 0x5C13, 0x8CAB, 0x5C17, 0x8CAC, 0x5C19, 0x8CAD, 0x5C1B, + 0x8CAE, 0x5C1E, 0x8CAF, 0x5C1F, 0x8CB0, 0x5C20, 0x8CB1, 0x5C21, 0x8CB2, 0x5C23, 0x8CB3, 0x5C26, 0x8CB4, 0x5C28, 0x8CB5, 0x5C29, + 0x8CB6, 0x5C2A, 0x8CB7, 0x5C2B, 0x8CB8, 0x5C2D, 0x8CB9, 0x5C2E, 0x8CBA, 0x5C2F, 0x8CBB, 0x5C30, 0x8CBC, 0x5C32, 0x8CBD, 0x5C33, + 0x8CBE, 0x5C35, 0x8CBF, 0x5C36, 0x8CC0, 0x5C37, 0x8CC1, 0x5C43, 0x8CC2, 0x5C44, 0x8CC3, 0x5C46, 0x8CC4, 0x5C47, 0x8CC5, 0x5C4C, + 0x8CC6, 0x5C4D, 0x8CC7, 0x5C52, 0x8CC8, 0x5C53, 0x8CC9, 0x5C54, 0x8CCA, 0x5C56, 0x8CCB, 0x5C57, 0x8CCC, 0x5C58, 0x8CCD, 0x5C5A, + 0x8CCE, 0x5C5B, 0x8CCF, 0x5C5C, 0x8CD0, 0x5C5D, 0x8CD1, 0x5C5F, 0x8CD2, 0x5C62, 0x8CD3, 0x5C64, 0x8CD4, 0x5C67, 0x8CD5, 0x5C68, + 0x8CD6, 0x5C69, 0x8CD7, 0x5C6A, 0x8CD8, 0x5C6B, 0x8CD9, 0x5C6C, 0x8CDA, 0x5C6D, 0x8CDB, 0x5C70, 0x8CDC, 0x5C72, 0x8CDD, 0x5C73, + 0x8CDE, 0x5C74, 0x8CDF, 0x5C75, 0x8CE0, 0x5C76, 0x8CE1, 0x5C77, 0x8CE2, 0x5C78, 0x8CE3, 0x5C7B, 0x8CE4, 0x5C7C, 0x8CE5, 0x5C7D, + 0x8CE6, 0x5C7E, 0x8CE7, 0x5C80, 0x8CE8, 0x5C83, 0x8CE9, 0x5C84, 0x8CEA, 0x5C85, 0x8CEB, 0x5C86, 0x8CEC, 0x5C87, 0x8CED, 0x5C89, + 0x8CEE, 0x5C8A, 0x8CEF, 0x5C8B, 0x8CF0, 0x5C8E, 0x8CF1, 0x5C8F, 0x8CF2, 0x5C92, 0x8CF3, 0x5C93, 0x8CF4, 0x5C95, 0x8CF5, 0x5C9D, + 0x8CF6, 0x5C9E, 0x8CF7, 0x5C9F, 0x8CF8, 0x5CA0, 0x8CF9, 0x5CA1, 0x8CFA, 0x5CA4, 0x8CFB, 0x5CA5, 0x8CFC, 0x5CA6, 0x8CFD, 0x5CA7, + 0x8CFE, 0x5CA8, 0x8D40, 0x5CAA, 0x8D41, 0x5CAE, 0x8D42, 0x5CAF, 0x8D43, 0x5CB0, 0x8D44, 0x5CB2, 0x8D45, 0x5CB4, 0x8D46, 0x5CB6, + 0x8D47, 0x5CB9, 0x8D48, 0x5CBA, 0x8D49, 0x5CBB, 0x8D4A, 0x5CBC, 0x8D4B, 0x5CBE, 0x8D4C, 0x5CC0, 0x8D4D, 0x5CC2, 0x8D4E, 0x5CC3, + 0x8D4F, 0x5CC5, 0x8D50, 0x5CC6, 0x8D51, 0x5CC7, 0x8D52, 0x5CC8, 0x8D53, 0x5CC9, 0x8D54, 0x5CCA, 0x8D55, 0x5CCC, 0x8D56, 0x5CCD, + 0x8D57, 0x5CCE, 0x8D58, 0x5CCF, 0x8D59, 0x5CD0, 0x8D5A, 0x5CD1, 0x8D5B, 0x5CD3, 0x8D5C, 0x5CD4, 0x8D5D, 0x5CD5, 0x8D5E, 0x5CD6, + 0x8D5F, 0x5CD7, 0x8D60, 0x5CD8, 0x8D61, 0x5CDA, 0x8D62, 0x5CDB, 0x8D63, 0x5CDC, 0x8D64, 0x5CDD, 0x8D65, 0x5CDE, 0x8D66, 0x5CDF, + 0x8D67, 0x5CE0, 0x8D68, 0x5CE2, 0x8D69, 0x5CE3, 0x8D6A, 0x5CE7, 0x8D6B, 0x5CE9, 0x8D6C, 0x5CEB, 0x8D6D, 0x5CEC, 0x8D6E, 0x5CEE, + 0x8D6F, 0x5CEF, 0x8D70, 0x5CF1, 0x8D71, 0x5CF2, 0x8D72, 0x5CF3, 0x8D73, 0x5CF4, 0x8D74, 0x5CF5, 0x8D75, 0x5CF6, 0x8D76, 0x5CF7, + 0x8D77, 0x5CF8, 0x8D78, 0x5CF9, 0x8D79, 0x5CFA, 0x8D7A, 0x5CFC, 0x8D7B, 0x5CFD, 0x8D7C, 0x5CFE, 0x8D7D, 0x5CFF, 0x8D7E, 0x5D00, + 0x8D80, 0x5D01, 0x8D81, 0x5D04, 0x8D82, 0x5D05, 0x8D83, 0x5D08, 0x8D84, 0x5D09, 0x8D85, 0x5D0A, 0x8D86, 0x5D0B, 0x8D87, 0x5D0C, + 0x8D88, 0x5D0D, 0x8D89, 0x5D0F, 0x8D8A, 0x5D10, 0x8D8B, 0x5D11, 0x8D8C, 0x5D12, 0x8D8D, 0x5D13, 0x8D8E, 0x5D15, 0x8D8F, 0x5D17, + 0x8D90, 0x5D18, 0x8D91, 0x5D19, 0x8D92, 0x5D1A, 0x8D93, 0x5D1C, 0x8D94, 0x5D1D, 0x8D95, 0x5D1F, 0x8D96, 0x5D20, 0x8D97, 0x5D21, + 0x8D98, 0x5D22, 0x8D99, 0x5D23, 0x8D9A, 0x5D25, 0x8D9B, 0x5D28, 0x8D9C, 0x5D2A, 0x8D9D, 0x5D2B, 0x8D9E, 0x5D2C, 0x8D9F, 0x5D2F, + 0x8DA0, 0x5D30, 0x8DA1, 0x5D31, 0x8DA2, 0x5D32, 0x8DA3, 0x5D33, 0x8DA4, 0x5D35, 0x8DA5, 0x5D36, 0x8DA6, 0x5D37, 0x8DA7, 0x5D38, + 0x8DA8, 0x5D39, 0x8DA9, 0x5D3A, 0x8DAA, 0x5D3B, 0x8DAB, 0x5D3C, 0x8DAC, 0x5D3F, 0x8DAD, 0x5D40, 0x8DAE, 0x5D41, 0x8DAF, 0x5D42, + 0x8DB0, 0x5D43, 0x8DB1, 0x5D44, 0x8DB2, 0x5D45, 0x8DB3, 0x5D46, 0x8DB4, 0x5D48, 0x8DB5, 0x5D49, 0x8DB6, 0x5D4D, 0x8DB7, 0x5D4E, + 0x8DB8, 0x5D4F, 0x8DB9, 0x5D50, 0x8DBA, 0x5D51, 0x8DBB, 0x5D52, 0x8DBC, 0x5D53, 0x8DBD, 0x5D54, 0x8DBE, 0x5D55, 0x8DBF, 0x5D56, + 0x8DC0, 0x5D57, 0x8DC1, 0x5D59, 0x8DC2, 0x5D5A, 0x8DC3, 0x5D5C, 0x8DC4, 0x5D5E, 0x8DC5, 0x5D5F, 0x8DC6, 0x5D60, 0x8DC7, 0x5D61, + 0x8DC8, 0x5D62, 0x8DC9, 0x5D63, 0x8DCA, 0x5D64, 0x8DCB, 0x5D65, 0x8DCC, 0x5D66, 0x8DCD, 0x5D67, 0x8DCE, 0x5D68, 0x8DCF, 0x5D6A, + 0x8DD0, 0x5D6D, 0x8DD1, 0x5D6E, 0x8DD2, 0x5D70, 0x8DD3, 0x5D71, 0x8DD4, 0x5D72, 0x8DD5, 0x5D73, 0x8DD6, 0x5D75, 0x8DD7, 0x5D76, + 0x8DD8, 0x5D77, 0x8DD9, 0x5D78, 0x8DDA, 0x5D79, 0x8DDB, 0x5D7A, 0x8DDC, 0x5D7B, 0x8DDD, 0x5D7C, 0x8DDE, 0x5D7D, 0x8DDF, 0x5D7E, + 0x8DE0, 0x5D7F, 0x8DE1, 0x5D80, 0x8DE2, 0x5D81, 0x8DE3, 0x5D83, 0x8DE4, 0x5D84, 0x8DE5, 0x5D85, 0x8DE6, 0x5D86, 0x8DE7, 0x5D87, + 0x8DE8, 0x5D88, 0x8DE9, 0x5D89, 0x8DEA, 0x5D8A, 0x8DEB, 0x5D8B, 0x8DEC, 0x5D8C, 0x8DED, 0x5D8D, 0x8DEE, 0x5D8E, 0x8DEF, 0x5D8F, + 0x8DF0, 0x5D90, 0x8DF1, 0x5D91, 0x8DF2, 0x5D92, 0x8DF3, 0x5D93, 0x8DF4, 0x5D94, 0x8DF5, 0x5D95, 0x8DF6, 0x5D96, 0x8DF7, 0x5D97, + 0x8DF8, 0x5D98, 0x8DF9, 0x5D9A, 0x8DFA, 0x5D9B, 0x8DFB, 0x5D9C, 0x8DFC, 0x5D9E, 0x8DFD, 0x5D9F, 0x8DFE, 0x5DA0, 0x8E40, 0x5DA1, + 0x8E41, 0x5DA2, 0x8E42, 0x5DA3, 0x8E43, 0x5DA4, 0x8E44, 0x5DA5, 0x8E45, 0x5DA6, 0x8E46, 0x5DA7, 0x8E47, 0x5DA8, 0x8E48, 0x5DA9, + 0x8E49, 0x5DAA, 0x8E4A, 0x5DAB, 0x8E4B, 0x5DAC, 0x8E4C, 0x5DAD, 0x8E4D, 0x5DAE, 0x8E4E, 0x5DAF, 0x8E4F, 0x5DB0, 0x8E50, 0x5DB1, + 0x8E51, 0x5DB2, 0x8E52, 0x5DB3, 0x8E53, 0x5DB4, 0x8E54, 0x5DB5, 0x8E55, 0x5DB6, 0x8E56, 0x5DB8, 0x8E57, 0x5DB9, 0x8E58, 0x5DBA, + 0x8E59, 0x5DBB, 0x8E5A, 0x5DBC, 0x8E5B, 0x5DBD, 0x8E5C, 0x5DBE, 0x8E5D, 0x5DBF, 0x8E5E, 0x5DC0, 0x8E5F, 0x5DC1, 0x8E60, 0x5DC2, + 0x8E61, 0x5DC3, 0x8E62, 0x5DC4, 0x8E63, 0x5DC6, 0x8E64, 0x5DC7, 0x8E65, 0x5DC8, 0x8E66, 0x5DC9, 0x8E67, 0x5DCA, 0x8E68, 0x5DCB, + 0x8E69, 0x5DCC, 0x8E6A, 0x5DCE, 0x8E6B, 0x5DCF, 0x8E6C, 0x5DD0, 0x8E6D, 0x5DD1, 0x8E6E, 0x5DD2, 0x8E6F, 0x5DD3, 0x8E70, 0x5DD4, + 0x8E71, 0x5DD5, 0x8E72, 0x5DD6, 0x8E73, 0x5DD7, 0x8E74, 0x5DD8, 0x8E75, 0x5DD9, 0x8E76, 0x5DDA, 0x8E77, 0x5DDC, 0x8E78, 0x5DDF, + 0x8E79, 0x5DE0, 0x8E7A, 0x5DE3, 0x8E7B, 0x5DE4, 0x8E7C, 0x5DEA, 0x8E7D, 0x5DEC, 0x8E7E, 0x5DED, 0x8E80, 0x5DF0, 0x8E81, 0x5DF5, + 0x8E82, 0x5DF6, 0x8E83, 0x5DF8, 0x8E84, 0x5DF9, 0x8E85, 0x5DFA, 0x8E86, 0x5DFB, 0x8E87, 0x5DFC, 0x8E88, 0x5DFF, 0x8E89, 0x5E00, + 0x8E8A, 0x5E04, 0x8E8B, 0x5E07, 0x8E8C, 0x5E09, 0x8E8D, 0x5E0A, 0x8E8E, 0x5E0B, 0x8E8F, 0x5E0D, 0x8E90, 0x5E0E, 0x8E91, 0x5E12, + 0x8E92, 0x5E13, 0x8E93, 0x5E17, 0x8E94, 0x5E1E, 0x8E95, 0x5E1F, 0x8E96, 0x5E20, 0x8E97, 0x5E21, 0x8E98, 0x5E22, 0x8E99, 0x5E23, + 0x8E9A, 0x5E24, 0x8E9B, 0x5E25, 0x8E9C, 0x5E28, 0x8E9D, 0x5E29, 0x8E9E, 0x5E2A, 0x8E9F, 0x5E2B, 0x8EA0, 0x5E2C, 0x8EA1, 0x5E2F, + 0x8EA2, 0x5E30, 0x8EA3, 0x5E32, 0x8EA4, 0x5E33, 0x8EA5, 0x5E34, 0x8EA6, 0x5E35, 0x8EA7, 0x5E36, 0x8EA8, 0x5E39, 0x8EA9, 0x5E3A, + 0x8EAA, 0x5E3E, 0x8EAB, 0x5E3F, 0x8EAC, 0x5E40, 0x8EAD, 0x5E41, 0x8EAE, 0x5E43, 0x8EAF, 0x5E46, 0x8EB0, 0x5E47, 0x8EB1, 0x5E48, + 0x8EB2, 0x5E49, 0x8EB3, 0x5E4A, 0x8EB4, 0x5E4B, 0x8EB5, 0x5E4D, 0x8EB6, 0x5E4E, 0x8EB7, 0x5E4F, 0x8EB8, 0x5E50, 0x8EB9, 0x5E51, + 0x8EBA, 0x5E52, 0x8EBB, 0x5E53, 0x8EBC, 0x5E56, 0x8EBD, 0x5E57, 0x8EBE, 0x5E58, 0x8EBF, 0x5E59, 0x8EC0, 0x5E5A, 0x8EC1, 0x5E5C, + 0x8EC2, 0x5E5D, 0x8EC3, 0x5E5F, 0x8EC4, 0x5E60, 0x8EC5, 0x5E63, 0x8EC6, 0x5E64, 0x8EC7, 0x5E65, 0x8EC8, 0x5E66, 0x8EC9, 0x5E67, + 0x8ECA, 0x5E68, 0x8ECB, 0x5E69, 0x8ECC, 0x5E6A, 0x8ECD, 0x5E6B, 0x8ECE, 0x5E6C, 0x8ECF, 0x5E6D, 0x8ED0, 0x5E6E, 0x8ED1, 0x5E6F, + 0x8ED2, 0x5E70, 0x8ED3, 0x5E71, 0x8ED4, 0x5E75, 0x8ED5, 0x5E77, 0x8ED6, 0x5E79, 0x8ED7, 0x5E7E, 0x8ED8, 0x5E81, 0x8ED9, 0x5E82, + 0x8EDA, 0x5E83, 0x8EDB, 0x5E85, 0x8EDC, 0x5E88, 0x8EDD, 0x5E89, 0x8EDE, 0x5E8C, 0x8EDF, 0x5E8D, 0x8EE0, 0x5E8E, 0x8EE1, 0x5E92, + 0x8EE2, 0x5E98, 0x8EE3, 0x5E9B, 0x8EE4, 0x5E9D, 0x8EE5, 0x5EA1, 0x8EE6, 0x5EA2, 0x8EE7, 0x5EA3, 0x8EE8, 0x5EA4, 0x8EE9, 0x5EA8, + 0x8EEA, 0x5EA9, 0x8EEB, 0x5EAA, 0x8EEC, 0x5EAB, 0x8EED, 0x5EAC, 0x8EEE, 0x5EAE, 0x8EEF, 0x5EAF, 0x8EF0, 0x5EB0, 0x8EF1, 0x5EB1, + 0x8EF2, 0x5EB2, 0x8EF3, 0x5EB4, 0x8EF4, 0x5EBA, 0x8EF5, 0x5EBB, 0x8EF6, 0x5EBC, 0x8EF7, 0x5EBD, 0x8EF8, 0x5EBF, 0x8EF9, 0x5EC0, + 0x8EFA, 0x5EC1, 0x8EFB, 0x5EC2, 0x8EFC, 0x5EC3, 0x8EFD, 0x5EC4, 0x8EFE, 0x5EC5, 0x8F40, 0x5EC6, 0x8F41, 0x5EC7, 0x8F42, 0x5EC8, + 0x8F43, 0x5ECB, 0x8F44, 0x5ECC, 0x8F45, 0x5ECD, 0x8F46, 0x5ECE, 0x8F47, 0x5ECF, 0x8F48, 0x5ED0, 0x8F49, 0x5ED4, 0x8F4A, 0x5ED5, + 0x8F4B, 0x5ED7, 0x8F4C, 0x5ED8, 0x8F4D, 0x5ED9, 0x8F4E, 0x5EDA, 0x8F4F, 0x5EDC, 0x8F50, 0x5EDD, 0x8F51, 0x5EDE, 0x8F52, 0x5EDF, + 0x8F53, 0x5EE0, 0x8F54, 0x5EE1, 0x8F55, 0x5EE2, 0x8F56, 0x5EE3, 0x8F57, 0x5EE4, 0x8F58, 0x5EE5, 0x8F59, 0x5EE6, 0x8F5A, 0x5EE7, + 0x8F5B, 0x5EE9, 0x8F5C, 0x5EEB, 0x8F5D, 0x5EEC, 0x8F5E, 0x5EED, 0x8F5F, 0x5EEE, 0x8F60, 0x5EEF, 0x8F61, 0x5EF0, 0x8F62, 0x5EF1, + 0x8F63, 0x5EF2, 0x8F64, 0x5EF3, 0x8F65, 0x5EF5, 0x8F66, 0x5EF8, 0x8F67, 0x5EF9, 0x8F68, 0x5EFB, 0x8F69, 0x5EFC, 0x8F6A, 0x5EFD, + 0x8F6B, 0x5F05, 0x8F6C, 0x5F06, 0x8F6D, 0x5F07, 0x8F6E, 0x5F09, 0x8F6F, 0x5F0C, 0x8F70, 0x5F0D, 0x8F71, 0x5F0E, 0x8F72, 0x5F10, + 0x8F73, 0x5F12, 0x8F74, 0x5F14, 0x8F75, 0x5F16, 0x8F76, 0x5F19, 0x8F77, 0x5F1A, 0x8F78, 0x5F1C, 0x8F79, 0x5F1D, 0x8F7A, 0x5F1E, + 0x8F7B, 0x5F21, 0x8F7C, 0x5F22, 0x8F7D, 0x5F23, 0x8F7E, 0x5F24, 0x8F80, 0x5F28, 0x8F81, 0x5F2B, 0x8F82, 0x5F2C, 0x8F83, 0x5F2E, + 0x8F84, 0x5F30, 0x8F85, 0x5F32, 0x8F86, 0x5F33, 0x8F87, 0x5F34, 0x8F88, 0x5F35, 0x8F89, 0x5F36, 0x8F8A, 0x5F37, 0x8F8B, 0x5F38, + 0x8F8C, 0x5F3B, 0x8F8D, 0x5F3D, 0x8F8E, 0x5F3E, 0x8F8F, 0x5F3F, 0x8F90, 0x5F41, 0x8F91, 0x5F42, 0x8F92, 0x5F43, 0x8F93, 0x5F44, + 0x8F94, 0x5F45, 0x8F95, 0x5F46, 0x8F96, 0x5F47, 0x8F97, 0x5F48, 0x8F98, 0x5F49, 0x8F99, 0x5F4A, 0x8F9A, 0x5F4B, 0x8F9B, 0x5F4C, + 0x8F9C, 0x5F4D, 0x8F9D, 0x5F4E, 0x8F9E, 0x5F4F, 0x8F9F, 0x5F51, 0x8FA0, 0x5F54, 0x8FA1, 0x5F59, 0x8FA2, 0x5F5A, 0x8FA3, 0x5F5B, + 0x8FA4, 0x5F5C, 0x8FA5, 0x5F5E, 0x8FA6, 0x5F5F, 0x8FA7, 0x5F60, 0x8FA8, 0x5F63, 0x8FA9, 0x5F65, 0x8FAA, 0x5F67, 0x8FAB, 0x5F68, + 0x8FAC, 0x5F6B, 0x8FAD, 0x5F6E, 0x8FAE, 0x5F6F, 0x8FAF, 0x5F72, 0x8FB0, 0x5F74, 0x8FB1, 0x5F75, 0x8FB2, 0x5F76, 0x8FB3, 0x5F78, + 0x8FB4, 0x5F7A, 0x8FB5, 0x5F7D, 0x8FB6, 0x5F7E, 0x8FB7, 0x5F7F, 0x8FB8, 0x5F83, 0x8FB9, 0x5F86, 0x8FBA, 0x5F8D, 0x8FBB, 0x5F8E, + 0x8FBC, 0x5F8F, 0x8FBD, 0x5F91, 0x8FBE, 0x5F93, 0x8FBF, 0x5F94, 0x8FC0, 0x5F96, 0x8FC1, 0x5F9A, 0x8FC2, 0x5F9B, 0x8FC3, 0x5F9D, + 0x8FC4, 0x5F9E, 0x8FC5, 0x5F9F, 0x8FC6, 0x5FA0, 0x8FC7, 0x5FA2, 0x8FC8, 0x5FA3, 0x8FC9, 0x5FA4, 0x8FCA, 0x5FA5, 0x8FCB, 0x5FA6, + 0x8FCC, 0x5FA7, 0x8FCD, 0x5FA9, 0x8FCE, 0x5FAB, 0x8FCF, 0x5FAC, 0x8FD0, 0x5FAF, 0x8FD1, 0x5FB0, 0x8FD2, 0x5FB1, 0x8FD3, 0x5FB2, + 0x8FD4, 0x5FB3, 0x8FD5, 0x5FB4, 0x8FD6, 0x5FB6, 0x8FD7, 0x5FB8, 0x8FD8, 0x5FB9, 0x8FD9, 0x5FBA, 0x8FDA, 0x5FBB, 0x8FDB, 0x5FBE, + 0x8FDC, 0x5FBF, 0x8FDD, 0x5FC0, 0x8FDE, 0x5FC1, 0x8FDF, 0x5FC2, 0x8FE0, 0x5FC7, 0x8FE1, 0x5FC8, 0x8FE2, 0x5FCA, 0x8FE3, 0x5FCB, + 0x8FE4, 0x5FCE, 0x8FE5, 0x5FD3, 0x8FE6, 0x5FD4, 0x8FE7, 0x5FD5, 0x8FE8, 0x5FDA, 0x8FE9, 0x5FDB, 0x8FEA, 0x5FDC, 0x8FEB, 0x5FDE, + 0x8FEC, 0x5FDF, 0x8FED, 0x5FE2, 0x8FEE, 0x5FE3, 0x8FEF, 0x5FE5, 0x8FF0, 0x5FE6, 0x8FF1, 0x5FE8, 0x8FF2, 0x5FE9, 0x8FF3, 0x5FEC, + 0x8FF4, 0x5FEF, 0x8FF5, 0x5FF0, 0x8FF6, 0x5FF2, 0x8FF7, 0x5FF3, 0x8FF8, 0x5FF4, 0x8FF9, 0x5FF6, 0x8FFA, 0x5FF7, 0x8FFB, 0x5FF9, + 0x8FFC, 0x5FFA, 0x8FFD, 0x5FFC, 0x8FFE, 0x6007, 0x9040, 0x6008, 0x9041, 0x6009, 0x9042, 0x600B, 0x9043, 0x600C, 0x9044, 0x6010, + 0x9045, 0x6011, 0x9046, 0x6013, 0x9047, 0x6017, 0x9048, 0x6018, 0x9049, 0x601A, 0x904A, 0x601E, 0x904B, 0x601F, 0x904C, 0x6022, + 0x904D, 0x6023, 0x904E, 0x6024, 0x904F, 0x602C, 0x9050, 0x602D, 0x9051, 0x602E, 0x9052, 0x6030, 0x9053, 0x6031, 0x9054, 0x6032, + 0x9055, 0x6033, 0x9056, 0x6034, 0x9057, 0x6036, 0x9058, 0x6037, 0x9059, 0x6038, 0x905A, 0x6039, 0x905B, 0x603A, 0x905C, 0x603D, + 0x905D, 0x603E, 0x905E, 0x6040, 0x905F, 0x6044, 0x9060, 0x6045, 0x9061, 0x6046, 0x9062, 0x6047, 0x9063, 0x6048, 0x9064, 0x6049, + 0x9065, 0x604A, 0x9066, 0x604C, 0x9067, 0x604E, 0x9068, 0x604F, 0x9069, 0x6051, 0x906A, 0x6053, 0x906B, 0x6054, 0x906C, 0x6056, + 0x906D, 0x6057, 0x906E, 0x6058, 0x906F, 0x605B, 0x9070, 0x605C, 0x9071, 0x605E, 0x9072, 0x605F, 0x9073, 0x6060, 0x9074, 0x6061, + 0x9075, 0x6065, 0x9076, 0x6066, 0x9077, 0x606E, 0x9078, 0x6071, 0x9079, 0x6072, 0x907A, 0x6074, 0x907B, 0x6075, 0x907C, 0x6077, + 0x907D, 0x607E, 0x907E, 0x6080, 0x9080, 0x6081, 0x9081, 0x6082, 0x9082, 0x6085, 0x9083, 0x6086, 0x9084, 0x6087, 0x9085, 0x6088, + 0x9086, 0x608A, 0x9087, 0x608B, 0x9088, 0x608E, 0x9089, 0x608F, 0x908A, 0x6090, 0x908B, 0x6091, 0x908C, 0x6093, 0x908D, 0x6095, + 0x908E, 0x6097, 0x908F, 0x6098, 0x9090, 0x6099, 0x9091, 0x609C, 0x9092, 0x609E, 0x9093, 0x60A1, 0x9094, 0x60A2, 0x9095, 0x60A4, + 0x9096, 0x60A5, 0x9097, 0x60A7, 0x9098, 0x60A9, 0x9099, 0x60AA, 0x909A, 0x60AE, 0x909B, 0x60B0, 0x909C, 0x60B3, 0x909D, 0x60B5, + 0x909E, 0x60B6, 0x909F, 0x60B7, 0x90A0, 0x60B9, 0x90A1, 0x60BA, 0x90A2, 0x60BD, 0x90A3, 0x60BE, 0x90A4, 0x60BF, 0x90A5, 0x60C0, + 0x90A6, 0x60C1, 0x90A7, 0x60C2, 0x90A8, 0x60C3, 0x90A9, 0x60C4, 0x90AA, 0x60C7, 0x90AB, 0x60C8, 0x90AC, 0x60C9, 0x90AD, 0x60CC, + 0x90AE, 0x60CD, 0x90AF, 0x60CE, 0x90B0, 0x60CF, 0x90B1, 0x60D0, 0x90B2, 0x60D2, 0x90B3, 0x60D3, 0x90B4, 0x60D4, 0x90B5, 0x60D6, + 0x90B6, 0x60D7, 0x90B7, 0x60D9, 0x90B8, 0x60DB, 0x90B9, 0x60DE, 0x90BA, 0x60E1, 0x90BB, 0x60E2, 0x90BC, 0x60E3, 0x90BD, 0x60E4, + 0x90BE, 0x60E5, 0x90BF, 0x60EA, 0x90C0, 0x60F1, 0x90C1, 0x60F2, 0x90C2, 0x60F5, 0x90C3, 0x60F7, 0x90C4, 0x60F8, 0x90C5, 0x60FB, + 0x90C6, 0x60FC, 0x90C7, 0x60FD, 0x90C8, 0x60FE, 0x90C9, 0x60FF, 0x90CA, 0x6102, 0x90CB, 0x6103, 0x90CC, 0x6104, 0x90CD, 0x6105, + 0x90CE, 0x6107, 0x90CF, 0x610A, 0x90D0, 0x610B, 0x90D1, 0x610C, 0x90D2, 0x6110, 0x90D3, 0x6111, 0x90D4, 0x6112, 0x90D5, 0x6113, + 0x90D6, 0x6114, 0x90D7, 0x6116, 0x90D8, 0x6117, 0x90D9, 0x6118, 0x90DA, 0x6119, 0x90DB, 0x611B, 0x90DC, 0x611C, 0x90DD, 0x611D, + 0x90DE, 0x611E, 0x90DF, 0x6121, 0x90E0, 0x6122, 0x90E1, 0x6125, 0x90E2, 0x6128, 0x90E3, 0x6129, 0x90E4, 0x612A, 0x90E5, 0x612C, + 0x90E6, 0x612D, 0x90E7, 0x612E, 0x90E8, 0x612F, 0x90E9, 0x6130, 0x90EA, 0x6131, 0x90EB, 0x6132, 0x90EC, 0x6133, 0x90ED, 0x6134, + 0x90EE, 0x6135, 0x90EF, 0x6136, 0x90F0, 0x6137, 0x90F1, 0x6138, 0x90F2, 0x6139, 0x90F3, 0x613A, 0x90F4, 0x613B, 0x90F5, 0x613C, + 0x90F6, 0x613D, 0x90F7, 0x613E, 0x90F8, 0x6140, 0x90F9, 0x6141, 0x90FA, 0x6142, 0x90FB, 0x6143, 0x90FC, 0x6144, 0x90FD, 0x6145, + 0x90FE, 0x6146, 0x9140, 0x6147, 0x9141, 0x6149, 0x9142, 0x614B, 0x9143, 0x614D, 0x9144, 0x614F, 0x9145, 0x6150, 0x9146, 0x6152, + 0x9147, 0x6153, 0x9148, 0x6154, 0x9149, 0x6156, 0x914A, 0x6157, 0x914B, 0x6158, 0x914C, 0x6159, 0x914D, 0x615A, 0x914E, 0x615B, + 0x914F, 0x615C, 0x9150, 0x615E, 0x9151, 0x615F, 0x9152, 0x6160, 0x9153, 0x6161, 0x9154, 0x6163, 0x9155, 0x6164, 0x9156, 0x6165, + 0x9157, 0x6166, 0x9158, 0x6169, 0x9159, 0x616A, 0x915A, 0x616B, 0x915B, 0x616C, 0x915C, 0x616D, 0x915D, 0x616E, 0x915E, 0x616F, + 0x915F, 0x6171, 0x9160, 0x6172, 0x9161, 0x6173, 0x9162, 0x6174, 0x9163, 0x6176, 0x9164, 0x6178, 0x9165, 0x6179, 0x9166, 0x617A, + 0x9167, 0x617B, 0x9168, 0x617C, 0x9169, 0x617D, 0x916A, 0x617E, 0x916B, 0x617F, 0x916C, 0x6180, 0x916D, 0x6181, 0x916E, 0x6182, + 0x916F, 0x6183, 0x9170, 0x6184, 0x9171, 0x6185, 0x9172, 0x6186, 0x9173, 0x6187, 0x9174, 0x6188, 0x9175, 0x6189, 0x9176, 0x618A, + 0x9177, 0x618C, 0x9178, 0x618D, 0x9179, 0x618F, 0x917A, 0x6190, 0x917B, 0x6191, 0x917C, 0x6192, 0x917D, 0x6193, 0x917E, 0x6195, + 0x9180, 0x6196, 0x9181, 0x6197, 0x9182, 0x6198, 0x9183, 0x6199, 0x9184, 0x619A, 0x9185, 0x619B, 0x9186, 0x619C, 0x9187, 0x619E, + 0x9188, 0x619F, 0x9189, 0x61A0, 0x918A, 0x61A1, 0x918B, 0x61A2, 0x918C, 0x61A3, 0x918D, 0x61A4, 0x918E, 0x61A5, 0x918F, 0x61A6, + 0x9190, 0x61AA, 0x9191, 0x61AB, 0x9192, 0x61AD, 0x9193, 0x61AE, 0x9194, 0x61AF, 0x9195, 0x61B0, 0x9196, 0x61B1, 0x9197, 0x61B2, + 0x9198, 0x61B3, 0x9199, 0x61B4, 0x919A, 0x61B5, 0x919B, 0x61B6, 0x919C, 0x61B8, 0x919D, 0x61B9, 0x919E, 0x61BA, 0x919F, 0x61BB, + 0x91A0, 0x61BC, 0x91A1, 0x61BD, 0x91A2, 0x61BF, 0x91A3, 0x61C0, 0x91A4, 0x61C1, 0x91A5, 0x61C3, 0x91A6, 0x61C4, 0x91A7, 0x61C5, + 0x91A8, 0x61C6, 0x91A9, 0x61C7, 0x91AA, 0x61C9, 0x91AB, 0x61CC, 0x91AC, 0x61CD, 0x91AD, 0x61CE, 0x91AE, 0x61CF, 0x91AF, 0x61D0, + 0x91B0, 0x61D3, 0x91B1, 0x61D5, 0x91B2, 0x61D6, 0x91B3, 0x61D7, 0x91B4, 0x61D8, 0x91B5, 0x61D9, 0x91B6, 0x61DA, 0x91B7, 0x61DB, + 0x91B8, 0x61DC, 0x91B9, 0x61DD, 0x91BA, 0x61DE, 0x91BB, 0x61DF, 0x91BC, 0x61E0, 0x91BD, 0x61E1, 0x91BE, 0x61E2, 0x91BF, 0x61E3, + 0x91C0, 0x61E4, 0x91C1, 0x61E5, 0x91C2, 0x61E7, 0x91C3, 0x61E8, 0x91C4, 0x61E9, 0x91C5, 0x61EA, 0x91C6, 0x61EB, 0x91C7, 0x61EC, + 0x91C8, 0x61ED, 0x91C9, 0x61EE, 0x91CA, 0x61EF, 0x91CB, 0x61F0, 0x91CC, 0x61F1, 0x91CD, 0x61F2, 0x91CE, 0x61F3, 0x91CF, 0x61F4, + 0x91D0, 0x61F6, 0x91D1, 0x61F7, 0x91D2, 0x61F8, 0x91D3, 0x61F9, 0x91D4, 0x61FA, 0x91D5, 0x61FB, 0x91D6, 0x61FC, 0x91D7, 0x61FD, + 0x91D8, 0x61FE, 0x91D9, 0x6200, 0x91DA, 0x6201, 0x91DB, 0x6202, 0x91DC, 0x6203, 0x91DD, 0x6204, 0x91DE, 0x6205, 0x91DF, 0x6207, + 0x91E0, 0x6209, 0x91E1, 0x6213, 0x91E2, 0x6214, 0x91E3, 0x6219, 0x91E4, 0x621C, 0x91E5, 0x621D, 0x91E6, 0x621E, 0x91E7, 0x6220, + 0x91E8, 0x6223, 0x91E9, 0x6226, 0x91EA, 0x6227, 0x91EB, 0x6228, 0x91EC, 0x6229, 0x91ED, 0x622B, 0x91EE, 0x622D, 0x91EF, 0x622F, + 0x91F0, 0x6230, 0x91F1, 0x6231, 0x91F2, 0x6232, 0x91F3, 0x6235, 0x91F4, 0x6236, 0x91F5, 0x6238, 0x91F6, 0x6239, 0x91F7, 0x623A, + 0x91F8, 0x623B, 0x91F9, 0x623C, 0x91FA, 0x6242, 0x91FB, 0x6244, 0x91FC, 0x6245, 0x91FD, 0x6246, 0x91FE, 0x624A, 0x9240, 0x624F, + 0x9241, 0x6250, 0x9242, 0x6255, 0x9243, 0x6256, 0x9244, 0x6257, 0x9245, 0x6259, 0x9246, 0x625A, 0x9247, 0x625C, 0x9248, 0x625D, + 0x9249, 0x625E, 0x924A, 0x625F, 0x924B, 0x6260, 0x924C, 0x6261, 0x924D, 0x6262, 0x924E, 0x6264, 0x924F, 0x6265, 0x9250, 0x6268, + 0x9251, 0x6271, 0x9252, 0x6272, 0x9253, 0x6274, 0x9254, 0x6275, 0x9255, 0x6277, 0x9256, 0x6278, 0x9257, 0x627A, 0x9258, 0x627B, + 0x9259, 0x627D, 0x925A, 0x6281, 0x925B, 0x6282, 0x925C, 0x6283, 0x925D, 0x6285, 0x925E, 0x6286, 0x925F, 0x6287, 0x9260, 0x6288, + 0x9261, 0x628B, 0x9262, 0x628C, 0x9263, 0x628D, 0x9264, 0x628E, 0x9265, 0x628F, 0x9266, 0x6290, 0x9267, 0x6294, 0x9268, 0x6299, + 0x9269, 0x629C, 0x926A, 0x629D, 0x926B, 0x629E, 0x926C, 0x62A3, 0x926D, 0x62A6, 0x926E, 0x62A7, 0x926F, 0x62A9, 0x9270, 0x62AA, + 0x9271, 0x62AD, 0x9272, 0x62AE, 0x9273, 0x62AF, 0x9274, 0x62B0, 0x9275, 0x62B2, 0x9276, 0x62B3, 0x9277, 0x62B4, 0x9278, 0x62B6, + 0x9279, 0x62B7, 0x927A, 0x62B8, 0x927B, 0x62BA, 0x927C, 0x62BE, 0x927D, 0x62C0, 0x927E, 0x62C1, 0x9280, 0x62C3, 0x9281, 0x62CB, + 0x9282, 0x62CF, 0x9283, 0x62D1, 0x9284, 0x62D5, 0x9285, 0x62DD, 0x9286, 0x62DE, 0x9287, 0x62E0, 0x9288, 0x62E1, 0x9289, 0x62E4, + 0x928A, 0x62EA, 0x928B, 0x62EB, 0x928C, 0x62F0, 0x928D, 0x62F2, 0x928E, 0x62F5, 0x928F, 0x62F8, 0x9290, 0x62F9, 0x9291, 0x62FA, + 0x9292, 0x62FB, 0x9293, 0x6300, 0x9294, 0x6303, 0x9295, 0x6304, 0x9296, 0x6305, 0x9297, 0x6306, 0x9298, 0x630A, 0x9299, 0x630B, + 0x929A, 0x630C, 0x929B, 0x630D, 0x929C, 0x630F, 0x929D, 0x6310, 0x929E, 0x6312, 0x929F, 0x6313, 0x92A0, 0x6314, 0x92A1, 0x6315, + 0x92A2, 0x6317, 0x92A3, 0x6318, 0x92A4, 0x6319, 0x92A5, 0x631C, 0x92A6, 0x6326, 0x92A7, 0x6327, 0x92A8, 0x6329, 0x92A9, 0x632C, + 0x92AA, 0x632D, 0x92AB, 0x632E, 0x92AC, 0x6330, 0x92AD, 0x6331, 0x92AE, 0x6333, 0x92AF, 0x6334, 0x92B0, 0x6335, 0x92B1, 0x6336, + 0x92B2, 0x6337, 0x92B3, 0x6338, 0x92B4, 0x633B, 0x92B5, 0x633C, 0x92B6, 0x633E, 0x92B7, 0x633F, 0x92B8, 0x6340, 0x92B9, 0x6341, + 0x92BA, 0x6344, 0x92BB, 0x6347, 0x92BC, 0x6348, 0x92BD, 0x634A, 0x92BE, 0x6351, 0x92BF, 0x6352, 0x92C0, 0x6353, 0x92C1, 0x6354, + 0x92C2, 0x6356, 0x92C3, 0x6357, 0x92C4, 0x6358, 0x92C5, 0x6359, 0x92C6, 0x635A, 0x92C7, 0x635B, 0x92C8, 0x635C, 0x92C9, 0x635D, + 0x92CA, 0x6360, 0x92CB, 0x6364, 0x92CC, 0x6365, 0x92CD, 0x6366, 0x92CE, 0x6368, 0x92CF, 0x636A, 0x92D0, 0x636B, 0x92D1, 0x636C, + 0x92D2, 0x636F, 0x92D3, 0x6370, 0x92D4, 0x6372, 0x92D5, 0x6373, 0x92D6, 0x6374, 0x92D7, 0x6375, 0x92D8, 0x6378, 0x92D9, 0x6379, + 0x92DA, 0x637C, 0x92DB, 0x637D, 0x92DC, 0x637E, 0x92DD, 0x637F, 0x92DE, 0x6381, 0x92DF, 0x6383, 0x92E0, 0x6384, 0x92E1, 0x6385, + 0x92E2, 0x6386, 0x92E3, 0x638B, 0x92E4, 0x638D, 0x92E5, 0x6391, 0x92E6, 0x6393, 0x92E7, 0x6394, 0x92E8, 0x6395, 0x92E9, 0x6397, + 0x92EA, 0x6399, 0x92EB, 0x639A, 0x92EC, 0x639B, 0x92ED, 0x639C, 0x92EE, 0x639D, 0x92EF, 0x639E, 0x92F0, 0x639F, 0x92F1, 0x63A1, + 0x92F2, 0x63A4, 0x92F3, 0x63A6, 0x92F4, 0x63AB, 0x92F5, 0x63AF, 0x92F6, 0x63B1, 0x92F7, 0x63B2, 0x92F8, 0x63B5, 0x92F9, 0x63B6, + 0x92FA, 0x63B9, 0x92FB, 0x63BB, 0x92FC, 0x63BD, 0x92FD, 0x63BF, 0x92FE, 0x63C0, 0x9340, 0x63C1, 0x9341, 0x63C2, 0x9342, 0x63C3, + 0x9343, 0x63C5, 0x9344, 0x63C7, 0x9345, 0x63C8, 0x9346, 0x63CA, 0x9347, 0x63CB, 0x9348, 0x63CC, 0x9349, 0x63D1, 0x934A, 0x63D3, + 0x934B, 0x63D4, 0x934C, 0x63D5, 0x934D, 0x63D7, 0x934E, 0x63D8, 0x934F, 0x63D9, 0x9350, 0x63DA, 0x9351, 0x63DB, 0x9352, 0x63DC, + 0x9353, 0x63DD, 0x9354, 0x63DF, 0x9355, 0x63E2, 0x9356, 0x63E4, 0x9357, 0x63E5, 0x9358, 0x63E6, 0x9359, 0x63E7, 0x935A, 0x63E8, + 0x935B, 0x63EB, 0x935C, 0x63EC, 0x935D, 0x63EE, 0x935E, 0x63EF, 0x935F, 0x63F0, 0x9360, 0x63F1, 0x9361, 0x63F3, 0x9362, 0x63F5, + 0x9363, 0x63F7, 0x9364, 0x63F9, 0x9365, 0x63FA, 0x9366, 0x63FB, 0x9367, 0x63FC, 0x9368, 0x63FE, 0x9369, 0x6403, 0x936A, 0x6404, + 0x936B, 0x6406, 0x936C, 0x6407, 0x936D, 0x6408, 0x936E, 0x6409, 0x936F, 0x640A, 0x9370, 0x640D, 0x9371, 0x640E, 0x9372, 0x6411, + 0x9373, 0x6412, 0x9374, 0x6415, 0x9375, 0x6416, 0x9376, 0x6417, 0x9377, 0x6418, 0x9378, 0x6419, 0x9379, 0x641A, 0x937A, 0x641D, + 0x937B, 0x641F, 0x937C, 0x6422, 0x937D, 0x6423, 0x937E, 0x6424, 0x9380, 0x6425, 0x9381, 0x6427, 0x9382, 0x6428, 0x9383, 0x6429, + 0x9384, 0x642B, 0x9385, 0x642E, 0x9386, 0x642F, 0x9387, 0x6430, 0x9388, 0x6431, 0x9389, 0x6432, 0x938A, 0x6433, 0x938B, 0x6435, + 0x938C, 0x6436, 0x938D, 0x6437, 0x938E, 0x6438, 0x938F, 0x6439, 0x9390, 0x643B, 0x9391, 0x643C, 0x9392, 0x643E, 0x9393, 0x6440, + 0x9394, 0x6442, 0x9395, 0x6443, 0x9396, 0x6449, 0x9397, 0x644B, 0x9398, 0x644C, 0x9399, 0x644D, 0x939A, 0x644E, 0x939B, 0x644F, + 0x939C, 0x6450, 0x939D, 0x6451, 0x939E, 0x6453, 0x939F, 0x6455, 0x93A0, 0x6456, 0x93A1, 0x6457, 0x93A2, 0x6459, 0x93A3, 0x645A, + 0x93A4, 0x645B, 0x93A5, 0x645C, 0x93A6, 0x645D, 0x93A7, 0x645F, 0x93A8, 0x6460, 0x93A9, 0x6461, 0x93AA, 0x6462, 0x93AB, 0x6463, + 0x93AC, 0x6464, 0x93AD, 0x6465, 0x93AE, 0x6466, 0x93AF, 0x6468, 0x93B0, 0x646A, 0x93B1, 0x646B, 0x93B2, 0x646C, 0x93B3, 0x646E, + 0x93B4, 0x646F, 0x93B5, 0x6470, 0x93B6, 0x6471, 0x93B7, 0x6472, 0x93B8, 0x6473, 0x93B9, 0x6474, 0x93BA, 0x6475, 0x93BB, 0x6476, + 0x93BC, 0x6477, 0x93BD, 0x647B, 0x93BE, 0x647C, 0x93BF, 0x647D, 0x93C0, 0x647E, 0x93C1, 0x647F, 0x93C2, 0x6480, 0x93C3, 0x6481, + 0x93C4, 0x6483, 0x93C5, 0x6486, 0x93C6, 0x6488, 0x93C7, 0x6489, 0x93C8, 0x648A, 0x93C9, 0x648B, 0x93CA, 0x648C, 0x93CB, 0x648D, + 0x93CC, 0x648E, 0x93CD, 0x648F, 0x93CE, 0x6490, 0x93CF, 0x6493, 0x93D0, 0x6494, 0x93D1, 0x6497, 0x93D2, 0x6498, 0x93D3, 0x649A, + 0x93D4, 0x649B, 0x93D5, 0x649C, 0x93D6, 0x649D, 0x93D7, 0x649F, 0x93D8, 0x64A0, 0x93D9, 0x64A1, 0x93DA, 0x64A2, 0x93DB, 0x64A3, + 0x93DC, 0x64A5, 0x93DD, 0x64A6, 0x93DE, 0x64A7, 0x93DF, 0x64A8, 0x93E0, 0x64AA, 0x93E1, 0x64AB, 0x93E2, 0x64AF, 0x93E3, 0x64B1, + 0x93E4, 0x64B2, 0x93E5, 0x64B3, 0x93E6, 0x64B4, 0x93E7, 0x64B6, 0x93E8, 0x64B9, 0x93E9, 0x64BB, 0x93EA, 0x64BD, 0x93EB, 0x64BE, + 0x93EC, 0x64BF, 0x93ED, 0x64C1, 0x93EE, 0x64C3, 0x93EF, 0x64C4, 0x93F0, 0x64C6, 0x93F1, 0x64C7, 0x93F2, 0x64C8, 0x93F3, 0x64C9, + 0x93F4, 0x64CA, 0x93F5, 0x64CB, 0x93F6, 0x64CC, 0x93F7, 0x64CF, 0x93F8, 0x64D1, 0x93F9, 0x64D3, 0x93FA, 0x64D4, 0x93FB, 0x64D5, + 0x93FC, 0x64D6, 0x93FD, 0x64D9, 0x93FE, 0x64DA, 0x9440, 0x64DB, 0x9441, 0x64DC, 0x9442, 0x64DD, 0x9443, 0x64DF, 0x9444, 0x64E0, + 0x9445, 0x64E1, 0x9446, 0x64E3, 0x9447, 0x64E5, 0x9448, 0x64E7, 0x9449, 0x64E8, 0x944A, 0x64E9, 0x944B, 0x64EA, 0x944C, 0x64EB, + 0x944D, 0x64EC, 0x944E, 0x64ED, 0x944F, 0x64EE, 0x9450, 0x64EF, 0x9451, 0x64F0, 0x9452, 0x64F1, 0x9453, 0x64F2, 0x9454, 0x64F3, + 0x9455, 0x64F4, 0x9456, 0x64F5, 0x9457, 0x64F6, 0x9458, 0x64F7, 0x9459, 0x64F8, 0x945A, 0x64F9, 0x945B, 0x64FA, 0x945C, 0x64FB, + 0x945D, 0x64FC, 0x945E, 0x64FD, 0x945F, 0x64FE, 0x9460, 0x64FF, 0x9461, 0x6501, 0x9462, 0x6502, 0x9463, 0x6503, 0x9464, 0x6504, + 0x9465, 0x6505, 0x9466, 0x6506, 0x9467, 0x6507, 0x9468, 0x6508, 0x9469, 0x650A, 0x946A, 0x650B, 0x946B, 0x650C, 0x946C, 0x650D, + 0x946D, 0x650E, 0x946E, 0x650F, 0x946F, 0x6510, 0x9470, 0x6511, 0x9471, 0x6513, 0x9472, 0x6514, 0x9473, 0x6515, 0x9474, 0x6516, + 0x9475, 0x6517, 0x9476, 0x6519, 0x9477, 0x651A, 0x9478, 0x651B, 0x9479, 0x651C, 0x947A, 0x651D, 0x947B, 0x651E, 0x947C, 0x651F, + 0x947D, 0x6520, 0x947E, 0x6521, 0x9480, 0x6522, 0x9481, 0x6523, 0x9482, 0x6524, 0x9483, 0x6526, 0x9484, 0x6527, 0x9485, 0x6528, + 0x9486, 0x6529, 0x9487, 0x652A, 0x9488, 0x652C, 0x9489, 0x652D, 0x948A, 0x6530, 0x948B, 0x6531, 0x948C, 0x6532, 0x948D, 0x6533, + 0x948E, 0x6537, 0x948F, 0x653A, 0x9490, 0x653C, 0x9491, 0x653D, 0x9492, 0x6540, 0x9493, 0x6541, 0x9494, 0x6542, 0x9495, 0x6543, + 0x9496, 0x6544, 0x9497, 0x6546, 0x9498, 0x6547, 0x9499, 0x654A, 0x949A, 0x654B, 0x949B, 0x654D, 0x949C, 0x654E, 0x949D, 0x6550, + 0x949E, 0x6552, 0x949F, 0x6553, 0x94A0, 0x6554, 0x94A1, 0x6557, 0x94A2, 0x6558, 0x94A3, 0x655A, 0x94A4, 0x655C, 0x94A5, 0x655F, + 0x94A6, 0x6560, 0x94A7, 0x6561, 0x94A8, 0x6564, 0x94A9, 0x6565, 0x94AA, 0x6567, 0x94AB, 0x6568, 0x94AC, 0x6569, 0x94AD, 0x656A, + 0x94AE, 0x656D, 0x94AF, 0x656E, 0x94B0, 0x656F, 0x94B1, 0x6571, 0x94B2, 0x6573, 0x94B3, 0x6575, 0x94B4, 0x6576, 0x94B5, 0x6578, + 0x94B6, 0x6579, 0x94B7, 0x657A, 0x94B8, 0x657B, 0x94B9, 0x657C, 0x94BA, 0x657D, 0x94BB, 0x657E, 0x94BC, 0x657F, 0x94BD, 0x6580, + 0x94BE, 0x6581, 0x94BF, 0x6582, 0x94C0, 0x6583, 0x94C1, 0x6584, 0x94C2, 0x6585, 0x94C3, 0x6586, 0x94C4, 0x6588, 0x94C5, 0x6589, + 0x94C6, 0x658A, 0x94C7, 0x658D, 0x94C8, 0x658E, 0x94C9, 0x658F, 0x94CA, 0x6592, 0x94CB, 0x6594, 0x94CC, 0x6595, 0x94CD, 0x6596, + 0x94CE, 0x6598, 0x94CF, 0x659A, 0x94D0, 0x659D, 0x94D1, 0x659E, 0x94D2, 0x65A0, 0x94D3, 0x65A2, 0x94D4, 0x65A3, 0x94D5, 0x65A6, + 0x94D6, 0x65A8, 0x94D7, 0x65AA, 0x94D8, 0x65AC, 0x94D9, 0x65AE, 0x94DA, 0x65B1, 0x94DB, 0x65B2, 0x94DC, 0x65B3, 0x94DD, 0x65B4, + 0x94DE, 0x65B5, 0x94DF, 0x65B6, 0x94E0, 0x65B7, 0x94E1, 0x65B8, 0x94E2, 0x65BA, 0x94E3, 0x65BB, 0x94E4, 0x65BE, 0x94E5, 0x65BF, + 0x94E6, 0x65C0, 0x94E7, 0x65C2, 0x94E8, 0x65C7, 0x94E9, 0x65C8, 0x94EA, 0x65C9, 0x94EB, 0x65CA, 0x94EC, 0x65CD, 0x94ED, 0x65D0, + 0x94EE, 0x65D1, 0x94EF, 0x65D3, 0x94F0, 0x65D4, 0x94F1, 0x65D5, 0x94F2, 0x65D8, 0x94F3, 0x65D9, 0x94F4, 0x65DA, 0x94F5, 0x65DB, + 0x94F6, 0x65DC, 0x94F7, 0x65DD, 0x94F8, 0x65DE, 0x94F9, 0x65DF, 0x94FA, 0x65E1, 0x94FB, 0x65E3, 0x94FC, 0x65E4, 0x94FD, 0x65EA, + 0x94FE, 0x65EB, 0x9540, 0x65F2, 0x9541, 0x65F3, 0x9542, 0x65F4, 0x9543, 0x65F5, 0x9544, 0x65F8, 0x9545, 0x65F9, 0x9546, 0x65FB, + 0x9547, 0x65FC, 0x9548, 0x65FD, 0x9549, 0x65FE, 0x954A, 0x65FF, 0x954B, 0x6601, 0x954C, 0x6604, 0x954D, 0x6605, 0x954E, 0x6607, + 0x954F, 0x6608, 0x9550, 0x6609, 0x9551, 0x660B, 0x9552, 0x660D, 0x9553, 0x6610, 0x9554, 0x6611, 0x9555, 0x6612, 0x9556, 0x6616, + 0x9557, 0x6617, 0x9558, 0x6618, 0x9559, 0x661A, 0x955A, 0x661B, 0x955B, 0x661C, 0x955C, 0x661E, 0x955D, 0x6621, 0x955E, 0x6622, + 0x955F, 0x6623, 0x9560, 0x6624, 0x9561, 0x6626, 0x9562, 0x6629, 0x9563, 0x662A, 0x9564, 0x662B, 0x9565, 0x662C, 0x9566, 0x662E, + 0x9567, 0x6630, 0x9568, 0x6632, 0x9569, 0x6633, 0x956A, 0x6637, 0x956B, 0x6638, 0x956C, 0x6639, 0x956D, 0x663A, 0x956E, 0x663B, + 0x956F, 0x663D, 0x9570, 0x663F, 0x9571, 0x6640, 0x9572, 0x6642, 0x9573, 0x6644, 0x9574, 0x6645, 0x9575, 0x6646, 0x9576, 0x6647, + 0x9577, 0x6648, 0x9578, 0x6649, 0x9579, 0x664A, 0x957A, 0x664D, 0x957B, 0x664E, 0x957C, 0x6650, 0x957D, 0x6651, 0x957E, 0x6658, + 0x9580, 0x6659, 0x9581, 0x665B, 0x9582, 0x665C, 0x9583, 0x665D, 0x9584, 0x665E, 0x9585, 0x6660, 0x9586, 0x6662, 0x9587, 0x6663, + 0x9588, 0x6665, 0x9589, 0x6667, 0x958A, 0x6669, 0x958B, 0x666A, 0x958C, 0x666B, 0x958D, 0x666C, 0x958E, 0x666D, 0x958F, 0x6671, + 0x9590, 0x6672, 0x9591, 0x6673, 0x9592, 0x6675, 0x9593, 0x6678, 0x9594, 0x6679, 0x9595, 0x667B, 0x9596, 0x667C, 0x9597, 0x667D, + 0x9598, 0x667F, 0x9599, 0x6680, 0x959A, 0x6681, 0x959B, 0x6683, 0x959C, 0x6685, 0x959D, 0x6686, 0x959E, 0x6688, 0x959F, 0x6689, + 0x95A0, 0x668A, 0x95A1, 0x668B, 0x95A2, 0x668D, 0x95A3, 0x668E, 0x95A4, 0x668F, 0x95A5, 0x6690, 0x95A6, 0x6692, 0x95A7, 0x6693, + 0x95A8, 0x6694, 0x95A9, 0x6695, 0x95AA, 0x6698, 0x95AB, 0x6699, 0x95AC, 0x669A, 0x95AD, 0x669B, 0x95AE, 0x669C, 0x95AF, 0x669E, + 0x95B0, 0x669F, 0x95B1, 0x66A0, 0x95B2, 0x66A1, 0x95B3, 0x66A2, 0x95B4, 0x66A3, 0x95B5, 0x66A4, 0x95B6, 0x66A5, 0x95B7, 0x66A6, + 0x95B8, 0x66A9, 0x95B9, 0x66AA, 0x95BA, 0x66AB, 0x95BB, 0x66AC, 0x95BC, 0x66AD, 0x95BD, 0x66AF, 0x95BE, 0x66B0, 0x95BF, 0x66B1, + 0x95C0, 0x66B2, 0x95C1, 0x66B3, 0x95C2, 0x66B5, 0x95C3, 0x66B6, 0x95C4, 0x66B7, 0x95C5, 0x66B8, 0x95C6, 0x66BA, 0x95C7, 0x66BB, + 0x95C8, 0x66BC, 0x95C9, 0x66BD, 0x95CA, 0x66BF, 0x95CB, 0x66C0, 0x95CC, 0x66C1, 0x95CD, 0x66C2, 0x95CE, 0x66C3, 0x95CF, 0x66C4, + 0x95D0, 0x66C5, 0x95D1, 0x66C6, 0x95D2, 0x66C7, 0x95D3, 0x66C8, 0x95D4, 0x66C9, 0x95D5, 0x66CA, 0x95D6, 0x66CB, 0x95D7, 0x66CC, + 0x95D8, 0x66CD, 0x95D9, 0x66CE, 0x95DA, 0x66CF, 0x95DB, 0x66D0, 0x95DC, 0x66D1, 0x95DD, 0x66D2, 0x95DE, 0x66D3, 0x95DF, 0x66D4, + 0x95E0, 0x66D5, 0x95E1, 0x66D6, 0x95E2, 0x66D7, 0x95E3, 0x66D8, 0x95E4, 0x66DA, 0x95E5, 0x66DE, 0x95E6, 0x66DF, 0x95E7, 0x66E0, + 0x95E8, 0x66E1, 0x95E9, 0x66E2, 0x95EA, 0x66E3, 0x95EB, 0x66E4, 0x95EC, 0x66E5, 0x95ED, 0x66E7, 0x95EE, 0x66E8, 0x95EF, 0x66EA, + 0x95F0, 0x66EB, 0x95F1, 0x66EC, 0x95F2, 0x66ED, 0x95F3, 0x66EE, 0x95F4, 0x66EF, 0x95F5, 0x66F1, 0x95F6, 0x66F5, 0x95F7, 0x66F6, + 0x95F8, 0x66F8, 0x95F9, 0x66FA, 0x95FA, 0x66FB, 0x95FB, 0x66FD, 0x95FC, 0x6701, 0x95FD, 0x6702, 0x95FE, 0x6703, 0x9640, 0x6704, + 0x9641, 0x6705, 0x9642, 0x6706, 0x9643, 0x6707, 0x9644, 0x670C, 0x9645, 0x670E, 0x9646, 0x670F, 0x9647, 0x6711, 0x9648, 0x6712, + 0x9649, 0x6713, 0x964A, 0x6716, 0x964B, 0x6718, 0x964C, 0x6719, 0x964D, 0x671A, 0x964E, 0x671C, 0x964F, 0x671E, 0x9650, 0x6720, + 0x9651, 0x6721, 0x9652, 0x6722, 0x9653, 0x6723, 0x9654, 0x6724, 0x9655, 0x6725, 0x9656, 0x6727, 0x9657, 0x6729, 0x9658, 0x672E, + 0x9659, 0x6730, 0x965A, 0x6732, 0x965B, 0x6733, 0x965C, 0x6736, 0x965D, 0x6737, 0x965E, 0x6738, 0x965F, 0x6739, 0x9660, 0x673B, + 0x9661, 0x673C, 0x9662, 0x673E, 0x9663, 0x673F, 0x9664, 0x6741, 0x9665, 0x6744, 0x9666, 0x6745, 0x9667, 0x6747, 0x9668, 0x674A, + 0x9669, 0x674B, 0x966A, 0x674D, 0x966B, 0x6752, 0x966C, 0x6754, 0x966D, 0x6755, 0x966E, 0x6757, 0x966F, 0x6758, 0x9670, 0x6759, + 0x9671, 0x675A, 0x9672, 0x675B, 0x9673, 0x675D, 0x9674, 0x6762, 0x9675, 0x6763, 0x9676, 0x6764, 0x9677, 0x6766, 0x9678, 0x6767, + 0x9679, 0x676B, 0x967A, 0x676C, 0x967B, 0x676E, 0x967C, 0x6771, 0x967D, 0x6774, 0x967E, 0x6776, 0x9680, 0x6778, 0x9681, 0x6779, + 0x9682, 0x677A, 0x9683, 0x677B, 0x9684, 0x677D, 0x9685, 0x6780, 0x9686, 0x6782, 0x9687, 0x6783, 0x9688, 0x6785, 0x9689, 0x6786, + 0x968A, 0x6788, 0x968B, 0x678A, 0x968C, 0x678C, 0x968D, 0x678D, 0x968E, 0x678E, 0x968F, 0x678F, 0x9690, 0x6791, 0x9691, 0x6792, + 0x9692, 0x6793, 0x9693, 0x6794, 0x9694, 0x6796, 0x9695, 0x6799, 0x9696, 0x679B, 0x9697, 0x679F, 0x9698, 0x67A0, 0x9699, 0x67A1, + 0x969A, 0x67A4, 0x969B, 0x67A6, 0x969C, 0x67A9, 0x969D, 0x67AC, 0x969E, 0x67AE, 0x969F, 0x67B1, 0x96A0, 0x67B2, 0x96A1, 0x67B4, + 0x96A2, 0x67B9, 0x96A3, 0x67BA, 0x96A4, 0x67BB, 0x96A5, 0x67BC, 0x96A6, 0x67BD, 0x96A7, 0x67BE, 0x96A8, 0x67BF, 0x96A9, 0x67C0, + 0x96AA, 0x67C2, 0x96AB, 0x67C5, 0x96AC, 0x67C6, 0x96AD, 0x67C7, 0x96AE, 0x67C8, 0x96AF, 0x67C9, 0x96B0, 0x67CA, 0x96B1, 0x67CB, + 0x96B2, 0x67CC, 0x96B3, 0x67CD, 0x96B4, 0x67CE, 0x96B5, 0x67D5, 0x96B6, 0x67D6, 0x96B7, 0x67D7, 0x96B8, 0x67DB, 0x96B9, 0x67DF, + 0x96BA, 0x67E1, 0x96BB, 0x67E3, 0x96BC, 0x67E4, 0x96BD, 0x67E6, 0x96BE, 0x67E7, 0x96BF, 0x67E8, 0x96C0, 0x67EA, 0x96C1, 0x67EB, + 0x96C2, 0x67ED, 0x96C3, 0x67EE, 0x96C4, 0x67F2, 0x96C5, 0x67F5, 0x96C6, 0x67F6, 0x96C7, 0x67F7, 0x96C8, 0x67F8, 0x96C9, 0x67F9, + 0x96CA, 0x67FA, 0x96CB, 0x67FB, 0x96CC, 0x67FC, 0x96CD, 0x67FE, 0x96CE, 0x6801, 0x96CF, 0x6802, 0x96D0, 0x6803, 0x96D1, 0x6804, + 0x96D2, 0x6806, 0x96D3, 0x680D, 0x96D4, 0x6810, 0x96D5, 0x6812, 0x96D6, 0x6814, 0x96D7, 0x6815, 0x96D8, 0x6818, 0x96D9, 0x6819, + 0x96DA, 0x681A, 0x96DB, 0x681B, 0x96DC, 0x681C, 0x96DD, 0x681E, 0x96DE, 0x681F, 0x96DF, 0x6820, 0x96E0, 0x6822, 0x96E1, 0x6823, + 0x96E2, 0x6824, 0x96E3, 0x6825, 0x96E4, 0x6826, 0x96E5, 0x6827, 0x96E6, 0x6828, 0x96E7, 0x682B, 0x96E8, 0x682C, 0x96E9, 0x682D, + 0x96EA, 0x682E, 0x96EB, 0x682F, 0x96EC, 0x6830, 0x96ED, 0x6831, 0x96EE, 0x6834, 0x96EF, 0x6835, 0x96F0, 0x6836, 0x96F1, 0x683A, + 0x96F2, 0x683B, 0x96F3, 0x683F, 0x96F4, 0x6847, 0x96F5, 0x684B, 0x96F6, 0x684D, 0x96F7, 0x684F, 0x96F8, 0x6852, 0x96F9, 0x6856, + 0x96FA, 0x6857, 0x96FB, 0x6858, 0x96FC, 0x6859, 0x96FD, 0x685A, 0x96FE, 0x685B, 0x9740, 0x685C, 0x9741, 0x685D, 0x9742, 0x685E, + 0x9743, 0x685F, 0x9744, 0x686A, 0x9745, 0x686C, 0x9746, 0x686D, 0x9747, 0x686E, 0x9748, 0x686F, 0x9749, 0x6870, 0x974A, 0x6871, + 0x974B, 0x6872, 0x974C, 0x6873, 0x974D, 0x6875, 0x974E, 0x6878, 0x974F, 0x6879, 0x9750, 0x687A, 0x9751, 0x687B, 0x9752, 0x687C, + 0x9753, 0x687D, 0x9754, 0x687E, 0x9755, 0x687F, 0x9756, 0x6880, 0x9757, 0x6882, 0x9758, 0x6884, 0x9759, 0x6887, 0x975A, 0x6888, + 0x975B, 0x6889, 0x975C, 0x688A, 0x975D, 0x688B, 0x975E, 0x688C, 0x975F, 0x688D, 0x9760, 0x688E, 0x9761, 0x6890, 0x9762, 0x6891, + 0x9763, 0x6892, 0x9764, 0x6894, 0x9765, 0x6895, 0x9766, 0x6896, 0x9767, 0x6898, 0x9768, 0x6899, 0x9769, 0x689A, 0x976A, 0x689B, + 0x976B, 0x689C, 0x976C, 0x689D, 0x976D, 0x689E, 0x976E, 0x689F, 0x976F, 0x68A0, 0x9770, 0x68A1, 0x9771, 0x68A3, 0x9772, 0x68A4, + 0x9773, 0x68A5, 0x9774, 0x68A9, 0x9775, 0x68AA, 0x9776, 0x68AB, 0x9777, 0x68AC, 0x9778, 0x68AE, 0x9779, 0x68B1, 0x977A, 0x68B2, + 0x977B, 0x68B4, 0x977C, 0x68B6, 0x977D, 0x68B7, 0x977E, 0x68B8, 0x9780, 0x68B9, 0x9781, 0x68BA, 0x9782, 0x68BB, 0x9783, 0x68BC, + 0x9784, 0x68BD, 0x9785, 0x68BE, 0x9786, 0x68BF, 0x9787, 0x68C1, 0x9788, 0x68C3, 0x9789, 0x68C4, 0x978A, 0x68C5, 0x978B, 0x68C6, + 0x978C, 0x68C7, 0x978D, 0x68C8, 0x978E, 0x68CA, 0x978F, 0x68CC, 0x9790, 0x68CE, 0x9791, 0x68CF, 0x9792, 0x68D0, 0x9793, 0x68D1, + 0x9794, 0x68D3, 0x9795, 0x68D4, 0x9796, 0x68D6, 0x9797, 0x68D7, 0x9798, 0x68D9, 0x9799, 0x68DB, 0x979A, 0x68DC, 0x979B, 0x68DD, + 0x979C, 0x68DE, 0x979D, 0x68DF, 0x979E, 0x68E1, 0x979F, 0x68E2, 0x97A0, 0x68E4, 0x97A1, 0x68E5, 0x97A2, 0x68E6, 0x97A3, 0x68E7, + 0x97A4, 0x68E8, 0x97A5, 0x68E9, 0x97A6, 0x68EA, 0x97A7, 0x68EB, 0x97A8, 0x68EC, 0x97A9, 0x68ED, 0x97AA, 0x68EF, 0x97AB, 0x68F2, + 0x97AC, 0x68F3, 0x97AD, 0x68F4, 0x97AE, 0x68F6, 0x97AF, 0x68F7, 0x97B0, 0x68F8, 0x97B1, 0x68FB, 0x97B2, 0x68FD, 0x97B3, 0x68FE, + 0x97B4, 0x68FF, 0x97B5, 0x6900, 0x97B6, 0x6902, 0x97B7, 0x6903, 0x97B8, 0x6904, 0x97B9, 0x6906, 0x97BA, 0x6907, 0x97BB, 0x6908, + 0x97BC, 0x6909, 0x97BD, 0x690A, 0x97BE, 0x690C, 0x97BF, 0x690F, 0x97C0, 0x6911, 0x97C1, 0x6913, 0x97C2, 0x6914, 0x97C3, 0x6915, + 0x97C4, 0x6916, 0x97C5, 0x6917, 0x97C6, 0x6918, 0x97C7, 0x6919, 0x97C8, 0x691A, 0x97C9, 0x691B, 0x97CA, 0x691C, 0x97CB, 0x691D, + 0x97CC, 0x691E, 0x97CD, 0x6921, 0x97CE, 0x6922, 0x97CF, 0x6923, 0x97D0, 0x6925, 0x97D1, 0x6926, 0x97D2, 0x6927, 0x97D3, 0x6928, + 0x97D4, 0x6929, 0x97D5, 0x692A, 0x97D6, 0x692B, 0x97D7, 0x692C, 0x97D8, 0x692E, 0x97D9, 0x692F, 0x97DA, 0x6931, 0x97DB, 0x6932, + 0x97DC, 0x6933, 0x97DD, 0x6935, 0x97DE, 0x6936, 0x97DF, 0x6937, 0x97E0, 0x6938, 0x97E1, 0x693A, 0x97E2, 0x693B, 0x97E3, 0x693C, + 0x97E4, 0x693E, 0x97E5, 0x6940, 0x97E6, 0x6941, 0x97E7, 0x6943, 0x97E8, 0x6944, 0x97E9, 0x6945, 0x97EA, 0x6946, 0x97EB, 0x6947, + 0x97EC, 0x6948, 0x97ED, 0x6949, 0x97EE, 0x694A, 0x97EF, 0x694B, 0x97F0, 0x694C, 0x97F1, 0x694D, 0x97F2, 0x694E, 0x97F3, 0x694F, + 0x97F4, 0x6950, 0x97F5, 0x6951, 0x97F6, 0x6952, 0x97F7, 0x6953, 0x97F8, 0x6955, 0x97F9, 0x6956, 0x97FA, 0x6958, 0x97FB, 0x6959, + 0x97FC, 0x695B, 0x97FD, 0x695C, 0x97FE, 0x695F, 0x9840, 0x6961, 0x9841, 0x6962, 0x9842, 0x6964, 0x9843, 0x6965, 0x9844, 0x6967, + 0x9845, 0x6968, 0x9846, 0x6969, 0x9847, 0x696A, 0x9848, 0x696C, 0x9849, 0x696D, 0x984A, 0x696F, 0x984B, 0x6970, 0x984C, 0x6972, + 0x984D, 0x6973, 0x984E, 0x6974, 0x984F, 0x6975, 0x9850, 0x6976, 0x9851, 0x697A, 0x9852, 0x697B, 0x9853, 0x697D, 0x9854, 0x697E, + 0x9855, 0x697F, 0x9856, 0x6981, 0x9857, 0x6983, 0x9858, 0x6985, 0x9859, 0x698A, 0x985A, 0x698B, 0x985B, 0x698C, 0x985C, 0x698E, + 0x985D, 0x698F, 0x985E, 0x6990, 0x985F, 0x6991, 0x9860, 0x6992, 0x9861, 0x6993, 0x9862, 0x6996, 0x9863, 0x6997, 0x9864, 0x6999, + 0x9865, 0x699A, 0x9866, 0x699D, 0x9867, 0x699E, 0x9868, 0x699F, 0x9869, 0x69A0, 0x986A, 0x69A1, 0x986B, 0x69A2, 0x986C, 0x69A3, + 0x986D, 0x69A4, 0x986E, 0x69A5, 0x986F, 0x69A6, 0x9870, 0x69A9, 0x9871, 0x69AA, 0x9872, 0x69AC, 0x9873, 0x69AE, 0x9874, 0x69AF, + 0x9875, 0x69B0, 0x9876, 0x69B2, 0x9877, 0x69B3, 0x9878, 0x69B5, 0x9879, 0x69B6, 0x987A, 0x69B8, 0x987B, 0x69B9, 0x987C, 0x69BA, + 0x987D, 0x69BC, 0x987E, 0x69BD, 0x9880, 0x69BE, 0x9881, 0x69BF, 0x9882, 0x69C0, 0x9883, 0x69C2, 0x9884, 0x69C3, 0x9885, 0x69C4, + 0x9886, 0x69C5, 0x9887, 0x69C6, 0x9888, 0x69C7, 0x9889, 0x69C8, 0x988A, 0x69C9, 0x988B, 0x69CB, 0x988C, 0x69CD, 0x988D, 0x69CF, + 0x988E, 0x69D1, 0x988F, 0x69D2, 0x9890, 0x69D3, 0x9891, 0x69D5, 0x9892, 0x69D6, 0x9893, 0x69D7, 0x9894, 0x69D8, 0x9895, 0x69D9, + 0x9896, 0x69DA, 0x9897, 0x69DC, 0x9898, 0x69DD, 0x9899, 0x69DE, 0x989A, 0x69E1, 0x989B, 0x69E2, 0x989C, 0x69E3, 0x989D, 0x69E4, + 0x989E, 0x69E5, 0x989F, 0x69E6, 0x98A0, 0x69E7, 0x98A1, 0x69E8, 0x98A2, 0x69E9, 0x98A3, 0x69EA, 0x98A4, 0x69EB, 0x98A5, 0x69EC, + 0x98A6, 0x69EE, 0x98A7, 0x69EF, 0x98A8, 0x69F0, 0x98A9, 0x69F1, 0x98AA, 0x69F3, 0x98AB, 0x69F4, 0x98AC, 0x69F5, 0x98AD, 0x69F6, + 0x98AE, 0x69F7, 0x98AF, 0x69F8, 0x98B0, 0x69F9, 0x98B1, 0x69FA, 0x98B2, 0x69FB, 0x98B3, 0x69FC, 0x98B4, 0x69FE, 0x98B5, 0x6A00, + 0x98B6, 0x6A01, 0x98B7, 0x6A02, 0x98B8, 0x6A03, 0x98B9, 0x6A04, 0x98BA, 0x6A05, 0x98BB, 0x6A06, 0x98BC, 0x6A07, 0x98BD, 0x6A08, + 0x98BE, 0x6A09, 0x98BF, 0x6A0B, 0x98C0, 0x6A0C, 0x98C1, 0x6A0D, 0x98C2, 0x6A0E, 0x98C3, 0x6A0F, 0x98C4, 0x6A10, 0x98C5, 0x6A11, + 0x98C6, 0x6A12, 0x98C7, 0x6A13, 0x98C8, 0x6A14, 0x98C9, 0x6A15, 0x98CA, 0x6A16, 0x98CB, 0x6A19, 0x98CC, 0x6A1A, 0x98CD, 0x6A1B, + 0x98CE, 0x6A1C, 0x98CF, 0x6A1D, 0x98D0, 0x6A1E, 0x98D1, 0x6A20, 0x98D2, 0x6A22, 0x98D3, 0x6A23, 0x98D4, 0x6A24, 0x98D5, 0x6A25, + 0x98D6, 0x6A26, 0x98D7, 0x6A27, 0x98D8, 0x6A29, 0x98D9, 0x6A2B, 0x98DA, 0x6A2C, 0x98DB, 0x6A2D, 0x98DC, 0x6A2E, 0x98DD, 0x6A30, + 0x98DE, 0x6A32, 0x98DF, 0x6A33, 0x98E0, 0x6A34, 0x98E1, 0x6A36, 0x98E2, 0x6A37, 0x98E3, 0x6A38, 0x98E4, 0x6A39, 0x98E5, 0x6A3A, + 0x98E6, 0x6A3B, 0x98E7, 0x6A3C, 0x98E8, 0x6A3F, 0x98E9, 0x6A40, 0x98EA, 0x6A41, 0x98EB, 0x6A42, 0x98EC, 0x6A43, 0x98ED, 0x6A45, + 0x98EE, 0x6A46, 0x98EF, 0x6A48, 0x98F0, 0x6A49, 0x98F1, 0x6A4A, 0x98F2, 0x6A4B, 0x98F3, 0x6A4C, 0x98F4, 0x6A4D, 0x98F5, 0x6A4E, + 0x98F6, 0x6A4F, 0x98F7, 0x6A51, 0x98F8, 0x6A52, 0x98F9, 0x6A53, 0x98FA, 0x6A54, 0x98FB, 0x6A55, 0x98FC, 0x6A56, 0x98FD, 0x6A57, + 0x98FE, 0x6A5A, 0x9940, 0x6A5C, 0x9941, 0x6A5D, 0x9942, 0x6A5E, 0x9943, 0x6A5F, 0x9944, 0x6A60, 0x9945, 0x6A62, 0x9946, 0x6A63, + 0x9947, 0x6A64, 0x9948, 0x6A66, 0x9949, 0x6A67, 0x994A, 0x6A68, 0x994B, 0x6A69, 0x994C, 0x6A6A, 0x994D, 0x6A6B, 0x994E, 0x6A6C, + 0x994F, 0x6A6D, 0x9950, 0x6A6E, 0x9951, 0x6A6F, 0x9952, 0x6A70, 0x9953, 0x6A72, 0x9954, 0x6A73, 0x9955, 0x6A74, 0x9956, 0x6A75, + 0x9957, 0x6A76, 0x9958, 0x6A77, 0x9959, 0x6A78, 0x995A, 0x6A7A, 0x995B, 0x6A7B, 0x995C, 0x6A7D, 0x995D, 0x6A7E, 0x995E, 0x6A7F, + 0x995F, 0x6A81, 0x9960, 0x6A82, 0x9961, 0x6A83, 0x9962, 0x6A85, 0x9963, 0x6A86, 0x9964, 0x6A87, 0x9965, 0x6A88, 0x9966, 0x6A89, + 0x9967, 0x6A8A, 0x9968, 0x6A8B, 0x9969, 0x6A8C, 0x996A, 0x6A8D, 0x996B, 0x6A8F, 0x996C, 0x6A92, 0x996D, 0x6A93, 0x996E, 0x6A94, + 0x996F, 0x6A95, 0x9970, 0x6A96, 0x9971, 0x6A98, 0x9972, 0x6A99, 0x9973, 0x6A9A, 0x9974, 0x6A9B, 0x9975, 0x6A9C, 0x9976, 0x6A9D, + 0x9977, 0x6A9E, 0x9978, 0x6A9F, 0x9979, 0x6AA1, 0x997A, 0x6AA2, 0x997B, 0x6AA3, 0x997C, 0x6AA4, 0x997D, 0x6AA5, 0x997E, 0x6AA6, + 0x9980, 0x6AA7, 0x9981, 0x6AA8, 0x9982, 0x6AAA, 0x9983, 0x6AAD, 0x9984, 0x6AAE, 0x9985, 0x6AAF, 0x9986, 0x6AB0, 0x9987, 0x6AB1, + 0x9988, 0x6AB2, 0x9989, 0x6AB3, 0x998A, 0x6AB4, 0x998B, 0x6AB5, 0x998C, 0x6AB6, 0x998D, 0x6AB7, 0x998E, 0x6AB8, 0x998F, 0x6AB9, + 0x9990, 0x6ABA, 0x9991, 0x6ABB, 0x9992, 0x6ABC, 0x9993, 0x6ABD, 0x9994, 0x6ABE, 0x9995, 0x6ABF, 0x9996, 0x6AC0, 0x9997, 0x6AC1, + 0x9998, 0x6AC2, 0x9999, 0x6AC3, 0x999A, 0x6AC4, 0x999B, 0x6AC5, 0x999C, 0x6AC6, 0x999D, 0x6AC7, 0x999E, 0x6AC8, 0x999F, 0x6AC9, + 0x99A0, 0x6ACA, 0x99A1, 0x6ACB, 0x99A2, 0x6ACC, 0x99A3, 0x6ACD, 0x99A4, 0x6ACE, 0x99A5, 0x6ACF, 0x99A6, 0x6AD0, 0x99A7, 0x6AD1, + 0x99A8, 0x6AD2, 0x99A9, 0x6AD3, 0x99AA, 0x6AD4, 0x99AB, 0x6AD5, 0x99AC, 0x6AD6, 0x99AD, 0x6AD7, 0x99AE, 0x6AD8, 0x99AF, 0x6AD9, + 0x99B0, 0x6ADA, 0x99B1, 0x6ADB, 0x99B2, 0x6ADC, 0x99B3, 0x6ADD, 0x99B4, 0x6ADE, 0x99B5, 0x6ADF, 0x99B6, 0x6AE0, 0x99B7, 0x6AE1, + 0x99B8, 0x6AE2, 0x99B9, 0x6AE3, 0x99BA, 0x6AE4, 0x99BB, 0x6AE5, 0x99BC, 0x6AE6, 0x99BD, 0x6AE7, 0x99BE, 0x6AE8, 0x99BF, 0x6AE9, + 0x99C0, 0x6AEA, 0x99C1, 0x6AEB, 0x99C2, 0x6AEC, 0x99C3, 0x6AED, 0x99C4, 0x6AEE, 0x99C5, 0x6AEF, 0x99C6, 0x6AF0, 0x99C7, 0x6AF1, + 0x99C8, 0x6AF2, 0x99C9, 0x6AF3, 0x99CA, 0x6AF4, 0x99CB, 0x6AF5, 0x99CC, 0x6AF6, 0x99CD, 0x6AF7, 0x99CE, 0x6AF8, 0x99CF, 0x6AF9, + 0x99D0, 0x6AFA, 0x99D1, 0x6AFB, 0x99D2, 0x6AFC, 0x99D3, 0x6AFD, 0x99D4, 0x6AFE, 0x99D5, 0x6AFF, 0x99D6, 0x6B00, 0x99D7, 0x6B01, + 0x99D8, 0x6B02, 0x99D9, 0x6B03, 0x99DA, 0x6B04, 0x99DB, 0x6B05, 0x99DC, 0x6B06, 0x99DD, 0x6B07, 0x99DE, 0x6B08, 0x99DF, 0x6B09, + 0x99E0, 0x6B0A, 0x99E1, 0x6B0B, 0x99E2, 0x6B0C, 0x99E3, 0x6B0D, 0x99E4, 0x6B0E, 0x99E5, 0x6B0F, 0x99E6, 0x6B10, 0x99E7, 0x6B11, + 0x99E8, 0x6B12, 0x99E9, 0x6B13, 0x99EA, 0x6B14, 0x99EB, 0x6B15, 0x99EC, 0x6B16, 0x99ED, 0x6B17, 0x99EE, 0x6B18, 0x99EF, 0x6B19, + 0x99F0, 0x6B1A, 0x99F1, 0x6B1B, 0x99F2, 0x6B1C, 0x99F3, 0x6B1D, 0x99F4, 0x6B1E, 0x99F5, 0x6B1F, 0x99F6, 0x6B25, 0x99F7, 0x6B26, + 0x99F8, 0x6B28, 0x99F9, 0x6B29, 0x99FA, 0x6B2A, 0x99FB, 0x6B2B, 0x99FC, 0x6B2C, 0x99FD, 0x6B2D, 0x99FE, 0x6B2E, 0x9A40, 0x6B2F, + 0x9A41, 0x6B30, 0x9A42, 0x6B31, 0x9A43, 0x6B33, 0x9A44, 0x6B34, 0x9A45, 0x6B35, 0x9A46, 0x6B36, 0x9A47, 0x6B38, 0x9A48, 0x6B3B, + 0x9A49, 0x6B3C, 0x9A4A, 0x6B3D, 0x9A4B, 0x6B3F, 0x9A4C, 0x6B40, 0x9A4D, 0x6B41, 0x9A4E, 0x6B42, 0x9A4F, 0x6B44, 0x9A50, 0x6B45, + 0x9A51, 0x6B48, 0x9A52, 0x6B4A, 0x9A53, 0x6B4B, 0x9A54, 0x6B4D, 0x9A55, 0x6B4E, 0x9A56, 0x6B4F, 0x9A57, 0x6B50, 0x9A58, 0x6B51, + 0x9A59, 0x6B52, 0x9A5A, 0x6B53, 0x9A5B, 0x6B54, 0x9A5C, 0x6B55, 0x9A5D, 0x6B56, 0x9A5E, 0x6B57, 0x9A5F, 0x6B58, 0x9A60, 0x6B5A, + 0x9A61, 0x6B5B, 0x9A62, 0x6B5C, 0x9A63, 0x6B5D, 0x9A64, 0x6B5E, 0x9A65, 0x6B5F, 0x9A66, 0x6B60, 0x9A67, 0x6B61, 0x9A68, 0x6B68, + 0x9A69, 0x6B69, 0x9A6A, 0x6B6B, 0x9A6B, 0x6B6C, 0x9A6C, 0x6B6D, 0x9A6D, 0x6B6E, 0x9A6E, 0x6B6F, 0x9A6F, 0x6B70, 0x9A70, 0x6B71, + 0x9A71, 0x6B72, 0x9A72, 0x6B73, 0x9A73, 0x6B74, 0x9A74, 0x6B75, 0x9A75, 0x6B76, 0x9A76, 0x6B77, 0x9A77, 0x6B78, 0x9A78, 0x6B7A, + 0x9A79, 0x6B7D, 0x9A7A, 0x6B7E, 0x9A7B, 0x6B7F, 0x9A7C, 0x6B80, 0x9A7D, 0x6B85, 0x9A7E, 0x6B88, 0x9A80, 0x6B8C, 0x9A81, 0x6B8E, + 0x9A82, 0x6B8F, 0x9A83, 0x6B90, 0x9A84, 0x6B91, 0x9A85, 0x6B94, 0x9A86, 0x6B95, 0x9A87, 0x6B97, 0x9A88, 0x6B98, 0x9A89, 0x6B99, + 0x9A8A, 0x6B9C, 0x9A8B, 0x6B9D, 0x9A8C, 0x6B9E, 0x9A8D, 0x6B9F, 0x9A8E, 0x6BA0, 0x9A8F, 0x6BA2, 0x9A90, 0x6BA3, 0x9A91, 0x6BA4, + 0x9A92, 0x6BA5, 0x9A93, 0x6BA6, 0x9A94, 0x6BA7, 0x9A95, 0x6BA8, 0x9A96, 0x6BA9, 0x9A97, 0x6BAB, 0x9A98, 0x6BAC, 0x9A99, 0x6BAD, + 0x9A9A, 0x6BAE, 0x9A9B, 0x6BAF, 0x9A9C, 0x6BB0, 0x9A9D, 0x6BB1, 0x9A9E, 0x6BB2, 0x9A9F, 0x6BB6, 0x9AA0, 0x6BB8, 0x9AA1, 0x6BB9, + 0x9AA2, 0x6BBA, 0x9AA3, 0x6BBB, 0x9AA4, 0x6BBC, 0x9AA5, 0x6BBD, 0x9AA6, 0x6BBE, 0x9AA7, 0x6BC0, 0x9AA8, 0x6BC3, 0x9AA9, 0x6BC4, + 0x9AAA, 0x6BC6, 0x9AAB, 0x6BC7, 0x9AAC, 0x6BC8, 0x9AAD, 0x6BC9, 0x9AAE, 0x6BCA, 0x9AAF, 0x6BCC, 0x9AB0, 0x6BCE, 0x9AB1, 0x6BD0, + 0x9AB2, 0x6BD1, 0x9AB3, 0x6BD8, 0x9AB4, 0x6BDA, 0x9AB5, 0x6BDC, 0x9AB6, 0x6BDD, 0x9AB7, 0x6BDE, 0x9AB8, 0x6BDF, 0x9AB9, 0x6BE0, + 0x9ABA, 0x6BE2, 0x9ABB, 0x6BE3, 0x9ABC, 0x6BE4, 0x9ABD, 0x6BE5, 0x9ABE, 0x6BE6, 0x9ABF, 0x6BE7, 0x9AC0, 0x6BE8, 0x9AC1, 0x6BE9, + 0x9AC2, 0x6BEC, 0x9AC3, 0x6BED, 0x9AC4, 0x6BEE, 0x9AC5, 0x6BF0, 0x9AC6, 0x6BF1, 0x9AC7, 0x6BF2, 0x9AC8, 0x6BF4, 0x9AC9, 0x6BF6, + 0x9ACA, 0x6BF7, 0x9ACB, 0x6BF8, 0x9ACC, 0x6BFA, 0x9ACD, 0x6BFB, 0x9ACE, 0x6BFC, 0x9ACF, 0x6BFE, 0x9AD0, 0x6BFF, 0x9AD1, 0x6C00, + 0x9AD2, 0x6C01, 0x9AD3, 0x6C02, 0x9AD4, 0x6C03, 0x9AD5, 0x6C04, 0x9AD6, 0x6C08, 0x9AD7, 0x6C09, 0x9AD8, 0x6C0A, 0x9AD9, 0x6C0B, + 0x9ADA, 0x6C0C, 0x9ADB, 0x6C0E, 0x9ADC, 0x6C12, 0x9ADD, 0x6C17, 0x9ADE, 0x6C1C, 0x9ADF, 0x6C1D, 0x9AE0, 0x6C1E, 0x9AE1, 0x6C20, + 0x9AE2, 0x6C23, 0x9AE3, 0x6C25, 0x9AE4, 0x6C2B, 0x9AE5, 0x6C2C, 0x9AE6, 0x6C2D, 0x9AE7, 0x6C31, 0x9AE8, 0x6C33, 0x9AE9, 0x6C36, + 0x9AEA, 0x6C37, 0x9AEB, 0x6C39, 0x9AEC, 0x6C3A, 0x9AED, 0x6C3B, 0x9AEE, 0x6C3C, 0x9AEF, 0x6C3E, 0x9AF0, 0x6C3F, 0x9AF1, 0x6C43, + 0x9AF2, 0x6C44, 0x9AF3, 0x6C45, 0x9AF4, 0x6C48, 0x9AF5, 0x6C4B, 0x9AF6, 0x6C4C, 0x9AF7, 0x6C4D, 0x9AF8, 0x6C4E, 0x9AF9, 0x6C4F, + 0x9AFA, 0x6C51, 0x9AFB, 0x6C52, 0x9AFC, 0x6C53, 0x9AFD, 0x6C56, 0x9AFE, 0x6C58, 0x9B40, 0x6C59, 0x9B41, 0x6C5A, 0x9B42, 0x6C62, + 0x9B43, 0x6C63, 0x9B44, 0x6C65, 0x9B45, 0x6C66, 0x9B46, 0x6C67, 0x9B47, 0x6C6B, 0x9B48, 0x6C6C, 0x9B49, 0x6C6D, 0x9B4A, 0x6C6E, + 0x9B4B, 0x6C6F, 0x9B4C, 0x6C71, 0x9B4D, 0x6C73, 0x9B4E, 0x6C75, 0x9B4F, 0x6C77, 0x9B50, 0x6C78, 0x9B51, 0x6C7A, 0x9B52, 0x6C7B, + 0x9B53, 0x6C7C, 0x9B54, 0x6C7F, 0x9B55, 0x6C80, 0x9B56, 0x6C84, 0x9B57, 0x6C87, 0x9B58, 0x6C8A, 0x9B59, 0x6C8B, 0x9B5A, 0x6C8D, + 0x9B5B, 0x6C8E, 0x9B5C, 0x6C91, 0x9B5D, 0x6C92, 0x9B5E, 0x6C95, 0x9B5F, 0x6C96, 0x9B60, 0x6C97, 0x9B61, 0x6C98, 0x9B62, 0x6C9A, + 0x9B63, 0x6C9C, 0x9B64, 0x6C9D, 0x9B65, 0x6C9E, 0x9B66, 0x6CA0, 0x9B67, 0x6CA2, 0x9B68, 0x6CA8, 0x9B69, 0x6CAC, 0x9B6A, 0x6CAF, + 0x9B6B, 0x6CB0, 0x9B6C, 0x6CB4, 0x9B6D, 0x6CB5, 0x9B6E, 0x6CB6, 0x9B6F, 0x6CB7, 0x9B70, 0x6CBA, 0x9B71, 0x6CC0, 0x9B72, 0x6CC1, + 0x9B73, 0x6CC2, 0x9B74, 0x6CC3, 0x9B75, 0x6CC6, 0x9B76, 0x6CC7, 0x9B77, 0x6CC8, 0x9B78, 0x6CCB, 0x9B79, 0x6CCD, 0x9B7A, 0x6CCE, + 0x9B7B, 0x6CCF, 0x9B7C, 0x6CD1, 0x9B7D, 0x6CD2, 0x9B7E, 0x6CD8, 0x9B80, 0x6CD9, 0x9B81, 0x6CDA, 0x9B82, 0x6CDC, 0x9B83, 0x6CDD, + 0x9B84, 0x6CDF, 0x9B85, 0x6CE4, 0x9B86, 0x6CE6, 0x9B87, 0x6CE7, 0x9B88, 0x6CE9, 0x9B89, 0x6CEC, 0x9B8A, 0x6CED, 0x9B8B, 0x6CF2, + 0x9B8C, 0x6CF4, 0x9B8D, 0x6CF9, 0x9B8E, 0x6CFF, 0x9B8F, 0x6D00, 0x9B90, 0x6D02, 0x9B91, 0x6D03, 0x9B92, 0x6D05, 0x9B93, 0x6D06, + 0x9B94, 0x6D08, 0x9B95, 0x6D09, 0x9B96, 0x6D0A, 0x9B97, 0x6D0D, 0x9B98, 0x6D0F, 0x9B99, 0x6D10, 0x9B9A, 0x6D11, 0x9B9B, 0x6D13, + 0x9B9C, 0x6D14, 0x9B9D, 0x6D15, 0x9B9E, 0x6D16, 0x9B9F, 0x6D18, 0x9BA0, 0x6D1C, 0x9BA1, 0x6D1D, 0x9BA2, 0x6D1F, 0x9BA3, 0x6D20, + 0x9BA4, 0x6D21, 0x9BA5, 0x6D22, 0x9BA6, 0x6D23, 0x9BA7, 0x6D24, 0x9BA8, 0x6D26, 0x9BA9, 0x6D28, 0x9BAA, 0x6D29, 0x9BAB, 0x6D2C, + 0x9BAC, 0x6D2D, 0x9BAD, 0x6D2F, 0x9BAE, 0x6D30, 0x9BAF, 0x6D34, 0x9BB0, 0x6D36, 0x9BB1, 0x6D37, 0x9BB2, 0x6D38, 0x9BB3, 0x6D3A, + 0x9BB4, 0x6D3F, 0x9BB5, 0x6D40, 0x9BB6, 0x6D42, 0x9BB7, 0x6D44, 0x9BB8, 0x6D49, 0x9BB9, 0x6D4C, 0x9BBA, 0x6D50, 0x9BBB, 0x6D55, + 0x9BBC, 0x6D56, 0x9BBD, 0x6D57, 0x9BBE, 0x6D58, 0x9BBF, 0x6D5B, 0x9BC0, 0x6D5D, 0x9BC1, 0x6D5F, 0x9BC2, 0x6D61, 0x9BC3, 0x6D62, + 0x9BC4, 0x6D64, 0x9BC5, 0x6D65, 0x9BC6, 0x6D67, 0x9BC7, 0x6D68, 0x9BC8, 0x6D6B, 0x9BC9, 0x6D6C, 0x9BCA, 0x6D6D, 0x9BCB, 0x6D70, + 0x9BCC, 0x6D71, 0x9BCD, 0x6D72, 0x9BCE, 0x6D73, 0x9BCF, 0x6D75, 0x9BD0, 0x6D76, 0x9BD1, 0x6D79, 0x9BD2, 0x6D7A, 0x9BD3, 0x6D7B, + 0x9BD4, 0x6D7D, 0x9BD5, 0x6D7E, 0x9BD6, 0x6D7F, 0x9BD7, 0x6D80, 0x9BD8, 0x6D81, 0x9BD9, 0x6D83, 0x9BDA, 0x6D84, 0x9BDB, 0x6D86, + 0x9BDC, 0x6D87, 0x9BDD, 0x6D8A, 0x9BDE, 0x6D8B, 0x9BDF, 0x6D8D, 0x9BE0, 0x6D8F, 0x9BE1, 0x6D90, 0x9BE2, 0x6D92, 0x9BE3, 0x6D96, + 0x9BE4, 0x6D97, 0x9BE5, 0x6D98, 0x9BE6, 0x6D99, 0x9BE7, 0x6D9A, 0x9BE8, 0x6D9C, 0x9BE9, 0x6DA2, 0x9BEA, 0x6DA5, 0x9BEB, 0x6DAC, + 0x9BEC, 0x6DAD, 0x9BED, 0x6DB0, 0x9BEE, 0x6DB1, 0x9BEF, 0x6DB3, 0x9BF0, 0x6DB4, 0x9BF1, 0x6DB6, 0x9BF2, 0x6DB7, 0x9BF3, 0x6DB9, + 0x9BF4, 0x6DBA, 0x9BF5, 0x6DBB, 0x9BF6, 0x6DBC, 0x9BF7, 0x6DBD, 0x9BF8, 0x6DBE, 0x9BF9, 0x6DC1, 0x9BFA, 0x6DC2, 0x9BFB, 0x6DC3, + 0x9BFC, 0x6DC8, 0x9BFD, 0x6DC9, 0x9BFE, 0x6DCA, 0x9C40, 0x6DCD, 0x9C41, 0x6DCE, 0x9C42, 0x6DCF, 0x9C43, 0x6DD0, 0x9C44, 0x6DD2, + 0x9C45, 0x6DD3, 0x9C46, 0x6DD4, 0x9C47, 0x6DD5, 0x9C48, 0x6DD7, 0x9C49, 0x6DDA, 0x9C4A, 0x6DDB, 0x9C4B, 0x6DDC, 0x9C4C, 0x6DDF, + 0x9C4D, 0x6DE2, 0x9C4E, 0x6DE3, 0x9C4F, 0x6DE5, 0x9C50, 0x6DE7, 0x9C51, 0x6DE8, 0x9C52, 0x6DE9, 0x9C53, 0x6DEA, 0x9C54, 0x6DED, + 0x9C55, 0x6DEF, 0x9C56, 0x6DF0, 0x9C57, 0x6DF2, 0x9C58, 0x6DF4, 0x9C59, 0x6DF5, 0x9C5A, 0x6DF6, 0x9C5B, 0x6DF8, 0x9C5C, 0x6DFA, + 0x9C5D, 0x6DFD, 0x9C5E, 0x6DFE, 0x9C5F, 0x6DFF, 0x9C60, 0x6E00, 0x9C61, 0x6E01, 0x9C62, 0x6E02, 0x9C63, 0x6E03, 0x9C64, 0x6E04, + 0x9C65, 0x6E06, 0x9C66, 0x6E07, 0x9C67, 0x6E08, 0x9C68, 0x6E09, 0x9C69, 0x6E0B, 0x9C6A, 0x6E0F, 0x9C6B, 0x6E12, 0x9C6C, 0x6E13, + 0x9C6D, 0x6E15, 0x9C6E, 0x6E18, 0x9C6F, 0x6E19, 0x9C70, 0x6E1B, 0x9C71, 0x6E1C, 0x9C72, 0x6E1E, 0x9C73, 0x6E1F, 0x9C74, 0x6E22, + 0x9C75, 0x6E26, 0x9C76, 0x6E27, 0x9C77, 0x6E28, 0x9C78, 0x6E2A, 0x9C79, 0x6E2C, 0x9C7A, 0x6E2E, 0x9C7B, 0x6E30, 0x9C7C, 0x6E31, + 0x9C7D, 0x6E33, 0x9C7E, 0x6E35, 0x9C80, 0x6E36, 0x9C81, 0x6E37, 0x9C82, 0x6E39, 0x9C83, 0x6E3B, 0x9C84, 0x6E3C, 0x9C85, 0x6E3D, + 0x9C86, 0x6E3E, 0x9C87, 0x6E3F, 0x9C88, 0x6E40, 0x9C89, 0x6E41, 0x9C8A, 0x6E42, 0x9C8B, 0x6E45, 0x9C8C, 0x6E46, 0x9C8D, 0x6E47, + 0x9C8E, 0x6E48, 0x9C8F, 0x6E49, 0x9C90, 0x6E4A, 0x9C91, 0x6E4B, 0x9C92, 0x6E4C, 0x9C93, 0x6E4F, 0x9C94, 0x6E50, 0x9C95, 0x6E51, + 0x9C96, 0x6E52, 0x9C97, 0x6E55, 0x9C98, 0x6E57, 0x9C99, 0x6E59, 0x9C9A, 0x6E5A, 0x9C9B, 0x6E5C, 0x9C9C, 0x6E5D, 0x9C9D, 0x6E5E, + 0x9C9E, 0x6E60, 0x9C9F, 0x6E61, 0x9CA0, 0x6E62, 0x9CA1, 0x6E63, 0x9CA2, 0x6E64, 0x9CA3, 0x6E65, 0x9CA4, 0x6E66, 0x9CA5, 0x6E67, + 0x9CA6, 0x6E68, 0x9CA7, 0x6E69, 0x9CA8, 0x6E6A, 0x9CA9, 0x6E6C, 0x9CAA, 0x6E6D, 0x9CAB, 0x6E6F, 0x9CAC, 0x6E70, 0x9CAD, 0x6E71, + 0x9CAE, 0x6E72, 0x9CAF, 0x6E73, 0x9CB0, 0x6E74, 0x9CB1, 0x6E75, 0x9CB2, 0x6E76, 0x9CB3, 0x6E77, 0x9CB4, 0x6E78, 0x9CB5, 0x6E79, + 0x9CB6, 0x6E7A, 0x9CB7, 0x6E7B, 0x9CB8, 0x6E7C, 0x9CB9, 0x6E7D, 0x9CBA, 0x6E80, 0x9CBB, 0x6E81, 0x9CBC, 0x6E82, 0x9CBD, 0x6E84, + 0x9CBE, 0x6E87, 0x9CBF, 0x6E88, 0x9CC0, 0x6E8A, 0x9CC1, 0x6E8B, 0x9CC2, 0x6E8C, 0x9CC3, 0x6E8D, 0x9CC4, 0x6E8E, 0x9CC5, 0x6E91, + 0x9CC6, 0x6E92, 0x9CC7, 0x6E93, 0x9CC8, 0x6E94, 0x9CC9, 0x6E95, 0x9CCA, 0x6E96, 0x9CCB, 0x6E97, 0x9CCC, 0x6E99, 0x9CCD, 0x6E9A, + 0x9CCE, 0x6E9B, 0x9CCF, 0x6E9D, 0x9CD0, 0x6E9E, 0x9CD1, 0x6EA0, 0x9CD2, 0x6EA1, 0x9CD3, 0x6EA3, 0x9CD4, 0x6EA4, 0x9CD5, 0x6EA6, + 0x9CD6, 0x6EA8, 0x9CD7, 0x6EA9, 0x9CD8, 0x6EAB, 0x9CD9, 0x6EAC, 0x9CDA, 0x6EAD, 0x9CDB, 0x6EAE, 0x9CDC, 0x6EB0, 0x9CDD, 0x6EB3, + 0x9CDE, 0x6EB5, 0x9CDF, 0x6EB8, 0x9CE0, 0x6EB9, 0x9CE1, 0x6EBC, 0x9CE2, 0x6EBE, 0x9CE3, 0x6EBF, 0x9CE4, 0x6EC0, 0x9CE5, 0x6EC3, + 0x9CE6, 0x6EC4, 0x9CE7, 0x6EC5, 0x9CE8, 0x6EC6, 0x9CE9, 0x6EC8, 0x9CEA, 0x6EC9, 0x9CEB, 0x6ECA, 0x9CEC, 0x6ECC, 0x9CED, 0x6ECD, + 0x9CEE, 0x6ECE, 0x9CEF, 0x6ED0, 0x9CF0, 0x6ED2, 0x9CF1, 0x6ED6, 0x9CF2, 0x6ED8, 0x9CF3, 0x6ED9, 0x9CF4, 0x6EDB, 0x9CF5, 0x6EDC, + 0x9CF6, 0x6EDD, 0x9CF7, 0x6EE3, 0x9CF8, 0x6EE7, 0x9CF9, 0x6EEA, 0x9CFA, 0x6EEB, 0x9CFB, 0x6EEC, 0x9CFC, 0x6EED, 0x9CFD, 0x6EEE, + 0x9CFE, 0x6EEF, 0x9D40, 0x6EF0, 0x9D41, 0x6EF1, 0x9D42, 0x6EF2, 0x9D43, 0x6EF3, 0x9D44, 0x6EF5, 0x9D45, 0x6EF6, 0x9D46, 0x6EF7, + 0x9D47, 0x6EF8, 0x9D48, 0x6EFA, 0x9D49, 0x6EFB, 0x9D4A, 0x6EFC, 0x9D4B, 0x6EFD, 0x9D4C, 0x6EFE, 0x9D4D, 0x6EFF, 0x9D4E, 0x6F00, + 0x9D4F, 0x6F01, 0x9D50, 0x6F03, 0x9D51, 0x6F04, 0x9D52, 0x6F05, 0x9D53, 0x6F07, 0x9D54, 0x6F08, 0x9D55, 0x6F0A, 0x9D56, 0x6F0B, + 0x9D57, 0x6F0C, 0x9D58, 0x6F0D, 0x9D59, 0x6F0E, 0x9D5A, 0x6F10, 0x9D5B, 0x6F11, 0x9D5C, 0x6F12, 0x9D5D, 0x6F16, 0x9D5E, 0x6F17, + 0x9D5F, 0x6F18, 0x9D60, 0x6F19, 0x9D61, 0x6F1A, 0x9D62, 0x6F1B, 0x9D63, 0x6F1C, 0x9D64, 0x6F1D, 0x9D65, 0x6F1E, 0x9D66, 0x6F1F, + 0x9D67, 0x6F21, 0x9D68, 0x6F22, 0x9D69, 0x6F23, 0x9D6A, 0x6F25, 0x9D6B, 0x6F26, 0x9D6C, 0x6F27, 0x9D6D, 0x6F28, 0x9D6E, 0x6F2C, + 0x9D6F, 0x6F2E, 0x9D70, 0x6F30, 0x9D71, 0x6F32, 0x9D72, 0x6F34, 0x9D73, 0x6F35, 0x9D74, 0x6F37, 0x9D75, 0x6F38, 0x9D76, 0x6F39, + 0x9D77, 0x6F3A, 0x9D78, 0x6F3B, 0x9D79, 0x6F3C, 0x9D7A, 0x6F3D, 0x9D7B, 0x6F3F, 0x9D7C, 0x6F40, 0x9D7D, 0x6F41, 0x9D7E, 0x6F42, + 0x9D80, 0x6F43, 0x9D81, 0x6F44, 0x9D82, 0x6F45, 0x9D83, 0x6F48, 0x9D84, 0x6F49, 0x9D85, 0x6F4A, 0x9D86, 0x6F4C, 0x9D87, 0x6F4E, + 0x9D88, 0x6F4F, 0x9D89, 0x6F50, 0x9D8A, 0x6F51, 0x9D8B, 0x6F52, 0x9D8C, 0x6F53, 0x9D8D, 0x6F54, 0x9D8E, 0x6F55, 0x9D8F, 0x6F56, + 0x9D90, 0x6F57, 0x9D91, 0x6F59, 0x9D92, 0x6F5A, 0x9D93, 0x6F5B, 0x9D94, 0x6F5D, 0x9D95, 0x6F5F, 0x9D96, 0x6F60, 0x9D97, 0x6F61, + 0x9D98, 0x6F63, 0x9D99, 0x6F64, 0x9D9A, 0x6F65, 0x9D9B, 0x6F67, 0x9D9C, 0x6F68, 0x9D9D, 0x6F69, 0x9D9E, 0x6F6A, 0x9D9F, 0x6F6B, + 0x9DA0, 0x6F6C, 0x9DA1, 0x6F6F, 0x9DA2, 0x6F70, 0x9DA3, 0x6F71, 0x9DA4, 0x6F73, 0x9DA5, 0x6F75, 0x9DA6, 0x6F76, 0x9DA7, 0x6F77, + 0x9DA8, 0x6F79, 0x9DA9, 0x6F7B, 0x9DAA, 0x6F7D, 0x9DAB, 0x6F7E, 0x9DAC, 0x6F7F, 0x9DAD, 0x6F80, 0x9DAE, 0x6F81, 0x9DAF, 0x6F82, + 0x9DB0, 0x6F83, 0x9DB1, 0x6F85, 0x9DB2, 0x6F86, 0x9DB3, 0x6F87, 0x9DB4, 0x6F8A, 0x9DB5, 0x6F8B, 0x9DB6, 0x6F8F, 0x9DB7, 0x6F90, + 0x9DB8, 0x6F91, 0x9DB9, 0x6F92, 0x9DBA, 0x6F93, 0x9DBB, 0x6F94, 0x9DBC, 0x6F95, 0x9DBD, 0x6F96, 0x9DBE, 0x6F97, 0x9DBF, 0x6F98, + 0x9DC0, 0x6F99, 0x9DC1, 0x6F9A, 0x9DC2, 0x6F9B, 0x9DC3, 0x6F9D, 0x9DC4, 0x6F9E, 0x9DC5, 0x6F9F, 0x9DC6, 0x6FA0, 0x9DC7, 0x6FA2, + 0x9DC8, 0x6FA3, 0x9DC9, 0x6FA4, 0x9DCA, 0x6FA5, 0x9DCB, 0x6FA6, 0x9DCC, 0x6FA8, 0x9DCD, 0x6FA9, 0x9DCE, 0x6FAA, 0x9DCF, 0x6FAB, + 0x9DD0, 0x6FAC, 0x9DD1, 0x6FAD, 0x9DD2, 0x6FAE, 0x9DD3, 0x6FAF, 0x9DD4, 0x6FB0, 0x9DD5, 0x6FB1, 0x9DD6, 0x6FB2, 0x9DD7, 0x6FB4, + 0x9DD8, 0x6FB5, 0x9DD9, 0x6FB7, 0x9DDA, 0x6FB8, 0x9DDB, 0x6FBA, 0x9DDC, 0x6FBB, 0x9DDD, 0x6FBC, 0x9DDE, 0x6FBD, 0x9DDF, 0x6FBE, + 0x9DE0, 0x6FBF, 0x9DE1, 0x6FC1, 0x9DE2, 0x6FC3, 0x9DE3, 0x6FC4, 0x9DE4, 0x6FC5, 0x9DE5, 0x6FC6, 0x9DE6, 0x6FC7, 0x9DE7, 0x6FC8, + 0x9DE8, 0x6FCA, 0x9DE9, 0x6FCB, 0x9DEA, 0x6FCC, 0x9DEB, 0x6FCD, 0x9DEC, 0x6FCE, 0x9DED, 0x6FCF, 0x9DEE, 0x6FD0, 0x9DEF, 0x6FD3, + 0x9DF0, 0x6FD4, 0x9DF1, 0x6FD5, 0x9DF2, 0x6FD6, 0x9DF3, 0x6FD7, 0x9DF4, 0x6FD8, 0x9DF5, 0x6FD9, 0x9DF6, 0x6FDA, 0x9DF7, 0x6FDB, + 0x9DF8, 0x6FDC, 0x9DF9, 0x6FDD, 0x9DFA, 0x6FDF, 0x9DFB, 0x6FE2, 0x9DFC, 0x6FE3, 0x9DFD, 0x6FE4, 0x9DFE, 0x6FE5, 0x9E40, 0x6FE6, + 0x9E41, 0x6FE7, 0x9E42, 0x6FE8, 0x9E43, 0x6FE9, 0x9E44, 0x6FEA, 0x9E45, 0x6FEB, 0x9E46, 0x6FEC, 0x9E47, 0x6FED, 0x9E48, 0x6FF0, + 0x9E49, 0x6FF1, 0x9E4A, 0x6FF2, 0x9E4B, 0x6FF3, 0x9E4C, 0x6FF4, 0x9E4D, 0x6FF5, 0x9E4E, 0x6FF6, 0x9E4F, 0x6FF7, 0x9E50, 0x6FF8, + 0x9E51, 0x6FF9, 0x9E52, 0x6FFA, 0x9E53, 0x6FFB, 0x9E54, 0x6FFC, 0x9E55, 0x6FFD, 0x9E56, 0x6FFE, 0x9E57, 0x6FFF, 0x9E58, 0x7000, + 0x9E59, 0x7001, 0x9E5A, 0x7002, 0x9E5B, 0x7003, 0x9E5C, 0x7004, 0x9E5D, 0x7005, 0x9E5E, 0x7006, 0x9E5F, 0x7007, 0x9E60, 0x7008, + 0x9E61, 0x7009, 0x9E62, 0x700A, 0x9E63, 0x700B, 0x9E64, 0x700C, 0x9E65, 0x700D, 0x9E66, 0x700E, 0x9E67, 0x700F, 0x9E68, 0x7010, + 0x9E69, 0x7012, 0x9E6A, 0x7013, 0x9E6B, 0x7014, 0x9E6C, 0x7015, 0x9E6D, 0x7016, 0x9E6E, 0x7017, 0x9E6F, 0x7018, 0x9E70, 0x7019, + 0x9E71, 0x701C, 0x9E72, 0x701D, 0x9E73, 0x701E, 0x9E74, 0x701F, 0x9E75, 0x7020, 0x9E76, 0x7021, 0x9E77, 0x7022, 0x9E78, 0x7024, + 0x9E79, 0x7025, 0x9E7A, 0x7026, 0x9E7B, 0x7027, 0x9E7C, 0x7028, 0x9E7D, 0x7029, 0x9E7E, 0x702A, 0x9E80, 0x702B, 0x9E81, 0x702C, + 0x9E82, 0x702D, 0x9E83, 0x702E, 0x9E84, 0x702F, 0x9E85, 0x7030, 0x9E86, 0x7031, 0x9E87, 0x7032, 0x9E88, 0x7033, 0x9E89, 0x7034, + 0x9E8A, 0x7036, 0x9E8B, 0x7037, 0x9E8C, 0x7038, 0x9E8D, 0x703A, 0x9E8E, 0x703B, 0x9E8F, 0x703C, 0x9E90, 0x703D, 0x9E91, 0x703E, + 0x9E92, 0x703F, 0x9E93, 0x7040, 0x9E94, 0x7041, 0x9E95, 0x7042, 0x9E96, 0x7043, 0x9E97, 0x7044, 0x9E98, 0x7045, 0x9E99, 0x7046, + 0x9E9A, 0x7047, 0x9E9B, 0x7048, 0x9E9C, 0x7049, 0x9E9D, 0x704A, 0x9E9E, 0x704B, 0x9E9F, 0x704D, 0x9EA0, 0x704E, 0x9EA1, 0x7050, + 0x9EA2, 0x7051, 0x9EA3, 0x7052, 0x9EA4, 0x7053, 0x9EA5, 0x7054, 0x9EA6, 0x7055, 0x9EA7, 0x7056, 0x9EA8, 0x7057, 0x9EA9, 0x7058, + 0x9EAA, 0x7059, 0x9EAB, 0x705A, 0x9EAC, 0x705B, 0x9EAD, 0x705C, 0x9EAE, 0x705D, 0x9EAF, 0x705F, 0x9EB0, 0x7060, 0x9EB1, 0x7061, + 0x9EB2, 0x7062, 0x9EB3, 0x7063, 0x9EB4, 0x7064, 0x9EB5, 0x7065, 0x9EB6, 0x7066, 0x9EB7, 0x7067, 0x9EB8, 0x7068, 0x9EB9, 0x7069, + 0x9EBA, 0x706A, 0x9EBB, 0x706E, 0x9EBC, 0x7071, 0x9EBD, 0x7072, 0x9EBE, 0x7073, 0x9EBF, 0x7074, 0x9EC0, 0x7077, 0x9EC1, 0x7079, + 0x9EC2, 0x707A, 0x9EC3, 0x707B, 0x9EC4, 0x707D, 0x9EC5, 0x7081, 0x9EC6, 0x7082, 0x9EC7, 0x7083, 0x9EC8, 0x7084, 0x9EC9, 0x7086, + 0x9ECA, 0x7087, 0x9ECB, 0x7088, 0x9ECC, 0x708B, 0x9ECD, 0x708C, 0x9ECE, 0x708D, 0x9ECF, 0x708F, 0x9ED0, 0x7090, 0x9ED1, 0x7091, + 0x9ED2, 0x7093, 0x9ED3, 0x7097, 0x9ED4, 0x7098, 0x9ED5, 0x709A, 0x9ED6, 0x709B, 0x9ED7, 0x709E, 0x9ED8, 0x709F, 0x9ED9, 0x70A0, + 0x9EDA, 0x70A1, 0x9EDB, 0x70A2, 0x9EDC, 0x70A3, 0x9EDD, 0x70A4, 0x9EDE, 0x70A5, 0x9EDF, 0x70A6, 0x9EE0, 0x70A7, 0x9EE1, 0x70A8, + 0x9EE2, 0x70A9, 0x9EE3, 0x70AA, 0x9EE4, 0x70B0, 0x9EE5, 0x70B2, 0x9EE6, 0x70B4, 0x9EE7, 0x70B5, 0x9EE8, 0x70B6, 0x9EE9, 0x70BA, + 0x9EEA, 0x70BE, 0x9EEB, 0x70BF, 0x9EEC, 0x70C4, 0x9EED, 0x70C5, 0x9EEE, 0x70C6, 0x9EEF, 0x70C7, 0x9EF0, 0x70C9, 0x9EF1, 0x70CB, + 0x9EF2, 0x70CC, 0x9EF3, 0x70CD, 0x9EF4, 0x70CE, 0x9EF5, 0x70CF, 0x9EF6, 0x70D0, 0x9EF7, 0x70D1, 0x9EF8, 0x70D2, 0x9EF9, 0x70D3, + 0x9EFA, 0x70D4, 0x9EFB, 0x70D5, 0x9EFC, 0x70D6, 0x9EFD, 0x70D7, 0x9EFE, 0x70DA, 0x9F40, 0x70DC, 0x9F41, 0x70DD, 0x9F42, 0x70DE, + 0x9F43, 0x70E0, 0x9F44, 0x70E1, 0x9F45, 0x70E2, 0x9F46, 0x70E3, 0x9F47, 0x70E5, 0x9F48, 0x70EA, 0x9F49, 0x70EE, 0x9F4A, 0x70F0, + 0x9F4B, 0x70F1, 0x9F4C, 0x70F2, 0x9F4D, 0x70F3, 0x9F4E, 0x70F4, 0x9F4F, 0x70F5, 0x9F50, 0x70F6, 0x9F51, 0x70F8, 0x9F52, 0x70FA, + 0x9F53, 0x70FB, 0x9F54, 0x70FC, 0x9F55, 0x70FE, 0x9F56, 0x70FF, 0x9F57, 0x7100, 0x9F58, 0x7101, 0x9F59, 0x7102, 0x9F5A, 0x7103, + 0x9F5B, 0x7104, 0x9F5C, 0x7105, 0x9F5D, 0x7106, 0x9F5E, 0x7107, 0x9F5F, 0x7108, 0x9F60, 0x710B, 0x9F61, 0x710C, 0x9F62, 0x710D, + 0x9F63, 0x710E, 0x9F64, 0x710F, 0x9F65, 0x7111, 0x9F66, 0x7112, 0x9F67, 0x7114, 0x9F68, 0x7117, 0x9F69, 0x711B, 0x9F6A, 0x711C, + 0x9F6B, 0x711D, 0x9F6C, 0x711E, 0x9F6D, 0x711F, 0x9F6E, 0x7120, 0x9F6F, 0x7121, 0x9F70, 0x7122, 0x9F71, 0x7123, 0x9F72, 0x7124, + 0x9F73, 0x7125, 0x9F74, 0x7127, 0x9F75, 0x7128, 0x9F76, 0x7129, 0x9F77, 0x712A, 0x9F78, 0x712B, 0x9F79, 0x712C, 0x9F7A, 0x712D, + 0x9F7B, 0x712E, 0x9F7C, 0x7132, 0x9F7D, 0x7133, 0x9F7E, 0x7134, 0x9F80, 0x7135, 0x9F81, 0x7137, 0x9F82, 0x7138, 0x9F83, 0x7139, + 0x9F84, 0x713A, 0x9F85, 0x713B, 0x9F86, 0x713C, 0x9F87, 0x713D, 0x9F88, 0x713E, 0x9F89, 0x713F, 0x9F8A, 0x7140, 0x9F8B, 0x7141, + 0x9F8C, 0x7142, 0x9F8D, 0x7143, 0x9F8E, 0x7144, 0x9F8F, 0x7146, 0x9F90, 0x7147, 0x9F91, 0x7148, 0x9F92, 0x7149, 0x9F93, 0x714B, + 0x9F94, 0x714D, 0x9F95, 0x714F, 0x9F96, 0x7150, 0x9F97, 0x7151, 0x9F98, 0x7152, 0x9F99, 0x7153, 0x9F9A, 0x7154, 0x9F9B, 0x7155, + 0x9F9C, 0x7156, 0x9F9D, 0x7157, 0x9F9E, 0x7158, 0x9F9F, 0x7159, 0x9FA0, 0x715A, 0x9FA1, 0x715B, 0x9FA2, 0x715D, 0x9FA3, 0x715F, + 0x9FA4, 0x7160, 0x9FA5, 0x7161, 0x9FA6, 0x7162, 0x9FA7, 0x7163, 0x9FA8, 0x7165, 0x9FA9, 0x7169, 0x9FAA, 0x716A, 0x9FAB, 0x716B, + 0x9FAC, 0x716C, 0x9FAD, 0x716D, 0x9FAE, 0x716F, 0x9FAF, 0x7170, 0x9FB0, 0x7171, 0x9FB1, 0x7174, 0x9FB2, 0x7175, 0x9FB3, 0x7176, + 0x9FB4, 0x7177, 0x9FB5, 0x7179, 0x9FB6, 0x717B, 0x9FB7, 0x717C, 0x9FB8, 0x717E, 0x9FB9, 0x717F, 0x9FBA, 0x7180, 0x9FBB, 0x7181, + 0x9FBC, 0x7182, 0x9FBD, 0x7183, 0x9FBE, 0x7185, 0x9FBF, 0x7186, 0x9FC0, 0x7187, 0x9FC1, 0x7188, 0x9FC2, 0x7189, 0x9FC3, 0x718B, + 0x9FC4, 0x718C, 0x9FC5, 0x718D, 0x9FC6, 0x718E, 0x9FC7, 0x7190, 0x9FC8, 0x7191, 0x9FC9, 0x7192, 0x9FCA, 0x7193, 0x9FCB, 0x7195, + 0x9FCC, 0x7196, 0x9FCD, 0x7197, 0x9FCE, 0x719A, 0x9FCF, 0x719B, 0x9FD0, 0x719C, 0x9FD1, 0x719D, 0x9FD2, 0x719E, 0x9FD3, 0x71A1, + 0x9FD4, 0x71A2, 0x9FD5, 0x71A3, 0x9FD6, 0x71A4, 0x9FD7, 0x71A5, 0x9FD8, 0x71A6, 0x9FD9, 0x71A7, 0x9FDA, 0x71A9, 0x9FDB, 0x71AA, + 0x9FDC, 0x71AB, 0x9FDD, 0x71AD, 0x9FDE, 0x71AE, 0x9FDF, 0x71AF, 0x9FE0, 0x71B0, 0x9FE1, 0x71B1, 0x9FE2, 0x71B2, 0x9FE3, 0x71B4, + 0x9FE4, 0x71B6, 0x9FE5, 0x71B7, 0x9FE6, 0x71B8, 0x9FE7, 0x71BA, 0x9FE8, 0x71BB, 0x9FE9, 0x71BC, 0x9FEA, 0x71BD, 0x9FEB, 0x71BE, + 0x9FEC, 0x71BF, 0x9FED, 0x71C0, 0x9FEE, 0x71C1, 0x9FEF, 0x71C2, 0x9FF0, 0x71C4, 0x9FF1, 0x71C5, 0x9FF2, 0x71C6, 0x9FF3, 0x71C7, + 0x9FF4, 0x71C8, 0x9FF5, 0x71C9, 0x9FF6, 0x71CA, 0x9FF7, 0x71CB, 0x9FF8, 0x71CC, 0x9FF9, 0x71CD, 0x9FFA, 0x71CF, 0x9FFB, 0x71D0, + 0x9FFC, 0x71D1, 0x9FFD, 0x71D2, 0x9FFE, 0x71D3, 0xA040, 0x71D6, 0xA041, 0x71D7, 0xA042, 0x71D8, 0xA043, 0x71D9, 0xA044, 0x71DA, + 0xA045, 0x71DB, 0xA046, 0x71DC, 0xA047, 0x71DD, 0xA048, 0x71DE, 0xA049, 0x71DF, 0xA04A, 0x71E1, 0xA04B, 0x71E2, 0xA04C, 0x71E3, + 0xA04D, 0x71E4, 0xA04E, 0x71E6, 0xA04F, 0x71E8, 0xA050, 0x71E9, 0xA051, 0x71EA, 0xA052, 0x71EB, 0xA053, 0x71EC, 0xA054, 0x71ED, + 0xA055, 0x71EF, 0xA056, 0x71F0, 0xA057, 0x71F1, 0xA058, 0x71F2, 0xA059, 0x71F3, 0xA05A, 0x71F4, 0xA05B, 0x71F5, 0xA05C, 0x71F6, + 0xA05D, 0x71F7, 0xA05E, 0x71F8, 0xA05F, 0x71FA, 0xA060, 0x71FB, 0xA061, 0x71FC, 0xA062, 0x71FD, 0xA063, 0x71FE, 0xA064, 0x71FF, + 0xA065, 0x7200, 0xA066, 0x7201, 0xA067, 0x7202, 0xA068, 0x7203, 0xA069, 0x7204, 0xA06A, 0x7205, 0xA06B, 0x7207, 0xA06C, 0x7208, + 0xA06D, 0x7209, 0xA06E, 0x720A, 0xA06F, 0x720B, 0xA070, 0x720C, 0xA071, 0x720D, 0xA072, 0x720E, 0xA073, 0x720F, 0xA074, 0x7210, + 0xA075, 0x7211, 0xA076, 0x7212, 0xA077, 0x7213, 0xA078, 0x7214, 0xA079, 0x7215, 0xA07A, 0x7216, 0xA07B, 0x7217, 0xA07C, 0x7218, + 0xA07D, 0x7219, 0xA07E, 0x721A, 0xA080, 0x721B, 0xA081, 0x721C, 0xA082, 0x721E, 0xA083, 0x721F, 0xA084, 0x7220, 0xA085, 0x7221, + 0xA086, 0x7222, 0xA087, 0x7223, 0xA088, 0x7224, 0xA089, 0x7225, 0xA08A, 0x7226, 0xA08B, 0x7227, 0xA08C, 0x7229, 0xA08D, 0x722B, + 0xA08E, 0x722D, 0xA08F, 0x722E, 0xA090, 0x722F, 0xA091, 0x7232, 0xA092, 0x7233, 0xA093, 0x7234, 0xA094, 0x723A, 0xA095, 0x723C, + 0xA096, 0x723E, 0xA097, 0x7240, 0xA098, 0x7241, 0xA099, 0x7242, 0xA09A, 0x7243, 0xA09B, 0x7244, 0xA09C, 0x7245, 0xA09D, 0x7246, + 0xA09E, 0x7249, 0xA09F, 0x724A, 0xA0A0, 0x724B, 0xA0A1, 0x724E, 0xA0A2, 0x724F, 0xA0A3, 0x7250, 0xA0A4, 0x7251, 0xA0A5, 0x7253, + 0xA0A6, 0x7254, 0xA0A7, 0x7255, 0xA0A8, 0x7257, 0xA0A9, 0x7258, 0xA0AA, 0x725A, 0xA0AB, 0x725C, 0xA0AC, 0x725E, 0xA0AD, 0x7260, + 0xA0AE, 0x7263, 0xA0AF, 0x7264, 0xA0B0, 0x7265, 0xA0B1, 0x7268, 0xA0B2, 0x726A, 0xA0B3, 0x726B, 0xA0B4, 0x726C, 0xA0B5, 0x726D, + 0xA0B6, 0x7270, 0xA0B7, 0x7271, 0xA0B8, 0x7273, 0xA0B9, 0x7274, 0xA0BA, 0x7276, 0xA0BB, 0x7277, 0xA0BC, 0x7278, 0xA0BD, 0x727B, + 0xA0BE, 0x727C, 0xA0BF, 0x727D, 0xA0C0, 0x7282, 0xA0C1, 0x7283, 0xA0C2, 0x7285, 0xA0C3, 0x7286, 0xA0C4, 0x7287, 0xA0C5, 0x7288, + 0xA0C6, 0x7289, 0xA0C7, 0x728C, 0xA0C8, 0x728E, 0xA0C9, 0x7290, 0xA0CA, 0x7291, 0xA0CB, 0x7293, 0xA0CC, 0x7294, 0xA0CD, 0x7295, + 0xA0CE, 0x7296, 0xA0CF, 0x7297, 0xA0D0, 0x7298, 0xA0D1, 0x7299, 0xA0D2, 0x729A, 0xA0D3, 0x729B, 0xA0D4, 0x729C, 0xA0D5, 0x729D, + 0xA0D6, 0x729E, 0xA0D7, 0x72A0, 0xA0D8, 0x72A1, 0xA0D9, 0x72A2, 0xA0DA, 0x72A3, 0xA0DB, 0x72A4, 0xA0DC, 0x72A5, 0xA0DD, 0x72A6, + 0xA0DE, 0x72A7, 0xA0DF, 0x72A8, 0xA0E0, 0x72A9, 0xA0E1, 0x72AA, 0xA0E2, 0x72AB, 0xA0E3, 0x72AE, 0xA0E4, 0x72B1, 0xA0E5, 0x72B2, + 0xA0E6, 0x72B3, 0xA0E7, 0x72B5, 0xA0E8, 0x72BA, 0xA0E9, 0x72BB, 0xA0EA, 0x72BC, 0xA0EB, 0x72BD, 0xA0EC, 0x72BE, 0xA0ED, 0x72BF, + 0xA0EE, 0x72C0, 0xA0EF, 0x72C5, 0xA0F0, 0x72C6, 0xA0F1, 0x72C7, 0xA0F2, 0x72C9, 0xA0F3, 0x72CA, 0xA0F4, 0x72CB, 0xA0F5, 0x72CC, + 0xA0F6, 0x72CF, 0xA0F7, 0x72D1, 0xA0F8, 0x72D3, 0xA0F9, 0x72D4, 0xA0FA, 0x72D5, 0xA0FB, 0x72D6, 0xA0FC, 0x72D8, 0xA0FD, 0x72DA, + 0xA0FE, 0x72DB, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, 0xA1A5, 0x02C9, 0xA1A6, 0x02C7, 0xA1A7, 0x00A8, + 0xA1A8, 0x3003, 0xA1A9, 0x3005, 0xA1AA, 0x2014, 0xA1AB, 0xFF5E, 0xA1AC, 0x2016, 0xA1AD, 0x2026, 0xA1AE, 0x2018, 0xA1AF, 0x2019, + 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, + 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3016, 0xA1BD, 0x3017, 0xA1BE, 0x3010, 0xA1BF, 0x3011, + 0xA1C0, 0x00B1, 0xA1C1, 0x00D7, 0xA1C2, 0x00F7, 0xA1C3, 0x2236, 0xA1C4, 0x2227, 0xA1C5, 0x2228, 0xA1C6, 0x2211, 0xA1C7, 0x220F, + 0xA1C8, 0x222A, 0xA1C9, 0x2229, 0xA1CA, 0x2208, 0xA1CB, 0x2237, 0xA1CC, 0x221A, 0xA1CD, 0x22A5, 0xA1CE, 0x2225, 0xA1CF, 0x2220, + 0xA1D0, 0x2312, 0xA1D1, 0x2299, 0xA1D2, 0x222B, 0xA1D3, 0x222E, 0xA1D4, 0x2261, 0xA1D5, 0x224C, 0xA1D6, 0x2248, 0xA1D7, 0x223D, + 0xA1D8, 0x221D, 0xA1D9, 0x2260, 0xA1DA, 0x226E, 0xA1DB, 0x226F, 0xA1DC, 0x2264, 0xA1DD, 0x2265, 0xA1DE, 0x221E, 0xA1DF, 0x2235, + 0xA1E0, 0x2234, 0xA1E1, 0x2642, 0xA1E2, 0x2640, 0xA1E3, 0x00B0, 0xA1E4, 0x2032, 0xA1E5, 0x2033, 0xA1E6, 0x2103, 0xA1E7, 0xFF04, + 0xA1E8, 0x00A4, 0xA1E9, 0xFFE0, 0xA1EA, 0xFFE1, 0xA1EB, 0x2030, 0xA1EC, 0x00A7, 0xA1ED, 0x2116, 0xA1EE, 0x2606, 0xA1EF, 0x2605, + 0xA1F0, 0x25CB, 0xA1F1, 0x25CF, 0xA1F2, 0x25CE, 0xA1F3, 0x25C7, 0xA1F4, 0x25C6, 0xA1F5, 0x25A1, 0xA1F6, 0x25A0, 0xA1F7, 0x25B3, + 0xA1F8, 0x25B2, 0xA1F9, 0x203B, 0xA1FA, 0x2192, 0xA1FB, 0x2190, 0xA1FC, 0x2191, 0xA1FD, 0x2193, 0xA1FE, 0x3013, 0xA2A1, 0x2170, + 0xA2A2, 0x2171, 0xA2A3, 0x2172, 0xA2A4, 0x2173, 0xA2A5, 0x2174, 0xA2A6, 0x2175, 0xA2A7, 0x2176, 0xA2A8, 0x2177, 0xA2A9, 0x2178, + 0xA2AA, 0x2179, 0xA2B1, 0x2488, 0xA2B2, 0x2489, 0xA2B3, 0x248A, 0xA2B4, 0x248B, 0xA2B5, 0x248C, 0xA2B6, 0x248D, 0xA2B7, 0x248E, + 0xA2B8, 0x248F, 0xA2B9, 0x2490, 0xA2BA, 0x2491, 0xA2BB, 0x2492, 0xA2BC, 0x2493, 0xA2BD, 0x2494, 0xA2BE, 0x2495, 0xA2BF, 0x2496, + 0xA2C0, 0x2497, 0xA2C1, 0x2498, 0xA2C2, 0x2499, 0xA2C3, 0x249A, 0xA2C4, 0x249B, 0xA2C5, 0x2474, 0xA2C6, 0x2475, 0xA2C7, 0x2476, + 0xA2C8, 0x2477, 0xA2C9, 0x2478, 0xA2CA, 0x2479, 0xA2CB, 0x247A, 0xA2CC, 0x247B, 0xA2CD, 0x247C, 0xA2CE, 0x247D, 0xA2CF, 0x247E, + 0xA2D0, 0x247F, 0xA2D1, 0x2480, 0xA2D2, 0x2481, 0xA2D3, 0x2482, 0xA2D4, 0x2483, 0xA2D5, 0x2484, 0xA2D6, 0x2485, 0xA2D7, 0x2486, + 0xA2D8, 0x2487, 0xA2D9, 0x2460, 0xA2DA, 0x2461, 0xA2DB, 0x2462, 0xA2DC, 0x2463, 0xA2DD, 0x2464, 0xA2DE, 0x2465, 0xA2DF, 0x2466, + 0xA2E0, 0x2467, 0xA2E1, 0x2468, 0xA2E2, 0x2469, 0xA2E5, 0x3220, 0xA2E6, 0x3221, 0xA2E7, 0x3222, 0xA2E8, 0x3223, 0xA2E9, 0x3224, + 0xA2EA, 0x3225, 0xA2EB, 0x3226, 0xA2EC, 0x3227, 0xA2ED, 0x3228, 0xA2EE, 0x3229, 0xA2F1, 0x2160, 0xA2F2, 0x2161, 0xA2F3, 0x2162, + 0xA2F4, 0x2163, 0xA2F5, 0x2164, 0xA2F6, 0x2165, 0xA2F7, 0x2166, 0xA2F8, 0x2167, 0xA2F9, 0x2168, 0xA2FA, 0x2169, 0xA2FB, 0x216A, + 0xA2FC, 0x216B, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, 0xA3A4, 0xFFE5, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, 0xA3DC, 0xFF3C, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA4A1, 0x3041, + 0xA4A2, 0x3042, 0xA4A3, 0x3043, 0xA4A4, 0x3044, 0xA4A5, 0x3045, 0xA4A6, 0x3046, 0xA4A7, 0x3047, 0xA4A8, 0x3048, 0xA4A9, 0x3049, + 0xA4AA, 0x304A, 0xA4AB, 0x304B, 0xA4AC, 0x304C, 0xA4AD, 0x304D, 0xA4AE, 0x304E, 0xA4AF, 0x304F, 0xA4B0, 0x3050, 0xA4B1, 0x3051, + 0xA4B2, 0x3052, 0xA4B3, 0x3053, 0xA4B4, 0x3054, 0xA4B5, 0x3055, 0xA4B6, 0x3056, 0xA4B7, 0x3057, 0xA4B8, 0x3058, 0xA4B9, 0x3059, + 0xA4BA, 0x305A, 0xA4BB, 0x305B, 0xA4BC, 0x305C, 0xA4BD, 0x305D, 0xA4BE, 0x305E, 0xA4BF, 0x305F, 0xA4C0, 0x3060, 0xA4C1, 0x3061, + 0xA4C2, 0x3062, 0xA4C3, 0x3063, 0xA4C4, 0x3064, 0xA4C5, 0x3065, 0xA4C6, 0x3066, 0xA4C7, 0x3067, 0xA4C8, 0x3068, 0xA4C9, 0x3069, + 0xA4CA, 0x306A, 0xA4CB, 0x306B, 0xA4CC, 0x306C, 0xA4CD, 0x306D, 0xA4CE, 0x306E, 0xA4CF, 0x306F, 0xA4D0, 0x3070, 0xA4D1, 0x3071, + 0xA4D2, 0x3072, 0xA4D3, 0x3073, 0xA4D4, 0x3074, 0xA4D5, 0x3075, 0xA4D6, 0x3076, 0xA4D7, 0x3077, 0xA4D8, 0x3078, 0xA4D9, 0x3079, + 0xA4DA, 0x307A, 0xA4DB, 0x307B, 0xA4DC, 0x307C, 0xA4DD, 0x307D, 0xA4DE, 0x307E, 0xA4DF, 0x307F, 0xA4E0, 0x3080, 0xA4E1, 0x3081, + 0xA4E2, 0x3082, 0xA4E3, 0x3083, 0xA4E4, 0x3084, 0xA4E5, 0x3085, 0xA4E6, 0x3086, 0xA4E7, 0x3087, 0xA4E8, 0x3088, 0xA4E9, 0x3089, + 0xA4EA, 0x308A, 0xA4EB, 0x308B, 0xA4EC, 0x308C, 0xA4ED, 0x308D, 0xA4EE, 0x308E, 0xA4EF, 0x308F, 0xA4F0, 0x3090, 0xA4F1, 0x3091, + 0xA4F2, 0x3092, 0xA4F3, 0x3093, 0xA5A1, 0x30A1, 0xA5A2, 0x30A2, 0xA5A3, 0x30A3, 0xA5A4, 0x30A4, 0xA5A5, 0x30A5, 0xA5A6, 0x30A6, + 0xA5A7, 0x30A7, 0xA5A8, 0x30A8, 0xA5A9, 0x30A9, 0xA5AA, 0x30AA, 0xA5AB, 0x30AB, 0xA5AC, 0x30AC, 0xA5AD, 0x30AD, 0xA5AE, 0x30AE, + 0xA5AF, 0x30AF, 0xA5B0, 0x30B0, 0xA5B1, 0x30B1, 0xA5B2, 0x30B2, 0xA5B3, 0x30B3, 0xA5B4, 0x30B4, 0xA5B5, 0x30B5, 0xA5B6, 0x30B6, + 0xA5B7, 0x30B7, 0xA5B8, 0x30B8, 0xA5B9, 0x30B9, 0xA5BA, 0x30BA, 0xA5BB, 0x30BB, 0xA5BC, 0x30BC, 0xA5BD, 0x30BD, 0xA5BE, 0x30BE, + 0xA5BF, 0x30BF, 0xA5C0, 0x30C0, 0xA5C1, 0x30C1, 0xA5C2, 0x30C2, 0xA5C3, 0x30C3, 0xA5C4, 0x30C4, 0xA5C5, 0x30C5, 0xA5C6, 0x30C6, + 0xA5C7, 0x30C7, 0xA5C8, 0x30C8, 0xA5C9, 0x30C9, 0xA5CA, 0x30CA, 0xA5CB, 0x30CB, 0xA5CC, 0x30CC, 0xA5CD, 0x30CD, 0xA5CE, 0x30CE, + 0xA5CF, 0x30CF, 0xA5D0, 0x30D0, 0xA5D1, 0x30D1, 0xA5D2, 0x30D2, 0xA5D3, 0x30D3, 0xA5D4, 0x30D4, 0xA5D5, 0x30D5, 0xA5D6, 0x30D6, + 0xA5D7, 0x30D7, 0xA5D8, 0x30D8, 0xA5D9, 0x30D9, 0xA5DA, 0x30DA, 0xA5DB, 0x30DB, 0xA5DC, 0x30DC, 0xA5DD, 0x30DD, 0xA5DE, 0x30DE, + 0xA5DF, 0x30DF, 0xA5E0, 0x30E0, 0xA5E1, 0x30E1, 0xA5E2, 0x30E2, 0xA5E3, 0x30E3, 0xA5E4, 0x30E4, 0xA5E5, 0x30E5, 0xA5E6, 0x30E6, + 0xA5E7, 0x30E7, 0xA5E8, 0x30E8, 0xA5E9, 0x30E9, 0xA5EA, 0x30EA, 0xA5EB, 0x30EB, 0xA5EC, 0x30EC, 0xA5ED, 0x30ED, 0xA5EE, 0x30EE, + 0xA5EF, 0x30EF, 0xA5F0, 0x30F0, 0xA5F1, 0x30F1, 0xA5F2, 0x30F2, 0xA5F3, 0x30F3, 0xA5F4, 0x30F4, 0xA5F5, 0x30F5, 0xA5F6, 0x30F6, + 0xA6A1, 0x0391, 0xA6A2, 0x0392, 0xA6A3, 0x0393, 0xA6A4, 0x0394, 0xA6A5, 0x0395, 0xA6A6, 0x0396, 0xA6A7, 0x0397, 0xA6A8, 0x0398, + 0xA6A9, 0x0399, 0xA6AA, 0x039A, 0xA6AB, 0x039B, 0xA6AC, 0x039C, 0xA6AD, 0x039D, 0xA6AE, 0x039E, 0xA6AF, 0x039F, 0xA6B0, 0x03A0, + 0xA6B1, 0x03A1, 0xA6B2, 0x03A3, 0xA6B3, 0x03A4, 0xA6B4, 0x03A5, 0xA6B5, 0x03A6, 0xA6B6, 0x03A7, 0xA6B7, 0x03A8, 0xA6B8, 0x03A9, + 0xA6C1, 0x03B1, 0xA6C2, 0x03B2, 0xA6C3, 0x03B3, 0xA6C4, 0x03B4, 0xA6C5, 0x03B5, 0xA6C6, 0x03B6, 0xA6C7, 0x03B7, 0xA6C8, 0x03B8, + 0xA6C9, 0x03B9, 0xA6CA, 0x03BA, 0xA6CB, 0x03BB, 0xA6CC, 0x03BC, 0xA6CD, 0x03BD, 0xA6CE, 0x03BE, 0xA6CF, 0x03BF, 0xA6D0, 0x03C0, + 0xA6D1, 0x03C1, 0xA6D2, 0x03C3, 0xA6D3, 0x03C4, 0xA6D4, 0x03C5, 0xA6D5, 0x03C6, 0xA6D6, 0x03C7, 0xA6D7, 0x03C8, 0xA6D8, 0x03C9, + 0xA6E0, 0xFE35, 0xA6E1, 0xFE36, 0xA6E2, 0xFE39, 0xA6E3, 0xFE3A, 0xA6E4, 0xFE3F, 0xA6E5, 0xFE40, 0xA6E6, 0xFE3D, 0xA6E7, 0xFE3E, + 0xA6E8, 0xFE41, 0xA6E9, 0xFE42, 0xA6EA, 0xFE43, 0xA6EB, 0xFE44, 0xA6EE, 0xFE3B, 0xA6EF, 0xFE3C, 0xA6F0, 0xFE37, 0xA6F1, 0xFE38, + 0xA6F2, 0xFE31, 0xA6F4, 0xFE33, 0xA6F5, 0xFE34, 0xA7A1, 0x0410, 0xA7A2, 0x0411, 0xA7A3, 0x0412, 0xA7A4, 0x0413, 0xA7A5, 0x0414, + 0xA7A6, 0x0415, 0xA7A7, 0x0401, 0xA7A8, 0x0416, 0xA7A9, 0x0417, 0xA7AA, 0x0418, 0xA7AB, 0x0419, 0xA7AC, 0x041A, 0xA7AD, 0x041B, + 0xA7AE, 0x041C, 0xA7AF, 0x041D, 0xA7B0, 0x041E, 0xA7B1, 0x041F, 0xA7B2, 0x0420, 0xA7B3, 0x0421, 0xA7B4, 0x0422, 0xA7B5, 0x0423, + 0xA7B6, 0x0424, 0xA7B7, 0x0425, 0xA7B8, 0x0426, 0xA7B9, 0x0427, 0xA7BA, 0x0428, 0xA7BB, 0x0429, 0xA7BC, 0x042A, 0xA7BD, 0x042B, + 0xA7BE, 0x042C, 0xA7BF, 0x042D, 0xA7C0, 0x042E, 0xA7C1, 0x042F, 0xA7D1, 0x0430, 0xA7D2, 0x0431, 0xA7D3, 0x0432, 0xA7D4, 0x0433, + 0xA7D5, 0x0434, 0xA7D6, 0x0435, 0xA7D7, 0x0451, 0xA7D8, 0x0436, 0xA7D9, 0x0437, 0xA7DA, 0x0438, 0xA7DB, 0x0439, 0xA7DC, 0x043A, + 0xA7DD, 0x043B, 0xA7DE, 0x043C, 0xA7DF, 0x043D, 0xA7E0, 0x043E, 0xA7E1, 0x043F, 0xA7E2, 0x0440, 0xA7E3, 0x0441, 0xA7E4, 0x0442, + 0xA7E5, 0x0443, 0xA7E6, 0x0444, 0xA7E7, 0x0445, 0xA7E8, 0x0446, 0xA7E9, 0x0447, 0xA7EA, 0x0448, 0xA7EB, 0x0449, 0xA7EC, 0x044A, + 0xA7ED, 0x044B, 0xA7EE, 0x044C, 0xA7EF, 0x044D, 0xA7F0, 0x044E, 0xA7F1, 0x044F, 0xA840, 0x02CA, 0xA841, 0x02CB, 0xA842, 0x02D9, + 0xA843, 0x2013, 0xA844, 0x2015, 0xA845, 0x2025, 0xA846, 0x2035, 0xA847, 0x2105, 0xA848, 0x2109, 0xA849, 0x2196, 0xA84A, 0x2197, + 0xA84B, 0x2198, 0xA84C, 0x2199, 0xA84D, 0x2215, 0xA84E, 0x221F, 0xA84F, 0x2223, 0xA850, 0x2252, 0xA851, 0x2266, 0xA852, 0x2267, + 0xA853, 0x22BF, 0xA854, 0x2550, 0xA855, 0x2551, 0xA856, 0x2552, 0xA857, 0x2553, 0xA858, 0x2554, 0xA859, 0x2555, 0xA85A, 0x2556, + 0xA85B, 0x2557, 0xA85C, 0x2558, 0xA85D, 0x2559, 0xA85E, 0x255A, 0xA85F, 0x255B, 0xA860, 0x255C, 0xA861, 0x255D, 0xA862, 0x255E, + 0xA863, 0x255F, 0xA864, 0x2560, 0xA865, 0x2561, 0xA866, 0x2562, 0xA867, 0x2563, 0xA868, 0x2564, 0xA869, 0x2565, 0xA86A, 0x2566, + 0xA86B, 0x2567, 0xA86C, 0x2568, 0xA86D, 0x2569, 0xA86E, 0x256A, 0xA86F, 0x256B, 0xA870, 0x256C, 0xA871, 0x256D, 0xA872, 0x256E, + 0xA873, 0x256F, 0xA874, 0x2570, 0xA875, 0x2571, 0xA876, 0x2572, 0xA877, 0x2573, 0xA878, 0x2581, 0xA879, 0x2582, 0xA87A, 0x2583, + 0xA87B, 0x2584, 0xA87C, 0x2585, 0xA87D, 0x2586, 0xA87E, 0x2587, 0xA880, 0x2588, 0xA881, 0x2589, 0xA882, 0x258A, 0xA883, 0x258B, + 0xA884, 0x258C, 0xA885, 0x258D, 0xA886, 0x258E, 0xA887, 0x258F, 0xA888, 0x2593, 0xA889, 0x2594, 0xA88A, 0x2595, 0xA88B, 0x25BC, + 0xA88C, 0x25BD, 0xA88D, 0x25E2, 0xA88E, 0x25E3, 0xA88F, 0x25E4, 0xA890, 0x25E5, 0xA891, 0x2609, 0xA892, 0x2295, 0xA893, 0x3012, + 0xA894, 0x301D, 0xA895, 0x301E, 0xA8A1, 0x0101, 0xA8A2, 0x00E1, 0xA8A3, 0x01CE, 0xA8A4, 0x00E0, 0xA8A5, 0x0113, 0xA8A6, 0x00E9, + 0xA8A7, 0x011B, 0xA8A8, 0x00E8, 0xA8A9, 0x012B, 0xA8AA, 0x00ED, 0xA8AB, 0x01D0, 0xA8AC, 0x00EC, 0xA8AD, 0x014D, 0xA8AE, 0x00F3, + 0xA8AF, 0x01D2, 0xA8B0, 0x00F2, 0xA8B1, 0x016B, 0xA8B2, 0x00FA, 0xA8B3, 0x01D4, 0xA8B4, 0x00F9, 0xA8B5, 0x01D6, 0xA8B6, 0x01D8, + 0xA8B7, 0x01DA, 0xA8B8, 0x01DC, 0xA8B9, 0x00FC, 0xA8BA, 0x00EA, 0xA8BB, 0x0251, 0xA8BD, 0x0144, 0xA8BE, 0x0148, 0xA8C0, 0x0261, + 0xA8C5, 0x3105, 0xA8C6, 0x3106, 0xA8C7, 0x3107, 0xA8C8, 0x3108, 0xA8C9, 0x3109, 0xA8CA, 0x310A, 0xA8CB, 0x310B, 0xA8CC, 0x310C, + 0xA8CD, 0x310D, 0xA8CE, 0x310E, 0xA8CF, 0x310F, 0xA8D0, 0x3110, 0xA8D1, 0x3111, 0xA8D2, 0x3112, 0xA8D3, 0x3113, 0xA8D4, 0x3114, + 0xA8D5, 0x3115, 0xA8D6, 0x3116, 0xA8D7, 0x3117, 0xA8D8, 0x3118, 0xA8D9, 0x3119, 0xA8DA, 0x311A, 0xA8DB, 0x311B, 0xA8DC, 0x311C, + 0xA8DD, 0x311D, 0xA8DE, 0x311E, 0xA8DF, 0x311F, 0xA8E0, 0x3120, 0xA8E1, 0x3121, 0xA8E2, 0x3122, 0xA8E3, 0x3123, 0xA8E4, 0x3124, + 0xA8E5, 0x3125, 0xA8E6, 0x3126, 0xA8E7, 0x3127, 0xA8E8, 0x3128, 0xA8E9, 0x3129, 0xA940, 0x3021, 0xA941, 0x3022, 0xA942, 0x3023, + 0xA943, 0x3024, 0xA944, 0x3025, 0xA945, 0x3026, 0xA946, 0x3027, 0xA947, 0x3028, 0xA948, 0x3029, 0xA949, 0x32A3, 0xA94A, 0x338E, + 0xA94B, 0x338F, 0xA94C, 0x339C, 0xA94D, 0x339D, 0xA94E, 0x339E, 0xA94F, 0x33A1, 0xA950, 0x33C4, 0xA951, 0x33CE, 0xA952, 0x33D1, + 0xA953, 0x33D2, 0xA954, 0x33D5, 0xA955, 0xFE30, 0xA956, 0xFFE2, 0xA957, 0xFFE4, 0xA959, 0x2121, 0xA95A, 0x3231, 0xA95C, 0x2010, + 0xA960, 0x30FC, 0xA961, 0x309B, 0xA962, 0x309C, 0xA963, 0x30FD, 0xA964, 0x30FE, 0xA965, 0x3006, 0xA966, 0x309D, 0xA967, 0x309E, + 0xA968, 0xFE49, 0xA969, 0xFE4A, 0xA96A, 0xFE4B, 0xA96B, 0xFE4C, 0xA96C, 0xFE4D, 0xA96D, 0xFE4E, 0xA96E, 0xFE4F, 0xA96F, 0xFE50, + 0xA970, 0xFE51, 0xA971, 0xFE52, 0xA972, 0xFE54, 0xA973, 0xFE55, 0xA974, 0xFE56, 0xA975, 0xFE57, 0xA976, 0xFE59, 0xA977, 0xFE5A, + 0xA978, 0xFE5B, 0xA979, 0xFE5C, 0xA97A, 0xFE5D, 0xA97B, 0xFE5E, 0xA97C, 0xFE5F, 0xA97D, 0xFE60, 0xA97E, 0xFE61, 0xA980, 0xFE62, + 0xA981, 0xFE63, 0xA982, 0xFE64, 0xA983, 0xFE65, 0xA984, 0xFE66, 0xA985, 0xFE68, 0xA986, 0xFE69, 0xA987, 0xFE6A, 0xA988, 0xFE6B, + 0xA996, 0x3007, 0xA9A4, 0x2500, 0xA9A5, 0x2501, 0xA9A6, 0x2502, 0xA9A7, 0x2503, 0xA9A8, 0x2504, 0xA9A9, 0x2505, 0xA9AA, 0x2506, + 0xA9AB, 0x2507, 0xA9AC, 0x2508, 0xA9AD, 0x2509, 0xA9AE, 0x250A, 0xA9AF, 0x250B, 0xA9B0, 0x250C, 0xA9B1, 0x250D, 0xA9B2, 0x250E, + 0xA9B3, 0x250F, 0xA9B4, 0x2510, 0xA9B5, 0x2511, 0xA9B6, 0x2512, 0xA9B7, 0x2513, 0xA9B8, 0x2514, 0xA9B9, 0x2515, 0xA9BA, 0x2516, + 0xA9BB, 0x2517, 0xA9BC, 0x2518, 0xA9BD, 0x2519, 0xA9BE, 0x251A, 0xA9BF, 0x251B, 0xA9C0, 0x251C, 0xA9C1, 0x251D, 0xA9C2, 0x251E, + 0xA9C3, 0x251F, 0xA9C4, 0x2520, 0xA9C5, 0x2521, 0xA9C6, 0x2522, 0xA9C7, 0x2523, 0xA9C8, 0x2524, 0xA9C9, 0x2525, 0xA9CA, 0x2526, + 0xA9CB, 0x2527, 0xA9CC, 0x2528, 0xA9CD, 0x2529, 0xA9CE, 0x252A, 0xA9CF, 0x252B, 0xA9D0, 0x252C, 0xA9D1, 0x252D, 0xA9D2, 0x252E, + 0xA9D3, 0x252F, 0xA9D4, 0x2530, 0xA9D5, 0x2531, 0xA9D6, 0x2532, 0xA9D7, 0x2533, 0xA9D8, 0x2534, 0xA9D9, 0x2535, 0xA9DA, 0x2536, + 0xA9DB, 0x2537, 0xA9DC, 0x2538, 0xA9DD, 0x2539, 0xA9DE, 0x253A, 0xA9DF, 0x253B, 0xA9E0, 0x253C, 0xA9E1, 0x253D, 0xA9E2, 0x253E, + 0xA9E3, 0x253F, 0xA9E4, 0x2540, 0xA9E5, 0x2541, 0xA9E6, 0x2542, 0xA9E7, 0x2543, 0xA9E8, 0x2544, 0xA9E9, 0x2545, 0xA9EA, 0x2546, + 0xA9EB, 0x2547, 0xA9EC, 0x2548, 0xA9ED, 0x2549, 0xA9EE, 0x254A, 0xA9EF, 0x254B, 0xAA40, 0x72DC, 0xAA41, 0x72DD, 0xAA42, 0x72DF, + 0xAA43, 0x72E2, 0xAA44, 0x72E3, 0xAA45, 0x72E4, 0xAA46, 0x72E5, 0xAA47, 0x72E6, 0xAA48, 0x72E7, 0xAA49, 0x72EA, 0xAA4A, 0x72EB, + 0xAA4B, 0x72F5, 0xAA4C, 0x72F6, 0xAA4D, 0x72F9, 0xAA4E, 0x72FD, 0xAA4F, 0x72FE, 0xAA50, 0x72FF, 0xAA51, 0x7300, 0xAA52, 0x7302, + 0xAA53, 0x7304, 0xAA54, 0x7305, 0xAA55, 0x7306, 0xAA56, 0x7307, 0xAA57, 0x7308, 0xAA58, 0x7309, 0xAA59, 0x730B, 0xAA5A, 0x730C, + 0xAA5B, 0x730D, 0xAA5C, 0x730F, 0xAA5D, 0x7310, 0xAA5E, 0x7311, 0xAA5F, 0x7312, 0xAA60, 0x7314, 0xAA61, 0x7318, 0xAA62, 0x7319, + 0xAA63, 0x731A, 0xAA64, 0x731F, 0xAA65, 0x7320, 0xAA66, 0x7323, 0xAA67, 0x7324, 0xAA68, 0x7326, 0xAA69, 0x7327, 0xAA6A, 0x7328, + 0xAA6B, 0x732D, 0xAA6C, 0x732F, 0xAA6D, 0x7330, 0xAA6E, 0x7332, 0xAA6F, 0x7333, 0xAA70, 0x7335, 0xAA71, 0x7336, 0xAA72, 0x733A, + 0xAA73, 0x733B, 0xAA74, 0x733C, 0xAA75, 0x733D, 0xAA76, 0x7340, 0xAA77, 0x7341, 0xAA78, 0x7342, 0xAA79, 0x7343, 0xAA7A, 0x7344, + 0xAA7B, 0x7345, 0xAA7C, 0x7346, 0xAA7D, 0x7347, 0xAA7E, 0x7348, 0xAA80, 0x7349, 0xAA81, 0x734A, 0xAA82, 0x734B, 0xAA83, 0x734C, + 0xAA84, 0x734E, 0xAA85, 0x734F, 0xAA86, 0x7351, 0xAA87, 0x7353, 0xAA88, 0x7354, 0xAA89, 0x7355, 0xAA8A, 0x7356, 0xAA8B, 0x7358, + 0xAA8C, 0x7359, 0xAA8D, 0x735A, 0xAA8E, 0x735B, 0xAA8F, 0x735C, 0xAA90, 0x735D, 0xAA91, 0x735E, 0xAA92, 0x735F, 0xAA93, 0x7361, + 0xAA94, 0x7362, 0xAA95, 0x7363, 0xAA96, 0x7364, 0xAA97, 0x7365, 0xAA98, 0x7366, 0xAA99, 0x7367, 0xAA9A, 0x7368, 0xAA9B, 0x7369, + 0xAA9C, 0x736A, 0xAA9D, 0x736B, 0xAA9E, 0x736E, 0xAA9F, 0x7370, 0xAAA0, 0x7371, 0xAB40, 0x7372, 0xAB41, 0x7373, 0xAB42, 0x7374, + 0xAB43, 0x7375, 0xAB44, 0x7376, 0xAB45, 0x7377, 0xAB46, 0x7378, 0xAB47, 0x7379, 0xAB48, 0x737A, 0xAB49, 0x737B, 0xAB4A, 0x737C, + 0xAB4B, 0x737D, 0xAB4C, 0x737F, 0xAB4D, 0x7380, 0xAB4E, 0x7381, 0xAB4F, 0x7382, 0xAB50, 0x7383, 0xAB51, 0x7385, 0xAB52, 0x7386, + 0xAB53, 0x7388, 0xAB54, 0x738A, 0xAB55, 0x738C, 0xAB56, 0x738D, 0xAB57, 0x738F, 0xAB58, 0x7390, 0xAB59, 0x7392, 0xAB5A, 0x7393, + 0xAB5B, 0x7394, 0xAB5C, 0x7395, 0xAB5D, 0x7397, 0xAB5E, 0x7398, 0xAB5F, 0x7399, 0xAB60, 0x739A, 0xAB61, 0x739C, 0xAB62, 0x739D, + 0xAB63, 0x739E, 0xAB64, 0x73A0, 0xAB65, 0x73A1, 0xAB66, 0x73A3, 0xAB67, 0x73A4, 0xAB68, 0x73A5, 0xAB69, 0x73A6, 0xAB6A, 0x73A7, + 0xAB6B, 0x73A8, 0xAB6C, 0x73AA, 0xAB6D, 0x73AC, 0xAB6E, 0x73AD, 0xAB6F, 0x73B1, 0xAB70, 0x73B4, 0xAB71, 0x73B5, 0xAB72, 0x73B6, + 0xAB73, 0x73B8, 0xAB74, 0x73B9, 0xAB75, 0x73BC, 0xAB76, 0x73BD, 0xAB77, 0x73BE, 0xAB78, 0x73BF, 0xAB79, 0x73C1, 0xAB7A, 0x73C3, + 0xAB7B, 0x73C4, 0xAB7C, 0x73C5, 0xAB7D, 0x73C6, 0xAB7E, 0x73C7, 0xAB80, 0x73CB, 0xAB81, 0x73CC, 0xAB82, 0x73CE, 0xAB83, 0x73D2, + 0xAB84, 0x73D3, 0xAB85, 0x73D4, 0xAB86, 0x73D5, 0xAB87, 0x73D6, 0xAB88, 0x73D7, 0xAB89, 0x73D8, 0xAB8A, 0x73DA, 0xAB8B, 0x73DB, + 0xAB8C, 0x73DC, 0xAB8D, 0x73DD, 0xAB8E, 0x73DF, 0xAB8F, 0x73E1, 0xAB90, 0x73E2, 0xAB91, 0x73E3, 0xAB92, 0x73E4, 0xAB93, 0x73E6, + 0xAB94, 0x73E8, 0xAB95, 0x73EA, 0xAB96, 0x73EB, 0xAB97, 0x73EC, 0xAB98, 0x73EE, 0xAB99, 0x73EF, 0xAB9A, 0x73F0, 0xAB9B, 0x73F1, + 0xAB9C, 0x73F3, 0xAB9D, 0x73F4, 0xAB9E, 0x73F5, 0xAB9F, 0x73F6, 0xABA0, 0x73F7, 0xAC40, 0x73F8, 0xAC41, 0x73F9, 0xAC42, 0x73FA, + 0xAC43, 0x73FB, 0xAC44, 0x73FC, 0xAC45, 0x73FD, 0xAC46, 0x73FE, 0xAC47, 0x73FF, 0xAC48, 0x7400, 0xAC49, 0x7401, 0xAC4A, 0x7402, + 0xAC4B, 0x7404, 0xAC4C, 0x7407, 0xAC4D, 0x7408, 0xAC4E, 0x740B, 0xAC4F, 0x740C, 0xAC50, 0x740D, 0xAC51, 0x740E, 0xAC52, 0x7411, + 0xAC53, 0x7412, 0xAC54, 0x7413, 0xAC55, 0x7414, 0xAC56, 0x7415, 0xAC57, 0x7416, 0xAC58, 0x7417, 0xAC59, 0x7418, 0xAC5A, 0x7419, + 0xAC5B, 0x741C, 0xAC5C, 0x741D, 0xAC5D, 0x741E, 0xAC5E, 0x741F, 0xAC5F, 0x7420, 0xAC60, 0x7421, 0xAC61, 0x7423, 0xAC62, 0x7424, + 0xAC63, 0x7427, 0xAC64, 0x7429, 0xAC65, 0x742B, 0xAC66, 0x742D, 0xAC67, 0x742F, 0xAC68, 0x7431, 0xAC69, 0x7432, 0xAC6A, 0x7437, + 0xAC6B, 0x7438, 0xAC6C, 0x7439, 0xAC6D, 0x743A, 0xAC6E, 0x743B, 0xAC6F, 0x743D, 0xAC70, 0x743E, 0xAC71, 0x743F, 0xAC72, 0x7440, + 0xAC73, 0x7442, 0xAC74, 0x7443, 0xAC75, 0x7444, 0xAC76, 0x7445, 0xAC77, 0x7446, 0xAC78, 0x7447, 0xAC79, 0x7448, 0xAC7A, 0x7449, + 0xAC7B, 0x744A, 0xAC7C, 0x744B, 0xAC7D, 0x744C, 0xAC7E, 0x744D, 0xAC80, 0x744E, 0xAC81, 0x744F, 0xAC82, 0x7450, 0xAC83, 0x7451, + 0xAC84, 0x7452, 0xAC85, 0x7453, 0xAC86, 0x7454, 0xAC87, 0x7456, 0xAC88, 0x7458, 0xAC89, 0x745D, 0xAC8A, 0x7460, 0xAC8B, 0x7461, + 0xAC8C, 0x7462, 0xAC8D, 0x7463, 0xAC8E, 0x7464, 0xAC8F, 0x7465, 0xAC90, 0x7466, 0xAC91, 0x7467, 0xAC92, 0x7468, 0xAC93, 0x7469, + 0xAC94, 0x746A, 0xAC95, 0x746B, 0xAC96, 0x746C, 0xAC97, 0x746E, 0xAC98, 0x746F, 0xAC99, 0x7471, 0xAC9A, 0x7472, 0xAC9B, 0x7473, + 0xAC9C, 0x7474, 0xAC9D, 0x7475, 0xAC9E, 0x7478, 0xAC9F, 0x7479, 0xACA0, 0x747A, 0xAD40, 0x747B, 0xAD41, 0x747C, 0xAD42, 0x747D, + 0xAD43, 0x747F, 0xAD44, 0x7482, 0xAD45, 0x7484, 0xAD46, 0x7485, 0xAD47, 0x7486, 0xAD48, 0x7488, 0xAD49, 0x7489, 0xAD4A, 0x748A, + 0xAD4B, 0x748C, 0xAD4C, 0x748D, 0xAD4D, 0x748F, 0xAD4E, 0x7491, 0xAD4F, 0x7492, 0xAD50, 0x7493, 0xAD51, 0x7494, 0xAD52, 0x7495, + 0xAD53, 0x7496, 0xAD54, 0x7497, 0xAD55, 0x7498, 0xAD56, 0x7499, 0xAD57, 0x749A, 0xAD58, 0x749B, 0xAD59, 0x749D, 0xAD5A, 0x749F, + 0xAD5B, 0x74A0, 0xAD5C, 0x74A1, 0xAD5D, 0x74A2, 0xAD5E, 0x74A3, 0xAD5F, 0x74A4, 0xAD60, 0x74A5, 0xAD61, 0x74A6, 0xAD62, 0x74AA, + 0xAD63, 0x74AB, 0xAD64, 0x74AC, 0xAD65, 0x74AD, 0xAD66, 0x74AE, 0xAD67, 0x74AF, 0xAD68, 0x74B0, 0xAD69, 0x74B1, 0xAD6A, 0x74B2, + 0xAD6B, 0x74B3, 0xAD6C, 0x74B4, 0xAD6D, 0x74B5, 0xAD6E, 0x74B6, 0xAD6F, 0x74B7, 0xAD70, 0x74B8, 0xAD71, 0x74B9, 0xAD72, 0x74BB, + 0xAD73, 0x74BC, 0xAD74, 0x74BD, 0xAD75, 0x74BE, 0xAD76, 0x74BF, 0xAD77, 0x74C0, 0xAD78, 0x74C1, 0xAD79, 0x74C2, 0xAD7A, 0x74C3, + 0xAD7B, 0x74C4, 0xAD7C, 0x74C5, 0xAD7D, 0x74C6, 0xAD7E, 0x74C7, 0xAD80, 0x74C8, 0xAD81, 0x74C9, 0xAD82, 0x74CA, 0xAD83, 0x74CB, + 0xAD84, 0x74CC, 0xAD85, 0x74CD, 0xAD86, 0x74CE, 0xAD87, 0x74CF, 0xAD88, 0x74D0, 0xAD89, 0x74D1, 0xAD8A, 0x74D3, 0xAD8B, 0x74D4, + 0xAD8C, 0x74D5, 0xAD8D, 0x74D6, 0xAD8E, 0x74D7, 0xAD8F, 0x74D8, 0xAD90, 0x74D9, 0xAD91, 0x74DA, 0xAD92, 0x74DB, 0xAD93, 0x74DD, + 0xAD94, 0x74DF, 0xAD95, 0x74E1, 0xAD96, 0x74E5, 0xAD97, 0x74E7, 0xAD98, 0x74E8, 0xAD99, 0x74E9, 0xAD9A, 0x74EA, 0xAD9B, 0x74EB, + 0xAD9C, 0x74EC, 0xAD9D, 0x74ED, 0xAD9E, 0x74F0, 0xAD9F, 0x74F1, 0xADA0, 0x74F2, 0xAE40, 0x74F3, 0xAE41, 0x74F5, 0xAE42, 0x74F8, + 0xAE43, 0x74F9, 0xAE44, 0x74FA, 0xAE45, 0x74FB, 0xAE46, 0x74FC, 0xAE47, 0x74FD, 0xAE48, 0x74FE, 0xAE49, 0x7500, 0xAE4A, 0x7501, + 0xAE4B, 0x7502, 0xAE4C, 0x7503, 0xAE4D, 0x7505, 0xAE4E, 0x7506, 0xAE4F, 0x7507, 0xAE50, 0x7508, 0xAE51, 0x7509, 0xAE52, 0x750A, + 0xAE53, 0x750B, 0xAE54, 0x750C, 0xAE55, 0x750E, 0xAE56, 0x7510, 0xAE57, 0x7512, 0xAE58, 0x7514, 0xAE59, 0x7515, 0xAE5A, 0x7516, + 0xAE5B, 0x7517, 0xAE5C, 0x751B, 0xAE5D, 0x751D, 0xAE5E, 0x751E, 0xAE5F, 0x7520, 0xAE60, 0x7521, 0xAE61, 0x7522, 0xAE62, 0x7523, + 0xAE63, 0x7524, 0xAE64, 0x7526, 0xAE65, 0x7527, 0xAE66, 0x752A, 0xAE67, 0x752E, 0xAE68, 0x7534, 0xAE69, 0x7536, 0xAE6A, 0x7539, + 0xAE6B, 0x753C, 0xAE6C, 0x753D, 0xAE6D, 0x753F, 0xAE6E, 0x7541, 0xAE6F, 0x7542, 0xAE70, 0x7543, 0xAE71, 0x7544, 0xAE72, 0x7546, + 0xAE73, 0x7547, 0xAE74, 0x7549, 0xAE75, 0x754A, 0xAE76, 0x754D, 0xAE77, 0x7550, 0xAE78, 0x7551, 0xAE79, 0x7552, 0xAE7A, 0x7553, + 0xAE7B, 0x7555, 0xAE7C, 0x7556, 0xAE7D, 0x7557, 0xAE7E, 0x7558, 0xAE80, 0x755D, 0xAE81, 0x755E, 0xAE82, 0x755F, 0xAE83, 0x7560, + 0xAE84, 0x7561, 0xAE85, 0x7562, 0xAE86, 0x7563, 0xAE87, 0x7564, 0xAE88, 0x7567, 0xAE89, 0x7568, 0xAE8A, 0x7569, 0xAE8B, 0x756B, + 0xAE8C, 0x756C, 0xAE8D, 0x756D, 0xAE8E, 0x756E, 0xAE8F, 0x756F, 0xAE90, 0x7570, 0xAE91, 0x7571, 0xAE92, 0x7573, 0xAE93, 0x7575, + 0xAE94, 0x7576, 0xAE95, 0x7577, 0xAE96, 0x757A, 0xAE97, 0x757B, 0xAE98, 0x757C, 0xAE99, 0x757D, 0xAE9A, 0x757E, 0xAE9B, 0x7580, + 0xAE9C, 0x7581, 0xAE9D, 0x7582, 0xAE9E, 0x7584, 0xAE9F, 0x7585, 0xAEA0, 0x7587, 0xAF40, 0x7588, 0xAF41, 0x7589, 0xAF42, 0x758A, + 0xAF43, 0x758C, 0xAF44, 0x758D, 0xAF45, 0x758E, 0xAF46, 0x7590, 0xAF47, 0x7593, 0xAF48, 0x7595, 0xAF49, 0x7598, 0xAF4A, 0x759B, + 0xAF4B, 0x759C, 0xAF4C, 0x759E, 0xAF4D, 0x75A2, 0xAF4E, 0x75A6, 0xAF4F, 0x75A7, 0xAF50, 0x75A8, 0xAF51, 0x75A9, 0xAF52, 0x75AA, + 0xAF53, 0x75AD, 0xAF54, 0x75B6, 0xAF55, 0x75B7, 0xAF56, 0x75BA, 0xAF57, 0x75BB, 0xAF58, 0x75BF, 0xAF59, 0x75C0, 0xAF5A, 0x75C1, + 0xAF5B, 0x75C6, 0xAF5C, 0x75CB, 0xAF5D, 0x75CC, 0xAF5E, 0x75CE, 0xAF5F, 0x75CF, 0xAF60, 0x75D0, 0xAF61, 0x75D1, 0xAF62, 0x75D3, + 0xAF63, 0x75D7, 0xAF64, 0x75D9, 0xAF65, 0x75DA, 0xAF66, 0x75DC, 0xAF67, 0x75DD, 0xAF68, 0x75DF, 0xAF69, 0x75E0, 0xAF6A, 0x75E1, + 0xAF6B, 0x75E5, 0xAF6C, 0x75E9, 0xAF6D, 0x75EC, 0xAF6E, 0x75ED, 0xAF6F, 0x75EE, 0xAF70, 0x75EF, 0xAF71, 0x75F2, 0xAF72, 0x75F3, + 0xAF73, 0x75F5, 0xAF74, 0x75F6, 0xAF75, 0x75F7, 0xAF76, 0x75F8, 0xAF77, 0x75FA, 0xAF78, 0x75FB, 0xAF79, 0x75FD, 0xAF7A, 0x75FE, + 0xAF7B, 0x7602, 0xAF7C, 0x7604, 0xAF7D, 0x7606, 0xAF7E, 0x7607, 0xAF80, 0x7608, 0xAF81, 0x7609, 0xAF82, 0x760B, 0xAF83, 0x760D, + 0xAF84, 0x760E, 0xAF85, 0x760F, 0xAF86, 0x7611, 0xAF87, 0x7612, 0xAF88, 0x7613, 0xAF89, 0x7614, 0xAF8A, 0x7616, 0xAF8B, 0x761A, + 0xAF8C, 0x761C, 0xAF8D, 0x761D, 0xAF8E, 0x761E, 0xAF8F, 0x7621, 0xAF90, 0x7623, 0xAF91, 0x7627, 0xAF92, 0x7628, 0xAF93, 0x762C, + 0xAF94, 0x762E, 0xAF95, 0x762F, 0xAF96, 0x7631, 0xAF97, 0x7632, 0xAF98, 0x7636, 0xAF99, 0x7637, 0xAF9A, 0x7639, 0xAF9B, 0x763A, + 0xAF9C, 0x763B, 0xAF9D, 0x763D, 0xAF9E, 0x7641, 0xAF9F, 0x7642, 0xAFA0, 0x7644, 0xB040, 0x7645, 0xB041, 0x7646, 0xB042, 0x7647, + 0xB043, 0x7648, 0xB044, 0x7649, 0xB045, 0x764A, 0xB046, 0x764B, 0xB047, 0x764E, 0xB048, 0x764F, 0xB049, 0x7650, 0xB04A, 0x7651, + 0xB04B, 0x7652, 0xB04C, 0x7653, 0xB04D, 0x7655, 0xB04E, 0x7657, 0xB04F, 0x7658, 0xB050, 0x7659, 0xB051, 0x765A, 0xB052, 0x765B, + 0xB053, 0x765D, 0xB054, 0x765F, 0xB055, 0x7660, 0xB056, 0x7661, 0xB057, 0x7662, 0xB058, 0x7664, 0xB059, 0x7665, 0xB05A, 0x7666, + 0xB05B, 0x7667, 0xB05C, 0x7668, 0xB05D, 0x7669, 0xB05E, 0x766A, 0xB05F, 0x766C, 0xB060, 0x766D, 0xB061, 0x766E, 0xB062, 0x7670, + 0xB063, 0x7671, 0xB064, 0x7672, 0xB065, 0x7673, 0xB066, 0x7674, 0xB067, 0x7675, 0xB068, 0x7676, 0xB069, 0x7677, 0xB06A, 0x7679, + 0xB06B, 0x767A, 0xB06C, 0x767C, 0xB06D, 0x767F, 0xB06E, 0x7680, 0xB06F, 0x7681, 0xB070, 0x7683, 0xB071, 0x7685, 0xB072, 0x7689, + 0xB073, 0x768A, 0xB074, 0x768C, 0xB075, 0x768D, 0xB076, 0x768F, 0xB077, 0x7690, 0xB078, 0x7692, 0xB079, 0x7694, 0xB07A, 0x7695, + 0xB07B, 0x7697, 0xB07C, 0x7698, 0xB07D, 0x769A, 0xB07E, 0x769B, 0xB080, 0x769C, 0xB081, 0x769D, 0xB082, 0x769E, 0xB083, 0x769F, + 0xB084, 0x76A0, 0xB085, 0x76A1, 0xB086, 0x76A2, 0xB087, 0x76A3, 0xB088, 0x76A5, 0xB089, 0x76A6, 0xB08A, 0x76A7, 0xB08B, 0x76A8, + 0xB08C, 0x76A9, 0xB08D, 0x76AA, 0xB08E, 0x76AB, 0xB08F, 0x76AC, 0xB090, 0x76AD, 0xB091, 0x76AF, 0xB092, 0x76B0, 0xB093, 0x76B3, + 0xB094, 0x76B5, 0xB095, 0x76B6, 0xB096, 0x76B7, 0xB097, 0x76B8, 0xB098, 0x76B9, 0xB099, 0x76BA, 0xB09A, 0x76BB, 0xB09B, 0x76BC, + 0xB09C, 0x76BD, 0xB09D, 0x76BE, 0xB09E, 0x76C0, 0xB09F, 0x76C1, 0xB0A0, 0x76C3, 0xB0A1, 0x554A, 0xB0A2, 0x963F, 0xB0A3, 0x57C3, + 0xB0A4, 0x6328, 0xB0A5, 0x54CE, 0xB0A6, 0x5509, 0xB0A7, 0x54C0, 0xB0A8, 0x7691, 0xB0A9, 0x764C, 0xB0AA, 0x853C, 0xB0AB, 0x77EE, + 0xB0AC, 0x827E, 0xB0AD, 0x788D, 0xB0AE, 0x7231, 0xB0AF, 0x9698, 0xB0B0, 0x978D, 0xB0B1, 0x6C28, 0xB0B2, 0x5B89, 0xB0B3, 0x4FFA, + 0xB0B4, 0x6309, 0xB0B5, 0x6697, 0xB0B6, 0x5CB8, 0xB0B7, 0x80FA, 0xB0B8, 0x6848, 0xB0B9, 0x80AE, 0xB0BA, 0x6602, 0xB0BB, 0x76CE, + 0xB0BC, 0x51F9, 0xB0BD, 0x6556, 0xB0BE, 0x71AC, 0xB0BF, 0x7FF1, 0xB0C0, 0x8884, 0xB0C1, 0x50B2, 0xB0C2, 0x5965, 0xB0C3, 0x61CA, + 0xB0C4, 0x6FB3, 0xB0C5, 0x82AD, 0xB0C6, 0x634C, 0xB0C7, 0x6252, 0xB0C8, 0x53ED, 0xB0C9, 0x5427, 0xB0CA, 0x7B06, 0xB0CB, 0x516B, + 0xB0CC, 0x75A4, 0xB0CD, 0x5DF4, 0xB0CE, 0x62D4, 0xB0CF, 0x8DCB, 0xB0D0, 0x9776, 0xB0D1, 0x628A, 0xB0D2, 0x8019, 0xB0D3, 0x575D, + 0xB0D4, 0x9738, 0xB0D5, 0x7F62, 0xB0D6, 0x7238, 0xB0D7, 0x767D, 0xB0D8, 0x67CF, 0xB0D9, 0x767E, 0xB0DA, 0x6446, 0xB0DB, 0x4F70, + 0xB0DC, 0x8D25, 0xB0DD, 0x62DC, 0xB0DE, 0x7A17, 0xB0DF, 0x6591, 0xB0E0, 0x73ED, 0xB0E1, 0x642C, 0xB0E2, 0x6273, 0xB0E3, 0x822C, + 0xB0E4, 0x9881, 0xB0E5, 0x677F, 0xB0E6, 0x7248, 0xB0E7, 0x626E, 0xB0E8, 0x62CC, 0xB0E9, 0x4F34, 0xB0EA, 0x74E3, 0xB0EB, 0x534A, + 0xB0EC, 0x529E, 0xB0ED, 0x7ECA, 0xB0EE, 0x90A6, 0xB0EF, 0x5E2E, 0xB0F0, 0x6886, 0xB0F1, 0x699C, 0xB0F2, 0x8180, 0xB0F3, 0x7ED1, + 0xB0F4, 0x68D2, 0xB0F5, 0x78C5, 0xB0F6, 0x868C, 0xB0F7, 0x9551, 0xB0F8, 0x508D, 0xB0F9, 0x8C24, 0xB0FA, 0x82DE, 0xB0FB, 0x80DE, + 0xB0FC, 0x5305, 0xB0FD, 0x8912, 0xB0FE, 0x5265, 0xB140, 0x76C4, 0xB141, 0x76C7, 0xB142, 0x76C9, 0xB143, 0x76CB, 0xB144, 0x76CC, + 0xB145, 0x76D3, 0xB146, 0x76D5, 0xB147, 0x76D9, 0xB148, 0x76DA, 0xB149, 0x76DC, 0xB14A, 0x76DD, 0xB14B, 0x76DE, 0xB14C, 0x76E0, + 0xB14D, 0x76E1, 0xB14E, 0x76E2, 0xB14F, 0x76E3, 0xB150, 0x76E4, 0xB151, 0x76E6, 0xB152, 0x76E7, 0xB153, 0x76E8, 0xB154, 0x76E9, + 0xB155, 0x76EA, 0xB156, 0x76EB, 0xB157, 0x76EC, 0xB158, 0x76ED, 0xB159, 0x76F0, 0xB15A, 0x76F3, 0xB15B, 0x76F5, 0xB15C, 0x76F6, + 0xB15D, 0x76F7, 0xB15E, 0x76FA, 0xB15F, 0x76FB, 0xB160, 0x76FD, 0xB161, 0x76FF, 0xB162, 0x7700, 0xB163, 0x7702, 0xB164, 0x7703, + 0xB165, 0x7705, 0xB166, 0x7706, 0xB167, 0x770A, 0xB168, 0x770C, 0xB169, 0x770E, 0xB16A, 0x770F, 0xB16B, 0x7710, 0xB16C, 0x7711, + 0xB16D, 0x7712, 0xB16E, 0x7713, 0xB16F, 0x7714, 0xB170, 0x7715, 0xB171, 0x7716, 0xB172, 0x7717, 0xB173, 0x7718, 0xB174, 0x771B, + 0xB175, 0x771C, 0xB176, 0x771D, 0xB177, 0x771E, 0xB178, 0x7721, 0xB179, 0x7723, 0xB17A, 0x7724, 0xB17B, 0x7725, 0xB17C, 0x7727, + 0xB17D, 0x772A, 0xB17E, 0x772B, 0xB180, 0x772C, 0xB181, 0x772E, 0xB182, 0x7730, 0xB183, 0x7731, 0xB184, 0x7732, 0xB185, 0x7733, + 0xB186, 0x7734, 0xB187, 0x7739, 0xB188, 0x773B, 0xB189, 0x773D, 0xB18A, 0x773E, 0xB18B, 0x773F, 0xB18C, 0x7742, 0xB18D, 0x7744, + 0xB18E, 0x7745, 0xB18F, 0x7746, 0xB190, 0x7748, 0xB191, 0x7749, 0xB192, 0x774A, 0xB193, 0x774B, 0xB194, 0x774C, 0xB195, 0x774D, + 0xB196, 0x774E, 0xB197, 0x774F, 0xB198, 0x7752, 0xB199, 0x7753, 0xB19A, 0x7754, 0xB19B, 0x7755, 0xB19C, 0x7756, 0xB19D, 0x7757, + 0xB19E, 0x7758, 0xB19F, 0x7759, 0xB1A0, 0x775C, 0xB1A1, 0x8584, 0xB1A2, 0x96F9, 0xB1A3, 0x4FDD, 0xB1A4, 0x5821, 0xB1A5, 0x9971, + 0xB1A6, 0x5B9D, 0xB1A7, 0x62B1, 0xB1A8, 0x62A5, 0xB1A9, 0x66B4, 0xB1AA, 0x8C79, 0xB1AB, 0x9C8D, 0xB1AC, 0x7206, 0xB1AD, 0x676F, + 0xB1AE, 0x7891, 0xB1AF, 0x60B2, 0xB1B0, 0x5351, 0xB1B1, 0x5317, 0xB1B2, 0x8F88, 0xB1B3, 0x80CC, 0xB1B4, 0x8D1D, 0xB1B5, 0x94A1, + 0xB1B6, 0x500D, 0xB1B7, 0x72C8, 0xB1B8, 0x5907, 0xB1B9, 0x60EB, 0xB1BA, 0x7119, 0xB1BB, 0x88AB, 0xB1BC, 0x5954, 0xB1BD, 0x82EF, + 0xB1BE, 0x672C, 0xB1BF, 0x7B28, 0xB1C0, 0x5D29, 0xB1C1, 0x7EF7, 0xB1C2, 0x752D, 0xB1C3, 0x6CF5, 0xB1C4, 0x8E66, 0xB1C5, 0x8FF8, + 0xB1C6, 0x903C, 0xB1C7, 0x9F3B, 0xB1C8, 0x6BD4, 0xB1C9, 0x9119, 0xB1CA, 0x7B14, 0xB1CB, 0x5F7C, 0xB1CC, 0x78A7, 0xB1CD, 0x84D6, + 0xB1CE, 0x853D, 0xB1CF, 0x6BD5, 0xB1D0, 0x6BD9, 0xB1D1, 0x6BD6, 0xB1D2, 0x5E01, 0xB1D3, 0x5E87, 0xB1D4, 0x75F9, 0xB1D5, 0x95ED, + 0xB1D6, 0x655D, 0xB1D7, 0x5F0A, 0xB1D8, 0x5FC5, 0xB1D9, 0x8F9F, 0xB1DA, 0x58C1, 0xB1DB, 0x81C2, 0xB1DC, 0x907F, 0xB1DD, 0x965B, + 0xB1DE, 0x97AD, 0xB1DF, 0x8FB9, 0xB1E0, 0x7F16, 0xB1E1, 0x8D2C, 0xB1E2, 0x6241, 0xB1E3, 0x4FBF, 0xB1E4, 0x53D8, 0xB1E5, 0x535E, + 0xB1E6, 0x8FA8, 0xB1E7, 0x8FA9, 0xB1E8, 0x8FAB, 0xB1E9, 0x904D, 0xB1EA, 0x6807, 0xB1EB, 0x5F6A, 0xB1EC, 0x8198, 0xB1ED, 0x8868, + 0xB1EE, 0x9CD6, 0xB1EF, 0x618B, 0xB1F0, 0x522B, 0xB1F1, 0x762A, 0xB1F2, 0x5F6C, 0xB1F3, 0x658C, 0xB1F4, 0x6FD2, 0xB1F5, 0x6EE8, + 0xB1F6, 0x5BBE, 0xB1F7, 0x6448, 0xB1F8, 0x5175, 0xB1F9, 0x51B0, 0xB1FA, 0x67C4, 0xB1FB, 0x4E19, 0xB1FC, 0x79C9, 0xB1FD, 0x997C, + 0xB1FE, 0x70B3, 0xB240, 0x775D, 0xB241, 0x775E, 0xB242, 0x775F, 0xB243, 0x7760, 0xB244, 0x7764, 0xB245, 0x7767, 0xB246, 0x7769, + 0xB247, 0x776A, 0xB248, 0x776D, 0xB249, 0x776E, 0xB24A, 0x776F, 0xB24B, 0x7770, 0xB24C, 0x7771, 0xB24D, 0x7772, 0xB24E, 0x7773, + 0xB24F, 0x7774, 0xB250, 0x7775, 0xB251, 0x7776, 0xB252, 0x7777, 0xB253, 0x7778, 0xB254, 0x777A, 0xB255, 0x777B, 0xB256, 0x777C, + 0xB257, 0x7781, 0xB258, 0x7782, 0xB259, 0x7783, 0xB25A, 0x7786, 0xB25B, 0x7787, 0xB25C, 0x7788, 0xB25D, 0x7789, 0xB25E, 0x778A, + 0xB25F, 0x778B, 0xB260, 0x778F, 0xB261, 0x7790, 0xB262, 0x7793, 0xB263, 0x7794, 0xB264, 0x7795, 0xB265, 0x7796, 0xB266, 0x7797, + 0xB267, 0x7798, 0xB268, 0x7799, 0xB269, 0x779A, 0xB26A, 0x779B, 0xB26B, 0x779C, 0xB26C, 0x779D, 0xB26D, 0x779E, 0xB26E, 0x77A1, + 0xB26F, 0x77A3, 0xB270, 0x77A4, 0xB271, 0x77A6, 0xB272, 0x77A8, 0xB273, 0x77AB, 0xB274, 0x77AD, 0xB275, 0x77AE, 0xB276, 0x77AF, + 0xB277, 0x77B1, 0xB278, 0x77B2, 0xB279, 0x77B4, 0xB27A, 0x77B6, 0xB27B, 0x77B7, 0xB27C, 0x77B8, 0xB27D, 0x77B9, 0xB27E, 0x77BA, + 0xB280, 0x77BC, 0xB281, 0x77BE, 0xB282, 0x77C0, 0xB283, 0x77C1, 0xB284, 0x77C2, 0xB285, 0x77C3, 0xB286, 0x77C4, 0xB287, 0x77C5, + 0xB288, 0x77C6, 0xB289, 0x77C7, 0xB28A, 0x77C8, 0xB28B, 0x77C9, 0xB28C, 0x77CA, 0xB28D, 0x77CB, 0xB28E, 0x77CC, 0xB28F, 0x77CE, + 0xB290, 0x77CF, 0xB291, 0x77D0, 0xB292, 0x77D1, 0xB293, 0x77D2, 0xB294, 0x77D3, 0xB295, 0x77D4, 0xB296, 0x77D5, 0xB297, 0x77D6, + 0xB298, 0x77D8, 0xB299, 0x77D9, 0xB29A, 0x77DA, 0xB29B, 0x77DD, 0xB29C, 0x77DE, 0xB29D, 0x77DF, 0xB29E, 0x77E0, 0xB29F, 0x77E1, + 0xB2A0, 0x77E4, 0xB2A1, 0x75C5, 0xB2A2, 0x5E76, 0xB2A3, 0x73BB, 0xB2A4, 0x83E0, 0xB2A5, 0x64AD, 0xB2A6, 0x62E8, 0xB2A7, 0x94B5, + 0xB2A8, 0x6CE2, 0xB2A9, 0x535A, 0xB2AA, 0x52C3, 0xB2AB, 0x640F, 0xB2AC, 0x94C2, 0xB2AD, 0x7B94, 0xB2AE, 0x4F2F, 0xB2AF, 0x5E1B, + 0xB2B0, 0x8236, 0xB2B1, 0x8116, 0xB2B2, 0x818A, 0xB2B3, 0x6E24, 0xB2B4, 0x6CCA, 0xB2B5, 0x9A73, 0xB2B6, 0x6355, 0xB2B7, 0x535C, + 0xB2B8, 0x54FA, 0xB2B9, 0x8865, 0xB2BA, 0x57E0, 0xB2BB, 0x4E0D, 0xB2BC, 0x5E03, 0xB2BD, 0x6B65, 0xB2BE, 0x7C3F, 0xB2BF, 0x90E8, + 0xB2C0, 0x6016, 0xB2C1, 0x64E6, 0xB2C2, 0x731C, 0xB2C3, 0x88C1, 0xB2C4, 0x6750, 0xB2C5, 0x624D, 0xB2C6, 0x8D22, 0xB2C7, 0x776C, + 0xB2C8, 0x8E29, 0xB2C9, 0x91C7, 0xB2CA, 0x5F69, 0xB2CB, 0x83DC, 0xB2CC, 0x8521, 0xB2CD, 0x9910, 0xB2CE, 0x53C2, 0xB2CF, 0x8695, + 0xB2D0, 0x6B8B, 0xB2D1, 0x60ED, 0xB2D2, 0x60E8, 0xB2D3, 0x707F, 0xB2D4, 0x82CD, 0xB2D5, 0x8231, 0xB2D6, 0x4ED3, 0xB2D7, 0x6CA7, + 0xB2D8, 0x85CF, 0xB2D9, 0x64CD, 0xB2DA, 0x7CD9, 0xB2DB, 0x69FD, 0xB2DC, 0x66F9, 0xB2DD, 0x8349, 0xB2DE, 0x5395, 0xB2DF, 0x7B56, + 0xB2E0, 0x4FA7, 0xB2E1, 0x518C, 0xB2E2, 0x6D4B, 0xB2E3, 0x5C42, 0xB2E4, 0x8E6D, 0xB2E5, 0x63D2, 0xB2E6, 0x53C9, 0xB2E7, 0x832C, + 0xB2E8, 0x8336, 0xB2E9, 0x67E5, 0xB2EA, 0x78B4, 0xB2EB, 0x643D, 0xB2EC, 0x5BDF, 0xB2ED, 0x5C94, 0xB2EE, 0x5DEE, 0xB2EF, 0x8BE7, + 0xB2F0, 0x62C6, 0xB2F1, 0x67F4, 0xB2F2, 0x8C7A, 0xB2F3, 0x6400, 0xB2F4, 0x63BA, 0xB2F5, 0x8749, 0xB2F6, 0x998B, 0xB2F7, 0x8C17, + 0xB2F8, 0x7F20, 0xB2F9, 0x94F2, 0xB2FA, 0x4EA7, 0xB2FB, 0x9610, 0xB2FC, 0x98A4, 0xB2FD, 0x660C, 0xB2FE, 0x7316, 0xB340, 0x77E6, + 0xB341, 0x77E8, 0xB342, 0x77EA, 0xB343, 0x77EF, 0xB344, 0x77F0, 0xB345, 0x77F1, 0xB346, 0x77F2, 0xB347, 0x77F4, 0xB348, 0x77F5, + 0xB349, 0x77F7, 0xB34A, 0x77F9, 0xB34B, 0x77FA, 0xB34C, 0x77FB, 0xB34D, 0x77FC, 0xB34E, 0x7803, 0xB34F, 0x7804, 0xB350, 0x7805, + 0xB351, 0x7806, 0xB352, 0x7807, 0xB353, 0x7808, 0xB354, 0x780A, 0xB355, 0x780B, 0xB356, 0x780E, 0xB357, 0x780F, 0xB358, 0x7810, + 0xB359, 0x7813, 0xB35A, 0x7815, 0xB35B, 0x7819, 0xB35C, 0x781B, 0xB35D, 0x781E, 0xB35E, 0x7820, 0xB35F, 0x7821, 0xB360, 0x7822, + 0xB361, 0x7824, 0xB362, 0x7828, 0xB363, 0x782A, 0xB364, 0x782B, 0xB365, 0x782E, 0xB366, 0x782F, 0xB367, 0x7831, 0xB368, 0x7832, + 0xB369, 0x7833, 0xB36A, 0x7835, 0xB36B, 0x7836, 0xB36C, 0x783D, 0xB36D, 0x783F, 0xB36E, 0x7841, 0xB36F, 0x7842, 0xB370, 0x7843, + 0xB371, 0x7844, 0xB372, 0x7846, 0xB373, 0x7848, 0xB374, 0x7849, 0xB375, 0x784A, 0xB376, 0x784B, 0xB377, 0x784D, 0xB378, 0x784F, + 0xB379, 0x7851, 0xB37A, 0x7853, 0xB37B, 0x7854, 0xB37C, 0x7858, 0xB37D, 0x7859, 0xB37E, 0x785A, 0xB380, 0x785B, 0xB381, 0x785C, + 0xB382, 0x785E, 0xB383, 0x785F, 0xB384, 0x7860, 0xB385, 0x7861, 0xB386, 0x7862, 0xB387, 0x7863, 0xB388, 0x7864, 0xB389, 0x7865, + 0xB38A, 0x7866, 0xB38B, 0x7867, 0xB38C, 0x7868, 0xB38D, 0x7869, 0xB38E, 0x786F, 0xB38F, 0x7870, 0xB390, 0x7871, 0xB391, 0x7872, + 0xB392, 0x7873, 0xB393, 0x7874, 0xB394, 0x7875, 0xB395, 0x7876, 0xB396, 0x7878, 0xB397, 0x7879, 0xB398, 0x787A, 0xB399, 0x787B, + 0xB39A, 0x787D, 0xB39B, 0x787E, 0xB39C, 0x787F, 0xB39D, 0x7880, 0xB39E, 0x7881, 0xB39F, 0x7882, 0xB3A0, 0x7883, 0xB3A1, 0x573A, + 0xB3A2, 0x5C1D, 0xB3A3, 0x5E38, 0xB3A4, 0x957F, 0xB3A5, 0x507F, 0xB3A6, 0x80A0, 0xB3A7, 0x5382, 0xB3A8, 0x655E, 0xB3A9, 0x7545, + 0xB3AA, 0x5531, 0xB3AB, 0x5021, 0xB3AC, 0x8D85, 0xB3AD, 0x6284, 0xB3AE, 0x949E, 0xB3AF, 0x671D, 0xB3B0, 0x5632, 0xB3B1, 0x6F6E, + 0xB3B2, 0x5DE2, 0xB3B3, 0x5435, 0xB3B4, 0x7092, 0xB3B5, 0x8F66, 0xB3B6, 0x626F, 0xB3B7, 0x64A4, 0xB3B8, 0x63A3, 0xB3B9, 0x5F7B, + 0xB3BA, 0x6F88, 0xB3BB, 0x90F4, 0xB3BC, 0x81E3, 0xB3BD, 0x8FB0, 0xB3BE, 0x5C18, 0xB3BF, 0x6668, 0xB3C0, 0x5FF1, 0xB3C1, 0x6C89, + 0xB3C2, 0x9648, 0xB3C3, 0x8D81, 0xB3C4, 0x886C, 0xB3C5, 0x6491, 0xB3C6, 0x79F0, 0xB3C7, 0x57CE, 0xB3C8, 0x6A59, 0xB3C9, 0x6210, + 0xB3CA, 0x5448, 0xB3CB, 0x4E58, 0xB3CC, 0x7A0B, 0xB3CD, 0x60E9, 0xB3CE, 0x6F84, 0xB3CF, 0x8BDA, 0xB3D0, 0x627F, 0xB3D1, 0x901E, + 0xB3D2, 0x9A8B, 0xB3D3, 0x79E4, 0xB3D4, 0x5403, 0xB3D5, 0x75F4, 0xB3D6, 0x6301, 0xB3D7, 0x5319, 0xB3D8, 0x6C60, 0xB3D9, 0x8FDF, + 0xB3DA, 0x5F1B, 0xB3DB, 0x9A70, 0xB3DC, 0x803B, 0xB3DD, 0x9F7F, 0xB3DE, 0x4F88, 0xB3DF, 0x5C3A, 0xB3E0, 0x8D64, 0xB3E1, 0x7FC5, + 0xB3E2, 0x65A5, 0xB3E3, 0x70BD, 0xB3E4, 0x5145, 0xB3E5, 0x51B2, 0xB3E6, 0x866B, 0xB3E7, 0x5D07, 0xB3E8, 0x5BA0, 0xB3E9, 0x62BD, + 0xB3EA, 0x916C, 0xB3EB, 0x7574, 0xB3EC, 0x8E0C, 0xB3ED, 0x7A20, 0xB3EE, 0x6101, 0xB3EF, 0x7B79, 0xB3F0, 0x4EC7, 0xB3F1, 0x7EF8, + 0xB3F2, 0x7785, 0xB3F3, 0x4E11, 0xB3F4, 0x81ED, 0xB3F5, 0x521D, 0xB3F6, 0x51FA, 0xB3F7, 0x6A71, 0xB3F8, 0x53A8, 0xB3F9, 0x8E87, + 0xB3FA, 0x9504, 0xB3FB, 0x96CF, 0xB3FC, 0x6EC1, 0xB3FD, 0x9664, 0xB3FE, 0x695A, 0xB440, 0x7884, 0xB441, 0x7885, 0xB442, 0x7886, + 0xB443, 0x7888, 0xB444, 0x788A, 0xB445, 0x788B, 0xB446, 0x788F, 0xB447, 0x7890, 0xB448, 0x7892, 0xB449, 0x7894, 0xB44A, 0x7895, + 0xB44B, 0x7896, 0xB44C, 0x7899, 0xB44D, 0x789D, 0xB44E, 0x789E, 0xB44F, 0x78A0, 0xB450, 0x78A2, 0xB451, 0x78A4, 0xB452, 0x78A6, + 0xB453, 0x78A8, 0xB454, 0x78A9, 0xB455, 0x78AA, 0xB456, 0x78AB, 0xB457, 0x78AC, 0xB458, 0x78AD, 0xB459, 0x78AE, 0xB45A, 0x78AF, + 0xB45B, 0x78B5, 0xB45C, 0x78B6, 0xB45D, 0x78B7, 0xB45E, 0x78B8, 0xB45F, 0x78BA, 0xB460, 0x78BB, 0xB461, 0x78BC, 0xB462, 0x78BD, + 0xB463, 0x78BF, 0xB464, 0x78C0, 0xB465, 0x78C2, 0xB466, 0x78C3, 0xB467, 0x78C4, 0xB468, 0x78C6, 0xB469, 0x78C7, 0xB46A, 0x78C8, + 0xB46B, 0x78CC, 0xB46C, 0x78CD, 0xB46D, 0x78CE, 0xB46E, 0x78CF, 0xB46F, 0x78D1, 0xB470, 0x78D2, 0xB471, 0x78D3, 0xB472, 0x78D6, + 0xB473, 0x78D7, 0xB474, 0x78D8, 0xB475, 0x78DA, 0xB476, 0x78DB, 0xB477, 0x78DC, 0xB478, 0x78DD, 0xB479, 0x78DE, 0xB47A, 0x78DF, + 0xB47B, 0x78E0, 0xB47C, 0x78E1, 0xB47D, 0x78E2, 0xB47E, 0x78E3, 0xB480, 0x78E4, 0xB481, 0x78E5, 0xB482, 0x78E6, 0xB483, 0x78E7, + 0xB484, 0x78E9, 0xB485, 0x78EA, 0xB486, 0x78EB, 0xB487, 0x78ED, 0xB488, 0x78EE, 0xB489, 0x78EF, 0xB48A, 0x78F0, 0xB48B, 0x78F1, + 0xB48C, 0x78F3, 0xB48D, 0x78F5, 0xB48E, 0x78F6, 0xB48F, 0x78F8, 0xB490, 0x78F9, 0xB491, 0x78FB, 0xB492, 0x78FC, 0xB493, 0x78FD, + 0xB494, 0x78FE, 0xB495, 0x78FF, 0xB496, 0x7900, 0xB497, 0x7902, 0xB498, 0x7903, 0xB499, 0x7904, 0xB49A, 0x7906, 0xB49B, 0x7907, + 0xB49C, 0x7908, 0xB49D, 0x7909, 0xB49E, 0x790A, 0xB49F, 0x790B, 0xB4A0, 0x790C, 0xB4A1, 0x7840, 0xB4A2, 0x50A8, 0xB4A3, 0x77D7, + 0xB4A4, 0x6410, 0xB4A5, 0x89E6, 0xB4A6, 0x5904, 0xB4A7, 0x63E3, 0xB4A8, 0x5DDD, 0xB4A9, 0x7A7F, 0xB4AA, 0x693D, 0xB4AB, 0x4F20, + 0xB4AC, 0x8239, 0xB4AD, 0x5598, 0xB4AE, 0x4E32, 0xB4AF, 0x75AE, 0xB4B0, 0x7A97, 0xB4B1, 0x5E62, 0xB4B2, 0x5E8A, 0xB4B3, 0x95EF, + 0xB4B4, 0x521B, 0xB4B5, 0x5439, 0xB4B6, 0x708A, 0xB4B7, 0x6376, 0xB4B8, 0x9524, 0xB4B9, 0x5782, 0xB4BA, 0x6625, 0xB4BB, 0x693F, + 0xB4BC, 0x9187, 0xB4BD, 0x5507, 0xB4BE, 0x6DF3, 0xB4BF, 0x7EAF, 0xB4C0, 0x8822, 0xB4C1, 0x6233, 0xB4C2, 0x7EF0, 0xB4C3, 0x75B5, + 0xB4C4, 0x8328, 0xB4C5, 0x78C1, 0xB4C6, 0x96CC, 0xB4C7, 0x8F9E, 0xB4C8, 0x6148, 0xB4C9, 0x74F7, 0xB4CA, 0x8BCD, 0xB4CB, 0x6B64, + 0xB4CC, 0x523A, 0xB4CD, 0x8D50, 0xB4CE, 0x6B21, 0xB4CF, 0x806A, 0xB4D0, 0x8471, 0xB4D1, 0x56F1, 0xB4D2, 0x5306, 0xB4D3, 0x4ECE, + 0xB4D4, 0x4E1B, 0xB4D5, 0x51D1, 0xB4D6, 0x7C97, 0xB4D7, 0x918B, 0xB4D8, 0x7C07, 0xB4D9, 0x4FC3, 0xB4DA, 0x8E7F, 0xB4DB, 0x7BE1, + 0xB4DC, 0x7A9C, 0xB4DD, 0x6467, 0xB4DE, 0x5D14, 0xB4DF, 0x50AC, 0xB4E0, 0x8106, 0xB4E1, 0x7601, 0xB4E2, 0x7CB9, 0xB4E3, 0x6DEC, + 0xB4E4, 0x7FE0, 0xB4E5, 0x6751, 0xB4E6, 0x5B58, 0xB4E7, 0x5BF8, 0xB4E8, 0x78CB, 0xB4E9, 0x64AE, 0xB4EA, 0x6413, 0xB4EB, 0x63AA, + 0xB4EC, 0x632B, 0xB4ED, 0x9519, 0xB4EE, 0x642D, 0xB4EF, 0x8FBE, 0xB4F0, 0x7B54, 0xB4F1, 0x7629, 0xB4F2, 0x6253, 0xB4F3, 0x5927, + 0xB4F4, 0x5446, 0xB4F5, 0x6B79, 0xB4F6, 0x50A3, 0xB4F7, 0x6234, 0xB4F8, 0x5E26, 0xB4F9, 0x6B86, 0xB4FA, 0x4EE3, 0xB4FB, 0x8D37, + 0xB4FC, 0x888B, 0xB4FD, 0x5F85, 0xB4FE, 0x902E, 0xB540, 0x790D, 0xB541, 0x790E, 0xB542, 0x790F, 0xB543, 0x7910, 0xB544, 0x7911, + 0xB545, 0x7912, 0xB546, 0x7914, 0xB547, 0x7915, 0xB548, 0x7916, 0xB549, 0x7917, 0xB54A, 0x7918, 0xB54B, 0x7919, 0xB54C, 0x791A, + 0xB54D, 0x791B, 0xB54E, 0x791C, 0xB54F, 0x791D, 0xB550, 0x791F, 0xB551, 0x7920, 0xB552, 0x7921, 0xB553, 0x7922, 0xB554, 0x7923, + 0xB555, 0x7925, 0xB556, 0x7926, 0xB557, 0x7927, 0xB558, 0x7928, 0xB559, 0x7929, 0xB55A, 0x792A, 0xB55B, 0x792B, 0xB55C, 0x792C, + 0xB55D, 0x792D, 0xB55E, 0x792E, 0xB55F, 0x792F, 0xB560, 0x7930, 0xB561, 0x7931, 0xB562, 0x7932, 0xB563, 0x7933, 0xB564, 0x7935, + 0xB565, 0x7936, 0xB566, 0x7937, 0xB567, 0x7938, 0xB568, 0x7939, 0xB569, 0x793D, 0xB56A, 0x793F, 0xB56B, 0x7942, 0xB56C, 0x7943, + 0xB56D, 0x7944, 0xB56E, 0x7945, 0xB56F, 0x7947, 0xB570, 0x794A, 0xB571, 0x794B, 0xB572, 0x794C, 0xB573, 0x794D, 0xB574, 0x794E, + 0xB575, 0x794F, 0xB576, 0x7950, 0xB577, 0x7951, 0xB578, 0x7952, 0xB579, 0x7954, 0xB57A, 0x7955, 0xB57B, 0x7958, 0xB57C, 0x7959, + 0xB57D, 0x7961, 0xB57E, 0x7963, 0xB580, 0x7964, 0xB581, 0x7966, 0xB582, 0x7969, 0xB583, 0x796A, 0xB584, 0x796B, 0xB585, 0x796C, + 0xB586, 0x796E, 0xB587, 0x7970, 0xB588, 0x7971, 0xB589, 0x7972, 0xB58A, 0x7973, 0xB58B, 0x7974, 0xB58C, 0x7975, 0xB58D, 0x7976, + 0xB58E, 0x7979, 0xB58F, 0x797B, 0xB590, 0x797C, 0xB591, 0x797D, 0xB592, 0x797E, 0xB593, 0x797F, 0xB594, 0x7982, 0xB595, 0x7983, + 0xB596, 0x7986, 0xB597, 0x7987, 0xB598, 0x7988, 0xB599, 0x7989, 0xB59A, 0x798B, 0xB59B, 0x798C, 0xB59C, 0x798D, 0xB59D, 0x798E, + 0xB59E, 0x7990, 0xB59F, 0x7991, 0xB5A0, 0x7992, 0xB5A1, 0x6020, 0xB5A2, 0x803D, 0xB5A3, 0x62C5, 0xB5A4, 0x4E39, 0xB5A5, 0x5355, + 0xB5A6, 0x90F8, 0xB5A7, 0x63B8, 0xB5A8, 0x80C6, 0xB5A9, 0x65E6, 0xB5AA, 0x6C2E, 0xB5AB, 0x4F46, 0xB5AC, 0x60EE, 0xB5AD, 0x6DE1, + 0xB5AE, 0x8BDE, 0xB5AF, 0x5F39, 0xB5B0, 0x86CB, 0xB5B1, 0x5F53, 0xB5B2, 0x6321, 0xB5B3, 0x515A, 0xB5B4, 0x8361, 0xB5B5, 0x6863, + 0xB5B6, 0x5200, 0xB5B7, 0x6363, 0xB5B8, 0x8E48, 0xB5B9, 0x5012, 0xB5BA, 0x5C9B, 0xB5BB, 0x7977, 0xB5BC, 0x5BFC, 0xB5BD, 0x5230, + 0xB5BE, 0x7A3B, 0xB5BF, 0x60BC, 0xB5C0, 0x9053, 0xB5C1, 0x76D7, 0xB5C2, 0x5FB7, 0xB5C3, 0x5F97, 0xB5C4, 0x7684, 0xB5C5, 0x8E6C, + 0xB5C6, 0x706F, 0xB5C7, 0x767B, 0xB5C8, 0x7B49, 0xB5C9, 0x77AA, 0xB5CA, 0x51F3, 0xB5CB, 0x9093, 0xB5CC, 0x5824, 0xB5CD, 0x4F4E, + 0xB5CE, 0x6EF4, 0xB5CF, 0x8FEA, 0xB5D0, 0x654C, 0xB5D1, 0x7B1B, 0xB5D2, 0x72C4, 0xB5D3, 0x6DA4, 0xB5D4, 0x7FDF, 0xB5D5, 0x5AE1, + 0xB5D6, 0x62B5, 0xB5D7, 0x5E95, 0xB5D8, 0x5730, 0xB5D9, 0x8482, 0xB5DA, 0x7B2C, 0xB5DB, 0x5E1D, 0xB5DC, 0x5F1F, 0xB5DD, 0x9012, + 0xB5DE, 0x7F14, 0xB5DF, 0x98A0, 0xB5E0, 0x6382, 0xB5E1, 0x6EC7, 0xB5E2, 0x7898, 0xB5E3, 0x70B9, 0xB5E4, 0x5178, 0xB5E5, 0x975B, + 0xB5E6, 0x57AB, 0xB5E7, 0x7535, 0xB5E8, 0x4F43, 0xB5E9, 0x7538, 0xB5EA, 0x5E97, 0xB5EB, 0x60E6, 0xB5EC, 0x5960, 0xB5ED, 0x6DC0, + 0xB5EE, 0x6BBF, 0xB5EF, 0x7889, 0xB5F0, 0x53FC, 0xB5F1, 0x96D5, 0xB5F2, 0x51CB, 0xB5F3, 0x5201, 0xB5F4, 0x6389, 0xB5F5, 0x540A, + 0xB5F6, 0x9493, 0xB5F7, 0x8C03, 0xB5F8, 0x8DCC, 0xB5F9, 0x7239, 0xB5FA, 0x789F, 0xB5FB, 0x8776, 0xB5FC, 0x8FED, 0xB5FD, 0x8C0D, + 0xB5FE, 0x53E0, 0xB640, 0x7993, 0xB641, 0x7994, 0xB642, 0x7995, 0xB643, 0x7996, 0xB644, 0x7997, 0xB645, 0x7998, 0xB646, 0x7999, + 0xB647, 0x799B, 0xB648, 0x799C, 0xB649, 0x799D, 0xB64A, 0x799E, 0xB64B, 0x799F, 0xB64C, 0x79A0, 0xB64D, 0x79A1, 0xB64E, 0x79A2, + 0xB64F, 0x79A3, 0xB650, 0x79A4, 0xB651, 0x79A5, 0xB652, 0x79A6, 0xB653, 0x79A8, 0xB654, 0x79A9, 0xB655, 0x79AA, 0xB656, 0x79AB, + 0xB657, 0x79AC, 0xB658, 0x79AD, 0xB659, 0x79AE, 0xB65A, 0x79AF, 0xB65B, 0x79B0, 0xB65C, 0x79B1, 0xB65D, 0x79B2, 0xB65E, 0x79B4, + 0xB65F, 0x79B5, 0xB660, 0x79B6, 0xB661, 0x79B7, 0xB662, 0x79B8, 0xB663, 0x79BC, 0xB664, 0x79BF, 0xB665, 0x79C2, 0xB666, 0x79C4, + 0xB667, 0x79C5, 0xB668, 0x79C7, 0xB669, 0x79C8, 0xB66A, 0x79CA, 0xB66B, 0x79CC, 0xB66C, 0x79CE, 0xB66D, 0x79CF, 0xB66E, 0x79D0, + 0xB66F, 0x79D3, 0xB670, 0x79D4, 0xB671, 0x79D6, 0xB672, 0x79D7, 0xB673, 0x79D9, 0xB674, 0x79DA, 0xB675, 0x79DB, 0xB676, 0x79DC, + 0xB677, 0x79DD, 0xB678, 0x79DE, 0xB679, 0x79E0, 0xB67A, 0x79E1, 0xB67B, 0x79E2, 0xB67C, 0x79E5, 0xB67D, 0x79E8, 0xB67E, 0x79EA, + 0xB680, 0x79EC, 0xB681, 0x79EE, 0xB682, 0x79F1, 0xB683, 0x79F2, 0xB684, 0x79F3, 0xB685, 0x79F4, 0xB686, 0x79F5, 0xB687, 0x79F6, + 0xB688, 0x79F7, 0xB689, 0x79F9, 0xB68A, 0x79FA, 0xB68B, 0x79FC, 0xB68C, 0x79FE, 0xB68D, 0x79FF, 0xB68E, 0x7A01, 0xB68F, 0x7A04, + 0xB690, 0x7A05, 0xB691, 0x7A07, 0xB692, 0x7A08, 0xB693, 0x7A09, 0xB694, 0x7A0A, 0xB695, 0x7A0C, 0xB696, 0x7A0F, 0xB697, 0x7A10, + 0xB698, 0x7A11, 0xB699, 0x7A12, 0xB69A, 0x7A13, 0xB69B, 0x7A15, 0xB69C, 0x7A16, 0xB69D, 0x7A18, 0xB69E, 0x7A19, 0xB69F, 0x7A1B, + 0xB6A0, 0x7A1C, 0xB6A1, 0x4E01, 0xB6A2, 0x76EF, 0xB6A3, 0x53EE, 0xB6A4, 0x9489, 0xB6A5, 0x9876, 0xB6A6, 0x9F0E, 0xB6A7, 0x952D, + 0xB6A8, 0x5B9A, 0xB6A9, 0x8BA2, 0xB6AA, 0x4E22, 0xB6AB, 0x4E1C, 0xB6AC, 0x51AC, 0xB6AD, 0x8463, 0xB6AE, 0x61C2, 0xB6AF, 0x52A8, + 0xB6B0, 0x680B, 0xB6B1, 0x4F97, 0xB6B2, 0x606B, 0xB6B3, 0x51BB, 0xB6B4, 0x6D1E, 0xB6B5, 0x515C, 0xB6B6, 0x6296, 0xB6B7, 0x6597, + 0xB6B8, 0x9661, 0xB6B9, 0x8C46, 0xB6BA, 0x9017, 0xB6BB, 0x75D8, 0xB6BC, 0x90FD, 0xB6BD, 0x7763, 0xB6BE, 0x6BD2, 0xB6BF, 0x728A, + 0xB6C0, 0x72EC, 0xB6C1, 0x8BFB, 0xB6C2, 0x5835, 0xB6C3, 0x7779, 0xB6C4, 0x8D4C, 0xB6C5, 0x675C, 0xB6C6, 0x9540, 0xB6C7, 0x809A, + 0xB6C8, 0x5EA6, 0xB6C9, 0x6E21, 0xB6CA, 0x5992, 0xB6CB, 0x7AEF, 0xB6CC, 0x77ED, 0xB6CD, 0x953B, 0xB6CE, 0x6BB5, 0xB6CF, 0x65AD, + 0xB6D0, 0x7F0E, 0xB6D1, 0x5806, 0xB6D2, 0x5151, 0xB6D3, 0x961F, 0xB6D4, 0x5BF9, 0xB6D5, 0x58A9, 0xB6D6, 0x5428, 0xB6D7, 0x8E72, + 0xB6D8, 0x6566, 0xB6D9, 0x987F, 0xB6DA, 0x56E4, 0xB6DB, 0x949D, 0xB6DC, 0x76FE, 0xB6DD, 0x9041, 0xB6DE, 0x6387, 0xB6DF, 0x54C6, + 0xB6E0, 0x591A, 0xB6E1, 0x593A, 0xB6E2, 0x579B, 0xB6E3, 0x8EB2, 0xB6E4, 0x6735, 0xB6E5, 0x8DFA, 0xB6E6, 0x8235, 0xB6E7, 0x5241, + 0xB6E8, 0x60F0, 0xB6E9, 0x5815, 0xB6EA, 0x86FE, 0xB6EB, 0x5CE8, 0xB6EC, 0x9E45, 0xB6ED, 0x4FC4, 0xB6EE, 0x989D, 0xB6EF, 0x8BB9, + 0xB6F0, 0x5A25, 0xB6F1, 0x6076, 0xB6F2, 0x5384, 0xB6F3, 0x627C, 0xB6F4, 0x904F, 0xB6F5, 0x9102, 0xB6F6, 0x997F, 0xB6F7, 0x6069, + 0xB6F8, 0x800C, 0xB6F9, 0x513F, 0xB6FA, 0x8033, 0xB6FB, 0x5C14, 0xB6FC, 0x9975, 0xB6FD, 0x6D31, 0xB6FE, 0x4E8C, 0xB740, 0x7A1D, + 0xB741, 0x7A1F, 0xB742, 0x7A21, 0xB743, 0x7A22, 0xB744, 0x7A24, 0xB745, 0x7A25, 0xB746, 0x7A26, 0xB747, 0x7A27, 0xB748, 0x7A28, + 0xB749, 0x7A29, 0xB74A, 0x7A2A, 0xB74B, 0x7A2B, 0xB74C, 0x7A2C, 0xB74D, 0x7A2D, 0xB74E, 0x7A2E, 0xB74F, 0x7A2F, 0xB750, 0x7A30, + 0xB751, 0x7A31, 0xB752, 0x7A32, 0xB753, 0x7A34, 0xB754, 0x7A35, 0xB755, 0x7A36, 0xB756, 0x7A38, 0xB757, 0x7A3A, 0xB758, 0x7A3E, + 0xB759, 0x7A40, 0xB75A, 0x7A41, 0xB75B, 0x7A42, 0xB75C, 0x7A43, 0xB75D, 0x7A44, 0xB75E, 0x7A45, 0xB75F, 0x7A47, 0xB760, 0x7A48, + 0xB761, 0x7A49, 0xB762, 0x7A4A, 0xB763, 0x7A4B, 0xB764, 0x7A4C, 0xB765, 0x7A4D, 0xB766, 0x7A4E, 0xB767, 0x7A4F, 0xB768, 0x7A50, + 0xB769, 0x7A52, 0xB76A, 0x7A53, 0xB76B, 0x7A54, 0xB76C, 0x7A55, 0xB76D, 0x7A56, 0xB76E, 0x7A58, 0xB76F, 0x7A59, 0xB770, 0x7A5A, + 0xB771, 0x7A5B, 0xB772, 0x7A5C, 0xB773, 0x7A5D, 0xB774, 0x7A5E, 0xB775, 0x7A5F, 0xB776, 0x7A60, 0xB777, 0x7A61, 0xB778, 0x7A62, + 0xB779, 0x7A63, 0xB77A, 0x7A64, 0xB77B, 0x7A65, 0xB77C, 0x7A66, 0xB77D, 0x7A67, 0xB77E, 0x7A68, 0xB780, 0x7A69, 0xB781, 0x7A6A, + 0xB782, 0x7A6B, 0xB783, 0x7A6C, 0xB784, 0x7A6D, 0xB785, 0x7A6E, 0xB786, 0x7A6F, 0xB787, 0x7A71, 0xB788, 0x7A72, 0xB789, 0x7A73, + 0xB78A, 0x7A75, 0xB78B, 0x7A7B, 0xB78C, 0x7A7C, 0xB78D, 0x7A7D, 0xB78E, 0x7A7E, 0xB78F, 0x7A82, 0xB790, 0x7A85, 0xB791, 0x7A87, + 0xB792, 0x7A89, 0xB793, 0x7A8A, 0xB794, 0x7A8B, 0xB795, 0x7A8C, 0xB796, 0x7A8E, 0xB797, 0x7A8F, 0xB798, 0x7A90, 0xB799, 0x7A93, + 0xB79A, 0x7A94, 0xB79B, 0x7A99, 0xB79C, 0x7A9A, 0xB79D, 0x7A9B, 0xB79E, 0x7A9E, 0xB79F, 0x7AA1, 0xB7A0, 0x7AA2, 0xB7A1, 0x8D30, + 0xB7A2, 0x53D1, 0xB7A3, 0x7F5A, 0xB7A4, 0x7B4F, 0xB7A5, 0x4F10, 0xB7A6, 0x4E4F, 0xB7A7, 0x9600, 0xB7A8, 0x6CD5, 0xB7A9, 0x73D0, + 0xB7AA, 0x85E9, 0xB7AB, 0x5E06, 0xB7AC, 0x756A, 0xB7AD, 0x7FFB, 0xB7AE, 0x6A0A, 0xB7AF, 0x77FE, 0xB7B0, 0x9492, 0xB7B1, 0x7E41, + 0xB7B2, 0x51E1, 0xB7B3, 0x70E6, 0xB7B4, 0x53CD, 0xB7B5, 0x8FD4, 0xB7B6, 0x8303, 0xB7B7, 0x8D29, 0xB7B8, 0x72AF, 0xB7B9, 0x996D, + 0xB7BA, 0x6CDB, 0xB7BB, 0x574A, 0xB7BC, 0x82B3, 0xB7BD, 0x65B9, 0xB7BE, 0x80AA, 0xB7BF, 0x623F, 0xB7C0, 0x9632, 0xB7C1, 0x59A8, + 0xB7C2, 0x4EFF, 0xB7C3, 0x8BBF, 0xB7C4, 0x7EBA, 0xB7C5, 0x653E, 0xB7C6, 0x83F2, 0xB7C7, 0x975E, 0xB7C8, 0x5561, 0xB7C9, 0x98DE, + 0xB7CA, 0x80A5, 0xB7CB, 0x532A, 0xB7CC, 0x8BFD, 0xB7CD, 0x5420, 0xB7CE, 0x80BA, 0xB7CF, 0x5E9F, 0xB7D0, 0x6CB8, 0xB7D1, 0x8D39, + 0xB7D2, 0x82AC, 0xB7D3, 0x915A, 0xB7D4, 0x5429, 0xB7D5, 0x6C1B, 0xB7D6, 0x5206, 0xB7D7, 0x7EB7, 0xB7D8, 0x575F, 0xB7D9, 0x711A, + 0xB7DA, 0x6C7E, 0xB7DB, 0x7C89, 0xB7DC, 0x594B, 0xB7DD, 0x4EFD, 0xB7DE, 0x5FFF, 0xB7DF, 0x6124, 0xB7E0, 0x7CAA, 0xB7E1, 0x4E30, + 0xB7E2, 0x5C01, 0xB7E3, 0x67AB, 0xB7E4, 0x8702, 0xB7E5, 0x5CF0, 0xB7E6, 0x950B, 0xB7E7, 0x98CE, 0xB7E8, 0x75AF, 0xB7E9, 0x70FD, + 0xB7EA, 0x9022, 0xB7EB, 0x51AF, 0xB7EC, 0x7F1D, 0xB7ED, 0x8BBD, 0xB7EE, 0x5949, 0xB7EF, 0x51E4, 0xB7F0, 0x4F5B, 0xB7F1, 0x5426, + 0xB7F2, 0x592B, 0xB7F3, 0x6577, 0xB7F4, 0x80A4, 0xB7F5, 0x5B75, 0xB7F6, 0x6276, 0xB7F7, 0x62C2, 0xB7F8, 0x8F90, 0xB7F9, 0x5E45, + 0xB7FA, 0x6C1F, 0xB7FB, 0x7B26, 0xB7FC, 0x4F0F, 0xB7FD, 0x4FD8, 0xB7FE, 0x670D, 0xB840, 0x7AA3, 0xB841, 0x7AA4, 0xB842, 0x7AA7, + 0xB843, 0x7AA9, 0xB844, 0x7AAA, 0xB845, 0x7AAB, 0xB846, 0x7AAE, 0xB847, 0x7AAF, 0xB848, 0x7AB0, 0xB849, 0x7AB1, 0xB84A, 0x7AB2, + 0xB84B, 0x7AB4, 0xB84C, 0x7AB5, 0xB84D, 0x7AB6, 0xB84E, 0x7AB7, 0xB84F, 0x7AB8, 0xB850, 0x7AB9, 0xB851, 0x7ABA, 0xB852, 0x7ABB, + 0xB853, 0x7ABC, 0xB854, 0x7ABD, 0xB855, 0x7ABE, 0xB856, 0x7AC0, 0xB857, 0x7AC1, 0xB858, 0x7AC2, 0xB859, 0x7AC3, 0xB85A, 0x7AC4, + 0xB85B, 0x7AC5, 0xB85C, 0x7AC6, 0xB85D, 0x7AC7, 0xB85E, 0x7AC8, 0xB85F, 0x7AC9, 0xB860, 0x7ACA, 0xB861, 0x7ACC, 0xB862, 0x7ACD, + 0xB863, 0x7ACE, 0xB864, 0x7ACF, 0xB865, 0x7AD0, 0xB866, 0x7AD1, 0xB867, 0x7AD2, 0xB868, 0x7AD3, 0xB869, 0x7AD4, 0xB86A, 0x7AD5, + 0xB86B, 0x7AD7, 0xB86C, 0x7AD8, 0xB86D, 0x7ADA, 0xB86E, 0x7ADB, 0xB86F, 0x7ADC, 0xB870, 0x7ADD, 0xB871, 0x7AE1, 0xB872, 0x7AE2, + 0xB873, 0x7AE4, 0xB874, 0x7AE7, 0xB875, 0x7AE8, 0xB876, 0x7AE9, 0xB877, 0x7AEA, 0xB878, 0x7AEB, 0xB879, 0x7AEC, 0xB87A, 0x7AEE, + 0xB87B, 0x7AF0, 0xB87C, 0x7AF1, 0xB87D, 0x7AF2, 0xB87E, 0x7AF3, 0xB880, 0x7AF4, 0xB881, 0x7AF5, 0xB882, 0x7AF6, 0xB883, 0x7AF7, + 0xB884, 0x7AF8, 0xB885, 0x7AFB, 0xB886, 0x7AFC, 0xB887, 0x7AFE, 0xB888, 0x7B00, 0xB889, 0x7B01, 0xB88A, 0x7B02, 0xB88B, 0x7B05, + 0xB88C, 0x7B07, 0xB88D, 0x7B09, 0xB88E, 0x7B0C, 0xB88F, 0x7B0D, 0xB890, 0x7B0E, 0xB891, 0x7B10, 0xB892, 0x7B12, 0xB893, 0x7B13, + 0xB894, 0x7B16, 0xB895, 0x7B17, 0xB896, 0x7B18, 0xB897, 0x7B1A, 0xB898, 0x7B1C, 0xB899, 0x7B1D, 0xB89A, 0x7B1F, 0xB89B, 0x7B21, + 0xB89C, 0x7B22, 0xB89D, 0x7B23, 0xB89E, 0x7B27, 0xB89F, 0x7B29, 0xB8A0, 0x7B2D, 0xB8A1, 0x6D6E, 0xB8A2, 0x6DAA, 0xB8A3, 0x798F, + 0xB8A4, 0x88B1, 0xB8A5, 0x5F17, 0xB8A6, 0x752B, 0xB8A7, 0x629A, 0xB8A8, 0x8F85, 0xB8A9, 0x4FEF, 0xB8AA, 0x91DC, 0xB8AB, 0x65A7, + 0xB8AC, 0x812F, 0xB8AD, 0x8151, 0xB8AE, 0x5E9C, 0xB8AF, 0x8150, 0xB8B0, 0x8D74, 0xB8B1, 0x526F, 0xB8B2, 0x8986, 0xB8B3, 0x8D4B, + 0xB8B4, 0x590D, 0xB8B5, 0x5085, 0xB8B6, 0x4ED8, 0xB8B7, 0x961C, 0xB8B8, 0x7236, 0xB8B9, 0x8179, 0xB8BA, 0x8D1F, 0xB8BB, 0x5BCC, + 0xB8BC, 0x8BA3, 0xB8BD, 0x9644, 0xB8BE, 0x5987, 0xB8BF, 0x7F1A, 0xB8C0, 0x5490, 0xB8C1, 0x5676, 0xB8C2, 0x560E, 0xB8C3, 0x8BE5, + 0xB8C4, 0x6539, 0xB8C5, 0x6982, 0xB8C6, 0x9499, 0xB8C7, 0x76D6, 0xB8C8, 0x6E89, 0xB8C9, 0x5E72, 0xB8CA, 0x7518, 0xB8CB, 0x6746, + 0xB8CC, 0x67D1, 0xB8CD, 0x7AFF, 0xB8CE, 0x809D, 0xB8CF, 0x8D76, 0xB8D0, 0x611F, 0xB8D1, 0x79C6, 0xB8D2, 0x6562, 0xB8D3, 0x8D63, + 0xB8D4, 0x5188, 0xB8D5, 0x521A, 0xB8D6, 0x94A2, 0xB8D7, 0x7F38, 0xB8D8, 0x809B, 0xB8D9, 0x7EB2, 0xB8DA, 0x5C97, 0xB8DB, 0x6E2F, + 0xB8DC, 0x6760, 0xB8DD, 0x7BD9, 0xB8DE, 0x768B, 0xB8DF, 0x9AD8, 0xB8E0, 0x818F, 0xB8E1, 0x7F94, 0xB8E2, 0x7CD5, 0xB8E3, 0x641E, + 0xB8E4, 0x9550, 0xB8E5, 0x7A3F, 0xB8E6, 0x544A, 0xB8E7, 0x54E5, 0xB8E8, 0x6B4C, 0xB8E9, 0x6401, 0xB8EA, 0x6208, 0xB8EB, 0x9E3D, + 0xB8EC, 0x80F3, 0xB8ED, 0x7599, 0xB8EE, 0x5272, 0xB8EF, 0x9769, 0xB8F0, 0x845B, 0xB8F1, 0x683C, 0xB8F2, 0x86E4, 0xB8F3, 0x9601, + 0xB8F4, 0x9694, 0xB8F5, 0x94EC, 0xB8F6, 0x4E2A, 0xB8F7, 0x5404, 0xB8F8, 0x7ED9, 0xB8F9, 0x6839, 0xB8FA, 0x8DDF, 0xB8FB, 0x8015, + 0xB8FC, 0x66F4, 0xB8FD, 0x5E9A, 0xB8FE, 0x7FB9, 0xB940, 0x7B2F, 0xB941, 0x7B30, 0xB942, 0x7B32, 0xB943, 0x7B34, 0xB944, 0x7B35, + 0xB945, 0x7B36, 0xB946, 0x7B37, 0xB947, 0x7B39, 0xB948, 0x7B3B, 0xB949, 0x7B3D, 0xB94A, 0x7B3F, 0xB94B, 0x7B40, 0xB94C, 0x7B41, + 0xB94D, 0x7B42, 0xB94E, 0x7B43, 0xB94F, 0x7B44, 0xB950, 0x7B46, 0xB951, 0x7B48, 0xB952, 0x7B4A, 0xB953, 0x7B4D, 0xB954, 0x7B4E, + 0xB955, 0x7B53, 0xB956, 0x7B55, 0xB957, 0x7B57, 0xB958, 0x7B59, 0xB959, 0x7B5C, 0xB95A, 0x7B5E, 0xB95B, 0x7B5F, 0xB95C, 0x7B61, + 0xB95D, 0x7B63, 0xB95E, 0x7B64, 0xB95F, 0x7B65, 0xB960, 0x7B66, 0xB961, 0x7B67, 0xB962, 0x7B68, 0xB963, 0x7B69, 0xB964, 0x7B6A, + 0xB965, 0x7B6B, 0xB966, 0x7B6C, 0xB967, 0x7B6D, 0xB968, 0x7B6F, 0xB969, 0x7B70, 0xB96A, 0x7B73, 0xB96B, 0x7B74, 0xB96C, 0x7B76, + 0xB96D, 0x7B78, 0xB96E, 0x7B7A, 0xB96F, 0x7B7C, 0xB970, 0x7B7D, 0xB971, 0x7B7F, 0xB972, 0x7B81, 0xB973, 0x7B82, 0xB974, 0x7B83, + 0xB975, 0x7B84, 0xB976, 0x7B86, 0xB977, 0x7B87, 0xB978, 0x7B88, 0xB979, 0x7B89, 0xB97A, 0x7B8A, 0xB97B, 0x7B8B, 0xB97C, 0x7B8C, + 0xB97D, 0x7B8E, 0xB97E, 0x7B8F, 0xB980, 0x7B91, 0xB981, 0x7B92, 0xB982, 0x7B93, 0xB983, 0x7B96, 0xB984, 0x7B98, 0xB985, 0x7B99, + 0xB986, 0x7B9A, 0xB987, 0x7B9B, 0xB988, 0x7B9E, 0xB989, 0x7B9F, 0xB98A, 0x7BA0, 0xB98B, 0x7BA3, 0xB98C, 0x7BA4, 0xB98D, 0x7BA5, + 0xB98E, 0x7BAE, 0xB98F, 0x7BAF, 0xB990, 0x7BB0, 0xB991, 0x7BB2, 0xB992, 0x7BB3, 0xB993, 0x7BB5, 0xB994, 0x7BB6, 0xB995, 0x7BB7, + 0xB996, 0x7BB9, 0xB997, 0x7BBA, 0xB998, 0x7BBB, 0xB999, 0x7BBC, 0xB99A, 0x7BBD, 0xB99B, 0x7BBE, 0xB99C, 0x7BBF, 0xB99D, 0x7BC0, + 0xB99E, 0x7BC2, 0xB99F, 0x7BC3, 0xB9A0, 0x7BC4, 0xB9A1, 0x57C2, 0xB9A2, 0x803F, 0xB9A3, 0x6897, 0xB9A4, 0x5DE5, 0xB9A5, 0x653B, + 0xB9A6, 0x529F, 0xB9A7, 0x606D, 0xB9A8, 0x9F9A, 0xB9A9, 0x4F9B, 0xB9AA, 0x8EAC, 0xB9AB, 0x516C, 0xB9AC, 0x5BAB, 0xB9AD, 0x5F13, + 0xB9AE, 0x5DE9, 0xB9AF, 0x6C5E, 0xB9B0, 0x62F1, 0xB9B1, 0x8D21, 0xB9B2, 0x5171, 0xB9B3, 0x94A9, 0xB9B4, 0x52FE, 0xB9B5, 0x6C9F, + 0xB9B6, 0x82DF, 0xB9B7, 0x72D7, 0xB9B8, 0x57A2, 0xB9B9, 0x6784, 0xB9BA, 0x8D2D, 0xB9BB, 0x591F, 0xB9BC, 0x8F9C, 0xB9BD, 0x83C7, + 0xB9BE, 0x5495, 0xB9BF, 0x7B8D, 0xB9C0, 0x4F30, 0xB9C1, 0x6CBD, 0xB9C2, 0x5B64, 0xB9C3, 0x59D1, 0xB9C4, 0x9F13, 0xB9C5, 0x53E4, + 0xB9C6, 0x86CA, 0xB9C7, 0x9AA8, 0xB9C8, 0x8C37, 0xB9C9, 0x80A1, 0xB9CA, 0x6545, 0xB9CB, 0x987E, 0xB9CC, 0x56FA, 0xB9CD, 0x96C7, + 0xB9CE, 0x522E, 0xB9CF, 0x74DC, 0xB9D0, 0x5250, 0xB9D1, 0x5BE1, 0xB9D2, 0x6302, 0xB9D3, 0x8902, 0xB9D4, 0x4E56, 0xB9D5, 0x62D0, + 0xB9D6, 0x602A, 0xB9D7, 0x68FA, 0xB9D8, 0x5173, 0xB9D9, 0x5B98, 0xB9DA, 0x51A0, 0xB9DB, 0x89C2, 0xB9DC, 0x7BA1, 0xB9DD, 0x9986, + 0xB9DE, 0x7F50, 0xB9DF, 0x60EF, 0xB9E0, 0x704C, 0xB9E1, 0x8D2F, 0xB9E2, 0x5149, 0xB9E3, 0x5E7F, 0xB9E4, 0x901B, 0xB9E5, 0x7470, + 0xB9E6, 0x89C4, 0xB9E7, 0x572D, 0xB9E8, 0x7845, 0xB9E9, 0x5F52, 0xB9EA, 0x9F9F, 0xB9EB, 0x95FA, 0xB9EC, 0x8F68, 0xB9ED, 0x9B3C, + 0xB9EE, 0x8BE1, 0xB9EF, 0x7678, 0xB9F0, 0x6842, 0xB9F1, 0x67DC, 0xB9F2, 0x8DEA, 0xB9F3, 0x8D35, 0xB9F4, 0x523D, 0xB9F5, 0x8F8A, + 0xB9F6, 0x6EDA, 0xB9F7, 0x68CD, 0xB9F8, 0x9505, 0xB9F9, 0x90ED, 0xB9FA, 0x56FD, 0xB9FB, 0x679C, 0xB9FC, 0x88F9, 0xB9FD, 0x8FC7, + 0xB9FE, 0x54C8, 0xBA40, 0x7BC5, 0xBA41, 0x7BC8, 0xBA42, 0x7BC9, 0xBA43, 0x7BCA, 0xBA44, 0x7BCB, 0xBA45, 0x7BCD, 0xBA46, 0x7BCE, + 0xBA47, 0x7BCF, 0xBA48, 0x7BD0, 0xBA49, 0x7BD2, 0xBA4A, 0x7BD4, 0xBA4B, 0x7BD5, 0xBA4C, 0x7BD6, 0xBA4D, 0x7BD7, 0xBA4E, 0x7BD8, + 0xBA4F, 0x7BDB, 0xBA50, 0x7BDC, 0xBA51, 0x7BDE, 0xBA52, 0x7BDF, 0xBA53, 0x7BE0, 0xBA54, 0x7BE2, 0xBA55, 0x7BE3, 0xBA56, 0x7BE4, + 0xBA57, 0x7BE7, 0xBA58, 0x7BE8, 0xBA59, 0x7BE9, 0xBA5A, 0x7BEB, 0xBA5B, 0x7BEC, 0xBA5C, 0x7BED, 0xBA5D, 0x7BEF, 0xBA5E, 0x7BF0, + 0xBA5F, 0x7BF2, 0xBA60, 0x7BF3, 0xBA61, 0x7BF4, 0xBA62, 0x7BF5, 0xBA63, 0x7BF6, 0xBA64, 0x7BF8, 0xBA65, 0x7BF9, 0xBA66, 0x7BFA, + 0xBA67, 0x7BFB, 0xBA68, 0x7BFD, 0xBA69, 0x7BFF, 0xBA6A, 0x7C00, 0xBA6B, 0x7C01, 0xBA6C, 0x7C02, 0xBA6D, 0x7C03, 0xBA6E, 0x7C04, + 0xBA6F, 0x7C05, 0xBA70, 0x7C06, 0xBA71, 0x7C08, 0xBA72, 0x7C09, 0xBA73, 0x7C0A, 0xBA74, 0x7C0D, 0xBA75, 0x7C0E, 0xBA76, 0x7C10, + 0xBA77, 0x7C11, 0xBA78, 0x7C12, 0xBA79, 0x7C13, 0xBA7A, 0x7C14, 0xBA7B, 0x7C15, 0xBA7C, 0x7C17, 0xBA7D, 0x7C18, 0xBA7E, 0x7C19, + 0xBA80, 0x7C1A, 0xBA81, 0x7C1B, 0xBA82, 0x7C1C, 0xBA83, 0x7C1D, 0xBA84, 0x7C1E, 0xBA85, 0x7C20, 0xBA86, 0x7C21, 0xBA87, 0x7C22, + 0xBA88, 0x7C23, 0xBA89, 0x7C24, 0xBA8A, 0x7C25, 0xBA8B, 0x7C28, 0xBA8C, 0x7C29, 0xBA8D, 0x7C2B, 0xBA8E, 0x7C2C, 0xBA8F, 0x7C2D, + 0xBA90, 0x7C2E, 0xBA91, 0x7C2F, 0xBA92, 0x7C30, 0xBA93, 0x7C31, 0xBA94, 0x7C32, 0xBA95, 0x7C33, 0xBA96, 0x7C34, 0xBA97, 0x7C35, + 0xBA98, 0x7C36, 0xBA99, 0x7C37, 0xBA9A, 0x7C39, 0xBA9B, 0x7C3A, 0xBA9C, 0x7C3B, 0xBA9D, 0x7C3C, 0xBA9E, 0x7C3D, 0xBA9F, 0x7C3E, + 0xBAA0, 0x7C42, 0xBAA1, 0x9AB8, 0xBAA2, 0x5B69, 0xBAA3, 0x6D77, 0xBAA4, 0x6C26, 0xBAA5, 0x4EA5, 0xBAA6, 0x5BB3, 0xBAA7, 0x9A87, + 0xBAA8, 0x9163, 0xBAA9, 0x61A8, 0xBAAA, 0x90AF, 0xBAAB, 0x97E9, 0xBAAC, 0x542B, 0xBAAD, 0x6DB5, 0xBAAE, 0x5BD2, 0xBAAF, 0x51FD, + 0xBAB0, 0x558A, 0xBAB1, 0x7F55, 0xBAB2, 0x7FF0, 0xBAB3, 0x64BC, 0xBAB4, 0x634D, 0xBAB5, 0x65F1, 0xBAB6, 0x61BE, 0xBAB7, 0x608D, + 0xBAB8, 0x710A, 0xBAB9, 0x6C57, 0xBABA, 0x6C49, 0xBABB, 0x592F, 0xBABC, 0x676D, 0xBABD, 0x822A, 0xBABE, 0x58D5, 0xBABF, 0x568E, + 0xBAC0, 0x8C6A, 0xBAC1, 0x6BEB, 0xBAC2, 0x90DD, 0xBAC3, 0x597D, 0xBAC4, 0x8017, 0xBAC5, 0x53F7, 0xBAC6, 0x6D69, 0xBAC7, 0x5475, + 0xBAC8, 0x559D, 0xBAC9, 0x8377, 0xBACA, 0x83CF, 0xBACB, 0x6838, 0xBACC, 0x79BE, 0xBACD, 0x548C, 0xBACE, 0x4F55, 0xBACF, 0x5408, + 0xBAD0, 0x76D2, 0xBAD1, 0x8C89, 0xBAD2, 0x9602, 0xBAD3, 0x6CB3, 0xBAD4, 0x6DB8, 0xBAD5, 0x8D6B, 0xBAD6, 0x8910, 0xBAD7, 0x9E64, + 0xBAD8, 0x8D3A, 0xBAD9, 0x563F, 0xBADA, 0x9ED1, 0xBADB, 0x75D5, 0xBADC, 0x5F88, 0xBADD, 0x72E0, 0xBADE, 0x6068, 0xBADF, 0x54FC, + 0xBAE0, 0x4EA8, 0xBAE1, 0x6A2A, 0xBAE2, 0x8861, 0xBAE3, 0x6052, 0xBAE4, 0x8F70, 0xBAE5, 0x54C4, 0xBAE6, 0x70D8, 0xBAE7, 0x8679, + 0xBAE8, 0x9E3F, 0xBAE9, 0x6D2A, 0xBAEA, 0x5B8F, 0xBAEB, 0x5F18, 0xBAEC, 0x7EA2, 0xBAED, 0x5589, 0xBAEE, 0x4FAF, 0xBAEF, 0x7334, + 0xBAF0, 0x543C, 0xBAF1, 0x539A, 0xBAF2, 0x5019, 0xBAF3, 0x540E, 0xBAF4, 0x547C, 0xBAF5, 0x4E4E, 0xBAF6, 0x5FFD, 0xBAF7, 0x745A, + 0xBAF8, 0x58F6, 0xBAF9, 0x846B, 0xBAFA, 0x80E1, 0xBAFB, 0x8774, 0xBAFC, 0x72D0, 0xBAFD, 0x7CCA, 0xBAFE, 0x6E56, 0xBB40, 0x7C43, + 0xBB41, 0x7C44, 0xBB42, 0x7C45, 0xBB43, 0x7C46, 0xBB44, 0x7C47, 0xBB45, 0x7C48, 0xBB46, 0x7C49, 0xBB47, 0x7C4A, 0xBB48, 0x7C4B, + 0xBB49, 0x7C4C, 0xBB4A, 0x7C4E, 0xBB4B, 0x7C4F, 0xBB4C, 0x7C50, 0xBB4D, 0x7C51, 0xBB4E, 0x7C52, 0xBB4F, 0x7C53, 0xBB50, 0x7C54, + 0xBB51, 0x7C55, 0xBB52, 0x7C56, 0xBB53, 0x7C57, 0xBB54, 0x7C58, 0xBB55, 0x7C59, 0xBB56, 0x7C5A, 0xBB57, 0x7C5B, 0xBB58, 0x7C5C, + 0xBB59, 0x7C5D, 0xBB5A, 0x7C5E, 0xBB5B, 0x7C5F, 0xBB5C, 0x7C60, 0xBB5D, 0x7C61, 0xBB5E, 0x7C62, 0xBB5F, 0x7C63, 0xBB60, 0x7C64, + 0xBB61, 0x7C65, 0xBB62, 0x7C66, 0xBB63, 0x7C67, 0xBB64, 0x7C68, 0xBB65, 0x7C69, 0xBB66, 0x7C6A, 0xBB67, 0x7C6B, 0xBB68, 0x7C6C, + 0xBB69, 0x7C6D, 0xBB6A, 0x7C6E, 0xBB6B, 0x7C6F, 0xBB6C, 0x7C70, 0xBB6D, 0x7C71, 0xBB6E, 0x7C72, 0xBB6F, 0x7C75, 0xBB70, 0x7C76, + 0xBB71, 0x7C77, 0xBB72, 0x7C78, 0xBB73, 0x7C79, 0xBB74, 0x7C7A, 0xBB75, 0x7C7E, 0xBB76, 0x7C7F, 0xBB77, 0x7C80, 0xBB78, 0x7C81, + 0xBB79, 0x7C82, 0xBB7A, 0x7C83, 0xBB7B, 0x7C84, 0xBB7C, 0x7C85, 0xBB7D, 0x7C86, 0xBB7E, 0x7C87, 0xBB80, 0x7C88, 0xBB81, 0x7C8A, + 0xBB82, 0x7C8B, 0xBB83, 0x7C8C, 0xBB84, 0x7C8D, 0xBB85, 0x7C8E, 0xBB86, 0x7C8F, 0xBB87, 0x7C90, 0xBB88, 0x7C93, 0xBB89, 0x7C94, + 0xBB8A, 0x7C96, 0xBB8B, 0x7C99, 0xBB8C, 0x7C9A, 0xBB8D, 0x7C9B, 0xBB8E, 0x7CA0, 0xBB8F, 0x7CA1, 0xBB90, 0x7CA3, 0xBB91, 0x7CA6, + 0xBB92, 0x7CA7, 0xBB93, 0x7CA8, 0xBB94, 0x7CA9, 0xBB95, 0x7CAB, 0xBB96, 0x7CAC, 0xBB97, 0x7CAD, 0xBB98, 0x7CAF, 0xBB99, 0x7CB0, + 0xBB9A, 0x7CB4, 0xBB9B, 0x7CB5, 0xBB9C, 0x7CB6, 0xBB9D, 0x7CB7, 0xBB9E, 0x7CB8, 0xBB9F, 0x7CBA, 0xBBA0, 0x7CBB, 0xBBA1, 0x5F27, + 0xBBA2, 0x864E, 0xBBA3, 0x552C, 0xBBA4, 0x62A4, 0xBBA5, 0x4E92, 0xBBA6, 0x6CAA, 0xBBA7, 0x6237, 0xBBA8, 0x82B1, 0xBBA9, 0x54D7, + 0xBBAA, 0x534E, 0xBBAB, 0x733E, 0xBBAC, 0x6ED1, 0xBBAD, 0x753B, 0xBBAE, 0x5212, 0xBBAF, 0x5316, 0xBBB0, 0x8BDD, 0xBBB1, 0x69D0, + 0xBBB2, 0x5F8A, 0xBBB3, 0x6000, 0xBBB4, 0x6DEE, 0xBBB5, 0x574F, 0xBBB6, 0x6B22, 0xBBB7, 0x73AF, 0xBBB8, 0x6853, 0xBBB9, 0x8FD8, + 0xBBBA, 0x7F13, 0xBBBB, 0x6362, 0xBBBC, 0x60A3, 0xBBBD, 0x5524, 0xBBBE, 0x75EA, 0xBBBF, 0x8C62, 0xBBC0, 0x7115, 0xBBC1, 0x6DA3, + 0xBBC2, 0x5BA6, 0xBBC3, 0x5E7B, 0xBBC4, 0x8352, 0xBBC5, 0x614C, 0xBBC6, 0x9EC4, 0xBBC7, 0x78FA, 0xBBC8, 0x8757, 0xBBC9, 0x7C27, + 0xBBCA, 0x7687, 0xBBCB, 0x51F0, 0xBBCC, 0x60F6, 0xBBCD, 0x714C, 0xBBCE, 0x6643, 0xBBCF, 0x5E4C, 0xBBD0, 0x604D, 0xBBD1, 0x8C0E, + 0xBBD2, 0x7070, 0xBBD3, 0x6325, 0xBBD4, 0x8F89, 0xBBD5, 0x5FBD, 0xBBD6, 0x6062, 0xBBD7, 0x86D4, 0xBBD8, 0x56DE, 0xBBD9, 0x6BC1, + 0xBBDA, 0x6094, 0xBBDB, 0x6167, 0xBBDC, 0x5349, 0xBBDD, 0x60E0, 0xBBDE, 0x6666, 0xBBDF, 0x8D3F, 0xBBE0, 0x79FD, 0xBBE1, 0x4F1A, + 0xBBE2, 0x70E9, 0xBBE3, 0x6C47, 0xBBE4, 0x8BB3, 0xBBE5, 0x8BF2, 0xBBE6, 0x7ED8, 0xBBE7, 0x8364, 0xBBE8, 0x660F, 0xBBE9, 0x5A5A, + 0xBBEA, 0x9B42, 0xBBEB, 0x6D51, 0xBBEC, 0x6DF7, 0xBBED, 0x8C41, 0xBBEE, 0x6D3B, 0xBBEF, 0x4F19, 0xBBF0, 0x706B, 0xBBF1, 0x83B7, + 0xBBF2, 0x6216, 0xBBF3, 0x60D1, 0xBBF4, 0x970D, 0xBBF5, 0x8D27, 0xBBF6, 0x7978, 0xBBF7, 0x51FB, 0xBBF8, 0x573E, 0xBBF9, 0x57FA, + 0xBBFA, 0x673A, 0xBBFB, 0x7578, 0xBBFC, 0x7A3D, 0xBBFD, 0x79EF, 0xBBFE, 0x7B95, 0xBC40, 0x7CBF, 0xBC41, 0x7CC0, 0xBC42, 0x7CC2, + 0xBC43, 0x7CC3, 0xBC44, 0x7CC4, 0xBC45, 0x7CC6, 0xBC46, 0x7CC9, 0xBC47, 0x7CCB, 0xBC48, 0x7CCE, 0xBC49, 0x7CCF, 0xBC4A, 0x7CD0, + 0xBC4B, 0x7CD1, 0xBC4C, 0x7CD2, 0xBC4D, 0x7CD3, 0xBC4E, 0x7CD4, 0xBC4F, 0x7CD8, 0xBC50, 0x7CDA, 0xBC51, 0x7CDB, 0xBC52, 0x7CDD, + 0xBC53, 0x7CDE, 0xBC54, 0x7CE1, 0xBC55, 0x7CE2, 0xBC56, 0x7CE3, 0xBC57, 0x7CE4, 0xBC58, 0x7CE5, 0xBC59, 0x7CE6, 0xBC5A, 0x7CE7, + 0xBC5B, 0x7CE9, 0xBC5C, 0x7CEA, 0xBC5D, 0x7CEB, 0xBC5E, 0x7CEC, 0xBC5F, 0x7CED, 0xBC60, 0x7CEE, 0xBC61, 0x7CF0, 0xBC62, 0x7CF1, + 0xBC63, 0x7CF2, 0xBC64, 0x7CF3, 0xBC65, 0x7CF4, 0xBC66, 0x7CF5, 0xBC67, 0x7CF6, 0xBC68, 0x7CF7, 0xBC69, 0x7CF9, 0xBC6A, 0x7CFA, + 0xBC6B, 0x7CFC, 0xBC6C, 0x7CFD, 0xBC6D, 0x7CFE, 0xBC6E, 0x7CFF, 0xBC6F, 0x7D00, 0xBC70, 0x7D01, 0xBC71, 0x7D02, 0xBC72, 0x7D03, + 0xBC73, 0x7D04, 0xBC74, 0x7D05, 0xBC75, 0x7D06, 0xBC76, 0x7D07, 0xBC77, 0x7D08, 0xBC78, 0x7D09, 0xBC79, 0x7D0B, 0xBC7A, 0x7D0C, + 0xBC7B, 0x7D0D, 0xBC7C, 0x7D0E, 0xBC7D, 0x7D0F, 0xBC7E, 0x7D10, 0xBC80, 0x7D11, 0xBC81, 0x7D12, 0xBC82, 0x7D13, 0xBC83, 0x7D14, + 0xBC84, 0x7D15, 0xBC85, 0x7D16, 0xBC86, 0x7D17, 0xBC87, 0x7D18, 0xBC88, 0x7D19, 0xBC89, 0x7D1A, 0xBC8A, 0x7D1B, 0xBC8B, 0x7D1C, + 0xBC8C, 0x7D1D, 0xBC8D, 0x7D1E, 0xBC8E, 0x7D1F, 0xBC8F, 0x7D21, 0xBC90, 0x7D23, 0xBC91, 0x7D24, 0xBC92, 0x7D25, 0xBC93, 0x7D26, + 0xBC94, 0x7D28, 0xBC95, 0x7D29, 0xBC96, 0x7D2A, 0xBC97, 0x7D2C, 0xBC98, 0x7D2D, 0xBC99, 0x7D2E, 0xBC9A, 0x7D30, 0xBC9B, 0x7D31, + 0xBC9C, 0x7D32, 0xBC9D, 0x7D33, 0xBC9E, 0x7D34, 0xBC9F, 0x7D35, 0xBCA0, 0x7D36, 0xBCA1, 0x808C, 0xBCA2, 0x9965, 0xBCA3, 0x8FF9, + 0xBCA4, 0x6FC0, 0xBCA5, 0x8BA5, 0xBCA6, 0x9E21, 0xBCA7, 0x59EC, 0xBCA8, 0x7EE9, 0xBCA9, 0x7F09, 0xBCAA, 0x5409, 0xBCAB, 0x6781, + 0xBCAC, 0x68D8, 0xBCAD, 0x8F91, 0xBCAE, 0x7C4D, 0xBCAF, 0x96C6, 0xBCB0, 0x53CA, 0xBCB1, 0x6025, 0xBCB2, 0x75BE, 0xBCB3, 0x6C72, + 0xBCB4, 0x5373, 0xBCB5, 0x5AC9, 0xBCB6, 0x7EA7, 0xBCB7, 0x6324, 0xBCB8, 0x51E0, 0xBCB9, 0x810A, 0xBCBA, 0x5DF1, 0xBCBB, 0x84DF, + 0xBCBC, 0x6280, 0xBCBD, 0x5180, 0xBCBE, 0x5B63, 0xBCBF, 0x4F0E, 0xBCC0, 0x796D, 0xBCC1, 0x5242, 0xBCC2, 0x60B8, 0xBCC3, 0x6D4E, + 0xBCC4, 0x5BC4, 0xBCC5, 0x5BC2, 0xBCC6, 0x8BA1, 0xBCC7, 0x8BB0, 0xBCC8, 0x65E2, 0xBCC9, 0x5FCC, 0xBCCA, 0x9645, 0xBCCB, 0x5993, + 0xBCCC, 0x7EE7, 0xBCCD, 0x7EAA, 0xBCCE, 0x5609, 0xBCCF, 0x67B7, 0xBCD0, 0x5939, 0xBCD1, 0x4F73, 0xBCD2, 0x5BB6, 0xBCD3, 0x52A0, + 0xBCD4, 0x835A, 0xBCD5, 0x988A, 0xBCD6, 0x8D3E, 0xBCD7, 0x7532, 0xBCD8, 0x94BE, 0xBCD9, 0x5047, 0xBCDA, 0x7A3C, 0xBCDB, 0x4EF7, + 0xBCDC, 0x67B6, 0xBCDD, 0x9A7E, 0xBCDE, 0x5AC1, 0xBCDF, 0x6B7C, 0xBCE0, 0x76D1, 0xBCE1, 0x575A, 0xBCE2, 0x5C16, 0xBCE3, 0x7B3A, + 0xBCE4, 0x95F4, 0xBCE5, 0x714E, 0xBCE6, 0x517C, 0xBCE7, 0x80A9, 0xBCE8, 0x8270, 0xBCE9, 0x5978, 0xBCEA, 0x7F04, 0xBCEB, 0x8327, + 0xBCEC, 0x68C0, 0xBCED, 0x67EC, 0xBCEE, 0x78B1, 0xBCEF, 0x7877, 0xBCF0, 0x62E3, 0xBCF1, 0x6361, 0xBCF2, 0x7B80, 0xBCF3, 0x4FED, + 0xBCF4, 0x526A, 0xBCF5, 0x51CF, 0xBCF6, 0x8350, 0xBCF7, 0x69DB, 0xBCF8, 0x9274, 0xBCF9, 0x8DF5, 0xBCFA, 0x8D31, 0xBCFB, 0x89C1, + 0xBCFC, 0x952E, 0xBCFD, 0x7BAD, 0xBCFE, 0x4EF6, 0xBD40, 0x7D37, 0xBD41, 0x7D38, 0xBD42, 0x7D39, 0xBD43, 0x7D3A, 0xBD44, 0x7D3B, + 0xBD45, 0x7D3C, 0xBD46, 0x7D3D, 0xBD47, 0x7D3E, 0xBD48, 0x7D3F, 0xBD49, 0x7D40, 0xBD4A, 0x7D41, 0xBD4B, 0x7D42, 0xBD4C, 0x7D43, + 0xBD4D, 0x7D44, 0xBD4E, 0x7D45, 0xBD4F, 0x7D46, 0xBD50, 0x7D47, 0xBD51, 0x7D48, 0xBD52, 0x7D49, 0xBD53, 0x7D4A, 0xBD54, 0x7D4B, + 0xBD55, 0x7D4C, 0xBD56, 0x7D4D, 0xBD57, 0x7D4E, 0xBD58, 0x7D4F, 0xBD59, 0x7D50, 0xBD5A, 0x7D51, 0xBD5B, 0x7D52, 0xBD5C, 0x7D53, + 0xBD5D, 0x7D54, 0xBD5E, 0x7D55, 0xBD5F, 0x7D56, 0xBD60, 0x7D57, 0xBD61, 0x7D58, 0xBD62, 0x7D59, 0xBD63, 0x7D5A, 0xBD64, 0x7D5B, + 0xBD65, 0x7D5C, 0xBD66, 0x7D5D, 0xBD67, 0x7D5E, 0xBD68, 0x7D5F, 0xBD69, 0x7D60, 0xBD6A, 0x7D61, 0xBD6B, 0x7D62, 0xBD6C, 0x7D63, + 0xBD6D, 0x7D64, 0xBD6E, 0x7D65, 0xBD6F, 0x7D66, 0xBD70, 0x7D67, 0xBD71, 0x7D68, 0xBD72, 0x7D69, 0xBD73, 0x7D6A, 0xBD74, 0x7D6B, + 0xBD75, 0x7D6C, 0xBD76, 0x7D6D, 0xBD77, 0x7D6F, 0xBD78, 0x7D70, 0xBD79, 0x7D71, 0xBD7A, 0x7D72, 0xBD7B, 0x7D73, 0xBD7C, 0x7D74, + 0xBD7D, 0x7D75, 0xBD7E, 0x7D76, 0xBD80, 0x7D78, 0xBD81, 0x7D79, 0xBD82, 0x7D7A, 0xBD83, 0x7D7B, 0xBD84, 0x7D7C, 0xBD85, 0x7D7D, + 0xBD86, 0x7D7E, 0xBD87, 0x7D7F, 0xBD88, 0x7D80, 0xBD89, 0x7D81, 0xBD8A, 0x7D82, 0xBD8B, 0x7D83, 0xBD8C, 0x7D84, 0xBD8D, 0x7D85, + 0xBD8E, 0x7D86, 0xBD8F, 0x7D87, 0xBD90, 0x7D88, 0xBD91, 0x7D89, 0xBD92, 0x7D8A, 0xBD93, 0x7D8B, 0xBD94, 0x7D8C, 0xBD95, 0x7D8D, + 0xBD96, 0x7D8E, 0xBD97, 0x7D8F, 0xBD98, 0x7D90, 0xBD99, 0x7D91, 0xBD9A, 0x7D92, 0xBD9B, 0x7D93, 0xBD9C, 0x7D94, 0xBD9D, 0x7D95, + 0xBD9E, 0x7D96, 0xBD9F, 0x7D97, 0xBDA0, 0x7D98, 0xBDA1, 0x5065, 0xBDA2, 0x8230, 0xBDA3, 0x5251, 0xBDA4, 0x996F, 0xBDA5, 0x6E10, + 0xBDA6, 0x6E85, 0xBDA7, 0x6DA7, 0xBDA8, 0x5EFA, 0xBDA9, 0x50F5, 0xBDAA, 0x59DC, 0xBDAB, 0x5C06, 0xBDAC, 0x6D46, 0xBDAD, 0x6C5F, + 0xBDAE, 0x7586, 0xBDAF, 0x848B, 0xBDB0, 0x6868, 0xBDB1, 0x5956, 0xBDB2, 0x8BB2, 0xBDB3, 0x5320, 0xBDB4, 0x9171, 0xBDB5, 0x964D, + 0xBDB6, 0x8549, 0xBDB7, 0x6912, 0xBDB8, 0x7901, 0xBDB9, 0x7126, 0xBDBA, 0x80F6, 0xBDBB, 0x4EA4, 0xBDBC, 0x90CA, 0xBDBD, 0x6D47, + 0xBDBE, 0x9A84, 0xBDBF, 0x5A07, 0xBDC0, 0x56BC, 0xBDC1, 0x6405, 0xBDC2, 0x94F0, 0xBDC3, 0x77EB, 0xBDC4, 0x4FA5, 0xBDC5, 0x811A, + 0xBDC6, 0x72E1, 0xBDC7, 0x89D2, 0xBDC8, 0x997A, 0xBDC9, 0x7F34, 0xBDCA, 0x7EDE, 0xBDCB, 0x527F, 0xBDCC, 0x6559, 0xBDCD, 0x9175, + 0xBDCE, 0x8F7F, 0xBDCF, 0x8F83, 0xBDD0, 0x53EB, 0xBDD1, 0x7A96, 0xBDD2, 0x63ED, 0xBDD3, 0x63A5, 0xBDD4, 0x7686, 0xBDD5, 0x79F8, + 0xBDD6, 0x8857, 0xBDD7, 0x9636, 0xBDD8, 0x622A, 0xBDD9, 0x52AB, 0xBDDA, 0x8282, 0xBDDB, 0x6854, 0xBDDC, 0x6770, 0xBDDD, 0x6377, + 0xBDDE, 0x776B, 0xBDDF, 0x7AED, 0xBDE0, 0x6D01, 0xBDE1, 0x7ED3, 0xBDE2, 0x89E3, 0xBDE3, 0x59D0, 0xBDE4, 0x6212, 0xBDE5, 0x85C9, + 0xBDE6, 0x82A5, 0xBDE7, 0x754C, 0xBDE8, 0x501F, 0xBDE9, 0x4ECB, 0xBDEA, 0x75A5, 0xBDEB, 0x8BEB, 0xBDEC, 0x5C4A, 0xBDED, 0x5DFE, + 0xBDEE, 0x7B4B, 0xBDEF, 0x65A4, 0xBDF0, 0x91D1, 0xBDF1, 0x4ECA, 0xBDF2, 0x6D25, 0xBDF3, 0x895F, 0xBDF4, 0x7D27, 0xBDF5, 0x9526, + 0xBDF6, 0x4EC5, 0xBDF7, 0x8C28, 0xBDF8, 0x8FDB, 0xBDF9, 0x9773, 0xBDFA, 0x664B, 0xBDFB, 0x7981, 0xBDFC, 0x8FD1, 0xBDFD, 0x70EC, + 0xBDFE, 0x6D78, 0xBE40, 0x7D99, 0xBE41, 0x7D9A, 0xBE42, 0x7D9B, 0xBE43, 0x7D9C, 0xBE44, 0x7D9D, 0xBE45, 0x7D9E, 0xBE46, 0x7D9F, + 0xBE47, 0x7DA0, 0xBE48, 0x7DA1, 0xBE49, 0x7DA2, 0xBE4A, 0x7DA3, 0xBE4B, 0x7DA4, 0xBE4C, 0x7DA5, 0xBE4D, 0x7DA7, 0xBE4E, 0x7DA8, + 0xBE4F, 0x7DA9, 0xBE50, 0x7DAA, 0xBE51, 0x7DAB, 0xBE52, 0x7DAC, 0xBE53, 0x7DAD, 0xBE54, 0x7DAF, 0xBE55, 0x7DB0, 0xBE56, 0x7DB1, + 0xBE57, 0x7DB2, 0xBE58, 0x7DB3, 0xBE59, 0x7DB4, 0xBE5A, 0x7DB5, 0xBE5B, 0x7DB6, 0xBE5C, 0x7DB7, 0xBE5D, 0x7DB8, 0xBE5E, 0x7DB9, + 0xBE5F, 0x7DBA, 0xBE60, 0x7DBB, 0xBE61, 0x7DBC, 0xBE62, 0x7DBD, 0xBE63, 0x7DBE, 0xBE64, 0x7DBF, 0xBE65, 0x7DC0, 0xBE66, 0x7DC1, + 0xBE67, 0x7DC2, 0xBE68, 0x7DC3, 0xBE69, 0x7DC4, 0xBE6A, 0x7DC5, 0xBE6B, 0x7DC6, 0xBE6C, 0x7DC7, 0xBE6D, 0x7DC8, 0xBE6E, 0x7DC9, + 0xBE6F, 0x7DCA, 0xBE70, 0x7DCB, 0xBE71, 0x7DCC, 0xBE72, 0x7DCD, 0xBE73, 0x7DCE, 0xBE74, 0x7DCF, 0xBE75, 0x7DD0, 0xBE76, 0x7DD1, + 0xBE77, 0x7DD2, 0xBE78, 0x7DD3, 0xBE79, 0x7DD4, 0xBE7A, 0x7DD5, 0xBE7B, 0x7DD6, 0xBE7C, 0x7DD7, 0xBE7D, 0x7DD8, 0xBE7E, 0x7DD9, + 0xBE80, 0x7DDA, 0xBE81, 0x7DDB, 0xBE82, 0x7DDC, 0xBE83, 0x7DDD, 0xBE84, 0x7DDE, 0xBE85, 0x7DDF, 0xBE86, 0x7DE0, 0xBE87, 0x7DE1, + 0xBE88, 0x7DE2, 0xBE89, 0x7DE3, 0xBE8A, 0x7DE4, 0xBE8B, 0x7DE5, 0xBE8C, 0x7DE6, 0xBE8D, 0x7DE7, 0xBE8E, 0x7DE8, 0xBE8F, 0x7DE9, + 0xBE90, 0x7DEA, 0xBE91, 0x7DEB, 0xBE92, 0x7DEC, 0xBE93, 0x7DED, 0xBE94, 0x7DEE, 0xBE95, 0x7DEF, 0xBE96, 0x7DF0, 0xBE97, 0x7DF1, + 0xBE98, 0x7DF2, 0xBE99, 0x7DF3, 0xBE9A, 0x7DF4, 0xBE9B, 0x7DF5, 0xBE9C, 0x7DF6, 0xBE9D, 0x7DF7, 0xBE9E, 0x7DF8, 0xBE9F, 0x7DF9, + 0xBEA0, 0x7DFA, 0xBEA1, 0x5C3D, 0xBEA2, 0x52B2, 0xBEA3, 0x8346, 0xBEA4, 0x5162, 0xBEA5, 0x830E, 0xBEA6, 0x775B, 0xBEA7, 0x6676, + 0xBEA8, 0x9CB8, 0xBEA9, 0x4EAC, 0xBEAA, 0x60CA, 0xBEAB, 0x7CBE, 0xBEAC, 0x7CB3, 0xBEAD, 0x7ECF, 0xBEAE, 0x4E95, 0xBEAF, 0x8B66, + 0xBEB0, 0x666F, 0xBEB1, 0x9888, 0xBEB2, 0x9759, 0xBEB3, 0x5883, 0xBEB4, 0x656C, 0xBEB5, 0x955C, 0xBEB6, 0x5F84, 0xBEB7, 0x75C9, + 0xBEB8, 0x9756, 0xBEB9, 0x7ADF, 0xBEBA, 0x7ADE, 0xBEBB, 0x51C0, 0xBEBC, 0x70AF, 0xBEBD, 0x7A98, 0xBEBE, 0x63EA, 0xBEBF, 0x7A76, + 0xBEC0, 0x7EA0, 0xBEC1, 0x7396, 0xBEC2, 0x97ED, 0xBEC3, 0x4E45, 0xBEC4, 0x7078, 0xBEC5, 0x4E5D, 0xBEC6, 0x9152, 0xBEC7, 0x53A9, + 0xBEC8, 0x6551, 0xBEC9, 0x65E7, 0xBECA, 0x81FC, 0xBECB, 0x8205, 0xBECC, 0x548E, 0xBECD, 0x5C31, 0xBECE, 0x759A, 0xBECF, 0x97A0, + 0xBED0, 0x62D8, 0xBED1, 0x72D9, 0xBED2, 0x75BD, 0xBED3, 0x5C45, 0xBED4, 0x9A79, 0xBED5, 0x83CA, 0xBED6, 0x5C40, 0xBED7, 0x5480, + 0xBED8, 0x77E9, 0xBED9, 0x4E3E, 0xBEDA, 0x6CAE, 0xBEDB, 0x805A, 0xBEDC, 0x62D2, 0xBEDD, 0x636E, 0xBEDE, 0x5DE8, 0xBEDF, 0x5177, + 0xBEE0, 0x8DDD, 0xBEE1, 0x8E1E, 0xBEE2, 0x952F, 0xBEE3, 0x4FF1, 0xBEE4, 0x53E5, 0xBEE5, 0x60E7, 0xBEE6, 0x70AC, 0xBEE7, 0x5267, + 0xBEE8, 0x6350, 0xBEE9, 0x9E43, 0xBEEA, 0x5A1F, 0xBEEB, 0x5026, 0xBEEC, 0x7737, 0xBEED, 0x5377, 0xBEEE, 0x7EE2, 0xBEEF, 0x6485, + 0xBEF0, 0x652B, 0xBEF1, 0x6289, 0xBEF2, 0x6398, 0xBEF3, 0x5014, 0xBEF4, 0x7235, 0xBEF5, 0x89C9, 0xBEF6, 0x51B3, 0xBEF7, 0x8BC0, + 0xBEF8, 0x7EDD, 0xBEF9, 0x5747, 0xBEFA, 0x83CC, 0xBEFB, 0x94A7, 0xBEFC, 0x519B, 0xBEFD, 0x541B, 0xBEFE, 0x5CFB, 0xBF40, 0x7DFB, + 0xBF41, 0x7DFC, 0xBF42, 0x7DFD, 0xBF43, 0x7DFE, 0xBF44, 0x7DFF, 0xBF45, 0x7E00, 0xBF46, 0x7E01, 0xBF47, 0x7E02, 0xBF48, 0x7E03, + 0xBF49, 0x7E04, 0xBF4A, 0x7E05, 0xBF4B, 0x7E06, 0xBF4C, 0x7E07, 0xBF4D, 0x7E08, 0xBF4E, 0x7E09, 0xBF4F, 0x7E0A, 0xBF50, 0x7E0B, + 0xBF51, 0x7E0C, 0xBF52, 0x7E0D, 0xBF53, 0x7E0E, 0xBF54, 0x7E0F, 0xBF55, 0x7E10, 0xBF56, 0x7E11, 0xBF57, 0x7E12, 0xBF58, 0x7E13, + 0xBF59, 0x7E14, 0xBF5A, 0x7E15, 0xBF5B, 0x7E16, 0xBF5C, 0x7E17, 0xBF5D, 0x7E18, 0xBF5E, 0x7E19, 0xBF5F, 0x7E1A, 0xBF60, 0x7E1B, + 0xBF61, 0x7E1C, 0xBF62, 0x7E1D, 0xBF63, 0x7E1E, 0xBF64, 0x7E1F, 0xBF65, 0x7E20, 0xBF66, 0x7E21, 0xBF67, 0x7E22, 0xBF68, 0x7E23, + 0xBF69, 0x7E24, 0xBF6A, 0x7E25, 0xBF6B, 0x7E26, 0xBF6C, 0x7E27, 0xBF6D, 0x7E28, 0xBF6E, 0x7E29, 0xBF6F, 0x7E2A, 0xBF70, 0x7E2B, + 0xBF71, 0x7E2C, 0xBF72, 0x7E2D, 0xBF73, 0x7E2E, 0xBF74, 0x7E2F, 0xBF75, 0x7E30, 0xBF76, 0x7E31, 0xBF77, 0x7E32, 0xBF78, 0x7E33, + 0xBF79, 0x7E34, 0xBF7A, 0x7E35, 0xBF7B, 0x7E36, 0xBF7C, 0x7E37, 0xBF7D, 0x7E38, 0xBF7E, 0x7E39, 0xBF80, 0x7E3A, 0xBF81, 0x7E3C, + 0xBF82, 0x7E3D, 0xBF83, 0x7E3E, 0xBF84, 0x7E3F, 0xBF85, 0x7E40, 0xBF86, 0x7E42, 0xBF87, 0x7E43, 0xBF88, 0x7E44, 0xBF89, 0x7E45, + 0xBF8A, 0x7E46, 0xBF8B, 0x7E48, 0xBF8C, 0x7E49, 0xBF8D, 0x7E4A, 0xBF8E, 0x7E4B, 0xBF8F, 0x7E4C, 0xBF90, 0x7E4D, 0xBF91, 0x7E4E, + 0xBF92, 0x7E4F, 0xBF93, 0x7E50, 0xBF94, 0x7E51, 0xBF95, 0x7E52, 0xBF96, 0x7E53, 0xBF97, 0x7E54, 0xBF98, 0x7E55, 0xBF99, 0x7E56, + 0xBF9A, 0x7E57, 0xBF9B, 0x7E58, 0xBF9C, 0x7E59, 0xBF9D, 0x7E5A, 0xBF9E, 0x7E5B, 0xBF9F, 0x7E5C, 0xBFA0, 0x7E5D, 0xBFA1, 0x4FCA, + 0xBFA2, 0x7AE3, 0xBFA3, 0x6D5A, 0xBFA4, 0x90E1, 0xBFA5, 0x9A8F, 0xBFA6, 0x5580, 0xBFA7, 0x5496, 0xBFA8, 0x5361, 0xBFA9, 0x54AF, + 0xBFAA, 0x5F00, 0xBFAB, 0x63E9, 0xBFAC, 0x6977, 0xBFAD, 0x51EF, 0xBFAE, 0x6168, 0xBFAF, 0x520A, 0xBFB0, 0x582A, 0xBFB1, 0x52D8, + 0xBFB2, 0x574E, 0xBFB3, 0x780D, 0xBFB4, 0x770B, 0xBFB5, 0x5EB7, 0xBFB6, 0x6177, 0xBFB7, 0x7CE0, 0xBFB8, 0x625B, 0xBFB9, 0x6297, + 0xBFBA, 0x4EA2, 0xBFBB, 0x7095, 0xBFBC, 0x8003, 0xBFBD, 0x62F7, 0xBFBE, 0x70E4, 0xBFBF, 0x9760, 0xBFC0, 0x5777, 0xBFC1, 0x82DB, + 0xBFC2, 0x67EF, 0xBFC3, 0x68F5, 0xBFC4, 0x78D5, 0xBFC5, 0x9897, 0xBFC6, 0x79D1, 0xBFC7, 0x58F3, 0xBFC8, 0x54B3, 0xBFC9, 0x53EF, + 0xBFCA, 0x6E34, 0xBFCB, 0x514B, 0xBFCC, 0x523B, 0xBFCD, 0x5BA2, 0xBFCE, 0x8BFE, 0xBFCF, 0x80AF, 0xBFD0, 0x5543, 0xBFD1, 0x57A6, + 0xBFD2, 0x6073, 0xBFD3, 0x5751, 0xBFD4, 0x542D, 0xBFD5, 0x7A7A, 0xBFD6, 0x6050, 0xBFD7, 0x5B54, 0xBFD8, 0x63A7, 0xBFD9, 0x62A0, + 0xBFDA, 0x53E3, 0xBFDB, 0x6263, 0xBFDC, 0x5BC7, 0xBFDD, 0x67AF, 0xBFDE, 0x54ED, 0xBFDF, 0x7A9F, 0xBFE0, 0x82E6, 0xBFE1, 0x9177, + 0xBFE2, 0x5E93, 0xBFE3, 0x88E4, 0xBFE4, 0x5938, 0xBFE5, 0x57AE, 0xBFE6, 0x630E, 0xBFE7, 0x8DE8, 0xBFE8, 0x80EF, 0xBFE9, 0x5757, + 0xBFEA, 0x7B77, 0xBFEB, 0x4FA9, 0xBFEC, 0x5FEB, 0xBFED, 0x5BBD, 0xBFEE, 0x6B3E, 0xBFEF, 0x5321, 0xBFF0, 0x7B50, 0xBFF1, 0x72C2, + 0xBFF2, 0x6846, 0xBFF3, 0x77FF, 0xBFF4, 0x7736, 0xBFF5, 0x65F7, 0xBFF6, 0x51B5, 0xBFF7, 0x4E8F, 0xBFF8, 0x76D4, 0xBFF9, 0x5CBF, + 0xBFFA, 0x7AA5, 0xBFFB, 0x8475, 0xBFFC, 0x594E, 0xBFFD, 0x9B41, 0xBFFE, 0x5080, 0xC040, 0x7E5E, 0xC041, 0x7E5F, 0xC042, 0x7E60, + 0xC043, 0x7E61, 0xC044, 0x7E62, 0xC045, 0x7E63, 0xC046, 0x7E64, 0xC047, 0x7E65, 0xC048, 0x7E66, 0xC049, 0x7E67, 0xC04A, 0x7E68, + 0xC04B, 0x7E69, 0xC04C, 0x7E6A, 0xC04D, 0x7E6B, 0xC04E, 0x7E6C, 0xC04F, 0x7E6D, 0xC050, 0x7E6E, 0xC051, 0x7E6F, 0xC052, 0x7E70, + 0xC053, 0x7E71, 0xC054, 0x7E72, 0xC055, 0x7E73, 0xC056, 0x7E74, 0xC057, 0x7E75, 0xC058, 0x7E76, 0xC059, 0x7E77, 0xC05A, 0x7E78, + 0xC05B, 0x7E79, 0xC05C, 0x7E7A, 0xC05D, 0x7E7B, 0xC05E, 0x7E7C, 0xC05F, 0x7E7D, 0xC060, 0x7E7E, 0xC061, 0x7E7F, 0xC062, 0x7E80, + 0xC063, 0x7E81, 0xC064, 0x7E83, 0xC065, 0x7E84, 0xC066, 0x7E85, 0xC067, 0x7E86, 0xC068, 0x7E87, 0xC069, 0x7E88, 0xC06A, 0x7E89, + 0xC06B, 0x7E8A, 0xC06C, 0x7E8B, 0xC06D, 0x7E8C, 0xC06E, 0x7E8D, 0xC06F, 0x7E8E, 0xC070, 0x7E8F, 0xC071, 0x7E90, 0xC072, 0x7E91, + 0xC073, 0x7E92, 0xC074, 0x7E93, 0xC075, 0x7E94, 0xC076, 0x7E95, 0xC077, 0x7E96, 0xC078, 0x7E97, 0xC079, 0x7E98, 0xC07A, 0x7E99, + 0xC07B, 0x7E9A, 0xC07C, 0x7E9C, 0xC07D, 0x7E9D, 0xC07E, 0x7E9E, 0xC080, 0x7EAE, 0xC081, 0x7EB4, 0xC082, 0x7EBB, 0xC083, 0x7EBC, + 0xC084, 0x7ED6, 0xC085, 0x7EE4, 0xC086, 0x7EEC, 0xC087, 0x7EF9, 0xC088, 0x7F0A, 0xC089, 0x7F10, 0xC08A, 0x7F1E, 0xC08B, 0x7F37, + 0xC08C, 0x7F39, 0xC08D, 0x7F3B, 0xC08E, 0x7F3C, 0xC08F, 0x7F3D, 0xC090, 0x7F3E, 0xC091, 0x7F3F, 0xC092, 0x7F40, 0xC093, 0x7F41, + 0xC094, 0x7F43, 0xC095, 0x7F46, 0xC096, 0x7F47, 0xC097, 0x7F48, 0xC098, 0x7F49, 0xC099, 0x7F4A, 0xC09A, 0x7F4B, 0xC09B, 0x7F4C, + 0xC09C, 0x7F4D, 0xC09D, 0x7F4E, 0xC09E, 0x7F4F, 0xC09F, 0x7F52, 0xC0A0, 0x7F53, 0xC0A1, 0x9988, 0xC0A2, 0x6127, 0xC0A3, 0x6E83, + 0xC0A4, 0x5764, 0xC0A5, 0x6606, 0xC0A6, 0x6346, 0xC0A7, 0x56F0, 0xC0A8, 0x62EC, 0xC0A9, 0x6269, 0xC0AA, 0x5ED3, 0xC0AB, 0x9614, + 0xC0AC, 0x5783, 0xC0AD, 0x62C9, 0xC0AE, 0x5587, 0xC0AF, 0x8721, 0xC0B0, 0x814A, 0xC0B1, 0x8FA3, 0xC0B2, 0x5566, 0xC0B3, 0x83B1, + 0xC0B4, 0x6765, 0xC0B5, 0x8D56, 0xC0B6, 0x84DD, 0xC0B7, 0x5A6A, 0xC0B8, 0x680F, 0xC0B9, 0x62E6, 0xC0BA, 0x7BEE, 0xC0BB, 0x9611, + 0xC0BC, 0x5170, 0xC0BD, 0x6F9C, 0xC0BE, 0x8C30, 0xC0BF, 0x63FD, 0xC0C0, 0x89C8, 0xC0C1, 0x61D2, 0xC0C2, 0x7F06, 0xC0C3, 0x70C2, + 0xC0C4, 0x6EE5, 0xC0C5, 0x7405, 0xC0C6, 0x6994, 0xC0C7, 0x72FC, 0xC0C8, 0x5ECA, 0xC0C9, 0x90CE, 0xC0CA, 0x6717, 0xC0CB, 0x6D6A, + 0xC0CC, 0x635E, 0xC0CD, 0x52B3, 0xC0CE, 0x7262, 0xC0CF, 0x8001, 0xC0D0, 0x4F6C, 0xC0D1, 0x59E5, 0xC0D2, 0x916A, 0xC0D3, 0x70D9, + 0xC0D4, 0x6D9D, 0xC0D5, 0x52D2, 0xC0D6, 0x4E50, 0xC0D7, 0x96F7, 0xC0D8, 0x956D, 0xC0D9, 0x857E, 0xC0DA, 0x78CA, 0xC0DB, 0x7D2F, + 0xC0DC, 0x5121, 0xC0DD, 0x5792, 0xC0DE, 0x64C2, 0xC0DF, 0x808B, 0xC0E0, 0x7C7B, 0xC0E1, 0x6CEA, 0xC0E2, 0x68F1, 0xC0E3, 0x695E, + 0xC0E4, 0x51B7, 0xC0E5, 0x5398, 0xC0E6, 0x68A8, 0xC0E7, 0x7281, 0xC0E8, 0x9ECE, 0xC0E9, 0x7BF1, 0xC0EA, 0x72F8, 0xC0EB, 0x79BB, + 0xC0EC, 0x6F13, 0xC0ED, 0x7406, 0xC0EE, 0x674E, 0xC0EF, 0x91CC, 0xC0F0, 0x9CA4, 0xC0F1, 0x793C, 0xC0F2, 0x8389, 0xC0F3, 0x8354, + 0xC0F4, 0x540F, 0xC0F5, 0x6817, 0xC0F6, 0x4E3D, 0xC0F7, 0x5389, 0xC0F8, 0x52B1, 0xC0F9, 0x783E, 0xC0FA, 0x5386, 0xC0FB, 0x5229, + 0xC0FC, 0x5088, 0xC0FD, 0x4F8B, 0xC0FE, 0x4FD0, 0xC140, 0x7F56, 0xC141, 0x7F59, 0xC142, 0x7F5B, 0xC143, 0x7F5C, 0xC144, 0x7F5D, + 0xC145, 0x7F5E, 0xC146, 0x7F60, 0xC147, 0x7F63, 0xC148, 0x7F64, 0xC149, 0x7F65, 0xC14A, 0x7F66, 0xC14B, 0x7F67, 0xC14C, 0x7F6B, + 0xC14D, 0x7F6C, 0xC14E, 0x7F6D, 0xC14F, 0x7F6F, 0xC150, 0x7F70, 0xC151, 0x7F73, 0xC152, 0x7F75, 0xC153, 0x7F76, 0xC154, 0x7F77, + 0xC155, 0x7F78, 0xC156, 0x7F7A, 0xC157, 0x7F7B, 0xC158, 0x7F7C, 0xC159, 0x7F7D, 0xC15A, 0x7F7F, 0xC15B, 0x7F80, 0xC15C, 0x7F82, + 0xC15D, 0x7F83, 0xC15E, 0x7F84, 0xC15F, 0x7F85, 0xC160, 0x7F86, 0xC161, 0x7F87, 0xC162, 0x7F88, 0xC163, 0x7F89, 0xC164, 0x7F8B, + 0xC165, 0x7F8D, 0xC166, 0x7F8F, 0xC167, 0x7F90, 0xC168, 0x7F91, 0xC169, 0x7F92, 0xC16A, 0x7F93, 0xC16B, 0x7F95, 0xC16C, 0x7F96, + 0xC16D, 0x7F97, 0xC16E, 0x7F98, 0xC16F, 0x7F99, 0xC170, 0x7F9B, 0xC171, 0x7F9C, 0xC172, 0x7FA0, 0xC173, 0x7FA2, 0xC174, 0x7FA3, + 0xC175, 0x7FA5, 0xC176, 0x7FA6, 0xC177, 0x7FA8, 0xC178, 0x7FA9, 0xC179, 0x7FAA, 0xC17A, 0x7FAB, 0xC17B, 0x7FAC, 0xC17C, 0x7FAD, + 0xC17D, 0x7FAE, 0xC17E, 0x7FB1, 0xC180, 0x7FB3, 0xC181, 0x7FB4, 0xC182, 0x7FB5, 0xC183, 0x7FB6, 0xC184, 0x7FB7, 0xC185, 0x7FBA, + 0xC186, 0x7FBB, 0xC187, 0x7FBE, 0xC188, 0x7FC0, 0xC189, 0x7FC2, 0xC18A, 0x7FC3, 0xC18B, 0x7FC4, 0xC18C, 0x7FC6, 0xC18D, 0x7FC7, + 0xC18E, 0x7FC8, 0xC18F, 0x7FC9, 0xC190, 0x7FCB, 0xC191, 0x7FCD, 0xC192, 0x7FCF, 0xC193, 0x7FD0, 0xC194, 0x7FD1, 0xC195, 0x7FD2, + 0xC196, 0x7FD3, 0xC197, 0x7FD6, 0xC198, 0x7FD7, 0xC199, 0x7FD9, 0xC19A, 0x7FDA, 0xC19B, 0x7FDB, 0xC19C, 0x7FDC, 0xC19D, 0x7FDD, + 0xC19E, 0x7FDE, 0xC19F, 0x7FE2, 0xC1A0, 0x7FE3, 0xC1A1, 0x75E2, 0xC1A2, 0x7ACB, 0xC1A3, 0x7C92, 0xC1A4, 0x6CA5, 0xC1A5, 0x96B6, + 0xC1A6, 0x529B, 0xC1A7, 0x7483, 0xC1A8, 0x54E9, 0xC1A9, 0x4FE9, 0xC1AA, 0x8054, 0xC1AB, 0x83B2, 0xC1AC, 0x8FDE, 0xC1AD, 0x9570, + 0xC1AE, 0x5EC9, 0xC1AF, 0x601C, 0xC1B0, 0x6D9F, 0xC1B1, 0x5E18, 0xC1B2, 0x655B, 0xC1B3, 0x8138, 0xC1B4, 0x94FE, 0xC1B5, 0x604B, + 0xC1B6, 0x70BC, 0xC1B7, 0x7EC3, 0xC1B8, 0x7CAE, 0xC1B9, 0x51C9, 0xC1BA, 0x6881, 0xC1BB, 0x7CB1, 0xC1BC, 0x826F, 0xC1BD, 0x4E24, + 0xC1BE, 0x8F86, 0xC1BF, 0x91CF, 0xC1C0, 0x667E, 0xC1C1, 0x4EAE, 0xC1C2, 0x8C05, 0xC1C3, 0x64A9, 0xC1C4, 0x804A, 0xC1C5, 0x50DA, + 0xC1C6, 0x7597, 0xC1C7, 0x71CE, 0xC1C8, 0x5BE5, 0xC1C9, 0x8FBD, 0xC1CA, 0x6F66, 0xC1CB, 0x4E86, 0xC1CC, 0x6482, 0xC1CD, 0x9563, + 0xC1CE, 0x5ED6, 0xC1CF, 0x6599, 0xC1D0, 0x5217, 0xC1D1, 0x88C2, 0xC1D2, 0x70C8, 0xC1D3, 0x52A3, 0xC1D4, 0x730E, 0xC1D5, 0x7433, + 0xC1D6, 0x6797, 0xC1D7, 0x78F7, 0xC1D8, 0x9716, 0xC1D9, 0x4E34, 0xC1DA, 0x90BB, 0xC1DB, 0x9CDE, 0xC1DC, 0x6DCB, 0xC1DD, 0x51DB, + 0xC1DE, 0x8D41, 0xC1DF, 0x541D, 0xC1E0, 0x62CE, 0xC1E1, 0x73B2, 0xC1E2, 0x83F1, 0xC1E3, 0x96F6, 0xC1E4, 0x9F84, 0xC1E5, 0x94C3, + 0xC1E6, 0x4F36, 0xC1E7, 0x7F9A, 0xC1E8, 0x51CC, 0xC1E9, 0x7075, 0xC1EA, 0x9675, 0xC1EB, 0x5CAD, 0xC1EC, 0x9886, 0xC1ED, 0x53E6, + 0xC1EE, 0x4EE4, 0xC1EF, 0x6E9C, 0xC1F0, 0x7409, 0xC1F1, 0x69B4, 0xC1F2, 0x786B, 0xC1F3, 0x998F, 0xC1F4, 0x7559, 0xC1F5, 0x5218, + 0xC1F6, 0x7624, 0xC1F7, 0x6D41, 0xC1F8, 0x67F3, 0xC1F9, 0x516D, 0xC1FA, 0x9F99, 0xC1FB, 0x804B, 0xC1FC, 0x5499, 0xC1FD, 0x7B3C, + 0xC1FE, 0x7ABF, 0xC240, 0x7FE4, 0xC241, 0x7FE7, 0xC242, 0x7FE8, 0xC243, 0x7FEA, 0xC244, 0x7FEB, 0xC245, 0x7FEC, 0xC246, 0x7FED, + 0xC247, 0x7FEF, 0xC248, 0x7FF2, 0xC249, 0x7FF4, 0xC24A, 0x7FF5, 0xC24B, 0x7FF6, 0xC24C, 0x7FF7, 0xC24D, 0x7FF8, 0xC24E, 0x7FF9, + 0xC24F, 0x7FFA, 0xC250, 0x7FFD, 0xC251, 0x7FFE, 0xC252, 0x7FFF, 0xC253, 0x8002, 0xC254, 0x8007, 0xC255, 0x8008, 0xC256, 0x8009, + 0xC257, 0x800A, 0xC258, 0x800E, 0xC259, 0x800F, 0xC25A, 0x8011, 0xC25B, 0x8013, 0xC25C, 0x801A, 0xC25D, 0x801B, 0xC25E, 0x801D, + 0xC25F, 0x801E, 0xC260, 0x801F, 0xC261, 0x8021, 0xC262, 0x8023, 0xC263, 0x8024, 0xC264, 0x802B, 0xC265, 0x802C, 0xC266, 0x802D, + 0xC267, 0x802E, 0xC268, 0x802F, 0xC269, 0x8030, 0xC26A, 0x8032, 0xC26B, 0x8034, 0xC26C, 0x8039, 0xC26D, 0x803A, 0xC26E, 0x803C, + 0xC26F, 0x803E, 0xC270, 0x8040, 0xC271, 0x8041, 0xC272, 0x8044, 0xC273, 0x8045, 0xC274, 0x8047, 0xC275, 0x8048, 0xC276, 0x8049, + 0xC277, 0x804E, 0xC278, 0x804F, 0xC279, 0x8050, 0xC27A, 0x8051, 0xC27B, 0x8053, 0xC27C, 0x8055, 0xC27D, 0x8056, 0xC27E, 0x8057, + 0xC280, 0x8059, 0xC281, 0x805B, 0xC282, 0x805C, 0xC283, 0x805D, 0xC284, 0x805E, 0xC285, 0x805F, 0xC286, 0x8060, 0xC287, 0x8061, + 0xC288, 0x8062, 0xC289, 0x8063, 0xC28A, 0x8064, 0xC28B, 0x8065, 0xC28C, 0x8066, 0xC28D, 0x8067, 0xC28E, 0x8068, 0xC28F, 0x806B, + 0xC290, 0x806C, 0xC291, 0x806D, 0xC292, 0x806E, 0xC293, 0x806F, 0xC294, 0x8070, 0xC295, 0x8072, 0xC296, 0x8073, 0xC297, 0x8074, + 0xC298, 0x8075, 0xC299, 0x8076, 0xC29A, 0x8077, 0xC29B, 0x8078, 0xC29C, 0x8079, 0xC29D, 0x807A, 0xC29E, 0x807B, 0xC29F, 0x807C, + 0xC2A0, 0x807D, 0xC2A1, 0x9686, 0xC2A2, 0x5784, 0xC2A3, 0x62E2, 0xC2A4, 0x9647, 0xC2A5, 0x697C, 0xC2A6, 0x5A04, 0xC2A7, 0x6402, + 0xC2A8, 0x7BD3, 0xC2A9, 0x6F0F, 0xC2AA, 0x964B, 0xC2AB, 0x82A6, 0xC2AC, 0x5362, 0xC2AD, 0x9885, 0xC2AE, 0x5E90, 0xC2AF, 0x7089, + 0xC2B0, 0x63B3, 0xC2B1, 0x5364, 0xC2B2, 0x864F, 0xC2B3, 0x9C81, 0xC2B4, 0x9E93, 0xC2B5, 0x788C, 0xC2B6, 0x9732, 0xC2B7, 0x8DEF, + 0xC2B8, 0x8D42, 0xC2B9, 0x9E7F, 0xC2BA, 0x6F5E, 0xC2BB, 0x7984, 0xC2BC, 0x5F55, 0xC2BD, 0x9646, 0xC2BE, 0x622E, 0xC2BF, 0x9A74, + 0xC2C0, 0x5415, 0xC2C1, 0x94DD, 0xC2C2, 0x4FA3, 0xC2C3, 0x65C5, 0xC2C4, 0x5C65, 0xC2C5, 0x5C61, 0xC2C6, 0x7F15, 0xC2C7, 0x8651, + 0xC2C8, 0x6C2F, 0xC2C9, 0x5F8B, 0xC2CA, 0x7387, 0xC2CB, 0x6EE4, 0xC2CC, 0x7EFF, 0xC2CD, 0x5CE6, 0xC2CE, 0x631B, 0xC2CF, 0x5B6A, + 0xC2D0, 0x6EE6, 0xC2D1, 0x5375, 0xC2D2, 0x4E71, 0xC2D3, 0x63A0, 0xC2D4, 0x7565, 0xC2D5, 0x62A1, 0xC2D6, 0x8F6E, 0xC2D7, 0x4F26, + 0xC2D8, 0x4ED1, 0xC2D9, 0x6CA6, 0xC2DA, 0x7EB6, 0xC2DB, 0x8BBA, 0xC2DC, 0x841D, 0xC2DD, 0x87BA, 0xC2DE, 0x7F57, 0xC2DF, 0x903B, + 0xC2E0, 0x9523, 0xC2E1, 0x7BA9, 0xC2E2, 0x9AA1, 0xC2E3, 0x88F8, 0xC2E4, 0x843D, 0xC2E5, 0x6D1B, 0xC2E6, 0x9A86, 0xC2E7, 0x7EDC, + 0xC2E8, 0x5988, 0xC2E9, 0x9EBB, 0xC2EA, 0x739B, 0xC2EB, 0x7801, 0xC2EC, 0x8682, 0xC2ED, 0x9A6C, 0xC2EE, 0x9A82, 0xC2EF, 0x561B, + 0xC2F0, 0x5417, 0xC2F1, 0x57CB, 0xC2F2, 0x4E70, 0xC2F3, 0x9EA6, 0xC2F4, 0x5356, 0xC2F5, 0x8FC8, 0xC2F6, 0x8109, 0xC2F7, 0x7792, + 0xC2F8, 0x9992, 0xC2F9, 0x86EE, 0xC2FA, 0x6EE1, 0xC2FB, 0x8513, 0xC2FC, 0x66FC, 0xC2FD, 0x6162, 0xC2FE, 0x6F2B, 0xC340, 0x807E, + 0xC341, 0x8081, 0xC342, 0x8082, 0xC343, 0x8085, 0xC344, 0x8088, 0xC345, 0x808A, 0xC346, 0x808D, 0xC347, 0x808E, 0xC348, 0x808F, + 0xC349, 0x8090, 0xC34A, 0x8091, 0xC34B, 0x8092, 0xC34C, 0x8094, 0xC34D, 0x8095, 0xC34E, 0x8097, 0xC34F, 0x8099, 0xC350, 0x809E, + 0xC351, 0x80A3, 0xC352, 0x80A6, 0xC353, 0x80A7, 0xC354, 0x80A8, 0xC355, 0x80AC, 0xC356, 0x80B0, 0xC357, 0x80B3, 0xC358, 0x80B5, + 0xC359, 0x80B6, 0xC35A, 0x80B8, 0xC35B, 0x80B9, 0xC35C, 0x80BB, 0xC35D, 0x80C5, 0xC35E, 0x80C7, 0xC35F, 0x80C8, 0xC360, 0x80C9, + 0xC361, 0x80CA, 0xC362, 0x80CB, 0xC363, 0x80CF, 0xC364, 0x80D0, 0xC365, 0x80D1, 0xC366, 0x80D2, 0xC367, 0x80D3, 0xC368, 0x80D4, + 0xC369, 0x80D5, 0xC36A, 0x80D8, 0xC36B, 0x80DF, 0xC36C, 0x80E0, 0xC36D, 0x80E2, 0xC36E, 0x80E3, 0xC36F, 0x80E6, 0xC370, 0x80EE, + 0xC371, 0x80F5, 0xC372, 0x80F7, 0xC373, 0x80F9, 0xC374, 0x80FB, 0xC375, 0x80FE, 0xC376, 0x80FF, 0xC377, 0x8100, 0xC378, 0x8101, + 0xC379, 0x8103, 0xC37A, 0x8104, 0xC37B, 0x8105, 0xC37C, 0x8107, 0xC37D, 0x8108, 0xC37E, 0x810B, 0xC380, 0x810C, 0xC381, 0x8115, + 0xC382, 0x8117, 0xC383, 0x8119, 0xC384, 0x811B, 0xC385, 0x811C, 0xC386, 0x811D, 0xC387, 0x811F, 0xC388, 0x8120, 0xC389, 0x8121, + 0xC38A, 0x8122, 0xC38B, 0x8123, 0xC38C, 0x8124, 0xC38D, 0x8125, 0xC38E, 0x8126, 0xC38F, 0x8127, 0xC390, 0x8128, 0xC391, 0x8129, + 0xC392, 0x812A, 0xC393, 0x812B, 0xC394, 0x812D, 0xC395, 0x812E, 0xC396, 0x8130, 0xC397, 0x8133, 0xC398, 0x8134, 0xC399, 0x8135, + 0xC39A, 0x8137, 0xC39B, 0x8139, 0xC39C, 0x813A, 0xC39D, 0x813B, 0xC39E, 0x813C, 0xC39F, 0x813D, 0xC3A0, 0x813F, 0xC3A1, 0x8C29, + 0xC3A2, 0x8292, 0xC3A3, 0x832B, 0xC3A4, 0x76F2, 0xC3A5, 0x6C13, 0xC3A6, 0x5FD9, 0xC3A7, 0x83BD, 0xC3A8, 0x732B, 0xC3A9, 0x8305, + 0xC3AA, 0x951A, 0xC3AB, 0x6BDB, 0xC3AC, 0x77DB, 0xC3AD, 0x94C6, 0xC3AE, 0x536F, 0xC3AF, 0x8302, 0xC3B0, 0x5192, 0xC3B1, 0x5E3D, + 0xC3B2, 0x8C8C, 0xC3B3, 0x8D38, 0xC3B4, 0x4E48, 0xC3B5, 0x73AB, 0xC3B6, 0x679A, 0xC3B7, 0x6885, 0xC3B8, 0x9176, 0xC3B9, 0x9709, + 0xC3BA, 0x7164, 0xC3BB, 0x6CA1, 0xC3BC, 0x7709, 0xC3BD, 0x5A92, 0xC3BE, 0x9541, 0xC3BF, 0x6BCF, 0xC3C0, 0x7F8E, 0xC3C1, 0x6627, + 0xC3C2, 0x5BD0, 0xC3C3, 0x59B9, 0xC3C4, 0x5A9A, 0xC3C5, 0x95E8, 0xC3C6, 0x95F7, 0xC3C7, 0x4EEC, 0xC3C8, 0x840C, 0xC3C9, 0x8499, + 0xC3CA, 0x6AAC, 0xC3CB, 0x76DF, 0xC3CC, 0x9530, 0xC3CD, 0x731B, 0xC3CE, 0x68A6, 0xC3CF, 0x5B5F, 0xC3D0, 0x772F, 0xC3D1, 0x919A, + 0xC3D2, 0x9761, 0xC3D3, 0x7CDC, 0xC3D4, 0x8FF7, 0xC3D5, 0x8C1C, 0xC3D6, 0x5F25, 0xC3D7, 0x7C73, 0xC3D8, 0x79D8, 0xC3D9, 0x89C5, + 0xC3DA, 0x6CCC, 0xC3DB, 0x871C, 0xC3DC, 0x5BC6, 0xC3DD, 0x5E42, 0xC3DE, 0x68C9, 0xC3DF, 0x7720, 0xC3E0, 0x7EF5, 0xC3E1, 0x5195, + 0xC3E2, 0x514D, 0xC3E3, 0x52C9, 0xC3E4, 0x5A29, 0xC3E5, 0x7F05, 0xC3E6, 0x9762, 0xC3E7, 0x82D7, 0xC3E8, 0x63CF, 0xC3E9, 0x7784, + 0xC3EA, 0x85D0, 0xC3EB, 0x79D2, 0xC3EC, 0x6E3A, 0xC3ED, 0x5E99, 0xC3EE, 0x5999, 0xC3EF, 0x8511, 0xC3F0, 0x706D, 0xC3F1, 0x6C11, + 0xC3F2, 0x62BF, 0xC3F3, 0x76BF, 0xC3F4, 0x654F, 0xC3F5, 0x60AF, 0xC3F6, 0x95FD, 0xC3F7, 0x660E, 0xC3F8, 0x879F, 0xC3F9, 0x9E23, + 0xC3FA, 0x94ED, 0xC3FB, 0x540D, 0xC3FC, 0x547D, 0xC3FD, 0x8C2C, 0xC3FE, 0x6478, 0xC440, 0x8140, 0xC441, 0x8141, 0xC442, 0x8142, + 0xC443, 0x8143, 0xC444, 0x8144, 0xC445, 0x8145, 0xC446, 0x8147, 0xC447, 0x8149, 0xC448, 0x814D, 0xC449, 0x814E, 0xC44A, 0x814F, + 0xC44B, 0x8152, 0xC44C, 0x8156, 0xC44D, 0x8157, 0xC44E, 0x8158, 0xC44F, 0x815B, 0xC450, 0x815C, 0xC451, 0x815D, 0xC452, 0x815E, + 0xC453, 0x815F, 0xC454, 0x8161, 0xC455, 0x8162, 0xC456, 0x8163, 0xC457, 0x8164, 0xC458, 0x8166, 0xC459, 0x8168, 0xC45A, 0x816A, + 0xC45B, 0x816B, 0xC45C, 0x816C, 0xC45D, 0x816F, 0xC45E, 0x8172, 0xC45F, 0x8173, 0xC460, 0x8175, 0xC461, 0x8176, 0xC462, 0x8177, + 0xC463, 0x8178, 0xC464, 0x8181, 0xC465, 0x8183, 0xC466, 0x8184, 0xC467, 0x8185, 0xC468, 0x8186, 0xC469, 0x8187, 0xC46A, 0x8189, + 0xC46B, 0x818B, 0xC46C, 0x818C, 0xC46D, 0x818D, 0xC46E, 0x818E, 0xC46F, 0x8190, 0xC470, 0x8192, 0xC471, 0x8193, 0xC472, 0x8194, + 0xC473, 0x8195, 0xC474, 0x8196, 0xC475, 0x8197, 0xC476, 0x8199, 0xC477, 0x819A, 0xC478, 0x819E, 0xC479, 0x819F, 0xC47A, 0x81A0, + 0xC47B, 0x81A1, 0xC47C, 0x81A2, 0xC47D, 0x81A4, 0xC47E, 0x81A5, 0xC480, 0x81A7, 0xC481, 0x81A9, 0xC482, 0x81AB, 0xC483, 0x81AC, + 0xC484, 0x81AD, 0xC485, 0x81AE, 0xC486, 0x81AF, 0xC487, 0x81B0, 0xC488, 0x81B1, 0xC489, 0x81B2, 0xC48A, 0x81B4, 0xC48B, 0x81B5, + 0xC48C, 0x81B6, 0xC48D, 0x81B7, 0xC48E, 0x81B8, 0xC48F, 0x81B9, 0xC490, 0x81BC, 0xC491, 0x81BD, 0xC492, 0x81BE, 0xC493, 0x81BF, + 0xC494, 0x81C4, 0xC495, 0x81C5, 0xC496, 0x81C7, 0xC497, 0x81C8, 0xC498, 0x81C9, 0xC499, 0x81CB, 0xC49A, 0x81CD, 0xC49B, 0x81CE, + 0xC49C, 0x81CF, 0xC49D, 0x81D0, 0xC49E, 0x81D1, 0xC49F, 0x81D2, 0xC4A0, 0x81D3, 0xC4A1, 0x6479, 0xC4A2, 0x8611, 0xC4A3, 0x6A21, + 0xC4A4, 0x819C, 0xC4A5, 0x78E8, 0xC4A6, 0x6469, 0xC4A7, 0x9B54, 0xC4A8, 0x62B9, 0xC4A9, 0x672B, 0xC4AA, 0x83AB, 0xC4AB, 0x58A8, + 0xC4AC, 0x9ED8, 0xC4AD, 0x6CAB, 0xC4AE, 0x6F20, 0xC4AF, 0x5BDE, 0xC4B0, 0x964C, 0xC4B1, 0x8C0B, 0xC4B2, 0x725F, 0xC4B3, 0x67D0, + 0xC4B4, 0x62C7, 0xC4B5, 0x7261, 0xC4B6, 0x4EA9, 0xC4B7, 0x59C6, 0xC4B8, 0x6BCD, 0xC4B9, 0x5893, 0xC4BA, 0x66AE, 0xC4BB, 0x5E55, + 0xC4BC, 0x52DF, 0xC4BD, 0x6155, 0xC4BE, 0x6728, 0xC4BF, 0x76EE, 0xC4C0, 0x7766, 0xC4C1, 0x7267, 0xC4C2, 0x7A46, 0xC4C3, 0x62FF, + 0xC4C4, 0x54EA, 0xC4C5, 0x5450, 0xC4C6, 0x94A0, 0xC4C7, 0x90A3, 0xC4C8, 0x5A1C, 0xC4C9, 0x7EB3, 0xC4CA, 0x6C16, 0xC4CB, 0x4E43, + 0xC4CC, 0x5976, 0xC4CD, 0x8010, 0xC4CE, 0x5948, 0xC4CF, 0x5357, 0xC4D0, 0x7537, 0xC4D1, 0x96BE, 0xC4D2, 0x56CA, 0xC4D3, 0x6320, + 0xC4D4, 0x8111, 0xC4D5, 0x607C, 0xC4D6, 0x95F9, 0xC4D7, 0x6DD6, 0xC4D8, 0x5462, 0xC4D9, 0x9981, 0xC4DA, 0x5185, 0xC4DB, 0x5AE9, + 0xC4DC, 0x80FD, 0xC4DD, 0x59AE, 0xC4DE, 0x9713, 0xC4DF, 0x502A, 0xC4E0, 0x6CE5, 0xC4E1, 0x5C3C, 0xC4E2, 0x62DF, 0xC4E3, 0x4F60, + 0xC4E4, 0x533F, 0xC4E5, 0x817B, 0xC4E6, 0x9006, 0xC4E7, 0x6EBA, 0xC4E8, 0x852B, 0xC4E9, 0x62C8, 0xC4EA, 0x5E74, 0xC4EB, 0x78BE, + 0xC4EC, 0x64B5, 0xC4ED, 0x637B, 0xC4EE, 0x5FF5, 0xC4EF, 0x5A18, 0xC4F0, 0x917F, 0xC4F1, 0x9E1F, 0xC4F2, 0x5C3F, 0xC4F3, 0x634F, + 0xC4F4, 0x8042, 0xC4F5, 0x5B7D, 0xC4F6, 0x556E, 0xC4F7, 0x954A, 0xC4F8, 0x954D, 0xC4F9, 0x6D85, 0xC4FA, 0x60A8, 0xC4FB, 0x67E0, + 0xC4FC, 0x72DE, 0xC4FD, 0x51DD, 0xC4FE, 0x5B81, 0xC540, 0x81D4, 0xC541, 0x81D5, 0xC542, 0x81D6, 0xC543, 0x81D7, 0xC544, 0x81D8, + 0xC545, 0x81D9, 0xC546, 0x81DA, 0xC547, 0x81DB, 0xC548, 0x81DC, 0xC549, 0x81DD, 0xC54A, 0x81DE, 0xC54B, 0x81DF, 0xC54C, 0x81E0, + 0xC54D, 0x81E1, 0xC54E, 0x81E2, 0xC54F, 0x81E4, 0xC550, 0x81E5, 0xC551, 0x81E6, 0xC552, 0x81E8, 0xC553, 0x81E9, 0xC554, 0x81EB, + 0xC555, 0x81EE, 0xC556, 0x81EF, 0xC557, 0x81F0, 0xC558, 0x81F1, 0xC559, 0x81F2, 0xC55A, 0x81F5, 0xC55B, 0x81F6, 0xC55C, 0x81F7, + 0xC55D, 0x81F8, 0xC55E, 0x81F9, 0xC55F, 0x81FA, 0xC560, 0x81FD, 0xC561, 0x81FF, 0xC562, 0x8203, 0xC563, 0x8207, 0xC564, 0x8208, + 0xC565, 0x8209, 0xC566, 0x820A, 0xC567, 0x820B, 0xC568, 0x820E, 0xC569, 0x820F, 0xC56A, 0x8211, 0xC56B, 0x8213, 0xC56C, 0x8215, + 0xC56D, 0x8216, 0xC56E, 0x8217, 0xC56F, 0x8218, 0xC570, 0x8219, 0xC571, 0x821A, 0xC572, 0x821D, 0xC573, 0x8220, 0xC574, 0x8224, + 0xC575, 0x8225, 0xC576, 0x8226, 0xC577, 0x8227, 0xC578, 0x8229, 0xC579, 0x822E, 0xC57A, 0x8232, 0xC57B, 0x823A, 0xC57C, 0x823C, + 0xC57D, 0x823D, 0xC57E, 0x823F, 0xC580, 0x8240, 0xC581, 0x8241, 0xC582, 0x8242, 0xC583, 0x8243, 0xC584, 0x8245, 0xC585, 0x8246, + 0xC586, 0x8248, 0xC587, 0x824A, 0xC588, 0x824C, 0xC589, 0x824D, 0xC58A, 0x824E, 0xC58B, 0x8250, 0xC58C, 0x8251, 0xC58D, 0x8252, + 0xC58E, 0x8253, 0xC58F, 0x8254, 0xC590, 0x8255, 0xC591, 0x8256, 0xC592, 0x8257, 0xC593, 0x8259, 0xC594, 0x825B, 0xC595, 0x825C, + 0xC596, 0x825D, 0xC597, 0x825E, 0xC598, 0x8260, 0xC599, 0x8261, 0xC59A, 0x8262, 0xC59B, 0x8263, 0xC59C, 0x8264, 0xC59D, 0x8265, + 0xC59E, 0x8266, 0xC59F, 0x8267, 0xC5A0, 0x8269, 0xC5A1, 0x62E7, 0xC5A2, 0x6CDE, 0xC5A3, 0x725B, 0xC5A4, 0x626D, 0xC5A5, 0x94AE, + 0xC5A6, 0x7EBD, 0xC5A7, 0x8113, 0xC5A8, 0x6D53, 0xC5A9, 0x519C, 0xC5AA, 0x5F04, 0xC5AB, 0x5974, 0xC5AC, 0x52AA, 0xC5AD, 0x6012, + 0xC5AE, 0x5973, 0xC5AF, 0x6696, 0xC5B0, 0x8650, 0xC5B1, 0x759F, 0xC5B2, 0x632A, 0xC5B3, 0x61E6, 0xC5B4, 0x7CEF, 0xC5B5, 0x8BFA, + 0xC5B6, 0x54E6, 0xC5B7, 0x6B27, 0xC5B8, 0x9E25, 0xC5B9, 0x6BB4, 0xC5BA, 0x85D5, 0xC5BB, 0x5455, 0xC5BC, 0x5076, 0xC5BD, 0x6CA4, + 0xC5BE, 0x556A, 0xC5BF, 0x8DB4, 0xC5C0, 0x722C, 0xC5C1, 0x5E15, 0xC5C2, 0x6015, 0xC5C3, 0x7436, 0xC5C4, 0x62CD, 0xC5C5, 0x6392, + 0xC5C6, 0x724C, 0xC5C7, 0x5F98, 0xC5C8, 0x6E43, 0xC5C9, 0x6D3E, 0xC5CA, 0x6500, 0xC5CB, 0x6F58, 0xC5CC, 0x76D8, 0xC5CD, 0x78D0, + 0xC5CE, 0x76FC, 0xC5CF, 0x7554, 0xC5D0, 0x5224, 0xC5D1, 0x53DB, 0xC5D2, 0x4E53, 0xC5D3, 0x5E9E, 0xC5D4, 0x65C1, 0xC5D5, 0x802A, + 0xC5D6, 0x80D6, 0xC5D7, 0x629B, 0xC5D8, 0x5486, 0xC5D9, 0x5228, 0xC5DA, 0x70AE, 0xC5DB, 0x888D, 0xC5DC, 0x8DD1, 0xC5DD, 0x6CE1, + 0xC5DE, 0x5478, 0xC5DF, 0x80DA, 0xC5E0, 0x57F9, 0xC5E1, 0x88F4, 0xC5E2, 0x8D54, 0xC5E3, 0x966A, 0xC5E4, 0x914D, 0xC5E5, 0x4F69, + 0xC5E6, 0x6C9B, 0xC5E7, 0x55B7, 0xC5E8, 0x76C6, 0xC5E9, 0x7830, 0xC5EA, 0x62A8, 0xC5EB, 0x70F9, 0xC5EC, 0x6F8E, 0xC5ED, 0x5F6D, + 0xC5EE, 0x84EC, 0xC5EF, 0x68DA, 0xC5F0, 0x787C, 0xC5F1, 0x7BF7, 0xC5F2, 0x81A8, 0xC5F3, 0x670B, 0xC5F4, 0x9E4F, 0xC5F5, 0x6367, + 0xC5F6, 0x78B0, 0xC5F7, 0x576F, 0xC5F8, 0x7812, 0xC5F9, 0x9739, 0xC5FA, 0x6279, 0xC5FB, 0x62AB, 0xC5FC, 0x5288, 0xC5FD, 0x7435, + 0xC5FE, 0x6BD7, 0xC640, 0x826A, 0xC641, 0x826B, 0xC642, 0x826C, 0xC643, 0x826D, 0xC644, 0x8271, 0xC645, 0x8275, 0xC646, 0x8276, + 0xC647, 0x8277, 0xC648, 0x8278, 0xC649, 0x827B, 0xC64A, 0x827C, 0xC64B, 0x8280, 0xC64C, 0x8281, 0xC64D, 0x8283, 0xC64E, 0x8285, + 0xC64F, 0x8286, 0xC650, 0x8287, 0xC651, 0x8289, 0xC652, 0x828C, 0xC653, 0x8290, 0xC654, 0x8293, 0xC655, 0x8294, 0xC656, 0x8295, + 0xC657, 0x8296, 0xC658, 0x829A, 0xC659, 0x829B, 0xC65A, 0x829E, 0xC65B, 0x82A0, 0xC65C, 0x82A2, 0xC65D, 0x82A3, 0xC65E, 0x82A7, + 0xC65F, 0x82B2, 0xC660, 0x82B5, 0xC661, 0x82B6, 0xC662, 0x82BA, 0xC663, 0x82BB, 0xC664, 0x82BC, 0xC665, 0x82BF, 0xC666, 0x82C0, + 0xC667, 0x82C2, 0xC668, 0x82C3, 0xC669, 0x82C5, 0xC66A, 0x82C6, 0xC66B, 0x82C9, 0xC66C, 0x82D0, 0xC66D, 0x82D6, 0xC66E, 0x82D9, + 0xC66F, 0x82DA, 0xC670, 0x82DD, 0xC671, 0x82E2, 0xC672, 0x82E7, 0xC673, 0x82E8, 0xC674, 0x82E9, 0xC675, 0x82EA, 0xC676, 0x82EC, + 0xC677, 0x82ED, 0xC678, 0x82EE, 0xC679, 0x82F0, 0xC67A, 0x82F2, 0xC67B, 0x82F3, 0xC67C, 0x82F5, 0xC67D, 0x82F6, 0xC67E, 0x82F8, + 0xC680, 0x82FA, 0xC681, 0x82FC, 0xC682, 0x82FD, 0xC683, 0x82FE, 0xC684, 0x82FF, 0xC685, 0x8300, 0xC686, 0x830A, 0xC687, 0x830B, + 0xC688, 0x830D, 0xC689, 0x8310, 0xC68A, 0x8312, 0xC68B, 0x8313, 0xC68C, 0x8316, 0xC68D, 0x8318, 0xC68E, 0x8319, 0xC68F, 0x831D, + 0xC690, 0x831E, 0xC691, 0x831F, 0xC692, 0x8320, 0xC693, 0x8321, 0xC694, 0x8322, 0xC695, 0x8323, 0xC696, 0x8324, 0xC697, 0x8325, + 0xC698, 0x8326, 0xC699, 0x8329, 0xC69A, 0x832A, 0xC69B, 0x832E, 0xC69C, 0x8330, 0xC69D, 0x8332, 0xC69E, 0x8337, 0xC69F, 0x833B, + 0xC6A0, 0x833D, 0xC6A1, 0x5564, 0xC6A2, 0x813E, 0xC6A3, 0x75B2, 0xC6A4, 0x76AE, 0xC6A5, 0x5339, 0xC6A6, 0x75DE, 0xC6A7, 0x50FB, + 0xC6A8, 0x5C41, 0xC6A9, 0x8B6C, 0xC6AA, 0x7BC7, 0xC6AB, 0x504F, 0xC6AC, 0x7247, 0xC6AD, 0x9A97, 0xC6AE, 0x98D8, 0xC6AF, 0x6F02, + 0xC6B0, 0x74E2, 0xC6B1, 0x7968, 0xC6B2, 0x6487, 0xC6B3, 0x77A5, 0xC6B4, 0x62FC, 0xC6B5, 0x9891, 0xC6B6, 0x8D2B, 0xC6B7, 0x54C1, + 0xC6B8, 0x8058, 0xC6B9, 0x4E52, 0xC6BA, 0x576A, 0xC6BB, 0x82F9, 0xC6BC, 0x840D, 0xC6BD, 0x5E73, 0xC6BE, 0x51ED, 0xC6BF, 0x74F6, + 0xC6C0, 0x8BC4, 0xC6C1, 0x5C4F, 0xC6C2, 0x5761, 0xC6C3, 0x6CFC, 0xC6C4, 0x9887, 0xC6C5, 0x5A46, 0xC6C6, 0x7834, 0xC6C7, 0x9B44, + 0xC6C8, 0x8FEB, 0xC6C9, 0x7C95, 0xC6CA, 0x5256, 0xC6CB, 0x6251, 0xC6CC, 0x94FA, 0xC6CD, 0x4EC6, 0xC6CE, 0x8386, 0xC6CF, 0x8461, + 0xC6D0, 0x83E9, 0xC6D1, 0x84B2, 0xC6D2, 0x57D4, 0xC6D3, 0x6734, 0xC6D4, 0x5703, 0xC6D5, 0x666E, 0xC6D6, 0x6D66, 0xC6D7, 0x8C31, + 0xC6D8, 0x66DD, 0xC6D9, 0x7011, 0xC6DA, 0x671F, 0xC6DB, 0x6B3A, 0xC6DC, 0x6816, 0xC6DD, 0x621A, 0xC6DE, 0x59BB, 0xC6DF, 0x4E03, + 0xC6E0, 0x51C4, 0xC6E1, 0x6F06, 0xC6E2, 0x67D2, 0xC6E3, 0x6C8F, 0xC6E4, 0x5176, 0xC6E5, 0x68CB, 0xC6E6, 0x5947, 0xC6E7, 0x6B67, + 0xC6E8, 0x7566, 0xC6E9, 0x5D0E, 0xC6EA, 0x8110, 0xC6EB, 0x9F50, 0xC6EC, 0x65D7, 0xC6ED, 0x7948, 0xC6EE, 0x7941, 0xC6EF, 0x9A91, + 0xC6F0, 0x8D77, 0xC6F1, 0x5C82, 0xC6F2, 0x4E5E, 0xC6F3, 0x4F01, 0xC6F4, 0x542F, 0xC6F5, 0x5951, 0xC6F6, 0x780C, 0xC6F7, 0x5668, + 0xC6F8, 0x6C14, 0xC6F9, 0x8FC4, 0xC6FA, 0x5F03, 0xC6FB, 0x6C7D, 0xC6FC, 0x6CE3, 0xC6FD, 0x8BAB, 0xC6FE, 0x6390, 0xC740, 0x833E, + 0xC741, 0x833F, 0xC742, 0x8341, 0xC743, 0x8342, 0xC744, 0x8344, 0xC745, 0x8345, 0xC746, 0x8348, 0xC747, 0x834A, 0xC748, 0x834B, + 0xC749, 0x834C, 0xC74A, 0x834D, 0xC74B, 0x834E, 0xC74C, 0x8353, 0xC74D, 0x8355, 0xC74E, 0x8356, 0xC74F, 0x8357, 0xC750, 0x8358, + 0xC751, 0x8359, 0xC752, 0x835D, 0xC753, 0x8362, 0xC754, 0x8370, 0xC755, 0x8371, 0xC756, 0x8372, 0xC757, 0x8373, 0xC758, 0x8374, + 0xC759, 0x8375, 0xC75A, 0x8376, 0xC75B, 0x8379, 0xC75C, 0x837A, 0xC75D, 0x837E, 0xC75E, 0x837F, 0xC75F, 0x8380, 0xC760, 0x8381, + 0xC761, 0x8382, 0xC762, 0x8383, 0xC763, 0x8384, 0xC764, 0x8387, 0xC765, 0x8388, 0xC766, 0x838A, 0xC767, 0x838B, 0xC768, 0x838C, + 0xC769, 0x838D, 0xC76A, 0x838F, 0xC76B, 0x8390, 0xC76C, 0x8391, 0xC76D, 0x8394, 0xC76E, 0x8395, 0xC76F, 0x8396, 0xC770, 0x8397, + 0xC771, 0x8399, 0xC772, 0x839A, 0xC773, 0x839D, 0xC774, 0x839F, 0xC775, 0x83A1, 0xC776, 0x83A2, 0xC777, 0x83A3, 0xC778, 0x83A4, + 0xC779, 0x83A5, 0xC77A, 0x83A6, 0xC77B, 0x83A7, 0xC77C, 0x83AC, 0xC77D, 0x83AD, 0xC77E, 0x83AE, 0xC780, 0x83AF, 0xC781, 0x83B5, + 0xC782, 0x83BB, 0xC783, 0x83BE, 0xC784, 0x83BF, 0xC785, 0x83C2, 0xC786, 0x83C3, 0xC787, 0x83C4, 0xC788, 0x83C6, 0xC789, 0x83C8, + 0xC78A, 0x83C9, 0xC78B, 0x83CB, 0xC78C, 0x83CD, 0xC78D, 0x83CE, 0xC78E, 0x83D0, 0xC78F, 0x83D1, 0xC790, 0x83D2, 0xC791, 0x83D3, + 0xC792, 0x83D5, 0xC793, 0x83D7, 0xC794, 0x83D9, 0xC795, 0x83DA, 0xC796, 0x83DB, 0xC797, 0x83DE, 0xC798, 0x83E2, 0xC799, 0x83E3, + 0xC79A, 0x83E4, 0xC79B, 0x83E6, 0xC79C, 0x83E7, 0xC79D, 0x83E8, 0xC79E, 0x83EB, 0xC79F, 0x83EC, 0xC7A0, 0x83ED, 0xC7A1, 0x6070, + 0xC7A2, 0x6D3D, 0xC7A3, 0x7275, 0xC7A4, 0x6266, 0xC7A5, 0x948E, 0xC7A6, 0x94C5, 0xC7A7, 0x5343, 0xC7A8, 0x8FC1, 0xC7A9, 0x7B7E, + 0xC7AA, 0x4EDF, 0xC7AB, 0x8C26, 0xC7AC, 0x4E7E, 0xC7AD, 0x9ED4, 0xC7AE, 0x94B1, 0xC7AF, 0x94B3, 0xC7B0, 0x524D, 0xC7B1, 0x6F5C, + 0xC7B2, 0x9063, 0xC7B3, 0x6D45, 0xC7B4, 0x8C34, 0xC7B5, 0x5811, 0xC7B6, 0x5D4C, 0xC7B7, 0x6B20, 0xC7B8, 0x6B49, 0xC7B9, 0x67AA, + 0xC7BA, 0x545B, 0xC7BB, 0x8154, 0xC7BC, 0x7F8C, 0xC7BD, 0x5899, 0xC7BE, 0x8537, 0xC7BF, 0x5F3A, 0xC7C0, 0x62A2, 0xC7C1, 0x6A47, + 0xC7C2, 0x9539, 0xC7C3, 0x6572, 0xC7C4, 0x6084, 0xC7C5, 0x6865, 0xC7C6, 0x77A7, 0xC7C7, 0x4E54, 0xC7C8, 0x4FA8, 0xC7C9, 0x5DE7, + 0xC7CA, 0x9798, 0xC7CB, 0x64AC, 0xC7CC, 0x7FD8, 0xC7CD, 0x5CED, 0xC7CE, 0x4FCF, 0xC7CF, 0x7A8D, 0xC7D0, 0x5207, 0xC7D1, 0x8304, + 0xC7D2, 0x4E14, 0xC7D3, 0x602F, 0xC7D4, 0x7A83, 0xC7D5, 0x94A6, 0xC7D6, 0x4FB5, 0xC7D7, 0x4EB2, 0xC7D8, 0x79E6, 0xC7D9, 0x7434, + 0xC7DA, 0x52E4, 0xC7DB, 0x82B9, 0xC7DC, 0x64D2, 0xC7DD, 0x79BD, 0xC7DE, 0x5BDD, 0xC7DF, 0x6C81, 0xC7E0, 0x9752, 0xC7E1, 0x8F7B, + 0xC7E2, 0x6C22, 0xC7E3, 0x503E, 0xC7E4, 0x537F, 0xC7E5, 0x6E05, 0xC7E6, 0x64CE, 0xC7E7, 0x6674, 0xC7E8, 0x6C30, 0xC7E9, 0x60C5, + 0xC7EA, 0x9877, 0xC7EB, 0x8BF7, 0xC7EC, 0x5E86, 0xC7ED, 0x743C, 0xC7EE, 0x7A77, 0xC7EF, 0x79CB, 0xC7F0, 0x4E18, 0xC7F1, 0x90B1, + 0xC7F2, 0x7403, 0xC7F3, 0x6C42, 0xC7F4, 0x56DA, 0xC7F5, 0x914B, 0xC7F6, 0x6CC5, 0xC7F7, 0x8D8B, 0xC7F8, 0x533A, 0xC7F9, 0x86C6, + 0xC7FA, 0x66F2, 0xC7FB, 0x8EAF, 0xC7FC, 0x5C48, 0xC7FD, 0x9A71, 0xC7FE, 0x6E20, 0xC840, 0x83EE, 0xC841, 0x83EF, 0xC842, 0x83F3, + 0xC843, 0x83F4, 0xC844, 0x83F5, 0xC845, 0x83F6, 0xC846, 0x83F7, 0xC847, 0x83FA, 0xC848, 0x83FB, 0xC849, 0x83FC, 0xC84A, 0x83FE, + 0xC84B, 0x83FF, 0xC84C, 0x8400, 0xC84D, 0x8402, 0xC84E, 0x8405, 0xC84F, 0x8407, 0xC850, 0x8408, 0xC851, 0x8409, 0xC852, 0x840A, + 0xC853, 0x8410, 0xC854, 0x8412, 0xC855, 0x8413, 0xC856, 0x8414, 0xC857, 0x8415, 0xC858, 0x8416, 0xC859, 0x8417, 0xC85A, 0x8419, + 0xC85B, 0x841A, 0xC85C, 0x841B, 0xC85D, 0x841E, 0xC85E, 0x841F, 0xC85F, 0x8420, 0xC860, 0x8421, 0xC861, 0x8422, 0xC862, 0x8423, + 0xC863, 0x8429, 0xC864, 0x842A, 0xC865, 0x842B, 0xC866, 0x842C, 0xC867, 0x842D, 0xC868, 0x842E, 0xC869, 0x842F, 0xC86A, 0x8430, + 0xC86B, 0x8432, 0xC86C, 0x8433, 0xC86D, 0x8434, 0xC86E, 0x8435, 0xC86F, 0x8436, 0xC870, 0x8437, 0xC871, 0x8439, 0xC872, 0x843A, + 0xC873, 0x843B, 0xC874, 0x843E, 0xC875, 0x843F, 0xC876, 0x8440, 0xC877, 0x8441, 0xC878, 0x8442, 0xC879, 0x8443, 0xC87A, 0x8444, + 0xC87B, 0x8445, 0xC87C, 0x8447, 0xC87D, 0x8448, 0xC87E, 0x8449, 0xC880, 0x844A, 0xC881, 0x844B, 0xC882, 0x844C, 0xC883, 0x844D, + 0xC884, 0x844E, 0xC885, 0x844F, 0xC886, 0x8450, 0xC887, 0x8452, 0xC888, 0x8453, 0xC889, 0x8454, 0xC88A, 0x8455, 0xC88B, 0x8456, + 0xC88C, 0x8458, 0xC88D, 0x845D, 0xC88E, 0x845E, 0xC88F, 0x845F, 0xC890, 0x8460, 0xC891, 0x8462, 0xC892, 0x8464, 0xC893, 0x8465, + 0xC894, 0x8466, 0xC895, 0x8467, 0xC896, 0x8468, 0xC897, 0x846A, 0xC898, 0x846E, 0xC899, 0x846F, 0xC89A, 0x8470, 0xC89B, 0x8472, + 0xC89C, 0x8474, 0xC89D, 0x8477, 0xC89E, 0x8479, 0xC89F, 0x847B, 0xC8A0, 0x847C, 0xC8A1, 0x53D6, 0xC8A2, 0x5A36, 0xC8A3, 0x9F8B, + 0xC8A4, 0x8DA3, 0xC8A5, 0x53BB, 0xC8A6, 0x5708, 0xC8A7, 0x98A7, 0xC8A8, 0x6743, 0xC8A9, 0x919B, 0xC8AA, 0x6CC9, 0xC8AB, 0x5168, + 0xC8AC, 0x75CA, 0xC8AD, 0x62F3, 0xC8AE, 0x72AC, 0xC8AF, 0x5238, 0xC8B0, 0x529D, 0xC8B1, 0x7F3A, 0xC8B2, 0x7094, 0xC8B3, 0x7638, + 0xC8B4, 0x5374, 0xC8B5, 0x9E4A, 0xC8B6, 0x69B7, 0xC8B7, 0x786E, 0xC8B8, 0x96C0, 0xC8B9, 0x88D9, 0xC8BA, 0x7FA4, 0xC8BB, 0x7136, + 0xC8BC, 0x71C3, 0xC8BD, 0x5189, 0xC8BE, 0x67D3, 0xC8BF, 0x74E4, 0xC8C0, 0x58E4, 0xC8C1, 0x6518, 0xC8C2, 0x56B7, 0xC8C3, 0x8BA9, + 0xC8C4, 0x9976, 0xC8C5, 0x6270, 0xC8C6, 0x7ED5, 0xC8C7, 0x60F9, 0xC8C8, 0x70ED, 0xC8C9, 0x58EC, 0xC8CA, 0x4EC1, 0xC8CB, 0x4EBA, + 0xC8CC, 0x5FCD, 0xC8CD, 0x97E7, 0xC8CE, 0x4EFB, 0xC8CF, 0x8BA4, 0xC8D0, 0x5203, 0xC8D1, 0x598A, 0xC8D2, 0x7EAB, 0xC8D3, 0x6254, + 0xC8D4, 0x4ECD, 0xC8D5, 0x65E5, 0xC8D6, 0x620E, 0xC8D7, 0x8338, 0xC8D8, 0x84C9, 0xC8D9, 0x8363, 0xC8DA, 0x878D, 0xC8DB, 0x7194, + 0xC8DC, 0x6EB6, 0xC8DD, 0x5BB9, 0xC8DE, 0x7ED2, 0xC8DF, 0x5197, 0xC8E0, 0x63C9, 0xC8E1, 0x67D4, 0xC8E2, 0x8089, 0xC8E3, 0x8339, + 0xC8E4, 0x8815, 0xC8E5, 0x5112, 0xC8E6, 0x5B7A, 0xC8E7, 0x5982, 0xC8E8, 0x8FB1, 0xC8E9, 0x4E73, 0xC8EA, 0x6C5D, 0xC8EB, 0x5165, + 0xC8EC, 0x8925, 0xC8ED, 0x8F6F, 0xC8EE, 0x962E, 0xC8EF, 0x854A, 0xC8F0, 0x745E, 0xC8F1, 0x9510, 0xC8F2, 0x95F0, 0xC8F3, 0x6DA6, + 0xC8F4, 0x82E5, 0xC8F5, 0x5F31, 0xC8F6, 0x6492, 0xC8F7, 0x6D12, 0xC8F8, 0x8428, 0xC8F9, 0x816E, 0xC8FA, 0x9CC3, 0xC8FB, 0x585E, + 0xC8FC, 0x8D5B, 0xC8FD, 0x4E09, 0xC8FE, 0x53C1, 0xC940, 0x847D, 0xC941, 0x847E, 0xC942, 0x847F, 0xC943, 0x8480, 0xC944, 0x8481, + 0xC945, 0x8483, 0xC946, 0x8484, 0xC947, 0x8485, 0xC948, 0x8486, 0xC949, 0x848A, 0xC94A, 0x848D, 0xC94B, 0x848F, 0xC94C, 0x8490, + 0xC94D, 0x8491, 0xC94E, 0x8492, 0xC94F, 0x8493, 0xC950, 0x8494, 0xC951, 0x8495, 0xC952, 0x8496, 0xC953, 0x8498, 0xC954, 0x849A, + 0xC955, 0x849B, 0xC956, 0x849D, 0xC957, 0x849E, 0xC958, 0x849F, 0xC959, 0x84A0, 0xC95A, 0x84A2, 0xC95B, 0x84A3, 0xC95C, 0x84A4, + 0xC95D, 0x84A5, 0xC95E, 0x84A6, 0xC95F, 0x84A7, 0xC960, 0x84A8, 0xC961, 0x84A9, 0xC962, 0x84AA, 0xC963, 0x84AB, 0xC964, 0x84AC, + 0xC965, 0x84AD, 0xC966, 0x84AE, 0xC967, 0x84B0, 0xC968, 0x84B1, 0xC969, 0x84B3, 0xC96A, 0x84B5, 0xC96B, 0x84B6, 0xC96C, 0x84B7, + 0xC96D, 0x84BB, 0xC96E, 0x84BC, 0xC96F, 0x84BE, 0xC970, 0x84C0, 0xC971, 0x84C2, 0xC972, 0x84C3, 0xC973, 0x84C5, 0xC974, 0x84C6, + 0xC975, 0x84C7, 0xC976, 0x84C8, 0xC977, 0x84CB, 0xC978, 0x84CC, 0xC979, 0x84CE, 0xC97A, 0x84CF, 0xC97B, 0x84D2, 0xC97C, 0x84D4, + 0xC97D, 0x84D5, 0xC97E, 0x84D7, 0xC980, 0x84D8, 0xC981, 0x84D9, 0xC982, 0x84DA, 0xC983, 0x84DB, 0xC984, 0x84DC, 0xC985, 0x84DE, + 0xC986, 0x84E1, 0xC987, 0x84E2, 0xC988, 0x84E4, 0xC989, 0x84E7, 0xC98A, 0x84E8, 0xC98B, 0x84E9, 0xC98C, 0x84EA, 0xC98D, 0x84EB, + 0xC98E, 0x84ED, 0xC98F, 0x84EE, 0xC990, 0x84EF, 0xC991, 0x84F1, 0xC992, 0x84F2, 0xC993, 0x84F3, 0xC994, 0x84F4, 0xC995, 0x84F5, + 0xC996, 0x84F6, 0xC997, 0x84F7, 0xC998, 0x84F8, 0xC999, 0x84F9, 0xC99A, 0x84FA, 0xC99B, 0x84FB, 0xC99C, 0x84FD, 0xC99D, 0x84FE, + 0xC99E, 0x8500, 0xC99F, 0x8501, 0xC9A0, 0x8502, 0xC9A1, 0x4F1E, 0xC9A2, 0x6563, 0xC9A3, 0x6851, 0xC9A4, 0x55D3, 0xC9A5, 0x4E27, + 0xC9A6, 0x6414, 0xC9A7, 0x9A9A, 0xC9A8, 0x626B, 0xC9A9, 0x5AC2, 0xC9AA, 0x745F, 0xC9AB, 0x8272, 0xC9AC, 0x6DA9, 0xC9AD, 0x68EE, + 0xC9AE, 0x50E7, 0xC9AF, 0x838E, 0xC9B0, 0x7802, 0xC9B1, 0x6740, 0xC9B2, 0x5239, 0xC9B3, 0x6C99, 0xC9B4, 0x7EB1, 0xC9B5, 0x50BB, + 0xC9B6, 0x5565, 0xC9B7, 0x715E, 0xC9B8, 0x7B5B, 0xC9B9, 0x6652, 0xC9BA, 0x73CA, 0xC9BB, 0x82EB, 0xC9BC, 0x6749, 0xC9BD, 0x5C71, + 0xC9BE, 0x5220, 0xC9BF, 0x717D, 0xC9C0, 0x886B, 0xC9C1, 0x95EA, 0xC9C2, 0x9655, 0xC9C3, 0x64C5, 0xC9C4, 0x8D61, 0xC9C5, 0x81B3, + 0xC9C6, 0x5584, 0xC9C7, 0x6C55, 0xC9C8, 0x6247, 0xC9C9, 0x7F2E, 0xC9CA, 0x5892, 0xC9CB, 0x4F24, 0xC9CC, 0x5546, 0xC9CD, 0x8D4F, + 0xC9CE, 0x664C, 0xC9CF, 0x4E0A, 0xC9D0, 0x5C1A, 0xC9D1, 0x88F3, 0xC9D2, 0x68A2, 0xC9D3, 0x634E, 0xC9D4, 0x7A0D, 0xC9D5, 0x70E7, + 0xC9D6, 0x828D, 0xC9D7, 0x52FA, 0xC9D8, 0x97F6, 0xC9D9, 0x5C11, 0xC9DA, 0x54E8, 0xC9DB, 0x90B5, 0xC9DC, 0x7ECD, 0xC9DD, 0x5962, + 0xC9DE, 0x8D4A, 0xC9DF, 0x86C7, 0xC9E0, 0x820C, 0xC9E1, 0x820D, 0xC9E2, 0x8D66, 0xC9E3, 0x6444, 0xC9E4, 0x5C04, 0xC9E5, 0x6151, + 0xC9E6, 0x6D89, 0xC9E7, 0x793E, 0xC9E8, 0x8BBE, 0xC9E9, 0x7837, 0xC9EA, 0x7533, 0xC9EB, 0x547B, 0xC9EC, 0x4F38, 0xC9ED, 0x8EAB, + 0xC9EE, 0x6DF1, 0xC9EF, 0x5A20, 0xC9F0, 0x7EC5, 0xC9F1, 0x795E, 0xC9F2, 0x6C88, 0xC9F3, 0x5BA1, 0xC9F4, 0x5A76, 0xC9F5, 0x751A, + 0xC9F6, 0x80BE, 0xC9F7, 0x614E, 0xC9F8, 0x6E17, 0xC9F9, 0x58F0, 0xC9FA, 0x751F, 0xC9FB, 0x7525, 0xC9FC, 0x7272, 0xC9FD, 0x5347, + 0xC9FE, 0x7EF3, 0xCA40, 0x8503, 0xCA41, 0x8504, 0xCA42, 0x8505, 0xCA43, 0x8506, 0xCA44, 0x8507, 0xCA45, 0x8508, 0xCA46, 0x8509, + 0xCA47, 0x850A, 0xCA48, 0x850B, 0xCA49, 0x850D, 0xCA4A, 0x850E, 0xCA4B, 0x850F, 0xCA4C, 0x8510, 0xCA4D, 0x8512, 0xCA4E, 0x8514, + 0xCA4F, 0x8515, 0xCA50, 0x8516, 0xCA51, 0x8518, 0xCA52, 0x8519, 0xCA53, 0x851B, 0xCA54, 0x851C, 0xCA55, 0x851D, 0xCA56, 0x851E, + 0xCA57, 0x8520, 0xCA58, 0x8522, 0xCA59, 0x8523, 0xCA5A, 0x8524, 0xCA5B, 0x8525, 0xCA5C, 0x8526, 0xCA5D, 0x8527, 0xCA5E, 0x8528, + 0xCA5F, 0x8529, 0xCA60, 0x852A, 0xCA61, 0x852D, 0xCA62, 0x852E, 0xCA63, 0x852F, 0xCA64, 0x8530, 0xCA65, 0x8531, 0xCA66, 0x8532, + 0xCA67, 0x8533, 0xCA68, 0x8534, 0xCA69, 0x8535, 0xCA6A, 0x8536, 0xCA6B, 0x853E, 0xCA6C, 0x853F, 0xCA6D, 0x8540, 0xCA6E, 0x8541, + 0xCA6F, 0x8542, 0xCA70, 0x8544, 0xCA71, 0x8545, 0xCA72, 0x8546, 0xCA73, 0x8547, 0xCA74, 0x854B, 0xCA75, 0x854C, 0xCA76, 0x854D, + 0xCA77, 0x854E, 0xCA78, 0x854F, 0xCA79, 0x8550, 0xCA7A, 0x8551, 0xCA7B, 0x8552, 0xCA7C, 0x8553, 0xCA7D, 0x8554, 0xCA7E, 0x8555, + 0xCA80, 0x8557, 0xCA81, 0x8558, 0xCA82, 0x855A, 0xCA83, 0x855B, 0xCA84, 0x855C, 0xCA85, 0x855D, 0xCA86, 0x855F, 0xCA87, 0x8560, + 0xCA88, 0x8561, 0xCA89, 0x8562, 0xCA8A, 0x8563, 0xCA8B, 0x8565, 0xCA8C, 0x8566, 0xCA8D, 0x8567, 0xCA8E, 0x8569, 0xCA8F, 0x856A, + 0xCA90, 0x856B, 0xCA91, 0x856C, 0xCA92, 0x856D, 0xCA93, 0x856E, 0xCA94, 0x856F, 0xCA95, 0x8570, 0xCA96, 0x8571, 0xCA97, 0x8573, + 0xCA98, 0x8575, 0xCA99, 0x8576, 0xCA9A, 0x8577, 0xCA9B, 0x8578, 0xCA9C, 0x857C, 0xCA9D, 0x857D, 0xCA9E, 0x857F, 0xCA9F, 0x8580, + 0xCAA0, 0x8581, 0xCAA1, 0x7701, 0xCAA2, 0x76DB, 0xCAA3, 0x5269, 0xCAA4, 0x80DC, 0xCAA5, 0x5723, 0xCAA6, 0x5E08, 0xCAA7, 0x5931, + 0xCAA8, 0x72EE, 0xCAA9, 0x65BD, 0xCAAA, 0x6E7F, 0xCAAB, 0x8BD7, 0xCAAC, 0x5C38, 0xCAAD, 0x8671, 0xCAAE, 0x5341, 0xCAAF, 0x77F3, + 0xCAB0, 0x62FE, 0xCAB1, 0x65F6, 0xCAB2, 0x4EC0, 0xCAB3, 0x98DF, 0xCAB4, 0x8680, 0xCAB5, 0x5B9E, 0xCAB6, 0x8BC6, 0xCAB7, 0x53F2, + 0xCAB8, 0x77E2, 0xCAB9, 0x4F7F, 0xCABA, 0x5C4E, 0xCABB, 0x9A76, 0xCABC, 0x59CB, 0xCABD, 0x5F0F, 0xCABE, 0x793A, 0xCABF, 0x58EB, + 0xCAC0, 0x4E16, 0xCAC1, 0x67FF, 0xCAC2, 0x4E8B, 0xCAC3, 0x62ED, 0xCAC4, 0x8A93, 0xCAC5, 0x901D, 0xCAC6, 0x52BF, 0xCAC7, 0x662F, + 0xCAC8, 0x55DC, 0xCAC9, 0x566C, 0xCACA, 0x9002, 0xCACB, 0x4ED5, 0xCACC, 0x4F8D, 0xCACD, 0x91CA, 0xCACE, 0x9970, 0xCACF, 0x6C0F, + 0xCAD0, 0x5E02, 0xCAD1, 0x6043, 0xCAD2, 0x5BA4, 0xCAD3, 0x89C6, 0xCAD4, 0x8BD5, 0xCAD5, 0x6536, 0xCAD6, 0x624B, 0xCAD7, 0x9996, + 0xCAD8, 0x5B88, 0xCAD9, 0x5BFF, 0xCADA, 0x6388, 0xCADB, 0x552E, 0xCADC, 0x53D7, 0xCADD, 0x7626, 0xCADE, 0x517D, 0xCADF, 0x852C, + 0xCAE0, 0x67A2, 0xCAE1, 0x68B3, 0xCAE2, 0x6B8A, 0xCAE3, 0x6292, 0xCAE4, 0x8F93, 0xCAE5, 0x53D4, 0xCAE6, 0x8212, 0xCAE7, 0x6DD1, + 0xCAE8, 0x758F, 0xCAE9, 0x4E66, 0xCAEA, 0x8D4E, 0xCAEB, 0x5B70, 0xCAEC, 0x719F, 0xCAED, 0x85AF, 0xCAEE, 0x6691, 0xCAEF, 0x66D9, + 0xCAF0, 0x7F72, 0xCAF1, 0x8700, 0xCAF2, 0x9ECD, 0xCAF3, 0x9F20, 0xCAF4, 0x5C5E, 0xCAF5, 0x672F, 0xCAF6, 0x8FF0, 0xCAF7, 0x6811, + 0xCAF8, 0x675F, 0xCAF9, 0x620D, 0xCAFA, 0x7AD6, 0xCAFB, 0x5885, 0xCAFC, 0x5EB6, 0xCAFD, 0x6570, 0xCAFE, 0x6F31, 0xCB40, 0x8582, + 0xCB41, 0x8583, 0xCB42, 0x8586, 0xCB43, 0x8588, 0xCB44, 0x8589, 0xCB45, 0x858A, 0xCB46, 0x858B, 0xCB47, 0x858C, 0xCB48, 0x858D, + 0xCB49, 0x858E, 0xCB4A, 0x8590, 0xCB4B, 0x8591, 0xCB4C, 0x8592, 0xCB4D, 0x8593, 0xCB4E, 0x8594, 0xCB4F, 0x8595, 0xCB50, 0x8596, + 0xCB51, 0x8597, 0xCB52, 0x8598, 0xCB53, 0x8599, 0xCB54, 0x859A, 0xCB55, 0x859D, 0xCB56, 0x859E, 0xCB57, 0x859F, 0xCB58, 0x85A0, + 0xCB59, 0x85A1, 0xCB5A, 0x85A2, 0xCB5B, 0x85A3, 0xCB5C, 0x85A5, 0xCB5D, 0x85A6, 0xCB5E, 0x85A7, 0xCB5F, 0x85A9, 0xCB60, 0x85AB, + 0xCB61, 0x85AC, 0xCB62, 0x85AD, 0xCB63, 0x85B1, 0xCB64, 0x85B2, 0xCB65, 0x85B3, 0xCB66, 0x85B4, 0xCB67, 0x85B5, 0xCB68, 0x85B6, + 0xCB69, 0x85B8, 0xCB6A, 0x85BA, 0xCB6B, 0x85BB, 0xCB6C, 0x85BC, 0xCB6D, 0x85BD, 0xCB6E, 0x85BE, 0xCB6F, 0x85BF, 0xCB70, 0x85C0, + 0xCB71, 0x85C2, 0xCB72, 0x85C3, 0xCB73, 0x85C4, 0xCB74, 0x85C5, 0xCB75, 0x85C6, 0xCB76, 0x85C7, 0xCB77, 0x85C8, 0xCB78, 0x85CA, + 0xCB79, 0x85CB, 0xCB7A, 0x85CC, 0xCB7B, 0x85CD, 0xCB7C, 0x85CE, 0xCB7D, 0x85D1, 0xCB7E, 0x85D2, 0xCB80, 0x85D4, 0xCB81, 0x85D6, + 0xCB82, 0x85D7, 0xCB83, 0x85D8, 0xCB84, 0x85D9, 0xCB85, 0x85DA, 0xCB86, 0x85DB, 0xCB87, 0x85DD, 0xCB88, 0x85DE, 0xCB89, 0x85DF, + 0xCB8A, 0x85E0, 0xCB8B, 0x85E1, 0xCB8C, 0x85E2, 0xCB8D, 0x85E3, 0xCB8E, 0x85E5, 0xCB8F, 0x85E6, 0xCB90, 0x85E7, 0xCB91, 0x85E8, + 0xCB92, 0x85EA, 0xCB93, 0x85EB, 0xCB94, 0x85EC, 0xCB95, 0x85ED, 0xCB96, 0x85EE, 0xCB97, 0x85EF, 0xCB98, 0x85F0, 0xCB99, 0x85F1, + 0xCB9A, 0x85F2, 0xCB9B, 0x85F3, 0xCB9C, 0x85F4, 0xCB9D, 0x85F5, 0xCB9E, 0x85F6, 0xCB9F, 0x85F7, 0xCBA0, 0x85F8, 0xCBA1, 0x6055, + 0xCBA2, 0x5237, 0xCBA3, 0x800D, 0xCBA4, 0x6454, 0xCBA5, 0x8870, 0xCBA6, 0x7529, 0xCBA7, 0x5E05, 0xCBA8, 0x6813, 0xCBA9, 0x62F4, + 0xCBAA, 0x971C, 0xCBAB, 0x53CC, 0xCBAC, 0x723D, 0xCBAD, 0x8C01, 0xCBAE, 0x6C34, 0xCBAF, 0x7761, 0xCBB0, 0x7A0E, 0xCBB1, 0x542E, + 0xCBB2, 0x77AC, 0xCBB3, 0x987A, 0xCBB4, 0x821C, 0xCBB5, 0x8BF4, 0xCBB6, 0x7855, 0xCBB7, 0x6714, 0xCBB8, 0x70C1, 0xCBB9, 0x65AF, + 0xCBBA, 0x6495, 0xCBBB, 0x5636, 0xCBBC, 0x601D, 0xCBBD, 0x79C1, 0xCBBE, 0x53F8, 0xCBBF, 0x4E1D, 0xCBC0, 0x6B7B, 0xCBC1, 0x8086, + 0xCBC2, 0x5BFA, 0xCBC3, 0x55E3, 0xCBC4, 0x56DB, 0xCBC5, 0x4F3A, 0xCBC6, 0x4F3C, 0xCBC7, 0x9972, 0xCBC8, 0x5DF3, 0xCBC9, 0x677E, + 0xCBCA, 0x8038, 0xCBCB, 0x6002, 0xCBCC, 0x9882, 0xCBCD, 0x9001, 0xCBCE, 0x5B8B, 0xCBCF, 0x8BBC, 0xCBD0, 0x8BF5, 0xCBD1, 0x641C, + 0xCBD2, 0x8258, 0xCBD3, 0x64DE, 0xCBD4, 0x55FD, 0xCBD5, 0x82CF, 0xCBD6, 0x9165, 0xCBD7, 0x4FD7, 0xCBD8, 0x7D20, 0xCBD9, 0x901F, + 0xCBDA, 0x7C9F, 0xCBDB, 0x50F3, 0xCBDC, 0x5851, 0xCBDD, 0x6EAF, 0xCBDE, 0x5BBF, 0xCBDF, 0x8BC9, 0xCBE0, 0x8083, 0xCBE1, 0x9178, + 0xCBE2, 0x849C, 0xCBE3, 0x7B97, 0xCBE4, 0x867D, 0xCBE5, 0x968B, 0xCBE6, 0x968F, 0xCBE7, 0x7EE5, 0xCBE8, 0x9AD3, 0xCBE9, 0x788E, + 0xCBEA, 0x5C81, 0xCBEB, 0x7A57, 0xCBEC, 0x9042, 0xCBED, 0x96A7, 0xCBEE, 0x795F, 0xCBEF, 0x5B59, 0xCBF0, 0x635F, 0xCBF1, 0x7B0B, + 0xCBF2, 0x84D1, 0xCBF3, 0x68AD, 0xCBF4, 0x5506, 0xCBF5, 0x7F29, 0xCBF6, 0x7410, 0xCBF7, 0x7D22, 0xCBF8, 0x9501, 0xCBF9, 0x6240, + 0xCBFA, 0x584C, 0xCBFB, 0x4ED6, 0xCBFC, 0x5B83, 0xCBFD, 0x5979, 0xCBFE, 0x5854, 0xCC40, 0x85F9, 0xCC41, 0x85FA, 0xCC42, 0x85FC, + 0xCC43, 0x85FD, 0xCC44, 0x85FE, 0xCC45, 0x8600, 0xCC46, 0x8601, 0xCC47, 0x8602, 0xCC48, 0x8603, 0xCC49, 0x8604, 0xCC4A, 0x8606, + 0xCC4B, 0x8607, 0xCC4C, 0x8608, 0xCC4D, 0x8609, 0xCC4E, 0x860A, 0xCC4F, 0x860B, 0xCC50, 0x860C, 0xCC51, 0x860D, 0xCC52, 0x860E, + 0xCC53, 0x860F, 0xCC54, 0x8610, 0xCC55, 0x8612, 0xCC56, 0x8613, 0xCC57, 0x8614, 0xCC58, 0x8615, 0xCC59, 0x8617, 0xCC5A, 0x8618, + 0xCC5B, 0x8619, 0xCC5C, 0x861A, 0xCC5D, 0x861B, 0xCC5E, 0x861C, 0xCC5F, 0x861D, 0xCC60, 0x861E, 0xCC61, 0x861F, 0xCC62, 0x8620, + 0xCC63, 0x8621, 0xCC64, 0x8622, 0xCC65, 0x8623, 0xCC66, 0x8624, 0xCC67, 0x8625, 0xCC68, 0x8626, 0xCC69, 0x8628, 0xCC6A, 0x862A, + 0xCC6B, 0x862B, 0xCC6C, 0x862C, 0xCC6D, 0x862D, 0xCC6E, 0x862E, 0xCC6F, 0x862F, 0xCC70, 0x8630, 0xCC71, 0x8631, 0xCC72, 0x8632, + 0xCC73, 0x8633, 0xCC74, 0x8634, 0xCC75, 0x8635, 0xCC76, 0x8636, 0xCC77, 0x8637, 0xCC78, 0x8639, 0xCC79, 0x863A, 0xCC7A, 0x863B, + 0xCC7B, 0x863D, 0xCC7C, 0x863E, 0xCC7D, 0x863F, 0xCC7E, 0x8640, 0xCC80, 0x8641, 0xCC81, 0x8642, 0xCC82, 0x8643, 0xCC83, 0x8644, + 0xCC84, 0x8645, 0xCC85, 0x8646, 0xCC86, 0x8647, 0xCC87, 0x8648, 0xCC88, 0x8649, 0xCC89, 0x864A, 0xCC8A, 0x864B, 0xCC8B, 0x864C, + 0xCC8C, 0x8652, 0xCC8D, 0x8653, 0xCC8E, 0x8655, 0xCC8F, 0x8656, 0xCC90, 0x8657, 0xCC91, 0x8658, 0xCC92, 0x8659, 0xCC93, 0x865B, + 0xCC94, 0x865C, 0xCC95, 0x865D, 0xCC96, 0x865F, 0xCC97, 0x8660, 0xCC98, 0x8661, 0xCC99, 0x8663, 0xCC9A, 0x8664, 0xCC9B, 0x8665, + 0xCC9C, 0x8666, 0xCC9D, 0x8667, 0xCC9E, 0x8668, 0xCC9F, 0x8669, 0xCCA0, 0x866A, 0xCCA1, 0x736D, 0xCCA2, 0x631E, 0xCCA3, 0x8E4B, + 0xCCA4, 0x8E0F, 0xCCA5, 0x80CE, 0xCCA6, 0x82D4, 0xCCA7, 0x62AC, 0xCCA8, 0x53F0, 0xCCA9, 0x6CF0, 0xCCAA, 0x915E, 0xCCAB, 0x592A, + 0xCCAC, 0x6001, 0xCCAD, 0x6C70, 0xCCAE, 0x574D, 0xCCAF, 0x644A, 0xCCB0, 0x8D2A, 0xCCB1, 0x762B, 0xCCB2, 0x6EE9, 0xCCB3, 0x575B, + 0xCCB4, 0x6A80, 0xCCB5, 0x75F0, 0xCCB6, 0x6F6D, 0xCCB7, 0x8C2D, 0xCCB8, 0x8C08, 0xCCB9, 0x5766, 0xCCBA, 0x6BEF, 0xCCBB, 0x8892, + 0xCCBC, 0x78B3, 0xCCBD, 0x63A2, 0xCCBE, 0x53F9, 0xCCBF, 0x70AD, 0xCCC0, 0x6C64, 0xCCC1, 0x5858, 0xCCC2, 0x642A, 0xCCC3, 0x5802, + 0xCCC4, 0x68E0, 0xCCC5, 0x819B, 0xCCC6, 0x5510, 0xCCC7, 0x7CD6, 0xCCC8, 0x5018, 0xCCC9, 0x8EBA, 0xCCCA, 0x6DCC, 0xCCCB, 0x8D9F, + 0xCCCC, 0x70EB, 0xCCCD, 0x638F, 0xCCCE, 0x6D9B, 0xCCCF, 0x6ED4, 0xCCD0, 0x7EE6, 0xCCD1, 0x8404, 0xCCD2, 0x6843, 0xCCD3, 0x9003, + 0xCCD4, 0x6DD8, 0xCCD5, 0x9676, 0xCCD6, 0x8BA8, 0xCCD7, 0x5957, 0xCCD8, 0x7279, 0xCCD9, 0x85E4, 0xCCDA, 0x817E, 0xCCDB, 0x75BC, + 0xCCDC, 0x8A8A, 0xCCDD, 0x68AF, 0xCCDE, 0x5254, 0xCCDF, 0x8E22, 0xCCE0, 0x9511, 0xCCE1, 0x63D0, 0xCCE2, 0x9898, 0xCCE3, 0x8E44, + 0xCCE4, 0x557C, 0xCCE5, 0x4F53, 0xCCE6, 0x66FF, 0xCCE7, 0x568F, 0xCCE8, 0x60D5, 0xCCE9, 0x6D95, 0xCCEA, 0x5243, 0xCCEB, 0x5C49, + 0xCCEC, 0x5929, 0xCCED, 0x6DFB, 0xCCEE, 0x586B, 0xCCEF, 0x7530, 0xCCF0, 0x751C, 0xCCF1, 0x606C, 0xCCF2, 0x8214, 0xCCF3, 0x8146, + 0xCCF4, 0x6311, 0xCCF5, 0x6761, 0xCCF6, 0x8FE2, 0xCCF7, 0x773A, 0xCCF8, 0x8DF3, 0xCCF9, 0x8D34, 0xCCFA, 0x94C1, 0xCCFB, 0x5E16, + 0xCCFC, 0x5385, 0xCCFD, 0x542C, 0xCCFE, 0x70C3, 0xCD40, 0x866D, 0xCD41, 0x866F, 0xCD42, 0x8670, 0xCD43, 0x8672, 0xCD44, 0x8673, + 0xCD45, 0x8674, 0xCD46, 0x8675, 0xCD47, 0x8676, 0xCD48, 0x8677, 0xCD49, 0x8678, 0xCD4A, 0x8683, 0xCD4B, 0x8684, 0xCD4C, 0x8685, + 0xCD4D, 0x8686, 0xCD4E, 0x8687, 0xCD4F, 0x8688, 0xCD50, 0x8689, 0xCD51, 0x868E, 0xCD52, 0x868F, 0xCD53, 0x8690, 0xCD54, 0x8691, + 0xCD55, 0x8692, 0xCD56, 0x8694, 0xCD57, 0x8696, 0xCD58, 0x8697, 0xCD59, 0x8698, 0xCD5A, 0x8699, 0xCD5B, 0x869A, 0xCD5C, 0x869B, + 0xCD5D, 0x869E, 0xCD5E, 0x869F, 0xCD5F, 0x86A0, 0xCD60, 0x86A1, 0xCD61, 0x86A2, 0xCD62, 0x86A5, 0xCD63, 0x86A6, 0xCD64, 0x86AB, + 0xCD65, 0x86AD, 0xCD66, 0x86AE, 0xCD67, 0x86B2, 0xCD68, 0x86B3, 0xCD69, 0x86B7, 0xCD6A, 0x86B8, 0xCD6B, 0x86B9, 0xCD6C, 0x86BB, + 0xCD6D, 0x86BC, 0xCD6E, 0x86BD, 0xCD6F, 0x86BE, 0xCD70, 0x86BF, 0xCD71, 0x86C1, 0xCD72, 0x86C2, 0xCD73, 0x86C3, 0xCD74, 0x86C5, + 0xCD75, 0x86C8, 0xCD76, 0x86CC, 0xCD77, 0x86CD, 0xCD78, 0x86D2, 0xCD79, 0x86D3, 0xCD7A, 0x86D5, 0xCD7B, 0x86D6, 0xCD7C, 0x86D7, + 0xCD7D, 0x86DA, 0xCD7E, 0x86DC, 0xCD80, 0x86DD, 0xCD81, 0x86E0, 0xCD82, 0x86E1, 0xCD83, 0x86E2, 0xCD84, 0x86E3, 0xCD85, 0x86E5, + 0xCD86, 0x86E6, 0xCD87, 0x86E7, 0xCD88, 0x86E8, 0xCD89, 0x86EA, 0xCD8A, 0x86EB, 0xCD8B, 0x86EC, 0xCD8C, 0x86EF, 0xCD8D, 0x86F5, + 0xCD8E, 0x86F6, 0xCD8F, 0x86F7, 0xCD90, 0x86FA, 0xCD91, 0x86FB, 0xCD92, 0x86FC, 0xCD93, 0x86FD, 0xCD94, 0x86FF, 0xCD95, 0x8701, + 0xCD96, 0x8704, 0xCD97, 0x8705, 0xCD98, 0x8706, 0xCD99, 0x870B, 0xCD9A, 0x870C, 0xCD9B, 0x870E, 0xCD9C, 0x870F, 0xCD9D, 0x8710, + 0xCD9E, 0x8711, 0xCD9F, 0x8714, 0xCDA0, 0x8716, 0xCDA1, 0x6C40, 0xCDA2, 0x5EF7, 0xCDA3, 0x505C, 0xCDA4, 0x4EAD, 0xCDA5, 0x5EAD, + 0xCDA6, 0x633A, 0xCDA7, 0x8247, 0xCDA8, 0x901A, 0xCDA9, 0x6850, 0xCDAA, 0x916E, 0xCDAB, 0x77B3, 0xCDAC, 0x540C, 0xCDAD, 0x94DC, + 0xCDAE, 0x5F64, 0xCDAF, 0x7AE5, 0xCDB0, 0x6876, 0xCDB1, 0x6345, 0xCDB2, 0x7B52, 0xCDB3, 0x7EDF, 0xCDB4, 0x75DB, 0xCDB5, 0x5077, + 0xCDB6, 0x6295, 0xCDB7, 0x5934, 0xCDB8, 0x900F, 0xCDB9, 0x51F8, 0xCDBA, 0x79C3, 0xCDBB, 0x7A81, 0xCDBC, 0x56FE, 0xCDBD, 0x5F92, + 0xCDBE, 0x9014, 0xCDBF, 0x6D82, 0xCDC0, 0x5C60, 0xCDC1, 0x571F, 0xCDC2, 0x5410, 0xCDC3, 0x5154, 0xCDC4, 0x6E4D, 0xCDC5, 0x56E2, + 0xCDC6, 0x63A8, 0xCDC7, 0x9893, 0xCDC8, 0x817F, 0xCDC9, 0x8715, 0xCDCA, 0x892A, 0xCDCB, 0x9000, 0xCDCC, 0x541E, 0xCDCD, 0x5C6F, + 0xCDCE, 0x81C0, 0xCDCF, 0x62D6, 0xCDD0, 0x6258, 0xCDD1, 0x8131, 0xCDD2, 0x9E35, 0xCDD3, 0x9640, 0xCDD4, 0x9A6E, 0xCDD5, 0x9A7C, + 0xCDD6, 0x692D, 0xCDD7, 0x59A5, 0xCDD8, 0x62D3, 0xCDD9, 0x553E, 0xCDDA, 0x6316, 0xCDDB, 0x54C7, 0xCDDC, 0x86D9, 0xCDDD, 0x6D3C, + 0xCDDE, 0x5A03, 0xCDDF, 0x74E6, 0xCDE0, 0x889C, 0xCDE1, 0x6B6A, 0xCDE2, 0x5916, 0xCDE3, 0x8C4C, 0xCDE4, 0x5F2F, 0xCDE5, 0x6E7E, + 0xCDE6, 0x73A9, 0xCDE7, 0x987D, 0xCDE8, 0x4E38, 0xCDE9, 0x70F7, 0xCDEA, 0x5B8C, 0xCDEB, 0x7897, 0xCDEC, 0x633D, 0xCDED, 0x665A, + 0xCDEE, 0x7696, 0xCDEF, 0x60CB, 0xCDF0, 0x5B9B, 0xCDF1, 0x5A49, 0xCDF2, 0x4E07, 0xCDF3, 0x8155, 0xCDF4, 0x6C6A, 0xCDF5, 0x738B, + 0xCDF6, 0x4EA1, 0xCDF7, 0x6789, 0xCDF8, 0x7F51, 0xCDF9, 0x5F80, 0xCDFA, 0x65FA, 0xCDFB, 0x671B, 0xCDFC, 0x5FD8, 0xCDFD, 0x5984, + 0xCDFE, 0x5A01, 0xCE40, 0x8719, 0xCE41, 0x871B, 0xCE42, 0x871D, 0xCE43, 0x871F, 0xCE44, 0x8720, 0xCE45, 0x8724, 0xCE46, 0x8726, + 0xCE47, 0x8727, 0xCE48, 0x8728, 0xCE49, 0x872A, 0xCE4A, 0x872B, 0xCE4B, 0x872C, 0xCE4C, 0x872D, 0xCE4D, 0x872F, 0xCE4E, 0x8730, + 0xCE4F, 0x8732, 0xCE50, 0x8733, 0xCE51, 0x8735, 0xCE52, 0x8736, 0xCE53, 0x8738, 0xCE54, 0x8739, 0xCE55, 0x873A, 0xCE56, 0x873C, + 0xCE57, 0x873D, 0xCE58, 0x8740, 0xCE59, 0x8741, 0xCE5A, 0x8742, 0xCE5B, 0x8743, 0xCE5C, 0x8744, 0xCE5D, 0x8745, 0xCE5E, 0x8746, + 0xCE5F, 0x874A, 0xCE60, 0x874B, 0xCE61, 0x874D, 0xCE62, 0x874F, 0xCE63, 0x8750, 0xCE64, 0x8751, 0xCE65, 0x8752, 0xCE66, 0x8754, + 0xCE67, 0x8755, 0xCE68, 0x8756, 0xCE69, 0x8758, 0xCE6A, 0x875A, 0xCE6B, 0x875B, 0xCE6C, 0x875C, 0xCE6D, 0x875D, 0xCE6E, 0x875E, + 0xCE6F, 0x875F, 0xCE70, 0x8761, 0xCE71, 0x8762, 0xCE72, 0x8766, 0xCE73, 0x8767, 0xCE74, 0x8768, 0xCE75, 0x8769, 0xCE76, 0x876A, + 0xCE77, 0x876B, 0xCE78, 0x876C, 0xCE79, 0x876D, 0xCE7A, 0x876F, 0xCE7B, 0x8771, 0xCE7C, 0x8772, 0xCE7D, 0x8773, 0xCE7E, 0x8775, + 0xCE80, 0x8777, 0xCE81, 0x8778, 0xCE82, 0x8779, 0xCE83, 0x877A, 0xCE84, 0x877F, 0xCE85, 0x8780, 0xCE86, 0x8781, 0xCE87, 0x8784, + 0xCE88, 0x8786, 0xCE89, 0x8787, 0xCE8A, 0x8789, 0xCE8B, 0x878A, 0xCE8C, 0x878C, 0xCE8D, 0x878E, 0xCE8E, 0x878F, 0xCE8F, 0x8790, + 0xCE90, 0x8791, 0xCE91, 0x8792, 0xCE92, 0x8794, 0xCE93, 0x8795, 0xCE94, 0x8796, 0xCE95, 0x8798, 0xCE96, 0x8799, 0xCE97, 0x879A, + 0xCE98, 0x879B, 0xCE99, 0x879C, 0xCE9A, 0x879D, 0xCE9B, 0x879E, 0xCE9C, 0x87A0, 0xCE9D, 0x87A1, 0xCE9E, 0x87A2, 0xCE9F, 0x87A3, + 0xCEA0, 0x87A4, 0xCEA1, 0x5DCD, 0xCEA2, 0x5FAE, 0xCEA3, 0x5371, 0xCEA4, 0x97E6, 0xCEA5, 0x8FDD, 0xCEA6, 0x6845, 0xCEA7, 0x56F4, + 0xCEA8, 0x552F, 0xCEA9, 0x60DF, 0xCEAA, 0x4E3A, 0xCEAB, 0x6F4D, 0xCEAC, 0x7EF4, 0xCEAD, 0x82C7, 0xCEAE, 0x840E, 0xCEAF, 0x59D4, + 0xCEB0, 0x4F1F, 0xCEB1, 0x4F2A, 0xCEB2, 0x5C3E, 0xCEB3, 0x7EAC, 0xCEB4, 0x672A, 0xCEB5, 0x851A, 0xCEB6, 0x5473, 0xCEB7, 0x754F, + 0xCEB8, 0x80C3, 0xCEB9, 0x5582, 0xCEBA, 0x9B4F, 0xCEBB, 0x4F4D, 0xCEBC, 0x6E2D, 0xCEBD, 0x8C13, 0xCEBE, 0x5C09, 0xCEBF, 0x6170, + 0xCEC0, 0x536B, 0xCEC1, 0x761F, 0xCEC2, 0x6E29, 0xCEC3, 0x868A, 0xCEC4, 0x6587, 0xCEC5, 0x95FB, 0xCEC6, 0x7EB9, 0xCEC7, 0x543B, + 0xCEC8, 0x7A33, 0xCEC9, 0x7D0A, 0xCECA, 0x95EE, 0xCECB, 0x55E1, 0xCECC, 0x7FC1, 0xCECD, 0x74EE, 0xCECE, 0x631D, 0xCECF, 0x8717, + 0xCED0, 0x6DA1, 0xCED1, 0x7A9D, 0xCED2, 0x6211, 0xCED3, 0x65A1, 0xCED4, 0x5367, 0xCED5, 0x63E1, 0xCED6, 0x6C83, 0xCED7, 0x5DEB, + 0xCED8, 0x545C, 0xCED9, 0x94A8, 0xCEDA, 0x4E4C, 0xCEDB, 0x6C61, 0xCEDC, 0x8BEC, 0xCEDD, 0x5C4B, 0xCEDE, 0x65E0, 0xCEDF, 0x829C, + 0xCEE0, 0x68A7, 0xCEE1, 0x543E, 0xCEE2, 0x5434, 0xCEE3, 0x6BCB, 0xCEE4, 0x6B66, 0xCEE5, 0x4E94, 0xCEE6, 0x6342, 0xCEE7, 0x5348, + 0xCEE8, 0x821E, 0xCEE9, 0x4F0D, 0xCEEA, 0x4FAE, 0xCEEB, 0x575E, 0xCEEC, 0x620A, 0xCEED, 0x96FE, 0xCEEE, 0x6664, 0xCEEF, 0x7269, + 0xCEF0, 0x52FF, 0xCEF1, 0x52A1, 0xCEF2, 0x609F, 0xCEF3, 0x8BEF, 0xCEF4, 0x6614, 0xCEF5, 0x7199, 0xCEF6, 0x6790, 0xCEF7, 0x897F, + 0xCEF8, 0x7852, 0xCEF9, 0x77FD, 0xCEFA, 0x6670, 0xCEFB, 0x563B, 0xCEFC, 0x5438, 0xCEFD, 0x9521, 0xCEFE, 0x727A, 0xCF40, 0x87A5, + 0xCF41, 0x87A6, 0xCF42, 0x87A7, 0xCF43, 0x87A9, 0xCF44, 0x87AA, 0xCF45, 0x87AE, 0xCF46, 0x87B0, 0xCF47, 0x87B1, 0xCF48, 0x87B2, + 0xCF49, 0x87B4, 0xCF4A, 0x87B6, 0xCF4B, 0x87B7, 0xCF4C, 0x87B8, 0xCF4D, 0x87B9, 0xCF4E, 0x87BB, 0xCF4F, 0x87BC, 0xCF50, 0x87BE, + 0xCF51, 0x87BF, 0xCF52, 0x87C1, 0xCF53, 0x87C2, 0xCF54, 0x87C3, 0xCF55, 0x87C4, 0xCF56, 0x87C5, 0xCF57, 0x87C7, 0xCF58, 0x87C8, + 0xCF59, 0x87C9, 0xCF5A, 0x87CC, 0xCF5B, 0x87CD, 0xCF5C, 0x87CE, 0xCF5D, 0x87CF, 0xCF5E, 0x87D0, 0xCF5F, 0x87D4, 0xCF60, 0x87D5, + 0xCF61, 0x87D6, 0xCF62, 0x87D7, 0xCF63, 0x87D8, 0xCF64, 0x87D9, 0xCF65, 0x87DA, 0xCF66, 0x87DC, 0xCF67, 0x87DD, 0xCF68, 0x87DE, + 0xCF69, 0x87DF, 0xCF6A, 0x87E1, 0xCF6B, 0x87E2, 0xCF6C, 0x87E3, 0xCF6D, 0x87E4, 0xCF6E, 0x87E6, 0xCF6F, 0x87E7, 0xCF70, 0x87E8, + 0xCF71, 0x87E9, 0xCF72, 0x87EB, 0xCF73, 0x87EC, 0xCF74, 0x87ED, 0xCF75, 0x87EF, 0xCF76, 0x87F0, 0xCF77, 0x87F1, 0xCF78, 0x87F2, + 0xCF79, 0x87F3, 0xCF7A, 0x87F4, 0xCF7B, 0x87F5, 0xCF7C, 0x87F6, 0xCF7D, 0x87F7, 0xCF7E, 0x87F8, 0xCF80, 0x87FA, 0xCF81, 0x87FB, + 0xCF82, 0x87FC, 0xCF83, 0x87FD, 0xCF84, 0x87FF, 0xCF85, 0x8800, 0xCF86, 0x8801, 0xCF87, 0x8802, 0xCF88, 0x8804, 0xCF89, 0x8805, + 0xCF8A, 0x8806, 0xCF8B, 0x8807, 0xCF8C, 0x8808, 0xCF8D, 0x8809, 0xCF8E, 0x880B, 0xCF8F, 0x880C, 0xCF90, 0x880D, 0xCF91, 0x880E, + 0xCF92, 0x880F, 0xCF93, 0x8810, 0xCF94, 0x8811, 0xCF95, 0x8812, 0xCF96, 0x8814, 0xCF97, 0x8817, 0xCF98, 0x8818, 0xCF99, 0x8819, + 0xCF9A, 0x881A, 0xCF9B, 0x881C, 0xCF9C, 0x881D, 0xCF9D, 0x881E, 0xCF9E, 0x881F, 0xCF9F, 0x8820, 0xCFA0, 0x8823, 0xCFA1, 0x7A00, + 0xCFA2, 0x606F, 0xCFA3, 0x5E0C, 0xCFA4, 0x6089, 0xCFA5, 0x819D, 0xCFA6, 0x5915, 0xCFA7, 0x60DC, 0xCFA8, 0x7184, 0xCFA9, 0x70EF, + 0xCFAA, 0x6EAA, 0xCFAB, 0x6C50, 0xCFAC, 0x7280, 0xCFAD, 0x6A84, 0xCFAE, 0x88AD, 0xCFAF, 0x5E2D, 0xCFB0, 0x4E60, 0xCFB1, 0x5AB3, + 0xCFB2, 0x559C, 0xCFB3, 0x94E3, 0xCFB4, 0x6D17, 0xCFB5, 0x7CFB, 0xCFB6, 0x9699, 0xCFB7, 0x620F, 0xCFB8, 0x7EC6, 0xCFB9, 0x778E, + 0xCFBA, 0x867E, 0xCFBB, 0x5323, 0xCFBC, 0x971E, 0xCFBD, 0x8F96, 0xCFBE, 0x6687, 0xCFBF, 0x5CE1, 0xCFC0, 0x4FA0, 0xCFC1, 0x72ED, + 0xCFC2, 0x4E0B, 0xCFC3, 0x53A6, 0xCFC4, 0x590F, 0xCFC5, 0x5413, 0xCFC6, 0x6380, 0xCFC7, 0x9528, 0xCFC8, 0x5148, 0xCFC9, 0x4ED9, + 0xCFCA, 0x9C9C, 0xCFCB, 0x7EA4, 0xCFCC, 0x54B8, 0xCFCD, 0x8D24, 0xCFCE, 0x8854, 0xCFCF, 0x8237, 0xCFD0, 0x95F2, 0xCFD1, 0x6D8E, + 0xCFD2, 0x5F26, 0xCFD3, 0x5ACC, 0xCFD4, 0x663E, 0xCFD5, 0x9669, 0xCFD6, 0x73B0, 0xCFD7, 0x732E, 0xCFD8, 0x53BF, 0xCFD9, 0x817A, + 0xCFDA, 0x9985, 0xCFDB, 0x7FA1, 0xCFDC, 0x5BAA, 0xCFDD, 0x9677, 0xCFDE, 0x9650, 0xCFDF, 0x7EBF, 0xCFE0, 0x76F8, 0xCFE1, 0x53A2, + 0xCFE2, 0x9576, 0xCFE3, 0x9999, 0xCFE4, 0x7BB1, 0xCFE5, 0x8944, 0xCFE6, 0x6E58, 0xCFE7, 0x4E61, 0xCFE8, 0x7FD4, 0xCFE9, 0x7965, + 0xCFEA, 0x8BE6, 0xCFEB, 0x60F3, 0xCFEC, 0x54CD, 0xCFED, 0x4EAB, 0xCFEE, 0x9879, 0xCFEF, 0x5DF7, 0xCFF0, 0x6A61, 0xCFF1, 0x50CF, + 0xCFF2, 0x5411, 0xCFF3, 0x8C61, 0xCFF4, 0x8427, 0xCFF5, 0x785D, 0xCFF6, 0x9704, 0xCFF7, 0x524A, 0xCFF8, 0x54EE, 0xCFF9, 0x56A3, + 0xCFFA, 0x9500, 0xCFFB, 0x6D88, 0xCFFC, 0x5BB5, 0xCFFD, 0x6DC6, 0xCFFE, 0x6653, 0xD040, 0x8824, 0xD041, 0x8825, 0xD042, 0x8826, + 0xD043, 0x8827, 0xD044, 0x8828, 0xD045, 0x8829, 0xD046, 0x882A, 0xD047, 0x882B, 0xD048, 0x882C, 0xD049, 0x882D, 0xD04A, 0x882E, + 0xD04B, 0x882F, 0xD04C, 0x8830, 0xD04D, 0x8831, 0xD04E, 0x8833, 0xD04F, 0x8834, 0xD050, 0x8835, 0xD051, 0x8836, 0xD052, 0x8837, + 0xD053, 0x8838, 0xD054, 0x883A, 0xD055, 0x883B, 0xD056, 0x883D, 0xD057, 0x883E, 0xD058, 0x883F, 0xD059, 0x8841, 0xD05A, 0x8842, + 0xD05B, 0x8843, 0xD05C, 0x8846, 0xD05D, 0x8847, 0xD05E, 0x8848, 0xD05F, 0x8849, 0xD060, 0x884A, 0xD061, 0x884B, 0xD062, 0x884E, + 0xD063, 0x884F, 0xD064, 0x8850, 0xD065, 0x8851, 0xD066, 0x8852, 0xD067, 0x8853, 0xD068, 0x8855, 0xD069, 0x8856, 0xD06A, 0x8858, + 0xD06B, 0x885A, 0xD06C, 0x885B, 0xD06D, 0x885C, 0xD06E, 0x885D, 0xD06F, 0x885E, 0xD070, 0x885F, 0xD071, 0x8860, 0xD072, 0x8866, + 0xD073, 0x8867, 0xD074, 0x886A, 0xD075, 0x886D, 0xD076, 0x886F, 0xD077, 0x8871, 0xD078, 0x8873, 0xD079, 0x8874, 0xD07A, 0x8875, + 0xD07B, 0x8876, 0xD07C, 0x8878, 0xD07D, 0x8879, 0xD07E, 0x887A, 0xD080, 0x887B, 0xD081, 0x887C, 0xD082, 0x8880, 0xD083, 0x8883, + 0xD084, 0x8886, 0xD085, 0x8887, 0xD086, 0x8889, 0xD087, 0x888A, 0xD088, 0x888C, 0xD089, 0x888E, 0xD08A, 0x888F, 0xD08B, 0x8890, + 0xD08C, 0x8891, 0xD08D, 0x8893, 0xD08E, 0x8894, 0xD08F, 0x8895, 0xD090, 0x8897, 0xD091, 0x8898, 0xD092, 0x8899, 0xD093, 0x889A, + 0xD094, 0x889B, 0xD095, 0x889D, 0xD096, 0x889E, 0xD097, 0x889F, 0xD098, 0x88A0, 0xD099, 0x88A1, 0xD09A, 0x88A3, 0xD09B, 0x88A5, + 0xD09C, 0x88A6, 0xD09D, 0x88A7, 0xD09E, 0x88A8, 0xD09F, 0x88A9, 0xD0A0, 0x88AA, 0xD0A1, 0x5C0F, 0xD0A2, 0x5B5D, 0xD0A3, 0x6821, + 0xD0A4, 0x8096, 0xD0A5, 0x5578, 0xD0A6, 0x7B11, 0xD0A7, 0x6548, 0xD0A8, 0x6954, 0xD0A9, 0x4E9B, 0xD0AA, 0x6B47, 0xD0AB, 0x874E, + 0xD0AC, 0x978B, 0xD0AD, 0x534F, 0xD0AE, 0x631F, 0xD0AF, 0x643A, 0xD0B0, 0x90AA, 0xD0B1, 0x659C, 0xD0B2, 0x80C1, 0xD0B3, 0x8C10, + 0xD0B4, 0x5199, 0xD0B5, 0x68B0, 0xD0B6, 0x5378, 0xD0B7, 0x87F9, 0xD0B8, 0x61C8, 0xD0B9, 0x6CC4, 0xD0BA, 0x6CFB, 0xD0BB, 0x8C22, + 0xD0BC, 0x5C51, 0xD0BD, 0x85AA, 0xD0BE, 0x82AF, 0xD0BF, 0x950C, 0xD0C0, 0x6B23, 0xD0C1, 0x8F9B, 0xD0C2, 0x65B0, 0xD0C3, 0x5FFB, + 0xD0C4, 0x5FC3, 0xD0C5, 0x4FE1, 0xD0C6, 0x8845, 0xD0C7, 0x661F, 0xD0C8, 0x8165, 0xD0C9, 0x7329, 0xD0CA, 0x60FA, 0xD0CB, 0x5174, + 0xD0CC, 0x5211, 0xD0CD, 0x578B, 0xD0CE, 0x5F62, 0xD0CF, 0x90A2, 0xD0D0, 0x884C, 0xD0D1, 0x9192, 0xD0D2, 0x5E78, 0xD0D3, 0x674F, + 0xD0D4, 0x6027, 0xD0D5, 0x59D3, 0xD0D6, 0x5144, 0xD0D7, 0x51F6, 0xD0D8, 0x80F8, 0xD0D9, 0x5308, 0xD0DA, 0x6C79, 0xD0DB, 0x96C4, + 0xD0DC, 0x718A, 0xD0DD, 0x4F11, 0xD0DE, 0x4FEE, 0xD0DF, 0x7F9E, 0xD0E0, 0x673D, 0xD0E1, 0x55C5, 0xD0E2, 0x9508, 0xD0E3, 0x79C0, + 0xD0E4, 0x8896, 0xD0E5, 0x7EE3, 0xD0E6, 0x589F, 0xD0E7, 0x620C, 0xD0E8, 0x9700, 0xD0E9, 0x865A, 0xD0EA, 0x5618, 0xD0EB, 0x987B, + 0xD0EC, 0x5F90, 0xD0ED, 0x8BB8, 0xD0EE, 0x84C4, 0xD0EF, 0x9157, 0xD0F0, 0x53D9, 0xD0F1, 0x65ED, 0xD0F2, 0x5E8F, 0xD0F3, 0x755C, + 0xD0F4, 0x6064, 0xD0F5, 0x7D6E, 0xD0F6, 0x5A7F, 0xD0F7, 0x7EEA, 0xD0F8, 0x7EED, 0xD0F9, 0x8F69, 0xD0FA, 0x55A7, 0xD0FB, 0x5BA3, + 0xD0FC, 0x60AC, 0xD0FD, 0x65CB, 0xD0FE, 0x7384, 0xD140, 0x88AC, 0xD141, 0x88AE, 0xD142, 0x88AF, 0xD143, 0x88B0, 0xD144, 0x88B2, + 0xD145, 0x88B3, 0xD146, 0x88B4, 0xD147, 0x88B5, 0xD148, 0x88B6, 0xD149, 0x88B8, 0xD14A, 0x88B9, 0xD14B, 0x88BA, 0xD14C, 0x88BB, + 0xD14D, 0x88BD, 0xD14E, 0x88BE, 0xD14F, 0x88BF, 0xD150, 0x88C0, 0xD151, 0x88C3, 0xD152, 0x88C4, 0xD153, 0x88C7, 0xD154, 0x88C8, + 0xD155, 0x88CA, 0xD156, 0x88CB, 0xD157, 0x88CC, 0xD158, 0x88CD, 0xD159, 0x88CF, 0xD15A, 0x88D0, 0xD15B, 0x88D1, 0xD15C, 0x88D3, + 0xD15D, 0x88D6, 0xD15E, 0x88D7, 0xD15F, 0x88DA, 0xD160, 0x88DB, 0xD161, 0x88DC, 0xD162, 0x88DD, 0xD163, 0x88DE, 0xD164, 0x88E0, + 0xD165, 0x88E1, 0xD166, 0x88E6, 0xD167, 0x88E7, 0xD168, 0x88E9, 0xD169, 0x88EA, 0xD16A, 0x88EB, 0xD16B, 0x88EC, 0xD16C, 0x88ED, + 0xD16D, 0x88EE, 0xD16E, 0x88EF, 0xD16F, 0x88F2, 0xD170, 0x88F5, 0xD171, 0x88F6, 0xD172, 0x88F7, 0xD173, 0x88FA, 0xD174, 0x88FB, + 0xD175, 0x88FD, 0xD176, 0x88FF, 0xD177, 0x8900, 0xD178, 0x8901, 0xD179, 0x8903, 0xD17A, 0x8904, 0xD17B, 0x8905, 0xD17C, 0x8906, + 0xD17D, 0x8907, 0xD17E, 0x8908, 0xD180, 0x8909, 0xD181, 0x890B, 0xD182, 0x890C, 0xD183, 0x890D, 0xD184, 0x890E, 0xD185, 0x890F, + 0xD186, 0x8911, 0xD187, 0x8914, 0xD188, 0x8915, 0xD189, 0x8916, 0xD18A, 0x8917, 0xD18B, 0x8918, 0xD18C, 0x891C, 0xD18D, 0x891D, + 0xD18E, 0x891E, 0xD18F, 0x891F, 0xD190, 0x8920, 0xD191, 0x8922, 0xD192, 0x8923, 0xD193, 0x8924, 0xD194, 0x8926, 0xD195, 0x8927, + 0xD196, 0x8928, 0xD197, 0x8929, 0xD198, 0x892C, 0xD199, 0x892D, 0xD19A, 0x892E, 0xD19B, 0x892F, 0xD19C, 0x8931, 0xD19D, 0x8932, + 0xD19E, 0x8933, 0xD19F, 0x8935, 0xD1A0, 0x8937, 0xD1A1, 0x9009, 0xD1A2, 0x7663, 0xD1A3, 0x7729, 0xD1A4, 0x7EDA, 0xD1A5, 0x9774, + 0xD1A6, 0x859B, 0xD1A7, 0x5B66, 0xD1A8, 0x7A74, 0xD1A9, 0x96EA, 0xD1AA, 0x8840, 0xD1AB, 0x52CB, 0xD1AC, 0x718F, 0xD1AD, 0x5FAA, + 0xD1AE, 0x65EC, 0xD1AF, 0x8BE2, 0xD1B0, 0x5BFB, 0xD1B1, 0x9A6F, 0xD1B2, 0x5DE1, 0xD1B3, 0x6B89, 0xD1B4, 0x6C5B, 0xD1B5, 0x8BAD, + 0xD1B6, 0x8BAF, 0xD1B7, 0x900A, 0xD1B8, 0x8FC5, 0xD1B9, 0x538B, 0xD1BA, 0x62BC, 0xD1BB, 0x9E26, 0xD1BC, 0x9E2D, 0xD1BD, 0x5440, + 0xD1BE, 0x4E2B, 0xD1BF, 0x82BD, 0xD1C0, 0x7259, 0xD1C1, 0x869C, 0xD1C2, 0x5D16, 0xD1C3, 0x8859, 0xD1C4, 0x6DAF, 0xD1C5, 0x96C5, + 0xD1C6, 0x54D1, 0xD1C7, 0x4E9A, 0xD1C8, 0x8BB6, 0xD1C9, 0x7109, 0xD1CA, 0x54BD, 0xD1CB, 0x9609, 0xD1CC, 0x70DF, 0xD1CD, 0x6DF9, + 0xD1CE, 0x76D0, 0xD1CF, 0x4E25, 0xD1D0, 0x7814, 0xD1D1, 0x8712, 0xD1D2, 0x5CA9, 0xD1D3, 0x5EF6, 0xD1D4, 0x8A00, 0xD1D5, 0x989C, + 0xD1D6, 0x960E, 0xD1D7, 0x708E, 0xD1D8, 0x6CBF, 0xD1D9, 0x5944, 0xD1DA, 0x63A9, 0xD1DB, 0x773C, 0xD1DC, 0x884D, 0xD1DD, 0x6F14, + 0xD1DE, 0x8273, 0xD1DF, 0x5830, 0xD1E0, 0x71D5, 0xD1E1, 0x538C, 0xD1E2, 0x781A, 0xD1E3, 0x96C1, 0xD1E4, 0x5501, 0xD1E5, 0x5F66, + 0xD1E6, 0x7130, 0xD1E7, 0x5BB4, 0xD1E8, 0x8C1A, 0xD1E9, 0x9A8C, 0xD1EA, 0x6B83, 0xD1EB, 0x592E, 0xD1EC, 0x9E2F, 0xD1ED, 0x79E7, + 0xD1EE, 0x6768, 0xD1EF, 0x626C, 0xD1F0, 0x4F6F, 0xD1F1, 0x75A1, 0xD1F2, 0x7F8A, 0xD1F3, 0x6D0B, 0xD1F4, 0x9633, 0xD1F5, 0x6C27, + 0xD1F6, 0x4EF0, 0xD1F7, 0x75D2, 0xD1F8, 0x517B, 0xD1F9, 0x6837, 0xD1FA, 0x6F3E, 0xD1FB, 0x9080, 0xD1FC, 0x8170, 0xD1FD, 0x5996, + 0xD1FE, 0x7476, 0xD240, 0x8938, 0xD241, 0x8939, 0xD242, 0x893A, 0xD243, 0x893B, 0xD244, 0x893C, 0xD245, 0x893D, 0xD246, 0x893E, + 0xD247, 0x893F, 0xD248, 0x8940, 0xD249, 0x8942, 0xD24A, 0x8943, 0xD24B, 0x8945, 0xD24C, 0x8946, 0xD24D, 0x8947, 0xD24E, 0x8948, + 0xD24F, 0x8949, 0xD250, 0x894A, 0xD251, 0x894B, 0xD252, 0x894C, 0xD253, 0x894D, 0xD254, 0x894E, 0xD255, 0x894F, 0xD256, 0x8950, + 0xD257, 0x8951, 0xD258, 0x8952, 0xD259, 0x8953, 0xD25A, 0x8954, 0xD25B, 0x8955, 0xD25C, 0x8956, 0xD25D, 0x8957, 0xD25E, 0x8958, + 0xD25F, 0x8959, 0xD260, 0x895A, 0xD261, 0x895B, 0xD262, 0x895C, 0xD263, 0x895D, 0xD264, 0x8960, 0xD265, 0x8961, 0xD266, 0x8962, + 0xD267, 0x8963, 0xD268, 0x8964, 0xD269, 0x8965, 0xD26A, 0x8967, 0xD26B, 0x8968, 0xD26C, 0x8969, 0xD26D, 0x896A, 0xD26E, 0x896B, + 0xD26F, 0x896C, 0xD270, 0x896D, 0xD271, 0x896E, 0xD272, 0x896F, 0xD273, 0x8970, 0xD274, 0x8971, 0xD275, 0x8972, 0xD276, 0x8973, + 0xD277, 0x8974, 0xD278, 0x8975, 0xD279, 0x8976, 0xD27A, 0x8977, 0xD27B, 0x8978, 0xD27C, 0x8979, 0xD27D, 0x897A, 0xD27E, 0x897C, + 0xD280, 0x897D, 0xD281, 0x897E, 0xD282, 0x8980, 0xD283, 0x8982, 0xD284, 0x8984, 0xD285, 0x8985, 0xD286, 0x8987, 0xD287, 0x8988, + 0xD288, 0x8989, 0xD289, 0x898A, 0xD28A, 0x898B, 0xD28B, 0x898C, 0xD28C, 0x898D, 0xD28D, 0x898E, 0xD28E, 0x898F, 0xD28F, 0x8990, + 0xD290, 0x8991, 0xD291, 0x8992, 0xD292, 0x8993, 0xD293, 0x8994, 0xD294, 0x8995, 0xD295, 0x8996, 0xD296, 0x8997, 0xD297, 0x8998, + 0xD298, 0x8999, 0xD299, 0x899A, 0xD29A, 0x899B, 0xD29B, 0x899C, 0xD29C, 0x899D, 0xD29D, 0x899E, 0xD29E, 0x899F, 0xD29F, 0x89A0, + 0xD2A0, 0x89A1, 0xD2A1, 0x6447, 0xD2A2, 0x5C27, 0xD2A3, 0x9065, 0xD2A4, 0x7A91, 0xD2A5, 0x8C23, 0xD2A6, 0x59DA, 0xD2A7, 0x54AC, + 0xD2A8, 0x8200, 0xD2A9, 0x836F, 0xD2AA, 0x8981, 0xD2AB, 0x8000, 0xD2AC, 0x6930, 0xD2AD, 0x564E, 0xD2AE, 0x8036, 0xD2AF, 0x7237, + 0xD2B0, 0x91CE, 0xD2B1, 0x51B6, 0xD2B2, 0x4E5F, 0xD2B3, 0x9875, 0xD2B4, 0x6396, 0xD2B5, 0x4E1A, 0xD2B6, 0x53F6, 0xD2B7, 0x66F3, + 0xD2B8, 0x814B, 0xD2B9, 0x591C, 0xD2BA, 0x6DB2, 0xD2BB, 0x4E00, 0xD2BC, 0x58F9, 0xD2BD, 0x533B, 0xD2BE, 0x63D6, 0xD2BF, 0x94F1, + 0xD2C0, 0x4F9D, 0xD2C1, 0x4F0A, 0xD2C2, 0x8863, 0xD2C3, 0x9890, 0xD2C4, 0x5937, 0xD2C5, 0x9057, 0xD2C6, 0x79FB, 0xD2C7, 0x4EEA, + 0xD2C8, 0x80F0, 0xD2C9, 0x7591, 0xD2CA, 0x6C82, 0xD2CB, 0x5B9C, 0xD2CC, 0x59E8, 0xD2CD, 0x5F5D, 0xD2CE, 0x6905, 0xD2CF, 0x8681, + 0xD2D0, 0x501A, 0xD2D1, 0x5DF2, 0xD2D2, 0x4E59, 0xD2D3, 0x77E3, 0xD2D4, 0x4EE5, 0xD2D5, 0x827A, 0xD2D6, 0x6291, 0xD2D7, 0x6613, + 0xD2D8, 0x9091, 0xD2D9, 0x5C79, 0xD2DA, 0x4EBF, 0xD2DB, 0x5F79, 0xD2DC, 0x81C6, 0xD2DD, 0x9038, 0xD2DE, 0x8084, 0xD2DF, 0x75AB, + 0xD2E0, 0x4EA6, 0xD2E1, 0x88D4, 0xD2E2, 0x610F, 0xD2E3, 0x6BC5, 0xD2E4, 0x5FC6, 0xD2E5, 0x4E49, 0xD2E6, 0x76CA, 0xD2E7, 0x6EA2, + 0xD2E8, 0x8BE3, 0xD2E9, 0x8BAE, 0xD2EA, 0x8C0A, 0xD2EB, 0x8BD1, 0xD2EC, 0x5F02, 0xD2ED, 0x7FFC, 0xD2EE, 0x7FCC, 0xD2EF, 0x7ECE, + 0xD2F0, 0x8335, 0xD2F1, 0x836B, 0xD2F2, 0x56E0, 0xD2F3, 0x6BB7, 0xD2F4, 0x97F3, 0xD2F5, 0x9634, 0xD2F6, 0x59FB, 0xD2F7, 0x541F, + 0xD2F8, 0x94F6, 0xD2F9, 0x6DEB, 0xD2FA, 0x5BC5, 0xD2FB, 0x996E, 0xD2FC, 0x5C39, 0xD2FD, 0x5F15, 0xD2FE, 0x9690, 0xD340, 0x89A2, + 0xD341, 0x89A3, 0xD342, 0x89A4, 0xD343, 0x89A5, 0xD344, 0x89A6, 0xD345, 0x89A7, 0xD346, 0x89A8, 0xD347, 0x89A9, 0xD348, 0x89AA, + 0xD349, 0x89AB, 0xD34A, 0x89AC, 0xD34B, 0x89AD, 0xD34C, 0x89AE, 0xD34D, 0x89AF, 0xD34E, 0x89B0, 0xD34F, 0x89B1, 0xD350, 0x89B2, + 0xD351, 0x89B3, 0xD352, 0x89B4, 0xD353, 0x89B5, 0xD354, 0x89B6, 0xD355, 0x89B7, 0xD356, 0x89B8, 0xD357, 0x89B9, 0xD358, 0x89BA, + 0xD359, 0x89BB, 0xD35A, 0x89BC, 0xD35B, 0x89BD, 0xD35C, 0x89BE, 0xD35D, 0x89BF, 0xD35E, 0x89C0, 0xD35F, 0x89C3, 0xD360, 0x89CD, + 0xD361, 0x89D3, 0xD362, 0x89D4, 0xD363, 0x89D5, 0xD364, 0x89D7, 0xD365, 0x89D8, 0xD366, 0x89D9, 0xD367, 0x89DB, 0xD368, 0x89DD, + 0xD369, 0x89DF, 0xD36A, 0x89E0, 0xD36B, 0x89E1, 0xD36C, 0x89E2, 0xD36D, 0x89E4, 0xD36E, 0x89E7, 0xD36F, 0x89E8, 0xD370, 0x89E9, + 0xD371, 0x89EA, 0xD372, 0x89EC, 0xD373, 0x89ED, 0xD374, 0x89EE, 0xD375, 0x89F0, 0xD376, 0x89F1, 0xD377, 0x89F2, 0xD378, 0x89F4, + 0xD379, 0x89F5, 0xD37A, 0x89F6, 0xD37B, 0x89F7, 0xD37C, 0x89F8, 0xD37D, 0x89F9, 0xD37E, 0x89FA, 0xD380, 0x89FB, 0xD381, 0x89FC, + 0xD382, 0x89FD, 0xD383, 0x89FE, 0xD384, 0x89FF, 0xD385, 0x8A01, 0xD386, 0x8A02, 0xD387, 0x8A03, 0xD388, 0x8A04, 0xD389, 0x8A05, + 0xD38A, 0x8A06, 0xD38B, 0x8A08, 0xD38C, 0x8A09, 0xD38D, 0x8A0A, 0xD38E, 0x8A0B, 0xD38F, 0x8A0C, 0xD390, 0x8A0D, 0xD391, 0x8A0E, + 0xD392, 0x8A0F, 0xD393, 0x8A10, 0xD394, 0x8A11, 0xD395, 0x8A12, 0xD396, 0x8A13, 0xD397, 0x8A14, 0xD398, 0x8A15, 0xD399, 0x8A16, + 0xD39A, 0x8A17, 0xD39B, 0x8A18, 0xD39C, 0x8A19, 0xD39D, 0x8A1A, 0xD39E, 0x8A1B, 0xD39F, 0x8A1C, 0xD3A0, 0x8A1D, 0xD3A1, 0x5370, + 0xD3A2, 0x82F1, 0xD3A3, 0x6A31, 0xD3A4, 0x5A74, 0xD3A5, 0x9E70, 0xD3A6, 0x5E94, 0xD3A7, 0x7F28, 0xD3A8, 0x83B9, 0xD3A9, 0x8424, + 0xD3AA, 0x8425, 0xD3AB, 0x8367, 0xD3AC, 0x8747, 0xD3AD, 0x8FCE, 0xD3AE, 0x8D62, 0xD3AF, 0x76C8, 0xD3B0, 0x5F71, 0xD3B1, 0x9896, + 0xD3B2, 0x786C, 0xD3B3, 0x6620, 0xD3B4, 0x54DF, 0xD3B5, 0x62E5, 0xD3B6, 0x4F63, 0xD3B7, 0x81C3, 0xD3B8, 0x75C8, 0xD3B9, 0x5EB8, + 0xD3BA, 0x96CD, 0xD3BB, 0x8E0A, 0xD3BC, 0x86F9, 0xD3BD, 0x548F, 0xD3BE, 0x6CF3, 0xD3BF, 0x6D8C, 0xD3C0, 0x6C38, 0xD3C1, 0x607F, + 0xD3C2, 0x52C7, 0xD3C3, 0x7528, 0xD3C4, 0x5E7D, 0xD3C5, 0x4F18, 0xD3C6, 0x60A0, 0xD3C7, 0x5FE7, 0xD3C8, 0x5C24, 0xD3C9, 0x7531, + 0xD3CA, 0x90AE, 0xD3CB, 0x94C0, 0xD3CC, 0x72B9, 0xD3CD, 0x6CB9, 0xD3CE, 0x6E38, 0xD3CF, 0x9149, 0xD3D0, 0x6709, 0xD3D1, 0x53CB, + 0xD3D2, 0x53F3, 0xD3D3, 0x4F51, 0xD3D4, 0x91C9, 0xD3D5, 0x8BF1, 0xD3D6, 0x53C8, 0xD3D7, 0x5E7C, 0xD3D8, 0x8FC2, 0xD3D9, 0x6DE4, + 0xD3DA, 0x4E8E, 0xD3DB, 0x76C2, 0xD3DC, 0x6986, 0xD3DD, 0x865E, 0xD3DE, 0x611A, 0xD3DF, 0x8206, 0xD3E0, 0x4F59, 0xD3E1, 0x4FDE, + 0xD3E2, 0x903E, 0xD3E3, 0x9C7C, 0xD3E4, 0x6109, 0xD3E5, 0x6E1D, 0xD3E6, 0x6E14, 0xD3E7, 0x9685, 0xD3E8, 0x4E88, 0xD3E9, 0x5A31, + 0xD3EA, 0x96E8, 0xD3EB, 0x4E0E, 0xD3EC, 0x5C7F, 0xD3ED, 0x79B9, 0xD3EE, 0x5B87, 0xD3EF, 0x8BED, 0xD3F0, 0x7FBD, 0xD3F1, 0x7389, + 0xD3F2, 0x57DF, 0xD3F3, 0x828B, 0xD3F4, 0x90C1, 0xD3F5, 0x5401, 0xD3F6, 0x9047, 0xD3F7, 0x55BB, 0xD3F8, 0x5CEA, 0xD3F9, 0x5FA1, + 0xD3FA, 0x6108, 0xD3FB, 0x6B32, 0xD3FC, 0x72F1, 0xD3FD, 0x80B2, 0xD3FE, 0x8A89, 0xD440, 0x8A1E, 0xD441, 0x8A1F, 0xD442, 0x8A20, + 0xD443, 0x8A21, 0xD444, 0x8A22, 0xD445, 0x8A23, 0xD446, 0x8A24, 0xD447, 0x8A25, 0xD448, 0x8A26, 0xD449, 0x8A27, 0xD44A, 0x8A28, + 0xD44B, 0x8A29, 0xD44C, 0x8A2A, 0xD44D, 0x8A2B, 0xD44E, 0x8A2C, 0xD44F, 0x8A2D, 0xD450, 0x8A2E, 0xD451, 0x8A2F, 0xD452, 0x8A30, + 0xD453, 0x8A31, 0xD454, 0x8A32, 0xD455, 0x8A33, 0xD456, 0x8A34, 0xD457, 0x8A35, 0xD458, 0x8A36, 0xD459, 0x8A37, 0xD45A, 0x8A38, + 0xD45B, 0x8A39, 0xD45C, 0x8A3A, 0xD45D, 0x8A3B, 0xD45E, 0x8A3C, 0xD45F, 0x8A3D, 0xD460, 0x8A3F, 0xD461, 0x8A40, 0xD462, 0x8A41, + 0xD463, 0x8A42, 0xD464, 0x8A43, 0xD465, 0x8A44, 0xD466, 0x8A45, 0xD467, 0x8A46, 0xD468, 0x8A47, 0xD469, 0x8A49, 0xD46A, 0x8A4A, + 0xD46B, 0x8A4B, 0xD46C, 0x8A4C, 0xD46D, 0x8A4D, 0xD46E, 0x8A4E, 0xD46F, 0x8A4F, 0xD470, 0x8A50, 0xD471, 0x8A51, 0xD472, 0x8A52, + 0xD473, 0x8A53, 0xD474, 0x8A54, 0xD475, 0x8A55, 0xD476, 0x8A56, 0xD477, 0x8A57, 0xD478, 0x8A58, 0xD479, 0x8A59, 0xD47A, 0x8A5A, + 0xD47B, 0x8A5B, 0xD47C, 0x8A5C, 0xD47D, 0x8A5D, 0xD47E, 0x8A5E, 0xD480, 0x8A5F, 0xD481, 0x8A60, 0xD482, 0x8A61, 0xD483, 0x8A62, + 0xD484, 0x8A63, 0xD485, 0x8A64, 0xD486, 0x8A65, 0xD487, 0x8A66, 0xD488, 0x8A67, 0xD489, 0x8A68, 0xD48A, 0x8A69, 0xD48B, 0x8A6A, + 0xD48C, 0x8A6B, 0xD48D, 0x8A6C, 0xD48E, 0x8A6D, 0xD48F, 0x8A6E, 0xD490, 0x8A6F, 0xD491, 0x8A70, 0xD492, 0x8A71, 0xD493, 0x8A72, + 0xD494, 0x8A73, 0xD495, 0x8A74, 0xD496, 0x8A75, 0xD497, 0x8A76, 0xD498, 0x8A77, 0xD499, 0x8A78, 0xD49A, 0x8A7A, 0xD49B, 0x8A7B, + 0xD49C, 0x8A7C, 0xD49D, 0x8A7D, 0xD49E, 0x8A7E, 0xD49F, 0x8A7F, 0xD4A0, 0x8A80, 0xD4A1, 0x6D74, 0xD4A2, 0x5BD3, 0xD4A3, 0x88D5, + 0xD4A4, 0x9884, 0xD4A5, 0x8C6B, 0xD4A6, 0x9A6D, 0xD4A7, 0x9E33, 0xD4A8, 0x6E0A, 0xD4A9, 0x51A4, 0xD4AA, 0x5143, 0xD4AB, 0x57A3, + 0xD4AC, 0x8881, 0xD4AD, 0x539F, 0xD4AE, 0x63F4, 0xD4AF, 0x8F95, 0xD4B0, 0x56ED, 0xD4B1, 0x5458, 0xD4B2, 0x5706, 0xD4B3, 0x733F, + 0xD4B4, 0x6E90, 0xD4B5, 0x7F18, 0xD4B6, 0x8FDC, 0xD4B7, 0x82D1, 0xD4B8, 0x613F, 0xD4B9, 0x6028, 0xD4BA, 0x9662, 0xD4BB, 0x66F0, + 0xD4BC, 0x7EA6, 0xD4BD, 0x8D8A, 0xD4BE, 0x8DC3, 0xD4BF, 0x94A5, 0xD4C0, 0x5CB3, 0xD4C1, 0x7CA4, 0xD4C2, 0x6708, 0xD4C3, 0x60A6, + 0xD4C4, 0x9605, 0xD4C5, 0x8018, 0xD4C6, 0x4E91, 0xD4C7, 0x90E7, 0xD4C8, 0x5300, 0xD4C9, 0x9668, 0xD4CA, 0x5141, 0xD4CB, 0x8FD0, + 0xD4CC, 0x8574, 0xD4CD, 0x915D, 0xD4CE, 0x6655, 0xD4CF, 0x97F5, 0xD4D0, 0x5B55, 0xD4D1, 0x531D, 0xD4D2, 0x7838, 0xD4D3, 0x6742, + 0xD4D4, 0x683D, 0xD4D5, 0x54C9, 0xD4D6, 0x707E, 0xD4D7, 0x5BB0, 0xD4D8, 0x8F7D, 0xD4D9, 0x518D, 0xD4DA, 0x5728, 0xD4DB, 0x54B1, + 0xD4DC, 0x6512, 0xD4DD, 0x6682, 0xD4DE, 0x8D5E, 0xD4DF, 0x8D43, 0xD4E0, 0x810F, 0xD4E1, 0x846C, 0xD4E2, 0x906D, 0xD4E3, 0x7CDF, + 0xD4E4, 0x51FF, 0xD4E5, 0x85FB, 0xD4E6, 0x67A3, 0xD4E7, 0x65E9, 0xD4E8, 0x6FA1, 0xD4E9, 0x86A4, 0xD4EA, 0x8E81, 0xD4EB, 0x566A, + 0xD4EC, 0x9020, 0xD4ED, 0x7682, 0xD4EE, 0x7076, 0xD4EF, 0x71E5, 0xD4F0, 0x8D23, 0xD4F1, 0x62E9, 0xD4F2, 0x5219, 0xD4F3, 0x6CFD, + 0xD4F4, 0x8D3C, 0xD4F5, 0x600E, 0xD4F6, 0x589E, 0xD4F7, 0x618E, 0xD4F8, 0x66FE, 0xD4F9, 0x8D60, 0xD4FA, 0x624E, 0xD4FB, 0x55B3, + 0xD4FC, 0x6E23, 0xD4FD, 0x672D, 0xD4FE, 0x8F67, 0xD540, 0x8A81, 0xD541, 0x8A82, 0xD542, 0x8A83, 0xD543, 0x8A84, 0xD544, 0x8A85, + 0xD545, 0x8A86, 0xD546, 0x8A87, 0xD547, 0x8A88, 0xD548, 0x8A8B, 0xD549, 0x8A8C, 0xD54A, 0x8A8D, 0xD54B, 0x8A8E, 0xD54C, 0x8A8F, + 0xD54D, 0x8A90, 0xD54E, 0x8A91, 0xD54F, 0x8A92, 0xD550, 0x8A94, 0xD551, 0x8A95, 0xD552, 0x8A96, 0xD553, 0x8A97, 0xD554, 0x8A98, + 0xD555, 0x8A99, 0xD556, 0x8A9A, 0xD557, 0x8A9B, 0xD558, 0x8A9C, 0xD559, 0x8A9D, 0xD55A, 0x8A9E, 0xD55B, 0x8A9F, 0xD55C, 0x8AA0, + 0xD55D, 0x8AA1, 0xD55E, 0x8AA2, 0xD55F, 0x8AA3, 0xD560, 0x8AA4, 0xD561, 0x8AA5, 0xD562, 0x8AA6, 0xD563, 0x8AA7, 0xD564, 0x8AA8, + 0xD565, 0x8AA9, 0xD566, 0x8AAA, 0xD567, 0x8AAB, 0xD568, 0x8AAC, 0xD569, 0x8AAD, 0xD56A, 0x8AAE, 0xD56B, 0x8AAF, 0xD56C, 0x8AB0, + 0xD56D, 0x8AB1, 0xD56E, 0x8AB2, 0xD56F, 0x8AB3, 0xD570, 0x8AB4, 0xD571, 0x8AB5, 0xD572, 0x8AB6, 0xD573, 0x8AB7, 0xD574, 0x8AB8, + 0xD575, 0x8AB9, 0xD576, 0x8ABA, 0xD577, 0x8ABB, 0xD578, 0x8ABC, 0xD579, 0x8ABD, 0xD57A, 0x8ABE, 0xD57B, 0x8ABF, 0xD57C, 0x8AC0, + 0xD57D, 0x8AC1, 0xD57E, 0x8AC2, 0xD580, 0x8AC3, 0xD581, 0x8AC4, 0xD582, 0x8AC5, 0xD583, 0x8AC6, 0xD584, 0x8AC7, 0xD585, 0x8AC8, + 0xD586, 0x8AC9, 0xD587, 0x8ACA, 0xD588, 0x8ACB, 0xD589, 0x8ACC, 0xD58A, 0x8ACD, 0xD58B, 0x8ACE, 0xD58C, 0x8ACF, 0xD58D, 0x8AD0, + 0xD58E, 0x8AD1, 0xD58F, 0x8AD2, 0xD590, 0x8AD3, 0xD591, 0x8AD4, 0xD592, 0x8AD5, 0xD593, 0x8AD6, 0xD594, 0x8AD7, 0xD595, 0x8AD8, + 0xD596, 0x8AD9, 0xD597, 0x8ADA, 0xD598, 0x8ADB, 0xD599, 0x8ADC, 0xD59A, 0x8ADD, 0xD59B, 0x8ADE, 0xD59C, 0x8ADF, 0xD59D, 0x8AE0, + 0xD59E, 0x8AE1, 0xD59F, 0x8AE2, 0xD5A0, 0x8AE3, 0xD5A1, 0x94E1, 0xD5A2, 0x95F8, 0xD5A3, 0x7728, 0xD5A4, 0x6805, 0xD5A5, 0x69A8, + 0xD5A6, 0x548B, 0xD5A7, 0x4E4D, 0xD5A8, 0x70B8, 0xD5A9, 0x8BC8, 0xD5AA, 0x6458, 0xD5AB, 0x658B, 0xD5AC, 0x5B85, 0xD5AD, 0x7A84, + 0xD5AE, 0x503A, 0xD5AF, 0x5BE8, 0xD5B0, 0x77BB, 0xD5B1, 0x6BE1, 0xD5B2, 0x8A79, 0xD5B3, 0x7C98, 0xD5B4, 0x6CBE, 0xD5B5, 0x76CF, + 0xD5B6, 0x65A9, 0xD5B7, 0x8F97, 0xD5B8, 0x5D2D, 0xD5B9, 0x5C55, 0xD5BA, 0x8638, 0xD5BB, 0x6808, 0xD5BC, 0x5360, 0xD5BD, 0x6218, + 0xD5BE, 0x7AD9, 0xD5BF, 0x6E5B, 0xD5C0, 0x7EFD, 0xD5C1, 0x6A1F, 0xD5C2, 0x7AE0, 0xD5C3, 0x5F70, 0xD5C4, 0x6F33, 0xD5C5, 0x5F20, + 0xD5C6, 0x638C, 0xD5C7, 0x6DA8, 0xD5C8, 0x6756, 0xD5C9, 0x4E08, 0xD5CA, 0x5E10, 0xD5CB, 0x8D26, 0xD5CC, 0x4ED7, 0xD5CD, 0x80C0, + 0xD5CE, 0x7634, 0xD5CF, 0x969C, 0xD5D0, 0x62DB, 0xD5D1, 0x662D, 0xD5D2, 0x627E, 0xD5D3, 0x6CBC, 0xD5D4, 0x8D75, 0xD5D5, 0x7167, + 0xD5D6, 0x7F69, 0xD5D7, 0x5146, 0xD5D8, 0x8087, 0xD5D9, 0x53EC, 0xD5DA, 0x906E, 0xD5DB, 0x6298, 0xD5DC, 0x54F2, 0xD5DD, 0x86F0, + 0xD5DE, 0x8F99, 0xD5DF, 0x8005, 0xD5E0, 0x9517, 0xD5E1, 0x8517, 0xD5E2, 0x8FD9, 0xD5E3, 0x6D59, 0xD5E4, 0x73CD, 0xD5E5, 0x659F, + 0xD5E6, 0x771F, 0xD5E7, 0x7504, 0xD5E8, 0x7827, 0xD5E9, 0x81FB, 0xD5EA, 0x8D1E, 0xD5EB, 0x9488, 0xD5EC, 0x4FA6, 0xD5ED, 0x6795, + 0xD5EE, 0x75B9, 0xD5EF, 0x8BCA, 0xD5F0, 0x9707, 0xD5F1, 0x632F, 0xD5F2, 0x9547, 0xD5F3, 0x9635, 0xD5F4, 0x84B8, 0xD5F5, 0x6323, + 0xD5F6, 0x7741, 0xD5F7, 0x5F81, 0xD5F8, 0x72F0, 0xD5F9, 0x4E89, 0xD5FA, 0x6014, 0xD5FB, 0x6574, 0xD5FC, 0x62EF, 0xD5FD, 0x6B63, + 0xD5FE, 0x653F, 0xD640, 0x8AE4, 0xD641, 0x8AE5, 0xD642, 0x8AE6, 0xD643, 0x8AE7, 0xD644, 0x8AE8, 0xD645, 0x8AE9, 0xD646, 0x8AEA, + 0xD647, 0x8AEB, 0xD648, 0x8AEC, 0xD649, 0x8AED, 0xD64A, 0x8AEE, 0xD64B, 0x8AEF, 0xD64C, 0x8AF0, 0xD64D, 0x8AF1, 0xD64E, 0x8AF2, + 0xD64F, 0x8AF3, 0xD650, 0x8AF4, 0xD651, 0x8AF5, 0xD652, 0x8AF6, 0xD653, 0x8AF7, 0xD654, 0x8AF8, 0xD655, 0x8AF9, 0xD656, 0x8AFA, + 0xD657, 0x8AFB, 0xD658, 0x8AFC, 0xD659, 0x8AFD, 0xD65A, 0x8AFE, 0xD65B, 0x8AFF, 0xD65C, 0x8B00, 0xD65D, 0x8B01, 0xD65E, 0x8B02, + 0xD65F, 0x8B03, 0xD660, 0x8B04, 0xD661, 0x8B05, 0xD662, 0x8B06, 0xD663, 0x8B08, 0xD664, 0x8B09, 0xD665, 0x8B0A, 0xD666, 0x8B0B, + 0xD667, 0x8B0C, 0xD668, 0x8B0D, 0xD669, 0x8B0E, 0xD66A, 0x8B0F, 0xD66B, 0x8B10, 0xD66C, 0x8B11, 0xD66D, 0x8B12, 0xD66E, 0x8B13, + 0xD66F, 0x8B14, 0xD670, 0x8B15, 0xD671, 0x8B16, 0xD672, 0x8B17, 0xD673, 0x8B18, 0xD674, 0x8B19, 0xD675, 0x8B1A, 0xD676, 0x8B1B, + 0xD677, 0x8B1C, 0xD678, 0x8B1D, 0xD679, 0x8B1E, 0xD67A, 0x8B1F, 0xD67B, 0x8B20, 0xD67C, 0x8B21, 0xD67D, 0x8B22, 0xD67E, 0x8B23, + 0xD680, 0x8B24, 0xD681, 0x8B25, 0xD682, 0x8B27, 0xD683, 0x8B28, 0xD684, 0x8B29, 0xD685, 0x8B2A, 0xD686, 0x8B2B, 0xD687, 0x8B2C, + 0xD688, 0x8B2D, 0xD689, 0x8B2E, 0xD68A, 0x8B2F, 0xD68B, 0x8B30, 0xD68C, 0x8B31, 0xD68D, 0x8B32, 0xD68E, 0x8B33, 0xD68F, 0x8B34, + 0xD690, 0x8B35, 0xD691, 0x8B36, 0xD692, 0x8B37, 0xD693, 0x8B38, 0xD694, 0x8B39, 0xD695, 0x8B3A, 0xD696, 0x8B3B, 0xD697, 0x8B3C, + 0xD698, 0x8B3D, 0xD699, 0x8B3E, 0xD69A, 0x8B3F, 0xD69B, 0x8B40, 0xD69C, 0x8B41, 0xD69D, 0x8B42, 0xD69E, 0x8B43, 0xD69F, 0x8B44, + 0xD6A0, 0x8B45, 0xD6A1, 0x5E27, 0xD6A2, 0x75C7, 0xD6A3, 0x90D1, 0xD6A4, 0x8BC1, 0xD6A5, 0x829D, 0xD6A6, 0x679D, 0xD6A7, 0x652F, + 0xD6A8, 0x5431, 0xD6A9, 0x8718, 0xD6AA, 0x77E5, 0xD6AB, 0x80A2, 0xD6AC, 0x8102, 0xD6AD, 0x6C41, 0xD6AE, 0x4E4B, 0xD6AF, 0x7EC7, + 0xD6B0, 0x804C, 0xD6B1, 0x76F4, 0xD6B2, 0x690D, 0xD6B3, 0x6B96, 0xD6B4, 0x6267, 0xD6B5, 0x503C, 0xD6B6, 0x4F84, 0xD6B7, 0x5740, + 0xD6B8, 0x6307, 0xD6B9, 0x6B62, 0xD6BA, 0x8DBE, 0xD6BB, 0x53EA, 0xD6BC, 0x65E8, 0xD6BD, 0x7EB8, 0xD6BE, 0x5FD7, 0xD6BF, 0x631A, + 0xD6C0, 0x63B7, 0xD6C1, 0x81F3, 0xD6C2, 0x81F4, 0xD6C3, 0x7F6E, 0xD6C4, 0x5E1C, 0xD6C5, 0x5CD9, 0xD6C6, 0x5236, 0xD6C7, 0x667A, + 0xD6C8, 0x79E9, 0xD6C9, 0x7A1A, 0xD6CA, 0x8D28, 0xD6CB, 0x7099, 0xD6CC, 0x75D4, 0xD6CD, 0x6EDE, 0xD6CE, 0x6CBB, 0xD6CF, 0x7A92, + 0xD6D0, 0x4E2D, 0xD6D1, 0x76C5, 0xD6D2, 0x5FE0, 0xD6D3, 0x949F, 0xD6D4, 0x8877, 0xD6D5, 0x7EC8, 0xD6D6, 0x79CD, 0xD6D7, 0x80BF, + 0xD6D8, 0x91CD, 0xD6D9, 0x4EF2, 0xD6DA, 0x4F17, 0xD6DB, 0x821F, 0xD6DC, 0x5468, 0xD6DD, 0x5DDE, 0xD6DE, 0x6D32, 0xD6DF, 0x8BCC, + 0xD6E0, 0x7CA5, 0xD6E1, 0x8F74, 0xD6E2, 0x8098, 0xD6E3, 0x5E1A, 0xD6E4, 0x5492, 0xD6E5, 0x76B1, 0xD6E6, 0x5B99, 0xD6E7, 0x663C, + 0xD6E8, 0x9AA4, 0xD6E9, 0x73E0, 0xD6EA, 0x682A, 0xD6EB, 0x86DB, 0xD6EC, 0x6731, 0xD6ED, 0x732A, 0xD6EE, 0x8BF8, 0xD6EF, 0x8BDB, + 0xD6F0, 0x9010, 0xD6F1, 0x7AF9, 0xD6F2, 0x70DB, 0xD6F3, 0x716E, 0xD6F4, 0x62C4, 0xD6F5, 0x77A9, 0xD6F6, 0x5631, 0xD6F7, 0x4E3B, + 0xD6F8, 0x8457, 0xD6F9, 0x67F1, 0xD6FA, 0x52A9, 0xD6FB, 0x86C0, 0xD6FC, 0x8D2E, 0xD6FD, 0x94F8, 0xD6FE, 0x7B51, 0xD740, 0x8B46, + 0xD741, 0x8B47, 0xD742, 0x8B48, 0xD743, 0x8B49, 0xD744, 0x8B4A, 0xD745, 0x8B4B, 0xD746, 0x8B4C, 0xD747, 0x8B4D, 0xD748, 0x8B4E, + 0xD749, 0x8B4F, 0xD74A, 0x8B50, 0xD74B, 0x8B51, 0xD74C, 0x8B52, 0xD74D, 0x8B53, 0xD74E, 0x8B54, 0xD74F, 0x8B55, 0xD750, 0x8B56, + 0xD751, 0x8B57, 0xD752, 0x8B58, 0xD753, 0x8B59, 0xD754, 0x8B5A, 0xD755, 0x8B5B, 0xD756, 0x8B5C, 0xD757, 0x8B5D, 0xD758, 0x8B5E, + 0xD759, 0x8B5F, 0xD75A, 0x8B60, 0xD75B, 0x8B61, 0xD75C, 0x8B62, 0xD75D, 0x8B63, 0xD75E, 0x8B64, 0xD75F, 0x8B65, 0xD760, 0x8B67, + 0xD761, 0x8B68, 0xD762, 0x8B69, 0xD763, 0x8B6A, 0xD764, 0x8B6B, 0xD765, 0x8B6D, 0xD766, 0x8B6E, 0xD767, 0x8B6F, 0xD768, 0x8B70, + 0xD769, 0x8B71, 0xD76A, 0x8B72, 0xD76B, 0x8B73, 0xD76C, 0x8B74, 0xD76D, 0x8B75, 0xD76E, 0x8B76, 0xD76F, 0x8B77, 0xD770, 0x8B78, + 0xD771, 0x8B79, 0xD772, 0x8B7A, 0xD773, 0x8B7B, 0xD774, 0x8B7C, 0xD775, 0x8B7D, 0xD776, 0x8B7E, 0xD777, 0x8B7F, 0xD778, 0x8B80, + 0xD779, 0x8B81, 0xD77A, 0x8B82, 0xD77B, 0x8B83, 0xD77C, 0x8B84, 0xD77D, 0x8B85, 0xD77E, 0x8B86, 0xD780, 0x8B87, 0xD781, 0x8B88, + 0xD782, 0x8B89, 0xD783, 0x8B8A, 0xD784, 0x8B8B, 0xD785, 0x8B8C, 0xD786, 0x8B8D, 0xD787, 0x8B8E, 0xD788, 0x8B8F, 0xD789, 0x8B90, + 0xD78A, 0x8B91, 0xD78B, 0x8B92, 0xD78C, 0x8B93, 0xD78D, 0x8B94, 0xD78E, 0x8B95, 0xD78F, 0x8B96, 0xD790, 0x8B97, 0xD791, 0x8B98, + 0xD792, 0x8B99, 0xD793, 0x8B9A, 0xD794, 0x8B9B, 0xD795, 0x8B9C, 0xD796, 0x8B9D, 0xD797, 0x8B9E, 0xD798, 0x8B9F, 0xD799, 0x8BAC, + 0xD79A, 0x8BB1, 0xD79B, 0x8BBB, 0xD79C, 0x8BC7, 0xD79D, 0x8BD0, 0xD79E, 0x8BEA, 0xD79F, 0x8C09, 0xD7A0, 0x8C1E, 0xD7A1, 0x4F4F, + 0xD7A2, 0x6CE8, 0xD7A3, 0x795D, 0xD7A4, 0x9A7B, 0xD7A5, 0x6293, 0xD7A6, 0x722A, 0xD7A7, 0x62FD, 0xD7A8, 0x4E13, 0xD7A9, 0x7816, + 0xD7AA, 0x8F6C, 0xD7AB, 0x64B0, 0xD7AC, 0x8D5A, 0xD7AD, 0x7BC6, 0xD7AE, 0x6869, 0xD7AF, 0x5E84, 0xD7B0, 0x88C5, 0xD7B1, 0x5986, + 0xD7B2, 0x649E, 0xD7B3, 0x58EE, 0xD7B4, 0x72B6, 0xD7B5, 0x690E, 0xD7B6, 0x9525, 0xD7B7, 0x8FFD, 0xD7B8, 0x8D58, 0xD7B9, 0x5760, + 0xD7BA, 0x7F00, 0xD7BB, 0x8C06, 0xD7BC, 0x51C6, 0xD7BD, 0x6349, 0xD7BE, 0x62D9, 0xD7BF, 0x5353, 0xD7C0, 0x684C, 0xD7C1, 0x7422, + 0xD7C2, 0x8301, 0xD7C3, 0x914C, 0xD7C4, 0x5544, 0xD7C5, 0x7740, 0xD7C6, 0x707C, 0xD7C7, 0x6D4A, 0xD7C8, 0x5179, 0xD7C9, 0x54A8, + 0xD7CA, 0x8D44, 0xD7CB, 0x59FF, 0xD7CC, 0x6ECB, 0xD7CD, 0x6DC4, 0xD7CE, 0x5B5C, 0xD7CF, 0x7D2B, 0xD7D0, 0x4ED4, 0xD7D1, 0x7C7D, + 0xD7D2, 0x6ED3, 0xD7D3, 0x5B50, 0xD7D4, 0x81EA, 0xD7D5, 0x6E0D, 0xD7D6, 0x5B57, 0xD7D7, 0x9B03, 0xD7D8, 0x68D5, 0xD7D9, 0x8E2A, + 0xD7DA, 0x5B97, 0xD7DB, 0x7EFC, 0xD7DC, 0x603B, 0xD7DD, 0x7EB5, 0xD7DE, 0x90B9, 0xD7DF, 0x8D70, 0xD7E0, 0x594F, 0xD7E1, 0x63CD, + 0xD7E2, 0x79DF, 0xD7E3, 0x8DB3, 0xD7E4, 0x5352, 0xD7E5, 0x65CF, 0xD7E6, 0x7956, 0xD7E7, 0x8BC5, 0xD7E8, 0x963B, 0xD7E9, 0x7EC4, + 0xD7EA, 0x94BB, 0xD7EB, 0x7E82, 0xD7EC, 0x5634, 0xD7ED, 0x9189, 0xD7EE, 0x6700, 0xD7EF, 0x7F6A, 0xD7F0, 0x5C0A, 0xD7F1, 0x9075, + 0xD7F2, 0x6628, 0xD7F3, 0x5DE6, 0xD7F4, 0x4F50, 0xD7F5, 0x67DE, 0xD7F6, 0x505A, 0xD7F7, 0x4F5C, 0xD7F8, 0x5750, 0xD7F9, 0x5EA7, + 0xD840, 0x8C38, 0xD841, 0x8C39, 0xD842, 0x8C3A, 0xD843, 0x8C3B, 0xD844, 0x8C3C, 0xD845, 0x8C3D, 0xD846, 0x8C3E, 0xD847, 0x8C3F, + 0xD848, 0x8C40, 0xD849, 0x8C42, 0xD84A, 0x8C43, 0xD84B, 0x8C44, 0xD84C, 0x8C45, 0xD84D, 0x8C48, 0xD84E, 0x8C4A, 0xD84F, 0x8C4B, + 0xD850, 0x8C4D, 0xD851, 0x8C4E, 0xD852, 0x8C4F, 0xD853, 0x8C50, 0xD854, 0x8C51, 0xD855, 0x8C52, 0xD856, 0x8C53, 0xD857, 0x8C54, + 0xD858, 0x8C56, 0xD859, 0x8C57, 0xD85A, 0x8C58, 0xD85B, 0x8C59, 0xD85C, 0x8C5B, 0xD85D, 0x8C5C, 0xD85E, 0x8C5D, 0xD85F, 0x8C5E, + 0xD860, 0x8C5F, 0xD861, 0x8C60, 0xD862, 0x8C63, 0xD863, 0x8C64, 0xD864, 0x8C65, 0xD865, 0x8C66, 0xD866, 0x8C67, 0xD867, 0x8C68, + 0xD868, 0x8C69, 0xD869, 0x8C6C, 0xD86A, 0x8C6D, 0xD86B, 0x8C6E, 0xD86C, 0x8C6F, 0xD86D, 0x8C70, 0xD86E, 0x8C71, 0xD86F, 0x8C72, + 0xD870, 0x8C74, 0xD871, 0x8C75, 0xD872, 0x8C76, 0xD873, 0x8C77, 0xD874, 0x8C7B, 0xD875, 0x8C7C, 0xD876, 0x8C7D, 0xD877, 0x8C7E, + 0xD878, 0x8C7F, 0xD879, 0x8C80, 0xD87A, 0x8C81, 0xD87B, 0x8C83, 0xD87C, 0x8C84, 0xD87D, 0x8C86, 0xD87E, 0x8C87, 0xD880, 0x8C88, + 0xD881, 0x8C8B, 0xD882, 0x8C8D, 0xD883, 0x8C8E, 0xD884, 0x8C8F, 0xD885, 0x8C90, 0xD886, 0x8C91, 0xD887, 0x8C92, 0xD888, 0x8C93, + 0xD889, 0x8C95, 0xD88A, 0x8C96, 0xD88B, 0x8C97, 0xD88C, 0x8C99, 0xD88D, 0x8C9A, 0xD88E, 0x8C9B, 0xD88F, 0x8C9C, 0xD890, 0x8C9D, + 0xD891, 0x8C9E, 0xD892, 0x8C9F, 0xD893, 0x8CA0, 0xD894, 0x8CA1, 0xD895, 0x8CA2, 0xD896, 0x8CA3, 0xD897, 0x8CA4, 0xD898, 0x8CA5, + 0xD899, 0x8CA6, 0xD89A, 0x8CA7, 0xD89B, 0x8CA8, 0xD89C, 0x8CA9, 0xD89D, 0x8CAA, 0xD89E, 0x8CAB, 0xD89F, 0x8CAC, 0xD8A0, 0x8CAD, + 0xD8A1, 0x4E8D, 0xD8A2, 0x4E0C, 0xD8A3, 0x5140, 0xD8A4, 0x4E10, 0xD8A5, 0x5EFF, 0xD8A6, 0x5345, 0xD8A7, 0x4E15, 0xD8A8, 0x4E98, + 0xD8A9, 0x4E1E, 0xD8AA, 0x9B32, 0xD8AB, 0x5B6C, 0xD8AC, 0x5669, 0xD8AD, 0x4E28, 0xD8AE, 0x79BA, 0xD8AF, 0x4E3F, 0xD8B0, 0x5315, + 0xD8B1, 0x4E47, 0xD8B2, 0x592D, 0xD8B3, 0x723B, 0xD8B4, 0x536E, 0xD8B5, 0x6C10, 0xD8B6, 0x56DF, 0xD8B7, 0x80E4, 0xD8B8, 0x9997, + 0xD8B9, 0x6BD3, 0xD8BA, 0x777E, 0xD8BB, 0x9F17, 0xD8BC, 0x4E36, 0xD8BD, 0x4E9F, 0xD8BE, 0x9F10, 0xD8BF, 0x4E5C, 0xD8C0, 0x4E69, + 0xD8C1, 0x4E93, 0xD8C2, 0x8288, 0xD8C3, 0x5B5B, 0xD8C4, 0x556C, 0xD8C5, 0x560F, 0xD8C6, 0x4EC4, 0xD8C7, 0x538D, 0xD8C8, 0x539D, + 0xD8C9, 0x53A3, 0xD8CA, 0x53A5, 0xD8CB, 0x53AE, 0xD8CC, 0x9765, 0xD8CD, 0x8D5D, 0xD8CE, 0x531A, 0xD8CF, 0x53F5, 0xD8D0, 0x5326, + 0xD8D1, 0x532E, 0xD8D2, 0x533E, 0xD8D3, 0x8D5C, 0xD8D4, 0x5366, 0xD8D5, 0x5363, 0xD8D6, 0x5202, 0xD8D7, 0x5208, 0xD8D8, 0x520E, + 0xD8D9, 0x522D, 0xD8DA, 0x5233, 0xD8DB, 0x523F, 0xD8DC, 0x5240, 0xD8DD, 0x524C, 0xD8DE, 0x525E, 0xD8DF, 0x5261, 0xD8E0, 0x525C, + 0xD8E1, 0x84AF, 0xD8E2, 0x527D, 0xD8E3, 0x5282, 0xD8E4, 0x5281, 0xD8E5, 0x5290, 0xD8E6, 0x5293, 0xD8E7, 0x5182, 0xD8E8, 0x7F54, + 0xD8E9, 0x4EBB, 0xD8EA, 0x4EC3, 0xD8EB, 0x4EC9, 0xD8EC, 0x4EC2, 0xD8ED, 0x4EE8, 0xD8EE, 0x4EE1, 0xD8EF, 0x4EEB, 0xD8F0, 0x4EDE, + 0xD8F1, 0x4F1B, 0xD8F2, 0x4EF3, 0xD8F3, 0x4F22, 0xD8F4, 0x4F64, 0xD8F5, 0x4EF5, 0xD8F6, 0x4F25, 0xD8F7, 0x4F27, 0xD8F8, 0x4F09, + 0xD8F9, 0x4F2B, 0xD8FA, 0x4F5E, 0xD8FB, 0x4F67, 0xD8FC, 0x6538, 0xD8FD, 0x4F5A, 0xD8FE, 0x4F5D, 0xD940, 0x8CAE, 0xD941, 0x8CAF, + 0xD942, 0x8CB0, 0xD943, 0x8CB1, 0xD944, 0x8CB2, 0xD945, 0x8CB3, 0xD946, 0x8CB4, 0xD947, 0x8CB5, 0xD948, 0x8CB6, 0xD949, 0x8CB7, + 0xD94A, 0x8CB8, 0xD94B, 0x8CB9, 0xD94C, 0x8CBA, 0xD94D, 0x8CBB, 0xD94E, 0x8CBC, 0xD94F, 0x8CBD, 0xD950, 0x8CBE, 0xD951, 0x8CBF, + 0xD952, 0x8CC0, 0xD953, 0x8CC1, 0xD954, 0x8CC2, 0xD955, 0x8CC3, 0xD956, 0x8CC4, 0xD957, 0x8CC5, 0xD958, 0x8CC6, 0xD959, 0x8CC7, + 0xD95A, 0x8CC8, 0xD95B, 0x8CC9, 0xD95C, 0x8CCA, 0xD95D, 0x8CCB, 0xD95E, 0x8CCC, 0xD95F, 0x8CCD, 0xD960, 0x8CCE, 0xD961, 0x8CCF, + 0xD962, 0x8CD0, 0xD963, 0x8CD1, 0xD964, 0x8CD2, 0xD965, 0x8CD3, 0xD966, 0x8CD4, 0xD967, 0x8CD5, 0xD968, 0x8CD6, 0xD969, 0x8CD7, + 0xD96A, 0x8CD8, 0xD96B, 0x8CD9, 0xD96C, 0x8CDA, 0xD96D, 0x8CDB, 0xD96E, 0x8CDC, 0xD96F, 0x8CDD, 0xD970, 0x8CDE, 0xD971, 0x8CDF, + 0xD972, 0x8CE0, 0xD973, 0x8CE1, 0xD974, 0x8CE2, 0xD975, 0x8CE3, 0xD976, 0x8CE4, 0xD977, 0x8CE5, 0xD978, 0x8CE6, 0xD979, 0x8CE7, + 0xD97A, 0x8CE8, 0xD97B, 0x8CE9, 0xD97C, 0x8CEA, 0xD97D, 0x8CEB, 0xD97E, 0x8CEC, 0xD980, 0x8CED, 0xD981, 0x8CEE, 0xD982, 0x8CEF, + 0xD983, 0x8CF0, 0xD984, 0x8CF1, 0xD985, 0x8CF2, 0xD986, 0x8CF3, 0xD987, 0x8CF4, 0xD988, 0x8CF5, 0xD989, 0x8CF6, 0xD98A, 0x8CF7, + 0xD98B, 0x8CF8, 0xD98C, 0x8CF9, 0xD98D, 0x8CFA, 0xD98E, 0x8CFB, 0xD98F, 0x8CFC, 0xD990, 0x8CFD, 0xD991, 0x8CFE, 0xD992, 0x8CFF, + 0xD993, 0x8D00, 0xD994, 0x8D01, 0xD995, 0x8D02, 0xD996, 0x8D03, 0xD997, 0x8D04, 0xD998, 0x8D05, 0xD999, 0x8D06, 0xD99A, 0x8D07, + 0xD99B, 0x8D08, 0xD99C, 0x8D09, 0xD99D, 0x8D0A, 0xD99E, 0x8D0B, 0xD99F, 0x8D0C, 0xD9A0, 0x8D0D, 0xD9A1, 0x4F5F, 0xD9A2, 0x4F57, + 0xD9A3, 0x4F32, 0xD9A4, 0x4F3D, 0xD9A5, 0x4F76, 0xD9A6, 0x4F74, 0xD9A7, 0x4F91, 0xD9A8, 0x4F89, 0xD9A9, 0x4F83, 0xD9AA, 0x4F8F, + 0xD9AB, 0x4F7E, 0xD9AC, 0x4F7B, 0xD9AD, 0x4FAA, 0xD9AE, 0x4F7C, 0xD9AF, 0x4FAC, 0xD9B0, 0x4F94, 0xD9B1, 0x4FE6, 0xD9B2, 0x4FE8, + 0xD9B3, 0x4FEA, 0xD9B4, 0x4FC5, 0xD9B5, 0x4FDA, 0xD9B6, 0x4FE3, 0xD9B7, 0x4FDC, 0xD9B8, 0x4FD1, 0xD9B9, 0x4FDF, 0xD9BA, 0x4FF8, + 0xD9BB, 0x5029, 0xD9BC, 0x504C, 0xD9BD, 0x4FF3, 0xD9BE, 0x502C, 0xD9BF, 0x500F, 0xD9C0, 0x502E, 0xD9C1, 0x502D, 0xD9C2, 0x4FFE, + 0xD9C3, 0x501C, 0xD9C4, 0x500C, 0xD9C5, 0x5025, 0xD9C6, 0x5028, 0xD9C7, 0x507E, 0xD9C8, 0x5043, 0xD9C9, 0x5055, 0xD9CA, 0x5048, + 0xD9CB, 0x504E, 0xD9CC, 0x506C, 0xD9CD, 0x507B, 0xD9CE, 0x50A5, 0xD9CF, 0x50A7, 0xD9D0, 0x50A9, 0xD9D1, 0x50BA, 0xD9D2, 0x50D6, + 0xD9D3, 0x5106, 0xD9D4, 0x50ED, 0xD9D5, 0x50EC, 0xD9D6, 0x50E6, 0xD9D7, 0x50EE, 0xD9D8, 0x5107, 0xD9D9, 0x510B, 0xD9DA, 0x4EDD, + 0xD9DB, 0x6C3D, 0xD9DC, 0x4F58, 0xD9DD, 0x4F65, 0xD9DE, 0x4FCE, 0xD9DF, 0x9FA0, 0xD9E0, 0x6C46, 0xD9E1, 0x7C74, 0xD9E2, 0x516E, + 0xD9E3, 0x5DFD, 0xD9E4, 0x9EC9, 0xD9E5, 0x9998, 0xD9E6, 0x5181, 0xD9E7, 0x5914, 0xD9E8, 0x52F9, 0xD9E9, 0x530D, 0xD9EA, 0x8A07, + 0xD9EB, 0x5310, 0xD9EC, 0x51EB, 0xD9ED, 0x5919, 0xD9EE, 0x5155, 0xD9EF, 0x4EA0, 0xD9F0, 0x5156, 0xD9F1, 0x4EB3, 0xD9F2, 0x886E, + 0xD9F3, 0x88A4, 0xD9F4, 0x4EB5, 0xD9F5, 0x8114, 0xD9F6, 0x88D2, 0xD9F7, 0x7980, 0xD9F8, 0x5B34, 0xD9F9, 0x8803, 0xD9FA, 0x7FB8, + 0xD9FB, 0x51AB, 0xD9FC, 0x51B1, 0xD9FD, 0x51BD, 0xD9FE, 0x51BC, 0xDA40, 0x8D0E, 0xDA41, 0x8D0F, 0xDA42, 0x8D10, 0xDA43, 0x8D11, + 0xDA44, 0x8D12, 0xDA45, 0x8D13, 0xDA46, 0x8D14, 0xDA47, 0x8D15, 0xDA48, 0x8D16, 0xDA49, 0x8D17, 0xDA4A, 0x8D18, 0xDA4B, 0x8D19, + 0xDA4C, 0x8D1A, 0xDA4D, 0x8D1B, 0xDA4E, 0x8D1C, 0xDA4F, 0x8D20, 0xDA50, 0x8D51, 0xDA51, 0x8D52, 0xDA52, 0x8D57, 0xDA53, 0x8D5F, + 0xDA54, 0x8D65, 0xDA55, 0x8D68, 0xDA56, 0x8D69, 0xDA57, 0x8D6A, 0xDA58, 0x8D6C, 0xDA59, 0x8D6E, 0xDA5A, 0x8D6F, 0xDA5B, 0x8D71, + 0xDA5C, 0x8D72, 0xDA5D, 0x8D78, 0xDA5E, 0x8D79, 0xDA5F, 0x8D7A, 0xDA60, 0x8D7B, 0xDA61, 0x8D7C, 0xDA62, 0x8D7D, 0xDA63, 0x8D7E, + 0xDA64, 0x8D7F, 0xDA65, 0x8D80, 0xDA66, 0x8D82, 0xDA67, 0x8D83, 0xDA68, 0x8D86, 0xDA69, 0x8D87, 0xDA6A, 0x8D88, 0xDA6B, 0x8D89, + 0xDA6C, 0x8D8C, 0xDA6D, 0x8D8D, 0xDA6E, 0x8D8E, 0xDA6F, 0x8D8F, 0xDA70, 0x8D90, 0xDA71, 0x8D92, 0xDA72, 0x8D93, 0xDA73, 0x8D95, + 0xDA74, 0x8D96, 0xDA75, 0x8D97, 0xDA76, 0x8D98, 0xDA77, 0x8D99, 0xDA78, 0x8D9A, 0xDA79, 0x8D9B, 0xDA7A, 0x8D9C, 0xDA7B, 0x8D9D, + 0xDA7C, 0x8D9E, 0xDA7D, 0x8DA0, 0xDA7E, 0x8DA1, 0xDA80, 0x8DA2, 0xDA81, 0x8DA4, 0xDA82, 0x8DA5, 0xDA83, 0x8DA6, 0xDA84, 0x8DA7, + 0xDA85, 0x8DA8, 0xDA86, 0x8DA9, 0xDA87, 0x8DAA, 0xDA88, 0x8DAB, 0xDA89, 0x8DAC, 0xDA8A, 0x8DAD, 0xDA8B, 0x8DAE, 0xDA8C, 0x8DAF, + 0xDA8D, 0x8DB0, 0xDA8E, 0x8DB2, 0xDA8F, 0x8DB6, 0xDA90, 0x8DB7, 0xDA91, 0x8DB9, 0xDA92, 0x8DBB, 0xDA93, 0x8DBD, 0xDA94, 0x8DC0, + 0xDA95, 0x8DC1, 0xDA96, 0x8DC2, 0xDA97, 0x8DC5, 0xDA98, 0x8DC7, 0xDA99, 0x8DC8, 0xDA9A, 0x8DC9, 0xDA9B, 0x8DCA, 0xDA9C, 0x8DCD, + 0xDA9D, 0x8DD0, 0xDA9E, 0x8DD2, 0xDA9F, 0x8DD3, 0xDAA0, 0x8DD4, 0xDAA1, 0x51C7, 0xDAA2, 0x5196, 0xDAA3, 0x51A2, 0xDAA4, 0x51A5, + 0xDAA5, 0x8BA0, 0xDAA6, 0x8BA6, 0xDAA7, 0x8BA7, 0xDAA8, 0x8BAA, 0xDAA9, 0x8BB4, 0xDAAA, 0x8BB5, 0xDAAB, 0x8BB7, 0xDAAC, 0x8BC2, + 0xDAAD, 0x8BC3, 0xDAAE, 0x8BCB, 0xDAAF, 0x8BCF, 0xDAB0, 0x8BCE, 0xDAB1, 0x8BD2, 0xDAB2, 0x8BD3, 0xDAB3, 0x8BD4, 0xDAB4, 0x8BD6, + 0xDAB5, 0x8BD8, 0xDAB6, 0x8BD9, 0xDAB7, 0x8BDC, 0xDAB8, 0x8BDF, 0xDAB9, 0x8BE0, 0xDABA, 0x8BE4, 0xDABB, 0x8BE8, 0xDABC, 0x8BE9, + 0xDABD, 0x8BEE, 0xDABE, 0x8BF0, 0xDABF, 0x8BF3, 0xDAC0, 0x8BF6, 0xDAC1, 0x8BF9, 0xDAC2, 0x8BFC, 0xDAC3, 0x8BFF, 0xDAC4, 0x8C00, + 0xDAC5, 0x8C02, 0xDAC6, 0x8C04, 0xDAC7, 0x8C07, 0xDAC8, 0x8C0C, 0xDAC9, 0x8C0F, 0xDACA, 0x8C11, 0xDACB, 0x8C12, 0xDACC, 0x8C14, + 0xDACD, 0x8C15, 0xDACE, 0x8C16, 0xDACF, 0x8C19, 0xDAD0, 0x8C1B, 0xDAD1, 0x8C18, 0xDAD2, 0x8C1D, 0xDAD3, 0x8C1F, 0xDAD4, 0x8C20, + 0xDAD5, 0x8C21, 0xDAD6, 0x8C25, 0xDAD7, 0x8C27, 0xDAD8, 0x8C2A, 0xDAD9, 0x8C2B, 0xDADA, 0x8C2E, 0xDADB, 0x8C2F, 0xDADC, 0x8C32, + 0xDADD, 0x8C33, 0xDADE, 0x8C35, 0xDADF, 0x8C36, 0xDAE0, 0x5369, 0xDAE1, 0x537A, 0xDAE2, 0x961D, 0xDAE3, 0x9622, 0xDAE4, 0x9621, + 0xDAE5, 0x9631, 0xDAE6, 0x962A, 0xDAE7, 0x963D, 0xDAE8, 0x963C, 0xDAE9, 0x9642, 0xDAEA, 0x9649, 0xDAEB, 0x9654, 0xDAEC, 0x965F, + 0xDAED, 0x9667, 0xDAEE, 0x966C, 0xDAEF, 0x9672, 0xDAF0, 0x9674, 0xDAF1, 0x9688, 0xDAF2, 0x968D, 0xDAF3, 0x9697, 0xDAF4, 0x96B0, + 0xDAF5, 0x9097, 0xDAF6, 0x909B, 0xDAF7, 0x909D, 0xDAF8, 0x9099, 0xDAF9, 0x90AC, 0xDAFA, 0x90A1, 0xDAFB, 0x90B4, 0xDAFC, 0x90B3, + 0xDAFD, 0x90B6, 0xDAFE, 0x90BA, 0xDB40, 0x8DD5, 0xDB41, 0x8DD8, 0xDB42, 0x8DD9, 0xDB43, 0x8DDC, 0xDB44, 0x8DE0, 0xDB45, 0x8DE1, + 0xDB46, 0x8DE2, 0xDB47, 0x8DE5, 0xDB48, 0x8DE6, 0xDB49, 0x8DE7, 0xDB4A, 0x8DE9, 0xDB4B, 0x8DED, 0xDB4C, 0x8DEE, 0xDB4D, 0x8DF0, + 0xDB4E, 0x8DF1, 0xDB4F, 0x8DF2, 0xDB50, 0x8DF4, 0xDB51, 0x8DF6, 0xDB52, 0x8DFC, 0xDB53, 0x8DFE, 0xDB54, 0x8DFF, 0xDB55, 0x8E00, + 0xDB56, 0x8E01, 0xDB57, 0x8E02, 0xDB58, 0x8E03, 0xDB59, 0x8E04, 0xDB5A, 0x8E06, 0xDB5B, 0x8E07, 0xDB5C, 0x8E08, 0xDB5D, 0x8E0B, + 0xDB5E, 0x8E0D, 0xDB5F, 0x8E0E, 0xDB60, 0x8E10, 0xDB61, 0x8E11, 0xDB62, 0x8E12, 0xDB63, 0x8E13, 0xDB64, 0x8E15, 0xDB65, 0x8E16, + 0xDB66, 0x8E17, 0xDB67, 0x8E18, 0xDB68, 0x8E19, 0xDB69, 0x8E1A, 0xDB6A, 0x8E1B, 0xDB6B, 0x8E1C, 0xDB6C, 0x8E20, 0xDB6D, 0x8E21, + 0xDB6E, 0x8E24, 0xDB6F, 0x8E25, 0xDB70, 0x8E26, 0xDB71, 0x8E27, 0xDB72, 0x8E28, 0xDB73, 0x8E2B, 0xDB74, 0x8E2D, 0xDB75, 0x8E30, + 0xDB76, 0x8E32, 0xDB77, 0x8E33, 0xDB78, 0x8E34, 0xDB79, 0x8E36, 0xDB7A, 0x8E37, 0xDB7B, 0x8E38, 0xDB7C, 0x8E3B, 0xDB7D, 0x8E3C, + 0xDB7E, 0x8E3E, 0xDB80, 0x8E3F, 0xDB81, 0x8E43, 0xDB82, 0x8E45, 0xDB83, 0x8E46, 0xDB84, 0x8E4C, 0xDB85, 0x8E4D, 0xDB86, 0x8E4E, + 0xDB87, 0x8E4F, 0xDB88, 0x8E50, 0xDB89, 0x8E53, 0xDB8A, 0x8E54, 0xDB8B, 0x8E55, 0xDB8C, 0x8E56, 0xDB8D, 0x8E57, 0xDB8E, 0x8E58, + 0xDB8F, 0x8E5A, 0xDB90, 0x8E5B, 0xDB91, 0x8E5C, 0xDB92, 0x8E5D, 0xDB93, 0x8E5E, 0xDB94, 0x8E5F, 0xDB95, 0x8E60, 0xDB96, 0x8E61, + 0xDB97, 0x8E62, 0xDB98, 0x8E63, 0xDB99, 0x8E64, 0xDB9A, 0x8E65, 0xDB9B, 0x8E67, 0xDB9C, 0x8E68, 0xDB9D, 0x8E6A, 0xDB9E, 0x8E6B, + 0xDB9F, 0x8E6E, 0xDBA0, 0x8E71, 0xDBA1, 0x90B8, 0xDBA2, 0x90B0, 0xDBA3, 0x90CF, 0xDBA4, 0x90C5, 0xDBA5, 0x90BE, 0xDBA6, 0x90D0, + 0xDBA7, 0x90C4, 0xDBA8, 0x90C7, 0xDBA9, 0x90D3, 0xDBAA, 0x90E6, 0xDBAB, 0x90E2, 0xDBAC, 0x90DC, 0xDBAD, 0x90D7, 0xDBAE, 0x90DB, + 0xDBAF, 0x90EB, 0xDBB0, 0x90EF, 0xDBB1, 0x90FE, 0xDBB2, 0x9104, 0xDBB3, 0x9122, 0xDBB4, 0x911E, 0xDBB5, 0x9123, 0xDBB6, 0x9131, + 0xDBB7, 0x912F, 0xDBB8, 0x9139, 0xDBB9, 0x9143, 0xDBBA, 0x9146, 0xDBBB, 0x520D, 0xDBBC, 0x5942, 0xDBBD, 0x52A2, 0xDBBE, 0x52AC, + 0xDBBF, 0x52AD, 0xDBC0, 0x52BE, 0xDBC1, 0x54FF, 0xDBC2, 0x52D0, 0xDBC3, 0x52D6, 0xDBC4, 0x52F0, 0xDBC5, 0x53DF, 0xDBC6, 0x71EE, + 0xDBC7, 0x77CD, 0xDBC8, 0x5EF4, 0xDBC9, 0x51F5, 0xDBCA, 0x51FC, 0xDBCB, 0x9B2F, 0xDBCC, 0x53B6, 0xDBCD, 0x5F01, 0xDBCE, 0x755A, + 0xDBCF, 0x5DEF, 0xDBD0, 0x574C, 0xDBD1, 0x57A9, 0xDBD2, 0x57A1, 0xDBD3, 0x587E, 0xDBD4, 0x58BC, 0xDBD5, 0x58C5, 0xDBD6, 0x58D1, + 0xDBD7, 0x5729, 0xDBD8, 0x572C, 0xDBD9, 0x572A, 0xDBDA, 0x5733, 0xDBDB, 0x5739, 0xDBDC, 0x572E, 0xDBDD, 0x572F, 0xDBDE, 0x575C, + 0xDBDF, 0x573B, 0xDBE0, 0x5742, 0xDBE1, 0x5769, 0xDBE2, 0x5785, 0xDBE3, 0x576B, 0xDBE4, 0x5786, 0xDBE5, 0x577C, 0xDBE6, 0x577B, + 0xDBE7, 0x5768, 0xDBE8, 0x576D, 0xDBE9, 0x5776, 0xDBEA, 0x5773, 0xDBEB, 0x57AD, 0xDBEC, 0x57A4, 0xDBED, 0x578C, 0xDBEE, 0x57B2, + 0xDBEF, 0x57CF, 0xDBF0, 0x57A7, 0xDBF1, 0x57B4, 0xDBF2, 0x5793, 0xDBF3, 0x57A0, 0xDBF4, 0x57D5, 0xDBF5, 0x57D8, 0xDBF6, 0x57DA, + 0xDBF7, 0x57D9, 0xDBF8, 0x57D2, 0xDBF9, 0x57B8, 0xDBFA, 0x57F4, 0xDBFB, 0x57EF, 0xDBFC, 0x57F8, 0xDBFD, 0x57E4, 0xDBFE, 0x57DD, + 0xDC40, 0x8E73, 0xDC41, 0x8E75, 0xDC42, 0x8E77, 0xDC43, 0x8E78, 0xDC44, 0x8E79, 0xDC45, 0x8E7A, 0xDC46, 0x8E7B, 0xDC47, 0x8E7D, + 0xDC48, 0x8E7E, 0xDC49, 0x8E80, 0xDC4A, 0x8E82, 0xDC4B, 0x8E83, 0xDC4C, 0x8E84, 0xDC4D, 0x8E86, 0xDC4E, 0x8E88, 0xDC4F, 0x8E89, + 0xDC50, 0x8E8A, 0xDC51, 0x8E8B, 0xDC52, 0x8E8C, 0xDC53, 0x8E8D, 0xDC54, 0x8E8E, 0xDC55, 0x8E91, 0xDC56, 0x8E92, 0xDC57, 0x8E93, + 0xDC58, 0x8E95, 0xDC59, 0x8E96, 0xDC5A, 0x8E97, 0xDC5B, 0x8E98, 0xDC5C, 0x8E99, 0xDC5D, 0x8E9A, 0xDC5E, 0x8E9B, 0xDC5F, 0x8E9D, + 0xDC60, 0x8E9F, 0xDC61, 0x8EA0, 0xDC62, 0x8EA1, 0xDC63, 0x8EA2, 0xDC64, 0x8EA3, 0xDC65, 0x8EA4, 0xDC66, 0x8EA5, 0xDC67, 0x8EA6, + 0xDC68, 0x8EA7, 0xDC69, 0x8EA8, 0xDC6A, 0x8EA9, 0xDC6B, 0x8EAA, 0xDC6C, 0x8EAD, 0xDC6D, 0x8EAE, 0xDC6E, 0x8EB0, 0xDC6F, 0x8EB1, + 0xDC70, 0x8EB3, 0xDC71, 0x8EB4, 0xDC72, 0x8EB5, 0xDC73, 0x8EB6, 0xDC74, 0x8EB7, 0xDC75, 0x8EB8, 0xDC76, 0x8EB9, 0xDC77, 0x8EBB, + 0xDC78, 0x8EBC, 0xDC79, 0x8EBD, 0xDC7A, 0x8EBE, 0xDC7B, 0x8EBF, 0xDC7C, 0x8EC0, 0xDC7D, 0x8EC1, 0xDC7E, 0x8EC2, 0xDC80, 0x8EC3, + 0xDC81, 0x8EC4, 0xDC82, 0x8EC5, 0xDC83, 0x8EC6, 0xDC84, 0x8EC7, 0xDC85, 0x8EC8, 0xDC86, 0x8EC9, 0xDC87, 0x8ECA, 0xDC88, 0x8ECB, + 0xDC89, 0x8ECC, 0xDC8A, 0x8ECD, 0xDC8B, 0x8ECF, 0xDC8C, 0x8ED0, 0xDC8D, 0x8ED1, 0xDC8E, 0x8ED2, 0xDC8F, 0x8ED3, 0xDC90, 0x8ED4, + 0xDC91, 0x8ED5, 0xDC92, 0x8ED6, 0xDC93, 0x8ED7, 0xDC94, 0x8ED8, 0xDC95, 0x8ED9, 0xDC96, 0x8EDA, 0xDC97, 0x8EDB, 0xDC98, 0x8EDC, + 0xDC99, 0x8EDD, 0xDC9A, 0x8EDE, 0xDC9B, 0x8EDF, 0xDC9C, 0x8EE0, 0xDC9D, 0x8EE1, 0xDC9E, 0x8EE2, 0xDC9F, 0x8EE3, 0xDCA0, 0x8EE4, + 0xDCA1, 0x580B, 0xDCA2, 0x580D, 0xDCA3, 0x57FD, 0xDCA4, 0x57ED, 0xDCA5, 0x5800, 0xDCA6, 0x581E, 0xDCA7, 0x5819, 0xDCA8, 0x5844, + 0xDCA9, 0x5820, 0xDCAA, 0x5865, 0xDCAB, 0x586C, 0xDCAC, 0x5881, 0xDCAD, 0x5889, 0xDCAE, 0x589A, 0xDCAF, 0x5880, 0xDCB0, 0x99A8, + 0xDCB1, 0x9F19, 0xDCB2, 0x61FF, 0xDCB3, 0x8279, 0xDCB4, 0x827D, 0xDCB5, 0x827F, 0xDCB6, 0x828F, 0xDCB7, 0x828A, 0xDCB8, 0x82A8, + 0xDCB9, 0x8284, 0xDCBA, 0x828E, 0xDCBB, 0x8291, 0xDCBC, 0x8297, 0xDCBD, 0x8299, 0xDCBE, 0x82AB, 0xDCBF, 0x82B8, 0xDCC0, 0x82BE, + 0xDCC1, 0x82B0, 0xDCC2, 0x82C8, 0xDCC3, 0x82CA, 0xDCC4, 0x82E3, 0xDCC5, 0x8298, 0xDCC6, 0x82B7, 0xDCC7, 0x82AE, 0xDCC8, 0x82CB, + 0xDCC9, 0x82CC, 0xDCCA, 0x82C1, 0xDCCB, 0x82A9, 0xDCCC, 0x82B4, 0xDCCD, 0x82A1, 0xDCCE, 0x82AA, 0xDCCF, 0x829F, 0xDCD0, 0x82C4, + 0xDCD1, 0x82CE, 0xDCD2, 0x82A4, 0xDCD3, 0x82E1, 0xDCD4, 0x8309, 0xDCD5, 0x82F7, 0xDCD6, 0x82E4, 0xDCD7, 0x830F, 0xDCD8, 0x8307, + 0xDCD9, 0x82DC, 0xDCDA, 0x82F4, 0xDCDB, 0x82D2, 0xDCDC, 0x82D8, 0xDCDD, 0x830C, 0xDCDE, 0x82FB, 0xDCDF, 0x82D3, 0xDCE0, 0x8311, + 0xDCE1, 0x831A, 0xDCE2, 0x8306, 0xDCE3, 0x8314, 0xDCE4, 0x8315, 0xDCE5, 0x82E0, 0xDCE6, 0x82D5, 0xDCE7, 0x831C, 0xDCE8, 0x8351, + 0xDCE9, 0x835B, 0xDCEA, 0x835C, 0xDCEB, 0x8308, 0xDCEC, 0x8392, 0xDCED, 0x833C, 0xDCEE, 0x8334, 0xDCEF, 0x8331, 0xDCF0, 0x839B, + 0xDCF1, 0x835E, 0xDCF2, 0x832F, 0xDCF3, 0x834F, 0xDCF4, 0x8347, 0xDCF5, 0x8343, 0xDCF6, 0x835F, 0xDCF7, 0x8340, 0xDCF8, 0x8317, + 0xDCF9, 0x8360, 0xDCFA, 0x832D, 0xDCFB, 0x833A, 0xDCFC, 0x8333, 0xDCFD, 0x8366, 0xDCFE, 0x8365, 0xDD40, 0x8EE5, 0xDD41, 0x8EE6, + 0xDD42, 0x8EE7, 0xDD43, 0x8EE8, 0xDD44, 0x8EE9, 0xDD45, 0x8EEA, 0xDD46, 0x8EEB, 0xDD47, 0x8EEC, 0xDD48, 0x8EED, 0xDD49, 0x8EEE, + 0xDD4A, 0x8EEF, 0xDD4B, 0x8EF0, 0xDD4C, 0x8EF1, 0xDD4D, 0x8EF2, 0xDD4E, 0x8EF3, 0xDD4F, 0x8EF4, 0xDD50, 0x8EF5, 0xDD51, 0x8EF6, + 0xDD52, 0x8EF7, 0xDD53, 0x8EF8, 0xDD54, 0x8EF9, 0xDD55, 0x8EFA, 0xDD56, 0x8EFB, 0xDD57, 0x8EFC, 0xDD58, 0x8EFD, 0xDD59, 0x8EFE, + 0xDD5A, 0x8EFF, 0xDD5B, 0x8F00, 0xDD5C, 0x8F01, 0xDD5D, 0x8F02, 0xDD5E, 0x8F03, 0xDD5F, 0x8F04, 0xDD60, 0x8F05, 0xDD61, 0x8F06, + 0xDD62, 0x8F07, 0xDD63, 0x8F08, 0xDD64, 0x8F09, 0xDD65, 0x8F0A, 0xDD66, 0x8F0B, 0xDD67, 0x8F0C, 0xDD68, 0x8F0D, 0xDD69, 0x8F0E, + 0xDD6A, 0x8F0F, 0xDD6B, 0x8F10, 0xDD6C, 0x8F11, 0xDD6D, 0x8F12, 0xDD6E, 0x8F13, 0xDD6F, 0x8F14, 0xDD70, 0x8F15, 0xDD71, 0x8F16, + 0xDD72, 0x8F17, 0xDD73, 0x8F18, 0xDD74, 0x8F19, 0xDD75, 0x8F1A, 0xDD76, 0x8F1B, 0xDD77, 0x8F1C, 0xDD78, 0x8F1D, 0xDD79, 0x8F1E, + 0xDD7A, 0x8F1F, 0xDD7B, 0x8F20, 0xDD7C, 0x8F21, 0xDD7D, 0x8F22, 0xDD7E, 0x8F23, 0xDD80, 0x8F24, 0xDD81, 0x8F25, 0xDD82, 0x8F26, + 0xDD83, 0x8F27, 0xDD84, 0x8F28, 0xDD85, 0x8F29, 0xDD86, 0x8F2A, 0xDD87, 0x8F2B, 0xDD88, 0x8F2C, 0xDD89, 0x8F2D, 0xDD8A, 0x8F2E, + 0xDD8B, 0x8F2F, 0xDD8C, 0x8F30, 0xDD8D, 0x8F31, 0xDD8E, 0x8F32, 0xDD8F, 0x8F33, 0xDD90, 0x8F34, 0xDD91, 0x8F35, 0xDD92, 0x8F36, + 0xDD93, 0x8F37, 0xDD94, 0x8F38, 0xDD95, 0x8F39, 0xDD96, 0x8F3A, 0xDD97, 0x8F3B, 0xDD98, 0x8F3C, 0xDD99, 0x8F3D, 0xDD9A, 0x8F3E, + 0xDD9B, 0x8F3F, 0xDD9C, 0x8F40, 0xDD9D, 0x8F41, 0xDD9E, 0x8F42, 0xDD9F, 0x8F43, 0xDDA0, 0x8F44, 0xDDA1, 0x8368, 0xDDA2, 0x831B, + 0xDDA3, 0x8369, 0xDDA4, 0x836C, 0xDDA5, 0x836A, 0xDDA6, 0x836D, 0xDDA7, 0x836E, 0xDDA8, 0x83B0, 0xDDA9, 0x8378, 0xDDAA, 0x83B3, + 0xDDAB, 0x83B4, 0xDDAC, 0x83A0, 0xDDAD, 0x83AA, 0xDDAE, 0x8393, 0xDDAF, 0x839C, 0xDDB0, 0x8385, 0xDDB1, 0x837C, 0xDDB2, 0x83B6, + 0xDDB3, 0x83A9, 0xDDB4, 0x837D, 0xDDB5, 0x83B8, 0xDDB6, 0x837B, 0xDDB7, 0x8398, 0xDDB8, 0x839E, 0xDDB9, 0x83A8, 0xDDBA, 0x83BA, + 0xDDBB, 0x83BC, 0xDDBC, 0x83C1, 0xDDBD, 0x8401, 0xDDBE, 0x83E5, 0xDDBF, 0x83D8, 0xDDC0, 0x5807, 0xDDC1, 0x8418, 0xDDC2, 0x840B, + 0xDDC3, 0x83DD, 0xDDC4, 0x83FD, 0xDDC5, 0x83D6, 0xDDC6, 0x841C, 0xDDC7, 0x8438, 0xDDC8, 0x8411, 0xDDC9, 0x8406, 0xDDCA, 0x83D4, + 0xDDCB, 0x83DF, 0xDDCC, 0x840F, 0xDDCD, 0x8403, 0xDDCE, 0x83F8, 0xDDCF, 0x83F9, 0xDDD0, 0x83EA, 0xDDD1, 0x83C5, 0xDDD2, 0x83C0, + 0xDDD3, 0x8426, 0xDDD4, 0x83F0, 0xDDD5, 0x83E1, 0xDDD6, 0x845C, 0xDDD7, 0x8451, 0xDDD8, 0x845A, 0xDDD9, 0x8459, 0xDDDA, 0x8473, + 0xDDDB, 0x8487, 0xDDDC, 0x8488, 0xDDDD, 0x847A, 0xDDDE, 0x8489, 0xDDDF, 0x8478, 0xDDE0, 0x843C, 0xDDE1, 0x8446, 0xDDE2, 0x8469, + 0xDDE3, 0x8476, 0xDDE4, 0x848C, 0xDDE5, 0x848E, 0xDDE6, 0x8431, 0xDDE7, 0x846D, 0xDDE8, 0x84C1, 0xDDE9, 0x84CD, 0xDDEA, 0x84D0, + 0xDDEB, 0x84E6, 0xDDEC, 0x84BD, 0xDDED, 0x84D3, 0xDDEE, 0x84CA, 0xDDEF, 0x84BF, 0xDDF0, 0x84BA, 0xDDF1, 0x84E0, 0xDDF2, 0x84A1, + 0xDDF3, 0x84B9, 0xDDF4, 0x84B4, 0xDDF5, 0x8497, 0xDDF6, 0x84E5, 0xDDF7, 0x84E3, 0xDDF8, 0x850C, 0xDDF9, 0x750D, 0xDDFA, 0x8538, + 0xDDFB, 0x84F0, 0xDDFC, 0x8539, 0xDDFD, 0x851F, 0xDDFE, 0x853A, 0xDE40, 0x8F45, 0xDE41, 0x8F46, 0xDE42, 0x8F47, 0xDE43, 0x8F48, + 0xDE44, 0x8F49, 0xDE45, 0x8F4A, 0xDE46, 0x8F4B, 0xDE47, 0x8F4C, 0xDE48, 0x8F4D, 0xDE49, 0x8F4E, 0xDE4A, 0x8F4F, 0xDE4B, 0x8F50, + 0xDE4C, 0x8F51, 0xDE4D, 0x8F52, 0xDE4E, 0x8F53, 0xDE4F, 0x8F54, 0xDE50, 0x8F55, 0xDE51, 0x8F56, 0xDE52, 0x8F57, 0xDE53, 0x8F58, + 0xDE54, 0x8F59, 0xDE55, 0x8F5A, 0xDE56, 0x8F5B, 0xDE57, 0x8F5C, 0xDE58, 0x8F5D, 0xDE59, 0x8F5E, 0xDE5A, 0x8F5F, 0xDE5B, 0x8F60, + 0xDE5C, 0x8F61, 0xDE5D, 0x8F62, 0xDE5E, 0x8F63, 0xDE5F, 0x8F64, 0xDE60, 0x8F65, 0xDE61, 0x8F6A, 0xDE62, 0x8F80, 0xDE63, 0x8F8C, + 0xDE64, 0x8F92, 0xDE65, 0x8F9D, 0xDE66, 0x8FA0, 0xDE67, 0x8FA1, 0xDE68, 0x8FA2, 0xDE69, 0x8FA4, 0xDE6A, 0x8FA5, 0xDE6B, 0x8FA6, + 0xDE6C, 0x8FA7, 0xDE6D, 0x8FAA, 0xDE6E, 0x8FAC, 0xDE6F, 0x8FAD, 0xDE70, 0x8FAE, 0xDE71, 0x8FAF, 0xDE72, 0x8FB2, 0xDE73, 0x8FB3, + 0xDE74, 0x8FB4, 0xDE75, 0x8FB5, 0xDE76, 0x8FB7, 0xDE77, 0x8FB8, 0xDE78, 0x8FBA, 0xDE79, 0x8FBB, 0xDE7A, 0x8FBC, 0xDE7B, 0x8FBF, + 0xDE7C, 0x8FC0, 0xDE7D, 0x8FC3, 0xDE7E, 0x8FC6, 0xDE80, 0x8FC9, 0xDE81, 0x8FCA, 0xDE82, 0x8FCB, 0xDE83, 0x8FCC, 0xDE84, 0x8FCD, + 0xDE85, 0x8FCF, 0xDE86, 0x8FD2, 0xDE87, 0x8FD6, 0xDE88, 0x8FD7, 0xDE89, 0x8FDA, 0xDE8A, 0x8FE0, 0xDE8B, 0x8FE1, 0xDE8C, 0x8FE3, + 0xDE8D, 0x8FE7, 0xDE8E, 0x8FEC, 0xDE8F, 0x8FEF, 0xDE90, 0x8FF1, 0xDE91, 0x8FF2, 0xDE92, 0x8FF4, 0xDE93, 0x8FF5, 0xDE94, 0x8FF6, + 0xDE95, 0x8FFA, 0xDE96, 0x8FFB, 0xDE97, 0x8FFC, 0xDE98, 0x8FFE, 0xDE99, 0x8FFF, 0xDE9A, 0x9007, 0xDE9B, 0x9008, 0xDE9C, 0x900C, + 0xDE9D, 0x900E, 0xDE9E, 0x9013, 0xDE9F, 0x9015, 0xDEA0, 0x9018, 0xDEA1, 0x8556, 0xDEA2, 0x853B, 0xDEA3, 0x84FF, 0xDEA4, 0x84FC, + 0xDEA5, 0x8559, 0xDEA6, 0x8548, 0xDEA7, 0x8568, 0xDEA8, 0x8564, 0xDEA9, 0x855E, 0xDEAA, 0x857A, 0xDEAB, 0x77A2, 0xDEAC, 0x8543, + 0xDEAD, 0x8572, 0xDEAE, 0x857B, 0xDEAF, 0x85A4, 0xDEB0, 0x85A8, 0xDEB1, 0x8587, 0xDEB2, 0x858F, 0xDEB3, 0x8579, 0xDEB4, 0x85AE, + 0xDEB5, 0x859C, 0xDEB6, 0x8585, 0xDEB7, 0x85B9, 0xDEB8, 0x85B7, 0xDEB9, 0x85B0, 0xDEBA, 0x85D3, 0xDEBB, 0x85C1, 0xDEBC, 0x85DC, + 0xDEBD, 0x85FF, 0xDEBE, 0x8627, 0xDEBF, 0x8605, 0xDEC0, 0x8629, 0xDEC1, 0x8616, 0xDEC2, 0x863C, 0xDEC3, 0x5EFE, 0xDEC4, 0x5F08, + 0xDEC5, 0x593C, 0xDEC6, 0x5941, 0xDEC7, 0x8037, 0xDEC8, 0x5955, 0xDEC9, 0x595A, 0xDECA, 0x5958, 0xDECB, 0x530F, 0xDECC, 0x5C22, + 0xDECD, 0x5C25, 0xDECE, 0x5C2C, 0xDECF, 0x5C34, 0xDED0, 0x624C, 0xDED1, 0x626A, 0xDED2, 0x629F, 0xDED3, 0x62BB, 0xDED4, 0x62CA, + 0xDED5, 0x62DA, 0xDED6, 0x62D7, 0xDED7, 0x62EE, 0xDED8, 0x6322, 0xDED9, 0x62F6, 0xDEDA, 0x6339, 0xDEDB, 0x634B, 0xDEDC, 0x6343, + 0xDEDD, 0x63AD, 0xDEDE, 0x63F6, 0xDEDF, 0x6371, 0xDEE0, 0x637A, 0xDEE1, 0x638E, 0xDEE2, 0x63B4, 0xDEE3, 0x636D, 0xDEE4, 0x63AC, + 0xDEE5, 0x638A, 0xDEE6, 0x6369, 0xDEE7, 0x63AE, 0xDEE8, 0x63BC, 0xDEE9, 0x63F2, 0xDEEA, 0x63F8, 0xDEEB, 0x63E0, 0xDEEC, 0x63FF, + 0xDEED, 0x63C4, 0xDEEE, 0x63DE, 0xDEEF, 0x63CE, 0xDEF0, 0x6452, 0xDEF1, 0x63C6, 0xDEF2, 0x63BE, 0xDEF3, 0x6445, 0xDEF4, 0x6441, + 0xDEF5, 0x640B, 0xDEF6, 0x641B, 0xDEF7, 0x6420, 0xDEF8, 0x640C, 0xDEF9, 0x6426, 0xDEFA, 0x6421, 0xDEFB, 0x645E, 0xDEFC, 0x6484, + 0xDEFD, 0x646D, 0xDEFE, 0x6496, 0xDF40, 0x9019, 0xDF41, 0x901C, 0xDF42, 0x9023, 0xDF43, 0x9024, 0xDF44, 0x9025, 0xDF45, 0x9027, + 0xDF46, 0x9028, 0xDF47, 0x9029, 0xDF48, 0x902A, 0xDF49, 0x902B, 0xDF4A, 0x902C, 0xDF4B, 0x9030, 0xDF4C, 0x9031, 0xDF4D, 0x9032, + 0xDF4E, 0x9033, 0xDF4F, 0x9034, 0xDF50, 0x9037, 0xDF51, 0x9039, 0xDF52, 0x903A, 0xDF53, 0x903D, 0xDF54, 0x903F, 0xDF55, 0x9040, + 0xDF56, 0x9043, 0xDF57, 0x9045, 0xDF58, 0x9046, 0xDF59, 0x9048, 0xDF5A, 0x9049, 0xDF5B, 0x904A, 0xDF5C, 0x904B, 0xDF5D, 0x904C, + 0xDF5E, 0x904E, 0xDF5F, 0x9054, 0xDF60, 0x9055, 0xDF61, 0x9056, 0xDF62, 0x9059, 0xDF63, 0x905A, 0xDF64, 0x905C, 0xDF65, 0x905D, + 0xDF66, 0x905E, 0xDF67, 0x905F, 0xDF68, 0x9060, 0xDF69, 0x9061, 0xDF6A, 0x9064, 0xDF6B, 0x9066, 0xDF6C, 0x9067, 0xDF6D, 0x9069, + 0xDF6E, 0x906A, 0xDF6F, 0x906B, 0xDF70, 0x906C, 0xDF71, 0x906F, 0xDF72, 0x9070, 0xDF73, 0x9071, 0xDF74, 0x9072, 0xDF75, 0x9073, + 0xDF76, 0x9076, 0xDF77, 0x9077, 0xDF78, 0x9078, 0xDF79, 0x9079, 0xDF7A, 0x907A, 0xDF7B, 0x907B, 0xDF7C, 0x907C, 0xDF7D, 0x907E, + 0xDF7E, 0x9081, 0xDF80, 0x9084, 0xDF81, 0x9085, 0xDF82, 0x9086, 0xDF83, 0x9087, 0xDF84, 0x9089, 0xDF85, 0x908A, 0xDF86, 0x908C, + 0xDF87, 0x908D, 0xDF88, 0x908E, 0xDF89, 0x908F, 0xDF8A, 0x9090, 0xDF8B, 0x9092, 0xDF8C, 0x9094, 0xDF8D, 0x9096, 0xDF8E, 0x9098, + 0xDF8F, 0x909A, 0xDF90, 0x909C, 0xDF91, 0x909E, 0xDF92, 0x909F, 0xDF93, 0x90A0, 0xDF94, 0x90A4, 0xDF95, 0x90A5, 0xDF96, 0x90A7, + 0xDF97, 0x90A8, 0xDF98, 0x90A9, 0xDF99, 0x90AB, 0xDF9A, 0x90AD, 0xDF9B, 0x90B2, 0xDF9C, 0x90B7, 0xDF9D, 0x90BC, 0xDF9E, 0x90BD, + 0xDF9F, 0x90BF, 0xDFA0, 0x90C0, 0xDFA1, 0x647A, 0xDFA2, 0x64B7, 0xDFA3, 0x64B8, 0xDFA4, 0x6499, 0xDFA5, 0x64BA, 0xDFA6, 0x64C0, + 0xDFA7, 0x64D0, 0xDFA8, 0x64D7, 0xDFA9, 0x64E4, 0xDFAA, 0x64E2, 0xDFAB, 0x6509, 0xDFAC, 0x6525, 0xDFAD, 0x652E, 0xDFAE, 0x5F0B, + 0xDFAF, 0x5FD2, 0xDFB0, 0x7519, 0xDFB1, 0x5F11, 0xDFB2, 0x535F, 0xDFB3, 0x53F1, 0xDFB4, 0x53FD, 0xDFB5, 0x53E9, 0xDFB6, 0x53E8, + 0xDFB7, 0x53FB, 0xDFB8, 0x5412, 0xDFB9, 0x5416, 0xDFBA, 0x5406, 0xDFBB, 0x544B, 0xDFBC, 0x5452, 0xDFBD, 0x5453, 0xDFBE, 0x5454, + 0xDFBF, 0x5456, 0xDFC0, 0x5443, 0xDFC1, 0x5421, 0xDFC2, 0x5457, 0xDFC3, 0x5459, 0xDFC4, 0x5423, 0xDFC5, 0x5432, 0xDFC6, 0x5482, + 0xDFC7, 0x5494, 0xDFC8, 0x5477, 0xDFC9, 0x5471, 0xDFCA, 0x5464, 0xDFCB, 0x549A, 0xDFCC, 0x549B, 0xDFCD, 0x5484, 0xDFCE, 0x5476, + 0xDFCF, 0x5466, 0xDFD0, 0x549D, 0xDFD1, 0x54D0, 0xDFD2, 0x54AD, 0xDFD3, 0x54C2, 0xDFD4, 0x54B4, 0xDFD5, 0x54D2, 0xDFD6, 0x54A7, + 0xDFD7, 0x54A6, 0xDFD8, 0x54D3, 0xDFD9, 0x54D4, 0xDFDA, 0x5472, 0xDFDB, 0x54A3, 0xDFDC, 0x54D5, 0xDFDD, 0x54BB, 0xDFDE, 0x54BF, + 0xDFDF, 0x54CC, 0xDFE0, 0x54D9, 0xDFE1, 0x54DA, 0xDFE2, 0x54DC, 0xDFE3, 0x54A9, 0xDFE4, 0x54AA, 0xDFE5, 0x54A4, 0xDFE6, 0x54DD, + 0xDFE7, 0x54CF, 0xDFE8, 0x54DE, 0xDFE9, 0x551B, 0xDFEA, 0x54E7, 0xDFEB, 0x5520, 0xDFEC, 0x54FD, 0xDFED, 0x5514, 0xDFEE, 0x54F3, + 0xDFEF, 0x5522, 0xDFF0, 0x5523, 0xDFF1, 0x550F, 0xDFF2, 0x5511, 0xDFF3, 0x5527, 0xDFF4, 0x552A, 0xDFF5, 0x5567, 0xDFF6, 0x558F, + 0xDFF7, 0x55B5, 0xDFF8, 0x5549, 0xDFF9, 0x556D, 0xDFFA, 0x5541, 0xDFFB, 0x5555, 0xDFFC, 0x553F, 0xDFFD, 0x5550, 0xDFFE, 0x553C, + 0xE040, 0x90C2, 0xE041, 0x90C3, 0xE042, 0x90C6, 0xE043, 0x90C8, 0xE044, 0x90C9, 0xE045, 0x90CB, 0xE046, 0x90CC, 0xE047, 0x90CD, + 0xE048, 0x90D2, 0xE049, 0x90D4, 0xE04A, 0x90D5, 0xE04B, 0x90D6, 0xE04C, 0x90D8, 0xE04D, 0x90D9, 0xE04E, 0x90DA, 0xE04F, 0x90DE, + 0xE050, 0x90DF, 0xE051, 0x90E0, 0xE052, 0x90E3, 0xE053, 0x90E4, 0xE054, 0x90E5, 0xE055, 0x90E9, 0xE056, 0x90EA, 0xE057, 0x90EC, + 0xE058, 0x90EE, 0xE059, 0x90F0, 0xE05A, 0x90F1, 0xE05B, 0x90F2, 0xE05C, 0x90F3, 0xE05D, 0x90F5, 0xE05E, 0x90F6, 0xE05F, 0x90F7, + 0xE060, 0x90F9, 0xE061, 0x90FA, 0xE062, 0x90FB, 0xE063, 0x90FC, 0xE064, 0x90FF, 0xE065, 0x9100, 0xE066, 0x9101, 0xE067, 0x9103, + 0xE068, 0x9105, 0xE069, 0x9106, 0xE06A, 0x9107, 0xE06B, 0x9108, 0xE06C, 0x9109, 0xE06D, 0x910A, 0xE06E, 0x910B, 0xE06F, 0x910C, + 0xE070, 0x910D, 0xE071, 0x910E, 0xE072, 0x910F, 0xE073, 0x9110, 0xE074, 0x9111, 0xE075, 0x9112, 0xE076, 0x9113, 0xE077, 0x9114, + 0xE078, 0x9115, 0xE079, 0x9116, 0xE07A, 0x9117, 0xE07B, 0x9118, 0xE07C, 0x911A, 0xE07D, 0x911B, 0xE07E, 0x911C, 0xE080, 0x911D, + 0xE081, 0x911F, 0xE082, 0x9120, 0xE083, 0x9121, 0xE084, 0x9124, 0xE085, 0x9125, 0xE086, 0x9126, 0xE087, 0x9127, 0xE088, 0x9128, + 0xE089, 0x9129, 0xE08A, 0x912A, 0xE08B, 0x912B, 0xE08C, 0x912C, 0xE08D, 0x912D, 0xE08E, 0x912E, 0xE08F, 0x9130, 0xE090, 0x9132, + 0xE091, 0x9133, 0xE092, 0x9134, 0xE093, 0x9135, 0xE094, 0x9136, 0xE095, 0x9137, 0xE096, 0x9138, 0xE097, 0x913A, 0xE098, 0x913B, + 0xE099, 0x913C, 0xE09A, 0x913D, 0xE09B, 0x913E, 0xE09C, 0x913F, 0xE09D, 0x9140, 0xE09E, 0x9141, 0xE09F, 0x9142, 0xE0A0, 0x9144, + 0xE0A1, 0x5537, 0xE0A2, 0x5556, 0xE0A3, 0x5575, 0xE0A4, 0x5576, 0xE0A5, 0x5577, 0xE0A6, 0x5533, 0xE0A7, 0x5530, 0xE0A8, 0x555C, + 0xE0A9, 0x558B, 0xE0AA, 0x55D2, 0xE0AB, 0x5583, 0xE0AC, 0x55B1, 0xE0AD, 0x55B9, 0xE0AE, 0x5588, 0xE0AF, 0x5581, 0xE0B0, 0x559F, + 0xE0B1, 0x557E, 0xE0B2, 0x55D6, 0xE0B3, 0x5591, 0xE0B4, 0x557B, 0xE0B5, 0x55DF, 0xE0B6, 0x55BD, 0xE0B7, 0x55BE, 0xE0B8, 0x5594, + 0xE0B9, 0x5599, 0xE0BA, 0x55EA, 0xE0BB, 0x55F7, 0xE0BC, 0x55C9, 0xE0BD, 0x561F, 0xE0BE, 0x55D1, 0xE0BF, 0x55EB, 0xE0C0, 0x55EC, + 0xE0C1, 0x55D4, 0xE0C2, 0x55E6, 0xE0C3, 0x55DD, 0xE0C4, 0x55C4, 0xE0C5, 0x55EF, 0xE0C6, 0x55E5, 0xE0C7, 0x55F2, 0xE0C8, 0x55F3, + 0xE0C9, 0x55CC, 0xE0CA, 0x55CD, 0xE0CB, 0x55E8, 0xE0CC, 0x55F5, 0xE0CD, 0x55E4, 0xE0CE, 0x8F94, 0xE0CF, 0x561E, 0xE0D0, 0x5608, + 0xE0D1, 0x560C, 0xE0D2, 0x5601, 0xE0D3, 0x5624, 0xE0D4, 0x5623, 0xE0D5, 0x55FE, 0xE0D6, 0x5600, 0xE0D7, 0x5627, 0xE0D8, 0x562D, + 0xE0D9, 0x5658, 0xE0DA, 0x5639, 0xE0DB, 0x5657, 0xE0DC, 0x562C, 0xE0DD, 0x564D, 0xE0DE, 0x5662, 0xE0DF, 0x5659, 0xE0E0, 0x565C, + 0xE0E1, 0x564C, 0xE0E2, 0x5654, 0xE0E3, 0x5686, 0xE0E4, 0x5664, 0xE0E5, 0x5671, 0xE0E6, 0x566B, 0xE0E7, 0x567B, 0xE0E8, 0x567C, + 0xE0E9, 0x5685, 0xE0EA, 0x5693, 0xE0EB, 0x56AF, 0xE0EC, 0x56D4, 0xE0ED, 0x56D7, 0xE0EE, 0x56DD, 0xE0EF, 0x56E1, 0xE0F0, 0x56F5, + 0xE0F1, 0x56EB, 0xE0F2, 0x56F9, 0xE0F3, 0x56FF, 0xE0F4, 0x5704, 0xE0F5, 0x570A, 0xE0F6, 0x5709, 0xE0F7, 0x571C, 0xE0F8, 0x5E0F, + 0xE0F9, 0x5E19, 0xE0FA, 0x5E14, 0xE0FB, 0x5E11, 0xE0FC, 0x5E31, 0xE0FD, 0x5E3B, 0xE0FE, 0x5E3C, 0xE140, 0x9145, 0xE141, 0x9147, + 0xE142, 0x9148, 0xE143, 0x9151, 0xE144, 0x9153, 0xE145, 0x9154, 0xE146, 0x9155, 0xE147, 0x9156, 0xE148, 0x9158, 0xE149, 0x9159, + 0xE14A, 0x915B, 0xE14B, 0x915C, 0xE14C, 0x915F, 0xE14D, 0x9160, 0xE14E, 0x9166, 0xE14F, 0x9167, 0xE150, 0x9168, 0xE151, 0x916B, + 0xE152, 0x916D, 0xE153, 0x9173, 0xE154, 0x917A, 0xE155, 0x917B, 0xE156, 0x917C, 0xE157, 0x9180, 0xE158, 0x9181, 0xE159, 0x9182, + 0xE15A, 0x9183, 0xE15B, 0x9184, 0xE15C, 0x9186, 0xE15D, 0x9188, 0xE15E, 0x918A, 0xE15F, 0x918E, 0xE160, 0x918F, 0xE161, 0x9193, + 0xE162, 0x9194, 0xE163, 0x9195, 0xE164, 0x9196, 0xE165, 0x9197, 0xE166, 0x9198, 0xE167, 0x9199, 0xE168, 0x919C, 0xE169, 0x919D, + 0xE16A, 0x919E, 0xE16B, 0x919F, 0xE16C, 0x91A0, 0xE16D, 0x91A1, 0xE16E, 0x91A4, 0xE16F, 0x91A5, 0xE170, 0x91A6, 0xE171, 0x91A7, + 0xE172, 0x91A8, 0xE173, 0x91A9, 0xE174, 0x91AB, 0xE175, 0x91AC, 0xE176, 0x91B0, 0xE177, 0x91B1, 0xE178, 0x91B2, 0xE179, 0x91B3, + 0xE17A, 0x91B6, 0xE17B, 0x91B7, 0xE17C, 0x91B8, 0xE17D, 0x91B9, 0xE17E, 0x91BB, 0xE180, 0x91BC, 0xE181, 0x91BD, 0xE182, 0x91BE, + 0xE183, 0x91BF, 0xE184, 0x91C0, 0xE185, 0x91C1, 0xE186, 0x91C2, 0xE187, 0x91C3, 0xE188, 0x91C4, 0xE189, 0x91C5, 0xE18A, 0x91C6, + 0xE18B, 0x91C8, 0xE18C, 0x91CB, 0xE18D, 0x91D0, 0xE18E, 0x91D2, 0xE18F, 0x91D3, 0xE190, 0x91D4, 0xE191, 0x91D5, 0xE192, 0x91D6, + 0xE193, 0x91D7, 0xE194, 0x91D8, 0xE195, 0x91D9, 0xE196, 0x91DA, 0xE197, 0x91DB, 0xE198, 0x91DD, 0xE199, 0x91DE, 0xE19A, 0x91DF, + 0xE19B, 0x91E0, 0xE19C, 0x91E1, 0xE19D, 0x91E2, 0xE19E, 0x91E3, 0xE19F, 0x91E4, 0xE1A0, 0x91E5, 0xE1A1, 0x5E37, 0xE1A2, 0x5E44, + 0xE1A3, 0x5E54, 0xE1A4, 0x5E5B, 0xE1A5, 0x5E5E, 0xE1A6, 0x5E61, 0xE1A7, 0x5C8C, 0xE1A8, 0x5C7A, 0xE1A9, 0x5C8D, 0xE1AA, 0x5C90, + 0xE1AB, 0x5C96, 0xE1AC, 0x5C88, 0xE1AD, 0x5C98, 0xE1AE, 0x5C99, 0xE1AF, 0x5C91, 0xE1B0, 0x5C9A, 0xE1B1, 0x5C9C, 0xE1B2, 0x5CB5, + 0xE1B3, 0x5CA2, 0xE1B4, 0x5CBD, 0xE1B5, 0x5CAC, 0xE1B6, 0x5CAB, 0xE1B7, 0x5CB1, 0xE1B8, 0x5CA3, 0xE1B9, 0x5CC1, 0xE1BA, 0x5CB7, + 0xE1BB, 0x5CC4, 0xE1BC, 0x5CD2, 0xE1BD, 0x5CE4, 0xE1BE, 0x5CCB, 0xE1BF, 0x5CE5, 0xE1C0, 0x5D02, 0xE1C1, 0x5D03, 0xE1C2, 0x5D27, + 0xE1C3, 0x5D26, 0xE1C4, 0x5D2E, 0xE1C5, 0x5D24, 0xE1C6, 0x5D1E, 0xE1C7, 0x5D06, 0xE1C8, 0x5D1B, 0xE1C9, 0x5D58, 0xE1CA, 0x5D3E, + 0xE1CB, 0x5D34, 0xE1CC, 0x5D3D, 0xE1CD, 0x5D6C, 0xE1CE, 0x5D5B, 0xE1CF, 0x5D6F, 0xE1D0, 0x5D5D, 0xE1D1, 0x5D6B, 0xE1D2, 0x5D4B, + 0xE1D3, 0x5D4A, 0xE1D4, 0x5D69, 0xE1D5, 0x5D74, 0xE1D6, 0x5D82, 0xE1D7, 0x5D99, 0xE1D8, 0x5D9D, 0xE1D9, 0x8C73, 0xE1DA, 0x5DB7, + 0xE1DB, 0x5DC5, 0xE1DC, 0x5F73, 0xE1DD, 0x5F77, 0xE1DE, 0x5F82, 0xE1DF, 0x5F87, 0xE1E0, 0x5F89, 0xE1E1, 0x5F8C, 0xE1E2, 0x5F95, + 0xE1E3, 0x5F99, 0xE1E4, 0x5F9C, 0xE1E5, 0x5FA8, 0xE1E6, 0x5FAD, 0xE1E7, 0x5FB5, 0xE1E8, 0x5FBC, 0xE1E9, 0x8862, 0xE1EA, 0x5F61, + 0xE1EB, 0x72AD, 0xE1EC, 0x72B0, 0xE1ED, 0x72B4, 0xE1EE, 0x72B7, 0xE1EF, 0x72B8, 0xE1F0, 0x72C3, 0xE1F1, 0x72C1, 0xE1F2, 0x72CE, + 0xE1F3, 0x72CD, 0xE1F4, 0x72D2, 0xE1F5, 0x72E8, 0xE1F6, 0x72EF, 0xE1F7, 0x72E9, 0xE1F8, 0x72F2, 0xE1F9, 0x72F4, 0xE1FA, 0x72F7, + 0xE1FB, 0x7301, 0xE1FC, 0x72F3, 0xE1FD, 0x7303, 0xE1FE, 0x72FA, 0xE240, 0x91E6, 0xE241, 0x91E7, 0xE242, 0x91E8, 0xE243, 0x91E9, + 0xE244, 0x91EA, 0xE245, 0x91EB, 0xE246, 0x91EC, 0xE247, 0x91ED, 0xE248, 0x91EE, 0xE249, 0x91EF, 0xE24A, 0x91F0, 0xE24B, 0x91F1, + 0xE24C, 0x91F2, 0xE24D, 0x91F3, 0xE24E, 0x91F4, 0xE24F, 0x91F5, 0xE250, 0x91F6, 0xE251, 0x91F7, 0xE252, 0x91F8, 0xE253, 0x91F9, + 0xE254, 0x91FA, 0xE255, 0x91FB, 0xE256, 0x91FC, 0xE257, 0x91FD, 0xE258, 0x91FE, 0xE259, 0x91FF, 0xE25A, 0x9200, 0xE25B, 0x9201, + 0xE25C, 0x9202, 0xE25D, 0x9203, 0xE25E, 0x9204, 0xE25F, 0x9205, 0xE260, 0x9206, 0xE261, 0x9207, 0xE262, 0x9208, 0xE263, 0x9209, + 0xE264, 0x920A, 0xE265, 0x920B, 0xE266, 0x920C, 0xE267, 0x920D, 0xE268, 0x920E, 0xE269, 0x920F, 0xE26A, 0x9210, 0xE26B, 0x9211, + 0xE26C, 0x9212, 0xE26D, 0x9213, 0xE26E, 0x9214, 0xE26F, 0x9215, 0xE270, 0x9216, 0xE271, 0x9217, 0xE272, 0x9218, 0xE273, 0x9219, + 0xE274, 0x921A, 0xE275, 0x921B, 0xE276, 0x921C, 0xE277, 0x921D, 0xE278, 0x921E, 0xE279, 0x921F, 0xE27A, 0x9220, 0xE27B, 0x9221, + 0xE27C, 0x9222, 0xE27D, 0x9223, 0xE27E, 0x9224, 0xE280, 0x9225, 0xE281, 0x9226, 0xE282, 0x9227, 0xE283, 0x9228, 0xE284, 0x9229, + 0xE285, 0x922A, 0xE286, 0x922B, 0xE287, 0x922C, 0xE288, 0x922D, 0xE289, 0x922E, 0xE28A, 0x922F, 0xE28B, 0x9230, 0xE28C, 0x9231, + 0xE28D, 0x9232, 0xE28E, 0x9233, 0xE28F, 0x9234, 0xE290, 0x9235, 0xE291, 0x9236, 0xE292, 0x9237, 0xE293, 0x9238, 0xE294, 0x9239, + 0xE295, 0x923A, 0xE296, 0x923B, 0xE297, 0x923C, 0xE298, 0x923D, 0xE299, 0x923E, 0xE29A, 0x923F, 0xE29B, 0x9240, 0xE29C, 0x9241, + 0xE29D, 0x9242, 0xE29E, 0x9243, 0xE29F, 0x9244, 0xE2A0, 0x9245, 0xE2A1, 0x72FB, 0xE2A2, 0x7317, 0xE2A3, 0x7313, 0xE2A4, 0x7321, + 0xE2A5, 0x730A, 0xE2A6, 0x731E, 0xE2A7, 0x731D, 0xE2A8, 0x7315, 0xE2A9, 0x7322, 0xE2AA, 0x7339, 0xE2AB, 0x7325, 0xE2AC, 0x732C, + 0xE2AD, 0x7338, 0xE2AE, 0x7331, 0xE2AF, 0x7350, 0xE2B0, 0x734D, 0xE2B1, 0x7357, 0xE2B2, 0x7360, 0xE2B3, 0x736C, 0xE2B4, 0x736F, + 0xE2B5, 0x737E, 0xE2B6, 0x821B, 0xE2B7, 0x5925, 0xE2B8, 0x98E7, 0xE2B9, 0x5924, 0xE2BA, 0x5902, 0xE2BB, 0x9963, 0xE2BC, 0x9967, + 0xE2BD, 0x9968, 0xE2BE, 0x9969, 0xE2BF, 0x996A, 0xE2C0, 0x996B, 0xE2C1, 0x996C, 0xE2C2, 0x9974, 0xE2C3, 0x9977, 0xE2C4, 0x997D, + 0xE2C5, 0x9980, 0xE2C6, 0x9984, 0xE2C7, 0x9987, 0xE2C8, 0x998A, 0xE2C9, 0x998D, 0xE2CA, 0x9990, 0xE2CB, 0x9991, 0xE2CC, 0x9993, + 0xE2CD, 0x9994, 0xE2CE, 0x9995, 0xE2CF, 0x5E80, 0xE2D0, 0x5E91, 0xE2D1, 0x5E8B, 0xE2D2, 0x5E96, 0xE2D3, 0x5EA5, 0xE2D4, 0x5EA0, + 0xE2D5, 0x5EB9, 0xE2D6, 0x5EB5, 0xE2D7, 0x5EBE, 0xE2D8, 0x5EB3, 0xE2D9, 0x8D53, 0xE2DA, 0x5ED2, 0xE2DB, 0x5ED1, 0xE2DC, 0x5EDB, + 0xE2DD, 0x5EE8, 0xE2DE, 0x5EEA, 0xE2DF, 0x81BA, 0xE2E0, 0x5FC4, 0xE2E1, 0x5FC9, 0xE2E2, 0x5FD6, 0xE2E3, 0x5FCF, 0xE2E4, 0x6003, + 0xE2E5, 0x5FEE, 0xE2E6, 0x6004, 0xE2E7, 0x5FE1, 0xE2E8, 0x5FE4, 0xE2E9, 0x5FFE, 0xE2EA, 0x6005, 0xE2EB, 0x6006, 0xE2EC, 0x5FEA, + 0xE2ED, 0x5FED, 0xE2EE, 0x5FF8, 0xE2EF, 0x6019, 0xE2F0, 0x6035, 0xE2F1, 0x6026, 0xE2F2, 0x601B, 0xE2F3, 0x600F, 0xE2F4, 0x600D, + 0xE2F5, 0x6029, 0xE2F6, 0x602B, 0xE2F7, 0x600A, 0xE2F8, 0x603F, 0xE2F9, 0x6021, 0xE2FA, 0x6078, 0xE2FB, 0x6079, 0xE2FC, 0x607B, + 0xE2FD, 0x607A, 0xE2FE, 0x6042, 0xE340, 0x9246, 0xE341, 0x9247, 0xE342, 0x9248, 0xE343, 0x9249, 0xE344, 0x924A, 0xE345, 0x924B, + 0xE346, 0x924C, 0xE347, 0x924D, 0xE348, 0x924E, 0xE349, 0x924F, 0xE34A, 0x9250, 0xE34B, 0x9251, 0xE34C, 0x9252, 0xE34D, 0x9253, + 0xE34E, 0x9254, 0xE34F, 0x9255, 0xE350, 0x9256, 0xE351, 0x9257, 0xE352, 0x9258, 0xE353, 0x9259, 0xE354, 0x925A, 0xE355, 0x925B, + 0xE356, 0x925C, 0xE357, 0x925D, 0xE358, 0x925E, 0xE359, 0x925F, 0xE35A, 0x9260, 0xE35B, 0x9261, 0xE35C, 0x9262, 0xE35D, 0x9263, + 0xE35E, 0x9264, 0xE35F, 0x9265, 0xE360, 0x9266, 0xE361, 0x9267, 0xE362, 0x9268, 0xE363, 0x9269, 0xE364, 0x926A, 0xE365, 0x926B, + 0xE366, 0x926C, 0xE367, 0x926D, 0xE368, 0x926E, 0xE369, 0x926F, 0xE36A, 0x9270, 0xE36B, 0x9271, 0xE36C, 0x9272, 0xE36D, 0x9273, + 0xE36E, 0x9275, 0xE36F, 0x9276, 0xE370, 0x9277, 0xE371, 0x9278, 0xE372, 0x9279, 0xE373, 0x927A, 0xE374, 0x927B, 0xE375, 0x927C, + 0xE376, 0x927D, 0xE377, 0x927E, 0xE378, 0x927F, 0xE379, 0x9280, 0xE37A, 0x9281, 0xE37B, 0x9282, 0xE37C, 0x9283, 0xE37D, 0x9284, + 0xE37E, 0x9285, 0xE380, 0x9286, 0xE381, 0x9287, 0xE382, 0x9288, 0xE383, 0x9289, 0xE384, 0x928A, 0xE385, 0x928B, 0xE386, 0x928C, + 0xE387, 0x928D, 0xE388, 0x928F, 0xE389, 0x9290, 0xE38A, 0x9291, 0xE38B, 0x9292, 0xE38C, 0x9293, 0xE38D, 0x9294, 0xE38E, 0x9295, + 0xE38F, 0x9296, 0xE390, 0x9297, 0xE391, 0x9298, 0xE392, 0x9299, 0xE393, 0x929A, 0xE394, 0x929B, 0xE395, 0x929C, 0xE396, 0x929D, + 0xE397, 0x929E, 0xE398, 0x929F, 0xE399, 0x92A0, 0xE39A, 0x92A1, 0xE39B, 0x92A2, 0xE39C, 0x92A3, 0xE39D, 0x92A4, 0xE39E, 0x92A5, + 0xE39F, 0x92A6, 0xE3A0, 0x92A7, 0xE3A1, 0x606A, 0xE3A2, 0x607D, 0xE3A3, 0x6096, 0xE3A4, 0x609A, 0xE3A5, 0x60AD, 0xE3A6, 0x609D, + 0xE3A7, 0x6083, 0xE3A8, 0x6092, 0xE3A9, 0x608C, 0xE3AA, 0x609B, 0xE3AB, 0x60EC, 0xE3AC, 0x60BB, 0xE3AD, 0x60B1, 0xE3AE, 0x60DD, + 0xE3AF, 0x60D8, 0xE3B0, 0x60C6, 0xE3B1, 0x60DA, 0xE3B2, 0x60B4, 0xE3B3, 0x6120, 0xE3B4, 0x6126, 0xE3B5, 0x6115, 0xE3B6, 0x6123, + 0xE3B7, 0x60F4, 0xE3B8, 0x6100, 0xE3B9, 0x610E, 0xE3BA, 0x612B, 0xE3BB, 0x614A, 0xE3BC, 0x6175, 0xE3BD, 0x61AC, 0xE3BE, 0x6194, + 0xE3BF, 0x61A7, 0xE3C0, 0x61B7, 0xE3C1, 0x61D4, 0xE3C2, 0x61F5, 0xE3C3, 0x5FDD, 0xE3C4, 0x96B3, 0xE3C5, 0x95E9, 0xE3C6, 0x95EB, + 0xE3C7, 0x95F1, 0xE3C8, 0x95F3, 0xE3C9, 0x95F5, 0xE3CA, 0x95F6, 0xE3CB, 0x95FC, 0xE3CC, 0x95FE, 0xE3CD, 0x9603, 0xE3CE, 0x9604, + 0xE3CF, 0x9606, 0xE3D0, 0x9608, 0xE3D1, 0x960A, 0xE3D2, 0x960B, 0xE3D3, 0x960C, 0xE3D4, 0x960D, 0xE3D5, 0x960F, 0xE3D6, 0x9612, + 0xE3D7, 0x9615, 0xE3D8, 0x9616, 0xE3D9, 0x9617, 0xE3DA, 0x9619, 0xE3DB, 0x961A, 0xE3DC, 0x4E2C, 0xE3DD, 0x723F, 0xE3DE, 0x6215, + 0xE3DF, 0x6C35, 0xE3E0, 0x6C54, 0xE3E1, 0x6C5C, 0xE3E2, 0x6C4A, 0xE3E3, 0x6CA3, 0xE3E4, 0x6C85, 0xE3E5, 0x6C90, 0xE3E6, 0x6C94, + 0xE3E7, 0x6C8C, 0xE3E8, 0x6C68, 0xE3E9, 0x6C69, 0xE3EA, 0x6C74, 0xE3EB, 0x6C76, 0xE3EC, 0x6C86, 0xE3ED, 0x6CA9, 0xE3EE, 0x6CD0, + 0xE3EF, 0x6CD4, 0xE3F0, 0x6CAD, 0xE3F1, 0x6CF7, 0xE3F2, 0x6CF8, 0xE3F3, 0x6CF1, 0xE3F4, 0x6CD7, 0xE3F5, 0x6CB2, 0xE3F6, 0x6CE0, + 0xE3F7, 0x6CD6, 0xE3F8, 0x6CFA, 0xE3F9, 0x6CEB, 0xE3FA, 0x6CEE, 0xE3FB, 0x6CB1, 0xE3FC, 0x6CD3, 0xE3FD, 0x6CEF, 0xE3FE, 0x6CFE, + 0xE440, 0x92A8, 0xE441, 0x92A9, 0xE442, 0x92AA, 0xE443, 0x92AB, 0xE444, 0x92AC, 0xE445, 0x92AD, 0xE446, 0x92AF, 0xE447, 0x92B0, + 0xE448, 0x92B1, 0xE449, 0x92B2, 0xE44A, 0x92B3, 0xE44B, 0x92B4, 0xE44C, 0x92B5, 0xE44D, 0x92B6, 0xE44E, 0x92B7, 0xE44F, 0x92B8, + 0xE450, 0x92B9, 0xE451, 0x92BA, 0xE452, 0x92BB, 0xE453, 0x92BC, 0xE454, 0x92BD, 0xE455, 0x92BE, 0xE456, 0x92BF, 0xE457, 0x92C0, + 0xE458, 0x92C1, 0xE459, 0x92C2, 0xE45A, 0x92C3, 0xE45B, 0x92C4, 0xE45C, 0x92C5, 0xE45D, 0x92C6, 0xE45E, 0x92C7, 0xE45F, 0x92C9, + 0xE460, 0x92CA, 0xE461, 0x92CB, 0xE462, 0x92CC, 0xE463, 0x92CD, 0xE464, 0x92CE, 0xE465, 0x92CF, 0xE466, 0x92D0, 0xE467, 0x92D1, + 0xE468, 0x92D2, 0xE469, 0x92D3, 0xE46A, 0x92D4, 0xE46B, 0x92D5, 0xE46C, 0x92D6, 0xE46D, 0x92D7, 0xE46E, 0x92D8, 0xE46F, 0x92D9, + 0xE470, 0x92DA, 0xE471, 0x92DB, 0xE472, 0x92DC, 0xE473, 0x92DD, 0xE474, 0x92DE, 0xE475, 0x92DF, 0xE476, 0x92E0, 0xE477, 0x92E1, + 0xE478, 0x92E2, 0xE479, 0x92E3, 0xE47A, 0x92E4, 0xE47B, 0x92E5, 0xE47C, 0x92E6, 0xE47D, 0x92E7, 0xE47E, 0x92E8, 0xE480, 0x92E9, + 0xE481, 0x92EA, 0xE482, 0x92EB, 0xE483, 0x92EC, 0xE484, 0x92ED, 0xE485, 0x92EE, 0xE486, 0x92EF, 0xE487, 0x92F0, 0xE488, 0x92F1, + 0xE489, 0x92F2, 0xE48A, 0x92F3, 0xE48B, 0x92F4, 0xE48C, 0x92F5, 0xE48D, 0x92F6, 0xE48E, 0x92F7, 0xE48F, 0x92F8, 0xE490, 0x92F9, + 0xE491, 0x92FA, 0xE492, 0x92FB, 0xE493, 0x92FC, 0xE494, 0x92FD, 0xE495, 0x92FE, 0xE496, 0x92FF, 0xE497, 0x9300, 0xE498, 0x9301, + 0xE499, 0x9302, 0xE49A, 0x9303, 0xE49B, 0x9304, 0xE49C, 0x9305, 0xE49D, 0x9306, 0xE49E, 0x9307, 0xE49F, 0x9308, 0xE4A0, 0x9309, + 0xE4A1, 0x6D39, 0xE4A2, 0x6D27, 0xE4A3, 0x6D0C, 0xE4A4, 0x6D43, 0xE4A5, 0x6D48, 0xE4A6, 0x6D07, 0xE4A7, 0x6D04, 0xE4A8, 0x6D19, + 0xE4A9, 0x6D0E, 0xE4AA, 0x6D2B, 0xE4AB, 0x6D4D, 0xE4AC, 0x6D2E, 0xE4AD, 0x6D35, 0xE4AE, 0x6D1A, 0xE4AF, 0x6D4F, 0xE4B0, 0x6D52, + 0xE4B1, 0x6D54, 0xE4B2, 0x6D33, 0xE4B3, 0x6D91, 0xE4B4, 0x6D6F, 0xE4B5, 0x6D9E, 0xE4B6, 0x6DA0, 0xE4B7, 0x6D5E, 0xE4B8, 0x6D93, + 0xE4B9, 0x6D94, 0xE4BA, 0x6D5C, 0xE4BB, 0x6D60, 0xE4BC, 0x6D7C, 0xE4BD, 0x6D63, 0xE4BE, 0x6E1A, 0xE4BF, 0x6DC7, 0xE4C0, 0x6DC5, + 0xE4C1, 0x6DDE, 0xE4C2, 0x6E0E, 0xE4C3, 0x6DBF, 0xE4C4, 0x6DE0, 0xE4C5, 0x6E11, 0xE4C6, 0x6DE6, 0xE4C7, 0x6DDD, 0xE4C8, 0x6DD9, + 0xE4C9, 0x6E16, 0xE4CA, 0x6DAB, 0xE4CB, 0x6E0C, 0xE4CC, 0x6DAE, 0xE4CD, 0x6E2B, 0xE4CE, 0x6E6E, 0xE4CF, 0x6E4E, 0xE4D0, 0x6E6B, + 0xE4D1, 0x6EB2, 0xE4D2, 0x6E5F, 0xE4D3, 0x6E86, 0xE4D4, 0x6E53, 0xE4D5, 0x6E54, 0xE4D6, 0x6E32, 0xE4D7, 0x6E25, 0xE4D8, 0x6E44, + 0xE4D9, 0x6EDF, 0xE4DA, 0x6EB1, 0xE4DB, 0x6E98, 0xE4DC, 0x6EE0, 0xE4DD, 0x6F2D, 0xE4DE, 0x6EE2, 0xE4DF, 0x6EA5, 0xE4E0, 0x6EA7, + 0xE4E1, 0x6EBD, 0xE4E2, 0x6EBB, 0xE4E3, 0x6EB7, 0xE4E4, 0x6ED7, 0xE4E5, 0x6EB4, 0xE4E6, 0x6ECF, 0xE4E7, 0x6E8F, 0xE4E8, 0x6EC2, + 0xE4E9, 0x6E9F, 0xE4EA, 0x6F62, 0xE4EB, 0x6F46, 0xE4EC, 0x6F47, 0xE4ED, 0x6F24, 0xE4EE, 0x6F15, 0xE4EF, 0x6EF9, 0xE4F0, 0x6F2F, + 0xE4F1, 0x6F36, 0xE4F2, 0x6F4B, 0xE4F3, 0x6F74, 0xE4F4, 0x6F2A, 0xE4F5, 0x6F09, 0xE4F6, 0x6F29, 0xE4F7, 0x6F89, 0xE4F8, 0x6F8D, + 0xE4F9, 0x6F8C, 0xE4FA, 0x6F78, 0xE4FB, 0x6F72, 0xE4FC, 0x6F7C, 0xE4FD, 0x6F7A, 0xE4FE, 0x6FD1, 0xE540, 0x930A, 0xE541, 0x930B, + 0xE542, 0x930C, 0xE543, 0x930D, 0xE544, 0x930E, 0xE545, 0x930F, 0xE546, 0x9310, 0xE547, 0x9311, 0xE548, 0x9312, 0xE549, 0x9313, + 0xE54A, 0x9314, 0xE54B, 0x9315, 0xE54C, 0x9316, 0xE54D, 0x9317, 0xE54E, 0x9318, 0xE54F, 0x9319, 0xE550, 0x931A, 0xE551, 0x931B, + 0xE552, 0x931C, 0xE553, 0x931D, 0xE554, 0x931E, 0xE555, 0x931F, 0xE556, 0x9320, 0xE557, 0x9321, 0xE558, 0x9322, 0xE559, 0x9323, + 0xE55A, 0x9324, 0xE55B, 0x9325, 0xE55C, 0x9326, 0xE55D, 0x9327, 0xE55E, 0x9328, 0xE55F, 0x9329, 0xE560, 0x932A, 0xE561, 0x932B, + 0xE562, 0x932C, 0xE563, 0x932D, 0xE564, 0x932E, 0xE565, 0x932F, 0xE566, 0x9330, 0xE567, 0x9331, 0xE568, 0x9332, 0xE569, 0x9333, + 0xE56A, 0x9334, 0xE56B, 0x9335, 0xE56C, 0x9336, 0xE56D, 0x9337, 0xE56E, 0x9338, 0xE56F, 0x9339, 0xE570, 0x933A, 0xE571, 0x933B, + 0xE572, 0x933C, 0xE573, 0x933D, 0xE574, 0x933F, 0xE575, 0x9340, 0xE576, 0x9341, 0xE577, 0x9342, 0xE578, 0x9343, 0xE579, 0x9344, + 0xE57A, 0x9345, 0xE57B, 0x9346, 0xE57C, 0x9347, 0xE57D, 0x9348, 0xE57E, 0x9349, 0xE580, 0x934A, 0xE581, 0x934B, 0xE582, 0x934C, + 0xE583, 0x934D, 0xE584, 0x934E, 0xE585, 0x934F, 0xE586, 0x9350, 0xE587, 0x9351, 0xE588, 0x9352, 0xE589, 0x9353, 0xE58A, 0x9354, + 0xE58B, 0x9355, 0xE58C, 0x9356, 0xE58D, 0x9357, 0xE58E, 0x9358, 0xE58F, 0x9359, 0xE590, 0x935A, 0xE591, 0x935B, 0xE592, 0x935C, + 0xE593, 0x935D, 0xE594, 0x935E, 0xE595, 0x935F, 0xE596, 0x9360, 0xE597, 0x9361, 0xE598, 0x9362, 0xE599, 0x9363, 0xE59A, 0x9364, + 0xE59B, 0x9365, 0xE59C, 0x9366, 0xE59D, 0x9367, 0xE59E, 0x9368, 0xE59F, 0x9369, 0xE5A0, 0x936B, 0xE5A1, 0x6FC9, 0xE5A2, 0x6FA7, + 0xE5A3, 0x6FB9, 0xE5A4, 0x6FB6, 0xE5A5, 0x6FC2, 0xE5A6, 0x6FE1, 0xE5A7, 0x6FEE, 0xE5A8, 0x6FDE, 0xE5A9, 0x6FE0, 0xE5AA, 0x6FEF, + 0xE5AB, 0x701A, 0xE5AC, 0x7023, 0xE5AD, 0x701B, 0xE5AE, 0x7039, 0xE5AF, 0x7035, 0xE5B0, 0x704F, 0xE5B1, 0x705E, 0xE5B2, 0x5B80, + 0xE5B3, 0x5B84, 0xE5B4, 0x5B95, 0xE5B5, 0x5B93, 0xE5B6, 0x5BA5, 0xE5B7, 0x5BB8, 0xE5B8, 0x752F, 0xE5B9, 0x9A9E, 0xE5BA, 0x6434, + 0xE5BB, 0x5BE4, 0xE5BC, 0x5BEE, 0xE5BD, 0x8930, 0xE5BE, 0x5BF0, 0xE5BF, 0x8E47, 0xE5C0, 0x8B07, 0xE5C1, 0x8FB6, 0xE5C2, 0x8FD3, + 0xE5C3, 0x8FD5, 0xE5C4, 0x8FE5, 0xE5C5, 0x8FEE, 0xE5C6, 0x8FE4, 0xE5C7, 0x8FE9, 0xE5C8, 0x8FE6, 0xE5C9, 0x8FF3, 0xE5CA, 0x8FE8, + 0xE5CB, 0x9005, 0xE5CC, 0x9004, 0xE5CD, 0x900B, 0xE5CE, 0x9026, 0xE5CF, 0x9011, 0xE5D0, 0x900D, 0xE5D1, 0x9016, 0xE5D2, 0x9021, + 0xE5D3, 0x9035, 0xE5D4, 0x9036, 0xE5D5, 0x902D, 0xE5D6, 0x902F, 0xE5D7, 0x9044, 0xE5D8, 0x9051, 0xE5D9, 0x9052, 0xE5DA, 0x9050, + 0xE5DB, 0x9068, 0xE5DC, 0x9058, 0xE5DD, 0x9062, 0xE5DE, 0x905B, 0xE5DF, 0x66B9, 0xE5E0, 0x9074, 0xE5E1, 0x907D, 0xE5E2, 0x9082, + 0xE5E3, 0x9088, 0xE5E4, 0x9083, 0xE5E5, 0x908B, 0xE5E6, 0x5F50, 0xE5E7, 0x5F57, 0xE5E8, 0x5F56, 0xE5E9, 0x5F58, 0xE5EA, 0x5C3B, + 0xE5EB, 0x54AB, 0xE5EC, 0x5C50, 0xE5ED, 0x5C59, 0xE5EE, 0x5B71, 0xE5EF, 0x5C63, 0xE5F0, 0x5C66, 0xE5F1, 0x7FBC, 0xE5F2, 0x5F2A, + 0xE5F3, 0x5F29, 0xE5F4, 0x5F2D, 0xE5F5, 0x8274, 0xE5F6, 0x5F3C, 0xE5F7, 0x9B3B, 0xE5F8, 0x5C6E, 0xE5F9, 0x5981, 0xE5FA, 0x5983, + 0xE5FB, 0x598D, 0xE5FC, 0x59A9, 0xE5FD, 0x59AA, 0xE5FE, 0x59A3, 0xE640, 0x936C, 0xE641, 0x936D, 0xE642, 0x936E, 0xE643, 0x936F, + 0xE644, 0x9370, 0xE645, 0x9371, 0xE646, 0x9372, 0xE647, 0x9373, 0xE648, 0x9374, 0xE649, 0x9375, 0xE64A, 0x9376, 0xE64B, 0x9377, + 0xE64C, 0x9378, 0xE64D, 0x9379, 0xE64E, 0x937A, 0xE64F, 0x937B, 0xE650, 0x937C, 0xE651, 0x937D, 0xE652, 0x937E, 0xE653, 0x937F, + 0xE654, 0x9380, 0xE655, 0x9381, 0xE656, 0x9382, 0xE657, 0x9383, 0xE658, 0x9384, 0xE659, 0x9385, 0xE65A, 0x9386, 0xE65B, 0x9387, + 0xE65C, 0x9388, 0xE65D, 0x9389, 0xE65E, 0x938A, 0xE65F, 0x938B, 0xE660, 0x938C, 0xE661, 0x938D, 0xE662, 0x938E, 0xE663, 0x9390, + 0xE664, 0x9391, 0xE665, 0x9392, 0xE666, 0x9393, 0xE667, 0x9394, 0xE668, 0x9395, 0xE669, 0x9396, 0xE66A, 0x9397, 0xE66B, 0x9398, + 0xE66C, 0x9399, 0xE66D, 0x939A, 0xE66E, 0x939B, 0xE66F, 0x939C, 0xE670, 0x939D, 0xE671, 0x939E, 0xE672, 0x939F, 0xE673, 0x93A0, + 0xE674, 0x93A1, 0xE675, 0x93A2, 0xE676, 0x93A3, 0xE677, 0x93A4, 0xE678, 0x93A5, 0xE679, 0x93A6, 0xE67A, 0x93A7, 0xE67B, 0x93A8, + 0xE67C, 0x93A9, 0xE67D, 0x93AA, 0xE67E, 0x93AB, 0xE680, 0x93AC, 0xE681, 0x93AD, 0xE682, 0x93AE, 0xE683, 0x93AF, 0xE684, 0x93B0, + 0xE685, 0x93B1, 0xE686, 0x93B2, 0xE687, 0x93B3, 0xE688, 0x93B4, 0xE689, 0x93B5, 0xE68A, 0x93B6, 0xE68B, 0x93B7, 0xE68C, 0x93B8, + 0xE68D, 0x93B9, 0xE68E, 0x93BA, 0xE68F, 0x93BB, 0xE690, 0x93BC, 0xE691, 0x93BD, 0xE692, 0x93BE, 0xE693, 0x93BF, 0xE694, 0x93C0, + 0xE695, 0x93C1, 0xE696, 0x93C2, 0xE697, 0x93C3, 0xE698, 0x93C4, 0xE699, 0x93C5, 0xE69A, 0x93C6, 0xE69B, 0x93C7, 0xE69C, 0x93C8, + 0xE69D, 0x93C9, 0xE69E, 0x93CB, 0xE69F, 0x93CC, 0xE6A0, 0x93CD, 0xE6A1, 0x5997, 0xE6A2, 0x59CA, 0xE6A3, 0x59AB, 0xE6A4, 0x599E, + 0xE6A5, 0x59A4, 0xE6A6, 0x59D2, 0xE6A7, 0x59B2, 0xE6A8, 0x59AF, 0xE6A9, 0x59D7, 0xE6AA, 0x59BE, 0xE6AB, 0x5A05, 0xE6AC, 0x5A06, + 0xE6AD, 0x59DD, 0xE6AE, 0x5A08, 0xE6AF, 0x59E3, 0xE6B0, 0x59D8, 0xE6B1, 0x59F9, 0xE6B2, 0x5A0C, 0xE6B3, 0x5A09, 0xE6B4, 0x5A32, + 0xE6B5, 0x5A34, 0xE6B6, 0x5A11, 0xE6B7, 0x5A23, 0xE6B8, 0x5A13, 0xE6B9, 0x5A40, 0xE6BA, 0x5A67, 0xE6BB, 0x5A4A, 0xE6BC, 0x5A55, + 0xE6BD, 0x5A3C, 0xE6BE, 0x5A62, 0xE6BF, 0x5A75, 0xE6C0, 0x80EC, 0xE6C1, 0x5AAA, 0xE6C2, 0x5A9B, 0xE6C3, 0x5A77, 0xE6C4, 0x5A7A, + 0xE6C5, 0x5ABE, 0xE6C6, 0x5AEB, 0xE6C7, 0x5AB2, 0xE6C8, 0x5AD2, 0xE6C9, 0x5AD4, 0xE6CA, 0x5AB8, 0xE6CB, 0x5AE0, 0xE6CC, 0x5AE3, + 0xE6CD, 0x5AF1, 0xE6CE, 0x5AD6, 0xE6CF, 0x5AE6, 0xE6D0, 0x5AD8, 0xE6D1, 0x5ADC, 0xE6D2, 0x5B09, 0xE6D3, 0x5B17, 0xE6D4, 0x5B16, + 0xE6D5, 0x5B32, 0xE6D6, 0x5B37, 0xE6D7, 0x5B40, 0xE6D8, 0x5C15, 0xE6D9, 0x5C1C, 0xE6DA, 0x5B5A, 0xE6DB, 0x5B65, 0xE6DC, 0x5B73, + 0xE6DD, 0x5B51, 0xE6DE, 0x5B53, 0xE6DF, 0x5B62, 0xE6E0, 0x9A75, 0xE6E1, 0x9A77, 0xE6E2, 0x9A78, 0xE6E3, 0x9A7A, 0xE6E4, 0x9A7F, + 0xE6E5, 0x9A7D, 0xE6E6, 0x9A80, 0xE6E7, 0x9A81, 0xE6E8, 0x9A85, 0xE6E9, 0x9A88, 0xE6EA, 0x9A8A, 0xE6EB, 0x9A90, 0xE6EC, 0x9A92, + 0xE6ED, 0x9A93, 0xE6EE, 0x9A96, 0xE6EF, 0x9A98, 0xE6F0, 0x9A9B, 0xE6F1, 0x9A9C, 0xE6F2, 0x9A9D, 0xE6F3, 0x9A9F, 0xE6F4, 0x9AA0, + 0xE6F5, 0x9AA2, 0xE6F6, 0x9AA3, 0xE6F7, 0x9AA5, 0xE6F8, 0x9AA7, 0xE6F9, 0x7E9F, 0xE6FA, 0x7EA1, 0xE6FB, 0x7EA3, 0xE6FC, 0x7EA5, + 0xE6FD, 0x7EA8, 0xE6FE, 0x7EA9, 0xE740, 0x93CE, 0xE741, 0x93CF, 0xE742, 0x93D0, 0xE743, 0x93D1, 0xE744, 0x93D2, 0xE745, 0x93D3, + 0xE746, 0x93D4, 0xE747, 0x93D5, 0xE748, 0x93D7, 0xE749, 0x93D8, 0xE74A, 0x93D9, 0xE74B, 0x93DA, 0xE74C, 0x93DB, 0xE74D, 0x93DC, + 0xE74E, 0x93DD, 0xE74F, 0x93DE, 0xE750, 0x93DF, 0xE751, 0x93E0, 0xE752, 0x93E1, 0xE753, 0x93E2, 0xE754, 0x93E3, 0xE755, 0x93E4, + 0xE756, 0x93E5, 0xE757, 0x93E6, 0xE758, 0x93E7, 0xE759, 0x93E8, 0xE75A, 0x93E9, 0xE75B, 0x93EA, 0xE75C, 0x93EB, 0xE75D, 0x93EC, + 0xE75E, 0x93ED, 0xE75F, 0x93EE, 0xE760, 0x93EF, 0xE761, 0x93F0, 0xE762, 0x93F1, 0xE763, 0x93F2, 0xE764, 0x93F3, 0xE765, 0x93F4, + 0xE766, 0x93F5, 0xE767, 0x93F6, 0xE768, 0x93F7, 0xE769, 0x93F8, 0xE76A, 0x93F9, 0xE76B, 0x93FA, 0xE76C, 0x93FB, 0xE76D, 0x93FC, + 0xE76E, 0x93FD, 0xE76F, 0x93FE, 0xE770, 0x93FF, 0xE771, 0x9400, 0xE772, 0x9401, 0xE773, 0x9402, 0xE774, 0x9403, 0xE775, 0x9404, + 0xE776, 0x9405, 0xE777, 0x9406, 0xE778, 0x9407, 0xE779, 0x9408, 0xE77A, 0x9409, 0xE77B, 0x940A, 0xE77C, 0x940B, 0xE77D, 0x940C, + 0xE77E, 0x940D, 0xE780, 0x940E, 0xE781, 0x940F, 0xE782, 0x9410, 0xE783, 0x9411, 0xE784, 0x9412, 0xE785, 0x9413, 0xE786, 0x9414, + 0xE787, 0x9415, 0xE788, 0x9416, 0xE789, 0x9417, 0xE78A, 0x9418, 0xE78B, 0x9419, 0xE78C, 0x941A, 0xE78D, 0x941B, 0xE78E, 0x941C, + 0xE78F, 0x941D, 0xE790, 0x941E, 0xE791, 0x941F, 0xE792, 0x9420, 0xE793, 0x9421, 0xE794, 0x9422, 0xE795, 0x9423, 0xE796, 0x9424, + 0xE797, 0x9425, 0xE798, 0x9426, 0xE799, 0x9427, 0xE79A, 0x9428, 0xE79B, 0x9429, 0xE79C, 0x942A, 0xE79D, 0x942B, 0xE79E, 0x942C, + 0xE79F, 0x942D, 0xE7A0, 0x942E, 0xE7A1, 0x7EAD, 0xE7A2, 0x7EB0, 0xE7A3, 0x7EBE, 0xE7A4, 0x7EC0, 0xE7A5, 0x7EC1, 0xE7A6, 0x7EC2, + 0xE7A7, 0x7EC9, 0xE7A8, 0x7ECB, 0xE7A9, 0x7ECC, 0xE7AA, 0x7ED0, 0xE7AB, 0x7ED4, 0xE7AC, 0x7ED7, 0xE7AD, 0x7EDB, 0xE7AE, 0x7EE0, + 0xE7AF, 0x7EE1, 0xE7B0, 0x7EE8, 0xE7B1, 0x7EEB, 0xE7B2, 0x7EEE, 0xE7B3, 0x7EEF, 0xE7B4, 0x7EF1, 0xE7B5, 0x7EF2, 0xE7B6, 0x7F0D, + 0xE7B7, 0x7EF6, 0xE7B8, 0x7EFA, 0xE7B9, 0x7EFB, 0xE7BA, 0x7EFE, 0xE7BB, 0x7F01, 0xE7BC, 0x7F02, 0xE7BD, 0x7F03, 0xE7BE, 0x7F07, + 0xE7BF, 0x7F08, 0xE7C0, 0x7F0B, 0xE7C1, 0x7F0C, 0xE7C2, 0x7F0F, 0xE7C3, 0x7F11, 0xE7C4, 0x7F12, 0xE7C5, 0x7F17, 0xE7C6, 0x7F19, + 0xE7C7, 0x7F1C, 0xE7C8, 0x7F1B, 0xE7C9, 0x7F1F, 0xE7CA, 0x7F21, 0xE7CB, 0x7F22, 0xE7CC, 0x7F23, 0xE7CD, 0x7F24, 0xE7CE, 0x7F25, + 0xE7CF, 0x7F26, 0xE7D0, 0x7F27, 0xE7D1, 0x7F2A, 0xE7D2, 0x7F2B, 0xE7D3, 0x7F2C, 0xE7D4, 0x7F2D, 0xE7D5, 0x7F2F, 0xE7D6, 0x7F30, + 0xE7D7, 0x7F31, 0xE7D8, 0x7F32, 0xE7D9, 0x7F33, 0xE7DA, 0x7F35, 0xE7DB, 0x5E7A, 0xE7DC, 0x757F, 0xE7DD, 0x5DDB, 0xE7DE, 0x753E, + 0xE7DF, 0x9095, 0xE7E0, 0x738E, 0xE7E1, 0x7391, 0xE7E2, 0x73AE, 0xE7E3, 0x73A2, 0xE7E4, 0x739F, 0xE7E5, 0x73CF, 0xE7E6, 0x73C2, + 0xE7E7, 0x73D1, 0xE7E8, 0x73B7, 0xE7E9, 0x73B3, 0xE7EA, 0x73C0, 0xE7EB, 0x73C9, 0xE7EC, 0x73C8, 0xE7ED, 0x73E5, 0xE7EE, 0x73D9, + 0xE7EF, 0x987C, 0xE7F0, 0x740A, 0xE7F1, 0x73E9, 0xE7F2, 0x73E7, 0xE7F3, 0x73DE, 0xE7F4, 0x73BA, 0xE7F5, 0x73F2, 0xE7F6, 0x740F, + 0xE7F7, 0x742A, 0xE7F8, 0x745B, 0xE7F9, 0x7426, 0xE7FA, 0x7425, 0xE7FB, 0x7428, 0xE7FC, 0x7430, 0xE7FD, 0x742E, 0xE7FE, 0x742C, + 0xE840, 0x942F, 0xE841, 0x9430, 0xE842, 0x9431, 0xE843, 0x9432, 0xE844, 0x9433, 0xE845, 0x9434, 0xE846, 0x9435, 0xE847, 0x9436, + 0xE848, 0x9437, 0xE849, 0x9438, 0xE84A, 0x9439, 0xE84B, 0x943A, 0xE84C, 0x943B, 0xE84D, 0x943C, 0xE84E, 0x943D, 0xE84F, 0x943F, + 0xE850, 0x9440, 0xE851, 0x9441, 0xE852, 0x9442, 0xE853, 0x9443, 0xE854, 0x9444, 0xE855, 0x9445, 0xE856, 0x9446, 0xE857, 0x9447, + 0xE858, 0x9448, 0xE859, 0x9449, 0xE85A, 0x944A, 0xE85B, 0x944B, 0xE85C, 0x944C, 0xE85D, 0x944D, 0xE85E, 0x944E, 0xE85F, 0x944F, + 0xE860, 0x9450, 0xE861, 0x9451, 0xE862, 0x9452, 0xE863, 0x9453, 0xE864, 0x9454, 0xE865, 0x9455, 0xE866, 0x9456, 0xE867, 0x9457, + 0xE868, 0x9458, 0xE869, 0x9459, 0xE86A, 0x945A, 0xE86B, 0x945B, 0xE86C, 0x945C, 0xE86D, 0x945D, 0xE86E, 0x945E, 0xE86F, 0x945F, + 0xE870, 0x9460, 0xE871, 0x9461, 0xE872, 0x9462, 0xE873, 0x9463, 0xE874, 0x9464, 0xE875, 0x9465, 0xE876, 0x9466, 0xE877, 0x9467, + 0xE878, 0x9468, 0xE879, 0x9469, 0xE87A, 0x946A, 0xE87B, 0x946C, 0xE87C, 0x946D, 0xE87D, 0x946E, 0xE87E, 0x946F, 0xE880, 0x9470, + 0xE881, 0x9471, 0xE882, 0x9472, 0xE883, 0x9473, 0xE884, 0x9474, 0xE885, 0x9475, 0xE886, 0x9476, 0xE887, 0x9477, 0xE888, 0x9478, + 0xE889, 0x9479, 0xE88A, 0x947A, 0xE88B, 0x947B, 0xE88C, 0x947C, 0xE88D, 0x947D, 0xE88E, 0x947E, 0xE88F, 0x947F, 0xE890, 0x9480, + 0xE891, 0x9481, 0xE892, 0x9482, 0xE893, 0x9483, 0xE894, 0x9484, 0xE895, 0x9491, 0xE896, 0x9496, 0xE897, 0x9498, 0xE898, 0x94C7, + 0xE899, 0x94CF, 0xE89A, 0x94D3, 0xE89B, 0x94D4, 0xE89C, 0x94DA, 0xE89D, 0x94E6, 0xE89E, 0x94FB, 0xE89F, 0x951C, 0xE8A0, 0x9520, + 0xE8A1, 0x741B, 0xE8A2, 0x741A, 0xE8A3, 0x7441, 0xE8A4, 0x745C, 0xE8A5, 0x7457, 0xE8A6, 0x7455, 0xE8A7, 0x7459, 0xE8A8, 0x7477, + 0xE8A9, 0x746D, 0xE8AA, 0x747E, 0xE8AB, 0x749C, 0xE8AC, 0x748E, 0xE8AD, 0x7480, 0xE8AE, 0x7481, 0xE8AF, 0x7487, 0xE8B0, 0x748B, + 0xE8B1, 0x749E, 0xE8B2, 0x74A8, 0xE8B3, 0x74A9, 0xE8B4, 0x7490, 0xE8B5, 0x74A7, 0xE8B6, 0x74D2, 0xE8B7, 0x74BA, 0xE8B8, 0x97EA, + 0xE8B9, 0x97EB, 0xE8BA, 0x97EC, 0xE8BB, 0x674C, 0xE8BC, 0x6753, 0xE8BD, 0x675E, 0xE8BE, 0x6748, 0xE8BF, 0x6769, 0xE8C0, 0x67A5, + 0xE8C1, 0x6787, 0xE8C2, 0x676A, 0xE8C3, 0x6773, 0xE8C4, 0x6798, 0xE8C5, 0x67A7, 0xE8C6, 0x6775, 0xE8C7, 0x67A8, 0xE8C8, 0x679E, + 0xE8C9, 0x67AD, 0xE8CA, 0x678B, 0xE8CB, 0x6777, 0xE8CC, 0x677C, 0xE8CD, 0x67F0, 0xE8CE, 0x6809, 0xE8CF, 0x67D8, 0xE8D0, 0x680A, + 0xE8D1, 0x67E9, 0xE8D2, 0x67B0, 0xE8D3, 0x680C, 0xE8D4, 0x67D9, 0xE8D5, 0x67B5, 0xE8D6, 0x67DA, 0xE8D7, 0x67B3, 0xE8D8, 0x67DD, + 0xE8D9, 0x6800, 0xE8DA, 0x67C3, 0xE8DB, 0x67B8, 0xE8DC, 0x67E2, 0xE8DD, 0x680E, 0xE8DE, 0x67C1, 0xE8DF, 0x67FD, 0xE8E0, 0x6832, + 0xE8E1, 0x6833, 0xE8E2, 0x6860, 0xE8E3, 0x6861, 0xE8E4, 0x684E, 0xE8E5, 0x6862, 0xE8E6, 0x6844, 0xE8E7, 0x6864, 0xE8E8, 0x6883, + 0xE8E9, 0x681D, 0xE8EA, 0x6855, 0xE8EB, 0x6866, 0xE8EC, 0x6841, 0xE8ED, 0x6867, 0xE8EE, 0x6840, 0xE8EF, 0x683E, 0xE8F0, 0x684A, + 0xE8F1, 0x6849, 0xE8F2, 0x6829, 0xE8F3, 0x68B5, 0xE8F4, 0x688F, 0xE8F5, 0x6874, 0xE8F6, 0x6877, 0xE8F7, 0x6893, 0xE8F8, 0x686B, + 0xE8F9, 0x68C2, 0xE8FA, 0x696E, 0xE8FB, 0x68FC, 0xE8FC, 0x691F, 0xE8FD, 0x6920, 0xE8FE, 0x68F9, 0xE940, 0x9527, 0xE941, 0x9533, + 0xE942, 0x953D, 0xE943, 0x9543, 0xE944, 0x9548, 0xE945, 0x954B, 0xE946, 0x9555, 0xE947, 0x955A, 0xE948, 0x9560, 0xE949, 0x956E, + 0xE94A, 0x9574, 0xE94B, 0x9575, 0xE94C, 0x9577, 0xE94D, 0x9578, 0xE94E, 0x9579, 0xE94F, 0x957A, 0xE950, 0x957B, 0xE951, 0x957C, + 0xE952, 0x957D, 0xE953, 0x957E, 0xE954, 0x9580, 0xE955, 0x9581, 0xE956, 0x9582, 0xE957, 0x9583, 0xE958, 0x9584, 0xE959, 0x9585, + 0xE95A, 0x9586, 0xE95B, 0x9587, 0xE95C, 0x9588, 0xE95D, 0x9589, 0xE95E, 0x958A, 0xE95F, 0x958B, 0xE960, 0x958C, 0xE961, 0x958D, + 0xE962, 0x958E, 0xE963, 0x958F, 0xE964, 0x9590, 0xE965, 0x9591, 0xE966, 0x9592, 0xE967, 0x9593, 0xE968, 0x9594, 0xE969, 0x9595, + 0xE96A, 0x9596, 0xE96B, 0x9597, 0xE96C, 0x9598, 0xE96D, 0x9599, 0xE96E, 0x959A, 0xE96F, 0x959B, 0xE970, 0x959C, 0xE971, 0x959D, + 0xE972, 0x959E, 0xE973, 0x959F, 0xE974, 0x95A0, 0xE975, 0x95A1, 0xE976, 0x95A2, 0xE977, 0x95A3, 0xE978, 0x95A4, 0xE979, 0x95A5, + 0xE97A, 0x95A6, 0xE97B, 0x95A7, 0xE97C, 0x95A8, 0xE97D, 0x95A9, 0xE97E, 0x95AA, 0xE980, 0x95AB, 0xE981, 0x95AC, 0xE982, 0x95AD, + 0xE983, 0x95AE, 0xE984, 0x95AF, 0xE985, 0x95B0, 0xE986, 0x95B1, 0xE987, 0x95B2, 0xE988, 0x95B3, 0xE989, 0x95B4, 0xE98A, 0x95B5, + 0xE98B, 0x95B6, 0xE98C, 0x95B7, 0xE98D, 0x95B8, 0xE98E, 0x95B9, 0xE98F, 0x95BA, 0xE990, 0x95BB, 0xE991, 0x95BC, 0xE992, 0x95BD, + 0xE993, 0x95BE, 0xE994, 0x95BF, 0xE995, 0x95C0, 0xE996, 0x95C1, 0xE997, 0x95C2, 0xE998, 0x95C3, 0xE999, 0x95C4, 0xE99A, 0x95C5, + 0xE99B, 0x95C6, 0xE99C, 0x95C7, 0xE99D, 0x95C8, 0xE99E, 0x95C9, 0xE99F, 0x95CA, 0xE9A0, 0x95CB, 0xE9A1, 0x6924, 0xE9A2, 0x68F0, + 0xE9A3, 0x690B, 0xE9A4, 0x6901, 0xE9A5, 0x6957, 0xE9A6, 0x68E3, 0xE9A7, 0x6910, 0xE9A8, 0x6971, 0xE9A9, 0x6939, 0xE9AA, 0x6960, + 0xE9AB, 0x6942, 0xE9AC, 0x695D, 0xE9AD, 0x6984, 0xE9AE, 0x696B, 0xE9AF, 0x6980, 0xE9B0, 0x6998, 0xE9B1, 0x6978, 0xE9B2, 0x6934, + 0xE9B3, 0x69CC, 0xE9B4, 0x6987, 0xE9B5, 0x6988, 0xE9B6, 0x69CE, 0xE9B7, 0x6989, 0xE9B8, 0x6966, 0xE9B9, 0x6963, 0xE9BA, 0x6979, + 0xE9BB, 0x699B, 0xE9BC, 0x69A7, 0xE9BD, 0x69BB, 0xE9BE, 0x69AB, 0xE9BF, 0x69AD, 0xE9C0, 0x69D4, 0xE9C1, 0x69B1, 0xE9C2, 0x69C1, + 0xE9C3, 0x69CA, 0xE9C4, 0x69DF, 0xE9C5, 0x6995, 0xE9C6, 0x69E0, 0xE9C7, 0x698D, 0xE9C8, 0x69FF, 0xE9C9, 0x6A2F, 0xE9CA, 0x69ED, + 0xE9CB, 0x6A17, 0xE9CC, 0x6A18, 0xE9CD, 0x6A65, 0xE9CE, 0x69F2, 0xE9CF, 0x6A44, 0xE9D0, 0x6A3E, 0xE9D1, 0x6AA0, 0xE9D2, 0x6A50, + 0xE9D3, 0x6A5B, 0xE9D4, 0x6A35, 0xE9D5, 0x6A8E, 0xE9D6, 0x6A79, 0xE9D7, 0x6A3D, 0xE9D8, 0x6A28, 0xE9D9, 0x6A58, 0xE9DA, 0x6A7C, + 0xE9DB, 0x6A91, 0xE9DC, 0x6A90, 0xE9DD, 0x6AA9, 0xE9DE, 0x6A97, 0xE9DF, 0x6AAB, 0xE9E0, 0x7337, 0xE9E1, 0x7352, 0xE9E2, 0x6B81, + 0xE9E3, 0x6B82, 0xE9E4, 0x6B87, 0xE9E5, 0x6B84, 0xE9E6, 0x6B92, 0xE9E7, 0x6B93, 0xE9E8, 0x6B8D, 0xE9E9, 0x6B9A, 0xE9EA, 0x6B9B, + 0xE9EB, 0x6BA1, 0xE9EC, 0x6BAA, 0xE9ED, 0x8F6B, 0xE9EE, 0x8F6D, 0xE9EF, 0x8F71, 0xE9F0, 0x8F72, 0xE9F1, 0x8F73, 0xE9F2, 0x8F75, + 0xE9F3, 0x8F76, 0xE9F4, 0x8F78, 0xE9F5, 0x8F77, 0xE9F6, 0x8F79, 0xE9F7, 0x8F7A, 0xE9F8, 0x8F7C, 0xE9F9, 0x8F7E, 0xE9FA, 0x8F81, + 0xE9FB, 0x8F82, 0xE9FC, 0x8F84, 0xE9FD, 0x8F87, 0xE9FE, 0x8F8B, 0xEA40, 0x95CC, 0xEA41, 0x95CD, 0xEA42, 0x95CE, 0xEA43, 0x95CF, + 0xEA44, 0x95D0, 0xEA45, 0x95D1, 0xEA46, 0x95D2, 0xEA47, 0x95D3, 0xEA48, 0x95D4, 0xEA49, 0x95D5, 0xEA4A, 0x95D6, 0xEA4B, 0x95D7, + 0xEA4C, 0x95D8, 0xEA4D, 0x95D9, 0xEA4E, 0x95DA, 0xEA4F, 0x95DB, 0xEA50, 0x95DC, 0xEA51, 0x95DD, 0xEA52, 0x95DE, 0xEA53, 0x95DF, + 0xEA54, 0x95E0, 0xEA55, 0x95E1, 0xEA56, 0x95E2, 0xEA57, 0x95E3, 0xEA58, 0x95E4, 0xEA59, 0x95E5, 0xEA5A, 0x95E6, 0xEA5B, 0x95E7, + 0xEA5C, 0x95EC, 0xEA5D, 0x95FF, 0xEA5E, 0x9607, 0xEA5F, 0x9613, 0xEA60, 0x9618, 0xEA61, 0x961B, 0xEA62, 0x961E, 0xEA63, 0x9620, + 0xEA64, 0x9623, 0xEA65, 0x9624, 0xEA66, 0x9625, 0xEA67, 0x9626, 0xEA68, 0x9627, 0xEA69, 0x9628, 0xEA6A, 0x9629, 0xEA6B, 0x962B, + 0xEA6C, 0x962C, 0xEA6D, 0x962D, 0xEA6E, 0x962F, 0xEA6F, 0x9630, 0xEA70, 0x9637, 0xEA71, 0x9638, 0xEA72, 0x9639, 0xEA73, 0x963A, + 0xEA74, 0x963E, 0xEA75, 0x9641, 0xEA76, 0x9643, 0xEA77, 0x964A, 0xEA78, 0x964E, 0xEA79, 0x964F, 0xEA7A, 0x9651, 0xEA7B, 0x9652, + 0xEA7C, 0x9653, 0xEA7D, 0x9656, 0xEA7E, 0x9657, 0xEA80, 0x9658, 0xEA81, 0x9659, 0xEA82, 0x965A, 0xEA83, 0x965C, 0xEA84, 0x965D, + 0xEA85, 0x965E, 0xEA86, 0x9660, 0xEA87, 0x9663, 0xEA88, 0x9665, 0xEA89, 0x9666, 0xEA8A, 0x966B, 0xEA8B, 0x966D, 0xEA8C, 0x966E, + 0xEA8D, 0x966F, 0xEA8E, 0x9670, 0xEA8F, 0x9671, 0xEA90, 0x9673, 0xEA91, 0x9678, 0xEA92, 0x9679, 0xEA93, 0x967A, 0xEA94, 0x967B, + 0xEA95, 0x967C, 0xEA96, 0x967D, 0xEA97, 0x967E, 0xEA98, 0x967F, 0xEA99, 0x9680, 0xEA9A, 0x9681, 0xEA9B, 0x9682, 0xEA9C, 0x9683, + 0xEA9D, 0x9684, 0xEA9E, 0x9687, 0xEA9F, 0x9689, 0xEAA0, 0x968A, 0xEAA1, 0x8F8D, 0xEAA2, 0x8F8E, 0xEAA3, 0x8F8F, 0xEAA4, 0x8F98, + 0xEAA5, 0x8F9A, 0xEAA6, 0x8ECE, 0xEAA7, 0x620B, 0xEAA8, 0x6217, 0xEAA9, 0x621B, 0xEAAA, 0x621F, 0xEAAB, 0x6222, 0xEAAC, 0x6221, + 0xEAAD, 0x6225, 0xEAAE, 0x6224, 0xEAAF, 0x622C, 0xEAB0, 0x81E7, 0xEAB1, 0x74EF, 0xEAB2, 0x74F4, 0xEAB3, 0x74FF, 0xEAB4, 0x750F, + 0xEAB5, 0x7511, 0xEAB6, 0x7513, 0xEAB7, 0x6534, 0xEAB8, 0x65EE, 0xEAB9, 0x65EF, 0xEABA, 0x65F0, 0xEABB, 0x660A, 0xEABC, 0x6619, + 0xEABD, 0x6772, 0xEABE, 0x6603, 0xEABF, 0x6615, 0xEAC0, 0x6600, 0xEAC1, 0x7085, 0xEAC2, 0x66F7, 0xEAC3, 0x661D, 0xEAC4, 0x6634, + 0xEAC5, 0x6631, 0xEAC6, 0x6636, 0xEAC7, 0x6635, 0xEAC8, 0x8006, 0xEAC9, 0x665F, 0xEACA, 0x6654, 0xEACB, 0x6641, 0xEACC, 0x664F, + 0xEACD, 0x6656, 0xEACE, 0x6661, 0xEACF, 0x6657, 0xEAD0, 0x6677, 0xEAD1, 0x6684, 0xEAD2, 0x668C, 0xEAD3, 0x66A7, 0xEAD4, 0x669D, + 0xEAD5, 0x66BE, 0xEAD6, 0x66DB, 0xEAD7, 0x66DC, 0xEAD8, 0x66E6, 0xEAD9, 0x66E9, 0xEADA, 0x8D32, 0xEADB, 0x8D33, 0xEADC, 0x8D36, + 0xEADD, 0x8D3B, 0xEADE, 0x8D3D, 0xEADF, 0x8D40, 0xEAE0, 0x8D45, 0xEAE1, 0x8D46, 0xEAE2, 0x8D48, 0xEAE3, 0x8D49, 0xEAE4, 0x8D47, + 0xEAE5, 0x8D4D, 0xEAE6, 0x8D55, 0xEAE7, 0x8D59, 0xEAE8, 0x89C7, 0xEAE9, 0x89CA, 0xEAEA, 0x89CB, 0xEAEB, 0x89CC, 0xEAEC, 0x89CE, + 0xEAED, 0x89CF, 0xEAEE, 0x89D0, 0xEAEF, 0x89D1, 0xEAF0, 0x726E, 0xEAF1, 0x729F, 0xEAF2, 0x725D, 0xEAF3, 0x7266, 0xEAF4, 0x726F, + 0xEAF5, 0x727E, 0xEAF6, 0x727F, 0xEAF7, 0x7284, 0xEAF8, 0x728B, 0xEAF9, 0x728D, 0xEAFA, 0x728F, 0xEAFB, 0x7292, 0xEAFC, 0x6308, + 0xEAFD, 0x6332, 0xEAFE, 0x63B0, 0xEB40, 0x968C, 0xEB41, 0x968E, 0xEB42, 0x9691, 0xEB43, 0x9692, 0xEB44, 0x9693, 0xEB45, 0x9695, + 0xEB46, 0x9696, 0xEB47, 0x969A, 0xEB48, 0x969B, 0xEB49, 0x969D, 0xEB4A, 0x969E, 0xEB4B, 0x969F, 0xEB4C, 0x96A0, 0xEB4D, 0x96A1, + 0xEB4E, 0x96A2, 0xEB4F, 0x96A3, 0xEB50, 0x96A4, 0xEB51, 0x96A5, 0xEB52, 0x96A6, 0xEB53, 0x96A8, 0xEB54, 0x96A9, 0xEB55, 0x96AA, + 0xEB56, 0x96AB, 0xEB57, 0x96AC, 0xEB58, 0x96AD, 0xEB59, 0x96AE, 0xEB5A, 0x96AF, 0xEB5B, 0x96B1, 0xEB5C, 0x96B2, 0xEB5D, 0x96B4, + 0xEB5E, 0x96B5, 0xEB5F, 0x96B7, 0xEB60, 0x96B8, 0xEB61, 0x96BA, 0xEB62, 0x96BB, 0xEB63, 0x96BF, 0xEB64, 0x96C2, 0xEB65, 0x96C3, + 0xEB66, 0x96C8, 0xEB67, 0x96CA, 0xEB68, 0x96CB, 0xEB69, 0x96D0, 0xEB6A, 0x96D1, 0xEB6B, 0x96D3, 0xEB6C, 0x96D4, 0xEB6D, 0x96D6, + 0xEB6E, 0x96D7, 0xEB6F, 0x96D8, 0xEB70, 0x96D9, 0xEB71, 0x96DA, 0xEB72, 0x96DB, 0xEB73, 0x96DC, 0xEB74, 0x96DD, 0xEB75, 0x96DE, + 0xEB76, 0x96DF, 0xEB77, 0x96E1, 0xEB78, 0x96E2, 0xEB79, 0x96E3, 0xEB7A, 0x96E4, 0xEB7B, 0x96E5, 0xEB7C, 0x96E6, 0xEB7D, 0x96E7, + 0xEB7E, 0x96EB, 0xEB80, 0x96EC, 0xEB81, 0x96ED, 0xEB82, 0x96EE, 0xEB83, 0x96F0, 0xEB84, 0x96F1, 0xEB85, 0x96F2, 0xEB86, 0x96F4, + 0xEB87, 0x96F5, 0xEB88, 0x96F8, 0xEB89, 0x96FA, 0xEB8A, 0x96FB, 0xEB8B, 0x96FC, 0xEB8C, 0x96FD, 0xEB8D, 0x96FF, 0xEB8E, 0x9702, + 0xEB8F, 0x9703, 0xEB90, 0x9705, 0xEB91, 0x970A, 0xEB92, 0x970B, 0xEB93, 0x970C, 0xEB94, 0x9710, 0xEB95, 0x9711, 0xEB96, 0x9712, + 0xEB97, 0x9714, 0xEB98, 0x9715, 0xEB99, 0x9717, 0xEB9A, 0x9718, 0xEB9B, 0x9719, 0xEB9C, 0x971A, 0xEB9D, 0x971B, 0xEB9E, 0x971D, + 0xEB9F, 0x971F, 0xEBA0, 0x9720, 0xEBA1, 0x643F, 0xEBA2, 0x64D8, 0xEBA3, 0x8004, 0xEBA4, 0x6BEA, 0xEBA5, 0x6BF3, 0xEBA6, 0x6BFD, + 0xEBA7, 0x6BF5, 0xEBA8, 0x6BF9, 0xEBA9, 0x6C05, 0xEBAA, 0x6C07, 0xEBAB, 0x6C06, 0xEBAC, 0x6C0D, 0xEBAD, 0x6C15, 0xEBAE, 0x6C18, + 0xEBAF, 0x6C19, 0xEBB0, 0x6C1A, 0xEBB1, 0x6C21, 0xEBB2, 0x6C29, 0xEBB3, 0x6C24, 0xEBB4, 0x6C2A, 0xEBB5, 0x6C32, 0xEBB6, 0x6535, + 0xEBB7, 0x6555, 0xEBB8, 0x656B, 0xEBB9, 0x724D, 0xEBBA, 0x7252, 0xEBBB, 0x7256, 0xEBBC, 0x7230, 0xEBBD, 0x8662, 0xEBBE, 0x5216, + 0xEBBF, 0x809F, 0xEBC0, 0x809C, 0xEBC1, 0x8093, 0xEBC2, 0x80BC, 0xEBC3, 0x670A, 0xEBC4, 0x80BD, 0xEBC5, 0x80B1, 0xEBC6, 0x80AB, + 0xEBC7, 0x80AD, 0xEBC8, 0x80B4, 0xEBC9, 0x80B7, 0xEBCA, 0x80E7, 0xEBCB, 0x80E8, 0xEBCC, 0x80E9, 0xEBCD, 0x80EA, 0xEBCE, 0x80DB, + 0xEBCF, 0x80C2, 0xEBD0, 0x80C4, 0xEBD1, 0x80D9, 0xEBD2, 0x80CD, 0xEBD3, 0x80D7, 0xEBD4, 0x6710, 0xEBD5, 0x80DD, 0xEBD6, 0x80EB, + 0xEBD7, 0x80F1, 0xEBD8, 0x80F4, 0xEBD9, 0x80ED, 0xEBDA, 0x810D, 0xEBDB, 0x810E, 0xEBDC, 0x80F2, 0xEBDD, 0x80FC, 0xEBDE, 0x6715, + 0xEBDF, 0x8112, 0xEBE0, 0x8C5A, 0xEBE1, 0x8136, 0xEBE2, 0x811E, 0xEBE3, 0x812C, 0xEBE4, 0x8118, 0xEBE5, 0x8132, 0xEBE6, 0x8148, + 0xEBE7, 0x814C, 0xEBE8, 0x8153, 0xEBE9, 0x8174, 0xEBEA, 0x8159, 0xEBEB, 0x815A, 0xEBEC, 0x8171, 0xEBED, 0x8160, 0xEBEE, 0x8169, + 0xEBEF, 0x817C, 0xEBF0, 0x817D, 0xEBF1, 0x816D, 0xEBF2, 0x8167, 0xEBF3, 0x584D, 0xEBF4, 0x5AB5, 0xEBF5, 0x8188, 0xEBF6, 0x8182, + 0xEBF7, 0x8191, 0xEBF8, 0x6ED5, 0xEBF9, 0x81A3, 0xEBFA, 0x81AA, 0xEBFB, 0x81CC, 0xEBFC, 0x6726, 0xEBFD, 0x81CA, 0xEBFE, 0x81BB, + 0xEC40, 0x9721, 0xEC41, 0x9722, 0xEC42, 0x9723, 0xEC43, 0x9724, 0xEC44, 0x9725, 0xEC45, 0x9726, 0xEC46, 0x9727, 0xEC47, 0x9728, + 0xEC48, 0x9729, 0xEC49, 0x972B, 0xEC4A, 0x972C, 0xEC4B, 0x972E, 0xEC4C, 0x972F, 0xEC4D, 0x9731, 0xEC4E, 0x9733, 0xEC4F, 0x9734, + 0xEC50, 0x9735, 0xEC51, 0x9736, 0xEC52, 0x9737, 0xEC53, 0x973A, 0xEC54, 0x973B, 0xEC55, 0x973C, 0xEC56, 0x973D, 0xEC57, 0x973F, + 0xEC58, 0x9740, 0xEC59, 0x9741, 0xEC5A, 0x9742, 0xEC5B, 0x9743, 0xEC5C, 0x9744, 0xEC5D, 0x9745, 0xEC5E, 0x9746, 0xEC5F, 0x9747, + 0xEC60, 0x9748, 0xEC61, 0x9749, 0xEC62, 0x974A, 0xEC63, 0x974B, 0xEC64, 0x974C, 0xEC65, 0x974D, 0xEC66, 0x974E, 0xEC67, 0x974F, + 0xEC68, 0x9750, 0xEC69, 0x9751, 0xEC6A, 0x9754, 0xEC6B, 0x9755, 0xEC6C, 0x9757, 0xEC6D, 0x9758, 0xEC6E, 0x975A, 0xEC6F, 0x975C, + 0xEC70, 0x975D, 0xEC71, 0x975F, 0xEC72, 0x9763, 0xEC73, 0x9764, 0xEC74, 0x9766, 0xEC75, 0x9767, 0xEC76, 0x9768, 0xEC77, 0x976A, + 0xEC78, 0x976B, 0xEC79, 0x976C, 0xEC7A, 0x976D, 0xEC7B, 0x976E, 0xEC7C, 0x976F, 0xEC7D, 0x9770, 0xEC7E, 0x9771, 0xEC80, 0x9772, + 0xEC81, 0x9775, 0xEC82, 0x9777, 0xEC83, 0x9778, 0xEC84, 0x9779, 0xEC85, 0x977A, 0xEC86, 0x977B, 0xEC87, 0x977D, 0xEC88, 0x977E, + 0xEC89, 0x977F, 0xEC8A, 0x9780, 0xEC8B, 0x9781, 0xEC8C, 0x9782, 0xEC8D, 0x9783, 0xEC8E, 0x9784, 0xEC8F, 0x9786, 0xEC90, 0x9787, + 0xEC91, 0x9788, 0xEC92, 0x9789, 0xEC93, 0x978A, 0xEC94, 0x978C, 0xEC95, 0x978E, 0xEC96, 0x978F, 0xEC97, 0x9790, 0xEC98, 0x9793, + 0xEC99, 0x9795, 0xEC9A, 0x9796, 0xEC9B, 0x9797, 0xEC9C, 0x9799, 0xEC9D, 0x979A, 0xEC9E, 0x979B, 0xEC9F, 0x979C, 0xECA0, 0x979D, + 0xECA1, 0x81C1, 0xECA2, 0x81A6, 0xECA3, 0x6B24, 0xECA4, 0x6B37, 0xECA5, 0x6B39, 0xECA6, 0x6B43, 0xECA7, 0x6B46, 0xECA8, 0x6B59, + 0xECA9, 0x98D1, 0xECAA, 0x98D2, 0xECAB, 0x98D3, 0xECAC, 0x98D5, 0xECAD, 0x98D9, 0xECAE, 0x98DA, 0xECAF, 0x6BB3, 0xECB0, 0x5F40, + 0xECB1, 0x6BC2, 0xECB2, 0x89F3, 0xECB3, 0x6590, 0xECB4, 0x9F51, 0xECB5, 0x6593, 0xECB6, 0x65BC, 0xECB7, 0x65C6, 0xECB8, 0x65C4, + 0xECB9, 0x65C3, 0xECBA, 0x65CC, 0xECBB, 0x65CE, 0xECBC, 0x65D2, 0xECBD, 0x65D6, 0xECBE, 0x7080, 0xECBF, 0x709C, 0xECC0, 0x7096, + 0xECC1, 0x709D, 0xECC2, 0x70BB, 0xECC3, 0x70C0, 0xECC4, 0x70B7, 0xECC5, 0x70AB, 0xECC6, 0x70B1, 0xECC7, 0x70E8, 0xECC8, 0x70CA, + 0xECC9, 0x7110, 0xECCA, 0x7113, 0xECCB, 0x7116, 0xECCC, 0x712F, 0xECCD, 0x7131, 0xECCE, 0x7173, 0xECCF, 0x715C, 0xECD0, 0x7168, + 0xECD1, 0x7145, 0xECD2, 0x7172, 0xECD3, 0x714A, 0xECD4, 0x7178, 0xECD5, 0x717A, 0xECD6, 0x7198, 0xECD7, 0x71B3, 0xECD8, 0x71B5, + 0xECD9, 0x71A8, 0xECDA, 0x71A0, 0xECDB, 0x71E0, 0xECDC, 0x71D4, 0xECDD, 0x71E7, 0xECDE, 0x71F9, 0xECDF, 0x721D, 0xECE0, 0x7228, + 0xECE1, 0x706C, 0xECE2, 0x7118, 0xECE3, 0x7166, 0xECE4, 0x71B9, 0xECE5, 0x623E, 0xECE6, 0x623D, 0xECE7, 0x6243, 0xECE8, 0x6248, + 0xECE9, 0x6249, 0xECEA, 0x793B, 0xECEB, 0x7940, 0xECEC, 0x7946, 0xECED, 0x7949, 0xECEE, 0x795B, 0xECEF, 0x795C, 0xECF0, 0x7953, + 0xECF1, 0x795A, 0xECF2, 0x7962, 0xECF3, 0x7957, 0xECF4, 0x7960, 0xECF5, 0x796F, 0xECF6, 0x7967, 0xECF7, 0x797A, 0xECF8, 0x7985, + 0xECF9, 0x798A, 0xECFA, 0x799A, 0xECFB, 0x79A7, 0xECFC, 0x79B3, 0xECFD, 0x5FD1, 0xECFE, 0x5FD0, 0xED40, 0x979E, 0xED41, 0x979F, + 0xED42, 0x97A1, 0xED43, 0x97A2, 0xED44, 0x97A4, 0xED45, 0x97A5, 0xED46, 0x97A6, 0xED47, 0x97A7, 0xED48, 0x97A8, 0xED49, 0x97A9, + 0xED4A, 0x97AA, 0xED4B, 0x97AC, 0xED4C, 0x97AE, 0xED4D, 0x97B0, 0xED4E, 0x97B1, 0xED4F, 0x97B3, 0xED50, 0x97B5, 0xED51, 0x97B6, + 0xED52, 0x97B7, 0xED53, 0x97B8, 0xED54, 0x97B9, 0xED55, 0x97BA, 0xED56, 0x97BB, 0xED57, 0x97BC, 0xED58, 0x97BD, 0xED59, 0x97BE, + 0xED5A, 0x97BF, 0xED5B, 0x97C0, 0xED5C, 0x97C1, 0xED5D, 0x97C2, 0xED5E, 0x97C3, 0xED5F, 0x97C4, 0xED60, 0x97C5, 0xED61, 0x97C6, + 0xED62, 0x97C7, 0xED63, 0x97C8, 0xED64, 0x97C9, 0xED65, 0x97CA, 0xED66, 0x97CB, 0xED67, 0x97CC, 0xED68, 0x97CD, 0xED69, 0x97CE, + 0xED6A, 0x97CF, 0xED6B, 0x97D0, 0xED6C, 0x97D1, 0xED6D, 0x97D2, 0xED6E, 0x97D3, 0xED6F, 0x97D4, 0xED70, 0x97D5, 0xED71, 0x97D6, + 0xED72, 0x97D7, 0xED73, 0x97D8, 0xED74, 0x97D9, 0xED75, 0x97DA, 0xED76, 0x97DB, 0xED77, 0x97DC, 0xED78, 0x97DD, 0xED79, 0x97DE, + 0xED7A, 0x97DF, 0xED7B, 0x97E0, 0xED7C, 0x97E1, 0xED7D, 0x97E2, 0xED7E, 0x97E3, 0xED80, 0x97E4, 0xED81, 0x97E5, 0xED82, 0x97E8, + 0xED83, 0x97EE, 0xED84, 0x97EF, 0xED85, 0x97F0, 0xED86, 0x97F1, 0xED87, 0x97F2, 0xED88, 0x97F4, 0xED89, 0x97F7, 0xED8A, 0x97F8, + 0xED8B, 0x97F9, 0xED8C, 0x97FA, 0xED8D, 0x97FB, 0xED8E, 0x97FC, 0xED8F, 0x97FD, 0xED90, 0x97FE, 0xED91, 0x97FF, 0xED92, 0x9800, + 0xED93, 0x9801, 0xED94, 0x9802, 0xED95, 0x9803, 0xED96, 0x9804, 0xED97, 0x9805, 0xED98, 0x9806, 0xED99, 0x9807, 0xED9A, 0x9808, + 0xED9B, 0x9809, 0xED9C, 0x980A, 0xED9D, 0x980B, 0xED9E, 0x980C, 0xED9F, 0x980D, 0xEDA0, 0x980E, 0xEDA1, 0x603C, 0xEDA2, 0x605D, + 0xEDA3, 0x605A, 0xEDA4, 0x6067, 0xEDA5, 0x6041, 0xEDA6, 0x6059, 0xEDA7, 0x6063, 0xEDA8, 0x60AB, 0xEDA9, 0x6106, 0xEDAA, 0x610D, + 0xEDAB, 0x615D, 0xEDAC, 0x61A9, 0xEDAD, 0x619D, 0xEDAE, 0x61CB, 0xEDAF, 0x61D1, 0xEDB0, 0x6206, 0xEDB1, 0x8080, 0xEDB2, 0x807F, + 0xEDB3, 0x6C93, 0xEDB4, 0x6CF6, 0xEDB5, 0x6DFC, 0xEDB6, 0x77F6, 0xEDB7, 0x77F8, 0xEDB8, 0x7800, 0xEDB9, 0x7809, 0xEDBA, 0x7817, + 0xEDBB, 0x7818, 0xEDBC, 0x7811, 0xEDBD, 0x65AB, 0xEDBE, 0x782D, 0xEDBF, 0x781C, 0xEDC0, 0x781D, 0xEDC1, 0x7839, 0xEDC2, 0x783A, + 0xEDC3, 0x783B, 0xEDC4, 0x781F, 0xEDC5, 0x783C, 0xEDC6, 0x7825, 0xEDC7, 0x782C, 0xEDC8, 0x7823, 0xEDC9, 0x7829, 0xEDCA, 0x784E, + 0xEDCB, 0x786D, 0xEDCC, 0x7856, 0xEDCD, 0x7857, 0xEDCE, 0x7826, 0xEDCF, 0x7850, 0xEDD0, 0x7847, 0xEDD1, 0x784C, 0xEDD2, 0x786A, + 0xEDD3, 0x789B, 0xEDD4, 0x7893, 0xEDD5, 0x789A, 0xEDD6, 0x7887, 0xEDD7, 0x789C, 0xEDD8, 0x78A1, 0xEDD9, 0x78A3, 0xEDDA, 0x78B2, + 0xEDDB, 0x78B9, 0xEDDC, 0x78A5, 0xEDDD, 0x78D4, 0xEDDE, 0x78D9, 0xEDDF, 0x78C9, 0xEDE0, 0x78EC, 0xEDE1, 0x78F2, 0xEDE2, 0x7905, + 0xEDE3, 0x78F4, 0xEDE4, 0x7913, 0xEDE5, 0x7924, 0xEDE6, 0x791E, 0xEDE7, 0x7934, 0xEDE8, 0x9F9B, 0xEDE9, 0x9EF9, 0xEDEA, 0x9EFB, + 0xEDEB, 0x9EFC, 0xEDEC, 0x76F1, 0xEDED, 0x7704, 0xEDEE, 0x770D, 0xEDEF, 0x76F9, 0xEDF0, 0x7707, 0xEDF1, 0x7708, 0xEDF2, 0x771A, + 0xEDF3, 0x7722, 0xEDF4, 0x7719, 0xEDF5, 0x772D, 0xEDF6, 0x7726, 0xEDF7, 0x7735, 0xEDF8, 0x7738, 0xEDF9, 0x7750, 0xEDFA, 0x7751, + 0xEDFB, 0x7747, 0xEDFC, 0x7743, 0xEDFD, 0x775A, 0xEDFE, 0x7768, 0xEE40, 0x980F, 0xEE41, 0x9810, 0xEE42, 0x9811, 0xEE43, 0x9812, + 0xEE44, 0x9813, 0xEE45, 0x9814, 0xEE46, 0x9815, 0xEE47, 0x9816, 0xEE48, 0x9817, 0xEE49, 0x9818, 0xEE4A, 0x9819, 0xEE4B, 0x981A, + 0xEE4C, 0x981B, 0xEE4D, 0x981C, 0xEE4E, 0x981D, 0xEE4F, 0x981E, 0xEE50, 0x981F, 0xEE51, 0x9820, 0xEE52, 0x9821, 0xEE53, 0x9822, + 0xEE54, 0x9823, 0xEE55, 0x9824, 0xEE56, 0x9825, 0xEE57, 0x9826, 0xEE58, 0x9827, 0xEE59, 0x9828, 0xEE5A, 0x9829, 0xEE5B, 0x982A, + 0xEE5C, 0x982B, 0xEE5D, 0x982C, 0xEE5E, 0x982D, 0xEE5F, 0x982E, 0xEE60, 0x982F, 0xEE61, 0x9830, 0xEE62, 0x9831, 0xEE63, 0x9832, + 0xEE64, 0x9833, 0xEE65, 0x9834, 0xEE66, 0x9835, 0xEE67, 0x9836, 0xEE68, 0x9837, 0xEE69, 0x9838, 0xEE6A, 0x9839, 0xEE6B, 0x983A, + 0xEE6C, 0x983B, 0xEE6D, 0x983C, 0xEE6E, 0x983D, 0xEE6F, 0x983E, 0xEE70, 0x983F, 0xEE71, 0x9840, 0xEE72, 0x9841, 0xEE73, 0x9842, + 0xEE74, 0x9843, 0xEE75, 0x9844, 0xEE76, 0x9845, 0xEE77, 0x9846, 0xEE78, 0x9847, 0xEE79, 0x9848, 0xEE7A, 0x9849, 0xEE7B, 0x984A, + 0xEE7C, 0x984B, 0xEE7D, 0x984C, 0xEE7E, 0x984D, 0xEE80, 0x984E, 0xEE81, 0x984F, 0xEE82, 0x9850, 0xEE83, 0x9851, 0xEE84, 0x9852, + 0xEE85, 0x9853, 0xEE86, 0x9854, 0xEE87, 0x9855, 0xEE88, 0x9856, 0xEE89, 0x9857, 0xEE8A, 0x9858, 0xEE8B, 0x9859, 0xEE8C, 0x985A, + 0xEE8D, 0x985B, 0xEE8E, 0x985C, 0xEE8F, 0x985D, 0xEE90, 0x985E, 0xEE91, 0x985F, 0xEE92, 0x9860, 0xEE93, 0x9861, 0xEE94, 0x9862, + 0xEE95, 0x9863, 0xEE96, 0x9864, 0xEE97, 0x9865, 0xEE98, 0x9866, 0xEE99, 0x9867, 0xEE9A, 0x9868, 0xEE9B, 0x9869, 0xEE9C, 0x986A, + 0xEE9D, 0x986B, 0xEE9E, 0x986C, 0xEE9F, 0x986D, 0xEEA0, 0x986E, 0xEEA1, 0x7762, 0xEEA2, 0x7765, 0xEEA3, 0x777F, 0xEEA4, 0x778D, + 0xEEA5, 0x777D, 0xEEA6, 0x7780, 0xEEA7, 0x778C, 0xEEA8, 0x7791, 0xEEA9, 0x779F, 0xEEAA, 0x77A0, 0xEEAB, 0x77B0, 0xEEAC, 0x77B5, + 0xEEAD, 0x77BD, 0xEEAE, 0x753A, 0xEEAF, 0x7540, 0xEEB0, 0x754E, 0xEEB1, 0x754B, 0xEEB2, 0x7548, 0xEEB3, 0x755B, 0xEEB4, 0x7572, + 0xEEB5, 0x7579, 0xEEB6, 0x7583, 0xEEB7, 0x7F58, 0xEEB8, 0x7F61, 0xEEB9, 0x7F5F, 0xEEBA, 0x8A48, 0xEEBB, 0x7F68, 0xEEBC, 0x7F74, + 0xEEBD, 0x7F71, 0xEEBE, 0x7F79, 0xEEBF, 0x7F81, 0xEEC0, 0x7F7E, 0xEEC1, 0x76CD, 0xEEC2, 0x76E5, 0xEEC3, 0x8832, 0xEEC4, 0x9485, + 0xEEC5, 0x9486, 0xEEC6, 0x9487, 0xEEC7, 0x948B, 0xEEC8, 0x948A, 0xEEC9, 0x948C, 0xEECA, 0x948D, 0xEECB, 0x948F, 0xEECC, 0x9490, + 0xEECD, 0x9494, 0xEECE, 0x9497, 0xEECF, 0x9495, 0xEED0, 0x949A, 0xEED1, 0x949B, 0xEED2, 0x949C, 0xEED3, 0x94A3, 0xEED4, 0x94A4, + 0xEED5, 0x94AB, 0xEED6, 0x94AA, 0xEED7, 0x94AD, 0xEED8, 0x94AC, 0xEED9, 0x94AF, 0xEEDA, 0x94B0, 0xEEDB, 0x94B2, 0xEEDC, 0x94B4, + 0xEEDD, 0x94B6, 0xEEDE, 0x94B7, 0xEEDF, 0x94B8, 0xEEE0, 0x94B9, 0xEEE1, 0x94BA, 0xEEE2, 0x94BC, 0xEEE3, 0x94BD, 0xEEE4, 0x94BF, + 0xEEE5, 0x94C4, 0xEEE6, 0x94C8, 0xEEE7, 0x94C9, 0xEEE8, 0x94CA, 0xEEE9, 0x94CB, 0xEEEA, 0x94CC, 0xEEEB, 0x94CD, 0xEEEC, 0x94CE, + 0xEEED, 0x94D0, 0xEEEE, 0x94D1, 0xEEEF, 0x94D2, 0xEEF0, 0x94D5, 0xEEF1, 0x94D6, 0xEEF2, 0x94D7, 0xEEF3, 0x94D9, 0xEEF4, 0x94D8, + 0xEEF5, 0x94DB, 0xEEF6, 0x94DE, 0xEEF7, 0x94DF, 0xEEF8, 0x94E0, 0xEEF9, 0x94E2, 0xEEFA, 0x94E4, 0xEEFB, 0x94E5, 0xEEFC, 0x94E7, + 0xEEFD, 0x94E8, 0xEEFE, 0x94EA, 0xEF40, 0x986F, 0xEF41, 0x9870, 0xEF42, 0x9871, 0xEF43, 0x9872, 0xEF44, 0x9873, 0xEF45, 0x9874, + 0xEF46, 0x988B, 0xEF47, 0x988E, 0xEF48, 0x9892, 0xEF49, 0x9895, 0xEF4A, 0x9899, 0xEF4B, 0x98A3, 0xEF4C, 0x98A8, 0xEF4D, 0x98A9, + 0xEF4E, 0x98AA, 0xEF4F, 0x98AB, 0xEF50, 0x98AC, 0xEF51, 0x98AD, 0xEF52, 0x98AE, 0xEF53, 0x98AF, 0xEF54, 0x98B0, 0xEF55, 0x98B1, + 0xEF56, 0x98B2, 0xEF57, 0x98B3, 0xEF58, 0x98B4, 0xEF59, 0x98B5, 0xEF5A, 0x98B6, 0xEF5B, 0x98B7, 0xEF5C, 0x98B8, 0xEF5D, 0x98B9, + 0xEF5E, 0x98BA, 0xEF5F, 0x98BB, 0xEF60, 0x98BC, 0xEF61, 0x98BD, 0xEF62, 0x98BE, 0xEF63, 0x98BF, 0xEF64, 0x98C0, 0xEF65, 0x98C1, + 0xEF66, 0x98C2, 0xEF67, 0x98C3, 0xEF68, 0x98C4, 0xEF69, 0x98C5, 0xEF6A, 0x98C6, 0xEF6B, 0x98C7, 0xEF6C, 0x98C8, 0xEF6D, 0x98C9, + 0xEF6E, 0x98CA, 0xEF6F, 0x98CB, 0xEF70, 0x98CC, 0xEF71, 0x98CD, 0xEF72, 0x98CF, 0xEF73, 0x98D0, 0xEF74, 0x98D4, 0xEF75, 0x98D6, + 0xEF76, 0x98D7, 0xEF77, 0x98DB, 0xEF78, 0x98DC, 0xEF79, 0x98DD, 0xEF7A, 0x98E0, 0xEF7B, 0x98E1, 0xEF7C, 0x98E2, 0xEF7D, 0x98E3, + 0xEF7E, 0x98E4, 0xEF80, 0x98E5, 0xEF81, 0x98E6, 0xEF82, 0x98E9, 0xEF83, 0x98EA, 0xEF84, 0x98EB, 0xEF85, 0x98EC, 0xEF86, 0x98ED, + 0xEF87, 0x98EE, 0xEF88, 0x98EF, 0xEF89, 0x98F0, 0xEF8A, 0x98F1, 0xEF8B, 0x98F2, 0xEF8C, 0x98F3, 0xEF8D, 0x98F4, 0xEF8E, 0x98F5, + 0xEF8F, 0x98F6, 0xEF90, 0x98F7, 0xEF91, 0x98F8, 0xEF92, 0x98F9, 0xEF93, 0x98FA, 0xEF94, 0x98FB, 0xEF95, 0x98FC, 0xEF96, 0x98FD, + 0xEF97, 0x98FE, 0xEF98, 0x98FF, 0xEF99, 0x9900, 0xEF9A, 0x9901, 0xEF9B, 0x9902, 0xEF9C, 0x9903, 0xEF9D, 0x9904, 0xEF9E, 0x9905, + 0xEF9F, 0x9906, 0xEFA0, 0x9907, 0xEFA1, 0x94E9, 0xEFA2, 0x94EB, 0xEFA3, 0x94EE, 0xEFA4, 0x94EF, 0xEFA5, 0x94F3, 0xEFA6, 0x94F4, + 0xEFA7, 0x94F5, 0xEFA8, 0x94F7, 0xEFA9, 0x94F9, 0xEFAA, 0x94FC, 0xEFAB, 0x94FD, 0xEFAC, 0x94FF, 0xEFAD, 0x9503, 0xEFAE, 0x9502, + 0xEFAF, 0x9506, 0xEFB0, 0x9507, 0xEFB1, 0x9509, 0xEFB2, 0x950A, 0xEFB3, 0x950D, 0xEFB4, 0x950E, 0xEFB5, 0x950F, 0xEFB6, 0x9512, + 0xEFB7, 0x9513, 0xEFB8, 0x9514, 0xEFB9, 0x9515, 0xEFBA, 0x9516, 0xEFBB, 0x9518, 0xEFBC, 0x951B, 0xEFBD, 0x951D, 0xEFBE, 0x951E, + 0xEFBF, 0x951F, 0xEFC0, 0x9522, 0xEFC1, 0x952A, 0xEFC2, 0x952B, 0xEFC3, 0x9529, 0xEFC4, 0x952C, 0xEFC5, 0x9531, 0xEFC6, 0x9532, + 0xEFC7, 0x9534, 0xEFC8, 0x9536, 0xEFC9, 0x9537, 0xEFCA, 0x9538, 0xEFCB, 0x953C, 0xEFCC, 0x953E, 0xEFCD, 0x953F, 0xEFCE, 0x9542, + 0xEFCF, 0x9535, 0xEFD0, 0x9544, 0xEFD1, 0x9545, 0xEFD2, 0x9546, 0xEFD3, 0x9549, 0xEFD4, 0x954C, 0xEFD5, 0x954E, 0xEFD6, 0x954F, + 0xEFD7, 0x9552, 0xEFD8, 0x9553, 0xEFD9, 0x9554, 0xEFDA, 0x9556, 0xEFDB, 0x9557, 0xEFDC, 0x9558, 0xEFDD, 0x9559, 0xEFDE, 0x955B, + 0xEFDF, 0x955E, 0xEFE0, 0x955F, 0xEFE1, 0x955D, 0xEFE2, 0x9561, 0xEFE3, 0x9562, 0xEFE4, 0x9564, 0xEFE5, 0x9565, 0xEFE6, 0x9566, + 0xEFE7, 0x9567, 0xEFE8, 0x9568, 0xEFE9, 0x9569, 0xEFEA, 0x956A, 0xEFEB, 0x956B, 0xEFEC, 0x956C, 0xEFED, 0x956F, 0xEFEE, 0x9571, + 0xEFEF, 0x9572, 0xEFF0, 0x9573, 0xEFF1, 0x953A, 0xEFF2, 0x77E7, 0xEFF3, 0x77EC, 0xEFF4, 0x96C9, 0xEFF5, 0x79D5, 0xEFF6, 0x79ED, + 0xEFF7, 0x79E3, 0xEFF8, 0x79EB, 0xEFF9, 0x7A06, 0xEFFA, 0x5D47, 0xEFFB, 0x7A03, 0xEFFC, 0x7A02, 0xEFFD, 0x7A1E, 0xEFFE, 0x7A14, + 0xF040, 0x9908, 0xF041, 0x9909, 0xF042, 0x990A, 0xF043, 0x990B, 0xF044, 0x990C, 0xF045, 0x990E, 0xF046, 0x990F, 0xF047, 0x9911, + 0xF048, 0x9912, 0xF049, 0x9913, 0xF04A, 0x9914, 0xF04B, 0x9915, 0xF04C, 0x9916, 0xF04D, 0x9917, 0xF04E, 0x9918, 0xF04F, 0x9919, + 0xF050, 0x991A, 0xF051, 0x991B, 0xF052, 0x991C, 0xF053, 0x991D, 0xF054, 0x991E, 0xF055, 0x991F, 0xF056, 0x9920, 0xF057, 0x9921, + 0xF058, 0x9922, 0xF059, 0x9923, 0xF05A, 0x9924, 0xF05B, 0x9925, 0xF05C, 0x9926, 0xF05D, 0x9927, 0xF05E, 0x9928, 0xF05F, 0x9929, + 0xF060, 0x992A, 0xF061, 0x992B, 0xF062, 0x992C, 0xF063, 0x992D, 0xF064, 0x992F, 0xF065, 0x9930, 0xF066, 0x9931, 0xF067, 0x9932, + 0xF068, 0x9933, 0xF069, 0x9934, 0xF06A, 0x9935, 0xF06B, 0x9936, 0xF06C, 0x9937, 0xF06D, 0x9938, 0xF06E, 0x9939, 0xF06F, 0x993A, + 0xF070, 0x993B, 0xF071, 0x993C, 0xF072, 0x993D, 0xF073, 0x993E, 0xF074, 0x993F, 0xF075, 0x9940, 0xF076, 0x9941, 0xF077, 0x9942, + 0xF078, 0x9943, 0xF079, 0x9944, 0xF07A, 0x9945, 0xF07B, 0x9946, 0xF07C, 0x9947, 0xF07D, 0x9948, 0xF07E, 0x9949, 0xF080, 0x994A, + 0xF081, 0x994B, 0xF082, 0x994C, 0xF083, 0x994D, 0xF084, 0x994E, 0xF085, 0x994F, 0xF086, 0x9950, 0xF087, 0x9951, 0xF088, 0x9952, + 0xF089, 0x9953, 0xF08A, 0x9956, 0xF08B, 0x9957, 0xF08C, 0x9958, 0xF08D, 0x9959, 0xF08E, 0x995A, 0xF08F, 0x995B, 0xF090, 0x995C, + 0xF091, 0x995D, 0xF092, 0x995E, 0xF093, 0x995F, 0xF094, 0x9960, 0xF095, 0x9961, 0xF096, 0x9962, 0xF097, 0x9964, 0xF098, 0x9966, + 0xF099, 0x9973, 0xF09A, 0x9978, 0xF09B, 0x9979, 0xF09C, 0x997B, 0xF09D, 0x997E, 0xF09E, 0x9982, 0xF09F, 0x9983, 0xF0A0, 0x9989, + 0xF0A1, 0x7A39, 0xF0A2, 0x7A37, 0xF0A3, 0x7A51, 0xF0A4, 0x9ECF, 0xF0A5, 0x99A5, 0xF0A6, 0x7A70, 0xF0A7, 0x7688, 0xF0A8, 0x768E, + 0xF0A9, 0x7693, 0xF0AA, 0x7699, 0xF0AB, 0x76A4, 0xF0AC, 0x74DE, 0xF0AD, 0x74E0, 0xF0AE, 0x752C, 0xF0AF, 0x9E20, 0xF0B0, 0x9E22, + 0xF0B1, 0x9E28, 0xF0B2, 0x9E29, 0xF0B3, 0x9E2A, 0xF0B4, 0x9E2B, 0xF0B5, 0x9E2C, 0xF0B6, 0x9E32, 0xF0B7, 0x9E31, 0xF0B8, 0x9E36, + 0xF0B9, 0x9E38, 0xF0BA, 0x9E37, 0xF0BB, 0x9E39, 0xF0BC, 0x9E3A, 0xF0BD, 0x9E3E, 0xF0BE, 0x9E41, 0xF0BF, 0x9E42, 0xF0C0, 0x9E44, + 0xF0C1, 0x9E46, 0xF0C2, 0x9E47, 0xF0C3, 0x9E48, 0xF0C4, 0x9E49, 0xF0C5, 0x9E4B, 0xF0C6, 0x9E4C, 0xF0C7, 0x9E4E, 0xF0C8, 0x9E51, + 0xF0C9, 0x9E55, 0xF0CA, 0x9E57, 0xF0CB, 0x9E5A, 0xF0CC, 0x9E5B, 0xF0CD, 0x9E5C, 0xF0CE, 0x9E5E, 0xF0CF, 0x9E63, 0xF0D0, 0x9E66, + 0xF0D1, 0x9E67, 0xF0D2, 0x9E68, 0xF0D3, 0x9E69, 0xF0D4, 0x9E6A, 0xF0D5, 0x9E6B, 0xF0D6, 0x9E6C, 0xF0D7, 0x9E71, 0xF0D8, 0x9E6D, + 0xF0D9, 0x9E73, 0xF0DA, 0x7592, 0xF0DB, 0x7594, 0xF0DC, 0x7596, 0xF0DD, 0x75A0, 0xF0DE, 0x759D, 0xF0DF, 0x75AC, 0xF0E0, 0x75A3, + 0xF0E1, 0x75B3, 0xF0E2, 0x75B4, 0xF0E3, 0x75B8, 0xF0E4, 0x75C4, 0xF0E5, 0x75B1, 0xF0E6, 0x75B0, 0xF0E7, 0x75C3, 0xF0E8, 0x75C2, + 0xF0E9, 0x75D6, 0xF0EA, 0x75CD, 0xF0EB, 0x75E3, 0xF0EC, 0x75E8, 0xF0ED, 0x75E6, 0xF0EE, 0x75E4, 0xF0EF, 0x75EB, 0xF0F0, 0x75E7, + 0xF0F1, 0x7603, 0xF0F2, 0x75F1, 0xF0F3, 0x75FC, 0xF0F4, 0x75FF, 0xF0F5, 0x7610, 0xF0F6, 0x7600, 0xF0F7, 0x7605, 0xF0F8, 0x760C, + 0xF0F9, 0x7617, 0xF0FA, 0x760A, 0xF0FB, 0x7625, 0xF0FC, 0x7618, 0xF0FD, 0x7615, 0xF0FE, 0x7619, 0xF140, 0x998C, 0xF141, 0x998E, + 0xF142, 0x999A, 0xF143, 0x999B, 0xF144, 0x999C, 0xF145, 0x999D, 0xF146, 0x999E, 0xF147, 0x999F, 0xF148, 0x99A0, 0xF149, 0x99A1, + 0xF14A, 0x99A2, 0xF14B, 0x99A3, 0xF14C, 0x99A4, 0xF14D, 0x99A6, 0xF14E, 0x99A7, 0xF14F, 0x99A9, 0xF150, 0x99AA, 0xF151, 0x99AB, + 0xF152, 0x99AC, 0xF153, 0x99AD, 0xF154, 0x99AE, 0xF155, 0x99AF, 0xF156, 0x99B0, 0xF157, 0x99B1, 0xF158, 0x99B2, 0xF159, 0x99B3, + 0xF15A, 0x99B4, 0xF15B, 0x99B5, 0xF15C, 0x99B6, 0xF15D, 0x99B7, 0xF15E, 0x99B8, 0xF15F, 0x99B9, 0xF160, 0x99BA, 0xF161, 0x99BB, + 0xF162, 0x99BC, 0xF163, 0x99BD, 0xF164, 0x99BE, 0xF165, 0x99BF, 0xF166, 0x99C0, 0xF167, 0x99C1, 0xF168, 0x99C2, 0xF169, 0x99C3, + 0xF16A, 0x99C4, 0xF16B, 0x99C5, 0xF16C, 0x99C6, 0xF16D, 0x99C7, 0xF16E, 0x99C8, 0xF16F, 0x99C9, 0xF170, 0x99CA, 0xF171, 0x99CB, + 0xF172, 0x99CC, 0xF173, 0x99CD, 0xF174, 0x99CE, 0xF175, 0x99CF, 0xF176, 0x99D0, 0xF177, 0x99D1, 0xF178, 0x99D2, 0xF179, 0x99D3, + 0xF17A, 0x99D4, 0xF17B, 0x99D5, 0xF17C, 0x99D6, 0xF17D, 0x99D7, 0xF17E, 0x99D8, 0xF180, 0x99D9, 0xF181, 0x99DA, 0xF182, 0x99DB, + 0xF183, 0x99DC, 0xF184, 0x99DD, 0xF185, 0x99DE, 0xF186, 0x99DF, 0xF187, 0x99E0, 0xF188, 0x99E1, 0xF189, 0x99E2, 0xF18A, 0x99E3, + 0xF18B, 0x99E4, 0xF18C, 0x99E5, 0xF18D, 0x99E6, 0xF18E, 0x99E7, 0xF18F, 0x99E8, 0xF190, 0x99E9, 0xF191, 0x99EA, 0xF192, 0x99EB, + 0xF193, 0x99EC, 0xF194, 0x99ED, 0xF195, 0x99EE, 0xF196, 0x99EF, 0xF197, 0x99F0, 0xF198, 0x99F1, 0xF199, 0x99F2, 0xF19A, 0x99F3, + 0xF19B, 0x99F4, 0xF19C, 0x99F5, 0xF19D, 0x99F6, 0xF19E, 0x99F7, 0xF19F, 0x99F8, 0xF1A0, 0x99F9, 0xF1A1, 0x761B, 0xF1A2, 0x763C, + 0xF1A3, 0x7622, 0xF1A4, 0x7620, 0xF1A5, 0x7640, 0xF1A6, 0x762D, 0xF1A7, 0x7630, 0xF1A8, 0x763F, 0xF1A9, 0x7635, 0xF1AA, 0x7643, + 0xF1AB, 0x763E, 0xF1AC, 0x7633, 0xF1AD, 0x764D, 0xF1AE, 0x765E, 0xF1AF, 0x7654, 0xF1B0, 0x765C, 0xF1B1, 0x7656, 0xF1B2, 0x766B, + 0xF1B3, 0x766F, 0xF1B4, 0x7FCA, 0xF1B5, 0x7AE6, 0xF1B6, 0x7A78, 0xF1B7, 0x7A79, 0xF1B8, 0x7A80, 0xF1B9, 0x7A86, 0xF1BA, 0x7A88, + 0xF1BB, 0x7A95, 0xF1BC, 0x7AA6, 0xF1BD, 0x7AA0, 0xF1BE, 0x7AAC, 0xF1BF, 0x7AA8, 0xF1C0, 0x7AAD, 0xF1C1, 0x7AB3, 0xF1C2, 0x8864, + 0xF1C3, 0x8869, 0xF1C4, 0x8872, 0xF1C5, 0x887D, 0xF1C6, 0x887F, 0xF1C7, 0x8882, 0xF1C8, 0x88A2, 0xF1C9, 0x88C6, 0xF1CA, 0x88B7, + 0xF1CB, 0x88BC, 0xF1CC, 0x88C9, 0xF1CD, 0x88E2, 0xF1CE, 0x88CE, 0xF1CF, 0x88E3, 0xF1D0, 0x88E5, 0xF1D1, 0x88F1, 0xF1D2, 0x891A, + 0xF1D3, 0x88FC, 0xF1D4, 0x88E8, 0xF1D5, 0x88FE, 0xF1D6, 0x88F0, 0xF1D7, 0x8921, 0xF1D8, 0x8919, 0xF1D9, 0x8913, 0xF1DA, 0x891B, + 0xF1DB, 0x890A, 0xF1DC, 0x8934, 0xF1DD, 0x892B, 0xF1DE, 0x8936, 0xF1DF, 0x8941, 0xF1E0, 0x8966, 0xF1E1, 0x897B, 0xF1E2, 0x758B, + 0xF1E3, 0x80E5, 0xF1E4, 0x76B2, 0xF1E5, 0x76B4, 0xF1E6, 0x77DC, 0xF1E7, 0x8012, 0xF1E8, 0x8014, 0xF1E9, 0x8016, 0xF1EA, 0x801C, + 0xF1EB, 0x8020, 0xF1EC, 0x8022, 0xF1ED, 0x8025, 0xF1EE, 0x8026, 0xF1EF, 0x8027, 0xF1F0, 0x8029, 0xF1F1, 0x8028, 0xF1F2, 0x8031, + 0xF1F3, 0x800B, 0xF1F4, 0x8035, 0xF1F5, 0x8043, 0xF1F6, 0x8046, 0xF1F7, 0x804D, 0xF1F8, 0x8052, 0xF1F9, 0x8069, 0xF1FA, 0x8071, + 0xF1FB, 0x8983, 0xF1FC, 0x9878, 0xF1FD, 0x9880, 0xF1FE, 0x9883, 0xF240, 0x99FA, 0xF241, 0x99FB, 0xF242, 0x99FC, 0xF243, 0x99FD, + 0xF244, 0x99FE, 0xF245, 0x99FF, 0xF246, 0x9A00, 0xF247, 0x9A01, 0xF248, 0x9A02, 0xF249, 0x9A03, 0xF24A, 0x9A04, 0xF24B, 0x9A05, + 0xF24C, 0x9A06, 0xF24D, 0x9A07, 0xF24E, 0x9A08, 0xF24F, 0x9A09, 0xF250, 0x9A0A, 0xF251, 0x9A0B, 0xF252, 0x9A0C, 0xF253, 0x9A0D, + 0xF254, 0x9A0E, 0xF255, 0x9A0F, 0xF256, 0x9A10, 0xF257, 0x9A11, 0xF258, 0x9A12, 0xF259, 0x9A13, 0xF25A, 0x9A14, 0xF25B, 0x9A15, + 0xF25C, 0x9A16, 0xF25D, 0x9A17, 0xF25E, 0x9A18, 0xF25F, 0x9A19, 0xF260, 0x9A1A, 0xF261, 0x9A1B, 0xF262, 0x9A1C, 0xF263, 0x9A1D, + 0xF264, 0x9A1E, 0xF265, 0x9A1F, 0xF266, 0x9A20, 0xF267, 0x9A21, 0xF268, 0x9A22, 0xF269, 0x9A23, 0xF26A, 0x9A24, 0xF26B, 0x9A25, + 0xF26C, 0x9A26, 0xF26D, 0x9A27, 0xF26E, 0x9A28, 0xF26F, 0x9A29, 0xF270, 0x9A2A, 0xF271, 0x9A2B, 0xF272, 0x9A2C, 0xF273, 0x9A2D, + 0xF274, 0x9A2E, 0xF275, 0x9A2F, 0xF276, 0x9A30, 0xF277, 0x9A31, 0xF278, 0x9A32, 0xF279, 0x9A33, 0xF27A, 0x9A34, 0xF27B, 0x9A35, + 0xF27C, 0x9A36, 0xF27D, 0x9A37, 0xF27E, 0x9A38, 0xF280, 0x9A39, 0xF281, 0x9A3A, 0xF282, 0x9A3B, 0xF283, 0x9A3C, 0xF284, 0x9A3D, + 0xF285, 0x9A3E, 0xF286, 0x9A3F, 0xF287, 0x9A40, 0xF288, 0x9A41, 0xF289, 0x9A42, 0xF28A, 0x9A43, 0xF28B, 0x9A44, 0xF28C, 0x9A45, + 0xF28D, 0x9A46, 0xF28E, 0x9A47, 0xF28F, 0x9A48, 0xF290, 0x9A49, 0xF291, 0x9A4A, 0xF292, 0x9A4B, 0xF293, 0x9A4C, 0xF294, 0x9A4D, + 0xF295, 0x9A4E, 0xF296, 0x9A4F, 0xF297, 0x9A50, 0xF298, 0x9A51, 0xF299, 0x9A52, 0xF29A, 0x9A53, 0xF29B, 0x9A54, 0xF29C, 0x9A55, + 0xF29D, 0x9A56, 0xF29E, 0x9A57, 0xF29F, 0x9A58, 0xF2A0, 0x9A59, 0xF2A1, 0x9889, 0xF2A2, 0x988C, 0xF2A3, 0x988D, 0xF2A4, 0x988F, + 0xF2A5, 0x9894, 0xF2A6, 0x989A, 0xF2A7, 0x989B, 0xF2A8, 0x989E, 0xF2A9, 0x989F, 0xF2AA, 0x98A1, 0xF2AB, 0x98A2, 0xF2AC, 0x98A5, + 0xF2AD, 0x98A6, 0xF2AE, 0x864D, 0xF2AF, 0x8654, 0xF2B0, 0x866C, 0xF2B1, 0x866E, 0xF2B2, 0x867F, 0xF2B3, 0x867A, 0xF2B4, 0x867C, + 0xF2B5, 0x867B, 0xF2B6, 0x86A8, 0xF2B7, 0x868D, 0xF2B8, 0x868B, 0xF2B9, 0x86AC, 0xF2BA, 0x869D, 0xF2BB, 0x86A7, 0xF2BC, 0x86A3, + 0xF2BD, 0x86AA, 0xF2BE, 0x8693, 0xF2BF, 0x86A9, 0xF2C0, 0x86B6, 0xF2C1, 0x86C4, 0xF2C2, 0x86B5, 0xF2C3, 0x86CE, 0xF2C4, 0x86B0, + 0xF2C5, 0x86BA, 0xF2C6, 0x86B1, 0xF2C7, 0x86AF, 0xF2C8, 0x86C9, 0xF2C9, 0x86CF, 0xF2CA, 0x86B4, 0xF2CB, 0x86E9, 0xF2CC, 0x86F1, + 0xF2CD, 0x86F2, 0xF2CE, 0x86ED, 0xF2CF, 0x86F3, 0xF2D0, 0x86D0, 0xF2D1, 0x8713, 0xF2D2, 0x86DE, 0xF2D3, 0x86F4, 0xF2D4, 0x86DF, + 0xF2D5, 0x86D8, 0xF2D6, 0x86D1, 0xF2D7, 0x8703, 0xF2D8, 0x8707, 0xF2D9, 0x86F8, 0xF2DA, 0x8708, 0xF2DB, 0x870A, 0xF2DC, 0x870D, + 0xF2DD, 0x8709, 0xF2DE, 0x8723, 0xF2DF, 0x873B, 0xF2E0, 0x871E, 0xF2E1, 0x8725, 0xF2E2, 0x872E, 0xF2E3, 0x871A, 0xF2E4, 0x873E, + 0xF2E5, 0x8748, 0xF2E6, 0x8734, 0xF2E7, 0x8731, 0xF2E8, 0x8729, 0xF2E9, 0x8737, 0xF2EA, 0x873F, 0xF2EB, 0x8782, 0xF2EC, 0x8722, + 0xF2ED, 0x877D, 0xF2EE, 0x877E, 0xF2EF, 0x877B, 0xF2F0, 0x8760, 0xF2F1, 0x8770, 0xF2F2, 0x874C, 0xF2F3, 0x876E, 0xF2F4, 0x878B, + 0xF2F5, 0x8753, 0xF2F6, 0x8763, 0xF2F7, 0x877C, 0xF2F8, 0x8764, 0xF2F9, 0x8759, 0xF2FA, 0x8765, 0xF2FB, 0x8793, 0xF2FC, 0x87AF, + 0xF2FD, 0x87A8, 0xF2FE, 0x87D2, 0xF340, 0x9A5A, 0xF341, 0x9A5B, 0xF342, 0x9A5C, 0xF343, 0x9A5D, 0xF344, 0x9A5E, 0xF345, 0x9A5F, + 0xF346, 0x9A60, 0xF347, 0x9A61, 0xF348, 0x9A62, 0xF349, 0x9A63, 0xF34A, 0x9A64, 0xF34B, 0x9A65, 0xF34C, 0x9A66, 0xF34D, 0x9A67, + 0xF34E, 0x9A68, 0xF34F, 0x9A69, 0xF350, 0x9A6A, 0xF351, 0x9A6B, 0xF352, 0x9A72, 0xF353, 0x9A83, 0xF354, 0x9A89, 0xF355, 0x9A8D, + 0xF356, 0x9A8E, 0xF357, 0x9A94, 0xF358, 0x9A95, 0xF359, 0x9A99, 0xF35A, 0x9AA6, 0xF35B, 0x9AA9, 0xF35C, 0x9AAA, 0xF35D, 0x9AAB, + 0xF35E, 0x9AAC, 0xF35F, 0x9AAD, 0xF360, 0x9AAE, 0xF361, 0x9AAF, 0xF362, 0x9AB2, 0xF363, 0x9AB3, 0xF364, 0x9AB4, 0xF365, 0x9AB5, + 0xF366, 0x9AB9, 0xF367, 0x9ABB, 0xF368, 0x9ABD, 0xF369, 0x9ABE, 0xF36A, 0x9ABF, 0xF36B, 0x9AC3, 0xF36C, 0x9AC4, 0xF36D, 0x9AC6, + 0xF36E, 0x9AC7, 0xF36F, 0x9AC8, 0xF370, 0x9AC9, 0xF371, 0x9ACA, 0xF372, 0x9ACD, 0xF373, 0x9ACE, 0xF374, 0x9ACF, 0xF375, 0x9AD0, + 0xF376, 0x9AD2, 0xF377, 0x9AD4, 0xF378, 0x9AD5, 0xF379, 0x9AD6, 0xF37A, 0x9AD7, 0xF37B, 0x9AD9, 0xF37C, 0x9ADA, 0xF37D, 0x9ADB, + 0xF37E, 0x9ADC, 0xF380, 0x9ADD, 0xF381, 0x9ADE, 0xF382, 0x9AE0, 0xF383, 0x9AE2, 0xF384, 0x9AE3, 0xF385, 0x9AE4, 0xF386, 0x9AE5, + 0xF387, 0x9AE7, 0xF388, 0x9AE8, 0xF389, 0x9AE9, 0xF38A, 0x9AEA, 0xF38B, 0x9AEC, 0xF38C, 0x9AEE, 0xF38D, 0x9AF0, 0xF38E, 0x9AF1, + 0xF38F, 0x9AF2, 0xF390, 0x9AF3, 0xF391, 0x9AF4, 0xF392, 0x9AF5, 0xF393, 0x9AF6, 0xF394, 0x9AF7, 0xF395, 0x9AF8, 0xF396, 0x9AFA, + 0xF397, 0x9AFC, 0xF398, 0x9AFD, 0xF399, 0x9AFE, 0xF39A, 0x9AFF, 0xF39B, 0x9B00, 0xF39C, 0x9B01, 0xF39D, 0x9B02, 0xF39E, 0x9B04, + 0xF39F, 0x9B05, 0xF3A0, 0x9B06, 0xF3A1, 0x87C6, 0xF3A2, 0x8788, 0xF3A3, 0x8785, 0xF3A4, 0x87AD, 0xF3A5, 0x8797, 0xF3A6, 0x8783, + 0xF3A7, 0x87AB, 0xF3A8, 0x87E5, 0xF3A9, 0x87AC, 0xF3AA, 0x87B5, 0xF3AB, 0x87B3, 0xF3AC, 0x87CB, 0xF3AD, 0x87D3, 0xF3AE, 0x87BD, + 0xF3AF, 0x87D1, 0xF3B0, 0x87C0, 0xF3B1, 0x87CA, 0xF3B2, 0x87DB, 0xF3B3, 0x87EA, 0xF3B4, 0x87E0, 0xF3B5, 0x87EE, 0xF3B6, 0x8816, + 0xF3B7, 0x8813, 0xF3B8, 0x87FE, 0xF3B9, 0x880A, 0xF3BA, 0x881B, 0xF3BB, 0x8821, 0xF3BC, 0x8839, 0xF3BD, 0x883C, 0xF3BE, 0x7F36, + 0xF3BF, 0x7F42, 0xF3C0, 0x7F44, 0xF3C1, 0x7F45, 0xF3C2, 0x8210, 0xF3C3, 0x7AFA, 0xF3C4, 0x7AFD, 0xF3C5, 0x7B08, 0xF3C6, 0x7B03, + 0xF3C7, 0x7B04, 0xF3C8, 0x7B15, 0xF3C9, 0x7B0A, 0xF3CA, 0x7B2B, 0xF3CB, 0x7B0F, 0xF3CC, 0x7B47, 0xF3CD, 0x7B38, 0xF3CE, 0x7B2A, + 0xF3CF, 0x7B19, 0xF3D0, 0x7B2E, 0xF3D1, 0x7B31, 0xF3D2, 0x7B20, 0xF3D3, 0x7B25, 0xF3D4, 0x7B24, 0xF3D5, 0x7B33, 0xF3D6, 0x7B3E, + 0xF3D7, 0x7B1E, 0xF3D8, 0x7B58, 0xF3D9, 0x7B5A, 0xF3DA, 0x7B45, 0xF3DB, 0x7B75, 0xF3DC, 0x7B4C, 0xF3DD, 0x7B5D, 0xF3DE, 0x7B60, + 0xF3DF, 0x7B6E, 0xF3E0, 0x7B7B, 0xF3E1, 0x7B62, 0xF3E2, 0x7B72, 0xF3E3, 0x7B71, 0xF3E4, 0x7B90, 0xF3E5, 0x7BA6, 0xF3E6, 0x7BA7, + 0xF3E7, 0x7BB8, 0xF3E8, 0x7BAC, 0xF3E9, 0x7B9D, 0xF3EA, 0x7BA8, 0xF3EB, 0x7B85, 0xF3EC, 0x7BAA, 0xF3ED, 0x7B9C, 0xF3EE, 0x7BA2, + 0xF3EF, 0x7BAB, 0xF3F0, 0x7BB4, 0xF3F1, 0x7BD1, 0xF3F2, 0x7BC1, 0xF3F3, 0x7BCC, 0xF3F4, 0x7BDD, 0xF3F5, 0x7BDA, 0xF3F6, 0x7BE5, + 0xF3F7, 0x7BE6, 0xF3F8, 0x7BEA, 0xF3F9, 0x7C0C, 0xF3FA, 0x7BFE, 0xF3FB, 0x7BFC, 0xF3FC, 0x7C0F, 0xF3FD, 0x7C16, 0xF3FE, 0x7C0B, + 0xF440, 0x9B07, 0xF441, 0x9B09, 0xF442, 0x9B0A, 0xF443, 0x9B0B, 0xF444, 0x9B0C, 0xF445, 0x9B0D, 0xF446, 0x9B0E, 0xF447, 0x9B10, + 0xF448, 0x9B11, 0xF449, 0x9B12, 0xF44A, 0x9B14, 0xF44B, 0x9B15, 0xF44C, 0x9B16, 0xF44D, 0x9B17, 0xF44E, 0x9B18, 0xF44F, 0x9B19, + 0xF450, 0x9B1A, 0xF451, 0x9B1B, 0xF452, 0x9B1C, 0xF453, 0x9B1D, 0xF454, 0x9B1E, 0xF455, 0x9B20, 0xF456, 0x9B21, 0xF457, 0x9B22, + 0xF458, 0x9B24, 0xF459, 0x9B25, 0xF45A, 0x9B26, 0xF45B, 0x9B27, 0xF45C, 0x9B28, 0xF45D, 0x9B29, 0xF45E, 0x9B2A, 0xF45F, 0x9B2B, + 0xF460, 0x9B2C, 0xF461, 0x9B2D, 0xF462, 0x9B2E, 0xF463, 0x9B30, 0xF464, 0x9B31, 0xF465, 0x9B33, 0xF466, 0x9B34, 0xF467, 0x9B35, + 0xF468, 0x9B36, 0xF469, 0x9B37, 0xF46A, 0x9B38, 0xF46B, 0x9B39, 0xF46C, 0x9B3A, 0xF46D, 0x9B3D, 0xF46E, 0x9B3E, 0xF46F, 0x9B3F, + 0xF470, 0x9B40, 0xF471, 0x9B46, 0xF472, 0x9B4A, 0xF473, 0x9B4B, 0xF474, 0x9B4C, 0xF475, 0x9B4E, 0xF476, 0x9B50, 0xF477, 0x9B52, + 0xF478, 0x9B53, 0xF479, 0x9B55, 0xF47A, 0x9B56, 0xF47B, 0x9B57, 0xF47C, 0x9B58, 0xF47D, 0x9B59, 0xF47E, 0x9B5A, 0xF480, 0x9B5B, + 0xF481, 0x9B5C, 0xF482, 0x9B5D, 0xF483, 0x9B5E, 0xF484, 0x9B5F, 0xF485, 0x9B60, 0xF486, 0x9B61, 0xF487, 0x9B62, 0xF488, 0x9B63, + 0xF489, 0x9B64, 0xF48A, 0x9B65, 0xF48B, 0x9B66, 0xF48C, 0x9B67, 0xF48D, 0x9B68, 0xF48E, 0x9B69, 0xF48F, 0x9B6A, 0xF490, 0x9B6B, + 0xF491, 0x9B6C, 0xF492, 0x9B6D, 0xF493, 0x9B6E, 0xF494, 0x9B6F, 0xF495, 0x9B70, 0xF496, 0x9B71, 0xF497, 0x9B72, 0xF498, 0x9B73, + 0xF499, 0x9B74, 0xF49A, 0x9B75, 0xF49B, 0x9B76, 0xF49C, 0x9B77, 0xF49D, 0x9B78, 0xF49E, 0x9B79, 0xF49F, 0x9B7A, 0xF4A0, 0x9B7B, + 0xF4A1, 0x7C1F, 0xF4A2, 0x7C2A, 0xF4A3, 0x7C26, 0xF4A4, 0x7C38, 0xF4A5, 0x7C41, 0xF4A6, 0x7C40, 0xF4A7, 0x81FE, 0xF4A8, 0x8201, + 0xF4A9, 0x8202, 0xF4AA, 0x8204, 0xF4AB, 0x81EC, 0xF4AC, 0x8844, 0xF4AD, 0x8221, 0xF4AE, 0x8222, 0xF4AF, 0x8223, 0xF4B0, 0x822D, + 0xF4B1, 0x822F, 0xF4B2, 0x8228, 0xF4B3, 0x822B, 0xF4B4, 0x8238, 0xF4B5, 0x823B, 0xF4B6, 0x8233, 0xF4B7, 0x8234, 0xF4B8, 0x823E, + 0xF4B9, 0x8244, 0xF4BA, 0x8249, 0xF4BB, 0x824B, 0xF4BC, 0x824F, 0xF4BD, 0x825A, 0xF4BE, 0x825F, 0xF4BF, 0x8268, 0xF4C0, 0x887E, + 0xF4C1, 0x8885, 0xF4C2, 0x8888, 0xF4C3, 0x88D8, 0xF4C4, 0x88DF, 0xF4C5, 0x895E, 0xF4C6, 0x7F9D, 0xF4C7, 0x7F9F, 0xF4C8, 0x7FA7, + 0xF4C9, 0x7FAF, 0xF4CA, 0x7FB0, 0xF4CB, 0x7FB2, 0xF4CC, 0x7C7C, 0xF4CD, 0x6549, 0xF4CE, 0x7C91, 0xF4CF, 0x7C9D, 0xF4D0, 0x7C9C, + 0xF4D1, 0x7C9E, 0xF4D2, 0x7CA2, 0xF4D3, 0x7CB2, 0xF4D4, 0x7CBC, 0xF4D5, 0x7CBD, 0xF4D6, 0x7CC1, 0xF4D7, 0x7CC7, 0xF4D8, 0x7CCC, + 0xF4D9, 0x7CCD, 0xF4DA, 0x7CC8, 0xF4DB, 0x7CC5, 0xF4DC, 0x7CD7, 0xF4DD, 0x7CE8, 0xF4DE, 0x826E, 0xF4DF, 0x66A8, 0xF4E0, 0x7FBF, + 0xF4E1, 0x7FCE, 0xF4E2, 0x7FD5, 0xF4E3, 0x7FE5, 0xF4E4, 0x7FE1, 0xF4E5, 0x7FE6, 0xF4E6, 0x7FE9, 0xF4E7, 0x7FEE, 0xF4E8, 0x7FF3, + 0xF4E9, 0x7CF8, 0xF4EA, 0x7D77, 0xF4EB, 0x7DA6, 0xF4EC, 0x7DAE, 0xF4ED, 0x7E47, 0xF4EE, 0x7E9B, 0xF4EF, 0x9EB8, 0xF4F0, 0x9EB4, + 0xF4F1, 0x8D73, 0xF4F2, 0x8D84, 0xF4F3, 0x8D94, 0xF4F4, 0x8D91, 0xF4F5, 0x8DB1, 0xF4F6, 0x8D67, 0xF4F7, 0x8D6D, 0xF4F8, 0x8C47, + 0xF4F9, 0x8C49, 0xF4FA, 0x914A, 0xF4FB, 0x9150, 0xF4FC, 0x914E, 0xF4FD, 0x914F, 0xF4FE, 0x9164, 0xF540, 0x9B7C, 0xF541, 0x9B7D, + 0xF542, 0x9B7E, 0xF543, 0x9B7F, 0xF544, 0x9B80, 0xF545, 0x9B81, 0xF546, 0x9B82, 0xF547, 0x9B83, 0xF548, 0x9B84, 0xF549, 0x9B85, + 0xF54A, 0x9B86, 0xF54B, 0x9B87, 0xF54C, 0x9B88, 0xF54D, 0x9B89, 0xF54E, 0x9B8A, 0xF54F, 0x9B8B, 0xF550, 0x9B8C, 0xF551, 0x9B8D, + 0xF552, 0x9B8E, 0xF553, 0x9B8F, 0xF554, 0x9B90, 0xF555, 0x9B91, 0xF556, 0x9B92, 0xF557, 0x9B93, 0xF558, 0x9B94, 0xF559, 0x9B95, + 0xF55A, 0x9B96, 0xF55B, 0x9B97, 0xF55C, 0x9B98, 0xF55D, 0x9B99, 0xF55E, 0x9B9A, 0xF55F, 0x9B9B, 0xF560, 0x9B9C, 0xF561, 0x9B9D, + 0xF562, 0x9B9E, 0xF563, 0x9B9F, 0xF564, 0x9BA0, 0xF565, 0x9BA1, 0xF566, 0x9BA2, 0xF567, 0x9BA3, 0xF568, 0x9BA4, 0xF569, 0x9BA5, + 0xF56A, 0x9BA6, 0xF56B, 0x9BA7, 0xF56C, 0x9BA8, 0xF56D, 0x9BA9, 0xF56E, 0x9BAA, 0xF56F, 0x9BAB, 0xF570, 0x9BAC, 0xF571, 0x9BAD, + 0xF572, 0x9BAE, 0xF573, 0x9BAF, 0xF574, 0x9BB0, 0xF575, 0x9BB1, 0xF576, 0x9BB2, 0xF577, 0x9BB3, 0xF578, 0x9BB4, 0xF579, 0x9BB5, + 0xF57A, 0x9BB6, 0xF57B, 0x9BB7, 0xF57C, 0x9BB8, 0xF57D, 0x9BB9, 0xF57E, 0x9BBA, 0xF580, 0x9BBB, 0xF581, 0x9BBC, 0xF582, 0x9BBD, + 0xF583, 0x9BBE, 0xF584, 0x9BBF, 0xF585, 0x9BC0, 0xF586, 0x9BC1, 0xF587, 0x9BC2, 0xF588, 0x9BC3, 0xF589, 0x9BC4, 0xF58A, 0x9BC5, + 0xF58B, 0x9BC6, 0xF58C, 0x9BC7, 0xF58D, 0x9BC8, 0xF58E, 0x9BC9, 0xF58F, 0x9BCA, 0xF590, 0x9BCB, 0xF591, 0x9BCC, 0xF592, 0x9BCD, + 0xF593, 0x9BCE, 0xF594, 0x9BCF, 0xF595, 0x9BD0, 0xF596, 0x9BD1, 0xF597, 0x9BD2, 0xF598, 0x9BD3, 0xF599, 0x9BD4, 0xF59A, 0x9BD5, + 0xF59B, 0x9BD6, 0xF59C, 0x9BD7, 0xF59D, 0x9BD8, 0xF59E, 0x9BD9, 0xF59F, 0x9BDA, 0xF5A0, 0x9BDB, 0xF5A1, 0x9162, 0xF5A2, 0x9161, + 0xF5A3, 0x9170, 0xF5A4, 0x9169, 0xF5A5, 0x916F, 0xF5A6, 0x917D, 0xF5A7, 0x917E, 0xF5A8, 0x9172, 0xF5A9, 0x9174, 0xF5AA, 0x9179, + 0xF5AB, 0x918C, 0xF5AC, 0x9185, 0xF5AD, 0x9190, 0xF5AE, 0x918D, 0xF5AF, 0x9191, 0xF5B0, 0x91A2, 0xF5B1, 0x91A3, 0xF5B2, 0x91AA, + 0xF5B3, 0x91AD, 0xF5B4, 0x91AE, 0xF5B5, 0x91AF, 0xF5B6, 0x91B5, 0xF5B7, 0x91B4, 0xF5B8, 0x91BA, 0xF5B9, 0x8C55, 0xF5BA, 0x9E7E, + 0xF5BB, 0x8DB8, 0xF5BC, 0x8DEB, 0xF5BD, 0x8E05, 0xF5BE, 0x8E59, 0xF5BF, 0x8E69, 0xF5C0, 0x8DB5, 0xF5C1, 0x8DBF, 0xF5C2, 0x8DBC, + 0xF5C3, 0x8DBA, 0xF5C4, 0x8DC4, 0xF5C5, 0x8DD6, 0xF5C6, 0x8DD7, 0xF5C7, 0x8DDA, 0xF5C8, 0x8DDE, 0xF5C9, 0x8DCE, 0xF5CA, 0x8DCF, + 0xF5CB, 0x8DDB, 0xF5CC, 0x8DC6, 0xF5CD, 0x8DEC, 0xF5CE, 0x8DF7, 0xF5CF, 0x8DF8, 0xF5D0, 0x8DE3, 0xF5D1, 0x8DF9, 0xF5D2, 0x8DFB, + 0xF5D3, 0x8DE4, 0xF5D4, 0x8E09, 0xF5D5, 0x8DFD, 0xF5D6, 0x8E14, 0xF5D7, 0x8E1D, 0xF5D8, 0x8E1F, 0xF5D9, 0x8E2C, 0xF5DA, 0x8E2E, + 0xF5DB, 0x8E23, 0xF5DC, 0x8E2F, 0xF5DD, 0x8E3A, 0xF5DE, 0x8E40, 0xF5DF, 0x8E39, 0xF5E0, 0x8E35, 0xF5E1, 0x8E3D, 0xF5E2, 0x8E31, + 0xF5E3, 0x8E49, 0xF5E4, 0x8E41, 0xF5E5, 0x8E42, 0xF5E6, 0x8E51, 0xF5E7, 0x8E52, 0xF5E8, 0x8E4A, 0xF5E9, 0x8E70, 0xF5EA, 0x8E76, + 0xF5EB, 0x8E7C, 0xF5EC, 0x8E6F, 0xF5ED, 0x8E74, 0xF5EE, 0x8E85, 0xF5EF, 0x8E8F, 0xF5F0, 0x8E94, 0xF5F1, 0x8E90, 0xF5F2, 0x8E9C, + 0xF5F3, 0x8E9E, 0xF5F4, 0x8C78, 0xF5F5, 0x8C82, 0xF5F6, 0x8C8A, 0xF5F7, 0x8C85, 0xF5F8, 0x8C98, 0xF5F9, 0x8C94, 0xF5FA, 0x659B, + 0xF5FB, 0x89D6, 0xF5FC, 0x89DE, 0xF5FD, 0x89DA, 0xF5FE, 0x89DC, 0xF640, 0x9BDC, 0xF641, 0x9BDD, 0xF642, 0x9BDE, 0xF643, 0x9BDF, + 0xF644, 0x9BE0, 0xF645, 0x9BE1, 0xF646, 0x9BE2, 0xF647, 0x9BE3, 0xF648, 0x9BE4, 0xF649, 0x9BE5, 0xF64A, 0x9BE6, 0xF64B, 0x9BE7, + 0xF64C, 0x9BE8, 0xF64D, 0x9BE9, 0xF64E, 0x9BEA, 0xF64F, 0x9BEB, 0xF650, 0x9BEC, 0xF651, 0x9BED, 0xF652, 0x9BEE, 0xF653, 0x9BEF, + 0xF654, 0x9BF0, 0xF655, 0x9BF1, 0xF656, 0x9BF2, 0xF657, 0x9BF3, 0xF658, 0x9BF4, 0xF659, 0x9BF5, 0xF65A, 0x9BF6, 0xF65B, 0x9BF7, + 0xF65C, 0x9BF8, 0xF65D, 0x9BF9, 0xF65E, 0x9BFA, 0xF65F, 0x9BFB, 0xF660, 0x9BFC, 0xF661, 0x9BFD, 0xF662, 0x9BFE, 0xF663, 0x9BFF, + 0xF664, 0x9C00, 0xF665, 0x9C01, 0xF666, 0x9C02, 0xF667, 0x9C03, 0xF668, 0x9C04, 0xF669, 0x9C05, 0xF66A, 0x9C06, 0xF66B, 0x9C07, + 0xF66C, 0x9C08, 0xF66D, 0x9C09, 0xF66E, 0x9C0A, 0xF66F, 0x9C0B, 0xF670, 0x9C0C, 0xF671, 0x9C0D, 0xF672, 0x9C0E, 0xF673, 0x9C0F, + 0xF674, 0x9C10, 0xF675, 0x9C11, 0xF676, 0x9C12, 0xF677, 0x9C13, 0xF678, 0x9C14, 0xF679, 0x9C15, 0xF67A, 0x9C16, 0xF67B, 0x9C17, + 0xF67C, 0x9C18, 0xF67D, 0x9C19, 0xF67E, 0x9C1A, 0xF680, 0x9C1B, 0xF681, 0x9C1C, 0xF682, 0x9C1D, 0xF683, 0x9C1E, 0xF684, 0x9C1F, + 0xF685, 0x9C20, 0xF686, 0x9C21, 0xF687, 0x9C22, 0xF688, 0x9C23, 0xF689, 0x9C24, 0xF68A, 0x9C25, 0xF68B, 0x9C26, 0xF68C, 0x9C27, + 0xF68D, 0x9C28, 0xF68E, 0x9C29, 0xF68F, 0x9C2A, 0xF690, 0x9C2B, 0xF691, 0x9C2C, 0xF692, 0x9C2D, 0xF693, 0x9C2E, 0xF694, 0x9C2F, + 0xF695, 0x9C30, 0xF696, 0x9C31, 0xF697, 0x9C32, 0xF698, 0x9C33, 0xF699, 0x9C34, 0xF69A, 0x9C35, 0xF69B, 0x9C36, 0xF69C, 0x9C37, + 0xF69D, 0x9C38, 0xF69E, 0x9C39, 0xF69F, 0x9C3A, 0xF6A0, 0x9C3B, 0xF6A1, 0x89E5, 0xF6A2, 0x89EB, 0xF6A3, 0x89EF, 0xF6A4, 0x8A3E, + 0xF6A5, 0x8B26, 0xF6A6, 0x9753, 0xF6A7, 0x96E9, 0xF6A8, 0x96F3, 0xF6A9, 0x96EF, 0xF6AA, 0x9706, 0xF6AB, 0x9701, 0xF6AC, 0x9708, + 0xF6AD, 0x970F, 0xF6AE, 0x970E, 0xF6AF, 0x972A, 0xF6B0, 0x972D, 0xF6B1, 0x9730, 0xF6B2, 0x973E, 0xF6B3, 0x9F80, 0xF6B4, 0x9F83, + 0xF6B5, 0x9F85, 0xF6B6, 0x9F86, 0xF6B7, 0x9F87, 0xF6B8, 0x9F88, 0xF6B9, 0x9F89, 0xF6BA, 0x9F8A, 0xF6BB, 0x9F8C, 0xF6BC, 0x9EFE, + 0xF6BD, 0x9F0B, 0xF6BE, 0x9F0D, 0xF6BF, 0x96B9, 0xF6C0, 0x96BC, 0xF6C1, 0x96BD, 0xF6C2, 0x96CE, 0xF6C3, 0x96D2, 0xF6C4, 0x77BF, + 0xF6C5, 0x96E0, 0xF6C6, 0x928E, 0xF6C7, 0x92AE, 0xF6C8, 0x92C8, 0xF6C9, 0x933E, 0xF6CA, 0x936A, 0xF6CB, 0x93CA, 0xF6CC, 0x938F, + 0xF6CD, 0x943E, 0xF6CE, 0x946B, 0xF6CF, 0x9C7F, 0xF6D0, 0x9C82, 0xF6D1, 0x9C85, 0xF6D2, 0x9C86, 0xF6D3, 0x9C87, 0xF6D4, 0x9C88, + 0xF6D5, 0x7A23, 0xF6D6, 0x9C8B, 0xF6D7, 0x9C8E, 0xF6D8, 0x9C90, 0xF6D9, 0x9C91, 0xF6DA, 0x9C92, 0xF6DB, 0x9C94, 0xF6DC, 0x9C95, + 0xF6DD, 0x9C9A, 0xF6DE, 0x9C9B, 0xF6DF, 0x9C9E, 0xF6E0, 0x9C9F, 0xF6E1, 0x9CA0, 0xF6E2, 0x9CA1, 0xF6E3, 0x9CA2, 0xF6E4, 0x9CA3, + 0xF6E5, 0x9CA5, 0xF6E6, 0x9CA6, 0xF6E7, 0x9CA7, 0xF6E8, 0x9CA8, 0xF6E9, 0x9CA9, 0xF6EA, 0x9CAB, 0xF6EB, 0x9CAD, 0xF6EC, 0x9CAE, + 0xF6ED, 0x9CB0, 0xF6EE, 0x9CB1, 0xF6EF, 0x9CB2, 0xF6F0, 0x9CB3, 0xF6F1, 0x9CB4, 0xF6F2, 0x9CB5, 0xF6F3, 0x9CB6, 0xF6F4, 0x9CB7, + 0xF6F5, 0x9CBA, 0xF6F6, 0x9CBB, 0xF6F7, 0x9CBC, 0xF6F8, 0x9CBD, 0xF6F9, 0x9CC4, 0xF6FA, 0x9CC5, 0xF6FB, 0x9CC6, 0xF6FC, 0x9CC7, + 0xF6FD, 0x9CCA, 0xF6FE, 0x9CCB, 0xF740, 0x9C3C, 0xF741, 0x9C3D, 0xF742, 0x9C3E, 0xF743, 0x9C3F, 0xF744, 0x9C40, 0xF745, 0x9C41, + 0xF746, 0x9C42, 0xF747, 0x9C43, 0xF748, 0x9C44, 0xF749, 0x9C45, 0xF74A, 0x9C46, 0xF74B, 0x9C47, 0xF74C, 0x9C48, 0xF74D, 0x9C49, + 0xF74E, 0x9C4A, 0xF74F, 0x9C4B, 0xF750, 0x9C4C, 0xF751, 0x9C4D, 0xF752, 0x9C4E, 0xF753, 0x9C4F, 0xF754, 0x9C50, 0xF755, 0x9C51, + 0xF756, 0x9C52, 0xF757, 0x9C53, 0xF758, 0x9C54, 0xF759, 0x9C55, 0xF75A, 0x9C56, 0xF75B, 0x9C57, 0xF75C, 0x9C58, 0xF75D, 0x9C59, + 0xF75E, 0x9C5A, 0xF75F, 0x9C5B, 0xF760, 0x9C5C, 0xF761, 0x9C5D, 0xF762, 0x9C5E, 0xF763, 0x9C5F, 0xF764, 0x9C60, 0xF765, 0x9C61, + 0xF766, 0x9C62, 0xF767, 0x9C63, 0xF768, 0x9C64, 0xF769, 0x9C65, 0xF76A, 0x9C66, 0xF76B, 0x9C67, 0xF76C, 0x9C68, 0xF76D, 0x9C69, + 0xF76E, 0x9C6A, 0xF76F, 0x9C6B, 0xF770, 0x9C6C, 0xF771, 0x9C6D, 0xF772, 0x9C6E, 0xF773, 0x9C6F, 0xF774, 0x9C70, 0xF775, 0x9C71, + 0xF776, 0x9C72, 0xF777, 0x9C73, 0xF778, 0x9C74, 0xF779, 0x9C75, 0xF77A, 0x9C76, 0xF77B, 0x9C77, 0xF77C, 0x9C78, 0xF77D, 0x9C79, + 0xF77E, 0x9C7A, 0xF780, 0x9C7B, 0xF781, 0x9C7D, 0xF782, 0x9C7E, 0xF783, 0x9C80, 0xF784, 0x9C83, 0xF785, 0x9C84, 0xF786, 0x9C89, + 0xF787, 0x9C8A, 0xF788, 0x9C8C, 0xF789, 0x9C8F, 0xF78A, 0x9C93, 0xF78B, 0x9C96, 0xF78C, 0x9C97, 0xF78D, 0x9C98, 0xF78E, 0x9C99, + 0xF78F, 0x9C9D, 0xF790, 0x9CAA, 0xF791, 0x9CAC, 0xF792, 0x9CAF, 0xF793, 0x9CB9, 0xF794, 0x9CBE, 0xF795, 0x9CBF, 0xF796, 0x9CC0, + 0xF797, 0x9CC1, 0xF798, 0x9CC2, 0xF799, 0x9CC8, 0xF79A, 0x9CC9, 0xF79B, 0x9CD1, 0xF79C, 0x9CD2, 0xF79D, 0x9CDA, 0xF79E, 0x9CDB, + 0xF79F, 0x9CE0, 0xF7A0, 0x9CE1, 0xF7A1, 0x9CCC, 0xF7A2, 0x9CCD, 0xF7A3, 0x9CCE, 0xF7A4, 0x9CCF, 0xF7A5, 0x9CD0, 0xF7A6, 0x9CD3, + 0xF7A7, 0x9CD4, 0xF7A8, 0x9CD5, 0xF7A9, 0x9CD7, 0xF7AA, 0x9CD8, 0xF7AB, 0x9CD9, 0xF7AC, 0x9CDC, 0xF7AD, 0x9CDD, 0xF7AE, 0x9CDF, + 0xF7AF, 0x9CE2, 0xF7B0, 0x977C, 0xF7B1, 0x9785, 0xF7B2, 0x9791, 0xF7B3, 0x9792, 0xF7B4, 0x9794, 0xF7B5, 0x97AF, 0xF7B6, 0x97AB, + 0xF7B7, 0x97A3, 0xF7B8, 0x97B2, 0xF7B9, 0x97B4, 0xF7BA, 0x9AB1, 0xF7BB, 0x9AB0, 0xF7BC, 0x9AB7, 0xF7BD, 0x9E58, 0xF7BE, 0x9AB6, + 0xF7BF, 0x9ABA, 0xF7C0, 0x9ABC, 0xF7C1, 0x9AC1, 0xF7C2, 0x9AC0, 0xF7C3, 0x9AC5, 0xF7C4, 0x9AC2, 0xF7C5, 0x9ACB, 0xF7C6, 0x9ACC, + 0xF7C7, 0x9AD1, 0xF7C8, 0x9B45, 0xF7C9, 0x9B43, 0xF7CA, 0x9B47, 0xF7CB, 0x9B49, 0xF7CC, 0x9B48, 0xF7CD, 0x9B4D, 0xF7CE, 0x9B51, + 0xF7CF, 0x98E8, 0xF7D0, 0x990D, 0xF7D1, 0x992E, 0xF7D2, 0x9955, 0xF7D3, 0x9954, 0xF7D4, 0x9ADF, 0xF7D5, 0x9AE1, 0xF7D6, 0x9AE6, + 0xF7D7, 0x9AEF, 0xF7D8, 0x9AEB, 0xF7D9, 0x9AFB, 0xF7DA, 0x9AED, 0xF7DB, 0x9AF9, 0xF7DC, 0x9B08, 0xF7DD, 0x9B0F, 0xF7DE, 0x9B13, + 0xF7DF, 0x9B1F, 0xF7E0, 0x9B23, 0xF7E1, 0x9EBD, 0xF7E2, 0x9EBE, 0xF7E3, 0x7E3B, 0xF7E4, 0x9E82, 0xF7E5, 0x9E87, 0xF7E6, 0x9E88, + 0xF7E7, 0x9E8B, 0xF7E8, 0x9E92, 0xF7E9, 0x93D6, 0xF7EA, 0x9E9D, 0xF7EB, 0x9E9F, 0xF7EC, 0x9EDB, 0xF7ED, 0x9EDC, 0xF7EE, 0x9EDD, + 0xF7EF, 0x9EE0, 0xF7F0, 0x9EDF, 0xF7F1, 0x9EE2, 0xF7F2, 0x9EE9, 0xF7F3, 0x9EE7, 0xF7F4, 0x9EE5, 0xF7F5, 0x9EEA, 0xF7F6, 0x9EEF, + 0xF7F7, 0x9F22, 0xF7F8, 0x9F2C, 0xF7F9, 0x9F2F, 0xF7FA, 0x9F39, 0xF7FB, 0x9F37, 0xF7FC, 0x9F3D, 0xF7FD, 0x9F3E, 0xF7FE, 0x9F44, + 0xF840, 0x9CE3, 0xF841, 0x9CE4, 0xF842, 0x9CE5, 0xF843, 0x9CE6, 0xF844, 0x9CE7, 0xF845, 0x9CE8, 0xF846, 0x9CE9, 0xF847, 0x9CEA, + 0xF848, 0x9CEB, 0xF849, 0x9CEC, 0xF84A, 0x9CED, 0xF84B, 0x9CEE, 0xF84C, 0x9CEF, 0xF84D, 0x9CF0, 0xF84E, 0x9CF1, 0xF84F, 0x9CF2, + 0xF850, 0x9CF3, 0xF851, 0x9CF4, 0xF852, 0x9CF5, 0xF853, 0x9CF6, 0xF854, 0x9CF7, 0xF855, 0x9CF8, 0xF856, 0x9CF9, 0xF857, 0x9CFA, + 0xF858, 0x9CFB, 0xF859, 0x9CFC, 0xF85A, 0x9CFD, 0xF85B, 0x9CFE, 0xF85C, 0x9CFF, 0xF85D, 0x9D00, 0xF85E, 0x9D01, 0xF85F, 0x9D02, + 0xF860, 0x9D03, 0xF861, 0x9D04, 0xF862, 0x9D05, 0xF863, 0x9D06, 0xF864, 0x9D07, 0xF865, 0x9D08, 0xF866, 0x9D09, 0xF867, 0x9D0A, + 0xF868, 0x9D0B, 0xF869, 0x9D0C, 0xF86A, 0x9D0D, 0xF86B, 0x9D0E, 0xF86C, 0x9D0F, 0xF86D, 0x9D10, 0xF86E, 0x9D11, 0xF86F, 0x9D12, + 0xF870, 0x9D13, 0xF871, 0x9D14, 0xF872, 0x9D15, 0xF873, 0x9D16, 0xF874, 0x9D17, 0xF875, 0x9D18, 0xF876, 0x9D19, 0xF877, 0x9D1A, + 0xF878, 0x9D1B, 0xF879, 0x9D1C, 0xF87A, 0x9D1D, 0xF87B, 0x9D1E, 0xF87C, 0x9D1F, 0xF87D, 0x9D20, 0xF87E, 0x9D21, 0xF880, 0x9D22, + 0xF881, 0x9D23, 0xF882, 0x9D24, 0xF883, 0x9D25, 0xF884, 0x9D26, 0xF885, 0x9D27, 0xF886, 0x9D28, 0xF887, 0x9D29, 0xF888, 0x9D2A, + 0xF889, 0x9D2B, 0xF88A, 0x9D2C, 0xF88B, 0x9D2D, 0xF88C, 0x9D2E, 0xF88D, 0x9D2F, 0xF88E, 0x9D30, 0xF88F, 0x9D31, 0xF890, 0x9D32, + 0xF891, 0x9D33, 0xF892, 0x9D34, 0xF893, 0x9D35, 0xF894, 0x9D36, 0xF895, 0x9D37, 0xF896, 0x9D38, 0xF897, 0x9D39, 0xF898, 0x9D3A, + 0xF899, 0x9D3B, 0xF89A, 0x9D3C, 0xF89B, 0x9D3D, 0xF89C, 0x9D3E, 0xF89D, 0x9D3F, 0xF89E, 0x9D40, 0xF89F, 0x9D41, 0xF8A0, 0x9D42, + 0xF940, 0x9D43, 0xF941, 0x9D44, 0xF942, 0x9D45, 0xF943, 0x9D46, 0xF944, 0x9D47, 0xF945, 0x9D48, 0xF946, 0x9D49, 0xF947, 0x9D4A, + 0xF948, 0x9D4B, 0xF949, 0x9D4C, 0xF94A, 0x9D4D, 0xF94B, 0x9D4E, 0xF94C, 0x9D4F, 0xF94D, 0x9D50, 0xF94E, 0x9D51, 0xF94F, 0x9D52, + 0xF950, 0x9D53, 0xF951, 0x9D54, 0xF952, 0x9D55, 0xF953, 0x9D56, 0xF954, 0x9D57, 0xF955, 0x9D58, 0xF956, 0x9D59, 0xF957, 0x9D5A, + 0xF958, 0x9D5B, 0xF959, 0x9D5C, 0xF95A, 0x9D5D, 0xF95B, 0x9D5E, 0xF95C, 0x9D5F, 0xF95D, 0x9D60, 0xF95E, 0x9D61, 0xF95F, 0x9D62, + 0xF960, 0x9D63, 0xF961, 0x9D64, 0xF962, 0x9D65, 0xF963, 0x9D66, 0xF964, 0x9D67, 0xF965, 0x9D68, 0xF966, 0x9D69, 0xF967, 0x9D6A, + 0xF968, 0x9D6B, 0xF969, 0x9D6C, 0xF96A, 0x9D6D, 0xF96B, 0x9D6E, 0xF96C, 0x9D6F, 0xF96D, 0x9D70, 0xF96E, 0x9D71, 0xF96F, 0x9D72, + 0xF970, 0x9D73, 0xF971, 0x9D74, 0xF972, 0x9D75, 0xF973, 0x9D76, 0xF974, 0x9D77, 0xF975, 0x9D78, 0xF976, 0x9D79, 0xF977, 0x9D7A, + 0xF978, 0x9D7B, 0xF979, 0x9D7C, 0xF97A, 0x9D7D, 0xF97B, 0x9D7E, 0xF97C, 0x9D7F, 0xF97D, 0x9D80, 0xF97E, 0x9D81, 0xF980, 0x9D82, + 0xF981, 0x9D83, 0xF982, 0x9D84, 0xF983, 0x9D85, 0xF984, 0x9D86, 0xF985, 0x9D87, 0xF986, 0x9D88, 0xF987, 0x9D89, 0xF988, 0x9D8A, + 0xF989, 0x9D8B, 0xF98A, 0x9D8C, 0xF98B, 0x9D8D, 0xF98C, 0x9D8E, 0xF98D, 0x9D8F, 0xF98E, 0x9D90, 0xF98F, 0x9D91, 0xF990, 0x9D92, + 0xF991, 0x9D93, 0xF992, 0x9D94, 0xF993, 0x9D95, 0xF994, 0x9D96, 0xF995, 0x9D97, 0xF996, 0x9D98, 0xF997, 0x9D99, 0xF998, 0x9D9A, + 0xF999, 0x9D9B, 0xF99A, 0x9D9C, 0xF99B, 0x9D9D, 0xF99C, 0x9D9E, 0xF99D, 0x9D9F, 0xF99E, 0x9DA0, 0xF99F, 0x9DA1, 0xF9A0, 0x9DA2, + 0xFA40, 0x9DA3, 0xFA41, 0x9DA4, 0xFA42, 0x9DA5, 0xFA43, 0x9DA6, 0xFA44, 0x9DA7, 0xFA45, 0x9DA8, 0xFA46, 0x9DA9, 0xFA47, 0x9DAA, + 0xFA48, 0x9DAB, 0xFA49, 0x9DAC, 0xFA4A, 0x9DAD, 0xFA4B, 0x9DAE, 0xFA4C, 0x9DAF, 0xFA4D, 0x9DB0, 0xFA4E, 0x9DB1, 0xFA4F, 0x9DB2, + 0xFA50, 0x9DB3, 0xFA51, 0x9DB4, 0xFA52, 0x9DB5, 0xFA53, 0x9DB6, 0xFA54, 0x9DB7, 0xFA55, 0x9DB8, 0xFA56, 0x9DB9, 0xFA57, 0x9DBA, + 0xFA58, 0x9DBB, 0xFA59, 0x9DBC, 0xFA5A, 0x9DBD, 0xFA5B, 0x9DBE, 0xFA5C, 0x9DBF, 0xFA5D, 0x9DC0, 0xFA5E, 0x9DC1, 0xFA5F, 0x9DC2, + 0xFA60, 0x9DC3, 0xFA61, 0x9DC4, 0xFA62, 0x9DC5, 0xFA63, 0x9DC6, 0xFA64, 0x9DC7, 0xFA65, 0x9DC8, 0xFA66, 0x9DC9, 0xFA67, 0x9DCA, + 0xFA68, 0x9DCB, 0xFA69, 0x9DCC, 0xFA6A, 0x9DCD, 0xFA6B, 0x9DCE, 0xFA6C, 0x9DCF, 0xFA6D, 0x9DD0, 0xFA6E, 0x9DD1, 0xFA6F, 0x9DD2, + 0xFA70, 0x9DD3, 0xFA71, 0x9DD4, 0xFA72, 0x9DD5, 0xFA73, 0x9DD6, 0xFA74, 0x9DD7, 0xFA75, 0x9DD8, 0xFA76, 0x9DD9, 0xFA77, 0x9DDA, + 0xFA78, 0x9DDB, 0xFA79, 0x9DDC, 0xFA7A, 0x9DDD, 0xFA7B, 0x9DDE, 0xFA7C, 0x9DDF, 0xFA7D, 0x9DE0, 0xFA7E, 0x9DE1, 0xFA80, 0x9DE2, + 0xFA81, 0x9DE3, 0xFA82, 0x9DE4, 0xFA83, 0x9DE5, 0xFA84, 0x9DE6, 0xFA85, 0x9DE7, 0xFA86, 0x9DE8, 0xFA87, 0x9DE9, 0xFA88, 0x9DEA, + 0xFA89, 0x9DEB, 0xFA8A, 0x9DEC, 0xFA8B, 0x9DED, 0xFA8C, 0x9DEE, 0xFA8D, 0x9DEF, 0xFA8E, 0x9DF0, 0xFA8F, 0x9DF1, 0xFA90, 0x9DF2, + 0xFA91, 0x9DF3, 0xFA92, 0x9DF4, 0xFA93, 0x9DF5, 0xFA94, 0x9DF6, 0xFA95, 0x9DF7, 0xFA96, 0x9DF8, 0xFA97, 0x9DF9, 0xFA98, 0x9DFA, + 0xFA99, 0x9DFB, 0xFA9A, 0x9DFC, 0xFA9B, 0x9DFD, 0xFA9C, 0x9DFE, 0xFA9D, 0x9DFF, 0xFA9E, 0x9E00, 0xFA9F, 0x9E01, 0xFAA0, 0x9E02, + 0xFB40, 0x9E03, 0xFB41, 0x9E04, 0xFB42, 0x9E05, 0xFB43, 0x9E06, 0xFB44, 0x9E07, 0xFB45, 0x9E08, 0xFB46, 0x9E09, 0xFB47, 0x9E0A, + 0xFB48, 0x9E0B, 0xFB49, 0x9E0C, 0xFB4A, 0x9E0D, 0xFB4B, 0x9E0E, 0xFB4C, 0x9E0F, 0xFB4D, 0x9E10, 0xFB4E, 0x9E11, 0xFB4F, 0x9E12, + 0xFB50, 0x9E13, 0xFB51, 0x9E14, 0xFB52, 0x9E15, 0xFB53, 0x9E16, 0xFB54, 0x9E17, 0xFB55, 0x9E18, 0xFB56, 0x9E19, 0xFB57, 0x9E1A, + 0xFB58, 0x9E1B, 0xFB59, 0x9E1C, 0xFB5A, 0x9E1D, 0xFB5B, 0x9E1E, 0xFB5C, 0x9E24, 0xFB5D, 0x9E27, 0xFB5E, 0x9E2E, 0xFB5F, 0x9E30, + 0xFB60, 0x9E34, 0xFB61, 0x9E3B, 0xFB62, 0x9E3C, 0xFB63, 0x9E40, 0xFB64, 0x9E4D, 0xFB65, 0x9E50, 0xFB66, 0x9E52, 0xFB67, 0x9E53, + 0xFB68, 0x9E54, 0xFB69, 0x9E56, 0xFB6A, 0x9E59, 0xFB6B, 0x9E5D, 0xFB6C, 0x9E5F, 0xFB6D, 0x9E60, 0xFB6E, 0x9E61, 0xFB6F, 0x9E62, + 0xFB70, 0x9E65, 0xFB71, 0x9E6E, 0xFB72, 0x9E6F, 0xFB73, 0x9E72, 0xFB74, 0x9E74, 0xFB75, 0x9E75, 0xFB76, 0x9E76, 0xFB77, 0x9E77, + 0xFB78, 0x9E78, 0xFB79, 0x9E79, 0xFB7A, 0x9E7A, 0xFB7B, 0x9E7B, 0xFB7C, 0x9E7C, 0xFB7D, 0x9E7D, 0xFB7E, 0x9E80, 0xFB80, 0x9E81, + 0xFB81, 0x9E83, 0xFB82, 0x9E84, 0xFB83, 0x9E85, 0xFB84, 0x9E86, 0xFB85, 0x9E89, 0xFB86, 0x9E8A, 0xFB87, 0x9E8C, 0xFB88, 0x9E8D, + 0xFB89, 0x9E8E, 0xFB8A, 0x9E8F, 0xFB8B, 0x9E90, 0xFB8C, 0x9E91, 0xFB8D, 0x9E94, 0xFB8E, 0x9E95, 0xFB8F, 0x9E96, 0xFB90, 0x9E97, + 0xFB91, 0x9E98, 0xFB92, 0x9E99, 0xFB93, 0x9E9A, 0xFB94, 0x9E9B, 0xFB95, 0x9E9C, 0xFB96, 0x9E9E, 0xFB97, 0x9EA0, 0xFB98, 0x9EA1, + 0xFB99, 0x9EA2, 0xFB9A, 0x9EA3, 0xFB9B, 0x9EA4, 0xFB9C, 0x9EA5, 0xFB9D, 0x9EA7, 0xFB9E, 0x9EA8, 0xFB9F, 0x9EA9, 0xFBA0, 0x9EAA, + 0xFC40, 0x9EAB, 0xFC41, 0x9EAC, 0xFC42, 0x9EAD, 0xFC43, 0x9EAE, 0xFC44, 0x9EAF, 0xFC45, 0x9EB0, 0xFC46, 0x9EB1, 0xFC47, 0x9EB2, + 0xFC48, 0x9EB3, 0xFC49, 0x9EB5, 0xFC4A, 0x9EB6, 0xFC4B, 0x9EB7, 0xFC4C, 0x9EB9, 0xFC4D, 0x9EBA, 0xFC4E, 0x9EBC, 0xFC4F, 0x9EBF, + 0xFC50, 0x9EC0, 0xFC51, 0x9EC1, 0xFC52, 0x9EC2, 0xFC53, 0x9EC3, 0xFC54, 0x9EC5, 0xFC55, 0x9EC6, 0xFC56, 0x9EC7, 0xFC57, 0x9EC8, + 0xFC58, 0x9ECA, 0xFC59, 0x9ECB, 0xFC5A, 0x9ECC, 0xFC5B, 0x9ED0, 0xFC5C, 0x9ED2, 0xFC5D, 0x9ED3, 0xFC5E, 0x9ED5, 0xFC5F, 0x9ED6, + 0xFC60, 0x9ED7, 0xFC61, 0x9ED9, 0xFC62, 0x9EDA, 0xFC63, 0x9EDE, 0xFC64, 0x9EE1, 0xFC65, 0x9EE3, 0xFC66, 0x9EE4, 0xFC67, 0x9EE6, + 0xFC68, 0x9EE8, 0xFC69, 0x9EEB, 0xFC6A, 0x9EEC, 0xFC6B, 0x9EED, 0xFC6C, 0x9EEE, 0xFC6D, 0x9EF0, 0xFC6E, 0x9EF1, 0xFC6F, 0x9EF2, + 0xFC70, 0x9EF3, 0xFC71, 0x9EF4, 0xFC72, 0x9EF5, 0xFC73, 0x9EF6, 0xFC74, 0x9EF7, 0xFC75, 0x9EF8, 0xFC76, 0x9EFA, 0xFC77, 0x9EFD, + 0xFC78, 0x9EFF, 0xFC79, 0x9F00, 0xFC7A, 0x9F01, 0xFC7B, 0x9F02, 0xFC7C, 0x9F03, 0xFC7D, 0x9F04, 0xFC7E, 0x9F05, 0xFC80, 0x9F06, + 0xFC81, 0x9F07, 0xFC82, 0x9F08, 0xFC83, 0x9F09, 0xFC84, 0x9F0A, 0xFC85, 0x9F0C, 0xFC86, 0x9F0F, 0xFC87, 0x9F11, 0xFC88, 0x9F12, + 0xFC89, 0x9F14, 0xFC8A, 0x9F15, 0xFC8B, 0x9F16, 0xFC8C, 0x9F18, 0xFC8D, 0x9F1A, 0xFC8E, 0x9F1B, 0xFC8F, 0x9F1C, 0xFC90, 0x9F1D, + 0xFC91, 0x9F1E, 0xFC92, 0x9F1F, 0xFC93, 0x9F21, 0xFC94, 0x9F23, 0xFC95, 0x9F24, 0xFC96, 0x9F25, 0xFC97, 0x9F26, 0xFC98, 0x9F27, + 0xFC99, 0x9F28, 0xFC9A, 0x9F29, 0xFC9B, 0x9F2A, 0xFC9C, 0x9F2B, 0xFC9D, 0x9F2D, 0xFC9E, 0x9F2E, 0xFC9F, 0x9F30, 0xFCA0, 0x9F31, + 0xFD40, 0x9F32, 0xFD41, 0x9F33, 0xFD42, 0x9F34, 0xFD43, 0x9F35, 0xFD44, 0x9F36, 0xFD45, 0x9F38, 0xFD46, 0x9F3A, 0xFD47, 0x9F3C, + 0xFD48, 0x9F3F, 0xFD49, 0x9F40, 0xFD4A, 0x9F41, 0xFD4B, 0x9F42, 0xFD4C, 0x9F43, 0xFD4D, 0x9F45, 0xFD4E, 0x9F46, 0xFD4F, 0x9F47, + 0xFD50, 0x9F48, 0xFD51, 0x9F49, 0xFD52, 0x9F4A, 0xFD53, 0x9F4B, 0xFD54, 0x9F4C, 0xFD55, 0x9F4D, 0xFD56, 0x9F4E, 0xFD57, 0x9F4F, + 0xFD58, 0x9F52, 0xFD59, 0x9F53, 0xFD5A, 0x9F54, 0xFD5B, 0x9F55, 0xFD5C, 0x9F56, 0xFD5D, 0x9F57, 0xFD5E, 0x9F58, 0xFD5F, 0x9F59, + 0xFD60, 0x9F5A, 0xFD61, 0x9F5B, 0xFD62, 0x9F5C, 0xFD63, 0x9F5D, 0xFD64, 0x9F5E, 0xFD65, 0x9F5F, 0xFD66, 0x9F60, 0xFD67, 0x9F61, + 0xFD68, 0x9F62, 0xFD69, 0x9F63, 0xFD6A, 0x9F64, 0xFD6B, 0x9F65, 0xFD6C, 0x9F66, 0xFD6D, 0x9F67, 0xFD6E, 0x9F68, 0xFD6F, 0x9F69, + 0xFD70, 0x9F6A, 0xFD71, 0x9F6B, 0xFD72, 0x9F6C, 0xFD73, 0x9F6D, 0xFD74, 0x9F6E, 0xFD75, 0x9F6F, 0xFD76, 0x9F70, 0xFD77, 0x9F71, + 0xFD78, 0x9F72, 0xFD79, 0x9F73, 0xFD7A, 0x9F74, 0xFD7B, 0x9F75, 0xFD7C, 0x9F76, 0xFD7D, 0x9F77, 0xFD7E, 0x9F78, 0xFD80, 0x9F79, + 0xFD81, 0x9F7A, 0xFD82, 0x9F7B, 0xFD83, 0x9F7C, 0xFD84, 0x9F7D, 0xFD85, 0x9F7E, 0xFD86, 0x9F81, 0xFD87, 0x9F82, 0xFD88, 0x9F8D, + 0xFD89, 0x9F8E, 0xFD8A, 0x9F8F, 0xFD8B, 0x9F90, 0xFD8C, 0x9F91, 0xFD8D, 0x9F92, 0xFD8E, 0x9F93, 0xFD8F, 0x9F94, 0xFD90, 0x9F95, + 0xFD91, 0x9F96, 0xFD92, 0x9F97, 0xFD93, 0x9F98, 0xFD94, 0x9F9C, 0xFD95, 0x9F9D, 0xFD96, 0x9F9E, 0xFD97, 0x9FA1, 0xFD98, 0x9FA2, + 0xFD99, 0x9FA3, 0xFD9A, 0x9FA4, 0xFD9B, 0x9FA5, 0xFD9C, 0xF92C, 0xFD9D, 0xF979, 0xFD9E, 0xF995, 0xFD9F, 0xF9E7, 0xFDA0, 0xF9F1, + 0xFE40, 0xFA0C, 0xFE41, 0xFA0D, 0xFE42, 0xFA0E, 0xFE43, 0xFA0F, 0xFE44, 0xFA11, 0xFE45, 0xFA13, 0xFE46, 0xFA14, 0xFE47, 0xFA18, + 0xFE48, 0xFA1F, 0xFE49, 0xFA20, 0xFE4A, 0xFA21, 0xFE4B, 0xFA23, 0xFE4C, 0xFA24, 0xFE4D, 0xFA27, 0xFE4E, 0xFA28, 0xFE4F, 0xFA29, + 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 949 || FF_CODE_PAGE == 0 /* Korean */ +static const WCHAR uni2oem949[] = { /* Unicode --> Korean pairs */ + 0x00A1, 0xA2AE, 0x00A4, 0xA2B4, 0x00A7, 0xA1D7, 0x00A8, 0xA1A7, 0x00AA, 0xA8A3, 0x00AD, 0xA1A9, 0x00AE, 0xA2E7, 0x00B0, 0xA1C6, + 0x00B1, 0xA1BE, 0x00B2, 0xA9F7, 0x00B3, 0xA9F8, 0x00B4, 0xA2A5, 0x00B6, 0xA2D2, 0x00B7, 0xA1A4, 0x00B8, 0xA2AC, 0x00B9, 0xA9F6, + 0x00BA, 0xA8AC, 0x00BC, 0xA8F9, 0x00BD, 0xA8F6, 0x00BE, 0xA8FA, 0x00BF, 0xA2AF, 0x00C6, 0xA8A1, 0x00D0, 0xA8A2, 0x00D7, 0xA1BF, + 0x00D8, 0xA8AA, 0x00DE, 0xA8AD, 0x00DF, 0xA9AC, 0x00E6, 0xA9A1, 0x00F0, 0xA9A3, 0x00F7, 0xA1C0, 0x00F8, 0xA9AA, 0x00FE, 0xA9AD, + 0x0111, 0xA9A2, 0x0126, 0xA8A4, 0x0127, 0xA9A4, 0x0131, 0xA9A5, 0x0132, 0xA8A6, 0x0133, 0xA9A6, 0x0138, 0xA9A7, 0x013F, 0xA8A8, + 0x0140, 0xA9A8, 0x0141, 0xA8A9, 0x0142, 0xA9A9, 0x0149, 0xA9B0, 0x014A, 0xA8AF, 0x014B, 0xA9AF, 0x0152, 0xA8AB, 0x0153, 0xA9AB, + 0x0166, 0xA8AE, 0x0167, 0xA9AE, 0x02C7, 0xA2A7, 0x02D0, 0xA2B0, 0x02D8, 0xA2A8, 0x02D9, 0xA2AB, 0x02DA, 0xA2AA, 0x02DB, 0xA2AD, + 0x02DD, 0xA2A9, 0x0391, 0xA5C1, 0x0392, 0xA5C2, 0x0393, 0xA5C3, 0x0394, 0xA5C4, 0x0395, 0xA5C5, 0x0396, 0xA5C6, 0x0397, 0xA5C7, + 0x0398, 0xA5C8, 0x0399, 0xA5C9, 0x039A, 0xA5CA, 0x039B, 0xA5CB, 0x039C, 0xA5CC, 0x039D, 0xA5CD, 0x039E, 0xA5CE, 0x039F, 0xA5CF, + 0x03A0, 0xA5D0, 0x03A1, 0xA5D1, 0x03A3, 0xA5D2, 0x03A4, 0xA5D3, 0x03A5, 0xA5D4, 0x03A6, 0xA5D5, 0x03A7, 0xA5D6, 0x03A8, 0xA5D7, + 0x03A9, 0xA5D8, 0x03B1, 0xA5E1, 0x03B2, 0xA5E2, 0x03B3, 0xA5E3, 0x03B4, 0xA5E4, 0x03B5, 0xA5E5, 0x03B6, 0xA5E6, 0x03B7, 0xA5E7, + 0x03B8, 0xA5E8, 0x03B9, 0xA5E9, 0x03BA, 0xA5EA, 0x03BB, 0xA5EB, 0x03BC, 0xA5EC, 0x03BD, 0xA5ED, 0x03BE, 0xA5EE, 0x03BF, 0xA5EF, + 0x03C0, 0xA5F0, 0x03C1, 0xA5F1, 0x03C3, 0xA5F2, 0x03C4, 0xA5F3, 0x03C5, 0xA5F4, 0x03C6, 0xA5F5, 0x03C7, 0xA5F6, 0x03C8, 0xA5F7, + 0x03C9, 0xA5F8, 0x0401, 0xACA7, 0x0410, 0xACA1, 0x0411, 0xACA2, 0x0412, 0xACA3, 0x0413, 0xACA4, 0x0414, 0xACA5, 0x0415, 0xACA6, + 0x0416, 0xACA8, 0x0417, 0xACA9, 0x0418, 0xACAA, 0x0419, 0xACAB, 0x041A, 0xACAC, 0x041B, 0xACAD, 0x041C, 0xACAE, 0x041D, 0xACAF, + 0x041E, 0xACB0, 0x041F, 0xACB1, 0x0420, 0xACB2, 0x0421, 0xACB3, 0x0422, 0xACB4, 0x0423, 0xACB5, 0x0424, 0xACB6, 0x0425, 0xACB7, + 0x0426, 0xACB8, 0x0427, 0xACB9, 0x0428, 0xACBA, 0x0429, 0xACBB, 0x042A, 0xACBC, 0x042B, 0xACBD, 0x042C, 0xACBE, 0x042D, 0xACBF, + 0x042E, 0xACC0, 0x042F, 0xACC1, 0x0430, 0xACD1, 0x0431, 0xACD2, 0x0432, 0xACD3, 0x0433, 0xACD4, 0x0434, 0xACD5, 0x0435, 0xACD6, + 0x0436, 0xACD8, 0x0437, 0xACD9, 0x0438, 0xACDA, 0x0439, 0xACDB, 0x043A, 0xACDC, 0x043B, 0xACDD, 0x043C, 0xACDE, 0x043D, 0xACDF, + 0x043E, 0xACE0, 0x043F, 0xACE1, 0x0440, 0xACE2, 0x0441, 0xACE3, 0x0442, 0xACE4, 0x0443, 0xACE5, 0x0444, 0xACE6, 0x0445, 0xACE7, + 0x0446, 0xACE8, 0x0447, 0xACE9, 0x0448, 0xACEA, 0x0449, 0xACEB, 0x044A, 0xACEC, 0x044B, 0xACED, 0x044C, 0xACEE, 0x044D, 0xACEF, + 0x044E, 0xACF0, 0x044F, 0xACF1, 0x0451, 0xACD7, 0x2015, 0xA1AA, 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, + 0x2020, 0xA2D3, 0x2021, 0xA2D4, 0x2025, 0xA1A5, 0x2026, 0xA1A6, 0x2030, 0xA2B6, 0x2032, 0xA1C7, 0x2033, 0xA1C8, 0x203B, 0xA1D8, + 0x2074, 0xA9F9, 0x207F, 0xA9FA, 0x2081, 0xA9FB, 0x2082, 0xA9FC, 0x2083, 0xA9FD, 0x2084, 0xA9FE, 0x20AC, 0xA2E6, 0x2103, 0xA1C9, + 0x2109, 0xA2B5, 0x2113, 0xA7A4, 0x2116, 0xA2E0, 0x2121, 0xA2E5, 0x2122, 0xA2E2, 0x2126, 0xA7D9, 0x212B, 0xA1CA, 0x2153, 0xA8F7, + 0x2154, 0xA8F8, 0x215B, 0xA8FB, 0x215C, 0xA8FC, 0x215D, 0xA8FD, 0x215E, 0xA8FE, 0x2160, 0xA5B0, 0x2161, 0xA5B1, 0x2162, 0xA5B2, + 0x2163, 0xA5B3, 0x2164, 0xA5B4, 0x2165, 0xA5B5, 0x2166, 0xA5B6, 0x2167, 0xA5B7, 0x2168, 0xA5B8, 0x2169, 0xA5B9, 0x2170, 0xA5A1, + 0x2171, 0xA5A2, 0x2172, 0xA5A3, 0x2173, 0xA5A4, 0x2174, 0xA5A5, 0x2175, 0xA5A6, 0x2176, 0xA5A7, 0x2177, 0xA5A8, 0x2178, 0xA5A9, + 0x2179, 0xA5AA, 0x2190, 0xA1E7, 0x2191, 0xA1E8, 0x2192, 0xA1E6, 0x2193, 0xA1E9, 0x2194, 0xA1EA, 0x2195, 0xA2D5, 0x2196, 0xA2D8, + 0x2197, 0xA2D6, 0x2198, 0xA2D9, 0x2199, 0xA2D7, 0x21D2, 0xA2A1, 0x21D4, 0xA2A2, 0x2200, 0xA2A3, 0x2202, 0xA1D3, 0x2203, 0xA2A4, + 0x2207, 0xA1D4, 0x2208, 0xA1F4, 0x220B, 0xA1F5, 0x220F, 0xA2B3, 0x2211, 0xA2B2, 0x221A, 0xA1EE, 0x221D, 0xA1F0, 0x221E, 0xA1C4, + 0x2220, 0xA1D0, 0x2225, 0xA1AB, 0x2227, 0xA1FC, 0x2228, 0xA1FD, 0x2229, 0xA1FB, 0x222A, 0xA1FA, 0x222B, 0xA1F2, 0x222C, 0xA1F3, + 0x222E, 0xA2B1, 0x2234, 0xA1C5, 0x2235, 0xA1F1, 0x223C, 0xA1AD, 0x223D, 0xA1EF, 0x2252, 0xA1D6, 0x2260, 0xA1C1, 0x2261, 0xA1D5, + 0x2264, 0xA1C2, 0x2265, 0xA1C3, 0x226A, 0xA1EC, 0x226B, 0xA1ED, 0x2282, 0xA1F8, 0x2283, 0xA1F9, 0x2286, 0xA1F6, 0x2287, 0xA1F7, + 0x2299, 0xA2C1, 0x22A5, 0xA1D1, 0x2312, 0xA1D2, 0x2460, 0xA8E7, 0x2461, 0xA8E8, 0x2462, 0xA8E9, 0x2463, 0xA8EA, 0x2464, 0xA8EB, + 0x2465, 0xA8EC, 0x2466, 0xA8ED, 0x2467, 0xA8EE, 0x2468, 0xA8EF, 0x2469, 0xA8F0, 0x246A, 0xA8F1, 0x246B, 0xA8F2, 0x246C, 0xA8F3, + 0x246D, 0xA8F4, 0x246E, 0xA8F5, 0x2474, 0xA9E7, 0x2475, 0xA9E8, 0x2476, 0xA9E9, 0x2477, 0xA9EA, 0x2478, 0xA9EB, 0x2479, 0xA9EC, + 0x247A, 0xA9ED, 0x247B, 0xA9EE, 0x247C, 0xA9EF, 0x247D, 0xA9F0, 0x247E, 0xA9F1, 0x247F, 0xA9F2, 0x2480, 0xA9F3, 0x2481, 0xA9F4, + 0x2482, 0xA9F5, 0x249C, 0xA9CD, 0x249D, 0xA9CE, 0x249E, 0xA9CF, 0x249F, 0xA9D0, 0x24A0, 0xA9D1, 0x24A1, 0xA9D2, 0x24A2, 0xA9D3, + 0x24A3, 0xA9D4, 0x24A4, 0xA9D5, 0x24A5, 0xA9D6, 0x24A6, 0xA9D7, 0x24A7, 0xA9D8, 0x24A8, 0xA9D9, 0x24A9, 0xA9DA, 0x24AA, 0xA9DB, + 0x24AB, 0xA9DC, 0x24AC, 0xA9DD, 0x24AD, 0xA9DE, 0x24AE, 0xA9DF, 0x24AF, 0xA9E0, 0x24B0, 0xA9E1, 0x24B1, 0xA9E2, 0x24B2, 0xA9E3, + 0x24B3, 0xA9E4, 0x24B4, 0xA9E5, 0x24B5, 0xA9E6, 0x24D0, 0xA8CD, 0x24D1, 0xA8CE, 0x24D2, 0xA8CF, 0x24D3, 0xA8D0, 0x24D4, 0xA8D1, + 0x24D5, 0xA8D2, 0x24D6, 0xA8D3, 0x24D7, 0xA8D4, 0x24D8, 0xA8D5, 0x24D9, 0xA8D6, 0x24DA, 0xA8D7, 0x24DB, 0xA8D8, 0x24DC, 0xA8D9, + 0x24DD, 0xA8DA, 0x24DE, 0xA8DB, 0x24DF, 0xA8DC, 0x24E0, 0xA8DD, 0x24E1, 0xA8DE, 0x24E2, 0xA8DF, 0x24E3, 0xA8E0, 0x24E4, 0xA8E1, + 0x24E5, 0xA8E2, 0x24E6, 0xA8E3, 0x24E7, 0xA8E4, 0x24E8, 0xA8E5, 0x24E9, 0xA8E6, 0x2500, 0xA6A1, 0x2501, 0xA6AC, 0x2502, 0xA6A2, + 0x2503, 0xA6AD, 0x250C, 0xA6A3, 0x250D, 0xA6C8, 0x250E, 0xA6C7, 0x250F, 0xA6AE, 0x2510, 0xA6A4, 0x2511, 0xA6C2, 0x2512, 0xA6C1, + 0x2513, 0xA6AF, 0x2514, 0xA6A6, 0x2515, 0xA6C6, 0x2516, 0xA6C5, 0x2517, 0xA6B1, 0x2518, 0xA6A5, 0x2519, 0xA6C4, 0x251A, 0xA6C3, + 0x251B, 0xA6B0, 0x251C, 0xA6A7, 0x251D, 0xA6BC, 0x251E, 0xA6C9, 0x251F, 0xA6CA, 0x2520, 0xA6B7, 0x2521, 0xA6CB, 0x2522, 0xA6CC, + 0x2523, 0xA6B2, 0x2524, 0xA6A9, 0x2525, 0xA6BE, 0x2526, 0xA6CD, 0x2527, 0xA6CE, 0x2528, 0xA6B9, 0x2529, 0xA6CF, 0x252A, 0xA6D0, + 0x252B, 0xA6B4, 0x252C, 0xA6A8, 0x252D, 0xA6D1, 0x252E, 0xA6D2, 0x252F, 0xA6B8, 0x2530, 0xA6BD, 0x2531, 0xA6D3, 0x2532, 0xA6D4, + 0x2533, 0xA6B3, 0x2534, 0xA6AA, 0x2535, 0xA6D5, 0x2536, 0xA6D6, 0x2537, 0xA6BA, 0x2538, 0xA6BF, 0x2539, 0xA6D7, 0x253A, 0xA6D8, + 0x253B, 0xA6B5, 0x253C, 0xA6AB, 0x253D, 0xA6D9, 0x253E, 0xA6DA, 0x253F, 0xA6BB, 0x2540, 0xA6DB, 0x2541, 0xA6DC, 0x2542, 0xA6C0, + 0x2543, 0xA6DD, 0x2544, 0xA6DE, 0x2545, 0xA6DF, 0x2546, 0xA6E0, 0x2547, 0xA6E1, 0x2548, 0xA6E2, 0x2549, 0xA6E3, 0x254A, 0xA6E4, + 0x254B, 0xA6B6, 0x2592, 0xA2C6, 0x25A0, 0xA1E1, 0x25A1, 0xA1E0, 0x25A3, 0xA2C3, 0x25A4, 0xA2C7, 0x25A5, 0xA2C8, 0x25A6, 0xA2CB, + 0x25A7, 0xA2CA, 0x25A8, 0xA2C9, 0x25A9, 0xA2CC, 0x25B2, 0xA1E3, 0x25B3, 0xA1E2, 0x25B6, 0xA2BA, 0x25B7, 0xA2B9, 0x25BC, 0xA1E5, + 0x25BD, 0xA1E4, 0x25C0, 0xA2B8, 0x25C1, 0xA2B7, 0x25C6, 0xA1DF, 0x25C7, 0xA1DE, 0x25C8, 0xA2C2, 0x25CB, 0xA1DB, 0x25CE, 0xA1DD, + 0x25CF, 0xA1DC, 0x25D0, 0xA2C4, 0x25D1, 0xA2C5, 0x2605, 0xA1DA, 0x2606, 0xA1D9, 0x260E, 0xA2CF, 0x260F, 0xA2CE, 0x261C, 0xA2D0, + 0x261E, 0xA2D1, 0x2640, 0xA1CF, 0x2642, 0xA1CE, 0x2660, 0xA2BC, 0x2661, 0xA2BD, 0x2663, 0xA2C0, 0x2664, 0xA2BB, 0x2665, 0xA2BE, + 0x2667, 0xA2BF, 0x2668, 0xA2CD, 0x2669, 0xA2DB, 0x266A, 0xA2DC, 0x266C, 0xA2DD, 0x266D, 0xA2DA, 0x3000, 0xA1A1, 0x3001, 0xA1A2, + 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3008, 0xA1B4, 0x3009, 0xA1B5, 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BC, 0x3011, 0xA1BD, 0x3013, 0xA1EB, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3041, 0xAAA1, + 0x3042, 0xAAA2, 0x3043, 0xAAA3, 0x3044, 0xAAA4, 0x3045, 0xAAA5, 0x3046, 0xAAA6, 0x3047, 0xAAA7, 0x3048, 0xAAA8, 0x3049, 0xAAA9, + 0x304A, 0xAAAA, 0x304B, 0xAAAB, 0x304C, 0xAAAC, 0x304D, 0xAAAD, 0x304E, 0xAAAE, 0x304F, 0xAAAF, 0x3050, 0xAAB0, 0x3051, 0xAAB1, + 0x3052, 0xAAB2, 0x3053, 0xAAB3, 0x3054, 0xAAB4, 0x3055, 0xAAB5, 0x3056, 0xAAB6, 0x3057, 0xAAB7, 0x3058, 0xAAB8, 0x3059, 0xAAB9, + 0x305A, 0xAABA, 0x305B, 0xAABB, 0x305C, 0xAABC, 0x305D, 0xAABD, 0x305E, 0xAABE, 0x305F, 0xAABF, 0x3060, 0xAAC0, 0x3061, 0xAAC1, + 0x3062, 0xAAC2, 0x3063, 0xAAC3, 0x3064, 0xAAC4, 0x3065, 0xAAC5, 0x3066, 0xAAC6, 0x3067, 0xAAC7, 0x3068, 0xAAC8, 0x3069, 0xAAC9, + 0x306A, 0xAACA, 0x306B, 0xAACB, 0x306C, 0xAACC, 0x306D, 0xAACD, 0x306E, 0xAACE, 0x306F, 0xAACF, 0x3070, 0xAAD0, 0x3071, 0xAAD1, + 0x3072, 0xAAD2, 0x3073, 0xAAD3, 0x3074, 0xAAD4, 0x3075, 0xAAD5, 0x3076, 0xAAD6, 0x3077, 0xAAD7, 0x3078, 0xAAD8, 0x3079, 0xAAD9, + 0x307A, 0xAADA, 0x307B, 0xAADB, 0x307C, 0xAADC, 0x307D, 0xAADD, 0x307E, 0xAADE, 0x307F, 0xAADF, 0x3080, 0xAAE0, 0x3081, 0xAAE1, + 0x3082, 0xAAE2, 0x3083, 0xAAE3, 0x3084, 0xAAE4, 0x3085, 0xAAE5, 0x3086, 0xAAE6, 0x3087, 0xAAE7, 0x3088, 0xAAE8, 0x3089, 0xAAE9, + 0x308A, 0xAAEA, 0x308B, 0xAAEB, 0x308C, 0xAAEC, 0x308D, 0xAAED, 0x308E, 0xAAEE, 0x308F, 0xAAEF, 0x3090, 0xAAF0, 0x3091, 0xAAF1, + 0x3092, 0xAAF2, 0x3093, 0xAAF3, 0x30A1, 0xABA1, 0x30A2, 0xABA2, 0x30A3, 0xABA3, 0x30A4, 0xABA4, 0x30A5, 0xABA5, 0x30A6, 0xABA6, + 0x30A7, 0xABA7, 0x30A8, 0xABA8, 0x30A9, 0xABA9, 0x30AA, 0xABAA, 0x30AB, 0xABAB, 0x30AC, 0xABAC, 0x30AD, 0xABAD, 0x30AE, 0xABAE, + 0x30AF, 0xABAF, 0x30B0, 0xABB0, 0x30B1, 0xABB1, 0x30B2, 0xABB2, 0x30B3, 0xABB3, 0x30B4, 0xABB4, 0x30B5, 0xABB5, 0x30B6, 0xABB6, + 0x30B7, 0xABB7, 0x30B8, 0xABB8, 0x30B9, 0xABB9, 0x30BA, 0xABBA, 0x30BB, 0xABBB, 0x30BC, 0xABBC, 0x30BD, 0xABBD, 0x30BE, 0xABBE, + 0x30BF, 0xABBF, 0x30C0, 0xABC0, 0x30C1, 0xABC1, 0x30C2, 0xABC2, 0x30C3, 0xABC3, 0x30C4, 0xABC4, 0x30C5, 0xABC5, 0x30C6, 0xABC6, + 0x30C7, 0xABC7, 0x30C8, 0xABC8, 0x30C9, 0xABC9, 0x30CA, 0xABCA, 0x30CB, 0xABCB, 0x30CC, 0xABCC, 0x30CD, 0xABCD, 0x30CE, 0xABCE, + 0x30CF, 0xABCF, 0x30D0, 0xABD0, 0x30D1, 0xABD1, 0x30D2, 0xABD2, 0x30D3, 0xABD3, 0x30D4, 0xABD4, 0x30D5, 0xABD5, 0x30D6, 0xABD6, + 0x30D7, 0xABD7, 0x30D8, 0xABD8, 0x30D9, 0xABD9, 0x30DA, 0xABDA, 0x30DB, 0xABDB, 0x30DC, 0xABDC, 0x30DD, 0xABDD, 0x30DE, 0xABDE, + 0x30DF, 0xABDF, 0x30E0, 0xABE0, 0x30E1, 0xABE1, 0x30E2, 0xABE2, 0x30E3, 0xABE3, 0x30E4, 0xABE4, 0x30E5, 0xABE5, 0x30E6, 0xABE6, + 0x30E7, 0xABE7, 0x30E8, 0xABE8, 0x30E9, 0xABE9, 0x30EA, 0xABEA, 0x30EB, 0xABEB, 0x30EC, 0xABEC, 0x30ED, 0xABED, 0x30EE, 0xABEE, + 0x30EF, 0xABEF, 0x30F0, 0xABF0, 0x30F1, 0xABF1, 0x30F2, 0xABF2, 0x30F3, 0xABF3, 0x30F4, 0xABF4, 0x30F5, 0xABF5, 0x30F6, 0xABF6, + 0x3131, 0xA4A1, 0x3132, 0xA4A2, 0x3133, 0xA4A3, 0x3134, 0xA4A4, 0x3135, 0xA4A5, 0x3136, 0xA4A6, 0x3137, 0xA4A7, 0x3138, 0xA4A8, + 0x3139, 0xA4A9, 0x313A, 0xA4AA, 0x313B, 0xA4AB, 0x313C, 0xA4AC, 0x313D, 0xA4AD, 0x313E, 0xA4AE, 0x313F, 0xA4AF, 0x3140, 0xA4B0, + 0x3141, 0xA4B1, 0x3142, 0xA4B2, 0x3143, 0xA4B3, 0x3144, 0xA4B4, 0x3145, 0xA4B5, 0x3146, 0xA4B6, 0x3147, 0xA4B7, 0x3148, 0xA4B8, + 0x3149, 0xA4B9, 0x314A, 0xA4BA, 0x314B, 0xA4BB, 0x314C, 0xA4BC, 0x314D, 0xA4BD, 0x314E, 0xA4BE, 0x314F, 0xA4BF, 0x3150, 0xA4C0, + 0x3151, 0xA4C1, 0x3152, 0xA4C2, 0x3153, 0xA4C3, 0x3154, 0xA4C4, 0x3155, 0xA4C5, 0x3156, 0xA4C6, 0x3157, 0xA4C7, 0x3158, 0xA4C8, + 0x3159, 0xA4C9, 0x315A, 0xA4CA, 0x315B, 0xA4CB, 0x315C, 0xA4CC, 0x315D, 0xA4CD, 0x315E, 0xA4CE, 0x315F, 0xA4CF, 0x3160, 0xA4D0, + 0x3161, 0xA4D1, 0x3162, 0xA4D2, 0x3163, 0xA4D3, 0x3164, 0xA4D4, 0x3165, 0xA4D5, 0x3166, 0xA4D6, 0x3167, 0xA4D7, 0x3168, 0xA4D8, + 0x3169, 0xA4D9, 0x316A, 0xA4DA, 0x316B, 0xA4DB, 0x316C, 0xA4DC, 0x316D, 0xA4DD, 0x316E, 0xA4DE, 0x316F, 0xA4DF, 0x3170, 0xA4E0, + 0x3171, 0xA4E1, 0x3172, 0xA4E2, 0x3173, 0xA4E3, 0x3174, 0xA4E4, 0x3175, 0xA4E5, 0x3176, 0xA4E6, 0x3177, 0xA4E7, 0x3178, 0xA4E8, + 0x3179, 0xA4E9, 0x317A, 0xA4EA, 0x317B, 0xA4EB, 0x317C, 0xA4EC, 0x317D, 0xA4ED, 0x317E, 0xA4EE, 0x317F, 0xA4EF, 0x3180, 0xA4F0, + 0x3181, 0xA4F1, 0x3182, 0xA4F2, 0x3183, 0xA4F3, 0x3184, 0xA4F4, 0x3185, 0xA4F5, 0x3186, 0xA4F6, 0x3187, 0xA4F7, 0x3188, 0xA4F8, + 0x3189, 0xA4F9, 0x318A, 0xA4FA, 0x318B, 0xA4FB, 0x318C, 0xA4FC, 0x318D, 0xA4FD, 0x318E, 0xA4FE, 0x3200, 0xA9B1, 0x3201, 0xA9B2, + 0x3202, 0xA9B3, 0x3203, 0xA9B4, 0x3204, 0xA9B5, 0x3205, 0xA9B6, 0x3206, 0xA9B7, 0x3207, 0xA9B8, 0x3208, 0xA9B9, 0x3209, 0xA9BA, + 0x320A, 0xA9BB, 0x320B, 0xA9BC, 0x320C, 0xA9BD, 0x320D, 0xA9BE, 0x320E, 0xA9BF, 0x320F, 0xA9C0, 0x3210, 0xA9C1, 0x3211, 0xA9C2, + 0x3212, 0xA9C3, 0x3213, 0xA9C4, 0x3214, 0xA9C5, 0x3215, 0xA9C6, 0x3216, 0xA9C7, 0x3217, 0xA9C8, 0x3218, 0xA9C9, 0x3219, 0xA9CA, + 0x321A, 0xA9CB, 0x321B, 0xA9CC, 0x321C, 0xA2DF, 0x3260, 0xA8B1, 0x3261, 0xA8B2, 0x3262, 0xA8B3, 0x3263, 0xA8B4, 0x3264, 0xA8B5, + 0x3265, 0xA8B6, 0x3266, 0xA8B7, 0x3267, 0xA8B8, 0x3268, 0xA8B9, 0x3269, 0xA8BA, 0x326A, 0xA8BB, 0x326B, 0xA8BC, 0x326C, 0xA8BD, + 0x326D, 0xA8BE, 0x326E, 0xA8BF, 0x326F, 0xA8C0, 0x3270, 0xA8C1, 0x3271, 0xA8C2, 0x3272, 0xA8C3, 0x3273, 0xA8C4, 0x3274, 0xA8C5, + 0x3275, 0xA8C6, 0x3276, 0xA8C7, 0x3277, 0xA8C8, 0x3278, 0xA8C9, 0x3279, 0xA8CA, 0x327A, 0xA8CB, 0x327B, 0xA8CC, 0x327F, 0xA2DE, + 0x3380, 0xA7C9, 0x3381, 0xA7CA, 0x3382, 0xA7CB, 0x3383, 0xA7CC, 0x3384, 0xA7CD, 0x3388, 0xA7BA, 0x3389, 0xA7BB, 0x338A, 0xA7DC, + 0x338B, 0xA7DD, 0x338C, 0xA7DE, 0x338D, 0xA7B6, 0x338E, 0xA7B7, 0x338F, 0xA7B8, 0x3390, 0xA7D4, 0x3391, 0xA7D5, 0x3392, 0xA7D6, + 0x3393, 0xA7D7, 0x3394, 0xA7D8, 0x3395, 0xA7A1, 0x3396, 0xA7A2, 0x3397, 0xA7A3, 0x3398, 0xA7A5, 0x3399, 0xA7AB, 0x339A, 0xA7AC, + 0x339B, 0xA7AD, 0x339C, 0xA7AE, 0x339D, 0xA7AF, 0x339E, 0xA7B0, 0x339F, 0xA7B1, 0x33A0, 0xA7B2, 0x33A1, 0xA7B3, 0x33A2, 0xA7B4, + 0x33A3, 0xA7A7, 0x33A4, 0xA7A8, 0x33A5, 0xA7A9, 0x33A6, 0xA7AA, 0x33A7, 0xA7BD, 0x33A8, 0xA7BE, 0x33A9, 0xA7E5, 0x33AA, 0xA7E6, + 0x33AB, 0xA7E7, 0x33AC, 0xA7E8, 0x33AD, 0xA7E1, 0x33AE, 0xA7E2, 0x33AF, 0xA7E3, 0x33B0, 0xA7BF, 0x33B1, 0xA7C0, 0x33B2, 0xA7C1, + 0x33B3, 0xA7C2, 0x33B4, 0xA7C3, 0x33B5, 0xA7C4, 0x33B6, 0xA7C5, 0x33B7, 0xA7C6, 0x33B8, 0xA7C7, 0x33B9, 0xA7C8, 0x33BA, 0xA7CE, + 0x33BB, 0xA7CF, 0x33BC, 0xA7D0, 0x33BD, 0xA7D1, 0x33BE, 0xA7D2, 0x33BF, 0xA7D3, 0x33C0, 0xA7DA, 0x33C1, 0xA7DB, 0x33C2, 0xA2E3, + 0x33C3, 0xA7EC, 0x33C4, 0xA7A6, 0x33C5, 0xA7E0, 0x33C6, 0xA7EF, 0x33C7, 0xA2E1, 0x33C8, 0xA7BC, 0x33C9, 0xA7ED, 0x33CA, 0xA7B5, + 0x33CF, 0xA7B9, 0x33D0, 0xA7EA, 0x33D3, 0xA7EB, 0x33D6, 0xA7DF, 0x33D8, 0xA2E4, 0x33DB, 0xA7E4, 0x33DC, 0xA7EE, 0x33DD, 0xA7E9, + 0x4E00, 0xECE9, 0x4E01, 0xEFCB, 0x4E03, 0xF6D2, 0x4E07, 0xD8B2, 0x4E08, 0xEDDB, 0x4E09, 0xDFB2, 0x4E0A, 0xDFBE, 0x4E0B, 0xF9BB, + 0x4E0D, 0xDCF4, 0x4E11, 0xF5E4, 0x4E14, 0xF3A6, 0x4E15, 0xDDE0, 0x4E16, 0xE1A6, 0x4E18, 0xCEF8, 0x4E19, 0xDCB0, 0x4E1E, 0xE3AA, + 0x4E2D, 0xF1E9, 0x4E32, 0xCDFA, 0x4E38, 0xFCAF, 0x4E39, 0xD3A1, 0x4E3B, 0xF1AB, 0x4E42, 0xE7D1, 0x4E43, 0xD2AC, 0x4E45, 0xCEF9, + 0x4E4B, 0xF1FD, 0x4E4D, 0xDEBF, 0x4E4E, 0xFBBA, 0x4E4F, 0xF9B9, 0x4E56, 0xCED2, 0x4E58, 0xE3AB, 0x4E59, 0xEBE0, 0x4E5D, 0xCEFA, + 0x4E5E, 0xCBF7, 0x4E5F, 0xE5A5, 0x4E6B, 0xCAE1, 0x4E6D, 0xD4CC, 0x4E73, 0xEAE1, 0x4E76, 0xDCE3, 0x4E77, 0xDFAD, 0x4E7E, 0xCBEB, + 0x4E82, 0xD5AF, 0x4E86, 0xD6F5, 0x4E88, 0xE5F8, 0x4E8B, 0xDEC0, 0x4E8C, 0xECA3, 0x4E8E, 0xE9CD, 0x4E90, 0xEAA7, 0x4E91, 0xE9F6, + 0x4E92, 0xFBBB, 0x4E94, 0xE7E9, 0x4E95, 0xEFCC, 0x4E98, 0xD0E6, 0x4E9B, 0xDEC1, 0x4E9E, 0xE4AC, 0x4EA1, 0xD8CC, 0x4EA2, 0xF9F1, + 0x4EA4, 0xCEDF, 0x4EA5, 0xFAA4, 0x4EA6, 0xE6B2, 0x4EA8, 0xFAFB, 0x4EAB, 0xFABD, 0x4EAC, 0xCCC8, 0x4EAD, 0xEFCD, 0x4EAE, 0xD5D5, + 0x4EB6, 0xD3A2, 0x4EBA, 0xECD1, 0x4EC0, 0xE4A7, 0x4EC1, 0xECD2, 0x4EC4, 0xF6B1, 0x4EC7, 0xCEFB, 0x4ECA, 0xD0D1, 0x4ECB, 0xCBBF, + 0x4ECD, 0xEDA4, 0x4ED4, 0xEDA8, 0x4ED5, 0xDEC2, 0x4ED6, 0xF6E2, 0x4ED7, 0xEDDC, 0x4ED8, 0xDCF5, 0x4ED9, 0xE0B9, 0x4EDD, 0xD4CE, + 0x4EDF, 0xF4B5, 0x4EE3, 0xD3DB, 0x4EE4, 0xD6B5, 0x4EE5, 0xECA4, 0x4EF0, 0xE4E6, 0x4EF2, 0xF1EA, 0x4EF6, 0xCBEC, 0x4EF7, 0xCBC0, + 0x4EFB, 0xECF2, 0x4F01, 0xD0EA, 0x4F09, 0xF9F2, 0x4F0A, 0xECA5, 0x4F0B, 0xD0DF, 0x4F0D, 0xE7EA, 0x4F0E, 0xD0EB, 0x4F0F, 0xDCD1, + 0x4F10, 0xDBE9, 0x4F11, 0xFDCC, 0x4F2F, 0xDBD7, 0x4F34, 0xDAE1, 0x4F36, 0xD6B6, 0x4F38, 0xE3DF, 0x4F3A, 0xDEC3, 0x4F3C, 0xDEC4, + 0x4F3D, 0xCAA1, 0x4F43, 0xEEEC, 0x4F46, 0xD3A3, 0x4F47, 0xEEB7, 0x4F48, 0xF8CF, 0x4F4D, 0xEAC8, 0x4F4E, 0xEEB8, 0x4F4F, 0xF1AC, + 0x4F50, 0xF1A5, 0x4F51, 0xE9CE, 0x4F55, 0xF9BC, 0x4F59, 0xE5F9, 0x4F5A, 0xECEA, 0x4F5B, 0xDDD6, 0x4F5C, 0xEDC2, 0x4F69, 0xF8A5, + 0x4F6F, 0xE5BA, 0x4F70, 0xDBD8, 0x4F73, 0xCAA2, 0x4F76, 0xD1CD, 0x4F7A, 0xEEED, 0x4F7E, 0xECEB, 0x4F7F, 0xDEC5, 0x4F81, 0xE3E0, + 0x4F83, 0xCAC9, 0x4F84, 0xF2E9, 0x4F86, 0xD5CE, 0x4F88, 0xF6B6, 0x4F8A, 0xCEC2, 0x4F8B, 0xD6C7, 0x4F8D, 0xE3B4, 0x4F8F, 0xF1AD, + 0x4F91, 0xEAE2, 0x4F96, 0xD7C2, 0x4F98, 0xF3A7, 0x4F9B, 0xCDEA, 0x4F9D, 0xEBEE, 0x4FAE, 0xD9B2, 0x4FAF, 0xFDA5, 0x4FB5, 0xF6D5, + 0x4FB6, 0xD5E2, 0x4FBF, 0xF8B5, 0x4FC2, 0xCCF5, 0x4FC3, 0xF5B5, 0x4FC4, 0xE4AD, 0x4FC9, 0xE7EB, 0x4FCA, 0xF1D5, 0x4FCE, 0xF0BB, + 0x4FD1, 0xE9B5, 0x4FD3, 0xCCC9, 0x4FD4, 0xFAD5, 0x4FD7, 0xE1D4, 0x4FDA, 0xD7D6, 0x4FDD, 0xDCC1, 0x4FDF, 0xDEC6, 0x4FE0, 0xFAEF, + 0x4FE1, 0xE3E1, 0x4FEE, 0xE1F3, 0x4FEF, 0xDCF6, 0x4FF1, 0xCEFC, 0x4FF3, 0xDBC4, 0x4FF5, 0xF8F1, 0x4FF8, 0xDCE4, 0x4FFA, 0xE5EF, + 0x5002, 0xDCB1, 0x5006, 0xD5D6, 0x5009, 0xF3DA, 0x500B, 0xCBC1, 0x500D, 0xDBC3, 0x5011, 0xD9FA, 0x5012, 0xD3EE, 0x5016, 0xFAB8, + 0x5019, 0xFDA6, 0x501A, 0xEBEF, 0x501C, 0xF4A6, 0x501E, 0xCCCA, 0x501F, 0xF3A8, 0x5021, 0xF3DB, 0x5023, 0xDBA7, 0x5024, 0xF6B7, + 0x5026, 0xCFE6, 0x5027, 0xF0F2, 0x5028, 0xCBDA, 0x502A, 0xE7D2, 0x502B, 0xD7C3, 0x502C, 0xF6F0, 0x502D, 0xE8DE, 0x503B, 0xE5A6, + 0x5043, 0xE5E7, 0x5047, 0xCAA3, 0x5048, 0xCCA7, 0x5049, 0xEAC9, 0x504F, 0xF8B6, 0x5055, 0xFAA5, 0x505A, 0xF1AE, 0x505C, 0xEFCE, + 0x5065, 0xCBED, 0x5074, 0xF6B0, 0x5075, 0xEFCF, 0x5076, 0xE9CF, 0x5078, 0xF7DE, 0x5080, 0xCED3, 0x5085, 0xDCF7, 0x508D, 0xDBA8, + 0x5091, 0xCBF8, 0x5098, 0xDFA1, 0x5099, 0xDDE1, 0x50AC, 0xF5CA, 0x50AD, 0xE9B6, 0x50B2, 0xE7EC, 0x50B3, 0xEEEE, 0x50B5, 0xF3F0, + 0x50B7, 0xDFBF, 0x50BE, 0xCCCB, 0x50C5, 0xD0C1, 0x50C9, 0xF4D2, 0x50CA, 0xE0BA, 0x50CF, 0xDFC0, 0x50D1, 0xCEE0, 0x50D5, 0xDCD2, + 0x50D6, 0xFDEA, 0x50DA, 0xD6F6, 0x50DE, 0xEACA, 0x50E5, 0xE8E9, 0x50E7, 0xE3AC, 0x50ED, 0xF3D0, 0x50F9, 0xCAA4, 0x50FB, 0xDBF8, + 0x50FF, 0xDEC7, 0x5100, 0xEBF0, 0x5101, 0xF1D6, 0x5104, 0xE5E2, 0x5106, 0xCCCC, 0x5109, 0xCBFB, 0x5112, 0xEAE3, 0x511F, 0xDFC1, + 0x5121, 0xD6ED, 0x512A, 0xE9D0, 0x5132, 0xEEB9, 0x5137, 0xD5E3, 0x513A, 0xD1D3, 0x513C, 0xE5F0, 0x5140, 0xE8B4, 0x5141, 0xEBC3, + 0x5143, 0xEAAA, 0x5144, 0xFAFC, 0x5145, 0xF5F6, 0x5146, 0xF0BC, 0x5147, 0xFDD4, 0x5148, 0xE0BB, 0x5149, 0xCEC3, 0x514B, 0xD0BA, + 0x514C, 0xF7BA, 0x514D, 0xD8F3, 0x514E, 0xF7CD, 0x5152, 0xE4AE, 0x515C, 0xD4DF, 0x5162, 0xD0E7, 0x5165, 0xECFD, 0x5167, 0xD2AE, + 0x5168, 0xEEEF, 0x5169, 0xD5D7, 0x516A, 0xEAE4, 0x516B, 0xF8A2, 0x516C, 0xCDEB, 0x516D, 0xD7BF, 0x516E, 0xFBB1, 0x5171, 0xCDEC, + 0x5175, 0xDCB2, 0x5176, 0xD0EC, 0x5177, 0xCEFD, 0x5178, 0xEEF0, 0x517C, 0xCCC2, 0x5180, 0xD0ED, 0x5186, 0xE5F7, 0x518A, 0xF3FC, + 0x518D, 0xEEA2, 0x5192, 0xD9B3, 0x5195, 0xD8F4, 0x5197, 0xE9B7, 0x51A0, 0xCEAE, 0x51A5, 0xD9A2, 0x51AA, 0xD8F1, 0x51AC, 0xD4CF, + 0x51B6, 0xE5A7, 0x51B7, 0xD5D2, 0x51BD, 0xD6A9, 0x51C4, 0xF4A2, 0x51C6, 0xF1D7, 0x51C9, 0xD5D8, 0x51CB, 0xF0BD, 0x51CC, 0xD7D0, + 0x51CD, 0xD4D0, 0x51DC, 0xD7CF, 0x51DD, 0xEBEA, 0x51DE, 0xFDEB, 0x51E1, 0xDBED, 0x51F0, 0xFCC5, 0x51F1, 0xCBC2, 0x51F6, 0xFDD5, + 0x51F8, 0xF4C8, 0x51F9, 0xE8EA, 0x51FA, 0xF5F3, 0x51FD, 0xF9DE, 0x5200, 0xD3EF, 0x5203, 0xECD3, 0x5206, 0xDDC2, 0x5207, 0xEFB7, + 0x5208, 0xE7D4, 0x520A, 0xCACA, 0x520E, 0xD9FB, 0x5211, 0xFAFD, 0x5217, 0xD6AA, 0x521D, 0xF4F8, 0x5224, 0xF7F7, 0x5225, 0xDCAC, + 0x5229, 0xD7D7, 0x522A, 0xDFA2, 0x522E, 0xCEBE, 0x5230, 0xD3F0, 0x5236, 0xF0A4, 0x5237, 0xE1EC, 0x5238, 0xCFE7, 0x5239, 0xF3CB, + 0x523A, 0xEDA9, 0x523B, 0xCABE, 0x5243, 0xF4EF, 0x5247, 0xF6CE, 0x524A, 0xDEFB, 0x524B, 0xD0BB, 0x524C, 0xD5B7, 0x524D, 0xEEF1, + 0x5254, 0xF4A8, 0x5256, 0xDCF8, 0x525B, 0xCBA7, 0x525D, 0xDACE, 0x5261, 0xE0E6, 0x5269, 0xEDA5, 0x526A, 0xEEF2, 0x526F, 0xDCF9, + 0x5272, 0xF9DC, 0x5275, 0xF3DC, 0x527D, 0xF8F2, 0x527F, 0xF4F9, 0x5283, 0xFCF1, 0x5287, 0xD0BC, 0x5288, 0xDBF9, 0x5289, 0xD7B1, + 0x528D, 0xCBFC, 0x5291, 0xF0A5, 0x5292, 0xCBFD, 0x529B, 0xD5F4, 0x529F, 0xCDED, 0x52A0, 0xCAA5, 0x52A3, 0xD6AB, 0x52A4, 0xD0C2, + 0x52A9, 0xF0BE, 0x52AA, 0xD2BD, 0x52AB, 0xCCA4, 0x52BE, 0xFAB6, 0x52C1, 0xCCCD, 0x52C3, 0xDAFA, 0x52C5, 0xF6CF, 0x52C7, 0xE9B8, + 0x52C9, 0xD8F5, 0x52CD, 0xCCCE, 0x52D2, 0xD7CD, 0x52D5, 0xD4D1, 0x52D6, 0xE9ED, 0x52D8, 0xCAEB, 0x52D9, 0xD9E2, 0x52DB, 0xFDB2, + 0x52DD, 0xE3AD, 0x52DE, 0xD6CC, 0x52DF, 0xD9B4, 0x52E2, 0xE1A7, 0x52E3, 0xEED3, 0x52E4, 0xD0C3, 0x52F3, 0xFDB3, 0x52F5, 0xD5E4, + 0x52F8, 0xCFE8, 0x52FA, 0xEDC3, 0x52FB, 0xD0B2, 0x52FE, 0xCEFE, 0x52FF, 0xDAA8, 0x5305, 0xF8D0, 0x5308, 0xFDD6, 0x530D, 0xF8D1, + 0x530F, 0xF8D2, 0x5310, 0xDCD3, 0x5315, 0xDDE2, 0x5316, 0xFBF9, 0x5317, 0xDDC1, 0x5319, 0xE3B5, 0x5320, 0xEDDD, 0x5321, 0xCEC4, + 0x5323, 0xCBA1, 0x532A, 0xDDE3, 0x532F, 0xFCDD, 0x5339, 0xF9AF, 0x533F, 0xD2FB, 0x5340, 0xCFA1, 0x5341, 0xE4A8, 0x5343, 0xF4B6, + 0x5344, 0xECFE, 0x5347, 0xE3AE, 0x5348, 0xE7ED, 0x5349, 0xFDC1, 0x534A, 0xDAE2, 0x534D, 0xD8B3, 0x5351, 0xDDE4, 0x5352, 0xF0EF, + 0x5353, 0xF6F1, 0x5354, 0xFAF0, 0x5357, 0xD1F5, 0x535A, 0xDACF, 0x535C, 0xDCD4, 0x535E, 0xDCA6, 0x5360, 0xEFBF, 0x5366, 0xCECF, + 0x5368, 0xE0D9, 0x536F, 0xD9D6, 0x5370, 0xECD4, 0x5371, 0xEACB, 0x5374, 0xCABF, 0x5375, 0xD5B0, 0x5377, 0xCFE9, 0x537D, 0xF1ED, + 0x537F, 0xCCCF, 0x5384, 0xE4F8, 0x5393, 0xE4ED, 0x5398, 0xD7D8, 0x539A, 0xFDA7, 0x539F, 0xEAAB, 0x53A0, 0xF6B2, 0x53A5, 0xCFF0, + 0x53A6, 0xF9BD, 0x53AD, 0xE6F4, 0x53BB, 0xCBDB, 0x53C3, 0xF3D1, 0x53C8, 0xE9D1, 0x53C9, 0xF3A9, 0x53CA, 0xD0E0, 0x53CB, 0xE9D2, + 0x53CD, 0xDAE3, 0x53D4, 0xE2D2, 0x53D6, 0xF6A2, 0x53D7, 0xE1F4, 0x53DB, 0xDAE4, 0x53E1, 0xE7D5, 0x53E2, 0xF5BF, 0x53E3, 0xCFA2, + 0x53E4, 0xCDAF, 0x53E5, 0xCFA3, 0x53E9, 0xCDB0, 0x53EA, 0xF1FE, 0x53EB, 0xD0A3, 0x53EC, 0xE1AF, 0x53ED, 0xF8A3, 0x53EF, 0xCAA6, + 0x53F0, 0xF7BB, 0x53F1, 0xF2EA, 0x53F2, 0xDEC8, 0x53F3, 0xE9D3, 0x53F8, 0xDEC9, 0x5403, 0xFDDE, 0x5404, 0xCAC0, 0x5408, 0xF9EA, + 0x5409, 0xD1CE, 0x540A, 0xEED4, 0x540C, 0xD4D2, 0x540D, 0xD9A3, 0x540E, 0xFDA8, 0x540F, 0xD7D9, 0x5410, 0xF7CE, 0x5411, 0xFABE, + 0x541B, 0xCFD6, 0x541D, 0xD7F0, 0x541F, 0xEBE1, 0x5420, 0xF8C5, 0x5426, 0xDCFA, 0x5429, 0xDDC3, 0x542B, 0xF9DF, 0x5433, 0xE7EF, + 0x5438, 0xFDE5, 0x5439, 0xF6A3, 0x543B, 0xD9FC, 0x543C, 0xFDA9, 0x543E, 0xE7EE, 0x5442, 0xD5E5, 0x5448, 0xEFD0, 0x544A, 0xCDB1, + 0x5451, 0xF7A2, 0x5468, 0xF1B2, 0x546A, 0xF1B1, 0x5471, 0xCDB2, 0x5473, 0xDAAB, 0x5475, 0xCAA7, 0x547B, 0xE3E2, 0x547C, 0xFBBC, + 0x547D, 0xD9A4, 0x5480, 0xEEBA, 0x5486, 0xF8D3, 0x548C, 0xFBFA, 0x548E, 0xCFA4, 0x5490, 0xDCFB, 0x54A4, 0xF6E3, 0x54A8, 0xEDAA, + 0x54AB, 0xF2A1, 0x54AC, 0xCEE1, 0x54B3, 0xFAA6, 0x54B8, 0xF9E0, 0x54BD, 0xECD6, 0x54C0, 0xE4EE, 0x54C1, 0xF9A1, 0x54C4, 0xFBEF, + 0x54C8, 0xF9EB, 0x54C9, 0xEEA3, 0x54E1, 0xEAAC, 0x54E5, 0xCAA8, 0x54E8, 0xF4FA, 0x54ED, 0xCDD6, 0x54EE, 0xFCF6, 0x54F2, 0xF4C9, + 0x54FA, 0xF8D4, 0x5504, 0xF8A6, 0x5506, 0xDECA, 0x5507, 0xF2C6, 0x550E, 0xD7DA, 0x5510, 0xD3D0, 0x551C, 0xD8C5, 0x552F, 0xEAE6, + 0x5531, 0xF3DD, 0x5535, 0xE4DA, 0x553E, 0xF6E4, 0x5544, 0xF6F2, 0x5546, 0xDFC2, 0x554F, 0xD9FD, 0x5553, 0xCCF6, 0x5556, 0xD3BA, + 0x555E, 0xE4AF, 0x5563, 0xF9E1, 0x557C, 0xF0A6, 0x5580, 0xCBD3, 0x5584, 0xE0BC, 0x5586, 0xF4CA, 0x5587, 0xD4FA, 0x5589, 0xFDAA, + 0x558A, 0xF9E2, 0x5598, 0xF4B7, 0x5599, 0xFDC2, 0x559A, 0xFCB0, 0x559C, 0xFDEC, 0x559D, 0xCAE2, 0x55A7, 0xFDBD, 0x55A9, 0xEAE7, + 0x55AA, 0xDFC3, 0x55AB, 0xD1D2, 0x55AC, 0xCEE2, 0x55AE, 0xD3A4, 0x55C5, 0xFDAB, 0x55C7, 0xDFE0, 0x55D4, 0xF2C7, 0x55DA, 0xE7F0, + 0x55DC, 0xD0EE, 0x55DF, 0xF3AA, 0x55E3, 0xDECB, 0x55E4, 0xF6B8, 0x55FD, 0xE1F5, 0x55FE, 0xF1B3, 0x5606, 0xF7A3, 0x5609, 0xCAA9, + 0x5614, 0xCFA5, 0x5617, 0xDFC4, 0x562F, 0xE1B0, 0x5632, 0xF0BF, 0x5634, 0xF6A4, 0x5636, 0xE3B6, 0x5653, 0xFAC6, 0x5668, 0xD0EF, + 0x566B, 0xFDED, 0x5674, 0xDDC4, 0x5686, 0xFCF7, 0x56A5, 0xE6BF, 0x56AC, 0xDEAD, 0x56AE, 0xFABF, 0x56B4, 0xE5F1, 0x56BC, 0xEDC4, + 0x56CA, 0xD2A5, 0x56CD, 0xFDEE, 0x56D1, 0xF5B6, 0x56DA, 0xE1F6, 0x56DB, 0xDECC, 0x56DE, 0xFCDE, 0x56E0, 0xECD7, 0x56F0, 0xCDDD, + 0x56F9, 0xD6B7, 0x56FA, 0xCDB3, 0x5703, 0xF8D5, 0x5704, 0xE5D8, 0x5708, 0xCFEA, 0x570B, 0xCFD0, 0x570D, 0xEACC, 0x5712, 0xEAAE, + 0x5713, 0xEAAD, 0x5716, 0xD3F1, 0x5718, 0xD3A5, 0x571F, 0xF7CF, 0x5728, 0xEEA4, 0x572D, 0xD0A4, 0x5730, 0xF2A2, 0x573B, 0xD0F0, + 0x5740, 0xF2A3, 0x5742, 0xF7F8, 0x5747, 0xD0B3, 0x574A, 0xDBA9, 0x574D, 0xD3BB, 0x574E, 0xCAEC, 0x5750, 0xF1A6, 0x5751, 0xCBD5, + 0x5761, 0xF7E7, 0x5764, 0xCDDE, 0x5766, 0xF7A4, 0x576A, 0xF8C0, 0x576E, 0xD3DD, 0x5770, 0xCCD0, 0x5775, 0xCFA6, 0x577C, 0xF6F3, + 0x5782, 0xE1F7, 0x5788, 0xD3DC, 0x578B, 0xFAFE, 0x5793, 0xFAA7, 0x57A0, 0xEBD9, 0x57A2, 0xCFA7, 0x57A3, 0xEAAF, 0x57C3, 0xE4EF, + 0x57C7, 0xE9B9, 0x57C8, 0xF1D8, 0x57CB, 0xD8D8, 0x57CE, 0xE0F2, 0x57DF, 0xE6B4, 0x57E0, 0xDCFC, 0x57F0, 0xF3F1, 0x57F4, 0xE3D0, + 0x57F7, 0xF2FB, 0x57F9, 0xDBC6, 0x57FA, 0xD0F1, 0x57FC, 0xD0F2, 0x5800, 0xCFDC, 0x5802, 0xD3D1, 0x5805, 0xCCB1, 0x5806, 0xF7D8, + 0x5808, 0xCBA8, 0x5809, 0xEBBC, 0x580A, 0xE4BE, 0x581E, 0xF4DC, 0x5821, 0xDCC2, 0x5824, 0xF0A7, 0x5827, 0xE6C0, 0x582A, 0xCAED, + 0x582F, 0xE8EB, 0x5830, 0xE5E8, 0x5831, 0xDCC3, 0x5834, 0xEDDE, 0x5835, 0xD3F2, 0x583A, 0xCCF7, 0x584A, 0xCED4, 0x584B, 0xE7AB, + 0x584F, 0xCBC3, 0x5851, 0xE1B1, 0x5854, 0xF7B2, 0x5857, 0xD3F3, 0x5858, 0xD3D2, 0x585A, 0xF5C0, 0x585E, 0xDFDD, 0x5861, 0xEEF3, + 0x5862, 0xE7F1, 0x5864, 0xFDB4, 0x5875, 0xF2C8, 0x5879, 0xF3D2, 0x587C, 0xEEF4, 0x587E, 0xE2D3, 0x5883, 0xCCD1, 0x5885, 0xDFEA, + 0x5889, 0xE9BA, 0x5893, 0xD9D7, 0x589C, 0xF5CD, 0x589E, 0xF1F2, 0x589F, 0xFAC7, 0x58A8, 0xD9F8, 0x58A9, 0xD4C2, 0x58AE, 0xF6E5, + 0x58B3, 0xDDC5, 0x58BA, 0xE7F2, 0x58BB, 0xEDDF, 0x58BE, 0xCACB, 0x58C1, 0xDBFA, 0x58C5, 0xE8B5, 0x58C7, 0xD3A6, 0x58CE, 0xFDB5, + 0x58D1, 0xF9C9, 0x58D3, 0xE4E2, 0x58D5, 0xFBBD, 0x58D8, 0xD7A4, 0x58D9, 0xCEC5, 0x58DE, 0xCED5, 0x58DF, 0xD6E6, 0x58E4, 0xE5BD, + 0x58EB, 0xDECD, 0x58EC, 0xECF3, 0x58EF, 0xEDE0, 0x58F9, 0xECEC, 0x58FA, 0xFBBE, 0x58FB, 0xDFEB, 0x58FD, 0xE1F8, 0x590F, 0xF9BE, + 0x5914, 0xD0F3, 0x5915, 0xE0AA, 0x5916, 0xE8E2, 0x5919, 0xE2D4, 0x591A, 0xD2FD, 0x591C, 0xE5A8, 0x5922, 0xD9D3, 0x5927, 0xD3DE, + 0x5929, 0xF4B8, 0x592A, 0xF7BC, 0x592B, 0xDCFD, 0x592D, 0xE8EC, 0x592E, 0xE4E7, 0x5931, 0xE3F7, 0x5937, 0xECA8, 0x593E, 0xFAF1, + 0x5944, 0xE5F2, 0x5947, 0xD0F4, 0x5948, 0xD2AF, 0x5949, 0xDCE5, 0x594E, 0xD0A5, 0x594F, 0xF1B4, 0x5950, 0xFCB1, 0x5951, 0xCCF8, + 0x5954, 0xDDC6, 0x5955, 0xFAD1, 0x5957, 0xF7DF, 0x595A, 0xFAA8, 0x5960, 0xEEF5, 0x5962, 0xDECE, 0x5967, 0xE7F3, 0x596A, 0xF7AC, + 0x596B, 0xEBC4, 0x596C, 0xEDE1, 0x596D, 0xE0AB, 0x596E, 0xDDC7, 0x5973, 0xD2B3, 0x5974, 0xD2BF, 0x5978, 0xCACC, 0x597D, 0xFBBF, + 0x5982, 0xE5FD, 0x5983, 0xDDE5, 0x5984, 0xD8CD, 0x598A, 0xECF4, 0x5993, 0xD0F5, 0x5996, 0xE8ED, 0x5997, 0xD0D2, 0x5999, 0xD9D8, + 0x59A5, 0xF6E6, 0x59A8, 0xDBAA, 0x59AC, 0xF7E0, 0x59B9, 0xD8D9, 0x59BB, 0xF4A3, 0x59BE, 0xF4DD, 0x59C3, 0xEFD1, 0x59C6, 0xD9B5, + 0x59C9, 0xEDAB, 0x59CB, 0xE3B7, 0x59D0, 0xEEBB, 0x59D1, 0xCDB4, 0x59D3, 0xE0F3, 0x59D4, 0xEACD, 0x59D9, 0xECF5, 0x59DA, 0xE8EE, + 0x59DC, 0xCBA9, 0x59DD, 0xF1AF, 0x59E6, 0xCACD, 0x59E8, 0xECA9, 0x59EA, 0xF2EB, 0x59EC, 0xFDEF, 0x59EE, 0xF9F3, 0x59F8, 0xE6C1, + 0x59FB, 0xECD8, 0x59FF, 0xEDAC, 0x5A01, 0xEACE, 0x5A03, 0xE8DF, 0x5A11, 0xDECF, 0x5A18, 0xD2A6, 0x5A1B, 0xE7F4, 0x5A1C, 0xD1D6, + 0x5A1F, 0xE6C2, 0x5A20, 0xE3E3, 0x5A25, 0xE4B0, 0x5A29, 0xD8B4, 0x5A36, 0xF6A5, 0x5A3C, 0xF3DE, 0x5A41, 0xD7A5, 0x5A46, 0xF7E8, + 0x5A49, 0xE8C6, 0x5A5A, 0xFBE6, 0x5A62, 0xDDE6, 0x5A66, 0xDCFE, 0x5A92, 0xD8DA, 0x5A9A, 0xDAAC, 0x5A9B, 0xEAB0, 0x5AA4, 0xE3B8, + 0x5AC1, 0xCAAA, 0x5AC2, 0xE1F9, 0x5AC4, 0xEAB1, 0x5AC9, 0xF2EC, 0x5ACC, 0xFAEE, 0x5AE1, 0xEED5, 0x5AE6, 0xF9F4, 0x5AE9, 0xD2EC, + 0x5B05, 0xFBFB, 0x5B09, 0xFDF0, 0x5B0B, 0xE0BD, 0x5B0C, 0xCEE3, 0x5B16, 0xF8C6, 0x5B2A, 0xDEAE, 0x5B40, 0xDFC5, 0x5B43, 0xE5BE, + 0x5B50, 0xEDAD, 0x5B51, 0xFAEA, 0x5B54, 0xCDEE, 0x5B55, 0xEDA6, 0x5B57, 0xEDAE, 0x5B58, 0xF0ED, 0x5B5A, 0xDDA1, 0x5B5C, 0xEDAF, + 0x5B5D, 0xFCF8, 0x5B5F, 0xD8EB, 0x5B63, 0xCCF9, 0x5B64, 0xCDB5, 0x5B69, 0xFAA9, 0x5B6B, 0xE1DD, 0x5B70, 0xE2D5, 0x5B71, 0xEDCF, + 0x5B75, 0xDDA2, 0x5B78, 0xF9CA, 0x5B7A, 0xEAE8, 0x5B7C, 0xE5ED, 0x5B85, 0xD3EB, 0x5B87, 0xE9D4, 0x5B88, 0xE1FA, 0x5B89, 0xE4CC, + 0x5B8B, 0xE1E4, 0x5B8C, 0xE8C7, 0x5B8F, 0xCEDB, 0x5B93, 0xDCD5, 0x5B95, 0xF7B5, 0x5B96, 0xFCF3, 0x5B97, 0xF0F3, 0x5B98, 0xCEAF, + 0x5B99, 0xF1B5, 0x5B9A, 0xEFD2, 0x5B9B, 0xE8C8, 0x5B9C, 0xEBF1, 0x5BA2, 0xCBD4, 0x5BA3, 0xE0BE, 0x5BA4, 0xE3F8, 0x5BA5, 0xEAE9, + 0x5BA6, 0xFCB2, 0x5BAC, 0xE0F4, 0x5BAE, 0xCFE0, 0x5BB0, 0xEEA5, 0x5BB3, 0xFAAA, 0x5BB4, 0xE6C3, 0x5BB5, 0xE1B2, 0x5BB6, 0xCAAB, + 0x5BB8, 0xE3E4, 0x5BB9, 0xE9BB, 0x5BBF, 0xE2D6, 0x5BC0, 0xF3F2, 0x5BC2, 0xEED6, 0x5BC3, 0xEAB2, 0x5BC4, 0xD0F6, 0x5BC5, 0xECD9, + 0x5BC6, 0xDACB, 0x5BC7, 0xCFA8, 0x5BCC, 0xDDA3, 0x5BD0, 0xD8DB, 0x5BD2, 0xF9CE, 0x5BD3, 0xE9D5, 0x5BD4, 0xE3D1, 0x5BD7, 0xD2BC, + 0x5BDE, 0xD8AC, 0x5BDF, 0xF3CC, 0x5BE1, 0xCDFB, 0x5BE2, 0xF6D6, 0x5BE4, 0xE7F5, 0x5BE5, 0xE8EF, 0x5BE6, 0xE3F9, 0x5BE7, 0xD2BB, + 0x5BE8, 0xF3F3, 0x5BE9, 0xE3FB, 0x5BEB, 0xDED0, 0x5BEC, 0xCEB0, 0x5BEE, 0xD6F7, 0x5BEF, 0xF1D9, 0x5BF5, 0xF5C1, 0x5BF6, 0xDCC4, + 0x5BF8, 0xF5BB, 0x5BFA, 0xDED1, 0x5C01, 0xDCE6, 0x5C04, 0xDED2, 0x5C07, 0xEDE2, 0x5C08, 0xEEF6, 0x5C09, 0xEACF, 0x5C0A, 0xF0EE, + 0x5C0B, 0xE3FC, 0x5C0D, 0xD3DF, 0x5C0E, 0xD3F4, 0x5C0F, 0xE1B3, 0x5C11, 0xE1B4, 0x5C16, 0xF4D3, 0x5C19, 0xDFC6, 0x5C24, 0xE9D6, + 0x5C28, 0xDBAB, 0x5C31, 0xF6A6, 0x5C38, 0xE3B9, 0x5C39, 0xEBC5, 0x5C3A, 0xF4A9, 0x5C3B, 0xCDB6, 0x5C3C, 0xD2F9, 0x5C3E, 0xDAAD, + 0x5C3F, 0xD2E3, 0x5C40, 0xCFD1, 0x5C45, 0xCBDC, 0x5C46, 0xCCFA, 0x5C48, 0xCFDD, 0x5C4B, 0xE8A9, 0x5C4D, 0xE3BB, 0x5C4E, 0xE3BA, + 0x5C51, 0xE0DA, 0x5C55, 0xEEF7, 0x5C5B, 0xDCB3, 0x5C60, 0xD3F5, 0x5C62, 0xD7A6, 0x5C64, 0xF6B5, 0x5C65, 0xD7DB, 0x5C6C, 0xE1D5, + 0x5C6F, 0xD4EA, 0x5C71, 0xDFA3, 0x5C79, 0xFDDF, 0x5C90, 0xD0F7, 0x5C91, 0xEDD4, 0x5CA1, 0xCBAA, 0x5CA9, 0xE4DB, 0x5CAB, 0xE1FB, + 0x5CAC, 0xCBA2, 0x5CB1, 0xD3E0, 0x5CB3, 0xE4BF, 0x5CB5, 0xFBC0, 0x5CB7, 0xDABE, 0x5CB8, 0xE4CD, 0x5CBA, 0xD6B9, 0x5CBE, 0xEFC0, + 0x5CC0, 0xE1FC, 0x5CD9, 0xF6B9, 0x5CE0, 0xDFC7, 0x5CE8, 0xE4B1, 0x5CEF, 0xDCE7, 0x5CF0, 0xDCE8, 0x5CF4, 0xFAD6, 0x5CF6, 0xD3F6, + 0x5CFB, 0xF1DA, 0x5CFD, 0xFAF2, 0x5D07, 0xE2FD, 0x5D0D, 0xD5CF, 0x5D0E, 0xD0F8, 0x5D11, 0xCDDF, 0x5D14, 0xF5CB, 0x5D16, 0xE4F0, + 0x5D17, 0xCBAB, 0x5D19, 0xD7C4, 0x5D27, 0xE2FE, 0x5D29, 0xDDDA, 0x5D4B, 0xDAAE, 0x5D4C, 0xCAEE, 0x5D50, 0xD5B9, 0x5D69, 0xE3A1, + 0x5D6C, 0xE8E3, 0x5D6F, 0xF3AB, 0x5D87, 0xCFA9, 0x5D8B, 0xD3F7, 0x5D9D, 0xD4F1, 0x5DA0, 0xCEE4, 0x5DA2, 0xE8F2, 0x5DAA, 0xE5F5, + 0x5DB8, 0xE7AE, 0x5DBA, 0xD6BA, 0x5DBC, 0xDFEC, 0x5DBD, 0xE4C0, 0x5DCD, 0xE8E4, 0x5DD2, 0xD8B5, 0x5DD6, 0xE4DC, 0x5DDD, 0xF4B9, + 0x5DDE, 0xF1B6, 0x5DE1, 0xE2DE, 0x5DE2, 0xE1B5, 0x5DE5, 0xCDEF, 0x5DE6, 0xF1A7, 0x5DE7, 0xCEE5, 0x5DE8, 0xCBDD, 0x5DEB, 0xD9E3, + 0x5DEE, 0xF3AC, 0x5DF1, 0xD0F9, 0x5DF2, 0xECAB, 0x5DF3, 0xDED3, 0x5DF4, 0xF7E9, 0x5DF7, 0xF9F5, 0x5DFD, 0xE1DE, 0x5DFE, 0xCBEE, + 0x5E02, 0xE3BC, 0x5E03, 0xF8D6, 0x5E06, 0xDBEE, 0x5E0C, 0xFDF1, 0x5E11, 0xF7B6, 0x5E16, 0xF4DE, 0x5E19, 0xF2ED, 0x5E1B, 0xDBD9, + 0x5E1D, 0xF0A8, 0x5E25, 0xE1FD, 0x5E2B, 0xDED4, 0x5E2D, 0xE0AC, 0x5E33, 0xEDE3, 0x5E36, 0xD3E1, 0x5E38, 0xDFC8, 0x5E3D, 0xD9B6, + 0x5E3F, 0xFDAC, 0x5E40, 0xEFD3, 0x5E44, 0xE4C1, 0x5E45, 0xF8EB, 0x5E47, 0xDBAC, 0x5E4C, 0xFCC6, 0x5E55, 0xD8AD, 0x5E5F, 0xF6BA, + 0x5E61, 0xDBDF, 0x5E62, 0xD3D3, 0x5E63, 0xF8C7, 0x5E72, 0xCACE, 0x5E73, 0xF8C1, 0x5E74, 0xD2B4, 0x5E77, 0xDCB4, 0x5E78, 0xFAB9, + 0x5E79, 0xCACF, 0x5E7B, 0xFCB3, 0x5E7C, 0xEAEA, 0x5E7D, 0xEAEB, 0x5E7E, 0xD0FA, 0x5E84, 0xEDE4, 0x5E87, 0xDDE7, 0x5E8A, 0xDFC9, + 0x5E8F, 0xDFED, 0x5E95, 0xEEBC, 0x5E97, 0xEFC1, 0x5E9A, 0xCCD2, 0x5E9C, 0xDDA4, 0x5EA0, 0xDFCA, 0x5EA6, 0xD3F8, 0x5EA7, 0xF1A8, + 0x5EAB, 0xCDB7, 0x5EAD, 0xEFD4, 0x5EB5, 0xE4DD, 0x5EB6, 0xDFEE, 0x5EB7, 0xCBAC, 0x5EB8, 0xE9BC, 0x5EBE, 0xEAEC, 0x5EC2, 0xDFCB, + 0x5EC8, 0xF9BF, 0x5EC9, 0xD6AF, 0x5ECA, 0xD5C6, 0x5ED0, 0xCFAA, 0x5ED3, 0xCEA9, 0x5ED6, 0xD6F8, 0x5EDA, 0xF1B7, 0x5EDB, 0xEEF8, + 0x5EDF, 0xD9D9, 0x5EE0, 0xF3DF, 0x5EE2, 0xF8C8, 0x5EE3, 0xCEC6, 0x5EEC, 0xD5E6, 0x5EF3, 0xF4E6, 0x5EF6, 0xE6C5, 0x5EF7, 0xEFD5, + 0x5EFA, 0xCBEF, 0x5EFB, 0xFCDF, 0x5F01, 0xDCA7, 0x5F04, 0xD6E7, 0x5F0A, 0xF8C9, 0x5F0F, 0xE3D2, 0x5F11, 0xE3BD, 0x5F13, 0xCFE1, + 0x5F14, 0xF0C0, 0x5F15, 0xECDA, 0x5F17, 0xDDD7, 0x5F18, 0xFBF0, 0x5F1B, 0xECAC, 0x5F1F, 0xF0A9, 0x5F26, 0xFAD7, 0x5F27, 0xFBC1, + 0x5F29, 0xD2C0, 0x5F31, 0xE5B0, 0x5F35, 0xEDE5, 0x5F3A, 0xCBAD, 0x5F3C, 0xF9B0, 0x5F48, 0xF7A5, 0x5F4A, 0xCBAE, 0x5F4C, 0xDAAF, + 0x5F4E, 0xD8B6, 0x5F56, 0xD3A7, 0x5F57, 0xFBB2, 0x5F59, 0xFDC4, 0x5F5B, 0xECAD, 0x5F62, 0xFBA1, 0x5F66, 0xE5E9, 0x5F67, 0xE9EE, + 0x5F69, 0xF3F4, 0x5F6A, 0xF8F3, 0x5F6B, 0xF0C1, 0x5F6C, 0xDEAF, 0x5F6D, 0xF8B0, 0x5F70, 0xF3E0, 0x5F71, 0xE7AF, 0x5F77, 0xDBAD, + 0x5F79, 0xE6B5, 0x5F7C, 0xF9A8, 0x5F7F, 0xDDD8, 0x5F80, 0xE8D9, 0x5F81, 0xEFD6, 0x5F85, 0xD3E2, 0x5F87, 0xE2DF, 0x5F8A, 0xFCE0, + 0x5F8B, 0xD7C8, 0x5F8C, 0xFDAD, 0x5F90, 0xDFEF, 0x5F91, 0xCCD3, 0x5F92, 0xD3F9, 0x5F97, 0xD4F0, 0x5F98, 0xDBC7, 0x5F99, 0xDED5, + 0x5F9E, 0xF0F4, 0x5FA0, 0xD5D0, 0x5FA1, 0xE5D9, 0x5FA8, 0xFCC7, 0x5FA9, 0xDCD6, 0x5FAA, 0xE2E0, 0x5FAE, 0xDAB0, 0x5FB5, 0xF3A3, + 0x5FB7, 0xD3EC, 0x5FB9, 0xF4CB, 0x5FBD, 0xFDC5, 0x5FC3, 0xE3FD, 0x5FC5, 0xF9B1, 0x5FCC, 0xD0FB, 0x5FCD, 0xECDB, 0x5FD6, 0xF5BC, + 0x5FD7, 0xF2A4, 0x5FD8, 0xD8CE, 0x5FD9, 0xD8CF, 0x5FE0, 0xF5F7, 0x5FEB, 0xF6E1, 0x5FF5, 0xD2B7, 0x5FFD, 0xFBEC, 0x5FFF, 0xDDC8, + 0x600F, 0xE4E8, 0x6012, 0xD2C1, 0x6016, 0xF8D7, 0x601C, 0xD6BB, 0x601D, 0xDED6, 0x6020, 0xF7BD, 0x6021, 0xECAE, 0x6025, 0xD0E1, + 0x6027, 0xE0F5, 0x6028, 0xEAB3, 0x602A, 0xCED6, 0x602F, 0xCCA5, 0x6041, 0xECF6, 0x6042, 0xE2E1, 0x6043, 0xE3BE, 0x604D, 0xFCC8, + 0x6050, 0xCDF0, 0x6052, 0xF9F6, 0x6055, 0xDFF0, 0x6059, 0xE5BF, 0x605D, 0xCEBF, 0x6062, 0xFCE1, 0x6063, 0xEDB0, 0x6064, 0xFDD1, + 0x6065, 0xF6BB, 0x6068, 0xF9CF, 0x6069, 0xEBDA, 0x606A, 0xCAC1, 0x606C, 0xD2B8, 0x606D, 0xCDF1, 0x606F, 0xE3D3, 0x6070, 0xFDE6, + 0x6085, 0xE6ED, 0x6089, 0xE3FA, 0x608C, 0xF0AA, 0x608D, 0xF9D0, 0x6094, 0xFCE2, 0x6096, 0xF8A7, 0x609A, 0xE1E5, 0x609B, 0xEEF9, + 0x609F, 0xE7F6, 0x60A0, 0xEAED, 0x60A3, 0xFCB4, 0x60A4, 0xF5C2, 0x60A7, 0xD7DC, 0x60B0, 0xF0F5, 0x60B2, 0xDDE8, 0x60B3, 0xD3ED, + 0x60B4, 0xF5FC, 0x60B6, 0xDABF, 0x60B8, 0xCCFB, 0x60BC, 0xD3FA, 0x60BD, 0xF4A4, 0x60C5, 0xEFD7, 0x60C7, 0xD4C3, 0x60D1, 0xFBE3, + 0x60DA, 0xFBED, 0x60DC, 0xE0AD, 0x60DF, 0xEAEE, 0x60E0, 0xFBB3, 0x60E1, 0xE4C2, 0x60F0, 0xF6E7, 0x60F1, 0xD2DD, 0x60F3, 0xDFCC, + 0x60F6, 0xFCC9, 0x60F9, 0xE5A9, 0x60FA, 0xE0F6, 0x60FB, 0xF6B3, 0x6101, 0xE1FE, 0x6106, 0xCBF0, 0x6108, 0xEAEF, 0x6109, 0xEAF0, + 0x610D, 0xDAC0, 0x610E, 0xF8B4, 0x610F, 0xEBF2, 0x6115, 0xE4C3, 0x611A, 0xE9D7, 0x611B, 0xE4F1, 0x611F, 0xCAEF, 0x6127, 0xCED7, + 0x6130, 0xFCCA, 0x6134, 0xF3E1, 0x6137, 0xCBC4, 0x613C, 0xE3E5, 0x613E, 0xCBC5, 0x613F, 0xEAB4, 0x6142, 0xE9BD, 0x6144, 0xD7C9, + 0x6147, 0xEBDB, 0x6148, 0xEDB1, 0x614A, 0xCCC3, 0x614B, 0xF7BE, 0x614C, 0xFCCB, 0x6153, 0xF8F4, 0x6155, 0xD9B7, 0x6158, 0xF3D3, + 0x6159, 0xF3D4, 0x615D, 0xF7E4, 0x615F, 0xF7D1, 0x6162, 0xD8B7, 0x6163, 0xCEB1, 0x6164, 0xCAC2, 0x6167, 0xFBB4, 0x6168, 0xCBC6, + 0x616B, 0xF0F6, 0x616E, 0xD5E7, 0x6170, 0xEAD0, 0x6176, 0xCCD4, 0x6177, 0xCBAF, 0x617D, 0xF4AA, 0x617E, 0xE9AF, 0x6181, 0xF5C3, + 0x6182, 0xE9D8, 0x618A, 0xDDE9, 0x618E, 0xF1F3, 0x6190, 0xD5FB, 0x6191, 0xDEBB, 0x6194, 0xF4FB, 0x6198, 0xFDF3, 0x6199, 0xFDF2, + 0x619A, 0xF7A6, 0x61A4, 0xDDC9, 0x61A7, 0xD4D3, 0x61A9, 0xCCA8, 0x61AB, 0xDAC1, 0x61AC, 0xCCD5, 0x61AE, 0xD9E4, 0x61B2, 0xFACA, + 0x61B6, 0xE5E3, 0x61BA, 0xD3BC, 0x61BE, 0xCAF0, 0x61C3, 0xD0C4, 0x61C7, 0xCAD0, 0x61C8, 0xFAAB, 0x61C9, 0xEBEB, 0x61CA, 0xE7F8, + 0x61CB, 0xD9E5, 0x61E6, 0xD1D7, 0x61F2, 0xF3A4, 0x61F6, 0xD4FB, 0x61F7, 0xFCE3, 0x61F8, 0xFAD8, 0x61FA, 0xF3D5, 0x61FC, 0xCFAB, + 0x61FF, 0xEBF3, 0x6200, 0xD5FC, 0x6207, 0xD3D4, 0x6208, 0xCDFC, 0x620A, 0xD9E6, 0x620C, 0xE2F9, 0x620D, 0xE2A1, 0x620E, 0xEBD4, + 0x6210, 0xE0F7, 0x6211, 0xE4B2, 0x6212, 0xCCFC, 0x6216, 0xFBE4, 0x621A, 0xF4AB, 0x621F, 0xD0BD, 0x6221, 0xCAF1, 0x622A, 0xEFB8, + 0x622E, 0xD7C0, 0x6230, 0xEEFA, 0x6231, 0xFDF4, 0x6234, 0xD3E3, 0x6236, 0xFBC2, 0x623E, 0xD5E8, 0x623F, 0xDBAE, 0x6240, 0xE1B6, + 0x6241, 0xF8B7, 0x6247, 0xE0BF, 0x6248, 0xFBC3, 0x6249, 0xDDEA, 0x624B, 0xE2A2, 0x624D, 0xEEA6, 0x6253, 0xF6E8, 0x6258, 0xF6F5, + 0x626E, 0xDDCA, 0x6271, 0xD0E2, 0x6276, 0xDDA6, 0x6279, 0xDDEB, 0x627C, 0xE4F9, 0x627F, 0xE3AF, 0x6280, 0xD0FC, 0x6284, 0xF4FC, + 0x6289, 0xCCBC, 0x628A, 0xF7EA, 0x6291, 0xE5E4, 0x6292, 0xDFF1, 0x6295, 0xF7E1, 0x6297, 0xF9F7, 0x6298, 0xEFB9, 0x629B, 0xF8D8, + 0x62AB, 0xF9A9, 0x62B1, 0xF8D9, 0x62B5, 0xEEBD, 0x62B9, 0xD8C6, 0x62BC, 0xE4E3, 0x62BD, 0xF5CE, 0x62C2, 0xDDD9, 0x62C7, 0xD9E7, + 0x62C8, 0xD2B9, 0x62C9, 0xD5C3, 0x62CC, 0xDAE5, 0x62CD, 0xDAD0, 0x62CF, 0xD1D9, 0x62D0, 0xCED8, 0x62D2, 0xCBDE, 0x62D3, 0xF4AC, + 0x62D4, 0xDAFB, 0x62D6, 0xF6E9, 0x62D7, 0xE8F3, 0x62D8, 0xCFAC, 0x62D9, 0xF0F0, 0x62DB, 0xF4FD, 0x62DC, 0xDBC8, 0x62EC, 0xCEC0, + 0x62ED, 0xE3D4, 0x62EE, 0xD1CF, 0x62EF, 0xF1F5, 0x62F1, 0xCDF2, 0x62F3, 0xCFEB, 0x62F7, 0xCDB8, 0x62FE, 0xE3A6, 0x62FF, 0xD1DA, + 0x6301, 0xF2A5, 0x6307, 0xF2A6, 0x6309, 0xE4CE, 0x6311, 0xD3FB, 0x632B, 0xF1A9, 0x632F, 0xF2C9, 0x633A, 0xEFD8, 0x633B, 0xE6C9, + 0x633D, 0xD8B8, 0x633E, 0xFAF3, 0x6349, 0xF3B5, 0x634C, 0xF8A4, 0x634F, 0xD1F3, 0x6350, 0xE6C8, 0x6355, 0xF8DA, 0x6367, 0xDCE9, + 0x6368, 0xDED7, 0x636E, 0xCBDF, 0x6372, 0xCFEC, 0x6377, 0xF4DF, 0x637A, 0xD1F4, 0x637B, 0xD2BA, 0x637F, 0xDFF2, 0x6383, 0xE1B7, + 0x6388, 0xE2A3, 0x6389, 0xD3FC, 0x638C, 0xEDE6, 0x6392, 0xDBC9, 0x6396, 0xE4FA, 0x6398, 0xCFDE, 0x639B, 0xCED0, 0x63A0, 0xD5D3, + 0x63A1, 0xF3F5, 0x63A2, 0xF7AE, 0x63A5, 0xEFC8, 0x63A7, 0xCDF3, 0x63A8, 0xF5CF, 0x63A9, 0xE5F3, 0x63AA, 0xF0C2, 0x63C0, 0xCAD1, + 0x63C4, 0xEAF1, 0x63C6, 0xD0A6, 0x63CF, 0xD9DA, 0x63D0, 0xF0AB, 0x63D6, 0xEBE7, 0x63DA, 0xE5C0, 0x63DB, 0xFCB5, 0x63E1, 0xE4C4, + 0x63ED, 0xCCA9, 0x63EE, 0xFDC6, 0x63F4, 0xEAB5, 0x63F6, 0xE5AA, 0x63F7, 0xDFBA, 0x640D, 0xE1DF, 0x640F, 0xDAD1, 0x6414, 0xE1B8, + 0x6416, 0xE8F4, 0x6417, 0xD3FD, 0x641C, 0xE2A4, 0x6422, 0xF2CA, 0x642C, 0xDAE6, 0x642D, 0xF7B3, 0x643A, 0xFDCD, 0x643E, 0xF3B6, + 0x6458, 0xEED7, 0x6460, 0xF5C4, 0x6469, 0xD8A4, 0x646F, 0xF2A7, 0x6478, 0xD9B8, 0x6479, 0xD9B9, 0x647A, 0xEFC9, 0x6488, 0xD6CE, + 0x6491, 0xF7CB, 0x6492, 0xDFAE, 0x6493, 0xE8F5, 0x649A, 0xD2B5, 0x649E, 0xD3D5, 0x64A4, 0xF4CC, 0x64A5, 0xDAFC, 0x64AB, 0xD9E8, + 0x64AD, 0xF7EB, 0x64AE, 0xF5C9, 0x64B0, 0xF3BC, 0x64B2, 0xDAD2, 0x64BB, 0xD3B5, 0x64C1, 0xE8B6, 0x64C4, 0xD6CF, 0x64C5, 0xF4BA, + 0x64C7, 0xF7C9, 0x64CA, 0xCCAA, 0x64CD, 0xF0C3, 0x64CE, 0xCCD6, 0x64D2, 0xD0D3, 0x64D4, 0xD3BD, 0x64D8, 0xDBFB, 0x64DA, 0xCBE0, + 0x64E1, 0xD3E4, 0x64E2, 0xF6F7, 0x64E5, 0xD5BA, 0x64E6, 0xF3CD, 0x64E7, 0xCBE1, 0x64EC, 0xEBF4, 0x64F2, 0xF4AD, 0x64F4, 0xFCAA, + 0x64FA, 0xF7EC, 0x64FE, 0xE8F6, 0x6500, 0xDAE7, 0x6504, 0xF7CC, 0x6518, 0xE5C1, 0x651D, 0xE0EE, 0x6523, 0xD5FD, 0x652A, 0xCEE6, + 0x652B, 0xFCAB, 0x652C, 0xD5BB, 0x652F, 0xF2A8, 0x6536, 0xE2A5, 0x6537, 0xCDB9, 0x6538, 0xEAF2, 0x6539, 0xCBC7, 0x653B, 0xCDF4, + 0x653E, 0xDBAF, 0x653F, 0xEFD9, 0x6545, 0xCDBA, 0x6548, 0xFCF9, 0x654D, 0xDFF3, 0x654E, 0xCEE7, 0x654F, 0xDAC2, 0x6551, 0xCFAD, + 0x6556, 0xE7F9, 0x6557, 0xF8A8, 0x655E, 0xF3E2, 0x6562, 0xCAF2, 0x6563, 0xDFA4, 0x6566, 0xD4C4, 0x656C, 0xCCD7, 0x656D, 0xE5C2, + 0x6572, 0xCDBB, 0x6574, 0xEFDA, 0x6575, 0xEED8, 0x6577, 0xDDA7, 0x6578, 0xE2A6, 0x657E, 0xE0C0, 0x6582, 0xD6B0, 0x6583, 0xF8CA, + 0x6585, 0xFCFA, 0x6587, 0xD9FE, 0x658C, 0xDEB0, 0x6590, 0xDDEC, 0x6591, 0xDAE8, 0x6597, 0xD4E0, 0x6599, 0xD6F9, 0x659B, 0xCDD7, + 0x659C, 0xDED8, 0x659F, 0xF2F8, 0x65A1, 0xE4D6, 0x65A4, 0xD0C5, 0x65A5, 0xF4AE, 0x65A7, 0xDDA8, 0x65AB, 0xEDC5, 0x65AC, 0xF3D6, + 0x65AF, 0xDED9, 0x65B0, 0xE3E6, 0x65B7, 0xD3A8, 0x65B9, 0xDBB0, 0x65BC, 0xE5DA, 0x65BD, 0xE3BF, 0x65C1, 0xDBB1, 0x65C5, 0xD5E9, + 0x65CB, 0xE0C1, 0x65CC, 0xEFDB, 0x65CF, 0xF0E9, 0x65D2, 0xD7B2, 0x65D7, 0xD0FD, 0x65E0, 0xD9E9, 0x65E3, 0xD0FE, 0x65E5, 0xECED, + 0x65E6, 0xD3A9, 0x65E8, 0xF2A9, 0x65E9, 0xF0C4, 0x65EC, 0xE2E2, 0x65ED, 0xE9EF, 0x65F1, 0xF9D1, 0x65F4, 0xE9D9, 0x65FA, 0xE8DA, + 0x65FB, 0xDAC3, 0x65FC, 0xDAC4, 0x65FD, 0xD4C5, 0x65FF, 0xE7FA, 0x6606, 0xCDE0, 0x6607, 0xE3B0, 0x6609, 0xDBB2, 0x660A, 0xFBC4, + 0x660C, 0xF3E3, 0x660E, 0xD9A5, 0x660F, 0xFBE7, 0x6610, 0xDDCB, 0x6611, 0xD0D4, 0x6613, 0xE6B6, 0x6614, 0xE0AE, 0x6615, 0xFDDA, + 0x661E, 0xDCB5, 0x661F, 0xE0F8, 0x6620, 0xE7B1, 0x6625, 0xF5F0, 0x6627, 0xD8DC, 0x6628, 0xEDC6, 0x662D, 0xE1B9, 0x662F, 0xE3C0, + 0x6630, 0xF9C0, 0x6631, 0xE9F0, 0x6634, 0xD9DB, 0x6636, 0xF3E4, 0x663A, 0xDCB6, 0x663B, 0xE4E9, 0x6641, 0xF0C5, 0x6642, 0xE3C1, + 0x6643, 0xFCCC, 0x6644, 0xFCCD, 0x6649, 0xF2CB, 0x664B, 0xF2CC, 0x664F, 0xE4CF, 0x6659, 0xF1DB, 0x665B, 0xFAD9, 0x665D, 0xF1B8, + 0x665E, 0xFDF5, 0x665F, 0xE0F9, 0x6664, 0xE7FB, 0x6665, 0xFCB7, 0x6666, 0xFCE4, 0x6667, 0xFBC5, 0x6668, 0xE3E7, 0x6669, 0xD8B9, + 0x666B, 0xF6F8, 0x666E, 0xDCC5, 0x666F, 0xCCD8, 0x6673, 0xE0AF, 0x6674, 0xF4E7, 0x6676, 0xEFDC, 0x6677, 0xCFFC, 0x6678, 0xEFDD, + 0x667A, 0xF2AA, 0x6684, 0xFDBE, 0x6687, 0xCAAC, 0x6688, 0xFDBB, 0x6689, 0xFDC7, 0x668E, 0xE7B2, 0x6690, 0xEAD1, 0x6691, 0xDFF4, + 0x6696, 0xD1EC, 0x6697, 0xE4DE, 0x6698, 0xE5C3, 0x669D, 0xD9A6, 0x66A0, 0xCDBC, 0x66A2, 0xF3E5, 0x66AB, 0xEDD5, 0x66AE, 0xD9BA, + 0x66B2, 0xEDE7, 0x66B3, 0xFBB5, 0x66B4, 0xF8EC, 0x66B9, 0xE0E7, 0x66BB, 0xCCD9, 0x66BE, 0xD4C6, 0x66C4, 0xE7A5, 0x66C6, 0xD5F5, + 0x66C7, 0xD3BE, 0x66C9, 0xFCFB, 0x66D6, 0xE4F2, 0x66D9, 0xDFF5, 0x66DC, 0xE8F8, 0x66DD, 0xF8ED, 0x66E0, 0xCEC7, 0x66E6, 0xFDF6, + 0x66F0, 0xE8D8, 0x66F2, 0xCDD8, 0x66F3, 0xE7D6, 0x66F4, 0xCCDA, 0x66F7, 0xCAE3, 0x66F8, 0xDFF6, 0x66F9, 0xF0C7, 0x66FA, 0xF0C6, + 0x66FC, 0xD8BA, 0x66FE, 0xF1F4, 0x66FF, 0xF4F0, 0x6700, 0xF5CC, 0x6703, 0xFCE5, 0x6708, 0xEAC5, 0x6709, 0xEAF3, 0x670B, 0xDDDB, + 0x670D, 0xDCD7, 0x6714, 0xDEFD, 0x6715, 0xF2F9, 0x6717, 0xD5C7, 0x671B, 0xD8D0, 0x671D, 0xF0C8, 0x671E, 0xD1A1, 0x671F, 0xD1A2, + 0x6726, 0xD9D4, 0x6727, 0xD6E8, 0x6728, 0xD9CA, 0x672A, 0xDAB1, 0x672B, 0xD8C7, 0x672C, 0xDCE2, 0x672D, 0xF3CE, 0x672E, 0xF5F4, + 0x6731, 0xF1B9, 0x6734, 0xDAD3, 0x6736, 0xF6EA, 0x673A, 0xCFF5, 0x673D, 0xFDAE, 0x6746, 0xCAD2, 0x6749, 0xDFB4, 0x674E, 0xD7DD, + 0x674F, 0xFABA, 0x6750, 0xEEA7, 0x6751, 0xF5BD, 0x6753, 0xF8F5, 0x6756, 0xEDE8, 0x675C, 0xD4E1, 0x675E, 0xD1A3, 0x675F, 0xE1D6, + 0x676D, 0xF9F8, 0x676F, 0xDBCA, 0x6770, 0xCBF9, 0x6771, 0xD4D4, 0x6773, 0xD9DC, 0x6775, 0xEEBE, 0x6777, 0xF7ED, 0x677B, 0xD2EE, + 0x677E, 0xE1E6, 0x677F, 0xF7F9, 0x6787, 0xDDED, 0x6789, 0xE8DB, 0x678B, 0xDBB3, 0x678F, 0xD1F7, 0x6790, 0xE0B0, 0x6793, 0xD4E2, + 0x6795, 0xF6D7, 0x6797, 0xD7F9, 0x679A, 0xD8DD, 0x679C, 0xCDFD, 0x679D, 0xF2AB, 0x67AF, 0xCDBD, 0x67B0, 0xF8C2, 0x67B3, 0xF2AC, + 0x67B6, 0xCAAD, 0x67B7, 0xCAAE, 0x67B8, 0xCFAE, 0x67BE, 0xE3C2, 0x67C4, 0xDCB7, 0x67CF, 0xDBDA, 0x67D0, 0xD9BB, 0x67D1, 0xCAF3, + 0x67D2, 0xF6D3, 0x67D3, 0xE6F8, 0x67D4, 0xEAF5, 0x67DA, 0xEAF6, 0x67DD, 0xF6F9, 0x67E9, 0xCFAF, 0x67EC, 0xCAD3, 0x67EF, 0xCAAF, + 0x67F0, 0xD2B0, 0x67F1, 0xF1BA, 0x67F3, 0xD7B3, 0x67F4, 0xE3C3, 0x67F5, 0xF3FD, 0x67F6, 0xDEDA, 0x67FB, 0xDEDB, 0x67FE, 0xEFDE, + 0x6812, 0xE2E3, 0x6813, 0xEEFB, 0x6816, 0xDFF7, 0x6817, 0xD7CA, 0x6821, 0xCEE8, 0x6822, 0xDBDB, 0x682A, 0xF1BB, 0x682F, 0xE9F1, + 0x6838, 0xFAB7, 0x6839, 0xD0C6, 0x683C, 0xCCAB, 0x683D, 0xEEA8, 0x6840, 0xCBFA, 0x6841, 0xF9F9, 0x6842, 0xCCFD, 0x6843, 0xD3FE, + 0x6848, 0xE4D0, 0x684E, 0xF2EE, 0x6850, 0xD4D5, 0x6851, 0xDFCD, 0x6853, 0xFCB8, 0x6854, 0xD1D0, 0x686D, 0xF2CD, 0x6876, 0xF7D2, + 0x687F, 0xCAD4, 0x6881, 0xD5D9, 0x6885, 0xD8DE, 0x688F, 0xCDD9, 0x6893, 0xEEA9, 0x6894, 0xF6BC, 0x6897, 0xCCDB, 0x689D, 0xF0C9, + 0x689F, 0xFCFC, 0x68A1, 0xE8C9, 0x68A2, 0xF4FE, 0x68A7, 0xE7FC, 0x68A8, 0xD7DE, 0x68AD, 0xDEDC, 0x68AF, 0xF0AC, 0x68B0, 0xCCFE, + 0x68B1, 0xCDE1, 0x68B3, 0xE1BA, 0x68B5, 0xDBEF, 0x68B6, 0xDAB2, 0x68C4, 0xD1A5, 0x68C5, 0xDCB8, 0x68C9, 0xD8F6, 0x68CB, 0xD1A4, + 0x68CD, 0xCDE2, 0x68D2, 0xDCEA, 0x68D5, 0xF0F7, 0x68D7, 0xF0CA, 0x68D8, 0xD0BE, 0x68DA, 0xDDDC, 0x68DF, 0xD4D6, 0x68E0, 0xD3D6, + 0x68E7, 0xEDD0, 0x68E8, 0xCDA1, 0x68EE, 0xDFB5, 0x68F2, 0xDFF8, 0x68F9, 0xD4A1, 0x68FA, 0xCEB2, 0x6900, 0xE8CA, 0x6905, 0xEBF5, + 0x690D, 0xE3D5, 0x690E, 0xF5D0, 0x6912, 0xF5A1, 0x6927, 0xD9A7, 0x6930, 0xE5AB, 0x693D, 0xE6CB, 0x693F, 0xF5F1, 0x694A, 0xE5C5, + 0x6953, 0xF9A3, 0x6954, 0xE0DB, 0x6955, 0xF6EB, 0x6957, 0xCBF1, 0x6959, 0xD9EA, 0x695A, 0xF5A2, 0x695E, 0xD7D1, 0x6960, 0xD1F8, + 0x6961, 0xEAF8, 0x6962, 0xEAF9, 0x6963, 0xDAB3, 0x6968, 0xEFDF, 0x696B, 0xF1EF, 0x696D, 0xE5F6, 0x696E, 0xEEBF, 0x696F, 0xE2E4, + 0x6975, 0xD0BF, 0x6977, 0xFAAC, 0x6978, 0xF5D1, 0x6979, 0xE7B3, 0x6995, 0xE9BE, 0x699B, 0xF2CE, 0x699C, 0xDBB4, 0x69A5, 0xFCCE, + 0x69A7, 0xDDEE, 0x69AE, 0xE7B4, 0x69B4, 0xD7B4, 0x69BB, 0xF7B4, 0x69C1, 0xCDBE, 0x69C3, 0xDAE9, 0x69CB, 0xCFB0, 0x69CC, 0xF7D9, + 0x69CD, 0xF3E6, 0x69D0, 0xCED9, 0x69E8, 0xCEAA, 0x69EA, 0xCBC8, 0x69FB, 0xD0A7, 0x69FD, 0xF0CB, 0x69FF, 0xD0C7, 0x6A02, 0xE4C5, + 0x6A0A, 0xDBE0, 0x6A11, 0xD5DA, 0x6A13, 0xD7A7, 0x6A17, 0xEEC0, 0x6A19, 0xF8F6, 0x6A1E, 0xF5D2, 0x6A1F, 0xEDE9, 0x6A21, 0xD9BC, + 0x6A23, 0xE5C6, 0x6A35, 0xF5A3, 0x6A38, 0xDAD4, 0x6A39, 0xE2A7, 0x6A3A, 0xFBFC, 0x6A3D, 0xF1DC, 0x6A44, 0xCAF4, 0x6A48, 0xE8FA, + 0x6A4B, 0xCEE9, 0x6A52, 0xE9F8, 0x6A53, 0xE2E5, 0x6A58, 0xD0B9, 0x6A59, 0xD4F2, 0x6A5F, 0xD1A6, 0x6A61, 0xDFCE, 0x6A6B, 0xFCF4, + 0x6A80, 0xD3AA, 0x6A84, 0xCCAC, 0x6A89, 0xEFE0, 0x6A8D, 0xE5E5, 0x6A8E, 0xD0D5, 0x6A97, 0xDBFC, 0x6A9C, 0xFCE6, 0x6AA2, 0xCBFE, + 0x6AA3, 0xEDEA, 0x6AB3, 0xDEB1, 0x6ABB, 0xF9E3, 0x6AC2, 0xD4A2, 0x6AC3, 0xCFF6, 0x6AD3, 0xD6D0, 0x6ADA, 0xD5EA, 0x6ADB, 0xF1EE, + 0x6AF6, 0xFACB, 0x6AFB, 0xE5A1, 0x6B04, 0xD5B1, 0x6B0A, 0xCFED, 0x6B0C, 0xEDEB, 0x6B12, 0xD5B2, 0x6B16, 0xD5BC, 0x6B20, 0xFDE2, + 0x6B21, 0xF3AD, 0x6B23, 0xFDDB, 0x6B32, 0xE9B0, 0x6B3A, 0xD1A7, 0x6B3D, 0xFDE3, 0x6B3E, 0xCEB3, 0x6B46, 0xFDE4, 0x6B47, 0xFACE, + 0x6B4C, 0xCAB0, 0x6B4E, 0xF7A7, 0x6B50, 0xCFB1, 0x6B5F, 0xE6A2, 0x6B61, 0xFCB6, 0x6B62, 0xF2AD, 0x6B63, 0xEFE1, 0x6B64, 0xF3AE, + 0x6B65, 0xDCC6, 0x6B66, 0xD9EB, 0x6B6A, 0xE8E0, 0x6B72, 0xE1A8, 0x6B77, 0xD5F6, 0x6B78, 0xCFFD, 0x6B7B, 0xDEDD, 0x6B7F, 0xD9D1, + 0x6B83, 0xE4EA, 0x6B84, 0xF2CF, 0x6B86, 0xF7BF, 0x6B89, 0xE2E6, 0x6B8A, 0xE2A8, 0x6B96, 0xE3D6, 0x6B98, 0xEDD1, 0x6B9E, 0xE9F9, + 0x6BAE, 0xD6B1, 0x6BAF, 0xDEB2, 0x6BB2, 0xE0E8, 0x6BB5, 0xD3AB, 0x6BB7, 0xEBDC, 0x6BBA, 0xDFAF, 0x6BBC, 0xCAC3, 0x6BBF, 0xEEFC, + 0x6BC1, 0xFDC3, 0x6BC5, 0xEBF6, 0x6BC6, 0xCFB2, 0x6BCB, 0xD9EC, 0x6BCD, 0xD9BD, 0x6BCF, 0xD8DF, 0x6BD2, 0xD4B8, 0x6BD3, 0xEBBE, + 0x6BD4, 0xDDEF, 0x6BD6, 0xDDF0, 0x6BD7, 0xDDF1, 0x6BD8, 0xDDF2, 0x6BDB, 0xD9BE, 0x6BEB, 0xFBC6, 0x6BEC, 0xCFB3, 0x6C08, 0xEEFD, + 0x6C0F, 0xE4AB, 0x6C11, 0xDAC5, 0x6C13, 0xD8EC, 0x6C23, 0xD1A8, 0x6C34, 0xE2A9, 0x6C37, 0xDEBC, 0x6C38, 0xE7B5, 0x6C3E, 0xDBF0, + 0x6C40, 0xEFE2, 0x6C41, 0xF1F0, 0x6C42, 0xCFB4, 0x6C4E, 0xDBF1, 0x6C50, 0xE0B1, 0x6C55, 0xDFA5, 0x6C57, 0xF9D2, 0x6C5A, 0xE7FD, + 0x6C5D, 0xE6A3, 0x6C5E, 0xFBF1, 0x6C5F, 0xCBB0, 0x6C60, 0xF2AE, 0x6C68, 0xCDE7, 0x6C6A, 0xE8DC, 0x6C6D, 0xE7D7, 0x6C70, 0xF7C0, + 0x6C72, 0xD0E3, 0x6C76, 0xDAA1, 0x6C7A, 0xCCBD, 0x6C7D, 0xD1A9, 0x6C7E, 0xDDCC, 0x6C81, 0xE3FE, 0x6C82, 0xD1AA, 0x6C83, 0xE8AA, + 0x6C85, 0xEAB6, 0x6C86, 0xF9FA, 0x6C87, 0xE6CC, 0x6C88, 0xF6D8, 0x6C8C, 0xD4C7, 0x6C90, 0xD9CB, 0x6C92, 0xD9D2, 0x6C93, 0xD3CB, + 0x6C94, 0xD8F7, 0x6C95, 0xDAA9, 0x6C96, 0xF5F8, 0x6C99, 0xDEDE, 0x6C9A, 0xF2AF, 0x6C9B, 0xF8A9, 0x6CAB, 0xD8C8, 0x6CAE, 0xEEC1, + 0x6CB3, 0xF9C1, 0x6CB8, 0xDDF3, 0x6CB9, 0xEAFA, 0x6CBB, 0xF6BD, 0x6CBC, 0xE1BB, 0x6CBD, 0xCDBF, 0x6CBE, 0xF4D4, 0x6CBF, 0xE6CD, + 0x6CC1, 0xFCCF, 0x6CC2, 0xFBA2, 0x6CC4, 0xE0DC, 0x6CC9, 0xF4BB, 0x6CCA, 0xDAD5, 0x6CCC, 0xF9B2, 0x6CD3, 0xFBF2, 0x6CD5, 0xDBF6, + 0x6CD7, 0xDEDF, 0x6CDB, 0xDBF2, 0x6CE1, 0xF8DC, 0x6CE2, 0xF7EE, 0x6CE3, 0xEBE8, 0x6CE5, 0xD2FA, 0x6CE8, 0xF1BC, 0x6CEB, 0xFADA, + 0x6CEE, 0xDAEA, 0x6CEF, 0xDAC6, 0x6CF0, 0xF7C1, 0x6CF3, 0xE7B6, 0x6D0B, 0xE5C7, 0x6D0C, 0xD6AC, 0x6D11, 0xDCC7, 0x6D17, 0xE1A9, + 0x6D19, 0xE2AA, 0x6D1B, 0xD5A6, 0x6D1E, 0xD4D7, 0x6D25, 0xF2D0, 0x6D27, 0xEAFB, 0x6D29, 0xE0DD, 0x6D2A, 0xFBF3, 0x6D32, 0xF1BD, + 0x6D35, 0xE2E7, 0x6D36, 0xFDD7, 0x6D38, 0xCEC8, 0x6D39, 0xEAB7, 0x6D3B, 0xFCC0, 0x6D3D, 0xFDE7, 0x6D3E, 0xF7EF, 0x6D41, 0xD7B5, + 0x6D59, 0xEFBA, 0x6D5A, 0xF1DD, 0x6D5C, 0xDEB3, 0x6D63, 0xE8CB, 0x6D66, 0xF8DD, 0x6D69, 0xFBC7, 0x6D6A, 0xD5C8, 0x6D6C, 0xD7DF, + 0x6D6E, 0xDDA9, 0x6D74, 0xE9B1, 0x6D77, 0xFAAD, 0x6D78, 0xF6D9, 0x6D79, 0xFAF4, 0x6D7F, 0xF8AA, 0x6D85, 0xE6EE, 0x6D87, 0xCCDC, + 0x6D88, 0xE1BC, 0x6D89, 0xE0EF, 0x6D8C, 0xE9BF, 0x6D8D, 0xFCFD, 0x6D8E, 0xE6CE, 0x6D91, 0xE1D7, 0x6D93, 0xE6CF, 0x6D95, 0xF4F1, + 0x6DAF, 0xE4F3, 0x6DB2, 0xE4FB, 0x6DB5, 0xF9E4, 0x6DC0, 0xEFE3, 0x6DC3, 0xCFEE, 0x6DC4, 0xF6BE, 0x6DC5, 0xE0B2, 0x6DC6, 0xFCFE, + 0x6DC7, 0xD1AB, 0x6DCB, 0xD7FA, 0x6DCF, 0xFBC8, 0x6DD1, 0xE2D7, 0x6DD8, 0xD4A3, 0x6DD9, 0xF0F8, 0x6DDA, 0xD7A8, 0x6DDE, 0xE1E7, + 0x6DE1, 0xD3BF, 0x6DE8, 0xEFE4, 0x6DEA, 0xD7C5, 0x6DEB, 0xEBE2, 0x6DEE, 0xFCE7, 0x6DF1, 0xE4A2, 0x6DF3, 0xE2E8, 0x6DF5, 0xE6D0, + 0x6DF7, 0xFBE8, 0x6DF8, 0xF4E8, 0x6DF9, 0xE5F4, 0x6DFA, 0xF4BC, 0x6DFB, 0xF4D5, 0x6E17, 0xDFB6, 0x6E19, 0xFCB9, 0x6E1A, 0xEEC2, + 0x6E1B, 0xCAF5, 0x6E1F, 0xEFE5, 0x6E20, 0xCBE2, 0x6E21, 0xD4A4, 0x6E23, 0xDEE0, 0x6E24, 0xDAFD, 0x6E25, 0xE4C6, 0x6E26, 0xE8BE, + 0x6E2B, 0xE0DE, 0x6E2C, 0xF6B4, 0x6E2D, 0xEAD2, 0x6E2F, 0xF9FB, 0x6E32, 0xE0C2, 0x6E34, 0xCAE4, 0x6E36, 0xE7B7, 0x6E38, 0xEAFD, + 0x6E3A, 0xD9DD, 0x6E3C, 0xDAB4, 0x6E3D, 0xEEAA, 0x6E3E, 0xFBE9, 0x6E43, 0xDBCB, 0x6E44, 0xDAB5, 0x6E4A, 0xF1BE, 0x6E4D, 0xD3AC, + 0x6E56, 0xFBC9, 0x6E58, 0xDFCF, 0x6E5B, 0xD3C0, 0x6E5C, 0xE3D7, 0x6E5E, 0xEFE6, 0x6E5F, 0xFCD0, 0x6E67, 0xE9C0, 0x6E6B, 0xF5D3, + 0x6E6E, 0xECDC, 0x6E6F, 0xF7B7, 0x6E72, 0xEAB8, 0x6E73, 0xD1F9, 0x6E7A, 0xDCC8, 0x6E90, 0xEAB9, 0x6E96, 0xF1DE, 0x6E9C, 0xD7B6, + 0x6E9D, 0xCFB5, 0x6E9F, 0xD9A8, 0x6EA2, 0xECEE, 0x6EA5, 0xDDAA, 0x6EAA, 0xCDA2, 0x6EAB, 0xE8AE, 0x6EAF, 0xE1BD, 0x6EB1, 0xF2D1, + 0x6EB6, 0xE9C1, 0x6EBA, 0xD2FC, 0x6EC2, 0xDBB5, 0x6EC4, 0xF3E7, 0x6EC5, 0xD8FE, 0x6EC9, 0xFCD1, 0x6ECB, 0xEDB2, 0x6ECC, 0xF4AF, + 0x6ECE, 0xFBA3, 0x6ED1, 0xFCC1, 0x6ED3, 0xEEAB, 0x6ED4, 0xD4A5, 0x6EEF, 0xF4F2, 0x6EF4, 0xEED9, 0x6EF8, 0xFBCA, 0x6EFE, 0xCDE3, + 0x6EFF, 0xD8BB, 0x6F01, 0xE5DB, 0x6F02, 0xF8F7, 0x6F06, 0xF6D4, 0x6F0F, 0xD7A9, 0x6F11, 0xCBC9, 0x6F14, 0xE6D1, 0x6F15, 0xF0CC, + 0x6F20, 0xD8AE, 0x6F22, 0xF9D3, 0x6F23, 0xD5FE, 0x6F2B, 0xD8BC, 0x6F2C, 0xF2B0, 0x6F31, 0xE2AB, 0x6F32, 0xF3E8, 0x6F38, 0xEFC2, + 0x6F3F, 0xEDEC, 0x6F41, 0xE7B8, 0x6F51, 0xDAFE, 0x6F54, 0xCCBE, 0x6F57, 0xF2FC, 0x6F58, 0xDAEB, 0x6F5A, 0xE2D8, 0x6F5B, 0xEDD6, + 0x6F5E, 0xD6D1, 0x6F5F, 0xE0B3, 0x6F62, 0xFCD2, 0x6F64, 0xEBC8, 0x6F6D, 0xD3C1, 0x6F6E, 0xF0CD, 0x6F70, 0xCFF7, 0x6F7A, 0xEDD2, + 0x6F7C, 0xD4D8, 0x6F7D, 0xDCC9, 0x6F7E, 0xD7F1, 0x6F81, 0xDFBB, 0x6F84, 0xF3A5, 0x6F88, 0xF4CD, 0x6F8D, 0xF1BF, 0x6F8E, 0xF8B1, + 0x6F90, 0xE9FA, 0x6F94, 0xFBCB, 0x6F97, 0xCAD5, 0x6FA3, 0xF9D4, 0x6FA4, 0xF7CA, 0x6FA7, 0xD6C8, 0x6FAE, 0xFCE8, 0x6FAF, 0xF3BD, + 0x6FB1, 0xEEFE, 0x6FB3, 0xE7FE, 0x6FB9, 0xD3C2, 0x6FBE, 0xD3B6, 0x6FC0, 0xCCAD, 0x6FC1, 0xF6FA, 0x6FC2, 0xD6B2, 0x6FC3, 0xD2D8, + 0x6FCA, 0xE7D8, 0x6FD5, 0xE3A5, 0x6FDA, 0xE7B9, 0x6FDF, 0xF0AD, 0x6FE0, 0xFBCC, 0x6FE1, 0xEBA1, 0x6FE4, 0xD4A6, 0x6FE9, 0xFBCD, + 0x6FEB, 0xD5BD, 0x6FEC, 0xF1DF, 0x6FEF, 0xF6FB, 0x6FF1, 0xDEB4, 0x6FFE, 0xD5EB, 0x7001, 0xE5C8, 0x7005, 0xFBA4, 0x7006, 0xD4B9, + 0x7009, 0xDEE1, 0x700B, 0xE4A3, 0x700F, 0xD7B7, 0x7011, 0xF8EE, 0x7015, 0xDEB5, 0x7018, 0xD6D2, 0x701A, 0xF9D5, 0x701B, 0xE7BA, + 0x701C, 0xEBD5, 0x701D, 0xD5F7, 0x701E, 0xEFE7, 0x701F, 0xE1BE, 0x7023, 0xFAAE, 0x7027, 0xD6E9, 0x7028, 0xD6EE, 0x702F, 0xE7BB, + 0x7037, 0xECCB, 0x703E, 0xD5B3, 0x704C, 0xCEB4, 0x7050, 0xFBA5, 0x7051, 0xE1EE, 0x7058, 0xF7A8, 0x705D, 0xFBCE, 0x7063, 0xD8BD, + 0x706B, 0xFBFD, 0x7070, 0xFCE9, 0x7078, 0xCFB6, 0x707C, 0xEDC7, 0x707D, 0xEEAC, 0x7085, 0xCCDD, 0x708A, 0xF6A7, 0x708E, 0xE6FA, + 0x7092, 0xF5A4, 0x7098, 0xFDDC, 0x7099, 0xEDB3, 0x709A, 0xCEC9, 0x70A1, 0xEFE8, 0x70A4, 0xE1BF, 0x70AB, 0xFADB, 0x70AC, 0xCBE3, + 0x70AD, 0xF7A9, 0x70AF, 0xFBA6, 0x70B3, 0xDCB9, 0x70B7, 0xF1C0, 0x70B8, 0xEDC8, 0x70B9, 0xEFC3, 0x70C8, 0xD6AD, 0x70CB, 0xFDCE, + 0x70CF, 0xE8A1, 0x70D8, 0xFBF4, 0x70D9, 0xD5A7, 0x70DD, 0xF1F6, 0x70DF, 0xE6D3, 0x70F1, 0xCCDE, 0x70F9, 0xF8B2, 0x70FD, 0xDCEB, + 0x7104, 0xFDB6, 0x7109, 0xE5EA, 0x710C, 0xF1E0, 0x7119, 0xDBCC, 0x711A, 0xDDCD, 0x711E, 0xD4C8, 0x7121, 0xD9ED, 0x7126, 0xF5A5, + 0x7130, 0xE6FB, 0x7136, 0xE6D4, 0x7147, 0xFDC8, 0x7149, 0xD6A1, 0x714A, 0xFDBF, 0x714C, 0xFCD3, 0x714E, 0xEFA1, 0x7150, 0xE7BC, + 0x7156, 0xD1EE, 0x7159, 0xE6D5, 0x715C, 0xE9F2, 0x715E, 0xDFB0, 0x7164, 0xD8E0, 0x7165, 0xFCBA, 0x7166, 0xFDAF, 0x7167, 0xF0CE, + 0x7169, 0xDBE1, 0x716C, 0xE5C9, 0x716E, 0xEDB4, 0x717D, 0xE0C3, 0x7184, 0xE3D8, 0x7189, 0xE9FB, 0x718A, 0xEAA8, 0x718F, 0xFDB7, + 0x7192, 0xFBA7, 0x7194, 0xE9C2, 0x7199, 0xFDF7, 0x719F, 0xE2D9, 0x71A2, 0xDCEC, 0x71AC, 0xE8A2, 0x71B1, 0xE6F0, 0x71B9, 0xFDF8, + 0x71BA, 0xFDF9, 0x71BE, 0xF6BF, 0x71C1, 0xE7A7, 0x71C3, 0xE6D7, 0x71C8, 0xD4F3, 0x71C9, 0xD4C9, 0x71CE, 0xD6FA, 0x71D0, 0xD7F2, + 0x71D2, 0xE1C0, 0x71D4, 0xDBE2, 0x71D5, 0xE6D8, 0x71DF, 0xE7BD, 0x71E5, 0xF0CF, 0x71E6, 0xF3BE, 0x71E7, 0xE2AC, 0x71ED, 0xF5B7, + 0x71EE, 0xE0F0, 0x71FB, 0xFDB8, 0x71FC, 0xE3E8, 0x71FE, 0xD4A7, 0x71FF, 0xE8FC, 0x7200, 0xFAD2, 0x7206, 0xF8EF, 0x7210, 0xD6D3, + 0x721B, 0xD5B4, 0x722A, 0xF0D0, 0x722C, 0xF7F0, 0x722D, 0xEEB3, 0x7230, 0xEABA, 0x7232, 0xEAD3, 0x7235, 0xEDC9, 0x7236, 0xDDAB, + 0x723A, 0xE5AC, 0x723B, 0xFDA1, 0x723D, 0xDFD0, 0x723E, 0xECB3, 0x7240, 0xDFD1, 0x7246, 0xEDED, 0x7247, 0xF8B8, 0x7248, 0xF7FA, + 0x724C, 0xF8AB, 0x7252, 0xF4E0, 0x7258, 0xD4BA, 0x7259, 0xE4B3, 0x725B, 0xE9DA, 0x725D, 0xDEB6, 0x725F, 0xD9BF, 0x7261, 0xD9C0, + 0x7262, 0xD6EF, 0x7267, 0xD9CC, 0x7269, 0xDAAA, 0x7272, 0xDFE5, 0x7279, 0xF7E5, 0x727D, 0xCCB2, 0x7280, 0xDFF9, 0x7281, 0xD7E0, + 0x72A2, 0xD4BB, 0x72A7, 0xFDFA, 0x72AC, 0xCCB3, 0x72AF, 0xDBF3, 0x72C0, 0xDFD2, 0x72C2, 0xCECA, 0x72C4, 0xEEDA, 0x72CE, 0xE4E4, + 0x72D0, 0xFBCF, 0x72D7, 0xCFB7, 0x72D9, 0xEEC3, 0x72E1, 0xCEEA, 0x72E9, 0xE2AD, 0x72F8, 0xD7E1, 0x72F9, 0xFAF5, 0x72FC, 0xD5C9, + 0x72FD, 0xF8AC, 0x730A, 0xE7D9, 0x7316, 0xF3E9, 0x731B, 0xD8ED, 0x731C, 0xE3C4, 0x731D, 0xF0F1, 0x7325, 0xE8E5, 0x7329, 0xE0FA, + 0x732A, 0xEEC4, 0x732B, 0xD9DE, 0x7336, 0xEBA2, 0x7337, 0xEBA3, 0x733E, 0xFCC2, 0x733F, 0xEABB, 0x7344, 0xE8AB, 0x7345, 0xDEE2, + 0x7350, 0xEDEF, 0x7352, 0xE8A3, 0x7357, 0xCFF1, 0x7368, 0xD4BC, 0x736A, 0xFCEA, 0x7370, 0xE7BE, 0x7372, 0xFCF2, 0x7375, 0xD6B4, + 0x7378, 0xE2AE, 0x737A, 0xD3B7, 0x737B, 0xFACC, 0x7384, 0xFADC, 0x7386, 0xEDB5, 0x7387, 0xE1E3, 0x7389, 0xE8AC, 0x738B, 0xE8DD, + 0x738E, 0xEFE9, 0x7394, 0xF4BD, 0x7396, 0xCFB8, 0x7397, 0xE9DB, 0x7398, 0xD1AC, 0x739F, 0xDAC7, 0x73A7, 0xEBC9, 0x73A9, 0xE8CC, + 0x73AD, 0xDEB7, 0x73B2, 0xD6BC, 0x73B3, 0xD3E5, 0x73B9, 0xFADD, 0x73C0, 0xDAD6, 0x73C2, 0xCAB1, 0x73C9, 0xDAC8, 0x73CA, 0xDFA6, + 0x73CC, 0xF9B3, 0x73CD, 0xF2D2, 0x73CF, 0xCAC4, 0x73D6, 0xCECB, 0x73D9, 0xCDF5, 0x73DD, 0xFDB0, 0x73DE, 0xD5A8, 0x73E0, 0xF1C1, + 0x73E3, 0xE2E9, 0x73E4, 0xDCCA, 0x73E5, 0xECB4, 0x73E6, 0xFAC0, 0x73E9, 0xFBA8, 0x73EA, 0xD0A8, 0x73ED, 0xDAEC, 0x73F7, 0xD9EE, + 0x73F9, 0xE0FB, 0x73FD, 0xEFEA, 0x73FE, 0xFADE, 0x7401, 0xE0C4, 0x7403, 0xCFB9, 0x7405, 0xD5CA, 0x7406, 0xD7E2, 0x7407, 0xE2AF, + 0x7409, 0xD7B8, 0x7413, 0xE8CD, 0x741B, 0xF6DA, 0x7420, 0xEFA2, 0x7421, 0xE2DA, 0x7422, 0xF6FC, 0x7425, 0xFBD0, 0x7426, 0xD1AD, + 0x7428, 0xCDE4, 0x742A, 0xD1AE, 0x742B, 0xDCED, 0x742C, 0xE8CE, 0x742E, 0xF0F9, 0x742F, 0xCEB5, 0x7430, 0xE6FC, 0x7433, 0xD7FB, + 0x7434, 0xD0D6, 0x7435, 0xDDF5, 0x7436, 0xF7F1, 0x7438, 0xF6FD, 0x743A, 0xDBF7, 0x743F, 0xFBEA, 0x7440, 0xE9DC, 0x7441, 0xD9C1, + 0x7443, 0xF5F2, 0x7444, 0xE0C5, 0x744B, 0xEAD4, 0x7455, 0xF9C2, 0x7457, 0xEABC, 0x7459, 0xD2C5, 0x745A, 0xFBD1, 0x745B, 0xE7C0, + 0x745C, 0xEBA5, 0x745E, 0xDFFA, 0x745F, 0xE3A2, 0x7460, 0xD7B9, 0x7462, 0xE9C3, 0x7464, 0xE8FD, 0x7465, 0xE8AF, 0x7468, 0xF2D3, + 0x7469, 0xFBA9, 0x746A, 0xD8A5, 0x746F, 0xD5CB, 0x747E, 0xD0C8, 0x7482, 0xD1AF, 0x7483, 0xD7E3, 0x7487, 0xE0C6, 0x7489, 0xD6A2, + 0x748B, 0xEDF0, 0x7498, 0xD7F3, 0x749C, 0xFCD4, 0x749E, 0xDAD7, 0x749F, 0xCCDF, 0x74A1, 0xF2D4, 0x74A3, 0xD1B0, 0x74A5, 0xCCE0, + 0x74A7, 0xDBFD, 0x74A8, 0xF3BF, 0x74AA, 0xF0D1, 0x74B0, 0xFCBB, 0x74B2, 0xE2B0, 0x74B5, 0xE6A5, 0x74B9, 0xE2DB, 0x74BD, 0xDFDE, + 0x74BF, 0xE0C7, 0x74C6, 0xF2EF, 0x74CA, 0xCCE1, 0x74CF, 0xD6EA, 0x74D4, 0xE7C2, 0x74D8, 0xCEB6, 0x74DA, 0xF3C0, 0x74DC, 0xCDFE, + 0x74E0, 0xFBD2, 0x74E2, 0xF8F8, 0x74E3, 0xF7FB, 0x74E6, 0xE8BF, 0x74EE, 0xE8B7, 0x74F7, 0xEDB6, 0x7501, 0xDCBA, 0x7504, 0xCCB4, + 0x7511, 0xF1F7, 0x7515, 0xE8B8, 0x7518, 0xCAF6, 0x751A, 0xE4A4, 0x751B, 0xF4D6, 0x751F, 0xDFE6, 0x7523, 0xDFA7, 0x7525, 0xDFE7, + 0x7526, 0xE1C1, 0x7528, 0xE9C4, 0x752B, 0xDCCB, 0x752C, 0xE9C5, 0x7530, 0xEFA3, 0x7531, 0xEBA6, 0x7532, 0xCBA3, 0x7533, 0xE3E9, + 0x7537, 0xD1FB, 0x7538, 0xEFA4, 0x753A, 0xEFEB, 0x7547, 0xD0B4, 0x754C, 0xCDA3, 0x754F, 0xE8E6, 0x7551, 0xEFA5, 0x7553, 0xD3CC, + 0x7554, 0xDAED, 0x7559, 0xD7BA, 0x755B, 0xF2D5, 0x755C, 0xF5E5, 0x755D, 0xD9EF, 0x7562, 0xF9B4, 0x7565, 0xD5D4, 0x7566, 0xFDCF, + 0x756A, 0xDBE3, 0x756F, 0xF1E1, 0x7570, 0xECB6, 0x7575, 0xFBFE, 0x7576, 0xD3D7, 0x7578, 0xD1B1, 0x757A, 0xCBB1, 0x757F, 0xD1B2, + 0x7586, 0xCBB2, 0x7587, 0xF1C2, 0x758A, 0xF4E1, 0x758B, 0xF9B5, 0x758E, 0xE1C3, 0x758F, 0xE1C2, 0x7591, 0xEBF7, 0x759D, 0xDFA8, + 0x75A5, 0xCBCA, 0x75AB, 0xE6B9, 0x75B1, 0xF8DE, 0x75B2, 0xF9AA, 0x75B3, 0xCAF7, 0x75B5, 0xEDB7, 0x75B8, 0xD3B8, 0x75B9, 0xF2D6, + 0x75BC, 0xD4D9, 0x75BD, 0xEEC5, 0x75BE, 0xF2F0, 0x75C2, 0xCAB2, 0x75C5, 0xDCBB, 0x75C7, 0xF1F8, 0x75CD, 0xECB7, 0x75D2, 0xE5CA, + 0x75D4, 0xF6C0, 0x75D5, 0xFDDD, 0x75D8, 0xD4E3, 0x75D9, 0xCCE2, 0x75DB, 0xF7D4, 0x75E2, 0xD7E5, 0x75F0, 0xD3C3, 0x75F2, 0xD8A6, + 0x75F4, 0xF6C1, 0x75FA, 0xDDF6, 0x75FC, 0xCDC0, 0x7600, 0xE5DC, 0x760D, 0xE5CB, 0x7619, 0xE1C4, 0x761F, 0xE8B0, 0x7620, 0xF4B0, + 0x7621, 0xF3EA, 0x7622, 0xDAEE, 0x7624, 0xD7BB, 0x7626, 0xE2B1, 0x763B, 0xD7AA, 0x7642, 0xD6FB, 0x764C, 0xE4DF, 0x764E, 0xCAD6, + 0x7652, 0xEBA8, 0x7656, 0xDBFE, 0x7661, 0xF6C2, 0x7664, 0xEFBB, 0x7669, 0xD4FD, 0x766C, 0xE0C8, 0x7670, 0xE8B9, 0x7672, 0xEFA6, + 0x7678, 0xCDA4, 0x767B, 0xD4F4, 0x767C, 0xDBA1, 0x767D, 0xDBDC, 0x767E, 0xDBDD, 0x7684, 0xEEDC, 0x7686, 0xCBCB, 0x7687, 0xFCD5, + 0x768E, 0xCEEB, 0x7690, 0xCDC1, 0x7693, 0xFBD3, 0x76AE, 0xF9AB, 0x76BA, 0xF5D4, 0x76BF, 0xD9A9, 0x76C2, 0xE9DD, 0x76C3, 0xDBCD, + 0x76C6, 0xDDCE, 0x76C8, 0xE7C3, 0x76CA, 0xECCC, 0x76D2, 0xF9EC, 0x76D6, 0xCBCC, 0x76DB, 0xE0FC, 0x76DC, 0xD4A8, 0x76DE, 0xEDD3, + 0x76DF, 0xD8EF, 0x76E1, 0xF2D7, 0x76E3, 0xCAF8, 0x76E4, 0xDAEF, 0x76E7, 0xD6D4, 0x76EE, 0xD9CD, 0x76F2, 0xD8EE, 0x76F4, 0xF2C1, + 0x76F8, 0xDFD3, 0x76FC, 0xDAF0, 0x76FE, 0xE2EA, 0x7701, 0xE0FD, 0x7704, 0xD8F8, 0x7708, 0xF7AF, 0x7709, 0xDAB6, 0x770B, 0xCAD7, + 0x771E, 0xF2D8, 0x7720, 0xD8F9, 0x7729, 0xFADF, 0x7737, 0xCFEF, 0x7738, 0xD9C2, 0x773A, 0xF0D2, 0x773C, 0xE4D1, 0x7740, 0xF3B7, + 0x774D, 0xFAE0, 0x775B, 0xEFEC, 0x7761, 0xE2B2, 0x7763, 0xD4BD, 0x7766, 0xD9CE, 0x776B, 0xF4E2, 0x7779, 0xD4A9, 0x777E, 0xCDC2, + 0x777F, 0xE7DA, 0x778B, 0xF2D9, 0x7791, 0xD9AA, 0x779E, 0xD8BE, 0x77A5, 0xDCAD, 0x77AC, 0xE2EB, 0x77AD, 0xD6FC, 0x77B0, 0xCAF9, + 0x77B3, 0xD4DA, 0x77BB, 0xF4D7, 0x77BC, 0xCCA1, 0x77BF, 0xCFBA, 0x77D7, 0xF5B8, 0x77DB, 0xD9C3, 0x77DC, 0xD0E8, 0x77E2, 0xE3C5, + 0x77E3, 0xEBF8, 0x77E5, 0xF2B1, 0x77E9, 0xCFBB, 0x77ED, 0xD3AD, 0x77EE, 0xE8E1, 0x77EF, 0xCEEC, 0x77F3, 0xE0B4, 0x7802, 0xDEE3, + 0x7812, 0xDDF7, 0x7825, 0xF2B2, 0x7826, 0xF3F6, 0x7827, 0xF6DB, 0x782C, 0xD7FE, 0x7832, 0xF8DF, 0x7834, 0xF7F2, 0x7845, 0xD0A9, + 0x784F, 0xE6DA, 0x785D, 0xF5A6, 0x786B, 0xD7BC, 0x786C, 0xCCE3, 0x786F, 0xE6DB, 0x787C, 0xDDDD, 0x7881, 0xD1B3, 0x7887, 0xEFED, + 0x788C, 0xD6DE, 0x788D, 0xE4F4, 0x788E, 0xE1EF, 0x7891, 0xDDF8, 0x7897, 0xE8CF, 0x78A3, 0xCAE5, 0x78A7, 0xDCA1, 0x78A9, 0xE0B5, + 0x78BA, 0xFCAC, 0x78BB, 0xFCAD, 0x78BC, 0xD8A7, 0x78C1, 0xEDB8, 0x78C5, 0xDBB6, 0x78CA, 0xD6F0, 0x78CB, 0xF3AF, 0x78CE, 0xCDA5, + 0x78D0, 0xDAF1, 0x78E8, 0xD8A8, 0x78EC, 0xCCE4, 0x78EF, 0xD1B4, 0x78F5, 0xCAD8, 0x78FB, 0xDAF2, 0x7901, 0xF5A7, 0x790E, 0xF5A8, + 0x7916, 0xE6A6, 0x792A, 0xD5EC, 0x792B, 0xD5F8, 0x792C, 0xDAF3, 0x793A, 0xE3C6, 0x793E, 0xDEE4, 0x7940, 0xDEE5, 0x7941, 0xD1B5, + 0x7947, 0xD1B6, 0x7948, 0xD1B7, 0x7949, 0xF2B3, 0x7950, 0xE9DE, 0x7956, 0xF0D3, 0x7957, 0xF2B4, 0x795A, 0xF0D4, 0x795B, 0xCBE4, + 0x795C, 0xFBD4, 0x795D, 0xF5E6, 0x795E, 0xE3EA, 0x7960, 0xDEE6, 0x7965, 0xDFD4, 0x7968, 0xF8F9, 0x796D, 0xF0AE, 0x797A, 0xD1B8, + 0x797F, 0xD6DF, 0x7981, 0xD0D7, 0x798D, 0xFCA1, 0x798E, 0xEFEE, 0x798F, 0xDCD8, 0x7991, 0xE9DF, 0x79A6, 0xE5DD, 0x79A7, 0xFDFB, + 0x79AA, 0xE0C9, 0x79AE, 0xD6C9, 0x79B1, 0xD4AA, 0x79B3, 0xE5CC, 0x79B9, 0xE9E0, 0x79BD, 0xD0D8, 0x79BE, 0xFCA2, 0x79BF, 0xD4BE, + 0x79C0, 0xE2B3, 0x79C1, 0xDEE7, 0x79C9, 0xDCBC, 0x79CA, 0xD2B6, 0x79CB, 0xF5D5, 0x79D1, 0xCEA1, 0x79D2, 0xF5A9, 0x79D5, 0xDDF9, + 0x79D8, 0xDDFA, 0x79DF, 0xF0D5, 0x79E4, 0xF6DF, 0x79E6, 0xF2DA, 0x79E7, 0xE4EB, 0x79E9, 0xF2F1, 0x79FB, 0xECB9, 0x7A00, 0xFDFC, + 0x7A05, 0xE1AA, 0x7A08, 0xCAD9, 0x7A0B, 0xEFEF, 0x7A0D, 0xF5AA, 0x7A14, 0xECF9, 0x7A17, 0xF8AD, 0x7A19, 0xF2C2, 0x7A1A, 0xF6C3, + 0x7A1C, 0xD7D2, 0x7A1F, 0xF9A2, 0x7A20, 0xF0D6, 0x7A2E, 0xF0FA, 0x7A31, 0xF6E0, 0x7A36, 0xE9F3, 0x7A37, 0xF2C3, 0x7A3B, 0xD4AB, + 0x7A3C, 0xCAB3, 0x7A3D, 0xCDA6, 0x7A3F, 0xCDC3, 0x7A40, 0xCDDA, 0x7A46, 0xD9CF, 0x7A49, 0xF6C4, 0x7A4D, 0xEEDD, 0x7A4E, 0xE7C4, + 0x7A57, 0xE2B4, 0x7A61, 0xDFE2, 0x7A62, 0xE7DB, 0x7A69, 0xE8B1, 0x7A6B, 0xFCAE, 0x7A70, 0xE5CD, 0x7A74, 0xFAEB, 0x7A76, 0xCFBC, + 0x7A79, 0xCFE2, 0x7A7A, 0xCDF6, 0x7A7D, 0xEFF0, 0x7A7F, 0xF4BE, 0x7A81, 0xD4CD, 0x7A84, 0xF3B8, 0x7A88, 0xE9A1, 0x7A92, 0xF2F2, + 0x7A93, 0xF3EB, 0x7A95, 0xF0D7, 0x7A98, 0xCFD7, 0x7A9F, 0xCFDF, 0x7AA9, 0xE8C0, 0x7AAA, 0xE8C1, 0x7AAE, 0xCFE3, 0x7AAF, 0xE9A2, + 0x7ABA, 0xD0AA, 0x7AC4, 0xF3C1, 0x7AC5, 0xD0AB, 0x7AC7, 0xD4E4, 0x7ACA, 0xEFBC, 0x7ACB, 0xD8A1, 0x7AD7, 0xD9DF, 0x7AD9, 0xF3D7, + 0x7ADD, 0xDCBD, 0x7ADF, 0xCCE5, 0x7AE0, 0xEDF1, 0x7AE3, 0xF1E2, 0x7AE5, 0xD4DB, 0x7AEA, 0xE2B5, 0x7AED, 0xCAE6, 0x7AEF, 0xD3AE, + 0x7AF6, 0xCCE6, 0x7AF9, 0xF1D3, 0x7AFA, 0xF5E7, 0x7AFF, 0xCADA, 0x7B0F, 0xFBEE, 0x7B11, 0xE1C5, 0x7B19, 0xDFE9, 0x7B1B, 0xEEDE, + 0x7B1E, 0xF7C2, 0x7B20, 0xD8A2, 0x7B26, 0xDDAC, 0x7B2C, 0xF0AF, 0x7B2D, 0xD6BD, 0x7B39, 0xE1AB, 0x7B46, 0xF9B6, 0x7B49, 0xD4F5, + 0x7B4B, 0xD0C9, 0x7B4C, 0xEFA7, 0x7B4D, 0xE2EC, 0x7B4F, 0xDBEA, 0x7B50, 0xCECC, 0x7B51, 0xF5E8, 0x7B52, 0xF7D5, 0x7B54, 0xD3CD, + 0x7B56, 0xF3FE, 0x7B60, 0xD0B5, 0x7B6C, 0xE0FE, 0x7B6E, 0xDFFB, 0x7B75, 0xE6DD, 0x7B7D, 0xE8A4, 0x7B87, 0xCBCD, 0x7B8B, 0xEFA8, + 0x7B8F, 0xEEB4, 0x7B94, 0xDAD8, 0x7B95, 0xD1B9, 0x7B97, 0xDFA9, 0x7B9A, 0xF3B0, 0x7B9D, 0xCCC4, 0x7BA1, 0xCEB7, 0x7BAD, 0xEFA9, + 0x7BB1, 0xDFD5, 0x7BB4, 0xEDD7, 0x7BB8, 0xEEC6, 0x7BC0, 0xEFBD, 0x7BC1, 0xFCD6, 0x7BC4, 0xDBF4, 0x7BC6, 0xEFAA, 0x7BC7, 0xF8B9, + 0x7BC9, 0xF5E9, 0x7BD2, 0xE3D9, 0x7BE0, 0xE1C6, 0x7BE4, 0xD4BF, 0x7BE9, 0xDEE8, 0x7C07, 0xF0EA, 0x7C12, 0xF3C2, 0x7C1E, 0xD3AF, + 0x7C21, 0xCADB, 0x7C27, 0xFCD7, 0x7C2A, 0xEDD8, 0x7C2B, 0xE1C7, 0x7C3D, 0xF4D8, 0x7C3E, 0xD6B3, 0x7C3F, 0xDDAD, 0x7C43, 0xD5BE, + 0x7C4C, 0xF1C3, 0x7C4D, 0xEEDF, 0x7C60, 0xD6EB, 0x7C64, 0xF4D9, 0x7C6C, 0xD7E6, 0x7C73, 0xDAB7, 0x7C83, 0xDDFB, 0x7C89, 0xDDCF, + 0x7C92, 0xD8A3, 0x7C95, 0xDAD9, 0x7C97, 0xF0D8, 0x7C98, 0xEFC4, 0x7C9F, 0xE1D8, 0x7CA5, 0xF1D4, 0x7CA7, 0xEDF2, 0x7CAE, 0xD5DB, + 0x7CB1, 0xD5DC, 0x7CB2, 0xF3C4, 0x7CB3, 0xCBD7, 0x7CB9, 0xE2B6, 0x7CBE, 0xEFF1, 0x7CCA, 0xFBD5, 0x7CD6, 0xD3D8, 0x7CDE, 0xDDD0, + 0x7CDF, 0xF0D9, 0x7CE0, 0xCBB3, 0x7CE7, 0xD5DD, 0x7CFB, 0xCDA7, 0x7CFE, 0xD0AC, 0x7D00, 0xD1BA, 0x7D02, 0xF1C4, 0x7D04, 0xE5B3, + 0x7D05, 0xFBF5, 0x7D06, 0xE9E1, 0x7D07, 0xFDE0, 0x7D08, 0xFCBC, 0x7D0A, 0xDAA2, 0x7D0B, 0xDAA3, 0x7D0D, 0xD2A1, 0x7D10, 0xD2EF, + 0x7D14, 0xE2ED, 0x7D17, 0xDEE9, 0x7D18, 0xCEDC, 0x7D19, 0xF2B5, 0x7D1A, 0xD0E4, 0x7D1B, 0xDDD1, 0x7D20, 0xE1C8, 0x7D21, 0xDBB7, + 0x7D22, 0xDFE3, 0x7D2B, 0xEDB9, 0x7D2C, 0xF1C5, 0x7D2E, 0xF3CF, 0x7D2F, 0xD7AB, 0x7D30, 0xE1AC, 0x7D33, 0xE3EB, 0x7D35, 0xEEC7, + 0x7D39, 0xE1C9, 0x7D3A, 0xCAFA, 0x7D42, 0xF0FB, 0x7D43, 0xFAE1, 0x7D44, 0xF0DA, 0x7D45, 0xCCE7, 0x7D46, 0xDAF4, 0x7D50, 0xCCBF, + 0x7D5E, 0xCEED, 0x7D61, 0xD5A9, 0x7D62, 0xFAE2, 0x7D66, 0xD0E5, 0x7D68, 0xEBD6, 0x7D6A, 0xECDF, 0x7D6E, 0xDFFC, 0x7D71, 0xF7D6, + 0x7D72, 0xDEEA, 0x7D73, 0xCBB4, 0x7D76, 0xEFBE, 0x7D79, 0xCCB5, 0x7D7F, 0xCFBD, 0x7D8E, 0xEFF2, 0x7D8F, 0xE2B7, 0x7D93, 0xCCE8, + 0x7D9C, 0xF0FC, 0x7DA0, 0xD6E0, 0x7DA2, 0xF1C6, 0x7DAC, 0xE2B8, 0x7DAD, 0xEBAB, 0x7DB1, 0xCBB5, 0x7DB2, 0xD8D1, 0x7DB4, 0xF4CE, + 0x7DB5, 0xF3F7, 0x7DB8, 0xD7C6, 0x7DBA, 0xD1BB, 0x7DBB, 0xF7AA, 0x7DBD, 0xEDCA, 0x7DBE, 0xD7D3, 0x7DBF, 0xD8FA, 0x7DC7, 0xF6C5, + 0x7DCA, 0xD1CC, 0x7DCB, 0xDDFC, 0x7DD6, 0xDFFD, 0x7DD8, 0xF9E5, 0x7DDA, 0xE0CA, 0x7DDD, 0xF2FD, 0x7DDE, 0xD3B0, 0x7DE0, 0xF4F3, + 0x7DE1, 0xDAC9, 0x7DE3, 0xE6DE, 0x7DE8, 0xF8BA, 0x7DE9, 0xE8D0, 0x7DEC, 0xD8FB, 0x7DEF, 0xEAD5, 0x7DF4, 0xD6A3, 0x7DFB, 0xF6C6, + 0x7E09, 0xF2DB, 0x7E0A, 0xE4FC, 0x7E15, 0xE8B2, 0x7E1B, 0xDADA, 0x7E1D, 0xF2DC, 0x7E1E, 0xFBD6, 0x7E1F, 0xE9B2, 0x7E21, 0xEEAD, + 0x7E23, 0xFAE3, 0x7E2B, 0xDCEE, 0x7E2E, 0xF5EA, 0x7E2F, 0xE6E0, 0x7E31, 0xF0FD, 0x7E37, 0xD7AC, 0x7E3D, 0xF5C5, 0x7E3E, 0xEEE0, + 0x7E41, 0xDBE5, 0x7E43, 0xDDDE, 0x7E46, 0xD9F0, 0x7E47, 0xE9A3, 0x7E52, 0xF1F9, 0x7E54, 0xF2C4, 0x7E55, 0xE0CB, 0x7E5E, 0xE9A4, + 0x7E61, 0xE2B9, 0x7E69, 0xE3B1, 0x7E6A, 0xFCEB, 0x7E6B, 0xCDA8, 0x7E6D, 0xCCB6, 0x7E70, 0xF0DB, 0x7E79, 0xE6BA, 0x7E7C, 0xCDA9, + 0x7E82, 0xF3C3, 0x7E8C, 0xE1D9, 0x7E8F, 0xEFAB, 0x7E93, 0xE7C5, 0x7E96, 0xE0E9, 0x7E98, 0xF3C5, 0x7E9B, 0xD4C0, 0x7E9C, 0xD5BF, + 0x7F36, 0xDDAE, 0x7F38, 0xF9FC, 0x7F3A, 0xCCC0, 0x7F4C, 0xE5A2, 0x7F50, 0xCEB8, 0x7F54, 0xD8D2, 0x7F55, 0xF9D6, 0x7F6A, 0xF1AA, + 0x7F6B, 0xCED1, 0x7F6E, 0xF6C7, 0x7F70, 0xDBEB, 0x7F72, 0xDFFE, 0x7F75, 0xD8E1, 0x7F77, 0xF7F3, 0x7F79, 0xD7E7, 0x7F85, 0xD4FE, + 0x7F88, 0xD1BC, 0x7F8A, 0xE5CF, 0x7F8C, 0xCBB6, 0x7F8E, 0xDAB8, 0x7F94, 0xCDC4, 0x7F9A, 0xD6BE, 0x7F9E, 0xE2BA, 0x7FA4, 0xCFD8, + 0x7FA8, 0xE0CC, 0x7FA9, 0xEBF9, 0x7FB2, 0xFDFD, 0x7FB8, 0xD7E8, 0x7FB9, 0xCBD8, 0x7FBD, 0xE9E2, 0x7FC1, 0xE8BA, 0x7FC5, 0xE3C7, + 0x7FCA, 0xECCD, 0x7FCC, 0xECCE, 0x7FCE, 0xD6BF, 0x7FD2, 0xE3A7, 0x7FD4, 0xDFD6, 0x7FD5, 0xFDE8, 0x7FDF, 0xEEE1, 0x7FE0, 0xF6A8, + 0x7FE1, 0xDDFD, 0x7FE9, 0xF8BB, 0x7FEB, 0xE8D1, 0x7FF0, 0xF9D7, 0x7FF9, 0xCEEE, 0x7FFC, 0xECCF, 0x8000, 0xE9A5, 0x8001, 0xD6D5, + 0x8003, 0xCDC5, 0x8005, 0xEDBA, 0x8006, 0xD1BD, 0x8009, 0xCFBE, 0x800C, 0xECBB, 0x8010, 0xD2B1, 0x8015, 0xCCE9, 0x8017, 0xD9C4, + 0x8018, 0xE9FC, 0x802D, 0xD1BE, 0x8033, 0xECBC, 0x8036, 0xE5AD, 0x803D, 0xF7B0, 0x803F, 0xCCEA, 0x8043, 0xD3C4, 0x8046, 0xD6C0, + 0x804A, 0xD6FD, 0x8056, 0xE1A1, 0x8058, 0xDEBD, 0x805A, 0xF6A9, 0x805E, 0xDAA4, 0x806F, 0xD6A4, 0x8070, 0xF5C6, 0x8072, 0xE1A2, + 0x8073, 0xE9C6, 0x8077, 0xF2C5, 0x807D, 0xF4E9, 0x807E, 0xD6EC, 0x807F, 0xEBD3, 0x8084, 0xECBD, 0x8085, 0xE2DC, 0x8086, 0xDEEB, + 0x8087, 0xF0DC, 0x8089, 0xEBBF, 0x808B, 0xD7CE, 0x808C, 0xD1BF, 0x8096, 0xF5AB, 0x809B, 0xF9FD, 0x809D, 0xCADC, 0x80A1, 0xCDC6, + 0x80A2, 0xF2B6, 0x80A5, 0xDDFE, 0x80A9, 0xCCB7, 0x80AA, 0xDBB8, 0x80AF, 0xD0E9, 0x80B1, 0xCEDD, 0x80B2, 0xEBC0, 0x80B4, 0xFDA2, + 0x80BA, 0xF8CB, 0x80C3, 0xEAD6, 0x80C4, 0xF1B0, 0x80CC, 0xDBCE, 0x80CE, 0xF7C3, 0x80DA, 0xDBCF, 0x80DB, 0xCBA4, 0x80DE, 0xF8E0, + 0x80E1, 0xFBD7, 0x80E4, 0xEBCA, 0x80E5, 0xE0A1, 0x80F1, 0xCECD, 0x80F4, 0xD4DC, 0x80F8, 0xFDD8, 0x80FD, 0xD2F6, 0x8102, 0xF2B7, + 0x8105, 0xFAF6, 0x8106, 0xF6AA, 0x8107, 0xFAF7, 0x8108, 0xD8E6, 0x810A, 0xF4B1, 0x8118, 0xE8D2, 0x811A, 0xCAC5, 0x811B, 0xCCEB, + 0x8123, 0xE2EE, 0x8129, 0xE2BB, 0x812B, 0xF7AD, 0x812F, 0xF8E1, 0x8139, 0xF3EC, 0x813E, 0xDEA1, 0x814B, 0xE4FD, 0x814E, 0xE3EC, + 0x8150, 0xDDAF, 0x8151, 0xDDB0, 0x8154, 0xCBB7, 0x8155, 0xE8D3, 0x8165, 0xE1A3, 0x8166, 0xD2E0, 0x816B, 0xF0FE, 0x8170, 0xE9A6, + 0x8171, 0xCBF2, 0x8178, 0xEDF3, 0x8179, 0xDCD9, 0x817A, 0xE0CD, 0x817F, 0xF7DA, 0x8180, 0xDBB9, 0x8188, 0xCCAE, 0x818A, 0xDADB, + 0x818F, 0xCDC7, 0x819A, 0xDDB1, 0x819C, 0xD8AF, 0x819D, 0xE3A3, 0x81A0, 0xCEEF, 0x81A3, 0xF2F3, 0x81A8, 0xF8B3, 0x81B3, 0xE0CE, + 0x81B5, 0xF5FD, 0x81BA, 0xEBEC, 0x81BD, 0xD3C5, 0x81BE, 0xFCEC, 0x81BF, 0xD2DB, 0x81C0, 0xD4EB, 0x81C2, 0xDEA2, 0x81C6, 0xE5E6, + 0x81CD, 0xF0B0, 0x81D8, 0xD5C4, 0x81DF, 0xEDF4, 0x81E3, 0xE3ED, 0x81E5, 0xE8C2, 0x81E7, 0xEDF5, 0x81E8, 0xD7FC, 0x81EA, 0xEDBB, + 0x81ED, 0xF6AB, 0x81F3, 0xF2B8, 0x81F4, 0xF6C8, 0x81FA, 0xD3E6, 0x81FB, 0xF2DD, 0x81FC, 0xCFBF, 0x81FE, 0xEBAC, 0x8205, 0xCFC0, + 0x8207, 0xE6A8, 0x8208, 0xFDE9, 0x820A, 0xCFC1, 0x820C, 0xE0DF, 0x820D, 0xDEEC, 0x8212, 0xE0A2, 0x821B, 0xF4BF, 0x821C, 0xE2EF, + 0x821E, 0xD9F1, 0x821F, 0xF1C7, 0x8221, 0xCBB8, 0x822A, 0xF9FE, 0x822B, 0xDBBA, 0x822C, 0xDAF5, 0x8235, 0xF6EC, 0x8236, 0xDADC, + 0x8237, 0xFAE4, 0x8239, 0xE0CF, 0x8240, 0xDDB2, 0x8245, 0xE6A9, 0x8247, 0xEFF3, 0x8259, 0xF3ED, 0x8264, 0xEBFA, 0x8266, 0xF9E6, + 0x826E, 0xCADD, 0x826F, 0xD5DE, 0x8271, 0xCADE, 0x8272, 0xDFE4, 0x8276, 0xE6FD, 0x8278, 0xF5AC, 0x827E, 0xE4F5, 0x828B, 0xE9E3, + 0x828D, 0xEDCB, 0x828E, 0xCFE4, 0x8292, 0xD8D3, 0x8299, 0xDDB3, 0x829A, 0xD4EC, 0x829D, 0xF2B9, 0x829F, 0xDFB7, 0x82A5, 0xCBCE, + 0x82A6, 0xFBD8, 0x82A9, 0xD0D9, 0x82AC, 0xDDD2, 0x82AD, 0xF7F4, 0x82AE, 0xE7DC, 0x82AF, 0xE4A5, 0x82B1, 0xFCA3, 0x82B3, 0xDBBB, + 0x82B7, 0xF2BA, 0x82B8, 0xE9FD, 0x82B9, 0xD0CA, 0x82BB, 0xF5D6, 0x82BC, 0xD9C5, 0x82BD, 0xE4B4, 0x82BF, 0xEDA7, 0x82D1, 0xEABD, + 0x82D2, 0xE6FE, 0x82D4, 0xF7C4, 0x82D5, 0xF5AD, 0x82D7, 0xD9E0, 0x82DB, 0xCAB4, 0x82DE, 0xF8E2, 0x82DF, 0xCFC2, 0x82E1, 0xECBE, + 0x82E5, 0xE5B4, 0x82E6, 0xCDC8, 0x82E7, 0xEEC8, 0x82F1, 0xE7C8, 0x82FD, 0xCDC9, 0x82FE, 0xF9B7, 0x8301, 0xF1E8, 0x8302, 0xD9F2, + 0x8303, 0xDBF5, 0x8304, 0xCAB5, 0x8305, 0xD9C6, 0x8309, 0xD8C9, 0x8317, 0xD9AB, 0x8328, 0xEDBC, 0x832B, 0xD8D4, 0x832F, 0xDCDA, + 0x8331, 0xE2BC, 0x8334, 0xFCED, 0x8335, 0xECE0, 0x8336, 0xD2FE, 0x8338, 0xE9C7, 0x8339, 0xE6AA, 0x8340, 0xE2F0, 0x8347, 0xFABB, + 0x8349, 0xF5AE, 0x834A, 0xFBAA, 0x834F, 0xECFB, 0x8351, 0xECBF, 0x8352, 0xFCD8, 0x8373, 0xD4E5, 0x8377, 0xF9C3, 0x837B, 0xEEE2, + 0x8389, 0xD7E9, 0x838A, 0xEDF6, 0x838E, 0xDEED, 0x8396, 0xCCEC, 0x8398, 0xE3EE, 0x839E, 0xE8D4, 0x83A2, 0xFAF8, 0x83A9, 0xDDB4, + 0x83AA, 0xE4B5, 0x83AB, 0xD8B0, 0x83BD, 0xD8D5, 0x83C1, 0xF4EA, 0x83C5, 0xCEB9, 0x83C9, 0xD6E1, 0x83CA, 0xCFD2, 0x83CC, 0xD0B6, + 0x83D3, 0xCEA2, 0x83D6, 0xF3EE, 0x83DC, 0xF3F8, 0x83E9, 0xDCCC, 0x83EB, 0xD0CB, 0x83EF, 0xFCA4, 0x83F0, 0xCDCA, 0x83F1, 0xD7D4, + 0x83F2, 0xDEA3, 0x83F4, 0xE4E0, 0x83F9, 0xEEC9, 0x83FD, 0xE2DD, 0x8403, 0xF5FE, 0x8404, 0xD4AC, 0x840A, 0xD5D1, 0x840C, 0xD8F0, + 0x840D, 0xF8C3, 0x840E, 0xEAD7, 0x8429, 0xF5D7, 0x842C, 0xD8BF, 0x8431, 0xFDC0, 0x8438, 0xEBAD, 0x843D, 0xD5AA, 0x8449, 0xE7A8, + 0x8457, 0xEECA, 0x845B, 0xCAE7, 0x8461, 0xF8E3, 0x8463, 0xD4DD, 0x8466, 0xEAD8, 0x846B, 0xFBD9, 0x846C, 0xEDF7, 0x846F, 0xE5B5, + 0x8475, 0xD0AD, 0x847A, 0xF1F1, 0x8490, 0xE2BD, 0x8494, 0xE3C8, 0x8499, 0xD9D5, 0x849C, 0xDFAA, 0x84A1, 0xDBBC, 0x84B2, 0xF8E4, + 0x84B8, 0xF1FA, 0x84BB, 0xE5B6, 0x84BC, 0xF3EF, 0x84BF, 0xFBDA, 0x84C0, 0xE1E0, 0x84C2, 0xD9AC, 0x84C4, 0xF5EB, 0x84C6, 0xE0B6, + 0x84C9, 0xE9C8, 0x84CB, 0xCBCF, 0x84CD, 0xE3C9, 0x84D1, 0xDEEE, 0x84DA, 0xE2BE, 0x84EC, 0xDCEF, 0x84EE, 0xD6A5, 0x84F4, 0xE2F1, + 0x84FC, 0xD6FE, 0x8511, 0xD9A1, 0x8513, 0xD8C0, 0x8514, 0xDCDB, 0x8517, 0xEDBD, 0x8518, 0xDFB8, 0x851A, 0xEAA5, 0x851E, 0xD7AD, + 0x8521, 0xF3F9, 0x8523, 0xEDF8, 0x8525, 0xF5C7, 0x852C, 0xE1CA, 0x852D, 0xEBE3, 0x852F, 0xF2DE, 0x853D, 0xF8CC, 0x853F, 0xEAD9, + 0x8541, 0xD3C6, 0x8543, 0xDBE6, 0x8549, 0xF5AF, 0x854E, 0xCEF0, 0x8553, 0xE9FE, 0x8559, 0xFBB6, 0x8563, 0xE2F2, 0x8568, 0xCFF2, + 0x8569, 0xF7B9, 0x856A, 0xD9F3, 0x856D, 0xE1CB, 0x8584, 0xDADD, 0x8587, 0xDAB9, 0x858F, 0xEBFB, 0x8591, 0xCBB9, 0x8594, 0xEDF9, + 0x859B, 0xE0E0, 0x85A6, 0xF4C0, 0x85A8, 0xFDBC, 0x85A9, 0xDFB1, 0x85AA, 0xE3EF, 0x85AF, 0xE0A3, 0x85B0, 0xFDB9, 0x85BA, 0xF0B1, + 0x85C1, 0xCDCB, 0x85C9, 0xEDBE, 0x85CD, 0xD5C0, 0x85CE, 0xE3F0, 0x85CF, 0xEDFA, 0x85D5, 0xE9E4, 0x85DC, 0xD5ED, 0x85DD, 0xE7DD, + 0x85E4, 0xD4F6, 0x85E5, 0xE5B7, 0x85E9, 0xDBE7, 0x85EA, 0xE2BF, 0x85F7, 0xEECB, 0x85FA, 0xD7F4, 0x85FB, 0xF0DD, 0x85FF, 0xCEAB, + 0x8602, 0xE7DE, 0x8606, 0xD6D6, 0x8607, 0xE1CC, 0x860A, 0xE8B3, 0x8616, 0xE5EE, 0x8617, 0xDCA2, 0x861A, 0xE0D0, 0x862D, 0xD5B5, + 0x863F, 0xD5A1, 0x864E, 0xFBDB, 0x8650, 0xF9CB, 0x8654, 0xCBF3, 0x8655, 0xF4A5, 0x865B, 0xFAC8, 0x865C, 0xD6D7, 0x865E, 0xE9E5, + 0x865F, 0xFBDC, 0x8667, 0xFDD0, 0x8679, 0xFBF6, 0x868A, 0xDAA5, 0x868C, 0xDBBD, 0x8693, 0xECE2, 0x86A3, 0xCDF7, 0x86A4, 0xF0DE, + 0x86A9, 0xF6C9, 0x86C7, 0xDEEF, 0x86CB, 0xD3B1, 0x86D4, 0xFCEE, 0x86D9, 0xE8C3, 0x86DB, 0xF1C8, 0x86DF, 0xCEF1, 0x86E4, 0xF9ED, + 0x86ED, 0xF2F4, 0x86FE, 0xE4B6, 0x8700, 0xF5B9, 0x8702, 0xDCF0, 0x8703, 0xE3F1, 0x8708, 0xE8A5, 0x8718, 0xF2BB, 0x871A, 0xDEA4, + 0x871C, 0xDACC, 0x874E, 0xCAE9, 0x8755, 0xE3DA, 0x8757, 0xFCD9, 0x875F, 0xEADA, 0x8766, 0xF9C4, 0x8768, 0xE3A4, 0x8774, 0xFBDD, + 0x8776, 0xEFCA, 0x8778, 0xE8C4, 0x8782, 0xD5CC, 0x878D, 0xEBD7, 0x879F, 0xD9AD, 0x87A2, 0xFBAB, 0x87B3, 0xD3D9, 0x87BA, 0xD5A2, + 0x87C4, 0xF6DE, 0x87E0, 0xDAF6, 0x87EC, 0xE0D1, 0x87EF, 0xE9A8, 0x87F2, 0xF5F9, 0x87F9, 0xFAAF, 0x87FB, 0xEBFC, 0x87FE, 0xE0EA, + 0x8805, 0xE3B2, 0x881F, 0xD5C5, 0x8822, 0xF1E3, 0x8823, 0xD5EE, 0x8831, 0xCDCC, 0x8836, 0xEDD9, 0x883B, 0xD8C1, 0x8840, 0xFAEC, + 0x8846, 0xF1EB, 0x884C, 0xFABC, 0x884D, 0xE6E2, 0x8852, 0xFAE5, 0x8853, 0xE2FA, 0x8857, 0xCAB6, 0x8859, 0xE4B7, 0x885B, 0xEADB, + 0x885D, 0xF5FA, 0x8861, 0xFBAC, 0x8862, 0xCFC3, 0x8863, 0xEBFD, 0x8868, 0xF8FA, 0x886B, 0xDFB9, 0x8870, 0xE1F1, 0x8872, 0xD2A4, + 0x8877, 0xF5FB, 0x887E, 0xD0DA, 0x887F, 0xD0DB, 0x8881, 0xEABE, 0x8882, 0xD9B1, 0x8888, 0xCAB7, 0x888B, 0xD3E7, 0x888D, 0xF8E5, + 0x8892, 0xD3B2, 0x8896, 0xE2C0, 0x8897, 0xF2DF, 0x889E, 0xCDE5, 0x88AB, 0xF9AC, 0x88B4, 0xCDCD, 0x88C1, 0xEEAE, 0x88C2, 0xD6AE, + 0x88CF, 0xD7EA, 0x88D4, 0xE7E0, 0x88D5, 0xEBAE, 0x88D9, 0xCFD9, 0x88DC, 0xDCCD, 0x88DD, 0xEDFB, 0x88DF, 0xDEF0, 0x88E1, 0xD7EB, + 0x88E8, 0xDEA5, 0x88F3, 0xDFD7, 0x88F4, 0xDBD0, 0x88F5, 0xDBD1, 0x88F8, 0xD5A3, 0x88FD, 0xF0B2, 0x8907, 0xDCDC, 0x8910, 0xCAE8, + 0x8912, 0xF8E6, 0x8913, 0xDCCE, 0x8918, 0xEADC, 0x8919, 0xDBD2, 0x8925, 0xE9B3, 0x892A, 0xF7DB, 0x8936, 0xE3A8, 0x8938, 0xD7AE, + 0x893B, 0xE0E1, 0x8941, 0xCBBA, 0x8944, 0xE5D1, 0x895F, 0xD0DC, 0x8964, 0xD5C1, 0x896A, 0xD8CA, 0x8972, 0xE3A9, 0x897F, 0xE0A4, + 0x8981, 0xE9A9, 0x8983, 0xD3C7, 0x8986, 0xDCDD, 0x8987, 0xF8AE, 0x898B, 0xCCB8, 0x898F, 0xD0AE, 0x8993, 0xD8F2, 0x8996, 0xE3CA, + 0x89A1, 0xCCAF, 0x89A9, 0xD4AD, 0x89AA, 0xF6D1, 0x89B2, 0xD0CC, 0x89BA, 0xCAC6, 0x89BD, 0xD5C2, 0x89C0, 0xCEBA, 0x89D2, 0xCAC7, + 0x89E3, 0xFAB0, 0x89F4, 0xDFD8, 0x89F8, 0xF5BA, 0x8A00, 0xE5EB, 0x8A02, 0xEFF4, 0x8A03, 0xDDB5, 0x8A08, 0xCDAA, 0x8A0A, 0xE3F2, + 0x8A0C, 0xFBF7, 0x8A0E, 0xF7D0, 0x8A13, 0xFDBA, 0x8A16, 0xFDE1, 0x8A17, 0xF6FE, 0x8A18, 0xD1C0, 0x8A1B, 0xE8C5, 0x8A1D, 0xE4B8, + 0x8A1F, 0xE1E8, 0x8A23, 0xCCC1, 0x8A25, 0xD2ED, 0x8A2A, 0xDBBE, 0x8A2D, 0xE0E2, 0x8A31, 0xFAC9, 0x8A34, 0xE1CD, 0x8A36, 0xCAB8, + 0x8A3A, 0xF2E0, 0x8A3B, 0xF1C9, 0x8A50, 0xDEF1, 0x8A54, 0xF0DF, 0x8A55, 0xF8C4, 0x8A5B, 0xEECC, 0x8A5E, 0xDEF2, 0x8A60, 0xE7C9, + 0x8A62, 0xE2F3, 0x8A63, 0xE7E1, 0x8A66, 0xE3CB, 0x8A69, 0xE3CC, 0x8A6D, 0xCFF8, 0x8A6E, 0xEFAC, 0x8A70, 0xFDFE, 0x8A71, 0xFCA5, + 0x8A72, 0xFAB1, 0x8A73, 0xDFD9, 0x8A75, 0xE0D2, 0x8A79, 0xF4DA, 0x8A85, 0xF1CA, 0x8A87, 0xCEA3, 0x8A8C, 0xF2BC, 0x8A8D, 0xECE3, + 0x8A93, 0xE0A5, 0x8A95, 0xF7AB, 0x8A98, 0xEBAF, 0x8A9E, 0xE5DE, 0x8AA0, 0xE1A4, 0x8AA1, 0xCDAB, 0x8AA3, 0xD9F4, 0x8AA4, 0xE8A6, + 0x8AA5, 0xCDCE, 0x8AA6, 0xE1E9, 0x8AA8, 0xFCEF, 0x8AAA, 0xE0E3, 0x8AB0, 0xE2C1, 0x8AB2, 0xCEA4, 0x8AB9, 0xDEA6, 0x8ABC, 0xEBFE, + 0x8ABE, 0xEBDD, 0x8ABF, 0xF0E0, 0x8AC2, 0xF4DB, 0x8AC4, 0xE2F4, 0x8AC7, 0xD3C8, 0x8ACB, 0xF4EB, 0x8ACD, 0xEEB5, 0x8ACF, 0xF5D8, + 0x8AD2, 0xD5DF, 0x8AD6, 0xD6E5, 0x8ADB, 0xEBB0, 0x8ADC, 0xF4E3, 0x8AE1, 0xE3CD, 0x8AE6, 0xF4F4, 0x8AE7, 0xFAB2, 0x8AEA, 0xEFF5, + 0x8AEB, 0xCADF, 0x8AED, 0xEBB1, 0x8AEE, 0xEDBF, 0x8AF1, 0xFDC9, 0x8AF6, 0xE4A6, 0x8AF7, 0xF9A4, 0x8AF8, 0xF0B3, 0x8AFA, 0xE5EC, + 0x8AFE, 0xD1E7, 0x8B00, 0xD9C7, 0x8B01, 0xE4D7, 0x8B02, 0xEADD, 0x8B04, 0xD4F7, 0x8B0E, 0xDABA, 0x8B10, 0xDACD, 0x8B14, 0xF9CC, + 0x8B16, 0xE1DA, 0x8B17, 0xDBBF, 0x8B19, 0xCCC5, 0x8B1A, 0xECD0, 0x8B1B, 0xCBBB, 0x8B1D, 0xDEF3, 0x8B20, 0xE9AA, 0x8B28, 0xD9C8, + 0x8B2B, 0xEEE3, 0x8B2C, 0xD7BD, 0x8B33, 0xCFC4, 0x8B39, 0xD0CD, 0x8B41, 0xFCA6, 0x8B49, 0xF1FB, 0x8B4E, 0xFDD2, 0x8B4F, 0xD1C1, + 0x8B58, 0xE3DB, 0x8B5A, 0xD3C9, 0x8B5C, 0xDCCF, 0x8B66, 0xCCED, 0x8B6C, 0xDEA7, 0x8B6F, 0xE6BB, 0x8B70, 0xECA1, 0x8B74, 0xCCB9, + 0x8B77, 0xFBDE, 0x8B7D, 0xE7E2, 0x8B80, 0xD4C1, 0x8B8A, 0xDCA8, 0x8B90, 0xE2C2, 0x8B92, 0xF3D8, 0x8B93, 0xE5D3, 0x8B96, 0xF3D9, + 0x8B9A, 0xF3C6, 0x8C37, 0xCDDB, 0x8C3F, 0xCDAC, 0x8C41, 0xFCC3, 0x8C46, 0xD4E7, 0x8C48, 0xD1C2, 0x8C4A, 0xF9A5, 0x8C4C, 0xE8D5, + 0x8C55, 0xE3CE, 0x8C5A, 0xD4CA, 0x8C61, 0xDFDA, 0x8C6A, 0xFBDF, 0x8C6B, 0xE7E3, 0x8C79, 0xF8FB, 0x8C7A, 0xE3CF, 0x8C82, 0xF5B0, + 0x8C8A, 0xD8E7, 0x8C8C, 0xD9C9, 0x8C9D, 0xF8AF, 0x8C9E, 0xEFF6, 0x8CA0, 0xDDB6, 0x8CA1, 0xEEAF, 0x8CA2, 0xCDF8, 0x8CA7, 0xDEB8, + 0x8CA8, 0xFCA7, 0x8CA9, 0xF7FC, 0x8CAA, 0xF7B1, 0x8CAB, 0xCEBB, 0x8CAC, 0xF4A1, 0x8CAF, 0xEECD, 0x8CB0, 0xE1AE, 0x8CB3, 0xECC3, + 0x8CB4, 0xCFFE, 0x8CB6, 0xF8BF, 0x8CB7, 0xD8E2, 0x8CB8, 0xD3E8, 0x8CBB, 0xDEA8, 0x8CBC, 0xF4E4, 0x8CBD, 0xECC2, 0x8CBF, 0xD9F5, + 0x8CC0, 0xF9C5, 0x8CC1, 0xDDD3, 0x8CC2, 0xD6F1, 0x8CC3, 0xECFC, 0x8CC4, 0xFCF0, 0x8CC7, 0xEDC0, 0x8CC8, 0xCAB9, 0x8CCA, 0xEEE4, + 0x8CD1, 0xF2E1, 0x8CD3, 0xDEB9, 0x8CDA, 0xD6F2, 0x8CDC, 0xDEF4, 0x8CDE, 0xDFDB, 0x8CE0, 0xDBD3, 0x8CE2, 0xFAE7, 0x8CE3, 0xD8E3, + 0x8CE4, 0xF4C1, 0x8CE6, 0xDDB7, 0x8CEA, 0xF2F5, 0x8CED, 0xD4AE, 0x8CF4, 0xD6F3, 0x8CFB, 0xDDB8, 0x8CFC, 0xCFC5, 0x8CFD, 0xDFDF, + 0x8D04, 0xF2BE, 0x8D05, 0xF6A1, 0x8D07, 0xEBCB, 0x8D08, 0xF1FC, 0x8D0A, 0xF3C7, 0x8D0D, 0xE0EB, 0x8D13, 0xEDFC, 0x8D16, 0xE1DB, + 0x8D64, 0xEEE5, 0x8D66, 0xDEF5, 0x8D6B, 0xFAD3, 0x8D70, 0xF1CB, 0x8D73, 0xD0AF, 0x8D74, 0xDDB9, 0x8D77, 0xD1C3, 0x8D85, 0xF5B1, + 0x8D8A, 0xEAC6, 0x8D99, 0xF0E1, 0x8DA3, 0xF6AC, 0x8DA8, 0xF5D9, 0x8DB3, 0xF0EB, 0x8DBA, 0xDDBA, 0x8DBE, 0xF2BF, 0x8DC6, 0xF7C5, + 0x8DCB, 0xDBA2, 0x8DCC, 0xF2F6, 0x8DCF, 0xCABA, 0x8DDB, 0xF7F5, 0x8DDD, 0xCBE5, 0x8DE1, 0xEEE6, 0x8DE3, 0xE0D3, 0x8DE8, 0xCEA5, + 0x8DEF, 0xD6D8, 0x8DF3, 0xD4AF, 0x8E0A, 0xE9C9, 0x8E0F, 0xD3CE, 0x8E10, 0xF4C2, 0x8E1E, 0xCBE6, 0x8E2A, 0xF1A1, 0x8E30, 0xEBB2, + 0x8E35, 0xF1A2, 0x8E42, 0xEBB3, 0x8E44, 0xF0B4, 0x8E47, 0xCBF4, 0x8E48, 0xD4B0, 0x8E49, 0xF3B2, 0x8E4A, 0xFBB7, 0x8E59, 0xF5EC, + 0x8E5F, 0xEEE7, 0x8E60, 0xF4B2, 0x8E74, 0xF5ED, 0x8E76, 0xCFF3, 0x8E81, 0xF0E2, 0x8E87, 0xEECE, 0x8E8A, 0xF1CC, 0x8E8D, 0xE5B8, + 0x8EAA, 0xD7F5, 0x8EAB, 0xE3F3, 0x8EAC, 0xCFE5, 0x8EC0, 0xCFC6, 0x8ECA, 0xF3B3, 0x8ECB, 0xE4D8, 0x8ECC, 0xCFF9, 0x8ECD, 0xCFDA, + 0x8ED2, 0xFACD, 0x8EDF, 0xE6E3, 0x8EEB, 0xF2E2, 0x8EF8, 0xF5EE, 0x8EFB, 0xCABB, 0x8EFE, 0xE3DC, 0x8F03, 0xCEF2, 0x8F05, 0xD6D9, + 0x8F09, 0xEEB0, 0x8F12, 0xF4E5, 0x8F13, 0xD8C2, 0x8F14, 0xDCD0, 0x8F15, 0xCCEE, 0x8F1B, 0xD5E0, 0x8F1C, 0xF6CA, 0x8F1D, 0xFDCA, + 0x8F1E, 0xD8D6, 0x8F1F, 0xF4CF, 0x8F26, 0xD6A6, 0x8F27, 0xDCBE, 0x8F29, 0xDBD4, 0x8F2A, 0xD7C7, 0x8F2F, 0xF2FE, 0x8F33, 0xF1CD, + 0x8F38, 0xE2C3, 0x8F39, 0xDCDE, 0x8F3B, 0xDCDF, 0x8F3E, 0xEFAD, 0x8F3F, 0xE6AB, 0x8F44, 0xF9DD, 0x8F45, 0xEABF, 0x8F49, 0xEFAE, + 0x8F4D, 0xF4D0, 0x8F4E, 0xCEF3, 0x8F5D, 0xE6AC, 0x8F5F, 0xCEDE, 0x8F62, 0xD5F9, 0x8F9B, 0xE3F4, 0x8F9C, 0xCDD0, 0x8FA3, 0xD5B8, + 0x8FA6, 0xF7FD, 0x8FA8, 0xDCA9, 0x8FAD, 0xDEF6, 0x8FAF, 0xDCAA, 0x8FB0, 0xF2E3, 0x8FB1, 0xE9B4, 0x8FB2, 0xD2DC, 0x8FC2, 0xE9E6, + 0x8FC5, 0xE3F6, 0x8FCE, 0xE7CA, 0x8FD1, 0xD0CE, 0x8FD4, 0xDAF7, 0x8FE6, 0xCABC, 0x8FEA, 0xEEE8, 0x8FEB, 0xDADE, 0x8FED, 0xF2F7, + 0x8FF0, 0xE2FB, 0x8FF2, 0xCCA6, 0x8FF7, 0xDABB, 0x8FF9, 0xEEE9, 0x8FFD, 0xF5DA, 0x9000, 0xF7DC, 0x9001, 0xE1EA, 0x9002, 0xCEC1, + 0x9003, 0xD4B1, 0x9005, 0xFDB1, 0x9006, 0xE6BD, 0x9008, 0xFBAD, 0x900B, 0xF8E7, 0x900D, 0xE1CE, 0x900F, 0xF7E2, 0x9010, 0xF5EF, + 0x9011, 0xCFC7, 0x9014, 0xD4B2, 0x9015, 0xCCEF, 0x9017, 0xD4E8, 0x9019, 0xEECF, 0x901A, 0xF7D7, 0x901D, 0xE0A6, 0x901E, 0xD6C1, + 0x901F, 0xE1DC, 0x9020, 0xF0E3, 0x9021, 0xF1E4, 0x9022, 0xDCF1, 0x9023, 0xD6A7, 0x902E, 0xF4F5, 0x9031, 0xF1CE, 0x9032, 0xF2E4, + 0x9035, 0xD0B0, 0x9038, 0xECEF, 0x903C, 0xF9BA, 0x903E, 0xEBB5, 0x9041, 0xD4ED, 0x9042, 0xE2C4, 0x9047, 0xE9E7, 0x904A, 0xEBB4, + 0x904B, 0xEAA1, 0x904D, 0xF8BC, 0x904E, 0xCEA6, 0x9050, 0xF9C6, 0x9051, 0xFCDA, 0x9053, 0xD4B3, 0x9054, 0xD3B9, 0x9055, 0xEADE, + 0x9059, 0xE9AB, 0x905C, 0xE1E1, 0x905D, 0xD3CF, 0x905E, 0xF4F6, 0x9060, 0xEAC0, 0x9061, 0xE1CF, 0x9063, 0xCCBA, 0x9069, 0xEEEA, + 0x906D, 0xF0E4, 0x906E, 0xF3B4, 0x906F, 0xD4EE, 0x9072, 0xF2C0, 0x9075, 0xF1E5, 0x9077, 0xF4C3, 0x9078, 0xE0D4, 0x907A, 0xEBB6, + 0x907C, 0xD7A1, 0x907D, 0xCBE8, 0x907F, 0xF9AD, 0x9080, 0xE9AD, 0x9081, 0xD8E4, 0x9082, 0xFAB3, 0x9083, 0xE2C5, 0x9084, 0xFCBD, + 0x9087, 0xECC4, 0x9088, 0xD8B1, 0x908A, 0xDCAB, 0x908F, 0xD5A4, 0x9091, 0xEBE9, 0x9095, 0xE8BB, 0x9099, 0xD8D7, 0x90A2, 0xFBAE, + 0x90A3, 0xD1E1, 0x90A6, 0xDBC0, 0x90A8, 0xF5BE, 0x90AA, 0xDEF7, 0x90AF, 0xCAFB, 0x90B0, 0xF7C6, 0x90B1, 0xCFC8, 0x90B5, 0xE1D0, + 0x90B8, 0xEED0, 0x90C1, 0xE9F4, 0x90CA, 0xCEF4, 0x90DE, 0xD5CD, 0x90E1, 0xCFDB, 0x90E8, 0xDDBB, 0x90ED, 0xCEAC, 0x90F5, 0xE9E8, + 0x90FD, 0xD4B4, 0x9102, 0xE4C7, 0x9112, 0xF5DB, 0x9115, 0xFAC1, 0x9119, 0xDEA9, 0x9127, 0xD4F8, 0x912D, 0xEFF7, 0x9132, 0xD3B3, + 0x9149, 0xEBB7, 0x914A, 0xEFF8, 0x914B, 0xF5DC, 0x914C, 0xEDCC, 0x914D, 0xDBD5, 0x914E, 0xF1CF, 0x9152, 0xF1D0, 0x9162, 0xF5B2, + 0x9169, 0xD9AE, 0x916A, 0xD5AC, 0x916C, 0xE2C6, 0x9175, 0xFDA3, 0x9177, 0xFBE5, 0x9178, 0xDFAB, 0x9187, 0xE2F5, 0x9189, 0xF6AD, + 0x918B, 0xF5B3, 0x918D, 0xF0B5, 0x9192, 0xE1A5, 0x919C, 0xF5DD, 0x91AB, 0xECA2, 0x91AC, 0xEDFD, 0x91AE, 0xF5B4, 0x91AF, 0xFBB8, + 0x91B1, 0xDBA3, 0x91B4, 0xD6CA, 0x91B5, 0xCBD9, 0x91C0, 0xE5D4, 0x91C7, 0xF3FA, 0x91C9, 0xEBB8, 0x91CB, 0xE0B7, 0x91CC, 0xD7EC, + 0x91CD, 0xF1EC, 0x91CE, 0xE5AF, 0x91CF, 0xD5E1, 0x91D0, 0xD7ED, 0x91D1, 0xD1D1, 0x91D7, 0xE1F2, 0x91D8, 0xEFF9, 0x91DC, 0xDDBC, + 0x91DD, 0xF6DC, 0x91E3, 0xF0E5, 0x91E7, 0xF4C4, 0x91EA, 0xE9E9, 0x91F5, 0xF3FB, 0x920D, 0xD4EF, 0x9210, 0xCCA2, 0x9211, 0xF7FE, + 0x9212, 0xDFBC, 0x9217, 0xEBCD, 0x921E, 0xD0B7, 0x9234, 0xD6C2, 0x923A, 0xE8AD, 0x923F, 0xEFAF, 0x9240, 0xCBA5, 0x9245, 0xCBE9, + 0x9249, 0xFAE8, 0x9257, 0xCCC6, 0x925B, 0xE6E7, 0x925E, 0xEAC7, 0x9262, 0xDBA4, 0x9264, 0xCFC9, 0x9265, 0xE2FC, 0x9266, 0xEFFA, + 0x9280, 0xEBDE, 0x9283, 0xF5C8, 0x9285, 0xD4DE, 0x9291, 0xE0D5, 0x9293, 0xEFB0, 0x9296, 0xE2C7, 0x9298, 0xD9AF, 0x929C, 0xF9E7, + 0x92B3, 0xE7E5, 0x92B6, 0xCFCA, 0x92B7, 0xE1D1, 0x92B9, 0xE2C8, 0x92CC, 0xEFFB, 0x92CF, 0xFAF9, 0x92D2, 0xDCF2, 0x92E4, 0xE0A7, + 0x92EA, 0xF8E8, 0x92F8, 0xCBEA, 0x92FC, 0xCBBC, 0x9304, 0xD6E2, 0x9310, 0xF5DE, 0x9318, 0xF5DF, 0x931A, 0xEEB6, 0x931E, 0xE2F6, + 0x931F, 0xD3CA, 0x9320, 0xEFFC, 0x9321, 0xD1C4, 0x9322, 0xEFB1, 0x9324, 0xD1C5, 0x9326, 0xD0DE, 0x9328, 0xD9E1, 0x932B, 0xE0B8, + 0x932E, 0xCDD1, 0x932F, 0xF3B9, 0x9348, 0xE7CC, 0x934A, 0xD6A8, 0x934B, 0xCEA7, 0x934D, 0xD4B5, 0x9354, 0xE4C8, 0x935B, 0xD3B4, + 0x936E, 0xEBB9, 0x9375, 0xCBF5, 0x937C, 0xF6DD, 0x937E, 0xF1A3, 0x938C, 0xCCC7, 0x9394, 0xE9CA, 0x9396, 0xE1F0, 0x939A, 0xF5E0, + 0x93A3, 0xFBAF, 0x93A7, 0xCBD1, 0x93AC, 0xFBE0, 0x93AD, 0xF2E5, 0x93B0, 0xECF0, 0x93C3, 0xF0EC, 0x93D1, 0xEEEB, 0x93DE, 0xE9CB, + 0x93E1, 0xCCF0, 0x93E4, 0xD7AF, 0x93F6, 0xF3A1, 0x9404, 0xFCF5, 0x9418, 0xF1A4, 0x9425, 0xE0D6, 0x942B, 0xEFB2, 0x9435, 0xF4D1, + 0x9438, 0xF7A1, 0x9444, 0xF1D1, 0x9451, 0xCAFC, 0x9452, 0xCAFD, 0x945B, 0xCECE, 0x947D, 0xF3C8, 0x947F, 0xF3BA, 0x9577, 0xEDFE, + 0x9580, 0xDAA6, 0x9583, 0xE0EC, 0x9589, 0xF8CD, 0x958B, 0xCBD2, 0x958F, 0xEBCE, 0x9591, 0xF9D8, 0x9592, 0xF9D9, 0x9593, 0xCAE0, + 0x9594, 0xDACA, 0x9598, 0xCBA6, 0x95A3, 0xCAC8, 0x95A4, 0xF9EE, 0x95A5, 0xDBEC, 0x95A8, 0xD0B1, 0x95AD, 0xD5EF, 0x95B1, 0xE6F3, + 0x95BB, 0xE7A2, 0x95BC, 0xE4D9, 0x95C7, 0xE4E1, 0x95CA, 0xFCC4, 0x95D4, 0xF9EF, 0x95D5, 0xCFF4, 0x95D6, 0xF7E6, 0x95DC, 0xCEBC, + 0x95E1, 0xF4C5, 0x95E2, 0xDCA3, 0x961C, 0xDDBD, 0x9621, 0xF4C6, 0x962A, 0xF8A1, 0x962E, 0xE8D6, 0x9632, 0xDBC1, 0x963B, 0xF0E6, + 0x963F, 0xE4B9, 0x9640, 0xF6ED, 0x9642, 0xF9AE, 0x9644, 0xDDBE, 0x964B, 0xD7B0, 0x964C, 0xD8E8, 0x964D, 0xCBBD, 0x9650, 0xF9DA, + 0x965B, 0xF8CE, 0x965C, 0xF9F0, 0x965D, 0xE0ED, 0x965E, 0xE3B3, 0x965F, 0xF4B3, 0x9662, 0xEAC2, 0x9663, 0xF2E6, 0x9664, 0xF0B6, + 0x966A, 0xDBD6, 0x9670, 0xEBE4, 0x9673, 0xF2E7, 0x9675, 0xD7D5, 0x9676, 0xD4B6, 0x9677, 0xF9E8, 0x9678, 0xD7C1, 0x967D, 0xE5D5, + 0x9685, 0xE9EA, 0x9686, 0xD7CC, 0x968A, 0xD3E9, 0x968B, 0xE2C9, 0x968D, 0xFCDB, 0x968E, 0xCDAD, 0x9694, 0xCCB0, 0x9695, 0xEAA2, + 0x9698, 0xE4F6, 0x9699, 0xD0C0, 0x969B, 0xF0B7, 0x969C, 0xEEA1, 0x96A3, 0xD7F6, 0x96A7, 0xE2CA, 0x96A8, 0xE2CB, 0x96AA, 0xFACF, + 0x96B1, 0xEBDF, 0x96B7, 0xD6CB, 0x96BB, 0xF4B4, 0x96C0, 0xEDCD, 0x96C1, 0xE4D2, 0x96C4, 0xEAA9, 0x96C5, 0xE4BA, 0x96C6, 0xF3A2, + 0x96C7, 0xCDD2, 0x96C9, 0xF6CB, 0x96CB, 0xF1E6, 0x96CC, 0xEDC1, 0x96CD, 0xE8BC, 0x96CE, 0xEED1, 0x96D5, 0xF0E7, 0x96D6, 0xE2CC, + 0x96D9, 0xE4AA, 0x96DB, 0xF5E1, 0x96DC, 0xEDDA, 0x96E2, 0xD7EE, 0x96E3, 0xD1F1, 0x96E8, 0xE9EB, 0x96E9, 0xE9EC, 0x96EA, 0xE0E4, + 0x96EF, 0xDAA7, 0x96F0, 0xDDD4, 0x96F2, 0xEAA3, 0x96F6, 0xD6C3, 0x96F7, 0xD6F4, 0x96F9, 0xDADF, 0x96FB, 0xEFB3, 0x9700, 0xE2CD, + 0x9706, 0xEFFD, 0x9707, 0xF2E8, 0x9711, 0xEFC5, 0x9713, 0xE7E7, 0x9716, 0xD7FD, 0x9719, 0xE7CE, 0x971C, 0xDFDC, 0x971E, 0xF9C7, + 0x9727, 0xD9F6, 0x9730, 0xDFAC, 0x9732, 0xD6DA, 0x9739, 0xDCA4, 0x973D, 0xF0B8, 0x9742, 0xD5FA, 0x9744, 0xE4F7, 0x9748, 0xD6C4, + 0x9751, 0xF4EC, 0x9756, 0xEFFE, 0x975C, 0xF0A1, 0x975E, 0xDEAA, 0x9761, 0xDABC, 0x9762, 0xD8FC, 0x9769, 0xFAD4, 0x976D, 0xECE5, + 0x9774, 0xFCA8, 0x9777, 0xECE6, 0x977A, 0xD8CB, 0x978B, 0xFBB9, 0x978D, 0xE4D3, 0x978F, 0xCDF9, 0x97A0, 0xCFD3, 0x97A8, 0xCAEA, + 0x97AB, 0xCFD4, 0x97AD, 0xF8BD, 0x97C6, 0xF4C7, 0x97CB, 0xEADF, 0x97D3, 0xF9DB, 0x97DC, 0xD4B7, 0x97F3, 0xEBE5, 0x97F6, 0xE1D2, + 0x97FB, 0xEAA4, 0x97FF, 0xFAC2, 0x9800, 0xFBE1, 0x9801, 0xFAED, 0x9802, 0xF0A2, 0x9803, 0xCCF1, 0x9805, 0xFAA3, 0x9806, 0xE2F7, + 0x9808, 0xE2CE, 0x980A, 0xE9F5, 0x980C, 0xE1EB, 0x9810, 0xE7E8, 0x9811, 0xE8D7, 0x9812, 0xDAF8, 0x9813, 0xD4CB, 0x9817, 0xF7F6, + 0x9818, 0xD6C5, 0x982D, 0xD4E9, 0x9830, 0xFAFA, 0x9838, 0xCCF2, 0x9839, 0xF7DD, 0x983B, 0xDEBA, 0x9846, 0xCEA8, 0x984C, 0xF0B9, + 0x984D, 0xE4FE, 0x984E, 0xE4C9, 0x9854, 0xE4D4, 0x9858, 0xEAC3, 0x985A, 0xEFB4, 0x985E, 0xD7BE, 0x9865, 0xFBE2, 0x9867, 0xCDD3, + 0x986B, 0xEFB5, 0x986F, 0xFAE9, 0x98A8, 0xF9A6, 0x98AF, 0xDFBD, 0x98B1, 0xF7C7, 0x98C4, 0xF8FD, 0x98C7, 0xF8FC, 0x98DB, 0xDEAB, + 0x98DC, 0xDBE8, 0x98DF, 0xE3DD, 0x98E1, 0xE1E2, 0x98E2, 0xD1C6, 0x98ED, 0xF6D0, 0x98EE, 0xEBE6, 0x98EF, 0xDAF9, 0x98F4, 0xECC7, + 0x98FC, 0xDEF8, 0x98FD, 0xF8E9, 0x98FE, 0xE3DE, 0x9903, 0xCEF5, 0x9909, 0xFAC3, 0x990A, 0xE5D7, 0x990C, 0xECC8, 0x9910, 0xF3C9, + 0x9913, 0xE4BB, 0x9918, 0xE6AE, 0x991E, 0xEFB6, 0x9920, 0xDCBF, 0x9928, 0xCEBD, 0x9945, 0xD8C3, 0x9949, 0xD0CF, 0x994B, 0xCFFA, + 0x994C, 0xF3CA, 0x994D, 0xE0D7, 0x9951, 0xD1C7, 0x9952, 0xE9AE, 0x9954, 0xE8BD, 0x9957, 0xFAC4, 0x9996, 0xE2CF, 0x9999, 0xFAC5, + 0x999D, 0xF9B8, 0x99A5, 0xDCE0, 0x99A8, 0xFBB0, 0x99AC, 0xD8A9, 0x99AD, 0xE5DF, 0x99AE, 0xF9A7, 0x99B1, 0xF6EE, 0x99B3, 0xF6CC, + 0x99B4, 0xE2F8, 0x99B9, 0xECF1, 0x99C1, 0xDAE0, 0x99D0, 0xF1D2, 0x99D1, 0xD2CC, 0x99D2, 0xCFCB, 0x99D5, 0xCABD, 0x99D9, 0xDDBF, + 0x99DD, 0xF6EF, 0x99DF, 0xDEF9, 0x99ED, 0xFAB4, 0x99F1, 0xD5AD, 0x99FF, 0xF1E7, 0x9A01, 0xDEBE, 0x9A08, 0xDCC0, 0x9A0E, 0xD1C8, + 0x9A0F, 0xD1C9, 0x9A19, 0xF8BE, 0x9A2B, 0xCBF6, 0x9A30, 0xD4F9, 0x9A36, 0xF5E2, 0x9A37, 0xE1D3, 0x9A40, 0xD8E9, 0x9A43, 0xF8FE, + 0x9A45, 0xCFCC, 0x9A4D, 0xFDA4, 0x9A55, 0xCEF6, 0x9A57, 0xFAD0, 0x9A5A, 0xCCF3, 0x9A5B, 0xE6BE, 0x9A5F, 0xF6AE, 0x9A62, 0xD5F0, + 0x9A65, 0xD1CA, 0x9A69, 0xFCBE, 0x9A6A, 0xD5F1, 0x9AA8, 0xCDE9, 0x9AB8, 0xFAB5, 0x9AD3, 0xE2D0, 0x9AD4, 0xF4F7, 0x9AD8, 0xCDD4, + 0x9AE5, 0xE7A3, 0x9AEE, 0xDBA5, 0x9B1A, 0xE2D1, 0x9B27, 0xD7A2, 0x9B2A, 0xF7E3, 0x9B31, 0xEAA6, 0x9B3C, 0xD0A1, 0x9B41, 0xCEDA, + 0x9B42, 0xFBEB, 0x9B43, 0xDBA6, 0x9B44, 0xDBDE, 0x9B45, 0xD8E5, 0x9B4F, 0xEAE0, 0x9B54, 0xD8AA, 0x9B5A, 0xE5E0, 0x9B6F, 0xD6DB, + 0x9B8E, 0xEFC6, 0x9B91, 0xF8EA, 0x9B9F, 0xE4D5, 0x9BAB, 0xCEF7, 0x9BAE, 0xE0D8, 0x9BC9, 0xD7EF, 0x9BD6, 0xF4ED, 0x9BE4, 0xCDE6, + 0x9BE8, 0xCCF4, 0x9C0D, 0xF5E3, 0x9C10, 0xE4CA, 0x9C12, 0xDCE1, 0x9C15, 0xF9C8, 0x9C25, 0xFCBF, 0x9C32, 0xE8A7, 0x9C3B, 0xD8C4, + 0x9C47, 0xCBBE, 0x9C49, 0xDCAE, 0x9C57, 0xD7F7, 0x9CE5, 0xF0E8, 0x9CE7, 0xDDC0, 0x9CE9, 0xCFCD, 0x9CF3, 0xDCF3, 0x9CF4, 0xD9B0, + 0x9CF6, 0xE6E9, 0x9D09, 0xE4BC, 0x9D1B, 0xEAC4, 0x9D26, 0xE4EC, 0x9D28, 0xE4E5, 0x9D3B, 0xFBF8, 0x9D51, 0xCCBB, 0x9D5D, 0xE4BD, + 0x9D60, 0xCDDC, 0x9D61, 0xD9F7, 0x9D6C, 0xDDDF, 0x9D72, 0xEDCE, 0x9DA9, 0xD9D0, 0x9DAF, 0xE5A3, 0x9DB4, 0xF9CD, 0x9DC4, 0xCDAE, + 0x9DD7, 0xCFCE, 0x9DF2, 0xF6AF, 0x9DF8, 0xFDD3, 0x9DF9, 0xEBED, 0x9DFA, 0xD6DC, 0x9E1A, 0xE5A4, 0x9E1E, 0xD5B6, 0x9E75, 0xD6DD, + 0x9E79, 0xF9E9, 0x9E7D, 0xE7A4, 0x9E7F, 0xD6E3, 0x9E92, 0xD1CB, 0x9E93, 0xD6E4, 0x9E97, 0xD5F2, 0x9E9D, 0xDEFA, 0x9E9F, 0xD7F8, + 0x9EA5, 0xD8EA, 0x9EB4, 0xCFD5, 0x9EB5, 0xD8FD, 0x9EBB, 0xD8AB, 0x9EBE, 0xFDCB, 0x9EC3, 0xFCDC, 0x9ECD, 0xE0A8, 0x9ECE, 0xD5F3, + 0x9ED1, 0xFDD9, 0x9ED4, 0xCCA3, 0x9ED8, 0xD9F9, 0x9EDB, 0xD3EA, 0x9EDC, 0xF5F5, 0x9EDE, 0xEFC7, 0x9EE8, 0xD3DA, 0x9EF4, 0xDABD, + 0x9F07, 0xE8A8, 0x9F08, 0xDCAF, 0x9F0E, 0xF0A3, 0x9F13, 0xCDD5, 0x9F20, 0xE0A9, 0x9F3B, 0xDEAC, 0x9F4A, 0xF0BA, 0x9F4B, 0xEEB1, + 0x9F4E, 0xEEB2, 0x9F52, 0xF6CD, 0x9F5F, 0xEED2, 0x9F61, 0xD6C6, 0x9F67, 0xE0E5, 0x9F6A, 0xF3BB, 0x9F6C, 0xE5E1, 0x9F77, 0xE4CB, + 0x9F8D, 0xD7A3, 0x9F90, 0xDBC2, 0x9F95, 0xCAFE, 0x9F9C, 0xCFCF, 0xAC00, 0xB0A1, 0xAC01, 0xB0A2, 0xAC02, 0x8141, 0xAC03, 0x8142, + 0xAC04, 0xB0A3, 0xAC05, 0x8143, 0xAC06, 0x8144, 0xAC07, 0xB0A4, 0xAC08, 0xB0A5, 0xAC09, 0xB0A6, 0xAC0A, 0xB0A7, 0xAC0B, 0x8145, + 0xAC0C, 0x8146, 0xAC0D, 0x8147, 0xAC0E, 0x8148, 0xAC0F, 0x8149, 0xAC10, 0xB0A8, 0xAC11, 0xB0A9, 0xAC12, 0xB0AA, 0xAC13, 0xB0AB, + 0xAC14, 0xB0AC, 0xAC15, 0xB0AD, 0xAC16, 0xB0AE, 0xAC17, 0xB0AF, 0xAC18, 0x814A, 0xAC19, 0xB0B0, 0xAC1A, 0xB0B1, 0xAC1B, 0xB0B2, + 0xAC1C, 0xB0B3, 0xAC1D, 0xB0B4, 0xAC1E, 0x814B, 0xAC1F, 0x814C, 0xAC20, 0xB0B5, 0xAC21, 0x814D, 0xAC22, 0x814E, 0xAC23, 0x814F, + 0xAC24, 0xB0B6, 0xAC25, 0x8150, 0xAC26, 0x8151, 0xAC27, 0x8152, 0xAC28, 0x8153, 0xAC29, 0x8154, 0xAC2A, 0x8155, 0xAC2B, 0x8156, + 0xAC2C, 0xB0B7, 0xAC2D, 0xB0B8, 0xAC2E, 0x8157, 0xAC2F, 0xB0B9, 0xAC30, 0xB0BA, 0xAC31, 0xB0BB, 0xAC32, 0x8158, 0xAC33, 0x8159, + 0xAC34, 0x815A, 0xAC35, 0x8161, 0xAC36, 0x8162, 0xAC37, 0x8163, 0xAC38, 0xB0BC, 0xAC39, 0xB0BD, 0xAC3A, 0x8164, 0xAC3B, 0x8165, + 0xAC3C, 0xB0BE, 0xAC3D, 0x8166, 0xAC3E, 0x8167, 0xAC3F, 0x8168, 0xAC40, 0xB0BF, 0xAC41, 0x8169, 0xAC42, 0x816A, 0xAC43, 0x816B, + 0xAC44, 0x816C, 0xAC45, 0x816D, 0xAC46, 0x816E, 0xAC47, 0x816F, 0xAC48, 0x8170, 0xAC49, 0x8171, 0xAC4A, 0x8172, 0xAC4B, 0xB0C0, + 0xAC4C, 0x8173, 0xAC4D, 0xB0C1, 0xAC4E, 0x8174, 0xAC4F, 0x8175, 0xAC50, 0x8176, 0xAC51, 0x8177, 0xAC52, 0x8178, 0xAC53, 0x8179, + 0xAC54, 0xB0C2, 0xAC55, 0x817A, 0xAC56, 0x8181, 0xAC57, 0x8182, 0xAC58, 0xB0C3, 0xAC59, 0x8183, 0xAC5A, 0x8184, 0xAC5B, 0x8185, + 0xAC5C, 0xB0C4, 0xAC5D, 0x8186, 0xAC5E, 0x8187, 0xAC5F, 0x8188, 0xAC60, 0x8189, 0xAC61, 0x818A, 0xAC62, 0x818B, 0xAC63, 0x818C, + 0xAC64, 0x818D, 0xAC65, 0x818E, 0xAC66, 0x818F, 0xAC67, 0x8190, 0xAC68, 0x8191, 0xAC69, 0x8192, 0xAC6A, 0x8193, 0xAC6B, 0x8194, + 0xAC6C, 0x8195, 0xAC6D, 0x8196, 0xAC6E, 0x8197, 0xAC6F, 0x8198, 0xAC70, 0xB0C5, 0xAC71, 0xB0C6, 0xAC72, 0x8199, 0xAC73, 0x819A, + 0xAC74, 0xB0C7, 0xAC75, 0x819B, 0xAC76, 0x819C, 0xAC77, 0xB0C8, 0xAC78, 0xB0C9, 0xAC79, 0x819D, 0xAC7A, 0xB0CA, 0xAC7B, 0x819E, + 0xAC7C, 0x819F, 0xAC7D, 0x81A0, 0xAC7E, 0x81A1, 0xAC7F, 0x81A2, 0xAC80, 0xB0CB, 0xAC81, 0xB0CC, 0xAC82, 0x81A3, 0xAC83, 0xB0CD, + 0xAC84, 0xB0CE, 0xAC85, 0xB0CF, 0xAC86, 0xB0D0, 0xAC87, 0x81A4, 0xAC88, 0x81A5, 0xAC89, 0xB0D1, 0xAC8A, 0xB0D2, 0xAC8B, 0xB0D3, + 0xAC8C, 0xB0D4, 0xAC8D, 0x81A6, 0xAC8E, 0x81A7, 0xAC8F, 0x81A8, 0xAC90, 0xB0D5, 0xAC91, 0x81A9, 0xAC92, 0x81AA, 0xAC93, 0x81AB, + 0xAC94, 0xB0D6, 0xAC95, 0x81AC, 0xAC96, 0x81AD, 0xAC97, 0x81AE, 0xAC98, 0x81AF, 0xAC99, 0x81B0, 0xAC9A, 0x81B1, 0xAC9B, 0x81B2, + 0xAC9C, 0xB0D7, 0xAC9D, 0xB0D8, 0xAC9E, 0x81B3, 0xAC9F, 0xB0D9, 0xACA0, 0xB0DA, 0xACA1, 0xB0DB, 0xACA2, 0x81B4, 0xACA3, 0x81B5, + 0xACA4, 0x81B6, 0xACA5, 0x81B7, 0xACA6, 0x81B8, 0xACA7, 0x81B9, 0xACA8, 0xB0DC, 0xACA9, 0xB0DD, 0xACAA, 0xB0DE, 0xACAB, 0x81BA, + 0xACAC, 0xB0DF, 0xACAD, 0x81BB, 0xACAE, 0x81BC, 0xACAF, 0xB0E0, 0xACB0, 0xB0E1, 0xACB1, 0x81BD, 0xACB2, 0x81BE, 0xACB3, 0x81BF, + 0xACB4, 0x81C0, 0xACB5, 0x81C1, 0xACB6, 0x81C2, 0xACB7, 0x81C3, 0xACB8, 0xB0E2, 0xACB9, 0xB0E3, 0xACBA, 0x81C4, 0xACBB, 0xB0E4, + 0xACBC, 0xB0E5, 0xACBD, 0xB0E6, 0xACBE, 0x81C5, 0xACBF, 0x81C6, 0xACC0, 0x81C7, 0xACC1, 0xB0E7, 0xACC2, 0x81C8, 0xACC3, 0x81C9, + 0xACC4, 0xB0E8, 0xACC5, 0x81CA, 0xACC6, 0x81CB, 0xACC7, 0x81CC, 0xACC8, 0xB0E9, 0xACC9, 0x81CD, 0xACCA, 0x81CE, 0xACCB, 0x81CF, + 0xACCC, 0xB0EA, 0xACCD, 0x81D0, 0xACCE, 0x81D1, 0xACCF, 0x81D2, 0xACD0, 0x81D3, 0xACD1, 0x81D4, 0xACD2, 0x81D5, 0xACD3, 0x81D6, + 0xACD4, 0x81D7, 0xACD5, 0xB0EB, 0xACD6, 0x81D8, 0xACD7, 0xB0EC, 0xACD8, 0x81D9, 0xACD9, 0x81DA, 0xACDA, 0x81DB, 0xACDB, 0x81DC, + 0xACDC, 0x81DD, 0xACDD, 0x81DE, 0xACDE, 0x81DF, 0xACDF, 0x81E0, 0xACE0, 0xB0ED, 0xACE1, 0xB0EE, 0xACE2, 0x81E1, 0xACE3, 0x81E2, + 0xACE4, 0xB0EF, 0xACE5, 0x81E3, 0xACE6, 0x81E4, 0xACE7, 0xB0F0, 0xACE8, 0xB0F1, 0xACE9, 0x81E5, 0xACEA, 0xB0F2, 0xACEB, 0x81E6, + 0xACEC, 0xB0F3, 0xACED, 0x81E7, 0xACEE, 0x81E8, 0xACEF, 0xB0F4, 0xACF0, 0xB0F5, 0xACF1, 0xB0F6, 0xACF2, 0x81E9, 0xACF3, 0xB0F7, + 0xACF4, 0x81EA, 0xACF5, 0xB0F8, 0xACF6, 0xB0F9, 0xACF7, 0x81EB, 0xACF8, 0x81EC, 0xACF9, 0x81ED, 0xACFA, 0x81EE, 0xACFB, 0x81EF, + 0xACFC, 0xB0FA, 0xACFD, 0xB0FB, 0xACFE, 0x81F0, 0xACFF, 0x81F1, 0xAD00, 0xB0FC, 0xAD01, 0x81F2, 0xAD02, 0x81F3, 0xAD03, 0x81F4, + 0xAD04, 0xB0FD, 0xAD05, 0x81F5, 0xAD06, 0xB0FE, 0xAD07, 0x81F6, 0xAD08, 0x81F7, 0xAD09, 0x81F8, 0xAD0A, 0x81F9, 0xAD0B, 0x81FA, + 0xAD0C, 0xB1A1, 0xAD0D, 0xB1A2, 0xAD0E, 0x81FB, 0xAD0F, 0xB1A3, 0xAD10, 0x81FC, 0xAD11, 0xB1A4, 0xAD12, 0x81FD, 0xAD13, 0x81FE, + 0xAD14, 0x8241, 0xAD15, 0x8242, 0xAD16, 0x8243, 0xAD17, 0x8244, 0xAD18, 0xB1A5, 0xAD19, 0x8245, 0xAD1A, 0x8246, 0xAD1B, 0x8247, + 0xAD1C, 0xB1A6, 0xAD1D, 0x8248, 0xAD1E, 0x8249, 0xAD1F, 0x824A, 0xAD20, 0xB1A7, 0xAD21, 0x824B, 0xAD22, 0x824C, 0xAD23, 0x824D, + 0xAD24, 0x824E, 0xAD25, 0x824F, 0xAD26, 0x8250, 0xAD27, 0x8251, 0xAD28, 0x8252, 0xAD29, 0xB1A8, 0xAD2A, 0x8253, 0xAD2B, 0x8254, + 0xAD2C, 0xB1A9, 0xAD2D, 0xB1AA, 0xAD2E, 0x8255, 0xAD2F, 0x8256, 0xAD30, 0x8257, 0xAD31, 0x8258, 0xAD32, 0x8259, 0xAD33, 0x825A, + 0xAD34, 0xB1AB, 0xAD35, 0xB1AC, 0xAD36, 0x8261, 0xAD37, 0x8262, 0xAD38, 0xB1AD, 0xAD39, 0x8263, 0xAD3A, 0x8264, 0xAD3B, 0x8265, + 0xAD3C, 0xB1AE, 0xAD3D, 0x8266, 0xAD3E, 0x8267, 0xAD3F, 0x8268, 0xAD40, 0x8269, 0xAD41, 0x826A, 0xAD42, 0x826B, 0xAD43, 0x826C, + 0xAD44, 0xB1AF, 0xAD45, 0xB1B0, 0xAD46, 0x826D, 0xAD47, 0xB1B1, 0xAD48, 0x826E, 0xAD49, 0xB1B2, 0xAD4A, 0x826F, 0xAD4B, 0x8270, + 0xAD4C, 0x8271, 0xAD4D, 0x8272, 0xAD4E, 0x8273, 0xAD4F, 0x8274, 0xAD50, 0xB1B3, 0xAD51, 0x8275, 0xAD52, 0x8276, 0xAD53, 0x8277, + 0xAD54, 0xB1B4, 0xAD55, 0x8278, 0xAD56, 0x8279, 0xAD57, 0x827A, 0xAD58, 0xB1B5, 0xAD59, 0x8281, 0xAD5A, 0x8282, 0xAD5B, 0x8283, + 0xAD5C, 0x8284, 0xAD5D, 0x8285, 0xAD5E, 0x8286, 0xAD5F, 0x8287, 0xAD60, 0x8288, 0xAD61, 0xB1B6, 0xAD62, 0x8289, 0xAD63, 0xB1B7, + 0xAD64, 0x828A, 0xAD65, 0x828B, 0xAD66, 0x828C, 0xAD67, 0x828D, 0xAD68, 0x828E, 0xAD69, 0x828F, 0xAD6A, 0x8290, 0xAD6B, 0x8291, + 0xAD6C, 0xB1B8, 0xAD6D, 0xB1B9, 0xAD6E, 0x8292, 0xAD6F, 0x8293, 0xAD70, 0xB1BA, 0xAD71, 0x8294, 0xAD72, 0x8295, 0xAD73, 0xB1BB, + 0xAD74, 0xB1BC, 0xAD75, 0xB1BD, 0xAD76, 0xB1BE, 0xAD77, 0x8296, 0xAD78, 0x8297, 0xAD79, 0x8298, 0xAD7A, 0x8299, 0xAD7B, 0xB1BF, + 0xAD7C, 0xB1C0, 0xAD7D, 0xB1C1, 0xAD7E, 0x829A, 0xAD7F, 0xB1C2, 0xAD80, 0x829B, 0xAD81, 0xB1C3, 0xAD82, 0xB1C4, 0xAD83, 0x829C, + 0xAD84, 0x829D, 0xAD85, 0x829E, 0xAD86, 0x829F, 0xAD87, 0x82A0, 0xAD88, 0xB1C5, 0xAD89, 0xB1C6, 0xAD8A, 0x82A1, 0xAD8B, 0x82A2, + 0xAD8C, 0xB1C7, 0xAD8D, 0x82A3, 0xAD8E, 0x82A4, 0xAD8F, 0x82A5, 0xAD90, 0xB1C8, 0xAD91, 0x82A6, 0xAD92, 0x82A7, 0xAD93, 0x82A8, + 0xAD94, 0x82A9, 0xAD95, 0x82AA, 0xAD96, 0x82AB, 0xAD97, 0x82AC, 0xAD98, 0x82AD, 0xAD99, 0x82AE, 0xAD9A, 0x82AF, 0xAD9B, 0x82B0, + 0xAD9C, 0xB1C9, 0xAD9D, 0xB1CA, 0xAD9E, 0x82B1, 0xAD9F, 0x82B2, 0xADA0, 0x82B3, 0xADA1, 0x82B4, 0xADA2, 0x82B5, 0xADA3, 0x82B6, + 0xADA4, 0xB1CB, 0xADA5, 0x82B7, 0xADA6, 0x82B8, 0xADA7, 0x82B9, 0xADA8, 0x82BA, 0xADA9, 0x82BB, 0xADAA, 0x82BC, 0xADAB, 0x82BD, + 0xADAC, 0x82BE, 0xADAD, 0x82BF, 0xADAE, 0x82C0, 0xADAF, 0x82C1, 0xADB0, 0x82C2, 0xADB1, 0x82C3, 0xADB2, 0x82C4, 0xADB3, 0x82C5, + 0xADB4, 0x82C6, 0xADB5, 0x82C7, 0xADB6, 0x82C8, 0xADB7, 0xB1CC, 0xADB8, 0x82C9, 0xADB9, 0x82CA, 0xADBA, 0x82CB, 0xADBB, 0x82CC, + 0xADBC, 0x82CD, 0xADBD, 0x82CE, 0xADBE, 0x82CF, 0xADBF, 0x82D0, 0xADC0, 0xB1CD, 0xADC1, 0xB1CE, 0xADC2, 0x82D1, 0xADC3, 0x82D2, + 0xADC4, 0xB1CF, 0xADC5, 0x82D3, 0xADC6, 0x82D4, 0xADC7, 0x82D5, 0xADC8, 0xB1D0, 0xADC9, 0x82D6, 0xADCA, 0x82D7, 0xADCB, 0x82D8, + 0xADCC, 0x82D9, 0xADCD, 0x82DA, 0xADCE, 0x82DB, 0xADCF, 0x82DC, 0xADD0, 0xB1D1, 0xADD1, 0xB1D2, 0xADD2, 0x82DD, 0xADD3, 0xB1D3, + 0xADD4, 0x82DE, 0xADD5, 0x82DF, 0xADD6, 0x82E0, 0xADD7, 0x82E1, 0xADD8, 0x82E2, 0xADD9, 0x82E3, 0xADDA, 0x82E4, 0xADDB, 0x82E5, + 0xADDC, 0xB1D4, 0xADDD, 0x82E6, 0xADDE, 0x82E7, 0xADDF, 0x82E8, 0xADE0, 0xB1D5, 0xADE1, 0x82E9, 0xADE2, 0x82EA, 0xADE3, 0x82EB, + 0xADE4, 0xB1D6, 0xADE5, 0x82EC, 0xADE6, 0x82ED, 0xADE7, 0x82EE, 0xADE8, 0x82EF, 0xADE9, 0x82F0, 0xADEA, 0x82F1, 0xADEB, 0x82F2, + 0xADEC, 0x82F3, 0xADED, 0x82F4, 0xADEE, 0x82F5, 0xADEF, 0x82F6, 0xADF0, 0x82F7, 0xADF1, 0x82F8, 0xADF2, 0x82F9, 0xADF3, 0x82FA, + 0xADF4, 0x82FB, 0xADF5, 0x82FC, 0xADF6, 0x82FD, 0xADF7, 0x82FE, 0xADF8, 0xB1D7, 0xADF9, 0xB1D8, 0xADFA, 0x8341, 0xADFB, 0x8342, + 0xADFC, 0xB1D9, 0xADFD, 0x8343, 0xADFE, 0x8344, 0xADFF, 0xB1DA, 0xAE00, 0xB1DB, 0xAE01, 0xB1DC, 0xAE02, 0x8345, 0xAE03, 0x8346, + 0xAE04, 0x8347, 0xAE05, 0x8348, 0xAE06, 0x8349, 0xAE07, 0x834A, 0xAE08, 0xB1DD, 0xAE09, 0xB1DE, 0xAE0A, 0x834B, 0xAE0B, 0xB1DF, + 0xAE0C, 0x834C, 0xAE0D, 0xB1E0, 0xAE0E, 0x834D, 0xAE0F, 0x834E, 0xAE10, 0x834F, 0xAE11, 0x8350, 0xAE12, 0x8351, 0xAE13, 0x8352, + 0xAE14, 0xB1E1, 0xAE15, 0x8353, 0xAE16, 0x8354, 0xAE17, 0x8355, 0xAE18, 0x8356, 0xAE19, 0x8357, 0xAE1A, 0x8358, 0xAE1B, 0x8359, + 0xAE1C, 0x835A, 0xAE1D, 0x8361, 0xAE1E, 0x8362, 0xAE1F, 0x8363, 0xAE20, 0x8364, 0xAE21, 0x8365, 0xAE22, 0x8366, 0xAE23, 0x8367, + 0xAE24, 0x8368, 0xAE25, 0x8369, 0xAE26, 0x836A, 0xAE27, 0x836B, 0xAE28, 0x836C, 0xAE29, 0x836D, 0xAE2A, 0x836E, 0xAE2B, 0x836F, + 0xAE2C, 0x8370, 0xAE2D, 0x8371, 0xAE2E, 0x8372, 0xAE2F, 0x8373, 0xAE30, 0xB1E2, 0xAE31, 0xB1E3, 0xAE32, 0x8374, 0xAE33, 0x8375, + 0xAE34, 0xB1E4, 0xAE35, 0x8376, 0xAE36, 0x8377, 0xAE37, 0xB1E5, 0xAE38, 0xB1E6, 0xAE39, 0x8378, 0xAE3A, 0xB1E7, 0xAE3B, 0x8379, + 0xAE3C, 0x837A, 0xAE3D, 0x8381, 0xAE3E, 0x8382, 0xAE3F, 0x8383, 0xAE40, 0xB1E8, 0xAE41, 0xB1E9, 0xAE42, 0x8384, 0xAE43, 0xB1EA, + 0xAE44, 0x8385, 0xAE45, 0xB1EB, 0xAE46, 0xB1EC, 0xAE47, 0x8386, 0xAE48, 0x8387, 0xAE49, 0x8388, 0xAE4A, 0xB1ED, 0xAE4B, 0x8389, + 0xAE4C, 0xB1EE, 0xAE4D, 0xB1EF, 0xAE4E, 0xB1F0, 0xAE4F, 0x838A, 0xAE50, 0xB1F1, 0xAE51, 0x838B, 0xAE52, 0x838C, 0xAE53, 0x838D, + 0xAE54, 0xB1F2, 0xAE55, 0x838E, 0xAE56, 0xB1F3, 0xAE57, 0x838F, 0xAE58, 0x8390, 0xAE59, 0x8391, 0xAE5A, 0x8392, 0xAE5B, 0x8393, + 0xAE5C, 0xB1F4, 0xAE5D, 0xB1F5, 0xAE5E, 0x8394, 0xAE5F, 0xB1F6, 0xAE60, 0xB1F7, 0xAE61, 0xB1F8, 0xAE62, 0x8395, 0xAE63, 0x8396, + 0xAE64, 0x8397, 0xAE65, 0xB1F9, 0xAE66, 0x8398, 0xAE67, 0x8399, 0xAE68, 0xB1FA, 0xAE69, 0xB1FB, 0xAE6A, 0x839A, 0xAE6B, 0x839B, + 0xAE6C, 0xB1FC, 0xAE6D, 0x839C, 0xAE6E, 0x839D, 0xAE6F, 0x839E, 0xAE70, 0xB1FD, 0xAE71, 0x839F, 0xAE72, 0x83A0, 0xAE73, 0x83A1, + 0xAE74, 0x83A2, 0xAE75, 0x83A3, 0xAE76, 0x83A4, 0xAE77, 0x83A5, 0xAE78, 0xB1FE, 0xAE79, 0xB2A1, 0xAE7A, 0x83A6, 0xAE7B, 0xB2A2, + 0xAE7C, 0xB2A3, 0xAE7D, 0xB2A4, 0xAE7E, 0x83A7, 0xAE7F, 0x83A8, 0xAE80, 0x83A9, 0xAE81, 0x83AA, 0xAE82, 0x83AB, 0xAE83, 0x83AC, + 0xAE84, 0xB2A5, 0xAE85, 0xB2A6, 0xAE86, 0x83AD, 0xAE87, 0x83AE, 0xAE88, 0x83AF, 0xAE89, 0x83B0, 0xAE8A, 0x83B1, 0xAE8B, 0x83B2, + 0xAE8C, 0xB2A7, 0xAE8D, 0x83B3, 0xAE8E, 0x83B4, 0xAE8F, 0x83B5, 0xAE90, 0x83B6, 0xAE91, 0x83B7, 0xAE92, 0x83B8, 0xAE93, 0x83B9, + 0xAE94, 0x83BA, 0xAE95, 0x83BB, 0xAE96, 0x83BC, 0xAE97, 0x83BD, 0xAE98, 0x83BE, 0xAE99, 0x83BF, 0xAE9A, 0x83C0, 0xAE9B, 0x83C1, + 0xAE9C, 0x83C2, 0xAE9D, 0x83C3, 0xAE9E, 0x83C4, 0xAE9F, 0x83C5, 0xAEA0, 0x83C6, 0xAEA1, 0x83C7, 0xAEA2, 0x83C8, 0xAEA3, 0x83C9, + 0xAEA4, 0x83CA, 0xAEA5, 0x83CB, 0xAEA6, 0x83CC, 0xAEA7, 0x83CD, 0xAEA8, 0x83CE, 0xAEA9, 0x83CF, 0xAEAA, 0x83D0, 0xAEAB, 0x83D1, + 0xAEAC, 0x83D2, 0xAEAD, 0x83D3, 0xAEAE, 0x83D4, 0xAEAF, 0x83D5, 0xAEB0, 0x83D6, 0xAEB1, 0x83D7, 0xAEB2, 0x83D8, 0xAEB3, 0x83D9, + 0xAEB4, 0x83DA, 0xAEB5, 0x83DB, 0xAEB6, 0x83DC, 0xAEB7, 0x83DD, 0xAEB8, 0x83DE, 0xAEB9, 0x83DF, 0xAEBA, 0x83E0, 0xAEBB, 0x83E1, + 0xAEBC, 0xB2A8, 0xAEBD, 0xB2A9, 0xAEBE, 0xB2AA, 0xAEBF, 0x83E2, 0xAEC0, 0xB2AB, 0xAEC1, 0x83E3, 0xAEC2, 0x83E4, 0xAEC3, 0x83E5, + 0xAEC4, 0xB2AC, 0xAEC5, 0x83E6, 0xAEC6, 0x83E7, 0xAEC7, 0x83E8, 0xAEC8, 0x83E9, 0xAEC9, 0x83EA, 0xAECA, 0x83EB, 0xAECB, 0x83EC, + 0xAECC, 0xB2AD, 0xAECD, 0xB2AE, 0xAECE, 0x83ED, 0xAECF, 0xB2AF, 0xAED0, 0xB2B0, 0xAED1, 0xB2B1, 0xAED2, 0x83EE, 0xAED3, 0x83EF, + 0xAED4, 0x83F0, 0xAED5, 0x83F1, 0xAED6, 0x83F2, 0xAED7, 0x83F3, 0xAED8, 0xB2B2, 0xAED9, 0xB2B3, 0xAEDA, 0x83F4, 0xAEDB, 0x83F5, + 0xAEDC, 0xB2B4, 0xAEDD, 0x83F6, 0xAEDE, 0x83F7, 0xAEDF, 0x83F8, 0xAEE0, 0x83F9, 0xAEE1, 0x83FA, 0xAEE2, 0x83FB, 0xAEE3, 0x83FC, + 0xAEE4, 0x83FD, 0xAEE5, 0x83FE, 0xAEE6, 0x8441, 0xAEE7, 0x8442, 0xAEE8, 0xB2B5, 0xAEE9, 0x8443, 0xAEEA, 0x8444, 0xAEEB, 0xB2B6, + 0xAEEC, 0x8445, 0xAEED, 0xB2B7, 0xAEEE, 0x8446, 0xAEEF, 0x8447, 0xAEF0, 0x8448, 0xAEF1, 0x8449, 0xAEF2, 0x844A, 0xAEF3, 0x844B, + 0xAEF4, 0xB2B8, 0xAEF5, 0x844C, 0xAEF6, 0x844D, 0xAEF7, 0x844E, 0xAEF8, 0xB2B9, 0xAEF9, 0x844F, 0xAEFA, 0x8450, 0xAEFB, 0x8451, + 0xAEFC, 0xB2BA, 0xAEFD, 0x8452, 0xAEFE, 0x8453, 0xAEFF, 0x8454, 0xAF00, 0x8455, 0xAF01, 0x8456, 0xAF02, 0x8457, 0xAF03, 0x8458, + 0xAF04, 0x8459, 0xAF05, 0x845A, 0xAF06, 0x8461, 0xAF07, 0xB2BB, 0xAF08, 0xB2BC, 0xAF09, 0x8462, 0xAF0A, 0x8463, 0xAF0B, 0x8464, + 0xAF0C, 0x8465, 0xAF0D, 0xB2BD, 0xAF0E, 0x8466, 0xAF0F, 0x8467, 0xAF10, 0xB2BE, 0xAF11, 0x8468, 0xAF12, 0x8469, 0xAF13, 0x846A, + 0xAF14, 0x846B, 0xAF15, 0x846C, 0xAF16, 0x846D, 0xAF17, 0x846E, 0xAF18, 0x846F, 0xAF19, 0x8470, 0xAF1A, 0x8471, 0xAF1B, 0x8472, + 0xAF1C, 0x8473, 0xAF1D, 0x8474, 0xAF1E, 0x8475, 0xAF1F, 0x8476, 0xAF20, 0x8477, 0xAF21, 0x8478, 0xAF22, 0x8479, 0xAF23, 0x847A, + 0xAF24, 0x8481, 0xAF25, 0x8482, 0xAF26, 0x8483, 0xAF27, 0x8484, 0xAF28, 0x8485, 0xAF29, 0x8486, 0xAF2A, 0x8487, 0xAF2B, 0x8488, + 0xAF2C, 0xB2BF, 0xAF2D, 0xB2C0, 0xAF2E, 0x8489, 0xAF2F, 0x848A, 0xAF30, 0xB2C1, 0xAF31, 0x848B, 0xAF32, 0xB2C2, 0xAF33, 0x848C, + 0xAF34, 0xB2C3, 0xAF35, 0x848D, 0xAF36, 0x848E, 0xAF37, 0x848F, 0xAF38, 0x8490, 0xAF39, 0x8491, 0xAF3A, 0x8492, 0xAF3B, 0x8493, + 0xAF3C, 0xB2C4, 0xAF3D, 0xB2C5, 0xAF3E, 0x8494, 0xAF3F, 0xB2C6, 0xAF40, 0x8495, 0xAF41, 0xB2C7, 0xAF42, 0xB2C8, 0xAF43, 0xB2C9, + 0xAF44, 0x8496, 0xAF45, 0x8497, 0xAF46, 0x8498, 0xAF47, 0x8499, 0xAF48, 0xB2CA, 0xAF49, 0xB2CB, 0xAF4A, 0x849A, 0xAF4B, 0x849B, + 0xAF4C, 0x849C, 0xAF4D, 0x849D, 0xAF4E, 0x849E, 0xAF4F, 0x849F, 0xAF50, 0xB2CC, 0xAF51, 0x84A0, 0xAF52, 0x84A1, 0xAF53, 0x84A2, + 0xAF54, 0x84A3, 0xAF55, 0x84A4, 0xAF56, 0x84A5, 0xAF57, 0x84A6, 0xAF58, 0x84A7, 0xAF59, 0x84A8, 0xAF5A, 0x84A9, 0xAF5B, 0x84AA, + 0xAF5C, 0xB2CD, 0xAF5D, 0xB2CE, 0xAF5E, 0x84AB, 0xAF5F, 0x84AC, 0xAF60, 0x84AD, 0xAF61, 0x84AE, 0xAF62, 0x84AF, 0xAF63, 0x84B0, + 0xAF64, 0xB2CF, 0xAF65, 0xB2D0, 0xAF66, 0x84B1, 0xAF67, 0x84B2, 0xAF68, 0x84B3, 0xAF69, 0x84B4, 0xAF6A, 0x84B5, 0xAF6B, 0x84B6, + 0xAF6C, 0x84B7, 0xAF6D, 0x84B8, 0xAF6E, 0x84B9, 0xAF6F, 0x84BA, 0xAF70, 0x84BB, 0xAF71, 0x84BC, 0xAF72, 0x84BD, 0xAF73, 0x84BE, + 0xAF74, 0x84BF, 0xAF75, 0x84C0, 0xAF76, 0x84C1, 0xAF77, 0x84C2, 0xAF78, 0x84C3, 0xAF79, 0xB2D1, 0xAF7A, 0x84C4, 0xAF7B, 0x84C5, + 0xAF7C, 0x84C6, 0xAF7D, 0x84C7, 0xAF7E, 0x84C8, 0xAF7F, 0x84C9, 0xAF80, 0xB2D2, 0xAF81, 0x84CA, 0xAF82, 0x84CB, 0xAF83, 0x84CC, + 0xAF84, 0xB2D3, 0xAF85, 0x84CD, 0xAF86, 0x84CE, 0xAF87, 0x84CF, 0xAF88, 0xB2D4, 0xAF89, 0x84D0, 0xAF8A, 0x84D1, 0xAF8B, 0x84D2, + 0xAF8C, 0x84D3, 0xAF8D, 0x84D4, 0xAF8E, 0x84D5, 0xAF8F, 0x84D6, 0xAF90, 0xB2D5, 0xAF91, 0xB2D6, 0xAF92, 0x84D7, 0xAF93, 0x84D8, + 0xAF94, 0x84D9, 0xAF95, 0xB2D7, 0xAF96, 0x84DA, 0xAF97, 0x84DB, 0xAF98, 0x84DC, 0xAF99, 0x84DD, 0xAF9A, 0x84DE, 0xAF9B, 0x84DF, + 0xAF9C, 0xB2D8, 0xAF9D, 0x84E0, 0xAF9E, 0x84E1, 0xAF9F, 0x84E2, 0xAFA0, 0x84E3, 0xAFA1, 0x84E4, 0xAFA2, 0x84E5, 0xAFA3, 0x84E6, + 0xAFA4, 0x84E7, 0xAFA5, 0x84E8, 0xAFA6, 0x84E9, 0xAFA7, 0x84EA, 0xAFA8, 0x84EB, 0xAFA9, 0x84EC, 0xAFAA, 0x84ED, 0xAFAB, 0x84EE, + 0xAFAC, 0x84EF, 0xAFAD, 0x84F0, 0xAFAE, 0x84F1, 0xAFAF, 0x84F2, 0xAFB0, 0x84F3, 0xAFB1, 0x84F4, 0xAFB2, 0x84F5, 0xAFB3, 0x84F6, + 0xAFB4, 0x84F7, 0xAFB5, 0x84F8, 0xAFB6, 0x84F9, 0xAFB7, 0x84FA, 0xAFB8, 0xB2D9, 0xAFB9, 0xB2DA, 0xAFBA, 0x84FB, 0xAFBB, 0x84FC, + 0xAFBC, 0xB2DB, 0xAFBD, 0x84FD, 0xAFBE, 0x84FE, 0xAFBF, 0x8541, 0xAFC0, 0xB2DC, 0xAFC1, 0x8542, 0xAFC2, 0x8543, 0xAFC3, 0x8544, + 0xAFC4, 0x8545, 0xAFC5, 0x8546, 0xAFC6, 0x8547, 0xAFC7, 0xB2DD, 0xAFC8, 0xB2DE, 0xAFC9, 0xB2DF, 0xAFCA, 0x8548, 0xAFCB, 0xB2E0, + 0xAFCC, 0x8549, 0xAFCD, 0xB2E1, 0xAFCE, 0xB2E2, 0xAFCF, 0x854A, 0xAFD0, 0x854B, 0xAFD1, 0x854C, 0xAFD2, 0x854D, 0xAFD3, 0x854E, + 0xAFD4, 0xB2E3, 0xAFD5, 0x854F, 0xAFD6, 0x8550, 0xAFD7, 0x8551, 0xAFD8, 0x8552, 0xAFD9, 0x8553, 0xAFDA, 0x8554, 0xAFDB, 0x8555, + 0xAFDC, 0xB2E4, 0xAFDD, 0x8556, 0xAFDE, 0x8557, 0xAFDF, 0x8558, 0xAFE0, 0x8559, 0xAFE1, 0x855A, 0xAFE2, 0x8561, 0xAFE3, 0x8562, + 0xAFE4, 0x8563, 0xAFE5, 0x8564, 0xAFE6, 0x8565, 0xAFE7, 0x8566, 0xAFE8, 0xB2E5, 0xAFE9, 0xB2E6, 0xAFEA, 0x8567, 0xAFEB, 0x8568, + 0xAFEC, 0x8569, 0xAFED, 0x856A, 0xAFEE, 0x856B, 0xAFEF, 0x856C, 0xAFF0, 0xB2E7, 0xAFF1, 0xB2E8, 0xAFF2, 0x856D, 0xAFF3, 0x856E, + 0xAFF4, 0xB2E9, 0xAFF5, 0x856F, 0xAFF6, 0x8570, 0xAFF7, 0x8571, 0xAFF8, 0xB2EA, 0xAFF9, 0x8572, 0xAFFA, 0x8573, 0xAFFB, 0x8574, + 0xAFFC, 0x8575, 0xAFFD, 0x8576, 0xAFFE, 0x8577, 0xAFFF, 0x8578, 0xB000, 0xB2EB, 0xB001, 0xB2EC, 0xB002, 0x8579, 0xB003, 0x857A, + 0xB004, 0xB2ED, 0xB005, 0x8581, 0xB006, 0x8582, 0xB007, 0x8583, 0xB008, 0x8584, 0xB009, 0x8585, 0xB00A, 0x8586, 0xB00B, 0x8587, + 0xB00C, 0xB2EE, 0xB00D, 0x8588, 0xB00E, 0x8589, 0xB00F, 0x858A, 0xB010, 0xB2EF, 0xB011, 0x858B, 0xB012, 0x858C, 0xB013, 0x858D, + 0xB014, 0xB2F0, 0xB015, 0x858E, 0xB016, 0x858F, 0xB017, 0x8590, 0xB018, 0x8591, 0xB019, 0x8592, 0xB01A, 0x8593, 0xB01B, 0x8594, + 0xB01C, 0xB2F1, 0xB01D, 0xB2F2, 0xB01E, 0x8595, 0xB01F, 0x8596, 0xB020, 0x8597, 0xB021, 0x8598, 0xB022, 0x8599, 0xB023, 0x859A, + 0xB024, 0x859B, 0xB025, 0x859C, 0xB026, 0x859D, 0xB027, 0x859E, 0xB028, 0xB2F3, 0xB029, 0x859F, 0xB02A, 0x85A0, 0xB02B, 0x85A1, + 0xB02C, 0x85A2, 0xB02D, 0x85A3, 0xB02E, 0x85A4, 0xB02F, 0x85A5, 0xB030, 0x85A6, 0xB031, 0x85A7, 0xB032, 0x85A8, 0xB033, 0x85A9, + 0xB034, 0x85AA, 0xB035, 0x85AB, 0xB036, 0x85AC, 0xB037, 0x85AD, 0xB038, 0x85AE, 0xB039, 0x85AF, 0xB03A, 0x85B0, 0xB03B, 0x85B1, + 0xB03C, 0x85B2, 0xB03D, 0x85B3, 0xB03E, 0x85B4, 0xB03F, 0x85B5, 0xB040, 0x85B6, 0xB041, 0x85B7, 0xB042, 0x85B8, 0xB043, 0x85B9, + 0xB044, 0xB2F4, 0xB045, 0xB2F5, 0xB046, 0x85BA, 0xB047, 0x85BB, 0xB048, 0xB2F6, 0xB049, 0x85BC, 0xB04A, 0xB2F7, 0xB04B, 0x85BD, + 0xB04C, 0xB2F8, 0xB04D, 0x85BE, 0xB04E, 0xB2F9, 0xB04F, 0x85BF, 0xB050, 0x85C0, 0xB051, 0x85C1, 0xB052, 0x85C2, 0xB053, 0xB2FA, + 0xB054, 0xB2FB, 0xB055, 0xB2FC, 0xB056, 0x85C3, 0xB057, 0xB2FD, 0xB058, 0x85C4, 0xB059, 0xB2FE, 0xB05A, 0x85C5, 0xB05B, 0x85C6, + 0xB05C, 0x85C7, 0xB05D, 0xB3A1, 0xB05E, 0x85C8, 0xB05F, 0x85C9, 0xB060, 0x85CA, 0xB061, 0x85CB, 0xB062, 0x85CC, 0xB063, 0x85CD, + 0xB064, 0x85CE, 0xB065, 0x85CF, 0xB066, 0x85D0, 0xB067, 0x85D1, 0xB068, 0x85D2, 0xB069, 0x85D3, 0xB06A, 0x85D4, 0xB06B, 0x85D5, + 0xB06C, 0x85D6, 0xB06D, 0x85D7, 0xB06E, 0x85D8, 0xB06F, 0x85D9, 0xB070, 0x85DA, 0xB071, 0x85DB, 0xB072, 0x85DC, 0xB073, 0x85DD, + 0xB074, 0x85DE, 0xB075, 0x85DF, 0xB076, 0x85E0, 0xB077, 0x85E1, 0xB078, 0x85E2, 0xB079, 0x85E3, 0xB07A, 0x85E4, 0xB07B, 0x85E5, + 0xB07C, 0xB3A2, 0xB07D, 0xB3A3, 0xB07E, 0x85E6, 0xB07F, 0x85E7, 0xB080, 0xB3A4, 0xB081, 0x85E8, 0xB082, 0x85E9, 0xB083, 0x85EA, + 0xB084, 0xB3A5, 0xB085, 0x85EB, 0xB086, 0x85EC, 0xB087, 0x85ED, 0xB088, 0x85EE, 0xB089, 0x85EF, 0xB08A, 0x85F0, 0xB08B, 0x85F1, + 0xB08C, 0xB3A6, 0xB08D, 0xB3A7, 0xB08E, 0x85F2, 0xB08F, 0xB3A8, 0xB090, 0x85F3, 0xB091, 0xB3A9, 0xB092, 0x85F4, 0xB093, 0x85F5, + 0xB094, 0x85F6, 0xB095, 0x85F7, 0xB096, 0x85F8, 0xB097, 0x85F9, 0xB098, 0xB3AA, 0xB099, 0xB3AB, 0xB09A, 0xB3AC, 0xB09B, 0x85FA, + 0xB09C, 0xB3AD, 0xB09D, 0x85FB, 0xB09E, 0x85FC, 0xB09F, 0xB3AE, 0xB0A0, 0xB3AF, 0xB0A1, 0xB3B0, 0xB0A2, 0xB3B1, 0xB0A3, 0x85FD, + 0xB0A4, 0x85FE, 0xB0A5, 0x8641, 0xB0A6, 0x8642, 0xB0A7, 0x8643, 0xB0A8, 0xB3B2, 0xB0A9, 0xB3B3, 0xB0AA, 0x8644, 0xB0AB, 0xB3B4, + 0xB0AC, 0xB3B5, 0xB0AD, 0xB3B6, 0xB0AE, 0xB3B7, 0xB0AF, 0xB3B8, 0xB0B0, 0x8645, 0xB0B1, 0xB3B9, 0xB0B2, 0x8646, 0xB0B3, 0xB3BA, + 0xB0B4, 0xB3BB, 0xB0B5, 0xB3BC, 0xB0B6, 0x8647, 0xB0B7, 0x8648, 0xB0B8, 0xB3BD, 0xB0B9, 0x8649, 0xB0BA, 0x864A, 0xB0BB, 0x864B, + 0xB0BC, 0xB3BE, 0xB0BD, 0x864C, 0xB0BE, 0x864D, 0xB0BF, 0x864E, 0xB0C0, 0x864F, 0xB0C1, 0x8650, 0xB0C2, 0x8651, 0xB0C3, 0x8652, + 0xB0C4, 0xB3BF, 0xB0C5, 0xB3C0, 0xB0C6, 0x8653, 0xB0C7, 0xB3C1, 0xB0C8, 0xB3C2, 0xB0C9, 0xB3C3, 0xB0CA, 0x8654, 0xB0CB, 0x8655, + 0xB0CC, 0x8656, 0xB0CD, 0x8657, 0xB0CE, 0x8658, 0xB0CF, 0x8659, 0xB0D0, 0xB3C4, 0xB0D1, 0xB3C5, 0xB0D2, 0x865A, 0xB0D3, 0x8661, + 0xB0D4, 0xB3C6, 0xB0D5, 0x8662, 0xB0D6, 0x8663, 0xB0D7, 0x8664, 0xB0D8, 0xB3C7, 0xB0D9, 0x8665, 0xB0DA, 0x8666, 0xB0DB, 0x8667, + 0xB0DC, 0x8668, 0xB0DD, 0x8669, 0xB0DE, 0x866A, 0xB0DF, 0x866B, 0xB0E0, 0xB3C8, 0xB0E1, 0x866C, 0xB0E2, 0x866D, 0xB0E3, 0x866E, + 0xB0E4, 0x866F, 0xB0E5, 0xB3C9, 0xB0E6, 0x8670, 0xB0E7, 0x8671, 0xB0E8, 0x8672, 0xB0E9, 0x8673, 0xB0EA, 0x8674, 0xB0EB, 0x8675, + 0xB0EC, 0x8676, 0xB0ED, 0x8677, 0xB0EE, 0x8678, 0xB0EF, 0x8679, 0xB0F0, 0x867A, 0xB0F1, 0x8681, 0xB0F2, 0x8682, 0xB0F3, 0x8683, + 0xB0F4, 0x8684, 0xB0F5, 0x8685, 0xB0F6, 0x8686, 0xB0F7, 0x8687, 0xB0F8, 0x8688, 0xB0F9, 0x8689, 0xB0FA, 0x868A, 0xB0FB, 0x868B, + 0xB0FC, 0x868C, 0xB0FD, 0x868D, 0xB0FE, 0x868E, 0xB0FF, 0x868F, 0xB100, 0x8690, 0xB101, 0x8691, 0xB102, 0x8692, 0xB103, 0x8693, + 0xB104, 0x8694, 0xB105, 0x8695, 0xB106, 0x8696, 0xB107, 0x8697, 0xB108, 0xB3CA, 0xB109, 0xB3CB, 0xB10A, 0x8698, 0xB10B, 0xB3CC, + 0xB10C, 0xB3CD, 0xB10D, 0x8699, 0xB10E, 0x869A, 0xB10F, 0x869B, 0xB110, 0xB3CE, 0xB111, 0x869C, 0xB112, 0xB3CF, 0xB113, 0xB3D0, + 0xB114, 0x869D, 0xB115, 0x869E, 0xB116, 0x869F, 0xB117, 0x86A0, 0xB118, 0xB3D1, 0xB119, 0xB3D2, 0xB11A, 0x86A1, 0xB11B, 0xB3D3, + 0xB11C, 0xB3D4, 0xB11D, 0xB3D5, 0xB11E, 0x86A2, 0xB11F, 0x86A3, 0xB120, 0x86A4, 0xB121, 0x86A5, 0xB122, 0x86A6, 0xB123, 0xB3D6, + 0xB124, 0xB3D7, 0xB125, 0xB3D8, 0xB126, 0x86A7, 0xB127, 0x86A8, 0xB128, 0xB3D9, 0xB129, 0x86A9, 0xB12A, 0x86AA, 0xB12B, 0x86AB, + 0xB12C, 0xB3DA, 0xB12D, 0x86AC, 0xB12E, 0x86AD, 0xB12F, 0x86AE, 0xB130, 0x86AF, 0xB131, 0x86B0, 0xB132, 0x86B1, 0xB133, 0x86B2, + 0xB134, 0xB3DB, 0xB135, 0xB3DC, 0xB136, 0x86B3, 0xB137, 0xB3DD, 0xB138, 0xB3DE, 0xB139, 0xB3DF, 0xB13A, 0x86B4, 0xB13B, 0x86B5, + 0xB13C, 0x86B6, 0xB13D, 0x86B7, 0xB13E, 0x86B8, 0xB13F, 0x86B9, 0xB140, 0xB3E0, 0xB141, 0xB3E1, 0xB142, 0x86BA, 0xB143, 0x86BB, + 0xB144, 0xB3E2, 0xB145, 0x86BC, 0xB146, 0x86BD, 0xB147, 0x86BE, 0xB148, 0xB3E3, 0xB149, 0x86BF, 0xB14A, 0x86C0, 0xB14B, 0x86C1, + 0xB14C, 0x86C2, 0xB14D, 0x86C3, 0xB14E, 0x86C4, 0xB14F, 0x86C5, 0xB150, 0xB3E4, 0xB151, 0xB3E5, 0xB152, 0x86C6, 0xB153, 0x86C7, + 0xB154, 0xB3E6, 0xB155, 0xB3E7, 0xB156, 0x86C8, 0xB157, 0x86C9, 0xB158, 0xB3E8, 0xB159, 0x86CA, 0xB15A, 0x86CB, 0xB15B, 0x86CC, + 0xB15C, 0xB3E9, 0xB15D, 0x86CD, 0xB15E, 0x86CE, 0xB15F, 0x86CF, 0xB160, 0xB3EA, 0xB161, 0x86D0, 0xB162, 0x86D1, 0xB163, 0x86D2, + 0xB164, 0x86D3, 0xB165, 0x86D4, 0xB166, 0x86D5, 0xB167, 0x86D6, 0xB168, 0x86D7, 0xB169, 0x86D8, 0xB16A, 0x86D9, 0xB16B, 0x86DA, + 0xB16C, 0x86DB, 0xB16D, 0x86DC, 0xB16E, 0x86DD, 0xB16F, 0x86DE, 0xB170, 0x86DF, 0xB171, 0x86E0, 0xB172, 0x86E1, 0xB173, 0x86E2, + 0xB174, 0x86E3, 0xB175, 0x86E4, 0xB176, 0x86E5, 0xB177, 0x86E6, 0xB178, 0xB3EB, 0xB179, 0xB3EC, 0xB17A, 0x86E7, 0xB17B, 0x86E8, + 0xB17C, 0xB3ED, 0xB17D, 0x86E9, 0xB17E, 0x86EA, 0xB17F, 0x86EB, 0xB180, 0xB3EE, 0xB181, 0x86EC, 0xB182, 0xB3EF, 0xB183, 0x86ED, + 0xB184, 0x86EE, 0xB185, 0x86EF, 0xB186, 0x86F0, 0xB187, 0x86F1, 0xB188, 0xB3F0, 0xB189, 0xB3F1, 0xB18A, 0x86F2, 0xB18B, 0xB3F2, + 0xB18C, 0x86F3, 0xB18D, 0xB3F3, 0xB18E, 0x86F4, 0xB18F, 0x86F5, 0xB190, 0x86F6, 0xB191, 0x86F7, 0xB192, 0xB3F4, 0xB193, 0xB3F5, + 0xB194, 0xB3F6, 0xB195, 0x86F8, 0xB196, 0x86F9, 0xB197, 0x86FA, 0xB198, 0xB3F7, 0xB199, 0x86FB, 0xB19A, 0x86FC, 0xB19B, 0x86FD, + 0xB19C, 0xB3F8, 0xB19D, 0x86FE, 0xB19E, 0x8741, 0xB19F, 0x8742, 0xB1A0, 0x8743, 0xB1A1, 0x8744, 0xB1A2, 0x8745, 0xB1A3, 0x8746, + 0xB1A4, 0x8747, 0xB1A5, 0x8748, 0xB1A6, 0x8749, 0xB1A7, 0x874A, 0xB1A8, 0xB3F9, 0xB1A9, 0x874B, 0xB1AA, 0x874C, 0xB1AB, 0x874D, + 0xB1AC, 0x874E, 0xB1AD, 0x874F, 0xB1AE, 0x8750, 0xB1AF, 0x8751, 0xB1B0, 0x8752, 0xB1B1, 0x8753, 0xB1B2, 0x8754, 0xB1B3, 0x8755, + 0xB1B4, 0x8756, 0xB1B5, 0x8757, 0xB1B6, 0x8758, 0xB1B7, 0x8759, 0xB1B8, 0x875A, 0xB1B9, 0x8761, 0xB1BA, 0x8762, 0xB1BB, 0x8763, + 0xB1BC, 0x8764, 0xB1BD, 0x8765, 0xB1BE, 0x8766, 0xB1BF, 0x8767, 0xB1C0, 0x8768, 0xB1C1, 0x8769, 0xB1C2, 0x876A, 0xB1C3, 0x876B, + 0xB1C4, 0x876C, 0xB1C5, 0x876D, 0xB1C6, 0x876E, 0xB1C7, 0x876F, 0xB1C8, 0x8770, 0xB1C9, 0x8771, 0xB1CA, 0x8772, 0xB1CB, 0x8773, + 0xB1CC, 0xB3FA, 0xB1CD, 0x8774, 0xB1CE, 0x8775, 0xB1CF, 0x8776, 0xB1D0, 0xB3FB, 0xB1D1, 0x8777, 0xB1D2, 0x8778, 0xB1D3, 0x8779, + 0xB1D4, 0xB3FC, 0xB1D5, 0x877A, 0xB1D6, 0x8781, 0xB1D7, 0x8782, 0xB1D8, 0x8783, 0xB1D9, 0x8784, 0xB1DA, 0x8785, 0xB1DB, 0x8786, + 0xB1DC, 0xB3FD, 0xB1DD, 0xB3FE, 0xB1DE, 0x8787, 0xB1DF, 0xB4A1, 0xB1E0, 0x8788, 0xB1E1, 0x8789, 0xB1E2, 0x878A, 0xB1E3, 0x878B, + 0xB1E4, 0x878C, 0xB1E5, 0x878D, 0xB1E6, 0x878E, 0xB1E7, 0x878F, 0xB1E8, 0xB4A2, 0xB1E9, 0xB4A3, 0xB1EA, 0x8790, 0xB1EB, 0x8791, + 0xB1EC, 0xB4A4, 0xB1ED, 0x8792, 0xB1EE, 0x8793, 0xB1EF, 0x8794, 0xB1F0, 0xB4A5, 0xB1F1, 0x8795, 0xB1F2, 0x8796, 0xB1F3, 0x8797, + 0xB1F4, 0x8798, 0xB1F5, 0x8799, 0xB1F6, 0x879A, 0xB1F7, 0x879B, 0xB1F8, 0x879C, 0xB1F9, 0xB4A6, 0xB1FA, 0x879D, 0xB1FB, 0xB4A7, + 0xB1FC, 0x879E, 0xB1FD, 0xB4A8, 0xB1FE, 0x879F, 0xB1FF, 0x87A0, 0xB200, 0x87A1, 0xB201, 0x87A2, 0xB202, 0x87A3, 0xB203, 0x87A4, + 0xB204, 0xB4A9, 0xB205, 0xB4AA, 0xB206, 0x87A5, 0xB207, 0x87A6, 0xB208, 0xB4AB, 0xB209, 0x87A7, 0xB20A, 0x87A8, 0xB20B, 0xB4AC, + 0xB20C, 0xB4AD, 0xB20D, 0x87A9, 0xB20E, 0x87AA, 0xB20F, 0x87AB, 0xB210, 0x87AC, 0xB211, 0x87AD, 0xB212, 0x87AE, 0xB213, 0x87AF, + 0xB214, 0xB4AE, 0xB215, 0xB4AF, 0xB216, 0x87B0, 0xB217, 0xB4B0, 0xB218, 0x87B1, 0xB219, 0xB4B1, 0xB21A, 0x87B2, 0xB21B, 0x87B3, + 0xB21C, 0x87B4, 0xB21D, 0x87B5, 0xB21E, 0x87B6, 0xB21F, 0x87B7, 0xB220, 0xB4B2, 0xB221, 0x87B8, 0xB222, 0x87B9, 0xB223, 0x87BA, + 0xB224, 0x87BB, 0xB225, 0x87BC, 0xB226, 0x87BD, 0xB227, 0x87BE, 0xB228, 0x87BF, 0xB229, 0x87C0, 0xB22A, 0x87C1, 0xB22B, 0x87C2, + 0xB22C, 0x87C3, 0xB22D, 0x87C4, 0xB22E, 0x87C5, 0xB22F, 0x87C6, 0xB230, 0x87C7, 0xB231, 0x87C8, 0xB232, 0x87C9, 0xB233, 0x87CA, + 0xB234, 0xB4B3, 0xB235, 0x87CB, 0xB236, 0x87CC, 0xB237, 0x87CD, 0xB238, 0x87CE, 0xB239, 0x87CF, 0xB23A, 0x87D0, 0xB23B, 0x87D1, + 0xB23C, 0xB4B4, 0xB23D, 0x87D2, 0xB23E, 0x87D3, 0xB23F, 0x87D4, 0xB240, 0x87D5, 0xB241, 0x87D6, 0xB242, 0x87D7, 0xB243, 0x87D8, + 0xB244, 0x87D9, 0xB245, 0x87DA, 0xB246, 0x87DB, 0xB247, 0x87DC, 0xB248, 0x87DD, 0xB249, 0x87DE, 0xB24A, 0x87DF, 0xB24B, 0x87E0, + 0xB24C, 0x87E1, 0xB24D, 0x87E2, 0xB24E, 0x87E3, 0xB24F, 0x87E4, 0xB250, 0x87E5, 0xB251, 0x87E6, 0xB252, 0x87E7, 0xB253, 0x87E8, + 0xB254, 0x87E9, 0xB255, 0x87EA, 0xB256, 0x87EB, 0xB257, 0x87EC, 0xB258, 0xB4B5, 0xB259, 0x87ED, 0xB25A, 0x87EE, 0xB25B, 0x87EF, + 0xB25C, 0xB4B6, 0xB25D, 0x87F0, 0xB25E, 0x87F1, 0xB25F, 0x87F2, 0xB260, 0xB4B7, 0xB261, 0x87F3, 0xB262, 0x87F4, 0xB263, 0x87F5, + 0xB264, 0x87F6, 0xB265, 0x87F7, 0xB266, 0x87F8, 0xB267, 0x87F9, 0xB268, 0xB4B8, 0xB269, 0xB4B9, 0xB26A, 0x87FA, 0xB26B, 0x87FB, + 0xB26C, 0x87FC, 0xB26D, 0x87FD, 0xB26E, 0x87FE, 0xB26F, 0x8841, 0xB270, 0x8842, 0xB271, 0x8843, 0xB272, 0x8844, 0xB273, 0x8845, + 0xB274, 0xB4BA, 0xB275, 0xB4BB, 0xB276, 0x8846, 0xB277, 0x8847, 0xB278, 0x8848, 0xB279, 0x8849, 0xB27A, 0x884A, 0xB27B, 0x884B, + 0xB27C, 0xB4BC, 0xB27D, 0x884C, 0xB27E, 0x884D, 0xB27F, 0x884E, 0xB280, 0x884F, 0xB281, 0x8850, 0xB282, 0x8851, 0xB283, 0x8852, + 0xB284, 0xB4BD, 0xB285, 0xB4BE, 0xB286, 0x8853, 0xB287, 0x8854, 0xB288, 0x8855, 0xB289, 0xB4BF, 0xB28A, 0x8856, 0xB28B, 0x8857, + 0xB28C, 0x8858, 0xB28D, 0x8859, 0xB28E, 0x885A, 0xB28F, 0x8861, 0xB290, 0xB4C0, 0xB291, 0xB4C1, 0xB292, 0x8862, 0xB293, 0x8863, + 0xB294, 0xB4C2, 0xB295, 0x8864, 0xB296, 0x8865, 0xB297, 0x8866, 0xB298, 0xB4C3, 0xB299, 0xB4C4, 0xB29A, 0xB4C5, 0xB29B, 0x8867, + 0xB29C, 0x8868, 0xB29D, 0x8869, 0xB29E, 0x886A, 0xB29F, 0x886B, 0xB2A0, 0xB4C6, 0xB2A1, 0xB4C7, 0xB2A2, 0x886C, 0xB2A3, 0xB4C8, + 0xB2A4, 0x886D, 0xB2A5, 0xB4C9, 0xB2A6, 0xB4CA, 0xB2A7, 0x886E, 0xB2A8, 0x886F, 0xB2A9, 0x8870, 0xB2AA, 0xB4CB, 0xB2AB, 0x8871, + 0xB2AC, 0xB4CC, 0xB2AD, 0x8872, 0xB2AE, 0x8873, 0xB2AF, 0x8874, 0xB2B0, 0xB4CD, 0xB2B1, 0x8875, 0xB2B2, 0x8876, 0xB2B3, 0x8877, + 0xB2B4, 0xB4CE, 0xB2B5, 0x8878, 0xB2B6, 0x8879, 0xB2B7, 0x887A, 0xB2B8, 0x8881, 0xB2B9, 0x8882, 0xB2BA, 0x8883, 0xB2BB, 0x8884, + 0xB2BC, 0x8885, 0xB2BD, 0x8886, 0xB2BE, 0x8887, 0xB2BF, 0x8888, 0xB2C0, 0x8889, 0xB2C1, 0x888A, 0xB2C2, 0x888B, 0xB2C3, 0x888C, + 0xB2C4, 0x888D, 0xB2C5, 0x888E, 0xB2C6, 0x888F, 0xB2C7, 0x8890, 0xB2C8, 0xB4CF, 0xB2C9, 0xB4D0, 0xB2CA, 0x8891, 0xB2CB, 0x8892, + 0xB2CC, 0xB4D1, 0xB2CD, 0x8893, 0xB2CE, 0x8894, 0xB2CF, 0x8895, 0xB2D0, 0xB4D2, 0xB2D1, 0x8896, 0xB2D2, 0xB4D3, 0xB2D3, 0x8897, + 0xB2D4, 0x8898, 0xB2D5, 0x8899, 0xB2D6, 0x889A, 0xB2D7, 0x889B, 0xB2D8, 0xB4D4, 0xB2D9, 0xB4D5, 0xB2DA, 0x889C, 0xB2DB, 0xB4D6, + 0xB2DC, 0x889D, 0xB2DD, 0xB4D7, 0xB2DE, 0x889E, 0xB2DF, 0x889F, 0xB2E0, 0x88A0, 0xB2E1, 0x88A1, 0xB2E2, 0xB4D8, 0xB2E3, 0x88A2, + 0xB2E4, 0xB4D9, 0xB2E5, 0xB4DA, 0xB2E6, 0xB4DB, 0xB2E7, 0x88A3, 0xB2E8, 0xB4DC, 0xB2E9, 0x88A4, 0xB2EA, 0x88A5, 0xB2EB, 0xB4DD, + 0xB2EC, 0xB4DE, 0xB2ED, 0xB4DF, 0xB2EE, 0xB4E0, 0xB2EF, 0xB4E1, 0xB2F0, 0x88A6, 0xB2F1, 0x88A7, 0xB2F2, 0x88A8, 0xB2F3, 0xB4E2, + 0xB2F4, 0xB4E3, 0xB2F5, 0xB4E4, 0xB2F6, 0x88A9, 0xB2F7, 0xB4E5, 0xB2F8, 0xB4E6, 0xB2F9, 0xB4E7, 0xB2FA, 0xB4E8, 0xB2FB, 0xB4E9, + 0xB2FC, 0x88AA, 0xB2FD, 0x88AB, 0xB2FE, 0x88AC, 0xB2FF, 0xB4EA, 0xB300, 0xB4EB, 0xB301, 0xB4EC, 0xB302, 0x88AD, 0xB303, 0x88AE, + 0xB304, 0xB4ED, 0xB305, 0x88AF, 0xB306, 0x88B0, 0xB307, 0x88B1, 0xB308, 0xB4EE, 0xB309, 0x88B2, 0xB30A, 0x88B3, 0xB30B, 0x88B4, + 0xB30C, 0x88B5, 0xB30D, 0x88B6, 0xB30E, 0x88B7, 0xB30F, 0x88B8, 0xB310, 0xB4EF, 0xB311, 0xB4F0, 0xB312, 0x88B9, 0xB313, 0xB4F1, + 0xB314, 0xB4F2, 0xB315, 0xB4F3, 0xB316, 0x88BA, 0xB317, 0x88BB, 0xB318, 0x88BC, 0xB319, 0x88BD, 0xB31A, 0x88BE, 0xB31B, 0x88BF, + 0xB31C, 0xB4F4, 0xB31D, 0x88C0, 0xB31E, 0x88C1, 0xB31F, 0x88C2, 0xB320, 0x88C3, 0xB321, 0x88C4, 0xB322, 0x88C5, 0xB323, 0x88C6, + 0xB324, 0x88C7, 0xB325, 0x88C8, 0xB326, 0x88C9, 0xB327, 0x88CA, 0xB328, 0x88CB, 0xB329, 0x88CC, 0xB32A, 0x88CD, 0xB32B, 0x88CE, + 0xB32C, 0x88CF, 0xB32D, 0x88D0, 0xB32E, 0x88D1, 0xB32F, 0x88D2, 0xB330, 0x88D3, 0xB331, 0x88D4, 0xB332, 0x88D5, 0xB333, 0x88D6, + 0xB334, 0x88D7, 0xB335, 0x88D8, 0xB336, 0x88D9, 0xB337, 0x88DA, 0xB338, 0x88DB, 0xB339, 0x88DC, 0xB33A, 0x88DD, 0xB33B, 0x88DE, + 0xB33C, 0x88DF, 0xB33D, 0x88E0, 0xB33E, 0x88E1, 0xB33F, 0x88E2, 0xB340, 0x88E3, 0xB341, 0x88E4, 0xB342, 0x88E5, 0xB343, 0x88E6, + 0xB344, 0x88E7, 0xB345, 0x88E8, 0xB346, 0x88E9, 0xB347, 0x88EA, 0xB348, 0x88EB, 0xB349, 0x88EC, 0xB34A, 0x88ED, 0xB34B, 0x88EE, + 0xB34C, 0x88EF, 0xB34D, 0x88F0, 0xB34E, 0x88F1, 0xB34F, 0x88F2, 0xB350, 0x88F3, 0xB351, 0x88F4, 0xB352, 0x88F5, 0xB353, 0x88F6, + 0xB354, 0xB4F5, 0xB355, 0xB4F6, 0xB356, 0xB4F7, 0xB357, 0x88F7, 0xB358, 0xB4F8, 0xB359, 0x88F8, 0xB35A, 0x88F9, 0xB35B, 0xB4F9, + 0xB35C, 0xB4FA, 0xB35D, 0x88FA, 0xB35E, 0xB4FB, 0xB35F, 0xB4FC, 0xB360, 0x88FB, 0xB361, 0x88FC, 0xB362, 0x88FD, 0xB363, 0x88FE, + 0xB364, 0xB4FD, 0xB365, 0xB4FE, 0xB366, 0x8941, 0xB367, 0xB5A1, 0xB368, 0x8942, 0xB369, 0xB5A2, 0xB36A, 0x8943, 0xB36B, 0xB5A3, + 0xB36C, 0x8944, 0xB36D, 0x8945, 0xB36E, 0xB5A4, 0xB36F, 0x8946, 0xB370, 0xB5A5, 0xB371, 0xB5A6, 0xB372, 0x8947, 0xB373, 0x8948, + 0xB374, 0xB5A7, 0xB375, 0x8949, 0xB376, 0x894A, 0xB377, 0x894B, 0xB378, 0xB5A8, 0xB379, 0x894C, 0xB37A, 0x894D, 0xB37B, 0x894E, + 0xB37C, 0x894F, 0xB37D, 0x8950, 0xB37E, 0x8951, 0xB37F, 0x8952, 0xB380, 0xB5A9, 0xB381, 0xB5AA, 0xB382, 0x8953, 0xB383, 0xB5AB, + 0xB384, 0xB5AC, 0xB385, 0xB5AD, 0xB386, 0x8954, 0xB387, 0x8955, 0xB388, 0x8956, 0xB389, 0x8957, 0xB38A, 0x8958, 0xB38B, 0x8959, + 0xB38C, 0xB5AE, 0xB38D, 0x895A, 0xB38E, 0x8961, 0xB38F, 0x8962, 0xB390, 0xB5AF, 0xB391, 0x8963, 0xB392, 0x8964, 0xB393, 0x8965, + 0xB394, 0xB5B0, 0xB395, 0x8966, 0xB396, 0x8967, 0xB397, 0x8968, 0xB398, 0x8969, 0xB399, 0x896A, 0xB39A, 0x896B, 0xB39B, 0x896C, + 0xB39C, 0x896D, 0xB39D, 0x896E, 0xB39E, 0x896F, 0xB39F, 0x8970, 0xB3A0, 0xB5B1, 0xB3A1, 0xB5B2, 0xB3A2, 0x8971, 0xB3A3, 0x8972, + 0xB3A4, 0x8973, 0xB3A5, 0x8974, 0xB3A6, 0x8975, 0xB3A7, 0x8976, 0xB3A8, 0xB5B3, 0xB3A9, 0x8977, 0xB3AA, 0x8978, 0xB3AB, 0x8979, + 0xB3AC, 0xB5B4, 0xB3AD, 0x897A, 0xB3AE, 0x8981, 0xB3AF, 0x8982, 0xB3B0, 0x8983, 0xB3B1, 0x8984, 0xB3B2, 0x8985, 0xB3B3, 0x8986, + 0xB3B4, 0x8987, 0xB3B5, 0x8988, 0xB3B6, 0x8989, 0xB3B7, 0x898A, 0xB3B8, 0x898B, 0xB3B9, 0x898C, 0xB3BA, 0x898D, 0xB3BB, 0x898E, + 0xB3BC, 0x898F, 0xB3BD, 0x8990, 0xB3BE, 0x8991, 0xB3BF, 0x8992, 0xB3C0, 0x8993, 0xB3C1, 0x8994, 0xB3C2, 0x8995, 0xB3C3, 0x8996, + 0xB3C4, 0xB5B5, 0xB3C5, 0xB5B6, 0xB3C6, 0x8997, 0xB3C7, 0x8998, 0xB3C8, 0xB5B7, 0xB3C9, 0x8999, 0xB3CA, 0x899A, 0xB3CB, 0xB5B8, + 0xB3CC, 0xB5B9, 0xB3CD, 0x899B, 0xB3CE, 0xB5BA, 0xB3CF, 0x899C, 0xB3D0, 0xB5BB, 0xB3D1, 0x899D, 0xB3D2, 0x899E, 0xB3D3, 0x899F, + 0xB3D4, 0xB5BC, 0xB3D5, 0xB5BD, 0xB3D6, 0x89A0, 0xB3D7, 0xB5BE, 0xB3D8, 0x89A1, 0xB3D9, 0xB5BF, 0xB3DA, 0x89A2, 0xB3DB, 0xB5C0, + 0xB3DC, 0x89A3, 0xB3DD, 0xB5C1, 0xB3DE, 0x89A4, 0xB3DF, 0x89A5, 0xB3E0, 0xB5C2, 0xB3E1, 0x89A6, 0xB3E2, 0x89A7, 0xB3E3, 0x89A8, + 0xB3E4, 0xB5C3, 0xB3E5, 0x89A9, 0xB3E6, 0x89AA, 0xB3E7, 0x89AB, 0xB3E8, 0xB5C4, 0xB3E9, 0x89AC, 0xB3EA, 0x89AD, 0xB3EB, 0x89AE, + 0xB3EC, 0x89AF, 0xB3ED, 0x89B0, 0xB3EE, 0x89B1, 0xB3EF, 0x89B2, 0xB3F0, 0x89B3, 0xB3F1, 0x89B4, 0xB3F2, 0x89B5, 0xB3F3, 0x89B6, + 0xB3F4, 0x89B7, 0xB3F5, 0x89B8, 0xB3F6, 0x89B9, 0xB3F7, 0x89BA, 0xB3F8, 0x89BB, 0xB3F9, 0x89BC, 0xB3FA, 0x89BD, 0xB3FB, 0x89BE, + 0xB3FC, 0xB5C5, 0xB3FD, 0x89BF, 0xB3FE, 0x89C0, 0xB3FF, 0x89C1, 0xB400, 0x89C2, 0xB401, 0x89C3, 0xB402, 0x89C4, 0xB403, 0x89C5, + 0xB404, 0x89C6, 0xB405, 0x89C7, 0xB406, 0x89C8, 0xB407, 0x89C9, 0xB408, 0x89CA, 0xB409, 0x89CB, 0xB40A, 0x89CC, 0xB40B, 0x89CD, + 0xB40C, 0x89CE, 0xB40D, 0x89CF, 0xB40E, 0x89D0, 0xB40F, 0x89D1, 0xB410, 0xB5C6, 0xB411, 0x89D2, 0xB412, 0x89D3, 0xB413, 0x89D4, + 0xB414, 0x89D5, 0xB415, 0x89D6, 0xB416, 0x89D7, 0xB417, 0x89D8, 0xB418, 0xB5C7, 0xB419, 0x89D9, 0xB41A, 0x89DA, 0xB41B, 0x89DB, + 0xB41C, 0xB5C8, 0xB41D, 0x89DC, 0xB41E, 0x89DD, 0xB41F, 0x89DE, 0xB420, 0xB5C9, 0xB421, 0x89DF, 0xB422, 0x89E0, 0xB423, 0x89E1, + 0xB424, 0x89E2, 0xB425, 0x89E3, 0xB426, 0x89E4, 0xB427, 0x89E5, 0xB428, 0xB5CA, 0xB429, 0xB5CB, 0xB42A, 0x89E6, 0xB42B, 0xB5CC, + 0xB42C, 0x89E7, 0xB42D, 0x89E8, 0xB42E, 0x89E9, 0xB42F, 0x89EA, 0xB430, 0x89EB, 0xB431, 0x89EC, 0xB432, 0x89ED, 0xB433, 0x89EE, + 0xB434, 0xB5CD, 0xB435, 0x89EF, 0xB436, 0x89F0, 0xB437, 0x89F1, 0xB438, 0x89F2, 0xB439, 0x89F3, 0xB43A, 0x89F4, 0xB43B, 0x89F5, + 0xB43C, 0x89F6, 0xB43D, 0x89F7, 0xB43E, 0x89F8, 0xB43F, 0x89F9, 0xB440, 0x89FA, 0xB441, 0x89FB, 0xB442, 0x89FC, 0xB443, 0x89FD, + 0xB444, 0x89FE, 0xB445, 0x8A41, 0xB446, 0x8A42, 0xB447, 0x8A43, 0xB448, 0x8A44, 0xB449, 0x8A45, 0xB44A, 0x8A46, 0xB44B, 0x8A47, + 0xB44C, 0x8A48, 0xB44D, 0x8A49, 0xB44E, 0x8A4A, 0xB44F, 0x8A4B, 0xB450, 0xB5CE, 0xB451, 0xB5CF, 0xB452, 0x8A4C, 0xB453, 0x8A4D, + 0xB454, 0xB5D0, 0xB455, 0x8A4E, 0xB456, 0x8A4F, 0xB457, 0x8A50, 0xB458, 0xB5D1, 0xB459, 0x8A51, 0xB45A, 0x8A52, 0xB45B, 0x8A53, + 0xB45C, 0x8A54, 0xB45D, 0x8A55, 0xB45E, 0x8A56, 0xB45F, 0x8A57, 0xB460, 0xB5D2, 0xB461, 0xB5D3, 0xB462, 0x8A58, 0xB463, 0xB5D4, + 0xB464, 0x8A59, 0xB465, 0xB5D5, 0xB466, 0x8A5A, 0xB467, 0x8A61, 0xB468, 0x8A62, 0xB469, 0x8A63, 0xB46A, 0x8A64, 0xB46B, 0x8A65, + 0xB46C, 0xB5D6, 0xB46D, 0x8A66, 0xB46E, 0x8A67, 0xB46F, 0x8A68, 0xB470, 0x8A69, 0xB471, 0x8A6A, 0xB472, 0x8A6B, 0xB473, 0x8A6C, + 0xB474, 0x8A6D, 0xB475, 0x8A6E, 0xB476, 0x8A6F, 0xB477, 0x8A70, 0xB478, 0x8A71, 0xB479, 0x8A72, 0xB47A, 0x8A73, 0xB47B, 0x8A74, + 0xB47C, 0x8A75, 0xB47D, 0x8A76, 0xB47E, 0x8A77, 0xB47F, 0x8A78, 0xB480, 0xB5D7, 0xB481, 0x8A79, 0xB482, 0x8A7A, 0xB483, 0x8A81, + 0xB484, 0x8A82, 0xB485, 0x8A83, 0xB486, 0x8A84, 0xB487, 0x8A85, 0xB488, 0xB5D8, 0xB489, 0x8A86, 0xB48A, 0x8A87, 0xB48B, 0x8A88, + 0xB48C, 0x8A89, 0xB48D, 0x8A8A, 0xB48E, 0x8A8B, 0xB48F, 0x8A8C, 0xB490, 0x8A8D, 0xB491, 0x8A8E, 0xB492, 0x8A8F, 0xB493, 0x8A90, + 0xB494, 0x8A91, 0xB495, 0x8A92, 0xB496, 0x8A93, 0xB497, 0x8A94, 0xB498, 0x8A95, 0xB499, 0x8A96, 0xB49A, 0x8A97, 0xB49B, 0x8A98, + 0xB49C, 0x8A99, 0xB49D, 0xB5D9, 0xB49E, 0x8A9A, 0xB49F, 0x8A9B, 0xB4A0, 0x8A9C, 0xB4A1, 0x8A9D, 0xB4A2, 0x8A9E, 0xB4A3, 0x8A9F, + 0xB4A4, 0xB5DA, 0xB4A5, 0x8AA0, 0xB4A6, 0x8AA1, 0xB4A7, 0x8AA2, 0xB4A8, 0xB5DB, 0xB4A9, 0x8AA3, 0xB4AA, 0x8AA4, 0xB4AB, 0x8AA5, + 0xB4AC, 0xB5DC, 0xB4AD, 0x8AA6, 0xB4AE, 0x8AA7, 0xB4AF, 0x8AA8, 0xB4B0, 0x8AA9, 0xB4B1, 0x8AAA, 0xB4B2, 0x8AAB, 0xB4B3, 0x8AAC, + 0xB4B4, 0x8AAD, 0xB4B5, 0xB5DD, 0xB4B6, 0x8AAE, 0xB4B7, 0xB5DE, 0xB4B8, 0x8AAF, 0xB4B9, 0xB5DF, 0xB4BA, 0x8AB0, 0xB4BB, 0x8AB1, + 0xB4BC, 0x8AB2, 0xB4BD, 0x8AB3, 0xB4BE, 0x8AB4, 0xB4BF, 0x8AB5, 0xB4C0, 0xB5E0, 0xB4C1, 0x8AB6, 0xB4C2, 0x8AB7, 0xB4C3, 0x8AB8, + 0xB4C4, 0xB5E1, 0xB4C5, 0x8AB9, 0xB4C6, 0x8ABA, 0xB4C7, 0x8ABB, 0xB4C8, 0xB5E2, 0xB4C9, 0x8ABC, 0xB4CA, 0x8ABD, 0xB4CB, 0x8ABE, + 0xB4CC, 0x8ABF, 0xB4CD, 0x8AC0, 0xB4CE, 0x8AC1, 0xB4CF, 0x8AC2, 0xB4D0, 0xB5E3, 0xB4D1, 0x8AC3, 0xB4D2, 0x8AC4, 0xB4D3, 0x8AC5, + 0xB4D4, 0x8AC6, 0xB4D5, 0xB5E4, 0xB4D6, 0x8AC7, 0xB4D7, 0x8AC8, 0xB4D8, 0x8AC9, 0xB4D9, 0x8ACA, 0xB4DA, 0x8ACB, 0xB4DB, 0x8ACC, + 0xB4DC, 0xB5E5, 0xB4DD, 0xB5E6, 0xB4DE, 0x8ACD, 0xB4DF, 0x8ACE, 0xB4E0, 0xB5E7, 0xB4E1, 0x8ACF, 0xB4E2, 0x8AD0, 0xB4E3, 0xB5E8, + 0xB4E4, 0xB5E9, 0xB4E5, 0x8AD1, 0xB4E6, 0xB5EA, 0xB4E7, 0x8AD2, 0xB4E8, 0x8AD3, 0xB4E9, 0x8AD4, 0xB4EA, 0x8AD5, 0xB4EB, 0x8AD6, + 0xB4EC, 0xB5EB, 0xB4ED, 0xB5EC, 0xB4EE, 0x8AD7, 0xB4EF, 0xB5ED, 0xB4F0, 0x8AD8, 0xB4F1, 0xB5EE, 0xB4F2, 0x8AD9, 0xB4F3, 0x8ADA, + 0xB4F4, 0x8ADB, 0xB4F5, 0x8ADC, 0xB4F6, 0x8ADD, 0xB4F7, 0x8ADE, 0xB4F8, 0xB5EF, 0xB4F9, 0x8ADF, 0xB4FA, 0x8AE0, 0xB4FB, 0x8AE1, + 0xB4FC, 0x8AE2, 0xB4FD, 0x8AE3, 0xB4FE, 0x8AE4, 0xB4FF, 0x8AE5, 0xB500, 0x8AE6, 0xB501, 0x8AE7, 0xB502, 0x8AE8, 0xB503, 0x8AE9, + 0xB504, 0x8AEA, 0xB505, 0x8AEB, 0xB506, 0x8AEC, 0xB507, 0x8AED, 0xB508, 0x8AEE, 0xB509, 0x8AEF, 0xB50A, 0x8AF0, 0xB50B, 0x8AF1, + 0xB50C, 0x8AF2, 0xB50D, 0x8AF3, 0xB50E, 0x8AF4, 0xB50F, 0x8AF5, 0xB510, 0x8AF6, 0xB511, 0x8AF7, 0xB512, 0x8AF8, 0xB513, 0x8AF9, + 0xB514, 0xB5F0, 0xB515, 0xB5F1, 0xB516, 0x8AFA, 0xB517, 0x8AFB, 0xB518, 0xB5F2, 0xB519, 0x8AFC, 0xB51A, 0x8AFD, 0xB51B, 0xB5F3, + 0xB51C, 0xB5F4, 0xB51D, 0x8AFE, 0xB51E, 0x8B41, 0xB51F, 0x8B42, 0xB520, 0x8B43, 0xB521, 0x8B44, 0xB522, 0x8B45, 0xB523, 0x8B46, + 0xB524, 0xB5F5, 0xB525, 0xB5F6, 0xB526, 0x8B47, 0xB527, 0xB5F7, 0xB528, 0xB5F8, 0xB529, 0xB5F9, 0xB52A, 0xB5FA, 0xB52B, 0x8B48, + 0xB52C, 0x8B49, 0xB52D, 0x8B4A, 0xB52E, 0x8B4B, 0xB52F, 0x8B4C, 0xB530, 0xB5FB, 0xB531, 0xB5FC, 0xB532, 0x8B4D, 0xB533, 0x8B4E, + 0xB534, 0xB5FD, 0xB535, 0x8B4F, 0xB536, 0x8B50, 0xB537, 0x8B51, 0xB538, 0xB5FE, 0xB539, 0x8B52, 0xB53A, 0x8B53, 0xB53B, 0x8B54, + 0xB53C, 0x8B55, 0xB53D, 0x8B56, 0xB53E, 0x8B57, 0xB53F, 0x8B58, 0xB540, 0xB6A1, 0xB541, 0xB6A2, 0xB542, 0x8B59, 0xB543, 0xB6A3, + 0xB544, 0xB6A4, 0xB545, 0xB6A5, 0xB546, 0x8B5A, 0xB547, 0x8B61, 0xB548, 0x8B62, 0xB549, 0x8B63, 0xB54A, 0x8B64, 0xB54B, 0xB6A6, + 0xB54C, 0xB6A7, 0xB54D, 0xB6A8, 0xB54E, 0x8B65, 0xB54F, 0x8B66, 0xB550, 0xB6A9, 0xB551, 0x8B67, 0xB552, 0x8B68, 0xB553, 0x8B69, + 0xB554, 0xB6AA, 0xB555, 0x8B6A, 0xB556, 0x8B6B, 0xB557, 0x8B6C, 0xB558, 0x8B6D, 0xB559, 0x8B6E, 0xB55A, 0x8B6F, 0xB55B, 0x8B70, + 0xB55C, 0xB6AB, 0xB55D, 0xB6AC, 0xB55E, 0x8B71, 0xB55F, 0xB6AD, 0xB560, 0xB6AE, 0xB561, 0xB6AF, 0xB562, 0x8B72, 0xB563, 0x8B73, + 0xB564, 0x8B74, 0xB565, 0x8B75, 0xB566, 0x8B76, 0xB567, 0x8B77, 0xB568, 0x8B78, 0xB569, 0x8B79, 0xB56A, 0x8B7A, 0xB56B, 0x8B81, + 0xB56C, 0x8B82, 0xB56D, 0x8B83, 0xB56E, 0x8B84, 0xB56F, 0x8B85, 0xB570, 0x8B86, 0xB571, 0x8B87, 0xB572, 0x8B88, 0xB573, 0x8B89, + 0xB574, 0x8B8A, 0xB575, 0x8B8B, 0xB576, 0x8B8C, 0xB577, 0x8B8D, 0xB578, 0x8B8E, 0xB579, 0x8B8F, 0xB57A, 0x8B90, 0xB57B, 0x8B91, + 0xB57C, 0x8B92, 0xB57D, 0x8B93, 0xB57E, 0x8B94, 0xB57F, 0x8B95, 0xB580, 0x8B96, 0xB581, 0x8B97, 0xB582, 0x8B98, 0xB583, 0x8B99, + 0xB584, 0x8B9A, 0xB585, 0x8B9B, 0xB586, 0x8B9C, 0xB587, 0x8B9D, 0xB588, 0x8B9E, 0xB589, 0x8B9F, 0xB58A, 0x8BA0, 0xB58B, 0x8BA1, + 0xB58C, 0x8BA2, 0xB58D, 0x8BA3, 0xB58E, 0x8BA4, 0xB58F, 0x8BA5, 0xB590, 0x8BA6, 0xB591, 0x8BA7, 0xB592, 0x8BA8, 0xB593, 0x8BA9, + 0xB594, 0x8BAA, 0xB595, 0x8BAB, 0xB596, 0x8BAC, 0xB597, 0x8BAD, 0xB598, 0x8BAE, 0xB599, 0x8BAF, 0xB59A, 0x8BB0, 0xB59B, 0x8BB1, + 0xB59C, 0x8BB2, 0xB59D, 0x8BB3, 0xB59E, 0x8BB4, 0xB59F, 0x8BB5, 0xB5A0, 0xB6B0, 0xB5A1, 0xB6B1, 0xB5A2, 0x8BB6, 0xB5A3, 0x8BB7, + 0xB5A4, 0xB6B2, 0xB5A5, 0x8BB8, 0xB5A6, 0x8BB9, 0xB5A7, 0x8BBA, 0xB5A8, 0xB6B3, 0xB5A9, 0x8BBB, 0xB5AA, 0xB6B4, 0xB5AB, 0xB6B5, + 0xB5AC, 0x8BBC, 0xB5AD, 0x8BBD, 0xB5AE, 0x8BBE, 0xB5AF, 0x8BBF, 0xB5B0, 0xB6B6, 0xB5B1, 0xB6B7, 0xB5B2, 0x8BC0, 0xB5B3, 0xB6B8, + 0xB5B4, 0xB6B9, 0xB5B5, 0xB6BA, 0xB5B6, 0x8BC1, 0xB5B7, 0x8BC2, 0xB5B8, 0x8BC3, 0xB5B9, 0x8BC4, 0xB5BA, 0x8BC5, 0xB5BB, 0xB6BB, + 0xB5BC, 0xB6BC, 0xB5BD, 0xB6BD, 0xB5BE, 0x8BC6, 0xB5BF, 0x8BC7, 0xB5C0, 0xB6BE, 0xB5C1, 0x8BC8, 0xB5C2, 0x8BC9, 0xB5C3, 0x8BCA, + 0xB5C4, 0xB6BF, 0xB5C5, 0x8BCB, 0xB5C6, 0x8BCC, 0xB5C7, 0x8BCD, 0xB5C8, 0x8BCE, 0xB5C9, 0x8BCF, 0xB5CA, 0x8BD0, 0xB5CB, 0x8BD1, + 0xB5CC, 0xB6C0, 0xB5CD, 0xB6C1, 0xB5CE, 0x8BD2, 0xB5CF, 0xB6C2, 0xB5D0, 0xB6C3, 0xB5D1, 0xB6C4, 0xB5D2, 0x8BD3, 0xB5D3, 0x8BD4, + 0xB5D4, 0x8BD5, 0xB5D5, 0x8BD6, 0xB5D6, 0x8BD7, 0xB5D7, 0x8BD8, 0xB5D8, 0xB6C5, 0xB5D9, 0x8BD9, 0xB5DA, 0x8BDA, 0xB5DB, 0x8BDB, + 0xB5DC, 0x8BDC, 0xB5DD, 0x8BDD, 0xB5DE, 0x8BDE, 0xB5DF, 0x8BDF, 0xB5E0, 0x8BE0, 0xB5E1, 0x8BE1, 0xB5E2, 0x8BE2, 0xB5E3, 0x8BE3, + 0xB5E4, 0x8BE4, 0xB5E5, 0x8BE5, 0xB5E6, 0x8BE6, 0xB5E7, 0x8BE7, 0xB5E8, 0x8BE8, 0xB5E9, 0x8BE9, 0xB5EA, 0x8BEA, 0xB5EB, 0x8BEB, + 0xB5EC, 0xB6C6, 0xB5ED, 0x8BEC, 0xB5EE, 0x8BED, 0xB5EF, 0x8BEE, 0xB5F0, 0x8BEF, 0xB5F1, 0x8BF0, 0xB5F2, 0x8BF1, 0xB5F3, 0x8BF2, + 0xB5F4, 0x8BF3, 0xB5F5, 0x8BF4, 0xB5F6, 0x8BF5, 0xB5F7, 0x8BF6, 0xB5F8, 0x8BF7, 0xB5F9, 0x8BF8, 0xB5FA, 0x8BF9, 0xB5FB, 0x8BFA, + 0xB5FC, 0x8BFB, 0xB5FD, 0x8BFC, 0xB5FE, 0x8BFD, 0xB5FF, 0x8BFE, 0xB600, 0x8C41, 0xB601, 0x8C42, 0xB602, 0x8C43, 0xB603, 0x8C44, + 0xB604, 0x8C45, 0xB605, 0x8C46, 0xB606, 0x8C47, 0xB607, 0x8C48, 0xB608, 0x8C49, 0xB609, 0x8C4A, 0xB60A, 0x8C4B, 0xB60B, 0x8C4C, + 0xB60C, 0x8C4D, 0xB60D, 0x8C4E, 0xB60E, 0x8C4F, 0xB60F, 0x8C50, 0xB610, 0xB6C7, 0xB611, 0xB6C8, 0xB612, 0x8C51, 0xB613, 0x8C52, + 0xB614, 0xB6C9, 0xB615, 0x8C53, 0xB616, 0x8C54, 0xB617, 0x8C55, 0xB618, 0xB6CA, 0xB619, 0x8C56, 0xB61A, 0x8C57, 0xB61B, 0x8C58, + 0xB61C, 0x8C59, 0xB61D, 0x8C5A, 0xB61E, 0x8C61, 0xB61F, 0x8C62, 0xB620, 0x8C63, 0xB621, 0x8C64, 0xB622, 0x8C65, 0xB623, 0x8C66, + 0xB624, 0x8C67, 0xB625, 0xB6CB, 0xB626, 0x8C68, 0xB627, 0x8C69, 0xB628, 0x8C6A, 0xB629, 0x8C6B, 0xB62A, 0x8C6C, 0xB62B, 0x8C6D, + 0xB62C, 0xB6CC, 0xB62D, 0x8C6E, 0xB62E, 0x8C6F, 0xB62F, 0x8C70, 0xB630, 0x8C71, 0xB631, 0x8C72, 0xB632, 0x8C73, 0xB633, 0x8C74, + 0xB634, 0xB6CD, 0xB635, 0x8C75, 0xB636, 0x8C76, 0xB637, 0x8C77, 0xB638, 0x8C78, 0xB639, 0x8C79, 0xB63A, 0x8C7A, 0xB63B, 0x8C81, + 0xB63C, 0x8C82, 0xB63D, 0x8C83, 0xB63E, 0x8C84, 0xB63F, 0x8C85, 0xB640, 0x8C86, 0xB641, 0x8C87, 0xB642, 0x8C88, 0xB643, 0x8C89, + 0xB644, 0x8C8A, 0xB645, 0x8C8B, 0xB646, 0x8C8C, 0xB647, 0x8C8D, 0xB648, 0xB6CE, 0xB649, 0x8C8E, 0xB64A, 0x8C8F, 0xB64B, 0x8C90, + 0xB64C, 0x8C91, 0xB64D, 0x8C92, 0xB64E, 0x8C93, 0xB64F, 0x8C94, 0xB650, 0x8C95, 0xB651, 0x8C96, 0xB652, 0x8C97, 0xB653, 0x8C98, + 0xB654, 0x8C99, 0xB655, 0x8C9A, 0xB656, 0x8C9B, 0xB657, 0x8C9C, 0xB658, 0x8C9D, 0xB659, 0x8C9E, 0xB65A, 0x8C9F, 0xB65B, 0x8CA0, + 0xB65C, 0x8CA1, 0xB65D, 0x8CA2, 0xB65E, 0x8CA3, 0xB65F, 0x8CA4, 0xB660, 0x8CA5, 0xB661, 0x8CA6, 0xB662, 0x8CA7, 0xB663, 0x8CA8, + 0xB664, 0xB6CF, 0xB665, 0x8CA9, 0xB666, 0x8CAA, 0xB667, 0x8CAB, 0xB668, 0xB6D0, 0xB669, 0x8CAC, 0xB66A, 0x8CAD, 0xB66B, 0x8CAE, + 0xB66C, 0x8CAF, 0xB66D, 0x8CB0, 0xB66E, 0x8CB1, 0xB66F, 0x8CB2, 0xB670, 0x8CB3, 0xB671, 0x8CB4, 0xB672, 0x8CB5, 0xB673, 0x8CB6, + 0xB674, 0x8CB7, 0xB675, 0x8CB8, 0xB676, 0x8CB9, 0xB677, 0x8CBA, 0xB678, 0x8CBB, 0xB679, 0x8CBC, 0xB67A, 0x8CBD, 0xB67B, 0x8CBE, + 0xB67C, 0x8CBF, 0xB67D, 0x8CC0, 0xB67E, 0x8CC1, 0xB67F, 0x8CC2, 0xB680, 0x8CC3, 0xB681, 0x8CC4, 0xB682, 0x8CC5, 0xB683, 0x8CC6, + 0xB684, 0x8CC7, 0xB685, 0x8CC8, 0xB686, 0x8CC9, 0xB687, 0x8CCA, 0xB688, 0x8CCB, 0xB689, 0x8CCC, 0xB68A, 0x8CCD, 0xB68B, 0x8CCE, + 0xB68C, 0x8CCF, 0xB68D, 0x8CD0, 0xB68E, 0x8CD1, 0xB68F, 0x8CD2, 0xB690, 0x8CD3, 0xB691, 0x8CD4, 0xB692, 0x8CD5, 0xB693, 0x8CD6, + 0xB694, 0x8CD7, 0xB695, 0x8CD8, 0xB696, 0x8CD9, 0xB697, 0x8CDA, 0xB698, 0x8CDB, 0xB699, 0x8CDC, 0xB69A, 0x8CDD, 0xB69B, 0x8CDE, + 0xB69C, 0xB6D1, 0xB69D, 0xB6D2, 0xB69E, 0x8CDF, 0xB69F, 0x8CE0, 0xB6A0, 0xB6D3, 0xB6A1, 0x8CE1, 0xB6A2, 0x8CE2, 0xB6A3, 0x8CE3, + 0xB6A4, 0xB6D4, 0xB6A5, 0x8CE4, 0xB6A6, 0x8CE5, 0xB6A7, 0x8CE6, 0xB6A8, 0x8CE7, 0xB6A9, 0x8CE8, 0xB6AA, 0x8CE9, 0xB6AB, 0xB6D5, + 0xB6AC, 0xB6D6, 0xB6AD, 0x8CEA, 0xB6AE, 0x8CEB, 0xB6AF, 0x8CEC, 0xB6B0, 0x8CED, 0xB6B1, 0xB6D7, 0xB6B2, 0x8CEE, 0xB6B3, 0x8CEF, + 0xB6B4, 0x8CF0, 0xB6B5, 0x8CF1, 0xB6B6, 0x8CF2, 0xB6B7, 0x8CF3, 0xB6B8, 0x8CF4, 0xB6B9, 0x8CF5, 0xB6BA, 0x8CF6, 0xB6BB, 0x8CF7, + 0xB6BC, 0x8CF8, 0xB6BD, 0x8CF9, 0xB6BE, 0x8CFA, 0xB6BF, 0x8CFB, 0xB6C0, 0x8CFC, 0xB6C1, 0x8CFD, 0xB6C2, 0x8CFE, 0xB6C3, 0x8D41, + 0xB6C4, 0x8D42, 0xB6C5, 0x8D43, 0xB6C6, 0x8D44, 0xB6C7, 0x8D45, 0xB6C8, 0x8D46, 0xB6C9, 0x8D47, 0xB6CA, 0x8D48, 0xB6CB, 0x8D49, + 0xB6CC, 0x8D4A, 0xB6CD, 0x8D4B, 0xB6CE, 0x8D4C, 0xB6CF, 0x8D4D, 0xB6D0, 0x8D4E, 0xB6D1, 0x8D4F, 0xB6D2, 0x8D50, 0xB6D3, 0x8D51, + 0xB6D4, 0xB6D8, 0xB6D5, 0x8D52, 0xB6D6, 0x8D53, 0xB6D7, 0x8D54, 0xB6D8, 0x8D55, 0xB6D9, 0x8D56, 0xB6DA, 0x8D57, 0xB6DB, 0x8D58, + 0xB6DC, 0x8D59, 0xB6DD, 0x8D5A, 0xB6DE, 0x8D61, 0xB6DF, 0x8D62, 0xB6E0, 0x8D63, 0xB6E1, 0x8D64, 0xB6E2, 0x8D65, 0xB6E3, 0x8D66, + 0xB6E4, 0x8D67, 0xB6E5, 0x8D68, 0xB6E6, 0x8D69, 0xB6E7, 0x8D6A, 0xB6E8, 0x8D6B, 0xB6E9, 0x8D6C, 0xB6EA, 0x8D6D, 0xB6EB, 0x8D6E, + 0xB6EC, 0x8D6F, 0xB6ED, 0x8D70, 0xB6EE, 0x8D71, 0xB6EF, 0x8D72, 0xB6F0, 0xB6D9, 0xB6F1, 0x8D73, 0xB6F2, 0x8D74, 0xB6F3, 0x8D75, + 0xB6F4, 0xB6DA, 0xB6F5, 0x8D76, 0xB6F6, 0x8D77, 0xB6F7, 0x8D78, 0xB6F8, 0xB6DB, 0xB6F9, 0x8D79, 0xB6FA, 0x8D7A, 0xB6FB, 0x8D81, + 0xB6FC, 0x8D82, 0xB6FD, 0x8D83, 0xB6FE, 0x8D84, 0xB6FF, 0x8D85, 0xB700, 0xB6DC, 0xB701, 0xB6DD, 0xB702, 0x8D86, 0xB703, 0x8D87, + 0xB704, 0x8D88, 0xB705, 0xB6DE, 0xB706, 0x8D89, 0xB707, 0x8D8A, 0xB708, 0x8D8B, 0xB709, 0x8D8C, 0xB70A, 0x8D8D, 0xB70B, 0x8D8E, + 0xB70C, 0x8D8F, 0xB70D, 0x8D90, 0xB70E, 0x8D91, 0xB70F, 0x8D92, 0xB710, 0x8D93, 0xB711, 0x8D94, 0xB712, 0x8D95, 0xB713, 0x8D96, + 0xB714, 0x8D97, 0xB715, 0x8D98, 0xB716, 0x8D99, 0xB717, 0x8D9A, 0xB718, 0x8D9B, 0xB719, 0x8D9C, 0xB71A, 0x8D9D, 0xB71B, 0x8D9E, + 0xB71C, 0x8D9F, 0xB71D, 0x8DA0, 0xB71E, 0x8DA1, 0xB71F, 0x8DA2, 0xB720, 0x8DA3, 0xB721, 0x8DA4, 0xB722, 0x8DA5, 0xB723, 0x8DA6, + 0xB724, 0x8DA7, 0xB725, 0x8DA8, 0xB726, 0x8DA9, 0xB727, 0x8DAA, 0xB728, 0xB6DF, 0xB729, 0xB6E0, 0xB72A, 0x8DAB, 0xB72B, 0x8DAC, + 0xB72C, 0xB6E1, 0xB72D, 0x8DAD, 0xB72E, 0x8DAE, 0xB72F, 0xB6E2, 0xB730, 0xB6E3, 0xB731, 0x8DAF, 0xB732, 0x8DB0, 0xB733, 0x8DB1, + 0xB734, 0x8DB2, 0xB735, 0x8DB3, 0xB736, 0x8DB4, 0xB737, 0x8DB5, 0xB738, 0xB6E4, 0xB739, 0xB6E5, 0xB73A, 0x8DB6, 0xB73B, 0xB6E6, + 0xB73C, 0x8DB7, 0xB73D, 0x8DB8, 0xB73E, 0x8DB9, 0xB73F, 0x8DBA, 0xB740, 0x8DBB, 0xB741, 0x8DBC, 0xB742, 0x8DBD, 0xB743, 0x8DBE, + 0xB744, 0xB6E7, 0xB745, 0x8DBF, 0xB746, 0x8DC0, 0xB747, 0x8DC1, 0xB748, 0xB6E8, 0xB749, 0x8DC2, 0xB74A, 0x8DC3, 0xB74B, 0x8DC4, + 0xB74C, 0xB6E9, 0xB74D, 0x8DC5, 0xB74E, 0x8DC6, 0xB74F, 0x8DC7, 0xB750, 0x8DC8, 0xB751, 0x8DC9, 0xB752, 0x8DCA, 0xB753, 0x8DCB, + 0xB754, 0xB6EA, 0xB755, 0xB6EB, 0xB756, 0x8DCC, 0xB757, 0x8DCD, 0xB758, 0x8DCE, 0xB759, 0x8DCF, 0xB75A, 0x8DD0, 0xB75B, 0x8DD1, + 0xB75C, 0x8DD2, 0xB75D, 0x8DD3, 0xB75E, 0x8DD4, 0xB75F, 0x8DD5, 0xB760, 0xB6EC, 0xB761, 0x8DD6, 0xB762, 0x8DD7, 0xB763, 0x8DD8, + 0xB764, 0xB6ED, 0xB765, 0x8DD9, 0xB766, 0x8DDA, 0xB767, 0x8DDB, 0xB768, 0xB6EE, 0xB769, 0x8DDC, 0xB76A, 0x8DDD, 0xB76B, 0x8DDE, + 0xB76C, 0x8DDF, 0xB76D, 0x8DE0, 0xB76E, 0x8DE1, 0xB76F, 0x8DE2, 0xB770, 0xB6EF, 0xB771, 0xB6F0, 0xB772, 0x8DE3, 0xB773, 0xB6F1, + 0xB774, 0x8DE4, 0xB775, 0xB6F2, 0xB776, 0x8DE5, 0xB777, 0x8DE6, 0xB778, 0x8DE7, 0xB779, 0x8DE8, 0xB77A, 0x8DE9, 0xB77B, 0x8DEA, + 0xB77C, 0xB6F3, 0xB77D, 0xB6F4, 0xB77E, 0x8DEB, 0xB77F, 0x8DEC, 0xB780, 0xB6F5, 0xB781, 0x8DED, 0xB782, 0x8DEE, 0xB783, 0x8DEF, + 0xB784, 0xB6F6, 0xB785, 0x8DF0, 0xB786, 0x8DF1, 0xB787, 0x8DF2, 0xB788, 0x8DF3, 0xB789, 0x8DF4, 0xB78A, 0x8DF5, 0xB78B, 0x8DF6, + 0xB78C, 0xB6F7, 0xB78D, 0xB6F8, 0xB78E, 0x8DF7, 0xB78F, 0xB6F9, 0xB790, 0xB6FA, 0xB791, 0xB6FB, 0xB792, 0xB6FC, 0xB793, 0x8DF8, + 0xB794, 0x8DF9, 0xB795, 0x8DFA, 0xB796, 0xB6FD, 0xB797, 0xB6FE, 0xB798, 0xB7A1, 0xB799, 0xB7A2, 0xB79A, 0x8DFB, 0xB79B, 0x8DFC, + 0xB79C, 0xB7A3, 0xB79D, 0x8DFD, 0xB79E, 0x8DFE, 0xB79F, 0x8E41, 0xB7A0, 0xB7A4, 0xB7A1, 0x8E42, 0xB7A2, 0x8E43, 0xB7A3, 0x8E44, + 0xB7A4, 0x8E45, 0xB7A5, 0x8E46, 0xB7A6, 0x8E47, 0xB7A7, 0x8E48, 0xB7A8, 0xB7A5, 0xB7A9, 0xB7A6, 0xB7AA, 0x8E49, 0xB7AB, 0xB7A7, + 0xB7AC, 0xB7A8, 0xB7AD, 0xB7A9, 0xB7AE, 0x8E4A, 0xB7AF, 0x8E4B, 0xB7B0, 0x8E4C, 0xB7B1, 0x8E4D, 0xB7B2, 0x8E4E, 0xB7B3, 0x8E4F, + 0xB7B4, 0xB7AA, 0xB7B5, 0xB7AB, 0xB7B6, 0x8E50, 0xB7B7, 0x8E51, 0xB7B8, 0xB7AC, 0xB7B9, 0x8E52, 0xB7BA, 0x8E53, 0xB7BB, 0x8E54, + 0xB7BC, 0x8E55, 0xB7BD, 0x8E56, 0xB7BE, 0x8E57, 0xB7BF, 0x8E58, 0xB7C0, 0x8E59, 0xB7C1, 0x8E5A, 0xB7C2, 0x8E61, 0xB7C3, 0x8E62, + 0xB7C4, 0x8E63, 0xB7C5, 0x8E64, 0xB7C6, 0x8E65, 0xB7C7, 0xB7AD, 0xB7C8, 0x8E66, 0xB7C9, 0xB7AE, 0xB7CA, 0x8E67, 0xB7CB, 0x8E68, + 0xB7CC, 0x8E69, 0xB7CD, 0x8E6A, 0xB7CE, 0x8E6B, 0xB7CF, 0x8E6C, 0xB7D0, 0x8E6D, 0xB7D1, 0x8E6E, 0xB7D2, 0x8E6F, 0xB7D3, 0x8E70, + 0xB7D4, 0x8E71, 0xB7D5, 0x8E72, 0xB7D6, 0x8E73, 0xB7D7, 0x8E74, 0xB7D8, 0x8E75, 0xB7D9, 0x8E76, 0xB7DA, 0x8E77, 0xB7DB, 0x8E78, + 0xB7DC, 0x8E79, 0xB7DD, 0x8E7A, 0xB7DE, 0x8E81, 0xB7DF, 0x8E82, 0xB7E0, 0x8E83, 0xB7E1, 0x8E84, 0xB7E2, 0x8E85, 0xB7E3, 0x8E86, + 0xB7E4, 0x8E87, 0xB7E5, 0x8E88, 0xB7E6, 0x8E89, 0xB7E7, 0x8E8A, 0xB7E8, 0x8E8B, 0xB7E9, 0x8E8C, 0xB7EA, 0x8E8D, 0xB7EB, 0x8E8E, + 0xB7EC, 0xB7AF, 0xB7ED, 0xB7B0, 0xB7EE, 0x8E8F, 0xB7EF, 0x8E90, 0xB7F0, 0xB7B1, 0xB7F1, 0x8E91, 0xB7F2, 0x8E92, 0xB7F3, 0x8E93, + 0xB7F4, 0xB7B2, 0xB7F5, 0x8E94, 0xB7F6, 0x8E95, 0xB7F7, 0x8E96, 0xB7F8, 0x8E97, 0xB7F9, 0x8E98, 0xB7FA, 0x8E99, 0xB7FB, 0x8E9A, + 0xB7FC, 0xB7B3, 0xB7FD, 0xB7B4, 0xB7FE, 0x8E9B, 0xB7FF, 0xB7B5, 0xB800, 0xB7B6, 0xB801, 0xB7B7, 0xB802, 0x8E9C, 0xB803, 0x8E9D, + 0xB804, 0x8E9E, 0xB805, 0x8E9F, 0xB806, 0x8EA0, 0xB807, 0xB7B8, 0xB808, 0xB7B9, 0xB809, 0xB7BA, 0xB80A, 0x8EA1, 0xB80B, 0x8EA2, + 0xB80C, 0xB7BB, 0xB80D, 0x8EA3, 0xB80E, 0x8EA4, 0xB80F, 0x8EA5, 0xB810, 0xB7BC, 0xB811, 0x8EA6, 0xB812, 0x8EA7, 0xB813, 0x8EA8, + 0xB814, 0x8EA9, 0xB815, 0x8EAA, 0xB816, 0x8EAB, 0xB817, 0x8EAC, 0xB818, 0xB7BD, 0xB819, 0xB7BE, 0xB81A, 0x8EAD, 0xB81B, 0xB7BF, + 0xB81C, 0x8EAE, 0xB81D, 0xB7C0, 0xB81E, 0x8EAF, 0xB81F, 0x8EB0, 0xB820, 0x8EB1, 0xB821, 0x8EB2, 0xB822, 0x8EB3, 0xB823, 0x8EB4, + 0xB824, 0xB7C1, 0xB825, 0xB7C2, 0xB826, 0x8EB5, 0xB827, 0x8EB6, 0xB828, 0xB7C3, 0xB829, 0x8EB7, 0xB82A, 0x8EB8, 0xB82B, 0x8EB9, + 0xB82C, 0xB7C4, 0xB82D, 0x8EBA, 0xB82E, 0x8EBB, 0xB82F, 0x8EBC, 0xB830, 0x8EBD, 0xB831, 0x8EBE, 0xB832, 0x8EBF, 0xB833, 0x8EC0, + 0xB834, 0xB7C5, 0xB835, 0xB7C6, 0xB836, 0x8EC1, 0xB837, 0xB7C7, 0xB838, 0xB7C8, 0xB839, 0xB7C9, 0xB83A, 0x8EC2, 0xB83B, 0x8EC3, + 0xB83C, 0x8EC4, 0xB83D, 0x8EC5, 0xB83E, 0x8EC6, 0xB83F, 0x8EC7, 0xB840, 0xB7CA, 0xB841, 0x8EC8, 0xB842, 0x8EC9, 0xB843, 0x8ECA, + 0xB844, 0xB7CB, 0xB845, 0x8ECB, 0xB846, 0x8ECC, 0xB847, 0x8ECD, 0xB848, 0x8ECE, 0xB849, 0x8ECF, 0xB84A, 0x8ED0, 0xB84B, 0x8ED1, + 0xB84C, 0x8ED2, 0xB84D, 0x8ED3, 0xB84E, 0x8ED4, 0xB84F, 0x8ED5, 0xB850, 0x8ED6, 0xB851, 0xB7CC, 0xB852, 0x8ED7, 0xB853, 0xB7CD, + 0xB854, 0x8ED8, 0xB855, 0x8ED9, 0xB856, 0x8EDA, 0xB857, 0x8EDB, 0xB858, 0x8EDC, 0xB859, 0x8EDD, 0xB85A, 0x8EDE, 0xB85B, 0x8EDF, + 0xB85C, 0xB7CE, 0xB85D, 0xB7CF, 0xB85E, 0x8EE0, 0xB85F, 0x8EE1, 0xB860, 0xB7D0, 0xB861, 0x8EE2, 0xB862, 0x8EE3, 0xB863, 0x8EE4, + 0xB864, 0xB7D1, 0xB865, 0x8EE5, 0xB866, 0x8EE6, 0xB867, 0x8EE7, 0xB868, 0x8EE8, 0xB869, 0x8EE9, 0xB86A, 0x8EEA, 0xB86B, 0x8EEB, + 0xB86C, 0xB7D2, 0xB86D, 0xB7D3, 0xB86E, 0x8EEC, 0xB86F, 0xB7D4, 0xB870, 0x8EED, 0xB871, 0xB7D5, 0xB872, 0x8EEE, 0xB873, 0x8EEF, + 0xB874, 0x8EF0, 0xB875, 0x8EF1, 0xB876, 0x8EF2, 0xB877, 0x8EF3, 0xB878, 0xB7D6, 0xB879, 0x8EF4, 0xB87A, 0x8EF5, 0xB87B, 0x8EF6, + 0xB87C, 0xB7D7, 0xB87D, 0x8EF7, 0xB87E, 0x8EF8, 0xB87F, 0x8EF9, 0xB880, 0x8EFA, 0xB881, 0x8EFB, 0xB882, 0x8EFC, 0xB883, 0x8EFD, + 0xB884, 0x8EFE, 0xB885, 0x8F41, 0xB886, 0x8F42, 0xB887, 0x8F43, 0xB888, 0x8F44, 0xB889, 0x8F45, 0xB88A, 0x8F46, 0xB88B, 0x8F47, + 0xB88C, 0x8F48, 0xB88D, 0xB7D8, 0xB88E, 0x8F49, 0xB88F, 0x8F4A, 0xB890, 0x8F4B, 0xB891, 0x8F4C, 0xB892, 0x8F4D, 0xB893, 0x8F4E, + 0xB894, 0x8F4F, 0xB895, 0x8F50, 0xB896, 0x8F51, 0xB897, 0x8F52, 0xB898, 0x8F53, 0xB899, 0x8F54, 0xB89A, 0x8F55, 0xB89B, 0x8F56, + 0xB89C, 0x8F57, 0xB89D, 0x8F58, 0xB89E, 0x8F59, 0xB89F, 0x8F5A, 0xB8A0, 0x8F61, 0xB8A1, 0x8F62, 0xB8A2, 0x8F63, 0xB8A3, 0x8F64, + 0xB8A4, 0x8F65, 0xB8A5, 0x8F66, 0xB8A6, 0x8F67, 0xB8A7, 0x8F68, 0xB8A8, 0xB7D9, 0xB8A9, 0x8F69, 0xB8AA, 0x8F6A, 0xB8AB, 0x8F6B, + 0xB8AC, 0x8F6C, 0xB8AD, 0x8F6D, 0xB8AE, 0x8F6E, 0xB8AF, 0x8F6F, 0xB8B0, 0xB7DA, 0xB8B1, 0x8F70, 0xB8B2, 0x8F71, 0xB8B3, 0x8F72, + 0xB8B4, 0xB7DB, 0xB8B5, 0x8F73, 0xB8B6, 0x8F74, 0xB8B7, 0x8F75, 0xB8B8, 0xB7DC, 0xB8B9, 0x8F76, 0xB8BA, 0x8F77, 0xB8BB, 0x8F78, + 0xB8BC, 0x8F79, 0xB8BD, 0x8F7A, 0xB8BE, 0x8F81, 0xB8BF, 0x8F82, 0xB8C0, 0xB7DD, 0xB8C1, 0xB7DE, 0xB8C2, 0x8F83, 0xB8C3, 0xB7DF, + 0xB8C4, 0x8F84, 0xB8C5, 0xB7E0, 0xB8C6, 0x8F85, 0xB8C7, 0x8F86, 0xB8C8, 0x8F87, 0xB8C9, 0x8F88, 0xB8CA, 0x8F89, 0xB8CB, 0x8F8A, + 0xB8CC, 0xB7E1, 0xB8CD, 0x8F8B, 0xB8CE, 0x8F8C, 0xB8CF, 0x8F8D, 0xB8D0, 0xB7E2, 0xB8D1, 0x8F8E, 0xB8D2, 0x8F8F, 0xB8D3, 0x8F90, + 0xB8D4, 0xB7E3, 0xB8D5, 0x8F91, 0xB8D6, 0x8F92, 0xB8D7, 0x8F93, 0xB8D8, 0x8F94, 0xB8D9, 0x8F95, 0xB8DA, 0x8F96, 0xB8DB, 0x8F97, + 0xB8DC, 0x8F98, 0xB8DD, 0xB7E4, 0xB8DE, 0x8F99, 0xB8DF, 0xB7E5, 0xB8E0, 0x8F9A, 0xB8E1, 0xB7E6, 0xB8E2, 0x8F9B, 0xB8E3, 0x8F9C, + 0xB8E4, 0x8F9D, 0xB8E5, 0x8F9E, 0xB8E6, 0x8F9F, 0xB8E7, 0x8FA0, 0xB8E8, 0xB7E7, 0xB8E9, 0xB7E8, 0xB8EA, 0x8FA1, 0xB8EB, 0x8FA2, + 0xB8EC, 0xB7E9, 0xB8ED, 0x8FA3, 0xB8EE, 0x8FA4, 0xB8EF, 0x8FA5, 0xB8F0, 0xB7EA, 0xB8F1, 0x8FA6, 0xB8F2, 0x8FA7, 0xB8F3, 0x8FA8, + 0xB8F4, 0x8FA9, 0xB8F5, 0x8FAA, 0xB8F6, 0x8FAB, 0xB8F7, 0x8FAC, 0xB8F8, 0xB7EB, 0xB8F9, 0xB7EC, 0xB8FA, 0x8FAD, 0xB8FB, 0xB7ED, + 0xB8FC, 0x8FAE, 0xB8FD, 0xB7EE, 0xB8FE, 0x8FAF, 0xB8FF, 0x8FB0, 0xB900, 0x8FB1, 0xB901, 0x8FB2, 0xB902, 0x8FB3, 0xB903, 0x8FB4, + 0xB904, 0xB7EF, 0xB905, 0x8FB5, 0xB906, 0x8FB6, 0xB907, 0x8FB7, 0xB908, 0x8FB8, 0xB909, 0x8FB9, 0xB90A, 0x8FBA, 0xB90B, 0x8FBB, + 0xB90C, 0x8FBC, 0xB90D, 0x8FBD, 0xB90E, 0x8FBE, 0xB90F, 0x8FBF, 0xB910, 0x8FC0, 0xB911, 0x8FC1, 0xB912, 0x8FC2, 0xB913, 0x8FC3, + 0xB914, 0x8FC4, 0xB915, 0x8FC5, 0xB916, 0x8FC6, 0xB917, 0x8FC7, 0xB918, 0xB7F0, 0xB919, 0x8FC8, 0xB91A, 0x8FC9, 0xB91B, 0x8FCA, + 0xB91C, 0x8FCB, 0xB91D, 0x8FCC, 0xB91E, 0x8FCD, 0xB91F, 0x8FCE, 0xB920, 0xB7F1, 0xB921, 0x8FCF, 0xB922, 0x8FD0, 0xB923, 0x8FD1, + 0xB924, 0x8FD2, 0xB925, 0x8FD3, 0xB926, 0x8FD4, 0xB927, 0x8FD5, 0xB928, 0x8FD6, 0xB929, 0x8FD7, 0xB92A, 0x8FD8, 0xB92B, 0x8FD9, + 0xB92C, 0x8FDA, 0xB92D, 0x8FDB, 0xB92E, 0x8FDC, 0xB92F, 0x8FDD, 0xB930, 0x8FDE, 0xB931, 0x8FDF, 0xB932, 0x8FE0, 0xB933, 0x8FE1, + 0xB934, 0x8FE2, 0xB935, 0x8FE3, 0xB936, 0x8FE4, 0xB937, 0x8FE5, 0xB938, 0x8FE6, 0xB939, 0x8FE7, 0xB93A, 0x8FE8, 0xB93B, 0x8FE9, + 0xB93C, 0xB7F2, 0xB93D, 0xB7F3, 0xB93E, 0x8FEA, 0xB93F, 0x8FEB, 0xB940, 0xB7F4, 0xB941, 0x8FEC, 0xB942, 0x8FED, 0xB943, 0x8FEE, + 0xB944, 0xB7F5, 0xB945, 0x8FEF, 0xB946, 0x8FF0, 0xB947, 0x8FF1, 0xB948, 0x8FF2, 0xB949, 0x8FF3, 0xB94A, 0x8FF4, 0xB94B, 0x8FF5, + 0xB94C, 0xB7F6, 0xB94D, 0x8FF6, 0xB94E, 0x8FF7, 0xB94F, 0xB7F7, 0xB950, 0x8FF8, 0xB951, 0xB7F8, 0xB952, 0x8FF9, 0xB953, 0x8FFA, + 0xB954, 0x8FFB, 0xB955, 0x8FFC, 0xB956, 0x8FFD, 0xB957, 0x8FFE, 0xB958, 0xB7F9, 0xB959, 0xB7FA, 0xB95A, 0x9041, 0xB95B, 0x9042, + 0xB95C, 0xB7FB, 0xB95D, 0x9043, 0xB95E, 0x9044, 0xB95F, 0x9045, 0xB960, 0xB7FC, 0xB961, 0x9046, 0xB962, 0x9047, 0xB963, 0x9048, + 0xB964, 0x9049, 0xB965, 0x904A, 0xB966, 0x904B, 0xB967, 0x904C, 0xB968, 0xB7FD, 0xB969, 0xB7FE, 0xB96A, 0x904D, 0xB96B, 0xB8A1, + 0xB96C, 0x904E, 0xB96D, 0xB8A2, 0xB96E, 0x904F, 0xB96F, 0x9050, 0xB970, 0x9051, 0xB971, 0x9052, 0xB972, 0x9053, 0xB973, 0x9054, + 0xB974, 0xB8A3, 0xB975, 0xB8A4, 0xB976, 0x9055, 0xB977, 0x9056, 0xB978, 0xB8A5, 0xB979, 0x9057, 0xB97A, 0x9058, 0xB97B, 0x9059, + 0xB97C, 0xB8A6, 0xB97D, 0x905A, 0xB97E, 0x9061, 0xB97F, 0x9062, 0xB980, 0x9063, 0xB981, 0x9064, 0xB982, 0x9065, 0xB983, 0x9066, + 0xB984, 0xB8A7, 0xB985, 0xB8A8, 0xB986, 0x9067, 0xB987, 0xB8A9, 0xB988, 0x9068, 0xB989, 0xB8AA, 0xB98A, 0xB8AB, 0xB98B, 0x9069, + 0xB98C, 0x906A, 0xB98D, 0xB8AC, 0xB98E, 0xB8AD, 0xB98F, 0x906B, 0xB990, 0x906C, 0xB991, 0x906D, 0xB992, 0x906E, 0xB993, 0x906F, + 0xB994, 0x9070, 0xB995, 0x9071, 0xB996, 0x9072, 0xB997, 0x9073, 0xB998, 0x9074, 0xB999, 0x9075, 0xB99A, 0x9076, 0xB99B, 0x9077, + 0xB99C, 0x9078, 0xB99D, 0x9079, 0xB99E, 0x907A, 0xB99F, 0x9081, 0xB9A0, 0x9082, 0xB9A1, 0x9083, 0xB9A2, 0x9084, 0xB9A3, 0x9085, + 0xB9A4, 0x9086, 0xB9A5, 0x9087, 0xB9A6, 0x9088, 0xB9A7, 0x9089, 0xB9A8, 0x908A, 0xB9A9, 0x908B, 0xB9AA, 0x908C, 0xB9AB, 0x908D, + 0xB9AC, 0xB8AE, 0xB9AD, 0xB8AF, 0xB9AE, 0x908E, 0xB9AF, 0x908F, 0xB9B0, 0xB8B0, 0xB9B1, 0x9090, 0xB9B2, 0x9091, 0xB9B3, 0x9092, + 0xB9B4, 0xB8B1, 0xB9B5, 0x9093, 0xB9B6, 0x9094, 0xB9B7, 0x9095, 0xB9B8, 0x9096, 0xB9B9, 0x9097, 0xB9BA, 0x9098, 0xB9BB, 0x9099, + 0xB9BC, 0xB8B2, 0xB9BD, 0xB8B3, 0xB9BE, 0x909A, 0xB9BF, 0xB8B4, 0xB9C0, 0x909B, 0xB9C1, 0xB8B5, 0xB9C2, 0x909C, 0xB9C3, 0x909D, + 0xB9C4, 0x909E, 0xB9C5, 0x909F, 0xB9C6, 0x90A0, 0xB9C7, 0x90A1, 0xB9C8, 0xB8B6, 0xB9C9, 0xB8B7, 0xB9CA, 0x90A2, 0xB9CB, 0x90A3, + 0xB9CC, 0xB8B8, 0xB9CD, 0x90A4, 0xB9CE, 0xB8B9, 0xB9CF, 0xB8BA, 0xB9D0, 0xB8BB, 0xB9D1, 0xB8BC, 0xB9D2, 0xB8BD, 0xB9D3, 0x90A5, + 0xB9D4, 0x90A6, 0xB9D5, 0x90A7, 0xB9D6, 0x90A8, 0xB9D7, 0x90A9, 0xB9D8, 0xB8BE, 0xB9D9, 0xB8BF, 0xB9DA, 0x90AA, 0xB9DB, 0xB8C0, + 0xB9DC, 0x90AB, 0xB9DD, 0xB8C1, 0xB9DE, 0xB8C2, 0xB9DF, 0x90AC, 0xB9E0, 0x90AD, 0xB9E1, 0xB8C3, 0xB9E2, 0x90AE, 0xB9E3, 0xB8C4, + 0xB9E4, 0xB8C5, 0xB9E5, 0xB8C6, 0xB9E6, 0x90AF, 0xB9E7, 0x90B0, 0xB9E8, 0xB8C7, 0xB9E9, 0x90B1, 0xB9EA, 0x90B2, 0xB9EB, 0x90B3, + 0xB9EC, 0xB8C8, 0xB9ED, 0x90B4, 0xB9EE, 0x90B5, 0xB9EF, 0x90B6, 0xB9F0, 0x90B7, 0xB9F1, 0x90B8, 0xB9F2, 0x90B9, 0xB9F3, 0x90BA, + 0xB9F4, 0xB8C9, 0xB9F5, 0xB8CA, 0xB9F6, 0x90BB, 0xB9F7, 0xB8CB, 0xB9F8, 0xB8CC, 0xB9F9, 0xB8CD, 0xB9FA, 0xB8CE, 0xB9FB, 0x90BC, + 0xB9FC, 0x90BD, 0xB9FD, 0x90BE, 0xB9FE, 0x90BF, 0xB9FF, 0x90C0, 0xBA00, 0xB8CF, 0xBA01, 0xB8D0, 0xBA02, 0x90C1, 0xBA03, 0x90C2, + 0xBA04, 0x90C3, 0xBA05, 0x90C4, 0xBA06, 0x90C5, 0xBA07, 0x90C6, 0xBA08, 0xB8D1, 0xBA09, 0x90C7, 0xBA0A, 0x90C8, 0xBA0B, 0x90C9, + 0xBA0C, 0x90CA, 0xBA0D, 0x90CB, 0xBA0E, 0x90CC, 0xBA0F, 0x90CD, 0xBA10, 0x90CE, 0xBA11, 0x90CF, 0xBA12, 0x90D0, 0xBA13, 0x90D1, + 0xBA14, 0x90D2, 0xBA15, 0xB8D2, 0xBA16, 0x90D3, 0xBA17, 0x90D4, 0xBA18, 0x90D5, 0xBA19, 0x90D6, 0xBA1A, 0x90D7, 0xBA1B, 0x90D8, + 0xBA1C, 0x90D9, 0xBA1D, 0x90DA, 0xBA1E, 0x90DB, 0xBA1F, 0x90DC, 0xBA20, 0x90DD, 0xBA21, 0x90DE, 0xBA22, 0x90DF, 0xBA23, 0x90E0, + 0xBA24, 0x90E1, 0xBA25, 0x90E2, 0xBA26, 0x90E3, 0xBA27, 0x90E4, 0xBA28, 0x90E5, 0xBA29, 0x90E6, 0xBA2A, 0x90E7, 0xBA2B, 0x90E8, + 0xBA2C, 0x90E9, 0xBA2D, 0x90EA, 0xBA2E, 0x90EB, 0xBA2F, 0x90EC, 0xBA30, 0x90ED, 0xBA31, 0x90EE, 0xBA32, 0x90EF, 0xBA33, 0x90F0, + 0xBA34, 0x90F1, 0xBA35, 0x90F2, 0xBA36, 0x90F3, 0xBA37, 0x90F4, 0xBA38, 0xB8D3, 0xBA39, 0xB8D4, 0xBA3A, 0x90F5, 0xBA3B, 0x90F6, + 0xBA3C, 0xB8D5, 0xBA3D, 0x90F7, 0xBA3E, 0x90F8, 0xBA3F, 0x90F9, 0xBA40, 0xB8D6, 0xBA41, 0x90FA, 0xBA42, 0xB8D7, 0xBA43, 0x90FB, + 0xBA44, 0x90FC, 0xBA45, 0x90FD, 0xBA46, 0x90FE, 0xBA47, 0x9141, 0xBA48, 0xB8D8, 0xBA49, 0xB8D9, 0xBA4A, 0x9142, 0xBA4B, 0xB8DA, + 0xBA4C, 0x9143, 0xBA4D, 0xB8DB, 0xBA4E, 0xB8DC, 0xBA4F, 0x9144, 0xBA50, 0x9145, 0xBA51, 0x9146, 0xBA52, 0x9147, 0xBA53, 0xB8DD, + 0xBA54, 0xB8DE, 0xBA55, 0xB8DF, 0xBA56, 0x9148, 0xBA57, 0x9149, 0xBA58, 0xB8E0, 0xBA59, 0x914A, 0xBA5A, 0x914B, 0xBA5B, 0x914C, + 0xBA5C, 0xB8E1, 0xBA5D, 0x914D, 0xBA5E, 0x914E, 0xBA5F, 0x914F, 0xBA60, 0x9150, 0xBA61, 0x9151, 0xBA62, 0x9152, 0xBA63, 0x9153, + 0xBA64, 0xB8E2, 0xBA65, 0xB8E3, 0xBA66, 0x9154, 0xBA67, 0xB8E4, 0xBA68, 0xB8E5, 0xBA69, 0xB8E6, 0xBA6A, 0x9155, 0xBA6B, 0x9156, + 0xBA6C, 0x9157, 0xBA6D, 0x9158, 0xBA6E, 0x9159, 0xBA6F, 0x915A, 0xBA70, 0xB8E7, 0xBA71, 0xB8E8, 0xBA72, 0x9161, 0xBA73, 0x9162, + 0xBA74, 0xB8E9, 0xBA75, 0x9163, 0xBA76, 0x9164, 0xBA77, 0x9165, 0xBA78, 0xB8EA, 0xBA79, 0x9166, 0xBA7A, 0x9167, 0xBA7B, 0x9168, + 0xBA7C, 0x9169, 0xBA7D, 0x916A, 0xBA7E, 0x916B, 0xBA7F, 0x916C, 0xBA80, 0x916D, 0xBA81, 0x916E, 0xBA82, 0x916F, 0xBA83, 0xB8EB, + 0xBA84, 0xB8EC, 0xBA85, 0xB8ED, 0xBA86, 0x9170, 0xBA87, 0xB8EE, 0xBA88, 0x9171, 0xBA89, 0x9172, 0xBA8A, 0x9173, 0xBA8B, 0x9174, + 0xBA8C, 0xB8EF, 0xBA8D, 0x9175, 0xBA8E, 0x9176, 0xBA8F, 0x9177, 0xBA90, 0x9178, 0xBA91, 0x9179, 0xBA92, 0x917A, 0xBA93, 0x9181, + 0xBA94, 0x9182, 0xBA95, 0x9183, 0xBA96, 0x9184, 0xBA97, 0x9185, 0xBA98, 0x9186, 0xBA99, 0x9187, 0xBA9A, 0x9188, 0xBA9B, 0x9189, + 0xBA9C, 0x918A, 0xBA9D, 0x918B, 0xBA9E, 0x918C, 0xBA9F, 0x918D, 0xBAA0, 0x918E, 0xBAA1, 0x918F, 0xBAA2, 0x9190, 0xBAA3, 0x9191, + 0xBAA4, 0x9192, 0xBAA5, 0x9193, 0xBAA6, 0x9194, 0xBAA7, 0x9195, 0xBAA8, 0xB8F0, 0xBAA9, 0xB8F1, 0xBAAA, 0x9196, 0xBAAB, 0xB8F2, + 0xBAAC, 0xB8F3, 0xBAAD, 0x9197, 0xBAAE, 0x9198, 0xBAAF, 0x9199, 0xBAB0, 0xB8F4, 0xBAB1, 0x919A, 0xBAB2, 0xB8F5, 0xBAB3, 0x919B, + 0xBAB4, 0x919C, 0xBAB5, 0x919D, 0xBAB6, 0x919E, 0xBAB7, 0x919F, 0xBAB8, 0xB8F6, 0xBAB9, 0xB8F7, 0xBABA, 0x91A0, 0xBABB, 0xB8F8, + 0xBABC, 0x91A1, 0xBABD, 0xB8F9, 0xBABE, 0x91A2, 0xBABF, 0x91A3, 0xBAC0, 0x91A4, 0xBAC1, 0x91A5, 0xBAC2, 0x91A6, 0xBAC3, 0x91A7, + 0xBAC4, 0xB8FA, 0xBAC5, 0x91A8, 0xBAC6, 0x91A9, 0xBAC7, 0x91AA, 0xBAC8, 0xB8FB, 0xBAC9, 0x91AB, 0xBACA, 0x91AC, 0xBACB, 0x91AD, + 0xBACC, 0x91AE, 0xBACD, 0x91AF, 0xBACE, 0x91B0, 0xBACF, 0x91B1, 0xBAD0, 0x91B2, 0xBAD1, 0x91B3, 0xBAD2, 0x91B4, 0xBAD3, 0x91B5, + 0xBAD4, 0x91B6, 0xBAD5, 0x91B7, 0xBAD6, 0x91B8, 0xBAD7, 0x91B9, 0xBAD8, 0xB8FC, 0xBAD9, 0xB8FD, 0xBADA, 0x91BA, 0xBADB, 0x91BB, + 0xBADC, 0x91BC, 0xBADD, 0x91BD, 0xBADE, 0x91BE, 0xBADF, 0x91BF, 0xBAE0, 0x91C0, 0xBAE1, 0x91C1, 0xBAE2, 0x91C2, 0xBAE3, 0x91C3, + 0xBAE4, 0x91C4, 0xBAE5, 0x91C5, 0xBAE6, 0x91C6, 0xBAE7, 0x91C7, 0xBAE8, 0x91C8, 0xBAE9, 0x91C9, 0xBAEA, 0x91CA, 0xBAEB, 0x91CB, + 0xBAEC, 0x91CC, 0xBAED, 0x91CD, 0xBAEE, 0x91CE, 0xBAEF, 0x91CF, 0xBAF0, 0x91D0, 0xBAF1, 0x91D1, 0xBAF2, 0x91D2, 0xBAF3, 0x91D3, + 0xBAF4, 0x91D4, 0xBAF5, 0x91D5, 0xBAF6, 0x91D6, 0xBAF7, 0x91D7, 0xBAF8, 0x91D8, 0xBAF9, 0x91D9, 0xBAFA, 0x91DA, 0xBAFB, 0x91DB, + 0xBAFC, 0xB8FE, 0xBAFD, 0x91DC, 0xBAFE, 0x91DD, 0xBAFF, 0x91DE, 0xBB00, 0xB9A1, 0xBB01, 0x91DF, 0xBB02, 0x91E0, 0xBB03, 0x91E1, + 0xBB04, 0xB9A2, 0xBB05, 0x91E2, 0xBB06, 0x91E3, 0xBB07, 0x91E4, 0xBB08, 0x91E5, 0xBB09, 0x91E6, 0xBB0A, 0x91E7, 0xBB0B, 0x91E8, + 0xBB0C, 0x91E9, 0xBB0D, 0xB9A3, 0xBB0E, 0x91EA, 0xBB0F, 0xB9A4, 0xBB10, 0x91EB, 0xBB11, 0xB9A5, 0xBB12, 0x91EC, 0xBB13, 0x91ED, + 0xBB14, 0x91EE, 0xBB15, 0x91EF, 0xBB16, 0x91F0, 0xBB17, 0x91F1, 0xBB18, 0xB9A6, 0xBB19, 0x91F2, 0xBB1A, 0x91F3, 0xBB1B, 0x91F4, + 0xBB1C, 0xB9A7, 0xBB1D, 0x91F5, 0xBB1E, 0x91F6, 0xBB1F, 0x91F7, 0xBB20, 0xB9A8, 0xBB21, 0x91F8, 0xBB22, 0x91F9, 0xBB23, 0x91FA, + 0xBB24, 0x91FB, 0xBB25, 0x91FC, 0xBB26, 0x91FD, 0xBB27, 0x91FE, 0xBB28, 0x9241, 0xBB29, 0xB9A9, 0xBB2A, 0x9242, 0xBB2B, 0xB9AA, + 0xBB2C, 0x9243, 0xBB2D, 0x9244, 0xBB2E, 0x9245, 0xBB2F, 0x9246, 0xBB30, 0x9247, 0xBB31, 0x9248, 0xBB32, 0x9249, 0xBB33, 0x924A, + 0xBB34, 0xB9AB, 0xBB35, 0xB9AC, 0xBB36, 0xB9AD, 0xBB37, 0x924B, 0xBB38, 0xB9AE, 0xBB39, 0x924C, 0xBB3A, 0x924D, 0xBB3B, 0xB9AF, + 0xBB3C, 0xB9B0, 0xBB3D, 0xB9B1, 0xBB3E, 0xB9B2, 0xBB3F, 0x924E, 0xBB40, 0x924F, 0xBB41, 0x9250, 0xBB42, 0x9251, 0xBB43, 0x9252, + 0xBB44, 0xB9B3, 0xBB45, 0xB9B4, 0xBB46, 0x9253, 0xBB47, 0xB9B5, 0xBB48, 0x9254, 0xBB49, 0xB9B6, 0xBB4A, 0x9255, 0xBB4B, 0x9256, + 0xBB4C, 0x9257, 0xBB4D, 0xB9B7, 0xBB4E, 0x9258, 0xBB4F, 0xB9B8, 0xBB50, 0xB9B9, 0xBB51, 0x9259, 0xBB52, 0x925A, 0xBB53, 0x9261, + 0xBB54, 0xB9BA, 0xBB55, 0x9262, 0xBB56, 0x9263, 0xBB57, 0x9264, 0xBB58, 0xB9BB, 0xBB59, 0x9265, 0xBB5A, 0x9266, 0xBB5B, 0x9267, + 0xBB5C, 0x9268, 0xBB5D, 0x9269, 0xBB5E, 0x926A, 0xBB5F, 0x926B, 0xBB60, 0x926C, 0xBB61, 0xB9BC, 0xBB62, 0x926D, 0xBB63, 0xB9BD, + 0xBB64, 0x926E, 0xBB65, 0x926F, 0xBB66, 0x9270, 0xBB67, 0x9271, 0xBB68, 0x9272, 0xBB69, 0x9273, 0xBB6A, 0x9274, 0xBB6B, 0x9275, + 0xBB6C, 0xB9BE, 0xBB6D, 0x9276, 0xBB6E, 0x9277, 0xBB6F, 0x9278, 0xBB70, 0x9279, 0xBB71, 0x927A, 0xBB72, 0x9281, 0xBB73, 0x9282, + 0xBB74, 0x9283, 0xBB75, 0x9284, 0xBB76, 0x9285, 0xBB77, 0x9286, 0xBB78, 0x9287, 0xBB79, 0x9288, 0xBB7A, 0x9289, 0xBB7B, 0x928A, + 0xBB7C, 0x928B, 0xBB7D, 0x928C, 0xBB7E, 0x928D, 0xBB7F, 0x928E, 0xBB80, 0x928F, 0xBB81, 0x9290, 0xBB82, 0x9291, 0xBB83, 0x9292, + 0xBB84, 0x9293, 0xBB85, 0x9294, 0xBB86, 0x9295, 0xBB87, 0x9296, 0xBB88, 0xB9BF, 0xBB89, 0x9297, 0xBB8A, 0x9298, 0xBB8B, 0x9299, + 0xBB8C, 0xB9C0, 0xBB8D, 0x929A, 0xBB8E, 0x929B, 0xBB8F, 0x929C, 0xBB90, 0xB9C1, 0xBB91, 0x929D, 0xBB92, 0x929E, 0xBB93, 0x929F, + 0xBB94, 0x92A0, 0xBB95, 0x92A1, 0xBB96, 0x92A2, 0xBB97, 0x92A3, 0xBB98, 0x92A4, 0xBB99, 0x92A5, 0xBB9A, 0x92A6, 0xBB9B, 0x92A7, + 0xBB9C, 0x92A8, 0xBB9D, 0x92A9, 0xBB9E, 0x92AA, 0xBB9F, 0x92AB, 0xBBA0, 0x92AC, 0xBBA1, 0x92AD, 0xBBA2, 0x92AE, 0xBBA3, 0x92AF, + 0xBBA4, 0xB9C2, 0xBBA5, 0x92B0, 0xBBA6, 0x92B1, 0xBBA7, 0x92B2, 0xBBA8, 0xB9C3, 0xBBA9, 0x92B3, 0xBBAA, 0x92B4, 0xBBAB, 0x92B5, + 0xBBAC, 0xB9C4, 0xBBAD, 0x92B6, 0xBBAE, 0x92B7, 0xBBAF, 0x92B8, 0xBBB0, 0x92B9, 0xBBB1, 0x92BA, 0xBBB2, 0x92BB, 0xBBB3, 0x92BC, + 0xBBB4, 0xB9C5, 0xBBB5, 0x92BD, 0xBBB6, 0x92BE, 0xBBB7, 0xB9C6, 0xBBB8, 0x92BF, 0xBBB9, 0x92C0, 0xBBBA, 0x92C1, 0xBBBB, 0x92C2, + 0xBBBC, 0x92C3, 0xBBBD, 0x92C4, 0xBBBE, 0x92C5, 0xBBBF, 0x92C6, 0xBBC0, 0xB9C7, 0xBBC1, 0x92C7, 0xBBC2, 0x92C8, 0xBBC3, 0x92C9, + 0xBBC4, 0xB9C8, 0xBBC5, 0x92CA, 0xBBC6, 0x92CB, 0xBBC7, 0x92CC, 0xBBC8, 0xB9C9, 0xBBC9, 0x92CD, 0xBBCA, 0x92CE, 0xBBCB, 0x92CF, + 0xBBCC, 0x92D0, 0xBBCD, 0x92D1, 0xBBCE, 0x92D2, 0xBBCF, 0x92D3, 0xBBD0, 0xB9CA, 0xBBD1, 0x92D4, 0xBBD2, 0x92D5, 0xBBD3, 0xB9CB, + 0xBBD4, 0x92D6, 0xBBD5, 0x92D7, 0xBBD6, 0x92D8, 0xBBD7, 0x92D9, 0xBBD8, 0x92DA, 0xBBD9, 0x92DB, 0xBBDA, 0x92DC, 0xBBDB, 0x92DD, + 0xBBDC, 0x92DE, 0xBBDD, 0x92DF, 0xBBDE, 0x92E0, 0xBBDF, 0x92E1, 0xBBE0, 0x92E2, 0xBBE1, 0x92E3, 0xBBE2, 0x92E4, 0xBBE3, 0x92E5, + 0xBBE4, 0x92E6, 0xBBE5, 0x92E7, 0xBBE6, 0x92E8, 0xBBE7, 0x92E9, 0xBBE8, 0x92EA, 0xBBE9, 0x92EB, 0xBBEA, 0x92EC, 0xBBEB, 0x92ED, + 0xBBEC, 0x92EE, 0xBBED, 0x92EF, 0xBBEE, 0x92F0, 0xBBEF, 0x92F1, 0xBBF0, 0x92F2, 0xBBF1, 0x92F3, 0xBBF2, 0x92F4, 0xBBF3, 0x92F5, + 0xBBF4, 0x92F6, 0xBBF5, 0x92F7, 0xBBF6, 0x92F8, 0xBBF7, 0x92F9, 0xBBF8, 0xB9CC, 0xBBF9, 0xB9CD, 0xBBFA, 0x92FA, 0xBBFB, 0x92FB, + 0xBBFC, 0xB9CE, 0xBBFD, 0x92FC, 0xBBFE, 0x92FD, 0xBBFF, 0xB9CF, 0xBC00, 0xB9D0, 0xBC01, 0x92FE, 0xBC02, 0xB9D1, 0xBC03, 0x9341, + 0xBC04, 0x9342, 0xBC05, 0x9343, 0xBC06, 0x9344, 0xBC07, 0x9345, 0xBC08, 0xB9D2, 0xBC09, 0xB9D3, 0xBC0A, 0x9346, 0xBC0B, 0xB9D4, + 0xBC0C, 0xB9D5, 0xBC0D, 0xB9D6, 0xBC0E, 0x9347, 0xBC0F, 0xB9D7, 0xBC10, 0x9348, 0xBC11, 0xB9D8, 0xBC12, 0x9349, 0xBC13, 0x934A, + 0xBC14, 0xB9D9, 0xBC15, 0xB9DA, 0xBC16, 0xB9DB, 0xBC17, 0xB9DC, 0xBC18, 0xB9DD, 0xBC19, 0x934B, 0xBC1A, 0x934C, 0xBC1B, 0xB9DE, + 0xBC1C, 0xB9DF, 0xBC1D, 0xB9E0, 0xBC1E, 0xB9E1, 0xBC1F, 0xB9E2, 0xBC20, 0x934D, 0xBC21, 0x934E, 0xBC22, 0x934F, 0xBC23, 0x9350, + 0xBC24, 0xB9E3, 0xBC25, 0xB9E4, 0xBC26, 0x9351, 0xBC27, 0xB9E5, 0xBC28, 0x9352, 0xBC29, 0xB9E6, 0xBC2A, 0x9353, 0xBC2B, 0x9354, + 0xBC2C, 0x9355, 0xBC2D, 0xB9E7, 0xBC2E, 0x9356, 0xBC2F, 0x9357, 0xBC30, 0xB9E8, 0xBC31, 0xB9E9, 0xBC32, 0x9358, 0xBC33, 0x9359, + 0xBC34, 0xB9EA, 0xBC35, 0x935A, 0xBC36, 0x9361, 0xBC37, 0x9362, 0xBC38, 0xB9EB, 0xBC39, 0x9363, 0xBC3A, 0x9364, 0xBC3B, 0x9365, + 0xBC3C, 0x9366, 0xBC3D, 0x9367, 0xBC3E, 0x9368, 0xBC3F, 0x9369, 0xBC40, 0xB9EC, 0xBC41, 0xB9ED, 0xBC42, 0x936A, 0xBC43, 0xB9EE, + 0xBC44, 0xB9EF, 0xBC45, 0xB9F0, 0xBC46, 0x936B, 0xBC47, 0x936C, 0xBC48, 0x936D, 0xBC49, 0xB9F1, 0xBC4A, 0x936E, 0xBC4B, 0x936F, + 0xBC4C, 0xB9F2, 0xBC4D, 0xB9F3, 0xBC4E, 0x9370, 0xBC4F, 0x9371, 0xBC50, 0xB9F4, 0xBC51, 0x9372, 0xBC52, 0x9373, 0xBC53, 0x9374, + 0xBC54, 0x9375, 0xBC55, 0x9376, 0xBC56, 0x9377, 0xBC57, 0x9378, 0xBC58, 0x9379, 0xBC59, 0x937A, 0xBC5A, 0x9381, 0xBC5B, 0x9382, + 0xBC5C, 0x9383, 0xBC5D, 0xB9F5, 0xBC5E, 0x9384, 0xBC5F, 0x9385, 0xBC60, 0x9386, 0xBC61, 0x9387, 0xBC62, 0x9388, 0xBC63, 0x9389, + 0xBC64, 0x938A, 0xBC65, 0x938B, 0xBC66, 0x938C, 0xBC67, 0x938D, 0xBC68, 0x938E, 0xBC69, 0x938F, 0xBC6A, 0x9390, 0xBC6B, 0x9391, + 0xBC6C, 0x9392, 0xBC6D, 0x9393, 0xBC6E, 0x9394, 0xBC6F, 0x9395, 0xBC70, 0x9396, 0xBC71, 0x9397, 0xBC72, 0x9398, 0xBC73, 0x9399, + 0xBC74, 0x939A, 0xBC75, 0x939B, 0xBC76, 0x939C, 0xBC77, 0x939D, 0xBC78, 0x939E, 0xBC79, 0x939F, 0xBC7A, 0x93A0, 0xBC7B, 0x93A1, + 0xBC7C, 0x93A2, 0xBC7D, 0x93A3, 0xBC7E, 0x93A4, 0xBC7F, 0x93A5, 0xBC80, 0x93A6, 0xBC81, 0x93A7, 0xBC82, 0x93A8, 0xBC83, 0x93A9, + 0xBC84, 0xB9F6, 0xBC85, 0xB9F7, 0xBC86, 0x93AA, 0xBC87, 0x93AB, 0xBC88, 0xB9F8, 0xBC89, 0x93AC, 0xBC8A, 0x93AD, 0xBC8B, 0xB9F9, + 0xBC8C, 0xB9FA, 0xBC8D, 0x93AE, 0xBC8E, 0xB9FB, 0xBC8F, 0x93AF, 0xBC90, 0x93B0, 0xBC91, 0x93B1, 0xBC92, 0x93B2, 0xBC93, 0x93B3, + 0xBC94, 0xB9FC, 0xBC95, 0xB9FD, 0xBC96, 0x93B4, 0xBC97, 0xB9FE, 0xBC98, 0x93B5, 0xBC99, 0xBAA1, 0xBC9A, 0xBAA2, 0xBC9B, 0x93B6, + 0xBC9C, 0x93B7, 0xBC9D, 0x93B8, 0xBC9E, 0x93B9, 0xBC9F, 0x93BA, 0xBCA0, 0xBAA3, 0xBCA1, 0xBAA4, 0xBCA2, 0x93BB, 0xBCA3, 0x93BC, + 0xBCA4, 0xBAA5, 0xBCA5, 0x93BD, 0xBCA6, 0x93BE, 0xBCA7, 0xBAA6, 0xBCA8, 0xBAA7, 0xBCA9, 0x93BF, 0xBCAA, 0x93C0, 0xBCAB, 0x93C1, + 0xBCAC, 0x93C2, 0xBCAD, 0x93C3, 0xBCAE, 0x93C4, 0xBCAF, 0x93C5, 0xBCB0, 0xBAA8, 0xBCB1, 0xBAA9, 0xBCB2, 0x93C6, 0xBCB3, 0xBAAA, + 0xBCB4, 0xBAAB, 0xBCB5, 0xBAAC, 0xBCB6, 0x93C7, 0xBCB7, 0x93C8, 0xBCB8, 0x93C9, 0xBCB9, 0x93CA, 0xBCBA, 0x93CB, 0xBCBB, 0x93CC, + 0xBCBC, 0xBAAD, 0xBCBD, 0xBAAE, 0xBCBE, 0x93CD, 0xBCBF, 0x93CE, 0xBCC0, 0xBAAF, 0xBCC1, 0x93CF, 0xBCC2, 0x93D0, 0xBCC3, 0x93D1, + 0xBCC4, 0xBAB0, 0xBCC5, 0x93D2, 0xBCC6, 0x93D3, 0xBCC7, 0x93D4, 0xBCC8, 0x93D5, 0xBCC9, 0x93D6, 0xBCCA, 0x93D7, 0xBCCB, 0x93D8, + 0xBCCC, 0x93D9, 0xBCCD, 0xBAB1, 0xBCCE, 0x93DA, 0xBCCF, 0xBAB2, 0xBCD0, 0xBAB3, 0xBCD1, 0xBAB4, 0xBCD2, 0x93DB, 0xBCD3, 0x93DC, + 0xBCD4, 0x93DD, 0xBCD5, 0xBAB5, 0xBCD6, 0x93DE, 0xBCD7, 0x93DF, 0xBCD8, 0xBAB6, 0xBCD9, 0x93E0, 0xBCDA, 0x93E1, 0xBCDB, 0x93E2, + 0xBCDC, 0xBAB7, 0xBCDD, 0x93E3, 0xBCDE, 0x93E4, 0xBCDF, 0x93E5, 0xBCE0, 0x93E6, 0xBCE1, 0x93E7, 0xBCE2, 0x93E8, 0xBCE3, 0x93E9, + 0xBCE4, 0x93EA, 0xBCE5, 0x93EB, 0xBCE6, 0x93EC, 0xBCE7, 0x93ED, 0xBCE8, 0x93EE, 0xBCE9, 0x93EF, 0xBCEA, 0x93F0, 0xBCEB, 0x93F1, + 0xBCEC, 0x93F2, 0xBCED, 0x93F3, 0xBCEE, 0x93F4, 0xBCEF, 0x93F5, 0xBCF0, 0x93F6, 0xBCF1, 0x93F7, 0xBCF2, 0x93F8, 0xBCF3, 0x93F9, + 0xBCF4, 0xBAB8, 0xBCF5, 0xBAB9, 0xBCF6, 0xBABA, 0xBCF7, 0x93FA, 0xBCF8, 0xBABB, 0xBCF9, 0x93FB, 0xBCFA, 0x93FC, 0xBCFB, 0x93FD, + 0xBCFC, 0xBABC, 0xBCFD, 0x93FE, 0xBCFE, 0x9441, 0xBCFF, 0x9442, 0xBD00, 0x9443, 0xBD01, 0x9444, 0xBD02, 0x9445, 0xBD03, 0x9446, + 0xBD04, 0xBABD, 0xBD05, 0xBABE, 0xBD06, 0x9447, 0xBD07, 0xBABF, 0xBD08, 0x9448, 0xBD09, 0xBAC0, 0xBD0A, 0x9449, 0xBD0B, 0x944A, + 0xBD0C, 0x944B, 0xBD0D, 0x944C, 0xBD0E, 0x944D, 0xBD0F, 0x944E, 0xBD10, 0xBAC1, 0xBD11, 0x944F, 0xBD12, 0x9450, 0xBD13, 0x9451, + 0xBD14, 0xBAC2, 0xBD15, 0x9452, 0xBD16, 0x9453, 0xBD17, 0x9454, 0xBD18, 0x9455, 0xBD19, 0x9456, 0xBD1A, 0x9457, 0xBD1B, 0x9458, + 0xBD1C, 0x9459, 0xBD1D, 0x945A, 0xBD1E, 0x9461, 0xBD1F, 0x9462, 0xBD20, 0x9463, 0xBD21, 0x9464, 0xBD22, 0x9465, 0xBD23, 0x9466, + 0xBD24, 0xBAC3, 0xBD25, 0x9467, 0xBD26, 0x9468, 0xBD27, 0x9469, 0xBD28, 0x946A, 0xBD29, 0x946B, 0xBD2A, 0x946C, 0xBD2B, 0x946D, + 0xBD2C, 0xBAC4, 0xBD2D, 0x946E, 0xBD2E, 0x946F, 0xBD2F, 0x9470, 0xBD30, 0x9471, 0xBD31, 0x9472, 0xBD32, 0x9473, 0xBD33, 0x9474, + 0xBD34, 0x9475, 0xBD35, 0x9476, 0xBD36, 0x9477, 0xBD37, 0x9478, 0xBD38, 0x9479, 0xBD39, 0x947A, 0xBD3A, 0x9481, 0xBD3B, 0x9482, + 0xBD3C, 0x9483, 0xBD3D, 0x9484, 0xBD3E, 0x9485, 0xBD3F, 0x9486, 0xBD40, 0xBAC5, 0xBD41, 0x9487, 0xBD42, 0x9488, 0xBD43, 0x9489, + 0xBD44, 0x948A, 0xBD45, 0x948B, 0xBD46, 0x948C, 0xBD47, 0x948D, 0xBD48, 0xBAC6, 0xBD49, 0xBAC7, 0xBD4A, 0x948E, 0xBD4B, 0x948F, + 0xBD4C, 0xBAC8, 0xBD4D, 0x9490, 0xBD4E, 0x9491, 0xBD4F, 0x9492, 0xBD50, 0xBAC9, 0xBD51, 0x9493, 0xBD52, 0x9494, 0xBD53, 0x9495, + 0xBD54, 0x9496, 0xBD55, 0x9497, 0xBD56, 0x9498, 0xBD57, 0x9499, 0xBD58, 0xBACA, 0xBD59, 0xBACB, 0xBD5A, 0x949A, 0xBD5B, 0x949B, + 0xBD5C, 0x949C, 0xBD5D, 0x949D, 0xBD5E, 0x949E, 0xBD5F, 0x949F, 0xBD60, 0x94A0, 0xBD61, 0x94A1, 0xBD62, 0x94A2, 0xBD63, 0x94A3, + 0xBD64, 0xBACC, 0xBD65, 0x94A4, 0xBD66, 0x94A5, 0xBD67, 0x94A6, 0xBD68, 0xBACD, 0xBD69, 0x94A7, 0xBD6A, 0x94A8, 0xBD6B, 0x94A9, + 0xBD6C, 0x94AA, 0xBD6D, 0x94AB, 0xBD6E, 0x94AC, 0xBD6F, 0x94AD, 0xBD70, 0x94AE, 0xBD71, 0x94AF, 0xBD72, 0x94B0, 0xBD73, 0x94B1, + 0xBD74, 0x94B2, 0xBD75, 0x94B3, 0xBD76, 0x94B4, 0xBD77, 0x94B5, 0xBD78, 0x94B6, 0xBD79, 0x94B7, 0xBD7A, 0x94B8, 0xBD7B, 0x94B9, + 0xBD7C, 0x94BA, 0xBD7D, 0x94BB, 0xBD7E, 0x94BC, 0xBD7F, 0x94BD, 0xBD80, 0xBACE, 0xBD81, 0xBACF, 0xBD82, 0x94BE, 0xBD83, 0x94BF, + 0xBD84, 0xBAD0, 0xBD85, 0x94C0, 0xBD86, 0x94C1, 0xBD87, 0xBAD1, 0xBD88, 0xBAD2, 0xBD89, 0xBAD3, 0xBD8A, 0xBAD4, 0xBD8B, 0x94C2, + 0xBD8C, 0x94C3, 0xBD8D, 0x94C4, 0xBD8E, 0x94C5, 0xBD8F, 0x94C6, 0xBD90, 0xBAD5, 0xBD91, 0xBAD6, 0xBD92, 0x94C7, 0xBD93, 0xBAD7, + 0xBD94, 0x94C8, 0xBD95, 0xBAD8, 0xBD96, 0x94C9, 0xBD97, 0x94CA, 0xBD98, 0x94CB, 0xBD99, 0xBAD9, 0xBD9A, 0xBADA, 0xBD9B, 0x94CC, + 0xBD9C, 0xBADB, 0xBD9D, 0x94CD, 0xBD9E, 0x94CE, 0xBD9F, 0x94CF, 0xBDA0, 0x94D0, 0xBDA1, 0x94D1, 0xBDA2, 0x94D2, 0xBDA3, 0x94D3, + 0xBDA4, 0xBADC, 0xBDA5, 0x94D4, 0xBDA6, 0x94D5, 0xBDA7, 0x94D6, 0xBDA8, 0x94D7, 0xBDA9, 0x94D8, 0xBDAA, 0x94D9, 0xBDAB, 0x94DA, + 0xBDAC, 0x94DB, 0xBDAD, 0x94DC, 0xBDAE, 0x94DD, 0xBDAF, 0x94DE, 0xBDB0, 0xBADD, 0xBDB1, 0x94DF, 0xBDB2, 0x94E0, 0xBDB3, 0x94E1, + 0xBDB4, 0x94E2, 0xBDB5, 0x94E3, 0xBDB6, 0x94E4, 0xBDB7, 0x94E5, 0xBDB8, 0xBADE, 0xBDB9, 0x94E6, 0xBDBA, 0x94E7, 0xBDBB, 0x94E8, + 0xBDBC, 0x94E9, 0xBDBD, 0x94EA, 0xBDBE, 0x94EB, 0xBDBF, 0x94EC, 0xBDC0, 0x94ED, 0xBDC1, 0x94EE, 0xBDC2, 0x94EF, 0xBDC3, 0x94F0, + 0xBDC4, 0x94F1, 0xBDC5, 0x94F2, 0xBDC6, 0x94F3, 0xBDC7, 0x94F4, 0xBDC8, 0x94F5, 0xBDC9, 0x94F6, 0xBDCA, 0x94F7, 0xBDCB, 0x94F8, + 0xBDCC, 0x94F9, 0xBDCD, 0x94FA, 0xBDCE, 0x94FB, 0xBDCF, 0x94FC, 0xBDD0, 0x94FD, 0xBDD1, 0x94FE, 0xBDD2, 0x9541, 0xBDD3, 0x9542, + 0xBDD4, 0xBADF, 0xBDD5, 0xBAE0, 0xBDD6, 0x9543, 0xBDD7, 0x9544, 0xBDD8, 0xBAE1, 0xBDD9, 0x9545, 0xBDDA, 0x9546, 0xBDDB, 0x9547, + 0xBDDC, 0xBAE2, 0xBDDD, 0x9548, 0xBDDE, 0x9549, 0xBDDF, 0x954A, 0xBDE0, 0x954B, 0xBDE1, 0x954C, 0xBDE2, 0x954D, 0xBDE3, 0x954E, + 0xBDE4, 0x954F, 0xBDE5, 0x9550, 0xBDE6, 0x9551, 0xBDE7, 0x9552, 0xBDE8, 0x9553, 0xBDE9, 0xBAE3, 0xBDEA, 0x9554, 0xBDEB, 0x9555, + 0xBDEC, 0x9556, 0xBDED, 0x9557, 0xBDEE, 0x9558, 0xBDEF, 0x9559, 0xBDF0, 0xBAE4, 0xBDF1, 0x955A, 0xBDF2, 0x9561, 0xBDF3, 0x9562, + 0xBDF4, 0xBAE5, 0xBDF5, 0x9563, 0xBDF6, 0x9564, 0xBDF7, 0x9565, 0xBDF8, 0xBAE6, 0xBDF9, 0x9566, 0xBDFA, 0x9567, 0xBDFB, 0x9568, + 0xBDFC, 0x9569, 0xBDFD, 0x956A, 0xBDFE, 0x956B, 0xBDFF, 0x956C, 0xBE00, 0xBAE7, 0xBE01, 0x956D, 0xBE02, 0x956E, 0xBE03, 0xBAE8, + 0xBE04, 0x956F, 0xBE05, 0xBAE9, 0xBE06, 0x9570, 0xBE07, 0x9571, 0xBE08, 0x9572, 0xBE09, 0x9573, 0xBE0A, 0x9574, 0xBE0B, 0x9575, + 0xBE0C, 0xBAEA, 0xBE0D, 0xBAEB, 0xBE0E, 0x9576, 0xBE0F, 0x9577, 0xBE10, 0xBAEC, 0xBE11, 0x9578, 0xBE12, 0x9579, 0xBE13, 0x957A, + 0xBE14, 0xBAED, 0xBE15, 0x9581, 0xBE16, 0x9582, 0xBE17, 0x9583, 0xBE18, 0x9584, 0xBE19, 0x9585, 0xBE1A, 0x9586, 0xBE1B, 0x9587, + 0xBE1C, 0xBAEE, 0xBE1D, 0xBAEF, 0xBE1E, 0x9588, 0xBE1F, 0xBAF0, 0xBE20, 0x9589, 0xBE21, 0x958A, 0xBE22, 0x958B, 0xBE23, 0x958C, + 0xBE24, 0x958D, 0xBE25, 0x958E, 0xBE26, 0x958F, 0xBE27, 0x9590, 0xBE28, 0x9591, 0xBE29, 0x9592, 0xBE2A, 0x9593, 0xBE2B, 0x9594, + 0xBE2C, 0x9595, 0xBE2D, 0x9596, 0xBE2E, 0x9597, 0xBE2F, 0x9598, 0xBE30, 0x9599, 0xBE31, 0x959A, 0xBE32, 0x959B, 0xBE33, 0x959C, + 0xBE34, 0x959D, 0xBE35, 0x959E, 0xBE36, 0x959F, 0xBE37, 0x95A0, 0xBE38, 0x95A1, 0xBE39, 0x95A2, 0xBE3A, 0x95A3, 0xBE3B, 0x95A4, + 0xBE3C, 0x95A5, 0xBE3D, 0x95A6, 0xBE3E, 0x95A7, 0xBE3F, 0x95A8, 0xBE40, 0x95A9, 0xBE41, 0x95AA, 0xBE42, 0x95AB, 0xBE43, 0x95AC, + 0xBE44, 0xBAF1, 0xBE45, 0xBAF2, 0xBE46, 0x95AD, 0xBE47, 0x95AE, 0xBE48, 0xBAF3, 0xBE49, 0x95AF, 0xBE4A, 0x95B0, 0xBE4B, 0x95B1, + 0xBE4C, 0xBAF4, 0xBE4D, 0x95B2, 0xBE4E, 0xBAF5, 0xBE4F, 0x95B3, 0xBE50, 0x95B4, 0xBE51, 0x95B5, 0xBE52, 0x95B6, 0xBE53, 0x95B7, + 0xBE54, 0xBAF6, 0xBE55, 0xBAF7, 0xBE56, 0x95B8, 0xBE57, 0xBAF8, 0xBE58, 0x95B9, 0xBE59, 0xBAF9, 0xBE5A, 0xBAFA, 0xBE5B, 0xBAFB, + 0xBE5C, 0x95BA, 0xBE5D, 0x95BB, 0xBE5E, 0x95BC, 0xBE5F, 0x95BD, 0xBE60, 0xBAFC, 0xBE61, 0xBAFD, 0xBE62, 0x95BE, 0xBE63, 0x95BF, + 0xBE64, 0xBAFE, 0xBE65, 0x95C0, 0xBE66, 0x95C1, 0xBE67, 0x95C2, 0xBE68, 0xBBA1, 0xBE69, 0x95C3, 0xBE6A, 0xBBA2, 0xBE6B, 0x95C4, + 0xBE6C, 0x95C5, 0xBE6D, 0x95C6, 0xBE6E, 0x95C7, 0xBE6F, 0x95C8, 0xBE70, 0xBBA3, 0xBE71, 0xBBA4, 0xBE72, 0x95C9, 0xBE73, 0xBBA5, + 0xBE74, 0xBBA6, 0xBE75, 0xBBA7, 0xBE76, 0x95CA, 0xBE77, 0x95CB, 0xBE78, 0x95CC, 0xBE79, 0x95CD, 0xBE7A, 0x95CE, 0xBE7B, 0xBBA8, + 0xBE7C, 0xBBA9, 0xBE7D, 0xBBAA, 0xBE7E, 0x95CF, 0xBE7F, 0x95D0, 0xBE80, 0xBBAB, 0xBE81, 0x95D1, 0xBE82, 0x95D2, 0xBE83, 0x95D3, + 0xBE84, 0xBBAC, 0xBE85, 0x95D4, 0xBE86, 0x95D5, 0xBE87, 0x95D6, 0xBE88, 0x95D7, 0xBE89, 0x95D8, 0xBE8A, 0x95D9, 0xBE8B, 0x95DA, + 0xBE8C, 0xBBAD, 0xBE8D, 0xBBAE, 0xBE8E, 0x95DB, 0xBE8F, 0xBBAF, 0xBE90, 0xBBB0, 0xBE91, 0xBBB1, 0xBE92, 0x95DC, 0xBE93, 0x95DD, + 0xBE94, 0x95DE, 0xBE95, 0x95DF, 0xBE96, 0x95E0, 0xBE97, 0x95E1, 0xBE98, 0xBBB2, 0xBE99, 0xBBB3, 0xBE9A, 0x95E2, 0xBE9B, 0x95E3, + 0xBE9C, 0x95E4, 0xBE9D, 0x95E5, 0xBE9E, 0x95E6, 0xBE9F, 0x95E7, 0xBEA0, 0x95E8, 0xBEA1, 0x95E9, 0xBEA2, 0x95EA, 0xBEA3, 0x95EB, + 0xBEA4, 0x95EC, 0xBEA5, 0x95ED, 0xBEA6, 0x95EE, 0xBEA7, 0x95EF, 0xBEA8, 0xBBB4, 0xBEA9, 0x95F0, 0xBEAA, 0x95F1, 0xBEAB, 0x95F2, + 0xBEAC, 0x95F3, 0xBEAD, 0x95F4, 0xBEAE, 0x95F5, 0xBEAF, 0x95F6, 0xBEB0, 0x95F7, 0xBEB1, 0x95F8, 0xBEB2, 0x95F9, 0xBEB3, 0x95FA, + 0xBEB4, 0x95FB, 0xBEB5, 0x95FC, 0xBEB6, 0x95FD, 0xBEB7, 0x95FE, 0xBEB8, 0x9641, 0xBEB9, 0x9642, 0xBEBA, 0x9643, 0xBEBB, 0x9644, + 0xBEBC, 0x9645, 0xBEBD, 0x9646, 0xBEBE, 0x9647, 0xBEBF, 0x9648, 0xBEC0, 0x9649, 0xBEC1, 0x964A, 0xBEC2, 0x964B, 0xBEC3, 0x964C, + 0xBEC4, 0x964D, 0xBEC5, 0x964E, 0xBEC6, 0x964F, 0xBEC7, 0x9650, 0xBEC8, 0x9651, 0xBEC9, 0x9652, 0xBECA, 0x9653, 0xBECB, 0x9654, + 0xBECC, 0x9655, 0xBECD, 0x9656, 0xBECE, 0x9657, 0xBECF, 0x9658, 0xBED0, 0xBBB5, 0xBED1, 0xBBB6, 0xBED2, 0x9659, 0xBED3, 0x965A, + 0xBED4, 0xBBB7, 0xBED5, 0x9661, 0xBED6, 0x9662, 0xBED7, 0xBBB8, 0xBED8, 0xBBB9, 0xBED9, 0x9663, 0xBEDA, 0x9664, 0xBEDB, 0x9665, + 0xBEDC, 0x9666, 0xBEDD, 0x9667, 0xBEDE, 0x9668, 0xBEDF, 0x9669, 0xBEE0, 0xBBBA, 0xBEE1, 0x966A, 0xBEE2, 0x966B, 0xBEE3, 0xBBBB, + 0xBEE4, 0xBBBC, 0xBEE5, 0xBBBD, 0xBEE6, 0x966C, 0xBEE7, 0x966D, 0xBEE8, 0x966E, 0xBEE9, 0x966F, 0xBEEA, 0x9670, 0xBEEB, 0x9671, + 0xBEEC, 0xBBBE, 0xBEED, 0x9672, 0xBEEE, 0x9673, 0xBEEF, 0x9674, 0xBEF0, 0x9675, 0xBEF1, 0x9676, 0xBEF2, 0x9677, 0xBEF3, 0x9678, + 0xBEF4, 0x9679, 0xBEF5, 0x967A, 0xBEF6, 0x9681, 0xBEF7, 0x9682, 0xBEF8, 0x9683, 0xBEF9, 0x9684, 0xBEFA, 0x9685, 0xBEFB, 0x9686, + 0xBEFC, 0x9687, 0xBEFD, 0x9688, 0xBEFE, 0x9689, 0xBEFF, 0x968A, 0xBF00, 0x968B, 0xBF01, 0xBBBF, 0xBF02, 0x968C, 0xBF03, 0x968D, + 0xBF04, 0x968E, 0xBF05, 0x968F, 0xBF06, 0x9690, 0xBF07, 0x9691, 0xBF08, 0xBBC0, 0xBF09, 0xBBC1, 0xBF0A, 0x9692, 0xBF0B, 0x9693, + 0xBF0C, 0x9694, 0xBF0D, 0x9695, 0xBF0E, 0x9696, 0xBF0F, 0x9697, 0xBF10, 0x9698, 0xBF11, 0x9699, 0xBF12, 0x969A, 0xBF13, 0x969B, + 0xBF14, 0x969C, 0xBF15, 0x969D, 0xBF16, 0x969E, 0xBF17, 0x969F, 0xBF18, 0xBBC2, 0xBF19, 0xBBC3, 0xBF1A, 0x96A0, 0xBF1B, 0xBBC4, + 0xBF1C, 0xBBC5, 0xBF1D, 0xBBC6, 0xBF1E, 0x96A1, 0xBF1F, 0x96A2, 0xBF20, 0x96A3, 0xBF21, 0x96A4, 0xBF22, 0x96A5, 0xBF23, 0x96A6, + 0xBF24, 0x96A7, 0xBF25, 0x96A8, 0xBF26, 0x96A9, 0xBF27, 0x96AA, 0xBF28, 0x96AB, 0xBF29, 0x96AC, 0xBF2A, 0x96AD, 0xBF2B, 0x96AE, + 0xBF2C, 0x96AF, 0xBF2D, 0x96B0, 0xBF2E, 0x96B1, 0xBF2F, 0x96B2, 0xBF30, 0x96B3, 0xBF31, 0x96B4, 0xBF32, 0x96B5, 0xBF33, 0x96B6, + 0xBF34, 0x96B7, 0xBF35, 0x96B8, 0xBF36, 0x96B9, 0xBF37, 0x96BA, 0xBF38, 0x96BB, 0xBF39, 0x96BC, 0xBF3A, 0x96BD, 0xBF3B, 0x96BE, + 0xBF3C, 0x96BF, 0xBF3D, 0x96C0, 0xBF3E, 0x96C1, 0xBF3F, 0x96C2, 0xBF40, 0xBBC7, 0xBF41, 0xBBC8, 0xBF42, 0x96C3, 0xBF43, 0x96C4, + 0xBF44, 0xBBC9, 0xBF45, 0x96C5, 0xBF46, 0x96C6, 0xBF47, 0x96C7, 0xBF48, 0xBBCA, 0xBF49, 0x96C8, 0xBF4A, 0x96C9, 0xBF4B, 0x96CA, + 0xBF4C, 0x96CB, 0xBF4D, 0x96CC, 0xBF4E, 0x96CD, 0xBF4F, 0x96CE, 0xBF50, 0xBBCB, 0xBF51, 0xBBCC, 0xBF52, 0x96CF, 0xBF53, 0x96D0, + 0xBF54, 0x96D1, 0xBF55, 0xBBCD, 0xBF56, 0x96D2, 0xBF57, 0x96D3, 0xBF58, 0x96D4, 0xBF59, 0x96D5, 0xBF5A, 0x96D6, 0xBF5B, 0x96D7, + 0xBF5C, 0x96D8, 0xBF5D, 0x96D9, 0xBF5E, 0x96DA, 0xBF5F, 0x96DB, 0xBF60, 0x96DC, 0xBF61, 0x96DD, 0xBF62, 0x96DE, 0xBF63, 0x96DF, + 0xBF64, 0x96E0, 0xBF65, 0x96E1, 0xBF66, 0x96E2, 0xBF67, 0x96E3, 0xBF68, 0x96E4, 0xBF69, 0x96E5, 0xBF6A, 0x96E6, 0xBF6B, 0x96E7, + 0xBF6C, 0x96E8, 0xBF6D, 0x96E9, 0xBF6E, 0x96EA, 0xBF6F, 0x96EB, 0xBF70, 0x96EC, 0xBF71, 0x96ED, 0xBF72, 0x96EE, 0xBF73, 0x96EF, + 0xBF74, 0x96F0, 0xBF75, 0x96F1, 0xBF76, 0x96F2, 0xBF77, 0x96F3, 0xBF78, 0x96F4, 0xBF79, 0x96F5, 0xBF7A, 0x96F6, 0xBF7B, 0x96F7, + 0xBF7C, 0x96F8, 0xBF7D, 0x96F9, 0xBF7E, 0x96FA, 0xBF7F, 0x96FB, 0xBF80, 0x96FC, 0xBF81, 0x96FD, 0xBF82, 0x96FE, 0xBF83, 0x9741, + 0xBF84, 0x9742, 0xBF85, 0x9743, 0xBF86, 0x9744, 0xBF87, 0x9745, 0xBF88, 0x9746, 0xBF89, 0x9747, 0xBF8A, 0x9748, 0xBF8B, 0x9749, + 0xBF8C, 0x974A, 0xBF8D, 0x974B, 0xBF8E, 0x974C, 0xBF8F, 0x974D, 0xBF90, 0x974E, 0xBF91, 0x974F, 0xBF92, 0x9750, 0xBF93, 0x9751, + 0xBF94, 0xBBCE, 0xBF95, 0x9752, 0xBF96, 0x9753, 0xBF97, 0x9754, 0xBF98, 0x9755, 0xBF99, 0x9756, 0xBF9A, 0x9757, 0xBF9B, 0x9758, + 0xBF9C, 0x9759, 0xBF9D, 0x975A, 0xBF9E, 0x9761, 0xBF9F, 0x9762, 0xBFA0, 0x9763, 0xBFA1, 0x9764, 0xBFA2, 0x9765, 0xBFA3, 0x9766, + 0xBFA4, 0x9767, 0xBFA5, 0x9768, 0xBFA6, 0x9769, 0xBFA7, 0x976A, 0xBFA8, 0x976B, 0xBFA9, 0x976C, 0xBFAA, 0x976D, 0xBFAB, 0x976E, + 0xBFAC, 0x976F, 0xBFAD, 0x9770, 0xBFAE, 0x9771, 0xBFAF, 0x9772, 0xBFB0, 0xBBCF, 0xBFB1, 0x9773, 0xBFB2, 0x9774, 0xBFB3, 0x9775, + 0xBFB4, 0x9776, 0xBFB5, 0x9777, 0xBFB6, 0x9778, 0xBFB7, 0x9779, 0xBFB8, 0x977A, 0xBFB9, 0x9781, 0xBFBA, 0x9782, 0xBFBB, 0x9783, + 0xBFBC, 0x9784, 0xBFBD, 0x9785, 0xBFBE, 0x9786, 0xBFBF, 0x9787, 0xBFC0, 0x9788, 0xBFC1, 0x9789, 0xBFC2, 0x978A, 0xBFC3, 0x978B, + 0xBFC4, 0x978C, 0xBFC5, 0xBBD0, 0xBFC6, 0x978D, 0xBFC7, 0x978E, 0xBFC8, 0x978F, 0xBFC9, 0x9790, 0xBFCA, 0x9791, 0xBFCB, 0x9792, + 0xBFCC, 0xBBD1, 0xBFCD, 0xBBD2, 0xBFCE, 0x9793, 0xBFCF, 0x9794, 0xBFD0, 0xBBD3, 0xBFD1, 0x9795, 0xBFD2, 0x9796, 0xBFD3, 0x9797, + 0xBFD4, 0xBBD4, 0xBFD5, 0x9798, 0xBFD6, 0x9799, 0xBFD7, 0x979A, 0xBFD8, 0x979B, 0xBFD9, 0x979C, 0xBFDA, 0x979D, 0xBFDB, 0x979E, + 0xBFDC, 0xBBD5, 0xBFDD, 0x979F, 0xBFDE, 0x97A0, 0xBFDF, 0xBBD6, 0xBFE0, 0x97A1, 0xBFE1, 0xBBD7, 0xBFE2, 0x97A2, 0xBFE3, 0x97A3, + 0xBFE4, 0x97A4, 0xBFE5, 0x97A5, 0xBFE6, 0x97A6, 0xBFE7, 0x97A7, 0xBFE8, 0x97A8, 0xBFE9, 0x97A9, 0xBFEA, 0x97AA, 0xBFEB, 0x97AB, + 0xBFEC, 0x97AC, 0xBFED, 0x97AD, 0xBFEE, 0x97AE, 0xBFEF, 0x97AF, 0xBFF0, 0x97B0, 0xBFF1, 0x97B1, 0xBFF2, 0x97B2, 0xBFF3, 0x97B3, + 0xBFF4, 0x97B4, 0xBFF5, 0x97B5, 0xBFF6, 0x97B6, 0xBFF7, 0x97B7, 0xBFF8, 0x97B8, 0xBFF9, 0x97B9, 0xBFFA, 0x97BA, 0xBFFB, 0x97BB, + 0xBFFC, 0x97BC, 0xBFFD, 0x97BD, 0xBFFE, 0x97BE, 0xBFFF, 0x97BF, 0xC000, 0x97C0, 0xC001, 0x97C1, 0xC002, 0x97C2, 0xC003, 0x97C3, + 0xC004, 0x97C4, 0xC005, 0x97C5, 0xC006, 0x97C6, 0xC007, 0x97C7, 0xC008, 0x97C8, 0xC009, 0x97C9, 0xC00A, 0x97CA, 0xC00B, 0x97CB, + 0xC00C, 0x97CC, 0xC00D, 0x97CD, 0xC00E, 0x97CE, 0xC00F, 0x97CF, 0xC010, 0x97D0, 0xC011, 0x97D1, 0xC012, 0x97D2, 0xC013, 0x97D3, + 0xC014, 0x97D4, 0xC015, 0x97D5, 0xC016, 0x97D6, 0xC017, 0x97D7, 0xC018, 0x97D8, 0xC019, 0x97D9, 0xC01A, 0x97DA, 0xC01B, 0x97DB, + 0xC01C, 0x97DC, 0xC01D, 0x97DD, 0xC01E, 0x97DE, 0xC01F, 0x97DF, 0xC020, 0x97E0, 0xC021, 0x97E1, 0xC022, 0x97E2, 0xC023, 0x97E3, + 0xC024, 0x97E4, 0xC025, 0x97E5, 0xC026, 0x97E6, 0xC027, 0x97E7, 0xC028, 0x97E8, 0xC029, 0x97E9, 0xC02A, 0x97EA, 0xC02B, 0x97EB, + 0xC02C, 0x97EC, 0xC02D, 0x97ED, 0xC02E, 0x97EE, 0xC02F, 0x97EF, 0xC030, 0x97F0, 0xC031, 0x97F1, 0xC032, 0x97F2, 0xC033, 0x97F3, + 0xC034, 0x97F4, 0xC035, 0x97F5, 0xC036, 0x97F6, 0xC037, 0x97F7, 0xC038, 0x97F8, 0xC039, 0x97F9, 0xC03A, 0x97FA, 0xC03B, 0x97FB, + 0xC03C, 0xBBD8, 0xC03D, 0x97FC, 0xC03E, 0x97FD, 0xC03F, 0x97FE, 0xC040, 0x9841, 0xC041, 0x9842, 0xC042, 0x9843, 0xC043, 0x9844, + 0xC044, 0x9845, 0xC045, 0x9846, 0xC046, 0x9847, 0xC047, 0x9848, 0xC048, 0x9849, 0xC049, 0x984A, 0xC04A, 0x984B, 0xC04B, 0x984C, + 0xC04C, 0x984D, 0xC04D, 0x984E, 0xC04E, 0x984F, 0xC04F, 0x9850, 0xC050, 0x9851, 0xC051, 0xBBD9, 0xC052, 0x9852, 0xC053, 0x9853, + 0xC054, 0x9854, 0xC055, 0x9855, 0xC056, 0x9856, 0xC057, 0x9857, 0xC058, 0xBBDA, 0xC059, 0x9858, 0xC05A, 0x9859, 0xC05B, 0x985A, + 0xC05C, 0xBBDB, 0xC05D, 0x9861, 0xC05E, 0x9862, 0xC05F, 0x9863, 0xC060, 0xBBDC, 0xC061, 0x9864, 0xC062, 0x9865, 0xC063, 0x9866, + 0xC064, 0x9867, 0xC065, 0x9868, 0xC066, 0x9869, 0xC067, 0x986A, 0xC068, 0xBBDD, 0xC069, 0xBBDE, 0xC06A, 0x986B, 0xC06B, 0x986C, + 0xC06C, 0x986D, 0xC06D, 0x986E, 0xC06E, 0x986F, 0xC06F, 0x9870, 0xC070, 0x9871, 0xC071, 0x9872, 0xC072, 0x9873, 0xC073, 0x9874, + 0xC074, 0x9875, 0xC075, 0x9876, 0xC076, 0x9877, 0xC077, 0x9878, 0xC078, 0x9879, 0xC079, 0x987A, 0xC07A, 0x9881, 0xC07B, 0x9882, + 0xC07C, 0x9883, 0xC07D, 0x9884, 0xC07E, 0x9885, 0xC07F, 0x9886, 0xC080, 0x9887, 0xC081, 0x9888, 0xC082, 0x9889, 0xC083, 0x988A, + 0xC084, 0x988B, 0xC085, 0x988C, 0xC086, 0x988D, 0xC087, 0x988E, 0xC088, 0x988F, 0xC089, 0x9890, 0xC08A, 0x9891, 0xC08B, 0x9892, + 0xC08C, 0x9893, 0xC08D, 0x9894, 0xC08E, 0x9895, 0xC08F, 0x9896, 0xC090, 0xBBDF, 0xC091, 0xBBE0, 0xC092, 0x9897, 0xC093, 0x9898, + 0xC094, 0xBBE1, 0xC095, 0x9899, 0xC096, 0x989A, 0xC097, 0x989B, 0xC098, 0xBBE2, 0xC099, 0x989C, 0xC09A, 0x989D, 0xC09B, 0x989E, + 0xC09C, 0x989F, 0xC09D, 0x98A0, 0xC09E, 0x98A1, 0xC09F, 0x98A2, 0xC0A0, 0xBBE3, 0xC0A1, 0xBBE4, 0xC0A2, 0x98A3, 0xC0A3, 0xBBE5, + 0xC0A4, 0x98A4, 0xC0A5, 0xBBE6, 0xC0A6, 0x98A5, 0xC0A7, 0x98A6, 0xC0A8, 0x98A7, 0xC0A9, 0x98A8, 0xC0AA, 0x98A9, 0xC0AB, 0x98AA, + 0xC0AC, 0xBBE7, 0xC0AD, 0xBBE8, 0xC0AE, 0x98AB, 0xC0AF, 0xBBE9, 0xC0B0, 0xBBEA, 0xC0B1, 0x98AC, 0xC0B2, 0x98AD, 0xC0B3, 0xBBEB, + 0xC0B4, 0xBBEC, 0xC0B5, 0xBBED, 0xC0B6, 0xBBEE, 0xC0B7, 0x98AE, 0xC0B8, 0x98AF, 0xC0B9, 0x98B0, 0xC0BA, 0x98B1, 0xC0BB, 0x98B2, + 0xC0BC, 0xBBEF, 0xC0BD, 0xBBF0, 0xC0BE, 0x98B3, 0xC0BF, 0xBBF1, 0xC0C0, 0xBBF2, 0xC0C1, 0xBBF3, 0xC0C2, 0x98B4, 0xC0C3, 0x98B5, + 0xC0C4, 0x98B6, 0xC0C5, 0xBBF4, 0xC0C6, 0x98B7, 0xC0C7, 0x98B8, 0xC0C8, 0xBBF5, 0xC0C9, 0xBBF6, 0xC0CA, 0x98B9, 0xC0CB, 0x98BA, + 0xC0CC, 0xBBF7, 0xC0CD, 0x98BB, 0xC0CE, 0x98BC, 0xC0CF, 0x98BD, 0xC0D0, 0xBBF8, 0xC0D1, 0x98BE, 0xC0D2, 0x98BF, 0xC0D3, 0x98C0, + 0xC0D4, 0x98C1, 0xC0D5, 0x98C2, 0xC0D6, 0x98C3, 0xC0D7, 0x98C4, 0xC0D8, 0xBBF9, 0xC0D9, 0xBBFA, 0xC0DA, 0x98C5, 0xC0DB, 0xBBFB, + 0xC0DC, 0xBBFC, 0xC0DD, 0xBBFD, 0xC0DE, 0x98C6, 0xC0DF, 0x98C7, 0xC0E0, 0x98C8, 0xC0E1, 0x98C9, 0xC0E2, 0x98CA, 0xC0E3, 0x98CB, + 0xC0E4, 0xBBFE, 0xC0E5, 0xBCA1, 0xC0E6, 0x98CC, 0xC0E7, 0x98CD, 0xC0E8, 0xBCA2, 0xC0E9, 0x98CE, 0xC0EA, 0x98CF, 0xC0EB, 0x98D0, + 0xC0EC, 0xBCA3, 0xC0ED, 0x98D1, 0xC0EE, 0x98D2, 0xC0EF, 0x98D3, 0xC0F0, 0x98D4, 0xC0F1, 0x98D5, 0xC0F2, 0x98D6, 0xC0F3, 0x98D7, + 0xC0F4, 0xBCA4, 0xC0F5, 0xBCA5, 0xC0F6, 0x98D8, 0xC0F7, 0xBCA6, 0xC0F8, 0x98D9, 0xC0F9, 0xBCA7, 0xC0FA, 0x98DA, 0xC0FB, 0x98DB, + 0xC0FC, 0x98DC, 0xC0FD, 0x98DD, 0xC0FE, 0x98DE, 0xC0FF, 0x98DF, 0xC100, 0xBCA8, 0xC101, 0x98E0, 0xC102, 0x98E1, 0xC103, 0x98E2, + 0xC104, 0xBCA9, 0xC105, 0x98E3, 0xC106, 0x98E4, 0xC107, 0x98E5, 0xC108, 0xBCAA, 0xC109, 0x98E6, 0xC10A, 0x98E7, 0xC10B, 0x98E8, + 0xC10C, 0x98E9, 0xC10D, 0x98EA, 0xC10E, 0x98EB, 0xC10F, 0x98EC, 0xC110, 0xBCAB, 0xC111, 0x98ED, 0xC112, 0x98EE, 0xC113, 0x98EF, + 0xC114, 0x98F0, 0xC115, 0xBCAC, 0xC116, 0x98F1, 0xC117, 0x98F2, 0xC118, 0x98F3, 0xC119, 0x98F4, 0xC11A, 0x98F5, 0xC11B, 0x98F6, + 0xC11C, 0xBCAD, 0xC11D, 0xBCAE, 0xC11E, 0xBCAF, 0xC11F, 0xBCB0, 0xC120, 0xBCB1, 0xC121, 0x98F7, 0xC122, 0x98F8, 0xC123, 0xBCB2, + 0xC124, 0xBCB3, 0xC125, 0x98F9, 0xC126, 0xBCB4, 0xC127, 0xBCB5, 0xC128, 0x98FA, 0xC129, 0x98FB, 0xC12A, 0x98FC, 0xC12B, 0x98FD, + 0xC12C, 0xBCB6, 0xC12D, 0xBCB7, 0xC12E, 0x98FE, 0xC12F, 0xBCB8, 0xC130, 0xBCB9, 0xC131, 0xBCBA, 0xC132, 0x9941, 0xC133, 0x9942, + 0xC134, 0x9943, 0xC135, 0x9944, 0xC136, 0xBCBB, 0xC137, 0x9945, 0xC138, 0xBCBC, 0xC139, 0xBCBD, 0xC13A, 0x9946, 0xC13B, 0x9947, + 0xC13C, 0xBCBE, 0xC13D, 0x9948, 0xC13E, 0x9949, 0xC13F, 0x994A, 0xC140, 0xBCBF, 0xC141, 0x994B, 0xC142, 0x994C, 0xC143, 0x994D, + 0xC144, 0x994E, 0xC145, 0x994F, 0xC146, 0x9950, 0xC147, 0x9951, 0xC148, 0xBCC0, 0xC149, 0xBCC1, 0xC14A, 0x9952, 0xC14B, 0xBCC2, + 0xC14C, 0xBCC3, 0xC14D, 0xBCC4, 0xC14E, 0x9953, 0xC14F, 0x9954, 0xC150, 0x9955, 0xC151, 0x9956, 0xC152, 0x9957, 0xC153, 0x9958, + 0xC154, 0xBCC5, 0xC155, 0xBCC6, 0xC156, 0x9959, 0xC157, 0x995A, 0xC158, 0xBCC7, 0xC159, 0x9961, 0xC15A, 0x9962, 0xC15B, 0x9963, + 0xC15C, 0xBCC8, 0xC15D, 0x9964, 0xC15E, 0x9965, 0xC15F, 0x9966, 0xC160, 0x9967, 0xC161, 0x9968, 0xC162, 0x9969, 0xC163, 0x996A, + 0xC164, 0xBCC9, 0xC165, 0xBCCA, 0xC166, 0x996B, 0xC167, 0xBCCB, 0xC168, 0xBCCC, 0xC169, 0xBCCD, 0xC16A, 0x996C, 0xC16B, 0x996D, + 0xC16C, 0x996E, 0xC16D, 0x996F, 0xC16E, 0x9970, 0xC16F, 0x9971, 0xC170, 0xBCCE, 0xC171, 0x9972, 0xC172, 0x9973, 0xC173, 0x9974, + 0xC174, 0xBCCF, 0xC175, 0x9975, 0xC176, 0x9976, 0xC177, 0x9977, 0xC178, 0xBCD0, 0xC179, 0x9978, 0xC17A, 0x9979, 0xC17B, 0x997A, + 0xC17C, 0x9981, 0xC17D, 0x9982, 0xC17E, 0x9983, 0xC17F, 0x9984, 0xC180, 0x9985, 0xC181, 0x9986, 0xC182, 0x9987, 0xC183, 0x9988, + 0xC184, 0x9989, 0xC185, 0xBCD1, 0xC186, 0x998A, 0xC187, 0x998B, 0xC188, 0x998C, 0xC189, 0x998D, 0xC18A, 0x998E, 0xC18B, 0x998F, + 0xC18C, 0xBCD2, 0xC18D, 0xBCD3, 0xC18E, 0xBCD4, 0xC18F, 0x9990, 0xC190, 0xBCD5, 0xC191, 0x9991, 0xC192, 0x9992, 0xC193, 0x9993, + 0xC194, 0xBCD6, 0xC195, 0x9994, 0xC196, 0xBCD7, 0xC197, 0x9995, 0xC198, 0x9996, 0xC199, 0x9997, 0xC19A, 0x9998, 0xC19B, 0x9999, + 0xC19C, 0xBCD8, 0xC19D, 0xBCD9, 0xC19E, 0x999A, 0xC19F, 0xBCDA, 0xC1A0, 0x999B, 0xC1A1, 0xBCDB, 0xC1A2, 0x999C, 0xC1A3, 0x999D, + 0xC1A4, 0x999E, 0xC1A5, 0xBCDC, 0xC1A6, 0x999F, 0xC1A7, 0x99A0, 0xC1A8, 0xBCDD, 0xC1A9, 0xBCDE, 0xC1AA, 0x99A1, 0xC1AB, 0x99A2, + 0xC1AC, 0xBCDF, 0xC1AD, 0x99A3, 0xC1AE, 0x99A4, 0xC1AF, 0x99A5, 0xC1B0, 0xBCE0, 0xC1B1, 0x99A6, 0xC1B2, 0x99A7, 0xC1B3, 0x99A8, + 0xC1B4, 0x99A9, 0xC1B5, 0x99AA, 0xC1B6, 0x99AB, 0xC1B7, 0x99AC, 0xC1B8, 0x99AD, 0xC1B9, 0x99AE, 0xC1BA, 0x99AF, 0xC1BB, 0x99B0, + 0xC1BC, 0x99B1, 0xC1BD, 0xBCE1, 0xC1BE, 0x99B2, 0xC1BF, 0x99B3, 0xC1C0, 0x99B4, 0xC1C1, 0x99B5, 0xC1C2, 0x99B6, 0xC1C3, 0x99B7, + 0xC1C4, 0xBCE2, 0xC1C5, 0x99B8, 0xC1C6, 0x99B9, 0xC1C7, 0x99BA, 0xC1C8, 0xBCE3, 0xC1C9, 0x99BB, 0xC1CA, 0x99BC, 0xC1CB, 0x99BD, + 0xC1CC, 0xBCE4, 0xC1CD, 0x99BE, 0xC1CE, 0x99BF, 0xC1CF, 0x99C0, 0xC1D0, 0x99C1, 0xC1D1, 0x99C2, 0xC1D2, 0x99C3, 0xC1D3, 0x99C4, + 0xC1D4, 0xBCE5, 0xC1D5, 0x99C5, 0xC1D6, 0x99C6, 0xC1D7, 0xBCE6, 0xC1D8, 0xBCE7, 0xC1D9, 0x99C7, 0xC1DA, 0x99C8, 0xC1DB, 0x99C9, + 0xC1DC, 0x99CA, 0xC1DD, 0x99CB, 0xC1DE, 0x99CC, 0xC1DF, 0x99CD, 0xC1E0, 0xBCE8, 0xC1E1, 0x99CE, 0xC1E2, 0x99CF, 0xC1E3, 0x99D0, + 0xC1E4, 0xBCE9, 0xC1E5, 0x99D1, 0xC1E6, 0x99D2, 0xC1E7, 0x99D3, 0xC1E8, 0xBCEA, 0xC1E9, 0x99D4, 0xC1EA, 0x99D5, 0xC1EB, 0x99D6, + 0xC1EC, 0x99D7, 0xC1ED, 0x99D8, 0xC1EE, 0x99D9, 0xC1EF, 0x99DA, 0xC1F0, 0xBCEB, 0xC1F1, 0xBCEC, 0xC1F2, 0x99DB, 0xC1F3, 0xBCED, + 0xC1F4, 0x99DC, 0xC1F5, 0x99DD, 0xC1F6, 0x99DE, 0xC1F7, 0x99DF, 0xC1F8, 0x99E0, 0xC1F9, 0x99E1, 0xC1FA, 0x99E2, 0xC1FB, 0x99E3, + 0xC1FC, 0xBCEE, 0xC1FD, 0xBCEF, 0xC1FE, 0x99E4, 0xC1FF, 0x99E5, 0xC200, 0xBCF0, 0xC201, 0x99E6, 0xC202, 0x99E7, 0xC203, 0x99E8, + 0xC204, 0xBCF1, 0xC205, 0x99E9, 0xC206, 0x99EA, 0xC207, 0x99EB, 0xC208, 0x99EC, 0xC209, 0x99ED, 0xC20A, 0x99EE, 0xC20B, 0x99EF, + 0xC20C, 0xBCF2, 0xC20D, 0xBCF3, 0xC20E, 0x99F0, 0xC20F, 0xBCF4, 0xC210, 0x99F1, 0xC211, 0xBCF5, 0xC212, 0x99F2, 0xC213, 0x99F3, + 0xC214, 0x99F4, 0xC215, 0x99F5, 0xC216, 0x99F6, 0xC217, 0x99F7, 0xC218, 0xBCF6, 0xC219, 0xBCF7, 0xC21A, 0x99F8, 0xC21B, 0x99F9, + 0xC21C, 0xBCF8, 0xC21D, 0x99FA, 0xC21E, 0x99FB, 0xC21F, 0xBCF9, 0xC220, 0xBCFA, 0xC221, 0x99FC, 0xC222, 0x99FD, 0xC223, 0x99FE, + 0xC224, 0x9A41, 0xC225, 0x9A42, 0xC226, 0x9A43, 0xC227, 0x9A44, 0xC228, 0xBCFB, 0xC229, 0xBCFC, 0xC22A, 0x9A45, 0xC22B, 0xBCFD, + 0xC22C, 0x9A46, 0xC22D, 0xBCFE, 0xC22E, 0x9A47, 0xC22F, 0xBDA1, 0xC230, 0x9A48, 0xC231, 0xBDA2, 0xC232, 0xBDA3, 0xC233, 0x9A49, + 0xC234, 0xBDA4, 0xC235, 0x9A4A, 0xC236, 0x9A4B, 0xC237, 0x9A4C, 0xC238, 0x9A4D, 0xC239, 0x9A4E, 0xC23A, 0x9A4F, 0xC23B, 0x9A50, + 0xC23C, 0x9A51, 0xC23D, 0x9A52, 0xC23E, 0x9A53, 0xC23F, 0x9A54, 0xC240, 0x9A55, 0xC241, 0x9A56, 0xC242, 0x9A57, 0xC243, 0x9A58, + 0xC244, 0x9A59, 0xC245, 0x9A5A, 0xC246, 0x9A61, 0xC247, 0x9A62, 0xC248, 0xBDA5, 0xC249, 0x9A63, 0xC24A, 0x9A64, 0xC24B, 0x9A65, + 0xC24C, 0x9A66, 0xC24D, 0x9A67, 0xC24E, 0x9A68, 0xC24F, 0x9A69, 0xC250, 0xBDA6, 0xC251, 0xBDA7, 0xC252, 0x9A6A, 0xC253, 0x9A6B, + 0xC254, 0xBDA8, 0xC255, 0x9A6C, 0xC256, 0x9A6D, 0xC257, 0x9A6E, 0xC258, 0xBDA9, 0xC259, 0x9A6F, 0xC25A, 0x9A70, 0xC25B, 0x9A71, + 0xC25C, 0x9A72, 0xC25D, 0x9A73, 0xC25E, 0x9A74, 0xC25F, 0x9A75, 0xC260, 0xBDAA, 0xC261, 0x9A76, 0xC262, 0x9A77, 0xC263, 0x9A78, + 0xC264, 0x9A79, 0xC265, 0xBDAB, 0xC266, 0x9A7A, 0xC267, 0x9A81, 0xC268, 0x9A82, 0xC269, 0x9A83, 0xC26A, 0x9A84, 0xC26B, 0x9A85, + 0xC26C, 0xBDAC, 0xC26D, 0xBDAD, 0xC26E, 0x9A86, 0xC26F, 0x9A87, 0xC270, 0xBDAE, 0xC271, 0x9A88, 0xC272, 0x9A89, 0xC273, 0x9A8A, + 0xC274, 0xBDAF, 0xC275, 0x9A8B, 0xC276, 0x9A8C, 0xC277, 0x9A8D, 0xC278, 0x9A8E, 0xC279, 0x9A8F, 0xC27A, 0x9A90, 0xC27B, 0x9A91, + 0xC27C, 0xBDB0, 0xC27D, 0xBDB1, 0xC27E, 0x9A92, 0xC27F, 0xBDB2, 0xC280, 0x9A93, 0xC281, 0xBDB3, 0xC282, 0x9A94, 0xC283, 0x9A95, + 0xC284, 0x9A96, 0xC285, 0x9A97, 0xC286, 0x9A98, 0xC287, 0x9A99, 0xC288, 0xBDB4, 0xC289, 0xBDB5, 0xC28A, 0x9A9A, 0xC28B, 0x9A9B, + 0xC28C, 0x9A9C, 0xC28D, 0x9A9D, 0xC28E, 0x9A9E, 0xC28F, 0x9A9F, 0xC290, 0xBDB6, 0xC291, 0x9AA0, 0xC292, 0x9AA1, 0xC293, 0x9AA2, + 0xC294, 0x9AA3, 0xC295, 0x9AA4, 0xC296, 0x9AA5, 0xC297, 0x9AA6, 0xC298, 0xBDB7, 0xC299, 0x9AA7, 0xC29A, 0x9AA8, 0xC29B, 0xBDB8, + 0xC29C, 0x9AA9, 0xC29D, 0xBDB9, 0xC29E, 0x9AAA, 0xC29F, 0x9AAB, 0xC2A0, 0x9AAC, 0xC2A1, 0x9AAD, 0xC2A2, 0x9AAE, 0xC2A3, 0x9AAF, + 0xC2A4, 0xBDBA, 0xC2A5, 0xBDBB, 0xC2A6, 0x9AB0, 0xC2A7, 0x9AB1, 0xC2A8, 0xBDBC, 0xC2A9, 0x9AB2, 0xC2AA, 0x9AB3, 0xC2AB, 0x9AB4, + 0xC2AC, 0xBDBD, 0xC2AD, 0xBDBE, 0xC2AE, 0x9AB5, 0xC2AF, 0x9AB6, 0xC2B0, 0x9AB7, 0xC2B1, 0x9AB8, 0xC2B2, 0x9AB9, 0xC2B3, 0x9ABA, + 0xC2B4, 0xBDBF, 0xC2B5, 0xBDC0, 0xC2B6, 0x9ABB, 0xC2B7, 0xBDC1, 0xC2B8, 0x9ABC, 0xC2B9, 0xBDC2, 0xC2BA, 0x9ABD, 0xC2BB, 0x9ABE, + 0xC2BC, 0x9ABF, 0xC2BD, 0x9AC0, 0xC2BE, 0x9AC1, 0xC2BF, 0x9AC2, 0xC2C0, 0x9AC3, 0xC2C1, 0x9AC4, 0xC2C2, 0x9AC5, 0xC2C3, 0x9AC6, + 0xC2C4, 0x9AC7, 0xC2C5, 0x9AC8, 0xC2C6, 0x9AC9, 0xC2C7, 0x9ACA, 0xC2C8, 0x9ACB, 0xC2C9, 0x9ACC, 0xC2CA, 0x9ACD, 0xC2CB, 0x9ACE, + 0xC2CC, 0x9ACF, 0xC2CD, 0x9AD0, 0xC2CE, 0x9AD1, 0xC2CF, 0x9AD2, 0xC2D0, 0x9AD3, 0xC2D1, 0x9AD4, 0xC2D2, 0x9AD5, 0xC2D3, 0x9AD6, + 0xC2D4, 0x9AD7, 0xC2D5, 0x9AD8, 0xC2D6, 0x9AD9, 0xC2D7, 0x9ADA, 0xC2D8, 0x9ADB, 0xC2D9, 0x9ADC, 0xC2DA, 0x9ADD, 0xC2DB, 0x9ADE, + 0xC2DC, 0xBDC3, 0xC2DD, 0xBDC4, 0xC2DE, 0x9ADF, 0xC2DF, 0x9AE0, 0xC2E0, 0xBDC5, 0xC2E1, 0x9AE1, 0xC2E2, 0x9AE2, 0xC2E3, 0xBDC6, + 0xC2E4, 0xBDC7, 0xC2E5, 0x9AE3, 0xC2E6, 0x9AE4, 0xC2E7, 0x9AE5, 0xC2E8, 0x9AE6, 0xC2E9, 0x9AE7, 0xC2EA, 0x9AE8, 0xC2EB, 0xBDC8, + 0xC2EC, 0xBDC9, 0xC2ED, 0xBDCA, 0xC2EE, 0x9AE9, 0xC2EF, 0xBDCB, 0xC2F0, 0x9AEA, 0xC2F1, 0xBDCC, 0xC2F2, 0x9AEB, 0xC2F3, 0x9AEC, + 0xC2F4, 0x9AED, 0xC2F5, 0x9AEE, 0xC2F6, 0xBDCD, 0xC2F7, 0x9AEF, 0xC2F8, 0xBDCE, 0xC2F9, 0xBDCF, 0xC2FA, 0x9AF0, 0xC2FB, 0xBDD0, + 0xC2FC, 0xBDD1, 0xC2FD, 0x9AF1, 0xC2FE, 0x9AF2, 0xC2FF, 0x9AF3, 0xC300, 0xBDD2, 0xC301, 0x9AF4, 0xC302, 0x9AF5, 0xC303, 0x9AF6, + 0xC304, 0x9AF7, 0xC305, 0x9AF8, 0xC306, 0x9AF9, 0xC307, 0x9AFA, 0xC308, 0xBDD3, 0xC309, 0xBDD4, 0xC30A, 0x9AFB, 0xC30B, 0x9AFC, + 0xC30C, 0xBDD5, 0xC30D, 0xBDD6, 0xC30E, 0x9AFD, 0xC30F, 0x9AFE, 0xC310, 0x9B41, 0xC311, 0x9B42, 0xC312, 0x9B43, 0xC313, 0xBDD7, + 0xC314, 0xBDD8, 0xC315, 0xBDD9, 0xC316, 0x9B44, 0xC317, 0x9B45, 0xC318, 0xBDDA, 0xC319, 0x9B46, 0xC31A, 0x9B47, 0xC31B, 0x9B48, + 0xC31C, 0xBDDB, 0xC31D, 0x9B49, 0xC31E, 0x9B4A, 0xC31F, 0x9B4B, 0xC320, 0x9B4C, 0xC321, 0x9B4D, 0xC322, 0x9B4E, 0xC323, 0x9B4F, + 0xC324, 0xBDDC, 0xC325, 0xBDDD, 0xC326, 0x9B50, 0xC327, 0x9B51, 0xC328, 0xBDDE, 0xC329, 0xBDDF, 0xC32A, 0x9B52, 0xC32B, 0x9B53, + 0xC32C, 0x9B54, 0xC32D, 0x9B55, 0xC32E, 0x9B56, 0xC32F, 0x9B57, 0xC330, 0x9B58, 0xC331, 0x9B59, 0xC332, 0x9B5A, 0xC333, 0x9B61, + 0xC334, 0x9B62, 0xC335, 0x9B63, 0xC336, 0x9B64, 0xC337, 0x9B65, 0xC338, 0x9B66, 0xC339, 0x9B67, 0xC33A, 0x9B68, 0xC33B, 0x9B69, + 0xC33C, 0x9B6A, 0xC33D, 0x9B6B, 0xC33E, 0x9B6C, 0xC33F, 0x9B6D, 0xC340, 0x9B6E, 0xC341, 0x9B6F, 0xC342, 0x9B70, 0xC343, 0x9B71, + 0xC344, 0x9B72, 0xC345, 0xBDE0, 0xC346, 0x9B73, 0xC347, 0x9B74, 0xC348, 0x9B75, 0xC349, 0x9B76, 0xC34A, 0x9B77, 0xC34B, 0x9B78, + 0xC34C, 0x9B79, 0xC34D, 0x9B7A, 0xC34E, 0x9B81, 0xC34F, 0x9B82, 0xC350, 0x9B83, 0xC351, 0x9B84, 0xC352, 0x9B85, 0xC353, 0x9B86, + 0xC354, 0x9B87, 0xC355, 0x9B88, 0xC356, 0x9B89, 0xC357, 0x9B8A, 0xC358, 0x9B8B, 0xC359, 0x9B8C, 0xC35A, 0x9B8D, 0xC35B, 0x9B8E, + 0xC35C, 0x9B8F, 0xC35D, 0x9B90, 0xC35E, 0x9B91, 0xC35F, 0x9B92, 0xC360, 0x9B93, 0xC361, 0x9B94, 0xC362, 0x9B95, 0xC363, 0x9B96, + 0xC364, 0x9B97, 0xC365, 0x9B98, 0xC366, 0x9B99, 0xC367, 0x9B9A, 0xC368, 0xBDE1, 0xC369, 0xBDE2, 0xC36A, 0x9B9B, 0xC36B, 0x9B9C, + 0xC36C, 0xBDE3, 0xC36D, 0x9B9D, 0xC36E, 0x9B9E, 0xC36F, 0x9B9F, 0xC370, 0xBDE4, 0xC371, 0x9BA0, 0xC372, 0xBDE5, 0xC373, 0x9BA1, + 0xC374, 0x9BA2, 0xC375, 0x9BA3, 0xC376, 0x9BA4, 0xC377, 0x9BA5, 0xC378, 0xBDE6, 0xC379, 0xBDE7, 0xC37A, 0x9BA6, 0xC37B, 0x9BA7, + 0xC37C, 0xBDE8, 0xC37D, 0xBDE9, 0xC37E, 0x9BA8, 0xC37F, 0x9BA9, 0xC380, 0x9BAA, 0xC381, 0x9BAB, 0xC382, 0x9BAC, 0xC383, 0x9BAD, + 0xC384, 0xBDEA, 0xC385, 0x9BAE, 0xC386, 0x9BAF, 0xC387, 0x9BB0, 0xC388, 0xBDEB, 0xC389, 0x9BB1, 0xC38A, 0x9BB2, 0xC38B, 0x9BB3, + 0xC38C, 0xBDEC, 0xC38D, 0x9BB4, 0xC38E, 0x9BB5, 0xC38F, 0x9BB6, 0xC390, 0x9BB7, 0xC391, 0x9BB8, 0xC392, 0x9BB9, 0xC393, 0x9BBA, + 0xC394, 0x9BBB, 0xC395, 0x9BBC, 0xC396, 0x9BBD, 0xC397, 0x9BBE, 0xC398, 0x9BBF, 0xC399, 0x9BC0, 0xC39A, 0x9BC1, 0xC39B, 0x9BC2, + 0xC39C, 0x9BC3, 0xC39D, 0x9BC4, 0xC39E, 0x9BC5, 0xC39F, 0x9BC6, 0xC3A0, 0x9BC7, 0xC3A1, 0x9BC8, 0xC3A2, 0x9BC9, 0xC3A3, 0x9BCA, + 0xC3A4, 0x9BCB, 0xC3A5, 0x9BCC, 0xC3A6, 0x9BCD, 0xC3A7, 0x9BCE, 0xC3A8, 0x9BCF, 0xC3A9, 0x9BD0, 0xC3AA, 0x9BD1, 0xC3AB, 0x9BD2, + 0xC3AC, 0x9BD3, 0xC3AD, 0x9BD4, 0xC3AE, 0x9BD5, 0xC3AF, 0x9BD6, 0xC3B0, 0x9BD7, 0xC3B1, 0x9BD8, 0xC3B2, 0x9BD9, 0xC3B3, 0x9BDA, + 0xC3B4, 0x9BDB, 0xC3B5, 0x9BDC, 0xC3B6, 0x9BDD, 0xC3B7, 0x9BDE, 0xC3B8, 0x9BDF, 0xC3B9, 0x9BE0, 0xC3BA, 0x9BE1, 0xC3BB, 0x9BE2, + 0xC3BC, 0x9BE3, 0xC3BD, 0x9BE4, 0xC3BE, 0x9BE5, 0xC3BF, 0x9BE6, 0xC3C0, 0xBDED, 0xC3C1, 0x9BE7, 0xC3C2, 0x9BE8, 0xC3C3, 0x9BE9, + 0xC3C4, 0x9BEA, 0xC3C5, 0x9BEB, 0xC3C6, 0x9BEC, 0xC3C7, 0x9BED, 0xC3C8, 0x9BEE, 0xC3C9, 0x9BEF, 0xC3CA, 0x9BF0, 0xC3CB, 0x9BF1, + 0xC3CC, 0x9BF2, 0xC3CD, 0x9BF3, 0xC3CE, 0x9BF4, 0xC3CF, 0x9BF5, 0xC3D0, 0x9BF6, 0xC3D1, 0x9BF7, 0xC3D2, 0x9BF8, 0xC3D3, 0x9BF9, + 0xC3D4, 0x9BFA, 0xC3D5, 0x9BFB, 0xC3D6, 0x9BFC, 0xC3D7, 0x9BFD, 0xC3D8, 0xBDEE, 0xC3D9, 0xBDEF, 0xC3DA, 0x9BFE, 0xC3DB, 0x9C41, + 0xC3DC, 0xBDF0, 0xC3DD, 0x9C42, 0xC3DE, 0x9C43, 0xC3DF, 0xBDF1, 0xC3E0, 0xBDF2, 0xC3E1, 0x9C44, 0xC3E2, 0xBDF3, 0xC3E3, 0x9C45, + 0xC3E4, 0x9C46, 0xC3E5, 0x9C47, 0xC3E6, 0x9C48, 0xC3E7, 0x9C49, 0xC3E8, 0xBDF4, 0xC3E9, 0xBDF5, 0xC3EA, 0x9C4A, 0xC3EB, 0x9C4B, + 0xC3EC, 0x9C4C, 0xC3ED, 0xBDF6, 0xC3EE, 0x9C4D, 0xC3EF, 0x9C4E, 0xC3F0, 0x9C4F, 0xC3F1, 0x9C50, 0xC3F2, 0x9C51, 0xC3F3, 0x9C52, + 0xC3F4, 0xBDF7, 0xC3F5, 0xBDF8, 0xC3F6, 0x9C53, 0xC3F7, 0x9C54, 0xC3F8, 0xBDF9, 0xC3F9, 0x9C55, 0xC3FA, 0x9C56, 0xC3FB, 0x9C57, + 0xC3FC, 0x9C58, 0xC3FD, 0x9C59, 0xC3FE, 0x9C5A, 0xC3FF, 0x9C61, 0xC400, 0x9C62, 0xC401, 0x9C63, 0xC402, 0x9C64, 0xC403, 0x9C65, + 0xC404, 0x9C66, 0xC405, 0x9C67, 0xC406, 0x9C68, 0xC407, 0x9C69, 0xC408, 0xBDFA, 0xC409, 0x9C6A, 0xC40A, 0x9C6B, 0xC40B, 0x9C6C, + 0xC40C, 0x9C6D, 0xC40D, 0x9C6E, 0xC40E, 0x9C6F, 0xC40F, 0x9C70, 0xC410, 0xBDFB, 0xC411, 0x9C71, 0xC412, 0x9C72, 0xC413, 0x9C73, + 0xC414, 0x9C74, 0xC415, 0x9C75, 0xC416, 0x9C76, 0xC417, 0x9C77, 0xC418, 0x9C78, 0xC419, 0x9C79, 0xC41A, 0x9C7A, 0xC41B, 0x9C81, + 0xC41C, 0x9C82, 0xC41D, 0x9C83, 0xC41E, 0x9C84, 0xC41F, 0x9C85, 0xC420, 0x9C86, 0xC421, 0x9C87, 0xC422, 0x9C88, 0xC423, 0x9C89, + 0xC424, 0xBDFC, 0xC425, 0x9C8A, 0xC426, 0x9C8B, 0xC427, 0x9C8C, 0xC428, 0x9C8D, 0xC429, 0x9C8E, 0xC42A, 0x9C8F, 0xC42B, 0x9C90, + 0xC42C, 0xBDFD, 0xC42D, 0x9C91, 0xC42E, 0x9C92, 0xC42F, 0x9C93, 0xC430, 0xBDFE, 0xC431, 0x9C94, 0xC432, 0x9C95, 0xC433, 0x9C96, + 0xC434, 0xBEA1, 0xC435, 0x9C97, 0xC436, 0x9C98, 0xC437, 0x9C99, 0xC438, 0x9C9A, 0xC439, 0x9C9B, 0xC43A, 0x9C9C, 0xC43B, 0x9C9D, + 0xC43C, 0xBEA2, 0xC43D, 0xBEA3, 0xC43E, 0x9C9E, 0xC43F, 0x9C9F, 0xC440, 0x9CA0, 0xC441, 0x9CA1, 0xC442, 0x9CA2, 0xC443, 0x9CA3, + 0xC444, 0x9CA4, 0xC445, 0x9CA5, 0xC446, 0x9CA6, 0xC447, 0x9CA7, 0xC448, 0xBEA4, 0xC449, 0x9CA8, 0xC44A, 0x9CA9, 0xC44B, 0x9CAA, + 0xC44C, 0x9CAB, 0xC44D, 0x9CAC, 0xC44E, 0x9CAD, 0xC44F, 0x9CAE, 0xC450, 0x9CAF, 0xC451, 0x9CB0, 0xC452, 0x9CB1, 0xC453, 0x9CB2, + 0xC454, 0x9CB3, 0xC455, 0x9CB4, 0xC456, 0x9CB5, 0xC457, 0x9CB6, 0xC458, 0x9CB7, 0xC459, 0x9CB8, 0xC45A, 0x9CB9, 0xC45B, 0x9CBA, + 0xC45C, 0x9CBB, 0xC45D, 0x9CBC, 0xC45E, 0x9CBD, 0xC45F, 0x9CBE, 0xC460, 0x9CBF, 0xC461, 0x9CC0, 0xC462, 0x9CC1, 0xC463, 0x9CC2, + 0xC464, 0xBEA5, 0xC465, 0xBEA6, 0xC466, 0x9CC3, 0xC467, 0x9CC4, 0xC468, 0xBEA7, 0xC469, 0x9CC5, 0xC46A, 0x9CC6, 0xC46B, 0x9CC7, + 0xC46C, 0xBEA8, 0xC46D, 0x9CC8, 0xC46E, 0x9CC9, 0xC46F, 0x9CCA, 0xC470, 0x9CCB, 0xC471, 0x9CCC, 0xC472, 0x9CCD, 0xC473, 0x9CCE, + 0xC474, 0xBEA9, 0xC475, 0xBEAA, 0xC476, 0x9CCF, 0xC477, 0x9CD0, 0xC478, 0x9CD1, 0xC479, 0xBEAB, 0xC47A, 0x9CD2, 0xC47B, 0x9CD3, + 0xC47C, 0x9CD4, 0xC47D, 0x9CD5, 0xC47E, 0x9CD6, 0xC47F, 0x9CD7, 0xC480, 0xBEAC, 0xC481, 0x9CD8, 0xC482, 0x9CD9, 0xC483, 0x9CDA, + 0xC484, 0x9CDB, 0xC485, 0x9CDC, 0xC486, 0x9CDD, 0xC487, 0x9CDE, 0xC488, 0x9CDF, 0xC489, 0x9CE0, 0xC48A, 0x9CE1, 0xC48B, 0x9CE2, + 0xC48C, 0x9CE3, 0xC48D, 0x9CE4, 0xC48E, 0x9CE5, 0xC48F, 0x9CE6, 0xC490, 0x9CE7, 0xC491, 0x9CE8, 0xC492, 0x9CE9, 0xC493, 0x9CEA, + 0xC494, 0xBEAD, 0xC495, 0x9CEB, 0xC496, 0x9CEC, 0xC497, 0x9CED, 0xC498, 0x9CEE, 0xC499, 0x9CEF, 0xC49A, 0x9CF0, 0xC49B, 0x9CF1, + 0xC49C, 0xBEAE, 0xC49D, 0x9CF2, 0xC49E, 0x9CF3, 0xC49F, 0x9CF4, 0xC4A0, 0x9CF5, 0xC4A1, 0x9CF6, 0xC4A2, 0x9CF7, 0xC4A3, 0x9CF8, + 0xC4A4, 0x9CF9, 0xC4A5, 0x9CFA, 0xC4A6, 0x9CFB, 0xC4A7, 0x9CFC, 0xC4A8, 0x9CFD, 0xC4A9, 0x9CFE, 0xC4AA, 0x9D41, 0xC4AB, 0x9D42, + 0xC4AC, 0x9D43, 0xC4AD, 0x9D44, 0xC4AE, 0x9D45, 0xC4AF, 0x9D46, 0xC4B0, 0x9D47, 0xC4B1, 0x9D48, 0xC4B2, 0x9D49, 0xC4B3, 0x9D4A, + 0xC4B4, 0x9D4B, 0xC4B5, 0x9D4C, 0xC4B6, 0x9D4D, 0xC4B7, 0x9D4E, 0xC4B8, 0xBEAF, 0xC4B9, 0x9D4F, 0xC4BA, 0x9D50, 0xC4BB, 0x9D51, + 0xC4BC, 0xBEB0, 0xC4BD, 0x9D52, 0xC4BE, 0x9D53, 0xC4BF, 0x9D54, 0xC4C0, 0x9D55, 0xC4C1, 0x9D56, 0xC4C2, 0x9D57, 0xC4C3, 0x9D58, + 0xC4C4, 0x9D59, 0xC4C5, 0x9D5A, 0xC4C6, 0x9D61, 0xC4C7, 0x9D62, 0xC4C8, 0x9D63, 0xC4C9, 0x9D64, 0xC4CA, 0x9D65, 0xC4CB, 0x9D66, + 0xC4CC, 0x9D67, 0xC4CD, 0x9D68, 0xC4CE, 0x9D69, 0xC4CF, 0x9D6A, 0xC4D0, 0x9D6B, 0xC4D1, 0x9D6C, 0xC4D2, 0x9D6D, 0xC4D3, 0x9D6E, + 0xC4D4, 0x9D6F, 0xC4D5, 0x9D70, 0xC4D6, 0x9D71, 0xC4D7, 0x9D72, 0xC4D8, 0x9D73, 0xC4D9, 0x9D74, 0xC4DA, 0x9D75, 0xC4DB, 0x9D76, + 0xC4DC, 0x9D77, 0xC4DD, 0x9D78, 0xC4DE, 0x9D79, 0xC4DF, 0x9D7A, 0xC4E0, 0x9D81, 0xC4E1, 0x9D82, 0xC4E2, 0x9D83, 0xC4E3, 0x9D84, + 0xC4E4, 0x9D85, 0xC4E5, 0x9D86, 0xC4E6, 0x9D87, 0xC4E7, 0x9D88, 0xC4E8, 0x9D89, 0xC4E9, 0xBEB1, 0xC4EA, 0x9D8A, 0xC4EB, 0x9D8B, + 0xC4EC, 0x9D8C, 0xC4ED, 0x9D8D, 0xC4EE, 0x9D8E, 0xC4EF, 0x9D8F, 0xC4F0, 0xBEB2, 0xC4F1, 0xBEB3, 0xC4F2, 0x9D90, 0xC4F3, 0x9D91, + 0xC4F4, 0xBEB4, 0xC4F5, 0x9D92, 0xC4F6, 0x9D93, 0xC4F7, 0x9D94, 0xC4F8, 0xBEB5, 0xC4F9, 0x9D95, 0xC4FA, 0xBEB6, 0xC4FB, 0x9D96, + 0xC4FC, 0x9D97, 0xC4FD, 0x9D98, 0xC4FE, 0x9D99, 0xC4FF, 0xBEB7, 0xC500, 0xBEB8, 0xC501, 0xBEB9, 0xC502, 0x9D9A, 0xC503, 0x9D9B, + 0xC504, 0x9D9C, 0xC505, 0x9D9D, 0xC506, 0x9D9E, 0xC507, 0x9D9F, 0xC508, 0x9DA0, 0xC509, 0x9DA1, 0xC50A, 0x9DA2, 0xC50B, 0x9DA3, + 0xC50C, 0xBEBA, 0xC50D, 0x9DA4, 0xC50E, 0x9DA5, 0xC50F, 0x9DA6, 0xC510, 0xBEBB, 0xC511, 0x9DA7, 0xC512, 0x9DA8, 0xC513, 0x9DA9, + 0xC514, 0xBEBC, 0xC515, 0x9DAA, 0xC516, 0x9DAB, 0xC517, 0x9DAC, 0xC518, 0x9DAD, 0xC519, 0x9DAE, 0xC51A, 0x9DAF, 0xC51B, 0x9DB0, + 0xC51C, 0xBEBD, 0xC51D, 0x9DB1, 0xC51E, 0x9DB2, 0xC51F, 0x9DB3, 0xC520, 0x9DB4, 0xC521, 0x9DB5, 0xC522, 0x9DB6, 0xC523, 0x9DB7, + 0xC524, 0x9DB8, 0xC525, 0x9DB9, 0xC526, 0x9DBA, 0xC527, 0x9DBB, 0xC528, 0xBEBE, 0xC529, 0xBEBF, 0xC52A, 0x9DBC, 0xC52B, 0x9DBD, + 0xC52C, 0xBEC0, 0xC52D, 0x9DBE, 0xC52E, 0x9DBF, 0xC52F, 0x9DC0, 0xC530, 0xBEC1, 0xC531, 0x9DC1, 0xC532, 0x9DC2, 0xC533, 0x9DC3, + 0xC534, 0x9DC4, 0xC535, 0x9DC5, 0xC536, 0x9DC6, 0xC537, 0x9DC7, 0xC538, 0xBEC2, 0xC539, 0xBEC3, 0xC53A, 0x9DC8, 0xC53B, 0xBEC4, + 0xC53C, 0x9DC9, 0xC53D, 0xBEC5, 0xC53E, 0x9DCA, 0xC53F, 0x9DCB, 0xC540, 0x9DCC, 0xC541, 0x9DCD, 0xC542, 0x9DCE, 0xC543, 0x9DCF, + 0xC544, 0xBEC6, 0xC545, 0xBEC7, 0xC546, 0x9DD0, 0xC547, 0x9DD1, 0xC548, 0xBEC8, 0xC549, 0xBEC9, 0xC54A, 0xBECA, 0xC54B, 0x9DD2, + 0xC54C, 0xBECB, 0xC54D, 0xBECC, 0xC54E, 0xBECD, 0xC54F, 0x9DD3, 0xC550, 0x9DD4, 0xC551, 0x9DD5, 0xC552, 0x9DD6, 0xC553, 0xBECE, + 0xC554, 0xBECF, 0xC555, 0xBED0, 0xC556, 0x9DD7, 0xC557, 0xBED1, 0xC558, 0xBED2, 0xC559, 0xBED3, 0xC55A, 0x9DD8, 0xC55B, 0x9DD9, + 0xC55C, 0x9DDA, 0xC55D, 0xBED4, 0xC55E, 0xBED5, 0xC55F, 0x9DDB, 0xC560, 0xBED6, 0xC561, 0xBED7, 0xC562, 0x9DDC, 0xC563, 0x9DDD, + 0xC564, 0xBED8, 0xC565, 0x9DDE, 0xC566, 0x9DDF, 0xC567, 0x9DE0, 0xC568, 0xBED9, 0xC569, 0x9DE1, 0xC56A, 0x9DE2, 0xC56B, 0x9DE3, + 0xC56C, 0x9DE4, 0xC56D, 0x9DE5, 0xC56E, 0x9DE6, 0xC56F, 0x9DE7, 0xC570, 0xBEDA, 0xC571, 0xBEDB, 0xC572, 0x9DE8, 0xC573, 0xBEDC, + 0xC574, 0xBEDD, 0xC575, 0xBEDE, 0xC576, 0x9DE9, 0xC577, 0x9DEA, 0xC578, 0x9DEB, 0xC579, 0x9DEC, 0xC57A, 0x9DED, 0xC57B, 0x9DEE, + 0xC57C, 0xBEDF, 0xC57D, 0xBEE0, 0xC57E, 0x9DEF, 0xC57F, 0x9DF0, 0xC580, 0xBEE1, 0xC581, 0x9DF1, 0xC582, 0x9DF2, 0xC583, 0x9DF3, + 0xC584, 0xBEE2, 0xC585, 0x9DF4, 0xC586, 0x9DF5, 0xC587, 0xBEE3, 0xC588, 0x9DF6, 0xC589, 0x9DF7, 0xC58A, 0x9DF8, 0xC58B, 0x9DF9, + 0xC58C, 0xBEE4, 0xC58D, 0xBEE5, 0xC58E, 0x9DFA, 0xC58F, 0xBEE6, 0xC590, 0x9DFB, 0xC591, 0xBEE7, 0xC592, 0x9DFC, 0xC593, 0x9DFD, + 0xC594, 0x9DFE, 0xC595, 0xBEE8, 0xC596, 0x9E41, 0xC597, 0xBEE9, 0xC598, 0xBEEA, 0xC599, 0x9E42, 0xC59A, 0x9E43, 0xC59B, 0x9E44, + 0xC59C, 0xBEEB, 0xC59D, 0x9E45, 0xC59E, 0x9E46, 0xC59F, 0x9E47, 0xC5A0, 0xBEEC, 0xC5A1, 0x9E48, 0xC5A2, 0x9E49, 0xC5A3, 0x9E4A, + 0xC5A4, 0x9E4B, 0xC5A5, 0x9E4C, 0xC5A6, 0x9E4D, 0xC5A7, 0x9E4E, 0xC5A8, 0x9E4F, 0xC5A9, 0xBEED, 0xC5AA, 0x9E50, 0xC5AB, 0x9E51, + 0xC5AC, 0x9E52, 0xC5AD, 0x9E53, 0xC5AE, 0x9E54, 0xC5AF, 0x9E55, 0xC5B0, 0x9E56, 0xC5B1, 0x9E57, 0xC5B2, 0x9E58, 0xC5B3, 0x9E59, + 0xC5B4, 0xBEEE, 0xC5B5, 0xBEEF, 0xC5B6, 0x9E5A, 0xC5B7, 0x9E61, 0xC5B8, 0xBEF0, 0xC5B9, 0xBEF1, 0xC5BA, 0x9E62, 0xC5BB, 0xBEF2, + 0xC5BC, 0xBEF3, 0xC5BD, 0xBEF4, 0xC5BE, 0xBEF5, 0xC5BF, 0x9E63, 0xC5C0, 0x9E64, 0xC5C1, 0x9E65, 0xC5C2, 0x9E66, 0xC5C3, 0x9E67, + 0xC5C4, 0xBEF6, 0xC5C5, 0xBEF7, 0xC5C6, 0xBEF8, 0xC5C7, 0xBEF9, 0xC5C8, 0xBEFA, 0xC5C9, 0xBEFB, 0xC5CA, 0xBEFC, 0xC5CB, 0x9E68, + 0xC5CC, 0xBEFD, 0xC5CD, 0x9E69, 0xC5CE, 0xBEFE, 0xC5CF, 0x9E6A, 0xC5D0, 0xBFA1, 0xC5D1, 0xBFA2, 0xC5D2, 0x9E6B, 0xC5D3, 0x9E6C, + 0xC5D4, 0xBFA3, 0xC5D5, 0x9E6D, 0xC5D6, 0x9E6E, 0xC5D7, 0x9E6F, 0xC5D8, 0xBFA4, 0xC5D9, 0x9E70, 0xC5DA, 0x9E71, 0xC5DB, 0x9E72, + 0xC5DC, 0x9E73, 0xC5DD, 0x9E74, 0xC5DE, 0x9E75, 0xC5DF, 0x9E76, 0xC5E0, 0xBFA5, 0xC5E1, 0xBFA6, 0xC5E2, 0x9E77, 0xC5E3, 0xBFA7, + 0xC5E4, 0x9E78, 0xC5E5, 0xBFA8, 0xC5E6, 0x9E79, 0xC5E7, 0x9E7A, 0xC5E8, 0x9E81, 0xC5E9, 0x9E82, 0xC5EA, 0x9E83, 0xC5EB, 0x9E84, + 0xC5EC, 0xBFA9, 0xC5ED, 0xBFAA, 0xC5EE, 0xBFAB, 0xC5EF, 0x9E85, 0xC5F0, 0xBFAC, 0xC5F1, 0x9E86, 0xC5F2, 0x9E87, 0xC5F3, 0x9E88, + 0xC5F4, 0xBFAD, 0xC5F5, 0x9E89, 0xC5F6, 0xBFAE, 0xC5F7, 0xBFAF, 0xC5F8, 0x9E8A, 0xC5F9, 0x9E8B, 0xC5FA, 0x9E8C, 0xC5FB, 0x9E8D, + 0xC5FC, 0xBFB0, 0xC5FD, 0xBFB1, 0xC5FE, 0xBFB2, 0xC5FF, 0xBFB3, 0xC600, 0xBFB4, 0xC601, 0xBFB5, 0xC602, 0x9E8E, 0xC603, 0x9E8F, + 0xC604, 0x9E90, 0xC605, 0xBFB6, 0xC606, 0xBFB7, 0xC607, 0xBFB8, 0xC608, 0xBFB9, 0xC609, 0x9E91, 0xC60A, 0x9E92, 0xC60B, 0x9E93, + 0xC60C, 0xBFBA, 0xC60D, 0x9E94, 0xC60E, 0x9E95, 0xC60F, 0x9E96, 0xC610, 0xBFBB, 0xC611, 0x9E97, 0xC612, 0x9E98, 0xC613, 0x9E99, + 0xC614, 0x9E9A, 0xC615, 0x9E9B, 0xC616, 0x9E9C, 0xC617, 0x9E9D, 0xC618, 0xBFBC, 0xC619, 0xBFBD, 0xC61A, 0x9E9E, 0xC61B, 0xBFBE, + 0xC61C, 0xBFBF, 0xC61D, 0x9E9F, 0xC61E, 0x9EA0, 0xC61F, 0x9EA1, 0xC620, 0x9EA2, 0xC621, 0x9EA3, 0xC622, 0x9EA4, 0xC623, 0x9EA5, + 0xC624, 0xBFC0, 0xC625, 0xBFC1, 0xC626, 0x9EA6, 0xC627, 0x9EA7, 0xC628, 0xBFC2, 0xC629, 0x9EA8, 0xC62A, 0x9EA9, 0xC62B, 0x9EAA, + 0xC62C, 0xBFC3, 0xC62D, 0xBFC4, 0xC62E, 0xBFC5, 0xC62F, 0x9EAB, 0xC630, 0xBFC6, 0xC631, 0x9EAC, 0xC632, 0x9EAD, 0xC633, 0xBFC7, + 0xC634, 0xBFC8, 0xC635, 0xBFC9, 0xC636, 0x9EAE, 0xC637, 0xBFCA, 0xC638, 0x9EAF, 0xC639, 0xBFCB, 0xC63A, 0x9EB0, 0xC63B, 0xBFCC, + 0xC63C, 0x9EB1, 0xC63D, 0x9EB2, 0xC63E, 0x9EB3, 0xC63F, 0x9EB4, 0xC640, 0xBFCD, 0xC641, 0xBFCE, 0xC642, 0x9EB5, 0xC643, 0x9EB6, + 0xC644, 0xBFCF, 0xC645, 0x9EB7, 0xC646, 0x9EB8, 0xC647, 0x9EB9, 0xC648, 0xBFD0, 0xC649, 0x9EBA, 0xC64A, 0x9EBB, 0xC64B, 0x9EBC, + 0xC64C, 0x9EBD, 0xC64D, 0x9EBE, 0xC64E, 0x9EBF, 0xC64F, 0x9EC0, 0xC650, 0xBFD1, 0xC651, 0xBFD2, 0xC652, 0x9EC1, 0xC653, 0xBFD3, + 0xC654, 0xBFD4, 0xC655, 0xBFD5, 0xC656, 0x9EC2, 0xC657, 0x9EC3, 0xC658, 0x9EC4, 0xC659, 0x9EC5, 0xC65A, 0x9EC6, 0xC65B, 0x9EC7, + 0xC65C, 0xBFD6, 0xC65D, 0xBFD7, 0xC65E, 0x9EC8, 0xC65F, 0x9EC9, 0xC660, 0xBFD8, 0xC661, 0x9ECA, 0xC662, 0x9ECB, 0xC663, 0x9ECC, + 0xC664, 0x9ECD, 0xC665, 0x9ECE, 0xC666, 0x9ECF, 0xC667, 0x9ED0, 0xC668, 0x9ED1, 0xC669, 0x9ED2, 0xC66A, 0x9ED3, 0xC66B, 0x9ED4, + 0xC66C, 0xBFD9, 0xC66D, 0x9ED5, 0xC66E, 0x9ED6, 0xC66F, 0xBFDA, 0xC670, 0x9ED7, 0xC671, 0xBFDB, 0xC672, 0x9ED8, 0xC673, 0x9ED9, + 0xC674, 0x9EDA, 0xC675, 0x9EDB, 0xC676, 0x9EDC, 0xC677, 0x9EDD, 0xC678, 0xBFDC, 0xC679, 0xBFDD, 0xC67A, 0x9EDE, 0xC67B, 0x9EDF, + 0xC67C, 0xBFDE, 0xC67D, 0x9EE0, 0xC67E, 0x9EE1, 0xC67F, 0x9EE2, 0xC680, 0xBFDF, 0xC681, 0x9EE3, 0xC682, 0x9EE4, 0xC683, 0x9EE5, + 0xC684, 0x9EE6, 0xC685, 0x9EE7, 0xC686, 0x9EE8, 0xC687, 0x9EE9, 0xC688, 0xBFE0, 0xC689, 0xBFE1, 0xC68A, 0x9EEA, 0xC68B, 0xBFE2, + 0xC68C, 0x9EEB, 0xC68D, 0xBFE3, 0xC68E, 0x9EEC, 0xC68F, 0x9EED, 0xC690, 0x9EEE, 0xC691, 0x9EEF, 0xC692, 0x9EF0, 0xC693, 0x9EF1, + 0xC694, 0xBFE4, 0xC695, 0xBFE5, 0xC696, 0x9EF2, 0xC697, 0x9EF3, 0xC698, 0xBFE6, 0xC699, 0x9EF4, 0xC69A, 0x9EF5, 0xC69B, 0x9EF6, + 0xC69C, 0xBFE7, 0xC69D, 0x9EF7, 0xC69E, 0x9EF8, 0xC69F, 0x9EF9, 0xC6A0, 0x9EFA, 0xC6A1, 0x9EFB, 0xC6A2, 0x9EFC, 0xC6A3, 0x9EFD, + 0xC6A4, 0xBFE8, 0xC6A5, 0xBFE9, 0xC6A6, 0x9EFE, 0xC6A7, 0xBFEA, 0xC6A8, 0x9F41, 0xC6A9, 0xBFEB, 0xC6AA, 0x9F42, 0xC6AB, 0x9F43, + 0xC6AC, 0x9F44, 0xC6AD, 0x9F45, 0xC6AE, 0x9F46, 0xC6AF, 0x9F47, 0xC6B0, 0xBFEC, 0xC6B1, 0xBFED, 0xC6B2, 0x9F48, 0xC6B3, 0x9F49, + 0xC6B4, 0xBFEE, 0xC6B5, 0x9F4A, 0xC6B6, 0x9F4B, 0xC6B7, 0x9F4C, 0xC6B8, 0xBFEF, 0xC6B9, 0xBFF0, 0xC6BA, 0xBFF1, 0xC6BB, 0x9F4D, + 0xC6BC, 0x9F4E, 0xC6BD, 0x9F4F, 0xC6BE, 0x9F50, 0xC6BF, 0x9F51, 0xC6C0, 0xBFF2, 0xC6C1, 0xBFF3, 0xC6C2, 0x9F52, 0xC6C3, 0xBFF4, + 0xC6C4, 0x9F53, 0xC6C5, 0xBFF5, 0xC6C6, 0x9F54, 0xC6C7, 0x9F55, 0xC6C8, 0x9F56, 0xC6C9, 0x9F57, 0xC6CA, 0x9F58, 0xC6CB, 0x9F59, + 0xC6CC, 0xBFF6, 0xC6CD, 0xBFF7, 0xC6CE, 0x9F5A, 0xC6CF, 0x9F61, 0xC6D0, 0xBFF8, 0xC6D1, 0x9F62, 0xC6D2, 0x9F63, 0xC6D3, 0x9F64, + 0xC6D4, 0xBFF9, 0xC6D5, 0x9F65, 0xC6D6, 0x9F66, 0xC6D7, 0x9F67, 0xC6D8, 0x9F68, 0xC6D9, 0x9F69, 0xC6DA, 0x9F6A, 0xC6DB, 0x9F6B, + 0xC6DC, 0xBFFA, 0xC6DD, 0xBFFB, 0xC6DE, 0x9F6C, 0xC6DF, 0x9F6D, 0xC6E0, 0xBFFC, 0xC6E1, 0xBFFD, 0xC6E2, 0x9F6E, 0xC6E3, 0x9F6F, + 0xC6E4, 0x9F70, 0xC6E5, 0x9F71, 0xC6E6, 0x9F72, 0xC6E7, 0x9F73, 0xC6E8, 0xBFFE, 0xC6E9, 0xC0A1, 0xC6EA, 0x9F74, 0xC6EB, 0x9F75, + 0xC6EC, 0xC0A2, 0xC6ED, 0x9F76, 0xC6EE, 0x9F77, 0xC6EF, 0x9F78, 0xC6F0, 0xC0A3, 0xC6F1, 0x9F79, 0xC6F2, 0x9F7A, 0xC6F3, 0x9F81, + 0xC6F4, 0x9F82, 0xC6F5, 0x9F83, 0xC6F6, 0x9F84, 0xC6F7, 0x9F85, 0xC6F8, 0xC0A4, 0xC6F9, 0xC0A5, 0xC6FA, 0x9F86, 0xC6FB, 0x9F87, + 0xC6FC, 0x9F88, 0xC6FD, 0xC0A6, 0xC6FE, 0x9F89, 0xC6FF, 0x9F8A, 0xC700, 0x9F8B, 0xC701, 0x9F8C, 0xC702, 0x9F8D, 0xC703, 0x9F8E, + 0xC704, 0xC0A7, 0xC705, 0xC0A8, 0xC706, 0x9F8F, 0xC707, 0x9F90, 0xC708, 0xC0A9, 0xC709, 0x9F91, 0xC70A, 0x9F92, 0xC70B, 0x9F93, + 0xC70C, 0xC0AA, 0xC70D, 0x9F94, 0xC70E, 0x9F95, 0xC70F, 0x9F96, 0xC710, 0x9F97, 0xC711, 0x9F98, 0xC712, 0x9F99, 0xC713, 0x9F9A, + 0xC714, 0xC0AB, 0xC715, 0xC0AC, 0xC716, 0x9F9B, 0xC717, 0xC0AD, 0xC718, 0x9F9C, 0xC719, 0xC0AE, 0xC71A, 0x9F9D, 0xC71B, 0x9F9E, + 0xC71C, 0x9F9F, 0xC71D, 0x9FA0, 0xC71E, 0x9FA1, 0xC71F, 0x9FA2, 0xC720, 0xC0AF, 0xC721, 0xC0B0, 0xC722, 0x9FA3, 0xC723, 0x9FA4, + 0xC724, 0xC0B1, 0xC725, 0x9FA5, 0xC726, 0x9FA6, 0xC727, 0x9FA7, 0xC728, 0xC0B2, 0xC729, 0x9FA8, 0xC72A, 0x9FA9, 0xC72B, 0x9FAA, + 0xC72C, 0x9FAB, 0xC72D, 0x9FAC, 0xC72E, 0x9FAD, 0xC72F, 0x9FAE, 0xC730, 0xC0B3, 0xC731, 0xC0B4, 0xC732, 0x9FAF, 0xC733, 0xC0B5, + 0xC734, 0x9FB0, 0xC735, 0xC0B6, 0xC736, 0x9FB1, 0xC737, 0xC0B7, 0xC738, 0x9FB2, 0xC739, 0x9FB3, 0xC73A, 0x9FB4, 0xC73B, 0x9FB5, + 0xC73C, 0xC0B8, 0xC73D, 0xC0B9, 0xC73E, 0x9FB6, 0xC73F, 0x9FB7, 0xC740, 0xC0BA, 0xC741, 0x9FB8, 0xC742, 0x9FB9, 0xC743, 0x9FBA, + 0xC744, 0xC0BB, 0xC745, 0x9FBB, 0xC746, 0x9FBC, 0xC747, 0x9FBD, 0xC748, 0x9FBE, 0xC749, 0x9FBF, 0xC74A, 0xC0BC, 0xC74B, 0x9FC0, + 0xC74C, 0xC0BD, 0xC74D, 0xC0BE, 0xC74E, 0x9FC1, 0xC74F, 0xC0BF, 0xC750, 0x9FC2, 0xC751, 0xC0C0, 0xC752, 0xC0C1, 0xC753, 0xC0C2, + 0xC754, 0xC0C3, 0xC755, 0xC0C4, 0xC756, 0xC0C5, 0xC757, 0xC0C6, 0xC758, 0xC0C7, 0xC759, 0x9FC3, 0xC75A, 0x9FC4, 0xC75B, 0x9FC5, + 0xC75C, 0xC0C8, 0xC75D, 0x9FC6, 0xC75E, 0x9FC7, 0xC75F, 0x9FC8, 0xC760, 0xC0C9, 0xC761, 0x9FC9, 0xC762, 0x9FCA, 0xC763, 0x9FCB, + 0xC764, 0x9FCC, 0xC765, 0x9FCD, 0xC766, 0x9FCE, 0xC767, 0x9FCF, 0xC768, 0xC0CA, 0xC769, 0x9FD0, 0xC76A, 0x9FD1, 0xC76B, 0xC0CB, + 0xC76C, 0x9FD2, 0xC76D, 0x9FD3, 0xC76E, 0x9FD4, 0xC76F, 0x9FD5, 0xC770, 0x9FD6, 0xC771, 0x9FD7, 0xC772, 0x9FD8, 0xC773, 0x9FD9, + 0xC774, 0xC0CC, 0xC775, 0xC0CD, 0xC776, 0x9FDA, 0xC777, 0x9FDB, 0xC778, 0xC0CE, 0xC779, 0x9FDC, 0xC77A, 0x9FDD, 0xC77B, 0x9FDE, + 0xC77C, 0xC0CF, 0xC77D, 0xC0D0, 0xC77E, 0xC0D1, 0xC77F, 0x9FDF, 0xC780, 0x9FE0, 0xC781, 0x9FE1, 0xC782, 0x9FE2, 0xC783, 0xC0D2, + 0xC784, 0xC0D3, 0xC785, 0xC0D4, 0xC786, 0x9FE3, 0xC787, 0xC0D5, 0xC788, 0xC0D6, 0xC789, 0xC0D7, 0xC78A, 0xC0D8, 0xC78B, 0x9FE4, + 0xC78C, 0x9FE5, 0xC78D, 0x9FE6, 0xC78E, 0xC0D9, 0xC78F, 0x9FE7, 0xC790, 0xC0DA, 0xC791, 0xC0DB, 0xC792, 0x9FE8, 0xC793, 0x9FE9, + 0xC794, 0xC0DC, 0xC795, 0x9FEA, 0xC796, 0xC0DD, 0xC797, 0xC0DE, 0xC798, 0xC0DF, 0xC799, 0x9FEB, 0xC79A, 0xC0E0, 0xC79B, 0x9FEC, + 0xC79C, 0x9FED, 0xC79D, 0x9FEE, 0xC79E, 0x9FEF, 0xC79F, 0x9FF0, 0xC7A0, 0xC0E1, 0xC7A1, 0xC0E2, 0xC7A2, 0x9FF1, 0xC7A3, 0xC0E3, + 0xC7A4, 0xC0E4, 0xC7A5, 0xC0E5, 0xC7A6, 0xC0E6, 0xC7A7, 0x9FF2, 0xC7A8, 0x9FF3, 0xC7A9, 0x9FF4, 0xC7AA, 0x9FF5, 0xC7AB, 0x9FF6, + 0xC7AC, 0xC0E7, 0xC7AD, 0xC0E8, 0xC7AE, 0x9FF7, 0xC7AF, 0x9FF8, 0xC7B0, 0xC0E9, 0xC7B1, 0x9FF9, 0xC7B2, 0x9FFA, 0xC7B3, 0x9FFB, + 0xC7B4, 0xC0EA, 0xC7B5, 0x9FFC, 0xC7B6, 0x9FFD, 0xC7B7, 0x9FFE, 0xC7B8, 0xA041, 0xC7B9, 0xA042, 0xC7BA, 0xA043, 0xC7BB, 0xA044, + 0xC7BC, 0xC0EB, 0xC7BD, 0xC0EC, 0xC7BE, 0xA045, 0xC7BF, 0xC0ED, 0xC7C0, 0xC0EE, 0xC7C1, 0xC0EF, 0xC7C2, 0xA046, 0xC7C3, 0xA047, + 0xC7C4, 0xA048, 0xC7C5, 0xA049, 0xC7C6, 0xA04A, 0xC7C7, 0xA04B, 0xC7C8, 0xC0F0, 0xC7C9, 0xC0F1, 0xC7CA, 0xA04C, 0xC7CB, 0xA04D, + 0xC7CC, 0xC0F2, 0xC7CD, 0xA04E, 0xC7CE, 0xC0F3, 0xC7CF, 0xA04F, 0xC7D0, 0xC0F4, 0xC7D1, 0xA050, 0xC7D2, 0xA051, 0xC7D3, 0xA052, + 0xC7D4, 0xA053, 0xC7D5, 0xA054, 0xC7D6, 0xA055, 0xC7D7, 0xA056, 0xC7D8, 0xC0F5, 0xC7D9, 0xA057, 0xC7DA, 0xA058, 0xC7DB, 0xA059, + 0xC7DC, 0xA05A, 0xC7DD, 0xC0F6, 0xC7DE, 0xA061, 0xC7DF, 0xA062, 0xC7E0, 0xA063, 0xC7E1, 0xA064, 0xC7E2, 0xA065, 0xC7E3, 0xA066, + 0xC7E4, 0xC0F7, 0xC7E5, 0xA067, 0xC7E6, 0xA068, 0xC7E7, 0xA069, 0xC7E8, 0xC0F8, 0xC7E9, 0xA06A, 0xC7EA, 0xA06B, 0xC7EB, 0xA06C, + 0xC7EC, 0xC0F9, 0xC7ED, 0xA06D, 0xC7EE, 0xA06E, 0xC7EF, 0xA06F, 0xC7F0, 0xA070, 0xC7F1, 0xA071, 0xC7F2, 0xA072, 0xC7F3, 0xA073, + 0xC7F4, 0xA074, 0xC7F5, 0xA075, 0xC7F6, 0xA076, 0xC7F7, 0xA077, 0xC7F8, 0xA078, 0xC7F9, 0xA079, 0xC7FA, 0xA07A, 0xC7FB, 0xA081, + 0xC7FC, 0xA082, 0xC7FD, 0xA083, 0xC7FE, 0xA084, 0xC7FF, 0xA085, 0xC800, 0xC0FA, 0xC801, 0xC0FB, 0xC802, 0xA086, 0xC803, 0xA087, + 0xC804, 0xC0FC, 0xC805, 0xA088, 0xC806, 0xA089, 0xC807, 0xA08A, 0xC808, 0xC0FD, 0xC809, 0xA08B, 0xC80A, 0xC0FE, 0xC80B, 0xA08C, + 0xC80C, 0xA08D, 0xC80D, 0xA08E, 0xC80E, 0xA08F, 0xC80F, 0xA090, 0xC810, 0xC1A1, 0xC811, 0xC1A2, 0xC812, 0xA091, 0xC813, 0xC1A3, + 0xC814, 0xA092, 0xC815, 0xC1A4, 0xC816, 0xC1A5, 0xC817, 0xA093, 0xC818, 0xA094, 0xC819, 0xA095, 0xC81A, 0xA096, 0xC81B, 0xA097, + 0xC81C, 0xC1A6, 0xC81D, 0xC1A7, 0xC81E, 0xA098, 0xC81F, 0xA099, 0xC820, 0xC1A8, 0xC821, 0xA09A, 0xC822, 0xA09B, 0xC823, 0xA09C, + 0xC824, 0xC1A9, 0xC825, 0xA09D, 0xC826, 0xA09E, 0xC827, 0xA09F, 0xC828, 0xA0A0, 0xC829, 0xA0A1, 0xC82A, 0xA0A2, 0xC82B, 0xA0A3, + 0xC82C, 0xC1AA, 0xC82D, 0xC1AB, 0xC82E, 0xA0A4, 0xC82F, 0xC1AC, 0xC830, 0xA0A5, 0xC831, 0xC1AD, 0xC832, 0xA0A6, 0xC833, 0xA0A7, + 0xC834, 0xA0A8, 0xC835, 0xA0A9, 0xC836, 0xA0AA, 0xC837, 0xA0AB, 0xC838, 0xC1AE, 0xC839, 0xA0AC, 0xC83A, 0xA0AD, 0xC83B, 0xA0AE, + 0xC83C, 0xC1AF, 0xC83D, 0xA0AF, 0xC83E, 0xA0B0, 0xC83F, 0xA0B1, 0xC840, 0xC1B0, 0xC841, 0xA0B2, 0xC842, 0xA0B3, 0xC843, 0xA0B4, + 0xC844, 0xA0B5, 0xC845, 0xA0B6, 0xC846, 0xA0B7, 0xC847, 0xA0B8, 0xC848, 0xC1B1, 0xC849, 0xC1B2, 0xC84A, 0xA0B9, 0xC84B, 0xA0BA, + 0xC84C, 0xC1B3, 0xC84D, 0xC1B4, 0xC84E, 0xA0BB, 0xC84F, 0xA0BC, 0xC850, 0xA0BD, 0xC851, 0xA0BE, 0xC852, 0xA0BF, 0xC853, 0xA0C0, + 0xC854, 0xC1B5, 0xC855, 0xA0C1, 0xC856, 0xA0C2, 0xC857, 0xA0C3, 0xC858, 0xA0C4, 0xC859, 0xA0C5, 0xC85A, 0xA0C6, 0xC85B, 0xA0C7, + 0xC85C, 0xA0C8, 0xC85D, 0xA0C9, 0xC85E, 0xA0CA, 0xC85F, 0xA0CB, 0xC860, 0xA0CC, 0xC861, 0xA0CD, 0xC862, 0xA0CE, 0xC863, 0xA0CF, + 0xC864, 0xA0D0, 0xC865, 0xA0D1, 0xC866, 0xA0D2, 0xC867, 0xA0D3, 0xC868, 0xA0D4, 0xC869, 0xA0D5, 0xC86A, 0xA0D6, 0xC86B, 0xA0D7, + 0xC86C, 0xA0D8, 0xC86D, 0xA0D9, 0xC86E, 0xA0DA, 0xC86F, 0xA0DB, 0xC870, 0xC1B6, 0xC871, 0xC1B7, 0xC872, 0xA0DC, 0xC873, 0xA0DD, + 0xC874, 0xC1B8, 0xC875, 0xA0DE, 0xC876, 0xA0DF, 0xC877, 0xA0E0, 0xC878, 0xC1B9, 0xC879, 0xA0E1, 0xC87A, 0xC1BA, 0xC87B, 0xA0E2, + 0xC87C, 0xA0E3, 0xC87D, 0xA0E4, 0xC87E, 0xA0E5, 0xC87F, 0xA0E6, 0xC880, 0xC1BB, 0xC881, 0xC1BC, 0xC882, 0xA0E7, 0xC883, 0xC1BD, + 0xC884, 0xA0E8, 0xC885, 0xC1BE, 0xC886, 0xC1BF, 0xC887, 0xC1C0, 0xC888, 0xA0E9, 0xC889, 0xA0EA, 0xC88A, 0xA0EB, 0xC88B, 0xC1C1, + 0xC88C, 0xC1C2, 0xC88D, 0xC1C3, 0xC88E, 0xA0EC, 0xC88F, 0xA0ED, 0xC890, 0xA0EE, 0xC891, 0xA0EF, 0xC892, 0xA0F0, 0xC893, 0xA0F1, + 0xC894, 0xC1C4, 0xC895, 0xA0F2, 0xC896, 0xA0F3, 0xC897, 0xA0F4, 0xC898, 0xA0F5, 0xC899, 0xA0F6, 0xC89A, 0xA0F7, 0xC89B, 0xA0F8, + 0xC89C, 0xA0F9, 0xC89D, 0xC1C5, 0xC89E, 0xA0FA, 0xC89F, 0xC1C6, 0xC8A0, 0xA0FB, 0xC8A1, 0xC1C7, 0xC8A2, 0xA0FC, 0xC8A3, 0xA0FD, + 0xC8A4, 0xA0FE, 0xC8A5, 0xA141, 0xC8A6, 0xA142, 0xC8A7, 0xA143, 0xC8A8, 0xC1C8, 0xC8A9, 0xA144, 0xC8AA, 0xA145, 0xC8AB, 0xA146, + 0xC8AC, 0xA147, 0xC8AD, 0xA148, 0xC8AE, 0xA149, 0xC8AF, 0xA14A, 0xC8B0, 0xA14B, 0xC8B1, 0xA14C, 0xC8B2, 0xA14D, 0xC8B3, 0xA14E, + 0xC8B4, 0xA14F, 0xC8B5, 0xA150, 0xC8B6, 0xA151, 0xC8B7, 0xA152, 0xC8B8, 0xA153, 0xC8B9, 0xA154, 0xC8BA, 0xA155, 0xC8BB, 0xA156, + 0xC8BC, 0xC1C9, 0xC8BD, 0xC1CA, 0xC8BE, 0xA157, 0xC8BF, 0xA158, 0xC8C0, 0xA159, 0xC8C1, 0xA15A, 0xC8C2, 0xA161, 0xC8C3, 0xA162, + 0xC8C4, 0xC1CB, 0xC8C5, 0xA163, 0xC8C6, 0xA164, 0xC8C7, 0xA165, 0xC8C8, 0xC1CC, 0xC8C9, 0xA166, 0xC8CA, 0xA167, 0xC8CB, 0xA168, + 0xC8CC, 0xC1CD, 0xC8CD, 0xA169, 0xC8CE, 0xA16A, 0xC8CF, 0xA16B, 0xC8D0, 0xA16C, 0xC8D1, 0xA16D, 0xC8D2, 0xA16E, 0xC8D3, 0xA16F, + 0xC8D4, 0xC1CE, 0xC8D5, 0xC1CF, 0xC8D6, 0xA170, 0xC8D7, 0xC1D0, 0xC8D8, 0xA171, 0xC8D9, 0xC1D1, 0xC8DA, 0xA172, 0xC8DB, 0xA173, + 0xC8DC, 0xA174, 0xC8DD, 0xA175, 0xC8DE, 0xA176, 0xC8DF, 0xA177, 0xC8E0, 0xC1D2, 0xC8E1, 0xC1D3, 0xC8E2, 0xA178, 0xC8E3, 0xA179, + 0xC8E4, 0xC1D4, 0xC8E5, 0xA17A, 0xC8E6, 0xA181, 0xC8E7, 0xA182, 0xC8E8, 0xA183, 0xC8E9, 0xA184, 0xC8EA, 0xA185, 0xC8EB, 0xA186, + 0xC8EC, 0xA187, 0xC8ED, 0xA188, 0xC8EE, 0xA189, 0xC8EF, 0xA18A, 0xC8F0, 0xA18B, 0xC8F1, 0xA18C, 0xC8F2, 0xA18D, 0xC8F3, 0xA18E, + 0xC8F4, 0xA18F, 0xC8F5, 0xC1D5, 0xC8F6, 0xA190, 0xC8F7, 0xA191, 0xC8F8, 0xA192, 0xC8F9, 0xA193, 0xC8FA, 0xA194, 0xC8FB, 0xA195, + 0xC8FC, 0xC1D6, 0xC8FD, 0xC1D7, 0xC8FE, 0xA196, 0xC8FF, 0xA197, 0xC900, 0xC1D8, 0xC901, 0xA198, 0xC902, 0xA199, 0xC903, 0xA19A, + 0xC904, 0xC1D9, 0xC905, 0xC1DA, 0xC906, 0xC1DB, 0xC907, 0xA19B, 0xC908, 0xA19C, 0xC909, 0xA19D, 0xC90A, 0xA19E, 0xC90B, 0xA19F, + 0xC90C, 0xC1DC, 0xC90D, 0xC1DD, 0xC90E, 0xA1A0, 0xC90F, 0xC1DE, 0xC910, 0xA241, 0xC911, 0xC1DF, 0xC912, 0xA242, 0xC913, 0xA243, + 0xC914, 0xA244, 0xC915, 0xA245, 0xC916, 0xA246, 0xC917, 0xA247, 0xC918, 0xC1E0, 0xC919, 0xA248, 0xC91A, 0xA249, 0xC91B, 0xA24A, + 0xC91C, 0xA24B, 0xC91D, 0xA24C, 0xC91E, 0xA24D, 0xC91F, 0xA24E, 0xC920, 0xA24F, 0xC921, 0xA250, 0xC922, 0xA251, 0xC923, 0xA252, + 0xC924, 0xA253, 0xC925, 0xA254, 0xC926, 0xA255, 0xC927, 0xA256, 0xC928, 0xA257, 0xC929, 0xA258, 0xC92A, 0xA259, 0xC92B, 0xA25A, + 0xC92C, 0xC1E1, 0xC92D, 0xA261, 0xC92E, 0xA262, 0xC92F, 0xA263, 0xC930, 0xA264, 0xC931, 0xA265, 0xC932, 0xA266, 0xC933, 0xA267, + 0xC934, 0xC1E2, 0xC935, 0xA268, 0xC936, 0xA269, 0xC937, 0xA26A, 0xC938, 0xA26B, 0xC939, 0xA26C, 0xC93A, 0xA26D, 0xC93B, 0xA26E, + 0xC93C, 0xA26F, 0xC93D, 0xA270, 0xC93E, 0xA271, 0xC93F, 0xA272, 0xC940, 0xA273, 0xC941, 0xA274, 0xC942, 0xA275, 0xC943, 0xA276, + 0xC944, 0xA277, 0xC945, 0xA278, 0xC946, 0xA279, 0xC947, 0xA27A, 0xC948, 0xA281, 0xC949, 0xA282, 0xC94A, 0xA283, 0xC94B, 0xA284, + 0xC94C, 0xA285, 0xC94D, 0xA286, 0xC94E, 0xA287, 0xC94F, 0xA288, 0xC950, 0xC1E3, 0xC951, 0xC1E4, 0xC952, 0xA289, 0xC953, 0xA28A, + 0xC954, 0xC1E5, 0xC955, 0xA28B, 0xC956, 0xA28C, 0xC957, 0xA28D, 0xC958, 0xC1E6, 0xC959, 0xA28E, 0xC95A, 0xA28F, 0xC95B, 0xA290, + 0xC95C, 0xA291, 0xC95D, 0xA292, 0xC95E, 0xA293, 0xC95F, 0xA294, 0xC960, 0xC1E7, 0xC961, 0xC1E8, 0xC962, 0xA295, 0xC963, 0xC1E9, + 0xC964, 0xA296, 0xC965, 0xA297, 0xC966, 0xA298, 0xC967, 0xA299, 0xC968, 0xA29A, 0xC969, 0xA29B, 0xC96A, 0xA29C, 0xC96B, 0xA29D, + 0xC96C, 0xC1EA, 0xC96D, 0xA29E, 0xC96E, 0xA29F, 0xC96F, 0xA2A0, 0xC970, 0xC1EB, 0xC971, 0xA341, 0xC972, 0xA342, 0xC973, 0xA343, + 0xC974, 0xC1EC, 0xC975, 0xA344, 0xC976, 0xA345, 0xC977, 0xA346, 0xC978, 0xA347, 0xC979, 0xA348, 0xC97A, 0xA349, 0xC97B, 0xA34A, + 0xC97C, 0xC1ED, 0xC97D, 0xA34B, 0xC97E, 0xA34C, 0xC97F, 0xA34D, 0xC980, 0xA34E, 0xC981, 0xA34F, 0xC982, 0xA350, 0xC983, 0xA351, + 0xC984, 0xA352, 0xC985, 0xA353, 0xC986, 0xA354, 0xC987, 0xA355, 0xC988, 0xC1EE, 0xC989, 0xC1EF, 0xC98A, 0xA356, 0xC98B, 0xA357, + 0xC98C, 0xC1F0, 0xC98D, 0xA358, 0xC98E, 0xA359, 0xC98F, 0xA35A, 0xC990, 0xC1F1, 0xC991, 0xA361, 0xC992, 0xA362, 0xC993, 0xA363, + 0xC994, 0xA364, 0xC995, 0xA365, 0xC996, 0xA366, 0xC997, 0xA367, 0xC998, 0xC1F2, 0xC999, 0xC1F3, 0xC99A, 0xA368, 0xC99B, 0xC1F4, + 0xC99C, 0xA369, 0xC99D, 0xC1F5, 0xC99E, 0xA36A, 0xC99F, 0xA36B, 0xC9A0, 0xA36C, 0xC9A1, 0xA36D, 0xC9A2, 0xA36E, 0xC9A3, 0xA36F, + 0xC9A4, 0xA370, 0xC9A5, 0xA371, 0xC9A6, 0xA372, 0xC9A7, 0xA373, 0xC9A8, 0xA374, 0xC9A9, 0xA375, 0xC9AA, 0xA376, 0xC9AB, 0xA377, + 0xC9AC, 0xA378, 0xC9AD, 0xA379, 0xC9AE, 0xA37A, 0xC9AF, 0xA381, 0xC9B0, 0xA382, 0xC9B1, 0xA383, 0xC9B2, 0xA384, 0xC9B3, 0xA385, + 0xC9B4, 0xA386, 0xC9B5, 0xA387, 0xC9B6, 0xA388, 0xC9B7, 0xA389, 0xC9B8, 0xA38A, 0xC9B9, 0xA38B, 0xC9BA, 0xA38C, 0xC9BB, 0xA38D, + 0xC9BC, 0xA38E, 0xC9BD, 0xA38F, 0xC9BE, 0xA390, 0xC9BF, 0xA391, 0xC9C0, 0xC1F6, 0xC9C1, 0xC1F7, 0xC9C2, 0xA392, 0xC9C3, 0xA393, + 0xC9C4, 0xC1F8, 0xC9C5, 0xA394, 0xC9C6, 0xA395, 0xC9C7, 0xC1F9, 0xC9C8, 0xC1FA, 0xC9C9, 0xA396, 0xC9CA, 0xC1FB, 0xC9CB, 0xA397, + 0xC9CC, 0xA398, 0xC9CD, 0xA399, 0xC9CE, 0xA39A, 0xC9CF, 0xA39B, 0xC9D0, 0xC1FC, 0xC9D1, 0xC1FD, 0xC9D2, 0xA39C, 0xC9D3, 0xC1FE, + 0xC9D4, 0xA39D, 0xC9D5, 0xC2A1, 0xC9D6, 0xC2A2, 0xC9D7, 0xA39E, 0xC9D8, 0xA39F, 0xC9D9, 0xC2A3, 0xC9DA, 0xC2A4, 0xC9DB, 0xA3A0, + 0xC9DC, 0xC2A5, 0xC9DD, 0xC2A6, 0xC9DE, 0xA441, 0xC9DF, 0xA442, 0xC9E0, 0xC2A7, 0xC9E1, 0xA443, 0xC9E2, 0xC2A8, 0xC9E3, 0xA444, + 0xC9E4, 0xC2A9, 0xC9E5, 0xA445, 0xC9E6, 0xA446, 0xC9E7, 0xC2AA, 0xC9E8, 0xA447, 0xC9E9, 0xA448, 0xC9EA, 0xA449, 0xC9EB, 0xA44A, + 0xC9EC, 0xC2AB, 0xC9ED, 0xC2AC, 0xC9EE, 0xA44B, 0xC9EF, 0xC2AD, 0xC9F0, 0xC2AE, 0xC9F1, 0xC2AF, 0xC9F2, 0xA44C, 0xC9F3, 0xA44D, + 0xC9F4, 0xA44E, 0xC9F5, 0xA44F, 0xC9F6, 0xA450, 0xC9F7, 0xA451, 0xC9F8, 0xC2B0, 0xC9F9, 0xC2B1, 0xC9FA, 0xA452, 0xC9FB, 0xA453, + 0xC9FC, 0xC2B2, 0xC9FD, 0xA454, 0xC9FE, 0xA455, 0xC9FF, 0xA456, 0xCA00, 0xC2B3, 0xCA01, 0xA457, 0xCA02, 0xA458, 0xCA03, 0xA459, + 0xCA04, 0xA45A, 0xCA05, 0xA461, 0xCA06, 0xA462, 0xCA07, 0xA463, 0xCA08, 0xC2B4, 0xCA09, 0xC2B5, 0xCA0A, 0xA464, 0xCA0B, 0xC2B6, + 0xCA0C, 0xC2B7, 0xCA0D, 0xC2B8, 0xCA0E, 0xA465, 0xCA0F, 0xA466, 0xCA10, 0xA467, 0xCA11, 0xA468, 0xCA12, 0xA469, 0xCA13, 0xA46A, + 0xCA14, 0xC2B9, 0xCA15, 0xA46B, 0xCA16, 0xA46C, 0xCA17, 0xA46D, 0xCA18, 0xC2BA, 0xCA19, 0xA46E, 0xCA1A, 0xA46F, 0xCA1B, 0xA470, + 0xCA1C, 0xA471, 0xCA1D, 0xA472, 0xCA1E, 0xA473, 0xCA1F, 0xA474, 0xCA20, 0xA475, 0xCA21, 0xA476, 0xCA22, 0xA477, 0xCA23, 0xA478, + 0xCA24, 0xA479, 0xCA25, 0xA47A, 0xCA26, 0xA481, 0xCA27, 0xA482, 0xCA28, 0xA483, 0xCA29, 0xC2BB, 0xCA2A, 0xA484, 0xCA2B, 0xA485, + 0xCA2C, 0xA486, 0xCA2D, 0xA487, 0xCA2E, 0xA488, 0xCA2F, 0xA489, 0xCA30, 0xA48A, 0xCA31, 0xA48B, 0xCA32, 0xA48C, 0xCA33, 0xA48D, + 0xCA34, 0xA48E, 0xCA35, 0xA48F, 0xCA36, 0xA490, 0xCA37, 0xA491, 0xCA38, 0xA492, 0xCA39, 0xA493, 0xCA3A, 0xA494, 0xCA3B, 0xA495, + 0xCA3C, 0xA496, 0xCA3D, 0xA497, 0xCA3E, 0xA498, 0xCA3F, 0xA499, 0xCA40, 0xA49A, 0xCA41, 0xA49B, 0xCA42, 0xA49C, 0xCA43, 0xA49D, + 0xCA44, 0xA49E, 0xCA45, 0xA49F, 0xCA46, 0xA4A0, 0xCA47, 0xA541, 0xCA48, 0xA542, 0xCA49, 0xA543, 0xCA4A, 0xA544, 0xCA4B, 0xA545, + 0xCA4C, 0xC2BC, 0xCA4D, 0xC2BD, 0xCA4E, 0xA546, 0xCA4F, 0xA547, 0xCA50, 0xC2BE, 0xCA51, 0xA548, 0xCA52, 0xA549, 0xCA53, 0xA54A, + 0xCA54, 0xC2BF, 0xCA55, 0xA54B, 0xCA56, 0xA54C, 0xCA57, 0xA54D, 0xCA58, 0xA54E, 0xCA59, 0xA54F, 0xCA5A, 0xA550, 0xCA5B, 0xA551, + 0xCA5C, 0xC2C0, 0xCA5D, 0xC2C1, 0xCA5E, 0xA552, 0xCA5F, 0xC2C2, 0xCA60, 0xC2C3, 0xCA61, 0xC2C4, 0xCA62, 0xA553, 0xCA63, 0xA554, + 0xCA64, 0xA555, 0xCA65, 0xA556, 0xCA66, 0xA557, 0xCA67, 0xA558, 0xCA68, 0xC2C5, 0xCA69, 0xA559, 0xCA6A, 0xA55A, 0xCA6B, 0xA561, + 0xCA6C, 0xA562, 0xCA6D, 0xA563, 0xCA6E, 0xA564, 0xCA6F, 0xA565, 0xCA70, 0xA566, 0xCA71, 0xA567, 0xCA72, 0xA568, 0xCA73, 0xA569, + 0xCA74, 0xA56A, 0xCA75, 0xA56B, 0xCA76, 0xA56C, 0xCA77, 0xA56D, 0xCA78, 0xA56E, 0xCA79, 0xA56F, 0xCA7A, 0xA570, 0xCA7B, 0xA571, + 0xCA7C, 0xA572, 0xCA7D, 0xC2C6, 0xCA7E, 0xA573, 0xCA7F, 0xA574, 0xCA80, 0xA575, 0xCA81, 0xA576, 0xCA82, 0xA577, 0xCA83, 0xA578, + 0xCA84, 0xC2C7, 0xCA85, 0xA579, 0xCA86, 0xA57A, 0xCA87, 0xA581, 0xCA88, 0xA582, 0xCA89, 0xA583, 0xCA8A, 0xA584, 0xCA8B, 0xA585, + 0xCA8C, 0xA586, 0xCA8D, 0xA587, 0xCA8E, 0xA588, 0xCA8F, 0xA589, 0xCA90, 0xA58A, 0xCA91, 0xA58B, 0xCA92, 0xA58C, 0xCA93, 0xA58D, + 0xCA94, 0xA58E, 0xCA95, 0xA58F, 0xCA96, 0xA590, 0xCA97, 0xA591, 0xCA98, 0xC2C8, 0xCA99, 0xA592, 0xCA9A, 0xA593, 0xCA9B, 0xA594, + 0xCA9C, 0xA595, 0xCA9D, 0xA596, 0xCA9E, 0xA597, 0xCA9F, 0xA598, 0xCAA0, 0xA599, 0xCAA1, 0xA59A, 0xCAA2, 0xA59B, 0xCAA3, 0xA59C, + 0xCAA4, 0xA59D, 0xCAA5, 0xA59E, 0xCAA6, 0xA59F, 0xCAA7, 0xA5A0, 0xCAA8, 0xA641, 0xCAA9, 0xA642, 0xCAAA, 0xA643, 0xCAAB, 0xA644, + 0xCAAC, 0xA645, 0xCAAD, 0xA646, 0xCAAE, 0xA647, 0xCAAF, 0xA648, 0xCAB0, 0xA649, 0xCAB1, 0xA64A, 0xCAB2, 0xA64B, 0xCAB3, 0xA64C, + 0xCAB4, 0xA64D, 0xCAB5, 0xA64E, 0xCAB6, 0xA64F, 0xCAB7, 0xA650, 0xCAB8, 0xA651, 0xCAB9, 0xA652, 0xCABA, 0xA653, 0xCABB, 0xA654, + 0xCABC, 0xC2C9, 0xCABD, 0xC2CA, 0xCABE, 0xA655, 0xCABF, 0xA656, 0xCAC0, 0xC2CB, 0xCAC1, 0xA657, 0xCAC2, 0xA658, 0xCAC3, 0xA659, + 0xCAC4, 0xC2CC, 0xCAC5, 0xA65A, 0xCAC6, 0xA661, 0xCAC7, 0xA662, 0xCAC8, 0xA663, 0xCAC9, 0xA664, 0xCACA, 0xA665, 0xCACB, 0xA666, + 0xCACC, 0xC2CD, 0xCACD, 0xC2CE, 0xCACE, 0xA667, 0xCACF, 0xC2CF, 0xCAD0, 0xA668, 0xCAD1, 0xC2D0, 0xCAD2, 0xA669, 0xCAD3, 0xC2D1, + 0xCAD4, 0xA66A, 0xCAD5, 0xA66B, 0xCAD6, 0xA66C, 0xCAD7, 0xA66D, 0xCAD8, 0xC2D2, 0xCAD9, 0xC2D3, 0xCADA, 0xA66E, 0xCADB, 0xA66F, + 0xCADC, 0xA670, 0xCADD, 0xA671, 0xCADE, 0xA672, 0xCADF, 0xA673, 0xCAE0, 0xC2D4, 0xCAE1, 0xA674, 0xCAE2, 0xA675, 0xCAE3, 0xA676, + 0xCAE4, 0xA677, 0xCAE5, 0xA678, 0xCAE6, 0xA679, 0xCAE7, 0xA67A, 0xCAE8, 0xA681, 0xCAE9, 0xA682, 0xCAEA, 0xA683, 0xCAEB, 0xA684, + 0xCAEC, 0xC2D5, 0xCAED, 0xA685, 0xCAEE, 0xA686, 0xCAEF, 0xA687, 0xCAF0, 0xA688, 0xCAF1, 0xA689, 0xCAF2, 0xA68A, 0xCAF3, 0xA68B, + 0xCAF4, 0xC2D6, 0xCAF5, 0xA68C, 0xCAF6, 0xA68D, 0xCAF7, 0xA68E, 0xCAF8, 0xA68F, 0xCAF9, 0xA690, 0xCAFA, 0xA691, 0xCAFB, 0xA692, + 0xCAFC, 0xA693, 0xCAFD, 0xA694, 0xCAFE, 0xA695, 0xCAFF, 0xA696, 0xCB00, 0xA697, 0xCB01, 0xA698, 0xCB02, 0xA699, 0xCB03, 0xA69A, + 0xCB04, 0xA69B, 0xCB05, 0xA69C, 0xCB06, 0xA69D, 0xCB07, 0xA69E, 0xCB08, 0xC2D7, 0xCB09, 0xA69F, 0xCB0A, 0xA6A0, 0xCB0B, 0xA741, + 0xCB0C, 0xA742, 0xCB0D, 0xA743, 0xCB0E, 0xA744, 0xCB0F, 0xA745, 0xCB10, 0xC2D8, 0xCB11, 0xA746, 0xCB12, 0xA747, 0xCB13, 0xA748, + 0xCB14, 0xC2D9, 0xCB15, 0xA749, 0xCB16, 0xA74A, 0xCB17, 0xA74B, 0xCB18, 0xC2DA, 0xCB19, 0xA74C, 0xCB1A, 0xA74D, 0xCB1B, 0xA74E, + 0xCB1C, 0xA74F, 0xCB1D, 0xA750, 0xCB1E, 0xA751, 0xCB1F, 0xA752, 0xCB20, 0xC2DB, 0xCB21, 0xC2DC, 0xCB22, 0xA753, 0xCB23, 0xA754, + 0xCB24, 0xA755, 0xCB25, 0xA756, 0xCB26, 0xA757, 0xCB27, 0xA758, 0xCB28, 0xA759, 0xCB29, 0xA75A, 0xCB2A, 0xA761, 0xCB2B, 0xA762, + 0xCB2C, 0xA763, 0xCB2D, 0xA764, 0xCB2E, 0xA765, 0xCB2F, 0xA766, 0xCB30, 0xA767, 0xCB31, 0xA768, 0xCB32, 0xA769, 0xCB33, 0xA76A, + 0xCB34, 0xA76B, 0xCB35, 0xA76C, 0xCB36, 0xA76D, 0xCB37, 0xA76E, 0xCB38, 0xA76F, 0xCB39, 0xA770, 0xCB3A, 0xA771, 0xCB3B, 0xA772, + 0xCB3C, 0xA773, 0xCB3D, 0xA774, 0xCB3E, 0xA775, 0xCB3F, 0xA776, 0xCB40, 0xA777, 0xCB41, 0xC2DD, 0xCB42, 0xA778, 0xCB43, 0xA779, + 0xCB44, 0xA77A, 0xCB45, 0xA781, 0xCB46, 0xA782, 0xCB47, 0xA783, 0xCB48, 0xC2DE, 0xCB49, 0xC2DF, 0xCB4A, 0xA784, 0xCB4B, 0xA785, + 0xCB4C, 0xC2E0, 0xCB4D, 0xA786, 0xCB4E, 0xA787, 0xCB4F, 0xA788, 0xCB50, 0xC2E1, 0xCB51, 0xA789, 0xCB52, 0xA78A, 0xCB53, 0xA78B, + 0xCB54, 0xA78C, 0xCB55, 0xA78D, 0xCB56, 0xA78E, 0xCB57, 0xA78F, 0xCB58, 0xC2E2, 0xCB59, 0xC2E3, 0xCB5A, 0xA790, 0xCB5B, 0xA791, + 0xCB5C, 0xA792, 0xCB5D, 0xC2E4, 0xCB5E, 0xA793, 0xCB5F, 0xA794, 0xCB60, 0xA795, 0xCB61, 0xA796, 0xCB62, 0xA797, 0xCB63, 0xA798, + 0xCB64, 0xC2E5, 0xCB65, 0xA799, 0xCB66, 0xA79A, 0xCB67, 0xA79B, 0xCB68, 0xA79C, 0xCB69, 0xA79D, 0xCB6A, 0xA79E, 0xCB6B, 0xA79F, + 0xCB6C, 0xA7A0, 0xCB6D, 0xA841, 0xCB6E, 0xA842, 0xCB6F, 0xA843, 0xCB70, 0xA844, 0xCB71, 0xA845, 0xCB72, 0xA846, 0xCB73, 0xA847, + 0xCB74, 0xA848, 0xCB75, 0xA849, 0xCB76, 0xA84A, 0xCB77, 0xA84B, 0xCB78, 0xC2E6, 0xCB79, 0xC2E7, 0xCB7A, 0xA84C, 0xCB7B, 0xA84D, + 0xCB7C, 0xA84E, 0xCB7D, 0xA84F, 0xCB7E, 0xA850, 0xCB7F, 0xA851, 0xCB80, 0xA852, 0xCB81, 0xA853, 0xCB82, 0xA854, 0xCB83, 0xA855, + 0xCB84, 0xA856, 0xCB85, 0xA857, 0xCB86, 0xA858, 0xCB87, 0xA859, 0xCB88, 0xA85A, 0xCB89, 0xA861, 0xCB8A, 0xA862, 0xCB8B, 0xA863, + 0xCB8C, 0xA864, 0xCB8D, 0xA865, 0xCB8E, 0xA866, 0xCB8F, 0xA867, 0xCB90, 0xA868, 0xCB91, 0xA869, 0xCB92, 0xA86A, 0xCB93, 0xA86B, + 0xCB94, 0xA86C, 0xCB95, 0xA86D, 0xCB96, 0xA86E, 0xCB97, 0xA86F, 0xCB98, 0xA870, 0xCB99, 0xA871, 0xCB9A, 0xA872, 0xCB9B, 0xA873, + 0xCB9C, 0xC2E8, 0xCB9D, 0xA874, 0xCB9E, 0xA875, 0xCB9F, 0xA876, 0xCBA0, 0xA877, 0xCBA1, 0xA878, 0xCBA2, 0xA879, 0xCBA3, 0xA87A, + 0xCBA4, 0xA881, 0xCBA5, 0xA882, 0xCBA6, 0xA883, 0xCBA7, 0xA884, 0xCBA8, 0xA885, 0xCBA9, 0xA886, 0xCBAA, 0xA887, 0xCBAB, 0xA888, + 0xCBAC, 0xA889, 0xCBAD, 0xA88A, 0xCBAE, 0xA88B, 0xCBAF, 0xA88C, 0xCBB0, 0xA88D, 0xCBB1, 0xA88E, 0xCBB2, 0xA88F, 0xCBB3, 0xA890, + 0xCBB4, 0xA891, 0xCBB5, 0xA892, 0xCBB6, 0xA893, 0xCBB7, 0xA894, 0xCBB8, 0xC2E9, 0xCBB9, 0xA895, 0xCBBA, 0xA896, 0xCBBB, 0xA897, + 0xCBBC, 0xA898, 0xCBBD, 0xA899, 0xCBBE, 0xA89A, 0xCBBF, 0xA89B, 0xCBC0, 0xA89C, 0xCBC1, 0xA89D, 0xCBC2, 0xA89E, 0xCBC3, 0xA89F, + 0xCBC4, 0xA8A0, 0xCBC5, 0xA941, 0xCBC6, 0xA942, 0xCBC7, 0xA943, 0xCBC8, 0xA944, 0xCBC9, 0xA945, 0xCBCA, 0xA946, 0xCBCB, 0xA947, + 0xCBCC, 0xA948, 0xCBCD, 0xA949, 0xCBCE, 0xA94A, 0xCBCF, 0xA94B, 0xCBD0, 0xA94C, 0xCBD1, 0xA94D, 0xCBD2, 0xA94E, 0xCBD3, 0xA94F, + 0xCBD4, 0xC2EA, 0xCBD5, 0xA950, 0xCBD6, 0xA951, 0xCBD7, 0xA952, 0xCBD8, 0xA953, 0xCBD9, 0xA954, 0xCBDA, 0xA955, 0xCBDB, 0xA956, + 0xCBDC, 0xA957, 0xCBDD, 0xA958, 0xCBDE, 0xA959, 0xCBDF, 0xA95A, 0xCBE0, 0xA961, 0xCBE1, 0xA962, 0xCBE2, 0xA963, 0xCBE3, 0xA964, + 0xCBE4, 0xC2EB, 0xCBE5, 0xA965, 0xCBE6, 0xA966, 0xCBE7, 0xC2EC, 0xCBE8, 0xA967, 0xCBE9, 0xC2ED, 0xCBEA, 0xA968, 0xCBEB, 0xA969, + 0xCBEC, 0xA96A, 0xCBED, 0xA96B, 0xCBEE, 0xA96C, 0xCBEF, 0xA96D, 0xCBF0, 0xA96E, 0xCBF1, 0xA96F, 0xCBF2, 0xA970, 0xCBF3, 0xA971, + 0xCBF4, 0xA972, 0xCBF5, 0xA973, 0xCBF6, 0xA974, 0xCBF7, 0xA975, 0xCBF8, 0xA976, 0xCBF9, 0xA977, 0xCBFA, 0xA978, 0xCBFB, 0xA979, + 0xCBFC, 0xA97A, 0xCBFD, 0xA981, 0xCBFE, 0xA982, 0xCBFF, 0xA983, 0xCC00, 0xA984, 0xCC01, 0xA985, 0xCC02, 0xA986, 0xCC03, 0xA987, + 0xCC04, 0xA988, 0xCC05, 0xA989, 0xCC06, 0xA98A, 0xCC07, 0xA98B, 0xCC08, 0xA98C, 0xCC09, 0xA98D, 0xCC0A, 0xA98E, 0xCC0B, 0xA98F, + 0xCC0C, 0xC2EE, 0xCC0D, 0xC2EF, 0xCC0E, 0xA990, 0xCC0F, 0xA991, 0xCC10, 0xC2F0, 0xCC11, 0xA992, 0xCC12, 0xA993, 0xCC13, 0xA994, + 0xCC14, 0xC2F1, 0xCC15, 0xA995, 0xCC16, 0xA996, 0xCC17, 0xA997, 0xCC18, 0xA998, 0xCC19, 0xA999, 0xCC1A, 0xA99A, 0xCC1B, 0xA99B, + 0xCC1C, 0xC2F2, 0xCC1D, 0xC2F3, 0xCC1E, 0xA99C, 0xCC1F, 0xA99D, 0xCC20, 0xA99E, 0xCC21, 0xC2F4, 0xCC22, 0xC2F5, 0xCC23, 0xA99F, + 0xCC24, 0xA9A0, 0xCC25, 0xAA41, 0xCC26, 0xAA42, 0xCC27, 0xC2F6, 0xCC28, 0xC2F7, 0xCC29, 0xC2F8, 0xCC2A, 0xAA43, 0xCC2B, 0xAA44, + 0xCC2C, 0xC2F9, 0xCC2D, 0xAA45, 0xCC2E, 0xC2FA, 0xCC2F, 0xAA46, 0xCC30, 0xC2FB, 0xCC31, 0xAA47, 0xCC32, 0xAA48, 0xCC33, 0xAA49, + 0xCC34, 0xAA4A, 0xCC35, 0xAA4B, 0xCC36, 0xAA4C, 0xCC37, 0xAA4D, 0xCC38, 0xC2FC, 0xCC39, 0xC2FD, 0xCC3A, 0xAA4E, 0xCC3B, 0xC2FE, + 0xCC3C, 0xC3A1, 0xCC3D, 0xC3A2, 0xCC3E, 0xC3A3, 0xCC3F, 0xAA4F, 0xCC40, 0xAA50, 0xCC41, 0xAA51, 0xCC42, 0xAA52, 0xCC43, 0xAA53, + 0xCC44, 0xC3A4, 0xCC45, 0xC3A5, 0xCC46, 0xAA54, 0xCC47, 0xAA55, 0xCC48, 0xC3A6, 0xCC49, 0xAA56, 0xCC4A, 0xAA57, 0xCC4B, 0xAA58, + 0xCC4C, 0xC3A7, 0xCC4D, 0xAA59, 0xCC4E, 0xAA5A, 0xCC4F, 0xAA61, 0xCC50, 0xAA62, 0xCC51, 0xAA63, 0xCC52, 0xAA64, 0xCC53, 0xAA65, + 0xCC54, 0xC3A8, 0xCC55, 0xC3A9, 0xCC56, 0xAA66, 0xCC57, 0xC3AA, 0xCC58, 0xC3AB, 0xCC59, 0xC3AC, 0xCC5A, 0xAA67, 0xCC5B, 0xAA68, + 0xCC5C, 0xAA69, 0xCC5D, 0xAA6A, 0xCC5E, 0xAA6B, 0xCC5F, 0xAA6C, 0xCC60, 0xC3AD, 0xCC61, 0xAA6D, 0xCC62, 0xAA6E, 0xCC63, 0xAA6F, + 0xCC64, 0xC3AE, 0xCC65, 0xAA70, 0xCC66, 0xC3AF, 0xCC67, 0xAA71, 0xCC68, 0xC3B0, 0xCC69, 0xAA72, 0xCC6A, 0xAA73, 0xCC6B, 0xAA74, + 0xCC6C, 0xAA75, 0xCC6D, 0xAA76, 0xCC6E, 0xAA77, 0xCC6F, 0xAA78, 0xCC70, 0xC3B1, 0xCC71, 0xAA79, 0xCC72, 0xAA7A, 0xCC73, 0xAA81, + 0xCC74, 0xAA82, 0xCC75, 0xC3B2, 0xCC76, 0xAA83, 0xCC77, 0xAA84, 0xCC78, 0xAA85, 0xCC79, 0xAA86, 0xCC7A, 0xAA87, 0xCC7B, 0xAA88, + 0xCC7C, 0xAA89, 0xCC7D, 0xAA8A, 0xCC7E, 0xAA8B, 0xCC7F, 0xAA8C, 0xCC80, 0xAA8D, 0xCC81, 0xAA8E, 0xCC82, 0xAA8F, 0xCC83, 0xAA90, + 0xCC84, 0xAA91, 0xCC85, 0xAA92, 0xCC86, 0xAA93, 0xCC87, 0xAA94, 0xCC88, 0xAA95, 0xCC89, 0xAA96, 0xCC8A, 0xAA97, 0xCC8B, 0xAA98, + 0xCC8C, 0xAA99, 0xCC8D, 0xAA9A, 0xCC8E, 0xAA9B, 0xCC8F, 0xAA9C, 0xCC90, 0xAA9D, 0xCC91, 0xAA9E, 0xCC92, 0xAA9F, 0xCC93, 0xAAA0, + 0xCC94, 0xAB41, 0xCC95, 0xAB42, 0xCC96, 0xAB43, 0xCC97, 0xAB44, 0xCC98, 0xC3B3, 0xCC99, 0xC3B4, 0xCC9A, 0xAB45, 0xCC9B, 0xAB46, + 0xCC9C, 0xC3B5, 0xCC9D, 0xAB47, 0xCC9E, 0xAB48, 0xCC9F, 0xAB49, 0xCCA0, 0xC3B6, 0xCCA1, 0xAB4A, 0xCCA2, 0xAB4B, 0xCCA3, 0xAB4C, + 0xCCA4, 0xAB4D, 0xCCA5, 0xAB4E, 0xCCA6, 0xAB4F, 0xCCA7, 0xAB50, 0xCCA8, 0xC3B7, 0xCCA9, 0xC3B8, 0xCCAA, 0xAB51, 0xCCAB, 0xC3B9, + 0xCCAC, 0xC3BA, 0xCCAD, 0xC3BB, 0xCCAE, 0xAB52, 0xCCAF, 0xAB53, 0xCCB0, 0xAB54, 0xCCB1, 0xAB55, 0xCCB2, 0xAB56, 0xCCB3, 0xAB57, + 0xCCB4, 0xC3BC, 0xCCB5, 0xC3BD, 0xCCB6, 0xAB58, 0xCCB7, 0xAB59, 0xCCB8, 0xC3BE, 0xCCB9, 0xAB5A, 0xCCBA, 0xAB61, 0xCCBB, 0xAB62, + 0xCCBC, 0xC3BF, 0xCCBD, 0xAB63, 0xCCBE, 0xAB64, 0xCCBF, 0xAB65, 0xCCC0, 0xAB66, 0xCCC1, 0xAB67, 0xCCC2, 0xAB68, 0xCCC3, 0xAB69, + 0xCCC4, 0xC3C0, 0xCCC5, 0xC3C1, 0xCCC6, 0xAB6A, 0xCCC7, 0xC3C2, 0xCCC8, 0xAB6B, 0xCCC9, 0xC3C3, 0xCCCA, 0xAB6C, 0xCCCB, 0xAB6D, + 0xCCCC, 0xAB6E, 0xCCCD, 0xAB6F, 0xCCCE, 0xAB70, 0xCCCF, 0xAB71, 0xCCD0, 0xC3C4, 0xCCD1, 0xAB72, 0xCCD2, 0xAB73, 0xCCD3, 0xAB74, + 0xCCD4, 0xC3C5, 0xCCD5, 0xAB75, 0xCCD6, 0xAB76, 0xCCD7, 0xAB77, 0xCCD8, 0xAB78, 0xCCD9, 0xAB79, 0xCCDA, 0xAB7A, 0xCCDB, 0xAB81, + 0xCCDC, 0xAB82, 0xCCDD, 0xAB83, 0xCCDE, 0xAB84, 0xCCDF, 0xAB85, 0xCCE0, 0xAB86, 0xCCE1, 0xAB87, 0xCCE2, 0xAB88, 0xCCE3, 0xAB89, + 0xCCE4, 0xC3C6, 0xCCE5, 0xAB8A, 0xCCE6, 0xAB8B, 0xCCE7, 0xAB8C, 0xCCE8, 0xAB8D, 0xCCE9, 0xAB8E, 0xCCEA, 0xAB8F, 0xCCEB, 0xAB90, + 0xCCEC, 0xC3C7, 0xCCED, 0xAB91, 0xCCEE, 0xAB92, 0xCCEF, 0xAB93, 0xCCF0, 0xC3C8, 0xCCF1, 0xAB94, 0xCCF2, 0xAB95, 0xCCF3, 0xAB96, + 0xCCF4, 0xAB97, 0xCCF5, 0xAB98, 0xCCF6, 0xAB99, 0xCCF7, 0xAB9A, 0xCCF8, 0xAB9B, 0xCCF9, 0xAB9C, 0xCCFA, 0xAB9D, 0xCCFB, 0xAB9E, + 0xCCFC, 0xAB9F, 0xCCFD, 0xABA0, 0xCCFE, 0xAC41, 0xCCFF, 0xAC42, 0xCD00, 0xAC43, 0xCD01, 0xC3C9, 0xCD02, 0xAC44, 0xCD03, 0xAC45, + 0xCD04, 0xAC46, 0xCD05, 0xAC47, 0xCD06, 0xAC48, 0xCD07, 0xAC49, 0xCD08, 0xC3CA, 0xCD09, 0xC3CB, 0xCD0A, 0xAC4A, 0xCD0B, 0xAC4B, + 0xCD0C, 0xC3CC, 0xCD0D, 0xAC4C, 0xCD0E, 0xAC4D, 0xCD0F, 0xAC4E, 0xCD10, 0xC3CD, 0xCD11, 0xAC4F, 0xCD12, 0xAC50, 0xCD13, 0xAC51, + 0xCD14, 0xAC52, 0xCD15, 0xAC53, 0xCD16, 0xAC54, 0xCD17, 0xAC55, 0xCD18, 0xC3CE, 0xCD19, 0xC3CF, 0xCD1A, 0xAC56, 0xCD1B, 0xC3D0, + 0xCD1C, 0xAC57, 0xCD1D, 0xC3D1, 0xCD1E, 0xAC58, 0xCD1F, 0xAC59, 0xCD20, 0xAC5A, 0xCD21, 0xAC61, 0xCD22, 0xAC62, 0xCD23, 0xAC63, + 0xCD24, 0xC3D2, 0xCD25, 0xAC64, 0xCD26, 0xAC65, 0xCD27, 0xAC66, 0xCD28, 0xC3D3, 0xCD29, 0xAC67, 0xCD2A, 0xAC68, 0xCD2B, 0xAC69, + 0xCD2C, 0xC3D4, 0xCD2D, 0xAC6A, 0xCD2E, 0xAC6B, 0xCD2F, 0xAC6C, 0xCD30, 0xAC6D, 0xCD31, 0xAC6E, 0xCD32, 0xAC6F, 0xCD33, 0xAC70, + 0xCD34, 0xAC71, 0xCD35, 0xAC72, 0xCD36, 0xAC73, 0xCD37, 0xAC74, 0xCD38, 0xAC75, 0xCD39, 0xC3D5, 0xCD3A, 0xAC76, 0xCD3B, 0xAC77, + 0xCD3C, 0xAC78, 0xCD3D, 0xAC79, 0xCD3E, 0xAC7A, 0xCD3F, 0xAC81, 0xCD40, 0xAC82, 0xCD41, 0xAC83, 0xCD42, 0xAC84, 0xCD43, 0xAC85, + 0xCD44, 0xAC86, 0xCD45, 0xAC87, 0xCD46, 0xAC88, 0xCD47, 0xAC89, 0xCD48, 0xAC8A, 0xCD49, 0xAC8B, 0xCD4A, 0xAC8C, 0xCD4B, 0xAC8D, + 0xCD4C, 0xAC8E, 0xCD4D, 0xAC8F, 0xCD4E, 0xAC90, 0xCD4F, 0xAC91, 0xCD50, 0xAC92, 0xCD51, 0xAC93, 0xCD52, 0xAC94, 0xCD53, 0xAC95, + 0xCD54, 0xAC96, 0xCD55, 0xAC97, 0xCD56, 0xAC98, 0xCD57, 0xAC99, 0xCD58, 0xAC9A, 0xCD59, 0xAC9B, 0xCD5A, 0xAC9C, 0xCD5B, 0xAC9D, + 0xCD5C, 0xC3D6, 0xCD5D, 0xAC9E, 0xCD5E, 0xAC9F, 0xCD5F, 0xACA0, 0xCD60, 0xC3D7, 0xCD61, 0xAD41, 0xCD62, 0xAD42, 0xCD63, 0xAD43, + 0xCD64, 0xC3D8, 0xCD65, 0xAD44, 0xCD66, 0xAD45, 0xCD67, 0xAD46, 0xCD68, 0xAD47, 0xCD69, 0xAD48, 0xCD6A, 0xAD49, 0xCD6B, 0xAD4A, + 0xCD6C, 0xC3D9, 0xCD6D, 0xC3DA, 0xCD6E, 0xAD4B, 0xCD6F, 0xC3DB, 0xCD70, 0xAD4C, 0xCD71, 0xC3DC, 0xCD72, 0xAD4D, 0xCD73, 0xAD4E, + 0xCD74, 0xAD4F, 0xCD75, 0xAD50, 0xCD76, 0xAD51, 0xCD77, 0xAD52, 0xCD78, 0xC3DD, 0xCD79, 0xAD53, 0xCD7A, 0xAD54, 0xCD7B, 0xAD55, + 0xCD7C, 0xAD56, 0xCD7D, 0xAD57, 0xCD7E, 0xAD58, 0xCD7F, 0xAD59, 0xCD80, 0xAD5A, 0xCD81, 0xAD61, 0xCD82, 0xAD62, 0xCD83, 0xAD63, + 0xCD84, 0xAD64, 0xCD85, 0xAD65, 0xCD86, 0xAD66, 0xCD87, 0xAD67, 0xCD88, 0xC3DE, 0xCD89, 0xAD68, 0xCD8A, 0xAD69, 0xCD8B, 0xAD6A, + 0xCD8C, 0xAD6B, 0xCD8D, 0xAD6C, 0xCD8E, 0xAD6D, 0xCD8F, 0xAD6E, 0xCD90, 0xAD6F, 0xCD91, 0xAD70, 0xCD92, 0xAD71, 0xCD93, 0xAD72, + 0xCD94, 0xC3DF, 0xCD95, 0xC3E0, 0xCD96, 0xAD73, 0xCD97, 0xAD74, 0xCD98, 0xC3E1, 0xCD99, 0xAD75, 0xCD9A, 0xAD76, 0xCD9B, 0xAD77, + 0xCD9C, 0xC3E2, 0xCD9D, 0xAD78, 0xCD9E, 0xAD79, 0xCD9F, 0xAD7A, 0xCDA0, 0xAD81, 0xCDA1, 0xAD82, 0xCDA2, 0xAD83, 0xCDA3, 0xAD84, + 0xCDA4, 0xC3E3, 0xCDA5, 0xC3E4, 0xCDA6, 0xAD85, 0xCDA7, 0xC3E5, 0xCDA8, 0xAD86, 0xCDA9, 0xC3E6, 0xCDAA, 0xAD87, 0xCDAB, 0xAD88, + 0xCDAC, 0xAD89, 0xCDAD, 0xAD8A, 0xCDAE, 0xAD8B, 0xCDAF, 0xAD8C, 0xCDB0, 0xC3E7, 0xCDB1, 0xAD8D, 0xCDB2, 0xAD8E, 0xCDB3, 0xAD8F, + 0xCDB4, 0xAD90, 0xCDB5, 0xAD91, 0xCDB6, 0xAD92, 0xCDB7, 0xAD93, 0xCDB8, 0xAD94, 0xCDB9, 0xAD95, 0xCDBA, 0xAD96, 0xCDBB, 0xAD97, + 0xCDBC, 0xAD98, 0xCDBD, 0xAD99, 0xCDBE, 0xAD9A, 0xCDBF, 0xAD9B, 0xCDC0, 0xAD9C, 0xCDC1, 0xAD9D, 0xCDC2, 0xAD9E, 0xCDC3, 0xAD9F, + 0xCDC4, 0xC3E8, 0xCDC5, 0xADA0, 0xCDC6, 0xAE41, 0xCDC7, 0xAE42, 0xCDC8, 0xAE43, 0xCDC9, 0xAE44, 0xCDCA, 0xAE45, 0xCDCB, 0xAE46, + 0xCDCC, 0xC3E9, 0xCDCD, 0xAE47, 0xCDCE, 0xAE48, 0xCDCF, 0xAE49, 0xCDD0, 0xC3EA, 0xCDD1, 0xAE4A, 0xCDD2, 0xAE4B, 0xCDD3, 0xAE4C, + 0xCDD4, 0xAE4D, 0xCDD5, 0xAE4E, 0xCDD6, 0xAE4F, 0xCDD7, 0xAE50, 0xCDD8, 0xAE51, 0xCDD9, 0xAE52, 0xCDDA, 0xAE53, 0xCDDB, 0xAE54, + 0xCDDC, 0xAE55, 0xCDDD, 0xAE56, 0xCDDE, 0xAE57, 0xCDDF, 0xAE58, 0xCDE0, 0xAE59, 0xCDE1, 0xAE5A, 0xCDE2, 0xAE61, 0xCDE3, 0xAE62, + 0xCDE4, 0xAE63, 0xCDE5, 0xAE64, 0xCDE6, 0xAE65, 0xCDE7, 0xAE66, 0xCDE8, 0xC3EB, 0xCDE9, 0xAE67, 0xCDEA, 0xAE68, 0xCDEB, 0xAE69, + 0xCDEC, 0xC3EC, 0xCDED, 0xAE6A, 0xCDEE, 0xAE6B, 0xCDEF, 0xAE6C, 0xCDF0, 0xC3ED, 0xCDF1, 0xAE6D, 0xCDF2, 0xAE6E, 0xCDF3, 0xAE6F, + 0xCDF4, 0xAE70, 0xCDF5, 0xAE71, 0xCDF6, 0xAE72, 0xCDF7, 0xAE73, 0xCDF8, 0xC3EE, 0xCDF9, 0xC3EF, 0xCDFA, 0xAE74, 0xCDFB, 0xC3F0, + 0xCDFC, 0xAE75, 0xCDFD, 0xC3F1, 0xCDFE, 0xAE76, 0xCDFF, 0xAE77, 0xCE00, 0xAE78, 0xCE01, 0xAE79, 0xCE02, 0xAE7A, 0xCE03, 0xAE81, + 0xCE04, 0xC3F2, 0xCE05, 0xAE82, 0xCE06, 0xAE83, 0xCE07, 0xAE84, 0xCE08, 0xC3F3, 0xCE09, 0xAE85, 0xCE0A, 0xAE86, 0xCE0B, 0xAE87, + 0xCE0C, 0xC3F4, 0xCE0D, 0xAE88, 0xCE0E, 0xAE89, 0xCE0F, 0xAE8A, 0xCE10, 0xAE8B, 0xCE11, 0xAE8C, 0xCE12, 0xAE8D, 0xCE13, 0xAE8E, + 0xCE14, 0xC3F5, 0xCE15, 0xAE8F, 0xCE16, 0xAE90, 0xCE17, 0xAE91, 0xCE18, 0xAE92, 0xCE19, 0xC3F6, 0xCE1A, 0xAE93, 0xCE1B, 0xAE94, + 0xCE1C, 0xAE95, 0xCE1D, 0xAE96, 0xCE1E, 0xAE97, 0xCE1F, 0xAE98, 0xCE20, 0xC3F7, 0xCE21, 0xC3F8, 0xCE22, 0xAE99, 0xCE23, 0xAE9A, + 0xCE24, 0xC3F9, 0xCE25, 0xAE9B, 0xCE26, 0xAE9C, 0xCE27, 0xAE9D, 0xCE28, 0xC3FA, 0xCE29, 0xAE9E, 0xCE2A, 0xAE9F, 0xCE2B, 0xAEA0, + 0xCE2C, 0xAF41, 0xCE2D, 0xAF42, 0xCE2E, 0xAF43, 0xCE2F, 0xAF44, 0xCE30, 0xC3FB, 0xCE31, 0xC3FC, 0xCE32, 0xAF45, 0xCE33, 0xC3FD, + 0xCE34, 0xAF46, 0xCE35, 0xC3FE, 0xCE36, 0xAF47, 0xCE37, 0xAF48, 0xCE38, 0xAF49, 0xCE39, 0xAF4A, 0xCE3A, 0xAF4B, 0xCE3B, 0xAF4C, + 0xCE3C, 0xAF4D, 0xCE3D, 0xAF4E, 0xCE3E, 0xAF4F, 0xCE3F, 0xAF50, 0xCE40, 0xAF51, 0xCE41, 0xAF52, 0xCE42, 0xAF53, 0xCE43, 0xAF54, + 0xCE44, 0xAF55, 0xCE45, 0xAF56, 0xCE46, 0xAF57, 0xCE47, 0xAF58, 0xCE48, 0xAF59, 0xCE49, 0xAF5A, 0xCE4A, 0xAF61, 0xCE4B, 0xAF62, + 0xCE4C, 0xAF63, 0xCE4D, 0xAF64, 0xCE4E, 0xAF65, 0xCE4F, 0xAF66, 0xCE50, 0xAF67, 0xCE51, 0xAF68, 0xCE52, 0xAF69, 0xCE53, 0xAF6A, + 0xCE54, 0xAF6B, 0xCE55, 0xAF6C, 0xCE56, 0xAF6D, 0xCE57, 0xAF6E, 0xCE58, 0xC4A1, 0xCE59, 0xC4A2, 0xCE5A, 0xAF6F, 0xCE5B, 0xAF70, + 0xCE5C, 0xC4A3, 0xCE5D, 0xAF71, 0xCE5E, 0xAF72, 0xCE5F, 0xC4A4, 0xCE60, 0xC4A5, 0xCE61, 0xC4A6, 0xCE62, 0xAF73, 0xCE63, 0xAF74, + 0xCE64, 0xAF75, 0xCE65, 0xAF76, 0xCE66, 0xAF77, 0xCE67, 0xAF78, 0xCE68, 0xC4A7, 0xCE69, 0xC4A8, 0xCE6A, 0xAF79, 0xCE6B, 0xC4A9, + 0xCE6C, 0xAF7A, 0xCE6D, 0xC4AA, 0xCE6E, 0xAF81, 0xCE6F, 0xAF82, 0xCE70, 0xAF83, 0xCE71, 0xAF84, 0xCE72, 0xAF85, 0xCE73, 0xAF86, + 0xCE74, 0xC4AB, 0xCE75, 0xC4AC, 0xCE76, 0xAF87, 0xCE77, 0xAF88, 0xCE78, 0xC4AD, 0xCE79, 0xAF89, 0xCE7A, 0xAF8A, 0xCE7B, 0xAF8B, + 0xCE7C, 0xC4AE, 0xCE7D, 0xAF8C, 0xCE7E, 0xAF8D, 0xCE7F, 0xAF8E, 0xCE80, 0xAF8F, 0xCE81, 0xAF90, 0xCE82, 0xAF91, 0xCE83, 0xAF92, + 0xCE84, 0xC4AF, 0xCE85, 0xC4B0, 0xCE86, 0xAF93, 0xCE87, 0xC4B1, 0xCE88, 0xAF94, 0xCE89, 0xC4B2, 0xCE8A, 0xAF95, 0xCE8B, 0xAF96, + 0xCE8C, 0xAF97, 0xCE8D, 0xAF98, 0xCE8E, 0xAF99, 0xCE8F, 0xAF9A, 0xCE90, 0xC4B3, 0xCE91, 0xC4B4, 0xCE92, 0xAF9B, 0xCE93, 0xAF9C, + 0xCE94, 0xC4B5, 0xCE95, 0xAF9D, 0xCE96, 0xAF9E, 0xCE97, 0xAF9F, 0xCE98, 0xC4B6, 0xCE99, 0xAFA0, 0xCE9A, 0xB041, 0xCE9B, 0xB042, + 0xCE9C, 0xB043, 0xCE9D, 0xB044, 0xCE9E, 0xB045, 0xCE9F, 0xB046, 0xCEA0, 0xC4B7, 0xCEA1, 0xC4B8, 0xCEA2, 0xB047, 0xCEA3, 0xC4B9, + 0xCEA4, 0xC4BA, 0xCEA5, 0xC4BB, 0xCEA6, 0xB048, 0xCEA7, 0xB049, 0xCEA8, 0xB04A, 0xCEA9, 0xB04B, 0xCEAA, 0xB04C, 0xCEAB, 0xB04D, + 0xCEAC, 0xC4BC, 0xCEAD, 0xC4BD, 0xCEAE, 0xB04E, 0xCEAF, 0xB04F, 0xCEB0, 0xB050, 0xCEB1, 0xB051, 0xCEB2, 0xB052, 0xCEB3, 0xB053, + 0xCEB4, 0xB054, 0xCEB5, 0xB055, 0xCEB6, 0xB056, 0xCEB7, 0xB057, 0xCEB8, 0xB058, 0xCEB9, 0xB059, 0xCEBA, 0xB05A, 0xCEBB, 0xB061, + 0xCEBC, 0xB062, 0xCEBD, 0xB063, 0xCEBE, 0xB064, 0xCEBF, 0xB065, 0xCEC0, 0xB066, 0xCEC1, 0xC4BE, 0xCEC2, 0xB067, 0xCEC3, 0xB068, + 0xCEC4, 0xB069, 0xCEC5, 0xB06A, 0xCEC6, 0xB06B, 0xCEC7, 0xB06C, 0xCEC8, 0xB06D, 0xCEC9, 0xB06E, 0xCECA, 0xB06F, 0xCECB, 0xB070, + 0xCECC, 0xB071, 0xCECD, 0xB072, 0xCECE, 0xB073, 0xCECF, 0xB074, 0xCED0, 0xB075, 0xCED1, 0xB076, 0xCED2, 0xB077, 0xCED3, 0xB078, + 0xCED4, 0xB079, 0xCED5, 0xB07A, 0xCED6, 0xB081, 0xCED7, 0xB082, 0xCED8, 0xB083, 0xCED9, 0xB084, 0xCEDA, 0xB085, 0xCEDB, 0xB086, + 0xCEDC, 0xB087, 0xCEDD, 0xB088, 0xCEDE, 0xB089, 0xCEDF, 0xB08A, 0xCEE0, 0xB08B, 0xCEE1, 0xB08C, 0xCEE2, 0xB08D, 0xCEE3, 0xB08E, + 0xCEE4, 0xC4BF, 0xCEE5, 0xC4C0, 0xCEE6, 0xB08F, 0xCEE7, 0xB090, 0xCEE8, 0xC4C1, 0xCEE9, 0xB091, 0xCEEA, 0xB092, 0xCEEB, 0xC4C2, + 0xCEEC, 0xC4C3, 0xCEED, 0xB093, 0xCEEE, 0xB094, 0xCEEF, 0xB095, 0xCEF0, 0xB096, 0xCEF1, 0xB097, 0xCEF2, 0xB098, 0xCEF3, 0xB099, + 0xCEF4, 0xC4C4, 0xCEF5, 0xC4C5, 0xCEF6, 0xB09A, 0xCEF7, 0xC4C6, 0xCEF8, 0xC4C7, 0xCEF9, 0xC4C8, 0xCEFA, 0xB09B, 0xCEFB, 0xB09C, + 0xCEFC, 0xB09D, 0xCEFD, 0xB09E, 0xCEFE, 0xB09F, 0xCEFF, 0xB0A0, 0xCF00, 0xC4C9, 0xCF01, 0xC4CA, 0xCF02, 0xB141, 0xCF03, 0xB142, + 0xCF04, 0xC4CB, 0xCF05, 0xB143, 0xCF06, 0xB144, 0xCF07, 0xB145, 0xCF08, 0xC4CC, 0xCF09, 0xB146, 0xCF0A, 0xB147, 0xCF0B, 0xB148, + 0xCF0C, 0xB149, 0xCF0D, 0xB14A, 0xCF0E, 0xB14B, 0xCF0F, 0xB14C, 0xCF10, 0xC4CD, 0xCF11, 0xC4CE, 0xCF12, 0xB14D, 0xCF13, 0xC4CF, + 0xCF14, 0xB14E, 0xCF15, 0xC4D0, 0xCF16, 0xB14F, 0xCF17, 0xB150, 0xCF18, 0xB151, 0xCF19, 0xB152, 0xCF1A, 0xB153, 0xCF1B, 0xB154, + 0xCF1C, 0xC4D1, 0xCF1D, 0xB155, 0xCF1E, 0xB156, 0xCF1F, 0xB157, 0xCF20, 0xC4D2, 0xCF21, 0xB158, 0xCF22, 0xB159, 0xCF23, 0xB15A, + 0xCF24, 0xC4D3, 0xCF25, 0xB161, 0xCF26, 0xB162, 0xCF27, 0xB163, 0xCF28, 0xB164, 0xCF29, 0xB165, 0xCF2A, 0xB166, 0xCF2B, 0xB167, + 0xCF2C, 0xC4D4, 0xCF2D, 0xC4D5, 0xCF2E, 0xB168, 0xCF2F, 0xC4D6, 0xCF30, 0xC4D7, 0xCF31, 0xC4D8, 0xCF32, 0xB169, 0xCF33, 0xB16A, + 0xCF34, 0xB16B, 0xCF35, 0xB16C, 0xCF36, 0xB16D, 0xCF37, 0xB16E, 0xCF38, 0xC4D9, 0xCF39, 0xB16F, 0xCF3A, 0xB170, 0xCF3B, 0xB171, + 0xCF3C, 0xB172, 0xCF3D, 0xB173, 0xCF3E, 0xB174, 0xCF3F, 0xB175, 0xCF40, 0xB176, 0xCF41, 0xB177, 0xCF42, 0xB178, 0xCF43, 0xB179, + 0xCF44, 0xB17A, 0xCF45, 0xB181, 0xCF46, 0xB182, 0xCF47, 0xB183, 0xCF48, 0xB184, 0xCF49, 0xB185, 0xCF4A, 0xB186, 0xCF4B, 0xB187, + 0xCF4C, 0xB188, 0xCF4D, 0xB189, 0xCF4E, 0xB18A, 0xCF4F, 0xB18B, 0xCF50, 0xB18C, 0xCF51, 0xB18D, 0xCF52, 0xB18E, 0xCF53, 0xB18F, + 0xCF54, 0xC4DA, 0xCF55, 0xC4DB, 0xCF56, 0xB190, 0xCF57, 0xB191, 0xCF58, 0xC4DC, 0xCF59, 0xB192, 0xCF5A, 0xB193, 0xCF5B, 0xB194, + 0xCF5C, 0xC4DD, 0xCF5D, 0xB195, 0xCF5E, 0xB196, 0xCF5F, 0xB197, 0xCF60, 0xB198, 0xCF61, 0xB199, 0xCF62, 0xB19A, 0xCF63, 0xB19B, + 0xCF64, 0xC4DE, 0xCF65, 0xC4DF, 0xCF66, 0xB19C, 0xCF67, 0xC4E0, 0xCF68, 0xB19D, 0xCF69, 0xC4E1, 0xCF6A, 0xB19E, 0xCF6B, 0xB19F, + 0xCF6C, 0xB1A0, 0xCF6D, 0xB241, 0xCF6E, 0xB242, 0xCF6F, 0xB243, 0xCF70, 0xC4E2, 0xCF71, 0xC4E3, 0xCF72, 0xB244, 0xCF73, 0xB245, + 0xCF74, 0xC4E4, 0xCF75, 0xB246, 0xCF76, 0xB247, 0xCF77, 0xB248, 0xCF78, 0xC4E5, 0xCF79, 0xB249, 0xCF7A, 0xB24A, 0xCF7B, 0xB24B, + 0xCF7C, 0xB24C, 0xCF7D, 0xB24D, 0xCF7E, 0xB24E, 0xCF7F, 0xB24F, 0xCF80, 0xC4E6, 0xCF81, 0xB250, 0xCF82, 0xB251, 0xCF83, 0xB252, + 0xCF84, 0xB253, 0xCF85, 0xC4E7, 0xCF86, 0xB254, 0xCF87, 0xB255, 0xCF88, 0xB256, 0xCF89, 0xB257, 0xCF8A, 0xB258, 0xCF8B, 0xB259, + 0xCF8C, 0xC4E8, 0xCF8D, 0xB25A, 0xCF8E, 0xB261, 0xCF8F, 0xB262, 0xCF90, 0xB263, 0xCF91, 0xB264, 0xCF92, 0xB265, 0xCF93, 0xB266, + 0xCF94, 0xB267, 0xCF95, 0xB268, 0xCF96, 0xB269, 0xCF97, 0xB26A, 0xCF98, 0xB26B, 0xCF99, 0xB26C, 0xCF9A, 0xB26D, 0xCF9B, 0xB26E, + 0xCF9C, 0xB26F, 0xCF9D, 0xB270, 0xCF9E, 0xB271, 0xCF9F, 0xB272, 0xCFA0, 0xB273, 0xCFA1, 0xC4E9, 0xCFA2, 0xB274, 0xCFA3, 0xB275, + 0xCFA4, 0xB276, 0xCFA5, 0xB277, 0xCFA6, 0xB278, 0xCFA7, 0xB279, 0xCFA8, 0xC4EA, 0xCFA9, 0xB27A, 0xCFAA, 0xB281, 0xCFAB, 0xB282, + 0xCFAC, 0xB283, 0xCFAD, 0xB284, 0xCFAE, 0xB285, 0xCFAF, 0xB286, 0xCFB0, 0xC4EB, 0xCFB1, 0xB287, 0xCFB2, 0xB288, 0xCFB3, 0xB289, + 0xCFB4, 0xB28A, 0xCFB5, 0xB28B, 0xCFB6, 0xB28C, 0xCFB7, 0xB28D, 0xCFB8, 0xB28E, 0xCFB9, 0xB28F, 0xCFBA, 0xB290, 0xCFBB, 0xB291, + 0xCFBC, 0xB292, 0xCFBD, 0xB293, 0xCFBE, 0xB294, 0xCFBF, 0xB295, 0xCFC0, 0xB296, 0xCFC1, 0xB297, 0xCFC2, 0xB298, 0xCFC3, 0xB299, + 0xCFC4, 0xC4EC, 0xCFC5, 0xB29A, 0xCFC6, 0xB29B, 0xCFC7, 0xB29C, 0xCFC8, 0xB29D, 0xCFC9, 0xB29E, 0xCFCA, 0xB29F, 0xCFCB, 0xB2A0, + 0xCFCC, 0xB341, 0xCFCD, 0xB342, 0xCFCE, 0xB343, 0xCFCF, 0xB344, 0xCFD0, 0xB345, 0xCFD1, 0xB346, 0xCFD2, 0xB347, 0xCFD3, 0xB348, + 0xCFD4, 0xB349, 0xCFD5, 0xB34A, 0xCFD6, 0xB34B, 0xCFD7, 0xB34C, 0xCFD8, 0xB34D, 0xCFD9, 0xB34E, 0xCFDA, 0xB34F, 0xCFDB, 0xB350, + 0xCFDC, 0xB351, 0xCFDD, 0xB352, 0xCFDE, 0xB353, 0xCFDF, 0xB354, 0xCFE0, 0xC4ED, 0xCFE1, 0xC4EE, 0xCFE2, 0xB355, 0xCFE3, 0xB356, + 0xCFE4, 0xC4EF, 0xCFE5, 0xB357, 0xCFE6, 0xB358, 0xCFE7, 0xB359, 0xCFE8, 0xC4F0, 0xCFE9, 0xB35A, 0xCFEA, 0xB361, 0xCFEB, 0xB362, + 0xCFEC, 0xB363, 0xCFED, 0xB364, 0xCFEE, 0xB365, 0xCFEF, 0xB366, 0xCFF0, 0xC4F1, 0xCFF1, 0xC4F2, 0xCFF2, 0xB367, 0xCFF3, 0xC4F3, + 0xCFF4, 0xB368, 0xCFF5, 0xC4F4, 0xCFF6, 0xB369, 0xCFF7, 0xB36A, 0xCFF8, 0xB36B, 0xCFF9, 0xB36C, 0xCFFA, 0xB36D, 0xCFFB, 0xB36E, + 0xCFFC, 0xC4F5, 0xCFFD, 0xB36F, 0xCFFE, 0xB370, 0xCFFF, 0xB371, 0xD000, 0xC4F6, 0xD001, 0xB372, 0xD002, 0xB373, 0xD003, 0xB374, + 0xD004, 0xC4F7, 0xD005, 0xB375, 0xD006, 0xB376, 0xD007, 0xB377, 0xD008, 0xB378, 0xD009, 0xB379, 0xD00A, 0xB37A, 0xD00B, 0xB381, + 0xD00C, 0xB382, 0xD00D, 0xB383, 0xD00E, 0xB384, 0xD00F, 0xB385, 0xD010, 0xB386, 0xD011, 0xC4F8, 0xD012, 0xB387, 0xD013, 0xB388, + 0xD014, 0xB389, 0xD015, 0xB38A, 0xD016, 0xB38B, 0xD017, 0xB38C, 0xD018, 0xC4F9, 0xD019, 0xB38D, 0xD01A, 0xB38E, 0xD01B, 0xB38F, + 0xD01C, 0xB390, 0xD01D, 0xB391, 0xD01E, 0xB392, 0xD01F, 0xB393, 0xD020, 0xB394, 0xD021, 0xB395, 0xD022, 0xB396, 0xD023, 0xB397, + 0xD024, 0xB398, 0xD025, 0xB399, 0xD026, 0xB39A, 0xD027, 0xB39B, 0xD028, 0xB39C, 0xD029, 0xB39D, 0xD02A, 0xB39E, 0xD02B, 0xB39F, + 0xD02C, 0xB3A0, 0xD02D, 0xC4FA, 0xD02E, 0xB441, 0xD02F, 0xB442, 0xD030, 0xB443, 0xD031, 0xB444, 0xD032, 0xB445, 0xD033, 0xB446, + 0xD034, 0xC4FB, 0xD035, 0xC4FC, 0xD036, 0xB447, 0xD037, 0xB448, 0xD038, 0xC4FD, 0xD039, 0xB449, 0xD03A, 0xB44A, 0xD03B, 0xB44B, + 0xD03C, 0xC4FE, 0xD03D, 0xB44C, 0xD03E, 0xB44D, 0xD03F, 0xB44E, 0xD040, 0xB44F, 0xD041, 0xB450, 0xD042, 0xB451, 0xD043, 0xB452, + 0xD044, 0xC5A1, 0xD045, 0xC5A2, 0xD046, 0xB453, 0xD047, 0xC5A3, 0xD048, 0xB454, 0xD049, 0xC5A4, 0xD04A, 0xB455, 0xD04B, 0xB456, + 0xD04C, 0xB457, 0xD04D, 0xB458, 0xD04E, 0xB459, 0xD04F, 0xB45A, 0xD050, 0xC5A5, 0xD051, 0xB461, 0xD052, 0xB462, 0xD053, 0xB463, + 0xD054, 0xC5A6, 0xD055, 0xB464, 0xD056, 0xB465, 0xD057, 0xB466, 0xD058, 0xC5A7, 0xD059, 0xB467, 0xD05A, 0xB468, 0xD05B, 0xB469, + 0xD05C, 0xB46A, 0xD05D, 0xB46B, 0xD05E, 0xB46C, 0xD05F, 0xB46D, 0xD060, 0xC5A8, 0xD061, 0xB46E, 0xD062, 0xB46F, 0xD063, 0xB470, + 0xD064, 0xB471, 0xD065, 0xB472, 0xD066, 0xB473, 0xD067, 0xB474, 0xD068, 0xB475, 0xD069, 0xB476, 0xD06A, 0xB477, 0xD06B, 0xB478, + 0xD06C, 0xC5A9, 0xD06D, 0xC5AA, 0xD06E, 0xB479, 0xD06F, 0xB47A, 0xD070, 0xC5AB, 0xD071, 0xB481, 0xD072, 0xB482, 0xD073, 0xB483, + 0xD074, 0xC5AC, 0xD075, 0xB484, 0xD076, 0xB485, 0xD077, 0xB486, 0xD078, 0xB487, 0xD079, 0xB488, 0xD07A, 0xB489, 0xD07B, 0xB48A, + 0xD07C, 0xC5AD, 0xD07D, 0xC5AE, 0xD07E, 0xB48B, 0xD07F, 0xB48C, 0xD080, 0xB48D, 0xD081, 0xC5AF, 0xD082, 0xB48E, 0xD083, 0xB48F, + 0xD084, 0xB490, 0xD085, 0xB491, 0xD086, 0xB492, 0xD087, 0xB493, 0xD088, 0xB494, 0xD089, 0xB495, 0xD08A, 0xB496, 0xD08B, 0xB497, + 0xD08C, 0xB498, 0xD08D, 0xB499, 0xD08E, 0xB49A, 0xD08F, 0xB49B, 0xD090, 0xB49C, 0xD091, 0xB49D, 0xD092, 0xB49E, 0xD093, 0xB49F, + 0xD094, 0xB4A0, 0xD095, 0xB541, 0xD096, 0xB542, 0xD097, 0xB543, 0xD098, 0xB544, 0xD099, 0xB545, 0xD09A, 0xB546, 0xD09B, 0xB547, + 0xD09C, 0xB548, 0xD09D, 0xB549, 0xD09E, 0xB54A, 0xD09F, 0xB54B, 0xD0A0, 0xB54C, 0xD0A1, 0xB54D, 0xD0A2, 0xB54E, 0xD0A3, 0xB54F, + 0xD0A4, 0xC5B0, 0xD0A5, 0xC5B1, 0xD0A6, 0xB550, 0xD0A7, 0xB551, 0xD0A8, 0xC5B2, 0xD0A9, 0xB552, 0xD0AA, 0xB553, 0xD0AB, 0xB554, + 0xD0AC, 0xC5B3, 0xD0AD, 0xB555, 0xD0AE, 0xB556, 0xD0AF, 0xB557, 0xD0B0, 0xB558, 0xD0B1, 0xB559, 0xD0B2, 0xB55A, 0xD0B3, 0xB561, + 0xD0B4, 0xC5B4, 0xD0B5, 0xC5B5, 0xD0B6, 0xB562, 0xD0B7, 0xC5B6, 0xD0B8, 0xB563, 0xD0B9, 0xC5B7, 0xD0BA, 0xB564, 0xD0BB, 0xB565, + 0xD0BC, 0xB566, 0xD0BD, 0xB567, 0xD0BE, 0xB568, 0xD0BF, 0xB569, 0xD0C0, 0xC5B8, 0xD0C1, 0xC5B9, 0xD0C2, 0xB56A, 0xD0C3, 0xB56B, + 0xD0C4, 0xC5BA, 0xD0C5, 0xB56C, 0xD0C6, 0xB56D, 0xD0C7, 0xB56E, 0xD0C8, 0xC5BB, 0xD0C9, 0xC5BC, 0xD0CA, 0xB56F, 0xD0CB, 0xB570, + 0xD0CC, 0xB571, 0xD0CD, 0xB572, 0xD0CE, 0xB573, 0xD0CF, 0xB574, 0xD0D0, 0xC5BD, 0xD0D1, 0xC5BE, 0xD0D2, 0xB575, 0xD0D3, 0xC5BF, + 0xD0D4, 0xC5C0, 0xD0D5, 0xC5C1, 0xD0D6, 0xB576, 0xD0D7, 0xB577, 0xD0D8, 0xB578, 0xD0D9, 0xB579, 0xD0DA, 0xB57A, 0xD0DB, 0xB581, + 0xD0DC, 0xC5C2, 0xD0DD, 0xC5C3, 0xD0DE, 0xB582, 0xD0DF, 0xB583, 0xD0E0, 0xC5C4, 0xD0E1, 0xB584, 0xD0E2, 0xB585, 0xD0E3, 0xB586, + 0xD0E4, 0xC5C5, 0xD0E5, 0xB587, 0xD0E6, 0xB588, 0xD0E7, 0xB589, 0xD0E8, 0xB58A, 0xD0E9, 0xB58B, 0xD0EA, 0xB58C, 0xD0EB, 0xB58D, + 0xD0EC, 0xC5C6, 0xD0ED, 0xC5C7, 0xD0EE, 0xB58E, 0xD0EF, 0xC5C8, 0xD0F0, 0xC5C9, 0xD0F1, 0xC5CA, 0xD0F2, 0xB58F, 0xD0F3, 0xB590, + 0xD0F4, 0xB591, 0xD0F5, 0xB592, 0xD0F6, 0xB593, 0xD0F7, 0xB594, 0xD0F8, 0xC5CB, 0xD0F9, 0xB595, 0xD0FA, 0xB596, 0xD0FB, 0xB597, + 0xD0FC, 0xB598, 0xD0FD, 0xB599, 0xD0FE, 0xB59A, 0xD0FF, 0xB59B, 0xD100, 0xB59C, 0xD101, 0xB59D, 0xD102, 0xB59E, 0xD103, 0xB59F, + 0xD104, 0xB5A0, 0xD105, 0xB641, 0xD106, 0xB642, 0xD107, 0xB643, 0xD108, 0xB644, 0xD109, 0xB645, 0xD10A, 0xB646, 0xD10B, 0xB647, + 0xD10C, 0xB648, 0xD10D, 0xC5CC, 0xD10E, 0xB649, 0xD10F, 0xB64A, 0xD110, 0xB64B, 0xD111, 0xB64C, 0xD112, 0xB64D, 0xD113, 0xB64E, + 0xD114, 0xB64F, 0xD115, 0xB650, 0xD116, 0xB651, 0xD117, 0xB652, 0xD118, 0xB653, 0xD119, 0xB654, 0xD11A, 0xB655, 0xD11B, 0xB656, + 0xD11C, 0xB657, 0xD11D, 0xB658, 0xD11E, 0xB659, 0xD11F, 0xB65A, 0xD120, 0xB661, 0xD121, 0xB662, 0xD122, 0xB663, 0xD123, 0xB664, + 0xD124, 0xB665, 0xD125, 0xB666, 0xD126, 0xB667, 0xD127, 0xB668, 0xD128, 0xB669, 0xD129, 0xB66A, 0xD12A, 0xB66B, 0xD12B, 0xB66C, + 0xD12C, 0xB66D, 0xD12D, 0xB66E, 0xD12E, 0xB66F, 0xD12F, 0xB670, 0xD130, 0xC5CD, 0xD131, 0xC5CE, 0xD132, 0xB671, 0xD133, 0xB672, + 0xD134, 0xC5CF, 0xD135, 0xB673, 0xD136, 0xB674, 0xD137, 0xB675, 0xD138, 0xC5D0, 0xD139, 0xB676, 0xD13A, 0xC5D1, 0xD13B, 0xB677, + 0xD13C, 0xB678, 0xD13D, 0xB679, 0xD13E, 0xB67A, 0xD13F, 0xB681, 0xD140, 0xC5D2, 0xD141, 0xC5D3, 0xD142, 0xB682, 0xD143, 0xC5D4, + 0xD144, 0xC5D5, 0xD145, 0xC5D6, 0xD146, 0xB683, 0xD147, 0xB684, 0xD148, 0xB685, 0xD149, 0xB686, 0xD14A, 0xB687, 0xD14B, 0xB688, + 0xD14C, 0xC5D7, 0xD14D, 0xC5D8, 0xD14E, 0xB689, 0xD14F, 0xB68A, 0xD150, 0xC5D9, 0xD151, 0xB68B, 0xD152, 0xB68C, 0xD153, 0xB68D, + 0xD154, 0xC5DA, 0xD155, 0xB68E, 0xD156, 0xB68F, 0xD157, 0xB690, 0xD158, 0xB691, 0xD159, 0xB692, 0xD15A, 0xB693, 0xD15B, 0xB694, + 0xD15C, 0xC5DB, 0xD15D, 0xC5DC, 0xD15E, 0xB695, 0xD15F, 0xC5DD, 0xD160, 0xB696, 0xD161, 0xC5DE, 0xD162, 0xB697, 0xD163, 0xB698, + 0xD164, 0xB699, 0xD165, 0xB69A, 0xD166, 0xB69B, 0xD167, 0xB69C, 0xD168, 0xC5DF, 0xD169, 0xB69D, 0xD16A, 0xB69E, 0xD16B, 0xB69F, + 0xD16C, 0xC5E0, 0xD16D, 0xB6A0, 0xD16E, 0xB741, 0xD16F, 0xB742, 0xD170, 0xB743, 0xD171, 0xB744, 0xD172, 0xB745, 0xD173, 0xB746, + 0xD174, 0xB747, 0xD175, 0xB748, 0xD176, 0xB749, 0xD177, 0xB74A, 0xD178, 0xB74B, 0xD179, 0xB74C, 0xD17A, 0xB74D, 0xD17B, 0xB74E, + 0xD17C, 0xC5E1, 0xD17D, 0xB74F, 0xD17E, 0xB750, 0xD17F, 0xB751, 0xD180, 0xB752, 0xD181, 0xB753, 0xD182, 0xB754, 0xD183, 0xB755, + 0xD184, 0xC5E2, 0xD185, 0xB756, 0xD186, 0xB757, 0xD187, 0xB758, 0xD188, 0xC5E3, 0xD189, 0xB759, 0xD18A, 0xB75A, 0xD18B, 0xB761, + 0xD18C, 0xB762, 0xD18D, 0xB763, 0xD18E, 0xB764, 0xD18F, 0xB765, 0xD190, 0xB766, 0xD191, 0xB767, 0xD192, 0xB768, 0xD193, 0xB769, + 0xD194, 0xB76A, 0xD195, 0xB76B, 0xD196, 0xB76C, 0xD197, 0xB76D, 0xD198, 0xB76E, 0xD199, 0xB76F, 0xD19A, 0xB770, 0xD19B, 0xB771, + 0xD19C, 0xB772, 0xD19D, 0xB773, 0xD19E, 0xB774, 0xD19F, 0xB775, 0xD1A0, 0xC5E4, 0xD1A1, 0xC5E5, 0xD1A2, 0xB776, 0xD1A3, 0xB777, + 0xD1A4, 0xC5E6, 0xD1A5, 0xB778, 0xD1A6, 0xB779, 0xD1A7, 0xB77A, 0xD1A8, 0xC5E7, 0xD1A9, 0xB781, 0xD1AA, 0xB782, 0xD1AB, 0xB783, + 0xD1AC, 0xB784, 0xD1AD, 0xB785, 0xD1AE, 0xB786, 0xD1AF, 0xB787, 0xD1B0, 0xC5E8, 0xD1B1, 0xC5E9, 0xD1B2, 0xB788, 0xD1B3, 0xC5EA, + 0xD1B4, 0xB789, 0xD1B5, 0xC5EB, 0xD1B6, 0xB78A, 0xD1B7, 0xB78B, 0xD1B8, 0xB78C, 0xD1B9, 0xB78D, 0xD1BA, 0xC5EC, 0xD1BB, 0xB78E, + 0xD1BC, 0xC5ED, 0xD1BD, 0xB78F, 0xD1BE, 0xB790, 0xD1BF, 0xB791, 0xD1C0, 0xC5EE, 0xD1C1, 0xB792, 0xD1C2, 0xB793, 0xD1C3, 0xB794, + 0xD1C4, 0xB795, 0xD1C5, 0xB796, 0xD1C6, 0xB797, 0xD1C7, 0xB798, 0xD1C8, 0xB799, 0xD1C9, 0xB79A, 0xD1CA, 0xB79B, 0xD1CB, 0xB79C, + 0xD1CC, 0xB79D, 0xD1CD, 0xB79E, 0xD1CE, 0xB79F, 0xD1CF, 0xB7A0, 0xD1D0, 0xB841, 0xD1D1, 0xB842, 0xD1D2, 0xB843, 0xD1D3, 0xB844, + 0xD1D4, 0xB845, 0xD1D5, 0xB846, 0xD1D6, 0xB847, 0xD1D7, 0xB848, 0xD1D8, 0xC5EF, 0xD1D9, 0xB849, 0xD1DA, 0xB84A, 0xD1DB, 0xB84B, + 0xD1DC, 0xB84C, 0xD1DD, 0xB84D, 0xD1DE, 0xB84E, 0xD1DF, 0xB84F, 0xD1E0, 0xB850, 0xD1E1, 0xB851, 0xD1E2, 0xB852, 0xD1E3, 0xB853, + 0xD1E4, 0xB854, 0xD1E5, 0xB855, 0xD1E6, 0xB856, 0xD1E7, 0xB857, 0xD1E8, 0xB858, 0xD1E9, 0xB859, 0xD1EA, 0xB85A, 0xD1EB, 0xB861, + 0xD1EC, 0xB862, 0xD1ED, 0xB863, 0xD1EE, 0xB864, 0xD1EF, 0xB865, 0xD1F0, 0xB866, 0xD1F1, 0xB867, 0xD1F2, 0xB868, 0xD1F3, 0xB869, + 0xD1F4, 0xC5F0, 0xD1F5, 0xB86A, 0xD1F6, 0xB86B, 0xD1F7, 0xB86C, 0xD1F8, 0xC5F1, 0xD1F9, 0xB86D, 0xD1FA, 0xB86E, 0xD1FB, 0xB86F, + 0xD1FC, 0xB870, 0xD1FD, 0xB871, 0xD1FE, 0xB872, 0xD1FF, 0xB873, 0xD200, 0xB874, 0xD201, 0xB875, 0xD202, 0xB876, 0xD203, 0xB877, + 0xD204, 0xB878, 0xD205, 0xB879, 0xD206, 0xB87A, 0xD207, 0xC5F2, 0xD208, 0xB881, 0xD209, 0xC5F3, 0xD20A, 0xB882, 0xD20B, 0xB883, + 0xD20C, 0xB884, 0xD20D, 0xB885, 0xD20E, 0xB886, 0xD20F, 0xB887, 0xD210, 0xC5F4, 0xD211, 0xB888, 0xD212, 0xB889, 0xD213, 0xB88A, + 0xD214, 0xB88B, 0xD215, 0xB88C, 0xD216, 0xB88D, 0xD217, 0xB88E, 0xD218, 0xB88F, 0xD219, 0xB890, 0xD21A, 0xB891, 0xD21B, 0xB892, + 0xD21C, 0xB893, 0xD21D, 0xB894, 0xD21E, 0xB895, 0xD21F, 0xB896, 0xD220, 0xB897, 0xD221, 0xB898, 0xD222, 0xB899, 0xD223, 0xB89A, + 0xD224, 0xB89B, 0xD225, 0xB89C, 0xD226, 0xB89D, 0xD227, 0xB89E, 0xD228, 0xB89F, 0xD229, 0xB8A0, 0xD22A, 0xB941, 0xD22B, 0xB942, + 0xD22C, 0xC5F5, 0xD22D, 0xC5F6, 0xD22E, 0xB943, 0xD22F, 0xB944, 0xD230, 0xC5F7, 0xD231, 0xB945, 0xD232, 0xB946, 0xD233, 0xB947, + 0xD234, 0xC5F8, 0xD235, 0xB948, 0xD236, 0xB949, 0xD237, 0xB94A, 0xD238, 0xB94B, 0xD239, 0xB94C, 0xD23A, 0xB94D, 0xD23B, 0xB94E, + 0xD23C, 0xC5F9, 0xD23D, 0xC5FA, 0xD23E, 0xB94F, 0xD23F, 0xC5FB, 0xD240, 0xB950, 0xD241, 0xC5FC, 0xD242, 0xB951, 0xD243, 0xB952, + 0xD244, 0xB953, 0xD245, 0xB954, 0xD246, 0xB955, 0xD247, 0xB956, 0xD248, 0xC5FD, 0xD249, 0xB957, 0xD24A, 0xB958, 0xD24B, 0xB959, + 0xD24C, 0xB95A, 0xD24D, 0xB961, 0xD24E, 0xB962, 0xD24F, 0xB963, 0xD250, 0xB964, 0xD251, 0xB965, 0xD252, 0xB966, 0xD253, 0xB967, + 0xD254, 0xB968, 0xD255, 0xB969, 0xD256, 0xB96A, 0xD257, 0xB96B, 0xD258, 0xB96C, 0xD259, 0xB96D, 0xD25A, 0xB96E, 0xD25B, 0xB96F, + 0xD25C, 0xC5FE, 0xD25D, 0xB970, 0xD25E, 0xB971, 0xD25F, 0xB972, 0xD260, 0xB973, 0xD261, 0xB974, 0xD262, 0xB975, 0xD263, 0xB976, + 0xD264, 0xC6A1, 0xD265, 0xB977, 0xD266, 0xB978, 0xD267, 0xB979, 0xD268, 0xB97A, 0xD269, 0xB981, 0xD26A, 0xB982, 0xD26B, 0xB983, + 0xD26C, 0xB984, 0xD26D, 0xB985, 0xD26E, 0xB986, 0xD26F, 0xB987, 0xD270, 0xB988, 0xD271, 0xB989, 0xD272, 0xB98A, 0xD273, 0xB98B, + 0xD274, 0xB98C, 0xD275, 0xB98D, 0xD276, 0xB98E, 0xD277, 0xB98F, 0xD278, 0xB990, 0xD279, 0xB991, 0xD27A, 0xB992, 0xD27B, 0xB993, + 0xD27C, 0xB994, 0xD27D, 0xB995, 0xD27E, 0xB996, 0xD27F, 0xB997, 0xD280, 0xC6A2, 0xD281, 0xC6A3, 0xD282, 0xB998, 0xD283, 0xB999, + 0xD284, 0xC6A4, 0xD285, 0xB99A, 0xD286, 0xB99B, 0xD287, 0xB99C, 0xD288, 0xC6A5, 0xD289, 0xB99D, 0xD28A, 0xB99E, 0xD28B, 0xB99F, + 0xD28C, 0xB9A0, 0xD28D, 0xBA41, 0xD28E, 0xBA42, 0xD28F, 0xBA43, 0xD290, 0xC6A6, 0xD291, 0xC6A7, 0xD292, 0xBA44, 0xD293, 0xBA45, + 0xD294, 0xBA46, 0xD295, 0xC6A8, 0xD296, 0xBA47, 0xD297, 0xBA48, 0xD298, 0xBA49, 0xD299, 0xBA4A, 0xD29A, 0xBA4B, 0xD29B, 0xBA4C, + 0xD29C, 0xC6A9, 0xD29D, 0xBA4D, 0xD29E, 0xBA4E, 0xD29F, 0xBA4F, 0xD2A0, 0xC6AA, 0xD2A1, 0xBA50, 0xD2A2, 0xBA51, 0xD2A3, 0xBA52, + 0xD2A4, 0xC6AB, 0xD2A5, 0xBA53, 0xD2A6, 0xBA54, 0xD2A7, 0xBA55, 0xD2A8, 0xBA56, 0xD2A9, 0xBA57, 0xD2AA, 0xBA58, 0xD2AB, 0xBA59, + 0xD2AC, 0xC6AC, 0xD2AD, 0xBA5A, 0xD2AE, 0xBA61, 0xD2AF, 0xBA62, 0xD2B0, 0xBA63, 0xD2B1, 0xC6AD, 0xD2B2, 0xBA64, 0xD2B3, 0xBA65, + 0xD2B4, 0xBA66, 0xD2B5, 0xBA67, 0xD2B6, 0xBA68, 0xD2B7, 0xBA69, 0xD2B8, 0xC6AE, 0xD2B9, 0xC6AF, 0xD2BA, 0xBA6A, 0xD2BB, 0xBA6B, + 0xD2BC, 0xC6B0, 0xD2BD, 0xBA6C, 0xD2BE, 0xBA6D, 0xD2BF, 0xC6B1, 0xD2C0, 0xC6B2, 0xD2C1, 0xBA6E, 0xD2C2, 0xC6B3, 0xD2C3, 0xBA6F, + 0xD2C4, 0xBA70, 0xD2C5, 0xBA71, 0xD2C6, 0xBA72, 0xD2C7, 0xBA73, 0xD2C8, 0xC6B4, 0xD2C9, 0xC6B5, 0xD2CA, 0xBA74, 0xD2CB, 0xC6B6, + 0xD2CC, 0xBA75, 0xD2CD, 0xBA76, 0xD2CE, 0xBA77, 0xD2CF, 0xBA78, 0xD2D0, 0xBA79, 0xD2D1, 0xBA7A, 0xD2D2, 0xBA81, 0xD2D3, 0xBA82, + 0xD2D4, 0xC6B7, 0xD2D5, 0xBA83, 0xD2D6, 0xBA84, 0xD2D7, 0xBA85, 0xD2D8, 0xC6B8, 0xD2D9, 0xBA86, 0xD2DA, 0xBA87, 0xD2DB, 0xBA88, + 0xD2DC, 0xC6B9, 0xD2DD, 0xBA89, 0xD2DE, 0xBA8A, 0xD2DF, 0xBA8B, 0xD2E0, 0xBA8C, 0xD2E1, 0xBA8D, 0xD2E2, 0xBA8E, 0xD2E3, 0xBA8F, + 0xD2E4, 0xC6BA, 0xD2E5, 0xC6BB, 0xD2E6, 0xBA90, 0xD2E7, 0xBA91, 0xD2E8, 0xBA92, 0xD2E9, 0xBA93, 0xD2EA, 0xBA94, 0xD2EB, 0xBA95, + 0xD2EC, 0xBA96, 0xD2ED, 0xBA97, 0xD2EE, 0xBA98, 0xD2EF, 0xBA99, 0xD2F0, 0xC6BC, 0xD2F1, 0xC6BD, 0xD2F2, 0xBA9A, 0xD2F3, 0xBA9B, + 0xD2F4, 0xC6BE, 0xD2F5, 0xBA9C, 0xD2F6, 0xBA9D, 0xD2F7, 0xBA9E, 0xD2F8, 0xC6BF, 0xD2F9, 0xBA9F, 0xD2FA, 0xBAA0, 0xD2FB, 0xBB41, + 0xD2FC, 0xBB42, 0xD2FD, 0xBB43, 0xD2FE, 0xBB44, 0xD2FF, 0xBB45, 0xD300, 0xC6C0, 0xD301, 0xC6C1, 0xD302, 0xBB46, 0xD303, 0xC6C2, + 0xD304, 0xBB47, 0xD305, 0xC6C3, 0xD306, 0xBB48, 0xD307, 0xBB49, 0xD308, 0xBB4A, 0xD309, 0xBB4B, 0xD30A, 0xBB4C, 0xD30B, 0xBB4D, + 0xD30C, 0xC6C4, 0xD30D, 0xC6C5, 0xD30E, 0xC6C6, 0xD30F, 0xBB4E, 0xD310, 0xC6C7, 0xD311, 0xBB4F, 0xD312, 0xBB50, 0xD313, 0xBB51, + 0xD314, 0xC6C8, 0xD315, 0xBB52, 0xD316, 0xC6C9, 0xD317, 0xBB53, 0xD318, 0xBB54, 0xD319, 0xBB55, 0xD31A, 0xBB56, 0xD31B, 0xBB57, + 0xD31C, 0xC6CA, 0xD31D, 0xC6CB, 0xD31E, 0xBB58, 0xD31F, 0xC6CC, 0xD320, 0xC6CD, 0xD321, 0xC6CE, 0xD322, 0xBB59, 0xD323, 0xBB5A, + 0xD324, 0xBB61, 0xD325, 0xC6CF, 0xD326, 0xBB62, 0xD327, 0xBB63, 0xD328, 0xC6D0, 0xD329, 0xC6D1, 0xD32A, 0xBB64, 0xD32B, 0xBB65, + 0xD32C, 0xC6D2, 0xD32D, 0xBB66, 0xD32E, 0xBB67, 0xD32F, 0xBB68, 0xD330, 0xC6D3, 0xD331, 0xBB69, 0xD332, 0xBB6A, 0xD333, 0xBB6B, + 0xD334, 0xBB6C, 0xD335, 0xBB6D, 0xD336, 0xBB6E, 0xD337, 0xBB6F, 0xD338, 0xC6D4, 0xD339, 0xC6D5, 0xD33A, 0xBB70, 0xD33B, 0xC6D6, + 0xD33C, 0xC6D7, 0xD33D, 0xC6D8, 0xD33E, 0xBB71, 0xD33F, 0xBB72, 0xD340, 0xBB73, 0xD341, 0xBB74, 0xD342, 0xBB75, 0xD343, 0xBB76, + 0xD344, 0xC6D9, 0xD345, 0xC6DA, 0xD346, 0xBB77, 0xD347, 0xBB78, 0xD348, 0xBB79, 0xD349, 0xBB7A, 0xD34A, 0xBB81, 0xD34B, 0xBB82, + 0xD34C, 0xBB83, 0xD34D, 0xBB84, 0xD34E, 0xBB85, 0xD34F, 0xBB86, 0xD350, 0xBB87, 0xD351, 0xBB88, 0xD352, 0xBB89, 0xD353, 0xBB8A, + 0xD354, 0xBB8B, 0xD355, 0xBB8C, 0xD356, 0xBB8D, 0xD357, 0xBB8E, 0xD358, 0xBB8F, 0xD359, 0xBB90, 0xD35A, 0xBB91, 0xD35B, 0xBB92, + 0xD35C, 0xBB93, 0xD35D, 0xBB94, 0xD35E, 0xBB95, 0xD35F, 0xBB96, 0xD360, 0xBB97, 0xD361, 0xBB98, 0xD362, 0xBB99, 0xD363, 0xBB9A, + 0xD364, 0xBB9B, 0xD365, 0xBB9C, 0xD366, 0xBB9D, 0xD367, 0xBB9E, 0xD368, 0xBB9F, 0xD369, 0xBBA0, 0xD36A, 0xBC41, 0xD36B, 0xBC42, + 0xD36C, 0xBC43, 0xD36D, 0xBC44, 0xD36E, 0xBC45, 0xD36F, 0xBC46, 0xD370, 0xBC47, 0xD371, 0xBC48, 0xD372, 0xBC49, 0xD373, 0xBC4A, + 0xD374, 0xBC4B, 0xD375, 0xBC4C, 0xD376, 0xBC4D, 0xD377, 0xBC4E, 0xD378, 0xBC4F, 0xD379, 0xBC50, 0xD37A, 0xBC51, 0xD37B, 0xBC52, + 0xD37C, 0xC6DB, 0xD37D, 0xC6DC, 0xD37E, 0xBC53, 0xD37F, 0xBC54, 0xD380, 0xC6DD, 0xD381, 0xBC55, 0xD382, 0xBC56, 0xD383, 0xBC57, + 0xD384, 0xC6DE, 0xD385, 0xBC58, 0xD386, 0xBC59, 0xD387, 0xBC5A, 0xD388, 0xBC61, 0xD389, 0xBC62, 0xD38A, 0xBC63, 0xD38B, 0xBC64, + 0xD38C, 0xC6DF, 0xD38D, 0xC6E0, 0xD38E, 0xBC65, 0xD38F, 0xC6E1, 0xD390, 0xC6E2, 0xD391, 0xC6E3, 0xD392, 0xBC66, 0xD393, 0xBC67, + 0xD394, 0xBC68, 0xD395, 0xBC69, 0xD396, 0xBC6A, 0xD397, 0xBC6B, 0xD398, 0xC6E4, 0xD399, 0xC6E5, 0xD39A, 0xBC6C, 0xD39B, 0xBC6D, + 0xD39C, 0xC6E6, 0xD39D, 0xBC6E, 0xD39E, 0xBC6F, 0xD39F, 0xBC70, 0xD3A0, 0xC6E7, 0xD3A1, 0xBC71, 0xD3A2, 0xBC72, 0xD3A3, 0xBC73, + 0xD3A4, 0xBC74, 0xD3A5, 0xBC75, 0xD3A6, 0xBC76, 0xD3A7, 0xBC77, 0xD3A8, 0xC6E8, 0xD3A9, 0xC6E9, 0xD3AA, 0xBC78, 0xD3AB, 0xC6EA, + 0xD3AC, 0xBC79, 0xD3AD, 0xC6EB, 0xD3AE, 0xBC7A, 0xD3AF, 0xBC81, 0xD3B0, 0xBC82, 0xD3B1, 0xBC83, 0xD3B2, 0xBC84, 0xD3B3, 0xBC85, + 0xD3B4, 0xC6EC, 0xD3B5, 0xBC86, 0xD3B6, 0xBC87, 0xD3B7, 0xBC88, 0xD3B8, 0xC6ED, 0xD3B9, 0xBC89, 0xD3BA, 0xBC8A, 0xD3BB, 0xBC8B, + 0xD3BC, 0xC6EE, 0xD3BD, 0xBC8C, 0xD3BE, 0xBC8D, 0xD3BF, 0xBC8E, 0xD3C0, 0xBC8F, 0xD3C1, 0xBC90, 0xD3C2, 0xBC91, 0xD3C3, 0xBC92, + 0xD3C4, 0xC6EF, 0xD3C5, 0xC6F0, 0xD3C6, 0xBC93, 0xD3C7, 0xBC94, 0xD3C8, 0xC6F1, 0xD3C9, 0xC6F2, 0xD3CA, 0xBC95, 0xD3CB, 0xBC96, + 0xD3CC, 0xBC97, 0xD3CD, 0xBC98, 0xD3CE, 0xBC99, 0xD3CF, 0xBC9A, 0xD3D0, 0xC6F3, 0xD3D1, 0xBC9B, 0xD3D2, 0xBC9C, 0xD3D3, 0xBC9D, + 0xD3D4, 0xBC9E, 0xD3D5, 0xBC9F, 0xD3D6, 0xBCA0, 0xD3D7, 0xBD41, 0xD3D8, 0xC6F4, 0xD3D9, 0xBD42, 0xD3DA, 0xBD43, 0xD3DB, 0xBD44, + 0xD3DC, 0xBD45, 0xD3DD, 0xBD46, 0xD3DE, 0xBD47, 0xD3DF, 0xBD48, 0xD3E0, 0xBD49, 0xD3E1, 0xC6F5, 0xD3E2, 0xBD4A, 0xD3E3, 0xC6F6, + 0xD3E4, 0xBD4B, 0xD3E5, 0xBD4C, 0xD3E6, 0xBD4D, 0xD3E7, 0xBD4E, 0xD3E8, 0xBD4F, 0xD3E9, 0xBD50, 0xD3EA, 0xBD51, 0xD3EB, 0xBD52, + 0xD3EC, 0xC6F7, 0xD3ED, 0xC6F8, 0xD3EE, 0xBD53, 0xD3EF, 0xBD54, 0xD3F0, 0xC6F9, 0xD3F1, 0xBD55, 0xD3F2, 0xBD56, 0xD3F3, 0xBD57, + 0xD3F4, 0xC6FA, 0xD3F5, 0xBD58, 0xD3F6, 0xBD59, 0xD3F7, 0xBD5A, 0xD3F8, 0xBD61, 0xD3F9, 0xBD62, 0xD3FA, 0xBD63, 0xD3FB, 0xBD64, + 0xD3FC, 0xC6FB, 0xD3FD, 0xC6FC, 0xD3FE, 0xBD65, 0xD3FF, 0xC6FD, 0xD400, 0xBD66, 0xD401, 0xC6FE, 0xD402, 0xBD67, 0xD403, 0xBD68, + 0xD404, 0xBD69, 0xD405, 0xBD6A, 0xD406, 0xBD6B, 0xD407, 0xBD6C, 0xD408, 0xC7A1, 0xD409, 0xBD6D, 0xD40A, 0xBD6E, 0xD40B, 0xBD6F, + 0xD40C, 0xBD70, 0xD40D, 0xBD71, 0xD40E, 0xBD72, 0xD40F, 0xBD73, 0xD410, 0xBD74, 0xD411, 0xBD75, 0xD412, 0xBD76, 0xD413, 0xBD77, + 0xD414, 0xBD78, 0xD415, 0xBD79, 0xD416, 0xBD7A, 0xD417, 0xBD81, 0xD418, 0xBD82, 0xD419, 0xBD83, 0xD41A, 0xBD84, 0xD41B, 0xBD85, + 0xD41C, 0xBD86, 0xD41D, 0xC7A2, 0xD41E, 0xBD87, 0xD41F, 0xBD88, 0xD420, 0xBD89, 0xD421, 0xBD8A, 0xD422, 0xBD8B, 0xD423, 0xBD8C, + 0xD424, 0xBD8D, 0xD425, 0xBD8E, 0xD426, 0xBD8F, 0xD427, 0xBD90, 0xD428, 0xBD91, 0xD429, 0xBD92, 0xD42A, 0xBD93, 0xD42B, 0xBD94, + 0xD42C, 0xBD95, 0xD42D, 0xBD96, 0xD42E, 0xBD97, 0xD42F, 0xBD98, 0xD430, 0xBD99, 0xD431, 0xBD9A, 0xD432, 0xBD9B, 0xD433, 0xBD9C, + 0xD434, 0xBD9D, 0xD435, 0xBD9E, 0xD436, 0xBD9F, 0xD437, 0xBDA0, 0xD438, 0xBE41, 0xD439, 0xBE42, 0xD43A, 0xBE43, 0xD43B, 0xBE44, + 0xD43C, 0xBE45, 0xD43D, 0xBE46, 0xD43E, 0xBE47, 0xD43F, 0xBE48, 0xD440, 0xC7A3, 0xD441, 0xBE49, 0xD442, 0xBE4A, 0xD443, 0xBE4B, + 0xD444, 0xC7A4, 0xD445, 0xBE4C, 0xD446, 0xBE4D, 0xD447, 0xBE4E, 0xD448, 0xBE4F, 0xD449, 0xBE50, 0xD44A, 0xBE51, 0xD44B, 0xBE52, + 0xD44C, 0xBE53, 0xD44D, 0xBE54, 0xD44E, 0xBE55, 0xD44F, 0xBE56, 0xD450, 0xBE57, 0xD451, 0xBE58, 0xD452, 0xBE59, 0xD453, 0xBE5A, + 0xD454, 0xBE61, 0xD455, 0xBE62, 0xD456, 0xBE63, 0xD457, 0xBE64, 0xD458, 0xBE65, 0xD459, 0xBE66, 0xD45A, 0xBE67, 0xD45B, 0xBE68, + 0xD45C, 0xC7A5, 0xD45D, 0xBE69, 0xD45E, 0xBE6A, 0xD45F, 0xBE6B, 0xD460, 0xC7A6, 0xD461, 0xBE6C, 0xD462, 0xBE6D, 0xD463, 0xBE6E, + 0xD464, 0xC7A7, 0xD465, 0xBE6F, 0xD466, 0xBE70, 0xD467, 0xBE71, 0xD468, 0xBE72, 0xD469, 0xBE73, 0xD46A, 0xBE74, 0xD46B, 0xBE75, + 0xD46C, 0xBE76, 0xD46D, 0xC7A8, 0xD46E, 0xBE77, 0xD46F, 0xC7A9, 0xD470, 0xBE78, 0xD471, 0xBE79, 0xD472, 0xBE7A, 0xD473, 0xBE81, + 0xD474, 0xBE82, 0xD475, 0xBE83, 0xD476, 0xBE84, 0xD477, 0xBE85, 0xD478, 0xC7AA, 0xD479, 0xC7AB, 0xD47A, 0xBE86, 0xD47B, 0xBE87, + 0xD47C, 0xC7AC, 0xD47D, 0xBE88, 0xD47E, 0xBE89, 0xD47F, 0xC7AD, 0xD480, 0xC7AE, 0xD481, 0xBE8A, 0xD482, 0xC7AF, 0xD483, 0xBE8B, + 0xD484, 0xBE8C, 0xD485, 0xBE8D, 0xD486, 0xBE8E, 0xD487, 0xBE8F, 0xD488, 0xC7B0, 0xD489, 0xC7B1, 0xD48A, 0xBE90, 0xD48B, 0xC7B2, + 0xD48C, 0xBE91, 0xD48D, 0xC7B3, 0xD48E, 0xBE92, 0xD48F, 0xBE93, 0xD490, 0xBE94, 0xD491, 0xBE95, 0xD492, 0xBE96, 0xD493, 0xBE97, + 0xD494, 0xC7B4, 0xD495, 0xBE98, 0xD496, 0xBE99, 0xD497, 0xBE9A, 0xD498, 0xBE9B, 0xD499, 0xBE9C, 0xD49A, 0xBE9D, 0xD49B, 0xBE9E, + 0xD49C, 0xBE9F, 0xD49D, 0xBEA0, 0xD49E, 0xBF41, 0xD49F, 0xBF42, 0xD4A0, 0xBF43, 0xD4A1, 0xBF44, 0xD4A2, 0xBF45, 0xD4A3, 0xBF46, + 0xD4A4, 0xBF47, 0xD4A5, 0xBF48, 0xD4A6, 0xBF49, 0xD4A7, 0xBF4A, 0xD4A8, 0xBF4B, 0xD4A9, 0xC7B5, 0xD4AA, 0xBF4C, 0xD4AB, 0xBF4D, + 0xD4AC, 0xBF4E, 0xD4AD, 0xBF4F, 0xD4AE, 0xBF50, 0xD4AF, 0xBF51, 0xD4B0, 0xBF52, 0xD4B1, 0xBF53, 0xD4B2, 0xBF54, 0xD4B3, 0xBF55, + 0xD4B4, 0xBF56, 0xD4B5, 0xBF57, 0xD4B6, 0xBF58, 0xD4B7, 0xBF59, 0xD4B8, 0xBF5A, 0xD4B9, 0xBF61, 0xD4BA, 0xBF62, 0xD4BB, 0xBF63, + 0xD4BC, 0xBF64, 0xD4BD, 0xBF65, 0xD4BE, 0xBF66, 0xD4BF, 0xBF67, 0xD4C0, 0xBF68, 0xD4C1, 0xBF69, 0xD4C2, 0xBF6A, 0xD4C3, 0xBF6B, + 0xD4C4, 0xBF6C, 0xD4C5, 0xBF6D, 0xD4C6, 0xBF6E, 0xD4C7, 0xBF6F, 0xD4C8, 0xBF70, 0xD4C9, 0xBF71, 0xD4CA, 0xBF72, 0xD4CB, 0xBF73, + 0xD4CC, 0xC7B6, 0xD4CD, 0xBF74, 0xD4CE, 0xBF75, 0xD4CF, 0xBF76, 0xD4D0, 0xC7B7, 0xD4D1, 0xBF77, 0xD4D2, 0xBF78, 0xD4D3, 0xBF79, + 0xD4D4, 0xC7B8, 0xD4D5, 0xBF7A, 0xD4D6, 0xBF81, 0xD4D7, 0xBF82, 0xD4D8, 0xBF83, 0xD4D9, 0xBF84, 0xD4DA, 0xBF85, 0xD4DB, 0xBF86, + 0xD4DC, 0xC7B9, 0xD4DD, 0xBF87, 0xD4DE, 0xBF88, 0xD4DF, 0xC7BA, 0xD4E0, 0xBF89, 0xD4E1, 0xBF8A, 0xD4E2, 0xBF8B, 0xD4E3, 0xBF8C, + 0xD4E4, 0xBF8D, 0xD4E5, 0xBF8E, 0xD4E6, 0xBF8F, 0xD4E7, 0xBF90, 0xD4E8, 0xC7BB, 0xD4E9, 0xBF91, 0xD4EA, 0xBF92, 0xD4EB, 0xBF93, + 0xD4EC, 0xC7BC, 0xD4ED, 0xBF94, 0xD4EE, 0xBF95, 0xD4EF, 0xBF96, 0xD4F0, 0xC7BD, 0xD4F1, 0xBF97, 0xD4F2, 0xBF98, 0xD4F3, 0xBF99, + 0xD4F4, 0xBF9A, 0xD4F5, 0xBF9B, 0xD4F6, 0xBF9C, 0xD4F7, 0xBF9D, 0xD4F8, 0xC7BE, 0xD4F9, 0xBF9E, 0xD4FA, 0xBF9F, 0xD4FB, 0xC7BF, + 0xD4FC, 0xBFA0, 0xD4FD, 0xC7C0, 0xD4FE, 0xC041, 0xD4FF, 0xC042, 0xD500, 0xC043, 0xD501, 0xC044, 0xD502, 0xC045, 0xD503, 0xC046, + 0xD504, 0xC7C1, 0xD505, 0xC047, 0xD506, 0xC048, 0xD507, 0xC049, 0xD508, 0xC7C2, 0xD509, 0xC04A, 0xD50A, 0xC04B, 0xD50B, 0xC04C, + 0xD50C, 0xC7C3, 0xD50D, 0xC04D, 0xD50E, 0xC04E, 0xD50F, 0xC04F, 0xD510, 0xC050, 0xD511, 0xC051, 0xD512, 0xC052, 0xD513, 0xC053, + 0xD514, 0xC7C4, 0xD515, 0xC7C5, 0xD516, 0xC054, 0xD517, 0xC7C6, 0xD518, 0xC055, 0xD519, 0xC056, 0xD51A, 0xC057, 0xD51B, 0xC058, + 0xD51C, 0xC059, 0xD51D, 0xC05A, 0xD51E, 0xC061, 0xD51F, 0xC062, 0xD520, 0xC063, 0xD521, 0xC064, 0xD522, 0xC065, 0xD523, 0xC066, + 0xD524, 0xC067, 0xD525, 0xC068, 0xD526, 0xC069, 0xD527, 0xC06A, 0xD528, 0xC06B, 0xD529, 0xC06C, 0xD52A, 0xC06D, 0xD52B, 0xC06E, + 0xD52C, 0xC06F, 0xD52D, 0xC070, 0xD52E, 0xC071, 0xD52F, 0xC072, 0xD530, 0xC073, 0xD531, 0xC074, 0xD532, 0xC075, 0xD533, 0xC076, + 0xD534, 0xC077, 0xD535, 0xC078, 0xD536, 0xC079, 0xD537, 0xC07A, 0xD538, 0xC081, 0xD539, 0xC082, 0xD53A, 0xC083, 0xD53B, 0xC084, + 0xD53C, 0xC7C7, 0xD53D, 0xC7C8, 0xD53E, 0xC085, 0xD53F, 0xC086, 0xD540, 0xC7C9, 0xD541, 0xC087, 0xD542, 0xC088, 0xD543, 0xC089, + 0xD544, 0xC7CA, 0xD545, 0xC08A, 0xD546, 0xC08B, 0xD547, 0xC08C, 0xD548, 0xC08D, 0xD549, 0xC08E, 0xD54A, 0xC08F, 0xD54B, 0xC090, + 0xD54C, 0xC7CB, 0xD54D, 0xC7CC, 0xD54E, 0xC091, 0xD54F, 0xC7CD, 0xD550, 0xC092, 0xD551, 0xC7CE, 0xD552, 0xC093, 0xD553, 0xC094, + 0xD554, 0xC095, 0xD555, 0xC096, 0xD556, 0xC097, 0xD557, 0xC098, 0xD558, 0xC7CF, 0xD559, 0xC7D0, 0xD55A, 0xC099, 0xD55B, 0xC09A, + 0xD55C, 0xC7D1, 0xD55D, 0xC09B, 0xD55E, 0xC09C, 0xD55F, 0xC09D, 0xD560, 0xC7D2, 0xD561, 0xC09E, 0xD562, 0xC09F, 0xD563, 0xC0A0, + 0xD564, 0xC141, 0xD565, 0xC7D3, 0xD566, 0xC142, 0xD567, 0xC143, 0xD568, 0xC7D4, 0xD569, 0xC7D5, 0xD56A, 0xC144, 0xD56B, 0xC7D6, + 0xD56C, 0xC145, 0xD56D, 0xC7D7, 0xD56E, 0xC146, 0xD56F, 0xC147, 0xD570, 0xC148, 0xD571, 0xC149, 0xD572, 0xC14A, 0xD573, 0xC14B, + 0xD574, 0xC7D8, 0xD575, 0xC7D9, 0xD576, 0xC14C, 0xD577, 0xC14D, 0xD578, 0xC7DA, 0xD579, 0xC14E, 0xD57A, 0xC14F, 0xD57B, 0xC150, + 0xD57C, 0xC7DB, 0xD57D, 0xC151, 0xD57E, 0xC152, 0xD57F, 0xC153, 0xD580, 0xC154, 0xD581, 0xC155, 0xD582, 0xC156, 0xD583, 0xC157, + 0xD584, 0xC7DC, 0xD585, 0xC7DD, 0xD586, 0xC158, 0xD587, 0xC7DE, 0xD588, 0xC7DF, 0xD589, 0xC7E0, 0xD58A, 0xC159, 0xD58B, 0xC15A, + 0xD58C, 0xC161, 0xD58D, 0xC162, 0xD58E, 0xC163, 0xD58F, 0xC164, 0xD590, 0xC7E1, 0xD591, 0xC165, 0xD592, 0xC166, 0xD593, 0xC167, + 0xD594, 0xC168, 0xD595, 0xC169, 0xD596, 0xC16A, 0xD597, 0xC16B, 0xD598, 0xC16C, 0xD599, 0xC16D, 0xD59A, 0xC16E, 0xD59B, 0xC16F, + 0xD59C, 0xC170, 0xD59D, 0xC171, 0xD59E, 0xC172, 0xD59F, 0xC173, 0xD5A0, 0xC174, 0xD5A1, 0xC175, 0xD5A2, 0xC176, 0xD5A3, 0xC177, + 0xD5A4, 0xC178, 0xD5A5, 0xC7E2, 0xD5A6, 0xC179, 0xD5A7, 0xC17A, 0xD5A8, 0xC181, 0xD5A9, 0xC182, 0xD5AA, 0xC183, 0xD5AB, 0xC184, + 0xD5AC, 0xC185, 0xD5AD, 0xC186, 0xD5AE, 0xC187, 0xD5AF, 0xC188, 0xD5B0, 0xC189, 0xD5B1, 0xC18A, 0xD5B2, 0xC18B, 0xD5B3, 0xC18C, + 0xD5B4, 0xC18D, 0xD5B5, 0xC18E, 0xD5B6, 0xC18F, 0xD5B7, 0xC190, 0xD5B8, 0xC191, 0xD5B9, 0xC192, 0xD5BA, 0xC193, 0xD5BB, 0xC194, + 0xD5BC, 0xC195, 0xD5BD, 0xC196, 0xD5BE, 0xC197, 0xD5BF, 0xC198, 0xD5C0, 0xC199, 0xD5C1, 0xC19A, 0xD5C2, 0xC19B, 0xD5C3, 0xC19C, + 0xD5C4, 0xC19D, 0xD5C5, 0xC19E, 0xD5C6, 0xC19F, 0xD5C7, 0xC1A0, 0xD5C8, 0xC7E3, 0xD5C9, 0xC7E4, 0xD5CA, 0xC241, 0xD5CB, 0xC242, + 0xD5CC, 0xC7E5, 0xD5CD, 0xC243, 0xD5CE, 0xC244, 0xD5CF, 0xC245, 0xD5D0, 0xC7E6, 0xD5D1, 0xC246, 0xD5D2, 0xC7E7, 0xD5D3, 0xC247, + 0xD5D4, 0xC248, 0xD5D5, 0xC249, 0xD5D6, 0xC24A, 0xD5D7, 0xC24B, 0xD5D8, 0xC7E8, 0xD5D9, 0xC7E9, 0xD5DA, 0xC24C, 0xD5DB, 0xC7EA, + 0xD5DC, 0xC24D, 0xD5DD, 0xC7EB, 0xD5DE, 0xC24E, 0xD5DF, 0xC24F, 0xD5E0, 0xC250, 0xD5E1, 0xC251, 0xD5E2, 0xC252, 0xD5E3, 0xC253, + 0xD5E4, 0xC7EC, 0xD5E5, 0xC7ED, 0xD5E6, 0xC254, 0xD5E7, 0xC255, 0xD5E8, 0xC7EE, 0xD5E9, 0xC256, 0xD5EA, 0xC257, 0xD5EB, 0xC258, + 0xD5EC, 0xC7EF, 0xD5ED, 0xC259, 0xD5EE, 0xC25A, 0xD5EF, 0xC261, 0xD5F0, 0xC262, 0xD5F1, 0xC263, 0xD5F2, 0xC264, 0xD5F3, 0xC265, + 0xD5F4, 0xC7F0, 0xD5F5, 0xC7F1, 0xD5F6, 0xC266, 0xD5F7, 0xC7F2, 0xD5F8, 0xC267, 0xD5F9, 0xC7F3, 0xD5FA, 0xC268, 0xD5FB, 0xC269, + 0xD5FC, 0xC26A, 0xD5FD, 0xC26B, 0xD5FE, 0xC26C, 0xD5FF, 0xC26D, 0xD600, 0xC7F4, 0xD601, 0xC7F5, 0xD602, 0xC26E, 0xD603, 0xC26F, + 0xD604, 0xC7F6, 0xD605, 0xC270, 0xD606, 0xC271, 0xD607, 0xC272, 0xD608, 0xC7F7, 0xD609, 0xC273, 0xD60A, 0xC274, 0xD60B, 0xC275, + 0xD60C, 0xC276, 0xD60D, 0xC277, 0xD60E, 0xC278, 0xD60F, 0xC279, 0xD610, 0xC7F8, 0xD611, 0xC7F9, 0xD612, 0xC27A, 0xD613, 0xC7FA, + 0xD614, 0xC7FB, 0xD615, 0xC7FC, 0xD616, 0xC281, 0xD617, 0xC282, 0xD618, 0xC283, 0xD619, 0xC284, 0xD61A, 0xC285, 0xD61B, 0xC286, + 0xD61C, 0xC7FD, 0xD61D, 0xC287, 0xD61E, 0xC288, 0xD61F, 0xC289, 0xD620, 0xC7FE, 0xD621, 0xC28A, 0xD622, 0xC28B, 0xD623, 0xC28C, + 0xD624, 0xC8A1, 0xD625, 0xC28D, 0xD626, 0xC28E, 0xD627, 0xC28F, 0xD628, 0xC290, 0xD629, 0xC291, 0xD62A, 0xC292, 0xD62B, 0xC293, + 0xD62C, 0xC294, 0xD62D, 0xC8A2, 0xD62E, 0xC295, 0xD62F, 0xC296, 0xD630, 0xC297, 0xD631, 0xC298, 0xD632, 0xC299, 0xD633, 0xC29A, + 0xD634, 0xC29B, 0xD635, 0xC29C, 0xD636, 0xC29D, 0xD637, 0xC29E, 0xD638, 0xC8A3, 0xD639, 0xC8A4, 0xD63A, 0xC29F, 0xD63B, 0xC2A0, + 0xD63C, 0xC8A5, 0xD63D, 0xC341, 0xD63E, 0xC342, 0xD63F, 0xC343, 0xD640, 0xC8A6, 0xD641, 0xC344, 0xD642, 0xC345, 0xD643, 0xC346, + 0xD644, 0xC347, 0xD645, 0xC8A7, 0xD646, 0xC348, 0xD647, 0xC349, 0xD648, 0xC8A8, 0xD649, 0xC8A9, 0xD64A, 0xC34A, 0xD64B, 0xC8AA, + 0xD64C, 0xC34B, 0xD64D, 0xC8AB, 0xD64E, 0xC34C, 0xD64F, 0xC34D, 0xD650, 0xC34E, 0xD651, 0xC8AC, 0xD652, 0xC34F, 0xD653, 0xC350, + 0xD654, 0xC8AD, 0xD655, 0xC8AE, 0xD656, 0xC351, 0xD657, 0xC352, 0xD658, 0xC8AF, 0xD659, 0xC353, 0xD65A, 0xC354, 0xD65B, 0xC355, + 0xD65C, 0xC8B0, 0xD65D, 0xC356, 0xD65E, 0xC357, 0xD65F, 0xC358, 0xD660, 0xC359, 0xD661, 0xC35A, 0xD662, 0xC361, 0xD663, 0xC362, + 0xD664, 0xC363, 0xD665, 0xC364, 0xD666, 0xC365, 0xD667, 0xC8B1, 0xD668, 0xC366, 0xD669, 0xC8B2, 0xD66A, 0xC367, 0xD66B, 0xC368, + 0xD66C, 0xC369, 0xD66D, 0xC36A, 0xD66E, 0xC36B, 0xD66F, 0xC36C, 0xD670, 0xC8B3, 0xD671, 0xC8B4, 0xD672, 0xC36D, 0xD673, 0xC36E, + 0xD674, 0xC8B5, 0xD675, 0xC36F, 0xD676, 0xC370, 0xD677, 0xC371, 0xD678, 0xC372, 0xD679, 0xC373, 0xD67A, 0xC374, 0xD67B, 0xC375, + 0xD67C, 0xC376, 0xD67D, 0xC377, 0xD67E, 0xC378, 0xD67F, 0xC379, 0xD680, 0xC37A, 0xD681, 0xC381, 0xD682, 0xC382, 0xD683, 0xC8B6, + 0xD684, 0xC383, 0xD685, 0xC8B7, 0xD686, 0xC384, 0xD687, 0xC385, 0xD688, 0xC386, 0xD689, 0xC387, 0xD68A, 0xC388, 0xD68B, 0xC389, + 0xD68C, 0xC8B8, 0xD68D, 0xC8B9, 0xD68E, 0xC38A, 0xD68F, 0xC38B, 0xD690, 0xC8BA, 0xD691, 0xC38C, 0xD692, 0xC38D, 0xD693, 0xC38E, + 0xD694, 0xC8BB, 0xD695, 0xC38F, 0xD696, 0xC390, 0xD697, 0xC391, 0xD698, 0xC392, 0xD699, 0xC393, 0xD69A, 0xC394, 0xD69B, 0xC395, + 0xD69C, 0xC396, 0xD69D, 0xC8BC, 0xD69E, 0xC397, 0xD69F, 0xC8BD, 0xD6A0, 0xC398, 0xD6A1, 0xC8BE, 0xD6A2, 0xC399, 0xD6A3, 0xC39A, + 0xD6A4, 0xC39B, 0xD6A5, 0xC39C, 0xD6A6, 0xC39D, 0xD6A7, 0xC39E, 0xD6A8, 0xC8BF, 0xD6A9, 0xC39F, 0xD6AA, 0xC3A0, 0xD6AB, 0xC441, + 0xD6AC, 0xC8C0, 0xD6AD, 0xC442, 0xD6AE, 0xC443, 0xD6AF, 0xC444, 0xD6B0, 0xC8C1, 0xD6B1, 0xC445, 0xD6B2, 0xC446, 0xD6B3, 0xC447, + 0xD6B4, 0xC448, 0xD6B5, 0xC449, 0xD6B6, 0xC44A, 0xD6B7, 0xC44B, 0xD6B8, 0xC44C, 0xD6B9, 0xC8C2, 0xD6BA, 0xC44D, 0xD6BB, 0xC8C3, + 0xD6BC, 0xC44E, 0xD6BD, 0xC44F, 0xD6BE, 0xC450, 0xD6BF, 0xC451, 0xD6C0, 0xC452, 0xD6C1, 0xC453, 0xD6C2, 0xC454, 0xD6C3, 0xC455, + 0xD6C4, 0xC8C4, 0xD6C5, 0xC8C5, 0xD6C6, 0xC456, 0xD6C7, 0xC457, 0xD6C8, 0xC8C6, 0xD6C9, 0xC458, 0xD6CA, 0xC459, 0xD6CB, 0xC45A, + 0xD6CC, 0xC8C7, 0xD6CD, 0xC461, 0xD6CE, 0xC462, 0xD6CF, 0xC463, 0xD6D0, 0xC464, 0xD6D1, 0xC8C8, 0xD6D2, 0xC465, 0xD6D3, 0xC466, + 0xD6D4, 0xC8C9, 0xD6D5, 0xC467, 0xD6D6, 0xC468, 0xD6D7, 0xC8CA, 0xD6D8, 0xC469, 0xD6D9, 0xC8CB, 0xD6DA, 0xC46A, 0xD6DB, 0xC46B, + 0xD6DC, 0xC46C, 0xD6DD, 0xC46D, 0xD6DE, 0xC46E, 0xD6DF, 0xC46F, 0xD6E0, 0xC8CC, 0xD6E1, 0xC470, 0xD6E2, 0xC471, 0xD6E3, 0xC472, + 0xD6E4, 0xC8CD, 0xD6E5, 0xC473, 0xD6E6, 0xC474, 0xD6E7, 0xC475, 0xD6E8, 0xC8CE, 0xD6E9, 0xC476, 0xD6EA, 0xC477, 0xD6EB, 0xC478, + 0xD6EC, 0xC479, 0xD6ED, 0xC47A, 0xD6EE, 0xC481, 0xD6EF, 0xC482, 0xD6F0, 0xC8CF, 0xD6F1, 0xC483, 0xD6F2, 0xC484, 0xD6F3, 0xC485, + 0xD6F4, 0xC486, 0xD6F5, 0xC8D0, 0xD6F6, 0xC487, 0xD6F7, 0xC488, 0xD6F8, 0xC489, 0xD6F9, 0xC48A, 0xD6FA, 0xC48B, 0xD6FB, 0xC48C, + 0xD6FC, 0xC8D1, 0xD6FD, 0xC8D2, 0xD6FE, 0xC48D, 0xD6FF, 0xC48E, 0xD700, 0xC8D3, 0xD701, 0xC48F, 0xD702, 0xC490, 0xD703, 0xC491, + 0xD704, 0xC8D4, 0xD705, 0xC492, 0xD706, 0xC493, 0xD707, 0xC494, 0xD708, 0xC495, 0xD709, 0xC496, 0xD70A, 0xC497, 0xD70B, 0xC498, + 0xD70C, 0xC499, 0xD70D, 0xC49A, 0xD70E, 0xC49B, 0xD70F, 0xC49C, 0xD710, 0xC49D, 0xD711, 0xC8D5, 0xD712, 0xC49E, 0xD713, 0xC49F, + 0xD714, 0xC4A0, 0xD715, 0xC541, 0xD716, 0xC542, 0xD717, 0xC543, 0xD718, 0xC8D6, 0xD719, 0xC8D7, 0xD71A, 0xC544, 0xD71B, 0xC545, + 0xD71C, 0xC8D8, 0xD71D, 0xC546, 0xD71E, 0xC547, 0xD71F, 0xC548, 0xD720, 0xC8D9, 0xD721, 0xC549, 0xD722, 0xC54A, 0xD723, 0xC54B, + 0xD724, 0xC54C, 0xD725, 0xC54D, 0xD726, 0xC54E, 0xD727, 0xC54F, 0xD728, 0xC8DA, 0xD729, 0xC8DB, 0xD72A, 0xC550, 0xD72B, 0xC8DC, + 0xD72C, 0xC551, 0xD72D, 0xC8DD, 0xD72E, 0xC552, 0xD72F, 0xC553, 0xD730, 0xC554, 0xD731, 0xC555, 0xD732, 0xC556, 0xD733, 0xC557, + 0xD734, 0xC8DE, 0xD735, 0xC8DF, 0xD736, 0xC558, 0xD737, 0xC559, 0xD738, 0xC8E0, 0xD739, 0xC55A, 0xD73A, 0xC561, 0xD73B, 0xC562, + 0xD73C, 0xC8E1, 0xD73D, 0xC563, 0xD73E, 0xC564, 0xD73F, 0xC565, 0xD740, 0xC566, 0xD741, 0xC567, 0xD742, 0xC568, 0xD743, 0xC569, + 0xD744, 0xC8E2, 0xD745, 0xC56A, 0xD746, 0xC56B, 0xD747, 0xC8E3, 0xD748, 0xC56C, 0xD749, 0xC8E4, 0xD74A, 0xC56D, 0xD74B, 0xC56E, + 0xD74C, 0xC56F, 0xD74D, 0xC570, 0xD74E, 0xC571, 0xD74F, 0xC572, 0xD750, 0xC8E5, 0xD751, 0xC8E6, 0xD752, 0xC573, 0xD753, 0xC574, + 0xD754, 0xC8E7, 0xD755, 0xC575, 0xD756, 0xC8E8, 0xD757, 0xC8E9, 0xD758, 0xC8EA, 0xD759, 0xC8EB, 0xD75A, 0xC576, 0xD75B, 0xC577, + 0xD75C, 0xC578, 0xD75D, 0xC579, 0xD75E, 0xC57A, 0xD75F, 0xC581, 0xD760, 0xC8EC, 0xD761, 0xC8ED, 0xD762, 0xC582, 0xD763, 0xC8EE, + 0xD764, 0xC583, 0xD765, 0xC8EF, 0xD766, 0xC584, 0xD767, 0xC585, 0xD768, 0xC586, 0xD769, 0xC8F0, 0xD76A, 0xC587, 0xD76B, 0xC588, + 0xD76C, 0xC8F1, 0xD76D, 0xC589, 0xD76E, 0xC58A, 0xD76F, 0xC58B, 0xD770, 0xC8F2, 0xD771, 0xC58C, 0xD772, 0xC58D, 0xD773, 0xC58E, + 0xD774, 0xC8F3, 0xD775, 0xC58F, 0xD776, 0xC590, 0xD777, 0xC591, 0xD778, 0xC592, 0xD779, 0xC593, 0xD77A, 0xC594, 0xD77B, 0xC595, + 0xD77C, 0xC8F4, 0xD77D, 0xC8F5, 0xD77E, 0xC596, 0xD77F, 0xC597, 0xD780, 0xC598, 0xD781, 0xC8F6, 0xD782, 0xC599, 0xD783, 0xC59A, + 0xD784, 0xC59B, 0xD785, 0xC59C, 0xD786, 0xC59D, 0xD787, 0xC59E, 0xD788, 0xC8F7, 0xD789, 0xC8F8, 0xD78A, 0xC59F, 0xD78B, 0xC5A0, + 0xD78C, 0xC8F9, 0xD78D, 0xC641, 0xD78E, 0xC642, 0xD78F, 0xC643, 0xD790, 0xC8FA, 0xD791, 0xC644, 0xD792, 0xC645, 0xD793, 0xC646, + 0xD794, 0xC647, 0xD795, 0xC648, 0xD796, 0xC649, 0xD797, 0xC64A, 0xD798, 0xC8FB, 0xD799, 0xC8FC, 0xD79A, 0xC64B, 0xD79B, 0xC8FD, + 0xD79C, 0xC64C, 0xD79D, 0xC8FE, 0xD79E, 0xC64D, 0xD79F, 0xC64E, 0xD7A0, 0xC64F, 0xD7A1, 0xC650, 0xD7A2, 0xC651, 0xD7A3, 0xC652, + 0xF900, 0xCBD0, 0xF901, 0xCBD6, 0xF902, 0xCBE7, 0xF903, 0xCDCF, 0xF904, 0xCDE8, 0xF905, 0xCEAD, 0xF906, 0xCFFB, 0xF907, 0xD0A2, + 0xF908, 0xD0B8, 0xF909, 0xD0D0, 0xF90A, 0xD0DD, 0xF90B, 0xD1D4, 0xF90C, 0xD1D5, 0xF90D, 0xD1D8, 0xF90E, 0xD1DB, 0xF90F, 0xD1DC, + 0xF910, 0xD1DD, 0xF911, 0xD1DE, 0xF912, 0xD1DF, 0xF913, 0xD1E0, 0xF914, 0xD1E2, 0xF915, 0xD1E3, 0xF916, 0xD1E4, 0xF917, 0xD1E5, + 0xF918, 0xD1E6, 0xF919, 0xD1E8, 0xF91A, 0xD1E9, 0xF91B, 0xD1EA, 0xF91C, 0xD1EB, 0xF91D, 0xD1ED, 0xF91E, 0xD1EF, 0xF91F, 0xD1F0, + 0xF920, 0xD1F2, 0xF921, 0xD1F6, 0xF922, 0xD1FA, 0xF923, 0xD1FC, 0xF924, 0xD1FD, 0xF925, 0xD1FE, 0xF926, 0xD2A2, 0xF927, 0xD2A3, + 0xF928, 0xD2A7, 0xF929, 0xD2A8, 0xF92A, 0xD2A9, 0xF92B, 0xD2AA, 0xF92C, 0xD2AB, 0xF92D, 0xD2AD, 0xF92E, 0xD2B2, 0xF92F, 0xD2BE, + 0xF930, 0xD2C2, 0xF931, 0xD2C3, 0xF932, 0xD2C4, 0xF933, 0xD2C6, 0xF934, 0xD2C7, 0xF935, 0xD2C8, 0xF936, 0xD2C9, 0xF937, 0xD2CA, + 0xF938, 0xD2CB, 0xF939, 0xD2CD, 0xF93A, 0xD2CE, 0xF93B, 0xD2CF, 0xF93C, 0xD2D0, 0xF93D, 0xD2D1, 0xF93E, 0xD2D2, 0xF93F, 0xD2D3, + 0xF940, 0xD2D4, 0xF941, 0xD2D5, 0xF942, 0xD2D6, 0xF943, 0xD2D7, 0xF944, 0xD2D9, 0xF945, 0xD2DA, 0xF946, 0xD2DE, 0xF947, 0xD2DF, + 0xF948, 0xD2E1, 0xF949, 0xD2E2, 0xF94A, 0xD2E4, 0xF94B, 0xD2E5, 0xF94C, 0xD2E6, 0xF94D, 0xD2E7, 0xF94E, 0xD2E8, 0xF94F, 0xD2E9, + 0xF950, 0xD2EA, 0xF951, 0xD2EB, 0xF952, 0xD2F0, 0xF953, 0xD2F1, 0xF954, 0xD2F2, 0xF955, 0xD2F3, 0xF956, 0xD2F4, 0xF957, 0xD2F5, + 0xF958, 0xD2F7, 0xF959, 0xD2F8, 0xF95A, 0xD4E6, 0xF95B, 0xD4FC, 0xF95C, 0xD5A5, 0xF95D, 0xD5AB, 0xF95E, 0xD5AE, 0xF95F, 0xD6B8, + 0xF960, 0xD6CD, 0xF961, 0xD7CB, 0xF962, 0xD7E4, 0xF963, 0xDBC5, 0xF964, 0xDBE4, 0xF965, 0xDCA5, 0xF966, 0xDDA5, 0xF967, 0xDDD5, + 0xF968, 0xDDF4, 0xF969, 0xDEFC, 0xF96A, 0xDEFE, 0xF96B, 0xDFB3, 0xF96C, 0xDFE1, 0xF96D, 0xDFE8, 0xF96E, 0xE0F1, 0xF96F, 0xE1AD, + 0xF970, 0xE1ED, 0xF971, 0xE3F5, 0xF972, 0xE4A1, 0xF973, 0xE4A9, 0xF974, 0xE5AE, 0xF975, 0xE5B1, 0xF976, 0xE5B2, 0xF977, 0xE5B9, + 0xF978, 0xE5BB, 0xF979, 0xE5BC, 0xF97A, 0xE5C4, 0xF97B, 0xE5CE, 0xF97C, 0xE5D0, 0xF97D, 0xE5D2, 0xF97E, 0xE5D6, 0xF97F, 0xE5FA, + 0xF980, 0xE5FB, 0xF981, 0xE5FC, 0xF982, 0xE5FE, 0xF983, 0xE6A1, 0xF984, 0xE6A4, 0xF985, 0xE6A7, 0xF986, 0xE6AD, 0xF987, 0xE6AF, + 0xF988, 0xE6B0, 0xF989, 0xE6B1, 0xF98A, 0xE6B3, 0xF98B, 0xE6B7, 0xF98C, 0xE6B8, 0xF98D, 0xE6BC, 0xF98E, 0xE6C4, 0xF98F, 0xE6C6, + 0xF990, 0xE6C7, 0xF991, 0xE6CA, 0xF992, 0xE6D2, 0xF993, 0xE6D6, 0xF994, 0xE6D9, 0xF995, 0xE6DC, 0xF996, 0xE6DF, 0xF997, 0xE6E1, + 0xF998, 0xE6E4, 0xF999, 0xE6E5, 0xF99A, 0xE6E6, 0xF99B, 0xE6E8, 0xF99C, 0xE6EA, 0xF99D, 0xE6EB, 0xF99E, 0xE6EC, 0xF99F, 0xE6EF, + 0xF9A0, 0xE6F1, 0xF9A1, 0xE6F2, 0xF9A2, 0xE6F5, 0xF9A3, 0xE6F6, 0xF9A4, 0xE6F7, 0xF9A5, 0xE6F9, 0xF9A6, 0xE7A1, 0xF9A7, 0xE7A6, + 0xF9A8, 0xE7A9, 0xF9A9, 0xE7AA, 0xF9AA, 0xE7AC, 0xF9AB, 0xE7AD, 0xF9AC, 0xE7B0, 0xF9AD, 0xE7BF, 0xF9AE, 0xE7C1, 0xF9AF, 0xE7C6, + 0xF9B0, 0xE7C7, 0xF9B1, 0xE7CB, 0xF9B2, 0xE7CD, 0xF9B3, 0xE7CF, 0xF9B4, 0xE7D0, 0xF9B5, 0xE7D3, 0xF9B6, 0xE7DF, 0xF9B7, 0xE7E4, + 0xF9B8, 0xE7E6, 0xF9B9, 0xE7F7, 0xF9BA, 0xE8E7, 0xF9BB, 0xE8E8, 0xF9BC, 0xE8F0, 0xF9BD, 0xE8F1, 0xF9BE, 0xE8F7, 0xF9BF, 0xE8F9, + 0xF9C0, 0xE8FB, 0xF9C1, 0xE8FE, 0xF9C2, 0xE9A7, 0xF9C3, 0xE9AC, 0xF9C4, 0xE9CC, 0xF9C5, 0xE9F7, 0xF9C6, 0xEAC1, 0xF9C7, 0xEAE5, + 0xF9C8, 0xEAF4, 0xF9C9, 0xEAF7, 0xF9CA, 0xEAFC, 0xF9CB, 0xEAFE, 0xF9CC, 0xEBA4, 0xF9CD, 0xEBA7, 0xF9CE, 0xEBA9, 0xF9CF, 0xEBAA, + 0xF9D0, 0xEBBA, 0xF9D1, 0xEBBB, 0xF9D2, 0xEBBD, 0xF9D3, 0xEBC1, 0xF9D4, 0xEBC2, 0xF9D5, 0xEBC6, 0xF9D6, 0xEBC7, 0xF9D7, 0xEBCC, + 0xF9D8, 0xEBCF, 0xF9D9, 0xEBD0, 0xF9DA, 0xEBD1, 0xF9DB, 0xEBD2, 0xF9DC, 0xEBD8, 0xF9DD, 0xECA6, 0xF9DE, 0xECA7, 0xF9DF, 0xECAA, + 0xF9E0, 0xECAF, 0xF9E1, 0xECB0, 0xF9E2, 0xECB1, 0xF9E3, 0xECB2, 0xF9E4, 0xECB5, 0xF9E5, 0xECB8, 0xF9E6, 0xECBA, 0xF9E7, 0xECC0, + 0xF9E8, 0xECC1, 0xF9E9, 0xECC5, 0xF9EA, 0xECC6, 0xF9EB, 0xECC9, 0xF9EC, 0xECCA, 0xF9ED, 0xECD5, 0xF9EE, 0xECDD, 0xF9EF, 0xECDE, + 0xF9F0, 0xECE1, 0xF9F1, 0xECE4, 0xF9F2, 0xECE7, 0xF9F3, 0xECE8, 0xF9F4, 0xECF7, 0xF9F5, 0xECF8, 0xF9F6, 0xECFA, 0xF9F7, 0xEDA1, + 0xF9F8, 0xEDA2, 0xF9F9, 0xEDA3, 0xF9FA, 0xEDEE, 0xF9FB, 0xEEDB, 0xF9FC, 0xF2BD, 0xF9FD, 0xF2FA, 0xF9FE, 0xF3B1, 0xF9FF, 0xF4A7, + 0xFA00, 0xF4EE, 0xFA01, 0xF6F4, 0xFA02, 0xF6F6, 0xFA03, 0xF7B8, 0xFA04, 0xF7C8, 0xFA05, 0xF7D3, 0xFA06, 0xF8DB, 0xFA07, 0xF8F0, + 0xFA08, 0xFAA1, 0xFA09, 0xFAA2, 0xFA0A, 0xFAE6, 0xFA0B, 0xFCA9, 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA3A4, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA1AC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA2A6, 0xFFE0, 0xA1CB, 0xFFE1, 0xA1CC, 0xFFE2, 0xA1FE, 0xFFE3, 0xA3FE, 0xFFE5, 0xA1CD, 0xFFE6, 0xA3DC, + 0, 0 +}; + +static const WCHAR oem2uni949[] = { /* Korean --> Unicode pairs */ + 0x8141, 0xAC02, 0x8142, 0xAC03, 0x8143, 0xAC05, 0x8144, 0xAC06, 0x8145, 0xAC0B, 0x8146, 0xAC0C, 0x8147, 0xAC0D, 0x8148, 0xAC0E, + 0x8149, 0xAC0F, 0x814A, 0xAC18, 0x814B, 0xAC1E, 0x814C, 0xAC1F, 0x814D, 0xAC21, 0x814E, 0xAC22, 0x814F, 0xAC23, 0x8150, 0xAC25, + 0x8151, 0xAC26, 0x8152, 0xAC27, 0x8153, 0xAC28, 0x8154, 0xAC29, 0x8155, 0xAC2A, 0x8156, 0xAC2B, 0x8157, 0xAC2E, 0x8158, 0xAC32, + 0x8159, 0xAC33, 0x815A, 0xAC34, 0x8161, 0xAC35, 0x8162, 0xAC36, 0x8163, 0xAC37, 0x8164, 0xAC3A, 0x8165, 0xAC3B, 0x8166, 0xAC3D, + 0x8167, 0xAC3E, 0x8168, 0xAC3F, 0x8169, 0xAC41, 0x816A, 0xAC42, 0x816B, 0xAC43, 0x816C, 0xAC44, 0x816D, 0xAC45, 0x816E, 0xAC46, + 0x816F, 0xAC47, 0x8170, 0xAC48, 0x8171, 0xAC49, 0x8172, 0xAC4A, 0x8173, 0xAC4C, 0x8174, 0xAC4E, 0x8175, 0xAC4F, 0x8176, 0xAC50, + 0x8177, 0xAC51, 0x8178, 0xAC52, 0x8179, 0xAC53, 0x817A, 0xAC55, 0x8181, 0xAC56, 0x8182, 0xAC57, 0x8183, 0xAC59, 0x8184, 0xAC5A, + 0x8185, 0xAC5B, 0x8186, 0xAC5D, 0x8187, 0xAC5E, 0x8188, 0xAC5F, 0x8189, 0xAC60, 0x818A, 0xAC61, 0x818B, 0xAC62, 0x818C, 0xAC63, + 0x818D, 0xAC64, 0x818E, 0xAC65, 0x818F, 0xAC66, 0x8190, 0xAC67, 0x8191, 0xAC68, 0x8192, 0xAC69, 0x8193, 0xAC6A, 0x8194, 0xAC6B, + 0x8195, 0xAC6C, 0x8196, 0xAC6D, 0x8197, 0xAC6E, 0x8198, 0xAC6F, 0x8199, 0xAC72, 0x819A, 0xAC73, 0x819B, 0xAC75, 0x819C, 0xAC76, + 0x819D, 0xAC79, 0x819E, 0xAC7B, 0x819F, 0xAC7C, 0x81A0, 0xAC7D, 0x81A1, 0xAC7E, 0x81A2, 0xAC7F, 0x81A3, 0xAC82, 0x81A4, 0xAC87, + 0x81A5, 0xAC88, 0x81A6, 0xAC8D, 0x81A7, 0xAC8E, 0x81A8, 0xAC8F, 0x81A9, 0xAC91, 0x81AA, 0xAC92, 0x81AB, 0xAC93, 0x81AC, 0xAC95, + 0x81AD, 0xAC96, 0x81AE, 0xAC97, 0x81AF, 0xAC98, 0x81B0, 0xAC99, 0x81B1, 0xAC9A, 0x81B2, 0xAC9B, 0x81B3, 0xAC9E, 0x81B4, 0xACA2, + 0x81B5, 0xACA3, 0x81B6, 0xACA4, 0x81B7, 0xACA5, 0x81B8, 0xACA6, 0x81B9, 0xACA7, 0x81BA, 0xACAB, 0x81BB, 0xACAD, 0x81BC, 0xACAE, + 0x81BD, 0xACB1, 0x81BE, 0xACB2, 0x81BF, 0xACB3, 0x81C0, 0xACB4, 0x81C1, 0xACB5, 0x81C2, 0xACB6, 0x81C3, 0xACB7, 0x81C4, 0xACBA, + 0x81C5, 0xACBE, 0x81C6, 0xACBF, 0x81C7, 0xACC0, 0x81C8, 0xACC2, 0x81C9, 0xACC3, 0x81CA, 0xACC5, 0x81CB, 0xACC6, 0x81CC, 0xACC7, + 0x81CD, 0xACC9, 0x81CE, 0xACCA, 0x81CF, 0xACCB, 0x81D0, 0xACCD, 0x81D1, 0xACCE, 0x81D2, 0xACCF, 0x81D3, 0xACD0, 0x81D4, 0xACD1, + 0x81D5, 0xACD2, 0x81D6, 0xACD3, 0x81D7, 0xACD4, 0x81D8, 0xACD6, 0x81D9, 0xACD8, 0x81DA, 0xACD9, 0x81DB, 0xACDA, 0x81DC, 0xACDB, + 0x81DD, 0xACDC, 0x81DE, 0xACDD, 0x81DF, 0xACDE, 0x81E0, 0xACDF, 0x81E1, 0xACE2, 0x81E2, 0xACE3, 0x81E3, 0xACE5, 0x81E4, 0xACE6, + 0x81E5, 0xACE9, 0x81E6, 0xACEB, 0x81E7, 0xACED, 0x81E8, 0xACEE, 0x81E9, 0xACF2, 0x81EA, 0xACF4, 0x81EB, 0xACF7, 0x81EC, 0xACF8, + 0x81ED, 0xACF9, 0x81EE, 0xACFA, 0x81EF, 0xACFB, 0x81F0, 0xACFE, 0x81F1, 0xACFF, 0x81F2, 0xAD01, 0x81F3, 0xAD02, 0x81F4, 0xAD03, + 0x81F5, 0xAD05, 0x81F6, 0xAD07, 0x81F7, 0xAD08, 0x81F8, 0xAD09, 0x81F9, 0xAD0A, 0x81FA, 0xAD0B, 0x81FB, 0xAD0E, 0x81FC, 0xAD10, + 0x81FD, 0xAD12, 0x81FE, 0xAD13, 0x8241, 0xAD14, 0x8242, 0xAD15, 0x8243, 0xAD16, 0x8244, 0xAD17, 0x8245, 0xAD19, 0x8246, 0xAD1A, + 0x8247, 0xAD1B, 0x8248, 0xAD1D, 0x8249, 0xAD1E, 0x824A, 0xAD1F, 0x824B, 0xAD21, 0x824C, 0xAD22, 0x824D, 0xAD23, 0x824E, 0xAD24, + 0x824F, 0xAD25, 0x8250, 0xAD26, 0x8251, 0xAD27, 0x8252, 0xAD28, 0x8253, 0xAD2A, 0x8254, 0xAD2B, 0x8255, 0xAD2E, 0x8256, 0xAD2F, + 0x8257, 0xAD30, 0x8258, 0xAD31, 0x8259, 0xAD32, 0x825A, 0xAD33, 0x8261, 0xAD36, 0x8262, 0xAD37, 0x8263, 0xAD39, 0x8264, 0xAD3A, + 0x8265, 0xAD3B, 0x8266, 0xAD3D, 0x8267, 0xAD3E, 0x8268, 0xAD3F, 0x8269, 0xAD40, 0x826A, 0xAD41, 0x826B, 0xAD42, 0x826C, 0xAD43, + 0x826D, 0xAD46, 0x826E, 0xAD48, 0x826F, 0xAD4A, 0x8270, 0xAD4B, 0x8271, 0xAD4C, 0x8272, 0xAD4D, 0x8273, 0xAD4E, 0x8274, 0xAD4F, + 0x8275, 0xAD51, 0x8276, 0xAD52, 0x8277, 0xAD53, 0x8278, 0xAD55, 0x8279, 0xAD56, 0x827A, 0xAD57, 0x8281, 0xAD59, 0x8282, 0xAD5A, + 0x8283, 0xAD5B, 0x8284, 0xAD5C, 0x8285, 0xAD5D, 0x8286, 0xAD5E, 0x8287, 0xAD5F, 0x8288, 0xAD60, 0x8289, 0xAD62, 0x828A, 0xAD64, + 0x828B, 0xAD65, 0x828C, 0xAD66, 0x828D, 0xAD67, 0x828E, 0xAD68, 0x828F, 0xAD69, 0x8290, 0xAD6A, 0x8291, 0xAD6B, 0x8292, 0xAD6E, + 0x8293, 0xAD6F, 0x8294, 0xAD71, 0x8295, 0xAD72, 0x8296, 0xAD77, 0x8297, 0xAD78, 0x8298, 0xAD79, 0x8299, 0xAD7A, 0x829A, 0xAD7E, + 0x829B, 0xAD80, 0x829C, 0xAD83, 0x829D, 0xAD84, 0x829E, 0xAD85, 0x829F, 0xAD86, 0x82A0, 0xAD87, 0x82A1, 0xAD8A, 0x82A2, 0xAD8B, + 0x82A3, 0xAD8D, 0x82A4, 0xAD8E, 0x82A5, 0xAD8F, 0x82A6, 0xAD91, 0x82A7, 0xAD92, 0x82A8, 0xAD93, 0x82A9, 0xAD94, 0x82AA, 0xAD95, + 0x82AB, 0xAD96, 0x82AC, 0xAD97, 0x82AD, 0xAD98, 0x82AE, 0xAD99, 0x82AF, 0xAD9A, 0x82B0, 0xAD9B, 0x82B1, 0xAD9E, 0x82B2, 0xAD9F, + 0x82B3, 0xADA0, 0x82B4, 0xADA1, 0x82B5, 0xADA2, 0x82B6, 0xADA3, 0x82B7, 0xADA5, 0x82B8, 0xADA6, 0x82B9, 0xADA7, 0x82BA, 0xADA8, + 0x82BB, 0xADA9, 0x82BC, 0xADAA, 0x82BD, 0xADAB, 0x82BE, 0xADAC, 0x82BF, 0xADAD, 0x82C0, 0xADAE, 0x82C1, 0xADAF, 0x82C2, 0xADB0, + 0x82C3, 0xADB1, 0x82C4, 0xADB2, 0x82C5, 0xADB3, 0x82C6, 0xADB4, 0x82C7, 0xADB5, 0x82C8, 0xADB6, 0x82C9, 0xADB8, 0x82CA, 0xADB9, + 0x82CB, 0xADBA, 0x82CC, 0xADBB, 0x82CD, 0xADBC, 0x82CE, 0xADBD, 0x82CF, 0xADBE, 0x82D0, 0xADBF, 0x82D1, 0xADC2, 0x82D2, 0xADC3, + 0x82D3, 0xADC5, 0x82D4, 0xADC6, 0x82D5, 0xADC7, 0x82D6, 0xADC9, 0x82D7, 0xADCA, 0x82D8, 0xADCB, 0x82D9, 0xADCC, 0x82DA, 0xADCD, + 0x82DB, 0xADCE, 0x82DC, 0xADCF, 0x82DD, 0xADD2, 0x82DE, 0xADD4, 0x82DF, 0xADD5, 0x82E0, 0xADD6, 0x82E1, 0xADD7, 0x82E2, 0xADD8, + 0x82E3, 0xADD9, 0x82E4, 0xADDA, 0x82E5, 0xADDB, 0x82E6, 0xADDD, 0x82E7, 0xADDE, 0x82E8, 0xADDF, 0x82E9, 0xADE1, 0x82EA, 0xADE2, + 0x82EB, 0xADE3, 0x82EC, 0xADE5, 0x82ED, 0xADE6, 0x82EE, 0xADE7, 0x82EF, 0xADE8, 0x82F0, 0xADE9, 0x82F1, 0xADEA, 0x82F2, 0xADEB, + 0x82F3, 0xADEC, 0x82F4, 0xADED, 0x82F5, 0xADEE, 0x82F6, 0xADEF, 0x82F7, 0xADF0, 0x82F8, 0xADF1, 0x82F9, 0xADF2, 0x82FA, 0xADF3, + 0x82FB, 0xADF4, 0x82FC, 0xADF5, 0x82FD, 0xADF6, 0x82FE, 0xADF7, 0x8341, 0xADFA, 0x8342, 0xADFB, 0x8343, 0xADFD, 0x8344, 0xADFE, + 0x8345, 0xAE02, 0x8346, 0xAE03, 0x8347, 0xAE04, 0x8348, 0xAE05, 0x8349, 0xAE06, 0x834A, 0xAE07, 0x834B, 0xAE0A, 0x834C, 0xAE0C, + 0x834D, 0xAE0E, 0x834E, 0xAE0F, 0x834F, 0xAE10, 0x8350, 0xAE11, 0x8351, 0xAE12, 0x8352, 0xAE13, 0x8353, 0xAE15, 0x8354, 0xAE16, + 0x8355, 0xAE17, 0x8356, 0xAE18, 0x8357, 0xAE19, 0x8358, 0xAE1A, 0x8359, 0xAE1B, 0x835A, 0xAE1C, 0x8361, 0xAE1D, 0x8362, 0xAE1E, + 0x8363, 0xAE1F, 0x8364, 0xAE20, 0x8365, 0xAE21, 0x8366, 0xAE22, 0x8367, 0xAE23, 0x8368, 0xAE24, 0x8369, 0xAE25, 0x836A, 0xAE26, + 0x836B, 0xAE27, 0x836C, 0xAE28, 0x836D, 0xAE29, 0x836E, 0xAE2A, 0x836F, 0xAE2B, 0x8370, 0xAE2C, 0x8371, 0xAE2D, 0x8372, 0xAE2E, + 0x8373, 0xAE2F, 0x8374, 0xAE32, 0x8375, 0xAE33, 0x8376, 0xAE35, 0x8377, 0xAE36, 0x8378, 0xAE39, 0x8379, 0xAE3B, 0x837A, 0xAE3C, + 0x8381, 0xAE3D, 0x8382, 0xAE3E, 0x8383, 0xAE3F, 0x8384, 0xAE42, 0x8385, 0xAE44, 0x8386, 0xAE47, 0x8387, 0xAE48, 0x8388, 0xAE49, + 0x8389, 0xAE4B, 0x838A, 0xAE4F, 0x838B, 0xAE51, 0x838C, 0xAE52, 0x838D, 0xAE53, 0x838E, 0xAE55, 0x838F, 0xAE57, 0x8390, 0xAE58, + 0x8391, 0xAE59, 0x8392, 0xAE5A, 0x8393, 0xAE5B, 0x8394, 0xAE5E, 0x8395, 0xAE62, 0x8396, 0xAE63, 0x8397, 0xAE64, 0x8398, 0xAE66, + 0x8399, 0xAE67, 0x839A, 0xAE6A, 0x839B, 0xAE6B, 0x839C, 0xAE6D, 0x839D, 0xAE6E, 0x839E, 0xAE6F, 0x839F, 0xAE71, 0x83A0, 0xAE72, + 0x83A1, 0xAE73, 0x83A2, 0xAE74, 0x83A3, 0xAE75, 0x83A4, 0xAE76, 0x83A5, 0xAE77, 0x83A6, 0xAE7A, 0x83A7, 0xAE7E, 0x83A8, 0xAE7F, + 0x83A9, 0xAE80, 0x83AA, 0xAE81, 0x83AB, 0xAE82, 0x83AC, 0xAE83, 0x83AD, 0xAE86, 0x83AE, 0xAE87, 0x83AF, 0xAE88, 0x83B0, 0xAE89, + 0x83B1, 0xAE8A, 0x83B2, 0xAE8B, 0x83B3, 0xAE8D, 0x83B4, 0xAE8E, 0x83B5, 0xAE8F, 0x83B6, 0xAE90, 0x83B7, 0xAE91, 0x83B8, 0xAE92, + 0x83B9, 0xAE93, 0x83BA, 0xAE94, 0x83BB, 0xAE95, 0x83BC, 0xAE96, 0x83BD, 0xAE97, 0x83BE, 0xAE98, 0x83BF, 0xAE99, 0x83C0, 0xAE9A, + 0x83C1, 0xAE9B, 0x83C2, 0xAE9C, 0x83C3, 0xAE9D, 0x83C4, 0xAE9E, 0x83C5, 0xAE9F, 0x83C6, 0xAEA0, 0x83C7, 0xAEA1, 0x83C8, 0xAEA2, + 0x83C9, 0xAEA3, 0x83CA, 0xAEA4, 0x83CB, 0xAEA5, 0x83CC, 0xAEA6, 0x83CD, 0xAEA7, 0x83CE, 0xAEA8, 0x83CF, 0xAEA9, 0x83D0, 0xAEAA, + 0x83D1, 0xAEAB, 0x83D2, 0xAEAC, 0x83D3, 0xAEAD, 0x83D4, 0xAEAE, 0x83D5, 0xAEAF, 0x83D6, 0xAEB0, 0x83D7, 0xAEB1, 0x83D8, 0xAEB2, + 0x83D9, 0xAEB3, 0x83DA, 0xAEB4, 0x83DB, 0xAEB5, 0x83DC, 0xAEB6, 0x83DD, 0xAEB7, 0x83DE, 0xAEB8, 0x83DF, 0xAEB9, 0x83E0, 0xAEBA, + 0x83E1, 0xAEBB, 0x83E2, 0xAEBF, 0x83E3, 0xAEC1, 0x83E4, 0xAEC2, 0x83E5, 0xAEC3, 0x83E6, 0xAEC5, 0x83E7, 0xAEC6, 0x83E8, 0xAEC7, + 0x83E9, 0xAEC8, 0x83EA, 0xAEC9, 0x83EB, 0xAECA, 0x83EC, 0xAECB, 0x83ED, 0xAECE, 0x83EE, 0xAED2, 0x83EF, 0xAED3, 0x83F0, 0xAED4, + 0x83F1, 0xAED5, 0x83F2, 0xAED6, 0x83F3, 0xAED7, 0x83F4, 0xAEDA, 0x83F5, 0xAEDB, 0x83F6, 0xAEDD, 0x83F7, 0xAEDE, 0x83F8, 0xAEDF, + 0x83F9, 0xAEE0, 0x83FA, 0xAEE1, 0x83FB, 0xAEE2, 0x83FC, 0xAEE3, 0x83FD, 0xAEE4, 0x83FE, 0xAEE5, 0x8441, 0xAEE6, 0x8442, 0xAEE7, + 0x8443, 0xAEE9, 0x8444, 0xAEEA, 0x8445, 0xAEEC, 0x8446, 0xAEEE, 0x8447, 0xAEEF, 0x8448, 0xAEF0, 0x8449, 0xAEF1, 0x844A, 0xAEF2, + 0x844B, 0xAEF3, 0x844C, 0xAEF5, 0x844D, 0xAEF6, 0x844E, 0xAEF7, 0x844F, 0xAEF9, 0x8450, 0xAEFA, 0x8451, 0xAEFB, 0x8452, 0xAEFD, + 0x8453, 0xAEFE, 0x8454, 0xAEFF, 0x8455, 0xAF00, 0x8456, 0xAF01, 0x8457, 0xAF02, 0x8458, 0xAF03, 0x8459, 0xAF04, 0x845A, 0xAF05, + 0x8461, 0xAF06, 0x8462, 0xAF09, 0x8463, 0xAF0A, 0x8464, 0xAF0B, 0x8465, 0xAF0C, 0x8466, 0xAF0E, 0x8467, 0xAF0F, 0x8468, 0xAF11, + 0x8469, 0xAF12, 0x846A, 0xAF13, 0x846B, 0xAF14, 0x846C, 0xAF15, 0x846D, 0xAF16, 0x846E, 0xAF17, 0x846F, 0xAF18, 0x8470, 0xAF19, + 0x8471, 0xAF1A, 0x8472, 0xAF1B, 0x8473, 0xAF1C, 0x8474, 0xAF1D, 0x8475, 0xAF1E, 0x8476, 0xAF1F, 0x8477, 0xAF20, 0x8478, 0xAF21, + 0x8479, 0xAF22, 0x847A, 0xAF23, 0x8481, 0xAF24, 0x8482, 0xAF25, 0x8483, 0xAF26, 0x8484, 0xAF27, 0x8485, 0xAF28, 0x8486, 0xAF29, + 0x8487, 0xAF2A, 0x8488, 0xAF2B, 0x8489, 0xAF2E, 0x848A, 0xAF2F, 0x848B, 0xAF31, 0x848C, 0xAF33, 0x848D, 0xAF35, 0x848E, 0xAF36, + 0x848F, 0xAF37, 0x8490, 0xAF38, 0x8491, 0xAF39, 0x8492, 0xAF3A, 0x8493, 0xAF3B, 0x8494, 0xAF3E, 0x8495, 0xAF40, 0x8496, 0xAF44, + 0x8497, 0xAF45, 0x8498, 0xAF46, 0x8499, 0xAF47, 0x849A, 0xAF4A, 0x849B, 0xAF4B, 0x849C, 0xAF4C, 0x849D, 0xAF4D, 0x849E, 0xAF4E, + 0x849F, 0xAF4F, 0x84A0, 0xAF51, 0x84A1, 0xAF52, 0x84A2, 0xAF53, 0x84A3, 0xAF54, 0x84A4, 0xAF55, 0x84A5, 0xAF56, 0x84A6, 0xAF57, + 0x84A7, 0xAF58, 0x84A8, 0xAF59, 0x84A9, 0xAF5A, 0x84AA, 0xAF5B, 0x84AB, 0xAF5E, 0x84AC, 0xAF5F, 0x84AD, 0xAF60, 0x84AE, 0xAF61, + 0x84AF, 0xAF62, 0x84B0, 0xAF63, 0x84B1, 0xAF66, 0x84B2, 0xAF67, 0x84B3, 0xAF68, 0x84B4, 0xAF69, 0x84B5, 0xAF6A, 0x84B6, 0xAF6B, + 0x84B7, 0xAF6C, 0x84B8, 0xAF6D, 0x84B9, 0xAF6E, 0x84BA, 0xAF6F, 0x84BB, 0xAF70, 0x84BC, 0xAF71, 0x84BD, 0xAF72, 0x84BE, 0xAF73, + 0x84BF, 0xAF74, 0x84C0, 0xAF75, 0x84C1, 0xAF76, 0x84C2, 0xAF77, 0x84C3, 0xAF78, 0x84C4, 0xAF7A, 0x84C5, 0xAF7B, 0x84C6, 0xAF7C, + 0x84C7, 0xAF7D, 0x84C8, 0xAF7E, 0x84C9, 0xAF7F, 0x84CA, 0xAF81, 0x84CB, 0xAF82, 0x84CC, 0xAF83, 0x84CD, 0xAF85, 0x84CE, 0xAF86, + 0x84CF, 0xAF87, 0x84D0, 0xAF89, 0x84D1, 0xAF8A, 0x84D2, 0xAF8B, 0x84D3, 0xAF8C, 0x84D4, 0xAF8D, 0x84D5, 0xAF8E, 0x84D6, 0xAF8F, + 0x84D7, 0xAF92, 0x84D8, 0xAF93, 0x84D9, 0xAF94, 0x84DA, 0xAF96, 0x84DB, 0xAF97, 0x84DC, 0xAF98, 0x84DD, 0xAF99, 0x84DE, 0xAF9A, + 0x84DF, 0xAF9B, 0x84E0, 0xAF9D, 0x84E1, 0xAF9E, 0x84E2, 0xAF9F, 0x84E3, 0xAFA0, 0x84E4, 0xAFA1, 0x84E5, 0xAFA2, 0x84E6, 0xAFA3, + 0x84E7, 0xAFA4, 0x84E8, 0xAFA5, 0x84E9, 0xAFA6, 0x84EA, 0xAFA7, 0x84EB, 0xAFA8, 0x84EC, 0xAFA9, 0x84ED, 0xAFAA, 0x84EE, 0xAFAB, + 0x84EF, 0xAFAC, 0x84F0, 0xAFAD, 0x84F1, 0xAFAE, 0x84F2, 0xAFAF, 0x84F3, 0xAFB0, 0x84F4, 0xAFB1, 0x84F5, 0xAFB2, 0x84F6, 0xAFB3, + 0x84F7, 0xAFB4, 0x84F8, 0xAFB5, 0x84F9, 0xAFB6, 0x84FA, 0xAFB7, 0x84FB, 0xAFBA, 0x84FC, 0xAFBB, 0x84FD, 0xAFBD, 0x84FE, 0xAFBE, + 0x8541, 0xAFBF, 0x8542, 0xAFC1, 0x8543, 0xAFC2, 0x8544, 0xAFC3, 0x8545, 0xAFC4, 0x8546, 0xAFC5, 0x8547, 0xAFC6, 0x8548, 0xAFCA, + 0x8549, 0xAFCC, 0x854A, 0xAFCF, 0x854B, 0xAFD0, 0x854C, 0xAFD1, 0x854D, 0xAFD2, 0x854E, 0xAFD3, 0x854F, 0xAFD5, 0x8550, 0xAFD6, + 0x8551, 0xAFD7, 0x8552, 0xAFD8, 0x8553, 0xAFD9, 0x8554, 0xAFDA, 0x8555, 0xAFDB, 0x8556, 0xAFDD, 0x8557, 0xAFDE, 0x8558, 0xAFDF, + 0x8559, 0xAFE0, 0x855A, 0xAFE1, 0x8561, 0xAFE2, 0x8562, 0xAFE3, 0x8563, 0xAFE4, 0x8564, 0xAFE5, 0x8565, 0xAFE6, 0x8566, 0xAFE7, + 0x8567, 0xAFEA, 0x8568, 0xAFEB, 0x8569, 0xAFEC, 0x856A, 0xAFED, 0x856B, 0xAFEE, 0x856C, 0xAFEF, 0x856D, 0xAFF2, 0x856E, 0xAFF3, + 0x856F, 0xAFF5, 0x8570, 0xAFF6, 0x8571, 0xAFF7, 0x8572, 0xAFF9, 0x8573, 0xAFFA, 0x8574, 0xAFFB, 0x8575, 0xAFFC, 0x8576, 0xAFFD, + 0x8577, 0xAFFE, 0x8578, 0xAFFF, 0x8579, 0xB002, 0x857A, 0xB003, 0x8581, 0xB005, 0x8582, 0xB006, 0x8583, 0xB007, 0x8584, 0xB008, + 0x8585, 0xB009, 0x8586, 0xB00A, 0x8587, 0xB00B, 0x8588, 0xB00D, 0x8589, 0xB00E, 0x858A, 0xB00F, 0x858B, 0xB011, 0x858C, 0xB012, + 0x858D, 0xB013, 0x858E, 0xB015, 0x858F, 0xB016, 0x8590, 0xB017, 0x8591, 0xB018, 0x8592, 0xB019, 0x8593, 0xB01A, 0x8594, 0xB01B, + 0x8595, 0xB01E, 0x8596, 0xB01F, 0x8597, 0xB020, 0x8598, 0xB021, 0x8599, 0xB022, 0x859A, 0xB023, 0x859B, 0xB024, 0x859C, 0xB025, + 0x859D, 0xB026, 0x859E, 0xB027, 0x859F, 0xB029, 0x85A0, 0xB02A, 0x85A1, 0xB02B, 0x85A2, 0xB02C, 0x85A3, 0xB02D, 0x85A4, 0xB02E, + 0x85A5, 0xB02F, 0x85A6, 0xB030, 0x85A7, 0xB031, 0x85A8, 0xB032, 0x85A9, 0xB033, 0x85AA, 0xB034, 0x85AB, 0xB035, 0x85AC, 0xB036, + 0x85AD, 0xB037, 0x85AE, 0xB038, 0x85AF, 0xB039, 0x85B0, 0xB03A, 0x85B1, 0xB03B, 0x85B2, 0xB03C, 0x85B3, 0xB03D, 0x85B4, 0xB03E, + 0x85B5, 0xB03F, 0x85B6, 0xB040, 0x85B7, 0xB041, 0x85B8, 0xB042, 0x85B9, 0xB043, 0x85BA, 0xB046, 0x85BB, 0xB047, 0x85BC, 0xB049, + 0x85BD, 0xB04B, 0x85BE, 0xB04D, 0x85BF, 0xB04F, 0x85C0, 0xB050, 0x85C1, 0xB051, 0x85C2, 0xB052, 0x85C3, 0xB056, 0x85C4, 0xB058, + 0x85C5, 0xB05A, 0x85C6, 0xB05B, 0x85C7, 0xB05C, 0x85C8, 0xB05E, 0x85C9, 0xB05F, 0x85CA, 0xB060, 0x85CB, 0xB061, 0x85CC, 0xB062, + 0x85CD, 0xB063, 0x85CE, 0xB064, 0x85CF, 0xB065, 0x85D0, 0xB066, 0x85D1, 0xB067, 0x85D2, 0xB068, 0x85D3, 0xB069, 0x85D4, 0xB06A, + 0x85D5, 0xB06B, 0x85D6, 0xB06C, 0x85D7, 0xB06D, 0x85D8, 0xB06E, 0x85D9, 0xB06F, 0x85DA, 0xB070, 0x85DB, 0xB071, 0x85DC, 0xB072, + 0x85DD, 0xB073, 0x85DE, 0xB074, 0x85DF, 0xB075, 0x85E0, 0xB076, 0x85E1, 0xB077, 0x85E2, 0xB078, 0x85E3, 0xB079, 0x85E4, 0xB07A, + 0x85E5, 0xB07B, 0x85E6, 0xB07E, 0x85E7, 0xB07F, 0x85E8, 0xB081, 0x85E9, 0xB082, 0x85EA, 0xB083, 0x85EB, 0xB085, 0x85EC, 0xB086, + 0x85ED, 0xB087, 0x85EE, 0xB088, 0x85EF, 0xB089, 0x85F0, 0xB08A, 0x85F1, 0xB08B, 0x85F2, 0xB08E, 0x85F3, 0xB090, 0x85F4, 0xB092, + 0x85F5, 0xB093, 0x85F6, 0xB094, 0x85F7, 0xB095, 0x85F8, 0xB096, 0x85F9, 0xB097, 0x85FA, 0xB09B, 0x85FB, 0xB09D, 0x85FC, 0xB09E, + 0x85FD, 0xB0A3, 0x85FE, 0xB0A4, 0x8641, 0xB0A5, 0x8642, 0xB0A6, 0x8643, 0xB0A7, 0x8644, 0xB0AA, 0x8645, 0xB0B0, 0x8646, 0xB0B2, + 0x8647, 0xB0B6, 0x8648, 0xB0B7, 0x8649, 0xB0B9, 0x864A, 0xB0BA, 0x864B, 0xB0BB, 0x864C, 0xB0BD, 0x864D, 0xB0BE, 0x864E, 0xB0BF, + 0x864F, 0xB0C0, 0x8650, 0xB0C1, 0x8651, 0xB0C2, 0x8652, 0xB0C3, 0x8653, 0xB0C6, 0x8654, 0xB0CA, 0x8655, 0xB0CB, 0x8656, 0xB0CC, + 0x8657, 0xB0CD, 0x8658, 0xB0CE, 0x8659, 0xB0CF, 0x865A, 0xB0D2, 0x8661, 0xB0D3, 0x8662, 0xB0D5, 0x8663, 0xB0D6, 0x8664, 0xB0D7, + 0x8665, 0xB0D9, 0x8666, 0xB0DA, 0x8667, 0xB0DB, 0x8668, 0xB0DC, 0x8669, 0xB0DD, 0x866A, 0xB0DE, 0x866B, 0xB0DF, 0x866C, 0xB0E1, + 0x866D, 0xB0E2, 0x866E, 0xB0E3, 0x866F, 0xB0E4, 0x8670, 0xB0E6, 0x8671, 0xB0E7, 0x8672, 0xB0E8, 0x8673, 0xB0E9, 0x8674, 0xB0EA, + 0x8675, 0xB0EB, 0x8676, 0xB0EC, 0x8677, 0xB0ED, 0x8678, 0xB0EE, 0x8679, 0xB0EF, 0x867A, 0xB0F0, 0x8681, 0xB0F1, 0x8682, 0xB0F2, + 0x8683, 0xB0F3, 0x8684, 0xB0F4, 0x8685, 0xB0F5, 0x8686, 0xB0F6, 0x8687, 0xB0F7, 0x8688, 0xB0F8, 0x8689, 0xB0F9, 0x868A, 0xB0FA, + 0x868B, 0xB0FB, 0x868C, 0xB0FC, 0x868D, 0xB0FD, 0x868E, 0xB0FE, 0x868F, 0xB0FF, 0x8690, 0xB100, 0x8691, 0xB101, 0x8692, 0xB102, + 0x8693, 0xB103, 0x8694, 0xB104, 0x8695, 0xB105, 0x8696, 0xB106, 0x8697, 0xB107, 0x8698, 0xB10A, 0x8699, 0xB10D, 0x869A, 0xB10E, + 0x869B, 0xB10F, 0x869C, 0xB111, 0x869D, 0xB114, 0x869E, 0xB115, 0x869F, 0xB116, 0x86A0, 0xB117, 0x86A1, 0xB11A, 0x86A2, 0xB11E, + 0x86A3, 0xB11F, 0x86A4, 0xB120, 0x86A5, 0xB121, 0x86A6, 0xB122, 0x86A7, 0xB126, 0x86A8, 0xB127, 0x86A9, 0xB129, 0x86AA, 0xB12A, + 0x86AB, 0xB12B, 0x86AC, 0xB12D, 0x86AD, 0xB12E, 0x86AE, 0xB12F, 0x86AF, 0xB130, 0x86B0, 0xB131, 0x86B1, 0xB132, 0x86B2, 0xB133, + 0x86B3, 0xB136, 0x86B4, 0xB13A, 0x86B5, 0xB13B, 0x86B6, 0xB13C, 0x86B7, 0xB13D, 0x86B8, 0xB13E, 0x86B9, 0xB13F, 0x86BA, 0xB142, + 0x86BB, 0xB143, 0x86BC, 0xB145, 0x86BD, 0xB146, 0x86BE, 0xB147, 0x86BF, 0xB149, 0x86C0, 0xB14A, 0x86C1, 0xB14B, 0x86C2, 0xB14C, + 0x86C3, 0xB14D, 0x86C4, 0xB14E, 0x86C5, 0xB14F, 0x86C6, 0xB152, 0x86C7, 0xB153, 0x86C8, 0xB156, 0x86C9, 0xB157, 0x86CA, 0xB159, + 0x86CB, 0xB15A, 0x86CC, 0xB15B, 0x86CD, 0xB15D, 0x86CE, 0xB15E, 0x86CF, 0xB15F, 0x86D0, 0xB161, 0x86D1, 0xB162, 0x86D2, 0xB163, + 0x86D3, 0xB164, 0x86D4, 0xB165, 0x86D5, 0xB166, 0x86D6, 0xB167, 0x86D7, 0xB168, 0x86D8, 0xB169, 0x86D9, 0xB16A, 0x86DA, 0xB16B, + 0x86DB, 0xB16C, 0x86DC, 0xB16D, 0x86DD, 0xB16E, 0x86DE, 0xB16F, 0x86DF, 0xB170, 0x86E0, 0xB171, 0x86E1, 0xB172, 0x86E2, 0xB173, + 0x86E3, 0xB174, 0x86E4, 0xB175, 0x86E5, 0xB176, 0x86E6, 0xB177, 0x86E7, 0xB17A, 0x86E8, 0xB17B, 0x86E9, 0xB17D, 0x86EA, 0xB17E, + 0x86EB, 0xB17F, 0x86EC, 0xB181, 0x86ED, 0xB183, 0x86EE, 0xB184, 0x86EF, 0xB185, 0x86F0, 0xB186, 0x86F1, 0xB187, 0x86F2, 0xB18A, + 0x86F3, 0xB18C, 0x86F4, 0xB18E, 0x86F5, 0xB18F, 0x86F6, 0xB190, 0x86F7, 0xB191, 0x86F8, 0xB195, 0x86F9, 0xB196, 0x86FA, 0xB197, + 0x86FB, 0xB199, 0x86FC, 0xB19A, 0x86FD, 0xB19B, 0x86FE, 0xB19D, 0x8741, 0xB19E, 0x8742, 0xB19F, 0x8743, 0xB1A0, 0x8744, 0xB1A1, + 0x8745, 0xB1A2, 0x8746, 0xB1A3, 0x8747, 0xB1A4, 0x8748, 0xB1A5, 0x8749, 0xB1A6, 0x874A, 0xB1A7, 0x874B, 0xB1A9, 0x874C, 0xB1AA, + 0x874D, 0xB1AB, 0x874E, 0xB1AC, 0x874F, 0xB1AD, 0x8750, 0xB1AE, 0x8751, 0xB1AF, 0x8752, 0xB1B0, 0x8753, 0xB1B1, 0x8754, 0xB1B2, + 0x8755, 0xB1B3, 0x8756, 0xB1B4, 0x8757, 0xB1B5, 0x8758, 0xB1B6, 0x8759, 0xB1B7, 0x875A, 0xB1B8, 0x8761, 0xB1B9, 0x8762, 0xB1BA, + 0x8763, 0xB1BB, 0x8764, 0xB1BC, 0x8765, 0xB1BD, 0x8766, 0xB1BE, 0x8767, 0xB1BF, 0x8768, 0xB1C0, 0x8769, 0xB1C1, 0x876A, 0xB1C2, + 0x876B, 0xB1C3, 0x876C, 0xB1C4, 0x876D, 0xB1C5, 0x876E, 0xB1C6, 0x876F, 0xB1C7, 0x8770, 0xB1C8, 0x8771, 0xB1C9, 0x8772, 0xB1CA, + 0x8773, 0xB1CB, 0x8774, 0xB1CD, 0x8775, 0xB1CE, 0x8776, 0xB1CF, 0x8777, 0xB1D1, 0x8778, 0xB1D2, 0x8779, 0xB1D3, 0x877A, 0xB1D5, + 0x8781, 0xB1D6, 0x8782, 0xB1D7, 0x8783, 0xB1D8, 0x8784, 0xB1D9, 0x8785, 0xB1DA, 0x8786, 0xB1DB, 0x8787, 0xB1DE, 0x8788, 0xB1E0, + 0x8789, 0xB1E1, 0x878A, 0xB1E2, 0x878B, 0xB1E3, 0x878C, 0xB1E4, 0x878D, 0xB1E5, 0x878E, 0xB1E6, 0x878F, 0xB1E7, 0x8790, 0xB1EA, + 0x8791, 0xB1EB, 0x8792, 0xB1ED, 0x8793, 0xB1EE, 0x8794, 0xB1EF, 0x8795, 0xB1F1, 0x8796, 0xB1F2, 0x8797, 0xB1F3, 0x8798, 0xB1F4, + 0x8799, 0xB1F5, 0x879A, 0xB1F6, 0x879B, 0xB1F7, 0x879C, 0xB1F8, 0x879D, 0xB1FA, 0x879E, 0xB1FC, 0x879F, 0xB1FE, 0x87A0, 0xB1FF, + 0x87A1, 0xB200, 0x87A2, 0xB201, 0x87A3, 0xB202, 0x87A4, 0xB203, 0x87A5, 0xB206, 0x87A6, 0xB207, 0x87A7, 0xB209, 0x87A8, 0xB20A, + 0x87A9, 0xB20D, 0x87AA, 0xB20E, 0x87AB, 0xB20F, 0x87AC, 0xB210, 0x87AD, 0xB211, 0x87AE, 0xB212, 0x87AF, 0xB213, 0x87B0, 0xB216, + 0x87B1, 0xB218, 0x87B2, 0xB21A, 0x87B3, 0xB21B, 0x87B4, 0xB21C, 0x87B5, 0xB21D, 0x87B6, 0xB21E, 0x87B7, 0xB21F, 0x87B8, 0xB221, + 0x87B9, 0xB222, 0x87BA, 0xB223, 0x87BB, 0xB224, 0x87BC, 0xB225, 0x87BD, 0xB226, 0x87BE, 0xB227, 0x87BF, 0xB228, 0x87C0, 0xB229, + 0x87C1, 0xB22A, 0x87C2, 0xB22B, 0x87C3, 0xB22C, 0x87C4, 0xB22D, 0x87C5, 0xB22E, 0x87C6, 0xB22F, 0x87C7, 0xB230, 0x87C8, 0xB231, + 0x87C9, 0xB232, 0x87CA, 0xB233, 0x87CB, 0xB235, 0x87CC, 0xB236, 0x87CD, 0xB237, 0x87CE, 0xB238, 0x87CF, 0xB239, 0x87D0, 0xB23A, + 0x87D1, 0xB23B, 0x87D2, 0xB23D, 0x87D3, 0xB23E, 0x87D4, 0xB23F, 0x87D5, 0xB240, 0x87D6, 0xB241, 0x87D7, 0xB242, 0x87D8, 0xB243, + 0x87D9, 0xB244, 0x87DA, 0xB245, 0x87DB, 0xB246, 0x87DC, 0xB247, 0x87DD, 0xB248, 0x87DE, 0xB249, 0x87DF, 0xB24A, 0x87E0, 0xB24B, + 0x87E1, 0xB24C, 0x87E2, 0xB24D, 0x87E3, 0xB24E, 0x87E4, 0xB24F, 0x87E5, 0xB250, 0x87E6, 0xB251, 0x87E7, 0xB252, 0x87E8, 0xB253, + 0x87E9, 0xB254, 0x87EA, 0xB255, 0x87EB, 0xB256, 0x87EC, 0xB257, 0x87ED, 0xB259, 0x87EE, 0xB25A, 0x87EF, 0xB25B, 0x87F0, 0xB25D, + 0x87F1, 0xB25E, 0x87F2, 0xB25F, 0x87F3, 0xB261, 0x87F4, 0xB262, 0x87F5, 0xB263, 0x87F6, 0xB264, 0x87F7, 0xB265, 0x87F8, 0xB266, + 0x87F9, 0xB267, 0x87FA, 0xB26A, 0x87FB, 0xB26B, 0x87FC, 0xB26C, 0x87FD, 0xB26D, 0x87FE, 0xB26E, 0x8841, 0xB26F, 0x8842, 0xB270, + 0x8843, 0xB271, 0x8844, 0xB272, 0x8845, 0xB273, 0x8846, 0xB276, 0x8847, 0xB277, 0x8848, 0xB278, 0x8849, 0xB279, 0x884A, 0xB27A, + 0x884B, 0xB27B, 0x884C, 0xB27D, 0x884D, 0xB27E, 0x884E, 0xB27F, 0x884F, 0xB280, 0x8850, 0xB281, 0x8851, 0xB282, 0x8852, 0xB283, + 0x8853, 0xB286, 0x8854, 0xB287, 0x8855, 0xB288, 0x8856, 0xB28A, 0x8857, 0xB28B, 0x8858, 0xB28C, 0x8859, 0xB28D, 0x885A, 0xB28E, + 0x8861, 0xB28F, 0x8862, 0xB292, 0x8863, 0xB293, 0x8864, 0xB295, 0x8865, 0xB296, 0x8866, 0xB297, 0x8867, 0xB29B, 0x8868, 0xB29C, + 0x8869, 0xB29D, 0x886A, 0xB29E, 0x886B, 0xB29F, 0x886C, 0xB2A2, 0x886D, 0xB2A4, 0x886E, 0xB2A7, 0x886F, 0xB2A8, 0x8870, 0xB2A9, + 0x8871, 0xB2AB, 0x8872, 0xB2AD, 0x8873, 0xB2AE, 0x8874, 0xB2AF, 0x8875, 0xB2B1, 0x8876, 0xB2B2, 0x8877, 0xB2B3, 0x8878, 0xB2B5, + 0x8879, 0xB2B6, 0x887A, 0xB2B7, 0x8881, 0xB2B8, 0x8882, 0xB2B9, 0x8883, 0xB2BA, 0x8884, 0xB2BB, 0x8885, 0xB2BC, 0x8886, 0xB2BD, + 0x8887, 0xB2BE, 0x8888, 0xB2BF, 0x8889, 0xB2C0, 0x888A, 0xB2C1, 0x888B, 0xB2C2, 0x888C, 0xB2C3, 0x888D, 0xB2C4, 0x888E, 0xB2C5, + 0x888F, 0xB2C6, 0x8890, 0xB2C7, 0x8891, 0xB2CA, 0x8892, 0xB2CB, 0x8893, 0xB2CD, 0x8894, 0xB2CE, 0x8895, 0xB2CF, 0x8896, 0xB2D1, + 0x8897, 0xB2D3, 0x8898, 0xB2D4, 0x8899, 0xB2D5, 0x889A, 0xB2D6, 0x889B, 0xB2D7, 0x889C, 0xB2DA, 0x889D, 0xB2DC, 0x889E, 0xB2DE, + 0x889F, 0xB2DF, 0x88A0, 0xB2E0, 0x88A1, 0xB2E1, 0x88A2, 0xB2E3, 0x88A3, 0xB2E7, 0x88A4, 0xB2E9, 0x88A5, 0xB2EA, 0x88A6, 0xB2F0, + 0x88A7, 0xB2F1, 0x88A8, 0xB2F2, 0x88A9, 0xB2F6, 0x88AA, 0xB2FC, 0x88AB, 0xB2FD, 0x88AC, 0xB2FE, 0x88AD, 0xB302, 0x88AE, 0xB303, + 0x88AF, 0xB305, 0x88B0, 0xB306, 0x88B1, 0xB307, 0x88B2, 0xB309, 0x88B3, 0xB30A, 0x88B4, 0xB30B, 0x88B5, 0xB30C, 0x88B6, 0xB30D, + 0x88B7, 0xB30E, 0x88B8, 0xB30F, 0x88B9, 0xB312, 0x88BA, 0xB316, 0x88BB, 0xB317, 0x88BC, 0xB318, 0x88BD, 0xB319, 0x88BE, 0xB31A, + 0x88BF, 0xB31B, 0x88C0, 0xB31D, 0x88C1, 0xB31E, 0x88C2, 0xB31F, 0x88C3, 0xB320, 0x88C4, 0xB321, 0x88C5, 0xB322, 0x88C6, 0xB323, + 0x88C7, 0xB324, 0x88C8, 0xB325, 0x88C9, 0xB326, 0x88CA, 0xB327, 0x88CB, 0xB328, 0x88CC, 0xB329, 0x88CD, 0xB32A, 0x88CE, 0xB32B, + 0x88CF, 0xB32C, 0x88D0, 0xB32D, 0x88D1, 0xB32E, 0x88D2, 0xB32F, 0x88D3, 0xB330, 0x88D4, 0xB331, 0x88D5, 0xB332, 0x88D6, 0xB333, + 0x88D7, 0xB334, 0x88D8, 0xB335, 0x88D9, 0xB336, 0x88DA, 0xB337, 0x88DB, 0xB338, 0x88DC, 0xB339, 0x88DD, 0xB33A, 0x88DE, 0xB33B, + 0x88DF, 0xB33C, 0x88E0, 0xB33D, 0x88E1, 0xB33E, 0x88E2, 0xB33F, 0x88E3, 0xB340, 0x88E4, 0xB341, 0x88E5, 0xB342, 0x88E6, 0xB343, + 0x88E7, 0xB344, 0x88E8, 0xB345, 0x88E9, 0xB346, 0x88EA, 0xB347, 0x88EB, 0xB348, 0x88EC, 0xB349, 0x88ED, 0xB34A, 0x88EE, 0xB34B, + 0x88EF, 0xB34C, 0x88F0, 0xB34D, 0x88F1, 0xB34E, 0x88F2, 0xB34F, 0x88F3, 0xB350, 0x88F4, 0xB351, 0x88F5, 0xB352, 0x88F6, 0xB353, + 0x88F7, 0xB357, 0x88F8, 0xB359, 0x88F9, 0xB35A, 0x88FA, 0xB35D, 0x88FB, 0xB360, 0x88FC, 0xB361, 0x88FD, 0xB362, 0x88FE, 0xB363, + 0x8941, 0xB366, 0x8942, 0xB368, 0x8943, 0xB36A, 0x8944, 0xB36C, 0x8945, 0xB36D, 0x8946, 0xB36F, 0x8947, 0xB372, 0x8948, 0xB373, + 0x8949, 0xB375, 0x894A, 0xB376, 0x894B, 0xB377, 0x894C, 0xB379, 0x894D, 0xB37A, 0x894E, 0xB37B, 0x894F, 0xB37C, 0x8950, 0xB37D, + 0x8951, 0xB37E, 0x8952, 0xB37F, 0x8953, 0xB382, 0x8954, 0xB386, 0x8955, 0xB387, 0x8956, 0xB388, 0x8957, 0xB389, 0x8958, 0xB38A, + 0x8959, 0xB38B, 0x895A, 0xB38D, 0x8961, 0xB38E, 0x8962, 0xB38F, 0x8963, 0xB391, 0x8964, 0xB392, 0x8965, 0xB393, 0x8966, 0xB395, + 0x8967, 0xB396, 0x8968, 0xB397, 0x8969, 0xB398, 0x896A, 0xB399, 0x896B, 0xB39A, 0x896C, 0xB39B, 0x896D, 0xB39C, 0x896E, 0xB39D, + 0x896F, 0xB39E, 0x8970, 0xB39F, 0x8971, 0xB3A2, 0x8972, 0xB3A3, 0x8973, 0xB3A4, 0x8974, 0xB3A5, 0x8975, 0xB3A6, 0x8976, 0xB3A7, + 0x8977, 0xB3A9, 0x8978, 0xB3AA, 0x8979, 0xB3AB, 0x897A, 0xB3AD, 0x8981, 0xB3AE, 0x8982, 0xB3AF, 0x8983, 0xB3B0, 0x8984, 0xB3B1, + 0x8985, 0xB3B2, 0x8986, 0xB3B3, 0x8987, 0xB3B4, 0x8988, 0xB3B5, 0x8989, 0xB3B6, 0x898A, 0xB3B7, 0x898B, 0xB3B8, 0x898C, 0xB3B9, + 0x898D, 0xB3BA, 0x898E, 0xB3BB, 0x898F, 0xB3BC, 0x8990, 0xB3BD, 0x8991, 0xB3BE, 0x8992, 0xB3BF, 0x8993, 0xB3C0, 0x8994, 0xB3C1, + 0x8995, 0xB3C2, 0x8996, 0xB3C3, 0x8997, 0xB3C6, 0x8998, 0xB3C7, 0x8999, 0xB3C9, 0x899A, 0xB3CA, 0x899B, 0xB3CD, 0x899C, 0xB3CF, + 0x899D, 0xB3D1, 0x899E, 0xB3D2, 0x899F, 0xB3D3, 0x89A0, 0xB3D6, 0x89A1, 0xB3D8, 0x89A2, 0xB3DA, 0x89A3, 0xB3DC, 0x89A4, 0xB3DE, + 0x89A5, 0xB3DF, 0x89A6, 0xB3E1, 0x89A7, 0xB3E2, 0x89A8, 0xB3E3, 0x89A9, 0xB3E5, 0x89AA, 0xB3E6, 0x89AB, 0xB3E7, 0x89AC, 0xB3E9, + 0x89AD, 0xB3EA, 0x89AE, 0xB3EB, 0x89AF, 0xB3EC, 0x89B0, 0xB3ED, 0x89B1, 0xB3EE, 0x89B2, 0xB3EF, 0x89B3, 0xB3F0, 0x89B4, 0xB3F1, + 0x89B5, 0xB3F2, 0x89B6, 0xB3F3, 0x89B7, 0xB3F4, 0x89B8, 0xB3F5, 0x89B9, 0xB3F6, 0x89BA, 0xB3F7, 0x89BB, 0xB3F8, 0x89BC, 0xB3F9, + 0x89BD, 0xB3FA, 0x89BE, 0xB3FB, 0x89BF, 0xB3FD, 0x89C0, 0xB3FE, 0x89C1, 0xB3FF, 0x89C2, 0xB400, 0x89C3, 0xB401, 0x89C4, 0xB402, + 0x89C5, 0xB403, 0x89C6, 0xB404, 0x89C7, 0xB405, 0x89C8, 0xB406, 0x89C9, 0xB407, 0x89CA, 0xB408, 0x89CB, 0xB409, 0x89CC, 0xB40A, + 0x89CD, 0xB40B, 0x89CE, 0xB40C, 0x89CF, 0xB40D, 0x89D0, 0xB40E, 0x89D1, 0xB40F, 0x89D2, 0xB411, 0x89D3, 0xB412, 0x89D4, 0xB413, + 0x89D5, 0xB414, 0x89D6, 0xB415, 0x89D7, 0xB416, 0x89D8, 0xB417, 0x89D9, 0xB419, 0x89DA, 0xB41A, 0x89DB, 0xB41B, 0x89DC, 0xB41D, + 0x89DD, 0xB41E, 0x89DE, 0xB41F, 0x89DF, 0xB421, 0x89E0, 0xB422, 0x89E1, 0xB423, 0x89E2, 0xB424, 0x89E3, 0xB425, 0x89E4, 0xB426, + 0x89E5, 0xB427, 0x89E6, 0xB42A, 0x89E7, 0xB42C, 0x89E8, 0xB42D, 0x89E9, 0xB42E, 0x89EA, 0xB42F, 0x89EB, 0xB430, 0x89EC, 0xB431, + 0x89ED, 0xB432, 0x89EE, 0xB433, 0x89EF, 0xB435, 0x89F0, 0xB436, 0x89F1, 0xB437, 0x89F2, 0xB438, 0x89F3, 0xB439, 0x89F4, 0xB43A, + 0x89F5, 0xB43B, 0x89F6, 0xB43C, 0x89F7, 0xB43D, 0x89F8, 0xB43E, 0x89F9, 0xB43F, 0x89FA, 0xB440, 0x89FB, 0xB441, 0x89FC, 0xB442, + 0x89FD, 0xB443, 0x89FE, 0xB444, 0x8A41, 0xB445, 0x8A42, 0xB446, 0x8A43, 0xB447, 0x8A44, 0xB448, 0x8A45, 0xB449, 0x8A46, 0xB44A, + 0x8A47, 0xB44B, 0x8A48, 0xB44C, 0x8A49, 0xB44D, 0x8A4A, 0xB44E, 0x8A4B, 0xB44F, 0x8A4C, 0xB452, 0x8A4D, 0xB453, 0x8A4E, 0xB455, + 0x8A4F, 0xB456, 0x8A50, 0xB457, 0x8A51, 0xB459, 0x8A52, 0xB45A, 0x8A53, 0xB45B, 0x8A54, 0xB45C, 0x8A55, 0xB45D, 0x8A56, 0xB45E, + 0x8A57, 0xB45F, 0x8A58, 0xB462, 0x8A59, 0xB464, 0x8A5A, 0xB466, 0x8A61, 0xB467, 0x8A62, 0xB468, 0x8A63, 0xB469, 0x8A64, 0xB46A, + 0x8A65, 0xB46B, 0x8A66, 0xB46D, 0x8A67, 0xB46E, 0x8A68, 0xB46F, 0x8A69, 0xB470, 0x8A6A, 0xB471, 0x8A6B, 0xB472, 0x8A6C, 0xB473, + 0x8A6D, 0xB474, 0x8A6E, 0xB475, 0x8A6F, 0xB476, 0x8A70, 0xB477, 0x8A71, 0xB478, 0x8A72, 0xB479, 0x8A73, 0xB47A, 0x8A74, 0xB47B, + 0x8A75, 0xB47C, 0x8A76, 0xB47D, 0x8A77, 0xB47E, 0x8A78, 0xB47F, 0x8A79, 0xB481, 0x8A7A, 0xB482, 0x8A81, 0xB483, 0x8A82, 0xB484, + 0x8A83, 0xB485, 0x8A84, 0xB486, 0x8A85, 0xB487, 0x8A86, 0xB489, 0x8A87, 0xB48A, 0x8A88, 0xB48B, 0x8A89, 0xB48C, 0x8A8A, 0xB48D, + 0x8A8B, 0xB48E, 0x8A8C, 0xB48F, 0x8A8D, 0xB490, 0x8A8E, 0xB491, 0x8A8F, 0xB492, 0x8A90, 0xB493, 0x8A91, 0xB494, 0x8A92, 0xB495, + 0x8A93, 0xB496, 0x8A94, 0xB497, 0x8A95, 0xB498, 0x8A96, 0xB499, 0x8A97, 0xB49A, 0x8A98, 0xB49B, 0x8A99, 0xB49C, 0x8A9A, 0xB49E, + 0x8A9B, 0xB49F, 0x8A9C, 0xB4A0, 0x8A9D, 0xB4A1, 0x8A9E, 0xB4A2, 0x8A9F, 0xB4A3, 0x8AA0, 0xB4A5, 0x8AA1, 0xB4A6, 0x8AA2, 0xB4A7, + 0x8AA3, 0xB4A9, 0x8AA4, 0xB4AA, 0x8AA5, 0xB4AB, 0x8AA6, 0xB4AD, 0x8AA7, 0xB4AE, 0x8AA8, 0xB4AF, 0x8AA9, 0xB4B0, 0x8AAA, 0xB4B1, + 0x8AAB, 0xB4B2, 0x8AAC, 0xB4B3, 0x8AAD, 0xB4B4, 0x8AAE, 0xB4B6, 0x8AAF, 0xB4B8, 0x8AB0, 0xB4BA, 0x8AB1, 0xB4BB, 0x8AB2, 0xB4BC, + 0x8AB3, 0xB4BD, 0x8AB4, 0xB4BE, 0x8AB5, 0xB4BF, 0x8AB6, 0xB4C1, 0x8AB7, 0xB4C2, 0x8AB8, 0xB4C3, 0x8AB9, 0xB4C5, 0x8ABA, 0xB4C6, + 0x8ABB, 0xB4C7, 0x8ABC, 0xB4C9, 0x8ABD, 0xB4CA, 0x8ABE, 0xB4CB, 0x8ABF, 0xB4CC, 0x8AC0, 0xB4CD, 0x8AC1, 0xB4CE, 0x8AC2, 0xB4CF, + 0x8AC3, 0xB4D1, 0x8AC4, 0xB4D2, 0x8AC5, 0xB4D3, 0x8AC6, 0xB4D4, 0x8AC7, 0xB4D6, 0x8AC8, 0xB4D7, 0x8AC9, 0xB4D8, 0x8ACA, 0xB4D9, + 0x8ACB, 0xB4DA, 0x8ACC, 0xB4DB, 0x8ACD, 0xB4DE, 0x8ACE, 0xB4DF, 0x8ACF, 0xB4E1, 0x8AD0, 0xB4E2, 0x8AD1, 0xB4E5, 0x8AD2, 0xB4E7, + 0x8AD3, 0xB4E8, 0x8AD4, 0xB4E9, 0x8AD5, 0xB4EA, 0x8AD6, 0xB4EB, 0x8AD7, 0xB4EE, 0x8AD8, 0xB4F0, 0x8AD9, 0xB4F2, 0x8ADA, 0xB4F3, + 0x8ADB, 0xB4F4, 0x8ADC, 0xB4F5, 0x8ADD, 0xB4F6, 0x8ADE, 0xB4F7, 0x8ADF, 0xB4F9, 0x8AE0, 0xB4FA, 0x8AE1, 0xB4FB, 0x8AE2, 0xB4FC, + 0x8AE3, 0xB4FD, 0x8AE4, 0xB4FE, 0x8AE5, 0xB4FF, 0x8AE6, 0xB500, 0x8AE7, 0xB501, 0x8AE8, 0xB502, 0x8AE9, 0xB503, 0x8AEA, 0xB504, + 0x8AEB, 0xB505, 0x8AEC, 0xB506, 0x8AED, 0xB507, 0x8AEE, 0xB508, 0x8AEF, 0xB509, 0x8AF0, 0xB50A, 0x8AF1, 0xB50B, 0x8AF2, 0xB50C, + 0x8AF3, 0xB50D, 0x8AF4, 0xB50E, 0x8AF5, 0xB50F, 0x8AF6, 0xB510, 0x8AF7, 0xB511, 0x8AF8, 0xB512, 0x8AF9, 0xB513, 0x8AFA, 0xB516, + 0x8AFB, 0xB517, 0x8AFC, 0xB519, 0x8AFD, 0xB51A, 0x8AFE, 0xB51D, 0x8B41, 0xB51E, 0x8B42, 0xB51F, 0x8B43, 0xB520, 0x8B44, 0xB521, + 0x8B45, 0xB522, 0x8B46, 0xB523, 0x8B47, 0xB526, 0x8B48, 0xB52B, 0x8B49, 0xB52C, 0x8B4A, 0xB52D, 0x8B4B, 0xB52E, 0x8B4C, 0xB52F, + 0x8B4D, 0xB532, 0x8B4E, 0xB533, 0x8B4F, 0xB535, 0x8B50, 0xB536, 0x8B51, 0xB537, 0x8B52, 0xB539, 0x8B53, 0xB53A, 0x8B54, 0xB53B, + 0x8B55, 0xB53C, 0x8B56, 0xB53D, 0x8B57, 0xB53E, 0x8B58, 0xB53F, 0x8B59, 0xB542, 0x8B5A, 0xB546, 0x8B61, 0xB547, 0x8B62, 0xB548, + 0x8B63, 0xB549, 0x8B64, 0xB54A, 0x8B65, 0xB54E, 0x8B66, 0xB54F, 0x8B67, 0xB551, 0x8B68, 0xB552, 0x8B69, 0xB553, 0x8B6A, 0xB555, + 0x8B6B, 0xB556, 0x8B6C, 0xB557, 0x8B6D, 0xB558, 0x8B6E, 0xB559, 0x8B6F, 0xB55A, 0x8B70, 0xB55B, 0x8B71, 0xB55E, 0x8B72, 0xB562, + 0x8B73, 0xB563, 0x8B74, 0xB564, 0x8B75, 0xB565, 0x8B76, 0xB566, 0x8B77, 0xB567, 0x8B78, 0xB568, 0x8B79, 0xB569, 0x8B7A, 0xB56A, + 0x8B81, 0xB56B, 0x8B82, 0xB56C, 0x8B83, 0xB56D, 0x8B84, 0xB56E, 0x8B85, 0xB56F, 0x8B86, 0xB570, 0x8B87, 0xB571, 0x8B88, 0xB572, + 0x8B89, 0xB573, 0x8B8A, 0xB574, 0x8B8B, 0xB575, 0x8B8C, 0xB576, 0x8B8D, 0xB577, 0x8B8E, 0xB578, 0x8B8F, 0xB579, 0x8B90, 0xB57A, + 0x8B91, 0xB57B, 0x8B92, 0xB57C, 0x8B93, 0xB57D, 0x8B94, 0xB57E, 0x8B95, 0xB57F, 0x8B96, 0xB580, 0x8B97, 0xB581, 0x8B98, 0xB582, + 0x8B99, 0xB583, 0x8B9A, 0xB584, 0x8B9B, 0xB585, 0x8B9C, 0xB586, 0x8B9D, 0xB587, 0x8B9E, 0xB588, 0x8B9F, 0xB589, 0x8BA0, 0xB58A, + 0x8BA1, 0xB58B, 0x8BA2, 0xB58C, 0x8BA3, 0xB58D, 0x8BA4, 0xB58E, 0x8BA5, 0xB58F, 0x8BA6, 0xB590, 0x8BA7, 0xB591, 0x8BA8, 0xB592, + 0x8BA9, 0xB593, 0x8BAA, 0xB594, 0x8BAB, 0xB595, 0x8BAC, 0xB596, 0x8BAD, 0xB597, 0x8BAE, 0xB598, 0x8BAF, 0xB599, 0x8BB0, 0xB59A, + 0x8BB1, 0xB59B, 0x8BB2, 0xB59C, 0x8BB3, 0xB59D, 0x8BB4, 0xB59E, 0x8BB5, 0xB59F, 0x8BB6, 0xB5A2, 0x8BB7, 0xB5A3, 0x8BB8, 0xB5A5, + 0x8BB9, 0xB5A6, 0x8BBA, 0xB5A7, 0x8BBB, 0xB5A9, 0x8BBC, 0xB5AC, 0x8BBD, 0xB5AD, 0x8BBE, 0xB5AE, 0x8BBF, 0xB5AF, 0x8BC0, 0xB5B2, + 0x8BC1, 0xB5B6, 0x8BC2, 0xB5B7, 0x8BC3, 0xB5B8, 0x8BC4, 0xB5B9, 0x8BC5, 0xB5BA, 0x8BC6, 0xB5BE, 0x8BC7, 0xB5BF, 0x8BC8, 0xB5C1, + 0x8BC9, 0xB5C2, 0x8BCA, 0xB5C3, 0x8BCB, 0xB5C5, 0x8BCC, 0xB5C6, 0x8BCD, 0xB5C7, 0x8BCE, 0xB5C8, 0x8BCF, 0xB5C9, 0x8BD0, 0xB5CA, + 0x8BD1, 0xB5CB, 0x8BD2, 0xB5CE, 0x8BD3, 0xB5D2, 0x8BD4, 0xB5D3, 0x8BD5, 0xB5D4, 0x8BD6, 0xB5D5, 0x8BD7, 0xB5D6, 0x8BD8, 0xB5D7, + 0x8BD9, 0xB5D9, 0x8BDA, 0xB5DA, 0x8BDB, 0xB5DB, 0x8BDC, 0xB5DC, 0x8BDD, 0xB5DD, 0x8BDE, 0xB5DE, 0x8BDF, 0xB5DF, 0x8BE0, 0xB5E0, + 0x8BE1, 0xB5E1, 0x8BE2, 0xB5E2, 0x8BE3, 0xB5E3, 0x8BE4, 0xB5E4, 0x8BE5, 0xB5E5, 0x8BE6, 0xB5E6, 0x8BE7, 0xB5E7, 0x8BE8, 0xB5E8, + 0x8BE9, 0xB5E9, 0x8BEA, 0xB5EA, 0x8BEB, 0xB5EB, 0x8BEC, 0xB5ED, 0x8BED, 0xB5EE, 0x8BEE, 0xB5EF, 0x8BEF, 0xB5F0, 0x8BF0, 0xB5F1, + 0x8BF1, 0xB5F2, 0x8BF2, 0xB5F3, 0x8BF3, 0xB5F4, 0x8BF4, 0xB5F5, 0x8BF5, 0xB5F6, 0x8BF6, 0xB5F7, 0x8BF7, 0xB5F8, 0x8BF8, 0xB5F9, + 0x8BF9, 0xB5FA, 0x8BFA, 0xB5FB, 0x8BFB, 0xB5FC, 0x8BFC, 0xB5FD, 0x8BFD, 0xB5FE, 0x8BFE, 0xB5FF, 0x8C41, 0xB600, 0x8C42, 0xB601, + 0x8C43, 0xB602, 0x8C44, 0xB603, 0x8C45, 0xB604, 0x8C46, 0xB605, 0x8C47, 0xB606, 0x8C48, 0xB607, 0x8C49, 0xB608, 0x8C4A, 0xB609, + 0x8C4B, 0xB60A, 0x8C4C, 0xB60B, 0x8C4D, 0xB60C, 0x8C4E, 0xB60D, 0x8C4F, 0xB60E, 0x8C50, 0xB60F, 0x8C51, 0xB612, 0x8C52, 0xB613, + 0x8C53, 0xB615, 0x8C54, 0xB616, 0x8C55, 0xB617, 0x8C56, 0xB619, 0x8C57, 0xB61A, 0x8C58, 0xB61B, 0x8C59, 0xB61C, 0x8C5A, 0xB61D, + 0x8C61, 0xB61E, 0x8C62, 0xB61F, 0x8C63, 0xB620, 0x8C64, 0xB621, 0x8C65, 0xB622, 0x8C66, 0xB623, 0x8C67, 0xB624, 0x8C68, 0xB626, + 0x8C69, 0xB627, 0x8C6A, 0xB628, 0x8C6B, 0xB629, 0x8C6C, 0xB62A, 0x8C6D, 0xB62B, 0x8C6E, 0xB62D, 0x8C6F, 0xB62E, 0x8C70, 0xB62F, + 0x8C71, 0xB630, 0x8C72, 0xB631, 0x8C73, 0xB632, 0x8C74, 0xB633, 0x8C75, 0xB635, 0x8C76, 0xB636, 0x8C77, 0xB637, 0x8C78, 0xB638, + 0x8C79, 0xB639, 0x8C7A, 0xB63A, 0x8C81, 0xB63B, 0x8C82, 0xB63C, 0x8C83, 0xB63D, 0x8C84, 0xB63E, 0x8C85, 0xB63F, 0x8C86, 0xB640, + 0x8C87, 0xB641, 0x8C88, 0xB642, 0x8C89, 0xB643, 0x8C8A, 0xB644, 0x8C8B, 0xB645, 0x8C8C, 0xB646, 0x8C8D, 0xB647, 0x8C8E, 0xB649, + 0x8C8F, 0xB64A, 0x8C90, 0xB64B, 0x8C91, 0xB64C, 0x8C92, 0xB64D, 0x8C93, 0xB64E, 0x8C94, 0xB64F, 0x8C95, 0xB650, 0x8C96, 0xB651, + 0x8C97, 0xB652, 0x8C98, 0xB653, 0x8C99, 0xB654, 0x8C9A, 0xB655, 0x8C9B, 0xB656, 0x8C9C, 0xB657, 0x8C9D, 0xB658, 0x8C9E, 0xB659, + 0x8C9F, 0xB65A, 0x8CA0, 0xB65B, 0x8CA1, 0xB65C, 0x8CA2, 0xB65D, 0x8CA3, 0xB65E, 0x8CA4, 0xB65F, 0x8CA5, 0xB660, 0x8CA6, 0xB661, + 0x8CA7, 0xB662, 0x8CA8, 0xB663, 0x8CA9, 0xB665, 0x8CAA, 0xB666, 0x8CAB, 0xB667, 0x8CAC, 0xB669, 0x8CAD, 0xB66A, 0x8CAE, 0xB66B, + 0x8CAF, 0xB66C, 0x8CB0, 0xB66D, 0x8CB1, 0xB66E, 0x8CB2, 0xB66F, 0x8CB3, 0xB670, 0x8CB4, 0xB671, 0x8CB5, 0xB672, 0x8CB6, 0xB673, + 0x8CB7, 0xB674, 0x8CB8, 0xB675, 0x8CB9, 0xB676, 0x8CBA, 0xB677, 0x8CBB, 0xB678, 0x8CBC, 0xB679, 0x8CBD, 0xB67A, 0x8CBE, 0xB67B, + 0x8CBF, 0xB67C, 0x8CC0, 0xB67D, 0x8CC1, 0xB67E, 0x8CC2, 0xB67F, 0x8CC3, 0xB680, 0x8CC4, 0xB681, 0x8CC5, 0xB682, 0x8CC6, 0xB683, + 0x8CC7, 0xB684, 0x8CC8, 0xB685, 0x8CC9, 0xB686, 0x8CCA, 0xB687, 0x8CCB, 0xB688, 0x8CCC, 0xB689, 0x8CCD, 0xB68A, 0x8CCE, 0xB68B, + 0x8CCF, 0xB68C, 0x8CD0, 0xB68D, 0x8CD1, 0xB68E, 0x8CD2, 0xB68F, 0x8CD3, 0xB690, 0x8CD4, 0xB691, 0x8CD5, 0xB692, 0x8CD6, 0xB693, + 0x8CD7, 0xB694, 0x8CD8, 0xB695, 0x8CD9, 0xB696, 0x8CDA, 0xB697, 0x8CDB, 0xB698, 0x8CDC, 0xB699, 0x8CDD, 0xB69A, 0x8CDE, 0xB69B, + 0x8CDF, 0xB69E, 0x8CE0, 0xB69F, 0x8CE1, 0xB6A1, 0x8CE2, 0xB6A2, 0x8CE3, 0xB6A3, 0x8CE4, 0xB6A5, 0x8CE5, 0xB6A6, 0x8CE6, 0xB6A7, + 0x8CE7, 0xB6A8, 0x8CE8, 0xB6A9, 0x8CE9, 0xB6AA, 0x8CEA, 0xB6AD, 0x8CEB, 0xB6AE, 0x8CEC, 0xB6AF, 0x8CED, 0xB6B0, 0x8CEE, 0xB6B2, + 0x8CEF, 0xB6B3, 0x8CF0, 0xB6B4, 0x8CF1, 0xB6B5, 0x8CF2, 0xB6B6, 0x8CF3, 0xB6B7, 0x8CF4, 0xB6B8, 0x8CF5, 0xB6B9, 0x8CF6, 0xB6BA, + 0x8CF7, 0xB6BB, 0x8CF8, 0xB6BC, 0x8CF9, 0xB6BD, 0x8CFA, 0xB6BE, 0x8CFB, 0xB6BF, 0x8CFC, 0xB6C0, 0x8CFD, 0xB6C1, 0x8CFE, 0xB6C2, + 0x8D41, 0xB6C3, 0x8D42, 0xB6C4, 0x8D43, 0xB6C5, 0x8D44, 0xB6C6, 0x8D45, 0xB6C7, 0x8D46, 0xB6C8, 0x8D47, 0xB6C9, 0x8D48, 0xB6CA, + 0x8D49, 0xB6CB, 0x8D4A, 0xB6CC, 0x8D4B, 0xB6CD, 0x8D4C, 0xB6CE, 0x8D4D, 0xB6CF, 0x8D4E, 0xB6D0, 0x8D4F, 0xB6D1, 0x8D50, 0xB6D2, + 0x8D51, 0xB6D3, 0x8D52, 0xB6D5, 0x8D53, 0xB6D6, 0x8D54, 0xB6D7, 0x8D55, 0xB6D8, 0x8D56, 0xB6D9, 0x8D57, 0xB6DA, 0x8D58, 0xB6DB, + 0x8D59, 0xB6DC, 0x8D5A, 0xB6DD, 0x8D61, 0xB6DE, 0x8D62, 0xB6DF, 0x8D63, 0xB6E0, 0x8D64, 0xB6E1, 0x8D65, 0xB6E2, 0x8D66, 0xB6E3, + 0x8D67, 0xB6E4, 0x8D68, 0xB6E5, 0x8D69, 0xB6E6, 0x8D6A, 0xB6E7, 0x8D6B, 0xB6E8, 0x8D6C, 0xB6E9, 0x8D6D, 0xB6EA, 0x8D6E, 0xB6EB, + 0x8D6F, 0xB6EC, 0x8D70, 0xB6ED, 0x8D71, 0xB6EE, 0x8D72, 0xB6EF, 0x8D73, 0xB6F1, 0x8D74, 0xB6F2, 0x8D75, 0xB6F3, 0x8D76, 0xB6F5, + 0x8D77, 0xB6F6, 0x8D78, 0xB6F7, 0x8D79, 0xB6F9, 0x8D7A, 0xB6FA, 0x8D81, 0xB6FB, 0x8D82, 0xB6FC, 0x8D83, 0xB6FD, 0x8D84, 0xB6FE, + 0x8D85, 0xB6FF, 0x8D86, 0xB702, 0x8D87, 0xB703, 0x8D88, 0xB704, 0x8D89, 0xB706, 0x8D8A, 0xB707, 0x8D8B, 0xB708, 0x8D8C, 0xB709, + 0x8D8D, 0xB70A, 0x8D8E, 0xB70B, 0x8D8F, 0xB70C, 0x8D90, 0xB70D, 0x8D91, 0xB70E, 0x8D92, 0xB70F, 0x8D93, 0xB710, 0x8D94, 0xB711, + 0x8D95, 0xB712, 0x8D96, 0xB713, 0x8D97, 0xB714, 0x8D98, 0xB715, 0x8D99, 0xB716, 0x8D9A, 0xB717, 0x8D9B, 0xB718, 0x8D9C, 0xB719, + 0x8D9D, 0xB71A, 0x8D9E, 0xB71B, 0x8D9F, 0xB71C, 0x8DA0, 0xB71D, 0x8DA1, 0xB71E, 0x8DA2, 0xB71F, 0x8DA3, 0xB720, 0x8DA4, 0xB721, + 0x8DA5, 0xB722, 0x8DA6, 0xB723, 0x8DA7, 0xB724, 0x8DA8, 0xB725, 0x8DA9, 0xB726, 0x8DAA, 0xB727, 0x8DAB, 0xB72A, 0x8DAC, 0xB72B, + 0x8DAD, 0xB72D, 0x8DAE, 0xB72E, 0x8DAF, 0xB731, 0x8DB0, 0xB732, 0x8DB1, 0xB733, 0x8DB2, 0xB734, 0x8DB3, 0xB735, 0x8DB4, 0xB736, + 0x8DB5, 0xB737, 0x8DB6, 0xB73A, 0x8DB7, 0xB73C, 0x8DB8, 0xB73D, 0x8DB9, 0xB73E, 0x8DBA, 0xB73F, 0x8DBB, 0xB740, 0x8DBC, 0xB741, + 0x8DBD, 0xB742, 0x8DBE, 0xB743, 0x8DBF, 0xB745, 0x8DC0, 0xB746, 0x8DC1, 0xB747, 0x8DC2, 0xB749, 0x8DC3, 0xB74A, 0x8DC4, 0xB74B, + 0x8DC5, 0xB74D, 0x8DC6, 0xB74E, 0x8DC7, 0xB74F, 0x8DC8, 0xB750, 0x8DC9, 0xB751, 0x8DCA, 0xB752, 0x8DCB, 0xB753, 0x8DCC, 0xB756, + 0x8DCD, 0xB757, 0x8DCE, 0xB758, 0x8DCF, 0xB759, 0x8DD0, 0xB75A, 0x8DD1, 0xB75B, 0x8DD2, 0xB75C, 0x8DD3, 0xB75D, 0x8DD4, 0xB75E, + 0x8DD5, 0xB75F, 0x8DD6, 0xB761, 0x8DD7, 0xB762, 0x8DD8, 0xB763, 0x8DD9, 0xB765, 0x8DDA, 0xB766, 0x8DDB, 0xB767, 0x8DDC, 0xB769, + 0x8DDD, 0xB76A, 0x8DDE, 0xB76B, 0x8DDF, 0xB76C, 0x8DE0, 0xB76D, 0x8DE1, 0xB76E, 0x8DE2, 0xB76F, 0x8DE3, 0xB772, 0x8DE4, 0xB774, + 0x8DE5, 0xB776, 0x8DE6, 0xB777, 0x8DE7, 0xB778, 0x8DE8, 0xB779, 0x8DE9, 0xB77A, 0x8DEA, 0xB77B, 0x8DEB, 0xB77E, 0x8DEC, 0xB77F, + 0x8DED, 0xB781, 0x8DEE, 0xB782, 0x8DEF, 0xB783, 0x8DF0, 0xB785, 0x8DF1, 0xB786, 0x8DF2, 0xB787, 0x8DF3, 0xB788, 0x8DF4, 0xB789, + 0x8DF5, 0xB78A, 0x8DF6, 0xB78B, 0x8DF7, 0xB78E, 0x8DF8, 0xB793, 0x8DF9, 0xB794, 0x8DFA, 0xB795, 0x8DFB, 0xB79A, 0x8DFC, 0xB79B, + 0x8DFD, 0xB79D, 0x8DFE, 0xB79E, 0x8E41, 0xB79F, 0x8E42, 0xB7A1, 0x8E43, 0xB7A2, 0x8E44, 0xB7A3, 0x8E45, 0xB7A4, 0x8E46, 0xB7A5, + 0x8E47, 0xB7A6, 0x8E48, 0xB7A7, 0x8E49, 0xB7AA, 0x8E4A, 0xB7AE, 0x8E4B, 0xB7AF, 0x8E4C, 0xB7B0, 0x8E4D, 0xB7B1, 0x8E4E, 0xB7B2, + 0x8E4F, 0xB7B3, 0x8E50, 0xB7B6, 0x8E51, 0xB7B7, 0x8E52, 0xB7B9, 0x8E53, 0xB7BA, 0x8E54, 0xB7BB, 0x8E55, 0xB7BC, 0x8E56, 0xB7BD, + 0x8E57, 0xB7BE, 0x8E58, 0xB7BF, 0x8E59, 0xB7C0, 0x8E5A, 0xB7C1, 0x8E61, 0xB7C2, 0x8E62, 0xB7C3, 0x8E63, 0xB7C4, 0x8E64, 0xB7C5, + 0x8E65, 0xB7C6, 0x8E66, 0xB7C8, 0x8E67, 0xB7CA, 0x8E68, 0xB7CB, 0x8E69, 0xB7CC, 0x8E6A, 0xB7CD, 0x8E6B, 0xB7CE, 0x8E6C, 0xB7CF, + 0x8E6D, 0xB7D0, 0x8E6E, 0xB7D1, 0x8E6F, 0xB7D2, 0x8E70, 0xB7D3, 0x8E71, 0xB7D4, 0x8E72, 0xB7D5, 0x8E73, 0xB7D6, 0x8E74, 0xB7D7, + 0x8E75, 0xB7D8, 0x8E76, 0xB7D9, 0x8E77, 0xB7DA, 0x8E78, 0xB7DB, 0x8E79, 0xB7DC, 0x8E7A, 0xB7DD, 0x8E81, 0xB7DE, 0x8E82, 0xB7DF, + 0x8E83, 0xB7E0, 0x8E84, 0xB7E1, 0x8E85, 0xB7E2, 0x8E86, 0xB7E3, 0x8E87, 0xB7E4, 0x8E88, 0xB7E5, 0x8E89, 0xB7E6, 0x8E8A, 0xB7E7, + 0x8E8B, 0xB7E8, 0x8E8C, 0xB7E9, 0x8E8D, 0xB7EA, 0x8E8E, 0xB7EB, 0x8E8F, 0xB7EE, 0x8E90, 0xB7EF, 0x8E91, 0xB7F1, 0x8E92, 0xB7F2, + 0x8E93, 0xB7F3, 0x8E94, 0xB7F5, 0x8E95, 0xB7F6, 0x8E96, 0xB7F7, 0x8E97, 0xB7F8, 0x8E98, 0xB7F9, 0x8E99, 0xB7FA, 0x8E9A, 0xB7FB, + 0x8E9B, 0xB7FE, 0x8E9C, 0xB802, 0x8E9D, 0xB803, 0x8E9E, 0xB804, 0x8E9F, 0xB805, 0x8EA0, 0xB806, 0x8EA1, 0xB80A, 0x8EA2, 0xB80B, + 0x8EA3, 0xB80D, 0x8EA4, 0xB80E, 0x8EA5, 0xB80F, 0x8EA6, 0xB811, 0x8EA7, 0xB812, 0x8EA8, 0xB813, 0x8EA9, 0xB814, 0x8EAA, 0xB815, + 0x8EAB, 0xB816, 0x8EAC, 0xB817, 0x8EAD, 0xB81A, 0x8EAE, 0xB81C, 0x8EAF, 0xB81E, 0x8EB0, 0xB81F, 0x8EB1, 0xB820, 0x8EB2, 0xB821, + 0x8EB3, 0xB822, 0x8EB4, 0xB823, 0x8EB5, 0xB826, 0x8EB6, 0xB827, 0x8EB7, 0xB829, 0x8EB8, 0xB82A, 0x8EB9, 0xB82B, 0x8EBA, 0xB82D, + 0x8EBB, 0xB82E, 0x8EBC, 0xB82F, 0x8EBD, 0xB830, 0x8EBE, 0xB831, 0x8EBF, 0xB832, 0x8EC0, 0xB833, 0x8EC1, 0xB836, 0x8EC2, 0xB83A, + 0x8EC3, 0xB83B, 0x8EC4, 0xB83C, 0x8EC5, 0xB83D, 0x8EC6, 0xB83E, 0x8EC7, 0xB83F, 0x8EC8, 0xB841, 0x8EC9, 0xB842, 0x8ECA, 0xB843, + 0x8ECB, 0xB845, 0x8ECC, 0xB846, 0x8ECD, 0xB847, 0x8ECE, 0xB848, 0x8ECF, 0xB849, 0x8ED0, 0xB84A, 0x8ED1, 0xB84B, 0x8ED2, 0xB84C, + 0x8ED3, 0xB84D, 0x8ED4, 0xB84E, 0x8ED5, 0xB84F, 0x8ED6, 0xB850, 0x8ED7, 0xB852, 0x8ED8, 0xB854, 0x8ED9, 0xB855, 0x8EDA, 0xB856, + 0x8EDB, 0xB857, 0x8EDC, 0xB858, 0x8EDD, 0xB859, 0x8EDE, 0xB85A, 0x8EDF, 0xB85B, 0x8EE0, 0xB85E, 0x8EE1, 0xB85F, 0x8EE2, 0xB861, + 0x8EE3, 0xB862, 0x8EE4, 0xB863, 0x8EE5, 0xB865, 0x8EE6, 0xB866, 0x8EE7, 0xB867, 0x8EE8, 0xB868, 0x8EE9, 0xB869, 0x8EEA, 0xB86A, + 0x8EEB, 0xB86B, 0x8EEC, 0xB86E, 0x8EED, 0xB870, 0x8EEE, 0xB872, 0x8EEF, 0xB873, 0x8EF0, 0xB874, 0x8EF1, 0xB875, 0x8EF2, 0xB876, + 0x8EF3, 0xB877, 0x8EF4, 0xB879, 0x8EF5, 0xB87A, 0x8EF6, 0xB87B, 0x8EF7, 0xB87D, 0x8EF8, 0xB87E, 0x8EF9, 0xB87F, 0x8EFA, 0xB880, + 0x8EFB, 0xB881, 0x8EFC, 0xB882, 0x8EFD, 0xB883, 0x8EFE, 0xB884, 0x8F41, 0xB885, 0x8F42, 0xB886, 0x8F43, 0xB887, 0x8F44, 0xB888, + 0x8F45, 0xB889, 0x8F46, 0xB88A, 0x8F47, 0xB88B, 0x8F48, 0xB88C, 0x8F49, 0xB88E, 0x8F4A, 0xB88F, 0x8F4B, 0xB890, 0x8F4C, 0xB891, + 0x8F4D, 0xB892, 0x8F4E, 0xB893, 0x8F4F, 0xB894, 0x8F50, 0xB895, 0x8F51, 0xB896, 0x8F52, 0xB897, 0x8F53, 0xB898, 0x8F54, 0xB899, + 0x8F55, 0xB89A, 0x8F56, 0xB89B, 0x8F57, 0xB89C, 0x8F58, 0xB89D, 0x8F59, 0xB89E, 0x8F5A, 0xB89F, 0x8F61, 0xB8A0, 0x8F62, 0xB8A1, + 0x8F63, 0xB8A2, 0x8F64, 0xB8A3, 0x8F65, 0xB8A4, 0x8F66, 0xB8A5, 0x8F67, 0xB8A6, 0x8F68, 0xB8A7, 0x8F69, 0xB8A9, 0x8F6A, 0xB8AA, + 0x8F6B, 0xB8AB, 0x8F6C, 0xB8AC, 0x8F6D, 0xB8AD, 0x8F6E, 0xB8AE, 0x8F6F, 0xB8AF, 0x8F70, 0xB8B1, 0x8F71, 0xB8B2, 0x8F72, 0xB8B3, + 0x8F73, 0xB8B5, 0x8F74, 0xB8B6, 0x8F75, 0xB8B7, 0x8F76, 0xB8B9, 0x8F77, 0xB8BA, 0x8F78, 0xB8BB, 0x8F79, 0xB8BC, 0x8F7A, 0xB8BD, + 0x8F81, 0xB8BE, 0x8F82, 0xB8BF, 0x8F83, 0xB8C2, 0x8F84, 0xB8C4, 0x8F85, 0xB8C6, 0x8F86, 0xB8C7, 0x8F87, 0xB8C8, 0x8F88, 0xB8C9, + 0x8F89, 0xB8CA, 0x8F8A, 0xB8CB, 0x8F8B, 0xB8CD, 0x8F8C, 0xB8CE, 0x8F8D, 0xB8CF, 0x8F8E, 0xB8D1, 0x8F8F, 0xB8D2, 0x8F90, 0xB8D3, + 0x8F91, 0xB8D5, 0x8F92, 0xB8D6, 0x8F93, 0xB8D7, 0x8F94, 0xB8D8, 0x8F95, 0xB8D9, 0x8F96, 0xB8DA, 0x8F97, 0xB8DB, 0x8F98, 0xB8DC, + 0x8F99, 0xB8DE, 0x8F9A, 0xB8E0, 0x8F9B, 0xB8E2, 0x8F9C, 0xB8E3, 0x8F9D, 0xB8E4, 0x8F9E, 0xB8E5, 0x8F9F, 0xB8E6, 0x8FA0, 0xB8E7, + 0x8FA1, 0xB8EA, 0x8FA2, 0xB8EB, 0x8FA3, 0xB8ED, 0x8FA4, 0xB8EE, 0x8FA5, 0xB8EF, 0x8FA6, 0xB8F1, 0x8FA7, 0xB8F2, 0x8FA8, 0xB8F3, + 0x8FA9, 0xB8F4, 0x8FAA, 0xB8F5, 0x8FAB, 0xB8F6, 0x8FAC, 0xB8F7, 0x8FAD, 0xB8FA, 0x8FAE, 0xB8FC, 0x8FAF, 0xB8FE, 0x8FB0, 0xB8FF, + 0x8FB1, 0xB900, 0x8FB2, 0xB901, 0x8FB3, 0xB902, 0x8FB4, 0xB903, 0x8FB5, 0xB905, 0x8FB6, 0xB906, 0x8FB7, 0xB907, 0x8FB8, 0xB908, + 0x8FB9, 0xB909, 0x8FBA, 0xB90A, 0x8FBB, 0xB90B, 0x8FBC, 0xB90C, 0x8FBD, 0xB90D, 0x8FBE, 0xB90E, 0x8FBF, 0xB90F, 0x8FC0, 0xB910, + 0x8FC1, 0xB911, 0x8FC2, 0xB912, 0x8FC3, 0xB913, 0x8FC4, 0xB914, 0x8FC5, 0xB915, 0x8FC6, 0xB916, 0x8FC7, 0xB917, 0x8FC8, 0xB919, + 0x8FC9, 0xB91A, 0x8FCA, 0xB91B, 0x8FCB, 0xB91C, 0x8FCC, 0xB91D, 0x8FCD, 0xB91E, 0x8FCE, 0xB91F, 0x8FCF, 0xB921, 0x8FD0, 0xB922, + 0x8FD1, 0xB923, 0x8FD2, 0xB924, 0x8FD3, 0xB925, 0x8FD4, 0xB926, 0x8FD5, 0xB927, 0x8FD6, 0xB928, 0x8FD7, 0xB929, 0x8FD8, 0xB92A, + 0x8FD9, 0xB92B, 0x8FDA, 0xB92C, 0x8FDB, 0xB92D, 0x8FDC, 0xB92E, 0x8FDD, 0xB92F, 0x8FDE, 0xB930, 0x8FDF, 0xB931, 0x8FE0, 0xB932, + 0x8FE1, 0xB933, 0x8FE2, 0xB934, 0x8FE3, 0xB935, 0x8FE4, 0xB936, 0x8FE5, 0xB937, 0x8FE6, 0xB938, 0x8FE7, 0xB939, 0x8FE8, 0xB93A, + 0x8FE9, 0xB93B, 0x8FEA, 0xB93E, 0x8FEB, 0xB93F, 0x8FEC, 0xB941, 0x8FED, 0xB942, 0x8FEE, 0xB943, 0x8FEF, 0xB945, 0x8FF0, 0xB946, + 0x8FF1, 0xB947, 0x8FF2, 0xB948, 0x8FF3, 0xB949, 0x8FF4, 0xB94A, 0x8FF5, 0xB94B, 0x8FF6, 0xB94D, 0x8FF7, 0xB94E, 0x8FF8, 0xB950, + 0x8FF9, 0xB952, 0x8FFA, 0xB953, 0x8FFB, 0xB954, 0x8FFC, 0xB955, 0x8FFD, 0xB956, 0x8FFE, 0xB957, 0x9041, 0xB95A, 0x9042, 0xB95B, + 0x9043, 0xB95D, 0x9044, 0xB95E, 0x9045, 0xB95F, 0x9046, 0xB961, 0x9047, 0xB962, 0x9048, 0xB963, 0x9049, 0xB964, 0x904A, 0xB965, + 0x904B, 0xB966, 0x904C, 0xB967, 0x904D, 0xB96A, 0x904E, 0xB96C, 0x904F, 0xB96E, 0x9050, 0xB96F, 0x9051, 0xB970, 0x9052, 0xB971, + 0x9053, 0xB972, 0x9054, 0xB973, 0x9055, 0xB976, 0x9056, 0xB977, 0x9057, 0xB979, 0x9058, 0xB97A, 0x9059, 0xB97B, 0x905A, 0xB97D, + 0x9061, 0xB97E, 0x9062, 0xB97F, 0x9063, 0xB980, 0x9064, 0xB981, 0x9065, 0xB982, 0x9066, 0xB983, 0x9067, 0xB986, 0x9068, 0xB988, + 0x9069, 0xB98B, 0x906A, 0xB98C, 0x906B, 0xB98F, 0x906C, 0xB990, 0x906D, 0xB991, 0x906E, 0xB992, 0x906F, 0xB993, 0x9070, 0xB994, + 0x9071, 0xB995, 0x9072, 0xB996, 0x9073, 0xB997, 0x9074, 0xB998, 0x9075, 0xB999, 0x9076, 0xB99A, 0x9077, 0xB99B, 0x9078, 0xB99C, + 0x9079, 0xB99D, 0x907A, 0xB99E, 0x9081, 0xB99F, 0x9082, 0xB9A0, 0x9083, 0xB9A1, 0x9084, 0xB9A2, 0x9085, 0xB9A3, 0x9086, 0xB9A4, + 0x9087, 0xB9A5, 0x9088, 0xB9A6, 0x9089, 0xB9A7, 0x908A, 0xB9A8, 0x908B, 0xB9A9, 0x908C, 0xB9AA, 0x908D, 0xB9AB, 0x908E, 0xB9AE, + 0x908F, 0xB9AF, 0x9090, 0xB9B1, 0x9091, 0xB9B2, 0x9092, 0xB9B3, 0x9093, 0xB9B5, 0x9094, 0xB9B6, 0x9095, 0xB9B7, 0x9096, 0xB9B8, + 0x9097, 0xB9B9, 0x9098, 0xB9BA, 0x9099, 0xB9BB, 0x909A, 0xB9BE, 0x909B, 0xB9C0, 0x909C, 0xB9C2, 0x909D, 0xB9C3, 0x909E, 0xB9C4, + 0x909F, 0xB9C5, 0x90A0, 0xB9C6, 0x90A1, 0xB9C7, 0x90A2, 0xB9CA, 0x90A3, 0xB9CB, 0x90A4, 0xB9CD, 0x90A5, 0xB9D3, 0x90A6, 0xB9D4, + 0x90A7, 0xB9D5, 0x90A8, 0xB9D6, 0x90A9, 0xB9D7, 0x90AA, 0xB9DA, 0x90AB, 0xB9DC, 0x90AC, 0xB9DF, 0x90AD, 0xB9E0, 0x90AE, 0xB9E2, + 0x90AF, 0xB9E6, 0x90B0, 0xB9E7, 0x90B1, 0xB9E9, 0x90B2, 0xB9EA, 0x90B3, 0xB9EB, 0x90B4, 0xB9ED, 0x90B5, 0xB9EE, 0x90B6, 0xB9EF, + 0x90B7, 0xB9F0, 0x90B8, 0xB9F1, 0x90B9, 0xB9F2, 0x90BA, 0xB9F3, 0x90BB, 0xB9F6, 0x90BC, 0xB9FB, 0x90BD, 0xB9FC, 0x90BE, 0xB9FD, + 0x90BF, 0xB9FE, 0x90C0, 0xB9FF, 0x90C1, 0xBA02, 0x90C2, 0xBA03, 0x90C3, 0xBA04, 0x90C4, 0xBA05, 0x90C5, 0xBA06, 0x90C6, 0xBA07, + 0x90C7, 0xBA09, 0x90C8, 0xBA0A, 0x90C9, 0xBA0B, 0x90CA, 0xBA0C, 0x90CB, 0xBA0D, 0x90CC, 0xBA0E, 0x90CD, 0xBA0F, 0x90CE, 0xBA10, + 0x90CF, 0xBA11, 0x90D0, 0xBA12, 0x90D1, 0xBA13, 0x90D2, 0xBA14, 0x90D3, 0xBA16, 0x90D4, 0xBA17, 0x90D5, 0xBA18, 0x90D6, 0xBA19, + 0x90D7, 0xBA1A, 0x90D8, 0xBA1B, 0x90D9, 0xBA1C, 0x90DA, 0xBA1D, 0x90DB, 0xBA1E, 0x90DC, 0xBA1F, 0x90DD, 0xBA20, 0x90DE, 0xBA21, + 0x90DF, 0xBA22, 0x90E0, 0xBA23, 0x90E1, 0xBA24, 0x90E2, 0xBA25, 0x90E3, 0xBA26, 0x90E4, 0xBA27, 0x90E5, 0xBA28, 0x90E6, 0xBA29, + 0x90E7, 0xBA2A, 0x90E8, 0xBA2B, 0x90E9, 0xBA2C, 0x90EA, 0xBA2D, 0x90EB, 0xBA2E, 0x90EC, 0xBA2F, 0x90ED, 0xBA30, 0x90EE, 0xBA31, + 0x90EF, 0xBA32, 0x90F0, 0xBA33, 0x90F1, 0xBA34, 0x90F2, 0xBA35, 0x90F3, 0xBA36, 0x90F4, 0xBA37, 0x90F5, 0xBA3A, 0x90F6, 0xBA3B, + 0x90F7, 0xBA3D, 0x90F8, 0xBA3E, 0x90F9, 0xBA3F, 0x90FA, 0xBA41, 0x90FB, 0xBA43, 0x90FC, 0xBA44, 0x90FD, 0xBA45, 0x90FE, 0xBA46, + 0x9141, 0xBA47, 0x9142, 0xBA4A, 0x9143, 0xBA4C, 0x9144, 0xBA4F, 0x9145, 0xBA50, 0x9146, 0xBA51, 0x9147, 0xBA52, 0x9148, 0xBA56, + 0x9149, 0xBA57, 0x914A, 0xBA59, 0x914B, 0xBA5A, 0x914C, 0xBA5B, 0x914D, 0xBA5D, 0x914E, 0xBA5E, 0x914F, 0xBA5F, 0x9150, 0xBA60, + 0x9151, 0xBA61, 0x9152, 0xBA62, 0x9153, 0xBA63, 0x9154, 0xBA66, 0x9155, 0xBA6A, 0x9156, 0xBA6B, 0x9157, 0xBA6C, 0x9158, 0xBA6D, + 0x9159, 0xBA6E, 0x915A, 0xBA6F, 0x9161, 0xBA72, 0x9162, 0xBA73, 0x9163, 0xBA75, 0x9164, 0xBA76, 0x9165, 0xBA77, 0x9166, 0xBA79, + 0x9167, 0xBA7A, 0x9168, 0xBA7B, 0x9169, 0xBA7C, 0x916A, 0xBA7D, 0x916B, 0xBA7E, 0x916C, 0xBA7F, 0x916D, 0xBA80, 0x916E, 0xBA81, + 0x916F, 0xBA82, 0x9170, 0xBA86, 0x9171, 0xBA88, 0x9172, 0xBA89, 0x9173, 0xBA8A, 0x9174, 0xBA8B, 0x9175, 0xBA8D, 0x9176, 0xBA8E, + 0x9177, 0xBA8F, 0x9178, 0xBA90, 0x9179, 0xBA91, 0x917A, 0xBA92, 0x9181, 0xBA93, 0x9182, 0xBA94, 0x9183, 0xBA95, 0x9184, 0xBA96, + 0x9185, 0xBA97, 0x9186, 0xBA98, 0x9187, 0xBA99, 0x9188, 0xBA9A, 0x9189, 0xBA9B, 0x918A, 0xBA9C, 0x918B, 0xBA9D, 0x918C, 0xBA9E, + 0x918D, 0xBA9F, 0x918E, 0xBAA0, 0x918F, 0xBAA1, 0x9190, 0xBAA2, 0x9191, 0xBAA3, 0x9192, 0xBAA4, 0x9193, 0xBAA5, 0x9194, 0xBAA6, + 0x9195, 0xBAA7, 0x9196, 0xBAAA, 0x9197, 0xBAAD, 0x9198, 0xBAAE, 0x9199, 0xBAAF, 0x919A, 0xBAB1, 0x919B, 0xBAB3, 0x919C, 0xBAB4, + 0x919D, 0xBAB5, 0x919E, 0xBAB6, 0x919F, 0xBAB7, 0x91A0, 0xBABA, 0x91A1, 0xBABC, 0x91A2, 0xBABE, 0x91A3, 0xBABF, 0x91A4, 0xBAC0, + 0x91A5, 0xBAC1, 0x91A6, 0xBAC2, 0x91A7, 0xBAC3, 0x91A8, 0xBAC5, 0x91A9, 0xBAC6, 0x91AA, 0xBAC7, 0x91AB, 0xBAC9, 0x91AC, 0xBACA, + 0x91AD, 0xBACB, 0x91AE, 0xBACC, 0x91AF, 0xBACD, 0x91B0, 0xBACE, 0x91B1, 0xBACF, 0x91B2, 0xBAD0, 0x91B3, 0xBAD1, 0x91B4, 0xBAD2, + 0x91B5, 0xBAD3, 0x91B6, 0xBAD4, 0x91B7, 0xBAD5, 0x91B8, 0xBAD6, 0x91B9, 0xBAD7, 0x91BA, 0xBADA, 0x91BB, 0xBADB, 0x91BC, 0xBADC, + 0x91BD, 0xBADD, 0x91BE, 0xBADE, 0x91BF, 0xBADF, 0x91C0, 0xBAE0, 0x91C1, 0xBAE1, 0x91C2, 0xBAE2, 0x91C3, 0xBAE3, 0x91C4, 0xBAE4, + 0x91C5, 0xBAE5, 0x91C6, 0xBAE6, 0x91C7, 0xBAE7, 0x91C8, 0xBAE8, 0x91C9, 0xBAE9, 0x91CA, 0xBAEA, 0x91CB, 0xBAEB, 0x91CC, 0xBAEC, + 0x91CD, 0xBAED, 0x91CE, 0xBAEE, 0x91CF, 0xBAEF, 0x91D0, 0xBAF0, 0x91D1, 0xBAF1, 0x91D2, 0xBAF2, 0x91D3, 0xBAF3, 0x91D4, 0xBAF4, + 0x91D5, 0xBAF5, 0x91D6, 0xBAF6, 0x91D7, 0xBAF7, 0x91D8, 0xBAF8, 0x91D9, 0xBAF9, 0x91DA, 0xBAFA, 0x91DB, 0xBAFB, 0x91DC, 0xBAFD, + 0x91DD, 0xBAFE, 0x91DE, 0xBAFF, 0x91DF, 0xBB01, 0x91E0, 0xBB02, 0x91E1, 0xBB03, 0x91E2, 0xBB05, 0x91E3, 0xBB06, 0x91E4, 0xBB07, + 0x91E5, 0xBB08, 0x91E6, 0xBB09, 0x91E7, 0xBB0A, 0x91E8, 0xBB0B, 0x91E9, 0xBB0C, 0x91EA, 0xBB0E, 0x91EB, 0xBB10, 0x91EC, 0xBB12, + 0x91ED, 0xBB13, 0x91EE, 0xBB14, 0x91EF, 0xBB15, 0x91F0, 0xBB16, 0x91F1, 0xBB17, 0x91F2, 0xBB19, 0x91F3, 0xBB1A, 0x91F4, 0xBB1B, + 0x91F5, 0xBB1D, 0x91F6, 0xBB1E, 0x91F7, 0xBB1F, 0x91F8, 0xBB21, 0x91F9, 0xBB22, 0x91FA, 0xBB23, 0x91FB, 0xBB24, 0x91FC, 0xBB25, + 0x91FD, 0xBB26, 0x91FE, 0xBB27, 0x9241, 0xBB28, 0x9242, 0xBB2A, 0x9243, 0xBB2C, 0x9244, 0xBB2D, 0x9245, 0xBB2E, 0x9246, 0xBB2F, + 0x9247, 0xBB30, 0x9248, 0xBB31, 0x9249, 0xBB32, 0x924A, 0xBB33, 0x924B, 0xBB37, 0x924C, 0xBB39, 0x924D, 0xBB3A, 0x924E, 0xBB3F, + 0x924F, 0xBB40, 0x9250, 0xBB41, 0x9251, 0xBB42, 0x9252, 0xBB43, 0x9253, 0xBB46, 0x9254, 0xBB48, 0x9255, 0xBB4A, 0x9256, 0xBB4B, + 0x9257, 0xBB4C, 0x9258, 0xBB4E, 0x9259, 0xBB51, 0x925A, 0xBB52, 0x9261, 0xBB53, 0x9262, 0xBB55, 0x9263, 0xBB56, 0x9264, 0xBB57, + 0x9265, 0xBB59, 0x9266, 0xBB5A, 0x9267, 0xBB5B, 0x9268, 0xBB5C, 0x9269, 0xBB5D, 0x926A, 0xBB5E, 0x926B, 0xBB5F, 0x926C, 0xBB60, + 0x926D, 0xBB62, 0x926E, 0xBB64, 0x926F, 0xBB65, 0x9270, 0xBB66, 0x9271, 0xBB67, 0x9272, 0xBB68, 0x9273, 0xBB69, 0x9274, 0xBB6A, + 0x9275, 0xBB6B, 0x9276, 0xBB6D, 0x9277, 0xBB6E, 0x9278, 0xBB6F, 0x9279, 0xBB70, 0x927A, 0xBB71, 0x9281, 0xBB72, 0x9282, 0xBB73, + 0x9283, 0xBB74, 0x9284, 0xBB75, 0x9285, 0xBB76, 0x9286, 0xBB77, 0x9287, 0xBB78, 0x9288, 0xBB79, 0x9289, 0xBB7A, 0x928A, 0xBB7B, + 0x928B, 0xBB7C, 0x928C, 0xBB7D, 0x928D, 0xBB7E, 0x928E, 0xBB7F, 0x928F, 0xBB80, 0x9290, 0xBB81, 0x9291, 0xBB82, 0x9292, 0xBB83, + 0x9293, 0xBB84, 0x9294, 0xBB85, 0x9295, 0xBB86, 0x9296, 0xBB87, 0x9297, 0xBB89, 0x9298, 0xBB8A, 0x9299, 0xBB8B, 0x929A, 0xBB8D, + 0x929B, 0xBB8E, 0x929C, 0xBB8F, 0x929D, 0xBB91, 0x929E, 0xBB92, 0x929F, 0xBB93, 0x92A0, 0xBB94, 0x92A1, 0xBB95, 0x92A2, 0xBB96, + 0x92A3, 0xBB97, 0x92A4, 0xBB98, 0x92A5, 0xBB99, 0x92A6, 0xBB9A, 0x92A7, 0xBB9B, 0x92A8, 0xBB9C, 0x92A9, 0xBB9D, 0x92AA, 0xBB9E, + 0x92AB, 0xBB9F, 0x92AC, 0xBBA0, 0x92AD, 0xBBA1, 0x92AE, 0xBBA2, 0x92AF, 0xBBA3, 0x92B0, 0xBBA5, 0x92B1, 0xBBA6, 0x92B2, 0xBBA7, + 0x92B3, 0xBBA9, 0x92B4, 0xBBAA, 0x92B5, 0xBBAB, 0x92B6, 0xBBAD, 0x92B7, 0xBBAE, 0x92B8, 0xBBAF, 0x92B9, 0xBBB0, 0x92BA, 0xBBB1, + 0x92BB, 0xBBB2, 0x92BC, 0xBBB3, 0x92BD, 0xBBB5, 0x92BE, 0xBBB6, 0x92BF, 0xBBB8, 0x92C0, 0xBBB9, 0x92C1, 0xBBBA, 0x92C2, 0xBBBB, + 0x92C3, 0xBBBC, 0x92C4, 0xBBBD, 0x92C5, 0xBBBE, 0x92C6, 0xBBBF, 0x92C7, 0xBBC1, 0x92C8, 0xBBC2, 0x92C9, 0xBBC3, 0x92CA, 0xBBC5, + 0x92CB, 0xBBC6, 0x92CC, 0xBBC7, 0x92CD, 0xBBC9, 0x92CE, 0xBBCA, 0x92CF, 0xBBCB, 0x92D0, 0xBBCC, 0x92D1, 0xBBCD, 0x92D2, 0xBBCE, + 0x92D3, 0xBBCF, 0x92D4, 0xBBD1, 0x92D5, 0xBBD2, 0x92D6, 0xBBD4, 0x92D7, 0xBBD5, 0x92D8, 0xBBD6, 0x92D9, 0xBBD7, 0x92DA, 0xBBD8, + 0x92DB, 0xBBD9, 0x92DC, 0xBBDA, 0x92DD, 0xBBDB, 0x92DE, 0xBBDC, 0x92DF, 0xBBDD, 0x92E0, 0xBBDE, 0x92E1, 0xBBDF, 0x92E2, 0xBBE0, + 0x92E3, 0xBBE1, 0x92E4, 0xBBE2, 0x92E5, 0xBBE3, 0x92E6, 0xBBE4, 0x92E7, 0xBBE5, 0x92E8, 0xBBE6, 0x92E9, 0xBBE7, 0x92EA, 0xBBE8, + 0x92EB, 0xBBE9, 0x92EC, 0xBBEA, 0x92ED, 0xBBEB, 0x92EE, 0xBBEC, 0x92EF, 0xBBED, 0x92F0, 0xBBEE, 0x92F1, 0xBBEF, 0x92F2, 0xBBF0, + 0x92F3, 0xBBF1, 0x92F4, 0xBBF2, 0x92F5, 0xBBF3, 0x92F6, 0xBBF4, 0x92F7, 0xBBF5, 0x92F8, 0xBBF6, 0x92F9, 0xBBF7, 0x92FA, 0xBBFA, + 0x92FB, 0xBBFB, 0x92FC, 0xBBFD, 0x92FD, 0xBBFE, 0x92FE, 0xBC01, 0x9341, 0xBC03, 0x9342, 0xBC04, 0x9343, 0xBC05, 0x9344, 0xBC06, + 0x9345, 0xBC07, 0x9346, 0xBC0A, 0x9347, 0xBC0E, 0x9348, 0xBC10, 0x9349, 0xBC12, 0x934A, 0xBC13, 0x934B, 0xBC19, 0x934C, 0xBC1A, + 0x934D, 0xBC20, 0x934E, 0xBC21, 0x934F, 0xBC22, 0x9350, 0xBC23, 0x9351, 0xBC26, 0x9352, 0xBC28, 0x9353, 0xBC2A, 0x9354, 0xBC2B, + 0x9355, 0xBC2C, 0x9356, 0xBC2E, 0x9357, 0xBC2F, 0x9358, 0xBC32, 0x9359, 0xBC33, 0x935A, 0xBC35, 0x9361, 0xBC36, 0x9362, 0xBC37, + 0x9363, 0xBC39, 0x9364, 0xBC3A, 0x9365, 0xBC3B, 0x9366, 0xBC3C, 0x9367, 0xBC3D, 0x9368, 0xBC3E, 0x9369, 0xBC3F, 0x936A, 0xBC42, + 0x936B, 0xBC46, 0x936C, 0xBC47, 0x936D, 0xBC48, 0x936E, 0xBC4A, 0x936F, 0xBC4B, 0x9370, 0xBC4E, 0x9371, 0xBC4F, 0x9372, 0xBC51, + 0x9373, 0xBC52, 0x9374, 0xBC53, 0x9375, 0xBC54, 0x9376, 0xBC55, 0x9377, 0xBC56, 0x9378, 0xBC57, 0x9379, 0xBC58, 0x937A, 0xBC59, + 0x9381, 0xBC5A, 0x9382, 0xBC5B, 0x9383, 0xBC5C, 0x9384, 0xBC5E, 0x9385, 0xBC5F, 0x9386, 0xBC60, 0x9387, 0xBC61, 0x9388, 0xBC62, + 0x9389, 0xBC63, 0x938A, 0xBC64, 0x938B, 0xBC65, 0x938C, 0xBC66, 0x938D, 0xBC67, 0x938E, 0xBC68, 0x938F, 0xBC69, 0x9390, 0xBC6A, + 0x9391, 0xBC6B, 0x9392, 0xBC6C, 0x9393, 0xBC6D, 0x9394, 0xBC6E, 0x9395, 0xBC6F, 0x9396, 0xBC70, 0x9397, 0xBC71, 0x9398, 0xBC72, + 0x9399, 0xBC73, 0x939A, 0xBC74, 0x939B, 0xBC75, 0x939C, 0xBC76, 0x939D, 0xBC77, 0x939E, 0xBC78, 0x939F, 0xBC79, 0x93A0, 0xBC7A, + 0x93A1, 0xBC7B, 0x93A2, 0xBC7C, 0x93A3, 0xBC7D, 0x93A4, 0xBC7E, 0x93A5, 0xBC7F, 0x93A6, 0xBC80, 0x93A7, 0xBC81, 0x93A8, 0xBC82, + 0x93A9, 0xBC83, 0x93AA, 0xBC86, 0x93AB, 0xBC87, 0x93AC, 0xBC89, 0x93AD, 0xBC8A, 0x93AE, 0xBC8D, 0x93AF, 0xBC8F, 0x93B0, 0xBC90, + 0x93B1, 0xBC91, 0x93B2, 0xBC92, 0x93B3, 0xBC93, 0x93B4, 0xBC96, 0x93B5, 0xBC98, 0x93B6, 0xBC9B, 0x93B7, 0xBC9C, 0x93B8, 0xBC9D, + 0x93B9, 0xBC9E, 0x93BA, 0xBC9F, 0x93BB, 0xBCA2, 0x93BC, 0xBCA3, 0x93BD, 0xBCA5, 0x93BE, 0xBCA6, 0x93BF, 0xBCA9, 0x93C0, 0xBCAA, + 0x93C1, 0xBCAB, 0x93C2, 0xBCAC, 0x93C3, 0xBCAD, 0x93C4, 0xBCAE, 0x93C5, 0xBCAF, 0x93C6, 0xBCB2, 0x93C7, 0xBCB6, 0x93C8, 0xBCB7, + 0x93C9, 0xBCB8, 0x93CA, 0xBCB9, 0x93CB, 0xBCBA, 0x93CC, 0xBCBB, 0x93CD, 0xBCBE, 0x93CE, 0xBCBF, 0x93CF, 0xBCC1, 0x93D0, 0xBCC2, + 0x93D1, 0xBCC3, 0x93D2, 0xBCC5, 0x93D3, 0xBCC6, 0x93D4, 0xBCC7, 0x93D5, 0xBCC8, 0x93D6, 0xBCC9, 0x93D7, 0xBCCA, 0x93D8, 0xBCCB, + 0x93D9, 0xBCCC, 0x93DA, 0xBCCE, 0x93DB, 0xBCD2, 0x93DC, 0xBCD3, 0x93DD, 0xBCD4, 0x93DE, 0xBCD6, 0x93DF, 0xBCD7, 0x93E0, 0xBCD9, + 0x93E1, 0xBCDA, 0x93E2, 0xBCDB, 0x93E3, 0xBCDD, 0x93E4, 0xBCDE, 0x93E5, 0xBCDF, 0x93E6, 0xBCE0, 0x93E7, 0xBCE1, 0x93E8, 0xBCE2, + 0x93E9, 0xBCE3, 0x93EA, 0xBCE4, 0x93EB, 0xBCE5, 0x93EC, 0xBCE6, 0x93ED, 0xBCE7, 0x93EE, 0xBCE8, 0x93EF, 0xBCE9, 0x93F0, 0xBCEA, + 0x93F1, 0xBCEB, 0x93F2, 0xBCEC, 0x93F3, 0xBCED, 0x93F4, 0xBCEE, 0x93F5, 0xBCEF, 0x93F6, 0xBCF0, 0x93F7, 0xBCF1, 0x93F8, 0xBCF2, + 0x93F9, 0xBCF3, 0x93FA, 0xBCF7, 0x93FB, 0xBCF9, 0x93FC, 0xBCFA, 0x93FD, 0xBCFB, 0x93FE, 0xBCFD, 0x9441, 0xBCFE, 0x9442, 0xBCFF, + 0x9443, 0xBD00, 0x9444, 0xBD01, 0x9445, 0xBD02, 0x9446, 0xBD03, 0x9447, 0xBD06, 0x9448, 0xBD08, 0x9449, 0xBD0A, 0x944A, 0xBD0B, + 0x944B, 0xBD0C, 0x944C, 0xBD0D, 0x944D, 0xBD0E, 0x944E, 0xBD0F, 0x944F, 0xBD11, 0x9450, 0xBD12, 0x9451, 0xBD13, 0x9452, 0xBD15, + 0x9453, 0xBD16, 0x9454, 0xBD17, 0x9455, 0xBD18, 0x9456, 0xBD19, 0x9457, 0xBD1A, 0x9458, 0xBD1B, 0x9459, 0xBD1C, 0x945A, 0xBD1D, + 0x9461, 0xBD1E, 0x9462, 0xBD1F, 0x9463, 0xBD20, 0x9464, 0xBD21, 0x9465, 0xBD22, 0x9466, 0xBD23, 0x9467, 0xBD25, 0x9468, 0xBD26, + 0x9469, 0xBD27, 0x946A, 0xBD28, 0x946B, 0xBD29, 0x946C, 0xBD2A, 0x946D, 0xBD2B, 0x946E, 0xBD2D, 0x946F, 0xBD2E, 0x9470, 0xBD2F, + 0x9471, 0xBD30, 0x9472, 0xBD31, 0x9473, 0xBD32, 0x9474, 0xBD33, 0x9475, 0xBD34, 0x9476, 0xBD35, 0x9477, 0xBD36, 0x9478, 0xBD37, + 0x9479, 0xBD38, 0x947A, 0xBD39, 0x9481, 0xBD3A, 0x9482, 0xBD3B, 0x9483, 0xBD3C, 0x9484, 0xBD3D, 0x9485, 0xBD3E, 0x9486, 0xBD3F, + 0x9487, 0xBD41, 0x9488, 0xBD42, 0x9489, 0xBD43, 0x948A, 0xBD44, 0x948B, 0xBD45, 0x948C, 0xBD46, 0x948D, 0xBD47, 0x948E, 0xBD4A, + 0x948F, 0xBD4B, 0x9490, 0xBD4D, 0x9491, 0xBD4E, 0x9492, 0xBD4F, 0x9493, 0xBD51, 0x9494, 0xBD52, 0x9495, 0xBD53, 0x9496, 0xBD54, + 0x9497, 0xBD55, 0x9498, 0xBD56, 0x9499, 0xBD57, 0x949A, 0xBD5A, 0x949B, 0xBD5B, 0x949C, 0xBD5C, 0x949D, 0xBD5D, 0x949E, 0xBD5E, + 0x949F, 0xBD5F, 0x94A0, 0xBD60, 0x94A1, 0xBD61, 0x94A2, 0xBD62, 0x94A3, 0xBD63, 0x94A4, 0xBD65, 0x94A5, 0xBD66, 0x94A6, 0xBD67, + 0x94A7, 0xBD69, 0x94A8, 0xBD6A, 0x94A9, 0xBD6B, 0x94AA, 0xBD6C, 0x94AB, 0xBD6D, 0x94AC, 0xBD6E, 0x94AD, 0xBD6F, 0x94AE, 0xBD70, + 0x94AF, 0xBD71, 0x94B0, 0xBD72, 0x94B1, 0xBD73, 0x94B2, 0xBD74, 0x94B3, 0xBD75, 0x94B4, 0xBD76, 0x94B5, 0xBD77, 0x94B6, 0xBD78, + 0x94B7, 0xBD79, 0x94B8, 0xBD7A, 0x94B9, 0xBD7B, 0x94BA, 0xBD7C, 0x94BB, 0xBD7D, 0x94BC, 0xBD7E, 0x94BD, 0xBD7F, 0x94BE, 0xBD82, + 0x94BF, 0xBD83, 0x94C0, 0xBD85, 0x94C1, 0xBD86, 0x94C2, 0xBD8B, 0x94C3, 0xBD8C, 0x94C4, 0xBD8D, 0x94C5, 0xBD8E, 0x94C6, 0xBD8F, + 0x94C7, 0xBD92, 0x94C8, 0xBD94, 0x94C9, 0xBD96, 0x94CA, 0xBD97, 0x94CB, 0xBD98, 0x94CC, 0xBD9B, 0x94CD, 0xBD9D, 0x94CE, 0xBD9E, + 0x94CF, 0xBD9F, 0x94D0, 0xBDA0, 0x94D1, 0xBDA1, 0x94D2, 0xBDA2, 0x94D3, 0xBDA3, 0x94D4, 0xBDA5, 0x94D5, 0xBDA6, 0x94D6, 0xBDA7, + 0x94D7, 0xBDA8, 0x94D8, 0xBDA9, 0x94D9, 0xBDAA, 0x94DA, 0xBDAB, 0x94DB, 0xBDAC, 0x94DC, 0xBDAD, 0x94DD, 0xBDAE, 0x94DE, 0xBDAF, + 0x94DF, 0xBDB1, 0x94E0, 0xBDB2, 0x94E1, 0xBDB3, 0x94E2, 0xBDB4, 0x94E3, 0xBDB5, 0x94E4, 0xBDB6, 0x94E5, 0xBDB7, 0x94E6, 0xBDB9, + 0x94E7, 0xBDBA, 0x94E8, 0xBDBB, 0x94E9, 0xBDBC, 0x94EA, 0xBDBD, 0x94EB, 0xBDBE, 0x94EC, 0xBDBF, 0x94ED, 0xBDC0, 0x94EE, 0xBDC1, + 0x94EF, 0xBDC2, 0x94F0, 0xBDC3, 0x94F1, 0xBDC4, 0x94F2, 0xBDC5, 0x94F3, 0xBDC6, 0x94F4, 0xBDC7, 0x94F5, 0xBDC8, 0x94F6, 0xBDC9, + 0x94F7, 0xBDCA, 0x94F8, 0xBDCB, 0x94F9, 0xBDCC, 0x94FA, 0xBDCD, 0x94FB, 0xBDCE, 0x94FC, 0xBDCF, 0x94FD, 0xBDD0, 0x94FE, 0xBDD1, + 0x9541, 0xBDD2, 0x9542, 0xBDD3, 0x9543, 0xBDD6, 0x9544, 0xBDD7, 0x9545, 0xBDD9, 0x9546, 0xBDDA, 0x9547, 0xBDDB, 0x9548, 0xBDDD, + 0x9549, 0xBDDE, 0x954A, 0xBDDF, 0x954B, 0xBDE0, 0x954C, 0xBDE1, 0x954D, 0xBDE2, 0x954E, 0xBDE3, 0x954F, 0xBDE4, 0x9550, 0xBDE5, + 0x9551, 0xBDE6, 0x9552, 0xBDE7, 0x9553, 0xBDE8, 0x9554, 0xBDEA, 0x9555, 0xBDEB, 0x9556, 0xBDEC, 0x9557, 0xBDED, 0x9558, 0xBDEE, + 0x9559, 0xBDEF, 0x955A, 0xBDF1, 0x9561, 0xBDF2, 0x9562, 0xBDF3, 0x9563, 0xBDF5, 0x9564, 0xBDF6, 0x9565, 0xBDF7, 0x9566, 0xBDF9, + 0x9567, 0xBDFA, 0x9568, 0xBDFB, 0x9569, 0xBDFC, 0x956A, 0xBDFD, 0x956B, 0xBDFE, 0x956C, 0xBDFF, 0x956D, 0xBE01, 0x956E, 0xBE02, + 0x956F, 0xBE04, 0x9570, 0xBE06, 0x9571, 0xBE07, 0x9572, 0xBE08, 0x9573, 0xBE09, 0x9574, 0xBE0A, 0x9575, 0xBE0B, 0x9576, 0xBE0E, + 0x9577, 0xBE0F, 0x9578, 0xBE11, 0x9579, 0xBE12, 0x957A, 0xBE13, 0x9581, 0xBE15, 0x9582, 0xBE16, 0x9583, 0xBE17, 0x9584, 0xBE18, + 0x9585, 0xBE19, 0x9586, 0xBE1A, 0x9587, 0xBE1B, 0x9588, 0xBE1E, 0x9589, 0xBE20, 0x958A, 0xBE21, 0x958B, 0xBE22, 0x958C, 0xBE23, + 0x958D, 0xBE24, 0x958E, 0xBE25, 0x958F, 0xBE26, 0x9590, 0xBE27, 0x9591, 0xBE28, 0x9592, 0xBE29, 0x9593, 0xBE2A, 0x9594, 0xBE2B, + 0x9595, 0xBE2C, 0x9596, 0xBE2D, 0x9597, 0xBE2E, 0x9598, 0xBE2F, 0x9599, 0xBE30, 0x959A, 0xBE31, 0x959B, 0xBE32, 0x959C, 0xBE33, + 0x959D, 0xBE34, 0x959E, 0xBE35, 0x959F, 0xBE36, 0x95A0, 0xBE37, 0x95A1, 0xBE38, 0x95A2, 0xBE39, 0x95A3, 0xBE3A, 0x95A4, 0xBE3B, + 0x95A5, 0xBE3C, 0x95A6, 0xBE3D, 0x95A7, 0xBE3E, 0x95A8, 0xBE3F, 0x95A9, 0xBE40, 0x95AA, 0xBE41, 0x95AB, 0xBE42, 0x95AC, 0xBE43, + 0x95AD, 0xBE46, 0x95AE, 0xBE47, 0x95AF, 0xBE49, 0x95B0, 0xBE4A, 0x95B1, 0xBE4B, 0x95B2, 0xBE4D, 0x95B3, 0xBE4F, 0x95B4, 0xBE50, + 0x95B5, 0xBE51, 0x95B6, 0xBE52, 0x95B7, 0xBE53, 0x95B8, 0xBE56, 0x95B9, 0xBE58, 0x95BA, 0xBE5C, 0x95BB, 0xBE5D, 0x95BC, 0xBE5E, + 0x95BD, 0xBE5F, 0x95BE, 0xBE62, 0x95BF, 0xBE63, 0x95C0, 0xBE65, 0x95C1, 0xBE66, 0x95C2, 0xBE67, 0x95C3, 0xBE69, 0x95C4, 0xBE6B, + 0x95C5, 0xBE6C, 0x95C6, 0xBE6D, 0x95C7, 0xBE6E, 0x95C8, 0xBE6F, 0x95C9, 0xBE72, 0x95CA, 0xBE76, 0x95CB, 0xBE77, 0x95CC, 0xBE78, + 0x95CD, 0xBE79, 0x95CE, 0xBE7A, 0x95CF, 0xBE7E, 0x95D0, 0xBE7F, 0x95D1, 0xBE81, 0x95D2, 0xBE82, 0x95D3, 0xBE83, 0x95D4, 0xBE85, + 0x95D5, 0xBE86, 0x95D6, 0xBE87, 0x95D7, 0xBE88, 0x95D8, 0xBE89, 0x95D9, 0xBE8A, 0x95DA, 0xBE8B, 0x95DB, 0xBE8E, 0x95DC, 0xBE92, + 0x95DD, 0xBE93, 0x95DE, 0xBE94, 0x95DF, 0xBE95, 0x95E0, 0xBE96, 0x95E1, 0xBE97, 0x95E2, 0xBE9A, 0x95E3, 0xBE9B, 0x95E4, 0xBE9C, + 0x95E5, 0xBE9D, 0x95E6, 0xBE9E, 0x95E7, 0xBE9F, 0x95E8, 0xBEA0, 0x95E9, 0xBEA1, 0x95EA, 0xBEA2, 0x95EB, 0xBEA3, 0x95EC, 0xBEA4, + 0x95ED, 0xBEA5, 0x95EE, 0xBEA6, 0x95EF, 0xBEA7, 0x95F0, 0xBEA9, 0x95F1, 0xBEAA, 0x95F2, 0xBEAB, 0x95F3, 0xBEAC, 0x95F4, 0xBEAD, + 0x95F5, 0xBEAE, 0x95F6, 0xBEAF, 0x95F7, 0xBEB0, 0x95F8, 0xBEB1, 0x95F9, 0xBEB2, 0x95FA, 0xBEB3, 0x95FB, 0xBEB4, 0x95FC, 0xBEB5, + 0x95FD, 0xBEB6, 0x95FE, 0xBEB7, 0x9641, 0xBEB8, 0x9642, 0xBEB9, 0x9643, 0xBEBA, 0x9644, 0xBEBB, 0x9645, 0xBEBC, 0x9646, 0xBEBD, + 0x9647, 0xBEBE, 0x9648, 0xBEBF, 0x9649, 0xBEC0, 0x964A, 0xBEC1, 0x964B, 0xBEC2, 0x964C, 0xBEC3, 0x964D, 0xBEC4, 0x964E, 0xBEC5, + 0x964F, 0xBEC6, 0x9650, 0xBEC7, 0x9651, 0xBEC8, 0x9652, 0xBEC9, 0x9653, 0xBECA, 0x9654, 0xBECB, 0x9655, 0xBECC, 0x9656, 0xBECD, + 0x9657, 0xBECE, 0x9658, 0xBECF, 0x9659, 0xBED2, 0x965A, 0xBED3, 0x9661, 0xBED5, 0x9662, 0xBED6, 0x9663, 0xBED9, 0x9664, 0xBEDA, + 0x9665, 0xBEDB, 0x9666, 0xBEDC, 0x9667, 0xBEDD, 0x9668, 0xBEDE, 0x9669, 0xBEDF, 0x966A, 0xBEE1, 0x966B, 0xBEE2, 0x966C, 0xBEE6, + 0x966D, 0xBEE7, 0x966E, 0xBEE8, 0x966F, 0xBEE9, 0x9670, 0xBEEA, 0x9671, 0xBEEB, 0x9672, 0xBEED, 0x9673, 0xBEEE, 0x9674, 0xBEEF, + 0x9675, 0xBEF0, 0x9676, 0xBEF1, 0x9677, 0xBEF2, 0x9678, 0xBEF3, 0x9679, 0xBEF4, 0x967A, 0xBEF5, 0x9681, 0xBEF6, 0x9682, 0xBEF7, + 0x9683, 0xBEF8, 0x9684, 0xBEF9, 0x9685, 0xBEFA, 0x9686, 0xBEFB, 0x9687, 0xBEFC, 0x9688, 0xBEFD, 0x9689, 0xBEFE, 0x968A, 0xBEFF, + 0x968B, 0xBF00, 0x968C, 0xBF02, 0x968D, 0xBF03, 0x968E, 0xBF04, 0x968F, 0xBF05, 0x9690, 0xBF06, 0x9691, 0xBF07, 0x9692, 0xBF0A, + 0x9693, 0xBF0B, 0x9694, 0xBF0C, 0x9695, 0xBF0D, 0x9696, 0xBF0E, 0x9697, 0xBF0F, 0x9698, 0xBF10, 0x9699, 0xBF11, 0x969A, 0xBF12, + 0x969B, 0xBF13, 0x969C, 0xBF14, 0x969D, 0xBF15, 0x969E, 0xBF16, 0x969F, 0xBF17, 0x96A0, 0xBF1A, 0x96A1, 0xBF1E, 0x96A2, 0xBF1F, + 0x96A3, 0xBF20, 0x96A4, 0xBF21, 0x96A5, 0xBF22, 0x96A6, 0xBF23, 0x96A7, 0xBF24, 0x96A8, 0xBF25, 0x96A9, 0xBF26, 0x96AA, 0xBF27, + 0x96AB, 0xBF28, 0x96AC, 0xBF29, 0x96AD, 0xBF2A, 0x96AE, 0xBF2B, 0x96AF, 0xBF2C, 0x96B0, 0xBF2D, 0x96B1, 0xBF2E, 0x96B2, 0xBF2F, + 0x96B3, 0xBF30, 0x96B4, 0xBF31, 0x96B5, 0xBF32, 0x96B6, 0xBF33, 0x96B7, 0xBF34, 0x96B8, 0xBF35, 0x96B9, 0xBF36, 0x96BA, 0xBF37, + 0x96BB, 0xBF38, 0x96BC, 0xBF39, 0x96BD, 0xBF3A, 0x96BE, 0xBF3B, 0x96BF, 0xBF3C, 0x96C0, 0xBF3D, 0x96C1, 0xBF3E, 0x96C2, 0xBF3F, + 0x96C3, 0xBF42, 0x96C4, 0xBF43, 0x96C5, 0xBF45, 0x96C6, 0xBF46, 0x96C7, 0xBF47, 0x96C8, 0xBF49, 0x96C9, 0xBF4A, 0x96CA, 0xBF4B, + 0x96CB, 0xBF4C, 0x96CC, 0xBF4D, 0x96CD, 0xBF4E, 0x96CE, 0xBF4F, 0x96CF, 0xBF52, 0x96D0, 0xBF53, 0x96D1, 0xBF54, 0x96D2, 0xBF56, + 0x96D3, 0xBF57, 0x96D4, 0xBF58, 0x96D5, 0xBF59, 0x96D6, 0xBF5A, 0x96D7, 0xBF5B, 0x96D8, 0xBF5C, 0x96D9, 0xBF5D, 0x96DA, 0xBF5E, + 0x96DB, 0xBF5F, 0x96DC, 0xBF60, 0x96DD, 0xBF61, 0x96DE, 0xBF62, 0x96DF, 0xBF63, 0x96E0, 0xBF64, 0x96E1, 0xBF65, 0x96E2, 0xBF66, + 0x96E3, 0xBF67, 0x96E4, 0xBF68, 0x96E5, 0xBF69, 0x96E6, 0xBF6A, 0x96E7, 0xBF6B, 0x96E8, 0xBF6C, 0x96E9, 0xBF6D, 0x96EA, 0xBF6E, + 0x96EB, 0xBF6F, 0x96EC, 0xBF70, 0x96ED, 0xBF71, 0x96EE, 0xBF72, 0x96EF, 0xBF73, 0x96F0, 0xBF74, 0x96F1, 0xBF75, 0x96F2, 0xBF76, + 0x96F3, 0xBF77, 0x96F4, 0xBF78, 0x96F5, 0xBF79, 0x96F6, 0xBF7A, 0x96F7, 0xBF7B, 0x96F8, 0xBF7C, 0x96F9, 0xBF7D, 0x96FA, 0xBF7E, + 0x96FB, 0xBF7F, 0x96FC, 0xBF80, 0x96FD, 0xBF81, 0x96FE, 0xBF82, 0x9741, 0xBF83, 0x9742, 0xBF84, 0x9743, 0xBF85, 0x9744, 0xBF86, + 0x9745, 0xBF87, 0x9746, 0xBF88, 0x9747, 0xBF89, 0x9748, 0xBF8A, 0x9749, 0xBF8B, 0x974A, 0xBF8C, 0x974B, 0xBF8D, 0x974C, 0xBF8E, + 0x974D, 0xBF8F, 0x974E, 0xBF90, 0x974F, 0xBF91, 0x9750, 0xBF92, 0x9751, 0xBF93, 0x9752, 0xBF95, 0x9753, 0xBF96, 0x9754, 0xBF97, + 0x9755, 0xBF98, 0x9756, 0xBF99, 0x9757, 0xBF9A, 0x9758, 0xBF9B, 0x9759, 0xBF9C, 0x975A, 0xBF9D, 0x9761, 0xBF9E, 0x9762, 0xBF9F, + 0x9763, 0xBFA0, 0x9764, 0xBFA1, 0x9765, 0xBFA2, 0x9766, 0xBFA3, 0x9767, 0xBFA4, 0x9768, 0xBFA5, 0x9769, 0xBFA6, 0x976A, 0xBFA7, + 0x976B, 0xBFA8, 0x976C, 0xBFA9, 0x976D, 0xBFAA, 0x976E, 0xBFAB, 0x976F, 0xBFAC, 0x9770, 0xBFAD, 0x9771, 0xBFAE, 0x9772, 0xBFAF, + 0x9773, 0xBFB1, 0x9774, 0xBFB2, 0x9775, 0xBFB3, 0x9776, 0xBFB4, 0x9777, 0xBFB5, 0x9778, 0xBFB6, 0x9779, 0xBFB7, 0x977A, 0xBFB8, + 0x9781, 0xBFB9, 0x9782, 0xBFBA, 0x9783, 0xBFBB, 0x9784, 0xBFBC, 0x9785, 0xBFBD, 0x9786, 0xBFBE, 0x9787, 0xBFBF, 0x9788, 0xBFC0, + 0x9789, 0xBFC1, 0x978A, 0xBFC2, 0x978B, 0xBFC3, 0x978C, 0xBFC4, 0x978D, 0xBFC6, 0x978E, 0xBFC7, 0x978F, 0xBFC8, 0x9790, 0xBFC9, + 0x9791, 0xBFCA, 0x9792, 0xBFCB, 0x9793, 0xBFCE, 0x9794, 0xBFCF, 0x9795, 0xBFD1, 0x9796, 0xBFD2, 0x9797, 0xBFD3, 0x9798, 0xBFD5, + 0x9799, 0xBFD6, 0x979A, 0xBFD7, 0x979B, 0xBFD8, 0x979C, 0xBFD9, 0x979D, 0xBFDA, 0x979E, 0xBFDB, 0x979F, 0xBFDD, 0x97A0, 0xBFDE, + 0x97A1, 0xBFE0, 0x97A2, 0xBFE2, 0x97A3, 0xBFE3, 0x97A4, 0xBFE4, 0x97A5, 0xBFE5, 0x97A6, 0xBFE6, 0x97A7, 0xBFE7, 0x97A8, 0xBFE8, + 0x97A9, 0xBFE9, 0x97AA, 0xBFEA, 0x97AB, 0xBFEB, 0x97AC, 0xBFEC, 0x97AD, 0xBFED, 0x97AE, 0xBFEE, 0x97AF, 0xBFEF, 0x97B0, 0xBFF0, + 0x97B1, 0xBFF1, 0x97B2, 0xBFF2, 0x97B3, 0xBFF3, 0x97B4, 0xBFF4, 0x97B5, 0xBFF5, 0x97B6, 0xBFF6, 0x97B7, 0xBFF7, 0x97B8, 0xBFF8, + 0x97B9, 0xBFF9, 0x97BA, 0xBFFA, 0x97BB, 0xBFFB, 0x97BC, 0xBFFC, 0x97BD, 0xBFFD, 0x97BE, 0xBFFE, 0x97BF, 0xBFFF, 0x97C0, 0xC000, + 0x97C1, 0xC001, 0x97C2, 0xC002, 0x97C3, 0xC003, 0x97C4, 0xC004, 0x97C5, 0xC005, 0x97C6, 0xC006, 0x97C7, 0xC007, 0x97C8, 0xC008, + 0x97C9, 0xC009, 0x97CA, 0xC00A, 0x97CB, 0xC00B, 0x97CC, 0xC00C, 0x97CD, 0xC00D, 0x97CE, 0xC00E, 0x97CF, 0xC00F, 0x97D0, 0xC010, + 0x97D1, 0xC011, 0x97D2, 0xC012, 0x97D3, 0xC013, 0x97D4, 0xC014, 0x97D5, 0xC015, 0x97D6, 0xC016, 0x97D7, 0xC017, 0x97D8, 0xC018, + 0x97D9, 0xC019, 0x97DA, 0xC01A, 0x97DB, 0xC01B, 0x97DC, 0xC01C, 0x97DD, 0xC01D, 0x97DE, 0xC01E, 0x97DF, 0xC01F, 0x97E0, 0xC020, + 0x97E1, 0xC021, 0x97E2, 0xC022, 0x97E3, 0xC023, 0x97E4, 0xC024, 0x97E5, 0xC025, 0x97E6, 0xC026, 0x97E7, 0xC027, 0x97E8, 0xC028, + 0x97E9, 0xC029, 0x97EA, 0xC02A, 0x97EB, 0xC02B, 0x97EC, 0xC02C, 0x97ED, 0xC02D, 0x97EE, 0xC02E, 0x97EF, 0xC02F, 0x97F0, 0xC030, + 0x97F1, 0xC031, 0x97F2, 0xC032, 0x97F3, 0xC033, 0x97F4, 0xC034, 0x97F5, 0xC035, 0x97F6, 0xC036, 0x97F7, 0xC037, 0x97F8, 0xC038, + 0x97F9, 0xC039, 0x97FA, 0xC03A, 0x97FB, 0xC03B, 0x97FC, 0xC03D, 0x97FD, 0xC03E, 0x97FE, 0xC03F, 0x9841, 0xC040, 0x9842, 0xC041, + 0x9843, 0xC042, 0x9844, 0xC043, 0x9845, 0xC044, 0x9846, 0xC045, 0x9847, 0xC046, 0x9848, 0xC047, 0x9849, 0xC048, 0x984A, 0xC049, + 0x984B, 0xC04A, 0x984C, 0xC04B, 0x984D, 0xC04C, 0x984E, 0xC04D, 0x984F, 0xC04E, 0x9850, 0xC04F, 0x9851, 0xC050, 0x9852, 0xC052, + 0x9853, 0xC053, 0x9854, 0xC054, 0x9855, 0xC055, 0x9856, 0xC056, 0x9857, 0xC057, 0x9858, 0xC059, 0x9859, 0xC05A, 0x985A, 0xC05B, + 0x9861, 0xC05D, 0x9862, 0xC05E, 0x9863, 0xC05F, 0x9864, 0xC061, 0x9865, 0xC062, 0x9866, 0xC063, 0x9867, 0xC064, 0x9868, 0xC065, + 0x9869, 0xC066, 0x986A, 0xC067, 0x986B, 0xC06A, 0x986C, 0xC06B, 0x986D, 0xC06C, 0x986E, 0xC06D, 0x986F, 0xC06E, 0x9870, 0xC06F, + 0x9871, 0xC070, 0x9872, 0xC071, 0x9873, 0xC072, 0x9874, 0xC073, 0x9875, 0xC074, 0x9876, 0xC075, 0x9877, 0xC076, 0x9878, 0xC077, + 0x9879, 0xC078, 0x987A, 0xC079, 0x9881, 0xC07A, 0x9882, 0xC07B, 0x9883, 0xC07C, 0x9884, 0xC07D, 0x9885, 0xC07E, 0x9886, 0xC07F, + 0x9887, 0xC080, 0x9888, 0xC081, 0x9889, 0xC082, 0x988A, 0xC083, 0x988B, 0xC084, 0x988C, 0xC085, 0x988D, 0xC086, 0x988E, 0xC087, + 0x988F, 0xC088, 0x9890, 0xC089, 0x9891, 0xC08A, 0x9892, 0xC08B, 0x9893, 0xC08C, 0x9894, 0xC08D, 0x9895, 0xC08E, 0x9896, 0xC08F, + 0x9897, 0xC092, 0x9898, 0xC093, 0x9899, 0xC095, 0x989A, 0xC096, 0x989B, 0xC097, 0x989C, 0xC099, 0x989D, 0xC09A, 0x989E, 0xC09B, + 0x989F, 0xC09C, 0x98A0, 0xC09D, 0x98A1, 0xC09E, 0x98A2, 0xC09F, 0x98A3, 0xC0A2, 0x98A4, 0xC0A4, 0x98A5, 0xC0A6, 0x98A6, 0xC0A7, + 0x98A7, 0xC0A8, 0x98A8, 0xC0A9, 0x98A9, 0xC0AA, 0x98AA, 0xC0AB, 0x98AB, 0xC0AE, 0x98AC, 0xC0B1, 0x98AD, 0xC0B2, 0x98AE, 0xC0B7, + 0x98AF, 0xC0B8, 0x98B0, 0xC0B9, 0x98B1, 0xC0BA, 0x98B2, 0xC0BB, 0x98B3, 0xC0BE, 0x98B4, 0xC0C2, 0x98B5, 0xC0C3, 0x98B6, 0xC0C4, + 0x98B7, 0xC0C6, 0x98B8, 0xC0C7, 0x98B9, 0xC0CA, 0x98BA, 0xC0CB, 0x98BB, 0xC0CD, 0x98BC, 0xC0CE, 0x98BD, 0xC0CF, 0x98BE, 0xC0D1, + 0x98BF, 0xC0D2, 0x98C0, 0xC0D3, 0x98C1, 0xC0D4, 0x98C2, 0xC0D5, 0x98C3, 0xC0D6, 0x98C4, 0xC0D7, 0x98C5, 0xC0DA, 0x98C6, 0xC0DE, + 0x98C7, 0xC0DF, 0x98C8, 0xC0E0, 0x98C9, 0xC0E1, 0x98CA, 0xC0E2, 0x98CB, 0xC0E3, 0x98CC, 0xC0E6, 0x98CD, 0xC0E7, 0x98CE, 0xC0E9, + 0x98CF, 0xC0EA, 0x98D0, 0xC0EB, 0x98D1, 0xC0ED, 0x98D2, 0xC0EE, 0x98D3, 0xC0EF, 0x98D4, 0xC0F0, 0x98D5, 0xC0F1, 0x98D6, 0xC0F2, + 0x98D7, 0xC0F3, 0x98D8, 0xC0F6, 0x98D9, 0xC0F8, 0x98DA, 0xC0FA, 0x98DB, 0xC0FB, 0x98DC, 0xC0FC, 0x98DD, 0xC0FD, 0x98DE, 0xC0FE, + 0x98DF, 0xC0FF, 0x98E0, 0xC101, 0x98E1, 0xC102, 0x98E2, 0xC103, 0x98E3, 0xC105, 0x98E4, 0xC106, 0x98E5, 0xC107, 0x98E6, 0xC109, + 0x98E7, 0xC10A, 0x98E8, 0xC10B, 0x98E9, 0xC10C, 0x98EA, 0xC10D, 0x98EB, 0xC10E, 0x98EC, 0xC10F, 0x98ED, 0xC111, 0x98EE, 0xC112, + 0x98EF, 0xC113, 0x98F0, 0xC114, 0x98F1, 0xC116, 0x98F2, 0xC117, 0x98F3, 0xC118, 0x98F4, 0xC119, 0x98F5, 0xC11A, 0x98F6, 0xC11B, + 0x98F7, 0xC121, 0x98F8, 0xC122, 0x98F9, 0xC125, 0x98FA, 0xC128, 0x98FB, 0xC129, 0x98FC, 0xC12A, 0x98FD, 0xC12B, 0x98FE, 0xC12E, + 0x9941, 0xC132, 0x9942, 0xC133, 0x9943, 0xC134, 0x9944, 0xC135, 0x9945, 0xC137, 0x9946, 0xC13A, 0x9947, 0xC13B, 0x9948, 0xC13D, + 0x9949, 0xC13E, 0x994A, 0xC13F, 0x994B, 0xC141, 0x994C, 0xC142, 0x994D, 0xC143, 0x994E, 0xC144, 0x994F, 0xC145, 0x9950, 0xC146, + 0x9951, 0xC147, 0x9952, 0xC14A, 0x9953, 0xC14E, 0x9954, 0xC14F, 0x9955, 0xC150, 0x9956, 0xC151, 0x9957, 0xC152, 0x9958, 0xC153, + 0x9959, 0xC156, 0x995A, 0xC157, 0x9961, 0xC159, 0x9962, 0xC15A, 0x9963, 0xC15B, 0x9964, 0xC15D, 0x9965, 0xC15E, 0x9966, 0xC15F, + 0x9967, 0xC160, 0x9968, 0xC161, 0x9969, 0xC162, 0x996A, 0xC163, 0x996B, 0xC166, 0x996C, 0xC16A, 0x996D, 0xC16B, 0x996E, 0xC16C, + 0x996F, 0xC16D, 0x9970, 0xC16E, 0x9971, 0xC16F, 0x9972, 0xC171, 0x9973, 0xC172, 0x9974, 0xC173, 0x9975, 0xC175, 0x9976, 0xC176, + 0x9977, 0xC177, 0x9978, 0xC179, 0x9979, 0xC17A, 0x997A, 0xC17B, 0x9981, 0xC17C, 0x9982, 0xC17D, 0x9983, 0xC17E, 0x9984, 0xC17F, + 0x9985, 0xC180, 0x9986, 0xC181, 0x9987, 0xC182, 0x9988, 0xC183, 0x9989, 0xC184, 0x998A, 0xC186, 0x998B, 0xC187, 0x998C, 0xC188, + 0x998D, 0xC189, 0x998E, 0xC18A, 0x998F, 0xC18B, 0x9990, 0xC18F, 0x9991, 0xC191, 0x9992, 0xC192, 0x9993, 0xC193, 0x9994, 0xC195, + 0x9995, 0xC197, 0x9996, 0xC198, 0x9997, 0xC199, 0x9998, 0xC19A, 0x9999, 0xC19B, 0x999A, 0xC19E, 0x999B, 0xC1A0, 0x999C, 0xC1A2, + 0x999D, 0xC1A3, 0x999E, 0xC1A4, 0x999F, 0xC1A6, 0x99A0, 0xC1A7, 0x99A1, 0xC1AA, 0x99A2, 0xC1AB, 0x99A3, 0xC1AD, 0x99A4, 0xC1AE, + 0x99A5, 0xC1AF, 0x99A6, 0xC1B1, 0x99A7, 0xC1B2, 0x99A8, 0xC1B3, 0x99A9, 0xC1B4, 0x99AA, 0xC1B5, 0x99AB, 0xC1B6, 0x99AC, 0xC1B7, + 0x99AD, 0xC1B8, 0x99AE, 0xC1B9, 0x99AF, 0xC1BA, 0x99B0, 0xC1BB, 0x99B1, 0xC1BC, 0x99B2, 0xC1BE, 0x99B3, 0xC1BF, 0x99B4, 0xC1C0, + 0x99B5, 0xC1C1, 0x99B6, 0xC1C2, 0x99B7, 0xC1C3, 0x99B8, 0xC1C5, 0x99B9, 0xC1C6, 0x99BA, 0xC1C7, 0x99BB, 0xC1C9, 0x99BC, 0xC1CA, + 0x99BD, 0xC1CB, 0x99BE, 0xC1CD, 0x99BF, 0xC1CE, 0x99C0, 0xC1CF, 0x99C1, 0xC1D0, 0x99C2, 0xC1D1, 0x99C3, 0xC1D2, 0x99C4, 0xC1D3, + 0x99C5, 0xC1D5, 0x99C6, 0xC1D6, 0x99C7, 0xC1D9, 0x99C8, 0xC1DA, 0x99C9, 0xC1DB, 0x99CA, 0xC1DC, 0x99CB, 0xC1DD, 0x99CC, 0xC1DE, + 0x99CD, 0xC1DF, 0x99CE, 0xC1E1, 0x99CF, 0xC1E2, 0x99D0, 0xC1E3, 0x99D1, 0xC1E5, 0x99D2, 0xC1E6, 0x99D3, 0xC1E7, 0x99D4, 0xC1E9, + 0x99D5, 0xC1EA, 0x99D6, 0xC1EB, 0x99D7, 0xC1EC, 0x99D8, 0xC1ED, 0x99D9, 0xC1EE, 0x99DA, 0xC1EF, 0x99DB, 0xC1F2, 0x99DC, 0xC1F4, + 0x99DD, 0xC1F5, 0x99DE, 0xC1F6, 0x99DF, 0xC1F7, 0x99E0, 0xC1F8, 0x99E1, 0xC1F9, 0x99E2, 0xC1FA, 0x99E3, 0xC1FB, 0x99E4, 0xC1FE, + 0x99E5, 0xC1FF, 0x99E6, 0xC201, 0x99E7, 0xC202, 0x99E8, 0xC203, 0x99E9, 0xC205, 0x99EA, 0xC206, 0x99EB, 0xC207, 0x99EC, 0xC208, + 0x99ED, 0xC209, 0x99EE, 0xC20A, 0x99EF, 0xC20B, 0x99F0, 0xC20E, 0x99F1, 0xC210, 0x99F2, 0xC212, 0x99F3, 0xC213, 0x99F4, 0xC214, + 0x99F5, 0xC215, 0x99F6, 0xC216, 0x99F7, 0xC217, 0x99F8, 0xC21A, 0x99F9, 0xC21B, 0x99FA, 0xC21D, 0x99FB, 0xC21E, 0x99FC, 0xC221, + 0x99FD, 0xC222, 0x99FE, 0xC223, 0x9A41, 0xC224, 0x9A42, 0xC225, 0x9A43, 0xC226, 0x9A44, 0xC227, 0x9A45, 0xC22A, 0x9A46, 0xC22C, + 0x9A47, 0xC22E, 0x9A48, 0xC230, 0x9A49, 0xC233, 0x9A4A, 0xC235, 0x9A4B, 0xC236, 0x9A4C, 0xC237, 0x9A4D, 0xC238, 0x9A4E, 0xC239, + 0x9A4F, 0xC23A, 0x9A50, 0xC23B, 0x9A51, 0xC23C, 0x9A52, 0xC23D, 0x9A53, 0xC23E, 0x9A54, 0xC23F, 0x9A55, 0xC240, 0x9A56, 0xC241, + 0x9A57, 0xC242, 0x9A58, 0xC243, 0x9A59, 0xC244, 0x9A5A, 0xC245, 0x9A61, 0xC246, 0x9A62, 0xC247, 0x9A63, 0xC249, 0x9A64, 0xC24A, + 0x9A65, 0xC24B, 0x9A66, 0xC24C, 0x9A67, 0xC24D, 0x9A68, 0xC24E, 0x9A69, 0xC24F, 0x9A6A, 0xC252, 0x9A6B, 0xC253, 0x9A6C, 0xC255, + 0x9A6D, 0xC256, 0x9A6E, 0xC257, 0x9A6F, 0xC259, 0x9A70, 0xC25A, 0x9A71, 0xC25B, 0x9A72, 0xC25C, 0x9A73, 0xC25D, 0x9A74, 0xC25E, + 0x9A75, 0xC25F, 0x9A76, 0xC261, 0x9A77, 0xC262, 0x9A78, 0xC263, 0x9A79, 0xC264, 0x9A7A, 0xC266, 0x9A81, 0xC267, 0x9A82, 0xC268, + 0x9A83, 0xC269, 0x9A84, 0xC26A, 0x9A85, 0xC26B, 0x9A86, 0xC26E, 0x9A87, 0xC26F, 0x9A88, 0xC271, 0x9A89, 0xC272, 0x9A8A, 0xC273, + 0x9A8B, 0xC275, 0x9A8C, 0xC276, 0x9A8D, 0xC277, 0x9A8E, 0xC278, 0x9A8F, 0xC279, 0x9A90, 0xC27A, 0x9A91, 0xC27B, 0x9A92, 0xC27E, + 0x9A93, 0xC280, 0x9A94, 0xC282, 0x9A95, 0xC283, 0x9A96, 0xC284, 0x9A97, 0xC285, 0x9A98, 0xC286, 0x9A99, 0xC287, 0x9A9A, 0xC28A, + 0x9A9B, 0xC28B, 0x9A9C, 0xC28C, 0x9A9D, 0xC28D, 0x9A9E, 0xC28E, 0x9A9F, 0xC28F, 0x9AA0, 0xC291, 0x9AA1, 0xC292, 0x9AA2, 0xC293, + 0x9AA3, 0xC294, 0x9AA4, 0xC295, 0x9AA5, 0xC296, 0x9AA6, 0xC297, 0x9AA7, 0xC299, 0x9AA8, 0xC29A, 0x9AA9, 0xC29C, 0x9AAA, 0xC29E, + 0x9AAB, 0xC29F, 0x9AAC, 0xC2A0, 0x9AAD, 0xC2A1, 0x9AAE, 0xC2A2, 0x9AAF, 0xC2A3, 0x9AB0, 0xC2A6, 0x9AB1, 0xC2A7, 0x9AB2, 0xC2A9, + 0x9AB3, 0xC2AA, 0x9AB4, 0xC2AB, 0x9AB5, 0xC2AE, 0x9AB6, 0xC2AF, 0x9AB7, 0xC2B0, 0x9AB8, 0xC2B1, 0x9AB9, 0xC2B2, 0x9ABA, 0xC2B3, + 0x9ABB, 0xC2B6, 0x9ABC, 0xC2B8, 0x9ABD, 0xC2BA, 0x9ABE, 0xC2BB, 0x9ABF, 0xC2BC, 0x9AC0, 0xC2BD, 0x9AC1, 0xC2BE, 0x9AC2, 0xC2BF, + 0x9AC3, 0xC2C0, 0x9AC4, 0xC2C1, 0x9AC5, 0xC2C2, 0x9AC6, 0xC2C3, 0x9AC7, 0xC2C4, 0x9AC8, 0xC2C5, 0x9AC9, 0xC2C6, 0x9ACA, 0xC2C7, + 0x9ACB, 0xC2C8, 0x9ACC, 0xC2C9, 0x9ACD, 0xC2CA, 0x9ACE, 0xC2CB, 0x9ACF, 0xC2CC, 0x9AD0, 0xC2CD, 0x9AD1, 0xC2CE, 0x9AD2, 0xC2CF, + 0x9AD3, 0xC2D0, 0x9AD4, 0xC2D1, 0x9AD5, 0xC2D2, 0x9AD6, 0xC2D3, 0x9AD7, 0xC2D4, 0x9AD8, 0xC2D5, 0x9AD9, 0xC2D6, 0x9ADA, 0xC2D7, + 0x9ADB, 0xC2D8, 0x9ADC, 0xC2D9, 0x9ADD, 0xC2DA, 0x9ADE, 0xC2DB, 0x9ADF, 0xC2DE, 0x9AE0, 0xC2DF, 0x9AE1, 0xC2E1, 0x9AE2, 0xC2E2, + 0x9AE3, 0xC2E5, 0x9AE4, 0xC2E6, 0x9AE5, 0xC2E7, 0x9AE6, 0xC2E8, 0x9AE7, 0xC2E9, 0x9AE8, 0xC2EA, 0x9AE9, 0xC2EE, 0x9AEA, 0xC2F0, + 0x9AEB, 0xC2F2, 0x9AEC, 0xC2F3, 0x9AED, 0xC2F4, 0x9AEE, 0xC2F5, 0x9AEF, 0xC2F7, 0x9AF0, 0xC2FA, 0x9AF1, 0xC2FD, 0x9AF2, 0xC2FE, + 0x9AF3, 0xC2FF, 0x9AF4, 0xC301, 0x9AF5, 0xC302, 0x9AF6, 0xC303, 0x9AF7, 0xC304, 0x9AF8, 0xC305, 0x9AF9, 0xC306, 0x9AFA, 0xC307, + 0x9AFB, 0xC30A, 0x9AFC, 0xC30B, 0x9AFD, 0xC30E, 0x9AFE, 0xC30F, 0x9B41, 0xC310, 0x9B42, 0xC311, 0x9B43, 0xC312, 0x9B44, 0xC316, + 0x9B45, 0xC317, 0x9B46, 0xC319, 0x9B47, 0xC31A, 0x9B48, 0xC31B, 0x9B49, 0xC31D, 0x9B4A, 0xC31E, 0x9B4B, 0xC31F, 0x9B4C, 0xC320, + 0x9B4D, 0xC321, 0x9B4E, 0xC322, 0x9B4F, 0xC323, 0x9B50, 0xC326, 0x9B51, 0xC327, 0x9B52, 0xC32A, 0x9B53, 0xC32B, 0x9B54, 0xC32C, + 0x9B55, 0xC32D, 0x9B56, 0xC32E, 0x9B57, 0xC32F, 0x9B58, 0xC330, 0x9B59, 0xC331, 0x9B5A, 0xC332, 0x9B61, 0xC333, 0x9B62, 0xC334, + 0x9B63, 0xC335, 0x9B64, 0xC336, 0x9B65, 0xC337, 0x9B66, 0xC338, 0x9B67, 0xC339, 0x9B68, 0xC33A, 0x9B69, 0xC33B, 0x9B6A, 0xC33C, + 0x9B6B, 0xC33D, 0x9B6C, 0xC33E, 0x9B6D, 0xC33F, 0x9B6E, 0xC340, 0x9B6F, 0xC341, 0x9B70, 0xC342, 0x9B71, 0xC343, 0x9B72, 0xC344, + 0x9B73, 0xC346, 0x9B74, 0xC347, 0x9B75, 0xC348, 0x9B76, 0xC349, 0x9B77, 0xC34A, 0x9B78, 0xC34B, 0x9B79, 0xC34C, 0x9B7A, 0xC34D, + 0x9B81, 0xC34E, 0x9B82, 0xC34F, 0x9B83, 0xC350, 0x9B84, 0xC351, 0x9B85, 0xC352, 0x9B86, 0xC353, 0x9B87, 0xC354, 0x9B88, 0xC355, + 0x9B89, 0xC356, 0x9B8A, 0xC357, 0x9B8B, 0xC358, 0x9B8C, 0xC359, 0x9B8D, 0xC35A, 0x9B8E, 0xC35B, 0x9B8F, 0xC35C, 0x9B90, 0xC35D, + 0x9B91, 0xC35E, 0x9B92, 0xC35F, 0x9B93, 0xC360, 0x9B94, 0xC361, 0x9B95, 0xC362, 0x9B96, 0xC363, 0x9B97, 0xC364, 0x9B98, 0xC365, + 0x9B99, 0xC366, 0x9B9A, 0xC367, 0x9B9B, 0xC36A, 0x9B9C, 0xC36B, 0x9B9D, 0xC36D, 0x9B9E, 0xC36E, 0x9B9F, 0xC36F, 0x9BA0, 0xC371, + 0x9BA1, 0xC373, 0x9BA2, 0xC374, 0x9BA3, 0xC375, 0x9BA4, 0xC376, 0x9BA5, 0xC377, 0x9BA6, 0xC37A, 0x9BA7, 0xC37B, 0x9BA8, 0xC37E, + 0x9BA9, 0xC37F, 0x9BAA, 0xC380, 0x9BAB, 0xC381, 0x9BAC, 0xC382, 0x9BAD, 0xC383, 0x9BAE, 0xC385, 0x9BAF, 0xC386, 0x9BB0, 0xC387, + 0x9BB1, 0xC389, 0x9BB2, 0xC38A, 0x9BB3, 0xC38B, 0x9BB4, 0xC38D, 0x9BB5, 0xC38E, 0x9BB6, 0xC38F, 0x9BB7, 0xC390, 0x9BB8, 0xC391, + 0x9BB9, 0xC392, 0x9BBA, 0xC393, 0x9BBB, 0xC394, 0x9BBC, 0xC395, 0x9BBD, 0xC396, 0x9BBE, 0xC397, 0x9BBF, 0xC398, 0x9BC0, 0xC399, + 0x9BC1, 0xC39A, 0x9BC2, 0xC39B, 0x9BC3, 0xC39C, 0x9BC4, 0xC39D, 0x9BC5, 0xC39E, 0x9BC6, 0xC39F, 0x9BC7, 0xC3A0, 0x9BC8, 0xC3A1, + 0x9BC9, 0xC3A2, 0x9BCA, 0xC3A3, 0x9BCB, 0xC3A4, 0x9BCC, 0xC3A5, 0x9BCD, 0xC3A6, 0x9BCE, 0xC3A7, 0x9BCF, 0xC3A8, 0x9BD0, 0xC3A9, + 0x9BD1, 0xC3AA, 0x9BD2, 0xC3AB, 0x9BD3, 0xC3AC, 0x9BD4, 0xC3AD, 0x9BD5, 0xC3AE, 0x9BD6, 0xC3AF, 0x9BD7, 0xC3B0, 0x9BD8, 0xC3B1, + 0x9BD9, 0xC3B2, 0x9BDA, 0xC3B3, 0x9BDB, 0xC3B4, 0x9BDC, 0xC3B5, 0x9BDD, 0xC3B6, 0x9BDE, 0xC3B7, 0x9BDF, 0xC3B8, 0x9BE0, 0xC3B9, + 0x9BE1, 0xC3BA, 0x9BE2, 0xC3BB, 0x9BE3, 0xC3BC, 0x9BE4, 0xC3BD, 0x9BE5, 0xC3BE, 0x9BE6, 0xC3BF, 0x9BE7, 0xC3C1, 0x9BE8, 0xC3C2, + 0x9BE9, 0xC3C3, 0x9BEA, 0xC3C4, 0x9BEB, 0xC3C5, 0x9BEC, 0xC3C6, 0x9BED, 0xC3C7, 0x9BEE, 0xC3C8, 0x9BEF, 0xC3C9, 0x9BF0, 0xC3CA, + 0x9BF1, 0xC3CB, 0x9BF2, 0xC3CC, 0x9BF3, 0xC3CD, 0x9BF4, 0xC3CE, 0x9BF5, 0xC3CF, 0x9BF6, 0xC3D0, 0x9BF7, 0xC3D1, 0x9BF8, 0xC3D2, + 0x9BF9, 0xC3D3, 0x9BFA, 0xC3D4, 0x9BFB, 0xC3D5, 0x9BFC, 0xC3D6, 0x9BFD, 0xC3D7, 0x9BFE, 0xC3DA, 0x9C41, 0xC3DB, 0x9C42, 0xC3DD, + 0x9C43, 0xC3DE, 0x9C44, 0xC3E1, 0x9C45, 0xC3E3, 0x9C46, 0xC3E4, 0x9C47, 0xC3E5, 0x9C48, 0xC3E6, 0x9C49, 0xC3E7, 0x9C4A, 0xC3EA, + 0x9C4B, 0xC3EB, 0x9C4C, 0xC3EC, 0x9C4D, 0xC3EE, 0x9C4E, 0xC3EF, 0x9C4F, 0xC3F0, 0x9C50, 0xC3F1, 0x9C51, 0xC3F2, 0x9C52, 0xC3F3, + 0x9C53, 0xC3F6, 0x9C54, 0xC3F7, 0x9C55, 0xC3F9, 0x9C56, 0xC3FA, 0x9C57, 0xC3FB, 0x9C58, 0xC3FC, 0x9C59, 0xC3FD, 0x9C5A, 0xC3FE, + 0x9C61, 0xC3FF, 0x9C62, 0xC400, 0x9C63, 0xC401, 0x9C64, 0xC402, 0x9C65, 0xC403, 0x9C66, 0xC404, 0x9C67, 0xC405, 0x9C68, 0xC406, + 0x9C69, 0xC407, 0x9C6A, 0xC409, 0x9C6B, 0xC40A, 0x9C6C, 0xC40B, 0x9C6D, 0xC40C, 0x9C6E, 0xC40D, 0x9C6F, 0xC40E, 0x9C70, 0xC40F, + 0x9C71, 0xC411, 0x9C72, 0xC412, 0x9C73, 0xC413, 0x9C74, 0xC414, 0x9C75, 0xC415, 0x9C76, 0xC416, 0x9C77, 0xC417, 0x9C78, 0xC418, + 0x9C79, 0xC419, 0x9C7A, 0xC41A, 0x9C81, 0xC41B, 0x9C82, 0xC41C, 0x9C83, 0xC41D, 0x9C84, 0xC41E, 0x9C85, 0xC41F, 0x9C86, 0xC420, + 0x9C87, 0xC421, 0x9C88, 0xC422, 0x9C89, 0xC423, 0x9C8A, 0xC425, 0x9C8B, 0xC426, 0x9C8C, 0xC427, 0x9C8D, 0xC428, 0x9C8E, 0xC429, + 0x9C8F, 0xC42A, 0x9C90, 0xC42B, 0x9C91, 0xC42D, 0x9C92, 0xC42E, 0x9C93, 0xC42F, 0x9C94, 0xC431, 0x9C95, 0xC432, 0x9C96, 0xC433, + 0x9C97, 0xC435, 0x9C98, 0xC436, 0x9C99, 0xC437, 0x9C9A, 0xC438, 0x9C9B, 0xC439, 0x9C9C, 0xC43A, 0x9C9D, 0xC43B, 0x9C9E, 0xC43E, + 0x9C9F, 0xC43F, 0x9CA0, 0xC440, 0x9CA1, 0xC441, 0x9CA2, 0xC442, 0x9CA3, 0xC443, 0x9CA4, 0xC444, 0x9CA5, 0xC445, 0x9CA6, 0xC446, + 0x9CA7, 0xC447, 0x9CA8, 0xC449, 0x9CA9, 0xC44A, 0x9CAA, 0xC44B, 0x9CAB, 0xC44C, 0x9CAC, 0xC44D, 0x9CAD, 0xC44E, 0x9CAE, 0xC44F, + 0x9CAF, 0xC450, 0x9CB0, 0xC451, 0x9CB1, 0xC452, 0x9CB2, 0xC453, 0x9CB3, 0xC454, 0x9CB4, 0xC455, 0x9CB5, 0xC456, 0x9CB6, 0xC457, + 0x9CB7, 0xC458, 0x9CB8, 0xC459, 0x9CB9, 0xC45A, 0x9CBA, 0xC45B, 0x9CBB, 0xC45C, 0x9CBC, 0xC45D, 0x9CBD, 0xC45E, 0x9CBE, 0xC45F, + 0x9CBF, 0xC460, 0x9CC0, 0xC461, 0x9CC1, 0xC462, 0x9CC2, 0xC463, 0x9CC3, 0xC466, 0x9CC4, 0xC467, 0x9CC5, 0xC469, 0x9CC6, 0xC46A, + 0x9CC7, 0xC46B, 0x9CC8, 0xC46D, 0x9CC9, 0xC46E, 0x9CCA, 0xC46F, 0x9CCB, 0xC470, 0x9CCC, 0xC471, 0x9CCD, 0xC472, 0x9CCE, 0xC473, + 0x9CCF, 0xC476, 0x9CD0, 0xC477, 0x9CD1, 0xC478, 0x9CD2, 0xC47A, 0x9CD3, 0xC47B, 0x9CD4, 0xC47C, 0x9CD5, 0xC47D, 0x9CD6, 0xC47E, + 0x9CD7, 0xC47F, 0x9CD8, 0xC481, 0x9CD9, 0xC482, 0x9CDA, 0xC483, 0x9CDB, 0xC484, 0x9CDC, 0xC485, 0x9CDD, 0xC486, 0x9CDE, 0xC487, + 0x9CDF, 0xC488, 0x9CE0, 0xC489, 0x9CE1, 0xC48A, 0x9CE2, 0xC48B, 0x9CE3, 0xC48C, 0x9CE4, 0xC48D, 0x9CE5, 0xC48E, 0x9CE6, 0xC48F, + 0x9CE7, 0xC490, 0x9CE8, 0xC491, 0x9CE9, 0xC492, 0x9CEA, 0xC493, 0x9CEB, 0xC495, 0x9CEC, 0xC496, 0x9CED, 0xC497, 0x9CEE, 0xC498, + 0x9CEF, 0xC499, 0x9CF0, 0xC49A, 0x9CF1, 0xC49B, 0x9CF2, 0xC49D, 0x9CF3, 0xC49E, 0x9CF4, 0xC49F, 0x9CF5, 0xC4A0, 0x9CF6, 0xC4A1, + 0x9CF7, 0xC4A2, 0x9CF8, 0xC4A3, 0x9CF9, 0xC4A4, 0x9CFA, 0xC4A5, 0x9CFB, 0xC4A6, 0x9CFC, 0xC4A7, 0x9CFD, 0xC4A8, 0x9CFE, 0xC4A9, + 0x9D41, 0xC4AA, 0x9D42, 0xC4AB, 0x9D43, 0xC4AC, 0x9D44, 0xC4AD, 0x9D45, 0xC4AE, 0x9D46, 0xC4AF, 0x9D47, 0xC4B0, 0x9D48, 0xC4B1, + 0x9D49, 0xC4B2, 0x9D4A, 0xC4B3, 0x9D4B, 0xC4B4, 0x9D4C, 0xC4B5, 0x9D4D, 0xC4B6, 0x9D4E, 0xC4B7, 0x9D4F, 0xC4B9, 0x9D50, 0xC4BA, + 0x9D51, 0xC4BB, 0x9D52, 0xC4BD, 0x9D53, 0xC4BE, 0x9D54, 0xC4BF, 0x9D55, 0xC4C0, 0x9D56, 0xC4C1, 0x9D57, 0xC4C2, 0x9D58, 0xC4C3, + 0x9D59, 0xC4C4, 0x9D5A, 0xC4C5, 0x9D61, 0xC4C6, 0x9D62, 0xC4C7, 0x9D63, 0xC4C8, 0x9D64, 0xC4C9, 0x9D65, 0xC4CA, 0x9D66, 0xC4CB, + 0x9D67, 0xC4CC, 0x9D68, 0xC4CD, 0x9D69, 0xC4CE, 0x9D6A, 0xC4CF, 0x9D6B, 0xC4D0, 0x9D6C, 0xC4D1, 0x9D6D, 0xC4D2, 0x9D6E, 0xC4D3, + 0x9D6F, 0xC4D4, 0x9D70, 0xC4D5, 0x9D71, 0xC4D6, 0x9D72, 0xC4D7, 0x9D73, 0xC4D8, 0x9D74, 0xC4D9, 0x9D75, 0xC4DA, 0x9D76, 0xC4DB, + 0x9D77, 0xC4DC, 0x9D78, 0xC4DD, 0x9D79, 0xC4DE, 0x9D7A, 0xC4DF, 0x9D81, 0xC4E0, 0x9D82, 0xC4E1, 0x9D83, 0xC4E2, 0x9D84, 0xC4E3, + 0x9D85, 0xC4E4, 0x9D86, 0xC4E5, 0x9D87, 0xC4E6, 0x9D88, 0xC4E7, 0x9D89, 0xC4E8, 0x9D8A, 0xC4EA, 0x9D8B, 0xC4EB, 0x9D8C, 0xC4EC, + 0x9D8D, 0xC4ED, 0x9D8E, 0xC4EE, 0x9D8F, 0xC4EF, 0x9D90, 0xC4F2, 0x9D91, 0xC4F3, 0x9D92, 0xC4F5, 0x9D93, 0xC4F6, 0x9D94, 0xC4F7, + 0x9D95, 0xC4F9, 0x9D96, 0xC4FB, 0x9D97, 0xC4FC, 0x9D98, 0xC4FD, 0x9D99, 0xC4FE, 0x9D9A, 0xC502, 0x9D9B, 0xC503, 0x9D9C, 0xC504, + 0x9D9D, 0xC505, 0x9D9E, 0xC506, 0x9D9F, 0xC507, 0x9DA0, 0xC508, 0x9DA1, 0xC509, 0x9DA2, 0xC50A, 0x9DA3, 0xC50B, 0x9DA4, 0xC50D, + 0x9DA5, 0xC50E, 0x9DA6, 0xC50F, 0x9DA7, 0xC511, 0x9DA8, 0xC512, 0x9DA9, 0xC513, 0x9DAA, 0xC515, 0x9DAB, 0xC516, 0x9DAC, 0xC517, + 0x9DAD, 0xC518, 0x9DAE, 0xC519, 0x9DAF, 0xC51A, 0x9DB0, 0xC51B, 0x9DB1, 0xC51D, 0x9DB2, 0xC51E, 0x9DB3, 0xC51F, 0x9DB4, 0xC520, + 0x9DB5, 0xC521, 0x9DB6, 0xC522, 0x9DB7, 0xC523, 0x9DB8, 0xC524, 0x9DB9, 0xC525, 0x9DBA, 0xC526, 0x9DBB, 0xC527, 0x9DBC, 0xC52A, + 0x9DBD, 0xC52B, 0x9DBE, 0xC52D, 0x9DBF, 0xC52E, 0x9DC0, 0xC52F, 0x9DC1, 0xC531, 0x9DC2, 0xC532, 0x9DC3, 0xC533, 0x9DC4, 0xC534, + 0x9DC5, 0xC535, 0x9DC6, 0xC536, 0x9DC7, 0xC537, 0x9DC8, 0xC53A, 0x9DC9, 0xC53C, 0x9DCA, 0xC53E, 0x9DCB, 0xC53F, 0x9DCC, 0xC540, + 0x9DCD, 0xC541, 0x9DCE, 0xC542, 0x9DCF, 0xC543, 0x9DD0, 0xC546, 0x9DD1, 0xC547, 0x9DD2, 0xC54B, 0x9DD3, 0xC54F, 0x9DD4, 0xC550, + 0x9DD5, 0xC551, 0x9DD6, 0xC552, 0x9DD7, 0xC556, 0x9DD8, 0xC55A, 0x9DD9, 0xC55B, 0x9DDA, 0xC55C, 0x9DDB, 0xC55F, 0x9DDC, 0xC562, + 0x9DDD, 0xC563, 0x9DDE, 0xC565, 0x9DDF, 0xC566, 0x9DE0, 0xC567, 0x9DE1, 0xC569, 0x9DE2, 0xC56A, 0x9DE3, 0xC56B, 0x9DE4, 0xC56C, + 0x9DE5, 0xC56D, 0x9DE6, 0xC56E, 0x9DE7, 0xC56F, 0x9DE8, 0xC572, 0x9DE9, 0xC576, 0x9DEA, 0xC577, 0x9DEB, 0xC578, 0x9DEC, 0xC579, + 0x9DED, 0xC57A, 0x9DEE, 0xC57B, 0x9DEF, 0xC57E, 0x9DF0, 0xC57F, 0x9DF1, 0xC581, 0x9DF2, 0xC582, 0x9DF3, 0xC583, 0x9DF4, 0xC585, + 0x9DF5, 0xC586, 0x9DF6, 0xC588, 0x9DF7, 0xC589, 0x9DF8, 0xC58A, 0x9DF9, 0xC58B, 0x9DFA, 0xC58E, 0x9DFB, 0xC590, 0x9DFC, 0xC592, + 0x9DFD, 0xC593, 0x9DFE, 0xC594, 0x9E41, 0xC596, 0x9E42, 0xC599, 0x9E43, 0xC59A, 0x9E44, 0xC59B, 0x9E45, 0xC59D, 0x9E46, 0xC59E, + 0x9E47, 0xC59F, 0x9E48, 0xC5A1, 0x9E49, 0xC5A2, 0x9E4A, 0xC5A3, 0x9E4B, 0xC5A4, 0x9E4C, 0xC5A5, 0x9E4D, 0xC5A6, 0x9E4E, 0xC5A7, + 0x9E4F, 0xC5A8, 0x9E50, 0xC5AA, 0x9E51, 0xC5AB, 0x9E52, 0xC5AC, 0x9E53, 0xC5AD, 0x9E54, 0xC5AE, 0x9E55, 0xC5AF, 0x9E56, 0xC5B0, + 0x9E57, 0xC5B1, 0x9E58, 0xC5B2, 0x9E59, 0xC5B3, 0x9E5A, 0xC5B6, 0x9E61, 0xC5B7, 0x9E62, 0xC5BA, 0x9E63, 0xC5BF, 0x9E64, 0xC5C0, + 0x9E65, 0xC5C1, 0x9E66, 0xC5C2, 0x9E67, 0xC5C3, 0x9E68, 0xC5CB, 0x9E69, 0xC5CD, 0x9E6A, 0xC5CF, 0x9E6B, 0xC5D2, 0x9E6C, 0xC5D3, + 0x9E6D, 0xC5D5, 0x9E6E, 0xC5D6, 0x9E6F, 0xC5D7, 0x9E70, 0xC5D9, 0x9E71, 0xC5DA, 0x9E72, 0xC5DB, 0x9E73, 0xC5DC, 0x9E74, 0xC5DD, + 0x9E75, 0xC5DE, 0x9E76, 0xC5DF, 0x9E77, 0xC5E2, 0x9E78, 0xC5E4, 0x9E79, 0xC5E6, 0x9E7A, 0xC5E7, 0x9E81, 0xC5E8, 0x9E82, 0xC5E9, + 0x9E83, 0xC5EA, 0x9E84, 0xC5EB, 0x9E85, 0xC5EF, 0x9E86, 0xC5F1, 0x9E87, 0xC5F2, 0x9E88, 0xC5F3, 0x9E89, 0xC5F5, 0x9E8A, 0xC5F8, + 0x9E8B, 0xC5F9, 0x9E8C, 0xC5FA, 0x9E8D, 0xC5FB, 0x9E8E, 0xC602, 0x9E8F, 0xC603, 0x9E90, 0xC604, 0x9E91, 0xC609, 0x9E92, 0xC60A, + 0x9E93, 0xC60B, 0x9E94, 0xC60D, 0x9E95, 0xC60E, 0x9E96, 0xC60F, 0x9E97, 0xC611, 0x9E98, 0xC612, 0x9E99, 0xC613, 0x9E9A, 0xC614, + 0x9E9B, 0xC615, 0x9E9C, 0xC616, 0x9E9D, 0xC617, 0x9E9E, 0xC61A, 0x9E9F, 0xC61D, 0x9EA0, 0xC61E, 0x9EA1, 0xC61F, 0x9EA2, 0xC620, + 0x9EA3, 0xC621, 0x9EA4, 0xC622, 0x9EA5, 0xC623, 0x9EA6, 0xC626, 0x9EA7, 0xC627, 0x9EA8, 0xC629, 0x9EA9, 0xC62A, 0x9EAA, 0xC62B, + 0x9EAB, 0xC62F, 0x9EAC, 0xC631, 0x9EAD, 0xC632, 0x9EAE, 0xC636, 0x9EAF, 0xC638, 0x9EB0, 0xC63A, 0x9EB1, 0xC63C, 0x9EB2, 0xC63D, + 0x9EB3, 0xC63E, 0x9EB4, 0xC63F, 0x9EB5, 0xC642, 0x9EB6, 0xC643, 0x9EB7, 0xC645, 0x9EB8, 0xC646, 0x9EB9, 0xC647, 0x9EBA, 0xC649, + 0x9EBB, 0xC64A, 0x9EBC, 0xC64B, 0x9EBD, 0xC64C, 0x9EBE, 0xC64D, 0x9EBF, 0xC64E, 0x9EC0, 0xC64F, 0x9EC1, 0xC652, 0x9EC2, 0xC656, + 0x9EC3, 0xC657, 0x9EC4, 0xC658, 0x9EC5, 0xC659, 0x9EC6, 0xC65A, 0x9EC7, 0xC65B, 0x9EC8, 0xC65E, 0x9EC9, 0xC65F, 0x9ECA, 0xC661, + 0x9ECB, 0xC662, 0x9ECC, 0xC663, 0x9ECD, 0xC664, 0x9ECE, 0xC665, 0x9ECF, 0xC666, 0x9ED0, 0xC667, 0x9ED1, 0xC668, 0x9ED2, 0xC669, + 0x9ED3, 0xC66A, 0x9ED4, 0xC66B, 0x9ED5, 0xC66D, 0x9ED6, 0xC66E, 0x9ED7, 0xC670, 0x9ED8, 0xC672, 0x9ED9, 0xC673, 0x9EDA, 0xC674, + 0x9EDB, 0xC675, 0x9EDC, 0xC676, 0x9EDD, 0xC677, 0x9EDE, 0xC67A, 0x9EDF, 0xC67B, 0x9EE0, 0xC67D, 0x9EE1, 0xC67E, 0x9EE2, 0xC67F, + 0x9EE3, 0xC681, 0x9EE4, 0xC682, 0x9EE5, 0xC683, 0x9EE6, 0xC684, 0x9EE7, 0xC685, 0x9EE8, 0xC686, 0x9EE9, 0xC687, 0x9EEA, 0xC68A, + 0x9EEB, 0xC68C, 0x9EEC, 0xC68E, 0x9EED, 0xC68F, 0x9EEE, 0xC690, 0x9EEF, 0xC691, 0x9EF0, 0xC692, 0x9EF1, 0xC693, 0x9EF2, 0xC696, + 0x9EF3, 0xC697, 0x9EF4, 0xC699, 0x9EF5, 0xC69A, 0x9EF6, 0xC69B, 0x9EF7, 0xC69D, 0x9EF8, 0xC69E, 0x9EF9, 0xC69F, 0x9EFA, 0xC6A0, + 0x9EFB, 0xC6A1, 0x9EFC, 0xC6A2, 0x9EFD, 0xC6A3, 0x9EFE, 0xC6A6, 0x9F41, 0xC6A8, 0x9F42, 0xC6AA, 0x9F43, 0xC6AB, 0x9F44, 0xC6AC, + 0x9F45, 0xC6AD, 0x9F46, 0xC6AE, 0x9F47, 0xC6AF, 0x9F48, 0xC6B2, 0x9F49, 0xC6B3, 0x9F4A, 0xC6B5, 0x9F4B, 0xC6B6, 0x9F4C, 0xC6B7, + 0x9F4D, 0xC6BB, 0x9F4E, 0xC6BC, 0x9F4F, 0xC6BD, 0x9F50, 0xC6BE, 0x9F51, 0xC6BF, 0x9F52, 0xC6C2, 0x9F53, 0xC6C4, 0x9F54, 0xC6C6, + 0x9F55, 0xC6C7, 0x9F56, 0xC6C8, 0x9F57, 0xC6C9, 0x9F58, 0xC6CA, 0x9F59, 0xC6CB, 0x9F5A, 0xC6CE, 0x9F61, 0xC6CF, 0x9F62, 0xC6D1, + 0x9F63, 0xC6D2, 0x9F64, 0xC6D3, 0x9F65, 0xC6D5, 0x9F66, 0xC6D6, 0x9F67, 0xC6D7, 0x9F68, 0xC6D8, 0x9F69, 0xC6D9, 0x9F6A, 0xC6DA, + 0x9F6B, 0xC6DB, 0x9F6C, 0xC6DE, 0x9F6D, 0xC6DF, 0x9F6E, 0xC6E2, 0x9F6F, 0xC6E3, 0x9F70, 0xC6E4, 0x9F71, 0xC6E5, 0x9F72, 0xC6E6, + 0x9F73, 0xC6E7, 0x9F74, 0xC6EA, 0x9F75, 0xC6EB, 0x9F76, 0xC6ED, 0x9F77, 0xC6EE, 0x9F78, 0xC6EF, 0x9F79, 0xC6F1, 0x9F7A, 0xC6F2, + 0x9F81, 0xC6F3, 0x9F82, 0xC6F4, 0x9F83, 0xC6F5, 0x9F84, 0xC6F6, 0x9F85, 0xC6F7, 0x9F86, 0xC6FA, 0x9F87, 0xC6FB, 0x9F88, 0xC6FC, + 0x9F89, 0xC6FE, 0x9F8A, 0xC6FF, 0x9F8B, 0xC700, 0x9F8C, 0xC701, 0x9F8D, 0xC702, 0x9F8E, 0xC703, 0x9F8F, 0xC706, 0x9F90, 0xC707, + 0x9F91, 0xC709, 0x9F92, 0xC70A, 0x9F93, 0xC70B, 0x9F94, 0xC70D, 0x9F95, 0xC70E, 0x9F96, 0xC70F, 0x9F97, 0xC710, 0x9F98, 0xC711, + 0x9F99, 0xC712, 0x9F9A, 0xC713, 0x9F9B, 0xC716, 0x9F9C, 0xC718, 0x9F9D, 0xC71A, 0x9F9E, 0xC71B, 0x9F9F, 0xC71C, 0x9FA0, 0xC71D, + 0x9FA1, 0xC71E, 0x9FA2, 0xC71F, 0x9FA3, 0xC722, 0x9FA4, 0xC723, 0x9FA5, 0xC725, 0x9FA6, 0xC726, 0x9FA7, 0xC727, 0x9FA8, 0xC729, + 0x9FA9, 0xC72A, 0x9FAA, 0xC72B, 0x9FAB, 0xC72C, 0x9FAC, 0xC72D, 0x9FAD, 0xC72E, 0x9FAE, 0xC72F, 0x9FAF, 0xC732, 0x9FB0, 0xC734, + 0x9FB1, 0xC736, 0x9FB2, 0xC738, 0x9FB3, 0xC739, 0x9FB4, 0xC73A, 0x9FB5, 0xC73B, 0x9FB6, 0xC73E, 0x9FB7, 0xC73F, 0x9FB8, 0xC741, + 0x9FB9, 0xC742, 0x9FBA, 0xC743, 0x9FBB, 0xC745, 0x9FBC, 0xC746, 0x9FBD, 0xC747, 0x9FBE, 0xC748, 0x9FBF, 0xC749, 0x9FC0, 0xC74B, + 0x9FC1, 0xC74E, 0x9FC2, 0xC750, 0x9FC3, 0xC759, 0x9FC4, 0xC75A, 0x9FC5, 0xC75B, 0x9FC6, 0xC75D, 0x9FC7, 0xC75E, 0x9FC8, 0xC75F, + 0x9FC9, 0xC761, 0x9FCA, 0xC762, 0x9FCB, 0xC763, 0x9FCC, 0xC764, 0x9FCD, 0xC765, 0x9FCE, 0xC766, 0x9FCF, 0xC767, 0x9FD0, 0xC769, + 0x9FD1, 0xC76A, 0x9FD2, 0xC76C, 0x9FD3, 0xC76D, 0x9FD4, 0xC76E, 0x9FD5, 0xC76F, 0x9FD6, 0xC770, 0x9FD7, 0xC771, 0x9FD8, 0xC772, + 0x9FD9, 0xC773, 0x9FDA, 0xC776, 0x9FDB, 0xC777, 0x9FDC, 0xC779, 0x9FDD, 0xC77A, 0x9FDE, 0xC77B, 0x9FDF, 0xC77F, 0x9FE0, 0xC780, + 0x9FE1, 0xC781, 0x9FE2, 0xC782, 0x9FE3, 0xC786, 0x9FE4, 0xC78B, 0x9FE5, 0xC78C, 0x9FE6, 0xC78D, 0x9FE7, 0xC78F, 0x9FE8, 0xC792, + 0x9FE9, 0xC793, 0x9FEA, 0xC795, 0x9FEB, 0xC799, 0x9FEC, 0xC79B, 0x9FED, 0xC79C, 0x9FEE, 0xC79D, 0x9FEF, 0xC79E, 0x9FF0, 0xC79F, + 0x9FF1, 0xC7A2, 0x9FF2, 0xC7A7, 0x9FF3, 0xC7A8, 0x9FF4, 0xC7A9, 0x9FF5, 0xC7AA, 0x9FF6, 0xC7AB, 0x9FF7, 0xC7AE, 0x9FF8, 0xC7AF, + 0x9FF9, 0xC7B1, 0x9FFA, 0xC7B2, 0x9FFB, 0xC7B3, 0x9FFC, 0xC7B5, 0x9FFD, 0xC7B6, 0x9FFE, 0xC7B7, 0xA041, 0xC7B8, 0xA042, 0xC7B9, + 0xA043, 0xC7BA, 0xA044, 0xC7BB, 0xA045, 0xC7BE, 0xA046, 0xC7C2, 0xA047, 0xC7C3, 0xA048, 0xC7C4, 0xA049, 0xC7C5, 0xA04A, 0xC7C6, + 0xA04B, 0xC7C7, 0xA04C, 0xC7CA, 0xA04D, 0xC7CB, 0xA04E, 0xC7CD, 0xA04F, 0xC7CF, 0xA050, 0xC7D1, 0xA051, 0xC7D2, 0xA052, 0xC7D3, + 0xA053, 0xC7D4, 0xA054, 0xC7D5, 0xA055, 0xC7D6, 0xA056, 0xC7D7, 0xA057, 0xC7D9, 0xA058, 0xC7DA, 0xA059, 0xC7DB, 0xA05A, 0xC7DC, + 0xA061, 0xC7DE, 0xA062, 0xC7DF, 0xA063, 0xC7E0, 0xA064, 0xC7E1, 0xA065, 0xC7E2, 0xA066, 0xC7E3, 0xA067, 0xC7E5, 0xA068, 0xC7E6, + 0xA069, 0xC7E7, 0xA06A, 0xC7E9, 0xA06B, 0xC7EA, 0xA06C, 0xC7EB, 0xA06D, 0xC7ED, 0xA06E, 0xC7EE, 0xA06F, 0xC7EF, 0xA070, 0xC7F0, + 0xA071, 0xC7F1, 0xA072, 0xC7F2, 0xA073, 0xC7F3, 0xA074, 0xC7F4, 0xA075, 0xC7F5, 0xA076, 0xC7F6, 0xA077, 0xC7F7, 0xA078, 0xC7F8, + 0xA079, 0xC7F9, 0xA07A, 0xC7FA, 0xA081, 0xC7FB, 0xA082, 0xC7FC, 0xA083, 0xC7FD, 0xA084, 0xC7FE, 0xA085, 0xC7FF, 0xA086, 0xC802, + 0xA087, 0xC803, 0xA088, 0xC805, 0xA089, 0xC806, 0xA08A, 0xC807, 0xA08B, 0xC809, 0xA08C, 0xC80B, 0xA08D, 0xC80C, 0xA08E, 0xC80D, + 0xA08F, 0xC80E, 0xA090, 0xC80F, 0xA091, 0xC812, 0xA092, 0xC814, 0xA093, 0xC817, 0xA094, 0xC818, 0xA095, 0xC819, 0xA096, 0xC81A, + 0xA097, 0xC81B, 0xA098, 0xC81E, 0xA099, 0xC81F, 0xA09A, 0xC821, 0xA09B, 0xC822, 0xA09C, 0xC823, 0xA09D, 0xC825, 0xA09E, 0xC826, + 0xA09F, 0xC827, 0xA0A0, 0xC828, 0xA0A1, 0xC829, 0xA0A2, 0xC82A, 0xA0A3, 0xC82B, 0xA0A4, 0xC82E, 0xA0A5, 0xC830, 0xA0A6, 0xC832, + 0xA0A7, 0xC833, 0xA0A8, 0xC834, 0xA0A9, 0xC835, 0xA0AA, 0xC836, 0xA0AB, 0xC837, 0xA0AC, 0xC839, 0xA0AD, 0xC83A, 0xA0AE, 0xC83B, + 0xA0AF, 0xC83D, 0xA0B0, 0xC83E, 0xA0B1, 0xC83F, 0xA0B2, 0xC841, 0xA0B3, 0xC842, 0xA0B4, 0xC843, 0xA0B5, 0xC844, 0xA0B6, 0xC845, + 0xA0B7, 0xC846, 0xA0B8, 0xC847, 0xA0B9, 0xC84A, 0xA0BA, 0xC84B, 0xA0BB, 0xC84E, 0xA0BC, 0xC84F, 0xA0BD, 0xC850, 0xA0BE, 0xC851, + 0xA0BF, 0xC852, 0xA0C0, 0xC853, 0xA0C1, 0xC855, 0xA0C2, 0xC856, 0xA0C3, 0xC857, 0xA0C4, 0xC858, 0xA0C5, 0xC859, 0xA0C6, 0xC85A, + 0xA0C7, 0xC85B, 0xA0C8, 0xC85C, 0xA0C9, 0xC85D, 0xA0CA, 0xC85E, 0xA0CB, 0xC85F, 0xA0CC, 0xC860, 0xA0CD, 0xC861, 0xA0CE, 0xC862, + 0xA0CF, 0xC863, 0xA0D0, 0xC864, 0xA0D1, 0xC865, 0xA0D2, 0xC866, 0xA0D3, 0xC867, 0xA0D4, 0xC868, 0xA0D5, 0xC869, 0xA0D6, 0xC86A, + 0xA0D7, 0xC86B, 0xA0D8, 0xC86C, 0xA0D9, 0xC86D, 0xA0DA, 0xC86E, 0xA0DB, 0xC86F, 0xA0DC, 0xC872, 0xA0DD, 0xC873, 0xA0DE, 0xC875, + 0xA0DF, 0xC876, 0xA0E0, 0xC877, 0xA0E1, 0xC879, 0xA0E2, 0xC87B, 0xA0E3, 0xC87C, 0xA0E4, 0xC87D, 0xA0E5, 0xC87E, 0xA0E6, 0xC87F, + 0xA0E7, 0xC882, 0xA0E8, 0xC884, 0xA0E9, 0xC888, 0xA0EA, 0xC889, 0xA0EB, 0xC88A, 0xA0EC, 0xC88E, 0xA0ED, 0xC88F, 0xA0EE, 0xC890, + 0xA0EF, 0xC891, 0xA0F0, 0xC892, 0xA0F1, 0xC893, 0xA0F2, 0xC895, 0xA0F3, 0xC896, 0xA0F4, 0xC897, 0xA0F5, 0xC898, 0xA0F6, 0xC899, + 0xA0F7, 0xC89A, 0xA0F8, 0xC89B, 0xA0F9, 0xC89C, 0xA0FA, 0xC89E, 0xA0FB, 0xC8A0, 0xA0FC, 0xC8A2, 0xA0FD, 0xC8A3, 0xA0FE, 0xC8A4, + 0xA141, 0xC8A5, 0xA142, 0xC8A6, 0xA143, 0xC8A7, 0xA144, 0xC8A9, 0xA145, 0xC8AA, 0xA146, 0xC8AB, 0xA147, 0xC8AC, 0xA148, 0xC8AD, + 0xA149, 0xC8AE, 0xA14A, 0xC8AF, 0xA14B, 0xC8B0, 0xA14C, 0xC8B1, 0xA14D, 0xC8B2, 0xA14E, 0xC8B3, 0xA14F, 0xC8B4, 0xA150, 0xC8B5, + 0xA151, 0xC8B6, 0xA152, 0xC8B7, 0xA153, 0xC8B8, 0xA154, 0xC8B9, 0xA155, 0xC8BA, 0xA156, 0xC8BB, 0xA157, 0xC8BE, 0xA158, 0xC8BF, + 0xA159, 0xC8C0, 0xA15A, 0xC8C1, 0xA161, 0xC8C2, 0xA162, 0xC8C3, 0xA163, 0xC8C5, 0xA164, 0xC8C6, 0xA165, 0xC8C7, 0xA166, 0xC8C9, + 0xA167, 0xC8CA, 0xA168, 0xC8CB, 0xA169, 0xC8CD, 0xA16A, 0xC8CE, 0xA16B, 0xC8CF, 0xA16C, 0xC8D0, 0xA16D, 0xC8D1, 0xA16E, 0xC8D2, + 0xA16F, 0xC8D3, 0xA170, 0xC8D6, 0xA171, 0xC8D8, 0xA172, 0xC8DA, 0xA173, 0xC8DB, 0xA174, 0xC8DC, 0xA175, 0xC8DD, 0xA176, 0xC8DE, + 0xA177, 0xC8DF, 0xA178, 0xC8E2, 0xA179, 0xC8E3, 0xA17A, 0xC8E5, 0xA181, 0xC8E6, 0xA182, 0xC8E7, 0xA183, 0xC8E8, 0xA184, 0xC8E9, + 0xA185, 0xC8EA, 0xA186, 0xC8EB, 0xA187, 0xC8EC, 0xA188, 0xC8ED, 0xA189, 0xC8EE, 0xA18A, 0xC8EF, 0xA18B, 0xC8F0, 0xA18C, 0xC8F1, + 0xA18D, 0xC8F2, 0xA18E, 0xC8F3, 0xA18F, 0xC8F4, 0xA190, 0xC8F6, 0xA191, 0xC8F7, 0xA192, 0xC8F8, 0xA193, 0xC8F9, 0xA194, 0xC8FA, + 0xA195, 0xC8FB, 0xA196, 0xC8FE, 0xA197, 0xC8FF, 0xA198, 0xC901, 0xA199, 0xC902, 0xA19A, 0xC903, 0xA19B, 0xC907, 0xA19C, 0xC908, + 0xA19D, 0xC909, 0xA19E, 0xC90A, 0xA19F, 0xC90B, 0xA1A0, 0xC90E, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, + 0xA1A5, 0x2025, 0xA1A6, 0x2026, 0xA1A7, 0x00A8, 0xA1A8, 0x3003, 0xA1A9, 0x00AD, 0xA1AA, 0x2015, 0xA1AB, 0x2225, 0xA1AC, 0xFF3C, + 0xA1AD, 0x223C, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, + 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3010, + 0xA1BD, 0x3011, 0xA1BE, 0x00B1, 0xA1BF, 0x00D7, 0xA1C0, 0x00F7, 0xA1C1, 0x2260, 0xA1C2, 0x2264, 0xA1C3, 0x2265, 0xA1C4, 0x221E, + 0xA1C5, 0x2234, 0xA1C6, 0x00B0, 0xA1C7, 0x2032, 0xA1C8, 0x2033, 0xA1C9, 0x2103, 0xA1CA, 0x212B, 0xA1CB, 0xFFE0, 0xA1CC, 0xFFE1, + 0xA1CD, 0xFFE5, 0xA1CE, 0x2642, 0xA1CF, 0x2640, 0xA1D0, 0x2220, 0xA1D1, 0x22A5, 0xA1D2, 0x2312, 0xA1D3, 0x2202, 0xA1D4, 0x2207, + 0xA1D5, 0x2261, 0xA1D6, 0x2252, 0xA1D7, 0x00A7, 0xA1D8, 0x203B, 0xA1D9, 0x2606, 0xA1DA, 0x2605, 0xA1DB, 0x25CB, 0xA1DC, 0x25CF, + 0xA1DD, 0x25CE, 0xA1DE, 0x25C7, 0xA1DF, 0x25C6, 0xA1E0, 0x25A1, 0xA1E1, 0x25A0, 0xA1E2, 0x25B3, 0xA1E3, 0x25B2, 0xA1E4, 0x25BD, + 0xA1E5, 0x25BC, 0xA1E6, 0x2192, 0xA1E7, 0x2190, 0xA1E8, 0x2191, 0xA1E9, 0x2193, 0xA1EA, 0x2194, 0xA1EB, 0x3013, 0xA1EC, 0x226A, + 0xA1ED, 0x226B, 0xA1EE, 0x221A, 0xA1EF, 0x223D, 0xA1F0, 0x221D, 0xA1F1, 0x2235, 0xA1F2, 0x222B, 0xA1F3, 0x222C, 0xA1F4, 0x2208, + 0xA1F5, 0x220B, 0xA1F6, 0x2286, 0xA1F7, 0x2287, 0xA1F8, 0x2282, 0xA1F9, 0x2283, 0xA1FA, 0x222A, 0xA1FB, 0x2229, 0xA1FC, 0x2227, + 0xA1FD, 0x2228, 0xA1FE, 0xFFE2, 0xA241, 0xC910, 0xA242, 0xC912, 0xA243, 0xC913, 0xA244, 0xC914, 0xA245, 0xC915, 0xA246, 0xC916, + 0xA247, 0xC917, 0xA248, 0xC919, 0xA249, 0xC91A, 0xA24A, 0xC91B, 0xA24B, 0xC91C, 0xA24C, 0xC91D, 0xA24D, 0xC91E, 0xA24E, 0xC91F, + 0xA24F, 0xC920, 0xA250, 0xC921, 0xA251, 0xC922, 0xA252, 0xC923, 0xA253, 0xC924, 0xA254, 0xC925, 0xA255, 0xC926, 0xA256, 0xC927, + 0xA257, 0xC928, 0xA258, 0xC929, 0xA259, 0xC92A, 0xA25A, 0xC92B, 0xA261, 0xC92D, 0xA262, 0xC92E, 0xA263, 0xC92F, 0xA264, 0xC930, + 0xA265, 0xC931, 0xA266, 0xC932, 0xA267, 0xC933, 0xA268, 0xC935, 0xA269, 0xC936, 0xA26A, 0xC937, 0xA26B, 0xC938, 0xA26C, 0xC939, + 0xA26D, 0xC93A, 0xA26E, 0xC93B, 0xA26F, 0xC93C, 0xA270, 0xC93D, 0xA271, 0xC93E, 0xA272, 0xC93F, 0xA273, 0xC940, 0xA274, 0xC941, + 0xA275, 0xC942, 0xA276, 0xC943, 0xA277, 0xC944, 0xA278, 0xC945, 0xA279, 0xC946, 0xA27A, 0xC947, 0xA281, 0xC948, 0xA282, 0xC949, + 0xA283, 0xC94A, 0xA284, 0xC94B, 0xA285, 0xC94C, 0xA286, 0xC94D, 0xA287, 0xC94E, 0xA288, 0xC94F, 0xA289, 0xC952, 0xA28A, 0xC953, + 0xA28B, 0xC955, 0xA28C, 0xC956, 0xA28D, 0xC957, 0xA28E, 0xC959, 0xA28F, 0xC95A, 0xA290, 0xC95B, 0xA291, 0xC95C, 0xA292, 0xC95D, + 0xA293, 0xC95E, 0xA294, 0xC95F, 0xA295, 0xC962, 0xA296, 0xC964, 0xA297, 0xC965, 0xA298, 0xC966, 0xA299, 0xC967, 0xA29A, 0xC968, + 0xA29B, 0xC969, 0xA29C, 0xC96A, 0xA29D, 0xC96B, 0xA29E, 0xC96D, 0xA29F, 0xC96E, 0xA2A0, 0xC96F, 0xA2A1, 0x21D2, 0xA2A2, 0x21D4, + 0xA2A3, 0x2200, 0xA2A4, 0x2203, 0xA2A5, 0x00B4, 0xA2A6, 0xFF5E, 0xA2A7, 0x02C7, 0xA2A8, 0x02D8, 0xA2A9, 0x02DD, 0xA2AA, 0x02DA, + 0xA2AB, 0x02D9, 0xA2AC, 0x00B8, 0xA2AD, 0x02DB, 0xA2AE, 0x00A1, 0xA2AF, 0x00BF, 0xA2B0, 0x02D0, 0xA2B1, 0x222E, 0xA2B2, 0x2211, + 0xA2B3, 0x220F, 0xA2B4, 0x00A4, 0xA2B5, 0x2109, 0xA2B6, 0x2030, 0xA2B7, 0x25C1, 0xA2B8, 0x25C0, 0xA2B9, 0x25B7, 0xA2BA, 0x25B6, + 0xA2BB, 0x2664, 0xA2BC, 0x2660, 0xA2BD, 0x2661, 0xA2BE, 0x2665, 0xA2BF, 0x2667, 0xA2C0, 0x2663, 0xA2C1, 0x2299, 0xA2C2, 0x25C8, + 0xA2C3, 0x25A3, 0xA2C4, 0x25D0, 0xA2C5, 0x25D1, 0xA2C6, 0x2592, 0xA2C7, 0x25A4, 0xA2C8, 0x25A5, 0xA2C9, 0x25A8, 0xA2CA, 0x25A7, + 0xA2CB, 0x25A6, 0xA2CC, 0x25A9, 0xA2CD, 0x2668, 0xA2CE, 0x260F, 0xA2CF, 0x260E, 0xA2D0, 0x261C, 0xA2D1, 0x261E, 0xA2D2, 0x00B6, + 0xA2D3, 0x2020, 0xA2D4, 0x2021, 0xA2D5, 0x2195, 0xA2D6, 0x2197, 0xA2D7, 0x2199, 0xA2D8, 0x2196, 0xA2D9, 0x2198, 0xA2DA, 0x266D, + 0xA2DB, 0x2669, 0xA2DC, 0x266A, 0xA2DD, 0x266C, 0xA2DE, 0x327F, 0xA2DF, 0x321C, 0xA2E0, 0x2116, 0xA2E1, 0x33C7, 0xA2E2, 0x2122, + 0xA2E3, 0x33C2, 0xA2E4, 0x33D8, 0xA2E5, 0x2121, 0xA2E6, 0x20AC, 0xA2E7, 0x00AE, 0xA341, 0xC971, 0xA342, 0xC972, 0xA343, 0xC973, + 0xA344, 0xC975, 0xA345, 0xC976, 0xA346, 0xC977, 0xA347, 0xC978, 0xA348, 0xC979, 0xA349, 0xC97A, 0xA34A, 0xC97B, 0xA34B, 0xC97D, + 0xA34C, 0xC97E, 0xA34D, 0xC97F, 0xA34E, 0xC980, 0xA34F, 0xC981, 0xA350, 0xC982, 0xA351, 0xC983, 0xA352, 0xC984, 0xA353, 0xC985, + 0xA354, 0xC986, 0xA355, 0xC987, 0xA356, 0xC98A, 0xA357, 0xC98B, 0xA358, 0xC98D, 0xA359, 0xC98E, 0xA35A, 0xC98F, 0xA361, 0xC991, + 0xA362, 0xC992, 0xA363, 0xC993, 0xA364, 0xC994, 0xA365, 0xC995, 0xA366, 0xC996, 0xA367, 0xC997, 0xA368, 0xC99A, 0xA369, 0xC99C, + 0xA36A, 0xC99E, 0xA36B, 0xC99F, 0xA36C, 0xC9A0, 0xA36D, 0xC9A1, 0xA36E, 0xC9A2, 0xA36F, 0xC9A3, 0xA370, 0xC9A4, 0xA371, 0xC9A5, + 0xA372, 0xC9A6, 0xA373, 0xC9A7, 0xA374, 0xC9A8, 0xA375, 0xC9A9, 0xA376, 0xC9AA, 0xA377, 0xC9AB, 0xA378, 0xC9AC, 0xA379, 0xC9AD, + 0xA37A, 0xC9AE, 0xA381, 0xC9AF, 0xA382, 0xC9B0, 0xA383, 0xC9B1, 0xA384, 0xC9B2, 0xA385, 0xC9B3, 0xA386, 0xC9B4, 0xA387, 0xC9B5, + 0xA388, 0xC9B6, 0xA389, 0xC9B7, 0xA38A, 0xC9B8, 0xA38B, 0xC9B9, 0xA38C, 0xC9BA, 0xA38D, 0xC9BB, 0xA38E, 0xC9BC, 0xA38F, 0xC9BD, + 0xA390, 0xC9BE, 0xA391, 0xC9BF, 0xA392, 0xC9C2, 0xA393, 0xC9C3, 0xA394, 0xC9C5, 0xA395, 0xC9C6, 0xA396, 0xC9C9, 0xA397, 0xC9CB, + 0xA398, 0xC9CC, 0xA399, 0xC9CD, 0xA39A, 0xC9CE, 0xA39B, 0xC9CF, 0xA39C, 0xC9D2, 0xA39D, 0xC9D4, 0xA39E, 0xC9D7, 0xA39F, 0xC9D8, + 0xA3A0, 0xC9DB, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, 0xA3A4, 0xFF04, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, 0xA3DC, 0xFFE6, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA441, 0xC9DE, + 0xA442, 0xC9DF, 0xA443, 0xC9E1, 0xA444, 0xC9E3, 0xA445, 0xC9E5, 0xA446, 0xC9E6, 0xA447, 0xC9E8, 0xA448, 0xC9E9, 0xA449, 0xC9EA, + 0xA44A, 0xC9EB, 0xA44B, 0xC9EE, 0xA44C, 0xC9F2, 0xA44D, 0xC9F3, 0xA44E, 0xC9F4, 0xA44F, 0xC9F5, 0xA450, 0xC9F6, 0xA451, 0xC9F7, + 0xA452, 0xC9FA, 0xA453, 0xC9FB, 0xA454, 0xC9FD, 0xA455, 0xC9FE, 0xA456, 0xC9FF, 0xA457, 0xCA01, 0xA458, 0xCA02, 0xA459, 0xCA03, + 0xA45A, 0xCA04, 0xA461, 0xCA05, 0xA462, 0xCA06, 0xA463, 0xCA07, 0xA464, 0xCA0A, 0xA465, 0xCA0E, 0xA466, 0xCA0F, 0xA467, 0xCA10, + 0xA468, 0xCA11, 0xA469, 0xCA12, 0xA46A, 0xCA13, 0xA46B, 0xCA15, 0xA46C, 0xCA16, 0xA46D, 0xCA17, 0xA46E, 0xCA19, 0xA46F, 0xCA1A, + 0xA470, 0xCA1B, 0xA471, 0xCA1C, 0xA472, 0xCA1D, 0xA473, 0xCA1E, 0xA474, 0xCA1F, 0xA475, 0xCA20, 0xA476, 0xCA21, 0xA477, 0xCA22, + 0xA478, 0xCA23, 0xA479, 0xCA24, 0xA47A, 0xCA25, 0xA481, 0xCA26, 0xA482, 0xCA27, 0xA483, 0xCA28, 0xA484, 0xCA2A, 0xA485, 0xCA2B, + 0xA486, 0xCA2C, 0xA487, 0xCA2D, 0xA488, 0xCA2E, 0xA489, 0xCA2F, 0xA48A, 0xCA30, 0xA48B, 0xCA31, 0xA48C, 0xCA32, 0xA48D, 0xCA33, + 0xA48E, 0xCA34, 0xA48F, 0xCA35, 0xA490, 0xCA36, 0xA491, 0xCA37, 0xA492, 0xCA38, 0xA493, 0xCA39, 0xA494, 0xCA3A, 0xA495, 0xCA3B, + 0xA496, 0xCA3C, 0xA497, 0xCA3D, 0xA498, 0xCA3E, 0xA499, 0xCA3F, 0xA49A, 0xCA40, 0xA49B, 0xCA41, 0xA49C, 0xCA42, 0xA49D, 0xCA43, + 0xA49E, 0xCA44, 0xA49F, 0xCA45, 0xA4A0, 0xCA46, 0xA4A1, 0x3131, 0xA4A2, 0x3132, 0xA4A3, 0x3133, 0xA4A4, 0x3134, 0xA4A5, 0x3135, + 0xA4A6, 0x3136, 0xA4A7, 0x3137, 0xA4A8, 0x3138, 0xA4A9, 0x3139, 0xA4AA, 0x313A, 0xA4AB, 0x313B, 0xA4AC, 0x313C, 0xA4AD, 0x313D, + 0xA4AE, 0x313E, 0xA4AF, 0x313F, 0xA4B0, 0x3140, 0xA4B1, 0x3141, 0xA4B2, 0x3142, 0xA4B3, 0x3143, 0xA4B4, 0x3144, 0xA4B5, 0x3145, + 0xA4B6, 0x3146, 0xA4B7, 0x3147, 0xA4B8, 0x3148, 0xA4B9, 0x3149, 0xA4BA, 0x314A, 0xA4BB, 0x314B, 0xA4BC, 0x314C, 0xA4BD, 0x314D, + 0xA4BE, 0x314E, 0xA4BF, 0x314F, 0xA4C0, 0x3150, 0xA4C1, 0x3151, 0xA4C2, 0x3152, 0xA4C3, 0x3153, 0xA4C4, 0x3154, 0xA4C5, 0x3155, + 0xA4C6, 0x3156, 0xA4C7, 0x3157, 0xA4C8, 0x3158, 0xA4C9, 0x3159, 0xA4CA, 0x315A, 0xA4CB, 0x315B, 0xA4CC, 0x315C, 0xA4CD, 0x315D, + 0xA4CE, 0x315E, 0xA4CF, 0x315F, 0xA4D0, 0x3160, 0xA4D1, 0x3161, 0xA4D2, 0x3162, 0xA4D3, 0x3163, 0xA4D4, 0x3164, 0xA4D5, 0x3165, + 0xA4D6, 0x3166, 0xA4D7, 0x3167, 0xA4D8, 0x3168, 0xA4D9, 0x3169, 0xA4DA, 0x316A, 0xA4DB, 0x316B, 0xA4DC, 0x316C, 0xA4DD, 0x316D, + 0xA4DE, 0x316E, 0xA4DF, 0x316F, 0xA4E0, 0x3170, 0xA4E1, 0x3171, 0xA4E2, 0x3172, 0xA4E3, 0x3173, 0xA4E4, 0x3174, 0xA4E5, 0x3175, + 0xA4E6, 0x3176, 0xA4E7, 0x3177, 0xA4E8, 0x3178, 0xA4E9, 0x3179, 0xA4EA, 0x317A, 0xA4EB, 0x317B, 0xA4EC, 0x317C, 0xA4ED, 0x317D, + 0xA4EE, 0x317E, 0xA4EF, 0x317F, 0xA4F0, 0x3180, 0xA4F1, 0x3181, 0xA4F2, 0x3182, 0xA4F3, 0x3183, 0xA4F4, 0x3184, 0xA4F5, 0x3185, + 0xA4F6, 0x3186, 0xA4F7, 0x3187, 0xA4F8, 0x3188, 0xA4F9, 0x3189, 0xA4FA, 0x318A, 0xA4FB, 0x318B, 0xA4FC, 0x318C, 0xA4FD, 0x318D, + 0xA4FE, 0x318E, 0xA541, 0xCA47, 0xA542, 0xCA48, 0xA543, 0xCA49, 0xA544, 0xCA4A, 0xA545, 0xCA4B, 0xA546, 0xCA4E, 0xA547, 0xCA4F, + 0xA548, 0xCA51, 0xA549, 0xCA52, 0xA54A, 0xCA53, 0xA54B, 0xCA55, 0xA54C, 0xCA56, 0xA54D, 0xCA57, 0xA54E, 0xCA58, 0xA54F, 0xCA59, + 0xA550, 0xCA5A, 0xA551, 0xCA5B, 0xA552, 0xCA5E, 0xA553, 0xCA62, 0xA554, 0xCA63, 0xA555, 0xCA64, 0xA556, 0xCA65, 0xA557, 0xCA66, + 0xA558, 0xCA67, 0xA559, 0xCA69, 0xA55A, 0xCA6A, 0xA561, 0xCA6B, 0xA562, 0xCA6C, 0xA563, 0xCA6D, 0xA564, 0xCA6E, 0xA565, 0xCA6F, + 0xA566, 0xCA70, 0xA567, 0xCA71, 0xA568, 0xCA72, 0xA569, 0xCA73, 0xA56A, 0xCA74, 0xA56B, 0xCA75, 0xA56C, 0xCA76, 0xA56D, 0xCA77, + 0xA56E, 0xCA78, 0xA56F, 0xCA79, 0xA570, 0xCA7A, 0xA571, 0xCA7B, 0xA572, 0xCA7C, 0xA573, 0xCA7E, 0xA574, 0xCA7F, 0xA575, 0xCA80, + 0xA576, 0xCA81, 0xA577, 0xCA82, 0xA578, 0xCA83, 0xA579, 0xCA85, 0xA57A, 0xCA86, 0xA581, 0xCA87, 0xA582, 0xCA88, 0xA583, 0xCA89, + 0xA584, 0xCA8A, 0xA585, 0xCA8B, 0xA586, 0xCA8C, 0xA587, 0xCA8D, 0xA588, 0xCA8E, 0xA589, 0xCA8F, 0xA58A, 0xCA90, 0xA58B, 0xCA91, + 0xA58C, 0xCA92, 0xA58D, 0xCA93, 0xA58E, 0xCA94, 0xA58F, 0xCA95, 0xA590, 0xCA96, 0xA591, 0xCA97, 0xA592, 0xCA99, 0xA593, 0xCA9A, + 0xA594, 0xCA9B, 0xA595, 0xCA9C, 0xA596, 0xCA9D, 0xA597, 0xCA9E, 0xA598, 0xCA9F, 0xA599, 0xCAA0, 0xA59A, 0xCAA1, 0xA59B, 0xCAA2, + 0xA59C, 0xCAA3, 0xA59D, 0xCAA4, 0xA59E, 0xCAA5, 0xA59F, 0xCAA6, 0xA5A0, 0xCAA7, 0xA5A1, 0x2170, 0xA5A2, 0x2171, 0xA5A3, 0x2172, + 0xA5A4, 0x2173, 0xA5A5, 0x2174, 0xA5A6, 0x2175, 0xA5A7, 0x2176, 0xA5A8, 0x2177, 0xA5A9, 0x2178, 0xA5AA, 0x2179, 0xA5B0, 0x2160, + 0xA5B1, 0x2161, 0xA5B2, 0x2162, 0xA5B3, 0x2163, 0xA5B4, 0x2164, 0xA5B5, 0x2165, 0xA5B6, 0x2166, 0xA5B7, 0x2167, 0xA5B8, 0x2168, + 0xA5B9, 0x2169, 0xA5C1, 0x0391, 0xA5C2, 0x0392, 0xA5C3, 0x0393, 0xA5C4, 0x0394, 0xA5C5, 0x0395, 0xA5C6, 0x0396, 0xA5C7, 0x0397, + 0xA5C8, 0x0398, 0xA5C9, 0x0399, 0xA5CA, 0x039A, 0xA5CB, 0x039B, 0xA5CC, 0x039C, 0xA5CD, 0x039D, 0xA5CE, 0x039E, 0xA5CF, 0x039F, + 0xA5D0, 0x03A0, 0xA5D1, 0x03A1, 0xA5D2, 0x03A3, 0xA5D3, 0x03A4, 0xA5D4, 0x03A5, 0xA5D5, 0x03A6, 0xA5D6, 0x03A7, 0xA5D7, 0x03A8, + 0xA5D8, 0x03A9, 0xA5E1, 0x03B1, 0xA5E2, 0x03B2, 0xA5E3, 0x03B3, 0xA5E4, 0x03B4, 0xA5E5, 0x03B5, 0xA5E6, 0x03B6, 0xA5E7, 0x03B7, + 0xA5E8, 0x03B8, 0xA5E9, 0x03B9, 0xA5EA, 0x03BA, 0xA5EB, 0x03BB, 0xA5EC, 0x03BC, 0xA5ED, 0x03BD, 0xA5EE, 0x03BE, 0xA5EF, 0x03BF, + 0xA5F0, 0x03C0, 0xA5F1, 0x03C1, 0xA5F2, 0x03C3, 0xA5F3, 0x03C4, 0xA5F4, 0x03C5, 0xA5F5, 0x03C6, 0xA5F6, 0x03C7, 0xA5F7, 0x03C8, + 0xA5F8, 0x03C9, 0xA641, 0xCAA8, 0xA642, 0xCAA9, 0xA643, 0xCAAA, 0xA644, 0xCAAB, 0xA645, 0xCAAC, 0xA646, 0xCAAD, 0xA647, 0xCAAE, + 0xA648, 0xCAAF, 0xA649, 0xCAB0, 0xA64A, 0xCAB1, 0xA64B, 0xCAB2, 0xA64C, 0xCAB3, 0xA64D, 0xCAB4, 0xA64E, 0xCAB5, 0xA64F, 0xCAB6, + 0xA650, 0xCAB7, 0xA651, 0xCAB8, 0xA652, 0xCAB9, 0xA653, 0xCABA, 0xA654, 0xCABB, 0xA655, 0xCABE, 0xA656, 0xCABF, 0xA657, 0xCAC1, + 0xA658, 0xCAC2, 0xA659, 0xCAC3, 0xA65A, 0xCAC5, 0xA661, 0xCAC6, 0xA662, 0xCAC7, 0xA663, 0xCAC8, 0xA664, 0xCAC9, 0xA665, 0xCACA, + 0xA666, 0xCACB, 0xA667, 0xCACE, 0xA668, 0xCAD0, 0xA669, 0xCAD2, 0xA66A, 0xCAD4, 0xA66B, 0xCAD5, 0xA66C, 0xCAD6, 0xA66D, 0xCAD7, + 0xA66E, 0xCADA, 0xA66F, 0xCADB, 0xA670, 0xCADC, 0xA671, 0xCADD, 0xA672, 0xCADE, 0xA673, 0xCADF, 0xA674, 0xCAE1, 0xA675, 0xCAE2, + 0xA676, 0xCAE3, 0xA677, 0xCAE4, 0xA678, 0xCAE5, 0xA679, 0xCAE6, 0xA67A, 0xCAE7, 0xA681, 0xCAE8, 0xA682, 0xCAE9, 0xA683, 0xCAEA, + 0xA684, 0xCAEB, 0xA685, 0xCAED, 0xA686, 0xCAEE, 0xA687, 0xCAEF, 0xA688, 0xCAF0, 0xA689, 0xCAF1, 0xA68A, 0xCAF2, 0xA68B, 0xCAF3, + 0xA68C, 0xCAF5, 0xA68D, 0xCAF6, 0xA68E, 0xCAF7, 0xA68F, 0xCAF8, 0xA690, 0xCAF9, 0xA691, 0xCAFA, 0xA692, 0xCAFB, 0xA693, 0xCAFC, + 0xA694, 0xCAFD, 0xA695, 0xCAFE, 0xA696, 0xCAFF, 0xA697, 0xCB00, 0xA698, 0xCB01, 0xA699, 0xCB02, 0xA69A, 0xCB03, 0xA69B, 0xCB04, + 0xA69C, 0xCB05, 0xA69D, 0xCB06, 0xA69E, 0xCB07, 0xA69F, 0xCB09, 0xA6A0, 0xCB0A, 0xA6A1, 0x2500, 0xA6A2, 0x2502, 0xA6A3, 0x250C, + 0xA6A4, 0x2510, 0xA6A5, 0x2518, 0xA6A6, 0x2514, 0xA6A7, 0x251C, 0xA6A8, 0x252C, 0xA6A9, 0x2524, 0xA6AA, 0x2534, 0xA6AB, 0x253C, + 0xA6AC, 0x2501, 0xA6AD, 0x2503, 0xA6AE, 0x250F, 0xA6AF, 0x2513, 0xA6B0, 0x251B, 0xA6B1, 0x2517, 0xA6B2, 0x2523, 0xA6B3, 0x2533, + 0xA6B4, 0x252B, 0xA6B5, 0x253B, 0xA6B6, 0x254B, 0xA6B7, 0x2520, 0xA6B8, 0x252F, 0xA6B9, 0x2528, 0xA6BA, 0x2537, 0xA6BB, 0x253F, + 0xA6BC, 0x251D, 0xA6BD, 0x2530, 0xA6BE, 0x2525, 0xA6BF, 0x2538, 0xA6C0, 0x2542, 0xA6C1, 0x2512, 0xA6C2, 0x2511, 0xA6C3, 0x251A, + 0xA6C4, 0x2519, 0xA6C5, 0x2516, 0xA6C6, 0x2515, 0xA6C7, 0x250E, 0xA6C8, 0x250D, 0xA6C9, 0x251E, 0xA6CA, 0x251F, 0xA6CB, 0x2521, + 0xA6CC, 0x2522, 0xA6CD, 0x2526, 0xA6CE, 0x2527, 0xA6CF, 0x2529, 0xA6D0, 0x252A, 0xA6D1, 0x252D, 0xA6D2, 0x252E, 0xA6D3, 0x2531, + 0xA6D4, 0x2532, 0xA6D5, 0x2535, 0xA6D6, 0x2536, 0xA6D7, 0x2539, 0xA6D8, 0x253A, 0xA6D9, 0x253D, 0xA6DA, 0x253E, 0xA6DB, 0x2540, + 0xA6DC, 0x2541, 0xA6DD, 0x2543, 0xA6DE, 0x2544, 0xA6DF, 0x2545, 0xA6E0, 0x2546, 0xA6E1, 0x2547, 0xA6E2, 0x2548, 0xA6E3, 0x2549, + 0xA6E4, 0x254A, 0xA741, 0xCB0B, 0xA742, 0xCB0C, 0xA743, 0xCB0D, 0xA744, 0xCB0E, 0xA745, 0xCB0F, 0xA746, 0xCB11, 0xA747, 0xCB12, + 0xA748, 0xCB13, 0xA749, 0xCB15, 0xA74A, 0xCB16, 0xA74B, 0xCB17, 0xA74C, 0xCB19, 0xA74D, 0xCB1A, 0xA74E, 0xCB1B, 0xA74F, 0xCB1C, + 0xA750, 0xCB1D, 0xA751, 0xCB1E, 0xA752, 0xCB1F, 0xA753, 0xCB22, 0xA754, 0xCB23, 0xA755, 0xCB24, 0xA756, 0xCB25, 0xA757, 0xCB26, + 0xA758, 0xCB27, 0xA759, 0xCB28, 0xA75A, 0xCB29, 0xA761, 0xCB2A, 0xA762, 0xCB2B, 0xA763, 0xCB2C, 0xA764, 0xCB2D, 0xA765, 0xCB2E, + 0xA766, 0xCB2F, 0xA767, 0xCB30, 0xA768, 0xCB31, 0xA769, 0xCB32, 0xA76A, 0xCB33, 0xA76B, 0xCB34, 0xA76C, 0xCB35, 0xA76D, 0xCB36, + 0xA76E, 0xCB37, 0xA76F, 0xCB38, 0xA770, 0xCB39, 0xA771, 0xCB3A, 0xA772, 0xCB3B, 0xA773, 0xCB3C, 0xA774, 0xCB3D, 0xA775, 0xCB3E, + 0xA776, 0xCB3F, 0xA777, 0xCB40, 0xA778, 0xCB42, 0xA779, 0xCB43, 0xA77A, 0xCB44, 0xA781, 0xCB45, 0xA782, 0xCB46, 0xA783, 0xCB47, + 0xA784, 0xCB4A, 0xA785, 0xCB4B, 0xA786, 0xCB4D, 0xA787, 0xCB4E, 0xA788, 0xCB4F, 0xA789, 0xCB51, 0xA78A, 0xCB52, 0xA78B, 0xCB53, + 0xA78C, 0xCB54, 0xA78D, 0xCB55, 0xA78E, 0xCB56, 0xA78F, 0xCB57, 0xA790, 0xCB5A, 0xA791, 0xCB5B, 0xA792, 0xCB5C, 0xA793, 0xCB5E, + 0xA794, 0xCB5F, 0xA795, 0xCB60, 0xA796, 0xCB61, 0xA797, 0xCB62, 0xA798, 0xCB63, 0xA799, 0xCB65, 0xA79A, 0xCB66, 0xA79B, 0xCB67, + 0xA79C, 0xCB68, 0xA79D, 0xCB69, 0xA79E, 0xCB6A, 0xA79F, 0xCB6B, 0xA7A0, 0xCB6C, 0xA7A1, 0x3395, 0xA7A2, 0x3396, 0xA7A3, 0x3397, + 0xA7A4, 0x2113, 0xA7A5, 0x3398, 0xA7A6, 0x33C4, 0xA7A7, 0x33A3, 0xA7A8, 0x33A4, 0xA7A9, 0x33A5, 0xA7AA, 0x33A6, 0xA7AB, 0x3399, + 0xA7AC, 0x339A, 0xA7AD, 0x339B, 0xA7AE, 0x339C, 0xA7AF, 0x339D, 0xA7B0, 0x339E, 0xA7B1, 0x339F, 0xA7B2, 0x33A0, 0xA7B3, 0x33A1, + 0xA7B4, 0x33A2, 0xA7B5, 0x33CA, 0xA7B6, 0x338D, 0xA7B7, 0x338E, 0xA7B8, 0x338F, 0xA7B9, 0x33CF, 0xA7BA, 0x3388, 0xA7BB, 0x3389, + 0xA7BC, 0x33C8, 0xA7BD, 0x33A7, 0xA7BE, 0x33A8, 0xA7BF, 0x33B0, 0xA7C0, 0x33B1, 0xA7C1, 0x33B2, 0xA7C2, 0x33B3, 0xA7C3, 0x33B4, + 0xA7C4, 0x33B5, 0xA7C5, 0x33B6, 0xA7C6, 0x33B7, 0xA7C7, 0x33B8, 0xA7C8, 0x33B9, 0xA7C9, 0x3380, 0xA7CA, 0x3381, 0xA7CB, 0x3382, + 0xA7CC, 0x3383, 0xA7CD, 0x3384, 0xA7CE, 0x33BA, 0xA7CF, 0x33BB, 0xA7D0, 0x33BC, 0xA7D1, 0x33BD, 0xA7D2, 0x33BE, 0xA7D3, 0x33BF, + 0xA7D4, 0x3390, 0xA7D5, 0x3391, 0xA7D6, 0x3392, 0xA7D7, 0x3393, 0xA7D8, 0x3394, 0xA7D9, 0x2126, 0xA7DA, 0x33C0, 0xA7DB, 0x33C1, + 0xA7DC, 0x338A, 0xA7DD, 0x338B, 0xA7DE, 0x338C, 0xA7DF, 0x33D6, 0xA7E0, 0x33C5, 0xA7E1, 0x33AD, 0xA7E2, 0x33AE, 0xA7E3, 0x33AF, + 0xA7E4, 0x33DB, 0xA7E5, 0x33A9, 0xA7E6, 0x33AA, 0xA7E7, 0x33AB, 0xA7E8, 0x33AC, 0xA7E9, 0x33DD, 0xA7EA, 0x33D0, 0xA7EB, 0x33D3, + 0xA7EC, 0x33C3, 0xA7ED, 0x33C9, 0xA7EE, 0x33DC, 0xA7EF, 0x33C6, 0xA841, 0xCB6D, 0xA842, 0xCB6E, 0xA843, 0xCB6F, 0xA844, 0xCB70, + 0xA845, 0xCB71, 0xA846, 0xCB72, 0xA847, 0xCB73, 0xA848, 0xCB74, 0xA849, 0xCB75, 0xA84A, 0xCB76, 0xA84B, 0xCB77, 0xA84C, 0xCB7A, + 0xA84D, 0xCB7B, 0xA84E, 0xCB7C, 0xA84F, 0xCB7D, 0xA850, 0xCB7E, 0xA851, 0xCB7F, 0xA852, 0xCB80, 0xA853, 0xCB81, 0xA854, 0xCB82, + 0xA855, 0xCB83, 0xA856, 0xCB84, 0xA857, 0xCB85, 0xA858, 0xCB86, 0xA859, 0xCB87, 0xA85A, 0xCB88, 0xA861, 0xCB89, 0xA862, 0xCB8A, + 0xA863, 0xCB8B, 0xA864, 0xCB8C, 0xA865, 0xCB8D, 0xA866, 0xCB8E, 0xA867, 0xCB8F, 0xA868, 0xCB90, 0xA869, 0xCB91, 0xA86A, 0xCB92, + 0xA86B, 0xCB93, 0xA86C, 0xCB94, 0xA86D, 0xCB95, 0xA86E, 0xCB96, 0xA86F, 0xCB97, 0xA870, 0xCB98, 0xA871, 0xCB99, 0xA872, 0xCB9A, + 0xA873, 0xCB9B, 0xA874, 0xCB9D, 0xA875, 0xCB9E, 0xA876, 0xCB9F, 0xA877, 0xCBA0, 0xA878, 0xCBA1, 0xA879, 0xCBA2, 0xA87A, 0xCBA3, + 0xA881, 0xCBA4, 0xA882, 0xCBA5, 0xA883, 0xCBA6, 0xA884, 0xCBA7, 0xA885, 0xCBA8, 0xA886, 0xCBA9, 0xA887, 0xCBAA, 0xA888, 0xCBAB, + 0xA889, 0xCBAC, 0xA88A, 0xCBAD, 0xA88B, 0xCBAE, 0xA88C, 0xCBAF, 0xA88D, 0xCBB0, 0xA88E, 0xCBB1, 0xA88F, 0xCBB2, 0xA890, 0xCBB3, + 0xA891, 0xCBB4, 0xA892, 0xCBB5, 0xA893, 0xCBB6, 0xA894, 0xCBB7, 0xA895, 0xCBB9, 0xA896, 0xCBBA, 0xA897, 0xCBBB, 0xA898, 0xCBBC, + 0xA899, 0xCBBD, 0xA89A, 0xCBBE, 0xA89B, 0xCBBF, 0xA89C, 0xCBC0, 0xA89D, 0xCBC1, 0xA89E, 0xCBC2, 0xA89F, 0xCBC3, 0xA8A0, 0xCBC4, + 0xA8A1, 0x00C6, 0xA8A2, 0x00D0, 0xA8A3, 0x00AA, 0xA8A4, 0x0126, 0xA8A6, 0x0132, 0xA8A8, 0x013F, 0xA8A9, 0x0141, 0xA8AA, 0x00D8, + 0xA8AB, 0x0152, 0xA8AC, 0x00BA, 0xA8AD, 0x00DE, 0xA8AE, 0x0166, 0xA8AF, 0x014A, 0xA8B1, 0x3260, 0xA8B2, 0x3261, 0xA8B3, 0x3262, + 0xA8B4, 0x3263, 0xA8B5, 0x3264, 0xA8B6, 0x3265, 0xA8B7, 0x3266, 0xA8B8, 0x3267, 0xA8B9, 0x3268, 0xA8BA, 0x3269, 0xA8BB, 0x326A, + 0xA8BC, 0x326B, 0xA8BD, 0x326C, 0xA8BE, 0x326D, 0xA8BF, 0x326E, 0xA8C0, 0x326F, 0xA8C1, 0x3270, 0xA8C2, 0x3271, 0xA8C3, 0x3272, + 0xA8C4, 0x3273, 0xA8C5, 0x3274, 0xA8C6, 0x3275, 0xA8C7, 0x3276, 0xA8C8, 0x3277, 0xA8C9, 0x3278, 0xA8CA, 0x3279, 0xA8CB, 0x327A, + 0xA8CC, 0x327B, 0xA8CD, 0x24D0, 0xA8CE, 0x24D1, 0xA8CF, 0x24D2, 0xA8D0, 0x24D3, 0xA8D1, 0x24D4, 0xA8D2, 0x24D5, 0xA8D3, 0x24D6, + 0xA8D4, 0x24D7, 0xA8D5, 0x24D8, 0xA8D6, 0x24D9, 0xA8D7, 0x24DA, 0xA8D8, 0x24DB, 0xA8D9, 0x24DC, 0xA8DA, 0x24DD, 0xA8DB, 0x24DE, + 0xA8DC, 0x24DF, 0xA8DD, 0x24E0, 0xA8DE, 0x24E1, 0xA8DF, 0x24E2, 0xA8E0, 0x24E3, 0xA8E1, 0x24E4, 0xA8E2, 0x24E5, 0xA8E3, 0x24E6, + 0xA8E4, 0x24E7, 0xA8E5, 0x24E8, 0xA8E6, 0x24E9, 0xA8E7, 0x2460, 0xA8E8, 0x2461, 0xA8E9, 0x2462, 0xA8EA, 0x2463, 0xA8EB, 0x2464, + 0xA8EC, 0x2465, 0xA8ED, 0x2466, 0xA8EE, 0x2467, 0xA8EF, 0x2468, 0xA8F0, 0x2469, 0xA8F1, 0x246A, 0xA8F2, 0x246B, 0xA8F3, 0x246C, + 0xA8F4, 0x246D, 0xA8F5, 0x246E, 0xA8F6, 0x00BD, 0xA8F7, 0x2153, 0xA8F8, 0x2154, 0xA8F9, 0x00BC, 0xA8FA, 0x00BE, 0xA8FB, 0x215B, + 0xA8FC, 0x215C, 0xA8FD, 0x215D, 0xA8FE, 0x215E, 0xA941, 0xCBC5, 0xA942, 0xCBC6, 0xA943, 0xCBC7, 0xA944, 0xCBC8, 0xA945, 0xCBC9, + 0xA946, 0xCBCA, 0xA947, 0xCBCB, 0xA948, 0xCBCC, 0xA949, 0xCBCD, 0xA94A, 0xCBCE, 0xA94B, 0xCBCF, 0xA94C, 0xCBD0, 0xA94D, 0xCBD1, + 0xA94E, 0xCBD2, 0xA94F, 0xCBD3, 0xA950, 0xCBD5, 0xA951, 0xCBD6, 0xA952, 0xCBD7, 0xA953, 0xCBD8, 0xA954, 0xCBD9, 0xA955, 0xCBDA, + 0xA956, 0xCBDB, 0xA957, 0xCBDC, 0xA958, 0xCBDD, 0xA959, 0xCBDE, 0xA95A, 0xCBDF, 0xA961, 0xCBE0, 0xA962, 0xCBE1, 0xA963, 0xCBE2, + 0xA964, 0xCBE3, 0xA965, 0xCBE5, 0xA966, 0xCBE6, 0xA967, 0xCBE8, 0xA968, 0xCBEA, 0xA969, 0xCBEB, 0xA96A, 0xCBEC, 0xA96B, 0xCBED, + 0xA96C, 0xCBEE, 0xA96D, 0xCBEF, 0xA96E, 0xCBF0, 0xA96F, 0xCBF1, 0xA970, 0xCBF2, 0xA971, 0xCBF3, 0xA972, 0xCBF4, 0xA973, 0xCBF5, + 0xA974, 0xCBF6, 0xA975, 0xCBF7, 0xA976, 0xCBF8, 0xA977, 0xCBF9, 0xA978, 0xCBFA, 0xA979, 0xCBFB, 0xA97A, 0xCBFC, 0xA981, 0xCBFD, + 0xA982, 0xCBFE, 0xA983, 0xCBFF, 0xA984, 0xCC00, 0xA985, 0xCC01, 0xA986, 0xCC02, 0xA987, 0xCC03, 0xA988, 0xCC04, 0xA989, 0xCC05, + 0xA98A, 0xCC06, 0xA98B, 0xCC07, 0xA98C, 0xCC08, 0xA98D, 0xCC09, 0xA98E, 0xCC0A, 0xA98F, 0xCC0B, 0xA990, 0xCC0E, 0xA991, 0xCC0F, + 0xA992, 0xCC11, 0xA993, 0xCC12, 0xA994, 0xCC13, 0xA995, 0xCC15, 0xA996, 0xCC16, 0xA997, 0xCC17, 0xA998, 0xCC18, 0xA999, 0xCC19, + 0xA99A, 0xCC1A, 0xA99B, 0xCC1B, 0xA99C, 0xCC1E, 0xA99D, 0xCC1F, 0xA99E, 0xCC20, 0xA99F, 0xCC23, 0xA9A0, 0xCC24, 0xA9A1, 0x00E6, + 0xA9A2, 0x0111, 0xA9A3, 0x00F0, 0xA9A4, 0x0127, 0xA9A5, 0x0131, 0xA9A6, 0x0133, 0xA9A7, 0x0138, 0xA9A8, 0x0140, 0xA9A9, 0x0142, + 0xA9AA, 0x00F8, 0xA9AB, 0x0153, 0xA9AC, 0x00DF, 0xA9AD, 0x00FE, 0xA9AE, 0x0167, 0xA9AF, 0x014B, 0xA9B0, 0x0149, 0xA9B1, 0x3200, + 0xA9B2, 0x3201, 0xA9B3, 0x3202, 0xA9B4, 0x3203, 0xA9B5, 0x3204, 0xA9B6, 0x3205, 0xA9B7, 0x3206, 0xA9B8, 0x3207, 0xA9B9, 0x3208, + 0xA9BA, 0x3209, 0xA9BB, 0x320A, 0xA9BC, 0x320B, 0xA9BD, 0x320C, 0xA9BE, 0x320D, 0xA9BF, 0x320E, 0xA9C0, 0x320F, 0xA9C1, 0x3210, + 0xA9C2, 0x3211, 0xA9C3, 0x3212, 0xA9C4, 0x3213, 0xA9C5, 0x3214, 0xA9C6, 0x3215, 0xA9C7, 0x3216, 0xA9C8, 0x3217, 0xA9C9, 0x3218, + 0xA9CA, 0x3219, 0xA9CB, 0x321A, 0xA9CC, 0x321B, 0xA9CD, 0x249C, 0xA9CE, 0x249D, 0xA9CF, 0x249E, 0xA9D0, 0x249F, 0xA9D1, 0x24A0, + 0xA9D2, 0x24A1, 0xA9D3, 0x24A2, 0xA9D4, 0x24A3, 0xA9D5, 0x24A4, 0xA9D6, 0x24A5, 0xA9D7, 0x24A6, 0xA9D8, 0x24A7, 0xA9D9, 0x24A8, + 0xA9DA, 0x24A9, 0xA9DB, 0x24AA, 0xA9DC, 0x24AB, 0xA9DD, 0x24AC, 0xA9DE, 0x24AD, 0xA9DF, 0x24AE, 0xA9E0, 0x24AF, 0xA9E1, 0x24B0, + 0xA9E2, 0x24B1, 0xA9E3, 0x24B2, 0xA9E4, 0x24B3, 0xA9E5, 0x24B4, 0xA9E6, 0x24B5, 0xA9E7, 0x2474, 0xA9E8, 0x2475, 0xA9E9, 0x2476, + 0xA9EA, 0x2477, 0xA9EB, 0x2478, 0xA9EC, 0x2479, 0xA9ED, 0x247A, 0xA9EE, 0x247B, 0xA9EF, 0x247C, 0xA9F0, 0x247D, 0xA9F1, 0x247E, + 0xA9F2, 0x247F, 0xA9F3, 0x2480, 0xA9F4, 0x2481, 0xA9F5, 0x2482, 0xA9F6, 0x00B9, 0xA9F7, 0x00B2, 0xA9F8, 0x00B3, 0xA9F9, 0x2074, + 0xA9FA, 0x207F, 0xA9FB, 0x2081, 0xA9FC, 0x2082, 0xA9FD, 0x2083, 0xA9FE, 0x2084, 0xAA41, 0xCC25, 0xAA42, 0xCC26, 0xAA43, 0xCC2A, + 0xAA44, 0xCC2B, 0xAA45, 0xCC2D, 0xAA46, 0xCC2F, 0xAA47, 0xCC31, 0xAA48, 0xCC32, 0xAA49, 0xCC33, 0xAA4A, 0xCC34, 0xAA4B, 0xCC35, + 0xAA4C, 0xCC36, 0xAA4D, 0xCC37, 0xAA4E, 0xCC3A, 0xAA4F, 0xCC3F, 0xAA50, 0xCC40, 0xAA51, 0xCC41, 0xAA52, 0xCC42, 0xAA53, 0xCC43, + 0xAA54, 0xCC46, 0xAA55, 0xCC47, 0xAA56, 0xCC49, 0xAA57, 0xCC4A, 0xAA58, 0xCC4B, 0xAA59, 0xCC4D, 0xAA5A, 0xCC4E, 0xAA61, 0xCC4F, + 0xAA62, 0xCC50, 0xAA63, 0xCC51, 0xAA64, 0xCC52, 0xAA65, 0xCC53, 0xAA66, 0xCC56, 0xAA67, 0xCC5A, 0xAA68, 0xCC5B, 0xAA69, 0xCC5C, + 0xAA6A, 0xCC5D, 0xAA6B, 0xCC5E, 0xAA6C, 0xCC5F, 0xAA6D, 0xCC61, 0xAA6E, 0xCC62, 0xAA6F, 0xCC63, 0xAA70, 0xCC65, 0xAA71, 0xCC67, + 0xAA72, 0xCC69, 0xAA73, 0xCC6A, 0xAA74, 0xCC6B, 0xAA75, 0xCC6C, 0xAA76, 0xCC6D, 0xAA77, 0xCC6E, 0xAA78, 0xCC6F, 0xAA79, 0xCC71, + 0xAA7A, 0xCC72, 0xAA81, 0xCC73, 0xAA82, 0xCC74, 0xAA83, 0xCC76, 0xAA84, 0xCC77, 0xAA85, 0xCC78, 0xAA86, 0xCC79, 0xAA87, 0xCC7A, + 0xAA88, 0xCC7B, 0xAA89, 0xCC7C, 0xAA8A, 0xCC7D, 0xAA8B, 0xCC7E, 0xAA8C, 0xCC7F, 0xAA8D, 0xCC80, 0xAA8E, 0xCC81, 0xAA8F, 0xCC82, + 0xAA90, 0xCC83, 0xAA91, 0xCC84, 0xAA92, 0xCC85, 0xAA93, 0xCC86, 0xAA94, 0xCC87, 0xAA95, 0xCC88, 0xAA96, 0xCC89, 0xAA97, 0xCC8A, + 0xAA98, 0xCC8B, 0xAA99, 0xCC8C, 0xAA9A, 0xCC8D, 0xAA9B, 0xCC8E, 0xAA9C, 0xCC8F, 0xAA9D, 0xCC90, 0xAA9E, 0xCC91, 0xAA9F, 0xCC92, + 0xAAA0, 0xCC93, 0xAAA1, 0x3041, 0xAAA2, 0x3042, 0xAAA3, 0x3043, 0xAAA4, 0x3044, 0xAAA5, 0x3045, 0xAAA6, 0x3046, 0xAAA7, 0x3047, + 0xAAA8, 0x3048, 0xAAA9, 0x3049, 0xAAAA, 0x304A, 0xAAAB, 0x304B, 0xAAAC, 0x304C, 0xAAAD, 0x304D, 0xAAAE, 0x304E, 0xAAAF, 0x304F, + 0xAAB0, 0x3050, 0xAAB1, 0x3051, 0xAAB2, 0x3052, 0xAAB3, 0x3053, 0xAAB4, 0x3054, 0xAAB5, 0x3055, 0xAAB6, 0x3056, 0xAAB7, 0x3057, + 0xAAB8, 0x3058, 0xAAB9, 0x3059, 0xAABA, 0x305A, 0xAABB, 0x305B, 0xAABC, 0x305C, 0xAABD, 0x305D, 0xAABE, 0x305E, 0xAABF, 0x305F, + 0xAAC0, 0x3060, 0xAAC1, 0x3061, 0xAAC2, 0x3062, 0xAAC3, 0x3063, 0xAAC4, 0x3064, 0xAAC5, 0x3065, 0xAAC6, 0x3066, 0xAAC7, 0x3067, + 0xAAC8, 0x3068, 0xAAC9, 0x3069, 0xAACA, 0x306A, 0xAACB, 0x306B, 0xAACC, 0x306C, 0xAACD, 0x306D, 0xAACE, 0x306E, 0xAACF, 0x306F, + 0xAAD0, 0x3070, 0xAAD1, 0x3071, 0xAAD2, 0x3072, 0xAAD3, 0x3073, 0xAAD4, 0x3074, 0xAAD5, 0x3075, 0xAAD6, 0x3076, 0xAAD7, 0x3077, + 0xAAD8, 0x3078, 0xAAD9, 0x3079, 0xAADA, 0x307A, 0xAADB, 0x307B, 0xAADC, 0x307C, 0xAADD, 0x307D, 0xAADE, 0x307E, 0xAADF, 0x307F, + 0xAAE0, 0x3080, 0xAAE1, 0x3081, 0xAAE2, 0x3082, 0xAAE3, 0x3083, 0xAAE4, 0x3084, 0xAAE5, 0x3085, 0xAAE6, 0x3086, 0xAAE7, 0x3087, + 0xAAE8, 0x3088, 0xAAE9, 0x3089, 0xAAEA, 0x308A, 0xAAEB, 0x308B, 0xAAEC, 0x308C, 0xAAED, 0x308D, 0xAAEE, 0x308E, 0xAAEF, 0x308F, + 0xAAF0, 0x3090, 0xAAF1, 0x3091, 0xAAF2, 0x3092, 0xAAF3, 0x3093, 0xAB41, 0xCC94, 0xAB42, 0xCC95, 0xAB43, 0xCC96, 0xAB44, 0xCC97, + 0xAB45, 0xCC9A, 0xAB46, 0xCC9B, 0xAB47, 0xCC9D, 0xAB48, 0xCC9E, 0xAB49, 0xCC9F, 0xAB4A, 0xCCA1, 0xAB4B, 0xCCA2, 0xAB4C, 0xCCA3, + 0xAB4D, 0xCCA4, 0xAB4E, 0xCCA5, 0xAB4F, 0xCCA6, 0xAB50, 0xCCA7, 0xAB51, 0xCCAA, 0xAB52, 0xCCAE, 0xAB53, 0xCCAF, 0xAB54, 0xCCB0, + 0xAB55, 0xCCB1, 0xAB56, 0xCCB2, 0xAB57, 0xCCB3, 0xAB58, 0xCCB6, 0xAB59, 0xCCB7, 0xAB5A, 0xCCB9, 0xAB61, 0xCCBA, 0xAB62, 0xCCBB, + 0xAB63, 0xCCBD, 0xAB64, 0xCCBE, 0xAB65, 0xCCBF, 0xAB66, 0xCCC0, 0xAB67, 0xCCC1, 0xAB68, 0xCCC2, 0xAB69, 0xCCC3, 0xAB6A, 0xCCC6, + 0xAB6B, 0xCCC8, 0xAB6C, 0xCCCA, 0xAB6D, 0xCCCB, 0xAB6E, 0xCCCC, 0xAB6F, 0xCCCD, 0xAB70, 0xCCCE, 0xAB71, 0xCCCF, 0xAB72, 0xCCD1, + 0xAB73, 0xCCD2, 0xAB74, 0xCCD3, 0xAB75, 0xCCD5, 0xAB76, 0xCCD6, 0xAB77, 0xCCD7, 0xAB78, 0xCCD8, 0xAB79, 0xCCD9, 0xAB7A, 0xCCDA, + 0xAB81, 0xCCDB, 0xAB82, 0xCCDC, 0xAB83, 0xCCDD, 0xAB84, 0xCCDE, 0xAB85, 0xCCDF, 0xAB86, 0xCCE0, 0xAB87, 0xCCE1, 0xAB88, 0xCCE2, + 0xAB89, 0xCCE3, 0xAB8A, 0xCCE5, 0xAB8B, 0xCCE6, 0xAB8C, 0xCCE7, 0xAB8D, 0xCCE8, 0xAB8E, 0xCCE9, 0xAB8F, 0xCCEA, 0xAB90, 0xCCEB, + 0xAB91, 0xCCED, 0xAB92, 0xCCEE, 0xAB93, 0xCCEF, 0xAB94, 0xCCF1, 0xAB95, 0xCCF2, 0xAB96, 0xCCF3, 0xAB97, 0xCCF4, 0xAB98, 0xCCF5, + 0xAB99, 0xCCF6, 0xAB9A, 0xCCF7, 0xAB9B, 0xCCF8, 0xAB9C, 0xCCF9, 0xAB9D, 0xCCFA, 0xAB9E, 0xCCFB, 0xAB9F, 0xCCFC, 0xABA0, 0xCCFD, + 0xABA1, 0x30A1, 0xABA2, 0x30A2, 0xABA3, 0x30A3, 0xABA4, 0x30A4, 0xABA5, 0x30A5, 0xABA6, 0x30A6, 0xABA7, 0x30A7, 0xABA8, 0x30A8, + 0xABA9, 0x30A9, 0xABAA, 0x30AA, 0xABAB, 0x30AB, 0xABAC, 0x30AC, 0xABAD, 0x30AD, 0xABAE, 0x30AE, 0xABAF, 0x30AF, 0xABB0, 0x30B0, + 0xABB1, 0x30B1, 0xABB2, 0x30B2, 0xABB3, 0x30B3, 0xABB4, 0x30B4, 0xABB5, 0x30B5, 0xABB6, 0x30B6, 0xABB7, 0x30B7, 0xABB8, 0x30B8, + 0xABB9, 0x30B9, 0xABBA, 0x30BA, 0xABBB, 0x30BB, 0xABBC, 0x30BC, 0xABBD, 0x30BD, 0xABBE, 0x30BE, 0xABBF, 0x30BF, 0xABC0, 0x30C0, + 0xABC1, 0x30C1, 0xABC2, 0x30C2, 0xABC3, 0x30C3, 0xABC4, 0x30C4, 0xABC5, 0x30C5, 0xABC6, 0x30C6, 0xABC7, 0x30C7, 0xABC8, 0x30C8, + 0xABC9, 0x30C9, 0xABCA, 0x30CA, 0xABCB, 0x30CB, 0xABCC, 0x30CC, 0xABCD, 0x30CD, 0xABCE, 0x30CE, 0xABCF, 0x30CF, 0xABD0, 0x30D0, + 0xABD1, 0x30D1, 0xABD2, 0x30D2, 0xABD3, 0x30D3, 0xABD4, 0x30D4, 0xABD5, 0x30D5, 0xABD6, 0x30D6, 0xABD7, 0x30D7, 0xABD8, 0x30D8, + 0xABD9, 0x30D9, 0xABDA, 0x30DA, 0xABDB, 0x30DB, 0xABDC, 0x30DC, 0xABDD, 0x30DD, 0xABDE, 0x30DE, 0xABDF, 0x30DF, 0xABE0, 0x30E0, + 0xABE1, 0x30E1, 0xABE2, 0x30E2, 0xABE3, 0x30E3, 0xABE4, 0x30E4, 0xABE5, 0x30E5, 0xABE6, 0x30E6, 0xABE7, 0x30E7, 0xABE8, 0x30E8, + 0xABE9, 0x30E9, 0xABEA, 0x30EA, 0xABEB, 0x30EB, 0xABEC, 0x30EC, 0xABED, 0x30ED, 0xABEE, 0x30EE, 0xABEF, 0x30EF, 0xABF0, 0x30F0, + 0xABF1, 0x30F1, 0xABF2, 0x30F2, 0xABF3, 0x30F3, 0xABF4, 0x30F4, 0xABF5, 0x30F5, 0xABF6, 0x30F6, 0xAC41, 0xCCFE, 0xAC42, 0xCCFF, + 0xAC43, 0xCD00, 0xAC44, 0xCD02, 0xAC45, 0xCD03, 0xAC46, 0xCD04, 0xAC47, 0xCD05, 0xAC48, 0xCD06, 0xAC49, 0xCD07, 0xAC4A, 0xCD0A, + 0xAC4B, 0xCD0B, 0xAC4C, 0xCD0D, 0xAC4D, 0xCD0E, 0xAC4E, 0xCD0F, 0xAC4F, 0xCD11, 0xAC50, 0xCD12, 0xAC51, 0xCD13, 0xAC52, 0xCD14, + 0xAC53, 0xCD15, 0xAC54, 0xCD16, 0xAC55, 0xCD17, 0xAC56, 0xCD1A, 0xAC57, 0xCD1C, 0xAC58, 0xCD1E, 0xAC59, 0xCD1F, 0xAC5A, 0xCD20, + 0xAC61, 0xCD21, 0xAC62, 0xCD22, 0xAC63, 0xCD23, 0xAC64, 0xCD25, 0xAC65, 0xCD26, 0xAC66, 0xCD27, 0xAC67, 0xCD29, 0xAC68, 0xCD2A, + 0xAC69, 0xCD2B, 0xAC6A, 0xCD2D, 0xAC6B, 0xCD2E, 0xAC6C, 0xCD2F, 0xAC6D, 0xCD30, 0xAC6E, 0xCD31, 0xAC6F, 0xCD32, 0xAC70, 0xCD33, + 0xAC71, 0xCD34, 0xAC72, 0xCD35, 0xAC73, 0xCD36, 0xAC74, 0xCD37, 0xAC75, 0xCD38, 0xAC76, 0xCD3A, 0xAC77, 0xCD3B, 0xAC78, 0xCD3C, + 0xAC79, 0xCD3D, 0xAC7A, 0xCD3E, 0xAC81, 0xCD3F, 0xAC82, 0xCD40, 0xAC83, 0xCD41, 0xAC84, 0xCD42, 0xAC85, 0xCD43, 0xAC86, 0xCD44, + 0xAC87, 0xCD45, 0xAC88, 0xCD46, 0xAC89, 0xCD47, 0xAC8A, 0xCD48, 0xAC8B, 0xCD49, 0xAC8C, 0xCD4A, 0xAC8D, 0xCD4B, 0xAC8E, 0xCD4C, + 0xAC8F, 0xCD4D, 0xAC90, 0xCD4E, 0xAC91, 0xCD4F, 0xAC92, 0xCD50, 0xAC93, 0xCD51, 0xAC94, 0xCD52, 0xAC95, 0xCD53, 0xAC96, 0xCD54, + 0xAC97, 0xCD55, 0xAC98, 0xCD56, 0xAC99, 0xCD57, 0xAC9A, 0xCD58, 0xAC9B, 0xCD59, 0xAC9C, 0xCD5A, 0xAC9D, 0xCD5B, 0xAC9E, 0xCD5D, + 0xAC9F, 0xCD5E, 0xACA0, 0xCD5F, 0xACA1, 0x0410, 0xACA2, 0x0411, 0xACA3, 0x0412, 0xACA4, 0x0413, 0xACA5, 0x0414, 0xACA6, 0x0415, + 0xACA7, 0x0401, 0xACA8, 0x0416, 0xACA9, 0x0417, 0xACAA, 0x0418, 0xACAB, 0x0419, 0xACAC, 0x041A, 0xACAD, 0x041B, 0xACAE, 0x041C, + 0xACAF, 0x041D, 0xACB0, 0x041E, 0xACB1, 0x041F, 0xACB2, 0x0420, 0xACB3, 0x0421, 0xACB4, 0x0422, 0xACB5, 0x0423, 0xACB6, 0x0424, + 0xACB7, 0x0425, 0xACB8, 0x0426, 0xACB9, 0x0427, 0xACBA, 0x0428, 0xACBB, 0x0429, 0xACBC, 0x042A, 0xACBD, 0x042B, 0xACBE, 0x042C, + 0xACBF, 0x042D, 0xACC0, 0x042E, 0xACC1, 0x042F, 0xACD1, 0x0430, 0xACD2, 0x0431, 0xACD3, 0x0432, 0xACD4, 0x0433, 0xACD5, 0x0434, + 0xACD6, 0x0435, 0xACD7, 0x0451, 0xACD8, 0x0436, 0xACD9, 0x0437, 0xACDA, 0x0438, 0xACDB, 0x0439, 0xACDC, 0x043A, 0xACDD, 0x043B, + 0xACDE, 0x043C, 0xACDF, 0x043D, 0xACE0, 0x043E, 0xACE1, 0x043F, 0xACE2, 0x0440, 0xACE3, 0x0441, 0xACE4, 0x0442, 0xACE5, 0x0443, + 0xACE6, 0x0444, 0xACE7, 0x0445, 0xACE8, 0x0446, 0xACE9, 0x0447, 0xACEA, 0x0448, 0xACEB, 0x0449, 0xACEC, 0x044A, 0xACED, 0x044B, + 0xACEE, 0x044C, 0xACEF, 0x044D, 0xACF0, 0x044E, 0xACF1, 0x044F, 0xAD41, 0xCD61, 0xAD42, 0xCD62, 0xAD43, 0xCD63, 0xAD44, 0xCD65, + 0xAD45, 0xCD66, 0xAD46, 0xCD67, 0xAD47, 0xCD68, 0xAD48, 0xCD69, 0xAD49, 0xCD6A, 0xAD4A, 0xCD6B, 0xAD4B, 0xCD6E, 0xAD4C, 0xCD70, + 0xAD4D, 0xCD72, 0xAD4E, 0xCD73, 0xAD4F, 0xCD74, 0xAD50, 0xCD75, 0xAD51, 0xCD76, 0xAD52, 0xCD77, 0xAD53, 0xCD79, 0xAD54, 0xCD7A, + 0xAD55, 0xCD7B, 0xAD56, 0xCD7C, 0xAD57, 0xCD7D, 0xAD58, 0xCD7E, 0xAD59, 0xCD7F, 0xAD5A, 0xCD80, 0xAD61, 0xCD81, 0xAD62, 0xCD82, + 0xAD63, 0xCD83, 0xAD64, 0xCD84, 0xAD65, 0xCD85, 0xAD66, 0xCD86, 0xAD67, 0xCD87, 0xAD68, 0xCD89, 0xAD69, 0xCD8A, 0xAD6A, 0xCD8B, + 0xAD6B, 0xCD8C, 0xAD6C, 0xCD8D, 0xAD6D, 0xCD8E, 0xAD6E, 0xCD8F, 0xAD6F, 0xCD90, 0xAD70, 0xCD91, 0xAD71, 0xCD92, 0xAD72, 0xCD93, + 0xAD73, 0xCD96, 0xAD74, 0xCD97, 0xAD75, 0xCD99, 0xAD76, 0xCD9A, 0xAD77, 0xCD9B, 0xAD78, 0xCD9D, 0xAD79, 0xCD9E, 0xAD7A, 0xCD9F, + 0xAD81, 0xCDA0, 0xAD82, 0xCDA1, 0xAD83, 0xCDA2, 0xAD84, 0xCDA3, 0xAD85, 0xCDA6, 0xAD86, 0xCDA8, 0xAD87, 0xCDAA, 0xAD88, 0xCDAB, + 0xAD89, 0xCDAC, 0xAD8A, 0xCDAD, 0xAD8B, 0xCDAE, 0xAD8C, 0xCDAF, 0xAD8D, 0xCDB1, 0xAD8E, 0xCDB2, 0xAD8F, 0xCDB3, 0xAD90, 0xCDB4, + 0xAD91, 0xCDB5, 0xAD92, 0xCDB6, 0xAD93, 0xCDB7, 0xAD94, 0xCDB8, 0xAD95, 0xCDB9, 0xAD96, 0xCDBA, 0xAD97, 0xCDBB, 0xAD98, 0xCDBC, + 0xAD99, 0xCDBD, 0xAD9A, 0xCDBE, 0xAD9B, 0xCDBF, 0xAD9C, 0xCDC0, 0xAD9D, 0xCDC1, 0xAD9E, 0xCDC2, 0xAD9F, 0xCDC3, 0xADA0, 0xCDC5, + 0xAE41, 0xCDC6, 0xAE42, 0xCDC7, 0xAE43, 0xCDC8, 0xAE44, 0xCDC9, 0xAE45, 0xCDCA, 0xAE46, 0xCDCB, 0xAE47, 0xCDCD, 0xAE48, 0xCDCE, + 0xAE49, 0xCDCF, 0xAE4A, 0xCDD1, 0xAE4B, 0xCDD2, 0xAE4C, 0xCDD3, 0xAE4D, 0xCDD4, 0xAE4E, 0xCDD5, 0xAE4F, 0xCDD6, 0xAE50, 0xCDD7, + 0xAE51, 0xCDD8, 0xAE52, 0xCDD9, 0xAE53, 0xCDDA, 0xAE54, 0xCDDB, 0xAE55, 0xCDDC, 0xAE56, 0xCDDD, 0xAE57, 0xCDDE, 0xAE58, 0xCDDF, + 0xAE59, 0xCDE0, 0xAE5A, 0xCDE1, 0xAE61, 0xCDE2, 0xAE62, 0xCDE3, 0xAE63, 0xCDE4, 0xAE64, 0xCDE5, 0xAE65, 0xCDE6, 0xAE66, 0xCDE7, + 0xAE67, 0xCDE9, 0xAE68, 0xCDEA, 0xAE69, 0xCDEB, 0xAE6A, 0xCDED, 0xAE6B, 0xCDEE, 0xAE6C, 0xCDEF, 0xAE6D, 0xCDF1, 0xAE6E, 0xCDF2, + 0xAE6F, 0xCDF3, 0xAE70, 0xCDF4, 0xAE71, 0xCDF5, 0xAE72, 0xCDF6, 0xAE73, 0xCDF7, 0xAE74, 0xCDFA, 0xAE75, 0xCDFC, 0xAE76, 0xCDFE, + 0xAE77, 0xCDFF, 0xAE78, 0xCE00, 0xAE79, 0xCE01, 0xAE7A, 0xCE02, 0xAE81, 0xCE03, 0xAE82, 0xCE05, 0xAE83, 0xCE06, 0xAE84, 0xCE07, + 0xAE85, 0xCE09, 0xAE86, 0xCE0A, 0xAE87, 0xCE0B, 0xAE88, 0xCE0D, 0xAE89, 0xCE0E, 0xAE8A, 0xCE0F, 0xAE8B, 0xCE10, 0xAE8C, 0xCE11, + 0xAE8D, 0xCE12, 0xAE8E, 0xCE13, 0xAE8F, 0xCE15, 0xAE90, 0xCE16, 0xAE91, 0xCE17, 0xAE92, 0xCE18, 0xAE93, 0xCE1A, 0xAE94, 0xCE1B, + 0xAE95, 0xCE1C, 0xAE96, 0xCE1D, 0xAE97, 0xCE1E, 0xAE98, 0xCE1F, 0xAE99, 0xCE22, 0xAE9A, 0xCE23, 0xAE9B, 0xCE25, 0xAE9C, 0xCE26, + 0xAE9D, 0xCE27, 0xAE9E, 0xCE29, 0xAE9F, 0xCE2A, 0xAEA0, 0xCE2B, 0xAF41, 0xCE2C, 0xAF42, 0xCE2D, 0xAF43, 0xCE2E, 0xAF44, 0xCE2F, + 0xAF45, 0xCE32, 0xAF46, 0xCE34, 0xAF47, 0xCE36, 0xAF48, 0xCE37, 0xAF49, 0xCE38, 0xAF4A, 0xCE39, 0xAF4B, 0xCE3A, 0xAF4C, 0xCE3B, + 0xAF4D, 0xCE3C, 0xAF4E, 0xCE3D, 0xAF4F, 0xCE3E, 0xAF50, 0xCE3F, 0xAF51, 0xCE40, 0xAF52, 0xCE41, 0xAF53, 0xCE42, 0xAF54, 0xCE43, + 0xAF55, 0xCE44, 0xAF56, 0xCE45, 0xAF57, 0xCE46, 0xAF58, 0xCE47, 0xAF59, 0xCE48, 0xAF5A, 0xCE49, 0xAF61, 0xCE4A, 0xAF62, 0xCE4B, + 0xAF63, 0xCE4C, 0xAF64, 0xCE4D, 0xAF65, 0xCE4E, 0xAF66, 0xCE4F, 0xAF67, 0xCE50, 0xAF68, 0xCE51, 0xAF69, 0xCE52, 0xAF6A, 0xCE53, + 0xAF6B, 0xCE54, 0xAF6C, 0xCE55, 0xAF6D, 0xCE56, 0xAF6E, 0xCE57, 0xAF6F, 0xCE5A, 0xAF70, 0xCE5B, 0xAF71, 0xCE5D, 0xAF72, 0xCE5E, + 0xAF73, 0xCE62, 0xAF74, 0xCE63, 0xAF75, 0xCE64, 0xAF76, 0xCE65, 0xAF77, 0xCE66, 0xAF78, 0xCE67, 0xAF79, 0xCE6A, 0xAF7A, 0xCE6C, + 0xAF81, 0xCE6E, 0xAF82, 0xCE6F, 0xAF83, 0xCE70, 0xAF84, 0xCE71, 0xAF85, 0xCE72, 0xAF86, 0xCE73, 0xAF87, 0xCE76, 0xAF88, 0xCE77, + 0xAF89, 0xCE79, 0xAF8A, 0xCE7A, 0xAF8B, 0xCE7B, 0xAF8C, 0xCE7D, 0xAF8D, 0xCE7E, 0xAF8E, 0xCE7F, 0xAF8F, 0xCE80, 0xAF90, 0xCE81, + 0xAF91, 0xCE82, 0xAF92, 0xCE83, 0xAF93, 0xCE86, 0xAF94, 0xCE88, 0xAF95, 0xCE8A, 0xAF96, 0xCE8B, 0xAF97, 0xCE8C, 0xAF98, 0xCE8D, + 0xAF99, 0xCE8E, 0xAF9A, 0xCE8F, 0xAF9B, 0xCE92, 0xAF9C, 0xCE93, 0xAF9D, 0xCE95, 0xAF9E, 0xCE96, 0xAF9F, 0xCE97, 0xAFA0, 0xCE99, + 0xB041, 0xCE9A, 0xB042, 0xCE9B, 0xB043, 0xCE9C, 0xB044, 0xCE9D, 0xB045, 0xCE9E, 0xB046, 0xCE9F, 0xB047, 0xCEA2, 0xB048, 0xCEA6, + 0xB049, 0xCEA7, 0xB04A, 0xCEA8, 0xB04B, 0xCEA9, 0xB04C, 0xCEAA, 0xB04D, 0xCEAB, 0xB04E, 0xCEAE, 0xB04F, 0xCEAF, 0xB050, 0xCEB0, + 0xB051, 0xCEB1, 0xB052, 0xCEB2, 0xB053, 0xCEB3, 0xB054, 0xCEB4, 0xB055, 0xCEB5, 0xB056, 0xCEB6, 0xB057, 0xCEB7, 0xB058, 0xCEB8, + 0xB059, 0xCEB9, 0xB05A, 0xCEBA, 0xB061, 0xCEBB, 0xB062, 0xCEBC, 0xB063, 0xCEBD, 0xB064, 0xCEBE, 0xB065, 0xCEBF, 0xB066, 0xCEC0, + 0xB067, 0xCEC2, 0xB068, 0xCEC3, 0xB069, 0xCEC4, 0xB06A, 0xCEC5, 0xB06B, 0xCEC6, 0xB06C, 0xCEC7, 0xB06D, 0xCEC8, 0xB06E, 0xCEC9, + 0xB06F, 0xCECA, 0xB070, 0xCECB, 0xB071, 0xCECC, 0xB072, 0xCECD, 0xB073, 0xCECE, 0xB074, 0xCECF, 0xB075, 0xCED0, 0xB076, 0xCED1, + 0xB077, 0xCED2, 0xB078, 0xCED3, 0xB079, 0xCED4, 0xB07A, 0xCED5, 0xB081, 0xCED6, 0xB082, 0xCED7, 0xB083, 0xCED8, 0xB084, 0xCED9, + 0xB085, 0xCEDA, 0xB086, 0xCEDB, 0xB087, 0xCEDC, 0xB088, 0xCEDD, 0xB089, 0xCEDE, 0xB08A, 0xCEDF, 0xB08B, 0xCEE0, 0xB08C, 0xCEE1, + 0xB08D, 0xCEE2, 0xB08E, 0xCEE3, 0xB08F, 0xCEE6, 0xB090, 0xCEE7, 0xB091, 0xCEE9, 0xB092, 0xCEEA, 0xB093, 0xCEED, 0xB094, 0xCEEE, + 0xB095, 0xCEEF, 0xB096, 0xCEF0, 0xB097, 0xCEF1, 0xB098, 0xCEF2, 0xB099, 0xCEF3, 0xB09A, 0xCEF6, 0xB09B, 0xCEFA, 0xB09C, 0xCEFB, + 0xB09D, 0xCEFC, 0xB09E, 0xCEFD, 0xB09F, 0xCEFE, 0xB0A0, 0xCEFF, 0xB0A1, 0xAC00, 0xB0A2, 0xAC01, 0xB0A3, 0xAC04, 0xB0A4, 0xAC07, + 0xB0A5, 0xAC08, 0xB0A6, 0xAC09, 0xB0A7, 0xAC0A, 0xB0A8, 0xAC10, 0xB0A9, 0xAC11, 0xB0AA, 0xAC12, 0xB0AB, 0xAC13, 0xB0AC, 0xAC14, + 0xB0AD, 0xAC15, 0xB0AE, 0xAC16, 0xB0AF, 0xAC17, 0xB0B0, 0xAC19, 0xB0B1, 0xAC1A, 0xB0B2, 0xAC1B, 0xB0B3, 0xAC1C, 0xB0B4, 0xAC1D, + 0xB0B5, 0xAC20, 0xB0B6, 0xAC24, 0xB0B7, 0xAC2C, 0xB0B8, 0xAC2D, 0xB0B9, 0xAC2F, 0xB0BA, 0xAC30, 0xB0BB, 0xAC31, 0xB0BC, 0xAC38, + 0xB0BD, 0xAC39, 0xB0BE, 0xAC3C, 0xB0BF, 0xAC40, 0xB0C0, 0xAC4B, 0xB0C1, 0xAC4D, 0xB0C2, 0xAC54, 0xB0C3, 0xAC58, 0xB0C4, 0xAC5C, + 0xB0C5, 0xAC70, 0xB0C6, 0xAC71, 0xB0C7, 0xAC74, 0xB0C8, 0xAC77, 0xB0C9, 0xAC78, 0xB0CA, 0xAC7A, 0xB0CB, 0xAC80, 0xB0CC, 0xAC81, + 0xB0CD, 0xAC83, 0xB0CE, 0xAC84, 0xB0CF, 0xAC85, 0xB0D0, 0xAC86, 0xB0D1, 0xAC89, 0xB0D2, 0xAC8A, 0xB0D3, 0xAC8B, 0xB0D4, 0xAC8C, + 0xB0D5, 0xAC90, 0xB0D6, 0xAC94, 0xB0D7, 0xAC9C, 0xB0D8, 0xAC9D, 0xB0D9, 0xAC9F, 0xB0DA, 0xACA0, 0xB0DB, 0xACA1, 0xB0DC, 0xACA8, + 0xB0DD, 0xACA9, 0xB0DE, 0xACAA, 0xB0DF, 0xACAC, 0xB0E0, 0xACAF, 0xB0E1, 0xACB0, 0xB0E2, 0xACB8, 0xB0E3, 0xACB9, 0xB0E4, 0xACBB, + 0xB0E5, 0xACBC, 0xB0E6, 0xACBD, 0xB0E7, 0xACC1, 0xB0E8, 0xACC4, 0xB0E9, 0xACC8, 0xB0EA, 0xACCC, 0xB0EB, 0xACD5, 0xB0EC, 0xACD7, + 0xB0ED, 0xACE0, 0xB0EE, 0xACE1, 0xB0EF, 0xACE4, 0xB0F0, 0xACE7, 0xB0F1, 0xACE8, 0xB0F2, 0xACEA, 0xB0F3, 0xACEC, 0xB0F4, 0xACEF, + 0xB0F5, 0xACF0, 0xB0F6, 0xACF1, 0xB0F7, 0xACF3, 0xB0F8, 0xACF5, 0xB0F9, 0xACF6, 0xB0FA, 0xACFC, 0xB0FB, 0xACFD, 0xB0FC, 0xAD00, + 0xB0FD, 0xAD04, 0xB0FE, 0xAD06, 0xB141, 0xCF02, 0xB142, 0xCF03, 0xB143, 0xCF05, 0xB144, 0xCF06, 0xB145, 0xCF07, 0xB146, 0xCF09, + 0xB147, 0xCF0A, 0xB148, 0xCF0B, 0xB149, 0xCF0C, 0xB14A, 0xCF0D, 0xB14B, 0xCF0E, 0xB14C, 0xCF0F, 0xB14D, 0xCF12, 0xB14E, 0xCF14, + 0xB14F, 0xCF16, 0xB150, 0xCF17, 0xB151, 0xCF18, 0xB152, 0xCF19, 0xB153, 0xCF1A, 0xB154, 0xCF1B, 0xB155, 0xCF1D, 0xB156, 0xCF1E, + 0xB157, 0xCF1F, 0xB158, 0xCF21, 0xB159, 0xCF22, 0xB15A, 0xCF23, 0xB161, 0xCF25, 0xB162, 0xCF26, 0xB163, 0xCF27, 0xB164, 0xCF28, + 0xB165, 0xCF29, 0xB166, 0xCF2A, 0xB167, 0xCF2B, 0xB168, 0xCF2E, 0xB169, 0xCF32, 0xB16A, 0xCF33, 0xB16B, 0xCF34, 0xB16C, 0xCF35, + 0xB16D, 0xCF36, 0xB16E, 0xCF37, 0xB16F, 0xCF39, 0xB170, 0xCF3A, 0xB171, 0xCF3B, 0xB172, 0xCF3C, 0xB173, 0xCF3D, 0xB174, 0xCF3E, + 0xB175, 0xCF3F, 0xB176, 0xCF40, 0xB177, 0xCF41, 0xB178, 0xCF42, 0xB179, 0xCF43, 0xB17A, 0xCF44, 0xB181, 0xCF45, 0xB182, 0xCF46, + 0xB183, 0xCF47, 0xB184, 0xCF48, 0xB185, 0xCF49, 0xB186, 0xCF4A, 0xB187, 0xCF4B, 0xB188, 0xCF4C, 0xB189, 0xCF4D, 0xB18A, 0xCF4E, + 0xB18B, 0xCF4F, 0xB18C, 0xCF50, 0xB18D, 0xCF51, 0xB18E, 0xCF52, 0xB18F, 0xCF53, 0xB190, 0xCF56, 0xB191, 0xCF57, 0xB192, 0xCF59, + 0xB193, 0xCF5A, 0xB194, 0xCF5B, 0xB195, 0xCF5D, 0xB196, 0xCF5E, 0xB197, 0xCF5F, 0xB198, 0xCF60, 0xB199, 0xCF61, 0xB19A, 0xCF62, + 0xB19B, 0xCF63, 0xB19C, 0xCF66, 0xB19D, 0xCF68, 0xB19E, 0xCF6A, 0xB19F, 0xCF6B, 0xB1A0, 0xCF6C, 0xB1A1, 0xAD0C, 0xB1A2, 0xAD0D, + 0xB1A3, 0xAD0F, 0xB1A4, 0xAD11, 0xB1A5, 0xAD18, 0xB1A6, 0xAD1C, 0xB1A7, 0xAD20, 0xB1A8, 0xAD29, 0xB1A9, 0xAD2C, 0xB1AA, 0xAD2D, + 0xB1AB, 0xAD34, 0xB1AC, 0xAD35, 0xB1AD, 0xAD38, 0xB1AE, 0xAD3C, 0xB1AF, 0xAD44, 0xB1B0, 0xAD45, 0xB1B1, 0xAD47, 0xB1B2, 0xAD49, + 0xB1B3, 0xAD50, 0xB1B4, 0xAD54, 0xB1B5, 0xAD58, 0xB1B6, 0xAD61, 0xB1B7, 0xAD63, 0xB1B8, 0xAD6C, 0xB1B9, 0xAD6D, 0xB1BA, 0xAD70, + 0xB1BB, 0xAD73, 0xB1BC, 0xAD74, 0xB1BD, 0xAD75, 0xB1BE, 0xAD76, 0xB1BF, 0xAD7B, 0xB1C0, 0xAD7C, 0xB1C1, 0xAD7D, 0xB1C2, 0xAD7F, + 0xB1C3, 0xAD81, 0xB1C4, 0xAD82, 0xB1C5, 0xAD88, 0xB1C6, 0xAD89, 0xB1C7, 0xAD8C, 0xB1C8, 0xAD90, 0xB1C9, 0xAD9C, 0xB1CA, 0xAD9D, + 0xB1CB, 0xADA4, 0xB1CC, 0xADB7, 0xB1CD, 0xADC0, 0xB1CE, 0xADC1, 0xB1CF, 0xADC4, 0xB1D0, 0xADC8, 0xB1D1, 0xADD0, 0xB1D2, 0xADD1, + 0xB1D3, 0xADD3, 0xB1D4, 0xADDC, 0xB1D5, 0xADE0, 0xB1D6, 0xADE4, 0xB1D7, 0xADF8, 0xB1D8, 0xADF9, 0xB1D9, 0xADFC, 0xB1DA, 0xADFF, + 0xB1DB, 0xAE00, 0xB1DC, 0xAE01, 0xB1DD, 0xAE08, 0xB1DE, 0xAE09, 0xB1DF, 0xAE0B, 0xB1E0, 0xAE0D, 0xB1E1, 0xAE14, 0xB1E2, 0xAE30, + 0xB1E3, 0xAE31, 0xB1E4, 0xAE34, 0xB1E5, 0xAE37, 0xB1E6, 0xAE38, 0xB1E7, 0xAE3A, 0xB1E8, 0xAE40, 0xB1E9, 0xAE41, 0xB1EA, 0xAE43, + 0xB1EB, 0xAE45, 0xB1EC, 0xAE46, 0xB1ED, 0xAE4A, 0xB1EE, 0xAE4C, 0xB1EF, 0xAE4D, 0xB1F0, 0xAE4E, 0xB1F1, 0xAE50, 0xB1F2, 0xAE54, + 0xB1F3, 0xAE56, 0xB1F4, 0xAE5C, 0xB1F5, 0xAE5D, 0xB1F6, 0xAE5F, 0xB1F7, 0xAE60, 0xB1F8, 0xAE61, 0xB1F9, 0xAE65, 0xB1FA, 0xAE68, + 0xB1FB, 0xAE69, 0xB1FC, 0xAE6C, 0xB1FD, 0xAE70, 0xB1FE, 0xAE78, 0xB241, 0xCF6D, 0xB242, 0xCF6E, 0xB243, 0xCF6F, 0xB244, 0xCF72, + 0xB245, 0xCF73, 0xB246, 0xCF75, 0xB247, 0xCF76, 0xB248, 0xCF77, 0xB249, 0xCF79, 0xB24A, 0xCF7A, 0xB24B, 0xCF7B, 0xB24C, 0xCF7C, + 0xB24D, 0xCF7D, 0xB24E, 0xCF7E, 0xB24F, 0xCF7F, 0xB250, 0xCF81, 0xB251, 0xCF82, 0xB252, 0xCF83, 0xB253, 0xCF84, 0xB254, 0xCF86, + 0xB255, 0xCF87, 0xB256, 0xCF88, 0xB257, 0xCF89, 0xB258, 0xCF8A, 0xB259, 0xCF8B, 0xB25A, 0xCF8D, 0xB261, 0xCF8E, 0xB262, 0xCF8F, + 0xB263, 0xCF90, 0xB264, 0xCF91, 0xB265, 0xCF92, 0xB266, 0xCF93, 0xB267, 0xCF94, 0xB268, 0xCF95, 0xB269, 0xCF96, 0xB26A, 0xCF97, + 0xB26B, 0xCF98, 0xB26C, 0xCF99, 0xB26D, 0xCF9A, 0xB26E, 0xCF9B, 0xB26F, 0xCF9C, 0xB270, 0xCF9D, 0xB271, 0xCF9E, 0xB272, 0xCF9F, + 0xB273, 0xCFA0, 0xB274, 0xCFA2, 0xB275, 0xCFA3, 0xB276, 0xCFA4, 0xB277, 0xCFA5, 0xB278, 0xCFA6, 0xB279, 0xCFA7, 0xB27A, 0xCFA9, + 0xB281, 0xCFAA, 0xB282, 0xCFAB, 0xB283, 0xCFAC, 0xB284, 0xCFAD, 0xB285, 0xCFAE, 0xB286, 0xCFAF, 0xB287, 0xCFB1, 0xB288, 0xCFB2, + 0xB289, 0xCFB3, 0xB28A, 0xCFB4, 0xB28B, 0xCFB5, 0xB28C, 0xCFB6, 0xB28D, 0xCFB7, 0xB28E, 0xCFB8, 0xB28F, 0xCFB9, 0xB290, 0xCFBA, + 0xB291, 0xCFBB, 0xB292, 0xCFBC, 0xB293, 0xCFBD, 0xB294, 0xCFBE, 0xB295, 0xCFBF, 0xB296, 0xCFC0, 0xB297, 0xCFC1, 0xB298, 0xCFC2, + 0xB299, 0xCFC3, 0xB29A, 0xCFC5, 0xB29B, 0xCFC6, 0xB29C, 0xCFC7, 0xB29D, 0xCFC8, 0xB29E, 0xCFC9, 0xB29F, 0xCFCA, 0xB2A0, 0xCFCB, + 0xB2A1, 0xAE79, 0xB2A2, 0xAE7B, 0xB2A3, 0xAE7C, 0xB2A4, 0xAE7D, 0xB2A5, 0xAE84, 0xB2A6, 0xAE85, 0xB2A7, 0xAE8C, 0xB2A8, 0xAEBC, + 0xB2A9, 0xAEBD, 0xB2AA, 0xAEBE, 0xB2AB, 0xAEC0, 0xB2AC, 0xAEC4, 0xB2AD, 0xAECC, 0xB2AE, 0xAECD, 0xB2AF, 0xAECF, 0xB2B0, 0xAED0, + 0xB2B1, 0xAED1, 0xB2B2, 0xAED8, 0xB2B3, 0xAED9, 0xB2B4, 0xAEDC, 0xB2B5, 0xAEE8, 0xB2B6, 0xAEEB, 0xB2B7, 0xAEED, 0xB2B8, 0xAEF4, + 0xB2B9, 0xAEF8, 0xB2BA, 0xAEFC, 0xB2BB, 0xAF07, 0xB2BC, 0xAF08, 0xB2BD, 0xAF0D, 0xB2BE, 0xAF10, 0xB2BF, 0xAF2C, 0xB2C0, 0xAF2D, + 0xB2C1, 0xAF30, 0xB2C2, 0xAF32, 0xB2C3, 0xAF34, 0xB2C4, 0xAF3C, 0xB2C5, 0xAF3D, 0xB2C6, 0xAF3F, 0xB2C7, 0xAF41, 0xB2C8, 0xAF42, + 0xB2C9, 0xAF43, 0xB2CA, 0xAF48, 0xB2CB, 0xAF49, 0xB2CC, 0xAF50, 0xB2CD, 0xAF5C, 0xB2CE, 0xAF5D, 0xB2CF, 0xAF64, 0xB2D0, 0xAF65, + 0xB2D1, 0xAF79, 0xB2D2, 0xAF80, 0xB2D3, 0xAF84, 0xB2D4, 0xAF88, 0xB2D5, 0xAF90, 0xB2D6, 0xAF91, 0xB2D7, 0xAF95, 0xB2D8, 0xAF9C, + 0xB2D9, 0xAFB8, 0xB2DA, 0xAFB9, 0xB2DB, 0xAFBC, 0xB2DC, 0xAFC0, 0xB2DD, 0xAFC7, 0xB2DE, 0xAFC8, 0xB2DF, 0xAFC9, 0xB2E0, 0xAFCB, + 0xB2E1, 0xAFCD, 0xB2E2, 0xAFCE, 0xB2E3, 0xAFD4, 0xB2E4, 0xAFDC, 0xB2E5, 0xAFE8, 0xB2E6, 0xAFE9, 0xB2E7, 0xAFF0, 0xB2E8, 0xAFF1, + 0xB2E9, 0xAFF4, 0xB2EA, 0xAFF8, 0xB2EB, 0xB000, 0xB2EC, 0xB001, 0xB2ED, 0xB004, 0xB2EE, 0xB00C, 0xB2EF, 0xB010, 0xB2F0, 0xB014, + 0xB2F1, 0xB01C, 0xB2F2, 0xB01D, 0xB2F3, 0xB028, 0xB2F4, 0xB044, 0xB2F5, 0xB045, 0xB2F6, 0xB048, 0xB2F7, 0xB04A, 0xB2F8, 0xB04C, + 0xB2F9, 0xB04E, 0xB2FA, 0xB053, 0xB2FB, 0xB054, 0xB2FC, 0xB055, 0xB2FD, 0xB057, 0xB2FE, 0xB059, 0xB341, 0xCFCC, 0xB342, 0xCFCD, + 0xB343, 0xCFCE, 0xB344, 0xCFCF, 0xB345, 0xCFD0, 0xB346, 0xCFD1, 0xB347, 0xCFD2, 0xB348, 0xCFD3, 0xB349, 0xCFD4, 0xB34A, 0xCFD5, + 0xB34B, 0xCFD6, 0xB34C, 0xCFD7, 0xB34D, 0xCFD8, 0xB34E, 0xCFD9, 0xB34F, 0xCFDA, 0xB350, 0xCFDB, 0xB351, 0xCFDC, 0xB352, 0xCFDD, + 0xB353, 0xCFDE, 0xB354, 0xCFDF, 0xB355, 0xCFE2, 0xB356, 0xCFE3, 0xB357, 0xCFE5, 0xB358, 0xCFE6, 0xB359, 0xCFE7, 0xB35A, 0xCFE9, + 0xB361, 0xCFEA, 0xB362, 0xCFEB, 0xB363, 0xCFEC, 0xB364, 0xCFED, 0xB365, 0xCFEE, 0xB366, 0xCFEF, 0xB367, 0xCFF2, 0xB368, 0xCFF4, + 0xB369, 0xCFF6, 0xB36A, 0xCFF7, 0xB36B, 0xCFF8, 0xB36C, 0xCFF9, 0xB36D, 0xCFFA, 0xB36E, 0xCFFB, 0xB36F, 0xCFFD, 0xB370, 0xCFFE, + 0xB371, 0xCFFF, 0xB372, 0xD001, 0xB373, 0xD002, 0xB374, 0xD003, 0xB375, 0xD005, 0xB376, 0xD006, 0xB377, 0xD007, 0xB378, 0xD008, + 0xB379, 0xD009, 0xB37A, 0xD00A, 0xB381, 0xD00B, 0xB382, 0xD00C, 0xB383, 0xD00D, 0xB384, 0xD00E, 0xB385, 0xD00F, 0xB386, 0xD010, + 0xB387, 0xD012, 0xB388, 0xD013, 0xB389, 0xD014, 0xB38A, 0xD015, 0xB38B, 0xD016, 0xB38C, 0xD017, 0xB38D, 0xD019, 0xB38E, 0xD01A, + 0xB38F, 0xD01B, 0xB390, 0xD01C, 0xB391, 0xD01D, 0xB392, 0xD01E, 0xB393, 0xD01F, 0xB394, 0xD020, 0xB395, 0xD021, 0xB396, 0xD022, + 0xB397, 0xD023, 0xB398, 0xD024, 0xB399, 0xD025, 0xB39A, 0xD026, 0xB39B, 0xD027, 0xB39C, 0xD028, 0xB39D, 0xD029, 0xB39E, 0xD02A, + 0xB39F, 0xD02B, 0xB3A0, 0xD02C, 0xB3A1, 0xB05D, 0xB3A2, 0xB07C, 0xB3A3, 0xB07D, 0xB3A4, 0xB080, 0xB3A5, 0xB084, 0xB3A6, 0xB08C, + 0xB3A7, 0xB08D, 0xB3A8, 0xB08F, 0xB3A9, 0xB091, 0xB3AA, 0xB098, 0xB3AB, 0xB099, 0xB3AC, 0xB09A, 0xB3AD, 0xB09C, 0xB3AE, 0xB09F, + 0xB3AF, 0xB0A0, 0xB3B0, 0xB0A1, 0xB3B1, 0xB0A2, 0xB3B2, 0xB0A8, 0xB3B3, 0xB0A9, 0xB3B4, 0xB0AB, 0xB3B5, 0xB0AC, 0xB3B6, 0xB0AD, + 0xB3B7, 0xB0AE, 0xB3B8, 0xB0AF, 0xB3B9, 0xB0B1, 0xB3BA, 0xB0B3, 0xB3BB, 0xB0B4, 0xB3BC, 0xB0B5, 0xB3BD, 0xB0B8, 0xB3BE, 0xB0BC, + 0xB3BF, 0xB0C4, 0xB3C0, 0xB0C5, 0xB3C1, 0xB0C7, 0xB3C2, 0xB0C8, 0xB3C3, 0xB0C9, 0xB3C4, 0xB0D0, 0xB3C5, 0xB0D1, 0xB3C6, 0xB0D4, + 0xB3C7, 0xB0D8, 0xB3C8, 0xB0E0, 0xB3C9, 0xB0E5, 0xB3CA, 0xB108, 0xB3CB, 0xB109, 0xB3CC, 0xB10B, 0xB3CD, 0xB10C, 0xB3CE, 0xB110, + 0xB3CF, 0xB112, 0xB3D0, 0xB113, 0xB3D1, 0xB118, 0xB3D2, 0xB119, 0xB3D3, 0xB11B, 0xB3D4, 0xB11C, 0xB3D5, 0xB11D, 0xB3D6, 0xB123, + 0xB3D7, 0xB124, 0xB3D8, 0xB125, 0xB3D9, 0xB128, 0xB3DA, 0xB12C, 0xB3DB, 0xB134, 0xB3DC, 0xB135, 0xB3DD, 0xB137, 0xB3DE, 0xB138, + 0xB3DF, 0xB139, 0xB3E0, 0xB140, 0xB3E1, 0xB141, 0xB3E2, 0xB144, 0xB3E3, 0xB148, 0xB3E4, 0xB150, 0xB3E5, 0xB151, 0xB3E6, 0xB154, + 0xB3E7, 0xB155, 0xB3E8, 0xB158, 0xB3E9, 0xB15C, 0xB3EA, 0xB160, 0xB3EB, 0xB178, 0xB3EC, 0xB179, 0xB3ED, 0xB17C, 0xB3EE, 0xB180, + 0xB3EF, 0xB182, 0xB3F0, 0xB188, 0xB3F1, 0xB189, 0xB3F2, 0xB18B, 0xB3F3, 0xB18D, 0xB3F4, 0xB192, 0xB3F5, 0xB193, 0xB3F6, 0xB194, + 0xB3F7, 0xB198, 0xB3F8, 0xB19C, 0xB3F9, 0xB1A8, 0xB3FA, 0xB1CC, 0xB3FB, 0xB1D0, 0xB3FC, 0xB1D4, 0xB3FD, 0xB1DC, 0xB3FE, 0xB1DD, + 0xB441, 0xD02E, 0xB442, 0xD02F, 0xB443, 0xD030, 0xB444, 0xD031, 0xB445, 0xD032, 0xB446, 0xD033, 0xB447, 0xD036, 0xB448, 0xD037, + 0xB449, 0xD039, 0xB44A, 0xD03A, 0xB44B, 0xD03B, 0xB44C, 0xD03D, 0xB44D, 0xD03E, 0xB44E, 0xD03F, 0xB44F, 0xD040, 0xB450, 0xD041, + 0xB451, 0xD042, 0xB452, 0xD043, 0xB453, 0xD046, 0xB454, 0xD048, 0xB455, 0xD04A, 0xB456, 0xD04B, 0xB457, 0xD04C, 0xB458, 0xD04D, + 0xB459, 0xD04E, 0xB45A, 0xD04F, 0xB461, 0xD051, 0xB462, 0xD052, 0xB463, 0xD053, 0xB464, 0xD055, 0xB465, 0xD056, 0xB466, 0xD057, + 0xB467, 0xD059, 0xB468, 0xD05A, 0xB469, 0xD05B, 0xB46A, 0xD05C, 0xB46B, 0xD05D, 0xB46C, 0xD05E, 0xB46D, 0xD05F, 0xB46E, 0xD061, + 0xB46F, 0xD062, 0xB470, 0xD063, 0xB471, 0xD064, 0xB472, 0xD065, 0xB473, 0xD066, 0xB474, 0xD067, 0xB475, 0xD068, 0xB476, 0xD069, + 0xB477, 0xD06A, 0xB478, 0xD06B, 0xB479, 0xD06E, 0xB47A, 0xD06F, 0xB481, 0xD071, 0xB482, 0xD072, 0xB483, 0xD073, 0xB484, 0xD075, + 0xB485, 0xD076, 0xB486, 0xD077, 0xB487, 0xD078, 0xB488, 0xD079, 0xB489, 0xD07A, 0xB48A, 0xD07B, 0xB48B, 0xD07E, 0xB48C, 0xD07F, + 0xB48D, 0xD080, 0xB48E, 0xD082, 0xB48F, 0xD083, 0xB490, 0xD084, 0xB491, 0xD085, 0xB492, 0xD086, 0xB493, 0xD087, 0xB494, 0xD088, + 0xB495, 0xD089, 0xB496, 0xD08A, 0xB497, 0xD08B, 0xB498, 0xD08C, 0xB499, 0xD08D, 0xB49A, 0xD08E, 0xB49B, 0xD08F, 0xB49C, 0xD090, + 0xB49D, 0xD091, 0xB49E, 0xD092, 0xB49F, 0xD093, 0xB4A0, 0xD094, 0xB4A1, 0xB1DF, 0xB4A2, 0xB1E8, 0xB4A3, 0xB1E9, 0xB4A4, 0xB1EC, + 0xB4A5, 0xB1F0, 0xB4A6, 0xB1F9, 0xB4A7, 0xB1FB, 0xB4A8, 0xB1FD, 0xB4A9, 0xB204, 0xB4AA, 0xB205, 0xB4AB, 0xB208, 0xB4AC, 0xB20B, + 0xB4AD, 0xB20C, 0xB4AE, 0xB214, 0xB4AF, 0xB215, 0xB4B0, 0xB217, 0xB4B1, 0xB219, 0xB4B2, 0xB220, 0xB4B3, 0xB234, 0xB4B4, 0xB23C, + 0xB4B5, 0xB258, 0xB4B6, 0xB25C, 0xB4B7, 0xB260, 0xB4B8, 0xB268, 0xB4B9, 0xB269, 0xB4BA, 0xB274, 0xB4BB, 0xB275, 0xB4BC, 0xB27C, + 0xB4BD, 0xB284, 0xB4BE, 0xB285, 0xB4BF, 0xB289, 0xB4C0, 0xB290, 0xB4C1, 0xB291, 0xB4C2, 0xB294, 0xB4C3, 0xB298, 0xB4C4, 0xB299, + 0xB4C5, 0xB29A, 0xB4C6, 0xB2A0, 0xB4C7, 0xB2A1, 0xB4C8, 0xB2A3, 0xB4C9, 0xB2A5, 0xB4CA, 0xB2A6, 0xB4CB, 0xB2AA, 0xB4CC, 0xB2AC, + 0xB4CD, 0xB2B0, 0xB4CE, 0xB2B4, 0xB4CF, 0xB2C8, 0xB4D0, 0xB2C9, 0xB4D1, 0xB2CC, 0xB4D2, 0xB2D0, 0xB4D3, 0xB2D2, 0xB4D4, 0xB2D8, + 0xB4D5, 0xB2D9, 0xB4D6, 0xB2DB, 0xB4D7, 0xB2DD, 0xB4D8, 0xB2E2, 0xB4D9, 0xB2E4, 0xB4DA, 0xB2E5, 0xB4DB, 0xB2E6, 0xB4DC, 0xB2E8, + 0xB4DD, 0xB2EB, 0xB4DE, 0xB2EC, 0xB4DF, 0xB2ED, 0xB4E0, 0xB2EE, 0xB4E1, 0xB2EF, 0xB4E2, 0xB2F3, 0xB4E3, 0xB2F4, 0xB4E4, 0xB2F5, + 0xB4E5, 0xB2F7, 0xB4E6, 0xB2F8, 0xB4E7, 0xB2F9, 0xB4E8, 0xB2FA, 0xB4E9, 0xB2FB, 0xB4EA, 0xB2FF, 0xB4EB, 0xB300, 0xB4EC, 0xB301, + 0xB4ED, 0xB304, 0xB4EE, 0xB308, 0xB4EF, 0xB310, 0xB4F0, 0xB311, 0xB4F1, 0xB313, 0xB4F2, 0xB314, 0xB4F3, 0xB315, 0xB4F4, 0xB31C, + 0xB4F5, 0xB354, 0xB4F6, 0xB355, 0xB4F7, 0xB356, 0xB4F8, 0xB358, 0xB4F9, 0xB35B, 0xB4FA, 0xB35C, 0xB4FB, 0xB35E, 0xB4FC, 0xB35F, + 0xB4FD, 0xB364, 0xB4FE, 0xB365, 0xB541, 0xD095, 0xB542, 0xD096, 0xB543, 0xD097, 0xB544, 0xD098, 0xB545, 0xD099, 0xB546, 0xD09A, + 0xB547, 0xD09B, 0xB548, 0xD09C, 0xB549, 0xD09D, 0xB54A, 0xD09E, 0xB54B, 0xD09F, 0xB54C, 0xD0A0, 0xB54D, 0xD0A1, 0xB54E, 0xD0A2, + 0xB54F, 0xD0A3, 0xB550, 0xD0A6, 0xB551, 0xD0A7, 0xB552, 0xD0A9, 0xB553, 0xD0AA, 0xB554, 0xD0AB, 0xB555, 0xD0AD, 0xB556, 0xD0AE, + 0xB557, 0xD0AF, 0xB558, 0xD0B0, 0xB559, 0xD0B1, 0xB55A, 0xD0B2, 0xB561, 0xD0B3, 0xB562, 0xD0B6, 0xB563, 0xD0B8, 0xB564, 0xD0BA, + 0xB565, 0xD0BB, 0xB566, 0xD0BC, 0xB567, 0xD0BD, 0xB568, 0xD0BE, 0xB569, 0xD0BF, 0xB56A, 0xD0C2, 0xB56B, 0xD0C3, 0xB56C, 0xD0C5, + 0xB56D, 0xD0C6, 0xB56E, 0xD0C7, 0xB56F, 0xD0CA, 0xB570, 0xD0CB, 0xB571, 0xD0CC, 0xB572, 0xD0CD, 0xB573, 0xD0CE, 0xB574, 0xD0CF, + 0xB575, 0xD0D2, 0xB576, 0xD0D6, 0xB577, 0xD0D7, 0xB578, 0xD0D8, 0xB579, 0xD0D9, 0xB57A, 0xD0DA, 0xB581, 0xD0DB, 0xB582, 0xD0DE, + 0xB583, 0xD0DF, 0xB584, 0xD0E1, 0xB585, 0xD0E2, 0xB586, 0xD0E3, 0xB587, 0xD0E5, 0xB588, 0xD0E6, 0xB589, 0xD0E7, 0xB58A, 0xD0E8, + 0xB58B, 0xD0E9, 0xB58C, 0xD0EA, 0xB58D, 0xD0EB, 0xB58E, 0xD0EE, 0xB58F, 0xD0F2, 0xB590, 0xD0F3, 0xB591, 0xD0F4, 0xB592, 0xD0F5, + 0xB593, 0xD0F6, 0xB594, 0xD0F7, 0xB595, 0xD0F9, 0xB596, 0xD0FA, 0xB597, 0xD0FB, 0xB598, 0xD0FC, 0xB599, 0xD0FD, 0xB59A, 0xD0FE, + 0xB59B, 0xD0FF, 0xB59C, 0xD100, 0xB59D, 0xD101, 0xB59E, 0xD102, 0xB59F, 0xD103, 0xB5A0, 0xD104, 0xB5A1, 0xB367, 0xB5A2, 0xB369, + 0xB5A3, 0xB36B, 0xB5A4, 0xB36E, 0xB5A5, 0xB370, 0xB5A6, 0xB371, 0xB5A7, 0xB374, 0xB5A8, 0xB378, 0xB5A9, 0xB380, 0xB5AA, 0xB381, + 0xB5AB, 0xB383, 0xB5AC, 0xB384, 0xB5AD, 0xB385, 0xB5AE, 0xB38C, 0xB5AF, 0xB390, 0xB5B0, 0xB394, 0xB5B1, 0xB3A0, 0xB5B2, 0xB3A1, + 0xB5B3, 0xB3A8, 0xB5B4, 0xB3AC, 0xB5B5, 0xB3C4, 0xB5B6, 0xB3C5, 0xB5B7, 0xB3C8, 0xB5B8, 0xB3CB, 0xB5B9, 0xB3CC, 0xB5BA, 0xB3CE, + 0xB5BB, 0xB3D0, 0xB5BC, 0xB3D4, 0xB5BD, 0xB3D5, 0xB5BE, 0xB3D7, 0xB5BF, 0xB3D9, 0xB5C0, 0xB3DB, 0xB5C1, 0xB3DD, 0xB5C2, 0xB3E0, + 0xB5C3, 0xB3E4, 0xB5C4, 0xB3E8, 0xB5C5, 0xB3FC, 0xB5C6, 0xB410, 0xB5C7, 0xB418, 0xB5C8, 0xB41C, 0xB5C9, 0xB420, 0xB5CA, 0xB428, + 0xB5CB, 0xB429, 0xB5CC, 0xB42B, 0xB5CD, 0xB434, 0xB5CE, 0xB450, 0xB5CF, 0xB451, 0xB5D0, 0xB454, 0xB5D1, 0xB458, 0xB5D2, 0xB460, + 0xB5D3, 0xB461, 0xB5D4, 0xB463, 0xB5D5, 0xB465, 0xB5D6, 0xB46C, 0xB5D7, 0xB480, 0xB5D8, 0xB488, 0xB5D9, 0xB49D, 0xB5DA, 0xB4A4, + 0xB5DB, 0xB4A8, 0xB5DC, 0xB4AC, 0xB5DD, 0xB4B5, 0xB5DE, 0xB4B7, 0xB5DF, 0xB4B9, 0xB5E0, 0xB4C0, 0xB5E1, 0xB4C4, 0xB5E2, 0xB4C8, + 0xB5E3, 0xB4D0, 0xB5E4, 0xB4D5, 0xB5E5, 0xB4DC, 0xB5E6, 0xB4DD, 0xB5E7, 0xB4E0, 0xB5E8, 0xB4E3, 0xB5E9, 0xB4E4, 0xB5EA, 0xB4E6, + 0xB5EB, 0xB4EC, 0xB5EC, 0xB4ED, 0xB5ED, 0xB4EF, 0xB5EE, 0xB4F1, 0xB5EF, 0xB4F8, 0xB5F0, 0xB514, 0xB5F1, 0xB515, 0xB5F2, 0xB518, + 0xB5F3, 0xB51B, 0xB5F4, 0xB51C, 0xB5F5, 0xB524, 0xB5F6, 0xB525, 0xB5F7, 0xB527, 0xB5F8, 0xB528, 0xB5F9, 0xB529, 0xB5FA, 0xB52A, + 0xB5FB, 0xB530, 0xB5FC, 0xB531, 0xB5FD, 0xB534, 0xB5FE, 0xB538, 0xB641, 0xD105, 0xB642, 0xD106, 0xB643, 0xD107, 0xB644, 0xD108, + 0xB645, 0xD109, 0xB646, 0xD10A, 0xB647, 0xD10B, 0xB648, 0xD10C, 0xB649, 0xD10E, 0xB64A, 0xD10F, 0xB64B, 0xD110, 0xB64C, 0xD111, + 0xB64D, 0xD112, 0xB64E, 0xD113, 0xB64F, 0xD114, 0xB650, 0xD115, 0xB651, 0xD116, 0xB652, 0xD117, 0xB653, 0xD118, 0xB654, 0xD119, + 0xB655, 0xD11A, 0xB656, 0xD11B, 0xB657, 0xD11C, 0xB658, 0xD11D, 0xB659, 0xD11E, 0xB65A, 0xD11F, 0xB661, 0xD120, 0xB662, 0xD121, + 0xB663, 0xD122, 0xB664, 0xD123, 0xB665, 0xD124, 0xB666, 0xD125, 0xB667, 0xD126, 0xB668, 0xD127, 0xB669, 0xD128, 0xB66A, 0xD129, + 0xB66B, 0xD12A, 0xB66C, 0xD12B, 0xB66D, 0xD12C, 0xB66E, 0xD12D, 0xB66F, 0xD12E, 0xB670, 0xD12F, 0xB671, 0xD132, 0xB672, 0xD133, + 0xB673, 0xD135, 0xB674, 0xD136, 0xB675, 0xD137, 0xB676, 0xD139, 0xB677, 0xD13B, 0xB678, 0xD13C, 0xB679, 0xD13D, 0xB67A, 0xD13E, + 0xB681, 0xD13F, 0xB682, 0xD142, 0xB683, 0xD146, 0xB684, 0xD147, 0xB685, 0xD148, 0xB686, 0xD149, 0xB687, 0xD14A, 0xB688, 0xD14B, + 0xB689, 0xD14E, 0xB68A, 0xD14F, 0xB68B, 0xD151, 0xB68C, 0xD152, 0xB68D, 0xD153, 0xB68E, 0xD155, 0xB68F, 0xD156, 0xB690, 0xD157, + 0xB691, 0xD158, 0xB692, 0xD159, 0xB693, 0xD15A, 0xB694, 0xD15B, 0xB695, 0xD15E, 0xB696, 0xD160, 0xB697, 0xD162, 0xB698, 0xD163, + 0xB699, 0xD164, 0xB69A, 0xD165, 0xB69B, 0xD166, 0xB69C, 0xD167, 0xB69D, 0xD169, 0xB69E, 0xD16A, 0xB69F, 0xD16B, 0xB6A0, 0xD16D, + 0xB6A1, 0xB540, 0xB6A2, 0xB541, 0xB6A3, 0xB543, 0xB6A4, 0xB544, 0xB6A5, 0xB545, 0xB6A6, 0xB54B, 0xB6A7, 0xB54C, 0xB6A8, 0xB54D, + 0xB6A9, 0xB550, 0xB6AA, 0xB554, 0xB6AB, 0xB55C, 0xB6AC, 0xB55D, 0xB6AD, 0xB55F, 0xB6AE, 0xB560, 0xB6AF, 0xB561, 0xB6B0, 0xB5A0, + 0xB6B1, 0xB5A1, 0xB6B2, 0xB5A4, 0xB6B3, 0xB5A8, 0xB6B4, 0xB5AA, 0xB6B5, 0xB5AB, 0xB6B6, 0xB5B0, 0xB6B7, 0xB5B1, 0xB6B8, 0xB5B3, + 0xB6B9, 0xB5B4, 0xB6BA, 0xB5B5, 0xB6BB, 0xB5BB, 0xB6BC, 0xB5BC, 0xB6BD, 0xB5BD, 0xB6BE, 0xB5C0, 0xB6BF, 0xB5C4, 0xB6C0, 0xB5CC, + 0xB6C1, 0xB5CD, 0xB6C2, 0xB5CF, 0xB6C3, 0xB5D0, 0xB6C4, 0xB5D1, 0xB6C5, 0xB5D8, 0xB6C6, 0xB5EC, 0xB6C7, 0xB610, 0xB6C8, 0xB611, + 0xB6C9, 0xB614, 0xB6CA, 0xB618, 0xB6CB, 0xB625, 0xB6CC, 0xB62C, 0xB6CD, 0xB634, 0xB6CE, 0xB648, 0xB6CF, 0xB664, 0xB6D0, 0xB668, + 0xB6D1, 0xB69C, 0xB6D2, 0xB69D, 0xB6D3, 0xB6A0, 0xB6D4, 0xB6A4, 0xB6D5, 0xB6AB, 0xB6D6, 0xB6AC, 0xB6D7, 0xB6B1, 0xB6D8, 0xB6D4, + 0xB6D9, 0xB6F0, 0xB6DA, 0xB6F4, 0xB6DB, 0xB6F8, 0xB6DC, 0xB700, 0xB6DD, 0xB701, 0xB6DE, 0xB705, 0xB6DF, 0xB728, 0xB6E0, 0xB729, + 0xB6E1, 0xB72C, 0xB6E2, 0xB72F, 0xB6E3, 0xB730, 0xB6E4, 0xB738, 0xB6E5, 0xB739, 0xB6E6, 0xB73B, 0xB6E7, 0xB744, 0xB6E8, 0xB748, + 0xB6E9, 0xB74C, 0xB6EA, 0xB754, 0xB6EB, 0xB755, 0xB6EC, 0xB760, 0xB6ED, 0xB764, 0xB6EE, 0xB768, 0xB6EF, 0xB770, 0xB6F0, 0xB771, + 0xB6F1, 0xB773, 0xB6F2, 0xB775, 0xB6F3, 0xB77C, 0xB6F4, 0xB77D, 0xB6F5, 0xB780, 0xB6F6, 0xB784, 0xB6F7, 0xB78C, 0xB6F8, 0xB78D, + 0xB6F9, 0xB78F, 0xB6FA, 0xB790, 0xB6FB, 0xB791, 0xB6FC, 0xB792, 0xB6FD, 0xB796, 0xB6FE, 0xB797, 0xB741, 0xD16E, 0xB742, 0xD16F, + 0xB743, 0xD170, 0xB744, 0xD171, 0xB745, 0xD172, 0xB746, 0xD173, 0xB747, 0xD174, 0xB748, 0xD175, 0xB749, 0xD176, 0xB74A, 0xD177, + 0xB74B, 0xD178, 0xB74C, 0xD179, 0xB74D, 0xD17A, 0xB74E, 0xD17B, 0xB74F, 0xD17D, 0xB750, 0xD17E, 0xB751, 0xD17F, 0xB752, 0xD180, + 0xB753, 0xD181, 0xB754, 0xD182, 0xB755, 0xD183, 0xB756, 0xD185, 0xB757, 0xD186, 0xB758, 0xD187, 0xB759, 0xD189, 0xB75A, 0xD18A, + 0xB761, 0xD18B, 0xB762, 0xD18C, 0xB763, 0xD18D, 0xB764, 0xD18E, 0xB765, 0xD18F, 0xB766, 0xD190, 0xB767, 0xD191, 0xB768, 0xD192, + 0xB769, 0xD193, 0xB76A, 0xD194, 0xB76B, 0xD195, 0xB76C, 0xD196, 0xB76D, 0xD197, 0xB76E, 0xD198, 0xB76F, 0xD199, 0xB770, 0xD19A, + 0xB771, 0xD19B, 0xB772, 0xD19C, 0xB773, 0xD19D, 0xB774, 0xD19E, 0xB775, 0xD19F, 0xB776, 0xD1A2, 0xB777, 0xD1A3, 0xB778, 0xD1A5, + 0xB779, 0xD1A6, 0xB77A, 0xD1A7, 0xB781, 0xD1A9, 0xB782, 0xD1AA, 0xB783, 0xD1AB, 0xB784, 0xD1AC, 0xB785, 0xD1AD, 0xB786, 0xD1AE, + 0xB787, 0xD1AF, 0xB788, 0xD1B2, 0xB789, 0xD1B4, 0xB78A, 0xD1B6, 0xB78B, 0xD1B7, 0xB78C, 0xD1B8, 0xB78D, 0xD1B9, 0xB78E, 0xD1BB, + 0xB78F, 0xD1BD, 0xB790, 0xD1BE, 0xB791, 0xD1BF, 0xB792, 0xD1C1, 0xB793, 0xD1C2, 0xB794, 0xD1C3, 0xB795, 0xD1C4, 0xB796, 0xD1C5, + 0xB797, 0xD1C6, 0xB798, 0xD1C7, 0xB799, 0xD1C8, 0xB79A, 0xD1C9, 0xB79B, 0xD1CA, 0xB79C, 0xD1CB, 0xB79D, 0xD1CC, 0xB79E, 0xD1CD, + 0xB79F, 0xD1CE, 0xB7A0, 0xD1CF, 0xB7A1, 0xB798, 0xB7A2, 0xB799, 0xB7A3, 0xB79C, 0xB7A4, 0xB7A0, 0xB7A5, 0xB7A8, 0xB7A6, 0xB7A9, + 0xB7A7, 0xB7AB, 0xB7A8, 0xB7AC, 0xB7A9, 0xB7AD, 0xB7AA, 0xB7B4, 0xB7AB, 0xB7B5, 0xB7AC, 0xB7B8, 0xB7AD, 0xB7C7, 0xB7AE, 0xB7C9, + 0xB7AF, 0xB7EC, 0xB7B0, 0xB7ED, 0xB7B1, 0xB7F0, 0xB7B2, 0xB7F4, 0xB7B3, 0xB7FC, 0xB7B4, 0xB7FD, 0xB7B5, 0xB7FF, 0xB7B6, 0xB800, + 0xB7B7, 0xB801, 0xB7B8, 0xB807, 0xB7B9, 0xB808, 0xB7BA, 0xB809, 0xB7BB, 0xB80C, 0xB7BC, 0xB810, 0xB7BD, 0xB818, 0xB7BE, 0xB819, + 0xB7BF, 0xB81B, 0xB7C0, 0xB81D, 0xB7C1, 0xB824, 0xB7C2, 0xB825, 0xB7C3, 0xB828, 0xB7C4, 0xB82C, 0xB7C5, 0xB834, 0xB7C6, 0xB835, + 0xB7C7, 0xB837, 0xB7C8, 0xB838, 0xB7C9, 0xB839, 0xB7CA, 0xB840, 0xB7CB, 0xB844, 0xB7CC, 0xB851, 0xB7CD, 0xB853, 0xB7CE, 0xB85C, + 0xB7CF, 0xB85D, 0xB7D0, 0xB860, 0xB7D1, 0xB864, 0xB7D2, 0xB86C, 0xB7D3, 0xB86D, 0xB7D4, 0xB86F, 0xB7D5, 0xB871, 0xB7D6, 0xB878, + 0xB7D7, 0xB87C, 0xB7D8, 0xB88D, 0xB7D9, 0xB8A8, 0xB7DA, 0xB8B0, 0xB7DB, 0xB8B4, 0xB7DC, 0xB8B8, 0xB7DD, 0xB8C0, 0xB7DE, 0xB8C1, + 0xB7DF, 0xB8C3, 0xB7E0, 0xB8C5, 0xB7E1, 0xB8CC, 0xB7E2, 0xB8D0, 0xB7E3, 0xB8D4, 0xB7E4, 0xB8DD, 0xB7E5, 0xB8DF, 0xB7E6, 0xB8E1, + 0xB7E7, 0xB8E8, 0xB7E8, 0xB8E9, 0xB7E9, 0xB8EC, 0xB7EA, 0xB8F0, 0xB7EB, 0xB8F8, 0xB7EC, 0xB8F9, 0xB7ED, 0xB8FB, 0xB7EE, 0xB8FD, + 0xB7EF, 0xB904, 0xB7F0, 0xB918, 0xB7F1, 0xB920, 0xB7F2, 0xB93C, 0xB7F3, 0xB93D, 0xB7F4, 0xB940, 0xB7F5, 0xB944, 0xB7F6, 0xB94C, + 0xB7F7, 0xB94F, 0xB7F8, 0xB951, 0xB7F9, 0xB958, 0xB7FA, 0xB959, 0xB7FB, 0xB95C, 0xB7FC, 0xB960, 0xB7FD, 0xB968, 0xB7FE, 0xB969, + 0xB841, 0xD1D0, 0xB842, 0xD1D1, 0xB843, 0xD1D2, 0xB844, 0xD1D3, 0xB845, 0xD1D4, 0xB846, 0xD1D5, 0xB847, 0xD1D6, 0xB848, 0xD1D7, + 0xB849, 0xD1D9, 0xB84A, 0xD1DA, 0xB84B, 0xD1DB, 0xB84C, 0xD1DC, 0xB84D, 0xD1DD, 0xB84E, 0xD1DE, 0xB84F, 0xD1DF, 0xB850, 0xD1E0, + 0xB851, 0xD1E1, 0xB852, 0xD1E2, 0xB853, 0xD1E3, 0xB854, 0xD1E4, 0xB855, 0xD1E5, 0xB856, 0xD1E6, 0xB857, 0xD1E7, 0xB858, 0xD1E8, + 0xB859, 0xD1E9, 0xB85A, 0xD1EA, 0xB861, 0xD1EB, 0xB862, 0xD1EC, 0xB863, 0xD1ED, 0xB864, 0xD1EE, 0xB865, 0xD1EF, 0xB866, 0xD1F0, + 0xB867, 0xD1F1, 0xB868, 0xD1F2, 0xB869, 0xD1F3, 0xB86A, 0xD1F5, 0xB86B, 0xD1F6, 0xB86C, 0xD1F7, 0xB86D, 0xD1F9, 0xB86E, 0xD1FA, + 0xB86F, 0xD1FB, 0xB870, 0xD1FC, 0xB871, 0xD1FD, 0xB872, 0xD1FE, 0xB873, 0xD1FF, 0xB874, 0xD200, 0xB875, 0xD201, 0xB876, 0xD202, + 0xB877, 0xD203, 0xB878, 0xD204, 0xB879, 0xD205, 0xB87A, 0xD206, 0xB881, 0xD208, 0xB882, 0xD20A, 0xB883, 0xD20B, 0xB884, 0xD20C, + 0xB885, 0xD20D, 0xB886, 0xD20E, 0xB887, 0xD20F, 0xB888, 0xD211, 0xB889, 0xD212, 0xB88A, 0xD213, 0xB88B, 0xD214, 0xB88C, 0xD215, + 0xB88D, 0xD216, 0xB88E, 0xD217, 0xB88F, 0xD218, 0xB890, 0xD219, 0xB891, 0xD21A, 0xB892, 0xD21B, 0xB893, 0xD21C, 0xB894, 0xD21D, + 0xB895, 0xD21E, 0xB896, 0xD21F, 0xB897, 0xD220, 0xB898, 0xD221, 0xB899, 0xD222, 0xB89A, 0xD223, 0xB89B, 0xD224, 0xB89C, 0xD225, + 0xB89D, 0xD226, 0xB89E, 0xD227, 0xB89F, 0xD228, 0xB8A0, 0xD229, 0xB8A1, 0xB96B, 0xB8A2, 0xB96D, 0xB8A3, 0xB974, 0xB8A4, 0xB975, + 0xB8A5, 0xB978, 0xB8A6, 0xB97C, 0xB8A7, 0xB984, 0xB8A8, 0xB985, 0xB8A9, 0xB987, 0xB8AA, 0xB989, 0xB8AB, 0xB98A, 0xB8AC, 0xB98D, + 0xB8AD, 0xB98E, 0xB8AE, 0xB9AC, 0xB8AF, 0xB9AD, 0xB8B0, 0xB9B0, 0xB8B1, 0xB9B4, 0xB8B2, 0xB9BC, 0xB8B3, 0xB9BD, 0xB8B4, 0xB9BF, + 0xB8B5, 0xB9C1, 0xB8B6, 0xB9C8, 0xB8B7, 0xB9C9, 0xB8B8, 0xB9CC, 0xB8B9, 0xB9CE, 0xB8BA, 0xB9CF, 0xB8BB, 0xB9D0, 0xB8BC, 0xB9D1, + 0xB8BD, 0xB9D2, 0xB8BE, 0xB9D8, 0xB8BF, 0xB9D9, 0xB8C0, 0xB9DB, 0xB8C1, 0xB9DD, 0xB8C2, 0xB9DE, 0xB8C3, 0xB9E1, 0xB8C4, 0xB9E3, + 0xB8C5, 0xB9E4, 0xB8C6, 0xB9E5, 0xB8C7, 0xB9E8, 0xB8C8, 0xB9EC, 0xB8C9, 0xB9F4, 0xB8CA, 0xB9F5, 0xB8CB, 0xB9F7, 0xB8CC, 0xB9F8, + 0xB8CD, 0xB9F9, 0xB8CE, 0xB9FA, 0xB8CF, 0xBA00, 0xB8D0, 0xBA01, 0xB8D1, 0xBA08, 0xB8D2, 0xBA15, 0xB8D3, 0xBA38, 0xB8D4, 0xBA39, + 0xB8D5, 0xBA3C, 0xB8D6, 0xBA40, 0xB8D7, 0xBA42, 0xB8D8, 0xBA48, 0xB8D9, 0xBA49, 0xB8DA, 0xBA4B, 0xB8DB, 0xBA4D, 0xB8DC, 0xBA4E, + 0xB8DD, 0xBA53, 0xB8DE, 0xBA54, 0xB8DF, 0xBA55, 0xB8E0, 0xBA58, 0xB8E1, 0xBA5C, 0xB8E2, 0xBA64, 0xB8E3, 0xBA65, 0xB8E4, 0xBA67, + 0xB8E5, 0xBA68, 0xB8E6, 0xBA69, 0xB8E7, 0xBA70, 0xB8E8, 0xBA71, 0xB8E9, 0xBA74, 0xB8EA, 0xBA78, 0xB8EB, 0xBA83, 0xB8EC, 0xBA84, + 0xB8ED, 0xBA85, 0xB8EE, 0xBA87, 0xB8EF, 0xBA8C, 0xB8F0, 0xBAA8, 0xB8F1, 0xBAA9, 0xB8F2, 0xBAAB, 0xB8F3, 0xBAAC, 0xB8F4, 0xBAB0, + 0xB8F5, 0xBAB2, 0xB8F6, 0xBAB8, 0xB8F7, 0xBAB9, 0xB8F8, 0xBABB, 0xB8F9, 0xBABD, 0xB8FA, 0xBAC4, 0xB8FB, 0xBAC8, 0xB8FC, 0xBAD8, + 0xB8FD, 0xBAD9, 0xB8FE, 0xBAFC, 0xB941, 0xD22A, 0xB942, 0xD22B, 0xB943, 0xD22E, 0xB944, 0xD22F, 0xB945, 0xD231, 0xB946, 0xD232, + 0xB947, 0xD233, 0xB948, 0xD235, 0xB949, 0xD236, 0xB94A, 0xD237, 0xB94B, 0xD238, 0xB94C, 0xD239, 0xB94D, 0xD23A, 0xB94E, 0xD23B, + 0xB94F, 0xD23E, 0xB950, 0xD240, 0xB951, 0xD242, 0xB952, 0xD243, 0xB953, 0xD244, 0xB954, 0xD245, 0xB955, 0xD246, 0xB956, 0xD247, + 0xB957, 0xD249, 0xB958, 0xD24A, 0xB959, 0xD24B, 0xB95A, 0xD24C, 0xB961, 0xD24D, 0xB962, 0xD24E, 0xB963, 0xD24F, 0xB964, 0xD250, + 0xB965, 0xD251, 0xB966, 0xD252, 0xB967, 0xD253, 0xB968, 0xD254, 0xB969, 0xD255, 0xB96A, 0xD256, 0xB96B, 0xD257, 0xB96C, 0xD258, + 0xB96D, 0xD259, 0xB96E, 0xD25A, 0xB96F, 0xD25B, 0xB970, 0xD25D, 0xB971, 0xD25E, 0xB972, 0xD25F, 0xB973, 0xD260, 0xB974, 0xD261, + 0xB975, 0xD262, 0xB976, 0xD263, 0xB977, 0xD265, 0xB978, 0xD266, 0xB979, 0xD267, 0xB97A, 0xD268, 0xB981, 0xD269, 0xB982, 0xD26A, + 0xB983, 0xD26B, 0xB984, 0xD26C, 0xB985, 0xD26D, 0xB986, 0xD26E, 0xB987, 0xD26F, 0xB988, 0xD270, 0xB989, 0xD271, 0xB98A, 0xD272, + 0xB98B, 0xD273, 0xB98C, 0xD274, 0xB98D, 0xD275, 0xB98E, 0xD276, 0xB98F, 0xD277, 0xB990, 0xD278, 0xB991, 0xD279, 0xB992, 0xD27A, + 0xB993, 0xD27B, 0xB994, 0xD27C, 0xB995, 0xD27D, 0xB996, 0xD27E, 0xB997, 0xD27F, 0xB998, 0xD282, 0xB999, 0xD283, 0xB99A, 0xD285, + 0xB99B, 0xD286, 0xB99C, 0xD287, 0xB99D, 0xD289, 0xB99E, 0xD28A, 0xB99F, 0xD28B, 0xB9A0, 0xD28C, 0xB9A1, 0xBB00, 0xB9A2, 0xBB04, + 0xB9A3, 0xBB0D, 0xB9A4, 0xBB0F, 0xB9A5, 0xBB11, 0xB9A6, 0xBB18, 0xB9A7, 0xBB1C, 0xB9A8, 0xBB20, 0xB9A9, 0xBB29, 0xB9AA, 0xBB2B, + 0xB9AB, 0xBB34, 0xB9AC, 0xBB35, 0xB9AD, 0xBB36, 0xB9AE, 0xBB38, 0xB9AF, 0xBB3B, 0xB9B0, 0xBB3C, 0xB9B1, 0xBB3D, 0xB9B2, 0xBB3E, + 0xB9B3, 0xBB44, 0xB9B4, 0xBB45, 0xB9B5, 0xBB47, 0xB9B6, 0xBB49, 0xB9B7, 0xBB4D, 0xB9B8, 0xBB4F, 0xB9B9, 0xBB50, 0xB9BA, 0xBB54, + 0xB9BB, 0xBB58, 0xB9BC, 0xBB61, 0xB9BD, 0xBB63, 0xB9BE, 0xBB6C, 0xB9BF, 0xBB88, 0xB9C0, 0xBB8C, 0xB9C1, 0xBB90, 0xB9C2, 0xBBA4, + 0xB9C3, 0xBBA8, 0xB9C4, 0xBBAC, 0xB9C5, 0xBBB4, 0xB9C6, 0xBBB7, 0xB9C7, 0xBBC0, 0xB9C8, 0xBBC4, 0xB9C9, 0xBBC8, 0xB9CA, 0xBBD0, + 0xB9CB, 0xBBD3, 0xB9CC, 0xBBF8, 0xB9CD, 0xBBF9, 0xB9CE, 0xBBFC, 0xB9CF, 0xBBFF, 0xB9D0, 0xBC00, 0xB9D1, 0xBC02, 0xB9D2, 0xBC08, + 0xB9D3, 0xBC09, 0xB9D4, 0xBC0B, 0xB9D5, 0xBC0C, 0xB9D6, 0xBC0D, 0xB9D7, 0xBC0F, 0xB9D8, 0xBC11, 0xB9D9, 0xBC14, 0xB9DA, 0xBC15, + 0xB9DB, 0xBC16, 0xB9DC, 0xBC17, 0xB9DD, 0xBC18, 0xB9DE, 0xBC1B, 0xB9DF, 0xBC1C, 0xB9E0, 0xBC1D, 0xB9E1, 0xBC1E, 0xB9E2, 0xBC1F, + 0xB9E3, 0xBC24, 0xB9E4, 0xBC25, 0xB9E5, 0xBC27, 0xB9E6, 0xBC29, 0xB9E7, 0xBC2D, 0xB9E8, 0xBC30, 0xB9E9, 0xBC31, 0xB9EA, 0xBC34, + 0xB9EB, 0xBC38, 0xB9EC, 0xBC40, 0xB9ED, 0xBC41, 0xB9EE, 0xBC43, 0xB9EF, 0xBC44, 0xB9F0, 0xBC45, 0xB9F1, 0xBC49, 0xB9F2, 0xBC4C, + 0xB9F3, 0xBC4D, 0xB9F4, 0xBC50, 0xB9F5, 0xBC5D, 0xB9F6, 0xBC84, 0xB9F7, 0xBC85, 0xB9F8, 0xBC88, 0xB9F9, 0xBC8B, 0xB9FA, 0xBC8C, + 0xB9FB, 0xBC8E, 0xB9FC, 0xBC94, 0xB9FD, 0xBC95, 0xB9FE, 0xBC97, 0xBA41, 0xD28D, 0xBA42, 0xD28E, 0xBA43, 0xD28F, 0xBA44, 0xD292, + 0xBA45, 0xD293, 0xBA46, 0xD294, 0xBA47, 0xD296, 0xBA48, 0xD297, 0xBA49, 0xD298, 0xBA4A, 0xD299, 0xBA4B, 0xD29A, 0xBA4C, 0xD29B, + 0xBA4D, 0xD29D, 0xBA4E, 0xD29E, 0xBA4F, 0xD29F, 0xBA50, 0xD2A1, 0xBA51, 0xD2A2, 0xBA52, 0xD2A3, 0xBA53, 0xD2A5, 0xBA54, 0xD2A6, + 0xBA55, 0xD2A7, 0xBA56, 0xD2A8, 0xBA57, 0xD2A9, 0xBA58, 0xD2AA, 0xBA59, 0xD2AB, 0xBA5A, 0xD2AD, 0xBA61, 0xD2AE, 0xBA62, 0xD2AF, + 0xBA63, 0xD2B0, 0xBA64, 0xD2B2, 0xBA65, 0xD2B3, 0xBA66, 0xD2B4, 0xBA67, 0xD2B5, 0xBA68, 0xD2B6, 0xBA69, 0xD2B7, 0xBA6A, 0xD2BA, + 0xBA6B, 0xD2BB, 0xBA6C, 0xD2BD, 0xBA6D, 0xD2BE, 0xBA6E, 0xD2C1, 0xBA6F, 0xD2C3, 0xBA70, 0xD2C4, 0xBA71, 0xD2C5, 0xBA72, 0xD2C6, + 0xBA73, 0xD2C7, 0xBA74, 0xD2CA, 0xBA75, 0xD2CC, 0xBA76, 0xD2CD, 0xBA77, 0xD2CE, 0xBA78, 0xD2CF, 0xBA79, 0xD2D0, 0xBA7A, 0xD2D1, + 0xBA81, 0xD2D2, 0xBA82, 0xD2D3, 0xBA83, 0xD2D5, 0xBA84, 0xD2D6, 0xBA85, 0xD2D7, 0xBA86, 0xD2D9, 0xBA87, 0xD2DA, 0xBA88, 0xD2DB, + 0xBA89, 0xD2DD, 0xBA8A, 0xD2DE, 0xBA8B, 0xD2DF, 0xBA8C, 0xD2E0, 0xBA8D, 0xD2E1, 0xBA8E, 0xD2E2, 0xBA8F, 0xD2E3, 0xBA90, 0xD2E6, + 0xBA91, 0xD2E7, 0xBA92, 0xD2E8, 0xBA93, 0xD2E9, 0xBA94, 0xD2EA, 0xBA95, 0xD2EB, 0xBA96, 0xD2EC, 0xBA97, 0xD2ED, 0xBA98, 0xD2EE, + 0xBA99, 0xD2EF, 0xBA9A, 0xD2F2, 0xBA9B, 0xD2F3, 0xBA9C, 0xD2F5, 0xBA9D, 0xD2F6, 0xBA9E, 0xD2F7, 0xBA9F, 0xD2F9, 0xBAA0, 0xD2FA, + 0xBAA1, 0xBC99, 0xBAA2, 0xBC9A, 0xBAA3, 0xBCA0, 0xBAA4, 0xBCA1, 0xBAA5, 0xBCA4, 0xBAA6, 0xBCA7, 0xBAA7, 0xBCA8, 0xBAA8, 0xBCB0, + 0xBAA9, 0xBCB1, 0xBAAA, 0xBCB3, 0xBAAB, 0xBCB4, 0xBAAC, 0xBCB5, 0xBAAD, 0xBCBC, 0xBAAE, 0xBCBD, 0xBAAF, 0xBCC0, 0xBAB0, 0xBCC4, + 0xBAB1, 0xBCCD, 0xBAB2, 0xBCCF, 0xBAB3, 0xBCD0, 0xBAB4, 0xBCD1, 0xBAB5, 0xBCD5, 0xBAB6, 0xBCD8, 0xBAB7, 0xBCDC, 0xBAB8, 0xBCF4, + 0xBAB9, 0xBCF5, 0xBABA, 0xBCF6, 0xBABB, 0xBCF8, 0xBABC, 0xBCFC, 0xBABD, 0xBD04, 0xBABE, 0xBD05, 0xBABF, 0xBD07, 0xBAC0, 0xBD09, + 0xBAC1, 0xBD10, 0xBAC2, 0xBD14, 0xBAC3, 0xBD24, 0xBAC4, 0xBD2C, 0xBAC5, 0xBD40, 0xBAC6, 0xBD48, 0xBAC7, 0xBD49, 0xBAC8, 0xBD4C, + 0xBAC9, 0xBD50, 0xBACA, 0xBD58, 0xBACB, 0xBD59, 0xBACC, 0xBD64, 0xBACD, 0xBD68, 0xBACE, 0xBD80, 0xBACF, 0xBD81, 0xBAD0, 0xBD84, + 0xBAD1, 0xBD87, 0xBAD2, 0xBD88, 0xBAD3, 0xBD89, 0xBAD4, 0xBD8A, 0xBAD5, 0xBD90, 0xBAD6, 0xBD91, 0xBAD7, 0xBD93, 0xBAD8, 0xBD95, + 0xBAD9, 0xBD99, 0xBADA, 0xBD9A, 0xBADB, 0xBD9C, 0xBADC, 0xBDA4, 0xBADD, 0xBDB0, 0xBADE, 0xBDB8, 0xBADF, 0xBDD4, 0xBAE0, 0xBDD5, + 0xBAE1, 0xBDD8, 0xBAE2, 0xBDDC, 0xBAE3, 0xBDE9, 0xBAE4, 0xBDF0, 0xBAE5, 0xBDF4, 0xBAE6, 0xBDF8, 0xBAE7, 0xBE00, 0xBAE8, 0xBE03, + 0xBAE9, 0xBE05, 0xBAEA, 0xBE0C, 0xBAEB, 0xBE0D, 0xBAEC, 0xBE10, 0xBAED, 0xBE14, 0xBAEE, 0xBE1C, 0xBAEF, 0xBE1D, 0xBAF0, 0xBE1F, + 0xBAF1, 0xBE44, 0xBAF2, 0xBE45, 0xBAF3, 0xBE48, 0xBAF4, 0xBE4C, 0xBAF5, 0xBE4E, 0xBAF6, 0xBE54, 0xBAF7, 0xBE55, 0xBAF8, 0xBE57, + 0xBAF9, 0xBE59, 0xBAFA, 0xBE5A, 0xBAFB, 0xBE5B, 0xBAFC, 0xBE60, 0xBAFD, 0xBE61, 0xBAFE, 0xBE64, 0xBB41, 0xD2FB, 0xBB42, 0xD2FC, + 0xBB43, 0xD2FD, 0xBB44, 0xD2FE, 0xBB45, 0xD2FF, 0xBB46, 0xD302, 0xBB47, 0xD304, 0xBB48, 0xD306, 0xBB49, 0xD307, 0xBB4A, 0xD308, + 0xBB4B, 0xD309, 0xBB4C, 0xD30A, 0xBB4D, 0xD30B, 0xBB4E, 0xD30F, 0xBB4F, 0xD311, 0xBB50, 0xD312, 0xBB51, 0xD313, 0xBB52, 0xD315, + 0xBB53, 0xD317, 0xBB54, 0xD318, 0xBB55, 0xD319, 0xBB56, 0xD31A, 0xBB57, 0xD31B, 0xBB58, 0xD31E, 0xBB59, 0xD322, 0xBB5A, 0xD323, + 0xBB61, 0xD324, 0xBB62, 0xD326, 0xBB63, 0xD327, 0xBB64, 0xD32A, 0xBB65, 0xD32B, 0xBB66, 0xD32D, 0xBB67, 0xD32E, 0xBB68, 0xD32F, + 0xBB69, 0xD331, 0xBB6A, 0xD332, 0xBB6B, 0xD333, 0xBB6C, 0xD334, 0xBB6D, 0xD335, 0xBB6E, 0xD336, 0xBB6F, 0xD337, 0xBB70, 0xD33A, + 0xBB71, 0xD33E, 0xBB72, 0xD33F, 0xBB73, 0xD340, 0xBB74, 0xD341, 0xBB75, 0xD342, 0xBB76, 0xD343, 0xBB77, 0xD346, 0xBB78, 0xD347, + 0xBB79, 0xD348, 0xBB7A, 0xD349, 0xBB81, 0xD34A, 0xBB82, 0xD34B, 0xBB83, 0xD34C, 0xBB84, 0xD34D, 0xBB85, 0xD34E, 0xBB86, 0xD34F, + 0xBB87, 0xD350, 0xBB88, 0xD351, 0xBB89, 0xD352, 0xBB8A, 0xD353, 0xBB8B, 0xD354, 0xBB8C, 0xD355, 0xBB8D, 0xD356, 0xBB8E, 0xD357, + 0xBB8F, 0xD358, 0xBB90, 0xD359, 0xBB91, 0xD35A, 0xBB92, 0xD35B, 0xBB93, 0xD35C, 0xBB94, 0xD35D, 0xBB95, 0xD35E, 0xBB96, 0xD35F, + 0xBB97, 0xD360, 0xBB98, 0xD361, 0xBB99, 0xD362, 0xBB9A, 0xD363, 0xBB9B, 0xD364, 0xBB9C, 0xD365, 0xBB9D, 0xD366, 0xBB9E, 0xD367, + 0xBB9F, 0xD368, 0xBBA0, 0xD369, 0xBBA1, 0xBE68, 0xBBA2, 0xBE6A, 0xBBA3, 0xBE70, 0xBBA4, 0xBE71, 0xBBA5, 0xBE73, 0xBBA6, 0xBE74, + 0xBBA7, 0xBE75, 0xBBA8, 0xBE7B, 0xBBA9, 0xBE7C, 0xBBAA, 0xBE7D, 0xBBAB, 0xBE80, 0xBBAC, 0xBE84, 0xBBAD, 0xBE8C, 0xBBAE, 0xBE8D, + 0xBBAF, 0xBE8F, 0xBBB0, 0xBE90, 0xBBB1, 0xBE91, 0xBBB2, 0xBE98, 0xBBB3, 0xBE99, 0xBBB4, 0xBEA8, 0xBBB5, 0xBED0, 0xBBB6, 0xBED1, + 0xBBB7, 0xBED4, 0xBBB8, 0xBED7, 0xBBB9, 0xBED8, 0xBBBA, 0xBEE0, 0xBBBB, 0xBEE3, 0xBBBC, 0xBEE4, 0xBBBD, 0xBEE5, 0xBBBE, 0xBEEC, + 0xBBBF, 0xBF01, 0xBBC0, 0xBF08, 0xBBC1, 0xBF09, 0xBBC2, 0xBF18, 0xBBC3, 0xBF19, 0xBBC4, 0xBF1B, 0xBBC5, 0xBF1C, 0xBBC6, 0xBF1D, + 0xBBC7, 0xBF40, 0xBBC8, 0xBF41, 0xBBC9, 0xBF44, 0xBBCA, 0xBF48, 0xBBCB, 0xBF50, 0xBBCC, 0xBF51, 0xBBCD, 0xBF55, 0xBBCE, 0xBF94, + 0xBBCF, 0xBFB0, 0xBBD0, 0xBFC5, 0xBBD1, 0xBFCC, 0xBBD2, 0xBFCD, 0xBBD3, 0xBFD0, 0xBBD4, 0xBFD4, 0xBBD5, 0xBFDC, 0xBBD6, 0xBFDF, + 0xBBD7, 0xBFE1, 0xBBD8, 0xC03C, 0xBBD9, 0xC051, 0xBBDA, 0xC058, 0xBBDB, 0xC05C, 0xBBDC, 0xC060, 0xBBDD, 0xC068, 0xBBDE, 0xC069, + 0xBBDF, 0xC090, 0xBBE0, 0xC091, 0xBBE1, 0xC094, 0xBBE2, 0xC098, 0xBBE3, 0xC0A0, 0xBBE4, 0xC0A1, 0xBBE5, 0xC0A3, 0xBBE6, 0xC0A5, + 0xBBE7, 0xC0AC, 0xBBE8, 0xC0AD, 0xBBE9, 0xC0AF, 0xBBEA, 0xC0B0, 0xBBEB, 0xC0B3, 0xBBEC, 0xC0B4, 0xBBED, 0xC0B5, 0xBBEE, 0xC0B6, + 0xBBEF, 0xC0BC, 0xBBF0, 0xC0BD, 0xBBF1, 0xC0BF, 0xBBF2, 0xC0C0, 0xBBF3, 0xC0C1, 0xBBF4, 0xC0C5, 0xBBF5, 0xC0C8, 0xBBF6, 0xC0C9, + 0xBBF7, 0xC0CC, 0xBBF8, 0xC0D0, 0xBBF9, 0xC0D8, 0xBBFA, 0xC0D9, 0xBBFB, 0xC0DB, 0xBBFC, 0xC0DC, 0xBBFD, 0xC0DD, 0xBBFE, 0xC0E4, + 0xBC41, 0xD36A, 0xBC42, 0xD36B, 0xBC43, 0xD36C, 0xBC44, 0xD36D, 0xBC45, 0xD36E, 0xBC46, 0xD36F, 0xBC47, 0xD370, 0xBC48, 0xD371, + 0xBC49, 0xD372, 0xBC4A, 0xD373, 0xBC4B, 0xD374, 0xBC4C, 0xD375, 0xBC4D, 0xD376, 0xBC4E, 0xD377, 0xBC4F, 0xD378, 0xBC50, 0xD379, + 0xBC51, 0xD37A, 0xBC52, 0xD37B, 0xBC53, 0xD37E, 0xBC54, 0xD37F, 0xBC55, 0xD381, 0xBC56, 0xD382, 0xBC57, 0xD383, 0xBC58, 0xD385, + 0xBC59, 0xD386, 0xBC5A, 0xD387, 0xBC61, 0xD388, 0xBC62, 0xD389, 0xBC63, 0xD38A, 0xBC64, 0xD38B, 0xBC65, 0xD38E, 0xBC66, 0xD392, + 0xBC67, 0xD393, 0xBC68, 0xD394, 0xBC69, 0xD395, 0xBC6A, 0xD396, 0xBC6B, 0xD397, 0xBC6C, 0xD39A, 0xBC6D, 0xD39B, 0xBC6E, 0xD39D, + 0xBC6F, 0xD39E, 0xBC70, 0xD39F, 0xBC71, 0xD3A1, 0xBC72, 0xD3A2, 0xBC73, 0xD3A3, 0xBC74, 0xD3A4, 0xBC75, 0xD3A5, 0xBC76, 0xD3A6, + 0xBC77, 0xD3A7, 0xBC78, 0xD3AA, 0xBC79, 0xD3AC, 0xBC7A, 0xD3AE, 0xBC81, 0xD3AF, 0xBC82, 0xD3B0, 0xBC83, 0xD3B1, 0xBC84, 0xD3B2, + 0xBC85, 0xD3B3, 0xBC86, 0xD3B5, 0xBC87, 0xD3B6, 0xBC88, 0xD3B7, 0xBC89, 0xD3B9, 0xBC8A, 0xD3BA, 0xBC8B, 0xD3BB, 0xBC8C, 0xD3BD, + 0xBC8D, 0xD3BE, 0xBC8E, 0xD3BF, 0xBC8F, 0xD3C0, 0xBC90, 0xD3C1, 0xBC91, 0xD3C2, 0xBC92, 0xD3C3, 0xBC93, 0xD3C6, 0xBC94, 0xD3C7, + 0xBC95, 0xD3CA, 0xBC96, 0xD3CB, 0xBC97, 0xD3CC, 0xBC98, 0xD3CD, 0xBC99, 0xD3CE, 0xBC9A, 0xD3CF, 0xBC9B, 0xD3D1, 0xBC9C, 0xD3D2, + 0xBC9D, 0xD3D3, 0xBC9E, 0xD3D4, 0xBC9F, 0xD3D5, 0xBCA0, 0xD3D6, 0xBCA1, 0xC0E5, 0xBCA2, 0xC0E8, 0xBCA3, 0xC0EC, 0xBCA4, 0xC0F4, + 0xBCA5, 0xC0F5, 0xBCA6, 0xC0F7, 0xBCA7, 0xC0F9, 0xBCA8, 0xC100, 0xBCA9, 0xC104, 0xBCAA, 0xC108, 0xBCAB, 0xC110, 0xBCAC, 0xC115, + 0xBCAD, 0xC11C, 0xBCAE, 0xC11D, 0xBCAF, 0xC11E, 0xBCB0, 0xC11F, 0xBCB1, 0xC120, 0xBCB2, 0xC123, 0xBCB3, 0xC124, 0xBCB4, 0xC126, + 0xBCB5, 0xC127, 0xBCB6, 0xC12C, 0xBCB7, 0xC12D, 0xBCB8, 0xC12F, 0xBCB9, 0xC130, 0xBCBA, 0xC131, 0xBCBB, 0xC136, 0xBCBC, 0xC138, + 0xBCBD, 0xC139, 0xBCBE, 0xC13C, 0xBCBF, 0xC140, 0xBCC0, 0xC148, 0xBCC1, 0xC149, 0xBCC2, 0xC14B, 0xBCC3, 0xC14C, 0xBCC4, 0xC14D, + 0xBCC5, 0xC154, 0xBCC6, 0xC155, 0xBCC7, 0xC158, 0xBCC8, 0xC15C, 0xBCC9, 0xC164, 0xBCCA, 0xC165, 0xBCCB, 0xC167, 0xBCCC, 0xC168, + 0xBCCD, 0xC169, 0xBCCE, 0xC170, 0xBCCF, 0xC174, 0xBCD0, 0xC178, 0xBCD1, 0xC185, 0xBCD2, 0xC18C, 0xBCD3, 0xC18D, 0xBCD4, 0xC18E, + 0xBCD5, 0xC190, 0xBCD6, 0xC194, 0xBCD7, 0xC196, 0xBCD8, 0xC19C, 0xBCD9, 0xC19D, 0xBCDA, 0xC19F, 0xBCDB, 0xC1A1, 0xBCDC, 0xC1A5, + 0xBCDD, 0xC1A8, 0xBCDE, 0xC1A9, 0xBCDF, 0xC1AC, 0xBCE0, 0xC1B0, 0xBCE1, 0xC1BD, 0xBCE2, 0xC1C4, 0xBCE3, 0xC1C8, 0xBCE4, 0xC1CC, + 0xBCE5, 0xC1D4, 0xBCE6, 0xC1D7, 0xBCE7, 0xC1D8, 0xBCE8, 0xC1E0, 0xBCE9, 0xC1E4, 0xBCEA, 0xC1E8, 0xBCEB, 0xC1F0, 0xBCEC, 0xC1F1, + 0xBCED, 0xC1F3, 0xBCEE, 0xC1FC, 0xBCEF, 0xC1FD, 0xBCF0, 0xC200, 0xBCF1, 0xC204, 0xBCF2, 0xC20C, 0xBCF3, 0xC20D, 0xBCF4, 0xC20F, + 0xBCF5, 0xC211, 0xBCF6, 0xC218, 0xBCF7, 0xC219, 0xBCF8, 0xC21C, 0xBCF9, 0xC21F, 0xBCFA, 0xC220, 0xBCFB, 0xC228, 0xBCFC, 0xC229, + 0xBCFD, 0xC22B, 0xBCFE, 0xC22D, 0xBD41, 0xD3D7, 0xBD42, 0xD3D9, 0xBD43, 0xD3DA, 0xBD44, 0xD3DB, 0xBD45, 0xD3DC, 0xBD46, 0xD3DD, + 0xBD47, 0xD3DE, 0xBD48, 0xD3DF, 0xBD49, 0xD3E0, 0xBD4A, 0xD3E2, 0xBD4B, 0xD3E4, 0xBD4C, 0xD3E5, 0xBD4D, 0xD3E6, 0xBD4E, 0xD3E7, + 0xBD4F, 0xD3E8, 0xBD50, 0xD3E9, 0xBD51, 0xD3EA, 0xBD52, 0xD3EB, 0xBD53, 0xD3EE, 0xBD54, 0xD3EF, 0xBD55, 0xD3F1, 0xBD56, 0xD3F2, + 0xBD57, 0xD3F3, 0xBD58, 0xD3F5, 0xBD59, 0xD3F6, 0xBD5A, 0xD3F7, 0xBD61, 0xD3F8, 0xBD62, 0xD3F9, 0xBD63, 0xD3FA, 0xBD64, 0xD3FB, + 0xBD65, 0xD3FE, 0xBD66, 0xD400, 0xBD67, 0xD402, 0xBD68, 0xD403, 0xBD69, 0xD404, 0xBD6A, 0xD405, 0xBD6B, 0xD406, 0xBD6C, 0xD407, + 0xBD6D, 0xD409, 0xBD6E, 0xD40A, 0xBD6F, 0xD40B, 0xBD70, 0xD40C, 0xBD71, 0xD40D, 0xBD72, 0xD40E, 0xBD73, 0xD40F, 0xBD74, 0xD410, + 0xBD75, 0xD411, 0xBD76, 0xD412, 0xBD77, 0xD413, 0xBD78, 0xD414, 0xBD79, 0xD415, 0xBD7A, 0xD416, 0xBD81, 0xD417, 0xBD82, 0xD418, + 0xBD83, 0xD419, 0xBD84, 0xD41A, 0xBD85, 0xD41B, 0xBD86, 0xD41C, 0xBD87, 0xD41E, 0xBD88, 0xD41F, 0xBD89, 0xD420, 0xBD8A, 0xD421, + 0xBD8B, 0xD422, 0xBD8C, 0xD423, 0xBD8D, 0xD424, 0xBD8E, 0xD425, 0xBD8F, 0xD426, 0xBD90, 0xD427, 0xBD91, 0xD428, 0xBD92, 0xD429, + 0xBD93, 0xD42A, 0xBD94, 0xD42B, 0xBD95, 0xD42C, 0xBD96, 0xD42D, 0xBD97, 0xD42E, 0xBD98, 0xD42F, 0xBD99, 0xD430, 0xBD9A, 0xD431, + 0xBD9B, 0xD432, 0xBD9C, 0xD433, 0xBD9D, 0xD434, 0xBD9E, 0xD435, 0xBD9F, 0xD436, 0xBDA0, 0xD437, 0xBDA1, 0xC22F, 0xBDA2, 0xC231, + 0xBDA3, 0xC232, 0xBDA4, 0xC234, 0xBDA5, 0xC248, 0xBDA6, 0xC250, 0xBDA7, 0xC251, 0xBDA8, 0xC254, 0xBDA9, 0xC258, 0xBDAA, 0xC260, + 0xBDAB, 0xC265, 0xBDAC, 0xC26C, 0xBDAD, 0xC26D, 0xBDAE, 0xC270, 0xBDAF, 0xC274, 0xBDB0, 0xC27C, 0xBDB1, 0xC27D, 0xBDB2, 0xC27F, + 0xBDB3, 0xC281, 0xBDB4, 0xC288, 0xBDB5, 0xC289, 0xBDB6, 0xC290, 0xBDB7, 0xC298, 0xBDB8, 0xC29B, 0xBDB9, 0xC29D, 0xBDBA, 0xC2A4, + 0xBDBB, 0xC2A5, 0xBDBC, 0xC2A8, 0xBDBD, 0xC2AC, 0xBDBE, 0xC2AD, 0xBDBF, 0xC2B4, 0xBDC0, 0xC2B5, 0xBDC1, 0xC2B7, 0xBDC2, 0xC2B9, + 0xBDC3, 0xC2DC, 0xBDC4, 0xC2DD, 0xBDC5, 0xC2E0, 0xBDC6, 0xC2E3, 0xBDC7, 0xC2E4, 0xBDC8, 0xC2EB, 0xBDC9, 0xC2EC, 0xBDCA, 0xC2ED, + 0xBDCB, 0xC2EF, 0xBDCC, 0xC2F1, 0xBDCD, 0xC2F6, 0xBDCE, 0xC2F8, 0xBDCF, 0xC2F9, 0xBDD0, 0xC2FB, 0xBDD1, 0xC2FC, 0xBDD2, 0xC300, + 0xBDD3, 0xC308, 0xBDD4, 0xC309, 0xBDD5, 0xC30C, 0xBDD6, 0xC30D, 0xBDD7, 0xC313, 0xBDD8, 0xC314, 0xBDD9, 0xC315, 0xBDDA, 0xC318, + 0xBDDB, 0xC31C, 0xBDDC, 0xC324, 0xBDDD, 0xC325, 0xBDDE, 0xC328, 0xBDDF, 0xC329, 0xBDE0, 0xC345, 0xBDE1, 0xC368, 0xBDE2, 0xC369, + 0xBDE3, 0xC36C, 0xBDE4, 0xC370, 0xBDE5, 0xC372, 0xBDE6, 0xC378, 0xBDE7, 0xC379, 0xBDE8, 0xC37C, 0xBDE9, 0xC37D, 0xBDEA, 0xC384, + 0xBDEB, 0xC388, 0xBDEC, 0xC38C, 0xBDED, 0xC3C0, 0xBDEE, 0xC3D8, 0xBDEF, 0xC3D9, 0xBDF0, 0xC3DC, 0xBDF1, 0xC3DF, 0xBDF2, 0xC3E0, + 0xBDF3, 0xC3E2, 0xBDF4, 0xC3E8, 0xBDF5, 0xC3E9, 0xBDF6, 0xC3ED, 0xBDF7, 0xC3F4, 0xBDF8, 0xC3F5, 0xBDF9, 0xC3F8, 0xBDFA, 0xC408, + 0xBDFB, 0xC410, 0xBDFC, 0xC424, 0xBDFD, 0xC42C, 0xBDFE, 0xC430, 0xBE41, 0xD438, 0xBE42, 0xD439, 0xBE43, 0xD43A, 0xBE44, 0xD43B, + 0xBE45, 0xD43C, 0xBE46, 0xD43D, 0xBE47, 0xD43E, 0xBE48, 0xD43F, 0xBE49, 0xD441, 0xBE4A, 0xD442, 0xBE4B, 0xD443, 0xBE4C, 0xD445, + 0xBE4D, 0xD446, 0xBE4E, 0xD447, 0xBE4F, 0xD448, 0xBE50, 0xD449, 0xBE51, 0xD44A, 0xBE52, 0xD44B, 0xBE53, 0xD44C, 0xBE54, 0xD44D, + 0xBE55, 0xD44E, 0xBE56, 0xD44F, 0xBE57, 0xD450, 0xBE58, 0xD451, 0xBE59, 0xD452, 0xBE5A, 0xD453, 0xBE61, 0xD454, 0xBE62, 0xD455, + 0xBE63, 0xD456, 0xBE64, 0xD457, 0xBE65, 0xD458, 0xBE66, 0xD459, 0xBE67, 0xD45A, 0xBE68, 0xD45B, 0xBE69, 0xD45D, 0xBE6A, 0xD45E, + 0xBE6B, 0xD45F, 0xBE6C, 0xD461, 0xBE6D, 0xD462, 0xBE6E, 0xD463, 0xBE6F, 0xD465, 0xBE70, 0xD466, 0xBE71, 0xD467, 0xBE72, 0xD468, + 0xBE73, 0xD469, 0xBE74, 0xD46A, 0xBE75, 0xD46B, 0xBE76, 0xD46C, 0xBE77, 0xD46E, 0xBE78, 0xD470, 0xBE79, 0xD471, 0xBE7A, 0xD472, + 0xBE81, 0xD473, 0xBE82, 0xD474, 0xBE83, 0xD475, 0xBE84, 0xD476, 0xBE85, 0xD477, 0xBE86, 0xD47A, 0xBE87, 0xD47B, 0xBE88, 0xD47D, + 0xBE89, 0xD47E, 0xBE8A, 0xD481, 0xBE8B, 0xD483, 0xBE8C, 0xD484, 0xBE8D, 0xD485, 0xBE8E, 0xD486, 0xBE8F, 0xD487, 0xBE90, 0xD48A, + 0xBE91, 0xD48C, 0xBE92, 0xD48E, 0xBE93, 0xD48F, 0xBE94, 0xD490, 0xBE95, 0xD491, 0xBE96, 0xD492, 0xBE97, 0xD493, 0xBE98, 0xD495, + 0xBE99, 0xD496, 0xBE9A, 0xD497, 0xBE9B, 0xD498, 0xBE9C, 0xD499, 0xBE9D, 0xD49A, 0xBE9E, 0xD49B, 0xBE9F, 0xD49C, 0xBEA0, 0xD49D, + 0xBEA1, 0xC434, 0xBEA2, 0xC43C, 0xBEA3, 0xC43D, 0xBEA4, 0xC448, 0xBEA5, 0xC464, 0xBEA6, 0xC465, 0xBEA7, 0xC468, 0xBEA8, 0xC46C, + 0xBEA9, 0xC474, 0xBEAA, 0xC475, 0xBEAB, 0xC479, 0xBEAC, 0xC480, 0xBEAD, 0xC494, 0xBEAE, 0xC49C, 0xBEAF, 0xC4B8, 0xBEB0, 0xC4BC, + 0xBEB1, 0xC4E9, 0xBEB2, 0xC4F0, 0xBEB3, 0xC4F1, 0xBEB4, 0xC4F4, 0xBEB5, 0xC4F8, 0xBEB6, 0xC4FA, 0xBEB7, 0xC4FF, 0xBEB8, 0xC500, + 0xBEB9, 0xC501, 0xBEBA, 0xC50C, 0xBEBB, 0xC510, 0xBEBC, 0xC514, 0xBEBD, 0xC51C, 0xBEBE, 0xC528, 0xBEBF, 0xC529, 0xBEC0, 0xC52C, + 0xBEC1, 0xC530, 0xBEC2, 0xC538, 0xBEC3, 0xC539, 0xBEC4, 0xC53B, 0xBEC5, 0xC53D, 0xBEC6, 0xC544, 0xBEC7, 0xC545, 0xBEC8, 0xC548, + 0xBEC9, 0xC549, 0xBECA, 0xC54A, 0xBECB, 0xC54C, 0xBECC, 0xC54D, 0xBECD, 0xC54E, 0xBECE, 0xC553, 0xBECF, 0xC554, 0xBED0, 0xC555, + 0xBED1, 0xC557, 0xBED2, 0xC558, 0xBED3, 0xC559, 0xBED4, 0xC55D, 0xBED5, 0xC55E, 0xBED6, 0xC560, 0xBED7, 0xC561, 0xBED8, 0xC564, + 0xBED9, 0xC568, 0xBEDA, 0xC570, 0xBEDB, 0xC571, 0xBEDC, 0xC573, 0xBEDD, 0xC574, 0xBEDE, 0xC575, 0xBEDF, 0xC57C, 0xBEE0, 0xC57D, + 0xBEE1, 0xC580, 0xBEE2, 0xC584, 0xBEE3, 0xC587, 0xBEE4, 0xC58C, 0xBEE5, 0xC58D, 0xBEE6, 0xC58F, 0xBEE7, 0xC591, 0xBEE8, 0xC595, + 0xBEE9, 0xC597, 0xBEEA, 0xC598, 0xBEEB, 0xC59C, 0xBEEC, 0xC5A0, 0xBEED, 0xC5A9, 0xBEEE, 0xC5B4, 0xBEEF, 0xC5B5, 0xBEF0, 0xC5B8, + 0xBEF1, 0xC5B9, 0xBEF2, 0xC5BB, 0xBEF3, 0xC5BC, 0xBEF4, 0xC5BD, 0xBEF5, 0xC5BE, 0xBEF6, 0xC5C4, 0xBEF7, 0xC5C5, 0xBEF8, 0xC5C6, + 0xBEF9, 0xC5C7, 0xBEFA, 0xC5C8, 0xBEFB, 0xC5C9, 0xBEFC, 0xC5CA, 0xBEFD, 0xC5CC, 0xBEFE, 0xC5CE, 0xBF41, 0xD49E, 0xBF42, 0xD49F, + 0xBF43, 0xD4A0, 0xBF44, 0xD4A1, 0xBF45, 0xD4A2, 0xBF46, 0xD4A3, 0xBF47, 0xD4A4, 0xBF48, 0xD4A5, 0xBF49, 0xD4A6, 0xBF4A, 0xD4A7, + 0xBF4B, 0xD4A8, 0xBF4C, 0xD4AA, 0xBF4D, 0xD4AB, 0xBF4E, 0xD4AC, 0xBF4F, 0xD4AD, 0xBF50, 0xD4AE, 0xBF51, 0xD4AF, 0xBF52, 0xD4B0, + 0xBF53, 0xD4B1, 0xBF54, 0xD4B2, 0xBF55, 0xD4B3, 0xBF56, 0xD4B4, 0xBF57, 0xD4B5, 0xBF58, 0xD4B6, 0xBF59, 0xD4B7, 0xBF5A, 0xD4B8, + 0xBF61, 0xD4B9, 0xBF62, 0xD4BA, 0xBF63, 0xD4BB, 0xBF64, 0xD4BC, 0xBF65, 0xD4BD, 0xBF66, 0xD4BE, 0xBF67, 0xD4BF, 0xBF68, 0xD4C0, + 0xBF69, 0xD4C1, 0xBF6A, 0xD4C2, 0xBF6B, 0xD4C3, 0xBF6C, 0xD4C4, 0xBF6D, 0xD4C5, 0xBF6E, 0xD4C6, 0xBF6F, 0xD4C7, 0xBF70, 0xD4C8, + 0xBF71, 0xD4C9, 0xBF72, 0xD4CA, 0xBF73, 0xD4CB, 0xBF74, 0xD4CD, 0xBF75, 0xD4CE, 0xBF76, 0xD4CF, 0xBF77, 0xD4D1, 0xBF78, 0xD4D2, + 0xBF79, 0xD4D3, 0xBF7A, 0xD4D5, 0xBF81, 0xD4D6, 0xBF82, 0xD4D7, 0xBF83, 0xD4D8, 0xBF84, 0xD4D9, 0xBF85, 0xD4DA, 0xBF86, 0xD4DB, + 0xBF87, 0xD4DD, 0xBF88, 0xD4DE, 0xBF89, 0xD4E0, 0xBF8A, 0xD4E1, 0xBF8B, 0xD4E2, 0xBF8C, 0xD4E3, 0xBF8D, 0xD4E4, 0xBF8E, 0xD4E5, + 0xBF8F, 0xD4E6, 0xBF90, 0xD4E7, 0xBF91, 0xD4E9, 0xBF92, 0xD4EA, 0xBF93, 0xD4EB, 0xBF94, 0xD4ED, 0xBF95, 0xD4EE, 0xBF96, 0xD4EF, + 0xBF97, 0xD4F1, 0xBF98, 0xD4F2, 0xBF99, 0xD4F3, 0xBF9A, 0xD4F4, 0xBF9B, 0xD4F5, 0xBF9C, 0xD4F6, 0xBF9D, 0xD4F7, 0xBF9E, 0xD4F9, + 0xBF9F, 0xD4FA, 0xBFA0, 0xD4FC, 0xBFA1, 0xC5D0, 0xBFA2, 0xC5D1, 0xBFA3, 0xC5D4, 0xBFA4, 0xC5D8, 0xBFA5, 0xC5E0, 0xBFA6, 0xC5E1, + 0xBFA7, 0xC5E3, 0xBFA8, 0xC5E5, 0xBFA9, 0xC5EC, 0xBFAA, 0xC5ED, 0xBFAB, 0xC5EE, 0xBFAC, 0xC5F0, 0xBFAD, 0xC5F4, 0xBFAE, 0xC5F6, + 0xBFAF, 0xC5F7, 0xBFB0, 0xC5FC, 0xBFB1, 0xC5FD, 0xBFB2, 0xC5FE, 0xBFB3, 0xC5FF, 0xBFB4, 0xC600, 0xBFB5, 0xC601, 0xBFB6, 0xC605, + 0xBFB7, 0xC606, 0xBFB8, 0xC607, 0xBFB9, 0xC608, 0xBFBA, 0xC60C, 0xBFBB, 0xC610, 0xBFBC, 0xC618, 0xBFBD, 0xC619, 0xBFBE, 0xC61B, + 0xBFBF, 0xC61C, 0xBFC0, 0xC624, 0xBFC1, 0xC625, 0xBFC2, 0xC628, 0xBFC3, 0xC62C, 0xBFC4, 0xC62D, 0xBFC5, 0xC62E, 0xBFC6, 0xC630, + 0xBFC7, 0xC633, 0xBFC8, 0xC634, 0xBFC9, 0xC635, 0xBFCA, 0xC637, 0xBFCB, 0xC639, 0xBFCC, 0xC63B, 0xBFCD, 0xC640, 0xBFCE, 0xC641, + 0xBFCF, 0xC644, 0xBFD0, 0xC648, 0xBFD1, 0xC650, 0xBFD2, 0xC651, 0xBFD3, 0xC653, 0xBFD4, 0xC654, 0xBFD5, 0xC655, 0xBFD6, 0xC65C, + 0xBFD7, 0xC65D, 0xBFD8, 0xC660, 0xBFD9, 0xC66C, 0xBFDA, 0xC66F, 0xBFDB, 0xC671, 0xBFDC, 0xC678, 0xBFDD, 0xC679, 0xBFDE, 0xC67C, + 0xBFDF, 0xC680, 0xBFE0, 0xC688, 0xBFE1, 0xC689, 0xBFE2, 0xC68B, 0xBFE3, 0xC68D, 0xBFE4, 0xC694, 0xBFE5, 0xC695, 0xBFE6, 0xC698, + 0xBFE7, 0xC69C, 0xBFE8, 0xC6A4, 0xBFE9, 0xC6A5, 0xBFEA, 0xC6A7, 0xBFEB, 0xC6A9, 0xBFEC, 0xC6B0, 0xBFED, 0xC6B1, 0xBFEE, 0xC6B4, + 0xBFEF, 0xC6B8, 0xBFF0, 0xC6B9, 0xBFF1, 0xC6BA, 0xBFF2, 0xC6C0, 0xBFF3, 0xC6C1, 0xBFF4, 0xC6C3, 0xBFF5, 0xC6C5, 0xBFF6, 0xC6CC, + 0xBFF7, 0xC6CD, 0xBFF8, 0xC6D0, 0xBFF9, 0xC6D4, 0xBFFA, 0xC6DC, 0xBFFB, 0xC6DD, 0xBFFC, 0xC6E0, 0xBFFD, 0xC6E1, 0xBFFE, 0xC6E8, + 0xC041, 0xD4FE, 0xC042, 0xD4FF, 0xC043, 0xD500, 0xC044, 0xD501, 0xC045, 0xD502, 0xC046, 0xD503, 0xC047, 0xD505, 0xC048, 0xD506, + 0xC049, 0xD507, 0xC04A, 0xD509, 0xC04B, 0xD50A, 0xC04C, 0xD50B, 0xC04D, 0xD50D, 0xC04E, 0xD50E, 0xC04F, 0xD50F, 0xC050, 0xD510, + 0xC051, 0xD511, 0xC052, 0xD512, 0xC053, 0xD513, 0xC054, 0xD516, 0xC055, 0xD518, 0xC056, 0xD519, 0xC057, 0xD51A, 0xC058, 0xD51B, + 0xC059, 0xD51C, 0xC05A, 0xD51D, 0xC061, 0xD51E, 0xC062, 0xD51F, 0xC063, 0xD520, 0xC064, 0xD521, 0xC065, 0xD522, 0xC066, 0xD523, + 0xC067, 0xD524, 0xC068, 0xD525, 0xC069, 0xD526, 0xC06A, 0xD527, 0xC06B, 0xD528, 0xC06C, 0xD529, 0xC06D, 0xD52A, 0xC06E, 0xD52B, + 0xC06F, 0xD52C, 0xC070, 0xD52D, 0xC071, 0xD52E, 0xC072, 0xD52F, 0xC073, 0xD530, 0xC074, 0xD531, 0xC075, 0xD532, 0xC076, 0xD533, + 0xC077, 0xD534, 0xC078, 0xD535, 0xC079, 0xD536, 0xC07A, 0xD537, 0xC081, 0xD538, 0xC082, 0xD539, 0xC083, 0xD53A, 0xC084, 0xD53B, + 0xC085, 0xD53E, 0xC086, 0xD53F, 0xC087, 0xD541, 0xC088, 0xD542, 0xC089, 0xD543, 0xC08A, 0xD545, 0xC08B, 0xD546, 0xC08C, 0xD547, + 0xC08D, 0xD548, 0xC08E, 0xD549, 0xC08F, 0xD54A, 0xC090, 0xD54B, 0xC091, 0xD54E, 0xC092, 0xD550, 0xC093, 0xD552, 0xC094, 0xD553, + 0xC095, 0xD554, 0xC096, 0xD555, 0xC097, 0xD556, 0xC098, 0xD557, 0xC099, 0xD55A, 0xC09A, 0xD55B, 0xC09B, 0xD55D, 0xC09C, 0xD55E, + 0xC09D, 0xD55F, 0xC09E, 0xD561, 0xC09F, 0xD562, 0xC0A0, 0xD563, 0xC0A1, 0xC6E9, 0xC0A2, 0xC6EC, 0xC0A3, 0xC6F0, 0xC0A4, 0xC6F8, + 0xC0A5, 0xC6F9, 0xC0A6, 0xC6FD, 0xC0A7, 0xC704, 0xC0A8, 0xC705, 0xC0A9, 0xC708, 0xC0AA, 0xC70C, 0xC0AB, 0xC714, 0xC0AC, 0xC715, + 0xC0AD, 0xC717, 0xC0AE, 0xC719, 0xC0AF, 0xC720, 0xC0B0, 0xC721, 0xC0B1, 0xC724, 0xC0B2, 0xC728, 0xC0B3, 0xC730, 0xC0B4, 0xC731, + 0xC0B5, 0xC733, 0xC0B6, 0xC735, 0xC0B7, 0xC737, 0xC0B8, 0xC73C, 0xC0B9, 0xC73D, 0xC0BA, 0xC740, 0xC0BB, 0xC744, 0xC0BC, 0xC74A, + 0xC0BD, 0xC74C, 0xC0BE, 0xC74D, 0xC0BF, 0xC74F, 0xC0C0, 0xC751, 0xC0C1, 0xC752, 0xC0C2, 0xC753, 0xC0C3, 0xC754, 0xC0C4, 0xC755, + 0xC0C5, 0xC756, 0xC0C6, 0xC757, 0xC0C7, 0xC758, 0xC0C8, 0xC75C, 0xC0C9, 0xC760, 0xC0CA, 0xC768, 0xC0CB, 0xC76B, 0xC0CC, 0xC774, + 0xC0CD, 0xC775, 0xC0CE, 0xC778, 0xC0CF, 0xC77C, 0xC0D0, 0xC77D, 0xC0D1, 0xC77E, 0xC0D2, 0xC783, 0xC0D3, 0xC784, 0xC0D4, 0xC785, + 0xC0D5, 0xC787, 0xC0D6, 0xC788, 0xC0D7, 0xC789, 0xC0D8, 0xC78A, 0xC0D9, 0xC78E, 0xC0DA, 0xC790, 0xC0DB, 0xC791, 0xC0DC, 0xC794, + 0xC0DD, 0xC796, 0xC0DE, 0xC797, 0xC0DF, 0xC798, 0xC0E0, 0xC79A, 0xC0E1, 0xC7A0, 0xC0E2, 0xC7A1, 0xC0E3, 0xC7A3, 0xC0E4, 0xC7A4, + 0xC0E5, 0xC7A5, 0xC0E6, 0xC7A6, 0xC0E7, 0xC7AC, 0xC0E8, 0xC7AD, 0xC0E9, 0xC7B0, 0xC0EA, 0xC7B4, 0xC0EB, 0xC7BC, 0xC0EC, 0xC7BD, + 0xC0ED, 0xC7BF, 0xC0EE, 0xC7C0, 0xC0EF, 0xC7C1, 0xC0F0, 0xC7C8, 0xC0F1, 0xC7C9, 0xC0F2, 0xC7CC, 0xC0F3, 0xC7CE, 0xC0F4, 0xC7D0, + 0xC0F5, 0xC7D8, 0xC0F6, 0xC7DD, 0xC0F7, 0xC7E4, 0xC0F8, 0xC7E8, 0xC0F9, 0xC7EC, 0xC0FA, 0xC800, 0xC0FB, 0xC801, 0xC0FC, 0xC804, + 0xC0FD, 0xC808, 0xC0FE, 0xC80A, 0xC141, 0xD564, 0xC142, 0xD566, 0xC143, 0xD567, 0xC144, 0xD56A, 0xC145, 0xD56C, 0xC146, 0xD56E, + 0xC147, 0xD56F, 0xC148, 0xD570, 0xC149, 0xD571, 0xC14A, 0xD572, 0xC14B, 0xD573, 0xC14C, 0xD576, 0xC14D, 0xD577, 0xC14E, 0xD579, + 0xC14F, 0xD57A, 0xC150, 0xD57B, 0xC151, 0xD57D, 0xC152, 0xD57E, 0xC153, 0xD57F, 0xC154, 0xD580, 0xC155, 0xD581, 0xC156, 0xD582, + 0xC157, 0xD583, 0xC158, 0xD586, 0xC159, 0xD58A, 0xC15A, 0xD58B, 0xC161, 0xD58C, 0xC162, 0xD58D, 0xC163, 0xD58E, 0xC164, 0xD58F, + 0xC165, 0xD591, 0xC166, 0xD592, 0xC167, 0xD593, 0xC168, 0xD594, 0xC169, 0xD595, 0xC16A, 0xD596, 0xC16B, 0xD597, 0xC16C, 0xD598, + 0xC16D, 0xD599, 0xC16E, 0xD59A, 0xC16F, 0xD59B, 0xC170, 0xD59C, 0xC171, 0xD59D, 0xC172, 0xD59E, 0xC173, 0xD59F, 0xC174, 0xD5A0, + 0xC175, 0xD5A1, 0xC176, 0xD5A2, 0xC177, 0xD5A3, 0xC178, 0xD5A4, 0xC179, 0xD5A6, 0xC17A, 0xD5A7, 0xC181, 0xD5A8, 0xC182, 0xD5A9, + 0xC183, 0xD5AA, 0xC184, 0xD5AB, 0xC185, 0xD5AC, 0xC186, 0xD5AD, 0xC187, 0xD5AE, 0xC188, 0xD5AF, 0xC189, 0xD5B0, 0xC18A, 0xD5B1, + 0xC18B, 0xD5B2, 0xC18C, 0xD5B3, 0xC18D, 0xD5B4, 0xC18E, 0xD5B5, 0xC18F, 0xD5B6, 0xC190, 0xD5B7, 0xC191, 0xD5B8, 0xC192, 0xD5B9, + 0xC193, 0xD5BA, 0xC194, 0xD5BB, 0xC195, 0xD5BC, 0xC196, 0xD5BD, 0xC197, 0xD5BE, 0xC198, 0xD5BF, 0xC199, 0xD5C0, 0xC19A, 0xD5C1, + 0xC19B, 0xD5C2, 0xC19C, 0xD5C3, 0xC19D, 0xD5C4, 0xC19E, 0xD5C5, 0xC19F, 0xD5C6, 0xC1A0, 0xD5C7, 0xC1A1, 0xC810, 0xC1A2, 0xC811, + 0xC1A3, 0xC813, 0xC1A4, 0xC815, 0xC1A5, 0xC816, 0xC1A6, 0xC81C, 0xC1A7, 0xC81D, 0xC1A8, 0xC820, 0xC1A9, 0xC824, 0xC1AA, 0xC82C, + 0xC1AB, 0xC82D, 0xC1AC, 0xC82F, 0xC1AD, 0xC831, 0xC1AE, 0xC838, 0xC1AF, 0xC83C, 0xC1B0, 0xC840, 0xC1B1, 0xC848, 0xC1B2, 0xC849, + 0xC1B3, 0xC84C, 0xC1B4, 0xC84D, 0xC1B5, 0xC854, 0xC1B6, 0xC870, 0xC1B7, 0xC871, 0xC1B8, 0xC874, 0xC1B9, 0xC878, 0xC1BA, 0xC87A, + 0xC1BB, 0xC880, 0xC1BC, 0xC881, 0xC1BD, 0xC883, 0xC1BE, 0xC885, 0xC1BF, 0xC886, 0xC1C0, 0xC887, 0xC1C1, 0xC88B, 0xC1C2, 0xC88C, + 0xC1C3, 0xC88D, 0xC1C4, 0xC894, 0xC1C5, 0xC89D, 0xC1C6, 0xC89F, 0xC1C7, 0xC8A1, 0xC1C8, 0xC8A8, 0xC1C9, 0xC8BC, 0xC1CA, 0xC8BD, + 0xC1CB, 0xC8C4, 0xC1CC, 0xC8C8, 0xC1CD, 0xC8CC, 0xC1CE, 0xC8D4, 0xC1CF, 0xC8D5, 0xC1D0, 0xC8D7, 0xC1D1, 0xC8D9, 0xC1D2, 0xC8E0, + 0xC1D3, 0xC8E1, 0xC1D4, 0xC8E4, 0xC1D5, 0xC8F5, 0xC1D6, 0xC8FC, 0xC1D7, 0xC8FD, 0xC1D8, 0xC900, 0xC1D9, 0xC904, 0xC1DA, 0xC905, + 0xC1DB, 0xC906, 0xC1DC, 0xC90C, 0xC1DD, 0xC90D, 0xC1DE, 0xC90F, 0xC1DF, 0xC911, 0xC1E0, 0xC918, 0xC1E1, 0xC92C, 0xC1E2, 0xC934, + 0xC1E3, 0xC950, 0xC1E4, 0xC951, 0xC1E5, 0xC954, 0xC1E6, 0xC958, 0xC1E7, 0xC960, 0xC1E8, 0xC961, 0xC1E9, 0xC963, 0xC1EA, 0xC96C, + 0xC1EB, 0xC970, 0xC1EC, 0xC974, 0xC1ED, 0xC97C, 0xC1EE, 0xC988, 0xC1EF, 0xC989, 0xC1F0, 0xC98C, 0xC1F1, 0xC990, 0xC1F2, 0xC998, + 0xC1F3, 0xC999, 0xC1F4, 0xC99B, 0xC1F5, 0xC99D, 0xC1F6, 0xC9C0, 0xC1F7, 0xC9C1, 0xC1F8, 0xC9C4, 0xC1F9, 0xC9C7, 0xC1FA, 0xC9C8, + 0xC1FB, 0xC9CA, 0xC1FC, 0xC9D0, 0xC1FD, 0xC9D1, 0xC1FE, 0xC9D3, 0xC241, 0xD5CA, 0xC242, 0xD5CB, 0xC243, 0xD5CD, 0xC244, 0xD5CE, + 0xC245, 0xD5CF, 0xC246, 0xD5D1, 0xC247, 0xD5D3, 0xC248, 0xD5D4, 0xC249, 0xD5D5, 0xC24A, 0xD5D6, 0xC24B, 0xD5D7, 0xC24C, 0xD5DA, + 0xC24D, 0xD5DC, 0xC24E, 0xD5DE, 0xC24F, 0xD5DF, 0xC250, 0xD5E0, 0xC251, 0xD5E1, 0xC252, 0xD5E2, 0xC253, 0xD5E3, 0xC254, 0xD5E6, + 0xC255, 0xD5E7, 0xC256, 0xD5E9, 0xC257, 0xD5EA, 0xC258, 0xD5EB, 0xC259, 0xD5ED, 0xC25A, 0xD5EE, 0xC261, 0xD5EF, 0xC262, 0xD5F0, + 0xC263, 0xD5F1, 0xC264, 0xD5F2, 0xC265, 0xD5F3, 0xC266, 0xD5F6, 0xC267, 0xD5F8, 0xC268, 0xD5FA, 0xC269, 0xD5FB, 0xC26A, 0xD5FC, + 0xC26B, 0xD5FD, 0xC26C, 0xD5FE, 0xC26D, 0xD5FF, 0xC26E, 0xD602, 0xC26F, 0xD603, 0xC270, 0xD605, 0xC271, 0xD606, 0xC272, 0xD607, + 0xC273, 0xD609, 0xC274, 0xD60A, 0xC275, 0xD60B, 0xC276, 0xD60C, 0xC277, 0xD60D, 0xC278, 0xD60E, 0xC279, 0xD60F, 0xC27A, 0xD612, + 0xC281, 0xD616, 0xC282, 0xD617, 0xC283, 0xD618, 0xC284, 0xD619, 0xC285, 0xD61A, 0xC286, 0xD61B, 0xC287, 0xD61D, 0xC288, 0xD61E, + 0xC289, 0xD61F, 0xC28A, 0xD621, 0xC28B, 0xD622, 0xC28C, 0xD623, 0xC28D, 0xD625, 0xC28E, 0xD626, 0xC28F, 0xD627, 0xC290, 0xD628, + 0xC291, 0xD629, 0xC292, 0xD62A, 0xC293, 0xD62B, 0xC294, 0xD62C, 0xC295, 0xD62E, 0xC296, 0xD62F, 0xC297, 0xD630, 0xC298, 0xD631, + 0xC299, 0xD632, 0xC29A, 0xD633, 0xC29B, 0xD634, 0xC29C, 0xD635, 0xC29D, 0xD636, 0xC29E, 0xD637, 0xC29F, 0xD63A, 0xC2A0, 0xD63B, + 0xC2A1, 0xC9D5, 0xC2A2, 0xC9D6, 0xC2A3, 0xC9D9, 0xC2A4, 0xC9DA, 0xC2A5, 0xC9DC, 0xC2A6, 0xC9DD, 0xC2A7, 0xC9E0, 0xC2A8, 0xC9E2, + 0xC2A9, 0xC9E4, 0xC2AA, 0xC9E7, 0xC2AB, 0xC9EC, 0xC2AC, 0xC9ED, 0xC2AD, 0xC9EF, 0xC2AE, 0xC9F0, 0xC2AF, 0xC9F1, 0xC2B0, 0xC9F8, + 0xC2B1, 0xC9F9, 0xC2B2, 0xC9FC, 0xC2B3, 0xCA00, 0xC2B4, 0xCA08, 0xC2B5, 0xCA09, 0xC2B6, 0xCA0B, 0xC2B7, 0xCA0C, 0xC2B8, 0xCA0D, + 0xC2B9, 0xCA14, 0xC2BA, 0xCA18, 0xC2BB, 0xCA29, 0xC2BC, 0xCA4C, 0xC2BD, 0xCA4D, 0xC2BE, 0xCA50, 0xC2BF, 0xCA54, 0xC2C0, 0xCA5C, + 0xC2C1, 0xCA5D, 0xC2C2, 0xCA5F, 0xC2C3, 0xCA60, 0xC2C4, 0xCA61, 0xC2C5, 0xCA68, 0xC2C6, 0xCA7D, 0xC2C7, 0xCA84, 0xC2C8, 0xCA98, + 0xC2C9, 0xCABC, 0xC2CA, 0xCABD, 0xC2CB, 0xCAC0, 0xC2CC, 0xCAC4, 0xC2CD, 0xCACC, 0xC2CE, 0xCACD, 0xC2CF, 0xCACF, 0xC2D0, 0xCAD1, + 0xC2D1, 0xCAD3, 0xC2D2, 0xCAD8, 0xC2D3, 0xCAD9, 0xC2D4, 0xCAE0, 0xC2D5, 0xCAEC, 0xC2D6, 0xCAF4, 0xC2D7, 0xCB08, 0xC2D8, 0xCB10, + 0xC2D9, 0xCB14, 0xC2DA, 0xCB18, 0xC2DB, 0xCB20, 0xC2DC, 0xCB21, 0xC2DD, 0xCB41, 0xC2DE, 0xCB48, 0xC2DF, 0xCB49, 0xC2E0, 0xCB4C, + 0xC2E1, 0xCB50, 0xC2E2, 0xCB58, 0xC2E3, 0xCB59, 0xC2E4, 0xCB5D, 0xC2E5, 0xCB64, 0xC2E6, 0xCB78, 0xC2E7, 0xCB79, 0xC2E8, 0xCB9C, + 0xC2E9, 0xCBB8, 0xC2EA, 0xCBD4, 0xC2EB, 0xCBE4, 0xC2EC, 0xCBE7, 0xC2ED, 0xCBE9, 0xC2EE, 0xCC0C, 0xC2EF, 0xCC0D, 0xC2F0, 0xCC10, + 0xC2F1, 0xCC14, 0xC2F2, 0xCC1C, 0xC2F3, 0xCC1D, 0xC2F4, 0xCC21, 0xC2F5, 0xCC22, 0xC2F6, 0xCC27, 0xC2F7, 0xCC28, 0xC2F8, 0xCC29, + 0xC2F9, 0xCC2C, 0xC2FA, 0xCC2E, 0xC2FB, 0xCC30, 0xC2FC, 0xCC38, 0xC2FD, 0xCC39, 0xC2FE, 0xCC3B, 0xC341, 0xD63D, 0xC342, 0xD63E, + 0xC343, 0xD63F, 0xC344, 0xD641, 0xC345, 0xD642, 0xC346, 0xD643, 0xC347, 0xD644, 0xC348, 0xD646, 0xC349, 0xD647, 0xC34A, 0xD64A, + 0xC34B, 0xD64C, 0xC34C, 0xD64E, 0xC34D, 0xD64F, 0xC34E, 0xD650, 0xC34F, 0xD652, 0xC350, 0xD653, 0xC351, 0xD656, 0xC352, 0xD657, + 0xC353, 0xD659, 0xC354, 0xD65A, 0xC355, 0xD65B, 0xC356, 0xD65D, 0xC357, 0xD65E, 0xC358, 0xD65F, 0xC359, 0xD660, 0xC35A, 0xD661, + 0xC361, 0xD662, 0xC362, 0xD663, 0xC363, 0xD664, 0xC364, 0xD665, 0xC365, 0xD666, 0xC366, 0xD668, 0xC367, 0xD66A, 0xC368, 0xD66B, + 0xC369, 0xD66C, 0xC36A, 0xD66D, 0xC36B, 0xD66E, 0xC36C, 0xD66F, 0xC36D, 0xD672, 0xC36E, 0xD673, 0xC36F, 0xD675, 0xC370, 0xD676, + 0xC371, 0xD677, 0xC372, 0xD678, 0xC373, 0xD679, 0xC374, 0xD67A, 0xC375, 0xD67B, 0xC376, 0xD67C, 0xC377, 0xD67D, 0xC378, 0xD67E, + 0xC379, 0xD67F, 0xC37A, 0xD680, 0xC381, 0xD681, 0xC382, 0xD682, 0xC383, 0xD684, 0xC384, 0xD686, 0xC385, 0xD687, 0xC386, 0xD688, + 0xC387, 0xD689, 0xC388, 0xD68A, 0xC389, 0xD68B, 0xC38A, 0xD68E, 0xC38B, 0xD68F, 0xC38C, 0xD691, 0xC38D, 0xD692, 0xC38E, 0xD693, + 0xC38F, 0xD695, 0xC390, 0xD696, 0xC391, 0xD697, 0xC392, 0xD698, 0xC393, 0xD699, 0xC394, 0xD69A, 0xC395, 0xD69B, 0xC396, 0xD69C, + 0xC397, 0xD69E, 0xC398, 0xD6A0, 0xC399, 0xD6A2, 0xC39A, 0xD6A3, 0xC39B, 0xD6A4, 0xC39C, 0xD6A5, 0xC39D, 0xD6A6, 0xC39E, 0xD6A7, + 0xC39F, 0xD6A9, 0xC3A0, 0xD6AA, 0xC3A1, 0xCC3C, 0xC3A2, 0xCC3D, 0xC3A3, 0xCC3E, 0xC3A4, 0xCC44, 0xC3A5, 0xCC45, 0xC3A6, 0xCC48, + 0xC3A7, 0xCC4C, 0xC3A8, 0xCC54, 0xC3A9, 0xCC55, 0xC3AA, 0xCC57, 0xC3AB, 0xCC58, 0xC3AC, 0xCC59, 0xC3AD, 0xCC60, 0xC3AE, 0xCC64, + 0xC3AF, 0xCC66, 0xC3B0, 0xCC68, 0xC3B1, 0xCC70, 0xC3B2, 0xCC75, 0xC3B3, 0xCC98, 0xC3B4, 0xCC99, 0xC3B5, 0xCC9C, 0xC3B6, 0xCCA0, + 0xC3B7, 0xCCA8, 0xC3B8, 0xCCA9, 0xC3B9, 0xCCAB, 0xC3BA, 0xCCAC, 0xC3BB, 0xCCAD, 0xC3BC, 0xCCB4, 0xC3BD, 0xCCB5, 0xC3BE, 0xCCB8, + 0xC3BF, 0xCCBC, 0xC3C0, 0xCCC4, 0xC3C1, 0xCCC5, 0xC3C2, 0xCCC7, 0xC3C3, 0xCCC9, 0xC3C4, 0xCCD0, 0xC3C5, 0xCCD4, 0xC3C6, 0xCCE4, + 0xC3C7, 0xCCEC, 0xC3C8, 0xCCF0, 0xC3C9, 0xCD01, 0xC3CA, 0xCD08, 0xC3CB, 0xCD09, 0xC3CC, 0xCD0C, 0xC3CD, 0xCD10, 0xC3CE, 0xCD18, + 0xC3CF, 0xCD19, 0xC3D0, 0xCD1B, 0xC3D1, 0xCD1D, 0xC3D2, 0xCD24, 0xC3D3, 0xCD28, 0xC3D4, 0xCD2C, 0xC3D5, 0xCD39, 0xC3D6, 0xCD5C, + 0xC3D7, 0xCD60, 0xC3D8, 0xCD64, 0xC3D9, 0xCD6C, 0xC3DA, 0xCD6D, 0xC3DB, 0xCD6F, 0xC3DC, 0xCD71, 0xC3DD, 0xCD78, 0xC3DE, 0xCD88, + 0xC3DF, 0xCD94, 0xC3E0, 0xCD95, 0xC3E1, 0xCD98, 0xC3E2, 0xCD9C, 0xC3E3, 0xCDA4, 0xC3E4, 0xCDA5, 0xC3E5, 0xCDA7, 0xC3E6, 0xCDA9, + 0xC3E7, 0xCDB0, 0xC3E8, 0xCDC4, 0xC3E9, 0xCDCC, 0xC3EA, 0xCDD0, 0xC3EB, 0xCDE8, 0xC3EC, 0xCDEC, 0xC3ED, 0xCDF0, 0xC3EE, 0xCDF8, + 0xC3EF, 0xCDF9, 0xC3F0, 0xCDFB, 0xC3F1, 0xCDFD, 0xC3F2, 0xCE04, 0xC3F3, 0xCE08, 0xC3F4, 0xCE0C, 0xC3F5, 0xCE14, 0xC3F6, 0xCE19, + 0xC3F7, 0xCE20, 0xC3F8, 0xCE21, 0xC3F9, 0xCE24, 0xC3FA, 0xCE28, 0xC3FB, 0xCE30, 0xC3FC, 0xCE31, 0xC3FD, 0xCE33, 0xC3FE, 0xCE35, + 0xC441, 0xD6AB, 0xC442, 0xD6AD, 0xC443, 0xD6AE, 0xC444, 0xD6AF, 0xC445, 0xD6B1, 0xC446, 0xD6B2, 0xC447, 0xD6B3, 0xC448, 0xD6B4, + 0xC449, 0xD6B5, 0xC44A, 0xD6B6, 0xC44B, 0xD6B7, 0xC44C, 0xD6B8, 0xC44D, 0xD6BA, 0xC44E, 0xD6BC, 0xC44F, 0xD6BD, 0xC450, 0xD6BE, + 0xC451, 0xD6BF, 0xC452, 0xD6C0, 0xC453, 0xD6C1, 0xC454, 0xD6C2, 0xC455, 0xD6C3, 0xC456, 0xD6C6, 0xC457, 0xD6C7, 0xC458, 0xD6C9, + 0xC459, 0xD6CA, 0xC45A, 0xD6CB, 0xC461, 0xD6CD, 0xC462, 0xD6CE, 0xC463, 0xD6CF, 0xC464, 0xD6D0, 0xC465, 0xD6D2, 0xC466, 0xD6D3, + 0xC467, 0xD6D5, 0xC468, 0xD6D6, 0xC469, 0xD6D8, 0xC46A, 0xD6DA, 0xC46B, 0xD6DB, 0xC46C, 0xD6DC, 0xC46D, 0xD6DD, 0xC46E, 0xD6DE, + 0xC46F, 0xD6DF, 0xC470, 0xD6E1, 0xC471, 0xD6E2, 0xC472, 0xD6E3, 0xC473, 0xD6E5, 0xC474, 0xD6E6, 0xC475, 0xD6E7, 0xC476, 0xD6E9, + 0xC477, 0xD6EA, 0xC478, 0xD6EB, 0xC479, 0xD6EC, 0xC47A, 0xD6ED, 0xC481, 0xD6EE, 0xC482, 0xD6EF, 0xC483, 0xD6F1, 0xC484, 0xD6F2, + 0xC485, 0xD6F3, 0xC486, 0xD6F4, 0xC487, 0xD6F6, 0xC488, 0xD6F7, 0xC489, 0xD6F8, 0xC48A, 0xD6F9, 0xC48B, 0xD6FA, 0xC48C, 0xD6FB, + 0xC48D, 0xD6FE, 0xC48E, 0xD6FF, 0xC48F, 0xD701, 0xC490, 0xD702, 0xC491, 0xD703, 0xC492, 0xD705, 0xC493, 0xD706, 0xC494, 0xD707, + 0xC495, 0xD708, 0xC496, 0xD709, 0xC497, 0xD70A, 0xC498, 0xD70B, 0xC499, 0xD70C, 0xC49A, 0xD70D, 0xC49B, 0xD70E, 0xC49C, 0xD70F, + 0xC49D, 0xD710, 0xC49E, 0xD712, 0xC49F, 0xD713, 0xC4A0, 0xD714, 0xC4A1, 0xCE58, 0xC4A2, 0xCE59, 0xC4A3, 0xCE5C, 0xC4A4, 0xCE5F, + 0xC4A5, 0xCE60, 0xC4A6, 0xCE61, 0xC4A7, 0xCE68, 0xC4A8, 0xCE69, 0xC4A9, 0xCE6B, 0xC4AA, 0xCE6D, 0xC4AB, 0xCE74, 0xC4AC, 0xCE75, + 0xC4AD, 0xCE78, 0xC4AE, 0xCE7C, 0xC4AF, 0xCE84, 0xC4B0, 0xCE85, 0xC4B1, 0xCE87, 0xC4B2, 0xCE89, 0xC4B3, 0xCE90, 0xC4B4, 0xCE91, + 0xC4B5, 0xCE94, 0xC4B6, 0xCE98, 0xC4B7, 0xCEA0, 0xC4B8, 0xCEA1, 0xC4B9, 0xCEA3, 0xC4BA, 0xCEA4, 0xC4BB, 0xCEA5, 0xC4BC, 0xCEAC, + 0xC4BD, 0xCEAD, 0xC4BE, 0xCEC1, 0xC4BF, 0xCEE4, 0xC4C0, 0xCEE5, 0xC4C1, 0xCEE8, 0xC4C2, 0xCEEB, 0xC4C3, 0xCEEC, 0xC4C4, 0xCEF4, + 0xC4C5, 0xCEF5, 0xC4C6, 0xCEF7, 0xC4C7, 0xCEF8, 0xC4C8, 0xCEF9, 0xC4C9, 0xCF00, 0xC4CA, 0xCF01, 0xC4CB, 0xCF04, 0xC4CC, 0xCF08, + 0xC4CD, 0xCF10, 0xC4CE, 0xCF11, 0xC4CF, 0xCF13, 0xC4D0, 0xCF15, 0xC4D1, 0xCF1C, 0xC4D2, 0xCF20, 0xC4D3, 0xCF24, 0xC4D4, 0xCF2C, + 0xC4D5, 0xCF2D, 0xC4D6, 0xCF2F, 0xC4D7, 0xCF30, 0xC4D8, 0xCF31, 0xC4D9, 0xCF38, 0xC4DA, 0xCF54, 0xC4DB, 0xCF55, 0xC4DC, 0xCF58, + 0xC4DD, 0xCF5C, 0xC4DE, 0xCF64, 0xC4DF, 0xCF65, 0xC4E0, 0xCF67, 0xC4E1, 0xCF69, 0xC4E2, 0xCF70, 0xC4E3, 0xCF71, 0xC4E4, 0xCF74, + 0xC4E5, 0xCF78, 0xC4E6, 0xCF80, 0xC4E7, 0xCF85, 0xC4E8, 0xCF8C, 0xC4E9, 0xCFA1, 0xC4EA, 0xCFA8, 0xC4EB, 0xCFB0, 0xC4EC, 0xCFC4, + 0xC4ED, 0xCFE0, 0xC4EE, 0xCFE1, 0xC4EF, 0xCFE4, 0xC4F0, 0xCFE8, 0xC4F1, 0xCFF0, 0xC4F2, 0xCFF1, 0xC4F3, 0xCFF3, 0xC4F4, 0xCFF5, + 0xC4F5, 0xCFFC, 0xC4F6, 0xD000, 0xC4F7, 0xD004, 0xC4F8, 0xD011, 0xC4F9, 0xD018, 0xC4FA, 0xD02D, 0xC4FB, 0xD034, 0xC4FC, 0xD035, + 0xC4FD, 0xD038, 0xC4FE, 0xD03C, 0xC541, 0xD715, 0xC542, 0xD716, 0xC543, 0xD717, 0xC544, 0xD71A, 0xC545, 0xD71B, 0xC546, 0xD71D, + 0xC547, 0xD71E, 0xC548, 0xD71F, 0xC549, 0xD721, 0xC54A, 0xD722, 0xC54B, 0xD723, 0xC54C, 0xD724, 0xC54D, 0xD725, 0xC54E, 0xD726, + 0xC54F, 0xD727, 0xC550, 0xD72A, 0xC551, 0xD72C, 0xC552, 0xD72E, 0xC553, 0xD72F, 0xC554, 0xD730, 0xC555, 0xD731, 0xC556, 0xD732, + 0xC557, 0xD733, 0xC558, 0xD736, 0xC559, 0xD737, 0xC55A, 0xD739, 0xC561, 0xD73A, 0xC562, 0xD73B, 0xC563, 0xD73D, 0xC564, 0xD73E, + 0xC565, 0xD73F, 0xC566, 0xD740, 0xC567, 0xD741, 0xC568, 0xD742, 0xC569, 0xD743, 0xC56A, 0xD745, 0xC56B, 0xD746, 0xC56C, 0xD748, + 0xC56D, 0xD74A, 0xC56E, 0xD74B, 0xC56F, 0xD74C, 0xC570, 0xD74D, 0xC571, 0xD74E, 0xC572, 0xD74F, 0xC573, 0xD752, 0xC574, 0xD753, + 0xC575, 0xD755, 0xC576, 0xD75A, 0xC577, 0xD75B, 0xC578, 0xD75C, 0xC579, 0xD75D, 0xC57A, 0xD75E, 0xC581, 0xD75F, 0xC582, 0xD762, + 0xC583, 0xD764, 0xC584, 0xD766, 0xC585, 0xD767, 0xC586, 0xD768, 0xC587, 0xD76A, 0xC588, 0xD76B, 0xC589, 0xD76D, 0xC58A, 0xD76E, + 0xC58B, 0xD76F, 0xC58C, 0xD771, 0xC58D, 0xD772, 0xC58E, 0xD773, 0xC58F, 0xD775, 0xC590, 0xD776, 0xC591, 0xD777, 0xC592, 0xD778, + 0xC593, 0xD779, 0xC594, 0xD77A, 0xC595, 0xD77B, 0xC596, 0xD77E, 0xC597, 0xD77F, 0xC598, 0xD780, 0xC599, 0xD782, 0xC59A, 0xD783, + 0xC59B, 0xD784, 0xC59C, 0xD785, 0xC59D, 0xD786, 0xC59E, 0xD787, 0xC59F, 0xD78A, 0xC5A0, 0xD78B, 0xC5A1, 0xD044, 0xC5A2, 0xD045, + 0xC5A3, 0xD047, 0xC5A4, 0xD049, 0xC5A5, 0xD050, 0xC5A6, 0xD054, 0xC5A7, 0xD058, 0xC5A8, 0xD060, 0xC5A9, 0xD06C, 0xC5AA, 0xD06D, + 0xC5AB, 0xD070, 0xC5AC, 0xD074, 0xC5AD, 0xD07C, 0xC5AE, 0xD07D, 0xC5AF, 0xD081, 0xC5B0, 0xD0A4, 0xC5B1, 0xD0A5, 0xC5B2, 0xD0A8, + 0xC5B3, 0xD0AC, 0xC5B4, 0xD0B4, 0xC5B5, 0xD0B5, 0xC5B6, 0xD0B7, 0xC5B7, 0xD0B9, 0xC5B8, 0xD0C0, 0xC5B9, 0xD0C1, 0xC5BA, 0xD0C4, + 0xC5BB, 0xD0C8, 0xC5BC, 0xD0C9, 0xC5BD, 0xD0D0, 0xC5BE, 0xD0D1, 0xC5BF, 0xD0D3, 0xC5C0, 0xD0D4, 0xC5C1, 0xD0D5, 0xC5C2, 0xD0DC, + 0xC5C3, 0xD0DD, 0xC5C4, 0xD0E0, 0xC5C5, 0xD0E4, 0xC5C6, 0xD0EC, 0xC5C7, 0xD0ED, 0xC5C8, 0xD0EF, 0xC5C9, 0xD0F0, 0xC5CA, 0xD0F1, + 0xC5CB, 0xD0F8, 0xC5CC, 0xD10D, 0xC5CD, 0xD130, 0xC5CE, 0xD131, 0xC5CF, 0xD134, 0xC5D0, 0xD138, 0xC5D1, 0xD13A, 0xC5D2, 0xD140, + 0xC5D3, 0xD141, 0xC5D4, 0xD143, 0xC5D5, 0xD144, 0xC5D6, 0xD145, 0xC5D7, 0xD14C, 0xC5D8, 0xD14D, 0xC5D9, 0xD150, 0xC5DA, 0xD154, + 0xC5DB, 0xD15C, 0xC5DC, 0xD15D, 0xC5DD, 0xD15F, 0xC5DE, 0xD161, 0xC5DF, 0xD168, 0xC5E0, 0xD16C, 0xC5E1, 0xD17C, 0xC5E2, 0xD184, + 0xC5E3, 0xD188, 0xC5E4, 0xD1A0, 0xC5E5, 0xD1A1, 0xC5E6, 0xD1A4, 0xC5E7, 0xD1A8, 0xC5E8, 0xD1B0, 0xC5E9, 0xD1B1, 0xC5EA, 0xD1B3, + 0xC5EB, 0xD1B5, 0xC5EC, 0xD1BA, 0xC5ED, 0xD1BC, 0xC5EE, 0xD1C0, 0xC5EF, 0xD1D8, 0xC5F0, 0xD1F4, 0xC5F1, 0xD1F8, 0xC5F2, 0xD207, + 0xC5F3, 0xD209, 0xC5F4, 0xD210, 0xC5F5, 0xD22C, 0xC5F6, 0xD22D, 0xC5F7, 0xD230, 0xC5F8, 0xD234, 0xC5F9, 0xD23C, 0xC5FA, 0xD23D, + 0xC5FB, 0xD23F, 0xC5FC, 0xD241, 0xC5FD, 0xD248, 0xC5FE, 0xD25C, 0xC641, 0xD78D, 0xC642, 0xD78E, 0xC643, 0xD78F, 0xC644, 0xD791, + 0xC645, 0xD792, 0xC646, 0xD793, 0xC647, 0xD794, 0xC648, 0xD795, 0xC649, 0xD796, 0xC64A, 0xD797, 0xC64B, 0xD79A, 0xC64C, 0xD79C, + 0xC64D, 0xD79E, 0xC64E, 0xD79F, 0xC64F, 0xD7A0, 0xC650, 0xD7A1, 0xC651, 0xD7A2, 0xC652, 0xD7A3, 0xC6A1, 0xD264, 0xC6A2, 0xD280, + 0xC6A3, 0xD281, 0xC6A4, 0xD284, 0xC6A5, 0xD288, 0xC6A6, 0xD290, 0xC6A7, 0xD291, 0xC6A8, 0xD295, 0xC6A9, 0xD29C, 0xC6AA, 0xD2A0, + 0xC6AB, 0xD2A4, 0xC6AC, 0xD2AC, 0xC6AD, 0xD2B1, 0xC6AE, 0xD2B8, 0xC6AF, 0xD2B9, 0xC6B0, 0xD2BC, 0xC6B1, 0xD2BF, 0xC6B2, 0xD2C0, + 0xC6B3, 0xD2C2, 0xC6B4, 0xD2C8, 0xC6B5, 0xD2C9, 0xC6B6, 0xD2CB, 0xC6B7, 0xD2D4, 0xC6B8, 0xD2D8, 0xC6B9, 0xD2DC, 0xC6BA, 0xD2E4, + 0xC6BB, 0xD2E5, 0xC6BC, 0xD2F0, 0xC6BD, 0xD2F1, 0xC6BE, 0xD2F4, 0xC6BF, 0xD2F8, 0xC6C0, 0xD300, 0xC6C1, 0xD301, 0xC6C2, 0xD303, + 0xC6C3, 0xD305, 0xC6C4, 0xD30C, 0xC6C5, 0xD30D, 0xC6C6, 0xD30E, 0xC6C7, 0xD310, 0xC6C8, 0xD314, 0xC6C9, 0xD316, 0xC6CA, 0xD31C, + 0xC6CB, 0xD31D, 0xC6CC, 0xD31F, 0xC6CD, 0xD320, 0xC6CE, 0xD321, 0xC6CF, 0xD325, 0xC6D0, 0xD328, 0xC6D1, 0xD329, 0xC6D2, 0xD32C, + 0xC6D3, 0xD330, 0xC6D4, 0xD338, 0xC6D5, 0xD339, 0xC6D6, 0xD33B, 0xC6D7, 0xD33C, 0xC6D8, 0xD33D, 0xC6D9, 0xD344, 0xC6DA, 0xD345, + 0xC6DB, 0xD37C, 0xC6DC, 0xD37D, 0xC6DD, 0xD380, 0xC6DE, 0xD384, 0xC6DF, 0xD38C, 0xC6E0, 0xD38D, 0xC6E1, 0xD38F, 0xC6E2, 0xD390, + 0xC6E3, 0xD391, 0xC6E4, 0xD398, 0xC6E5, 0xD399, 0xC6E6, 0xD39C, 0xC6E7, 0xD3A0, 0xC6E8, 0xD3A8, 0xC6E9, 0xD3A9, 0xC6EA, 0xD3AB, + 0xC6EB, 0xD3AD, 0xC6EC, 0xD3B4, 0xC6ED, 0xD3B8, 0xC6EE, 0xD3BC, 0xC6EF, 0xD3C4, 0xC6F0, 0xD3C5, 0xC6F1, 0xD3C8, 0xC6F2, 0xD3C9, + 0xC6F3, 0xD3D0, 0xC6F4, 0xD3D8, 0xC6F5, 0xD3E1, 0xC6F6, 0xD3E3, 0xC6F7, 0xD3EC, 0xC6F8, 0xD3ED, 0xC6F9, 0xD3F0, 0xC6FA, 0xD3F4, + 0xC6FB, 0xD3FC, 0xC6FC, 0xD3FD, 0xC6FD, 0xD3FF, 0xC6FE, 0xD401, 0xC7A1, 0xD408, 0xC7A2, 0xD41D, 0xC7A3, 0xD440, 0xC7A4, 0xD444, + 0xC7A5, 0xD45C, 0xC7A6, 0xD460, 0xC7A7, 0xD464, 0xC7A8, 0xD46D, 0xC7A9, 0xD46F, 0xC7AA, 0xD478, 0xC7AB, 0xD479, 0xC7AC, 0xD47C, + 0xC7AD, 0xD47F, 0xC7AE, 0xD480, 0xC7AF, 0xD482, 0xC7B0, 0xD488, 0xC7B1, 0xD489, 0xC7B2, 0xD48B, 0xC7B3, 0xD48D, 0xC7B4, 0xD494, + 0xC7B5, 0xD4A9, 0xC7B6, 0xD4CC, 0xC7B7, 0xD4D0, 0xC7B8, 0xD4D4, 0xC7B9, 0xD4DC, 0xC7BA, 0xD4DF, 0xC7BB, 0xD4E8, 0xC7BC, 0xD4EC, + 0xC7BD, 0xD4F0, 0xC7BE, 0xD4F8, 0xC7BF, 0xD4FB, 0xC7C0, 0xD4FD, 0xC7C1, 0xD504, 0xC7C2, 0xD508, 0xC7C3, 0xD50C, 0xC7C4, 0xD514, + 0xC7C5, 0xD515, 0xC7C6, 0xD517, 0xC7C7, 0xD53C, 0xC7C8, 0xD53D, 0xC7C9, 0xD540, 0xC7CA, 0xD544, 0xC7CB, 0xD54C, 0xC7CC, 0xD54D, + 0xC7CD, 0xD54F, 0xC7CE, 0xD551, 0xC7CF, 0xD558, 0xC7D0, 0xD559, 0xC7D1, 0xD55C, 0xC7D2, 0xD560, 0xC7D3, 0xD565, 0xC7D4, 0xD568, + 0xC7D5, 0xD569, 0xC7D6, 0xD56B, 0xC7D7, 0xD56D, 0xC7D8, 0xD574, 0xC7D9, 0xD575, 0xC7DA, 0xD578, 0xC7DB, 0xD57C, 0xC7DC, 0xD584, + 0xC7DD, 0xD585, 0xC7DE, 0xD587, 0xC7DF, 0xD588, 0xC7E0, 0xD589, 0xC7E1, 0xD590, 0xC7E2, 0xD5A5, 0xC7E3, 0xD5C8, 0xC7E4, 0xD5C9, + 0xC7E5, 0xD5CC, 0xC7E6, 0xD5D0, 0xC7E7, 0xD5D2, 0xC7E8, 0xD5D8, 0xC7E9, 0xD5D9, 0xC7EA, 0xD5DB, 0xC7EB, 0xD5DD, 0xC7EC, 0xD5E4, + 0xC7ED, 0xD5E5, 0xC7EE, 0xD5E8, 0xC7EF, 0xD5EC, 0xC7F0, 0xD5F4, 0xC7F1, 0xD5F5, 0xC7F2, 0xD5F7, 0xC7F3, 0xD5F9, 0xC7F4, 0xD600, + 0xC7F5, 0xD601, 0xC7F6, 0xD604, 0xC7F7, 0xD608, 0xC7F8, 0xD610, 0xC7F9, 0xD611, 0xC7FA, 0xD613, 0xC7FB, 0xD614, 0xC7FC, 0xD615, + 0xC7FD, 0xD61C, 0xC7FE, 0xD620, 0xC8A1, 0xD624, 0xC8A2, 0xD62D, 0xC8A3, 0xD638, 0xC8A4, 0xD639, 0xC8A5, 0xD63C, 0xC8A6, 0xD640, + 0xC8A7, 0xD645, 0xC8A8, 0xD648, 0xC8A9, 0xD649, 0xC8AA, 0xD64B, 0xC8AB, 0xD64D, 0xC8AC, 0xD651, 0xC8AD, 0xD654, 0xC8AE, 0xD655, + 0xC8AF, 0xD658, 0xC8B0, 0xD65C, 0xC8B1, 0xD667, 0xC8B2, 0xD669, 0xC8B3, 0xD670, 0xC8B4, 0xD671, 0xC8B5, 0xD674, 0xC8B6, 0xD683, + 0xC8B7, 0xD685, 0xC8B8, 0xD68C, 0xC8B9, 0xD68D, 0xC8BA, 0xD690, 0xC8BB, 0xD694, 0xC8BC, 0xD69D, 0xC8BD, 0xD69F, 0xC8BE, 0xD6A1, + 0xC8BF, 0xD6A8, 0xC8C0, 0xD6AC, 0xC8C1, 0xD6B0, 0xC8C2, 0xD6B9, 0xC8C3, 0xD6BB, 0xC8C4, 0xD6C4, 0xC8C5, 0xD6C5, 0xC8C6, 0xD6C8, + 0xC8C7, 0xD6CC, 0xC8C8, 0xD6D1, 0xC8C9, 0xD6D4, 0xC8CA, 0xD6D7, 0xC8CB, 0xD6D9, 0xC8CC, 0xD6E0, 0xC8CD, 0xD6E4, 0xC8CE, 0xD6E8, + 0xC8CF, 0xD6F0, 0xC8D0, 0xD6F5, 0xC8D1, 0xD6FC, 0xC8D2, 0xD6FD, 0xC8D3, 0xD700, 0xC8D4, 0xD704, 0xC8D5, 0xD711, 0xC8D6, 0xD718, + 0xC8D7, 0xD719, 0xC8D8, 0xD71C, 0xC8D9, 0xD720, 0xC8DA, 0xD728, 0xC8DB, 0xD729, 0xC8DC, 0xD72B, 0xC8DD, 0xD72D, 0xC8DE, 0xD734, + 0xC8DF, 0xD735, 0xC8E0, 0xD738, 0xC8E1, 0xD73C, 0xC8E2, 0xD744, 0xC8E3, 0xD747, 0xC8E4, 0xD749, 0xC8E5, 0xD750, 0xC8E6, 0xD751, + 0xC8E7, 0xD754, 0xC8E8, 0xD756, 0xC8E9, 0xD757, 0xC8EA, 0xD758, 0xC8EB, 0xD759, 0xC8EC, 0xD760, 0xC8ED, 0xD761, 0xC8EE, 0xD763, + 0xC8EF, 0xD765, 0xC8F0, 0xD769, 0xC8F1, 0xD76C, 0xC8F2, 0xD770, 0xC8F3, 0xD774, 0xC8F4, 0xD77C, 0xC8F5, 0xD77D, 0xC8F6, 0xD781, + 0xC8F7, 0xD788, 0xC8F8, 0xD789, 0xC8F9, 0xD78C, 0xC8FA, 0xD790, 0xC8FB, 0xD798, 0xC8FC, 0xD799, 0xC8FD, 0xD79B, 0xC8FE, 0xD79D, + 0xCAA1, 0x4F3D, 0xCAA2, 0x4F73, 0xCAA3, 0x5047, 0xCAA4, 0x50F9, 0xCAA5, 0x52A0, 0xCAA6, 0x53EF, 0xCAA7, 0x5475, 0xCAA8, 0x54E5, + 0xCAA9, 0x5609, 0xCAAA, 0x5AC1, 0xCAAB, 0x5BB6, 0xCAAC, 0x6687, 0xCAAD, 0x67B6, 0xCAAE, 0x67B7, 0xCAAF, 0x67EF, 0xCAB0, 0x6B4C, + 0xCAB1, 0x73C2, 0xCAB2, 0x75C2, 0xCAB3, 0x7A3C, 0xCAB4, 0x82DB, 0xCAB5, 0x8304, 0xCAB6, 0x8857, 0xCAB7, 0x8888, 0xCAB8, 0x8A36, + 0xCAB9, 0x8CC8, 0xCABA, 0x8DCF, 0xCABB, 0x8EFB, 0xCABC, 0x8FE6, 0xCABD, 0x99D5, 0xCABE, 0x523B, 0xCABF, 0x5374, 0xCAC0, 0x5404, + 0xCAC1, 0x606A, 0xCAC2, 0x6164, 0xCAC3, 0x6BBC, 0xCAC4, 0x73CF, 0xCAC5, 0x811A, 0xCAC6, 0x89BA, 0xCAC7, 0x89D2, 0xCAC8, 0x95A3, + 0xCAC9, 0x4F83, 0xCACA, 0x520A, 0xCACB, 0x58BE, 0xCACC, 0x5978, 0xCACD, 0x59E6, 0xCACE, 0x5E72, 0xCACF, 0x5E79, 0xCAD0, 0x61C7, + 0xCAD1, 0x63C0, 0xCAD2, 0x6746, 0xCAD3, 0x67EC, 0xCAD4, 0x687F, 0xCAD5, 0x6F97, 0xCAD6, 0x764E, 0xCAD7, 0x770B, 0xCAD8, 0x78F5, + 0xCAD9, 0x7A08, 0xCADA, 0x7AFF, 0xCADB, 0x7C21, 0xCADC, 0x809D, 0xCADD, 0x826E, 0xCADE, 0x8271, 0xCADF, 0x8AEB, 0xCAE0, 0x9593, + 0xCAE1, 0x4E6B, 0xCAE2, 0x559D, 0xCAE3, 0x66F7, 0xCAE4, 0x6E34, 0xCAE5, 0x78A3, 0xCAE6, 0x7AED, 0xCAE7, 0x845B, 0xCAE8, 0x8910, + 0xCAE9, 0x874E, 0xCAEA, 0x97A8, 0xCAEB, 0x52D8, 0xCAEC, 0x574E, 0xCAED, 0x582A, 0xCAEE, 0x5D4C, 0xCAEF, 0x611F, 0xCAF0, 0x61BE, + 0xCAF1, 0x6221, 0xCAF2, 0x6562, 0xCAF3, 0x67D1, 0xCAF4, 0x6A44, 0xCAF5, 0x6E1B, 0xCAF6, 0x7518, 0xCAF7, 0x75B3, 0xCAF8, 0x76E3, + 0xCAF9, 0x77B0, 0xCAFA, 0x7D3A, 0xCAFB, 0x90AF, 0xCAFC, 0x9451, 0xCAFD, 0x9452, 0xCAFE, 0x9F95, 0xCBA1, 0x5323, 0xCBA2, 0x5CAC, + 0xCBA3, 0x7532, 0xCBA4, 0x80DB, 0xCBA5, 0x9240, 0xCBA6, 0x9598, 0xCBA7, 0x525B, 0xCBA8, 0x5808, 0xCBA9, 0x59DC, 0xCBAA, 0x5CA1, + 0xCBAB, 0x5D17, 0xCBAC, 0x5EB7, 0xCBAD, 0x5F3A, 0xCBAE, 0x5F4A, 0xCBAF, 0x6177, 0xCBB0, 0x6C5F, 0xCBB1, 0x757A, 0xCBB2, 0x7586, + 0xCBB3, 0x7CE0, 0xCBB4, 0x7D73, 0xCBB5, 0x7DB1, 0xCBB6, 0x7F8C, 0xCBB7, 0x8154, 0xCBB8, 0x8221, 0xCBB9, 0x8591, 0xCBBA, 0x8941, + 0xCBBB, 0x8B1B, 0xCBBC, 0x92FC, 0xCBBD, 0x964D, 0xCBBE, 0x9C47, 0xCBBF, 0x4ECB, 0xCBC0, 0x4EF7, 0xCBC1, 0x500B, 0xCBC2, 0x51F1, + 0xCBC3, 0x584F, 0xCBC4, 0x6137, 0xCBC5, 0x613E, 0xCBC6, 0x6168, 0xCBC7, 0x6539, 0xCBC8, 0x69EA, 0xCBC9, 0x6F11, 0xCBCA, 0x75A5, + 0xCBCB, 0x7686, 0xCBCC, 0x76D6, 0xCBCD, 0x7B87, 0xCBCE, 0x82A5, 0xCBCF, 0x84CB, 0xCBD0, 0xF900, 0xCBD1, 0x93A7, 0xCBD2, 0x958B, + 0xCBD3, 0x5580, 0xCBD4, 0x5BA2, 0xCBD5, 0x5751, 0xCBD6, 0xF901, 0xCBD7, 0x7CB3, 0xCBD8, 0x7FB9, 0xCBD9, 0x91B5, 0xCBDA, 0x5028, + 0xCBDB, 0x53BB, 0xCBDC, 0x5C45, 0xCBDD, 0x5DE8, 0xCBDE, 0x62D2, 0xCBDF, 0x636E, 0xCBE0, 0x64DA, 0xCBE1, 0x64E7, 0xCBE2, 0x6E20, + 0xCBE3, 0x70AC, 0xCBE4, 0x795B, 0xCBE5, 0x8DDD, 0xCBE6, 0x8E1E, 0xCBE7, 0xF902, 0xCBE8, 0x907D, 0xCBE9, 0x9245, 0xCBEA, 0x92F8, + 0xCBEB, 0x4E7E, 0xCBEC, 0x4EF6, 0xCBED, 0x5065, 0xCBEE, 0x5DFE, 0xCBEF, 0x5EFA, 0xCBF0, 0x6106, 0xCBF1, 0x6957, 0xCBF2, 0x8171, + 0xCBF3, 0x8654, 0xCBF4, 0x8E47, 0xCBF5, 0x9375, 0xCBF6, 0x9A2B, 0xCBF7, 0x4E5E, 0xCBF8, 0x5091, 0xCBF9, 0x6770, 0xCBFA, 0x6840, + 0xCBFB, 0x5109, 0xCBFC, 0x528D, 0xCBFD, 0x5292, 0xCBFE, 0x6AA2, 0xCCA1, 0x77BC, 0xCCA2, 0x9210, 0xCCA3, 0x9ED4, 0xCCA4, 0x52AB, + 0xCCA5, 0x602F, 0xCCA6, 0x8FF2, 0xCCA7, 0x5048, 0xCCA8, 0x61A9, 0xCCA9, 0x63ED, 0xCCAA, 0x64CA, 0xCCAB, 0x683C, 0xCCAC, 0x6A84, + 0xCCAD, 0x6FC0, 0xCCAE, 0x8188, 0xCCAF, 0x89A1, 0xCCB0, 0x9694, 0xCCB1, 0x5805, 0xCCB2, 0x727D, 0xCCB3, 0x72AC, 0xCCB4, 0x7504, + 0xCCB5, 0x7D79, 0xCCB6, 0x7E6D, 0xCCB7, 0x80A9, 0xCCB8, 0x898B, 0xCCB9, 0x8B74, 0xCCBA, 0x9063, 0xCCBB, 0x9D51, 0xCCBC, 0x6289, + 0xCCBD, 0x6C7A, 0xCCBE, 0x6F54, 0xCCBF, 0x7D50, 0xCCC0, 0x7F3A, 0xCCC1, 0x8A23, 0xCCC2, 0x517C, 0xCCC3, 0x614A, 0xCCC4, 0x7B9D, + 0xCCC5, 0x8B19, 0xCCC6, 0x9257, 0xCCC7, 0x938C, 0xCCC8, 0x4EAC, 0xCCC9, 0x4FD3, 0xCCCA, 0x501E, 0xCCCB, 0x50BE, 0xCCCC, 0x5106, + 0xCCCD, 0x52C1, 0xCCCE, 0x52CD, 0xCCCF, 0x537F, 0xCCD0, 0x5770, 0xCCD1, 0x5883, 0xCCD2, 0x5E9A, 0xCCD3, 0x5F91, 0xCCD4, 0x6176, + 0xCCD5, 0x61AC, 0xCCD6, 0x64CE, 0xCCD7, 0x656C, 0xCCD8, 0x666F, 0xCCD9, 0x66BB, 0xCCDA, 0x66F4, 0xCCDB, 0x6897, 0xCCDC, 0x6D87, + 0xCCDD, 0x7085, 0xCCDE, 0x70F1, 0xCCDF, 0x749F, 0xCCE0, 0x74A5, 0xCCE1, 0x74CA, 0xCCE2, 0x75D9, 0xCCE3, 0x786C, 0xCCE4, 0x78EC, + 0xCCE5, 0x7ADF, 0xCCE6, 0x7AF6, 0xCCE7, 0x7D45, 0xCCE8, 0x7D93, 0xCCE9, 0x8015, 0xCCEA, 0x803F, 0xCCEB, 0x811B, 0xCCEC, 0x8396, + 0xCCED, 0x8B66, 0xCCEE, 0x8F15, 0xCCEF, 0x9015, 0xCCF0, 0x93E1, 0xCCF1, 0x9803, 0xCCF2, 0x9838, 0xCCF3, 0x9A5A, 0xCCF4, 0x9BE8, + 0xCCF5, 0x4FC2, 0xCCF6, 0x5553, 0xCCF7, 0x583A, 0xCCF8, 0x5951, 0xCCF9, 0x5B63, 0xCCFA, 0x5C46, 0xCCFB, 0x60B8, 0xCCFC, 0x6212, + 0xCCFD, 0x6842, 0xCCFE, 0x68B0, 0xCDA1, 0x68E8, 0xCDA2, 0x6EAA, 0xCDA3, 0x754C, 0xCDA4, 0x7678, 0xCDA5, 0x78CE, 0xCDA6, 0x7A3D, + 0xCDA7, 0x7CFB, 0xCDA8, 0x7E6B, 0xCDA9, 0x7E7C, 0xCDAA, 0x8A08, 0xCDAB, 0x8AA1, 0xCDAC, 0x8C3F, 0xCDAD, 0x968E, 0xCDAE, 0x9DC4, + 0xCDAF, 0x53E4, 0xCDB0, 0x53E9, 0xCDB1, 0x544A, 0xCDB2, 0x5471, 0xCDB3, 0x56FA, 0xCDB4, 0x59D1, 0xCDB5, 0x5B64, 0xCDB6, 0x5C3B, + 0xCDB7, 0x5EAB, 0xCDB8, 0x62F7, 0xCDB9, 0x6537, 0xCDBA, 0x6545, 0xCDBB, 0x6572, 0xCDBC, 0x66A0, 0xCDBD, 0x67AF, 0xCDBE, 0x69C1, + 0xCDBF, 0x6CBD, 0xCDC0, 0x75FC, 0xCDC1, 0x7690, 0xCDC2, 0x777E, 0xCDC3, 0x7A3F, 0xCDC4, 0x7F94, 0xCDC5, 0x8003, 0xCDC6, 0x80A1, + 0xCDC7, 0x818F, 0xCDC8, 0x82E6, 0xCDC9, 0x82FD, 0xCDCA, 0x83F0, 0xCDCB, 0x85C1, 0xCDCC, 0x8831, 0xCDCD, 0x88B4, 0xCDCE, 0x8AA5, + 0xCDCF, 0xF903, 0xCDD0, 0x8F9C, 0xCDD1, 0x932E, 0xCDD2, 0x96C7, 0xCDD3, 0x9867, 0xCDD4, 0x9AD8, 0xCDD5, 0x9F13, 0xCDD6, 0x54ED, + 0xCDD7, 0x659B, 0xCDD8, 0x66F2, 0xCDD9, 0x688F, 0xCDDA, 0x7A40, 0xCDDB, 0x8C37, 0xCDDC, 0x9D60, 0xCDDD, 0x56F0, 0xCDDE, 0x5764, + 0xCDDF, 0x5D11, 0xCDE0, 0x6606, 0xCDE1, 0x68B1, 0xCDE2, 0x68CD, 0xCDE3, 0x6EFE, 0xCDE4, 0x7428, 0xCDE5, 0x889E, 0xCDE6, 0x9BE4, + 0xCDE7, 0x6C68, 0xCDE8, 0xF904, 0xCDE9, 0x9AA8, 0xCDEA, 0x4F9B, 0xCDEB, 0x516C, 0xCDEC, 0x5171, 0xCDED, 0x529F, 0xCDEE, 0x5B54, + 0xCDEF, 0x5DE5, 0xCDF0, 0x6050, 0xCDF1, 0x606D, 0xCDF2, 0x62F1, 0xCDF3, 0x63A7, 0xCDF4, 0x653B, 0xCDF5, 0x73D9, 0xCDF6, 0x7A7A, + 0xCDF7, 0x86A3, 0xCDF8, 0x8CA2, 0xCDF9, 0x978F, 0xCDFA, 0x4E32, 0xCDFB, 0x5BE1, 0xCDFC, 0x6208, 0xCDFD, 0x679C, 0xCDFE, 0x74DC, + 0xCEA1, 0x79D1, 0xCEA2, 0x83D3, 0xCEA3, 0x8A87, 0xCEA4, 0x8AB2, 0xCEA5, 0x8DE8, 0xCEA6, 0x904E, 0xCEA7, 0x934B, 0xCEA8, 0x9846, + 0xCEA9, 0x5ED3, 0xCEAA, 0x69E8, 0xCEAB, 0x85FF, 0xCEAC, 0x90ED, 0xCEAD, 0xF905, 0xCEAE, 0x51A0, 0xCEAF, 0x5B98, 0xCEB0, 0x5BEC, + 0xCEB1, 0x6163, 0xCEB2, 0x68FA, 0xCEB3, 0x6B3E, 0xCEB4, 0x704C, 0xCEB5, 0x742F, 0xCEB6, 0x74D8, 0xCEB7, 0x7BA1, 0xCEB8, 0x7F50, + 0xCEB9, 0x83C5, 0xCEBA, 0x89C0, 0xCEBB, 0x8CAB, 0xCEBC, 0x95DC, 0xCEBD, 0x9928, 0xCEBE, 0x522E, 0xCEBF, 0x605D, 0xCEC0, 0x62EC, + 0xCEC1, 0x9002, 0xCEC2, 0x4F8A, 0xCEC3, 0x5149, 0xCEC4, 0x5321, 0xCEC5, 0x58D9, 0xCEC6, 0x5EE3, 0xCEC7, 0x66E0, 0xCEC8, 0x6D38, + 0xCEC9, 0x709A, 0xCECA, 0x72C2, 0xCECB, 0x73D6, 0xCECC, 0x7B50, 0xCECD, 0x80F1, 0xCECE, 0x945B, 0xCECF, 0x5366, 0xCED0, 0x639B, + 0xCED1, 0x7F6B, 0xCED2, 0x4E56, 0xCED3, 0x5080, 0xCED4, 0x584A, 0xCED5, 0x58DE, 0xCED6, 0x602A, 0xCED7, 0x6127, 0xCED8, 0x62D0, + 0xCED9, 0x69D0, 0xCEDA, 0x9B41, 0xCEDB, 0x5B8F, 0xCEDC, 0x7D18, 0xCEDD, 0x80B1, 0xCEDE, 0x8F5F, 0xCEDF, 0x4EA4, 0xCEE0, 0x50D1, + 0xCEE1, 0x54AC, 0xCEE2, 0x55AC, 0xCEE3, 0x5B0C, 0xCEE4, 0x5DA0, 0xCEE5, 0x5DE7, 0xCEE6, 0x652A, 0xCEE7, 0x654E, 0xCEE8, 0x6821, + 0xCEE9, 0x6A4B, 0xCEEA, 0x72E1, 0xCEEB, 0x768E, 0xCEEC, 0x77EF, 0xCEED, 0x7D5E, 0xCEEE, 0x7FF9, 0xCEEF, 0x81A0, 0xCEF0, 0x854E, + 0xCEF1, 0x86DF, 0xCEF2, 0x8F03, 0xCEF3, 0x8F4E, 0xCEF4, 0x90CA, 0xCEF5, 0x9903, 0xCEF6, 0x9A55, 0xCEF7, 0x9BAB, 0xCEF8, 0x4E18, + 0xCEF9, 0x4E45, 0xCEFA, 0x4E5D, 0xCEFB, 0x4EC7, 0xCEFC, 0x4FF1, 0xCEFD, 0x5177, 0xCEFE, 0x52FE, 0xCFA1, 0x5340, 0xCFA2, 0x53E3, + 0xCFA3, 0x53E5, 0xCFA4, 0x548E, 0xCFA5, 0x5614, 0xCFA6, 0x5775, 0xCFA7, 0x57A2, 0xCFA8, 0x5BC7, 0xCFA9, 0x5D87, 0xCFAA, 0x5ED0, + 0xCFAB, 0x61FC, 0xCFAC, 0x62D8, 0xCFAD, 0x6551, 0xCFAE, 0x67B8, 0xCFAF, 0x67E9, 0xCFB0, 0x69CB, 0xCFB1, 0x6B50, 0xCFB2, 0x6BC6, + 0xCFB3, 0x6BEC, 0xCFB4, 0x6C42, 0xCFB5, 0x6E9D, 0xCFB6, 0x7078, 0xCFB7, 0x72D7, 0xCFB8, 0x7396, 0xCFB9, 0x7403, 0xCFBA, 0x77BF, + 0xCFBB, 0x77E9, 0xCFBC, 0x7A76, 0xCFBD, 0x7D7F, 0xCFBE, 0x8009, 0xCFBF, 0x81FC, 0xCFC0, 0x8205, 0xCFC1, 0x820A, 0xCFC2, 0x82DF, + 0xCFC3, 0x8862, 0xCFC4, 0x8B33, 0xCFC5, 0x8CFC, 0xCFC6, 0x8EC0, 0xCFC7, 0x9011, 0xCFC8, 0x90B1, 0xCFC9, 0x9264, 0xCFCA, 0x92B6, + 0xCFCB, 0x99D2, 0xCFCC, 0x9A45, 0xCFCD, 0x9CE9, 0xCFCE, 0x9DD7, 0xCFCF, 0x9F9C, 0xCFD0, 0x570B, 0xCFD1, 0x5C40, 0xCFD2, 0x83CA, + 0xCFD3, 0x97A0, 0xCFD4, 0x97AB, 0xCFD5, 0x9EB4, 0xCFD6, 0x541B, 0xCFD7, 0x7A98, 0xCFD8, 0x7FA4, 0xCFD9, 0x88D9, 0xCFDA, 0x8ECD, + 0xCFDB, 0x90E1, 0xCFDC, 0x5800, 0xCFDD, 0x5C48, 0xCFDE, 0x6398, 0xCFDF, 0x7A9F, 0xCFE0, 0x5BAE, 0xCFE1, 0x5F13, 0xCFE2, 0x7A79, + 0xCFE3, 0x7AAE, 0xCFE4, 0x828E, 0xCFE5, 0x8EAC, 0xCFE6, 0x5026, 0xCFE7, 0x5238, 0xCFE8, 0x52F8, 0xCFE9, 0x5377, 0xCFEA, 0x5708, + 0xCFEB, 0x62F3, 0xCFEC, 0x6372, 0xCFED, 0x6B0A, 0xCFEE, 0x6DC3, 0xCFEF, 0x7737, 0xCFF0, 0x53A5, 0xCFF1, 0x7357, 0xCFF2, 0x8568, + 0xCFF3, 0x8E76, 0xCFF4, 0x95D5, 0xCFF5, 0x673A, 0xCFF6, 0x6AC3, 0xCFF7, 0x6F70, 0xCFF8, 0x8A6D, 0xCFF9, 0x8ECC, 0xCFFA, 0x994B, + 0xCFFB, 0xF906, 0xCFFC, 0x6677, 0xCFFD, 0x6B78, 0xCFFE, 0x8CB4, 0xD0A1, 0x9B3C, 0xD0A2, 0xF907, 0xD0A3, 0x53EB, 0xD0A4, 0x572D, + 0xD0A5, 0x594E, 0xD0A6, 0x63C6, 0xD0A7, 0x69FB, 0xD0A8, 0x73EA, 0xD0A9, 0x7845, 0xD0AA, 0x7ABA, 0xD0AB, 0x7AC5, 0xD0AC, 0x7CFE, + 0xD0AD, 0x8475, 0xD0AE, 0x898F, 0xD0AF, 0x8D73, 0xD0B0, 0x9035, 0xD0B1, 0x95A8, 0xD0B2, 0x52FB, 0xD0B3, 0x5747, 0xD0B4, 0x7547, + 0xD0B5, 0x7B60, 0xD0B6, 0x83CC, 0xD0B7, 0x921E, 0xD0B8, 0xF908, 0xD0B9, 0x6A58, 0xD0BA, 0x514B, 0xD0BB, 0x524B, 0xD0BC, 0x5287, + 0xD0BD, 0x621F, 0xD0BE, 0x68D8, 0xD0BF, 0x6975, 0xD0C0, 0x9699, 0xD0C1, 0x50C5, 0xD0C2, 0x52A4, 0xD0C3, 0x52E4, 0xD0C4, 0x61C3, + 0xD0C5, 0x65A4, 0xD0C6, 0x6839, 0xD0C7, 0x69FF, 0xD0C8, 0x747E, 0xD0C9, 0x7B4B, 0xD0CA, 0x82B9, 0xD0CB, 0x83EB, 0xD0CC, 0x89B2, + 0xD0CD, 0x8B39, 0xD0CE, 0x8FD1, 0xD0CF, 0x9949, 0xD0D0, 0xF909, 0xD0D1, 0x4ECA, 0xD0D2, 0x5997, 0xD0D3, 0x64D2, 0xD0D4, 0x6611, + 0xD0D5, 0x6A8E, 0xD0D6, 0x7434, 0xD0D7, 0x7981, 0xD0D8, 0x79BD, 0xD0D9, 0x82A9, 0xD0DA, 0x887E, 0xD0DB, 0x887F, 0xD0DC, 0x895F, + 0xD0DD, 0xF90A, 0xD0DE, 0x9326, 0xD0DF, 0x4F0B, 0xD0E0, 0x53CA, 0xD0E1, 0x6025, 0xD0E2, 0x6271, 0xD0E3, 0x6C72, 0xD0E4, 0x7D1A, + 0xD0E5, 0x7D66, 0xD0E6, 0x4E98, 0xD0E7, 0x5162, 0xD0E8, 0x77DC, 0xD0E9, 0x80AF, 0xD0EA, 0x4F01, 0xD0EB, 0x4F0E, 0xD0EC, 0x5176, + 0xD0ED, 0x5180, 0xD0EE, 0x55DC, 0xD0EF, 0x5668, 0xD0F0, 0x573B, 0xD0F1, 0x57FA, 0xD0F2, 0x57FC, 0xD0F3, 0x5914, 0xD0F4, 0x5947, + 0xD0F5, 0x5993, 0xD0F6, 0x5BC4, 0xD0F7, 0x5C90, 0xD0F8, 0x5D0E, 0xD0F9, 0x5DF1, 0xD0FA, 0x5E7E, 0xD0FB, 0x5FCC, 0xD0FC, 0x6280, + 0xD0FD, 0x65D7, 0xD0FE, 0x65E3, 0xD1A1, 0x671E, 0xD1A2, 0x671F, 0xD1A3, 0x675E, 0xD1A4, 0x68CB, 0xD1A5, 0x68C4, 0xD1A6, 0x6A5F, + 0xD1A7, 0x6B3A, 0xD1A8, 0x6C23, 0xD1A9, 0x6C7D, 0xD1AA, 0x6C82, 0xD1AB, 0x6DC7, 0xD1AC, 0x7398, 0xD1AD, 0x7426, 0xD1AE, 0x742A, + 0xD1AF, 0x7482, 0xD1B0, 0x74A3, 0xD1B1, 0x7578, 0xD1B2, 0x757F, 0xD1B3, 0x7881, 0xD1B4, 0x78EF, 0xD1B5, 0x7941, 0xD1B6, 0x7947, + 0xD1B7, 0x7948, 0xD1B8, 0x797A, 0xD1B9, 0x7B95, 0xD1BA, 0x7D00, 0xD1BB, 0x7DBA, 0xD1BC, 0x7F88, 0xD1BD, 0x8006, 0xD1BE, 0x802D, + 0xD1BF, 0x808C, 0xD1C0, 0x8A18, 0xD1C1, 0x8B4F, 0xD1C2, 0x8C48, 0xD1C3, 0x8D77, 0xD1C4, 0x9321, 0xD1C5, 0x9324, 0xD1C6, 0x98E2, + 0xD1C7, 0x9951, 0xD1C8, 0x9A0E, 0xD1C9, 0x9A0F, 0xD1CA, 0x9A65, 0xD1CB, 0x9E92, 0xD1CC, 0x7DCA, 0xD1CD, 0x4F76, 0xD1CE, 0x5409, + 0xD1CF, 0x62EE, 0xD1D0, 0x6854, 0xD1D1, 0x91D1, 0xD1D2, 0x55AB, 0xD1D3, 0x513A, 0xD1D4, 0xF90B, 0xD1D5, 0xF90C, 0xD1D6, 0x5A1C, + 0xD1D7, 0x61E6, 0xD1D8, 0xF90D, 0xD1D9, 0x62CF, 0xD1DA, 0x62FF, 0xD1DB, 0xF90E, 0xD1DC, 0xF90F, 0xD1DD, 0xF910, 0xD1DE, 0xF911, + 0xD1DF, 0xF912, 0xD1E0, 0xF913, 0xD1E1, 0x90A3, 0xD1E2, 0xF914, 0xD1E3, 0xF915, 0xD1E4, 0xF916, 0xD1E5, 0xF917, 0xD1E6, 0xF918, + 0xD1E7, 0x8AFE, 0xD1E8, 0xF919, 0xD1E9, 0xF91A, 0xD1EA, 0xF91B, 0xD1EB, 0xF91C, 0xD1EC, 0x6696, 0xD1ED, 0xF91D, 0xD1EE, 0x7156, + 0xD1EF, 0xF91E, 0xD1F0, 0xF91F, 0xD1F1, 0x96E3, 0xD1F2, 0xF920, 0xD1F3, 0x634F, 0xD1F4, 0x637A, 0xD1F5, 0x5357, 0xD1F6, 0xF921, + 0xD1F7, 0x678F, 0xD1F8, 0x6960, 0xD1F9, 0x6E73, 0xD1FA, 0xF922, 0xD1FB, 0x7537, 0xD1FC, 0xF923, 0xD1FD, 0xF924, 0xD1FE, 0xF925, + 0xD2A1, 0x7D0D, 0xD2A2, 0xF926, 0xD2A3, 0xF927, 0xD2A4, 0x8872, 0xD2A5, 0x56CA, 0xD2A6, 0x5A18, 0xD2A7, 0xF928, 0xD2A8, 0xF929, + 0xD2A9, 0xF92A, 0xD2AA, 0xF92B, 0xD2AB, 0xF92C, 0xD2AC, 0x4E43, 0xD2AD, 0xF92D, 0xD2AE, 0x5167, 0xD2AF, 0x5948, 0xD2B0, 0x67F0, + 0xD2B1, 0x8010, 0xD2B2, 0xF92E, 0xD2B3, 0x5973, 0xD2B4, 0x5E74, 0xD2B5, 0x649A, 0xD2B6, 0x79CA, 0xD2B7, 0x5FF5, 0xD2B8, 0x606C, + 0xD2B9, 0x62C8, 0xD2BA, 0x637B, 0xD2BB, 0x5BE7, 0xD2BC, 0x5BD7, 0xD2BD, 0x52AA, 0xD2BE, 0xF92F, 0xD2BF, 0x5974, 0xD2C0, 0x5F29, + 0xD2C1, 0x6012, 0xD2C2, 0xF930, 0xD2C3, 0xF931, 0xD2C4, 0xF932, 0xD2C5, 0x7459, 0xD2C6, 0xF933, 0xD2C7, 0xF934, 0xD2C8, 0xF935, + 0xD2C9, 0xF936, 0xD2CA, 0xF937, 0xD2CB, 0xF938, 0xD2CC, 0x99D1, 0xD2CD, 0xF939, 0xD2CE, 0xF93A, 0xD2CF, 0xF93B, 0xD2D0, 0xF93C, + 0xD2D1, 0xF93D, 0xD2D2, 0xF93E, 0xD2D3, 0xF93F, 0xD2D4, 0xF940, 0xD2D5, 0xF941, 0xD2D6, 0xF942, 0xD2D7, 0xF943, 0xD2D8, 0x6FC3, + 0xD2D9, 0xF944, 0xD2DA, 0xF945, 0xD2DB, 0x81BF, 0xD2DC, 0x8FB2, 0xD2DD, 0x60F1, 0xD2DE, 0xF946, 0xD2DF, 0xF947, 0xD2E0, 0x8166, + 0xD2E1, 0xF948, 0xD2E2, 0xF949, 0xD2E3, 0x5C3F, 0xD2E4, 0xF94A, 0xD2E5, 0xF94B, 0xD2E6, 0xF94C, 0xD2E7, 0xF94D, 0xD2E8, 0xF94E, + 0xD2E9, 0xF94F, 0xD2EA, 0xF950, 0xD2EB, 0xF951, 0xD2EC, 0x5AE9, 0xD2ED, 0x8A25, 0xD2EE, 0x677B, 0xD2EF, 0x7D10, 0xD2F0, 0xF952, + 0xD2F1, 0xF953, 0xD2F2, 0xF954, 0xD2F3, 0xF955, 0xD2F4, 0xF956, 0xD2F5, 0xF957, 0xD2F6, 0x80FD, 0xD2F7, 0xF958, 0xD2F8, 0xF959, + 0xD2F9, 0x5C3C, 0xD2FA, 0x6CE5, 0xD2FB, 0x533F, 0xD2FC, 0x6EBA, 0xD2FD, 0x591A, 0xD2FE, 0x8336, 0xD3A1, 0x4E39, 0xD3A2, 0x4EB6, + 0xD3A3, 0x4F46, 0xD3A4, 0x55AE, 0xD3A5, 0x5718, 0xD3A6, 0x58C7, 0xD3A7, 0x5F56, 0xD3A8, 0x65B7, 0xD3A9, 0x65E6, 0xD3AA, 0x6A80, + 0xD3AB, 0x6BB5, 0xD3AC, 0x6E4D, 0xD3AD, 0x77ED, 0xD3AE, 0x7AEF, 0xD3AF, 0x7C1E, 0xD3B0, 0x7DDE, 0xD3B1, 0x86CB, 0xD3B2, 0x8892, + 0xD3B3, 0x9132, 0xD3B4, 0x935B, 0xD3B5, 0x64BB, 0xD3B6, 0x6FBE, 0xD3B7, 0x737A, 0xD3B8, 0x75B8, 0xD3B9, 0x9054, 0xD3BA, 0x5556, + 0xD3BB, 0x574D, 0xD3BC, 0x61BA, 0xD3BD, 0x64D4, 0xD3BE, 0x66C7, 0xD3BF, 0x6DE1, 0xD3C0, 0x6E5B, 0xD3C1, 0x6F6D, 0xD3C2, 0x6FB9, + 0xD3C3, 0x75F0, 0xD3C4, 0x8043, 0xD3C5, 0x81BD, 0xD3C6, 0x8541, 0xD3C7, 0x8983, 0xD3C8, 0x8AC7, 0xD3C9, 0x8B5A, 0xD3CA, 0x931F, + 0xD3CB, 0x6C93, 0xD3CC, 0x7553, 0xD3CD, 0x7B54, 0xD3CE, 0x8E0F, 0xD3CF, 0x905D, 0xD3D0, 0x5510, 0xD3D1, 0x5802, 0xD3D2, 0x5858, + 0xD3D3, 0x5E62, 0xD3D4, 0x6207, 0xD3D5, 0x649E, 0xD3D6, 0x68E0, 0xD3D7, 0x7576, 0xD3D8, 0x7CD6, 0xD3D9, 0x87B3, 0xD3DA, 0x9EE8, + 0xD3DB, 0x4EE3, 0xD3DC, 0x5788, 0xD3DD, 0x576E, 0xD3DE, 0x5927, 0xD3DF, 0x5C0D, 0xD3E0, 0x5CB1, 0xD3E1, 0x5E36, 0xD3E2, 0x5F85, + 0xD3E3, 0x6234, 0xD3E4, 0x64E1, 0xD3E5, 0x73B3, 0xD3E6, 0x81FA, 0xD3E7, 0x888B, 0xD3E8, 0x8CB8, 0xD3E9, 0x968A, 0xD3EA, 0x9EDB, + 0xD3EB, 0x5B85, 0xD3EC, 0x5FB7, 0xD3ED, 0x60B3, 0xD3EE, 0x5012, 0xD3EF, 0x5200, 0xD3F0, 0x5230, 0xD3F1, 0x5716, 0xD3F2, 0x5835, + 0xD3F3, 0x5857, 0xD3F4, 0x5C0E, 0xD3F5, 0x5C60, 0xD3F6, 0x5CF6, 0xD3F7, 0x5D8B, 0xD3F8, 0x5EA6, 0xD3F9, 0x5F92, 0xD3FA, 0x60BC, + 0xD3FB, 0x6311, 0xD3FC, 0x6389, 0xD3FD, 0x6417, 0xD3FE, 0x6843, 0xD4A1, 0x68F9, 0xD4A2, 0x6AC2, 0xD4A3, 0x6DD8, 0xD4A4, 0x6E21, + 0xD4A5, 0x6ED4, 0xD4A6, 0x6FE4, 0xD4A7, 0x71FE, 0xD4A8, 0x76DC, 0xD4A9, 0x7779, 0xD4AA, 0x79B1, 0xD4AB, 0x7A3B, 0xD4AC, 0x8404, + 0xD4AD, 0x89A9, 0xD4AE, 0x8CED, 0xD4AF, 0x8DF3, 0xD4B0, 0x8E48, 0xD4B1, 0x9003, 0xD4B2, 0x9014, 0xD4B3, 0x9053, 0xD4B4, 0x90FD, + 0xD4B5, 0x934D, 0xD4B6, 0x9676, 0xD4B7, 0x97DC, 0xD4B8, 0x6BD2, 0xD4B9, 0x7006, 0xD4BA, 0x7258, 0xD4BB, 0x72A2, 0xD4BC, 0x7368, + 0xD4BD, 0x7763, 0xD4BE, 0x79BF, 0xD4BF, 0x7BE4, 0xD4C0, 0x7E9B, 0xD4C1, 0x8B80, 0xD4C2, 0x58A9, 0xD4C3, 0x60C7, 0xD4C4, 0x6566, + 0xD4C5, 0x65FD, 0xD4C6, 0x66BE, 0xD4C7, 0x6C8C, 0xD4C8, 0x711E, 0xD4C9, 0x71C9, 0xD4CA, 0x8C5A, 0xD4CB, 0x9813, 0xD4CC, 0x4E6D, + 0xD4CD, 0x7A81, 0xD4CE, 0x4EDD, 0xD4CF, 0x51AC, 0xD4D0, 0x51CD, 0xD4D1, 0x52D5, 0xD4D2, 0x540C, 0xD4D3, 0x61A7, 0xD4D4, 0x6771, + 0xD4D5, 0x6850, 0xD4D6, 0x68DF, 0xD4D7, 0x6D1E, 0xD4D8, 0x6F7C, 0xD4D9, 0x75BC, 0xD4DA, 0x77B3, 0xD4DB, 0x7AE5, 0xD4DC, 0x80F4, + 0xD4DD, 0x8463, 0xD4DE, 0x9285, 0xD4DF, 0x515C, 0xD4E0, 0x6597, 0xD4E1, 0x675C, 0xD4E2, 0x6793, 0xD4E3, 0x75D8, 0xD4E4, 0x7AC7, + 0xD4E5, 0x8373, 0xD4E6, 0xF95A, 0xD4E7, 0x8C46, 0xD4E8, 0x9017, 0xD4E9, 0x982D, 0xD4EA, 0x5C6F, 0xD4EB, 0x81C0, 0xD4EC, 0x829A, + 0xD4ED, 0x9041, 0xD4EE, 0x906F, 0xD4EF, 0x920D, 0xD4F0, 0x5F97, 0xD4F1, 0x5D9D, 0xD4F2, 0x6A59, 0xD4F3, 0x71C8, 0xD4F4, 0x767B, + 0xD4F5, 0x7B49, 0xD4F6, 0x85E4, 0xD4F7, 0x8B04, 0xD4F8, 0x9127, 0xD4F9, 0x9A30, 0xD4FA, 0x5587, 0xD4FB, 0x61F6, 0xD4FC, 0xF95B, + 0xD4FD, 0x7669, 0xD4FE, 0x7F85, 0xD5A1, 0x863F, 0xD5A2, 0x87BA, 0xD5A3, 0x88F8, 0xD5A4, 0x908F, 0xD5A5, 0xF95C, 0xD5A6, 0x6D1B, + 0xD5A7, 0x70D9, 0xD5A8, 0x73DE, 0xD5A9, 0x7D61, 0xD5AA, 0x843D, 0xD5AB, 0xF95D, 0xD5AC, 0x916A, 0xD5AD, 0x99F1, 0xD5AE, 0xF95E, + 0xD5AF, 0x4E82, 0xD5B0, 0x5375, 0xD5B1, 0x6B04, 0xD5B2, 0x6B12, 0xD5B3, 0x703E, 0xD5B4, 0x721B, 0xD5B5, 0x862D, 0xD5B6, 0x9E1E, + 0xD5B7, 0x524C, 0xD5B8, 0x8FA3, 0xD5B9, 0x5D50, 0xD5BA, 0x64E5, 0xD5BB, 0x652C, 0xD5BC, 0x6B16, 0xD5BD, 0x6FEB, 0xD5BE, 0x7C43, + 0xD5BF, 0x7E9C, 0xD5C0, 0x85CD, 0xD5C1, 0x8964, 0xD5C2, 0x89BD, 0xD5C3, 0x62C9, 0xD5C4, 0x81D8, 0xD5C5, 0x881F, 0xD5C6, 0x5ECA, + 0xD5C7, 0x6717, 0xD5C8, 0x6D6A, 0xD5C9, 0x72FC, 0xD5CA, 0x7405, 0xD5CB, 0x746F, 0xD5CC, 0x8782, 0xD5CD, 0x90DE, 0xD5CE, 0x4F86, + 0xD5CF, 0x5D0D, 0xD5D0, 0x5FA0, 0xD5D1, 0x840A, 0xD5D2, 0x51B7, 0xD5D3, 0x63A0, 0xD5D4, 0x7565, 0xD5D5, 0x4EAE, 0xD5D6, 0x5006, + 0xD5D7, 0x5169, 0xD5D8, 0x51C9, 0xD5D9, 0x6881, 0xD5DA, 0x6A11, 0xD5DB, 0x7CAE, 0xD5DC, 0x7CB1, 0xD5DD, 0x7CE7, 0xD5DE, 0x826F, + 0xD5DF, 0x8AD2, 0xD5E0, 0x8F1B, 0xD5E1, 0x91CF, 0xD5E2, 0x4FB6, 0xD5E3, 0x5137, 0xD5E4, 0x52F5, 0xD5E5, 0x5442, 0xD5E6, 0x5EEC, + 0xD5E7, 0x616E, 0xD5E8, 0x623E, 0xD5E9, 0x65C5, 0xD5EA, 0x6ADA, 0xD5EB, 0x6FFE, 0xD5EC, 0x792A, 0xD5ED, 0x85DC, 0xD5EE, 0x8823, + 0xD5EF, 0x95AD, 0xD5F0, 0x9A62, 0xD5F1, 0x9A6A, 0xD5F2, 0x9E97, 0xD5F3, 0x9ECE, 0xD5F4, 0x529B, 0xD5F5, 0x66C6, 0xD5F6, 0x6B77, + 0xD5F7, 0x701D, 0xD5F8, 0x792B, 0xD5F9, 0x8F62, 0xD5FA, 0x9742, 0xD5FB, 0x6190, 0xD5FC, 0x6200, 0xD5FD, 0x6523, 0xD5FE, 0x6F23, + 0xD6A1, 0x7149, 0xD6A2, 0x7489, 0xD6A3, 0x7DF4, 0xD6A4, 0x806F, 0xD6A5, 0x84EE, 0xD6A6, 0x8F26, 0xD6A7, 0x9023, 0xD6A8, 0x934A, + 0xD6A9, 0x51BD, 0xD6AA, 0x5217, 0xD6AB, 0x52A3, 0xD6AC, 0x6D0C, 0xD6AD, 0x70C8, 0xD6AE, 0x88C2, 0xD6AF, 0x5EC9, 0xD6B0, 0x6582, + 0xD6B1, 0x6BAE, 0xD6B2, 0x6FC2, 0xD6B3, 0x7C3E, 0xD6B4, 0x7375, 0xD6B5, 0x4EE4, 0xD6B6, 0x4F36, 0xD6B7, 0x56F9, 0xD6B8, 0xF95F, + 0xD6B9, 0x5CBA, 0xD6BA, 0x5DBA, 0xD6BB, 0x601C, 0xD6BC, 0x73B2, 0xD6BD, 0x7B2D, 0xD6BE, 0x7F9A, 0xD6BF, 0x7FCE, 0xD6C0, 0x8046, + 0xD6C1, 0x901E, 0xD6C2, 0x9234, 0xD6C3, 0x96F6, 0xD6C4, 0x9748, 0xD6C5, 0x9818, 0xD6C6, 0x9F61, 0xD6C7, 0x4F8B, 0xD6C8, 0x6FA7, + 0xD6C9, 0x79AE, 0xD6CA, 0x91B4, 0xD6CB, 0x96B7, 0xD6CC, 0x52DE, 0xD6CD, 0xF960, 0xD6CE, 0x6488, 0xD6CF, 0x64C4, 0xD6D0, 0x6AD3, + 0xD6D1, 0x6F5E, 0xD6D2, 0x7018, 0xD6D3, 0x7210, 0xD6D4, 0x76E7, 0xD6D5, 0x8001, 0xD6D6, 0x8606, 0xD6D7, 0x865C, 0xD6D8, 0x8DEF, + 0xD6D9, 0x8F05, 0xD6DA, 0x9732, 0xD6DB, 0x9B6F, 0xD6DC, 0x9DFA, 0xD6DD, 0x9E75, 0xD6DE, 0x788C, 0xD6DF, 0x797F, 0xD6E0, 0x7DA0, + 0xD6E1, 0x83C9, 0xD6E2, 0x9304, 0xD6E3, 0x9E7F, 0xD6E4, 0x9E93, 0xD6E5, 0x8AD6, 0xD6E6, 0x58DF, 0xD6E7, 0x5F04, 0xD6E8, 0x6727, + 0xD6E9, 0x7027, 0xD6EA, 0x74CF, 0xD6EB, 0x7C60, 0xD6EC, 0x807E, 0xD6ED, 0x5121, 0xD6EE, 0x7028, 0xD6EF, 0x7262, 0xD6F0, 0x78CA, + 0xD6F1, 0x8CC2, 0xD6F2, 0x8CDA, 0xD6F3, 0x8CF4, 0xD6F4, 0x96F7, 0xD6F5, 0x4E86, 0xD6F6, 0x50DA, 0xD6F7, 0x5BEE, 0xD6F8, 0x5ED6, + 0xD6F9, 0x6599, 0xD6FA, 0x71CE, 0xD6FB, 0x7642, 0xD6FC, 0x77AD, 0xD6FD, 0x804A, 0xD6FE, 0x84FC, 0xD7A1, 0x907C, 0xD7A2, 0x9B27, + 0xD7A3, 0x9F8D, 0xD7A4, 0x58D8, 0xD7A5, 0x5A41, 0xD7A6, 0x5C62, 0xD7A7, 0x6A13, 0xD7A8, 0x6DDA, 0xD7A9, 0x6F0F, 0xD7AA, 0x763B, + 0xD7AB, 0x7D2F, 0xD7AC, 0x7E37, 0xD7AD, 0x851E, 0xD7AE, 0x8938, 0xD7AF, 0x93E4, 0xD7B0, 0x964B, 0xD7B1, 0x5289, 0xD7B2, 0x65D2, + 0xD7B3, 0x67F3, 0xD7B4, 0x69B4, 0xD7B5, 0x6D41, 0xD7B6, 0x6E9C, 0xD7B7, 0x700F, 0xD7B8, 0x7409, 0xD7B9, 0x7460, 0xD7BA, 0x7559, + 0xD7BB, 0x7624, 0xD7BC, 0x786B, 0xD7BD, 0x8B2C, 0xD7BE, 0x985E, 0xD7BF, 0x516D, 0xD7C0, 0x622E, 0xD7C1, 0x9678, 0xD7C2, 0x4F96, + 0xD7C3, 0x502B, 0xD7C4, 0x5D19, 0xD7C5, 0x6DEA, 0xD7C6, 0x7DB8, 0xD7C7, 0x8F2A, 0xD7C8, 0x5F8B, 0xD7C9, 0x6144, 0xD7CA, 0x6817, + 0xD7CB, 0xF961, 0xD7CC, 0x9686, 0xD7CD, 0x52D2, 0xD7CE, 0x808B, 0xD7CF, 0x51DC, 0xD7D0, 0x51CC, 0xD7D1, 0x695E, 0xD7D2, 0x7A1C, + 0xD7D3, 0x7DBE, 0xD7D4, 0x83F1, 0xD7D5, 0x9675, 0xD7D6, 0x4FDA, 0xD7D7, 0x5229, 0xD7D8, 0x5398, 0xD7D9, 0x540F, 0xD7DA, 0x550E, + 0xD7DB, 0x5C65, 0xD7DC, 0x60A7, 0xD7DD, 0x674E, 0xD7DE, 0x68A8, 0xD7DF, 0x6D6C, 0xD7E0, 0x7281, 0xD7E1, 0x72F8, 0xD7E2, 0x7406, + 0xD7E3, 0x7483, 0xD7E4, 0xF962, 0xD7E5, 0x75E2, 0xD7E6, 0x7C6C, 0xD7E7, 0x7F79, 0xD7E8, 0x7FB8, 0xD7E9, 0x8389, 0xD7EA, 0x88CF, + 0xD7EB, 0x88E1, 0xD7EC, 0x91CC, 0xD7ED, 0x91D0, 0xD7EE, 0x96E2, 0xD7EF, 0x9BC9, 0xD7F0, 0x541D, 0xD7F1, 0x6F7E, 0xD7F2, 0x71D0, + 0xD7F3, 0x7498, 0xD7F4, 0x85FA, 0xD7F5, 0x8EAA, 0xD7F6, 0x96A3, 0xD7F7, 0x9C57, 0xD7F8, 0x9E9F, 0xD7F9, 0x6797, 0xD7FA, 0x6DCB, + 0xD7FB, 0x7433, 0xD7FC, 0x81E8, 0xD7FD, 0x9716, 0xD7FE, 0x782C, 0xD8A1, 0x7ACB, 0xD8A2, 0x7B20, 0xD8A3, 0x7C92, 0xD8A4, 0x6469, + 0xD8A5, 0x746A, 0xD8A6, 0x75F2, 0xD8A7, 0x78BC, 0xD8A8, 0x78E8, 0xD8A9, 0x99AC, 0xD8AA, 0x9B54, 0xD8AB, 0x9EBB, 0xD8AC, 0x5BDE, + 0xD8AD, 0x5E55, 0xD8AE, 0x6F20, 0xD8AF, 0x819C, 0xD8B0, 0x83AB, 0xD8B1, 0x9088, 0xD8B2, 0x4E07, 0xD8B3, 0x534D, 0xD8B4, 0x5A29, + 0xD8B5, 0x5DD2, 0xD8B6, 0x5F4E, 0xD8B7, 0x6162, 0xD8B8, 0x633D, 0xD8B9, 0x6669, 0xD8BA, 0x66FC, 0xD8BB, 0x6EFF, 0xD8BC, 0x6F2B, + 0xD8BD, 0x7063, 0xD8BE, 0x779E, 0xD8BF, 0x842C, 0xD8C0, 0x8513, 0xD8C1, 0x883B, 0xD8C2, 0x8F13, 0xD8C3, 0x9945, 0xD8C4, 0x9C3B, + 0xD8C5, 0x551C, 0xD8C6, 0x62B9, 0xD8C7, 0x672B, 0xD8C8, 0x6CAB, 0xD8C9, 0x8309, 0xD8CA, 0x896A, 0xD8CB, 0x977A, 0xD8CC, 0x4EA1, + 0xD8CD, 0x5984, 0xD8CE, 0x5FD8, 0xD8CF, 0x5FD9, 0xD8D0, 0x671B, 0xD8D1, 0x7DB2, 0xD8D2, 0x7F54, 0xD8D3, 0x8292, 0xD8D4, 0x832B, + 0xD8D5, 0x83BD, 0xD8D6, 0x8F1E, 0xD8D7, 0x9099, 0xD8D8, 0x57CB, 0xD8D9, 0x59B9, 0xD8DA, 0x5A92, 0xD8DB, 0x5BD0, 0xD8DC, 0x6627, + 0xD8DD, 0x679A, 0xD8DE, 0x6885, 0xD8DF, 0x6BCF, 0xD8E0, 0x7164, 0xD8E1, 0x7F75, 0xD8E2, 0x8CB7, 0xD8E3, 0x8CE3, 0xD8E4, 0x9081, + 0xD8E5, 0x9B45, 0xD8E6, 0x8108, 0xD8E7, 0x8C8A, 0xD8E8, 0x964C, 0xD8E9, 0x9A40, 0xD8EA, 0x9EA5, 0xD8EB, 0x5B5F, 0xD8EC, 0x6C13, + 0xD8ED, 0x731B, 0xD8EE, 0x76F2, 0xD8EF, 0x76DF, 0xD8F0, 0x840C, 0xD8F1, 0x51AA, 0xD8F2, 0x8993, 0xD8F3, 0x514D, 0xD8F4, 0x5195, + 0xD8F5, 0x52C9, 0xD8F6, 0x68C9, 0xD8F7, 0x6C94, 0xD8F8, 0x7704, 0xD8F9, 0x7720, 0xD8FA, 0x7DBF, 0xD8FB, 0x7DEC, 0xD8FC, 0x9762, + 0xD8FD, 0x9EB5, 0xD8FE, 0x6EC5, 0xD9A1, 0x8511, 0xD9A2, 0x51A5, 0xD9A3, 0x540D, 0xD9A4, 0x547D, 0xD9A5, 0x660E, 0xD9A6, 0x669D, + 0xD9A7, 0x6927, 0xD9A8, 0x6E9F, 0xD9A9, 0x76BF, 0xD9AA, 0x7791, 0xD9AB, 0x8317, 0xD9AC, 0x84C2, 0xD9AD, 0x879F, 0xD9AE, 0x9169, + 0xD9AF, 0x9298, 0xD9B0, 0x9CF4, 0xD9B1, 0x8882, 0xD9B2, 0x4FAE, 0xD9B3, 0x5192, 0xD9B4, 0x52DF, 0xD9B5, 0x59C6, 0xD9B6, 0x5E3D, + 0xD9B7, 0x6155, 0xD9B8, 0x6478, 0xD9B9, 0x6479, 0xD9BA, 0x66AE, 0xD9BB, 0x67D0, 0xD9BC, 0x6A21, 0xD9BD, 0x6BCD, 0xD9BE, 0x6BDB, + 0xD9BF, 0x725F, 0xD9C0, 0x7261, 0xD9C1, 0x7441, 0xD9C2, 0x7738, 0xD9C3, 0x77DB, 0xD9C4, 0x8017, 0xD9C5, 0x82BC, 0xD9C6, 0x8305, + 0xD9C7, 0x8B00, 0xD9C8, 0x8B28, 0xD9C9, 0x8C8C, 0xD9CA, 0x6728, 0xD9CB, 0x6C90, 0xD9CC, 0x7267, 0xD9CD, 0x76EE, 0xD9CE, 0x7766, + 0xD9CF, 0x7A46, 0xD9D0, 0x9DA9, 0xD9D1, 0x6B7F, 0xD9D2, 0x6C92, 0xD9D3, 0x5922, 0xD9D4, 0x6726, 0xD9D5, 0x8499, 0xD9D6, 0x536F, + 0xD9D7, 0x5893, 0xD9D8, 0x5999, 0xD9D9, 0x5EDF, 0xD9DA, 0x63CF, 0xD9DB, 0x6634, 0xD9DC, 0x6773, 0xD9DD, 0x6E3A, 0xD9DE, 0x732B, + 0xD9DF, 0x7AD7, 0xD9E0, 0x82D7, 0xD9E1, 0x9328, 0xD9E2, 0x52D9, 0xD9E3, 0x5DEB, 0xD9E4, 0x61AE, 0xD9E5, 0x61CB, 0xD9E6, 0x620A, + 0xD9E7, 0x62C7, 0xD9E8, 0x64AB, 0xD9E9, 0x65E0, 0xD9EA, 0x6959, 0xD9EB, 0x6B66, 0xD9EC, 0x6BCB, 0xD9ED, 0x7121, 0xD9EE, 0x73F7, + 0xD9EF, 0x755D, 0xD9F0, 0x7E46, 0xD9F1, 0x821E, 0xD9F2, 0x8302, 0xD9F3, 0x856A, 0xD9F4, 0x8AA3, 0xD9F5, 0x8CBF, 0xD9F6, 0x9727, + 0xD9F7, 0x9D61, 0xD9F8, 0x58A8, 0xD9F9, 0x9ED8, 0xD9FA, 0x5011, 0xD9FB, 0x520E, 0xD9FC, 0x543B, 0xD9FD, 0x554F, 0xD9FE, 0x6587, + 0xDAA1, 0x6C76, 0xDAA2, 0x7D0A, 0xDAA3, 0x7D0B, 0xDAA4, 0x805E, 0xDAA5, 0x868A, 0xDAA6, 0x9580, 0xDAA7, 0x96EF, 0xDAA8, 0x52FF, + 0xDAA9, 0x6C95, 0xDAAA, 0x7269, 0xDAAB, 0x5473, 0xDAAC, 0x5A9A, 0xDAAD, 0x5C3E, 0xDAAE, 0x5D4B, 0xDAAF, 0x5F4C, 0xDAB0, 0x5FAE, + 0xDAB1, 0x672A, 0xDAB2, 0x68B6, 0xDAB3, 0x6963, 0xDAB4, 0x6E3C, 0xDAB5, 0x6E44, 0xDAB6, 0x7709, 0xDAB7, 0x7C73, 0xDAB8, 0x7F8E, + 0xDAB9, 0x8587, 0xDABA, 0x8B0E, 0xDABB, 0x8FF7, 0xDABC, 0x9761, 0xDABD, 0x9EF4, 0xDABE, 0x5CB7, 0xDABF, 0x60B6, 0xDAC0, 0x610D, + 0xDAC1, 0x61AB, 0xDAC2, 0x654F, 0xDAC3, 0x65FB, 0xDAC4, 0x65FC, 0xDAC5, 0x6C11, 0xDAC6, 0x6CEF, 0xDAC7, 0x739F, 0xDAC8, 0x73C9, + 0xDAC9, 0x7DE1, 0xDACA, 0x9594, 0xDACB, 0x5BC6, 0xDACC, 0x871C, 0xDACD, 0x8B10, 0xDACE, 0x525D, 0xDACF, 0x535A, 0xDAD0, 0x62CD, + 0xDAD1, 0x640F, 0xDAD2, 0x64B2, 0xDAD3, 0x6734, 0xDAD4, 0x6A38, 0xDAD5, 0x6CCA, 0xDAD6, 0x73C0, 0xDAD7, 0x749E, 0xDAD8, 0x7B94, + 0xDAD9, 0x7C95, 0xDADA, 0x7E1B, 0xDADB, 0x818A, 0xDADC, 0x8236, 0xDADD, 0x8584, 0xDADE, 0x8FEB, 0xDADF, 0x96F9, 0xDAE0, 0x99C1, + 0xDAE1, 0x4F34, 0xDAE2, 0x534A, 0xDAE3, 0x53CD, 0xDAE4, 0x53DB, 0xDAE5, 0x62CC, 0xDAE6, 0x642C, 0xDAE7, 0x6500, 0xDAE8, 0x6591, + 0xDAE9, 0x69C3, 0xDAEA, 0x6CEE, 0xDAEB, 0x6F58, 0xDAEC, 0x73ED, 0xDAED, 0x7554, 0xDAEE, 0x7622, 0xDAEF, 0x76E4, 0xDAF0, 0x76FC, + 0xDAF1, 0x78D0, 0xDAF2, 0x78FB, 0xDAF3, 0x792C, 0xDAF4, 0x7D46, 0xDAF5, 0x822C, 0xDAF6, 0x87E0, 0xDAF7, 0x8FD4, 0xDAF8, 0x9812, + 0xDAF9, 0x98EF, 0xDAFA, 0x52C3, 0xDAFB, 0x62D4, 0xDAFC, 0x64A5, 0xDAFD, 0x6E24, 0xDAFE, 0x6F51, 0xDBA1, 0x767C, 0xDBA2, 0x8DCB, + 0xDBA3, 0x91B1, 0xDBA4, 0x9262, 0xDBA5, 0x9AEE, 0xDBA6, 0x9B43, 0xDBA7, 0x5023, 0xDBA8, 0x508D, 0xDBA9, 0x574A, 0xDBAA, 0x59A8, + 0xDBAB, 0x5C28, 0xDBAC, 0x5E47, 0xDBAD, 0x5F77, 0xDBAE, 0x623F, 0xDBAF, 0x653E, 0xDBB0, 0x65B9, 0xDBB1, 0x65C1, 0xDBB2, 0x6609, + 0xDBB3, 0x678B, 0xDBB4, 0x699C, 0xDBB5, 0x6EC2, 0xDBB6, 0x78C5, 0xDBB7, 0x7D21, 0xDBB8, 0x80AA, 0xDBB9, 0x8180, 0xDBBA, 0x822B, + 0xDBBB, 0x82B3, 0xDBBC, 0x84A1, 0xDBBD, 0x868C, 0xDBBE, 0x8A2A, 0xDBBF, 0x8B17, 0xDBC0, 0x90A6, 0xDBC1, 0x9632, 0xDBC2, 0x9F90, + 0xDBC3, 0x500D, 0xDBC4, 0x4FF3, 0xDBC5, 0xF963, 0xDBC6, 0x57F9, 0xDBC7, 0x5F98, 0xDBC8, 0x62DC, 0xDBC9, 0x6392, 0xDBCA, 0x676F, + 0xDBCB, 0x6E43, 0xDBCC, 0x7119, 0xDBCD, 0x76C3, 0xDBCE, 0x80CC, 0xDBCF, 0x80DA, 0xDBD0, 0x88F4, 0xDBD1, 0x88F5, 0xDBD2, 0x8919, + 0xDBD3, 0x8CE0, 0xDBD4, 0x8F29, 0xDBD5, 0x914D, 0xDBD6, 0x966A, 0xDBD7, 0x4F2F, 0xDBD8, 0x4F70, 0xDBD9, 0x5E1B, 0xDBDA, 0x67CF, + 0xDBDB, 0x6822, 0xDBDC, 0x767D, 0xDBDD, 0x767E, 0xDBDE, 0x9B44, 0xDBDF, 0x5E61, 0xDBE0, 0x6A0A, 0xDBE1, 0x7169, 0xDBE2, 0x71D4, + 0xDBE3, 0x756A, 0xDBE4, 0xF964, 0xDBE5, 0x7E41, 0xDBE6, 0x8543, 0xDBE7, 0x85E9, 0xDBE8, 0x98DC, 0xDBE9, 0x4F10, 0xDBEA, 0x7B4F, + 0xDBEB, 0x7F70, 0xDBEC, 0x95A5, 0xDBED, 0x51E1, 0xDBEE, 0x5E06, 0xDBEF, 0x68B5, 0xDBF0, 0x6C3E, 0xDBF1, 0x6C4E, 0xDBF2, 0x6CDB, + 0xDBF3, 0x72AF, 0xDBF4, 0x7BC4, 0xDBF5, 0x8303, 0xDBF6, 0x6CD5, 0xDBF7, 0x743A, 0xDBF8, 0x50FB, 0xDBF9, 0x5288, 0xDBFA, 0x58C1, + 0xDBFB, 0x64D8, 0xDBFC, 0x6A97, 0xDBFD, 0x74A7, 0xDBFE, 0x7656, 0xDCA1, 0x78A7, 0xDCA2, 0x8617, 0xDCA3, 0x95E2, 0xDCA4, 0x9739, + 0xDCA5, 0xF965, 0xDCA6, 0x535E, 0xDCA7, 0x5F01, 0xDCA8, 0x8B8A, 0xDCA9, 0x8FA8, 0xDCAA, 0x8FAF, 0xDCAB, 0x908A, 0xDCAC, 0x5225, + 0xDCAD, 0x77A5, 0xDCAE, 0x9C49, 0xDCAF, 0x9F08, 0xDCB0, 0x4E19, 0xDCB1, 0x5002, 0xDCB2, 0x5175, 0xDCB3, 0x5C5B, 0xDCB4, 0x5E77, + 0xDCB5, 0x661E, 0xDCB6, 0x663A, 0xDCB7, 0x67C4, 0xDCB8, 0x68C5, 0xDCB9, 0x70B3, 0xDCBA, 0x7501, 0xDCBB, 0x75C5, 0xDCBC, 0x79C9, + 0xDCBD, 0x7ADD, 0xDCBE, 0x8F27, 0xDCBF, 0x9920, 0xDCC0, 0x9A08, 0xDCC1, 0x4FDD, 0xDCC2, 0x5821, 0xDCC3, 0x5831, 0xDCC4, 0x5BF6, + 0xDCC5, 0x666E, 0xDCC6, 0x6B65, 0xDCC7, 0x6D11, 0xDCC8, 0x6E7A, 0xDCC9, 0x6F7D, 0xDCCA, 0x73E4, 0xDCCB, 0x752B, 0xDCCC, 0x83E9, + 0xDCCD, 0x88DC, 0xDCCE, 0x8913, 0xDCCF, 0x8B5C, 0xDCD0, 0x8F14, 0xDCD1, 0x4F0F, 0xDCD2, 0x50D5, 0xDCD3, 0x5310, 0xDCD4, 0x535C, + 0xDCD5, 0x5B93, 0xDCD6, 0x5FA9, 0xDCD7, 0x670D, 0xDCD8, 0x798F, 0xDCD9, 0x8179, 0xDCDA, 0x832F, 0xDCDB, 0x8514, 0xDCDC, 0x8907, + 0xDCDD, 0x8986, 0xDCDE, 0x8F39, 0xDCDF, 0x8F3B, 0xDCE0, 0x99A5, 0xDCE1, 0x9C12, 0xDCE2, 0x672C, 0xDCE3, 0x4E76, 0xDCE4, 0x4FF8, + 0xDCE5, 0x5949, 0xDCE6, 0x5C01, 0xDCE7, 0x5CEF, 0xDCE8, 0x5CF0, 0xDCE9, 0x6367, 0xDCEA, 0x68D2, 0xDCEB, 0x70FD, 0xDCEC, 0x71A2, + 0xDCED, 0x742B, 0xDCEE, 0x7E2B, 0xDCEF, 0x84EC, 0xDCF0, 0x8702, 0xDCF1, 0x9022, 0xDCF2, 0x92D2, 0xDCF3, 0x9CF3, 0xDCF4, 0x4E0D, + 0xDCF5, 0x4ED8, 0xDCF6, 0x4FEF, 0xDCF7, 0x5085, 0xDCF8, 0x5256, 0xDCF9, 0x526F, 0xDCFA, 0x5426, 0xDCFB, 0x5490, 0xDCFC, 0x57E0, + 0xDCFD, 0x592B, 0xDCFE, 0x5A66, 0xDDA1, 0x5B5A, 0xDDA2, 0x5B75, 0xDDA3, 0x5BCC, 0xDDA4, 0x5E9C, 0xDDA5, 0xF966, 0xDDA6, 0x6276, + 0xDDA7, 0x6577, 0xDDA8, 0x65A7, 0xDDA9, 0x6D6E, 0xDDAA, 0x6EA5, 0xDDAB, 0x7236, 0xDDAC, 0x7B26, 0xDDAD, 0x7C3F, 0xDDAE, 0x7F36, + 0xDDAF, 0x8150, 0xDDB0, 0x8151, 0xDDB1, 0x819A, 0xDDB2, 0x8240, 0xDDB3, 0x8299, 0xDDB4, 0x83A9, 0xDDB5, 0x8A03, 0xDDB6, 0x8CA0, + 0xDDB7, 0x8CE6, 0xDDB8, 0x8CFB, 0xDDB9, 0x8D74, 0xDDBA, 0x8DBA, 0xDDBB, 0x90E8, 0xDDBC, 0x91DC, 0xDDBD, 0x961C, 0xDDBE, 0x9644, + 0xDDBF, 0x99D9, 0xDDC0, 0x9CE7, 0xDDC1, 0x5317, 0xDDC2, 0x5206, 0xDDC3, 0x5429, 0xDDC4, 0x5674, 0xDDC5, 0x58B3, 0xDDC6, 0x5954, + 0xDDC7, 0x596E, 0xDDC8, 0x5FFF, 0xDDC9, 0x61A4, 0xDDCA, 0x626E, 0xDDCB, 0x6610, 0xDDCC, 0x6C7E, 0xDDCD, 0x711A, 0xDDCE, 0x76C6, + 0xDDCF, 0x7C89, 0xDDD0, 0x7CDE, 0xDDD1, 0x7D1B, 0xDDD2, 0x82AC, 0xDDD3, 0x8CC1, 0xDDD4, 0x96F0, 0xDDD5, 0xF967, 0xDDD6, 0x4F5B, + 0xDDD7, 0x5F17, 0xDDD8, 0x5F7F, 0xDDD9, 0x62C2, 0xDDDA, 0x5D29, 0xDDDB, 0x670B, 0xDDDC, 0x68DA, 0xDDDD, 0x787C, 0xDDDE, 0x7E43, + 0xDDDF, 0x9D6C, 0xDDE0, 0x4E15, 0xDDE1, 0x5099, 0xDDE2, 0x5315, 0xDDE3, 0x532A, 0xDDE4, 0x5351, 0xDDE5, 0x5983, 0xDDE6, 0x5A62, + 0xDDE7, 0x5E87, 0xDDE8, 0x60B2, 0xDDE9, 0x618A, 0xDDEA, 0x6249, 0xDDEB, 0x6279, 0xDDEC, 0x6590, 0xDDED, 0x6787, 0xDDEE, 0x69A7, + 0xDDEF, 0x6BD4, 0xDDF0, 0x6BD6, 0xDDF1, 0x6BD7, 0xDDF2, 0x6BD8, 0xDDF3, 0x6CB8, 0xDDF4, 0xF968, 0xDDF5, 0x7435, 0xDDF6, 0x75FA, + 0xDDF7, 0x7812, 0xDDF8, 0x7891, 0xDDF9, 0x79D5, 0xDDFA, 0x79D8, 0xDDFB, 0x7C83, 0xDDFC, 0x7DCB, 0xDDFD, 0x7FE1, 0xDDFE, 0x80A5, + 0xDEA1, 0x813E, 0xDEA2, 0x81C2, 0xDEA3, 0x83F2, 0xDEA4, 0x871A, 0xDEA5, 0x88E8, 0xDEA6, 0x8AB9, 0xDEA7, 0x8B6C, 0xDEA8, 0x8CBB, + 0xDEA9, 0x9119, 0xDEAA, 0x975E, 0xDEAB, 0x98DB, 0xDEAC, 0x9F3B, 0xDEAD, 0x56AC, 0xDEAE, 0x5B2A, 0xDEAF, 0x5F6C, 0xDEB0, 0x658C, + 0xDEB1, 0x6AB3, 0xDEB2, 0x6BAF, 0xDEB3, 0x6D5C, 0xDEB4, 0x6FF1, 0xDEB5, 0x7015, 0xDEB6, 0x725D, 0xDEB7, 0x73AD, 0xDEB8, 0x8CA7, + 0xDEB9, 0x8CD3, 0xDEBA, 0x983B, 0xDEBB, 0x6191, 0xDEBC, 0x6C37, 0xDEBD, 0x8058, 0xDEBE, 0x9A01, 0xDEBF, 0x4E4D, 0xDEC0, 0x4E8B, + 0xDEC1, 0x4E9B, 0xDEC2, 0x4ED5, 0xDEC3, 0x4F3A, 0xDEC4, 0x4F3C, 0xDEC5, 0x4F7F, 0xDEC6, 0x4FDF, 0xDEC7, 0x50FF, 0xDEC8, 0x53F2, + 0xDEC9, 0x53F8, 0xDECA, 0x5506, 0xDECB, 0x55E3, 0xDECC, 0x56DB, 0xDECD, 0x58EB, 0xDECE, 0x5962, 0xDECF, 0x5A11, 0xDED0, 0x5BEB, + 0xDED1, 0x5BFA, 0xDED2, 0x5C04, 0xDED3, 0x5DF3, 0xDED4, 0x5E2B, 0xDED5, 0x5F99, 0xDED6, 0x601D, 0xDED7, 0x6368, 0xDED8, 0x659C, + 0xDED9, 0x65AF, 0xDEDA, 0x67F6, 0xDEDB, 0x67FB, 0xDEDC, 0x68AD, 0xDEDD, 0x6B7B, 0xDEDE, 0x6C99, 0xDEDF, 0x6CD7, 0xDEE0, 0x6E23, + 0xDEE1, 0x7009, 0xDEE2, 0x7345, 0xDEE3, 0x7802, 0xDEE4, 0x793E, 0xDEE5, 0x7940, 0xDEE6, 0x7960, 0xDEE7, 0x79C1, 0xDEE8, 0x7BE9, + 0xDEE9, 0x7D17, 0xDEEA, 0x7D72, 0xDEEB, 0x8086, 0xDEEC, 0x820D, 0xDEED, 0x838E, 0xDEEE, 0x84D1, 0xDEEF, 0x86C7, 0xDEF0, 0x88DF, + 0xDEF1, 0x8A50, 0xDEF2, 0x8A5E, 0xDEF3, 0x8B1D, 0xDEF4, 0x8CDC, 0xDEF5, 0x8D66, 0xDEF6, 0x8FAD, 0xDEF7, 0x90AA, 0xDEF8, 0x98FC, + 0xDEF9, 0x99DF, 0xDEFA, 0x9E9D, 0xDEFB, 0x524A, 0xDEFC, 0xF969, 0xDEFD, 0x6714, 0xDEFE, 0xF96A, 0xDFA1, 0x5098, 0xDFA2, 0x522A, + 0xDFA3, 0x5C71, 0xDFA4, 0x6563, 0xDFA5, 0x6C55, 0xDFA6, 0x73CA, 0xDFA7, 0x7523, 0xDFA8, 0x759D, 0xDFA9, 0x7B97, 0xDFAA, 0x849C, + 0xDFAB, 0x9178, 0xDFAC, 0x9730, 0xDFAD, 0x4E77, 0xDFAE, 0x6492, 0xDFAF, 0x6BBA, 0xDFB0, 0x715E, 0xDFB1, 0x85A9, 0xDFB2, 0x4E09, + 0xDFB3, 0xF96B, 0xDFB4, 0x6749, 0xDFB5, 0x68EE, 0xDFB6, 0x6E17, 0xDFB7, 0x829F, 0xDFB8, 0x8518, 0xDFB9, 0x886B, 0xDFBA, 0x63F7, + 0xDFBB, 0x6F81, 0xDFBC, 0x9212, 0xDFBD, 0x98AF, 0xDFBE, 0x4E0A, 0xDFBF, 0x50B7, 0xDFC0, 0x50CF, 0xDFC1, 0x511F, 0xDFC2, 0x5546, + 0xDFC3, 0x55AA, 0xDFC4, 0x5617, 0xDFC5, 0x5B40, 0xDFC6, 0x5C19, 0xDFC7, 0x5CE0, 0xDFC8, 0x5E38, 0xDFC9, 0x5E8A, 0xDFCA, 0x5EA0, + 0xDFCB, 0x5EC2, 0xDFCC, 0x60F3, 0xDFCD, 0x6851, 0xDFCE, 0x6A61, 0xDFCF, 0x6E58, 0xDFD0, 0x723D, 0xDFD1, 0x7240, 0xDFD2, 0x72C0, + 0xDFD3, 0x76F8, 0xDFD4, 0x7965, 0xDFD5, 0x7BB1, 0xDFD6, 0x7FD4, 0xDFD7, 0x88F3, 0xDFD8, 0x89F4, 0xDFD9, 0x8A73, 0xDFDA, 0x8C61, + 0xDFDB, 0x8CDE, 0xDFDC, 0x971C, 0xDFDD, 0x585E, 0xDFDE, 0x74BD, 0xDFDF, 0x8CFD, 0xDFE0, 0x55C7, 0xDFE1, 0xF96C, 0xDFE2, 0x7A61, + 0xDFE3, 0x7D22, 0xDFE4, 0x8272, 0xDFE5, 0x7272, 0xDFE6, 0x751F, 0xDFE7, 0x7525, 0xDFE8, 0xF96D, 0xDFE9, 0x7B19, 0xDFEA, 0x5885, + 0xDFEB, 0x58FB, 0xDFEC, 0x5DBC, 0xDFED, 0x5E8F, 0xDFEE, 0x5EB6, 0xDFEF, 0x5F90, 0xDFF0, 0x6055, 0xDFF1, 0x6292, 0xDFF2, 0x637F, + 0xDFF3, 0x654D, 0xDFF4, 0x6691, 0xDFF5, 0x66D9, 0xDFF6, 0x66F8, 0xDFF7, 0x6816, 0xDFF8, 0x68F2, 0xDFF9, 0x7280, 0xDFFA, 0x745E, + 0xDFFB, 0x7B6E, 0xDFFC, 0x7D6E, 0xDFFD, 0x7DD6, 0xDFFE, 0x7F72, 0xE0A1, 0x80E5, 0xE0A2, 0x8212, 0xE0A3, 0x85AF, 0xE0A4, 0x897F, + 0xE0A5, 0x8A93, 0xE0A6, 0x901D, 0xE0A7, 0x92E4, 0xE0A8, 0x9ECD, 0xE0A9, 0x9F20, 0xE0AA, 0x5915, 0xE0AB, 0x596D, 0xE0AC, 0x5E2D, + 0xE0AD, 0x60DC, 0xE0AE, 0x6614, 0xE0AF, 0x6673, 0xE0B0, 0x6790, 0xE0B1, 0x6C50, 0xE0B2, 0x6DC5, 0xE0B3, 0x6F5F, 0xE0B4, 0x77F3, + 0xE0B5, 0x78A9, 0xE0B6, 0x84C6, 0xE0B7, 0x91CB, 0xE0B8, 0x932B, 0xE0B9, 0x4ED9, 0xE0BA, 0x50CA, 0xE0BB, 0x5148, 0xE0BC, 0x5584, + 0xE0BD, 0x5B0B, 0xE0BE, 0x5BA3, 0xE0BF, 0x6247, 0xE0C0, 0x657E, 0xE0C1, 0x65CB, 0xE0C2, 0x6E32, 0xE0C3, 0x717D, 0xE0C4, 0x7401, + 0xE0C5, 0x7444, 0xE0C6, 0x7487, 0xE0C7, 0x74BF, 0xE0C8, 0x766C, 0xE0C9, 0x79AA, 0xE0CA, 0x7DDA, 0xE0CB, 0x7E55, 0xE0CC, 0x7FA8, + 0xE0CD, 0x817A, 0xE0CE, 0x81B3, 0xE0CF, 0x8239, 0xE0D0, 0x861A, 0xE0D1, 0x87EC, 0xE0D2, 0x8A75, 0xE0D3, 0x8DE3, 0xE0D4, 0x9078, + 0xE0D5, 0x9291, 0xE0D6, 0x9425, 0xE0D7, 0x994D, 0xE0D8, 0x9BAE, 0xE0D9, 0x5368, 0xE0DA, 0x5C51, 0xE0DB, 0x6954, 0xE0DC, 0x6CC4, + 0xE0DD, 0x6D29, 0xE0DE, 0x6E2B, 0xE0DF, 0x820C, 0xE0E0, 0x859B, 0xE0E1, 0x893B, 0xE0E2, 0x8A2D, 0xE0E3, 0x8AAA, 0xE0E4, 0x96EA, + 0xE0E5, 0x9F67, 0xE0E6, 0x5261, 0xE0E7, 0x66B9, 0xE0E8, 0x6BB2, 0xE0E9, 0x7E96, 0xE0EA, 0x87FE, 0xE0EB, 0x8D0D, 0xE0EC, 0x9583, + 0xE0ED, 0x965D, 0xE0EE, 0x651D, 0xE0EF, 0x6D89, 0xE0F0, 0x71EE, 0xE0F1, 0xF96E, 0xE0F2, 0x57CE, 0xE0F3, 0x59D3, 0xE0F4, 0x5BAC, + 0xE0F5, 0x6027, 0xE0F6, 0x60FA, 0xE0F7, 0x6210, 0xE0F8, 0x661F, 0xE0F9, 0x665F, 0xE0FA, 0x7329, 0xE0FB, 0x73F9, 0xE0FC, 0x76DB, + 0xE0FD, 0x7701, 0xE0FE, 0x7B6C, 0xE1A1, 0x8056, 0xE1A2, 0x8072, 0xE1A3, 0x8165, 0xE1A4, 0x8AA0, 0xE1A5, 0x9192, 0xE1A6, 0x4E16, + 0xE1A7, 0x52E2, 0xE1A8, 0x6B72, 0xE1A9, 0x6D17, 0xE1AA, 0x7A05, 0xE1AB, 0x7B39, 0xE1AC, 0x7D30, 0xE1AD, 0xF96F, 0xE1AE, 0x8CB0, + 0xE1AF, 0x53EC, 0xE1B0, 0x562F, 0xE1B1, 0x5851, 0xE1B2, 0x5BB5, 0xE1B3, 0x5C0F, 0xE1B4, 0x5C11, 0xE1B5, 0x5DE2, 0xE1B6, 0x6240, + 0xE1B7, 0x6383, 0xE1B8, 0x6414, 0xE1B9, 0x662D, 0xE1BA, 0x68B3, 0xE1BB, 0x6CBC, 0xE1BC, 0x6D88, 0xE1BD, 0x6EAF, 0xE1BE, 0x701F, + 0xE1BF, 0x70A4, 0xE1C0, 0x71D2, 0xE1C1, 0x7526, 0xE1C2, 0x758F, 0xE1C3, 0x758E, 0xE1C4, 0x7619, 0xE1C5, 0x7B11, 0xE1C6, 0x7BE0, + 0xE1C7, 0x7C2B, 0xE1C8, 0x7D20, 0xE1C9, 0x7D39, 0xE1CA, 0x852C, 0xE1CB, 0x856D, 0xE1CC, 0x8607, 0xE1CD, 0x8A34, 0xE1CE, 0x900D, + 0xE1CF, 0x9061, 0xE1D0, 0x90B5, 0xE1D1, 0x92B7, 0xE1D2, 0x97F6, 0xE1D3, 0x9A37, 0xE1D4, 0x4FD7, 0xE1D5, 0x5C6C, 0xE1D6, 0x675F, + 0xE1D7, 0x6D91, 0xE1D8, 0x7C9F, 0xE1D9, 0x7E8C, 0xE1DA, 0x8B16, 0xE1DB, 0x8D16, 0xE1DC, 0x901F, 0xE1DD, 0x5B6B, 0xE1DE, 0x5DFD, + 0xE1DF, 0x640D, 0xE1E0, 0x84C0, 0xE1E1, 0x905C, 0xE1E2, 0x98E1, 0xE1E3, 0x7387, 0xE1E4, 0x5B8B, 0xE1E5, 0x609A, 0xE1E6, 0x677E, + 0xE1E7, 0x6DDE, 0xE1E8, 0x8A1F, 0xE1E9, 0x8AA6, 0xE1EA, 0x9001, 0xE1EB, 0x980C, 0xE1EC, 0x5237, 0xE1ED, 0xF970, 0xE1EE, 0x7051, + 0xE1EF, 0x788E, 0xE1F0, 0x9396, 0xE1F1, 0x8870, 0xE1F2, 0x91D7, 0xE1F3, 0x4FEE, 0xE1F4, 0x53D7, 0xE1F5, 0x55FD, 0xE1F6, 0x56DA, + 0xE1F7, 0x5782, 0xE1F8, 0x58FD, 0xE1F9, 0x5AC2, 0xE1FA, 0x5B88, 0xE1FB, 0x5CAB, 0xE1FC, 0x5CC0, 0xE1FD, 0x5E25, 0xE1FE, 0x6101, + 0xE2A1, 0x620D, 0xE2A2, 0x624B, 0xE2A3, 0x6388, 0xE2A4, 0x641C, 0xE2A5, 0x6536, 0xE2A6, 0x6578, 0xE2A7, 0x6A39, 0xE2A8, 0x6B8A, + 0xE2A9, 0x6C34, 0xE2AA, 0x6D19, 0xE2AB, 0x6F31, 0xE2AC, 0x71E7, 0xE2AD, 0x72E9, 0xE2AE, 0x7378, 0xE2AF, 0x7407, 0xE2B0, 0x74B2, + 0xE2B1, 0x7626, 0xE2B2, 0x7761, 0xE2B3, 0x79C0, 0xE2B4, 0x7A57, 0xE2B5, 0x7AEA, 0xE2B6, 0x7CB9, 0xE2B7, 0x7D8F, 0xE2B8, 0x7DAC, + 0xE2B9, 0x7E61, 0xE2BA, 0x7F9E, 0xE2BB, 0x8129, 0xE2BC, 0x8331, 0xE2BD, 0x8490, 0xE2BE, 0x84DA, 0xE2BF, 0x85EA, 0xE2C0, 0x8896, + 0xE2C1, 0x8AB0, 0xE2C2, 0x8B90, 0xE2C3, 0x8F38, 0xE2C4, 0x9042, 0xE2C5, 0x9083, 0xE2C6, 0x916C, 0xE2C7, 0x9296, 0xE2C8, 0x92B9, + 0xE2C9, 0x968B, 0xE2CA, 0x96A7, 0xE2CB, 0x96A8, 0xE2CC, 0x96D6, 0xE2CD, 0x9700, 0xE2CE, 0x9808, 0xE2CF, 0x9996, 0xE2D0, 0x9AD3, + 0xE2D1, 0x9B1A, 0xE2D2, 0x53D4, 0xE2D3, 0x587E, 0xE2D4, 0x5919, 0xE2D5, 0x5B70, 0xE2D6, 0x5BBF, 0xE2D7, 0x6DD1, 0xE2D8, 0x6F5A, + 0xE2D9, 0x719F, 0xE2DA, 0x7421, 0xE2DB, 0x74B9, 0xE2DC, 0x8085, 0xE2DD, 0x83FD, 0xE2DE, 0x5DE1, 0xE2DF, 0x5F87, 0xE2E0, 0x5FAA, + 0xE2E1, 0x6042, 0xE2E2, 0x65EC, 0xE2E3, 0x6812, 0xE2E4, 0x696F, 0xE2E5, 0x6A53, 0xE2E6, 0x6B89, 0xE2E7, 0x6D35, 0xE2E8, 0x6DF3, + 0xE2E9, 0x73E3, 0xE2EA, 0x76FE, 0xE2EB, 0x77AC, 0xE2EC, 0x7B4D, 0xE2ED, 0x7D14, 0xE2EE, 0x8123, 0xE2EF, 0x821C, 0xE2F0, 0x8340, + 0xE2F1, 0x84F4, 0xE2F2, 0x8563, 0xE2F3, 0x8A62, 0xE2F4, 0x8AC4, 0xE2F5, 0x9187, 0xE2F6, 0x931E, 0xE2F7, 0x9806, 0xE2F8, 0x99B4, + 0xE2F9, 0x620C, 0xE2FA, 0x8853, 0xE2FB, 0x8FF0, 0xE2FC, 0x9265, 0xE2FD, 0x5D07, 0xE2FE, 0x5D27, 0xE3A1, 0x5D69, 0xE3A2, 0x745F, + 0xE3A3, 0x819D, 0xE3A4, 0x8768, 0xE3A5, 0x6FD5, 0xE3A6, 0x62FE, 0xE3A7, 0x7FD2, 0xE3A8, 0x8936, 0xE3A9, 0x8972, 0xE3AA, 0x4E1E, + 0xE3AB, 0x4E58, 0xE3AC, 0x50E7, 0xE3AD, 0x52DD, 0xE3AE, 0x5347, 0xE3AF, 0x627F, 0xE3B0, 0x6607, 0xE3B1, 0x7E69, 0xE3B2, 0x8805, + 0xE3B3, 0x965E, 0xE3B4, 0x4F8D, 0xE3B5, 0x5319, 0xE3B6, 0x5636, 0xE3B7, 0x59CB, 0xE3B8, 0x5AA4, 0xE3B9, 0x5C38, 0xE3BA, 0x5C4E, + 0xE3BB, 0x5C4D, 0xE3BC, 0x5E02, 0xE3BD, 0x5F11, 0xE3BE, 0x6043, 0xE3BF, 0x65BD, 0xE3C0, 0x662F, 0xE3C1, 0x6642, 0xE3C2, 0x67BE, + 0xE3C3, 0x67F4, 0xE3C4, 0x731C, 0xE3C5, 0x77E2, 0xE3C6, 0x793A, 0xE3C7, 0x7FC5, 0xE3C8, 0x8494, 0xE3C9, 0x84CD, 0xE3CA, 0x8996, + 0xE3CB, 0x8A66, 0xE3CC, 0x8A69, 0xE3CD, 0x8AE1, 0xE3CE, 0x8C55, 0xE3CF, 0x8C7A, 0xE3D0, 0x57F4, 0xE3D1, 0x5BD4, 0xE3D2, 0x5F0F, + 0xE3D3, 0x606F, 0xE3D4, 0x62ED, 0xE3D5, 0x690D, 0xE3D6, 0x6B96, 0xE3D7, 0x6E5C, 0xE3D8, 0x7184, 0xE3D9, 0x7BD2, 0xE3DA, 0x8755, + 0xE3DB, 0x8B58, 0xE3DC, 0x8EFE, 0xE3DD, 0x98DF, 0xE3DE, 0x98FE, 0xE3DF, 0x4F38, 0xE3E0, 0x4F81, 0xE3E1, 0x4FE1, 0xE3E2, 0x547B, + 0xE3E3, 0x5A20, 0xE3E4, 0x5BB8, 0xE3E5, 0x613C, 0xE3E6, 0x65B0, 0xE3E7, 0x6668, 0xE3E8, 0x71FC, 0xE3E9, 0x7533, 0xE3EA, 0x795E, + 0xE3EB, 0x7D33, 0xE3EC, 0x814E, 0xE3ED, 0x81E3, 0xE3EE, 0x8398, 0xE3EF, 0x85AA, 0xE3F0, 0x85CE, 0xE3F1, 0x8703, 0xE3F2, 0x8A0A, + 0xE3F3, 0x8EAB, 0xE3F4, 0x8F9B, 0xE3F5, 0xF971, 0xE3F6, 0x8FC5, 0xE3F7, 0x5931, 0xE3F8, 0x5BA4, 0xE3F9, 0x5BE6, 0xE3FA, 0x6089, + 0xE3FB, 0x5BE9, 0xE3FC, 0x5C0B, 0xE3FD, 0x5FC3, 0xE3FE, 0x6C81, 0xE4A1, 0xF972, 0xE4A2, 0x6DF1, 0xE4A3, 0x700B, 0xE4A4, 0x751A, + 0xE4A5, 0x82AF, 0xE4A6, 0x8AF6, 0xE4A7, 0x4EC0, 0xE4A8, 0x5341, 0xE4A9, 0xF973, 0xE4AA, 0x96D9, 0xE4AB, 0x6C0F, 0xE4AC, 0x4E9E, + 0xE4AD, 0x4FC4, 0xE4AE, 0x5152, 0xE4AF, 0x555E, 0xE4B0, 0x5A25, 0xE4B1, 0x5CE8, 0xE4B2, 0x6211, 0xE4B3, 0x7259, 0xE4B4, 0x82BD, + 0xE4B5, 0x83AA, 0xE4B6, 0x86FE, 0xE4B7, 0x8859, 0xE4B8, 0x8A1D, 0xE4B9, 0x963F, 0xE4BA, 0x96C5, 0xE4BB, 0x9913, 0xE4BC, 0x9D09, + 0xE4BD, 0x9D5D, 0xE4BE, 0x580A, 0xE4BF, 0x5CB3, 0xE4C0, 0x5DBD, 0xE4C1, 0x5E44, 0xE4C2, 0x60E1, 0xE4C3, 0x6115, 0xE4C4, 0x63E1, + 0xE4C5, 0x6A02, 0xE4C6, 0x6E25, 0xE4C7, 0x9102, 0xE4C8, 0x9354, 0xE4C9, 0x984E, 0xE4CA, 0x9C10, 0xE4CB, 0x9F77, 0xE4CC, 0x5B89, + 0xE4CD, 0x5CB8, 0xE4CE, 0x6309, 0xE4CF, 0x664F, 0xE4D0, 0x6848, 0xE4D1, 0x773C, 0xE4D2, 0x96C1, 0xE4D3, 0x978D, 0xE4D4, 0x9854, + 0xE4D5, 0x9B9F, 0xE4D6, 0x65A1, 0xE4D7, 0x8B01, 0xE4D8, 0x8ECB, 0xE4D9, 0x95BC, 0xE4DA, 0x5535, 0xE4DB, 0x5CA9, 0xE4DC, 0x5DD6, + 0xE4DD, 0x5EB5, 0xE4DE, 0x6697, 0xE4DF, 0x764C, 0xE4E0, 0x83F4, 0xE4E1, 0x95C7, 0xE4E2, 0x58D3, 0xE4E3, 0x62BC, 0xE4E4, 0x72CE, + 0xE4E5, 0x9D28, 0xE4E6, 0x4EF0, 0xE4E7, 0x592E, 0xE4E8, 0x600F, 0xE4E9, 0x663B, 0xE4EA, 0x6B83, 0xE4EB, 0x79E7, 0xE4EC, 0x9D26, + 0xE4ED, 0x5393, 0xE4EE, 0x54C0, 0xE4EF, 0x57C3, 0xE4F0, 0x5D16, 0xE4F1, 0x611B, 0xE4F2, 0x66D6, 0xE4F3, 0x6DAF, 0xE4F4, 0x788D, + 0xE4F5, 0x827E, 0xE4F6, 0x9698, 0xE4F7, 0x9744, 0xE4F8, 0x5384, 0xE4F9, 0x627C, 0xE4FA, 0x6396, 0xE4FB, 0x6DB2, 0xE4FC, 0x7E0A, + 0xE4FD, 0x814B, 0xE4FE, 0x984D, 0xE5A1, 0x6AFB, 0xE5A2, 0x7F4C, 0xE5A3, 0x9DAF, 0xE5A4, 0x9E1A, 0xE5A5, 0x4E5F, 0xE5A6, 0x503B, + 0xE5A7, 0x51B6, 0xE5A8, 0x591C, 0xE5A9, 0x60F9, 0xE5AA, 0x63F6, 0xE5AB, 0x6930, 0xE5AC, 0x723A, 0xE5AD, 0x8036, 0xE5AE, 0xF974, + 0xE5AF, 0x91CE, 0xE5B0, 0x5F31, 0xE5B1, 0xF975, 0xE5B2, 0xF976, 0xE5B3, 0x7D04, 0xE5B4, 0x82E5, 0xE5B5, 0x846F, 0xE5B6, 0x84BB, + 0xE5B7, 0x85E5, 0xE5B8, 0x8E8D, 0xE5B9, 0xF977, 0xE5BA, 0x4F6F, 0xE5BB, 0xF978, 0xE5BC, 0xF979, 0xE5BD, 0x58E4, 0xE5BE, 0x5B43, + 0xE5BF, 0x6059, 0xE5C0, 0x63DA, 0xE5C1, 0x6518, 0xE5C2, 0x656D, 0xE5C3, 0x6698, 0xE5C4, 0xF97A, 0xE5C5, 0x694A, 0xE5C6, 0x6A23, + 0xE5C7, 0x6D0B, 0xE5C8, 0x7001, 0xE5C9, 0x716C, 0xE5CA, 0x75D2, 0xE5CB, 0x760D, 0xE5CC, 0x79B3, 0xE5CD, 0x7A70, 0xE5CE, 0xF97B, + 0xE5CF, 0x7F8A, 0xE5D0, 0xF97C, 0xE5D1, 0x8944, 0xE5D2, 0xF97D, 0xE5D3, 0x8B93, 0xE5D4, 0x91C0, 0xE5D5, 0x967D, 0xE5D6, 0xF97E, + 0xE5D7, 0x990A, 0xE5D8, 0x5704, 0xE5D9, 0x5FA1, 0xE5DA, 0x65BC, 0xE5DB, 0x6F01, 0xE5DC, 0x7600, 0xE5DD, 0x79A6, 0xE5DE, 0x8A9E, + 0xE5DF, 0x99AD, 0xE5E0, 0x9B5A, 0xE5E1, 0x9F6C, 0xE5E2, 0x5104, 0xE5E3, 0x61B6, 0xE5E4, 0x6291, 0xE5E5, 0x6A8D, 0xE5E6, 0x81C6, + 0xE5E7, 0x5043, 0xE5E8, 0x5830, 0xE5E9, 0x5F66, 0xE5EA, 0x7109, 0xE5EB, 0x8A00, 0xE5EC, 0x8AFA, 0xE5ED, 0x5B7C, 0xE5EE, 0x8616, + 0xE5EF, 0x4FFA, 0xE5F0, 0x513C, 0xE5F1, 0x56B4, 0xE5F2, 0x5944, 0xE5F3, 0x63A9, 0xE5F4, 0x6DF9, 0xE5F5, 0x5DAA, 0xE5F6, 0x696D, + 0xE5F7, 0x5186, 0xE5F8, 0x4E88, 0xE5F9, 0x4F59, 0xE5FA, 0xF97F, 0xE5FB, 0xF980, 0xE5FC, 0xF981, 0xE5FD, 0x5982, 0xE5FE, 0xF982, + 0xE6A1, 0xF983, 0xE6A2, 0x6B5F, 0xE6A3, 0x6C5D, 0xE6A4, 0xF984, 0xE6A5, 0x74B5, 0xE6A6, 0x7916, 0xE6A7, 0xF985, 0xE6A8, 0x8207, + 0xE6A9, 0x8245, 0xE6AA, 0x8339, 0xE6AB, 0x8F3F, 0xE6AC, 0x8F5D, 0xE6AD, 0xF986, 0xE6AE, 0x9918, 0xE6AF, 0xF987, 0xE6B0, 0xF988, + 0xE6B1, 0xF989, 0xE6B2, 0x4EA6, 0xE6B3, 0xF98A, 0xE6B4, 0x57DF, 0xE6B5, 0x5F79, 0xE6B6, 0x6613, 0xE6B7, 0xF98B, 0xE6B8, 0xF98C, + 0xE6B9, 0x75AB, 0xE6BA, 0x7E79, 0xE6BB, 0x8B6F, 0xE6BC, 0xF98D, 0xE6BD, 0x9006, 0xE6BE, 0x9A5B, 0xE6BF, 0x56A5, 0xE6C0, 0x5827, + 0xE6C1, 0x59F8, 0xE6C2, 0x5A1F, 0xE6C3, 0x5BB4, 0xE6C4, 0xF98E, 0xE6C5, 0x5EF6, 0xE6C6, 0xF98F, 0xE6C7, 0xF990, 0xE6C8, 0x6350, + 0xE6C9, 0x633B, 0xE6CA, 0xF991, 0xE6CB, 0x693D, 0xE6CC, 0x6C87, 0xE6CD, 0x6CBF, 0xE6CE, 0x6D8E, 0xE6CF, 0x6D93, 0xE6D0, 0x6DF5, + 0xE6D1, 0x6F14, 0xE6D2, 0xF992, 0xE6D3, 0x70DF, 0xE6D4, 0x7136, 0xE6D5, 0x7159, 0xE6D6, 0xF993, 0xE6D7, 0x71C3, 0xE6D8, 0x71D5, + 0xE6D9, 0xF994, 0xE6DA, 0x784F, 0xE6DB, 0x786F, 0xE6DC, 0xF995, 0xE6DD, 0x7B75, 0xE6DE, 0x7DE3, 0xE6DF, 0xF996, 0xE6E0, 0x7E2F, + 0xE6E1, 0xF997, 0xE6E2, 0x884D, 0xE6E3, 0x8EDF, 0xE6E4, 0xF998, 0xE6E5, 0xF999, 0xE6E6, 0xF99A, 0xE6E7, 0x925B, 0xE6E8, 0xF99B, + 0xE6E9, 0x9CF6, 0xE6EA, 0xF99C, 0xE6EB, 0xF99D, 0xE6EC, 0xF99E, 0xE6ED, 0x6085, 0xE6EE, 0x6D85, 0xE6EF, 0xF99F, 0xE6F0, 0x71B1, + 0xE6F1, 0xF9A0, 0xE6F2, 0xF9A1, 0xE6F3, 0x95B1, 0xE6F4, 0x53AD, 0xE6F5, 0xF9A2, 0xE6F6, 0xF9A3, 0xE6F7, 0xF9A4, 0xE6F8, 0x67D3, + 0xE6F9, 0xF9A5, 0xE6FA, 0x708E, 0xE6FB, 0x7130, 0xE6FC, 0x7430, 0xE6FD, 0x8276, 0xE6FE, 0x82D2, 0xE7A1, 0xF9A6, 0xE7A2, 0x95BB, + 0xE7A3, 0x9AE5, 0xE7A4, 0x9E7D, 0xE7A5, 0x66C4, 0xE7A6, 0xF9A7, 0xE7A7, 0x71C1, 0xE7A8, 0x8449, 0xE7A9, 0xF9A8, 0xE7AA, 0xF9A9, + 0xE7AB, 0x584B, 0xE7AC, 0xF9AA, 0xE7AD, 0xF9AB, 0xE7AE, 0x5DB8, 0xE7AF, 0x5F71, 0xE7B0, 0xF9AC, 0xE7B1, 0x6620, 0xE7B2, 0x668E, + 0xE7B3, 0x6979, 0xE7B4, 0x69AE, 0xE7B5, 0x6C38, 0xE7B6, 0x6CF3, 0xE7B7, 0x6E36, 0xE7B8, 0x6F41, 0xE7B9, 0x6FDA, 0xE7BA, 0x701B, + 0xE7BB, 0x702F, 0xE7BC, 0x7150, 0xE7BD, 0x71DF, 0xE7BE, 0x7370, 0xE7BF, 0xF9AD, 0xE7C0, 0x745B, 0xE7C1, 0xF9AE, 0xE7C2, 0x74D4, + 0xE7C3, 0x76C8, 0xE7C4, 0x7A4E, 0xE7C5, 0x7E93, 0xE7C6, 0xF9AF, 0xE7C7, 0xF9B0, 0xE7C8, 0x82F1, 0xE7C9, 0x8A60, 0xE7CA, 0x8FCE, + 0xE7CB, 0xF9B1, 0xE7CC, 0x9348, 0xE7CD, 0xF9B2, 0xE7CE, 0x9719, 0xE7CF, 0xF9B3, 0xE7D0, 0xF9B4, 0xE7D1, 0x4E42, 0xE7D2, 0x502A, + 0xE7D3, 0xF9B5, 0xE7D4, 0x5208, 0xE7D5, 0x53E1, 0xE7D6, 0x66F3, 0xE7D7, 0x6C6D, 0xE7D8, 0x6FCA, 0xE7D9, 0x730A, 0xE7DA, 0x777F, + 0xE7DB, 0x7A62, 0xE7DC, 0x82AE, 0xE7DD, 0x85DD, 0xE7DE, 0x8602, 0xE7DF, 0xF9B6, 0xE7E0, 0x88D4, 0xE7E1, 0x8A63, 0xE7E2, 0x8B7D, + 0xE7E3, 0x8C6B, 0xE7E4, 0xF9B7, 0xE7E5, 0x92B3, 0xE7E6, 0xF9B8, 0xE7E7, 0x9713, 0xE7E8, 0x9810, 0xE7E9, 0x4E94, 0xE7EA, 0x4F0D, + 0xE7EB, 0x4FC9, 0xE7EC, 0x50B2, 0xE7ED, 0x5348, 0xE7EE, 0x543E, 0xE7EF, 0x5433, 0xE7F0, 0x55DA, 0xE7F1, 0x5862, 0xE7F2, 0x58BA, + 0xE7F3, 0x5967, 0xE7F4, 0x5A1B, 0xE7F5, 0x5BE4, 0xE7F6, 0x609F, 0xE7F7, 0xF9B9, 0xE7F8, 0x61CA, 0xE7F9, 0x6556, 0xE7FA, 0x65FF, + 0xE7FB, 0x6664, 0xE7FC, 0x68A7, 0xE7FD, 0x6C5A, 0xE7FE, 0x6FB3, 0xE8A1, 0x70CF, 0xE8A2, 0x71AC, 0xE8A3, 0x7352, 0xE8A4, 0x7B7D, + 0xE8A5, 0x8708, 0xE8A6, 0x8AA4, 0xE8A7, 0x9C32, 0xE8A8, 0x9F07, 0xE8A9, 0x5C4B, 0xE8AA, 0x6C83, 0xE8AB, 0x7344, 0xE8AC, 0x7389, + 0xE8AD, 0x923A, 0xE8AE, 0x6EAB, 0xE8AF, 0x7465, 0xE8B0, 0x761F, 0xE8B1, 0x7A69, 0xE8B2, 0x7E15, 0xE8B3, 0x860A, 0xE8B4, 0x5140, + 0xE8B5, 0x58C5, 0xE8B6, 0x64C1, 0xE8B7, 0x74EE, 0xE8B8, 0x7515, 0xE8B9, 0x7670, 0xE8BA, 0x7FC1, 0xE8BB, 0x9095, 0xE8BC, 0x96CD, + 0xE8BD, 0x9954, 0xE8BE, 0x6E26, 0xE8BF, 0x74E6, 0xE8C0, 0x7AA9, 0xE8C1, 0x7AAA, 0xE8C2, 0x81E5, 0xE8C3, 0x86D9, 0xE8C4, 0x8778, + 0xE8C5, 0x8A1B, 0xE8C6, 0x5A49, 0xE8C7, 0x5B8C, 0xE8C8, 0x5B9B, 0xE8C9, 0x68A1, 0xE8CA, 0x6900, 0xE8CB, 0x6D63, 0xE8CC, 0x73A9, + 0xE8CD, 0x7413, 0xE8CE, 0x742C, 0xE8CF, 0x7897, 0xE8D0, 0x7DE9, 0xE8D1, 0x7FEB, 0xE8D2, 0x8118, 0xE8D3, 0x8155, 0xE8D4, 0x839E, + 0xE8D5, 0x8C4C, 0xE8D6, 0x962E, 0xE8D7, 0x9811, 0xE8D8, 0x66F0, 0xE8D9, 0x5F80, 0xE8DA, 0x65FA, 0xE8DB, 0x6789, 0xE8DC, 0x6C6A, + 0xE8DD, 0x738B, 0xE8DE, 0x502D, 0xE8DF, 0x5A03, 0xE8E0, 0x6B6A, 0xE8E1, 0x77EE, 0xE8E2, 0x5916, 0xE8E3, 0x5D6C, 0xE8E4, 0x5DCD, + 0xE8E5, 0x7325, 0xE8E6, 0x754F, 0xE8E7, 0xF9BA, 0xE8E8, 0xF9BB, 0xE8E9, 0x50E5, 0xE8EA, 0x51F9, 0xE8EB, 0x582F, 0xE8EC, 0x592D, + 0xE8ED, 0x5996, 0xE8EE, 0x59DA, 0xE8EF, 0x5BE5, 0xE8F0, 0xF9BC, 0xE8F1, 0xF9BD, 0xE8F2, 0x5DA2, 0xE8F3, 0x62D7, 0xE8F4, 0x6416, + 0xE8F5, 0x6493, 0xE8F6, 0x64FE, 0xE8F7, 0xF9BE, 0xE8F8, 0x66DC, 0xE8F9, 0xF9BF, 0xE8FA, 0x6A48, 0xE8FB, 0xF9C0, 0xE8FC, 0x71FF, + 0xE8FD, 0x7464, 0xE8FE, 0xF9C1, 0xE9A1, 0x7A88, 0xE9A2, 0x7AAF, 0xE9A3, 0x7E47, 0xE9A4, 0x7E5E, 0xE9A5, 0x8000, 0xE9A6, 0x8170, + 0xE9A7, 0xF9C2, 0xE9A8, 0x87EF, 0xE9A9, 0x8981, 0xE9AA, 0x8B20, 0xE9AB, 0x9059, 0xE9AC, 0xF9C3, 0xE9AD, 0x9080, 0xE9AE, 0x9952, + 0xE9AF, 0x617E, 0xE9B0, 0x6B32, 0xE9B1, 0x6D74, 0xE9B2, 0x7E1F, 0xE9B3, 0x8925, 0xE9B4, 0x8FB1, 0xE9B5, 0x4FD1, 0xE9B6, 0x50AD, + 0xE9B7, 0x5197, 0xE9B8, 0x52C7, 0xE9B9, 0x57C7, 0xE9BA, 0x5889, 0xE9BB, 0x5BB9, 0xE9BC, 0x5EB8, 0xE9BD, 0x6142, 0xE9BE, 0x6995, + 0xE9BF, 0x6D8C, 0xE9C0, 0x6E67, 0xE9C1, 0x6EB6, 0xE9C2, 0x7194, 0xE9C3, 0x7462, 0xE9C4, 0x7528, 0xE9C5, 0x752C, 0xE9C6, 0x8073, + 0xE9C7, 0x8338, 0xE9C8, 0x84C9, 0xE9C9, 0x8E0A, 0xE9CA, 0x9394, 0xE9CB, 0x93DE, 0xE9CC, 0xF9C4, 0xE9CD, 0x4E8E, 0xE9CE, 0x4F51, + 0xE9CF, 0x5076, 0xE9D0, 0x512A, 0xE9D1, 0x53C8, 0xE9D2, 0x53CB, 0xE9D3, 0x53F3, 0xE9D4, 0x5B87, 0xE9D5, 0x5BD3, 0xE9D6, 0x5C24, + 0xE9D7, 0x611A, 0xE9D8, 0x6182, 0xE9D9, 0x65F4, 0xE9DA, 0x725B, 0xE9DB, 0x7397, 0xE9DC, 0x7440, 0xE9DD, 0x76C2, 0xE9DE, 0x7950, + 0xE9DF, 0x7991, 0xE9E0, 0x79B9, 0xE9E1, 0x7D06, 0xE9E2, 0x7FBD, 0xE9E3, 0x828B, 0xE9E4, 0x85D5, 0xE9E5, 0x865E, 0xE9E6, 0x8FC2, + 0xE9E7, 0x9047, 0xE9E8, 0x90F5, 0xE9E9, 0x91EA, 0xE9EA, 0x9685, 0xE9EB, 0x96E8, 0xE9EC, 0x96E9, 0xE9ED, 0x52D6, 0xE9EE, 0x5F67, + 0xE9EF, 0x65ED, 0xE9F0, 0x6631, 0xE9F1, 0x682F, 0xE9F2, 0x715C, 0xE9F3, 0x7A36, 0xE9F4, 0x90C1, 0xE9F5, 0x980A, 0xE9F6, 0x4E91, + 0xE9F7, 0xF9C5, 0xE9F8, 0x6A52, 0xE9F9, 0x6B9E, 0xE9FA, 0x6F90, 0xE9FB, 0x7189, 0xE9FC, 0x8018, 0xE9FD, 0x82B8, 0xE9FE, 0x8553, + 0xEAA1, 0x904B, 0xEAA2, 0x9695, 0xEAA3, 0x96F2, 0xEAA4, 0x97FB, 0xEAA5, 0x851A, 0xEAA6, 0x9B31, 0xEAA7, 0x4E90, 0xEAA8, 0x718A, + 0xEAA9, 0x96C4, 0xEAAA, 0x5143, 0xEAAB, 0x539F, 0xEAAC, 0x54E1, 0xEAAD, 0x5713, 0xEAAE, 0x5712, 0xEAAF, 0x57A3, 0xEAB0, 0x5A9B, + 0xEAB1, 0x5AC4, 0xEAB2, 0x5BC3, 0xEAB3, 0x6028, 0xEAB4, 0x613F, 0xEAB5, 0x63F4, 0xEAB6, 0x6C85, 0xEAB7, 0x6D39, 0xEAB8, 0x6E72, + 0xEAB9, 0x6E90, 0xEABA, 0x7230, 0xEABB, 0x733F, 0xEABC, 0x7457, 0xEABD, 0x82D1, 0xEABE, 0x8881, 0xEABF, 0x8F45, 0xEAC0, 0x9060, + 0xEAC1, 0xF9C6, 0xEAC2, 0x9662, 0xEAC3, 0x9858, 0xEAC4, 0x9D1B, 0xEAC5, 0x6708, 0xEAC6, 0x8D8A, 0xEAC7, 0x925E, 0xEAC8, 0x4F4D, + 0xEAC9, 0x5049, 0xEACA, 0x50DE, 0xEACB, 0x5371, 0xEACC, 0x570D, 0xEACD, 0x59D4, 0xEACE, 0x5A01, 0xEACF, 0x5C09, 0xEAD0, 0x6170, + 0xEAD1, 0x6690, 0xEAD2, 0x6E2D, 0xEAD3, 0x7232, 0xEAD4, 0x744B, 0xEAD5, 0x7DEF, 0xEAD6, 0x80C3, 0xEAD7, 0x840E, 0xEAD8, 0x8466, + 0xEAD9, 0x853F, 0xEADA, 0x875F, 0xEADB, 0x885B, 0xEADC, 0x8918, 0xEADD, 0x8B02, 0xEADE, 0x9055, 0xEADF, 0x97CB, 0xEAE0, 0x9B4F, + 0xEAE1, 0x4E73, 0xEAE2, 0x4F91, 0xEAE3, 0x5112, 0xEAE4, 0x516A, 0xEAE5, 0xF9C7, 0xEAE6, 0x552F, 0xEAE7, 0x55A9, 0xEAE8, 0x5B7A, + 0xEAE9, 0x5BA5, 0xEAEA, 0x5E7C, 0xEAEB, 0x5E7D, 0xEAEC, 0x5EBE, 0xEAED, 0x60A0, 0xEAEE, 0x60DF, 0xEAEF, 0x6108, 0xEAF0, 0x6109, + 0xEAF1, 0x63C4, 0xEAF2, 0x6538, 0xEAF3, 0x6709, 0xEAF4, 0xF9C8, 0xEAF5, 0x67D4, 0xEAF6, 0x67DA, 0xEAF7, 0xF9C9, 0xEAF8, 0x6961, + 0xEAF9, 0x6962, 0xEAFA, 0x6CB9, 0xEAFB, 0x6D27, 0xEAFC, 0xF9CA, 0xEAFD, 0x6E38, 0xEAFE, 0xF9CB, 0xEBA1, 0x6FE1, 0xEBA2, 0x7336, + 0xEBA3, 0x7337, 0xEBA4, 0xF9CC, 0xEBA5, 0x745C, 0xEBA6, 0x7531, 0xEBA7, 0xF9CD, 0xEBA8, 0x7652, 0xEBA9, 0xF9CE, 0xEBAA, 0xF9CF, + 0xEBAB, 0x7DAD, 0xEBAC, 0x81FE, 0xEBAD, 0x8438, 0xEBAE, 0x88D5, 0xEBAF, 0x8A98, 0xEBB0, 0x8ADB, 0xEBB1, 0x8AED, 0xEBB2, 0x8E30, + 0xEBB3, 0x8E42, 0xEBB4, 0x904A, 0xEBB5, 0x903E, 0xEBB6, 0x907A, 0xEBB7, 0x9149, 0xEBB8, 0x91C9, 0xEBB9, 0x936E, 0xEBBA, 0xF9D0, + 0xEBBB, 0xF9D1, 0xEBBC, 0x5809, 0xEBBD, 0xF9D2, 0xEBBE, 0x6BD3, 0xEBBF, 0x8089, 0xEBC0, 0x80B2, 0xEBC1, 0xF9D3, 0xEBC2, 0xF9D4, + 0xEBC3, 0x5141, 0xEBC4, 0x596B, 0xEBC5, 0x5C39, 0xEBC6, 0xF9D5, 0xEBC7, 0xF9D6, 0xEBC8, 0x6F64, 0xEBC9, 0x73A7, 0xEBCA, 0x80E4, + 0xEBCB, 0x8D07, 0xEBCC, 0xF9D7, 0xEBCD, 0x9217, 0xEBCE, 0x958F, 0xEBCF, 0xF9D8, 0xEBD0, 0xF9D9, 0xEBD1, 0xF9DA, 0xEBD2, 0xF9DB, + 0xEBD3, 0x807F, 0xEBD4, 0x620E, 0xEBD5, 0x701C, 0xEBD6, 0x7D68, 0xEBD7, 0x878D, 0xEBD8, 0xF9DC, 0xEBD9, 0x57A0, 0xEBDA, 0x6069, + 0xEBDB, 0x6147, 0xEBDC, 0x6BB7, 0xEBDD, 0x8ABE, 0xEBDE, 0x9280, 0xEBDF, 0x96B1, 0xEBE0, 0x4E59, 0xEBE1, 0x541F, 0xEBE2, 0x6DEB, + 0xEBE3, 0x852D, 0xEBE4, 0x9670, 0xEBE5, 0x97F3, 0xEBE6, 0x98EE, 0xEBE7, 0x63D6, 0xEBE8, 0x6CE3, 0xEBE9, 0x9091, 0xEBEA, 0x51DD, + 0xEBEB, 0x61C9, 0xEBEC, 0x81BA, 0xEBED, 0x9DF9, 0xEBEE, 0x4F9D, 0xEBEF, 0x501A, 0xEBF0, 0x5100, 0xEBF1, 0x5B9C, 0xEBF2, 0x610F, + 0xEBF3, 0x61FF, 0xEBF4, 0x64EC, 0xEBF5, 0x6905, 0xEBF6, 0x6BC5, 0xEBF7, 0x7591, 0xEBF8, 0x77E3, 0xEBF9, 0x7FA9, 0xEBFA, 0x8264, + 0xEBFB, 0x858F, 0xEBFC, 0x87FB, 0xEBFD, 0x8863, 0xEBFE, 0x8ABC, 0xECA1, 0x8B70, 0xECA2, 0x91AB, 0xECA3, 0x4E8C, 0xECA4, 0x4EE5, + 0xECA5, 0x4F0A, 0xECA6, 0xF9DD, 0xECA7, 0xF9DE, 0xECA8, 0x5937, 0xECA9, 0x59E8, 0xECAA, 0xF9DF, 0xECAB, 0x5DF2, 0xECAC, 0x5F1B, + 0xECAD, 0x5F5B, 0xECAE, 0x6021, 0xECAF, 0xF9E0, 0xECB0, 0xF9E1, 0xECB1, 0xF9E2, 0xECB2, 0xF9E3, 0xECB3, 0x723E, 0xECB4, 0x73E5, + 0xECB5, 0xF9E4, 0xECB6, 0x7570, 0xECB7, 0x75CD, 0xECB8, 0xF9E5, 0xECB9, 0x79FB, 0xECBA, 0xF9E6, 0xECBB, 0x800C, 0xECBC, 0x8033, + 0xECBD, 0x8084, 0xECBE, 0x82E1, 0xECBF, 0x8351, 0xECC0, 0xF9E7, 0xECC1, 0xF9E8, 0xECC2, 0x8CBD, 0xECC3, 0x8CB3, 0xECC4, 0x9087, + 0xECC5, 0xF9E9, 0xECC6, 0xF9EA, 0xECC7, 0x98F4, 0xECC8, 0x990C, 0xECC9, 0xF9EB, 0xECCA, 0xF9EC, 0xECCB, 0x7037, 0xECCC, 0x76CA, + 0xECCD, 0x7FCA, 0xECCE, 0x7FCC, 0xECCF, 0x7FFC, 0xECD0, 0x8B1A, 0xECD1, 0x4EBA, 0xECD2, 0x4EC1, 0xECD3, 0x5203, 0xECD4, 0x5370, + 0xECD5, 0xF9ED, 0xECD6, 0x54BD, 0xECD7, 0x56E0, 0xECD8, 0x59FB, 0xECD9, 0x5BC5, 0xECDA, 0x5F15, 0xECDB, 0x5FCD, 0xECDC, 0x6E6E, + 0xECDD, 0xF9EE, 0xECDE, 0xF9EF, 0xECDF, 0x7D6A, 0xECE0, 0x8335, 0xECE1, 0xF9F0, 0xECE2, 0x8693, 0xECE3, 0x8A8D, 0xECE4, 0xF9F1, + 0xECE5, 0x976D, 0xECE6, 0x9777, 0xECE7, 0xF9F2, 0xECE8, 0xF9F3, 0xECE9, 0x4E00, 0xECEA, 0x4F5A, 0xECEB, 0x4F7E, 0xECEC, 0x58F9, + 0xECED, 0x65E5, 0xECEE, 0x6EA2, 0xECEF, 0x9038, 0xECF0, 0x93B0, 0xECF1, 0x99B9, 0xECF2, 0x4EFB, 0xECF3, 0x58EC, 0xECF4, 0x598A, + 0xECF5, 0x59D9, 0xECF6, 0x6041, 0xECF7, 0xF9F4, 0xECF8, 0xF9F5, 0xECF9, 0x7A14, 0xECFA, 0xF9F6, 0xECFB, 0x834F, 0xECFC, 0x8CC3, + 0xECFD, 0x5165, 0xECFE, 0x5344, 0xEDA1, 0xF9F7, 0xEDA2, 0xF9F8, 0xEDA3, 0xF9F9, 0xEDA4, 0x4ECD, 0xEDA5, 0x5269, 0xEDA6, 0x5B55, + 0xEDA7, 0x82BF, 0xEDA8, 0x4ED4, 0xEDA9, 0x523A, 0xEDAA, 0x54A8, 0xEDAB, 0x59C9, 0xEDAC, 0x59FF, 0xEDAD, 0x5B50, 0xEDAE, 0x5B57, + 0xEDAF, 0x5B5C, 0xEDB0, 0x6063, 0xEDB1, 0x6148, 0xEDB2, 0x6ECB, 0xEDB3, 0x7099, 0xEDB4, 0x716E, 0xEDB5, 0x7386, 0xEDB6, 0x74F7, + 0xEDB7, 0x75B5, 0xEDB8, 0x78C1, 0xEDB9, 0x7D2B, 0xEDBA, 0x8005, 0xEDBB, 0x81EA, 0xEDBC, 0x8328, 0xEDBD, 0x8517, 0xEDBE, 0x85C9, + 0xEDBF, 0x8AEE, 0xEDC0, 0x8CC7, 0xEDC1, 0x96CC, 0xEDC2, 0x4F5C, 0xEDC3, 0x52FA, 0xEDC4, 0x56BC, 0xEDC5, 0x65AB, 0xEDC6, 0x6628, + 0xEDC7, 0x707C, 0xEDC8, 0x70B8, 0xEDC9, 0x7235, 0xEDCA, 0x7DBD, 0xEDCB, 0x828D, 0xEDCC, 0x914C, 0xEDCD, 0x96C0, 0xEDCE, 0x9D72, + 0xEDCF, 0x5B71, 0xEDD0, 0x68E7, 0xEDD1, 0x6B98, 0xEDD2, 0x6F7A, 0xEDD3, 0x76DE, 0xEDD4, 0x5C91, 0xEDD5, 0x66AB, 0xEDD6, 0x6F5B, + 0xEDD7, 0x7BB4, 0xEDD8, 0x7C2A, 0xEDD9, 0x8836, 0xEDDA, 0x96DC, 0xEDDB, 0x4E08, 0xEDDC, 0x4ED7, 0xEDDD, 0x5320, 0xEDDE, 0x5834, + 0xEDDF, 0x58BB, 0xEDE0, 0x58EF, 0xEDE1, 0x596C, 0xEDE2, 0x5C07, 0xEDE3, 0x5E33, 0xEDE4, 0x5E84, 0xEDE5, 0x5F35, 0xEDE6, 0x638C, + 0xEDE7, 0x66B2, 0xEDE8, 0x6756, 0xEDE9, 0x6A1F, 0xEDEA, 0x6AA3, 0xEDEB, 0x6B0C, 0xEDEC, 0x6F3F, 0xEDED, 0x7246, 0xEDEE, 0xF9FA, + 0xEDEF, 0x7350, 0xEDF0, 0x748B, 0xEDF1, 0x7AE0, 0xEDF2, 0x7CA7, 0xEDF3, 0x8178, 0xEDF4, 0x81DF, 0xEDF5, 0x81E7, 0xEDF6, 0x838A, + 0xEDF7, 0x846C, 0xEDF8, 0x8523, 0xEDF9, 0x8594, 0xEDFA, 0x85CF, 0xEDFB, 0x88DD, 0xEDFC, 0x8D13, 0xEDFD, 0x91AC, 0xEDFE, 0x9577, + 0xEEA1, 0x969C, 0xEEA2, 0x518D, 0xEEA3, 0x54C9, 0xEEA4, 0x5728, 0xEEA5, 0x5BB0, 0xEEA6, 0x624D, 0xEEA7, 0x6750, 0xEEA8, 0x683D, + 0xEEA9, 0x6893, 0xEEAA, 0x6E3D, 0xEEAB, 0x6ED3, 0xEEAC, 0x707D, 0xEEAD, 0x7E21, 0xEEAE, 0x88C1, 0xEEAF, 0x8CA1, 0xEEB0, 0x8F09, + 0xEEB1, 0x9F4B, 0xEEB2, 0x9F4E, 0xEEB3, 0x722D, 0xEEB4, 0x7B8F, 0xEEB5, 0x8ACD, 0xEEB6, 0x931A, 0xEEB7, 0x4F47, 0xEEB8, 0x4F4E, + 0xEEB9, 0x5132, 0xEEBA, 0x5480, 0xEEBB, 0x59D0, 0xEEBC, 0x5E95, 0xEEBD, 0x62B5, 0xEEBE, 0x6775, 0xEEBF, 0x696E, 0xEEC0, 0x6A17, + 0xEEC1, 0x6CAE, 0xEEC2, 0x6E1A, 0xEEC3, 0x72D9, 0xEEC4, 0x732A, 0xEEC5, 0x75BD, 0xEEC6, 0x7BB8, 0xEEC7, 0x7D35, 0xEEC8, 0x82E7, + 0xEEC9, 0x83F9, 0xEECA, 0x8457, 0xEECB, 0x85F7, 0xEECC, 0x8A5B, 0xEECD, 0x8CAF, 0xEECE, 0x8E87, 0xEECF, 0x9019, 0xEED0, 0x90B8, + 0xEED1, 0x96CE, 0xEED2, 0x9F5F, 0xEED3, 0x52E3, 0xEED4, 0x540A, 0xEED5, 0x5AE1, 0xEED6, 0x5BC2, 0xEED7, 0x6458, 0xEED8, 0x6575, + 0xEED9, 0x6EF4, 0xEEDA, 0x72C4, 0xEEDB, 0xF9FB, 0xEEDC, 0x7684, 0xEEDD, 0x7A4D, 0xEEDE, 0x7B1B, 0xEEDF, 0x7C4D, 0xEEE0, 0x7E3E, + 0xEEE1, 0x7FDF, 0xEEE2, 0x837B, 0xEEE3, 0x8B2B, 0xEEE4, 0x8CCA, 0xEEE5, 0x8D64, 0xEEE6, 0x8DE1, 0xEEE7, 0x8E5F, 0xEEE8, 0x8FEA, + 0xEEE9, 0x8FF9, 0xEEEA, 0x9069, 0xEEEB, 0x93D1, 0xEEEC, 0x4F43, 0xEEED, 0x4F7A, 0xEEEE, 0x50B3, 0xEEEF, 0x5168, 0xEEF0, 0x5178, + 0xEEF1, 0x524D, 0xEEF2, 0x526A, 0xEEF3, 0x5861, 0xEEF4, 0x587C, 0xEEF5, 0x5960, 0xEEF6, 0x5C08, 0xEEF7, 0x5C55, 0xEEF8, 0x5EDB, + 0xEEF9, 0x609B, 0xEEFA, 0x6230, 0xEEFB, 0x6813, 0xEEFC, 0x6BBF, 0xEEFD, 0x6C08, 0xEEFE, 0x6FB1, 0xEFA1, 0x714E, 0xEFA2, 0x7420, + 0xEFA3, 0x7530, 0xEFA4, 0x7538, 0xEFA5, 0x7551, 0xEFA6, 0x7672, 0xEFA7, 0x7B4C, 0xEFA8, 0x7B8B, 0xEFA9, 0x7BAD, 0xEFAA, 0x7BC6, + 0xEFAB, 0x7E8F, 0xEFAC, 0x8A6E, 0xEFAD, 0x8F3E, 0xEFAE, 0x8F49, 0xEFAF, 0x923F, 0xEFB0, 0x9293, 0xEFB1, 0x9322, 0xEFB2, 0x942B, + 0xEFB3, 0x96FB, 0xEFB4, 0x985A, 0xEFB5, 0x986B, 0xEFB6, 0x991E, 0xEFB7, 0x5207, 0xEFB8, 0x622A, 0xEFB9, 0x6298, 0xEFBA, 0x6D59, + 0xEFBB, 0x7664, 0xEFBC, 0x7ACA, 0xEFBD, 0x7BC0, 0xEFBE, 0x7D76, 0xEFBF, 0x5360, 0xEFC0, 0x5CBE, 0xEFC1, 0x5E97, 0xEFC2, 0x6F38, + 0xEFC3, 0x70B9, 0xEFC4, 0x7C98, 0xEFC5, 0x9711, 0xEFC6, 0x9B8E, 0xEFC7, 0x9EDE, 0xEFC8, 0x63A5, 0xEFC9, 0x647A, 0xEFCA, 0x8776, + 0xEFCB, 0x4E01, 0xEFCC, 0x4E95, 0xEFCD, 0x4EAD, 0xEFCE, 0x505C, 0xEFCF, 0x5075, 0xEFD0, 0x5448, 0xEFD1, 0x59C3, 0xEFD2, 0x5B9A, + 0xEFD3, 0x5E40, 0xEFD4, 0x5EAD, 0xEFD5, 0x5EF7, 0xEFD6, 0x5F81, 0xEFD7, 0x60C5, 0xEFD8, 0x633A, 0xEFD9, 0x653F, 0xEFDA, 0x6574, + 0xEFDB, 0x65CC, 0xEFDC, 0x6676, 0xEFDD, 0x6678, 0xEFDE, 0x67FE, 0xEFDF, 0x6968, 0xEFE0, 0x6A89, 0xEFE1, 0x6B63, 0xEFE2, 0x6C40, + 0xEFE3, 0x6DC0, 0xEFE4, 0x6DE8, 0xEFE5, 0x6E1F, 0xEFE6, 0x6E5E, 0xEFE7, 0x701E, 0xEFE8, 0x70A1, 0xEFE9, 0x738E, 0xEFEA, 0x73FD, + 0xEFEB, 0x753A, 0xEFEC, 0x775B, 0xEFED, 0x7887, 0xEFEE, 0x798E, 0xEFEF, 0x7A0B, 0xEFF0, 0x7A7D, 0xEFF1, 0x7CBE, 0xEFF2, 0x7D8E, + 0xEFF3, 0x8247, 0xEFF4, 0x8A02, 0xEFF5, 0x8AEA, 0xEFF6, 0x8C9E, 0xEFF7, 0x912D, 0xEFF8, 0x914A, 0xEFF9, 0x91D8, 0xEFFA, 0x9266, + 0xEFFB, 0x92CC, 0xEFFC, 0x9320, 0xEFFD, 0x9706, 0xEFFE, 0x9756, 0xF0A1, 0x975C, 0xF0A2, 0x9802, 0xF0A3, 0x9F0E, 0xF0A4, 0x5236, + 0xF0A5, 0x5291, 0xF0A6, 0x557C, 0xF0A7, 0x5824, 0xF0A8, 0x5E1D, 0xF0A9, 0x5F1F, 0xF0AA, 0x608C, 0xF0AB, 0x63D0, 0xF0AC, 0x68AF, + 0xF0AD, 0x6FDF, 0xF0AE, 0x796D, 0xF0AF, 0x7B2C, 0xF0B0, 0x81CD, 0xF0B1, 0x85BA, 0xF0B2, 0x88FD, 0xF0B3, 0x8AF8, 0xF0B4, 0x8E44, + 0xF0B5, 0x918D, 0xF0B6, 0x9664, 0xF0B7, 0x969B, 0xF0B8, 0x973D, 0xF0B9, 0x984C, 0xF0BA, 0x9F4A, 0xF0BB, 0x4FCE, 0xF0BC, 0x5146, + 0xF0BD, 0x51CB, 0xF0BE, 0x52A9, 0xF0BF, 0x5632, 0xF0C0, 0x5F14, 0xF0C1, 0x5F6B, 0xF0C2, 0x63AA, 0xF0C3, 0x64CD, 0xF0C4, 0x65E9, + 0xF0C5, 0x6641, 0xF0C6, 0x66FA, 0xF0C7, 0x66F9, 0xF0C8, 0x671D, 0xF0C9, 0x689D, 0xF0CA, 0x68D7, 0xF0CB, 0x69FD, 0xF0CC, 0x6F15, + 0xF0CD, 0x6F6E, 0xF0CE, 0x7167, 0xF0CF, 0x71E5, 0xF0D0, 0x722A, 0xF0D1, 0x74AA, 0xF0D2, 0x773A, 0xF0D3, 0x7956, 0xF0D4, 0x795A, + 0xF0D5, 0x79DF, 0xF0D6, 0x7A20, 0xF0D7, 0x7A95, 0xF0D8, 0x7C97, 0xF0D9, 0x7CDF, 0xF0DA, 0x7D44, 0xF0DB, 0x7E70, 0xF0DC, 0x8087, + 0xF0DD, 0x85FB, 0xF0DE, 0x86A4, 0xF0DF, 0x8A54, 0xF0E0, 0x8ABF, 0xF0E1, 0x8D99, 0xF0E2, 0x8E81, 0xF0E3, 0x9020, 0xF0E4, 0x906D, + 0xF0E5, 0x91E3, 0xF0E6, 0x963B, 0xF0E7, 0x96D5, 0xF0E8, 0x9CE5, 0xF0E9, 0x65CF, 0xF0EA, 0x7C07, 0xF0EB, 0x8DB3, 0xF0EC, 0x93C3, + 0xF0ED, 0x5B58, 0xF0EE, 0x5C0A, 0xF0EF, 0x5352, 0xF0F0, 0x62D9, 0xF0F1, 0x731D, 0xF0F2, 0x5027, 0xF0F3, 0x5B97, 0xF0F4, 0x5F9E, + 0xF0F5, 0x60B0, 0xF0F6, 0x616B, 0xF0F7, 0x68D5, 0xF0F8, 0x6DD9, 0xF0F9, 0x742E, 0xF0FA, 0x7A2E, 0xF0FB, 0x7D42, 0xF0FC, 0x7D9C, + 0xF0FD, 0x7E31, 0xF0FE, 0x816B, 0xF1A1, 0x8E2A, 0xF1A2, 0x8E35, 0xF1A3, 0x937E, 0xF1A4, 0x9418, 0xF1A5, 0x4F50, 0xF1A6, 0x5750, + 0xF1A7, 0x5DE6, 0xF1A8, 0x5EA7, 0xF1A9, 0x632B, 0xF1AA, 0x7F6A, 0xF1AB, 0x4E3B, 0xF1AC, 0x4F4F, 0xF1AD, 0x4F8F, 0xF1AE, 0x505A, + 0xF1AF, 0x59DD, 0xF1B0, 0x80C4, 0xF1B1, 0x546A, 0xF1B2, 0x5468, 0xF1B3, 0x55FE, 0xF1B4, 0x594F, 0xF1B5, 0x5B99, 0xF1B6, 0x5DDE, + 0xF1B7, 0x5EDA, 0xF1B8, 0x665D, 0xF1B9, 0x6731, 0xF1BA, 0x67F1, 0xF1BB, 0x682A, 0xF1BC, 0x6CE8, 0xF1BD, 0x6D32, 0xF1BE, 0x6E4A, + 0xF1BF, 0x6F8D, 0xF1C0, 0x70B7, 0xF1C1, 0x73E0, 0xF1C2, 0x7587, 0xF1C3, 0x7C4C, 0xF1C4, 0x7D02, 0xF1C5, 0x7D2C, 0xF1C6, 0x7DA2, + 0xF1C7, 0x821F, 0xF1C8, 0x86DB, 0xF1C9, 0x8A3B, 0xF1CA, 0x8A85, 0xF1CB, 0x8D70, 0xF1CC, 0x8E8A, 0xF1CD, 0x8F33, 0xF1CE, 0x9031, + 0xF1CF, 0x914E, 0xF1D0, 0x9152, 0xF1D1, 0x9444, 0xF1D2, 0x99D0, 0xF1D3, 0x7AF9, 0xF1D4, 0x7CA5, 0xF1D5, 0x4FCA, 0xF1D6, 0x5101, + 0xF1D7, 0x51C6, 0xF1D8, 0x57C8, 0xF1D9, 0x5BEF, 0xF1DA, 0x5CFB, 0xF1DB, 0x6659, 0xF1DC, 0x6A3D, 0xF1DD, 0x6D5A, 0xF1DE, 0x6E96, + 0xF1DF, 0x6FEC, 0xF1E0, 0x710C, 0xF1E1, 0x756F, 0xF1E2, 0x7AE3, 0xF1E3, 0x8822, 0xF1E4, 0x9021, 0xF1E5, 0x9075, 0xF1E6, 0x96CB, + 0xF1E7, 0x99FF, 0xF1E8, 0x8301, 0xF1E9, 0x4E2D, 0xF1EA, 0x4EF2, 0xF1EB, 0x8846, 0xF1EC, 0x91CD, 0xF1ED, 0x537D, 0xF1EE, 0x6ADB, + 0xF1EF, 0x696B, 0xF1F0, 0x6C41, 0xF1F1, 0x847A, 0xF1F2, 0x589E, 0xF1F3, 0x618E, 0xF1F4, 0x66FE, 0xF1F5, 0x62EF, 0xF1F6, 0x70DD, + 0xF1F7, 0x7511, 0xF1F8, 0x75C7, 0xF1F9, 0x7E52, 0xF1FA, 0x84B8, 0xF1FB, 0x8B49, 0xF1FC, 0x8D08, 0xF1FD, 0x4E4B, 0xF1FE, 0x53EA, + 0xF2A1, 0x54AB, 0xF2A2, 0x5730, 0xF2A3, 0x5740, 0xF2A4, 0x5FD7, 0xF2A5, 0x6301, 0xF2A6, 0x6307, 0xF2A7, 0x646F, 0xF2A8, 0x652F, + 0xF2A9, 0x65E8, 0xF2AA, 0x667A, 0xF2AB, 0x679D, 0xF2AC, 0x67B3, 0xF2AD, 0x6B62, 0xF2AE, 0x6C60, 0xF2AF, 0x6C9A, 0xF2B0, 0x6F2C, + 0xF2B1, 0x77E5, 0xF2B2, 0x7825, 0xF2B3, 0x7949, 0xF2B4, 0x7957, 0xF2B5, 0x7D19, 0xF2B6, 0x80A2, 0xF2B7, 0x8102, 0xF2B8, 0x81F3, + 0xF2B9, 0x829D, 0xF2BA, 0x82B7, 0xF2BB, 0x8718, 0xF2BC, 0x8A8C, 0xF2BD, 0xF9FC, 0xF2BE, 0x8D04, 0xF2BF, 0x8DBE, 0xF2C0, 0x9072, + 0xF2C1, 0x76F4, 0xF2C2, 0x7A19, 0xF2C3, 0x7A37, 0xF2C4, 0x7E54, 0xF2C5, 0x8077, 0xF2C6, 0x5507, 0xF2C7, 0x55D4, 0xF2C8, 0x5875, + 0xF2C9, 0x632F, 0xF2CA, 0x6422, 0xF2CB, 0x6649, 0xF2CC, 0x664B, 0xF2CD, 0x686D, 0xF2CE, 0x699B, 0xF2CF, 0x6B84, 0xF2D0, 0x6D25, + 0xF2D1, 0x6EB1, 0xF2D2, 0x73CD, 0xF2D3, 0x7468, 0xF2D4, 0x74A1, 0xF2D5, 0x755B, 0xF2D6, 0x75B9, 0xF2D7, 0x76E1, 0xF2D8, 0x771E, + 0xF2D9, 0x778B, 0xF2DA, 0x79E6, 0xF2DB, 0x7E09, 0xF2DC, 0x7E1D, 0xF2DD, 0x81FB, 0xF2DE, 0x852F, 0xF2DF, 0x8897, 0xF2E0, 0x8A3A, + 0xF2E1, 0x8CD1, 0xF2E2, 0x8EEB, 0xF2E3, 0x8FB0, 0xF2E4, 0x9032, 0xF2E5, 0x93AD, 0xF2E6, 0x9663, 0xF2E7, 0x9673, 0xF2E8, 0x9707, + 0xF2E9, 0x4F84, 0xF2EA, 0x53F1, 0xF2EB, 0x59EA, 0xF2EC, 0x5AC9, 0xF2ED, 0x5E19, 0xF2EE, 0x684E, 0xF2EF, 0x74C6, 0xF2F0, 0x75BE, + 0xF2F1, 0x79E9, 0xF2F2, 0x7A92, 0xF2F3, 0x81A3, 0xF2F4, 0x86ED, 0xF2F5, 0x8CEA, 0xF2F6, 0x8DCC, 0xF2F7, 0x8FED, 0xF2F8, 0x659F, + 0xF2F9, 0x6715, 0xF2FA, 0xF9FD, 0xF2FB, 0x57F7, 0xF2FC, 0x6F57, 0xF2FD, 0x7DDD, 0xF2FE, 0x8F2F, 0xF3A1, 0x93F6, 0xF3A2, 0x96C6, + 0xF3A3, 0x5FB5, 0xF3A4, 0x61F2, 0xF3A5, 0x6F84, 0xF3A6, 0x4E14, 0xF3A7, 0x4F98, 0xF3A8, 0x501F, 0xF3A9, 0x53C9, 0xF3AA, 0x55DF, + 0xF3AB, 0x5D6F, 0xF3AC, 0x5DEE, 0xF3AD, 0x6B21, 0xF3AE, 0x6B64, 0xF3AF, 0x78CB, 0xF3B0, 0x7B9A, 0xF3B1, 0xF9FE, 0xF3B2, 0x8E49, + 0xF3B3, 0x8ECA, 0xF3B4, 0x906E, 0xF3B5, 0x6349, 0xF3B6, 0x643E, 0xF3B7, 0x7740, 0xF3B8, 0x7A84, 0xF3B9, 0x932F, 0xF3BA, 0x947F, + 0xF3BB, 0x9F6A, 0xF3BC, 0x64B0, 0xF3BD, 0x6FAF, 0xF3BE, 0x71E6, 0xF3BF, 0x74A8, 0xF3C0, 0x74DA, 0xF3C1, 0x7AC4, 0xF3C2, 0x7C12, + 0xF3C3, 0x7E82, 0xF3C4, 0x7CB2, 0xF3C5, 0x7E98, 0xF3C6, 0x8B9A, 0xF3C7, 0x8D0A, 0xF3C8, 0x947D, 0xF3C9, 0x9910, 0xF3CA, 0x994C, + 0xF3CB, 0x5239, 0xF3CC, 0x5BDF, 0xF3CD, 0x64E6, 0xF3CE, 0x672D, 0xF3CF, 0x7D2E, 0xF3D0, 0x50ED, 0xF3D1, 0x53C3, 0xF3D2, 0x5879, + 0xF3D3, 0x6158, 0xF3D4, 0x6159, 0xF3D5, 0x61FA, 0xF3D6, 0x65AC, 0xF3D7, 0x7AD9, 0xF3D8, 0x8B92, 0xF3D9, 0x8B96, 0xF3DA, 0x5009, + 0xF3DB, 0x5021, 0xF3DC, 0x5275, 0xF3DD, 0x5531, 0xF3DE, 0x5A3C, 0xF3DF, 0x5EE0, 0xF3E0, 0x5F70, 0xF3E1, 0x6134, 0xF3E2, 0x655E, + 0xF3E3, 0x660C, 0xF3E4, 0x6636, 0xF3E5, 0x66A2, 0xF3E6, 0x69CD, 0xF3E7, 0x6EC4, 0xF3E8, 0x6F32, 0xF3E9, 0x7316, 0xF3EA, 0x7621, + 0xF3EB, 0x7A93, 0xF3EC, 0x8139, 0xF3ED, 0x8259, 0xF3EE, 0x83D6, 0xF3EF, 0x84BC, 0xF3F0, 0x50B5, 0xF3F1, 0x57F0, 0xF3F2, 0x5BC0, + 0xF3F3, 0x5BE8, 0xF3F4, 0x5F69, 0xF3F5, 0x63A1, 0xF3F6, 0x7826, 0xF3F7, 0x7DB5, 0xF3F8, 0x83DC, 0xF3F9, 0x8521, 0xF3FA, 0x91C7, + 0xF3FB, 0x91F5, 0xF3FC, 0x518A, 0xF3FD, 0x67F5, 0xF3FE, 0x7B56, 0xF4A1, 0x8CAC, 0xF4A2, 0x51C4, 0xF4A3, 0x59BB, 0xF4A4, 0x60BD, + 0xF4A5, 0x8655, 0xF4A6, 0x501C, 0xF4A7, 0xF9FF, 0xF4A8, 0x5254, 0xF4A9, 0x5C3A, 0xF4AA, 0x617D, 0xF4AB, 0x621A, 0xF4AC, 0x62D3, + 0xF4AD, 0x64F2, 0xF4AE, 0x65A5, 0xF4AF, 0x6ECC, 0xF4B0, 0x7620, 0xF4B1, 0x810A, 0xF4B2, 0x8E60, 0xF4B3, 0x965F, 0xF4B4, 0x96BB, + 0xF4B5, 0x4EDF, 0xF4B6, 0x5343, 0xF4B7, 0x5598, 0xF4B8, 0x5929, 0xF4B9, 0x5DDD, 0xF4BA, 0x64C5, 0xF4BB, 0x6CC9, 0xF4BC, 0x6DFA, + 0xF4BD, 0x7394, 0xF4BE, 0x7A7F, 0xF4BF, 0x821B, 0xF4C0, 0x85A6, 0xF4C1, 0x8CE4, 0xF4C2, 0x8E10, 0xF4C3, 0x9077, 0xF4C4, 0x91E7, + 0xF4C5, 0x95E1, 0xF4C6, 0x9621, 0xF4C7, 0x97C6, 0xF4C8, 0x51F8, 0xF4C9, 0x54F2, 0xF4CA, 0x5586, 0xF4CB, 0x5FB9, 0xF4CC, 0x64A4, + 0xF4CD, 0x6F88, 0xF4CE, 0x7DB4, 0xF4CF, 0x8F1F, 0xF4D0, 0x8F4D, 0xF4D1, 0x9435, 0xF4D2, 0x50C9, 0xF4D3, 0x5C16, 0xF4D4, 0x6CBE, + 0xF4D5, 0x6DFB, 0xF4D6, 0x751B, 0xF4D7, 0x77BB, 0xF4D8, 0x7C3D, 0xF4D9, 0x7C64, 0xF4DA, 0x8A79, 0xF4DB, 0x8AC2, 0xF4DC, 0x581E, + 0xF4DD, 0x59BE, 0xF4DE, 0x5E16, 0xF4DF, 0x6377, 0xF4E0, 0x7252, 0xF4E1, 0x758A, 0xF4E2, 0x776B, 0xF4E3, 0x8ADC, 0xF4E4, 0x8CBC, + 0xF4E5, 0x8F12, 0xF4E6, 0x5EF3, 0xF4E7, 0x6674, 0xF4E8, 0x6DF8, 0xF4E9, 0x807D, 0xF4EA, 0x83C1, 0xF4EB, 0x8ACB, 0xF4EC, 0x9751, + 0xF4ED, 0x9BD6, 0xF4EE, 0xFA00, 0xF4EF, 0x5243, 0xF4F0, 0x66FF, 0xF4F1, 0x6D95, 0xF4F2, 0x6EEF, 0xF4F3, 0x7DE0, 0xF4F4, 0x8AE6, + 0xF4F5, 0x902E, 0xF4F6, 0x905E, 0xF4F7, 0x9AD4, 0xF4F8, 0x521D, 0xF4F9, 0x527F, 0xF4FA, 0x54E8, 0xF4FB, 0x6194, 0xF4FC, 0x6284, + 0xF4FD, 0x62DB, 0xF4FE, 0x68A2, 0xF5A1, 0x6912, 0xF5A2, 0x695A, 0xF5A3, 0x6A35, 0xF5A4, 0x7092, 0xF5A5, 0x7126, 0xF5A6, 0x785D, + 0xF5A7, 0x7901, 0xF5A8, 0x790E, 0xF5A9, 0x79D2, 0xF5AA, 0x7A0D, 0xF5AB, 0x8096, 0xF5AC, 0x8278, 0xF5AD, 0x82D5, 0xF5AE, 0x8349, + 0xF5AF, 0x8549, 0xF5B0, 0x8C82, 0xF5B1, 0x8D85, 0xF5B2, 0x9162, 0xF5B3, 0x918B, 0xF5B4, 0x91AE, 0xF5B5, 0x4FC3, 0xF5B6, 0x56D1, + 0xF5B7, 0x71ED, 0xF5B8, 0x77D7, 0xF5B9, 0x8700, 0xF5BA, 0x89F8, 0xF5BB, 0x5BF8, 0xF5BC, 0x5FD6, 0xF5BD, 0x6751, 0xF5BE, 0x90A8, + 0xF5BF, 0x53E2, 0xF5C0, 0x585A, 0xF5C1, 0x5BF5, 0xF5C2, 0x60A4, 0xF5C3, 0x6181, 0xF5C4, 0x6460, 0xF5C5, 0x7E3D, 0xF5C6, 0x8070, + 0xF5C7, 0x8525, 0xF5C8, 0x9283, 0xF5C9, 0x64AE, 0xF5CA, 0x50AC, 0xF5CB, 0x5D14, 0xF5CC, 0x6700, 0xF5CD, 0x589C, 0xF5CE, 0x62BD, + 0xF5CF, 0x63A8, 0xF5D0, 0x690E, 0xF5D1, 0x6978, 0xF5D2, 0x6A1E, 0xF5D3, 0x6E6B, 0xF5D4, 0x76BA, 0xF5D5, 0x79CB, 0xF5D6, 0x82BB, + 0xF5D7, 0x8429, 0xF5D8, 0x8ACF, 0xF5D9, 0x8DA8, 0xF5DA, 0x8FFD, 0xF5DB, 0x9112, 0xF5DC, 0x914B, 0xF5DD, 0x919C, 0xF5DE, 0x9310, + 0xF5DF, 0x9318, 0xF5E0, 0x939A, 0xF5E1, 0x96DB, 0xF5E2, 0x9A36, 0xF5E3, 0x9C0D, 0xF5E4, 0x4E11, 0xF5E5, 0x755C, 0xF5E6, 0x795D, + 0xF5E7, 0x7AFA, 0xF5E8, 0x7B51, 0xF5E9, 0x7BC9, 0xF5EA, 0x7E2E, 0xF5EB, 0x84C4, 0xF5EC, 0x8E59, 0xF5ED, 0x8E74, 0xF5EE, 0x8EF8, + 0xF5EF, 0x9010, 0xF5F0, 0x6625, 0xF5F1, 0x693F, 0xF5F2, 0x7443, 0xF5F3, 0x51FA, 0xF5F4, 0x672E, 0xF5F5, 0x9EDC, 0xF5F6, 0x5145, + 0xF5F7, 0x5FE0, 0xF5F8, 0x6C96, 0xF5F9, 0x87F2, 0xF5FA, 0x885D, 0xF5FB, 0x8877, 0xF5FC, 0x60B4, 0xF5FD, 0x81B5, 0xF5FE, 0x8403, + 0xF6A1, 0x8D05, 0xF6A2, 0x53D6, 0xF6A3, 0x5439, 0xF6A4, 0x5634, 0xF6A5, 0x5A36, 0xF6A6, 0x5C31, 0xF6A7, 0x708A, 0xF6A8, 0x7FE0, + 0xF6A9, 0x805A, 0xF6AA, 0x8106, 0xF6AB, 0x81ED, 0xF6AC, 0x8DA3, 0xF6AD, 0x9189, 0xF6AE, 0x9A5F, 0xF6AF, 0x9DF2, 0xF6B0, 0x5074, + 0xF6B1, 0x4EC4, 0xF6B2, 0x53A0, 0xF6B3, 0x60FB, 0xF6B4, 0x6E2C, 0xF6B5, 0x5C64, 0xF6B6, 0x4F88, 0xF6B7, 0x5024, 0xF6B8, 0x55E4, + 0xF6B9, 0x5CD9, 0xF6BA, 0x5E5F, 0xF6BB, 0x6065, 0xF6BC, 0x6894, 0xF6BD, 0x6CBB, 0xF6BE, 0x6DC4, 0xF6BF, 0x71BE, 0xF6C0, 0x75D4, + 0xF6C1, 0x75F4, 0xF6C2, 0x7661, 0xF6C3, 0x7A1A, 0xF6C4, 0x7A49, 0xF6C5, 0x7DC7, 0xF6C6, 0x7DFB, 0xF6C7, 0x7F6E, 0xF6C8, 0x81F4, + 0xF6C9, 0x86A9, 0xF6CA, 0x8F1C, 0xF6CB, 0x96C9, 0xF6CC, 0x99B3, 0xF6CD, 0x9F52, 0xF6CE, 0x5247, 0xF6CF, 0x52C5, 0xF6D0, 0x98ED, + 0xF6D1, 0x89AA, 0xF6D2, 0x4E03, 0xF6D3, 0x67D2, 0xF6D4, 0x6F06, 0xF6D5, 0x4FB5, 0xF6D6, 0x5BE2, 0xF6D7, 0x6795, 0xF6D8, 0x6C88, + 0xF6D9, 0x6D78, 0xF6DA, 0x741B, 0xF6DB, 0x7827, 0xF6DC, 0x91DD, 0xF6DD, 0x937C, 0xF6DE, 0x87C4, 0xF6DF, 0x79E4, 0xF6E0, 0x7A31, + 0xF6E1, 0x5FEB, 0xF6E2, 0x4ED6, 0xF6E3, 0x54A4, 0xF6E4, 0x553E, 0xF6E5, 0x58AE, 0xF6E6, 0x59A5, 0xF6E7, 0x60F0, 0xF6E8, 0x6253, + 0xF6E9, 0x62D6, 0xF6EA, 0x6736, 0xF6EB, 0x6955, 0xF6EC, 0x8235, 0xF6ED, 0x9640, 0xF6EE, 0x99B1, 0xF6EF, 0x99DD, 0xF6F0, 0x502C, + 0xF6F1, 0x5353, 0xF6F2, 0x5544, 0xF6F3, 0x577C, 0xF6F4, 0xFA01, 0xF6F5, 0x6258, 0xF6F6, 0xFA02, 0xF6F7, 0x64E2, 0xF6F8, 0x666B, + 0xF6F9, 0x67DD, 0xF6FA, 0x6FC1, 0xF6FB, 0x6FEF, 0xF6FC, 0x7422, 0xF6FD, 0x7438, 0xF6FE, 0x8A17, 0xF7A1, 0x9438, 0xF7A2, 0x5451, + 0xF7A3, 0x5606, 0xF7A4, 0x5766, 0xF7A5, 0x5F48, 0xF7A6, 0x619A, 0xF7A7, 0x6B4E, 0xF7A8, 0x7058, 0xF7A9, 0x70AD, 0xF7AA, 0x7DBB, + 0xF7AB, 0x8A95, 0xF7AC, 0x596A, 0xF7AD, 0x812B, 0xF7AE, 0x63A2, 0xF7AF, 0x7708, 0xF7B0, 0x803D, 0xF7B1, 0x8CAA, 0xF7B2, 0x5854, + 0xF7B3, 0x642D, 0xF7B4, 0x69BB, 0xF7B5, 0x5B95, 0xF7B6, 0x5E11, 0xF7B7, 0x6E6F, 0xF7B8, 0xFA03, 0xF7B9, 0x8569, 0xF7BA, 0x514C, + 0xF7BB, 0x53F0, 0xF7BC, 0x592A, 0xF7BD, 0x6020, 0xF7BE, 0x614B, 0xF7BF, 0x6B86, 0xF7C0, 0x6C70, 0xF7C1, 0x6CF0, 0xF7C2, 0x7B1E, + 0xF7C3, 0x80CE, 0xF7C4, 0x82D4, 0xF7C5, 0x8DC6, 0xF7C6, 0x90B0, 0xF7C7, 0x98B1, 0xF7C8, 0xFA04, 0xF7C9, 0x64C7, 0xF7CA, 0x6FA4, + 0xF7CB, 0x6491, 0xF7CC, 0x6504, 0xF7CD, 0x514E, 0xF7CE, 0x5410, 0xF7CF, 0x571F, 0xF7D0, 0x8A0E, 0xF7D1, 0x615F, 0xF7D2, 0x6876, + 0xF7D3, 0xFA05, 0xF7D4, 0x75DB, 0xF7D5, 0x7B52, 0xF7D6, 0x7D71, 0xF7D7, 0x901A, 0xF7D8, 0x5806, 0xF7D9, 0x69CC, 0xF7DA, 0x817F, + 0xF7DB, 0x892A, 0xF7DC, 0x9000, 0xF7DD, 0x9839, 0xF7DE, 0x5078, 0xF7DF, 0x5957, 0xF7E0, 0x59AC, 0xF7E1, 0x6295, 0xF7E2, 0x900F, + 0xF7E3, 0x9B2A, 0xF7E4, 0x615D, 0xF7E5, 0x7279, 0xF7E6, 0x95D6, 0xF7E7, 0x5761, 0xF7E8, 0x5A46, 0xF7E9, 0x5DF4, 0xF7EA, 0x628A, + 0xF7EB, 0x64AD, 0xF7EC, 0x64FA, 0xF7ED, 0x6777, 0xF7EE, 0x6CE2, 0xF7EF, 0x6D3E, 0xF7F0, 0x722C, 0xF7F1, 0x7436, 0xF7F2, 0x7834, + 0xF7F3, 0x7F77, 0xF7F4, 0x82AD, 0xF7F5, 0x8DDB, 0xF7F6, 0x9817, 0xF7F7, 0x5224, 0xF7F8, 0x5742, 0xF7F9, 0x677F, 0xF7FA, 0x7248, + 0xF7FB, 0x74E3, 0xF7FC, 0x8CA9, 0xF7FD, 0x8FA6, 0xF7FE, 0x9211, 0xF8A1, 0x962A, 0xF8A2, 0x516B, 0xF8A3, 0x53ED, 0xF8A4, 0x634C, + 0xF8A5, 0x4F69, 0xF8A6, 0x5504, 0xF8A7, 0x6096, 0xF8A8, 0x6557, 0xF8A9, 0x6C9B, 0xF8AA, 0x6D7F, 0xF8AB, 0x724C, 0xF8AC, 0x72FD, + 0xF8AD, 0x7A17, 0xF8AE, 0x8987, 0xF8AF, 0x8C9D, 0xF8B0, 0x5F6D, 0xF8B1, 0x6F8E, 0xF8B2, 0x70F9, 0xF8B3, 0x81A8, 0xF8B4, 0x610E, + 0xF8B5, 0x4FBF, 0xF8B6, 0x504F, 0xF8B7, 0x6241, 0xF8B8, 0x7247, 0xF8B9, 0x7BC7, 0xF8BA, 0x7DE8, 0xF8BB, 0x7FE9, 0xF8BC, 0x904D, + 0xF8BD, 0x97AD, 0xF8BE, 0x9A19, 0xF8BF, 0x8CB6, 0xF8C0, 0x576A, 0xF8C1, 0x5E73, 0xF8C2, 0x67B0, 0xF8C3, 0x840D, 0xF8C4, 0x8A55, + 0xF8C5, 0x5420, 0xF8C6, 0x5B16, 0xF8C7, 0x5E63, 0xF8C8, 0x5EE2, 0xF8C9, 0x5F0A, 0xF8CA, 0x6583, 0xF8CB, 0x80BA, 0xF8CC, 0x853D, + 0xF8CD, 0x9589, 0xF8CE, 0x965B, 0xF8CF, 0x4F48, 0xF8D0, 0x5305, 0xF8D1, 0x530D, 0xF8D2, 0x530F, 0xF8D3, 0x5486, 0xF8D4, 0x54FA, + 0xF8D5, 0x5703, 0xF8D6, 0x5E03, 0xF8D7, 0x6016, 0xF8D8, 0x629B, 0xF8D9, 0x62B1, 0xF8DA, 0x6355, 0xF8DB, 0xFA06, 0xF8DC, 0x6CE1, + 0xF8DD, 0x6D66, 0xF8DE, 0x75B1, 0xF8DF, 0x7832, 0xF8E0, 0x80DE, 0xF8E1, 0x812F, 0xF8E2, 0x82DE, 0xF8E3, 0x8461, 0xF8E4, 0x84B2, + 0xF8E5, 0x888D, 0xF8E6, 0x8912, 0xF8E7, 0x900B, 0xF8E8, 0x92EA, 0xF8E9, 0x98FD, 0xF8EA, 0x9B91, 0xF8EB, 0x5E45, 0xF8EC, 0x66B4, + 0xF8ED, 0x66DD, 0xF8EE, 0x7011, 0xF8EF, 0x7206, 0xF8F0, 0xFA07, 0xF8F1, 0x4FF5, 0xF8F2, 0x527D, 0xF8F3, 0x5F6A, 0xF8F4, 0x6153, + 0xF8F5, 0x6753, 0xF8F6, 0x6A19, 0xF8F7, 0x6F02, 0xF8F8, 0x74E2, 0xF8F9, 0x7968, 0xF8FA, 0x8868, 0xF8FB, 0x8C79, 0xF8FC, 0x98C7, + 0xF8FD, 0x98C4, 0xF8FE, 0x9A43, 0xF9A1, 0x54C1, 0xF9A2, 0x7A1F, 0xF9A3, 0x6953, 0xF9A4, 0x8AF7, 0xF9A5, 0x8C4A, 0xF9A6, 0x98A8, + 0xF9A7, 0x99AE, 0xF9A8, 0x5F7C, 0xF9A9, 0x62AB, 0xF9AA, 0x75B2, 0xF9AB, 0x76AE, 0xF9AC, 0x88AB, 0xF9AD, 0x907F, 0xF9AE, 0x9642, + 0xF9AF, 0x5339, 0xF9B0, 0x5F3C, 0xF9B1, 0x5FC5, 0xF9B2, 0x6CCC, 0xF9B3, 0x73CC, 0xF9B4, 0x7562, 0xF9B5, 0x758B, 0xF9B6, 0x7B46, + 0xF9B7, 0x82FE, 0xF9B8, 0x999D, 0xF9B9, 0x4E4F, 0xF9BA, 0x903C, 0xF9BB, 0x4E0B, 0xF9BC, 0x4F55, 0xF9BD, 0x53A6, 0xF9BE, 0x590F, + 0xF9BF, 0x5EC8, 0xF9C0, 0x6630, 0xF9C1, 0x6CB3, 0xF9C2, 0x7455, 0xF9C3, 0x8377, 0xF9C4, 0x8766, 0xF9C5, 0x8CC0, 0xF9C6, 0x9050, + 0xF9C7, 0x971E, 0xF9C8, 0x9C15, 0xF9C9, 0x58D1, 0xF9CA, 0x5B78, 0xF9CB, 0x8650, 0xF9CC, 0x8B14, 0xF9CD, 0x9DB4, 0xF9CE, 0x5BD2, + 0xF9CF, 0x6068, 0xF9D0, 0x608D, 0xF9D1, 0x65F1, 0xF9D2, 0x6C57, 0xF9D3, 0x6F22, 0xF9D4, 0x6FA3, 0xF9D5, 0x701A, 0xF9D6, 0x7F55, + 0xF9D7, 0x7FF0, 0xF9D8, 0x9591, 0xF9D9, 0x9592, 0xF9DA, 0x9650, 0xF9DB, 0x97D3, 0xF9DC, 0x5272, 0xF9DD, 0x8F44, 0xF9DE, 0x51FD, + 0xF9DF, 0x542B, 0xF9E0, 0x54B8, 0xF9E1, 0x5563, 0xF9E2, 0x558A, 0xF9E3, 0x6ABB, 0xF9E4, 0x6DB5, 0xF9E5, 0x7DD8, 0xF9E6, 0x8266, + 0xF9E7, 0x929C, 0xF9E8, 0x9677, 0xF9E9, 0x9E79, 0xF9EA, 0x5408, 0xF9EB, 0x54C8, 0xF9EC, 0x76D2, 0xF9ED, 0x86E4, 0xF9EE, 0x95A4, + 0xF9EF, 0x95D4, 0xF9F0, 0x965C, 0xF9F1, 0x4EA2, 0xF9F2, 0x4F09, 0xF9F3, 0x59EE, 0xF9F4, 0x5AE6, 0xF9F5, 0x5DF7, 0xF9F6, 0x6052, + 0xF9F7, 0x6297, 0xF9F8, 0x676D, 0xF9F9, 0x6841, 0xF9FA, 0x6C86, 0xF9FB, 0x6E2F, 0xF9FC, 0x7F38, 0xF9FD, 0x809B, 0xF9FE, 0x822A, + 0xFAA1, 0xFA08, 0xFAA2, 0xFA09, 0xFAA3, 0x9805, 0xFAA4, 0x4EA5, 0xFAA5, 0x5055, 0xFAA6, 0x54B3, 0xFAA7, 0x5793, 0xFAA8, 0x595A, + 0xFAA9, 0x5B69, 0xFAAA, 0x5BB3, 0xFAAB, 0x61C8, 0xFAAC, 0x6977, 0xFAAD, 0x6D77, 0xFAAE, 0x7023, 0xFAAF, 0x87F9, 0xFAB0, 0x89E3, + 0xFAB1, 0x8A72, 0xFAB2, 0x8AE7, 0xFAB3, 0x9082, 0xFAB4, 0x99ED, 0xFAB5, 0x9AB8, 0xFAB6, 0x52BE, 0xFAB7, 0x6838, 0xFAB8, 0x5016, + 0xFAB9, 0x5E78, 0xFABA, 0x674F, 0xFABB, 0x8347, 0xFABC, 0x884C, 0xFABD, 0x4EAB, 0xFABE, 0x5411, 0xFABF, 0x56AE, 0xFAC0, 0x73E6, + 0xFAC1, 0x9115, 0xFAC2, 0x97FF, 0xFAC3, 0x9909, 0xFAC4, 0x9957, 0xFAC5, 0x9999, 0xFAC6, 0x5653, 0xFAC7, 0x589F, 0xFAC8, 0x865B, + 0xFAC9, 0x8A31, 0xFACA, 0x61B2, 0xFACB, 0x6AF6, 0xFACC, 0x737B, 0xFACD, 0x8ED2, 0xFACE, 0x6B47, 0xFACF, 0x96AA, 0xFAD0, 0x9A57, + 0xFAD1, 0x5955, 0xFAD2, 0x7200, 0xFAD3, 0x8D6B, 0xFAD4, 0x9769, 0xFAD5, 0x4FD4, 0xFAD6, 0x5CF4, 0xFAD7, 0x5F26, 0xFAD8, 0x61F8, + 0xFAD9, 0x665B, 0xFADA, 0x6CEB, 0xFADB, 0x70AB, 0xFADC, 0x7384, 0xFADD, 0x73B9, 0xFADE, 0x73FE, 0xFADF, 0x7729, 0xFAE0, 0x774D, + 0xFAE1, 0x7D43, 0xFAE2, 0x7D62, 0xFAE3, 0x7E23, 0xFAE4, 0x8237, 0xFAE5, 0x8852, 0xFAE6, 0xFA0A, 0xFAE7, 0x8CE2, 0xFAE8, 0x9249, + 0xFAE9, 0x986F, 0xFAEA, 0x5B51, 0xFAEB, 0x7A74, 0xFAEC, 0x8840, 0xFAED, 0x9801, 0xFAEE, 0x5ACC, 0xFAEF, 0x4FE0, 0xFAF0, 0x5354, + 0xFAF1, 0x593E, 0xFAF2, 0x5CFD, 0xFAF3, 0x633E, 0xFAF4, 0x6D79, 0xFAF5, 0x72F9, 0xFAF6, 0x8105, 0xFAF7, 0x8107, 0xFAF8, 0x83A2, + 0xFAF9, 0x92CF, 0xFAFA, 0x9830, 0xFAFB, 0x4EA8, 0xFAFC, 0x5144, 0xFAFD, 0x5211, 0xFAFE, 0x578B, 0xFBA1, 0x5F62, 0xFBA2, 0x6CC2, + 0xFBA3, 0x6ECE, 0xFBA4, 0x7005, 0xFBA5, 0x7050, 0xFBA6, 0x70AF, 0xFBA7, 0x7192, 0xFBA8, 0x73E9, 0xFBA9, 0x7469, 0xFBAA, 0x834A, + 0xFBAB, 0x87A2, 0xFBAC, 0x8861, 0xFBAD, 0x9008, 0xFBAE, 0x90A2, 0xFBAF, 0x93A3, 0xFBB0, 0x99A8, 0xFBB1, 0x516E, 0xFBB2, 0x5F57, + 0xFBB3, 0x60E0, 0xFBB4, 0x6167, 0xFBB5, 0x66B3, 0xFBB6, 0x8559, 0xFBB7, 0x8E4A, 0xFBB8, 0x91AF, 0xFBB9, 0x978B, 0xFBBA, 0x4E4E, + 0xFBBB, 0x4E92, 0xFBBC, 0x547C, 0xFBBD, 0x58D5, 0xFBBE, 0x58FA, 0xFBBF, 0x597D, 0xFBC0, 0x5CB5, 0xFBC1, 0x5F27, 0xFBC2, 0x6236, + 0xFBC3, 0x6248, 0xFBC4, 0x660A, 0xFBC5, 0x6667, 0xFBC6, 0x6BEB, 0xFBC7, 0x6D69, 0xFBC8, 0x6DCF, 0xFBC9, 0x6E56, 0xFBCA, 0x6EF8, + 0xFBCB, 0x6F94, 0xFBCC, 0x6FE0, 0xFBCD, 0x6FE9, 0xFBCE, 0x705D, 0xFBCF, 0x72D0, 0xFBD0, 0x7425, 0xFBD1, 0x745A, 0xFBD2, 0x74E0, + 0xFBD3, 0x7693, 0xFBD4, 0x795C, 0xFBD5, 0x7CCA, 0xFBD6, 0x7E1E, 0xFBD7, 0x80E1, 0xFBD8, 0x82A6, 0xFBD9, 0x846B, 0xFBDA, 0x84BF, + 0xFBDB, 0x864E, 0xFBDC, 0x865F, 0xFBDD, 0x8774, 0xFBDE, 0x8B77, 0xFBDF, 0x8C6A, 0xFBE0, 0x93AC, 0xFBE1, 0x9800, 0xFBE2, 0x9865, + 0xFBE3, 0x60D1, 0xFBE4, 0x6216, 0xFBE5, 0x9177, 0xFBE6, 0x5A5A, 0xFBE7, 0x660F, 0xFBE8, 0x6DF7, 0xFBE9, 0x6E3E, 0xFBEA, 0x743F, + 0xFBEB, 0x9B42, 0xFBEC, 0x5FFD, 0xFBED, 0x60DA, 0xFBEE, 0x7B0F, 0xFBEF, 0x54C4, 0xFBF0, 0x5F18, 0xFBF1, 0x6C5E, 0xFBF2, 0x6CD3, + 0xFBF3, 0x6D2A, 0xFBF4, 0x70D8, 0xFBF5, 0x7D05, 0xFBF6, 0x8679, 0xFBF7, 0x8A0C, 0xFBF8, 0x9D3B, 0xFBF9, 0x5316, 0xFBFA, 0x548C, + 0xFBFB, 0x5B05, 0xFBFC, 0x6A3A, 0xFBFD, 0x706B, 0xFBFE, 0x7575, 0xFCA1, 0x798D, 0xFCA2, 0x79BE, 0xFCA3, 0x82B1, 0xFCA4, 0x83EF, + 0xFCA5, 0x8A71, 0xFCA6, 0x8B41, 0xFCA7, 0x8CA8, 0xFCA8, 0x9774, 0xFCA9, 0xFA0B, 0xFCAA, 0x64F4, 0xFCAB, 0x652B, 0xFCAC, 0x78BA, + 0xFCAD, 0x78BB, 0xFCAE, 0x7A6B, 0xFCAF, 0x4E38, 0xFCB0, 0x559A, 0xFCB1, 0x5950, 0xFCB2, 0x5BA6, 0xFCB3, 0x5E7B, 0xFCB4, 0x60A3, + 0xFCB5, 0x63DB, 0xFCB6, 0x6B61, 0xFCB7, 0x6665, 0xFCB8, 0x6853, 0xFCB9, 0x6E19, 0xFCBA, 0x7165, 0xFCBB, 0x74B0, 0xFCBC, 0x7D08, + 0xFCBD, 0x9084, 0xFCBE, 0x9A69, 0xFCBF, 0x9C25, 0xFCC0, 0x6D3B, 0xFCC1, 0x6ED1, 0xFCC2, 0x733E, 0xFCC3, 0x8C41, 0xFCC4, 0x95CA, + 0xFCC5, 0x51F0, 0xFCC6, 0x5E4C, 0xFCC7, 0x5FA8, 0xFCC8, 0x604D, 0xFCC9, 0x60F6, 0xFCCA, 0x6130, 0xFCCB, 0x614C, 0xFCCC, 0x6643, + 0xFCCD, 0x6644, 0xFCCE, 0x69A5, 0xFCCF, 0x6CC1, 0xFCD0, 0x6E5F, 0xFCD1, 0x6EC9, 0xFCD2, 0x6F62, 0xFCD3, 0x714C, 0xFCD4, 0x749C, + 0xFCD5, 0x7687, 0xFCD6, 0x7BC1, 0xFCD7, 0x7C27, 0xFCD8, 0x8352, 0xFCD9, 0x8757, 0xFCDA, 0x9051, 0xFCDB, 0x968D, 0xFCDC, 0x9EC3, + 0xFCDD, 0x532F, 0xFCDE, 0x56DE, 0xFCDF, 0x5EFB, 0xFCE0, 0x5F8A, 0xFCE1, 0x6062, 0xFCE2, 0x6094, 0xFCE3, 0x61F7, 0xFCE4, 0x6666, + 0xFCE5, 0x6703, 0xFCE6, 0x6A9C, 0xFCE7, 0x6DEE, 0xFCE8, 0x6FAE, 0xFCE9, 0x7070, 0xFCEA, 0x736A, 0xFCEB, 0x7E6A, 0xFCEC, 0x81BE, + 0xFCED, 0x8334, 0xFCEE, 0x86D4, 0xFCEF, 0x8AA8, 0xFCF0, 0x8CC4, 0xFCF1, 0x5283, 0xFCF2, 0x7372, 0xFCF3, 0x5B96, 0xFCF4, 0x6A6B, + 0xFCF5, 0x9404, 0xFCF6, 0x54EE, 0xFCF7, 0x5686, 0xFCF8, 0x5B5D, 0xFCF9, 0x6548, 0xFCFA, 0x6585, 0xFCFB, 0x66C9, 0xFCFC, 0x689F, + 0xFCFD, 0x6D8D, 0xFCFE, 0x6DC6, 0xFDA1, 0x723B, 0xFDA2, 0x80B4, 0xFDA3, 0x9175, 0xFDA4, 0x9A4D, 0xFDA5, 0x4FAF, 0xFDA6, 0x5019, + 0xFDA7, 0x539A, 0xFDA8, 0x540E, 0xFDA9, 0x543C, 0xFDAA, 0x5589, 0xFDAB, 0x55C5, 0xFDAC, 0x5E3F, 0xFDAD, 0x5F8C, 0xFDAE, 0x673D, + 0xFDAF, 0x7166, 0xFDB0, 0x73DD, 0xFDB1, 0x9005, 0xFDB2, 0x52DB, 0xFDB3, 0x52F3, 0xFDB4, 0x5864, 0xFDB5, 0x58CE, 0xFDB6, 0x7104, + 0xFDB7, 0x718F, 0xFDB8, 0x71FB, 0xFDB9, 0x85B0, 0xFDBA, 0x8A13, 0xFDBB, 0x6688, 0xFDBC, 0x85A8, 0xFDBD, 0x55A7, 0xFDBE, 0x6684, + 0xFDBF, 0x714A, 0xFDC0, 0x8431, 0xFDC1, 0x5349, 0xFDC2, 0x5599, 0xFDC3, 0x6BC1, 0xFDC4, 0x5F59, 0xFDC5, 0x5FBD, 0xFDC6, 0x63EE, + 0xFDC7, 0x6689, 0xFDC8, 0x7147, 0xFDC9, 0x8AF1, 0xFDCA, 0x8F1D, 0xFDCB, 0x9EBE, 0xFDCC, 0x4F11, 0xFDCD, 0x643A, 0xFDCE, 0x70CB, + 0xFDCF, 0x7566, 0xFDD0, 0x8667, 0xFDD1, 0x6064, 0xFDD2, 0x8B4E, 0xFDD3, 0x9DF8, 0xFDD4, 0x5147, 0xFDD5, 0x51F6, 0xFDD6, 0x5308, + 0xFDD7, 0x6D36, 0xFDD8, 0x80F8, 0xFDD9, 0x9ED1, 0xFDDA, 0x6615, 0xFDDB, 0x6B23, 0xFDDC, 0x7098, 0xFDDD, 0x75D5, 0xFDDE, 0x5403, + 0xFDDF, 0x5C79, 0xFDE0, 0x7D07, 0xFDE1, 0x8A16, 0xFDE2, 0x6B20, 0xFDE3, 0x6B3D, 0xFDE4, 0x6B46, 0xFDE5, 0x5438, 0xFDE6, 0x6070, + 0xFDE7, 0x6D3D, 0xFDE8, 0x7FD5, 0xFDE9, 0x8208, 0xFDEA, 0x50D6, 0xFDEB, 0x51DE, 0xFDEC, 0x559C, 0xFDED, 0x566B, 0xFDEE, 0x56CD, + 0xFDEF, 0x59EC, 0xFDF0, 0x5B09, 0xFDF1, 0x5E0C, 0xFDF2, 0x6199, 0xFDF3, 0x6198, 0xFDF4, 0x6231, 0xFDF5, 0x665E, 0xFDF6, 0x66E6, + 0xFDF7, 0x7199, 0xFDF8, 0x71B9, 0xFDF9, 0x71BA, 0xFDFA, 0x72A7, 0xFDFB, 0x79A7, 0xFDFC, 0x7A00, 0xFDFD, 0x7FB2, 0xFDFE, 0x8A70, + 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 950 || FF_CODE_PAGE == 0 /* Traditional Chinese */ +static const WCHAR uni2oem950[] = { /* Unicode --> Big5 pairs */ + 0x00A7, 0xA1B1, 0x00AF, 0xA1C2, 0x00B0, 0xA258, 0x00B1, 0xA1D3, 0x00B7, 0xA150, 0x00D7, 0xA1D1, 0x00F7, 0xA1D2, 0x02C7, 0xA3BE, + 0x02C9, 0xA3BC, 0x02CA, 0xA3BD, 0x02CB, 0xA3BF, 0x02CD, 0xA1C5, 0x02D9, 0xA3BB, 0x0391, 0xA344, 0x0392, 0xA345, 0x0393, 0xA346, + 0x0394, 0xA347, 0x0395, 0xA348, 0x0396, 0xA349, 0x0397, 0xA34A, 0x0398, 0xA34B, 0x0399, 0xA34C, 0x039A, 0xA34D, 0x039B, 0xA34E, + 0x039C, 0xA34F, 0x039D, 0xA350, 0x039E, 0xA351, 0x039F, 0xA352, 0x03A0, 0xA353, 0x03A1, 0xA354, 0x03A3, 0xA355, 0x03A4, 0xA356, + 0x03A5, 0xA357, 0x03A6, 0xA358, 0x03A7, 0xA359, 0x03A8, 0xA35A, 0x03A9, 0xA35B, 0x03B1, 0xA35C, 0x03B2, 0xA35D, 0x03B3, 0xA35E, + 0x03B4, 0xA35F, 0x03B5, 0xA360, 0x03B6, 0xA361, 0x03B7, 0xA362, 0x03B8, 0xA363, 0x03B9, 0xA364, 0x03BA, 0xA365, 0x03BB, 0xA366, + 0x03BC, 0xA367, 0x03BD, 0xA368, 0x03BE, 0xA369, 0x03BF, 0xA36A, 0x03C0, 0xA36B, 0x03C1, 0xA36C, 0x03C3, 0xA36D, 0x03C4, 0xA36E, + 0x03C5, 0xA36F, 0x03C6, 0xA370, 0x03C7, 0xA371, 0x03C8, 0xA372, 0x03C9, 0xA373, 0x2013, 0xA156, 0x2014, 0xA158, 0x2018, 0xA1A5, + 0x2019, 0xA1A6, 0x201C, 0xA1A7, 0x201D, 0xA1A8, 0x2025, 0xA14C, 0x2026, 0xA14B, 0x2027, 0xA145, 0x2032, 0xA1AC, 0x2035, 0xA1AB, + 0x203B, 0xA1B0, 0x20AC, 0xA3E1, 0x2103, 0xA24A, 0x2105, 0xA1C1, 0x2109, 0xA24B, 0x2160, 0xA2B9, 0x2161, 0xA2BA, 0x2162, 0xA2BB, + 0x2163, 0xA2BC, 0x2164, 0xA2BD, 0x2165, 0xA2BE, 0x2166, 0xA2BF, 0x2167, 0xA2C0, 0x2168, 0xA2C1, 0x2169, 0xA2C2, 0x2190, 0xA1F6, + 0x2191, 0xA1F4, 0x2192, 0xA1F7, 0x2193, 0xA1F5, 0x2196, 0xA1F8, 0x2197, 0xA1F9, 0x2198, 0xA1FB, 0x2199, 0xA1FA, 0x2215, 0xA241, + 0x221A, 0xA1D4, 0x221E, 0xA1DB, 0x221F, 0xA1E8, 0x2220, 0xA1E7, 0x2223, 0xA1FD, 0x2225, 0xA1FC, 0x2229, 0xA1E4, 0x222A, 0xA1E5, + 0x222B, 0xA1EC, 0x222E, 0xA1ED, 0x2234, 0xA1EF, 0x2235, 0xA1EE, 0x2252, 0xA1DC, 0x2260, 0xA1DA, 0x2261, 0xA1DD, 0x2266, 0xA1D8, + 0x2267, 0xA1D9, 0x2295, 0xA1F2, 0x2299, 0xA1F3, 0x22A5, 0xA1E6, 0x22BF, 0xA1E9, 0x2500, 0xA277, 0x2502, 0xA278, 0x250C, 0xA27A, + 0x2510, 0xA27B, 0x2514, 0xA27C, 0x2518, 0xA27D, 0x251C, 0xA275, 0x2524, 0xA274, 0x252C, 0xA273, 0x2534, 0xA272, 0x253C, 0xA271, + 0x2550, 0xA2A4, 0x2550, 0xF9F9, 0x2551, 0xF9F8, 0x2552, 0xF9E6, 0x2553, 0xF9EF, 0x2554, 0xF9DD, 0x2555, 0xF9E8, 0x2556, 0xF9F1, + 0x2557, 0xF9DF, 0x2558, 0xF9EC, 0x2559, 0xF9F5, 0x255A, 0xF9E3, 0x255B, 0xF9EE, 0x255C, 0xF9F7, 0x255D, 0xF9E5, 0x255E, 0xA2A5, + 0x255E, 0xF9E9, 0x255F, 0xF9F2, 0x2560, 0xF9E0, 0x2561, 0xA2A7, 0x2561, 0xF9EB, 0x2562, 0xF9F4, 0x2563, 0xF9E2, 0x2564, 0xF9E7, + 0x2565, 0xF9F0, 0x2566, 0xF9DE, 0x2567, 0xF9ED, 0x2568, 0xF9F6, 0x2569, 0xF9E4, 0x256A, 0xA2A6, 0x256A, 0xF9EA, 0x256B, 0xF9F3, + 0x256C, 0xF9E1, 0x256D, 0xA27E, 0x256D, 0xF9FA, 0x256E, 0xA2A1, 0x256E, 0xF9FB, 0x256F, 0xA2A3, 0x256F, 0xF9FD, 0x2570, 0xA2A2, + 0x2570, 0xF9FC, 0x2571, 0xA2AC, 0x2572, 0xA2AD, 0x2573, 0xA2AE, 0x2574, 0xA15A, 0x2581, 0xA262, 0x2582, 0xA263, 0x2583, 0xA264, + 0x2584, 0xA265, 0x2585, 0xA266, 0x2586, 0xA267, 0x2587, 0xA268, 0x2588, 0xA269, 0x2589, 0xA270, 0x258A, 0xA26F, 0x258B, 0xA26E, + 0x258C, 0xA26D, 0x258D, 0xA26C, 0x258E, 0xA26B, 0x258F, 0xA26A, 0x2593, 0xF9FE, 0x2594, 0xA276, 0x2595, 0xA279, 0x25A0, 0xA1BD, + 0x25A1, 0xA1BC, 0x25B2, 0xA1B6, 0x25B3, 0xA1B5, 0x25BC, 0xA1BF, 0x25BD, 0xA1BE, 0x25C6, 0xA1BB, 0x25C7, 0xA1BA, 0x25CB, 0xA1B3, + 0x25CE, 0xA1B7, 0x25CF, 0xA1B4, 0x25E2, 0xA2A8, 0x25E3, 0xA2A9, 0x25E4, 0xA2AB, 0x25E5, 0xA2AA, 0x2605, 0xA1B9, 0x2606, 0xA1B8, + 0x2640, 0xA1F0, 0x2642, 0xA1F1, 0x3000, 0xA140, 0x3001, 0xA142, 0x3002, 0xA143, 0x3003, 0xA1B2, 0x3008, 0xA171, 0x3009, 0xA172, + 0x300A, 0xA16D, 0x300B, 0xA16E, 0x300C, 0xA175, 0x300D, 0xA176, 0x300E, 0xA179, 0x300F, 0xA17A, 0x3010, 0xA169, 0x3011, 0xA16A, + 0x3012, 0xA245, 0x3014, 0xA165, 0x3015, 0xA166, 0x301D, 0xA1A9, 0x301E, 0xA1AA, 0x3021, 0xA2C3, 0x3022, 0xA2C4, 0x3023, 0xA2C5, + 0x3024, 0xA2C6, 0x3025, 0xA2C7, 0x3026, 0xA2C8, 0x3027, 0xA2C9, 0x3028, 0xA2CA, 0x3029, 0xA2CB, 0x3105, 0xA374, 0x3106, 0xA375, + 0x3107, 0xA376, 0x3108, 0xA377, 0x3109, 0xA378, 0x310A, 0xA379, 0x310B, 0xA37A, 0x310C, 0xA37B, 0x310D, 0xA37C, 0x310E, 0xA37D, + 0x310F, 0xA37E, 0x3110, 0xA3A1, 0x3111, 0xA3A2, 0x3112, 0xA3A3, 0x3113, 0xA3A4, 0x3114, 0xA3A5, 0x3115, 0xA3A6, 0x3116, 0xA3A7, + 0x3117, 0xA3A8, 0x3118, 0xA3A9, 0x3119, 0xA3AA, 0x311A, 0xA3AB, 0x311B, 0xA3AC, 0x311C, 0xA3AD, 0x311D, 0xA3AE, 0x311E, 0xA3AF, + 0x311F, 0xA3B0, 0x3120, 0xA3B1, 0x3121, 0xA3B2, 0x3122, 0xA3B3, 0x3123, 0xA3B4, 0x3124, 0xA3B5, 0x3125, 0xA3B6, 0x3126, 0xA3B7, + 0x3127, 0xA3B8, 0x3128, 0xA3B9, 0x3129, 0xA3BA, 0x32A3, 0xA1C0, 0x338E, 0xA255, 0x338F, 0xA256, 0x339C, 0xA250, 0x339D, 0xA251, + 0x339E, 0xA252, 0x33A1, 0xA254, 0x33C4, 0xA257, 0x33CE, 0xA253, 0x33D1, 0xA1EB, 0x33D2, 0xA1EA, 0x33D5, 0xA24F, 0x4E00, 0xA440, + 0x4E01, 0xA442, 0x4E03, 0xA443, 0x4E07, 0xC945, 0x4E08, 0xA456, 0x4E09, 0xA454, 0x4E0A, 0xA457, 0x4E0B, 0xA455, 0x4E0C, 0xC946, + 0x4E0D, 0xA4A3, 0x4E0E, 0xC94F, 0x4E0F, 0xC94D, 0x4E10, 0xA4A2, 0x4E11, 0xA4A1, 0x4E14, 0xA542, 0x4E15, 0xA541, 0x4E16, 0xA540, + 0x4E18, 0xA543, 0x4E19, 0xA4FE, 0x4E1E, 0xA5E0, 0x4E1F, 0xA5E1, 0x4E26, 0xA8C3, 0x4E2B, 0xA458, 0x4E2D, 0xA4A4, 0x4E2E, 0xC950, + 0x4E30, 0xA4A5, 0x4E31, 0xC963, 0x4E32, 0xA6EA, 0x4E33, 0xCBB1, 0x4E38, 0xA459, 0x4E39, 0xA4A6, 0x4E3B, 0xA544, 0x4E3C, 0xC964, + 0x4E42, 0xC940, 0x4E43, 0xA444, 0x4E45, 0xA45B, 0x4E47, 0xC947, 0x4E48, 0xA45C, 0x4E4B, 0xA4A7, 0x4E4D, 0xA545, 0x4E4E, 0xA547, + 0x4E4F, 0xA546, 0x4E52, 0xA5E2, 0x4E53, 0xA5E3, 0x4E56, 0xA8C4, 0x4E58, 0xADBC, 0x4E59, 0xA441, 0x4E5C, 0xC941, 0x4E5D, 0xA445, + 0x4E5E, 0xA45E, 0x4E5F, 0xA45D, 0x4E69, 0xA5E4, 0x4E73, 0xA8C5, 0x4E7E, 0xB0AE, 0x4E7F, 0xD44B, 0x4E82, 0xB6C3, 0x4E83, 0xDCB1, + 0x4E84, 0xDCB2, 0x4E86, 0xA446, 0x4E88, 0xA4A9, 0x4E8B, 0xA8C6, 0x4E8C, 0xA447, 0x4E8D, 0xC948, 0x4E8E, 0xA45F, 0x4E91, 0xA4AA, + 0x4E92, 0xA4AC, 0x4E93, 0xC951, 0x4E94, 0xA4AD, 0x4E95, 0xA4AB, 0x4E99, 0xA5E5, 0x4E9B, 0xA8C7, 0x4E9E, 0xA8C8, 0x4E9F, 0xAB45, + 0x4EA1, 0xA460, 0x4EA2, 0xA4AE, 0x4EA4, 0xA5E6, 0x4EA5, 0xA5E8, 0x4EA6, 0xA5E7, 0x4EA8, 0xA6EB, 0x4EAB, 0xA8C9, 0x4EAC, 0xA8CA, + 0x4EAD, 0xAB46, 0x4EAE, 0xAB47, 0x4EB3, 0xADBD, 0x4EB6, 0xDCB3, 0x4EB9, 0xF6D6, 0x4EBA, 0xA448, 0x4EC0, 0xA4B0, 0x4EC1, 0xA4AF, + 0x4EC2, 0xC952, 0x4EC3, 0xA4B1, 0x4EC4, 0xA4B7, 0x4EC6, 0xA4B2, 0x4EC7, 0xA4B3, 0x4EC8, 0xC954, 0x4EC9, 0xC953, 0x4ECA, 0xA4B5, + 0x4ECB, 0xA4B6, 0x4ECD, 0xA4B4, 0x4ED4, 0xA54A, 0x4ED5, 0xA54B, 0x4ED6, 0xA54C, 0x4ED7, 0xA54D, 0x4ED8, 0xA549, 0x4ED9, 0xA550, + 0x4EDA, 0xC96A, 0x4EDC, 0xC966, 0x4EDD, 0xC969, 0x4EDE, 0xA551, 0x4EDF, 0xA561, 0x4EE1, 0xC968, 0x4EE3, 0xA54E, 0x4EE4, 0xA54F, + 0x4EE5, 0xA548, 0x4EE8, 0xC965, 0x4EE9, 0xC967, 0x4EF0, 0xA5F5, 0x4EF1, 0xC9B0, 0x4EF2, 0xA5F2, 0x4EF3, 0xA5F6, 0x4EF4, 0xC9BA, + 0x4EF5, 0xC9AE, 0x4EF6, 0xA5F3, 0x4EF7, 0xC9B2, 0x4EFB, 0xA5F4, 0x4EFD, 0xA5F7, 0x4EFF, 0xA5E9, 0x4F00, 0xC9B1, 0x4F01, 0xA5F8, + 0x4F02, 0xC9B5, 0x4F04, 0xC9B9, 0x4F05, 0xC9B6, 0x4F08, 0xC9B3, 0x4F09, 0xA5EA, 0x4F0A, 0xA5EC, 0x4F0B, 0xA5F9, 0x4F0D, 0xA5EE, + 0x4F0E, 0xC9AB, 0x4F0F, 0xA5F1, 0x4F10, 0xA5EF, 0x4F11, 0xA5F0, 0x4F12, 0xC9BB, 0x4F13, 0xC9B8, 0x4F14, 0xC9AF, 0x4F15, 0xA5ED, + 0x4F18, 0xC9AC, 0x4F19, 0xA5EB, 0x4F1D, 0xC9B4, 0x4F22, 0xC9B7, 0x4F2C, 0xC9AD, 0x4F2D, 0xCA66, 0x4F2F, 0xA742, 0x4F30, 0xA6F4, + 0x4F33, 0xCA67, 0x4F34, 0xA6F1, 0x4F36, 0xA744, 0x4F38, 0xA6F9, 0x4F3A, 0xA6F8, 0x4F3B, 0xCA5B, 0x4F3C, 0xA6FC, 0x4F3D, 0xA6F7, + 0x4F3E, 0xCA60, 0x4F3F, 0xCA68, 0x4F41, 0xCA64, 0x4F43, 0xA6FA, 0x4F46, 0xA6FD, 0x4F47, 0xA6EE, 0x4F48, 0xA747, 0x4F49, 0xCA5D, + 0x4F4C, 0xCBBD, 0x4F4D, 0xA6EC, 0x4F4E, 0xA743, 0x4F4F, 0xA6ED, 0x4F50, 0xA6F5, 0x4F51, 0xA6F6, 0x4F52, 0xCA62, 0x4F53, 0xCA5E, + 0x4F54, 0xA6FB, 0x4F55, 0xA6F3, 0x4F56, 0xCA5A, 0x4F57, 0xA6EF, 0x4F58, 0xCA65, 0x4F59, 0xA745, 0x4F5A, 0xA748, 0x4F5B, 0xA6F2, + 0x4F5C, 0xA740, 0x4F5D, 0xA746, 0x4F5E, 0xA6F0, 0x4F5F, 0xCA63, 0x4F60, 0xA741, 0x4F61, 0xCA69, 0x4F62, 0xCA5C, 0x4F63, 0xA6FE, + 0x4F64, 0xCA5F, 0x4F67, 0xCA61, 0x4F69, 0xA8D8, 0x4F6A, 0xCBBF, 0x4F6B, 0xCBCB, 0x4F6C, 0xA8D0, 0x4F6E, 0xCBCC, 0x4F6F, 0xA8CB, + 0x4F70, 0xA8D5, 0x4F73, 0xA8CE, 0x4F74, 0xCBB9, 0x4F75, 0xA8D6, 0x4F76, 0xCBB8, 0x4F77, 0xCBBC, 0x4F78, 0xCBC3, 0x4F79, 0xCBC1, + 0x4F7A, 0xA8DE, 0x4F7B, 0xA8D9, 0x4F7C, 0xCBB3, 0x4F7D, 0xCBB5, 0x4F7E, 0xA8DB, 0x4F7F, 0xA8CF, 0x4F80, 0xCBB6, 0x4F81, 0xCBC2, + 0x4F82, 0xCBC9, 0x4F83, 0xA8D4, 0x4F84, 0xCBBB, 0x4F85, 0xCBB4, 0x4F86, 0xA8D3, 0x4F87, 0xCBB7, 0x4F88, 0xA8D7, 0x4F89, 0xCBBA, + 0x4F8B, 0xA8D2, 0x4F8D, 0xA8CD, 0x4F8F, 0xA8DC, 0x4F90, 0xCBC4, 0x4F91, 0xA8DD, 0x4F92, 0xCBC8, 0x4F94, 0xCBC6, 0x4F95, 0xCBCA, + 0x4F96, 0xA8DA, 0x4F97, 0xCBBE, 0x4F98, 0xCBB2, 0x4F9A, 0xCBC0, 0x4F9B, 0xA8D1, 0x4F9C, 0xCBC5, 0x4F9D, 0xA8CC, 0x4F9E, 0xCBC7, + 0x4FAE, 0xAB56, 0x4FAF, 0xAB4A, 0x4FB2, 0xCDE0, 0x4FB3, 0xCDE8, 0x4FB5, 0xAB49, 0x4FB6, 0xAB51, 0x4FB7, 0xAB5D, 0x4FB9, 0xCDEE, + 0x4FBA, 0xCDEC, 0x4FBB, 0xCDE7, 0x4FBF, 0xAB4B, 0x4FC0, 0xCDED, 0x4FC1, 0xCDE3, 0x4FC2, 0xAB59, 0x4FC3, 0xAB50, 0x4FC4, 0xAB58, + 0x4FC5, 0xCDDE, 0x4FC7, 0xCDEA, 0x4FC9, 0xCDE1, 0x4FCA, 0xAB54, 0x4FCB, 0xCDE2, 0x4FCD, 0xCDDD, 0x4FCE, 0xAB5B, 0x4FCF, 0xAB4E, + 0x4FD0, 0xAB57, 0x4FD1, 0xAB4D, 0x4FD3, 0xCDDF, 0x4FD4, 0xCDE4, 0x4FD6, 0xCDEB, 0x4FD7, 0xAB55, 0x4FD8, 0xAB52, 0x4FD9, 0xCDE6, + 0x4FDA, 0xAB5A, 0x4FDB, 0xCDE9, 0x4FDC, 0xCDE5, 0x4FDD, 0xAB4F, 0x4FDE, 0xAB5C, 0x4FDF, 0xAB53, 0x4FE0, 0xAB4C, 0x4FE1, 0xAB48, + 0x4FEC, 0xCDEF, 0x4FEE, 0xADD7, 0x4FEF, 0xADC1, 0x4FF1, 0xADD1, 0x4FF3, 0xADD6, 0x4FF4, 0xD0D0, 0x4FF5, 0xD0CF, 0x4FF6, 0xD0D4, + 0x4FF7, 0xD0D5, 0x4FF8, 0xADC4, 0x4FFA, 0xADCD, 0x4FFE, 0xADDA, 0x5000, 0xADCE, 0x5005, 0xD0C9, 0x5006, 0xADC7, 0x5007, 0xD0CA, + 0x5009, 0xADDC, 0x500B, 0xADD3, 0x500C, 0xADBE, 0x500D, 0xADBF, 0x500E, 0xD0DD, 0x500F, 0xB0BF, 0x5011, 0xADCC, 0x5012, 0xADCB, + 0x5013, 0xD0CB, 0x5014, 0xADCF, 0x5015, 0xD45B, 0x5016, 0xADC6, 0x5017, 0xD0D6, 0x5018, 0xADD5, 0x5019, 0xADD4, 0x501A, 0xADCA, + 0x501B, 0xD0CE, 0x501C, 0xD0D7, 0x501E, 0xD0C8, 0x501F, 0xADC9, 0x5020, 0xD0D8, 0x5021, 0xADD2, 0x5022, 0xD0CC, 0x5023, 0xADC0, + 0x5025, 0xADC3, 0x5026, 0xADC2, 0x5027, 0xD0D9, 0x5028, 0xADD0, 0x5029, 0xADC5, 0x502A, 0xADD9, 0x502B, 0xADDB, 0x502C, 0xD0D3, + 0x502D, 0xADD8, 0x502F, 0xD0DB, 0x5030, 0xD0CD, 0x5031, 0xD0DC, 0x5033, 0xD0D1, 0x5035, 0xD0DA, 0x5037, 0xD0D2, 0x503C, 0xADC8, + 0x5040, 0xD463, 0x5041, 0xD457, 0x5043, 0xB0B3, 0x5045, 0xD45C, 0x5046, 0xD462, 0x5047, 0xB0B2, 0x5048, 0xD455, 0x5049, 0xB0B6, + 0x504A, 0xD459, 0x504B, 0xD452, 0x504C, 0xB0B4, 0x504D, 0xD456, 0x504E, 0xB0B9, 0x504F, 0xB0BE, 0x5051, 0xD467, 0x5053, 0xD451, + 0x5055, 0xB0BA, 0x5057, 0xD466, 0x505A, 0xB0B5, 0x505B, 0xD458, 0x505C, 0xB0B1, 0x505D, 0xD453, 0x505E, 0xD44F, 0x505F, 0xD45D, + 0x5060, 0xD450, 0x5061, 0xD44E, 0x5062, 0xD45A, 0x5063, 0xD460, 0x5064, 0xD461, 0x5065, 0xB0B7, 0x5068, 0xD85B, 0x5069, 0xD45E, + 0x506A, 0xD44D, 0x506B, 0xD45F, 0x506D, 0xB0C1, 0x506E, 0xD464, 0x506F, 0xB0C0, 0x5070, 0xD44C, 0x5072, 0xD454, 0x5073, 0xD465, + 0x5074, 0xB0BC, 0x5075, 0xB0BB, 0x5076, 0xB0B8, 0x5077, 0xB0BD, 0x507A, 0xB0AF, 0x507D, 0xB0B0, 0x5080, 0xB3C8, 0x5082, 0xD85E, + 0x5083, 0xD857, 0x5085, 0xB3C5, 0x5087, 0xD85F, 0x508B, 0xD855, 0x508C, 0xD858, 0x508D, 0xB3C4, 0x508E, 0xD859, 0x5091, 0xB3C7, + 0x5092, 0xD85D, 0x5094, 0xD853, 0x5095, 0xD852, 0x5096, 0xB3C9, 0x5098, 0xB3CA, 0x5099, 0xB3C6, 0x509A, 0xB3CB, 0x509B, 0xD851, + 0x509C, 0xD85C, 0x509D, 0xD85A, 0x509E, 0xD854, 0x50A2, 0xB3C3, 0x50A3, 0xD856, 0x50AC, 0xB6CA, 0x50AD, 0xB6C4, 0x50AE, 0xDCB7, + 0x50AF, 0xB6CD, 0x50B0, 0xDCBD, 0x50B1, 0xDCC0, 0x50B2, 0xB6C6, 0x50B3, 0xB6C7, 0x50B4, 0xDCBA, 0x50B5, 0xB6C5, 0x50B6, 0xDCC3, + 0x50B7, 0xB6CB, 0x50B8, 0xDCC4, 0x50BA, 0xDCBF, 0x50BB, 0xB6CC, 0x50BD, 0xDCB4, 0x50BE, 0xB6C9, 0x50BF, 0xDCB5, 0x50C1, 0xDCBE, + 0x50C2, 0xDCBC, 0x50C4, 0xDCB8, 0x50C5, 0xB6C8, 0x50C6, 0xDCB6, 0x50C7, 0xB6CE, 0x50C8, 0xDCBB, 0x50C9, 0xDCC2, 0x50CA, 0xDCB9, + 0x50CB, 0xDCC1, 0x50CE, 0xB9B6, 0x50CF, 0xB9B3, 0x50D1, 0xB9B4, 0x50D3, 0xE0F9, 0x50D4, 0xE0F1, 0x50D5, 0xB9B2, 0x50D6, 0xB9AF, + 0x50D7, 0xE0F2, 0x50DA, 0xB9B1, 0x50DB, 0xE0F5, 0x50DD, 0xE0F7, 0x50E0, 0xE0FE, 0x50E3, 0xE0FD, 0x50E4, 0xE0F8, 0x50E5, 0xB9AE, + 0x50E6, 0xE0F0, 0x50E7, 0xB9AC, 0x50E8, 0xE0F3, 0x50E9, 0xB9B7, 0x50EA, 0xE0F6, 0x50EC, 0xE0FA, 0x50ED, 0xB9B0, 0x50EE, 0xB9AD, + 0x50EF, 0xE0FC, 0x50F0, 0xE0FB, 0x50F1, 0xB9B5, 0x50F3, 0xE0F4, 0x50F5, 0xBBF8, 0x50F6, 0xE4EC, 0x50F8, 0xE4E9, 0x50F9, 0xBBF9, + 0x50FB, 0xBBF7, 0x50FD, 0xE4F0, 0x50FE, 0xE4ED, 0x50FF, 0xE4E6, 0x5100, 0xBBF6, 0x5102, 0xBBFA, 0x5103, 0xE4E7, 0x5104, 0xBBF5, + 0x5105, 0xBBFD, 0x5106, 0xE4EA, 0x5107, 0xE4EB, 0x5108, 0xBBFB, 0x5109, 0xBBFC, 0x510A, 0xE4F1, 0x510B, 0xE4EE, 0x510C, 0xE4EF, + 0x5110, 0xBEAA, 0x5111, 0xE8F8, 0x5112, 0xBEA7, 0x5113, 0xE8F5, 0x5114, 0xBEA9, 0x5115, 0xBEAB, 0x5117, 0xE8F6, 0x5118, 0xBEA8, + 0x511A, 0xE8F7, 0x511C, 0xE8F4, 0x511F, 0xC076, 0x5120, 0xECBD, 0x5121, 0xC077, 0x5122, 0xECBB, 0x5124, 0xECBC, 0x5125, 0xECBA, + 0x5126, 0xECB9, 0x5129, 0xECBE, 0x512A, 0xC075, 0x512D, 0xEFB8, 0x512E, 0xEFB9, 0x5130, 0xE4E8, 0x5131, 0xEFB7, 0x5132, 0xC078, + 0x5133, 0xC35F, 0x5134, 0xF1EB, 0x5135, 0xF1EC, 0x5137, 0xC4D7, 0x5138, 0xC4D8, 0x5139, 0xF5C1, 0x513A, 0xF5C0, 0x513B, 0xC56C, + 0x513C, 0xC56B, 0x513D, 0xF7D0, 0x513F, 0xA449, 0x5140, 0xA461, 0x5141, 0xA4B9, 0x5143, 0xA4B8, 0x5144, 0xA553, 0x5145, 0xA552, + 0x5146, 0xA5FC, 0x5147, 0xA5FB, 0x5148, 0xA5FD, 0x5149, 0xA5FA, 0x514B, 0xA74A, 0x514C, 0xA749, 0x514D, 0xA74B, 0x5152, 0xA8E0, + 0x5154, 0xA8DF, 0x5155, 0xA8E1, 0x5157, 0xAB5E, 0x5159, 0xA259, 0x515A, 0xD0DE, 0x515B, 0xA25A, 0x515C, 0xB0C2, 0x515D, 0xA25C, + 0x515E, 0xA25B, 0x515F, 0xD860, 0x5161, 0xA25D, 0x5162, 0xB9B8, 0x5163, 0xA25E, 0x5165, 0xA44A, 0x5167, 0xA4BA, 0x5168, 0xA5FE, + 0x5169, 0xA8E2, 0x516B, 0xA44B, 0x516C, 0xA4BD, 0x516D, 0xA4BB, 0x516E, 0xA4BC, 0x5171, 0xA640, 0x5175, 0xA74C, 0x5176, 0xA8E4, + 0x5177, 0xA8E3, 0x5178, 0xA8E5, 0x517C, 0xADDD, 0x5180, 0xBEAC, 0x5187, 0xC94E, 0x5189, 0xA554, 0x518A, 0xA555, 0x518D, 0xA641, + 0x518F, 0xCA6A, 0x5191, 0xAB60, 0x5192, 0xAB5F, 0x5193, 0xD0E0, 0x5194, 0xD0DF, 0x5195, 0xB0C3, 0x5197, 0xA4BE, 0x5198, 0xC955, + 0x519E, 0xCBCD, 0x51A0, 0xAB61, 0x51A2, 0xADE0, 0x51A4, 0xADDE, 0x51A5, 0xADDF, 0x51AA, 0xBEAD, 0x51AC, 0xA556, 0x51B0, 0xA642, + 0x51B1, 0xC9BC, 0x51B6, 0xA74D, 0x51B7, 0xA74E, 0x51B9, 0xCA6B, 0x51BC, 0xCBCE, 0x51BD, 0xA8E6, 0x51BE, 0xCBCF, 0x51C4, 0xD0E2, + 0x51C5, 0xD0E3, 0x51C6, 0xADE3, 0x51C8, 0xD0E4, 0x51CA, 0xD0E1, 0x51CB, 0xADE4, 0x51CC, 0xADE2, 0x51CD, 0xADE1, 0x51CE, 0xD0E5, + 0x51D0, 0xD468, 0x51D4, 0xD861, 0x51D7, 0xDCC5, 0x51D8, 0xE140, 0x51DC, 0xBBFE, 0x51DD, 0xBEAE, 0x51DE, 0xE8F9, 0x51E0, 0xA44C, + 0x51E1, 0xA45A, 0x51F0, 0xB0C4, 0x51F1, 0xB3CD, 0x51F3, 0xB9B9, 0x51F5, 0xC942, 0x51F6, 0xA4BF, 0x51F8, 0xA559, 0x51F9, 0xA557, + 0x51FA, 0xA558, 0x51FD, 0xA8E7, 0x5200, 0xA44D, 0x5201, 0xA44E, 0x5203, 0xA462, 0x5206, 0xA4C0, 0x5207, 0xA4C1, 0x5208, 0xA4C2, + 0x5209, 0xC9BE, 0x520A, 0xA55A, 0x520C, 0xC96B, 0x520E, 0xA646, 0x5210, 0xC9BF, 0x5211, 0xA644, 0x5212, 0xA645, 0x5213, 0xC9BD, + 0x5216, 0xA647, 0x5217, 0xA643, 0x521C, 0xCA6C, 0x521D, 0xAAEC, 0x521E, 0xCA6D, 0x5221, 0xCA6E, 0x5224, 0xA750, 0x5225, 0xA74F, + 0x5228, 0xA753, 0x5229, 0xA751, 0x522A, 0xA752, 0x522E, 0xA8ED, 0x5230, 0xA8EC, 0x5231, 0xCBD4, 0x5232, 0xCBD1, 0x5233, 0xCBD2, + 0x5235, 0xCBD0, 0x5236, 0xA8EE, 0x5237, 0xA8EA, 0x5238, 0xA8E9, 0x523A, 0xA8EB, 0x523B, 0xA8E8, 0x5241, 0xA8EF, 0x5243, 0xAB63, + 0x5244, 0xCDF0, 0x5246, 0xCBD3, 0x5247, 0xAB68, 0x5249, 0xCDF1, 0x524A, 0xAB64, 0x524B, 0xAB67, 0x524C, 0xAB66, 0x524D, 0xAB65, + 0x524E, 0xAB62, 0x5252, 0xD0E8, 0x5254, 0xADE7, 0x5255, 0xD0EB, 0x5256, 0xADE5, 0x525A, 0xD0E7, 0x525B, 0xADE8, 0x525C, 0xADE6, + 0x525D, 0xADE9, 0x525E, 0xD0E9, 0x525F, 0xD0EA, 0x5261, 0xD0E6, 0x5262, 0xD0EC, 0x5269, 0xB3D1, 0x526A, 0xB0C5, 0x526B, 0xD469, + 0x526C, 0xD46B, 0x526D, 0xD46A, 0x526E, 0xD46C, 0x526F, 0xB0C6, 0x5272, 0xB3CE, 0x5274, 0xB3CF, 0x5275, 0xB3D0, 0x5277, 0xB6D0, + 0x5278, 0xDCC7, 0x527A, 0xDCC6, 0x527B, 0xDCC8, 0x527C, 0xDCC9, 0x527D, 0xB6D1, 0x527F, 0xB6CF, 0x5280, 0xE141, 0x5281, 0xE142, + 0x5282, 0xB9BB, 0x5283, 0xB9BA, 0x5284, 0xE35A, 0x5287, 0xBC40, 0x5288, 0xBC41, 0x5289, 0xBC42, 0x528A, 0xBC44, 0x528B, 0xE4F2, + 0x528C, 0xE4F3, 0x528D, 0xBC43, 0x5291, 0xBEAF, 0x5293, 0xBEB0, 0x5296, 0xF1ED, 0x5297, 0xF5C3, 0x5298, 0xF5C2, 0x5299, 0xF7D1, + 0x529B, 0xA44F, 0x529F, 0xA55C, 0x52A0, 0xA55B, 0x52A3, 0xA648, 0x52A6, 0xC9C0, 0x52A9, 0xA755, 0x52AA, 0xA756, 0x52AB, 0xA754, + 0x52AC, 0xA757, 0x52AD, 0xCA6F, 0x52AE, 0xCA70, 0x52BB, 0xA8F1, 0x52BC, 0xCBD5, 0x52BE, 0xA8F0, 0x52C0, 0xCDF2, 0x52C1, 0xAB6C, + 0x52C2, 0xCDF3, 0x52C3, 0xAB6B, 0x52C7, 0xAB69, 0x52C9, 0xAB6A, 0x52CD, 0xD0ED, 0x52D2, 0xB0C7, 0x52D3, 0xD46E, 0x52D5, 0xB0CA, + 0x52D6, 0xD46D, 0x52D7, 0xB1E5, 0x52D8, 0xB0C9, 0x52D9, 0xB0C8, 0x52DB, 0xB3D4, 0x52DD, 0xB3D3, 0x52DE, 0xB3D2, 0x52DF, 0xB6D2, + 0x52E2, 0xB6D5, 0x52E3, 0xB6D6, 0x52E4, 0xB6D4, 0x52E6, 0xB6D3, 0x52E9, 0xE143, 0x52EB, 0xE144, 0x52EF, 0xE4F5, 0x52F0, 0xBC45, + 0x52F1, 0xE4F4, 0x52F3, 0xBEB1, 0x52F4, 0xECBF, 0x52F5, 0xC079, 0x52F7, 0xF1EE, 0x52F8, 0xC455, 0x52FA, 0xA463, 0x52FB, 0xA4C3, + 0x52FC, 0xC956, 0x52FE, 0xA4C4, 0x52FF, 0xA4C5, 0x5305, 0xA55D, 0x5306, 0xA55E, 0x5308, 0xA649, 0x5309, 0xCA71, 0x530A, 0xCBD6, + 0x530B, 0xCBD7, 0x530D, 0xAB6D, 0x530E, 0xD0EE, 0x530F, 0xB0CC, 0x5310, 0xB0CB, 0x5311, 0xD863, 0x5312, 0xD862, 0x5315, 0xA450, + 0x5316, 0xA4C6, 0x5317, 0xA55F, 0x5319, 0xB0CD, 0x531A, 0xC943, 0x531C, 0xC96C, 0x531D, 0xA560, 0x531F, 0xC9C2, 0x5320, 0xA64B, + 0x5321, 0xA64A, 0x5322, 0xC9C1, 0x5323, 0xA758, 0x532A, 0xADEA, 0x532D, 0xD46F, 0x532F, 0xB6D7, 0x5330, 0xE145, 0x5331, 0xB9BC, + 0x5334, 0xE8FA, 0x5337, 0xF3FD, 0x5339, 0xA4C7, 0x533C, 0xCBD8, 0x533D, 0xCDF4, 0x533E, 0xB0D0, 0x533F, 0xB0CE, 0x5340, 0xB0CF, + 0x5341, 0xA2CC, 0x5341, 0xA451, 0x5343, 0xA464, 0x5344, 0xA2CD, 0x5345, 0xA2CE, 0x5345, 0xA4CA, 0x5347, 0xA4C9, 0x5348, 0xA4C8, + 0x5349, 0xA563, 0x534A, 0xA562, 0x534C, 0xC96D, 0x534D, 0xC9C3, 0x5351, 0xA8F5, 0x5352, 0xA8F2, 0x5353, 0xA8F4, 0x5354, 0xA8F3, + 0x5357, 0xAB6E, 0x535A, 0xB3D5, 0x535C, 0xA452, 0x535E, 0xA4CB, 0x5360, 0xA565, 0x5361, 0xA564, 0x5363, 0xCA72, 0x5366, 0xA8F6, + 0x536C, 0xC957, 0x536E, 0xA567, 0x536F, 0xA566, 0x5370, 0xA64C, 0x5371, 0xA64D, 0x5372, 0xCA73, 0x5373, 0xA759, 0x5375, 0xA75A, + 0x5377, 0xA8F7, 0x5378, 0xA8F8, 0x5379, 0xA8F9, 0x537B, 0xAB6F, 0x537C, 0xCDF5, 0x537F, 0xADEB, 0x5382, 0xC944, 0x5384, 0xA4CC, + 0x538A, 0xC9C4, 0x538E, 0xCA74, 0x538F, 0xCA75, 0x5392, 0xCBD9, 0x5394, 0xCBDA, 0x5396, 0xCDF7, 0x5397, 0xCDF6, 0x5398, 0xCDF9, + 0x5399, 0xCDF8, 0x539A, 0xAB70, 0x539C, 0xD470, 0x539D, 0xADED, 0x539E, 0xD0EF, 0x539F, 0xADEC, 0x53A4, 0xD864, 0x53A5, 0xB3D6, + 0x53A7, 0xD865, 0x53AC, 0xE146, 0x53AD, 0xB9BD, 0x53B2, 0xBC46, 0x53B4, 0xF1EF, 0x53B9, 0xC958, 0x53BB, 0xA568, 0x53C3, 0xB0D1, + 0x53C8, 0xA453, 0x53C9, 0xA465, 0x53CA, 0xA4CE, 0x53CB, 0xA4CD, 0x53CD, 0xA4CF, 0x53D4, 0xA8FB, 0x53D6, 0xA8FA, 0x53D7, 0xA8FC, + 0x53DB, 0xAB71, 0x53DF, 0xADEE, 0x53E1, 0xE8FB, 0x53E2, 0xC24F, 0x53E3, 0xA466, 0x53E4, 0xA56A, 0x53E5, 0xA579, 0x53E6, 0xA574, + 0x53E8, 0xA56F, 0x53E9, 0xA56E, 0x53EA, 0xA575, 0x53EB, 0xA573, 0x53EC, 0xA56C, 0x53ED, 0xA57A, 0x53EE, 0xA56D, 0x53EF, 0xA569, + 0x53F0, 0xA578, 0x53F1, 0xA577, 0x53F2, 0xA576, 0x53F3, 0xA56B, 0x53F5, 0xA572, 0x53F8, 0xA571, 0x53FB, 0xA57B, 0x53FC, 0xA570, + 0x5401, 0xA653, 0x5403, 0xA659, 0x5404, 0xA655, 0x5406, 0xA65B, 0x5407, 0xC9C5, 0x5408, 0xA658, 0x5409, 0xA64E, 0x540A, 0xA651, + 0x540B, 0xA654, 0x540C, 0xA650, 0x540D, 0xA657, 0x540E, 0xA65A, 0x540F, 0xA64F, 0x5410, 0xA652, 0x5411, 0xA656, 0x5412, 0xA65C, + 0x5418, 0xCA7E, 0x5419, 0xCA7B, 0x541B, 0xA767, 0x541C, 0xCA7C, 0x541D, 0xA75B, 0x541E, 0xA75D, 0x541F, 0xA775, 0x5420, 0xA770, + 0x5424, 0xCAA5, 0x5425, 0xCA7D, 0x5426, 0xA75F, 0x5427, 0xA761, 0x5428, 0xCAA4, 0x5429, 0xA768, 0x542A, 0xCA78, 0x542B, 0xA774, + 0x542C, 0xA776, 0x542D, 0xA75C, 0x542E, 0xA76D, 0x5430, 0xCA76, 0x5431, 0xA773, 0x5433, 0xA764, 0x5435, 0xA76E, 0x5436, 0xA76F, + 0x5437, 0xCA77, 0x5438, 0xA76C, 0x5439, 0xA76A, 0x543B, 0xA76B, 0x543C, 0xA771, 0x543D, 0xCAA1, 0x543E, 0xA75E, 0x5440, 0xA772, + 0x5441, 0xCAA3, 0x5442, 0xA766, 0x5443, 0xA763, 0x5445, 0xCA7A, 0x5446, 0xA762, 0x5447, 0xCAA6, 0x5448, 0xA765, 0x544A, 0xA769, + 0x544E, 0xA760, 0x544F, 0xCAA2, 0x5454, 0xCA79, 0x5460, 0xCBEB, 0x5461, 0xCBEA, 0x5462, 0xA94F, 0x5463, 0xCBED, 0x5464, 0xCBEF, + 0x5465, 0xCBE4, 0x5466, 0xCBE7, 0x5467, 0xCBEE, 0x5468, 0xA950, 0x546B, 0xCBE1, 0x546C, 0xCBE5, 0x546F, 0xCBE9, 0x5470, 0xCE49, + 0x5471, 0xA94B, 0x5472, 0xCE4D, 0x5473, 0xA8FD, 0x5474, 0xCBE6, 0x5475, 0xA8FE, 0x5476, 0xA94C, 0x5477, 0xA945, 0x5478, 0xA941, + 0x547A, 0xCBE2, 0x547B, 0xA944, 0x547C, 0xA949, 0x547D, 0xA952, 0x547E, 0xCBE3, 0x547F, 0xCBDC, 0x5480, 0xA943, 0x5481, 0xCBDD, + 0x5482, 0xCBDF, 0x5484, 0xA946, 0x5486, 0xA948, 0x5487, 0xCBDB, 0x5488, 0xCBE0, 0x548B, 0xA951, 0x548C, 0xA94D, 0x548D, 0xCBE8, + 0x548E, 0xA953, 0x5490, 0xA94A, 0x5491, 0xCBDE, 0x5492, 0xA947, 0x5495, 0xA942, 0x5496, 0xA940, 0x5498, 0xCBEC, 0x549A, 0xA94E, + 0x54A0, 0xCE48, 0x54A1, 0xCDFB, 0x54A2, 0xCE4B, 0x54A5, 0xCDFD, 0x54A6, 0xAB78, 0x54A7, 0xABA8, 0x54A8, 0xAB74, 0x54A9, 0xABA7, + 0x54AA, 0xAB7D, 0x54AB, 0xABA4, 0x54AC, 0xAB72, 0x54AD, 0xCDFC, 0x54AE, 0xCE43, 0x54AF, 0xABA3, 0x54B0, 0xCE4F, 0x54B1, 0xABA5, + 0x54B3, 0xAB79, 0x54B6, 0xCE45, 0x54B7, 0xCE42, 0x54B8, 0xAB77, 0x54BA, 0xCDFA, 0x54BB, 0xABA6, 0x54BC, 0xCE4A, 0x54BD, 0xAB7C, + 0x54BE, 0xCE4C, 0x54BF, 0xABA9, 0x54C0, 0xAB73, 0x54C1, 0xAB7E, 0x54C2, 0xAB7B, 0x54C3, 0xCE40, 0x54C4, 0xABA1, 0x54C5, 0xCE46, + 0x54C6, 0xCE47, 0x54C7, 0xAB7A, 0x54C8, 0xABA2, 0x54C9, 0xAB76, 0x54CE, 0xAB75, 0x54CF, 0xCDFE, 0x54D6, 0xCE44, 0x54DE, 0xCE4E, + 0x54E0, 0xD144, 0x54E1, 0xADFB, 0x54E2, 0xD0F1, 0x54E4, 0xD0F6, 0x54E5, 0xADF4, 0x54E6, 0xAE40, 0x54E7, 0xD0F4, 0x54E8, 0xADEF, + 0x54E9, 0xADF9, 0x54EA, 0xADFE, 0x54EB, 0xD0FB, 0x54ED, 0xADFA, 0x54EE, 0xADFD, 0x54F1, 0xD0FE, 0x54F2, 0xADF5, 0x54F3, 0xD0F5, + 0x54F7, 0xD142, 0x54F8, 0xD143, 0x54FA, 0xADF7, 0x54FB, 0xD141, 0x54FC, 0xADF3, 0x54FD, 0xAE43, 0x54FF, 0xD0F8, 0x5501, 0xADF1, + 0x5503, 0xD146, 0x5504, 0xD0F9, 0x5505, 0xD0FD, 0x5506, 0xADF6, 0x5507, 0xAE42, 0x5508, 0xD0FA, 0x5509, 0xADFC, 0x550A, 0xD140, + 0x550B, 0xD147, 0x550C, 0xD4A1, 0x550E, 0xD145, 0x550F, 0xAE44, 0x5510, 0xADF0, 0x5511, 0xD0FC, 0x5512, 0xD0F3, 0x5514, 0xADF8, + 0x5517, 0xD0F2, 0x551A, 0xD0F7, 0x5526, 0xD0F0, 0x5527, 0xAE41, 0x552A, 0xD477, 0x552C, 0xB0E4, 0x552D, 0xD4A7, 0x552E, 0xB0E2, + 0x552F, 0xB0DF, 0x5530, 0xD47C, 0x5531, 0xB0DB, 0x5532, 0xD4A2, 0x5533, 0xB0E6, 0x5534, 0xD476, 0x5535, 0xD47B, 0x5536, 0xD47A, + 0x5537, 0xADF2, 0x5538, 0xB0E1, 0x5539, 0xD4A5, 0x553B, 0xD4A8, 0x553C, 0xD473, 0x553E, 0xB3E8, 0x5540, 0xD4A9, 0x5541, 0xB0E7, + 0x5543, 0xB0D9, 0x5544, 0xB0D6, 0x5545, 0xD47E, 0x5546, 0xB0D3, 0x5548, 0xD4A6, 0x554A, 0xB0DA, 0x554B, 0xD4AA, 0x554D, 0xD474, + 0x554E, 0xD4A4, 0x554F, 0xB0DD, 0x5550, 0xD475, 0x5551, 0xD478, 0x5552, 0xD47D, 0x5555, 0xB0DE, 0x5556, 0xB0DC, 0x5557, 0xB0E8, + 0x555C, 0xB0E3, 0x555E, 0xB0D7, 0x555F, 0xB1D2, 0x5561, 0xB0D8, 0x5562, 0xD479, 0x5563, 0xB0E5, 0x5564, 0xB0E0, 0x5565, 0xD4A3, + 0x5566, 0xB0D5, 0x556A, 0xB0D4, 0x5575, 0xD471, 0x5576, 0xD472, 0x5577, 0xD86A, 0x557B, 0xB3D7, 0x557C, 0xB3DA, 0x557D, 0xD875, + 0x557E, 0xB3EE, 0x557F, 0xD878, 0x5580, 0xB3D8, 0x5581, 0xD871, 0x5582, 0xB3DE, 0x5583, 0xB3E4, 0x5584, 0xB5BD, 0x5587, 0xB3E2, + 0x5588, 0xD86E, 0x5589, 0xB3EF, 0x558A, 0xB3DB, 0x558B, 0xB3E3, 0x558C, 0xD876, 0x558D, 0xDCD7, 0x558E, 0xD87B, 0x558F, 0xD86F, + 0x5591, 0xD866, 0x5592, 0xD873, 0x5593, 0xD86D, 0x5594, 0xB3E1, 0x5595, 0xD879, 0x5598, 0xB3DD, 0x5599, 0xB3F1, 0x559A, 0xB3EA, + 0x559C, 0xB3DF, 0x559D, 0xB3DC, 0x559F, 0xB3E7, 0x55A1, 0xD87A, 0x55A2, 0xD86C, 0x55A3, 0xD872, 0x55A4, 0xD874, 0x55A5, 0xD868, + 0x55A6, 0xD877, 0x55A7, 0xB3D9, 0x55A8, 0xD867, 0x55AA, 0xB3E0, 0x55AB, 0xB3F0, 0x55AC, 0xB3EC, 0x55AD, 0xD869, 0x55AE, 0xB3E6, + 0x55B1, 0xB3ED, 0x55B2, 0xB3E9, 0x55B3, 0xB3E5, 0x55B5, 0xD870, 0x55BB, 0xB3EB, 0x55BF, 0xDCD5, 0x55C0, 0xDCD1, 0x55C2, 0xDCE0, + 0x55C3, 0xDCCA, 0x55C4, 0xDCD3, 0x55C5, 0xB6E5, 0x55C6, 0xB6E6, 0x55C7, 0xB6DE, 0x55C8, 0xDCDC, 0x55C9, 0xB6E8, 0x55CA, 0xDCCF, + 0x55CB, 0xDCCE, 0x55CC, 0xDCCC, 0x55CD, 0xDCDE, 0x55CE, 0xB6DC, 0x55CF, 0xDCD8, 0x55D0, 0xDCCD, 0x55D1, 0xB6DF, 0x55D2, 0xDCD6, + 0x55D3, 0xB6DA, 0x55D4, 0xDCD2, 0x55D5, 0xDCD9, 0x55D6, 0xDCDB, 0x55D9, 0xDCDF, 0x55DA, 0xB6E3, 0x55DB, 0xDCCB, 0x55DC, 0xB6DD, + 0x55DD, 0xDCD0, 0x55DF, 0xB6D8, 0x55E1, 0xB6E4, 0x55E2, 0xDCDA, 0x55E3, 0xB6E0, 0x55E4, 0xB6E1, 0x55E5, 0xB6E7, 0x55E6, 0xB6DB, + 0x55E7, 0xA25F, 0x55E8, 0xB6D9, 0x55E9, 0xDCD4, 0x55EF, 0xB6E2, 0x55F2, 0xDCDD, 0x55F6, 0xB9CD, 0x55F7, 0xB9C8, 0x55F9, 0xE155, + 0x55FA, 0xE151, 0x55FC, 0xE14B, 0x55FD, 0xB9C2, 0x55FE, 0xB9BE, 0x55FF, 0xE154, 0x5600, 0xB9BF, 0x5601, 0xE14E, 0x5602, 0xE150, + 0x5604, 0xE153, 0x5606, 0xB9C4, 0x5608, 0xB9CB, 0x5609, 0xB9C5, 0x560C, 0xE149, 0x560D, 0xB9C6, 0x560E, 0xB9C7, 0x560F, 0xE14C, + 0x5610, 0xB9CC, 0x5612, 0xE14A, 0x5613, 0xE14F, 0x5614, 0xB9C3, 0x5615, 0xE148, 0x5616, 0xB9C9, 0x5617, 0xB9C1, 0x561B, 0xB9C0, + 0x561C, 0xE14D, 0x561D, 0xE152, 0x561F, 0xB9CA, 0x5627, 0xE147, 0x5629, 0xBC4D, 0x562A, 0xE547, 0x562C, 0xE544, 0x562E, 0xBC47, + 0x562F, 0xBC53, 0x5630, 0xBC54, 0x5632, 0xBC4A, 0x5633, 0xE542, 0x5634, 0xBC4C, 0x5635, 0xE4F9, 0x5636, 0xBC52, 0x5638, 0xE546, + 0x5639, 0xBC49, 0x563A, 0xE548, 0x563B, 0xBC48, 0x563D, 0xE543, 0x563E, 0xE545, 0x563F, 0xBC4B, 0x5640, 0xE541, 0x5641, 0xE4FA, + 0x5642, 0xE4F7, 0x5645, 0xD86B, 0x5646, 0xE4FD, 0x5648, 0xE4F6, 0x5649, 0xE4FC, 0x564A, 0xE4FB, 0x564C, 0xE4F8, 0x564E, 0xBC4F, + 0x5653, 0xBC4E, 0x5657, 0xBC50, 0x5658, 0xE4FE, 0x5659, 0xBEB2, 0x565A, 0xE540, 0x565E, 0xE945, 0x5660, 0xE8FD, 0x5662, 0xBEBE, + 0x5663, 0xE942, 0x5664, 0xBEB6, 0x5665, 0xBEBA, 0x5666, 0xE941, 0x5668, 0xBEB9, 0x5669, 0xBEB5, 0x566A, 0xBEB8, 0x566B, 0xBEB3, + 0x566C, 0xBEBD, 0x566D, 0xE943, 0x566E, 0xE8FE, 0x566F, 0xBEBC, 0x5670, 0xE8FC, 0x5671, 0xBEBB, 0x5672, 0xE944, 0x5673, 0xE940, + 0x5674, 0xBC51, 0x5676, 0xBEBF, 0x5677, 0xE946, 0x5678, 0xBEB7, 0x5679, 0xBEB4, 0x567E, 0xECC6, 0x567F, 0xECC8, 0x5680, 0xC07B, + 0x5681, 0xECC9, 0x5682, 0xECC7, 0x5683, 0xECC5, 0x5684, 0xECC4, 0x5685, 0xC07D, 0x5686, 0xECC3, 0x5687, 0xC07E, 0x568C, 0xECC1, + 0x568D, 0xECC2, 0x568E, 0xC07A, 0x568F, 0xC0A1, 0x5690, 0xC07C, 0x5693, 0xECC0, 0x5695, 0xC250, 0x5697, 0xEFBC, 0x5698, 0xEFBA, + 0x5699, 0xEFBF, 0x569A, 0xEFBD, 0x569C, 0xEFBB, 0x569D, 0xEFBE, 0x56A5, 0xC360, 0x56A6, 0xF1F2, 0x56A7, 0xF1F3, 0x56A8, 0xC456, + 0x56AA, 0xF1F4, 0x56AB, 0xF1F0, 0x56AC, 0xF1F5, 0x56AD, 0xF1F1, 0x56AE, 0xC251, 0x56B2, 0xF3FE, 0x56B3, 0xF441, 0x56B4, 0xC459, + 0x56B5, 0xF440, 0x56B6, 0xC458, 0x56B7, 0xC457, 0x56BC, 0xC45A, 0x56BD, 0xF5C5, 0x56BE, 0xF5C6, 0x56C0, 0xC4DA, 0x56C1, 0xC4D9, + 0x56C2, 0xC4DB, 0x56C3, 0xF5C4, 0x56C5, 0xF6D8, 0x56C6, 0xF6D7, 0x56C8, 0xC56D, 0x56C9, 0xC56F, 0x56CA, 0xC56E, 0x56CB, 0xF6D9, + 0x56CC, 0xC5C8, 0x56CD, 0xF8A6, 0x56D1, 0xC5F1, 0x56D3, 0xF8A5, 0x56D4, 0xF8EE, 0x56D7, 0xC949, 0x56DA, 0xA57D, 0x56DB, 0xA57C, + 0x56DD, 0xA65F, 0x56DE, 0xA65E, 0x56DF, 0xC9C7, 0x56E0, 0xA65D, 0x56E1, 0xC9C6, 0x56E4, 0xA779, 0x56E5, 0xCAA9, 0x56E7, 0xCAA8, + 0x56EA, 0xA777, 0x56EB, 0xA77A, 0x56EE, 0xCAA7, 0x56F0, 0xA778, 0x56F7, 0xCBF0, 0x56F9, 0xCBF1, 0x56FA, 0xA954, 0x56FF, 0xABAA, + 0x5701, 0xD148, 0x5702, 0xD149, 0x5703, 0xAE45, 0x5704, 0xAE46, 0x5707, 0xD4AC, 0x5708, 0xB0E9, 0x5709, 0xB0EB, 0x570A, 0xD4AB, + 0x570B, 0xB0EA, 0x570C, 0xD87C, 0x570D, 0xB3F2, 0x5712, 0xB6E9, 0x5713, 0xB6EA, 0x5714, 0xDCE1, 0x5716, 0xB9CF, 0x5718, 0xB9CE, + 0x571A, 0xE549, 0x571B, 0xE948, 0x571C, 0xE947, 0x571E, 0xF96B, 0x571F, 0xA467, 0x5720, 0xC959, 0x5722, 0xC96E, 0x5723, 0xC96F, + 0x5728, 0xA662, 0x5729, 0xA666, 0x572A, 0xC9C9, 0x572C, 0xA664, 0x572D, 0xA663, 0x572E, 0xC9C8, 0x572F, 0xA665, 0x5730, 0xA661, + 0x5733, 0xA660, 0x5734, 0xC9CA, 0x573B, 0xA7A6, 0x573E, 0xA7A3, 0x5740, 0xA77D, 0x5741, 0xCAAA, 0x5745, 0xCAAB, 0x5747, 0xA7A1, + 0x5749, 0xCAAD, 0x574A, 0xA77B, 0x574B, 0xCAAE, 0x574C, 0xCAAC, 0x574D, 0xA77E, 0x574E, 0xA7A2, 0x574F, 0xA7A5, 0x5750, 0xA7A4, + 0x5751, 0xA77C, 0x5752, 0xCAAF, 0x5761, 0xA959, 0x5762, 0xCBFE, 0x5764, 0xA95B, 0x5766, 0xA95A, 0x5768, 0xCC40, 0x5769, 0xA958, + 0x576A, 0xA957, 0x576B, 0xCBF5, 0x576D, 0xCBF4, 0x576F, 0xCBF2, 0x5770, 0xCBF7, 0x5771, 0xCBF6, 0x5772, 0xCBF3, 0x5773, 0xCBFC, + 0x5774, 0xCBFD, 0x5775, 0xCBFA, 0x5776, 0xCBF8, 0x5777, 0xA956, 0x577B, 0xCBFB, 0x577C, 0xA95C, 0x577D, 0xCC41, 0x5780, 0xCBF9, + 0x5782, 0xABAB, 0x5783, 0xA955, 0x578B, 0xABAC, 0x578C, 0xCE54, 0x578F, 0xCE5A, 0x5793, 0xABB2, 0x5794, 0xCE58, 0x5795, 0xCE5E, + 0x5797, 0xCE55, 0x5798, 0xCE59, 0x5799, 0xCE5B, 0x579A, 0xCE5D, 0x579B, 0xCE57, 0x579D, 0xCE56, 0x579E, 0xCE51, 0x579F, 0xCE52, + 0x57A0, 0xABAD, 0x57A2, 0xABAF, 0x57A3, 0xABAE, 0x57A4, 0xCE53, 0x57A5, 0xCE5C, 0x57AE, 0xABB1, 0x57B5, 0xCE50, 0x57B6, 0xD153, + 0x57B8, 0xD152, 0x57B9, 0xD157, 0x57BA, 0xD14E, 0x57BC, 0xD151, 0x57BD, 0xD150, 0x57BF, 0xD154, 0x57C1, 0xD158, 0x57C2, 0xAE47, + 0x57C3, 0xAE4A, 0x57C6, 0xD14F, 0x57C7, 0xD155, 0x57CB, 0xAE49, 0x57CC, 0xD14A, 0x57CE, 0xABB0, 0x57CF, 0xD4BA, 0x57D0, 0xD156, + 0x57D2, 0xD14D, 0x57D4, 0xAE48, 0x57D5, 0xD14C, 0x57DC, 0xD4B1, 0x57DF, 0xB0EC, 0x57E0, 0xB0F0, 0x57E1, 0xD4C1, 0x57E2, 0xD4AF, + 0x57E3, 0xD4BD, 0x57E4, 0xB0F1, 0x57E5, 0xD4BF, 0x57E7, 0xD4C5, 0x57E9, 0xD4C9, 0x57EC, 0xD4C0, 0x57ED, 0xD4B4, 0x57EE, 0xD4BC, + 0x57F0, 0xD4CA, 0x57F1, 0xD4C8, 0x57F2, 0xD4BE, 0x57F3, 0xD4B9, 0x57F4, 0xD4B2, 0x57F5, 0xD8A6, 0x57F6, 0xD4B0, 0x57F7, 0xB0F5, + 0x57F8, 0xD4B7, 0x57F9, 0xB0F6, 0x57FA, 0xB0F2, 0x57FB, 0xD4AD, 0x57FC, 0xD4C3, 0x57FD, 0xD4B5, 0x5800, 0xD4B3, 0x5801, 0xD4C6, + 0x5802, 0xB0F3, 0x5804, 0xD4CC, 0x5805, 0xB0ED, 0x5806, 0xB0EF, 0x5807, 0xD4BB, 0x5808, 0xD4B6, 0x5809, 0xAE4B, 0x580A, 0xB0EE, + 0x580B, 0xD4B8, 0x580C, 0xD4C7, 0x580D, 0xD4CB, 0x580E, 0xD4C2, 0x5810, 0xD4C4, 0x5814, 0xD4AE, 0x5819, 0xD8A1, 0x581B, 0xD8AA, + 0x581C, 0xD8A9, 0x581D, 0xB3FA, 0x581E, 0xD8A2, 0x5820, 0xB3FB, 0x5821, 0xB3F9, 0x5823, 0xD8A4, 0x5824, 0xB3F6, 0x5825, 0xD8A8, + 0x5827, 0xD8A3, 0x5828, 0xD8A5, 0x5829, 0xD87D, 0x582A, 0xB3F4, 0x582C, 0xD8B2, 0x582D, 0xD8B1, 0x582E, 0xD8AE, 0x582F, 0xB3F3, + 0x5830, 0xB3F7, 0x5831, 0xB3F8, 0x5832, 0xD14B, 0x5833, 0xD8AB, 0x5834, 0xB3F5, 0x5835, 0xB0F4, 0x5836, 0xD8AD, 0x5837, 0xD87E, + 0x5838, 0xD8B0, 0x5839, 0xD8AF, 0x583B, 0xD8B3, 0x583D, 0xDCEF, 0x583F, 0xD8AC, 0x5848, 0xD8A7, 0x5849, 0xDCE7, 0x584A, 0xB6F4, + 0x584B, 0xB6F7, 0x584C, 0xB6F2, 0x584D, 0xDCE6, 0x584E, 0xDCEA, 0x584F, 0xDCE5, 0x5851, 0xB6EC, 0x5852, 0xB6F6, 0x5853, 0xDCE2, + 0x5854, 0xB6F0, 0x5855, 0xDCE9, 0x5857, 0xB6EE, 0x5858, 0xB6ED, 0x5859, 0xDCEC, 0x585A, 0xB6EF, 0x585B, 0xDCEE, 0x585D, 0xDCEB, + 0x585E, 0xB6EB, 0x5862, 0xB6F5, 0x5863, 0xDCF0, 0x5864, 0xDCE4, 0x5865, 0xDCED, 0x5868, 0xDCE3, 0x586B, 0xB6F1, 0x586D, 0xB6F3, + 0x586F, 0xDCE8, 0x5871, 0xDCF1, 0x5874, 0xE15D, 0x5875, 0xB9D0, 0x5876, 0xE163, 0x5879, 0xB9D5, 0x587A, 0xE15F, 0x587B, 0xE166, + 0x587C, 0xE157, 0x587D, 0xB9D7, 0x587E, 0xB9D1, 0x587F, 0xE15C, 0x5880, 0xBC55, 0x5881, 0xE15B, 0x5882, 0xE164, 0x5883, 0xB9D2, + 0x5885, 0xB9D6, 0x5886, 0xE15A, 0x5887, 0xE160, 0x5888, 0xE165, 0x5889, 0xE156, 0x588A, 0xB9D4, 0x588B, 0xE15E, 0x588E, 0xE162, + 0x588F, 0xE168, 0x5890, 0xE158, 0x5891, 0xE161, 0x5893, 0xB9D3, 0x5894, 0xE167, 0x5898, 0xE159, 0x589C, 0xBC59, 0x589D, 0xE54B, + 0x589E, 0xBC57, 0x589F, 0xBC56, 0x58A0, 0xE54D, 0x58A1, 0xE552, 0x58A3, 0xE54E, 0x58A5, 0xE551, 0x58A6, 0xBC5C, 0x58A8, 0xBEA5, + 0x58A9, 0xBC5B, 0x58AB, 0xE54A, 0x58AC, 0xE550, 0x58AE, 0xBC5A, 0x58AF, 0xE54F, 0x58B1, 0xE54C, 0x58B3, 0xBC58, 0x58BA, 0xE94D, + 0x58BB, 0xF9D9, 0x58BC, 0xE94F, 0x58BD, 0xE94A, 0x58BE, 0xBEC1, 0x58BF, 0xE94C, 0x58C1, 0xBEC0, 0x58C2, 0xE94E, 0x58C5, 0xBEC3, + 0x58C6, 0xE950, 0x58C7, 0xBEC2, 0x58C8, 0xE949, 0x58C9, 0xE94B, 0x58CE, 0xC0A5, 0x58CF, 0xECCC, 0x58D1, 0xC0A4, 0x58D2, 0xECCD, + 0x58D3, 0xC0A3, 0x58D4, 0xECCB, 0x58D5, 0xC0A2, 0x58D6, 0xECCA, 0x58D8, 0xC253, 0x58D9, 0xC252, 0x58DA, 0xF1F6, 0x58DB, 0xF1F8, + 0x58DD, 0xF1F7, 0x58DE, 0xC361, 0x58DF, 0xC362, 0x58E2, 0xC363, 0x58E3, 0xF442, 0x58E4, 0xC45B, 0x58E7, 0xF7D3, 0x58E8, 0xF7D2, + 0x58E9, 0xC5F2, 0x58EB, 0xA468, 0x58EC, 0xA4D0, 0x58EF, 0xA7A7, 0x58F4, 0xCE5F, 0x58F9, 0xB3FC, 0x58FA, 0xB3FD, 0x58FC, 0xDCF2, + 0x58FD, 0xB9D8, 0x58FE, 0xE169, 0x58FF, 0xE553, 0x5903, 0xC95A, 0x5906, 0xCAB0, 0x590C, 0xCC42, 0x590D, 0xCE60, 0x590E, 0xD159, + 0x590F, 0xAE4C, 0x5912, 0xF1F9, 0x5914, 0xC4DC, 0x5915, 0xA469, 0x5916, 0xA57E, 0x5917, 0xC970, 0x5919, 0xA667, 0x591A, 0xA668, + 0x591C, 0xA95D, 0x5920, 0xB0F7, 0x5922, 0xB9DA, 0x5924, 0xB9DB, 0x5925, 0xB9D9, 0x5927, 0xA46A, 0x5929, 0xA4D1, 0x592A, 0xA4D3, + 0x592B, 0xA4D2, 0x592C, 0xC95B, 0x592D, 0xA4D4, 0x592E, 0xA5A1, 0x592F, 0xC971, 0x5931, 0xA5A2, 0x5937, 0xA669, 0x5938, 0xA66A, + 0x593C, 0xC9CB, 0x593E, 0xA7A8, 0x5940, 0xCAB1, 0x5944, 0xA961, 0x5945, 0xCC43, 0x5947, 0xA95F, 0x5948, 0xA960, 0x5949, 0xA95E, + 0x594A, 0xD15A, 0x594E, 0xABB6, 0x594F, 0xABB5, 0x5950, 0xABB7, 0x5951, 0xABB4, 0x5953, 0xCE61, 0x5954, 0xA962, 0x5955, 0xABB3, + 0x5957, 0xAE4D, 0x5958, 0xAE4E, 0x595A, 0xAE4F, 0x595C, 0xD4CD, 0x5960, 0xB3FE, 0x5961, 0xD8B4, 0x5962, 0xB0F8, 0x5967, 0xB6F8, + 0x5969, 0xB9DD, 0x596A, 0xB9DC, 0x596B, 0xE16A, 0x596D, 0xBC5D, 0x596E, 0xBEC4, 0x5970, 0xEFC0, 0x5971, 0xF6DA, 0x5972, 0xF7D4, + 0x5973, 0xA46B, 0x5974, 0xA5A3, 0x5976, 0xA5A4, 0x5977, 0xC9D1, 0x5978, 0xA66C, 0x5979, 0xA66F, 0x597B, 0xC9CF, 0x597C, 0xC9CD, + 0x597D, 0xA66E, 0x597E, 0xC9D0, 0x597F, 0xC9D2, 0x5980, 0xC9CC, 0x5981, 0xA671, 0x5982, 0xA670, 0x5983, 0xA66D, 0x5984, 0xA66B, + 0x5985, 0xC9CE, 0x598A, 0xA7B3, 0x598D, 0xA7B0, 0x598E, 0xCAB6, 0x598F, 0xCAB9, 0x5990, 0xCAB8, 0x5992, 0xA7AA, 0x5993, 0xA7B2, + 0x5996, 0xA7AF, 0x5997, 0xCAB5, 0x5998, 0xCAB3, 0x5999, 0xA7AE, 0x599D, 0xA7A9, 0x599E, 0xA7AC, 0x59A0, 0xCAB4, 0x59A1, 0xCABB, + 0x59A2, 0xCAB7, 0x59A3, 0xA7AD, 0x59A4, 0xA7B1, 0x59A5, 0xA7B4, 0x59A6, 0xCAB2, 0x59A7, 0xCABA, 0x59A8, 0xA7AB, 0x59AE, 0xA967, + 0x59AF, 0xA96F, 0x59B1, 0xCC4F, 0x59B2, 0xCC48, 0x59B3, 0xA970, 0x59B4, 0xCC53, 0x59B5, 0xCC44, 0x59B6, 0xCC4B, 0x59B9, 0xA966, + 0x59BA, 0xCC45, 0x59BB, 0xA964, 0x59BC, 0xCC4C, 0x59BD, 0xCC50, 0x59BE, 0xA963, 0x59C0, 0xCC51, 0x59C1, 0xCC4A, 0x59C3, 0xCC4D, + 0x59C5, 0xA972, 0x59C6, 0xA969, 0x59C7, 0xCC54, 0x59C8, 0xCC52, 0x59CA, 0xA96E, 0x59CB, 0xA96C, 0x59CC, 0xCC49, 0x59CD, 0xA96B, + 0x59CE, 0xCC47, 0x59CF, 0xCC46, 0x59D0, 0xA96A, 0x59D1, 0xA968, 0x59D2, 0xA971, 0x59D3, 0xA96D, 0x59D4, 0xA965, 0x59D6, 0xCC4E, + 0x59D8, 0xABB9, 0x59DA, 0xABC0, 0x59DB, 0xCE6F, 0x59DC, 0xABB8, 0x59DD, 0xCE67, 0x59DE, 0xCE63, 0x59E0, 0xCE73, 0x59E1, 0xCE62, + 0x59E3, 0xABBB, 0x59E4, 0xCE6C, 0x59E5, 0xABBE, 0x59E6, 0xABC1, 0x59E8, 0xABBC, 0x59E9, 0xCE70, 0x59EA, 0xABBF, 0x59EC, 0xAE56, + 0x59ED, 0xCE76, 0x59EE, 0xCE64, 0x59F1, 0xCE66, 0x59F2, 0xCE6D, 0x59F3, 0xCE71, 0x59F4, 0xCE75, 0x59F5, 0xCE72, 0x59F6, 0xCE6B, + 0x59F7, 0xCE6E, 0x59FA, 0xCE68, 0x59FB, 0xABC3, 0x59FC, 0xCE6A, 0x59FD, 0xCE69, 0x59FE, 0xCE74, 0x59FF, 0xABBA, 0x5A00, 0xCE65, + 0x5A01, 0xABC2, 0x5A03, 0xABBD, 0x5A09, 0xAE5C, 0x5A0A, 0xD162, 0x5A0C, 0xAE5B, 0x5A0F, 0xD160, 0x5A11, 0xAE50, 0x5A13, 0xAE55, + 0x5A15, 0xD15F, 0x5A16, 0xD15C, 0x5A17, 0xD161, 0x5A18, 0xAE51, 0x5A19, 0xD15B, 0x5A1B, 0xAE54, 0x5A1C, 0xAE52, 0x5A1E, 0xD163, + 0x5A1F, 0xAE53, 0x5A20, 0xAE57, 0x5A23, 0xAE58, 0x5A25, 0xAE5A, 0x5A29, 0xAE59, 0x5A2D, 0xD15D, 0x5A2E, 0xD15E, 0x5A33, 0xD164, + 0x5A35, 0xD4D4, 0x5A36, 0xB0F9, 0x5A37, 0xD8C2, 0x5A38, 0xD4D3, 0x5A39, 0xD4E6, 0x5A3C, 0xB140, 0x5A3E, 0xD4E4, 0x5A40, 0xB0FE, + 0x5A41, 0xB0FA, 0x5A42, 0xD4ED, 0x5A43, 0xD4DD, 0x5A44, 0xD4E0, 0x5A46, 0xB143, 0x5A47, 0xD4EA, 0x5A48, 0xD4E2, 0x5A49, 0xB0FB, + 0x5A4A, 0xB144, 0x5A4C, 0xD4E7, 0x5A4D, 0xD4E5, 0x5A50, 0xD4D6, 0x5A51, 0xD4EB, 0x5A52, 0xD4DF, 0x5A53, 0xD4DA, 0x5A55, 0xD4D0, + 0x5A56, 0xD4EC, 0x5A57, 0xD4DC, 0x5A58, 0xD4CF, 0x5A5A, 0xB142, 0x5A5B, 0xD4E1, 0x5A5C, 0xD4EE, 0x5A5D, 0xD4DE, 0x5A5E, 0xD4D2, + 0x5A5F, 0xD4D7, 0x5A60, 0xD4CE, 0x5A62, 0xB141, 0x5A64, 0xD4DB, 0x5A65, 0xD4D8, 0x5A66, 0xB0FC, 0x5A67, 0xD4D1, 0x5A69, 0xD4E9, + 0x5A6A, 0xB0FD, 0x5A6C, 0xD4D9, 0x5A6D, 0xD4D5, 0x5A70, 0xD4E8, 0x5A77, 0xB440, 0x5A78, 0xD8BB, 0x5A7A, 0xD8B8, 0x5A7B, 0xD8C9, + 0x5A7C, 0xD8BD, 0x5A7D, 0xD8CA, 0x5A7F, 0xB442, 0x5A83, 0xD8C6, 0x5A84, 0xD8C3, 0x5A8A, 0xD8C4, 0x5A8B, 0xD8C7, 0x5A8C, 0xD8CB, + 0x5A8E, 0xD4E3, 0x5A8F, 0xD8CD, 0x5A90, 0xDD47, 0x5A92, 0xB443, 0x5A93, 0xD8CE, 0x5A94, 0xD8B6, 0x5A95, 0xD8C0, 0x5A97, 0xD8C5, + 0x5A9A, 0xB441, 0x5A9B, 0xB444, 0x5A9C, 0xD8CC, 0x5A9D, 0xD8CF, 0x5A9E, 0xD8BA, 0x5A9F, 0xD8B7, 0x5AA2, 0xD8B9, 0x5AA5, 0xD8BE, + 0x5AA6, 0xD8BC, 0x5AA7, 0xB445, 0x5AA9, 0xD8C8, 0x5AAC, 0xD8BF, 0x5AAE, 0xD8C1, 0x5AAF, 0xD8B5, 0x5AB0, 0xDCFA, 0x5AB1, 0xDCF8, + 0x5AB2, 0xB742, 0x5AB3, 0xB740, 0x5AB4, 0xDD43, 0x5AB5, 0xDCF9, 0x5AB6, 0xDD44, 0x5AB7, 0xDD40, 0x5AB8, 0xDCF7, 0x5AB9, 0xDD46, + 0x5ABA, 0xDCF6, 0x5ABB, 0xDCFD, 0x5ABC, 0xB6FE, 0x5ABD, 0xB6FD, 0x5ABE, 0xB6FC, 0x5ABF, 0xDCFB, 0x5AC0, 0xDD41, 0x5AC1, 0xB6F9, + 0x5AC2, 0xB741, 0x5AC4, 0xDCF4, 0x5AC6, 0xDCFE, 0x5AC7, 0xDCF3, 0x5AC8, 0xDCFC, 0x5AC9, 0xB6FA, 0x5ACA, 0xDD42, 0x5ACB, 0xDCF5, + 0x5ACC, 0xB6FB, 0x5ACD, 0xDD45, 0x5AD5, 0xE16E, 0x5AD6, 0xB9E2, 0x5AD7, 0xB9E1, 0x5AD8, 0xB9E3, 0x5AD9, 0xE17A, 0x5ADA, 0xE170, + 0x5ADB, 0xE176, 0x5ADC, 0xE16B, 0x5ADD, 0xE179, 0x5ADE, 0xE178, 0x5ADF, 0xE17C, 0x5AE0, 0xE175, 0x5AE1, 0xB9DE, 0x5AE2, 0xE174, + 0x5AE3, 0xB9E4, 0x5AE5, 0xE16D, 0x5AE6, 0xB9DF, 0x5AE8, 0xE17B, 0x5AE9, 0xB9E0, 0x5AEA, 0xE16F, 0x5AEB, 0xE172, 0x5AEC, 0xE177, + 0x5AED, 0xE171, 0x5AEE, 0xE16C, 0x5AF3, 0xE173, 0x5AF4, 0xE555, 0x5AF5, 0xBC61, 0x5AF6, 0xE558, 0x5AF7, 0xE557, 0x5AF8, 0xE55A, + 0x5AF9, 0xE55C, 0x5AFA, 0xF9DC, 0x5AFB, 0xBC5F, 0x5AFD, 0xE556, 0x5AFF, 0xE554, 0x5B01, 0xE55D, 0x5B02, 0xE55B, 0x5B03, 0xE559, + 0x5B05, 0xE55F, 0x5B07, 0xE55E, 0x5B08, 0xBC63, 0x5B09, 0xBC5E, 0x5B0B, 0xBC60, 0x5B0C, 0xBC62, 0x5B0F, 0xE560, 0x5B10, 0xE957, + 0x5B13, 0xE956, 0x5B14, 0xE955, 0x5B16, 0xE958, 0x5B17, 0xE951, 0x5B19, 0xE952, 0x5B1A, 0xE95A, 0x5B1B, 0xE953, 0x5B1D, 0xBEC5, + 0x5B1E, 0xE95C, 0x5B20, 0xE95B, 0x5B21, 0xE954, 0x5B23, 0xECD1, 0x5B24, 0xC0A8, 0x5B25, 0xECCF, 0x5B26, 0xECD4, 0x5B27, 0xECD3, + 0x5B28, 0xE959, 0x5B2A, 0xC0A7, 0x5B2C, 0xECD2, 0x5B2D, 0xECCE, 0x5B2E, 0xECD6, 0x5B2F, 0xECD5, 0x5B30, 0xC0A6, 0x5B32, 0xECD0, + 0x5B34, 0xBEC6, 0x5B38, 0xC254, 0x5B3C, 0xEFC1, 0x5B3D, 0xF1FA, 0x5B3E, 0xF1FB, 0x5B3F, 0xF1FC, 0x5B40, 0xC45C, 0x5B43, 0xC45D, + 0x5B45, 0xF443, 0x5B47, 0xF5C8, 0x5B48, 0xF5C7, 0x5B4B, 0xF6DB, 0x5B4C, 0xF6DC, 0x5B4D, 0xF7D5, 0x5B4E, 0xF8A7, 0x5B50, 0xA46C, + 0x5B51, 0xA46D, 0x5B53, 0xA46E, 0x5B54, 0xA4D5, 0x5B55, 0xA5A5, 0x5B56, 0xC9D3, 0x5B57, 0xA672, 0x5B58, 0xA673, 0x5B5A, 0xA7B7, + 0x5B5B, 0xA7B8, 0x5B5C, 0xA7B6, 0x5B5D, 0xA7B5, 0x5B5F, 0xA973, 0x5B62, 0xCC55, 0x5B63, 0xA975, 0x5B64, 0xA974, 0x5B65, 0xCC56, + 0x5B69, 0xABC4, 0x5B6B, 0xAE5D, 0x5B6C, 0xD165, 0x5B6E, 0xD4F0, 0x5B70, 0xB145, 0x5B71, 0xB447, 0x5B72, 0xD4EF, 0x5B73, 0xB446, + 0x5B75, 0xB9E5, 0x5B77, 0xE17D, 0x5B78, 0xBEC7, 0x5B7A, 0xC0A9, 0x5B7B, 0xECD7, 0x5B7D, 0xC45E, 0x5B7F, 0xC570, 0x5B81, 0xC972, + 0x5B83, 0xA5A6, 0x5B84, 0xC973, 0x5B85, 0xA676, 0x5B87, 0xA674, 0x5B88, 0xA675, 0x5B89, 0xA677, 0x5B8B, 0xA7BA, 0x5B8C, 0xA7B9, + 0x5B8E, 0xCABC, 0x5B8F, 0xA7BB, 0x5B92, 0xCABD, 0x5B93, 0xCC57, 0x5B95, 0xCC58, 0x5B97, 0xA976, 0x5B98, 0xA978, 0x5B99, 0xA97A, + 0x5B9A, 0xA977, 0x5B9B, 0xA97B, 0x5B9C, 0xA979, 0x5BA2, 0xABC8, 0x5BA3, 0xABC5, 0x5BA4, 0xABC7, 0x5BA5, 0xABC9, 0x5BA6, 0xABC6, + 0x5BA7, 0xD166, 0x5BA8, 0xCE77, 0x5BAC, 0xD168, 0x5BAD, 0xD167, 0x5BAE, 0xAE63, 0x5BB0, 0xAE5F, 0x5BB3, 0xAE60, 0x5BB4, 0xAE62, + 0x5BB5, 0xAE64, 0x5BB6, 0xAE61, 0x5BB8, 0xAE66, 0x5BB9, 0xAE65, 0x5BBF, 0xB14A, 0x5BC0, 0xD4F2, 0x5BC1, 0xD4F1, 0x5BC2, 0xB149, + 0x5BC4, 0xB148, 0x5BC5, 0xB147, 0x5BC6, 0xB14B, 0x5BC7, 0xB146, 0x5BCA, 0xD8D5, 0x5BCB, 0xD8D2, 0x5BCC, 0xB449, 0x5BCD, 0xD8D1, + 0x5BCE, 0xD8D6, 0x5BD0, 0xB44B, 0x5BD1, 0xD8D4, 0x5BD2, 0xB448, 0x5BD3, 0xB44A, 0x5BD4, 0xD8D3, 0x5BD6, 0xDD48, 0x5BD8, 0xDD49, + 0x5BD9, 0xDD4A, 0x5BDE, 0xB9E6, 0x5BDF, 0xB9EE, 0x5BE0, 0xE17E, 0x5BE1, 0xB9E8, 0x5BE2, 0xB9EC, 0x5BE3, 0xE1A1, 0x5BE4, 0xB9ED, + 0x5BE5, 0xB9E9, 0x5BE6, 0xB9EA, 0x5BE7, 0xB9E7, 0x5BE8, 0xB9EB, 0x5BE9, 0xBC66, 0x5BEA, 0xD8D0, 0x5BEB, 0xBC67, 0x5BEC, 0xBC65, + 0x5BEE, 0xBC64, 0x5BEF, 0xE95D, 0x5BF0, 0xBEC8, 0x5BF1, 0xECD8, 0x5BF2, 0xECD9, 0x5BF5, 0xC364, 0x5BF6, 0xC45F, 0x5BF8, 0xA46F, + 0x5BFA, 0xA678, 0x5C01, 0xABCA, 0x5C03, 0xD169, 0x5C04, 0xAE67, 0x5C07, 0xB14E, 0x5C08, 0xB14D, 0x5C09, 0xB14C, 0x5C0A, 0xB44C, + 0x5C0B, 0xB44D, 0x5C0C, 0xD8D7, 0x5C0D, 0xB9EF, 0x5C0E, 0xBEC9, 0x5C0F, 0xA470, 0x5C10, 0xC95C, 0x5C11, 0xA4D6, 0x5C12, 0xC974, + 0x5C15, 0xC9D4, 0x5C16, 0xA679, 0x5C1A, 0xA97C, 0x5C1F, 0xDD4B, 0x5C22, 0xA471, 0x5C24, 0xA4D7, 0x5C25, 0xC9D5, 0x5C28, 0xCABE, + 0x5C2A, 0xCABF, 0x5C2C, 0xA7BC, 0x5C30, 0xD8D8, 0x5C31, 0xB44E, 0x5C33, 0xDD4C, 0x5C37, 0xC0AA, 0x5C38, 0xA472, 0x5C39, 0xA4A8, + 0x5C3A, 0xA4D8, 0x5C3B, 0xC975, 0x5C3C, 0xA5A7, 0x5C3E, 0xA7C0, 0x5C3F, 0xA7BF, 0x5C40, 0xA7BD, 0x5C41, 0xA7BE, 0x5C44, 0xCC59, + 0x5C45, 0xA97E, 0x5C46, 0xA9A1, 0x5C47, 0xCC5A, 0x5C48, 0xA97D, 0x5C4B, 0xABCE, 0x5C4C, 0xCE78, 0x5C4D, 0xABCD, 0x5C4E, 0xABCB, + 0x5C4F, 0xABCC, 0x5C50, 0xAE6A, 0x5C51, 0xAE68, 0x5C54, 0xD16B, 0x5C55, 0xAE69, 0x5C56, 0xD16A, 0x5C58, 0xAE5E, 0x5C59, 0xD4F3, + 0x5C5C, 0xB150, 0x5C5D, 0xB151, 0x5C60, 0xB14F, 0x5C62, 0xB9F0, 0x5C63, 0xE1A2, 0x5C64, 0xBC68, 0x5C65, 0xBC69, 0x5C67, 0xE561, + 0x5C68, 0xC0AB, 0x5C69, 0xEFC2, 0x5C6A, 0xEFC3, 0x5C6C, 0xC4DD, 0x5C6D, 0xF8A8, 0x5C6E, 0xC94B, 0x5C6F, 0xA4D9, 0x5C71, 0xA473, + 0x5C73, 0xC977, 0x5C74, 0xC976, 0x5C79, 0xA67A, 0x5C7A, 0xC9D7, 0x5C7B, 0xC9D8, 0x5C7C, 0xC9D6, 0x5C7E, 0xC9D9, 0x5C86, 0xCAC7, + 0x5C88, 0xCAC2, 0x5C89, 0xCAC4, 0x5C8A, 0xCAC6, 0x5C8B, 0xCAC3, 0x5C8C, 0xA7C4, 0x5C8D, 0xCAC0, 0x5C8F, 0xCAC1, 0x5C90, 0xA7C1, + 0x5C91, 0xA7C2, 0x5C92, 0xCAC5, 0x5C93, 0xCAC8, 0x5C94, 0xA7C3, 0x5C95, 0xCAC9, 0x5C9D, 0xCC68, 0x5C9F, 0xCC62, 0x5CA0, 0xCC5D, + 0x5CA1, 0xA9A3, 0x5CA2, 0xCC65, 0x5CA3, 0xCC63, 0x5CA4, 0xCC5C, 0x5CA5, 0xCC69, 0x5CA6, 0xCC6C, 0x5CA7, 0xCC67, 0x5CA8, 0xCC60, + 0x5CA9, 0xA9A5, 0x5CAA, 0xCC66, 0x5CAB, 0xA9A6, 0x5CAC, 0xCC61, 0x5CAD, 0xCC64, 0x5CAE, 0xCC5B, 0x5CAF, 0xCC5F, 0x5CB0, 0xCC6B, + 0x5CB1, 0xA9A7, 0x5CB3, 0xA9A8, 0x5CB5, 0xCC5E, 0x5CB6, 0xCC6A, 0x5CB7, 0xA9A2, 0x5CB8, 0xA9A4, 0x5CC6, 0xCEAB, 0x5CC7, 0xCEA4, + 0x5CC8, 0xCEAA, 0x5CC9, 0xCEA3, 0x5CCA, 0xCEA5, 0x5CCB, 0xCE7D, 0x5CCC, 0xCE7B, 0x5CCE, 0xCEAC, 0x5CCF, 0xCEA9, 0x5CD0, 0xCE79, + 0x5CD2, 0xABD0, 0x5CD3, 0xCEA7, 0x5CD4, 0xCEA8, 0x5CD6, 0xCEA6, 0x5CD7, 0xCE7C, 0x5CD8, 0xCE7A, 0x5CD9, 0xABCF, 0x5CDA, 0xCEA2, + 0x5CDB, 0xCE7E, 0x5CDE, 0xCEA1, 0x5CDF, 0xCEAD, 0x5CE8, 0xAE6F, 0x5CEA, 0xAE6E, 0x5CEC, 0xD16C, 0x5CED, 0xAE6B, 0x5CEE, 0xD16E, + 0x5CF0, 0xAE70, 0x5CF1, 0xD16F, 0x5CF4, 0xAE73, 0x5CF6, 0xAE71, 0x5CF7, 0xD170, 0x5CF8, 0xCEAE, 0x5CF9, 0xD172, 0x5CFB, 0xAE6D, + 0x5CFD, 0xAE6C, 0x5CFF, 0xD16D, 0x5D00, 0xD171, 0x5D01, 0xAE72, 0x5D06, 0xB153, 0x5D07, 0xB152, 0x5D0B, 0xD4F5, 0x5D0C, 0xD4F9, + 0x5D0D, 0xD4FB, 0x5D0E, 0xB154, 0x5D0F, 0xD4FE, 0x5D11, 0xB158, 0x5D12, 0xD541, 0x5D14, 0xB15A, 0x5D16, 0xB156, 0x5D17, 0xB15E, + 0x5D19, 0xB15B, 0x5D1A, 0xD4F7, 0x5D1B, 0xB155, 0x5D1D, 0xD4F6, 0x5D1E, 0xD4F4, 0x5D1F, 0xD543, 0x5D20, 0xD4F8, 0x5D22, 0xB157, + 0x5D23, 0xD542, 0x5D24, 0xB15C, 0x5D25, 0xD4FD, 0x5D26, 0xD4FC, 0x5D27, 0xB15D, 0x5D28, 0xD4FA, 0x5D29, 0xB159, 0x5D2E, 0xD544, + 0x5D30, 0xD540, 0x5D31, 0xD8E7, 0x5D32, 0xD8EE, 0x5D33, 0xD8E3, 0x5D34, 0xB451, 0x5D35, 0xD8DF, 0x5D36, 0xD8EF, 0x5D37, 0xD8D9, + 0x5D38, 0xD8EC, 0x5D39, 0xD8EA, 0x5D3A, 0xD8E4, 0x5D3C, 0xD8ED, 0x5D3D, 0xD8E6, 0x5D3F, 0xD8DE, 0x5D40, 0xD8F0, 0x5D41, 0xD8DC, + 0x5D42, 0xD8E9, 0x5D43, 0xD8DA, 0x5D45, 0xD8F1, 0x5D47, 0xB452, 0x5D49, 0xD8EB, 0x5D4A, 0xDD4F, 0x5D4B, 0xD8DD, 0x5D4C, 0xB44F, + 0x5D4E, 0xD8E1, 0x5D50, 0xB450, 0x5D51, 0xD8E0, 0x5D52, 0xD8E5, 0x5D55, 0xD8E2, 0x5D59, 0xD8E8, 0x5D5E, 0xDD53, 0x5D62, 0xDD56, + 0x5D63, 0xDD4E, 0x5D65, 0xDD50, 0x5D67, 0xDD55, 0x5D68, 0xDD54, 0x5D69, 0xB743, 0x5D6B, 0xD8DB, 0x5D6C, 0xDD52, 0x5D6F, 0xB744, + 0x5D71, 0xDD4D, 0x5D72, 0xDD51, 0x5D77, 0xE1A9, 0x5D79, 0xE1B0, 0x5D7A, 0xE1A7, 0x5D7C, 0xE1AE, 0x5D7D, 0xE1A5, 0x5D7E, 0xE1AD, + 0x5D7F, 0xE1B1, 0x5D80, 0xE1A4, 0x5D81, 0xE1A8, 0x5D82, 0xE1A3, 0x5D84, 0xB9F1, 0x5D86, 0xE1A6, 0x5D87, 0xB9F2, 0x5D88, 0xE1AC, + 0x5D89, 0xE1AB, 0x5D8A, 0xE1AA, 0x5D8D, 0xE1AF, 0x5D92, 0xE565, 0x5D93, 0xE567, 0x5D94, 0xBC6B, 0x5D95, 0xE568, 0x5D97, 0xE563, + 0x5D99, 0xE562, 0x5D9A, 0xE56C, 0x5D9C, 0xE56A, 0x5D9D, 0xBC6A, 0x5D9E, 0xE56D, 0x5D9F, 0xE564, 0x5DA0, 0xE569, 0x5DA1, 0xE56B, + 0x5DA2, 0xE566, 0x5DA7, 0xE961, 0x5DA8, 0xE966, 0x5DA9, 0xE960, 0x5DAA, 0xE965, 0x5DAC, 0xE95E, 0x5DAD, 0xE968, 0x5DAE, 0xE964, + 0x5DAF, 0xE969, 0x5DB0, 0xE963, 0x5DB1, 0xE95F, 0x5DB2, 0xE967, 0x5DB4, 0xE96A, 0x5DB5, 0xE962, 0x5DB7, 0xECDA, 0x5DB8, 0xC0AF, + 0x5DBA, 0xC0AD, 0x5DBC, 0xC0AC, 0x5DBD, 0xC0AE, 0x5DC0, 0xEFC4, 0x5DC2, 0xF172, 0x5DC3, 0xF1FD, 0x5DC6, 0xF444, 0x5DC7, 0xF445, + 0x5DC9, 0xC460, 0x5DCB, 0xF5C9, 0x5DCD, 0xC4DE, 0x5DCF, 0xF5CA, 0x5DD1, 0xF6DE, 0x5DD2, 0xC572, 0x5DD4, 0xC571, 0x5DD5, 0xF6DD, + 0x5DD6, 0xC5C9, 0x5DD8, 0xF7D6, 0x5DDD, 0xA474, 0x5DDE, 0xA67B, 0x5DDF, 0xC9DA, 0x5DE0, 0xCACA, 0x5DE1, 0xA8B5, 0x5DE2, 0xB15F, + 0x5DE5, 0xA475, 0x5DE6, 0xA5AA, 0x5DE7, 0xA5A9, 0x5DE8, 0xA5A8, 0x5DEB, 0xA7C5, 0x5DEE, 0xAE74, 0x5DF0, 0xDD57, 0x5DF1, 0xA476, + 0x5DF2, 0xA477, 0x5DF3, 0xA478, 0x5DF4, 0xA4DA, 0x5DF7, 0xABD1, 0x5DF9, 0xCEAF, 0x5DFD, 0xB453, 0x5DFE, 0xA479, 0x5DFF, 0xC95D, + 0x5E02, 0xA5AB, 0x5E03, 0xA5AC, 0x5E04, 0xC978, 0x5E06, 0xA67C, 0x5E0A, 0xCACB, 0x5E0C, 0xA7C6, 0x5E0E, 0xCACC, 0x5E11, 0xA9AE, + 0x5E14, 0xCC6E, 0x5E15, 0xA9AC, 0x5E16, 0xA9AB, 0x5E17, 0xCC6D, 0x5E18, 0xA9A9, 0x5E19, 0xCC6F, 0x5E1A, 0xA9AA, 0x5E1B, 0xA9AD, + 0x5E1D, 0xABD2, 0x5E1F, 0xABD4, 0x5E20, 0xCEB3, 0x5E21, 0xCEB0, 0x5E22, 0xCEB1, 0x5E23, 0xCEB2, 0x5E24, 0xCEB4, 0x5E25, 0xABD3, + 0x5E28, 0xD174, 0x5E29, 0xD173, 0x5E2B, 0xAE76, 0x5E2D, 0xAE75, 0x5E33, 0xB162, 0x5E34, 0xD546, 0x5E36, 0xB161, 0x5E37, 0xB163, + 0x5E38, 0xB160, 0x5E3D, 0xB455, 0x5E3E, 0xD545, 0x5E40, 0xB456, 0x5E41, 0xD8F3, 0x5E43, 0xB457, 0x5E44, 0xD8F2, 0x5E45, 0xB454, + 0x5E4A, 0xDD5A, 0x5E4B, 0xDD5C, 0x5E4C, 0xB745, 0x5E4D, 0xDD5B, 0x5E4E, 0xDD59, 0x5E4F, 0xDD58, 0x5E53, 0xE1B4, 0x5E54, 0xB9F7, + 0x5E55, 0xB9F5, 0x5E57, 0xB9F6, 0x5E58, 0xE1B2, 0x5E59, 0xE1B3, 0x5E5B, 0xB9F3, 0x5E5C, 0xE571, 0x5E5D, 0xE56F, 0x5E5F, 0xBC6D, + 0x5E60, 0xE570, 0x5E61, 0xBC6E, 0x5E62, 0xBC6C, 0x5E63, 0xB9F4, 0x5E66, 0xE96D, 0x5E67, 0xE96B, 0x5E68, 0xE96C, 0x5E69, 0xE56E, + 0x5E6A, 0xECDC, 0x5E6B, 0xC0B0, 0x5E6C, 0xECDB, 0x5E6D, 0xEFC5, 0x5E6E, 0xEFC6, 0x5E6F, 0xE96E, 0x5E70, 0xF1FE, 0x5E72, 0xA47A, + 0x5E73, 0xA5AD, 0x5E74, 0xA67E, 0x5E75, 0xC9DB, 0x5E76, 0xA67D, 0x5E78, 0xA9AF, 0x5E79, 0xB746, 0x5E7B, 0xA4DB, 0x5E7C, 0xA5AE, + 0x5E7D, 0xABD5, 0x5E7E, 0xB458, 0x5E80, 0xC979, 0x5E82, 0xC97A, 0x5E84, 0xC9DC, 0x5E87, 0xA7C8, 0x5E88, 0xCAD0, 0x5E89, 0xCACE, + 0x5E8A, 0xA7C9, 0x5E8B, 0xCACD, 0x5E8C, 0xCACF, 0x5E8D, 0xCAD1, 0x5E8F, 0xA7C7, 0x5E95, 0xA9B3, 0x5E96, 0xA9B4, 0x5E97, 0xA9B1, + 0x5E9A, 0xA9B0, 0x5E9B, 0xCEB8, 0x5E9C, 0xA9B2, 0x5EA0, 0xABD6, 0x5EA2, 0xCEB7, 0x5EA3, 0xCEB9, 0x5EA4, 0xCEB6, 0x5EA5, 0xCEBA, + 0x5EA6, 0xABD7, 0x5EA7, 0xAE79, 0x5EA8, 0xD175, 0x5EAA, 0xD177, 0x5EAB, 0xAE77, 0x5EAC, 0xD178, 0x5EAD, 0xAE78, 0x5EAE, 0xD176, + 0x5EB0, 0xCEB5, 0x5EB1, 0xD547, 0x5EB2, 0xD54A, 0x5EB3, 0xD54B, 0x5EB4, 0xD548, 0x5EB5, 0xB167, 0x5EB6, 0xB166, 0x5EB7, 0xB164, + 0x5EB8, 0xB165, 0x5EB9, 0xD549, 0x5EBE, 0xB168, 0x5EC1, 0xB45A, 0x5EC2, 0xB45B, 0x5EC4, 0xB45C, 0x5EC5, 0xDD5D, 0x5EC6, 0xDD5F, + 0x5EC7, 0xDD61, 0x5EC8, 0xB748, 0x5EC9, 0xB747, 0x5ECA, 0xB459, 0x5ECB, 0xDD60, 0x5ECC, 0xDD5E, 0x5ECE, 0xE1B8, 0x5ED1, 0xE1B6, + 0x5ED2, 0xE1BC, 0x5ED3, 0xB9F8, 0x5ED4, 0xE1BD, 0x5ED5, 0xE1BA, 0x5ED6, 0xB9F9, 0x5ED7, 0xE1B7, 0x5ED8, 0xE1B5, 0x5ED9, 0xE1BB, + 0x5EDA, 0xBC70, 0x5EDB, 0xE573, 0x5EDC, 0xE1B9, 0x5EDD, 0xBC72, 0x5EDE, 0xE574, 0x5EDF, 0xBC71, 0x5EE0, 0xBC74, 0x5EE1, 0xE575, + 0x5EE2, 0xBC6F, 0x5EE3, 0xBC73, 0x5EE5, 0xE973, 0x5EE6, 0xE971, 0x5EE7, 0xE970, 0x5EE8, 0xE972, 0x5EE9, 0xE96F, 0x5EEC, 0xC366, + 0x5EEE, 0xF446, 0x5EEF, 0xF447, 0x5EF1, 0xF5CB, 0x5EF2, 0xF6DF, 0x5EF3, 0xC655, 0x5EF6, 0xA9B5, 0x5EF7, 0xA7CA, 0x5EFA, 0xABD8, + 0x5EFE, 0xA47B, 0x5EFF, 0xA4DC, 0x5F01, 0xA5AF, 0x5F02, 0xC9DD, 0x5F04, 0xA7CB, 0x5F05, 0xCAD2, 0x5F07, 0xCEBB, 0x5F08, 0xABD9, + 0x5F0A, 0xB9FA, 0x5F0B, 0xA47C, 0x5F0F, 0xA6A1, 0x5F12, 0xB749, 0x5F13, 0xA47D, 0x5F14, 0xA4DD, 0x5F15, 0xA4DE, 0x5F17, 0xA5B1, + 0x5F18, 0xA5B0, 0x5F1A, 0xC9DE, 0x5F1B, 0xA6A2, 0x5F1D, 0xCAD3, 0x5F1F, 0xA7CC, 0x5F22, 0xCC71, 0x5F23, 0xCC72, 0x5F24, 0xCC73, + 0x5F26, 0xA9B6, 0x5F27, 0xA9B7, 0x5F28, 0xCC70, 0x5F29, 0xA9B8, 0x5F2D, 0xABDA, 0x5F2E, 0xCEBC, 0x5F30, 0xD17A, 0x5F31, 0xAE7A, + 0x5F33, 0xD179, 0x5F35, 0xB169, 0x5F36, 0xD54C, 0x5F37, 0xB16A, 0x5F38, 0xD54D, 0x5F3C, 0xB45D, 0x5F40, 0xDD62, 0x5F43, 0xE1BF, + 0x5F44, 0xE1BE, 0x5F46, 0xB9FB, 0x5F48, 0xBC75, 0x5F49, 0xE576, 0x5F4A, 0xBECA, 0x5F4B, 0xE974, 0x5F4C, 0xC0B1, 0x5F4E, 0xC573, + 0x5F4F, 0xF7D8, 0x5F54, 0xCC74, 0x5F56, 0xCEBD, 0x5F57, 0xB16B, 0x5F58, 0xD8F4, 0x5F59, 0xB74A, 0x5F5D, 0xC255, 0x5F62, 0xA7CE, + 0x5F64, 0xA7CD, 0x5F65, 0xABDB, 0x5F67, 0xD17B, 0x5F69, 0xB16D, 0x5F6A, 0xB343, 0x5F6B, 0xB16E, 0x5F6C, 0xB16C, 0x5F6D, 0xB45E, + 0x5F6F, 0xE1C0, 0x5F70, 0xB9FC, 0x5F71, 0xBC76, 0x5F73, 0xC94C, 0x5F74, 0xC9DF, 0x5F76, 0xCAD5, 0x5F77, 0xA7CF, 0x5F78, 0xCAD4, + 0x5F79, 0xA7D0, 0x5F7C, 0xA9BC, 0x5F7D, 0xCC77, 0x5F7E, 0xCC76, 0x5F7F, 0xA9BB, 0x5F80, 0xA9B9, 0x5F81, 0xA9BA, 0x5F82, 0xCC75, + 0x5F85, 0xABDD, 0x5F86, 0xCEBE, 0x5F87, 0xABE0, 0x5F88, 0xABDC, 0x5F89, 0xABE2, 0x5F8A, 0xABDE, 0x5F8B, 0xABDF, 0x5F8C, 0xABE1, + 0x5F90, 0xAE7D, 0x5F91, 0xAE7C, 0x5F92, 0xAE7B, 0x5F96, 0xD54F, 0x5F97, 0xB16F, 0x5F98, 0xB172, 0x5F99, 0xB170, 0x5F9B, 0xD54E, + 0x5F9C, 0xB175, 0x5F9E, 0xB171, 0x5F9F, 0xD550, 0x5FA0, 0xB174, 0x5FA1, 0xB173, 0x5FA5, 0xD8F6, 0x5FA6, 0xD8F5, 0x5FA8, 0xB461, + 0x5FA9, 0xB45F, 0x5FAA, 0xB460, 0x5FAB, 0xD8F7, 0x5FAC, 0xB74B, 0x5FAD, 0xDD64, 0x5FAE, 0xB74C, 0x5FAF, 0xDD63, 0x5FB2, 0xE577, + 0x5FB5, 0xBC78, 0x5FB6, 0xE1C1, 0x5FB7, 0xBC77, 0x5FB9, 0xB9FD, 0x5FBB, 0xECDE, 0x5FBC, 0xE975, 0x5FBD, 0xC0B2, 0x5FBE, 0xECDD, + 0x5FBF, 0xF240, 0x5FC0, 0xF448, 0x5FC1, 0xF449, 0x5FC3, 0xA4DF, 0x5FC5, 0xA5B2, 0x5FC9, 0xC97B, 0x5FCC, 0xA7D2, 0x5FCD, 0xA7D4, + 0x5FCF, 0xC9E2, 0x5FD0, 0xCAD8, 0x5FD1, 0xCAD7, 0x5FD2, 0xCAD6, 0x5FD4, 0xC9E1, 0x5FD5, 0xC9E0, 0x5FD6, 0xA6A4, 0x5FD7, 0xA7D3, + 0x5FD8, 0xA7D1, 0x5FD9, 0xA6A3, 0x5FDD, 0xA9BD, 0x5FDE, 0xCC78, 0x5FE0, 0xA9BE, 0x5FE1, 0xCADD, 0x5FE3, 0xCADF, 0x5FE4, 0xCADE, + 0x5FE5, 0xCC79, 0x5FE8, 0xCADA, 0x5FEA, 0xA7D8, 0x5FEB, 0xA7D6, 0x5FED, 0xCAD9, 0x5FEE, 0xCADB, 0x5FEF, 0xCAE1, 0x5FF1, 0xA7D5, + 0x5FF3, 0xCADC, 0x5FF4, 0xCAE5, 0x5FF5, 0xA9C0, 0x5FF7, 0xCAE2, 0x5FF8, 0xA7D7, 0x5FFA, 0xCAE0, 0x5FFB, 0xCAE3, 0x5FFD, 0xA9BF, + 0x5FFF, 0xA9C1, 0x6000, 0xCAE4, 0x6009, 0xCCAF, 0x600A, 0xCCA2, 0x600B, 0xCC7E, 0x600C, 0xCCAE, 0x600D, 0xCCA9, 0x600E, 0xABE7, + 0x600F, 0xA9C2, 0x6010, 0xCCAA, 0x6011, 0xCCAD, 0x6012, 0xABE3, 0x6013, 0xCCAC, 0x6014, 0xA9C3, 0x6015, 0xA9C8, 0x6016, 0xA9C6, + 0x6017, 0xCCA3, 0x6019, 0xCC7C, 0x601A, 0xCCA5, 0x601B, 0xA9CD, 0x601C, 0xCCB0, 0x601D, 0xABE4, 0x601E, 0xCCA6, 0x6020, 0xABE5, + 0x6021, 0xA9C9, 0x6022, 0xCCA8, 0x6024, 0xCECD, 0x6025, 0xABE6, 0x6026, 0xCC7B, 0x6027, 0xA9CA, 0x6028, 0xABE8, 0x6029, 0xA9CB, + 0x602A, 0xA9C7, 0x602B, 0xA9CC, 0x602C, 0xCCA7, 0x602D, 0xCC7A, 0x602E, 0xCCAB, 0x602F, 0xA9C4, 0x6032, 0xCC7D, 0x6033, 0xCCA4, + 0x6034, 0xCCA1, 0x6035, 0xA9C5, 0x6037, 0xCEBF, 0x6039, 0xCEC0, 0x6040, 0xCECA, 0x6041, 0xD1A1, 0x6042, 0xCECB, 0x6043, 0xABEE, + 0x6044, 0xCECE, 0x6045, 0xCEC4, 0x6046, 0xABED, 0x6047, 0xCEC6, 0x6049, 0xCEC7, 0x604C, 0xCEC9, 0x604D, 0xABE9, 0x6050, 0xAEA3, + 0x6052, 0xF9DA, 0x6053, 0xCEC5, 0x6054, 0xCEC1, 0x6055, 0xAEA4, 0x6058, 0xCECF, 0x6059, 0xAE7E, 0x605A, 0xD17D, 0x605B, 0xCEC8, + 0x605D, 0xD17C, 0x605E, 0xCEC3, 0x605F, 0xCECC, 0x6062, 0xABEC, 0x6063, 0xAEA1, 0x6064, 0xABF2, 0x6065, 0xAEA2, 0x6066, 0xCED0, + 0x6067, 0xD17E, 0x6068, 0xABEB, 0x6069, 0xAEA6, 0x606A, 0xABF1, 0x606B, 0xABF0, 0x606C, 0xABEF, 0x606D, 0xAEA5, 0x606E, 0xCED1, + 0x606F, 0xAEA7, 0x6070, 0xABEA, 0x6072, 0xCEC2, 0x607F, 0xB176, 0x6080, 0xD1A4, 0x6081, 0xD1A6, 0x6083, 0xD1A8, 0x6084, 0xAEA8, + 0x6085, 0xAEAE, 0x6086, 0xD553, 0x6087, 0xD1AC, 0x6088, 0xD1A3, 0x6089, 0xB178, 0x608A, 0xD551, 0x608C, 0xAEAD, 0x608D, 0xAEAB, + 0x608E, 0xD1AE, 0x6090, 0xD552, 0x6092, 0xD1A5, 0x6094, 0xAEAC, 0x6095, 0xD1A9, 0x6096, 0xAEAF, 0x6097, 0xD1AB, 0x609A, 0xAEAA, + 0x609B, 0xD1AA, 0x609C, 0xD1AD, 0x609D, 0xD1A7, 0x609F, 0xAEA9, 0x60A0, 0xB179, 0x60A2, 0xD1A2, 0x60A3, 0xB177, 0x60A8, 0xB17A, + 0x60B0, 0xD555, 0x60B1, 0xD55E, 0x60B2, 0xB464, 0x60B4, 0xB17C, 0x60B5, 0xB1A3, 0x60B6, 0xB465, 0x60B7, 0xD560, 0x60B8, 0xB1AA, + 0x60B9, 0xD8F9, 0x60BA, 0xD556, 0x60BB, 0xB1A2, 0x60BC, 0xB1A5, 0x60BD, 0xB17E, 0x60BE, 0xD554, 0x60BF, 0xD562, 0x60C0, 0xD565, + 0x60C1, 0xD949, 0x60C3, 0xD563, 0x60C4, 0xD8FD, 0x60C5, 0xB1A1, 0x60C6, 0xB1A8, 0x60C7, 0xB1AC, 0x60C8, 0xD55D, 0x60C9, 0xD8F8, + 0x60CA, 0xD561, 0x60CB, 0xB17B, 0x60CC, 0xD8FA, 0x60CD, 0xD564, 0x60CE, 0xD8FC, 0x60CF, 0xD559, 0x60D1, 0xB462, 0x60D3, 0xD557, + 0x60D4, 0xD558, 0x60D5, 0xB1A7, 0x60D8, 0xB1A6, 0x60D9, 0xD55B, 0x60DA, 0xB1AB, 0x60DB, 0xD55F, 0x60DC, 0xB1A4, 0x60DD, 0xD55C, + 0x60DF, 0xB1A9, 0x60E0, 0xB466, 0x60E1, 0xB463, 0x60E2, 0xD8FB, 0x60E4, 0xD55A, 0x60E6, 0xB17D, 0x60F0, 0xB46B, 0x60F1, 0xB46F, + 0x60F2, 0xD940, 0x60F3, 0xB751, 0x60F4, 0xB46D, 0x60F5, 0xD944, 0x60F6, 0xB471, 0x60F7, 0xDD65, 0x60F8, 0xD946, 0x60F9, 0xB753, + 0x60FA, 0xB469, 0x60FB, 0xB46C, 0x60FC, 0xD947, 0x60FE, 0xD948, 0x60FF, 0xD94E, 0x6100, 0xB473, 0x6101, 0xB754, 0x6103, 0xD94A, + 0x6104, 0xD94F, 0x6105, 0xD943, 0x6106, 0xB75E, 0x6108, 0xB755, 0x6109, 0xB472, 0x610A, 0xD941, 0x610B, 0xD950, 0x610D, 0xB75D, + 0x610E, 0xB470, 0x610F, 0xB74E, 0x6110, 0xD94D, 0x6112, 0xB474, 0x6113, 0xD945, 0x6114, 0xD8FE, 0x6115, 0xB46A, 0x6116, 0xD942, + 0x6118, 0xD94B, 0x611A, 0xB74D, 0x611B, 0xB752, 0x611C, 0xB467, 0x611D, 0xD94C, 0x611F, 0xB750, 0x6123, 0xB468, 0x6127, 0xB75C, + 0x6128, 0xE1C3, 0x6129, 0xDD70, 0x612B, 0xDD68, 0x612C, 0xE1C2, 0x612E, 0xDD6C, 0x612F, 0xDD6E, 0x6132, 0xDD6B, 0x6134, 0xB75B, + 0x6136, 0xDD6A, 0x6137, 0xB75F, 0x613B, 0xE1D2, 0x613E, 0xB75A, 0x613F, 0xBA40, 0x6140, 0xDD71, 0x6141, 0xE1C4, 0x6144, 0xB758, + 0x6145, 0xDD69, 0x6146, 0xDD6D, 0x6147, 0xB9FE, 0x6148, 0xB74F, 0x6149, 0xDD66, 0x614A, 0xDD67, 0x614B, 0xBA41, 0x614C, 0xB757, + 0x614D, 0xB759, 0x614E, 0xB756, 0x614F, 0xDD6F, 0x6152, 0xE1C8, 0x6153, 0xE1C9, 0x6154, 0xE1CE, 0x6155, 0xBC7D, 0x6156, 0xE1D5, + 0x6158, 0xBA47, 0x615A, 0xBA46, 0x615B, 0xE1D0, 0x615D, 0xBC7C, 0x615E, 0xE1C5, 0x615F, 0xBA45, 0x6161, 0xE1D4, 0x6162, 0xBA43, + 0x6163, 0xBA44, 0x6165, 0xE1D1, 0x6166, 0xE5AA, 0x6167, 0xBC7A, 0x6168, 0xB46E, 0x616A, 0xE1D3, 0x616B, 0xBCA3, 0x616C, 0xE1CB, + 0x616E, 0xBC7B, 0x6170, 0xBCA2, 0x6171, 0xE1C6, 0x6172, 0xE1CA, 0x6173, 0xE1C7, 0x6174, 0xE1CD, 0x6175, 0xBA48, 0x6176, 0xBC79, + 0x6177, 0xBA42, 0x6179, 0xE57A, 0x617A, 0xE1CF, 0x617C, 0xBCA1, 0x617E, 0xBCA4, 0x6180, 0xE1CC, 0x6182, 0xBC7E, 0x6183, 0xE579, + 0x6189, 0xE57E, 0x618A, 0xBECE, 0x618B, 0xE578, 0x618C, 0xE9A3, 0x618D, 0xE5A9, 0x618E, 0xBCA8, 0x6190, 0xBCA6, 0x6191, 0xBECC, + 0x6192, 0xE5A6, 0x6193, 0xE5A2, 0x6194, 0xBCAC, 0x6196, 0xE978, 0x619A, 0xBCAA, 0x619B, 0xE5A1, 0x619D, 0xE976, 0x619F, 0xE5A5, + 0x61A1, 0xE5A8, 0x61A2, 0xE57D, 0x61A4, 0xBCAB, 0x61A7, 0xBCA5, 0x61A8, 0xE977, 0x61A9, 0xBECD, 0x61AA, 0xE5A7, 0x61AB, 0xBCA7, + 0x61AC, 0xBCA9, 0x61AD, 0xE5A4, 0x61AE, 0xBCAD, 0x61AF, 0xE5A3, 0x61B0, 0xE57C, 0x61B1, 0xE57B, 0x61B2, 0xBECB, 0x61B3, 0xE5AB, + 0x61B4, 0xE97A, 0x61B5, 0xECE0, 0x61B6, 0xBED0, 0x61B8, 0xE9A2, 0x61BA, 0xE97E, 0x61BC, 0xECE1, 0x61BE, 0xBED1, 0x61BF, 0xE9A1, + 0x61C1, 0xE97C, 0x61C2, 0xC0B4, 0x61C3, 0xECDF, 0x61C5, 0xE979, 0x61C6, 0xE97B, 0x61C7, 0xC0B5, 0x61C8, 0xBED3, 0x61C9, 0xC0B3, + 0x61CA, 0xBED2, 0x61CB, 0xC0B7, 0x61CC, 0xE97D, 0x61CD, 0xBECF, 0x61D6, 0xEFCF, 0x61D8, 0xEFC7, 0x61DE, 0xECE7, 0x61DF, 0xEFC8, + 0x61E0, 0xECE3, 0x61E3, 0xC256, 0x61E4, 0xECE5, 0x61E5, 0xECE4, 0x61E6, 0xC0B6, 0x61E7, 0xECE2, 0x61E8, 0xECE6, 0x61E9, 0xEFD0, + 0x61EA, 0xEFCC, 0x61EB, 0xEFCE, 0x61ED, 0xEFC9, 0x61EE, 0xEFCA, 0x61F0, 0xEFCD, 0x61F1, 0xEFCB, 0x61F2, 0xC367, 0x61F5, 0xC36A, + 0x61F6, 0xC369, 0x61F7, 0xC368, 0x61F8, 0xC461, 0x61F9, 0xF44A, 0x61FA, 0xC462, 0x61FB, 0xF241, 0x61FC, 0xC4DF, 0x61FD, 0xF5CC, + 0x61FE, 0xC4E0, 0x61FF, 0xC574, 0x6200, 0xC5CA, 0x6201, 0xF7D9, 0x6203, 0xF7DA, 0x6204, 0xF7DB, 0x6207, 0xF9BA, 0x6208, 0xA4E0, + 0x6209, 0xC97C, 0x620A, 0xA5B3, 0x620C, 0xA6A6, 0x620D, 0xA6A7, 0x620E, 0xA6A5, 0x6210, 0xA6A8, 0x6211, 0xA7DA, 0x6212, 0xA7D9, + 0x6214, 0xCCB1, 0x6215, 0xA9CF, 0x6216, 0xA9CE, 0x6219, 0xD1AF, 0x621A, 0xB1AD, 0x621B, 0xB1AE, 0x621F, 0xB475, 0x6220, 0xDD72, + 0x6221, 0xB760, 0x6222, 0xB761, 0x6223, 0xDD74, 0x6224, 0xDD76, 0x6225, 0xDD75, 0x6227, 0xE1D7, 0x6229, 0xE1D6, 0x622A, 0xBA49, + 0x622B, 0xE1D8, 0x622D, 0xE5AC, 0x622E, 0xBCAE, 0x6230, 0xBED4, 0x6232, 0xC0B8, 0x6233, 0xC257, 0x6234, 0xC0B9, 0x6236, 0xA4E1, + 0x623A, 0xCAE6, 0x623D, 0xCCB2, 0x623E, 0xA9D1, 0x623F, 0xA9D0, 0x6240, 0xA9D2, 0x6241, 0xABF3, 0x6242, 0xCED2, 0x6243, 0xCED3, + 0x6246, 0xD1B0, 0x6247, 0xAEB0, 0x6248, 0xB1AF, 0x6249, 0xB476, 0x624A, 0xD951, 0x624B, 0xA4E2, 0x624D, 0xA47E, 0x624E, 0xA4E3, + 0x6250, 0xC97D, 0x6251, 0xA5B7, 0x6252, 0xA5B6, 0x6253, 0xA5B4, 0x6254, 0xA5B5, 0x6258, 0xA6AB, 0x6259, 0xC9E9, 0x625A, 0xC9EB, + 0x625B, 0xA6AA, 0x625C, 0xC9E3, 0x625E, 0xC9E4, 0x6260, 0xC9EA, 0x6261, 0xC9E6, 0x6262, 0xC9E8, 0x6263, 0xA6A9, 0x6264, 0xC9E5, + 0x6265, 0xC9EC, 0x6266, 0xC9E7, 0x626D, 0xA7E1, 0x626E, 0xA7EA, 0x626F, 0xA7E8, 0x6270, 0xCAF0, 0x6271, 0xCAED, 0x6272, 0xCAF5, + 0x6273, 0xA7E6, 0x6274, 0xCAF6, 0x6276, 0xA7DF, 0x6277, 0xCAF3, 0x6279, 0xA7E5, 0x627A, 0xCAEF, 0x627B, 0xCAEE, 0x627C, 0xA7E3, + 0x627D, 0xCAF4, 0x627E, 0xA7E4, 0x627F, 0xA9D3, 0x6280, 0xA7DE, 0x6281, 0xCAF1, 0x6283, 0xCAE7, 0x6284, 0xA7DB, 0x6286, 0xA7EE, + 0x6287, 0xCAEC, 0x6288, 0xCAF2, 0x6289, 0xA7E0, 0x628A, 0xA7E2, 0x628C, 0xCAE8, 0x628E, 0xCAE9, 0x628F, 0xCAEA, 0x6291, 0xA7ED, + 0x6292, 0xA7E7, 0x6293, 0xA7EC, 0x6294, 0xCAEB, 0x6295, 0xA7EB, 0x6296, 0xA7DD, 0x6297, 0xA7DC, 0x6298, 0xA7E9, 0x62A8, 0xA9E1, + 0x62A9, 0xCCBE, 0x62AA, 0xCCB7, 0x62AB, 0xA9DC, 0x62AC, 0xA9EF, 0x62AD, 0xCCB3, 0x62AE, 0xCCBA, 0x62AF, 0xCCBC, 0x62B0, 0xCCBF, + 0x62B1, 0xA9EA, 0x62B3, 0xCCBB, 0x62B4, 0xCCB4, 0x62B5, 0xA9E8, 0x62B6, 0xCCB8, 0x62B8, 0xCCC0, 0x62B9, 0xA9D9, 0x62BB, 0xCCBD, + 0x62BC, 0xA9E3, 0x62BD, 0xA9E2, 0x62BE, 0xCCB6, 0x62BF, 0xA9D7, 0x62C2, 0xA9D8, 0x62C4, 0xA9D6, 0x62C6, 0xA9EE, 0x62C7, 0xA9E6, + 0x62C8, 0xA9E0, 0x62C9, 0xA9D4, 0x62CA, 0xCCB9, 0x62CB, 0xA9DF, 0x62CC, 0xA9D5, 0x62CD, 0xA9E7, 0x62CE, 0xA9F0, 0x62CF, 0xCED4, + 0x62D0, 0xA9E4, 0x62D1, 0xCCB5, 0x62D2, 0xA9DA, 0x62D3, 0xA9DD, 0x62D4, 0xA9DE, 0x62D6, 0xA9EC, 0x62D7, 0xA9ED, 0x62D8, 0xA9EB, + 0x62D9, 0xA9E5, 0x62DA, 0xA9E9, 0x62DB, 0xA9DB, 0x62DC, 0xABF4, 0x62EB, 0xCEDA, 0x62EC, 0xAC41, 0x62ED, 0xABF8, 0x62EE, 0xABFA, + 0x62EF, 0xAC40, 0x62F0, 0xCEE6, 0x62F1, 0xABFD, 0x62F2, 0xD1B1, 0x62F3, 0xAEB1, 0x62F4, 0xAC43, 0x62F5, 0xCED7, 0x62F6, 0xCEDF, + 0x62F7, 0xABFE, 0x62F8, 0xCEDE, 0x62F9, 0xCEDB, 0x62FA, 0xCEE3, 0x62FB, 0xCEE5, 0x62FC, 0xABF7, 0x62FD, 0xABFB, 0x62FE, 0xAC42, + 0x62FF, 0xAEB3, 0x6300, 0xCEE0, 0x6301, 0xABF9, 0x6302, 0xAC45, 0x6303, 0xCED9, 0x6307, 0xABFC, 0x6308, 0xAEB2, 0x6309, 0xABF6, + 0x630B, 0xCED6, 0x630C, 0xCEDD, 0x630D, 0xCED5, 0x630E, 0xCED8, 0x630F, 0xCEDC, 0x6310, 0xD1B2, 0x6311, 0xAC44, 0x6313, 0xCEE1, + 0x6314, 0xCEE2, 0x6315, 0xCEE4, 0x6316, 0xABF5, 0x6328, 0xAEC1, 0x6329, 0xD1BE, 0x632A, 0xAEBF, 0x632B, 0xAEC0, 0x632C, 0xD1B4, + 0x632D, 0xD1C4, 0x632F, 0xAEB6, 0x6332, 0xD566, 0x6333, 0xD1C6, 0x6334, 0xD1C0, 0x6336, 0xD1B7, 0x6338, 0xD1C9, 0x6339, 0xD1BA, + 0x633A, 0xAEBC, 0x633B, 0xD57D, 0x633C, 0xD1BD, 0x633D, 0xAEBE, 0x633E, 0xAEB5, 0x6340, 0xD1CB, 0x6341, 0xD1BF, 0x6342, 0xAEB8, + 0x6343, 0xD1B8, 0x6344, 0xD1B5, 0x6345, 0xD1B6, 0x6346, 0xAEB9, 0x6347, 0xD1C5, 0x6348, 0xD1CC, 0x6349, 0xAEBB, 0x634A, 0xD1BC, + 0x634B, 0xD1BB, 0x634C, 0xAEC3, 0x634D, 0xAEC2, 0x634E, 0xAEB4, 0x634F, 0xAEBA, 0x6350, 0xAEBD, 0x6351, 0xD1C8, 0x6354, 0xD1C2, + 0x6355, 0xAEB7, 0x6356, 0xD1B3, 0x6357, 0xD1CA, 0x6358, 0xD1C1, 0x6359, 0xD1C3, 0x635A, 0xD1C7, 0x6365, 0xD567, 0x6367, 0xB1B7, + 0x6368, 0xB1CB, 0x6369, 0xB1CA, 0x636B, 0xB1BF, 0x636D, 0xD579, 0x636E, 0xD575, 0x636F, 0xD572, 0x6370, 0xD5A6, 0x6371, 0xB1BA, + 0x6372, 0xB1B2, 0x6375, 0xD577, 0x6376, 0xB4A8, 0x6377, 0xB1B6, 0x6378, 0xD5A1, 0x637A, 0xB1CC, 0x637B, 0xB1C9, 0x637C, 0xD57B, + 0x637D, 0xD56A, 0x6380, 0xB1C8, 0x6381, 0xD5A3, 0x6382, 0xD569, 0x6383, 0xB1BD, 0x6384, 0xB1C1, 0x6385, 0xD5A2, 0x6387, 0xD573, + 0x6388, 0xB1C2, 0x6389, 0xB1BC, 0x638A, 0xD568, 0x638C, 0xB478, 0x638D, 0xD5A5, 0x638E, 0xD571, 0x638F, 0xB1C7, 0x6390, 0xD574, + 0x6391, 0xD5A4, 0x6392, 0xB1C6, 0x6394, 0xD952, 0x6396, 0xB1B3, 0x6397, 0xD56F, 0x6398, 0xB1B8, 0x6399, 0xB1C3, 0x639B, 0xB1BE, + 0x639C, 0xD578, 0x639D, 0xD56E, 0x639E, 0xD56C, 0x639F, 0xD57E, 0x63A0, 0xB1B0, 0x63A1, 0xB1C4, 0x63A2, 0xB1B4, 0x63A3, 0xB477, + 0x63A4, 0xD57C, 0x63A5, 0xB1B5, 0x63A7, 0xB1B1, 0x63A8, 0xB1C0, 0x63A9, 0xB1BB, 0x63AA, 0xB1B9, 0x63AB, 0xD570, 0x63AC, 0xB1C5, + 0x63AD, 0xD56D, 0x63AE, 0xD57A, 0x63AF, 0xD576, 0x63B0, 0xD954, 0x63B1, 0xD953, 0x63BD, 0xD56B, 0x63BE, 0xD964, 0x63C0, 0xB47A, + 0x63C2, 0xD96A, 0x63C3, 0xD959, 0x63C4, 0xD967, 0x63C5, 0xDD77, 0x63C6, 0xB47D, 0x63C7, 0xD96B, 0x63C8, 0xD96E, 0x63C9, 0xB47C, + 0x63CA, 0xD95C, 0x63CB, 0xD96D, 0x63CC, 0xD96C, 0x63CD, 0xB47E, 0x63CE, 0xD955, 0x63CF, 0xB479, 0x63D0, 0xB4A3, 0x63D2, 0xB4A1, + 0x63D3, 0xD969, 0x63D5, 0xD95F, 0x63D6, 0xB4A5, 0x63D7, 0xD970, 0x63D8, 0xD968, 0x63D9, 0xD971, 0x63DA, 0xB4AD, 0x63DB, 0xB4AB, + 0x63DC, 0xD966, 0x63DD, 0xD965, 0x63DF, 0xD963, 0x63E0, 0xD95D, 0x63E1, 0xB4A4, 0x63E3, 0xB4A2, 0x63E4, 0xD1B9, 0x63E5, 0xD956, + 0x63E7, 0xDDB7, 0x63E8, 0xD957, 0x63E9, 0xB47B, 0x63EA, 0xB4AA, 0x63EB, 0xDD79, 0x63ED, 0xB4A6, 0x63EE, 0xB4A7, 0x63EF, 0xD958, + 0x63F0, 0xD96F, 0x63F1, 0xDD78, 0x63F2, 0xD960, 0x63F3, 0xD95B, 0x63F4, 0xB4A9, 0x63F5, 0xD961, 0x63F6, 0xD95E, 0x63F9, 0xB4AE, + 0x6406, 0xB770, 0x6409, 0xDD7C, 0x640A, 0xDDB1, 0x640B, 0xDDB6, 0x640C, 0xDDAA, 0x640D, 0xB76C, 0x640E, 0xDDBB, 0x640F, 0xB769, + 0x6410, 0xDD7A, 0x6412, 0xDD7B, 0x6413, 0xB762, 0x6414, 0xB76B, 0x6415, 0xDDA4, 0x6416, 0xB76E, 0x6417, 0xB76F, 0x6418, 0xDDA5, + 0x641A, 0xDDB2, 0x641B, 0xDDB8, 0x641C, 0xB76A, 0x641E, 0xB764, 0x641F, 0xDDA3, 0x6420, 0xDD7D, 0x6421, 0xDDBA, 0x6422, 0xDDA8, + 0x6423, 0xDDA9, 0x6424, 0xDD7E, 0x6425, 0xDDB4, 0x6426, 0xDDAB, 0x6427, 0xDDB5, 0x6428, 0xDDAD, 0x642A, 0xB765, 0x642B, 0xE1D9, + 0x642C, 0xB768, 0x642D, 0xB766, 0x642E, 0xDDB9, 0x642F, 0xDDB0, 0x6430, 0xDDAC, 0x6433, 0xDDA1, 0x6434, 0xBA53, 0x6435, 0xDDAF, + 0x6436, 0xB76D, 0x6437, 0xDDA7, 0x6439, 0xDDA6, 0x643D, 0xB767, 0x643E, 0xB763, 0x643F, 0xE1EE, 0x6440, 0xDDB3, 0x6441, 0xDDAE, + 0x6443, 0xDDA2, 0x644B, 0xE1E9, 0x644D, 0xE1DA, 0x644E, 0xE1E5, 0x6450, 0xE1EC, 0x6451, 0xBA51, 0x6452, 0xB4AC, 0x6453, 0xE1EA, + 0x6454, 0xBA4C, 0x6458, 0xBA4B, 0x6459, 0xE1F1, 0x645B, 0xE1DB, 0x645C, 0xE1E8, 0x645D, 0xE1DC, 0x645E, 0xE1E7, 0x645F, 0xBA4F, + 0x6460, 0xE1EB, 0x6461, 0xD962, 0x6465, 0xE1F2, 0x6466, 0xE1E3, 0x6467, 0xBA52, 0x6468, 0xE5BA, 0x6469, 0xBCAF, 0x646B, 0xE1F0, + 0x646C, 0xE1EF, 0x646D, 0xBA54, 0x646E, 0xE5AD, 0x646F, 0xBCB0, 0x6470, 0xE5AE, 0x6472, 0xE1DF, 0x6473, 0xE1E0, 0x6474, 0xE1DD, + 0x6475, 0xE1E2, 0x6476, 0xE1DE, 0x6477, 0xE1F3, 0x6478, 0xBA4E, 0x6479, 0xBCB1, 0x647A, 0xBA50, 0x647B, 0xBA55, 0x647D, 0xE1E1, + 0x647F, 0xE1ED, 0x6482, 0xE1E6, 0x6485, 0xE5B1, 0x6487, 0xBA4A, 0x6488, 0xBCB4, 0x6489, 0xE9AA, 0x648A, 0xE5B6, 0x648B, 0xE5B5, + 0x648C, 0xE5B7, 0x648F, 0xE5B4, 0x6490, 0xBCB5, 0x6492, 0xBCBB, 0x6493, 0xBCB8, 0x6495, 0xBCB9, 0x6496, 0xE5AF, 0x6497, 0xE5B2, + 0x6498, 0xE5BC, 0x6499, 0xBCC1, 0x649A, 0xBCBF, 0x649C, 0xE5B3, 0x649D, 0xD95A, 0x649E, 0xBCB2, 0x649F, 0xE5B9, 0x64A0, 0xE5B0, + 0x64A2, 0xBCC2, 0x64A3, 0xE5B8, 0x64A4, 0xBA4D, 0x64A5, 0xBCB7, 0x64A6, 0xE1E4, 0x64A9, 0xBCBA, 0x64AB, 0xBCBE, 0x64AC, 0xBCC0, + 0x64AD, 0xBCBD, 0x64AE, 0xBCBC, 0x64B0, 0xBCB6, 0x64B1, 0xE5BB, 0x64B2, 0xBCB3, 0x64B3, 0xBCC3, 0x64BB, 0xBED8, 0x64BC, 0xBED9, + 0x64BD, 0xE9A9, 0x64BE, 0xBEE2, 0x64BF, 0xBEDF, 0x64C1, 0xBED6, 0x64C2, 0xBEDD, 0x64C3, 0xE9AB, 0x64C4, 0xBEDB, 0x64C5, 0xBED5, + 0x64C7, 0xBEDC, 0x64C9, 0xE9A8, 0x64CA, 0xC0BB, 0x64CB, 0xBED7, 0x64CD, 0xBEDE, 0x64CE, 0xC0BA, 0x64CF, 0xE9A7, 0x64D0, 0xE9A6, + 0x64D2, 0xBEE0, 0x64D4, 0xBEE1, 0x64D6, 0xE9A5, 0x64D7, 0xE9A4, 0x64D8, 0xC0BC, 0x64D9, 0xE9AE, 0x64DA, 0xBEDA, 0x64DB, 0xE9AC, + 0x64E0, 0xC0BD, 0x64E2, 0xC0C2, 0x64E3, 0xECEA, 0x64E4, 0xECEC, 0x64E6, 0xC0BF, 0x64E8, 0xECED, 0x64E9, 0xECE9, 0x64EB, 0xECEB, + 0x64EC, 0xC0C0, 0x64ED, 0xC0C3, 0x64EF, 0xECE8, 0x64F0, 0xC0BE, 0x64F1, 0xC0C1, 0x64F2, 0xC259, 0x64F3, 0xE9AD, 0x64F4, 0xC258, + 0x64F7, 0xC25E, 0x64F8, 0xEFD4, 0x64FA, 0xC25C, 0x64FB, 0xC25D, 0x64FC, 0xEFD7, 0x64FD, 0xEFD3, 0x64FE, 0xC25A, 0x64FF, 0xEFD1, + 0x6500, 0xC36B, 0x6501, 0xEFD5, 0x6503, 0xEFD6, 0x6504, 0xEFD2, 0x6506, 0xC25B, 0x6507, 0xF242, 0x6509, 0xF245, 0x650C, 0xF246, + 0x650D, 0xF244, 0x650E, 0xF247, 0x650F, 0xC36C, 0x6510, 0xF243, 0x6513, 0xF44E, 0x6514, 0xC464, 0x6515, 0xF44D, 0x6516, 0xF44C, + 0x6517, 0xF44B, 0x6518, 0xC463, 0x6519, 0xC465, 0x651B, 0xF5CD, 0x651C, 0xC4E2, 0x651D, 0xC4E1, 0x6520, 0xF6E1, 0x6521, 0xF6E0, + 0x6522, 0xF6E3, 0x6523, 0xC5CB, 0x6524, 0xC575, 0x6525, 0xF7DD, 0x6526, 0xF6E2, 0x6529, 0xF7DC, 0x652A, 0xC5CD, 0x652B, 0xC5CC, + 0x652C, 0xC5F3, 0x652D, 0xF8A9, 0x652E, 0xF8EF, 0x652F, 0xA4E4, 0x6532, 0xD972, 0x6533, 0xE9AF, 0x6536, 0xA6AC, 0x6537, 0xCAF7, + 0x6538, 0xA7F1, 0x6539, 0xA7EF, 0x653B, 0xA7F0, 0x653D, 0xCCC1, 0x653E, 0xA9F1, 0x653F, 0xAC46, 0x6541, 0xCEE7, 0x6543, 0xCEE8, + 0x6545, 0xAC47, 0x6546, 0xD1CE, 0x6548, 0xAEC4, 0x6549, 0xAEC5, 0x654A, 0xD1CD, 0x654F, 0xB1D3, 0x6551, 0xB1CF, 0x6553, 0xD5A7, + 0x6554, 0xB1D6, 0x6555, 0xB1D5, 0x6556, 0xB1CE, 0x6557, 0xB1D1, 0x6558, 0xB1D4, 0x6559, 0xB1D0, 0x655C, 0xD976, 0x655D, 0xB1CD, + 0x655E, 0xB4AF, 0x6562, 0xB4B1, 0x6563, 0xB4B2, 0x6564, 0xD975, 0x6565, 0xD978, 0x6566, 0xB4B0, 0x6567, 0xD973, 0x6568, 0xD977, + 0x656A, 0xD974, 0x656C, 0xB771, 0x656F, 0xDDBC, 0x6572, 0xBA56, 0x6573, 0xE1F4, 0x6574, 0xBEE3, 0x6575, 0xBCC4, 0x6576, 0xE5BD, + 0x6577, 0xBCC5, 0x6578, 0xBCC6, 0x6579, 0xE5BF, 0x657A, 0xE5BE, 0x657B, 0xE5C0, 0x657C, 0xE9B1, 0x657F, 0xE9B0, 0x6580, 0xECEF, + 0x6581, 0xECEE, 0x6582, 0xC0C4, 0x6583, 0xC0C5, 0x6584, 0xF248, 0x6587, 0xA4E5, 0x658C, 0xD979, 0x6590, 0xB4B4, 0x6591, 0xB4B3, + 0x6592, 0xDDBD, 0x6594, 0xEFD8, 0x6595, 0xC4E3, 0x6596, 0xF7DE, 0x6597, 0xA4E6, 0x6599, 0xAEC6, 0x659B, 0xB1D8, 0x659C, 0xB1D7, + 0x659D, 0xD97A, 0x659E, 0xD97B, 0x659F, 0xB772, 0x65A0, 0xE1F5, 0x65A1, 0xBA57, 0x65A2, 0xE9B2, 0x65A4, 0xA4E7, 0x65A5, 0xA5B8, + 0x65A7, 0xA9F2, 0x65A8, 0xCCC2, 0x65AA, 0xCEE9, 0x65AB, 0xAC48, 0x65AC, 0xB1D9, 0x65AE, 0xD97C, 0x65AF, 0xB4B5, 0x65B0, 0xB773, + 0x65B2, 0xE5C1, 0x65B3, 0xE5C2, 0x65B6, 0xECF0, 0x65B7, 0xC25F, 0x65B8, 0xF8F0, 0x65B9, 0xA4E8, 0x65BB, 0xCCC3, 0x65BC, 0xA9F3, + 0x65BD, 0xAC49, 0x65BF, 0xCEEA, 0x65C1, 0xAEC7, 0x65C2, 0xD1D2, 0x65C3, 0xD1D0, 0x65C4, 0xD1D1, 0x65C5, 0xAEC8, 0x65C6, 0xD1CF, + 0x65CB, 0xB1DB, 0x65CC, 0xB1DC, 0x65CD, 0xD5A8, 0x65CE, 0xB1DD, 0x65CF, 0xB1DA, 0x65D0, 0xD97D, 0x65D2, 0xD97E, 0x65D3, 0xDDBE, + 0x65D6, 0xBA59, 0x65D7, 0xBA58, 0x65DA, 0xECF1, 0x65DB, 0xEFD9, 0x65DD, 0xF24A, 0x65DE, 0xF249, 0x65DF, 0xF44F, 0x65E1, 0xC95E, + 0x65E2, 0xAC4A, 0x65E5, 0xA4E9, 0x65E6, 0xA5B9, 0x65E8, 0xA6AE, 0x65E9, 0xA6AD, 0x65EC, 0xA6AF, 0x65ED, 0xA6B0, 0x65EE, 0xC9EE, + 0x65EF, 0xC9ED, 0x65F0, 0xCAF8, 0x65F1, 0xA7F2, 0x65F2, 0xCAFB, 0x65F3, 0xCAFA, 0x65F4, 0xCAF9, 0x65F5, 0xCAFC, 0x65FA, 0xA9F4, + 0x65FB, 0xCCC9, 0x65FC, 0xCCC5, 0x65FD, 0xCCCE, 0x6600, 0xA9FB, 0x6602, 0xA9F9, 0x6603, 0xCCCA, 0x6604, 0xCCC6, 0x6605, 0xCCCD, + 0x6606, 0xA9F8, 0x6607, 0xAA40, 0x6608, 0xCCC8, 0x6609, 0xCCC4, 0x660A, 0xA9FE, 0x660B, 0xCCCB, 0x660C, 0xA9F7, 0x660D, 0xCCCC, + 0x660E, 0xA9FA, 0x660F, 0xA9FC, 0x6610, 0xCCD0, 0x6611, 0xCCCF, 0x6612, 0xCCC7, 0x6613, 0xA9F6, 0x6614, 0xA9F5, 0x6615, 0xA9FD, + 0x661C, 0xCEEF, 0x661D, 0xCEF5, 0x661F, 0xAC50, 0x6620, 0xAC4D, 0x6621, 0xCEEC, 0x6622, 0xCEF1, 0x6624, 0xAC53, 0x6625, 0xAC4B, + 0x6626, 0xCEF0, 0x6627, 0xAC4E, 0x6628, 0xAC51, 0x662B, 0xCEF3, 0x662D, 0xAC4C, 0x662E, 0xCEF8, 0x662F, 0xAC4F, 0x6631, 0xAC52, + 0x6632, 0xCEED, 0x6633, 0xCEF2, 0x6634, 0xCEF6, 0x6635, 0xCEEE, 0x6636, 0xCEEB, 0x6639, 0xCEF7, 0x663A, 0xCEF4, 0x6641, 0xAED0, + 0x6642, 0xAEC9, 0x6643, 0xAECC, 0x6645, 0xAECF, 0x6647, 0xD1D5, 0x6649, 0xAECA, 0x664A, 0xD1D3, 0x664C, 0xAECE, 0x664F, 0xAECB, + 0x6651, 0xD1D6, 0x6652, 0xAECD, 0x6659, 0xD5AC, 0x665A, 0xB1DF, 0x665B, 0xD5AB, 0x665C, 0xD5AD, 0x665D, 0xB1DE, 0x665E, 0xB1E3, + 0x665F, 0xD1D4, 0x6661, 0xD5AA, 0x6662, 0xD5AE, 0x6664, 0xB1E0, 0x6665, 0xD5A9, 0x6666, 0xB1E2, 0x6668, 0xB1E1, 0x666A, 0xD9A7, + 0x666C, 0xD9A2, 0x666E, 0xB4B6, 0x666F, 0xB4BA, 0x6670, 0xB4B7, 0x6671, 0xD9A5, 0x6672, 0xD9A8, 0x6674, 0xB4B8, 0x6676, 0xB4B9, + 0x6677, 0xB4BE, 0x6678, 0xDDC7, 0x6679, 0xD9A6, 0x667A, 0xB4BC, 0x667B, 0xD9A3, 0x667C, 0xD9A1, 0x667E, 0xB4BD, 0x6680, 0xD9A4, + 0x6684, 0xB779, 0x6686, 0xDDBF, 0x6687, 0xB776, 0x6688, 0xB777, 0x6689, 0xB775, 0x668A, 0xDDC4, 0x668B, 0xDDC3, 0x668C, 0xDDC0, + 0x668D, 0xB77B, 0x6690, 0xDDC2, 0x6691, 0xB4BB, 0x6694, 0xDDC6, 0x6695, 0xDDC1, 0x6696, 0xB778, 0x6697, 0xB774, 0x6698, 0xB77A, + 0x6699, 0xDDC5, 0x669D, 0xBA5C, 0x669F, 0xE1F8, 0x66A0, 0xE1F7, 0x66A1, 0xE1F6, 0x66A2, 0xBA5A, 0x66A8, 0xBA5B, 0x66A9, 0xE5C5, + 0x66AA, 0xE5C8, 0x66AB, 0xBCC8, 0x66AE, 0xBCC7, 0x66AF, 0xE5C9, 0x66B0, 0xE5C4, 0x66B1, 0xBCCA, 0x66B2, 0xE5C6, 0x66B4, 0xBCC9, + 0x66B5, 0xE5C3, 0x66B7, 0xE5C7, 0x66B8, 0xBEE9, 0x66B9, 0xBEE6, 0x66BA, 0xE9BB, 0x66BB, 0xE9BA, 0x66BD, 0xE9B9, 0x66BE, 0xE9B4, + 0x66C0, 0xE9B5, 0x66C4, 0xBEE7, 0x66C6, 0xBEE4, 0x66C7, 0xBEE8, 0x66C8, 0xE9B3, 0x66C9, 0xBEE5, 0x66CA, 0xE9B6, 0x66CB, 0xE9B7, + 0x66CC, 0xE9BC, 0x66CF, 0xE9B8, 0x66D2, 0xECF2, 0x66D6, 0xC0C7, 0x66D8, 0xEFDC, 0x66D9, 0xC0C6, 0x66DA, 0xEFDA, 0x66DB, 0xEFDB, + 0x66DC, 0xC260, 0x66DD, 0xC36E, 0x66DE, 0xF24B, 0x66E0, 0xC36D, 0x66E3, 0xF451, 0x66E4, 0xF452, 0x66E6, 0xC466, 0x66E8, 0xF450, + 0x66E9, 0xC4E4, 0x66EB, 0xF7DF, 0x66EC, 0xC5CE, 0x66ED, 0xF8AA, 0x66EE, 0xF8AB, 0x66F0, 0xA4EA, 0x66F2, 0xA6B1, 0x66F3, 0xA6B2, + 0x66F4, 0xA7F3, 0x66F6, 0xCCD1, 0x66F7, 0xAC54, 0x66F8, 0xAED1, 0x66F9, 0xB1E4, 0x66FC, 0xB0D2, 0x66FE, 0xB4BF, 0x66FF, 0xB4C0, + 0x6700, 0xB3CC, 0x6701, 0xD9A9, 0x6703, 0xB77C, 0x6704, 0xE1FA, 0x6705, 0xE1F9, 0x6708, 0xA4EB, 0x6709, 0xA6B3, 0x670A, 0xCCD2, + 0x670B, 0xAA42, 0x670D, 0xAA41, 0x670F, 0xCEF9, 0x6710, 0xCEFA, 0x6712, 0xD1D7, 0x6713, 0xD1D8, 0x6714, 0xAED2, 0x6715, 0xAED3, + 0x6717, 0xAED4, 0x6718, 0xD5AF, 0x671B, 0xB1E6, 0x671D, 0xB4C2, 0x671F, 0xB4C1, 0x6720, 0xDDC8, 0x6721, 0xDF7A, 0x6722, 0xE1FB, + 0x6723, 0xE9BD, 0x6726, 0xC261, 0x6727, 0xC467, 0x6728, 0xA4EC, 0x672A, 0xA5BC, 0x672B, 0xA5BD, 0x672C, 0xA5BB, 0x672D, 0xA5BE, + 0x672E, 0xA5BA, 0x6731, 0xA6B6, 0x6733, 0xC9F6, 0x6734, 0xA6B5, 0x6735, 0xA6B7, 0x6738, 0xC9F1, 0x6739, 0xC9F0, 0x673A, 0xC9F3, + 0x673B, 0xC9F2, 0x673C, 0xC9F5, 0x673D, 0xA6B4, 0x673E, 0xC9EF, 0x673F, 0xC9F4, 0x6745, 0xCAFD, 0x6746, 0xA7FD, 0x6747, 0xCAFE, + 0x6748, 0xCB43, 0x6749, 0xA7FC, 0x674B, 0xCB47, 0x674C, 0xCB42, 0x674D, 0xCB45, 0x674E, 0xA7F5, 0x674F, 0xA7F6, 0x6750, 0xA7F7, + 0x6751, 0xA7F8, 0x6753, 0xA840, 0x6755, 0xCB41, 0x6756, 0xA7FA, 0x6757, 0xA841, 0x6759, 0xCB40, 0x675A, 0xCB46, 0x675C, 0xA7F9, + 0x675D, 0xCB44, 0x675E, 0xA7FB, 0x675F, 0xA7F4, 0x6760, 0xA7FE, 0x676A, 0xAA57, 0x676C, 0xCCD4, 0x676D, 0xAA43, 0x676F, 0xAA4D, + 0x6770, 0xAA4E, 0x6771, 0xAA46, 0x6772, 0xAA58, 0x6773, 0xAA48, 0x6774, 0xCCDC, 0x6775, 0xAA53, 0x6776, 0xCCD7, 0x6777, 0xAA49, + 0x6778, 0xCCE6, 0x6779, 0xCCE7, 0x677A, 0xCCDF, 0x677B, 0xCCD8, 0x677C, 0xAA56, 0x677D, 0xCCE4, 0x677E, 0xAA51, 0x677F, 0xAA4F, + 0x6781, 0xCCE5, 0x6783, 0xCCE3, 0x6784, 0xCCDB, 0x6785, 0xCCD3, 0x6786, 0xCCDA, 0x6787, 0xAA4A, 0x6789, 0xAA50, 0x678B, 0xAA44, + 0x678C, 0xCCDE, 0x678D, 0xCCDD, 0x678E, 0xCCD5, 0x6790, 0xAA52, 0x6791, 0xCCE1, 0x6792, 0xCCD6, 0x6793, 0xAA55, 0x6794, 0xCCE8, + 0x6795, 0xAA45, 0x6797, 0xAA4C, 0x6798, 0xCCD9, 0x6799, 0xCCE2, 0x679A, 0xAA54, 0x679C, 0xAA47, 0x679D, 0xAA4B, 0x679F, 0xCCE0, + 0x67AE, 0xCF5B, 0x67AF, 0xAC5C, 0x67B0, 0xAC69, 0x67B2, 0xCF56, 0x67B3, 0xCF4C, 0x67B4, 0xAC62, 0x67B5, 0xCF4A, 0x67B6, 0xAC5B, + 0x67B7, 0xCF45, 0x67B8, 0xAC65, 0x67B9, 0xCF52, 0x67BA, 0xCEFE, 0x67BB, 0xCF41, 0x67C0, 0xCF44, 0x67C1, 0xCEFB, 0x67C2, 0xCF51, + 0x67C3, 0xCF61, 0x67C4, 0xAC60, 0x67C5, 0xCF46, 0x67C6, 0xCF58, 0x67C8, 0xCEFD, 0x67C9, 0xCF5F, 0x67CA, 0xCF60, 0x67CB, 0xCF63, + 0x67CC, 0xCF5A, 0x67CD, 0xCF4B, 0x67CE, 0xCF53, 0x67CF, 0xAC66, 0x67D0, 0xAC59, 0x67D1, 0xAC61, 0x67D2, 0xAC6D, 0x67D3, 0xAC56, + 0x67D4, 0xAC58, 0x67D8, 0xCF43, 0x67D9, 0xAC6A, 0x67DA, 0xAC63, 0x67DB, 0xCF5D, 0x67DC, 0xCF40, 0x67DD, 0xAC6C, 0x67DE, 0xAC67, + 0x67DF, 0xCF49, 0x67E2, 0xAC6B, 0x67E3, 0xCF50, 0x67E4, 0xCF48, 0x67E5, 0xAC64, 0x67E6, 0xCF5C, 0x67E7, 0xCF54, 0x67E9, 0xAC5E, + 0x67EA, 0xCF62, 0x67EB, 0xCF47, 0x67EC, 0xAC5A, 0x67ED, 0xCF59, 0x67EE, 0xCF4F, 0x67EF, 0xAC5F, 0x67F0, 0xCF55, 0x67F1, 0xAC57, + 0x67F2, 0xCEFC, 0x67F3, 0xAC68, 0x67F4, 0xAEE3, 0x67F5, 0xAC5D, 0x67F6, 0xCF4E, 0x67F7, 0xCF4D, 0x67F8, 0xCF42, 0x67FA, 0xCF5E, + 0x67FC, 0xCF57, 0x67FF, 0xAC55, 0x6812, 0xD1EC, 0x6813, 0xAEEA, 0x6814, 0xD1ED, 0x6816, 0xD1E1, 0x6817, 0xAEDF, 0x6818, 0xAEEB, + 0x681A, 0xD1DA, 0x681C, 0xD1E3, 0x681D, 0xD1EB, 0x681F, 0xD1D9, 0x6820, 0xD1F4, 0x6821, 0xAED5, 0x6825, 0xD1F3, 0x6826, 0xD1EE, + 0x6828, 0xD1EF, 0x6829, 0xAEDD, 0x682A, 0xAEE8, 0x682B, 0xD1E5, 0x682D, 0xD1E6, 0x682E, 0xD1F0, 0x682F, 0xD1E7, 0x6831, 0xD1E2, + 0x6832, 0xD1DC, 0x6833, 0xD1DD, 0x6834, 0xD1EA, 0x6835, 0xD1E4, 0x6838, 0xAED6, 0x6839, 0xAEDA, 0x683A, 0xD1F2, 0x683B, 0xD1DE, + 0x683C, 0xAEE6, 0x683D, 0xAEE2, 0x6840, 0xAEE5, 0x6841, 0xAEEC, 0x6842, 0xAEDB, 0x6843, 0xAEE7, 0x6844, 0xD1E9, 0x6845, 0xAEE9, + 0x6846, 0xAED8, 0x6848, 0xAED7, 0x6849, 0xD1DB, 0x684B, 0xD1DF, 0x684C, 0xAEE0, 0x684D, 0xD1F1, 0x684E, 0xD1E8, 0x684F, 0xD1E0, + 0x6850, 0xAEE4, 0x6851, 0xAEE1, 0x6853, 0xAED9, 0x6854, 0xAEDC, 0x686B, 0xD5C4, 0x686D, 0xD5B4, 0x686E, 0xD5B5, 0x686F, 0xD5B9, + 0x6871, 0xD5C8, 0x6872, 0xD5C5, 0x6874, 0xD5BE, 0x6875, 0xD5BD, 0x6876, 0xB1ED, 0x6877, 0xD5C1, 0x6878, 0xD5D0, 0x6879, 0xD5B0, + 0x687B, 0xD5D1, 0x687C, 0xD5C3, 0x687D, 0xD5D5, 0x687E, 0xD5C9, 0x687F, 0xB1EC, 0x6880, 0xD5C7, 0x6881, 0xB1E7, 0x6882, 0xB1FC, + 0x6883, 0xB1F2, 0x6885, 0xB1F6, 0x6886, 0xB1F5, 0x6887, 0xD5B1, 0x6889, 0xD5CE, 0x688A, 0xD5D4, 0x688B, 0xD5CC, 0x688C, 0xD5D3, + 0x688F, 0xD5C0, 0x6890, 0xD5B2, 0x6891, 0xD5D2, 0x6892, 0xD5C2, 0x6893, 0xB1EA, 0x6894, 0xB1F7, 0x6896, 0xD5CB, 0x6897, 0xB1F0, + 0x689B, 0xD5CA, 0x689C, 0xD5B3, 0x689D, 0xB1F8, 0x689F, 0xB1FA, 0x68A0, 0xD5CD, 0x68A1, 0xB1FB, 0x68A2, 0xB1E9, 0x68A3, 0xD5BA, + 0x68A4, 0xD5CF, 0x68A7, 0xB1EF, 0x68A8, 0xB1F9, 0x68A9, 0xD5BC, 0x68AA, 0xD5C6, 0x68AB, 0xD5B7, 0x68AC, 0xD5BB, 0x68AD, 0xB1F4, + 0x68AE, 0xD5B6, 0x68AF, 0xB1E8, 0x68B0, 0xB1F1, 0x68B1, 0xB1EE, 0x68B2, 0xD5BF, 0x68B3, 0xAEDE, 0x68B4, 0xD9C0, 0x68B5, 0xB1EB, + 0x68C4, 0xB1F3, 0x68C6, 0xD9C3, 0x68C7, 0xD9D9, 0x68C8, 0xD9CE, 0x68C9, 0xB4D6, 0x68CB, 0xB4D1, 0x68CC, 0xD9BD, 0x68CD, 0xB4D2, + 0x68CE, 0xD9CD, 0x68D0, 0xD9C6, 0x68D1, 0xD9D3, 0x68D2, 0xB4CE, 0x68D3, 0xD9AB, 0x68D4, 0xD9D5, 0x68D5, 0xB4C4, 0x68D6, 0xD9B3, + 0x68D7, 0xB4C7, 0x68D8, 0xB4C6, 0x68DA, 0xB4D7, 0x68DC, 0xD9AD, 0x68DD, 0xD9CF, 0x68DE, 0xD9D0, 0x68DF, 0xB4C9, 0x68E0, 0xB4C5, + 0x68E1, 0xD9BB, 0x68E3, 0xB4D0, 0x68E4, 0xD9B6, 0x68E6, 0xD9D1, 0x68E7, 0xB4CC, 0x68E8, 0xD9C9, 0x68E9, 0xD9D6, 0x68EA, 0xD9B0, + 0x68EB, 0xD9B5, 0x68EC, 0xD9AF, 0x68EE, 0xB4CB, 0x68EF, 0xD9C2, 0x68F0, 0xDDDE, 0x68F1, 0xD9B1, 0x68F2, 0xB4CF, 0x68F3, 0xD9BA, + 0x68F4, 0xD9D2, 0x68F5, 0xB4CA, 0x68F6, 0xD9B7, 0x68F7, 0xD9B4, 0x68F8, 0xD9C5, 0x68F9, 0xB4CD, 0x68FA, 0xB4C3, 0x68FB, 0xB4D9, + 0x68FC, 0xD9C8, 0x68FD, 0xD9C7, 0x6904, 0xD9AC, 0x6905, 0xB4C8, 0x6906, 0xD9D4, 0x6907, 0xD9BC, 0x6908, 0xD9BE, 0x690A, 0xD9CB, + 0x690B, 0xD9CA, 0x690C, 0xD9AA, 0x690D, 0xB4D3, 0x690E, 0xB4D5, 0x690F, 0xD9B2, 0x6910, 0xD9B9, 0x6911, 0xD9C1, 0x6912, 0xB4D4, + 0x6913, 0xD9B8, 0x6914, 0xD9C4, 0x6915, 0xD9D7, 0x6917, 0xD9CC, 0x6925, 0xD9D8, 0x692A, 0xD9AE, 0x692F, 0xDDF2, 0x6930, 0xB7A6, + 0x6932, 0xDDF0, 0x6933, 0xDDDB, 0x6934, 0xDDE0, 0x6935, 0xDDD9, 0x6937, 0xDDEC, 0x6938, 0xDDCB, 0x6939, 0xDDD2, 0x693B, 0xDDEA, + 0x693C, 0xDDF4, 0x693D, 0xDDDC, 0x693F, 0xDDCF, 0x6940, 0xDDE2, 0x6941, 0xDDE7, 0x6942, 0xDDD3, 0x6944, 0xDDE4, 0x6945, 0xDDD0, + 0x6948, 0xDDD7, 0x6949, 0xDDD8, 0x694A, 0xB7A8, 0x694B, 0xDDEB, 0x694C, 0xDDE9, 0x694E, 0xDDCC, 0x694F, 0xDDEE, 0x6951, 0xDDEF, + 0x6952, 0xDDF1, 0x6953, 0xB7AC, 0x6954, 0xB7A4, 0x6956, 0xD5B8, 0x6957, 0xDDD4, 0x6958, 0xDDE6, 0x6959, 0xDDD5, 0x695A, 0xB7A1, + 0x695B, 0xB7B1, 0x695C, 0xDDED, 0x695D, 0xB7AF, 0x695E, 0xB7AB, 0x695F, 0xDDCA, 0x6960, 0xB7A3, 0x6962, 0xDDCD, 0x6963, 0xB7B0, + 0x6965, 0xDDDD, 0x6966, 0xDDC9, 0x6968, 0xB7A9, 0x6969, 0xDDE1, 0x696A, 0xDDD1, 0x696B, 0xB7AA, 0x696C, 0xDDDA, 0x696D, 0xB77E, + 0x696E, 0xB4D8, 0x696F, 0xDDE3, 0x6970, 0xD9BF, 0x6971, 0xDDCE, 0x6974, 0xDDE8, 0x6975, 0xB7A5, 0x6976, 0xDDE5, 0x6977, 0xB7A2, + 0x6978, 0xDDDF, 0x6979, 0xB7AD, 0x697A, 0xDDD6, 0x697B, 0xDDF3, 0x6982, 0xB7A7, 0x6983, 0xDEC6, 0x6986, 0xB7AE, 0x698D, 0xE24A, + 0x698E, 0xE248, 0x6990, 0xE25E, 0x6991, 0xE246, 0x6993, 0xE258, 0x6994, 0xB77D, 0x6995, 0xBA5F, 0x6996, 0xE242, 0x6997, 0xE25D, + 0x6999, 0xE247, 0x699A, 0xE255, 0x699B, 0xBA64, 0x699C, 0xBA5D, 0x699E, 0xE25B, 0x69A0, 0xE240, 0x69A1, 0xE25A, 0x69A3, 0xBA6F, + 0x69A4, 0xE251, 0x69A5, 0xE261, 0x69A6, 0xBA6D, 0x69A7, 0xE249, 0x69A8, 0xBA5E, 0x69A9, 0xE24B, 0x69AA, 0xE259, 0x69AB, 0xBA67, + 0x69AC, 0xE244, 0x69AD, 0xBA6B, 0x69AE, 0xBA61, 0x69AF, 0xE24D, 0x69B0, 0xE243, 0x69B1, 0xE1FC, 0x69B3, 0xE257, 0x69B4, 0xBA68, + 0x69B5, 0xE260, 0x69B6, 0xE1FD, 0x69B7, 0xBA65, 0x69B9, 0xE253, 0x69BB, 0xBA66, 0x69BC, 0xE245, 0x69BD, 0xE250, 0x69BE, 0xE24C, + 0x69BF, 0xE24E, 0x69C1, 0xBA60, 0x69C2, 0xE25F, 0x69C3, 0xBA6E, 0x69C4, 0xE24F, 0x69C6, 0xE262, 0x69C9, 0xE1FE, 0x69CA, 0xE254, + 0x69CB, 0xBA63, 0x69CC, 0xBA6C, 0x69CD, 0xBA6A, 0x69CE, 0xE241, 0x69CF, 0xE256, 0x69D0, 0xBA69, 0x69D3, 0xBA62, 0x69D4, 0xE252, + 0x69D9, 0xE25C, 0x69E2, 0xE5D5, 0x69E4, 0xE5D1, 0x69E5, 0xE5CD, 0x69E6, 0xE5E1, 0x69E7, 0xE5DE, 0x69E8, 0xBCCD, 0x69EB, 0xE5E5, + 0x69EC, 0xE5D4, 0x69ED, 0xBCD8, 0x69EE, 0xE5DB, 0x69F1, 0xE5D0, 0x69F2, 0xE5DA, 0x69F3, 0xBCD5, 0x69F4, 0xE5EE, 0x69F6, 0xE5EB, + 0x69F7, 0xE5DD, 0x69F8, 0xE5CE, 0x69FB, 0xE5E2, 0x69FC, 0xE5E4, 0x69FD, 0xBCD1, 0x69FE, 0xE5D8, 0x69FF, 0xE5D3, 0x6A00, 0xE5CA, + 0x6A01, 0xBCCE, 0x6A02, 0xBCD6, 0x6A04, 0xE5E7, 0x6A05, 0xBCD7, 0x6A06, 0xE5CB, 0x6A07, 0xE5ED, 0x6A08, 0xE5E0, 0x6A09, 0xE5E6, + 0x6A0A, 0xBCD4, 0x6A0D, 0xE5E3, 0x6A0F, 0xE5EA, 0x6A11, 0xBCD9, 0x6A13, 0xBCD3, 0x6A14, 0xE5DC, 0x6A15, 0xE5CF, 0x6A16, 0xE5EF, + 0x6A17, 0xE5CC, 0x6A18, 0xE5E8, 0x6A19, 0xBCD0, 0x6A1B, 0xE5D6, 0x6A1D, 0xE5D7, 0x6A1E, 0xBCCF, 0x6A1F, 0xBCCC, 0x6A20, 0xE5D2, + 0x6A21, 0xBCD2, 0x6A23, 0xBCCB, 0x6A25, 0xE5E9, 0x6A26, 0xE5EC, 0x6A27, 0xE5D9, 0x6A28, 0xE9CA, 0x6A32, 0xE9C2, 0x6A34, 0xE9BE, + 0x6A35, 0xBEF6, 0x6A38, 0xBEEB, 0x6A39, 0xBEF0, 0x6A3A, 0xBEEC, 0x6A3B, 0xE9CC, 0x6A3C, 0xE9D7, 0x6A3D, 0xBEEA, 0x6A3E, 0xE9C4, + 0x6A3F, 0xE9CD, 0x6A40, 0xE5DF, 0x6A41, 0xE9CE, 0x6A44, 0xBEF1, 0x6A46, 0xE9DD, 0x6A47, 0xBEF5, 0x6A48, 0xBEF8, 0x6A49, 0xE9C0, + 0x6A4B, 0xBEF4, 0x6A4D, 0xE9DB, 0x6A4E, 0xE9DC, 0x6A4F, 0xE9D2, 0x6A50, 0xE9D1, 0x6A51, 0xE9C9, 0x6A54, 0xE9D3, 0x6A55, 0xE9DA, + 0x6A56, 0xE9D9, 0x6A58, 0xBEEF, 0x6A59, 0xBEED, 0x6A5A, 0xE9CB, 0x6A5B, 0xE9C8, 0x6A5D, 0xE9C5, 0x6A5E, 0xE9D8, 0x6A5F, 0xBEF7, + 0x6A60, 0xE9D6, 0x6A61, 0xBEF3, 0x6A62, 0xBEF2, 0x6A64, 0xE9D0, 0x6A66, 0xE9BF, 0x6A67, 0xE9C1, 0x6A68, 0xE9C3, 0x6A69, 0xE9D5, + 0x6A6A, 0xE9CF, 0x6A6B, 0xBEEE, 0x6A6D, 0xE9C6, 0x6A6F, 0xE9D4, 0x6A76, 0xE9C7, 0x6A7E, 0xC0CF, 0x6A7F, 0xED45, 0x6A80, 0xC0C8, + 0x6A81, 0xECF5, 0x6A83, 0xED41, 0x6A84, 0xC0CA, 0x6A85, 0xED48, 0x6A87, 0xECFC, 0x6A89, 0xECF7, 0x6A8C, 0xED49, 0x6A8D, 0xECF3, + 0x6A8E, 0xECFE, 0x6A90, 0xC0D1, 0x6A91, 0xED44, 0x6A92, 0xED4A, 0x6A93, 0xECFD, 0x6A94, 0xC0C9, 0x6A95, 0xED40, 0x6A96, 0xECF4, + 0x6A97, 0xC0D0, 0x6A9A, 0xED47, 0x6A9B, 0xECF9, 0x6A9C, 0xC0CC, 0x6A9E, 0xECFB, 0x6A9F, 0xECF8, 0x6AA0, 0xC0D2, 0x6AA1, 0xECFA, + 0x6AA2, 0xC0CB, 0x6AA3, 0xC0CE, 0x6AA4, 0xED43, 0x6AA5, 0xECF6, 0x6AA6, 0xED46, 0x6AA8, 0xED42, 0x6AAC, 0xC263, 0x6AAD, 0xEFE7, + 0x6AAE, 0xC268, 0x6AAF, 0xC269, 0x6AB3, 0xC262, 0x6AB4, 0xEFE6, 0x6AB6, 0xEFE3, 0x6AB7, 0xEFE4, 0x6AB8, 0xC266, 0x6AB9, 0xEFDE, + 0x6ABA, 0xEFE2, 0x6ABB, 0xC265, 0x6ABD, 0xEFDF, 0x6AC2, 0xC267, 0x6AC3, 0xC264, 0x6AC5, 0xEFDD, 0x6AC6, 0xEFE1, 0x6AC7, 0xEFE5, + 0x6ACB, 0xF251, 0x6ACC, 0xF24E, 0x6ACD, 0xF257, 0x6ACF, 0xF256, 0x6AD0, 0xF254, 0x6AD1, 0xF24F, 0x6AD3, 0xC372, 0x6AD9, 0xF250, + 0x6ADA, 0xC371, 0x6ADB, 0xC0CD, 0x6ADC, 0xF253, 0x6ADD, 0xC370, 0x6ADE, 0xF258, 0x6ADF, 0xF252, 0x6AE0, 0xF24D, 0x6AE1, 0xEFE0, + 0x6AE5, 0xC36F, 0x6AE7, 0xF24C, 0x6AE8, 0xF456, 0x6AEA, 0xF455, 0x6AEB, 0xF255, 0x6AEC, 0xC468, 0x6AEE, 0xF459, 0x6AEF, 0xF45A, + 0x6AF0, 0xF454, 0x6AF1, 0xF458, 0x6AF3, 0xF453, 0x6AF8, 0xF5D1, 0x6AF9, 0xF457, 0x6AFA, 0xC4E7, 0x6AFB, 0xC4E5, 0x6AFC, 0xF5CF, + 0x6B00, 0xF5D2, 0x6B02, 0xF5CE, 0x6B03, 0xF5D0, 0x6B04, 0xC4E6, 0x6B08, 0xF6E5, 0x6B09, 0xF6E6, 0x6B0A, 0xC576, 0x6B0B, 0xF6E4, + 0x6B0F, 0xF7E2, 0x6B10, 0xC5CF, 0x6B11, 0xF7E0, 0x6B12, 0xF7E1, 0x6B13, 0xF8AC, 0x6B16, 0xC656, 0x6B17, 0xF8F3, 0x6B18, 0xF8F1, + 0x6B19, 0xF8F2, 0x6B1A, 0xF8F4, 0x6B1E, 0xF9BB, 0x6B20, 0xA4ED, 0x6B21, 0xA6B8, 0x6B23, 0xAA59, 0x6B25, 0xCCE9, 0x6B28, 0xCF64, + 0x6B2C, 0xD1F5, 0x6B2D, 0xD1F7, 0x6B2F, 0xD1F6, 0x6B31, 0xD1F8, 0x6B32, 0xB1FD, 0x6B33, 0xD5D7, 0x6B34, 0xD1F9, 0x6B36, 0xD5D6, + 0x6B37, 0xD5D8, 0x6B38, 0xD5D9, 0x6B39, 0xD9DA, 0x6B3A, 0xB4DB, 0x6B3B, 0xD9DB, 0x6B3C, 0xD9DD, 0x6B3D, 0xB4DC, 0x6B3E, 0xB4DA, + 0x6B3F, 0xD9DC, 0x6B41, 0xDDFA, 0x6B42, 0xDDF8, 0x6B43, 0xDDF7, 0x6B45, 0xDDF6, 0x6B46, 0xDDF5, 0x6B47, 0xB7B2, 0x6B48, 0xDDF9, + 0x6B49, 0xBA70, 0x6B4A, 0xE263, 0x6B4B, 0xE265, 0x6B4C, 0xBA71, 0x6B4D, 0xE264, 0x6B4E, 0xBCDB, 0x6B50, 0xBCDA, 0x6B51, 0xE5F0, + 0x6B54, 0xE9DF, 0x6B55, 0xE9DE, 0x6B56, 0xE9E0, 0x6B59, 0xBEF9, 0x6B5B, 0xED4B, 0x6B5C, 0xC0D3, 0x6B5E, 0xEFE8, 0x6B5F, 0xC26A, + 0x6B60, 0xF259, 0x6B61, 0xC577, 0x6B62, 0xA4EE, 0x6B63, 0xA5BF, 0x6B64, 0xA6B9, 0x6B65, 0xA842, 0x6B66, 0xAA5A, 0x6B67, 0xAA5B, + 0x6B6A, 0xAC6E, 0x6B6D, 0xD1FA, 0x6B72, 0xB7B3, 0x6B76, 0xE6D1, 0x6B77, 0xBEFA, 0x6B78, 0xC26B, 0x6B79, 0xA4EF, 0x6B7B, 0xA6BA, + 0x6B7E, 0xCCEB, 0x6B7F, 0xAA5C, 0x6B80, 0xCCEA, 0x6B82, 0xCF65, 0x6B83, 0xAC6F, 0x6B84, 0xCF66, 0x6B86, 0xAC70, 0x6B88, 0xD1FC, + 0x6B89, 0xAEEE, 0x6B8A, 0xAEED, 0x6B8C, 0xD5DE, 0x6B8D, 0xD5DC, 0x6B8E, 0xD5DD, 0x6B8F, 0xD5DB, 0x6B91, 0xD5DA, 0x6B94, 0xD9DE, + 0x6B95, 0xD9E1, 0x6B96, 0xB4DE, 0x6B97, 0xD9DF, 0x6B98, 0xB4DD, 0x6B99, 0xD9E0, 0x6B9B, 0xDDFB, 0x6B9E, 0xE266, 0x6B9F, 0xE267, + 0x6BA0, 0xE268, 0x6BA2, 0xE5F3, 0x6BA3, 0xE5F2, 0x6BA4, 0xBCDC, 0x6BA5, 0xE5F1, 0x6BA6, 0xE5F4, 0x6BA7, 0xE9E1, 0x6BAA, 0xE9E2, + 0x6BAB, 0xE9E3, 0x6BAD, 0xED4C, 0x6BAE, 0xC0D4, 0x6BAF, 0xC26C, 0x6BB0, 0xF25A, 0x6BB2, 0xC4E8, 0x6BB3, 0xC95F, 0x6BB5, 0xAC71, + 0x6BB6, 0xCF67, 0x6BB7, 0xAEEF, 0x6BBA, 0xB1FE, 0x6BBC, 0xB4DF, 0x6BBD, 0xD9E2, 0x6BBF, 0xB7B5, 0x6BC0, 0xB7B4, 0x6BC3, 0xE269, + 0x6BC4, 0xE26A, 0x6BC5, 0xBCDD, 0x6BC6, 0xBCDE, 0x6BC7, 0xE9E5, 0x6BC8, 0xE9E4, 0x6BC9, 0xEFE9, 0x6BCA, 0xF7E3, 0x6BCB, 0xA4F0, + 0x6BCC, 0xC960, 0x6BCD, 0xA5C0, 0x6BCF, 0xA843, 0x6BD0, 0xCB48, 0x6BD2, 0xAC72, 0x6BD3, 0xB7B6, 0x6BD4, 0xA4F1, 0x6BD6, 0xCF68, + 0x6BD7, 0xAC73, 0x6BD8, 0xCF69, 0x6BDA, 0xC0D5, 0x6BDB, 0xA4F2, 0x6BDE, 0xCCEC, 0x6BE0, 0xCF6A, 0x6BE2, 0xD242, 0x6BE3, 0xD241, + 0x6BE4, 0xD1FE, 0x6BE6, 0xD1FD, 0x6BE7, 0xD243, 0x6BE8, 0xD240, 0x6BEB, 0xB240, 0x6BEC, 0xB241, 0x6BEF, 0xB4E0, 0x6BF0, 0xD9E3, + 0x6BF2, 0xD9E4, 0x6BF3, 0xD9E5, 0x6BF7, 0xDE41, 0x6BF8, 0xDE42, 0x6BF9, 0xDE40, 0x6BFB, 0xDDFD, 0x6BFC, 0xDDFE, 0x6BFD, 0xB7B7, + 0x6BFE, 0xE26B, 0x6BFF, 0xE5F7, 0x6C00, 0xE5F6, 0x6C01, 0xE5F5, 0x6C02, 0xE5F8, 0x6C03, 0xE9E7, 0x6C04, 0xE9E6, 0x6C05, 0xBEFB, + 0x6C06, 0xE9E8, 0x6C08, 0xC0D6, 0x6C09, 0xED4D, 0x6C0B, 0xEFEA, 0x6C0C, 0xF25B, 0x6C0D, 0xF6E7, 0x6C0F, 0xA4F3, 0x6C10, 0xA5C2, + 0x6C11, 0xA5C1, 0x6C13, 0xAA5D, 0x6C14, 0xC961, 0x6C15, 0xC97E, 0x6C16, 0xA6BB, 0x6C18, 0xC9F7, 0x6C19, 0xCB49, 0x6C1A, 0xCB4A, + 0x6C1B, 0xAA5E, 0x6C1D, 0xCCED, 0x6C1F, 0xAC74, 0x6C20, 0xCF6B, 0x6C21, 0xCF6C, 0x6C23, 0xAEF0, 0x6C24, 0xAEF4, 0x6C25, 0xD244, + 0x6C26, 0xAEF3, 0x6C27, 0xAEF1, 0x6C28, 0xAEF2, 0x6C2A, 0xD5DF, 0x6C2B, 0xB242, 0x6C2C, 0xB4E3, 0x6C2E, 0xB4E1, 0x6C2F, 0xB4E2, + 0x6C30, 0xD9E6, 0x6C33, 0xBA72, 0x6C34, 0xA4F4, 0x6C36, 0xC9A1, 0x6C38, 0xA5C3, 0x6C3B, 0xC9A4, 0x6C3E, 0xA5C6, 0x6C3F, 0xC9A3, + 0x6C40, 0xA5C5, 0x6C41, 0xA5C4, 0x6C42, 0xA844, 0x6C43, 0xC9A2, 0x6C46, 0xC9F8, 0x6C4A, 0xC9FC, 0x6C4B, 0xC9FE, 0x6C4C, 0xCA40, + 0x6C4D, 0xA6C5, 0x6C4E, 0xA6C6, 0x6C4F, 0xC9FB, 0x6C50, 0xA6C1, 0x6C52, 0xC9F9, 0x6C54, 0xC9FD, 0x6C55, 0xA6C2, 0x6C57, 0xA6BD, + 0x6C59, 0xA6BE, 0x6C5B, 0xA6C4, 0x6C5C, 0xC9FA, 0x6C5D, 0xA6BC, 0x6C5E, 0xA845, 0x6C5F, 0xA6BF, 0x6C60, 0xA6C0, 0x6C61, 0xA6C3, + 0x6C65, 0xCB5B, 0x6C66, 0xCB59, 0x6C67, 0xCB4C, 0x6C68, 0xA851, 0x6C69, 0xCB53, 0x6C6A, 0xA84C, 0x6C6B, 0xCB4D, 0x6C6D, 0xCB55, + 0x6C6F, 0xCB52, 0x6C70, 0xA84F, 0x6C71, 0xCB51, 0x6C72, 0xA856, 0x6C73, 0xCB5A, 0x6C74, 0xA858, 0x6C76, 0xA85A, 0x6C78, 0xCB4B, + 0x6C7A, 0xA84D, 0x6C7B, 0xCB5C, 0x6C7D, 0xA854, 0x6C7E, 0xA857, 0x6C80, 0xCD45, 0x6C81, 0xA847, 0x6C82, 0xA85E, 0x6C83, 0xA855, + 0x6C84, 0xCB4E, 0x6C85, 0xA84A, 0x6C86, 0xA859, 0x6C87, 0xCB56, 0x6C88, 0xA848, 0x6C89, 0xA849, 0x6C8A, 0xCD43, 0x6C8B, 0xCB4F, + 0x6C8C, 0xA850, 0x6C8D, 0xA85B, 0x6C8E, 0xCB5D, 0x6C8F, 0xCB50, 0x6C90, 0xA84E, 0x6C92, 0xA853, 0x6C93, 0xCCEE, 0x6C94, 0xA85C, + 0x6C95, 0xCB57, 0x6C96, 0xA852, 0x6C98, 0xA85D, 0x6C99, 0xA846, 0x6C9A, 0xCB54, 0x6C9B, 0xA84B, 0x6C9C, 0xCB58, 0x6C9D, 0xCD44, + 0x6CAB, 0xAA6A, 0x6CAC, 0xAA7A, 0x6CAD, 0xCCF5, 0x6CAE, 0xAA71, 0x6CB0, 0xCD4B, 0x6CB1, 0xAA62, 0x6CB3, 0xAA65, 0x6CB4, 0xCD42, + 0x6CB6, 0xCCF3, 0x6CB7, 0xCCF7, 0x6CB8, 0xAA6D, 0x6CB9, 0xAA6F, 0x6CBA, 0xCCFA, 0x6CBB, 0xAA76, 0x6CBC, 0xAA68, 0x6CBD, 0xAA66, + 0x6CBE, 0xAA67, 0x6CBF, 0xAA75, 0x6CC0, 0xCD47, 0x6CC1, 0xAA70, 0x6CC2, 0xCCF9, 0x6CC3, 0xCCFB, 0x6CC4, 0xAA6E, 0x6CC5, 0xAA73, + 0x6CC6, 0xCCFC, 0x6CC7, 0xCD4A, 0x6CC9, 0xAC75, 0x6CCA, 0xAA79, 0x6CCC, 0xAA63, 0x6CCD, 0xCD49, 0x6CCF, 0xCD4D, 0x6CD0, 0xCCF8, + 0x6CD1, 0xCD4F, 0x6CD2, 0xCD40, 0x6CD3, 0xAA6C, 0x6CD4, 0xCCF4, 0x6CD5, 0xAA6B, 0x6CD6, 0xAA7D, 0x6CD7, 0xAA72, 0x6CD9, 0xCCF2, + 0x6CDA, 0xCF75, 0x6CDB, 0xAA78, 0x6CDC, 0xAA7C, 0x6CDD, 0xCD41, 0x6CDE, 0xCD46, 0x6CE0, 0xAA7E, 0x6CE1, 0xAA77, 0x6CE2, 0xAA69, + 0x6CE3, 0xAA5F, 0x6CE5, 0xAA64, 0x6CE7, 0xCCF6, 0x6CE8, 0xAA60, 0x6CE9, 0xCD4E, 0x6CEB, 0xCCF0, 0x6CEC, 0xCCEF, 0x6CED, 0xCCFD, + 0x6CEE, 0xCCF1, 0x6CEF, 0xAA7B, 0x6CF0, 0xAEF5, 0x6CF1, 0xAA74, 0x6CF2, 0xCCFE, 0x6CF3, 0xAA61, 0x6CF5, 0xACA6, 0x6CF9, 0xCD4C, + 0x6D00, 0xCF7C, 0x6D01, 0xCFA1, 0x6D03, 0xCFA4, 0x6D04, 0xCF77, 0x6D07, 0xCFA7, 0x6D08, 0xCFAA, 0x6D09, 0xCFAC, 0x6D0A, 0xCF74, + 0x6D0B, 0xAC76, 0x6D0C, 0xAC7B, 0x6D0D, 0xD249, 0x6D0E, 0xACAD, 0x6D0F, 0xCFA5, 0x6D10, 0xCFAD, 0x6D11, 0xCF7B, 0x6D12, 0xCF73, + 0x6D16, 0xD264, 0x6D17, 0xAC7E, 0x6D18, 0xCFA2, 0x6D19, 0xCF78, 0x6D1A, 0xCF7A, 0x6D1B, 0xACA5, 0x6D1D, 0xCF7D, 0x6D1E, 0xAC7D, + 0x6D1F, 0xCF70, 0x6D20, 0xCFA8, 0x6D22, 0xCFAB, 0x6D25, 0xAC7A, 0x6D27, 0xACA8, 0x6D28, 0xCF6D, 0x6D29, 0xACAA, 0x6D2A, 0xAC78, + 0x6D2B, 0xACAE, 0x6D2C, 0xCFA9, 0x6D2D, 0xCF6F, 0x6D2E, 0xACAB, 0x6D2F, 0xD25E, 0x6D30, 0xCD48, 0x6D31, 0xAC7C, 0x6D32, 0xAC77, + 0x6D33, 0xCF76, 0x6D34, 0xCF6E, 0x6D35, 0xACAC, 0x6D36, 0xACA4, 0x6D37, 0xCFA3, 0x6D38, 0xACA9, 0x6D39, 0xACA7, 0x6D3A, 0xCF79, + 0x6D3B, 0xACA1, 0x6D3C, 0xCF71, 0x6D3D, 0xACA2, 0x6D3E, 0xACA3, 0x6D3F, 0xCF72, 0x6D40, 0xCFA6, 0x6D41, 0xAC79, 0x6D42, 0xCF7E, + 0x6D58, 0xD24C, 0x6D59, 0xAEFD, 0x6D5A, 0xAF43, 0x6D5E, 0xD255, 0x6D5F, 0xD25B, 0x6D60, 0xD257, 0x6D61, 0xD24A, 0x6D62, 0xD24D, + 0x6D63, 0xD246, 0x6D64, 0xD247, 0x6D65, 0xAF4A, 0x6D66, 0xAEFA, 0x6D67, 0xD256, 0x6D68, 0xD25F, 0x6D69, 0xAF45, 0x6D6A, 0xAEF6, + 0x6D6C, 0xAF40, 0x6D6D, 0xD24E, 0x6D6E, 0xAF42, 0x6D6F, 0xD24F, 0x6D70, 0xD259, 0x6D74, 0xAF44, 0x6D75, 0xD268, 0x6D76, 0xD248, + 0x6D77, 0xAEFC, 0x6D78, 0xAEFB, 0x6D79, 0xAF48, 0x6D7A, 0xD245, 0x6D7B, 0xD266, 0x6D7C, 0xD25A, 0x6D7D, 0xD267, 0x6D7E, 0xD261, + 0x6D7F, 0xD253, 0x6D80, 0xD262, 0x6D82, 0xD25C, 0x6D83, 0xD265, 0x6D84, 0xD263, 0x6D85, 0xAF49, 0x6D86, 0xD254, 0x6D87, 0xAEF9, + 0x6D88, 0xAEF8, 0x6D89, 0xAF41, 0x6D8A, 0xAF47, 0x6D8B, 0xD260, 0x6D8C, 0xAF46, 0x6D8D, 0xD251, 0x6D8E, 0xB243, 0x6D90, 0xD269, + 0x6D91, 0xD250, 0x6D92, 0xD24B, 0x6D93, 0xAEFE, 0x6D94, 0xAF4B, 0x6D95, 0xAEF7, 0x6D97, 0xD258, 0x6D98, 0xD25D, 0x6DAA, 0xB265, + 0x6DAB, 0xD5E1, 0x6DAC, 0xD5E5, 0x6DAE, 0xB252, 0x6DAF, 0xB250, 0x6DB2, 0xB247, 0x6DB3, 0xD5E3, 0x6DB4, 0xD5E2, 0x6DB5, 0xB25B, + 0x6DB7, 0xD5E8, 0x6DB8, 0xB255, 0x6DBA, 0xD5FA, 0x6DBB, 0xD647, 0x6DBC, 0xB244, 0x6DBD, 0xD5F7, 0x6DBE, 0xD5F0, 0x6DBF, 0xB267, + 0x6DC0, 0xD5E0, 0x6DC2, 0xD5FC, 0x6DC4, 0xB264, 0x6DC5, 0xB258, 0x6DC6, 0xB263, 0x6DC7, 0xB24E, 0x6DC8, 0xD5EC, 0x6DC9, 0xD5FE, + 0x6DCA, 0xD5F6, 0x6DCB, 0xB24F, 0x6DCC, 0xB249, 0x6DCD, 0xD645, 0x6DCF, 0xD5FD, 0x6DD0, 0xD640, 0x6DD1, 0xB251, 0x6DD2, 0xB259, + 0x6DD3, 0xD642, 0x6DD4, 0xD5EA, 0x6DD5, 0xD5FB, 0x6DD6, 0xD5EF, 0x6DD7, 0xD644, 0x6DD8, 0xB25E, 0x6DD9, 0xB246, 0x6DDA, 0xB25C, + 0x6DDB, 0xD5F4, 0x6DDC, 0xD5F2, 0x6DDD, 0xD5F3, 0x6DDE, 0xB253, 0x6DDF, 0xD5EE, 0x6DE0, 0xD5ED, 0x6DE1, 0xB248, 0x6DE2, 0xD5E7, + 0x6DE3, 0xD646, 0x6DE4, 0xB24A, 0x6DE5, 0xD5F1, 0x6DE6, 0xB268, 0x6DE8, 0xB262, 0x6DE9, 0xD5E6, 0x6DEA, 0xB25F, 0x6DEB, 0xB25D, + 0x6DEC, 0xB266, 0x6DED, 0xD5F8, 0x6DEE, 0xB261, 0x6DEF, 0xD252, 0x6DF0, 0xD5F9, 0x6DF1, 0xB260, 0x6DF2, 0xD641, 0x6DF3, 0xB245, + 0x6DF4, 0xD5F5, 0x6DF5, 0xB257, 0x6DF6, 0xD5E9, 0x6DF7, 0xB256, 0x6DF9, 0xB254, 0x6DFA, 0xB24C, 0x6DFB, 0xB24B, 0x6DFC, 0xD9E7, + 0x6DFD, 0xD643, 0x6E00, 0xD5EB, 0x6E03, 0xD9FC, 0x6E05, 0xB24D, 0x6E19, 0xB541, 0x6E1A, 0xB25A, 0x6E1B, 0xB4EE, 0x6E1C, 0xD9F6, + 0x6E1D, 0xB4FC, 0x6E1F, 0xD9EA, 0x6E20, 0xB4EB, 0x6E21, 0xB4E7, 0x6E22, 0xDA49, 0x6E23, 0xB4ED, 0x6E24, 0xB4F1, 0x6E25, 0xB4EC, + 0x6E26, 0xB4F5, 0x6E27, 0xDA4D, 0x6E28, 0xDA44, 0x6E2B, 0xD9F1, 0x6E2C, 0xB4FA, 0x6E2D, 0xB4F4, 0x6E2E, 0xD9FD, 0x6E2F, 0xB4E4, + 0x6E30, 0xDA4A, 0x6E31, 0xDA43, 0x6E32, 0xB4E8, 0x6E33, 0xD9F7, 0x6E34, 0xB4F7, 0x6E35, 0xDA55, 0x6E36, 0xDA56, 0x6E38, 0xB4E5, + 0x6E39, 0xDA48, 0x6E3A, 0xB4F9, 0x6E3B, 0xD9FB, 0x6E3C, 0xD9ED, 0x6E3D, 0xD9EE, 0x6E3E, 0xB4FD, 0x6E3F, 0xD9F2, 0x6E40, 0xD9F9, + 0x6E41, 0xD9F3, 0x6E43, 0xB4FB, 0x6E44, 0xB544, 0x6E45, 0xD9EF, 0x6E46, 0xD9E8, 0x6E47, 0xD9E9, 0x6E49, 0xD9EB, 0x6E4A, 0xB4EA, + 0x6E4B, 0xD9F8, 0x6E4D, 0xB4F8, 0x6E4E, 0xB542, 0x6E51, 0xD9FA, 0x6E52, 0xDA53, 0x6E53, 0xDA4B, 0x6E54, 0xB4E6, 0x6E55, 0xDA51, + 0x6E56, 0xB4F2, 0x6E58, 0xB4F0, 0x6E5A, 0xDA57, 0x6E5B, 0xB4EF, 0x6E5C, 0xDA41, 0x6E5D, 0xD9F4, 0x6E5E, 0xD9FE, 0x6E5F, 0xB547, + 0x6E60, 0xDA45, 0x6E61, 0xDA42, 0x6E62, 0xD9F0, 0x6E63, 0xB543, 0x6E64, 0xDA4F, 0x6E65, 0xDA4C, 0x6E66, 0xDA54, 0x6E67, 0xB4E9, + 0x6E68, 0xDA40, 0x6E69, 0xB546, 0x6E6B, 0xDA47, 0x6E6E, 0xB4F3, 0x6E6F, 0xB4F6, 0x6E71, 0xDA46, 0x6E72, 0xB545, 0x6E73, 0xD9F5, + 0x6E74, 0xD5E4, 0x6E77, 0xDA50, 0x6E78, 0xDA4E, 0x6E79, 0xDA52, 0x6E88, 0xD9EC, 0x6E89, 0xB540, 0x6E8D, 0xDE61, 0x6E8E, 0xDE60, + 0x6E8F, 0xDE46, 0x6E90, 0xB7BD, 0x6E92, 0xDE5F, 0x6E93, 0xDE49, 0x6E94, 0xDE4A, 0x6E96, 0xB7C7, 0x6E97, 0xDE68, 0x6E98, 0xB7C2, + 0x6E99, 0xDE5E, 0x6E9B, 0xDE43, 0x6E9C, 0xB7C8, 0x6E9D, 0xB7BE, 0x6E9E, 0xDE52, 0x6E9F, 0xDE48, 0x6EA0, 0xDE4B, 0x6EA1, 0xDE63, + 0x6EA2, 0xB7B8, 0x6EA3, 0xDE6A, 0x6EA4, 0xDE62, 0x6EA5, 0xB7C1, 0x6EA6, 0xDE57, 0x6EA7, 0xB7CC, 0x6EAA, 0xB7CB, 0x6EAB, 0xB7C5, + 0x6EAE, 0xDE69, 0x6EAF, 0xB7B9, 0x6EB0, 0xDE55, 0x6EB1, 0xDE4C, 0x6EB2, 0xDE59, 0x6EB3, 0xDE65, 0x6EB4, 0xB7CD, 0x6EB6, 0xB7BB, + 0x6EB7, 0xDE54, 0x6EB9, 0xDE4D, 0x6EBA, 0xB7C4, 0x6EBC, 0xB7C3, 0x6EBD, 0xDE50, 0x6EBE, 0xDE5A, 0x6EBF, 0xDE64, 0x6EC0, 0xDE47, + 0x6EC1, 0xDE51, 0x6EC2, 0xB7BC, 0x6EC3, 0xDE5B, 0x6EC4, 0xB7C9, 0x6EC5, 0xB7C0, 0x6EC6, 0xDE4E, 0x6EC7, 0xB7BF, 0x6EC8, 0xDE45, + 0x6EC9, 0xDE53, 0x6ECA, 0xDE67, 0x6ECB, 0xB4FE, 0x6ECC, 0xBAB0, 0x6ECD, 0xDE56, 0x6ECE, 0xE26C, 0x6ECF, 0xDE58, 0x6ED0, 0xDE66, + 0x6ED1, 0xB7C6, 0x6ED2, 0xDE4F, 0x6ED3, 0xB7BA, 0x6ED4, 0xB7CA, 0x6ED5, 0xBCF0, 0x6ED6, 0xDE44, 0x6ED8, 0xDE5D, 0x6EDC, 0xDE5C, + 0x6EEB, 0xE2AA, 0x6EEC, 0xBAAD, 0x6EED, 0xE27D, 0x6EEE, 0xE2A4, 0x6EEF, 0xBAA2, 0x6EF1, 0xE26E, 0x6EF2, 0xBAAF, 0x6EF4, 0xBA77, + 0x6EF5, 0xE26D, 0x6EF6, 0xE2B0, 0x6EF7, 0xBAB1, 0x6EF8, 0xE271, 0x6EF9, 0xE2A3, 0x6EFB, 0xE273, 0x6EFC, 0xE2B3, 0x6EFD, 0xE2AF, + 0x6EFE, 0xBA75, 0x6EFF, 0xBAA1, 0x6F00, 0xE653, 0x6F01, 0xBAAE, 0x6F02, 0xBA7D, 0x6F03, 0xE26F, 0x6F05, 0xE2AE, 0x6F06, 0xBAA3, + 0x6F07, 0xE2AB, 0x6F08, 0xE2B8, 0x6F09, 0xE275, 0x6F0A, 0xE27E, 0x6F0D, 0xE2B6, 0x6F0E, 0xE2AC, 0x6F0F, 0xBA7C, 0x6F12, 0xE27C, + 0x6F13, 0xBA76, 0x6F14, 0xBA74, 0x6F15, 0xBAA8, 0x6F18, 0xE27A, 0x6F19, 0xE277, 0x6F1A, 0xE278, 0x6F1C, 0xE2B2, 0x6F1E, 0xE2B7, + 0x6F1F, 0xE2B5, 0x6F20, 0xBA7A, 0x6F21, 0xE2B9, 0x6F22, 0xBA7E, 0x6F23, 0xBAA7, 0x6F25, 0xE270, 0x6F26, 0xE5FA, 0x6F27, 0xE279, + 0x6F29, 0xBA78, 0x6F2A, 0xBAAC, 0x6F2B, 0xBAA9, 0x6F2C, 0xBA7B, 0x6F2D, 0xE2A5, 0x6F2E, 0xE274, 0x6F2F, 0xBAAA, 0x6F30, 0xE2A7, + 0x6F31, 0xBAA4, 0x6F32, 0xBAA6, 0x6F33, 0xBA73, 0x6F35, 0xE2A9, 0x6F36, 0xE2A1, 0x6F37, 0xE272, 0x6F38, 0xBAA5, 0x6F39, 0xE2B1, + 0x6F3A, 0xE2B4, 0x6F3B, 0xE27B, 0x6F3C, 0xE2A8, 0x6F3E, 0xBA79, 0x6F3F, 0xBCDF, 0x6F40, 0xE2A6, 0x6F41, 0xE5F9, 0x6F43, 0xE2AD, + 0x6F4E, 0xE276, 0x6F4F, 0xE644, 0x6F50, 0xE64E, 0x6F51, 0xBCE2, 0x6F52, 0xE64D, 0x6F53, 0xE659, 0x6F54, 0xBCE4, 0x6F55, 0xE64B, + 0x6F57, 0xE64F, 0x6F58, 0xBCEF, 0x6F5A, 0xE646, 0x6F5B, 0xBCE7, 0x6F5D, 0xE652, 0x6F5E, 0xE9F0, 0x6F5F, 0xBCF3, 0x6F60, 0xBCF2, + 0x6F61, 0xE654, 0x6F62, 0xE643, 0x6F63, 0xE65E, 0x6F64, 0xBCED, 0x6F66, 0xBCE3, 0x6F67, 0xE657, 0x6F69, 0xE65B, 0x6F6A, 0xE660, + 0x6F6B, 0xE655, 0x6F6C, 0xE649, 0x6F6D, 0xBCE6, 0x6F6E, 0xBCE9, 0x6F6F, 0xBCF1, 0x6F70, 0xBCEC, 0x6F72, 0xE64C, 0x6F73, 0xE2A2, + 0x6F76, 0xE648, 0x6F77, 0xE65F, 0x6F78, 0xBCE8, 0x6F7A, 0xBCEB, 0x6F7B, 0xE661, 0x6F7C, 0xBCE0, 0x6F7D, 0xE656, 0x6F7E, 0xE5FB, + 0x6F7F, 0xE65C, 0x6F80, 0xC0DF, 0x6F82, 0xE64A, 0x6F84, 0xBCE1, 0x6F85, 0xE645, 0x6F86, 0xBCE5, 0x6F87, 0xE5FC, 0x6F88, 0xBAAB, + 0x6F89, 0xE641, 0x6F8B, 0xE65A, 0x6F8C, 0xE642, 0x6F8D, 0xE640, 0x6F8E, 0xBCEA, 0x6F90, 0xE658, 0x6F92, 0xE5FE, 0x6F93, 0xE651, + 0x6F94, 0xE650, 0x6F95, 0xE65D, 0x6F96, 0xE647, 0x6F97, 0xBCEE, 0x6F9E, 0xE9F3, 0x6FA0, 0xBF49, 0x6FA1, 0xBEFE, 0x6FA2, 0xEA40, + 0x6FA3, 0xE9EB, 0x6FA4, 0xBF41, 0x6FA5, 0xE9F7, 0x6FA6, 0xBF48, 0x6FA7, 0xBF43, 0x6FA8, 0xE9F5, 0x6FA9, 0xED4F, 0x6FAA, 0xE9FB, + 0x6FAB, 0xEA42, 0x6FAC, 0xE9FA, 0x6FAD, 0xE9E9, 0x6FAE, 0xE9F8, 0x6FAF, 0xEA44, 0x6FB0, 0xEA46, 0x6FB1, 0xBEFD, 0x6FB2, 0xEA45, + 0x6FB3, 0xBF44, 0x6FB4, 0xBF4A, 0x6FB6, 0xBF47, 0x6FB8, 0xE9FE, 0x6FB9, 0xBF46, 0x6FBA, 0xE9F9, 0x6FBC, 0xE9ED, 0x6FBD, 0xE9F2, + 0x6FBF, 0xE9FD, 0x6FC0, 0xBF45, 0x6FC1, 0xBF42, 0x6FC2, 0xBEFC, 0x6FC3, 0xBF40, 0x6FC4, 0xE9F1, 0x6FC6, 0xE5FD, 0x6FC7, 0xE9EC, + 0x6FC8, 0xE9EF, 0x6FC9, 0xEA41, 0x6FCA, 0xE9F4, 0x6FCB, 0xE9EA, 0x6FCC, 0xED4E, 0x6FCD, 0xEA43, 0x6FCE, 0xE9EE, 0x6FCF, 0xE9FC, + 0x6FD4, 0xED51, 0x6FD5, 0xC0E3, 0x6FD8, 0xC0D7, 0x6FDB, 0xC0DB, 0x6FDC, 0xED53, 0x6FDD, 0xED59, 0x6FDE, 0xED57, 0x6FDF, 0xC0D9, + 0x6FE0, 0xC0DA, 0x6FE1, 0xC0E1, 0x6FE2, 0xED5A, 0x6FE3, 0xED52, 0x6FE4, 0xC0DC, 0x6FE6, 0xED56, 0x6FE7, 0xED55, 0x6FE8, 0xED5B, + 0x6FE9, 0xC0E2, 0x6FEB, 0xC0DD, 0x6FEC, 0xC0E0, 0x6FED, 0xED54, 0x6FEE, 0xC0E4, 0x6FEF, 0xC0DE, 0x6FF0, 0xC0E5, 0x6FF1, 0xC0D8, + 0x6FF2, 0xED58, 0x6FF4, 0xED50, 0x6FF7, 0xEFF7, 0x6FFA, 0xC271, 0x6FFB, 0xEFF4, 0x6FFC, 0xEFF6, 0x6FFE, 0xC26F, 0x6FFF, 0xEFF2, + 0x7000, 0xEFF3, 0x7001, 0xEFEE, 0x7004, 0xE9F6, 0x7005, 0xEFEF, 0x7006, 0xC270, 0x7007, 0xEFEB, 0x7009, 0xC26D, 0x700A, 0xEFF8, + 0x700B, 0xC26E, 0x700C, 0xEFEC, 0x700D, 0xEFED, 0x700E, 0xEFF1, 0x700F, 0xC273, 0x7011, 0xC272, 0x7014, 0xEFF0, 0x7015, 0xC378, + 0x7016, 0xF25F, 0x7017, 0xF265, 0x7018, 0xC379, 0x7019, 0xF25C, 0x701A, 0xC376, 0x701B, 0xC373, 0x701C, 0xF267, 0x701D, 0xC377, + 0x701F, 0xC374, 0x7020, 0xF25E, 0x7021, 0xF261, 0x7022, 0xF262, 0x7023, 0xF263, 0x7024, 0xF266, 0x7026, 0xEFF5, 0x7027, 0xF25D, + 0x7028, 0xC375, 0x7029, 0xF264, 0x702A, 0xF268, 0x702B, 0xF260, 0x702F, 0xF45D, 0x7030, 0xC46A, 0x7031, 0xF460, 0x7032, 0xC46B, + 0x7033, 0xF468, 0x7034, 0xF45F, 0x7035, 0xF45C, 0x7037, 0xF45E, 0x7038, 0xF462, 0x7039, 0xF465, 0x703A, 0xF464, 0x703B, 0xF467, + 0x703C, 0xF45B, 0x703E, 0xC469, 0x703F, 0xF463, 0x7040, 0xF466, 0x7041, 0xF469, 0x7042, 0xF461, 0x7043, 0xF5D3, 0x7044, 0xF5D4, + 0x7045, 0xF5D8, 0x7046, 0xF5D9, 0x7048, 0xF5D6, 0x7049, 0xF5D7, 0x704A, 0xF5D5, 0x704C, 0xC4E9, 0x7051, 0xC578, 0x7052, 0xF6EB, + 0x7055, 0xF6E8, 0x7056, 0xF6E9, 0x7057, 0xF6EA, 0x7058, 0xC579, 0x705A, 0xF7E5, 0x705B, 0xF7E4, 0x705D, 0xF8AF, 0x705E, 0xC5F4, + 0x705F, 0xF8AD, 0x7060, 0xF8B0, 0x7061, 0xF8AE, 0x7062, 0xF8F5, 0x7063, 0xC657, 0x7064, 0xC665, 0x7065, 0xF9A3, 0x7066, 0xF96C, + 0x7068, 0xF9A2, 0x7069, 0xF9D0, 0x706A, 0xF9D1, 0x706B, 0xA4F5, 0x7070, 0xA6C7, 0x7071, 0xCA41, 0x7074, 0xCB5E, 0x7076, 0xA85F, + 0x7078, 0xA862, 0x707A, 0xCB5F, 0x707C, 0xA860, 0x707D, 0xA861, 0x7082, 0xCD58, 0x7083, 0xCD5A, 0x7084, 0xCD55, 0x7085, 0xCD52, + 0x7086, 0xCD54, 0x708A, 0xAAA4, 0x708E, 0xAAA2, 0x7091, 0xCD56, 0x7092, 0xAAA3, 0x7093, 0xCD53, 0x7094, 0xCD50, 0x7095, 0xAAA1, + 0x7096, 0xCD57, 0x7098, 0xCD51, 0x7099, 0xAAA5, 0x709A, 0xCD59, 0x709F, 0xCFAF, 0x70A1, 0xCFB3, 0x70A4, 0xACB7, 0x70A9, 0xCFB6, + 0x70AB, 0xACAF, 0x70AC, 0xACB2, 0x70AD, 0xACB4, 0x70AE, 0xACB6, 0x70AF, 0xACB3, 0x70B0, 0xCFB2, 0x70B1, 0xCFB1, 0x70B3, 0xACB1, + 0x70B4, 0xCFB4, 0x70B5, 0xCFB5, 0x70B7, 0xCFAE, 0x70B8, 0xACB5, 0x70BA, 0xACB0, 0x70BE, 0xCFB0, 0x70C5, 0xD277, 0x70C6, 0xD278, + 0x70C7, 0xD279, 0x70C8, 0xAF50, 0x70CA, 0xAF4C, 0x70CB, 0xD26E, 0x70CD, 0xD276, 0x70CE, 0xD27B, 0x70CF, 0xAF51, 0x70D1, 0xD26C, + 0x70D2, 0xD272, 0x70D3, 0xD26B, 0x70D4, 0xD275, 0x70D7, 0xD271, 0x70D8, 0xAF4D, 0x70D9, 0xAF4F, 0x70DA, 0xD27A, 0x70DC, 0xD26A, + 0x70DD, 0xD26D, 0x70DE, 0xD273, 0x70E0, 0xD274, 0x70E1, 0xD27C, 0x70E2, 0xD270, 0x70E4, 0xAF4E, 0x70EF, 0xB26D, 0x70F0, 0xD64E, + 0x70F3, 0xD650, 0x70F4, 0xD64C, 0x70F6, 0xD658, 0x70F7, 0xD64A, 0x70F8, 0xD657, 0x70F9, 0xB269, 0x70FA, 0xD648, 0x70FB, 0xDA5B, + 0x70FC, 0xD652, 0x70FD, 0xB26C, 0x70FF, 0xD653, 0x7100, 0xD656, 0x7102, 0xD65A, 0x7104, 0xD64F, 0x7106, 0xD654, 0x7109, 0xB26A, + 0x710A, 0xB26B, 0x710B, 0xD659, 0x710C, 0xD64D, 0x710D, 0xD649, 0x710E, 0xD65B, 0x7110, 0xD651, 0x7113, 0xD655, 0x7117, 0xD64B, + 0x7119, 0xB548, 0x711A, 0xB549, 0x711B, 0xDA65, 0x711C, 0xB54F, 0x711E, 0xDA59, 0x711F, 0xDA62, 0x7120, 0xDA58, 0x7121, 0xB54C, + 0x7122, 0xDA60, 0x7123, 0xDA5E, 0x7125, 0xDA5F, 0x7126, 0xB54A, 0x7128, 0xDA63, 0x712E, 0xDA5C, 0x712F, 0xDA5A, 0x7130, 0xB54B, + 0x7131, 0xDA5D, 0x7132, 0xDA61, 0x7136, 0xB54D, 0x713A, 0xDA64, 0x7141, 0xDE70, 0x7142, 0xDE77, 0x7143, 0xDE79, 0x7144, 0xDEA1, + 0x7146, 0xB7DA, 0x7147, 0xDE6B, 0x7149, 0xB7D2, 0x714B, 0xDE7A, 0x714C, 0xB7D7, 0x714D, 0xDEA2, 0x714E, 0xB7CE, 0x7150, 0xDE7D, + 0x7152, 0xDE6D, 0x7153, 0xDE7E, 0x7154, 0xDE6C, 0x7156, 0xB7DC, 0x7158, 0xDE78, 0x7159, 0xB7CF, 0x715A, 0xDEA3, 0x715C, 0xB7D4, + 0x715D, 0xDE71, 0x715E, 0xB7D9, 0x715F, 0xDE7C, 0x7160, 0xDE6F, 0x7161, 0xDE76, 0x7162, 0xDE72, 0x7163, 0xDE6E, 0x7164, 0xB7D1, + 0x7165, 0xB7D8, 0x7166, 0xB7D6, 0x7167, 0xB7D3, 0x7168, 0xB7DB, 0x7169, 0xB7D0, 0x716A, 0xDE75, 0x716C, 0xB7D5, 0x716E, 0xB54E, + 0x7170, 0xDE7B, 0x7172, 0xDE73, 0x7178, 0xDE74, 0x717B, 0xE2C1, 0x717D, 0xBAB4, 0x7180, 0xE2BD, 0x7181, 0xE2C3, 0x7182, 0xE2BF, + 0x7184, 0xBAB6, 0x7185, 0xE2BE, 0x7186, 0xE2C2, 0x7187, 0xE2BA, 0x7189, 0xE2BC, 0x718A, 0xBAB5, 0x718F, 0xE2C0, 0x7190, 0xE2BB, + 0x7192, 0xBAB7, 0x7194, 0xBAB2, 0x7197, 0xE2C4, 0x7199, 0xBAB3, 0x719A, 0xE667, 0x719B, 0xE664, 0x719C, 0xE670, 0x719D, 0xE66A, + 0x719E, 0xE66C, 0x719F, 0xBCF4, 0x71A0, 0xE666, 0x71A1, 0xE66E, 0x71A4, 0xE66D, 0x71A5, 0xE66B, 0x71A7, 0xE671, 0x71A8, 0xBCF7, + 0x71A9, 0xE668, 0x71AA, 0xE66F, 0x71AC, 0xBCF5, 0x71AF, 0xE663, 0x71B0, 0xE665, 0x71B1, 0xBCF6, 0x71B2, 0xE662, 0x71B3, 0xE672, + 0x71B5, 0xE669, 0x71B8, 0xEA4A, 0x71B9, 0xBF51, 0x71BC, 0xEA55, 0x71BD, 0xEA53, 0x71BE, 0xBF4B, 0x71BF, 0xEA49, 0x71C0, 0xEA4C, + 0x71C1, 0xEA4D, 0x71C2, 0xEA48, 0x71C3, 0xBF55, 0x71C4, 0xBF56, 0x71C5, 0xEA47, 0x71C6, 0xEA56, 0x71C7, 0xEA51, 0x71C8, 0xBF4F, + 0x71C9, 0xBF4C, 0x71CA, 0xEA50, 0x71CB, 0xEA4E, 0x71CE, 0xBF52, 0x71CF, 0xEA52, 0x71D0, 0xBF4D, 0x71D2, 0xBF4E, 0x71D4, 0xEA4F, + 0x71D5, 0xBF50, 0x71D6, 0xEA4B, 0x71D8, 0xEA54, 0x71D9, 0xBF53, 0x71DA, 0xEA57, 0x71DB, 0xEA58, 0x71DC, 0xBF54, 0x71DF, 0xC0E7, + 0x71E0, 0xC0EE, 0x71E1, 0xED5C, 0x71E2, 0xED62, 0x71E4, 0xED60, 0x71E5, 0xC0EA, 0x71E6, 0xC0E9, 0x71E7, 0xC0E6, 0x71E8, 0xED5E, + 0x71EC, 0xC0EC, 0x71ED, 0xC0EB, 0x71EE, 0xC0E8, 0x71F0, 0xED61, 0x71F1, 0xED5D, 0x71F2, 0xED5F, 0x71F4, 0xC0ED, 0x71F8, 0xC277, + 0x71F9, 0xEFFB, 0x71FB, 0xC274, 0x71FC, 0xC275, 0x71FD, 0xEFFD, 0x71FE, 0xC276, 0x71FF, 0xEFFA, 0x7201, 0xEFF9, 0x7202, 0xF26C, + 0x7203, 0xEFFC, 0x7205, 0xF26D, 0x7206, 0xC37A, 0x7207, 0xF26B, 0x720A, 0xF26A, 0x720C, 0xF269, 0x720D, 0xC37B, 0x7210, 0xC46C, + 0x7213, 0xF46A, 0x7214, 0xF46B, 0x7219, 0xF5DC, 0x721A, 0xF5DB, 0x721B, 0xC4EA, 0x721D, 0xF5DA, 0x721E, 0xF6EC, 0x721F, 0xF6ED, + 0x7222, 0xF7E6, 0x7223, 0xF8B1, 0x7226, 0xF8F6, 0x7227, 0xF9BC, 0x7228, 0xC679, 0x7229, 0xF9C6, 0x722A, 0xA4F6, 0x722C, 0xAAA6, + 0x722D, 0xAAA7, 0x7230, 0xACB8, 0x7235, 0xC0EF, 0x7236, 0xA4F7, 0x7238, 0xAAA8, 0x7239, 0xAF52, 0x723A, 0xB7DD, 0x723B, 0xA4F8, + 0x723D, 0xB26E, 0x723E, 0xBAB8, 0x723F, 0xC962, 0x7241, 0xCFB7, 0x7242, 0xD27D, 0x7244, 0xE2C5, 0x7246, 0xC0F0, 0x7247, 0xA4F9, + 0x7248, 0xAAA9, 0x7249, 0xCFB8, 0x724A, 0xCFB9, 0x724B, 0xDA66, 0x724C, 0xB550, 0x724F, 0xDEA4, 0x7252, 0xB7DE, 0x7253, 0xE2C6, + 0x7256, 0xBCF8, 0x7258, 0xC37C, 0x7259, 0xA4FA, 0x725A, 0xDA67, 0x725B, 0xA4FB, 0x725D, 0xA6C9, 0x725E, 0xCA42, 0x725F, 0xA6C8, + 0x7260, 0xA865, 0x7261, 0xA864, 0x7262, 0xA863, 0x7263, 0xCB60, 0x7267, 0xAAAA, 0x7269, 0xAAAB, 0x726A, 0xCD5B, 0x726C, 0xCFBA, + 0x726E, 0xCFBD, 0x726F, 0xACBA, 0x7270, 0xCFBB, 0x7272, 0xACB9, 0x7273, 0xCFBC, 0x7274, 0xACBB, 0x7276, 0xD2A2, 0x7277, 0xD2A1, + 0x7278, 0xD27E, 0x7279, 0xAF53, 0x727B, 0xD65D, 0x727C, 0xD65E, 0x727D, 0xB26F, 0x727E, 0xD65C, 0x727F, 0xD65F, 0x7280, 0xB552, + 0x7281, 0xB270, 0x7284, 0xB551, 0x7285, 0xDA6B, 0x7286, 0xDA6A, 0x7288, 0xDA68, 0x7289, 0xDA69, 0x728B, 0xDA6C, 0x728C, 0xDEA6, + 0x728D, 0xDEA5, 0x728E, 0xDEA9, 0x7290, 0xDEA8, 0x7291, 0xDEA7, 0x7292, 0xBAB9, 0x7293, 0xE2C9, 0x7295, 0xE2C8, 0x7296, 0xBABA, + 0x7297, 0xE2C7, 0x7298, 0xE673, 0x729A, 0xE674, 0x729B, 0xBCF9, 0x729D, 0xEA59, 0x729E, 0xEA5A, 0x72A1, 0xF272, 0x72A2, 0xC37D, + 0x72A3, 0xF271, 0x72A4, 0xF270, 0x72A5, 0xF26E, 0x72A6, 0xF26F, 0x72A7, 0xC4EB, 0x72A8, 0xF46C, 0x72A9, 0xF6EE, 0x72AA, 0xF8F7, + 0x72AC, 0xA4FC, 0x72AE, 0xC9A5, 0x72AF, 0xA5C7, 0x72B0, 0xC9A6, 0x72B4, 0xCA43, 0x72B5, 0xCA44, 0x72BA, 0xCB66, 0x72BD, 0xCB62, + 0x72BF, 0xCB61, 0x72C0, 0xAAAC, 0x72C1, 0xCB65, 0x72C2, 0xA867, 0x72C3, 0xCB63, 0x72C4, 0xA866, 0x72C5, 0xCB67, 0x72C6, 0xCB64, + 0x72C9, 0xCD5F, 0x72CA, 0xCFBE, 0x72CB, 0xCD5D, 0x72CC, 0xCD64, 0x72CE, 0xAAAD, 0x72D0, 0xAAB0, 0x72D1, 0xCD65, 0x72D2, 0xCD61, + 0x72D4, 0xCD62, 0x72D6, 0xCD5C, 0x72D7, 0xAAAF, 0x72D8, 0xCD5E, 0x72D9, 0xAAAE, 0x72DA, 0xCD63, 0x72DC, 0xCD60, 0x72DF, 0xCFC2, + 0x72E0, 0xACBD, 0x72E1, 0xACBE, 0x72E3, 0xCFC5, 0x72E4, 0xCFBF, 0x72E6, 0xCFC4, 0x72E8, 0xCFC0, 0x72E9, 0xACBC, 0x72EA, 0xCFC3, + 0x72EB, 0xCFC1, 0x72F3, 0xD2A8, 0x72F4, 0xD2A5, 0x72F6, 0xD2A7, 0x72F7, 0xAF58, 0x72F8, 0xAF57, 0x72F9, 0xAF55, 0x72FA, 0xD2A4, + 0x72FB, 0xD2A9, 0x72FC, 0xAF54, 0x72FD, 0xAF56, 0x72FE, 0xD2A6, 0x72FF, 0xD667, 0x7300, 0xD2A3, 0x7301, 0xD2AA, 0x7307, 0xD662, + 0x7308, 0xD666, 0x730A, 0xD665, 0x730B, 0xDA6E, 0x730C, 0xDA79, 0x730F, 0xD668, 0x7311, 0xD663, 0x7312, 0xDA6D, 0x7313, 0xB274, + 0x7316, 0xB273, 0x7317, 0xD661, 0x7318, 0xD664, 0x7319, 0xB275, 0x731B, 0xB272, 0x731C, 0xB271, 0x731D, 0xD660, 0x731E, 0xD669, + 0x7322, 0xDA70, 0x7323, 0xDA77, 0x7325, 0xB554, 0x7326, 0xDA76, 0x7327, 0xDA73, 0x7329, 0xB556, 0x732D, 0xDA75, 0x7330, 0xDA6F, + 0x7331, 0xDA71, 0x7332, 0xDA74, 0x7333, 0xDA72, 0x7334, 0xB555, 0x7335, 0xDA78, 0x7336, 0xB553, 0x7337, 0xB7DF, 0x733A, 0xDEAD, + 0x733B, 0xDEAC, 0x733C, 0xDEAA, 0x733E, 0xB7E2, 0x733F, 0xB7E1, 0x7340, 0xDEAE, 0x7342, 0xDEAB, 0x7343, 0xE2CA, 0x7344, 0xBABB, + 0x7345, 0xB7E0, 0x7349, 0xDEB0, 0x734A, 0xDEAF, 0x734C, 0xE2CD, 0x734D, 0xE2CB, 0x734E, 0xBCFA, 0x7350, 0xBABC, 0x7351, 0xE2CC, + 0x7352, 0xE676, 0x7357, 0xBCFB, 0x7358, 0xE675, 0x7359, 0xE67E, 0x735A, 0xE67D, 0x735B, 0xE67B, 0x735D, 0xE67A, 0x735E, 0xE677, + 0x735F, 0xE678, 0x7360, 0xE679, 0x7361, 0xE67C, 0x7362, 0xE6A1, 0x7365, 0xEA5F, 0x7366, 0xEA5C, 0x7367, 0xEA5D, 0x7368, 0xBF57, + 0x7369, 0xEA5B, 0x736A, 0xEA61, 0x736B, 0xEA60, 0x736C, 0xEA5E, 0x736E, 0xED64, 0x736F, 0xED65, 0x7370, 0xC0F1, 0x7372, 0xC0F2, + 0x7373, 0xED63, 0x7375, 0xC279, 0x7376, 0xEFFE, 0x7377, 0xC278, 0x7378, 0xC37E, 0x737A, 0xC3A1, 0x737B, 0xC46D, 0x737C, 0xF46E, + 0x737D, 0xF46D, 0x737E, 0xF5DD, 0x737F, 0xF6EF, 0x7380, 0xC57A, 0x7381, 0xF7E8, 0x7382, 0xF7E7, 0x7383, 0xF7E9, 0x7384, 0xA5C8, + 0x7385, 0xCFC6, 0x7386, 0xAF59, 0x7387, 0xB276, 0x7388, 0xD66A, 0x7389, 0xA5C9, 0x738A, 0xC9A7, 0x738B, 0xA4FD, 0x738E, 0xCA45, + 0x7392, 0xCB6C, 0x7393, 0xCB6A, 0x7394, 0xCB6B, 0x7395, 0xCB68, 0x7396, 0xA868, 0x7397, 0xCB69, 0x739D, 0xCD6D, 0x739F, 0xAAB3, + 0x73A0, 0xCD6B, 0x73A1, 0xCD67, 0x73A2, 0xCD6A, 0x73A4, 0xCD66, 0x73A5, 0xAAB5, 0x73A6, 0xCD69, 0x73A8, 0xAAB2, 0x73A9, 0xAAB1, + 0x73AB, 0xAAB4, 0x73AC, 0xCD6C, 0x73AD, 0xCD68, 0x73B2, 0xACC2, 0x73B3, 0xACC5, 0x73B4, 0xCFCE, 0x73B5, 0xCFCD, 0x73B6, 0xCFCC, + 0x73B7, 0xACBF, 0x73B8, 0xCFD5, 0x73B9, 0xCFCB, 0x73BB, 0xACC1, 0x73BC, 0xD2AF, 0x73BE, 0xCFD2, 0x73BF, 0xCFD0, 0x73C0, 0xACC4, + 0x73C2, 0xCFC8, 0x73C3, 0xCFD3, 0x73C5, 0xCFCA, 0x73C6, 0xCFD4, 0x73C7, 0xCFD1, 0x73C8, 0xCFC9, 0x73CA, 0xACC0, 0x73CB, 0xCFD6, + 0x73CC, 0xCFC7, 0x73CD, 0xACC3, 0x73D2, 0xD2B4, 0x73D3, 0xD2AB, 0x73D4, 0xD2B6, 0x73D6, 0xD2AE, 0x73D7, 0xD2B9, 0x73D8, 0xD2BA, + 0x73D9, 0xD2AC, 0x73DA, 0xD2B8, 0x73DB, 0xD2B5, 0x73DC, 0xD2B3, 0x73DD, 0xD2B7, 0x73DE, 0xAF5F, 0x73E0, 0xAF5D, 0x73E3, 0xD2B1, + 0x73E5, 0xD2AD, 0x73E7, 0xD2B0, 0x73E8, 0xD2BB, 0x73E9, 0xD2B2, 0x73EA, 0xAF5E, 0x73EB, 0xCFCF, 0x73ED, 0xAF5A, 0x73EE, 0xAF5C, + 0x73F4, 0xD678, 0x73F5, 0xD66D, 0x73F6, 0xD66B, 0x73F8, 0xD66C, 0x73FA, 0xD673, 0x73FC, 0xD674, 0x73FD, 0xD670, 0x73FE, 0xB27B, + 0x73FF, 0xD675, 0x7400, 0xD672, 0x7401, 0xD66F, 0x7403, 0xB279, 0x7404, 0xD66E, 0x7405, 0xB277, 0x7406, 0xB27A, 0x7407, 0xD671, + 0x7408, 0xD679, 0x7409, 0xAF5B, 0x740A, 0xB278, 0x740B, 0xD677, 0x740C, 0xD676, 0x740D, 0xB27C, 0x7416, 0xDA7E, 0x741A, 0xDAA1, + 0x741B, 0xB560, 0x741D, 0xDAA7, 0x7420, 0xDAA9, 0x7421, 0xDAA2, 0x7422, 0xB55A, 0x7423, 0xDAA6, 0x7424, 0xDAA5, 0x7425, 0xB55B, + 0x7426, 0xB561, 0x7428, 0xB562, 0x7429, 0xDAA8, 0x742A, 0xB558, 0x742B, 0xDA7D, 0x742C, 0xDA7B, 0x742D, 0xDAA3, 0x742E, 0xDA7A, + 0x742F, 0xB55F, 0x7430, 0xDA7C, 0x7431, 0xDAA4, 0x7432, 0xDAAA, 0x7433, 0xB559, 0x7434, 0xB55E, 0x7435, 0xB55C, 0x7436, 0xB55D, + 0x743A, 0xB557, 0x743F, 0xB7E9, 0x7440, 0xDEB7, 0x7441, 0xB7E8, 0x7442, 0xDEBB, 0x7444, 0xDEB1, 0x7446, 0xDEBC, 0x744A, 0xDEB2, + 0x744B, 0xDEB3, 0x744D, 0xDEBD, 0x744E, 0xDEBA, 0x744F, 0xDEB8, 0x7450, 0xDEB9, 0x7451, 0xDEB5, 0x7452, 0xDEB4, 0x7454, 0xDEBE, + 0x7455, 0xB7E5, 0x7457, 0xDEB6, 0x7459, 0xB7EA, 0x745A, 0xB7E4, 0x745B, 0xB7EB, 0x745C, 0xB7EC, 0x745E, 0xB7E7, 0x745F, 0xB7E6, + 0x7462, 0xE2CE, 0x7463, 0xBABE, 0x7464, 0xBABD, 0x7467, 0xE2D3, 0x7469, 0xBCFC, 0x746A, 0xBABF, 0x746D, 0xBAC1, 0x746E, 0xE2D4, + 0x746F, 0xB7E3, 0x7470, 0xBAC0, 0x7471, 0xE2D0, 0x7472, 0xE2D2, 0x7473, 0xE2CF, 0x7475, 0xE2D1, 0x7479, 0xE6AB, 0x747C, 0xE6AA, + 0x747D, 0xE6A7, 0x747E, 0xBD40, 0x747F, 0xEA62, 0x7480, 0xBD41, 0x7481, 0xE6A6, 0x7483, 0xBCFE, 0x7485, 0xE6A8, 0x7486, 0xE6A5, + 0x7487, 0xE6A2, 0x7488, 0xE6A9, 0x7489, 0xE6A3, 0x748A, 0xE6A4, 0x748B, 0xBCFD, 0x7490, 0xED69, 0x7492, 0xEA66, 0x7494, 0xEA65, + 0x7495, 0xEA67, 0x7497, 0xED66, 0x7498, 0xBF5A, 0x749A, 0xEA63, 0x749C, 0xBF58, 0x749E, 0xBF5C, 0x749F, 0xBF5B, 0x74A0, 0xEA64, + 0x74A1, 0xEA68, 0x74A3, 0xBF59, 0x74A5, 0xED6D, 0x74A6, 0xC0F5, 0x74A7, 0xC27A, 0x74A8, 0xC0F6, 0x74A9, 0xC0F3, 0x74AA, 0xED6A, + 0x74AB, 0xED68, 0x74AD, 0xED6B, 0x74AF, 0xED6E, 0x74B0, 0xC0F4, 0x74B1, 0xED6C, 0x74B2, 0xED67, 0x74B5, 0xF042, 0x74B6, 0xF045, + 0x74B7, 0xF275, 0x74B8, 0xF040, 0x74BA, 0xF46F, 0x74BB, 0xF046, 0x74BD, 0xC3A2, 0x74BE, 0xF044, 0x74BF, 0xC27B, 0x74C0, 0xF041, + 0x74C1, 0xF043, 0x74C2, 0xF047, 0x74C3, 0xF276, 0x74C5, 0xF274, 0x74CA, 0xC3A3, 0x74CB, 0xF273, 0x74CF, 0xC46E, 0x74D4, 0xC4ED, + 0x74D5, 0xF6F1, 0x74D6, 0xC4EC, 0x74D7, 0xF6F3, 0x74D8, 0xF6F0, 0x74D9, 0xF6F2, 0x74DA, 0xC5D0, 0x74DB, 0xF8B2, 0x74DC, 0xA5CA, + 0x74DD, 0xCD6E, 0x74DE, 0xD2BC, 0x74DF, 0xD2BD, 0x74E0, 0xB27D, 0x74E1, 0xDEBF, 0x74E2, 0xBF5D, 0x74E3, 0xC3A4, 0x74E4, 0xC57B, + 0x74E5, 0xF8B3, 0x74E6, 0xA5CB, 0x74E8, 0xCD6F, 0x74E9, 0xA260, 0x74EC, 0xCFD7, 0x74EE, 0xCFD8, 0x74F4, 0xD2BE, 0x74F5, 0xD2BF, + 0x74F6, 0xB27E, 0x74F7, 0xB2A1, 0x74FB, 0xDAAB, 0x74FD, 0xDEC2, 0x74FE, 0xDEC1, 0x74FF, 0xDEC0, 0x7500, 0xE2D5, 0x7502, 0xE2D6, + 0x7503, 0xE2D7, 0x7504, 0xBAC2, 0x7507, 0xE6AD, 0x7508, 0xE6AC, 0x750B, 0xEA69, 0x750C, 0xBF5E, 0x750D, 0xBF5F, 0x750F, 0xED72, + 0x7510, 0xED6F, 0x7511, 0xED70, 0x7512, 0xED71, 0x7513, 0xF049, 0x7514, 0xF048, 0x7515, 0xC27C, 0x7516, 0xF277, 0x7517, 0xF5DE, + 0x7518, 0xA5CC, 0x751A, 0xACC6, 0x751C, 0xB2A2, 0x751D, 0xDEC3, 0x751F, 0xA5CD, 0x7521, 0xD2C0, 0x7522, 0xB2A3, 0x7525, 0xB563, + 0x7526, 0xB564, 0x7528, 0xA5CE, 0x7529, 0xA5CF, 0x752A, 0xCA46, 0x752B, 0xA86A, 0x752C, 0xA869, 0x752D, 0xACC7, 0x752E, 0xCFD9, + 0x752F, 0xDAAC, 0x7530, 0xA5D0, 0x7531, 0xA5D1, 0x7532, 0xA5D2, 0x7533, 0xA5D3, 0x7537, 0xA86B, 0x7538, 0xA86C, 0x7539, 0xCB6E, + 0x753A, 0xCB6D, 0x753D, 0xAAB6, 0x753E, 0xCD72, 0x753F, 0xCD70, 0x7540, 0xCD71, 0x7547, 0xCFDA, 0x7548, 0xCFDB, 0x754B, 0xACCB, + 0x754C, 0xACC9, 0x754E, 0xACCA, 0x754F, 0xACC8, 0x7554, 0xAF60, 0x7559, 0xAF64, 0x755A, 0xAF63, 0x755B, 0xD2C1, 0x755C, 0xAF62, + 0x755D, 0xAF61, 0x755F, 0xD2C2, 0x7562, 0xB2A6, 0x7563, 0xD67B, 0x7564, 0xD67A, 0x7565, 0xB2A4, 0x7566, 0xB2A5, 0x756A, 0xB566, + 0x756B, 0xB565, 0x756C, 0xDAAE, 0x756F, 0xDAAD, 0x7570, 0xB2A7, 0x7576, 0xB7ED, 0x7577, 0xDEC5, 0x7578, 0xB7EE, 0x7579, 0xDEC4, + 0x757D, 0xE2D8, 0x757E, 0xE6AE, 0x757F, 0xBD42, 0x7580, 0xEA6A, 0x7584, 0xED73, 0x7586, 0xC3A6, 0x7587, 0xC3A5, 0x758A, 0xC57C, + 0x758B, 0xA5D4, 0x758C, 0xCD73, 0x758F, 0xB2A8, 0x7590, 0xE2D9, 0x7591, 0xBAC3, 0x7594, 0xCB6F, 0x7595, 0xCB70, 0x7598, 0xCD74, + 0x7599, 0xAAB8, 0x759A, 0xAAB9, 0x759D, 0xAAB7, 0x75A2, 0xACCF, 0x75A3, 0xACD0, 0x75A4, 0xACCD, 0x75A5, 0xACCE, 0x75A7, 0xCFDC, + 0x75AA, 0xCFDD, 0x75AB, 0xACCC, 0x75B0, 0xD2C3, 0x75B2, 0xAF68, 0x75B3, 0xAF69, 0x75B5, 0xB2AB, 0x75B6, 0xD2C9, 0x75B8, 0xAF6E, + 0x75B9, 0xAF6C, 0x75BA, 0xD2CA, 0x75BB, 0xD2C5, 0x75BC, 0xAF6B, 0x75BD, 0xAF6A, 0x75BE, 0xAF65, 0x75BF, 0xD2C8, 0x75C0, 0xD2C7, + 0x75C1, 0xD2C4, 0x75C2, 0xAF6D, 0x75C4, 0xD2C6, 0x75C5, 0xAF66, 0x75C7, 0xAF67, 0x75CA, 0xB2AC, 0x75CB, 0xD6A1, 0x75CC, 0xD6A2, + 0x75CD, 0xB2AD, 0x75CE, 0xD67C, 0x75CF, 0xD67E, 0x75D0, 0xD6A4, 0x75D1, 0xD6A3, 0x75D2, 0xD67D, 0x75D4, 0xB2A9, 0x75D5, 0xB2AA, + 0x75D7, 0xDAB6, 0x75D8, 0xB56B, 0x75D9, 0xB56A, 0x75DA, 0xDAB0, 0x75DB, 0xB568, 0x75DD, 0xDAB3, 0x75DE, 0xB56C, 0x75DF, 0xDAB4, + 0x75E0, 0xB56D, 0x75E1, 0xDAB1, 0x75E2, 0xB567, 0x75E3, 0xB569, 0x75E4, 0xDAB5, 0x75E6, 0xDAB2, 0x75E7, 0xDAAF, 0x75ED, 0xDED2, + 0x75EF, 0xDEC7, 0x75F0, 0xB7F0, 0x75F1, 0xB7F3, 0x75F2, 0xB7F2, 0x75F3, 0xB7F7, 0x75F4, 0xB7F6, 0x75F5, 0xDED3, 0x75F6, 0xDED1, + 0x75F7, 0xDECA, 0x75F8, 0xDECE, 0x75F9, 0xDECD, 0x75FA, 0xB7F4, 0x75FB, 0xDED0, 0x75FC, 0xDECC, 0x75FD, 0xDED4, 0x75FE, 0xDECB, + 0x75FF, 0xB7F5, 0x7600, 0xB7EF, 0x7601, 0xB7F1, 0x7603, 0xDEC9, 0x7608, 0xE2DB, 0x7609, 0xBAC7, 0x760A, 0xE2DF, 0x760B, 0xBAC6, + 0x760C, 0xE2DC, 0x760D, 0xBAC5, 0x760F, 0xDEC8, 0x7610, 0xDECF, 0x7611, 0xE2DE, 0x7613, 0xBAC8, 0x7614, 0xE2E0, 0x7615, 0xE2DD, + 0x7616, 0xE2DA, 0x7619, 0xE6B1, 0x761A, 0xE6B5, 0x761B, 0xE6B7, 0x761C, 0xE6B3, 0x761D, 0xE6B2, 0x761E, 0xE6B0, 0x761F, 0xBD45, + 0x7620, 0xBD43, 0x7621, 0xBD48, 0x7622, 0xBD49, 0x7623, 0xE6B4, 0x7624, 0xBD46, 0x7625, 0xE6AF, 0x7626, 0xBD47, 0x7627, 0xBAC4, + 0x7628, 0xE6B6, 0x7629, 0xBD44, 0x762D, 0xEA6C, 0x762F, 0xEA6B, 0x7630, 0xEA73, 0x7631, 0xEA6D, 0x7632, 0xEA72, 0x7633, 0xEA6F, + 0x7634, 0xBF60, 0x7635, 0xEA71, 0x7638, 0xBF61, 0x763A, 0xBF62, 0x763C, 0xEA70, 0x763D, 0xEA6E, 0x7642, 0xC0F8, 0x7643, 0xED74, + 0x7646, 0xC0F7, 0x7647, 0xED77, 0x7648, 0xED75, 0x7649, 0xED76, 0x764C, 0xC0F9, 0x7650, 0xF04D, 0x7652, 0xC2A1, 0x7653, 0xF04E, + 0x7656, 0xC27D, 0x7657, 0xF04F, 0x7658, 0xC27E, 0x7659, 0xF04C, 0x765A, 0xF050, 0x765C, 0xF04A, 0x765F, 0xC3A7, 0x7660, 0xF278, + 0x7661, 0xC3A8, 0x7662, 0xC46F, 0x7664, 0xF04B, 0x7665, 0xC470, 0x7669, 0xC4EE, 0x766A, 0xF5DF, 0x766C, 0xC57E, 0x766D, 0xF6F4, + 0x766E, 0xC57D, 0x7670, 0xF7EA, 0x7671, 0xC5F5, 0x7672, 0xC5F6, 0x7675, 0xF9CC, 0x7678, 0xACD1, 0x7679, 0xCFDE, 0x767B, 0xB56E, + 0x767C, 0xB56F, 0x767D, 0xA5D5, 0x767E, 0xA6CA, 0x767F, 0xCA47, 0x7681, 0xCB71, 0x7682, 0xA86D, 0x7684, 0xAABA, 0x7686, 0xACD2, + 0x7687, 0xACD3, 0x7688, 0xACD4, 0x7689, 0xD6A6, 0x768A, 0xD2CB, 0x768B, 0xAF6F, 0x768E, 0xB2AE, 0x768F, 0xD6A5, 0x7692, 0xDAB8, + 0x7693, 0xB571, 0x7695, 0xDAB7, 0x7696, 0xB570, 0x7699, 0xDED5, 0x769A, 0xBD4A, 0x769B, 0xE6BB, 0x769C, 0xE6B8, 0x769D, 0xE6B9, + 0x769E, 0xE6BA, 0x76A4, 0xED78, 0x76A6, 0xF051, 0x76AA, 0xF471, 0x76AB, 0xF470, 0x76AD, 0xF6F5, 0x76AE, 0xA5D6, 0x76AF, 0xCD75, + 0x76B0, 0xAF70, 0x76B4, 0xB572, 0x76B5, 0xDED6, 0x76B8, 0xE2E1, 0x76BA, 0xBD4B, 0x76BB, 0xEA74, 0x76BD, 0xF052, 0x76BE, 0xF472, + 0x76BF, 0xA5D7, 0x76C2, 0xAABB, 0x76C3, 0xACD7, 0x76C4, 0xCFDF, 0x76C5, 0xACD8, 0x76C6, 0xACD6, 0x76C8, 0xACD5, 0x76C9, 0xD2CC, + 0x76CA, 0xAF71, 0x76CD, 0xAF72, 0x76CE, 0xAF73, 0x76D2, 0xB2B0, 0x76D3, 0xD6A7, 0x76D4, 0xB2AF, 0x76DA, 0xDAB9, 0x76DB, 0xB2B1, + 0x76DC, 0xB573, 0x76DD, 0xDED7, 0x76DE, 0xB7F8, 0x76DF, 0xB7F9, 0x76E1, 0xBAC9, 0x76E3, 0xBACA, 0x76E4, 0xBD4C, 0x76E5, 0xBF64, + 0x76E6, 0xEA75, 0x76E7, 0xBF63, 0x76E9, 0xED79, 0x76EA, 0xC0FA, 0x76EC, 0xF053, 0x76ED, 0xF473, 0x76EE, 0xA5D8, 0x76EF, 0xA86E, + 0x76F0, 0xCD78, 0x76F1, 0xCD77, 0x76F2, 0xAABC, 0x76F3, 0xCD76, 0x76F4, 0xAABD, 0x76F5, 0xCD79, 0x76F7, 0xCFE5, 0x76F8, 0xACDB, + 0x76F9, 0xACDA, 0x76FA, 0xCFE7, 0x76FB, 0xCFE6, 0x76FC, 0xACDF, 0x76FE, 0xACDE, 0x7701, 0xACD9, 0x7703, 0xCFE1, 0x7704, 0xCFE2, + 0x7705, 0xCFE3, 0x7707, 0xACE0, 0x7708, 0xCFE0, 0x7709, 0xACDC, 0x770A, 0xCFE4, 0x770B, 0xACDD, 0x7710, 0xD2CF, 0x7711, 0xD2D3, + 0x7712, 0xD2D1, 0x7713, 0xD2D0, 0x7715, 0xD2D4, 0x7719, 0xD2D5, 0x771A, 0xD2D6, 0x771B, 0xD2CE, 0x771D, 0xD2CD, 0x771F, 0xAF75, + 0x7720, 0xAF76, 0x7722, 0xD2D7, 0x7723, 0xD2D2, 0x7725, 0xD6B0, 0x7727, 0xD2D8, 0x7728, 0xAF77, 0x7729, 0xAF74, 0x772D, 0xD6AA, + 0x772F, 0xD6A9, 0x7731, 0xD6AB, 0x7732, 0xD6AC, 0x7733, 0xD6AE, 0x7734, 0xD6AD, 0x7735, 0xD6B2, 0x7736, 0xB2B5, 0x7737, 0xB2B2, + 0x7738, 0xB2B6, 0x7739, 0xD6A8, 0x773A, 0xB2B7, 0x773B, 0xD6B1, 0x773C, 0xB2B4, 0x773D, 0xD6AF, 0x773E, 0xB2B3, 0x7744, 0xDABC, + 0x7745, 0xDABE, 0x7746, 0xDABA, 0x7747, 0xDABB, 0x774A, 0xDABF, 0x774B, 0xDAC1, 0x774C, 0xDAC2, 0x774D, 0xDABD, 0x774E, 0xDAC0, + 0x774F, 0xB574, 0x7752, 0xDEDB, 0x7754, 0xDEE0, 0x7755, 0xDED8, 0x7756, 0xDEDC, 0x7759, 0xDEE1, 0x775A, 0xDEDD, 0x775B, 0xB7FA, + 0x775C, 0xB843, 0x775E, 0xB7FD, 0x775F, 0xDED9, 0x7760, 0xDEDA, 0x7761, 0xBACE, 0x7762, 0xB846, 0x7763, 0xB7FE, 0x7765, 0xB844, + 0x7766, 0xB7FC, 0x7767, 0xDEDF, 0x7768, 0xB845, 0x7769, 0xDEDE, 0x776A, 0xB841, 0x776B, 0xB7FB, 0x776C, 0xB842, 0x776D, 0xDEE2, + 0x776E, 0xE2E6, 0x776F, 0xE2E8, 0x7779, 0xB840, 0x777C, 0xE2E3, 0x777D, 0xBACC, 0x777E, 0xE2E9, 0x777F, 0xBACD, 0x7780, 0xE2E7, + 0x7781, 0xE2E2, 0x7782, 0xE2E5, 0x7783, 0xE2EA, 0x7784, 0xBACB, 0x7785, 0xE2E4, 0x7787, 0xBD4E, 0x7788, 0xE6BF, 0x7789, 0xE6BE, + 0x778B, 0xBD51, 0x778C, 0xBD4F, 0x778D, 0xE6BC, 0x778E, 0xBD4D, 0x778F, 0xE6BD, 0x7791, 0xBD50, 0x7795, 0xEA7D, 0x7797, 0xEAA1, + 0x7799, 0xEA7E, 0x779A, 0xEA76, 0x779B, 0xEA7A, 0x779C, 0xEA79, 0x779D, 0xEA77, 0x779E, 0xBF66, 0x779F, 0xBF67, 0x77A0, 0xBF65, + 0x77A1, 0xEA78, 0x77A2, 0xEA7B, 0x77A3, 0xEA7C, 0x77A5, 0xBF68, 0x77A7, 0xC140, 0x77A8, 0xEDA3, 0x77AA, 0xC0FC, 0x77AB, 0xED7B, + 0x77AC, 0xC0FE, 0x77AD, 0xC141, 0x77B0, 0xC0FD, 0x77B1, 0xEDA2, 0x77B2, 0xED7C, 0x77B3, 0xC0FB, 0x77B4, 0xEDA1, 0x77B5, 0xED7A, + 0x77B6, 0xED7E, 0x77B7, 0xED7D, 0x77BA, 0xF055, 0x77BB, 0xC2A4, 0x77BC, 0xC2A5, 0x77BD, 0xC2A2, 0x77BF, 0xC2A3, 0x77C2, 0xF054, + 0x77C4, 0xF27B, 0x77C7, 0xC3A9, 0x77C9, 0xF279, 0x77CA, 0xF27A, 0x77CC, 0xF474, 0x77CD, 0xF477, 0x77CE, 0xF475, 0x77CF, 0xF476, + 0x77D0, 0xF5E0, 0x77D3, 0xC4EF, 0x77D4, 0xF7EB, 0x77D5, 0xF8B4, 0x77D7, 0xC5F7, 0x77D8, 0xF8F8, 0x77D9, 0xF8F9, 0x77DA, 0xC666, + 0x77DB, 0xA5D9, 0x77DC, 0xACE1, 0x77DE, 0xDAC3, 0x77E0, 0xDEE3, 0x77E2, 0xA5DA, 0x77E3, 0xA86F, 0x77E5, 0xAABE, 0x77E7, 0xCFE8, + 0x77E8, 0xCFE9, 0x77E9, 0xAF78, 0x77EC, 0xDAC4, 0x77ED, 0xB575, 0x77EE, 0xB847, 0x77EF, 0xC142, 0x77F0, 0xEDA4, 0x77F1, 0xF27C, + 0x77F2, 0xF478, 0x77F3, 0xA5DB, 0x77F7, 0xCDA1, 0x77F8, 0xCD7A, 0x77F9, 0xCD7C, 0x77FA, 0xCD7E, 0x77FB, 0xCD7D, 0x77FC, 0xCD7B, + 0x77FD, 0xAABF, 0x7802, 0xACE2, 0x7803, 0xCFF2, 0x7805, 0xCFED, 0x7806, 0xCFEA, 0x7809, 0xCFF1, 0x780C, 0xACE4, 0x780D, 0xACE5, + 0x780E, 0xCFF0, 0x780F, 0xCFEF, 0x7810, 0xCFEE, 0x7811, 0xCFEB, 0x7812, 0xCFEC, 0x7813, 0xCFF3, 0x7814, 0xACE3, 0x781D, 0xAF7C, + 0x781F, 0xAFA4, 0x7820, 0xAFA3, 0x7821, 0xD2E1, 0x7822, 0xD2DB, 0x7823, 0xD2D9, 0x7825, 0xAFA1, 0x7826, 0xD6B9, 0x7827, 0xAF7A, + 0x7828, 0xD2DE, 0x7829, 0xD2E2, 0x782A, 0xD2E4, 0x782B, 0xD2E0, 0x782C, 0xD2DA, 0x782D, 0xAFA2, 0x782E, 0xD2DF, 0x782F, 0xD2DD, + 0x7830, 0xAF79, 0x7831, 0xD2E5, 0x7832, 0xAFA5, 0x7833, 0xD2E3, 0x7834, 0xAF7D, 0x7835, 0xD2DC, 0x7837, 0xAF7E, 0x7838, 0xAF7B, + 0x7843, 0xB2B9, 0x7845, 0xD6BA, 0x7848, 0xD6B3, 0x7849, 0xD6B5, 0x784A, 0xD6B7, 0x784C, 0xD6B8, 0x784D, 0xD6B6, 0x784E, 0xB2BA, + 0x7850, 0xD6BB, 0x7852, 0xD6B4, 0x785C, 0xDAC8, 0x785D, 0xB576, 0x785E, 0xDAD0, 0x7860, 0xDAC5, 0x7862, 0xDAD1, 0x7864, 0xDAC6, + 0x7865, 0xDAC7, 0x7868, 0xDACF, 0x7869, 0xDACE, 0x786A, 0xDACB, 0x786B, 0xB2B8, 0x786C, 0xB577, 0x786D, 0xDAC9, 0x786E, 0xDACC, + 0x786F, 0xB578, 0x7870, 0xDACD, 0x7871, 0xDACA, 0x7879, 0xDEEE, 0x787B, 0xDEF2, 0x787C, 0xB84E, 0x787E, 0xE2F0, 0x787F, 0xB851, + 0x7880, 0xDEF0, 0x7881, 0xF9D6, 0x7883, 0xDEED, 0x7884, 0xDEE8, 0x7885, 0xDEEA, 0x7886, 0xDEEB, 0x7887, 0xDEE4, 0x7889, 0xB84D, + 0x788C, 0xB84C, 0x788E, 0xB848, 0x788F, 0xDEE7, 0x7891, 0xB84F, 0x7893, 0xB850, 0x7894, 0xDEE6, 0x7895, 0xDEE9, 0x7896, 0xDEF1, + 0x7897, 0xB84A, 0x7898, 0xB84B, 0x7899, 0xDEEF, 0x789A, 0xDEE5, 0x789E, 0xE2F2, 0x789F, 0xBAD0, 0x78A0, 0xE2F4, 0x78A1, 0xDEEC, + 0x78A2, 0xE2F6, 0x78A3, 0xBAD4, 0x78A4, 0xE2F7, 0x78A5, 0xE2F3, 0x78A7, 0xBAD1, 0x78A8, 0xE2EF, 0x78A9, 0xBAD3, 0x78AA, 0xE2EC, + 0x78AB, 0xE2F1, 0x78AC, 0xE2F5, 0x78AD, 0xE2EE, 0x78B0, 0xB849, 0x78B2, 0xE2EB, 0x78B3, 0xBAD2, 0x78B4, 0xE2ED, 0x78BA, 0xBD54, + 0x78BB, 0xE6C1, 0x78BC, 0xBD58, 0x78BE, 0xBD56, 0x78C1, 0xBACF, 0x78C3, 0xE6C8, 0x78C4, 0xE6C9, 0x78C5, 0xBD53, 0x78C8, 0xE6C7, + 0x78C9, 0xE6CA, 0x78CA, 0xBD55, 0x78CB, 0xBD52, 0x78CC, 0xE6C3, 0x78CD, 0xE6C0, 0x78CE, 0xE6C5, 0x78CF, 0xE6C2, 0x78D0, 0xBD59, + 0x78D1, 0xE6C4, 0x78D4, 0xE6C6, 0x78D5, 0xBD57, 0x78DA, 0xBF6A, 0x78DB, 0xEAA8, 0x78DD, 0xEAA2, 0x78DE, 0xEAA6, 0x78DF, 0xEAAC, + 0x78E0, 0xEAAD, 0x78E1, 0xEAA9, 0x78E2, 0xEAAA, 0x78E3, 0xEAA7, 0x78E5, 0xEAA4, 0x78E7, 0xBF6C, 0x78E8, 0xBF69, 0x78E9, 0xEAA3, + 0x78EA, 0xEAA5, 0x78EC, 0xBF6B, 0x78ED, 0xEAAB, 0x78EF, 0xC146, 0x78F2, 0xEDAA, 0x78F3, 0xEDA5, 0x78F4, 0xC145, 0x78F7, 0xC143, + 0x78F9, 0xEDAC, 0x78FA, 0xC144, 0x78FB, 0xEDA8, 0x78FC, 0xEDA9, 0x78FD, 0xEDA6, 0x78FE, 0xEDAD, 0x78FF, 0xF056, 0x7901, 0xC147, + 0x7902, 0xEDA7, 0x7904, 0xEDAE, 0x7905, 0xEDAB, 0x7909, 0xF05A, 0x790C, 0xF057, 0x790E, 0xC2A6, 0x7910, 0xF05B, 0x7911, 0xF05D, + 0x7912, 0xF05C, 0x7913, 0xF058, 0x7914, 0xF059, 0x7917, 0xF2A3, 0x7919, 0xC3AA, 0x791B, 0xF27E, 0x791C, 0xF2A2, 0x791D, 0xF27D, + 0x791E, 0xF2A4, 0x7921, 0xF2A1, 0x7923, 0xF47A, 0x7924, 0xF47D, 0x7925, 0xF479, 0x7926, 0xC471, 0x7927, 0xF47B, 0x7928, 0xF47C, + 0x7929, 0xF47E, 0x792A, 0xC472, 0x792B, 0xC474, 0x792C, 0xC473, 0x792D, 0xF5E1, 0x792F, 0xF5E3, 0x7931, 0xF5E2, 0x7935, 0xF6F6, + 0x7938, 0xF8B5, 0x7939, 0xF8FA, 0x793A, 0xA5DC, 0x793D, 0xCB72, 0x793E, 0xAAC0, 0x793F, 0xCDA3, 0x7940, 0xAAC1, 0x7941, 0xAAC2, + 0x7942, 0xCDA2, 0x7944, 0xCFF8, 0x7945, 0xCFF7, 0x7946, 0xACE6, 0x7947, 0xACE9, 0x7948, 0xACE8, 0x7949, 0xACE7, 0x794A, 0xCFF4, + 0x794B, 0xCFF6, 0x794C, 0xCFF5, 0x794F, 0xD2E8, 0x7950, 0xAFA7, 0x7951, 0xD2EC, 0x7952, 0xD2EB, 0x7953, 0xD2EA, 0x7954, 0xD2E6, + 0x7955, 0xAFA6, 0x7956, 0xAFAA, 0x7957, 0xAFAD, 0x795A, 0xAFAE, 0x795B, 0xD2E7, 0x795C, 0xD2E9, 0x795D, 0xAFAC, 0x795E, 0xAFAB, + 0x795F, 0xAFA9, 0x7960, 0xAFA8, 0x7961, 0xD6C2, 0x7963, 0xD6C0, 0x7964, 0xD6BC, 0x7965, 0xB2BB, 0x7967, 0xD6BD, 0x7968, 0xB2BC, + 0x7969, 0xD6BE, 0x796A, 0xD6BF, 0x796B, 0xD6C1, 0x796D, 0xB2BD, 0x7970, 0xDAD5, 0x7972, 0xDAD4, 0x7973, 0xDAD3, 0x7974, 0xDAD2, + 0x7979, 0xDEF6, 0x797A, 0xB852, 0x797C, 0xDEF3, 0x797D, 0xDEF5, 0x797F, 0xB853, 0x7981, 0xB854, 0x7982, 0xDEF4, 0x7988, 0xE341, + 0x798A, 0xE2F9, 0x798B, 0xE2FA, 0x798D, 0xBAD7, 0x798E, 0xBAD5, 0x798F, 0xBAD6, 0x7990, 0xE343, 0x7992, 0xE342, 0x7993, 0xE2FE, + 0x7994, 0xE2FD, 0x7995, 0xE2FC, 0x7996, 0xE2FB, 0x7997, 0xE340, 0x7998, 0xE2F8, 0x799A, 0xE6CB, 0x799B, 0xE6D0, 0x799C, 0xE6CE, + 0x79A0, 0xE6CD, 0x79A1, 0xE6CC, 0x79A2, 0xE6CF, 0x79A4, 0xEAAE, 0x79A6, 0xBF6D, 0x79A7, 0xC148, 0x79A8, 0xEDB0, 0x79AA, 0xC149, + 0x79AB, 0xEDAF, 0x79AC, 0xF05F, 0x79AD, 0xF05E, 0x79AE, 0xC2A7, 0x79B0, 0xF2A5, 0x79B1, 0xC3AB, 0x79B2, 0xF4A1, 0x79B3, 0xC5A1, + 0x79B4, 0xF6F7, 0x79B6, 0xF8B7, 0x79B7, 0xF8B6, 0x79B8, 0xC9A8, 0x79B9, 0xACEA, 0x79BA, 0xACEB, 0x79BB, 0xD6C3, 0x79BD, 0xB856, + 0x79BE, 0xA5DD, 0x79BF, 0xA872, 0x79C0, 0xA871, 0x79C1, 0xA870, 0x79C5, 0xCDA4, 0x79C8, 0xAAC4, 0x79C9, 0xAAC3, 0x79CB, 0xACEE, + 0x79CD, 0xCFFA, 0x79CE, 0xCFFD, 0x79CF, 0xCFFB, 0x79D1, 0xACEC, 0x79D2, 0xACED, 0x79D5, 0xCFF9, 0x79D6, 0xCFFC, 0x79D8, 0xAFB5, + 0x79DC, 0xD2F3, 0x79DD, 0xD2F5, 0x79DE, 0xD2F4, 0x79DF, 0xAFB2, 0x79E0, 0xD2EF, 0x79E3, 0xAFB0, 0x79E4, 0xAFAF, 0x79E6, 0xAFB3, + 0x79E7, 0xAFB1, 0x79E9, 0xAFB4, 0x79EA, 0xD2F2, 0x79EB, 0xD2ED, 0x79EC, 0xD2EE, 0x79ED, 0xD2F1, 0x79EE, 0xD2F0, 0x79F6, 0xD6C6, + 0x79F7, 0xD6C7, 0x79F8, 0xD6C5, 0x79FA, 0xD6C4, 0x79FB, 0xB2BE, 0x7A00, 0xB57D, 0x7A02, 0xDAD6, 0x7A03, 0xDAD8, 0x7A04, 0xDADA, + 0x7A05, 0xB57C, 0x7A08, 0xB57A, 0x7A0A, 0xDAD7, 0x7A0B, 0xB57B, 0x7A0C, 0xDAD9, 0x7A0D, 0xB579, 0x7A10, 0xDF41, 0x7A11, 0xDEF7, + 0x7A12, 0xDEFA, 0x7A13, 0xDEFE, 0x7A14, 0xB85A, 0x7A15, 0xDEFC, 0x7A17, 0xDEFB, 0x7A18, 0xDEF8, 0x7A19, 0xDEF9, 0x7A1A, 0xB858, + 0x7A1B, 0xDF40, 0x7A1C, 0xB857, 0x7A1E, 0xB85C, 0x7A1F, 0xB85B, 0x7A20, 0xB859, 0x7A22, 0xDEFD, 0x7A26, 0xE349, 0x7A28, 0xE348, + 0x7A2B, 0xE344, 0x7A2E, 0xBAD8, 0x7A2F, 0xE347, 0x7A30, 0xE346, 0x7A31, 0xBAD9, 0x7A37, 0xBD5E, 0x7A39, 0xE6D2, 0x7A3B, 0xBD5F, + 0x7A3C, 0xBD5B, 0x7A3D, 0xBD5D, 0x7A3F, 0xBD5A, 0x7A40, 0xBD5C, 0x7A44, 0xEAAF, 0x7A46, 0xBF70, 0x7A47, 0xEAB1, 0x7A48, 0xEAB0, + 0x7A4A, 0xE345, 0x7A4B, 0xBF72, 0x7A4C, 0xBF71, 0x7A4D, 0xBF6E, 0x7A4E, 0xBF6F, 0x7A54, 0xEDB5, 0x7A56, 0xEDB3, 0x7A57, 0xC14A, + 0x7A58, 0xEDB4, 0x7A5A, 0xEDB6, 0x7A5B, 0xEDB2, 0x7A5C, 0xEDB1, 0x7A5F, 0xF060, 0x7A60, 0xC2AA, 0x7A61, 0xC2A8, 0x7A62, 0xC2A9, + 0x7A67, 0xF2A6, 0x7A68, 0xF2A7, 0x7A69, 0xC3AD, 0x7A6B, 0xC3AC, 0x7A6C, 0xF4A3, 0x7A6D, 0xF4A4, 0x7A6E, 0xF4A2, 0x7A70, 0xF6F8, + 0x7A71, 0xF6F9, 0x7A74, 0xA5DE, 0x7A75, 0xCA48, 0x7A76, 0xA873, 0x7A78, 0xCDA5, 0x7A79, 0xAAC6, 0x7A7A, 0xAAC5, 0x7A7B, 0xCDA6, + 0x7A7E, 0xD040, 0x7A7F, 0xACEF, 0x7A80, 0xCFFE, 0x7A81, 0xACF0, 0x7A84, 0xAFB6, 0x7A85, 0xD2F8, 0x7A86, 0xD2F6, 0x7A87, 0xD2FC, + 0x7A88, 0xAFB7, 0x7A89, 0xD2F7, 0x7A8A, 0xD2FB, 0x7A8B, 0xD2F9, 0x7A8C, 0xD2FA, 0x7A8F, 0xD6C8, 0x7A90, 0xD6CA, 0x7A92, 0xB2BF, + 0x7A94, 0xD6C9, 0x7A95, 0xB2C0, 0x7A96, 0xB5A2, 0x7A97, 0xB5A1, 0x7A98, 0xB57E, 0x7A99, 0xDADB, 0x7A9E, 0xDF44, 0x7A9F, 0xB85D, + 0x7AA0, 0xB85E, 0x7AA2, 0xDF43, 0x7AA3, 0xDF42, 0x7AA8, 0xE34A, 0x7AA9, 0xBADB, 0x7AAA, 0xBADA, 0x7AAB, 0xE34B, 0x7AAC, 0xE34C, + 0x7AAE, 0xBD61, 0x7AAF, 0xBD60, 0x7AB1, 0xEAB5, 0x7AB2, 0xE6D3, 0x7AB3, 0xE6D5, 0x7AB4, 0xE6D4, 0x7AB5, 0xEAB4, 0x7AB6, 0xEAB2, + 0x7AB7, 0xEAB6, 0x7AB8, 0xEAB3, 0x7ABA, 0xBF73, 0x7ABE, 0xEDB7, 0x7ABF, 0xC14B, 0x7AC0, 0xEDB8, 0x7AC1, 0xEDB9, 0x7AC4, 0xC2AB, + 0x7AC5, 0xC2AC, 0x7AC7, 0xC475, 0x7ACA, 0xC5D1, 0x7ACB, 0xA5DF, 0x7AD1, 0xD041, 0x7AD8, 0xD2FD, 0x7AD9, 0xAFB8, 0x7ADF, 0xB3BA, + 0x7AE0, 0xB3B9, 0x7AE3, 0xB5A4, 0x7AE4, 0xDADD, 0x7AE5, 0xB5A3, 0x7AE6, 0xDADC, 0x7AEB, 0xDF45, 0x7AED, 0xBADC, 0x7AEE, 0xE34D, + 0x7AEF, 0xBADD, 0x7AF6, 0xC476, 0x7AF7, 0xF4A5, 0x7AF9, 0xA6CB, 0x7AFA, 0xAAC7, 0x7AFB, 0xCDA7, 0x7AFD, 0xACF2, 0x7AFF, 0xACF1, + 0x7B00, 0xD042, 0x7B01, 0xD043, 0x7B04, 0xD340, 0x7B05, 0xD342, 0x7B06, 0xAFB9, 0x7B08, 0xD344, 0x7B09, 0xD347, 0x7B0A, 0xD345, + 0x7B0E, 0xD346, 0x7B0F, 0xD343, 0x7B10, 0xD2FE, 0x7B11, 0xAFBA, 0x7B12, 0xD348, 0x7B13, 0xD341, 0x7B18, 0xD6D3, 0x7B19, 0xB2C6, + 0x7B1A, 0xD6DC, 0x7B1B, 0xB2C3, 0x7B1D, 0xD6D5, 0x7B1E, 0xB2C7, 0x7B20, 0xB2C1, 0x7B22, 0xD6D0, 0x7B23, 0xD6DD, 0x7B24, 0xD6D1, + 0x7B25, 0xD6CE, 0x7B26, 0xB2C5, 0x7B28, 0xB2C2, 0x7B2A, 0xD6D4, 0x7B2B, 0xD6D7, 0x7B2C, 0xB2C4, 0x7B2D, 0xD6D8, 0x7B2E, 0xB2C8, + 0x7B2F, 0xD6D9, 0x7B30, 0xD6CF, 0x7B31, 0xD6D6, 0x7B32, 0xD6DA, 0x7B33, 0xD6D2, 0x7B34, 0xD6CD, 0x7B35, 0xD6CB, 0x7B38, 0xD6DB, + 0x7B3B, 0xDADF, 0x7B40, 0xDAE4, 0x7B44, 0xDAE0, 0x7B45, 0xDAE6, 0x7B46, 0xB5A7, 0x7B47, 0xD6CC, 0x7B48, 0xDAE1, 0x7B49, 0xB5A5, + 0x7B4A, 0xDADE, 0x7B4B, 0xB5AC, 0x7B4C, 0xDAE2, 0x7B4D, 0xB5AB, 0x7B4E, 0xDAE3, 0x7B4F, 0xB5AD, 0x7B50, 0xB5A8, 0x7B51, 0xB5AE, + 0x7B52, 0xB5A9, 0x7B54, 0xB5AA, 0x7B56, 0xB5A6, 0x7B58, 0xDAE5, 0x7B60, 0xB861, 0x7B61, 0xDF50, 0x7B63, 0xDF53, 0x7B64, 0xDF47, + 0x7B65, 0xDF4C, 0x7B66, 0xDF46, 0x7B67, 0xB863, 0x7B69, 0xDF4A, 0x7B6D, 0xDF48, 0x7B6E, 0xB862, 0x7B70, 0xDF4F, 0x7B71, 0xDF4E, + 0x7B72, 0xDF4B, 0x7B73, 0xDF4D, 0x7B74, 0xDF49, 0x7B75, 0xBAE1, 0x7B76, 0xDF52, 0x7B77, 0xB85F, 0x7B78, 0xDF51, 0x7B82, 0xE35D, + 0x7B84, 0xBAE8, 0x7B85, 0xE358, 0x7B87, 0xBAE7, 0x7B88, 0xE34E, 0x7B8A, 0xE350, 0x7B8B, 0xBAE0, 0x7B8C, 0xE355, 0x7B8D, 0xE354, + 0x7B8E, 0xE357, 0x7B8F, 0xBAE5, 0x7B90, 0xE352, 0x7B91, 0xE351, 0x7B94, 0xBAE4, 0x7B95, 0xBADF, 0x7B96, 0xE353, 0x7B97, 0xBAE2, + 0x7B98, 0xE359, 0x7B99, 0xE35B, 0x7B9B, 0xE356, 0x7B9C, 0xE34F, 0x7B9D, 0xBAE3, 0x7BA0, 0xBD69, 0x7BA1, 0xBADE, 0x7BA4, 0xE35C, + 0x7BAC, 0xE6D9, 0x7BAD, 0xBD62, 0x7BAF, 0xE6DB, 0x7BB1, 0xBD63, 0x7BB4, 0xBD65, 0x7BB5, 0xE6DE, 0x7BB7, 0xE6D6, 0x7BB8, 0xBAE6, + 0x7BB9, 0xE6DC, 0x7BBE, 0xE6D8, 0x7BC0, 0xB860, 0x7BC1, 0xBD68, 0x7BC4, 0xBD64, 0x7BC6, 0xBD66, 0x7BC7, 0xBD67, 0x7BC9, 0xBF76, + 0x7BCA, 0xE6DD, 0x7BCB, 0xE6D7, 0x7BCC, 0xBD6A, 0x7BCE, 0xE6DA, 0x7BD4, 0xEAC0, 0x7BD5, 0xEABB, 0x7BD8, 0xEAC5, 0x7BD9, 0xBF74, + 0x7BDA, 0xEABD, 0x7BDB, 0xBF78, 0x7BDC, 0xEAC3, 0x7BDD, 0xEABA, 0x7BDE, 0xEAB7, 0x7BDF, 0xEAC6, 0x7BE0, 0xC151, 0x7BE1, 0xBF79, + 0x7BE2, 0xEAC2, 0x7BE3, 0xEAB8, 0x7BE4, 0xBF77, 0x7BE5, 0xEABC, 0x7BE6, 0xBF7B, 0x7BE7, 0xEAB9, 0x7BE8, 0xEABE, 0x7BE9, 0xBF7A, + 0x7BEA, 0xEAC1, 0x7BEB, 0xEAC4, 0x7BF0, 0xEDCB, 0x7BF1, 0xEDCC, 0x7BF2, 0xEDBC, 0x7BF3, 0xEDC3, 0x7BF4, 0xEDC1, 0x7BF7, 0xC14F, + 0x7BF8, 0xEDC8, 0x7BF9, 0xEABF, 0x7BFB, 0xEDBF, 0x7BFD, 0xEDC9, 0x7BFE, 0xC14E, 0x7BFF, 0xEDBE, 0x7C00, 0xEDBD, 0x7C01, 0xEDC7, + 0x7C02, 0xEDC4, 0x7C03, 0xEDC6, 0x7C05, 0xEDBA, 0x7C06, 0xEDCA, 0x7C07, 0xC14C, 0x7C09, 0xEDC5, 0x7C0A, 0xEDCE, 0x7C0B, 0xEDC2, + 0x7C0C, 0xC150, 0x7C0D, 0xC14D, 0x7C0E, 0xEDC0, 0x7C0F, 0xEDBB, 0x7C10, 0xEDCD, 0x7C11, 0xBF75, 0x7C19, 0xF063, 0x7C1C, 0xF061, + 0x7C1D, 0xF067, 0x7C1E, 0xC2B0, 0x7C1F, 0xF065, 0x7C20, 0xF064, 0x7C21, 0xC2B2, 0x7C22, 0xF06A, 0x7C23, 0xC2B1, 0x7C25, 0xF06B, + 0x7C26, 0xF068, 0x7C27, 0xC2AE, 0x7C28, 0xF069, 0x7C29, 0xF062, 0x7C2A, 0xC2AF, 0x7C2B, 0xC2AD, 0x7C2C, 0xF2AB, 0x7C2D, 0xF066, + 0x7C30, 0xF06C, 0x7C33, 0xF2A8, 0x7C37, 0xC3B2, 0x7C38, 0xC3B0, 0x7C39, 0xF2AA, 0x7C3B, 0xF2AC, 0x7C3C, 0xF2A9, 0x7C3D, 0xC3B1, + 0x7C3E, 0xC3AE, 0x7C3F, 0xC3AF, 0x7C40, 0xC3B3, 0x7C43, 0xC478, 0x7C45, 0xF4AA, 0x7C47, 0xF4A9, 0x7C48, 0xF4A7, 0x7C49, 0xF4A6, + 0x7C4A, 0xF4A8, 0x7C4C, 0xC477, 0x7C4D, 0xC479, 0x7C50, 0xC4F0, 0x7C53, 0xF5E5, 0x7C54, 0xF5E4, 0x7C57, 0xF6FA, 0x7C59, 0xF6FC, + 0x7C5A, 0xF6FE, 0x7C5B, 0xF6FD, 0x7C5C, 0xF6FB, 0x7C5F, 0xC5A3, 0x7C60, 0xC5A2, 0x7C63, 0xC5D3, 0x7C64, 0xC5D2, 0x7C65, 0xC5D4, + 0x7C66, 0xF7ED, 0x7C67, 0xF7EC, 0x7C69, 0xF8FB, 0x7C6A, 0xF8B8, 0x7C6B, 0xF8FC, 0x7C6C, 0xC658, 0x7C6E, 0xC659, 0x7C6F, 0xF96D, + 0x7C72, 0xC67E, 0x7C73, 0xA6CC, 0x7C75, 0xCDA8, 0x7C78, 0xD045, 0x7C79, 0xD046, 0x7C7A, 0xD044, 0x7C7D, 0xACF3, 0x7C7F, 0xD047, + 0x7C80, 0xD048, 0x7C81, 0xD049, 0x7C84, 0xD349, 0x7C85, 0xD34F, 0x7C88, 0xD34D, 0x7C89, 0xAFBB, 0x7C8A, 0xD34B, 0x7C8C, 0xD34C, + 0x7C8D, 0xD34E, 0x7C91, 0xD34A, 0x7C92, 0xB2C9, 0x7C94, 0xD6DE, 0x7C95, 0xB2CB, 0x7C96, 0xD6E0, 0x7C97, 0xB2CA, 0x7C98, 0xD6DF, + 0x7C9E, 0xDAE8, 0x7C9F, 0xB5AF, 0x7CA1, 0xDAEA, 0x7CA2, 0xDAE7, 0x7CA3, 0xD6E1, 0x7CA5, 0xB5B0, 0x7CA7, 0xF9DB, 0x7CA8, 0xDAE9, + 0x7CAF, 0xDF56, 0x7CB1, 0xB864, 0x7CB2, 0xDF54, 0x7CB3, 0xB865, 0x7CB4, 0xDF55, 0x7CB5, 0xB866, 0x7CB9, 0xBAE9, 0x7CBA, 0xE361, + 0x7CBB, 0xE35E, 0x7CBC, 0xE360, 0x7CBD, 0xBAEA, 0x7CBE, 0xBAEB, 0x7CBF, 0xE35F, 0x7CC5, 0xE6DF, 0x7CC8, 0xE6E0, 0x7CCA, 0xBD6B, + 0x7CCB, 0xE6E2, 0x7CCC, 0xE6E1, 0x7CCE, 0xA261, 0x7CD0, 0xEACA, 0x7CD1, 0xEACB, 0x7CD2, 0xEAC7, 0x7CD4, 0xEAC8, 0x7CD5, 0xBF7C, + 0x7CD6, 0xBF7D, 0x7CD7, 0xEAC9, 0x7CD9, 0xC157, 0x7CDC, 0xC153, 0x7CDD, 0xC158, 0x7CDE, 0xC154, 0x7CDF, 0xC156, 0x7CE0, 0xC152, + 0x7CE2, 0xC155, 0x7CE7, 0xC2B3, 0x7CE8, 0xEDCF, 0x7CEA, 0xF2AE, 0x7CEC, 0xF2AD, 0x7CEE, 0xF4AB, 0x7CEF, 0xC47A, 0x7CF0, 0xC47B, + 0x7CF1, 0xF741, 0x7CF2, 0xF5E6, 0x7CF4, 0xF740, 0x7CF6, 0xF8FD, 0x7CF7, 0xF9A4, 0x7CF8, 0xA6CD, 0x7CFB, 0xA874, 0x7CFD, 0xCDA9, + 0x7CFE, 0xAAC8, 0x7D00, 0xACF6, 0x7D01, 0xD04C, 0x7D02, 0xACF4, 0x7D03, 0xD04A, 0x7D04, 0xACF9, 0x7D05, 0xACF5, 0x7D06, 0xACFA, + 0x7D07, 0xACF8, 0x7D08, 0xD04B, 0x7D09, 0xACF7, 0x7D0A, 0xAFBF, 0x7D0B, 0xAFBE, 0x7D0C, 0xD35A, 0x7D0D, 0xAFC7, 0x7D0E, 0xD353, + 0x7D0F, 0xD359, 0x7D10, 0xAFC3, 0x7D11, 0xD352, 0x7D12, 0xD358, 0x7D13, 0xD356, 0x7D14, 0xAFC2, 0x7D15, 0xAFC4, 0x7D16, 0xD355, + 0x7D17, 0xAFBD, 0x7D18, 0xD354, 0x7D19, 0xAFC8, 0x7D1A, 0xAFC5, 0x7D1B, 0xAFC9, 0x7D1C, 0xAFC6, 0x7D1D, 0xD351, 0x7D1E, 0xD350, + 0x7D1F, 0xD357, 0x7D20, 0xAFC0, 0x7D21, 0xAFBC, 0x7D22, 0xAFC1, 0x7D28, 0xD6F0, 0x7D29, 0xD6E9, 0x7D2B, 0xB5B5, 0x7D2C, 0xD6E8, + 0x7D2E, 0xB2CF, 0x7D2F, 0xB2D6, 0x7D30, 0xB2D3, 0x7D31, 0xB2D9, 0x7D32, 0xB2D8, 0x7D33, 0xB2D4, 0x7D35, 0xD6E2, 0x7D36, 0xD6E5, + 0x7D38, 0xD6E4, 0x7D39, 0xB2D0, 0x7D3A, 0xD6E6, 0x7D3B, 0xD6EF, 0x7D3C, 0xB2D1, 0x7D3D, 0xD6E3, 0x7D3E, 0xD6EC, 0x7D3F, 0xD6ED, + 0x7D40, 0xB2D2, 0x7D41, 0xD6EA, 0x7D42, 0xB2D7, 0x7D43, 0xB2CD, 0x7D44, 0xB2D5, 0x7D45, 0xD6E7, 0x7D46, 0xB2CC, 0x7D47, 0xD6EB, + 0x7D4A, 0xD6EE, 0x7D4E, 0xDAFB, 0x7D4F, 0xDAF2, 0x7D50, 0xB5B2, 0x7D51, 0xDAF9, 0x7D52, 0xDAF6, 0x7D53, 0xDAEE, 0x7D54, 0xDAF7, + 0x7D55, 0xB5B4, 0x7D56, 0xDAEF, 0x7D58, 0xDAEB, 0x7D5B, 0xB86C, 0x7D5C, 0xDAF4, 0x7D5E, 0xB5B1, 0x7D5F, 0xDAFA, 0x7D61, 0xB5B8, + 0x7D62, 0xB5BA, 0x7D63, 0xDAED, 0x7D66, 0xB5B9, 0x7D67, 0xDAF0, 0x7D68, 0xB5B3, 0x7D69, 0xDAF8, 0x7D6A, 0xDAF1, 0x7D6B, 0xDAF5, + 0x7D6D, 0xDAF3, 0x7D6E, 0xB5B6, 0x7D6F, 0xDAEC, 0x7D70, 0xB5BB, 0x7D71, 0xB2CE, 0x7D72, 0xB5B7, 0x7D73, 0xB5BC, 0x7D79, 0xB868, + 0x7D7A, 0xDF5D, 0x7D7B, 0xDF5F, 0x7D7C, 0xDF61, 0x7D7D, 0xDF65, 0x7D7F, 0xDF5B, 0x7D80, 0xDF59, 0x7D81, 0xB86A, 0x7D83, 0xDF60, + 0x7D84, 0xDF64, 0x7D85, 0xDF5C, 0x7D86, 0xDF58, 0x7D88, 0xDF57, 0x7D8C, 0xDF62, 0x7D8D, 0xDF5A, 0x7D8E, 0xDF5E, 0x7D8F, 0xB86B, + 0x7D91, 0xB869, 0x7D92, 0xDF66, 0x7D93, 0xB867, 0x7D94, 0xDF63, 0x7D96, 0xE372, 0x7D9C, 0xBAEE, 0x7D9D, 0xE36A, 0x7D9E, 0xBD78, + 0x7D9F, 0xE374, 0x7DA0, 0xBAF1, 0x7DA1, 0xE378, 0x7DA2, 0xBAF7, 0x7DA3, 0xE365, 0x7DA6, 0xE375, 0x7DA7, 0xE362, 0x7DA9, 0xE377, + 0x7DAA, 0xE366, 0x7DAC, 0xBAFE, 0x7DAD, 0xBAFB, 0x7DAE, 0xE376, 0x7DAF, 0xE370, 0x7DB0, 0xBAED, 0x7DB1, 0xBAF5, 0x7DB2, 0xBAF4, + 0x7DB4, 0xBAF3, 0x7DB5, 0xBAF9, 0x7DB7, 0xE363, 0x7DB8, 0xBAFA, 0x7DB9, 0xE371, 0x7DBA, 0xBAF6, 0x7DBB, 0xBAEC, 0x7DBC, 0xE373, + 0x7DBD, 0xBAEF, 0x7DBE, 0xBAF0, 0x7DBF, 0xBAF8, 0x7DC0, 0xE368, 0x7DC1, 0xE367, 0x7DC2, 0xE364, 0x7DC4, 0xE36C, 0x7DC5, 0xE369, + 0x7DC6, 0xE36D, 0x7DC7, 0xBAFD, 0x7DC9, 0xE379, 0x7DCA, 0xBAF2, 0x7DCB, 0xE36E, 0x7DCC, 0xE36F, 0x7DCE, 0xE36B, 0x7DD2, 0xBAFC, + 0x7DD7, 0xE6E7, 0x7DD8, 0xBD70, 0x7DD9, 0xBD79, 0x7DDA, 0xBD75, 0x7DDB, 0xE6E4, 0x7DDD, 0xBD72, 0x7DDE, 0xBD76, 0x7DDF, 0xE6F0, + 0x7DE0, 0xBD6C, 0x7DE1, 0xE6E8, 0x7DE3, 0xBD74, 0x7DE6, 0xE6EB, 0x7DE7, 0xE6E6, 0x7DE8, 0xBD73, 0x7DE9, 0xBD77, 0x7DEA, 0xE6E5, + 0x7DEC, 0xBD71, 0x7DEE, 0xE6EF, 0x7DEF, 0xBD6E, 0x7DF0, 0xE6EE, 0x7DF1, 0xE6ED, 0x7DF2, 0xBD7A, 0x7DF3, 0xE572, 0x7DF4, 0xBD6D, + 0x7DF6, 0xE6EC, 0x7DF7, 0xE6E3, 0x7DF9, 0xBD7B, 0x7DFA, 0xE6EA, 0x7DFB, 0xBD6F, 0x7E03, 0xE6E9, 0x7E08, 0xBFA2, 0x7E09, 0xBFA7, + 0x7E0A, 0xBF7E, 0x7E0B, 0xEAD8, 0x7E0C, 0xEACF, 0x7E0D, 0xEADB, 0x7E0E, 0xEAD3, 0x7E0F, 0xEAD9, 0x7E10, 0xBFA8, 0x7E11, 0xBFA1, + 0x7E12, 0xEACC, 0x7E13, 0xEAD2, 0x7E14, 0xEADC, 0x7E15, 0xEAD5, 0x7E16, 0xEADA, 0x7E17, 0xEACE, 0x7E1A, 0xEAD6, 0x7E1B, 0xBFA3, + 0x7E1C, 0xEAD4, 0x7E1D, 0xBFA6, 0x7E1E, 0xBFA5, 0x7E1F, 0xEAD0, 0x7E20, 0xEAD1, 0x7E21, 0xEACD, 0x7E22, 0xEAD7, 0x7E23, 0xBFA4, + 0x7E24, 0xEADE, 0x7E25, 0xEADD, 0x7E29, 0xEDDA, 0x7E2A, 0xEDD6, 0x7E2B, 0xC15F, 0x7E2D, 0xEDD0, 0x7E2E, 0xC159, 0x7E2F, 0xC169, + 0x7E30, 0xEDDC, 0x7E31, 0xC161, 0x7E32, 0xC15D, 0x7E33, 0xEDD3, 0x7E34, 0xC164, 0x7E35, 0xC167, 0x7E36, 0xEDDE, 0x7E37, 0xC15C, + 0x7E38, 0xEDD5, 0x7E39, 0xC165, 0x7E3A, 0xEDE0, 0x7E3B, 0xEDDD, 0x7E3C, 0xEDD1, 0x7E3D, 0xC160, 0x7E3E, 0xC15A, 0x7E3F, 0xC168, + 0x7E40, 0xEDD8, 0x7E41, 0xC163, 0x7E42, 0xEDD2, 0x7E43, 0xC15E, 0x7E44, 0xEDDF, 0x7E45, 0xC162, 0x7E46, 0xC15B, 0x7E47, 0xEDD9, + 0x7E48, 0xC166, 0x7E49, 0xEDD7, 0x7E4C, 0xEDDB, 0x7E50, 0xF06E, 0x7E51, 0xF074, 0x7E52, 0xC2B9, 0x7E53, 0xF077, 0x7E54, 0xC2B4, + 0x7E55, 0xC2B5, 0x7E56, 0xF06F, 0x7E57, 0xF076, 0x7E58, 0xF071, 0x7E59, 0xC2BA, 0x7E5A, 0xC2B7, 0x7E5C, 0xF06D, 0x7E5E, 0xC2B6, + 0x7E5F, 0xF073, 0x7E60, 0xF075, 0x7E61, 0xC2B8, 0x7E62, 0xF072, 0x7E63, 0xF070, 0x7E68, 0xF2B8, 0x7E69, 0xC3B7, 0x7E6A, 0xC3B8, + 0x7E6B, 0xC3B4, 0x7E6D, 0xC3B5, 0x7E6F, 0xF2B4, 0x7E70, 0xF2B2, 0x7E72, 0xF2B6, 0x7E73, 0xC3BA, 0x7E74, 0xF2B7, 0x7E75, 0xF2B0, + 0x7E76, 0xF2AF, 0x7E77, 0xF2B3, 0x7E78, 0xF2B1, 0x7E79, 0xC3B6, 0x7E7A, 0xF2B5, 0x7E7B, 0xF4AC, 0x7E7C, 0xC47E, 0x7E7D, 0xC47D, + 0x7E7E, 0xF4AD, 0x7E80, 0xF4AF, 0x7E81, 0xF4AE, 0x7E82, 0xC4A1, 0x7E86, 0xF5EB, 0x7E87, 0xF5E8, 0x7E88, 0xF5E9, 0x7E8A, 0xF5E7, + 0x7E8B, 0xF5EA, 0x7E8C, 0xC4F2, 0x7E8D, 0xF5EC, 0x7E8F, 0xC4F1, 0x7E91, 0xF742, 0x7E93, 0xC5D5, 0x7E94, 0xC5D7, 0x7E95, 0xF7EE, + 0x7E96, 0xC5D6, 0x7E97, 0xF8B9, 0x7E98, 0xF940, 0x7E99, 0xF942, 0x7E9A, 0xF8FE, 0x7E9B, 0xF941, 0x7E9C, 0xC66C, 0x7F36, 0xA6CE, + 0x7F38, 0xACFB, 0x7F39, 0xD26F, 0x7F3A, 0xAFCA, 0x7F3D, 0xB2DA, 0x7F3E, 0xDAFC, 0x7F3F, 0xDAFD, 0x7F43, 0xEADF, 0x7F44, 0xC16A, + 0x7F45, 0xEDE1, 0x7F48, 0xC2BB, 0x7F4A, 0xF2BA, 0x7F4B, 0xF2B9, 0x7F4C, 0xC4A2, 0x7F4D, 0xF5ED, 0x7F4F, 0xF743, 0x7F50, 0xC5F8, + 0x7F51, 0xCA49, 0x7F54, 0xAAC9, 0x7F55, 0xA875, 0x7F58, 0xD04D, 0x7F5B, 0xD360, 0x7F5C, 0xD35B, 0x7F5D, 0xD35F, 0x7F5E, 0xD35D, + 0x7F5F, 0xAFCB, 0x7F60, 0xD35E, 0x7F61, 0xD35C, 0x7F63, 0xD6F1, 0x7F65, 0xDAFE, 0x7F66, 0xDB40, 0x7F67, 0xDF69, 0x7F68, 0xDF6A, + 0x7F69, 0xB86E, 0x7F6A, 0xB86F, 0x7F6B, 0xDF68, 0x7F6C, 0xDF6B, 0x7F6D, 0xDF67, 0x7F6E, 0xB86D, 0x7F70, 0xBB40, 0x7F72, 0xB870, + 0x7F73, 0xE37A, 0x7F75, 0xBD7C, 0x7F76, 0xE6F1, 0x7F77, 0xBD7D, 0x7F79, 0xBFA9, 0x7F7A, 0xEAE2, 0x7F7B, 0xEAE0, 0x7F7C, 0xEAE1, + 0x7F7D, 0xEDE4, 0x7F7E, 0xEDE3, 0x7F7F, 0xEDE2, 0x7F83, 0xF2BB, 0x7F85, 0xC3B9, 0x7F86, 0xF2BC, 0x7F87, 0xF744, 0x7F88, 0xC5F9, + 0x7F89, 0xF8BA, 0x7F8A, 0xA6CF, 0x7F8B, 0xAACB, 0x7F8C, 0xAACA, 0x7F8D, 0xD04F, 0x7F8E, 0xACFC, 0x7F91, 0xD04E, 0x7F92, 0xD362, + 0x7F94, 0xAFCC, 0x7F95, 0xD6F2, 0x7F96, 0xD361, 0x7F9A, 0xB2DC, 0x7F9B, 0xD6F5, 0x7F9C, 0xD6F3, 0x7F9D, 0xD6F4, 0x7F9E, 0xB2DB, + 0x7FA0, 0xDB42, 0x7FA1, 0xDB43, 0x7FA2, 0xDB41, 0x7FA4, 0xB873, 0x7FA5, 0xDF6D, 0x7FA6, 0xDF6C, 0x7FA7, 0xDF6E, 0x7FA8, 0xB872, + 0x7FA9, 0xB871, 0x7FAC, 0xE6F2, 0x7FAD, 0xE6F4, 0x7FAF, 0xBD7E, 0x7FB0, 0xE6F3, 0x7FB1, 0xEAE3, 0x7FB2, 0xBFAA, 0x7FB3, 0xF079, + 0x7FB5, 0xF078, 0x7FB6, 0xC3BB, 0x7FB7, 0xF2BD, 0x7FB8, 0xC3BD, 0x7FB9, 0xC3BC, 0x7FBA, 0xF4B0, 0x7FBB, 0xF5EE, 0x7FBC, 0xC4F3, + 0x7FBD, 0xA6D0, 0x7FBE, 0xD050, 0x7FBF, 0xACFD, 0x7FC0, 0xD365, 0x7FC1, 0xAFCE, 0x7FC2, 0xD364, 0x7FC3, 0xD363, 0x7FC5, 0xAFCD, + 0x7FC7, 0xD6FB, 0x7FC9, 0xD6FD, 0x7FCA, 0xD6F6, 0x7FCB, 0xD6F7, 0x7FCC, 0xB2DD, 0x7FCD, 0xD6F8, 0x7FCE, 0xB2DE, 0x7FCF, 0xD6FC, + 0x7FD0, 0xD6F9, 0x7FD1, 0xD6FA, 0x7FD2, 0xB2DF, 0x7FD4, 0xB5BE, 0x7FD5, 0xB5BF, 0x7FD7, 0xDB44, 0x7FDB, 0xDF6F, 0x7FDC, 0xDF70, + 0x7FDE, 0xE37E, 0x7FDF, 0xBB43, 0x7FE0, 0xBB41, 0x7FE1, 0xBB42, 0x7FE2, 0xE37B, 0x7FE3, 0xE37C, 0x7FE5, 0xE37D, 0x7FE6, 0xE6F9, + 0x7FE8, 0xE6FA, 0x7FE9, 0xBDA1, 0x7FEA, 0xE6F7, 0x7FEB, 0xE6F6, 0x7FEC, 0xE6F8, 0x7FED, 0xE6F5, 0x7FEE, 0xBFAD, 0x7FEF, 0xEAE4, + 0x7FF0, 0xBFAB, 0x7FF1, 0xBFAC, 0x7FF2, 0xEDE6, 0x7FF3, 0xC16B, 0x7FF4, 0xEDE5, 0x7FF5, 0xEFA8, 0x7FF7, 0xF07A, 0x7FF8, 0xF07B, + 0x7FF9, 0xC2BC, 0x7FFB, 0xC2BD, 0x7FFC, 0xC16C, 0x7FFD, 0xF2BE, 0x7FFE, 0xF2BF, 0x7FFF, 0xF4B1, 0x8000, 0xC4A3, 0x8001, 0xA6D1, + 0x8003, 0xA6D2, 0x8004, 0xACFE, 0x8005, 0xAACC, 0x8006, 0xAFCF, 0x8007, 0xD051, 0x800B, 0xB5C0, 0x800C, 0xA6D3, 0x800D, 0xAD41, + 0x800E, 0xD052, 0x800F, 0xD053, 0x8010, 0xAD40, 0x8011, 0xAD42, 0x8012, 0xA6D4, 0x8014, 0xD054, 0x8015, 0xAFD1, 0x8016, 0xD366, + 0x8017, 0xAFD3, 0x8018, 0xAFD0, 0x8019, 0xAFD2, 0x801B, 0xD741, 0x801C, 0xB2E0, 0x801E, 0xD740, 0x801F, 0xD6FE, 0x8021, 0xDF71, + 0x8024, 0xE3A1, 0x8026, 0xBDA2, 0x8028, 0xBFAE, 0x8029, 0xEAE6, 0x802A, 0xEAE5, 0x802C, 0xEDE7, 0x8030, 0xF5EF, 0x8033, 0xA6D5, + 0x8034, 0xCB73, 0x8035, 0xCDAA, 0x8036, 0xAD43, 0x8037, 0xD055, 0x8039, 0xD368, 0x803D, 0xAFD4, 0x803E, 0xD367, 0x803F, 0xAFD5, + 0x8043, 0xD743, 0x8046, 0xB2E2, 0x8047, 0xD742, 0x8048, 0xD744, 0x804A, 0xB2E1, 0x804F, 0xDB46, 0x8050, 0xDB47, 0x8051, 0xDB45, + 0x8052, 0xB5C1, 0x8056, 0xB874, 0x8058, 0xB875, 0x805A, 0xBB45, 0x805C, 0xE3A3, 0x805D, 0xE3A2, 0x805E, 0xBB44, 0x8064, 0xE6FB, + 0x8067, 0xE6FC, 0x806C, 0xEAE7, 0x806F, 0xC170, 0x8070, 0xC16F, 0x8071, 0xC16D, 0x8072, 0xC16E, 0x8073, 0xC171, 0x8075, 0xF07C, + 0x8076, 0xC2BF, 0x8077, 0xC2BE, 0x8078, 0xF2C0, 0x8079, 0xF4B2, 0x807D, 0xC5A5, 0x807E, 0xC5A4, 0x807F, 0xA6D6, 0x8082, 0xD1FB, + 0x8084, 0xB877, 0x8085, 0xB5C2, 0x8086, 0xB876, 0x8087, 0xBB46, 0x8089, 0xA6D7, 0x808A, 0xC9A9, 0x808B, 0xA6D8, 0x808C, 0xA6D9, + 0x808F, 0xCDAB, 0x8090, 0xCB76, 0x8092, 0xCB77, 0x8093, 0xA877, 0x8095, 0xCB74, 0x8096, 0xA876, 0x8098, 0xA879, 0x8099, 0xCB75, + 0x809A, 0xA87B, 0x809B, 0xA87A, 0x809C, 0xCB78, 0x809D, 0xA878, 0x80A1, 0xAAD1, 0x80A2, 0xAACF, 0x80A3, 0xCDAD, 0x80A5, 0xAACE, + 0x80A9, 0xAAD3, 0x80AA, 0xAAD5, 0x80AB, 0xAAD2, 0x80AD, 0xCDB0, 0x80AE, 0xCDAC, 0x80AF, 0xAAD6, 0x80B1, 0xAAD0, 0x80B2, 0xA87C, + 0x80B4, 0xAAD4, 0x80B5, 0xCDAF, 0x80B8, 0xCDAE, 0x80BA, 0xAACD, 0x80C2, 0xD05B, 0x80C3, 0xAD47, 0x80C4, 0xAD48, 0x80C5, 0xD05D, + 0x80C7, 0xD057, 0x80C8, 0xD05A, 0x80C9, 0xD063, 0x80CA, 0xD061, 0x80CC, 0xAD49, 0x80CD, 0xD067, 0x80CE, 0xAD4C, 0x80CF, 0xD064, + 0x80D0, 0xD05C, 0x80D1, 0xD059, 0x80D4, 0xDB49, 0x80D5, 0xD062, 0x80D6, 0xAD44, 0x80D7, 0xD065, 0x80D8, 0xD056, 0x80D9, 0xD05F, + 0x80DA, 0xAD46, 0x80DB, 0xAD4B, 0x80DC, 0xD060, 0x80DD, 0xAD4F, 0x80DE, 0xAD4D, 0x80E0, 0xD058, 0x80E1, 0xAD4A, 0x80E3, 0xD05E, + 0x80E4, 0xAD4E, 0x80E5, 0xAD45, 0x80E6, 0xD066, 0x80ED, 0xAFDA, 0x80EF, 0xAFE3, 0x80F0, 0xAFD8, 0x80F1, 0xAFD6, 0x80F2, 0xD36A, + 0x80F3, 0xAFDE, 0x80F4, 0xAFDB, 0x80F5, 0xD36C, 0x80F8, 0xAFDD, 0x80F9, 0xD36B, 0x80FA, 0xD369, 0x80FB, 0xD36E, 0x80FC, 0xAFE2, + 0x80FD, 0xAFE0, 0x80FE, 0xDB48, 0x8100, 0xD36F, 0x8101, 0xD36D, 0x8102, 0xAFD7, 0x8105, 0xAFD9, 0x8106, 0xAFDC, 0x8108, 0xAFDF, + 0x810A, 0xAFE1, 0x8115, 0xD74E, 0x8116, 0xB2E4, 0x8118, 0xD745, 0x8119, 0xD747, 0x811B, 0xD748, 0x811D, 0xD750, 0x811E, 0xD74C, + 0x811F, 0xD74A, 0x8121, 0xD74D, 0x8122, 0xD751, 0x8123, 0xB2E5, 0x8124, 0xB2E9, 0x8125, 0xD746, 0x8127, 0xD74F, 0x8129, 0xB2E7, + 0x812B, 0xB2E6, 0x812C, 0xD74B, 0x812D, 0xD749, 0x812F, 0xB2E3, 0x8130, 0xB2E8, 0x8139, 0xB5C8, 0x813A, 0xDB51, 0x813D, 0xDB4F, + 0x813E, 0xB5CA, 0x8143, 0xDB4A, 0x8144, 0xDFA1, 0x8146, 0xB5C9, 0x8147, 0xDB4E, 0x814A, 0xDB4B, 0x814B, 0xB5C5, 0x814C, 0xB5CB, + 0x814D, 0xDB50, 0x814E, 0xB5C7, 0x814F, 0xDB4D, 0x8150, 0xBB47, 0x8151, 0xB5C6, 0x8152, 0xDB4C, 0x8153, 0xB5CC, 0x8154, 0xB5C4, + 0x8155, 0xB5C3, 0x815B, 0xDF77, 0x815C, 0xDF75, 0x815E, 0xDF7B, 0x8160, 0xDF73, 0x8161, 0xDFA2, 0x8162, 0xDF78, 0x8164, 0xDF72, + 0x8165, 0xB87B, 0x8166, 0xB8A3, 0x8167, 0xDF7D, 0x8169, 0xDF76, 0x816B, 0xB87E, 0x816E, 0xB87C, 0x816F, 0xDF7E, 0x8170, 0xB879, + 0x8171, 0xB878, 0x8172, 0xDF79, 0x8173, 0xB87D, 0x8174, 0xB5CD, 0x8176, 0xDF7C, 0x8177, 0xDF74, 0x8178, 0xB87A, 0x8179, 0xB8A1, + 0x817A, 0xB8A2, 0x817F, 0xBB4C, 0x8180, 0xBB48, 0x8182, 0xBB4D, 0x8183, 0xE3A6, 0x8186, 0xE3A5, 0x8187, 0xE3A7, 0x8188, 0xBB4A, + 0x8189, 0xE3A4, 0x818A, 0xBB4B, 0x818B, 0xE3AA, 0x818C, 0xE3A9, 0x818D, 0xE3A8, 0x818F, 0xBB49, 0x8195, 0xE741, 0x8197, 0xE744, + 0x8198, 0xBDA8, 0x8199, 0xE743, 0x819A, 0xBDA7, 0x819B, 0xBDA3, 0x819C, 0xBDA4, 0x819D, 0xBDA5, 0x819E, 0xE740, 0x819F, 0xE6FE, + 0x81A0, 0xBDA6, 0x81A2, 0xE742, 0x81A3, 0xE6FD, 0x81A6, 0xEAE9, 0x81A7, 0xEAF3, 0x81A8, 0xBFB1, 0x81A9, 0xBFB0, 0x81AB, 0xEAED, + 0x81AC, 0xEAEF, 0x81AE, 0xEAEA, 0x81B0, 0xEAEE, 0x81B1, 0xEAE8, 0x81B2, 0xEAF1, 0x81B3, 0xBFAF, 0x81B4, 0xEAF0, 0x81B5, 0xEAEC, + 0x81B7, 0xEAF2, 0x81B9, 0xEAEB, 0x81BA, 0xC174, 0x81BB, 0xEDE8, 0x81BC, 0xEDEE, 0x81BD, 0xC178, 0x81BE, 0xC17A, 0x81BF, 0xC177, + 0x81C0, 0xC176, 0x81C2, 0xC175, 0x81C3, 0xC173, 0x81C4, 0xEDE9, 0x81C5, 0xEDEC, 0x81C6, 0xC172, 0x81C7, 0xEDED, 0x81C9, 0xC179, + 0x81CA, 0xEDEB, 0x81CC, 0xEDEA, 0x81CD, 0xC2C0, 0x81CF, 0xC2C1, 0x81D0, 0xF0A1, 0x81D1, 0xF07D, 0x81D2, 0xF07E, 0x81D5, 0xF2C2, + 0x81D7, 0xF2C1, 0x81D8, 0xC3BE, 0x81D9, 0xF4B4, 0x81DA, 0xC4A4, 0x81DB, 0xF4B3, 0x81DD, 0xF5F0, 0x81DE, 0xF745, 0x81DF, 0xC5A6, + 0x81E0, 0xF943, 0x81E1, 0xF944, 0x81E2, 0xC5D8, 0x81E3, 0xA6DA, 0x81E5, 0xAAD7, 0x81E6, 0xDB52, 0x81E7, 0xBB4E, 0x81E8, 0xC17B, + 0x81E9, 0xEDEF, 0x81EA, 0xA6DB, 0x81EC, 0xAFE5, 0x81ED, 0xAFE4, 0x81EE, 0xDB53, 0x81F2, 0xEAF4, 0x81F3, 0xA6DC, 0x81F4, 0xAD50, + 0x81F7, 0xDB54, 0x81F8, 0xDB55, 0x81F9, 0xDB56, 0x81FA, 0xBB4F, 0x81FB, 0xBFB2, 0x81FC, 0xA6DD, 0x81FE, 0xAAD8, 0x81FF, 0xD068, + 0x8200, 0xAFE6, 0x8201, 0xD370, 0x8202, 0xB2EA, 0x8204, 0xDB57, 0x8205, 0xB8A4, 0x8207, 0xBB50, 0x8208, 0xBFB3, 0x8209, 0xC17C, + 0x820A, 0xC2C2, 0x820B, 0xF4B5, 0x820C, 0xA6DE, 0x820D, 0xAAD9, 0x8210, 0xAFE7, 0x8211, 0xD752, 0x8212, 0xB5CE, 0x8214, 0xBB51, + 0x8215, 0xE3AB, 0x8216, 0xE745, 0x821B, 0xA6DF, 0x821C, 0xB5CF, 0x821D, 0xDFA3, 0x821E, 0xBB52, 0x821F, 0xA6E0, 0x8220, 0xCDB1, + 0x8221, 0xD069, 0x8222, 0xAD51, 0x8225, 0xD372, 0x8228, 0xAFEA, 0x822A, 0xAFE8, 0x822B, 0xAFE9, 0x822C, 0xAFEB, 0x822F, 0xD371, + 0x8232, 0xD757, 0x8233, 0xD754, 0x8234, 0xD756, 0x8235, 0xB2EB, 0x8236, 0xB2ED, 0x8237, 0xB2EC, 0x8238, 0xD753, 0x8239, 0xB2EE, + 0x823A, 0xD755, 0x823C, 0xDB58, 0x823D, 0xDB59, 0x823F, 0xDB5A, 0x8240, 0xDFA6, 0x8242, 0xDFA7, 0x8244, 0xDFA5, 0x8245, 0xDFA8, + 0x8247, 0xB8A5, 0x8249, 0xDFA4, 0x824B, 0xBB53, 0x824E, 0xE74A, 0x824F, 0xE746, 0x8250, 0xE749, 0x8251, 0xE74B, 0x8252, 0xE748, + 0x8253, 0xE747, 0x8255, 0xEAF5, 0x8256, 0xEAF6, 0x8257, 0xEAF7, 0x8258, 0xBFB4, 0x8259, 0xBFB5, 0x825A, 0xEDF1, 0x825B, 0xEDF0, + 0x825C, 0xEDF2, 0x825E, 0xF0A3, 0x825F, 0xF0A2, 0x8261, 0xF2C4, 0x8263, 0xF2C5, 0x8264, 0xF2C3, 0x8266, 0xC4A5, 0x8268, 0xF4B6, + 0x8269, 0xF4B7, 0x826B, 0xF746, 0x826C, 0xF7EF, 0x826D, 0xF8BB, 0x826E, 0xA6E1, 0x826F, 0xA87D, 0x8271, 0xC17D, 0x8272, 0xA6E2, + 0x8274, 0xD758, 0x8275, 0xDB5B, 0x8277, 0xC641, 0x8278, 0xCA4A, 0x827C, 0xCA4B, 0x827D, 0xCA4D, 0x827E, 0xA6E3, 0x827F, 0xCA4E, + 0x8280, 0xCA4C, 0x8283, 0xCBA2, 0x8284, 0xCBA3, 0x8285, 0xCB7B, 0x828A, 0xCBA1, 0x828B, 0xA8A1, 0x828D, 0xA8A2, 0x828E, 0xCB7C, + 0x828F, 0xCB7A, 0x8290, 0xCB79, 0x8291, 0xCB7D, 0x8292, 0xA87E, 0x8293, 0xCB7E, 0x8294, 0xD06A, 0x8298, 0xCDB6, 0x8299, 0xAADC, + 0x829A, 0xCDB5, 0x829B, 0xCDB7, 0x829D, 0xAADB, 0x829E, 0xCDBC, 0x829F, 0xAADF, 0x82A0, 0xCDB2, 0x82A1, 0xCDC0, 0x82A2, 0xCDC6, + 0x82A3, 0xAAE6, 0x82A4, 0xCDC3, 0x82A5, 0xAAE3, 0x82A7, 0xCDB9, 0x82A8, 0xCDBF, 0x82A9, 0xCDC1, 0x82AB, 0xCDB4, 0x82AC, 0xAAE2, + 0x82AD, 0xAADD, 0x82AE, 0xCDBA, 0x82AF, 0xAAE4, 0x82B0, 0xAAE7, 0x82B1, 0xAAE1, 0x82B3, 0xAADA, 0x82B4, 0xCDBE, 0x82B5, 0xCDB8, + 0x82B6, 0xCDC5, 0x82B7, 0xAAE9, 0x82B8, 0xAAE5, 0x82B9, 0xAAE0, 0x82BA, 0xCDBD, 0x82BB, 0xAFEC, 0x82BC, 0xCDBB, 0x82BD, 0xAADE, + 0x82BE, 0xAAE8, 0x82C0, 0xCDB3, 0x82C2, 0xCDC2, 0x82C3, 0xCDC4, 0x82D1, 0xAD62, 0x82D2, 0xAD5C, 0x82D3, 0xAD64, 0x82D4, 0xAD61, + 0x82D5, 0xD071, 0x82D6, 0xD074, 0x82D7, 0xAD5D, 0x82D9, 0xD06B, 0x82DB, 0xAD56, 0x82DC, 0xAD60, 0x82DE, 0xAD63, 0x82DF, 0xAD65, + 0x82E0, 0xD0A2, 0x82E1, 0xD077, 0x82E3, 0xAD55, 0x82E4, 0xD0A1, 0x82E5, 0xAD59, 0x82E6, 0xAD57, 0x82E7, 0xAD52, 0x82E8, 0xD06F, + 0x82EA, 0xD07E, 0x82EB, 0xD073, 0x82EC, 0xD076, 0x82ED, 0xD0A5, 0x82EF, 0xAD66, 0x82F0, 0xD07D, 0x82F1, 0xAD5E, 0x82F2, 0xD078, + 0x82F3, 0xD0A4, 0x82F4, 0xD075, 0x82F5, 0xD079, 0x82F6, 0xD07C, 0x82F9, 0xD06D, 0x82FA, 0xD0A3, 0x82FB, 0xD07B, 0x82FE, 0xD06C, + 0x8300, 0xD070, 0x8301, 0xAD5F, 0x8302, 0xAD5A, 0x8303, 0xAD53, 0x8304, 0xAD58, 0x8305, 0xAD54, 0x8306, 0xAD67, 0x8307, 0xD06E, + 0x8308, 0xD3A5, 0x8309, 0xAD5B, 0x830C, 0xD07A, 0x830D, 0xCE41, 0x8316, 0xD3A8, 0x8317, 0xAFFA, 0x8319, 0xD376, 0x831B, 0xD3A3, + 0x831C, 0xD37D, 0x831E, 0xD3B2, 0x8320, 0xD3AA, 0x8322, 0xD37E, 0x8324, 0xD3A9, 0x8325, 0xD378, 0x8326, 0xD37C, 0x8327, 0xD3B5, + 0x8328, 0xAFFD, 0x8329, 0xD3AD, 0x832A, 0xD3A4, 0x832B, 0xAFED, 0x832C, 0xD3B3, 0x832D, 0xD374, 0x832F, 0xD3AC, 0x8331, 0xAFFC, + 0x8332, 0xAFF7, 0x8333, 0xD373, 0x8334, 0xAFF5, 0x8335, 0xAFF4, 0x8336, 0xAFF9, 0x8337, 0xD3AB, 0x8338, 0xAFF1, 0x8339, 0xAFF8, + 0x833A, 0xD072, 0x833B, 0xDB5C, 0x833C, 0xD3A6, 0x833F, 0xD37A, 0x8340, 0xAFFB, 0x8341, 0xD37B, 0x8342, 0xD3A1, 0x8343, 0xAFFE, + 0x8344, 0xD375, 0x8345, 0xD3AF, 0x8347, 0xD3AE, 0x8348, 0xD3B6, 0x8349, 0xAFF3, 0x834A, 0xAFF0, 0x834B, 0xD3B4, 0x834C, 0xD3B0, + 0x834D, 0xD3A7, 0x834E, 0xD3A2, 0x834F, 0xAFF6, 0x8350, 0xAFF2, 0x8351, 0xD377, 0x8352, 0xAFEE, 0x8353, 0xD3B1, 0x8354, 0xAFEF, + 0x8356, 0xD379, 0x8373, 0xD75E, 0x8374, 0xD760, 0x8375, 0xD765, 0x8376, 0xD779, 0x8377, 0xB2FC, 0x8378, 0xB2F2, 0x837A, 0xD75D, + 0x837B, 0xB2FD, 0x837C, 0xB2FE, 0x837D, 0xD768, 0x837E, 0xD76F, 0x837F, 0xD775, 0x8381, 0xD762, 0x8383, 0xD769, 0x8386, 0xB340, + 0x8387, 0xD777, 0x8388, 0xD772, 0x8389, 0xB2FA, 0x838A, 0xB2F8, 0x838B, 0xD76E, 0x838C, 0xD76A, 0x838D, 0xD75C, 0x838E, 0xB2EF, + 0x838F, 0xD761, 0x8390, 0xD759, 0x8392, 0xB2F7, 0x8393, 0xB2F9, 0x8394, 0xD766, 0x8395, 0xD763, 0x8396, 0xB2F4, 0x8397, 0xD773, + 0x8398, 0xB2F1, 0x8399, 0xD764, 0x839A, 0xD77A, 0x839B, 0xD76C, 0x839D, 0xD76B, 0x839E, 0xB2F0, 0x83A0, 0xB2FB, 0x83A2, 0xB2F3, + 0x83A3, 0xD75A, 0x83A4, 0xD75F, 0x83A5, 0xD770, 0x83A6, 0xD776, 0x83A7, 0xB341, 0x83A8, 0xD75B, 0x83A9, 0xD767, 0x83AA, 0xD76D, + 0x83AB, 0xB2F6, 0x83AE, 0xD778, 0x83AF, 0xD771, 0x83B0, 0xD774, 0x83BD, 0xB2F5, 0x83BF, 0xDB6C, 0x83C0, 0xDB60, 0x83C1, 0xB5D7, + 0x83C2, 0xDB7D, 0x83C3, 0xDBA7, 0x83C4, 0xDBAA, 0x83C5, 0xB5D5, 0x83C6, 0xDB68, 0x83C7, 0xDBA3, 0x83C8, 0xDB69, 0x83C9, 0xDB77, + 0x83CA, 0xB5E2, 0x83CB, 0xDB73, 0x83CC, 0xB5DF, 0x83CE, 0xDB74, 0x83CF, 0xDB5D, 0x83D1, 0xDBA4, 0x83D4, 0xB5E8, 0x83D5, 0xDBA1, + 0x83D6, 0xDB75, 0x83D7, 0xDBAC, 0x83D8, 0xDB70, 0x83D9, 0xDFC8, 0x83DB, 0xDBAF, 0x83DC, 0xB5E6, 0x83DD, 0xDB6E, 0x83DE, 0xDB7A, + 0x83DF, 0xB5E9, 0x83E0, 0xB5D4, 0x83E1, 0xDB72, 0x83E2, 0xDBAD, 0x83E3, 0xDB6B, 0x83E4, 0xDB64, 0x83E5, 0xDB6F, 0x83E7, 0xDB63, + 0x83E8, 0xDB61, 0x83E9, 0xB5D0, 0x83EA, 0xDBA5, 0x83EB, 0xDB6A, 0x83EC, 0xDBA8, 0x83EE, 0xDBA9, 0x83EF, 0xB5D8, 0x83F0, 0xB5DD, + 0x83F1, 0xB5D9, 0x83F2, 0xB5E1, 0x83F3, 0xDB7E, 0x83F4, 0xB5DA, 0x83F5, 0xDB76, 0x83F6, 0xDB66, 0x83F8, 0xB5D2, 0x83F9, 0xDB5E, + 0x83FA, 0xDBA2, 0x83FB, 0xDBAB, 0x83FC, 0xDB65, 0x83FD, 0xB5E0, 0x83FE, 0xDBB0, 0x83FF, 0xDB71, 0x8401, 0xDB6D, 0x8403, 0xB5D1, + 0x8404, 0xB5E5, 0x8406, 0xDB7C, 0x8407, 0xB5E7, 0x8409, 0xDB78, 0x840A, 0xB5DC, 0x840B, 0xB5D6, 0x840C, 0xB5DE, 0x840D, 0xB5D3, + 0x840E, 0xB5E4, 0x840F, 0xDB79, 0x8410, 0xDB67, 0x8411, 0xDB7B, 0x8412, 0xDB62, 0x8413, 0xDBA6, 0x841B, 0xDBAE, 0x8423, 0xDB5F, + 0x8429, 0xDFC7, 0x842B, 0xDFDD, 0x842C, 0xB855, 0x842D, 0xDFCC, 0x842F, 0xDFCA, 0x8430, 0xDFB5, 0x8431, 0xB8A9, 0x8432, 0xDFC5, + 0x8433, 0xDFD9, 0x8434, 0xDFC1, 0x8435, 0xB8B1, 0x8436, 0xDFD8, 0x8437, 0xDFBF, 0x8438, 0xB5E3, 0x8439, 0xDFCF, 0x843A, 0xDFC0, + 0x843B, 0xDFD6, 0x843C, 0xB8B0, 0x843D, 0xB8A8, 0x843F, 0xDFAA, 0x8440, 0xDFB2, 0x8442, 0xDFCB, 0x8443, 0xDFC3, 0x8444, 0xDFDC, + 0x8445, 0xDFC6, 0x8446, 0xB8B6, 0x8447, 0xDFD7, 0x8449, 0xB8AD, 0x844B, 0xDFC9, 0x844C, 0xDFD1, 0x844D, 0xDFB6, 0x844E, 0xDFD0, + 0x8450, 0xDFE1, 0x8451, 0xDFB1, 0x8452, 0xDFD2, 0x8454, 0xDFDF, 0x8456, 0xDFAB, 0x8457, 0xB5DB, 0x8459, 0xDFB9, 0x845A, 0xDFB8, + 0x845B, 0xB8AF, 0x845D, 0xDFBC, 0x845E, 0xDFBE, 0x845F, 0xDFCD, 0x8460, 0xDFDE, 0x8461, 0xB8B2, 0x8463, 0xB8B3, 0x8465, 0xDFB0, + 0x8466, 0xB8AB, 0x8467, 0xDFB4, 0x8468, 0xDFDA, 0x8469, 0xB8B4, 0x846B, 0xB8AC, 0x846C, 0xB8AE, 0x846D, 0xB8B5, 0x846E, 0xDFE0, + 0x846F, 0xDFD3, 0x8470, 0xDFCE, 0x8473, 0xDFBB, 0x8474, 0xDFBA, 0x8475, 0xB8AA, 0x8476, 0xDFAC, 0x8477, 0xB8A7, 0x8478, 0xDFC4, + 0x8479, 0xDFAD, 0x847A, 0xDFC2, 0x847D, 0xDFB7, 0x847E, 0xDFDB, 0x8482, 0xB8A6, 0x8486, 0xDFB3, 0x848D, 0xDFAF, 0x848E, 0xDFD5, + 0x848F, 0xDFAE, 0x8490, 0xBB60, 0x8491, 0xE3D3, 0x8494, 0xE3C2, 0x8497, 0xE3AC, 0x8498, 0xE3CA, 0x8499, 0xBB58, 0x849A, 0xE3BB, + 0x849B, 0xE3C5, 0x849C, 0xBB5B, 0x849D, 0xE3BE, 0x849E, 0xBB59, 0x849F, 0xE3AF, 0x84A0, 0xE3CD, 0x84A1, 0xE3AE, 0x84A2, 0xE3C1, + 0x84A4, 0xE3AD, 0x84A7, 0xE3BF, 0x84A8, 0xE3C8, 0x84A9, 0xE3C6, 0x84AA, 0xE3BA, 0x84AB, 0xE3B5, 0x84AC, 0xE3B3, 0x84AE, 0xE3B4, + 0x84AF, 0xE3C7, 0x84B0, 0xE3D2, 0x84B1, 0xE3BC, 0x84B2, 0xBB5A, 0x84B4, 0xE3B7, 0x84B6, 0xE3CB, 0x84B8, 0xBB5D, 0x84B9, 0xE3B6, + 0x84BA, 0xE3B0, 0x84BB, 0xE3C0, 0x84BC, 0xBB61, 0x84BF, 0xBB55, 0x84C0, 0xBB5E, 0x84C1, 0xE3B8, 0x84C2, 0xE3B2, 0x84C4, 0xBB57, + 0x84C5, 0xDFD4, 0x84C6, 0xBB56, 0x84C7, 0xE3C3, 0x84C9, 0xBB54, 0x84CA, 0xBB63, 0x84CB, 0xBB5C, 0x84CC, 0xE3C4, 0x84CD, 0xE3B9, + 0x84CE, 0xE3B1, 0x84CF, 0xE3CC, 0x84D0, 0xE3BD, 0x84D1, 0xBB62, 0x84D2, 0xE3D0, 0x84D3, 0xBB5F, 0x84D4, 0xE3CF, 0x84D6, 0xE3C9, + 0x84D7, 0xE3CE, 0x84DB, 0xE3D1, 0x84E7, 0xE773, 0x84E8, 0xE774, 0x84E9, 0xE767, 0x84EA, 0xE766, 0x84EB, 0xE762, 0x84EC, 0xBDB4, + 0x84EE, 0xBDAC, 0x84EF, 0xE776, 0x84F0, 0xE775, 0x84F1, 0xDFA9, 0x84F2, 0xE75F, 0x84F3, 0xE763, 0x84F4, 0xE75D, 0x84F6, 0xE770, + 0x84F7, 0xE761, 0x84F9, 0xE777, 0x84FA, 0xE75A, 0x84FB, 0xE758, 0x84FC, 0xE764, 0x84FD, 0xE76E, 0x84FE, 0xE769, 0x84FF, 0xBDB6, + 0x8500, 0xE74F, 0x8502, 0xE76D, 0x8506, 0xBDB7, 0x8507, 0xDFBD, 0x8508, 0xE75B, 0x8509, 0xE752, 0x850A, 0xE755, 0x850B, 0xE77B, + 0x850C, 0xE75C, 0x850D, 0xE753, 0x850E, 0xE751, 0x850F, 0xE74E, 0x8511, 0xBDB0, 0x8512, 0xE765, 0x8513, 0xBDAF, 0x8514, 0xBDB3, + 0x8515, 0xE760, 0x8516, 0xE768, 0x8517, 0xBDA9, 0x8518, 0xE778, 0x8519, 0xE77C, 0x851A, 0xBDAB, 0x851C, 0xE757, 0x851D, 0xE76B, + 0x851E, 0xE76F, 0x851F, 0xE754, 0x8520, 0xE779, 0x8521, 0xBDB2, 0x8523, 0xBDB1, 0x8524, 0xE74C, 0x8525, 0xBDB5, 0x8526, 0xE772, + 0x8527, 0xE756, 0x8528, 0xE76A, 0x8529, 0xE750, 0x852A, 0xE75E, 0x852B, 0xE759, 0x852C, 0xBDAD, 0x852D, 0xBDAE, 0x852E, 0xE76C, + 0x852F, 0xE77D, 0x8530, 0xE77A, 0x8531, 0xE771, 0x853B, 0xE74D, 0x853D, 0xBDAA, 0x853E, 0xEB49, 0x8540, 0xEB40, 0x8541, 0xEB43, + 0x8543, 0xBFBB, 0x8544, 0xEB45, 0x8545, 0xEAF9, 0x8546, 0xEB41, 0x8547, 0xEB47, 0x8548, 0xBFB8, 0x8549, 0xBFBC, 0x854A, 0xBFB6, + 0x854D, 0xEAFB, 0x854E, 0xEB4C, 0x8551, 0xEB46, 0x8553, 0xEAFC, 0x8554, 0xEB55, 0x8555, 0xEB4F, 0x8556, 0xEAF8, 0x8557, 0xEE46, + 0x8558, 0xEAFE, 0x8559, 0xBFB7, 0x855B, 0xEB4A, 0x855D, 0xEB54, 0x855E, 0xBFBF, 0x8560, 0xEB51, 0x8561, 0xEAFD, 0x8562, 0xEB44, + 0x8563, 0xEB48, 0x8564, 0xEB42, 0x8565, 0xEB56, 0x8566, 0xEB53, 0x8567, 0xEB50, 0x8568, 0xBFB9, 0x8569, 0xBFBA, 0x856A, 0xBFBE, + 0x856B, 0xEAFA, 0x856C, 0xEB57, 0x856D, 0xBFBD, 0x856E, 0xEB4D, 0x8571, 0xEB4B, 0x8575, 0xEB4E, 0x8576, 0xEE53, 0x8577, 0xEE40, + 0x8578, 0xEE45, 0x8579, 0xEE52, 0x857A, 0xEE44, 0x857B, 0xEDFB, 0x857C, 0xEE41, 0x857E, 0xC1A2, 0x8580, 0xEDF4, 0x8581, 0xEE4D, + 0x8582, 0xEE4F, 0x8583, 0xEDF3, 0x8584, 0xC1A1, 0x8585, 0xEE51, 0x8586, 0xEE49, 0x8587, 0xC1A8, 0x8588, 0xEE50, 0x8589, 0xEE42, + 0x858A, 0xC1AA, 0x858B, 0xEDF9, 0x858C, 0xEB52, 0x858D, 0xEE4A, 0x858E, 0xEE47, 0x858F, 0xEDF5, 0x8590, 0xEE55, 0x8591, 0xC1A4, + 0x8594, 0xC1A5, 0x8595, 0xEDF7, 0x8596, 0xEE48, 0x8598, 0xEE54, 0x8599, 0xEE4B, 0x859A, 0xEDFD, 0x859B, 0xC1A7, 0x859C, 0xC1A3, + 0x859D, 0xEE4C, 0x859E, 0xEDFE, 0x859F, 0xEE56, 0x85A0, 0xEDF8, 0x85A1, 0xEE43, 0x85A2, 0xEE4E, 0x85A3, 0xEDFA, 0x85A4, 0xEDFC, + 0x85A6, 0xC2CB, 0x85A7, 0xEDF6, 0x85A8, 0xC1A9, 0x85A9, 0xC2C4, 0x85AA, 0xC17E, 0x85AF, 0xC1A6, 0x85B0, 0xC2C8, 0x85B1, 0xF0B3, + 0x85B3, 0xF0A9, 0x85B4, 0xF0A4, 0x85B5, 0xF0AA, 0x85B6, 0xF0B4, 0x85B7, 0xF0B8, 0x85B8, 0xF0B7, 0x85B9, 0xC2CA, 0x85BA, 0xC2C9, + 0x85BD, 0xF0AB, 0x85BE, 0xF0B9, 0x85BF, 0xF0AE, 0x85C0, 0xF0A6, 0x85C2, 0xF0A8, 0x85C3, 0xF0A7, 0x85C4, 0xF0AD, 0x85C5, 0xF0B2, + 0x85C6, 0xF0A5, 0x85C7, 0xF0AC, 0x85C8, 0xF0B1, 0x85C9, 0xC2C7, 0x85CB, 0xF0AF, 0x85CD, 0xC2C5, 0x85CE, 0xF0B0, 0x85CF, 0xC2C3, + 0x85D0, 0xC2C6, 0x85D1, 0xF2D5, 0x85D2, 0xF0B5, 0x85D5, 0xC3C2, 0x85D7, 0xF2CD, 0x85D8, 0xF2D1, 0x85D9, 0xF2C9, 0x85DA, 0xF2CC, + 0x85DC, 0xF2D4, 0x85DD, 0xC3C0, 0x85DE, 0xF2D9, 0x85DF, 0xF2D2, 0x85E1, 0xF2CA, 0x85E2, 0xF2DA, 0x85E3, 0xF2D3, 0x85E4, 0xC3C3, + 0x85E5, 0xC3C4, 0x85E6, 0xF2D7, 0x85E8, 0xF2CB, 0x85E9, 0xC3BF, 0x85EA, 0xC3C1, 0x85EB, 0xF2C6, 0x85EC, 0xF2CE, 0x85ED, 0xF2C8, + 0x85EF, 0xF2D8, 0x85F0, 0xF2D6, 0x85F1, 0xF2C7, 0x85F2, 0xF2CF, 0x85F6, 0xF4BE, 0x85F7, 0xC3C5, 0x85F8, 0xF2D0, 0x85F9, 0xC4A7, + 0x85FA, 0xC4A9, 0x85FB, 0xC4A6, 0x85FD, 0xF4C3, 0x85FE, 0xF4BB, 0x85FF, 0xF4B9, 0x8600, 0xF4BD, 0x8601, 0xF4BA, 0x8604, 0xF4BF, + 0x8605, 0xF4C1, 0x8606, 0xC4AA, 0x8607, 0xC4AC, 0x8609, 0xF4C0, 0x860A, 0xC4AD, 0x860B, 0xC4AB, 0x860C, 0xF4C2, 0x8611, 0xC4A8, + 0x8617, 0xC4F4, 0x8618, 0xF5F1, 0x8619, 0xF5F7, 0x861A, 0xC4F6, 0x861B, 0xF4BC, 0x861C, 0xF5F6, 0x861E, 0xF5FD, 0x861F, 0xF5F4, + 0x8620, 0xF5FB, 0x8621, 0xF5FA, 0x8622, 0xF4B8, 0x8623, 0xF5F5, 0x8624, 0xF0B6, 0x8625, 0xF5FE, 0x8626, 0xF5F3, 0x8627, 0xF5F8, + 0x8629, 0xF5FC, 0x862A, 0xF5F2, 0x862C, 0xF74A, 0x862D, 0xC4F5, 0x862E, 0xF5F9, 0x8631, 0xF7F4, 0x8632, 0xF74B, 0x8633, 0xF749, + 0x8634, 0xF747, 0x8635, 0xF748, 0x8636, 0xF74C, 0x8638, 0xC5D9, 0x8639, 0xF7F2, 0x863A, 0xF7F0, 0x863B, 0xF7F5, 0x863C, 0xF7F3, + 0x863E, 0xF7F6, 0x863F, 0xC5DA, 0x8640, 0xF7F1, 0x8643, 0xF8BC, 0x8646, 0xF945, 0x8647, 0xF946, 0x8648, 0xF947, 0x864B, 0xF9C7, + 0x864C, 0xF9BD, 0x864D, 0xCA4F, 0x864E, 0xAAEA, 0x8650, 0xAD68, 0x8652, 0xD3B8, 0x8653, 0xD3B7, 0x8654, 0xB040, 0x8655, 0xB342, + 0x8656, 0xD77C, 0x8659, 0xD77B, 0x865B, 0xB5EA, 0x865C, 0xB8B8, 0x865E, 0xB8B7, 0x865F, 0xB8B9, 0x8661, 0xE3D4, 0x8662, 0xE77E, + 0x8663, 0xEB58, 0x8664, 0xEB5A, 0x8665, 0xEB59, 0x8667, 0xC1AB, 0x8668, 0xEE57, 0x8669, 0xF0BA, 0x866A, 0xF9A5, 0x866B, 0xA6E4, + 0x866D, 0xCDC9, 0x866E, 0xCDCA, 0x866F, 0xCDC8, 0x8670, 0xCDC7, 0x8671, 0xAAEB, 0x8673, 0xD0A9, 0x8674, 0xD0A7, 0x8677, 0xD0A6, + 0x8679, 0xAD69, 0x867A, 0xAD6B, 0x867B, 0xAD6A, 0x867C, 0xD0A8, 0x8685, 0xD3C4, 0x8686, 0xD3C1, 0x8687, 0xD3BF, 0x868A, 0xB041, + 0x868B, 0xD3C2, 0x868C, 0xB046, 0x868D, 0xD3BC, 0x868E, 0xD3CB, 0x8690, 0xD3CD, 0x8691, 0xD3BD, 0x8693, 0xB043, 0x8694, 0xD3CE, + 0x8695, 0xD3C9, 0x8696, 0xD3BB, 0x8697, 0xD3C0, 0x8698, 0xD3CA, 0x8699, 0xD3C6, 0x869A, 0xD3C3, 0x869C, 0xB048, 0x869D, 0xD3CC, + 0x869E, 0xD3BE, 0x86A1, 0xD3C7, 0x86A2, 0xD3B9, 0x86A3, 0xB047, 0x86A4, 0xB044, 0x86A5, 0xD3C5, 0x86A7, 0xD3C8, 0x86A8, 0xD3BA, + 0x86A9, 0xB045, 0x86AA, 0xB042, 0x86AF, 0xB34C, 0x86B0, 0xD7A5, 0x86B1, 0xB34B, 0x86B3, 0xD7A8, 0x86B4, 0xD7AB, 0x86B5, 0xB348, + 0x86B6, 0xB346, 0x86B7, 0xD77E, 0x86B8, 0xD7A9, 0x86B9, 0xD7A7, 0x86BA, 0xD7A4, 0x86BB, 0xD7AC, 0x86BC, 0xD7AD, 0x86BD, 0xD7AF, + 0x86BE, 0xD7B0, 0x86BF, 0xD77D, 0x86C0, 0xB345, 0x86C1, 0xD7A2, 0x86C2, 0xD7A1, 0x86C3, 0xD7AE, 0x86C4, 0xB347, 0x86C5, 0xD7A3, + 0x86C6, 0xB349, 0x86C7, 0xB344, 0x86C8, 0xD7A6, 0x86C9, 0xB34D, 0x86CB, 0xB34A, 0x86CC, 0xD7AA, 0x86D0, 0xB5F1, 0x86D1, 0xDBBF, + 0x86D3, 0xDBB4, 0x86D4, 0xB5EE, 0x86D6, 0xDFE7, 0x86D7, 0xDBBD, 0x86D8, 0xDBB1, 0x86D9, 0xB5EC, 0x86DA, 0xDBB6, 0x86DB, 0xB5EF, + 0x86DC, 0xDBBA, 0x86DD, 0xDBB8, 0x86DE, 0xB5F2, 0x86DF, 0xB5EB, 0x86E2, 0xDBB2, 0x86E3, 0xDBB5, 0x86E4, 0xB5F0, 0x86E6, 0xDBB3, + 0x86E8, 0xDBBE, 0x86E9, 0xDBBC, 0x86EA, 0xDBB7, 0x86EB, 0xDBB9, 0x86EC, 0xDBBB, 0x86ED, 0xB5ED, 0x86F5, 0xDFE8, 0x86F6, 0xDFEE, + 0x86F7, 0xDFE4, 0x86F8, 0xDFEA, 0x86F9, 0xB8BA, 0x86FA, 0xDFE6, 0x86FB, 0xB8C0, 0x86FE, 0xB8BF, 0x8700, 0xB8BE, 0x8701, 0xDFED, + 0x8702, 0xB8C1, 0x8703, 0xB8C2, 0x8704, 0xDFE3, 0x8705, 0xDFF0, 0x8706, 0xB8C3, 0x8707, 0xB8BD, 0x8708, 0xB8BC, 0x8709, 0xDFEC, + 0x870A, 0xB8C4, 0x870B, 0xDFE2, 0x870C, 0xDFE5, 0x870D, 0xDFEF, 0x870E, 0xDFEB, 0x8711, 0xE3F4, 0x8712, 0xE3E9, 0x8713, 0xB8BB, + 0x8718, 0xBB6A, 0x8719, 0xE3DD, 0x871A, 0xE3F2, 0x871B, 0xE3DE, 0x871C, 0xBB65, 0x871E, 0xE3DB, 0x8720, 0xE3E4, 0x8721, 0xE3DC, + 0x8722, 0xBB67, 0x8723, 0xE3D6, 0x8724, 0xE3F1, 0x8725, 0xBB68, 0x8726, 0xE3EE, 0x8727, 0xE3EF, 0x8728, 0xE3D7, 0x8729, 0xBB6D, + 0x872A, 0xE3E6, 0x872C, 0xE3E0, 0x872D, 0xE3E7, 0x872E, 0xE3DA, 0x8730, 0xE3F3, 0x8731, 0xE3EB, 0x8732, 0xE3E5, 0x8733, 0xE3D5, + 0x8734, 0xBB69, 0x8735, 0xE3EC, 0x8737, 0xBB6C, 0x8738, 0xE3F0, 0x873A, 0xE3EA, 0x873B, 0xBB66, 0x873C, 0xE3E8, 0x873E, 0xE3E2, + 0x873F, 0xBB64, 0x8740, 0xE3D9, 0x8741, 0xE3E1, 0x8742, 0xE3ED, 0x8743, 0xE3DF, 0x8746, 0xE3E3, 0x874C, 0xBDC1, 0x874D, 0xDFE9, + 0x874E, 0xE7B2, 0x874F, 0xE7BB, 0x8750, 0xE7B1, 0x8751, 0xE7AD, 0x8752, 0xE7AA, 0x8753, 0xBDC2, 0x8754, 0xE7A8, 0x8755, 0xBB6B, + 0x8756, 0xE7A1, 0x8757, 0xBDC0, 0x8758, 0xE7A7, 0x8759, 0xBDBF, 0x875A, 0xE7AC, 0x875B, 0xE7A9, 0x875C, 0xE7B9, 0x875D, 0xE7B4, + 0x875E, 0xE7AE, 0x875F, 0xE7B3, 0x8760, 0xBDBB, 0x8761, 0xE7AB, 0x8762, 0xE7BE, 0x8763, 0xE7A2, 0x8764, 0xE7A3, 0x8765, 0xE7BA, + 0x8766, 0xBDBC, 0x8767, 0xE7BF, 0x8768, 0xBDBE, 0x8769, 0xE7C0, 0x876A, 0xE7B0, 0x876B, 0xE3D8, 0x876C, 0xE7B6, 0x876D, 0xE7AF, + 0x876E, 0xE7B8, 0x876F, 0xE7B5, 0x8773, 0xE7A6, 0x8774, 0xBDB9, 0x8775, 0xE7BD, 0x8776, 0xBDBA, 0x8777, 0xE7A4, 0x8778, 0xBDBD, + 0x8779, 0xEB64, 0x877A, 0xE7B7, 0x877B, 0xE7BC, 0x8781, 0xEB61, 0x8782, 0xBDB8, 0x8783, 0xBFC0, 0x8784, 0xEB6B, 0x8785, 0xEB67, + 0x8787, 0xEB65, 0x8788, 0xEB60, 0x8789, 0xEB6F, 0x878D, 0xBFC4, 0x878F, 0xEB5C, 0x8790, 0xEB68, 0x8791, 0xEB69, 0x8792, 0xEB5F, + 0x8793, 0xEB5E, 0x8794, 0xEB6C, 0x8796, 0xEB62, 0x8797, 0xEB5D, 0x8798, 0xEB63, 0x879A, 0xEB6E, 0x879B, 0xEB5B, 0x879C, 0xEB6D, + 0x879D, 0xEB6A, 0x879E, 0xBFC2, 0x879F, 0xBFC1, 0x87A2, 0xBFC3, 0x87A3, 0xEB66, 0x87A4, 0xF0CB, 0x87AA, 0xEE59, 0x87AB, 0xC1B1, + 0x87AC, 0xEE5D, 0x87AD, 0xEE5A, 0x87AE, 0xEE61, 0x87AF, 0xEE67, 0x87B0, 0xEE5C, 0x87B2, 0xEE70, 0x87B3, 0xC1AE, 0x87B4, 0xEE6A, + 0x87B5, 0xEE5F, 0x87B6, 0xEE6B, 0x87B7, 0xEE66, 0x87B8, 0xEE6D, 0x87B9, 0xEE5E, 0x87BA, 0xC1B3, 0x87BB, 0xC1B2, 0x87BC, 0xEE60, + 0x87BD, 0xEE6E, 0x87BE, 0xEE58, 0x87BF, 0xEE6C, 0x87C0, 0xC1AC, 0x87C2, 0xEE64, 0x87C3, 0xEE63, 0x87C4, 0xEE68, 0x87C5, 0xEE5B, + 0x87C6, 0xC1B0, 0x87C8, 0xC1B4, 0x87C9, 0xEE62, 0x87CA, 0xEE69, 0x87CB, 0xC1B5, 0x87CC, 0xEE65, 0x87D1, 0xC1AD, 0x87D2, 0xC1AF, + 0x87D3, 0xF0C7, 0x87D4, 0xF0C5, 0x87D7, 0xF0CC, 0x87D8, 0xF0C9, 0x87D9, 0xF0CD, 0x87DB, 0xF0BE, 0x87DC, 0xF0C6, 0x87DD, 0xF0D1, + 0x87DE, 0xEE6F, 0x87DF, 0xF0C2, 0x87E0, 0xC2CF, 0x87E1, 0xE7A5, 0x87E2, 0xF0BD, 0x87E3, 0xF0CA, 0x87E4, 0xF0C4, 0x87E5, 0xF0C1, + 0x87E6, 0xF0BC, 0x87E7, 0xF0BB, 0x87E8, 0xF0D0, 0x87EA, 0xF0C0, 0x87EB, 0xF0BF, 0x87EC, 0xC2CD, 0x87ED, 0xF0C8, 0x87EF, 0xC2CC, + 0x87F2, 0xC2CE, 0x87F3, 0xF0C3, 0x87F4, 0xF0CF, 0x87F6, 0xF2DE, 0x87F7, 0xF2DF, 0x87F9, 0xC3C9, 0x87FA, 0xF2DC, 0x87FB, 0xC3C6, + 0x87FC, 0xF2E4, 0x87FE, 0xC3CA, 0x87FF, 0xF2E6, 0x8800, 0xF2DB, 0x8801, 0xF0CE, 0x8802, 0xF2E8, 0x8803, 0xF2DD, 0x8805, 0xC3C7, + 0x8806, 0xF2E3, 0x8808, 0xF2E5, 0x8809, 0xF2E0, 0x880A, 0xF2E7, 0x880B, 0xF2E2, 0x880C, 0xF2E1, 0x880D, 0xC3C8, 0x8810, 0xF4C5, + 0x8811, 0xF4C6, 0x8813, 0xF4C8, 0x8814, 0xC4AE, 0x8815, 0xC4AF, 0x8816, 0xF4C9, 0x8817, 0xF4C7, 0x8819, 0xF4C4, 0x881B, 0xF642, + 0x881C, 0xF645, 0x881D, 0xF641, 0x881F, 0xC4FA, 0x8820, 0xF643, 0x8821, 0xC4F9, 0x8822, 0xC4F8, 0x8823, 0xC4F7, 0x8824, 0xF644, + 0x8825, 0xF751, 0x8826, 0xF74F, 0x8828, 0xF74E, 0x8829, 0xF640, 0x882A, 0xF750, 0x882B, 0xF646, 0x882C, 0xF74D, 0x882E, 0xF7F9, + 0x882F, 0xF7D7, 0x8830, 0xF7F7, 0x8831, 0xC5DB, 0x8832, 0xF7F8, 0x8833, 0xF7FA, 0x8835, 0xF8BF, 0x8836, 0xC5FA, 0x8837, 0xF8BE, + 0x8838, 0xF8BD, 0x8839, 0xC5FB, 0x883B, 0xC65A, 0x883C, 0xF96E, 0x883D, 0xF9A7, 0x883E, 0xF9A6, 0x883F, 0xF9A8, 0x8840, 0xA6E5, + 0x8841, 0xD0AA, 0x8843, 0xD3CF, 0x8844, 0xD3D0, 0x8848, 0xDBC0, 0x884A, 0xF647, 0x884B, 0xF8C0, 0x884C, 0xA6E6, 0x884D, 0xAD6C, + 0x884E, 0xD0AB, 0x8852, 0xD7B1, 0x8853, 0xB34E, 0x8855, 0xDBC2, 0x8856, 0xDBC1, 0x8857, 0xB5F3, 0x8859, 0xB8C5, 0x885A, 0xE7C1, + 0x885B, 0xBDC3, 0x885D, 0xBDC4, 0x8861, 0xBFC5, 0x8862, 0xC5FC, 0x8863, 0xA6E7, 0x8867, 0xD0AC, 0x8868, 0xAAED, 0x8869, 0xD0AE, + 0x886A, 0xD0AD, 0x886B, 0xAD6D, 0x886D, 0xD3D1, 0x886F, 0xD3D8, 0x8870, 0xB049, 0x8871, 0xD3D6, 0x8872, 0xD3D4, 0x8874, 0xD3DB, + 0x8875, 0xD3D2, 0x8876, 0xD3D3, 0x8877, 0xB04A, 0x8879, 0xB04E, 0x887C, 0xD3DC, 0x887D, 0xB04D, 0x887E, 0xD3DA, 0x887F, 0xD3D7, + 0x8880, 0xD3D5, 0x8881, 0xB04B, 0x8882, 0xB04C, 0x8883, 0xD3D9, 0x8888, 0xB350, 0x8889, 0xD7B2, 0x888B, 0xB355, 0x888C, 0xD7C2, + 0x888D, 0xB354, 0x888E, 0xD7C4, 0x8891, 0xD7B8, 0x8892, 0xB352, 0x8893, 0xD7C3, 0x8895, 0xD7B3, 0x8896, 0xB353, 0x8897, 0xD7BF, + 0x8898, 0xD7BB, 0x8899, 0xD7BD, 0x889A, 0xD7B7, 0x889B, 0xD7BE, 0x889E, 0xB34F, 0x889F, 0xD7BA, 0x88A1, 0xD7B9, 0x88A2, 0xD7B5, + 0x88A4, 0xD7C0, 0x88A7, 0xD7BC, 0x88A8, 0xD7B4, 0x88AA, 0xD7B6, 0x88AB, 0xB351, 0x88AC, 0xD7C1, 0x88B1, 0xB5F6, 0x88B2, 0xDBCD, + 0x88B6, 0xDBC9, 0x88B7, 0xDBCB, 0x88B8, 0xDBC6, 0x88B9, 0xDBC5, 0x88BA, 0xDBC3, 0x88BC, 0xDBCA, 0x88BD, 0xDBCC, 0x88BE, 0xDBC8, + 0x88C0, 0xDBC7, 0x88C1, 0xB5F4, 0x88C2, 0xB5F5, 0x88C9, 0xDBCF, 0x88CA, 0xB8CD, 0x88CB, 0xDFF2, 0x88CC, 0xDFF8, 0x88CD, 0xDFF3, + 0x88CE, 0xDFF4, 0x88CF, 0xF9D8, 0x88D0, 0xDFF9, 0x88D2, 0xB8CF, 0x88D4, 0xB8C7, 0x88D5, 0xB8CE, 0x88D6, 0xDFF1, 0x88D7, 0xDBC4, + 0x88D8, 0xB8CA, 0x88D9, 0xB8C8, 0x88DA, 0xDFF7, 0x88DB, 0xDFF6, 0x88DC, 0xB8C9, 0x88DD, 0xB8CB, 0x88DE, 0xDFF5, 0x88DF, 0xB8C6, + 0x88E1, 0xB8CC, 0x88E7, 0xE3F6, 0x88E8, 0xBB74, 0x88EB, 0xE442, 0x88EC, 0xE441, 0x88EE, 0xE3FB, 0x88EF, 0xBB76, 0x88F0, 0xE440, + 0x88F1, 0xE3F7, 0x88F2, 0xE3F8, 0x88F3, 0xBB6E, 0x88F4, 0xBB70, 0x88F6, 0xE3FD, 0x88F7, 0xE3F5, 0x88F8, 0xBB72, 0x88F9, 0xBB71, + 0x88FA, 0xE3F9, 0x88FB, 0xE3FE, 0x88FC, 0xE3FC, 0x88FD, 0xBB73, 0x88FE, 0xE3FA, 0x8901, 0xDBCE, 0x8902, 0xBB6F, 0x8905, 0xE7C2, + 0x8906, 0xE7C9, 0x8907, 0xBDC6, 0x8909, 0xE7CD, 0x890A, 0xBDCA, 0x890B, 0xE7C5, 0x890C, 0xE7C3, 0x890E, 0xE7CC, 0x8910, 0xBDC5, + 0x8911, 0xE7CB, 0x8912, 0xBDC7, 0x8913, 0xBDC8, 0x8914, 0xE7C4, 0x8915, 0xBDC9, 0x8916, 0xE7CA, 0x8917, 0xE7C6, 0x8918, 0xE7C7, + 0x8919, 0xE7C8, 0x891A, 0xBB75, 0x891E, 0xEB70, 0x891F, 0xEB7C, 0x8921, 0xBFCA, 0x8922, 0xEB77, 0x8923, 0xEB79, 0x8925, 0xBFC8, + 0x8926, 0xEB71, 0x8927, 0xEB75, 0x8929, 0xEB78, 0x892A, 0xBFC6, 0x892B, 0xBFC9, 0x892C, 0xEB7B, 0x892D, 0xEB73, 0x892E, 0xEB74, + 0x892F, 0xEB7A, 0x8930, 0xEB72, 0x8931, 0xEB76, 0x8932, 0xBFC7, 0x8933, 0xEE72, 0x8935, 0xEE71, 0x8936, 0xC1B7, 0x8937, 0xEE77, + 0x8938, 0xC1B9, 0x893B, 0xC1B6, 0x893C, 0xEE73, 0x893D, 0xC1BA, 0x893E, 0xEE74, 0x8941, 0xEE75, 0x8942, 0xEE78, 0x8944, 0xC1B8, + 0x8946, 0xF0D6, 0x8949, 0xF0D9, 0x894B, 0xF0D3, 0x894C, 0xF0D5, 0x894F, 0xF0D4, 0x8950, 0xF0D7, 0x8951, 0xF0D8, 0x8952, 0xEE76, + 0x8953, 0xF0D2, 0x8956, 0xC3CD, 0x8957, 0xF2EC, 0x8958, 0xF2EF, 0x8959, 0xF2F1, 0x895A, 0xF2EA, 0x895B, 0xF2EB, 0x895C, 0xF2EE, + 0x895D, 0xF2F0, 0x895E, 0xC3CE, 0x895F, 0xC3CC, 0x8960, 0xC3CB, 0x8961, 0xF2ED, 0x8962, 0xF2E9, 0x8963, 0xF4CA, 0x8964, 0xC4B0, + 0x8966, 0xF4CB, 0x8969, 0xF649, 0x896A, 0xC4FB, 0x896B, 0xF64B, 0x896C, 0xC4FC, 0x896D, 0xF648, 0x896E, 0xF64A, 0x896F, 0xC5A8, + 0x8971, 0xF752, 0x8972, 0xC5A7, 0x8973, 0xF7FD, 0x8974, 0xF7FC, 0x8976, 0xF7FB, 0x8979, 0xF948, 0x897A, 0xF949, 0x897B, 0xF94B, + 0x897C, 0xF94A, 0x897E, 0xCA50, 0x897F, 0xA6E8, 0x8981, 0xAD6E, 0x8982, 0xD7C5, 0x8983, 0xB5F7, 0x8985, 0xDFFA, 0x8986, 0xC2D0, + 0x8988, 0xF2F2, 0x898B, 0xA8A3, 0x898F, 0xB357, 0x8993, 0xB356, 0x8995, 0xDBD0, 0x8996, 0xB5F8, 0x8997, 0xDBD2, 0x8998, 0xDBD1, + 0x899B, 0xDFFB, 0x899C, 0xB8D0, 0x899D, 0xE443, 0x899E, 0xE446, 0x899F, 0xE445, 0x89A1, 0xE444, 0x89A2, 0xE7CE, 0x89A3, 0xE7D0, + 0x89A4, 0xE7CF, 0x89A6, 0xBFCC, 0x89AA, 0xBFCB, 0x89AC, 0xC1BB, 0x89AD, 0xEE79, 0x89AE, 0xEE7B, 0x89AF, 0xEE7A, 0x89B2, 0xC2D1, + 0x89B6, 0xF2F4, 0x89B7, 0xF2F3, 0x89B9, 0xF4CC, 0x89BA, 0xC4B1, 0x89BD, 0xC4FD, 0x89BE, 0xF754, 0x89BF, 0xF753, 0x89C0, 0xC65B, + 0x89D2, 0xA8A4, 0x89D3, 0xD0AF, 0x89D4, 0xAD6F, 0x89D5, 0xD7C8, 0x89D6, 0xD7C6, 0x89D9, 0xD7C7, 0x89DA, 0xDBD4, 0x89DB, 0xDBD5, + 0x89DC, 0xE043, 0x89DD, 0xDBD3, 0x89DF, 0xDFFC, 0x89E0, 0xE041, 0x89E1, 0xE040, 0x89E2, 0xE042, 0x89E3, 0xB8D1, 0x89E4, 0xDFFE, + 0x89E5, 0xDFFD, 0x89E6, 0xE044, 0x89E8, 0xE449, 0x89E9, 0xE447, 0x89EB, 0xE448, 0x89EC, 0xE7D3, 0x89ED, 0xE7D1, 0x89F0, 0xE7D2, + 0x89F1, 0xEB7D, 0x89F2, 0xEE7C, 0x89F3, 0xEE7D, 0x89F4, 0xC2D2, 0x89F6, 0xF2F5, 0x89F7, 0xF4CD, 0x89F8, 0xC4B2, 0x89FA, 0xF64C, + 0x89FB, 0xF755, 0x89FC, 0xC5A9, 0x89FE, 0xF7FE, 0x89FF, 0xF94C, 0x8A00, 0xA8A5, 0x8A02, 0xAD71, 0x8A03, 0xAD72, 0x8A04, 0xD0B0, + 0x8A07, 0xD0B1, 0x8A08, 0xAD70, 0x8A0A, 0xB054, 0x8A0C, 0xB052, 0x8A0E, 0xB051, 0x8A0F, 0xB058, 0x8A10, 0xB050, 0x8A11, 0xB059, + 0x8A12, 0xD3DD, 0x8A13, 0xB056, 0x8A15, 0xB053, 0x8A16, 0xB057, 0x8A17, 0xB055, 0x8A18, 0xB04F, 0x8A1B, 0xB35F, 0x8A1D, 0xB359, + 0x8A1E, 0xD7CC, 0x8A1F, 0xB35E, 0x8A22, 0xB360, 0x8A23, 0xB35A, 0x8A25, 0xB35B, 0x8A27, 0xD7CA, 0x8A2A, 0xB358, 0x8A2C, 0xD7CB, + 0x8A2D, 0xB35D, 0x8A30, 0xD7C9, 0x8A31, 0xB35C, 0x8A34, 0xB644, 0x8A36, 0xB646, 0x8A39, 0xDBD8, 0x8A3A, 0xB645, 0x8A3B, 0xB5F9, + 0x8A3C, 0xB5FD, 0x8A3E, 0xB8E4, 0x8A3F, 0xE049, 0x8A40, 0xDBDA, 0x8A41, 0xB5FE, 0x8A44, 0xDBDD, 0x8A45, 0xDBDE, 0x8A46, 0xB643, + 0x8A48, 0xDBE0, 0x8A4A, 0xDBE2, 0x8A4C, 0xDBE3, 0x8A4D, 0xDBD7, 0x8A4E, 0xDBD6, 0x8A4F, 0xDBE4, 0x8A50, 0xB642, 0x8A51, 0xDBE1, + 0x8A52, 0xDBDF, 0x8A54, 0xB640, 0x8A55, 0xB5FB, 0x8A56, 0xB647, 0x8A57, 0xDBDB, 0x8A58, 0xDBDC, 0x8A59, 0xDBD9, 0x8A5B, 0xB641, + 0x8A5E, 0xB5FC, 0x8A60, 0xB5FA, 0x8A61, 0xE048, 0x8A62, 0xB8DF, 0x8A63, 0xB8DA, 0x8A66, 0xB8D5, 0x8A68, 0xB8E5, 0x8A69, 0xB8D6, + 0x8A6B, 0xB8D2, 0x8A6C, 0xB8E1, 0x8A6D, 0xB8DE, 0x8A6E, 0xB8E0, 0x8A70, 0xB8D7, 0x8A71, 0xB8DC, 0x8A72, 0xB8D3, 0x8A73, 0xB8D4, + 0x8A74, 0xE050, 0x8A75, 0xE04D, 0x8A76, 0xE045, 0x8A77, 0xE04A, 0x8A79, 0xB8E2, 0x8A7A, 0xE051, 0x8A7B, 0xB8E3, 0x8A7C, 0xB8D9, + 0x8A7F, 0xE047, 0x8A81, 0xE04F, 0x8A82, 0xE04B, 0x8A83, 0xE04E, 0x8A84, 0xE04C, 0x8A85, 0xB8DD, 0x8A86, 0xE046, 0x8A87, 0xB8D8, + 0x8A8B, 0xE44C, 0x8A8C, 0xBB78, 0x8A8D, 0xBB7B, 0x8A8F, 0xE44E, 0x8A91, 0xBBA5, 0x8A92, 0xE44D, 0x8A93, 0xBB7D, 0x8A95, 0xBDCF, + 0x8A96, 0xE44F, 0x8A98, 0xBBA4, 0x8A99, 0xE44B, 0x8A9A, 0xBBA6, 0x8A9E, 0xBB79, 0x8AA0, 0xB8DB, 0x8AA1, 0xBB7C, 0x8AA3, 0xBB7A, + 0x8AA4, 0xBB7E, 0x8AA5, 0xBBA2, 0x8AA6, 0xBB77, 0x8AA7, 0xBBA7, 0x8AA8, 0xBBA3, 0x8AAA, 0xBBA1, 0x8AAB, 0xE44A, 0x8AB0, 0xBDD6, + 0x8AB2, 0xBDD2, 0x8AB6, 0xBDD9, 0x8AB8, 0xE7D6, 0x8AB9, 0xBDDA, 0x8ABA, 0xE7E2, 0x8ABB, 0xE7DB, 0x8ABC, 0xBDCB, 0x8ABD, 0xE7E3, + 0x8ABE, 0xE7DD, 0x8ABF, 0xBDD5, 0x8AC0, 0xE7DE, 0x8AC2, 0xBDD4, 0x8AC3, 0xE7E1, 0x8AC4, 0xBDCE, 0x8AC5, 0xE7DF, 0x8AC6, 0xE7D5, + 0x8AC7, 0xBDCD, 0x8AC8, 0xEBAA, 0x8AC9, 0xBDD3, 0x8ACB, 0xBDD0, 0x8ACD, 0xBDD8, 0x8ACF, 0xE7D4, 0x8AD1, 0xE7D8, 0x8AD2, 0xBDCC, + 0x8AD3, 0xE7D7, 0x8AD4, 0xE7D9, 0x8AD5, 0xE7DA, 0x8AD6, 0xBDD7, 0x8AD7, 0xE7DC, 0x8AD8, 0xE7E0, 0x8AD9, 0xE7E4, 0x8ADB, 0xBDDB, + 0x8ADC, 0xBFD2, 0x8ADD, 0xEBA5, 0x8ADE, 0xEBAB, 0x8ADF, 0xEBA8, 0x8AE0, 0xEB7E, 0x8AE1, 0xEBAC, 0x8AE2, 0xEBA1, 0x8AE4, 0xEBA7, + 0x8AE6, 0xBFCD, 0x8AE7, 0xBFD3, 0x8AE8, 0xEBAD, 0x8AEB, 0xBFCF, 0x8AED, 0xBFD9, 0x8AEE, 0xBFD4, 0x8AEF, 0xEBAF, 0x8AF0, 0xEBA9, + 0x8AF1, 0xBFD0, 0x8AF2, 0xEBA2, 0x8AF3, 0xBFDA, 0x8AF4, 0xEBA3, 0x8AF5, 0xEBA4, 0x8AF6, 0xBFDB, 0x8AF7, 0xBFD8, 0x8AF8, 0xBDD1, + 0x8AFA, 0xBFCE, 0x8AFB, 0xEBB0, 0x8AFC, 0xBFDC, 0x8AFE, 0xBFD5, 0x8AFF, 0xEBAE, 0x8B00, 0xBFD1, 0x8B01, 0xBFD6, 0x8B02, 0xBFD7, + 0x8B04, 0xC1C3, 0x8B05, 0xEEA4, 0x8B06, 0xEEAD, 0x8B07, 0xEEAA, 0x8B08, 0xEEAC, 0x8B0A, 0xC1C0, 0x8B0B, 0xEEA5, 0x8B0D, 0xEEAB, + 0x8B0E, 0xC1BC, 0x8B0F, 0xEEA7, 0x8B10, 0xC1C4, 0x8B11, 0xEEA3, 0x8B12, 0xEEA8, 0x8B13, 0xEEAF, 0x8B14, 0xEBA6, 0x8B15, 0xEEA9, + 0x8B16, 0xEEA2, 0x8B17, 0xC1BD, 0x8B18, 0xEEA1, 0x8B19, 0xC1BE, 0x8B1A, 0xEEB0, 0x8B1B, 0xC1BF, 0x8B1C, 0xEEAE, 0x8B1D, 0xC1C2, + 0x8B1E, 0xEE7E, 0x8B20, 0xC1C1, 0x8B22, 0xEEA6, 0x8B23, 0xF0DC, 0x8B24, 0xF0EA, 0x8B25, 0xF0E5, 0x8B26, 0xF0E7, 0x8B27, 0xF0DB, + 0x8B28, 0xC2D3, 0x8B2A, 0xF0DA, 0x8B2B, 0xC2D6, 0x8B2C, 0xC2D5, 0x8B2E, 0xF0E9, 0x8B2F, 0xF0E1, 0x8B30, 0xF0DE, 0x8B31, 0xF0E4, + 0x8B33, 0xF0DD, 0x8B35, 0xF0DF, 0x8B36, 0xF0E8, 0x8B37, 0xF0E6, 0x8B39, 0xC2D4, 0x8B3A, 0xF0ED, 0x8B3B, 0xF0EB, 0x8B3C, 0xF0E2, + 0x8B3D, 0xF0EC, 0x8B3E, 0xF0E3, 0x8B40, 0xF2F9, 0x8B41, 0xC3CF, 0x8B42, 0xF341, 0x8B45, 0xF64F, 0x8B46, 0xC3D6, 0x8B47, 0xF0E0, + 0x8B48, 0xF2F7, 0x8B49, 0xC3D2, 0x8B4A, 0xF2F8, 0x8B4B, 0xF2FD, 0x8B4E, 0xC3D4, 0x8B4F, 0xC3D5, 0x8B50, 0xF2F6, 0x8B51, 0xF340, + 0x8B52, 0xF342, 0x8B53, 0xF2FA, 0x8B54, 0xF2FC, 0x8B55, 0xF2FE, 0x8B56, 0xF2FB, 0x8B57, 0xF343, 0x8B58, 0xC3D1, 0x8B59, 0xC3D7, + 0x8B5A, 0xC3D3, 0x8B5C, 0xC3D0, 0x8B5D, 0xF4D0, 0x8B5F, 0xC4B7, 0x8B60, 0xF4CE, 0x8B63, 0xF4D2, 0x8B65, 0xF4D3, 0x8B66, 0xC4B5, + 0x8B67, 0xF4D4, 0x8B68, 0xF4D1, 0x8B6A, 0xF4CF, 0x8B6B, 0xC4B8, 0x8B6C, 0xC4B4, 0x8B6D, 0xF4D5, 0x8B6F, 0xC4B6, 0x8B70, 0xC4B3, + 0x8B74, 0xC4FE, 0x8B77, 0xC540, 0x8B78, 0xF64E, 0x8B79, 0xF64D, 0x8B7A, 0xF650, 0x8B7B, 0xF651, 0x8B7D, 0xC541, 0x8B7E, 0xF756, + 0x8B7F, 0xF75B, 0x8B80, 0xC5AA, 0x8B82, 0xF758, 0x8B84, 0xF757, 0x8B85, 0xF75A, 0x8B86, 0xF759, 0x8B88, 0xF843, 0x8B8A, 0xC5DC, + 0x8B8B, 0xF842, 0x8B8C, 0xF840, 0x8B8E, 0xF841, 0x8B92, 0xC5FE, 0x8B93, 0xC5FD, 0x8B94, 0xF8C1, 0x8B95, 0xF8C2, 0x8B96, 0xC640, + 0x8B98, 0xF94D, 0x8B99, 0xF94E, 0x8B9A, 0xC667, 0x8B9C, 0xC66D, 0x8B9E, 0xF9A9, 0x8B9F, 0xF9C8, 0x8C37, 0xA8A6, 0x8C39, 0xD7CD, + 0x8C3B, 0xD7CE, 0x8C3C, 0xE052, 0x8C3D, 0xE450, 0x8C3E, 0xE7E5, 0x8C3F, 0xC1C6, 0x8C41, 0xC1C5, 0x8C42, 0xF0EE, 0x8C43, 0xF344, + 0x8C45, 0xF844, 0x8C46, 0xA8A7, 0x8C47, 0xD3DE, 0x8C48, 0xB05A, 0x8C49, 0xB361, 0x8C4A, 0xE054, 0x8C4B, 0xE053, 0x8C4C, 0xBDDC, + 0x8C4D, 0xE7E6, 0x8C4E, 0xBDDD, 0x8C4F, 0xEEB1, 0x8C50, 0xC2D7, 0x8C54, 0xC676, 0x8C55, 0xA8A8, 0x8C56, 0xCDCB, 0x8C57, 0xD3DF, + 0x8C5A, 0xB362, 0x8C5C, 0xD7CF, 0x8C5D, 0xD7D0, 0x8C5F, 0xDBE5, 0x8C61, 0xB648, 0x8C62, 0xB8E6, 0x8C64, 0xE056, 0x8C65, 0xE055, + 0x8C66, 0xE057, 0x8C68, 0xE451, 0x8C69, 0xE452, 0x8C6A, 0xBBA8, 0x8C6B, 0xBFDD, 0x8C6C, 0xBDDE, 0x8C6D, 0xBFDE, 0x8C6F, 0xEEB5, + 0x8C70, 0xEEB2, 0x8C71, 0xEEB4, 0x8C72, 0xEEB3, 0x8C73, 0xC1C7, 0x8C75, 0xF0EF, 0x8C76, 0xF346, 0x8C77, 0xF345, 0x8C78, 0xCBA4, + 0x8C79, 0xB05C, 0x8C7A, 0xB05B, 0x8C7B, 0xD3E0, 0x8C7D, 0xD7D1, 0x8C80, 0xDBE7, 0x8C81, 0xDBE6, 0x8C82, 0xB649, 0x8C84, 0xE059, + 0x8C85, 0xE05A, 0x8C86, 0xE058, 0x8C89, 0xB8E8, 0x8C8A, 0xB8E7, 0x8C8C, 0xBBAA, 0x8C8D, 0xBBA9, 0x8C8F, 0xE7E7, 0x8C90, 0xEBB3, + 0x8C91, 0xEBB1, 0x8C92, 0xEBB2, 0x8C93, 0xBFDF, 0x8C94, 0xEEB7, 0x8C95, 0xEEB6, 0x8C97, 0xF0F2, 0x8C98, 0xF0F1, 0x8C99, 0xF0F0, + 0x8C9A, 0xF347, 0x8C9C, 0xF9AA, 0x8C9D, 0xA8A9, 0x8C9E, 0xAD73, 0x8CA0, 0xAD74, 0x8CA1, 0xB05D, 0x8CA2, 0xB05E, 0x8CA3, 0xD3E2, + 0x8CA4, 0xD3E1, 0x8CA5, 0xD7D2, 0x8CA7, 0xB368, 0x8CA8, 0xB366, 0x8CA9, 0xB363, 0x8CAA, 0xB367, 0x8CAB, 0xB365, 0x8CAC, 0xB364, + 0x8CAF, 0xB64A, 0x8CB0, 0xDBEA, 0x8CB2, 0xB8ED, 0x8CB3, 0xB64C, 0x8CB4, 0xB651, 0x8CB5, 0xDBEC, 0x8CB6, 0xB653, 0x8CB7, 0xB652, + 0x8CB8, 0xB655, 0x8CB9, 0xDBEB, 0x8CBA, 0xDBE8, 0x8CBB, 0xB64F, 0x8CBC, 0xB64B, 0x8CBD, 0xB64D, 0x8CBE, 0xDBE9, 0x8CBF, 0xB654, + 0x8CC0, 0xB650, 0x8CC1, 0xB64E, 0x8CC2, 0xB8EF, 0x8CC3, 0xB8EE, 0x8CC4, 0xB8EC, 0x8CC5, 0xB8F0, 0x8CC7, 0xB8EA, 0x8CC8, 0xB8EB, + 0x8CCA, 0xB8E9, 0x8CCC, 0xE05B, 0x8CCF, 0xE454, 0x8CD1, 0xBBAC, 0x8CD2, 0xBBAD, 0x8CD3, 0xBBAB, 0x8CD5, 0xE453, 0x8CD7, 0xE455, + 0x8CD9, 0xE7EA, 0x8CDA, 0xE7EC, 0x8CDC, 0xBDE7, 0x8CDD, 0xE7ED, 0x8CDE, 0xBDE0, 0x8CDF, 0xE7E9, 0x8CE0, 0xBDDF, 0x8CE1, 0xBDE9, + 0x8CE2, 0xBDE5, 0x8CE3, 0xBDE6, 0x8CE4, 0xBDE2, 0x8CE5, 0xE7E8, 0x8CE6, 0xBDE1, 0x8CE7, 0xE7EE, 0x8CE8, 0xE7EB, 0x8CEA, 0xBDE8, + 0x8CEC, 0xBDE3, 0x8CED, 0xBDE4, 0x8CEE, 0xEBB5, 0x8CF0, 0xEBB7, 0x8CF1, 0xEBB6, 0x8CF3, 0xEBB8, 0x8CF4, 0xBFE0, 0x8CF5, 0xEBB4, + 0x8CF8, 0xC1CB, 0x8CF9, 0xEEB8, 0x8CFA, 0xC1C8, 0x8CFB, 0xC1CC, 0x8CFC, 0xC1CA, 0x8CFD, 0xC1C9, 0x8CFE, 0xF0F3, 0x8D00, 0xF0F6, + 0x8D02, 0xF0F5, 0x8D04, 0xF0F4, 0x8D05, 0xC2D8, 0x8D06, 0xF348, 0x8D07, 0xF349, 0x8D08, 0xC3D8, 0x8D09, 0xF34A, 0x8D0A, 0xC3D9, + 0x8D0D, 0xC4BA, 0x8D0F, 0xC4B9, 0x8D10, 0xF652, 0x8D13, 0xC542, 0x8D14, 0xF653, 0x8D15, 0xF75C, 0x8D16, 0xC5AB, 0x8D17, 0xC5AC, + 0x8D19, 0xF845, 0x8D1B, 0xC642, 0x8D64, 0xA8AA, 0x8D66, 0xB36A, 0x8D67, 0xB369, 0x8D68, 0xE05C, 0x8D69, 0xE05D, 0x8D6B, 0xBBAE, + 0x8D6C, 0xEBB9, 0x8D6D, 0xBDEA, 0x8D6E, 0xEBBA, 0x8D6F, 0xEEB9, 0x8D70, 0xA8AB, 0x8D72, 0xD0B2, 0x8D73, 0xAD76, 0x8D74, 0xAD75, + 0x8D76, 0xD3E3, 0x8D77, 0xB05F, 0x8D78, 0xD3E4, 0x8D79, 0xD7D5, 0x8D7B, 0xD7D4, 0x8D7D, 0xD7D3, 0x8D80, 0xDBEE, 0x8D81, 0xB658, + 0x8D84, 0xDBED, 0x8D85, 0xB657, 0x8D89, 0xDBEF, 0x8D8A, 0xB656, 0x8D8C, 0xE05F, 0x8D8D, 0xE062, 0x8D8E, 0xE060, 0x8D8F, 0xE061, + 0x8D90, 0xE065, 0x8D91, 0xE05E, 0x8D92, 0xE066, 0x8D93, 0xE063, 0x8D94, 0xE064, 0x8D95, 0xBBB0, 0x8D96, 0xE456, 0x8D99, 0xBBAF, + 0x8D9B, 0xE7F2, 0x8D9C, 0xE7F0, 0x8D9F, 0xBDEB, 0x8DA0, 0xE7EF, 0x8DA1, 0xE7F1, 0x8DA3, 0xBDEC, 0x8DA5, 0xEBBB, 0x8DA7, 0xEBBC, + 0x8DA8, 0xC1CD, 0x8DAA, 0xF34C, 0x8DAB, 0xF34E, 0x8DAC, 0xF34B, 0x8DAD, 0xF34D, 0x8DAE, 0xF4D6, 0x8DAF, 0xF654, 0x8DB2, 0xF96F, + 0x8DB3, 0xA8AC, 0x8DB4, 0xAD77, 0x8DB5, 0xD3E5, 0x8DB6, 0xD3E7, 0x8DB7, 0xD3E6, 0x8DB9, 0xD7D8, 0x8DBA, 0xB36C, 0x8DBC, 0xD7D6, + 0x8DBE, 0xB36B, 0x8DBF, 0xD7D9, 0x8DC1, 0xD7DA, 0x8DC2, 0xD7D7, 0x8DC5, 0xDBFB, 0x8DC6, 0xB660, 0x8DC7, 0xDBF3, 0x8DC8, 0xDBF9, + 0x8DCB, 0xB65B, 0x8DCC, 0xB65E, 0x8DCD, 0xDBF2, 0x8DCE, 0xB659, 0x8DCF, 0xDBF6, 0x8DD0, 0xE06C, 0x8DD1, 0xB65D, 0x8DD3, 0xDBF1, + 0x8DD5, 0xDBF7, 0x8DD6, 0xDBF4, 0x8DD7, 0xDBFA, 0x8DD8, 0xDBF0, 0x8DD9, 0xDBF8, 0x8DDA, 0xB65C, 0x8DDB, 0xB65F, 0x8DDC, 0xDBF5, + 0x8DDD, 0xB65A, 0x8DDF, 0xB8F2, 0x8DE0, 0xE068, 0x8DE1, 0xB8F1, 0x8DE2, 0xE06F, 0x8DE3, 0xE06E, 0x8DE4, 0xB8F8, 0x8DE6, 0xB8F9, + 0x8DE7, 0xE070, 0x8DE8, 0xB8F3, 0x8DE9, 0xE06D, 0x8DEA, 0xB8F7, 0x8DEB, 0xE072, 0x8DEC, 0xE069, 0x8DEE, 0xE06B, 0x8DEF, 0xB8F4, + 0x8DF0, 0xE067, 0x8DF1, 0xE06A, 0x8DF2, 0xE071, 0x8DF3, 0xB8F5, 0x8DF4, 0xE073, 0x8DFA, 0xB8F6, 0x8DFC, 0xBBB1, 0x8DFD, 0xE45B, + 0x8DFE, 0xE461, 0x8DFF, 0xE459, 0x8E00, 0xE462, 0x8E02, 0xE458, 0x8E03, 0xE45D, 0x8E04, 0xE463, 0x8E05, 0xE460, 0x8E06, 0xE45F, + 0x8E07, 0xE45E, 0x8E09, 0xE457, 0x8E0A, 0xE45C, 0x8E0D, 0xE45A, 0x8E0F, 0xBDF1, 0x8E10, 0xBDEE, 0x8E11, 0xE7FB, 0x8E12, 0xE841, + 0x8E13, 0xE843, 0x8E14, 0xE840, 0x8E15, 0xE7F8, 0x8E16, 0xE7FA, 0x8E17, 0xE845, 0x8E18, 0xE842, 0x8E19, 0xE7FC, 0x8E1A, 0xE846, + 0x8E1B, 0xE7F9, 0x8E1C, 0xE844, 0x8E1D, 0xBDEF, 0x8E1E, 0xBDF5, 0x8E1F, 0xBDF3, 0x8E20, 0xE7F3, 0x8E21, 0xBDF4, 0x8E22, 0xBDF0, + 0x8E23, 0xE7F4, 0x8E24, 0xE7F6, 0x8E25, 0xE7F5, 0x8E26, 0xE7FD, 0x8E27, 0xE7FE, 0x8E29, 0xBDF2, 0x8E2B, 0xBDED, 0x8E2E, 0xE7F7, + 0x8E30, 0xEBC6, 0x8E31, 0xBFE2, 0x8E33, 0xEBBD, 0x8E34, 0xBFE3, 0x8E35, 0xBFE6, 0x8E36, 0xEBC2, 0x8E38, 0xEBBF, 0x8E39, 0xBFE5, + 0x8E3C, 0xEBC3, 0x8E3D, 0xEBC4, 0x8E3E, 0xEBBE, 0x8E3F, 0xEBC7, 0x8E40, 0xEBC0, 0x8E41, 0xEBC5, 0x8E42, 0xBFE4, 0x8E44, 0xBFE1, + 0x8E45, 0xEBC1, 0x8E47, 0xEEBF, 0x8E48, 0xC1D0, 0x8E49, 0xC1CE, 0x8E4A, 0xC1D1, 0x8E4B, 0xC1CF, 0x8E4C, 0xEEBE, 0x8E4D, 0xEEBB, + 0x8E4E, 0xEEBA, 0x8E50, 0xEEBD, 0x8E53, 0xEEBC, 0x8E54, 0xF145, 0x8E55, 0xC2DE, 0x8E56, 0xF0FB, 0x8E57, 0xF0FA, 0x8E59, 0xC2D9, + 0x8E5A, 0xF141, 0x8E5B, 0xF140, 0x8E5C, 0xF0F7, 0x8E5D, 0xF143, 0x8E5E, 0xF0FC, 0x8E5F, 0xC2DD, 0x8E60, 0xF0F9, 0x8E61, 0xF142, + 0x8E62, 0xF0F8, 0x8E63, 0xC2DA, 0x8E64, 0xC2DC, 0x8E65, 0xF0FD, 0x8E66, 0xC2DB, 0x8E67, 0xF0FE, 0x8E69, 0xF144, 0x8E6A, 0xF352, + 0x8E6C, 0xC3DE, 0x8E6D, 0xF34F, 0x8E6F, 0xF353, 0x8E72, 0xC3DB, 0x8E73, 0xF351, 0x8E74, 0xC3E0, 0x8E76, 0xC3DD, 0x8E78, 0xF350, + 0x8E7A, 0xC3DF, 0x8E7B, 0xF354, 0x8E7C, 0xC3DA, 0x8E81, 0xC4BC, 0x8E82, 0xC4BE, 0x8E84, 0xF4D9, 0x8E85, 0xC4BD, 0x8E86, 0xF4D7, + 0x8E87, 0xC3DC, 0x8E88, 0xF4D8, 0x8E89, 0xC4BB, 0x8E8A, 0xC543, 0x8E8B, 0xC545, 0x8E8C, 0xF656, 0x8E8D, 0xC544, 0x8E8E, 0xF655, + 0x8E90, 0xF761, 0x8E91, 0xC5AD, 0x8E92, 0xF760, 0x8E93, 0xC5AE, 0x8E94, 0xF75E, 0x8E95, 0xF75D, 0x8E96, 0xF762, 0x8E97, 0xF763, + 0x8E98, 0xF846, 0x8E9A, 0xF75F, 0x8E9D, 0xF8C6, 0x8E9E, 0xF8C3, 0x8E9F, 0xF8C4, 0x8EA0, 0xF8C5, 0x8EA1, 0xC65C, 0x8EA3, 0xF951, + 0x8EA4, 0xF950, 0x8EA5, 0xF94F, 0x8EA6, 0xF970, 0x8EA8, 0xF9BE, 0x8EA9, 0xF9AB, 0x8EAA, 0xC66E, 0x8EAB, 0xA8AD, 0x8EAC, 0xB060, + 0x8EB2, 0xB8FA, 0x8EBA, 0xBDF6, 0x8EBD, 0xEBC8, 0x8EC0, 0xC2DF, 0x8EC2, 0xF355, 0x8EC9, 0xF9AC, 0x8ECA, 0xA8AE, 0x8ECB, 0xAAEE, + 0x8ECC, 0xAD79, 0x8ECD, 0xAD78, 0x8ECF, 0xB063, 0x8ED1, 0xD3E8, 0x8ED2, 0xB061, 0x8ED3, 0xD3E9, 0x8ED4, 0xB062, 0x8ED7, 0xD7DF, + 0x8ED8, 0xD7DB, 0x8EDB, 0xB36D, 0x8EDC, 0xD7DE, 0x8EDD, 0xD7DD, 0x8EDE, 0xD7DC, 0x8EDF, 0xB36E, 0x8EE0, 0xD7E0, 0x8EE1, 0xD7E1, + 0x8EE5, 0xDC43, 0x8EE6, 0xDC41, 0x8EE7, 0xDC45, 0x8EE8, 0xDC46, 0x8EE9, 0xDC4C, 0x8EEB, 0xDC48, 0x8EEC, 0xDC4A, 0x8EEE, 0xDC42, + 0x8EEF, 0xDBFC, 0x8EF1, 0xDC49, 0x8EF4, 0xDC4B, 0x8EF5, 0xDC44, 0x8EF6, 0xDC47, 0x8EF7, 0xDBFD, 0x8EF8, 0xB662, 0x8EF9, 0xDC40, + 0x8EFA, 0xDBFE, 0x8EFB, 0xB661, 0x8EFC, 0xB663, 0x8EFE, 0xB8FD, 0x8EFF, 0xE075, 0x8F00, 0xE077, 0x8F01, 0xE076, 0x8F02, 0xE07B, + 0x8F03, 0xB8FB, 0x8F05, 0xE078, 0x8F06, 0xE074, 0x8F07, 0xE079, 0x8F08, 0xE07A, 0x8F09, 0xB8FC, 0x8F0A, 0xB8FE, 0x8F0B, 0xE07C, + 0x8F0D, 0xE467, 0x8F0E, 0xE466, 0x8F10, 0xE464, 0x8F11, 0xE465, 0x8F12, 0xBBB3, 0x8F13, 0xBBB5, 0x8F14, 0xBBB2, 0x8F15, 0xBBB4, + 0x8F16, 0xE84D, 0x8F17, 0xE84E, 0x8F18, 0xE849, 0x8F1A, 0xE84A, 0x8F1B, 0xBDF8, 0x8F1C, 0xBDFD, 0x8F1D, 0xBDF7, 0x8F1E, 0xBDFE, + 0x8F1F, 0xBDF9, 0x8F20, 0xE84B, 0x8F23, 0xE84C, 0x8F24, 0xE848, 0x8F25, 0xBE40, 0x8F26, 0xBDFB, 0x8F29, 0xBDFA, 0x8F2A, 0xBDFC, + 0x8F2C, 0xE847, 0x8F2E, 0xEBCA, 0x8F2F, 0xBFE8, 0x8F32, 0xEBCC, 0x8F33, 0xBFEA, 0x8F34, 0xEBCF, 0x8F35, 0xEBCB, 0x8F36, 0xEBC9, + 0x8F37, 0xEBCE, 0x8F38, 0xBFE9, 0x8F39, 0xEBCD, 0x8F3B, 0xBFE7, 0x8F3E, 0xC1D3, 0x8F3F, 0xC1D6, 0x8F40, 0xEEC1, 0x8F42, 0xC1D4, + 0x8F43, 0xEEC0, 0x8F44, 0xC1D2, 0x8F45, 0xC1D5, 0x8F46, 0xF146, 0x8F47, 0xF147, 0x8F48, 0xF148, 0x8F49, 0xC2E0, 0x8F4B, 0xF149, + 0x8F4D, 0xC2E1, 0x8F4E, 0xC3E2, 0x8F4F, 0xF358, 0x8F50, 0xF359, 0x8F51, 0xF357, 0x8F52, 0xF356, 0x8F53, 0xF35A, 0x8F54, 0xC3E1, + 0x8F55, 0xF4DD, 0x8F56, 0xF4DB, 0x8F57, 0xF4DC, 0x8F58, 0xF4DE, 0x8F59, 0xF4DA, 0x8F5A, 0xF4DF, 0x8F5B, 0xF658, 0x8F5D, 0xF659, + 0x8F5E, 0xF657, 0x8F5F, 0xC546, 0x8F60, 0xF764, 0x8F61, 0xC5AF, 0x8F62, 0xF765, 0x8F63, 0xF848, 0x8F64, 0xF847, 0x8F9B, 0xA8AF, + 0x8F9C, 0xB664, 0x8F9F, 0xB940, 0x8FA3, 0xBBB6, 0x8FA6, 0xBFEC, 0x8FA8, 0xBFEB, 0x8FAD, 0xC3E3, 0x8FAE, 0xC47C, 0x8FAF, 0xC547, + 0x8FB0, 0xA8B0, 0x8FB1, 0xB064, 0x8FB2, 0xB941, 0x8FB4, 0xF35B, 0x8FBF, 0xCBA6, 0x8FC2, 0xA8B1, 0x8FC4, 0xA8B4, 0x8FC5, 0xA8B3, + 0x8FC6, 0xA8B2, 0x8FC9, 0xCBA5, 0x8FCB, 0xCDCD, 0x8FCD, 0xCDCF, 0x8FCE, 0xAAEF, 0x8FD1, 0xAAF1, 0x8FD2, 0xCDCC, 0x8FD3, 0xCDCE, + 0x8FD4, 0xAAF0, 0x8FD5, 0xCDD1, 0x8FD6, 0xCDD0, 0x8FD7, 0xCDD2, 0x8FE0, 0xD0B6, 0x8FE1, 0xD0B4, 0x8FE2, 0xAD7C, 0x8FE3, 0xD0B3, + 0x8FE4, 0xADA3, 0x8FE5, 0xAD7E, 0x8FE6, 0xAD7B, 0x8FE8, 0xADA4, 0x8FEA, 0xAD7D, 0x8FEB, 0xADA2, 0x8FED, 0xADA1, 0x8FEE, 0xD0B5, + 0x8FF0, 0xAD7A, 0x8FF4, 0xB06A, 0x8FF5, 0xD3EB, 0x8FF6, 0xD3F1, 0x8FF7, 0xB067, 0x8FF8, 0xB06E, 0x8FFA, 0xB069, 0x8FFB, 0xD3EE, + 0x8FFC, 0xD3F0, 0x8FFD, 0xB06C, 0x8FFE, 0xD3EA, 0x8FFF, 0xD3ED, 0x9000, 0xB068, 0x9001, 0xB065, 0x9002, 0xD3EC, 0x9003, 0xB06B, + 0x9004, 0xD3EF, 0x9005, 0xB06D, 0x9006, 0xB066, 0x900B, 0xD7E3, 0x900C, 0xD7E6, 0x900D, 0xB370, 0x900F, 0xB37A, 0x9010, 0xB376, + 0x9011, 0xD7E4, 0x9014, 0xB37E, 0x9015, 0xB377, 0x9016, 0xB37C, 0x9017, 0xB372, 0x9019, 0xB36F, 0x901A, 0xB371, 0x901B, 0xB37D, + 0x901C, 0xD7E5, 0x901D, 0xB375, 0x901E, 0xB378, 0x901F, 0xB374, 0x9020, 0xB379, 0x9021, 0xD7E7, 0x9022, 0xB37B, 0x9023, 0xB373, + 0x9024, 0xD7E2, 0x902D, 0xDC4D, 0x902E, 0xB665, 0x902F, 0xDC4F, 0x9031, 0xB667, 0x9032, 0xB669, 0x9034, 0xDC4E, 0x9035, 0xB666, + 0x9036, 0xB66A, 0x9038, 0xB668, 0x903C, 0xB947, 0x903D, 0xE0A3, 0x903E, 0xB94F, 0x903F, 0xE07E, 0x9041, 0xB950, 0x9042, 0xB945, + 0x9044, 0xE0A1, 0x9047, 0xB94A, 0x9049, 0xE0A2, 0x904A, 0xB943, 0x904B, 0xB942, 0x904D, 0xB94D, 0x904E, 0xB94C, 0x904F, 0xB94B, + 0x9050, 0xB949, 0x9051, 0xB94E, 0x9052, 0xE07D, 0x9053, 0xB944, 0x9054, 0xB946, 0x9055, 0xB948, 0x9058, 0xBBB8, 0x9059, 0xBBBB, + 0x905B, 0xBBBF, 0x905C, 0xBBB9, 0x905D, 0xBBBE, 0x905E, 0xBBBC, 0x9060, 0xBBB7, 0x9062, 0xBBBD, 0x9063, 0xBBBA, 0x9067, 0xE852, + 0x9068, 0xBE43, 0x9069, 0xBE41, 0x906B, 0xE853, 0x906D, 0xBE44, 0x906E, 0xBE42, 0x906F, 0xE851, 0x9070, 0xE850, 0x9072, 0xBFF0, + 0x9073, 0xE84F, 0x9074, 0xBFEE, 0x9075, 0xBFED, 0x9076, 0xEBD0, 0x9077, 0xBE45, 0x9078, 0xBFEF, 0x9079, 0xEBD1, 0x907A, 0xBFF2, + 0x907B, 0xEBD2, 0x907C, 0xBFF1, 0x907D, 0xC1D8, 0x907E, 0xEEC3, 0x907F, 0xC1D7, 0x9080, 0xC1DC, 0x9081, 0xC1DA, 0x9082, 0xC1DB, + 0x9083, 0xC2E3, 0x9084, 0xC1D9, 0x9085, 0xEEC2, 0x9086, 0xEBD3, 0x9087, 0xC2E2, 0x9088, 0xC2E4, 0x908A, 0xC3E4, 0x908B, 0xC3E5, + 0x908D, 0xF4E0, 0x908F, 0xC5DE, 0x9090, 0xC5DD, 0x9091, 0xA8B6, 0x9094, 0xCA55, 0x9095, 0xB06F, 0x9097, 0xCA52, 0x9098, 0xCA53, + 0x9099, 0xCA51, 0x909B, 0xCA54, 0x909E, 0xCBAA, 0x909F, 0xCBA7, 0x90A0, 0xCBAC, 0x90A1, 0xCBA8, 0x90A2, 0xA8B7, 0x90A3, 0xA8BA, + 0x90A5, 0xCBA9, 0x90A6, 0xA8B9, 0x90A7, 0xCBAB, 0x90AA, 0xA8B8, 0x90AF, 0xCDD5, 0x90B0, 0xCDD7, 0x90B1, 0xAAF4, 0x90B2, 0xCDD3, + 0x90B3, 0xCDD6, 0x90B4, 0xCDD4, 0x90B5, 0xAAF2, 0x90B6, 0xAAF5, 0x90B8, 0xAAF3, 0x90BD, 0xD0B8, 0x90BE, 0xD0BC, 0x90BF, 0xD0B9, + 0x90C1, 0xADA7, 0x90C3, 0xADA8, 0x90C5, 0xD0BB, 0x90C7, 0xD0BD, 0x90C8, 0xD0BF, 0x90CA, 0xADA5, 0x90CB, 0xD0BE, 0x90CE, 0xADA6, + 0x90D4, 0xD7EE, 0x90D5, 0xD0BA, 0x90D6, 0xD3F2, 0x90D7, 0xD3FB, 0x90D8, 0xD3F9, 0x90D9, 0xD3F4, 0x90DA, 0xD3F5, 0x90DB, 0xD3FA, + 0x90DC, 0xD3FC, 0x90DD, 0xB071, 0x90DF, 0xD3F7, 0x90E0, 0xD3F3, 0x90E1, 0xB070, 0x90E2, 0xB072, 0x90E3, 0xD3F6, 0x90E4, 0xD3FD, + 0x90E5, 0xD3F8, 0x90E8, 0xB3A1, 0x90E9, 0xD7F1, 0x90EA, 0xD7E9, 0x90EB, 0xD7EF, 0x90EC, 0xD7F0, 0x90ED, 0xB3A2, 0x90EF, 0xD7E8, + 0x90F0, 0xD7EA, 0x90F1, 0xD0B7, 0x90F2, 0xD7EC, 0x90F3, 0xD7ED, 0x90F4, 0xD7EB, 0x90F5, 0xB66C, 0x90F9, 0xDC56, 0x90FA, 0xEBD4, + 0x90FB, 0xDC57, 0x90FC, 0xDC54, 0x90FD, 0xB3A3, 0x90FE, 0xB66E, 0x90FF, 0xDC53, 0x9100, 0xDC59, 0x9101, 0xDC58, 0x9102, 0xB66B, + 0x9103, 0xDC5C, 0x9104, 0xDC52, 0x9105, 0xDC5B, 0x9106, 0xDC50, 0x9107, 0xDC5A, 0x9108, 0xDC55, 0x9109, 0xB66D, 0x910B, 0xE0AA, + 0x910D, 0xE0A5, 0x910E, 0xE0AB, 0x910F, 0xE0A6, 0x9110, 0xE0A4, 0x9111, 0xE0A7, 0x9112, 0xB951, 0x9114, 0xE0A9, 0x9116, 0xE0A8, + 0x9117, 0xB952, 0x9118, 0xBBC1, 0x9119, 0xBBC0, 0x911A, 0xE46E, 0x911B, 0xE471, 0x911C, 0xE469, 0x911D, 0xE46D, 0x911E, 0xBBC2, + 0x911F, 0xE46C, 0x9120, 0xE46A, 0x9121, 0xE470, 0x9122, 0xE46B, 0x9123, 0xE468, 0x9124, 0xE46F, 0x9126, 0xE859, 0x9127, 0xBE48, + 0x9128, 0xF14A, 0x9129, 0xE856, 0x912A, 0xE857, 0x912B, 0xE855, 0x912C, 0xDC51, 0x912D, 0xBE47, 0x912E, 0xE85A, 0x912F, 0xE854, + 0x9130, 0xBE46, 0x9131, 0xBE49, 0x9132, 0xE858, 0x9133, 0xEBD5, 0x9134, 0xBFF3, 0x9135, 0xEBD6, 0x9136, 0xEBD7, 0x9138, 0xEEC4, + 0x9139, 0xC1DD, 0x913A, 0xF14B, 0x913B, 0xF14C, 0x913E, 0xF14D, 0x913F, 0xF35D, 0x9140, 0xF35C, 0x9141, 0xF4E2, 0x9143, 0xF4E1, + 0x9144, 0xF65B, 0x9145, 0xF65C, 0x9146, 0xF65A, 0x9147, 0xF766, 0x9148, 0xC5B0, 0x9149, 0xA8BB, 0x914A, 0xADAA, 0x914B, 0xADA9, + 0x914C, 0xB075, 0x914D, 0xB074, 0x914E, 0xD440, 0x914F, 0xD441, 0x9150, 0xD3FE, 0x9152, 0xB073, 0x9153, 0xD7F5, 0x9155, 0xD7F6, + 0x9156, 0xD7F2, 0x9157, 0xB3A4, 0x9158, 0xD7F3, 0x915A, 0xD7F4, 0x915F, 0xDC5F, 0x9160, 0xDC61, 0x9161, 0xDC5D, 0x9162, 0xDC60, + 0x9163, 0xB66F, 0x9164, 0xDC5E, 0x9165, 0xB670, 0x9168, 0xDD73, 0x9169, 0xB955, 0x916A, 0xB954, 0x916C, 0xB953, 0x916E, 0xE0AC, + 0x916F, 0xE0AD, 0x9172, 0xE473, 0x9173, 0xE475, 0x9174, 0xBBC6, 0x9175, 0xBBC3, 0x9177, 0xBBC5, 0x9178, 0xBBC4, 0x9179, 0xE474, + 0x917A, 0xE472, 0x9180, 0xE861, 0x9181, 0xE85E, 0x9182, 0xE85F, 0x9183, 0xBE4D, 0x9184, 0xE860, 0x9185, 0xE85B, 0x9186, 0xE85C, + 0x9187, 0xBE4A, 0x9189, 0xBE4B, 0x918A, 0xE85D, 0x918B, 0xBE4C, 0x918D, 0xEBDB, 0x918F, 0xEBDC, 0x9190, 0xEBD9, 0x9191, 0xEBDA, + 0x9192, 0xBFF4, 0x9193, 0xEBD8, 0x9199, 0xEEC8, 0x919A, 0xEEC5, 0x919B, 0xEEC7, 0x919C, 0xC1E0, 0x919D, 0xEECB, 0x919E, 0xC1DF, + 0x919F, 0xEEC9, 0x91A0, 0xEECC, 0x91A1, 0xEECA, 0x91A2, 0xEEC6, 0x91A3, 0xC1DE, 0x91A5, 0xF14F, 0x91A7, 0xF150, 0x91A8, 0xF14E, + 0x91AA, 0xF152, 0x91AB, 0xC2E5, 0x91AC, 0xC2E6, 0x91AD, 0xF35F, 0x91AE, 0xC3E7, 0x91AF, 0xF151, 0x91B0, 0xF35E, 0x91B1, 0xC3E6, + 0x91B2, 0xF4E5, 0x91B3, 0xF4E6, 0x91B4, 0xC4BF, 0x91B5, 0xF4E4, 0x91B7, 0xF4E3, 0x91B9, 0xF65D, 0x91BA, 0xC548, 0x91BC, 0xF849, + 0x91BD, 0xF8C8, 0x91BE, 0xF8C7, 0x91C0, 0xC643, 0x91C1, 0xC65D, 0x91C2, 0xF8C9, 0x91C3, 0xF971, 0x91C5, 0xC66F, 0x91C6, 0xA8BC, + 0x91C7, 0xAAF6, 0x91C9, 0xB956, 0x91CB, 0xC4C0, 0x91CC, 0xA8BD, 0x91CD, 0xADAB, 0x91CE, 0xB3A5, 0x91CF, 0xB671, 0x91D0, 0xC2E7, + 0x91D1, 0xAAF7, 0x91D3, 0xD0C1, 0x91D4, 0xD0C0, 0x91D5, 0xD442, 0x91D7, 0xB078, 0x91D8, 0xB076, 0x91D9, 0xB07A, 0x91DA, 0xD444, + 0x91DC, 0xB079, 0x91DD, 0xB077, 0x91E2, 0xD443, 0x91E3, 0xB3A8, 0x91E4, 0xD7FC, 0x91E6, 0xB3A7, 0x91E7, 0xB3A9, 0x91E8, 0xD842, + 0x91E9, 0xB3AB, 0x91EA, 0xD7FE, 0x91EB, 0xD840, 0x91EC, 0xD7F7, 0x91ED, 0xB3AA, 0x91EE, 0xD843, 0x91F1, 0xD7F9, 0x91F3, 0xD7FA, + 0x91F4, 0xD7F8, 0x91F5, 0xB3A6, 0x91F7, 0xD841, 0x91F8, 0xD7FB, 0x91F9, 0xD7FD, 0x91FD, 0xDC6D, 0x91FF, 0xDC6C, 0x9200, 0xDC6A, + 0x9201, 0xDC62, 0x9202, 0xDC71, 0x9203, 0xDC65, 0x9204, 0xDC6F, 0x9205, 0xDC76, 0x9206, 0xDC6E, 0x9207, 0xB679, 0x9209, 0xB675, + 0x920A, 0xDC63, 0x920C, 0xDC69, 0x920D, 0xB677, 0x920F, 0xDC68, 0x9210, 0xB678, 0x9211, 0xB67A, 0x9212, 0xDC6B, 0x9214, 0xB672, + 0x9215, 0xB673, 0x9216, 0xDC77, 0x9217, 0xDC75, 0x9219, 0xDC74, 0x921A, 0xDC66, 0x921C, 0xDC72, 0x921E, 0xB676, 0x9223, 0xB674, + 0x9224, 0xDC73, 0x9225, 0xDC64, 0x9226, 0xDC67, 0x9227, 0xDC70, 0x922D, 0xE4BA, 0x922E, 0xE0B7, 0x9230, 0xE0B0, 0x9231, 0xE0C3, + 0x9232, 0xE0CC, 0x9233, 0xE0B3, 0x9234, 0xB961, 0x9236, 0xE0C0, 0x9237, 0xB957, 0x9238, 0xB959, 0x9239, 0xB965, 0x923A, 0xE0B1, + 0x923D, 0xB95A, 0x923E, 0xB95C, 0x923F, 0xB966, 0x9240, 0xB95B, 0x9245, 0xB964, 0x9246, 0xE0B9, 0x9248, 0xE0AE, 0x9249, 0xB962, + 0x924A, 0xE0B8, 0x924B, 0xB95E, 0x924C, 0xE0CA, 0x924D, 0xB963, 0x924E, 0xE0C8, 0x924F, 0xE0BC, 0x9250, 0xE0C6, 0x9251, 0xB960, + 0x9252, 0xE0AF, 0x9253, 0xE0C9, 0x9254, 0xE0C4, 0x9256, 0xE0CB, 0x9257, 0xB958, 0x925A, 0xB967, 0x925B, 0xB95D, 0x925E, 0xE0B5, + 0x9260, 0xE0BD, 0x9261, 0xE0C1, 0x9263, 0xE0C5, 0x9264, 0xB95F, 0x9265, 0xE0B4, 0x9266, 0xE0B2, 0x9267, 0xE0BE, 0x926C, 0xE0BB, + 0x926D, 0xE0BA, 0x926F, 0xE0BF, 0x9270, 0xE0C2, 0x9272, 0xE0C7, 0x9276, 0xE478, 0x9278, 0xBBC7, 0x9279, 0xE4A4, 0x927A, 0xE47A, + 0x927B, 0xBBCC, 0x927C, 0xBBD0, 0x927D, 0xE4AD, 0x927E, 0xE4B5, 0x927F, 0xE4A6, 0x9280, 0xBBC8, 0x9282, 0xE4AA, 0x9283, 0xE0B6, + 0x9285, 0xBBC9, 0x9286, 0xE4B1, 0x9287, 0xE4B6, 0x9288, 0xE4AE, 0x928A, 0xE4B0, 0x928B, 0xE4B9, 0x928C, 0xE4B2, 0x928D, 0xE47E, + 0x928E, 0xE4A9, 0x9291, 0xBBD1, 0x9293, 0xBBCD, 0x9294, 0xE47C, 0x9295, 0xE4AB, 0x9296, 0xBBCB, 0x9297, 0xE4A5, 0x9298, 0xBBCA, + 0x9299, 0xE4B3, 0x929A, 0xE4A2, 0x929B, 0xE479, 0x929C, 0xBBCE, 0x929D, 0xE4B8, 0x92A0, 0xE47B, 0x92A1, 0xE4AF, 0x92A2, 0xE4AC, + 0x92A3, 0xE4A7, 0x92A4, 0xE477, 0x92A5, 0xE476, 0x92A6, 0xE4A1, 0x92A7, 0xE4B4, 0x92A8, 0xBBCF, 0x92A9, 0xE4B7, 0x92AA, 0xE47D, + 0x92AB, 0xE4A3, 0x92AC, 0xBE52, 0x92B2, 0xBE5A, 0x92B3, 0xBE55, 0x92B4, 0xE8A4, 0x92B5, 0xE8A1, 0x92B6, 0xE867, 0x92B7, 0xBE50, + 0x92B9, 0xF9D7, 0x92BB, 0xBE4F, 0x92BC, 0xBE56, 0x92C0, 0xE865, 0x92C1, 0xBE54, 0x92C2, 0xE871, 0x92C3, 0xE863, 0x92C4, 0xE864, + 0x92C5, 0xBE4E, 0x92C6, 0xE8A3, 0x92C7, 0xBE58, 0x92C8, 0xE874, 0x92C9, 0xE879, 0x92CA, 0xE873, 0x92CB, 0xEBEE, 0x92CC, 0xE86F, + 0x92CD, 0xE877, 0x92CE, 0xE875, 0x92CF, 0xE868, 0x92D0, 0xE862, 0x92D1, 0xE87D, 0x92D2, 0xBE57, 0x92D3, 0xE87E, 0x92D5, 0xE878, + 0x92D7, 0xE86D, 0x92D8, 0xE86B, 0x92D9, 0xE866, 0x92DD, 0xE86E, 0x92DE, 0xE87B, 0x92DF, 0xE86A, 0x92E0, 0xE87A, 0x92E1, 0xE8A2, + 0x92E4, 0xBE53, 0x92E6, 0xE876, 0x92E7, 0xE87C, 0x92E8, 0xE872, 0x92E9, 0xE86C, 0x92EA, 0xBE51, 0x92EE, 0xE4A8, 0x92EF, 0xE870, + 0x92F0, 0xBE59, 0x92F1, 0xE869, 0x92F7, 0xEBF4, 0x92F8, 0xBFF7, 0x92F9, 0xEBF3, 0x92FA, 0xEBF0, 0x92FB, 0xEC44, 0x92FC, 0xBFFB, + 0x92FE, 0xEC41, 0x92FF, 0xEBF8, 0x9300, 0xEC43, 0x9301, 0xEBE9, 0x9302, 0xEBF6, 0x9304, 0xBFFD, 0x9306, 0xEBE1, 0x9308, 0xEBDF, + 0x9309, 0xEC42, 0x930B, 0xEC40, 0x930C, 0xEBFE, 0x930D, 0xEBED, 0x930E, 0xEBEC, 0x930F, 0xEBE2, 0x9310, 0xC040, 0x9312, 0xEBE8, + 0x9313, 0xEBF2, 0x9314, 0xEBFD, 0x9315, 0xC043, 0x9316, 0xEC45, 0x9318, 0xC1E8, 0x9319, 0xC045, 0x931A, 0xBFFE, 0x931B, 0xEBE6, + 0x931D, 0xEBEF, 0x931E, 0xEBDE, 0x931F, 0xEBE0, 0x9320, 0xBFF5, 0x9321, 0xC042, 0x9322, 0xBFFA, 0x9323, 0xEBE7, 0x9324, 0xEBF7, + 0x9325, 0xEBF1, 0x9326, 0xC041, 0x9327, 0xEBDD, 0x9328, 0xC1E3, 0x9329, 0xEBF9, 0x932A, 0xEBFC, 0x932B, 0xBFFC, 0x932D, 0xEBEB, + 0x932E, 0xC044, 0x932F, 0xBFF9, 0x9333, 0xBFF8, 0x9334, 0xEBF5, 0x9335, 0xEBFB, 0x9336, 0xBFF6, 0x9338, 0xEBE4, 0x9339, 0xEBFA, + 0x933C, 0xEBE5, 0x9346, 0xEBEA, 0x9347, 0xEED2, 0x9349, 0xEED7, 0x934A, 0xC1E5, 0x934B, 0xC1E7, 0x934C, 0xEEDD, 0x934D, 0xC1E1, + 0x934E, 0xEEEC, 0x934F, 0xEEE3, 0x9350, 0xEED8, 0x9351, 0xEED9, 0x9352, 0xEEE2, 0x9354, 0xC1EE, 0x9355, 0xEEE1, 0x9356, 0xEED1, + 0x9357, 0xEEE0, 0x9358, 0xEED4, 0x9359, 0xEEED, 0x935A, 0xC1ED, 0x935B, 0xC1EB, 0x935C, 0xEED5, 0x935E, 0xEEE8, 0x9360, 0xEEDA, + 0x9361, 0xEEE7, 0x9363, 0xEEE9, 0x9364, 0xEED0, 0x9365, 0xC1E6, 0x9367, 0xEEEA, 0x936A, 0xEEDE, 0x936C, 0xC1EA, 0x936D, 0xEEDB, + 0x9370, 0xC1EC, 0x9371, 0xEEE4, 0x9375, 0xC1E4, 0x9376, 0xEED6, 0x9377, 0xEEE5, 0x9379, 0xEEDF, 0x937A, 0xEBE3, 0x937B, 0xEEE6, + 0x937C, 0xEED3, 0x937E, 0xC1E9, 0x9380, 0xEEEB, 0x9382, 0xC1E2, 0x9383, 0xEECE, 0x9388, 0xF160, 0x9389, 0xF159, 0x938A, 0xC2E9, + 0x938C, 0xF154, 0x938D, 0xF163, 0x938E, 0xF15B, 0x938F, 0xEEDC, 0x9391, 0xF165, 0x9392, 0xF155, 0x9394, 0xC2E8, 0x9395, 0xF15F, + 0x9396, 0xC2EA, 0x9397, 0xC2F2, 0x9398, 0xC2F0, 0x9399, 0xF161, 0x939A, 0xC2F1, 0x939B, 0xF157, 0x939D, 0xF158, 0x939E, 0xF15D, + 0x939F, 0xF162, 0x93A1, 0xEECD, 0x93A2, 0xC2EB, 0x93A3, 0xF16A, 0x93A4, 0xF167, 0x93A5, 0xF16B, 0x93A6, 0xF15E, 0x93A7, 0xF15A, + 0x93A8, 0xF168, 0x93A9, 0xF36A, 0x93AA, 0xF15C, 0x93AC, 0xC2EE, 0x93AE, 0xC2ED, 0x93AF, 0xEECF, 0x93B0, 0xC2EF, 0x93B1, 0xF164, + 0x93B2, 0xF166, 0x93B3, 0xC2EC, 0x93B4, 0xF169, 0x93B5, 0xF153, 0x93B7, 0xF156, 0x93C0, 0xF373, 0x93C2, 0xF363, 0x93C3, 0xC3EB, + 0x93C4, 0xF371, 0x93C7, 0xF361, 0x93C8, 0xC3EC, 0x93CA, 0xF36C, 0x93CC, 0xF368, 0x93CD, 0xC3F1, 0x93CE, 0xF372, 0x93CF, 0xF362, + 0x93D0, 0xF365, 0x93D1, 0xC3E9, 0x93D2, 0xF374, 0x93D4, 0xF36D, 0x93D5, 0xF370, 0x93D6, 0xC3EF, 0x93D7, 0xC3F4, 0x93D8, 0xC3F2, + 0x93D9, 0xF369, 0x93DA, 0xF364, 0x93DC, 0xC3ED, 0x93DD, 0xC3EE, 0x93DE, 0xF360, 0x93DF, 0xC3EA, 0x93E1, 0xC3E8, 0x93E2, 0xC3F0, + 0x93E3, 0xF36F, 0x93E4, 0xC3F3, 0x93E6, 0xF36B, 0x93E7, 0xF375, 0x93E8, 0xC3F5, 0x93EC, 0xF367, 0x93EE, 0xF36E, 0x93F5, 0xF4F3, + 0x93F6, 0xF542, 0x93F7, 0xF4F5, 0x93F8, 0xF4FC, 0x93F9, 0xF366, 0x93FA, 0xF4FA, 0x93FB, 0xF4E9, 0x93FC, 0xF540, 0x93FD, 0xC4C3, + 0x93FE, 0xF4ED, 0x93FF, 0xF4FE, 0x9400, 0xF4F4, 0x9403, 0xC4C2, 0x9406, 0xF544, 0x9407, 0xF4F6, 0x9409, 0xF4FB, 0x940A, 0xF4FD, + 0x940B, 0xF4E7, 0x940C, 0xF541, 0x940D, 0xF4F2, 0x940E, 0xF4F7, 0x940F, 0xF4EB, 0x9410, 0xF4EF, 0x9411, 0xF543, 0x9412, 0xF4F9, + 0x9413, 0xF4E8, 0x9414, 0xF4EC, 0x9415, 0xF4EE, 0x9416, 0xF4F8, 0x9418, 0xC4C1, 0x9419, 0xF4F1, 0x9420, 0xF4EA, 0x9428, 0xF4F0, + 0x9429, 0xF661, 0x942A, 0xF666, 0x942B, 0xC54F, 0x942C, 0xF668, 0x942E, 0xC549, 0x9430, 0xF664, 0x9431, 0xF66A, 0x9432, 0xC54E, + 0x9433, 0xC54A, 0x9435, 0xC54B, 0x9436, 0xF660, 0x9437, 0xF667, 0x9438, 0xC54D, 0x9439, 0xF665, 0x943A, 0xC54C, 0x943B, 0xF65F, + 0x943C, 0xF663, 0x943D, 0xF662, 0x943F, 0xF65E, 0x9440, 0xF669, 0x9444, 0xC5B1, 0x9445, 0xF76D, 0x9446, 0xF770, 0x9447, 0xF76C, + 0x9448, 0xF76E, 0x9449, 0xF76F, 0x944A, 0xF769, 0x944B, 0xF76A, 0x944C, 0xF767, 0x944F, 0xF76B, 0x9450, 0xF768, 0x9451, 0xC5B2, + 0x9452, 0xC5B3, 0x9455, 0xF84B, 0x9457, 0xF84D, 0x945D, 0xF84C, 0x945E, 0xF84E, 0x9460, 0xC5E0, 0x9462, 0xF84A, 0x9463, 0xC5DF, + 0x9464, 0xC5E1, 0x9468, 0xF8CB, 0x9469, 0xF8CC, 0x946A, 0xC644, 0x946B, 0xF8CA, 0x946D, 0xF953, 0x946E, 0xF952, 0x946F, 0xF954, + 0x9470, 0xC65F, 0x9471, 0xF955, 0x9472, 0xC65E, 0x9473, 0xF956, 0x9474, 0xF972, 0x9475, 0xF975, 0x9476, 0xF974, 0x9477, 0xC668, + 0x9478, 0xF973, 0x947C, 0xC672, 0x947D, 0xC670, 0x947E, 0xC671, 0x947F, 0xC677, 0x9480, 0xF9C0, 0x9481, 0xF9C1, 0x9482, 0xF9BF, + 0x9483, 0xF9C9, 0x9577, 0xAAF8, 0x957A, 0xD844, 0x957B, 0xDC78, 0x957C, 0xE8A5, 0x957D, 0xF376, 0x9580, 0xAAF9, 0x9582, 0xADAC, + 0x9583, 0xB07B, 0x9586, 0xD845, 0x9588, 0xD846, 0x9589, 0xB3AC, 0x958B, 0xB67D, 0x958C, 0xDC7A, 0x958D, 0xDC79, 0x958E, 0xB6A3, + 0x958F, 0xB67C, 0x9590, 0xDC7B, 0x9591, 0xB67E, 0x9592, 0xB6A2, 0x9593, 0xB6A1, 0x9594, 0xB67B, 0x9598, 0xB968, 0x959B, 0xE0D0, + 0x959C, 0xE0CE, 0x959E, 0xE0CF, 0x959F, 0xE0CD, 0x95A1, 0xBBD2, 0x95A3, 0xBBD5, 0x95A4, 0xBBD7, 0x95A5, 0xBBD6, 0x95A8, 0xBBD3, + 0x95A9, 0xBBD4, 0x95AB, 0xE8A7, 0x95AC, 0xE8A6, 0x95AD, 0xBE5B, 0x95AE, 0xE8A8, 0x95B0, 0xE8A9, 0x95B1, 0xBE5C, 0x95B5, 0xEC4D, + 0x95B6, 0xEC4B, 0x95B7, 0xEEF3, 0x95B9, 0xEC49, 0x95BA, 0xEC4A, 0x95BB, 0xC046, 0x95BC, 0xEC46, 0x95BD, 0xEC4E, 0x95BE, 0xEC48, + 0x95BF, 0xEC4C, 0x95C0, 0xEEEF, 0x95C3, 0xEEF1, 0x95C5, 0xEEF2, 0x95C6, 0xC1F3, 0x95C7, 0xEEEE, 0x95C8, 0xC1F2, 0x95C9, 0xEEF0, + 0x95CA, 0xC1EF, 0x95CB, 0xC1F0, 0x95CC, 0xC1F1, 0x95CD, 0xEC47, 0x95D0, 0xC2F5, 0x95D1, 0xF16E, 0x95D2, 0xF16C, 0x95D3, 0xF16D, + 0x95D4, 0xC2F3, 0x95D5, 0xC2F6, 0x95D6, 0xC2F4, 0x95DA, 0xF377, 0x95DB, 0xF378, 0x95DC, 0xC3F6, 0x95DE, 0xF545, 0x95DF, 0xF547, + 0x95E0, 0xF546, 0x95E1, 0xC4C4, 0x95E2, 0xC550, 0x95E3, 0xF66D, 0x95E4, 0xF66C, 0x95E5, 0xF66B, 0x961C, 0xAAFA, 0x961E, 0xC9AA, + 0x9620, 0xCA58, 0x9621, 0xA6E9, 0x9622, 0xCA56, 0x9623, 0xCA59, 0x9624, 0xCA57, 0x9628, 0xCBAE, 0x962A, 0xA8C1, 0x962C, 0xA8C2, + 0x962D, 0xCBB0, 0x962E, 0xA8BF, 0x962F, 0xCBAF, 0x9630, 0xCBAD, 0x9631, 0xA8C0, 0x9632, 0xA8BE, 0x9639, 0xCDD8, 0x963A, 0xCDDB, + 0x963B, 0xAAFD, 0x963C, 0xCDDA, 0x963D, 0xCDD9, 0x963F, 0xAAFC, 0x9640, 0xAAFB, 0x9642, 0xAB40, 0x9643, 0xCDDC, 0x9644, 0xAAFE, + 0x964A, 0xD0C6, 0x964B, 0xADAE, 0x964C, 0xADAF, 0x964D, 0xADB0, 0x964E, 0xD0C7, 0x964F, 0xD0C3, 0x9650, 0xADAD, 0x9651, 0xD0C4, + 0x9653, 0xD0C5, 0x9654, 0xD0C2, 0x9658, 0xB0A4, 0x965B, 0xB0A1, 0x965C, 0xD445, 0x965D, 0xB0A2, 0x965E, 0xB0A5, 0x965F, 0xD446, + 0x9661, 0xB07E, 0x9662, 0xB07C, 0x9663, 0xB07D, 0x9664, 0xB0A3, 0x966A, 0xB3AD, 0x966B, 0xD849, 0x966C, 0xB3B5, 0x966D, 0xD848, + 0x966F, 0xD84B, 0x9670, 0xB3B1, 0x9671, 0xD84A, 0x9672, 0xB6AB, 0x9673, 0xB3AF, 0x9674, 0xB3B2, 0x9675, 0xB3AE, 0x9676, 0xB3B3, + 0x9677, 0xB3B4, 0x9678, 0xB3B0, 0x967C, 0xD847, 0x967D, 0xB6A7, 0x967E, 0xDC7D, 0x9680, 0xDCA3, 0x9683, 0xDCA2, 0x9684, 0xB6AC, + 0x9685, 0xB6A8, 0x9686, 0xB6A9, 0x9687, 0xDC7C, 0x9688, 0xDC7E, 0x9689, 0xDCA1, 0x968A, 0xB6A4, 0x968B, 0xB6A6, 0x968D, 0xB6AA, + 0x968E, 0xB6A5, 0x9691, 0xE0D3, 0x9692, 0xE0D1, 0x9693, 0xE0D2, 0x9694, 0xB96A, 0x9695, 0xB96B, 0x9697, 0xE0D4, 0x9698, 0xB969, + 0x9699, 0xBBD8, 0x969B, 0xBBDA, 0x969C, 0xBBD9, 0x969E, 0xE4BB, 0x96A1, 0xE4BC, 0x96A2, 0xE8AB, 0x96A4, 0xE8AA, 0x96A7, 0xC047, + 0x96A8, 0xC048, 0x96A9, 0xEC4F, 0x96AA, 0xC049, 0x96AC, 0xEEF6, 0x96AE, 0xEEF4, 0x96B0, 0xEEF5, 0x96B1, 0xC1F4, 0x96B3, 0xF16F, + 0x96B4, 0xC3F7, 0x96B8, 0xC1F5, 0x96B9, 0xAB41, 0x96BB, 0xB0A6, 0x96BC, 0xD447, 0x96BF, 0xD84C, 0x96C0, 0xB3B6, 0x96C1, 0xB6AD, + 0x96C2, 0xDCA4, 0x96C3, 0xDCA6, 0x96C4, 0xB6AF, 0x96C5, 0xB6AE, 0x96C6, 0xB6B0, 0x96C7, 0xB6B1, 0x96C8, 0xDCA5, 0x96C9, 0xB96E, + 0x96CA, 0xB96F, 0x96CB, 0xB96D, 0x96CC, 0xBBDB, 0x96CD, 0xB96C, 0x96CE, 0xE0D5, 0x96D2, 0xBBDC, 0x96D3, 0xE8AC, 0x96D4, 0xEC50, + 0x96D5, 0xC04A, 0x96D6, 0xC1F6, 0x96D7, 0xF170, 0x96D8, 0xF174, 0x96D9, 0xC2F9, 0x96DA, 0xF171, 0x96DB, 0xC2FA, 0x96DC, 0xC2F8, + 0x96DD, 0xF175, 0x96DE, 0xC2FB, 0x96DF, 0xF173, 0x96E1, 0xF379, 0x96E2, 0xC2F7, 0x96E3, 0xC3F8, 0x96E5, 0xF8CD, 0x96E8, 0xAB42, + 0x96E9, 0xB3B8, 0x96EA, 0xB3B7, 0x96EF, 0xB6B2, 0x96F0, 0xDCA8, 0x96F1, 0xDCA7, 0x96F2, 0xB6B3, 0x96F5, 0xE0D9, 0x96F6, 0xB973, + 0x96F7, 0xB970, 0x96F8, 0xE0D8, 0x96F9, 0xB972, 0x96FA, 0xE0D6, 0x96FB, 0xB971, 0x96FD, 0xE0D7, 0x96FF, 0xE4BD, 0x9700, 0xBBDD, + 0x9702, 0xE8AF, 0x9704, 0xBE5D, 0x9705, 0xE8AD, 0x9706, 0xBE5E, 0x9707, 0xBE5F, 0x9708, 0xE8AE, 0x9709, 0xBE60, 0x970B, 0xEC51, + 0x970D, 0xC04E, 0x970E, 0xC04B, 0x970F, 0xC050, 0x9710, 0xEC53, 0x9711, 0xC04C, 0x9712, 0xEC52, 0x9713, 0xC04F, 0x9716, 0xC04D, + 0x9718, 0xEEF9, 0x9719, 0xEEFB, 0x971C, 0xC1F7, 0x971D, 0xEEFA, 0x971E, 0xC1F8, 0x971F, 0xEEF8, 0x9720, 0xEEF7, 0x9722, 0xF177, + 0x9723, 0xF176, 0x9724, 0xC2FC, 0x9725, 0xF178, 0x9726, 0xF37E, 0x9727, 0xC3FA, 0x9728, 0xF37D, 0x9729, 0xF37A, 0x972A, 0xC3F9, + 0x972B, 0xF37B, 0x972C, 0xF37C, 0x972E, 0xF548, 0x972F, 0xF549, 0x9730, 0xC4C5, 0x9732, 0xC553, 0x9735, 0xF66E, 0x9738, 0xC551, + 0x9739, 0xC552, 0x973A, 0xF66F, 0x973D, 0xC5B4, 0x973E, 0xC5B5, 0x973F, 0xF771, 0x9742, 0xC645, 0x9743, 0xF8CF, 0x9744, 0xC647, + 0x9746, 0xF8CE, 0x9747, 0xF8D0, 0x9748, 0xC646, 0x9749, 0xF957, 0x974B, 0xF9AD, 0x9752, 0xAB43, 0x9756, 0xB974, 0x9758, 0xE4BE, + 0x975A, 0xE8B0, 0x975B, 0xC051, 0x975C, 0xC052, 0x975E, 0xAB44, 0x9760, 0xBE61, 0x9761, 0xC3FB, 0x9762, 0xADB1, 0x9766, 0xC053, + 0x9768, 0xC5E2, 0x9769, 0xADB2, 0x976A, 0xD84D, 0x976C, 0xDCA9, 0x976E, 0xDCAB, 0x9770, 0xDCAA, 0x9772, 0xE0DD, 0x9773, 0xE0DA, + 0x9774, 0xB975, 0x9776, 0xB976, 0x9777, 0xE0DB, 0x9778, 0xE0DC, 0x977A, 0xE4C0, 0x977B, 0xE4C5, 0x977C, 0xBBDE, 0x977D, 0xE4BF, + 0x977E, 0xE4C1, 0x977F, 0xE4C8, 0x9780, 0xE4C3, 0x9781, 0xE4C7, 0x9782, 0xE4C4, 0x9783, 0xE4C2, 0x9784, 0xE4C6, 0x9785, 0xBBDF, + 0x9788, 0xE8B3, 0x978A, 0xE8B1, 0x978B, 0xBE63, 0x978D, 0xBE62, 0x978E, 0xE8B2, 0x978F, 0xBE64, 0x9794, 0xEC56, 0x9797, 0xEC55, + 0x9798, 0xC054, 0x9799, 0xEC54, 0x979A, 0xEEFC, 0x979C, 0xEEFE, 0x979D, 0xEF41, 0x979E, 0xEF40, 0x97A0, 0xC1F9, 0x97A1, 0xEEFD, + 0x97A2, 0xF1A1, 0x97A3, 0xC2FD, 0x97A4, 0xF17D, 0x97A5, 0xF1A2, 0x97A6, 0xC2FE, 0x97A8, 0xF17B, 0x97AA, 0xF17E, 0x97AB, 0xF17C, + 0x97AC, 0xF179, 0x97AD, 0xC340, 0x97AE, 0xF17A, 0x97B3, 0xF3A1, 0x97B6, 0xF3A3, 0x97B7, 0xF3A2, 0x97B9, 0xF54A, 0x97BB, 0xF54B, + 0x97BF, 0xF670, 0x97C1, 0xC5B7, 0x97C3, 0xC5B6, 0x97C4, 0xF84F, 0x97C5, 0xF850, 0x97C6, 0xC648, 0x97C7, 0xF8D1, 0x97C9, 0xC669, + 0x97CB, 0xADB3, 0x97CC, 0xB6B4, 0x97CD, 0xE4CA, 0x97CE, 0xE4C9, 0x97CF, 0xE8B5, 0x97D0, 0xE8B4, 0x97D3, 0xC1FA, 0x97D4, 0xEF43, + 0x97D5, 0xEF42, 0x97D6, 0xF1A5, 0x97D7, 0xF1A3, 0x97D8, 0xF1A6, 0x97D9, 0xF1A4, 0x97DC, 0xC3FC, 0x97DD, 0xF3A4, 0x97DE, 0xF3A5, + 0x97DF, 0xF3A6, 0x97E1, 0xF671, 0x97E3, 0xF772, 0x97E5, 0xF8D2, 0x97ED, 0xADB4, 0x97F0, 0xEC57, 0x97F1, 0xEF44, 0x97F3, 0xADB5, + 0x97F6, 0xBBE0, 0x97F8, 0xEC58, 0x97F9, 0xC341, 0x97FA, 0xF1A7, 0x97FB, 0xC3FD, 0x97FD, 0xF54C, 0x97FE, 0xF54D, 0x97FF, 0xC554, + 0x9800, 0xF851, 0x9801, 0xADB6, 0x9802, 0xB3BB, 0x9803, 0xB3BC, 0x9804, 0xD84E, 0x9805, 0xB6B5, 0x9806, 0xB6B6, 0x9807, 0xDCAC, + 0x9808, 0xB6B7, 0x980A, 0xB97A, 0x980C, 0xB97C, 0x980D, 0xE0DF, 0x980E, 0xE0E0, 0x980F, 0xE0DE, 0x9810, 0xB977, 0x9811, 0xB978, + 0x9812, 0xB97B, 0x9813, 0xB979, 0x9816, 0xE4CB, 0x9817, 0xBBE1, 0x9818, 0xBBE2, 0x981B, 0xE8BC, 0x981C, 0xBE67, 0x981D, 0xE8B7, + 0x981E, 0xE8B6, 0x9820, 0xE8BB, 0x9821, 0xBE65, 0x9824, 0xC05B, 0x9826, 0xE8B8, 0x9827, 0xE8BD, 0x9828, 0xE8BA, 0x9829, 0xE8B9, + 0x982B, 0xBE66, 0x982D, 0xC059, 0x982F, 0xEC5A, 0x9830, 0xC055, 0x9832, 0xEC5B, 0x9835, 0xEC59, 0x9837, 0xC058, 0x9838, 0xC056, + 0x9839, 0xC05A, 0x983B, 0xC057, 0x9841, 0xEF45, 0x9843, 0xEF4A, 0x9844, 0xEF46, 0x9845, 0xEF49, 0x9846, 0xC1FB, 0x9848, 0xEDD4, + 0x9849, 0xEF48, 0x984A, 0xEF47, 0x984C, 0xC344, 0x984D, 0xC342, 0x984E, 0xC345, 0x984F, 0xC343, 0x9850, 0xF1A8, 0x9851, 0xF1A9, + 0x9852, 0xF1AA, 0x9853, 0xC346, 0x9857, 0xF3AA, 0x9858, 0xC440, 0x9859, 0xF3A8, 0x985B, 0xC441, 0x985C, 0xF3A7, 0x985D, 0xF3A9, + 0x985E, 0xC3FE, 0x985F, 0xF551, 0x9860, 0xF54E, 0x9862, 0xF54F, 0x9863, 0xF550, 0x9864, 0xF672, 0x9865, 0xC556, 0x9867, 0xC555, + 0x9869, 0xF774, 0x986A, 0xF773, 0x986B, 0xC5B8, 0x986F, 0xC5E3, 0x9870, 0xC649, 0x9871, 0xC660, 0x9872, 0xF958, 0x9873, 0xF9AE, + 0x9874, 0xF9AF, 0x98A8, 0xADB7, 0x98A9, 0xDCAD, 0x98AC, 0xE0E1, 0x98AD, 0xE4CC, 0x98AE, 0xE4CD, 0x98AF, 0xBBE3, 0x98B1, 0xBBE4, + 0x98B2, 0xE8BE, 0x98B3, 0xBE68, 0x98B6, 0xC1FC, 0x98B8, 0xF1AB, 0x98BA, 0xC347, 0x98BB, 0xF3AD, 0x98BC, 0xC442, 0x98BD, 0xF3AC, + 0x98BE, 0xF3AE, 0x98BF, 0xF3AB, 0x98C0, 0xF675, 0x98C1, 0xF552, 0x98C2, 0xF553, 0x98C4, 0xC4C6, 0x98C6, 0xF674, 0x98C9, 0xF673, + 0x98CB, 0xF775, 0x98CC, 0xF9B0, 0x98DB, 0xADB8, 0x98DF, 0xADB9, 0x98E2, 0xB0A7, 0x98E3, 0xD448, 0x98E5, 0xD84F, 0x98E7, 0xB6B8, + 0x98E9, 0xB6BB, 0x98EA, 0xB6B9, 0x98EB, 0xDCAE, 0x98ED, 0xB6BD, 0x98EF, 0xB6BA, 0x98F2, 0xB6BC, 0x98F4, 0xB97E, 0x98F6, 0xE0E2, + 0x98F9, 0xE0E3, 0x98FA, 0xE8C0, 0x98FC, 0xB97D, 0x98FD, 0xB9A1, 0x98FE, 0xB9A2, 0x9900, 0xE4CF, 0x9902, 0xE4CE, 0x9903, 0xBBE5, + 0x9905, 0xBBE6, 0x9907, 0xE4D0, 0x9908, 0xE8BF, 0x9909, 0xBBE8, 0x990A, 0xBE69, 0x990C, 0xBBE7, 0x9910, 0xC05C, 0x9911, 0xE8C1, + 0x9912, 0xBE6B, 0x9913, 0xBE6A, 0x9914, 0xE8C2, 0x9915, 0xE8C5, 0x9916, 0xE8C3, 0x9917, 0xE8C4, 0x9918, 0xBE6C, 0x991A, 0xC061, + 0x991B, 0xC05F, 0x991E, 0xC05E, 0x991F, 0xEC5D, 0x9921, 0xC060, 0x9924, 0xEC5C, 0x9925, 0xEF4B, 0x9927, 0xEC5E, 0x9928, 0xC05D, + 0x9929, 0xEC5F, 0x992A, 0xEF4E, 0x992B, 0xEF4C, 0x992C, 0xEF4D, 0x992D, 0xEF52, 0x992E, 0xC34B, 0x992F, 0xEF51, 0x9930, 0xEF54, + 0x9931, 0xEF53, 0x9932, 0xEF50, 0x9933, 0xEF4F, 0x9935, 0xC1FD, 0x993A, 0xF1AE, 0x993C, 0xF1AD, 0x993D, 0xC34A, 0x993E, 0xC348, + 0x993F, 0xC349, 0x9941, 0xF1AC, 0x9943, 0xF3B1, 0x9945, 0xC443, 0x9947, 0xF3B0, 0x9948, 0xF3AF, 0x9949, 0xC444, 0x994B, 0xF558, + 0x994C, 0xF557, 0x994E, 0xF555, 0x9950, 0xF554, 0x9951, 0xC4C8, 0x9952, 0xC4C7, 0x9953, 0xF559, 0x9954, 0xF776, 0x9955, 0xC5B9, + 0x9956, 0xF677, 0x9957, 0xC557, 0x9958, 0xF676, 0x9959, 0xF556, 0x995B, 0xF777, 0x995C, 0xC5E4, 0x995E, 0xC661, 0x995F, 0xF959, + 0x9961, 0xF9B1, 0x9996, 0xADBA, 0x9997, 0xD850, 0x9998, 0xEF55, 0x9999, 0xADBB, 0x999C, 0xE4D2, 0x999D, 0xE4D1, 0x999E, 0xEC60, + 0x99A1, 0xEF57, 0x99A3, 0xEF56, 0x99A5, 0xC34C, 0x99A6, 0xF3B2, 0x99A7, 0xF3B3, 0x99A8, 0xC4C9, 0x99AB, 0xF9B2, 0x99AC, 0xB0A8, + 0x99AD, 0xB6BF, 0x99AE, 0xB6BE, 0x99AF, 0xE0E4, 0x99B0, 0xE0E6, 0x99B1, 0xB9A4, 0x99B2, 0xE0E5, 0x99B3, 0xB9A3, 0x99B4, 0xB9A5, + 0x99B5, 0xE0E7, 0x99B9, 0xE4D4, 0x99BA, 0xE4D6, 0x99BB, 0xE4D5, 0x99BD, 0xE4D8, 0x99C1, 0xBBE9, 0x99C2, 0xE4D7, 0x99C3, 0xE4D3, + 0x99C7, 0xE4D9, 0x99C9, 0xE8CC, 0x99CB, 0xE8CF, 0x99CC, 0xE8D1, 0x99CD, 0xE8C7, 0x99CE, 0xE8CB, 0x99CF, 0xE8C8, 0x99D0, 0xBE6E, + 0x99D1, 0xBE71, 0x99D2, 0xBE73, 0x99D3, 0xE8C9, 0x99D4, 0xE8CA, 0x99D5, 0xBE72, 0x99D6, 0xE8CD, 0x99D7, 0xE8D0, 0x99D8, 0xE8CE, + 0x99D9, 0xBE74, 0x99DB, 0xBE70, 0x99DC, 0xE8C6, 0x99DD, 0xBE6D, 0x99DF, 0xBE6F, 0x99E2, 0xC063, 0x99E3, 0xEC66, 0x99E4, 0xEC64, + 0x99E5, 0xEC63, 0x99E7, 0xEC69, 0x99E9, 0xEC68, 0x99EA, 0xEC67, 0x99EC, 0xEC62, 0x99ED, 0xC062, 0x99EE, 0xEC61, 0x99F0, 0xEC65, + 0x99F1, 0xC064, 0x99F4, 0xEF5A, 0x99F6, 0xEF5E, 0x99F7, 0xEF5B, 0x99F8, 0xEF5D, 0x99F9, 0xEF5C, 0x99FA, 0xEF59, 0x99FB, 0xEF5F, + 0x99FC, 0xEF62, 0x99FD, 0xEF60, 0x99FE, 0xEF61, 0x99FF, 0xC240, 0x9A01, 0xC1FE, 0x9A02, 0xEF58, 0x9A03, 0xEF63, 0x9A04, 0xF1B3, + 0x9A05, 0xF1B6, 0x9A06, 0xF1B8, 0x9A07, 0xF1B7, 0x9A09, 0xF1B1, 0x9A0A, 0xF1B5, 0x9A0B, 0xF1B0, 0x9A0D, 0xF1B2, 0x9A0E, 0xC34D, + 0x9A0F, 0xF1AF, 0x9A11, 0xF1B4, 0x9A14, 0xF3C0, 0x9A15, 0xF3B5, 0x9A16, 0xC445, 0x9A19, 0xC446, 0x9A1A, 0xF3B4, 0x9A1B, 0xF3B9, + 0x9A1C, 0xF3BF, 0x9A1D, 0xF3B7, 0x9A1E, 0xF3BE, 0x9A20, 0xF3BB, 0x9A22, 0xF3BA, 0x9A23, 0xF3BD, 0x9A24, 0xF3B8, 0x9A25, 0xF3B6, + 0x9A27, 0xF3BC, 0x9A29, 0xF560, 0x9A2A, 0xF55E, 0x9A2B, 0xC4CA, 0x9A2C, 0xF55D, 0x9A2D, 0xF563, 0x9A2E, 0xF561, 0x9A30, 0xC4CB, + 0x9A31, 0xF55C, 0x9A32, 0xF55A, 0x9A34, 0xF55B, 0x9A35, 0xC4CD, 0x9A36, 0xF55F, 0x9A37, 0xC4CC, 0x9A38, 0xF562, 0x9A39, 0xF678, + 0x9A3A, 0xF67E, 0x9A3D, 0xF679, 0x9A3E, 0xC55B, 0x9A3F, 0xF6A1, 0x9A40, 0xC55A, 0x9A41, 0xF67D, 0x9A42, 0xF67C, 0x9A43, 0xC559, + 0x9A44, 0xF67B, 0x9A45, 0xC558, 0x9A46, 0xF67A, 0x9A48, 0xF77D, 0x9A49, 0xF7A1, 0x9A4A, 0xF77E, 0x9A4C, 0xF77B, 0x9A4D, 0xC5BB, + 0x9A4E, 0xF778, 0x9A4F, 0xF77C, 0x9A50, 0xF7A3, 0x9A52, 0xF7A2, 0x9A53, 0xF779, 0x9A54, 0xF77A, 0x9A55, 0xC5BA, 0x9A56, 0xF852, + 0x9A57, 0xC5E7, 0x9A59, 0xF853, 0x9A5A, 0xC5E5, 0x9A5B, 0xC5E6, 0x9A5E, 0xF8D3, 0x9A5F, 0xC64A, 0x9A60, 0xF976, 0x9A62, 0xC66A, + 0x9A64, 0xF9B3, 0x9A65, 0xC66B, 0x9A66, 0xF9B4, 0x9A67, 0xF9B5, 0x9A68, 0xF9C3, 0x9A69, 0xF9C2, 0x9A6A, 0xC67A, 0x9A6B, 0xF9CD, + 0x9AA8, 0xB0A9, 0x9AAB, 0xE0E9, 0x9AAD, 0xE0E8, 0x9AAF, 0xBBEA, 0x9AB0, 0xBBEB, 0x9AB1, 0xE4DA, 0x9AB3, 0xE8D2, 0x9AB4, 0xEC6C, + 0x9AB7, 0xBE75, 0x9AB8, 0xC065, 0x9AB9, 0xEC6A, 0x9ABB, 0xEC6D, 0x9ABC, 0xC066, 0x9ABE, 0xEF64, 0x9ABF, 0xEC6B, 0x9AC0, 0xF1B9, + 0x9AC1, 0xC34E, 0x9AC2, 0xF3C1, 0x9AC6, 0xF566, 0x9AC7, 0xF564, 0x9ACA, 0xF565, 0x9ACD, 0xF6A2, 0x9ACF, 0xC55C, 0x9AD0, 0xF7A4, + 0x9AD1, 0xC5EA, 0x9AD2, 0xC5BC, 0x9AD3, 0xC5E8, 0x9AD4, 0xC5E9, 0x9AD5, 0xF8D4, 0x9AD6, 0xC662, 0x9AD8, 0xB0AA, 0x9ADC, 0xF1BA, + 0x9ADF, 0xD449, 0x9AE1, 0xB9A6, 0x9AE3, 0xE4DB, 0x9AE6, 0xBBEC, 0x9AE7, 0xE4DC, 0x9AEB, 0xE8D4, 0x9AEC, 0xE8D3, 0x9AED, 0xC068, + 0x9AEE, 0xBE76, 0x9AEF, 0xBE77, 0x9AF1, 0xE8D7, 0x9AF2, 0xE8D6, 0x9AF3, 0xE8D5, 0x9AF6, 0xEC6E, 0x9AF7, 0xEC71, 0x9AF9, 0xEC70, + 0x9AFA, 0xEC6F, 0x9AFB, 0xC067, 0x9AFC, 0xEF68, 0x9AFD, 0xEF66, 0x9AFE, 0xEF65, 0x9B01, 0xEF67, 0x9B03, 0xC34F, 0x9B04, 0xF1BC, + 0x9B05, 0xF1BD, 0x9B06, 0xC350, 0x9B08, 0xF1BB, 0x9B0A, 0xF3C3, 0x9B0B, 0xF3C2, 0x9B0C, 0xF3C5, 0x9B0D, 0xC447, 0x9B0E, 0xF3C4, + 0x9B10, 0xF567, 0x9B11, 0xF569, 0x9B12, 0xF568, 0x9B15, 0xF6A3, 0x9B16, 0xF6A6, 0x9B17, 0xF6A4, 0x9B18, 0xF6A5, 0x9B19, 0xF7A5, + 0x9B1A, 0xC5BD, 0x9B1E, 0xF854, 0x9B1F, 0xF855, 0x9B20, 0xF856, 0x9B22, 0xC64B, 0x9B23, 0xC663, 0x9B24, 0xF9B6, 0x9B25, 0xB0AB, + 0x9B27, 0xBE78, 0x9B28, 0xC069, 0x9B29, 0xF1BE, 0x9B2B, 0xF7A6, 0x9B2E, 0xF9C4, 0x9B2F, 0xD44A, 0x9B31, 0xC67B, 0x9B32, 0xB0AC, + 0x9B33, 0xEC72, 0x9B35, 0xF1BF, 0x9B37, 0xF3C6, 0x9B3A, 0xF6A7, 0x9B3B, 0xF7A7, 0x9B3C, 0xB0AD, 0x9B3E, 0xE4DD, 0x9B3F, 0xE4DE, + 0x9B41, 0xBBED, 0x9B42, 0xBBEE, 0x9B43, 0xE8D9, 0x9B44, 0xBE7A, 0x9B45, 0xBE79, 0x9B46, 0xE8D8, 0x9B48, 0xEF69, 0x9B4A, 0xF1C0, + 0x9B4B, 0xF1C2, 0x9B4C, 0xF1C1, 0x9B4D, 0xC353, 0x9B4E, 0xC352, 0x9B4F, 0xC351, 0x9B51, 0xC55E, 0x9B52, 0xF6A8, 0x9B54, 0xC55D, + 0x9B55, 0xF7A9, 0x9B56, 0xF7A8, 0x9B58, 0xC64C, 0x9B59, 0xF8D5, 0x9B5A, 0xB3BD, 0x9B5B, 0xE0EA, 0x9B5F, 0xE4E1, 0x9B60, 0xE4DF, + 0x9B61, 0xE4E0, 0x9B64, 0xE8E2, 0x9B66, 0xE8DD, 0x9B67, 0xE8DA, 0x9B68, 0xE8E1, 0x9B6C, 0xE8E3, 0x9B6F, 0xBE7C, 0x9B70, 0xE8E0, + 0x9B71, 0xE8DC, 0x9B74, 0xE8DB, 0x9B75, 0xE8DF, 0x9B76, 0xE8DE, 0x9B77, 0xBE7B, 0x9B7A, 0xEC7D, 0x9B7B, 0xEC78, 0x9B7C, 0xEC76, + 0x9B7D, 0xECA1, 0x9B7E, 0xEC77, 0x9B80, 0xEC73, 0x9B82, 0xEC79, 0x9B85, 0xEC74, 0x9B86, 0xEF72, 0x9B87, 0xEC75, 0x9B88, 0xECA2, + 0x9B90, 0xEC7C, 0x9B91, 0xC06A, 0x9B92, 0xEC7B, 0x9B93, 0xEC7A, 0x9B95, 0xEC7E, 0x9B9A, 0xEF6A, 0x9B9B, 0xEF6D, 0x9B9E, 0xEF6C, + 0x9BA0, 0xEF74, 0x9BA1, 0xEF6F, 0x9BA2, 0xEF73, 0x9BA4, 0xEF71, 0x9BA5, 0xEF70, 0x9BA6, 0xEF6E, 0x9BA8, 0xEF6B, 0x9BAA, 0xC243, + 0x9BAB, 0xC242, 0x9BAD, 0xC244, 0x9BAE, 0xC241, 0x9BAF, 0xEF75, 0x9BB5, 0xF1C8, 0x9BB6, 0xF1CB, 0x9BB8, 0xF1C9, 0x9BB9, 0xF1CD, + 0x9BBD, 0xF1CE, 0x9BBF, 0xF1C6, 0x9BC0, 0xC358, 0x9BC1, 0xF1C7, 0x9BC3, 0xF1C5, 0x9BC4, 0xF1CC, 0x9BC6, 0xF1C4, 0x9BC7, 0xF1C3, + 0x9BC8, 0xC357, 0x9BC9, 0xC355, 0x9BCA, 0xC354, 0x9BD3, 0xF1CA, 0x9BD4, 0xF3CF, 0x9BD5, 0xF3D5, 0x9BD6, 0xC44A, 0x9BD7, 0xF3D0, + 0x9BD9, 0xF3D3, 0x9BDA, 0xF3D7, 0x9BDB, 0xC44B, 0x9BDC, 0xF3D2, 0x9BDE, 0xF3CA, 0x9BE0, 0xF3C9, 0x9BE1, 0xF3D6, 0x9BE2, 0xF3CD, + 0x9BE4, 0xF3CB, 0x9BE5, 0xF3D4, 0x9BE6, 0xF3CC, 0x9BE7, 0xC449, 0x9BE8, 0xC448, 0x9BEA, 0xF3C7, 0x9BEB, 0xF3C8, 0x9BEC, 0xF3D1, + 0x9BF0, 0xF3CE, 0x9BF7, 0xF56C, 0x9BF8, 0xF56F, 0x9BFD, 0xC356, 0x9C05, 0xF56D, 0x9C06, 0xF573, 0x9C07, 0xF571, 0x9C08, 0xF56B, + 0x9C09, 0xF576, 0x9C0B, 0xF56A, 0x9C0D, 0xC4CF, 0x9C0E, 0xF572, 0x9C12, 0xF56E, 0x9C13, 0xC4CE, 0x9C14, 0xF575, 0x9C17, 0xF574, + 0x9C1C, 0xF6AB, 0x9C1D, 0xF6AA, 0x9C21, 0xF6B1, 0x9C23, 0xF6AD, 0x9C24, 0xF6B0, 0x9C25, 0xC560, 0x9C28, 0xF6AE, 0x9C29, 0xF6AF, + 0x9C2B, 0xF6A9, 0x9C2C, 0xF6AC, 0x9C2D, 0xC55F, 0x9C31, 0xC5BF, 0x9C32, 0xF7B4, 0x9C33, 0xF7AF, 0x9C34, 0xF7B3, 0x9C36, 0xF7B6, + 0x9C37, 0xF7B2, 0x9C39, 0xF7AE, 0x9C3B, 0xC5C1, 0x9C3C, 0xF7B1, 0x9C3D, 0xF7B5, 0x9C3E, 0xC5C0, 0x9C3F, 0xF7AC, 0x9C40, 0xF570, + 0x9C41, 0xF7B0, 0x9C44, 0xF7AD, 0x9C46, 0xF7AA, 0x9C48, 0xF7AB, 0x9C49, 0xC5BE, 0x9C4A, 0xF85A, 0x9C4B, 0xF85C, 0x9C4C, 0xF85F, + 0x9C4D, 0xF85B, 0x9C4E, 0xF860, 0x9C50, 0xF859, 0x9C52, 0xF857, 0x9C54, 0xC5EB, 0x9C55, 0xF85D, 0x9C56, 0xC5ED, 0x9C57, 0xC5EC, + 0x9C58, 0xF858, 0x9C59, 0xF85E, 0x9C5E, 0xF8DA, 0x9C5F, 0xC64D, 0x9C60, 0xF8DB, 0x9C62, 0xF8D9, 0x9C63, 0xF8D6, 0x9C66, 0xF8D8, + 0x9C67, 0xF8D7, 0x9C68, 0xF95A, 0x9C6D, 0xF95C, 0x9C6E, 0xF95B, 0x9C71, 0xF979, 0x9C73, 0xF978, 0x9C74, 0xF977, 0x9C75, 0xF97A, + 0x9C77, 0xC673, 0x9C78, 0xC674, 0x9C79, 0xF9CA, 0x9C7A, 0xF9CE, 0x9CE5, 0xB3BE, 0x9CE6, 0xDCAF, 0x9CE7, 0xE0ED, 0x9CE9, 0xB9A7, + 0x9CEA, 0xE0EB, 0x9CED, 0xE0EC, 0x9CF1, 0xE4E2, 0x9CF2, 0xE4E3, 0x9CF3, 0xBBF1, 0x9CF4, 0xBBEF, 0x9CF5, 0xE4E4, 0x9CF6, 0xBBF0, + 0x9CF7, 0xE8E8, 0x9CF9, 0xE8EB, 0x9CFA, 0xE8E5, 0x9CFB, 0xE8EC, 0x9CFC, 0xE8E4, 0x9CFD, 0xE8E6, 0x9CFF, 0xE8E7, 0x9D00, 0xE8EA, + 0x9D03, 0xBEA1, 0x9D04, 0xE8EF, 0x9D05, 0xE8EE, 0x9D06, 0xBE7D, 0x9D07, 0xE8E9, 0x9D08, 0xE8ED, 0x9D09, 0xBE7E, 0x9D10, 0xECAC, + 0x9D12, 0xC06F, 0x9D14, 0xECA7, 0x9D15, 0xC06B, 0x9D17, 0xECA4, 0x9D18, 0xECAA, 0x9D19, 0xECAD, 0x9D1B, 0xC070, 0x9D1D, 0xECA9, + 0x9D1E, 0xECA6, 0x9D1F, 0xECAE, 0x9D20, 0xECA5, 0x9D22, 0xECAB, 0x9D23, 0xC06C, 0x9D25, 0xECA3, 0x9D26, 0xC06D, 0x9D28, 0xC06E, + 0x9D29, 0xECA8, 0x9D2D, 0xEFA9, 0x9D2E, 0xEF7A, 0x9D2F, 0xEF7B, 0x9D30, 0xEF7E, 0x9D31, 0xEF7C, 0x9D33, 0xEF76, 0x9D36, 0xEF79, + 0x9D37, 0xEFA5, 0x9D38, 0xEF7D, 0x9D3B, 0xC245, 0x9D3D, 0xEFA7, 0x9D3E, 0xEFA4, 0x9D3F, 0xC246, 0x9D40, 0xEFA6, 0x9D41, 0xEF77, + 0x9D42, 0xEFA2, 0x9D43, 0xEFA3, 0x9D45, 0xEFA1, 0x9D4A, 0xF1D2, 0x9D4B, 0xF1D4, 0x9D4C, 0xF1D7, 0x9D4F, 0xF1D1, 0x9D51, 0xC359, + 0x9D52, 0xF1D9, 0x9D53, 0xF1D0, 0x9D54, 0xF1DA, 0x9D56, 0xF1D6, 0x9D57, 0xF1D8, 0x9D58, 0xF1DC, 0x9D59, 0xF1D5, 0x9D5A, 0xF1DD, + 0x9D5B, 0xF1D3, 0x9D5C, 0xF1CF, 0x9D5D, 0xC35A, 0x9D5F, 0xF1DB, 0x9D60, 0xC35B, 0x9D61, 0xC44D, 0x9D67, 0xEF78, 0x9D68, 0xF3F1, + 0x9D69, 0xF3E8, 0x9D6A, 0xC44F, 0x9D6B, 0xF3E4, 0x9D6C, 0xC450, 0x9D6F, 0xF3ED, 0x9D70, 0xF3E7, 0x9D71, 0xF3DD, 0x9D72, 0xC44E, + 0x9D73, 0xF3EA, 0x9D74, 0xF3E5, 0x9D75, 0xF3E6, 0x9D77, 0xF3D8, 0x9D78, 0xF3DF, 0x9D79, 0xF3EE, 0x9D7B, 0xF3EB, 0x9D7D, 0xF3E3, + 0x9D7F, 0xF3EF, 0x9D80, 0xF3DE, 0x9D81, 0xF3D9, 0x9D82, 0xF3EC, 0x9D84, 0xF3DB, 0x9D85, 0xF3E9, 0x9D86, 0xF3E0, 0x9D87, 0xF3F0, + 0x9D88, 0xF3DC, 0x9D89, 0xC44C, 0x9D8A, 0xF3DA, 0x9D8B, 0xF3E1, 0x9D8C, 0xF3E2, 0x9D90, 0xF57D, 0x9D92, 0xF57B, 0x9D94, 0xF5A2, + 0x9D96, 0xF5AE, 0x9D97, 0xF5A5, 0x9D98, 0xF57C, 0x9D99, 0xF578, 0x9D9A, 0xF5A7, 0x9D9B, 0xF57E, 0x9D9C, 0xF5A3, 0x9D9D, 0xF57A, + 0x9D9E, 0xF5AA, 0x9D9F, 0xF577, 0x9DA0, 0xF5A1, 0x9DA1, 0xF5A6, 0x9DA2, 0xF5A8, 0x9DA3, 0xF5AB, 0x9DA4, 0xF579, 0x9DA6, 0xF5AF, + 0x9DA7, 0xF5B0, 0x9DA8, 0xF5A9, 0x9DA9, 0xF5AD, 0x9DAA, 0xF5A4, 0x9DAC, 0xF6C1, 0x9DAD, 0xF6C4, 0x9DAF, 0xC561, 0x9DB1, 0xF6C3, + 0x9DB2, 0xF6C8, 0x9DB3, 0xF6C6, 0x9DB4, 0xC562, 0x9DB5, 0xF6BD, 0x9DB6, 0xF6B3, 0x9DB7, 0xF6B2, 0x9DB8, 0xC564, 0x9DB9, 0xF6BF, + 0x9DBA, 0xF6C0, 0x9DBB, 0xF6BC, 0x9DBC, 0xF6B4, 0x9DBE, 0xF6B9, 0x9DBF, 0xF5AC, 0x9DC1, 0xF6B5, 0x9DC2, 0xC563, 0x9DC3, 0xF6BB, + 0x9DC5, 0xF6BA, 0x9DC7, 0xF6B6, 0x9DC8, 0xF6C2, 0x9DCA, 0xF6B7, 0x9DCB, 0xF7BB, 0x9DCC, 0xF6C5, 0x9DCD, 0xF6C7, 0x9DCE, 0xF6BE, + 0x9DCF, 0xF6B8, 0x9DD0, 0xF7BC, 0x9DD1, 0xF7BE, 0x9DD2, 0xF7B8, 0x9DD3, 0xC5C2, 0x9DD5, 0xF7C5, 0x9DD6, 0xF7C3, 0x9DD7, 0xC5C3, + 0x9DD8, 0xF7C2, 0x9DD9, 0xF7C1, 0x9DDA, 0xF7BA, 0x9DDB, 0xF7B7, 0x9DDC, 0xF7BD, 0x9DDD, 0xF7C6, 0x9DDE, 0xF7B9, 0x9DDF, 0xF7BF, + 0x9DE1, 0xF869, 0x9DE2, 0xF86E, 0x9DE3, 0xF864, 0x9DE4, 0xF867, 0x9DE5, 0xC5EE, 0x9DE6, 0xF86B, 0x9DE8, 0xF872, 0x9DE9, 0xF7C0, + 0x9DEB, 0xF865, 0x9DEC, 0xF86F, 0x9DED, 0xF873, 0x9DEE, 0xF86A, 0x9DEF, 0xF863, 0x9DF0, 0xF86D, 0x9DF2, 0xF86C, 0x9DF3, 0xF871, + 0x9DF4, 0xF870, 0x9DF5, 0xF7C4, 0x9DF6, 0xF868, 0x9DF7, 0xF862, 0x9DF8, 0xF866, 0x9DF9, 0xC64E, 0x9DFA, 0xC64F, 0x9DFB, 0xF861, + 0x9DFD, 0xF8E6, 0x9DFE, 0xF8DD, 0x9DFF, 0xF8E5, 0x9E00, 0xF8E2, 0x9E01, 0xF8E3, 0x9E02, 0xF8DC, 0x9E03, 0xF8DF, 0x9E04, 0xF8E7, + 0x9E05, 0xF8E1, 0x9E06, 0xF8E0, 0x9E07, 0xF8DE, 0x9E09, 0xF8E4, 0x9E0B, 0xF95D, 0x9E0D, 0xF95E, 0x9E0F, 0xF960, 0x9E10, 0xF95F, + 0x9E11, 0xF962, 0x9E12, 0xF961, 0x9E13, 0xF97C, 0x9E14, 0xF97B, 0x9E15, 0xF9B7, 0x9E17, 0xF9B8, 0x9E19, 0xF9C5, 0x9E1A, 0xC678, + 0x9E1B, 0xC67C, 0x9E1D, 0xF9CF, 0x9E1E, 0xC67D, 0x9E75, 0xB3BF, 0x9E79, 0xC4D0, 0x9E7A, 0xF6C9, 0x9E7C, 0xC650, 0x9E7D, 0xC651, + 0x9E7F, 0xB3C0, 0x9E80, 0xE0EE, 0x9E82, 0xB9A8, 0x9E83, 0xE8F0, 0x9E86, 0xECB0, 0x9E87, 0xECB1, 0x9E88, 0xECAF, 0x9E89, 0xEFAB, + 0x9E8A, 0xEFAA, 0x9E8B, 0xC247, 0x9E8C, 0xF1DF, 0x9E8D, 0xEFAC, 0x9E8E, 0xF1DE, 0x9E91, 0xF3F3, 0x9E92, 0xC451, 0x9E93, 0xC453, + 0x9E94, 0xF3F2, 0x9E97, 0xC452, 0x9E99, 0xF5B1, 0x9E9A, 0xF5B3, 0x9E9B, 0xF5B2, 0x9E9C, 0xF6CA, 0x9E9D, 0xC565, 0x9E9F, 0xC5EF, + 0x9EA0, 0xF8E8, 0x9EA1, 0xF963, 0x9EA4, 0xF9D2, 0x9EA5, 0xB3C1, 0x9EA7, 0xE4E5, 0x9EA9, 0xBEA2, 0x9EAD, 0xECB3, 0x9EAE, 0xECB2, + 0x9EB0, 0xEFAD, 0x9EB4, 0xC454, 0x9EB5, 0xC4D1, 0x9EB6, 0xF7C7, 0x9EB7, 0xF9CB, 0x9EBB, 0xB3C2, 0x9EBC, 0xBBF2, 0x9EBE, 0xBEA3, + 0x9EC0, 0xF3F4, 0x9EC2, 0xF874, 0x9EC3, 0xB6C0, 0x9EC8, 0xEFAE, 0x9ECC, 0xC664, 0x9ECD, 0xB6C1, 0x9ECE, 0xBEA4, 0x9ECF, 0xC248, + 0x9ED0, 0xF875, 0x9ED1, 0xB6C2, 0x9ED3, 0xE8F1, 0x9ED4, 0xC072, 0x9ED5, 0xECB4, 0x9ED6, 0xECB5, 0x9ED8, 0xC071, 0x9EDA, 0xEFAF, + 0x9EDB, 0xC24C, 0x9EDC, 0xC24A, 0x9EDD, 0xC24B, 0x9EDE, 0xC249, 0x9EDF, 0xF1E0, 0x9EE0, 0xC35C, 0x9EE4, 0xF5B5, 0x9EE5, 0xF5B4, + 0x9EE6, 0xF5B7, 0x9EE7, 0xF5B6, 0x9EE8, 0xC4D2, 0x9EEB, 0xF6CB, 0x9EED, 0xF6CD, 0x9EEE, 0xF6CC, 0x9EEF, 0xC566, 0x9EF0, 0xF7C8, + 0x9EF2, 0xF876, 0x9EF3, 0xF877, 0x9EF4, 0xC5F0, 0x9EF5, 0xF964, 0x9EF6, 0xF97D, 0x9EF7, 0xC675, 0x9EF9, 0xDCB0, 0x9EFA, 0xECB6, + 0x9EFB, 0xEFB0, 0x9EFC, 0xF3F5, 0x9EFD, 0xE0EF, 0x9EFF, 0xEFB1, 0x9F00, 0xF1E2, 0x9F01, 0xF1E1, 0x9F06, 0xF878, 0x9F07, 0xC652, + 0x9F09, 0xF965, 0x9F0A, 0xF97E, 0x9F0E, 0xB9A9, 0x9F0F, 0xE8F2, 0x9F10, 0xE8F3, 0x9F12, 0xECB7, 0x9F13, 0xB9AA, 0x9F15, 0xC35D, + 0x9F16, 0xF1E3, 0x9F18, 0xF6CF, 0x9F19, 0xC567, 0x9F1A, 0xF6D0, 0x9F1B, 0xF6CE, 0x9F1C, 0xF879, 0x9F1E, 0xF8E9, 0x9F20, 0xB9AB, + 0x9F22, 0xEFB4, 0x9F23, 0xEFB3, 0x9F24, 0xEFB2, 0x9F25, 0xF1E4, 0x9F28, 0xF1E8, 0x9F29, 0xF1E7, 0x9F2A, 0xF1E6, 0x9F2B, 0xF1E5, + 0x9F2C, 0xC35E, 0x9F2D, 0xF3F6, 0x9F2E, 0xF5B9, 0x9F2F, 0xC4D3, 0x9F30, 0xF5B8, 0x9F31, 0xF6D1, 0x9F32, 0xF7CB, 0x9F33, 0xF7CA, + 0x9F34, 0xC5C4, 0x9F35, 0xF7C9, 0x9F36, 0xF87C, 0x9F37, 0xF87B, 0x9F38, 0xF87A, 0x9F3B, 0xBBF3, 0x9F3D, 0xECB8, 0x9F3E, 0xC24D, + 0x9F40, 0xF3F7, 0x9F41, 0xF3F8, 0x9F42, 0xF7CC, 0x9F43, 0xF87D, 0x9F46, 0xF8EA, 0x9F47, 0xF966, 0x9F48, 0xF9B9, 0x9F49, 0xF9D4, + 0x9F4A, 0xBBF4, 0x9F4B, 0xC24E, 0x9F4C, 0xF1E9, 0x9F4D, 0xF3F9, 0x9F4E, 0xF6D2, 0x9F4F, 0xF87E, 0x9F52, 0xBEA6, 0x9F54, 0xEFB5, + 0x9F55, 0xF1EA, 0x9F56, 0xF3FA, 0x9F57, 0xF3FB, 0x9F58, 0xF3FC, 0x9F59, 0xF5BE, 0x9F5B, 0xF5BA, 0x9F5C, 0xC568, 0x9F5D, 0xF5BD, + 0x9F5E, 0xF5BC, 0x9F5F, 0xC4D4, 0x9F60, 0xF5BB, 0x9F61, 0xC4D6, 0x9F63, 0xC4D5, 0x9F64, 0xF6D4, 0x9F65, 0xF6D3, 0x9F66, 0xC569, + 0x9F67, 0xC56A, 0x9F6A, 0xC5C6, 0x9F6B, 0xF7CD, 0x9F6C, 0xC5C5, 0x9F6E, 0xF8A3, 0x9F6F, 0xF8A4, 0x9F70, 0xF8A2, 0x9F71, 0xF8A1, + 0x9F72, 0xC654, 0x9F74, 0xF8EB, 0x9F75, 0xF8EC, 0x9F76, 0xF8ED, 0x9F77, 0xC653, 0x9F78, 0xF967, 0x9F79, 0xF96A, 0x9F7A, 0xF969, + 0x9F7B, 0xF968, 0x9F7E, 0xF9D3, 0x9F8D, 0xC073, 0x9F90, 0xC365, 0x9F91, 0xF5BF, 0x9F92, 0xF6D5, 0x9F94, 0xC5C7, 0x9F95, 0xF7CE, + 0x9F98, 0xF9D5, 0x9F9C, 0xC074, 0x9FA0, 0xEFB6, 0x9FA2, 0xF7CF, 0x9FA4, 0xF9A1, 0xFA0C, 0xC94A, 0xFA0D, 0xDDFC, 0xFE30, 0xA14A, + 0xFE31, 0xA157, 0xFE33, 0xA159, 0xFE34, 0xA15B, 0xFE35, 0xA15F, 0xFE36, 0xA160, 0xFE37, 0xA163, 0xFE38, 0xA164, 0xFE39, 0xA167, + 0xFE3A, 0xA168, 0xFE3B, 0xA16B, 0xFE3C, 0xA16C, 0xFE3D, 0xA16F, 0xFE3E, 0xA170, 0xFE3F, 0xA173, 0xFE40, 0xA174, 0xFE41, 0xA177, + 0xFE42, 0xA178, 0xFE43, 0xA17B, 0xFE44, 0xA17C, 0xFE49, 0xA1C6, 0xFE4A, 0xA1C7, 0xFE4B, 0xA1CA, 0xFE4C, 0xA1CB, 0xFE4D, 0xA1C8, + 0xFE4E, 0xA1C9, 0xFE4F, 0xA15C, 0xFE50, 0xA14D, 0xFE51, 0xA14E, 0xFE52, 0xA14F, 0xFE54, 0xA151, 0xFE55, 0xA152, 0xFE56, 0xA153, + 0xFE57, 0xA154, 0xFE59, 0xA17D, 0xFE5A, 0xA17E, 0xFE5B, 0xA1A1, 0xFE5C, 0xA1A2, 0xFE5D, 0xA1A3, 0xFE5E, 0xA1A4, 0xFE5F, 0xA1CC, + 0xFE60, 0xA1CD, 0xFE61, 0xA1CE, 0xFE62, 0xA1DE, 0xFE63, 0xA1DF, 0xFE64, 0xA1E0, 0xFE65, 0xA1E1, 0xFE66, 0xA1E2, 0xFE68, 0xA242, + 0xFE69, 0xA24C, 0xFE6A, 0xA24D, 0xFE6B, 0xA24E, 0xFF01, 0xA149, 0xFF03, 0xA1AD, 0xFF04, 0xA243, 0xFF05, 0xA248, 0xFF06, 0xA1AE, + 0xFF08, 0xA15D, 0xFF09, 0xA15E, 0xFF0A, 0xA1AF, 0xFF0B, 0xA1CF, 0xFF0C, 0xA141, 0xFF0D, 0xA1D0, 0xFF0E, 0xA144, 0xFF0F, 0xA1FE, + 0xFF10, 0xA2AF, 0xFF11, 0xA2B0, 0xFF12, 0xA2B1, 0xFF13, 0xA2B2, 0xFF14, 0xA2B3, 0xFF15, 0xA2B4, 0xFF16, 0xA2B5, 0xFF17, 0xA2B6, + 0xFF18, 0xA2B7, 0xFF19, 0xA2B8, 0xFF1A, 0xA147, 0xFF1B, 0xA146, 0xFF1C, 0xA1D5, 0xFF1D, 0xA1D7, 0xFF1E, 0xA1D6, 0xFF1F, 0xA148, + 0xFF20, 0xA249, 0xFF21, 0xA2CF, 0xFF22, 0xA2D0, 0xFF23, 0xA2D1, 0xFF24, 0xA2D2, 0xFF25, 0xA2D3, 0xFF26, 0xA2D4, 0xFF27, 0xA2D5, + 0xFF28, 0xA2D6, 0xFF29, 0xA2D7, 0xFF2A, 0xA2D8, 0xFF2B, 0xA2D9, 0xFF2C, 0xA2DA, 0xFF2D, 0xA2DB, 0xFF2E, 0xA2DC, 0xFF2F, 0xA2DD, + 0xFF30, 0xA2DE, 0xFF31, 0xA2DF, 0xFF32, 0xA2E0, 0xFF33, 0xA2E1, 0xFF34, 0xA2E2, 0xFF35, 0xA2E3, 0xFF36, 0xA2E4, 0xFF37, 0xA2E5, + 0xFF38, 0xA2E6, 0xFF39, 0xA2E7, 0xFF3A, 0xA2E8, 0xFF3C, 0xA240, 0xFF3F, 0xA1C4, 0xFF41, 0xA2E9, 0xFF42, 0xA2EA, 0xFF43, 0xA2EB, + 0xFF44, 0xA2EC, 0xFF45, 0xA2ED, 0xFF46, 0xA2EE, 0xFF47, 0xA2EF, 0xFF48, 0xA2F0, 0xFF49, 0xA2F1, 0xFF4A, 0xA2F2, 0xFF4B, 0xA2F3, + 0xFF4C, 0xA2F4, 0xFF4D, 0xA2F5, 0xFF4E, 0xA2F6, 0xFF4F, 0xA2F7, 0xFF50, 0xA2F8, 0xFF51, 0xA2F9, 0xFF52, 0xA2FA, 0xFF53, 0xA2FB, + 0xFF54, 0xA2FC, 0xFF55, 0xA2FD, 0xFF56, 0xA2FE, 0xFF57, 0xA340, 0xFF58, 0xA341, 0xFF59, 0xA342, 0xFF5A, 0xA343, 0xFF5B, 0xA161, + 0xFF5C, 0xA155, 0xFF5D, 0xA162, 0xFF5E, 0xA1E3, 0xFFE0, 0xA246, 0xFFE1, 0xA247, 0xFFE3, 0xA1C3, 0xFFE5, 0xA244, 0, 0 +}; + +static const WCHAR oem2uni950[] = { /* Big5 --> Unicode pairs */ + 0xA140, 0x3000, 0xA141, 0xFF0C, 0xA142, 0x3001, 0xA143, 0x3002, 0xA144, 0xFF0E, 0xA145, 0x2027, 0xA146, 0xFF1B, 0xA147, 0xFF1A, + 0xA148, 0xFF1F, 0xA149, 0xFF01, 0xA14A, 0xFE30, 0xA14B, 0x2026, 0xA14C, 0x2025, 0xA14D, 0xFE50, 0xA14E, 0xFE51, 0xA14F, 0xFE52, + 0xA150, 0x00B7, 0xA151, 0xFE54, 0xA152, 0xFE55, 0xA153, 0xFE56, 0xA154, 0xFE57, 0xA155, 0xFF5C, 0xA156, 0x2013, 0xA157, 0xFE31, + 0xA158, 0x2014, 0xA159, 0xFE33, 0xA15A, 0x2574, 0xA15B, 0xFE34, 0xA15C, 0xFE4F, 0xA15D, 0xFF08, 0xA15E, 0xFF09, 0xA15F, 0xFE35, + 0xA160, 0xFE36, 0xA161, 0xFF5B, 0xA162, 0xFF5D, 0xA163, 0xFE37, 0xA164, 0xFE38, 0xA165, 0x3014, 0xA166, 0x3015, 0xA167, 0xFE39, + 0xA168, 0xFE3A, 0xA169, 0x3010, 0xA16A, 0x3011, 0xA16B, 0xFE3B, 0xA16C, 0xFE3C, 0xA16D, 0x300A, 0xA16E, 0x300B, 0xA16F, 0xFE3D, + 0xA170, 0xFE3E, 0xA171, 0x3008, 0xA172, 0x3009, 0xA173, 0xFE3F, 0xA174, 0xFE40, 0xA175, 0x300C, 0xA176, 0x300D, 0xA177, 0xFE41, + 0xA178, 0xFE42, 0xA179, 0x300E, 0xA17A, 0x300F, 0xA17B, 0xFE43, 0xA17C, 0xFE44, 0xA17D, 0xFE59, 0xA17E, 0xFE5A, 0xA1A1, 0xFE5B, + 0xA1A2, 0xFE5C, 0xA1A3, 0xFE5D, 0xA1A4, 0xFE5E, 0xA1A5, 0x2018, 0xA1A6, 0x2019, 0xA1A7, 0x201C, 0xA1A8, 0x201D, 0xA1A9, 0x301D, + 0xA1AA, 0x301E, 0xA1AB, 0x2035, 0xA1AC, 0x2032, 0xA1AD, 0xFF03, 0xA1AE, 0xFF06, 0xA1AF, 0xFF0A, 0xA1B0, 0x203B, 0xA1B1, 0x00A7, + 0xA1B2, 0x3003, 0xA1B3, 0x25CB, 0xA1B4, 0x25CF, 0xA1B5, 0x25B3, 0xA1B6, 0x25B2, 0xA1B7, 0x25CE, 0xA1B8, 0x2606, 0xA1B9, 0x2605, + 0xA1BA, 0x25C7, 0xA1BB, 0x25C6, 0xA1BC, 0x25A1, 0xA1BD, 0x25A0, 0xA1BE, 0x25BD, 0xA1BF, 0x25BC, 0xA1C0, 0x32A3, 0xA1C1, 0x2105, + 0xA1C2, 0x00AF, 0xA1C3, 0xFFE3, 0xA1C4, 0xFF3F, 0xA1C5, 0x02CD, 0xA1C6, 0xFE49, 0xA1C7, 0xFE4A, 0xA1C8, 0xFE4D, 0xA1C9, 0xFE4E, + 0xA1CA, 0xFE4B, 0xA1CB, 0xFE4C, 0xA1CC, 0xFE5F, 0xA1CD, 0xFE60, 0xA1CE, 0xFE61, 0xA1CF, 0xFF0B, 0xA1D0, 0xFF0D, 0xA1D1, 0x00D7, + 0xA1D2, 0x00F7, 0xA1D3, 0x00B1, 0xA1D4, 0x221A, 0xA1D5, 0xFF1C, 0xA1D6, 0xFF1E, 0xA1D7, 0xFF1D, 0xA1D8, 0x2266, 0xA1D9, 0x2267, + 0xA1DA, 0x2260, 0xA1DB, 0x221E, 0xA1DC, 0x2252, 0xA1DD, 0x2261, 0xA1DE, 0xFE62, 0xA1DF, 0xFE63, 0xA1E0, 0xFE64, 0xA1E1, 0xFE65, + 0xA1E2, 0xFE66, 0xA1E3, 0xFF5E, 0xA1E4, 0x2229, 0xA1E5, 0x222A, 0xA1E6, 0x22A5, 0xA1E7, 0x2220, 0xA1E8, 0x221F, 0xA1E9, 0x22BF, + 0xA1EA, 0x33D2, 0xA1EB, 0x33D1, 0xA1EC, 0x222B, 0xA1ED, 0x222E, 0xA1EE, 0x2235, 0xA1EF, 0x2234, 0xA1F0, 0x2640, 0xA1F1, 0x2642, + 0xA1F2, 0x2295, 0xA1F3, 0x2299, 0xA1F4, 0x2191, 0xA1F5, 0x2193, 0xA1F6, 0x2190, 0xA1F7, 0x2192, 0xA1F8, 0x2196, 0xA1F9, 0x2197, + 0xA1FA, 0x2199, 0xA1FB, 0x2198, 0xA1FC, 0x2225, 0xA1FD, 0x2223, 0xA1FE, 0xFF0F, 0xA240, 0xFF3C, 0xA241, 0x2215, 0xA242, 0xFE68, + 0xA243, 0xFF04, 0xA244, 0xFFE5, 0xA245, 0x3012, 0xA246, 0xFFE0, 0xA247, 0xFFE1, 0xA248, 0xFF05, 0xA249, 0xFF20, 0xA24A, 0x2103, + 0xA24B, 0x2109, 0xA24C, 0xFE69, 0xA24D, 0xFE6A, 0xA24E, 0xFE6B, 0xA24F, 0x33D5, 0xA250, 0x339C, 0xA251, 0x339D, 0xA252, 0x339E, + 0xA253, 0x33CE, 0xA254, 0x33A1, 0xA255, 0x338E, 0xA256, 0x338F, 0xA257, 0x33C4, 0xA258, 0x00B0, 0xA259, 0x5159, 0xA25A, 0x515B, + 0xA25B, 0x515E, 0xA25C, 0x515D, 0xA25D, 0x5161, 0xA25E, 0x5163, 0xA25F, 0x55E7, 0xA260, 0x74E9, 0xA261, 0x7CCE, 0xA262, 0x2581, + 0xA263, 0x2582, 0xA264, 0x2583, 0xA265, 0x2584, 0xA266, 0x2585, 0xA267, 0x2586, 0xA268, 0x2587, 0xA269, 0x2588, 0xA26A, 0x258F, + 0xA26B, 0x258E, 0xA26C, 0x258D, 0xA26D, 0x258C, 0xA26E, 0x258B, 0xA26F, 0x258A, 0xA270, 0x2589, 0xA271, 0x253C, 0xA272, 0x2534, + 0xA273, 0x252C, 0xA274, 0x2524, 0xA275, 0x251C, 0xA276, 0x2594, 0xA277, 0x2500, 0xA278, 0x2502, 0xA279, 0x2595, 0xA27A, 0x250C, + 0xA27B, 0x2510, 0xA27C, 0x2514, 0xA27D, 0x2518, 0xA27E, 0x256D, 0xA2A1, 0x256E, 0xA2A2, 0x2570, 0xA2A3, 0x256F, 0xA2A4, 0x2550, + 0xA2A5, 0x255E, 0xA2A6, 0x256A, 0xA2A7, 0x2561, 0xA2A8, 0x25E2, 0xA2A9, 0x25E3, 0xA2AA, 0x25E5, 0xA2AB, 0x25E4, 0xA2AC, 0x2571, + 0xA2AD, 0x2572, 0xA2AE, 0x2573, 0xA2AF, 0xFF10, 0xA2B0, 0xFF11, 0xA2B1, 0xFF12, 0xA2B2, 0xFF13, 0xA2B3, 0xFF14, 0xA2B4, 0xFF15, + 0xA2B5, 0xFF16, 0xA2B6, 0xFF17, 0xA2B7, 0xFF18, 0xA2B8, 0xFF19, 0xA2B9, 0x2160, 0xA2BA, 0x2161, 0xA2BB, 0x2162, 0xA2BC, 0x2163, + 0xA2BD, 0x2164, 0xA2BE, 0x2165, 0xA2BF, 0x2166, 0xA2C0, 0x2167, 0xA2C1, 0x2168, 0xA2C2, 0x2169, 0xA2C3, 0x3021, 0xA2C4, 0x3022, + 0xA2C5, 0x3023, 0xA2C6, 0x3024, 0xA2C7, 0x3025, 0xA2C8, 0x3026, 0xA2C9, 0x3027, 0xA2CA, 0x3028, 0xA2CB, 0x3029, 0xA2CC, 0x5341, + 0xA2CD, 0x5344, 0xA2CE, 0x5345, 0xA2CF, 0xFF21, 0xA2D0, 0xFF22, 0xA2D1, 0xFF23, 0xA2D2, 0xFF24, 0xA2D3, 0xFF25, 0xA2D4, 0xFF26, + 0xA2D5, 0xFF27, 0xA2D6, 0xFF28, 0xA2D7, 0xFF29, 0xA2D8, 0xFF2A, 0xA2D9, 0xFF2B, 0xA2DA, 0xFF2C, 0xA2DB, 0xFF2D, 0xA2DC, 0xFF2E, + 0xA2DD, 0xFF2F, 0xA2DE, 0xFF30, 0xA2DF, 0xFF31, 0xA2E0, 0xFF32, 0xA2E1, 0xFF33, 0xA2E2, 0xFF34, 0xA2E3, 0xFF35, 0xA2E4, 0xFF36, + 0xA2E5, 0xFF37, 0xA2E6, 0xFF38, 0xA2E7, 0xFF39, 0xA2E8, 0xFF3A, 0xA2E9, 0xFF41, 0xA2EA, 0xFF42, 0xA2EB, 0xFF43, 0xA2EC, 0xFF44, + 0xA2ED, 0xFF45, 0xA2EE, 0xFF46, 0xA2EF, 0xFF47, 0xA2F0, 0xFF48, 0xA2F1, 0xFF49, 0xA2F2, 0xFF4A, 0xA2F3, 0xFF4B, 0xA2F4, 0xFF4C, + 0xA2F5, 0xFF4D, 0xA2F6, 0xFF4E, 0xA2F7, 0xFF4F, 0xA2F8, 0xFF50, 0xA2F9, 0xFF51, 0xA2FA, 0xFF52, 0xA2FB, 0xFF53, 0xA2FC, 0xFF54, + 0xA2FD, 0xFF55, 0xA2FE, 0xFF56, 0xA340, 0xFF57, 0xA341, 0xFF58, 0xA342, 0xFF59, 0xA343, 0xFF5A, 0xA344, 0x0391, 0xA345, 0x0392, + 0xA346, 0x0393, 0xA347, 0x0394, 0xA348, 0x0395, 0xA349, 0x0396, 0xA34A, 0x0397, 0xA34B, 0x0398, 0xA34C, 0x0399, 0xA34D, 0x039A, + 0xA34E, 0x039B, 0xA34F, 0x039C, 0xA350, 0x039D, 0xA351, 0x039E, 0xA352, 0x039F, 0xA353, 0x03A0, 0xA354, 0x03A1, 0xA355, 0x03A3, + 0xA356, 0x03A4, 0xA357, 0x03A5, 0xA358, 0x03A6, 0xA359, 0x03A7, 0xA35A, 0x03A8, 0xA35B, 0x03A9, 0xA35C, 0x03B1, 0xA35D, 0x03B2, + 0xA35E, 0x03B3, 0xA35F, 0x03B4, 0xA360, 0x03B5, 0xA361, 0x03B6, 0xA362, 0x03B7, 0xA363, 0x03B8, 0xA364, 0x03B9, 0xA365, 0x03BA, + 0xA366, 0x03BB, 0xA367, 0x03BC, 0xA368, 0x03BD, 0xA369, 0x03BE, 0xA36A, 0x03BF, 0xA36B, 0x03C0, 0xA36C, 0x03C1, 0xA36D, 0x03C3, + 0xA36E, 0x03C4, 0xA36F, 0x03C5, 0xA370, 0x03C6, 0xA371, 0x03C7, 0xA372, 0x03C8, 0xA373, 0x03C9, 0xA374, 0x3105, 0xA375, 0x3106, + 0xA376, 0x3107, 0xA377, 0x3108, 0xA378, 0x3109, 0xA379, 0x310A, 0xA37A, 0x310B, 0xA37B, 0x310C, 0xA37C, 0x310D, 0xA37D, 0x310E, + 0xA37E, 0x310F, 0xA3A1, 0x3110, 0xA3A2, 0x3111, 0xA3A3, 0x3112, 0xA3A4, 0x3113, 0xA3A5, 0x3114, 0xA3A6, 0x3115, 0xA3A7, 0x3116, + 0xA3A8, 0x3117, 0xA3A9, 0x3118, 0xA3AA, 0x3119, 0xA3AB, 0x311A, 0xA3AC, 0x311B, 0xA3AD, 0x311C, 0xA3AE, 0x311D, 0xA3AF, 0x311E, + 0xA3B0, 0x311F, 0xA3B1, 0x3120, 0xA3B2, 0x3121, 0xA3B3, 0x3122, 0xA3B4, 0x3123, 0xA3B5, 0x3124, 0xA3B6, 0x3125, 0xA3B7, 0x3126, + 0xA3B8, 0x3127, 0xA3B9, 0x3128, 0xA3BA, 0x3129, 0xA3BB, 0x02D9, 0xA3BC, 0x02C9, 0xA3BD, 0x02CA, 0xA3BE, 0x02C7, 0xA3BF, 0x02CB, + 0xA3E1, 0x20AC, 0xA440, 0x4E00, 0xA441, 0x4E59, 0xA442, 0x4E01, 0xA443, 0x4E03, 0xA444, 0x4E43, 0xA445, 0x4E5D, 0xA446, 0x4E86, + 0xA447, 0x4E8C, 0xA448, 0x4EBA, 0xA449, 0x513F, 0xA44A, 0x5165, 0xA44B, 0x516B, 0xA44C, 0x51E0, 0xA44D, 0x5200, 0xA44E, 0x5201, + 0xA44F, 0x529B, 0xA450, 0x5315, 0xA451, 0x5341, 0xA452, 0x535C, 0xA453, 0x53C8, 0xA454, 0x4E09, 0xA455, 0x4E0B, 0xA456, 0x4E08, + 0xA457, 0x4E0A, 0xA458, 0x4E2B, 0xA459, 0x4E38, 0xA45A, 0x51E1, 0xA45B, 0x4E45, 0xA45C, 0x4E48, 0xA45D, 0x4E5F, 0xA45E, 0x4E5E, + 0xA45F, 0x4E8E, 0xA460, 0x4EA1, 0xA461, 0x5140, 0xA462, 0x5203, 0xA463, 0x52FA, 0xA464, 0x5343, 0xA465, 0x53C9, 0xA466, 0x53E3, + 0xA467, 0x571F, 0xA468, 0x58EB, 0xA469, 0x5915, 0xA46A, 0x5927, 0xA46B, 0x5973, 0xA46C, 0x5B50, 0xA46D, 0x5B51, 0xA46E, 0x5B53, + 0xA46F, 0x5BF8, 0xA470, 0x5C0F, 0xA471, 0x5C22, 0xA472, 0x5C38, 0xA473, 0x5C71, 0xA474, 0x5DDD, 0xA475, 0x5DE5, 0xA476, 0x5DF1, + 0xA477, 0x5DF2, 0xA478, 0x5DF3, 0xA479, 0x5DFE, 0xA47A, 0x5E72, 0xA47B, 0x5EFE, 0xA47C, 0x5F0B, 0xA47D, 0x5F13, 0xA47E, 0x624D, + 0xA4A1, 0x4E11, 0xA4A2, 0x4E10, 0xA4A3, 0x4E0D, 0xA4A4, 0x4E2D, 0xA4A5, 0x4E30, 0xA4A6, 0x4E39, 0xA4A7, 0x4E4B, 0xA4A8, 0x5C39, + 0xA4A9, 0x4E88, 0xA4AA, 0x4E91, 0xA4AB, 0x4E95, 0xA4AC, 0x4E92, 0xA4AD, 0x4E94, 0xA4AE, 0x4EA2, 0xA4AF, 0x4EC1, 0xA4B0, 0x4EC0, + 0xA4B1, 0x4EC3, 0xA4B2, 0x4EC6, 0xA4B3, 0x4EC7, 0xA4B4, 0x4ECD, 0xA4B5, 0x4ECA, 0xA4B6, 0x4ECB, 0xA4B7, 0x4EC4, 0xA4B8, 0x5143, + 0xA4B9, 0x5141, 0xA4BA, 0x5167, 0xA4BB, 0x516D, 0xA4BC, 0x516E, 0xA4BD, 0x516C, 0xA4BE, 0x5197, 0xA4BF, 0x51F6, 0xA4C0, 0x5206, + 0xA4C1, 0x5207, 0xA4C2, 0x5208, 0xA4C3, 0x52FB, 0xA4C4, 0x52FE, 0xA4C5, 0x52FF, 0xA4C6, 0x5316, 0xA4C7, 0x5339, 0xA4C8, 0x5348, + 0xA4C9, 0x5347, 0xA4CA, 0x5345, 0xA4CB, 0x535E, 0xA4CC, 0x5384, 0xA4CD, 0x53CB, 0xA4CE, 0x53CA, 0xA4CF, 0x53CD, 0xA4D0, 0x58EC, + 0xA4D1, 0x5929, 0xA4D2, 0x592B, 0xA4D3, 0x592A, 0xA4D4, 0x592D, 0xA4D5, 0x5B54, 0xA4D6, 0x5C11, 0xA4D7, 0x5C24, 0xA4D8, 0x5C3A, + 0xA4D9, 0x5C6F, 0xA4DA, 0x5DF4, 0xA4DB, 0x5E7B, 0xA4DC, 0x5EFF, 0xA4DD, 0x5F14, 0xA4DE, 0x5F15, 0xA4DF, 0x5FC3, 0xA4E0, 0x6208, + 0xA4E1, 0x6236, 0xA4E2, 0x624B, 0xA4E3, 0x624E, 0xA4E4, 0x652F, 0xA4E5, 0x6587, 0xA4E6, 0x6597, 0xA4E7, 0x65A4, 0xA4E8, 0x65B9, + 0xA4E9, 0x65E5, 0xA4EA, 0x66F0, 0xA4EB, 0x6708, 0xA4EC, 0x6728, 0xA4ED, 0x6B20, 0xA4EE, 0x6B62, 0xA4EF, 0x6B79, 0xA4F0, 0x6BCB, + 0xA4F1, 0x6BD4, 0xA4F2, 0x6BDB, 0xA4F3, 0x6C0F, 0xA4F4, 0x6C34, 0xA4F5, 0x706B, 0xA4F6, 0x722A, 0xA4F7, 0x7236, 0xA4F8, 0x723B, + 0xA4F9, 0x7247, 0xA4FA, 0x7259, 0xA4FB, 0x725B, 0xA4FC, 0x72AC, 0xA4FD, 0x738B, 0xA4FE, 0x4E19, 0xA540, 0x4E16, 0xA541, 0x4E15, + 0xA542, 0x4E14, 0xA543, 0x4E18, 0xA544, 0x4E3B, 0xA545, 0x4E4D, 0xA546, 0x4E4F, 0xA547, 0x4E4E, 0xA548, 0x4EE5, 0xA549, 0x4ED8, + 0xA54A, 0x4ED4, 0xA54B, 0x4ED5, 0xA54C, 0x4ED6, 0xA54D, 0x4ED7, 0xA54E, 0x4EE3, 0xA54F, 0x4EE4, 0xA550, 0x4ED9, 0xA551, 0x4EDE, + 0xA552, 0x5145, 0xA553, 0x5144, 0xA554, 0x5189, 0xA555, 0x518A, 0xA556, 0x51AC, 0xA557, 0x51F9, 0xA558, 0x51FA, 0xA559, 0x51F8, + 0xA55A, 0x520A, 0xA55B, 0x52A0, 0xA55C, 0x529F, 0xA55D, 0x5305, 0xA55E, 0x5306, 0xA55F, 0x5317, 0xA560, 0x531D, 0xA561, 0x4EDF, + 0xA562, 0x534A, 0xA563, 0x5349, 0xA564, 0x5361, 0xA565, 0x5360, 0xA566, 0x536F, 0xA567, 0x536E, 0xA568, 0x53BB, 0xA569, 0x53EF, + 0xA56A, 0x53E4, 0xA56B, 0x53F3, 0xA56C, 0x53EC, 0xA56D, 0x53EE, 0xA56E, 0x53E9, 0xA56F, 0x53E8, 0xA570, 0x53FC, 0xA571, 0x53F8, + 0xA572, 0x53F5, 0xA573, 0x53EB, 0xA574, 0x53E6, 0xA575, 0x53EA, 0xA576, 0x53F2, 0xA577, 0x53F1, 0xA578, 0x53F0, 0xA579, 0x53E5, + 0xA57A, 0x53ED, 0xA57B, 0x53FB, 0xA57C, 0x56DB, 0xA57D, 0x56DA, 0xA57E, 0x5916, 0xA5A1, 0x592E, 0xA5A2, 0x5931, 0xA5A3, 0x5974, + 0xA5A4, 0x5976, 0xA5A5, 0x5B55, 0xA5A6, 0x5B83, 0xA5A7, 0x5C3C, 0xA5A8, 0x5DE8, 0xA5A9, 0x5DE7, 0xA5AA, 0x5DE6, 0xA5AB, 0x5E02, + 0xA5AC, 0x5E03, 0xA5AD, 0x5E73, 0xA5AE, 0x5E7C, 0xA5AF, 0x5F01, 0xA5B0, 0x5F18, 0xA5B1, 0x5F17, 0xA5B2, 0x5FC5, 0xA5B3, 0x620A, + 0xA5B4, 0x6253, 0xA5B5, 0x6254, 0xA5B6, 0x6252, 0xA5B7, 0x6251, 0xA5B8, 0x65A5, 0xA5B9, 0x65E6, 0xA5BA, 0x672E, 0xA5BB, 0x672C, + 0xA5BC, 0x672A, 0xA5BD, 0x672B, 0xA5BE, 0x672D, 0xA5BF, 0x6B63, 0xA5C0, 0x6BCD, 0xA5C1, 0x6C11, 0xA5C2, 0x6C10, 0xA5C3, 0x6C38, + 0xA5C4, 0x6C41, 0xA5C5, 0x6C40, 0xA5C6, 0x6C3E, 0xA5C7, 0x72AF, 0xA5C8, 0x7384, 0xA5C9, 0x7389, 0xA5CA, 0x74DC, 0xA5CB, 0x74E6, + 0xA5CC, 0x7518, 0xA5CD, 0x751F, 0xA5CE, 0x7528, 0xA5CF, 0x7529, 0xA5D0, 0x7530, 0xA5D1, 0x7531, 0xA5D2, 0x7532, 0xA5D3, 0x7533, + 0xA5D4, 0x758B, 0xA5D5, 0x767D, 0xA5D6, 0x76AE, 0xA5D7, 0x76BF, 0xA5D8, 0x76EE, 0xA5D9, 0x77DB, 0xA5DA, 0x77E2, 0xA5DB, 0x77F3, + 0xA5DC, 0x793A, 0xA5DD, 0x79BE, 0xA5DE, 0x7A74, 0xA5DF, 0x7ACB, 0xA5E0, 0x4E1E, 0xA5E1, 0x4E1F, 0xA5E2, 0x4E52, 0xA5E3, 0x4E53, + 0xA5E4, 0x4E69, 0xA5E5, 0x4E99, 0xA5E6, 0x4EA4, 0xA5E7, 0x4EA6, 0xA5E8, 0x4EA5, 0xA5E9, 0x4EFF, 0xA5EA, 0x4F09, 0xA5EB, 0x4F19, + 0xA5EC, 0x4F0A, 0xA5ED, 0x4F15, 0xA5EE, 0x4F0D, 0xA5EF, 0x4F10, 0xA5F0, 0x4F11, 0xA5F1, 0x4F0F, 0xA5F2, 0x4EF2, 0xA5F3, 0x4EF6, + 0xA5F4, 0x4EFB, 0xA5F5, 0x4EF0, 0xA5F6, 0x4EF3, 0xA5F7, 0x4EFD, 0xA5F8, 0x4F01, 0xA5F9, 0x4F0B, 0xA5FA, 0x5149, 0xA5FB, 0x5147, + 0xA5FC, 0x5146, 0xA5FD, 0x5148, 0xA5FE, 0x5168, 0xA640, 0x5171, 0xA641, 0x518D, 0xA642, 0x51B0, 0xA643, 0x5217, 0xA644, 0x5211, + 0xA645, 0x5212, 0xA646, 0x520E, 0xA647, 0x5216, 0xA648, 0x52A3, 0xA649, 0x5308, 0xA64A, 0x5321, 0xA64B, 0x5320, 0xA64C, 0x5370, + 0xA64D, 0x5371, 0xA64E, 0x5409, 0xA64F, 0x540F, 0xA650, 0x540C, 0xA651, 0x540A, 0xA652, 0x5410, 0xA653, 0x5401, 0xA654, 0x540B, + 0xA655, 0x5404, 0xA656, 0x5411, 0xA657, 0x540D, 0xA658, 0x5408, 0xA659, 0x5403, 0xA65A, 0x540E, 0xA65B, 0x5406, 0xA65C, 0x5412, + 0xA65D, 0x56E0, 0xA65E, 0x56DE, 0xA65F, 0x56DD, 0xA660, 0x5733, 0xA661, 0x5730, 0xA662, 0x5728, 0xA663, 0x572D, 0xA664, 0x572C, + 0xA665, 0x572F, 0xA666, 0x5729, 0xA667, 0x5919, 0xA668, 0x591A, 0xA669, 0x5937, 0xA66A, 0x5938, 0xA66B, 0x5984, 0xA66C, 0x5978, + 0xA66D, 0x5983, 0xA66E, 0x597D, 0xA66F, 0x5979, 0xA670, 0x5982, 0xA671, 0x5981, 0xA672, 0x5B57, 0xA673, 0x5B58, 0xA674, 0x5B87, + 0xA675, 0x5B88, 0xA676, 0x5B85, 0xA677, 0x5B89, 0xA678, 0x5BFA, 0xA679, 0x5C16, 0xA67A, 0x5C79, 0xA67B, 0x5DDE, 0xA67C, 0x5E06, + 0xA67D, 0x5E76, 0xA67E, 0x5E74, 0xA6A1, 0x5F0F, 0xA6A2, 0x5F1B, 0xA6A3, 0x5FD9, 0xA6A4, 0x5FD6, 0xA6A5, 0x620E, 0xA6A6, 0x620C, + 0xA6A7, 0x620D, 0xA6A8, 0x6210, 0xA6A9, 0x6263, 0xA6AA, 0x625B, 0xA6AB, 0x6258, 0xA6AC, 0x6536, 0xA6AD, 0x65E9, 0xA6AE, 0x65E8, + 0xA6AF, 0x65EC, 0xA6B0, 0x65ED, 0xA6B1, 0x66F2, 0xA6B2, 0x66F3, 0xA6B3, 0x6709, 0xA6B4, 0x673D, 0xA6B5, 0x6734, 0xA6B6, 0x6731, + 0xA6B7, 0x6735, 0xA6B8, 0x6B21, 0xA6B9, 0x6B64, 0xA6BA, 0x6B7B, 0xA6BB, 0x6C16, 0xA6BC, 0x6C5D, 0xA6BD, 0x6C57, 0xA6BE, 0x6C59, + 0xA6BF, 0x6C5F, 0xA6C0, 0x6C60, 0xA6C1, 0x6C50, 0xA6C2, 0x6C55, 0xA6C3, 0x6C61, 0xA6C4, 0x6C5B, 0xA6C5, 0x6C4D, 0xA6C6, 0x6C4E, + 0xA6C7, 0x7070, 0xA6C8, 0x725F, 0xA6C9, 0x725D, 0xA6CA, 0x767E, 0xA6CB, 0x7AF9, 0xA6CC, 0x7C73, 0xA6CD, 0x7CF8, 0xA6CE, 0x7F36, + 0xA6CF, 0x7F8A, 0xA6D0, 0x7FBD, 0xA6D1, 0x8001, 0xA6D2, 0x8003, 0xA6D3, 0x800C, 0xA6D4, 0x8012, 0xA6D5, 0x8033, 0xA6D6, 0x807F, + 0xA6D7, 0x8089, 0xA6D8, 0x808B, 0xA6D9, 0x808C, 0xA6DA, 0x81E3, 0xA6DB, 0x81EA, 0xA6DC, 0x81F3, 0xA6DD, 0x81FC, 0xA6DE, 0x820C, + 0xA6DF, 0x821B, 0xA6E0, 0x821F, 0xA6E1, 0x826E, 0xA6E2, 0x8272, 0xA6E3, 0x827E, 0xA6E4, 0x866B, 0xA6E5, 0x8840, 0xA6E6, 0x884C, + 0xA6E7, 0x8863, 0xA6E8, 0x897F, 0xA6E9, 0x9621, 0xA6EA, 0x4E32, 0xA6EB, 0x4EA8, 0xA6EC, 0x4F4D, 0xA6ED, 0x4F4F, 0xA6EE, 0x4F47, + 0xA6EF, 0x4F57, 0xA6F0, 0x4F5E, 0xA6F1, 0x4F34, 0xA6F2, 0x4F5B, 0xA6F3, 0x4F55, 0xA6F4, 0x4F30, 0xA6F5, 0x4F50, 0xA6F6, 0x4F51, + 0xA6F7, 0x4F3D, 0xA6F8, 0x4F3A, 0xA6F9, 0x4F38, 0xA6FA, 0x4F43, 0xA6FB, 0x4F54, 0xA6FC, 0x4F3C, 0xA6FD, 0x4F46, 0xA6FE, 0x4F63, + 0xA740, 0x4F5C, 0xA741, 0x4F60, 0xA742, 0x4F2F, 0xA743, 0x4F4E, 0xA744, 0x4F36, 0xA745, 0x4F59, 0xA746, 0x4F5D, 0xA747, 0x4F48, + 0xA748, 0x4F5A, 0xA749, 0x514C, 0xA74A, 0x514B, 0xA74B, 0x514D, 0xA74C, 0x5175, 0xA74D, 0x51B6, 0xA74E, 0x51B7, 0xA74F, 0x5225, + 0xA750, 0x5224, 0xA751, 0x5229, 0xA752, 0x522A, 0xA753, 0x5228, 0xA754, 0x52AB, 0xA755, 0x52A9, 0xA756, 0x52AA, 0xA757, 0x52AC, + 0xA758, 0x5323, 0xA759, 0x5373, 0xA75A, 0x5375, 0xA75B, 0x541D, 0xA75C, 0x542D, 0xA75D, 0x541E, 0xA75E, 0x543E, 0xA75F, 0x5426, + 0xA760, 0x544E, 0xA761, 0x5427, 0xA762, 0x5446, 0xA763, 0x5443, 0xA764, 0x5433, 0xA765, 0x5448, 0xA766, 0x5442, 0xA767, 0x541B, + 0xA768, 0x5429, 0xA769, 0x544A, 0xA76A, 0x5439, 0xA76B, 0x543B, 0xA76C, 0x5438, 0xA76D, 0x542E, 0xA76E, 0x5435, 0xA76F, 0x5436, + 0xA770, 0x5420, 0xA771, 0x543C, 0xA772, 0x5440, 0xA773, 0x5431, 0xA774, 0x542B, 0xA775, 0x541F, 0xA776, 0x542C, 0xA777, 0x56EA, + 0xA778, 0x56F0, 0xA779, 0x56E4, 0xA77A, 0x56EB, 0xA77B, 0x574A, 0xA77C, 0x5751, 0xA77D, 0x5740, 0xA77E, 0x574D, 0xA7A1, 0x5747, + 0xA7A2, 0x574E, 0xA7A3, 0x573E, 0xA7A4, 0x5750, 0xA7A5, 0x574F, 0xA7A6, 0x573B, 0xA7A7, 0x58EF, 0xA7A8, 0x593E, 0xA7A9, 0x599D, + 0xA7AA, 0x5992, 0xA7AB, 0x59A8, 0xA7AC, 0x599E, 0xA7AD, 0x59A3, 0xA7AE, 0x5999, 0xA7AF, 0x5996, 0xA7B0, 0x598D, 0xA7B1, 0x59A4, + 0xA7B2, 0x5993, 0xA7B3, 0x598A, 0xA7B4, 0x59A5, 0xA7B5, 0x5B5D, 0xA7B6, 0x5B5C, 0xA7B7, 0x5B5A, 0xA7B8, 0x5B5B, 0xA7B9, 0x5B8C, + 0xA7BA, 0x5B8B, 0xA7BB, 0x5B8F, 0xA7BC, 0x5C2C, 0xA7BD, 0x5C40, 0xA7BE, 0x5C41, 0xA7BF, 0x5C3F, 0xA7C0, 0x5C3E, 0xA7C1, 0x5C90, + 0xA7C2, 0x5C91, 0xA7C3, 0x5C94, 0xA7C4, 0x5C8C, 0xA7C5, 0x5DEB, 0xA7C6, 0x5E0C, 0xA7C7, 0x5E8F, 0xA7C8, 0x5E87, 0xA7C9, 0x5E8A, + 0xA7CA, 0x5EF7, 0xA7CB, 0x5F04, 0xA7CC, 0x5F1F, 0xA7CD, 0x5F64, 0xA7CE, 0x5F62, 0xA7CF, 0x5F77, 0xA7D0, 0x5F79, 0xA7D1, 0x5FD8, + 0xA7D2, 0x5FCC, 0xA7D3, 0x5FD7, 0xA7D4, 0x5FCD, 0xA7D5, 0x5FF1, 0xA7D6, 0x5FEB, 0xA7D7, 0x5FF8, 0xA7D8, 0x5FEA, 0xA7D9, 0x6212, + 0xA7DA, 0x6211, 0xA7DB, 0x6284, 0xA7DC, 0x6297, 0xA7DD, 0x6296, 0xA7DE, 0x6280, 0xA7DF, 0x6276, 0xA7E0, 0x6289, 0xA7E1, 0x626D, + 0xA7E2, 0x628A, 0xA7E3, 0x627C, 0xA7E4, 0x627E, 0xA7E5, 0x6279, 0xA7E6, 0x6273, 0xA7E7, 0x6292, 0xA7E8, 0x626F, 0xA7E9, 0x6298, + 0xA7EA, 0x626E, 0xA7EB, 0x6295, 0xA7EC, 0x6293, 0xA7ED, 0x6291, 0xA7EE, 0x6286, 0xA7EF, 0x6539, 0xA7F0, 0x653B, 0xA7F1, 0x6538, + 0xA7F2, 0x65F1, 0xA7F3, 0x66F4, 0xA7F4, 0x675F, 0xA7F5, 0x674E, 0xA7F6, 0x674F, 0xA7F7, 0x6750, 0xA7F8, 0x6751, 0xA7F9, 0x675C, + 0xA7FA, 0x6756, 0xA7FB, 0x675E, 0xA7FC, 0x6749, 0xA7FD, 0x6746, 0xA7FE, 0x6760, 0xA840, 0x6753, 0xA841, 0x6757, 0xA842, 0x6B65, + 0xA843, 0x6BCF, 0xA844, 0x6C42, 0xA845, 0x6C5E, 0xA846, 0x6C99, 0xA847, 0x6C81, 0xA848, 0x6C88, 0xA849, 0x6C89, 0xA84A, 0x6C85, + 0xA84B, 0x6C9B, 0xA84C, 0x6C6A, 0xA84D, 0x6C7A, 0xA84E, 0x6C90, 0xA84F, 0x6C70, 0xA850, 0x6C8C, 0xA851, 0x6C68, 0xA852, 0x6C96, + 0xA853, 0x6C92, 0xA854, 0x6C7D, 0xA855, 0x6C83, 0xA856, 0x6C72, 0xA857, 0x6C7E, 0xA858, 0x6C74, 0xA859, 0x6C86, 0xA85A, 0x6C76, + 0xA85B, 0x6C8D, 0xA85C, 0x6C94, 0xA85D, 0x6C98, 0xA85E, 0x6C82, 0xA85F, 0x7076, 0xA860, 0x707C, 0xA861, 0x707D, 0xA862, 0x7078, + 0xA863, 0x7262, 0xA864, 0x7261, 0xA865, 0x7260, 0xA866, 0x72C4, 0xA867, 0x72C2, 0xA868, 0x7396, 0xA869, 0x752C, 0xA86A, 0x752B, + 0xA86B, 0x7537, 0xA86C, 0x7538, 0xA86D, 0x7682, 0xA86E, 0x76EF, 0xA86F, 0x77E3, 0xA870, 0x79C1, 0xA871, 0x79C0, 0xA872, 0x79BF, + 0xA873, 0x7A76, 0xA874, 0x7CFB, 0xA875, 0x7F55, 0xA876, 0x8096, 0xA877, 0x8093, 0xA878, 0x809D, 0xA879, 0x8098, 0xA87A, 0x809B, + 0xA87B, 0x809A, 0xA87C, 0x80B2, 0xA87D, 0x826F, 0xA87E, 0x8292, 0xA8A1, 0x828B, 0xA8A2, 0x828D, 0xA8A3, 0x898B, 0xA8A4, 0x89D2, + 0xA8A5, 0x8A00, 0xA8A6, 0x8C37, 0xA8A7, 0x8C46, 0xA8A8, 0x8C55, 0xA8A9, 0x8C9D, 0xA8AA, 0x8D64, 0xA8AB, 0x8D70, 0xA8AC, 0x8DB3, + 0xA8AD, 0x8EAB, 0xA8AE, 0x8ECA, 0xA8AF, 0x8F9B, 0xA8B0, 0x8FB0, 0xA8B1, 0x8FC2, 0xA8B2, 0x8FC6, 0xA8B3, 0x8FC5, 0xA8B4, 0x8FC4, + 0xA8B5, 0x5DE1, 0xA8B6, 0x9091, 0xA8B7, 0x90A2, 0xA8B8, 0x90AA, 0xA8B9, 0x90A6, 0xA8BA, 0x90A3, 0xA8BB, 0x9149, 0xA8BC, 0x91C6, + 0xA8BD, 0x91CC, 0xA8BE, 0x9632, 0xA8BF, 0x962E, 0xA8C0, 0x9631, 0xA8C1, 0x962A, 0xA8C2, 0x962C, 0xA8C3, 0x4E26, 0xA8C4, 0x4E56, + 0xA8C5, 0x4E73, 0xA8C6, 0x4E8B, 0xA8C7, 0x4E9B, 0xA8C8, 0x4E9E, 0xA8C9, 0x4EAB, 0xA8CA, 0x4EAC, 0xA8CB, 0x4F6F, 0xA8CC, 0x4F9D, + 0xA8CD, 0x4F8D, 0xA8CE, 0x4F73, 0xA8CF, 0x4F7F, 0xA8D0, 0x4F6C, 0xA8D1, 0x4F9B, 0xA8D2, 0x4F8B, 0xA8D3, 0x4F86, 0xA8D4, 0x4F83, + 0xA8D5, 0x4F70, 0xA8D6, 0x4F75, 0xA8D7, 0x4F88, 0xA8D8, 0x4F69, 0xA8D9, 0x4F7B, 0xA8DA, 0x4F96, 0xA8DB, 0x4F7E, 0xA8DC, 0x4F8F, + 0xA8DD, 0x4F91, 0xA8DE, 0x4F7A, 0xA8DF, 0x5154, 0xA8E0, 0x5152, 0xA8E1, 0x5155, 0xA8E2, 0x5169, 0xA8E3, 0x5177, 0xA8E4, 0x5176, + 0xA8E5, 0x5178, 0xA8E6, 0x51BD, 0xA8E7, 0x51FD, 0xA8E8, 0x523B, 0xA8E9, 0x5238, 0xA8EA, 0x5237, 0xA8EB, 0x523A, 0xA8EC, 0x5230, + 0xA8ED, 0x522E, 0xA8EE, 0x5236, 0xA8EF, 0x5241, 0xA8F0, 0x52BE, 0xA8F1, 0x52BB, 0xA8F2, 0x5352, 0xA8F3, 0x5354, 0xA8F4, 0x5353, + 0xA8F5, 0x5351, 0xA8F6, 0x5366, 0xA8F7, 0x5377, 0xA8F8, 0x5378, 0xA8F9, 0x5379, 0xA8FA, 0x53D6, 0xA8FB, 0x53D4, 0xA8FC, 0x53D7, + 0xA8FD, 0x5473, 0xA8FE, 0x5475, 0xA940, 0x5496, 0xA941, 0x5478, 0xA942, 0x5495, 0xA943, 0x5480, 0xA944, 0x547B, 0xA945, 0x5477, + 0xA946, 0x5484, 0xA947, 0x5492, 0xA948, 0x5486, 0xA949, 0x547C, 0xA94A, 0x5490, 0xA94B, 0x5471, 0xA94C, 0x5476, 0xA94D, 0x548C, + 0xA94E, 0x549A, 0xA94F, 0x5462, 0xA950, 0x5468, 0xA951, 0x548B, 0xA952, 0x547D, 0xA953, 0x548E, 0xA954, 0x56FA, 0xA955, 0x5783, + 0xA956, 0x5777, 0xA957, 0x576A, 0xA958, 0x5769, 0xA959, 0x5761, 0xA95A, 0x5766, 0xA95B, 0x5764, 0xA95C, 0x577C, 0xA95D, 0x591C, + 0xA95E, 0x5949, 0xA95F, 0x5947, 0xA960, 0x5948, 0xA961, 0x5944, 0xA962, 0x5954, 0xA963, 0x59BE, 0xA964, 0x59BB, 0xA965, 0x59D4, + 0xA966, 0x59B9, 0xA967, 0x59AE, 0xA968, 0x59D1, 0xA969, 0x59C6, 0xA96A, 0x59D0, 0xA96B, 0x59CD, 0xA96C, 0x59CB, 0xA96D, 0x59D3, + 0xA96E, 0x59CA, 0xA96F, 0x59AF, 0xA970, 0x59B3, 0xA971, 0x59D2, 0xA972, 0x59C5, 0xA973, 0x5B5F, 0xA974, 0x5B64, 0xA975, 0x5B63, + 0xA976, 0x5B97, 0xA977, 0x5B9A, 0xA978, 0x5B98, 0xA979, 0x5B9C, 0xA97A, 0x5B99, 0xA97B, 0x5B9B, 0xA97C, 0x5C1A, 0xA97D, 0x5C48, + 0xA97E, 0x5C45, 0xA9A1, 0x5C46, 0xA9A2, 0x5CB7, 0xA9A3, 0x5CA1, 0xA9A4, 0x5CB8, 0xA9A5, 0x5CA9, 0xA9A6, 0x5CAB, 0xA9A7, 0x5CB1, + 0xA9A8, 0x5CB3, 0xA9A9, 0x5E18, 0xA9AA, 0x5E1A, 0xA9AB, 0x5E16, 0xA9AC, 0x5E15, 0xA9AD, 0x5E1B, 0xA9AE, 0x5E11, 0xA9AF, 0x5E78, + 0xA9B0, 0x5E9A, 0xA9B1, 0x5E97, 0xA9B2, 0x5E9C, 0xA9B3, 0x5E95, 0xA9B4, 0x5E96, 0xA9B5, 0x5EF6, 0xA9B6, 0x5F26, 0xA9B7, 0x5F27, + 0xA9B8, 0x5F29, 0xA9B9, 0x5F80, 0xA9BA, 0x5F81, 0xA9BB, 0x5F7F, 0xA9BC, 0x5F7C, 0xA9BD, 0x5FDD, 0xA9BE, 0x5FE0, 0xA9BF, 0x5FFD, + 0xA9C0, 0x5FF5, 0xA9C1, 0x5FFF, 0xA9C2, 0x600F, 0xA9C3, 0x6014, 0xA9C4, 0x602F, 0xA9C5, 0x6035, 0xA9C6, 0x6016, 0xA9C7, 0x602A, + 0xA9C8, 0x6015, 0xA9C9, 0x6021, 0xA9CA, 0x6027, 0xA9CB, 0x6029, 0xA9CC, 0x602B, 0xA9CD, 0x601B, 0xA9CE, 0x6216, 0xA9CF, 0x6215, + 0xA9D0, 0x623F, 0xA9D1, 0x623E, 0xA9D2, 0x6240, 0xA9D3, 0x627F, 0xA9D4, 0x62C9, 0xA9D5, 0x62CC, 0xA9D6, 0x62C4, 0xA9D7, 0x62BF, + 0xA9D8, 0x62C2, 0xA9D9, 0x62B9, 0xA9DA, 0x62D2, 0xA9DB, 0x62DB, 0xA9DC, 0x62AB, 0xA9DD, 0x62D3, 0xA9DE, 0x62D4, 0xA9DF, 0x62CB, + 0xA9E0, 0x62C8, 0xA9E1, 0x62A8, 0xA9E2, 0x62BD, 0xA9E3, 0x62BC, 0xA9E4, 0x62D0, 0xA9E5, 0x62D9, 0xA9E6, 0x62C7, 0xA9E7, 0x62CD, + 0xA9E8, 0x62B5, 0xA9E9, 0x62DA, 0xA9EA, 0x62B1, 0xA9EB, 0x62D8, 0xA9EC, 0x62D6, 0xA9ED, 0x62D7, 0xA9EE, 0x62C6, 0xA9EF, 0x62AC, + 0xA9F0, 0x62CE, 0xA9F1, 0x653E, 0xA9F2, 0x65A7, 0xA9F3, 0x65BC, 0xA9F4, 0x65FA, 0xA9F5, 0x6614, 0xA9F6, 0x6613, 0xA9F7, 0x660C, + 0xA9F8, 0x6606, 0xA9F9, 0x6602, 0xA9FA, 0x660E, 0xA9FB, 0x6600, 0xA9FC, 0x660F, 0xA9FD, 0x6615, 0xA9FE, 0x660A, 0xAA40, 0x6607, + 0xAA41, 0x670D, 0xAA42, 0x670B, 0xAA43, 0x676D, 0xAA44, 0x678B, 0xAA45, 0x6795, 0xAA46, 0x6771, 0xAA47, 0x679C, 0xAA48, 0x6773, + 0xAA49, 0x6777, 0xAA4A, 0x6787, 0xAA4B, 0x679D, 0xAA4C, 0x6797, 0xAA4D, 0x676F, 0xAA4E, 0x6770, 0xAA4F, 0x677F, 0xAA50, 0x6789, + 0xAA51, 0x677E, 0xAA52, 0x6790, 0xAA53, 0x6775, 0xAA54, 0x679A, 0xAA55, 0x6793, 0xAA56, 0x677C, 0xAA57, 0x676A, 0xAA58, 0x6772, + 0xAA59, 0x6B23, 0xAA5A, 0x6B66, 0xAA5B, 0x6B67, 0xAA5C, 0x6B7F, 0xAA5D, 0x6C13, 0xAA5E, 0x6C1B, 0xAA5F, 0x6CE3, 0xAA60, 0x6CE8, + 0xAA61, 0x6CF3, 0xAA62, 0x6CB1, 0xAA63, 0x6CCC, 0xAA64, 0x6CE5, 0xAA65, 0x6CB3, 0xAA66, 0x6CBD, 0xAA67, 0x6CBE, 0xAA68, 0x6CBC, + 0xAA69, 0x6CE2, 0xAA6A, 0x6CAB, 0xAA6B, 0x6CD5, 0xAA6C, 0x6CD3, 0xAA6D, 0x6CB8, 0xAA6E, 0x6CC4, 0xAA6F, 0x6CB9, 0xAA70, 0x6CC1, + 0xAA71, 0x6CAE, 0xAA72, 0x6CD7, 0xAA73, 0x6CC5, 0xAA74, 0x6CF1, 0xAA75, 0x6CBF, 0xAA76, 0x6CBB, 0xAA77, 0x6CE1, 0xAA78, 0x6CDB, + 0xAA79, 0x6CCA, 0xAA7A, 0x6CAC, 0xAA7B, 0x6CEF, 0xAA7C, 0x6CDC, 0xAA7D, 0x6CD6, 0xAA7E, 0x6CE0, 0xAAA1, 0x7095, 0xAAA2, 0x708E, + 0xAAA3, 0x7092, 0xAAA4, 0x708A, 0xAAA5, 0x7099, 0xAAA6, 0x722C, 0xAAA7, 0x722D, 0xAAA8, 0x7238, 0xAAA9, 0x7248, 0xAAAA, 0x7267, + 0xAAAB, 0x7269, 0xAAAC, 0x72C0, 0xAAAD, 0x72CE, 0xAAAE, 0x72D9, 0xAAAF, 0x72D7, 0xAAB0, 0x72D0, 0xAAB1, 0x73A9, 0xAAB2, 0x73A8, + 0xAAB3, 0x739F, 0xAAB4, 0x73AB, 0xAAB5, 0x73A5, 0xAAB6, 0x753D, 0xAAB7, 0x759D, 0xAAB8, 0x7599, 0xAAB9, 0x759A, 0xAABA, 0x7684, + 0xAABB, 0x76C2, 0xAABC, 0x76F2, 0xAABD, 0x76F4, 0xAABE, 0x77E5, 0xAABF, 0x77FD, 0xAAC0, 0x793E, 0xAAC1, 0x7940, 0xAAC2, 0x7941, + 0xAAC3, 0x79C9, 0xAAC4, 0x79C8, 0xAAC5, 0x7A7A, 0xAAC6, 0x7A79, 0xAAC7, 0x7AFA, 0xAAC8, 0x7CFE, 0xAAC9, 0x7F54, 0xAACA, 0x7F8C, + 0xAACB, 0x7F8B, 0xAACC, 0x8005, 0xAACD, 0x80BA, 0xAACE, 0x80A5, 0xAACF, 0x80A2, 0xAAD0, 0x80B1, 0xAAD1, 0x80A1, 0xAAD2, 0x80AB, + 0xAAD3, 0x80A9, 0xAAD4, 0x80B4, 0xAAD5, 0x80AA, 0xAAD6, 0x80AF, 0xAAD7, 0x81E5, 0xAAD8, 0x81FE, 0xAAD9, 0x820D, 0xAADA, 0x82B3, + 0xAADB, 0x829D, 0xAADC, 0x8299, 0xAADD, 0x82AD, 0xAADE, 0x82BD, 0xAADF, 0x829F, 0xAAE0, 0x82B9, 0xAAE1, 0x82B1, 0xAAE2, 0x82AC, + 0xAAE3, 0x82A5, 0xAAE4, 0x82AF, 0xAAE5, 0x82B8, 0xAAE6, 0x82A3, 0xAAE7, 0x82B0, 0xAAE8, 0x82BE, 0xAAE9, 0x82B7, 0xAAEA, 0x864E, + 0xAAEB, 0x8671, 0xAAEC, 0x521D, 0xAAED, 0x8868, 0xAAEE, 0x8ECB, 0xAAEF, 0x8FCE, 0xAAF0, 0x8FD4, 0xAAF1, 0x8FD1, 0xAAF2, 0x90B5, + 0xAAF3, 0x90B8, 0xAAF4, 0x90B1, 0xAAF5, 0x90B6, 0xAAF6, 0x91C7, 0xAAF7, 0x91D1, 0xAAF8, 0x9577, 0xAAF9, 0x9580, 0xAAFA, 0x961C, + 0xAAFB, 0x9640, 0xAAFC, 0x963F, 0xAAFD, 0x963B, 0xAAFE, 0x9644, 0xAB40, 0x9642, 0xAB41, 0x96B9, 0xAB42, 0x96E8, 0xAB43, 0x9752, + 0xAB44, 0x975E, 0xAB45, 0x4E9F, 0xAB46, 0x4EAD, 0xAB47, 0x4EAE, 0xAB48, 0x4FE1, 0xAB49, 0x4FB5, 0xAB4A, 0x4FAF, 0xAB4B, 0x4FBF, + 0xAB4C, 0x4FE0, 0xAB4D, 0x4FD1, 0xAB4E, 0x4FCF, 0xAB4F, 0x4FDD, 0xAB50, 0x4FC3, 0xAB51, 0x4FB6, 0xAB52, 0x4FD8, 0xAB53, 0x4FDF, + 0xAB54, 0x4FCA, 0xAB55, 0x4FD7, 0xAB56, 0x4FAE, 0xAB57, 0x4FD0, 0xAB58, 0x4FC4, 0xAB59, 0x4FC2, 0xAB5A, 0x4FDA, 0xAB5B, 0x4FCE, + 0xAB5C, 0x4FDE, 0xAB5D, 0x4FB7, 0xAB5E, 0x5157, 0xAB5F, 0x5192, 0xAB60, 0x5191, 0xAB61, 0x51A0, 0xAB62, 0x524E, 0xAB63, 0x5243, + 0xAB64, 0x524A, 0xAB65, 0x524D, 0xAB66, 0x524C, 0xAB67, 0x524B, 0xAB68, 0x5247, 0xAB69, 0x52C7, 0xAB6A, 0x52C9, 0xAB6B, 0x52C3, + 0xAB6C, 0x52C1, 0xAB6D, 0x530D, 0xAB6E, 0x5357, 0xAB6F, 0x537B, 0xAB70, 0x539A, 0xAB71, 0x53DB, 0xAB72, 0x54AC, 0xAB73, 0x54C0, + 0xAB74, 0x54A8, 0xAB75, 0x54CE, 0xAB76, 0x54C9, 0xAB77, 0x54B8, 0xAB78, 0x54A6, 0xAB79, 0x54B3, 0xAB7A, 0x54C7, 0xAB7B, 0x54C2, + 0xAB7C, 0x54BD, 0xAB7D, 0x54AA, 0xAB7E, 0x54C1, 0xABA1, 0x54C4, 0xABA2, 0x54C8, 0xABA3, 0x54AF, 0xABA4, 0x54AB, 0xABA5, 0x54B1, + 0xABA6, 0x54BB, 0xABA7, 0x54A9, 0xABA8, 0x54A7, 0xABA9, 0x54BF, 0xABAA, 0x56FF, 0xABAB, 0x5782, 0xABAC, 0x578B, 0xABAD, 0x57A0, + 0xABAE, 0x57A3, 0xABAF, 0x57A2, 0xABB0, 0x57CE, 0xABB1, 0x57AE, 0xABB2, 0x5793, 0xABB3, 0x5955, 0xABB4, 0x5951, 0xABB5, 0x594F, + 0xABB6, 0x594E, 0xABB7, 0x5950, 0xABB8, 0x59DC, 0xABB9, 0x59D8, 0xABBA, 0x59FF, 0xABBB, 0x59E3, 0xABBC, 0x59E8, 0xABBD, 0x5A03, + 0xABBE, 0x59E5, 0xABBF, 0x59EA, 0xABC0, 0x59DA, 0xABC1, 0x59E6, 0xABC2, 0x5A01, 0xABC3, 0x59FB, 0xABC4, 0x5B69, 0xABC5, 0x5BA3, + 0xABC6, 0x5BA6, 0xABC7, 0x5BA4, 0xABC8, 0x5BA2, 0xABC9, 0x5BA5, 0xABCA, 0x5C01, 0xABCB, 0x5C4E, 0xABCC, 0x5C4F, 0xABCD, 0x5C4D, + 0xABCE, 0x5C4B, 0xABCF, 0x5CD9, 0xABD0, 0x5CD2, 0xABD1, 0x5DF7, 0xABD2, 0x5E1D, 0xABD3, 0x5E25, 0xABD4, 0x5E1F, 0xABD5, 0x5E7D, + 0xABD6, 0x5EA0, 0xABD7, 0x5EA6, 0xABD8, 0x5EFA, 0xABD9, 0x5F08, 0xABDA, 0x5F2D, 0xABDB, 0x5F65, 0xABDC, 0x5F88, 0xABDD, 0x5F85, + 0xABDE, 0x5F8A, 0xABDF, 0x5F8B, 0xABE0, 0x5F87, 0xABE1, 0x5F8C, 0xABE2, 0x5F89, 0xABE3, 0x6012, 0xABE4, 0x601D, 0xABE5, 0x6020, + 0xABE6, 0x6025, 0xABE7, 0x600E, 0xABE8, 0x6028, 0xABE9, 0x604D, 0xABEA, 0x6070, 0xABEB, 0x6068, 0xABEC, 0x6062, 0xABED, 0x6046, + 0xABEE, 0x6043, 0xABEF, 0x606C, 0xABF0, 0x606B, 0xABF1, 0x606A, 0xABF2, 0x6064, 0xABF3, 0x6241, 0xABF4, 0x62DC, 0xABF5, 0x6316, + 0xABF6, 0x6309, 0xABF7, 0x62FC, 0xABF8, 0x62ED, 0xABF9, 0x6301, 0xABFA, 0x62EE, 0xABFB, 0x62FD, 0xABFC, 0x6307, 0xABFD, 0x62F1, + 0xABFE, 0x62F7, 0xAC40, 0x62EF, 0xAC41, 0x62EC, 0xAC42, 0x62FE, 0xAC43, 0x62F4, 0xAC44, 0x6311, 0xAC45, 0x6302, 0xAC46, 0x653F, + 0xAC47, 0x6545, 0xAC48, 0x65AB, 0xAC49, 0x65BD, 0xAC4A, 0x65E2, 0xAC4B, 0x6625, 0xAC4C, 0x662D, 0xAC4D, 0x6620, 0xAC4E, 0x6627, + 0xAC4F, 0x662F, 0xAC50, 0x661F, 0xAC51, 0x6628, 0xAC52, 0x6631, 0xAC53, 0x6624, 0xAC54, 0x66F7, 0xAC55, 0x67FF, 0xAC56, 0x67D3, + 0xAC57, 0x67F1, 0xAC58, 0x67D4, 0xAC59, 0x67D0, 0xAC5A, 0x67EC, 0xAC5B, 0x67B6, 0xAC5C, 0x67AF, 0xAC5D, 0x67F5, 0xAC5E, 0x67E9, + 0xAC5F, 0x67EF, 0xAC60, 0x67C4, 0xAC61, 0x67D1, 0xAC62, 0x67B4, 0xAC63, 0x67DA, 0xAC64, 0x67E5, 0xAC65, 0x67B8, 0xAC66, 0x67CF, + 0xAC67, 0x67DE, 0xAC68, 0x67F3, 0xAC69, 0x67B0, 0xAC6A, 0x67D9, 0xAC6B, 0x67E2, 0xAC6C, 0x67DD, 0xAC6D, 0x67D2, 0xAC6E, 0x6B6A, + 0xAC6F, 0x6B83, 0xAC70, 0x6B86, 0xAC71, 0x6BB5, 0xAC72, 0x6BD2, 0xAC73, 0x6BD7, 0xAC74, 0x6C1F, 0xAC75, 0x6CC9, 0xAC76, 0x6D0B, + 0xAC77, 0x6D32, 0xAC78, 0x6D2A, 0xAC79, 0x6D41, 0xAC7A, 0x6D25, 0xAC7B, 0x6D0C, 0xAC7C, 0x6D31, 0xAC7D, 0x6D1E, 0xAC7E, 0x6D17, + 0xACA1, 0x6D3B, 0xACA2, 0x6D3D, 0xACA3, 0x6D3E, 0xACA4, 0x6D36, 0xACA5, 0x6D1B, 0xACA6, 0x6CF5, 0xACA7, 0x6D39, 0xACA8, 0x6D27, + 0xACA9, 0x6D38, 0xACAA, 0x6D29, 0xACAB, 0x6D2E, 0xACAC, 0x6D35, 0xACAD, 0x6D0E, 0xACAE, 0x6D2B, 0xACAF, 0x70AB, 0xACB0, 0x70BA, + 0xACB1, 0x70B3, 0xACB2, 0x70AC, 0xACB3, 0x70AF, 0xACB4, 0x70AD, 0xACB5, 0x70B8, 0xACB6, 0x70AE, 0xACB7, 0x70A4, 0xACB8, 0x7230, + 0xACB9, 0x7272, 0xACBA, 0x726F, 0xACBB, 0x7274, 0xACBC, 0x72E9, 0xACBD, 0x72E0, 0xACBE, 0x72E1, 0xACBF, 0x73B7, 0xACC0, 0x73CA, + 0xACC1, 0x73BB, 0xACC2, 0x73B2, 0xACC3, 0x73CD, 0xACC4, 0x73C0, 0xACC5, 0x73B3, 0xACC6, 0x751A, 0xACC7, 0x752D, 0xACC8, 0x754F, + 0xACC9, 0x754C, 0xACCA, 0x754E, 0xACCB, 0x754B, 0xACCC, 0x75AB, 0xACCD, 0x75A4, 0xACCE, 0x75A5, 0xACCF, 0x75A2, 0xACD0, 0x75A3, + 0xACD1, 0x7678, 0xACD2, 0x7686, 0xACD3, 0x7687, 0xACD4, 0x7688, 0xACD5, 0x76C8, 0xACD6, 0x76C6, 0xACD7, 0x76C3, 0xACD8, 0x76C5, + 0xACD9, 0x7701, 0xACDA, 0x76F9, 0xACDB, 0x76F8, 0xACDC, 0x7709, 0xACDD, 0x770B, 0xACDE, 0x76FE, 0xACDF, 0x76FC, 0xACE0, 0x7707, + 0xACE1, 0x77DC, 0xACE2, 0x7802, 0xACE3, 0x7814, 0xACE4, 0x780C, 0xACE5, 0x780D, 0xACE6, 0x7946, 0xACE7, 0x7949, 0xACE8, 0x7948, + 0xACE9, 0x7947, 0xACEA, 0x79B9, 0xACEB, 0x79BA, 0xACEC, 0x79D1, 0xACED, 0x79D2, 0xACEE, 0x79CB, 0xACEF, 0x7A7F, 0xACF0, 0x7A81, + 0xACF1, 0x7AFF, 0xACF2, 0x7AFD, 0xACF3, 0x7C7D, 0xACF4, 0x7D02, 0xACF5, 0x7D05, 0xACF6, 0x7D00, 0xACF7, 0x7D09, 0xACF8, 0x7D07, + 0xACF9, 0x7D04, 0xACFA, 0x7D06, 0xACFB, 0x7F38, 0xACFC, 0x7F8E, 0xACFD, 0x7FBF, 0xACFE, 0x8004, 0xAD40, 0x8010, 0xAD41, 0x800D, + 0xAD42, 0x8011, 0xAD43, 0x8036, 0xAD44, 0x80D6, 0xAD45, 0x80E5, 0xAD46, 0x80DA, 0xAD47, 0x80C3, 0xAD48, 0x80C4, 0xAD49, 0x80CC, + 0xAD4A, 0x80E1, 0xAD4B, 0x80DB, 0xAD4C, 0x80CE, 0xAD4D, 0x80DE, 0xAD4E, 0x80E4, 0xAD4F, 0x80DD, 0xAD50, 0x81F4, 0xAD51, 0x8222, + 0xAD52, 0x82E7, 0xAD53, 0x8303, 0xAD54, 0x8305, 0xAD55, 0x82E3, 0xAD56, 0x82DB, 0xAD57, 0x82E6, 0xAD58, 0x8304, 0xAD59, 0x82E5, + 0xAD5A, 0x8302, 0xAD5B, 0x8309, 0xAD5C, 0x82D2, 0xAD5D, 0x82D7, 0xAD5E, 0x82F1, 0xAD5F, 0x8301, 0xAD60, 0x82DC, 0xAD61, 0x82D4, + 0xAD62, 0x82D1, 0xAD63, 0x82DE, 0xAD64, 0x82D3, 0xAD65, 0x82DF, 0xAD66, 0x82EF, 0xAD67, 0x8306, 0xAD68, 0x8650, 0xAD69, 0x8679, + 0xAD6A, 0x867B, 0xAD6B, 0x867A, 0xAD6C, 0x884D, 0xAD6D, 0x886B, 0xAD6E, 0x8981, 0xAD6F, 0x89D4, 0xAD70, 0x8A08, 0xAD71, 0x8A02, + 0xAD72, 0x8A03, 0xAD73, 0x8C9E, 0xAD74, 0x8CA0, 0xAD75, 0x8D74, 0xAD76, 0x8D73, 0xAD77, 0x8DB4, 0xAD78, 0x8ECD, 0xAD79, 0x8ECC, + 0xAD7A, 0x8FF0, 0xAD7B, 0x8FE6, 0xAD7C, 0x8FE2, 0xAD7D, 0x8FEA, 0xAD7E, 0x8FE5, 0xADA1, 0x8FED, 0xADA2, 0x8FEB, 0xADA3, 0x8FE4, + 0xADA4, 0x8FE8, 0xADA5, 0x90CA, 0xADA6, 0x90CE, 0xADA7, 0x90C1, 0xADA8, 0x90C3, 0xADA9, 0x914B, 0xADAA, 0x914A, 0xADAB, 0x91CD, + 0xADAC, 0x9582, 0xADAD, 0x9650, 0xADAE, 0x964B, 0xADAF, 0x964C, 0xADB0, 0x964D, 0xADB1, 0x9762, 0xADB2, 0x9769, 0xADB3, 0x97CB, + 0xADB4, 0x97ED, 0xADB5, 0x97F3, 0xADB6, 0x9801, 0xADB7, 0x98A8, 0xADB8, 0x98DB, 0xADB9, 0x98DF, 0xADBA, 0x9996, 0xADBB, 0x9999, + 0xADBC, 0x4E58, 0xADBD, 0x4EB3, 0xADBE, 0x500C, 0xADBF, 0x500D, 0xADC0, 0x5023, 0xADC1, 0x4FEF, 0xADC2, 0x5026, 0xADC3, 0x5025, + 0xADC4, 0x4FF8, 0xADC5, 0x5029, 0xADC6, 0x5016, 0xADC7, 0x5006, 0xADC8, 0x503C, 0xADC9, 0x501F, 0xADCA, 0x501A, 0xADCB, 0x5012, + 0xADCC, 0x5011, 0xADCD, 0x4FFA, 0xADCE, 0x5000, 0xADCF, 0x5014, 0xADD0, 0x5028, 0xADD1, 0x4FF1, 0xADD2, 0x5021, 0xADD3, 0x500B, + 0xADD4, 0x5019, 0xADD5, 0x5018, 0xADD6, 0x4FF3, 0xADD7, 0x4FEE, 0xADD8, 0x502D, 0xADD9, 0x502A, 0xADDA, 0x4FFE, 0xADDB, 0x502B, + 0xADDC, 0x5009, 0xADDD, 0x517C, 0xADDE, 0x51A4, 0xADDF, 0x51A5, 0xADE0, 0x51A2, 0xADE1, 0x51CD, 0xADE2, 0x51CC, 0xADE3, 0x51C6, + 0xADE4, 0x51CB, 0xADE5, 0x5256, 0xADE6, 0x525C, 0xADE7, 0x5254, 0xADE8, 0x525B, 0xADE9, 0x525D, 0xADEA, 0x532A, 0xADEB, 0x537F, + 0xADEC, 0x539F, 0xADED, 0x539D, 0xADEE, 0x53DF, 0xADEF, 0x54E8, 0xADF0, 0x5510, 0xADF1, 0x5501, 0xADF2, 0x5537, 0xADF3, 0x54FC, + 0xADF4, 0x54E5, 0xADF5, 0x54F2, 0xADF6, 0x5506, 0xADF7, 0x54FA, 0xADF8, 0x5514, 0xADF9, 0x54E9, 0xADFA, 0x54ED, 0xADFB, 0x54E1, + 0xADFC, 0x5509, 0xADFD, 0x54EE, 0xADFE, 0x54EA, 0xAE40, 0x54E6, 0xAE41, 0x5527, 0xAE42, 0x5507, 0xAE43, 0x54FD, 0xAE44, 0x550F, + 0xAE45, 0x5703, 0xAE46, 0x5704, 0xAE47, 0x57C2, 0xAE48, 0x57D4, 0xAE49, 0x57CB, 0xAE4A, 0x57C3, 0xAE4B, 0x5809, 0xAE4C, 0x590F, + 0xAE4D, 0x5957, 0xAE4E, 0x5958, 0xAE4F, 0x595A, 0xAE50, 0x5A11, 0xAE51, 0x5A18, 0xAE52, 0x5A1C, 0xAE53, 0x5A1F, 0xAE54, 0x5A1B, + 0xAE55, 0x5A13, 0xAE56, 0x59EC, 0xAE57, 0x5A20, 0xAE58, 0x5A23, 0xAE59, 0x5A29, 0xAE5A, 0x5A25, 0xAE5B, 0x5A0C, 0xAE5C, 0x5A09, + 0xAE5D, 0x5B6B, 0xAE5E, 0x5C58, 0xAE5F, 0x5BB0, 0xAE60, 0x5BB3, 0xAE61, 0x5BB6, 0xAE62, 0x5BB4, 0xAE63, 0x5BAE, 0xAE64, 0x5BB5, + 0xAE65, 0x5BB9, 0xAE66, 0x5BB8, 0xAE67, 0x5C04, 0xAE68, 0x5C51, 0xAE69, 0x5C55, 0xAE6A, 0x5C50, 0xAE6B, 0x5CED, 0xAE6C, 0x5CFD, + 0xAE6D, 0x5CFB, 0xAE6E, 0x5CEA, 0xAE6F, 0x5CE8, 0xAE70, 0x5CF0, 0xAE71, 0x5CF6, 0xAE72, 0x5D01, 0xAE73, 0x5CF4, 0xAE74, 0x5DEE, + 0xAE75, 0x5E2D, 0xAE76, 0x5E2B, 0xAE77, 0x5EAB, 0xAE78, 0x5EAD, 0xAE79, 0x5EA7, 0xAE7A, 0x5F31, 0xAE7B, 0x5F92, 0xAE7C, 0x5F91, + 0xAE7D, 0x5F90, 0xAE7E, 0x6059, 0xAEA1, 0x6063, 0xAEA2, 0x6065, 0xAEA3, 0x6050, 0xAEA4, 0x6055, 0xAEA5, 0x606D, 0xAEA6, 0x6069, + 0xAEA7, 0x606F, 0xAEA8, 0x6084, 0xAEA9, 0x609F, 0xAEAA, 0x609A, 0xAEAB, 0x608D, 0xAEAC, 0x6094, 0xAEAD, 0x608C, 0xAEAE, 0x6085, + 0xAEAF, 0x6096, 0xAEB0, 0x6247, 0xAEB1, 0x62F3, 0xAEB2, 0x6308, 0xAEB3, 0x62FF, 0xAEB4, 0x634E, 0xAEB5, 0x633E, 0xAEB6, 0x632F, + 0xAEB7, 0x6355, 0xAEB8, 0x6342, 0xAEB9, 0x6346, 0xAEBA, 0x634F, 0xAEBB, 0x6349, 0xAEBC, 0x633A, 0xAEBD, 0x6350, 0xAEBE, 0x633D, + 0xAEBF, 0x632A, 0xAEC0, 0x632B, 0xAEC1, 0x6328, 0xAEC2, 0x634D, 0xAEC3, 0x634C, 0xAEC4, 0x6548, 0xAEC5, 0x6549, 0xAEC6, 0x6599, + 0xAEC7, 0x65C1, 0xAEC8, 0x65C5, 0xAEC9, 0x6642, 0xAECA, 0x6649, 0xAECB, 0x664F, 0xAECC, 0x6643, 0xAECD, 0x6652, 0xAECE, 0x664C, + 0xAECF, 0x6645, 0xAED0, 0x6641, 0xAED1, 0x66F8, 0xAED2, 0x6714, 0xAED3, 0x6715, 0xAED4, 0x6717, 0xAED5, 0x6821, 0xAED6, 0x6838, + 0xAED7, 0x6848, 0xAED8, 0x6846, 0xAED9, 0x6853, 0xAEDA, 0x6839, 0xAEDB, 0x6842, 0xAEDC, 0x6854, 0xAEDD, 0x6829, 0xAEDE, 0x68B3, + 0xAEDF, 0x6817, 0xAEE0, 0x684C, 0xAEE1, 0x6851, 0xAEE2, 0x683D, 0xAEE3, 0x67F4, 0xAEE4, 0x6850, 0xAEE5, 0x6840, 0xAEE6, 0x683C, + 0xAEE7, 0x6843, 0xAEE8, 0x682A, 0xAEE9, 0x6845, 0xAEEA, 0x6813, 0xAEEB, 0x6818, 0xAEEC, 0x6841, 0xAEED, 0x6B8A, 0xAEEE, 0x6B89, + 0xAEEF, 0x6BB7, 0xAEF0, 0x6C23, 0xAEF1, 0x6C27, 0xAEF2, 0x6C28, 0xAEF3, 0x6C26, 0xAEF4, 0x6C24, 0xAEF5, 0x6CF0, 0xAEF6, 0x6D6A, + 0xAEF7, 0x6D95, 0xAEF8, 0x6D88, 0xAEF9, 0x6D87, 0xAEFA, 0x6D66, 0xAEFB, 0x6D78, 0xAEFC, 0x6D77, 0xAEFD, 0x6D59, 0xAEFE, 0x6D93, + 0xAF40, 0x6D6C, 0xAF41, 0x6D89, 0xAF42, 0x6D6E, 0xAF43, 0x6D5A, 0xAF44, 0x6D74, 0xAF45, 0x6D69, 0xAF46, 0x6D8C, 0xAF47, 0x6D8A, + 0xAF48, 0x6D79, 0xAF49, 0x6D85, 0xAF4A, 0x6D65, 0xAF4B, 0x6D94, 0xAF4C, 0x70CA, 0xAF4D, 0x70D8, 0xAF4E, 0x70E4, 0xAF4F, 0x70D9, + 0xAF50, 0x70C8, 0xAF51, 0x70CF, 0xAF52, 0x7239, 0xAF53, 0x7279, 0xAF54, 0x72FC, 0xAF55, 0x72F9, 0xAF56, 0x72FD, 0xAF57, 0x72F8, + 0xAF58, 0x72F7, 0xAF59, 0x7386, 0xAF5A, 0x73ED, 0xAF5B, 0x7409, 0xAF5C, 0x73EE, 0xAF5D, 0x73E0, 0xAF5E, 0x73EA, 0xAF5F, 0x73DE, + 0xAF60, 0x7554, 0xAF61, 0x755D, 0xAF62, 0x755C, 0xAF63, 0x755A, 0xAF64, 0x7559, 0xAF65, 0x75BE, 0xAF66, 0x75C5, 0xAF67, 0x75C7, + 0xAF68, 0x75B2, 0xAF69, 0x75B3, 0xAF6A, 0x75BD, 0xAF6B, 0x75BC, 0xAF6C, 0x75B9, 0xAF6D, 0x75C2, 0xAF6E, 0x75B8, 0xAF6F, 0x768B, + 0xAF70, 0x76B0, 0xAF71, 0x76CA, 0xAF72, 0x76CD, 0xAF73, 0x76CE, 0xAF74, 0x7729, 0xAF75, 0x771F, 0xAF76, 0x7720, 0xAF77, 0x7728, + 0xAF78, 0x77E9, 0xAF79, 0x7830, 0xAF7A, 0x7827, 0xAF7B, 0x7838, 0xAF7C, 0x781D, 0xAF7D, 0x7834, 0xAF7E, 0x7837, 0xAFA1, 0x7825, + 0xAFA2, 0x782D, 0xAFA3, 0x7820, 0xAFA4, 0x781F, 0xAFA5, 0x7832, 0xAFA6, 0x7955, 0xAFA7, 0x7950, 0xAFA8, 0x7960, 0xAFA9, 0x795F, + 0xAFAA, 0x7956, 0xAFAB, 0x795E, 0xAFAC, 0x795D, 0xAFAD, 0x7957, 0xAFAE, 0x795A, 0xAFAF, 0x79E4, 0xAFB0, 0x79E3, 0xAFB1, 0x79E7, + 0xAFB2, 0x79DF, 0xAFB3, 0x79E6, 0xAFB4, 0x79E9, 0xAFB5, 0x79D8, 0xAFB6, 0x7A84, 0xAFB7, 0x7A88, 0xAFB8, 0x7AD9, 0xAFB9, 0x7B06, + 0xAFBA, 0x7B11, 0xAFBB, 0x7C89, 0xAFBC, 0x7D21, 0xAFBD, 0x7D17, 0xAFBE, 0x7D0B, 0xAFBF, 0x7D0A, 0xAFC0, 0x7D20, 0xAFC1, 0x7D22, + 0xAFC2, 0x7D14, 0xAFC3, 0x7D10, 0xAFC4, 0x7D15, 0xAFC5, 0x7D1A, 0xAFC6, 0x7D1C, 0xAFC7, 0x7D0D, 0xAFC8, 0x7D19, 0xAFC9, 0x7D1B, + 0xAFCA, 0x7F3A, 0xAFCB, 0x7F5F, 0xAFCC, 0x7F94, 0xAFCD, 0x7FC5, 0xAFCE, 0x7FC1, 0xAFCF, 0x8006, 0xAFD0, 0x8018, 0xAFD1, 0x8015, + 0xAFD2, 0x8019, 0xAFD3, 0x8017, 0xAFD4, 0x803D, 0xAFD5, 0x803F, 0xAFD6, 0x80F1, 0xAFD7, 0x8102, 0xAFD8, 0x80F0, 0xAFD9, 0x8105, + 0xAFDA, 0x80ED, 0xAFDB, 0x80F4, 0xAFDC, 0x8106, 0xAFDD, 0x80F8, 0xAFDE, 0x80F3, 0xAFDF, 0x8108, 0xAFE0, 0x80FD, 0xAFE1, 0x810A, + 0xAFE2, 0x80FC, 0xAFE3, 0x80EF, 0xAFE4, 0x81ED, 0xAFE5, 0x81EC, 0xAFE6, 0x8200, 0xAFE7, 0x8210, 0xAFE8, 0x822A, 0xAFE9, 0x822B, + 0xAFEA, 0x8228, 0xAFEB, 0x822C, 0xAFEC, 0x82BB, 0xAFED, 0x832B, 0xAFEE, 0x8352, 0xAFEF, 0x8354, 0xAFF0, 0x834A, 0xAFF1, 0x8338, + 0xAFF2, 0x8350, 0xAFF3, 0x8349, 0xAFF4, 0x8335, 0xAFF5, 0x8334, 0xAFF6, 0x834F, 0xAFF7, 0x8332, 0xAFF8, 0x8339, 0xAFF9, 0x8336, + 0xAFFA, 0x8317, 0xAFFB, 0x8340, 0xAFFC, 0x8331, 0xAFFD, 0x8328, 0xAFFE, 0x8343, 0xB040, 0x8654, 0xB041, 0x868A, 0xB042, 0x86AA, + 0xB043, 0x8693, 0xB044, 0x86A4, 0xB045, 0x86A9, 0xB046, 0x868C, 0xB047, 0x86A3, 0xB048, 0x869C, 0xB049, 0x8870, 0xB04A, 0x8877, + 0xB04B, 0x8881, 0xB04C, 0x8882, 0xB04D, 0x887D, 0xB04E, 0x8879, 0xB04F, 0x8A18, 0xB050, 0x8A10, 0xB051, 0x8A0E, 0xB052, 0x8A0C, + 0xB053, 0x8A15, 0xB054, 0x8A0A, 0xB055, 0x8A17, 0xB056, 0x8A13, 0xB057, 0x8A16, 0xB058, 0x8A0F, 0xB059, 0x8A11, 0xB05A, 0x8C48, + 0xB05B, 0x8C7A, 0xB05C, 0x8C79, 0xB05D, 0x8CA1, 0xB05E, 0x8CA2, 0xB05F, 0x8D77, 0xB060, 0x8EAC, 0xB061, 0x8ED2, 0xB062, 0x8ED4, + 0xB063, 0x8ECF, 0xB064, 0x8FB1, 0xB065, 0x9001, 0xB066, 0x9006, 0xB067, 0x8FF7, 0xB068, 0x9000, 0xB069, 0x8FFA, 0xB06A, 0x8FF4, + 0xB06B, 0x9003, 0xB06C, 0x8FFD, 0xB06D, 0x9005, 0xB06E, 0x8FF8, 0xB06F, 0x9095, 0xB070, 0x90E1, 0xB071, 0x90DD, 0xB072, 0x90E2, + 0xB073, 0x9152, 0xB074, 0x914D, 0xB075, 0x914C, 0xB076, 0x91D8, 0xB077, 0x91DD, 0xB078, 0x91D7, 0xB079, 0x91DC, 0xB07A, 0x91D9, + 0xB07B, 0x9583, 0xB07C, 0x9662, 0xB07D, 0x9663, 0xB07E, 0x9661, 0xB0A1, 0x965B, 0xB0A2, 0x965D, 0xB0A3, 0x9664, 0xB0A4, 0x9658, + 0xB0A5, 0x965E, 0xB0A6, 0x96BB, 0xB0A7, 0x98E2, 0xB0A8, 0x99AC, 0xB0A9, 0x9AA8, 0xB0AA, 0x9AD8, 0xB0AB, 0x9B25, 0xB0AC, 0x9B32, + 0xB0AD, 0x9B3C, 0xB0AE, 0x4E7E, 0xB0AF, 0x507A, 0xB0B0, 0x507D, 0xB0B1, 0x505C, 0xB0B2, 0x5047, 0xB0B3, 0x5043, 0xB0B4, 0x504C, + 0xB0B5, 0x505A, 0xB0B6, 0x5049, 0xB0B7, 0x5065, 0xB0B8, 0x5076, 0xB0B9, 0x504E, 0xB0BA, 0x5055, 0xB0BB, 0x5075, 0xB0BC, 0x5074, + 0xB0BD, 0x5077, 0xB0BE, 0x504F, 0xB0BF, 0x500F, 0xB0C0, 0x506F, 0xB0C1, 0x506D, 0xB0C2, 0x515C, 0xB0C3, 0x5195, 0xB0C4, 0x51F0, + 0xB0C5, 0x526A, 0xB0C6, 0x526F, 0xB0C7, 0x52D2, 0xB0C8, 0x52D9, 0xB0C9, 0x52D8, 0xB0CA, 0x52D5, 0xB0CB, 0x5310, 0xB0CC, 0x530F, + 0xB0CD, 0x5319, 0xB0CE, 0x533F, 0xB0CF, 0x5340, 0xB0D0, 0x533E, 0xB0D1, 0x53C3, 0xB0D2, 0x66FC, 0xB0D3, 0x5546, 0xB0D4, 0x556A, + 0xB0D5, 0x5566, 0xB0D6, 0x5544, 0xB0D7, 0x555E, 0xB0D8, 0x5561, 0xB0D9, 0x5543, 0xB0DA, 0x554A, 0xB0DB, 0x5531, 0xB0DC, 0x5556, + 0xB0DD, 0x554F, 0xB0DE, 0x5555, 0xB0DF, 0x552F, 0xB0E0, 0x5564, 0xB0E1, 0x5538, 0xB0E2, 0x552E, 0xB0E3, 0x555C, 0xB0E4, 0x552C, + 0xB0E5, 0x5563, 0xB0E6, 0x5533, 0xB0E7, 0x5541, 0xB0E8, 0x5557, 0xB0E9, 0x5708, 0xB0EA, 0x570B, 0xB0EB, 0x5709, 0xB0EC, 0x57DF, + 0xB0ED, 0x5805, 0xB0EE, 0x580A, 0xB0EF, 0x5806, 0xB0F0, 0x57E0, 0xB0F1, 0x57E4, 0xB0F2, 0x57FA, 0xB0F3, 0x5802, 0xB0F4, 0x5835, + 0xB0F5, 0x57F7, 0xB0F6, 0x57F9, 0xB0F7, 0x5920, 0xB0F8, 0x5962, 0xB0F9, 0x5A36, 0xB0FA, 0x5A41, 0xB0FB, 0x5A49, 0xB0FC, 0x5A66, + 0xB0FD, 0x5A6A, 0xB0FE, 0x5A40, 0xB140, 0x5A3C, 0xB141, 0x5A62, 0xB142, 0x5A5A, 0xB143, 0x5A46, 0xB144, 0x5A4A, 0xB145, 0x5B70, + 0xB146, 0x5BC7, 0xB147, 0x5BC5, 0xB148, 0x5BC4, 0xB149, 0x5BC2, 0xB14A, 0x5BBF, 0xB14B, 0x5BC6, 0xB14C, 0x5C09, 0xB14D, 0x5C08, + 0xB14E, 0x5C07, 0xB14F, 0x5C60, 0xB150, 0x5C5C, 0xB151, 0x5C5D, 0xB152, 0x5D07, 0xB153, 0x5D06, 0xB154, 0x5D0E, 0xB155, 0x5D1B, + 0xB156, 0x5D16, 0xB157, 0x5D22, 0xB158, 0x5D11, 0xB159, 0x5D29, 0xB15A, 0x5D14, 0xB15B, 0x5D19, 0xB15C, 0x5D24, 0xB15D, 0x5D27, + 0xB15E, 0x5D17, 0xB15F, 0x5DE2, 0xB160, 0x5E38, 0xB161, 0x5E36, 0xB162, 0x5E33, 0xB163, 0x5E37, 0xB164, 0x5EB7, 0xB165, 0x5EB8, + 0xB166, 0x5EB6, 0xB167, 0x5EB5, 0xB168, 0x5EBE, 0xB169, 0x5F35, 0xB16A, 0x5F37, 0xB16B, 0x5F57, 0xB16C, 0x5F6C, 0xB16D, 0x5F69, + 0xB16E, 0x5F6B, 0xB16F, 0x5F97, 0xB170, 0x5F99, 0xB171, 0x5F9E, 0xB172, 0x5F98, 0xB173, 0x5FA1, 0xB174, 0x5FA0, 0xB175, 0x5F9C, + 0xB176, 0x607F, 0xB177, 0x60A3, 0xB178, 0x6089, 0xB179, 0x60A0, 0xB17A, 0x60A8, 0xB17B, 0x60CB, 0xB17C, 0x60B4, 0xB17D, 0x60E6, + 0xB17E, 0x60BD, 0xB1A1, 0x60C5, 0xB1A2, 0x60BB, 0xB1A3, 0x60B5, 0xB1A4, 0x60DC, 0xB1A5, 0x60BC, 0xB1A6, 0x60D8, 0xB1A7, 0x60D5, + 0xB1A8, 0x60C6, 0xB1A9, 0x60DF, 0xB1AA, 0x60B8, 0xB1AB, 0x60DA, 0xB1AC, 0x60C7, 0xB1AD, 0x621A, 0xB1AE, 0x621B, 0xB1AF, 0x6248, + 0xB1B0, 0x63A0, 0xB1B1, 0x63A7, 0xB1B2, 0x6372, 0xB1B3, 0x6396, 0xB1B4, 0x63A2, 0xB1B5, 0x63A5, 0xB1B6, 0x6377, 0xB1B7, 0x6367, + 0xB1B8, 0x6398, 0xB1B9, 0x63AA, 0xB1BA, 0x6371, 0xB1BB, 0x63A9, 0xB1BC, 0x6389, 0xB1BD, 0x6383, 0xB1BE, 0x639B, 0xB1BF, 0x636B, + 0xB1C0, 0x63A8, 0xB1C1, 0x6384, 0xB1C2, 0x6388, 0xB1C3, 0x6399, 0xB1C4, 0x63A1, 0xB1C5, 0x63AC, 0xB1C6, 0x6392, 0xB1C7, 0x638F, + 0xB1C8, 0x6380, 0xB1C9, 0x637B, 0xB1CA, 0x6369, 0xB1CB, 0x6368, 0xB1CC, 0x637A, 0xB1CD, 0x655D, 0xB1CE, 0x6556, 0xB1CF, 0x6551, + 0xB1D0, 0x6559, 0xB1D1, 0x6557, 0xB1D2, 0x555F, 0xB1D3, 0x654F, 0xB1D4, 0x6558, 0xB1D5, 0x6555, 0xB1D6, 0x6554, 0xB1D7, 0x659C, + 0xB1D8, 0x659B, 0xB1D9, 0x65AC, 0xB1DA, 0x65CF, 0xB1DB, 0x65CB, 0xB1DC, 0x65CC, 0xB1DD, 0x65CE, 0xB1DE, 0x665D, 0xB1DF, 0x665A, + 0xB1E0, 0x6664, 0xB1E1, 0x6668, 0xB1E2, 0x6666, 0xB1E3, 0x665E, 0xB1E4, 0x66F9, 0xB1E5, 0x52D7, 0xB1E6, 0x671B, 0xB1E7, 0x6881, + 0xB1E8, 0x68AF, 0xB1E9, 0x68A2, 0xB1EA, 0x6893, 0xB1EB, 0x68B5, 0xB1EC, 0x687F, 0xB1ED, 0x6876, 0xB1EE, 0x68B1, 0xB1EF, 0x68A7, + 0xB1F0, 0x6897, 0xB1F1, 0x68B0, 0xB1F2, 0x6883, 0xB1F3, 0x68C4, 0xB1F4, 0x68AD, 0xB1F5, 0x6886, 0xB1F6, 0x6885, 0xB1F7, 0x6894, + 0xB1F8, 0x689D, 0xB1F9, 0x68A8, 0xB1FA, 0x689F, 0xB1FB, 0x68A1, 0xB1FC, 0x6882, 0xB1FD, 0x6B32, 0xB1FE, 0x6BBA, 0xB240, 0x6BEB, + 0xB241, 0x6BEC, 0xB242, 0x6C2B, 0xB243, 0x6D8E, 0xB244, 0x6DBC, 0xB245, 0x6DF3, 0xB246, 0x6DD9, 0xB247, 0x6DB2, 0xB248, 0x6DE1, + 0xB249, 0x6DCC, 0xB24A, 0x6DE4, 0xB24B, 0x6DFB, 0xB24C, 0x6DFA, 0xB24D, 0x6E05, 0xB24E, 0x6DC7, 0xB24F, 0x6DCB, 0xB250, 0x6DAF, + 0xB251, 0x6DD1, 0xB252, 0x6DAE, 0xB253, 0x6DDE, 0xB254, 0x6DF9, 0xB255, 0x6DB8, 0xB256, 0x6DF7, 0xB257, 0x6DF5, 0xB258, 0x6DC5, + 0xB259, 0x6DD2, 0xB25A, 0x6E1A, 0xB25B, 0x6DB5, 0xB25C, 0x6DDA, 0xB25D, 0x6DEB, 0xB25E, 0x6DD8, 0xB25F, 0x6DEA, 0xB260, 0x6DF1, + 0xB261, 0x6DEE, 0xB262, 0x6DE8, 0xB263, 0x6DC6, 0xB264, 0x6DC4, 0xB265, 0x6DAA, 0xB266, 0x6DEC, 0xB267, 0x6DBF, 0xB268, 0x6DE6, + 0xB269, 0x70F9, 0xB26A, 0x7109, 0xB26B, 0x710A, 0xB26C, 0x70FD, 0xB26D, 0x70EF, 0xB26E, 0x723D, 0xB26F, 0x727D, 0xB270, 0x7281, + 0xB271, 0x731C, 0xB272, 0x731B, 0xB273, 0x7316, 0xB274, 0x7313, 0xB275, 0x7319, 0xB276, 0x7387, 0xB277, 0x7405, 0xB278, 0x740A, + 0xB279, 0x7403, 0xB27A, 0x7406, 0xB27B, 0x73FE, 0xB27C, 0x740D, 0xB27D, 0x74E0, 0xB27E, 0x74F6, 0xB2A1, 0x74F7, 0xB2A2, 0x751C, + 0xB2A3, 0x7522, 0xB2A4, 0x7565, 0xB2A5, 0x7566, 0xB2A6, 0x7562, 0xB2A7, 0x7570, 0xB2A8, 0x758F, 0xB2A9, 0x75D4, 0xB2AA, 0x75D5, + 0xB2AB, 0x75B5, 0xB2AC, 0x75CA, 0xB2AD, 0x75CD, 0xB2AE, 0x768E, 0xB2AF, 0x76D4, 0xB2B0, 0x76D2, 0xB2B1, 0x76DB, 0xB2B2, 0x7737, + 0xB2B3, 0x773E, 0xB2B4, 0x773C, 0xB2B5, 0x7736, 0xB2B6, 0x7738, 0xB2B7, 0x773A, 0xB2B8, 0x786B, 0xB2B9, 0x7843, 0xB2BA, 0x784E, + 0xB2BB, 0x7965, 0xB2BC, 0x7968, 0xB2BD, 0x796D, 0xB2BE, 0x79FB, 0xB2BF, 0x7A92, 0xB2C0, 0x7A95, 0xB2C1, 0x7B20, 0xB2C2, 0x7B28, + 0xB2C3, 0x7B1B, 0xB2C4, 0x7B2C, 0xB2C5, 0x7B26, 0xB2C6, 0x7B19, 0xB2C7, 0x7B1E, 0xB2C8, 0x7B2E, 0xB2C9, 0x7C92, 0xB2CA, 0x7C97, + 0xB2CB, 0x7C95, 0xB2CC, 0x7D46, 0xB2CD, 0x7D43, 0xB2CE, 0x7D71, 0xB2CF, 0x7D2E, 0xB2D0, 0x7D39, 0xB2D1, 0x7D3C, 0xB2D2, 0x7D40, + 0xB2D3, 0x7D30, 0xB2D4, 0x7D33, 0xB2D5, 0x7D44, 0xB2D6, 0x7D2F, 0xB2D7, 0x7D42, 0xB2D8, 0x7D32, 0xB2D9, 0x7D31, 0xB2DA, 0x7F3D, + 0xB2DB, 0x7F9E, 0xB2DC, 0x7F9A, 0xB2DD, 0x7FCC, 0xB2DE, 0x7FCE, 0xB2DF, 0x7FD2, 0xB2E0, 0x801C, 0xB2E1, 0x804A, 0xB2E2, 0x8046, + 0xB2E3, 0x812F, 0xB2E4, 0x8116, 0xB2E5, 0x8123, 0xB2E6, 0x812B, 0xB2E7, 0x8129, 0xB2E8, 0x8130, 0xB2E9, 0x8124, 0xB2EA, 0x8202, + 0xB2EB, 0x8235, 0xB2EC, 0x8237, 0xB2ED, 0x8236, 0xB2EE, 0x8239, 0xB2EF, 0x838E, 0xB2F0, 0x839E, 0xB2F1, 0x8398, 0xB2F2, 0x8378, + 0xB2F3, 0x83A2, 0xB2F4, 0x8396, 0xB2F5, 0x83BD, 0xB2F6, 0x83AB, 0xB2F7, 0x8392, 0xB2F8, 0x838A, 0xB2F9, 0x8393, 0xB2FA, 0x8389, + 0xB2FB, 0x83A0, 0xB2FC, 0x8377, 0xB2FD, 0x837B, 0xB2FE, 0x837C, 0xB340, 0x8386, 0xB341, 0x83A7, 0xB342, 0x8655, 0xB343, 0x5F6A, + 0xB344, 0x86C7, 0xB345, 0x86C0, 0xB346, 0x86B6, 0xB347, 0x86C4, 0xB348, 0x86B5, 0xB349, 0x86C6, 0xB34A, 0x86CB, 0xB34B, 0x86B1, + 0xB34C, 0x86AF, 0xB34D, 0x86C9, 0xB34E, 0x8853, 0xB34F, 0x889E, 0xB350, 0x8888, 0xB351, 0x88AB, 0xB352, 0x8892, 0xB353, 0x8896, + 0xB354, 0x888D, 0xB355, 0x888B, 0xB356, 0x8993, 0xB357, 0x898F, 0xB358, 0x8A2A, 0xB359, 0x8A1D, 0xB35A, 0x8A23, 0xB35B, 0x8A25, + 0xB35C, 0x8A31, 0xB35D, 0x8A2D, 0xB35E, 0x8A1F, 0xB35F, 0x8A1B, 0xB360, 0x8A22, 0xB361, 0x8C49, 0xB362, 0x8C5A, 0xB363, 0x8CA9, + 0xB364, 0x8CAC, 0xB365, 0x8CAB, 0xB366, 0x8CA8, 0xB367, 0x8CAA, 0xB368, 0x8CA7, 0xB369, 0x8D67, 0xB36A, 0x8D66, 0xB36B, 0x8DBE, + 0xB36C, 0x8DBA, 0xB36D, 0x8EDB, 0xB36E, 0x8EDF, 0xB36F, 0x9019, 0xB370, 0x900D, 0xB371, 0x901A, 0xB372, 0x9017, 0xB373, 0x9023, + 0xB374, 0x901F, 0xB375, 0x901D, 0xB376, 0x9010, 0xB377, 0x9015, 0xB378, 0x901E, 0xB379, 0x9020, 0xB37A, 0x900F, 0xB37B, 0x9022, + 0xB37C, 0x9016, 0xB37D, 0x901B, 0xB37E, 0x9014, 0xB3A1, 0x90E8, 0xB3A2, 0x90ED, 0xB3A3, 0x90FD, 0xB3A4, 0x9157, 0xB3A5, 0x91CE, + 0xB3A6, 0x91F5, 0xB3A7, 0x91E6, 0xB3A8, 0x91E3, 0xB3A9, 0x91E7, 0xB3AA, 0x91ED, 0xB3AB, 0x91E9, 0xB3AC, 0x9589, 0xB3AD, 0x966A, + 0xB3AE, 0x9675, 0xB3AF, 0x9673, 0xB3B0, 0x9678, 0xB3B1, 0x9670, 0xB3B2, 0x9674, 0xB3B3, 0x9676, 0xB3B4, 0x9677, 0xB3B5, 0x966C, + 0xB3B6, 0x96C0, 0xB3B7, 0x96EA, 0xB3B8, 0x96E9, 0xB3B9, 0x7AE0, 0xB3BA, 0x7ADF, 0xB3BB, 0x9802, 0xB3BC, 0x9803, 0xB3BD, 0x9B5A, + 0xB3BE, 0x9CE5, 0xB3BF, 0x9E75, 0xB3C0, 0x9E7F, 0xB3C1, 0x9EA5, 0xB3C2, 0x9EBB, 0xB3C3, 0x50A2, 0xB3C4, 0x508D, 0xB3C5, 0x5085, + 0xB3C6, 0x5099, 0xB3C7, 0x5091, 0xB3C8, 0x5080, 0xB3C9, 0x5096, 0xB3CA, 0x5098, 0xB3CB, 0x509A, 0xB3CC, 0x6700, 0xB3CD, 0x51F1, + 0xB3CE, 0x5272, 0xB3CF, 0x5274, 0xB3D0, 0x5275, 0xB3D1, 0x5269, 0xB3D2, 0x52DE, 0xB3D3, 0x52DD, 0xB3D4, 0x52DB, 0xB3D5, 0x535A, + 0xB3D6, 0x53A5, 0xB3D7, 0x557B, 0xB3D8, 0x5580, 0xB3D9, 0x55A7, 0xB3DA, 0x557C, 0xB3DB, 0x558A, 0xB3DC, 0x559D, 0xB3DD, 0x5598, + 0xB3DE, 0x5582, 0xB3DF, 0x559C, 0xB3E0, 0x55AA, 0xB3E1, 0x5594, 0xB3E2, 0x5587, 0xB3E3, 0x558B, 0xB3E4, 0x5583, 0xB3E5, 0x55B3, + 0xB3E6, 0x55AE, 0xB3E7, 0x559F, 0xB3E8, 0x553E, 0xB3E9, 0x55B2, 0xB3EA, 0x559A, 0xB3EB, 0x55BB, 0xB3EC, 0x55AC, 0xB3ED, 0x55B1, + 0xB3EE, 0x557E, 0xB3EF, 0x5589, 0xB3F0, 0x55AB, 0xB3F1, 0x5599, 0xB3F2, 0x570D, 0xB3F3, 0x582F, 0xB3F4, 0x582A, 0xB3F5, 0x5834, + 0xB3F6, 0x5824, 0xB3F7, 0x5830, 0xB3F8, 0x5831, 0xB3F9, 0x5821, 0xB3FA, 0x581D, 0xB3FB, 0x5820, 0xB3FC, 0x58F9, 0xB3FD, 0x58FA, + 0xB3FE, 0x5960, 0xB440, 0x5A77, 0xB441, 0x5A9A, 0xB442, 0x5A7F, 0xB443, 0x5A92, 0xB444, 0x5A9B, 0xB445, 0x5AA7, 0xB446, 0x5B73, + 0xB447, 0x5B71, 0xB448, 0x5BD2, 0xB449, 0x5BCC, 0xB44A, 0x5BD3, 0xB44B, 0x5BD0, 0xB44C, 0x5C0A, 0xB44D, 0x5C0B, 0xB44E, 0x5C31, + 0xB44F, 0x5D4C, 0xB450, 0x5D50, 0xB451, 0x5D34, 0xB452, 0x5D47, 0xB453, 0x5DFD, 0xB454, 0x5E45, 0xB455, 0x5E3D, 0xB456, 0x5E40, + 0xB457, 0x5E43, 0xB458, 0x5E7E, 0xB459, 0x5ECA, 0xB45A, 0x5EC1, 0xB45B, 0x5EC2, 0xB45C, 0x5EC4, 0xB45D, 0x5F3C, 0xB45E, 0x5F6D, + 0xB45F, 0x5FA9, 0xB460, 0x5FAA, 0xB461, 0x5FA8, 0xB462, 0x60D1, 0xB463, 0x60E1, 0xB464, 0x60B2, 0xB465, 0x60B6, 0xB466, 0x60E0, + 0xB467, 0x611C, 0xB468, 0x6123, 0xB469, 0x60FA, 0xB46A, 0x6115, 0xB46B, 0x60F0, 0xB46C, 0x60FB, 0xB46D, 0x60F4, 0xB46E, 0x6168, + 0xB46F, 0x60F1, 0xB470, 0x610E, 0xB471, 0x60F6, 0xB472, 0x6109, 0xB473, 0x6100, 0xB474, 0x6112, 0xB475, 0x621F, 0xB476, 0x6249, + 0xB477, 0x63A3, 0xB478, 0x638C, 0xB479, 0x63CF, 0xB47A, 0x63C0, 0xB47B, 0x63E9, 0xB47C, 0x63C9, 0xB47D, 0x63C6, 0xB47E, 0x63CD, + 0xB4A1, 0x63D2, 0xB4A2, 0x63E3, 0xB4A3, 0x63D0, 0xB4A4, 0x63E1, 0xB4A5, 0x63D6, 0xB4A6, 0x63ED, 0xB4A7, 0x63EE, 0xB4A8, 0x6376, + 0xB4A9, 0x63F4, 0xB4AA, 0x63EA, 0xB4AB, 0x63DB, 0xB4AC, 0x6452, 0xB4AD, 0x63DA, 0xB4AE, 0x63F9, 0xB4AF, 0x655E, 0xB4B0, 0x6566, + 0xB4B1, 0x6562, 0xB4B2, 0x6563, 0xB4B3, 0x6591, 0xB4B4, 0x6590, 0xB4B5, 0x65AF, 0xB4B6, 0x666E, 0xB4B7, 0x6670, 0xB4B8, 0x6674, + 0xB4B9, 0x6676, 0xB4BA, 0x666F, 0xB4BB, 0x6691, 0xB4BC, 0x667A, 0xB4BD, 0x667E, 0xB4BE, 0x6677, 0xB4BF, 0x66FE, 0xB4C0, 0x66FF, + 0xB4C1, 0x671F, 0xB4C2, 0x671D, 0xB4C3, 0x68FA, 0xB4C4, 0x68D5, 0xB4C5, 0x68E0, 0xB4C6, 0x68D8, 0xB4C7, 0x68D7, 0xB4C8, 0x6905, + 0xB4C9, 0x68DF, 0xB4CA, 0x68F5, 0xB4CB, 0x68EE, 0xB4CC, 0x68E7, 0xB4CD, 0x68F9, 0xB4CE, 0x68D2, 0xB4CF, 0x68F2, 0xB4D0, 0x68E3, + 0xB4D1, 0x68CB, 0xB4D2, 0x68CD, 0xB4D3, 0x690D, 0xB4D4, 0x6912, 0xB4D5, 0x690E, 0xB4D6, 0x68C9, 0xB4D7, 0x68DA, 0xB4D8, 0x696E, + 0xB4D9, 0x68FB, 0xB4DA, 0x6B3E, 0xB4DB, 0x6B3A, 0xB4DC, 0x6B3D, 0xB4DD, 0x6B98, 0xB4DE, 0x6B96, 0xB4DF, 0x6BBC, 0xB4E0, 0x6BEF, + 0xB4E1, 0x6C2E, 0xB4E2, 0x6C2F, 0xB4E3, 0x6C2C, 0xB4E4, 0x6E2F, 0xB4E5, 0x6E38, 0xB4E6, 0x6E54, 0xB4E7, 0x6E21, 0xB4E8, 0x6E32, + 0xB4E9, 0x6E67, 0xB4EA, 0x6E4A, 0xB4EB, 0x6E20, 0xB4EC, 0x6E25, 0xB4ED, 0x6E23, 0xB4EE, 0x6E1B, 0xB4EF, 0x6E5B, 0xB4F0, 0x6E58, + 0xB4F1, 0x6E24, 0xB4F2, 0x6E56, 0xB4F3, 0x6E6E, 0xB4F4, 0x6E2D, 0xB4F5, 0x6E26, 0xB4F6, 0x6E6F, 0xB4F7, 0x6E34, 0xB4F8, 0x6E4D, + 0xB4F9, 0x6E3A, 0xB4FA, 0x6E2C, 0xB4FB, 0x6E43, 0xB4FC, 0x6E1D, 0xB4FD, 0x6E3E, 0xB4FE, 0x6ECB, 0xB540, 0x6E89, 0xB541, 0x6E19, + 0xB542, 0x6E4E, 0xB543, 0x6E63, 0xB544, 0x6E44, 0xB545, 0x6E72, 0xB546, 0x6E69, 0xB547, 0x6E5F, 0xB548, 0x7119, 0xB549, 0x711A, + 0xB54A, 0x7126, 0xB54B, 0x7130, 0xB54C, 0x7121, 0xB54D, 0x7136, 0xB54E, 0x716E, 0xB54F, 0x711C, 0xB550, 0x724C, 0xB551, 0x7284, + 0xB552, 0x7280, 0xB553, 0x7336, 0xB554, 0x7325, 0xB555, 0x7334, 0xB556, 0x7329, 0xB557, 0x743A, 0xB558, 0x742A, 0xB559, 0x7433, + 0xB55A, 0x7422, 0xB55B, 0x7425, 0xB55C, 0x7435, 0xB55D, 0x7436, 0xB55E, 0x7434, 0xB55F, 0x742F, 0xB560, 0x741B, 0xB561, 0x7426, + 0xB562, 0x7428, 0xB563, 0x7525, 0xB564, 0x7526, 0xB565, 0x756B, 0xB566, 0x756A, 0xB567, 0x75E2, 0xB568, 0x75DB, 0xB569, 0x75E3, + 0xB56A, 0x75D9, 0xB56B, 0x75D8, 0xB56C, 0x75DE, 0xB56D, 0x75E0, 0xB56E, 0x767B, 0xB56F, 0x767C, 0xB570, 0x7696, 0xB571, 0x7693, + 0xB572, 0x76B4, 0xB573, 0x76DC, 0xB574, 0x774F, 0xB575, 0x77ED, 0xB576, 0x785D, 0xB577, 0x786C, 0xB578, 0x786F, 0xB579, 0x7A0D, + 0xB57A, 0x7A08, 0xB57B, 0x7A0B, 0xB57C, 0x7A05, 0xB57D, 0x7A00, 0xB57E, 0x7A98, 0xB5A1, 0x7A97, 0xB5A2, 0x7A96, 0xB5A3, 0x7AE5, + 0xB5A4, 0x7AE3, 0xB5A5, 0x7B49, 0xB5A6, 0x7B56, 0xB5A7, 0x7B46, 0xB5A8, 0x7B50, 0xB5A9, 0x7B52, 0xB5AA, 0x7B54, 0xB5AB, 0x7B4D, + 0xB5AC, 0x7B4B, 0xB5AD, 0x7B4F, 0xB5AE, 0x7B51, 0xB5AF, 0x7C9F, 0xB5B0, 0x7CA5, 0xB5B1, 0x7D5E, 0xB5B2, 0x7D50, 0xB5B3, 0x7D68, + 0xB5B4, 0x7D55, 0xB5B5, 0x7D2B, 0xB5B6, 0x7D6E, 0xB5B7, 0x7D72, 0xB5B8, 0x7D61, 0xB5B9, 0x7D66, 0xB5BA, 0x7D62, 0xB5BB, 0x7D70, + 0xB5BC, 0x7D73, 0xB5BD, 0x5584, 0xB5BE, 0x7FD4, 0xB5BF, 0x7FD5, 0xB5C0, 0x800B, 0xB5C1, 0x8052, 0xB5C2, 0x8085, 0xB5C3, 0x8155, + 0xB5C4, 0x8154, 0xB5C5, 0x814B, 0xB5C6, 0x8151, 0xB5C7, 0x814E, 0xB5C8, 0x8139, 0xB5C9, 0x8146, 0xB5CA, 0x813E, 0xB5CB, 0x814C, + 0xB5CC, 0x8153, 0xB5CD, 0x8174, 0xB5CE, 0x8212, 0xB5CF, 0x821C, 0xB5D0, 0x83E9, 0xB5D1, 0x8403, 0xB5D2, 0x83F8, 0xB5D3, 0x840D, + 0xB5D4, 0x83E0, 0xB5D5, 0x83C5, 0xB5D6, 0x840B, 0xB5D7, 0x83C1, 0xB5D8, 0x83EF, 0xB5D9, 0x83F1, 0xB5DA, 0x83F4, 0xB5DB, 0x8457, + 0xB5DC, 0x840A, 0xB5DD, 0x83F0, 0xB5DE, 0x840C, 0xB5DF, 0x83CC, 0xB5E0, 0x83FD, 0xB5E1, 0x83F2, 0xB5E2, 0x83CA, 0xB5E3, 0x8438, + 0xB5E4, 0x840E, 0xB5E5, 0x8404, 0xB5E6, 0x83DC, 0xB5E7, 0x8407, 0xB5E8, 0x83D4, 0xB5E9, 0x83DF, 0xB5EA, 0x865B, 0xB5EB, 0x86DF, + 0xB5EC, 0x86D9, 0xB5ED, 0x86ED, 0xB5EE, 0x86D4, 0xB5EF, 0x86DB, 0xB5F0, 0x86E4, 0xB5F1, 0x86D0, 0xB5F2, 0x86DE, 0xB5F3, 0x8857, + 0xB5F4, 0x88C1, 0xB5F5, 0x88C2, 0xB5F6, 0x88B1, 0xB5F7, 0x8983, 0xB5F8, 0x8996, 0xB5F9, 0x8A3B, 0xB5FA, 0x8A60, 0xB5FB, 0x8A55, + 0xB5FC, 0x8A5E, 0xB5FD, 0x8A3C, 0xB5FE, 0x8A41, 0xB640, 0x8A54, 0xB641, 0x8A5B, 0xB642, 0x8A50, 0xB643, 0x8A46, 0xB644, 0x8A34, + 0xB645, 0x8A3A, 0xB646, 0x8A36, 0xB647, 0x8A56, 0xB648, 0x8C61, 0xB649, 0x8C82, 0xB64A, 0x8CAF, 0xB64B, 0x8CBC, 0xB64C, 0x8CB3, + 0xB64D, 0x8CBD, 0xB64E, 0x8CC1, 0xB64F, 0x8CBB, 0xB650, 0x8CC0, 0xB651, 0x8CB4, 0xB652, 0x8CB7, 0xB653, 0x8CB6, 0xB654, 0x8CBF, + 0xB655, 0x8CB8, 0xB656, 0x8D8A, 0xB657, 0x8D85, 0xB658, 0x8D81, 0xB659, 0x8DCE, 0xB65A, 0x8DDD, 0xB65B, 0x8DCB, 0xB65C, 0x8DDA, + 0xB65D, 0x8DD1, 0xB65E, 0x8DCC, 0xB65F, 0x8DDB, 0xB660, 0x8DC6, 0xB661, 0x8EFB, 0xB662, 0x8EF8, 0xB663, 0x8EFC, 0xB664, 0x8F9C, + 0xB665, 0x902E, 0xB666, 0x9035, 0xB667, 0x9031, 0xB668, 0x9038, 0xB669, 0x9032, 0xB66A, 0x9036, 0xB66B, 0x9102, 0xB66C, 0x90F5, + 0xB66D, 0x9109, 0xB66E, 0x90FE, 0xB66F, 0x9163, 0xB670, 0x9165, 0xB671, 0x91CF, 0xB672, 0x9214, 0xB673, 0x9215, 0xB674, 0x9223, + 0xB675, 0x9209, 0xB676, 0x921E, 0xB677, 0x920D, 0xB678, 0x9210, 0xB679, 0x9207, 0xB67A, 0x9211, 0xB67B, 0x9594, 0xB67C, 0x958F, + 0xB67D, 0x958B, 0xB67E, 0x9591, 0xB6A1, 0x9593, 0xB6A2, 0x9592, 0xB6A3, 0x958E, 0xB6A4, 0x968A, 0xB6A5, 0x968E, 0xB6A6, 0x968B, + 0xB6A7, 0x967D, 0xB6A8, 0x9685, 0xB6A9, 0x9686, 0xB6AA, 0x968D, 0xB6AB, 0x9672, 0xB6AC, 0x9684, 0xB6AD, 0x96C1, 0xB6AE, 0x96C5, + 0xB6AF, 0x96C4, 0xB6B0, 0x96C6, 0xB6B1, 0x96C7, 0xB6B2, 0x96EF, 0xB6B3, 0x96F2, 0xB6B4, 0x97CC, 0xB6B5, 0x9805, 0xB6B6, 0x9806, + 0xB6B7, 0x9808, 0xB6B8, 0x98E7, 0xB6B9, 0x98EA, 0xB6BA, 0x98EF, 0xB6BB, 0x98E9, 0xB6BC, 0x98F2, 0xB6BD, 0x98ED, 0xB6BE, 0x99AE, + 0xB6BF, 0x99AD, 0xB6C0, 0x9EC3, 0xB6C1, 0x9ECD, 0xB6C2, 0x9ED1, 0xB6C3, 0x4E82, 0xB6C4, 0x50AD, 0xB6C5, 0x50B5, 0xB6C6, 0x50B2, + 0xB6C7, 0x50B3, 0xB6C8, 0x50C5, 0xB6C9, 0x50BE, 0xB6CA, 0x50AC, 0xB6CB, 0x50B7, 0xB6CC, 0x50BB, 0xB6CD, 0x50AF, 0xB6CE, 0x50C7, + 0xB6CF, 0x527F, 0xB6D0, 0x5277, 0xB6D1, 0x527D, 0xB6D2, 0x52DF, 0xB6D3, 0x52E6, 0xB6D4, 0x52E4, 0xB6D5, 0x52E2, 0xB6D6, 0x52E3, + 0xB6D7, 0x532F, 0xB6D8, 0x55DF, 0xB6D9, 0x55E8, 0xB6DA, 0x55D3, 0xB6DB, 0x55E6, 0xB6DC, 0x55CE, 0xB6DD, 0x55DC, 0xB6DE, 0x55C7, + 0xB6DF, 0x55D1, 0xB6E0, 0x55E3, 0xB6E1, 0x55E4, 0xB6E2, 0x55EF, 0xB6E3, 0x55DA, 0xB6E4, 0x55E1, 0xB6E5, 0x55C5, 0xB6E6, 0x55C6, + 0xB6E7, 0x55E5, 0xB6E8, 0x55C9, 0xB6E9, 0x5712, 0xB6EA, 0x5713, 0xB6EB, 0x585E, 0xB6EC, 0x5851, 0xB6ED, 0x5858, 0xB6EE, 0x5857, + 0xB6EF, 0x585A, 0xB6F0, 0x5854, 0xB6F1, 0x586B, 0xB6F2, 0x584C, 0xB6F3, 0x586D, 0xB6F4, 0x584A, 0xB6F5, 0x5862, 0xB6F6, 0x5852, + 0xB6F7, 0x584B, 0xB6F8, 0x5967, 0xB6F9, 0x5AC1, 0xB6FA, 0x5AC9, 0xB6FB, 0x5ACC, 0xB6FC, 0x5ABE, 0xB6FD, 0x5ABD, 0xB6FE, 0x5ABC, + 0xB740, 0x5AB3, 0xB741, 0x5AC2, 0xB742, 0x5AB2, 0xB743, 0x5D69, 0xB744, 0x5D6F, 0xB745, 0x5E4C, 0xB746, 0x5E79, 0xB747, 0x5EC9, + 0xB748, 0x5EC8, 0xB749, 0x5F12, 0xB74A, 0x5F59, 0xB74B, 0x5FAC, 0xB74C, 0x5FAE, 0xB74D, 0x611A, 0xB74E, 0x610F, 0xB74F, 0x6148, + 0xB750, 0x611F, 0xB751, 0x60F3, 0xB752, 0x611B, 0xB753, 0x60F9, 0xB754, 0x6101, 0xB755, 0x6108, 0xB756, 0x614E, 0xB757, 0x614C, + 0xB758, 0x6144, 0xB759, 0x614D, 0xB75A, 0x613E, 0xB75B, 0x6134, 0xB75C, 0x6127, 0xB75D, 0x610D, 0xB75E, 0x6106, 0xB75F, 0x6137, + 0xB760, 0x6221, 0xB761, 0x6222, 0xB762, 0x6413, 0xB763, 0x643E, 0xB764, 0x641E, 0xB765, 0x642A, 0xB766, 0x642D, 0xB767, 0x643D, + 0xB768, 0x642C, 0xB769, 0x640F, 0xB76A, 0x641C, 0xB76B, 0x6414, 0xB76C, 0x640D, 0xB76D, 0x6436, 0xB76E, 0x6416, 0xB76F, 0x6417, + 0xB770, 0x6406, 0xB771, 0x656C, 0xB772, 0x659F, 0xB773, 0x65B0, 0xB774, 0x6697, 0xB775, 0x6689, 0xB776, 0x6687, 0xB777, 0x6688, + 0xB778, 0x6696, 0xB779, 0x6684, 0xB77A, 0x6698, 0xB77B, 0x668D, 0xB77C, 0x6703, 0xB77D, 0x6994, 0xB77E, 0x696D, 0xB7A1, 0x695A, + 0xB7A2, 0x6977, 0xB7A3, 0x6960, 0xB7A4, 0x6954, 0xB7A5, 0x6975, 0xB7A6, 0x6930, 0xB7A7, 0x6982, 0xB7A8, 0x694A, 0xB7A9, 0x6968, + 0xB7AA, 0x696B, 0xB7AB, 0x695E, 0xB7AC, 0x6953, 0xB7AD, 0x6979, 0xB7AE, 0x6986, 0xB7AF, 0x695D, 0xB7B0, 0x6963, 0xB7B1, 0x695B, + 0xB7B2, 0x6B47, 0xB7B3, 0x6B72, 0xB7B4, 0x6BC0, 0xB7B5, 0x6BBF, 0xB7B6, 0x6BD3, 0xB7B7, 0x6BFD, 0xB7B8, 0x6EA2, 0xB7B9, 0x6EAF, + 0xB7BA, 0x6ED3, 0xB7BB, 0x6EB6, 0xB7BC, 0x6EC2, 0xB7BD, 0x6E90, 0xB7BE, 0x6E9D, 0xB7BF, 0x6EC7, 0xB7C0, 0x6EC5, 0xB7C1, 0x6EA5, + 0xB7C2, 0x6E98, 0xB7C3, 0x6EBC, 0xB7C4, 0x6EBA, 0xB7C5, 0x6EAB, 0xB7C6, 0x6ED1, 0xB7C7, 0x6E96, 0xB7C8, 0x6E9C, 0xB7C9, 0x6EC4, + 0xB7CA, 0x6ED4, 0xB7CB, 0x6EAA, 0xB7CC, 0x6EA7, 0xB7CD, 0x6EB4, 0xB7CE, 0x714E, 0xB7CF, 0x7159, 0xB7D0, 0x7169, 0xB7D1, 0x7164, + 0xB7D2, 0x7149, 0xB7D3, 0x7167, 0xB7D4, 0x715C, 0xB7D5, 0x716C, 0xB7D6, 0x7166, 0xB7D7, 0x714C, 0xB7D8, 0x7165, 0xB7D9, 0x715E, + 0xB7DA, 0x7146, 0xB7DB, 0x7168, 0xB7DC, 0x7156, 0xB7DD, 0x723A, 0xB7DE, 0x7252, 0xB7DF, 0x7337, 0xB7E0, 0x7345, 0xB7E1, 0x733F, + 0xB7E2, 0x733E, 0xB7E3, 0x746F, 0xB7E4, 0x745A, 0xB7E5, 0x7455, 0xB7E6, 0x745F, 0xB7E7, 0x745E, 0xB7E8, 0x7441, 0xB7E9, 0x743F, + 0xB7EA, 0x7459, 0xB7EB, 0x745B, 0xB7EC, 0x745C, 0xB7ED, 0x7576, 0xB7EE, 0x7578, 0xB7EF, 0x7600, 0xB7F0, 0x75F0, 0xB7F1, 0x7601, + 0xB7F2, 0x75F2, 0xB7F3, 0x75F1, 0xB7F4, 0x75FA, 0xB7F5, 0x75FF, 0xB7F6, 0x75F4, 0xB7F7, 0x75F3, 0xB7F8, 0x76DE, 0xB7F9, 0x76DF, + 0xB7FA, 0x775B, 0xB7FB, 0x776B, 0xB7FC, 0x7766, 0xB7FD, 0x775E, 0xB7FE, 0x7763, 0xB840, 0x7779, 0xB841, 0x776A, 0xB842, 0x776C, + 0xB843, 0x775C, 0xB844, 0x7765, 0xB845, 0x7768, 0xB846, 0x7762, 0xB847, 0x77EE, 0xB848, 0x788E, 0xB849, 0x78B0, 0xB84A, 0x7897, + 0xB84B, 0x7898, 0xB84C, 0x788C, 0xB84D, 0x7889, 0xB84E, 0x787C, 0xB84F, 0x7891, 0xB850, 0x7893, 0xB851, 0x787F, 0xB852, 0x797A, + 0xB853, 0x797F, 0xB854, 0x7981, 0xB855, 0x842C, 0xB856, 0x79BD, 0xB857, 0x7A1C, 0xB858, 0x7A1A, 0xB859, 0x7A20, 0xB85A, 0x7A14, + 0xB85B, 0x7A1F, 0xB85C, 0x7A1E, 0xB85D, 0x7A9F, 0xB85E, 0x7AA0, 0xB85F, 0x7B77, 0xB860, 0x7BC0, 0xB861, 0x7B60, 0xB862, 0x7B6E, + 0xB863, 0x7B67, 0xB864, 0x7CB1, 0xB865, 0x7CB3, 0xB866, 0x7CB5, 0xB867, 0x7D93, 0xB868, 0x7D79, 0xB869, 0x7D91, 0xB86A, 0x7D81, + 0xB86B, 0x7D8F, 0xB86C, 0x7D5B, 0xB86D, 0x7F6E, 0xB86E, 0x7F69, 0xB86F, 0x7F6A, 0xB870, 0x7F72, 0xB871, 0x7FA9, 0xB872, 0x7FA8, + 0xB873, 0x7FA4, 0xB874, 0x8056, 0xB875, 0x8058, 0xB876, 0x8086, 0xB877, 0x8084, 0xB878, 0x8171, 0xB879, 0x8170, 0xB87A, 0x8178, + 0xB87B, 0x8165, 0xB87C, 0x816E, 0xB87D, 0x8173, 0xB87E, 0x816B, 0xB8A1, 0x8179, 0xB8A2, 0x817A, 0xB8A3, 0x8166, 0xB8A4, 0x8205, + 0xB8A5, 0x8247, 0xB8A6, 0x8482, 0xB8A7, 0x8477, 0xB8A8, 0x843D, 0xB8A9, 0x8431, 0xB8AA, 0x8475, 0xB8AB, 0x8466, 0xB8AC, 0x846B, + 0xB8AD, 0x8449, 0xB8AE, 0x846C, 0xB8AF, 0x845B, 0xB8B0, 0x843C, 0xB8B1, 0x8435, 0xB8B2, 0x8461, 0xB8B3, 0x8463, 0xB8B4, 0x8469, + 0xB8B5, 0x846D, 0xB8B6, 0x8446, 0xB8B7, 0x865E, 0xB8B8, 0x865C, 0xB8B9, 0x865F, 0xB8BA, 0x86F9, 0xB8BB, 0x8713, 0xB8BC, 0x8708, + 0xB8BD, 0x8707, 0xB8BE, 0x8700, 0xB8BF, 0x86FE, 0xB8C0, 0x86FB, 0xB8C1, 0x8702, 0xB8C2, 0x8703, 0xB8C3, 0x8706, 0xB8C4, 0x870A, + 0xB8C5, 0x8859, 0xB8C6, 0x88DF, 0xB8C7, 0x88D4, 0xB8C8, 0x88D9, 0xB8C9, 0x88DC, 0xB8CA, 0x88D8, 0xB8CB, 0x88DD, 0xB8CC, 0x88E1, + 0xB8CD, 0x88CA, 0xB8CE, 0x88D5, 0xB8CF, 0x88D2, 0xB8D0, 0x899C, 0xB8D1, 0x89E3, 0xB8D2, 0x8A6B, 0xB8D3, 0x8A72, 0xB8D4, 0x8A73, + 0xB8D5, 0x8A66, 0xB8D6, 0x8A69, 0xB8D7, 0x8A70, 0xB8D8, 0x8A87, 0xB8D9, 0x8A7C, 0xB8DA, 0x8A63, 0xB8DB, 0x8AA0, 0xB8DC, 0x8A71, + 0xB8DD, 0x8A85, 0xB8DE, 0x8A6D, 0xB8DF, 0x8A62, 0xB8E0, 0x8A6E, 0xB8E1, 0x8A6C, 0xB8E2, 0x8A79, 0xB8E3, 0x8A7B, 0xB8E4, 0x8A3E, + 0xB8E5, 0x8A68, 0xB8E6, 0x8C62, 0xB8E7, 0x8C8A, 0xB8E8, 0x8C89, 0xB8E9, 0x8CCA, 0xB8EA, 0x8CC7, 0xB8EB, 0x8CC8, 0xB8EC, 0x8CC4, + 0xB8ED, 0x8CB2, 0xB8EE, 0x8CC3, 0xB8EF, 0x8CC2, 0xB8F0, 0x8CC5, 0xB8F1, 0x8DE1, 0xB8F2, 0x8DDF, 0xB8F3, 0x8DE8, 0xB8F4, 0x8DEF, + 0xB8F5, 0x8DF3, 0xB8F6, 0x8DFA, 0xB8F7, 0x8DEA, 0xB8F8, 0x8DE4, 0xB8F9, 0x8DE6, 0xB8FA, 0x8EB2, 0xB8FB, 0x8F03, 0xB8FC, 0x8F09, + 0xB8FD, 0x8EFE, 0xB8FE, 0x8F0A, 0xB940, 0x8F9F, 0xB941, 0x8FB2, 0xB942, 0x904B, 0xB943, 0x904A, 0xB944, 0x9053, 0xB945, 0x9042, + 0xB946, 0x9054, 0xB947, 0x903C, 0xB948, 0x9055, 0xB949, 0x9050, 0xB94A, 0x9047, 0xB94B, 0x904F, 0xB94C, 0x904E, 0xB94D, 0x904D, + 0xB94E, 0x9051, 0xB94F, 0x903E, 0xB950, 0x9041, 0xB951, 0x9112, 0xB952, 0x9117, 0xB953, 0x916C, 0xB954, 0x916A, 0xB955, 0x9169, + 0xB956, 0x91C9, 0xB957, 0x9237, 0xB958, 0x9257, 0xB959, 0x9238, 0xB95A, 0x923D, 0xB95B, 0x9240, 0xB95C, 0x923E, 0xB95D, 0x925B, + 0xB95E, 0x924B, 0xB95F, 0x9264, 0xB960, 0x9251, 0xB961, 0x9234, 0xB962, 0x9249, 0xB963, 0x924D, 0xB964, 0x9245, 0xB965, 0x9239, + 0xB966, 0x923F, 0xB967, 0x925A, 0xB968, 0x9598, 0xB969, 0x9698, 0xB96A, 0x9694, 0xB96B, 0x9695, 0xB96C, 0x96CD, 0xB96D, 0x96CB, + 0xB96E, 0x96C9, 0xB96F, 0x96CA, 0xB970, 0x96F7, 0xB971, 0x96FB, 0xB972, 0x96F9, 0xB973, 0x96F6, 0xB974, 0x9756, 0xB975, 0x9774, + 0xB976, 0x9776, 0xB977, 0x9810, 0xB978, 0x9811, 0xB979, 0x9813, 0xB97A, 0x980A, 0xB97B, 0x9812, 0xB97C, 0x980C, 0xB97D, 0x98FC, + 0xB97E, 0x98F4, 0xB9A1, 0x98FD, 0xB9A2, 0x98FE, 0xB9A3, 0x99B3, 0xB9A4, 0x99B1, 0xB9A5, 0x99B4, 0xB9A6, 0x9AE1, 0xB9A7, 0x9CE9, + 0xB9A8, 0x9E82, 0xB9A9, 0x9F0E, 0xB9AA, 0x9F13, 0xB9AB, 0x9F20, 0xB9AC, 0x50E7, 0xB9AD, 0x50EE, 0xB9AE, 0x50E5, 0xB9AF, 0x50D6, + 0xB9B0, 0x50ED, 0xB9B1, 0x50DA, 0xB9B2, 0x50D5, 0xB9B3, 0x50CF, 0xB9B4, 0x50D1, 0xB9B5, 0x50F1, 0xB9B6, 0x50CE, 0xB9B7, 0x50E9, + 0xB9B8, 0x5162, 0xB9B9, 0x51F3, 0xB9BA, 0x5283, 0xB9BB, 0x5282, 0xB9BC, 0x5331, 0xB9BD, 0x53AD, 0xB9BE, 0x55FE, 0xB9BF, 0x5600, + 0xB9C0, 0x561B, 0xB9C1, 0x5617, 0xB9C2, 0x55FD, 0xB9C3, 0x5614, 0xB9C4, 0x5606, 0xB9C5, 0x5609, 0xB9C6, 0x560D, 0xB9C7, 0x560E, + 0xB9C8, 0x55F7, 0xB9C9, 0x5616, 0xB9CA, 0x561F, 0xB9CB, 0x5608, 0xB9CC, 0x5610, 0xB9CD, 0x55F6, 0xB9CE, 0x5718, 0xB9CF, 0x5716, + 0xB9D0, 0x5875, 0xB9D1, 0x587E, 0xB9D2, 0x5883, 0xB9D3, 0x5893, 0xB9D4, 0x588A, 0xB9D5, 0x5879, 0xB9D6, 0x5885, 0xB9D7, 0x587D, + 0xB9D8, 0x58FD, 0xB9D9, 0x5925, 0xB9DA, 0x5922, 0xB9DB, 0x5924, 0xB9DC, 0x596A, 0xB9DD, 0x5969, 0xB9DE, 0x5AE1, 0xB9DF, 0x5AE6, + 0xB9E0, 0x5AE9, 0xB9E1, 0x5AD7, 0xB9E2, 0x5AD6, 0xB9E3, 0x5AD8, 0xB9E4, 0x5AE3, 0xB9E5, 0x5B75, 0xB9E6, 0x5BDE, 0xB9E7, 0x5BE7, + 0xB9E8, 0x5BE1, 0xB9E9, 0x5BE5, 0xB9EA, 0x5BE6, 0xB9EB, 0x5BE8, 0xB9EC, 0x5BE2, 0xB9ED, 0x5BE4, 0xB9EE, 0x5BDF, 0xB9EF, 0x5C0D, + 0xB9F0, 0x5C62, 0xB9F1, 0x5D84, 0xB9F2, 0x5D87, 0xB9F3, 0x5E5B, 0xB9F4, 0x5E63, 0xB9F5, 0x5E55, 0xB9F6, 0x5E57, 0xB9F7, 0x5E54, + 0xB9F8, 0x5ED3, 0xB9F9, 0x5ED6, 0xB9FA, 0x5F0A, 0xB9FB, 0x5F46, 0xB9FC, 0x5F70, 0xB9FD, 0x5FB9, 0xB9FE, 0x6147, 0xBA40, 0x613F, + 0xBA41, 0x614B, 0xBA42, 0x6177, 0xBA43, 0x6162, 0xBA44, 0x6163, 0xBA45, 0x615F, 0xBA46, 0x615A, 0xBA47, 0x6158, 0xBA48, 0x6175, + 0xBA49, 0x622A, 0xBA4A, 0x6487, 0xBA4B, 0x6458, 0xBA4C, 0x6454, 0xBA4D, 0x64A4, 0xBA4E, 0x6478, 0xBA4F, 0x645F, 0xBA50, 0x647A, + 0xBA51, 0x6451, 0xBA52, 0x6467, 0xBA53, 0x6434, 0xBA54, 0x646D, 0xBA55, 0x647B, 0xBA56, 0x6572, 0xBA57, 0x65A1, 0xBA58, 0x65D7, + 0xBA59, 0x65D6, 0xBA5A, 0x66A2, 0xBA5B, 0x66A8, 0xBA5C, 0x669D, 0xBA5D, 0x699C, 0xBA5E, 0x69A8, 0xBA5F, 0x6995, 0xBA60, 0x69C1, + 0xBA61, 0x69AE, 0xBA62, 0x69D3, 0xBA63, 0x69CB, 0xBA64, 0x699B, 0xBA65, 0x69B7, 0xBA66, 0x69BB, 0xBA67, 0x69AB, 0xBA68, 0x69B4, + 0xBA69, 0x69D0, 0xBA6A, 0x69CD, 0xBA6B, 0x69AD, 0xBA6C, 0x69CC, 0xBA6D, 0x69A6, 0xBA6E, 0x69C3, 0xBA6F, 0x69A3, 0xBA70, 0x6B49, + 0xBA71, 0x6B4C, 0xBA72, 0x6C33, 0xBA73, 0x6F33, 0xBA74, 0x6F14, 0xBA75, 0x6EFE, 0xBA76, 0x6F13, 0xBA77, 0x6EF4, 0xBA78, 0x6F29, + 0xBA79, 0x6F3E, 0xBA7A, 0x6F20, 0xBA7B, 0x6F2C, 0xBA7C, 0x6F0F, 0xBA7D, 0x6F02, 0xBA7E, 0x6F22, 0xBAA1, 0x6EFF, 0xBAA2, 0x6EEF, + 0xBAA3, 0x6F06, 0xBAA4, 0x6F31, 0xBAA5, 0x6F38, 0xBAA6, 0x6F32, 0xBAA7, 0x6F23, 0xBAA8, 0x6F15, 0xBAA9, 0x6F2B, 0xBAAA, 0x6F2F, + 0xBAAB, 0x6F88, 0xBAAC, 0x6F2A, 0xBAAD, 0x6EEC, 0xBAAE, 0x6F01, 0xBAAF, 0x6EF2, 0xBAB0, 0x6ECC, 0xBAB1, 0x6EF7, 0xBAB2, 0x7194, + 0xBAB3, 0x7199, 0xBAB4, 0x717D, 0xBAB5, 0x718A, 0xBAB6, 0x7184, 0xBAB7, 0x7192, 0xBAB8, 0x723E, 0xBAB9, 0x7292, 0xBABA, 0x7296, + 0xBABB, 0x7344, 0xBABC, 0x7350, 0xBABD, 0x7464, 0xBABE, 0x7463, 0xBABF, 0x746A, 0xBAC0, 0x7470, 0xBAC1, 0x746D, 0xBAC2, 0x7504, + 0xBAC3, 0x7591, 0xBAC4, 0x7627, 0xBAC5, 0x760D, 0xBAC6, 0x760B, 0xBAC7, 0x7609, 0xBAC8, 0x7613, 0xBAC9, 0x76E1, 0xBACA, 0x76E3, + 0xBACB, 0x7784, 0xBACC, 0x777D, 0xBACD, 0x777F, 0xBACE, 0x7761, 0xBACF, 0x78C1, 0xBAD0, 0x789F, 0xBAD1, 0x78A7, 0xBAD2, 0x78B3, + 0xBAD3, 0x78A9, 0xBAD4, 0x78A3, 0xBAD5, 0x798E, 0xBAD6, 0x798F, 0xBAD7, 0x798D, 0xBAD8, 0x7A2E, 0xBAD9, 0x7A31, 0xBADA, 0x7AAA, + 0xBADB, 0x7AA9, 0xBADC, 0x7AED, 0xBADD, 0x7AEF, 0xBADE, 0x7BA1, 0xBADF, 0x7B95, 0xBAE0, 0x7B8B, 0xBAE1, 0x7B75, 0xBAE2, 0x7B97, + 0xBAE3, 0x7B9D, 0xBAE4, 0x7B94, 0xBAE5, 0x7B8F, 0xBAE6, 0x7BB8, 0xBAE7, 0x7B87, 0xBAE8, 0x7B84, 0xBAE9, 0x7CB9, 0xBAEA, 0x7CBD, + 0xBAEB, 0x7CBE, 0xBAEC, 0x7DBB, 0xBAED, 0x7DB0, 0xBAEE, 0x7D9C, 0xBAEF, 0x7DBD, 0xBAF0, 0x7DBE, 0xBAF1, 0x7DA0, 0xBAF2, 0x7DCA, + 0xBAF3, 0x7DB4, 0xBAF4, 0x7DB2, 0xBAF5, 0x7DB1, 0xBAF6, 0x7DBA, 0xBAF7, 0x7DA2, 0xBAF8, 0x7DBF, 0xBAF9, 0x7DB5, 0xBAFA, 0x7DB8, + 0xBAFB, 0x7DAD, 0xBAFC, 0x7DD2, 0xBAFD, 0x7DC7, 0xBAFE, 0x7DAC, 0xBB40, 0x7F70, 0xBB41, 0x7FE0, 0xBB42, 0x7FE1, 0xBB43, 0x7FDF, + 0xBB44, 0x805E, 0xBB45, 0x805A, 0xBB46, 0x8087, 0xBB47, 0x8150, 0xBB48, 0x8180, 0xBB49, 0x818F, 0xBB4A, 0x8188, 0xBB4B, 0x818A, + 0xBB4C, 0x817F, 0xBB4D, 0x8182, 0xBB4E, 0x81E7, 0xBB4F, 0x81FA, 0xBB50, 0x8207, 0xBB51, 0x8214, 0xBB52, 0x821E, 0xBB53, 0x824B, + 0xBB54, 0x84C9, 0xBB55, 0x84BF, 0xBB56, 0x84C6, 0xBB57, 0x84C4, 0xBB58, 0x8499, 0xBB59, 0x849E, 0xBB5A, 0x84B2, 0xBB5B, 0x849C, + 0xBB5C, 0x84CB, 0xBB5D, 0x84B8, 0xBB5E, 0x84C0, 0xBB5F, 0x84D3, 0xBB60, 0x8490, 0xBB61, 0x84BC, 0xBB62, 0x84D1, 0xBB63, 0x84CA, + 0xBB64, 0x873F, 0xBB65, 0x871C, 0xBB66, 0x873B, 0xBB67, 0x8722, 0xBB68, 0x8725, 0xBB69, 0x8734, 0xBB6A, 0x8718, 0xBB6B, 0x8755, + 0xBB6C, 0x8737, 0xBB6D, 0x8729, 0xBB6E, 0x88F3, 0xBB6F, 0x8902, 0xBB70, 0x88F4, 0xBB71, 0x88F9, 0xBB72, 0x88F8, 0xBB73, 0x88FD, + 0xBB74, 0x88E8, 0xBB75, 0x891A, 0xBB76, 0x88EF, 0xBB77, 0x8AA6, 0xBB78, 0x8A8C, 0xBB79, 0x8A9E, 0xBB7A, 0x8AA3, 0xBB7B, 0x8A8D, + 0xBB7C, 0x8AA1, 0xBB7D, 0x8A93, 0xBB7E, 0x8AA4, 0xBBA1, 0x8AAA, 0xBBA2, 0x8AA5, 0xBBA3, 0x8AA8, 0xBBA4, 0x8A98, 0xBBA5, 0x8A91, + 0xBBA6, 0x8A9A, 0xBBA7, 0x8AA7, 0xBBA8, 0x8C6A, 0xBBA9, 0x8C8D, 0xBBAA, 0x8C8C, 0xBBAB, 0x8CD3, 0xBBAC, 0x8CD1, 0xBBAD, 0x8CD2, + 0xBBAE, 0x8D6B, 0xBBAF, 0x8D99, 0xBBB0, 0x8D95, 0xBBB1, 0x8DFC, 0xBBB2, 0x8F14, 0xBBB3, 0x8F12, 0xBBB4, 0x8F15, 0xBBB5, 0x8F13, + 0xBBB6, 0x8FA3, 0xBBB7, 0x9060, 0xBBB8, 0x9058, 0xBBB9, 0x905C, 0xBBBA, 0x9063, 0xBBBB, 0x9059, 0xBBBC, 0x905E, 0xBBBD, 0x9062, + 0xBBBE, 0x905D, 0xBBBF, 0x905B, 0xBBC0, 0x9119, 0xBBC1, 0x9118, 0xBBC2, 0x911E, 0xBBC3, 0x9175, 0xBBC4, 0x9178, 0xBBC5, 0x9177, + 0xBBC6, 0x9174, 0xBBC7, 0x9278, 0xBBC8, 0x9280, 0xBBC9, 0x9285, 0xBBCA, 0x9298, 0xBBCB, 0x9296, 0xBBCC, 0x927B, 0xBBCD, 0x9293, + 0xBBCE, 0x929C, 0xBBCF, 0x92A8, 0xBBD0, 0x927C, 0xBBD1, 0x9291, 0xBBD2, 0x95A1, 0xBBD3, 0x95A8, 0xBBD4, 0x95A9, 0xBBD5, 0x95A3, + 0xBBD6, 0x95A5, 0xBBD7, 0x95A4, 0xBBD8, 0x9699, 0xBBD9, 0x969C, 0xBBDA, 0x969B, 0xBBDB, 0x96CC, 0xBBDC, 0x96D2, 0xBBDD, 0x9700, + 0xBBDE, 0x977C, 0xBBDF, 0x9785, 0xBBE0, 0x97F6, 0xBBE1, 0x9817, 0xBBE2, 0x9818, 0xBBE3, 0x98AF, 0xBBE4, 0x98B1, 0xBBE5, 0x9903, + 0xBBE6, 0x9905, 0xBBE7, 0x990C, 0xBBE8, 0x9909, 0xBBE9, 0x99C1, 0xBBEA, 0x9AAF, 0xBBEB, 0x9AB0, 0xBBEC, 0x9AE6, 0xBBED, 0x9B41, + 0xBBEE, 0x9B42, 0xBBEF, 0x9CF4, 0xBBF0, 0x9CF6, 0xBBF1, 0x9CF3, 0xBBF2, 0x9EBC, 0xBBF3, 0x9F3B, 0xBBF4, 0x9F4A, 0xBBF5, 0x5104, + 0xBBF6, 0x5100, 0xBBF7, 0x50FB, 0xBBF8, 0x50F5, 0xBBF9, 0x50F9, 0xBBFA, 0x5102, 0xBBFB, 0x5108, 0xBBFC, 0x5109, 0xBBFD, 0x5105, + 0xBBFE, 0x51DC, 0xBC40, 0x5287, 0xBC41, 0x5288, 0xBC42, 0x5289, 0xBC43, 0x528D, 0xBC44, 0x528A, 0xBC45, 0x52F0, 0xBC46, 0x53B2, + 0xBC47, 0x562E, 0xBC48, 0x563B, 0xBC49, 0x5639, 0xBC4A, 0x5632, 0xBC4B, 0x563F, 0xBC4C, 0x5634, 0xBC4D, 0x5629, 0xBC4E, 0x5653, + 0xBC4F, 0x564E, 0xBC50, 0x5657, 0xBC51, 0x5674, 0xBC52, 0x5636, 0xBC53, 0x562F, 0xBC54, 0x5630, 0xBC55, 0x5880, 0xBC56, 0x589F, + 0xBC57, 0x589E, 0xBC58, 0x58B3, 0xBC59, 0x589C, 0xBC5A, 0x58AE, 0xBC5B, 0x58A9, 0xBC5C, 0x58A6, 0xBC5D, 0x596D, 0xBC5E, 0x5B09, + 0xBC5F, 0x5AFB, 0xBC60, 0x5B0B, 0xBC61, 0x5AF5, 0xBC62, 0x5B0C, 0xBC63, 0x5B08, 0xBC64, 0x5BEE, 0xBC65, 0x5BEC, 0xBC66, 0x5BE9, + 0xBC67, 0x5BEB, 0xBC68, 0x5C64, 0xBC69, 0x5C65, 0xBC6A, 0x5D9D, 0xBC6B, 0x5D94, 0xBC6C, 0x5E62, 0xBC6D, 0x5E5F, 0xBC6E, 0x5E61, + 0xBC6F, 0x5EE2, 0xBC70, 0x5EDA, 0xBC71, 0x5EDF, 0xBC72, 0x5EDD, 0xBC73, 0x5EE3, 0xBC74, 0x5EE0, 0xBC75, 0x5F48, 0xBC76, 0x5F71, + 0xBC77, 0x5FB7, 0xBC78, 0x5FB5, 0xBC79, 0x6176, 0xBC7A, 0x6167, 0xBC7B, 0x616E, 0xBC7C, 0x615D, 0xBC7D, 0x6155, 0xBC7E, 0x6182, + 0xBCA1, 0x617C, 0xBCA2, 0x6170, 0xBCA3, 0x616B, 0xBCA4, 0x617E, 0xBCA5, 0x61A7, 0xBCA6, 0x6190, 0xBCA7, 0x61AB, 0xBCA8, 0x618E, + 0xBCA9, 0x61AC, 0xBCAA, 0x619A, 0xBCAB, 0x61A4, 0xBCAC, 0x6194, 0xBCAD, 0x61AE, 0xBCAE, 0x622E, 0xBCAF, 0x6469, 0xBCB0, 0x646F, + 0xBCB1, 0x6479, 0xBCB2, 0x649E, 0xBCB3, 0x64B2, 0xBCB4, 0x6488, 0xBCB5, 0x6490, 0xBCB6, 0x64B0, 0xBCB7, 0x64A5, 0xBCB8, 0x6493, + 0xBCB9, 0x6495, 0xBCBA, 0x64A9, 0xBCBB, 0x6492, 0xBCBC, 0x64AE, 0xBCBD, 0x64AD, 0xBCBE, 0x64AB, 0xBCBF, 0x649A, 0xBCC0, 0x64AC, + 0xBCC1, 0x6499, 0xBCC2, 0x64A2, 0xBCC3, 0x64B3, 0xBCC4, 0x6575, 0xBCC5, 0x6577, 0xBCC6, 0x6578, 0xBCC7, 0x66AE, 0xBCC8, 0x66AB, + 0xBCC9, 0x66B4, 0xBCCA, 0x66B1, 0xBCCB, 0x6A23, 0xBCCC, 0x6A1F, 0xBCCD, 0x69E8, 0xBCCE, 0x6A01, 0xBCCF, 0x6A1E, 0xBCD0, 0x6A19, + 0xBCD1, 0x69FD, 0xBCD2, 0x6A21, 0xBCD3, 0x6A13, 0xBCD4, 0x6A0A, 0xBCD5, 0x69F3, 0xBCD6, 0x6A02, 0xBCD7, 0x6A05, 0xBCD8, 0x69ED, + 0xBCD9, 0x6A11, 0xBCDA, 0x6B50, 0xBCDB, 0x6B4E, 0xBCDC, 0x6BA4, 0xBCDD, 0x6BC5, 0xBCDE, 0x6BC6, 0xBCDF, 0x6F3F, 0xBCE0, 0x6F7C, + 0xBCE1, 0x6F84, 0xBCE2, 0x6F51, 0xBCE3, 0x6F66, 0xBCE4, 0x6F54, 0xBCE5, 0x6F86, 0xBCE6, 0x6F6D, 0xBCE7, 0x6F5B, 0xBCE8, 0x6F78, + 0xBCE9, 0x6F6E, 0xBCEA, 0x6F8E, 0xBCEB, 0x6F7A, 0xBCEC, 0x6F70, 0xBCED, 0x6F64, 0xBCEE, 0x6F97, 0xBCEF, 0x6F58, 0xBCF0, 0x6ED5, + 0xBCF1, 0x6F6F, 0xBCF2, 0x6F60, 0xBCF3, 0x6F5F, 0xBCF4, 0x719F, 0xBCF5, 0x71AC, 0xBCF6, 0x71B1, 0xBCF7, 0x71A8, 0xBCF8, 0x7256, + 0xBCF9, 0x729B, 0xBCFA, 0x734E, 0xBCFB, 0x7357, 0xBCFC, 0x7469, 0xBCFD, 0x748B, 0xBCFE, 0x7483, 0xBD40, 0x747E, 0xBD41, 0x7480, + 0xBD42, 0x757F, 0xBD43, 0x7620, 0xBD44, 0x7629, 0xBD45, 0x761F, 0xBD46, 0x7624, 0xBD47, 0x7626, 0xBD48, 0x7621, 0xBD49, 0x7622, + 0xBD4A, 0x769A, 0xBD4B, 0x76BA, 0xBD4C, 0x76E4, 0xBD4D, 0x778E, 0xBD4E, 0x7787, 0xBD4F, 0x778C, 0xBD50, 0x7791, 0xBD51, 0x778B, + 0xBD52, 0x78CB, 0xBD53, 0x78C5, 0xBD54, 0x78BA, 0xBD55, 0x78CA, 0xBD56, 0x78BE, 0xBD57, 0x78D5, 0xBD58, 0x78BC, 0xBD59, 0x78D0, + 0xBD5A, 0x7A3F, 0xBD5B, 0x7A3C, 0xBD5C, 0x7A40, 0xBD5D, 0x7A3D, 0xBD5E, 0x7A37, 0xBD5F, 0x7A3B, 0xBD60, 0x7AAF, 0xBD61, 0x7AAE, + 0xBD62, 0x7BAD, 0xBD63, 0x7BB1, 0xBD64, 0x7BC4, 0xBD65, 0x7BB4, 0xBD66, 0x7BC6, 0xBD67, 0x7BC7, 0xBD68, 0x7BC1, 0xBD69, 0x7BA0, + 0xBD6A, 0x7BCC, 0xBD6B, 0x7CCA, 0xBD6C, 0x7DE0, 0xBD6D, 0x7DF4, 0xBD6E, 0x7DEF, 0xBD6F, 0x7DFB, 0xBD70, 0x7DD8, 0xBD71, 0x7DEC, + 0xBD72, 0x7DDD, 0xBD73, 0x7DE8, 0xBD74, 0x7DE3, 0xBD75, 0x7DDA, 0xBD76, 0x7DDE, 0xBD77, 0x7DE9, 0xBD78, 0x7D9E, 0xBD79, 0x7DD9, + 0xBD7A, 0x7DF2, 0xBD7B, 0x7DF9, 0xBD7C, 0x7F75, 0xBD7D, 0x7F77, 0xBD7E, 0x7FAF, 0xBDA1, 0x7FE9, 0xBDA2, 0x8026, 0xBDA3, 0x819B, + 0xBDA4, 0x819C, 0xBDA5, 0x819D, 0xBDA6, 0x81A0, 0xBDA7, 0x819A, 0xBDA8, 0x8198, 0xBDA9, 0x8517, 0xBDAA, 0x853D, 0xBDAB, 0x851A, + 0xBDAC, 0x84EE, 0xBDAD, 0x852C, 0xBDAE, 0x852D, 0xBDAF, 0x8513, 0xBDB0, 0x8511, 0xBDB1, 0x8523, 0xBDB2, 0x8521, 0xBDB3, 0x8514, + 0xBDB4, 0x84EC, 0xBDB5, 0x8525, 0xBDB6, 0x84FF, 0xBDB7, 0x8506, 0xBDB8, 0x8782, 0xBDB9, 0x8774, 0xBDBA, 0x8776, 0xBDBB, 0x8760, + 0xBDBC, 0x8766, 0xBDBD, 0x8778, 0xBDBE, 0x8768, 0xBDBF, 0x8759, 0xBDC0, 0x8757, 0xBDC1, 0x874C, 0xBDC2, 0x8753, 0xBDC3, 0x885B, + 0xBDC4, 0x885D, 0xBDC5, 0x8910, 0xBDC6, 0x8907, 0xBDC7, 0x8912, 0xBDC8, 0x8913, 0xBDC9, 0x8915, 0xBDCA, 0x890A, 0xBDCB, 0x8ABC, + 0xBDCC, 0x8AD2, 0xBDCD, 0x8AC7, 0xBDCE, 0x8AC4, 0xBDCF, 0x8A95, 0xBDD0, 0x8ACB, 0xBDD1, 0x8AF8, 0xBDD2, 0x8AB2, 0xBDD3, 0x8AC9, + 0xBDD4, 0x8AC2, 0xBDD5, 0x8ABF, 0xBDD6, 0x8AB0, 0xBDD7, 0x8AD6, 0xBDD8, 0x8ACD, 0xBDD9, 0x8AB6, 0xBDDA, 0x8AB9, 0xBDDB, 0x8ADB, + 0xBDDC, 0x8C4C, 0xBDDD, 0x8C4E, 0xBDDE, 0x8C6C, 0xBDDF, 0x8CE0, 0xBDE0, 0x8CDE, 0xBDE1, 0x8CE6, 0xBDE2, 0x8CE4, 0xBDE3, 0x8CEC, + 0xBDE4, 0x8CED, 0xBDE5, 0x8CE2, 0xBDE6, 0x8CE3, 0xBDE7, 0x8CDC, 0xBDE8, 0x8CEA, 0xBDE9, 0x8CE1, 0xBDEA, 0x8D6D, 0xBDEB, 0x8D9F, + 0xBDEC, 0x8DA3, 0xBDED, 0x8E2B, 0xBDEE, 0x8E10, 0xBDEF, 0x8E1D, 0xBDF0, 0x8E22, 0xBDF1, 0x8E0F, 0xBDF2, 0x8E29, 0xBDF3, 0x8E1F, + 0xBDF4, 0x8E21, 0xBDF5, 0x8E1E, 0xBDF6, 0x8EBA, 0xBDF7, 0x8F1D, 0xBDF8, 0x8F1B, 0xBDF9, 0x8F1F, 0xBDFA, 0x8F29, 0xBDFB, 0x8F26, + 0xBDFC, 0x8F2A, 0xBDFD, 0x8F1C, 0xBDFE, 0x8F1E, 0xBE40, 0x8F25, 0xBE41, 0x9069, 0xBE42, 0x906E, 0xBE43, 0x9068, 0xBE44, 0x906D, + 0xBE45, 0x9077, 0xBE46, 0x9130, 0xBE47, 0x912D, 0xBE48, 0x9127, 0xBE49, 0x9131, 0xBE4A, 0x9187, 0xBE4B, 0x9189, 0xBE4C, 0x918B, + 0xBE4D, 0x9183, 0xBE4E, 0x92C5, 0xBE4F, 0x92BB, 0xBE50, 0x92B7, 0xBE51, 0x92EA, 0xBE52, 0x92AC, 0xBE53, 0x92E4, 0xBE54, 0x92C1, + 0xBE55, 0x92B3, 0xBE56, 0x92BC, 0xBE57, 0x92D2, 0xBE58, 0x92C7, 0xBE59, 0x92F0, 0xBE5A, 0x92B2, 0xBE5B, 0x95AD, 0xBE5C, 0x95B1, + 0xBE5D, 0x9704, 0xBE5E, 0x9706, 0xBE5F, 0x9707, 0xBE60, 0x9709, 0xBE61, 0x9760, 0xBE62, 0x978D, 0xBE63, 0x978B, 0xBE64, 0x978F, + 0xBE65, 0x9821, 0xBE66, 0x982B, 0xBE67, 0x981C, 0xBE68, 0x98B3, 0xBE69, 0x990A, 0xBE6A, 0x9913, 0xBE6B, 0x9912, 0xBE6C, 0x9918, + 0xBE6D, 0x99DD, 0xBE6E, 0x99D0, 0xBE6F, 0x99DF, 0xBE70, 0x99DB, 0xBE71, 0x99D1, 0xBE72, 0x99D5, 0xBE73, 0x99D2, 0xBE74, 0x99D9, + 0xBE75, 0x9AB7, 0xBE76, 0x9AEE, 0xBE77, 0x9AEF, 0xBE78, 0x9B27, 0xBE79, 0x9B45, 0xBE7A, 0x9B44, 0xBE7B, 0x9B77, 0xBE7C, 0x9B6F, + 0xBE7D, 0x9D06, 0xBE7E, 0x9D09, 0xBEA1, 0x9D03, 0xBEA2, 0x9EA9, 0xBEA3, 0x9EBE, 0xBEA4, 0x9ECE, 0xBEA5, 0x58A8, 0xBEA6, 0x9F52, + 0xBEA7, 0x5112, 0xBEA8, 0x5118, 0xBEA9, 0x5114, 0xBEAA, 0x5110, 0xBEAB, 0x5115, 0xBEAC, 0x5180, 0xBEAD, 0x51AA, 0xBEAE, 0x51DD, + 0xBEAF, 0x5291, 0xBEB0, 0x5293, 0xBEB1, 0x52F3, 0xBEB2, 0x5659, 0xBEB3, 0x566B, 0xBEB4, 0x5679, 0xBEB5, 0x5669, 0xBEB6, 0x5664, + 0xBEB7, 0x5678, 0xBEB8, 0x566A, 0xBEB9, 0x5668, 0xBEBA, 0x5665, 0xBEBB, 0x5671, 0xBEBC, 0x566F, 0xBEBD, 0x566C, 0xBEBE, 0x5662, + 0xBEBF, 0x5676, 0xBEC0, 0x58C1, 0xBEC1, 0x58BE, 0xBEC2, 0x58C7, 0xBEC3, 0x58C5, 0xBEC4, 0x596E, 0xBEC5, 0x5B1D, 0xBEC6, 0x5B34, + 0xBEC7, 0x5B78, 0xBEC8, 0x5BF0, 0xBEC9, 0x5C0E, 0xBECA, 0x5F4A, 0xBECB, 0x61B2, 0xBECC, 0x6191, 0xBECD, 0x61A9, 0xBECE, 0x618A, + 0xBECF, 0x61CD, 0xBED0, 0x61B6, 0xBED1, 0x61BE, 0xBED2, 0x61CA, 0xBED3, 0x61C8, 0xBED4, 0x6230, 0xBED5, 0x64C5, 0xBED6, 0x64C1, + 0xBED7, 0x64CB, 0xBED8, 0x64BB, 0xBED9, 0x64BC, 0xBEDA, 0x64DA, 0xBEDB, 0x64C4, 0xBEDC, 0x64C7, 0xBEDD, 0x64C2, 0xBEDE, 0x64CD, + 0xBEDF, 0x64BF, 0xBEE0, 0x64D2, 0xBEE1, 0x64D4, 0xBEE2, 0x64BE, 0xBEE3, 0x6574, 0xBEE4, 0x66C6, 0xBEE5, 0x66C9, 0xBEE6, 0x66B9, + 0xBEE7, 0x66C4, 0xBEE8, 0x66C7, 0xBEE9, 0x66B8, 0xBEEA, 0x6A3D, 0xBEEB, 0x6A38, 0xBEEC, 0x6A3A, 0xBEED, 0x6A59, 0xBEEE, 0x6A6B, + 0xBEEF, 0x6A58, 0xBEF0, 0x6A39, 0xBEF1, 0x6A44, 0xBEF2, 0x6A62, 0xBEF3, 0x6A61, 0xBEF4, 0x6A4B, 0xBEF5, 0x6A47, 0xBEF6, 0x6A35, + 0xBEF7, 0x6A5F, 0xBEF8, 0x6A48, 0xBEF9, 0x6B59, 0xBEFA, 0x6B77, 0xBEFB, 0x6C05, 0xBEFC, 0x6FC2, 0xBEFD, 0x6FB1, 0xBEFE, 0x6FA1, + 0xBF40, 0x6FC3, 0xBF41, 0x6FA4, 0xBF42, 0x6FC1, 0xBF43, 0x6FA7, 0xBF44, 0x6FB3, 0xBF45, 0x6FC0, 0xBF46, 0x6FB9, 0xBF47, 0x6FB6, + 0xBF48, 0x6FA6, 0xBF49, 0x6FA0, 0xBF4A, 0x6FB4, 0xBF4B, 0x71BE, 0xBF4C, 0x71C9, 0xBF4D, 0x71D0, 0xBF4E, 0x71D2, 0xBF4F, 0x71C8, + 0xBF50, 0x71D5, 0xBF51, 0x71B9, 0xBF52, 0x71CE, 0xBF53, 0x71D9, 0xBF54, 0x71DC, 0xBF55, 0x71C3, 0xBF56, 0x71C4, 0xBF57, 0x7368, + 0xBF58, 0x749C, 0xBF59, 0x74A3, 0xBF5A, 0x7498, 0xBF5B, 0x749F, 0xBF5C, 0x749E, 0xBF5D, 0x74E2, 0xBF5E, 0x750C, 0xBF5F, 0x750D, + 0xBF60, 0x7634, 0xBF61, 0x7638, 0xBF62, 0x763A, 0xBF63, 0x76E7, 0xBF64, 0x76E5, 0xBF65, 0x77A0, 0xBF66, 0x779E, 0xBF67, 0x779F, + 0xBF68, 0x77A5, 0xBF69, 0x78E8, 0xBF6A, 0x78DA, 0xBF6B, 0x78EC, 0xBF6C, 0x78E7, 0xBF6D, 0x79A6, 0xBF6E, 0x7A4D, 0xBF6F, 0x7A4E, + 0xBF70, 0x7A46, 0xBF71, 0x7A4C, 0xBF72, 0x7A4B, 0xBF73, 0x7ABA, 0xBF74, 0x7BD9, 0xBF75, 0x7C11, 0xBF76, 0x7BC9, 0xBF77, 0x7BE4, + 0xBF78, 0x7BDB, 0xBF79, 0x7BE1, 0xBF7A, 0x7BE9, 0xBF7B, 0x7BE6, 0xBF7C, 0x7CD5, 0xBF7D, 0x7CD6, 0xBF7E, 0x7E0A, 0xBFA1, 0x7E11, + 0xBFA2, 0x7E08, 0xBFA3, 0x7E1B, 0xBFA4, 0x7E23, 0xBFA5, 0x7E1E, 0xBFA6, 0x7E1D, 0xBFA7, 0x7E09, 0xBFA8, 0x7E10, 0xBFA9, 0x7F79, + 0xBFAA, 0x7FB2, 0xBFAB, 0x7FF0, 0xBFAC, 0x7FF1, 0xBFAD, 0x7FEE, 0xBFAE, 0x8028, 0xBFAF, 0x81B3, 0xBFB0, 0x81A9, 0xBFB1, 0x81A8, + 0xBFB2, 0x81FB, 0xBFB3, 0x8208, 0xBFB4, 0x8258, 0xBFB5, 0x8259, 0xBFB6, 0x854A, 0xBFB7, 0x8559, 0xBFB8, 0x8548, 0xBFB9, 0x8568, + 0xBFBA, 0x8569, 0xBFBB, 0x8543, 0xBFBC, 0x8549, 0xBFBD, 0x856D, 0xBFBE, 0x856A, 0xBFBF, 0x855E, 0xBFC0, 0x8783, 0xBFC1, 0x879F, + 0xBFC2, 0x879E, 0xBFC3, 0x87A2, 0xBFC4, 0x878D, 0xBFC5, 0x8861, 0xBFC6, 0x892A, 0xBFC7, 0x8932, 0xBFC8, 0x8925, 0xBFC9, 0x892B, + 0xBFCA, 0x8921, 0xBFCB, 0x89AA, 0xBFCC, 0x89A6, 0xBFCD, 0x8AE6, 0xBFCE, 0x8AFA, 0xBFCF, 0x8AEB, 0xBFD0, 0x8AF1, 0xBFD1, 0x8B00, + 0xBFD2, 0x8ADC, 0xBFD3, 0x8AE7, 0xBFD4, 0x8AEE, 0xBFD5, 0x8AFE, 0xBFD6, 0x8B01, 0xBFD7, 0x8B02, 0xBFD8, 0x8AF7, 0xBFD9, 0x8AED, + 0xBFDA, 0x8AF3, 0xBFDB, 0x8AF6, 0xBFDC, 0x8AFC, 0xBFDD, 0x8C6B, 0xBFDE, 0x8C6D, 0xBFDF, 0x8C93, 0xBFE0, 0x8CF4, 0xBFE1, 0x8E44, + 0xBFE2, 0x8E31, 0xBFE3, 0x8E34, 0xBFE4, 0x8E42, 0xBFE5, 0x8E39, 0xBFE6, 0x8E35, 0xBFE7, 0x8F3B, 0xBFE8, 0x8F2F, 0xBFE9, 0x8F38, + 0xBFEA, 0x8F33, 0xBFEB, 0x8FA8, 0xBFEC, 0x8FA6, 0xBFED, 0x9075, 0xBFEE, 0x9074, 0xBFEF, 0x9078, 0xBFF0, 0x9072, 0xBFF1, 0x907C, + 0xBFF2, 0x907A, 0xBFF3, 0x9134, 0xBFF4, 0x9192, 0xBFF5, 0x9320, 0xBFF6, 0x9336, 0xBFF7, 0x92F8, 0xBFF8, 0x9333, 0xBFF9, 0x932F, + 0xBFFA, 0x9322, 0xBFFB, 0x92FC, 0xBFFC, 0x932B, 0xBFFD, 0x9304, 0xBFFE, 0x931A, 0xC040, 0x9310, 0xC041, 0x9326, 0xC042, 0x9321, + 0xC043, 0x9315, 0xC044, 0x932E, 0xC045, 0x9319, 0xC046, 0x95BB, 0xC047, 0x96A7, 0xC048, 0x96A8, 0xC049, 0x96AA, 0xC04A, 0x96D5, + 0xC04B, 0x970E, 0xC04C, 0x9711, 0xC04D, 0x9716, 0xC04E, 0x970D, 0xC04F, 0x9713, 0xC050, 0x970F, 0xC051, 0x975B, 0xC052, 0x975C, + 0xC053, 0x9766, 0xC054, 0x9798, 0xC055, 0x9830, 0xC056, 0x9838, 0xC057, 0x983B, 0xC058, 0x9837, 0xC059, 0x982D, 0xC05A, 0x9839, + 0xC05B, 0x9824, 0xC05C, 0x9910, 0xC05D, 0x9928, 0xC05E, 0x991E, 0xC05F, 0x991B, 0xC060, 0x9921, 0xC061, 0x991A, 0xC062, 0x99ED, + 0xC063, 0x99E2, 0xC064, 0x99F1, 0xC065, 0x9AB8, 0xC066, 0x9ABC, 0xC067, 0x9AFB, 0xC068, 0x9AED, 0xC069, 0x9B28, 0xC06A, 0x9B91, + 0xC06B, 0x9D15, 0xC06C, 0x9D23, 0xC06D, 0x9D26, 0xC06E, 0x9D28, 0xC06F, 0x9D12, 0xC070, 0x9D1B, 0xC071, 0x9ED8, 0xC072, 0x9ED4, + 0xC073, 0x9F8D, 0xC074, 0x9F9C, 0xC075, 0x512A, 0xC076, 0x511F, 0xC077, 0x5121, 0xC078, 0x5132, 0xC079, 0x52F5, 0xC07A, 0x568E, + 0xC07B, 0x5680, 0xC07C, 0x5690, 0xC07D, 0x5685, 0xC07E, 0x5687, 0xC0A1, 0x568F, 0xC0A2, 0x58D5, 0xC0A3, 0x58D3, 0xC0A4, 0x58D1, + 0xC0A5, 0x58CE, 0xC0A6, 0x5B30, 0xC0A7, 0x5B2A, 0xC0A8, 0x5B24, 0xC0A9, 0x5B7A, 0xC0AA, 0x5C37, 0xC0AB, 0x5C68, 0xC0AC, 0x5DBC, + 0xC0AD, 0x5DBA, 0xC0AE, 0x5DBD, 0xC0AF, 0x5DB8, 0xC0B0, 0x5E6B, 0xC0B1, 0x5F4C, 0xC0B2, 0x5FBD, 0xC0B3, 0x61C9, 0xC0B4, 0x61C2, + 0xC0B5, 0x61C7, 0xC0B6, 0x61E6, 0xC0B7, 0x61CB, 0xC0B8, 0x6232, 0xC0B9, 0x6234, 0xC0BA, 0x64CE, 0xC0BB, 0x64CA, 0xC0BC, 0x64D8, + 0xC0BD, 0x64E0, 0xC0BE, 0x64F0, 0xC0BF, 0x64E6, 0xC0C0, 0x64EC, 0xC0C1, 0x64F1, 0xC0C2, 0x64E2, 0xC0C3, 0x64ED, 0xC0C4, 0x6582, + 0xC0C5, 0x6583, 0xC0C6, 0x66D9, 0xC0C7, 0x66D6, 0xC0C8, 0x6A80, 0xC0C9, 0x6A94, 0xC0CA, 0x6A84, 0xC0CB, 0x6AA2, 0xC0CC, 0x6A9C, + 0xC0CD, 0x6ADB, 0xC0CE, 0x6AA3, 0xC0CF, 0x6A7E, 0xC0D0, 0x6A97, 0xC0D1, 0x6A90, 0xC0D2, 0x6AA0, 0xC0D3, 0x6B5C, 0xC0D4, 0x6BAE, + 0xC0D5, 0x6BDA, 0xC0D6, 0x6C08, 0xC0D7, 0x6FD8, 0xC0D8, 0x6FF1, 0xC0D9, 0x6FDF, 0xC0DA, 0x6FE0, 0xC0DB, 0x6FDB, 0xC0DC, 0x6FE4, + 0xC0DD, 0x6FEB, 0xC0DE, 0x6FEF, 0xC0DF, 0x6F80, 0xC0E0, 0x6FEC, 0xC0E1, 0x6FE1, 0xC0E2, 0x6FE9, 0xC0E3, 0x6FD5, 0xC0E4, 0x6FEE, + 0xC0E5, 0x6FF0, 0xC0E6, 0x71E7, 0xC0E7, 0x71DF, 0xC0E8, 0x71EE, 0xC0E9, 0x71E6, 0xC0EA, 0x71E5, 0xC0EB, 0x71ED, 0xC0EC, 0x71EC, + 0xC0ED, 0x71F4, 0xC0EE, 0x71E0, 0xC0EF, 0x7235, 0xC0F0, 0x7246, 0xC0F1, 0x7370, 0xC0F2, 0x7372, 0xC0F3, 0x74A9, 0xC0F4, 0x74B0, + 0xC0F5, 0x74A6, 0xC0F6, 0x74A8, 0xC0F7, 0x7646, 0xC0F8, 0x7642, 0xC0F9, 0x764C, 0xC0FA, 0x76EA, 0xC0FB, 0x77B3, 0xC0FC, 0x77AA, + 0xC0FD, 0x77B0, 0xC0FE, 0x77AC, 0xC140, 0x77A7, 0xC141, 0x77AD, 0xC142, 0x77EF, 0xC143, 0x78F7, 0xC144, 0x78FA, 0xC145, 0x78F4, + 0xC146, 0x78EF, 0xC147, 0x7901, 0xC148, 0x79A7, 0xC149, 0x79AA, 0xC14A, 0x7A57, 0xC14B, 0x7ABF, 0xC14C, 0x7C07, 0xC14D, 0x7C0D, + 0xC14E, 0x7BFE, 0xC14F, 0x7BF7, 0xC150, 0x7C0C, 0xC151, 0x7BE0, 0xC152, 0x7CE0, 0xC153, 0x7CDC, 0xC154, 0x7CDE, 0xC155, 0x7CE2, + 0xC156, 0x7CDF, 0xC157, 0x7CD9, 0xC158, 0x7CDD, 0xC159, 0x7E2E, 0xC15A, 0x7E3E, 0xC15B, 0x7E46, 0xC15C, 0x7E37, 0xC15D, 0x7E32, + 0xC15E, 0x7E43, 0xC15F, 0x7E2B, 0xC160, 0x7E3D, 0xC161, 0x7E31, 0xC162, 0x7E45, 0xC163, 0x7E41, 0xC164, 0x7E34, 0xC165, 0x7E39, + 0xC166, 0x7E48, 0xC167, 0x7E35, 0xC168, 0x7E3F, 0xC169, 0x7E2F, 0xC16A, 0x7F44, 0xC16B, 0x7FF3, 0xC16C, 0x7FFC, 0xC16D, 0x8071, + 0xC16E, 0x8072, 0xC16F, 0x8070, 0xC170, 0x806F, 0xC171, 0x8073, 0xC172, 0x81C6, 0xC173, 0x81C3, 0xC174, 0x81BA, 0xC175, 0x81C2, + 0xC176, 0x81C0, 0xC177, 0x81BF, 0xC178, 0x81BD, 0xC179, 0x81C9, 0xC17A, 0x81BE, 0xC17B, 0x81E8, 0xC17C, 0x8209, 0xC17D, 0x8271, + 0xC17E, 0x85AA, 0xC1A1, 0x8584, 0xC1A2, 0x857E, 0xC1A3, 0x859C, 0xC1A4, 0x8591, 0xC1A5, 0x8594, 0xC1A6, 0x85AF, 0xC1A7, 0x859B, + 0xC1A8, 0x8587, 0xC1A9, 0x85A8, 0xC1AA, 0x858A, 0xC1AB, 0x8667, 0xC1AC, 0x87C0, 0xC1AD, 0x87D1, 0xC1AE, 0x87B3, 0xC1AF, 0x87D2, + 0xC1B0, 0x87C6, 0xC1B1, 0x87AB, 0xC1B2, 0x87BB, 0xC1B3, 0x87BA, 0xC1B4, 0x87C8, 0xC1B5, 0x87CB, 0xC1B6, 0x893B, 0xC1B7, 0x8936, + 0xC1B8, 0x8944, 0xC1B9, 0x8938, 0xC1BA, 0x893D, 0xC1BB, 0x89AC, 0xC1BC, 0x8B0E, 0xC1BD, 0x8B17, 0xC1BE, 0x8B19, 0xC1BF, 0x8B1B, + 0xC1C0, 0x8B0A, 0xC1C1, 0x8B20, 0xC1C2, 0x8B1D, 0xC1C3, 0x8B04, 0xC1C4, 0x8B10, 0xC1C5, 0x8C41, 0xC1C6, 0x8C3F, 0xC1C7, 0x8C73, + 0xC1C8, 0x8CFA, 0xC1C9, 0x8CFD, 0xC1CA, 0x8CFC, 0xC1CB, 0x8CF8, 0xC1CC, 0x8CFB, 0xC1CD, 0x8DA8, 0xC1CE, 0x8E49, 0xC1CF, 0x8E4B, + 0xC1D0, 0x8E48, 0xC1D1, 0x8E4A, 0xC1D2, 0x8F44, 0xC1D3, 0x8F3E, 0xC1D4, 0x8F42, 0xC1D5, 0x8F45, 0xC1D6, 0x8F3F, 0xC1D7, 0x907F, + 0xC1D8, 0x907D, 0xC1D9, 0x9084, 0xC1DA, 0x9081, 0xC1DB, 0x9082, 0xC1DC, 0x9080, 0xC1DD, 0x9139, 0xC1DE, 0x91A3, 0xC1DF, 0x919E, + 0xC1E0, 0x919C, 0xC1E1, 0x934D, 0xC1E2, 0x9382, 0xC1E3, 0x9328, 0xC1E4, 0x9375, 0xC1E5, 0x934A, 0xC1E6, 0x9365, 0xC1E7, 0x934B, + 0xC1E8, 0x9318, 0xC1E9, 0x937E, 0xC1EA, 0x936C, 0xC1EB, 0x935B, 0xC1EC, 0x9370, 0xC1ED, 0x935A, 0xC1EE, 0x9354, 0xC1EF, 0x95CA, + 0xC1F0, 0x95CB, 0xC1F1, 0x95CC, 0xC1F2, 0x95C8, 0xC1F3, 0x95C6, 0xC1F4, 0x96B1, 0xC1F5, 0x96B8, 0xC1F6, 0x96D6, 0xC1F7, 0x971C, + 0xC1F8, 0x971E, 0xC1F9, 0x97A0, 0xC1FA, 0x97D3, 0xC1FB, 0x9846, 0xC1FC, 0x98B6, 0xC1FD, 0x9935, 0xC1FE, 0x9A01, 0xC240, 0x99FF, + 0xC241, 0x9BAE, 0xC242, 0x9BAB, 0xC243, 0x9BAA, 0xC244, 0x9BAD, 0xC245, 0x9D3B, 0xC246, 0x9D3F, 0xC247, 0x9E8B, 0xC248, 0x9ECF, + 0xC249, 0x9EDE, 0xC24A, 0x9EDC, 0xC24B, 0x9EDD, 0xC24C, 0x9EDB, 0xC24D, 0x9F3E, 0xC24E, 0x9F4B, 0xC24F, 0x53E2, 0xC250, 0x5695, + 0xC251, 0x56AE, 0xC252, 0x58D9, 0xC253, 0x58D8, 0xC254, 0x5B38, 0xC255, 0x5F5D, 0xC256, 0x61E3, 0xC257, 0x6233, 0xC258, 0x64F4, + 0xC259, 0x64F2, 0xC25A, 0x64FE, 0xC25B, 0x6506, 0xC25C, 0x64FA, 0xC25D, 0x64FB, 0xC25E, 0x64F7, 0xC25F, 0x65B7, 0xC260, 0x66DC, + 0xC261, 0x6726, 0xC262, 0x6AB3, 0xC263, 0x6AAC, 0xC264, 0x6AC3, 0xC265, 0x6ABB, 0xC266, 0x6AB8, 0xC267, 0x6AC2, 0xC268, 0x6AAE, + 0xC269, 0x6AAF, 0xC26A, 0x6B5F, 0xC26B, 0x6B78, 0xC26C, 0x6BAF, 0xC26D, 0x7009, 0xC26E, 0x700B, 0xC26F, 0x6FFE, 0xC270, 0x7006, + 0xC271, 0x6FFA, 0xC272, 0x7011, 0xC273, 0x700F, 0xC274, 0x71FB, 0xC275, 0x71FC, 0xC276, 0x71FE, 0xC277, 0x71F8, 0xC278, 0x7377, + 0xC279, 0x7375, 0xC27A, 0x74A7, 0xC27B, 0x74BF, 0xC27C, 0x7515, 0xC27D, 0x7656, 0xC27E, 0x7658, 0xC2A1, 0x7652, 0xC2A2, 0x77BD, + 0xC2A3, 0x77BF, 0xC2A4, 0x77BB, 0xC2A5, 0x77BC, 0xC2A6, 0x790E, 0xC2A7, 0x79AE, 0xC2A8, 0x7A61, 0xC2A9, 0x7A62, 0xC2AA, 0x7A60, + 0xC2AB, 0x7AC4, 0xC2AC, 0x7AC5, 0xC2AD, 0x7C2B, 0xC2AE, 0x7C27, 0xC2AF, 0x7C2A, 0xC2B0, 0x7C1E, 0xC2B1, 0x7C23, 0xC2B2, 0x7C21, + 0xC2B3, 0x7CE7, 0xC2B4, 0x7E54, 0xC2B5, 0x7E55, 0xC2B6, 0x7E5E, 0xC2B7, 0x7E5A, 0xC2B8, 0x7E61, 0xC2B9, 0x7E52, 0xC2BA, 0x7E59, + 0xC2BB, 0x7F48, 0xC2BC, 0x7FF9, 0xC2BD, 0x7FFB, 0xC2BE, 0x8077, 0xC2BF, 0x8076, 0xC2C0, 0x81CD, 0xC2C1, 0x81CF, 0xC2C2, 0x820A, + 0xC2C3, 0x85CF, 0xC2C4, 0x85A9, 0xC2C5, 0x85CD, 0xC2C6, 0x85D0, 0xC2C7, 0x85C9, 0xC2C8, 0x85B0, 0xC2C9, 0x85BA, 0xC2CA, 0x85B9, + 0xC2CB, 0x85A6, 0xC2CC, 0x87EF, 0xC2CD, 0x87EC, 0xC2CE, 0x87F2, 0xC2CF, 0x87E0, 0xC2D0, 0x8986, 0xC2D1, 0x89B2, 0xC2D2, 0x89F4, + 0xC2D3, 0x8B28, 0xC2D4, 0x8B39, 0xC2D5, 0x8B2C, 0xC2D6, 0x8B2B, 0xC2D7, 0x8C50, 0xC2D8, 0x8D05, 0xC2D9, 0x8E59, 0xC2DA, 0x8E63, + 0xC2DB, 0x8E66, 0xC2DC, 0x8E64, 0xC2DD, 0x8E5F, 0xC2DE, 0x8E55, 0xC2DF, 0x8EC0, 0xC2E0, 0x8F49, 0xC2E1, 0x8F4D, 0xC2E2, 0x9087, + 0xC2E3, 0x9083, 0xC2E4, 0x9088, 0xC2E5, 0x91AB, 0xC2E6, 0x91AC, 0xC2E7, 0x91D0, 0xC2E8, 0x9394, 0xC2E9, 0x938A, 0xC2EA, 0x9396, + 0xC2EB, 0x93A2, 0xC2EC, 0x93B3, 0xC2ED, 0x93AE, 0xC2EE, 0x93AC, 0xC2EF, 0x93B0, 0xC2F0, 0x9398, 0xC2F1, 0x939A, 0xC2F2, 0x9397, + 0xC2F3, 0x95D4, 0xC2F4, 0x95D6, 0xC2F5, 0x95D0, 0xC2F6, 0x95D5, 0xC2F7, 0x96E2, 0xC2F8, 0x96DC, 0xC2F9, 0x96D9, 0xC2FA, 0x96DB, + 0xC2FB, 0x96DE, 0xC2FC, 0x9724, 0xC2FD, 0x97A3, 0xC2FE, 0x97A6, 0xC340, 0x97AD, 0xC341, 0x97F9, 0xC342, 0x984D, 0xC343, 0x984F, + 0xC344, 0x984C, 0xC345, 0x984E, 0xC346, 0x9853, 0xC347, 0x98BA, 0xC348, 0x993E, 0xC349, 0x993F, 0xC34A, 0x993D, 0xC34B, 0x992E, + 0xC34C, 0x99A5, 0xC34D, 0x9A0E, 0xC34E, 0x9AC1, 0xC34F, 0x9B03, 0xC350, 0x9B06, 0xC351, 0x9B4F, 0xC352, 0x9B4E, 0xC353, 0x9B4D, + 0xC354, 0x9BCA, 0xC355, 0x9BC9, 0xC356, 0x9BFD, 0xC357, 0x9BC8, 0xC358, 0x9BC0, 0xC359, 0x9D51, 0xC35A, 0x9D5D, 0xC35B, 0x9D60, + 0xC35C, 0x9EE0, 0xC35D, 0x9F15, 0xC35E, 0x9F2C, 0xC35F, 0x5133, 0xC360, 0x56A5, 0xC361, 0x58DE, 0xC362, 0x58DF, 0xC363, 0x58E2, + 0xC364, 0x5BF5, 0xC365, 0x9F90, 0xC366, 0x5EEC, 0xC367, 0x61F2, 0xC368, 0x61F7, 0xC369, 0x61F6, 0xC36A, 0x61F5, 0xC36B, 0x6500, + 0xC36C, 0x650F, 0xC36D, 0x66E0, 0xC36E, 0x66DD, 0xC36F, 0x6AE5, 0xC370, 0x6ADD, 0xC371, 0x6ADA, 0xC372, 0x6AD3, 0xC373, 0x701B, + 0xC374, 0x701F, 0xC375, 0x7028, 0xC376, 0x701A, 0xC377, 0x701D, 0xC378, 0x7015, 0xC379, 0x7018, 0xC37A, 0x7206, 0xC37B, 0x720D, + 0xC37C, 0x7258, 0xC37D, 0x72A2, 0xC37E, 0x7378, 0xC3A1, 0x737A, 0xC3A2, 0x74BD, 0xC3A3, 0x74CA, 0xC3A4, 0x74E3, 0xC3A5, 0x7587, + 0xC3A6, 0x7586, 0xC3A7, 0x765F, 0xC3A8, 0x7661, 0xC3A9, 0x77C7, 0xC3AA, 0x7919, 0xC3AB, 0x79B1, 0xC3AC, 0x7A6B, 0xC3AD, 0x7A69, + 0xC3AE, 0x7C3E, 0xC3AF, 0x7C3F, 0xC3B0, 0x7C38, 0xC3B1, 0x7C3D, 0xC3B2, 0x7C37, 0xC3B3, 0x7C40, 0xC3B4, 0x7E6B, 0xC3B5, 0x7E6D, + 0xC3B6, 0x7E79, 0xC3B7, 0x7E69, 0xC3B8, 0x7E6A, 0xC3B9, 0x7F85, 0xC3BA, 0x7E73, 0xC3BB, 0x7FB6, 0xC3BC, 0x7FB9, 0xC3BD, 0x7FB8, + 0xC3BE, 0x81D8, 0xC3BF, 0x85E9, 0xC3C0, 0x85DD, 0xC3C1, 0x85EA, 0xC3C2, 0x85D5, 0xC3C3, 0x85E4, 0xC3C4, 0x85E5, 0xC3C5, 0x85F7, + 0xC3C6, 0x87FB, 0xC3C7, 0x8805, 0xC3C8, 0x880D, 0xC3C9, 0x87F9, 0xC3CA, 0x87FE, 0xC3CB, 0x8960, 0xC3CC, 0x895F, 0xC3CD, 0x8956, + 0xC3CE, 0x895E, 0xC3CF, 0x8B41, 0xC3D0, 0x8B5C, 0xC3D1, 0x8B58, 0xC3D2, 0x8B49, 0xC3D3, 0x8B5A, 0xC3D4, 0x8B4E, 0xC3D5, 0x8B4F, + 0xC3D6, 0x8B46, 0xC3D7, 0x8B59, 0xC3D8, 0x8D08, 0xC3D9, 0x8D0A, 0xC3DA, 0x8E7C, 0xC3DB, 0x8E72, 0xC3DC, 0x8E87, 0xC3DD, 0x8E76, + 0xC3DE, 0x8E6C, 0xC3DF, 0x8E7A, 0xC3E0, 0x8E74, 0xC3E1, 0x8F54, 0xC3E2, 0x8F4E, 0xC3E3, 0x8FAD, 0xC3E4, 0x908A, 0xC3E5, 0x908B, + 0xC3E6, 0x91B1, 0xC3E7, 0x91AE, 0xC3E8, 0x93E1, 0xC3E9, 0x93D1, 0xC3EA, 0x93DF, 0xC3EB, 0x93C3, 0xC3EC, 0x93C8, 0xC3ED, 0x93DC, + 0xC3EE, 0x93DD, 0xC3EF, 0x93D6, 0xC3F0, 0x93E2, 0xC3F1, 0x93CD, 0xC3F2, 0x93D8, 0xC3F3, 0x93E4, 0xC3F4, 0x93D7, 0xC3F5, 0x93E8, + 0xC3F6, 0x95DC, 0xC3F7, 0x96B4, 0xC3F8, 0x96E3, 0xC3F9, 0x972A, 0xC3FA, 0x9727, 0xC3FB, 0x9761, 0xC3FC, 0x97DC, 0xC3FD, 0x97FB, + 0xC3FE, 0x985E, 0xC440, 0x9858, 0xC441, 0x985B, 0xC442, 0x98BC, 0xC443, 0x9945, 0xC444, 0x9949, 0xC445, 0x9A16, 0xC446, 0x9A19, + 0xC447, 0x9B0D, 0xC448, 0x9BE8, 0xC449, 0x9BE7, 0xC44A, 0x9BD6, 0xC44B, 0x9BDB, 0xC44C, 0x9D89, 0xC44D, 0x9D61, 0xC44E, 0x9D72, + 0xC44F, 0x9D6A, 0xC450, 0x9D6C, 0xC451, 0x9E92, 0xC452, 0x9E97, 0xC453, 0x9E93, 0xC454, 0x9EB4, 0xC455, 0x52F8, 0xC456, 0x56A8, + 0xC457, 0x56B7, 0xC458, 0x56B6, 0xC459, 0x56B4, 0xC45A, 0x56BC, 0xC45B, 0x58E4, 0xC45C, 0x5B40, 0xC45D, 0x5B43, 0xC45E, 0x5B7D, + 0xC45F, 0x5BF6, 0xC460, 0x5DC9, 0xC461, 0x61F8, 0xC462, 0x61FA, 0xC463, 0x6518, 0xC464, 0x6514, 0xC465, 0x6519, 0xC466, 0x66E6, + 0xC467, 0x6727, 0xC468, 0x6AEC, 0xC469, 0x703E, 0xC46A, 0x7030, 0xC46B, 0x7032, 0xC46C, 0x7210, 0xC46D, 0x737B, 0xC46E, 0x74CF, + 0xC46F, 0x7662, 0xC470, 0x7665, 0xC471, 0x7926, 0xC472, 0x792A, 0xC473, 0x792C, 0xC474, 0x792B, 0xC475, 0x7AC7, 0xC476, 0x7AF6, + 0xC477, 0x7C4C, 0xC478, 0x7C43, 0xC479, 0x7C4D, 0xC47A, 0x7CEF, 0xC47B, 0x7CF0, 0xC47C, 0x8FAE, 0xC47D, 0x7E7D, 0xC47E, 0x7E7C, + 0xC4A1, 0x7E82, 0xC4A2, 0x7F4C, 0xC4A3, 0x8000, 0xC4A4, 0x81DA, 0xC4A5, 0x8266, 0xC4A6, 0x85FB, 0xC4A7, 0x85F9, 0xC4A8, 0x8611, + 0xC4A9, 0x85FA, 0xC4AA, 0x8606, 0xC4AB, 0x860B, 0xC4AC, 0x8607, 0xC4AD, 0x860A, 0xC4AE, 0x8814, 0xC4AF, 0x8815, 0xC4B0, 0x8964, + 0xC4B1, 0x89BA, 0xC4B2, 0x89F8, 0xC4B3, 0x8B70, 0xC4B4, 0x8B6C, 0xC4B5, 0x8B66, 0xC4B6, 0x8B6F, 0xC4B7, 0x8B5F, 0xC4B8, 0x8B6B, + 0xC4B9, 0x8D0F, 0xC4BA, 0x8D0D, 0xC4BB, 0x8E89, 0xC4BC, 0x8E81, 0xC4BD, 0x8E85, 0xC4BE, 0x8E82, 0xC4BF, 0x91B4, 0xC4C0, 0x91CB, + 0xC4C1, 0x9418, 0xC4C2, 0x9403, 0xC4C3, 0x93FD, 0xC4C4, 0x95E1, 0xC4C5, 0x9730, 0xC4C6, 0x98C4, 0xC4C7, 0x9952, 0xC4C8, 0x9951, + 0xC4C9, 0x99A8, 0xC4CA, 0x9A2B, 0xC4CB, 0x9A30, 0xC4CC, 0x9A37, 0xC4CD, 0x9A35, 0xC4CE, 0x9C13, 0xC4CF, 0x9C0D, 0xC4D0, 0x9E79, + 0xC4D1, 0x9EB5, 0xC4D2, 0x9EE8, 0xC4D3, 0x9F2F, 0xC4D4, 0x9F5F, 0xC4D5, 0x9F63, 0xC4D6, 0x9F61, 0xC4D7, 0x5137, 0xC4D8, 0x5138, + 0xC4D9, 0x56C1, 0xC4DA, 0x56C0, 0xC4DB, 0x56C2, 0xC4DC, 0x5914, 0xC4DD, 0x5C6C, 0xC4DE, 0x5DCD, 0xC4DF, 0x61FC, 0xC4E0, 0x61FE, + 0xC4E1, 0x651D, 0xC4E2, 0x651C, 0xC4E3, 0x6595, 0xC4E4, 0x66E9, 0xC4E5, 0x6AFB, 0xC4E6, 0x6B04, 0xC4E7, 0x6AFA, 0xC4E8, 0x6BB2, + 0xC4E9, 0x704C, 0xC4EA, 0x721B, 0xC4EB, 0x72A7, 0xC4EC, 0x74D6, 0xC4ED, 0x74D4, 0xC4EE, 0x7669, 0xC4EF, 0x77D3, 0xC4F0, 0x7C50, + 0xC4F1, 0x7E8F, 0xC4F2, 0x7E8C, 0xC4F3, 0x7FBC, 0xC4F4, 0x8617, 0xC4F5, 0x862D, 0xC4F6, 0x861A, 0xC4F7, 0x8823, 0xC4F8, 0x8822, + 0xC4F9, 0x8821, 0xC4FA, 0x881F, 0xC4FB, 0x896A, 0xC4FC, 0x896C, 0xC4FD, 0x89BD, 0xC4FE, 0x8B74, 0xC540, 0x8B77, 0xC541, 0x8B7D, + 0xC542, 0x8D13, 0xC543, 0x8E8A, 0xC544, 0x8E8D, 0xC545, 0x8E8B, 0xC546, 0x8F5F, 0xC547, 0x8FAF, 0xC548, 0x91BA, 0xC549, 0x942E, + 0xC54A, 0x9433, 0xC54B, 0x9435, 0xC54C, 0x943A, 0xC54D, 0x9438, 0xC54E, 0x9432, 0xC54F, 0x942B, 0xC550, 0x95E2, 0xC551, 0x9738, + 0xC552, 0x9739, 0xC553, 0x9732, 0xC554, 0x97FF, 0xC555, 0x9867, 0xC556, 0x9865, 0xC557, 0x9957, 0xC558, 0x9A45, 0xC559, 0x9A43, + 0xC55A, 0x9A40, 0xC55B, 0x9A3E, 0xC55C, 0x9ACF, 0xC55D, 0x9B54, 0xC55E, 0x9B51, 0xC55F, 0x9C2D, 0xC560, 0x9C25, 0xC561, 0x9DAF, + 0xC562, 0x9DB4, 0xC563, 0x9DC2, 0xC564, 0x9DB8, 0xC565, 0x9E9D, 0xC566, 0x9EEF, 0xC567, 0x9F19, 0xC568, 0x9F5C, 0xC569, 0x9F66, + 0xC56A, 0x9F67, 0xC56B, 0x513C, 0xC56C, 0x513B, 0xC56D, 0x56C8, 0xC56E, 0x56CA, 0xC56F, 0x56C9, 0xC570, 0x5B7F, 0xC571, 0x5DD4, + 0xC572, 0x5DD2, 0xC573, 0x5F4E, 0xC574, 0x61FF, 0xC575, 0x6524, 0xC576, 0x6B0A, 0xC577, 0x6B61, 0xC578, 0x7051, 0xC579, 0x7058, + 0xC57A, 0x7380, 0xC57B, 0x74E4, 0xC57C, 0x758A, 0xC57D, 0x766E, 0xC57E, 0x766C, 0xC5A1, 0x79B3, 0xC5A2, 0x7C60, 0xC5A3, 0x7C5F, + 0xC5A4, 0x807E, 0xC5A5, 0x807D, 0xC5A6, 0x81DF, 0xC5A7, 0x8972, 0xC5A8, 0x896F, 0xC5A9, 0x89FC, 0xC5AA, 0x8B80, 0xC5AB, 0x8D16, + 0xC5AC, 0x8D17, 0xC5AD, 0x8E91, 0xC5AE, 0x8E93, 0xC5AF, 0x8F61, 0xC5B0, 0x9148, 0xC5B1, 0x9444, 0xC5B2, 0x9451, 0xC5B3, 0x9452, + 0xC5B4, 0x973D, 0xC5B5, 0x973E, 0xC5B6, 0x97C3, 0xC5B7, 0x97C1, 0xC5B8, 0x986B, 0xC5B9, 0x9955, 0xC5BA, 0x9A55, 0xC5BB, 0x9A4D, + 0xC5BC, 0x9AD2, 0xC5BD, 0x9B1A, 0xC5BE, 0x9C49, 0xC5BF, 0x9C31, 0xC5C0, 0x9C3E, 0xC5C1, 0x9C3B, 0xC5C2, 0x9DD3, 0xC5C3, 0x9DD7, + 0xC5C4, 0x9F34, 0xC5C5, 0x9F6C, 0xC5C6, 0x9F6A, 0xC5C7, 0x9F94, 0xC5C8, 0x56CC, 0xC5C9, 0x5DD6, 0xC5CA, 0x6200, 0xC5CB, 0x6523, + 0xC5CC, 0x652B, 0xC5CD, 0x652A, 0xC5CE, 0x66EC, 0xC5CF, 0x6B10, 0xC5D0, 0x74DA, 0xC5D1, 0x7ACA, 0xC5D2, 0x7C64, 0xC5D3, 0x7C63, + 0xC5D4, 0x7C65, 0xC5D5, 0x7E93, 0xC5D6, 0x7E96, 0xC5D7, 0x7E94, 0xC5D8, 0x81E2, 0xC5D9, 0x8638, 0xC5DA, 0x863F, 0xC5DB, 0x8831, + 0xC5DC, 0x8B8A, 0xC5DD, 0x9090, 0xC5DE, 0x908F, 0xC5DF, 0x9463, 0xC5E0, 0x9460, 0xC5E1, 0x9464, 0xC5E2, 0x9768, 0xC5E3, 0x986F, + 0xC5E4, 0x995C, 0xC5E5, 0x9A5A, 0xC5E6, 0x9A5B, 0xC5E7, 0x9A57, 0xC5E8, 0x9AD3, 0xC5E9, 0x9AD4, 0xC5EA, 0x9AD1, 0xC5EB, 0x9C54, + 0xC5EC, 0x9C57, 0xC5ED, 0x9C56, 0xC5EE, 0x9DE5, 0xC5EF, 0x9E9F, 0xC5F0, 0x9EF4, 0xC5F1, 0x56D1, 0xC5F2, 0x58E9, 0xC5F3, 0x652C, + 0xC5F4, 0x705E, 0xC5F5, 0x7671, 0xC5F6, 0x7672, 0xC5F7, 0x77D7, 0xC5F8, 0x7F50, 0xC5F9, 0x7F88, 0xC5FA, 0x8836, 0xC5FB, 0x8839, + 0xC5FC, 0x8862, 0xC5FD, 0x8B93, 0xC5FE, 0x8B92, 0xC640, 0x8B96, 0xC641, 0x8277, 0xC642, 0x8D1B, 0xC643, 0x91C0, 0xC644, 0x946A, + 0xC645, 0x9742, 0xC646, 0x9748, 0xC647, 0x9744, 0xC648, 0x97C6, 0xC649, 0x9870, 0xC64A, 0x9A5F, 0xC64B, 0x9B22, 0xC64C, 0x9B58, + 0xC64D, 0x9C5F, 0xC64E, 0x9DF9, 0xC64F, 0x9DFA, 0xC650, 0x9E7C, 0xC651, 0x9E7D, 0xC652, 0x9F07, 0xC653, 0x9F77, 0xC654, 0x9F72, + 0xC655, 0x5EF3, 0xC656, 0x6B16, 0xC657, 0x7063, 0xC658, 0x7C6C, 0xC659, 0x7C6E, 0xC65A, 0x883B, 0xC65B, 0x89C0, 0xC65C, 0x8EA1, + 0xC65D, 0x91C1, 0xC65E, 0x9472, 0xC65F, 0x9470, 0xC660, 0x9871, 0xC661, 0x995E, 0xC662, 0x9AD6, 0xC663, 0x9B23, 0xC664, 0x9ECC, + 0xC665, 0x7064, 0xC666, 0x77DA, 0xC667, 0x8B9A, 0xC668, 0x9477, 0xC669, 0x97C9, 0xC66A, 0x9A62, 0xC66B, 0x9A65, 0xC66C, 0x7E9C, + 0xC66D, 0x8B9C, 0xC66E, 0x8EAA, 0xC66F, 0x91C5, 0xC670, 0x947D, 0xC671, 0x947E, 0xC672, 0x947C, 0xC673, 0x9C77, 0xC674, 0x9C78, + 0xC675, 0x9EF7, 0xC676, 0x8C54, 0xC677, 0x947F, 0xC678, 0x9E1A, 0xC679, 0x7228, 0xC67A, 0x9A6A, 0xC67B, 0x9B31, 0xC67C, 0x9E1B, + 0xC67D, 0x9E1E, 0xC67E, 0x7C72, 0xC940, 0x4E42, 0xC941, 0x4E5C, 0xC942, 0x51F5, 0xC943, 0x531A, 0xC944, 0x5382, 0xC945, 0x4E07, + 0xC946, 0x4E0C, 0xC947, 0x4E47, 0xC948, 0x4E8D, 0xC949, 0x56D7, 0xC94A, 0xFA0C, 0xC94B, 0x5C6E, 0xC94C, 0x5F73, 0xC94D, 0x4E0F, + 0xC94E, 0x5187, 0xC94F, 0x4E0E, 0xC950, 0x4E2E, 0xC951, 0x4E93, 0xC952, 0x4EC2, 0xC953, 0x4EC9, 0xC954, 0x4EC8, 0xC955, 0x5198, + 0xC956, 0x52FC, 0xC957, 0x536C, 0xC958, 0x53B9, 0xC959, 0x5720, 0xC95A, 0x5903, 0xC95B, 0x592C, 0xC95C, 0x5C10, 0xC95D, 0x5DFF, + 0xC95E, 0x65E1, 0xC95F, 0x6BB3, 0xC960, 0x6BCC, 0xC961, 0x6C14, 0xC962, 0x723F, 0xC963, 0x4E31, 0xC964, 0x4E3C, 0xC965, 0x4EE8, + 0xC966, 0x4EDC, 0xC967, 0x4EE9, 0xC968, 0x4EE1, 0xC969, 0x4EDD, 0xC96A, 0x4EDA, 0xC96B, 0x520C, 0xC96C, 0x531C, 0xC96D, 0x534C, + 0xC96E, 0x5722, 0xC96F, 0x5723, 0xC970, 0x5917, 0xC971, 0x592F, 0xC972, 0x5B81, 0xC973, 0x5B84, 0xC974, 0x5C12, 0xC975, 0x5C3B, + 0xC976, 0x5C74, 0xC977, 0x5C73, 0xC978, 0x5E04, 0xC979, 0x5E80, 0xC97A, 0x5E82, 0xC97B, 0x5FC9, 0xC97C, 0x6209, 0xC97D, 0x6250, + 0xC97E, 0x6C15, 0xC9A1, 0x6C36, 0xC9A2, 0x6C43, 0xC9A3, 0x6C3F, 0xC9A4, 0x6C3B, 0xC9A5, 0x72AE, 0xC9A6, 0x72B0, 0xC9A7, 0x738A, + 0xC9A8, 0x79B8, 0xC9A9, 0x808A, 0xC9AA, 0x961E, 0xC9AB, 0x4F0E, 0xC9AC, 0x4F18, 0xC9AD, 0x4F2C, 0xC9AE, 0x4EF5, 0xC9AF, 0x4F14, + 0xC9B0, 0x4EF1, 0xC9B1, 0x4F00, 0xC9B2, 0x4EF7, 0xC9B3, 0x4F08, 0xC9B4, 0x4F1D, 0xC9B5, 0x4F02, 0xC9B6, 0x4F05, 0xC9B7, 0x4F22, + 0xC9B8, 0x4F13, 0xC9B9, 0x4F04, 0xC9BA, 0x4EF4, 0xC9BB, 0x4F12, 0xC9BC, 0x51B1, 0xC9BD, 0x5213, 0xC9BE, 0x5209, 0xC9BF, 0x5210, + 0xC9C0, 0x52A6, 0xC9C1, 0x5322, 0xC9C2, 0x531F, 0xC9C3, 0x534D, 0xC9C4, 0x538A, 0xC9C5, 0x5407, 0xC9C6, 0x56E1, 0xC9C7, 0x56DF, + 0xC9C8, 0x572E, 0xC9C9, 0x572A, 0xC9CA, 0x5734, 0xC9CB, 0x593C, 0xC9CC, 0x5980, 0xC9CD, 0x597C, 0xC9CE, 0x5985, 0xC9CF, 0x597B, + 0xC9D0, 0x597E, 0xC9D1, 0x5977, 0xC9D2, 0x597F, 0xC9D3, 0x5B56, 0xC9D4, 0x5C15, 0xC9D5, 0x5C25, 0xC9D6, 0x5C7C, 0xC9D7, 0x5C7A, + 0xC9D8, 0x5C7B, 0xC9D9, 0x5C7E, 0xC9DA, 0x5DDF, 0xC9DB, 0x5E75, 0xC9DC, 0x5E84, 0xC9DD, 0x5F02, 0xC9DE, 0x5F1A, 0xC9DF, 0x5F74, + 0xC9E0, 0x5FD5, 0xC9E1, 0x5FD4, 0xC9E2, 0x5FCF, 0xC9E3, 0x625C, 0xC9E4, 0x625E, 0xC9E5, 0x6264, 0xC9E6, 0x6261, 0xC9E7, 0x6266, + 0xC9E8, 0x6262, 0xC9E9, 0x6259, 0xC9EA, 0x6260, 0xC9EB, 0x625A, 0xC9EC, 0x6265, 0xC9ED, 0x65EF, 0xC9EE, 0x65EE, 0xC9EF, 0x673E, + 0xC9F0, 0x6739, 0xC9F1, 0x6738, 0xC9F2, 0x673B, 0xC9F3, 0x673A, 0xC9F4, 0x673F, 0xC9F5, 0x673C, 0xC9F6, 0x6733, 0xC9F7, 0x6C18, + 0xC9F8, 0x6C46, 0xC9F9, 0x6C52, 0xC9FA, 0x6C5C, 0xC9FB, 0x6C4F, 0xC9FC, 0x6C4A, 0xC9FD, 0x6C54, 0xC9FE, 0x6C4B, 0xCA40, 0x6C4C, + 0xCA41, 0x7071, 0xCA42, 0x725E, 0xCA43, 0x72B4, 0xCA44, 0x72B5, 0xCA45, 0x738E, 0xCA46, 0x752A, 0xCA47, 0x767F, 0xCA48, 0x7A75, + 0xCA49, 0x7F51, 0xCA4A, 0x8278, 0xCA4B, 0x827C, 0xCA4C, 0x8280, 0xCA4D, 0x827D, 0xCA4E, 0x827F, 0xCA4F, 0x864D, 0xCA50, 0x897E, + 0xCA51, 0x9099, 0xCA52, 0x9097, 0xCA53, 0x9098, 0xCA54, 0x909B, 0xCA55, 0x9094, 0xCA56, 0x9622, 0xCA57, 0x9624, 0xCA58, 0x9620, + 0xCA59, 0x9623, 0xCA5A, 0x4F56, 0xCA5B, 0x4F3B, 0xCA5C, 0x4F62, 0xCA5D, 0x4F49, 0xCA5E, 0x4F53, 0xCA5F, 0x4F64, 0xCA60, 0x4F3E, + 0xCA61, 0x4F67, 0xCA62, 0x4F52, 0xCA63, 0x4F5F, 0xCA64, 0x4F41, 0xCA65, 0x4F58, 0xCA66, 0x4F2D, 0xCA67, 0x4F33, 0xCA68, 0x4F3F, + 0xCA69, 0x4F61, 0xCA6A, 0x518F, 0xCA6B, 0x51B9, 0xCA6C, 0x521C, 0xCA6D, 0x521E, 0xCA6E, 0x5221, 0xCA6F, 0x52AD, 0xCA70, 0x52AE, + 0xCA71, 0x5309, 0xCA72, 0x5363, 0xCA73, 0x5372, 0xCA74, 0x538E, 0xCA75, 0x538F, 0xCA76, 0x5430, 0xCA77, 0x5437, 0xCA78, 0x542A, + 0xCA79, 0x5454, 0xCA7A, 0x5445, 0xCA7B, 0x5419, 0xCA7C, 0x541C, 0xCA7D, 0x5425, 0xCA7E, 0x5418, 0xCAA1, 0x543D, 0xCAA2, 0x544F, + 0xCAA3, 0x5441, 0xCAA4, 0x5428, 0xCAA5, 0x5424, 0xCAA6, 0x5447, 0xCAA7, 0x56EE, 0xCAA8, 0x56E7, 0xCAA9, 0x56E5, 0xCAAA, 0x5741, + 0xCAAB, 0x5745, 0xCAAC, 0x574C, 0xCAAD, 0x5749, 0xCAAE, 0x574B, 0xCAAF, 0x5752, 0xCAB0, 0x5906, 0xCAB1, 0x5940, 0xCAB2, 0x59A6, + 0xCAB3, 0x5998, 0xCAB4, 0x59A0, 0xCAB5, 0x5997, 0xCAB6, 0x598E, 0xCAB7, 0x59A2, 0xCAB8, 0x5990, 0xCAB9, 0x598F, 0xCABA, 0x59A7, + 0xCABB, 0x59A1, 0xCABC, 0x5B8E, 0xCABD, 0x5B92, 0xCABE, 0x5C28, 0xCABF, 0x5C2A, 0xCAC0, 0x5C8D, 0xCAC1, 0x5C8F, 0xCAC2, 0x5C88, + 0xCAC3, 0x5C8B, 0xCAC4, 0x5C89, 0xCAC5, 0x5C92, 0xCAC6, 0x5C8A, 0xCAC7, 0x5C86, 0xCAC8, 0x5C93, 0xCAC9, 0x5C95, 0xCACA, 0x5DE0, + 0xCACB, 0x5E0A, 0xCACC, 0x5E0E, 0xCACD, 0x5E8B, 0xCACE, 0x5E89, 0xCACF, 0x5E8C, 0xCAD0, 0x5E88, 0xCAD1, 0x5E8D, 0xCAD2, 0x5F05, + 0xCAD3, 0x5F1D, 0xCAD4, 0x5F78, 0xCAD5, 0x5F76, 0xCAD6, 0x5FD2, 0xCAD7, 0x5FD1, 0xCAD8, 0x5FD0, 0xCAD9, 0x5FED, 0xCADA, 0x5FE8, + 0xCADB, 0x5FEE, 0xCADC, 0x5FF3, 0xCADD, 0x5FE1, 0xCADE, 0x5FE4, 0xCADF, 0x5FE3, 0xCAE0, 0x5FFA, 0xCAE1, 0x5FEF, 0xCAE2, 0x5FF7, + 0xCAE3, 0x5FFB, 0xCAE4, 0x6000, 0xCAE5, 0x5FF4, 0xCAE6, 0x623A, 0xCAE7, 0x6283, 0xCAE8, 0x628C, 0xCAE9, 0x628E, 0xCAEA, 0x628F, + 0xCAEB, 0x6294, 0xCAEC, 0x6287, 0xCAED, 0x6271, 0xCAEE, 0x627B, 0xCAEF, 0x627A, 0xCAF0, 0x6270, 0xCAF1, 0x6281, 0xCAF2, 0x6288, + 0xCAF3, 0x6277, 0xCAF4, 0x627D, 0xCAF5, 0x6272, 0xCAF6, 0x6274, 0xCAF7, 0x6537, 0xCAF8, 0x65F0, 0xCAF9, 0x65F4, 0xCAFA, 0x65F3, + 0xCAFB, 0x65F2, 0xCAFC, 0x65F5, 0xCAFD, 0x6745, 0xCAFE, 0x6747, 0xCB40, 0x6759, 0xCB41, 0x6755, 0xCB42, 0x674C, 0xCB43, 0x6748, + 0xCB44, 0x675D, 0xCB45, 0x674D, 0xCB46, 0x675A, 0xCB47, 0x674B, 0xCB48, 0x6BD0, 0xCB49, 0x6C19, 0xCB4A, 0x6C1A, 0xCB4B, 0x6C78, + 0xCB4C, 0x6C67, 0xCB4D, 0x6C6B, 0xCB4E, 0x6C84, 0xCB4F, 0x6C8B, 0xCB50, 0x6C8F, 0xCB51, 0x6C71, 0xCB52, 0x6C6F, 0xCB53, 0x6C69, + 0xCB54, 0x6C9A, 0xCB55, 0x6C6D, 0xCB56, 0x6C87, 0xCB57, 0x6C95, 0xCB58, 0x6C9C, 0xCB59, 0x6C66, 0xCB5A, 0x6C73, 0xCB5B, 0x6C65, + 0xCB5C, 0x6C7B, 0xCB5D, 0x6C8E, 0xCB5E, 0x7074, 0xCB5F, 0x707A, 0xCB60, 0x7263, 0xCB61, 0x72BF, 0xCB62, 0x72BD, 0xCB63, 0x72C3, + 0xCB64, 0x72C6, 0xCB65, 0x72C1, 0xCB66, 0x72BA, 0xCB67, 0x72C5, 0xCB68, 0x7395, 0xCB69, 0x7397, 0xCB6A, 0x7393, 0xCB6B, 0x7394, + 0xCB6C, 0x7392, 0xCB6D, 0x753A, 0xCB6E, 0x7539, 0xCB6F, 0x7594, 0xCB70, 0x7595, 0xCB71, 0x7681, 0xCB72, 0x793D, 0xCB73, 0x8034, + 0xCB74, 0x8095, 0xCB75, 0x8099, 0xCB76, 0x8090, 0xCB77, 0x8092, 0xCB78, 0x809C, 0xCB79, 0x8290, 0xCB7A, 0x828F, 0xCB7B, 0x8285, + 0xCB7C, 0x828E, 0xCB7D, 0x8291, 0xCB7E, 0x8293, 0xCBA1, 0x828A, 0xCBA2, 0x8283, 0xCBA3, 0x8284, 0xCBA4, 0x8C78, 0xCBA5, 0x8FC9, + 0xCBA6, 0x8FBF, 0xCBA7, 0x909F, 0xCBA8, 0x90A1, 0xCBA9, 0x90A5, 0xCBAA, 0x909E, 0xCBAB, 0x90A7, 0xCBAC, 0x90A0, 0xCBAD, 0x9630, + 0xCBAE, 0x9628, 0xCBAF, 0x962F, 0xCBB0, 0x962D, 0xCBB1, 0x4E33, 0xCBB2, 0x4F98, 0xCBB3, 0x4F7C, 0xCBB4, 0x4F85, 0xCBB5, 0x4F7D, + 0xCBB6, 0x4F80, 0xCBB7, 0x4F87, 0xCBB8, 0x4F76, 0xCBB9, 0x4F74, 0xCBBA, 0x4F89, 0xCBBB, 0x4F84, 0xCBBC, 0x4F77, 0xCBBD, 0x4F4C, + 0xCBBE, 0x4F97, 0xCBBF, 0x4F6A, 0xCBC0, 0x4F9A, 0xCBC1, 0x4F79, 0xCBC2, 0x4F81, 0xCBC3, 0x4F78, 0xCBC4, 0x4F90, 0xCBC5, 0x4F9C, + 0xCBC6, 0x4F94, 0xCBC7, 0x4F9E, 0xCBC8, 0x4F92, 0xCBC9, 0x4F82, 0xCBCA, 0x4F95, 0xCBCB, 0x4F6B, 0xCBCC, 0x4F6E, 0xCBCD, 0x519E, + 0xCBCE, 0x51BC, 0xCBCF, 0x51BE, 0xCBD0, 0x5235, 0xCBD1, 0x5232, 0xCBD2, 0x5233, 0xCBD3, 0x5246, 0xCBD4, 0x5231, 0xCBD5, 0x52BC, + 0xCBD6, 0x530A, 0xCBD7, 0x530B, 0xCBD8, 0x533C, 0xCBD9, 0x5392, 0xCBDA, 0x5394, 0xCBDB, 0x5487, 0xCBDC, 0x547F, 0xCBDD, 0x5481, + 0xCBDE, 0x5491, 0xCBDF, 0x5482, 0xCBE0, 0x5488, 0xCBE1, 0x546B, 0xCBE2, 0x547A, 0xCBE3, 0x547E, 0xCBE4, 0x5465, 0xCBE5, 0x546C, + 0xCBE6, 0x5474, 0xCBE7, 0x5466, 0xCBE8, 0x548D, 0xCBE9, 0x546F, 0xCBEA, 0x5461, 0xCBEB, 0x5460, 0xCBEC, 0x5498, 0xCBED, 0x5463, + 0xCBEE, 0x5467, 0xCBEF, 0x5464, 0xCBF0, 0x56F7, 0xCBF1, 0x56F9, 0xCBF2, 0x576F, 0xCBF3, 0x5772, 0xCBF4, 0x576D, 0xCBF5, 0x576B, + 0xCBF6, 0x5771, 0xCBF7, 0x5770, 0xCBF8, 0x5776, 0xCBF9, 0x5780, 0xCBFA, 0x5775, 0xCBFB, 0x577B, 0xCBFC, 0x5773, 0xCBFD, 0x5774, + 0xCBFE, 0x5762, 0xCC40, 0x5768, 0xCC41, 0x577D, 0xCC42, 0x590C, 0xCC43, 0x5945, 0xCC44, 0x59B5, 0xCC45, 0x59BA, 0xCC46, 0x59CF, + 0xCC47, 0x59CE, 0xCC48, 0x59B2, 0xCC49, 0x59CC, 0xCC4A, 0x59C1, 0xCC4B, 0x59B6, 0xCC4C, 0x59BC, 0xCC4D, 0x59C3, 0xCC4E, 0x59D6, + 0xCC4F, 0x59B1, 0xCC50, 0x59BD, 0xCC51, 0x59C0, 0xCC52, 0x59C8, 0xCC53, 0x59B4, 0xCC54, 0x59C7, 0xCC55, 0x5B62, 0xCC56, 0x5B65, + 0xCC57, 0x5B93, 0xCC58, 0x5B95, 0xCC59, 0x5C44, 0xCC5A, 0x5C47, 0xCC5B, 0x5CAE, 0xCC5C, 0x5CA4, 0xCC5D, 0x5CA0, 0xCC5E, 0x5CB5, + 0xCC5F, 0x5CAF, 0xCC60, 0x5CA8, 0xCC61, 0x5CAC, 0xCC62, 0x5C9F, 0xCC63, 0x5CA3, 0xCC64, 0x5CAD, 0xCC65, 0x5CA2, 0xCC66, 0x5CAA, + 0xCC67, 0x5CA7, 0xCC68, 0x5C9D, 0xCC69, 0x5CA5, 0xCC6A, 0x5CB6, 0xCC6B, 0x5CB0, 0xCC6C, 0x5CA6, 0xCC6D, 0x5E17, 0xCC6E, 0x5E14, + 0xCC6F, 0x5E19, 0xCC70, 0x5F28, 0xCC71, 0x5F22, 0xCC72, 0x5F23, 0xCC73, 0x5F24, 0xCC74, 0x5F54, 0xCC75, 0x5F82, 0xCC76, 0x5F7E, + 0xCC77, 0x5F7D, 0xCC78, 0x5FDE, 0xCC79, 0x5FE5, 0xCC7A, 0x602D, 0xCC7B, 0x6026, 0xCC7C, 0x6019, 0xCC7D, 0x6032, 0xCC7E, 0x600B, + 0xCCA1, 0x6034, 0xCCA2, 0x600A, 0xCCA3, 0x6017, 0xCCA4, 0x6033, 0xCCA5, 0x601A, 0xCCA6, 0x601E, 0xCCA7, 0x602C, 0xCCA8, 0x6022, + 0xCCA9, 0x600D, 0xCCAA, 0x6010, 0xCCAB, 0x602E, 0xCCAC, 0x6013, 0xCCAD, 0x6011, 0xCCAE, 0x600C, 0xCCAF, 0x6009, 0xCCB0, 0x601C, + 0xCCB1, 0x6214, 0xCCB2, 0x623D, 0xCCB3, 0x62AD, 0xCCB4, 0x62B4, 0xCCB5, 0x62D1, 0xCCB6, 0x62BE, 0xCCB7, 0x62AA, 0xCCB8, 0x62B6, + 0xCCB9, 0x62CA, 0xCCBA, 0x62AE, 0xCCBB, 0x62B3, 0xCCBC, 0x62AF, 0xCCBD, 0x62BB, 0xCCBE, 0x62A9, 0xCCBF, 0x62B0, 0xCCC0, 0x62B8, + 0xCCC1, 0x653D, 0xCCC2, 0x65A8, 0xCCC3, 0x65BB, 0xCCC4, 0x6609, 0xCCC5, 0x65FC, 0xCCC6, 0x6604, 0xCCC7, 0x6612, 0xCCC8, 0x6608, + 0xCCC9, 0x65FB, 0xCCCA, 0x6603, 0xCCCB, 0x660B, 0xCCCC, 0x660D, 0xCCCD, 0x6605, 0xCCCE, 0x65FD, 0xCCCF, 0x6611, 0xCCD0, 0x6610, + 0xCCD1, 0x66F6, 0xCCD2, 0x670A, 0xCCD3, 0x6785, 0xCCD4, 0x676C, 0xCCD5, 0x678E, 0xCCD6, 0x6792, 0xCCD7, 0x6776, 0xCCD8, 0x677B, + 0xCCD9, 0x6798, 0xCCDA, 0x6786, 0xCCDB, 0x6784, 0xCCDC, 0x6774, 0xCCDD, 0x678D, 0xCCDE, 0x678C, 0xCCDF, 0x677A, 0xCCE0, 0x679F, + 0xCCE1, 0x6791, 0xCCE2, 0x6799, 0xCCE3, 0x6783, 0xCCE4, 0x677D, 0xCCE5, 0x6781, 0xCCE6, 0x6778, 0xCCE7, 0x6779, 0xCCE8, 0x6794, + 0xCCE9, 0x6B25, 0xCCEA, 0x6B80, 0xCCEB, 0x6B7E, 0xCCEC, 0x6BDE, 0xCCED, 0x6C1D, 0xCCEE, 0x6C93, 0xCCEF, 0x6CEC, 0xCCF0, 0x6CEB, + 0xCCF1, 0x6CEE, 0xCCF2, 0x6CD9, 0xCCF3, 0x6CB6, 0xCCF4, 0x6CD4, 0xCCF5, 0x6CAD, 0xCCF6, 0x6CE7, 0xCCF7, 0x6CB7, 0xCCF8, 0x6CD0, + 0xCCF9, 0x6CC2, 0xCCFA, 0x6CBA, 0xCCFB, 0x6CC3, 0xCCFC, 0x6CC6, 0xCCFD, 0x6CED, 0xCCFE, 0x6CF2, 0xCD40, 0x6CD2, 0xCD41, 0x6CDD, + 0xCD42, 0x6CB4, 0xCD43, 0x6C8A, 0xCD44, 0x6C9D, 0xCD45, 0x6C80, 0xCD46, 0x6CDE, 0xCD47, 0x6CC0, 0xCD48, 0x6D30, 0xCD49, 0x6CCD, + 0xCD4A, 0x6CC7, 0xCD4B, 0x6CB0, 0xCD4C, 0x6CF9, 0xCD4D, 0x6CCF, 0xCD4E, 0x6CE9, 0xCD4F, 0x6CD1, 0xCD50, 0x7094, 0xCD51, 0x7098, + 0xCD52, 0x7085, 0xCD53, 0x7093, 0xCD54, 0x7086, 0xCD55, 0x7084, 0xCD56, 0x7091, 0xCD57, 0x7096, 0xCD58, 0x7082, 0xCD59, 0x709A, + 0xCD5A, 0x7083, 0xCD5B, 0x726A, 0xCD5C, 0x72D6, 0xCD5D, 0x72CB, 0xCD5E, 0x72D8, 0xCD5F, 0x72C9, 0xCD60, 0x72DC, 0xCD61, 0x72D2, + 0xCD62, 0x72D4, 0xCD63, 0x72DA, 0xCD64, 0x72CC, 0xCD65, 0x72D1, 0xCD66, 0x73A4, 0xCD67, 0x73A1, 0xCD68, 0x73AD, 0xCD69, 0x73A6, + 0xCD6A, 0x73A2, 0xCD6B, 0x73A0, 0xCD6C, 0x73AC, 0xCD6D, 0x739D, 0xCD6E, 0x74DD, 0xCD6F, 0x74E8, 0xCD70, 0x753F, 0xCD71, 0x7540, + 0xCD72, 0x753E, 0xCD73, 0x758C, 0xCD74, 0x7598, 0xCD75, 0x76AF, 0xCD76, 0x76F3, 0xCD77, 0x76F1, 0xCD78, 0x76F0, 0xCD79, 0x76F5, + 0xCD7A, 0x77F8, 0xCD7B, 0x77FC, 0xCD7C, 0x77F9, 0xCD7D, 0x77FB, 0xCD7E, 0x77FA, 0xCDA1, 0x77F7, 0xCDA2, 0x7942, 0xCDA3, 0x793F, + 0xCDA4, 0x79C5, 0xCDA5, 0x7A78, 0xCDA6, 0x7A7B, 0xCDA7, 0x7AFB, 0xCDA8, 0x7C75, 0xCDA9, 0x7CFD, 0xCDAA, 0x8035, 0xCDAB, 0x808F, + 0xCDAC, 0x80AE, 0xCDAD, 0x80A3, 0xCDAE, 0x80B8, 0xCDAF, 0x80B5, 0xCDB0, 0x80AD, 0xCDB1, 0x8220, 0xCDB2, 0x82A0, 0xCDB3, 0x82C0, + 0xCDB4, 0x82AB, 0xCDB5, 0x829A, 0xCDB6, 0x8298, 0xCDB7, 0x829B, 0xCDB8, 0x82B5, 0xCDB9, 0x82A7, 0xCDBA, 0x82AE, 0xCDBB, 0x82BC, + 0xCDBC, 0x829E, 0xCDBD, 0x82BA, 0xCDBE, 0x82B4, 0xCDBF, 0x82A8, 0xCDC0, 0x82A1, 0xCDC1, 0x82A9, 0xCDC2, 0x82C2, 0xCDC3, 0x82A4, + 0xCDC4, 0x82C3, 0xCDC5, 0x82B6, 0xCDC6, 0x82A2, 0xCDC7, 0x8670, 0xCDC8, 0x866F, 0xCDC9, 0x866D, 0xCDCA, 0x866E, 0xCDCB, 0x8C56, + 0xCDCC, 0x8FD2, 0xCDCD, 0x8FCB, 0xCDCE, 0x8FD3, 0xCDCF, 0x8FCD, 0xCDD0, 0x8FD6, 0xCDD1, 0x8FD5, 0xCDD2, 0x8FD7, 0xCDD3, 0x90B2, + 0xCDD4, 0x90B4, 0xCDD5, 0x90AF, 0xCDD6, 0x90B3, 0xCDD7, 0x90B0, 0xCDD8, 0x9639, 0xCDD9, 0x963D, 0xCDDA, 0x963C, 0xCDDB, 0x963A, + 0xCDDC, 0x9643, 0xCDDD, 0x4FCD, 0xCDDE, 0x4FC5, 0xCDDF, 0x4FD3, 0xCDE0, 0x4FB2, 0xCDE1, 0x4FC9, 0xCDE2, 0x4FCB, 0xCDE3, 0x4FC1, + 0xCDE4, 0x4FD4, 0xCDE5, 0x4FDC, 0xCDE6, 0x4FD9, 0xCDE7, 0x4FBB, 0xCDE8, 0x4FB3, 0xCDE9, 0x4FDB, 0xCDEA, 0x4FC7, 0xCDEB, 0x4FD6, + 0xCDEC, 0x4FBA, 0xCDED, 0x4FC0, 0xCDEE, 0x4FB9, 0xCDEF, 0x4FEC, 0xCDF0, 0x5244, 0xCDF1, 0x5249, 0xCDF2, 0x52C0, 0xCDF3, 0x52C2, + 0xCDF4, 0x533D, 0xCDF5, 0x537C, 0xCDF6, 0x5397, 0xCDF7, 0x5396, 0xCDF8, 0x5399, 0xCDF9, 0x5398, 0xCDFA, 0x54BA, 0xCDFB, 0x54A1, + 0xCDFC, 0x54AD, 0xCDFD, 0x54A5, 0xCDFE, 0x54CF, 0xCE40, 0x54C3, 0xCE41, 0x830D, 0xCE42, 0x54B7, 0xCE43, 0x54AE, 0xCE44, 0x54D6, + 0xCE45, 0x54B6, 0xCE46, 0x54C5, 0xCE47, 0x54C6, 0xCE48, 0x54A0, 0xCE49, 0x5470, 0xCE4A, 0x54BC, 0xCE4B, 0x54A2, 0xCE4C, 0x54BE, + 0xCE4D, 0x5472, 0xCE4E, 0x54DE, 0xCE4F, 0x54B0, 0xCE50, 0x57B5, 0xCE51, 0x579E, 0xCE52, 0x579F, 0xCE53, 0x57A4, 0xCE54, 0x578C, + 0xCE55, 0x5797, 0xCE56, 0x579D, 0xCE57, 0x579B, 0xCE58, 0x5794, 0xCE59, 0x5798, 0xCE5A, 0x578F, 0xCE5B, 0x5799, 0xCE5C, 0x57A5, + 0xCE5D, 0x579A, 0xCE5E, 0x5795, 0xCE5F, 0x58F4, 0xCE60, 0x590D, 0xCE61, 0x5953, 0xCE62, 0x59E1, 0xCE63, 0x59DE, 0xCE64, 0x59EE, + 0xCE65, 0x5A00, 0xCE66, 0x59F1, 0xCE67, 0x59DD, 0xCE68, 0x59FA, 0xCE69, 0x59FD, 0xCE6A, 0x59FC, 0xCE6B, 0x59F6, 0xCE6C, 0x59E4, + 0xCE6D, 0x59F2, 0xCE6E, 0x59F7, 0xCE6F, 0x59DB, 0xCE70, 0x59E9, 0xCE71, 0x59F3, 0xCE72, 0x59F5, 0xCE73, 0x59E0, 0xCE74, 0x59FE, + 0xCE75, 0x59F4, 0xCE76, 0x59ED, 0xCE77, 0x5BA8, 0xCE78, 0x5C4C, 0xCE79, 0x5CD0, 0xCE7A, 0x5CD8, 0xCE7B, 0x5CCC, 0xCE7C, 0x5CD7, + 0xCE7D, 0x5CCB, 0xCE7E, 0x5CDB, 0xCEA1, 0x5CDE, 0xCEA2, 0x5CDA, 0xCEA3, 0x5CC9, 0xCEA4, 0x5CC7, 0xCEA5, 0x5CCA, 0xCEA6, 0x5CD6, + 0xCEA7, 0x5CD3, 0xCEA8, 0x5CD4, 0xCEA9, 0x5CCF, 0xCEAA, 0x5CC8, 0xCEAB, 0x5CC6, 0xCEAC, 0x5CCE, 0xCEAD, 0x5CDF, 0xCEAE, 0x5CF8, + 0xCEAF, 0x5DF9, 0xCEB0, 0x5E21, 0xCEB1, 0x5E22, 0xCEB2, 0x5E23, 0xCEB3, 0x5E20, 0xCEB4, 0x5E24, 0xCEB5, 0x5EB0, 0xCEB6, 0x5EA4, + 0xCEB7, 0x5EA2, 0xCEB8, 0x5E9B, 0xCEB9, 0x5EA3, 0xCEBA, 0x5EA5, 0xCEBB, 0x5F07, 0xCEBC, 0x5F2E, 0xCEBD, 0x5F56, 0xCEBE, 0x5F86, + 0xCEBF, 0x6037, 0xCEC0, 0x6039, 0xCEC1, 0x6054, 0xCEC2, 0x6072, 0xCEC3, 0x605E, 0xCEC4, 0x6045, 0xCEC5, 0x6053, 0xCEC6, 0x6047, + 0xCEC7, 0x6049, 0xCEC8, 0x605B, 0xCEC9, 0x604C, 0xCECA, 0x6040, 0xCECB, 0x6042, 0xCECC, 0x605F, 0xCECD, 0x6024, 0xCECE, 0x6044, + 0xCECF, 0x6058, 0xCED0, 0x6066, 0xCED1, 0x606E, 0xCED2, 0x6242, 0xCED3, 0x6243, 0xCED4, 0x62CF, 0xCED5, 0x630D, 0xCED6, 0x630B, + 0xCED7, 0x62F5, 0xCED8, 0x630E, 0xCED9, 0x6303, 0xCEDA, 0x62EB, 0xCEDB, 0x62F9, 0xCEDC, 0x630F, 0xCEDD, 0x630C, 0xCEDE, 0x62F8, + 0xCEDF, 0x62F6, 0xCEE0, 0x6300, 0xCEE1, 0x6313, 0xCEE2, 0x6314, 0xCEE3, 0x62FA, 0xCEE4, 0x6315, 0xCEE5, 0x62FB, 0xCEE6, 0x62F0, + 0xCEE7, 0x6541, 0xCEE8, 0x6543, 0xCEE9, 0x65AA, 0xCEEA, 0x65BF, 0xCEEB, 0x6636, 0xCEEC, 0x6621, 0xCEED, 0x6632, 0xCEEE, 0x6635, + 0xCEEF, 0x661C, 0xCEF0, 0x6626, 0xCEF1, 0x6622, 0xCEF2, 0x6633, 0xCEF3, 0x662B, 0xCEF4, 0x663A, 0xCEF5, 0x661D, 0xCEF6, 0x6634, + 0xCEF7, 0x6639, 0xCEF8, 0x662E, 0xCEF9, 0x670F, 0xCEFA, 0x6710, 0xCEFB, 0x67C1, 0xCEFC, 0x67F2, 0xCEFD, 0x67C8, 0xCEFE, 0x67BA, + 0xCF40, 0x67DC, 0xCF41, 0x67BB, 0xCF42, 0x67F8, 0xCF43, 0x67D8, 0xCF44, 0x67C0, 0xCF45, 0x67B7, 0xCF46, 0x67C5, 0xCF47, 0x67EB, + 0xCF48, 0x67E4, 0xCF49, 0x67DF, 0xCF4A, 0x67B5, 0xCF4B, 0x67CD, 0xCF4C, 0x67B3, 0xCF4D, 0x67F7, 0xCF4E, 0x67F6, 0xCF4F, 0x67EE, + 0xCF50, 0x67E3, 0xCF51, 0x67C2, 0xCF52, 0x67B9, 0xCF53, 0x67CE, 0xCF54, 0x67E7, 0xCF55, 0x67F0, 0xCF56, 0x67B2, 0xCF57, 0x67FC, + 0xCF58, 0x67C6, 0xCF59, 0x67ED, 0xCF5A, 0x67CC, 0xCF5B, 0x67AE, 0xCF5C, 0x67E6, 0xCF5D, 0x67DB, 0xCF5E, 0x67FA, 0xCF5F, 0x67C9, + 0xCF60, 0x67CA, 0xCF61, 0x67C3, 0xCF62, 0x67EA, 0xCF63, 0x67CB, 0xCF64, 0x6B28, 0xCF65, 0x6B82, 0xCF66, 0x6B84, 0xCF67, 0x6BB6, + 0xCF68, 0x6BD6, 0xCF69, 0x6BD8, 0xCF6A, 0x6BE0, 0xCF6B, 0x6C20, 0xCF6C, 0x6C21, 0xCF6D, 0x6D28, 0xCF6E, 0x6D34, 0xCF6F, 0x6D2D, + 0xCF70, 0x6D1F, 0xCF71, 0x6D3C, 0xCF72, 0x6D3F, 0xCF73, 0x6D12, 0xCF74, 0x6D0A, 0xCF75, 0x6CDA, 0xCF76, 0x6D33, 0xCF77, 0x6D04, + 0xCF78, 0x6D19, 0xCF79, 0x6D3A, 0xCF7A, 0x6D1A, 0xCF7B, 0x6D11, 0xCF7C, 0x6D00, 0xCF7D, 0x6D1D, 0xCF7E, 0x6D42, 0xCFA1, 0x6D01, + 0xCFA2, 0x6D18, 0xCFA3, 0x6D37, 0xCFA4, 0x6D03, 0xCFA5, 0x6D0F, 0xCFA6, 0x6D40, 0xCFA7, 0x6D07, 0xCFA8, 0x6D20, 0xCFA9, 0x6D2C, + 0xCFAA, 0x6D08, 0xCFAB, 0x6D22, 0xCFAC, 0x6D09, 0xCFAD, 0x6D10, 0xCFAE, 0x70B7, 0xCFAF, 0x709F, 0xCFB0, 0x70BE, 0xCFB1, 0x70B1, + 0xCFB2, 0x70B0, 0xCFB3, 0x70A1, 0xCFB4, 0x70B4, 0xCFB5, 0x70B5, 0xCFB6, 0x70A9, 0xCFB7, 0x7241, 0xCFB8, 0x7249, 0xCFB9, 0x724A, + 0xCFBA, 0x726C, 0xCFBB, 0x7270, 0xCFBC, 0x7273, 0xCFBD, 0x726E, 0xCFBE, 0x72CA, 0xCFBF, 0x72E4, 0xCFC0, 0x72E8, 0xCFC1, 0x72EB, + 0xCFC2, 0x72DF, 0xCFC3, 0x72EA, 0xCFC4, 0x72E6, 0xCFC5, 0x72E3, 0xCFC6, 0x7385, 0xCFC7, 0x73CC, 0xCFC8, 0x73C2, 0xCFC9, 0x73C8, + 0xCFCA, 0x73C5, 0xCFCB, 0x73B9, 0xCFCC, 0x73B6, 0xCFCD, 0x73B5, 0xCFCE, 0x73B4, 0xCFCF, 0x73EB, 0xCFD0, 0x73BF, 0xCFD1, 0x73C7, + 0xCFD2, 0x73BE, 0xCFD3, 0x73C3, 0xCFD4, 0x73C6, 0xCFD5, 0x73B8, 0xCFD6, 0x73CB, 0xCFD7, 0x74EC, 0xCFD8, 0x74EE, 0xCFD9, 0x752E, + 0xCFDA, 0x7547, 0xCFDB, 0x7548, 0xCFDC, 0x75A7, 0xCFDD, 0x75AA, 0xCFDE, 0x7679, 0xCFDF, 0x76C4, 0xCFE0, 0x7708, 0xCFE1, 0x7703, + 0xCFE2, 0x7704, 0xCFE3, 0x7705, 0xCFE4, 0x770A, 0xCFE5, 0x76F7, 0xCFE6, 0x76FB, 0xCFE7, 0x76FA, 0xCFE8, 0x77E7, 0xCFE9, 0x77E8, + 0xCFEA, 0x7806, 0xCFEB, 0x7811, 0xCFEC, 0x7812, 0xCFED, 0x7805, 0xCFEE, 0x7810, 0xCFEF, 0x780F, 0xCFF0, 0x780E, 0xCFF1, 0x7809, + 0xCFF2, 0x7803, 0xCFF3, 0x7813, 0xCFF4, 0x794A, 0xCFF5, 0x794C, 0xCFF6, 0x794B, 0xCFF7, 0x7945, 0xCFF8, 0x7944, 0xCFF9, 0x79D5, + 0xCFFA, 0x79CD, 0xCFFB, 0x79CF, 0xCFFC, 0x79D6, 0xCFFD, 0x79CE, 0xCFFE, 0x7A80, 0xD040, 0x7A7E, 0xD041, 0x7AD1, 0xD042, 0x7B00, + 0xD043, 0x7B01, 0xD044, 0x7C7A, 0xD045, 0x7C78, 0xD046, 0x7C79, 0xD047, 0x7C7F, 0xD048, 0x7C80, 0xD049, 0x7C81, 0xD04A, 0x7D03, + 0xD04B, 0x7D08, 0xD04C, 0x7D01, 0xD04D, 0x7F58, 0xD04E, 0x7F91, 0xD04F, 0x7F8D, 0xD050, 0x7FBE, 0xD051, 0x8007, 0xD052, 0x800E, + 0xD053, 0x800F, 0xD054, 0x8014, 0xD055, 0x8037, 0xD056, 0x80D8, 0xD057, 0x80C7, 0xD058, 0x80E0, 0xD059, 0x80D1, 0xD05A, 0x80C8, + 0xD05B, 0x80C2, 0xD05C, 0x80D0, 0xD05D, 0x80C5, 0xD05E, 0x80E3, 0xD05F, 0x80D9, 0xD060, 0x80DC, 0xD061, 0x80CA, 0xD062, 0x80D5, + 0xD063, 0x80C9, 0xD064, 0x80CF, 0xD065, 0x80D7, 0xD066, 0x80E6, 0xD067, 0x80CD, 0xD068, 0x81FF, 0xD069, 0x8221, 0xD06A, 0x8294, + 0xD06B, 0x82D9, 0xD06C, 0x82FE, 0xD06D, 0x82F9, 0xD06E, 0x8307, 0xD06F, 0x82E8, 0xD070, 0x8300, 0xD071, 0x82D5, 0xD072, 0x833A, + 0xD073, 0x82EB, 0xD074, 0x82D6, 0xD075, 0x82F4, 0xD076, 0x82EC, 0xD077, 0x82E1, 0xD078, 0x82F2, 0xD079, 0x82F5, 0xD07A, 0x830C, + 0xD07B, 0x82FB, 0xD07C, 0x82F6, 0xD07D, 0x82F0, 0xD07E, 0x82EA, 0xD0A1, 0x82E4, 0xD0A2, 0x82E0, 0xD0A3, 0x82FA, 0xD0A4, 0x82F3, + 0xD0A5, 0x82ED, 0xD0A6, 0x8677, 0xD0A7, 0x8674, 0xD0A8, 0x867C, 0xD0A9, 0x8673, 0xD0AA, 0x8841, 0xD0AB, 0x884E, 0xD0AC, 0x8867, + 0xD0AD, 0x886A, 0xD0AE, 0x8869, 0xD0AF, 0x89D3, 0xD0B0, 0x8A04, 0xD0B1, 0x8A07, 0xD0B2, 0x8D72, 0xD0B3, 0x8FE3, 0xD0B4, 0x8FE1, + 0xD0B5, 0x8FEE, 0xD0B6, 0x8FE0, 0xD0B7, 0x90F1, 0xD0B8, 0x90BD, 0xD0B9, 0x90BF, 0xD0BA, 0x90D5, 0xD0BB, 0x90C5, 0xD0BC, 0x90BE, + 0xD0BD, 0x90C7, 0xD0BE, 0x90CB, 0xD0BF, 0x90C8, 0xD0C0, 0x91D4, 0xD0C1, 0x91D3, 0xD0C2, 0x9654, 0xD0C3, 0x964F, 0xD0C4, 0x9651, + 0xD0C5, 0x9653, 0xD0C6, 0x964A, 0xD0C7, 0x964E, 0xD0C8, 0x501E, 0xD0C9, 0x5005, 0xD0CA, 0x5007, 0xD0CB, 0x5013, 0xD0CC, 0x5022, + 0xD0CD, 0x5030, 0xD0CE, 0x501B, 0xD0CF, 0x4FF5, 0xD0D0, 0x4FF4, 0xD0D1, 0x5033, 0xD0D2, 0x5037, 0xD0D3, 0x502C, 0xD0D4, 0x4FF6, + 0xD0D5, 0x4FF7, 0xD0D6, 0x5017, 0xD0D7, 0x501C, 0xD0D8, 0x5020, 0xD0D9, 0x5027, 0xD0DA, 0x5035, 0xD0DB, 0x502F, 0xD0DC, 0x5031, + 0xD0DD, 0x500E, 0xD0DE, 0x515A, 0xD0DF, 0x5194, 0xD0E0, 0x5193, 0xD0E1, 0x51CA, 0xD0E2, 0x51C4, 0xD0E3, 0x51C5, 0xD0E4, 0x51C8, + 0xD0E5, 0x51CE, 0xD0E6, 0x5261, 0xD0E7, 0x525A, 0xD0E8, 0x5252, 0xD0E9, 0x525E, 0xD0EA, 0x525F, 0xD0EB, 0x5255, 0xD0EC, 0x5262, + 0xD0ED, 0x52CD, 0xD0EE, 0x530E, 0xD0EF, 0x539E, 0xD0F0, 0x5526, 0xD0F1, 0x54E2, 0xD0F2, 0x5517, 0xD0F3, 0x5512, 0xD0F4, 0x54E7, + 0xD0F5, 0x54F3, 0xD0F6, 0x54E4, 0xD0F7, 0x551A, 0xD0F8, 0x54FF, 0xD0F9, 0x5504, 0xD0FA, 0x5508, 0xD0FB, 0x54EB, 0xD0FC, 0x5511, + 0xD0FD, 0x5505, 0xD0FE, 0x54F1, 0xD140, 0x550A, 0xD141, 0x54FB, 0xD142, 0x54F7, 0xD143, 0x54F8, 0xD144, 0x54E0, 0xD145, 0x550E, + 0xD146, 0x5503, 0xD147, 0x550B, 0xD148, 0x5701, 0xD149, 0x5702, 0xD14A, 0x57CC, 0xD14B, 0x5832, 0xD14C, 0x57D5, 0xD14D, 0x57D2, + 0xD14E, 0x57BA, 0xD14F, 0x57C6, 0xD150, 0x57BD, 0xD151, 0x57BC, 0xD152, 0x57B8, 0xD153, 0x57B6, 0xD154, 0x57BF, 0xD155, 0x57C7, + 0xD156, 0x57D0, 0xD157, 0x57B9, 0xD158, 0x57C1, 0xD159, 0x590E, 0xD15A, 0x594A, 0xD15B, 0x5A19, 0xD15C, 0x5A16, 0xD15D, 0x5A2D, + 0xD15E, 0x5A2E, 0xD15F, 0x5A15, 0xD160, 0x5A0F, 0xD161, 0x5A17, 0xD162, 0x5A0A, 0xD163, 0x5A1E, 0xD164, 0x5A33, 0xD165, 0x5B6C, + 0xD166, 0x5BA7, 0xD167, 0x5BAD, 0xD168, 0x5BAC, 0xD169, 0x5C03, 0xD16A, 0x5C56, 0xD16B, 0x5C54, 0xD16C, 0x5CEC, 0xD16D, 0x5CFF, + 0xD16E, 0x5CEE, 0xD16F, 0x5CF1, 0xD170, 0x5CF7, 0xD171, 0x5D00, 0xD172, 0x5CF9, 0xD173, 0x5E29, 0xD174, 0x5E28, 0xD175, 0x5EA8, + 0xD176, 0x5EAE, 0xD177, 0x5EAA, 0xD178, 0x5EAC, 0xD179, 0x5F33, 0xD17A, 0x5F30, 0xD17B, 0x5F67, 0xD17C, 0x605D, 0xD17D, 0x605A, + 0xD17E, 0x6067, 0xD1A1, 0x6041, 0xD1A2, 0x60A2, 0xD1A3, 0x6088, 0xD1A4, 0x6080, 0xD1A5, 0x6092, 0xD1A6, 0x6081, 0xD1A7, 0x609D, + 0xD1A8, 0x6083, 0xD1A9, 0x6095, 0xD1AA, 0x609B, 0xD1AB, 0x6097, 0xD1AC, 0x6087, 0xD1AD, 0x609C, 0xD1AE, 0x608E, 0xD1AF, 0x6219, + 0xD1B0, 0x6246, 0xD1B1, 0x62F2, 0xD1B2, 0x6310, 0xD1B3, 0x6356, 0xD1B4, 0x632C, 0xD1B5, 0x6344, 0xD1B6, 0x6345, 0xD1B7, 0x6336, + 0xD1B8, 0x6343, 0xD1B9, 0x63E4, 0xD1BA, 0x6339, 0xD1BB, 0x634B, 0xD1BC, 0x634A, 0xD1BD, 0x633C, 0xD1BE, 0x6329, 0xD1BF, 0x6341, + 0xD1C0, 0x6334, 0xD1C1, 0x6358, 0xD1C2, 0x6354, 0xD1C3, 0x6359, 0xD1C4, 0x632D, 0xD1C5, 0x6347, 0xD1C6, 0x6333, 0xD1C7, 0x635A, + 0xD1C8, 0x6351, 0xD1C9, 0x6338, 0xD1CA, 0x6357, 0xD1CB, 0x6340, 0xD1CC, 0x6348, 0xD1CD, 0x654A, 0xD1CE, 0x6546, 0xD1CF, 0x65C6, + 0xD1D0, 0x65C3, 0xD1D1, 0x65C4, 0xD1D2, 0x65C2, 0xD1D3, 0x664A, 0xD1D4, 0x665F, 0xD1D5, 0x6647, 0xD1D6, 0x6651, 0xD1D7, 0x6712, + 0xD1D8, 0x6713, 0xD1D9, 0x681F, 0xD1DA, 0x681A, 0xD1DB, 0x6849, 0xD1DC, 0x6832, 0xD1DD, 0x6833, 0xD1DE, 0x683B, 0xD1DF, 0x684B, + 0xD1E0, 0x684F, 0xD1E1, 0x6816, 0xD1E2, 0x6831, 0xD1E3, 0x681C, 0xD1E4, 0x6835, 0xD1E5, 0x682B, 0xD1E6, 0x682D, 0xD1E7, 0x682F, + 0xD1E8, 0x684E, 0xD1E9, 0x6844, 0xD1EA, 0x6834, 0xD1EB, 0x681D, 0xD1EC, 0x6812, 0xD1ED, 0x6814, 0xD1EE, 0x6826, 0xD1EF, 0x6828, + 0xD1F0, 0x682E, 0xD1F1, 0x684D, 0xD1F2, 0x683A, 0xD1F3, 0x6825, 0xD1F4, 0x6820, 0xD1F5, 0x6B2C, 0xD1F6, 0x6B2F, 0xD1F7, 0x6B2D, + 0xD1F8, 0x6B31, 0xD1F9, 0x6B34, 0xD1FA, 0x6B6D, 0xD1FB, 0x8082, 0xD1FC, 0x6B88, 0xD1FD, 0x6BE6, 0xD1FE, 0x6BE4, 0xD240, 0x6BE8, + 0xD241, 0x6BE3, 0xD242, 0x6BE2, 0xD243, 0x6BE7, 0xD244, 0x6C25, 0xD245, 0x6D7A, 0xD246, 0x6D63, 0xD247, 0x6D64, 0xD248, 0x6D76, + 0xD249, 0x6D0D, 0xD24A, 0x6D61, 0xD24B, 0x6D92, 0xD24C, 0x6D58, 0xD24D, 0x6D62, 0xD24E, 0x6D6D, 0xD24F, 0x6D6F, 0xD250, 0x6D91, + 0xD251, 0x6D8D, 0xD252, 0x6DEF, 0xD253, 0x6D7F, 0xD254, 0x6D86, 0xD255, 0x6D5E, 0xD256, 0x6D67, 0xD257, 0x6D60, 0xD258, 0x6D97, + 0xD259, 0x6D70, 0xD25A, 0x6D7C, 0xD25B, 0x6D5F, 0xD25C, 0x6D82, 0xD25D, 0x6D98, 0xD25E, 0x6D2F, 0xD25F, 0x6D68, 0xD260, 0x6D8B, + 0xD261, 0x6D7E, 0xD262, 0x6D80, 0xD263, 0x6D84, 0xD264, 0x6D16, 0xD265, 0x6D83, 0xD266, 0x6D7B, 0xD267, 0x6D7D, 0xD268, 0x6D75, + 0xD269, 0x6D90, 0xD26A, 0x70DC, 0xD26B, 0x70D3, 0xD26C, 0x70D1, 0xD26D, 0x70DD, 0xD26E, 0x70CB, 0xD26F, 0x7F39, 0xD270, 0x70E2, + 0xD271, 0x70D7, 0xD272, 0x70D2, 0xD273, 0x70DE, 0xD274, 0x70E0, 0xD275, 0x70D4, 0xD276, 0x70CD, 0xD277, 0x70C5, 0xD278, 0x70C6, + 0xD279, 0x70C7, 0xD27A, 0x70DA, 0xD27B, 0x70CE, 0xD27C, 0x70E1, 0xD27D, 0x7242, 0xD27E, 0x7278, 0xD2A1, 0x7277, 0xD2A2, 0x7276, + 0xD2A3, 0x7300, 0xD2A4, 0x72FA, 0xD2A5, 0x72F4, 0xD2A6, 0x72FE, 0xD2A7, 0x72F6, 0xD2A8, 0x72F3, 0xD2A9, 0x72FB, 0xD2AA, 0x7301, + 0xD2AB, 0x73D3, 0xD2AC, 0x73D9, 0xD2AD, 0x73E5, 0xD2AE, 0x73D6, 0xD2AF, 0x73BC, 0xD2B0, 0x73E7, 0xD2B1, 0x73E3, 0xD2B2, 0x73E9, + 0xD2B3, 0x73DC, 0xD2B4, 0x73D2, 0xD2B5, 0x73DB, 0xD2B6, 0x73D4, 0xD2B7, 0x73DD, 0xD2B8, 0x73DA, 0xD2B9, 0x73D7, 0xD2BA, 0x73D8, + 0xD2BB, 0x73E8, 0xD2BC, 0x74DE, 0xD2BD, 0x74DF, 0xD2BE, 0x74F4, 0xD2BF, 0x74F5, 0xD2C0, 0x7521, 0xD2C1, 0x755B, 0xD2C2, 0x755F, + 0xD2C3, 0x75B0, 0xD2C4, 0x75C1, 0xD2C5, 0x75BB, 0xD2C6, 0x75C4, 0xD2C7, 0x75C0, 0xD2C8, 0x75BF, 0xD2C9, 0x75B6, 0xD2CA, 0x75BA, + 0xD2CB, 0x768A, 0xD2CC, 0x76C9, 0xD2CD, 0x771D, 0xD2CE, 0x771B, 0xD2CF, 0x7710, 0xD2D0, 0x7713, 0xD2D1, 0x7712, 0xD2D2, 0x7723, + 0xD2D3, 0x7711, 0xD2D4, 0x7715, 0xD2D5, 0x7719, 0xD2D6, 0x771A, 0xD2D7, 0x7722, 0xD2D8, 0x7727, 0xD2D9, 0x7823, 0xD2DA, 0x782C, + 0xD2DB, 0x7822, 0xD2DC, 0x7835, 0xD2DD, 0x782F, 0xD2DE, 0x7828, 0xD2DF, 0x782E, 0xD2E0, 0x782B, 0xD2E1, 0x7821, 0xD2E2, 0x7829, + 0xD2E3, 0x7833, 0xD2E4, 0x782A, 0xD2E5, 0x7831, 0xD2E6, 0x7954, 0xD2E7, 0x795B, 0xD2E8, 0x794F, 0xD2E9, 0x795C, 0xD2EA, 0x7953, + 0xD2EB, 0x7952, 0xD2EC, 0x7951, 0xD2ED, 0x79EB, 0xD2EE, 0x79EC, 0xD2EF, 0x79E0, 0xD2F0, 0x79EE, 0xD2F1, 0x79ED, 0xD2F2, 0x79EA, + 0xD2F3, 0x79DC, 0xD2F4, 0x79DE, 0xD2F5, 0x79DD, 0xD2F6, 0x7A86, 0xD2F7, 0x7A89, 0xD2F8, 0x7A85, 0xD2F9, 0x7A8B, 0xD2FA, 0x7A8C, + 0xD2FB, 0x7A8A, 0xD2FC, 0x7A87, 0xD2FD, 0x7AD8, 0xD2FE, 0x7B10, 0xD340, 0x7B04, 0xD341, 0x7B13, 0xD342, 0x7B05, 0xD343, 0x7B0F, + 0xD344, 0x7B08, 0xD345, 0x7B0A, 0xD346, 0x7B0E, 0xD347, 0x7B09, 0xD348, 0x7B12, 0xD349, 0x7C84, 0xD34A, 0x7C91, 0xD34B, 0x7C8A, + 0xD34C, 0x7C8C, 0xD34D, 0x7C88, 0xD34E, 0x7C8D, 0xD34F, 0x7C85, 0xD350, 0x7D1E, 0xD351, 0x7D1D, 0xD352, 0x7D11, 0xD353, 0x7D0E, + 0xD354, 0x7D18, 0xD355, 0x7D16, 0xD356, 0x7D13, 0xD357, 0x7D1F, 0xD358, 0x7D12, 0xD359, 0x7D0F, 0xD35A, 0x7D0C, 0xD35B, 0x7F5C, + 0xD35C, 0x7F61, 0xD35D, 0x7F5E, 0xD35E, 0x7F60, 0xD35F, 0x7F5D, 0xD360, 0x7F5B, 0xD361, 0x7F96, 0xD362, 0x7F92, 0xD363, 0x7FC3, + 0xD364, 0x7FC2, 0xD365, 0x7FC0, 0xD366, 0x8016, 0xD367, 0x803E, 0xD368, 0x8039, 0xD369, 0x80FA, 0xD36A, 0x80F2, 0xD36B, 0x80F9, + 0xD36C, 0x80F5, 0xD36D, 0x8101, 0xD36E, 0x80FB, 0xD36F, 0x8100, 0xD370, 0x8201, 0xD371, 0x822F, 0xD372, 0x8225, 0xD373, 0x8333, + 0xD374, 0x832D, 0xD375, 0x8344, 0xD376, 0x8319, 0xD377, 0x8351, 0xD378, 0x8325, 0xD379, 0x8356, 0xD37A, 0x833F, 0xD37B, 0x8341, + 0xD37C, 0x8326, 0xD37D, 0x831C, 0xD37E, 0x8322, 0xD3A1, 0x8342, 0xD3A2, 0x834E, 0xD3A3, 0x831B, 0xD3A4, 0x832A, 0xD3A5, 0x8308, + 0xD3A6, 0x833C, 0xD3A7, 0x834D, 0xD3A8, 0x8316, 0xD3A9, 0x8324, 0xD3AA, 0x8320, 0xD3AB, 0x8337, 0xD3AC, 0x832F, 0xD3AD, 0x8329, + 0xD3AE, 0x8347, 0xD3AF, 0x8345, 0xD3B0, 0x834C, 0xD3B1, 0x8353, 0xD3B2, 0x831E, 0xD3B3, 0x832C, 0xD3B4, 0x834B, 0xD3B5, 0x8327, + 0xD3B6, 0x8348, 0xD3B7, 0x8653, 0xD3B8, 0x8652, 0xD3B9, 0x86A2, 0xD3BA, 0x86A8, 0xD3BB, 0x8696, 0xD3BC, 0x868D, 0xD3BD, 0x8691, + 0xD3BE, 0x869E, 0xD3BF, 0x8687, 0xD3C0, 0x8697, 0xD3C1, 0x8686, 0xD3C2, 0x868B, 0xD3C3, 0x869A, 0xD3C4, 0x8685, 0xD3C5, 0x86A5, + 0xD3C6, 0x8699, 0xD3C7, 0x86A1, 0xD3C8, 0x86A7, 0xD3C9, 0x8695, 0xD3CA, 0x8698, 0xD3CB, 0x868E, 0xD3CC, 0x869D, 0xD3CD, 0x8690, + 0xD3CE, 0x8694, 0xD3CF, 0x8843, 0xD3D0, 0x8844, 0xD3D1, 0x886D, 0xD3D2, 0x8875, 0xD3D3, 0x8876, 0xD3D4, 0x8872, 0xD3D5, 0x8880, + 0xD3D6, 0x8871, 0xD3D7, 0x887F, 0xD3D8, 0x886F, 0xD3D9, 0x8883, 0xD3DA, 0x887E, 0xD3DB, 0x8874, 0xD3DC, 0x887C, 0xD3DD, 0x8A12, + 0xD3DE, 0x8C47, 0xD3DF, 0x8C57, 0xD3E0, 0x8C7B, 0xD3E1, 0x8CA4, 0xD3E2, 0x8CA3, 0xD3E3, 0x8D76, 0xD3E4, 0x8D78, 0xD3E5, 0x8DB5, + 0xD3E6, 0x8DB7, 0xD3E7, 0x8DB6, 0xD3E8, 0x8ED1, 0xD3E9, 0x8ED3, 0xD3EA, 0x8FFE, 0xD3EB, 0x8FF5, 0xD3EC, 0x9002, 0xD3ED, 0x8FFF, + 0xD3EE, 0x8FFB, 0xD3EF, 0x9004, 0xD3F0, 0x8FFC, 0xD3F1, 0x8FF6, 0xD3F2, 0x90D6, 0xD3F3, 0x90E0, 0xD3F4, 0x90D9, 0xD3F5, 0x90DA, + 0xD3F6, 0x90E3, 0xD3F7, 0x90DF, 0xD3F8, 0x90E5, 0xD3F9, 0x90D8, 0xD3FA, 0x90DB, 0xD3FB, 0x90D7, 0xD3FC, 0x90DC, 0xD3FD, 0x90E4, + 0xD3FE, 0x9150, 0xD440, 0x914E, 0xD441, 0x914F, 0xD442, 0x91D5, 0xD443, 0x91E2, 0xD444, 0x91DA, 0xD445, 0x965C, 0xD446, 0x965F, + 0xD447, 0x96BC, 0xD448, 0x98E3, 0xD449, 0x9ADF, 0xD44A, 0x9B2F, 0xD44B, 0x4E7F, 0xD44C, 0x5070, 0xD44D, 0x506A, 0xD44E, 0x5061, + 0xD44F, 0x505E, 0xD450, 0x5060, 0xD451, 0x5053, 0xD452, 0x504B, 0xD453, 0x505D, 0xD454, 0x5072, 0xD455, 0x5048, 0xD456, 0x504D, + 0xD457, 0x5041, 0xD458, 0x505B, 0xD459, 0x504A, 0xD45A, 0x5062, 0xD45B, 0x5015, 0xD45C, 0x5045, 0xD45D, 0x505F, 0xD45E, 0x5069, + 0xD45F, 0x506B, 0xD460, 0x5063, 0xD461, 0x5064, 0xD462, 0x5046, 0xD463, 0x5040, 0xD464, 0x506E, 0xD465, 0x5073, 0xD466, 0x5057, + 0xD467, 0x5051, 0xD468, 0x51D0, 0xD469, 0x526B, 0xD46A, 0x526D, 0xD46B, 0x526C, 0xD46C, 0x526E, 0xD46D, 0x52D6, 0xD46E, 0x52D3, + 0xD46F, 0x532D, 0xD470, 0x539C, 0xD471, 0x5575, 0xD472, 0x5576, 0xD473, 0x553C, 0xD474, 0x554D, 0xD475, 0x5550, 0xD476, 0x5534, + 0xD477, 0x552A, 0xD478, 0x5551, 0xD479, 0x5562, 0xD47A, 0x5536, 0xD47B, 0x5535, 0xD47C, 0x5530, 0xD47D, 0x5552, 0xD47E, 0x5545, + 0xD4A1, 0x550C, 0xD4A2, 0x5532, 0xD4A3, 0x5565, 0xD4A4, 0x554E, 0xD4A5, 0x5539, 0xD4A6, 0x5548, 0xD4A7, 0x552D, 0xD4A8, 0x553B, + 0xD4A9, 0x5540, 0xD4AA, 0x554B, 0xD4AB, 0x570A, 0xD4AC, 0x5707, 0xD4AD, 0x57FB, 0xD4AE, 0x5814, 0xD4AF, 0x57E2, 0xD4B0, 0x57F6, + 0xD4B1, 0x57DC, 0xD4B2, 0x57F4, 0xD4B3, 0x5800, 0xD4B4, 0x57ED, 0xD4B5, 0x57FD, 0xD4B6, 0x5808, 0xD4B7, 0x57F8, 0xD4B8, 0x580B, + 0xD4B9, 0x57F3, 0xD4BA, 0x57CF, 0xD4BB, 0x5807, 0xD4BC, 0x57EE, 0xD4BD, 0x57E3, 0xD4BE, 0x57F2, 0xD4BF, 0x57E5, 0xD4C0, 0x57EC, + 0xD4C1, 0x57E1, 0xD4C2, 0x580E, 0xD4C3, 0x57FC, 0xD4C4, 0x5810, 0xD4C5, 0x57E7, 0xD4C6, 0x5801, 0xD4C7, 0x580C, 0xD4C8, 0x57F1, + 0xD4C9, 0x57E9, 0xD4CA, 0x57F0, 0xD4CB, 0x580D, 0xD4CC, 0x5804, 0xD4CD, 0x595C, 0xD4CE, 0x5A60, 0xD4CF, 0x5A58, 0xD4D0, 0x5A55, + 0xD4D1, 0x5A67, 0xD4D2, 0x5A5E, 0xD4D3, 0x5A38, 0xD4D4, 0x5A35, 0xD4D5, 0x5A6D, 0xD4D6, 0x5A50, 0xD4D7, 0x5A5F, 0xD4D8, 0x5A65, + 0xD4D9, 0x5A6C, 0xD4DA, 0x5A53, 0xD4DB, 0x5A64, 0xD4DC, 0x5A57, 0xD4DD, 0x5A43, 0xD4DE, 0x5A5D, 0xD4DF, 0x5A52, 0xD4E0, 0x5A44, + 0xD4E1, 0x5A5B, 0xD4E2, 0x5A48, 0xD4E3, 0x5A8E, 0xD4E4, 0x5A3E, 0xD4E5, 0x5A4D, 0xD4E6, 0x5A39, 0xD4E7, 0x5A4C, 0xD4E8, 0x5A70, + 0xD4E9, 0x5A69, 0xD4EA, 0x5A47, 0xD4EB, 0x5A51, 0xD4EC, 0x5A56, 0xD4ED, 0x5A42, 0xD4EE, 0x5A5C, 0xD4EF, 0x5B72, 0xD4F0, 0x5B6E, + 0xD4F1, 0x5BC1, 0xD4F2, 0x5BC0, 0xD4F3, 0x5C59, 0xD4F4, 0x5D1E, 0xD4F5, 0x5D0B, 0xD4F6, 0x5D1D, 0xD4F7, 0x5D1A, 0xD4F8, 0x5D20, + 0xD4F9, 0x5D0C, 0xD4FA, 0x5D28, 0xD4FB, 0x5D0D, 0xD4FC, 0x5D26, 0xD4FD, 0x5D25, 0xD4FE, 0x5D0F, 0xD540, 0x5D30, 0xD541, 0x5D12, + 0xD542, 0x5D23, 0xD543, 0x5D1F, 0xD544, 0x5D2E, 0xD545, 0x5E3E, 0xD546, 0x5E34, 0xD547, 0x5EB1, 0xD548, 0x5EB4, 0xD549, 0x5EB9, + 0xD54A, 0x5EB2, 0xD54B, 0x5EB3, 0xD54C, 0x5F36, 0xD54D, 0x5F38, 0xD54E, 0x5F9B, 0xD54F, 0x5F96, 0xD550, 0x5F9F, 0xD551, 0x608A, + 0xD552, 0x6090, 0xD553, 0x6086, 0xD554, 0x60BE, 0xD555, 0x60B0, 0xD556, 0x60BA, 0xD557, 0x60D3, 0xD558, 0x60D4, 0xD559, 0x60CF, + 0xD55A, 0x60E4, 0xD55B, 0x60D9, 0xD55C, 0x60DD, 0xD55D, 0x60C8, 0xD55E, 0x60B1, 0xD55F, 0x60DB, 0xD560, 0x60B7, 0xD561, 0x60CA, + 0xD562, 0x60BF, 0xD563, 0x60C3, 0xD564, 0x60CD, 0xD565, 0x60C0, 0xD566, 0x6332, 0xD567, 0x6365, 0xD568, 0x638A, 0xD569, 0x6382, + 0xD56A, 0x637D, 0xD56B, 0x63BD, 0xD56C, 0x639E, 0xD56D, 0x63AD, 0xD56E, 0x639D, 0xD56F, 0x6397, 0xD570, 0x63AB, 0xD571, 0x638E, + 0xD572, 0x636F, 0xD573, 0x6387, 0xD574, 0x6390, 0xD575, 0x636E, 0xD576, 0x63AF, 0xD577, 0x6375, 0xD578, 0x639C, 0xD579, 0x636D, + 0xD57A, 0x63AE, 0xD57B, 0x637C, 0xD57C, 0x63A4, 0xD57D, 0x633B, 0xD57E, 0x639F, 0xD5A1, 0x6378, 0xD5A2, 0x6385, 0xD5A3, 0x6381, + 0xD5A4, 0x6391, 0xD5A5, 0x638D, 0xD5A6, 0x6370, 0xD5A7, 0x6553, 0xD5A8, 0x65CD, 0xD5A9, 0x6665, 0xD5AA, 0x6661, 0xD5AB, 0x665B, + 0xD5AC, 0x6659, 0xD5AD, 0x665C, 0xD5AE, 0x6662, 0xD5AF, 0x6718, 0xD5B0, 0x6879, 0xD5B1, 0x6887, 0xD5B2, 0x6890, 0xD5B3, 0x689C, + 0xD5B4, 0x686D, 0xD5B5, 0x686E, 0xD5B6, 0x68AE, 0xD5B7, 0x68AB, 0xD5B8, 0x6956, 0xD5B9, 0x686F, 0xD5BA, 0x68A3, 0xD5BB, 0x68AC, + 0xD5BC, 0x68A9, 0xD5BD, 0x6875, 0xD5BE, 0x6874, 0xD5BF, 0x68B2, 0xD5C0, 0x688F, 0xD5C1, 0x6877, 0xD5C2, 0x6892, 0xD5C3, 0x687C, + 0xD5C4, 0x686B, 0xD5C5, 0x6872, 0xD5C6, 0x68AA, 0xD5C7, 0x6880, 0xD5C8, 0x6871, 0xD5C9, 0x687E, 0xD5CA, 0x689B, 0xD5CB, 0x6896, + 0xD5CC, 0x688B, 0xD5CD, 0x68A0, 0xD5CE, 0x6889, 0xD5CF, 0x68A4, 0xD5D0, 0x6878, 0xD5D1, 0x687B, 0xD5D2, 0x6891, 0xD5D3, 0x688C, + 0xD5D4, 0x688A, 0xD5D5, 0x687D, 0xD5D6, 0x6B36, 0xD5D7, 0x6B33, 0xD5D8, 0x6B37, 0xD5D9, 0x6B38, 0xD5DA, 0x6B91, 0xD5DB, 0x6B8F, + 0xD5DC, 0x6B8D, 0xD5DD, 0x6B8E, 0xD5DE, 0x6B8C, 0xD5DF, 0x6C2A, 0xD5E0, 0x6DC0, 0xD5E1, 0x6DAB, 0xD5E2, 0x6DB4, 0xD5E3, 0x6DB3, + 0xD5E4, 0x6E74, 0xD5E5, 0x6DAC, 0xD5E6, 0x6DE9, 0xD5E7, 0x6DE2, 0xD5E8, 0x6DB7, 0xD5E9, 0x6DF6, 0xD5EA, 0x6DD4, 0xD5EB, 0x6E00, + 0xD5EC, 0x6DC8, 0xD5ED, 0x6DE0, 0xD5EE, 0x6DDF, 0xD5EF, 0x6DD6, 0xD5F0, 0x6DBE, 0xD5F1, 0x6DE5, 0xD5F2, 0x6DDC, 0xD5F3, 0x6DDD, + 0xD5F4, 0x6DDB, 0xD5F5, 0x6DF4, 0xD5F6, 0x6DCA, 0xD5F7, 0x6DBD, 0xD5F8, 0x6DED, 0xD5F9, 0x6DF0, 0xD5FA, 0x6DBA, 0xD5FB, 0x6DD5, + 0xD5FC, 0x6DC2, 0xD5FD, 0x6DCF, 0xD5FE, 0x6DC9, 0xD640, 0x6DD0, 0xD641, 0x6DF2, 0xD642, 0x6DD3, 0xD643, 0x6DFD, 0xD644, 0x6DD7, + 0xD645, 0x6DCD, 0xD646, 0x6DE3, 0xD647, 0x6DBB, 0xD648, 0x70FA, 0xD649, 0x710D, 0xD64A, 0x70F7, 0xD64B, 0x7117, 0xD64C, 0x70F4, + 0xD64D, 0x710C, 0xD64E, 0x70F0, 0xD64F, 0x7104, 0xD650, 0x70F3, 0xD651, 0x7110, 0xD652, 0x70FC, 0xD653, 0x70FF, 0xD654, 0x7106, + 0xD655, 0x7113, 0xD656, 0x7100, 0xD657, 0x70F8, 0xD658, 0x70F6, 0xD659, 0x710B, 0xD65A, 0x7102, 0xD65B, 0x710E, 0xD65C, 0x727E, + 0xD65D, 0x727B, 0xD65E, 0x727C, 0xD65F, 0x727F, 0xD660, 0x731D, 0xD661, 0x7317, 0xD662, 0x7307, 0xD663, 0x7311, 0xD664, 0x7318, + 0xD665, 0x730A, 0xD666, 0x7308, 0xD667, 0x72FF, 0xD668, 0x730F, 0xD669, 0x731E, 0xD66A, 0x7388, 0xD66B, 0x73F6, 0xD66C, 0x73F8, + 0xD66D, 0x73F5, 0xD66E, 0x7404, 0xD66F, 0x7401, 0xD670, 0x73FD, 0xD671, 0x7407, 0xD672, 0x7400, 0xD673, 0x73FA, 0xD674, 0x73FC, + 0xD675, 0x73FF, 0xD676, 0x740C, 0xD677, 0x740B, 0xD678, 0x73F4, 0xD679, 0x7408, 0xD67A, 0x7564, 0xD67B, 0x7563, 0xD67C, 0x75CE, + 0xD67D, 0x75D2, 0xD67E, 0x75CF, 0xD6A1, 0x75CB, 0xD6A2, 0x75CC, 0xD6A3, 0x75D1, 0xD6A4, 0x75D0, 0xD6A5, 0x768F, 0xD6A6, 0x7689, + 0xD6A7, 0x76D3, 0xD6A8, 0x7739, 0xD6A9, 0x772F, 0xD6AA, 0x772D, 0xD6AB, 0x7731, 0xD6AC, 0x7732, 0xD6AD, 0x7734, 0xD6AE, 0x7733, + 0xD6AF, 0x773D, 0xD6B0, 0x7725, 0xD6B1, 0x773B, 0xD6B2, 0x7735, 0xD6B3, 0x7848, 0xD6B4, 0x7852, 0xD6B5, 0x7849, 0xD6B6, 0x784D, + 0xD6B7, 0x784A, 0xD6B8, 0x784C, 0xD6B9, 0x7826, 0xD6BA, 0x7845, 0xD6BB, 0x7850, 0xD6BC, 0x7964, 0xD6BD, 0x7967, 0xD6BE, 0x7969, + 0xD6BF, 0x796A, 0xD6C0, 0x7963, 0xD6C1, 0x796B, 0xD6C2, 0x7961, 0xD6C3, 0x79BB, 0xD6C4, 0x79FA, 0xD6C5, 0x79F8, 0xD6C6, 0x79F6, + 0xD6C7, 0x79F7, 0xD6C8, 0x7A8F, 0xD6C9, 0x7A94, 0xD6CA, 0x7A90, 0xD6CB, 0x7B35, 0xD6CC, 0x7B47, 0xD6CD, 0x7B34, 0xD6CE, 0x7B25, + 0xD6CF, 0x7B30, 0xD6D0, 0x7B22, 0xD6D1, 0x7B24, 0xD6D2, 0x7B33, 0xD6D3, 0x7B18, 0xD6D4, 0x7B2A, 0xD6D5, 0x7B1D, 0xD6D6, 0x7B31, + 0xD6D7, 0x7B2B, 0xD6D8, 0x7B2D, 0xD6D9, 0x7B2F, 0xD6DA, 0x7B32, 0xD6DB, 0x7B38, 0xD6DC, 0x7B1A, 0xD6DD, 0x7B23, 0xD6DE, 0x7C94, + 0xD6DF, 0x7C98, 0xD6E0, 0x7C96, 0xD6E1, 0x7CA3, 0xD6E2, 0x7D35, 0xD6E3, 0x7D3D, 0xD6E4, 0x7D38, 0xD6E5, 0x7D36, 0xD6E6, 0x7D3A, + 0xD6E7, 0x7D45, 0xD6E8, 0x7D2C, 0xD6E9, 0x7D29, 0xD6EA, 0x7D41, 0xD6EB, 0x7D47, 0xD6EC, 0x7D3E, 0xD6ED, 0x7D3F, 0xD6EE, 0x7D4A, + 0xD6EF, 0x7D3B, 0xD6F0, 0x7D28, 0xD6F1, 0x7F63, 0xD6F2, 0x7F95, 0xD6F3, 0x7F9C, 0xD6F4, 0x7F9D, 0xD6F5, 0x7F9B, 0xD6F6, 0x7FCA, + 0xD6F7, 0x7FCB, 0xD6F8, 0x7FCD, 0xD6F9, 0x7FD0, 0xD6FA, 0x7FD1, 0xD6FB, 0x7FC7, 0xD6FC, 0x7FCF, 0xD6FD, 0x7FC9, 0xD6FE, 0x801F, + 0xD740, 0x801E, 0xD741, 0x801B, 0xD742, 0x8047, 0xD743, 0x8043, 0xD744, 0x8048, 0xD745, 0x8118, 0xD746, 0x8125, 0xD747, 0x8119, + 0xD748, 0x811B, 0xD749, 0x812D, 0xD74A, 0x811F, 0xD74B, 0x812C, 0xD74C, 0x811E, 0xD74D, 0x8121, 0xD74E, 0x8115, 0xD74F, 0x8127, + 0xD750, 0x811D, 0xD751, 0x8122, 0xD752, 0x8211, 0xD753, 0x8238, 0xD754, 0x8233, 0xD755, 0x823A, 0xD756, 0x8234, 0xD757, 0x8232, + 0xD758, 0x8274, 0xD759, 0x8390, 0xD75A, 0x83A3, 0xD75B, 0x83A8, 0xD75C, 0x838D, 0xD75D, 0x837A, 0xD75E, 0x8373, 0xD75F, 0x83A4, + 0xD760, 0x8374, 0xD761, 0x838F, 0xD762, 0x8381, 0xD763, 0x8395, 0xD764, 0x8399, 0xD765, 0x8375, 0xD766, 0x8394, 0xD767, 0x83A9, + 0xD768, 0x837D, 0xD769, 0x8383, 0xD76A, 0x838C, 0xD76B, 0x839D, 0xD76C, 0x839B, 0xD76D, 0x83AA, 0xD76E, 0x838B, 0xD76F, 0x837E, + 0xD770, 0x83A5, 0xD771, 0x83AF, 0xD772, 0x8388, 0xD773, 0x8397, 0xD774, 0x83B0, 0xD775, 0x837F, 0xD776, 0x83A6, 0xD777, 0x8387, + 0xD778, 0x83AE, 0xD779, 0x8376, 0xD77A, 0x839A, 0xD77B, 0x8659, 0xD77C, 0x8656, 0xD77D, 0x86BF, 0xD77E, 0x86B7, 0xD7A1, 0x86C2, + 0xD7A2, 0x86C1, 0xD7A3, 0x86C5, 0xD7A4, 0x86BA, 0xD7A5, 0x86B0, 0xD7A6, 0x86C8, 0xD7A7, 0x86B9, 0xD7A8, 0x86B3, 0xD7A9, 0x86B8, + 0xD7AA, 0x86CC, 0xD7AB, 0x86B4, 0xD7AC, 0x86BB, 0xD7AD, 0x86BC, 0xD7AE, 0x86C3, 0xD7AF, 0x86BD, 0xD7B0, 0x86BE, 0xD7B1, 0x8852, + 0xD7B2, 0x8889, 0xD7B3, 0x8895, 0xD7B4, 0x88A8, 0xD7B5, 0x88A2, 0xD7B6, 0x88AA, 0xD7B7, 0x889A, 0xD7B8, 0x8891, 0xD7B9, 0x88A1, + 0xD7BA, 0x889F, 0xD7BB, 0x8898, 0xD7BC, 0x88A7, 0xD7BD, 0x8899, 0xD7BE, 0x889B, 0xD7BF, 0x8897, 0xD7C0, 0x88A4, 0xD7C1, 0x88AC, + 0xD7C2, 0x888C, 0xD7C3, 0x8893, 0xD7C4, 0x888E, 0xD7C5, 0x8982, 0xD7C6, 0x89D6, 0xD7C7, 0x89D9, 0xD7C8, 0x89D5, 0xD7C9, 0x8A30, + 0xD7CA, 0x8A27, 0xD7CB, 0x8A2C, 0xD7CC, 0x8A1E, 0xD7CD, 0x8C39, 0xD7CE, 0x8C3B, 0xD7CF, 0x8C5C, 0xD7D0, 0x8C5D, 0xD7D1, 0x8C7D, + 0xD7D2, 0x8CA5, 0xD7D3, 0x8D7D, 0xD7D4, 0x8D7B, 0xD7D5, 0x8D79, 0xD7D6, 0x8DBC, 0xD7D7, 0x8DC2, 0xD7D8, 0x8DB9, 0xD7D9, 0x8DBF, + 0xD7DA, 0x8DC1, 0xD7DB, 0x8ED8, 0xD7DC, 0x8EDE, 0xD7DD, 0x8EDD, 0xD7DE, 0x8EDC, 0xD7DF, 0x8ED7, 0xD7E0, 0x8EE0, 0xD7E1, 0x8EE1, + 0xD7E2, 0x9024, 0xD7E3, 0x900B, 0xD7E4, 0x9011, 0xD7E5, 0x901C, 0xD7E6, 0x900C, 0xD7E7, 0x9021, 0xD7E8, 0x90EF, 0xD7E9, 0x90EA, + 0xD7EA, 0x90F0, 0xD7EB, 0x90F4, 0xD7EC, 0x90F2, 0xD7ED, 0x90F3, 0xD7EE, 0x90D4, 0xD7EF, 0x90EB, 0xD7F0, 0x90EC, 0xD7F1, 0x90E9, + 0xD7F2, 0x9156, 0xD7F3, 0x9158, 0xD7F4, 0x915A, 0xD7F5, 0x9153, 0xD7F6, 0x9155, 0xD7F7, 0x91EC, 0xD7F8, 0x91F4, 0xD7F9, 0x91F1, + 0xD7FA, 0x91F3, 0xD7FB, 0x91F8, 0xD7FC, 0x91E4, 0xD7FD, 0x91F9, 0xD7FE, 0x91EA, 0xD840, 0x91EB, 0xD841, 0x91F7, 0xD842, 0x91E8, + 0xD843, 0x91EE, 0xD844, 0x957A, 0xD845, 0x9586, 0xD846, 0x9588, 0xD847, 0x967C, 0xD848, 0x966D, 0xD849, 0x966B, 0xD84A, 0x9671, + 0xD84B, 0x966F, 0xD84C, 0x96BF, 0xD84D, 0x976A, 0xD84E, 0x9804, 0xD84F, 0x98E5, 0xD850, 0x9997, 0xD851, 0x509B, 0xD852, 0x5095, + 0xD853, 0x5094, 0xD854, 0x509E, 0xD855, 0x508B, 0xD856, 0x50A3, 0xD857, 0x5083, 0xD858, 0x508C, 0xD859, 0x508E, 0xD85A, 0x509D, + 0xD85B, 0x5068, 0xD85C, 0x509C, 0xD85D, 0x5092, 0xD85E, 0x5082, 0xD85F, 0x5087, 0xD860, 0x515F, 0xD861, 0x51D4, 0xD862, 0x5312, + 0xD863, 0x5311, 0xD864, 0x53A4, 0xD865, 0x53A7, 0xD866, 0x5591, 0xD867, 0x55A8, 0xD868, 0x55A5, 0xD869, 0x55AD, 0xD86A, 0x5577, + 0xD86B, 0x5645, 0xD86C, 0x55A2, 0xD86D, 0x5593, 0xD86E, 0x5588, 0xD86F, 0x558F, 0xD870, 0x55B5, 0xD871, 0x5581, 0xD872, 0x55A3, + 0xD873, 0x5592, 0xD874, 0x55A4, 0xD875, 0x557D, 0xD876, 0x558C, 0xD877, 0x55A6, 0xD878, 0x557F, 0xD879, 0x5595, 0xD87A, 0x55A1, + 0xD87B, 0x558E, 0xD87C, 0x570C, 0xD87D, 0x5829, 0xD87E, 0x5837, 0xD8A1, 0x5819, 0xD8A2, 0x581E, 0xD8A3, 0x5827, 0xD8A4, 0x5823, + 0xD8A5, 0x5828, 0xD8A6, 0x57F5, 0xD8A7, 0x5848, 0xD8A8, 0x5825, 0xD8A9, 0x581C, 0xD8AA, 0x581B, 0xD8AB, 0x5833, 0xD8AC, 0x583F, + 0xD8AD, 0x5836, 0xD8AE, 0x582E, 0xD8AF, 0x5839, 0xD8B0, 0x5838, 0xD8B1, 0x582D, 0xD8B2, 0x582C, 0xD8B3, 0x583B, 0xD8B4, 0x5961, + 0xD8B5, 0x5AAF, 0xD8B6, 0x5A94, 0xD8B7, 0x5A9F, 0xD8B8, 0x5A7A, 0xD8B9, 0x5AA2, 0xD8BA, 0x5A9E, 0xD8BB, 0x5A78, 0xD8BC, 0x5AA6, + 0xD8BD, 0x5A7C, 0xD8BE, 0x5AA5, 0xD8BF, 0x5AAC, 0xD8C0, 0x5A95, 0xD8C1, 0x5AAE, 0xD8C2, 0x5A37, 0xD8C3, 0x5A84, 0xD8C4, 0x5A8A, + 0xD8C5, 0x5A97, 0xD8C6, 0x5A83, 0xD8C7, 0x5A8B, 0xD8C8, 0x5AA9, 0xD8C9, 0x5A7B, 0xD8CA, 0x5A7D, 0xD8CB, 0x5A8C, 0xD8CC, 0x5A9C, + 0xD8CD, 0x5A8F, 0xD8CE, 0x5A93, 0xD8CF, 0x5A9D, 0xD8D0, 0x5BEA, 0xD8D1, 0x5BCD, 0xD8D2, 0x5BCB, 0xD8D3, 0x5BD4, 0xD8D4, 0x5BD1, + 0xD8D5, 0x5BCA, 0xD8D6, 0x5BCE, 0xD8D7, 0x5C0C, 0xD8D8, 0x5C30, 0xD8D9, 0x5D37, 0xD8DA, 0x5D43, 0xD8DB, 0x5D6B, 0xD8DC, 0x5D41, + 0xD8DD, 0x5D4B, 0xD8DE, 0x5D3F, 0xD8DF, 0x5D35, 0xD8E0, 0x5D51, 0xD8E1, 0x5D4E, 0xD8E2, 0x5D55, 0xD8E3, 0x5D33, 0xD8E4, 0x5D3A, + 0xD8E5, 0x5D52, 0xD8E6, 0x5D3D, 0xD8E7, 0x5D31, 0xD8E8, 0x5D59, 0xD8E9, 0x5D42, 0xD8EA, 0x5D39, 0xD8EB, 0x5D49, 0xD8EC, 0x5D38, + 0xD8ED, 0x5D3C, 0xD8EE, 0x5D32, 0xD8EF, 0x5D36, 0xD8F0, 0x5D40, 0xD8F1, 0x5D45, 0xD8F2, 0x5E44, 0xD8F3, 0x5E41, 0xD8F4, 0x5F58, + 0xD8F5, 0x5FA6, 0xD8F6, 0x5FA5, 0xD8F7, 0x5FAB, 0xD8F8, 0x60C9, 0xD8F9, 0x60B9, 0xD8FA, 0x60CC, 0xD8FB, 0x60E2, 0xD8FC, 0x60CE, + 0xD8FD, 0x60C4, 0xD8FE, 0x6114, 0xD940, 0x60F2, 0xD941, 0x610A, 0xD942, 0x6116, 0xD943, 0x6105, 0xD944, 0x60F5, 0xD945, 0x6113, + 0xD946, 0x60F8, 0xD947, 0x60FC, 0xD948, 0x60FE, 0xD949, 0x60C1, 0xD94A, 0x6103, 0xD94B, 0x6118, 0xD94C, 0x611D, 0xD94D, 0x6110, + 0xD94E, 0x60FF, 0xD94F, 0x6104, 0xD950, 0x610B, 0xD951, 0x624A, 0xD952, 0x6394, 0xD953, 0x63B1, 0xD954, 0x63B0, 0xD955, 0x63CE, + 0xD956, 0x63E5, 0xD957, 0x63E8, 0xD958, 0x63EF, 0xD959, 0x63C3, 0xD95A, 0x649D, 0xD95B, 0x63F3, 0xD95C, 0x63CA, 0xD95D, 0x63E0, + 0xD95E, 0x63F6, 0xD95F, 0x63D5, 0xD960, 0x63F2, 0xD961, 0x63F5, 0xD962, 0x6461, 0xD963, 0x63DF, 0xD964, 0x63BE, 0xD965, 0x63DD, + 0xD966, 0x63DC, 0xD967, 0x63C4, 0xD968, 0x63D8, 0xD969, 0x63D3, 0xD96A, 0x63C2, 0xD96B, 0x63C7, 0xD96C, 0x63CC, 0xD96D, 0x63CB, + 0xD96E, 0x63C8, 0xD96F, 0x63F0, 0xD970, 0x63D7, 0xD971, 0x63D9, 0xD972, 0x6532, 0xD973, 0x6567, 0xD974, 0x656A, 0xD975, 0x6564, + 0xD976, 0x655C, 0xD977, 0x6568, 0xD978, 0x6565, 0xD979, 0x658C, 0xD97A, 0x659D, 0xD97B, 0x659E, 0xD97C, 0x65AE, 0xD97D, 0x65D0, + 0xD97E, 0x65D2, 0xD9A1, 0x667C, 0xD9A2, 0x666C, 0xD9A3, 0x667B, 0xD9A4, 0x6680, 0xD9A5, 0x6671, 0xD9A6, 0x6679, 0xD9A7, 0x666A, + 0xD9A8, 0x6672, 0xD9A9, 0x6701, 0xD9AA, 0x690C, 0xD9AB, 0x68D3, 0xD9AC, 0x6904, 0xD9AD, 0x68DC, 0xD9AE, 0x692A, 0xD9AF, 0x68EC, + 0xD9B0, 0x68EA, 0xD9B1, 0x68F1, 0xD9B2, 0x690F, 0xD9B3, 0x68D6, 0xD9B4, 0x68F7, 0xD9B5, 0x68EB, 0xD9B6, 0x68E4, 0xD9B7, 0x68F6, + 0xD9B8, 0x6913, 0xD9B9, 0x6910, 0xD9BA, 0x68F3, 0xD9BB, 0x68E1, 0xD9BC, 0x6907, 0xD9BD, 0x68CC, 0xD9BE, 0x6908, 0xD9BF, 0x6970, + 0xD9C0, 0x68B4, 0xD9C1, 0x6911, 0xD9C2, 0x68EF, 0xD9C3, 0x68C6, 0xD9C4, 0x6914, 0xD9C5, 0x68F8, 0xD9C6, 0x68D0, 0xD9C7, 0x68FD, + 0xD9C8, 0x68FC, 0xD9C9, 0x68E8, 0xD9CA, 0x690B, 0xD9CB, 0x690A, 0xD9CC, 0x6917, 0xD9CD, 0x68CE, 0xD9CE, 0x68C8, 0xD9CF, 0x68DD, + 0xD9D0, 0x68DE, 0xD9D1, 0x68E6, 0xD9D2, 0x68F4, 0xD9D3, 0x68D1, 0xD9D4, 0x6906, 0xD9D5, 0x68D4, 0xD9D6, 0x68E9, 0xD9D7, 0x6915, + 0xD9D8, 0x6925, 0xD9D9, 0x68C7, 0xD9DA, 0x6B39, 0xD9DB, 0x6B3B, 0xD9DC, 0x6B3F, 0xD9DD, 0x6B3C, 0xD9DE, 0x6B94, 0xD9DF, 0x6B97, + 0xD9E0, 0x6B99, 0xD9E1, 0x6B95, 0xD9E2, 0x6BBD, 0xD9E3, 0x6BF0, 0xD9E4, 0x6BF2, 0xD9E5, 0x6BF3, 0xD9E6, 0x6C30, 0xD9E7, 0x6DFC, + 0xD9E8, 0x6E46, 0xD9E9, 0x6E47, 0xD9EA, 0x6E1F, 0xD9EB, 0x6E49, 0xD9EC, 0x6E88, 0xD9ED, 0x6E3C, 0xD9EE, 0x6E3D, 0xD9EF, 0x6E45, + 0xD9F0, 0x6E62, 0xD9F1, 0x6E2B, 0xD9F2, 0x6E3F, 0xD9F3, 0x6E41, 0xD9F4, 0x6E5D, 0xD9F5, 0x6E73, 0xD9F6, 0x6E1C, 0xD9F7, 0x6E33, + 0xD9F8, 0x6E4B, 0xD9F9, 0x6E40, 0xD9FA, 0x6E51, 0xD9FB, 0x6E3B, 0xD9FC, 0x6E03, 0xD9FD, 0x6E2E, 0xD9FE, 0x6E5E, 0xDA40, 0x6E68, + 0xDA41, 0x6E5C, 0xDA42, 0x6E61, 0xDA43, 0x6E31, 0xDA44, 0x6E28, 0xDA45, 0x6E60, 0xDA46, 0x6E71, 0xDA47, 0x6E6B, 0xDA48, 0x6E39, + 0xDA49, 0x6E22, 0xDA4A, 0x6E30, 0xDA4B, 0x6E53, 0xDA4C, 0x6E65, 0xDA4D, 0x6E27, 0xDA4E, 0x6E78, 0xDA4F, 0x6E64, 0xDA50, 0x6E77, + 0xDA51, 0x6E55, 0xDA52, 0x6E79, 0xDA53, 0x6E52, 0xDA54, 0x6E66, 0xDA55, 0x6E35, 0xDA56, 0x6E36, 0xDA57, 0x6E5A, 0xDA58, 0x7120, + 0xDA59, 0x711E, 0xDA5A, 0x712F, 0xDA5B, 0x70FB, 0xDA5C, 0x712E, 0xDA5D, 0x7131, 0xDA5E, 0x7123, 0xDA5F, 0x7125, 0xDA60, 0x7122, + 0xDA61, 0x7132, 0xDA62, 0x711F, 0xDA63, 0x7128, 0xDA64, 0x713A, 0xDA65, 0x711B, 0xDA66, 0x724B, 0xDA67, 0x725A, 0xDA68, 0x7288, + 0xDA69, 0x7289, 0xDA6A, 0x7286, 0xDA6B, 0x7285, 0xDA6C, 0x728B, 0xDA6D, 0x7312, 0xDA6E, 0x730B, 0xDA6F, 0x7330, 0xDA70, 0x7322, + 0xDA71, 0x7331, 0xDA72, 0x7333, 0xDA73, 0x7327, 0xDA74, 0x7332, 0xDA75, 0x732D, 0xDA76, 0x7326, 0xDA77, 0x7323, 0xDA78, 0x7335, + 0xDA79, 0x730C, 0xDA7A, 0x742E, 0xDA7B, 0x742C, 0xDA7C, 0x7430, 0xDA7D, 0x742B, 0xDA7E, 0x7416, 0xDAA1, 0x741A, 0xDAA2, 0x7421, + 0xDAA3, 0x742D, 0xDAA4, 0x7431, 0xDAA5, 0x7424, 0xDAA6, 0x7423, 0xDAA7, 0x741D, 0xDAA8, 0x7429, 0xDAA9, 0x7420, 0xDAAA, 0x7432, + 0xDAAB, 0x74FB, 0xDAAC, 0x752F, 0xDAAD, 0x756F, 0xDAAE, 0x756C, 0xDAAF, 0x75E7, 0xDAB0, 0x75DA, 0xDAB1, 0x75E1, 0xDAB2, 0x75E6, + 0xDAB3, 0x75DD, 0xDAB4, 0x75DF, 0xDAB5, 0x75E4, 0xDAB6, 0x75D7, 0xDAB7, 0x7695, 0xDAB8, 0x7692, 0xDAB9, 0x76DA, 0xDABA, 0x7746, + 0xDABB, 0x7747, 0xDABC, 0x7744, 0xDABD, 0x774D, 0xDABE, 0x7745, 0xDABF, 0x774A, 0xDAC0, 0x774E, 0xDAC1, 0x774B, 0xDAC2, 0x774C, + 0xDAC3, 0x77DE, 0xDAC4, 0x77EC, 0xDAC5, 0x7860, 0xDAC6, 0x7864, 0xDAC7, 0x7865, 0xDAC8, 0x785C, 0xDAC9, 0x786D, 0xDACA, 0x7871, + 0xDACB, 0x786A, 0xDACC, 0x786E, 0xDACD, 0x7870, 0xDACE, 0x7869, 0xDACF, 0x7868, 0xDAD0, 0x785E, 0xDAD1, 0x7862, 0xDAD2, 0x7974, + 0xDAD3, 0x7973, 0xDAD4, 0x7972, 0xDAD5, 0x7970, 0xDAD6, 0x7A02, 0xDAD7, 0x7A0A, 0xDAD8, 0x7A03, 0xDAD9, 0x7A0C, 0xDADA, 0x7A04, + 0xDADB, 0x7A99, 0xDADC, 0x7AE6, 0xDADD, 0x7AE4, 0xDADE, 0x7B4A, 0xDADF, 0x7B3B, 0xDAE0, 0x7B44, 0xDAE1, 0x7B48, 0xDAE2, 0x7B4C, + 0xDAE3, 0x7B4E, 0xDAE4, 0x7B40, 0xDAE5, 0x7B58, 0xDAE6, 0x7B45, 0xDAE7, 0x7CA2, 0xDAE8, 0x7C9E, 0xDAE9, 0x7CA8, 0xDAEA, 0x7CA1, + 0xDAEB, 0x7D58, 0xDAEC, 0x7D6F, 0xDAED, 0x7D63, 0xDAEE, 0x7D53, 0xDAEF, 0x7D56, 0xDAF0, 0x7D67, 0xDAF1, 0x7D6A, 0xDAF2, 0x7D4F, + 0xDAF3, 0x7D6D, 0xDAF4, 0x7D5C, 0xDAF5, 0x7D6B, 0xDAF6, 0x7D52, 0xDAF7, 0x7D54, 0xDAF8, 0x7D69, 0xDAF9, 0x7D51, 0xDAFA, 0x7D5F, + 0xDAFB, 0x7D4E, 0xDAFC, 0x7F3E, 0xDAFD, 0x7F3F, 0xDAFE, 0x7F65, 0xDB40, 0x7F66, 0xDB41, 0x7FA2, 0xDB42, 0x7FA0, 0xDB43, 0x7FA1, + 0xDB44, 0x7FD7, 0xDB45, 0x8051, 0xDB46, 0x804F, 0xDB47, 0x8050, 0xDB48, 0x80FE, 0xDB49, 0x80D4, 0xDB4A, 0x8143, 0xDB4B, 0x814A, + 0xDB4C, 0x8152, 0xDB4D, 0x814F, 0xDB4E, 0x8147, 0xDB4F, 0x813D, 0xDB50, 0x814D, 0xDB51, 0x813A, 0xDB52, 0x81E6, 0xDB53, 0x81EE, + 0xDB54, 0x81F7, 0xDB55, 0x81F8, 0xDB56, 0x81F9, 0xDB57, 0x8204, 0xDB58, 0x823C, 0xDB59, 0x823D, 0xDB5A, 0x823F, 0xDB5B, 0x8275, + 0xDB5C, 0x833B, 0xDB5D, 0x83CF, 0xDB5E, 0x83F9, 0xDB5F, 0x8423, 0xDB60, 0x83C0, 0xDB61, 0x83E8, 0xDB62, 0x8412, 0xDB63, 0x83E7, + 0xDB64, 0x83E4, 0xDB65, 0x83FC, 0xDB66, 0x83F6, 0xDB67, 0x8410, 0xDB68, 0x83C6, 0xDB69, 0x83C8, 0xDB6A, 0x83EB, 0xDB6B, 0x83E3, + 0xDB6C, 0x83BF, 0xDB6D, 0x8401, 0xDB6E, 0x83DD, 0xDB6F, 0x83E5, 0xDB70, 0x83D8, 0xDB71, 0x83FF, 0xDB72, 0x83E1, 0xDB73, 0x83CB, + 0xDB74, 0x83CE, 0xDB75, 0x83D6, 0xDB76, 0x83F5, 0xDB77, 0x83C9, 0xDB78, 0x8409, 0xDB79, 0x840F, 0xDB7A, 0x83DE, 0xDB7B, 0x8411, + 0xDB7C, 0x8406, 0xDB7D, 0x83C2, 0xDB7E, 0x83F3, 0xDBA1, 0x83D5, 0xDBA2, 0x83FA, 0xDBA3, 0x83C7, 0xDBA4, 0x83D1, 0xDBA5, 0x83EA, + 0xDBA6, 0x8413, 0xDBA7, 0x83C3, 0xDBA8, 0x83EC, 0xDBA9, 0x83EE, 0xDBAA, 0x83C4, 0xDBAB, 0x83FB, 0xDBAC, 0x83D7, 0xDBAD, 0x83E2, + 0xDBAE, 0x841B, 0xDBAF, 0x83DB, 0xDBB0, 0x83FE, 0xDBB1, 0x86D8, 0xDBB2, 0x86E2, 0xDBB3, 0x86E6, 0xDBB4, 0x86D3, 0xDBB5, 0x86E3, + 0xDBB6, 0x86DA, 0xDBB7, 0x86EA, 0xDBB8, 0x86DD, 0xDBB9, 0x86EB, 0xDBBA, 0x86DC, 0xDBBB, 0x86EC, 0xDBBC, 0x86E9, 0xDBBD, 0x86D7, + 0xDBBE, 0x86E8, 0xDBBF, 0x86D1, 0xDBC0, 0x8848, 0xDBC1, 0x8856, 0xDBC2, 0x8855, 0xDBC3, 0x88BA, 0xDBC4, 0x88D7, 0xDBC5, 0x88B9, + 0xDBC6, 0x88B8, 0xDBC7, 0x88C0, 0xDBC8, 0x88BE, 0xDBC9, 0x88B6, 0xDBCA, 0x88BC, 0xDBCB, 0x88B7, 0xDBCC, 0x88BD, 0xDBCD, 0x88B2, + 0xDBCE, 0x8901, 0xDBCF, 0x88C9, 0xDBD0, 0x8995, 0xDBD1, 0x8998, 0xDBD2, 0x8997, 0xDBD3, 0x89DD, 0xDBD4, 0x89DA, 0xDBD5, 0x89DB, + 0xDBD6, 0x8A4E, 0xDBD7, 0x8A4D, 0xDBD8, 0x8A39, 0xDBD9, 0x8A59, 0xDBDA, 0x8A40, 0xDBDB, 0x8A57, 0xDBDC, 0x8A58, 0xDBDD, 0x8A44, + 0xDBDE, 0x8A45, 0xDBDF, 0x8A52, 0xDBE0, 0x8A48, 0xDBE1, 0x8A51, 0xDBE2, 0x8A4A, 0xDBE3, 0x8A4C, 0xDBE4, 0x8A4F, 0xDBE5, 0x8C5F, + 0xDBE6, 0x8C81, 0xDBE7, 0x8C80, 0xDBE8, 0x8CBA, 0xDBE9, 0x8CBE, 0xDBEA, 0x8CB0, 0xDBEB, 0x8CB9, 0xDBEC, 0x8CB5, 0xDBED, 0x8D84, + 0xDBEE, 0x8D80, 0xDBEF, 0x8D89, 0xDBF0, 0x8DD8, 0xDBF1, 0x8DD3, 0xDBF2, 0x8DCD, 0xDBF3, 0x8DC7, 0xDBF4, 0x8DD6, 0xDBF5, 0x8DDC, + 0xDBF6, 0x8DCF, 0xDBF7, 0x8DD5, 0xDBF8, 0x8DD9, 0xDBF9, 0x8DC8, 0xDBFA, 0x8DD7, 0xDBFB, 0x8DC5, 0xDBFC, 0x8EEF, 0xDBFD, 0x8EF7, + 0xDBFE, 0x8EFA, 0xDC40, 0x8EF9, 0xDC41, 0x8EE6, 0xDC42, 0x8EEE, 0xDC43, 0x8EE5, 0xDC44, 0x8EF5, 0xDC45, 0x8EE7, 0xDC46, 0x8EE8, + 0xDC47, 0x8EF6, 0xDC48, 0x8EEB, 0xDC49, 0x8EF1, 0xDC4A, 0x8EEC, 0xDC4B, 0x8EF4, 0xDC4C, 0x8EE9, 0xDC4D, 0x902D, 0xDC4E, 0x9034, + 0xDC4F, 0x902F, 0xDC50, 0x9106, 0xDC51, 0x912C, 0xDC52, 0x9104, 0xDC53, 0x90FF, 0xDC54, 0x90FC, 0xDC55, 0x9108, 0xDC56, 0x90F9, + 0xDC57, 0x90FB, 0xDC58, 0x9101, 0xDC59, 0x9100, 0xDC5A, 0x9107, 0xDC5B, 0x9105, 0xDC5C, 0x9103, 0xDC5D, 0x9161, 0xDC5E, 0x9164, + 0xDC5F, 0x915F, 0xDC60, 0x9162, 0xDC61, 0x9160, 0xDC62, 0x9201, 0xDC63, 0x920A, 0xDC64, 0x9225, 0xDC65, 0x9203, 0xDC66, 0x921A, + 0xDC67, 0x9226, 0xDC68, 0x920F, 0xDC69, 0x920C, 0xDC6A, 0x9200, 0xDC6B, 0x9212, 0xDC6C, 0x91FF, 0xDC6D, 0x91FD, 0xDC6E, 0x9206, + 0xDC6F, 0x9204, 0xDC70, 0x9227, 0xDC71, 0x9202, 0xDC72, 0x921C, 0xDC73, 0x9224, 0xDC74, 0x9219, 0xDC75, 0x9217, 0xDC76, 0x9205, + 0xDC77, 0x9216, 0xDC78, 0x957B, 0xDC79, 0x958D, 0xDC7A, 0x958C, 0xDC7B, 0x9590, 0xDC7C, 0x9687, 0xDC7D, 0x967E, 0xDC7E, 0x9688, + 0xDCA1, 0x9689, 0xDCA2, 0x9683, 0xDCA3, 0x9680, 0xDCA4, 0x96C2, 0xDCA5, 0x96C8, 0xDCA6, 0x96C3, 0xDCA7, 0x96F1, 0xDCA8, 0x96F0, + 0xDCA9, 0x976C, 0xDCAA, 0x9770, 0xDCAB, 0x976E, 0xDCAC, 0x9807, 0xDCAD, 0x98A9, 0xDCAE, 0x98EB, 0xDCAF, 0x9CE6, 0xDCB0, 0x9EF9, + 0xDCB1, 0x4E83, 0xDCB2, 0x4E84, 0xDCB3, 0x4EB6, 0xDCB4, 0x50BD, 0xDCB5, 0x50BF, 0xDCB6, 0x50C6, 0xDCB7, 0x50AE, 0xDCB8, 0x50C4, + 0xDCB9, 0x50CA, 0xDCBA, 0x50B4, 0xDCBB, 0x50C8, 0xDCBC, 0x50C2, 0xDCBD, 0x50B0, 0xDCBE, 0x50C1, 0xDCBF, 0x50BA, 0xDCC0, 0x50B1, + 0xDCC1, 0x50CB, 0xDCC2, 0x50C9, 0xDCC3, 0x50B6, 0xDCC4, 0x50B8, 0xDCC5, 0x51D7, 0xDCC6, 0x527A, 0xDCC7, 0x5278, 0xDCC8, 0x527B, + 0xDCC9, 0x527C, 0xDCCA, 0x55C3, 0xDCCB, 0x55DB, 0xDCCC, 0x55CC, 0xDCCD, 0x55D0, 0xDCCE, 0x55CB, 0xDCCF, 0x55CA, 0xDCD0, 0x55DD, + 0xDCD1, 0x55C0, 0xDCD2, 0x55D4, 0xDCD3, 0x55C4, 0xDCD4, 0x55E9, 0xDCD5, 0x55BF, 0xDCD6, 0x55D2, 0xDCD7, 0x558D, 0xDCD8, 0x55CF, + 0xDCD9, 0x55D5, 0xDCDA, 0x55E2, 0xDCDB, 0x55D6, 0xDCDC, 0x55C8, 0xDCDD, 0x55F2, 0xDCDE, 0x55CD, 0xDCDF, 0x55D9, 0xDCE0, 0x55C2, + 0xDCE1, 0x5714, 0xDCE2, 0x5853, 0xDCE3, 0x5868, 0xDCE4, 0x5864, 0xDCE5, 0x584F, 0xDCE6, 0x584D, 0xDCE7, 0x5849, 0xDCE8, 0x586F, + 0xDCE9, 0x5855, 0xDCEA, 0x584E, 0xDCEB, 0x585D, 0xDCEC, 0x5859, 0xDCED, 0x5865, 0xDCEE, 0x585B, 0xDCEF, 0x583D, 0xDCF0, 0x5863, + 0xDCF1, 0x5871, 0xDCF2, 0x58FC, 0xDCF3, 0x5AC7, 0xDCF4, 0x5AC4, 0xDCF5, 0x5ACB, 0xDCF6, 0x5ABA, 0xDCF7, 0x5AB8, 0xDCF8, 0x5AB1, + 0xDCF9, 0x5AB5, 0xDCFA, 0x5AB0, 0xDCFB, 0x5ABF, 0xDCFC, 0x5AC8, 0xDCFD, 0x5ABB, 0xDCFE, 0x5AC6, 0xDD40, 0x5AB7, 0xDD41, 0x5AC0, + 0xDD42, 0x5ACA, 0xDD43, 0x5AB4, 0xDD44, 0x5AB6, 0xDD45, 0x5ACD, 0xDD46, 0x5AB9, 0xDD47, 0x5A90, 0xDD48, 0x5BD6, 0xDD49, 0x5BD8, + 0xDD4A, 0x5BD9, 0xDD4B, 0x5C1F, 0xDD4C, 0x5C33, 0xDD4D, 0x5D71, 0xDD4E, 0x5D63, 0xDD4F, 0x5D4A, 0xDD50, 0x5D65, 0xDD51, 0x5D72, + 0xDD52, 0x5D6C, 0xDD53, 0x5D5E, 0xDD54, 0x5D68, 0xDD55, 0x5D67, 0xDD56, 0x5D62, 0xDD57, 0x5DF0, 0xDD58, 0x5E4F, 0xDD59, 0x5E4E, + 0xDD5A, 0x5E4A, 0xDD5B, 0x5E4D, 0xDD5C, 0x5E4B, 0xDD5D, 0x5EC5, 0xDD5E, 0x5ECC, 0xDD5F, 0x5EC6, 0xDD60, 0x5ECB, 0xDD61, 0x5EC7, + 0xDD62, 0x5F40, 0xDD63, 0x5FAF, 0xDD64, 0x5FAD, 0xDD65, 0x60F7, 0xDD66, 0x6149, 0xDD67, 0x614A, 0xDD68, 0x612B, 0xDD69, 0x6145, + 0xDD6A, 0x6136, 0xDD6B, 0x6132, 0xDD6C, 0x612E, 0xDD6D, 0x6146, 0xDD6E, 0x612F, 0xDD6F, 0x614F, 0xDD70, 0x6129, 0xDD71, 0x6140, + 0xDD72, 0x6220, 0xDD73, 0x9168, 0xDD74, 0x6223, 0xDD75, 0x6225, 0xDD76, 0x6224, 0xDD77, 0x63C5, 0xDD78, 0x63F1, 0xDD79, 0x63EB, + 0xDD7A, 0x6410, 0xDD7B, 0x6412, 0xDD7C, 0x6409, 0xDD7D, 0x6420, 0xDD7E, 0x6424, 0xDDA1, 0x6433, 0xDDA2, 0x6443, 0xDDA3, 0x641F, + 0xDDA4, 0x6415, 0xDDA5, 0x6418, 0xDDA6, 0x6439, 0xDDA7, 0x6437, 0xDDA8, 0x6422, 0xDDA9, 0x6423, 0xDDAA, 0x640C, 0xDDAB, 0x6426, + 0xDDAC, 0x6430, 0xDDAD, 0x6428, 0xDDAE, 0x6441, 0xDDAF, 0x6435, 0xDDB0, 0x642F, 0xDDB1, 0x640A, 0xDDB2, 0x641A, 0xDDB3, 0x6440, + 0xDDB4, 0x6425, 0xDDB5, 0x6427, 0xDDB6, 0x640B, 0xDDB7, 0x63E7, 0xDDB8, 0x641B, 0xDDB9, 0x642E, 0xDDBA, 0x6421, 0xDDBB, 0x640E, + 0xDDBC, 0x656F, 0xDDBD, 0x6592, 0xDDBE, 0x65D3, 0xDDBF, 0x6686, 0xDDC0, 0x668C, 0xDDC1, 0x6695, 0xDDC2, 0x6690, 0xDDC3, 0x668B, + 0xDDC4, 0x668A, 0xDDC5, 0x6699, 0xDDC6, 0x6694, 0xDDC7, 0x6678, 0xDDC8, 0x6720, 0xDDC9, 0x6966, 0xDDCA, 0x695F, 0xDDCB, 0x6938, + 0xDDCC, 0x694E, 0xDDCD, 0x6962, 0xDDCE, 0x6971, 0xDDCF, 0x693F, 0xDDD0, 0x6945, 0xDDD1, 0x696A, 0xDDD2, 0x6939, 0xDDD3, 0x6942, + 0xDDD4, 0x6957, 0xDDD5, 0x6959, 0xDDD6, 0x697A, 0xDDD7, 0x6948, 0xDDD8, 0x6949, 0xDDD9, 0x6935, 0xDDDA, 0x696C, 0xDDDB, 0x6933, + 0xDDDC, 0x693D, 0xDDDD, 0x6965, 0xDDDE, 0x68F0, 0xDDDF, 0x6978, 0xDDE0, 0x6934, 0xDDE1, 0x6969, 0xDDE2, 0x6940, 0xDDE3, 0x696F, + 0xDDE4, 0x6944, 0xDDE5, 0x6976, 0xDDE6, 0x6958, 0xDDE7, 0x6941, 0xDDE8, 0x6974, 0xDDE9, 0x694C, 0xDDEA, 0x693B, 0xDDEB, 0x694B, + 0xDDEC, 0x6937, 0xDDED, 0x695C, 0xDDEE, 0x694F, 0xDDEF, 0x6951, 0xDDF0, 0x6932, 0xDDF1, 0x6952, 0xDDF2, 0x692F, 0xDDF3, 0x697B, + 0xDDF4, 0x693C, 0xDDF5, 0x6B46, 0xDDF6, 0x6B45, 0xDDF7, 0x6B43, 0xDDF8, 0x6B42, 0xDDF9, 0x6B48, 0xDDFA, 0x6B41, 0xDDFB, 0x6B9B, + 0xDDFC, 0xFA0D, 0xDDFD, 0x6BFB, 0xDDFE, 0x6BFC, 0xDE40, 0x6BF9, 0xDE41, 0x6BF7, 0xDE42, 0x6BF8, 0xDE43, 0x6E9B, 0xDE44, 0x6ED6, + 0xDE45, 0x6EC8, 0xDE46, 0x6E8F, 0xDE47, 0x6EC0, 0xDE48, 0x6E9F, 0xDE49, 0x6E93, 0xDE4A, 0x6E94, 0xDE4B, 0x6EA0, 0xDE4C, 0x6EB1, + 0xDE4D, 0x6EB9, 0xDE4E, 0x6EC6, 0xDE4F, 0x6ED2, 0xDE50, 0x6EBD, 0xDE51, 0x6EC1, 0xDE52, 0x6E9E, 0xDE53, 0x6EC9, 0xDE54, 0x6EB7, + 0xDE55, 0x6EB0, 0xDE56, 0x6ECD, 0xDE57, 0x6EA6, 0xDE58, 0x6ECF, 0xDE59, 0x6EB2, 0xDE5A, 0x6EBE, 0xDE5B, 0x6EC3, 0xDE5C, 0x6EDC, + 0xDE5D, 0x6ED8, 0xDE5E, 0x6E99, 0xDE5F, 0x6E92, 0xDE60, 0x6E8E, 0xDE61, 0x6E8D, 0xDE62, 0x6EA4, 0xDE63, 0x6EA1, 0xDE64, 0x6EBF, + 0xDE65, 0x6EB3, 0xDE66, 0x6ED0, 0xDE67, 0x6ECA, 0xDE68, 0x6E97, 0xDE69, 0x6EAE, 0xDE6A, 0x6EA3, 0xDE6B, 0x7147, 0xDE6C, 0x7154, + 0xDE6D, 0x7152, 0xDE6E, 0x7163, 0xDE6F, 0x7160, 0xDE70, 0x7141, 0xDE71, 0x715D, 0xDE72, 0x7162, 0xDE73, 0x7172, 0xDE74, 0x7178, + 0xDE75, 0x716A, 0xDE76, 0x7161, 0xDE77, 0x7142, 0xDE78, 0x7158, 0xDE79, 0x7143, 0xDE7A, 0x714B, 0xDE7B, 0x7170, 0xDE7C, 0x715F, + 0xDE7D, 0x7150, 0xDE7E, 0x7153, 0xDEA1, 0x7144, 0xDEA2, 0x714D, 0xDEA3, 0x715A, 0xDEA4, 0x724F, 0xDEA5, 0x728D, 0xDEA6, 0x728C, + 0xDEA7, 0x7291, 0xDEA8, 0x7290, 0xDEA9, 0x728E, 0xDEAA, 0x733C, 0xDEAB, 0x7342, 0xDEAC, 0x733B, 0xDEAD, 0x733A, 0xDEAE, 0x7340, + 0xDEAF, 0x734A, 0xDEB0, 0x7349, 0xDEB1, 0x7444, 0xDEB2, 0x744A, 0xDEB3, 0x744B, 0xDEB4, 0x7452, 0xDEB5, 0x7451, 0xDEB6, 0x7457, + 0xDEB7, 0x7440, 0xDEB8, 0x744F, 0xDEB9, 0x7450, 0xDEBA, 0x744E, 0xDEBB, 0x7442, 0xDEBC, 0x7446, 0xDEBD, 0x744D, 0xDEBE, 0x7454, + 0xDEBF, 0x74E1, 0xDEC0, 0x74FF, 0xDEC1, 0x74FE, 0xDEC2, 0x74FD, 0xDEC3, 0x751D, 0xDEC4, 0x7579, 0xDEC5, 0x7577, 0xDEC6, 0x6983, + 0xDEC7, 0x75EF, 0xDEC8, 0x760F, 0xDEC9, 0x7603, 0xDECA, 0x75F7, 0xDECB, 0x75FE, 0xDECC, 0x75FC, 0xDECD, 0x75F9, 0xDECE, 0x75F8, + 0xDECF, 0x7610, 0xDED0, 0x75FB, 0xDED1, 0x75F6, 0xDED2, 0x75ED, 0xDED3, 0x75F5, 0xDED4, 0x75FD, 0xDED5, 0x7699, 0xDED6, 0x76B5, + 0xDED7, 0x76DD, 0xDED8, 0x7755, 0xDED9, 0x775F, 0xDEDA, 0x7760, 0xDEDB, 0x7752, 0xDEDC, 0x7756, 0xDEDD, 0x775A, 0xDEDE, 0x7769, + 0xDEDF, 0x7767, 0xDEE0, 0x7754, 0xDEE1, 0x7759, 0xDEE2, 0x776D, 0xDEE3, 0x77E0, 0xDEE4, 0x7887, 0xDEE5, 0x789A, 0xDEE6, 0x7894, + 0xDEE7, 0x788F, 0xDEE8, 0x7884, 0xDEE9, 0x7895, 0xDEEA, 0x7885, 0xDEEB, 0x7886, 0xDEEC, 0x78A1, 0xDEED, 0x7883, 0xDEEE, 0x7879, + 0xDEEF, 0x7899, 0xDEF0, 0x7880, 0xDEF1, 0x7896, 0xDEF2, 0x787B, 0xDEF3, 0x797C, 0xDEF4, 0x7982, 0xDEF5, 0x797D, 0xDEF6, 0x7979, + 0xDEF7, 0x7A11, 0xDEF8, 0x7A18, 0xDEF9, 0x7A19, 0xDEFA, 0x7A12, 0xDEFB, 0x7A17, 0xDEFC, 0x7A15, 0xDEFD, 0x7A22, 0xDEFE, 0x7A13, + 0xDF40, 0x7A1B, 0xDF41, 0x7A10, 0xDF42, 0x7AA3, 0xDF43, 0x7AA2, 0xDF44, 0x7A9E, 0xDF45, 0x7AEB, 0xDF46, 0x7B66, 0xDF47, 0x7B64, + 0xDF48, 0x7B6D, 0xDF49, 0x7B74, 0xDF4A, 0x7B69, 0xDF4B, 0x7B72, 0xDF4C, 0x7B65, 0xDF4D, 0x7B73, 0xDF4E, 0x7B71, 0xDF4F, 0x7B70, + 0xDF50, 0x7B61, 0xDF51, 0x7B78, 0xDF52, 0x7B76, 0xDF53, 0x7B63, 0xDF54, 0x7CB2, 0xDF55, 0x7CB4, 0xDF56, 0x7CAF, 0xDF57, 0x7D88, + 0xDF58, 0x7D86, 0xDF59, 0x7D80, 0xDF5A, 0x7D8D, 0xDF5B, 0x7D7F, 0xDF5C, 0x7D85, 0xDF5D, 0x7D7A, 0xDF5E, 0x7D8E, 0xDF5F, 0x7D7B, + 0xDF60, 0x7D83, 0xDF61, 0x7D7C, 0xDF62, 0x7D8C, 0xDF63, 0x7D94, 0xDF64, 0x7D84, 0xDF65, 0x7D7D, 0xDF66, 0x7D92, 0xDF67, 0x7F6D, + 0xDF68, 0x7F6B, 0xDF69, 0x7F67, 0xDF6A, 0x7F68, 0xDF6B, 0x7F6C, 0xDF6C, 0x7FA6, 0xDF6D, 0x7FA5, 0xDF6E, 0x7FA7, 0xDF6F, 0x7FDB, + 0xDF70, 0x7FDC, 0xDF71, 0x8021, 0xDF72, 0x8164, 0xDF73, 0x8160, 0xDF74, 0x8177, 0xDF75, 0x815C, 0xDF76, 0x8169, 0xDF77, 0x815B, + 0xDF78, 0x8162, 0xDF79, 0x8172, 0xDF7A, 0x6721, 0xDF7B, 0x815E, 0xDF7C, 0x8176, 0xDF7D, 0x8167, 0xDF7E, 0x816F, 0xDFA1, 0x8144, + 0xDFA2, 0x8161, 0xDFA3, 0x821D, 0xDFA4, 0x8249, 0xDFA5, 0x8244, 0xDFA6, 0x8240, 0xDFA7, 0x8242, 0xDFA8, 0x8245, 0xDFA9, 0x84F1, + 0xDFAA, 0x843F, 0xDFAB, 0x8456, 0xDFAC, 0x8476, 0xDFAD, 0x8479, 0xDFAE, 0x848F, 0xDFAF, 0x848D, 0xDFB0, 0x8465, 0xDFB1, 0x8451, + 0xDFB2, 0x8440, 0xDFB3, 0x8486, 0xDFB4, 0x8467, 0xDFB5, 0x8430, 0xDFB6, 0x844D, 0xDFB7, 0x847D, 0xDFB8, 0x845A, 0xDFB9, 0x8459, + 0xDFBA, 0x8474, 0xDFBB, 0x8473, 0xDFBC, 0x845D, 0xDFBD, 0x8507, 0xDFBE, 0x845E, 0xDFBF, 0x8437, 0xDFC0, 0x843A, 0xDFC1, 0x8434, + 0xDFC2, 0x847A, 0xDFC3, 0x8443, 0xDFC4, 0x8478, 0xDFC5, 0x8432, 0xDFC6, 0x8445, 0xDFC7, 0x8429, 0xDFC8, 0x83D9, 0xDFC9, 0x844B, + 0xDFCA, 0x842F, 0xDFCB, 0x8442, 0xDFCC, 0x842D, 0xDFCD, 0x845F, 0xDFCE, 0x8470, 0xDFCF, 0x8439, 0xDFD0, 0x844E, 0xDFD1, 0x844C, + 0xDFD2, 0x8452, 0xDFD3, 0x846F, 0xDFD4, 0x84C5, 0xDFD5, 0x848E, 0xDFD6, 0x843B, 0xDFD7, 0x8447, 0xDFD8, 0x8436, 0xDFD9, 0x8433, + 0xDFDA, 0x8468, 0xDFDB, 0x847E, 0xDFDC, 0x8444, 0xDFDD, 0x842B, 0xDFDE, 0x8460, 0xDFDF, 0x8454, 0xDFE0, 0x846E, 0xDFE1, 0x8450, + 0xDFE2, 0x870B, 0xDFE3, 0x8704, 0xDFE4, 0x86F7, 0xDFE5, 0x870C, 0xDFE6, 0x86FA, 0xDFE7, 0x86D6, 0xDFE8, 0x86F5, 0xDFE9, 0x874D, + 0xDFEA, 0x86F8, 0xDFEB, 0x870E, 0xDFEC, 0x8709, 0xDFED, 0x8701, 0xDFEE, 0x86F6, 0xDFEF, 0x870D, 0xDFF0, 0x8705, 0xDFF1, 0x88D6, + 0xDFF2, 0x88CB, 0xDFF3, 0x88CD, 0xDFF4, 0x88CE, 0xDFF5, 0x88DE, 0xDFF6, 0x88DB, 0xDFF7, 0x88DA, 0xDFF8, 0x88CC, 0xDFF9, 0x88D0, + 0xDFFA, 0x8985, 0xDFFB, 0x899B, 0xDFFC, 0x89DF, 0xDFFD, 0x89E5, 0xDFFE, 0x89E4, 0xE040, 0x89E1, 0xE041, 0x89E0, 0xE042, 0x89E2, + 0xE043, 0x89DC, 0xE044, 0x89E6, 0xE045, 0x8A76, 0xE046, 0x8A86, 0xE047, 0x8A7F, 0xE048, 0x8A61, 0xE049, 0x8A3F, 0xE04A, 0x8A77, + 0xE04B, 0x8A82, 0xE04C, 0x8A84, 0xE04D, 0x8A75, 0xE04E, 0x8A83, 0xE04F, 0x8A81, 0xE050, 0x8A74, 0xE051, 0x8A7A, 0xE052, 0x8C3C, + 0xE053, 0x8C4B, 0xE054, 0x8C4A, 0xE055, 0x8C65, 0xE056, 0x8C64, 0xE057, 0x8C66, 0xE058, 0x8C86, 0xE059, 0x8C84, 0xE05A, 0x8C85, + 0xE05B, 0x8CCC, 0xE05C, 0x8D68, 0xE05D, 0x8D69, 0xE05E, 0x8D91, 0xE05F, 0x8D8C, 0xE060, 0x8D8E, 0xE061, 0x8D8F, 0xE062, 0x8D8D, + 0xE063, 0x8D93, 0xE064, 0x8D94, 0xE065, 0x8D90, 0xE066, 0x8D92, 0xE067, 0x8DF0, 0xE068, 0x8DE0, 0xE069, 0x8DEC, 0xE06A, 0x8DF1, + 0xE06B, 0x8DEE, 0xE06C, 0x8DD0, 0xE06D, 0x8DE9, 0xE06E, 0x8DE3, 0xE06F, 0x8DE2, 0xE070, 0x8DE7, 0xE071, 0x8DF2, 0xE072, 0x8DEB, + 0xE073, 0x8DF4, 0xE074, 0x8F06, 0xE075, 0x8EFF, 0xE076, 0x8F01, 0xE077, 0x8F00, 0xE078, 0x8F05, 0xE079, 0x8F07, 0xE07A, 0x8F08, + 0xE07B, 0x8F02, 0xE07C, 0x8F0B, 0xE07D, 0x9052, 0xE07E, 0x903F, 0xE0A1, 0x9044, 0xE0A2, 0x9049, 0xE0A3, 0x903D, 0xE0A4, 0x9110, + 0xE0A5, 0x910D, 0xE0A6, 0x910F, 0xE0A7, 0x9111, 0xE0A8, 0x9116, 0xE0A9, 0x9114, 0xE0AA, 0x910B, 0xE0AB, 0x910E, 0xE0AC, 0x916E, + 0xE0AD, 0x916F, 0xE0AE, 0x9248, 0xE0AF, 0x9252, 0xE0B0, 0x9230, 0xE0B1, 0x923A, 0xE0B2, 0x9266, 0xE0B3, 0x9233, 0xE0B4, 0x9265, + 0xE0B5, 0x925E, 0xE0B6, 0x9283, 0xE0B7, 0x922E, 0xE0B8, 0x924A, 0xE0B9, 0x9246, 0xE0BA, 0x926D, 0xE0BB, 0x926C, 0xE0BC, 0x924F, + 0xE0BD, 0x9260, 0xE0BE, 0x9267, 0xE0BF, 0x926F, 0xE0C0, 0x9236, 0xE0C1, 0x9261, 0xE0C2, 0x9270, 0xE0C3, 0x9231, 0xE0C4, 0x9254, + 0xE0C5, 0x9263, 0xE0C6, 0x9250, 0xE0C7, 0x9272, 0xE0C8, 0x924E, 0xE0C9, 0x9253, 0xE0CA, 0x924C, 0xE0CB, 0x9256, 0xE0CC, 0x9232, + 0xE0CD, 0x959F, 0xE0CE, 0x959C, 0xE0CF, 0x959E, 0xE0D0, 0x959B, 0xE0D1, 0x9692, 0xE0D2, 0x9693, 0xE0D3, 0x9691, 0xE0D4, 0x9697, + 0xE0D5, 0x96CE, 0xE0D6, 0x96FA, 0xE0D7, 0x96FD, 0xE0D8, 0x96F8, 0xE0D9, 0x96F5, 0xE0DA, 0x9773, 0xE0DB, 0x9777, 0xE0DC, 0x9778, + 0xE0DD, 0x9772, 0xE0DE, 0x980F, 0xE0DF, 0x980D, 0xE0E0, 0x980E, 0xE0E1, 0x98AC, 0xE0E2, 0x98F6, 0xE0E3, 0x98F9, 0xE0E4, 0x99AF, + 0xE0E5, 0x99B2, 0xE0E6, 0x99B0, 0xE0E7, 0x99B5, 0xE0E8, 0x9AAD, 0xE0E9, 0x9AAB, 0xE0EA, 0x9B5B, 0xE0EB, 0x9CEA, 0xE0EC, 0x9CED, + 0xE0ED, 0x9CE7, 0xE0EE, 0x9E80, 0xE0EF, 0x9EFD, 0xE0F0, 0x50E6, 0xE0F1, 0x50D4, 0xE0F2, 0x50D7, 0xE0F3, 0x50E8, 0xE0F4, 0x50F3, + 0xE0F5, 0x50DB, 0xE0F6, 0x50EA, 0xE0F7, 0x50DD, 0xE0F8, 0x50E4, 0xE0F9, 0x50D3, 0xE0FA, 0x50EC, 0xE0FB, 0x50F0, 0xE0FC, 0x50EF, + 0xE0FD, 0x50E3, 0xE0FE, 0x50E0, 0xE140, 0x51D8, 0xE141, 0x5280, 0xE142, 0x5281, 0xE143, 0x52E9, 0xE144, 0x52EB, 0xE145, 0x5330, + 0xE146, 0x53AC, 0xE147, 0x5627, 0xE148, 0x5615, 0xE149, 0x560C, 0xE14A, 0x5612, 0xE14B, 0x55FC, 0xE14C, 0x560F, 0xE14D, 0x561C, + 0xE14E, 0x5601, 0xE14F, 0x5613, 0xE150, 0x5602, 0xE151, 0x55FA, 0xE152, 0x561D, 0xE153, 0x5604, 0xE154, 0x55FF, 0xE155, 0x55F9, + 0xE156, 0x5889, 0xE157, 0x587C, 0xE158, 0x5890, 0xE159, 0x5898, 0xE15A, 0x5886, 0xE15B, 0x5881, 0xE15C, 0x587F, 0xE15D, 0x5874, + 0xE15E, 0x588B, 0xE15F, 0x587A, 0xE160, 0x5887, 0xE161, 0x5891, 0xE162, 0x588E, 0xE163, 0x5876, 0xE164, 0x5882, 0xE165, 0x5888, + 0xE166, 0x587B, 0xE167, 0x5894, 0xE168, 0x588F, 0xE169, 0x58FE, 0xE16A, 0x596B, 0xE16B, 0x5ADC, 0xE16C, 0x5AEE, 0xE16D, 0x5AE5, + 0xE16E, 0x5AD5, 0xE16F, 0x5AEA, 0xE170, 0x5ADA, 0xE171, 0x5AED, 0xE172, 0x5AEB, 0xE173, 0x5AF3, 0xE174, 0x5AE2, 0xE175, 0x5AE0, + 0xE176, 0x5ADB, 0xE177, 0x5AEC, 0xE178, 0x5ADE, 0xE179, 0x5ADD, 0xE17A, 0x5AD9, 0xE17B, 0x5AE8, 0xE17C, 0x5ADF, 0xE17D, 0x5B77, + 0xE17E, 0x5BE0, 0xE1A1, 0x5BE3, 0xE1A2, 0x5C63, 0xE1A3, 0x5D82, 0xE1A4, 0x5D80, 0xE1A5, 0x5D7D, 0xE1A6, 0x5D86, 0xE1A7, 0x5D7A, + 0xE1A8, 0x5D81, 0xE1A9, 0x5D77, 0xE1AA, 0x5D8A, 0xE1AB, 0x5D89, 0xE1AC, 0x5D88, 0xE1AD, 0x5D7E, 0xE1AE, 0x5D7C, 0xE1AF, 0x5D8D, + 0xE1B0, 0x5D79, 0xE1B1, 0x5D7F, 0xE1B2, 0x5E58, 0xE1B3, 0x5E59, 0xE1B4, 0x5E53, 0xE1B5, 0x5ED8, 0xE1B6, 0x5ED1, 0xE1B7, 0x5ED7, + 0xE1B8, 0x5ECE, 0xE1B9, 0x5EDC, 0xE1BA, 0x5ED5, 0xE1BB, 0x5ED9, 0xE1BC, 0x5ED2, 0xE1BD, 0x5ED4, 0xE1BE, 0x5F44, 0xE1BF, 0x5F43, + 0xE1C0, 0x5F6F, 0xE1C1, 0x5FB6, 0xE1C2, 0x612C, 0xE1C3, 0x6128, 0xE1C4, 0x6141, 0xE1C5, 0x615E, 0xE1C6, 0x6171, 0xE1C7, 0x6173, + 0xE1C8, 0x6152, 0xE1C9, 0x6153, 0xE1CA, 0x6172, 0xE1CB, 0x616C, 0xE1CC, 0x6180, 0xE1CD, 0x6174, 0xE1CE, 0x6154, 0xE1CF, 0x617A, + 0xE1D0, 0x615B, 0xE1D1, 0x6165, 0xE1D2, 0x613B, 0xE1D3, 0x616A, 0xE1D4, 0x6161, 0xE1D5, 0x6156, 0xE1D6, 0x6229, 0xE1D7, 0x6227, + 0xE1D8, 0x622B, 0xE1D9, 0x642B, 0xE1DA, 0x644D, 0xE1DB, 0x645B, 0xE1DC, 0x645D, 0xE1DD, 0x6474, 0xE1DE, 0x6476, 0xE1DF, 0x6472, + 0xE1E0, 0x6473, 0xE1E1, 0x647D, 0xE1E2, 0x6475, 0xE1E3, 0x6466, 0xE1E4, 0x64A6, 0xE1E5, 0x644E, 0xE1E6, 0x6482, 0xE1E7, 0x645E, + 0xE1E8, 0x645C, 0xE1E9, 0x644B, 0xE1EA, 0x6453, 0xE1EB, 0x6460, 0xE1EC, 0x6450, 0xE1ED, 0x647F, 0xE1EE, 0x643F, 0xE1EF, 0x646C, + 0xE1F0, 0x646B, 0xE1F1, 0x6459, 0xE1F2, 0x6465, 0xE1F3, 0x6477, 0xE1F4, 0x6573, 0xE1F5, 0x65A0, 0xE1F6, 0x66A1, 0xE1F7, 0x66A0, + 0xE1F8, 0x669F, 0xE1F9, 0x6705, 0xE1FA, 0x6704, 0xE1FB, 0x6722, 0xE1FC, 0x69B1, 0xE1FD, 0x69B6, 0xE1FE, 0x69C9, 0xE240, 0x69A0, + 0xE241, 0x69CE, 0xE242, 0x6996, 0xE243, 0x69B0, 0xE244, 0x69AC, 0xE245, 0x69BC, 0xE246, 0x6991, 0xE247, 0x6999, 0xE248, 0x698E, + 0xE249, 0x69A7, 0xE24A, 0x698D, 0xE24B, 0x69A9, 0xE24C, 0x69BE, 0xE24D, 0x69AF, 0xE24E, 0x69BF, 0xE24F, 0x69C4, 0xE250, 0x69BD, + 0xE251, 0x69A4, 0xE252, 0x69D4, 0xE253, 0x69B9, 0xE254, 0x69CA, 0xE255, 0x699A, 0xE256, 0x69CF, 0xE257, 0x69B3, 0xE258, 0x6993, + 0xE259, 0x69AA, 0xE25A, 0x69A1, 0xE25B, 0x699E, 0xE25C, 0x69D9, 0xE25D, 0x6997, 0xE25E, 0x6990, 0xE25F, 0x69C2, 0xE260, 0x69B5, + 0xE261, 0x69A5, 0xE262, 0x69C6, 0xE263, 0x6B4A, 0xE264, 0x6B4D, 0xE265, 0x6B4B, 0xE266, 0x6B9E, 0xE267, 0x6B9F, 0xE268, 0x6BA0, + 0xE269, 0x6BC3, 0xE26A, 0x6BC4, 0xE26B, 0x6BFE, 0xE26C, 0x6ECE, 0xE26D, 0x6EF5, 0xE26E, 0x6EF1, 0xE26F, 0x6F03, 0xE270, 0x6F25, + 0xE271, 0x6EF8, 0xE272, 0x6F37, 0xE273, 0x6EFB, 0xE274, 0x6F2E, 0xE275, 0x6F09, 0xE276, 0x6F4E, 0xE277, 0x6F19, 0xE278, 0x6F1A, + 0xE279, 0x6F27, 0xE27A, 0x6F18, 0xE27B, 0x6F3B, 0xE27C, 0x6F12, 0xE27D, 0x6EED, 0xE27E, 0x6F0A, 0xE2A1, 0x6F36, 0xE2A2, 0x6F73, + 0xE2A3, 0x6EF9, 0xE2A4, 0x6EEE, 0xE2A5, 0x6F2D, 0xE2A6, 0x6F40, 0xE2A7, 0x6F30, 0xE2A8, 0x6F3C, 0xE2A9, 0x6F35, 0xE2AA, 0x6EEB, + 0xE2AB, 0x6F07, 0xE2AC, 0x6F0E, 0xE2AD, 0x6F43, 0xE2AE, 0x6F05, 0xE2AF, 0x6EFD, 0xE2B0, 0x6EF6, 0xE2B1, 0x6F39, 0xE2B2, 0x6F1C, + 0xE2B3, 0x6EFC, 0xE2B4, 0x6F3A, 0xE2B5, 0x6F1F, 0xE2B6, 0x6F0D, 0xE2B7, 0x6F1E, 0xE2B8, 0x6F08, 0xE2B9, 0x6F21, 0xE2BA, 0x7187, + 0xE2BB, 0x7190, 0xE2BC, 0x7189, 0xE2BD, 0x7180, 0xE2BE, 0x7185, 0xE2BF, 0x7182, 0xE2C0, 0x718F, 0xE2C1, 0x717B, 0xE2C2, 0x7186, + 0xE2C3, 0x7181, 0xE2C4, 0x7197, 0xE2C5, 0x7244, 0xE2C6, 0x7253, 0xE2C7, 0x7297, 0xE2C8, 0x7295, 0xE2C9, 0x7293, 0xE2CA, 0x7343, + 0xE2CB, 0x734D, 0xE2CC, 0x7351, 0xE2CD, 0x734C, 0xE2CE, 0x7462, 0xE2CF, 0x7473, 0xE2D0, 0x7471, 0xE2D1, 0x7475, 0xE2D2, 0x7472, + 0xE2D3, 0x7467, 0xE2D4, 0x746E, 0xE2D5, 0x7500, 0xE2D6, 0x7502, 0xE2D7, 0x7503, 0xE2D8, 0x757D, 0xE2D9, 0x7590, 0xE2DA, 0x7616, + 0xE2DB, 0x7608, 0xE2DC, 0x760C, 0xE2DD, 0x7615, 0xE2DE, 0x7611, 0xE2DF, 0x760A, 0xE2E0, 0x7614, 0xE2E1, 0x76B8, 0xE2E2, 0x7781, + 0xE2E3, 0x777C, 0xE2E4, 0x7785, 0xE2E5, 0x7782, 0xE2E6, 0x776E, 0xE2E7, 0x7780, 0xE2E8, 0x776F, 0xE2E9, 0x777E, 0xE2EA, 0x7783, + 0xE2EB, 0x78B2, 0xE2EC, 0x78AA, 0xE2ED, 0x78B4, 0xE2EE, 0x78AD, 0xE2EF, 0x78A8, 0xE2F0, 0x787E, 0xE2F1, 0x78AB, 0xE2F2, 0x789E, + 0xE2F3, 0x78A5, 0xE2F4, 0x78A0, 0xE2F5, 0x78AC, 0xE2F6, 0x78A2, 0xE2F7, 0x78A4, 0xE2F8, 0x7998, 0xE2F9, 0x798A, 0xE2FA, 0x798B, + 0xE2FB, 0x7996, 0xE2FC, 0x7995, 0xE2FD, 0x7994, 0xE2FE, 0x7993, 0xE340, 0x7997, 0xE341, 0x7988, 0xE342, 0x7992, 0xE343, 0x7990, + 0xE344, 0x7A2B, 0xE345, 0x7A4A, 0xE346, 0x7A30, 0xE347, 0x7A2F, 0xE348, 0x7A28, 0xE349, 0x7A26, 0xE34A, 0x7AA8, 0xE34B, 0x7AAB, + 0xE34C, 0x7AAC, 0xE34D, 0x7AEE, 0xE34E, 0x7B88, 0xE34F, 0x7B9C, 0xE350, 0x7B8A, 0xE351, 0x7B91, 0xE352, 0x7B90, 0xE353, 0x7B96, + 0xE354, 0x7B8D, 0xE355, 0x7B8C, 0xE356, 0x7B9B, 0xE357, 0x7B8E, 0xE358, 0x7B85, 0xE359, 0x7B98, 0xE35A, 0x5284, 0xE35B, 0x7B99, + 0xE35C, 0x7BA4, 0xE35D, 0x7B82, 0xE35E, 0x7CBB, 0xE35F, 0x7CBF, 0xE360, 0x7CBC, 0xE361, 0x7CBA, 0xE362, 0x7DA7, 0xE363, 0x7DB7, + 0xE364, 0x7DC2, 0xE365, 0x7DA3, 0xE366, 0x7DAA, 0xE367, 0x7DC1, 0xE368, 0x7DC0, 0xE369, 0x7DC5, 0xE36A, 0x7D9D, 0xE36B, 0x7DCE, + 0xE36C, 0x7DC4, 0xE36D, 0x7DC6, 0xE36E, 0x7DCB, 0xE36F, 0x7DCC, 0xE370, 0x7DAF, 0xE371, 0x7DB9, 0xE372, 0x7D96, 0xE373, 0x7DBC, + 0xE374, 0x7D9F, 0xE375, 0x7DA6, 0xE376, 0x7DAE, 0xE377, 0x7DA9, 0xE378, 0x7DA1, 0xE379, 0x7DC9, 0xE37A, 0x7F73, 0xE37B, 0x7FE2, + 0xE37C, 0x7FE3, 0xE37D, 0x7FE5, 0xE37E, 0x7FDE, 0xE3A1, 0x8024, 0xE3A2, 0x805D, 0xE3A3, 0x805C, 0xE3A4, 0x8189, 0xE3A5, 0x8186, + 0xE3A6, 0x8183, 0xE3A7, 0x8187, 0xE3A8, 0x818D, 0xE3A9, 0x818C, 0xE3AA, 0x818B, 0xE3AB, 0x8215, 0xE3AC, 0x8497, 0xE3AD, 0x84A4, + 0xE3AE, 0x84A1, 0xE3AF, 0x849F, 0xE3B0, 0x84BA, 0xE3B1, 0x84CE, 0xE3B2, 0x84C2, 0xE3B3, 0x84AC, 0xE3B4, 0x84AE, 0xE3B5, 0x84AB, + 0xE3B6, 0x84B9, 0xE3B7, 0x84B4, 0xE3B8, 0x84C1, 0xE3B9, 0x84CD, 0xE3BA, 0x84AA, 0xE3BB, 0x849A, 0xE3BC, 0x84B1, 0xE3BD, 0x84D0, + 0xE3BE, 0x849D, 0xE3BF, 0x84A7, 0xE3C0, 0x84BB, 0xE3C1, 0x84A2, 0xE3C2, 0x8494, 0xE3C3, 0x84C7, 0xE3C4, 0x84CC, 0xE3C5, 0x849B, + 0xE3C6, 0x84A9, 0xE3C7, 0x84AF, 0xE3C8, 0x84A8, 0xE3C9, 0x84D6, 0xE3CA, 0x8498, 0xE3CB, 0x84B6, 0xE3CC, 0x84CF, 0xE3CD, 0x84A0, + 0xE3CE, 0x84D7, 0xE3CF, 0x84D4, 0xE3D0, 0x84D2, 0xE3D1, 0x84DB, 0xE3D2, 0x84B0, 0xE3D3, 0x8491, 0xE3D4, 0x8661, 0xE3D5, 0x8733, + 0xE3D6, 0x8723, 0xE3D7, 0x8728, 0xE3D8, 0x876B, 0xE3D9, 0x8740, 0xE3DA, 0x872E, 0xE3DB, 0x871E, 0xE3DC, 0x8721, 0xE3DD, 0x8719, + 0xE3DE, 0x871B, 0xE3DF, 0x8743, 0xE3E0, 0x872C, 0xE3E1, 0x8741, 0xE3E2, 0x873E, 0xE3E3, 0x8746, 0xE3E4, 0x8720, 0xE3E5, 0x8732, + 0xE3E6, 0x872A, 0xE3E7, 0x872D, 0xE3E8, 0x873C, 0xE3E9, 0x8712, 0xE3EA, 0x873A, 0xE3EB, 0x8731, 0xE3EC, 0x8735, 0xE3ED, 0x8742, + 0xE3EE, 0x8726, 0xE3EF, 0x8727, 0xE3F0, 0x8738, 0xE3F1, 0x8724, 0xE3F2, 0x871A, 0xE3F3, 0x8730, 0xE3F4, 0x8711, 0xE3F5, 0x88F7, + 0xE3F6, 0x88E7, 0xE3F7, 0x88F1, 0xE3F8, 0x88F2, 0xE3F9, 0x88FA, 0xE3FA, 0x88FE, 0xE3FB, 0x88EE, 0xE3FC, 0x88FC, 0xE3FD, 0x88F6, + 0xE3FE, 0x88FB, 0xE440, 0x88F0, 0xE441, 0x88EC, 0xE442, 0x88EB, 0xE443, 0x899D, 0xE444, 0x89A1, 0xE445, 0x899F, 0xE446, 0x899E, + 0xE447, 0x89E9, 0xE448, 0x89EB, 0xE449, 0x89E8, 0xE44A, 0x8AAB, 0xE44B, 0x8A99, 0xE44C, 0x8A8B, 0xE44D, 0x8A92, 0xE44E, 0x8A8F, + 0xE44F, 0x8A96, 0xE450, 0x8C3D, 0xE451, 0x8C68, 0xE452, 0x8C69, 0xE453, 0x8CD5, 0xE454, 0x8CCF, 0xE455, 0x8CD7, 0xE456, 0x8D96, + 0xE457, 0x8E09, 0xE458, 0x8E02, 0xE459, 0x8DFF, 0xE45A, 0x8E0D, 0xE45B, 0x8DFD, 0xE45C, 0x8E0A, 0xE45D, 0x8E03, 0xE45E, 0x8E07, + 0xE45F, 0x8E06, 0xE460, 0x8E05, 0xE461, 0x8DFE, 0xE462, 0x8E00, 0xE463, 0x8E04, 0xE464, 0x8F10, 0xE465, 0x8F11, 0xE466, 0x8F0E, + 0xE467, 0x8F0D, 0xE468, 0x9123, 0xE469, 0x911C, 0xE46A, 0x9120, 0xE46B, 0x9122, 0xE46C, 0x911F, 0xE46D, 0x911D, 0xE46E, 0x911A, + 0xE46F, 0x9124, 0xE470, 0x9121, 0xE471, 0x911B, 0xE472, 0x917A, 0xE473, 0x9172, 0xE474, 0x9179, 0xE475, 0x9173, 0xE476, 0x92A5, + 0xE477, 0x92A4, 0xE478, 0x9276, 0xE479, 0x929B, 0xE47A, 0x927A, 0xE47B, 0x92A0, 0xE47C, 0x9294, 0xE47D, 0x92AA, 0xE47E, 0x928D, + 0xE4A1, 0x92A6, 0xE4A2, 0x929A, 0xE4A3, 0x92AB, 0xE4A4, 0x9279, 0xE4A5, 0x9297, 0xE4A6, 0x927F, 0xE4A7, 0x92A3, 0xE4A8, 0x92EE, + 0xE4A9, 0x928E, 0xE4AA, 0x9282, 0xE4AB, 0x9295, 0xE4AC, 0x92A2, 0xE4AD, 0x927D, 0xE4AE, 0x9288, 0xE4AF, 0x92A1, 0xE4B0, 0x928A, + 0xE4B1, 0x9286, 0xE4B2, 0x928C, 0xE4B3, 0x9299, 0xE4B4, 0x92A7, 0xE4B5, 0x927E, 0xE4B6, 0x9287, 0xE4B7, 0x92A9, 0xE4B8, 0x929D, + 0xE4B9, 0x928B, 0xE4BA, 0x922D, 0xE4BB, 0x969E, 0xE4BC, 0x96A1, 0xE4BD, 0x96FF, 0xE4BE, 0x9758, 0xE4BF, 0x977D, 0xE4C0, 0x977A, + 0xE4C1, 0x977E, 0xE4C2, 0x9783, 0xE4C3, 0x9780, 0xE4C4, 0x9782, 0xE4C5, 0x977B, 0xE4C6, 0x9784, 0xE4C7, 0x9781, 0xE4C8, 0x977F, + 0xE4C9, 0x97CE, 0xE4CA, 0x97CD, 0xE4CB, 0x9816, 0xE4CC, 0x98AD, 0xE4CD, 0x98AE, 0xE4CE, 0x9902, 0xE4CF, 0x9900, 0xE4D0, 0x9907, + 0xE4D1, 0x999D, 0xE4D2, 0x999C, 0xE4D3, 0x99C3, 0xE4D4, 0x99B9, 0xE4D5, 0x99BB, 0xE4D6, 0x99BA, 0xE4D7, 0x99C2, 0xE4D8, 0x99BD, + 0xE4D9, 0x99C7, 0xE4DA, 0x9AB1, 0xE4DB, 0x9AE3, 0xE4DC, 0x9AE7, 0xE4DD, 0x9B3E, 0xE4DE, 0x9B3F, 0xE4DF, 0x9B60, 0xE4E0, 0x9B61, + 0xE4E1, 0x9B5F, 0xE4E2, 0x9CF1, 0xE4E3, 0x9CF2, 0xE4E4, 0x9CF5, 0xE4E5, 0x9EA7, 0xE4E6, 0x50FF, 0xE4E7, 0x5103, 0xE4E8, 0x5130, + 0xE4E9, 0x50F8, 0xE4EA, 0x5106, 0xE4EB, 0x5107, 0xE4EC, 0x50F6, 0xE4ED, 0x50FE, 0xE4EE, 0x510B, 0xE4EF, 0x510C, 0xE4F0, 0x50FD, + 0xE4F1, 0x510A, 0xE4F2, 0x528B, 0xE4F3, 0x528C, 0xE4F4, 0x52F1, 0xE4F5, 0x52EF, 0xE4F6, 0x5648, 0xE4F7, 0x5642, 0xE4F8, 0x564C, + 0xE4F9, 0x5635, 0xE4FA, 0x5641, 0xE4FB, 0x564A, 0xE4FC, 0x5649, 0xE4FD, 0x5646, 0xE4FE, 0x5658, 0xE540, 0x565A, 0xE541, 0x5640, + 0xE542, 0x5633, 0xE543, 0x563D, 0xE544, 0x562C, 0xE545, 0x563E, 0xE546, 0x5638, 0xE547, 0x562A, 0xE548, 0x563A, 0xE549, 0x571A, + 0xE54A, 0x58AB, 0xE54B, 0x589D, 0xE54C, 0x58B1, 0xE54D, 0x58A0, 0xE54E, 0x58A3, 0xE54F, 0x58AF, 0xE550, 0x58AC, 0xE551, 0x58A5, + 0xE552, 0x58A1, 0xE553, 0x58FF, 0xE554, 0x5AFF, 0xE555, 0x5AF4, 0xE556, 0x5AFD, 0xE557, 0x5AF7, 0xE558, 0x5AF6, 0xE559, 0x5B03, + 0xE55A, 0x5AF8, 0xE55B, 0x5B02, 0xE55C, 0x5AF9, 0xE55D, 0x5B01, 0xE55E, 0x5B07, 0xE55F, 0x5B05, 0xE560, 0x5B0F, 0xE561, 0x5C67, + 0xE562, 0x5D99, 0xE563, 0x5D97, 0xE564, 0x5D9F, 0xE565, 0x5D92, 0xE566, 0x5DA2, 0xE567, 0x5D93, 0xE568, 0x5D95, 0xE569, 0x5DA0, + 0xE56A, 0x5D9C, 0xE56B, 0x5DA1, 0xE56C, 0x5D9A, 0xE56D, 0x5D9E, 0xE56E, 0x5E69, 0xE56F, 0x5E5D, 0xE570, 0x5E60, 0xE571, 0x5E5C, + 0xE572, 0x7DF3, 0xE573, 0x5EDB, 0xE574, 0x5EDE, 0xE575, 0x5EE1, 0xE576, 0x5F49, 0xE577, 0x5FB2, 0xE578, 0x618B, 0xE579, 0x6183, + 0xE57A, 0x6179, 0xE57B, 0x61B1, 0xE57C, 0x61B0, 0xE57D, 0x61A2, 0xE57E, 0x6189, 0xE5A1, 0x619B, 0xE5A2, 0x6193, 0xE5A3, 0x61AF, + 0xE5A4, 0x61AD, 0xE5A5, 0x619F, 0xE5A6, 0x6192, 0xE5A7, 0x61AA, 0xE5A8, 0x61A1, 0xE5A9, 0x618D, 0xE5AA, 0x6166, 0xE5AB, 0x61B3, + 0xE5AC, 0x622D, 0xE5AD, 0x646E, 0xE5AE, 0x6470, 0xE5AF, 0x6496, 0xE5B0, 0x64A0, 0xE5B1, 0x6485, 0xE5B2, 0x6497, 0xE5B3, 0x649C, + 0xE5B4, 0x648F, 0xE5B5, 0x648B, 0xE5B6, 0x648A, 0xE5B7, 0x648C, 0xE5B8, 0x64A3, 0xE5B9, 0x649F, 0xE5BA, 0x6468, 0xE5BB, 0x64B1, + 0xE5BC, 0x6498, 0xE5BD, 0x6576, 0xE5BE, 0x657A, 0xE5BF, 0x6579, 0xE5C0, 0x657B, 0xE5C1, 0x65B2, 0xE5C2, 0x65B3, 0xE5C3, 0x66B5, + 0xE5C4, 0x66B0, 0xE5C5, 0x66A9, 0xE5C6, 0x66B2, 0xE5C7, 0x66B7, 0xE5C8, 0x66AA, 0xE5C9, 0x66AF, 0xE5CA, 0x6A00, 0xE5CB, 0x6A06, + 0xE5CC, 0x6A17, 0xE5CD, 0x69E5, 0xE5CE, 0x69F8, 0xE5CF, 0x6A15, 0xE5D0, 0x69F1, 0xE5D1, 0x69E4, 0xE5D2, 0x6A20, 0xE5D3, 0x69FF, + 0xE5D4, 0x69EC, 0xE5D5, 0x69E2, 0xE5D6, 0x6A1B, 0xE5D7, 0x6A1D, 0xE5D8, 0x69FE, 0xE5D9, 0x6A27, 0xE5DA, 0x69F2, 0xE5DB, 0x69EE, + 0xE5DC, 0x6A14, 0xE5DD, 0x69F7, 0xE5DE, 0x69E7, 0xE5DF, 0x6A40, 0xE5E0, 0x6A08, 0xE5E1, 0x69E6, 0xE5E2, 0x69FB, 0xE5E3, 0x6A0D, + 0xE5E4, 0x69FC, 0xE5E5, 0x69EB, 0xE5E6, 0x6A09, 0xE5E7, 0x6A04, 0xE5E8, 0x6A18, 0xE5E9, 0x6A25, 0xE5EA, 0x6A0F, 0xE5EB, 0x69F6, + 0xE5EC, 0x6A26, 0xE5ED, 0x6A07, 0xE5EE, 0x69F4, 0xE5EF, 0x6A16, 0xE5F0, 0x6B51, 0xE5F1, 0x6BA5, 0xE5F2, 0x6BA3, 0xE5F3, 0x6BA2, + 0xE5F4, 0x6BA6, 0xE5F5, 0x6C01, 0xE5F6, 0x6C00, 0xE5F7, 0x6BFF, 0xE5F8, 0x6C02, 0xE5F9, 0x6F41, 0xE5FA, 0x6F26, 0xE5FB, 0x6F7E, + 0xE5FC, 0x6F87, 0xE5FD, 0x6FC6, 0xE5FE, 0x6F92, 0xE640, 0x6F8D, 0xE641, 0x6F89, 0xE642, 0x6F8C, 0xE643, 0x6F62, 0xE644, 0x6F4F, + 0xE645, 0x6F85, 0xE646, 0x6F5A, 0xE647, 0x6F96, 0xE648, 0x6F76, 0xE649, 0x6F6C, 0xE64A, 0x6F82, 0xE64B, 0x6F55, 0xE64C, 0x6F72, + 0xE64D, 0x6F52, 0xE64E, 0x6F50, 0xE64F, 0x6F57, 0xE650, 0x6F94, 0xE651, 0x6F93, 0xE652, 0x6F5D, 0xE653, 0x6F00, 0xE654, 0x6F61, + 0xE655, 0x6F6B, 0xE656, 0x6F7D, 0xE657, 0x6F67, 0xE658, 0x6F90, 0xE659, 0x6F53, 0xE65A, 0x6F8B, 0xE65B, 0x6F69, 0xE65C, 0x6F7F, + 0xE65D, 0x6F95, 0xE65E, 0x6F63, 0xE65F, 0x6F77, 0xE660, 0x6F6A, 0xE661, 0x6F7B, 0xE662, 0x71B2, 0xE663, 0x71AF, 0xE664, 0x719B, + 0xE665, 0x71B0, 0xE666, 0x71A0, 0xE667, 0x719A, 0xE668, 0x71A9, 0xE669, 0x71B5, 0xE66A, 0x719D, 0xE66B, 0x71A5, 0xE66C, 0x719E, + 0xE66D, 0x71A4, 0xE66E, 0x71A1, 0xE66F, 0x71AA, 0xE670, 0x719C, 0xE671, 0x71A7, 0xE672, 0x71B3, 0xE673, 0x7298, 0xE674, 0x729A, + 0xE675, 0x7358, 0xE676, 0x7352, 0xE677, 0x735E, 0xE678, 0x735F, 0xE679, 0x7360, 0xE67A, 0x735D, 0xE67B, 0x735B, 0xE67C, 0x7361, + 0xE67D, 0x735A, 0xE67E, 0x7359, 0xE6A1, 0x7362, 0xE6A2, 0x7487, 0xE6A3, 0x7489, 0xE6A4, 0x748A, 0xE6A5, 0x7486, 0xE6A6, 0x7481, + 0xE6A7, 0x747D, 0xE6A8, 0x7485, 0xE6A9, 0x7488, 0xE6AA, 0x747C, 0xE6AB, 0x7479, 0xE6AC, 0x7508, 0xE6AD, 0x7507, 0xE6AE, 0x757E, + 0xE6AF, 0x7625, 0xE6B0, 0x761E, 0xE6B1, 0x7619, 0xE6B2, 0x761D, 0xE6B3, 0x761C, 0xE6B4, 0x7623, 0xE6B5, 0x761A, 0xE6B6, 0x7628, + 0xE6B7, 0x761B, 0xE6B8, 0x769C, 0xE6B9, 0x769D, 0xE6BA, 0x769E, 0xE6BB, 0x769B, 0xE6BC, 0x778D, 0xE6BD, 0x778F, 0xE6BE, 0x7789, + 0xE6BF, 0x7788, 0xE6C0, 0x78CD, 0xE6C1, 0x78BB, 0xE6C2, 0x78CF, 0xE6C3, 0x78CC, 0xE6C4, 0x78D1, 0xE6C5, 0x78CE, 0xE6C6, 0x78D4, + 0xE6C7, 0x78C8, 0xE6C8, 0x78C3, 0xE6C9, 0x78C4, 0xE6CA, 0x78C9, 0xE6CB, 0x799A, 0xE6CC, 0x79A1, 0xE6CD, 0x79A0, 0xE6CE, 0x799C, + 0xE6CF, 0x79A2, 0xE6D0, 0x799B, 0xE6D1, 0x6B76, 0xE6D2, 0x7A39, 0xE6D3, 0x7AB2, 0xE6D4, 0x7AB4, 0xE6D5, 0x7AB3, 0xE6D6, 0x7BB7, + 0xE6D7, 0x7BCB, 0xE6D8, 0x7BBE, 0xE6D9, 0x7BAC, 0xE6DA, 0x7BCE, 0xE6DB, 0x7BAF, 0xE6DC, 0x7BB9, 0xE6DD, 0x7BCA, 0xE6DE, 0x7BB5, + 0xE6DF, 0x7CC5, 0xE6E0, 0x7CC8, 0xE6E1, 0x7CCC, 0xE6E2, 0x7CCB, 0xE6E3, 0x7DF7, 0xE6E4, 0x7DDB, 0xE6E5, 0x7DEA, 0xE6E6, 0x7DE7, + 0xE6E7, 0x7DD7, 0xE6E8, 0x7DE1, 0xE6E9, 0x7E03, 0xE6EA, 0x7DFA, 0xE6EB, 0x7DE6, 0xE6EC, 0x7DF6, 0xE6ED, 0x7DF1, 0xE6EE, 0x7DF0, + 0xE6EF, 0x7DEE, 0xE6F0, 0x7DDF, 0xE6F1, 0x7F76, 0xE6F2, 0x7FAC, 0xE6F3, 0x7FB0, 0xE6F4, 0x7FAD, 0xE6F5, 0x7FED, 0xE6F6, 0x7FEB, + 0xE6F7, 0x7FEA, 0xE6F8, 0x7FEC, 0xE6F9, 0x7FE6, 0xE6FA, 0x7FE8, 0xE6FB, 0x8064, 0xE6FC, 0x8067, 0xE6FD, 0x81A3, 0xE6FE, 0x819F, + 0xE740, 0x819E, 0xE741, 0x8195, 0xE742, 0x81A2, 0xE743, 0x8199, 0xE744, 0x8197, 0xE745, 0x8216, 0xE746, 0x824F, 0xE747, 0x8253, + 0xE748, 0x8252, 0xE749, 0x8250, 0xE74A, 0x824E, 0xE74B, 0x8251, 0xE74C, 0x8524, 0xE74D, 0x853B, 0xE74E, 0x850F, 0xE74F, 0x8500, + 0xE750, 0x8529, 0xE751, 0x850E, 0xE752, 0x8509, 0xE753, 0x850D, 0xE754, 0x851F, 0xE755, 0x850A, 0xE756, 0x8527, 0xE757, 0x851C, + 0xE758, 0x84FB, 0xE759, 0x852B, 0xE75A, 0x84FA, 0xE75B, 0x8508, 0xE75C, 0x850C, 0xE75D, 0x84F4, 0xE75E, 0x852A, 0xE75F, 0x84F2, + 0xE760, 0x8515, 0xE761, 0x84F7, 0xE762, 0x84EB, 0xE763, 0x84F3, 0xE764, 0x84FC, 0xE765, 0x8512, 0xE766, 0x84EA, 0xE767, 0x84E9, + 0xE768, 0x8516, 0xE769, 0x84FE, 0xE76A, 0x8528, 0xE76B, 0x851D, 0xE76C, 0x852E, 0xE76D, 0x8502, 0xE76E, 0x84FD, 0xE76F, 0x851E, + 0xE770, 0x84F6, 0xE771, 0x8531, 0xE772, 0x8526, 0xE773, 0x84E7, 0xE774, 0x84E8, 0xE775, 0x84F0, 0xE776, 0x84EF, 0xE777, 0x84F9, + 0xE778, 0x8518, 0xE779, 0x8520, 0xE77A, 0x8530, 0xE77B, 0x850B, 0xE77C, 0x8519, 0xE77D, 0x852F, 0xE77E, 0x8662, 0xE7A1, 0x8756, + 0xE7A2, 0x8763, 0xE7A3, 0x8764, 0xE7A4, 0x8777, 0xE7A5, 0x87E1, 0xE7A6, 0x8773, 0xE7A7, 0x8758, 0xE7A8, 0x8754, 0xE7A9, 0x875B, + 0xE7AA, 0x8752, 0xE7AB, 0x8761, 0xE7AC, 0x875A, 0xE7AD, 0x8751, 0xE7AE, 0x875E, 0xE7AF, 0x876D, 0xE7B0, 0x876A, 0xE7B1, 0x8750, + 0xE7B2, 0x874E, 0xE7B3, 0x875F, 0xE7B4, 0x875D, 0xE7B5, 0x876F, 0xE7B6, 0x876C, 0xE7B7, 0x877A, 0xE7B8, 0x876E, 0xE7B9, 0x875C, + 0xE7BA, 0x8765, 0xE7BB, 0x874F, 0xE7BC, 0x877B, 0xE7BD, 0x8775, 0xE7BE, 0x8762, 0xE7BF, 0x8767, 0xE7C0, 0x8769, 0xE7C1, 0x885A, + 0xE7C2, 0x8905, 0xE7C3, 0x890C, 0xE7C4, 0x8914, 0xE7C5, 0x890B, 0xE7C6, 0x8917, 0xE7C7, 0x8918, 0xE7C8, 0x8919, 0xE7C9, 0x8906, + 0xE7CA, 0x8916, 0xE7CB, 0x8911, 0xE7CC, 0x890E, 0xE7CD, 0x8909, 0xE7CE, 0x89A2, 0xE7CF, 0x89A4, 0xE7D0, 0x89A3, 0xE7D1, 0x89ED, + 0xE7D2, 0x89F0, 0xE7D3, 0x89EC, 0xE7D4, 0x8ACF, 0xE7D5, 0x8AC6, 0xE7D6, 0x8AB8, 0xE7D7, 0x8AD3, 0xE7D8, 0x8AD1, 0xE7D9, 0x8AD4, + 0xE7DA, 0x8AD5, 0xE7DB, 0x8ABB, 0xE7DC, 0x8AD7, 0xE7DD, 0x8ABE, 0xE7DE, 0x8AC0, 0xE7DF, 0x8AC5, 0xE7E0, 0x8AD8, 0xE7E1, 0x8AC3, + 0xE7E2, 0x8ABA, 0xE7E3, 0x8ABD, 0xE7E4, 0x8AD9, 0xE7E5, 0x8C3E, 0xE7E6, 0x8C4D, 0xE7E7, 0x8C8F, 0xE7E8, 0x8CE5, 0xE7E9, 0x8CDF, + 0xE7EA, 0x8CD9, 0xE7EB, 0x8CE8, 0xE7EC, 0x8CDA, 0xE7ED, 0x8CDD, 0xE7EE, 0x8CE7, 0xE7EF, 0x8DA0, 0xE7F0, 0x8D9C, 0xE7F1, 0x8DA1, + 0xE7F2, 0x8D9B, 0xE7F3, 0x8E20, 0xE7F4, 0x8E23, 0xE7F5, 0x8E25, 0xE7F6, 0x8E24, 0xE7F7, 0x8E2E, 0xE7F8, 0x8E15, 0xE7F9, 0x8E1B, + 0xE7FA, 0x8E16, 0xE7FB, 0x8E11, 0xE7FC, 0x8E19, 0xE7FD, 0x8E26, 0xE7FE, 0x8E27, 0xE840, 0x8E14, 0xE841, 0x8E12, 0xE842, 0x8E18, + 0xE843, 0x8E13, 0xE844, 0x8E1C, 0xE845, 0x8E17, 0xE846, 0x8E1A, 0xE847, 0x8F2C, 0xE848, 0x8F24, 0xE849, 0x8F18, 0xE84A, 0x8F1A, + 0xE84B, 0x8F20, 0xE84C, 0x8F23, 0xE84D, 0x8F16, 0xE84E, 0x8F17, 0xE84F, 0x9073, 0xE850, 0x9070, 0xE851, 0x906F, 0xE852, 0x9067, + 0xE853, 0x906B, 0xE854, 0x912F, 0xE855, 0x912B, 0xE856, 0x9129, 0xE857, 0x912A, 0xE858, 0x9132, 0xE859, 0x9126, 0xE85A, 0x912E, + 0xE85B, 0x9185, 0xE85C, 0x9186, 0xE85D, 0x918A, 0xE85E, 0x9181, 0xE85F, 0x9182, 0xE860, 0x9184, 0xE861, 0x9180, 0xE862, 0x92D0, + 0xE863, 0x92C3, 0xE864, 0x92C4, 0xE865, 0x92C0, 0xE866, 0x92D9, 0xE867, 0x92B6, 0xE868, 0x92CF, 0xE869, 0x92F1, 0xE86A, 0x92DF, + 0xE86B, 0x92D8, 0xE86C, 0x92E9, 0xE86D, 0x92D7, 0xE86E, 0x92DD, 0xE86F, 0x92CC, 0xE870, 0x92EF, 0xE871, 0x92C2, 0xE872, 0x92E8, + 0xE873, 0x92CA, 0xE874, 0x92C8, 0xE875, 0x92CE, 0xE876, 0x92E6, 0xE877, 0x92CD, 0xE878, 0x92D5, 0xE879, 0x92C9, 0xE87A, 0x92E0, + 0xE87B, 0x92DE, 0xE87C, 0x92E7, 0xE87D, 0x92D1, 0xE87E, 0x92D3, 0xE8A1, 0x92B5, 0xE8A2, 0x92E1, 0xE8A3, 0x92C6, 0xE8A4, 0x92B4, + 0xE8A5, 0x957C, 0xE8A6, 0x95AC, 0xE8A7, 0x95AB, 0xE8A8, 0x95AE, 0xE8A9, 0x95B0, 0xE8AA, 0x96A4, 0xE8AB, 0x96A2, 0xE8AC, 0x96D3, + 0xE8AD, 0x9705, 0xE8AE, 0x9708, 0xE8AF, 0x9702, 0xE8B0, 0x975A, 0xE8B1, 0x978A, 0xE8B2, 0x978E, 0xE8B3, 0x9788, 0xE8B4, 0x97D0, + 0xE8B5, 0x97CF, 0xE8B6, 0x981E, 0xE8B7, 0x981D, 0xE8B8, 0x9826, 0xE8B9, 0x9829, 0xE8BA, 0x9828, 0xE8BB, 0x9820, 0xE8BC, 0x981B, + 0xE8BD, 0x9827, 0xE8BE, 0x98B2, 0xE8BF, 0x9908, 0xE8C0, 0x98FA, 0xE8C1, 0x9911, 0xE8C2, 0x9914, 0xE8C3, 0x9916, 0xE8C4, 0x9917, + 0xE8C5, 0x9915, 0xE8C6, 0x99DC, 0xE8C7, 0x99CD, 0xE8C8, 0x99CF, 0xE8C9, 0x99D3, 0xE8CA, 0x99D4, 0xE8CB, 0x99CE, 0xE8CC, 0x99C9, + 0xE8CD, 0x99D6, 0xE8CE, 0x99D8, 0xE8CF, 0x99CB, 0xE8D0, 0x99D7, 0xE8D1, 0x99CC, 0xE8D2, 0x9AB3, 0xE8D3, 0x9AEC, 0xE8D4, 0x9AEB, + 0xE8D5, 0x9AF3, 0xE8D6, 0x9AF2, 0xE8D7, 0x9AF1, 0xE8D8, 0x9B46, 0xE8D9, 0x9B43, 0xE8DA, 0x9B67, 0xE8DB, 0x9B74, 0xE8DC, 0x9B71, + 0xE8DD, 0x9B66, 0xE8DE, 0x9B76, 0xE8DF, 0x9B75, 0xE8E0, 0x9B70, 0xE8E1, 0x9B68, 0xE8E2, 0x9B64, 0xE8E3, 0x9B6C, 0xE8E4, 0x9CFC, + 0xE8E5, 0x9CFA, 0xE8E6, 0x9CFD, 0xE8E7, 0x9CFF, 0xE8E8, 0x9CF7, 0xE8E9, 0x9D07, 0xE8EA, 0x9D00, 0xE8EB, 0x9CF9, 0xE8EC, 0x9CFB, + 0xE8ED, 0x9D08, 0xE8EE, 0x9D05, 0xE8EF, 0x9D04, 0xE8F0, 0x9E83, 0xE8F1, 0x9ED3, 0xE8F2, 0x9F0F, 0xE8F3, 0x9F10, 0xE8F4, 0x511C, + 0xE8F5, 0x5113, 0xE8F6, 0x5117, 0xE8F7, 0x511A, 0xE8F8, 0x5111, 0xE8F9, 0x51DE, 0xE8FA, 0x5334, 0xE8FB, 0x53E1, 0xE8FC, 0x5670, + 0xE8FD, 0x5660, 0xE8FE, 0x566E, 0xE940, 0x5673, 0xE941, 0x5666, 0xE942, 0x5663, 0xE943, 0x566D, 0xE944, 0x5672, 0xE945, 0x565E, + 0xE946, 0x5677, 0xE947, 0x571C, 0xE948, 0x571B, 0xE949, 0x58C8, 0xE94A, 0x58BD, 0xE94B, 0x58C9, 0xE94C, 0x58BF, 0xE94D, 0x58BA, + 0xE94E, 0x58C2, 0xE94F, 0x58BC, 0xE950, 0x58C6, 0xE951, 0x5B17, 0xE952, 0x5B19, 0xE953, 0x5B1B, 0xE954, 0x5B21, 0xE955, 0x5B14, + 0xE956, 0x5B13, 0xE957, 0x5B10, 0xE958, 0x5B16, 0xE959, 0x5B28, 0xE95A, 0x5B1A, 0xE95B, 0x5B20, 0xE95C, 0x5B1E, 0xE95D, 0x5BEF, + 0xE95E, 0x5DAC, 0xE95F, 0x5DB1, 0xE960, 0x5DA9, 0xE961, 0x5DA7, 0xE962, 0x5DB5, 0xE963, 0x5DB0, 0xE964, 0x5DAE, 0xE965, 0x5DAA, + 0xE966, 0x5DA8, 0xE967, 0x5DB2, 0xE968, 0x5DAD, 0xE969, 0x5DAF, 0xE96A, 0x5DB4, 0xE96B, 0x5E67, 0xE96C, 0x5E68, 0xE96D, 0x5E66, + 0xE96E, 0x5E6F, 0xE96F, 0x5EE9, 0xE970, 0x5EE7, 0xE971, 0x5EE6, 0xE972, 0x5EE8, 0xE973, 0x5EE5, 0xE974, 0x5F4B, 0xE975, 0x5FBC, + 0xE976, 0x619D, 0xE977, 0x61A8, 0xE978, 0x6196, 0xE979, 0x61C5, 0xE97A, 0x61B4, 0xE97B, 0x61C6, 0xE97C, 0x61C1, 0xE97D, 0x61CC, + 0xE97E, 0x61BA, 0xE9A1, 0x61BF, 0xE9A2, 0x61B8, 0xE9A3, 0x618C, 0xE9A4, 0x64D7, 0xE9A5, 0x64D6, 0xE9A6, 0x64D0, 0xE9A7, 0x64CF, + 0xE9A8, 0x64C9, 0xE9A9, 0x64BD, 0xE9AA, 0x6489, 0xE9AB, 0x64C3, 0xE9AC, 0x64DB, 0xE9AD, 0x64F3, 0xE9AE, 0x64D9, 0xE9AF, 0x6533, + 0xE9B0, 0x657F, 0xE9B1, 0x657C, 0xE9B2, 0x65A2, 0xE9B3, 0x66C8, 0xE9B4, 0x66BE, 0xE9B5, 0x66C0, 0xE9B6, 0x66CA, 0xE9B7, 0x66CB, + 0xE9B8, 0x66CF, 0xE9B9, 0x66BD, 0xE9BA, 0x66BB, 0xE9BB, 0x66BA, 0xE9BC, 0x66CC, 0xE9BD, 0x6723, 0xE9BE, 0x6A34, 0xE9BF, 0x6A66, + 0xE9C0, 0x6A49, 0xE9C1, 0x6A67, 0xE9C2, 0x6A32, 0xE9C3, 0x6A68, 0xE9C4, 0x6A3E, 0xE9C5, 0x6A5D, 0xE9C6, 0x6A6D, 0xE9C7, 0x6A76, + 0xE9C8, 0x6A5B, 0xE9C9, 0x6A51, 0xE9CA, 0x6A28, 0xE9CB, 0x6A5A, 0xE9CC, 0x6A3B, 0xE9CD, 0x6A3F, 0xE9CE, 0x6A41, 0xE9CF, 0x6A6A, + 0xE9D0, 0x6A64, 0xE9D1, 0x6A50, 0xE9D2, 0x6A4F, 0xE9D3, 0x6A54, 0xE9D4, 0x6A6F, 0xE9D5, 0x6A69, 0xE9D6, 0x6A60, 0xE9D7, 0x6A3C, + 0xE9D8, 0x6A5E, 0xE9D9, 0x6A56, 0xE9DA, 0x6A55, 0xE9DB, 0x6A4D, 0xE9DC, 0x6A4E, 0xE9DD, 0x6A46, 0xE9DE, 0x6B55, 0xE9DF, 0x6B54, + 0xE9E0, 0x6B56, 0xE9E1, 0x6BA7, 0xE9E2, 0x6BAA, 0xE9E3, 0x6BAB, 0xE9E4, 0x6BC8, 0xE9E5, 0x6BC7, 0xE9E6, 0x6C04, 0xE9E7, 0x6C03, + 0xE9E8, 0x6C06, 0xE9E9, 0x6FAD, 0xE9EA, 0x6FCB, 0xE9EB, 0x6FA3, 0xE9EC, 0x6FC7, 0xE9ED, 0x6FBC, 0xE9EE, 0x6FCE, 0xE9EF, 0x6FC8, + 0xE9F0, 0x6F5E, 0xE9F1, 0x6FC4, 0xE9F2, 0x6FBD, 0xE9F3, 0x6F9E, 0xE9F4, 0x6FCA, 0xE9F5, 0x6FA8, 0xE9F6, 0x7004, 0xE9F7, 0x6FA5, + 0xE9F8, 0x6FAE, 0xE9F9, 0x6FBA, 0xE9FA, 0x6FAC, 0xE9FB, 0x6FAA, 0xE9FC, 0x6FCF, 0xE9FD, 0x6FBF, 0xE9FE, 0x6FB8, 0xEA40, 0x6FA2, + 0xEA41, 0x6FC9, 0xEA42, 0x6FAB, 0xEA43, 0x6FCD, 0xEA44, 0x6FAF, 0xEA45, 0x6FB2, 0xEA46, 0x6FB0, 0xEA47, 0x71C5, 0xEA48, 0x71C2, + 0xEA49, 0x71BF, 0xEA4A, 0x71B8, 0xEA4B, 0x71D6, 0xEA4C, 0x71C0, 0xEA4D, 0x71C1, 0xEA4E, 0x71CB, 0xEA4F, 0x71D4, 0xEA50, 0x71CA, + 0xEA51, 0x71C7, 0xEA52, 0x71CF, 0xEA53, 0x71BD, 0xEA54, 0x71D8, 0xEA55, 0x71BC, 0xEA56, 0x71C6, 0xEA57, 0x71DA, 0xEA58, 0x71DB, + 0xEA59, 0x729D, 0xEA5A, 0x729E, 0xEA5B, 0x7369, 0xEA5C, 0x7366, 0xEA5D, 0x7367, 0xEA5E, 0x736C, 0xEA5F, 0x7365, 0xEA60, 0x736B, + 0xEA61, 0x736A, 0xEA62, 0x747F, 0xEA63, 0x749A, 0xEA64, 0x74A0, 0xEA65, 0x7494, 0xEA66, 0x7492, 0xEA67, 0x7495, 0xEA68, 0x74A1, + 0xEA69, 0x750B, 0xEA6A, 0x7580, 0xEA6B, 0x762F, 0xEA6C, 0x762D, 0xEA6D, 0x7631, 0xEA6E, 0x763D, 0xEA6F, 0x7633, 0xEA70, 0x763C, + 0xEA71, 0x7635, 0xEA72, 0x7632, 0xEA73, 0x7630, 0xEA74, 0x76BB, 0xEA75, 0x76E6, 0xEA76, 0x779A, 0xEA77, 0x779D, 0xEA78, 0x77A1, + 0xEA79, 0x779C, 0xEA7A, 0x779B, 0xEA7B, 0x77A2, 0xEA7C, 0x77A3, 0xEA7D, 0x7795, 0xEA7E, 0x7799, 0xEAA1, 0x7797, 0xEAA2, 0x78DD, + 0xEAA3, 0x78E9, 0xEAA4, 0x78E5, 0xEAA5, 0x78EA, 0xEAA6, 0x78DE, 0xEAA7, 0x78E3, 0xEAA8, 0x78DB, 0xEAA9, 0x78E1, 0xEAAA, 0x78E2, + 0xEAAB, 0x78ED, 0xEAAC, 0x78DF, 0xEAAD, 0x78E0, 0xEAAE, 0x79A4, 0xEAAF, 0x7A44, 0xEAB0, 0x7A48, 0xEAB1, 0x7A47, 0xEAB2, 0x7AB6, + 0xEAB3, 0x7AB8, 0xEAB4, 0x7AB5, 0xEAB5, 0x7AB1, 0xEAB6, 0x7AB7, 0xEAB7, 0x7BDE, 0xEAB8, 0x7BE3, 0xEAB9, 0x7BE7, 0xEABA, 0x7BDD, + 0xEABB, 0x7BD5, 0xEABC, 0x7BE5, 0xEABD, 0x7BDA, 0xEABE, 0x7BE8, 0xEABF, 0x7BF9, 0xEAC0, 0x7BD4, 0xEAC1, 0x7BEA, 0xEAC2, 0x7BE2, + 0xEAC3, 0x7BDC, 0xEAC4, 0x7BEB, 0xEAC5, 0x7BD8, 0xEAC6, 0x7BDF, 0xEAC7, 0x7CD2, 0xEAC8, 0x7CD4, 0xEAC9, 0x7CD7, 0xEACA, 0x7CD0, + 0xEACB, 0x7CD1, 0xEACC, 0x7E12, 0xEACD, 0x7E21, 0xEACE, 0x7E17, 0xEACF, 0x7E0C, 0xEAD0, 0x7E1F, 0xEAD1, 0x7E20, 0xEAD2, 0x7E13, + 0xEAD3, 0x7E0E, 0xEAD4, 0x7E1C, 0xEAD5, 0x7E15, 0xEAD6, 0x7E1A, 0xEAD7, 0x7E22, 0xEAD8, 0x7E0B, 0xEAD9, 0x7E0F, 0xEADA, 0x7E16, + 0xEADB, 0x7E0D, 0xEADC, 0x7E14, 0xEADD, 0x7E25, 0xEADE, 0x7E24, 0xEADF, 0x7F43, 0xEAE0, 0x7F7B, 0xEAE1, 0x7F7C, 0xEAE2, 0x7F7A, + 0xEAE3, 0x7FB1, 0xEAE4, 0x7FEF, 0xEAE5, 0x802A, 0xEAE6, 0x8029, 0xEAE7, 0x806C, 0xEAE8, 0x81B1, 0xEAE9, 0x81A6, 0xEAEA, 0x81AE, + 0xEAEB, 0x81B9, 0xEAEC, 0x81B5, 0xEAED, 0x81AB, 0xEAEE, 0x81B0, 0xEAEF, 0x81AC, 0xEAF0, 0x81B4, 0xEAF1, 0x81B2, 0xEAF2, 0x81B7, + 0xEAF3, 0x81A7, 0xEAF4, 0x81F2, 0xEAF5, 0x8255, 0xEAF6, 0x8256, 0xEAF7, 0x8257, 0xEAF8, 0x8556, 0xEAF9, 0x8545, 0xEAFA, 0x856B, + 0xEAFB, 0x854D, 0xEAFC, 0x8553, 0xEAFD, 0x8561, 0xEAFE, 0x8558, 0xEB40, 0x8540, 0xEB41, 0x8546, 0xEB42, 0x8564, 0xEB43, 0x8541, + 0xEB44, 0x8562, 0xEB45, 0x8544, 0xEB46, 0x8551, 0xEB47, 0x8547, 0xEB48, 0x8563, 0xEB49, 0x853E, 0xEB4A, 0x855B, 0xEB4B, 0x8571, + 0xEB4C, 0x854E, 0xEB4D, 0x856E, 0xEB4E, 0x8575, 0xEB4F, 0x8555, 0xEB50, 0x8567, 0xEB51, 0x8560, 0xEB52, 0x858C, 0xEB53, 0x8566, + 0xEB54, 0x855D, 0xEB55, 0x8554, 0xEB56, 0x8565, 0xEB57, 0x856C, 0xEB58, 0x8663, 0xEB59, 0x8665, 0xEB5A, 0x8664, 0xEB5B, 0x879B, + 0xEB5C, 0x878F, 0xEB5D, 0x8797, 0xEB5E, 0x8793, 0xEB5F, 0x8792, 0xEB60, 0x8788, 0xEB61, 0x8781, 0xEB62, 0x8796, 0xEB63, 0x8798, + 0xEB64, 0x8779, 0xEB65, 0x8787, 0xEB66, 0x87A3, 0xEB67, 0x8785, 0xEB68, 0x8790, 0xEB69, 0x8791, 0xEB6A, 0x879D, 0xEB6B, 0x8784, + 0xEB6C, 0x8794, 0xEB6D, 0x879C, 0xEB6E, 0x879A, 0xEB6F, 0x8789, 0xEB70, 0x891E, 0xEB71, 0x8926, 0xEB72, 0x8930, 0xEB73, 0x892D, + 0xEB74, 0x892E, 0xEB75, 0x8927, 0xEB76, 0x8931, 0xEB77, 0x8922, 0xEB78, 0x8929, 0xEB79, 0x8923, 0xEB7A, 0x892F, 0xEB7B, 0x892C, + 0xEB7C, 0x891F, 0xEB7D, 0x89F1, 0xEB7E, 0x8AE0, 0xEBA1, 0x8AE2, 0xEBA2, 0x8AF2, 0xEBA3, 0x8AF4, 0xEBA4, 0x8AF5, 0xEBA5, 0x8ADD, + 0xEBA6, 0x8B14, 0xEBA7, 0x8AE4, 0xEBA8, 0x8ADF, 0xEBA9, 0x8AF0, 0xEBAA, 0x8AC8, 0xEBAB, 0x8ADE, 0xEBAC, 0x8AE1, 0xEBAD, 0x8AE8, + 0xEBAE, 0x8AFF, 0xEBAF, 0x8AEF, 0xEBB0, 0x8AFB, 0xEBB1, 0x8C91, 0xEBB2, 0x8C92, 0xEBB3, 0x8C90, 0xEBB4, 0x8CF5, 0xEBB5, 0x8CEE, + 0xEBB6, 0x8CF1, 0xEBB7, 0x8CF0, 0xEBB8, 0x8CF3, 0xEBB9, 0x8D6C, 0xEBBA, 0x8D6E, 0xEBBB, 0x8DA5, 0xEBBC, 0x8DA7, 0xEBBD, 0x8E33, + 0xEBBE, 0x8E3E, 0xEBBF, 0x8E38, 0xEBC0, 0x8E40, 0xEBC1, 0x8E45, 0xEBC2, 0x8E36, 0xEBC3, 0x8E3C, 0xEBC4, 0x8E3D, 0xEBC5, 0x8E41, + 0xEBC6, 0x8E30, 0xEBC7, 0x8E3F, 0xEBC8, 0x8EBD, 0xEBC9, 0x8F36, 0xEBCA, 0x8F2E, 0xEBCB, 0x8F35, 0xEBCC, 0x8F32, 0xEBCD, 0x8F39, + 0xEBCE, 0x8F37, 0xEBCF, 0x8F34, 0xEBD0, 0x9076, 0xEBD1, 0x9079, 0xEBD2, 0x907B, 0xEBD3, 0x9086, 0xEBD4, 0x90FA, 0xEBD5, 0x9133, + 0xEBD6, 0x9135, 0xEBD7, 0x9136, 0xEBD8, 0x9193, 0xEBD9, 0x9190, 0xEBDA, 0x9191, 0xEBDB, 0x918D, 0xEBDC, 0x918F, 0xEBDD, 0x9327, + 0xEBDE, 0x931E, 0xEBDF, 0x9308, 0xEBE0, 0x931F, 0xEBE1, 0x9306, 0xEBE2, 0x930F, 0xEBE3, 0x937A, 0xEBE4, 0x9338, 0xEBE5, 0x933C, + 0xEBE6, 0x931B, 0xEBE7, 0x9323, 0xEBE8, 0x9312, 0xEBE9, 0x9301, 0xEBEA, 0x9346, 0xEBEB, 0x932D, 0xEBEC, 0x930E, 0xEBED, 0x930D, + 0xEBEE, 0x92CB, 0xEBEF, 0x931D, 0xEBF0, 0x92FA, 0xEBF1, 0x9325, 0xEBF2, 0x9313, 0xEBF3, 0x92F9, 0xEBF4, 0x92F7, 0xEBF5, 0x9334, + 0xEBF6, 0x9302, 0xEBF7, 0x9324, 0xEBF8, 0x92FF, 0xEBF9, 0x9329, 0xEBFA, 0x9339, 0xEBFB, 0x9335, 0xEBFC, 0x932A, 0xEBFD, 0x9314, + 0xEBFE, 0x930C, 0xEC40, 0x930B, 0xEC41, 0x92FE, 0xEC42, 0x9309, 0xEC43, 0x9300, 0xEC44, 0x92FB, 0xEC45, 0x9316, 0xEC46, 0x95BC, + 0xEC47, 0x95CD, 0xEC48, 0x95BE, 0xEC49, 0x95B9, 0xEC4A, 0x95BA, 0xEC4B, 0x95B6, 0xEC4C, 0x95BF, 0xEC4D, 0x95B5, 0xEC4E, 0x95BD, + 0xEC4F, 0x96A9, 0xEC50, 0x96D4, 0xEC51, 0x970B, 0xEC52, 0x9712, 0xEC53, 0x9710, 0xEC54, 0x9799, 0xEC55, 0x9797, 0xEC56, 0x9794, + 0xEC57, 0x97F0, 0xEC58, 0x97F8, 0xEC59, 0x9835, 0xEC5A, 0x982F, 0xEC5B, 0x9832, 0xEC5C, 0x9924, 0xEC5D, 0x991F, 0xEC5E, 0x9927, + 0xEC5F, 0x9929, 0xEC60, 0x999E, 0xEC61, 0x99EE, 0xEC62, 0x99EC, 0xEC63, 0x99E5, 0xEC64, 0x99E4, 0xEC65, 0x99F0, 0xEC66, 0x99E3, + 0xEC67, 0x99EA, 0xEC68, 0x99E9, 0xEC69, 0x99E7, 0xEC6A, 0x9AB9, 0xEC6B, 0x9ABF, 0xEC6C, 0x9AB4, 0xEC6D, 0x9ABB, 0xEC6E, 0x9AF6, + 0xEC6F, 0x9AFA, 0xEC70, 0x9AF9, 0xEC71, 0x9AF7, 0xEC72, 0x9B33, 0xEC73, 0x9B80, 0xEC74, 0x9B85, 0xEC75, 0x9B87, 0xEC76, 0x9B7C, + 0xEC77, 0x9B7E, 0xEC78, 0x9B7B, 0xEC79, 0x9B82, 0xEC7A, 0x9B93, 0xEC7B, 0x9B92, 0xEC7C, 0x9B90, 0xEC7D, 0x9B7A, 0xEC7E, 0x9B95, + 0xECA1, 0x9B7D, 0xECA2, 0x9B88, 0xECA3, 0x9D25, 0xECA4, 0x9D17, 0xECA5, 0x9D20, 0xECA6, 0x9D1E, 0xECA7, 0x9D14, 0xECA8, 0x9D29, + 0xECA9, 0x9D1D, 0xECAA, 0x9D18, 0xECAB, 0x9D22, 0xECAC, 0x9D10, 0xECAD, 0x9D19, 0xECAE, 0x9D1F, 0xECAF, 0x9E88, 0xECB0, 0x9E86, + 0xECB1, 0x9E87, 0xECB2, 0x9EAE, 0xECB3, 0x9EAD, 0xECB4, 0x9ED5, 0xECB5, 0x9ED6, 0xECB6, 0x9EFA, 0xECB7, 0x9F12, 0xECB8, 0x9F3D, + 0xECB9, 0x5126, 0xECBA, 0x5125, 0xECBB, 0x5122, 0xECBC, 0x5124, 0xECBD, 0x5120, 0xECBE, 0x5129, 0xECBF, 0x52F4, 0xECC0, 0x5693, + 0xECC1, 0x568C, 0xECC2, 0x568D, 0xECC3, 0x5686, 0xECC4, 0x5684, 0xECC5, 0x5683, 0xECC6, 0x567E, 0xECC7, 0x5682, 0xECC8, 0x567F, + 0xECC9, 0x5681, 0xECCA, 0x58D6, 0xECCB, 0x58D4, 0xECCC, 0x58CF, 0xECCD, 0x58D2, 0xECCE, 0x5B2D, 0xECCF, 0x5B25, 0xECD0, 0x5B32, + 0xECD1, 0x5B23, 0xECD2, 0x5B2C, 0xECD3, 0x5B27, 0xECD4, 0x5B26, 0xECD5, 0x5B2F, 0xECD6, 0x5B2E, 0xECD7, 0x5B7B, 0xECD8, 0x5BF1, + 0xECD9, 0x5BF2, 0xECDA, 0x5DB7, 0xECDB, 0x5E6C, 0xECDC, 0x5E6A, 0xECDD, 0x5FBE, 0xECDE, 0x5FBB, 0xECDF, 0x61C3, 0xECE0, 0x61B5, + 0xECE1, 0x61BC, 0xECE2, 0x61E7, 0xECE3, 0x61E0, 0xECE4, 0x61E5, 0xECE5, 0x61E4, 0xECE6, 0x61E8, 0xECE7, 0x61DE, 0xECE8, 0x64EF, + 0xECE9, 0x64E9, 0xECEA, 0x64E3, 0xECEB, 0x64EB, 0xECEC, 0x64E4, 0xECED, 0x64E8, 0xECEE, 0x6581, 0xECEF, 0x6580, 0xECF0, 0x65B6, + 0xECF1, 0x65DA, 0xECF2, 0x66D2, 0xECF3, 0x6A8D, 0xECF4, 0x6A96, 0xECF5, 0x6A81, 0xECF6, 0x6AA5, 0xECF7, 0x6A89, 0xECF8, 0x6A9F, + 0xECF9, 0x6A9B, 0xECFA, 0x6AA1, 0xECFB, 0x6A9E, 0xECFC, 0x6A87, 0xECFD, 0x6A93, 0xECFE, 0x6A8E, 0xED40, 0x6A95, 0xED41, 0x6A83, + 0xED42, 0x6AA8, 0xED43, 0x6AA4, 0xED44, 0x6A91, 0xED45, 0x6A7F, 0xED46, 0x6AA6, 0xED47, 0x6A9A, 0xED48, 0x6A85, 0xED49, 0x6A8C, + 0xED4A, 0x6A92, 0xED4B, 0x6B5B, 0xED4C, 0x6BAD, 0xED4D, 0x6C09, 0xED4E, 0x6FCC, 0xED4F, 0x6FA9, 0xED50, 0x6FF4, 0xED51, 0x6FD4, + 0xED52, 0x6FE3, 0xED53, 0x6FDC, 0xED54, 0x6FED, 0xED55, 0x6FE7, 0xED56, 0x6FE6, 0xED57, 0x6FDE, 0xED58, 0x6FF2, 0xED59, 0x6FDD, + 0xED5A, 0x6FE2, 0xED5B, 0x6FE8, 0xED5C, 0x71E1, 0xED5D, 0x71F1, 0xED5E, 0x71E8, 0xED5F, 0x71F2, 0xED60, 0x71E4, 0xED61, 0x71F0, + 0xED62, 0x71E2, 0xED63, 0x7373, 0xED64, 0x736E, 0xED65, 0x736F, 0xED66, 0x7497, 0xED67, 0x74B2, 0xED68, 0x74AB, 0xED69, 0x7490, + 0xED6A, 0x74AA, 0xED6B, 0x74AD, 0xED6C, 0x74B1, 0xED6D, 0x74A5, 0xED6E, 0x74AF, 0xED6F, 0x7510, 0xED70, 0x7511, 0xED71, 0x7512, + 0xED72, 0x750F, 0xED73, 0x7584, 0xED74, 0x7643, 0xED75, 0x7648, 0xED76, 0x7649, 0xED77, 0x7647, 0xED78, 0x76A4, 0xED79, 0x76E9, + 0xED7A, 0x77B5, 0xED7B, 0x77AB, 0xED7C, 0x77B2, 0xED7D, 0x77B7, 0xED7E, 0x77B6, 0xEDA1, 0x77B4, 0xEDA2, 0x77B1, 0xEDA3, 0x77A8, + 0xEDA4, 0x77F0, 0xEDA5, 0x78F3, 0xEDA6, 0x78FD, 0xEDA7, 0x7902, 0xEDA8, 0x78FB, 0xEDA9, 0x78FC, 0xEDAA, 0x78F2, 0xEDAB, 0x7905, + 0xEDAC, 0x78F9, 0xEDAD, 0x78FE, 0xEDAE, 0x7904, 0xEDAF, 0x79AB, 0xEDB0, 0x79A8, 0xEDB1, 0x7A5C, 0xEDB2, 0x7A5B, 0xEDB3, 0x7A56, + 0xEDB4, 0x7A58, 0xEDB5, 0x7A54, 0xEDB6, 0x7A5A, 0xEDB7, 0x7ABE, 0xEDB8, 0x7AC0, 0xEDB9, 0x7AC1, 0xEDBA, 0x7C05, 0xEDBB, 0x7C0F, + 0xEDBC, 0x7BF2, 0xEDBD, 0x7C00, 0xEDBE, 0x7BFF, 0xEDBF, 0x7BFB, 0xEDC0, 0x7C0E, 0xEDC1, 0x7BF4, 0xEDC2, 0x7C0B, 0xEDC3, 0x7BF3, + 0xEDC4, 0x7C02, 0xEDC5, 0x7C09, 0xEDC6, 0x7C03, 0xEDC7, 0x7C01, 0xEDC8, 0x7BF8, 0xEDC9, 0x7BFD, 0xEDCA, 0x7C06, 0xEDCB, 0x7BF0, + 0xEDCC, 0x7BF1, 0xEDCD, 0x7C10, 0xEDCE, 0x7C0A, 0xEDCF, 0x7CE8, 0xEDD0, 0x7E2D, 0xEDD1, 0x7E3C, 0xEDD2, 0x7E42, 0xEDD3, 0x7E33, + 0xEDD4, 0x9848, 0xEDD5, 0x7E38, 0xEDD6, 0x7E2A, 0xEDD7, 0x7E49, 0xEDD8, 0x7E40, 0xEDD9, 0x7E47, 0xEDDA, 0x7E29, 0xEDDB, 0x7E4C, + 0xEDDC, 0x7E30, 0xEDDD, 0x7E3B, 0xEDDE, 0x7E36, 0xEDDF, 0x7E44, 0xEDE0, 0x7E3A, 0xEDE1, 0x7F45, 0xEDE2, 0x7F7F, 0xEDE3, 0x7F7E, + 0xEDE4, 0x7F7D, 0xEDE5, 0x7FF4, 0xEDE6, 0x7FF2, 0xEDE7, 0x802C, 0xEDE8, 0x81BB, 0xEDE9, 0x81C4, 0xEDEA, 0x81CC, 0xEDEB, 0x81CA, + 0xEDEC, 0x81C5, 0xEDED, 0x81C7, 0xEDEE, 0x81BC, 0xEDEF, 0x81E9, 0xEDF0, 0x825B, 0xEDF1, 0x825A, 0xEDF2, 0x825C, 0xEDF3, 0x8583, + 0xEDF4, 0x8580, 0xEDF5, 0x858F, 0xEDF6, 0x85A7, 0xEDF7, 0x8595, 0xEDF8, 0x85A0, 0xEDF9, 0x858B, 0xEDFA, 0x85A3, 0xEDFB, 0x857B, + 0xEDFC, 0x85A4, 0xEDFD, 0x859A, 0xEDFE, 0x859E, 0xEE40, 0x8577, 0xEE41, 0x857C, 0xEE42, 0x8589, 0xEE43, 0x85A1, 0xEE44, 0x857A, + 0xEE45, 0x8578, 0xEE46, 0x8557, 0xEE47, 0x858E, 0xEE48, 0x8596, 0xEE49, 0x8586, 0xEE4A, 0x858D, 0xEE4B, 0x8599, 0xEE4C, 0x859D, + 0xEE4D, 0x8581, 0xEE4E, 0x85A2, 0xEE4F, 0x8582, 0xEE50, 0x8588, 0xEE51, 0x8585, 0xEE52, 0x8579, 0xEE53, 0x8576, 0xEE54, 0x8598, + 0xEE55, 0x8590, 0xEE56, 0x859F, 0xEE57, 0x8668, 0xEE58, 0x87BE, 0xEE59, 0x87AA, 0xEE5A, 0x87AD, 0xEE5B, 0x87C5, 0xEE5C, 0x87B0, + 0xEE5D, 0x87AC, 0xEE5E, 0x87B9, 0xEE5F, 0x87B5, 0xEE60, 0x87BC, 0xEE61, 0x87AE, 0xEE62, 0x87C9, 0xEE63, 0x87C3, 0xEE64, 0x87C2, + 0xEE65, 0x87CC, 0xEE66, 0x87B7, 0xEE67, 0x87AF, 0xEE68, 0x87C4, 0xEE69, 0x87CA, 0xEE6A, 0x87B4, 0xEE6B, 0x87B6, 0xEE6C, 0x87BF, + 0xEE6D, 0x87B8, 0xEE6E, 0x87BD, 0xEE6F, 0x87DE, 0xEE70, 0x87B2, 0xEE71, 0x8935, 0xEE72, 0x8933, 0xEE73, 0x893C, 0xEE74, 0x893E, + 0xEE75, 0x8941, 0xEE76, 0x8952, 0xEE77, 0x8937, 0xEE78, 0x8942, 0xEE79, 0x89AD, 0xEE7A, 0x89AF, 0xEE7B, 0x89AE, 0xEE7C, 0x89F2, + 0xEE7D, 0x89F3, 0xEE7E, 0x8B1E, 0xEEA1, 0x8B18, 0xEEA2, 0x8B16, 0xEEA3, 0x8B11, 0xEEA4, 0x8B05, 0xEEA5, 0x8B0B, 0xEEA6, 0x8B22, + 0xEEA7, 0x8B0F, 0xEEA8, 0x8B12, 0xEEA9, 0x8B15, 0xEEAA, 0x8B07, 0xEEAB, 0x8B0D, 0xEEAC, 0x8B08, 0xEEAD, 0x8B06, 0xEEAE, 0x8B1C, + 0xEEAF, 0x8B13, 0xEEB0, 0x8B1A, 0xEEB1, 0x8C4F, 0xEEB2, 0x8C70, 0xEEB3, 0x8C72, 0xEEB4, 0x8C71, 0xEEB5, 0x8C6F, 0xEEB6, 0x8C95, + 0xEEB7, 0x8C94, 0xEEB8, 0x8CF9, 0xEEB9, 0x8D6F, 0xEEBA, 0x8E4E, 0xEEBB, 0x8E4D, 0xEEBC, 0x8E53, 0xEEBD, 0x8E50, 0xEEBE, 0x8E4C, + 0xEEBF, 0x8E47, 0xEEC0, 0x8F43, 0xEEC1, 0x8F40, 0xEEC2, 0x9085, 0xEEC3, 0x907E, 0xEEC4, 0x9138, 0xEEC5, 0x919A, 0xEEC6, 0x91A2, + 0xEEC7, 0x919B, 0xEEC8, 0x9199, 0xEEC9, 0x919F, 0xEECA, 0x91A1, 0xEECB, 0x919D, 0xEECC, 0x91A0, 0xEECD, 0x93A1, 0xEECE, 0x9383, + 0xEECF, 0x93AF, 0xEED0, 0x9364, 0xEED1, 0x9356, 0xEED2, 0x9347, 0xEED3, 0x937C, 0xEED4, 0x9358, 0xEED5, 0x935C, 0xEED6, 0x9376, + 0xEED7, 0x9349, 0xEED8, 0x9350, 0xEED9, 0x9351, 0xEEDA, 0x9360, 0xEEDB, 0x936D, 0xEEDC, 0x938F, 0xEEDD, 0x934C, 0xEEDE, 0x936A, + 0xEEDF, 0x9379, 0xEEE0, 0x9357, 0xEEE1, 0x9355, 0xEEE2, 0x9352, 0xEEE3, 0x934F, 0xEEE4, 0x9371, 0xEEE5, 0x9377, 0xEEE6, 0x937B, + 0xEEE7, 0x9361, 0xEEE8, 0x935E, 0xEEE9, 0x9363, 0xEEEA, 0x9367, 0xEEEB, 0x9380, 0xEEEC, 0x934E, 0xEEED, 0x9359, 0xEEEE, 0x95C7, + 0xEEEF, 0x95C0, 0xEEF0, 0x95C9, 0xEEF1, 0x95C3, 0xEEF2, 0x95C5, 0xEEF3, 0x95B7, 0xEEF4, 0x96AE, 0xEEF5, 0x96B0, 0xEEF6, 0x96AC, + 0xEEF7, 0x9720, 0xEEF8, 0x971F, 0xEEF9, 0x9718, 0xEEFA, 0x971D, 0xEEFB, 0x9719, 0xEEFC, 0x979A, 0xEEFD, 0x97A1, 0xEEFE, 0x979C, + 0xEF40, 0x979E, 0xEF41, 0x979D, 0xEF42, 0x97D5, 0xEF43, 0x97D4, 0xEF44, 0x97F1, 0xEF45, 0x9841, 0xEF46, 0x9844, 0xEF47, 0x984A, + 0xEF48, 0x9849, 0xEF49, 0x9845, 0xEF4A, 0x9843, 0xEF4B, 0x9925, 0xEF4C, 0x992B, 0xEF4D, 0x992C, 0xEF4E, 0x992A, 0xEF4F, 0x9933, + 0xEF50, 0x9932, 0xEF51, 0x992F, 0xEF52, 0x992D, 0xEF53, 0x9931, 0xEF54, 0x9930, 0xEF55, 0x9998, 0xEF56, 0x99A3, 0xEF57, 0x99A1, + 0xEF58, 0x9A02, 0xEF59, 0x99FA, 0xEF5A, 0x99F4, 0xEF5B, 0x99F7, 0xEF5C, 0x99F9, 0xEF5D, 0x99F8, 0xEF5E, 0x99F6, 0xEF5F, 0x99FB, + 0xEF60, 0x99FD, 0xEF61, 0x99FE, 0xEF62, 0x99FC, 0xEF63, 0x9A03, 0xEF64, 0x9ABE, 0xEF65, 0x9AFE, 0xEF66, 0x9AFD, 0xEF67, 0x9B01, + 0xEF68, 0x9AFC, 0xEF69, 0x9B48, 0xEF6A, 0x9B9A, 0xEF6B, 0x9BA8, 0xEF6C, 0x9B9E, 0xEF6D, 0x9B9B, 0xEF6E, 0x9BA6, 0xEF6F, 0x9BA1, + 0xEF70, 0x9BA5, 0xEF71, 0x9BA4, 0xEF72, 0x9B86, 0xEF73, 0x9BA2, 0xEF74, 0x9BA0, 0xEF75, 0x9BAF, 0xEF76, 0x9D33, 0xEF77, 0x9D41, + 0xEF78, 0x9D67, 0xEF79, 0x9D36, 0xEF7A, 0x9D2E, 0xEF7B, 0x9D2F, 0xEF7C, 0x9D31, 0xEF7D, 0x9D38, 0xEF7E, 0x9D30, 0xEFA1, 0x9D45, + 0xEFA2, 0x9D42, 0xEFA3, 0x9D43, 0xEFA4, 0x9D3E, 0xEFA5, 0x9D37, 0xEFA6, 0x9D40, 0xEFA7, 0x9D3D, 0xEFA8, 0x7FF5, 0xEFA9, 0x9D2D, + 0xEFAA, 0x9E8A, 0xEFAB, 0x9E89, 0xEFAC, 0x9E8D, 0xEFAD, 0x9EB0, 0xEFAE, 0x9EC8, 0xEFAF, 0x9EDA, 0xEFB0, 0x9EFB, 0xEFB1, 0x9EFF, + 0xEFB2, 0x9F24, 0xEFB3, 0x9F23, 0xEFB4, 0x9F22, 0xEFB5, 0x9F54, 0xEFB6, 0x9FA0, 0xEFB7, 0x5131, 0xEFB8, 0x512D, 0xEFB9, 0x512E, + 0xEFBA, 0x5698, 0xEFBB, 0x569C, 0xEFBC, 0x5697, 0xEFBD, 0x569A, 0xEFBE, 0x569D, 0xEFBF, 0x5699, 0xEFC0, 0x5970, 0xEFC1, 0x5B3C, + 0xEFC2, 0x5C69, 0xEFC3, 0x5C6A, 0xEFC4, 0x5DC0, 0xEFC5, 0x5E6D, 0xEFC6, 0x5E6E, 0xEFC7, 0x61D8, 0xEFC8, 0x61DF, 0xEFC9, 0x61ED, + 0xEFCA, 0x61EE, 0xEFCB, 0x61F1, 0xEFCC, 0x61EA, 0xEFCD, 0x61F0, 0xEFCE, 0x61EB, 0xEFCF, 0x61D6, 0xEFD0, 0x61E9, 0xEFD1, 0x64FF, + 0xEFD2, 0x6504, 0xEFD3, 0x64FD, 0xEFD4, 0x64F8, 0xEFD5, 0x6501, 0xEFD6, 0x6503, 0xEFD7, 0x64FC, 0xEFD8, 0x6594, 0xEFD9, 0x65DB, + 0xEFDA, 0x66DA, 0xEFDB, 0x66DB, 0xEFDC, 0x66D8, 0xEFDD, 0x6AC5, 0xEFDE, 0x6AB9, 0xEFDF, 0x6ABD, 0xEFE0, 0x6AE1, 0xEFE1, 0x6AC6, + 0xEFE2, 0x6ABA, 0xEFE3, 0x6AB6, 0xEFE4, 0x6AB7, 0xEFE5, 0x6AC7, 0xEFE6, 0x6AB4, 0xEFE7, 0x6AAD, 0xEFE8, 0x6B5E, 0xEFE9, 0x6BC9, + 0xEFEA, 0x6C0B, 0xEFEB, 0x7007, 0xEFEC, 0x700C, 0xEFED, 0x700D, 0xEFEE, 0x7001, 0xEFEF, 0x7005, 0xEFF0, 0x7014, 0xEFF1, 0x700E, + 0xEFF2, 0x6FFF, 0xEFF3, 0x7000, 0xEFF4, 0x6FFB, 0xEFF5, 0x7026, 0xEFF6, 0x6FFC, 0xEFF7, 0x6FF7, 0xEFF8, 0x700A, 0xEFF9, 0x7201, + 0xEFFA, 0x71FF, 0xEFFB, 0x71F9, 0xEFFC, 0x7203, 0xEFFD, 0x71FD, 0xEFFE, 0x7376, 0xF040, 0x74B8, 0xF041, 0x74C0, 0xF042, 0x74B5, + 0xF043, 0x74C1, 0xF044, 0x74BE, 0xF045, 0x74B6, 0xF046, 0x74BB, 0xF047, 0x74C2, 0xF048, 0x7514, 0xF049, 0x7513, 0xF04A, 0x765C, + 0xF04B, 0x7664, 0xF04C, 0x7659, 0xF04D, 0x7650, 0xF04E, 0x7653, 0xF04F, 0x7657, 0xF050, 0x765A, 0xF051, 0x76A6, 0xF052, 0x76BD, + 0xF053, 0x76EC, 0xF054, 0x77C2, 0xF055, 0x77BA, 0xF056, 0x78FF, 0xF057, 0x790C, 0xF058, 0x7913, 0xF059, 0x7914, 0xF05A, 0x7909, + 0xF05B, 0x7910, 0xF05C, 0x7912, 0xF05D, 0x7911, 0xF05E, 0x79AD, 0xF05F, 0x79AC, 0xF060, 0x7A5F, 0xF061, 0x7C1C, 0xF062, 0x7C29, + 0xF063, 0x7C19, 0xF064, 0x7C20, 0xF065, 0x7C1F, 0xF066, 0x7C2D, 0xF067, 0x7C1D, 0xF068, 0x7C26, 0xF069, 0x7C28, 0xF06A, 0x7C22, + 0xF06B, 0x7C25, 0xF06C, 0x7C30, 0xF06D, 0x7E5C, 0xF06E, 0x7E50, 0xF06F, 0x7E56, 0xF070, 0x7E63, 0xF071, 0x7E58, 0xF072, 0x7E62, + 0xF073, 0x7E5F, 0xF074, 0x7E51, 0xF075, 0x7E60, 0xF076, 0x7E57, 0xF077, 0x7E53, 0xF078, 0x7FB5, 0xF079, 0x7FB3, 0xF07A, 0x7FF7, + 0xF07B, 0x7FF8, 0xF07C, 0x8075, 0xF07D, 0x81D1, 0xF07E, 0x81D2, 0xF0A1, 0x81D0, 0xF0A2, 0x825F, 0xF0A3, 0x825E, 0xF0A4, 0x85B4, + 0xF0A5, 0x85C6, 0xF0A6, 0x85C0, 0xF0A7, 0x85C3, 0xF0A8, 0x85C2, 0xF0A9, 0x85B3, 0xF0AA, 0x85B5, 0xF0AB, 0x85BD, 0xF0AC, 0x85C7, + 0xF0AD, 0x85C4, 0xF0AE, 0x85BF, 0xF0AF, 0x85CB, 0xF0B0, 0x85CE, 0xF0B1, 0x85C8, 0xF0B2, 0x85C5, 0xF0B3, 0x85B1, 0xF0B4, 0x85B6, + 0xF0B5, 0x85D2, 0xF0B6, 0x8624, 0xF0B7, 0x85B8, 0xF0B8, 0x85B7, 0xF0B9, 0x85BE, 0xF0BA, 0x8669, 0xF0BB, 0x87E7, 0xF0BC, 0x87E6, + 0xF0BD, 0x87E2, 0xF0BE, 0x87DB, 0xF0BF, 0x87EB, 0xF0C0, 0x87EA, 0xF0C1, 0x87E5, 0xF0C2, 0x87DF, 0xF0C3, 0x87F3, 0xF0C4, 0x87E4, + 0xF0C5, 0x87D4, 0xF0C6, 0x87DC, 0xF0C7, 0x87D3, 0xF0C8, 0x87ED, 0xF0C9, 0x87D8, 0xF0CA, 0x87E3, 0xF0CB, 0x87A4, 0xF0CC, 0x87D7, + 0xF0CD, 0x87D9, 0xF0CE, 0x8801, 0xF0CF, 0x87F4, 0xF0D0, 0x87E8, 0xF0D1, 0x87DD, 0xF0D2, 0x8953, 0xF0D3, 0x894B, 0xF0D4, 0x894F, + 0xF0D5, 0x894C, 0xF0D6, 0x8946, 0xF0D7, 0x8950, 0xF0D8, 0x8951, 0xF0D9, 0x8949, 0xF0DA, 0x8B2A, 0xF0DB, 0x8B27, 0xF0DC, 0x8B23, + 0xF0DD, 0x8B33, 0xF0DE, 0x8B30, 0xF0DF, 0x8B35, 0xF0E0, 0x8B47, 0xF0E1, 0x8B2F, 0xF0E2, 0x8B3C, 0xF0E3, 0x8B3E, 0xF0E4, 0x8B31, + 0xF0E5, 0x8B25, 0xF0E6, 0x8B37, 0xF0E7, 0x8B26, 0xF0E8, 0x8B36, 0xF0E9, 0x8B2E, 0xF0EA, 0x8B24, 0xF0EB, 0x8B3B, 0xF0EC, 0x8B3D, + 0xF0ED, 0x8B3A, 0xF0EE, 0x8C42, 0xF0EF, 0x8C75, 0xF0F0, 0x8C99, 0xF0F1, 0x8C98, 0xF0F2, 0x8C97, 0xF0F3, 0x8CFE, 0xF0F4, 0x8D04, + 0xF0F5, 0x8D02, 0xF0F6, 0x8D00, 0xF0F7, 0x8E5C, 0xF0F8, 0x8E62, 0xF0F9, 0x8E60, 0xF0FA, 0x8E57, 0xF0FB, 0x8E56, 0xF0FC, 0x8E5E, + 0xF0FD, 0x8E65, 0xF0FE, 0x8E67, 0xF140, 0x8E5B, 0xF141, 0x8E5A, 0xF142, 0x8E61, 0xF143, 0x8E5D, 0xF144, 0x8E69, 0xF145, 0x8E54, + 0xF146, 0x8F46, 0xF147, 0x8F47, 0xF148, 0x8F48, 0xF149, 0x8F4B, 0xF14A, 0x9128, 0xF14B, 0x913A, 0xF14C, 0x913B, 0xF14D, 0x913E, + 0xF14E, 0x91A8, 0xF14F, 0x91A5, 0xF150, 0x91A7, 0xF151, 0x91AF, 0xF152, 0x91AA, 0xF153, 0x93B5, 0xF154, 0x938C, 0xF155, 0x9392, + 0xF156, 0x93B7, 0xF157, 0x939B, 0xF158, 0x939D, 0xF159, 0x9389, 0xF15A, 0x93A7, 0xF15B, 0x938E, 0xF15C, 0x93AA, 0xF15D, 0x939E, + 0xF15E, 0x93A6, 0xF15F, 0x9395, 0xF160, 0x9388, 0xF161, 0x9399, 0xF162, 0x939F, 0xF163, 0x938D, 0xF164, 0x93B1, 0xF165, 0x9391, + 0xF166, 0x93B2, 0xF167, 0x93A4, 0xF168, 0x93A8, 0xF169, 0x93B4, 0xF16A, 0x93A3, 0xF16B, 0x93A5, 0xF16C, 0x95D2, 0xF16D, 0x95D3, + 0xF16E, 0x95D1, 0xF16F, 0x96B3, 0xF170, 0x96D7, 0xF171, 0x96DA, 0xF172, 0x5DC2, 0xF173, 0x96DF, 0xF174, 0x96D8, 0xF175, 0x96DD, + 0xF176, 0x9723, 0xF177, 0x9722, 0xF178, 0x9725, 0xF179, 0x97AC, 0xF17A, 0x97AE, 0xF17B, 0x97A8, 0xF17C, 0x97AB, 0xF17D, 0x97A4, + 0xF17E, 0x97AA, 0xF1A1, 0x97A2, 0xF1A2, 0x97A5, 0xF1A3, 0x97D7, 0xF1A4, 0x97D9, 0xF1A5, 0x97D6, 0xF1A6, 0x97D8, 0xF1A7, 0x97FA, + 0xF1A8, 0x9850, 0xF1A9, 0x9851, 0xF1AA, 0x9852, 0xF1AB, 0x98B8, 0xF1AC, 0x9941, 0xF1AD, 0x993C, 0xF1AE, 0x993A, 0xF1AF, 0x9A0F, + 0xF1B0, 0x9A0B, 0xF1B1, 0x9A09, 0xF1B2, 0x9A0D, 0xF1B3, 0x9A04, 0xF1B4, 0x9A11, 0xF1B5, 0x9A0A, 0xF1B6, 0x9A05, 0xF1B7, 0x9A07, + 0xF1B8, 0x9A06, 0xF1B9, 0x9AC0, 0xF1BA, 0x9ADC, 0xF1BB, 0x9B08, 0xF1BC, 0x9B04, 0xF1BD, 0x9B05, 0xF1BE, 0x9B29, 0xF1BF, 0x9B35, + 0xF1C0, 0x9B4A, 0xF1C1, 0x9B4C, 0xF1C2, 0x9B4B, 0xF1C3, 0x9BC7, 0xF1C4, 0x9BC6, 0xF1C5, 0x9BC3, 0xF1C6, 0x9BBF, 0xF1C7, 0x9BC1, + 0xF1C8, 0x9BB5, 0xF1C9, 0x9BB8, 0xF1CA, 0x9BD3, 0xF1CB, 0x9BB6, 0xF1CC, 0x9BC4, 0xF1CD, 0x9BB9, 0xF1CE, 0x9BBD, 0xF1CF, 0x9D5C, + 0xF1D0, 0x9D53, 0xF1D1, 0x9D4F, 0xF1D2, 0x9D4A, 0xF1D3, 0x9D5B, 0xF1D4, 0x9D4B, 0xF1D5, 0x9D59, 0xF1D6, 0x9D56, 0xF1D7, 0x9D4C, + 0xF1D8, 0x9D57, 0xF1D9, 0x9D52, 0xF1DA, 0x9D54, 0xF1DB, 0x9D5F, 0xF1DC, 0x9D58, 0xF1DD, 0x9D5A, 0xF1DE, 0x9E8E, 0xF1DF, 0x9E8C, + 0xF1E0, 0x9EDF, 0xF1E1, 0x9F01, 0xF1E2, 0x9F00, 0xF1E3, 0x9F16, 0xF1E4, 0x9F25, 0xF1E5, 0x9F2B, 0xF1E6, 0x9F2A, 0xF1E7, 0x9F29, + 0xF1E8, 0x9F28, 0xF1E9, 0x9F4C, 0xF1EA, 0x9F55, 0xF1EB, 0x5134, 0xF1EC, 0x5135, 0xF1ED, 0x5296, 0xF1EE, 0x52F7, 0xF1EF, 0x53B4, + 0xF1F0, 0x56AB, 0xF1F1, 0x56AD, 0xF1F2, 0x56A6, 0xF1F3, 0x56A7, 0xF1F4, 0x56AA, 0xF1F5, 0x56AC, 0xF1F6, 0x58DA, 0xF1F7, 0x58DD, + 0xF1F8, 0x58DB, 0xF1F9, 0x5912, 0xF1FA, 0x5B3D, 0xF1FB, 0x5B3E, 0xF1FC, 0x5B3F, 0xF1FD, 0x5DC3, 0xF1FE, 0x5E70, 0xF240, 0x5FBF, + 0xF241, 0x61FB, 0xF242, 0x6507, 0xF243, 0x6510, 0xF244, 0x650D, 0xF245, 0x6509, 0xF246, 0x650C, 0xF247, 0x650E, 0xF248, 0x6584, + 0xF249, 0x65DE, 0xF24A, 0x65DD, 0xF24B, 0x66DE, 0xF24C, 0x6AE7, 0xF24D, 0x6AE0, 0xF24E, 0x6ACC, 0xF24F, 0x6AD1, 0xF250, 0x6AD9, + 0xF251, 0x6ACB, 0xF252, 0x6ADF, 0xF253, 0x6ADC, 0xF254, 0x6AD0, 0xF255, 0x6AEB, 0xF256, 0x6ACF, 0xF257, 0x6ACD, 0xF258, 0x6ADE, + 0xF259, 0x6B60, 0xF25A, 0x6BB0, 0xF25B, 0x6C0C, 0xF25C, 0x7019, 0xF25D, 0x7027, 0xF25E, 0x7020, 0xF25F, 0x7016, 0xF260, 0x702B, + 0xF261, 0x7021, 0xF262, 0x7022, 0xF263, 0x7023, 0xF264, 0x7029, 0xF265, 0x7017, 0xF266, 0x7024, 0xF267, 0x701C, 0xF268, 0x702A, + 0xF269, 0x720C, 0xF26A, 0x720A, 0xF26B, 0x7207, 0xF26C, 0x7202, 0xF26D, 0x7205, 0xF26E, 0x72A5, 0xF26F, 0x72A6, 0xF270, 0x72A4, + 0xF271, 0x72A3, 0xF272, 0x72A1, 0xF273, 0x74CB, 0xF274, 0x74C5, 0xF275, 0x74B7, 0xF276, 0x74C3, 0xF277, 0x7516, 0xF278, 0x7660, + 0xF279, 0x77C9, 0xF27A, 0x77CA, 0xF27B, 0x77C4, 0xF27C, 0x77F1, 0xF27D, 0x791D, 0xF27E, 0x791B, 0xF2A1, 0x7921, 0xF2A2, 0x791C, + 0xF2A3, 0x7917, 0xF2A4, 0x791E, 0xF2A5, 0x79B0, 0xF2A6, 0x7A67, 0xF2A7, 0x7A68, 0xF2A8, 0x7C33, 0xF2A9, 0x7C3C, 0xF2AA, 0x7C39, + 0xF2AB, 0x7C2C, 0xF2AC, 0x7C3B, 0xF2AD, 0x7CEC, 0xF2AE, 0x7CEA, 0xF2AF, 0x7E76, 0xF2B0, 0x7E75, 0xF2B1, 0x7E78, 0xF2B2, 0x7E70, + 0xF2B3, 0x7E77, 0xF2B4, 0x7E6F, 0xF2B5, 0x7E7A, 0xF2B6, 0x7E72, 0xF2B7, 0x7E74, 0xF2B8, 0x7E68, 0xF2B9, 0x7F4B, 0xF2BA, 0x7F4A, + 0xF2BB, 0x7F83, 0xF2BC, 0x7F86, 0xF2BD, 0x7FB7, 0xF2BE, 0x7FFD, 0xF2BF, 0x7FFE, 0xF2C0, 0x8078, 0xF2C1, 0x81D7, 0xF2C2, 0x81D5, + 0xF2C3, 0x8264, 0xF2C4, 0x8261, 0xF2C5, 0x8263, 0xF2C6, 0x85EB, 0xF2C7, 0x85F1, 0xF2C8, 0x85ED, 0xF2C9, 0x85D9, 0xF2CA, 0x85E1, + 0xF2CB, 0x85E8, 0xF2CC, 0x85DA, 0xF2CD, 0x85D7, 0xF2CE, 0x85EC, 0xF2CF, 0x85F2, 0xF2D0, 0x85F8, 0xF2D1, 0x85D8, 0xF2D2, 0x85DF, + 0xF2D3, 0x85E3, 0xF2D4, 0x85DC, 0xF2D5, 0x85D1, 0xF2D6, 0x85F0, 0xF2D7, 0x85E6, 0xF2D8, 0x85EF, 0xF2D9, 0x85DE, 0xF2DA, 0x85E2, + 0xF2DB, 0x8800, 0xF2DC, 0x87FA, 0xF2DD, 0x8803, 0xF2DE, 0x87F6, 0xF2DF, 0x87F7, 0xF2E0, 0x8809, 0xF2E1, 0x880C, 0xF2E2, 0x880B, + 0xF2E3, 0x8806, 0xF2E4, 0x87FC, 0xF2E5, 0x8808, 0xF2E6, 0x87FF, 0xF2E7, 0x880A, 0xF2E8, 0x8802, 0xF2E9, 0x8962, 0xF2EA, 0x895A, + 0xF2EB, 0x895B, 0xF2EC, 0x8957, 0xF2ED, 0x8961, 0xF2EE, 0x895C, 0xF2EF, 0x8958, 0xF2F0, 0x895D, 0xF2F1, 0x8959, 0xF2F2, 0x8988, + 0xF2F3, 0x89B7, 0xF2F4, 0x89B6, 0xF2F5, 0x89F6, 0xF2F6, 0x8B50, 0xF2F7, 0x8B48, 0xF2F8, 0x8B4A, 0xF2F9, 0x8B40, 0xF2FA, 0x8B53, + 0xF2FB, 0x8B56, 0xF2FC, 0x8B54, 0xF2FD, 0x8B4B, 0xF2FE, 0x8B55, 0xF340, 0x8B51, 0xF341, 0x8B42, 0xF342, 0x8B52, 0xF343, 0x8B57, + 0xF344, 0x8C43, 0xF345, 0x8C77, 0xF346, 0x8C76, 0xF347, 0x8C9A, 0xF348, 0x8D06, 0xF349, 0x8D07, 0xF34A, 0x8D09, 0xF34B, 0x8DAC, + 0xF34C, 0x8DAA, 0xF34D, 0x8DAD, 0xF34E, 0x8DAB, 0xF34F, 0x8E6D, 0xF350, 0x8E78, 0xF351, 0x8E73, 0xF352, 0x8E6A, 0xF353, 0x8E6F, + 0xF354, 0x8E7B, 0xF355, 0x8EC2, 0xF356, 0x8F52, 0xF357, 0x8F51, 0xF358, 0x8F4F, 0xF359, 0x8F50, 0xF35A, 0x8F53, 0xF35B, 0x8FB4, + 0xF35C, 0x9140, 0xF35D, 0x913F, 0xF35E, 0x91B0, 0xF35F, 0x91AD, 0xF360, 0x93DE, 0xF361, 0x93C7, 0xF362, 0x93CF, 0xF363, 0x93C2, + 0xF364, 0x93DA, 0xF365, 0x93D0, 0xF366, 0x93F9, 0xF367, 0x93EC, 0xF368, 0x93CC, 0xF369, 0x93D9, 0xF36A, 0x93A9, 0xF36B, 0x93E6, + 0xF36C, 0x93CA, 0xF36D, 0x93D4, 0xF36E, 0x93EE, 0xF36F, 0x93E3, 0xF370, 0x93D5, 0xF371, 0x93C4, 0xF372, 0x93CE, 0xF373, 0x93C0, + 0xF374, 0x93D2, 0xF375, 0x93E7, 0xF376, 0x957D, 0xF377, 0x95DA, 0xF378, 0x95DB, 0xF379, 0x96E1, 0xF37A, 0x9729, 0xF37B, 0x972B, + 0xF37C, 0x972C, 0xF37D, 0x9728, 0xF37E, 0x9726, 0xF3A1, 0x97B3, 0xF3A2, 0x97B7, 0xF3A3, 0x97B6, 0xF3A4, 0x97DD, 0xF3A5, 0x97DE, + 0xF3A6, 0x97DF, 0xF3A7, 0x985C, 0xF3A8, 0x9859, 0xF3A9, 0x985D, 0xF3AA, 0x9857, 0xF3AB, 0x98BF, 0xF3AC, 0x98BD, 0xF3AD, 0x98BB, + 0xF3AE, 0x98BE, 0xF3AF, 0x9948, 0xF3B0, 0x9947, 0xF3B1, 0x9943, 0xF3B2, 0x99A6, 0xF3B3, 0x99A7, 0xF3B4, 0x9A1A, 0xF3B5, 0x9A15, + 0xF3B6, 0x9A25, 0xF3B7, 0x9A1D, 0xF3B8, 0x9A24, 0xF3B9, 0x9A1B, 0xF3BA, 0x9A22, 0xF3BB, 0x9A20, 0xF3BC, 0x9A27, 0xF3BD, 0x9A23, + 0xF3BE, 0x9A1E, 0xF3BF, 0x9A1C, 0xF3C0, 0x9A14, 0xF3C1, 0x9AC2, 0xF3C2, 0x9B0B, 0xF3C3, 0x9B0A, 0xF3C4, 0x9B0E, 0xF3C5, 0x9B0C, + 0xF3C6, 0x9B37, 0xF3C7, 0x9BEA, 0xF3C8, 0x9BEB, 0xF3C9, 0x9BE0, 0xF3CA, 0x9BDE, 0xF3CB, 0x9BE4, 0xF3CC, 0x9BE6, 0xF3CD, 0x9BE2, + 0xF3CE, 0x9BF0, 0xF3CF, 0x9BD4, 0xF3D0, 0x9BD7, 0xF3D1, 0x9BEC, 0xF3D2, 0x9BDC, 0xF3D3, 0x9BD9, 0xF3D4, 0x9BE5, 0xF3D5, 0x9BD5, + 0xF3D6, 0x9BE1, 0xF3D7, 0x9BDA, 0xF3D8, 0x9D77, 0xF3D9, 0x9D81, 0xF3DA, 0x9D8A, 0xF3DB, 0x9D84, 0xF3DC, 0x9D88, 0xF3DD, 0x9D71, + 0xF3DE, 0x9D80, 0xF3DF, 0x9D78, 0xF3E0, 0x9D86, 0xF3E1, 0x9D8B, 0xF3E2, 0x9D8C, 0xF3E3, 0x9D7D, 0xF3E4, 0x9D6B, 0xF3E5, 0x9D74, + 0xF3E6, 0x9D75, 0xF3E7, 0x9D70, 0xF3E8, 0x9D69, 0xF3E9, 0x9D85, 0xF3EA, 0x9D73, 0xF3EB, 0x9D7B, 0xF3EC, 0x9D82, 0xF3ED, 0x9D6F, + 0xF3EE, 0x9D79, 0xF3EF, 0x9D7F, 0xF3F0, 0x9D87, 0xF3F1, 0x9D68, 0xF3F2, 0x9E94, 0xF3F3, 0x9E91, 0xF3F4, 0x9EC0, 0xF3F5, 0x9EFC, + 0xF3F6, 0x9F2D, 0xF3F7, 0x9F40, 0xF3F8, 0x9F41, 0xF3F9, 0x9F4D, 0xF3FA, 0x9F56, 0xF3FB, 0x9F57, 0xF3FC, 0x9F58, 0xF3FD, 0x5337, + 0xF3FE, 0x56B2, 0xF440, 0x56B5, 0xF441, 0x56B3, 0xF442, 0x58E3, 0xF443, 0x5B45, 0xF444, 0x5DC6, 0xF445, 0x5DC7, 0xF446, 0x5EEE, + 0xF447, 0x5EEF, 0xF448, 0x5FC0, 0xF449, 0x5FC1, 0xF44A, 0x61F9, 0xF44B, 0x6517, 0xF44C, 0x6516, 0xF44D, 0x6515, 0xF44E, 0x6513, + 0xF44F, 0x65DF, 0xF450, 0x66E8, 0xF451, 0x66E3, 0xF452, 0x66E4, 0xF453, 0x6AF3, 0xF454, 0x6AF0, 0xF455, 0x6AEA, 0xF456, 0x6AE8, + 0xF457, 0x6AF9, 0xF458, 0x6AF1, 0xF459, 0x6AEE, 0xF45A, 0x6AEF, 0xF45B, 0x703C, 0xF45C, 0x7035, 0xF45D, 0x702F, 0xF45E, 0x7037, + 0xF45F, 0x7034, 0xF460, 0x7031, 0xF461, 0x7042, 0xF462, 0x7038, 0xF463, 0x703F, 0xF464, 0x703A, 0xF465, 0x7039, 0xF466, 0x7040, + 0xF467, 0x703B, 0xF468, 0x7033, 0xF469, 0x7041, 0xF46A, 0x7213, 0xF46B, 0x7214, 0xF46C, 0x72A8, 0xF46D, 0x737D, 0xF46E, 0x737C, + 0xF46F, 0x74BA, 0xF470, 0x76AB, 0xF471, 0x76AA, 0xF472, 0x76BE, 0xF473, 0x76ED, 0xF474, 0x77CC, 0xF475, 0x77CE, 0xF476, 0x77CF, + 0xF477, 0x77CD, 0xF478, 0x77F2, 0xF479, 0x7925, 0xF47A, 0x7923, 0xF47B, 0x7927, 0xF47C, 0x7928, 0xF47D, 0x7924, 0xF47E, 0x7929, + 0xF4A1, 0x79B2, 0xF4A2, 0x7A6E, 0xF4A3, 0x7A6C, 0xF4A4, 0x7A6D, 0xF4A5, 0x7AF7, 0xF4A6, 0x7C49, 0xF4A7, 0x7C48, 0xF4A8, 0x7C4A, + 0xF4A9, 0x7C47, 0xF4AA, 0x7C45, 0xF4AB, 0x7CEE, 0xF4AC, 0x7E7B, 0xF4AD, 0x7E7E, 0xF4AE, 0x7E81, 0xF4AF, 0x7E80, 0xF4B0, 0x7FBA, + 0xF4B1, 0x7FFF, 0xF4B2, 0x8079, 0xF4B3, 0x81DB, 0xF4B4, 0x81D9, 0xF4B5, 0x820B, 0xF4B6, 0x8268, 0xF4B7, 0x8269, 0xF4B8, 0x8622, + 0xF4B9, 0x85FF, 0xF4BA, 0x8601, 0xF4BB, 0x85FE, 0xF4BC, 0x861B, 0xF4BD, 0x8600, 0xF4BE, 0x85F6, 0xF4BF, 0x8604, 0xF4C0, 0x8609, + 0xF4C1, 0x8605, 0xF4C2, 0x860C, 0xF4C3, 0x85FD, 0xF4C4, 0x8819, 0xF4C5, 0x8810, 0xF4C6, 0x8811, 0xF4C7, 0x8817, 0xF4C8, 0x8813, + 0xF4C9, 0x8816, 0xF4CA, 0x8963, 0xF4CB, 0x8966, 0xF4CC, 0x89B9, 0xF4CD, 0x89F7, 0xF4CE, 0x8B60, 0xF4CF, 0x8B6A, 0xF4D0, 0x8B5D, + 0xF4D1, 0x8B68, 0xF4D2, 0x8B63, 0xF4D3, 0x8B65, 0xF4D4, 0x8B67, 0xF4D5, 0x8B6D, 0xF4D6, 0x8DAE, 0xF4D7, 0x8E86, 0xF4D8, 0x8E88, + 0xF4D9, 0x8E84, 0xF4DA, 0x8F59, 0xF4DB, 0x8F56, 0xF4DC, 0x8F57, 0xF4DD, 0x8F55, 0xF4DE, 0x8F58, 0xF4DF, 0x8F5A, 0xF4E0, 0x908D, + 0xF4E1, 0x9143, 0xF4E2, 0x9141, 0xF4E3, 0x91B7, 0xF4E4, 0x91B5, 0xF4E5, 0x91B2, 0xF4E6, 0x91B3, 0xF4E7, 0x940B, 0xF4E8, 0x9413, + 0xF4E9, 0x93FB, 0xF4EA, 0x9420, 0xF4EB, 0x940F, 0xF4EC, 0x9414, 0xF4ED, 0x93FE, 0xF4EE, 0x9415, 0xF4EF, 0x9410, 0xF4F0, 0x9428, + 0xF4F1, 0x9419, 0xF4F2, 0x940D, 0xF4F3, 0x93F5, 0xF4F4, 0x9400, 0xF4F5, 0x93F7, 0xF4F6, 0x9407, 0xF4F7, 0x940E, 0xF4F8, 0x9416, + 0xF4F9, 0x9412, 0xF4FA, 0x93FA, 0xF4FB, 0x9409, 0xF4FC, 0x93F8, 0xF4FD, 0x940A, 0xF4FE, 0x93FF, 0xF540, 0x93FC, 0xF541, 0x940C, + 0xF542, 0x93F6, 0xF543, 0x9411, 0xF544, 0x9406, 0xF545, 0x95DE, 0xF546, 0x95E0, 0xF547, 0x95DF, 0xF548, 0x972E, 0xF549, 0x972F, + 0xF54A, 0x97B9, 0xF54B, 0x97BB, 0xF54C, 0x97FD, 0xF54D, 0x97FE, 0xF54E, 0x9860, 0xF54F, 0x9862, 0xF550, 0x9863, 0xF551, 0x985F, + 0xF552, 0x98C1, 0xF553, 0x98C2, 0xF554, 0x9950, 0xF555, 0x994E, 0xF556, 0x9959, 0xF557, 0x994C, 0xF558, 0x994B, 0xF559, 0x9953, + 0xF55A, 0x9A32, 0xF55B, 0x9A34, 0xF55C, 0x9A31, 0xF55D, 0x9A2C, 0xF55E, 0x9A2A, 0xF55F, 0x9A36, 0xF560, 0x9A29, 0xF561, 0x9A2E, + 0xF562, 0x9A38, 0xF563, 0x9A2D, 0xF564, 0x9AC7, 0xF565, 0x9ACA, 0xF566, 0x9AC6, 0xF567, 0x9B10, 0xF568, 0x9B12, 0xF569, 0x9B11, + 0xF56A, 0x9C0B, 0xF56B, 0x9C08, 0xF56C, 0x9BF7, 0xF56D, 0x9C05, 0xF56E, 0x9C12, 0xF56F, 0x9BF8, 0xF570, 0x9C40, 0xF571, 0x9C07, + 0xF572, 0x9C0E, 0xF573, 0x9C06, 0xF574, 0x9C17, 0xF575, 0x9C14, 0xF576, 0x9C09, 0xF577, 0x9D9F, 0xF578, 0x9D99, 0xF579, 0x9DA4, + 0xF57A, 0x9D9D, 0xF57B, 0x9D92, 0xF57C, 0x9D98, 0xF57D, 0x9D90, 0xF57E, 0x9D9B, 0xF5A1, 0x9DA0, 0xF5A2, 0x9D94, 0xF5A3, 0x9D9C, + 0xF5A4, 0x9DAA, 0xF5A5, 0x9D97, 0xF5A6, 0x9DA1, 0xF5A7, 0x9D9A, 0xF5A8, 0x9DA2, 0xF5A9, 0x9DA8, 0xF5AA, 0x9D9E, 0xF5AB, 0x9DA3, + 0xF5AC, 0x9DBF, 0xF5AD, 0x9DA9, 0xF5AE, 0x9D96, 0xF5AF, 0x9DA6, 0xF5B0, 0x9DA7, 0xF5B1, 0x9E99, 0xF5B2, 0x9E9B, 0xF5B3, 0x9E9A, + 0xF5B4, 0x9EE5, 0xF5B5, 0x9EE4, 0xF5B6, 0x9EE7, 0xF5B7, 0x9EE6, 0xF5B8, 0x9F30, 0xF5B9, 0x9F2E, 0xF5BA, 0x9F5B, 0xF5BB, 0x9F60, + 0xF5BC, 0x9F5E, 0xF5BD, 0x9F5D, 0xF5BE, 0x9F59, 0xF5BF, 0x9F91, 0xF5C0, 0x513A, 0xF5C1, 0x5139, 0xF5C2, 0x5298, 0xF5C3, 0x5297, + 0xF5C4, 0x56C3, 0xF5C5, 0x56BD, 0xF5C6, 0x56BE, 0xF5C7, 0x5B48, 0xF5C8, 0x5B47, 0xF5C9, 0x5DCB, 0xF5CA, 0x5DCF, 0xF5CB, 0x5EF1, + 0xF5CC, 0x61FD, 0xF5CD, 0x651B, 0xF5CE, 0x6B02, 0xF5CF, 0x6AFC, 0xF5D0, 0x6B03, 0xF5D1, 0x6AF8, 0xF5D2, 0x6B00, 0xF5D3, 0x7043, + 0xF5D4, 0x7044, 0xF5D5, 0x704A, 0xF5D6, 0x7048, 0xF5D7, 0x7049, 0xF5D8, 0x7045, 0xF5D9, 0x7046, 0xF5DA, 0x721D, 0xF5DB, 0x721A, + 0xF5DC, 0x7219, 0xF5DD, 0x737E, 0xF5DE, 0x7517, 0xF5DF, 0x766A, 0xF5E0, 0x77D0, 0xF5E1, 0x792D, 0xF5E2, 0x7931, 0xF5E3, 0x792F, + 0xF5E4, 0x7C54, 0xF5E5, 0x7C53, 0xF5E6, 0x7CF2, 0xF5E7, 0x7E8A, 0xF5E8, 0x7E87, 0xF5E9, 0x7E88, 0xF5EA, 0x7E8B, 0xF5EB, 0x7E86, + 0xF5EC, 0x7E8D, 0xF5ED, 0x7F4D, 0xF5EE, 0x7FBB, 0xF5EF, 0x8030, 0xF5F0, 0x81DD, 0xF5F1, 0x8618, 0xF5F2, 0x862A, 0xF5F3, 0x8626, + 0xF5F4, 0x861F, 0xF5F5, 0x8623, 0xF5F6, 0x861C, 0xF5F7, 0x8619, 0xF5F8, 0x8627, 0xF5F9, 0x862E, 0xF5FA, 0x8621, 0xF5FB, 0x8620, + 0xF5FC, 0x8629, 0xF5FD, 0x861E, 0xF5FE, 0x8625, 0xF640, 0x8829, 0xF641, 0x881D, 0xF642, 0x881B, 0xF643, 0x8820, 0xF644, 0x8824, + 0xF645, 0x881C, 0xF646, 0x882B, 0xF647, 0x884A, 0xF648, 0x896D, 0xF649, 0x8969, 0xF64A, 0x896E, 0xF64B, 0x896B, 0xF64C, 0x89FA, + 0xF64D, 0x8B79, 0xF64E, 0x8B78, 0xF64F, 0x8B45, 0xF650, 0x8B7A, 0xF651, 0x8B7B, 0xF652, 0x8D10, 0xF653, 0x8D14, 0xF654, 0x8DAF, + 0xF655, 0x8E8E, 0xF656, 0x8E8C, 0xF657, 0x8F5E, 0xF658, 0x8F5B, 0xF659, 0x8F5D, 0xF65A, 0x9146, 0xF65B, 0x9144, 0xF65C, 0x9145, + 0xF65D, 0x91B9, 0xF65E, 0x943F, 0xF65F, 0x943B, 0xF660, 0x9436, 0xF661, 0x9429, 0xF662, 0x943D, 0xF663, 0x943C, 0xF664, 0x9430, + 0xF665, 0x9439, 0xF666, 0x942A, 0xF667, 0x9437, 0xF668, 0x942C, 0xF669, 0x9440, 0xF66A, 0x9431, 0xF66B, 0x95E5, 0xF66C, 0x95E4, + 0xF66D, 0x95E3, 0xF66E, 0x9735, 0xF66F, 0x973A, 0xF670, 0x97BF, 0xF671, 0x97E1, 0xF672, 0x9864, 0xF673, 0x98C9, 0xF674, 0x98C6, + 0xF675, 0x98C0, 0xF676, 0x9958, 0xF677, 0x9956, 0xF678, 0x9A39, 0xF679, 0x9A3D, 0xF67A, 0x9A46, 0xF67B, 0x9A44, 0xF67C, 0x9A42, + 0xF67D, 0x9A41, 0xF67E, 0x9A3A, 0xF6A1, 0x9A3F, 0xF6A2, 0x9ACD, 0xF6A3, 0x9B15, 0xF6A4, 0x9B17, 0xF6A5, 0x9B18, 0xF6A6, 0x9B16, + 0xF6A7, 0x9B3A, 0xF6A8, 0x9B52, 0xF6A9, 0x9C2B, 0xF6AA, 0x9C1D, 0xF6AB, 0x9C1C, 0xF6AC, 0x9C2C, 0xF6AD, 0x9C23, 0xF6AE, 0x9C28, + 0xF6AF, 0x9C29, 0xF6B0, 0x9C24, 0xF6B1, 0x9C21, 0xF6B2, 0x9DB7, 0xF6B3, 0x9DB6, 0xF6B4, 0x9DBC, 0xF6B5, 0x9DC1, 0xF6B6, 0x9DC7, + 0xF6B7, 0x9DCA, 0xF6B8, 0x9DCF, 0xF6B9, 0x9DBE, 0xF6BA, 0x9DC5, 0xF6BB, 0x9DC3, 0xF6BC, 0x9DBB, 0xF6BD, 0x9DB5, 0xF6BE, 0x9DCE, + 0xF6BF, 0x9DB9, 0xF6C0, 0x9DBA, 0xF6C1, 0x9DAC, 0xF6C2, 0x9DC8, 0xF6C3, 0x9DB1, 0xF6C4, 0x9DAD, 0xF6C5, 0x9DCC, 0xF6C6, 0x9DB3, + 0xF6C7, 0x9DCD, 0xF6C8, 0x9DB2, 0xF6C9, 0x9E7A, 0xF6CA, 0x9E9C, 0xF6CB, 0x9EEB, 0xF6CC, 0x9EEE, 0xF6CD, 0x9EED, 0xF6CE, 0x9F1B, + 0xF6CF, 0x9F18, 0xF6D0, 0x9F1A, 0xF6D1, 0x9F31, 0xF6D2, 0x9F4E, 0xF6D3, 0x9F65, 0xF6D4, 0x9F64, 0xF6D5, 0x9F92, 0xF6D6, 0x4EB9, + 0xF6D7, 0x56C6, 0xF6D8, 0x56C5, 0xF6D9, 0x56CB, 0xF6DA, 0x5971, 0xF6DB, 0x5B4B, 0xF6DC, 0x5B4C, 0xF6DD, 0x5DD5, 0xF6DE, 0x5DD1, + 0xF6DF, 0x5EF2, 0xF6E0, 0x6521, 0xF6E1, 0x6520, 0xF6E2, 0x6526, 0xF6E3, 0x6522, 0xF6E4, 0x6B0B, 0xF6E5, 0x6B08, 0xF6E6, 0x6B09, + 0xF6E7, 0x6C0D, 0xF6E8, 0x7055, 0xF6E9, 0x7056, 0xF6EA, 0x7057, 0xF6EB, 0x7052, 0xF6EC, 0x721E, 0xF6ED, 0x721F, 0xF6EE, 0x72A9, + 0xF6EF, 0x737F, 0xF6F0, 0x74D8, 0xF6F1, 0x74D5, 0xF6F2, 0x74D9, 0xF6F3, 0x74D7, 0xF6F4, 0x766D, 0xF6F5, 0x76AD, 0xF6F6, 0x7935, + 0xF6F7, 0x79B4, 0xF6F8, 0x7A70, 0xF6F9, 0x7A71, 0xF6FA, 0x7C57, 0xF6FB, 0x7C5C, 0xF6FC, 0x7C59, 0xF6FD, 0x7C5B, 0xF6FE, 0x7C5A, + 0xF740, 0x7CF4, 0xF741, 0x7CF1, 0xF742, 0x7E91, 0xF743, 0x7F4F, 0xF744, 0x7F87, 0xF745, 0x81DE, 0xF746, 0x826B, 0xF747, 0x8634, + 0xF748, 0x8635, 0xF749, 0x8633, 0xF74A, 0x862C, 0xF74B, 0x8632, 0xF74C, 0x8636, 0xF74D, 0x882C, 0xF74E, 0x8828, 0xF74F, 0x8826, + 0xF750, 0x882A, 0xF751, 0x8825, 0xF752, 0x8971, 0xF753, 0x89BF, 0xF754, 0x89BE, 0xF755, 0x89FB, 0xF756, 0x8B7E, 0xF757, 0x8B84, + 0xF758, 0x8B82, 0xF759, 0x8B86, 0xF75A, 0x8B85, 0xF75B, 0x8B7F, 0xF75C, 0x8D15, 0xF75D, 0x8E95, 0xF75E, 0x8E94, 0xF75F, 0x8E9A, + 0xF760, 0x8E92, 0xF761, 0x8E90, 0xF762, 0x8E96, 0xF763, 0x8E97, 0xF764, 0x8F60, 0xF765, 0x8F62, 0xF766, 0x9147, 0xF767, 0x944C, + 0xF768, 0x9450, 0xF769, 0x944A, 0xF76A, 0x944B, 0xF76B, 0x944F, 0xF76C, 0x9447, 0xF76D, 0x9445, 0xF76E, 0x9448, 0xF76F, 0x9449, + 0xF770, 0x9446, 0xF771, 0x973F, 0xF772, 0x97E3, 0xF773, 0x986A, 0xF774, 0x9869, 0xF775, 0x98CB, 0xF776, 0x9954, 0xF777, 0x995B, + 0xF778, 0x9A4E, 0xF779, 0x9A53, 0xF77A, 0x9A54, 0xF77B, 0x9A4C, 0xF77C, 0x9A4F, 0xF77D, 0x9A48, 0xF77E, 0x9A4A, 0xF7A1, 0x9A49, + 0xF7A2, 0x9A52, 0xF7A3, 0x9A50, 0xF7A4, 0x9AD0, 0xF7A5, 0x9B19, 0xF7A6, 0x9B2B, 0xF7A7, 0x9B3B, 0xF7A8, 0x9B56, 0xF7A9, 0x9B55, + 0xF7AA, 0x9C46, 0xF7AB, 0x9C48, 0xF7AC, 0x9C3F, 0xF7AD, 0x9C44, 0xF7AE, 0x9C39, 0xF7AF, 0x9C33, 0xF7B0, 0x9C41, 0xF7B1, 0x9C3C, + 0xF7B2, 0x9C37, 0xF7B3, 0x9C34, 0xF7B4, 0x9C32, 0xF7B5, 0x9C3D, 0xF7B6, 0x9C36, 0xF7B7, 0x9DDB, 0xF7B8, 0x9DD2, 0xF7B9, 0x9DDE, + 0xF7BA, 0x9DDA, 0xF7BB, 0x9DCB, 0xF7BC, 0x9DD0, 0xF7BD, 0x9DDC, 0xF7BE, 0x9DD1, 0xF7BF, 0x9DDF, 0xF7C0, 0x9DE9, 0xF7C1, 0x9DD9, + 0xF7C2, 0x9DD8, 0xF7C3, 0x9DD6, 0xF7C4, 0x9DF5, 0xF7C5, 0x9DD5, 0xF7C6, 0x9DDD, 0xF7C7, 0x9EB6, 0xF7C8, 0x9EF0, 0xF7C9, 0x9F35, + 0xF7CA, 0x9F33, 0xF7CB, 0x9F32, 0xF7CC, 0x9F42, 0xF7CD, 0x9F6B, 0xF7CE, 0x9F95, 0xF7CF, 0x9FA2, 0xF7D0, 0x513D, 0xF7D1, 0x5299, + 0xF7D2, 0x58E8, 0xF7D3, 0x58E7, 0xF7D4, 0x5972, 0xF7D5, 0x5B4D, 0xF7D6, 0x5DD8, 0xF7D7, 0x882F, 0xF7D8, 0x5F4F, 0xF7D9, 0x6201, + 0xF7DA, 0x6203, 0xF7DB, 0x6204, 0xF7DC, 0x6529, 0xF7DD, 0x6525, 0xF7DE, 0x6596, 0xF7DF, 0x66EB, 0xF7E0, 0x6B11, 0xF7E1, 0x6B12, + 0xF7E2, 0x6B0F, 0xF7E3, 0x6BCA, 0xF7E4, 0x705B, 0xF7E5, 0x705A, 0xF7E6, 0x7222, 0xF7E7, 0x7382, 0xF7E8, 0x7381, 0xF7E9, 0x7383, + 0xF7EA, 0x7670, 0xF7EB, 0x77D4, 0xF7EC, 0x7C67, 0xF7ED, 0x7C66, 0xF7EE, 0x7E95, 0xF7EF, 0x826C, 0xF7F0, 0x863A, 0xF7F1, 0x8640, + 0xF7F2, 0x8639, 0xF7F3, 0x863C, 0xF7F4, 0x8631, 0xF7F5, 0x863B, 0xF7F6, 0x863E, 0xF7F7, 0x8830, 0xF7F8, 0x8832, 0xF7F9, 0x882E, + 0xF7FA, 0x8833, 0xF7FB, 0x8976, 0xF7FC, 0x8974, 0xF7FD, 0x8973, 0xF7FE, 0x89FE, 0xF840, 0x8B8C, 0xF841, 0x8B8E, 0xF842, 0x8B8B, + 0xF843, 0x8B88, 0xF844, 0x8C45, 0xF845, 0x8D19, 0xF846, 0x8E98, 0xF847, 0x8F64, 0xF848, 0x8F63, 0xF849, 0x91BC, 0xF84A, 0x9462, + 0xF84B, 0x9455, 0xF84C, 0x945D, 0xF84D, 0x9457, 0xF84E, 0x945E, 0xF84F, 0x97C4, 0xF850, 0x97C5, 0xF851, 0x9800, 0xF852, 0x9A56, + 0xF853, 0x9A59, 0xF854, 0x9B1E, 0xF855, 0x9B1F, 0xF856, 0x9B20, 0xF857, 0x9C52, 0xF858, 0x9C58, 0xF859, 0x9C50, 0xF85A, 0x9C4A, + 0xF85B, 0x9C4D, 0xF85C, 0x9C4B, 0xF85D, 0x9C55, 0xF85E, 0x9C59, 0xF85F, 0x9C4C, 0xF860, 0x9C4E, 0xF861, 0x9DFB, 0xF862, 0x9DF7, + 0xF863, 0x9DEF, 0xF864, 0x9DE3, 0xF865, 0x9DEB, 0xF866, 0x9DF8, 0xF867, 0x9DE4, 0xF868, 0x9DF6, 0xF869, 0x9DE1, 0xF86A, 0x9DEE, + 0xF86B, 0x9DE6, 0xF86C, 0x9DF2, 0xF86D, 0x9DF0, 0xF86E, 0x9DE2, 0xF86F, 0x9DEC, 0xF870, 0x9DF4, 0xF871, 0x9DF3, 0xF872, 0x9DE8, + 0xF873, 0x9DED, 0xF874, 0x9EC2, 0xF875, 0x9ED0, 0xF876, 0x9EF2, 0xF877, 0x9EF3, 0xF878, 0x9F06, 0xF879, 0x9F1C, 0xF87A, 0x9F38, + 0xF87B, 0x9F37, 0xF87C, 0x9F36, 0xF87D, 0x9F43, 0xF87E, 0x9F4F, 0xF8A1, 0x9F71, 0xF8A2, 0x9F70, 0xF8A3, 0x9F6E, 0xF8A4, 0x9F6F, + 0xF8A5, 0x56D3, 0xF8A6, 0x56CD, 0xF8A7, 0x5B4E, 0xF8A8, 0x5C6D, 0xF8A9, 0x652D, 0xF8AA, 0x66ED, 0xF8AB, 0x66EE, 0xF8AC, 0x6B13, + 0xF8AD, 0x705F, 0xF8AE, 0x7061, 0xF8AF, 0x705D, 0xF8B0, 0x7060, 0xF8B1, 0x7223, 0xF8B2, 0x74DB, 0xF8B3, 0x74E5, 0xF8B4, 0x77D5, + 0xF8B5, 0x7938, 0xF8B6, 0x79B7, 0xF8B7, 0x79B6, 0xF8B8, 0x7C6A, 0xF8B9, 0x7E97, 0xF8BA, 0x7F89, 0xF8BB, 0x826D, 0xF8BC, 0x8643, + 0xF8BD, 0x8838, 0xF8BE, 0x8837, 0xF8BF, 0x8835, 0xF8C0, 0x884B, 0xF8C1, 0x8B94, 0xF8C2, 0x8B95, 0xF8C3, 0x8E9E, 0xF8C4, 0x8E9F, + 0xF8C5, 0x8EA0, 0xF8C6, 0x8E9D, 0xF8C7, 0x91BE, 0xF8C8, 0x91BD, 0xF8C9, 0x91C2, 0xF8CA, 0x946B, 0xF8CB, 0x9468, 0xF8CC, 0x9469, + 0xF8CD, 0x96E5, 0xF8CE, 0x9746, 0xF8CF, 0x9743, 0xF8D0, 0x9747, 0xF8D1, 0x97C7, 0xF8D2, 0x97E5, 0xF8D3, 0x9A5E, 0xF8D4, 0x9AD5, + 0xF8D5, 0x9B59, 0xF8D6, 0x9C63, 0xF8D7, 0x9C67, 0xF8D8, 0x9C66, 0xF8D9, 0x9C62, 0xF8DA, 0x9C5E, 0xF8DB, 0x9C60, 0xF8DC, 0x9E02, + 0xF8DD, 0x9DFE, 0xF8DE, 0x9E07, 0xF8DF, 0x9E03, 0xF8E0, 0x9E06, 0xF8E1, 0x9E05, 0xF8E2, 0x9E00, 0xF8E3, 0x9E01, 0xF8E4, 0x9E09, + 0xF8E5, 0x9DFF, 0xF8E6, 0x9DFD, 0xF8E7, 0x9E04, 0xF8E8, 0x9EA0, 0xF8E9, 0x9F1E, 0xF8EA, 0x9F46, 0xF8EB, 0x9F74, 0xF8EC, 0x9F75, + 0xF8ED, 0x9F76, 0xF8EE, 0x56D4, 0xF8EF, 0x652E, 0xF8F0, 0x65B8, 0xF8F1, 0x6B18, 0xF8F2, 0x6B19, 0xF8F3, 0x6B17, 0xF8F4, 0x6B1A, + 0xF8F5, 0x7062, 0xF8F6, 0x7226, 0xF8F7, 0x72AA, 0xF8F8, 0x77D8, 0xF8F9, 0x77D9, 0xF8FA, 0x7939, 0xF8FB, 0x7C69, 0xF8FC, 0x7C6B, + 0xF8FD, 0x7CF6, 0xF8FE, 0x7E9A, 0xF940, 0x7E98, 0xF941, 0x7E9B, 0xF942, 0x7E99, 0xF943, 0x81E0, 0xF944, 0x81E1, 0xF945, 0x8646, + 0xF946, 0x8647, 0xF947, 0x8648, 0xF948, 0x8979, 0xF949, 0x897A, 0xF94A, 0x897C, 0xF94B, 0x897B, 0xF94C, 0x89FF, 0xF94D, 0x8B98, + 0xF94E, 0x8B99, 0xF94F, 0x8EA5, 0xF950, 0x8EA4, 0xF951, 0x8EA3, 0xF952, 0x946E, 0xF953, 0x946D, 0xF954, 0x946F, 0xF955, 0x9471, + 0xF956, 0x9473, 0xF957, 0x9749, 0xF958, 0x9872, 0xF959, 0x995F, 0xF95A, 0x9C68, 0xF95B, 0x9C6E, 0xF95C, 0x9C6D, 0xF95D, 0x9E0B, + 0xF95E, 0x9E0D, 0xF95F, 0x9E10, 0xF960, 0x9E0F, 0xF961, 0x9E12, 0xF962, 0x9E11, 0xF963, 0x9EA1, 0xF964, 0x9EF5, 0xF965, 0x9F09, + 0xF966, 0x9F47, 0xF967, 0x9F78, 0xF968, 0x9F7B, 0xF969, 0x9F7A, 0xF96A, 0x9F79, 0xF96B, 0x571E, 0xF96C, 0x7066, 0xF96D, 0x7C6F, + 0xF96E, 0x883C, 0xF96F, 0x8DB2, 0xF970, 0x8EA6, 0xF971, 0x91C3, 0xF972, 0x9474, 0xF973, 0x9478, 0xF974, 0x9476, 0xF975, 0x9475, + 0xF976, 0x9A60, 0xF977, 0x9C74, 0xF978, 0x9C73, 0xF979, 0x9C71, 0xF97A, 0x9C75, 0xF97B, 0x9E14, 0xF97C, 0x9E13, 0xF97D, 0x9EF6, + 0xF97E, 0x9F0A, 0xF9A1, 0x9FA4, 0xF9A2, 0x7068, 0xF9A3, 0x7065, 0xF9A4, 0x7CF7, 0xF9A5, 0x866A, 0xF9A6, 0x883E, 0xF9A7, 0x883D, + 0xF9A8, 0x883F, 0xF9A9, 0x8B9E, 0xF9AA, 0x8C9C, 0xF9AB, 0x8EA9, 0xF9AC, 0x8EC9, 0xF9AD, 0x974B, 0xF9AE, 0x9873, 0xF9AF, 0x9874, + 0xF9B0, 0x98CC, 0xF9B1, 0x9961, 0xF9B2, 0x99AB, 0xF9B3, 0x9A64, 0xF9B4, 0x9A66, 0xF9B5, 0x9A67, 0xF9B6, 0x9B24, 0xF9B7, 0x9E15, + 0xF9B8, 0x9E17, 0xF9B9, 0x9F48, 0xF9BA, 0x6207, 0xF9BB, 0x6B1E, 0xF9BC, 0x7227, 0xF9BD, 0x864C, 0xF9BE, 0x8EA8, 0xF9BF, 0x9482, + 0xF9C0, 0x9480, 0xF9C1, 0x9481, 0xF9C2, 0x9A69, 0xF9C3, 0x9A68, 0xF9C4, 0x9B2E, 0xF9C5, 0x9E19, 0xF9C6, 0x7229, 0xF9C7, 0x864B, + 0xF9C8, 0x8B9F, 0xF9C9, 0x9483, 0xF9CA, 0x9C79, 0xF9CB, 0x9EB7, 0xF9CC, 0x7675, 0xF9CD, 0x9A6B, 0xF9CE, 0x9C7A, 0xF9CF, 0x9E1D, + 0xF9D0, 0x7069, 0xF9D1, 0x706A, 0xF9D2, 0x9EA4, 0xF9D3, 0x9F7E, 0xF9D4, 0x9F49, 0xF9D5, 0x9F98, 0xF9D6, 0x7881, 0xF9D7, 0x92B9, + 0xF9D8, 0x88CF, 0xF9D9, 0x58BB, 0xF9DA, 0x6052, 0xF9DB, 0x7CA7, 0xF9DC, 0x5AFA, 0xF9DD, 0x2554, 0xF9DE, 0x2566, 0xF9DF, 0x2557, + 0xF9E0, 0x2560, 0xF9E1, 0x256C, 0xF9E2, 0x2563, 0xF9E3, 0x255A, 0xF9E4, 0x2569, 0xF9E5, 0x255D, 0xF9E6, 0x2552, 0xF9E7, 0x2564, + 0xF9E8, 0x2555, 0xF9E9, 0x255E, 0xF9EA, 0x256A, 0xF9EB, 0x2561, 0xF9EC, 0x2558, 0xF9ED, 0x2567, 0xF9EE, 0x255B, 0xF9EF, 0x2553, + 0xF9F0, 0x2565, 0xF9F1, 0x2556, 0xF9F2, 0x255F, 0xF9F3, 0x256B, 0xF9F4, 0x2562, 0xF9F5, 0x2559, 0xF9F6, 0x2568, 0xF9F7, 0x255C, + 0xF9F8, 0x2551, 0xF9F9, 0x2550, 0xF9FA, 0x256D, 0xF9FB, 0x256E, 0xF9FC, 0x2570, 0xF9FD, 0x256F, 0xF9FE, 0x2593, 0, 0 +}; +#endif + +#if FF_CODE_PAGE == 437 || FF_CODE_PAGE == 0 +static const WCHAR uc437[] = { /* CP437(U.S.) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 720 || FF_CODE_PAGE == 0 +static const WCHAR uc720[] = { /* CP720(Arabic) to Unicode conversion table */ + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 737 || FF_CODE_PAGE == 0 +static const WCHAR uc737[] = { /* CP737(Greek) to Unicode conversion table */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 771 || FF_CODE_PAGE == 0 +static const WCHAR uc771[] = { /* CP771(KBL) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0118, 0x0119, 0x0116, 0x0117, 0x012E, 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 775 || FF_CODE_PAGE == 0 +static const WCHAR uc775[] = { /* CP775(Baltic) to Unicode conversion table */ + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 850 || FF_CODE_PAGE == 0 +static const WCHAR uc850[] = { /* CP850(Latin 1) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 852 || FF_CODE_PAGE == 0 +static const WCHAR uc852[] = { /* CP852(Latin 2) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 855 || FF_CODE_PAGE == 0 +static const WCHAR uc855[] = { /* CP855(Cyrillic) to Unicode conversion table */ + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 857 || FF_CODE_PAGE == 0 +static const WCHAR uc857[] = { /* CP857(Turkish) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 860 || FF_CODE_PAGE == 0 +static const WCHAR uc860[] = { /* CP860(Portuguese) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2, + 0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 861 || FF_CODE_PAGE == 0 +static const WCHAR uc861[] = { /* CP861(Icelandic) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 862 || FF_CODE_PAGE == 0 +static const WCHAR uc862[] = { /* CP862(Hebrew) to Unicode conversion table */ + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 863 || FF_CODE_PAGE == 0 +static const WCHAR uc863[] = { /* CP863(Canadian French) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0, + 0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192, + 0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2219, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 864 || FF_CODE_PAGE == 0 +static const WCHAR uc864[] = { /* CP864(Arabic) to Unicode conversion table */ + 0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518, + 0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000, + 0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5, + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F, + 0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9, + 0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9, + 0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1, + 0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0, 0x0000 +}; +#endif +#if FF_CODE_PAGE == 865 || FF_CODE_PAGE == 0 +static const WCHAR uc865[] = { /* CP865(Nordic) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C5, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 866 || FF_CODE_PAGE == 0 +static const WCHAR uc866[] = { /* CP866(Russian) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 +}; +#endif +#if FF_CODE_PAGE == 869 || FF_CODE_PAGE == 0 +static const WCHAR uc869[] = { /* CP869(Greek 2) to Unicode conversion table */ + 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, + 0x038A, 0x03AA, 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF, + 0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580, + 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384, + 0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0 +}; +#endif + + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for static code page configuration */ +/* SBCS fixed code page */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE != 0 && FF_CODE_PAGE < 900 +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + WCHAR c = 0; + const WCHAR *p = CVTBL(uc, FF_CODE_PAGE); + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000 && cp == FF_CODE_PAGE) { /* Is it in BMP and valid code page? */ + for (c = 0; c < 0x80 && uni != p[c]; c++) ; + c = (c + 0x80) & 0xFF; + } + } + + return c; +} + +WCHAR ff_oem2uni ( /* Returns Unicode character, zero on error */ + WCHAR oem, /* OEM code to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + WCHAR c = 0; + const WCHAR *p = CVTBL(uc, FF_CODE_PAGE); + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + if (cp == FF_CODE_PAGE) { /* Is it a valid code page? */ + if (oem < 0x100) c = p[oem - 0x80]; + } + } + + return c; +} + +#endif + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for static code page configuration */ +/* DBCS fixed code page */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE >= 900 +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0, uc; + UINT i = 0, n, li, hi; + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000 && cp == FF_CODE_PAGE) { /* Is it in BMP and valid code page? */ + uc = (WCHAR)uni; + p = CVTBL(uni2oem, FF_CODE_PAGE); + hi = sizeof CVTBL(uni2oem, FF_CODE_PAGE) / 4 - 1; + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (uc == p[i * 2]) break; + if (uc > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + + return c; +} + + +WCHAR ff_oem2uni ( /* Returns Unicode character, zero on error */ + WCHAR oem, /* OEM code to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0; + UINT i = 0, n, li, hi; + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + if (cp == FF_CODE_PAGE) { /* Is it valid code page? */ + p = CVTBL(oem2uni, FF_CODE_PAGE); + hi = sizeof CVTBL(oem2uni, FF_CODE_PAGE) / 4 - 1; + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (oem == p[i * 2]) break; + if (oem > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + + return c; +} +#endif + + + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode conversions for dynamic code page configuration */ +/*------------------------------------------------------------------------*/ + +#if FF_CODE_PAGE == 0 + +static const WORD cp_code[] = { 437, 720, 737, 771, 775, 850, 852, 855, 857, 860, 861, 862, 863, 864, 865, 866, 869, 0}; +static const WCHAR* const cp_table[] = {uc437, uc720, uc737, uc771, uc775, uc850, uc852, uc855, uc857, uc860, uc861, uc862, uc863, uc864, uc865, uc866, uc869, 0}; + + +WCHAR ff_uni2oem ( /* Returns OEM code character, zero on error */ + DWORD uni, /* UTF-16 encoded character to be converted */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0, uc; + UINT i, n, li, hi; + + + if (uni < 0x80) { /* ASCII? */ + c = (WCHAR)uni; + + } else { /* Non-ASCII */ + if (uni < 0x10000) { /* Is it in BMP? */ + uc = (WCHAR)uni; + p = 0; + if (cp < 900) { /* SBCS */ + for (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ; /* Get conversion table */ + p = cp_table[i]; + if (p) { /* Is it valid code page ? */ + for (c = 0; c < 0x80 && uc != p[c]; c++) ; /* Find OEM code in the table */ + c = (c + 0x80) & 0xFF; + } + } else { /* DBCS */ + switch (cp) { /* Get conversion table */ + case 932 : p = uni2oem932; hi = sizeof uni2oem932 / 4 - 1; break; + case 936 : p = uni2oem936; hi = sizeof uni2oem936 / 4 - 1; break; + case 949 : p = uni2oem949; hi = sizeof uni2oem949 / 4 - 1; break; + case 950 : p = uni2oem950; hi = sizeof uni2oem950 / 4 - 1; break; + } + if (p) { /* Is it valid code page? */ + li = 0; + for (n = 16; n; n--) { /* Find OEM code */ + i = li + (hi - li) / 2; + if (uc == p[i * 2]) break; + if (uc > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + } + } + + return c; +} + + +WCHAR ff_oem2uni ( /* Returns Unicode character, zero on error */ + WCHAR oem, /* OEM code to be converted (DBC if >=0x100) */ + WORD cp /* Code page for the conversion */ +) +{ + const WCHAR *p; + WCHAR c = 0; + UINT i, n, li, hi; + + + if (oem < 0x80) { /* ASCII? */ + c = oem; + + } else { /* Extended char */ + p = 0; + if (cp < 900) { /* SBCS */ + for (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ; /* Get table */ + p = cp_table[i]; + if (p) { /* Is it a valid CP ? */ + if (oem < 0x100) c = p[oem - 0x80]; + } + } else { /* DBCS */ + switch (cp) { + case 932 : p = oem2uni932; hi = sizeof oem2uni932 / 4 - 1; break; + case 936 : p = oem2uni936; hi = sizeof oem2uni936 / 4 - 1; break; + case 949 : p = oem2uni949; hi = sizeof oem2uni949 / 4 - 1; break; + case 950 : p = oem2uni950; hi = sizeof oem2uni950 / 4 - 1; break; + } + if (p) { + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (oem == p[i * 2]) break; + if (oem > p[i * 2]) { + li = i; + } else { + hi = i; + } + } + if (n != 0) c = p[i * 2 + 1]; + } + } + } + + return c; +} +#endif + + + +/*------------------------------------------------------------------------*/ +/* Unicode up-case conversion */ +/*------------------------------------------------------------------------*/ + +DWORD ff_wtoupper ( /* Returns up-converted code point */ + DWORD uni /* Unicode code point to be up-converted */ +) +{ + const WORD *p; + WORD uc, bc, nc, cmd; + static const WORD cvt1[] = { /* Compressed up conversion table for U+0000 - U+0FFF */ + /* Basic Latin */ + 0x0061,0x031A, + /* Latin-1 Supplement */ + 0x00E0,0x0317, + 0x00F8,0x0307, + 0x00FF,0x0001,0x0178, + /* Latin Extended-A */ + 0x0100,0x0130, + 0x0132,0x0106, + 0x0139,0x0110, + 0x014A,0x012E, + 0x0179,0x0106, + /* Latin Extended-B */ + 0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA, + 0x01CD,0x0110, + 0x01DD,0x0001,0x018E, + 0x01DE,0x0112, + 0x01F3,0x0003,0x01F1,0x01F4,0x01F4, + 0x01F8,0x0128, + 0x0222,0x0112, + 0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241, + 0x0246,0x010A, + /* IPA Extensions */ + 0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7, + /* Greek, Coptic */ + 0x037B,0x0003,0x03FD,0x03FE,0x03FF, + 0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A, + 0x03B1,0x0311, + 0x03C2,0x0002,0x03A3,0x03A3, + 0x03C4,0x0308, + 0x03CC,0x0003,0x038C,0x038E,0x038F, + 0x03D8,0x0118, + 0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA, + /* Cyrillic */ + 0x0430,0x0320, + 0x0450,0x0710, + 0x0460,0x0122, + 0x048A,0x0136, + 0x04C1,0x010E, + 0x04CF,0x0001,0x04C0, + 0x04D0,0x0144, + /* Armenian */ + 0x0561,0x0426, + + 0x0000 /* EOT */ + }; + static const WORD cvt2[] = { /* Compressed up conversion table for U+1000 - U+FFFF */ + /* Phonetic Extensions */ + 0x1D7D,0x0001,0x2C63, + /* Latin Extended Additional */ + 0x1E00,0x0196, + 0x1EA0,0x015A, + /* Greek Extended */ + 0x1F00,0x0608, + 0x1F10,0x0606, + 0x1F20,0x0608, + 0x1F30,0x0608, + 0x1F40,0x0606, + 0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F, + 0x1F60,0x0608, + 0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB, + 0x1F80,0x0608, + 0x1F90,0x0608, + 0x1FA0,0x0608, + 0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC, + 0x1FCC,0x0001,0x1FC3, + 0x1FD0,0x0602, + 0x1FE0,0x0602, + 0x1FE5,0x0001,0x1FEC, + 0x1FF3,0x0001,0x1FFC, + /* Letterlike Symbols */ + 0x214E,0x0001,0x2132, + /* Number forms */ + 0x2170,0x0210, + 0x2184,0x0001,0x2183, + /* Enclosed Alphanumerics */ + 0x24D0,0x051A, + 0x2C30,0x042F, + /* Latin Extended-C */ + 0x2C60,0x0102, + 0x2C67,0x0106, 0x2C75,0x0102, + /* Coptic */ + 0x2C80,0x0164, + /* Georgian Supplement */ + 0x2D00,0x0826, + /* Full-width */ + 0xFF41,0x031A, + + 0x0000 /* EOT */ + }; + + + if (uni < 0x10000) { /* Is it in BMP? */ + uc = (WORD)uni; + p = uc < 0x1000 ? cvt1 : cvt2; + for (;;) { + bc = *p++; /* Get the block base */ + if (bc == 0 || uc < bc) break; /* Not matched? */ + nc = *p++; cmd = nc >> 8; nc &= 0xFF; /* Get processing command and block size */ + if (uc < bc + nc) { /* In the block? */ + switch (cmd) { + case 0: uc = p[uc - bc]; break; /* Table conversion */ + case 1: uc -= (uc - bc) & 1; break; /* Case pairs */ + case 2: uc -= 16; break; /* Shift -16 */ + case 3: uc -= 32; break; /* Shift -32 */ + case 4: uc -= 48; break; /* Shift -48 */ + case 5: uc -= 26; break; /* Shift -26 */ + case 6: uc += 8; break; /* Shift +8 */ + case 7: uc -= 80; break; /* Shift -80 */ + case 8: uc -= 0x1C60; break; /* Shift -0x1C60 */ + } + break; + } + if (cmd == 0) p += nc; /* Skip table if needed */ + } + uni = uc; + } + + return uni; +} + + +#endif /* #if FF_USE_LFN */ diff --git b/Utilities/Third_Party/fat_fs/src/option/ccsbcs.c a/Utilities/Third_Party/fat_fs/src/option/ccsbcs.c new file mode 100644 index 0000000..a2da326 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/src/option/ccsbcs.c @@ -0,0 +1,541 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - Local code bidirectional converter (C)ChaN, 2009 */ +/* (SBCS code pages) */ +/*------------------------------------------------------------------------*/ +/* 437 U.S. (OEM) +/ 720 Arabic (OEM) +/ 1256 Arabic (Windows) +/ 737 Greek (OEM) +/ 1253 Greek (Windows) +/ 1250 Central Europe (Windows) +/ 775 Baltic (OEM) +/ 1257 Baltic (Windows) +/ 850 Multilingual Latin 1 (OEM) +/ 852 Latin 2 (OEM) +/ 1252 Latin 1 (Windows) +/ 855 Cyrillic (OEM) +/ 1251 Cyrillic (Windows) +/ 866 Russian (OEM) +/ 857 Turkish (OEM) +/ 1254 Turkish (Windows) +/ 858 Multilingual Latin 1 + Euro (OEM) +/ 862 Hebrew (OEM) +/ 1255 Hebrew (Windows) +/ 874 Thai (OEM, Windows) +/ 1258 Vietnam (OEM, Windows) +*/ + +//#include "../ff.h" //RPi +#include "ff.h" //RPi + + +#if _CODE_PAGE == 437 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP437(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 720 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP720(0x80-0xFF) to Unicode conversion table */ + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, + 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, + 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0xO650, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 737 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP737(0x80-0xFF) to Unicode conversion table */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, + 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, + 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 775 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP775(0x80-0xFF) to Unicode conversion table */ + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, + 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, + 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, + 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, + 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, + 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, + 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, + 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 850 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP850(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, + 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 852 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP852(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, + 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, + 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, + 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, + 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, + 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, + 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 855 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP855(0x80-0xFF) to Unicode conversion table */ + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, + 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, + 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, + 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, + 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, + 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, + 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, + 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 857 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP857(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, + 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 858 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP858(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x2550, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x20AC, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00C6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, + 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 862 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP862(0x80-0xFF) to Unicode conversion table */ + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 866 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP866(0x80-0xFF) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 874 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP874(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, + 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, + 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, + 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, + 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, + 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, + 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, + 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F, + 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, + 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, + 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, + 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +#elif _CODE_PAGE == 1250 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1250(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, + 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, + 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 +}; + +#elif _CODE_PAGE == 1251 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1251(0x80-0xFF) to Unicode conversion table */ + 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, + 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, + 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2111, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, + 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, + 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, + 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, + 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042D, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F +}; + +#elif _CODE_PAGE == 1252 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1252(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF +}; + +#elif _CODE_PAGE == 1253 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1253(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x000C, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, + 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, + 0x03A8, 0x03A9, 0x03AA, 0x03AD, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 +}; + +#elif _CODE_PAGE == 1254 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1254(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x210A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF +}; + +#elif _CODE_PAGE == 1255 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1255(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, + 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, + 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 +}; + +#elif _CODE_PAGE == 1256 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1256(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, + 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, + 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, + 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0640, 0x0642, 0x0643, + 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, + 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, + 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 +} + +#elif _CODE_PAGE == 1257 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1257(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, + 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, + 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, + 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, + 0x0173, 0x014E, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 +}; + +#elif _CODE_PAGE == 1258 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1258(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, + 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, + 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF +}; + +#endif + + +#if !_TBLDEF || !_USE_LFN +//#error This file is not needed in current configuration +#endif + + +WCHAR ff_convert ( /* Converted character, Returns zero on error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + WCHAR c; + + + if (src < 0x80) { /* ASCII */ + c = src; + + } else { + if (dir) { /* OEMCP to Unicode */ + c = (src >= 0x100) ? 0 : Tbl[src - 0x80]; + + } else { /* Unicode to OEMCP */ + for (c = 0; c < 0x80; c++) { + if (src == Tbl[c]) break; + } + c = (c + 0x80) & 0xFF; + } + } + + return c; +} + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git b/Utilities/Third_Party/fat_fs/src/option/syncobj.c a/Utilities/Third_Party/fat_fs/src/option/syncobj.c new file mode 100644 index 0000000..964c339 --- /dev/null +++ a/Utilities/Third_Party/fat_fs/src/option/syncobj.c @@ -0,0 +1,115 @@ +/*------------------------------------------------------------------------*/ +/* Sample code of OS dependent synchronization object controls */ +/* for FatFs R0.07d (C)ChaN, 2009 */ +/*------------------------------------------------------------------------*/ + +#include // Win32 +//#include // uC/OS-II + +#include "../ff.h" + +#if _FS_REENTRANT + +/*------------------------------------------------------------------------*/ +/* Create a Synchronization Object for a Volume +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount function to create a new +/ synchronization object, such as semaphore and mutex. When a FALSE is +/ returned, the f_mount function fails with FR_INT_ERR. +*/ + +BOOL ff_cre_syncobj ( /* TRUE:Function succeeded, FALSE:Could not create due to any error */ + BYTE vol, /* Corresponding logical drive being processed */ + _SYNC_t *sobj /* Pointer to return the created sync object */ +) +{ + BOOL ret; + + *sobj = CreateMutex(NULL, FALSE, NULL); // Win32 + ret = (*sobj != INVALID_HANDLE_VALUE) ? TRUE : FALSE; // + +// *sobj = VolumeSemId[vol]; // uITRON (give a static created sync object) +// ret = TRUE; // The initial value of the semaphore must be 1. + +// *sobj = OSMutexCreate(0, &err); // uC/OS-II +// ret = (err == OS_NO_ERR) ? TRUE : FALSE; // + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Delete a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount function to delete a synchronization +/ object that created with ff_cre_syncobj function. When a FALSE is +/ returned, the f_mount function fails with FR_INT_ERR. +*/ + +BOOL ff_del_syncobj ( /* TRUE:Function succeeded, FALSE:Could not delete due to any error */ + _SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ +) +{ + BOOL ret; + + ret = CloseHandle(sobj); // Win32 + +// ret = TRUE; // uITRON (nothing to do) + +// OSMutexDel(sobj, OS_DEL_ALWAYS, &err); // uC/OS-II +// ret = (err == OS_NO_ERR) ? TRUE : FALSE; // + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Request Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on entering file functions to lock the volume. +/ When a FALSE is returned, the file function fails with FR_TIMEOUT. +*/ + +BOOL ff_req_grant ( /* TRUE:Got a grant to access the volume, FALSE:Could not get a grant */ + _SYNC_t sobj /* Sync object to wait */ +) +{ + BOOL ret; + + ret = (WaitForSingleObject(sobj, _FS_TIMEOUT) == WAIT_OBJECT_0) ? TRUE : FALSE; // Win32 + +// ret = (wai_sem(sobj) == E_OK) ? TRUE : FALSE; // uITRON + +// OSMutexPend(sobj, _FS_TIMEOUT, &err)); // uC/OS-II +// ret = (err == OS_NO_ERR) ? TRUE : FALSE; // + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Release Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on leaving file functions to unlock the volume. +*/ + +void ff_rel_grant ( + _SYNC_t sobj /* Sync object to be signaled */ +) +{ + ReleaseMutex(sobj); // Win32 + +// sig_sem(sobj); // uITRON + +// OSMutexPost(sobj); // uC/OS-II +} + + +#else + +#error This file is not needed in this configuration. + +#endif diff --git b/Utilities/gd32f303e_eval.c a/Utilities/gd32f303e_eval.c new file mode 100644 index 0000000..06789ca --- /dev/null +++ a/Utilities/gd32f303e_eval.c @@ -0,0 +1,232 @@ +/*! + \file gd32f303e_eval.c + \brief firmware functions to manage leds, keys, COM ports + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include +#include "gd32f303e_eval.h" + +/* private variables */ +static uint32_t GPIO_PORT[LEDn] = {LED2_GPIO_PORT, LED3_GPIO_PORT, + LED4_GPIO_PORT, LED5_GPIO_PORT}; +static uint32_t GPIO_PIN[LEDn] = {LED2_PIN, LED3_PIN, LED4_PIN, LED5_PIN}; + +static rcu_periph_enum COM_CLK[COMn] = {EVAL_COM1_CLK, EVAL_COM2_CLK}; +static uint32_t COM_TX_PIN[COMn] = {EVAL_COM1_TX_PIN, EVAL_COM2_TX_PIN}; +static uint32_t COM_RX_PIN[COMn] = {EVAL_COM1_RX_PIN, EVAL_COM2_RX_PIN}; +static uint32_t COM_GPIO_PORT[COMn] = {EVAL_COM1_GPIO_PORT, EVAL_COM2_GPIO_PORT}; +static rcu_periph_enum COM_GPIO_CLK[COMn] = {EVAL_COM1_GPIO_CLK, EVAL_COM2_GPIO_CLK}; + +static rcu_periph_enum GPIO_CLK[LEDn] = {LED2_GPIO_CLK, LED3_GPIO_CLK, + LED4_GPIO_CLK, LED5_GPIO_CLK}; + +static uint32_t KEY_PORT[KEYn] = {WAKEUP_KEY_GPIO_PORT, + TAMPER_KEY_GPIO_PORT, + USER_KEY1_GPIO_PORT, + USER_KEY2_GPIO_PORT}; +static uint32_t KEY_PIN[KEYn] = {WAKEUP_KEY_PIN, TAMPER_KEY_PIN,USER_KEY1_PIN,USER_KEY2_PIN}; +static rcu_periph_enum KEY_CLK[KEYn] = {WAKEUP_KEY_GPIO_CLK, + TAMPER_KEY_GPIO_CLK, + USER_KEY1_GPIO_CLK, + USER_KEY2_GPIO_CLK}; +static exti_line_enum KEY_EXTI_LINE[KEYn] = {WAKEUP_KEY_EXTI_LINE, + TAMPER_KEY_EXTI_LINE, + USER_KEY1_EXTI_LINE, + USER_KEY2_EXTI_LINE}; +static uint8_t KEY_PORT_SOURCE[KEYn] = {WAKEUP_KEY_EXTI_PORT_SOURCE, + TAMPER_KEY_EXTI_PORT_SOURCE, + USER_KEY1_EXTI_PORT_SOURCE, + USER_KEY2_EXTI_PORT_SOURCE}; +static uint8_t KEY_PIN_SOURCE[KEYn] = {WAKEUP_KEY_EXTI_PIN_SOURCE, + TAMPER_KEY_EXTI_PIN_SOURCE, + USER_KEY1_EXTI_PIN_SOURCE, + USER_KEY2_EXTI_PIN_SOURCE}; +static uint8_t KEY_IRQn[KEYn] = {WAKEUP_KEY_EXTI_IRQn, + TAMPER_KEY_EXTI_IRQn, + USER_KEY1_EXTI_IRQn, + USER_KEY2_EXTI_IRQn}; + +/*! + \brief configure led GPIO + \param[in] lednum: specify the led to be configured + \arg LED2 + \arg LED3 + \arg LED4 + \arg LED5 + \param[out] none + \retval none +*/ +void gd_eval_led_init (led_typedef_enum lednum) +{ + /* enable the led clock */ + rcu_periph_clock_enable(GPIO_CLK[lednum]); + /* configure led GPIO port */ + gpio_init(GPIO_PORT[lednum], GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN[lednum]); + + GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +} + +/*! + \brief turn on selected led + \param[in] lednum: specify the led to be turned on + \arg LED2 + \arg LED3 + \arg LED4 + \arg LED5 + \param[out] none + \retval none +*/ +void gd_eval_led_on(led_typedef_enum lednum) +{ + GPIO_BOP(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +} + +/*! + \brief turn off selected led + \param[in] lednum: specify the led to be turned off + \arg LED2 + \arg LED3 + \arg LED4 + \arg LED5 + \param[out] none + \retval none +*/ +void gd_eval_led_off(led_typedef_enum lednum) +{ + GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +} + +/*! + \brief toggle selected led + \param[in] lednum: specify the led to be toggled + \arg LED2 + \arg LED3 + \arg LED4 + \arg LED5 + \param[out] none + \retval none +*/ +void gd_eval_led_toggle(led_typedef_enum lednum) +{ + gpio_bit_write(GPIO_PORT[lednum], GPIO_PIN[lednum], + (bit_status)(1-gpio_input_bit_get(GPIO_PORT[lednum], GPIO_PIN[lednum]))); +} + +/*! + \brief configure key + \param[in] key_num: specify the key to be configured + \arg KEY_TAMPER: tamper key + \arg KEY_WAKEUP: wakeup key + \arg KEY_USER1: user key1 + \arg KEY_USER2: user key2 + \param[in] key_mode: specify button mode + \arg KEY_MODE_GPIO: key will be used as simple IO + \arg KEY_MODE_EXTI: key will be connected to EXTI line with interrupt + \param[out] none + \retval none +*/ +void gd_eval_key_init(key_typedef_enum key_num, keymode_typedef_enum key_mode) +{ + /* enable the key clock */ + rcu_periph_clock_enable(KEY_CLK[key_num]); + rcu_periph_clock_enable(RCU_AF); + + /* configure button pin as input */ + gpio_init(KEY_PORT[key_num], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, KEY_PIN[key_num]); + + if (key_mode == KEY_MODE_EXTI) { + /* enable and set key EXTI interrupt to the lowest priority */ + nvic_irq_enable(KEY_IRQn[key_num], 2U, 0U); + + /* connect key EXTI line to key GPIO pin */ + gpio_exti_source_select(KEY_PORT_SOURCE[key_num], KEY_PIN_SOURCE[key_num]); + + /* configure key EXTI line */ + exti_init(KEY_EXTI_LINE[key_num], EXTI_INTERRUPT, EXTI_TRIG_FALLING); + exti_interrupt_flag_clear(KEY_EXTI_LINE[key_num]); + } +} + +/*! + \brief return the selected key state + \param[in] key: specify the key to be checked + \arg KEY_TAMPER: tamper key + \arg KEY_WAKEUP: wakeup key + \arg KEY_USER1: user key + \arg KEY_USER2: user key2 + \param[out] none + \retval the key's GPIO pin value +*/ +uint8_t gd_eval_key_state_get(key_typedef_enum key) +{ + return gpio_input_bit_get(KEY_PORT[key], KEY_PIN[key]); +} + +/*! + \brief configure COM port + \param[in] com: COM on the board + \arg EVAL_COM1: COM1 on the board + \arg EVAL_COM2: COM2 on the board + \param[out] none + \retval none +*/ +void gd_eval_com_init(uint32_t com) +{ + uint32_t com_id = 0U; + if(EVAL_COM1 == com){ + com_id = 0U; + }else if(EVAL_COM2 == com){ + com_id = 1U; + } + + /* enable GPIO clock */ + rcu_periph_clock_enable(COM_GPIO_CLK[com_id]); + + /* enable USART clock */ + rcu_periph_clock_enable(COM_CLK[com_id]); + + /* connect port to USARTx_Tx */ + gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, COM_TX_PIN[com_id]); + + /* connect port to USARTx_Rx */ + gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, COM_RX_PIN[com_id]); + + /* USART configure */ + usart_deinit(com); + usart_baudrate_set(com, 115200U); + usart_receive_config(com, USART_RECEIVE_ENABLE); + usart_transmit_config(com, USART_TRANSMIT_ENABLE); + usart_enable(com); +} diff --git b/Utilities/gd32f303e_eval.h a/Utilities/gd32f303e_eval.h new file mode 100644 index 0000000..3daba80 --- /dev/null +++ a/Utilities/gd32f303e_eval.h @@ -0,0 +1,163 @@ +/*! + \file gd32f303e_eval.h + \brief definitions for GD32F303E_EVAL's leds, keys and COM ports hardware resources + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F303E_EVAL_H +#define GD32F303E_EVAL_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "gd32f30x.h" + +/* exported types */ +typedef enum +{ + LED2 = 0, + LED3 = 1, + LED4 = 2, + LED5 = 3 +} led_typedef_enum; + +typedef enum +{ + KEY_WAKEUP = 0, + KEY_TAMPER = 1, + KEY_USER1 = 2, + KEY_USER2 = 3 +} key_typedef_enum; + +typedef enum +{ + KEY_MODE_GPIO = 0, + KEY_MODE_EXTI = 1 +} keymode_typedef_enum; + +/* eval board low layer led */ +#define LEDn 4U + +#define LED2_PIN GPIO_PIN_0 +#define LED2_GPIO_PORT GPIOF +#define LED2_GPIO_CLK RCU_GPIOF + +#define LED3_PIN GPIO_PIN_1 +#define LED3_GPIO_PORT GPIOF +#define LED3_GPIO_CLK RCU_GPIOF + +#define LED4_PIN GPIO_PIN_2 +#define LED4_GPIO_PORT GPIOF +#define LED4_GPIO_CLK RCU_GPIOF + +#define LED5_PIN GPIO_PIN_3 +#define LED5_GPIO_PORT GPIOF +#define LED5_GPIO_CLK RCU_GPIOF + +#define COMn 2U + +#define EVAL_COM1 USART0 +#define EVAL_COM1_CLK RCU_USART0 +#define EVAL_COM1_TX_PIN GPIO_PIN_9 +#define EVAL_COM1_RX_PIN GPIO_PIN_10 +#define EVAL_COM1_GPIO_PORT GPIOA +#define EVAL_COM1_GPIO_CLK RCU_GPIOA + +#define EVAL_COM2 USART1 +#define EVAL_COM2_CLK RCU_USART1 +#define EVAL_COM2_TX_PIN GPIO_PIN_2 +#define EVAL_COM2_RX_PIN GPIO_PIN_3 +#define EVAL_COM2_GPIO_PORT GPIOA +#define EVAL_COM2_GPIO_CLK RCU_GPIOA + +#define KEYn 4U + +/* wakeup push-button */ +#define WAKEUP_KEY_PIN GPIO_PIN_0 +#define WAKEUP_KEY_GPIO_PORT GPIOA +#define WAKEUP_KEY_GPIO_CLK RCU_GPIOA +#define WAKEUP_KEY_EXTI_LINE EXTI_0 +#define WAKEUP_KEY_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOA +#define WAKEUP_KEY_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_0 +#define WAKEUP_KEY_EXTI_IRQn EXTI0_IRQn + +/* tamper push-button */ +#define TAMPER_KEY_PIN GPIO_PIN_13 +#define TAMPER_KEY_GPIO_PORT GPIOC +#define TAMPER_KEY_GPIO_CLK RCU_GPIOC +#define TAMPER_KEY_EXTI_LINE EXTI_13 +#define TAMPER_KEY_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOC +#define TAMPER_KEY_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_13 +#define TAMPER_KEY_EXTI_IRQn EXTI10_15_IRQn + +/* user push-button */ +#define USER_KEY1_PIN GPIO_PIN_5 +#define USER_KEY1_GPIO_PORT GPIOF +#define USER_KEY1_GPIO_CLK RCU_GPIOF +#define USER_KEY1_EXTI_LINE EXTI_5 +#define USER_KEY1_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOF +#define USER_KEY1_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_5 +#define USER_KEY1_EXTI_IRQn EXTI5_9_IRQn + +/* user push-button */ +#define USER_KEY2_PIN GPIO_PIN_4 +#define USER_KEY2_GPIO_PORT GPIOF +#define USER_KEY2_GPIO_CLK RCU_GPIOF +#define USER_KEY2_EXTI_LINE EXTI_4 +#define USER_KEY2_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOF +#define USER_KEY2_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_4 +#define USER_KEY2_EXTI_IRQn EXTI4_IRQn + +/* function declarations */ +/* configure led GPIO */ +void gd_eval_led_init(led_typedef_enum lednum); +/* turn on selected led */ +void gd_eval_led_on(led_typedef_enum lednum); +/* turn off selected led */ +void gd_eval_led_off(led_typedef_enum lednum); +/* toggle the selected led */ +void gd_eval_led_toggle(led_typedef_enum lednum); +/* configure key */ +void gd_eval_key_init(key_typedef_enum key_num, keymode_typedef_enum key_mode); +/* return the selected key state */ +uint8_t gd_eval_key_state_get(key_typedef_enum key); +/* configure COM port */ +void gd_eval_com_init(uint32_t com); + +#ifdef __cplusplus +} +#endif + +#endif /* GD32F303E_EVAL_H */ diff --git b/Utilities/gd32f307c_eval.c a/Utilities/gd32f307c_eval.c new file mode 100644 index 0000000..e7593be --- /dev/null +++ a/Utilities/gd32f307c_eval.c @@ -0,0 +1,224 @@ +/*! + \file gd32f307c_eval.c + \brief firmware functions to manage leds, keys, COM ports + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include +#include "gd32f307c_eval.h" + +/* private variables */ +static uint32_t GPIO_PORT[LEDn] = {LED2_GPIO_PORT, LED3_GPIO_PORT, + LED4_GPIO_PORT, LED5_GPIO_PORT}; +static uint32_t GPIO_PIN[LEDn] = {LED2_PIN, LED3_PIN, LED4_PIN, LED5_PIN}; + +static rcu_periph_enum COM_CLK[COMn] = {EVAL_COM0_CLK, EVAL_COM1_CLK}; +static uint32_t COM_TX_PIN[COMn] = {EVAL_COM0_TX_PIN, EVAL_COM1_TX_PIN}; +static uint32_t COM_RX_PIN[COMn] = {EVAL_COM0_RX_PIN, EVAL_COM1_RX_PIN}; +static uint32_t COM_GPIO_PORT[COMn] = {EVAL_COM0_GPIO_PORT, EVAL_COM1_GPIO_PORT}; +static rcu_periph_enum COM_GPIO_CLK[COMn] = {EVAL_COM0_GPIO_CLK, EVAL_COM1_GPIO_CLK}; + +static rcu_periph_enum GPIO_CLK[LEDn] = {LED2_GPIO_CLK, LED3_GPIO_CLK, + LED4_GPIO_CLK, LED5_GPIO_CLK}; + +static uint32_t KEY_PORT[KEYn] = {WAKEUP_KEY_GPIO_PORT, + TAMPER_KEY_GPIO_PORT, + USER_KEY_GPIO_PORT}; +static uint32_t KEY_PIN[KEYn] = {WAKEUP_KEY_PIN, TAMPER_KEY_PIN,USER_KEY_PIN,}; +static rcu_periph_enum KEY_CLK[KEYn] = {WAKEUP_KEY_GPIO_CLK, + TAMPER_KEY_GPIO_CLK, + USER_KEY_GPIO_CLK}; +static exti_line_enum KEY_EXTI_LINE[KEYn] = {WAKEUP_KEY_EXTI_LINE, + TAMPER_KEY_EXTI_LINE, + USER_KEY_EXTI_LINE}; +static uint8_t KEY_PORT_SOURCE[KEYn] = {WAKEUP_KEY_EXTI_PORT_SOURCE, + TAMPER_KEY_EXTI_PORT_SOURCE, + USER_KEY_EXTI_PORT_SOURCE}; +static uint8_t KEY_PIN_SOURCE[KEYn] = {WAKEUP_KEY_EXTI_PIN_SOURCE, + TAMPER_KEY_EXTI_PIN_SOURCE, + USER_KEY_EXTI_PIN_SOURCE}; +static uint8_t KEY_IRQn[KEYn] = {WAKEUP_KEY_EXTI_IRQn, + TAMPER_KEY_EXTI_IRQn, + USER_KEY_EXTI_IRQn}; + +/*! + \brief configure led GPIO + \param[in] lednum: specify the led to be configured + \arg LED2 + \arg LED3 + \arg LED4 + \arg LED5 + \param[out] none + \retval none +*/ +void gd_eval_led_init (led_typedef_enum lednum) +{ + /* enable the led clock */ + rcu_periph_clock_enable(GPIO_CLK[lednum]); + /* configure led GPIO port */ + gpio_init(GPIO_PORT[lednum], GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN[lednum]); + + GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +} + +/*! + \brief turn on selected led + \param[in] lednum: specify the led to be turned on + \arg LED2 + \arg LED3 + \arg LED4 + \arg LED5 + \param[out] none + \retval none +*/ +void gd_eval_led_on(led_typedef_enum lednum) +{ + GPIO_BOP(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +} + +/*! + \brief turn off selected led + \param[in] lednum: specify the led to be turned off + \arg LED2 + \arg LED3 + \arg LED4 + \arg LED5 + \param[out] none + \retval none +*/ +void gd_eval_led_off(led_typedef_enum lednum) +{ + GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +} + +/*! + \brief toggle selected led + \param[in] lednum: specify the led to be toggled + \arg LED2 + \arg LED3 + \arg LED4 + \arg LED5 + \param[out] none + \retval none +*/ +void gd_eval_led_toggle(led_typedef_enum lednum) +{ + gpio_bit_write(GPIO_PORT[lednum], GPIO_PIN[lednum], + (bit_status)(1-gpio_input_bit_get(GPIO_PORT[lednum], GPIO_PIN[lednum]))); +} + +/*! + \brief configure key + \param[in] key_num: specify the key to be configured + \arg KEY_TAMPER: tamper key + \arg KEY_WAKEUP: wakeup key + \arg KEY_USER: user key + \param[in] key_mode: specify button mode + \arg KEY_MODE_GPIO: key will be used as simple IO + \arg KEY_MODE_EXTI: key will be connected to EXTI line with interrupt + \param[out] none + \retval none +*/ +void gd_eval_key_init(key_typedef_enum key_num, keymode_typedef_enum key_mode) +{ + /* enable the key clock */ + rcu_periph_clock_enable(KEY_CLK[key_num]); + rcu_periph_clock_enable(RCU_AF); + + /* configure button pin as input */ + gpio_init(KEY_PORT[key_num], GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, KEY_PIN[key_num]); + + if (key_mode == KEY_MODE_EXTI) { + /* enable and set key EXTI interrupt to the lowest priority */ + nvic_irq_enable(KEY_IRQn[key_num], 2U, 0U); + + /* connect key EXTI line to key GPIO pin */ + gpio_exti_source_select(KEY_PORT_SOURCE[key_num], KEY_PIN_SOURCE[key_num]); + + /* configure key EXTI line */ + exti_init(KEY_EXTI_LINE[key_num], EXTI_INTERRUPT, EXTI_TRIG_FALLING); + exti_interrupt_flag_clear(KEY_EXTI_LINE[key_num]); + } +} + +/*! + \brief return the selected key state + \param[in] key: specify the key to be checked + \arg KEY_TAMPER: tamper key + \arg KEY_WAKEUP: wakeup key + \arg KEY_USER: user key + \param[out] none + \retval the key's GPIO pin value +*/ +uint8_t gd_eval_key_state_get(key_typedef_enum key) +{ + return gpio_input_bit_get(KEY_PORT[key], KEY_PIN[key]); +} + +/*! + \brief configure COM port + \param[in] com: COM on the board + \arg EVAL_COM0: COM0 on the board + \arg EVAL_COM1: COM1 on the board + \param[out] none + \retval none +*/ +void gd_eval_com_init(uint32_t com) +{ + uint32_t com_id = 0U; + if(EVAL_COM0 == com){ + com_id = 0U; + }else if(EVAL_COM1 == com){ + com_id = 1U; + } + + /* enable GPIO clock */ + rcu_periph_clock_enable(COM_GPIO_CLK[com_id]); + + /* enable USART clock */ + rcu_periph_clock_enable(COM_CLK[com_id]); + + /* connect port to USARTx_Tx */ + gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, COM_TX_PIN[com_id]); + + /* connect port to USARTx_Rx */ + gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, COM_RX_PIN[com_id]); + + /* USART configure */ + usart_deinit(com); + usart_baudrate_set(com, 115200U); + usart_receive_config(com, USART_RECEIVE_ENABLE); + usart_transmit_config(com, USART_TRANSMIT_ENABLE); + usart_enable(com); +} diff --git b/Utilities/gd32f307c_eval.h a/Utilities/gd32f307c_eval.h new file mode 100644 index 0000000..afa6485 --- /dev/null +++ a/Utilities/gd32f307c_eval.h @@ -0,0 +1,181 @@ +/*! + \file gd32f307c_eval.h + \brief definitions for GD32F307C_EVAL's leds, keys and COM ports hardware resources + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F307C_EVAL_H +#define GD32F307C_EVAL_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "gd32f30x.h" + +/* exported types */ +typedef enum +{ + LED2 = 0, + LED3 = 1, + LED4 = 2, + LED5 = 3 +} led_typedef_enum; + +typedef enum +{ + KEY_WAKEUP = 0, + KEY_TAMPER = 1, + KEY_USER = 2 +} key_typedef_enum; + +typedef enum +{ + KEY_MODE_GPIO = 0, + KEY_MODE_EXTI = 1 +} keymode_typedef_enum; + +/* eval board low layer led */ +#define LEDn 4U + +//#define LED2_PIN GPIO_PIN_0 +//#define LED2_GPIO_PORT GPIOC +//#define LED2_GPIO_CLK RCU_GPIOC + +#define LED2_PIN GPIO_PIN_9 +#define LED2_GPIO_PORT GPIOB +#define LED2_GPIO_CLK RCU_GPIOB + +#define LED3_PIN GPIO_PIN_2 +#define LED3_GPIO_PORT GPIOC +#define LED3_GPIO_CLK RCU_GPIOC + +#define LED4_PIN GPIO_PIN_2 +#define LED4_GPIO_PORT GPIOF +#define LED4_GPIO_CLK RCU_GPIOF + +#define LED5_PIN GPIO_PIN_1 +#define LED5_GPIO_PORT GPIOE +#define LED5_GPIO_CLK RCU_GPIOE + +#define COMn 2U + +#define EVAL_COM0 USART0 +#define EVAL_COM0_CLK RCU_USART0 +#define EVAL_COM0_TX_PIN GPIO_PIN_9 +#define EVAL_COM0_RX_PIN GPIO_PIN_10 +#define EVAL_COM0_GPIO_PORT GPIOA +#define EVAL_COM0_GPIO_CLK RCU_GPIOA + +#define EVAL_COM1 USART1 +#define EVAL_COM1_CLK RCU_USART1 +#define EVAL_COM1_TX_PIN GPIO_PIN_2 +#define EVAL_COM1_RX_PIN GPIO_PIN_3 +#define EVAL_COM1_GPIO_PORT GPIOA +#define EVAL_COM1_GPIO_CLK RCU_GPIOA + +#define KEYn 3U + +/* wakeup push-button */ +//#define WAKEUP_KEY_PIN GPIO_PIN_0 +//#define WAKEUP_KEY_GPIO_PORT GPIOA +//#define WAKEUP_KEY_GPIO_CLK RCU_GPIOA +//#define WAKEUP_KEY_EXTI_LINE EXTI_0 +//#define WAKEUP_KEY_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOA +//#define WAKEUP_KEY_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_0 +//#define WAKEUP_KEY_EXTI_IRQn EXTI0_IRQn + +#define WAKEUP_KEY_PIN GPIO_PIN_11 +#define WAKEUP_KEY_GPIO_PORT GPIOC +#define WAKEUP_KEY_GPIO_CLK RCU_GPIOC +#define WAKEUP_KEY_EXTI_LINE EXTI_11 +#define WAKEUP_KEY_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOC +#define WAKEUP_KEY_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_11 +#define WAKEUP_KEY_EXTI_IRQn EXTI10_15_IRQn + +/* tamper push-button */ +//#define TAMPER_KEY_PIN GPIO_PIN_13 +//#define TAMPER_KEY_GPIO_PORT GPIOC +//#define TAMPER_KEY_GPIO_CLK RCU_GPIOC +//#define TAMPER_KEY_EXTI_LINE EXTI_13 +//#define TAMPER_KEY_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOC +//#define TAMPER_KEY_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_13 +//#define TAMPER_KEY_EXTI_IRQn EXTI10_15_IRQn + +#define TAMPER_KEY_PIN GPIO_PIN_10 +#define TAMPER_KEY_GPIO_PORT GPIOC +#define TAMPER_KEY_GPIO_CLK RCU_GPIOC +#define TAMPER_KEY_EXTI_LINE EXTI_10 +#define TAMPER_KEY_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOC +#define TAMPER_KEY_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_10 +#define TAMPER_KEY_EXTI_IRQn EXTI10_15_IRQn + +/* user push-button */ +//#define USER_KEY_PIN GPIO_PIN_14 +//#define USER_KEY_GPIO_PORT GPIOB +//#define USER_KEY_GPIO_CLK RCU_GPIOB +//#define USER_KEY_EXTI_LINE EXTI_14 +//#define USER_KEY_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOB +//#define USER_KEY_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_14 +//#define USER_KEY_EXTI_IRQn EXTI10_15_IRQn + +#define USER_KEY_PIN GPIO_PIN_15 +#define USER_KEY_GPIO_PORT GPIOA +#define USER_KEY_GPIO_CLK RCU_GPIOA +#define USER_KEY_EXTI_LINE EXTI_15 +#define USER_KEY_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOA +#define USER_KEY_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_15 +#define USER_KEY_EXTI_IRQn EXTI10_15_IRQn + +/* function declarations */ +/* configure led GPIO */ +void gd_eval_led_init(led_typedef_enum lednum); +/* turn on selected led */ +void gd_eval_led_on(led_typedef_enum lednum); +/* turn off selected led */ +void gd_eval_led_off(led_typedef_enum lednum); +/* toggle the selected led */ +void gd_eval_led_toggle(led_typedef_enum lednum); +/* configure key */ +void gd_eval_key_init(key_typedef_enum key_num, keymode_typedef_enum key_mode); +/* return the selected key state */ +uint8_t gd_eval_key_state_get(key_typedef_enum key); +/* configure COM port */ +void gd_eval_com_init(uint32_t com); + +#ifdef __cplusplus +} +#endif + +#endif /* GD32F307C_EVAL_H */ diff --git b/Utilities/gd32f307c_lcd_eval.c a/Utilities/gd32f307c_lcd_eval.c new file mode 100644 index 0000000..c9d6b15 --- /dev/null +++ a/Utilities/gd32f307c_lcd_eval.c @@ -0,0 +1,604 @@ +/*! + \file gd32f307c_lcd_eval.c + \brief LCD driver functions + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "gd32f307c_lcd_eval.h" +#include "lcd_font.h" +#include + +#define LCD_ILI9320 0x8989 +#define LCD_ILI9325 0x9325 + +#define ABS(X) ((X) > 0 ? (X) : -(X)) + +static font_struct *cur_fonts; + +/* set the cursor of LCD */ +static void lcd_cursor_set(uint16_t x,uint16_t y); + +__IO uint16_t cur_text_color = 0x0000U; +__IO uint16_t cur_back_color = 0xFFFFU; + +__IO uint16_t cur_text_direction = CHAR_DIRECTION_HORIZONTAL; + +/*! + \brief initializes the LCD of GD EVAL board + \param[in] none + \param[out] none + \retval none +*/ +void gd_eval_lcd_init(void) +{ + __IO uint32_t lcd_id = 0; + + exmc_lcd_init(); + + usb_mdelay(50); + + /* Read the LCD ID */ + lcd_id = lcd_register_read(R0); + + /* check if the LCD is ILI9320 controller */ + if (LCD_ILI9320 == lcd_id) { + lcd_init(); + } +} + +/*! + \brief lcd peripheral initialize + \param[in] none + \param[out] none + \retval none +*/ +void exmc_lcd_init(void) +{ + exmc_norsram_parameter_struct lcd_init_struct; + exmc_norsram_timing_parameter_struct lcd_timing_init_struct; + + /* EXMC clock enable */ + rcu_periph_clock_enable(RCU_EXMC); + + /* GPIO clock enable */ + rcu_periph_clock_enable(RCU_GPIOD); + rcu_periph_clock_enable(RCU_GPIOE); + rcu_periph_clock_enable(RCU_GPIOG); + + /* configure EXMC_D[0~15]*/ + /* PD14(EXMC_D0), PD15(EXMC_D1),PD0(EXMC_D2), PD1(EXMC_D3), PD8(EXMC_D13), PD9(EXMC_D14), PD10(EXMC_D15) */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_8 | GPIO_PIN_9 | + GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15); + + /* PE7(EXMC_D4), PE8(EXMC_D5), PE9(EXMC_D6), PE10(EXMC_D7), PE11(EXMC_D8), PE12(EXMC_D9), + PE13(EXMC_D10), PE14(EXMC_D11), PE15(EXMC_D12) */ + gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | + GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | + GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15); + + /* configure PE2(EXMC_A23) */ + gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); + + /* configure PD4(NOE) and PD5(NWE) */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5); + + /* configure EXMC NE1 */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7); + + lcd_timing_init_struct.asyn_access_mode = EXMC_ACCESS_MODE_A; + lcd_timing_init_struct.syn_data_latency = EXMC_DATALAT_2_CLK; + lcd_timing_init_struct.syn_clk_division = EXMC_SYN_CLOCK_RATIO_DISABLE; + lcd_timing_init_struct.bus_latency = 2; + lcd_timing_init_struct.asyn_data_setuptime = 10; + lcd_timing_init_struct.asyn_address_holdtime = 2; + lcd_timing_init_struct.asyn_address_setuptime = 5; + + lcd_init_struct.norsram_region = EXMC_BANK0_NORSRAM_REGION0; + lcd_init_struct.write_mode = EXMC_ASYN_WRITE; + lcd_init_struct.extended_mode = DISABLE; + lcd_init_struct.asyn_wait = DISABLE; + lcd_init_struct.nwait_signal = DISABLE; + lcd_init_struct.memory_write = ENABLE; + lcd_init_struct.nwait_config = EXMC_NWAIT_CONFIG_BEFORE; + lcd_init_struct.wrap_burst_mode = DISABLE; + lcd_init_struct.nwait_polarity = EXMC_NWAIT_POLARITY_LOW; + lcd_init_struct.burst_mode = DISABLE; + lcd_init_struct.databus_width = EXMC_NOR_DATABUS_WIDTH_16B; + lcd_init_struct.memory_type = EXMC_MEMORY_TYPE_SRAM; + lcd_init_struct.address_data_mux = DISABLE; + lcd_init_struct.read_write_timing = &lcd_timing_init_struct; + lcd_init_struct.write_timing = &lcd_timing_init_struct; + + exmc_norsram_init(&lcd_init_struct); + + exmc_norsram_enable(EXMC_BANK0_NORSRAM_REGION1); +} + + +/*! + \brief write data to the selected LCD register + \param[in] register_id: the selected register id + \param[in] value: the register value to be written + \param[out] none + \retval none +*/ + +void lcd_register_write(uint16_t register_id,uint16_t value) +{ + *(__IO uint16_t *) (BANK0_LCD_C)= register_id; + *(__IO uint16_t *) (BANK0_LCD_D)= value; +} + +/*! + \brief read the value of LCD register + \param[in] register_id: the register id + \param[out] none + \retval the register value +*/ +uint16_t lcd_register_read(uint8_t register_id) +{ + uint16_t data; + *(__IO uint16_t *) (BANK0_LCD_C)= register_id; + data = *(__IO uint16_t *) (BANK0_LCD_D); + return data; +} + +/*! + \brief write command to LCD register + \param[in] value: the register value to be written + \param[out] none + \retval none +*/ +void lcd_command_write(uint16_t value) +{ + /* write 16-bit index, then write reg */ + *(__IO uint16_t *) (BANK0_LCD_D) = value; +} + +/*! + \brief prepare to write to the LCD GRAM register(R22h) + \param[in] none + \param[out] none + \retval none +*/ +void lcd_gram_write_prepare(void) +{ + *(__IO uint16_t *) (BANK0_LCD_C) = 0x0022; +} + +/*! + \brief write RGB code to the LCD GRAM register + \param[in] rgb_code: the pixel color in RGB mode (5-6-5) + \param[out] none + \retval none +*/ +void lcd_gram_write(uint16_t rgb_code) +{ + /* write 16-bit GRAM register */ + *(__IO uint16_t *) (BANK0_LCD_D) = rgb_code; +} + +/*! + \brief read data from GRAM + \param[in] none + \param[out] none + \retval GRAM value +*/ +uint16_t lcd_gram_read(void) +{ + uint16_t data; + + /* write GRAM register (R22h) */ + *(__IO uint16_t *) (BANK0_LCD_C) = 0x0022; + /* dummy read (invalid data) */ + *(__IO uint16_t *) (BANK0_LCD_D); + + data = *(__IO uint16_t *) (BANK0_LCD_D); + return data; +} + +/*! + \brief initialize the LCD + \param[in] none + \param[out] none + \retval none +*/ +void lcd_init(void) +{ + uint16_t i; + + if(1){ /*!< if(device_code == 0x8989) */ + lcd_register_write(0x0000,0x0001); + lcd_register_write(0x0003,0xA8A4); + lcd_register_write(0x000C,0x0000); + lcd_register_write(0x000D,0x080C); + lcd_register_write(0x000E,0x2B00); + lcd_register_write(0x001E,0x00B0); + lcd_register_write(0x0001,0x693F); + lcd_register_write(0x0002,0x0600); + lcd_register_write(0x0010,0x0000); + lcd_register_write(0x0011,0x6070); + lcd_register_write(0x0005,0x0000); + lcd_register_write(0x0006,0x0000); + lcd_register_write(0x0016,0xEF1C); + lcd_register_write(0x0017,0x0003); + lcd_register_write(0x0007,0x0233); + lcd_register_write(0x000B,0x0000); + lcd_register_write(0x000F,0x0000); + lcd_register_write(0x0041,0x0000); + lcd_register_write(0x0042,0x0000); + lcd_register_write(0x0048,0x0000); + lcd_register_write(0x0049,0x013F); + lcd_register_write(0x004A,0x0000); + lcd_register_write(0x004B,0x0000); + lcd_register_write(0x0044,0xEF00); + lcd_register_write(0x0045,0x0000); + lcd_register_write(0x0046,0x013F); + lcd_register_write(0x0030,0x0707); + lcd_register_write(0x0031,0x0204); + lcd_register_write(0x0032,0x0204); + lcd_register_write(0x0033,0x0502); + lcd_register_write(0x0034,0x0507); + lcd_register_write(0x0035,0x0204); + lcd_register_write(0x0036,0x0204); + lcd_register_write(0x0037,0x0502); + lcd_register_write(0x003A,0x0302); + lcd_register_write(0x003B,0x0302); + lcd_register_write(0x0023,0x0000); + lcd_register_write(0x0024,0x0000); + lcd_register_write(0x0025,0x8000); + lcd_register_write(0x004e,0); + lcd_register_write(0x004f,0); + }else{ + return; + } + + for(i=50000;i>0;i--); +} + +/*! + \brief set the text color + \param[in] color: LCD color + \arg LCD_COLOR_WHITE + \arg LCD_COLOR_BLACK + \arg LCD_COLOR_GREY + \arg LCD_COLOR_BLUE + \arg LCD_COLOR_BLUE2 + \arg LCD_COLOR_RED + \arg LCD_COLOR_MAGENTA + \arg LCD_COLOR_GREEN + \arg LCD_COLOR_CYAN + \arg LCD_COLOR_YELLOW + \param[out] none + \retval none +*/ +void lcd_text_color_set(__IO uint16_t color) +{ + cur_text_color = color; +} + +/*! + \brief get the current text color + \param[in] none + \param[out] none + \retval LCD color + \arg LCD_COLOR_WHITE + \arg LCD_COLOR_BLACK + \arg LCD_COLOR_GREY + \arg LCD_COLOR_BLUE + \arg LCD_COLOR_BLUE2 + \arg LCD_COLOR_RED + \arg LCD_COLOR_MAGENTA + \arg LCD_COLOR_GREEN + \arg LCD_COLOR_CYAN + \arg LCD_COLOR_YELLOW +*/ +uint16_t lcd_text_color_get(void) +{ + return cur_text_color; +} + +/*! + \brief set the background color + \param[in] color: LCD color + \arg LCD_COLOR_WHITE + \arg LCD_COLOR_BLACK + \arg LCD_COLOR_GREY + \arg LCD_COLOR_BLUE + \arg LCD_COLOR_BLUE2 + \arg LCD_COLOR_RED + \arg LCD_COLOR_MAGENTA + \arg LCD_COLOR_GREEN + \arg LCD_COLOR_CYAN + \arg LCD_COLOR_YELLOW + \param[out] none + \retval none +*/ +void lcd_background_color_set(__IO uint16_t color) +{ + cur_back_color = color; +} + +/*! + \brief get the current background color + \param[in] none + \param[out] none + \retval LCD color + \arg LCD_COLOR_WHITE + \arg LCD_COLOR_BLACK + \arg LCD_COLOR_GREY + \arg LCD_COLOR_BLUE + \arg LCD_COLOR_BLUE2 + \arg LCD_COLOR_RED + \arg LCD_COLOR_MAGENTA + \arg LCD_COLOR_GREEN + \arg LCD_COLOR_CYAN + \arg LCD_COLOR_YELLOW +*/ +uint16_t lcd_background_color_get(void) +{ + return cur_back_color; +} + +/*! + \brief set the text font + \param[in] font: the text font + \param[out] none + \retval none +*/ +void lcd_font_set(font_struct *fonts) +{ + cur_fonts = fonts; +} + +/*! + \brief get the text font + \param[in] none + \param[out] none + \retval the text font +*/ +font_struct *lcd_font_get(void) +{ + return cur_fonts; +} + +/*! + \brief set the cursor of LCD + \param[in] x: the row-coordinate + \param[in] y: the column-coordinate + \param[out] none + \retval none +*/ +static void lcd_cursor_set(uint16_t x,uint16_t y) +{ + lcd_register_write(0x004e,x); + lcd_register_write(0x004f,y); + +} + +/*! + \brief clear the LCD screen to the specified color + \param[in] color: specified screen color + \param[out] none + \retval none +*/ +void lcd_clear(uint16_t color) +{ + uint32_t index=0; + lcd_cursor_set(0,0); + /* prepare to write GRAM */ + lcd_gram_write_prepare(); + for(index=0;index<76800;index++){ + *(__IO uint16_t *) (BANK0_LCD_D) = color; + } +} + +/*! + \brief set the point according to the specified position and color + \param[in] x: the row-coordinate + \param[in] y: the column-coordinate + \param[in] point: specified color of the point + \param[out] none + \retval none +*/ +void lcd_point_set(uint16_t x,uint16_t y,uint16_t point) +{ + if ((x > 240)||(y > 320)){ + return; + } + lcd_cursor_set(x,y); + lcd_gram_write_prepare(); + lcd_gram_write(point); +} + +/*! + \brief get point GRAM according to the specified position + \param[in] x: the row-coordinate + \param[in] y: the column-coordinate + \param[out] none + \retval GRAM value of point +*/ +uint16_t lcd_point_get(uint16_t x,uint16_t y) +{ + uint16_t data; + + if ((x > 240)||(y > 320)){ + return 0; + } + + lcd_cursor_set(x,y); + data = lcd_gram_read(); + + return data; +} + +/*! + \brief draw a horizontal line on LCD screen + \param[in] x: the row-coordinate + \param[in] start_y: the start column-coordinate + \param[in] end_y: the end column-coordinate + \param[in] color: specified color of the point + \param[in] width: line width + \param[out] none + \retval none +*/ + +void lcd_hline_draw(uint16_t x,uint16_t start_y,uint16_t end_y,uint16_t color,uint16_t width) +{ + uint16_t i, y; + + for (i = 0; i < width; i++) { + uint16_t sx = x + i; + + for (y = start_y; y < end_y; y++) { + lcd_point_set(sx, y, color); + } + } +} + +/*! + \brief draw a rectangle according to the specified position and color + \param[in] start_x: the start position of row-coordinate + \param[in] start_y: the start position of column-coordinate + \param[in] end_x: the end position of row-coordinate + \param[in] end_y: the end position of column-coordinate + \param[in] point: specified color of the point + \param[out] none + \retval none +*/ +void lcd_rectangle_draw(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t point) +{ + uint16_t x,y; + x=start_x; + y=start_y; + /* draw four lines */ + for(x=start_x;xstart_x;x--){ + lcd_point_set(x,y,point); + } + for(y=end_y;y>start_y;y--){ + lcd_point_set(x,y,point); + } +} + +/*! + \brief fill the specified color to a rectangle + \param[in] start_x: the start position of row-coordinate + \param[in] start_y: the start position of column-coordinate + \param[in] end_x: the end position of row-coordinate + \param[in] end_y: the end position of column-coordinate + \param[in] color: specified color + \param[out] none + \retval none +*/ +void lcd_rectangle_fill(uint16_t start_x,uint16_t start_y,uint16_t width,uint16_t height) +{ + uint16_t x, y; + x = start_x; + y = start_y; + + for (x = start_x; x < start_x+width; x++) { + for (y = start_y; y < start_y+height; y++) { + lcd_point_set(x, y, cur_text_color); + } + } +} + +/*! + \brief display a char on LCD screen according to the specified position + \param[in] x: the start position of row-coordinate + \param[in] y: the start position of column-coordinate + \param[in] c: the char + \param[in] char_color: the color of char + \param[in] c_format: the struct of char format + font: CHAR_FONT_8_16 or CHAR_FONT_16_24 + direction: CHAR_DIRECTION_HORIZONTAL or CHAR_DIRECTION_VERTICAL + char_color: the color of char + bk_color: the color of backgroud + \param[out] none + \retval none +*/ +void lcd_char_display(uint16_t x,uint16_t y,uint8_t c) +{ + uint16_t i = 0, j = 0; + uint8_t temp_char = 0; + + for (i = 0; i < cur_fonts->height; i++) { + temp_char = cur_fonts->table[((c - 0x20) * 16) + i]; + if(CHAR_DIRECTION_HORIZONTAL == cur_text_direction){ + for (j = 0; j < cur_fonts->width; j++) { + if (((temp_char >> (7 - j)) & 0x01) == 0x01) { + /* set point of char */ + lcd_point_set(x - i, y + j, cur_text_color); + } else { + /* set point of background */ + lcd_point_set(x - i, y + j, cur_back_color); + } + } + }else{ + for (j = 0; j < cur_fonts->width; j++) { + if (((temp_char >> (7 - j)) & 0x01) == 0x01) { + /* set point of char */ + lcd_point_set(x + j, y + i, cur_text_color); + } else { + /* set point of background */ + lcd_point_set(x + j, y + i, cur_back_color); + } + } + } + } +} + +/* display the vertical character on LCD */ +void lcd_vertical_char_display(uint16_t line, uint16_t column, uint8_t ascii) +{ + lcd_char_display(line, column, ascii); +} + +void lcd_vertical_string_display(uint16_t stringline, uint16_t offset, uint8_t *ptr) +{ + uint16_t i = 0U; + int len = strlen((const char *)ptr); + + for (i = 0; i < len; i ++) { + lcd_char_display(stringline, (offset + 8 * i), *ptr++); + } +} diff --git b/Utilities/gd32f307c_lcd_eval.h a/Utilities/gd32f307c_lcd_eval.h new file mode 100644 index 0000000..e49c931 --- /dev/null +++ a/Utilities/gd32f307c_lcd_eval.h @@ -0,0 +1,248 @@ +/*! + \file gd32f307c_lcd_eval.h + \brief LCD driver header file + + \version 2017-02-10, V1.0.0, firmware for GD32F30x + \version 2018-10-10, V1.1.0, firmware for GD32F30x + \version 2018-12-25, V2.0.0, firmware for GD32F30x + \version 2020-09-30, V2.1.0, firmware for GD32F30x +*/ + +/* + Copyright (c) 2020, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32F307C_LCD_EVAL_H +#define GD32F307C_LCD_EVAL_H + +#include "lcd_font.h" +#include "gd32f30x.h" + +#define BANK0_LCD_C ((uint32_t)0x60000000) /*!< LCD registers address */ +#define BANK0_LCD_D ((uint32_t)0x61000000) /*!< LCD data address */ + +/* LCD registers */ +#define R0 0x00 +#define R1 0x01 +#define R2 0x02 +#define R3 0x03 +#define R4 0x04 +#define R5 0x05 +#define R6 0x06 +#define R7 0x07 +#define R8 0x08 +#define R9 0x09 +#define R10 0x0A +#define R11 0x0B +#define R12 0x0C +#define R13 0x0D +#define R14 0x0E +#define R15 0x0F +#define R16 0x10 +#define R17 0x11 +#define R18 0x12 +#define R19 0x13 +#define R20 0x14 +#define R21 0x15 +#define R22 0x16 +#define R23 0x17 +#define R24 0x18 +#define R25 0x19 +#define R26 0x1A +#define R27 0x1B +#define R28 0x1C +#define R29 0x1D +#define R30 0x1E +#define R31 0x1F +#define R32 0x20 +#define R33 0x21 +#define R34 0x22 +#define R35 0x23 +#define R36 0x24 +#define R37 0x25 +#define R40 0x28 +#define R41 0x29 +#define R43 0x2B +#define R45 0x2D +#define R48 0x30 +#define R49 0x31 +#define R50 0x32 +#define R51 0x33 +#define R52 0x34 +#define R53 0x35 +#define R54 0x36 +#define R55 0x37 +#define R56 0x38 +#define R57 0x39 +#define R58 0x3A +#define R59 0x3B +#define R60 0x3C +#define R61 0x3D +#define R62 0x3E +#define R63 0x3F +#define R64 0x40 +#define R65 0x41 +#define R66 0x42 +#define R67 0x43 +#define R68 0x44 +#define R69 0x45 +#define R70 0x46 +#define R71 0x47 +#define R72 0x48 +#define R73 0x49 +#define R74 0x4A +#define R75 0x4B +#define R76 0x4C +#define R77 0x4D +#define R78 0x4E +#define R79 0x4F +#define R80 0x50 +#define R81 0x51 +#define R82 0x52 +#define R83 0x53 +#define R96 0x60 +#define R97 0x61 +#define R106 0x6A +#define R118 0x76 +#define R128 0x80 +#define R129 0x81 +#define R130 0x82 +#define R131 0x83 +#define R132 0x84 +#define R133 0x85 +#define R134 0x86 +#define R135 0x87 +#define R136 0x88 +#define R137 0x89 +#define R139 0x8B +#define R140 0x8C +#define R141 0x8D +#define R143 0x8F +#define R144 0x90 +#define R145 0x91 +#define R146 0x92 +#define R147 0x93 +#define R148 0x94 +#define R149 0x95 +#define R150 0x96 +#define R151 0x97 +#define R152 0x98 +#define R153 0x99 +#define R154 0x9A +#define R157 0x9D +#define R192 0xC0 +#define R193 0xC1 +#define R229 0xE5 + +/* LCD color */ +#define LCD_COLOR_WHITE 0xFFFF +#define LCD_COLOR_BLACK 0x0000 +#define LCD_COLOR_GREY 0xF7DE +#define LCD_COLOR_BLUE 0x001F +#define LCD_COLOR_BLUE2 0x051F +#define LCD_COLOR_RED 0xF800 +#define LCD_COLOR_MAGENTA 0xF81F +#define LCD_COLOR_GREEN 0x07E0 +#define LCD_COLOR_CYAN 0x7FFF +#define LCD_COLOR_YELLOW 0xFFE0 + +/* definitions of lines depending on the chosen fonts */ +#define LCD_LINE_0 LINE(0) +#define LCD_LINE_1 LINE(1) +#define LCD_LINE_2 LINE(2) +#define LCD_LINE_3 LINE(3) +#define LCD_LINE_4 LINE(4) +#define LCD_LINE_5 LINE(5) +#define LCD_LINE_6 LINE(6) +#define LCD_LINE_7 LINE(7) +#define LCD_LINE_8 LINE(8) +#define LCD_LINE_9 LINE(9) + +#define LCD_DEFAULT_FONT font16x24 /*!< LCD default font */ + +#define CHAR_FONT_8_16 ((uint16_t)0x0000U) /*!< the font of char is 8X16 */ +#define CHAR_FONT_16_24 ((uint16_t)0x0001U) /*!< the font of char is 16X24 */ + +#define CHAR_DIRECTION_HORIZONTAL ((uint16_t)0x0000U) /*!< character display direction is horizontal */ +#define CHAR_DIRECTION_VERTICAL ((uint16_t)0x0001U) /*!< character display direction is vertical */ + +#define LCD_PIXEL_HEIGHT (uint16_t)320 +#define LCD_PIXEL_WIDTH (uint16_t)240 + +/* initializes the LCD of GD EVAL board */ +void gd_eval_lcd_init(void); +/* LCD peripheral initialize */ +void exmc_lcd_init(void); +/* initializes the LCD */ +void lcd_init(void); +/* write data to the selected LCD register */ +void lcd_register_write(uint16_t register_id,uint16_t value); +/* read the value of LCD register */ +uint16_t lcd_register_read(uint8_t register_id); +/* write command to LCD register */ +void lcd_command_write (uint16_t value); +/* prepare to write to the LCD GRAM */ +void lcd_gram_write_prepare(void); +/* write RGB code to the LCD GRAM register */ +void lcd_gram_write(uint16_t rgb_code); +/* read data from GRAM */ +uint16_t lcd_gram_read(void); + + +/* clear the LCD with specified color */ +void lcd_clear(uint16_t color); +/* set the text font */ +void lcd_font_set(font_struct *font); +/* get the text font */ +font_struct *lcd_font_get(void); +/* set the text color */ +void lcd_text_color_set(uint16_t color); +/* get the current text color */ +uint16_t lcd_text_color_get(void); +/* set the background color */ +void lcd_background_color_set(uint16_t color); +/* get the current background color */ +uint16_t lcd_background_color_get(void); + + +/* set the point according to the specified position and color */ +void lcd_point_set(uint16_t x,uint16_t y,uint16_t point); +/* get the point according to the specified position */ +uint16_t lcd_point_get(uint16_t x,uint16_t y); +/* draw a horizontal line on LCD screen */ +void lcd_hline_draw(uint16_t x,uint16_t start_y,uint16_t end_y,uint16_t color,uint16_t width); +/* draw a rectangle according to the specified position and color */ +void lcd_rectangle_draw(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t point); +/* fill the specified color to a rectangle */ +void lcd_rectangle_fill(uint16_t start_x,uint16_t start_y,uint16_t width,uint16_t height); +/* display a char on LCD screen according to the specified position */ +void lcd_char_display(uint16_t x,uint16_t y,uint8_t c); +/* display the vertical character on LCD */ +void lcd_vertical_char_display(uint16_t line, uint16_t column, uint8_t ascii); +/* display the vertical string on LCD */ +void lcd_vertical_string_display(uint16_t stringline, uint16_t offset, uint8_t *ptr); + +#endif /* GD32F307C_LCD_EVAL_H */