Compare commits

...

No commits in common. 'main' and 'check' have entirely different histories.
main ... check

16
00.sy

@ -0,0 +1,16 @@
int gcd(int a, int b) {
if (a == b){ return a; }
else if (a > b) { return gcd(a - b, b); }
else return gcd(b - a, a);
}
const int LF = 10;
int main(){
int a,b;
a = getint();
b = getint();
putint(gcd(a,b));
putch(LF);
return 0;
}

12
01.sy

@ -0,0 +1,12 @@
float LF = 1;
const int LF = 10;
int main(){
int a,b;
a = getint();
b = getint();
putint(gcd(a,b));
putch(LF);
return 0;
}
// Redefined Variable 重复定义变量/重复声明

17
02.sy

@ -0,0 +1,17 @@
int gcd(int a, int a) {
if (a == b){ return a; }
else if (a > b) { return gcd(a - b, b); }
else return gcd(b - a, a);
}
const int LF = 10;
int main(){
int a,b;
a = getint();
b = getint();
putint(gcd(a,b));
putch(LF);
return 0;
}
// Redefined Variable 函数形参重复定义

17
03.sy

@ -0,0 +1,17 @@
int gcd(int a, int b) {
if (a == b){ return a; }
else if (a > b) { return gcd(a - b, b); }
else return gcd(b - a, a);
}
void gcd(int a) {
return ;
}
int main(){
int a,b;
a = getint();
b = getint();
putint(gcd(a,b));
putch(LF);
return 0;
}
// Redefined Function 函数重复定义

@ -0,0 +1,9 @@
int main(){
int b;
a = getint();
b = getint();
putint(gcd(a,b));
putch(LF);
return 0;
}
// Use Undefined Variable 使用未定义变量

@ -0,0 +1,8 @@
int main(){
int a = 0,b = 0;
a = test();
b = getint();
test(a,b);
return 0;
}
// Use Undefined Function 使用未定义函数

14
06.sy

@ -0,0 +1,14 @@
int gcd(int a, int b) {
return 1;
}
int main(){
int a,b;
a = getint();
b = getint();
gcd(gcd(),gcd());
putint(gcd(a));
putch(LF);
return 0;
}
// Redefined Function 函数重复定义
// 不要出现这样的形式putint(gcd(a))putint是系统自带函数没有处理因为没有进行处理

11
07.sy

@ -0,0 +1,11 @@
float test(int a, int b) {
if (a+b==1){
return a+b;
}
return 0.1;
}
int main() {
float c = test(1,1);
return 0;
}
// Func Return Type Not Match 返回类型不匹配

11
08.sy

@ -0,0 +1,11 @@
int test(int a, int b) {
int d[1][2];
int c[10];
c[0.1] = 0;
return 1;
}
int main() {
int c = test(1,1);
return 0;
}
// Array index not int 数组下标不是整数

18
09.sy

@ -0,0 +1,18 @@
int test(int a, int b) {
int i = 0;
while (i <= 10) {
i = i + 1;
if ( i == 3 ) {
break;
}
}
return 1;
}
int main() {
int c = test(1,1);
continue;
return 0;
}
// Break not in loop break语句不在循环中

18
10.sy

@ -0,0 +1,18 @@
int test(int a, int b) {
int i = 0;
while (i <= 10) {
i = i + 1;
}
if ( i == 11 ) {
break;
}
return 1;
}
int main() {
int c = test(1,1);
continue;
return 0;
}
// Continue not in loop break语句不在循环中

12
11.sy

@ -0,0 +1,12 @@
int test(int a, int b) {
int c ;
c[10] = a + b;
}
int main() {
int c = test(1,1);
return 0;
}
// Visit non-array variable in the form of subscript variables 对非数组变量采用下标变量的形式访问

18
14.sy

@ -0,0 +1,18 @@
int main(){
int i = 1;
while (i < 9) {
int j = 1;
while (j < 0) {
int a = i * j * b;
c = a;
j = j + 1;
//if (j == 5) break;
}
d = j;
if (i == 5) break;
i = i + 1;
}
i = e * 5;
return 0;
}

11
20.sy

@ -0,0 +1,11 @@
int main(){
int a,b;
a = 0;
while (a < 10) {
c = c + a;
a = a + 1;
}
return 0;
}

@ -1,24 +0,0 @@
cmake_minimum_required(VERSION 3.21)
option(BUILD_IR_TESTING "Build IR testing" OFF)
project(CarrotCompiler VERSION 0.1
DESCRIPTION "Simple compiler targeted armv7 for SysY Language"
LANGUAGES CXX)
# Common build options
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")
# set(BUILD_IR_TESTING true)
# Generic includes
set(INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/include")
include_directories(${INCLUDE_DIRECTORIES})
# Compiler sources
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_subdirectory(src)
# Unit tests
include(CTest)
if(BUILD_TESTING)
add_subdirectory(runtime)
endif(BUILD_TESTING)

@ -1,2 +0,0 @@
# sysy2022armhk

@ -1,111 +0,0 @@
# arguments checking
if(NOT COMPILER)
message(FATAL_ERROR "Require COMPILER to be defined")
endif(NOT COMPILER)
if(NOT RUNTIME)
message(FATAL_ERROR "Require RUNTIME to be defined")
endif(NOT RUNTIME)
if(NOT TEST_DIR)
message(FATAL_ERROR "Require TEST_DIR to be defined")
endif(NOT TEST_DIR)
if(NOT TEST_NAME)
message(FATAL_ERROR "Require TEST_NAME to be defined")
endif(NOT TEST_NAME)
# Sources
set(TEST_SRC "${TEST_DIR}/${TEST_NAME}.sy")
if(EXISTS "${TEST_DIR}/${TEST_NAME}.in")
set(TEST_INS "${TEST_DIR}/${TEST_NAME}.in")
else(EXISTS "${TEST_DIR}/${TEST_NAME}.in")
set(TEST_INS "/dev/null")
endif(EXISTS "${TEST_DIR}/${TEST_NAME}.in")
set(RUNTIME_ASM "${RUNTIME}/sysy.ll")
# Generated
set(TEST_ASM "${TEST_NAME}.ll")
set(TEST_BTC "${TEST_NAME}.bc")
set(TEST_OUT "${TEST_NAME}_ir.out")
configure_file("${TEST_DIR}/${TEST_NAME}.out" "${TEST_NAME}.ref" NEWLINE_STYLE LF)
set(TEST_REF "${TEST_NAME}.ref")
# SysY to LLVM IR
execute_process(
COMMAND
${COMPILER} -c ${TEST_SRC}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
OUTPUT_FILE ${TEST_ASM}
ERROR_VARIABLE TEST_ERR
RESULT_VARIABLE TEST_RET
)
if(TEST_RET)
message(SEND_ERROR "Failed: SysY Compiler Error in ${TEST_SRC}: ${TEST_ERR}")
file(READ "${TEST_SRC}" TEST_SRC_CONTENT)
message(NOTICE "Source File:\n ${TEST_SRC_CONTENT}")
return()
endif(TEST_RET)
# LLVM IR & Runtime link to BitCode
execute_process(
COMMAND
llvm-link "${RUNTIME_ASM}" "${CMAKE_CURRENT_BINARY_DIR}/${TEST_ASM}"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
OUTPUT_FILE ${TEST_BTC}
ERROR_VARIABLE TEST_ERR
RESULT_VARIABLE TEST_RET
)
if(TEST_RET)
message(SEND_ERROR "Failed: LLVM Link Error in ${TEST_SRC}: ${TEST_ERR}")
file(READ "${TEST_ERR}" TEST_ERR_CONTENT)
message(NOTICE "Generated Assmebly:\n ${TEST_ERR_CONTENT}")
return()
endif(TEST_RET)
# Run BitCode with lli
execute_process(
COMMAND
lli ${TEST_BTC}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
INPUT_FILE ${TEST_INS}
OUTPUT_VARIABLE TEST_OUT_CONTENT
ERROR_VARIABLE TEST_ERR
RESULT_VARIABLE TEST_RET
TIMEOUT 10
)
# Append EOF LR, if not presented
if(TEST_OUT_CONTENT)
string(LENGTH "${TEST_OUT_CONTENT}" TEST_OUT_LEN)
math(EXPR TEST_OUT_LAST "${TEST_OUT_LEN} - 1")
string(SUBSTRING "${TEST_OUT_CONTENT}" ${TEST_OUT_LAST} 1 LAST_CHAR)
if(NOT "${LAST_CHAR}" STREQUAL "\n")
# If it's not, append a newline to var
set(TEST_OUT_CONTENT "${TEST_OUT_CONTENT}\n")
endif()
endif(TEST_OUT_CONTENT)
set(TEST_OUT_CONTENT "${TEST_OUT_CONTENT}${TEST_RET}\n")
file(WRITE "${TEST_OUT}" "${TEST_OUT_CONTENT}")
execute_process(
COMMAND "${CMAKE_COMMAND}" -E compare_files "${TEST_OUT}" "${TEST_REF}"
RESULT_VARIABLE TEST_RESULT
)
if(TEST_RESULT)
# get_filename_component(TESTNAME "${TEST_ARGS}" NAME)
# file(RENAME "${TEST_OUTPUT}" "${CMAKE_BINARY_DIR}/${TESTNAME}.out")
# file(WRITE "${CMAKE_BINARY_DIR}/${TESTNAME}.err" ${TEST_ERROR})
message(SEND_ERROR "Failed: The output of ${TEST_NAME} did not match ${TEST_REF}")
file(READ ${TEST_REF} TEST_REF_CONTENT)
message(NOTICE "Expected Output: ${TEST_REF_CONTENT}")
message(NOTICE "Auctual Output: ${TEST_OUT_CONTENT}")
return()
endif(TEST_RESULT)

@ -1,110 +0,0 @@
# arguments checking
if(NOT COMPILER)
message(FATAL_ERROR "Require COMPILER to be defined")
endif(NOT COMPILER)
if(NOT RUNTIME)
message(FATAL_ERROR "Require RUNTIME to be defined")
endif(NOT RUNTIME)
if(NOT TEST_DIR)
message(FATAL_ERROR "Require TEST_DIR to be defined")
endif(NOT TEST_DIR)
if(NOT TEST_NAME)
message(FATAL_ERROR "Require TEST_NAME to be defined")
endif(NOT TEST_NAME)
# Sources
set(TEST_SRC "${TEST_DIR}/${TEST_NAME}.sy")
if(EXISTS "${TEST_DIR}/${TEST_NAME}.in")
set(TEST_INS "${TEST_DIR}/${TEST_NAME}.in")
else(EXISTS "${TEST_DIR}/${TEST_NAME}.in")
set(TEST_INS "/dev/null")
endif(EXISTS "${TEST_DIR}/${TEST_NAME}.in")
set(RUNTIME_LIB "${RUNTIME}/libsysy.a")
# Generated
set(TEST_ASM "${TEST_NAME}.s")
set(TEST_EXE "${TEST_NAME}")
set(TEST_OUT "${TEST_NAME}_rv.out")
configure_file("${TEST_DIR}/${TEST_NAME}.out" "${TEST_NAME}.ref" NEWLINE_STYLE LF)
set(TEST_REF "${TEST_NAME}.ref")
# SysY to RISC-V Assembly
execute_process(
COMMAND
${COMPILER} -S ${TEST_SRC} -O1
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
OUTPUT_FILE ${TEST_ASM}
ERROR_VARIABLE TEST_ERR
RESULT_VARIABLE TEST_RET
)
if(TEST_RET)
message(SEND_ERROR "Failed: SysY Compiler Error in ${TEST_SRC}: ${TEST_ERR}")
file(READ "${TEST_SRC}" TEST_SRC_CONTENT)
message(NOTICE "Source File:\n ${TEST_SRC_CONTENT}")
return()
endif(TEST_RET)
# GCC Assemble and Link
execute_process(
COMMAND
riscv64-linux-gnu-gcc "${CMAKE_CURRENT_BINARY_DIR}/${TEST_ASM}" "${RUNTIME_LIB}" -march=rv64gc -static -o "${CMAKE_CURRENT_BINARY_DIR}/${TEST_EXE}"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
ERROR_VARIABLE TEST_ERR
RESULT_VARIABLE TEST_RET
)
if(TEST_RET)
message(SEND_ERROR "Failed: GCC Assemble and Link Error in ${TEST_SRC}: ${TEST_ERR}")
# file(READ "${TEST_ASM}" TEST_ASM_CONTENT)
message(NOTICE "Generated Assmebly:\n ${TEST_ASM_CONTENT}")
return()
endif(TEST_RET)
# Run the executable with qemu
execute_process(
COMMAND
qemu-riscv64 ${TEST_EXE} -M sifive_u -smp 5 -m 2G
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
INPUT_FILE ${TEST_INS}
OUTPUT_VARIABLE TEST_OUT_CONTENT
ERROR_VARIABLE TEST_ERR
RESULT_VARIABLE TEST_RET
TIMEOUT 60
)
# Append EOF LR, if not presented
if(TEST_OUT_CONTENT)
string(LENGTH "${TEST_OUT_CONTENT}" TEST_OUT_LEN)
math(EXPR TEST_OUT_LAST "${TEST_OUT_LEN} - 1")
string(SUBSTRING "${TEST_OUT_CONTENT}" ${TEST_OUT_LAST} 1 LAST_CHAR)
if(NOT "${LAST_CHAR}" STREQUAL "\n")
# If it's not, append a newline to var
set(TEST_OUT_CONTENT "${TEST_OUT_CONTENT}\n")
endif()
endif(TEST_OUT_CONTENT)
set(TEST_OUT_CONTENT "${TEST_OUT_CONTENT}${TEST_RET}\n")
file(WRITE "${TEST_OUT}" "${TEST_OUT_CONTENT}")
execute_process(
COMMAND "${CMAKE_COMMAND}" -E compare_files "${TEST_OUT}" "${TEST_REF}"
RESULT_VARIABLE TEST_RESULT
)
if(TEST_RESULT)
# get_filename_component(TESTNAME "${TEST_ARGS}" NAME)
# file(RENAME "${TEST_OUTPUT}" "${CMAKE_BINARY_DIR}/${TESTNAME}.out")
# file(WRITE "${CMAKE_BINARY_DIR}/${TESTNAME}.err" ${TEST_ERROR})
message(SEND_ERROR "Failed: The output of ${TEST_NAME} did not match ${TEST_REF}")
file(READ ${TEST_REF} TEST_REF_CONTENT)
message(NOTICE "Expected Output: ${TEST_REF_CONTENT}")
message(NOTICE "Auctual Output: ${TEST_OUT_CONTENT}")
return()
endif(TEST_RESULT)

@ -1,30 +0,0 @@
cmake_minimum_required(VERSION 3.21)
project(SysYRuntime VERSION 1.0
DESCRIPTION "SysY Language official runtime environment"
LANGUAGES C)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_COMPILER "arm-linux-gnueabihf-gcc")
set(INCLUDE_DIRECTORY "${PROJECT_SOURCE_DIR}/include")
include_directories(${INCLUDE_DIRECTORY})
set(SOURCE_FILES "${PROJECT_SOURCE_DIR}/src/sylib.c")
if(BUILD_IR_TESTING)
add_custom_target(sysy-ir ALL
COMMAND clang ${CMAKE_C_FLAGS}
-I ${INCLUDE_DIRECTORY}
-S -emit-llvm
${SOURCE_FILES}
-o ${CMAKE_CURRENT_BINARY_DIR}/sysy.ll
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
COMMENT "Compiling SysY Runtime Library to LLVM-IR"
SOURCES ${SOURCE_FILES})
endif(BUILD_IR_TESTING)
add_library(sysy STATIC ${SOURCE_FILES})
# target_compile_options(sysy PUBLIC ${CMAKE_C_FLAGS} -flto)
# target_compile_options(sysy PUBLIC ${CMAKE_C_FLAGS} -emit-llvm -S)

@ -1,31 +0,0 @@
#ifndef __SYLIB_H_
#define __SYLIB_H_
#include<stdio.h>
#include<stdarg.h>
#include<sys/time.h>
/* Input & output functions */
int getint(),getch(),getarray(int a[]);
float getfloat();
int getfarray(float a[]);
void putint(int a),putch(int a),putarray(int n,int a[]);
void putfloat(float a);
void putfarray(int n, float a[]);
void putf(char a[], ...);
/* Timing function implementation */
struct timeval _sysy_start,_sysy_end;
#define starttime() _sysy_starttime(__LINE__)
#define stoptime() _sysy_stoptime(__LINE__)
#define _SYSY_N 1024
int _sysy_l1[_SYSY_N],_sysy_l2[_SYSY_N];
int _sysy_h[_SYSY_N], _sysy_m[_SYSY_N],_sysy_s[_SYSY_N],_sysy_us[_SYSY_N];
int _sysy_idx;
__attribute((constructor)) void before_main();
__attribute((destructor)) void after_main();
void _sysy_starttime(int lineno);
void _sysy_stoptime(int lineno);
#endif

@ -1,83 +0,0 @@
#include<stdio.h>
#include<stdarg.h>
#include<sys/time.h>
#include"sylib.h"
/* Input & output functions */
int getint(){int t; scanf("%d",&t); return t; }
int getch(){char c; scanf("%c",&c); return (int)c; }
float getfloat(){
float n;
scanf("%a", &n);
return n;
}
int getarray(int a[]){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
return n;
}
int getfarray(float a[]) {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%a", &a[i]);
}
return n;
}
void putint(int a){ printf("%d",a);}
void putch(int a){ printf("%c",a); }
void putarray(int n,int a[]){
printf("%d:",n);
for(int i=0;i<n;i++)printf(" %d",a[i]);
printf("\n");
}
void putfloat(float a) {
printf("%a", a);
}
void putfarray(int n, float a[]) {
printf("%d:", n);
for (int i = 0; i < n; i++) {
printf(" %a", a[i]);
}
printf("\n");
}
void putf(char a[], ...) {
va_list args;
va_start(args, a);
vfprintf(stdout, a, args);
va_end(args);
}
/* Timing function implementation */
__attribute((constructor)) void before_main(){
for(int i=0;i<_SYSY_N;i++)
_sysy_h[i] = _sysy_m[i]= _sysy_s[i] = _sysy_us[i] =0;
_sysy_idx=1;
}
__attribute((destructor)) void after_main(){
for(int i=1;i<_sysy_idx;i++){
fprintf(stderr,"Timer@%04d-%04d: %dH-%dM-%dS-%dus\n",\
_sysy_l1[i],_sysy_l2[i],_sysy_h[i],_sysy_m[i],_sysy_s[i],_sysy_us[i]);
_sysy_us[0]+= _sysy_us[i];
_sysy_s[0] += _sysy_s[i]; _sysy_us[0] %= 1000000;
_sysy_m[0] += _sysy_m[i]; _sysy_s[0] %= 60;
_sysy_h[0] += _sysy_h[i]; _sysy_m[0] %= 60;
}
fprintf(stderr,"TOTAL: %dH-%dM-%dS-%dus\n",_sysy_h[0],_sysy_m[0],_sysy_s[0],_sysy_us[0]);
}
void _sysy_starttime(int lineno){
_sysy_l1[_sysy_idx] = lineno;
gettimeofday(&_sysy_start,NULL);
}
void _sysy_stoptime(int lineno){
gettimeofday(&_sysy_end,NULL);
_sysy_l2[_sysy_idx] = lineno;
_sysy_us[_sysy_idx] += 1000000 * ( _sysy_end.tv_sec - _sysy_start.tv_sec ) + _sysy_end.tv_usec - _sysy_start.tv_usec;
_sysy_s[_sysy_idx] += _sysy_us[_sysy_idx] / 1000000 ; _sysy_us[_sysy_idx] %= 1000000;
_sysy_m[_sysy_idx] += _sysy_s[_sysy_idx] / 60 ; _sysy_s[_sysy_idx] %= 60;
_sysy_h[_sysy_idx] += _sysy_m[_sysy_idx] / 60 ; _sysy_m[_sysy_idx] %= 60;
_sysy_idx ++;
}

@ -1,16 +0,0 @@
cmake_minimum_required(VERSION 3.21)
add_subdirectory(utils)
add_subdirectory(parser)
add_subdirectory(ir)
add_subdirectory(opt)
add_subdirectory(arm)
set(SOURCE_FILES main.cpp)
add_executable(carrotcompiler ${SOURCE_FILES})
set_target_properties(carrotcompiler PROPERTIES OUTPUT_NAME "compiler")
target_include_directories(carrotcompiler PRIVATE utils parser ir opt arm)
target_link_libraries(carrotcompiler utils parser ir opt arm)

@ -1,8 +0,0 @@
cmake_minimum_required(VERSION 3.21)
set(SOURCE_FILES "lir.cpp" backend.cpp regalloc.cpp)
add_library(arm STATIC ${SOURCE_FILES})
target_link_libraries(arm PRIVATE ir)
target_include_directories(arm PRIVATE ${CMAKE_SOURCE_DIR}/src/ir)

File diff suppressed because it is too large Load Diff

@ -1,389 +0,0 @@
#include "lir.h"
const std::map<int, std::string> LIRPhysReg::name_ = {{1, "r0"}, {2, "r1"}, {3, "r2"}, {4, "r3"}, {5, "r4"},
{6, "r5"}, {7, "r6"}, {8, "r7"}, {9, "r8"}, {10, "r9"}, {11, "r10"},
{12, "r11"}, {13, "ip"}, {14, "sp"}, {15, "lr"}, {16, "pc"}};
const std::map<int, std::string> LIRPhysFReg::name_ = {
{-1, "s0"}, {-2, "s1"}, {-3, "s2"}, {-4, "s3"}, {-5, "s4"}, {-6, "s5"}, {-7, "s6"}, {-8, "s7"}, {-9, "s8"}, {-10, "s9"},
{-11, "s10"}, {-12, "s11"}, {-13, "s12"}, {-14, "s13"}, {-15, "s14"}, {-16, "s15"}, {-17, "s16"}, {-18, "s17"}, {-19, "s18"}, {-20, "s19"}, {-21, "s20"},
{-22, "s21"}, {-23, "s22"}, {-24, "s23"}, {-25, "s24"}, {-26, "s25"}, {-27, "s26"}, {-28, "s27"}, {-29, "s28"}, {-30, "s29"}, {-31, "s30"}, {-32, "s31"}};
const std::map<LIRShift::LIRShiftTy, std::string> LIRShift::name_ = {
{LIRShift::LSAsrTy, "asr"},
{LIRShift::LSLslTy, "lsl"},
{LIRShift::LSLsrTy, "lsr"},
{LIRShift::LSRorTy, "ror"},
};
const std::map<LIRInstruction::LIRInstTy, std::string> LIRInstruction::inst_name_ = {{LIRInstruction::LAddTy, "add"},
{LIRInstruction::LSubTy, "sub"},
{LIRInstruction::LRsbTy, "rsb"},
{LIRInstruction::LMulTy, "mul"},
{LIRInstruction::LMlaTy, "mla"},
{LIRInstruction::LMlsTy, "mls"},
{LIRInstruction::LSdivTy, "sdiv"},
{LIRInstruction::LUdivTy, "udiv"},
{LIRInstruction::LAndTy, "and"},
{LIRInstruction::LOrrTy, "orr"},
{LIRInstruction::LEorTy, "eor"},
{LIRInstruction::LLslTy, "lsl"},
{LIRInstruction::LLsrTy, "lsr"},
{LIRInstruction::LAsrTy, "asr"},
{LIRInstruction::LRorTy, "ror"},
{LIRInstruction::LBTy, "b"},
{LIRInstruction::LBlTy, "bl"},
{LIRInstruction::LBxTy, "bx"},
{LIRInstruction::LMovTy, "mov"},
{LIRInstruction::LVmovTy, "vmov"},
{LIRInstruction::LVmovf32Ty, "vmov.f32"},
{LIRInstruction::LMov32Ty, "mov32"},
{LIRInstruction::LLdrTy, "ldr"},
{LIRInstruction::LVldrTy, "vldr"},
{LIRInstruction::LStrTy, "str"},
{LIRInstruction::LVstrTy, "vstr"},
{LIRInstruction::LPushTy, "push"},
{LIRInstruction::LPopTy, "pop"},
{LIRInstruction::LVpushTy, "vpush"},
{LIRInstruction::LVpopTy, "vpop"},
{LIRInstruction::LCmpTy, "cmp"},
{LIRInstruction::LVcmpTy, "vcmp.f32"},
{LIRInstruction::LVaddTy, "vadd.f32"},
{LIRInstruction::LVsubTy, "vsub.f32"},
{LIRInstruction::LVdivTy, "vdiv.f32"},
{LIRInstruction::LVmulTy, "vmul.f32"},
{LIRInstruction::LVmlaTy, "vmla.f32"},
{LIRInstruction::LVmlsTy, "vmls.f32"},
{LIRInstruction::LVnegTy, "vneg.f32"},
{LIRInstruction::LVcvtFSTy, "vcvt.f32.s32"},
{LIRInstruction::LVcvtSFTy, "vcvt.s32.f32"},
{LIRInstruction::LVmrsTy, "vmrs"}};
const std::map<LIRInstruction::LIRCondTy, std::string> LIRInstruction::cond_name_ = {
{LIRInstruction::LCondGT, "gt"}, {LIRInstruction::LCondGE, "ge"}, {LIRInstruction::LCondLT, "lt"}, {LIRInstruction::LCondLE, "le"},
{LIRInstruction::LCondHI, "hi"}, {LIRInstruction::LCondCS, "cs"}, {LIRInstruction::LCondCC, "cc"}, {LIRInstruction::LCondLS, "ls"},
{LIRInstruction::LCondEQ, "eq"}, {LIRInstruction::LCondNE, "ne"}, {LIRInstruction::LCondVC, "vc"}, {LIRInstruction::LCondVS, "vs"}, {LIRInstruction::LCondNone, ""}};
template <typename... Args>
std::string strfmt(const std::string& format, Args... args) {
int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1;
if (size_s <= 0) {
throw std::runtime_error("Error during formatting.");
}
auto size = static_cast<size_t>(size_s);
std::unique_ptr<char[]> buf(new char[size]);
std::snprintf(buf.get(), size, format.c_str(), args...);
return std::string(buf.get(), buf.get() + size - 1);
}
std::string LIRModule::print() {
std::string ret =
"\t.arch armv7-a\n"
"\t.eabi_attribute 28, 1\n"
"\t.eabi_attribute 20, 1\n"
"\t.eabi_attribute 21, 1\n"
"\t.eabi_attribute 23, 3\n"
"\t.eabi_attribute 24, 1\n"
"\t.eabi_attribute 25, 1\n"
"\t.eabi_attribute 26, 2\n"
"\t.eabi_attribute 30, 6\n"
"\t.eabi_attribute 34, 1\n"
"\t.eabi_attribute 18, 4\n"
"\t.arm\n"
"\t.cpu cortex-a15\n"
"\t.fpu neon-vfpv4\n"
"\t.macro mov32, reg, val\n"
"\t\tmovw \\reg, #:lower16:\\val\n"
"\t\tmovt \\reg, #:upper16:\\val\n"
"\t.endm\n";
for (LIRGlobalVariable* gv : global_list_) {
ret += gv->print();
}
ret += "\t.text\n";
for (LIRFunction* f : function_list_) {
ret += f->print();
}
return ret;
}
std::string LIRGlobalVariable::print() {
std::string ret = "\t.global " + name_ + "\n";
if (tid_ == LDataTy) {
ret += "\t.data\n";
} else {
ret += "\t.bss\n";
}
ret += "\t.align 2\n";
ret += "\t.type " + name_ + ", %object\n";
ret += name_ + ":\n";
for (LIRDataDef* dd : init_val_) {
ret += dd->print();
}
return ret;
}
std::string LIRDataDef::print() {
std::string ret = "\t";
if (tid_ == LWordTy) {
ret += ".word ";
} else {
ret += ".zero ";
}
ret += strfmt("%u\n", expr_);
return ret;
}
std::string LIRFunction::print() {
std::string ret = "\t.global " + name_ + "\n" + name_ + ":\t\t\t@num_args_ = "+std::to_string(num_args_)+"; has_result_ = "+(has_result_?"true":"false")+"\n";
for (LIRBasicBlock* bb : basic_blocks_) {
ret += bb->print();
}
return ret;
}
std::string LIRBasicBlock::print() {
std::string ret = name_ + ":\t\t\t@";
ret+="pre_bbs_ = ";
std::string delim = "";
for(LIRBasicBlock* prebb:pre_bbs_){
ret+=delim+prebb->name_;
delim=", ";
}
ret+="; succ_bbs_ = ";
delim="";
for(LIRBasicBlock* succbb:succ_bbs_){
ret+=delim+succbb->name_;
delim=", ";
}
ret+=";\n";
for (LIRInstruction* inst : instr_list_) {
ret += inst->print();
}
return ret;
}
std::string LIRIntInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " ";
std::string delim = "";
if (result_ != nullptr) {
ret += delim + result_->print();
delim=",";
}
for (LIROperand* op : operands_) {
ret += delim + op->print();
delim=",";
}
ret+="\n";
return ret;
}
std::string LIRFloatInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " ";
std::string delim = "";
if (result_ != nullptr) {
ret += delim + result_->print();
delim=",";
}
for (LIROperand* op : operands_) {
ret += delim + op->print();
delim=",";
}
ret+="\n";
return ret;
}
std::string LIRMovInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " "+result_->print() + ","+operands_[0]->print()+"\n";
return ret;
}
std::string LIRVmovInst::print() {
std::string ret="";
LIROperand::LIROprTy result_tid=result_->tid_;
LIROperand::LIROprTy op0_tid=operands_[0]->tid_;
assert((result_tid==LIROperand::LOVirtFRegTy&&op0_tid==LIROperand::LOVirtRegTy)||
(result_tid==LIROperand::LOVirtFRegTy&&op0_tid==LIROperand::LOPhysRegTy)||
(result_tid==LIROperand::LOPhysFRegTy&&op0_tid==LIROperand::LOVirtRegTy)||
(result_tid==LIROperand::LOPhysFRegTy&&op0_tid==LIROperand::LOPhysRegTy)||
(result_tid==LIROperand::LOVirtRegTy&&op0_tid==LIROperand::LOVirtFRegTy)||
(result_tid==LIROperand::LOVirtRegTy&&op0_tid==LIROperand::LOPhysFRegTy)||
(result_tid==LIROperand::LOPhysRegTy&&op0_tid==LIROperand::LOVirtFRegTy)||
(result_tid==LIROperand::LOPhysRegTy&&op0_tid==LIROperand::LOPhysFRegTy));
ret+= "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " "+result_->print() + ","+operands_[0]->print()+"\n";
return ret;
}
std::string LIRVmovf32Inst::print() {
assert(result_->tid_==LIROperand::LOVirtFRegTy||result_->tid_==LIROperand::LOPhysFRegTy);
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " "+result_->print() + ","+operands_[0]->print()+"\n";
return ret;
}
std::string LIRMov32Inst::print() {
assert(result_->tid_==LIROperand::LOVirtRegTy||result_->tid_==LIROperand::LOPhysRegTy);
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " "+result_->print() + ",";
if(dynamic_cast<LIRConstant*>(operands_[0])){
ret+=(operands_[0]->print()).substr(1,std::string::npos)+"\n";
}else{
assert(dynamic_cast<LIRLabel*>(operands_[0]));
ret+=static_cast<LIRLabel*>(operands_[0])->name_+"\n";
}
return ret;
}
std::string LIRLdrInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " ";
assert(result_ != nullptr);
ret += result_->print() + ",";
if(addr_tid_==LRegisterOffsetTy){
ret += "[" + operands_[0]->print() + "," + operands_[1]->print() + "]\n";
}else if(addr_tid_==LPreIndexedTy){
ret += "[" + operands_[0]->print() + "," + operands_[1]->print() + "]!\n";
}else{
assert(addr_tid_==LPostIndexedTy);
ret += "[" + operands_[0]->print() + "]," + operands_[1]->print() + "\n";
}
return ret;
}
std::string LIRVldrInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " ";
assert(result_ != nullptr);
ret += result_->print() + ",";
ret += "[" + operands_[0]->print() + "," + operands_[1]->print() + "]\n";
return ret;
}
std::string LIRStrInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " ";
assert(result_ == nullptr);
if(addr_tid_==LRegisterOffsetTy){
ret += operands_[0]->print() + ",[" + operands_[1]->print() + "," + operands_[2]->print() + "]\n";
}else if(addr_tid_==LPreIndexedTy){
ret += operands_[0]->print() + ",[" + operands_[1]->print() + "," + operands_[2]->print() + "]!\n";
}else{
assert(addr_tid_==LPostIndexedTy);
ret += operands_[0]->print() + ",[" + operands_[1]->print() + "]," + operands_[2]->print() + "\n";
}
return ret;
}
std::string LIRVstrInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " ";
assert(result_ == nullptr);
ret += operands_[0]->print() + ",[" + operands_[1]->print() + "," + operands_[2]->print() + "]\n";
return ret;
}
std::string LIRBInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) +" "+static_cast<LIRLabel*>(operands_[0])->name_+"\n";
return ret;
}
std::string LIRBlInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " "+static_cast<LIRLabel*>(operands_[0])->name_+"\n";
return ret;
}
std::string LIRBxInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " "+operands_[0]->print()+"\n";
return ret;
}
std::string LIRVmrsInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " APSR_nzcv, FPSCR\n";
return ret;
}
std::string LIRPushInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " {";
std::string delim="";
for (LIROperand* op : operands_) {
ret += delim + op->print();
delim=",";
}
ret+="}\n";
return ret;
}
std::string LIRPopInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " {";
std::string delim="";
for (LIROperand* op : operands_) {
ret += delim + op->print();
delim=",";
}
ret+="}\n";
return ret;
}
std::string LIRVpushInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " {";
std::string delim="";
for (LIROperand* op : operands_) {
ret += delim + op->print();
delim=",";
}
ret+="}\n";
return ret;
}
std::string LIRVpopInst::print() {
std::string ret = "\t" + inst_name_.at(op_id_) + cond_name_.at(cond_id_) + " {";
std::string delim="";
for (LIROperand* op : operands_) {
ret += delim + op->print();
delim=",";
}
ret+="}\n";
return ret;
}
std::string LIRConstant::print() {
std::string ret = "#" + std::to_string(value_);
return ret;
}
std::string LIRShift::print() {
std::string ret = name_.at(tid_)+" #" + std::to_string(amount_);
return ret;
}
std::string LIRVirtReg::print() {
std::string ret = "v" + std::to_string(rid_);
return ret;
}
std::string LIRPhysReg::print() {
std::string ret = name_.at(rid_);
return ret;
}
std::string LIRVirtFReg::print() {
std::string ret = "x" + std::to_string(frid_);
return ret;
}
std::string LIRPhysFReg::print() {
std::string ret = name_.at(frid_);
return ret;
}
void LIRBasicBlock::delete_instr(LIRInstruction* instr){
instr_list_.remove(instr);
for(auto it:instr->args_offset_use_pos_){
parent_->args_offset_.erase(it);
}
instr->remove_result_and_operands();
}
void LIRBasicBlock::replace_instr(LIRInstruction* oldinst,LIRInstruction* newinst){
auto iter = std::find(instr_list_.begin(),instr_list_.end(),oldinst);
oldinst->remove_result_and_operands();
*iter = newinst;
}
bool LIRBasicBlock::add_inst_before_br(LIRInstruction* instr){
for (auto it = instr_list_.begin(); it != instr_list_.end(); ++it) {
if ((*it)->op_id_ == LIRInstruction::LBTy) {
instr->parent_=this;
instr_list_.insert(it,instr);
return true;
}
}
return false;
}
bool LIRBasicBlock::add_inst_before(LIRInstruction *instr, LIRInstruction *dst){
for (auto it = instr_list_.begin(); it != instr_list_.end(); ++it) {
if ((*it) == dst) {
instr->parent_=this;
instr_list_.insert(it,instr);
return true;
}
}
return false;
}
bool LIRBasicBlock::add_inst_after(LIRInstruction *instr, LIRInstruction *dst){
if(dst->op_id_==LIRInstruction::LBTy){
return this->add_inst_before(instr, dst);
}
for (auto it = instr_list_.begin(); it != instr_list_.end(); ++it) {
if ((*it) == dst) {
it++;
instr->parent_=this;
instr_list_.insert(it,instr);
return true;
}
}
return false;
}
void LIRBasicBlock::add_inst_back(LIRInstruction* instr) {
instr->parent_=this;
instr_list_.push_back(instr);
}
void LIRBasicBlock::add_inst_front(LIRInstruction* instr){
instr->parent_=this;
instr_list_.push_front(instr);
}

@ -1,539 +0,0 @@
#ifndef _LIR_H_
#define _LIR_H_
#include <cassert>
#include <iostream>
#include <list>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
#include <memory>
#include <stdexcept>
#include "ir.h"
class LIROperand;
class LIRConstant;
class LIRVirtReg;
class LIRPhysReg;
class LIRInstruction;
class LIRIntInst;
class LIRFloatInst;
class LIRVmrsInst;
class LIRLdrInst;
class LIRVldrInst;
class LIRStrInst;
class LIRVstrInst;
class LIRBInst;
class LIRBlInst;
class LIRPushInst;
class LIRPopInst;
class LIRDataDef;
class LIRLabel;
class LIRGlobalVariable;
class LIRBasicBlock;
class LIRFunction;
struct LIRUse {
LIRInstruction* val_;
int arg_no_;
LIRUse(LIRInstruction* val, int no) : val_(val), arg_no_(no) {}
};
class LIRDataDef {
public:
enum LIRDataDefTy { LWordTy, LZeroTy };
explicit LIRDataDef(LIRDataDefTy tid, unsigned expr) : tid_(tid), expr_(expr) {}
~LIRDataDef() = default;
std::string print();
LIRDataDefTy tid_;
unsigned expr_;
};
class LIROperand {
public:
enum LIROprTy {
LOVirtRegTy,
LOVirtFRegTy,
LOPhysRegTy,
LOPhysFRegTy,
LOConstantTy,
LOShiftTy,
LFunctionTy,
LBasicBlockTy,
LGlobalVariableTy
};
explicit LIROperand(LIROprTy tid) : tid_(tid) {}
~LIROperand() = default;
virtual std::string print() = 0;
std::list<LIRUse>::iterator add_use(LIRInstruction* val, int arg_no) {
use_list_.emplace_back(val, arg_no);
std::list<LIRUse>::iterator re = use_list_.end();
return --re;
}
void remove_use(std::list<LIRUse>::iterator it) {
use_list_.erase(it);
}
LIROprTy tid_;
std::list<LIRUse> use_list_;
};
class LIRConstant : public LIROperand {
public:
LIRConstant(int val) : LIROperand(LOConstantTy), value_(val) {}
~LIRConstant() = default;
virtual std::string print() override;
int value_;
};
class LIRShift : public LIROperand {
public:
enum LIRShiftTy { LSAsrTy, LSLslTy, LSLsrTy, LSRorTy };
LIRShift(LIRShiftTy tid, int amount) : LIROperand(LOShiftTy), tid_(tid), amount_(amount) {}
~LIRShift() = default;
const static std::map<LIRShiftTy, std::string> name_;
virtual std::string print() override;
LIRShiftTy tid_;
int amount_;
};
class LIRVirtReg : public LIROperand {
public:
LIRVirtReg(int rid) : LIROperand(LOVirtRegTy), rid_(rid) {}
~LIRVirtReg() = default;
virtual std::string print() override;
int rid_;
};
class LIRPhysReg : public LIROperand {
public:
LIRPhysReg(int rid) : LIROperand(LOPhysRegTy), rid_(rid) {}
~LIRPhysReg() = default;
const static std::map<int, std::string> name_;
virtual std::string print() override;
int rid_;
};
class LIRVirtFReg : public LIROperand {
public:
LIRVirtFReg(int frid) : LIROperand(LOVirtFRegTy), frid_(frid) {}
~LIRVirtFReg() = default;
virtual std::string print() override;
int frid_;
};
class LIRPhysFReg : public LIROperand {
public:
LIRPhysFReg(int frid) : LIROperand(LOPhysFRegTy), frid_(frid) {}
~LIRPhysFReg() = default;
const static std::map<int, std::string> name_;
virtual std::string print() override;
int frid_;
};
class LIRModule {
public:
explicit LIRModule() {
total_rid_ = 0;
total_frid_ = 0;
}
~LIRModule() {}
virtual std::string print();
void add_global_variable(LIRGlobalVariable* g) { global_list_.push_back(g); }
void add_function(LIRFunction* f) { function_list_.push_back(f); }
LIRConstant* get_LIRConstant(int val) {
if (!LIRConstant_map_.count(val)) {
LIRConstant_map_[val] = new LIRConstant(val);
}
return LIRConstant_map_[val];
}
LIRVirtReg* get_LIRVirtReg(int rid) { return LIRVirtReg_map_.at(rid); }
LIRVirtReg* get_LIRVirtReg() {
int rid = total_rid_++;
LIRVirtReg_map_[rid] = new LIRVirtReg(rid);
return LIRVirtReg_map_[rid];
}
LIRPhysReg* get_LIRPhysReg(int rid) {
if (!LIRPhysReg_map_.count(rid)) {
LIRPhysReg_map_[rid] = new LIRPhysReg(rid);
}
return LIRPhysReg_map_[rid];
}
LIRVirtFReg* get_LIRVirtFReg(int frid) { return LIRVirtFReg_map_.at(frid); }
LIRVirtFReg* get_LIRVirtFReg() {
int frid = total_frid_++;
LIRVirtFReg_map_[frid] = new LIRVirtFReg(frid);
return LIRVirtFReg_map_[frid];
}
LIRPhysFReg* get_LIRPhysFReg(int frid) {
if (!LIRPhysFReg_map_.count(frid)) {
LIRPhysFReg_map_[frid] = new LIRPhysFReg(frid);
}
return LIRPhysFReg_map_[frid];
}
LIRDataDef* get_LIRDataDef(LIRDataDef::LIRDataDefTy tid, int expr) {
if (!LIRDataDef_map_.count({tid, expr})) {
LIRDataDef_map_[{tid, expr}] = new LIRDataDef(tid, expr);
}
return LIRDataDef_map_[{tid, expr}];
}
LIRShift* get_LIRShift(LIRShift::LIRShiftTy tid, int amount) {
if (!LIRShift_map_.count({tid, amount})) {
LIRShift_map_[{tid, amount}] = new LIRShift(tid, amount);
}
return LIRShift_map_[{tid, amount}];
}
std::vector<LIRGlobalVariable*> global_list_;
std::vector<LIRFunction*> function_list_;
std::map<int, LIRConstant*> LIRConstant_map_;
std::map<int, LIRVirtReg*> LIRVirtReg_map_;
std::map<int, LIRPhysReg*> LIRPhysReg_map_;
std::map<int, LIRVirtFReg*> LIRVirtFReg_map_;
std::map<int, LIRPhysFReg*> LIRPhysFReg_map_;
std::map<std::pair<LIRShift::LIRShiftTy, int>, LIRShift*> LIRShift_map_;
std::map<std::pair<LIRDataDef::LIRDataDefTy, int>, LIRDataDef*> LIRDataDef_map_;
int total_rid_;
int total_frid_;
};
class LIRLabel : public LIROperand {
public:
LIRLabel(LIROprTy tid, const std::string& name) : LIROperand(tid), name_(name) {}
~LIRLabel() = default;
virtual std::string print() = 0;
std::string name_;
};
class LIRGlobalVariable : public LIRLabel {
public:
enum LIRDataSectionTy { LDataTy, LBssTy };
LIRGlobalVariable(std::string name, LIRModule* m, LIRDataSectionTy tid) : LIRLabel(LGlobalVariableTy, name), tid_(tid), parent_(m) { m->add_global_variable(this); }
void add_data_def(LIRDataDef* dd) { init_val_.push_back(dd); }
virtual std::string print() override;
LIRDataSectionTy tid_;
LIRModule* parent_;
std::vector<LIRDataDef*> init_val_;
};
class LIRFunction : public LIRLabel {
public:
LIRFunction(const std::string& name, LIRModule* m, int has_result, int num_args) : LIRLabel(LFunctionTy, name), parent_(m), has_result_(has_result), num_args_(num_args) { parent_->add_function(this); }
LIRFunction(const std::string& name, int has_result, int num_args) : LIRLabel(LFunctionTy, name), parent_(nullptr), has_result_(has_result), num_args_(num_args) { }
~LIRFunction();
virtual std::string print() override;
void add_basic_block(LIRBasicBlock* bb) { basic_blocks_.push_back(bb); }
std::vector<LIRBasicBlock*> basic_blocks_;
int has_result_;
int num_args_;
LIRModule* parent_;
std::map<void*, int> var_offset_;
bool is_libfunc(){
if (name_ == "putint" || name_ == "putch" || name_ == "putarray" || name_ == "_sysy_starttime" || name_ == "_sysy_stoptime" || name_ == "__aeabi_memclr4" || name_ == "__aeabi_memset4" || name_ == "__aeabi_memcpy4"
||name_ == "getint" || name_ == "getch" || name_ == "getarray"
||name_ == "getfloat" ||name_=="getfarray"||name_ == "putfloat" || name_ == "putfarray"){
return true;
}else{
return false;
}
}
int stackframe_args_size_=0;
std::vector<LIROperand*> stackframe_saveregs_;
std::vector<std::pair<AllocaInst*,int>> stackframe_allocas_;
std::vector<LIROperand*> stackframe_spills_;
std::map<AllocaInst*, int> allocas_offset_;
int allocas_offset_end_=0;
std::vector<int> temps_offset_;
int temps_offset_end_=0;
std::map<LIROperand*, int> spills_offset_;
int spills_offset_end_=0;
int stackframe_offset_end_=0;
int saveregs_offset_end_=0;
int args_offset_end_=0;
std::map<LIRInstruction*,int> args_offset_;
std::vector<LIROperand*> args_passmethod_;
};
class LIRBasicBlock : public LIRLabel {
public:
explicit LIRBasicBlock(const std::string& name, LIRFunction* f) : LIRLabel(LBasicBlockTy, ".LBB."+f->name_+"."+name), parent_(f) { f->add_basic_block(this); }
void add_inst_back(LIRInstruction* instr) ;
void add_pre_basic_block(LIRBasicBlock* bb) { pre_bbs_.push_back(bb); }
void add_succ_basic_block(LIRBasicBlock* bb) { succ_bbs_.push_back(bb); }
void delete_instr(LIRInstruction* instr);
void replace_instr(LIRInstruction* oldinst,LIRInstruction* newinst);
void add_inst_front(LIRInstruction* instr);
bool add_inst_before_br(LIRInstruction* instr);
bool add_inst_before(LIRInstruction *instr, LIRInstruction *dst);
bool add_inst_after(LIRInstruction *instr, LIRInstruction *dst);
virtual std::string print() override;
std::list<LIRInstruction*> instr_list_;
LIRFunction* parent_;
int bb_idx_;
std::vector<LIRBasicBlock*> pre_bbs_;
std::vector<LIRBasicBlock*> succ_bbs_;
int incomingForwardBranches = 0;
int loopIdx = 0;
int loopDepth = 0;
int getLoopIndex() const { return loopIdx; }
int getLoopDepth() const { return loopDepth; }
void setLoopIndex(int idx) { loopIdx = idx; }
void setLoopDepth(int depth) { loopDepth = depth; }
void setIncomingForwardBranches(int num) { incomingForwardBranches = num; }
void decreaseForwardBranches() { incomingForwardBranches -= 1; }
bool isForwardBranchesEQZero() const { return incomingForwardBranches == 0; }
};
class LIRInstruction {
public:
enum LIRInstTy { LAddTy, LSubTy,LRsbTy, LMulTy, LMlaTy,LMlsTy,LSdivTy,LUdivTy,LAndTy,LOrrTy,LEorTy, LLslTy, LLsrTy, LAsrTy,LRorTy, LBTy,LBlTy,LBxTy, LMovTy,LVmovTy,LVmovf32Ty,LMov32Ty, LLdrTy,LVldrTy, LStrTy,LVstrTy, LPushTy, LPopTy,LVpushTy,LVpopTy, LCmpTy,LVcmpTy,LVaddTy,LVsubTy,LVdivTy,LVmulTy,LVmlaTy,LVmlsTy,LVnegTy,LVcvtFSTy,LVcvtSFTy,LVmrsTy };
enum LIRCondTy { LCondGT, LCondGE, LCondLT, LCondLE, LCondHI, LCondCS, LCondCC, LCondLS, LCondEQ, LCondNE, LCondVC, LCondVS, LCondNone };
enum LIRAddrTy { LRegisterOffsetTy, LPreIndexedTy, LPostIndexedTy };
const static std::map<LIRInstTy, std::string> inst_name_;
const static std::map<LIRCondTy, std::string> cond_name_;
LIRInstruction(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, int num_ops, LIRBasicBlock* bb) : op_id_(op_id), cond_id_(cond_id), result_(result), num_ops_(num_ops), parent_(bb) {
operands_.resize(num_ops_, nullptr);
opr_use_pos_.resize(num_ops_);
parent_->add_inst_back(this);
if (result != nullptr) {
res_use_pos_ = result->add_use(this, -1);
}
}
LIRInstruction(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, int num_ops) : op_id_(op_id), cond_id_(cond_id), result_(result), num_ops_(num_ops), parent_(nullptr) {
operands_.resize(num_ops_, nullptr);
opr_use_pos_.resize(num_ops_);
if (result != nullptr) {
res_use_pos_ = result->add_use(this, -1);
}
}
void set_operand(int i, LIROperand* v) {
operands_[i] = v;
opr_use_pos_[i] = v->add_use(this, i);
}
void remove_operand(int i){
operands_[i]->remove_use(opr_use_pos_[i]);
operands_[i]=nullptr;
}
void remove_operand_real(int i) {
operands_[i]->remove_use(opr_use_pos_[i]);
operands_.erase(operands_.begin() + i);
opr_use_pos_.erase(opr_use_pos_.begin() + i);
num_ops_ = operands_.size();
}
void set_result(LIROperand* v) {
result_ = v;
res_use_pos_ = v->add_use(this, -1);
}
void remove_result(){
result_->remove_use(res_use_pos_);
result_=nullptr;
}
void remove_result_and_operands() {
if(result_!=nullptr){
remove_result();
}
for (size_t i = 0; i < operands_.size(); i++ ) {
remove_operand(i);
}
}
std::vector<LIROperand*> get_operands_and_result(){
std::vector<LIROperand*> ans(operands_);
if(result_!=nullptr){
ans.push_back(result_);
}
return ans;
}
LIROperand* get_operand(int i) const { return operands_[i]; }
virtual std::string print() = 0;
LIRBasicBlock* parent_;
LIRInstTy op_id_;
LIRCondTy cond_id_;
int num_ops_;
LIROperand* result_;
std::vector<LIROperand*> operands_;
std::list<LIRUse>::iterator res_use_pos_;
std::vector<std::list<LIRUse>::iterator> opr_use_pos_;
std::vector<std::map<LIRInstruction*,int>::iterator> args_offset_use_pos_;
};
class LIRIntInst : public LIRInstruction {
public:
LIRIntInst(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2, LIRBasicBlock* bb) : LIRInstruction(op_id, cond_id, result, 2, bb) {
set_operand(0, v1);
set_operand(1, v2);
}
LIRIntInst(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) : LIRInstruction(op_id, cond_id, result, 2) {
set_operand(0, v1);
set_operand(1, v2);
}
LIRIntInst(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIRBasicBlock* bb) : LIRInstruction(op_id, cond_id, result, 1, bb) { set_operand(0, v1); }
LIRIntInst(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, LIROperand* v1) : LIRInstruction(op_id, cond_id, result, 1) { set_operand(0, v1); }
LIRIntInst(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2, LIROperand* v3, LIRBasicBlock* bb) : LIRInstruction(op_id, cond_id, result, 3, bb) {
set_operand(0, v1);
set_operand(1, v2);
set_operand(2, v3);
}
LIRIntInst(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2, LIROperand* v3) : LIRInstruction(op_id, cond_id, result, 3) {
set_operand(0, v1);
set_operand(1, v2);
set_operand(2, v3);
}
virtual std::string print() override;
};
class LIRFloatInst : public LIRInstruction {
public:
LIRFloatInst(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2, LIRBasicBlock* bb) : LIRInstruction(op_id, cond_id, result, 2, bb) {
set_operand(0, v1);
set_operand(1, v2);
}
LIRFloatInst(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) : LIRInstruction(op_id, cond_id, result, 2) {
set_operand(0, v1);
set_operand(1, v2);
}
LIRFloatInst(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIRBasicBlock* bb) : LIRInstruction(op_id, cond_id, result, 1, bb) { set_operand(0, v1); }
LIRFloatInst(LIRInstTy op_id, LIRCondTy cond_id, LIROperand* result, LIROperand* v1) : LIRInstruction(op_id, cond_id, result, 1) { set_operand(0, v1); }
virtual std::string print() override;
};
class LIRMovInst : public LIRInstruction {
public:
LIRMovInst(LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIRBasicBlock* bb) : LIRInstruction(LMovTy, cond_id, result, 1, bb) { set_operand(0, v1); }
LIRMovInst(LIRCondTy cond_id, LIROperand* result, LIROperand* v1) : LIRInstruction(LMovTy, cond_id, result, 1) { set_operand(0, v1); }
virtual std::string print() override;
};
class LIRVmovInst : public LIRInstruction {
public:
LIRVmovInst(LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIRBasicBlock* bb) : LIRInstruction(LVmovTy, cond_id, result, 1, bb) { set_operand(0, v1); }
LIRVmovInst(LIRCondTy cond_id, LIROperand* result, LIROperand* v1) : LIRInstruction(LVmovTy, cond_id, result, 1) { set_operand(0, v1); }
virtual std::string print() override;
};
class LIRVmovf32Inst : public LIRInstruction {
public:
LIRVmovf32Inst(LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIRBasicBlock* bb) : LIRInstruction(LVmovf32Ty, cond_id, result, 1, bb) { set_operand(0, v1); }
LIRVmovf32Inst(LIRCondTy cond_id, LIROperand* result, LIROperand* v1) : LIRInstruction(LVmovf32Ty, cond_id, result, 1) { set_operand(0, v1); }
virtual std::string print() override;
};
class LIRMov32Inst : public LIRInstruction {
public:
LIRMov32Inst(LIRCondTy cond_id, LIROperand* result, LIRConstant* v1, LIRBasicBlock* bb) : LIRInstruction(LMov32Ty, cond_id, result, 1, bb){ set_operand(0, v1); }
LIRMov32Inst(LIRCondTy cond_id, LIROperand* result, LIRConstant* v1) : LIRInstruction(LMov32Ty, cond_id, result, 1){ set_operand(0, v1); }
LIRMov32Inst(LIRCondTy cond_id, LIROperand* result, LIRFunction* v1, LIRBasicBlock* bb) : LIRInstruction(LMov32Ty, cond_id, result, 1, bb) { set_operand(0, v1); }
LIRMov32Inst(LIRCondTy cond_id, LIROperand* result, LIRGlobalVariable* v1, LIRBasicBlock* bb) : LIRInstruction(LMov32Ty, cond_id, result, 1, bb) { set_operand(0, v1); }
virtual std::string print() override;
};
class LIRLdrInst : public LIRInstruction {
public:
LIRLdrInst(LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2, LIRAddrTy addr_tid, LIRBasicBlock* bb) : LIRInstruction(LLdrTy, cond_id, result, 2, bb), addr_tid_(addr_tid) {
set_operand(0, v1);
set_operand(1, v2);
}
LIRLdrInst(LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2, LIRAddrTy addr_tid) : LIRInstruction(LLdrTy, cond_id, result, 2), addr_tid_(addr_tid) {
set_operand(0, v1);
set_operand(1, v2);
}
virtual std::string print() override;
LIRAddrTy addr_tid_;
};
class LIRVldrInst : public LIRInstruction {
public:
LIRVldrInst(LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2, LIRBasicBlock* bb) : LIRInstruction(LVldrTy, cond_id, result, 2, bb) {
set_operand(0, v1);
set_operand(1, v2);
}
LIRVldrInst(LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) : LIRInstruction(LVldrTy, cond_id, result, 2) {
set_operand(0, v1);
set_operand(1, v2);
}
virtual std::string print() override;
};
class LIRStrInst : public LIRInstruction {
public:
LIRStrInst(LIRCondTy cond_id, LIROperand* v1, LIROperand* v2, LIROperand* v3, LIRAddrTy addr_tid, LIRBasicBlock* bb) : LIRInstruction(LStrTy, cond_id, nullptr, 3, bb), addr_tid_(addr_tid) {
set_operand(0, v1);
set_operand(1, v2);
set_operand(2, v3);
}
LIRStrInst(LIRCondTy cond_id, LIROperand* v1, LIROperand* v2, LIROperand* v3, LIRAddrTy addr_tid) : LIRInstruction(LStrTy, cond_id, nullptr, 3), addr_tid_(addr_tid) {
set_operand(0, v1);
set_operand(1, v2);
set_operand(2, v3);
}
virtual std::string print() override;
LIRAddrTy addr_tid_;
};
class LIRVstrInst : public LIRInstruction {
public:
LIRVstrInst(LIRCondTy cond_id, LIROperand* v1, LIROperand* v2, LIROperand* v3, LIRBasicBlock* bb) : LIRInstruction(LVstrTy, cond_id, nullptr, 3, bb) {
set_operand(0, v1);
set_operand(1, v2);
set_operand(2, v3);
}
LIRVstrInst(LIRCondTy cond_id, LIROperand* v1, LIROperand* v2, LIROperand* v3) : LIRInstruction(LVstrTy, cond_id, nullptr, 3) {
set_operand(0, v1);
set_operand(1, v2);
set_operand(2, v3);
}
virtual std::string print() override;
};
class LIRBInst : public LIRInstruction {
public:
LIRBInst(LIRCondTy cond_id, LIRBasicBlock* target_bb, LIRBasicBlock* bb) : LIRInstruction(LBTy, cond_id, nullptr, 1, bb) {set_operand(0,target_bb);}
virtual std::string print() override;
};
class LIRBlInst : public LIRInstruction {
public:
LIRBlInst(LIRCondTy cond_id, LIRFunction* target_func, bool result_unused, LIRBasicBlock* bb) : LIRInstruction(LBlTy, cond_id, nullptr, 1, bb),result_unused_(result_unused) {set_operand(0,target_func);}
LIRBlInst(LIRCondTy cond_id, LIRFunction* target_func, bool result_unused) : LIRInstruction(LBlTy, cond_id, nullptr, 1),result_unused_(result_unused) {set_operand(0,target_func);}
virtual std::string print() override;
bool result_unused_;
};
class LIRBxInst : public LIRInstruction {
public:
LIRBxInst(LIRCondTy cond_id, LIROperand* v1, LIRBasicBlock* bb) : LIRInstruction(LBxTy, cond_id, nullptr, 1, bb) {set_operand(0,v1);}
LIRBxInst(LIRCondTy cond_id, LIROperand* v1) : LIRInstruction(LBxTy, cond_id, nullptr, 1) {set_operand(0,v1);}
virtual std::string print() override;
};
class LIRVmrsInst : public LIRInstruction {
public:
LIRVmrsInst(LIRBasicBlock* bb) : LIRInstruction(LVmrsTy, LCondNone, nullptr, 0, bb) {}
virtual std::string print() override;
};
class LIRPushInst : public LIRInstruction {
public:
LIRPushInst(LIRCondTy cond_id, const std::vector<LIROperand*>& reglist, LIRBasicBlock* bb) : LIRInstruction(LPushTy, cond_id, nullptr, reglist.size(), bb) {
for (int i = 0; i < reglist.size(); ++i) {
set_operand(i, reglist[i]);
}
}
LIRPushInst(LIRCondTy cond_id, const std::vector<LIROperand*>& reglist) : LIRInstruction(LPushTy, cond_id, nullptr, reglist.size()) {
for (int i = 0; i < reglist.size(); ++i) {
set_operand(i, reglist[i]);
}
}
virtual std::string print() override;
};
class LIRPopInst : public LIRInstruction {
public:
LIRPopInst(LIRCondTy cond_id, const std::vector<LIROperand*>& reglist, LIRBasicBlock* bb) : LIRInstruction(LPopTy, cond_id, nullptr, reglist.size(), bb) {
for (int i = 0; i < reglist.size(); ++i) {
set_operand(i, reglist[i]);
}
}
LIRPopInst(LIRCondTy cond_id, const std::vector<LIROperand*>& reglist) : LIRInstruction(LPopTy, cond_id, nullptr, reglist.size()) {
for (int i = 0; i < reglist.size(); ++i) {
set_operand(i, reglist[i]);
}
}
virtual std::string print() override;
};
class LIRVpushInst : public LIRInstruction {
public:
LIRVpushInst(LIRCondTy cond_id, const std::vector<LIROperand*>& reglist, LIRBasicBlock* bb) : LIRInstruction(LVpushTy, cond_id, nullptr, reglist.size(), bb) {
for (int i = 0; i < reglist.size(); ++i) {
set_operand(i, reglist[i]);
}
}
LIRVpushInst(LIRCondTy cond_id, const std::vector<LIROperand*>& reglist) : LIRInstruction(LVpushTy, cond_id, nullptr, reglist.size()) {
for (int i = 0; i < reglist.size(); ++i) {
set_operand(i, reglist[i]);
}
}
virtual std::string print() override;
};
class LIRVpopInst : public LIRInstruction {
public:
LIRVpopInst(LIRCondTy cond_id, const std::vector<LIROperand*>& reglist, LIRBasicBlock* bb) : LIRInstruction(LVpopTy, cond_id, nullptr, reglist.size(), bb) {
for (int i = 0; i < reglist.size(); ++i) {
set_operand(i, reglist[i]);
}
}
LIRVpopInst(LIRCondTy cond_id, const std::vector<LIROperand*>& reglist) : LIRInstruction(LVpopTy, cond_id, nullptr, reglist.size()) {
for (int i = 0; i < reglist.size(); ++i) {
set_operand(i, reglist[i]);
}
}
virtual std::string print() override;
};
#endif

@ -1,89 +0,0 @@
#ifndef SYSYCOMPILER_LIRSTMTBUILDER_H
#define SYSYCOMPILER_LIRSTMTBUILDER_H
#include "ir.h"
#include "lir.h"
#include "regalloc.h"
class LIRStmtBuilder {
public:
LIRBasicBlock* BB_;
Module* m_;
LIRModule* lirm_;
RegAlloc* ra_;
bool is_o2_;
bool print_s_verbosity_;
std::map<GlobalVariable*, LIRGlobalVariable*> gv_map_;
std::map<Function*, LIRFunction*> func_map_;
std::map<Argument*, LIROperand*> arg_map_;
std::map<BasicBlock*, LIRBasicBlock*> bb_map_;
std::map<Instruction*, LIROperand*> inst_map_;
LIRStmtBuilder(Module* m,bool psv,bool is_o2) : m_(m),print_s_verbosity_(psv),is_o2_(is_o2){
lirm_=new LIRModule();
ra_=nullptr;
BB_=nullptr;
};
~LIRStmtBuilder() = default;
void build_lir();
void build_asm();
void global_arr_init(LIRGlobalVariable* lirgv, Constant* gv);
int calc_type_size(Type* ty);
bool is_constant_all_zero(Constant* gv);
LIRBasicBlock* get_insert_block() { return this->BB_; }
void set_insert_point(LIRBasicBlock* bb) { this->BB_ = bb; }
void build_instr(std::list<Instruction*>::iterator iter3);
void remove_useless_insts();
void remove_redundant_load_store();
void combine_mul_addsub();
void resolve_function_header();
void resolve_imm();
void resolve_libfunc();
LIROperand* get_LIROpnd(Value *v);
LIRFunction *getLFunction(Function *ori) {
assert(func_map_.find(ori) != func_map_.end() && "Can't get function mapping");
return func_map_.at(ori);
}
LIRBasicBlock *getLBB(BasicBlock *bb) {
assert(bb_map_.find(bb) != bb_map_.end() && "Can't get basic block mapping");
return bb_map_.at(bb);
}
LIRIntInst* create_add(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LAddTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_add(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2,LIROperand* v3) { return new LIRIntInst(LIRInstruction::LAddTy, cond_id, result, v1, v2,v3, this->BB_); }
LIRIntInst* create_sub(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LSubTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_rsb(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LRsbTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_mul(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LMulTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_mla(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2, LIROperand* v3) { return new LIRIntInst(LIRInstruction::LMlaTy, cond_id, result, v1, v2,v3, this->BB_); }
LIRIntInst* create_mls(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2, LIROperand* v3) { return new LIRIntInst(LIRInstruction::LMlsTy, cond_id, result, v1, v2,v3, this->BB_); }
LIRIntInst* create_sdiv(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LSdivTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_udiv(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LUdivTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_and(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LAndTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_orr(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LOrrTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_eor(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LEorTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_lsl(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LLslTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_lsr(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LLsrTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_asr(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LAsrTy, cond_id, result, v1, v2, this->BB_); }
LIRIntInst* create_ror(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LRorTy, cond_id, result, v1, v2, this->BB_); }
LIRFloatInst* create_vadd(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRFloatInst(LIRInstruction::LVaddTy, cond_id, result, v1, v2, this->BB_); }
LIRFloatInst* create_vsub(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRFloatInst(LIRInstruction::LVsubTy, cond_id, result, v1, v2, this->BB_); }
LIRFloatInst* create_vmul(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRFloatInst(LIRInstruction::LVmulTy, cond_id, result, v1, v2, this->BB_); }
LIRFloatInst* create_vdiv(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRFloatInst(LIRInstruction::LVdivTy, cond_id, result, v1, v2, this->BB_); }
LIRFloatInst* create_vneg(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1) { return new LIRFloatInst(LIRInstruction::LVnegTy, cond_id, result, v1, this->BB_); }
LIRFloatInst* create_vcvtfs(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1) { return new LIRFloatInst(LIRInstruction::LVcvtFSTy, cond_id, result, v1, this->BB_); }
LIRFloatInst* create_vcvtsf(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1) { return new LIRFloatInst(LIRInstruction::LVcvtSFTy, cond_id, result, v1, this->BB_); }
LIRIntInst* create_cmp(LIRInstruction::LIRCondTy cond_id, LIROperand* v1, LIROperand* v2) { return new LIRIntInst(LIRInstruction::LCmpTy, cond_id, nullptr, v1, v2, this->BB_); }
LIRFloatInst* create_vcmp(LIRInstruction::LIRCondTy cond_id, LIROperand* v1, LIROperand* v2) { return new LIRFloatInst(LIRInstruction::LVcmpTy, cond_id, nullptr, v1, v2, this->BB_); }
LIRVmrsInst* create_vmrs() { return new LIRVmrsInst(this->BB_); }
LIRMovInst* create_mov(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1) { return new LIRMovInst(cond_id, result,v1, this->BB_); }
LIRVmovInst* create_vmov(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1) { return new LIRVmovInst(cond_id, result,v1, this->BB_); }
LIRVmovf32Inst* create_vmovf32(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1) { return new LIRVmovf32Inst(cond_id, result,v1, this->BB_); }
LIRMov32Inst* create_mov32(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIRConstant* v1) { return new LIRMov32Inst(cond_id, result,v1, this->BB_); }
LIRMov32Inst* create_mov32(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIRFunction* v1) { return new LIRMov32Inst(cond_id, result,v1, this->BB_); }
LIRMov32Inst* create_mov32(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIRGlobalVariable* v1) { return new LIRMov32Inst(cond_id, result,v1, this->BB_); }
LIRLdrInst* create_ldr(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2, LIRInstruction::LIRAddrTy addr_tid) { return new LIRLdrInst(cond_id, result,v1, v2,addr_tid, this->BB_); }
LIRVldrInst* create_vldr(LIRInstruction::LIRCondTy cond_id, LIROperand* result, LIROperand* v1, LIROperand* v2) { return new LIRVldrInst(cond_id, result,v1, v2, this->BB_); }
LIRStrInst* create_str(LIRInstruction::LIRCondTy cond_id, LIROperand* v1, LIROperand* v2, LIROperand* v3, LIRInstruction::LIRAddrTy addr_tid) { return new LIRStrInst(cond_id, v1,v2,v3,addr_tid, this->BB_); }
LIRVstrInst* create_vstr(LIRInstruction::LIRCondTy cond_id, LIROperand* v1, LIROperand* v2, LIROperand* v3) { return new LIRVstrInst(cond_id, v1,v2,v3, this->BB_); }
LIRBInst* create_b(LIRInstruction::LIRCondTy cond_id, LIRBasicBlock* target_bb){return new LIRBInst(cond_id,target_bb,this->BB_);}
LIRBlInst* create_bl(LIRInstruction::LIRCondTy cond_id, LIRFunction* target_func,bool result_unused){return new LIRBlInst(cond_id,target_func,result_unused,this->BB_);}
LIRPushInst *create_push(LIRInstruction::LIRCondTy cond_id, const std::vector<LIROperand *> &reglist) {return new LIRPushInst(cond_id,reglist,this->BB_);}
LIRPopInst *create_pop(LIRInstruction::LIRCondTy cond_id, const std::vector<LIROperand *> &reglist) {return new LIRPopInst(cond_id,reglist,this->BB_);}
};
#endif

@ -1,729 +0,0 @@
#include "regalloc.h"
int RegAlloc::getReg(LIROperand* opnd, LIRInstruction* inst) {
if(is_o2_){
if(!inst){
return 0;
}
if(!opnd){
return 0;
}
if( !isRelevant(opnd,inst)){
return 0;
}
Pii* itv = opnd_inst_in_itv[opnd][inst];
if(!itv){
return 0;
}else{
if(final_result_.count(itv)==0){
return 0;
}else if(final_result_[itv]==0){
return 0;
}
return final_result_[itv];
}
}else{
return REGALLOC_SPILL;
}
}
/** 分配寄存器的执行函数 */
void RegAlloc::run() {
if(lirf_ && lirm_){
if(is_o2_){
// 函数优化
assignForFunc();
}
process_code();
}else {
if(!lirf_){
}
if(!lirm_){
}
}
}
/** 函数体优化 */
void RegAlloc::assignForFunc() {
preF();
computeBlockOrder();
live_analyse();
linearScan();
}
void RegAlloc::live_analyse() {
live_analyse_1();
if(!retBB){
// 无返回块
}
else if(retBB!=basicBlocksOrder.back()){
// 返回块不是最后一个基本块
}
live_analyse_2();
live_analyse_3();
}
/** 分析并添加基本块的live_in */
void RegAlloc::live_analyse_1() {
unsigned int inst_idx = INST_GAP;
for (std::vector<LIRBasicBlock *>::iterator iter2 = basicBlocksOrder.begin(); iter2 != basicBlocksOrder.end(); iter2++) {
LIRBasicBlock *bb = *iter2;
bool isFirstInst = true;
std::unordered_map<LIROperand*,unsigned int> phys_reg_mark;
LIRInstruction *last_inst = nullptr, *llast_inst = nullptr;
for (std::list<LIRInstruction*>::iterator iter3 = bb->instr_list_.begin(); iter3 != bb->instr_list_.end(); inst_idx+=INST_GAP,iter3++) {
// 为每个指令分配唯一索引
LIRInstruction *inst = *iter3;
instIdx[inst] = inst_idx;
idxInst[inst_idx] = inst;
if (isFirstInst) {
isFirstInst = false;
bbInterval[bb].first = inst_idx;
}
if(inst->op_id_ == LIRInstruction::LBlTy){
LIRFunction* func_opnd = dynamic_cast<LIRFunction*>(inst->get_operand(0));
if(!func_opnd){
}
for(auto & it : phys_reg_mark){
addIntervalAtBack_positive(it.first, it.second, inst_idx);
}
// 初始化物理寄存器记录器
phys_reg_mark.clear();
int cond = is_KF_hasR_noUse(inst);
if(cond!=0){
addIntervalAtBack_positive(cond, inst_idx);
}
}
for (LIROperand *opnd: inst->operands_) {
if(opnd->tid_==LIROperand::LOVirtRegTy){
// 为虚拟寄存器
if (live_def[bb].count(opnd) == 0) {
live_use[bb].emplace_back(opnd);
}
}
else if(opnd->tid_==LIROperand::LOVirtFRegTy){
// 为虚拟浮点寄存器
if (live_def[bb].count(opnd) == 0) {
live_use[bb].emplace_back(opnd);
}
}
else if(opnd->tid_==LIROperand::LOPhysRegTy && dynamic_cast<LIRPhysReg*>(opnd)->rid_ <= TOP_LIMIT_PHYS_REG){
// 低于物理寄存器上限
if(bb==initBB){
// 为入口块则直接将其添加到记录中
addIntervalAtBack_positive(opnd, bbInterval[initBB].first, inst_idx);
}
else {
// 先标记计算结果再添加到记录中
int rid = dynamic_cast<LIRPhysReg*>(opnd)->rid_;
std::list<Pii> &intervals_physreg = intervals_token_phys_reg[rid];
if(rid == 1){
if(last_inst && last_inst->op_id_ == LIRInstruction::LBlTy && dynamic_cast<LIRFunction*>(last_inst->get_operand(0))->has_result_==1){
addIntervalAtBack_positive(opnd, inst_idx - INST_GAP, inst_idx);
}else if(llast_inst && llast_inst->op_id_ == LIRInstruction::LBlTy && dynamic_cast<LIRFunction*>(llast_inst->get_operand(0))->has_result_==1){
addIntervalAtBack_positive(opnd, inst_idx - INST_GAP-INST_GAP, inst_idx);
}else{
}
}else{
}
}
}
else if(opnd->tid_==LIROperand::LOPhysFRegTy && dynamic_cast<LIRPhysFReg*>(opnd)->frid_ >= BOTTOM_LIMIT_PHYS_FREG){
// 高于浮点物理寄存器下限
if(bb==initBB){
addIntervalAtBack_positive(opnd, bbInterval[initBB].first, inst_idx);
}
else{
int frid = dynamic_cast<LIRPhysFReg*>(opnd)->frid_;
std::list<Pii> &intervals_physreg = intervals_token_phys_reg[frid];
if(frid == -1){
if( last_inst && last_inst->op_id_ == LIRInstruction::LBlTy && dynamic_cast<LIRFunction*>(last_inst->get_operand(0))->has_result_==2){
addIntervalAtBack_positive(opnd, inst_idx - INST_GAP, inst_idx);
}else if( llast_inst && llast_inst->op_id_ == LIRInstruction::LBlTy && dynamic_cast<LIRFunction*>(llast_inst->get_operand(0))->has_result_==2){
addIntervalAtBack_positive(opnd, inst_idx - INST_GAP - INST_GAP, inst_idx);
}else{
}
}else{
}
}
}
}
if(inst->result_){
// 指令有计算结果,符合条件时记录此指令会调用某个寄存器
LIROperand * def_opnd = inst->result_;
if(def_opnd->tid_ == LIROperand::LOPhysRegTy && dynamic_cast<LIRPhysReg*>(def_opnd)->rid_ <= TOP_LIMIT_PHYS_REG){
if(phys_reg_mark.count(def_opnd) != 0){
}
phys_reg_mark[def_opnd] = inst_idx;
}
else if(def_opnd->tid_ == LIROperand::LOPhysFRegTy && dynamic_cast<LIRPhysFReg*>(def_opnd)->frid_ >= BOTTOM_LIMIT_PHYS_FREG){
if(phys_reg_mark.count(def_opnd) != 0){
}
phys_reg_mark[def_opnd] = inst_idx;
}else if(def_opnd->tid_==LIROperand::LOVirtRegTy || def_opnd->tid_==LIROperand::LOVirtFRegTy){
live_def[bb].emplace(def_opnd);
}
}
llast_inst = last_inst;
last_inst = inst;
}
if(bb==retBB && isFirstInst ) {
bbInterval[bb].first = inst_idx;
bbInterval[bb].second = inst_idx;
}
else if(bb==initBB && isFirstInst){
bbInterval[bb].first = 0;
bbInterval[bb].second = 0;
}
else{
bbInterval[bb].second = inst_idx - INST_GAP;
}
// 记录基本块入口的活跃变量
live_in[bb] = std::vector< LIROperand*>(live_use[bb].begin(), live_use[bb].end());
if(!phys_reg_mark.empty()){
if(bb==retBB && phys_reg_mark.size()==1){
auto it = phys_reg_mark.begin();
addIntervalAtBack_positive(it->first, it->second, bbInterval[retBB].second);
}else if(bb!=retBB){
// 错误诊断
}else{
}
}
}
}
/** 分析基本块的live_out */
void RegAlloc::live_analyse_2() {
bool change = true;
// 迭代计算结合基本块输出的变量和后继基本块的入口变量计算live_in当迭代发生变化时继续计算直至live_in不变
while (change) {
change = false;
for (std::vector<LIRBasicBlock*>::reverse_iterator iter2 = basicBlocksOrder.rbegin(); iter2 != basicBlocksOrder.rend(); iter2++) {
LIRBasicBlock* bb = *iter2;
std::vector< LIROperand*> new_out;
std::vector< LIRBasicBlock*> sbb_vec = bb->succ_bbs_;
if (!sbb_vec.empty()) {
for ( LIRBasicBlock* sbb_ptr : sbb_vec) {
std::vector< LIROperand*> temp;
temp.resize(live_in[sbb_ptr].size()+new_out.size());
std::sort(live_in[sbb_ptr].begin(), live_in[sbb_ptr].end());
auto temp_end = std::set_union(live_in[sbb_ptr].begin(), live_in[sbb_ptr].end(), new_out.begin(), new_out.end(), temp.begin());
new_out = std::vector< LIROperand*>(temp.begin(), temp_end);
}
}
if (new_out != live_out[bb]) {
change = true;
live_out[bb] = new_out;
std::vector< LIROperand*> diff, uni;
diff.resize(live_out[bb].size());
std::sort(live_out[bb].begin(), live_out[bb].end());
auto diff_end = std::set_difference(live_out[bb].begin(), live_out[bb].end(), live_def[bb].begin(), live_def[bb].end(), diff.begin());
diff.resize(diff_end-diff.begin());
uni.resize(diff.size()+live_use[bb].size());
std::sort(live_use[bb].begin(), live_use[bb].end());
std::sort(diff.begin(), diff.end());
auto uni_end = std::set_union(live_use[bb].begin(), live_use[bb].end(), diff.begin(), diff.end(), uni.begin());
live_in[bb].assign(uni.begin(), uni_end);
}
}
}
}
/** 添加live_out到寄存器中 */
void RegAlloc::live_analyse_3() {
for (std::vector<LIRBasicBlock *>::reverse_iterator iter2 = basicBlocksOrder.rbegin(); iter2 != basicBlocksOrder.rend(); iter2++) {
LIRBasicBlock *bb = *iter2;
std::vector<LIROperand *> &live_out_bb = live_out[bb];
std::set<LIROperand*> live_out_set = std::set<LIROperand*>(live_out_bb.begin(),live_out_bb.end());
unsigned int bb_begin = bbInterval[bb].first;
unsigned int bb_end = bbInterval[bb].second;
for (LIROperand *opnd : live_out_set) {
addInterval(opnd, bb_begin, bb_end, true);
}
LIRInstruction *last_inst = nullptr;
for (std::list<LIRInstruction *>::iterator iter3 = bb->instr_list_.end(); iter3 != bb->instr_list_.begin(); ) {
LIRInstruction *inst = *(--iter3);
unsigned int now_idx = getInstIdx(inst);
LIROperand *def_var = inst->result_;
if (def_var != nullptr && (def_var->tid_==LIROperand::LOVirtRegTy || def_var->tid_==LIROperand::LOVirtFRegTy)) {
// 对有计算结果且为虚拟寄存器的指令标记重新分配寄存器
opnd_inst_in_itv[def_var][inst] = cutInterval(def_var, now_idx,inst,last_inst);
}
for (LIROperand *opnd: inst->operands_) {
if(opnd->tid_==LIROperand::LOVirtRegTy || opnd->tid_==LIROperand::LOVirtFRegTy){
// 所有用到虚拟寄存器的指令标记寄存器更新
opnd_inst_in_itv[opnd][inst]= addInterval(opnd, bb_begin, now_idx, false);
}
}
last_inst = inst;
}
}
}
/** 预处理 */
void RegAlloc::preF() {
for(LIRBasicBlock* bb:lirf_->basic_blocks_){
// FEdge暂时没有用于其它地方
FEdge[bb] = bb->pre_bbs_.size();
}
}
/** 处理基本块的执行顺序 */
void RegAlloc::computeBlockOrder() {
struct WorkListElem {
LIRBasicBlock *bb;
bool operator<(const WorkListElem &rhs) const {
return bb->getLoopDepth() < rhs.bb->getLoopDepth();
}
explicit WorkListElem(LIRBasicBlock *b) : bb(b) {}
};
// 记录工作列表
std::priority_queue<WorkListElem> work_list;
initBB = lirf_->basic_blocks_[0];
work_list.emplace(initBB);
// 从函数入口开始,逐步展开所有基本块
while(!work_list.empty()){
LIRBasicBlock* bb = work_list.top().bb;
work_list.pop();
// 基本块顺序表
basicBlocksOrder.emplace_back(bb);
// 避免重复记录
basicBlocksOrderSet.emplace(bb);
findRetBB(bb);
for(auto nextBB:bb->succ_bbs_){
// 遍历后继基本块将前向分支数减到0的基本块添加到工作列表中
if(basicBlocksOrderSet.count(nextBB)!=0) continue;
nextBB->decreaseForwardBranches();
if (nextBB->isForwardBranchesEQZero()) {
// 无分支,此时执行顺序唯一
work_list.emplace(nextBB);
}
}
}
if(lirf_->basic_blocks_.size()!=basicBlocksOrderSet.size()){
// 有未处理的基本块
LIRBasicBlock* dbgBB = nullptr;
for(auto bbb : lirf_->basic_blocks_){
if(basicBlocksOrderSet.count(bbb)==0){
// 找出异常基本块,但未进行处理
dbgBB = bbb;
}
}
}
}
void RegAlloc::dfs(LIRBasicBlock *bb) {
basicBlocksOrder.emplace_back(bb);
basicBlocksOrderSet.emplace(bb);
for(auto nextBB:bb->succ_bbs_){
if(basicBlocksOrderSet.count(nextBB)!=0) continue;
dfs(nextBB);
}
}
/**
* phy_regbegin-end
* @param phy_reg
* @param begin
* @param end
*/
void RegAlloc::addIntervalAtBack_positive(LIROperand *phy_reg, unsigned int begin, unsigned int end) {
int rid;
if(phy_reg->tid_==LIROperand::LOPhysRegTy){
rid = dynamic_cast<LIRPhysReg*>(phy_reg)->rid_;
}else if (phy_reg->tid_==LIROperand::LOPhysFRegTy){
rid = dynamic_cast<LIRPhysFReg*>(phy_reg)->frid_;
} else{
// 只解析物理寄存器和浮点物理寄存器
}
std::list<Pii> &intervals_physreg = intervals_token_phys_reg[rid];
if(!intervals_physreg.empty()){
Pii &last_interval = intervals_physreg.back();
if(last_interval.second == begin){
// 与最后一个间隔合并
last_interval.second == end;
}
else if(last_interval.second < begin){
intervals_physreg.emplace_back(begin,end);
}else{
// 最后一个间隔的结束位置在此间隔的起始位置之后(重叠)
}
} else {
// 空间隔表
intervals_physreg.emplace_back(begin,end);
}
}
/**
* cond
* @param cond
* @param inst_idx
*/
void RegAlloc::addIntervalAtBack_positive(int cond, unsigned int inst_idx){
std::list<Pii> &intervals_physreg = intervals_token_phys_reg[cond];
intervals_physreg.emplace_back(inst_idx,inst_idx);
}
/** 添加间隔 */
RegAlloc::Pii* RegAlloc::addInterval(LIROperand *opnd, unsigned int begin, unsigned int end, bool bb_range) {
Var_live_intervals& intervals_vector = intervals[opnd];
if(!intervals_vector.empty()){
RegAlloc::Pii& last_interval = intervals_vector.back();
if(begin<last_interval.first){
last_interval.first = begin;
}
if(last_interval.second<end){
last_interval.second = end;
}
}else{
intervals_vector.push_back(Pii(begin,end));
}
return &(intervals_vector.back());
}
/** 切割间隔 */
RegAlloc::Pii* RegAlloc::cutInterval(LIROperand *var_ptr, unsigned int cut_point, LIRInstruction* inst , LIRInstruction* last_inst) {
RegAlloc::Var_live_intervals& intervals_vector = intervals[var_ptr];
if(!intervals_vector.empty()){
RegAlloc::Pii& last_interval = intervals_vector.back();
if (last_interval.first <= cut_point && cut_point <= last_interval.second) {
last_interval.first = cut_point;
return &last_interval;
}else if(cut_point<last_interval.first){
last_interval.first = cut_point;
return &last_interval;
}else{
last_interval.first = bbInterval[inst->parent_].second;
return &last_interval;
}
}else{
intervals_vector.push_back(bbInterval[inst->parent_]);
}
return &(intervals_vector.back());
}
void RegAlloc::linearScan() {
for (std::pair< LIROperand* const, Var_live_intervals>& var_intervals_pair : intervals) {
LIROperand* opnd = var_intervals_pair.first;
Var_live_intervals& intervals_vec = var_intervals_pair.second;
for (Pii& interval : intervals_vec) {
all_intervals.emplace_back(&interval);
interval_belong_umap[&interval] = opnd;
}
}
std::sort(all_intervals.begin(), all_intervals.end(),
[](Pii* a, Pii* b) { return a->first < b->first; });
final_result_[&func_end] = REGALLOC_DEF_NO_USE;
std::set< std::pair<Pii*, LIROperand*>, varIntervalsCmp> common_active;
std::unordered_map<int, int> common_phys_regs;
unsigned int common_phys_regs_freenum = 0;
std::set< std::pair<Pii*, LIROperand*>, varIntervalsCmp> float_active;
std::unordered_map<int, int> float_phys_regs;
unsigned int float_phys_regs_freenum = 0;
for (int i = 1; i <= TOP_LIMIT_PHYS_REG ; i++){
common_phys_regs[i] = 1;
common_phys_regs_freenum++;
}
for (int i = -1; i >= BOTTOM_LIMIT_PHYS_FREG ; i--){
float_phys_regs[i] = 1;
float_phys_regs_freenum++;
}
for (Pii* i : all_intervals) {
LIROperand* i_var = interval_belong_umap[i];
releaseOverdueIntervals(common_active,common_phys_regs,common_phys_regs_freenum,i,false);
releaseOverdueIntervals(float_active,float_phys_regs,float_phys_regs_freenum,i,true);
if(i_var->tid_ == LIROperand::LOVirtRegTy){
assginFreeReg(common_active,common_phys_regs,common_phys_regs_freenum,i,false);
}else if(i_var->tid_ == LIROperand::LOVirtFRegTy){
assginFreeReg(float_active,float_phys_regs,float_phys_regs_freenum,i,true);
}else{
}
}
releaseOverdueIntervals(common_active,common_phys_regs,common_phys_regs_freenum,&func_end,false);
releaseOverdueIntervals(float_active,float_phys_regs,float_phys_regs_freenum,&func_end,true);
if(float_phys_regs_freenum!=PHYS_FREG_NUM){
}
if(common_phys_regs_freenum!=PHYS_REG_NUM){
}
}
void RegAlloc::releaseOverdueIntervals(std::set<std::pair<Pii *, LIROperand *>, varIntervalsCmp> &common_active,
std::unordered_map<int, int> &common_phys_regs, unsigned int &num, Pii* now_interval, bool isf) {
for (std::set<std::pair<Pii*, LIROperand*>>::iterator j_iter = common_active.begin(); j_iter != common_active.end();) {
Pii* pii_ptr = j_iter->first;
if (pii_ptr->second > now_interval->first) {
break;
} else {
LIROperand* temp_var = j_iter->second;
int reg_num = assignReg[temp_var];
common_phys_regs[reg_num]=1;
j_iter = common_active.erase(j_iter);
num++;
final_result_[pii_ptr] = reg_num;
}
}
}
void RegAlloc::assginFreeReg(std::set<std::pair<Pii *, LIROperand *>, varIntervalsCmp> &common_active,
std::unordered_map<int, int> &common_phys_regs, unsigned int &free_reg_num, Pii* now_interval, bool isf) {
LIROperand* now_opnd = interval_belong_umap[now_interval];
if(free_reg_num > 0){
if(!isf){
for(int i=TOP_LIMIT_PHYS_REG; i>=1; --i){
if(common_phys_regs[i]!=1 || isConflict(now_interval,i))
continue;
else{
free_reg_num--;
assignReg[now_opnd] = i;
common_phys_regs[i]=-1;
common_active.emplace(now_interval, now_opnd);
return;
}
}
}else{
for(int i=BOTTOM_LIMIT_PHYS_FREG; i<=-1; ++i){
if(common_phys_regs[i]!=1 || isConflict(now_interval,i))
continue;
else{
free_reg_num--;
assignReg[now_opnd] = i;
common_phys_regs[i]=-1;
common_active.emplace(now_interval, now_opnd);
return;
}
}
}
}
auto spill_iter = common_active.end();
Pii* spill_itv = (--spill_iter)->first;
if (spill_itv->second > now_interval->second) {
LIROperand* spill_var = spill_iter->second;
assignReg[now_opnd] = assignReg[spill_var];
assignReg[spill_var] = REGALLOC_SPILL;
final_result_[spill_itv] = REGALLOC_SPILL;
common_active.erase(spill_iter);
common_active.emplace(now_interval, now_opnd);
} else {
assignReg[now_opnd] = REGALLOC_SPILL;
final_result_[now_interval] = REGALLOC_SPILL;
}
}
bool RegAlloc::isConflict(RegAlloc::Pii *now_interval, int rid) {
std::list<Pii> &token_intervals = intervals_token_phys_reg[rid];
if(token_intervals.empty()) return false;
auto it = std::lower_bound(token_intervals.begin(),token_intervals.end(),*now_interval);
if(it!=token_intervals.end()) {
if( it->first < now_interval->second)
return true;
if( it->first==it->second && (it->first <= now_interval->second && it->first >= now_interval->first) )
return true;
}
if(it!=token_intervals.begin()){
it--;
if(it->second > now_interval->first){
return true;
}
if( it->first==it->second && (it->first <= now_interval->second && it->first >= now_interval->first) )
return true;
it++;
}
return false;
}
/** 判断基本块是否为返回块 */
void RegAlloc::findRetBB(LIRBasicBlock* bb){
if( !retBB ){
if(bb->name_.size()>3 && "ret"==bb->name_.substr(bb->name_.size()-3,3)){
// 以“ret”结尾的基本块名记为返回块
retBB = bb;
}
}
}
bool RegAlloc::isRelevant(LIROperand* opnd,LIRInstruction* inst){
if(inst->result_ && inst->result_ == opnd){
return true;
}else {
for(LIROperand* lirop:inst->operands_){
if(lirop == opnd){
return true;
}
}
return false;
}
}
void RegAlloc::process_code() {
lirf_->temps_offset_.push_back(lirf_->allocas_offset_end_);
lirf_->temps_offset_.push_back(lirf_->allocas_offset_end_ + 4);
lirf_->temps_offset_.push_back(lirf_->allocas_offset_end_ + 8);
lirf_->temps_offset_.push_back(lirf_->allocas_offset_end_ + 12);
lirf_->temps_offset_.push_back(lirf_->allocas_offset_end_ + 16);
lirf_->temps_offset_.push_back(lirf_->allocas_offset_end_ + 20);
lirf_->temps_offset_end_ = lirf_->allocas_offset_end_ + 24;
int spills_offset_cur = lirf_->temps_offset_end_;
for (LIRBasicBlock* lirbb : lirf_->basic_blocks_) {
std::map<LIRInstruction*, std::pair<std::list<LIRInstruction*>, std::list<LIRInstruction*>>> addinst_map;
for (LIRInstruction* lirinst : lirbb->instr_list_) {
std::list<LIRInstruction*> addbefore;
std::list<LIRInstruction*> addafter;
std::map<int, int> useStatus;
for (int i = 0; i < lirinst->num_ops_; i++) {
LIROperand* lirop = lirinst->get_operand(i);
if (lirop->tid_ == LIROperand::LOVirtRegTy) {
// 为虚拟寄存器,获取可用的物理寄存器
int assignedReg = getReg(lirop,lirinst);
if (assignedReg != REGALLOC_SPILL) {
lirinst->remove_operand(i);
lirinst->set_operand(i, lirm_->get_LIRPhysReg(assignedReg));
useStatus[assignedReg] = 1;
} else {
// 无可用寄存器,记录溢出指令
if (!lirf_->spills_offset_.count(lirop)) {
lirf_->spills_offset_[lirop] = spills_offset_cur;
spills_offset_cur += 4;
}
}
} else if (lirop->tid_ == LIROperand::LOVirtFRegTy) {
// 为浮点虚拟寄存器,获取可用物理寄存器
int assignedReg = getReg(lirop,lirinst);
if (assignedReg != REGALLOC_SPILL) {
lirinst->remove_operand(i);
lirinst->set_operand(i, lirm_->get_LIRPhysFReg(assignedReg));
useStatus[assignedReg] = 1;
} else {
// 无可用寄存器,记录溢出指令
if (!lirf_->spills_offset_.count(lirop)) {
lirf_->spills_offset_[lirop] = spills_offset_cur;
spills_offset_cur += 4;
}
}
} else if (lirop->tid_ == LIROperand::LOPhysRegTy) {
// 物理寄存器,添加到使用记录
auto pr = dynamic_cast<LIRPhysReg*>(lirop);
useStatus[pr->rid_] = 1;
} else if (lirop->tid_ == LIROperand::LOPhysFRegTy) {
// 浮点物理寄存器,添加到使用记录
auto pfr = dynamic_cast<LIRPhysFReg*>(lirop);
useStatus[pfr->frid_] = 1;
}
}
if(LIROperand* lirinst_result = lirinst->result_) {
// 有计算结果的指令,根据寄存器类型为计算结果分配合适寄存器
if (lirinst_result->tid_ == LIROperand::LOVirtRegTy) {
int assignedReg = getReg(lirinst_result,lirinst);
if (assignedReg != REGALLOC_SPILL) {
lirinst->remove_result();
lirinst->set_result(lirm_->get_LIRPhysReg(assignedReg));
useStatus[assignedReg] = 1;
} else {
if (!lirf_->spills_offset_.count(lirinst_result)) {
lirf_->spills_offset_[lirinst_result] = spills_offset_cur;
spills_offset_cur += 4;
}
}
} else if (lirinst_result->tid_ == LIROperand::LOVirtFRegTy) {
int assignedReg = getReg(lirinst_result,lirinst);
if (assignedReg != REGALLOC_SPILL) {
lirinst->remove_result();
lirinst->set_result(lirm_->get_LIRPhysFReg(assignedReg));
useStatus[assignedReg] = 1;
} else {
if (!lirf_->spills_offset_.count(lirinst_result)) {
lirf_->spills_offset_[lirinst_result] = spills_offset_cur;
spills_offset_cur += 4;
}
}
} else if (lirinst_result->tid_ == LIROperand::LOPhysRegTy) {
auto pr = dynamic_cast<LIRPhysReg*>(lirinst_result);
useStatus[pr->rid_] = 1;
} else if (lirinst_result->tid_ == LIROperand::LOPhysFRegTy) {
auto pfr = dynamic_cast<LIRPhysFReg*>(lirinst_result);
useStatus[pfr->frid_] = 1;
}
}
for (int i = 0; i < lirinst->num_ops_; i++) {
// 将所有虚拟寄存器替换为物理寄存器
LIROperand* lirop = lirinst->get_operand(i);
if (lirop->tid_ == LIROperand::LOVirtRegTy) {
assert(getReg(lirop, lirinst) == REGALLOC_SPILL);
int j = 5;
for (; j <= 12; j++) {
if (!useStatus.count(j))
break;
}
lirinst->remove_operand(i);
lirinst->set_operand(i, lirm_->get_LIRPhysReg(j));
addbefore.push_back(new LIRLdrInst(LIRInstruction::LCondNone, lirm_->get_LIRPhysReg(j), lirm_->get_LIRPhysReg(14), lirm_->get_LIRConstant(lirf_->spills_offset_.at(lirop)), LIRInstruction::LRegisterOffsetTy));
useStatus[j] = 2;
} else if (lirop->tid_ == LIROperand::LOVirtFRegTy) {
assert(getReg(lirop, lirinst) == REGALLOC_SPILL);
int j = -17;
for (; j >= -31; j--) {
if (!useStatus.count(j))
break;
}
lirinst->remove_operand(i);
lirinst->set_operand(i, lirm_->get_LIRPhysFReg(j));
addbefore.push_back(new LIRVldrInst(LIRInstruction::LCondNone, lirm_->get_LIRPhysFReg(j), lirm_->get_LIRPhysReg(14), lirm_->get_LIRConstant(lirf_->spills_offset_.at(lirop))));
useStatus[j] = 2;
}
}
if(LIROperand* lirinst_result = lirinst->result_){
// 为计算结果分配物理寄存器
if (lirinst_result->tid_ == LIROperand::LOVirtRegTy) {
assert(getReg(lirinst_result, lirinst) == REGALLOC_SPILL);
int j = 5;
for (; j <= 12; j++) {
if (!useStatus.count(j))
break;
}
lirinst->remove_result();
lirinst->set_result(lirm_->get_LIRPhysReg(j));
addafter.push_back(new LIRStrInst(LIRInstruction::LCondNone, lirm_->get_LIRPhysReg(j), lirm_->get_LIRPhysReg(14), lirm_->get_LIRConstant(lirf_->spills_offset_.at(lirinst_result)), LIRInstruction::LRegisterOffsetTy));
useStatus[j] = 2;
} else if (lirinst_result->tid_ == LIROperand::LOVirtFRegTy) {
assert(getReg(lirinst_result, lirinst) == REGALLOC_SPILL);
int j = -17;
for (; j >= -31; j--) {
if (!useStatus.count(j))
break;
}
lirinst->remove_result();
lirinst->set_result(lirm_->get_LIRPhysFReg(j));
addafter.push_back(new LIRVstrInst(LIRInstruction::LCondNone, lirm_->get_LIRPhysFReg(j), lirm_->get_LIRPhysReg(14), lirm_->get_LIRConstant(lirf_->spills_offset_.at(lirinst_result))));
useStatus[j] = 2;
}
}
// 根据useState记录为所有物理寄存器添加对应分配指令
int j = 0;
for (int i = 1; i <= 12; i++) {
if (useStatus.count(i) && useStatus.at(i) == 2) {
assert(j<=5&&"lirf_->temps_offset_[j] : j out of range!");
int tmpoffset = lirf_->temps_offset_[j];
addbefore.push_front(new LIRStrInst(LIRInstruction::LCondNone, lirm_->get_LIRPhysReg(i), lirm_->get_LIRPhysReg(14), lirm_->get_LIRConstant(tmpoffset), LIRInstruction::LRegisterOffsetTy));
addafter.push_back(new LIRLdrInst(LIRInstruction::LCondNone, lirm_->get_LIRPhysReg(i), lirm_->get_LIRPhysReg(14), lirm_->get_LIRConstant(tmpoffset), LIRInstruction::LRegisterOffsetTy));
j += 1;
}
}
for (int i = -1; i >= -32; i--) {
if (useStatus.count(i) && useStatus.at(i) == 2) {
assert(j<=5&&"lirf_->temps_offset_[j] : j out of range!");
int tmpoffset = lirf_->temps_offset_[j];
addbefore.push_front(new LIRVstrInst(LIRInstruction::LCondNone, lirm_->get_LIRPhysFReg(i), lirm_->get_LIRPhysReg(14), lirm_->get_LIRConstant(tmpoffset)));
addafter.push_back(new LIRVldrInst(LIRInstruction::LCondNone, lirm_->get_LIRPhysFReg(i), lirm_->get_LIRPhysReg(14), lirm_->get_LIRConstant(tmpoffset)));
j += 1;
}
}
addinst_map[lirinst]={addbefore,addafter};
}
for (const auto& pair: addinst_map) {
for (auto inst: pair.second.first) {
lirbb->add_inst_before(inst,pair.first);
}
for (auto inst = pair.second.second.rbegin(); inst != pair.second.second.rend(); ++inst) {
lirbb->add_inst_after(*inst,pair.first);
}
}
}
// 溢出记录
lirf_->spills_offset_end_=spills_offset_cur;
if(lirf_->spills_offset_end_==lirf_->temps_offset_end_){
lirf_->temps_offset_end_=lirf_->allocas_offset_end_;
lirf_->spills_offset_end_=lirf_->allocas_offset_end_;
}
}
int RegAlloc::is_KF_hasR_noUse(LIRInstruction* inst){
assert(inst->op_id_==LIRInstruction::LBlTy);
LIRBlInst* blinst = static_cast<LIRBlInst*>(inst);
LIRFunction* calllirf = static_cast<LIRFunction*>(blinst->get_operand(0));
if(calllirf->has_result_!=0&&blinst->result_unused_){
if(calllirf->has_result_==1){
return 1;
}else{
assert(calllirf->has_result_==2);
return -1;
}
}
return 0;
}

@ -1,100 +0,0 @@
#ifndef SYSYCOMPILER_REGALLOC_H
#define SYSYCOMPILER_REGALLOC_H
#include "lir.h"
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <set>
#include <algorithm>
#include <string>
#include <queue>
class LIRFunction;
class LIRModule;
class LIROperand;
#define INST_GAP 1
#define REGALLOC_SPILL 66666
#define REGALLOC_DEF_NO_USE 7777777
#define TOP_LIMIT_PHYS_REG 12
#define BOTTOM_LIMIT_PHYS_FREG -31
#define PHYS_REG_NUM (TOP_LIMIT_PHYS_REG)
#define PHYS_FREG_NUM (-(BOTTOM_LIMIT_PHYS_FREG))
class RegAlloc{
public:
using Pii = std::pair<unsigned int, unsigned int>;
using Var_live_intervals = std::list<Pii>;
using Var_live_map = std::unordered_map< LIROperand*, Var_live_intervals>;
using Var_reg_map = std::unordered_map< LIROperand*, int> ;
using Inst_label = std::unordered_map< LIRInstruction*, unsigned int> ;
using Label_inst = std::unordered_map< unsigned int, LIRInstruction* > ;
using Bb_valset_map = std::unordered_map< LIRBasicBlock*, std::set< LIROperand*> > ;
using Bb_valvec_map = std::unordered_map< LIRBasicBlock*, std::vector< LIROperand*> >;
using Bb_interval = std::unordered_map< LIRBasicBlock*, Pii>;
class varIntervalsCmp {
public:
bool operator()(const std::pair<RegAlloc::Pii*, LIROperand*> &A, const std::pair<RegAlloc::Pii*, LIROperand*> &B) const {
RegAlloc::Pii *a = A.first, *b = B.first;
if(a->second != b->second)
return a->second < b->second;
else if(a->first != b->first)
return a->first > b->first;
else
return A.second < B.second;
}
};
LIRFunction* lirf_;
LIRModule* lirm_;
RegAlloc(LIRFunction* lirf,bool is_o2){
this->lirf_ = lirf;
this->lirm_ = lirf->parent_;
this->is_o2_ = is_o2;
}
~RegAlloc()=default;
void run();
void process_code();
int getReg(LIROperand* lirop, LIRInstruction* inst);
void preF();
void assignForFunc();
void live_analyse();
void live_analyse_1();
void live_analyse_2();
void live_analyse_3();
void linearScan();
void releaseOverdueIntervals(std::set< std::pair<Pii*, LIROperand*>, varIntervalsCmp>& ,std::unordered_map<int, int>&,unsigned int &,Pii* , bool);
void assginFreeReg(std::set< std::pair<Pii*, LIROperand*>, varIntervalsCmp>& ,std::unordered_map<int, int>&,unsigned int &,Pii* , bool);
bool is_o2_;
LIRBasicBlock* retBB = nullptr;
LIRBasicBlock* initBB =nullptr;
Pii func_end = Pii(REGALLOC_DEF_NO_USE, REGALLOC_DEF_NO_USE);
std::unordered_map<LIRBasicBlock*,unsigned int> FEdge;
std::vector<LIRBasicBlock*> basicBlocksOrder;
std::unordered_set<LIRBasicBlock*> basicBlocksOrderSet ;
std::unordered_set<LIRBasicBlock*> visited;
Bb_valset_map live_def;
Bb_valvec_map live_use;
Bb_valvec_map live_out;
Bb_valvec_map live_in;
std::unordered_map< int, Var_live_intervals> intervals_token_phys_reg;
Var_live_map intervals;
Var_reg_map assignReg;
Inst_label instIdx;
Label_inst idxInst;
Bb_interval bbInterval;
std::vector<Pii*> all_intervals;
std::unordered_map<Pii*, LIROperand*> interval_belong_umap;
std::unordered_map<Pii*, int> final_result_;
std::unordered_map<LIROperand*,std::unordered_map<LIRInstruction*,Pii*> > opnd_inst_in_itv;
static inline bool isVF(const LIROperand * var) {return var->tid_ == LIROperand::LOPhysFRegTy;}
static inline bool isVNF(const LIROperand * var) {return var->tid_ == LIROperand::LOVirtRegTy;}
void computeBlockOrder();
void addIntervalAtBack_positive(LIROperand* phy_reg, unsigned int begin, unsigned int end);
void addIntervalAtBack_positive(int cond, unsigned int inst_idx);
Pii* addInterval(LIROperand* val_ptr, unsigned int bb_begin,unsigned int bb_end , bool bb_range);
Pii* cutInterval(LIROperand *var_ptr, unsigned int cut_point, LIRInstruction* inst , LIRInstruction* last_inst );
unsigned int getInstIdx( LIRInstruction* inst_ptr) { return instIdx[inst_ptr]; }
bool isConflict(Pii *now_interval,int);
void dfs(LIRBasicBlock*);
void findRetBB(LIRBasicBlock*);
bool isRelevant(LIROperand*,LIRInstruction*);
int is_KF_hasR_noUse(LIRInstruction* inst);
};
#endif

@ -1,7 +0,0 @@
cmake_minimum_required(VERSION 3.21)
set(SOURCE_FILES "ir.cpp" "genIR.cpp")
add_library(ir STATIC ${SOURCE_FILES})
target_include_directories(ir PRIVATE "${PARSER_INCLUDE}")

File diff suppressed because it is too large Load Diff

@ -1,210 +0,0 @@
#pragma once
#include "ast.h"
#include "ir.h"
#include <map>
class Scope {
public:
// enter a new scope
void enter() { symbol.push_back({}); }
// exit a scope
void exit() { symbol.pop_back(); }
bool in_global() { return symbol.size() == 1; }
// push a name to scope
// return true if successful
// return false if this name already exits
// but func name could be same with variable name
bool push(std::string name, Value *val) {
bool result;
result = (symbol[symbol.size() - 1].insert({name, val})).second;
return result;
}
Value *find(std::string name) {
for (auto s = symbol.rbegin(); s != symbol.rend(); s++) {
auto iter = s->find(name);
if (iter != s->end()) {
return iter->second;
}
}
return nullptr;
}
private:
std::vector<std::map<std::string, Value *>> symbol;
};
class GenIR : public Visitor {
public:
void visit(CompUnitAST &ast) override;
void visit(DeclDefAST &ast) override;
void visit(DeclAST &ast) override;
void visit(DefAST &ast) override;
void visit(InitValAST &ast) override;
void visit(FuncDefAST &ast) override;
void visit(FuncFParamAST &ast) override;
void visit(BlockAST &ast) override;
void visit(BlockItemAST &ast) override;
void visit(StmtAST &ast) override;
void visit(ReturnStmtAST &ast) override;
void visit(SelectStmtAST &ast) override;
void visit(IterationStmtAST &ast) override;
void visit(AddExpAST &ast) override;
void visit(LValAST &ast) override;
void visit(MulExpAST &ast) override;
void visit(UnaryExpAST &ast) override;
void visit(PrimaryExpAST &ast) override;
void visit(CallAST &ast) override;
void visit(NumberAST &ast) override;
void visit(RelExpAST &ast) override;
void visit(EqExpAST &ast) override;
void visit(LAndExpAST &ast) override;
void visit(LOrExpAST &ast) override;
IRStmtBuilder *builder;
Scope scope;
std::unique_ptr<Module> module;
GenIR() {
module = std::unique_ptr<Module>(new Module());
builder = new IRStmtBuilder(nullptr, module.get());
auto TyVoid = module->void_ty_;
auto TyInt32 = module->int32_ty_;
auto TyInt32Ptr = module->get_pointer_type(module->int32_ty_);
auto TyFloat = module->float32_ty_;
auto TyFloatPtr = module->get_pointer_type(module->float32_ty_);
auto input_type = new FunctionType(TyInt32, {});
auto get_int = new Function(input_type, "getint", module.get());
input_type = new FunctionType(TyFloat, {});
auto get_float = new Function(input_type, "getfloat", module.get());
input_type = new FunctionType(TyInt32, {});
auto get_char = new Function(input_type, "getch", module.get());
std::vector<Type *> input_params;
std::vector<Type *>().swap(input_params);
input_params.push_back(TyInt32Ptr);
input_type = new FunctionType(TyInt32, input_params);
auto get_int_array = new Function(input_type, "getarray", module.get());
std::vector<Type *>().swap(input_params);
input_params.push_back(TyFloatPtr);
input_type = new FunctionType(TyInt32, input_params);
auto get_float_array = new Function(input_type, "getfarray", module.get());
std::vector<Type *> output_params;
std::vector<Type *>().swap(output_params);
output_params.push_back(TyInt32);
auto output_type = new FunctionType(TyVoid, output_params);
auto put_int = new Function(output_type, "putint", module.get());
std::vector<Type *>().swap(output_params);
output_params.push_back(TyFloat);
output_type = new FunctionType(TyVoid, output_params);
auto put_float = new Function(output_type, "putfloat", module.get());
std::vector<Type *>().swap(output_params);
output_params.push_back(TyInt32);
output_type = new FunctionType(TyVoid, output_params);
auto put_char = new Function(output_type, "putch", module.get());
std::vector<Type *>().swap(output_params);
output_params.push_back(TyInt32);
output_params.push_back(TyInt32Ptr);
output_type = new FunctionType(TyVoid, output_params);
auto put_int_array = new Function(output_type, "putarray", module.get());
std::vector<Type *>().swap(output_params);
output_params.push_back(TyInt32);
output_params.push_back(TyFloatPtr);
output_type = new FunctionType(TyVoid, output_params);
auto put_float_array = new Function(output_type, "putfarray", module.get());
output_params.clear();
// output_params.push_back(TyInt32);
auto time_type = new FunctionType(TyVoid, output_params);
auto sysy_start_time =
new Function(time_type, "_sysy_starttime", module.get());
auto sysy_stop_time =
new Function(time_type, "_sysy_stoptime", module.get());
output_params.clear();
output_params.push_back(TyInt32Ptr);
output_params.push_back(TyInt32Ptr);
output_params.push_back(TyInt32);
output_type = new FunctionType(TyVoid, output_params);
auto memcpy = new Function(output_type, "__aeabi_memcpy4", module.get());
output_params.clear();
output_params.push_back(TyInt32Ptr);
output_params.push_back(TyInt32);
output_type = new FunctionType(TyVoid, output_params);
auto memclr = new Function(output_type, "__aeabi_memclr4", module.get());
output_params.push_back(TyInt32);
output_type = new FunctionType(TyVoid, output_params);
auto memset = new Function(output_type, "__aeabi_memset4", module.get());
output_params.clear();
output_type = new FunctionType(TyVoid, output_params);
auto llvm_memset =
new Function(output_type, "llvm.memset.p0.i32", module.get());
// output_params.clear();
// output_params.push_back(TyInt32);
// output_type = new FunctionType(TyInt32, output_params);
// auto my_malloc = new Function(output_type, "malloc", module.get());
scope.enter();
scope.push("getint", get_int);
scope.push("getfloat", get_float);
scope.push("getch", get_char);
scope.push("getarray", get_int_array);
scope.push("getfarray", get_float_array);
scope.push("putint", put_int);
scope.push("putfloat", put_float);
scope.push("putch", put_char);
scope.push("putarray", put_int_array);
scope.push("putfarray", put_float_array);
scope.push("starttime", sysy_start_time);
scope.push("stoptime", sysy_stop_time);
scope.push("memcpy", memcpy);
scope.push("memclr", memclr);
scope.push("memset", memset);
scope.push("llvm.memset.p0.i32", llvm_memset);
// scope.push("malloc",my_malloc);
}
std::unique_ptr<Module> getModule() { return std::move(module); }
void checkInitType() const;
static int getNextDim(vector<int> &dimensionsCnt, int up, int cnt);
void localInit(Value *ptr, vector<unique_ptr<InitValAST>> &list,
vector<int> &dimensionsCnt, int up);
static int getNextDim(vector<int> &elementsCnts, int up);
ConstantArray *globalInit(vector<int> &dimensions,
vector<ArrayType *> &arrayTys, int up,
vector<unique_ptr<InitValAST>> &list);
static void mergeElements(vector<int> &dimensions,
vector<ArrayType *> &arrayTys, int up, int dimAdd,
vector<Constant *> &elements,
vector<int> &elementsCnts);
void finalMerge(vector<int> &dimensions, vector<ArrayType *> &arrayTys,
int up, vector<Constant *> &elements,
vector<int> &elementsCnts) const;
bool checkCalType(Value **val, int *intVal, float *floatVal);
void checkCalType(Value **val);
};

@ -1,838 +0,0 @@
#include "ir.h"
std::map<Instruction::OpID, std::string> instr_id2string_ = {
{Instruction::Ret, "ret"},
{Instruction::Br, "br"},
{Instruction::FNeg, "fneg"},
{Instruction::Add, "add"},
{Instruction::Sub, "sub"},
{Instruction::Mul, "mul"},
{Instruction::SDiv, "sdiv"},
{Instruction::SRem, "srem"},
{Instruction::UDiv, "udiv"},
{Instruction::URem, "urem"},
{Instruction::FAdd, "fadd"},
{Instruction::FSub, "fsub"},
{Instruction::FMul, "fmul"},
{Instruction::FDiv, "fdiv"},
{Instruction::Shl, "shl"},
{Instruction::LShr, "lshr"},
{Instruction::AShr, "ashr"},
{Instruction::And, "and"},
{Instruction::Or, "or"},
{Instruction::Xor, "xor"},
{Instruction::Alloca, "alloca"},
{Instruction::Load, "load"},
{Instruction::Store, "store"},
{Instruction::GetElementPtr, "getelementptr"},
{Instruction::ZExt, "zext"},
{Instruction::FPtoSI, "fptosi"},
{Instruction::SItoFP, "sitofp"},
{Instruction::BitCast, "bitcast"},
{Instruction::ICmp, "icmp"},
{Instruction::FCmp, "fcmp"},
{Instruction::PHI, "phi"},
{Instruction::Call, "call"}}; // Instruction from opid to string
const std::map<ICmpInst::ICmpOp, std::string> ICmpInst::ICmpOpName = {
{ICmpInst::ICmpOp::ICMP_EQ, "eq"}, {ICmpInst::ICmpOp::ICMP_NE, "ne"},
{ICmpInst::ICmpOp::ICMP_UGT, "hi"}, {ICmpInst::ICmpOp::ICMP_UGE, "cs"},
{ICmpInst::ICmpOp::ICMP_ULT, "cc"}, {ICmpInst::ICmpOp::ICMP_ULE, "ls"},
{ICmpInst::ICmpOp::ICMP_SGT, "gt"}, {ICmpInst::ICmpOp::ICMP_SGE, "ge"},
{ICmpInst::ICmpOp::ICMP_SLT, "lt"}, {ICmpInst::ICmpOp::ICMP_SLE, "le"}};
const std::map<FCmpInst::FCmpOp, std::string> FCmpInst::FCmpOpName = {
{FCmpInst::FCmpOp::FCMP_FALSE, "nv"}, {FCmpInst::FCmpOp::FCMP_OEQ, "eq"},
{FCmpInst::FCmpOp::FCMP_OGT, "gt"}, {FCmpInst::FCmpOp::FCMP_OGE, "ge"},
{FCmpInst::FCmpOp::FCMP_OLT, "cc"}, {FCmpInst::FCmpOp::FCMP_OLE, "ls"},
{FCmpInst::FCmpOp::FCMP_ONE, "ne"}, {FCmpInst::FCmpOp::FCMP_ORD, "vc"},
{FCmpInst::FCmpOp::FCMP_UNO, "vs"}, {FCmpInst::FCmpOp::FCMP_UEQ, "eq"},
{FCmpInst::FCmpOp::FCMP_UGT, "hi"}, {FCmpInst::FCmpOp::FCMP_UGE, "cs"},
{FCmpInst::FCmpOp::FCMP_ULT, "lt"}, {FCmpInst::FCmpOp::FCMP_ULE, "le"},
{FCmpInst::FCmpOp::FCMP_UNE, "ne"}, {FCmpInst::FCmpOp::FCMP_TRUE, "al"}};
std::string print_as_op(Value *v, bool print_ty);
std::string print_cmp_type(ICmpInst::ICmpOp op);
std::string print_fcmp_type(FCmpInst::FCmpOp op);
//-----------------------------------------------Type-----------------------------------------------
std::string Type::print() {
std::string type_ir;
switch (this->tid_) {
case VoidTyID:
type_ir += "void";
break;
case LabelTyID:
type_ir += "label";
break;
case IntegerTyID:
type_ir += "i";
type_ir += std::to_string(static_cast<IntegerType *>(this)->num_bits_);
break;
case FloatTyID:
type_ir += "float";
break;
case FunctionTyID:
type_ir += static_cast<FunctionType *>(this)->result_->print();
type_ir += " (";
for (size_t i = 0; i < static_cast<FunctionType *>(this)->args_.size();
i++) {
if (i)
type_ir += ", ";
type_ir += static_cast<FunctionType *>(this)->args_[i]->print();
}
type_ir += ")";
break;
case PointerTyID:
type_ir += static_cast<PointerType *>(this)->contained_->print();
type_ir += "*";
break;
case ArrayTyID:
type_ir += "[";
type_ir += std::to_string(static_cast<ArrayType *>(this)->num_elements_);
type_ir += " x ";
type_ir += static_cast<ArrayType *>(this)->contained_->print();
type_ir += "]";
break;
default:
break;
}
return type_ir;
}
//-----------------------------------------------Value-----------------------------------------------
void Value::replace_all_use_with(Value *new_val) {
for (auto use : use_list_) {
auto val = dynamic_cast<Instruction *>(use.val_);
#ifdef DEBUG
assert(val && "new_val is not a user");
#endif
val->set_operand(use.arg_no_, new_val);
}
}
bool Value::remove_used(Instruction *user, unsigned int i) {
if (this != user->operands_[i]) {
return false;
}
auto pos = user->use_pos_[i];
use_list_.erase(pos);
user->operands_[i] =
nullptr; // 表示user->use_pos_[i]失效了提示set_operand不要再删除
return true;
}
bool Value::is_constant() { return name_[0] == 0; }
//-----------------------------------------------Constant-----------------------------------------------
std::string ConstantInt::print() {
std::string const_ir;
if (this->type_->tid_ == Type::IntegerTyID &&
static_cast<IntegerType *>(this->type_)->num_bits_ == 1) {
// int1
const_ir += (this->value_ == 0) ? "0" : "1";
} else // int32
const_ir += std::to_string(this->value_);
return const_ir;
}
std::string ConstantFloat::print() {
std::stringstream fp_ir_ss;
std::string fp_ir;
double val = this->value_;
fp_ir_ss << "0x" << std::hex << *(uint64_t *)&val << std::endl;
fp_ir_ss >> fp_ir;
return fp_ir;
}
std::string ConstantFloat::print32() {
std::stringstream fp_ir_ss;
std::string fp_ir;
float val = this->value_;
fp_ir_ss << "0x" << std::hex << *(uint32_t *)&val << std::endl;
fp_ir_ss >> fp_ir;
return fp_ir;
}
std::string ConstantArray::print() {
std::string const_ir;
const_ir += "[";
const_ir += static_cast<ArrayType *>(this->type_)->contained_->print();
const_ir += " ";
const_ir += const_array[0]->print();
for (size_t i = 1; i < this->const_array.size(); i++) {
const_ir += ", ";
const_ir += static_cast<ArrayType *>(this->type_)->contained_->print();
const_ir += " ";
const_ir += const_array[i]->print();
}
const_ir += "]";
return const_ir;
}
std::string ConstantZero::print() { return "zeroinitializer"; }
//-----------------------------------------------Module-----------------------------------------------
std::string Module::print() {
std::string module_ir;
for (auto global_val : this->global_list_) {
module_ir += global_val->print();
module_ir += "\n";
}
for (auto func : this->function_list_) {
module_ir += func->print();
module_ir += "\n";
}
return module_ir;
}
Function *Module::getMainFunc() {
for (auto f : function_list_) {
if (f->name_ == "main") {
return f;
}
}
return nullptr;
}
//-----------------------------------------------GlobalVariable-----------------------------------------------
std::string GlobalVariable::print() {
std::string global_val_ir;
global_val_ir += print_as_op(this, false);
global_val_ir += " = ";
global_val_ir += (this->is_const_ ? "constant " : "global ");
global_val_ir += static_cast<PointerType *>(this->type_)->contained_->print();
global_val_ir += " ";
global_val_ir += this->init_val_->print();
return global_val_ir;
}
//-----------------------------------------------Function-----------------------------------------------
std::string Function::print() {
if (this->name_ == "llvm.memset.p0.i32") {
std::string func_ir = "declare void @llvm.memset.p0.i32(i32*, i8, i32, i1)";
return func_ir;
}
set_instr_name();
std::string func_ir;
if (this->is_declaration())
func_ir += "declare ";
else
func_ir += "define ";
func_ir += this->get_return_type()->print();
func_ir += " ";
func_ir += print_as_op(this, false);
func_ir += "(";
// print arg
if (this->is_declaration()) {
for (size_t i = 0; i < this->arguments_.size(); i++) {
if (i)
func_ir += ", ";
func_ir += static_cast<FunctionType *>(this->type_)->args_[i]->print();
}
} else {
for (auto arg = this->arguments_.begin(); arg != arguments_.end(); arg++) {
if (arg != this->arguments_.begin()) {
func_ir += ", ";
}
func_ir += static_cast<Argument *>(*arg)->print();
}
}
func_ir += ")";
// print bb
if (!this->is_declaration()) {
func_ir += " {";
func_ir += "\n";
for (auto bb : this->basic_blocks_) {
func_ir += bb->print();
}
func_ir += "}";
}
return func_ir;
}
std::string Argument::print() {
std::string arg_ir;
arg_ir += this->type_->print();
arg_ir += " %";
arg_ir += this->name_;
return arg_ir;
}
void Function::remove_bb(BasicBlock *bb) {
// basic_blocks_.remove(bb);
basic_blocks_.erase(
std::remove(basic_blocks_.begin(), basic_blocks_.end(), bb),
basic_blocks_.end());
for (auto pre : bb->pre_bbs_) {
pre->remove_succ_basic_block(bb);
}
for (auto succ : bb->succ_bbs_) {
succ->remove_pre_basic_block(bb);
}
}
BasicBlock *Function::getRetBB() {
for (auto bb : basic_blocks_) {
if (bb->get_terminator()->is_ret()) {
return bb;
}
}
return nullptr;
}
//-----------------------------------------------BasicBlock-----------------------------------------------
std::string BasicBlock::print() {
std::string bb_ir;
bb_ir += this->name_;
bb_ir += ":";
// print prebb
if (!this->pre_bbs_.empty()) {
bb_ir += " ; preds = ";
}
for (auto bb : this->pre_bbs_) {
if (bb != *this->pre_bbs_.begin())
bb_ir += ", ";
bb_ir += print_as_op(bb, false);
}
// print prebb
if (!this->parent_) {
bb_ir += "\n";
bb_ir += "; Error: Block without parent!";
}
bb_ir += "\n";
for (auto instr : this->instr_list_) {
bb_ir += " ";
bb_ir += instr->print();
bb_ir += "\n";
}
return bb_ir;
}
Instruction *BasicBlock::get_terminator() {
if (instr_list_.empty())
return nullptr;
switch (instr_list_.back()->op_id_) {
case Instruction::Ret:
case Instruction::Br:
return instr_list_.back();
default:
return nullptr;
}
}
bool BasicBlock::delete_instr(Instruction *instr) {
//******************--------instvec2list-----qwc20220814
// instr_list_.remove(instr);
if ((!instr) || instr->pos_in_bb.size() != 1 || instr->parent_ != this)
return false;
this->instr_list_.erase(instr->pos_in_bb.back());
// instr_list_.erase(std::remove(instr_list_.begin(), instr_list_.end(),
// instr) , instr_list_.end());
instr->remove_use_of_ops();
instr->pos_in_bb.clear(); // 保证指令自由身
instr->parent_ = nullptr;
return true;
}
bool BasicBlock::add_instruction(Instruction *instr) {
//******************--------instvec2list-----qwc20220814
if (instr->pos_in_bb.size() != 0) { // 指令已经插入到某个地方了
return false;
} else {
instr_list_.push_back(instr);
std::list<Instruction *>::iterator tail = instr_list_.end();
instr->pos_in_bb.emplace_back(--tail);
instr->parent_ = this;
return true;
}
}
bool BasicBlock::add_instruction_front(Instruction *instr) {
//******************--------instvec2list-----qwc20220814
if (instr->pos_in_bb.size() != 0) { // 指令已经插入到某个地方了
return false;
} else {
instr_list_.push_front(instr);
std::list<Instruction *>::iterator head = instr_list_.begin();
instr->pos_in_bb.emplace_back(head);
instr->parent_ = this;
return true;
}
}
// 插入到倒数第二位
bool BasicBlock::add_instruction_before_terminator(Instruction *instr) {
if (instr->pos_in_bb.size() != 0) { // 指令已经插入到某个地方了
return false;
} else if (instr_list_.empty()) { // 没有“倒数第1位”何来的倒数第二位
return false;
} else {
auto it = std::end(instr_list_); // 最后一位的后一位位置
instr_list_.emplace(
--it,
instr); // 插入使得代替最后一位(--it的位置此时it是最后一位插入的是倒数第二位
instr->pos_in_bb.emplace_back(--it); // 记录插入的结果
instr->parent_ = this;
return true;
}
}
bool BasicBlock::add_instruction_before_inst(Instruction *new_instr,
Instruction *instr) {
if ((!instr) || instr->pos_in_bb.size() != 1 || instr->parent_ != this)
return false;
if (new_instr->pos_in_bb.size() != 0) // 指令已经插入到某个地方了
return false;
else if (
instr_list_
.empty()) // bb原本没有指令那instr不在bb内那为啥instr->parent_==
// this
return false;
else {
auto it = instr->pos_in_bb.back(); //
instr_list_.emplace(
it,
new_instr); // 插入使得代替最后一位(--it的位置此时it是最后一位插入的是倒数第二位
new_instr->pos_in_bb.emplace_back(--it); // 记录插入的结果
new_instr->parent_ = this;
return true;
}
}
// 从bb移出一个指令但是不删指令的use关系因为还要插入其他bb
bool BasicBlock::remove_instr(Instruction *instr) {
// instr_list_.remove(instr);
if ((!instr) || instr->pos_in_bb.size() != 1 || instr->parent_ != this)
return false;
this->instr_list_.erase(instr->pos_in_bb.back());
// instr->remove_use_of_ops();
instr->pos_in_bb.clear(); // 保证指令自由身
instr->parent_ = nullptr;
return true;
}
//-----------------------------------------------Instruction-----------------------------------------------
std::string BinaryInst::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += this->operands_[0]->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), false);
instr_ir += ", ";
assert(this->get_operand(0)->type_->tid_ ==
this->get_operand(1)->type_->tid_);
instr_ir += print_as_op(this->get_operand(1), false);
// instr_ir += print_as_op(this->get_operand(1), true);
return instr_ir;
}
std::string UnaryInst::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += this->operands_[0]->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), false);
switch (this->op_id_) {
case Instruction::ZExt:
assert(this->type_->tid_ == Type::IntegerTyID);
instr_ir += " to i32";
break;
case Instruction::FPtoSI:
assert(this->type_->tid_ == Type::IntegerTyID);
instr_ir += " to i32";
break;
case Instruction::SItoFP:
assert(this->type_->tid_ == Type::FloatTyID);
instr_ir += " to float";
break;
default:
assert(0 && "UnaryInst opID invalid!");
break;
}
return instr_ir;
}
std::string ICmpInst::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += print_cmp_type(this->icmp_op_);
instr_ir += " ";
instr_ir += this->get_operand(0)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), false);
instr_ir += ", ";
if (this->get_operand(0)->type_->tid_ == this->get_operand(1)->type_->tid_) {
instr_ir += print_as_op(this->get_operand(1), false);
} else {
instr_ir += print_as_op(this->get_operand(1), true);
}
return instr_ir;
}
std::string FCmpInst::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += print_fcmp_type(this->fcmp_op_);
instr_ir += " ";
instr_ir += this->get_operand(0)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), false);
instr_ir += ", ";
if (this->get_operand(0)->type_->tid_ == this->get_operand(1)->type_->tid_) {
instr_ir += print_as_op(this->get_operand(1), false);
} else {
instr_ir += print_as_op(this->get_operand(1), true);
}
return instr_ir;
}
std::string CallInst::print() {
std::string instr_ir;
if (!(this->type_->tid_ == Type::VoidTyID)) {
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
}
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
unsigned int numops = this->num_ops_;
instr_ir += static_cast<FunctionType *>(this->get_operand(numops - 1)->type_)
->result_->print();
instr_ir += " ";
assert(dynamic_cast<Function *>(this->get_operand(numops - 1)) &&
"Wrong call operand function");
//__aeabi_memclr4 -> llvm_memset
if (dynamic_cast<Function *>(this->get_operand(numops - 1))->name_ ==
"__aeabi_memclr4") {
instr_ir += "@llvm.memset.p0.i32(";
// i32* 目的内存地址
instr_ir += this->get_operand(0)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), false);
// i8 0
instr_ir += ", i8 0, ";
// i32 修改总字节数
instr_ir += this->get_operand(1)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(1), false);
// i1 false
instr_ir += ", i1 false)";
return instr_ir;
}
instr_ir += print_as_op(this->get_operand(numops - 1), false);
instr_ir += "(";
for (unsigned int i = 0; i < numops - 1; i++) {
if (i > 0)
instr_ir += ", ";
instr_ir += this->get_operand(i)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(i), false);
}
instr_ir += ")";
return instr_ir;
}
std::string BranchInst::print() {
std::string instr_ir;
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), true);
if (this->num_ops_ == 3) {
instr_ir += ", ";
instr_ir += print_as_op(this->get_operand(1), true);
instr_ir += ", ";
instr_ir += print_as_op(this->get_operand(2), true);
}
return instr_ir;
}
std::string ReturnInst::print() {
std::string instr_ir;
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
if (this->num_ops_ != 0) {
instr_ir += this->get_operand(0)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), false);
} else {
instr_ir += "void";
}
return instr_ir;
}
std::string GetElementPtrInst::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
assert(this->get_operand(0)->type_->tid_ == Type::PointerTyID);
instr_ir += static_cast<PointerType *>(this->get_operand(0)->type_)
->contained_->print();
instr_ir += ", ";
for (unsigned int i = 0; i < this->num_ops_; i++) {
if (i > 0)
instr_ir += ", ";
instr_ir += this->get_operand(i)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(i), false);
}
return instr_ir;
}
std::string StoreInst::print() {
std::string instr_ir;
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += this->get_operand(0)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), false);
instr_ir += ", ";
instr_ir += print_as_op(this->get_operand(1), true);
return instr_ir;
}
std::string LoadInst::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
assert(this->get_operand(0)->type_->tid_ == Type::PointerTyID);
instr_ir += static_cast<PointerType *>(this->get_operand(0)->type_)
->contained_->print();
instr_ir += ",";
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), true);
return instr_ir;
}
std::string AllocaInst::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += alloca_ty_->print();
return instr_ir;
}
std::string ZextInst::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += this->get_operand(0)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), false);
instr_ir += " to ";
instr_ir += this->dest_ty_->print();
return instr_ir;
}
std::string FpToSiInst::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += this->get_operand(0)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), false);
instr_ir += " to ";
instr_ir += this->dest_ty_->print();
return instr_ir;
}
std::string SiToFpInst::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += this->get_operand(0)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), false);
instr_ir += " to ";
instr_ir += this->dest_ty_->print();
return instr_ir;
}
std::string Bitcast::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += this->get_operand(0)->type_->print();
instr_ir += " ";
instr_ir += print_as_op(this->get_operand(0), false);
instr_ir += " to ";
instr_ir += this->dest_ty_->print();
return instr_ir;
}
std::string PhiInst::print() {
std::string instr_ir;
instr_ir += "%";
instr_ir += this->name_;
instr_ir += " = ";
instr_ir += instr_id2string_[this->op_id_];
instr_ir += " ";
instr_ir += this->get_operand(0)->type_->print();
instr_ir += " ";
for (int i = 0; i < this->num_ops_ / 2; i++) {
if (i > 0)
instr_ir += ", ";
instr_ir += "[ ";
instr_ir += print_as_op(this->get_operand(2 * i), false);
instr_ir += ", ";
instr_ir += print_as_op(this->get_operand(2 * i + 1), false);
instr_ir += " ]";
}
if (this->num_ops_ / 2 < this->parent_->pre_bbs_.size()) {
for (auto pre_bb : this->parent_->pre_bbs_) {
if (std::find(this->operands_.begin(), this->operands_.end(),
static_cast<Value *>(pre_bb)) == this->operands_.end()) {
// find a pre_bb is not in phi
instr_ir += ", [ undef, " + print_as_op(pre_bb, false) + " ]";
}
}
}
return instr_ir;
}
std::string print_as_op(Value *v, bool print_ty) {
std::string op_ir;
if (print_ty) {
op_ir += v->type_->print();
op_ir += " ";
}
if (dynamic_cast<GlobalVariable *>(v)) {
op_ir += "@" + v->name_;
} else if (dynamic_cast<Function *>(v)) {
op_ir += "@" + v->name_;
} else if (dynamic_cast<Constant *>(v)) {
op_ir += v->print();
} else {
op_ir += "%" + v->name_;
}
return op_ir;
}
std::string print_cmp_type(ICmpInst::ICmpOp op) {
switch (op) {
case ICmpInst::ICMP_SGE:
return "sge";
break;
case ICmpInst::ICMP_SGT:
return "sgt";
break;
case ICmpInst::ICMP_SLE:
return "sle";
break;
case ICmpInst::ICMP_SLT:
return "slt";
break;
case ICmpInst::ICMP_EQ:
return "eq";
break;
case ICmpInst::ICMP_NE:
return "ne";
break;
default:
break;
}
return "wrong cmpop";
}
std::string print_fcmp_type(FCmpInst::FCmpOp op) {
switch (op) {
case FCmpInst::FCMP_UGE:
return "uge";
break;
case FCmpInst::FCMP_UGT:
return "ugt";
break;
case FCmpInst::FCMP_ULE:
return "ule";
break;
case FCmpInst::FCMP_ULT:
return "ult";
break;
case FCmpInst::FCMP_UEQ:
return "ueq";
break;
case FCmpInst::FCMP_UNE:
return "une";
break;
default:
break;
}
return "wrong fcmpop";
}
void Function::set_instr_name() {
std::map<Value *, int> seq;
for (auto arg : this->arguments_) {
if (!seq.count(arg)) {
auto seq_num = seq.size() + seq_cnt_;
if (arg->name_ == "") {
arg->name_ = "arg_" + std::to_string(seq_num);
seq.insert({arg, seq_num});
}
}
}
for (auto bb : basic_blocks_) {
if (!seq.count(bb)) {
auto seq_num = seq.size() + seq_cnt_;
if (bb->name_.length() <= 6 || bb->name_.substr(0, 6) != "label_") {
bb->name_ = "label_" + std::to_string(seq_num);
seq.insert({bb, seq_num});
}
}
for (auto instr : bb->instr_list_) {
if (instr->type_->tid_ != Type::VoidTyID && !seq.count(instr)) {
auto seq_num = seq.size() + seq_cnt_;
if (instr->name_ == "") {
instr->name_ = "v" + std::to_string(seq_num);
seq.insert({instr, seq_num});
}
}
}
}
seq_cnt_ += seq.size();
}

@ -1,973 +0,0 @@
#pragma once
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <iostream>
#include <list>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
class Type;
class IntegerType;
class ArrayType;
class PointerType;
class FunctionType;
class Value;
class Constant;
class ConstantInt;
class ConstantFloat;
class ConstantArray;
class ConstantZero;
class Module;
class GlobalVariable;
class Function;
class BasicBlock;
class Argument;
class Instruction;
class BinaryInst;
class UnaryInst;
class ICmpInst;
class FCmpInst;
class CallInst;
class BranchInst;
class ReturnInst;
class GetElementPtrInst;
class StoreInst;
class LoadInst;
class AllocaInst;
struct Use {
Value *val_;
unsigned int arg_no_; // 操作数的序号如func(a,b)中a的序号为0b的序号为1
Use(Value *val, unsigned int no) : val_(val), arg_no_(no) {}
};
//-----------------------------------------------Type-----------------------------------------------
class Type {
public:
enum TypeID {
VoidTyID, // Void
LabelTyID, // Labels, e.g., BasicBlock
IntegerTyID, // Integers, include 32 bits and 1 bit
FloatTyID, // Floats, only 32 bits
FunctionTyID, // Functions
ArrayTyID, // Arrays
PointerTyID, // Pointer
};
explicit Type(TypeID tid) : tid_(tid) {}
~Type() = default;
virtual std::string print();
TypeID tid_;
};
class IntegerType : public Type {
public:
explicit IntegerType(unsigned num_bits)
: Type(Type::IntegerTyID), num_bits_(num_bits) {}
unsigned num_bits_;
};
//[2 x [3 x i32]]: num_elements_ = 2, contained_ = [3 x i32]
class ArrayType : public Type {
public:
ArrayType(Type *contained, unsigned num_elements)
: Type(Type::ArrayTyID), num_elements_(num_elements),
contained_(contained) {}
Type *contained_; // The element type of the array.
unsigned num_elements_; // Number of elements in the array.
};
//[2 x [3 x i32]]*
class PointerType : public Type {
public:
PointerType(Type *contained)
: Type(Type::PointerTyID), contained_(contained) {}
Type *contained_; // The element type of the ptr.
};
// declare i32 @putarray(i32, i32*)
class FunctionType : public Type {
public:
FunctionType(Type *result, std::vector<Type *> params)
: Type(Type::FunctionTyID) {
result_ = result;
for (Type *p : params) {
args_.push_back(p);
}
}
Type *result_;
std::vector<Type *> args_;
};
//-----------------------------------------------Value-----------------------------------------------
class Value {
public:
explicit Value(Type *ty, const std::string &name = "")
: type_(ty), name_(name) {}
~Value() = default;
virtual std::string print() = 0;
void remove_use(Value *val) {
auto is_val = [val](const Use &use) { return use.val_ == val; };
use_list_.remove_if(is_val);
}
//******************************************************************
std::list<Use>::iterator add_use(Value *val, unsigned arg_no) {
use_list_.emplace_back(Use(val, arg_no));
std::list<Use>::iterator re = use_list_.end();
return --re;
}
// 删除迭代器指出的use
void remove_use(std::list<Use>::iterator it) { use_list_.erase(it); }
// user的第i个操作数准备不再使用this因此删除this与user相关的use联系
bool remove_used(Instruction *user, unsigned int i);
// Return if the value is a constant.
bool is_constant();
//******************************************************************
void replace_all_use_with(Value *new_val);
Type *type_;
std::string name_;
std::list<Use>
use_list_; // 所有引用该Value的Instruction的集合以及该Value在该Instruction的第几个操作数位置被引用
};
//-----------------------------------------------Constant-----------------------------------------------
// 常量都是无名的(name=="")
class Constant : public Value {
public:
Constant(Type *ty, const std::string &name = "") : Value(ty, name) {}
~Constant() = default;
};
// i32 -23
class ConstantInt : public Constant {
public:
ConstantInt(Type *ty, int val) : Constant(ty, ""), value_(val) {}
virtual std::string print() override;
int value_;
};
// float 0x4057C21FC0000000
// float -3.300000e+04
class ConstantFloat : public Constant {
public:
ConstantFloat(Type *ty, float val) : Constant(ty, ""), value_(val) {}
virtual std::string print() override;
float value_;
std::string print32();
};
//[3 x i32] [i32 42, i32 11, i32 74]
class ConstantArray : public Constant {
public:
ConstantArray(ArrayType *ty, const std::vector<Constant *> &val)
: Constant(ty, "") {
this->const_array.assign(val.begin(), val.end());
}
~ConstantArray() = default;
virtual std::string print() override;
std::vector<Constant *> const_array;
};
// i32 zeroinitializer
//[2 x [100 x float]] zeroinitializer
// 注意zeroinitializer是有类型的
class ConstantZero : public Constant {
public:
ConstantZero(Type *ty) : Constant(ty, "") {}
virtual std::string print() override;
};
//-----------------------------------------------Module-----------------------------------------------
class Module {
public:
explicit Module() {
void_ty_ = new Type(Type::VoidTyID);
label_ty_ = new Type(Type::LabelTyID);
int1_ty_ = new IntegerType(1);
int32_ty_ = new IntegerType(32);
float32_ty_ = new Type(Type::FloatTyID);
}
~Module() {
delete void_ty_;
delete label_ty_;
delete int1_ty_;
delete int32_ty_;
delete float32_ty_;
}
virtual std::string print();
void add_global_variable(GlobalVariable *g) { global_list_.push_back(g); }
void add_function(Function *f) { function_list_.push_back(f); }
PointerType *get_pointer_type(Type *contained) {
if (!pointer_map_.count(contained)) {
pointer_map_[contained] = new PointerType(contained);
}
return pointer_map_[contained];
}
ArrayType *get_array_type(Type *contained, unsigned num_elements) {
if (!array_map_.count({contained, num_elements})) {
array_map_[{contained, num_elements}] =
new ArrayType(contained, num_elements);
}
return array_map_[{contained, num_elements}];
}
Function *getMainFunc();
std::vector<GlobalVariable *> global_list_;
std::vector<Function *> function_list_;
IntegerType *int1_ty_;
IntegerType *int32_ty_;
Type *float32_ty_;
Type *label_ty_;
Type *void_ty_;
std::map<Type *, PointerType *> pointer_map_;
std::map<std::pair<Type *, int>, ArrayType *> array_map_;
};
//-----------------------------------------------GlobalVariable-----------------------------------------------
//@c = global [4 x i32] [i32 6, i32 7, i32 8, i32 9]
//@a = constant [5 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4]
class GlobalVariable : public Value {
public:
GlobalVariable(std::string name, Module *m, Type *ty, bool is_const,
Constant *init = nullptr)
: Value(m->get_pointer_type(ty), name), is_const_(is_const),
init_val_(init) {
m->add_global_variable(this);
}
virtual std::string print() override;
bool is_const_;
Constant *init_val_;
};
//-----------------------------------------------Function-----------------------------------------------
// 注Argument的构造函数只由Function的构造函数调用不单独调用
class Argument : public Value {
public:
explicit Argument(Type *ty, const std::string &name = "",
Function *f = nullptr, unsigned arg_no = 0)
: Value(ty, name), parent_(f), arg_no_(arg_no) {}
~Argument() {}
virtual std::string print() override;
Function *parent_;
unsigned arg_no_; // argument No.
};
class Function : public Value {
public:
Function(FunctionType *ty, const std::string &name, Module *parent)
: Value(ty, name), parent_(parent), seq_cnt_(0) {
parent->add_function(this);
size_t num_args = ty->args_.size();
use_ret_cnt = 0;
for (size_t i = 0; i < num_args; i++) {
arguments_.push_back(new Argument(ty->args_[i], "", this, i));
}
}
~Function();
virtual std::string print() override;
void add_basic_block(BasicBlock *bb) { basic_blocks_.push_back(bb); }
Type *get_return_type() const {
return static_cast<FunctionType *>(type_)->result_;
}
bool is_declaration() { return basic_blocks_.empty(); }
void set_instr_name();
void remove_bb(BasicBlock *bb);
BasicBlock *getRetBB();
std::vector<BasicBlock *> basic_blocks_; // basic blocks
std::vector<Argument *> arguments_; // argument
Module *parent_;
unsigned seq_cnt_;
std::vector<std::set<Value *>> vreg_set_;
int use_ret_cnt; // 程序中真正使用返回值的次数
};
//-----------------------------------------------BasicBlock-----------------------------------------------
// 注BasicBlock一定是LabelTyID
class BasicBlock : public Value {
public:
explicit BasicBlock(Module *m, const std::string &name, Function *parent)
: Value(m->label_ty_, name), parent_(parent) {
parent_->add_basic_block(this);
}
bool add_instruction(Instruction *instr); // 尾部插入指令,返回成功与否
bool add_instruction_front(Instruction *instr); // 头部插入指令,返回成功与否
bool add_instruction_before_terminator(
Instruction *instr); // 插入到BB倒数第二条指令即br前
bool add_instruction_before_inst(
Instruction *new_inst,
Instruction *
inst); // 将新指令插入到原来指令前返回成功与否需要保证原指令在bb内
void add_pre_basic_block(BasicBlock *bb) { pre_bbs_.push_back(bb); }
void add_succ_basic_block(BasicBlock *bb) { succ_bbs_.push_back(bb); }
void remove_pre_basic_block(BasicBlock *bb) {
// pre_bbs_.remove(bb);
pre_bbs_.erase(std::remove(pre_bbs_.begin(), pre_bbs_.end(), bb),
pre_bbs_.end());
}
void remove_succ_basic_block(BasicBlock *bb) {
// succ_bbs_.remove(bb);
succ_bbs_.erase(std::remove(succ_bbs_.begin(), succ_bbs_.end(), bb),
succ_bbs_.end());
}
int isDominate(
BasicBlock
*bb2) { // 返回1表示支配bb2返回0表示不支配返回-1输入的块出错
if (!bb2 || this->parent_ != bb2->parent_)
return -1;
while (bb2->name_ != "label_entry") {
if (bb2->idom_ == this)
return 1;
bb2 = bb2->idom_;
}
return 0;
}
// Returns the terminator instruction if the block is well formed or null
// if the block is not well formed.
Instruction *get_terminator();
bool delete_instr(
Instruction *instr); // 返回false则说明指令不能重复删除或者不属于这个bb
bool remove_instr(
Instruction *
instr); // 从bb移出一个指令但是不删指令的use关系因为还要插入其他bb
virtual std::string print() override;
//********************使用list替换vector---------
std::list<Instruction *> instr_list_;
//********************使用list替换vector---------
Function *parent_;
/****************api about cfg****************/
std::vector<BasicBlock *> pre_bbs_;
std::vector<BasicBlock *> succ_bbs_;
/****************api about dominate tree****************/
std::set<BasicBlock *> dom_frontier_;
std::set<BasicBlock *> rdom_frontier_;
std::set<BasicBlock *> rdoms_;
BasicBlock *idom_;
std::set<Value *> live_in;
std::set<Value *> live_out;
};
//-----------------------------------------------Instruction-----------------------------------------------
class Instruction : public Value {
public:
enum OpID {
// Terminator Instructions
Ret = 11,
Br,
// Standard unary operators
FNeg,
// Standard binary operators
Add,
Sub,
Mul,
SDiv,
SRem,
UDiv,
URem,
// Float binary opeartors
FAdd,
FSub,
FMul,
FDiv,
// Logical operators
Shl,
LShr,
AShr,
And,
Or,
Xor,
// Memory operators
Alloca,
Load,
Store,
GetElementPtr,
// Cast operators
ZExt,
FPtoSI,
SItoFP,
BitCast,
// Other operators
ICmp,
FCmp,
PHI,
Call,
};
// 创建指令并插入基本块ty是指令返回值类型
// If before set to true, then use add_instruction_front() instead of
// add_instruction()
Instruction(Type *ty, OpID id, unsigned num_ops, BasicBlock *parent,
bool before = false)
: Value(ty, ""), op_id_(id), num_ops_(num_ops), parent_(parent) {
operands_.resize(
num_ops_,
nullptr); // 此句不能删去否则operands_为空时无法用set_operand设置操作数而只能用push_back设置操作数
use_pos_.resize(num_ops_);
if (!before)
parent_->add_instruction(this);
else
parent_->add_instruction_front(this);
}
// 仅创建指令不插入基本块ty是指令返回值类型
Instruction(Type *ty, OpID id, unsigned num_ops)
: Value(ty, ""), op_id_(id), num_ops_(num_ops), parent_(nullptr) {
operands_.resize(num_ops_, nullptr);
use_pos_.resize(num_ops_);
}
Value *get_operand(unsigned i) const { return operands_[i]; }
//***************************
void set_operand(unsigned i, Value *v) {
operands_[i] = v;
use_pos_[i] = v->add_use(this, i);
}
void add_operand(Value *v) { // 添加指令操作数用于phi指令
operands_.push_back(v);
use_pos_.emplace_back(v->add_use(this, num_ops_));
num_ops_++;
}
void
remove_use_of_ops() { // 删除此指令所有操作数的uselist中与此指令相关的use
for (int i = 0; i < operands_.size(); i++) {
operands_[i]->remove_use(use_pos_[i]);
}
}
// 删除phi指令中的一对操作数
void remove_operands(int index1, int index2) {
for (int i = index1; i <= index2; i++) {
operands_[i]->remove_use(use_pos_[i]);
}
// 后面操作数的位置要做相应修改
for (int i = index2 + 1; i < operands_.size(); i++) {
for (auto &use : operands_[i]->use_list_) {
if (use.val_ == this) {
use.arg_no_ -= index2 - index1 + 1;
break;
}
}
}
operands_.erase(operands_.begin() + index1, operands_.begin() + index2 + 1);
use_pos_.erase(use_pos_.begin() + index1, use_pos_.begin() + index2 + 1);
// std::cout<<operands_.size()<<std::endl;
num_ops_ = operands_.size();
}
// ↓↓↓↓↓↓↓↓--------增加快速类型判断
bool is_void() {
return ((op_id_ == Ret) || (op_id_ == Br) || (op_id_ == Store) ||
(op_id_ == Call && this->type_->tid_ == Type::VoidTyID));
}
bool is_phi() { return op_id_ == PHI; }
bool is_store() { return op_id_ == Store; }
bool is_alloca() { return op_id_ == Alloca; }
bool is_ret() { return op_id_ == Ret; }
bool is_load() { return op_id_ == Load; }
bool is_br() { return op_id_ == Br; }
bool is_add() { return op_id_ == Add; }
bool is_sub() { return op_id_ == Sub; }
bool is_mul() { return op_id_ == Mul; }
bool is_div() { return op_id_ == SDiv; }
bool is_rem() { return op_id_ == SRem; }
bool is_fadd() { return op_id_ == FAdd; }
bool is_fsub() { return op_id_ == FSub; }
bool is_fmul() { return op_id_ == FMul; }
bool is_fdiv() { return op_id_ == FDiv; }
bool is_cmp() { return op_id_ == ICmp; }
bool is_fcmp() { return op_id_ == FCmp; }
bool is_call() { return op_id_ == Call; }
bool is_gep() { return op_id_ == GetElementPtr; }
bool is_zext() { return op_id_ == ZExt; }
bool is_fptosi() { return op_id_ == FPtoSI; }
bool is_sitofp() { return op_id_ == SItoFP; }
bool is_int_binary() {
return (is_add() || is_sub() || is_mul() || is_div() || is_rem()) &&
(num_ops_ == 2);
}
bool is_float_binary() {
return (is_fadd() || is_fsub() || is_fmul() || is_fdiv()) &&
(num_ops_ == 2);
}
bool is_binary() { return is_int_binary() || is_float_binary(); }
bool isTerminator() { return is_br() || is_ret(); }
// ↑↑↑↑↑↑↑↑--------增加快速类型判断-
virtual std::string print() = 0;
BasicBlock *parent_;
OpID op_id_;
unsigned num_ops_;
std::vector<Value *> operands_; // operands of this value
std::vector<std::list<Use>::iterator>
use_pos_; // 与操作数数组一一对应是对应的操作数的uselist里面与当前指令相关的use的迭代器
std::vector<std::list<Instruction *>::iterator>
pos_in_bb; // 在bb的指令list的位置迭代器,最多只能有一个
};
//%77 = add i32 %74, %76
//%10 = and i1 %7, %9
//%7 = xor i1 %6, true
//%13 = fmul float %12, 0x400921FB60000000
class BinaryInst : public Instruction {
public:
BinaryInst(Type *ty, OpID op, Value *v1, Value *v2, BasicBlock *bb)
: Instruction(ty, op, 2, bb) {
set_operand(0, v1);
set_operand(1, v2);
}
// 只创建,不加入基本块末尾
BinaryInst(Type *ty, OpID op, Value *v1, Value *v2, BasicBlock *bb, bool flag)
: Instruction(ty, op, 2) {
set_operand(0, v1);
set_operand(1, v2);
this->parent_ = bb;
}
virtual std::string print() override;
};
//%8 = zext i1 %7 to i32
//%51 = fptosi float %50 to i32
//%4 = sitofp i32 %3 to float
//%8 = fneg float %7
//%3 = bitcast [4 x [2 x i32]]* %2 to i32*
class UnaryInst : public Instruction {
public:
UnaryInst(Type *ty, OpID op, Value *val, BasicBlock *bb)
: Instruction(ty, op, 1, bb) {
set_operand(0, val);
}
virtual std::string print() override;
};
//%18 = icmp ne i32 %12, %17
class ICmpInst : public Instruction {
public:
enum ICmpOp {
ICMP_EQ = 32, ///< equal
ICMP_NE = 33, ///< not equal
ICMP_UGT = 34, ///< unsigned greater than
ICMP_UGE = 35, ///< unsigned greater or equal
ICMP_ULT = 36, ///< unsigned less than
ICMP_ULE = 37, ///< unsigned less or equal
ICMP_SGT = 38, ///< signed greater than
ICMP_SGE = 39, ///< signed greater or equal
ICMP_SLT = 40, ///< signed less than
ICMP_SLE = 41 ///< signed less or equal
};
static const std::map<ICmpInst::ICmpOp, std::string> ICmpOpName;
ICmpInst(ICmpOp op, Value *v1, Value *v2, BasicBlock *bb)
: Instruction(bb->parent_->parent_->int1_ty_, Instruction::ICmp, 2, bb),
icmp_op_(op) {
set_operand(0, v1);
set_operand(1, v2);
}
virtual std::string print() override;
ICmpOp icmp_op_;
};
//%5 = fcmp olt float %4, 0.000000e+00
class FCmpInst : public Instruction {
public:
enum FCmpOp {
FCMP_FALSE = 10, // Always false (always folded)
FCMP_OEQ = 11, // True if ordered and equal
FCMP_OGT = 12, // True if ordered and greater than
FCMP_OGE = 13, // True if ordered and greater than or equal
FCMP_OLT = 14, // True if ordered and less than
FCMP_OLE = 15, // True if ordered and less than or equal
FCMP_ONE = 16, // True if ordered and operands are unequal
FCMP_ORD = 17, // True if ordered (no nans)
FCMP_UNO = 18, // True if unordered: isnan(X) | isnan(Y)
FCMP_UEQ = 19, // True if unordered or equal
FCMP_UGT = 20, // True if unordered or greater than
FCMP_UGE = 21, // True if unordered, greater than, or equal
FCMP_ULT = 22, // True if unordered or less than
FCMP_ULE = 23, // True if unordered, less than, or equal
FCMP_UNE = 24, // True if unordered or not equal
FCMP_TRUE = 25 // Always true (always folded)
};
static const std::map<FCmpInst::FCmpOp, std::string> FCmpOpName;
FCmpInst(FCmpOp op, Value *v1, Value *v2, BasicBlock *bb)
: Instruction(bb->parent_->parent_->int1_ty_, Instruction::FCmp, 2, bb),
fcmp_op_(op) {
set_operand(0, v1);
set_operand(1, v2);
}
virtual std::string print() override;
FCmpOp fcmp_op_;
};
//%111 = call i32 @QuickSort(i32* %108, i32 %109, i32 %110)
class CallInst : public Instruction {
public:
CallInst(Function *func, std::vector<Value *> args, BasicBlock *bb)
: Instruction(static_cast<FunctionType *>(func->type_)->result_,
Instruction::Call, args.size() + 1, bb) {
int num_ops = args.size() + 1;
for (int i = 0; i < num_ops - 1; i++) {
set_operand(i, args[i]);
}
set_operand(num_ops - 1, func);
}
virtual std::string print() override;
};
// 注br的返回值类型一定是VoidTyID
class BranchInst : public Instruction {
public:
// br i1 %7, label %8, label %9
BranchInst(Value *cond, BasicBlock *if_true, BasicBlock *if_false,
BasicBlock *bb)
: Instruction(if_true->parent_->parent_->void_ty_, Instruction::Br, 3,
bb) {
if_true->add_pre_basic_block(bb);
if_false->add_pre_basic_block(bb);
bb->add_succ_basic_block(if_false);
bb->add_succ_basic_block(if_true);
set_operand(0, cond);
set_operand(1, if_true);
set_operand(2, if_false);
}
// br label %31
BranchInst(BasicBlock *if_true, BasicBlock *bb)
: Instruction(if_true->parent_->parent_->void_ty_, Instruction::Br, 1,
bb) {
if_true->add_pre_basic_block(bb);
bb->add_succ_basic_block(if_true);
set_operand(0, if_true);
}
virtual std::string print() override;
};
// ret i32 %4
// ret void
// 注ret的返回值类型一定是VoidTyID
class ReturnInst : public Instruction {
public:
ReturnInst(Value *val, BasicBlock *bb)
: Instruction(bb->parent_->parent_->void_ty_, Instruction::Ret, 1, bb) {
set_operand(0, val);
}
ReturnInst(Value *val, BasicBlock *bb, bool flag)
: Instruction(bb->parent_->parent_->void_ty_, Instruction::Ret, 1) {
set_operand(0, val);
this->parent_ = bb;
}
ReturnInst(BasicBlock *bb)
: Instruction(bb->parent_->parent_->void_ty_, Instruction::Ret, 0, bb) {}
virtual std::string print() override;
};
//%1 = getelementptr [5 x [4 x i32]], [5 x [4 x i32]]* @a, i32 0, i32 2, i32 3
class GetElementPtrInst : public Instruction {
public:
GetElementPtrInst(Value *ptr, std::vector<Value *> idxs, BasicBlock *bb)
: Instruction(bb->parent_->parent_->get_pointer_type(
get_GEP_return_type(ptr, idxs.size())),
Instruction::GetElementPtr, idxs.size() + 1, bb) {
set_operand(0, ptr);
for (size_t i = 0; i < idxs.size(); i++) {
set_operand(i + 1, idxs[i]);
}
}
Type *get_GEP_return_type(Value *ptr, size_t idxs_size) {
Type *ty =
static_cast<PointerType *>(ptr->type_)->contained_; //[5 x [4 x i32]]
if (ty->tid_ == Type::ArrayTyID) {
ArrayType *arr_ty = static_cast<ArrayType *>(ty);
for (size_t i = 1; i < idxs_size; i++) {
ty = arr_ty->contained_; //[4 x i32], i32
if (ty->tid_ == Type::ArrayTyID) {
arr_ty = static_cast<ArrayType *>(ty);
}
}
}
return ty;
}
virtual std::string print() override;
};
// store <ty> <value>, <ty>* <pointer>
// store i32 %57, i32* %55
// 注store的返回值类型一定是VoidTyID
class StoreInst : public Instruction {
public:
StoreInst(Value *val, Value *ptr, BasicBlock *bb)
: Instruction(bb->parent_->parent_->void_ty_, Instruction::Store, 2, bb) {
assert(val->type_ == static_cast<PointerType *>(ptr->type_)->contained_);
set_operand(0, val);
set_operand(1, ptr);
}
// 创建store指令不插入到基本块中但是设定parent
StoreInst(Value *val, Value *ptr, BasicBlock *bb, bool)
: Instruction(bb->parent_->parent_->void_ty_, Instruction::Store, 2) {
assert(val->type_ == static_cast<PointerType *>(ptr->type_)->contained_);
set_operand(0, val);
set_operand(1, ptr);
this->parent_ = bb;
}
virtual std::string print() override;
};
//<result> = load <ty>, <ty>* <pointer>
//%60 = load i32, i32* %59
class LoadInst : public Instruction {
public:
LoadInst(Value *ptr, BasicBlock *bb)
: Instruction(static_cast<PointerType *>(ptr->type_)->contained_,
Instruction::Load, 1, bb) {
set_operand(0, ptr);
}
virtual std::string print() override;
};
//%8 = alloca i32
class AllocaInst : public Instruction {
public:
AllocaInst(Type *ty, BasicBlock *bb)
: Instruction(bb->parent_->parent_->get_pointer_type(ty),
Instruction::Alloca, 0, bb, true),
alloca_ty_(ty) {}
// 创建指令不插入到最后但是会设定parent
AllocaInst(Type *ty, BasicBlock *bb, bool)
: Instruction(bb->parent_->parent_->get_pointer_type(ty),
Instruction::Alloca, 0),
alloca_ty_(ty) {
this->parent_ = bb;
}
virtual std::string print() override;
Type *alloca_ty_;
};
class ZextInst : public Instruction {
public:
ZextInst(OpID op, Value *val, Type *ty, BasicBlock *bb)
: Instruction(ty, op, 1, bb), dest_ty_(ty) {
set_operand(0, val);
}
virtual std::string print() override;
Type *dest_ty_;
};
class FpToSiInst : public Instruction {
public:
FpToSiInst(OpID op, Value *val, Type *ty, BasicBlock *bb)
: Instruction(ty, op, 1, bb), dest_ty_(ty) {
set_operand(0, val);
}
virtual std::string print() override;
Type *dest_ty_;
};
class SiToFpInst : public Instruction {
public:
SiToFpInst(OpID op, Value *val, Type *ty, BasicBlock *bb)
: Instruction(ty, op, 1, bb), dest_ty_(ty) {
set_operand(0, val);
}
virtual std::string print() override;
Type *dest_ty_;
};
//%3 = bitcast [4 x [2 x i32]]* %2 to i32*
class Bitcast : public Instruction {
public:
Bitcast(OpID op, Value *val, Type *ty, BasicBlock *bb)
: Instruction(ty, op, 1, bb), dest_ty_(ty) {
set_operand(0, val);
}
virtual std::string print() override;
Type *dest_ty_;
};
//%4 = phi i32 [ 1, %2 ], [ %6, %5 ]
class PhiInst : public Instruction {
public:
PhiInst(OpID op, std::vector<Value *> vals, std::vector<BasicBlock *> val_bbs,
Type *ty, BasicBlock *bb)
: Instruction(ty, op, 2 * vals.size()) {
for (int i = 0; i < vals.size(); i++) {
set_operand(2 * i, vals[i]);
set_operand(2 * i + 1, val_bbs[i]);
}
this->parent_ = bb;
}
static PhiInst *create_phi(Type *ty, BasicBlock *bb) {
std::vector<Value *> vals;
std::vector<BasicBlock *> val_bbs;
return new PhiInst(Instruction::PHI, vals, val_bbs, ty, bb);
}
void add_phi_pair_operand(Value *val, Value *pre_bb) {
this->add_operand(val);
this->add_operand(pre_bb);
}
virtual std::string print() override;
Value *l_val_;
};
//-----------------------------------------------IRStmtBuilder-----------------------------------------------
class IRStmtBuilder {
public:
BasicBlock *BB_;
Module *m_;
IRStmtBuilder(BasicBlock *bb, Module *m) : BB_(bb), m_(m){};
~IRStmtBuilder() = default;
Module *get_module() { return m_; }
BasicBlock *get_insert_block() { return this->BB_; }
void set_insert_point(BasicBlock *bb) {
this->BB_ = bb;
} // 在某个基本块中插入指令
BinaryInst *create_iadd(Value *v1, Value *v2) {
return new BinaryInst(this->m_->int32_ty_, Instruction::Add, v1, v2,
this->BB_);
} // 创建加法指令(以及其他算术指令)
BinaryInst *create_isub(Value *v1, Value *v2) {
return new BinaryInst(this->m_->int32_ty_, Instruction::Sub, v1, v2,
this->BB_);
}
BinaryInst *create_imul(Value *v1, Value *v2) {
return new BinaryInst(this->m_->int32_ty_, Instruction::Mul, v1, v2,
this->BB_);
}
BinaryInst *create_isdiv(Value *v1, Value *v2) {
return new BinaryInst(this->m_->int32_ty_, Instruction::SDiv, v1, v2,
this->BB_);
}
BinaryInst *create_isrem(Value *v1, Value *v2) {
return new BinaryInst(this->m_->int32_ty_, Instruction::SRem, v1, v2,
this->BB_);
}
ICmpInst *create_icmp_eq(Value *v1, Value *v2) {
return new ICmpInst(ICmpInst::ICMP_EQ, v1, v2, this->BB_);
}
ICmpInst *create_icmp_ne(Value *v1, Value *v2) {
return new ICmpInst(ICmpInst::ICMP_NE, v1, v2, this->BB_);
}
ICmpInst *create_icmp_gt(Value *v1, Value *v2) {
return new ICmpInst(ICmpInst::ICMP_SGT, v1, v2, this->BB_);
}
ICmpInst *create_icmp_ge(Value *v1, Value *v2) {
return new ICmpInst(ICmpInst::ICMP_SGE, v1, v2, this->BB_);
}
ICmpInst *create_icmp_lt(Value *v1, Value *v2) {
return new ICmpInst(ICmpInst::ICMP_SLT, v1, v2, this->BB_);
}
ICmpInst *create_icmp_le(Value *v1, Value *v2) {
return new ICmpInst(ICmpInst::ICMP_SLE, v1, v2, this->BB_);
}
BinaryInst *create_fadd(Value *v1, Value *v2) {
return new BinaryInst(this->m_->float32_ty_, Instruction::FAdd, v1, v2,
this->BB_);
}
BinaryInst *create_fsub(Value *v1, Value *v2) {
return new BinaryInst(this->m_->float32_ty_, Instruction::FSub, v1, v2,
this->BB_);
}
BinaryInst *create_fmul(Value *v1, Value *v2) {
return new BinaryInst(this->m_->float32_ty_, Instruction::FMul, v1, v2,
this->BB_);
}
BinaryInst *create_fdiv(Value *v1, Value *v2) {
return new BinaryInst(this->m_->float32_ty_, Instruction::FDiv, v1, v2,
this->BB_);
}
FCmpInst *create_fcmp_eq(Value *v1, Value *v2) {
return new FCmpInst(FCmpInst::FCMP_UEQ, v1, v2, this->BB_);
}
FCmpInst *create_fcmp_ne(Value *v1, Value *v2) {
return new FCmpInst(FCmpInst::FCMP_UNE, v1, v2, this->BB_);
}
FCmpInst *create_fcmp_gt(Value *v1, Value *v2) {
return new FCmpInst(FCmpInst::FCMP_UGT, v1, v2, this->BB_);
}
FCmpInst *create_fcmp_ge(Value *v1, Value *v2) {
return new FCmpInst(FCmpInst::FCMP_UGE, v1, v2, this->BB_);
}
FCmpInst *create_fcmp_lt(Value *v1, Value *v2) {
return new FCmpInst(FCmpInst::FCMP_ULT, v1, v2, this->BB_);
}
FCmpInst *create_fcmp_le(Value *v1, Value *v2) {
return new FCmpInst(FCmpInst::FCMP_ULE, v1, v2, this->BB_);
}
CallInst *create_call(Value *func, std::vector<Value *> args) {
#ifdef DEBUG
assert(dynamic_cast<Function *>(func) && "func must be Function * type");
#endif
return new CallInst(static_cast<Function *>(func), args, this->BB_);
}
BranchInst *create_br(BasicBlock *if_true) {
return new BranchInst(if_true, this->BB_);
}
BranchInst *create_cond_br(Value *cond, BasicBlock *if_true,
BasicBlock *if_false) {
return new BranchInst(cond, if_true, if_false, this->BB_);
}
ReturnInst *create_ret(Value *val) { return new ReturnInst(val, this->BB_); }
ReturnInst *create_void_ret() { return new ReturnInst(this->BB_); }
GetElementPtrInst *create_gep(Value *ptr, std::vector<Value *> idxs) {
return new GetElementPtrInst(ptr, idxs, this->BB_);
}
StoreInst *create_store(Value *val, Value *ptr) {
return new StoreInst(val, ptr, this->BB_);
}
LoadInst *create_load(Type *ty, Value *ptr) {
return new LoadInst(ptr, this->BB_);
}
LoadInst *create_load(Value *ptr) {
#ifdef DEBUG
assert(ptr->get_type()->is_pointer_type() && "ptr must be pointer type");
#endif
// return LoadInst::create_load(ptr->get_type()->get_pointer_element_type(),
// ptr, this->BB_);
return new LoadInst(ptr, this->BB_);
}
AllocaInst *create_alloca(Type *ty) { return new AllocaInst(ty, this->BB_); }
ZextInst *create_zext(Value *val, Type *ty) {
return new ZextInst(Instruction::ZExt, val, ty, this->BB_);
}
FpToSiInst *create_fptosi(Value *val, Type *ty) {
return new FpToSiInst(Instruction::FPtoSI, val, ty, this->BB_);
}
SiToFpInst *create_sitofp(Value *val, Type *ty) {
return new SiToFpInst(Instruction::SItoFP, val, ty, this->BB_);
}
Bitcast *create_bitcast(Value *val, Type *ty) {
return new Bitcast(Instruction::BitCast, val, ty, this->BB_);
}
};

@ -1,111 +0,0 @@
#include "CombineInstr.h"
#include "ConstSpread.h"
#include "LoopInvariant.h"
#include "SimplifyJump.h"
#include "ast.h"
#include "lirstmtbuilder.h"
#include "define.h"
#include "genIR.h"
#include "DeleteDeadCode.h"
#include "opt.h"
#include <fstream>
#include <iostream>
#include <ostream>
#include <unistd.h>
extern unique_ptr<CompUnitAST> root;
extern int yyparse();
extern FILE *yyin;
int main(int argc, char **argv) {
// Assert the number of arguments
assert(argc >= 2);
// TODO: advanced argument parser
char *filename = nullptr;
int print_ir = false;
int print_asm = false;
std::string output = "-";
int opt;
bool isO2 = false;
while ((opt = getopt(argc, argv, "Sco:O::")) != -1) {
switch (opt) {
case 'S':
print_asm = true;
print_ir = false;
break;
case 'c':
print_ir = true;
print_asm = false;
break;
case 'o':
output = optarg;
break;
case 'O':
isO2 = true;
break;
default:
break;
}
}
filename = argv[optind];
yyin = fopen(filename, "r");
if (yyin == nullptr) {
std::cout << "yyin open" << filename << "failed" << std::endl;
return -1;
}
// Frontend parser
yyparse();
// Generate IR from AST
GenIR genIR;
root->accept(genIR);
std::unique_ptr<Module> m = genIR.getModule();
// Run IR optimization
// TODO
if (isO2) {
std::vector<Optimization *> Opt;
Opt.push_back(new DeadCodeDeletion(m.get()));
Opt.push_back(new ConstSpread(m.get()));
Opt.push_back(new CombineInstr(m.get()));
Opt.push_back(new DomainTree(m.get()));
Opt.push_back(new SimplifyJump(m.get()));
Opt.push_back(new LoopInvariant(m.get()));
Opt.push_back(new SimplifyJump(m.get()));
for (auto x : Opt)
x->execute();
}
// Open output file
std::ofstream fout;
std::ostream *out;
if (output == "-") {
out = &std::cout;
} else {
fout.open(output);
out = &fout;
}
// Print IR result
const std::string IR = m->print();
if (print_ir) {
*out << IR << std::endl;
}
// Generate assembly file
// TODO
if (print_asm) {
LIRStmtBuilder* lirbuilder;
lirbuilder = new LIRStmtBuilder(m.get(), false, isO2);
lirbuilder->build_lir();
lirbuilder->build_asm();
std::string ASM = lirbuilder->lirm_->print();
*out << ASM << std::endl;
}
return 0;
}

@ -1,54 +0,0 @@
#include "BasicOperation.h"
void deleteUse(Value *opnd, Instruction *inst) {
for (auto it = opnd->use_list_.begin(); it != opnd->use_list_.end(); ++it)
if (it->val_ == inst) {
opnd->use_list_.erase(it);
return;
}
}
void SolvePhi(BasicBlock *bb, BasicBlock *suc) {
std::vector<Instruction *> uselessPhi;
for (auto instr : suc->instr_list_) {
if (instr->op_id_ == Instruction::PHI) {
for (int i = 1; i < instr->num_ops_; i = i + 2)
if (instr->get_operand(i) == bb) {
instr->remove_operands(i - 1, i);
break;
}
if (instr->parent_->pre_bbs_.size() == 1) {
Value *only = instr->get_operand(0);
instr->replace_all_use_with(only);
uselessPhi.push_back(instr);
}
}
}
for (auto instr : uselessPhi)
suc->delete_instr(instr);
}
void dfsGraph(BasicBlock *bb, std::set<BasicBlock *> &vis) {
if (!bb)
return;
vis.insert(bb);
for (auto suc : bb->succ_bbs_) {
if (vis.find(suc) == vis.end())
dfsGraph(suc, vis);
}
}
void DeleteUnusedBB(Function *func) {
std::set<BasicBlock *> vis;
for (auto bb : func->basic_blocks_)
if (bb->name_ == "label_entry") {
dfsGraph(bb, vis);
break;
}
for (auto bb : func->basic_blocks_)
if (vis.find(bb) == vis.end()) {
bb->parent_->remove_bb(bb);
for (auto suc : bb->succ_bbs_)
SolvePhi(bb, suc);
}
}

@ -1,15 +0,0 @@
#ifndef BASICOPERATION
#define BASICOPERATION
#include "../ir/ir.h"
#include <vector>
#include <map>
#include <set>
#include <stack>
#include "opt.h"
void deleteUse(Value* opnd,Instruction *inst);
void dfsGraph(BasicBlock *bb, std::set<BasicBlock *> &vis);
void SolvePhi(BasicBlock *bb, BasicBlock *succ_bb);
void DeleteUnusedBB(Function *func);
#endif // !BASICOPERATION

@ -1,6 +0,0 @@
set(SOURCE_FILES ConstSpread.cpp BasicOperation.cpp LoopInvariant.cpp CombineInstr.cpp SimplifyJump.cpp opt.cpp DeleteDeadCode.cpp)
add_library(opt ${SOURCE_FILES})
target_link_libraries(opt PRIVATE ir)
target_include_directories(opt PRIVATE ${CMAKE_SOURCE_DIR}/src/ir)

@ -1,95 +0,0 @@
#include "CombineInstr.h"
#include <unordered_map>
void CombineInstr::execute() {
for (auto foo : m->function_list_)
if (!foo->basic_blocks_.empty())
for (BasicBlock *bb : foo->basic_blocks_)
checkBlock(bb);
}
void CombineInstr::checkBlock(BasicBlock *bb) {
bool change = true;
while (change) {
change = false;
for (auto instr : bb->instr_list_) {
if (instr->op_id_ != Instruction::Add &&
instr->op_id_ != Instruction::Sub)
continue;
if (instr->use_list_.size() != 1 || instr->use_list_.back().arg_no_ != 0)
continue;
Instruction *nextInstr =
dynamic_cast<Instruction *>(instr->use_list_.back().val_);
if (nextInstr == nullptr || instr->op_id_ != nextInstr->op_id_ ||
instr->parent_ != nextInstr->parent_)
continue;
std::unordered_map<Value *, unsigned int> Optime;
Instruction *StartInstr = instr, *EndInstr = nullptr;
Instruction *invalidStart = nullptr, *invalidEnd = nullptr; // 无效指令
bool isRepeat = false;
Value *dupOp = nullptr, *Candi0 = instr->get_operand(0),
*Candi1 = instr->get_operand(1);
Optime[Candi0]++;
Optime[Candi1]++;
Optime[nextInstr->get_operand(1)]++;
// 迭代过程
instr = nextInstr;
while (instr->use_list_.size() == 1 &&
instr->use_list_.back().arg_no_ == 0) {
nextInstr = dynamic_cast<Instruction *>(instr->use_list_.back().val_);
if (nextInstr == nullptr || instr->op_id_ != nextInstr->op_id_ ||
instr->parent_ != nextInstr->parent_)
break;
if (!isRepeat) {
if (Optime.find(nextInstr->get_operand(1)) != Optime.end())
isRepeat = true;
EndInstr = instr;
invalidStart = nextInstr;
} else if (Optime.find(nextInstr->get_operand(1)) == Optime.end())
break;
Optime[nextInstr->get_operand(1)]++;
instr = nextInstr;
}
invalidEnd = instr;
// 尝试合并1相同很多00相同很多1都可以合并
unsigned int dupTime = 0;
if (Optime[Candi1] == 1 && Optime[Candi0] > 1) {
dupOp = Candi0;
dupTime = Optime[Candi0];
} else if (Optime[Candi0] == 1 && Optime[Candi1] > 1) {
dupOp = Candi1;
dupTime = Optime[Candi1];
} else
continue;
for (auto p : Optime) {
if (p.second == 1) {
if (p.first != dupOp) {
dupTime = 0;
break;
}
} else {
if (dupTime != p.second) {
dupTime = 0;
break;
}
}
}
if (!dupTime)
continue;
ConstantInt *dupTimeConst =
new ConstantInt(instr->parent_->parent_->parent_->int32_ty_, dupTime);
Instruction *toMulInst = new BinaryInst(
bb->parent_->parent_->int32_ty_, Instruction::Mul,
static_cast<Value *>(EndInstr), dupTimeConst, bb, true);
toMulInst->name_ = invalidStart->name_;
bb->add_instruction_before_inst(toMulInst, invalidStart);
invalidEnd->replace_all_use_with(toMulInst);
for (Instruction *ins = invalidStart; ins != nextInstr;) {
bb->delete_instr(ins);
ins = dynamic_cast<Instruction *>(ins->use_list_.back().val_);
}
change = true;
break;
}
}
}

@ -1,13 +0,0 @@
#ifndef COMBINEINSTRH
#define COMBINEINSTRH
#include "opt.h"
class CombineInstr : public Optimization {
public:
CombineInstr(Module *m) : Optimization(m) {}
void execute();
void checkBlock(BasicBlock *bb);
};
#endif // !COMBINEINSTRH

@ -1,354 +0,0 @@
#include "ConstSpread.h"
ConstantInt *ConstSpread::CalcInt(Instruction::OpID op, ConstantInt *v1,
ConstantInt *v2) {
int a = v1->value_, b = v2->value_;
switch (op) {
case Instruction::Add:
return new ConstantInt(m->int32_ty_, a + b);
case Instruction::Sub:
return new ConstantInt(m->int32_ty_, a - b);
case Instruction::Mul:
return new ConstantInt(m->int32_ty_, a * b);
case Instruction::SDiv:
return new ConstantInt(m->int32_ty_, a / b);
case Instruction::SRem:
return new ConstantInt(m->int32_ty_, a % b);
case Instruction::Shl:
return new ConstantInt(m->int32_ty_, a << b);
case Instruction::LShr:
return new ConstantInt(m->int32_ty_, (unsigned)a >> b);
case Instruction::AShr:
return new ConstantInt(m->int32_ty_, a >> b);
case Instruction::And:
return new ConstantInt(m->int32_ty_, a & b);
case Instruction::Or:
return new ConstantInt(m->int32_ty_, a | b);
case Instruction::Xor:
return new ConstantInt(m->int32_ty_, a ^ b);
default:
return nullptr;
}
}
ConstantFloat *ConstSpread::CalcFloat(Instruction::OpID op, ConstantFloat *v1,
ConstantFloat *v2) {
float a = v1->value_, b = v2->value_;
switch (op) {
case Instruction::FAdd:
return new ConstantFloat(m->float32_ty_, a + b);
case Instruction::FSub:
return new ConstantFloat(m->float32_ty_, a - b);
case Instruction::FMul:
return new ConstantFloat(m->float32_ty_, a * b);
case Instruction::FDiv:
return new ConstantFloat(m->float32_ty_, a / b);
default:
return nullptr;
}
}
ConstantInt *ConstSpread::CalcICMP(ICmpInst::ICmpOp op, ConstantInt *v1,
ConstantInt *v2) {
int lhs = v1->value_;
int rhs = v2->value_;
switch (op) {
case ICmpInst::ICMP_EQ:
return new ConstantInt(m->int1_ty_, lhs == rhs);
case ICmpInst::ICMP_NE:
return new ConstantInt(m->int1_ty_, lhs != rhs);
case ICmpInst::ICMP_SGT:
return new ConstantInt(m->int1_ty_, lhs > rhs);
case ICmpInst::ICMP_SGE:
return new ConstantInt(m->int1_ty_, lhs >= rhs);
case ICmpInst::ICMP_SLE:
return new ConstantInt(m->int1_ty_, lhs <= rhs);
case ICmpInst::ICMP_SLT:
return new ConstantInt(m->int1_ty_, lhs < rhs);
case ICmpInst::ICMP_UGE:
return new ConstantInt(m->int1_ty_, (unsigned)lhs >= (unsigned)rhs);
case ICmpInst::ICMP_ULE:
return new ConstantInt(m->int1_ty_, (unsigned)lhs <= (unsigned)rhs);
case ICmpInst::ICMP_ULT:
return new ConstantInt(m->int1_ty_, (unsigned)lhs < (unsigned)rhs);
case ICmpInst::ICMP_UGT:
return new ConstantInt(m->int1_ty_, (unsigned)lhs > (unsigned)rhs);
default:
return nullptr;
}
}
ConstantInt *ConstSpread::CalcFCMP(FCmpInst::FCmpOp op, ConstantFloat *v1,
ConstantFloat *v2) {
float lhs = v1->value_;
float rhs = v2->value_;
switch (op) {
case FCmpInst::FCMP_UEQ:
return new ConstantInt(m->int1_ty_, lhs == rhs);
case FCmpInst::FCMP_UNE:
return new ConstantInt(m->int1_ty_, lhs != rhs);
case FCmpInst::FCMP_UGT:
return new ConstantInt(m->int1_ty_, lhs > rhs);
case FCmpInst::FCMP_UGE:
return new ConstantInt(m->int1_ty_, lhs >= rhs);
case FCmpInst::FCMP_ULE:
return new ConstantInt(m->int1_ty_, lhs <= rhs);
case FCmpInst::FCMP_ULT:
return new ConstantInt(m->int1_ty_, lhs < rhs);
case FCmpInst::FCMP_FALSE:
return new ConstantInt(m->int1_ty_, 0);
case FCmpInst::FCMP_TRUE:
return new ConstantInt(m->int1_ty_, 1);
case FCmpInst::FCMP_OEQ:
return new ConstantInt(m->int1_ty_, lhs == rhs);
case FCmpInst::FCMP_ONE:
return new ConstantInt(m->int1_ty_, lhs != rhs);
case FCmpInst::FCMP_OGE:
return new ConstantInt(m->int1_ty_, lhs >= rhs);
case FCmpInst::FCMP_OGT:
return new ConstantInt(m->int1_ty_, lhs > rhs);
case FCmpInst::FCMP_OLE:
return new ConstantInt(m->int1_ty_, lhs <= rhs);
case FCmpInst::FCMP_OLT:
return new ConstantInt(m->int1_ty_, lhs < rhs);
default:
return nullptr;
}
}
void ConstSpread::execute() {
assert(m != nullptr);
for (Function *foo : m->function_list_) {
if (foo->basic_blocks_.size()) {
bool change = true;
while (change) {
change = false;
change |= SpreadingConst(foo);
change |= BranchProcess(foo);
DeleteUnusedBB(foo);
}
}
}
}
bool ConstSpread::SpreadingConst(Function *func) {
uselessInstr.clear();
for (auto bb : func->basic_blocks_) {
ConstIntMap.clear();
ConstFloatMap.clear();
for (auto instr : bb->instr_list_) {
ConstantInt *testConstInta = nullptr, *testConstIntb = nullptr;
ConstantFloat *testConstFloata = nullptr, *testConstFloatb = nullptr;
switch (instr->op_id_) {
case Instruction::Add:
case Instruction::Sub:
case Instruction::Mul:
case Instruction::SDiv:
case Instruction::UDiv:
case Instruction::SRem:
case Instruction::URem:
case Instruction::And:
case Instruction::Or:
case Instruction::Xor:
case Instruction::Shl:
case Instruction::AShr:
case Instruction::LShr:
testConstInta = dynamic_cast<ConstantInt *>(instr->get_operand(0));
testConstIntb = dynamic_cast<ConstantInt *>(instr->get_operand(1));
if (testConstInta && testConstIntb) {
auto intRes =
this->CalcInt(instr->op_id_, testConstInta, testConstIntb);
if (intRes) {
instr->replace_all_use_with(intRes);
uselessInstr[instr] = bb;
}
}
break;
case Instruction::ICmp:
testConstInta = dynamic_cast<ConstantInt *>(instr->get_operand(0));
testConstIntb = dynamic_cast<ConstantInt *>(instr->get_operand(1));
if (testConstInta && testConstIntb) {
auto res = this->CalcICMP(dynamic_cast<ICmpInst *>(instr)->icmp_op_,
testConstInta, testConstIntb);
if (res) {
instr->replace_all_use_with(res);
uselessInstr[instr] = bb;
}
}
break;
case Instruction::FCmp:
testConstFloata = dynamic_cast<ConstantFloat *>(instr->get_operand(0));
testConstFloatb = dynamic_cast<ConstantFloat *>(instr->get_operand(1));
if (testConstFloata && testConstFloatb) {
auto res = this->CalcFCMP(dynamic_cast<FCmpInst *>(instr)->fcmp_op_,
testConstFloata, testConstFloatb);
if (res) {
instr->replace_all_use_with(res);
uselessInstr[instr] = bb;
}
}
break;
case Instruction::FAdd:
case Instruction::FSub:
case Instruction::FMul:
case Instruction::FDiv:
testConstFloata = dynamic_cast<ConstantFloat *>(instr->get_operand(0));
testConstFloatb = dynamic_cast<ConstantFloat *>(instr->get_operand(1));
if (testConstFloata && testConstFloatb) {
auto floaRes =
this->CalcFloat(instr->op_id_, testConstFloata, testConstFloatb);
if (floaRes) {
instr->replace_all_use_with(floaRes);
uselessInstr[instr] = bb;
}
}
break;
case Instruction::FNeg:
testConstFloata = dynamic_cast<ConstantFloat *>(instr->get_operand(0));
if (testConstFloata) {
instr->replace_all_use_with(
new ConstantFloat(m->float32_ty_, -testConstFloata->value_));
uselessInstr[instr] = bb;
}
break;
case Instruction::FPtoSI:
testConstFloata = dynamic_cast<ConstantFloat *>(instr->get_operand(0));
if (testConstFloata) {
instr->replace_all_use_with(
new ConstantInt(m->int32_ty_, testConstFloata->value_));
uselessInstr[instr] = bb;
}
break;
case Instruction::SItoFP:
testConstInta = dynamic_cast<ConstantInt *>(instr->get_operand(0));
if (testConstInta) {
instr->replace_all_use_with(
new ConstantFloat(m->float32_ty_, testConstInta->value_));
uselessInstr[instr] = bb;
}
break;
case Instruction::ZExt:
testConstInta = dynamic_cast<ConstantInt *>(instr->get_operand(0));
if (testConstInta) {
instr->replace_all_use_with(
new ConstantInt(m->int32_ty_, testConstInta->value_));
uselessInstr[instr] = bb;
}
break;
case Instruction::Call:
ConstIntMap.clear();
ConstFloatMap.clear();
case Instruction::Load: {
auto globalVar = dynamic_cast<GlobalVariable *>(instr->get_operand(0));
if (globalVar) {
auto iterInt = ConstIntMap.find(globalVar);
auto iterFloat = ConstFloatMap.find(globalVar);
if (iterInt != ConstIntMap.end()) {
instr->replace_all_use_with(iterInt->second);
uselessInstr[instr] = bb;
} else if (iterFloat != ConstFloatMap.end()) {
instr->replace_all_use_with(iterFloat->second);
uselessInstr[instr] = bb;
}
} else if (dynamic_cast<AllocaInst *>(instr->get_operand(0))) {
auto pos = dynamic_cast<AllocaInst *>(instr->get_operand(0));
if (pos->alloca_ty_->tid_ == Type::IntegerTyID) {
auto iterInt = ConstIntMap.find(pos);
if (iterInt != ConstIntMap.end()) {
instr->replace_all_use_with(iterInt->second);
uselessInstr[instr] = bb;
}
} else if (pos->alloca_ty_->tid_ == Type::FloatTyID) {
auto iterFloat = ConstFloatMap.find(pos);
if (iterFloat != ConstFloatMap.end()) {
instr->replace_all_use_with(iterFloat->second);
uselessInstr[instr] = bb;
}
}
}
} break;
case Instruction::Store: {
// std::cout << "EVER STORE\n";
auto storePos = instr->get_operand(1);
auto storeValInt = dynamic_cast<ConstantInt *>(instr->get_operand(0));
auto storeValFloat =
dynamic_cast<ConstantFloat *>(instr->get_operand(0));
if (storeValInt) {
auto iter1 = ConstIntMap.find(storePos);
if (iter1 != ConstIntMap.end()) {
if (iter1->second->value_ == storeValInt->value_)
uselessInstr[instr] = bb;
else
iter1->second = storeValInt;
} else
ConstIntMap[storePos] = storeValInt;
} else if (storeValFloat) {
auto iter = ConstFloatMap.find(storePos);
if (iter != ConstFloatMap.end()) {
if (iter->second->value_ == storeValInt->value_)
uselessInstr[instr] = bb;
else
iter->second = storeValFloat;
} else
ConstFloatMap[storePos] = storeValFloat;
} else {
// 非常量存储,则该地址数据不再是常量
auto iterInt = ConstIntMap.find(storePos);
auto iterFloat = ConstFloatMap.find(storePos);
if (iterInt != ConstIntMap.end())
ConstIntMap.erase(iterInt);
if (iterFloat != ConstFloatMap.end())
ConstFloatMap.erase(iterFloat);
}
} break;
default:
break;
}
}
}
if (!uselessInstr.empty()) {
for (auto [instr, bb] : uselessInstr)
bb->delete_instr(instr);
return true;
}
return false;
}
bool ConstSpread::BranchProcess(Function *func) {
bool change = false;
for (auto bb : func->basic_blocks_) {
auto br = bb->get_terminator();
if (!br)
continue;
if (br->op_id_ == Instruction::Br &&
dynamic_cast<BranchInst *>(br)->num_ops_ == 3) {
auto cond = dynamic_cast<ConstantInt *>(br->get_operand(0));
auto truebb = br->get_operand(1);
auto falsebb = br->get_operand(2);
if (!cond)
continue;
change = true;
if (cond->value_ == 0) {
bb->delete_instr(br);
for (auto succ_bb : bb->succ_bbs_) {
succ_bb->remove_pre_basic_block(bb);
if (succ_bb != falsebb) {
SolvePhi(bb, succ_bb);
}
}
bb->succ_bbs_.clear();
new BranchInst(dynamic_cast<BasicBlock *>(falsebb), bb);
} else {
bb->delete_instr(br);
for (auto succ_bb : bb->succ_bbs_) {
succ_bb->remove_pre_basic_block(bb);
if (succ_bb != truebb) {
SolvePhi(bb, succ_bb);
}
}
bb->succ_bbs_.clear();
new BranchInst(dynamic_cast<BasicBlock *>(truebb), bb);
}
}
}
return change;
}

@ -1,23 +0,0 @@
#ifndef CONSTSPREAD
#define CONSTSPREAD
#include "../ir/ir.h"
#include "BasicOperation.h"
#include "opt.h"
class ConstSpread : public Optimization {
public:
ConstSpread(Module *m_) : Optimization(m_) {}
void execute();
ConstantInt *CalcInt(Instruction::OpID op, ConstantInt *v1, ConstantInt *v2);
ConstantFloat *CalcFloat(Instruction::OpID op, ConstantFloat *v1,
ConstantFloat *v2);
ConstantInt *CalcICMP(ICmpInst::ICmpOp op, ConstantInt *v1, ConstantInt *v2);
ConstantInt *CalcFCMP(FCmpInst::FCmpOp op, ConstantFloat *v1, ConstantFloat *v2);
bool SpreadingConst(Function *func);
bool BranchProcess(Function *func);
std::map<Value *, ConstantInt *> ConstIntMap;
std::map<Value *, ConstantFloat *> ConstFloatMap;
std::map<Instruction *, BasicBlock *> uselessInstr;
};
#endif // !CONSTSPREAD

@ -1,180 +0,0 @@
#include "DeleteDeadCode.h"
#include "ConstSpread.h"
std::set<std::string> OptFunc = {"getint", "getfloat",
"getch", "getarray",
"getfarray", "putint",
"putfloat", "putch",
"putarray", "putfarray",
"_sysy_starttime", "_sysy_stoptime",
"memcpy", "memclr",
"memset", "llvm.memset.p0.i32",
"__aeabi_memcpy4", "__aeabi_memclr4",
"__aeabi_memset4"};
void DeadCodeDeletion::initFuncPtrArg() {
for (auto foo : m->function_list_) {
if (foo->basic_blocks_.empty())
continue;
for (auto arg : foo->arguments_)
if (arg->type_->tid_ == Type::PointerTyID) {
if (!funcPtrArgs.count(foo))
funcPtrArgs[foo] = {};
funcPtrArgs[foo].insert(arg);
}
}
}
void DeadCodeDeletion::Init(Function *foo) {
storePos.clear();
for (auto bb : foo->basic_blocks_) {
for (auto ins : bb->instr_list_) {
if (ins->op_id_ == Instruction::GetElementPtr) {
} else if (ins->op_id_ == Instruction::Store) {
if (!storePos.count(ins->get_operand(1))) {
storePos.insert({ins->get_operand(1), {}});
}
storePos[ins->get_operand(1)].push_back(ins);
if (dynamic_cast<GlobalVariable *>(ins->get_operand(1)))
OptFunc.insert(foo->name_);
if (dynamic_cast<GetElementPtrInst *>(ins->get_operand(1)))
OptFunc.insert(foo->name_);
if (funcPtrArgs[foo].count(ins->get_operand(1)))
OptFunc.insert(foo->name_);
} else if (ins->op_id_ == Instruction::Call) {
auto f = ins->get_operand(ins->operands_.size() - 1);
if (OptFunc.count(f->name_))
OptFunc.insert(foo->name_);
}
}
}
}
bool DeadCodeDeletion::checkOpt(Function *foo, Instruction *ins) {
if (ins->op_id_ == Instruction::Ret) {
exitBlock = ins->parent_;
return true;
} else if (ins->op_id_ == Instruction::Call) {
auto f = ins->get_operand(ins->operands_.size() - 1);
return OptFunc.count(f->name_);
} else if (ins->op_id_ == Instruction::Store) {
if (dynamic_cast<GlobalVariable *>(ins->get_operand(1)))
return true;
if (dynamic_cast<GetElementPtrInst *>(ins->get_operand(1)))
return true;
if (funcPtrArgs[foo].count(ins->get_operand(1)))
return true;
return false;
}
return false;
}
void DeadCodeDeletion::findInstr(Function *foo) {
std::list<Value *> workList;
for (auto bb : foo->basic_blocks_) {
for (auto ins : bb->instr_list_) {
if (checkOpt(foo, ins)) {
uselessInstr.insert(ins);
workList.push_back(ins);
}
}
}
while (!workList.empty()) {
auto ins = dynamic_cast<Instruction *>(workList.back());
workList.pop_back();
if (ins == nullptr) {
continue;
}
for (auto operand : ins->operands_) {
auto temp = dynamic_cast<Instruction *>(operand);
if (!temp)
continue;
if (uselessInstr.insert(temp).second) {
workList.push_back(temp);
}
}
if (ins->op_id_ == Instruction::PHI) {
for (int i = 1; i < ins->operands_.size(); i += 2) {
auto bb = dynamic_cast<BasicBlock *>(ins->get_operand(i));
auto br = bb->get_terminator();
if (uselessInstr.insert(br).second) {
workList.push_back(br);
}
}
}
if (storePos.count(ins)) {
for (auto curInstr : storePos[ins]) {
if (uselessInstr.insert(dynamic_cast<Instruction *>(curInstr)).second) {
workList.push_back(curInstr);
}
}
storePos.erase(ins);
}
if (uselessBlock.insert(ins->parent_).second) {
for (auto RFrontier : ins->parent_->rdom_frontier_) {
auto t = RFrontier->get_terminator();
if (uselessInstr.insert(t).second) {
workList.push_back(t);
}
}
}
}
}
void DeadCodeDeletion::deleteInstr(Function *foo) {
int deleteCnt = 0, changeCnt = 0;
for (auto bb : foo->basic_blocks_) {
std::vector<Instruction *> ins2Del;
for (auto ins : bb->instr_list_) {
if (!uselessInstr.count(ins)) {
if (ins->op_id_ != Instruction::Br) {
ins2Del.push_back(ins);
} else {
if (ins->operands_.size() == 3) {
changeCnt++;
auto trueBB = dynamic_cast<BasicBlock *>(ins->get_operand(1));
auto falseBB = dynamic_cast<BasicBlock *>(ins->get_operand(2));
trueBB->remove_pre_basic_block(bb);
falseBB->remove_pre_basic_block(bb);
bb->remove_succ_basic_block(trueBB);
bb->remove_succ_basic_block(falseBB);
BasicBlock *temp = exitBlock;
std::vector<BasicBlock *> rdoms(bb->rdoms_.begin(),
bb->rdoms_.end());
std::sort(rdoms.begin(), rdoms.end(),
[=](BasicBlock *x, BasicBlock *y) -> bool {
return x->rdoms_.count(y);
});
for (auto rdbb : rdoms) {
if (rdbb != bb && uselessBlock.count(rdbb)) {
temp = rdbb;
break;
}
}
ins->remove_operands(0, 2);
ins->num_ops_ = 1;
ins->operands_.resize(1);
ins->use_pos_.resize(1);
ins->set_operand(0, temp);
bb->add_succ_basic_block(temp);
temp->add_pre_basic_block(bb);
}
}
}
}
deleteCnt += ins2Del.size();
for (auto ins : ins2Del) {
bb->delete_instr(ins);
}
}
}
void DeadCodeDeletion::execute() {
ReverseDomainTree reverseDomainTree(m);
reverseDomainTree.execute();
initFuncPtrArg();
for (auto foo : m->function_list_)
if (!foo->basic_blocks_.empty()) {
Init(foo);
findInstr(foo);
deleteInstr(foo);
DeleteUnusedBB(foo);
}
}

@ -1,25 +0,0 @@
#ifndef DELETEDEADCODEH
#define DELETEDEADCODEH
#include "opt.h"
extern std::set<std::string> sysLibFunc;
class DeadCodeDeletion : public Optimization {
std::map<Function *, std::set<Value *>> funcPtrArgs;
std::map<Value *, std::vector<Value *>> storePos;
BasicBlock *exitBlock;
std::set<Instruction *> uselessInstr;
std::set<BasicBlock *> uselessBlock;
public:
DeadCodeDeletion(Module *m) : Optimization(m), exitBlock(nullptr) {}
void execute();
void initFuncPtrArg();
void Init(Function *foo);
bool checkOpt(Function *foo, Instruction *instr);
void findInstr(Function *foo);
void deleteInstr(Function *foo);
};
#endif // !DELETEDEADCODEH

@ -1,149 +0,0 @@
#include "LoopInvariant.h"
void LoopInvariant::execute() {
searchLoop();
while (!loopStack.empty()) {
auto loop = loopStack.top();
loopStack.pop();
std::set<Value *> assignVals;
std::set<Instruction *> visInstr; // 标记下这条语句是不是被操作过
std::vector<Instruction *> invarInstrs; // 存在不变量的语句集合
std::map<Instruction *, BasicBlock *> instrPos;
for (auto bb : *loop)
for (Instruction *inst : bb->instr_list_)
// 赋值语句做操作
if (inst->is_binary() || inst->is_cmp() || inst->is_fcmp() ||
inst->is_call() || inst->is_phi() || inst->is_zext() ||
inst->is_fptosi() || inst->is_sitofp() || inst->is_gep() ||
inst->is_load())
assignVals.insert(inst);
bool changed = true;
while (changed) {
changed = false;
for (auto bb : *loop) {
for (auto instr : bb->instr_list_) {
if (visInstr.find(instr) != visInstr.end())
continue;
if (!instr->is_gep() && !instr->is_alloca() && !instr->is_br() &&
!instr->is_ret() && !instr->is_phi() && !instr->is_store() &&
!instr->is_load() &&
!(instr->is_call() &&
instr->get_operand(instr->num_ops_ - 1)->print() != "rand")) {
bool move = true;
// 一个操作数不是不变量就不能动
for (unsigned int i = 0; i < instr->num_ops_; i++)
if (assignVals.find(instr->get_operand(i)) != assignVals.end())
move = false;
if (move) {
instrPos[instr] = bb;
invarInstrs.push_back(instr);
assignVals.erase(instr);
visInstr.insert(instr);
changed = true;
}
}
}
}
}
auto enter = entryPos[loop];
for (auto prev : enter->pre_bbs_)
if (loop->find(prev) == loop->end())
for (auto inst : invarInstrs)
prev->add_instruction_before_terminator(inst);
}
}
void LoopInvariant::searchLoop() {
for (auto foo : m->function_list_) {
if (foo->basic_blocks_.empty())
continue;
std::set<node *> nodes;
std::set<node *> entry;
std::set<std::set<node *> *> SCCs;
std::map<BasicBlock *, node *> nodeMap;
for (auto bb : foo->basic_blocks_) {
auto cur = new node(bb, -1, -1, 0);
nodeMap[bb] = cur;
nodes.insert(cur);
}
for (auto bb : foo->basic_blocks_) {
auto BlockNode = nodeMap[bb];
for (auto suc : bb->succ_bbs_)
BlockNode->suc.insert(nodeMap[suc]);
for (auto pre : bb->succ_bbs_)
BlockNode->pre.insert(nodeMap[pre]);
}
while (LoopInvariant::searchSCC(nodes, SCCs)) {
for (auto SCC : SCCs) {
node *enter = nullptr;
for (auto curBlock : *SCC)
for (auto pre : curBlock->pre)
if (SCC->find(pre) == SCC->end())
enter = curBlock;
else if (entry.find(pre) != entry.end())
enter = pre;
auto curLoop = new std::set<BasicBlock *>;
for (auto curBlock : *SCC)
curLoop->insert(curBlock->bb);
entryPos[curLoop] = enter->bb;
loopStack.push(curLoop);
entry.insert(enter);
nodes.erase(enter);
for (auto pre : enter->pre)
pre->suc.erase(enter);
for (auto suc : enter->suc)
suc->pre.erase(enter);
}
for (auto SCC : SCCs)
SCC->clear();
SCCs.clear();
for (auto NodeBlock : nodes)
NodeBlock = new node(nullptr, -1, -1, false);
}
for (auto node : nodes)
delete node;
}
}
bool LoopInvariant::searchSCC(std::set<node *> &basicBlocks,
std::set<std::set<node *> *> &SCCs) {
ind = 0;
while (!tarjanStack.empty())
tarjanStack.pop();
for (auto cur : basicBlocks)
if (cur->dfn == -1)
tarjan(cur, SCCs);
return SCCs.size() != 0;
}
void LoopInvariant::tarjan(node *cur, std::set<std::set<node *> *> &SCCs) {
cur->dfn = cur->low = ++ind;
cur->inStack = true;
tarjanStack.push(cur);
for (auto succ : cur->suc)
if (succ->dfn == -1) {
tarjan(succ, SCCs);
if (succ->low < cur->low)
cur->low = succ->low;
} else if (succ->inStack && succ->low < cur->low)
cur->low = succ->low;
// 找到low=dfn的出现强连通分量
if (cur->dfn == cur->low) {
if (cur == tarjanStack.top()) {
tarjanStack.pop();
cur->inStack = false;
return;
}
auto SCC = new std::set<node *>;
node *tp = nullptr;
do {
tp = tarjanStack.top();
SCC->insert(tp);
tarjanStack.pop();
tp->inStack = false;
} while (tp != cur);
SCCs.insert(SCC);
}
}

@ -1,31 +0,0 @@
#ifndef LOOPH
#define LOOPH
#include "BasicOperation.h"
struct node {
BasicBlock *bb;
std::set<node *> pre;
std::set<node *> suc;
int dfn, low;
bool inStack;
node() = default;
node(BasicBlock *bb_, int dfn_, int low_, bool inStack_)
: bb(bb_), dfn(dfn_), low(low_), inStack(inStack_) {}
};
class LoopInvariant : public Optimization {
int ind;
std::stack<node *> tarjanStack;
std::stack<std::set<BasicBlock *> *> loopStack;
std::map<std::set<BasicBlock *> *, BasicBlock *> entryPos;
public:
LoopInvariant(Module *m) : Optimization(m) {}
void execute();
void searchLoop();
bool searchSCC(std::set<node *> &basicBlock, std::set<std::set<node *> *> &SCCs);
void tarjan(node *pos, std::set<std::set<node *> *> &SCCs);
};
#endif // !LOOPH

@ -1,120 +0,0 @@
#include "SimplifyJump.h"
void SimplifyJump::execute() {
for (auto foo : m->function_list_)
if (foo->basic_blocks_.empty()) {
deleteUnReachableBlock(foo);
mergePreBlock(foo);
deleteUselessPhi(foo);
deleteUselessJump(foo);
}
}
void SimplifyJump::deleteUselessBlock(Function *foo,
std::vector<BasicBlock *> &uselessBlock) {
for (auto bb : uselessBlock)
foo->remove_bb(bb);
}
bool SimplifyJump::checkUselessJump(BasicBlock *bb) {
auto JumpPos = bb->get_terminator()->get_operand(0);
for (auto preBB : bb->pre_bbs_) {
auto br = preBB->get_terminator();
if (br->operands_.size() == 1)
continue;
auto trueBB = br->get_operand(1);
auto falseBB = br->get_operand(2);
if (trueBB == JumpPos || falseBB == JumpPos)
return false;
}
return true;
}
void SimplifyJump::deleteUnReachableBlock(Function *foo) {
std::vector<BasicBlock *> uselessBlock;
for (int i = 2; i < foo->basic_blocks_.size(); i++) {
auto curbb = foo->basic_blocks_[i];
if (curbb->pre_bbs_.empty()) {
uselessBlock.push_back(curbb);
// 发现无用块后需要提前进行phi合流处理
for (auto use : curbb->use_list_) {
auto instr = dynamic_cast<PhiInst *>(use.val_);
if (instr != nullptr)
instr->remove_operands(use.arg_no_ - 1, use.arg_no_);
}
}
}
}
void SimplifyJump::mergePreBlock(Function *foo) {
std::vector<BasicBlock *> uselessBlock;
for (int i = 2; i < foo->basic_blocks_.size(); i++) {
auto bb = foo->basic_blocks_[i];
if (bb->pre_bbs_.size() == 1) {
auto preBlock = *bb->pre_bbs_.begin();
auto preBr = preBlock->get_terminator();
if (preBlock->succ_bbs_.size() != 1)
continue;
preBlock->delete_instr(preBr);
for (auto instr : bb->instr_list_) {
preBlock->add_instruction(instr);
bb->remove_instr(instr);
}
preBlock->remove_succ_basic_block(bb);
for (auto suc : bb->succ_bbs_) {
preBlock->add_succ_basic_block(suc);
suc->remove_pre_basic_block(bb);
suc->add_pre_basic_block(preBlock);
}
bb->replace_all_use_with(preBlock);
uselessBlock.push_back(bb);
}
}
deleteUselessBlock(foo, uselessBlock);
}
void SimplifyJump::deleteUselessPhi(Function *foo) {
for (auto bb : foo->basic_blocks_)
if (bb->pre_bbs_.size() == 1)
for (auto instr : bb->instr_list_)
if (instr->is_phi()) {
instr->replace_all_use_with(instr->get_operand(0));
bb->delete_instr(instr);
}
}
void SimplifyJump::deleteUselessJump(Function *foo) {
std::vector<BasicBlock *> uselessBlock;
for (int i = 2; i < foo->basic_blocks_.size(); i++) {
BasicBlock *curbb = foo->basic_blocks_[i];
if (curbb->instr_list_.size() != 1)
continue;
auto branchInstr = curbb->get_terminator();
if (branchInstr->operands_.size() != 1 || branchInstr->is_ret())
continue;
if (!checkUselessJump(curbb))
continue;
uselessBlock.push_back(curbb);
auto JumpTarget = dynamic_cast<BasicBlock *>(branchInstr->get_operand(0));
for (auto instr : JumpTarget->instr_list_)
if (instr->is_phi()) {
for (int i = 1; i < instr->operands_.size(); i += 2) {
if (instr->get_operand(i) == curbb) {
auto val = instr->get_operand(i - 1);
instr->remove_operands(i - 1, i);
for (auto preBB : curbb->pre_bbs_) {
instr->add_operand(val);
instr->add_operand(preBB);
}
break;
}
}
}
curbb->replace_all_use_with(JumpTarget);
for (auto preBB : curbb->pre_bbs_) {
preBB->add_succ_basic_block(JumpTarget);
JumpTarget->add_pre_basic_block(preBB);
}
}
deleteUselessBlock(foo, uselessBlock);
}

@ -1,19 +0,0 @@
#ifndef SIMPLIFYJUMPH
#define SIMPLIFYJUMPH
#include "opt.h"
class SimplifyJump : public Optimization {
public:
SimplifyJump(Module *m) : Optimization(m) {}
void execute();
void deleteUselessBlock(Function *foo,
std::vector<BasicBlock *> &uselessBlock);
bool checkUselessJump(BasicBlock *bb);
void deleteUselessPhi(Function *foo);
void deleteUselessJump(Function *foo);
void mergePreBlock(Function *foo);
void deleteUnReachableBlock(Function *foo);
};
#endif // !SIMPLIFYJUMPH

@ -1,206 +0,0 @@
#include "opt.h"
#include <functional>
#include <vector>
void DomainTree::execute() {
for (auto foo : m->function_list_)
if (!foo->basic_blocks_.empty()) {
getBlockDom(foo);
getBlockDomFront(foo);
}
}
bool DomainTree::isLoopEdge(BasicBlock *a, BasicBlock *b) {
return TraverseInd[a] > TraverseInd[b];
}
std::vector<BasicBlock *> DomainTree::postTraverse(BasicBlock *bb) {
std::set<BasicBlock *> vis;
std::vector<BasicBlock *> ans;
std::function<void(BasicBlock *)> dfs = [&](BasicBlock *place) {
vis.insert(place);
for (auto child : place->succ_bbs_)
if (vis.find(child) == vis.end())
dfs(child);
ans.push_back(place);
};
dfs(bb);
return ans;
}
void DomainTree::getReversePostTraverse(Function *f) {
doms.clear();
reversePostTraverse.clear();
TraverseInd.clear();
auto entryBlock = *f->basic_blocks_.begin();
auto seq = postTraverse(entryBlock);
std::reverse(reversePostTraverse.begin(), reversePostTraverse.end());
for (int i = 0; i < seq.size(); i++)
TraverseInd[seq[i]] = i;
reversePostTraverse = seq;
}
void DomainTree::getBlockDom(Function *f) {
getReversePostTraverse(f);
auto root = *f->basic_blocks_.begin();
auto root_id = TraverseInd[root];
doms.resize(root_id + 1, nullptr);
doms.back() = root;
bool change = true;
while (change) {
change = false;
for (auto bb : reversePostTraverse)
if (bb != root) {
auto preds = bb->pre_bbs_;
BasicBlock *curDom = nullptr;
for (auto pred_bb : preds)
if (doms[TraverseInd[pred_bb]] != nullptr) {
curDom = pred_bb;
break;
}
for (auto pred_bb : preds)
if (doms[TraverseInd[pred_bb]] != nullptr)
curDom = intersect(pred_bb, curDom);
if (doms[TraverseInd[bb]] != curDom) {
doms[TraverseInd[bb]] = curDom;
change = true;
}
}
}
for (auto bb : reversePostTraverse)
bb->idom_ = doms[TraverseInd[bb]];
}
void DomainTree::getBlockDomFront(Function *foo) {
for (auto b : foo->basic_blocks_) {
auto b_pred = b->pre_bbs_;
if (b_pred.size() >= 2) {
for (auto pred : b_pred) {
auto runner = pred;
while (runner != doms[TraverseInd[b]]) {
runner->dom_frontier_.insert(b);
runner = doms[TraverseInd[runner]];
}
}
}
}
}
BasicBlock *DomainTree::intersect(BasicBlock *b1, BasicBlock *b2) {
auto head1 = b1;
auto head2 = b2;
while (head1 != head2) {
while (TraverseInd[head1] < TraverseInd[head2])
head1 = doms[TraverseInd[head1]];
while (TraverseInd[head2] < TraverseInd[head1])
head2 = doms[TraverseInd[head2]];
}
return head1;
}
void ReverseDomainTree::execute() {
for (auto f : m->function_list_)
if (!f->basic_blocks_.empty()) {
for (auto bb : f->basic_blocks_) {
bb->rdoms_.clear();
bb->rdom_frontier_.clear();
}
getBlockDomR(f);
getBlockDomFrontR(f);
getBlockRdoms(f);
}
}
void ReverseDomainTree::getPostTraverse(BasicBlock *bb,
std::set<BasicBlock *> &visited) {
visited.insert(bb);
for (auto parent : bb->pre_bbs_)
if (visited.find(parent) == visited.end())
getPostTraverse(parent, visited);
reverseTraverseInd[bb] = reverseTraverse.size();
reverseTraverse.push_back(bb);
}
void ReverseDomainTree::getReversePostTraverse(Function *f) {
reverseDomainBlock.clear();
reverseTraverse.clear();
reverseTraverseInd.clear();
for (auto bb : f->basic_blocks_) {
auto terminate_instr = bb->get_terminator();
if (terminate_instr->op_id_ == Instruction::Ret) {
exitBlock = bb;
break;
}
}
assert(exitBlock != nullptr);
std::set<BasicBlock *> visited = {};
getPostTraverse(exitBlock, visited);
reverse(reverseTraverse.begin(), reverseTraverse.end());
}
void ReverseDomainTree::getBlockDomR(Function *f) {
getReversePostTraverse(f);
auto root = exitBlock;
auto root_id = reverseTraverseInd[root];
for (int i = 0; i < root_id; i++)
reverseDomainBlock.push_back(nullptr);
reverseDomainBlock.push_back(root);
bool change = true;
while (change) {
change = false;
for (auto bb : reverseTraverse) {
if (bb != root) {
BasicBlock *new_irdom = nullptr;
for (auto rpred_bb : bb->succ_bbs_)
if (reverseDomainBlock[reverseTraverseInd[rpred_bb]] != nullptr) {
new_irdom = rpred_bb;
break;
}
for (auto rpred_bb : bb->succ_bbs_)
if (reverseDomainBlock[reverseTraverseInd[rpred_bb]] != nullptr)
new_irdom = intersect(rpred_bb, new_irdom);
if (reverseDomainBlock[reverseTraverseInd[bb]] != new_irdom) {
reverseDomainBlock[reverseTraverseInd[bb]] = new_irdom;
change = true;
}
}
}
}
}
void ReverseDomainTree::getBlockRdoms(Function *f) {
for (auto bb : f->basic_blocks_) {
if (bb == exitBlock)
continue;
auto current = bb;
while (current != exitBlock) {
bb->rdoms_.insert(current);
current = reverseDomainBlock[reverseTraverseInd[current]];
}
}
}
void ReverseDomainTree::getBlockDomFrontR(Function *f) {
for (auto bb_iter = f->basic_blocks_.rbegin();
bb_iter != f->basic_blocks_.rend(); bb_iter++) {
auto bb = *bb_iter;
if (bb->succ_bbs_.size() >= 2) {
for (auto rpred : bb->succ_bbs_) {
auto runner = rpred;
while (runner != reverseDomainBlock[reverseTraverseInd[bb]]) {
runner->rdom_frontier_.insert(bb);
runner = reverseDomainBlock[reverseTraverseInd[runner]];
}
}
}
}
}
BasicBlock *ReverseDomainTree::intersect(BasicBlock *b1, BasicBlock *b2) {
auto head1 = b1;
auto head2 = b2;
while (head1 != head2) {
while (reverseTraverseInd[head1] < reverseTraverseInd[head2])
head1 = reverseDomainBlock[reverseTraverseInd[head1]];
while (reverseTraverseInd[head2] < reverseTraverseInd[head1])
head2 = reverseDomainBlock[reverseTraverseInd[head2]];
}
return head1;
}

@ -1,46 +0,0 @@
// Currently a dummy file
#ifndef OPTH
#define OPTH
#include "ir.h"
class Optimization {
public:
Module *m;
explicit Optimization(Module *m_) : m(m_) {}
virtual void execute() = 0;
};
class DomainTree : public Optimization {
std::vector<BasicBlock *> reversePostTraverse;
std::map<BasicBlock *, int> TraverseInd;
std::vector<BasicBlock *> doms;
public:
DomainTree(Module *m) : Optimization(m) {}
void execute();
void getReversePostTraverse(Function *foo);
std::vector<BasicBlock *> postTraverse(BasicBlock *bb);
void getBlockDom(Function *foo);
void getBlockDomFront(Function *foo);
BasicBlock *intersect(BasicBlock *b1, BasicBlock *b2);
bool isLoopEdge(BasicBlock *a, BasicBlock *b);
};
class ReverseDomainTree : public Optimization {
std::map<BasicBlock *, int> reverseTraverseInd;
std::vector<BasicBlock *> reverseDomainBlock;
std::vector<BasicBlock *> reverseTraverse;
BasicBlock *exitBlock;
public:
ReverseDomainTree(Module *m) : Optimization(m), exitBlock(nullptr) {}
void execute();
BasicBlock *intersect(BasicBlock *b1, BasicBlock *b2);
void getReversePostTraverse(Function *foo);
void getBlockDomR(Function *foo);
void getBlockRdoms(Function *foo);
void getBlockDomFrontR(Function *foo);
void getPostTraverse(BasicBlock *bb, std::set<BasicBlock *> &visited);
};
#endif // !OPTH

@ -1,22 +0,0 @@
# Require Flex & Bison as generator
# find_package(FLEX 2.5.4 REQUIRED)
# find_package(BISON 2.4.1 REQUIRED)
set(PARSER_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
# set(PARSER_DIR "${CMAKE_CURRENT_BINARY_DIR}")
set(LEXER_CPP "${PARSER_DIR}/tokens.cpp")
set(LEXER_DEF "${PARSER_DIR}/tokens.hpp")
set(PARSER_CPP "${PARSER_DIR}/parser.cpp")
set(PARSER_DEF "${PARSER_DIR}/parser.hpp")
# Generate tokenizer & parser via Flex & Bison
# flex_target(LEXER "tokens.l" "${LEXER_CPP}" DEFINES_FILE "${LEXER_DEF}")
# bison_target(PARSER "parser.y" "${PARSER_CPP}" DEFINES_FILE "${PARSER_DEF}")
# add_flex_bison_dependency(LEXER PARSER)
set(SOURCE_FILES "${LEXER_CPP}" "${PARSER_CPP}" "ast.cpp")
set(PARSER_INCLUDE ${PARSER_DIR} ${CMAKE_CURRENT_SOURCE_DIR} PARENT_SCOPE)
add_library(parser STATIC ${SOURCE_FILES})
target_include_directories(parser PRIVATE "${PARSER_INCLUDE}")

@ -1,49 +0,0 @@
#include "ast.h"
void CompUnitAST::accept(Visitor &visitor) { visitor.visit(*this); }
void DeclDefAST::accept(Visitor &visitor) { visitor.visit(*this); }
void DefAST::accept(Visitor &visitor) { visitor.visit(*this); }
void DeclAST::accept(Visitor &visitor) { visitor.visit(*this); }
void InitValAST::accept(Visitor &visitor) { visitor.visit(*this); }
void FuncDefAST::accept(Visitor &visitor) { visitor.visit(*this); }
void FuncFParamAST::accept(Visitor &visitor) { visitor.visit(*this); }
void BlockAST::accept(Visitor &visitor) { visitor.visit(*this); }
void StmtAST::accept(Visitor &visitor) { visitor.visit(*this); }
void ReturnStmtAST::accept(Visitor &visitor) { visitor.visit(*this); }
void SelectStmtAST::accept(Visitor &visitor) { visitor.visit(*this); }
void IterationStmtAST::accept(Visitor &visitor) { visitor.visit(*this); }
void AddExpAST::accept(Visitor &visitor) { visitor.visit(*this); }
void MulExpAST::accept(Visitor &visitor) { visitor.visit(*this); }
void UnaryExpAST::accept(Visitor &visitor) { visitor.visit(*this); }
void PrimaryExpAST::accept(Visitor &visitor) { visitor.visit(*this); }
void NumberAST::accept(Visitor &visitor) { visitor.visit(*this); }
void CallAST::accept(Visitor &visitor) { visitor.visit(*this); }
void LValAST::accept(Visitor &visitor) { visitor.visit(*this); }
void RelExpAST::accept(Visitor &visitor) { visitor.visit(*this); }
void EqExpAST::accept(Visitor &visitor) { visitor.visit(*this); }
void LAndExpAST::accept(Visitor &visitor) { visitor.visit(*this); }
void LOrExpAST::accept(Visitor &visitor) { visitor.visit(*this); }
void BlockItemAST::accept(Visitor &visitor) { visitor.visit(*this); }

@ -1,297 +0,0 @@
#pragma once
#include "define.h"
#include <cstring>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
using namespace std;
class BaseAST;
class CompUnitAST;
class DeclDefAST;
class DeclAST;
class DefListAST;
class DefAST;
class ArraysAST;
class InitValListAST;
class InitValAST;
class FuncDefAST;
class FuncFParamListAST;
class FuncFParamAST;
class BlockAST;
class BlockItemListAST;
class BlockItemAST;
class StmtAST;
class ReturnStmtAST;
class SelectStmtAST;
class IterationStmtAST;
class LValAST;
class PrimaryExpAST;
class NumberAST;
class UnaryExpAST;
class CallAST;
class FuncCParamListAST;
class MulExpAST;
class AddExpAST;
class RelExpAST;
class EqExpAST;
class LAndExpAST;
class LOrExpAST;
class Visitor;
class BaseAST {
public:
virtual void accept(Visitor &visitor) = 0;
BaseAST() = default;
virtual ~BaseAST() = default;
};
class CompUnitAST : public BaseAST {
public:
vector<unique_ptr<DeclDefAST>> declDefList;
void accept(Visitor &visitor) override;
};
class DeclDefAST : public BaseAST {
public:
unique_ptr<DeclAST> Decl = nullptr;
unique_ptr<FuncDefAST> funcDef = nullptr;
void accept(Visitor &visitor) override;
};
class DeclAST : public BaseAST {
public:
TYPE bType = TYPE_VOID;
bool isConst = false;
vector<unique_ptr<DefAST>> defList;
void accept(Visitor &visitor) override;
};
class DefListAST {
public:
vector<unique_ptr<DefAST>> list;
};
class DefAST : public BaseAST {
public:
unique_ptr<string> id;
vector<unique_ptr<AddExpAST>> arrays;
unique_ptr<InitValAST> initVal;
void accept(Visitor &visitor) override;
};
class ArraysAST {
public:
vector<unique_ptr<AddExpAST>> list;
};
class InitValAST : public BaseAST {
public:
unique_ptr<AddExpAST> exp;
vector<unique_ptr<InitValAST>> initValList;
void accept(Visitor &visitor) override;
};
class InitValListAST {
public:
vector<unique_ptr<InitValAST>> list;
};
class FuncDefAST : public BaseAST {
public:
TYPE funcType = TYPE_VOID;
unique_ptr<string> id;
vector<unique_ptr<FuncFParamAST>> funcFParamList;
unique_ptr<BlockAST> block = nullptr;
void accept(Visitor &visitor) override;
};
class FuncFParamListAST {
public:
vector<unique_ptr<FuncFParamAST>> list;
};
class FuncFParamAST : public BaseAST {
public:
TYPE bType;
unique_ptr<string> id;
bool isArray =
false; // 用于区分是否是数组参数此时一维数组和多维数组expArrays都是empty
vector<unique_ptr<AddExpAST>> arrays;
void accept(Visitor &visitor) override;
};
class BlockAST : public BaseAST {
public:
vector<unique_ptr<BlockItemAST>> blockItemList;
void accept(Visitor &visitor) override;
};
class BlockItemListAST {
public:
vector<unique_ptr<BlockItemAST>> list;
};
class BlockItemAST : public BaseAST {
public:
unique_ptr<DeclAST> decl = nullptr;
unique_ptr<StmtAST> stmt = nullptr;
void accept(Visitor &visitor) override;
};
class StmtAST : public BaseAST {
public:
STYPE sType;
unique_ptr<LValAST> lVal = nullptr;
unique_ptr<AddExpAST> exp = nullptr;
unique_ptr<ReturnStmtAST> returnStmt = nullptr;
unique_ptr<SelectStmtAST> selectStmt = nullptr;
unique_ptr<IterationStmtAST> iterationStmt = nullptr;
unique_ptr<BlockAST> block = nullptr;
void accept(Visitor &visitor) override;
};
class ReturnStmtAST : public BaseAST {
public:
unique_ptr<AddExpAST> exp = nullptr;
void accept(Visitor &visitor) override;
};
class SelectStmtAST : public BaseAST {
public:
unique_ptr<LOrExpAST> cond;
unique_ptr<StmtAST> ifStmt, elseStmt;
void accept(Visitor &visitor) override;
};
class IterationStmtAST : public BaseAST {
public:
unique_ptr<LOrExpAST> cond;
unique_ptr<StmtAST> stmt;
void accept(Visitor &visitor) override;
};
class AddExpAST : public BaseAST {
public:
unique_ptr<AddExpAST> addExp;
unique_ptr<MulExpAST> mulExp;
AOP op;
void accept(Visitor &visitor) override;
};
class MulExpAST : public BaseAST {
public:
unique_ptr<UnaryExpAST> unaryExp;
unique_ptr<MulExpAST> mulExp;
MOP op;
void accept(Visitor &visitor) override;
};
class UnaryExpAST : public BaseAST {
public:
unique_ptr<PrimaryExpAST> primaryExp;
unique_ptr<CallAST> call;
unique_ptr<UnaryExpAST> unaryExp;
UOP op;
void accept(Visitor &visitor) override;
};
class PrimaryExpAST : public BaseAST {
public:
unique_ptr<AddExpAST> exp;
unique_ptr<LValAST> lval;
unique_ptr<NumberAST> number;
void accept(Visitor &visitor) override;
};
class NumberAST : public BaseAST {
public:
bool isInt;
union {
int intval;
float floatval;
};
void accept(Visitor &visitor) override;
};
class LValAST : public BaseAST {
public:
unique_ptr<string> id;
vector<unique_ptr<AddExpAST>> arrays;
void accept(Visitor &visitor) override;
};
class CallAST : public BaseAST {
public:
unique_ptr<string> id;
vector<unique_ptr<AddExpAST>> funcCParamList;
void accept(Visitor &visitor) override;
};
class FuncCParamListAST {
public:
vector<unique_ptr<AddExpAST>> list;
};
class RelExpAST : public BaseAST {
public:
unique_ptr<AddExpAST> addExp;
unique_ptr<RelExpAST> relExp;
ROP op;
void accept(Visitor &visitor) override;
};
class EqExpAST : public BaseAST {
public:
unique_ptr<RelExpAST> relExp;
unique_ptr<EqExpAST> eqExp;
EOP op;
void accept(Visitor &visitor) override;
};
class LAndExpAST : public BaseAST {
public:
// lAndExp不为空则说明有and符号or类似
unique_ptr<EqExpAST> eqExp;
unique_ptr<LAndExpAST> lAndExp;
void accept(Visitor &visitor) override;
};
class LOrExpAST : public BaseAST {
public:
unique_ptr<LOrExpAST> lOrExp;
unique_ptr<LAndExpAST> lAndExp;
void accept(Visitor &visitor) override;
};
class Visitor {
public:
virtual void visit(CompUnitAST &ast) = 0;
virtual void visit(DeclDefAST &ast) = 0;
virtual void visit(DeclAST &ast) = 0;
virtual void visit(DefAST &ast) = 0;
virtual void visit(InitValAST &ast) = 0;
virtual void visit(FuncDefAST &ast) = 0;
virtual void visit(FuncFParamAST &ast) = 0;
virtual void visit(BlockAST &ast) = 0;
virtual void visit(BlockItemAST &ast) = 0;
virtual void visit(StmtAST &ast) = 0;
virtual void visit(ReturnStmtAST &ast) = 0;
virtual void visit(SelectStmtAST &ast) = 0;
virtual void visit(IterationStmtAST &ast) = 0;
virtual void visit(AddExpAST &ast) = 0;
virtual void visit(MulExpAST &ast) = 0;
virtual void visit(UnaryExpAST &ast) = 0;
virtual void visit(PrimaryExpAST &ast) = 0;
virtual void visit(LValAST &ast) = 0;
virtual void visit(NumberAST &ast) = 0;
virtual void visit(CallAST &ast) = 0;
virtual void visit(RelExpAST &ast) = 0;
virtual void visit(EqExpAST &ast) = 0;
virtual void visit(LAndExpAST &ast) = 0;
virtual void visit(LOrExpAST &ast) = 0;
};

@ -1,15 +0,0 @@
#pragma once
enum STYPE { SEMI, ASS, EXP, CONT, BRE, RET, BLK, SEL, ITER };
enum UOP { UOP_ADD, UOP_MINUS, UOP_NOT };
enum AOP { AOP_ADD, AOP_MINUS };
enum MOP { MOP_MUL, MOP_DIV, MOP_MOD };
enum ROP { ROP_GTE, ROP_LTE, ROP_GT, ROP_LT };
enum EOP { EOP_EQ, EOP_NEQ };
enum TYPE { TYPE_VOID, TYPE_INT, TYPE_FLOAT };

File diff suppressed because it is too large Load Diff

@ -1,170 +0,0 @@
/* A Bison parser, made by GNU Bison 3.8.2. */
/* Bison interface for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
/* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
under terms of your choice, so long as that work isn't itself a
parser generator using the skeleton or a modified version thereof
as a parser skeleton. Alternatively, if you modify or redistribute
the parser skeleton itself, you may (at your option) remove this
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
especially those whose name start with YY_ or yy_. They are
private implementation details that can be changed or removed. */
#ifndef YY_YY_HOME_SEAS0_CODES_COMPILER_CARROTCOMPILER_SRC_PARSER_PARSER_HPP_INCLUDED
# define YY_YY_HOME_SEAS0_CODES_COMPILER_CARROTCOMPILER_SRC_PARSER_PARSER_HPP_INCLUDED
/* Debug traces. */
#ifndef YYDEBUG
# define YYDEBUG 0
#endif
#if YYDEBUG
extern int yydebug;
#endif
/* Token kinds. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
enum yytokentype
{
YYEMPTY = -2,
YYEOF = 0, /* "end of file" */
YYerror = 256, /* error */
YYUNDEF = 257, /* "invalid token" */
INT = 258, /* INT */
FLOAT = 259, /* FLOAT */
ID = 260, /* ID */
GTE = 261, /* GTE */
LTE = 262, /* LTE */
GT = 263, /* GT */
LT = 264, /* LT */
EQ = 265, /* EQ */
NEQ = 266, /* NEQ */
INTTYPE = 267, /* INTTYPE */
FLOATTYPE = 268, /* FLOATTYPE */
VOID = 269, /* VOID */
CONST = 270, /* CONST */
RETURN = 271, /* RETURN */
IF = 272, /* IF */
ELSE = 273, /* ELSE */
WHILE = 274, /* WHILE */
BREAK = 275, /* BREAK */
CONTINUE = 276, /* CONTINUE */
LP = 277, /* LP */
RP = 278, /* RP */
LB = 279, /* LB */
RB = 280, /* RB */
LC = 281, /* LC */
RC = 282, /* RC */
COMMA = 283, /* COMMA */
SEMICOLON = 284, /* SEMICOLON */
NOT = 285, /* NOT */
ASSIGN = 286, /* ASSIGN */
MINUS = 287, /* MINUS */
ADD = 288, /* ADD */
MUL = 289, /* MUL */
DIV = 290, /* DIV */
MOD = 291, /* MOD */
AND = 292, /* AND */
OR = 293, /* OR */
LOWER_THEN_ELSE = 294 /* LOWER_THEN_ELSE */
};
typedef enum yytokentype yytoken_kind_t;
#endif
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
union YYSTYPE
{
#line 20 "/home/seas0/Codes/compiler/carrotcompiler/src/parser/parser.y"
CompUnitAST* compUnit;
DeclDefAST* declDef;
DeclAST* decl;
DefListAST* defList;
DefAST* def;
ArraysAST* arrays;
InitValListAST* initValList;
InitValAST* initVal;
FuncDefAST* funcDef;
FuncFParamListAST* FuncFParamList;
FuncFParamAST* funcFParam;
BlockAST* block;
BlockItemListAST* blockItemList;
BlockItemAST* blockItem;
StmtAST* stmt;
ReturnStmtAST* returnStmt;
SelectStmtAST* selectStmt;
IterationStmtAST* iterationStmt;
LValAST* lVal;
PrimaryExpAST* primaryExp;
NumberAST* number;
UnaryExpAST* unaryExp;
CallAST* call;
FuncCParamListAST* funcCParamList;
MulExpAST* mulExp;
AddExpAST* addExp;
RelExpAST* relExp;
EqExpAST* eqExp;
LAndExpAST* lAndExp;
LOrExpAST* lOrExp;
TYPE ty;
UOP op;
string* token;
int int_val;
float float_val;
#line 142 "/home/seas0/Codes/compiler/carrotcompiler/src/parser/parser.hpp"
};
typedef union YYSTYPE YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define YYSTYPE_IS_DECLARED 1
#endif
/* Location type. */
#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
typedef struct YYLTYPE YYLTYPE;
struct YYLTYPE
{
int first_line;
int first_column;
int last_line;
int last_column;
};
# define YYLTYPE_IS_DECLARED 1
# define YYLTYPE_IS_TRIVIAL 1
#endif
extern YYSTYPE yylval;
extern YYLTYPE yylloc;
int yyparse (void);
#endif /* !YY_YY_HOME_SEAS0_CODES_COMPILER_CARROTCOMPILER_SRC_PARSER_PARSER_HPP_INCLUDED */

@ -1,652 +0,0 @@
%define parse.error verbose
%locations
%{
#include "ast.h"
#include "define.h"
#include <memory>
#include <cstring>
#include <stdarg.h>
using namespace std;
unique_ptr<CompUnitAST> root; /* the top level root node of our final AST */
extern int yylineno;
extern int yylex();
extern void yyerror(const char *s);
extern void initFileName(char *name);
char filename[100];
%}
%union {
CompUnitAST* compUnit;
DeclDefAST* declDef;
DeclAST* decl;
DefListAST* defList;
DefAST* def;
ArraysAST* arrays;
InitValListAST* initValList;
InitValAST* initVal;
FuncDefAST* funcDef;
FuncFParamListAST* FuncFParamList;
FuncFParamAST* funcFParam;
BlockAST* block;
BlockItemListAST* blockItemList;
BlockItemAST* blockItem;
StmtAST* stmt;
ReturnStmtAST* returnStmt;
SelectStmtAST* selectStmt;
IterationStmtAST* iterationStmt;
LValAST* lVal;
PrimaryExpAST* primaryExp;
NumberAST* number;
UnaryExpAST* unaryExp;
CallAST* call;
FuncCParamListAST* funcCParamList;
MulExpAST* mulExp;
AddExpAST* addExp;
RelExpAST* relExp;
EqExpAST* eqExp;
LAndExpAST* lAndExp;
LOrExpAST* lOrExp;
TYPE ty;
UOP op;
string* token;
int int_val;
float float_val;
};
// %union is not used, and %token and %type expect genuine types, not type tags
%type <compUnit> CompUnit;
%type <declDef> DeclDef;
%type <decl> Decl;
%type <defList> DefList;
%type <def> Def;
%type <arrays> Arrays;
%type <initValList> InitValList;
%type <initVal> InitVal;
%type <funcDef> FuncDef;
%type <FuncFParamList> FuncFParamList
%type <funcFParam> FuncFParam;
%type <block> Block;
%type <blockItemList> BlockItemList;
%type <blockItem> BlockItem;
%type <stmt> Stmt;
%type <returnStmt> ReturnStmt;
%type <selectStmt> SelectStmt;
%type <iterationStmt> IterationStmt;
%type <lVal> LVal;
%type <primaryExp> PrimaryExp;
%type <number> Number;
%type <unaryExp> UnaryExp;
%type <call> Call;
%type <funcCParamList> FuncCParamList;
%type <mulExp> MulExp;
%type <addExp> Exp AddExp;
%type <relExp> RelExp;
%type <eqExp> EqExp;
%type <lAndExp> LAndExp;
%type <lOrExp> Cond LOrExp;
%type <ty> BType VoidType
%type <op> UnaryOp
// %token 定义终结符的语义值类型
%token <int_val> INT // 指定INT字面量的语义值是type_int有词法分析得到的数值
%token <float_val> FLOAT // 指定FLOAT字面量的语义值是type_float有词法分析得到的数值
%token <token> ID // 指定ID
%token GTE LTE GT LT EQ NEQ // 关系运算
%token INTTYPE FLOATTYPE VOID // 数据类型
%token CONST RETURN IF ELSE WHILE BREAK CONTINUE
%token LP RP LB RB LC RC COMMA SEMICOLON
// 用bison对该文件编译时带参数-d生成的exp.tab.h中给这些单词进行编码可在lex.l中包含parser.tab.h使用这些单词种类码
%token NOT ASSIGN MINUS ADD MUL DIV MOD AND OR
// Unused tokens
/* %token POS NEG */
%left ASSIGN
%left OR AND
%left EQ NEQ
%left GTE LTE GT LT
%left ADD MINUS
%left MOD MUL DIV
%right NOT
// Unused tokens
/* %right POS NEG */
%nonassoc LOWER_THEN_ELSE
%nonassoc ELSE
%start Program
%%
Program:
CompUnit {
root = unique_ptr<CompUnitAST>($1);
};
// 编译单元
CompUnit:
CompUnit DeclDef {
$$ = $1;
$$->declDefList.push_back(unique_ptr<DeclDefAST>($2));
}|
DeclDef {
$$ = new CompUnitAST();
$$->declDefList.push_back(unique_ptr<DeclDefAST>($1));
};
//声明或者函数定义
DeclDef:
Decl {
$$ = new DeclDefAST();
$$->Decl = unique_ptr<DeclAST>($1);
}|
FuncDef {
$$ = new DeclDefAST();
$$->funcDef = unique_ptr<FuncDefAST>($1);
};
// 变量或常量声明
Decl:
CONST BType DefList SEMICOLON {
$$ = new DeclAST();
$$->isConst = true;
$$->bType = $2;
$$->defList.swap($3->list);
}|
BType DefList SEMICOLON {
$$ = new DeclAST();
$$->isConst = false;
$$->bType = $1;
$$->defList.swap($2->list);
};
// 基本类型
BType:
INTTYPE {
$$ = TYPE_INT;
}|
FLOATTYPE {
$$ = TYPE_FLOAT;
};
// 空类型
VoidType:
VOID {
$$ = TYPE_VOID;
};
// 定义列表
DefList:
Def {
$$ = new DefListAST();
$$->list.push_back(unique_ptr<DefAST>($1));
}|
DefList COMMA Def {
$$ = $1;
$$->list.push_back(unique_ptr<DefAST>($3));
};
// 定义
Def:
ID Arrays ASSIGN InitVal {
$$ = new DefAST();
$$->id = unique_ptr<string>($1);
$$->arrays.swap($2->list);
$$->initVal = unique_ptr<InitValAST>($4);
}|
ID ASSIGN InitVal {
$$ = new DefAST();
$$->id = unique_ptr<string>($1);
$$->initVal = unique_ptr<InitValAST>($3);
}|
ID Arrays {
$$ = new DefAST();
$$->id = unique_ptr<string>($1);
$$->arrays.swap($2->list);
}|
ID {
$$ = new DefAST();
$$->id = unique_ptr<string>($1);
};
// 数组
Arrays:
LB Exp RB {
$$ = new ArraysAST();
$$->list.push_back(unique_ptr<AddExpAST>($2));
}|
Arrays LB Exp RB {
$$ = $1;
$$->list.push_back(unique_ptr<AddExpAST>($3));
};
// 变量或常量初值
InitVal:
Exp {
$$ = new InitValAST();
$$->exp = unique_ptr<AddExpAST>($1);
}|
LC RC {
$$ = new InitValAST();
}|
LC InitValList RC {
$$ = new InitValAST();
$$->initValList.swap($2->list);
};
// 变量列表
InitValList:
InitValList COMMA InitVal {
$$ = $1;
$$->list.push_back(unique_ptr<InitValAST>($3));
}|
InitVal {
$$ = new InitValListAST();
$$->list.push_back(unique_ptr<InitValAST>($1));
};
// 函数定义
FuncDef:
BType ID LP FuncFParamList RP Block {
$$ = new FuncDefAST();
$$->funcType = $1;
$$->id = unique_ptr<string>($2);
$$->funcFParamList.swap($4->list);
$$->block = unique_ptr<BlockAST>($6);
}|
BType ID LP RP Block {
$$ = new FuncDefAST();
$$->funcType = $1;
$$->id = unique_ptr<string>($2);
$$->block = unique_ptr<BlockAST>($5);
}|
VoidType ID LP FuncFParamList RP Block {
$$ = new FuncDefAST();
$$->funcType = $1;
$$->id = unique_ptr<string>($2);
$$->funcFParamList.swap($4->list);
$$->block = unique_ptr<BlockAST>($6);
}|
VoidType ID LP RP Block {
$$ = new FuncDefAST();
$$->funcType = $1;
$$->id = unique_ptr<string>($2);
$$->block = unique_ptr<BlockAST>($5);
};
// 函数形参列表
FuncFParamList:
FuncFParam {
$$ = new FuncFParamListAST();
$$->list.push_back(unique_ptr<FuncFParamAST>($1));
}|
FuncFParamList COMMA FuncFParam {
$$ = $1;
$$->list.push_back(unique_ptr<FuncFParamAST>($3));
};
// 函数形参
FuncFParam:
BType ID {
$$ = new FuncFParamAST();
$$->bType = $1;
$$->id = unique_ptr<string>($2);
$$->isArray = false;
}|
BType ID LB RB {
$$ = new FuncFParamAST();
$$->bType = $1;
$$->id = unique_ptr<string>($2);
$$->isArray = true;
}|
BType ID LB RB Arrays {
$$ = new FuncFParamAST();
$$->bType = $1;
$$->id = unique_ptr<string>($2);
$$->isArray = true;
$$->arrays.swap($5->list);
};
// 语句块
Block:
LC RC {
$$ = new BlockAST();
}|
LC BlockItemList RC {
$$ = new BlockAST();
$$->blockItemList.swap($2->list);
};
// 语句块项列表
BlockItemList:
BlockItem {
$$ = new BlockItemListAST();
$$->list.push_back(unique_ptr<BlockItemAST>($1));
}|
BlockItemList BlockItem {
$$ = $1;
$$->list.push_back(unique_ptr<BlockItemAST>($2));
};
// 语句块项
BlockItem:
Decl {
$$ = new BlockItemAST();
$$->decl = unique_ptr<DeclAST>($1);
}|
Stmt {
$$ = new BlockItemAST();
$$->stmt = unique_ptr<StmtAST>($1);
};
// 语句根据type判断是何种类型的Stmt
Stmt:
SEMICOLON {
$$ = new StmtAST();
$$->sType = SEMI;
}|
LVal ASSIGN Exp SEMICOLON {
$$ = new StmtAST();
$$->sType = ASS;
$$->lVal = unique_ptr<LValAST>($1);
$$->exp = unique_ptr<AddExpAST>($3);
}|
Exp SEMICOLON {
$$ = new StmtAST();
$$->sType = EXP;
$$->exp = unique_ptr<AddExpAST>($1);
}|
CONTINUE SEMICOLON {
$$ = new StmtAST();
$$->sType = CONT;
}|
BREAK SEMICOLON {
$$ = new StmtAST();
$$->sType = BRE;
}|
Block {
$$ = new StmtAST();
$$->sType = BLK;
$$->block = unique_ptr<BlockAST>($1);
}|
ReturnStmt {
$$ = new StmtAST();
$$->sType = RET;
$$->returnStmt = unique_ptr<ReturnStmtAST>($1);
}|
SelectStmt {
$$ = new StmtAST();
$$->sType = SEL;
$$->selectStmt = unique_ptr<SelectStmtAST>($1);
}|
IterationStmt {
$$ = new StmtAST();
$$->sType = ITER;
$$->iterationStmt = unique_ptr<IterationStmtAST>($1);
};
//选择语句
SelectStmt:
IF LP Cond RP Stmt %prec LOWER_THEN_ELSE {
$$ = new SelectStmtAST();
$$->cond = unique_ptr<LOrExpAST>($3);
$$->ifStmt = unique_ptr<StmtAST>($5);
}|
IF LP Cond RP Stmt ELSE Stmt {
$$ = new SelectStmtAST();
$$->cond = unique_ptr<LOrExpAST>($3);
$$->ifStmt = unique_ptr<StmtAST>($5);
$$->elseStmt = unique_ptr<StmtAST>($7);
};
//循环语句
IterationStmt:
WHILE LP Cond RP Stmt {
$$ = new IterationStmtAST();
$$->cond = unique_ptr<LOrExpAST>($3);
$$->stmt = unique_ptr<StmtAST>($5);
};
//返回语句
ReturnStmt:
RETURN Exp SEMICOLON {
$$ = new ReturnStmtAST();
$$->exp = unique_ptr<AddExpAST>($2);
}|
RETURN SEMICOLON {
$$ = new ReturnStmtAST();
};
// 表达式
Exp:
AddExp {
$$ = $1;
};
// 条件表达式
Cond:
LOrExp {
$$ = $1;
};
// 左值表达式
LVal:
ID {
$$ = new LValAST();
$$->id = unique_ptr<string>($1);
}|
ID Arrays {
$$ = new LValAST();
$$->id = unique_ptr<string>($1);
$$->arrays.swap($2->list);
};
// 基本表达式
PrimaryExp:
LP Exp RP {
$$ = new PrimaryExpAST();
$$->exp = unique_ptr<AddExpAST>($2);
}|
LVal {
$$ = new PrimaryExpAST();
$$->lval = unique_ptr<LValAST>($1);
}|
Number {
$$ = new PrimaryExpAST();
$$->number = unique_ptr<NumberAST>($1);
};
// 数值
Number:
INT {
$$ = new NumberAST();
$$->isInt = true;
$$->intval = $1;
}|
FLOAT {
$$ = new NumberAST();
$$->isInt = false;
$$->floatval = $1;
};
// 一元表达式
UnaryExp:
PrimaryExp {
$$ = new UnaryExpAST();
$$->primaryExp = unique_ptr<PrimaryExpAST>($1);
}|
Call {
$$ = new UnaryExpAST();
$$->call = unique_ptr<CallAST>($1);
}|
UnaryOp UnaryExp {
$$ = new UnaryExpAST();
$$->op = $1;
$$->unaryExp = unique_ptr<UnaryExpAST>($2);
};
//函数调用
Call:
ID LP RP {
$$ = new CallAST();
$$->id = unique_ptr<string>($1);
}|
ID LP FuncCParamList RP {
$$ = new CallAST();
$$->id = unique_ptr<string>($1);
$$->funcCParamList.swap($3->list);
};
// 单目运算符,这里可能与优先级相关,不删除该非终结符
UnaryOp:
ADD {
$$ = UOP_ADD;
}|
MINUS {
$$ = UOP_MINUS;
}|
NOT {
$$ = UOP_NOT;
};
// 函数实参表
FuncCParamList:
Exp {
$$ = new FuncCParamListAST();
$$->list.push_back(unique_ptr<AddExpAST>($1));
}|
FuncCParamList COMMA Exp {
$$ = (FuncCParamListAST*) $1;
$$->list.push_back(unique_ptr<AddExpAST>($3));
};
//乘除模表达式
MulExp:
UnaryExp {
$$ = new MulExpAST();
$$->unaryExp = unique_ptr<UnaryExpAST>($1);
}|
MulExp MUL UnaryExp {
$$ = new MulExpAST();
$$->mulExp = unique_ptr<MulExpAST>($1);
$$->op = MOP_MUL;
$$->unaryExp = unique_ptr<UnaryExpAST>($3);
}|
MulExp DIV UnaryExp {
$$ = new MulExpAST();
$$->mulExp = unique_ptr<MulExpAST>($1);
$$->op = MOP_DIV;
$$->unaryExp = unique_ptr<UnaryExpAST>($3);
}|
MulExp MOD UnaryExp {
$$ = new MulExpAST();
$$->mulExp = unique_ptr<MulExpAST>($1);
$$->op = MOP_MOD;
$$->unaryExp = unique_ptr<UnaryExpAST>($3);
};
// 加减表达式
AddExp:
MulExp {
$$ = new AddExpAST();
$$->mulExp = unique_ptr<MulExpAST>($1);
}|
AddExp ADD MulExp {
$$ = new AddExpAST();
$$->addExp = unique_ptr<AddExpAST>($1);
$$->op = AOP_ADD;
$$->mulExp = unique_ptr<MulExpAST>($3);
}|
AddExp MINUS MulExp {
$$ = new AddExpAST();
$$->addExp = unique_ptr<AddExpAST>($1);
$$->op = AOP_MINUS;
$$->mulExp = unique_ptr<MulExpAST>($3);
};
// 关系表达式
RelExp:
AddExp {
$$ = new RelExpAST();
$$->addExp = unique_ptr<AddExpAST>($1);
}|
RelExp GTE AddExp {
$$ = new RelExpAST();
$$->relExp = unique_ptr<RelExpAST>($1);
$$->op = ROP_GTE;
$$->addExp = unique_ptr<AddExpAST>($3);
}|
RelExp LTE AddExp {
$$ = new RelExpAST();
$$->relExp = unique_ptr<RelExpAST>($1);
$$->op = ROP_LTE;
$$->addExp = unique_ptr<AddExpAST>($3);
}|
RelExp GT AddExp {
$$ = new RelExpAST();
$$->relExp = unique_ptr<RelExpAST>($1);
$$->op = ROP_GT;
$$->addExp = unique_ptr<AddExpAST>($3);
}|
RelExp LT AddExp {
$$ = new RelExpAST();
$$->relExp = unique_ptr<RelExpAST>($1);
$$->op = ROP_LT;
$$->addExp = unique_ptr<AddExpAST>($3);
};
// 相等性表达式
EqExp:
RelExp {
$$ = new EqExpAST();
$$->relExp = unique_ptr<RelExpAST>($1);
}|
EqExp EQ RelExp {
$$ = new EqExpAST();
$$->eqExp = unique_ptr<EqExpAST>($1);
$$->op = EOP_EQ;
$$->relExp = unique_ptr<RelExpAST>($3);
}|
EqExp NEQ RelExp {
$$ = new EqExpAST();
$$->eqExp = unique_ptr<EqExpAST>($1);
$$->op = EOP_NEQ;
$$->relExp = unique_ptr<RelExpAST>($3);
};
// 逻辑与表达式
LAndExp:
EqExp {
$$ = new LAndExpAST();
$$->eqExp = unique_ptr<EqExpAST>($1);
}|
LAndExp AND EqExp {
$$ = new LAndExpAST();
$$->lAndExp = unique_ptr<LAndExpAST>($1);
$$->eqExp = unique_ptr<EqExpAST>($3);
};
// 逻辑或表达式
LOrExp:
LAndExp {
$$ = new LOrExpAST();
$$->lAndExp = unique_ptr<LAndExpAST>($1);
}|
LOrExp OR LAndExp {
$$ = new LOrExpAST();
$$->lOrExp = unique_ptr<LOrExpAST>($1);
$$->lAndExp = unique_ptr<LAndExpAST>($3);
};
%%
void initFileName(char *name) {
strcpy(filename, name);
}
void yyerror(const char* fmt) {
printf("%s:%d ", filename, yylloc.first_line);
printf("%s\n", fmt);
}

File diff suppressed because it is too large Load Diff

@ -1,477 +0,0 @@
#ifndef yyHEADER_H
#define yyHEADER_H 1
#define yyIN_HEADER 1
#line 5 "/home/seas0/Codes/compiler/carrotcompiler/src/parser/tokens.hpp"
#line 7 "/home/seas0/Codes/compiler/carrotcompiler/src/parser/tokens.hpp"
#define YY_INT_ALIGNED short int
/* A lexical scanner generated by flex */
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 6
#define YY_FLEX_SUBMINOR_VERSION 4
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
/* First, we deal with platform-specific or compiler-specific issues. */
/* begin standard C headers. */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
/* end standard C headers. */
/* flex integer type definitions */
#ifndef FLEXINT_H
#define FLEXINT_H
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
* if you want the limit (max/min) macros for int types.
*/
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
#endif
#include <inttypes.h>
typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
/* Limits of integral types. */
#ifndef INT8_MIN
#define INT8_MIN (-128)
#endif
#ifndef INT16_MIN
#define INT16_MIN (-32767-1)
#endif
#ifndef INT32_MIN
#define INT32_MIN (-2147483647-1)
#endif
#ifndef INT8_MAX
#define INT8_MAX (127)
#endif
#ifndef INT16_MAX
#define INT16_MAX (32767)
#endif
#ifndef INT32_MAX
#define INT32_MAX (2147483647)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX (255U)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX (65535U)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX (4294967295U)
#endif
#ifndef SIZE_MAX
#define SIZE_MAX (~(size_t)0)
#endif
#endif /* ! C99 */
#endif /* ! FLEXINT_H */
/* begin standard C++ headers. */
/* TODO: this is always defined, so inline it */
#define yyconst const
#if defined(__GNUC__) && __GNUC__ >= 3
#define yynoreturn __attribute__((__noreturn__))
#else
#define yynoreturn
#endif
/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k.
* Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
* Ditto for the __ia64__ case accordingly.
*/
#define YY_BUF_SIZE 32768
#else
#define YY_BUF_SIZE 16384
#endif /* __ia64__ */
#endif
#ifndef YY_TYPEDEF_YY_BUFFER_STATE
#define YY_TYPEDEF_YY_BUFFER_STATE
typedef struct yy_buffer_state *YY_BUFFER_STATE;
#endif
#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif
extern int yyleng;
extern FILE *yyin, *yyout;
#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
{
FILE *yy_input_file;
char *yy_ch_buf; /* input buffer */
char *yy_buf_pos; /* current position in input buffer */
/* Size of input buffer in bytes, not including room for EOB
* characters.
*/
int yy_buf_size;
/* Number of characters read into yy_ch_buf, not including EOB
* characters.
*/
int yy_n_chars;
/* Whether we "own" the buffer - i.e., we know we created it,
* and can realloc() it to grow it, and should free() it to
* delete it.
*/
int yy_is_our_buffer;
/* Whether this is an "interactive" input source; if so, and
* if we're using stdio for input, then we want to use getc()
* instead of fread(), to make sure we stop fetching input after
* each newline.
*/
int yy_is_interactive;
/* Whether we're considered to be at the beginning of a line.
* If so, '^' rules will be active on the next match, otherwise
* not.
*/
int yy_at_bol;
int yy_bs_lineno; /**< The line count. */
int yy_bs_column; /**< The column count. */
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
int yy_fill_buffer;
int yy_buffer_status;
};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */
void yyrestart ( FILE *input_file );
void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer );
YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size );
void yy_delete_buffer ( YY_BUFFER_STATE b );
void yy_flush_buffer ( YY_BUFFER_STATE b );
void yypush_buffer_state ( YY_BUFFER_STATE new_buffer );
void yypop_buffer_state ( void );
YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size );
YY_BUFFER_STATE yy_scan_string ( const char *yy_str );
YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len );
void *yyalloc ( yy_size_t );
void *yyrealloc ( void *, yy_size_t );
void yyfree ( void * );
/* Begin user sect3 */
#define yywrap() (/*CONSTCOND*/1)
#define YY_SKIP_YYWRAP
extern int yylineno;
extern char *yytext;
#ifdef yytext_ptr
#undef yytext_ptr
#endif
#define yytext_ptr yytext
#ifdef YY_HEADER_EXPORT_START_CONDITIONS
#define INITIAL 0
#endif
#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
* down here because we want the user's section 1 to have been scanned first.
* The user has a chance to override it with an option.
*/
#include <unistd.h>
#endif
#ifndef YY_EXTRA_TYPE
#define YY_EXTRA_TYPE void *
#endif
/* Accessor methods to globals.
These are made visible to non-reentrant scanners for convenience. */
int yylex_destroy ( void );
int yyget_debug ( void );
void yyset_debug ( int debug_flag );
YY_EXTRA_TYPE yyget_extra ( void );
void yyset_extra ( YY_EXTRA_TYPE user_defined );
FILE *yyget_in ( void );
void yyset_in ( FILE * _in_str );
FILE *yyget_out ( void );
void yyset_out ( FILE * _out_str );
int yyget_leng ( void );
char *yyget_text ( void );
int yyget_lineno ( void );
void yyset_lineno ( int _line_number );
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int yywrap ( void );
#else
extern int yywrap ( void );
#endif
#endif
#ifndef yytext_ptr
static void yy_flex_strncpy ( char *, const char *, int );
#endif
#ifdef YY_NEED_STRLEN
static int yy_flex_strlen ( const char * );
#endif
#ifndef YY_NO_INPUT
#endif
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k */
#define YY_READ_BUF_SIZE 16384
#else
#define YY_READ_BUF_SIZE 8192
#endif /* __ia64__ */
#endif
/* Number of entries by which start-condition stack grows. */
#ifndef YY_START_STACK_INCR
#define YY_START_STACK_INCR 25
#endif
/* Default declaration of generated scanner - a define so the user can
* easily add parameters.
*/
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1
extern int yylex (void);
#define YY_DECL int yylex (void)
#endif /* !YY_DECL */
/* yy_get_previous_state - get the state just before the EOB char was reached */
#undef YY_NEW_FILE
#undef YY_FLUSH_BUFFER
#undef yy_set_bol
#undef yy_new_buffer
#undef yy_set_interactive
#undef YY_DO_BEFORE_ACTION
#ifdef YY_DECL_IS_OURS
#undef YY_DECL_IS_OURS
#undef YY_DECL
#endif
#ifndef yy_create_buffer_ALREADY_DEFINED
#undef yy_create_buffer
#endif
#ifndef yy_delete_buffer_ALREADY_DEFINED
#undef yy_delete_buffer
#endif
#ifndef yy_scan_buffer_ALREADY_DEFINED
#undef yy_scan_buffer
#endif
#ifndef yy_scan_string_ALREADY_DEFINED
#undef yy_scan_string
#endif
#ifndef yy_scan_bytes_ALREADY_DEFINED
#undef yy_scan_bytes
#endif
#ifndef yy_init_buffer_ALREADY_DEFINED
#undef yy_init_buffer
#endif
#ifndef yy_flush_buffer_ALREADY_DEFINED
#undef yy_flush_buffer
#endif
#ifndef yy_load_buffer_state_ALREADY_DEFINED
#undef yy_load_buffer_state
#endif
#ifndef yy_switch_to_buffer_ALREADY_DEFINED
#undef yy_switch_to_buffer
#endif
#ifndef yypush_buffer_state_ALREADY_DEFINED
#undef yypush_buffer_state
#endif
#ifndef yypop_buffer_state_ALREADY_DEFINED
#undef yypop_buffer_state
#endif
#ifndef yyensure_buffer_stack_ALREADY_DEFINED
#undef yyensure_buffer_stack
#endif
#ifndef yylex_ALREADY_DEFINED
#undef yylex
#endif
#ifndef yyrestart_ALREADY_DEFINED
#undef yyrestart
#endif
#ifndef yylex_init_ALREADY_DEFINED
#undef yylex_init
#endif
#ifndef yylex_init_extra_ALREADY_DEFINED
#undef yylex_init_extra
#endif
#ifndef yylex_destroy_ALREADY_DEFINED
#undef yylex_destroy
#endif
#ifndef yyget_debug_ALREADY_DEFINED
#undef yyget_debug
#endif
#ifndef yyset_debug_ALREADY_DEFINED
#undef yyset_debug
#endif
#ifndef yyget_extra_ALREADY_DEFINED
#undef yyget_extra
#endif
#ifndef yyset_extra_ALREADY_DEFINED
#undef yyset_extra
#endif
#ifndef yyget_in_ALREADY_DEFINED
#undef yyget_in
#endif
#ifndef yyset_in_ALREADY_DEFINED
#undef yyset_in
#endif
#ifndef yyget_out_ALREADY_DEFINED
#undef yyget_out
#endif
#ifndef yyset_out_ALREADY_DEFINED
#undef yyset_out
#endif
#ifndef yyget_leng_ALREADY_DEFINED
#undef yyget_leng
#endif
#ifndef yyget_text_ALREADY_DEFINED
#undef yyget_text
#endif
#ifndef yyget_lineno_ALREADY_DEFINED
#undef yyget_lineno
#endif
#ifndef yyset_lineno_ALREADY_DEFINED
#undef yyset_lineno
#endif
#ifndef yyget_column_ALREADY_DEFINED
#undef yyget_column
#endif
#ifndef yyset_column_ALREADY_DEFINED
#undef yyset_column
#endif
#ifndef yywrap_ALREADY_DEFINED
#undef yywrap
#endif
#ifndef yyget_lval_ALREADY_DEFINED
#undef yyget_lval
#endif
#ifndef yyset_lval_ALREADY_DEFINED
#undef yyset_lval
#endif
#ifndef yyget_lloc_ALREADY_DEFINED
#undef yyget_lloc
#endif
#ifndef yyset_lloc_ALREADY_DEFINED
#undef yyset_lloc
#endif
#ifndef yyalloc_ALREADY_DEFINED
#undef yyalloc
#endif
#ifndef yyrealloc_ALREADY_DEFINED
#undef yyrealloc
#endif
#ifndef yyfree_ALREADY_DEFINED
#undef yyfree
#endif
#ifndef yytext_ALREADY_DEFINED
#undef yytext
#endif
#ifndef yyleng_ALREADY_DEFINED
#undef yyleng
#endif
#ifndef yyin_ALREADY_DEFINED
#undef yyin
#endif
#ifndef yyout_ALREADY_DEFINED
#undef yyout
#endif
#ifndef yy_flex_debug_ALREADY_DEFINED
#undef yy_flex_debug
#endif
#ifndef yylineno_ALREADY_DEFINED
#undef yylineno
#endif
#ifndef yytables_fload_ALREADY_DEFINED
#undef yytables_fload
#endif
#ifndef yytables_destroy_ALREADY_DEFINED
#undef yytables_destroy
#endif
#ifndef yyTABLES_NAME_ALREADY_DEFINED
#undef yyTABLES_NAME
#endif
#line 95 "/home/seas0/Codes/compiler/carrotcompiler/src/parser/tokens.l"
#line 475 "/home/seas0/Codes/compiler/carrotcompiler/src/parser/tokens.hpp"
#undef yyIN_HEADER
#endif /* yyHEADER_H */

@ -1,95 +0,0 @@
%option noyywrap
%{
#include <string>
#include "ast.h"
#include "parser.hpp"
//extern "C" int yywrap() {}
int yycolumn=1;
#define YY_USER_ACTION yylloc.first_line=yylloc.last_line=yylineno; \
yylloc.first_column=yycolumn; yylloc.last_column=yycolumn+yyleng-1; yycolumn+=yyleng;
%}
%option yylineno
ID [a-z_A-Z][a-z_A-Z0-9]*
INT_LIT ([1-9][0-9]*|0[0-7]*|(0x|0X)[0-9a-fA-F]+)
/* TODO: Float rules is direct copied from C
* maybe shrinking down is needed?
*/
FLOAT_SUFFIX [fFlL]
DEC_EXP ([Ee][-+]?[0-9]+)
DEC_FLOAT_LIT_HAVE_POINT_HAVE_RIGHT ([0-9]*\.[0-9]+{DEC_EXP}?{FLOAT_SUFFIX}?)
DEC_FLOAT_LIT_HAVE_POINT_NO_RIGHT ([0-9]+\.{DEC_EXP}?{FLOAT_SUFFIX}?)
DEC_FLOAT_LIT_NO_POINT ([0-9]+{DEC_EXP}{FLOAT_SUFFIX}?)
DEC_FLOAT_LIT ({DEC_FLOAT_LIT_HAVE_POINT_HAVE_RIGHT}|{DEC_FLOAT_LIT_HAVE_POINT_NO_RIGHT}|{DEC_FLOAT_LIT_NO_POINT})
HEX_EXP ([Pp][-+]?[0-9]+)
HEX_FLOAT_LIT_HAVE_POINT_HAVE_RIGHT ((0[xX])[a-fA-F0-9]*\.[a-fA-F0-9]+{HEX_EXP}{FLOAT_SUFFIX}?)
HEX_FLOAT_LIT_HAVE_POINT_NO_RIGHT ((0[xX])[a-fA-F0-9]+\.{HEX_EXP}{FLOAT_SUFFIX}?)
HEX_FLOAT_LIT_NO_POINT ((0[xX])[a-fA-F0-9]+{HEX_EXP}{FLOAT_SUFFIX}?)
HEX_FLOAT_LIT ({HEX_FLOAT_LIT_HAVE_POINT_HAVE_RIGHT}|{HEX_FLOAT_LIT_HAVE_POINT_NO_RIGHT}|{HEX_FLOAT_LIT_NO_POINT})
FLOAT_LIT ({DEC_FLOAT_LIT}|{HEX_FLOAT_LIT})
/* EXP ([Ee][-+]?[0-9]+) */
/* FLOAT (([0-9]*\.[0-9]+|[0-9]+\.){EXP}?[fF]?)|[0-9]+{EXP}[fF]? */
SingleLineComment "//".*
MultilineComment "/*"([^\*]|(\*)*[^\*/])*(\*)*"*/"
/* Invalid ([0-9]+[A-Za-z]+[0-9]*|0[0-9]*[8-9]+[0-9]*) */
%%
{INT_LIT} {yylval.int_val = strtol(yytext, nullptr, 0); return INT;}
{FLOAT_LIT} {yylval.float_val = strtof(yytext, nullptr); return FLOAT;}
"int" {return INTTYPE;}
"float" {return FLOATTYPE;}
"void" {return VOID;}
"const" {return CONST;}
"return" {return RETURN;}
"if" {return IF;}
"else" {return ELSE;}
"while" {return WHILE;}
"break" {return BREAK;}
"continue" {return CONTINUE;}
{ID} {yylval.token = new string(yytext); return ID;}
">=" {return GTE;}
"<=" {return LTE;}
">" {return GT;}
"<" {return LT;}
"==" {return EQ;}
"!=" {return NEQ;}
"(" {return LP;}
")" {return RP;}
"[" {return LB;}
"]" {return RB;}
"{" {return LC;}
"}" {return RC;}
"," {return COMMA;}
";" {return SEMICOLON;}
"!" {return NOT;}
"=" {return ASSIGN;}
"-" {return MINUS;}
"+" {return ADD;}
"*" {return MUL;}
"/" {return DIV;}
"%" {return MOD;}
"&&" {return AND;}
"||" {return OR;}
[\n] {yycolumn=1;}
[ \r\t] {/* Ignore useless whitespaces */}
{SingleLineComment} {/* Ignore Comments */}
{MultilineComment} {/* Ignore Comments */}
. {printf("Error type A :Mysterious character \"%s\"\n\t at Line %d\n", yytext, yylineno);}
%%

@ -1,3 +0,0 @@
set(SOURCE_FILES utils.cpp)
add_library(utils ${SOURCE_FILES})

@ -1 +0,0 @@
// Currently a dummy file

@ -1,102 +0,0 @@
101
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

@ -1,101 +0,0 @@
100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

@ -1,212 +0,0 @@
int main() {
int a, res, n;
n = getint();
int i = 0;
while (i < n){
res = 0;
a = getint();
if (a > 0 && a < 100)
if (a > 0 && a < 99)
if (a > 0 && a < 98)
if (a > 0 && a < 97)
if (a > 0 && a < 96)
if (a > 0 && a < 95)
if (a > 0 && a < 94)
if (a > 0 && a < 93)
if (a > 0 && a < 92)
if (a > 0 && a < 91)
if (a > 0 && a < 90)
if (a > 0 && a < 89)
if (a > 0 && a < 88)
if (a > 0 && a < 87)
if (a > 0 && a < 86)
if (a > 0 && a < 85)
if (a > 0 && a < 84)
if (a > 0 && a < 83)
if (a > 0 && a < 82)
if (a > 0 && a < 81)
if (a > 0 && a < 80)
if (a > 0 && a < 79)
if (a > 0 && a < 78)
if (a > 0 && a < 77)
if (a > 0 && a < 76)
if (a > 0 && a < 75)
if (a > 0 && a < 74)
if (a > 0 && a < 73)
if (a > 0 && a < 72)
if (a > 0 && a < 71)
if (a > 0 && a < 70)
if (a > 0 && a < 69)
if (a > 0 && a < 68)
if (a > 0 && a < 67)
if (a > 0 && a < 66)
if (a > 0 && a < 65)
if (a > 0 && a < 64)
if (a > 0 && a < 63)
if (a > 0 && a < 62)
if (a > 0 && a < 61)
if (a > 0 && a < 60)
if (a > 0 && a < 59)
if (a > 0 && a < 58)
if (a > 0 && a < 57)
if (a > 0 && a < 56)
if (a > 0 && a < 55)
if (a > 0 && a < 54)
if (a > 0 && a < 53)
if (a > 0 && a < 52)
if (a > 0 && a < 51)
if (a > 0 && a < 50)
if (a > 0 && a < 49)
if (a > 0 && a < 48)
if (a > 0 && a < 47)
if (a > 0 && a < 46)
if (a > 0 && a < 45)
if (a > 0 && a < 44)
if (a > 0 && a < 43)
if (a > 0 && a < 42)
if (a > 0 && a < 41)
if (a > 0 && a < 40)
if (a > 0 && a < 39)
if (a > 0 && a < 38)
if (a > 0 && a < 37)
if (a > 0 && a < 36)
if (a > 0 && a < 35)
if (a > 0 && a < 34)
if (a > 0 && a < 33)
if (a > 0 && a < 32)
if (a > 0 && a < 31)
if (a > 0 && a < 30)
if (a > 0 && a < 29)
if (a > 0 && a < 28)
if (a > 0 && a < 27)
if (a > 0 && a < 26)
if (a > 0 && a < 25)
if (a > 0 && a < 24)
if (a > 0 && a < 23)
if (a > 0 && a < 22)
if (a > 0 && a < 21)
if (a > 0 && a < 20)
if (a > 0 && a < 19)
if (a > 0 && a < 18)
if (a > 0 && a < 17)
if (a > 0 && a < 16)
if (a > 0 && a < 15)
if (a > 0 && a < 14)
if (a > 0 && a < 13)
if (a > 0 && a < 12)
if (a > 0 && a < 11)
if (a > 0 && a < 10)
if (a > 0 && a < 9)
if (a > 0 && a < 8)
if (a > 0 && a < 7)
if (a > 0 && a < 6)
if (a > 0 && a < 5)
if (a > 0 && a < 4)
if (a > 0 && a < 3)
if (a > 0 && a < 2)
res = res + 1;
else res = res + 2;
else res = res + 3;
else res = res + 4;
else res = res + 5;
else res = res + 6;
else res = res + 7;
else res = res + 8;
else res = res + 9;
else res = res + 10;
else res = res + 11;
else res = res + 12;
else res = res + 13;
else res = res + 14;
else res = res + 15;
else res = res + 16;
else res = res + 17;
else res = res + 18;
else res = res + 19;
else res = res + 20;
else res = res + 21;
else res = res + 22;
else res = res + 23;
else res = res + 24;
else res = res + 25;
else res = res + 26;
else res = res + 27;
else res = res + 28;
else res = res + 29;
else res = res + 30;
else res = res + 31;
else res = res + 32;
else res = res + 33;
else res = res + 34;
else res = res + 35;
else res = res + 36;
else res = res + 37;
else res = res + 38;
else res = res + 39;
else res = res + 40;
else res = res + 41;
else res = res + 42;
else res = res + 43;
else res = res + 44;
else res = res + 45;
else res = res + 46;
else res = res + 47;
else res = res + 48;
else res = res + 49;
else res = res + 50;
else res = res + 51;
else res = res + 52;
else res = res + 53;
else res = res + 54;
else res = res + 55;
else res = res + 56;
else res = res + 57;
else res = res + 58;
else res = res + 59;
else res = res + 60;
else res = res + 61;
else res = res + 62;
else res = res + 63;
else res = res + 64;
else res = res + 65;
else res = res + 66;
else res = res + 67;
else res = res + 68;
else res = res + 69;
else res = res + 70;
else res = res + 71;
else res = res + 72;
else res = res + 73;
else res = res + 74;
else res = res + 75;
else res = res + 76;
else res = res + 77;
else res = res + 78;
else res = res + 79;
else res = res + 80;
else res = res + 81;
else res = res + 82;
else res = res + 83;
else res = res + 84;
else res = res + 85;
else res = res + 86;
else res = res + 87;
else res = res + 88;
else res = res + 89;
else res = res + 90;
else res = res + 91;
else res = res + 92;
else res = res + 93;
else res = res + 94;
else res = res + 95;
else res = res + 96;
else res = res + 97;
else res = res + 98;
else res = res + 99;
else res = res + 100;
putint(res);
putch(10);
i = i + 1;
}
return 0;
}

@ -1,4 +0,0 @@
3
0x1.199999999999ap+0 0x1.a666666666666p+1
-0x1.199999999999ap+1 0x1.199999999999ap+2
0x1.a666666666666p+1 -0x1.6000000000000p+2

@ -1,3 +0,0 @@
0x1.19999ap+0 0x1.35c29p+0 0x1.0c7ebcp+0 0x1.8089d8p+1 0x1.8663fep-4 0x1.90dabep+3 0x1.5ea04ap+0
0x1.19999ap+1 0x1.35c29p+2 -0x1.241baep+4 0x1.c5d666p-4 - - -
0x1.a66666p+1 0x1.5c7aep+3 0x1.d10c0ep+0 0x1.b1c9f2p+4 0x1.31a4e8p+0 - 0x1.70c228p-10

@ -1,111 +0,0 @@
// reference: https://zhuanlan.zhihu.com/p/20085048
const float e = 2.718281828459045;
float my_fabs(float x) {
if (x > 0) return x;
return -x;
}
float my_pow(float a, int n) {
if (n < 0) return 1 / my_pow(a, -n);
float res = 1.0;
while (n) {
if (n % 2) res = res * a;
a = a * a;
n = n / 2;
}
return res;
}
float my_sqrt(float x) {
if (x > 100) return 10.0 * my_sqrt(x / 100);
float t = x / 8 + 0.5 + 2 * x / (4 + x);
int c = 10;
while (c) {
t = (t + x / t) / 2;
c = c - 1;
}
return t;
}
float F1(float x) { return 1 / x; }
float F2(float x) { return 1 / my_sqrt(1 - x * x); }
float simpson(float a, float b, int flag) {
float c = a + (b - a) / 2;
if (flag == 1) return (F1(a) + 4 * F1(c) + F1(b)) * (b - a) / 6;
if (flag == 2) return (F2(a) + 4 * F2(c) + F2(b)) * (b - a) / 6;
return 0;
}
float asr5(float a, float b, float eps, float A, int flag) {
float c = a + (b - a) / 2;
float L = simpson(a, c, flag), R = simpson(c, b, flag);
if (my_fabs(L + R - A) <= 15 * eps) return L + R + (L + R - A) / 15.0;
return asr5(a, c, eps / 2, L, flag) + asr5(c, b, eps / 2, R, flag);
}
float asr4(float a, float b, float eps, int flag) {
return asr5(a, b, eps, simpson(a, b, flag), flag);
}
float eee(float x) {
if (x > 1e-3) {
float ee = eee(x / 2);
return ee * ee;
}
return 1 + x + x * x / 2 + my_pow(x, 3) / 6 + my_pow(x, 4) / 24 +
my_pow(x, 5) / 120;
}
float my_exp(float x) {
if (x < 0) return 1 / my_exp(-x);
int n = x;
x = x - n;
float e1 = my_pow(e, n);
float e2 = eee(x);
return e1 * e2;
}
float my_ln(float x) { return asr4(1, x, 1e-8, 1); }
float my_log(float a, float N) { return my_ln(N) / my_ln(a); }
float my_powf(float a, float x) { return my_exp(x * my_ln(a)); }
int main() {
int num = getint();
while (num) {
float x = getfloat(), y = getfloat();
putfloat(my_fabs(x));
putch(32);
putfloat(my_pow(x, 2));
putch(32);
putfloat(my_sqrt(x));
putch(32);
putfloat(my_exp(x));
putch(32);
if (x > 0) {
putfloat(my_ln(x));
} else {
putch(45);
}
putch(32);
if (x > 0 && y > 0) {
putfloat(my_log(x, y));
} else {
putch(45);
}
putch(32);
if (x > 0) {
putfloat(my_powf(x, y));
} else {
putch(45);
}
putch(10);
num = num - 1;
}
return 0;
}

@ -1,195 +0,0 @@
-0x1.0c152382d7365p-1
P2
192 192 255
131 133 133 132 133 132 132 132 133 132 132 133 132 132 132 133 133 132 132 132 133 133 132 132 133 133 132 132 133 132 133 133 132 132 133 130 134 139 138 138 139 136 134 141 143 133 133 131 131 131 131 132 132 131 132 132 133 133 133 132 133 133 132 132 132 132 132 132 132 132 133 132 133 133 132 133 132 133 132 132 133 133 133 132 133 132 132 132 133 133 132 132 132 133 132 132 132 132 133 133 132 133 132 133 132 133 133 132 132 133 132 132 132 133 132 133 132 133 132 132 132 133 132 132 133 132 132 133 132 132 133 133 133 132 132 133 132 132 133 132 133 132 132 132 133 133 133 132 133 133 132 133 132 133 133 133 132 132 133 132 132 133 132 132 132 132 133 133 133 132 132 133 132 133 132 133 133 132 132 132 133 133 133 132 132 132 132 132 132 133 132 133
132 132 133 132 133 132 133 132 132 133 132 132 133 132 132 133 132 132 132 132 133 132 132 133 132 132 132 132 133 132 133 132 133 133 132 132 131 140 141 137 138 138 136 136 140 140 132 131 132 132 131 131 132 132 132 132 132 132 133 132 133 132 132 133 133 133 132 132 133 132 133 132 133 132 132 132 133 133 132 133 133 132 133 132 132 133 133 133 133 132 133 133 133 132 132 132 133 132 132 132 133 133 132 133 133 133 132 132 133 132 132 133 133 132 132 133 133 133 133 132 132 133 132 132 132 133 132 132 132 133 133 133 132 133 132 133 132 132 132 132 133 133 133 133 132 132 133 132 132 133 133 132 132 133 132 132 132 132 132 132 132 132 133 132 132 133 132 132 133 133 132 132 132 132 132 132 133 132 132 132 132 132 133 132 132 132 132 132 132 132 132 132
132 132 132 133 132 132 132 132 132 132 132 132 132 132 133 133 133 133 132 133 132 132 133 133 133 132 132 133 132 132 133 132 132 132 132 132 131 134 140 138 138 140 138 135 137 142 135 132 132 132 131 133 135 134 133 133 132 133 132 132 132 132 133 133 132 133 133 132 133 132 133 133 132 132 132 132 133 132 132 133 132 132 132 133 132 133 133 132 133 132 132 132 132 133 133 132 132 132 132 132 133 133 132 132 132 132 132 133 133 132 132 133 132 132 132 132 132 133 132 132 132 132 132 133 132 133 133 133 132 133 132 132 132 132 133 133 133 132 132 132 132 133 133 132 133 132 132 132 133 133 133 133 133 132 132 132 133 133 132 132 132 132 133 132 133 133 132 132 133 133 132 132 133 132 133 132 132 132 133 132 132 132 132 132 133 132 133 132 133 132 132 132
132 132 132 132 133 132 133 132 133 133 132 133 133 133 133 132 132 133 132 132 132 133 133 132 133 132 132 133 132 132 132 132 132 132 133 132 132 131 138 141 138 137 140 136 135 138 138 132 132 133 133 135 136 134 133 133 132 132 133 133 133 133 133 133 132 133 132 133 133 133 132 133 133 133 133 132 133 132 132 132 133 133 133 132 132 132 133 133 132 133 132 132 133 132 133 133 132 132 132 132 132 133 132 132 132 132 132 132 132 132 132 133 133 132 132 133 132 132 133 132 132 132 133 133 133 133 132 132 133 133 132 132 132 132 132 133 132 132 132 132 132 132 132 132 132 132 132 132 132 133 133 132 132 132 132 133 132 133 132 132 133 133 132 132 133 132 132 132 132 133 133 132 132 132 132 133 132 132 133 132 133 132 132 132 133 132 132 133 132 132 133 133
132 132 132 132 132 133 132 133 132 132 132 132 132 132 133 133 133 132 133 132 132 132 132 133 132 133 133 132 132 133 132 132 133 133 132 133 132 131 133 140 141 138 140 138 135 137 140 137 131 132 132 133 136 135 133 132 132 132 132 132 133 133 132 133 133 132 132 133 132 133 133 132 133 132 133 132 132 133 133 133 133 132 133 132 133 133 132 132 132 132 133 132 133 133 132 132 132 133 132 133 133 132 132 133 132 132 132 132 133 132 132 132 132 133 133 133 132 132 133 133 133 132 132 133 132 132 133 132 132 132 133 133 133 132 132 133 133 132 132 132 132 132 132 133 133 133 132 132 133 133 132 133 133 133 132 133 132 132 132 133 132 132 132 132 132 132 132 133 132 133 132 133 132 133 132 133 132 133 133 133 133 132 133 132 133 132 132 133 132 132 133 133
132 132 132 132 132 132 133 132 132 133 132 132 132 133 133 133 133 133 132 133 132 132 132 132 132 132 133 132 132 133 133 132 132 133 133 133 133 133 132 135 142 140 137 139 137 135 138 141 135 132 133 133 134 136 133 131 131 132 133 132 133 133 133 132 132 132 133 132 133 133 133 133 132 133 132 133 133 133 133 132 132 132 132 132 132 133 133 133 133 132 133 132 132 132 132 132 132 132 132 133 132 133 132 133 132 132 132 133 132 133 133 132 133 132 133 132 133 132 133 132 132 132 133 133 132 132 133 133 133 132 133 132 132 132 132 133 132 133 133 132 132 133 132 132 133 132 132 132 132 132 133 132 133 132 133 133 132 132 132 133 132 132 132 132 132 133 132 133 132 132 132 132 132 132 132 132 133 132 133 133 133 132 133 133 133 132 132 132 132 132 132 132
133 132 133 133 132 132 133 133 132 132 132 132 132 132 133 133 133 133 132 133 132 133 132 133 132 132 132 133 133 132 133 132 133 133 133 133 132 133 132 131 137 142 139 137 138 135 136 141 141 132 133 133 132 134 135 130 132 132 133 132 132 132 132 133 132 133 133 132 133 132 132 133 133 133 132 132 133 133 132 132 132 133 132 132 132 133 132 132 133 133 132 132 132 133 133 133 133 132 133 133 132 132 132 132 132 132 132 133 133 133 133 132 132 132 133 133 132 133 132 132 132 133 133 132 132 132 132 133 132 133 132 133 132 133 132 132 132 132 132 132 132 132 132 132 132 133 132 133 133 132 132 132 132 133 132 133 133 133 133 132 132 133 133 132 132 132 133 132 132 132 133 132 132 132 133 132 132 132 132 132 133 133 132 133 132 132 133 132 132 133 133 132
133 133 132 132 133 133 132 133 133 133 133 132 132 132 132 133 132 133 132 133 133 133 133 132 133 133 133 133 132 132 133 132 133 132 132 133 132 132 132 132 134 140 142 139 139 141 137 139 142 136 130 134 131 134 138 133 131 133 132 133 133 132 133 133 132 132 132 132 133 132 133 132 132 133 132 132 133 133 133 133 133 132 132 132 132 132 132 133 132 132 132 132 132 132 133 133 132 133 132 133 132 132 132 132 132 133 132 133 133 132 132 132 132 132 133 132 133 132 132 132 132 133 132 133 133 132 132 133 132 132 132 133 133 132 132 132 132 132 132 133 132 132 133 133 133 132 133 133 132 133 132 133 133 132 133 132 132 133 133 132 133 132 133 132 132 132 133 133 133 132 133 132 133 133 132 132 132 132 132 132 132 132 132 132 133 132 132 132 133 132 132 133
132 132 132 132 133 132 133 132 132 132 132 133 133 132 132 132 133 132 133 132 132 133 132 132 132 133 132 133 133 133 133 132 132 132 133 132 133 133 132 132 131 133 137 138 137 141 138 135 139 141 133 132 134 134 138 136 131 132 133 132 133 132 132 133 133 132 133 132 132 133 132 132 133 133 132 132 133 136 137 134 133 133 134 133 132 132 132 133 133 132 132 132 132 132 133 133 133 132 132 132 132 133 133 133 132 133 132 132 133 132 133 132 133 132 132 132 133 132 133 132 132 132 133 132 133 132 132 132 133 132 132 132 133 133 132 133 132 133 133 133 132 132 133 132 132 133 132 133 133 133 132 133 132 132 132 133 132 132 132 132 135 133 132 132 133 133 132 132 133 133 132 133 132 132 132 133 132 132 132 132 132 132 132 132 132 133 132 133 132 132 133 133
133 132 132 132 133 133 132 132 132 132 132 132 132 133 132 133 133 133 132 132 133 133 132 132 132 132 132 132 132 132 132 132 132 132 132 132 133 132 133 132 131 131 139 141 138 137 141 136 137 141 139 132 133 134 134 138 134 131 132 132 132 133 132 133 133 133 132 133 132 133 132 133 132 132 133 132 132 135 138 136 132 133 133 132 132 132 132 133 132 132 133 133 133 132 133 133 132 132 132 133 132 132 133 132 133 132 132 133 132 133 132 132 132 132 132 132 132 133 133 133 133 132 132 132 133 133 132 133 132 132 133 132 132 132 133 132 132 133 132 132 132 133 132 133 133 132 133 132 133 132 132 133 133 132 133 132 132 133 132 134 134 135 132 133 132 133 133 132 133 132 132 133 133 132 132 133 133 133 132 132 132 132 133 133 132 132 132 132 132 132 132 132
132 133 132 132 132 133 132 133 132 132 133 132 132 133 133 132 133 133 133 132 133 133 132 132 132 132 132 133 132 132 133 133 133 132 132 133 132 133 132 132 132 133 135 141 141 138 139 141 134 135 144 138 132 135 131 134 138 134 133 132 132 132 132 133 133 132 132 132 132 132 133 132 133 133 132 133 132 133 135 135 134 134 132 132 132 133 132 133 133 132 132 132 132 132 133 133 132 132 132 132 133 132 132 133 133 133 133 133 132 133 133 133 133 133 132 133 132 133 133 133 132 133 132 132 132 132 133 132 132 132 132 133 132 132 133 132 133 133 132 133 133 133 132 132 133 133 133 132 133 132 133 132 132 133 132 132 133 131 138 139 133 133 132 132 133 132 132 133 132 133 133 132 132 132 132 132 132 132 132 132 133 132 133 132 132 133 132 133 133 132 133 132
133 132 133 132 133 133 133 132 132 132 132 132 133 132 132 132 133 132 132 132 132 133 133 132 132 132 132 132 133 133 132 132 133 132 132 133 132 133 133 133 134 133 132 135 141 139 139 140 136 132 139 143 133 133 133 132 137 137 134 133 133 132 132 132 132 133 132 133 132 132 133 132 133 133 133 132 132 132 135 134 134 136 135 134 132 131 134 133 132 132 132 132 132 132 132 132 132 132 132 133 132 133 132 133 133 133 132 132 132 132 133 133 133 133 133 133 132 133 133 133 132 132 132 133 132 133 132 133 133 132 132 133 133 132 133 132 132 133 133 133 133 133 132 133 132 132 133 132 132 133 132 133 132 132 132 132 131 136 139 133 133 132 132 133 133 132 132 133 133 132 132 133 132 132 133 133 132 132 133 132 132 133 132 132 133 133 133 132 133 132 133 132
133 132 132 132 133 133 132 132 132 132 132 133 132 132 133 132 133 133 132 132 133 132 133 132 133 132 133 132 132 132 132 132 133 132 133 132 133 132 132 132 132 133 134 132 138 142 142 143 141 134 134 141 141 133 133 131 135 142 136 133 132 133 133 133 133 132 133 132 133 133 132 132 132 133 132 133 133 133 134 134 133 136 137 135 132 131 133 132 132 132 132 133 133 132 132 133 133 132 132 133 132 132 133 133 133 133 133 133 132 133 132 133 132 133 132 132 133 132 132 133 133 132 132 133 132 132 133 133 132 132 132 132 133 133 133 132 133 133 132 132 133 133 132 133 132 132 132 132 133 132 132 133 132 133 133 130 135 142 135 133 133 132 133 132 132 133 133 132 132 133 132 132 132 133 132 133 132 132 132 133 132 132 132 132 133 132 132 133 132 133 132 132
132 132 133 133 132 133 132 132 133 132 133 132 133 133 133 132 133 132 133 132 132 132 133 132 133 133 133 133 132 133 133 132 132 133 133 132 132 132 132 132 133 133 133 134 132 140 145 140 141 141 134 136 146 137 130 132 130 140 142 134 132 133 133 132 133 132 132 132 132 132 132 132 132 133 133 132 133 133 132 135 135 135 135 135 134 132 133 133 132 132 133 132 133 133 132 133 133 132 133 132 133 132 132 132 132 133 132 133 132 133 133 133 133 132 132 132 132 133 133 132 132 133 132 132 132 133 132 132 133 133 133 133 133 132 132 132 132 132 132 132 132 132 133 132 133 132 132 132 133 133 132 132 132 132 131 135 142 133 133 134 133 133 132 132 133 133 132 132 133 132 132 133 132 133 132 133 132 132 133 133 133 133 132 132 132 132 132 132 133 133 132 132
132 132 132 132 132 133 132 133 133 133 132 132 133 133 132 133 132 132 133 132 132 133 132 133 133 133 132 133 133 132 132 133 132 133 133 133 132 132 132 132 133 132 132 133 130 134 143 143 138 144 142 132 139 142 131 131 131 134 144 139 131 133 133 133 133 132 133 132 132 133 133 133 133 132 133 133 133 132 132 132 136 134 134 135 133 132 132 133 132 133 133 133 132 132 133 132 132 132 132 132 132 133 132 132 133 133 132 133 132 132 133 133 133 132 133 132 133 133 132 132 132 133 133 132 133 133 132 133 133 133 132 132 132 132 133 132 133 133 132 132 133 132 133 132 132 132 133 133 133 133 133 133 133 132 133 146 140 132 133 133 132 132 133 133 132 133 132 132 132 132 132 133 133 132 133 133 133 133 132 132 132 133 133 132 132 132 133 132 132 132 132 132
133 132 132 132 132 132 133 133 133 132 132 132 133 132 133 132 132 132 132 132 133 133 132 133 133 133 132 132 133 132 132 133 132 133 133 133 132 132 132 132 132 132 133 132 133 129 138 144 141 141 145 136 132 144 143 131 132 133 138 142 133 133 133 132 132 132 133 132 132 132 133 133 132 133 133 132 132 132 133 133 135 134 134 135 134 134 134 132 132 133 133 133 133 132 133 132 133 132 133 133 132 132 133 132 133 132 133 132 133 133 133 132 133 133 132 133 132 132 132 132 133 132 133 132 132 132 133 132 132 133 133 132 133 133 132 133 132 132 133 132 133 133 132 132 133 133 133 132 132 132 133 132 132 129 142 144 134 132 133 132 132 133 132 132 132 133 132 133 133 132 132 133 132 132 132 132 133 133 132 133 132 133 133 132 133 133 133 133 132 133 133 133
132 132 132 132 133 132 133 132 133 133 133 132 133 132 132 132 133 133 132 133 132 132 132 133 133 132 133 132 132 133 132 133 133 132 133 132 133 132 133 133 132 133 132 133 132 132 133 145 144 142 144 141 134 136 150 139 130 134 133 140 139 133 133 132 133 132 133 132 132 132 133 133 132 132 132 132 133 133 132 133 134 134 134 136 135 134 134 134 132 133 132 132 132 133 132 132 133 133 133 132 133 133 133 132 132 132 132 133 133 133 132 132 133 133 133 133 132 132 132 133 132 133 132 132 133 132 133 132 132 132 133 133 132 132 132 132 133 132 132 132 132 132 133 132 132 133 132 132 132 132 133 132 129 136 143 133 133 133 132 132 132 132 133 132 132 133 132 132 133 132 132 133 132 133 132 133 132 132 133 133 132 133 133 133 132 132 133 132 132 133 133 132
132 132 133 132 132 133 133 132 133 132 132 132 132 132 133 133 132 133 133 133 132 132 133 132 132 132 132 133 132 133 133 132 132 133 133 133 133 133 132 133 133 132 132 132 132 133 132 139 144 143 140 145 142 133 139 146 133 133 133 134 145 137 130 132 132 133 132 132 133 132 133 133 132 133 132 133 133 133 132 133 132 136 137 136 137 135 133 134 136 134 134 133 133 132 132 132 132 132 132 132 132 133 132 132 133 132 132 132 132 133 132 132 133 132 132 132 133 132 132 132 132 132 132 132 132 132 133 133 132 132 132 132 132 132 132 133 132 132 133 133 132 133 133 132 133 132 132 132 133 133 132 130 132 148 138 131 132 133 133 132 133 132 132 133 133 133 133 132 133 132 132 132 133 132 133 132 133 133 133 132 132 132 132 133 132 132 132 132 133 132 133 132
132 133 132 133 132 133 132 132 132 132 132 133 132 132 133 132 132 132 132 132 132 133 132 133 132 133 133 132 133 133 132 133 133 133 132 133 132 133 132 133 133 133 133 133 133 133 134 130 139 146 144 143 147 138 132 145 142 130 134 132 140 144 133 131 132 132 132 133 132 132 133 132 133 132 132 133 132 132 132 133 132 132 136 135 138 137 133 134 137 134 134 132 132 132 133 132 132 132 133 133 132 133 132 133 132 133 132 133 133 132 132 133 132 132 133 132 132 133 133 132 132 133 133 132 133 132 132 132 132 133 132 132 133 133 132 133 132 132 132 133 132 133 133 133 132 132 132 132 133 133 131 133 148 142 131 132 133 133 132 133 133 132 132 133 133 133 133 132 132 133 132 132 132 132 133 133 132 133 133 133 132 132 132 132 132 132 132 132 132 132 132 133
133 132 132 132 132 133 132 132 133 133 133 133 133 132 132 132 133 132 133 133 133 132 133 133 132 133 133 132 132 132 132 132 132 132 132 133 132 132 133 132 132 133 132 132 132 132 133 132 133 144 147 141 141 143 134 137 147 137 133 133 133 144 140 129 133 133 133 132 133 132 132 132 132 133 133 132 133 133 133 132 131 130 137 136 135 139 136 130 135 136 133 133 133 133 133 132 133 133 132 133 132 132 132 133 132 133 133 132 133 132 133 133 133 133 132 133 133 132 133 132 132 132 132 133 132 132 133 132 133 132 132 132 132 132 132 133 132 132 132 132 132 133 132 132 133 132 132 133 133 132 129 142 150 134 132 133 133 133 132 132 132 132 132 133 133 133 133 133 132 133 133 133 133 132 133 132 133 132 132 132 133 132 133 132 133 132 133 133 133 132 133 133
132 133 132 133 132 133 132 132 132 132 133 132 132 133 132 133 133 133 132 133 132 132 132 132 133 132 133 133 132 133 132 133 133 132 133 132 133 133 132 132 132 132 133 133 132 132 133 132 129 138 144 141 140 144 142 132 139 148 134 133 131 135 144 137 133 133 132 133 132 133 133 132 133 132 132 133 132 132 132 133 132 131 134 138 136 139 138 132 135 140 135 132 133 133 132 132 133 132 132 132 133 132 132 132 133 132 133 133 132 133 133 132 133 132 133 133 132 133 133 132 132 133 132 132 132 133 133 132 132 132 132 132 132 133 132 133 132 132 133 133 132 132 132 133 133 133 132 132 133 130 140 144 133 132 133 132 132 132 133 133 133 133 132 132 133 133 132 132 132 133 133 132 132 132 133 133 133 133 132 132 132 132 133 133 132 133 132 132 132 132 132 133
136 132 132 133 133 133 132 133 133 132 133 132 132 132 133 133 132 133 133 132 133 132 133 133 133 132 133 132 132 133 133 132 132 133 133 133 132 132 132 132 132 132 133 133 133 132 133 132 132 129 144 147 140 141 143 134 130 145 143 132 131 132 142 143 132 133 133 132 133 132 132 132 132 132 133 132 132 132 133 133 132 132 131 140 141 135 140 138 131 140 138 130 133 132 132 132 133 133 132 132 133 132 133 132 133 132 133 133 133 132 132 133 133 133 133 133 132 132 133 132 132 132 132 132 133 132 132 132 133 132 132 132 132 132 132 133 133 132 132 132 132 132 132 132 133 132 132 132 129 135 151 139 130 135 133 132 132 132 133 132 132 132 132 132 132 133 133 133 133 133 132 132 132 132 133 133 133 133 133 132 132 132 133 132 133 133 132 132 132 132 132 133
144 134 131 133 133 132 132 132 132 132 132 133 132 133 133 133 132 132 132 132 133 132 132 133 132 132 133 132 133 132 132 132 133 133 132 132 133 132 133 133 133 132 132 133 133 132 133 132 132 130 135 141 142 140 144 145 130 133 152 139 132 132 135 145 136 132 132 133 133 132 133 133 133 133 132 133 132 133 132 132 132 132 131 136 141 134 141 142 134 136 143 134 133 132 132 132 132 132 132 132 132 132 133 133 133 132 132 133 133 132 132 133 133 132 132 132 132 132 132 132 133 132 133 132 132 133 132 133 132 132 132 133 133 132 132 132 133 132 132 133 133 133 132 132 132 133 133 130 132 148 142 130 133 135 132 132 132 132 132 132 132 133 132 132 132 132 132 132 132 133 132 132 133 132 132 132 133 132 133 133 132 132 132 133 133 133 133 132 132 132 132 133
140 142 133 131 133 132 132 132 132 133 133 132 132 132 133 133 132 133 133 132 132 132 132 132 133 133 133 132 132 133 132 133 133 133 132 132 132 132 133 132 132 132 133 133 132 132 133 133 132 132 130 136 141 139 142 145 138 133 140 145 132 132 133 140 142 132 133 133 134 132 132 132 133 133 132 133 133 132 132 132 133 132 133 132 140 139 134 139 138 133 143 138 131 133 132 132 132 132 132 132 133 132 133 133 132 133 133 133 132 133 132 132 132 133 132 132 133 132 132 132 132 132 133 133 133 132 132 133 133 133 133 132 132 133 132 133 133 133 132 132 132 132 133 133 132 133 131 129 143 148 133 130 133 133 133 132 132 132 132 133 133 133 132 133 133 133 132 133 132 133 133 132 133 132 133 133 133 133 133 133 133 132 132 132 133 133 133 133 133 132 132 132
133 138 140 133 131 132 132 132 132 133 133 132 132 133 133 132 133 132 132 132 132 132 132 133 132 132 132 132 133 132 133 133 133 133 133 132 132 132 133 132 132 132 132 132 132 133 132 132 133 132 132 132 140 145 140 144 143 135 132 143 141 131 133 132 145 143 132 134 133 133 132 132 133 132 132 132 132 133 133 132 133 133 132 133 137 143 135 142 142 132 138 140 131 132 132 133 132 133 132 132 133 132 132 132 133 132 132 132 132 132 132 132 133 133 132 132 132 132 133 133 132 132 133 133 132 132 132 132 132 132 133 132 133 133 132 132 133 132 132 133 132 132 133 132 133 133 129 142 149 136 133 133 132 133 133 133 133 133 133 133 133 132 132 132 133 132 133 132 132 132 132 133 132 133 133 132 132 132 132 132 132 133 132 133 132 133 133 132 132 133 133 132
136 133 139 142 133 132 133 132 132 133 133 132 132 132 132 133 132 132 132 133 132 133 133 132 132 132 132 133 132 133 133 132 132 133 133 133 133 132 133 133 132 133 132 133 133 132 132 132 132 133 133 133 134 141 142 142 142 142 133 135 145 137 131 131 138 151 136 131 134 133 133 132 132 133 132 133 132 133 132 132 132 132 132 133 132 141 140 140 143 132 132 145 137 128 132 132 133 133 133 132 132 133 133 132 133 133 132 132 132 132 132 133 133 132 132 133 133 132 133 132 132 132 132 132 132 133 133 132 132 133 133 132 132 132 133 132 133 133 133 133 133 132 132 132 132 130 136 154 142 130 133 133 133 132 132 132 132 133 133 132 133 133 133 132 132 132 132 133 133 132 133 132 132 132 133 132 132 133 133 133 132 132 133 133 133 133 133 133 132 133 133 132
139 134 130 140 141 133 134 133 132 133 132 132 132 132 132 133 133 132 133 133 132 133 132 132 133 133 132 132 132 132 132 132 132 132 133 132 133 133 133 132 132 132 133 133 132 133 132 132 132 132 133 134 131 139 144 140 140 146 141 133 139 145 132 132 132 142 143 133 132 133 133 132 133 132 133 133 132 132 132 133 132 132 132 132 130 138 143 134 142 139 131 140 145 131 133 133 132 133 132 132 133 133 133 132 132 133 133 133 132 132 133 132 133 133 132 132 133 133 132 133 133 132 132 132 133 132 132 132 132 132 132 132 133 133 132 133 132 132 132 133 132 133 133 133 131 133 153 145 131 131 133 132 133 133 132 133 133 132 133 133 133 132 133 132 133 132 132 133 133 132 132 133 133 132 132 132 133 132 132 132 132 133 132 133 133 133 132 132 132 133 132 132
142 138 131 133 141 141 134 132 132 132 133 132 133 132 133 133 132 132 133 133 132 132 132 133 132 132 132 133 132 133 132 133 132 133 133 132 132 132 132 133 132 132 133 133 133 132 132 132 132 132 132 134 134 132 141 144 140 141 146 135 134 144 139 132 133 135 143 137 130 133 133 133 132 132 132 133 132 133 133 132 132 132 133 133 133 131 142 140 139 144 134 133 147 138 130 132 132 133 132 132 132 132 133 133 132 132 132 132 132 133 133 133 133 133 133 132 132 132 133 133 133 132 132 133 132 132 132 132 132 133 132 132 132 132 132 132 133 132 132 132 132 133 132 132 129 147 152 133 131 132 132 132 133 132 132 132 132 132 133 132 133 133 133 133 133 132 132 132 133 132 133 132 132 133 132 132 133 132 132 132 133 132 132 133 132 133 132 133 132 132 133 132
138 143 138 132 131 141 140 132 133 134 133 132 133 132 132 133 132 132 133 132 133 133 132 132 132 132 133 133 132 132 132 132 132 132 133 133 132 133 133 132 132 132 133 132 132 133 132 133 132 132 133 133 133 129 134 143 141 139 144 141 132 134 147 133 131 132 137 142 132 131 132 132 133 133 132 132 132 132 133 133 132 132 133 132 133 131 139 145 138 144 140 128 141 145 131 132 133 133 132 132 132 132 132 133 133 133 132 133 133 133 133 133 132 132 132 133 133 133 133 132 132 133 133 133 132 133 133 133 133 133 132 132 132 133 132 132 132 132 133 132 132 133 132 129 139 154 137 130 133 132 131 133 133 133 133 133 132 133 133 132 132 133 132 132 133 132 133 133 133 133 132 132 132 132 132 133 132 133 132 132 132 132 132 133 132 133 132 133 132 132 132 133
139 141 142 138 133 131 143 138 134 134 133 132 133 132 133 133 133 132 132 132 133 132 133 133 133 133 133 132 133 132 132 132 133 133 133 132 133 133 132 133 133 133 133 132 132 133 133 132 132 132 132 132 132 133 132 138 144 142 140 144 137 128 139 144 129 132 133 147 143 131 131 132 133 133 132 133 133 132 133 132 133 133 132 133 132 132 134 141 140 140 145 134 135 145 135 131 132 132 133 133 132 132 133 132 132 132 132 133 132 132 133 132 132 132 133 132 133 132 132 132 132 133 132 133 133 133 132 132 132 133 133 133 132 132 132 133 132 132 132 132 132 133 130 134 156 145 130 132 133 133 133 133 132 133 133 132 133 132 132 132 133 133 133 133 133 133 133 132 133 132 133 132 133 132 132 132 133 132 132 133 133 133 132 133 133 132 133 133 133 132 132 132
139 140 138 139 137 135 136 141 137 134 134 132 133 133 132 132 132 132 133 133 133 133 132 133 132 133 132 133 133 133 133 132 133 133 132 133 132 133 132 132 133 133 132 132 133 133 133 132 132 132 132 132 132 134 134 130 141 143 138 142 143 134 131 147 137 130 131 139 150 135 132 133 132 132 133 132 133 132 132 132 133 133 132 132 132 133 132 143 146 135 145 141 130 145 141 128 133 133 132 132 132 132 133 132 132 133 133 132 132 132 132 133 133 133 132 133 132 132 132 132 133 133 133 133 132 133 132 133 132 133 133 132 133 133 132 132 132 133 132 132 133 132 131 147 153 134 131 135 133 133 133 132 132 133 132 133 133 132 132 132 133 132 132 132 132 132 132 132 132 133 132 132 132 133 132 132 132 132 133 133 132 133 132 132 133 133 133 132 132 133 133 132
140 138 136 138 140 137 133 135 141 136 132 132 133 133 132 132 133 133 132 133 132 132 133 132 132 132 132 133 133 132 132 133 132 132 132 133 133 133 133 132 133 132 133 133 132 132 134 138 138 135 133 133 133 133 134 130 133 143 141 139 142 140 134 137 146 134 131 131 144 146 134 133 132 133 133 132 133 133 132 132 132 132 132 132 133 133 133 133 146 140 140 144 133 136 145 135 132 133 133 132 133 132 132 133 132 132 132 132 132 132 133 133 133 132 133 133 132 132 132 132 132 133 133 132 133 132 132 133 132 133 133 133 133 132 133 133 132 132 133 133 134 129 142 154 133 131 133 134 133 132 132 132 133 132 132 132 133 132 133 132 132 132 133 132 132 132 133 133 132 132 133 132 133 132 133 132 132 132 132 132 133 132 133 133 132 132 132 133 132 132 132 132
134 139 140 141 141 142 136 133 137 141 133 130 133 133 132 133 132 132 133 133 133 133 132 132 132 133 133 132 133 132 133 132 132 132 132 133 133 133 132 132 133 132 132 131 137 152 147 136 137 143 152 140 130 132 132 133 130 137 144 142 141 142 137 133 142 145 132 132 133 146 141 130 133 133 132 132 132 132 132 132 133 132 132 132 133 133 131 129 140 145 137 148 142 128 143 144 131 133 133 133 133 132 132 133 132 133 132 133 132 132 132 133 133 133 133 132 133 132 132 132 132 132 132 133 132 133 132 133 132 132 132 132 132 132 132 132 132 133 133 133 129 134 155 140 128 133 132 132 132 133 132 133 132 132 133 133 133 132 132 133 132 132 133 133 133 133 132 133 133 133 133 133 132 132 133 133 132 133 132 132 132 132 132 133 132 133 132 132 132 133 132 133
131 134 141 140 137 140 142 136 133 137 143 135 131 134 133 133 132 133 132 133 133 133 133 133 133 132 132 132 132 132 132 133 132 133 133 132 132 132 132 133 133 132 130 148 147 97 61 49 49 54 82 139 150 130 133 132 133 130 141 144 140 141 141 136 133 148 136 130 132 137 144 131 132 133 132 132 133 132 132 132 132 133 132 132 133 133 132 131 133 146 140 148 143 126 135 146 134 131 132 132 132 133 132 133 132 132 132 132 132 133 133 133 132 132 133 132 133 133 132 132 133 132 133 133 132 132 133 133 133 133 132 132 133 133 132 133 133 133 133 132 132 149 149 131 132 132 133 132 133 133 132 132 133 133 132 132 133 132 132 132 132 132 132 133 132 132 132 132 133 133 133 133 132 133 132 133 132 132 132 132 132 132 132 132 133 132 132 132 132 132 133 132
133 131 134 139 138 137 139 141 136 132 136 144 136 133 134 134 133 132 133 133 133 132 133 132 133 132 132 132 133 133 133 132 132 133 132 133 133 131 131 146 156 138 151 135 53 29 28 17 12 14 22 46 123 157 132 132 132 131 133 141 140 139 143 141 133 136 144 131 131 133 145 140 130 132 133 133 133 132 132 133 132 132 132 133 132 132 132 133 127 140 143 138 146 137 130 145 140 128 132 133 132 133 132 132 133 132 133 133 133 133 133 132 132 132 132 132 132 133 132 132 133 133 132 133 132 133 133 132 132 133 132 132 133 132 132 133 132 132 133 128 146 151 133 131 132 132 132 133 132 132 133 132 132 132 132 131 131 132 132 133 133 133 132 132 132 132 132 133 132 133 133 132 132 132 132 133 133 132 132 132 132 132 133 133 133 133 133 132 132 133 132 133
132 132 132 135 139 138 136 140 140 134 133 137 142 135 131 132 133 133 132 132 132 132 132 132 132 133 132 132 133 132 132 132 133 132 132 132 131 134 154 116 86 145 142 41 27 29 19 82 126 87 34 8 26 121 155 132 132 133 130 137 145 140 141 142 135 132 140 140 131 132 138 148 137 130 132 133 132 132 132 132 133 132 133 133 133 133 132 132 132 135 145 136 147 148 131 139 147 134 134 133 131 132 138 143 145 145 140 136 134 133 132 133 132 132 133 132 133 133 132 133 132 132 133 132 132 132 133 133 132 132 132 132 133 133 133 133 133 133 128 139 155 139 130 133 132 133 132 132 132 131 133 132 133 132 129 129 132 132 132 133 132 133 132 132 132 133 132 133 132 133 132 132 133 133 132 133 133 132 132 132 132 132 132 132 133 133 133 132 132 132 132 133
133 133 134 131 132 141 137 138 140 139 137 134 138 143 132 130 132 132 132 133 133 132 133 133 133 133 132 132 132 132 133 132 132 133 133 130 139 165 104 32 20 59 56 27 35 38 132 255 255 255 198 105 26 22 117 153 130 133 132 131 141 142 138 142 142 134 132 142 138 132 131 145 145 133 132 133 133 132 132 133 132 133 133 132 132 132 132 133 133 129 143 147 141 148 138 129 146 141 131 133 146 155 133 115 111 110 119 134 145 150 153 152 141 134 132 132 133 132 132 133 133 133 133 133 133 133 133 132 133 132 133 132 132 133 133 133 132 130 132 149 146 134 132 132 132 133 133 133 134 134 132 133 130 125 140 148 137 129 132 133 132 132 132 132 132 132 133 133 132 133 132 132 132 132 132 133 132 133 132 133 132 132 133 133 133 133 132 133 132 132 132 133
132 132 132 133 132 135 140 140 138 138 140 136 132 138 142 133 131 134 134 133 132 133 132 132 132 132 132 132 133 133 133 133 132 133 129 145 142 79 31 34 33 15 28 43 21 149 255 245 237 245 255 255 195 19 28 131 148 131 132 131 135 142 140 140 143 140 133 137 144 131 129 137 146 138 132 134 133 133 133 132 133 133 132 132 132 132 132 132 132 131 134 142 140 150 146 130 146 153 143 158 112 52 37 39 38 36 52 58 51 48 58 92 131 148 153 148 138 132 132 133 133 132 133 133 133 132 133 132 133 132 132 133 132 133 133 133 131 131 148 148 133 133 133 133 133 131 131 131 132 134 133 130 126 146 168 153 132 131 133 133 132 132 132 133 133 132 132 132 132 133 132 132 132 132 132 133 133 132 133 132 132 132 132 132 132 133 132 133 132 132 133 133
133 132 132 133 132 131 135 144 138 134 140 140 133 131 141 141 131 133 135 132 132 132 132 133 133 132 132 133 132 132 132 132 133 133 140 144 57 21 36 29 90 105 35 35 32 202 255 234 241 246 252 255 255 137 10 55 153 140 133 134 132 139 142 138 141 144 136 133 142 140 130 132 141 145 134 133 133 132 132 133 133 133 132 132 133 133 133 132 132 131 133 155 165 162 163 142 122 135 140 63 46 105 176 178 172 173 183 169 133 93 53 29 24 38 75 114 142 155 150 137 130 133 133 133 132 133 132 133 133 133 133 132 132 133 132 132 129 141 153 137 132 134 133 133 132 132 133 132 132 133 130 125 153 171 145 131 132 134 132 133 133 132 133 132 133 132 132 133 133 133 133 132 132 132 132 133 133 132 132 133 133 133 132 133 132 132 132 132 133 132 132 133
132 132 132 133 133 133 131 135 141 136 136 141 140 135 132 142 143 131 133 133 133 132 132 133 132 132 133 133 132 132 133 133 132 133 156 75 23 41 42 16 137 255 136 11 54 255 255 255 255 255 238 211 220 208 47 17 83 160 134 134 134 133 141 144 140 140 141 136 134 145 135 131 133 146 140 132 134 132 132 132 132 132 133 132 133 132 131 134 146 157 137 112 81 51 44 42 58 63 52 73 109 126 114 161 241 237 231 233 244 246 233 185 124 68 34 18 31 75 114 143 157 144 132 133 132 133 133 133 133 132 132 132 133 133 132 129 133 151 141 131 134 134 133 132 132 133 133 133 132 133 125 148 171 145 128 130 133 133 132 132 132 132 133 132 133 133 132 132 132 132 132 132 132 132 132 133 133 132 132 133 133 132 133 132 132 133 133 133 132 133 132 132
133 132 133 132 132 132 132 130 136 142 138 138 139 139 134 132 146 144 129 132 132 132 133 132 132 132 133 133 132 133 132 133 131 145 122 35 36 42 37 24 184 255 94 9 96 196 142 137 114 87 55 37 34 47 47 31 31 119 160 135 134 134 136 140 139 138 141 140 133 138 147 134 129 139 151 136 131 132 132 133 132 133 133 132 131 135 153 151 112 63 31 28 43 67 91 149 213 61 26 75 80 96 143 190 215 211 210 212 209 211 216 234 248 240 207 130 58 22 15 42 92 128 154 147 134 133 132 132 132 133 132 132 133 133 131 130 150 148 131 132 133 133 133 133 132 132 133 132 133 126 146 168 145 129 133 133 132 132 133 132 133 132 132 132 133 132 133 133 132 132 132 132 132 132 133 132 132 132 133 132 132 133 132 132 132 132 133 132 132 132 133 133
132 133 133 132 133 132 133 133 134 139 140 137 137 142 140 132 136 150 146 130 131 133 133 132 132 133 132 133 132 132 132 132 133 157 72 25 42 43 14 71 255 216 28 25 30 18 7 6 5 8 13 19 20 19 19 29 29 50 139 157 142 134 132 138 144 140 140 141 137 134 145 139 128 132 147 149 133 131 133 132 133 132 130 135 156 151 95 34 22 45 106 173 215 239 250 250 99 18 90 171 234 248 236 218 210 212 211 210 210 210 210 210 210 212 227 248 237 186 112 39 12 23 70 121 152 153 134 131 132 132 133 133 132 133 128 141 153 136 129 132 134 132 133 132 132 132 132 133 126 141 171 150 127 131 133 132 132 132 132 133 133 132 133 132 133 133 133 133 132 132 133 132 133 132 132 132 132 133 132 133 132 133 133 133 133 132 132 133 132 133 132 132
133 132 133 132 132 132 133 133 134 132 139 141 137 140 144 141 131 130 149 144 129 131 133 133 133 132 132 132 132 132 132 131 149 134 37 36 40 15 43 223 250 77 13 43 137 162 143 132 134 137 152 168 167 173 142 48 15 23 38 73 136 140 133 131 141 142 138 140 141 133 137 147 134 128 133 150 141 130 132 133 130 137 156 151 86 28 21 74 168 230 247 236 220 217 249 76 23 177 250 241 217 211 211 210 212 212 211 210 210 211 210 210 211 212 212 210 215 238 249 216 151 64 13 15 55 112 153 155 135 130 132 133 133 131 134 151 140 130 132 133 133 132 132 132 133 133 133 127 137 169 152 129 130 134 132 133 132 133 132 133 133 133 132 132 132 133 132 133 132 132 133 133 133 132 133 132 133 132 132 133 133 132 132 133 132 133 132 133 132 132 133 132
133 132 132 132 133 133 132 133 132 133 132 138 142 137 140 147 140 130 131 149 142 128 133 133 133 132 133 132 133 133 132 141 157 68 28 37 19 67 228 255 158 9 48 248 255 255 255 255 255 255 255 255 255 255 255 234 104 47 36 16 78 153 134 132 133 143 141 140 143 140 132 140 146 131 131 135 134 131 131 134 154 152 86 27 22 82 181 248 243 218 210 209 210 241 145 24 199 250 211 209 210 210 211 211 210 211 210 210 210 211 210 210 210 210 211 211 210 209 209 224 250 236 163 88 21 10 44 102 152 155 133 131 132 129 145 148 132 129 133 133 133 133 133 132 132 133 128 135 162 153 131 130 133 132 132 132 132 132 132 132 132 132 132 132 132 133 132 133 133 132 132 133 133 133 132 132 133 132 132 133 133 132 133 133 132 133 132 132 132 132 132 132
132 132 133 132 132 133 132 132 133 133 133 132 139 140 138 142 145 140 131 133 148 142 130 132 133 133 132 132 133 133 138 148 70 27 35 14 89 255 255 255 142 13 56 116 165 202 209 209 232 255 255 241 238 238 238 254 255 216 44 20 51 145 137 135 131 136 144 140 141 143 136 133 145 140 132 132 132 132 147 158 101 31 21 77 190 251 239 215 211 212 210 210 216 231 54 107 251 209 211 209 210 210 211 211 210 211 210 211 211 211 217 212 210 211 211 211 211 210 211 210 207 218 249 250 187 106 34 10 47 111 153 153 130 135 146 135 131 133 133 133 132 133 131 131 133 130 131 161 156 130 130 134 133 132 133 133 132 132 132 133 133 133 132 133 133 132 133 132 132 133 132 132 132 132 132 132 132 132 132 132 132 133 133 132 133 132 132 133 132 133 132 132
133 132 132 133 133 133 132 132 133 132 133 132 132 141 140 136 144 147 141 133 136 149 139 131 133 133 132 132 132 131 156 95 24 35 18 92 255 255 234 253 205 39 27 19 24 36 38 38 48 104 196 255 240 240 239 242 255 124 24 25 68 153 136 133 133 130 143 143 136 142 140 132 135 146 135 132 135 158 143 50 14 67 190 250 237 211 212 214 231 239 239 229 220 214 46 158 243 210 212 210 210 210 211 210 210 211 210 211 211 207 196 223 212 209 211 211 210 211 211 211 209 211 212 215 239 232 206 120 23 9 58 125 162 163 140 132 134 133 133 133 133 133 131 133 130 129 151 160 136 128 134 133 133 133 132 132 132 133 133 132 132 133 132 132 133 133 132 132 132 132 133 133 133 132 132 132 132 132 132 133 132 132 132 133 132 133 132 132 132 132 133 132
132 132 132 132 132 132 133 132 132 132 133 133 131 131 140 141 139 141 148 143 130 138 149 135 129 133 132 132 133 135 143 54 28 29 119 255 253 237 242 242 255 117 15 42 38 34 33 33 24 10 11 124 255 243 240 255 199 24 29 39 121 149 133 131 133 132 135 143 140 141 142 140 133 139 142 144 164 103 18 32 164 250 236 210 208 207 231 247 173 130 135 176 246 250 91 84 244 215 209 211 211 210 211 211 211 210 211 210 212 222 144 145 235 213 209 211 210 210 210 210 211 211 210 215 218 184 134 220 233 88 15 13 74 152 159 139 132 133 132 131 132 132 133 132 130 149 157 136 129 134 133 133 132 133 133 132 132 132 132 133 132 132 133 132 132 132 133 132 133 132 133 132 133 133 132 133 133 133 133 132 133 132 132 132 132 132 133 132 133 133 133 133
133 132 132 132 132 132 132 132 133 132 133 133 132 132 133 144 142 137 144 151 138 130 142 150 137 131 132 132 132 148 113 35 32 36 224 255 237 241 240 240 253 238 43 24 42 44 37 19 30 47 30 75 247 248 247 248 77 19 29 81 160 134 136 132 132 134 132 140 143 139 144 144 134 131 169 157 54 14 81 221 249 217 212 211 207 244 228 77 46 68 65 54 65 207 241 98 140 213 216 210 211 211 210 211 210 210 211 210 210 218 216 126 145 232 213 209 210 210 210 211 211 211 210 212 212 229 200 103 183 251 176 74 11 22 91 148 153 132 132 132 133 133 134 128 146 159 137 132 135 133 132 132 133 132 133 133 132 132 132 132 132 132 132 132 133 132 133 132 132 133 132 132 133 133 132 133 133 133 133 133 132 133 133 132 132 132 132 133 133 133 132 133
132 132 132 132 132 132 132 132 132 132 133 132 132 132 132 133 143 146 142 145 148 135 130 144 152 134 129 133 133 153 98 30 34 36 196 255 240 240 241 240 241 255 154 17 40 35 44 112 187 222 232 230 237 244 255 213 27 30 33 128 171 149 151 154 148 134 133 133 142 141 139 143 142 161 129 28 20 147 251 229 204 221 233 209 250 192 38 58 200 237 233 206 67 47 231 235 184 207 212 211 210 211 217 220 213 211 210 211 210 209 221 225 122 152 232 211 210 211 211 210 210 210 211 210 210 208 231 203 83 160 251 250 160 46 8 41 122 157 139 130 132 133 133 140 150 139 130 134 133 133 132 133 133 133 132 132 133 133 132 133 133 132 132 133 133 132 133 132 132 133 133 132 132 132 133 133 132 133 132 132 132 133 133 133 133 132 132 132 133 133 133 133
132 132 133 132 132 133 133 132 132 132 133 133 132 133 132 131 135 147 143 138 143 148 135 130 142 149 131 130 133 152 99 32 35 33 185 255 240 240 240 239 246 255 255 94 24 25 57 255 255 255 255 255 255 255 255 255 94 22 41 83 79 70 69 82 123 149 133 132 136 142 138 149 173 102 12 46 210 251 213 206 229 234 103 201 188 23 109 250 234 213 213 234 251 87 113 242 220 211 209 208 226 249 229 219 243 244 218 208 211 210 209 220 224 118 171 235 209 210 210 210 210 210 210 210 211 210 208 234 209 66 171 248 242 235 126 20 12 80 155 151 131 130 134 149 138 130 132 131 131 133 132 132 133 133 133 133 132 132 133 133 133 133 132 133 133 132 132 132 133 132 133 133 133 132 132 133 133 132 133 132 133 133 132 132 132 133 133 132 132 132 132 132
132 132 133 132 132 132 132 132 133 133 133 132 132 132 132 132 131 133 148 144 141 144 147 136 128 141 149 132 130 148 107 32 35 29 181 255 240 240 239 246 255 132 65 68 37 14 65 255 255 255 226 151 100 81 79 93 71 33 35 21 16 16 16 18 31 108 152 134 129 137 154 168 80 9 88 245 239 205 207 240 220 64 141 168 29 138 250 217 208 211 211 212 225 211 174 217 212 209 209 246 223 94 43 42 59 114 235 246 209 209 210 209 226 213 111 190 232 209 211 211 209 210 211 211 210 210 210 208 241 179 57 196 238 222 251 196 62 9 43 133 157 131 143 140 130 131 133 132 132 132 132 133 132 133 132 133 132 132 133 132 132 132 133 133 132 132 133 132 132 133 132 132 133 133 133 132 132 133 133 132 133 132 132 133 132 132 132 132 132 133 132 132
132 133 133 133 132 132 133 132 132 132 133 133 132 133 132 133 133 130 136 146 141 142 147 148 131 128 141 146 130 133 142 56 31 21 153 255 236 238 242 255 147 3 11 19 16 71 255 249 145 83 46 23 17 21 16 8 11 24 35 53 66 70 63 44 25 47 143 139 132 140 176 69 8 115 250 232 209 208 243 212 50 137 206 33 142 251 210 210 210 210 210 211 210 222 225 208 209 214 250 162 27 32 97 115 73 34 36 165 251 217 208 211 208 233 172 112 226 214 209 208 210 207 207 211 211 211 210 210 208 248 127 58 229 230 207 241 243 126 16 20 102 165 154 131 131 133 132 133 132 133 132 132 132 132 133 132 133 133 132 132 132 132 132 133 132 133 133 132 133 133 132 132 133 133 133 132 133 132 133 132 133 133 132 132 133 132 132 132 132 132 132 132
132 132 132 132 132 132 133 133 132 133 133 132 133 133 133 132 132 133 129 136 143 141 139 148 147 132 131 145 147 127 155 86 28 24 66 247 248 255 255 154 37 96 51 55 155 238 143 50 17 20 24 24 18 22 41 68 114 160 199 233 252 255 255 215 43 31 127 141 143 162 64 10 138 251 236 210 210 243 220 44 126 236 35 136 251 209 211 212 211 210 210 211 210 210 210 209 214 251 119 17 87 229 250 245 248 220 88 28 112 249 225 209 210 209 247 113 131 236 205 225 242 237 217 208 215 212 211 209 209 213 251 89 62 240 219 208 224 250 182 38 9 78 159 148 133 133 133 133 133 133 132 132 132 132 132 134 132 133 132 133 132 133 132 133 133 133 133 132 132 132 133 133 132 132 132 132 133 133 132 132 132 132 132 132 132 133 133 132 132 132 133 132
132 132 133 132 132 133 132 132 133 132 132 132 132 132 133 133 132 132 133 129 137 148 139 141 149 145 130 132 148 142 148 78 27 37 19 175 255 205 88 16 144 255 255 253 178 52 17 24 24 20 34 70 105 150 218 255 255 255 255 255 253 254 255 244 38 36 128 150 163 67 7 145 252 250 235 204 242 225 37 111 252 37 122 251 207 208 213 212 211 210 210 210 211 210 211 212 238 123 17 149 251 226 206 210 212 222 250 188 48 88 238 225 208 210 228 183 113 235 225 247 250 250 243 212 206 209 208 209 211 209 220 243 57 84 250 212 211 214 249 229 72 7 52 150 154 133 133 132 132 133 133 133 132 133 134 134 130 132 133 132 133 133 132 132 133 132 133 133 132 132 132 132 132 133 132 132 132 132 133 132 132 132 133 132 132 133 133 132 133 133 133 133
133 132 132 132 133 133 132 132 132 133 133 132 133 132 133 132 133 132 133 133 129 139 147 141 141 148 141 131 133 147 163 73 27 40 24 76 135 26 15 165 255 255 214 72 19 24 21 23 62 139 209 255 255 255 255 254 249 247 248 248 248 247 255 199 29 38 132 172 65 7 143 252 249 244 213 237 228 37 84 251 53 101 250 211 209 211 211 210 210 210 210 211 211 211 211 223 203 54 154 251 212 208 212 230 239 228 209 238 238 74 80 235 220 208 211 251 119 170 250 247 246 247 250 236 230 234 217 206 206 205 203 235 214 35 134 250 210 212 207 235 249 111 9 35 145 157 131 132 133 132 133 132 132 132 134 114 128 134 133 133 133 132 133 132 132 133 133 132 132 132 133 133 132 133 133 133 132 132 133 132 133 133 132 132 132 132 133 132 132 132 132 132
132 133 133 133 132 132 132 133 132 132 132 132 132 132 132 132 132 132 132 133 132 130 142 149 142 140 152 143 130 134 171 79 24 41 43 30 21 17 72 255 255 119 28 20 20 24 78 173 255 255 255 254 248 245 247 247 247 246 246 246 247 247 255 209 30 31 141 86 8 135 252 249 245 216 234 233 38 67 252 74 82 250 218 210 211 210 210 210 211 210 210 210 210 211 210 213 199 202 230 207 210 204 222 249 247 248 241 210 224 240 90 104 230 210 212 251 126 99 252 248 249 248 246 247 248 249 244 236 228 225 226 210 243 167 26 178 247 207 211 207 223 251 147 16 26 132 157 135 132 133 133 133 133 138 119 102 139 133 132 133 132 132 133 133 132 133 133 132 132 132 133 132 133 133 132 132 133 133 132 133 132 132 132 132 133 133 132 132 132 132 132 133
132 133 133 132 132 133 132 133 132 133 132 133 132 133 133 133 133 132 132 132 133 132 130 140 145 140 141 148 143 129 154 108 23 30 39 39 40 29 63 235 90 14 22 21 59 172 255 255 254 248 250 247 245 244 247 247 247 247 245 246 247 247 255 248 62 30 73 14 120 252 249 250 244 234 239 44 48 254 98 58 245 224 210 210 210 210 211 210 207 221 247 237 210 209 210 209 214 224 210 208 210 206 218 247 247 244 248 236 202 221 234 116 170 223 208 250 172 70 251 249 247 247 247 248 247 247 247 250 249 249 249 238 223 251 119 38 223 225 209 211 208 216 250 172 19 21 129 159 132 132 132 133 133 139 118 116 142 133 132 133 133 133 132 132 132 133 132 133 132 132 132 133 133 133 133 133 133 133 132 132 133 132 132 133 132 132 132 133 132 133 133 133
132 132 133 133 133 132 132 133 133 133 132 132 133 132 132 133 132 132 132 132 132 132 132 130 142 146 138 143 148 140 135 148 85 38 29 36 43 36 56 66 21 19 30 129 255 255 252 245 246 247 247 247 247 247 247 247 247 247 247 247 247 247 249 255 148 25 11 86 252 250 245 246 250 252 56 31 251 147 34 215 230 213 211 211 211 210 210 207 235 213 91 144 238 211 211 211 210 210 211 210 210 211 211 226 249 246 245 249 225 203 219 221 198 212 213 247 233 62 203 250 248 247 248 248 247 247 247 248 247 248 248 250 249 249 251 60 68 250 215 212 211 208 212 250 190 24 18 126 158 131 133 133 132 132 132 132 133 132 132 133 132 132 133 133 132 132 132 132 133 133 133 132 132 133 132 132 132 132 133 133 133 133 132 133 133 133 132 132 133 132 132 132
132 133 132 133 133 133 133 133 132 133 132 133 133 132 133 132 132 132 132 133 132 132 132 133 131 144 147 141 145 147 136 137 152 151 94 29 38 43 39 27 14 63 213 255 255 246 248 246 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 255 242 18 39 245 250 245 244 250 252 84 18 239 198 30 180 249 234 240 214 209 211 211 207 234 213 56 59 33 162 241 209 210 211 211 210 209 211 216 221 225 225 249 244 247 246 223 213 215 215 209 218 228 251 82 146 251 248 247 247 247 247 247 247 247 247 247 247 247 247 247 250 215 31 157 243 209 210 210 210 210 249 198 24 18 131 160 132 132 133 133 133 134 132 132 132 132 132 133 133 132 132 132 132 132 132 132 132 132 133 132 132 133 132 132 133 133 132 132 132 133 133 132 133 133 133 132 134 131
133 133 132 132 133 132 132 133 133 133 132 132 132 133 133 133 132 132 133 133 132 132 133 133 131 130 144 143 138 140 144 138 134 151 183 71 21 43 33 16 94 255 255 248 246 248 247 246 246 247 247 247 247 247 247 247 247 247 247 247 247 246 250 255 94 13 204 251 246 243 247 252 116 9 195 251 42 119 250 232 250 242 212 209 211 209 215 239 70 87 253 91 58 244 212 211 210 210 209 213 228 179 115 177 235 243 246 242 247 246 228 207 211 234 126 135 252 112 96 251 249 247 247 248 247 248 247 247 248 247 247 248 249 247 246 252 125 43 239 217 207 208 211 210 209 250 196 22 22 138 151 130 132 132 132 132 133 133 133 133 133 133 132 132 132 132 132 133 133 133 132 132 133 132 132 132 133 132 133 133 132 132 132 132 133 133 132 132 133 133 130 131
132 132 133 133 132 132 132 133 133 133 133 132 133 133 133 132 133 132 132 132 133 132 133 133 133 131 131 144 143 137 144 146 138 131 149 155 58 22 18 127 255 255 244 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 246 255 163 3 133 251 248 247 246 251 155 7 165 252 75 65 251 223 245 250 230 206 211 212 207 247 132 55 248 240 185 53 193 225 210 210 210 209 233 160 163 131 72 232 236 249 243 247 250 225 204 210 244 86 87 252 147 62 251 250 247 247 248 247 249 250 247 247 247 247 247 248 247 247 250 251 45 125 250 217 212 208 210 212 213 251 189 18 28 145 146 130 132 132 133 132 132 133 132 133 133 132 132 133 133 133 133 133 133 132 132 132 132 132 132 132 132 132 132 132 132 133 132 133 132 133 133 133 129 131 148
129 133 133 133 133 133 132 132 133 132 133 133 132 132 132 132 132 133 132 133 132 132 132 133 133 133 133 132 145 146 141 142 148 136 127 176 101 11 147 255 254 245 246 247 247 247 247 247 247 247 247 247 247 247 248 247 247 247 247 247 247 255 248 19 49 251 249 248 247 251 222 11 120 255 143 35 213 230 232 250 250 226 206 211 210 213 237 69 137 244 212 238 70 124 242 210 210 208 237 163 122 229 230 59 144 237 248 250 246 235 210 208 212 242 86 97 250 192 64 229 249 247 247 248 246 205 243 249 249 247 247 247 247 247 248 248 251 156 42 243 249 241 219 210 210 205 222 252 171 13 46 152 140 131 133 132 132 132 133 132 133 133 133 133 132 132 132 132 132 133 133 132 133 132 132 132 132 132 132 133 133 133 133 132 132 133 132 132 128 133 155 157
138 130 133 133 133 133 132 133 133 132 132 132 133 132 133 132 132 133 132 132 133 132 133 132 133 132 134 132 132 146 144 135 146 146 135 155 47 105 255 252 247 247 248 247 247 247 247 247 247 248 247 247 247 248 247 247 247 247 247 246 250 255 84 8 216 250 244 246 251 252 32 62 253 221 28 146 243 228 250 246 248 242 210 208 209 243 142 69 239 213 210 247 88 86 246 211 208 235 180 106 211 220 249 66 77 243 220 241 221 206 209 211 212 241 71 100 248 224 62 171 251 247 246 249 250 114 184 250 246 247 249 247 247 247 247 247 250 251 43 135 251 249 246 242 228 216 85 166 252 145 8 66 160 134 131 132 133 132 132 132 132 132 132 132 132 133 132 132 132 133 132 132 133 132 133 132 133 133 132 133 133 132 133 132 133 133 130 127 138 157 153 134
150 141 129 131 133 133 132 133 132 132 132 132 133 132 132 133 132 133 132 132 133 133 133 133 132 132 132 132 132 134 146 141 137 145 164 87 58 255 255 246 246 247 247 247 245 246 247 247 247 247 247 247 247 248 247 247 247 247 247 245 255 198 4 115 251 246 245 248 252 92 17 242 252 59 82 250 230 188 180 250 247 247 231 211 213 240 67 131 242 207 209 238 134 69 231 212 229 207 99 189 230 208 247 103 55 239 211 208 209 210 210 210 218 228 50 102 245 241 74 128 251 246 247 249 250 104 126 246 212 243 250 247 248 247 247 247 247 250 134 55 251 249 247 249 242 242 107 33 222 251 108 11 93 157 132 132 132 132 132 132 133 133 132 133 133 133 132 133 133 133 133 133 132 133 132 132 133 132 132 133 133 133 133 132 133 129 130 144 157 147 130 127
137 148 144 132 131 133 132 132 132 132 132 133 133 132 132 132 132 132 132 132 133 132 133 132 132 133 132 133 135 132 133 148 141 142 169 40 100 255 249 247 247 247 247 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 253 254 41 30 249 250 242 246 251 177 6 178 254 149 32 227 230 233 92 170 251 245 246 250 224 234 153 56 237 236 208 208 220 197 77 189 227 229 101 155 240 208 211 240 144 44 209 225 210 211 211 210 210 229 201 25 111 247 246 105 112 252 249 250 241 243 108 78 239 203 225 249 249 247 247 247 247 246 249 250 46 149 251 245 246 247 224 250 45 72 252 250 69 12 126 154 132 133 133 132 132 133 133 133 133 133 132 132 133 132 132 132 132 132 133 133 133 133 132 133 133 132 132 132 131 127 132 153 160 143 126 130 133
130 134 149 152 136 128 133 132 132 133 132 133 132 133 132 132 132 132 132 132 132 133 132 133 133 133 133 133 133 134 131 135 147 141 155 47 46 252 255 246 247 247 247 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 249 255 151 3 156 251 246 246 250 247 23 74 252 232 45 133 244 241 130 65 250 249 246 247 249 227 242 79 130 234 156 233 208 212 232 103 151 251 130 115 248 209 209 211 234 165 38 178 231 210 210 210 211 209 247 146 12 125 245 242 124 89 250 242 236 215 233 147 58 219 217 212 242 249 247 247 247 249 248 248 251 96 59 252 248 246 249 232 247 155 16 171 250 218 30 32 149 141 131 133 133 132 133 132 132 133 133 132 133 133 133 133 133 133 133 132 133 132 132 133 132 132 132 133 131 128 139 153 154 137 129 131 133 133
132 131 133 146 155 139 128 131 133 132 132 132 132 133 133 133 132 132 132 132 133 132 132 132 132 132 133 133 132 133 133 130 135 145 163 91 6 122 255 250 247 247 247 247 247 248 247 247 247 247 247 247 247 247 247 247 247 252 255 255 33 40 250 250 246 249 252 96 13 224 251 103 45 245 220 242 57 131 251 246 249 250 250 238 181 68 207 112 66 151 238 216 249 120 163 193 102 243 207 212 212 212 233 172 36 169 232 210 210 210 210 215 241 71 25 146 247 246 115 62 235 215 208 207 226 191 60 183 227 205 230 249 247 248 247 247 250 250 248 193 44 200 250 249 249 234 210 247 60 39 239 250 172 12 71 158 132 132 132 132 133 132 133 132 133 133 133 133 133 133 133 132 132 133 133 133 133 132 132 132 133 129 130 146 157 143 130 130 133 132 133 133
133 133 132 132 144 155 141 130 132 133 132 132 133 133 133 132 133 132 132 132 132 132 133 133 133 133 132 133 133 132 132 136 131 138 160 134 28 21 202 255 247 247 247 247 247 247 247 247 247 247 247 247 247 247 254 255 255 255 255 138 4 154 251 248 248 251 207 10 112 251 223 48 141 243 242 145 44 244 250 250 246 224 222 248 116 89 121 152 236 68 202 203 180 157 168 148 133 96 55 176 236 231 239 172 36 168 232 210 210 210 209 242 173 42 74 151 238 234 104 49 227 216 210 211 218 222 54 136 239 207 214 246 249 246 249 235 217 224 215 250 69 87 251 249 241 212 207 246 174 9 132 250 251 100 12 121 153 130 133 133 132 132 132 133 132 133 132 133 132 133 132 133 133 133 133 132 132 132 133 132 130 136 149 152 140 133 130 133 134 132 131 131
133 132 132 132 131 141 156 147 130 130 133 133 133 133 132 133 133 133 133 132 132 132 133 132 133 133 132 132 133 133 133 133 134 130 140 171 91 6 57 253 253 247 247 247 247 247 247 247 247 247 247 248 255 255 255 173 88 66 103 29 50 246 249 245 250 251 53 31 235 250 120 58 242 213 248 63 77 251 250 233 212 207 205 245 97 42 125 255 255 144 155 168 148 253 123 48 86 122 103 166 177 125 215 179 37 168 233 210 211 211 212 250 66 79 122 162 164 205 99 41 224 221 212 211 213 236 57 102 247 210 205 225 247 250 250 221 201 202 205 242 132 43 228 231 212 205 212 220 244 63 16 185 250 234 33 35 152 137 132 132 133 132 132 132 132 132 133 132 133 133 132 133 132 133 132 133 134 133 132 130 138 150 148 133 131 133 135 133 133 132 132 132
132 133 133 133 132 131 137 157 150 133 132 136 134 132 133 133 132 132 132 133 132 132 133 132 132 132 132 132 132 132 133 133 132 133 129 146 168 67 13 183 255 247 247 247 247 247 247 247 247 248 255 255 227 118 36 25 57 148 118 5 143 251 249 244 251 190 7 143 250 233 54 119 247 227 207 26 119 248 222 211 206 211 213 223 90 114 236 253 238 245 225 229 240 254 166 108 231 255 171 213 216 146 214 182 37 172 233 210 211 208 244 163 20 196 122 162 105 229 88 43 211 221 211 209 210 250 86 79 245 212 209 208 218 231 225 209 212 210 210 221 216 49 148 237 208 211 210 208 246 168 11 34 203 251 163 13 89 156 131 132 132 133 132 132 132 133 133 132 132 132 133 132 133 132 132 133 133 131 131 145 152 141 133 130 132 132 132 133 132 133 132 132
133 132 133 132 132 133 130 136 153 159 138 129 134 134 133 133 132 132 132 133 133 133 132 132 132 133 133 132 133 133 132 132 132 133 133 129 153 167 22 121 255 245 248 247 247 247 246 250 255 255 222 82 15 21 94 205 255 255 38 42 243 249 248 249 251 53 39 233 239 159 43 205 222 248 128 8 129 244 208 212 211 212 225 179 70 242 255 233 235 240 246 241 238 234 254 255 248 238 248 244 244 255 255 175 40 188 227 210 209 220 250 37 91 248 130 143 39 197 99 78 195 223 211 210 214 240 82 66 238 214 210 210 209 208 208 212 213 210 211 210 250 88 71 246 210 211 210 210 219 234 67 6 56 237 251 70 27 147 139 132 132 133 133 132 132 133 133 132 132 132 132 132 133 133 132 133 130 131 143 152 138 132 132 133 131 132 132 133 133 132 133 132
133 133 132 132 133 133 133 129 131 149 160 142 128 132 136 134 132 132 133 133 133 132 132 132 132 132 133 133 133 132 132 132 132 132 133 133 127 166 73 71 255 248 249 247 247 246 255 255 207 83 12 24 120 242 255 254 254 156 6 142 250 250 246 250 203 10 140 251 248 96 74 245 218 234 61 6 124 246 213 212 211 211 236 139 65 250 244 238 238 238 240 240 239 240 240 241 240 239 241 240 239 239 255 142 47 219 219 211 211 250 101 29 252 187 131 134 63 106 138 107 177 230 214 208 245 160 42 73 223 219 211 211 212 212 211 211 212 210 210 211 239 153 41 208 223 211 211 211 209 247 150 24 16 96 251 194 22 79 158 131 133 133 133 132 133 133 133 132 133 132 133 133 133 133 132 130 136 148 146 135 130 133 133 132 132 133 133 132 132 132 133 133
132 133 132 133 132 133 133 133 130 129 146 165 149 128 132 135 133 133 132 132 133 133 133 132 132 132 133 133 133 133 132 132 132 132 133 132 132 137 138 44 197 255 248 248 249 255 255 114 10 7 102 255 255 255 247 254 239 40 35 222 247 250 247 252 90 20 219 234 231 62 139 240 235 184 37 28 100 243 213 211 210 210 242 114 75 255 243 241 242 241 240 241 241 241 240 241 242 240 240 242 241 241 255 92 54 241 212 207 250 169 8 166 255 170 74 132 179 45 202 121 150 234 213 214 242 91 79 68 207 223 210 210 210 210 210 211 211 211 211 211 218 226 43 129 242 210 210 210 210 222 227 56 25 21 162 252 86 23 142 138 133 133 132 133 132 132 133 132 133 132 133 133 133 133 129 134 149 146 133 131 134 132 133 133 132 133 133 132 133 132 132 132
133 133 132 133 133 132 133 133 133 132 131 143 165 159 132 129 134 133 132 133 133 132 133 132 133 132 133 132 132 132 132 133 132 133 132 132 132 130 160 53 80 255 251 252 255 228 56 1 43 207 255 255 245 247 247 255 191 8 112 248 231 250 250 235 21 87 250 232 176 52 194 227 247 99 50 86 62 233 216 211 210 211 243 104 90 255 242 240 240 240 240 241 240 240 241 240 240 240 240 241 240 243 255 65 80 250 208 240 211 17 103 255 255 149 31 187 210 44 249 100 131 235 212 247 145 63 172 50 199 224 210 211 211 210 211 210 211 210 211 212 210 248 87 73 246 211 210 210 210 210 250 107 27 45 48 246 203 21 88 153 132 132 133 133 133 132 132 132 133 133 132 132 131 130 140 147 141 134 132 134 132 131 132 133 132 134 133 132 132 132 133 132
132 132 132 132 132 133 132 132 133 132 131 128 138 166 173 138 126 134 133 132 132 132 133 132 133 132 132 133 133 132 132 132 133 132 132 133 133 132 146 106 40 228 255 255 186 25 2 92 255 255 249 245 247 247 248 255 117 12 183 234 212 230 251 151 12 173 242 235 143 69 224 223 231 37 111 154 35 221 224 212 210 210 242 104 97 255 241 240 240 240 241 240 240 240 241 240 240 241 240 240 240 251 241 54 150 233 237 239 31 59 255 254 255 44 87 255 171 118 255 78 115 240 216 248 51 126 218 41 196 227 212 211 211 210 210 210 211 210 210 210 210 236 158 52 219 218 210 211 211 211 239 177 24 74 29 112 253 74 30 147 135 133 133 132 133 132 133 133 133 132 132 131 133 144 149 136 130 131 133 133 133 133 133 133 133 131 132 133 133 133 132 133
132 132 132 132 132 132 132 132 132 133 132 133 129 134 163 176 144 126 132 133 132 133 133 133 133 133 132 133 133 132 132 132 132 132 132 132 133 133 134 145 35 141 255 160 11 6 129 255 255 247 247 247 247 247 255 252 38 47 233 217 209 209 246 70 33 223 222 241 121 75 234 235 177 16 176 226 21 167 239 209 211 211 244 107 93 255 242 240 240 241 240 240 240 240 240 240 240 240 240 241 239 255 176 50 215 235 250 52 41 255 255 255 155 63 241 248 233 245 255 75 100 245 250 136 25 252 190 39 193 228 211 211 210 210 211 210 210 211 210 210 210 217 223 52 137 238 210 211 211 210 216 238 70 36 77 23 220 205 18 102 152 133 132 133 133 132 133 132 132 133 131 134 140 143 136 131 132 132 133 133 133 132 132 132 132 132 132 133 132 133 133 133
132 133 133 133 132 133 132 133 132 133 133 133 133 129 128 160 185 154 125 129 134 132 133 132 132 133 133 132 132 132 133 132 132 132 132 132 133 132 130 159 67 78 170 11 14 162 255 254 245 247 247 247 247 247 255 199 12 111 249 212 212 224 213 29 81 249 211 244 96 79 243 249 117 19 218 255 37 82 250 209 210 211 239 127 80 255 243 240 240 240 241 240 240 240 240 240 240 241 240 240 242 255 95 72 251 242 54 16 194 230 217 234 177 238 255 249 249 252 255 70 90 250 233 21 100 255 172 39 193 228 210 210 210 210 211 211 210 211 210 210 210 210 250 72 68 249 210 210 211 210 208 246 161 14 107 49 52 251 60 48 156 132 133 133 133 132 132 132 132 133 133 141 138 131 132 135 134 133 133 133 133 132 132 133 132 132 132 132 133 132 133 133
133 133 132 132 132 132 133 133 132 133 132 132 132 133 130 127 152 190 161 127 128 134 131 132 132 132 133 132 132 132 132 132 132 133 132 132 133 133 133 157 81 31 13 21 189 255 249 245 247 247 247 247 247 247 255 132 11 169 242 212 212 238 174 19 136 244 210 242 66 84 250 241 68 39 246 255 101 26 225 227 209 211 227 168 80 242 245 239 240 241 240 240 240 240 240 240 240 240 241 241 250 251 45 165 251 59 47 198 215 179 178 175 204 210 192 225 247 255 255 109 120 252 47 43 255 255 167 39 194 226 211 210 211 210 211 210 211 210 210 210 210 210 241 133 46 224 220 210 211 210 211 221 230 48 42 131 16 153 176 25 131 141 133 132 132 133 132 133 132 134 135 134 133 133 132 133 132 133 133 132 133 132 132 133 132 132 133 133 132 133 133 132
132 133 132 133 132 132 132 133 133 132 133 133 132 132 133 130 123 148 188 175 130 123 133 134 133 133 132 132 133 132 133 133 133 132 133 132 132 132 151 108 33 19 31 206 255 249 247 247 247 247 247 247 247 250 255 81 26 211 230 214 212 248 123 27 198 230 223 216 31 95 250 211 31 73 255 255 195 12 138 250 207 210 215 212 96 210 251 239 240 241 240 240 240 240 240 241 240 240 240 238 255 155 75 252 74 26 192 201 144 116 89 75 69 56 45 55 63 90 203 153 195 108 26 238 255 255 162 37 197 225 210 211 210 210 211 210 211 210 210 210 210 210 227 195 41 165 234 210 211 210 210 209 250 132 11 126 81 33 224 47 79 157 133 132 132 132 132 132 132 132 133 130 132 132 132 133 132 133 133 133 132 132 133 132 132 132 133 133 133 133 132 132
132 133 132 133 133 132 132 133 132 132 133 132 132 133 133 132 130 127 139 181 184 139 123 132 133 132 132 133 133 133 133 132 133 133 133 133 132 133 153 65 19 39 214 255 248 247 247 247 247 247 247 247 247 254 250 37 62 239 217 216 217 239 70 40 225 220 239 165 14 99 251 179 18 125 255 244 255 69 26 236 239 206 209 238 102 157 255 237 240 241 240 240 241 240 240 240 240 240 241 246 255 82 90 80 18 49 46 26 22 22 23 23 25 27 29 28 24 20 34 63 85 55 250 255 234 255 152 37 199 226 210 210 211 210 211 211 211 210 211 210 211 211 213 240 66 102 246 210 210 210 210 210 229 213 31 58 159 23 123 110 41 152 134 132 133 132 133 133 133 133 133 133 133 133 132 132 132 132 133 132 132 133 133 132 132 133 132 132 132 133 132 132
132 132 133 132 133 132 132 133 132 133 132 132 133 132 133 133 131 132 124 133 174 189 149 125 130 133 132 132 132 132 132 132 133 132 133 132 133 141 128 42 14 110 255 250 247 247 247 247 247 247 247 247 247 255 214 17 101 248 212 212 221 230 47 59 233 215 244 123 35 103 250 167 18 154 255 251 255 188 12 83 231 250 223 237 127 102 255 238 240 242 240 240 241 240 240 240 241 240 238 255 182 13 23 27 42 36 32 37 39 39 39 40 39 40 40 40 40 40 34 32 18 55 178 255 255 255 134 36 208 224 211 211 210 210 210 210 211 210 211 210 210 210 209 250 103 54 239 215 210 210 210 210 211 247 91 15 144 98 40 132 41 126 141 132 132 132 133 132 132 132 132 132 133 132 133 133 133 133 132 133 132 132 132 133 132 133 132 132 133 133 133 131
132 133 133 133 132 132 133 133 133 132 132 133 133 132 132 133 132 133 132 128 127 160 196 160 125 129 133 133 132 132 132 132 132 132 133 133 132 155 98 27 19 147 255 247 247 247 247 247 247 247 247 247 247 255 171 16 148 243 210 211 227 219 34 85 244 211 248 92 97 127 207 187 15 173 255 226 220 225 104 10 93 182 216 245 199 102 229 247 239 241 240 240 240 240 240 241 240 240 251 201 32 68 108 34 40 41 40 40 40 40 39 39 40 39 40 40 39 39 40 40 43 28 20 61 156 255 134 37 230 225 211 210 211 211 211 210 211 210 211 211 211 210 210 242 137 43 213 222 211 211 210 211 209 237 181 19 78 171 32 94 64 94 150 133 132 133 133 133 132 132 132 133 133 132 132 133 133 133 132 132 132 132 133 133 133 133 132 133 132 131 126 132
132 132 132 133 132 133 132 132 133 133 132 132 132 132 133 132 132 132 132 133 127 126 153 192 170 126 126 133 133 133 132 133 132 133 133 132 133 149 63 27 27 176 255 247 247 247 247 247 247 247 247 247 248 255 118 21 192 232 210 211 229 205 29 105 245 211 241 69 132 196 96 237 43 118 242 161 100 79 60 33 29 27 42 154 251 120 156 255 237 241 240 241 240 240 240 240 241 241 248 162 126 255 131 20 42 34 28 27 28 26 33 39 24 26 36 41 39 39 40 40 40 42 41 23 21 67 52 50 220 250 224 207 211 210 211 211 210 210 211 210 211 210 210 228 183 49 176 230 210 210 210 211 210 213 242 62 28 169 78 63 85 61 154 132 132 132 132 132 132 132 132 133 132 133 133 132 132 133 132 132 133 133 132 132 133 132 133 130 125 131 139 155
132 132 132 132 133 133 132 132 132 133 133 133 133 133 132 133 132 132 132 131 133 130 124 144 188 180 135 122 132 134 133 133 132 133 133 132 141 126 42 30 37 210 255 247 247 247 247 247 247 247 247 247 250 255 76 31 213 224 211 211 229 194 28 118 246 215 234 54 113 255 183 178 90 44 86 49 21 21 33 41 38 36 22 26 195 217 110 235 247 240 240 241 240 240 240 240 240 240 236 254 255 243 35 21 41 46 64 71 77 90 72 31 62 56 27 32 37 26 30 36 40 42 42 42 39 25 27 42 51 56 161 233 211 211 210 210 210 210 211 211 210 210 211 220 215 45 133 240 210 210 211 211 212 209 248 136 11 102 158 53 59 58 144 136 133 132 133 132 132 133 132 132 132 133 133 133 132 133 132 133 133 133 133 132 133 129 127 133 145 152 161 150
133 132 132 133 132 133 133 133 132 132 132 132 132 132 132 132 133 133 133 133 133 133 132 127 138 181 188 143 123 130 134 133 132 133 133 133 154 98 29 26 56 246 255 247 247 247 247 247 247 247 247 247 254 255 52 47 226 218 210 210 230 190 25 119 249 221 228 44 155 255 180 58 43 33 22 32 42 41 40 40 40 40 44 13 74 251 196 187 255 239 240 240 241 240 240 240 240 240 240 242 242 241 193 148 42 115 160 154 157 175 52 52 255 255 166 29 75 84 52 37 37 33 23 30 33 38 45 28 10 42 179 230 212 211 211 211 210 210 211 211 210 211 210 216 232 50 103 245 210 210 209 209 238 225 219 221 39 42 178 75 32 64 132 137 133 132 133 132 132 132 132 133 133 132 133 133 132 132 132 132 132 133 132 129 128 138 147 158 166 148 137 129
133 133 132 132 133 133 132 133 132 133 133 132 133 133 132 132 133 132 133 132 133 133 133 134 127 132 174 195 153 123 128 133 133 133 133 134 150 65 27 18 92 255 249 248 245 246 247 247 247 247 247 247 255 249 35 67 236 215 211 211 230 193 26 118 249 236 247 53 96 96 20 28 34 39 41 40 40 40 40 41 35 28 24 55 54 54 123 129 223 250 241 240 240 241 240 240 240 240 241 240 240 237 255 154 38 150 139 135 151 108 12 146 255 255 255 100 67 177 143 132 61 55 78 46 36 28 31 53 139 236 232 205 212 210 211 210 210 210 210 211 210 210 210 211 243 77 79 247 210 210 222 188 96 202 224 251 111 17 134 135 30 55 140 135 132 133 133 132 133 132 132 132 132 133 132 133 133 133 132 132 130 129 131 141 153 158 156 145 137 133 129 132
133 132 133 133 132 133 132 133 133 133 133 133 132 133 132 133 132 132 132 132 133 133 132 132 133 129 128 162 197 165 123 126 133 133 132 144 123 38 34 20 148 255 245 247 247 247 247 247 247 247 247 246 255 230 29 85 241 213 211 211 228 207 28 108 252 234 114 39 23 22 38 40 40 40 41 38 27 20 24 42 50 59 53 88 246 146 77 50 139 254 242 240 240 240 241 240 240 240 241 240 239 243 255 65 49 159 132 133 156 69 33 241 255 254 255 161 56 152 138 169 74 76 255 226 211 163 24 117 252 219 209 210 210 210 210 210 210 211 210 210 210 211 211 210 243 117 53 229 217 210 218 232 52 83 250 237 176 19 75 173 56 72 151 133 133 132 133 132 132 132 132 132 132 132 132 132 133 132 130 128 133 142 151 156 154 142 130 131 130 132 133 132
133 132 132 132 132 133 133 132 133 133 132 132 133 133 133 132 132 132 133 132 133 132 132 133 133 135 128 128 150 187 177 134 125 133 131 155 94 28 30 42 235 255 246 247 248 247 247 247 247 247 247 247 255 221 27 94 240 213 211 210 218 234 54 65 154 56 20 35 41 39 40 39 36 43 28 25 54 129 102 19 89 172 129 52 225 255 255 223 217 239 240 240 241 240 240 241 240 240 240 240 239 252 232 40 83 152 132 130 158 54 62 255 255 255 255 126 66 152 132 147 90 49 242 255 255 242 25 121 246 211 210 211 210 211 210 210 210 211 210 210 210 211 210 210 236 153 39 193 228 211 209 234 186 46 192 236 233 57 32 161 94 95 148 132 133 132 132 132 132 132 132 133 132 132 133 132 131 131 136 141 151 155 146 136 129 130 132 133 132 131 132 131
132 133 132 132 133 132 133 133 133 132 133 132 133 133 132 133 132 133 132 132 132 132 132 133 133 133 134 132 122 140 187 185 139 123 133 150 62 28 20 84 255 252 246 247 248 247 248 247 247 247 247 248 255 219 25 95 241 212 210 211 215 234 94 21 24 25 40 40 38 41 36 28 42 31 63 178 253 255 254 25 52 167 115 42 197 254 239 248 248 241 240 241 240 241 240 241 240 240 240 240 239 255 185 33 118 143 132 130 153 87 31 217 255 255 164 44 124 137 132 141 116 45 199 255 255 161 17 160 238 210 211 211 207 225 225 206 210 211 210 210 210 210 210 211 231 177 36 167 235 211 210 212 245 61 102 250 249 124 15 126 111 102 146 132 133 133 132 133 133 132 132 133 133 133 130 130 131 143 153 148 142 135 133 131 130 131 132 132 132 132 131 132
132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 133 133 132 133 133 132 132 133 133 133 132 132 132 133 126 133 176 193 148 137 115 35 36 18 141 255 246 246 247 247 247 247 247 247 247 247 248 255 233 29 86 241 212 210 213 240 123 17 31 39 37 40 36 31 37 40 105 113 19 135 255 255 255 255 57 38 163 103 41 213 255 238 240 240 240 240 241 240 240 240 240 241 240 240 240 240 255 158 34 131 139 132 132 136 149 51 24 90 80 29 101 157 130 132 139 121 43 185 255 255 129 23 193 228 210 210 210 219 187 183 220 211 211 210 210 210 211 210 211 225 204 40 141 241 210 211 210 244 119 42 226 243 180 22 78 150 130 135 132 133 132 132 132 132 133 132 133 132 130 134 144 151 150 139 133 131 130 133 132 133 132 133 133 132 131 131 133
133 132 133 133 132 132 133 133 132 133 132 133 132 133 133 133 132 132 132 133 133 132 133 132 133 132 132 132 133 135 126 130 170 196 187 86 25 36 31 210 255 248 247 247 247 247 247 247 247 248 247 247 254 251 40 64 236 214 210 210 222 202 108 35 36 29 30 55 97 27 84 195 112 12 142 255 255 255 255 33 59 173 88 48 232 253 240 241 240 240 240 240 240 240 240 241 240 240 240 240 240 255 141 32 132 139 133 133 132 145 143 72 40 55 122 156 133 133 133 141 117 41 190 255 255 88 33 218 221 210 211 209 247 118 122 237 211 210 210 210 210 211 210 211 218 226 51 117 243 211 210 210 227 200 28 141 250 225 46 42 153 139 132 132 133 133 132 132 132 132 131 130 134 142 147 150 141 134 131 130 133 131 132 132 132 132 132 132 132 132 132 133
133 133 133 133 132 133 132 132 133 133 133 132 132 132 133 132 133 133 133 132 132 132 132 133 133 133 133 132 134 134 134 126 128 160 210 70 26 24 65 255 255 247 246 247 247 247 247 246 247 247 247 247 252 255 63 41 226 218 212 210 206 228 251 53 52 195 100 71 135 28 121 159 124 15 92 255 255 255 141 17 122 164 78 51 241 248 241 240 241 240 240 240 240 241 240 240 240 240 241 240 239 255 148 32 131 140 133 133 133 132 139 154 153 156 143 132 133 133 133 147 101 39 214 255 248 39 66 242 215 211 211 216 222 89 162 228 211 211 210 210 210 210 210 210 214 236 59 91 244 209 209 209 211 244 56 64 250 248 96 22 129 145 134 133 132 132 132 133 131 131 132 140 144 145 139 131 129 131 132 133 132 132 132 132 132 132 132 132 132 132 132 132
132 134 133 132 133 132 132 133 133 133 133 132 133 132 132 132 133 132 133 132 132 132 132 132 132 133 132 132 132 133 132 134 129 136 141 45 34 20 130 255 249 246 245 247 247 247 247 250 254 254 254 255 255 255 119 28 209 226 211 212 210 210 250 112 36 253 155 56 88 39 138 137 151 96 26 181 255 180 16 75 157 151 73 59 253 244 241 240 241 240 240 241 240 240 241 240 240 241 240 240 239 255 163 28 121 142 133 133 133 132 133 134 134 134 133 133 132 133 132 157 71 43 248 255 209 18 128 250 213 210 210 234 152 74 225 215 210 210 211 210 210 210 210 210 213 239 63 79 243 209 210 210 208 242 137 29 193 250 162 19 94 155 133 132 133 131 131 133 132 135 146 144 135 132 131 131 133 132 133 132 133 133 132 133 133 133 133 132 133 132 133 132
141 136 132 132 132 132 132 132 132 133 132 133 132 132 133 132 132 132 133 133 133 133 132 133 132 133 132 132 133 132 132 133 133 150 88 29 37 33 201 255 246 247 246 246 246 255 255 255 255 255 254 220 219 255 230 23 157 239 210 212 211 211 225 217 35 148 164 50 71 41 138 136 135 166 94 39 59 27 62 153 135 154 62 67 255 243 240 240 241 240 240 240 240 241 240 240 240 240 240 240 239 255 177 25 108 149 133 133 133 133 133 133 132 133 132 132 132 134 134 149 34 79 255 255 154 18 178 239 213 211 209 250 100 92 246 210 211 210 210 211 210 211 211 211 212 241 72 73 241 211 210 210 209 222 222 31 113 250 200 32 59 155 134 132 132 130 131 131 137 138 138 133 131 132 132 132 132 132 132 132 133 133 132 133 132 132 132 133 132 132 132 132
142 144 136 132 130 131 133 132 133 133 132 132 133 133 132 133 132 133 133 132 133 132 133 133 132 132 133 133 133 132 133 133 132 152 71 28 28 54 245 255 247 247 245 251 255 248 173 76 37 37 46 22 12 52 234 67 83 250 210 211 210 210 209 251 109 32 165 52 42 49 142 138 133 133 153 118 76 107 153 139 129 155 46 73 255 242 242 240 240 240 240 240 240 240 240 240 240 241 240 240 238 255 200 22 85 158 132 132 133 133 133 133 132 133 133 133 133 132 152 114 17 167 255 255 90 33 225 223 212 212 215 234 73 152 235 210 210 210 210 210 210 211 211 210 212 244 76 68 240 211 210 210 211 211 243 62 61 247 237 63 33 138 138 132 135 139 137 133 133 133 132 132 134 134 132 132 133 132 132 132 132 132 133 132 132 133 132 132 132 132 132 133
133 138 143 145 134 130 131 131 131 132 133 132 133 132 132 133 133 132 132 132 133 132 133 132 133 132 133 133 132 132 132 132 136 141 53 31 21 88 255 250 247 245 255 255 164 33 0 32 60 64 82 108 108 37 27 53 61 230 220 212 210 210 210 244 145 22 85 73 22 58 142 135 131 131 130 141 152 146 132 131 138 143 27 107 255 239 240 241 240 241 240 240 240 240 240 240 240 240 241 240 240 249 245 47 46 156 133 133 133 133 133 132 132 133 132 132 132 136 160 43 38 243 254 255 40 76 250 212 214 213 246 145 58 230 218 210 210 211 211 210 210 210 210 209 221 249 81 66 238 211 209 211 210 210 248 112 30 219 250 98 18 120 146 133 136 137 134 134 134 133 133 133 133 133 133 132 132 133 133 133 132 132 133 132 133 132 133 132 133 133 132 132
134 132 133 142 147 141 132 130 130 132 133 133 132 133 133 133 133 132 132 132 132 132 133 132 133 132 132 133 133 133 132 132 143 124 41 36 18 128 255 247 246 255 255 106 8 46 143 252 255 255 255 255 255 255 41 0 39 181 240 211 210 211 215 222 102 155 49 33 30 57 139 135 131 131 131 132 133 133 132 129 157 101 16 190 255 237 241 240 241 241 240 240 240 240 241 241 240 241 241 240 239 239 255 117 14 129 153 131 133 133 133 133 133 133 132 132 133 161 96 9 139 255 255 168 13 170 242 217 218 214 250 63 96 251 210 211 210 211 210 210 210 211 210 212 205 244 88 61 236 213 210 210 210 210 235 178 23 140 251 143 18 101 152 134 131 131 133 131 133 131 132 131 132 132 132 132 132 131 133 132 132 132 133 132 132 132 132 132 133 132 133 133
133 133 132 131 135 145 147 139 131 131 131 133 133 133 133 133 133 132 133 132 132 133 132 132 132 132 132 133 133 132 132 132 149 109 33 33 28 186 255 248 255 255 109 2 108 255 255 255 251 252 249 248 248 255 230 27 8 95 243 216 212 212 227 196 57 243 182 16 20 51 131 140 131 131 131 132 133 133 130 142 150 25 54 254 245 239 241 240 240 240 240 240 240 240 241 241 240 240 240 240 240 240 255 214 18 50 161 143 129 133 133 133 133 133 129 137 162 112 11 63 255 252 255 87 51 225 205 199 203 232 136 42 207 225 212 211 210 210 210 211 210 210 210 234 140 194 111 58 233 215 210 210 211 210 218 239 45 68 251 177 23 76 155 134 133 133 134 134 133 132 132 132 133 132 132 132 132 132 132 133 133 132 133 133 132 132 133 133 132 132 132 134
131 131 132 132 131 134 140 148 144 138 134 131 134 134 133 132 132 133 133 133 133 132 133 133 132 133 132 133 132 132 132 132 151 89 29 28 50 243 255 255 255 122 8 111 255 255 247 246 246 247 247 247 247 247 255 134 6 29 179 242 211 213 233 172 49 215 255 163 32 27 118 149 130 131 133 132 133 131 141 169 68 7 185 255 235 239 241 240 240 240 240 240 240 240 240 240 241 241 240 240 240 240 242 255 126 4 55 151 162 149 142 140 140 146 158 151 91 14 29 218 234 196 191 155 184 190 180 179 181 212 89 111 250 209 211 211 210 210 210 211 211 211 210 241 119 134 131 57 232 214 211 210 211 210 212 251 94 36 233 214 35 51 151 139 136 136 136 135 135 136 135 135 135 135 135 134 135 135 135 135 135 135 135 136 134 135 134 134 134 134 133 134
131 133 132 132 133 131 131 136 141 146 145 135 132 133 132 132 133 133 132 133 133 132 133 133 133 132 133 132 132 132 132 133 149 69 28 22 75 255 255 255 87 10 152 255 252 245 246 245 246 248 248 247 247 246 255 255 53 17 174 210 200 214 235 155 50 226 255 255 184 10 77 172 137 131 132 131 137 155 153 63 4 102 255 243 239 240 241 240 240 240 240 240 240 240 240 241 240 240 240 240 240 241 240 247 255 121 11 23 66 97 127 129 127 117 91 44 7 37 185 215 176 175 175 191 192 182 182 183 184 182 186 200 210 213 210 211 210 211 211 211 211 211 210 238 133 120 132 58 230 215 211 211 210 210 214 242 153 25 180 248 57 37 146 144 140 139 139 137 136 136 136 136 136 136 136 137 136 137 137 136 137 137 137 137 137 137 136 135 136 137 137 136
131 131 132 132 133 132 133 131 130 134 139 144 142 135 132 130 133 132 133 132 132 133 132 133 132 132 132 133 132 132 132 135 142 56 30 19 116 255 230 62 25 166 255 255 247 247 247 247 247 247 248 247 247 247 248 255 131 29 174 148 213 211 244 145 35 231 254 248 255 83 11 84 148 158 153 159 147 93 25 26 120 254 251 237 239 240 241 240 240 240 240 240 240 240 240 240 240 241 241 240 241 240 240 238 251 255 179 97 52 31 24 22 21 16 11 29 93 196 205 179 183 183 183 183 184 183 183 183 183 182 187 184 187 211 212 211 211 210 211 210 210 210 211 239 131 122 139 57 229 216 211 211 211 211 213 232 190 26 125 251 90 27 139 146 140 138 140 139 139 139 138 138 139 138 138 138 138 138 138 137 137 138 139 139 138 138 137 137 138 138 138 138
132 132 132 133 132 132 133 133 133 131 128 133 143 148 141 134 131 131 132 133 133 132 132 133 132 133 133 133 132 132 133 135 140 54 28 21 199 220 25 59 225 255 250 246 246 246 247 247 247 247 247 247 247 247 246 255 186 45 101 138 241 213 223 165 108 196 195 190 209 220 86 30 33 62 80 66 31 23 80 226 255 248 238 240 240 240 241 241 241 240 240 240 240 240 240 240 240 240 240 240 240 241 241 241 239 241 255 255 254 207 135 113 108 111 148 220 255 206 170 184 182 183 183 183 183 183 183 183 183 183 183 180 185 209 213 210 210 210 211 210 210 210 210 245 112 93 147 60 226 216 211 211 210 210 213 233 187 21 78 251 118 23 130 153 140 140 140 142 141 141 141 142 141 141 139 140 139 140 140 139 139 139 140 139 139 139 138 139 140 140 140 138
132 132 132 133 132 133 132 133 133 132 132 130 133 136 142 144 139 133 132 132 132 133 133 132 132 132 131 132 132 132 133 133 150 65 25 35 92 52 97 255 255 245 245 247 245 244 247 247 247 247 247 247 247 247 249 255 194 64 70 147 232 194 182 188 203 177 175 180 178 189 212 194 130 69 54 57 110 210 255 255 237 237 239 241 240 241 240 240 240 240 241 240 240 240 241 240 240 241 240 240 240 240 240 240 240 240 240 240 248 255 255 255 255 255 255 254 248 219 175 178 195 185 181 182 183 183 184 182 183 182 179 180 200 214 211 211 210 211 211 210 210 210 209 250 94 73 151 64 225 216 211 211 210 210 213 235 178 22 57 250 135 22 119 160 144 143 143 143 144 144 143 144 143 143 142 142 142 143 142 143 143 143 142 141 142 144 143 142 142 142 142 142
133 133 133 132 132 132 132 133 132 133 132 133 132 129 133 138 144 144 135 132 130 133 133 133 133 134 133 134 134 134 134 133 151 109 29 34 16 127 255 255 245 247 247 247 247 247 247 248 248 247 247 247 247 255 255 255 197 59 70 150 202 179 181 183 184 184 183 183 182 184 179 199 255 255 250 255 255 255 238 237 240 239 239 240 240 240 240 240 240 240 240 241 240 240 240 241 240 240 240 240 240 241 241 241 240 240 240 241 241 240 240 240 240 241 240 240 241 247 225 206 179 170 184 179 182 203 214 192 176 182 190 206 213 211 210 211 210 211 211 210 210 210 215 237 51 71 151 66 226 216 211 211 211 211 213 236 177 26 39 234 166 20 107 166 144 144 144 144 144 144 144 144 143 144 144 144 144 143 143 144 144 144 144 144 144 144 145 143 143 143 143 143
132 133 132 133 132 132 132 133 132 132 133 133 133 132 133 132 134 140 144 143 133 130 132 133 132 134 136 136 135 134 135 136 137 155 63 23 23 163 255 244 246 247 247 247 247 246 248 255 255 249 246 250 255 255 144 126 120 55 82 154 192 184 183 183 183 183 183 183 183 179 172 196 239 243 245 244 241 239 238 239 240 240 241 240 241 240 240 241 240 240 240 240 240 240 240 240 240 241 240 240 240 241 240 240 240 240 240 240 241 240 240 240 240 240 240 240 238 240 255 205 37 161 215 209 222 150 88 145 213 205 214 216 213 210 211 211 210 210 210 211 210 210 230 185 38 106 141 69 227 216 210 210 211 211 213 238 166 40 31 185 200 23 100 168 146 146 146 146 144 144 145 145 144 145 144 144 144 144 145 144 144 144 144 144 144 144 143 144 143 144 144 143
133 133 133 133 133 132 132 133 132 133 133 132 133 133 133 134 134 132 138 143 144 140 134 133 134 135 136 136 136 137 135 136 135 150 135 39 16 56 255 255 247 247 248 247 247 250 255 128 147 255 255 255 198 45 7 119 86 73 95 176 188 182 182 183 189 182 180 176 174 180 203 241 241 238 239 238 240 239 238 239 240 241 240 240 240 241 240 240 240 240 240 241 240 240 240 240 240 240 240 240 240 241 240 241 240 240 240 240 240 240 240 240 240 241 240 240 240 246 255 62 55 240 250 237 103 12 21 187 235 216 213 210 211 211 210 211 211 210 210 210 210 210 246 119 47 149 140 75 226 213 210 211 210 211 212 246 128 56 38 142 227 32 93 169 147 147 148 147 147 146 147 146 146 146 146 145 147 147 147 145 145 145 146 146 145 144 145 145 144 144 144 144
132 133 132 133 132 133 132 133 132 132 131 129 132 132 133 134 134 134 132 133 141 147 146 142 136 134 134 135 136 136 136 137 135 134 163 114 27 13 140 255 249 247 247 247 247 255 232 25 0 121 203 93 5 44 214 238 52 132 84 211 198 182 179 184 196 184 181 190 209 228 239 242 241 240 239 239 241 239 240 240 240 241 240 240 240 241 240 240 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 240 241 240 240 240 240 240 240 241 240 240 241 241 241 255 135 34 250 251 145 51 31 16 162 248 211 210 210 211 210 212 210 210 210 210 211 210 210 211 244 76 75 157 154 93 232 211 210 210 210 210 213 247 86 76 50 104 238 37 85 172 149 148 148 149 148 146 147 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 146 147 147 146 146
132 132 132 132 133 132 133 132 132 133 133 132 134 135 133 134 135 134 135 134 132 136 142 148 147 141 135 134 135 137 138 138 139 138 140 167 100 16 25 227 255 247 247 247 247 255 191 50 105 38 21 30 112 255 255 78 78 176 72 229 216 206 218 169 61 188 243 238 248 245 238 239 241 241 240 240 240 240 241 240 241 240 240 241 240 240 241 240 240 240 241 240 240 241 240 240 240 240 241 240 241 240 240 240 240 240 240 240 240 240 240 240 240 240 241 239 255 200 39 209 199 54 34 106 36 102 250 217 214 210 210 211 210 210 210 210 210 210 210 211 209 229 190 62 151 143 163 130 235 210 210 210 207 224 228 224 66 124 64 68 231 40 80 174 148 149 148 149 149 147 147 147 147 147 148 147 147 148 148 147 147 148 148 147 148 149 149 148 149 148 149 148
133 133 133 133 133 133 132 132 134 134 134 133 135 135 133 134 135 136 135 135 136 136 137 140 145 150 149 143 138 137 140 140 140 139 140 143 168 90 7 67 255 255 246 247 247 255 152 63 255 240 177 238 255 255 207 31 208 154 72 231 217 214 240 173 20 183 255 240 239 239 238 240 240 240 240 240 240 240 240 240 240 240 241 241 240 240 240 241 241 240 240 240 241 240 240 240 241 240 240 240 240 241 240 241 240 240 241 240 240 240 240 240 240 240 239 255 225 56 102 93 20 62 229 71 55 250 225 211 212 212 212 210 211 211 211 211 210 211 211 210 208 251 88 86 186 147 149 152 231 211 211 211 219 186 216 173 48 174 88 50 220 47 75 176 149 149 149 148 149 148 149 149 148 149 148 148 150 149 148 149 148 148 148 149 148 149 148 149 148 148 149 148
134 134 135 134 135 134 134 135 135 134 135 136 136 136 134 135 135 136 136 136 137 139 138 137 136 139 147 150 149 145 143 141 141 143 142 141 149 169 70 5 109 255 253 244 250 255 93 75 255 255 255 255 255 255 46 92 252 153 58 221 218 210 230 192 32 160 255 238 240 240 240 240 240 240 240 241 240 240 241 241 240 240 240 240 240 240 240 240 240 240 240 241 240 241 240 240 241 240 240 240 241 240 240 241 240 240 240 240 241 240 240 240 238 251 255 232 41 14 45 58 194 255 95 24 232 234 207 210 211 211 211 211 211 211 211 210 210 210 210 209 233 204 31 187 161 137 151 188 220 210 211 211 239 96 165 121 53 195 111 43 201 57 72 176 150 150 149 150 149 150 150 150 150 149 149 150 150 148 148 148 149 149 148 148 148 148 148 148 149 149 149 148
136 135 135 135 135 135 135 136 137 136 135 136 136 136 136 136 137 136 136 135 136 137 137 139 139 139 139 140 146 154 151 146 143 142 144 145 143 154 171 55 6 133 255 250 255 252 36 131 255 246 245 255 255 88 51 250 242 61 55 224 219 210 226 215 34 125 255 236 239 240 240 240 240 241 241 240 241 240 240 240 240 240 241 240 240 240 240 240 241 240 240 240 240 240 240 240 240 241 240 240 240 240 240 241 240 240 240 241 240 241 240 240 247 215 119 24 18 91 189 255 255 127 11 196 245 206 211 211 211 210 210 210 210 210 210 211 212 210 211 212 251 74 63 252 149 112 173 232 211 211 211 213 234 77 141 84 96 185 136 34 158 67 71 178 151 151 151 151 150 150 150 151 151 151 151 150 151 151 151 151 151 151 150 149 150 150 149 150 150 150 150 150
138 137 136 136 137 136 136 137 139 137 137 136 136 135 136 136 138 138 138 138 138 138 140 140 142 143 143 142 140 145 149 152 153 146 144 144 144 142 160 164 46 6 178 255 255 118 19 227 255 248 255 255 99 56 251 181 79 85 57 199 225 211 218 236 47 76 255 239 239 240 240 240 240 240 240 240 240 241 240 240 241 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 240 240 241 240 240 240 240 241 240 240 240 240 240 240 240 242 254 146 51 118 220 255 255 255 161 9 145 250 208 209 210 211 210 210 210 210 211 210 209 226 214 208 208 250 142 26 203 250 133 97 208 219 231 231 206 213 232 88 78 80 162 161 159 37 116 73 70 178 151 152 152 152 152 152 151 151 150 150 150 150 151 151 150 151 150 151 151 151 151 151 151 151 150 151 151 151
137 138 137 138 138 137 138 138 137 137 137 137 137 137 137 138 138 141 141 139 140 140 140 141 142 143 144 143 145 144 143 143 149 153 151 147 146 147 143 166 166 36 19 209 212 22 139 255 243 255 243 107 76 195 115 55 167 251 42 166 232 210 213 248 80 45 253 244 240 240 240 240 240 240 241 240 240 240 240 240 240 240 240 240 240 240 240 241 240 240 240 241 240 240 241 240 240 240 240 240 240 241 241 240 241 240 240 240 240 241 240 240 240 242 255 255 255 240 255 185 11 116 250 211 209 210 211 210 210 211 211 211 209 209 240 170 167 222 232 221 30 115 251 217 105 147 228 226 149 152 229 215 237 98 19 96 181 151 171 50 93 75 70 178 151 152 151 152 151 151 151 151 150 151 151 151 151 151 151 150 150 151 151 151 151 151 150 151 151 151 151 151
137 138 137 137 136 137 137 137 139 139 139 138 138 138 139 139 140 142 142 140 141 140 142 143 143 144 144 144 145 147 146 142 142 146 152 155 154 150 148 146 166 165 41 17 48 132 255 255 201 69 28 34 85 72 95 236 255 251 49 128 241 210 213 247 110 31 234 253 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 241 240 241 240 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 241 241 240 240 240 240 240 240 240 242 243 240 238 255 219 19 90 251 220 208 210 211 211 211 211 211 211 209 211 247 152 85 203 225 251 59 48 249 218 196 172 225 215 247 75 74 250 220 237 96 20 138 163 152 179 62 76 72 74 179 150 151 152 152 151 152 151 151 150 151 151 151 151 150 151 151 151 151 150 151 150 151 151 151 151 151 151 150
138 138 138 138 138 139 138 139 140 141 140 140 140 140 140 140 142 142 142 142 143 142 143 144 145 143 145 145 146 147 147 147 147 146 147 151 155 158 153 151 146 168 170 41 32 255 255 247 243 152 85 105 136 222 255 255 249 255 71 82 248 209 213 240 160 21 181 255 239 241 240 240 240 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 240 240 240 241 240 240 240 240 240 241 240 241 240 240 240 240 240 241 240 240 240 240 241 240 240 240 240 238 255 243 23 73 250 221 212 210 211 210 210 210 210 210 209 214 251 143 47 188 236 250 112 20 198 236 208 210 221 216 214 241 74 86 243 224 218 73 79 179 148 151 179 79 68 63 79 177 152 152 151 152 152 151 151 151 151 151 152 151 152 151 152 151 151 150 151 151 150 151 151 151 151 151 150 151
142 141 141 140 141 141 141 141 141 140 140 142 142 142 141 141 143 143 143 144 144 144 144 145 145 143 144 146 147 145 147 149 149 150 151 150 151 156 154 152 153 148 167 185 41 57 255 255 246 255 255 255 255 255 247 247 247 255 99 42 238 216 213 227 215 25 122 255 237 241 240 240 240 240 240 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 240 240 241 241 240 240 240 240 240 240 241 240 240 241 240 241 240 241 240 241 240 241 240 240 238 255 252 34 54 245 230 208 210 210 210 211 211 210 211 208 220 251 120 42 184 244 250 142 11 152 251 209 211 211 210 209 216 235 60 98 244 225 218 43 88 184 147 151 175 101 65 54 86 175 152 152 152 151 151 151 151 151 152 151 151 151 152 151 152 151 151 150 151 150 150 151 151 151 151 150 151 151
144 144 143 142 142 142 142 142 142 143 143 144 143 143 142 142 143 144 143 144 143 145 144 145 147 146 147 149 147 145 147 149 150 151 151 151 150 150 152 152 153 152 150 173 159 17 83 255 255 242 246 248 246 246 247 246 253 254 96 19 167 239 211 218 240 51 53 255 255 239 240 240 240 241 240 240 240 241 240 240 240 240 240 240 240 241 241 240 240 240 240 240 240 241 240 240 241 240 240 240 240 240 240 241 240 240 240 240 241 240 240 239 241 237 255 240 36 48 246 235 207 211 211 210 210 210 210 211 207 230 248 95 44 194 249 250 151 12 125 250 212 213 211 210 209 210 223 214 46 133 242 219 236 64 38 160 158 152 170 121 55 42 107 172 152 152 153 152 152 152 152 151 151 151 151 151 152 152 151 151 151 151 151 151 151 151 151 150 150 150 151 151
144 144 144 144 144 144 144 144 143 143 144 143 143 143 143 144 143 144 144 144 144 143 144 144 146 146 147 150 148 147 147 149 150 151 151 153 152 151 153 154 153 154 153 151 185 132 7 92 255 255 242 246 246 246 245 245 255 184 154 77 66 251 210 212 246 137 12 118 255 255 239 240 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 241 240 240 241 241 240 241 240 240 240 240 240 240 241 240 240 240 240 240 240 240 241 240 240 239 239 255 226 31 51 243 234 206 211 210 210 210 210 211 209 208 240 228 64 51 215 250 251 156 17 110 251 216 208 210 210 210 211 210 239 169 22 162 246 210 245 113 23 140 166 152 165 138 36 49 153 158 152 152 151 152 151 151 151 151 151 152 152 152 152 151 151 151 151 151 152 152 151 151 152 151 150 151 150 152
144 144 143 143 144 145 143 143 143 144 144 143 143 143 144 145 143 144 144 145 146 146 145 145 144 144 146 149 150 150 149 150 151 151 151 153 153 154 155 155 154 154 154 154 153 185 114 7 65 255 255 248 247 246 246 251 255 106 214 213 25 188 236 207 227 211 38 7 88 255 255 239 240 241 240 240 240 240 240 240 240 240 240 240 240 240 241 240 241 240 241 241 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 241 241 240 239 247 255 192 25 77 248 228 206 210 210 210 211 211 211 208 217 251 184 35 72 243 251 250 121 9 77 251 216 212 211 210 211 210 210 210 250 136 9 71 243 224 239 160 23 122 175 153 159 144 37 111 173 150 152 152 151 151 151 151 151 151 152 153 152 152 152 152 151 152 153 152 153 151 152 151 152 152 151 151 150 151
147 147 146 147 146 144 144 145 145 145 145 144 145 145 146 145 145 145 145 146 146 146 146 146 146 147 148 150 151 151 151 152 151 152 154 153 153 156 157 154 156 156 156 156 155 157 190 114 8 42 213 255 254 245 248 255 145 69 252 255 71 52 250 215 211 248 93 20 15 53 222 255 248 239 239 240 240 240 240 240 241 240 241 240 240 240 241 240 240 241 241 240 240 240 240 240 240 240 241 241 240 240 241 240 241 241 239 238 237 241 255 255 114 32 118 250 225 208 210 211 210 210 211 210 210 239 249 108 32 120 252 250 171 61 37 55 142 247 210 213 210 211 211 211 211 213 243 69 54 69 91 250 231 208 33 81 185 151 154 152 100 146 156 150 152 151 151 152 151 151 151 152 153 151 151 151 150 150 151 152 152 152 152 151 152 151 151 151 151 152 152 152
149 148 147 147 146 144 145 145 145 145 145 145 145 145 146 147 146 147 145 147 146 146 147 149 148 149 150 151 151 152 152 155 154 155 155 154 154 156 157 157 156 156 156 156 156 155 156 193 126 12 20 147 255 255 255 196 65 204 255 255 220 18 136 250 207 237 179 34 83 20 19 163 255 255 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 240 241 240 240 240 240 241 240 241 240 240 240 240 241 242 240 241 239 245 255 255 171 60 46 178 250 215 210 211 211 210 211 210 208 229 251 197 66 57 216 251 145 58 18 35 202 103 184 224 210 211 212 211 211 211 210 228 210 27 94 188 31 134 250 246 65 38 178 154 153 154 166 154 150 152 152 152 152 151 151 151 151 153 152 151 151 151 151 152 151 151 151 151 151 151 151 151 152 152 151 151 151 151
151 148 149 147 145 145 145 145 146 147 146 146 146 146 146 146 146 146 145 146 146 147 150 151 151 150 151 151 150 152 156 157 156 157 156 156 156 156 156 156 156 157 156 157 156 157 155 156 186 140 24 8 91 250 176 65 178 255 250 250 255 138 10 192 245 208 250 63 70 224 27 3 87 230 255 251 239 239 240 241 240 240 240 240 241 240 241 240 240 240 241 240 240 240 240 240 240 240 240 240 240 239 243 255 255 255 255 238 152 78 50 118 243 237 207 210 211 210 211 209 212 225 250 225 98 22 61 176 131 40 33 103 71 138 172 78 244 211 209 210 210 210 210 210 209 251 125 15 128 196 129 28 165 252 143 21 131 171 152 153 154 152 152 152 153 152 153 153 153 152 151 151 151 151 150 151 151 151 152 151 151 152 153 153 151 151 152 153 151 151 151 152
151 149 151 150 147 148 147 149 147 147 147 147 147 147 146 146 147 147 147 146 149 150 151 151 152 151 151 152 151 155 154 156 157 157 157 157 156 156 156 156 156 156 156 155 155 157 156 154 155 184 151 39 10 45 127 227 255 248 248 247 252 255 84 25 234 233 237 181 14 195 250 59 2 30 140 255 255 248 236 239 240 241 240 240 240 240 241 240 240 241 241 239 239 239 240 241 240 240 240 240 240 251 207 96 125 136 106 93 111 155 248 251 239 230 229 230 233 239 243 246 242 209 102 47 63 57 80 74 15 113 226 251 77 183 75 134 244 211 210 211 211 211 211 211 215 239 53 39 172 153 184 97 22 192 251 36 72 185 152 154 152 153 153 153 153 153 153 152 152 153 152 152 152 153 151 151 151 151 150 152 151 152 152 153 154 151 151 151 151 151 151 151
154 154 153 151 150 151 152 152 150 150 149 149 149 149 149 150 149 150 150 150 150 150 151 151 152 154 153 155 155 156 155 156 156 156 154 154 157 157 157 156 157 157 157 156 156 157 157 157 156 155 187 154 37 8 74 255 255 246 248 248 247 255 255 45 36 250 240 250 77 23 255 255 120 13 3 61 158 255 255 254 239 239 240 240 240 240 240 241 241 241 240 238 236 236 240 241 240 240 240 240 240 247 234 95 35 9 3 29 117 151 131 138 164 179 185 181 164 142 117 101 75 61 71 89 95 104 89 49 139 250 248 139 77 143 50 225 219 212 211 210 211 211 211 209 240 187 16 89 184 150 153 186 81 22 218 145 31 167 158 152 152 153 153 152 152 153 152 153 152 152 152 152 152 152 152 152 152 152 153 152 151 150 151 152 153 151 151 151 151 152 151 151
155 156 154 152 152 152 153 152 151 151 150 149 150 150 151 151 151 150 150 151 150 152 151 152 154 156 157 157 156 156 157 156 156 155 154 156 157 158 159 158 158 159 158 157 157 158 157 157 157 157 156 188 142 33 9 64 247 255 248 249 247 245 255 244 32 43 212 251 237 21 94 255 255 190 62 6 6 61 145 231 255 255 247 240 240 240 240 240 240 241 240 238 236 236 239 240 240 241 240 240 240 238 245 255 244 176 156 114 54 43 44 41 42 43 42 41 47 59 72 68 61 53 67 72 99 101 26 74 250 217 251 119 73 63 129 249 213 212 210 210 210 211 210 212 247 87 19 146 169 151 151 158 186 72 28 134 50 100 178 151 152 153 152 153 152 152 152 152 152 152 153 153 152 153 153 153 152 153 152 154 152 151 151 151 151 151 151 151 151 151 151 151
154 154 155 156 156 154 156 155 153 153 152 152 151 152 152 152 151 151 151 151 153 154 154 154 153 157 156 156 156 156 157 157 157 156 156 158 159 159 159 159 159 159 158 159 158 159 158 158 157 158 157 156 192 132 28 8 75 255 255 247 247 247 246 255 247 56 25 108 250 211 22 154 255 255 255 146 54 8 6 41 120 194 253 255 255 254 242 239 240 240 238 238 237 238 240 241 240 240 241 240 241 240 241 240 248 255 255 255 255 245 239 224 207 215 225 221 216 177 104 65 53 59 103 192 132 28 40 231 247 239 157 65 24 74 245 219 214 211 210 210 210 210 208 238 195 16 74 190 154 153 154 152 157 187 91 42 26 34 160 161 153 152 152 152 152 153 152 152 152 152 152 153 152 153 152 153 152 152 152 152 153 152 154 151 151 151 151 151 152 151 151 152
157 156 156 156 155 158 158 154 153 153 155 156 155 153 153 154 153 153 153 154 154 156 155 156 155 157 156 156 158 158 158 159 158 158 158 159 158 159 159 159 159 159 158 158 158 158 159 159 158 158 158 158 160 195 112 24 13 117 255 251 247 247 247 245 255 255 161 46 43 109 82 22 176 255 254 255 255 201 91 34 13 24 57 121 190 233 255 255 255 255 255 254 248 245 243 244 241 240 240 240 238 241 245 243 242 241 241 240 244 248 252 254 255 201 151 91 61 38 45 104 170 251 251 66 40 45 173 251 211 71 75 54 26 197 237 209 210 210 211 209 217 216 210 251 95 12 142 178 155 154 155 153 153 156 183 155 97 56 130 166 153 152 152 152 152 152 152 152 152 153 152 152 152 152 153 153 152 153 153 152 152 152 153 152 153 152 152 152 151 151 151 153
158 157 156 156 156 158 159 156 154 155 155 156 155 156 155 155 156 155 155 156 156 156 156 155 155 157 157 157 159 160 159 159 158 159 159 159 159 159 159 158 159 158 159 159 158 159 159 159 159 158 158 159 157 162 197 82 16 20 169 255 249 247 247 247 246 252 255 255 175 120 144 117 111 193 255 255 169 99 95 80 43 47 15 3 18 44 79 109 140 178 199 222 245 254 255 255 255 255 255 255 255 255 248 236 240 240 240 241 240 240 240 249 228 115 89 125 46 104 251 245 247 247 48 69 79 85 252 182 47 78 194 41 106 250 209 210 209 209 208 238 228 194 240 186 15 66 179 156 157 154 155 153 154 153 152 163 181 169 151 151 153 152 153 152 152 152 152 153 152 152 153 152 153 152 152 153 152 152 152 152 152 153 153 152 152 152 152 152 152 151 151 151
156 157 158 159 159 159 159 158 158 158 156 154 156 156 157 156 156 156 156 157 157 155 155 154 155 158 159 158 158 159 158 158 158 158 158 158 159 159 158 159 159 159 158 159 159 159 159 158 159 158 158 159 159 157 174 174 51 16 29 212 255 248 248 247 247 247 245 254 255 255 255 255 230 192 255 73 7 70 88 81 95 139 183 98 52 21 9 6 7 19 34 43 64 76 92 104 103 99 95 102 114 97 83 226 250 240 240 241 240 240 240 239 239 254 255 238 59 201 234 212 250 86 42 139 45 239 191 39 97 225 74 39 219 226 210 212 207 221 251 180 65 170 252 67 17 153 169 154 156 153 155 154 154 154 154 153 154 157 154 153 153 154 154 154 152 152 152 152 153 153 152 152 153 153 152 153 152 153 152 153 152 153 152 152 152 152 153 152 152 151 151 151
157 159 158 158 158 159 159 159 159 159 159 158 157 157 158 158 158 158 158 158 158 157 159 159 158 159 159 159 158 158 159 158 159 158 158 158 158 159 159 159 158 159 159 158 159 159 158 158 159 159 159 159 158 159 156 187 149 34 13 54 248 255 247 247 247 247 247 247 247 247 255 187 102 248 103 6 174 230 76 77 92 80 253 255 250 218 169 116 80 40 28 34 16 15 11 11 10 11 24 31 30 9 64 252 244 240 240 241 240 240 241 240 240 242 255 114 42 234 215 247 164 18 174 62 119 234 30 107 221 109 29 201 239 207 210 214 245 240 103 22 97 251 162 8 88 186 153 154 156 156 156 155 152 153 153 153 154 154 155 154 154 154 154 154 154 154 152 152 152 152 152 153 153 152 153 153 153 153 152 153 152 152 152 153 152 152 153 152 153 153 152 152
160 159 160 160 160 159 159 159 159 159 159 159 158 158 160 159 159 159 160 159 159 158 159 159 159 159 158 159 158 159 159 159 160 160 160 160 159 158 159 159 159 158 159 160 159 159 159 160 159 160 160 159 160 160 159 160 195 113 25 11 110 255 251 247 247 247 247 247 247 253 255 74 144 254 8 100 255 89 189 220 38 13 143 255 227 209 255 255 255 219 49 107 139 111 106 107 132 147 83 46 59 27 118 255 236 241 240 240 240 240 240 240 240 241 255 92 60 241 225 233 45 85 170 61 200 53 92 208 151 25 148 251 207 209 240 248 163 39 33 155 251 228 27 39 178 161 156 157 156 156 156 156 154 155 155 155 154 154 154 154 153 154 153 154 153 154 153 152 152 152 152 152 153 152 152 152 153 152 152 152 152 152 152 153 152 153 152 152 152 153 152 152
160 160 160 160 159 158 159 159 159 158 159 158 159 159 159 159 159 158 158 159 159 159 159 158 158 158 159 159 158 159 158 160 160 160 160 160 160 159 158 159 159 158 160 160 160 159 160 159 160 160 160 159 160 160 160 158 167 192 65 18 24 194 255 247 247 247 247 247 246 255 194 54 240 240 3 139 252 84 255 88 80 56 48 245 240 145 131 255 255 255 153 55 202 195 206 211 133 68 97 184 178 26 174 255 235 240 241 241 240 241 240 240 240 241 255 90 92 251 250 122 30 203 81 102 100 60 211 177 34 97 247 214 238 251 180 71 13 60 237 250 248 64 15 154 178 153 156 156 156 156 156 156 156 156 156 157 157 154 155 155 154 155 153 155 154 154 154 154 153 154 153 154 152 153 152 153 152 153 152 152 152 152 152 152 152 153 152 152 152 153 153 153
159 158 158 158 159 158 160 160 160 160 160 159 159 159 159 159 159 160 160 160 159 159 160 160 160 160 159 160 159 160 159 159 160 160 160 159 159 159 160 160 159 158 160 158 158 159 158 158 159 160 160 160 160 160 160 160 158 185 152 37 14 52 255 255 246 247 247 247 251 255 66 76 255 255 62 12 250 135 38 117 77 6 51 212 255 255 128 149 255 253 255 96 70 211 117 64 89 166 248 205 124 58 249 244 238 240 241 240 240 240 240 240 241 240 255 132 48 171 250 54 87 214 75 43 56 193 190 42 72 250 251 247 185 79 27 57 49 190 250 248 83 11 127 186 153 155 155 155 156 156 156 156 156 156 156 156 157 156 156 156 156 156 155 154 153 153 154 154 153 154 154 154 154 153 153 154 153 152 152 152 153 152 152 152 152 152 152 152 152 152 152 152
161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 159 160 160 160 159 160 160 160 160 160 159 160 159 160 161 160 159 160 160 159 159 160 160 159 160 161 160 161 161 161 161 161 161 160 160 160 160 159 159 160 160 161 196 102 24 15 123 255 249 248 247 247 255 219 35 164 255 255 249 15 29 197 60 50 52 61 196 186 194 255 255 100 130 255 255 255 82 33 69 177 196 159 48 98 54 143 255 235 241 240 239 240 240 240 240 240 240 255 255 126 59 105 68 66 175 177 68 21 147 188 46 98 252 236 147 72 28 39 148 124 80 251 246 72 10 116 192 154 154 154 155 154 155 158 156 156 156 156 156 156 156 156 156 156 156 156 156 155 155 155 155 154 155 153 153 153 153 154 153 154 153 152 152 152 153 153 153 152 152 152 152 152 153 153 152 153
161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 163 161 161 161 161 161 160 160 160 161 167 189 64 16 27 215 255 248 247 245 255 171 26 233 255 255 255 225 16 57 255 185 228 255 255 245 162 199 255 228 56 201 255 141 18 64 255 134 82 172 67 121 255 250 244 236 240 240 244 247 253 255 255 255 255 223 111 20 172 255 18 104 197 166 42 86 180 66 116 193 96 44 34 60 129 186 191 76 183 180 37 21 132 192 157 155 156 155 155 155 155 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 153 153 154 153 155 154 154 153 153 153 154 152 152 152 152 152 152 153 152 153 153 152 153
159 159 158 158 159 158 158 158 158 158 158 159 159 158 158 159 160 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 161 161 161 161 161 161 161 159 158 158 159 160 161 161 161 162 162 162 161 161 161 161 158 186 149 34 12 81 255 252 247 246 254 255 77 149 231 164 191 255 255 207 251 255 254 249 245 254 242 159 207 255 183 93 84 20 140 255 91 95 255 255 151 55 132 234 255 255 255 255 254 242 220 189 154 132 84 59 95 77 99 255 44 96 197 172 49 54 37 45 90 55 62 105 155 189 184 179 70 51 89 34 63 161 186 157 156 158 158 157 158 157 156 154 154 154 154 153 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 156 155 154 154 154 154 154 153 153 154 154 154 154 152 152 152 152 152 153
161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 161 161 161 160 160 160 160 160 159 160 159 159 160 159 159 161 196 101 19 16 160 255 247 249 254 200 91 21 121 147 212 248 255 255 248 246 246 246 245 245 255 230 151 167 92 35 69 223 255 92 92 255 255 118 158 215 50 34 60 87 87 88 79 56 48 52 68 35 89 211 255 225 66 246 103 53 212 135 58 41 64 92 110 162 192 185 167 157 169 146 78 103 104 151 190 173 155 157 157 157 158 157 157 157 157 156 156 156 155 156 158 156 156 156 156 156 156 156 155 157 157 156 156 156 156 156 156 157 156 156 156 156 156 156 156 156 155 153 154 153 154 154 153 154 153 152 153 152
161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 161 160 160 159 160 160 161 160 161 160 160 168 185 60 12 39 241 255 255 152 12 43 117 230 255 254 247 249 248 249 250 247 249 248 247 250 251 112 80 124 82 255 255 116 78 255 255 152 86 252 255 238 76 109 87 92 77 97 167 185 222 255 147 151 255 247 255 109 154 254 27 69 131 170 196 200 196 179 164 159 163 162 159 160 154 171 181 178 168 159 158 158 158 158 157 158 159 159 159 158 158 158 158 157 157 158 157 156 157 157 157 157 157 154 155 157 156 156 156 157 156 156 155 156 157 156 156 156 156 156 156 155 155 155 155 155 155 155 154 154 153 152 153
161 161 161 161 161 160 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 162 161 161 161 161 161 162 161 161 161 161 162 162 161 161 161 158 184 161 40 10 103 255 237 28 120 255 255 254 243 247 247 247 248 254 255 253 247 248 247 251 229 181 255 255 84 127 221 70 242 255 213 74 235 255 255 154 130 255 255 255 198 153 255 255 255 255 159 92 255 247 255 131 103 255 52 20 47 37 69 144 168 180 189 178 164 162 160 158 160 161 159 158 159 158 159 159 159 158 159 158 158 159 159 158 159 159 158 157 158 158 159 158 158 158 158 158 158 157 155 154 155 156 156 156 155 156 154 156 158 156 156 156 156 156 156 156 156 156 156 156 156 154 154 153 154 154 154
161 160 162 161 161 161 160 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 161 161 161 161 161 161 161 161 161 161 161 161 162 162 162 161 161 163 161 161 162 162 161 161 161 161 161 161 161 162 161 161 161 159 199 111 17 22 228 114 31 255 255 249 246 247 247 247 247 253 222 115 225 255 248 247 246 252 255 252 255 236 69 30 204 255 255 120 123 255 251 255 114 174 255 249 255 168 120 255 247 246 255 173 86 254 252 255 141 130 255 35 161 213 110 51 24 25 44 93 137 183 194 183 166 157 158 158 159 159 159 159 158 158 159 159 159 158 158 158 159 159 158 158 158 159 159 159 159 159 158 157 157 157 157 156 156 158 159 159 156 154 154 155 156 157 156 155 155 157 157 157 156 156 156 156 156 156 155 156 156 153 154 153
162 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 162 161 161 162 161 162 161 161 162 161 161 161 161 161 161 161 161 161 160 161 161 160 167 183 61 13 71 50 159 255 248 247 247 247 248 248 248 255 124 33 251 255 246 247 247 247 248 248 247 255 236 43 120 255 241 97 231 253 253 238 114 230 254 248 255 172 125 255 248 246 255 206 77 234 254 255 176 102 56 72 255 255 255 255 173 119 66 26 18 38 77 125 172 187 160 159 159 158 158 158 159 159 158 158 158 158 159 158 159 159 158 159 159 158 159 159 158 159 158 158 157 157 158 157 159 159 159 159 158 155 155 158 157 157 156 155 154 156 156 156 156 156 156 156 156 156 156 156 156 155 154 154
163 162 161 162 162 162 162 162 163 162 162 162 162 162 163 162 162 162 163 162 163 163 163 162 162 162 162 162 163 162 162 162 163 162 162 162 162 163 162 162 163 163 162 163 163 164 162 162 163 163 162 161 161 161 161 161 161 162 162 162 162 162 159 189 141 29 14 68 255 255 245 247 247 245 254 255 255 255 60 181 225 128 254 248 247 247 247 247 247 246 255 236 44 144 188 121 255 247 255 196 117 255 250 247 255 177 134 255 247 246 254 236 76 196 255 255 140 4 55 251 255 245 245 252 255 255 255 227 154 76 33 18 29 122 190 164 162 160 159 159 158 159 158 159 159 158 158 159 159 159 158 158 158 159 158 159 159 158 158 160 159 159 158 158 159 159 159 159 159 158 158 158 158 158 156 154 154 155 156 157 156 156 156 156 156 156 156 156 156 156 156 156
163 164 164 161 161 162 162 161 162 161 162 162 162 162 162 162 162 162 162 162 162 162 162 162 161 162 162 162 162 162 162 162 162 162 161 162 162 162 162 161 163 163 163 163 163 163 163 163 163 163 163 163 163 164 163 164 164 164 163 164 164 163 163 163 195 88 11 62 255 254 243 245 254 255 222 109 185 187 65 224 51 141 255 248 247 248 247 247 247 247 246 255 236 56 33 233 255 254 255 171 124 255 248 247 255 181 142 255 248 248 254 248 81 228 255 98 14 106 255 255 248 247 246 246 246 246 251 255 255 255 246 190 70 7 118 191 159 159 160 159 160 160 160 160 159 159 158 158 158 159 158 158 158 158 158 159 158 159 158 159 158 158 159 159 158 158 159 159 159 160 159 159 157 158 156 156 158 158 158 158 156 155 156 155 156 155 157 156 155 156 157 156
162 162 162 162 161 162 161 162 162 161 162 162 161 162 161 162 162 161 162 161 162 162 162 161 161 161 162 161 161 162 162 162 162 162 161 161 161 162 161 161 163 163 164 164 164 164 164 163 164 164 164 163 163 164 163 163 163 163 164 163 162 162 161 162 176 170 43 12 149 255 246 255 247 131 105 129 105 60 211 107 56 255 252 247 247 247 247 247 247 247 247 243 255 229 80 75 137 236 255 185 126 255 249 248 255 175 157 255 248 248 255 255 107 140 56 27 162 255 254 246 247 247 247 247 247 247 247 247 247 248 255 255 255 94 14 153 181 158 160 160 160 160 159 160 159 158 159 159 159 160 160 159 159 158 158 158 158 158 158 159 159 158 158 158 159 159 158 158 158 159 158 157 158 159 158 158 159 160 160 159 158 158 158 157 158 157 157 156 155 155 156 156
161 161 161 161 161 162 161 161 161 161 161 161 161 162 162 161 161 161 162 162 161 161 161 161 161 162 161 161 162 161 162 161 161 162 162 161 162 161 162 163 162 163 162 162 162 162 162 161 161 162 161 162 162 161 161 161 161 163 163 162 162 162 163 163 162 199 104 10 52 252 255 226 93 95 211 255 253 223 244 36 200 255 246 247 247 247 247 247 247 247 247 246 245 255 255 147 65 60 93 102 198 255 255 255 255 203 206 255 255 255 255 153 29 4 72 255 255 249 245 245 247 247 247 247 247 247 247 247 247 247 245 248 255 255 34 56 200 159 160 160 160 160 160 159 160 160 160 159 160 160 160 158 159 158 158 159 158 159 158 158 159 158 158 158 159 158 159 158 158 158 159 159 159 160 159 160 159 159 159 159 159 160 160 159 158 158 157 157 156 155 157 156
161 161 161 161 161 161 161 161 161 161 161 161 161 161 162 162 162 162 162 162 161 162 161 161 161 161 161 161 162 162 161 162 162 161 161 162 161 161 161 161 161 161 162 162 161 161 161 161 161 161 161 162 162 161 161 161 162 161 163 162 164 164 164 164 163 173 179 53 9 151 255 113 134 255 255 243 253 255 89 59 255 248 246 247 247 247 247 247 247 247 247 247 247 246 252 255 255 200 126 56 58 111 169 211 230 217 228 224 193 110 51 30 114 113 27 161 255 251 244 244 248 247 247 247 247 247 247 247 247 247 249 255 193 234 181 21 146 177 161 161 161 161 161 161 161 161 161 159 159 160 160 159 159 160 159 160 160 158 159 159 158 158 158 158 159 158 158 159 159 159 159 158 159 158 159 158 159 159 158 158 159 159 159 159 158 157 156 157 158 157 158 156
160 161 161 160 161 161 161 161 161 161 160 160 161 161 161 161 161 161 161 161 161 160 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 161 161 161 159 159 198 114 9 59 238 213 255 248 244 244 255 243 22 157 255 245 247 247 247 247 247 247 247 247 247 247 247 247 247 247 250 255 255 255 141 80 56 43 49 53 48 42 38 60 62 186 255 255 88 0 141 255 255 245 247 247 247 247 247 247 247 247 247 247 255 160 3 75 255 70 54 193 162 161 161 161 161 160 161 161 161 161 161 161 161 161 160 160 159 159 160 158 158 158 159 159 160 160 160 160 160 160 160 159 159 158 159 159 158 158 158 159 159 158 158 158 158 158 159 159 159 158 159 160 160 158
161 162 162 161 162 162 162 162 162 162 162 163 163 163 163 162 162 163 162 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 162 162 163 162 161 161 162 162 162 161 162 161 162 162 161 161 161 161 161 161 161 162 162 164 172 176 50 10 175 255 254 254 253 255 255 97 33 255 254 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 245 254 255 255 251 203 188 186 179 182 217 255 86 167 255 254 255 100 0 107 254 252 247 247 247 247 247 247 247 247 246 255 235 23 115 206 255 199 40 162 167 161 161 160 159 161 161 161 161 161 161 161 161 161 159 159 159 160 160 160 159 159 160 160 160 159 160 160 159 160 160 159 158 158 158 159 159 158 159 158 159 158 159 159 158 158 159 159 158 159 159 159 159 159
163 163 163 163 163 163 163 163 162 163 163 163 162 164 165 163 163 165 165 164 164 165 165 165 165 165 165 164 165 165 165 164 165 165 165 165 164 165 165 165 165 165 165 165 164 161 161 161 161 161 161 161 160 161 161 161 161 161 161 161 161 161 161 161 162 162 164 200 106 9 64 233 247 254 255 234 169 8 126 255 248 246 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 248 247 247 247 248 254 255 255 255 255 255 255 227 26 151 255 244 255 255 136 0 105 255 255 249 245 247 247 247 247 246 252 255 56 75 255 255 250 255 93 113 185 160 161 160 161 161 161 161 161 161 161 161 159 160 160 161 161 161 161 161 161 161 159 159 159 160 159 160 159 160 160 160 160 160 160 160 159 158 159 159 159 159 159 158 158 158 158 159 159 158 159 159 158 158
163 163 163 163 163 163 163 163 163 163 163 162 162 164 163 163 163 163 164 163 164 164 163 163 162 162 163 162 162 162 162 162 162 163 163 162 162 162 162 162 162 163 162 162 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 162 162 162 162 162 164 176 165 44 19 125 158 80 75 134 29 30 227 255 248 246 246 247 247 247 247 247 248 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 255 215 26 147 255 246 246 255 222 18 182 255 255 255 248 246 247 247 247 249 255 119 33 250 255 221 211 255 145 56 189 165 161 161 161 161 161 161 161 161 161 161 160 159 161 161 161 161 161 160 161 161 161 160 159 161 161 161 161 161 161 161 161 160 160 160 158 158 159 159 160 160 160 160 160 160 160 160 159 158 159 158 158 158
163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 162 162 162 162 162 162 163 162 162 163 164 163 164 164 163 164 163 163 164 164 163 164 163 163 164 164 164 163 163 164 163 163 164 164 164 164 163 163 163 164 164 162 163 162 163 162 163 162 160 199 104 7 103 244 185 195 130 7 181 255 255 255 255 246 246 247 247 247 247 247 247 247 247 247 247 248 247 247 247 247 247 247 247 247 247 247 247 247 247 255 254 34 85 255 249 250 255 87 28 126 54 23 147 255 249 247 247 247 255 180 17 202 255 251 227 165 255 229 30 128 190 159 161 161 161 161 161 161 161 161 160 161 161 161 161 161 161 161 161 161 161 161 160 160 161 161 161 161 161 161 161 161 159 160 159 160 159 159 160 160 159 160 160 159 160 160 160 159 159 159 159 158 158
163 163 162 161 161 161 161 162 162 162 162 161 161 162 162 162 162 162 161 162 162 161 162 161 163 163 163 163 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 163 162 161 161 161 161 162 161 161 180 153 24 50 254 255 255 19 56 239 190 155 115 202 255 250 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 253 255 61 32 255 254 255 217 19 14 4 18 29 128 255 251 247 247 255 218 25 148 255 248 250 249 145 226 255 80 46 190 163 161 161 161 161 162 162 162 162 162 161 161 161 161 161 161 160 161 161 161 161 161 161 161 161 161 161 161 161 159 161 161 161 161 161 161 161 160 159 160 160 159 159 159 160 159 158 158 158 158 159 159
161 161 162 162 162 162 161 161 161 162 161 162 161 161 161 161 162 161 161 161 161 161 161 161 161 161 161 162 161 161 161 161 161 161 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 162 162 161 161 161 161 162 162 161 163 186 64 15 203 255 56 8 155 159 78 46 49 74 176 255 250 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 248 255 159 5 189 255 252 228 56 15 107 240 255 255 247 246 246 255 255 42 91 255 249 247 248 255 152 202 255 135 7 127 190 159 162 161 161 163 161 162 162 162 162 162 162 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 160 159 160 160 160
161 162 162 161 162 162 161 162 161 161 161 162 162 162 162 162 162 162 161 161 162 162 162 162 162 161 162 161 162 161 161 161 162 162 161 162 161 161 162 161 161 162 162 162 162 161 161 161 161 161 161 161 161 161 161 161 162 161 161 162 161 162 162 162 162 161 162 161 161 191 123 10 157 162 1 106 255 229 194 195 207 163 70 153 255 248 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 253 255 48 15 255 255 254 250 214 255 255 254 249 247 247 250 255 77 52 255 254 246 247 247 255 162 199 155 90 44 49 188 164 161 162 161 162 162 162 162 162 162 165 166 163 163 163 164 163 162 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 159 160 160 159 160
161 162 161 162 162 162 162 162 161 162 162 162 161 162 162 161 161 161 161 161 161 161 161 161 161 162 162 162 161 161 162 162 161 161 161 162 161 161 161 161 161 162 161 161 162 162 161 161 162 162 162 161 161 162 162 162 162 161 161 163 163 163 163 163 163 164 163 162 161 173 166 41 50 30 45 250 255 255 255 255 254 255 214 100 208 255 254 255 255 253 249 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 248 248 255 217 8 38 223 255 255 255 250 246 246 247 247 246 255 147 16 229 255 246 248 247 247 255 195 126 50 221 164 7 129 192 159 160 161 162 163 163 163 161 161 162 162 161 163 163 165 164 164 164 164 163 162 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 159 161 161 161 161 161 161 161
162 162 162 161 162 162 161 161 161 162 161 161 161 162 161 161 162 161 161 163 162 162 163 162 163 162 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 162 163 163 163 162 163 163 160 194 88 17 23 79 104 63 64 94 229 255 246 255 156 85 255 244 211 249 255 255 255 255 255 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 248 255 207 22 6 99 244 255 248 247 247 245 244 255 222 15 147 255 246 243 245 246 247 254 246 47 51 255 248 24 52 195 166 162 162 163 164 164 164 162 161 161 161 161 161 160 161 164 165 163 162 163 162 162 161 161 161 164 161 161 161 161 161 161 161 161 161 160 161 161 161 161 161 160 161 161 161 161 161 161 161 161
162 161 162 162 162 162 162 162 162 161 161 161 162 161 161 161 163 162 162 162 163 162 162 163 163 162 163 163 163 163 163 163 163 163 164 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 167 190 72 20 40 62 48 57 67 21 34 255 255 255 255 67 67 73 31 39 80 100 151 182 248 255 254 246 247 247 247 247 247 247 247 247 247 247 247 247 247 246 247 255 255 89 8 15 188 255 247 247 244 250 255 49 47 255 251 243 246 246 246 247 251 255 62 43 255 255 104 6 130 193 161 163 163 165 165 165 164 164 162 161 161 161 161 161 163 165 163 160 160 161 161 161 162 163 163 162 162 162 163 163 163 163 164 164 162 161 161 161 162 161 161 161 161 161 161 161 161 161 161
161 161 162 162 162 162 162 162 162 161 162 161 161 161 162 162 163 162 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 160 192 113 21 31 141 222 254 253 255 225 42 50 255 236 105 32 13 70 90 22 14 26 22 8 36 133 255 253 245 247 247 247 247 247 247 247 247 247 247 247 247 247 247 246 255 255 124 27 194 253 247 247 248 255 140 10 220 255 244 246 247 247 247 247 246 255 140 111 255 255 215 17 45 183 169 161 161 162 162 162 165 164 161 161 161 162 162 162 163 164 163 161 161 162 162 162 161 162 162 161 161 161 162 161 162 163 164 165 163 162 161 162 162 161 161 161 161 161 161 161 161 161 161
161 162 163 163 163 163 163 164 163 163 163 162 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 179 158 40 10 107 255 255 236 255 254 255 240 12 114 103 19 102 125 157 251 213 177 211 177 83 22 3 100 255 251 246 247 247 247 247 247 247 247 247 247 247 247 247 253 252 255 177 56 244 255 245 247 246 255 254 15 95 255 248 247 247 247 247 247 247 246 255 191 136 255 252 255 90 5 109 194 159 161 162 161 161 162 162 161 161 161 163 164 162 161 161 162 163 162 162 161 162 162 162 161 162 160 160 160 162 161 163 162 162 163 163 163 162 161 162 162 163 163 163 163 161 161 161 161
162 162 163 163 163 163 164 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 162 163 163 163 192 87 15 43 242 243 68 13 108 255 253 255 126 13 128 187 252 255 252 255 255 255 255 255 255 248 134 0 147 255 249 247 247 247 247 247 247 247 247 247 246 251 255 255 255 233 47 149 255 248 247 246 251 255 88 18 241 255 246 247 247 247 247 247 248 247 255 182 37 214 255 255 194 16 36 163 177 160 162 162 163 162 162 162 162 161 163 164 163 160 161 161 163 163 161 162 162 162 163 163 162 164 164 162 161 161 163 162 163 163 162 163 162 161 162 162 163 163 163 163 161 161 161 162
162 161 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 170 171 51 9 120 255 84 6 15 19 222 255 255 231 17 147 255 255 254 253 248 246 246 248 246 250 255 255 87 5 233 255 247 247 247 247 247 247 247 247 246 255 255 177 70 83 39 102 255 255 245 247 247 255 209 5 130 255 248 247 247 247 247 247 247 247 251 250 93 45 103 255 254 255 90 6 93 202 161 161 164 164 162 163 162 163 163 162 163 163 161 161 161 163 163 162 162 161 161 161 162 161 162 163 161 161 164 165 164 163 163 163 163 161 161 161 163 163 163 162 161 161 162 161 162
163 162 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 172 163 45 17 186 255 101 11 8 13 183 255 251 254 178 201 253 246 247 247 247 246 246 246 250 250 246 255 247 11 137 255 244 247 247 247 247 247 247 247 250 251 112 12 6 11 1 26 148 255 251 246 253 255 58 22 246 255 247 247 248 247 247 247 247 247 255 192 50 223 151 215 254 255 199 18 32 159 183 161 163 163 163 162 163 163 163 163 163 162 163 163 163 163 163 163 164 163 163 163 162 163 161 161 162 162 161 162 161 163 163 163 163 163 162 163 163 163 164 162 161 163 162 162 162
163 163 162 163 163 163 162 163 163 163 163 163 163 163 163 163 162 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 171 166 40 34 225 255 232 57 40 123 232 252 247 249 255 254 246 245 245 247 246 250 254 249 255 255 255 255 255 167 138 249 249 247 247 246 246 246 254 255 255 169 5 69 151 169 136 57 6 125 255 249 255 182 3 132 255 248 247 247 247 247 247 247 247 247 255 208 46 224 255 254 255 255 255 95 8 75 198 165 163 163 163 163 163 163 162 163 162 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 161 163 163 163 163 162 162 163 162 165 163 162 161 160 161 161 162
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 162 163 163 163 163 162 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 168 175 44 43 245 255 255 248 208 254 255 246 246 248 250 249 247 246 245 247 250 240 220 248 116 61 243 208 89 100 121 235 255 247 247 246 254 255 255 187 174 71 114 255 255 255 255 255 90 21 231 255 248 43 20 237 255 246 247 247 247 248 247 247 247 254 255 255 66 57 255 182 116 249 255 58 17 27 138 194 159 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 164 165 164 164 163 163 163 162 163 163 163 163 165 164 162 162 162 161 161 161
163 163 163 163 163 163 162 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 162 163 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 189 61 46 252 254 246 255 255 253 246 245 244 247 246 246 247 254 255 255 255 214 182 246 162 53 50 48 38 103 200 249 249 247 246 255 255 154 54 6 2 7 55 194 255 246 246 255 228 17 151 255 145 2 107 255 250 247 247 247 247 247 246 249 255 253 119 88 68 14 127 94 61 41 27 17 49 20 54 184 174 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 164 164 163
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 162 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 193 86 40 244 254 247 246 247 246 247 247 247 246 246 255 255 229 194 210 165 184 240 251 255 255 138 149 156 215 255 248 246 246 252 255 93 0 16 92 117 136 49 5 229 255 252 255 227 24 143 253 57 15 215 255 247 247 247 247 247 246 255 255 151 53 65 166 217 14 47 255 227 45 82 178 187 25 17 97 195 164 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 162 163 163 163 163 163 163 164 164 163 163
163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 181 129 38 206 255 248 246 247 248 247 247 245 250 255 230 112 47 46 76 81 189 255 250 246 253 255 255 126 73 255 251 247 249 255 155 1 69 217 255 255 255 255 38 56 254 255 213 110 13 35 82 17 75 255 251 247 247 247 246 249 255 244 70 42 160 255 255 255 150 6 94 80 149 255 255 255 87 11 35 153 184 163 163 163 162 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 161 163 165
163 163 163 162 163 163 162 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 162 162 163 163 163 162 163 163 163 163 162 163 162 163 162 163 163 163 163 163 162 163 163 163 173 156 41 172 255 249 247 253 255 245 245 248 255 188 64 54 135 177 204 230 254 249 248 246 246 246 255 154 52 255 254 247 255 252 33 35 255 255 255 245 185 252 255 87 43 50 26 20 29 51 41 19 167 255 246 247 247 246 252 255 168 40 84 249 255 248 243 249 255 159 41 26 117 255 255 255 239 36 16 82 200 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 162 163 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 170 162 39 157 255 248 251 237 244 255 247 255 218 68 153 234 255 255 255 255 248 247 248 247 247 249 255 100 28 237 255 248 255 155 3 149 255 236 116 30 9 17 193 255 108 60 98 166 215 169 19 53 254 255 246 247 246 255 255 122 32 150 255 255 244 245 246 244 249 255 255 206 58 129 184 223 223 70 16 32 139 188 160 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 162 163 163 163 163 162 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 162 162 163 163 162 163 163 163 163 163 163 162 171 163 38 153 255 249 255 215 95 202 255 252 44 78 255 255 253 246 246 247 247 247 248 247 247 255 239 29 49 245 255 255 255 51 22 249 255 43 0 21 140 106 6 150 255 255 255 255 255 129 5 78 255 253 247 245 255 255 87 44 218 255 248 244 247 247 247 247 247 247 254 255 148 30 84 87 61 52 34 20 60 188 169 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163
162 162 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 162 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 162 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 172 165 32 140 255 248 249 255 160 62 119 85 18 144 255 252 246 251 255 255 255 255 255 255 255 255 105 24 144 255 248 255 208 10 88 255 124 0 113 255 255 129 6 17 236 255 248 246 255 163 6 70 255 252 247 255 255 68 68 251 255 247 247 247 247 247 247 247 247 247 245 254 255 164 231 226 218 229 121 17 24 107 196 161 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 163 163 163 163 162 163 163 163 163 163 163 163 162 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 174 156 33 158 255 248 248 251 255 197 35 18 111 242 255 247 255 255 195 174 157 135 131 142 224 140 14 64 250 255 246 255 161 11 190 255 20 45 255 141 28 11 15 11 193 255 246 247 252 253 55 32 255 255 255 244 76 87 255 255 245 247 247 247 247 247 247 247 247 247 247 245 255 198 178 255 255 255 255 60 11 43 173 178 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 162 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 162 163 163 163
163 163 163 163 162 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 162 162 163 163 163 162 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 176 138 40 200 255 248 247 246 251 255 131 32 200 255 255 255 249 107 62 36 4 7 7 8 13 21 64 179 255 247 248 255 152 12 242 207 7 150 112 4 9 161 207 27 61 255 250 246 246 255 212 64 177 164 181 123 116 255 255 246 247 247 247 247 247 247 247 247 247 247 247 247 249 249 173 231 254 249 255 189 22 18 88 195 164 162 163 163 163 163 163 163 162 163 163 163 163 162 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 162 163 163 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 179 125 46 222 255 249 247 247 247 255 223 46 237 255 255 229 76 119 255 246 141 169 181 185 69 0 102 255 251 244 255 240 83 10 218 213 14 49 69 182 29 96 255 99 14 240 255 246 246 255 172 42 20 9 8 121 255 251 246 247 247 247 247 247 247 247 247 247 247 247 247 247 246 255 218 188 255 249 250 255 119 12 27 136 191 160 162 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 162 162 163 163 163 163 184 110 52 245 254 248 247 247 246 248 255 98 64 133 50 21 15 90 94 207 255 255 255 255 255 128 0 122 255 253 255 141 98 22 151 255 63 0 255 255 48 12 227 81 42 243 255 247 246 255 121 9 63 154 182 226 252 246 246 246 253 254 254 249 247 247 247 247 247 247 247 247 247 249 254 194 226 254 247 255 255 57 9 55 185 176 160 163 163 163 162 162 163 163 163 163 162 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163
163 163 163 163 163 162 163 163 162 163 163 163 163 163 163 162 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 162 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 188 88 64 255 253 247 247 247 247 255 240 54 5 29 28 65 103 13 6 12 86 255 250 244 255 255 118 0 101 255 174 98 206 6 119 255 212 4 101 255 126 0 51 15 107 255 248 247 246 255 175 8 129 255 255 255 254 254 255 255 255 241 255 255 255 244 247 247 247 247 247 247 247 247 254 234 198 249 250 249 255 211 23 13 83 197 169 162 163 162 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 162 163
163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 192 69 98 255 250 247 246 246 255 251 24 20 42 84 255 255 255 134 22 152 38 125 255 249 248 253 255 115 11 187 70 135 255 31 37 253 255 149 0 82 134 16 1 46 225 253 247 247 247 255 224 26 41 240 255 255 248 253 255 233 100 51 42 70 206 255 247 247 247 247 247 247 247 247 247 255 209 211 255 248 251 255 150 14 19 113 195 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 164 185 61 142 255 247 247 246 249 255 77 4 241 229 41 134 65 41 166 83 65 237 221 249 249 248 247 253 255 229 132 44 209 255 198 29 190 255 255 128 12 15 26 62 231 255 246 247 247 246 254 255 75 7 179 255 142 36 26 30 27 100 203 112 27 29 255 255 247 247 247 247 247 248 247 247 249 247 181 233 251 248 250 255 106 10 31 154 190 160 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 162 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 169 161 48 178 255 247 247 246 255 199 25 184 255 220 26 10 28 39 13 107 71 30 235 255 251 247 248 247 254 255 71 43 255 254 255 241 226 247 250 255 246 177 185 255 255 247 247 247 247 247 247 255 141 6 100 111 1 44 86 51 10 13 198 255 255 21 49 255 253 247 248 247 247 247 247 247 245 255 192 185 255 247 244 255 249 46 12 61 191 176 160 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 162 163 162 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 177 137 42 207 255 247 247 246 255 103 88 255 249 45 15 22 139 255 154 24 123 90 14 167 255 254 247 249 255 247 30 66 255 253 246 254 252 243 245 250 255 255 255 254 246 247 247 245 255 255 255 255 162 27 29 30 118 255 255 255 233 70 4 206 255 178 0 107 255 251 254 255 255 251 248 246 246 250 241 149 234 252 245 247 255 166 16 22 86 193 165 162 163 162 163 163 163 163 163 163 163 162 163 162 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 163 163 162 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 183 118 49 234 255 247 247 251 251 79 174 255 126 4 162 140 22 255 255 22 0 171 139 9 121 255 255 248 255 191 15 117 255 247 244 244 247 246 245 247 247 246 247 244 255 255 249 253 221 149 176 70 19 29 18 146 255 253 76 137 255 255 18 68 254 255 113 0 193 255 254 206 235 255 255 255 255 254 255 151 166 255 247 247 251 255 78 16 23 114 196 160 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 188 96 59 254 254 247 247 255 203 109 255 255 56 31 255 255 60 60 62 38 60 4 184 162 10 79 255 255 255 154 8 149 255 247 243 243 247 247 247 246 246 247 247 251 188 171 255 255 81 0 9 10 82 71 14 87 255 130 0 1 154 255 77 43 253 255 255 18 58 136 39 10 31 77 99 156 224 255 255 248 132 244 251 249 247 255 221 30 18 44 164 174 162 163 163 163 163 163 163 163 163 163 163 162 162 163 163 162 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163
163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 164 163 190 73 68 255 250 247 247 255 185 146 255 255 62 72 255 255 149 4 40 255 255 21 32 255 203 18 40 242 255 145 9 181 255 246 246 246 247 247 247 247 247 247 247 255 181 7 153 241 14 54 152 201 255 145 13 25 250 124 0 0 79 255 80 19 224 255 255 55 7 37 55 83 46 20 8 5 16 52 150 249 146 157 255 247 249 251 255 139 15 21 104 204 160 163 162 163 163 163 162 163 163 163 163 163 163 162 162 162 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163
163 163 162 163 163 163 163 162 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 190 55 81 255 248 247 247 255 175 167 255 255 87 82 255 117 16 18 48 236 255 44 76 255 255 244 57 22 195 168 7 200 255 246 247 247 247 247 247 247 247 247 247 248 255 131 8 51 6 153 255 255 255 193 30 13 143 233 21 11 171 255 137 32 215 255 255 172 145 251 255 255 255 218 201 152 78 23 0 23 54 116 255 251 247 246 253 255 76 9 45 162 185 161 162 163 163 163 163 163 163 163 162 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 162 163 162 163 163 163 163 163 163 163 163 163 162 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 162 163 162 163 163 163 163 163 163 163 162 165 184 42 103 255 247 247 252 255 133 163 255 255 174 79 130 103 117 15 12 56 207 17 89 255 245 255 255 110 32 38 89 255 254 247 247 247 247 247 247 247 247 247 247 246 255 255 49 0 30 234 255 246 255 255 56 15 46 254 219 189 255 251 251 217 243 249 247 255 255 254 253 249 254 255 255 255 255 231 128 43 1 26 226 255 245 245 246 255 225 36 11 59 185 173 161 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163
163 163 163 163 163 162 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 162 173 157 29 149 255 245 254 250 207 157 187 253 253 255 95 128 255 255 84 5 32 46 18 139 255 245 241 252 255 191 48 48 168 255 255 250 246 247 247 247 247 247 247 247 247 246 255 251 100 174 255 247 247 250 255 95 19 17 147 255 255 248 247 254 255 249 244 245 247 247 249 249 247 247 247 247 245 249 255 255 255 128 2 70 255 252 244 245 249 255 179 16 14 96 202 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 185 121 27 199 255 254 255 177 151 252 254 246 247 255 247 111 166 255 255 190 93 4 43 255 255 245 245 245 250 255 247 119 43 59 164 247 249 247 247 247 247 247 247 247 247 245 245 255 255 255 245 246 247 247 255 167 24 21 77 255 252 247 246 246 247 247 247 248 247 247 248 248 247 247 247 247 247 247 246 246 255 255 116 2 166 255 247 246 246 246 255 142 10 23 128 199 161 162 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 162 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 192 95 33 231 255 255 164 102 202 254 248 245 246 246 255 168 55 100 120 83 18 40 31 118 255 255 248 249 247 255 162 183 251 109 86 183 254 248 247 247 247 247 247 247 247 247 247 246 249 248 246 247 247 246 255 249 42 27 27 195 255 244 244 245 245 248 247 247 247 247 247 247 247 247 247 247 246 246 246 247 246 255 255 31 44 252 253 246 247 243 253 255 94 6 33 151 193 160 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163
163 163 163 162 163 163 163 163 163 163 163 163 163 163 162 162 163 163 163 163 162 163 163 163 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 193 74 39 249 255 155 16 142 255 248 247 247 247 247 247 255 224 59 32 40 96 253 142 2 99 255 255 247 248 255 208 111 255 255 255 236 247 247 247 247 247 247 247 247 247 247 247 248 247 247 247 247 246 251 255 174 40 33 17 92 255 249 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 248 255 141 4 185 255 247 247 247 245 255 255 58 8 41 167 190 160 163 163 163 163 163 163 162 163 163 162 162 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 165 186 55 50 255 255 87 26 206 255 247 245 246 247 247 246 245 255 255 255 255 255 255 255 129 2 72 255 255 248 255 234 85 239 255 250 251 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 248 249 255 148 96 84 27 33 37 231 255 246 247 247 247 247 247 247 252 250 247 247 247 247 247 247 247 247 247 247 247 255 218 13 112 255 248 245 246 247 247 255 227 35 13 52 179 185 159 162 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 162 163 163 163 163 163 163 162
163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 162 163 163 162 163 167 177 42 60 255 251 44 48 241 255 246 243 244 247 247 247 246 246 251 254 254 251 246 253 255 165 7 37 231 255 255 132 14 90 255 255 248 248 247 247 247 247 247 247 247 247 247 246 247 247 247 247 249 252 143 95 255 142 18 42 18 130 255 254 255 247 248 246 247 255 255 254 248 254 251 247 247 247 247 247 247 247 247 254 255 41 78 255 249 247 246 246 247 247 255 181 19 17 58 187 185 160 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 161 161 161 163 163 162 162 162 162 162 161 170 173 35 74 255 225 28 63 240 255 247 247 247 247 247 247 247 248 247 247 247 247 247 247 251 255 211 37 26 148 244 204 190 59 65 235 254 248 247 247 247 247 247 247 247 247 247 247 246 247 247 246 251 236 167 189 245 190 29 38 25 56 253 245 228 249 249 247 251 176 62 178 249 234 238 248 247 247 247 247 247 247 247 248 255 87 54 255 253 250 247 246 246 247 252 255 124 24 21 58 159 173 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163

@ -1,194 +0,0 @@
P2
192 192 255
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 133 132 132 132 133 132 135 137 138 140 134 132 136 135 131 133 132 132 132 132 132 132 132 133 133 132 132 132 133 132 132 132 133 132 133 132 132 132 133 133 132 133 132 133 132 133 133 133 133 133 132 130 134 145 140 143 141 132 139 138 132 134 134 138 136 131 133 133 132 133 133 133 132 133 132 133 133 132 132 132 132 133 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 132 132 132 133 133 133 131 135 140 140 140 139 133 137 136 136 134 133 133 132 133 132 133 133 133 132 132 132 132 132 133 132 133 132 132 133 133 133 133 133 133 133 133 133 133 133 133 133 132 132 133 132 129 129 143 143 141 141 134 141 143 133 135 131 138 134 132 133 132 133 132 132 133 132 133 133 133 132 132 133 132 133 132 132 133 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 133 132 133 132 132 132 133 131 144 138 138 140 137 134 142 135 134 134 132 132 132 133 133 132 133 132 133 133 132 132 132 133 132 132 133 133 133 133 133 132 132 133 132 132 132 132 132 133 133 133 132 132 132 133 144 141 138 144 134 136 141 133 133 132 134 138 131 132 132 133 132 132 132 133 132 132 132 133 133 133 132 133 132 133 133 132 132 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 132 132 133 132 133 132 132 135 135 138 134 140 136 138 143 135 131 134 133 133 132 133 133 132 132 132 133 133 133 133 133 133 132 132 132 132 132 133 133 132 132 133 132 132 132 132 132 133 132 133 133 133 132 133 145 141 141 142 132 146 146 133 133 132 137 134 133 132 132 133 132 133 133 132 133 132 133 133 132 133 132 133 132 133 132 132 133 132 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 132 132 132 132 132 132 132 133 130 136 136 136 140 140 132 138 132 130 133 133 132 133 133 133 133 132 132 132 132 133 133 132 132 132 132 132 132 132 133 133 132 132 132 132 133 133 132 132 133 133 132 132 133 134 139 144 142 142 145 136 139 142 130 132 135 135 137 134 132 132 133 132 132 133 132 132 133 132 133 133 133 133 133 133 132 132 132 132 132 133 132 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 132 133 132 133 133 133 133 134 134 142 138 141 140 131 141 142 133 132 132 132 132 133 132 133 133 132 132 132 132 133 133 133 132 132 132 132 133 133 133 133 133 132 133 132 132 133 132 133 133 132 132 133 132 130 139 143 140 141 134 144 144 131 131 130 140 136 133 133 133 132 132 133 133 132 133 132 132 133 132 133 133 133 132 133 133 132 133 133 132 132 132 133 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 133 132 132 133 133 133 133 132 133 134 132 140 137 139 139 135 132 141 131 134 134 132 133 132 132 133 132 133 132 133 133 133 133 133 133 132 132 132 132 133 132 133 133 133 133 132 132 132 133 133 133 133 132 133 132 133 144 144 144 145 142 136 150 131 132 134 134 142 134 132 133 132 132 133 133 133 132 132 132 132 133 132 133 132 133 133 132 133 133 132 132 133 133 133 133 132 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 132 132 132 133 133 132 132 132 133 132 139 137 137 139 134 142 142 131 133 134 133 133 132 132 132 132 133 132 132 132 133 133 132 133 132 133 133 133 133 132 132 133 133 133 132 132 132 133 133 133 132 133 132 129 129 144 147 143 147 133 139 150 139 132 133 144 139 132 133 133 133 132 132 132 132 133 133 132 133 133 132 133 133 132 132 132 132 132 132 133 132 133 132 133 132 133 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 132 132 132 132 132 133 132 132 133 133 132 138 137 140 142 140 132 146 131 133 132 132 132 133 133 133 132 133 132 132 132 132 132 133 133 132 133 133 133 132 132 133 132 133 132 132 133 132 132 132 132 132 133 132 132 129 144 141 141 141 138 132 146 133 134 133 138 142 131 133 133 132 133 133 133 132 132 132 133 132 132 132 132 133 132 132 133 133 133 133 132 133 132 132 132 132 133 132 132 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 133 132 132 132 132 132 132 132 132 133 133 132 142 137 144 141 136 136 144 129 133 133 132 132 132 132 133 133 132 132 133 133 132 132 132 132 132 132 133 132 133 133 133 132 132 132 133 133 133 133 133 132 133 132 130 130 144 147 140 144 134 137 145 142 133 133 140 139 133 133 133 133 133 132 133 132 132 132 132 133 133 132 133 132 132 132 133 133 133 132 133 132 133 133 133 132 133 133 132 133 133 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 133 133 133 132 132 133 132 132 132 133 132 133 132 132 140 138 140 147 131 130 146 130 132 132 132 132 133 133 132 132 132 132 133 132 133 132 132 133 132 132 133 133 133 132 133 133 132 132 133 133 132 133 132 132 132 133 132 130 141 142 140 141 142 132 147 137 134 132 134 145 133 133 132 132 132 132 132 132 133 133 133 132 133 133 132 133 132 133 133 133 132 132 132 132 133 132 132 132 133 133 133 133 133 132 132 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 133 133 132 132 133 133 132 132 132 133 133 133 132 141 138 142 140 130 130 149 130 131 132 133 133 132 133 132 132 132 132 132 132 132 132 132 133 133 133 133 133 133 132 132 133 133 133 132 133 133 133 132 132 132 132 132 130 136 142 140 143 134 139 139 137 133 132 140 137 130 132 132 132 132 133 132 132 132 133 132 132 133 133 132 132 132 133 136 133 133 132 133 132 132 132 133 132 133 132 133 132 132 132 132 132 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 133 132 133 132 132 132 132 132 132 132 132 132 133 133 132 131 140 136 136 145 140 131 149 129 131 133 133 132 132 132 133 133 132 133 133 133 132 133 132 132 132 132 132 133 132 132 133 133 133 133 132 132 133 132 132 132 132 133 133 132 140 139 139 144 145 130 145 134 133 133 133 144 133 132 132 132 133 133 132 132 133 132 132 132 133 133 133 133 132 135 138 134 134 133 132 132 132 132 133 132 132 133 132 132 132 133 133 132 133 132 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 132 132 132 132 132 133 133 132 133 133 133 133 132 132 132 133 141 139 147 141 131 133 142 128 133 133 132 133 132 133 133 132 132 132 133 133 132 133 132 132 133 131 132 132 132 133 132 133 132 133 132 133 132 133 132 132 133 134 133 134 145 140 145 138 133 133 143 132 131 135 140 129 132 132 133 132 132 132 132 133 133 133 132 133 132 133 132 132 133 135 136 132 133 134 132 132 132 133 133 133 132 132 132 132 132 132 132 132 132 132 132 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 133 133 132 132 132 133 133 133 132 132 133 133 133 132 132 132 144 142 139 141 141 133 148 142 133 133 133 133 133 132 133 132 132 132 132 132 132 133 133 130 132 131 131 131 133 133 132 132 133 133 133 133 133 132 132 132 132 132 134 131 141 142 140 144 138 133 152 139 131 132 135 144 129 133 132 132 132 132 132 132 133 133 133 132 133 133 133 133 132 135 135 134 132 133 134 133 132 132 132 132 133 133 132 133 132 133 133 133 132 132 132 132 133 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 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 132 132 132 133 133 133 132 133 132 132 132 132 133 133 133 132 132 133 132 133 143 137 144 143 143 136 149 130 132 133 132 132 132 133 132 133 132 133 132 133 133 129 145 139 165 154 116 146 156 132 130 131 137 132 132 133 132 132 132 133 133 134 134 139 144 142 142 135 132 140 145 132 132 142 143 133 133 133 133 133 132 132 133 133 133 132 133 133 133 133 133 134 134 134 134 134 132 132 132 132 132 132 133 133 133 133 132 132 133 132 133 132 132 132 132 133 133 132 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 132 133 133 133 132 132 132 132 132 132 132 132 133 132 132 133 132 132 135 147 146 142 151 138 138 149 131 131 133 133 133 132 132 132 132 132 133 131 133 156 144 57 142 79 104 32 86 145 151 135 148 147 152 147 138 138 132 132 132 132 133 129 141 144 140 140 142 133 143 141 132 133 135 145 132 133 132 133 133 133 132 133 133 132 132 132 132 132 133 132 132 135 133 136 136 135 132 132 132 132 133 133 132 132 132 132 132 132 132 132 133 132 132 132 132 133 133 133 132 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 133 133 132 133 133 132 132 133 132 132 133 133 132 132 133 133 132 133 131 133 143 138 148 148 130 142 135 129 133 132 132 132 133 133 132 131 133 157 145 122 75 23 21 36 34 33 20 59 142 41 53 29 61 61 136 137 135 133 132 132 133 133 134 143 140 141 141 133 135 145 131 133 140 142 132 132 133 132 132 133 132 132 133 133 133 132 132 133 132 133 132 132 135 135 137 135 132 131 133 132 133 132 132 132 132 132 132 133 132 132 132 133 132 132 132 133 133 132 133 132 132 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 129 132 132 132 132 133 133 132 132 133 132 132 132 132 132 132 132 133 132 133 130 148 148 138 143 135 130 150 137 129 133 132 132 133 133 132 141 131 149 157 72 35 36 41 41 36 29 33 15 56 27 27 27 29 28 49 49 143 152 133 133 132 134 132 138 141 141 141 146 133 139 137 131 132 132 142 132 132 133 133 132 133 133 132 132 132 132 133 133 133 133 133 133 136 134 135 135 135 132 131 134 133 133 132 132 132 132 132 132 133 133 132 132 133 132 132 132 133 132 132 133 132 133 133 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 138 133 133 133 133 133 132 133 133 133 133 133 132 132 132 132 133 133 133 132 133 136 146 141 144 148 135 144 152 131 132 132 133 132 131 138 148 157 68 37 37 25 42 42 37 16 137 105 105 28 43 35 38 19 82 17 12 54 82 140 130 133 134 134 130 144 142 144 141 134 134 145 132 131 138 143 132 133 133 133 132 132 132 133 132 133 133 133 132 133 132 133 134 135 134 134 135 134 132 133 133 133 132 132 132 133 133 132 132 133 133 133 132 132 133 133 133 133 132 132 132 133 133 133 132 132 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 137 150 150 130 133 133 133 132 132 132 133 132 133 132 132 132 132 132 132 132 133 132 133 136 136 141 142 147 136 142 149 134 129 132 132 135 143 95 24 70 27 28 37 40 15 14 14 24 184 255 136 35 32 149 149 132 255 126 87 22 46 139 150 132 132 130 133 143 143 140 144 132 134 139 132 132 132 151 136 134 133 132 132 133 133 132 132 132 133 133 133 132 132 133 132 134 134 135 135 133 132 133 133 132 132 132 132 132 132 132 133 133 133 132 133 133 133 132 133 132 133 132 132 132 132 132 133 133 133 132 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 130 137 148 129 131 133 133 133 132 133 133 133 132 132 133 133 132 133 133 132 132 132 133 129 137 141 139 147 148 128 141 131 130 133 153 148 113 54 28 35 18 14 14 19 67 43 223 255 216 94 94 11 54 202 255 245 237 255 255 34 8 123 157 133 132 133 130 143 141 142 143 128 128 147 133 133 135 143 133 134 134 133 132 132 133 133 132 133 132 132 132 133 132 132 132 136 137 136 135 134 134 133 133 132 132 132 133 132 132 133 133 133 132 132 132 133 132 132 132 132 133 132 132 132 132 133 133 132 132 132 132 133 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 130 130 148 144 131 133 133 132 132 132 133 133 132 132 133 132 132 132 133 133 132 132 133 129 137 148 139 148 131 128 149 149 130 133 153 98 35 32 29 29 18 92 89 255 228 255 223 250 216 28 9 96 255 255 255 234 237 245 198 105 26 26 157 132 132 133 137 144 141 139 143 134 139 144 131 132 135 143 133 132 133 133 132 132 133 133 132 133 132 132 132 132 132 131 132 136 136 137 135 134 134 132 132 133 133 132 133 133 132 132 133 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 132 133 132 133 132 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 132 131 149 152 131 131 133 132 133 133 132 133 132 132 132 133 133 132 132 132 132 132 133 132 139 147 141 141 147 132 141 146 130 148 99 99 30 34 36 224 255 253 255 255 255 255 158 9 13 43 25 30 196 142 255 255 246 246 255 255 26 22 155 132 132 132 130 141 142 141 140 134 131 147 129 132 137 142 130 133 133 133 132 132 132 132 133 133 132 133 133 133 132 131 137 137 135 138 135 133 134 132 132 133 133 133 133 133 132 133 132 132 132 132 133 132 133 133 132 132 132 132 132 133 132 133 132 132 133 132 132 132 132 133 132 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 133 133 133 133 146 136 128 132 132 132 132 132 132 133 132 133 133 133 133 132 132 132 132 133 132 130 142 141 141 145 130 145 145 130 133 107 32 35 33 196 196 255 237 237 242 253 205 142 13 48 248 137 162 7 6 137 114 255 238 255 255 19 19 117 153 132 133 133 141 144 140 142 137 137 146 130 131 133 147 132 131 133 133 133 133 133 132 132 132 132 132 132 132 132 132 134 138 135 139 137 133 134 136 133 132 133 133 132 132 132 133 133 132 132 132 132 133 132 133 133 132 133 133 132 133 132 133 132 132 133 133 132 132 133 133 133 132 132 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 132 132 132 132 132 144 139 139 133 132 132 132 132 132 133 133 132 132 132 133 132 133 132 133 132 132 130 140 142 142 148 141 132 148 127 155 56 56 35 29 185 255 240 240 241 240 242 255 39 27 116 165 255 255 143 132 5 8 55 55 211 220 137 10 131 148 133 133 130 137 140 139 141 136 133 142 134 131 139 150 131 131 132 132 132 132 133 133 132 132 133 133 132 133 132 131 140 140 136 139 136 130 137 134 134 134 132 132 132 133 132 132 133 132 132 133 132 133 132 132 132 133 133 132 133 133 133 133 133 132 132 133 132 133 132 132 133 133 132 132 133 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 133 133 133 132 132 144 155 128 131 132 133 132 132 132 133 132 133 132 132 133 132 133 133 132 132 132 132 140 145 140 152 131 133 148 142 155 86 31 21 181 255 255 240 240 241 240 253 117 117 27 19 165 202 255 255 134 134 8 13 37 34 208 47 10 55 148 131 132 131 145 145 139 143 136 133 145 132 131 131 150 135 131 132 133 133 132 132 133 132 133 132 132 133 133 132 131 136 141 135 138 138 130 135 134 134 133 133 133 133 133 132 132 132 133 132 133 132 133 132 133 133 132 132 132 132 133 132 133 132 133 133 133 133 133 132 133 132 132 132 132 133 132 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 133 132 133 133 132 141 156 141 130 133 132 132 133 133 132 132 132 132 132 133 132 132 132 132 132 132 133 142 146 140 141 143 130 147 163 78 27 28 24 153 255 240 240 240 240 240 241 238 43 42 38 36 36 209 209 255 255 152 168 19 20 47 47 17 83 140 133 132 131 141 142 141 142 133 133 148 136 132 133 146 134 133 133 133 133 132 132 132 133 132 132 132 132 133 132 132 140 141 134 140 138 135 140 133 133 132 132 132 132 132 133 132 132 132 132 133 132 133 133 133 133 133 133 133 132 132 132 132 132 132 132 133 132 132 132 132 133 132 132 133 132 132 132 133 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 132 133 132 132 132 132 131 137 147 130 133 132 132 132 132 133 132 132 132 132 133 132 133 132 132 133 133 133 131 144 138 143 143 129 134 171 73 27 37 19 247 248 236 238 239 246 246 255 154 154 24 42 34 33 38 48 255 255 255 255 167 173 19 29 31 31 160 134 134 132 142 142 138 142 135 132 144 131 132 132 146 141 133 132 132 133 132 133 132 132 133 132 132 132 132 132 133 137 139 134 142 142 131 140 135 132 133 133 133 133 132 132 133 133 133 132 132 133 132 132 133 133 132 132 133 132 133 132 132 133 132 132 133 133 133 132 133 133 132 132 132 132 132 132 132 132 132 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 133 133 132 132 133 133 130 157 157 130 130 132 132 132 133 132 132 132 132 133 132 132 133 132 132 133 133 131 130 147 147 143 148 129 154 79 24 40 40 19 175 248 255 242 255 246 255 255 255 17 40 44 37 33 33 48 104 255 241 255 255 173 142 29 29 119 160 134 134 132 139 140 140 142 134 132 140 131 131 137 144 130 133 132 133 133 132 133 132 133 133 132 132 132 132 133 132 143 143 134 139 134 136 138 130 132 133 133 133 132 132 132 132 133 132 132 132 132 132 132 132 133 133 132 132 133 133 132 132 133 132 133 132 132 133 132 133 133 133 132 133 133 133 132 133 132 133 132 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 132 133 132 132 133 133 136 153 133 132 133 133 133 133 133 133 132 132 132 132 132 133 132 133 133 133 133 131 144 143 145 147 135 135 108 23 41 43 76 135 205 205 255 154 147 3 65 68 94 24 35 44 19 30 10 11 196 255 238 238 255 234 15 15 50 139 135 134 133 141 142 138 143 140 132 142 131 132 133 145 131 132 133 132 132 132 133 132 133 132 132 132 133 133 132 130 141 140 142 142 138 133 143 134 133 132 132 132 132 133 132 133 132 132 133 133 133 132 133 133 132 133 132 132 132 133 133 133 132 132 132 132 133 132 132 132 132 132 132 132 133 133 133 133 132 132 132 132 133 133 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 132 132 132 133 132 133 133 131 131 159 138 136 134 133 132 132 132 132 132 132 132 133 132 133 133 132 133 133 133 144 144 138 140 136 137 85 38 39 39 30 21 26 15 16 144 37 96 11 19 37 14 57 255 112 187 47 30 124 255 240 240 238 254 104 47 38 73 142 142 134 136 144 140 144 136 133 137 138 132 138 148 130 132 133 132 132 132 133 132 132 132 133 133 133 132 133 131 143 143 140 143 132 138 138 131 133 132 132 132 133 132 132 133 133 132 133 132 132 132 132 132 132 133 132 133 132 133 133 133 133 132 132 132 132 133 132 132 132 133 133 133 132 132 133 132 133 132 133 133 133 133 133 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 133 133 133 132 132 133 133 133 133 130 129 160 142 134 134 132 133 133 133 132 132 132 132 132 133 133 132 132 132 132 134 132 145 137 144 138 138 152 151 29 36 40 29 72 72 165 255 255 255 55 155 16 71 65 255 255 255 232 230 75 247 243 240 242 255 216 216 36 16 136 140 132 138 140 139 140 141 133 142 131 129 131 145 137 130 133 133 133 133 132 132 132 132 133 132 133 133 133 131 142 140 142 139 132 132 140 131 133 132 132 132 133 133 132 132 132 132 132 132 132 133 132 132 132 133 132 132 133 133 132 133 133 133 133 132 133 133 132 132 133 132 133 132 132 132 133 132 133 133 133 132 133 132 132 132 133 133 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 133 132 133 133 132 132 132 132 133 132 129 146 142 128 134 133 133 132 133 133 132 132 133 132 132 132 132 132 132 132 132 132 145 146 144 146 134 151 94 29 36 43 29 63 255 255 255 255 255 253 155 238 255 249 255 255 255 255 230 237 248 247 240 255 255 124 44 20 78 153 140 133 138 144 138 141 136 136 142 140 129 137 145 133 132 132 133 133 132 132 132 133 132 132 132 132 132 132 139 145 140 139 139 131 145 137 132 132 132 132 132 132 132 132 133 133 132 132 133 132 132 132 132 133 133 133 133 133 133 133 133 132 133 132 133 133 133 133 132 132 132 133 132 132 132 133 132 132 133 132 132 132 132 133 132 133 132 132 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 133 132 132 132 133 132 132 132 133 132 131 143 149 128 132 136 133 132 132 132 132 132 132 132 132 132 133 133 132 132 132 132 146 144 142 148 138 131 183 71 38 43 56 66 235 90 119 28 72 19 52 52 143 50 145 83 226 151 255 255 244 255 248 77 24 29 24 25 51 145 134 132 141 141 140 140 140 133 145 135 132 132 146 138 132 133 132 132 132 132 132 132 132 132 132 133 132 133 134 141 138 144 134 134 140 145 128 132 133 132 132 132 132 132 133 132 132 132 133 132 133 132 132 132 133 132 133 132 133 132 132 132 133 133 133 133 133 132 132 132 132 132 133 132 132 133 133 132 132 133 132 132 132 133 133 132 132 132 133 132 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 132 133 132 132 132 133 133 132 133 132 131 128 165 159 132 135 132 132 132 132 133 132 132 133 133 133 132 132 133 133 135 132 134 146 135 146 136 127 155 58 21 43 39 27 21 19 22 22 20 20 24 21 24 24 20 20 46 23 100 81 255 255 213 27 19 29 39 121 153 136 137 135 133 143 138 140 137 137 138 147 131 133 145 134 134 134 133 132 132 132 132 132 133 132 132 133 133 133 143 146 140 140 140 128 147 138 133 133 132 133 133 132 132 133 132 132 133 132 133 132 133 132 133 133 133 132 132 133 133 133 133 132 132 133 132 133 132 132 133 132 132 133 132 132 132 133 132 133 133 132 133 132 132 132 133 133 132 132 132 132 133 132 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 132 132 133 133 133 132 133 132 132 133 133 132 133 133 133 129 166 173 132 129 133 133 133 133 133 133 132 133 132 133 133 132 133 133 133 134 133 148 137 145 146 135 176 101 22 18 16 94 14 63 30 129 59 172 78 78 23 62 20 34 24 18 21 21 79 93 94 22 33 128 81 160 149 133 133 133 136 136 141 140 141 133 145 139 129 129 146 140 133 133 133 133 132 133 133 132 132 133 133 133 133 131 133 146 135 145 134 134 141 145 130 132 132 133 133 133 132 133 132 133 133 133 133 132 133 133 133 132 132 133 132 133 133 133 133 132 133 133 133 132 133 132 132 133 132 132 133 132 132 133 132 132 132 133 132 132 132 133 132 132 132 132 132 133 132 132 132 132 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 132 133 133 133 132 132 132 133 133 133 132 133 133 129 134 173 138 134 133 132 132 133 133 133 132 132 132 133 133 132 133 132 133 131 131 148 141 145 164 155 47 11 11 18 127 94 255 213 255 129 255 172 255 173 255 139 209 34 70 18 22 16 8 71 71 22 41 128 171 134 136 131 131 133 130 144 140 143 140 133 137 139 128 139 151 132 134 133 132 133 132 132 133 133 133 133 132 133 132 129 140 140 140 145 141 135 145 131 132 132 132 133 132 132 132 132 132 133 133 133 132 133 133 132 132 132 133 133 132 132 132 133 133 132 132 132 132 132 133 132 132 133 132 132 133 133 133 133 132 132 133 132 133 132 132 133 133 132 132 132 132 133 133 132 132 133 133 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 133 132 132 132 133 132 132 132 133 132 132 132 133 132 132 129 128 176 176 126 134 132 133 133 133 132 132 132 132 132 132 132 133 133 132 133 130 147 141 169 169 87 58 105 255 255 254 255 255 255 248 255 246 252 245 255 254 255 255 255 255 150 218 41 68 11 24 35 21 79 79 149 151 132 132 132 135 143 143 141 143 132 140 134 128 132 147 136 131 132 132 133 133 133 133 133 132 133 133 132 132 131 133 145 137 144 133 130 145 135 131 133 133 132 132 132 133 133 133 132 133 133 133 132 133 133 132 133 132 133 133 132 133 132 133 132 132 132 132 132 133 132 132 132 132 133 132 132 132 132 133 132 132 133 132 132 132 132 133 132 132 132 132 133 133 133 132 133 133 133 132 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 133 133 132 132 132 133 133 132 133 133 132 133 133 132 132 132 133 130 160 185 126 132 132 132 133 132 133 132 132 132 133 133 132 132 133 133 136 136 135 145 155 47 100 255 255 255 252 247 245 246 247 247 246 248 248 246 246 247 250 247 254 248 255 255 255 255 160 160 35 53 16 16 69 82 148 148 134 132 143 140 142 140 136 133 146 131 133 150 133 131 132 132 132 132 133 132 132 132 132 132 132 132 127 140 140 140 148 142 136 145 128 133 132 132 132 132 132 132 133 132 132 133 132 132 133 132 132 132 132 133 133 132 132 133 132 132 132 132 133 132 132 133 133 132 132 133 133 133 133 133 132 132 132 132 133 132 132 132 132 132 133 132 132 132 132 132 132 133 132 133 132 133 133 133
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 133 132 132 132 133 132 133 132 132 133 132 132 132 132 132 133 133 130 152 152 154 125 133 132 132 133 133 132 132 132 133 133 133 133 132 133 133 134 138 160 91 91 46 252 249 247 246 247 248 248 247 247 247 247 246 246 246 247 247 247 245 244 247 247 254 249 255 255 233 252 70 70 16 18 123 149 133 133 140 143 141 142 132 135 140 132 131 135 141 130 133 132 132 132 132 133 132 133 132 132 133 133 132 135 143 138 143 126 128 143 135 132 133 132 133 132 132 132 133 133 132 133 132 132 132 132 133 132 133 133 133 133 133 133 133 132 133 132 132 132 133 132 132 132 133 132 132 132 132 132 132 133 132 132 132 133 133 132 132 132 132 132 132 133 132 133 132 132 132 132 132 132 133 132
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 133 133 132 133 132 133 133 133 132 132 133 133 132 133 133 132 133 133 130 123 190 161 129 134 132 133 133 132 133 132 133 133 133 133 133 132 133 132 134 130 160 134 6 122 255 246 247 247 247 247 247 247 247 247 247 247 246 247 247 247 247 247 244 247 247 247 247 248 255 255 252 255 63 44 31 108 149 133 133 142 139 144 140 140 135 146 132 132 134 131 132 132 132 133 133 133 132 133 133 133 132 132 133 129 145 136 138 146 126 135 144 131 133 133 132 132 132 132 132 133 132 132 133 133 132 132 132 132 132 132 133 132 133 133 132 132 132 133 132 132 132 132 132 132 132 132 132 133 133 133 132 132 133 133 132 133 132 132 132 133 132 133 132 132 132 132 133 133 132 132 132 133 133 133 132
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 133 132 132 132 132 133 132 133 132 133 133 132 132 133 132 133 133 130 127 148 188 127 128 132 133 133 133 133 132 133 132 133 133 132 132 132 132 133 129 171 91 28 21 255 250 247 247 247 246 247 245 247 247 247 247 247 247 247 247 247 247 247 247 247 247 246 246 248 248 254 255 255 215 25 47 152 134 136 136 141 139 144 134 139 142 132 132 132 132 131 134 130 137 132 130 132 131 132 131 132 132 132 131 143 147 147 148 130 130 146 134 133 133 132 133 132 132 133 132 133 133 132 132 133 132 132 132 132 133 133 132 132 132 132 132 133 132 132 132 133 133 132 132 132 133 132 132 133 133 133 133 133 133 132 133 132 133 133 132 133 132 132 132 132 132 133 132 132 132 132 132 133 133 132
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 133 132 132 132 132 132 133 132 133 132 132 132 132 133 133 132 133 132 133 131 132 139 181 130 123 134 131 132 132 133 132 133 133 132 132 132 132 132 132 133 133 146 168 6 57 255 247 247 247 247 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 245 246 246 247 247 255 244 38 31 127 143 139 129 137 138 149 142 142 131 169 144 164 158 143 158 158 154 152 156 151 156 151 135 153 134 146 131 133 142 140 141 148 131 139 140 128 132 132 133 133 132 132 132 132 132 132 132 133 132 133 133 132 133 133 133 132 132 133 132 132 133 132 132 133 132 133 133 133 132 133 132 132 133 133 132 132 133 132 133 132 132 133 133 132 132 132 132 133 133 133 132 133 132 132 133 133 133 133 133
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 133 133 132 132 132 133 132 133 133 133 133 133 133 132 132 133 133 133 132 132 133 124 124 181 184 123 133 132 132 132 133 132 133 133 132 132 133 132 132 132 133 129 153 67 67 57 253 247 247 247 247 247 247 247 247 247 247 248 247 247 247 247 247 247 247 247 247 247 247 246 247 247 255 199 199 38 36 127 141 132 140 137 154 149 173 161 129 157 54 164 103 143 50 101 31 86 86 151 86 151 95 151 112 157 157 133 155 140 150 138 129 139 147 128 132 132 132 132 132 132 133 132 133 132 133 133 133 133 133 132 133 132 132 132 132 133 132 132 132 132 132 133 132 133 132 132 132 133 132 132 132 133 132 132 132 132 132 132 133 133 133 133 133 133 133 133 132 133 132 132 133 132 132 133 132 132 132
0 0 0 0 0 0 0 0 0 0 0 0 0 0 132 132 133 133 133 133 132 132 133 133 133 133 133 133 132 133 132 132 133 133 132 132 132 128 174 189 123 123 134 133 132 133 132 132 133 132 132 132 132 133 133 133 133 127 167 22 183 255 247 247 247 247 247 248 247 247 247 247 247 247 247 247 247 248 247 247 247 247 247 247 247 247 247 255 209 30 38 132 150 150 143 162 176 69 80 9 102 12 28 20 14 81 32 164 14 67 21 77 22 82 21 21 34 22 63 31 112 81 162 162 146 130 146 141 134 133 133 132 133 132 133 132 132 132 133 132 132 132 133 133 133 133 133 132 133 133 132 133 132 132 133 132 132 132 132 133 132 133 132 132 132 132 133 133 133 133 133 132 132 132 132 132 133 133 133 132 133 133 132 133 133 133 133 132 133 132 133 133
0 0 0 0 0 0 0 0 0 0 0 0 0 142 141 141 134 133 133 132 132 133 132 132 133 132 132 132 132 132 133 132 132 133 132 132 133 133 127 160 149 125 133 132 133 132 132 132 132 133 132 132 133 132 132 132 132 137 73 73 121 255 247 247 247 247 247 247 247 247 247 247 247 247 247 247 248 247 247 247 247 247 247 247 247 247 249 255 62 62 31 141 172 65 67 7 64 10 8 115 88 245 210 251 147 251 221 249 250 236 250 250 190 251 181 248 168 230 106 106 28 43 51 44 142 122 146 153 131 133 131 132 132 132 133 132 133 132 132 132 132 132 133 132 132 132 133 132 133 133 132 133 133 132 132 133 133 132 133 132 133 132 133 132 133 132 132 132 132 132 133 133 133 133 132 132 133 133 132 132 132 133 132 133 133 133 132 133 132 132 133 132
0 0 0 0 0 0 0 0 0 0 0 0 0 133 142 144 132 132 132 133 133 132 133 132 132 132 133 132 133 133 132 133 133 133 133 133 131 133 126 153 160 160 130 133 132 133 133 132 132 132 132 132 132 132 133 133 132 130 138 44 255 248 248 248 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 246 246 247 255 148 25 73 14 8 8 7 143 145 252 251 236 250 232 239 205 213 206 204 221 217 212 210 208 211 212 215 215 243 218 247 236 215 239 91 91 42 58 135 140 158 112 146 155 138 143 133 132 132 132 133 132 132 133 133 133 132 132 132 133 132 132 132 133 132 132 132 133 133 133 133 132 132 132 132 132 132 132 133 133 132 132 132 133 132 133 132 132 132 132 132 133 132 132 133 133 132 133 133 132 133 133 132 133
0 0 0 0 0 0 0 0 0 0 0 0 134 133 133 144 136 132 132 132 132 132 132 132 133 132 132 133 133 133 133 133 132 132 133 133 133 133 130 153 192 125 129 132 132 133 133 132 133 132 132 132 132 132 132 133 132 160 53 44 197 248 249 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 246 250 255 242 18 25 11 14 120 135 252 252 252 252 250 236 210 209 208 207 207 206 229 221 233 211 207 208 207 212 214 211 212 210 209 236 220 239 250 149 213 63 63 140 63 112 52 133 115 145 145 132 133 132 132 132 132 133 133 133 133 133 132 133 133 132 133 133 133 132 132 133 133 133 132 132 133 133 132 132 132 132 132 133 132 133 132 133 132 133 132 133 132 133 132 133 132 132 133 132 133 132 132 132 133 133 132 132
0 0 0 0 0 0 0 0 0 0 0 0 133 134 132 143 145 130 130 132 132 133 133 133 133 133 133 132 132 132 133 132 132 132 132 132 133 133 132 144 188 170 126 133 133 132 132 133 133 133 133 133 132 132 133 133 133 146 106 80 255 248 248 247 247 247 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 246 250 255 248 255 163 94 13 39 245 252 250 252 249 249 245 244 213 204 204 210 243 243 212 220 64 103 103 209 250 244 228 247 173 231 239 210 210 210 241 249 76 250 99 61 26 73 109 105 105 37 39 111 110 140 136 133 133 133 133 133 133 132 133 132 133 133 132 133 132 133 133 132 132 132 132 132 132 133 133 132 132 132 132 132 133 132 132 133 132 132 133 132 132 133 133 133 132 133 132 132 132 132 132 132 133 133 133 132 132 133
0 0 0 0 0 0 0 0 0 0 0 131 131 133 133 133 142 134 130 133 132 132 132 133 133 132 132 133 133 132 133 132 133 133 132 133 133 133 133 127 138 180 135 133 133 132 132 132 132 133 133 133 133 132 133 132 130 145 35 40 228 251 252 249 255 255 255 250 255 248 255 248 255 247 247 247 247 247 247 247 253 255 255 255 84 19 49 133 251 204 251 250 245 245 246 244 244 216 234 237 228 225 37 44 44 50 137 141 168 188 23 192 38 77 46 130 135 229 220 216 231 145 24 23 177 90 90 75 80 126 114 178 172 36 36 119 134 134 133 133 132 133 132 133 133 133 132 132 132 132 132 132 133 132 133 133 133 133 133 132 132 133 133 133 133 132 132 132 133 132 132 132 132 133 132 132 133 132 133 132 132 132 132 133 132 132 132 132 132 132 133 133
0 0 0 0 0 0 0 0 0 0 131 131 131 131 132 131 135 141 141 131 131 133 133 132 133 133 133 132 133 133 132 132 133 132 132 133 132 132 132 127 132 181 188 122 132 133 132 132 132 133 132 133 133 132 132 133 133 159 67 141 255 255 186 255 228 255 114 207 83 222 222 255 227 255 255 255 255 252 252 249 255 254 41 4 115 8 216 251 249 248 247 243 247 244 250 250 252 239 44 38 38 37 84 111 252 236 35 33 33 29 138 109 250 200 237 68 65 176 246 214 46 107 251 199 250 250 241 234 248 143 143 161 241 173 183 58 51 150 150 132 133 132 132 133 132 132 133 132 132 132 133 133 133 133 133 132 132 132 132 132 132 132 133 132 132 132 132 132 133 132 132 132 132 132 133 133 133 132 132 133 133 133 133 133 133 132 133 132 132 132 132 132
0 0 0 0 0 0 0 0 0 0 131 131 133 132 132 132 135 145 132 130 131 132 133 132 133 132 132 132 132 132 132 132 133 133 132 132 132 132 132 133 132 174 143 123 132 134 132 133 132 132 133 132 133 132 132 151 157 81 78 78 255 160 186 25 56 1 10 10 83 12 82 15 118 36 255 173 255 255 255 255 151 3 41 30 115 251 250 244 248 248 247 246 247 252 252 84 252 56 44 48 67 252 251 53 252 37 35 136 142 251 250 250 250 234 237 233 54 65 250 250 46 158 251 209 211 209 241 217 248 236 190 215 237 231 183 169 51 48 153 152 132 132 132 132 132 133 132 132 132 132 133 133 132 133 132 133 132 132 132 132 133 133 132 133 132 133 132 132 133 132 133 133 132 132 133 133 132 133 133 133 133 132 133 133 132 132 133 132 132 132 132 133
0 0 0 0 0 0 0 0 0 132 132 132 131 132 132 133 134 140 147 139 130 132 133 132 133 133 132 133 132 133 133 133 133 133 132 132 132 133 133 135 128 128 195 153 130 134 133 132 132 133 133 133 133 141 153 153 108 33 31 13 11 14 6 6 2 92 43 207 102 255 24 120 21 94 25 57 66 103 255 138 33 40 156 251 250 250 246 245 246 251 251 222 155 155 116 9 18 239 251 147 254 98 74 82 101 250 251 207 251 209 210 210 208 211 213 213 206 67 207 241 84 244 210 210 211 209 210 210 211 210 218 210 211 210 233 244 93 53 58 92 141 134 133 132 132 132 133 132 132 132 133 133 133 133 133 133 133 133 132 133 132 132 132 132 133 132 133 133 133 132 132 132 132 132 132 132 133 132 132 132 132 132 132 132 133 133 132 132 133 130 132 131
0 0 0 0 0 0 0 0 0 133 132 132 132 133 132 133 131 131 148 144 131 131 133 133 133 132 132 133 132 132 132 133 132 132 132 133 133 133 133 133 128 128 197 165 123 128 133 132 133 133 132 133 132 155 128 42 19 39 31 31 21 189 162 255 255 255 255 255 255 255 255 255 255 254 205 255 148 118 29 50 154 251 250 250 246 246 246 251 252 252 252 32 11 120 165 252 195 251 198 30 34 215 245 224 250 218 211 209 208 213 212 212 210 210 211 212 251 87 231 231 98 140 215 209 210 210 210 210 211 211 212 212 211 210 212 209 246 233 29 24 148 148 132 132 133 133 132 132 133 133 132 132 132 133 133 132 132 132 133 133 132 132 133 133 132 133 132 133 133 132 133 133 132 132 132 133 133 132 132 132 132 133 132 133 132 132 133 132 131 135 135 142
0 0 0 0 0 0 0 0 132 133 133 132 132 133 132 132 133 136 136 144 138 131 133 132 133 132 132 133 132 132 133 132 132 132 132 133 132 133 132 134 132 128 150 165 123 133 133 133 133 133 132 133 149 98 27 42 14 39 214 206 255 255 249 255 254 255 247 249 245 245 245 255 247 254 254 255 38 5 5 50 246 251 248 246 249 246 250 251 177 92 17 62 253 120 255 252 75 42 119 180 180 215 230 224 210 210 211 211 211 213 212 211 210 210 211 212 225 87 113 235 184 213 216 209 211 210 210 211 211 210 210 212 211 210 210 211 216 185 185 24 38 153 148 133 132 133 132 132 133 132 133 133 133 133 132 132 133 132 133 132 132 132 132 133 132 132 133 133 132 132 132 133 133 132 132 133 133 132 132 132 133 133 133 133 132 132 129 133 146 142 142 142
0 0 0 0 0 0 0 0 133 132 133 133 132 132 132 132 133 131 130 146 145 131 131 133 133 133 133 133 132 133 133 133 133 132 132 133 133 133 132 132 132 122 140 177 177 126 133 133 133 133 154 126 126 63 27 19 147 255 250 255 248 249 247 245 247 247 247 247 247 247 247 247 255 239 239 156 6 42 243 251 249 245 245 248 251 252 96 23 74 6 178 242 252 221 28 35 213 65 251 250 232 234 240 211 211 210 210 210 210 210 210 211 210 210 211 210 222 174 217 242 220 207 212 210 211 210 210 211 210 210 211 210 210 210 210 210 210 234 248 68 34 75 114 138 132 132 133 132 132 133 132 133 132 133 132 133 133 132 133 133 133 132 133 132 132 133 132 133 133 133 132 132 132 132 132 133 132 132 132 133 133 133 131 130 132 136 136 142 144 140 132 133
0 0 0 0 0 0 0 132 132 133 133 132 133 132 132 132 133 133 133 134 139 135 132 134 133 133 133 133 132 132 132 133 132 133 132 132 132 133 133 132 133 133 126 187 185 125 133 132 132 134 150 98 29 30 37 27 176 255 247 247 247 247 247 247 247 247 247 247 247 247 247 248 255 191 8 35 222 250 250 249 248 244 251 251 53 207 10 13 224 252 232 149 32 59 82 146 243 230 232 245 245 250 242 214 209 211 210 211 211 210 211 210 210 210 211 210 210 225 208 212 209 209 208 211 210 211 210 211 211 211 211 210 211 210 211 210 210 210 210 240 207 18 31 155 150 132 133 133 133 133 132 132 132 132 133 133 132 133 133 132 132 132 132 132 132 133 132 132 132 133 133 132 133 133 132 132 133 132 132 133 130 129 129 133 148 148 138 133 133 132 132 133
0 0 0 0 0 0 133 132 132 133 132 133 133 132 132 132 133 133 132 128 133 142 142 133 132 132 132 132 133 132 132 133 132 133 133 132 133 133 132 132 134 135 126 176 176 139 123 131 155 123 38 27 27 26 56 210 255 247 247 247 247 247 247 247 247 247 247 247 247 247 255 252 38 12 12 112 248 247 250 246 250 251 251 190 7 31 235 251 223 251 103 45 133 227 230 230 188 228 250 250 250 230 206 209 209 211 211 210 207 207 221 210 210 211 211 210 211 209 214 209 214 209 246 226 249 217 217 211 210 210 211 211 211 211 211 210 210 211 212 227 248 130 58 75 114 137 130 132 133 133 133 132 132 133 132 133 133 132 132 133 133 133 132 133 133 132 132 132 132 132 133 132 132 132 133 133 131 130 132 129 135 140 144 150 134 131 131 131 132 133 132 132
0 0 0 0 0 0 133 133 132 132 133 133 133 132 132 133 132 133 132 132 133 143 135 132 132 133 132 133 133 132 132 132 133 133 133 132 133 132 132 132 134 134 126 130 193 148 133 150 155 94 38 34 18 92 246 246 255 247 247 247 247 247 247 247 247 247 247 247 247 255 255 199 38 47 183 234 231 250 250 247 250 203 53 39 143 143 235 250 223 48 45 245 244 244 230 233 188 180 246 248 250 226 206 211 211 209 207 234 207 235 221 247 210 210 211 211 211 212 214 251 250 162 223 223 249 229 220 213 210 211 211 210 211 207 217 212 210 210 212 212 248 237 22 15 143 143 130 133 133 133 133 133 132 133 132 132 133 132 132 132 133 132 132 132 132 132 133 133 132 132 133 133 132 132 133 133 131 129 132 148 151 139 144 133 134 132 132 133 133 133 132 132
0 0 0 0 0 136 134 134 133 133 132 133 133 132 132 133 132 132 132 133 133 136 148 141 130 133 133 132 133 133 132 133 133 132 133 132 133 133 132 133 133 132 126 128 170 196 137 115 62 28 30 42 20 148 255 249 247 247 247 247 247 247 247 247 247 247 247 247 250 255 132 11 111 249 233 217 212 230 250 235 90 20 10 140 233 239 233 54 58 58 141 243 220 242 130 65 170 170 250 247 242 210 211 210 212 207 215 239 213 56 91 91 237 210 211 210 223 203 123 123 119 17 27 32 43 42 219 243 211 210 210 210 222 144 196 223 210 211 211 211 215 215 186 112 42 92 144 132 133 133 133 132 133 132 132 132 133 132 132 133 132 132 133 132 132 133 132 132 132 133 132 132 133 131 130 136 142 149 148 148 142 130 130 135 133 132 133 133 133 132 132 133
0 0 0 0 0 138 136 135 135 134 133 133 132 133 133 132 133 133 133 133 132 129 142 144 131 131 132 133 133 133 132 133 132 132 133 132 133 133 133 132 132 132 134 129 160 210 86 25 35 36 20 84 235 255 245 245 248 245 247 247 247 247 247 247 247 247 247 255 250 37 81 26 169 242 212 212 209 246 251 151 21 87 219 234 248 248 159 43 119 247 213 248 145 145 57 131 250 249 245 246 247 231 208 209 213 237 132 55 70 87 59 33 238 211 210 210 213 199 54 154 149 251 229 229 97 115 59 114 218 208 211 210 218 216 145 235 209 211 211 211 210 209 249 216 12 12 128 154 133 132 133 132 133 132 133 132 132 132 133 132 133 132 132 132 132 133 132 132 132 133 132 129 129 147 153 153 154 142 136 133 130 133 133 135 133 132 132 132 132 132 133 133
0 0 0 0 137 137 137 137 135 135 135 134 132 132 132 132 132 131 132 133 132 133 133 138 139 133 132 133 132 132 132 133 133 132 132 132 133 133 132 132 133 133 133 150 136 141 70 26 36 31 141 255 255 252 246 247 247 247 247 247 247 247 247 247 247 248 255 255 214 17 62 239 230 214 212 212 224 213 70 33 173 242 250 232 231 62 74 245 222 222 227 207 63 77 244 250 246 246 246 247 250 224 213 240 243 142 69 137 248 240 91 91 162 241 211 211 214 224 230 230 251 212 226 206 245 248 73 34 235 246 211 210 221 225 126 145 213 209 211 210 210 210 209 224 151 64 70 121 134 134 133 133 133 133 132 132 133 132 133 133 132 133 133 133 133 133 133 134 132 131 134 134 139 154 152 133 131 131 133 133 133 132 133 133 132 132 132 132 133 133 132 132
0 0 0 0 137 137 138 136 136 135 135 134 134 132 134 133 133 129 129 133 133 133 132 144 144 132 132 133 133 133 132 133 133 132 133 132 133 133 133 132 132 133 132 150 88 45 34 24 24 31 210 255 246 246 247 247 248 247 247 247 247 247 247 247 247 248 255 171 16 101 101 239 217 214 212 238 174 29 29 33 223 242 235 176 52 62 139 245 218 248 128 26 119 77 251 250 250 249 250 249 249 224 234 240 67 69 239 244 244 240 185 58 244 209 210 211 210 224 210 207 210 208 212 206 210 248 220 36 165 209 209 210 209 225 122 232 213 211 211 210 211 211 210 250 236 64 13 121 152 133 132 133 133 133 133 132 133 132 133 133 133 133 132 133 133 133 129 134 129 131 147 156 145 137 130 133 131 131 133 133 133 133 133 133 132 132 132 133 132 133 133 132
0 0 0 138 138 138 137 137 138 137 136 135 136 135 135 134 134 132 134 132 133 134 134 134 140 135 132 132 133 132 132 133 132 132 133 133 132 133 132 132 132 136 141 71 71 29 37 20 130 255 255 248 248 246 247 248 247 247 247 247 247 247 247 247 254 255 76 118 21 148 243 212 212 217 217 248 123 19 136 249 211 241 241 143 69 194 227 235 184 234 61 8 129 248 222 233 212 246 224 250 238 242 79 56 56 131 242 213 210 238 70 53 193 212 211 211 211 211 210 208 210 204 222 230 239 222 222 88 28 251 217 210 209 224 224 152 232 209 210 210 210 211 211 207 218 163 88 55 112 153 134 132 132 132 132 132 132 132 133 133 133 133 133 133 133 132 132 134 155 154 133 153 134 130 132 133 132 132 132 132 133 132 132 133 133 132 132 132 132 132 132 132
0 0 144 142 142 138 138 137 136 137 138 136 137 137 136 135 136 135 135 135 133 134 134 132 138 143 143 130 133 133 132 132 133 132 132 132 132 132 132 132 149 143 124 53 31 28 54 201 201 255 249 247 246 247 247 247 247 248 247 247 247 247 246 247 255 255 52 31 213 232 232 210 211 221 230 70 40 198 198 244 210 244 96 75 234 224 223 247 99 37 28 124 246 244 208 211 206 207 205 248 248 181 68 130 234 236 208 209 209 247 88 124 242 210 210 210 210 210 209 210 211 218 247 249 247 228 209 188 48 249 249 208 211 226 213 171 235 210 210 210 210 210 211 211 212 249 250 21 10 153 155 132 132 133 132 132 133 133 132 133 133 132 130 128 139 146 151 149 149 140 128 131 133 135 133 133 133 131 133 133 132 132 132 132 132 133 133 133 133 133 133 132
0 0 144 144 144 141 140 138 138 137 137 138 137 137 137 135 136 136 136 133 134 135 135 134 132 143 144 130 132 133 133 132 132 133 133 132 132 132 132 132 151 109 33 36 36 21 88 245 255 246 247 245 245 247 247 247 247 247 247 247 247 247 247 255 230 35 67 47 226 224 211 211 229 219 219 47 59 225 220 223 216 66 66 79 243 235 177 37 111 50 86 100 243 213 212 211 212 211 213 245 97 89 121 112 112 156 233 208 220 134 69 86 246 210 210 210 209 213 228 211 216 211 226 247 244 241 241 238 238 88 238 209 210 233 233 111 190 209 210 211 210 211 211 211 210 215 239 106 34 44 102 135 130 133 133 133 133 133 132 132 129 131 148 149 149 155 139 133 131 132 132 133 132 134 133 133 133 133 132 133 133 132 132 133 132 133 133 133 133 133 132 132
0 144 144 144 144 143 140 141 139 138 137 137 137 137 137 136 136 136 136 134 134 135 134 135 133 141 144 140 132 133 133 134 131 131 133 132 132 132 133 149 89 89 33 33 18 128 255 250 255 247 247 246 247 247 247 247 247 247 247 247 247 248 255 255 230 29 67 236 218 210 211 211 229 205 34 85 233 215 220 239 216 31 84 250 249 249 177 16 111 154 62 233 213 213 212 211 212 225 223 90 97 42 121 152 66 151 208 212 220 197 69 231 211 208 208 208 209 233 228 179 221 225 249 249 244 248 210 224 74 80 238 225 210 209 172 112 232 209 210 210 210 210 211 210 215 215 239 232 34 10 152 155 130 132 133 132 133 131 129 133 129 141 148 148 146 134 130 130 131 132 132 133 132 132 132 132 133 132 132 133 133 133 132 132 132 133 132 133 132 132 132 133
0 147 144 144 144 144 142 142 141 141 139 140 139 139 137 137 136 135 136 136 135 136 136 135 134 132 147 146 133 133 132 134 133 134 132 132 133 133 135 142 69 28 28 50 28 186 255 247 247 245 245 251 246 246 247 247 246 247 248 248 247 248 255 219 27 94 241 241 215 211 210 230 194 28 29 105 244 211 244 123 14 99 95 250 241 68 19 218 226 226 35 221 216 211 210 210 236 236 179 70 114 236 255 255 236 68 238 216 232 103 189 189 212 229 235 180 163 122 163 163 115 177 225 249 245 249 236 202 240 90 235 220 210 228 247 113 226 214 211 211 210 210 210 211 212 212 184 134 120 120 47 111 133 131 133 131 133 128 130 150 151 141 137 132 133 133 132 132 132 133 132 132 132 133 133 132 132 133 133 133 133 132 132 133 133 132 133 133 133 133 132 133
149 149 147 147 143 143 144 144 142 142 141 141 141 140 138 138 137 137 136 136 137 136 136 136 136 136 136 142 142 136 135 136 136 136 134 134 133 133 140 54 30 30 22 75 243 255 248 255 246 255 255 255 255 248 255 255 250 254 247 247 247 254 233 233 25 95 240 213 211 211 211 230 190 25 118 246 211 241 248 92 35 103 251 179 31 31 39 246 255 37 167 239 212 212 210 211 242 114 65 250 242 255 253 238 144 155 203 180 249 120 151 251 229 101 99 99 106 211 229 230 72 232 243 243 244 247 225 203 234 116 104 230 208 211 183 113 236 205 209 208 209 210 210 210 210 210 229 200 220 233 9 58 153 153 132 129 134 151 153 136 148 131 131 134 134 133 133 133 132 133 132 132 132 132 132 132 133 132 132 132 133 133 133 132 133 132 133 133 133 132 132 132
151 149 148 146 147 144 145 144 144 142 142 140 140 140 140 138 138 137 138 138 138 136 136 136 137 136 137 148 147 136 134 136 136 135 134 134 133 133 150 54 28 19 116 255 255 255 255 255 255 255 106 164 164 248 173 255 255 254 254 247 247 254 251 29 86 241 212 213 211 211 228 193 26 119 119 246 215 241 69 97 127 250 250 179 18 73 255 255 101 37 82 239 209 210 210 243 104 114 75 250 244 233 235 245 245 155 168 180 157 163 193 251 130 101 155 189 230 220 249 230 59 232 236 246 242 246 246 203 219 116 170 210 212 251 251 113 235 205 225 210 207 210 211 210 211 208 231 103 183 233 88 58 125 130 135 145 145 151 140 136 129 132 133 134 134 133 133 133 131 133 133 132 132 132 133 132 133 132 133 132 132 133 132 132 132 132 132 133 133 132 133 132
151 148 149 147 147 146 144 143 143 143 143 143 143 142 142 140 140 139 139 138 141 138 138 136 137 138 138 140 145 141 135 135 136 136 137 135 136 151 109 25 35 21 199 255 230 255 87 122 122 109 2 8 46 0 32 76 37 255 254 255 255 255 63 40 64 241 212 210 211 218 218 207 28 118 249 221 228 54 54 132 196 207 187 18 154 125 255 255 195 26 225 209 210 211 211 242 104 90 255 243 243 238 238 240 246 229 240 253 253 168 148 102 243 248 209 240 208 208 247 66 77 237 248 249 243 247 246 213 215 198 198 223 208 251 126 170 250 247 247 242 237 207 211 210 210 210 208 203 83 251 176 13 13 162 163 146 135 132 129 132 132 132 134 133 133 132 132 132 132 131 131 134 134 133 132 132 132 133 132 133 133 132 132 132 132 133 133 132 132 133 133 132
154 149 151 147 145 144 145 144 145 143 144 144 143 143 143 142 141 140 142 142 142 139 139 138 138 137 139 136 139 150 149 134 135 136 136 136 135 137 155 29 34 92 52 25 25 62 25 10 152 111 255 255 255 143 252 60 64 46 22 220 219 255 119 41 226 214 210 210 213 215 234 54 65 252 252 236 247 44 155 255 183 237 237 15 173 255 251 255 69 12 138 227 209 211 239 107 93 97 255 242 240 242 241 240 240 241 238 254 166 48 86 133 96 207 212 209 211 240 144 103 55 243 220 250 246 250 250 228 207 215 209 213 247 172 172 99 252 247 246 250 243 217 208 211 211 210 208 209 66 160 251 74 11 152 159 132 132 131 133 133 133 133 132 133 133 133 132 133 133 132 132 132 134 132 133 133 132 132 131 132 133 132 132 132 132 132 132 133 133 133 132 132
156 153 151 150 147 145 145 145 145 145 145 144 143 143 143 142 142 143 143 142 142 140 141 140 140 140 140 139 139 147 150 138 137 137 138 137 135 150 135 23 23 16 127 97 255 225 255 255 255 255 252 255 247 255 251 255 255 82 108 12 52 230 23 28 209 218 212 210 222 123 123 94 21 154 56 114 39 96 96 255 180 178 90 118 242 255 226 255 188 26 236 207 210 211 227 127 80 255 242 240 240 240 240 240 241 239 240 254 254 108 231 122 103 176 236 212 212 234 165 44 209 211 208 241 221 235 210 204 210 234 234 218 228 233 62 251 249 249 249 247 250 212 206 212 211 210 210 241 179 171 248 160 160 22 91 139 132 133 133 133 133 133 133 132 132 132 132 132 133 133 132 133 130 130 126 130 125 129 129 131 132 132 132 133 132 132 133 132 132 133 133 133
156 154 151 150 148 147 145 145 145 145 145 144 143 143 143 143 142 143 143 143 142 143 141 140 140 141 142 143 139 139 150 149 137 140 138 139 134 134 135 39 23 163 255 255 255 255 255 250 255 247 245 246 247 246 251 252 255 255 108 108 52 234 23 157 226 211 210 210 222 202 17 31 24 25 56 20 39 23 96 20 58 43 90 44 242 161 220 225 12 12 236 239 210 215 168 80 255 255 242 240 240 240 240 241 241 241 240 240 255 248 255 255 103 166 236 231 233 172 38 38 209 225 208 209 206 209 210 208 210 244 126 135 251 82 62 203 249 247 248 246 236 236 206 209 211 209 208 248 57 57 248 242 46 8 148 153 132 133 133 133 132 133 133 132 132 133 132 132 132 133 133 133 130 125 126 146 140 148 132 132 132 132 132 132 132 133 133 132 132 132 133 132
155 156 152 152 151 152 149 147 147 146 145 145 145 145 144 145 143 144 144 143 144 144 142 143 143 143 142 143 143 142 146 154 143 143 140 140 138 140 114 27 56 56 255 244 245 247 245 247 246 246 247 247 245 246 247 247 249 248 255 255 27 53 83 83 239 210 212 210 228 251 108 35 39 37 40 40 41 39 22 38 28 34 33 22 49 49 100 79 104 10 231 250 209 209 212 96 242 245 240 240 240 241 241 240 240 240 240 241 241 240 238 248 213 216 125 125 239 172 36 169 231 210 211 211 210 210 211 212 242 86 86 87 252 112 146 251 248 247 247 247 247 248 234 217 209 209 209 213 127 58 238 222 235 126 41 122 132 132 131 132 133 133 131 131 132 133 133 133 133 126 126 146 148 171 171 171 168 153 137 129 132 133 133 133 132 132 133 133 132 133 132 132
156 156 156 154 153 152 150 150 147 147 146 146 145 146 146 145 143 144 144 144 143 145 144 144 144 145 144 144 143 143 140 145 151 146 141 143 140 140 167 100 13 140 255 247 246 247 247 247 245 244 247 247 247 247 248 248 247 247 255 255 41 0 61 230 210 211 211 211 210 250 53 52 29 30 40 36 38 41 40 39 40 40 39 41 32 42 21 33 33 33 93 182 223 237 102 157 251 251 239 240 240 241 240 240 240 240 241 240 242 240 241 241 244 244 146 214 179 37 168 168 232 210 210 210 210 210 210 218 241 71 97 250 147 62 96 251 248 247 248 248 247 247 249 244 206 206 209 220 89 89 229 230 251 196 12 80 157 139 132 133 132 133 133 130 133 130 128 135 137 169 171 171 168 145 145 128 131 132 131 131 132 133 132 133 132 132 133 132 133 132 133 132
156 156 158 158 156 155 151 151 149 149 147 147 146 146 147 146 145 145 144 145 144 143 144 145 145 143 143 145 144 145 144 143 152 152 143 142 142 141 168 90 25 25 255 249 247 248 247 247 247 247 247 247 247 247 248 248 247 247 247 255 27 8 181 181 220 212 210 210 225 217 112 36 195 100 55 97 37 40 36 28 36 43 41 38 40 40 41 40 41 38 27 42 245 245 127 102 255 237 240 241 241 240 240 240 240 240 240 240 240 240 240 242 239 239 255 255 182 37 168 233 210 210 210 210 211 209 229 201 50 102 100 248 192 64 251 250 247 247 247 247 247 247 247 250 228 228 205 203 243 57 240 219 207 241 62 9 155 151 132 133 133 134 132 130 129 151 161 161 162 153 152 129 127 131 133 133 130 133 134 132 133 132 132 132 132 132 132 132 132 132 133 133
159 156 158 158 154 153 153 151 150 149 149 147 146 146 146 146 147 145 146 146 146 144 144 145 147 143 144 145 146 145 147 143 143 153 146 144 145 141 149 90 7 227 255 247 247 248 247 247 246 247 248 247 247 247 247 247 247 246 255 255 134 8 95 240 211 210 210 210 209 217 35 253 155 71 71 97 27 40 105 42 31 28 28 38 27 40 40 40 40 38 36 42 154 199 102 255 238 237 240 241 240 240 240 240 240 240 240 240 241 240 241 242 241 239 255 175 40 172 233 233 210 210 210 210 215 247 247 201 25 102 245 224 62 229 229 250 247 247 248 247 247 247 247 250 249 225 226 235 214 57 84 219 208 243 126 43 43 151 131 133 133 128 146 149 149 151 160 156 130 131 130 129 130 131 133 133 132 133 132 132 133 132 132 132 132 132 132 132 132 132 133 133
158 159 159 159 156 153 153 152 152 150 150 149 149 146 147 146 145 147 147 146 146 145 145 146 146 147 147 146 147 147 147 142 142 149 153 144 144 143 154 70 5 67 255 247 247 247 247 250 250 248 255 248 247 247 247 247 247 247 248 255 53 29 179 243 216 210 211 210 244 109 109 148 164 56 88 28 121 195 195 113 19 63 178 54 129 20 24 41 35 40 44 26 195 251 120 229 247 240 242 240 240 240 240 240 240 240 240 240 240 240 240 240 243 255 92 142 47 188 227 210 211 211 212 209 242 241 71 12 125 247 247 241 74 171 251 247 247 248 248 247 248 247 247 247 248 249 249 210 243 35 134 212 212 224 250 16 20 157 131 134 134 140 150 159 137 136 129 136 128 130 134 133 132 132 133 132 132 132 133 132 132 132 132 132 133 132 132 132 133 132 132 133
160 159 159 158 158 155 155 155 156 151 152 151 151 149 149 147 147 146 146 146 147 146 146 144 144 147 150 147 145 145 147 147 147 146 152 147 146 144 142 171 55 109 255 246 246 247 247 255 232 128 147 249 249 247 247 247 247 246 255 255 131 17 174 242 211 212 227 215 222 145 22 165 52 71 71 39 138 159 124 12 142 255 255 253 255 102 19 50 59 28 24 13 74 217 110 255 237 239 241 240 240 241 240 240 240 240 240 241 240 241 239 240 251 255 65 54 241 219 211 210 209 208 244 250 66 42 42 25 146 245 242 105 112 251 251 247 246 248 246 249 250 247 247 247 247 248 250 223 251 167 26 250 210 214 249 38 38 102 165 143 140 138 130 130 130 132 135 134 133 133 133 133 132 132 132 132 133 132 133 132 133 132 133 132 133 132 132 133 133 132 133 133
158 159 159 159 159 158 156 156 155 153 153 152 152 151 150 150 150 149 149 147 150 149 148 147 148 149 149 148 147 147 149 149 150 146 147 155 154 147 143 164 46 6 133 253 244 247 255 191 191 25 0 255 255 250 255 247 255 249 255 186 45 174 148 210 200 213 233 196 57 155 155 85 73 42 49 138 136 151 151 15 92 255 255 255 255 254 25 89 172 53 88 54 54 251 196 235 247 241 240 240 240 241 240 240 240 240 240 241 241 240 242 255 176 54 150 80 250 212 207 211 250 250 37 163 20 79 122 151 238 246 246 124 89 252 249 247 249 250 250 205 243 247 247 247 247 247 247 249 249 119 38 247 247 212 207 229 72 78 159 131 131 130 131 132 131 133 133 133 132 133 132 133 132 133 132 132 132 132 133 133 132 132 132 132 133 132 132 132 132 133 133 132
158 159 159 159 159 159 154 154 155 156 153 154 151 151 150 150 150 150 150 151 151 151 148 149 148 150 150 150 147 147 149 150 150 151 151 155 150 150 143 166 46 6 255 250 244 250 255 152 50 105 121 203 255 255 255 255 255 255 194 194 45 101 148 213 214 235 172 172 57 243 49 33 22 58 49 142 136 135 96 26 255 255 255 255 255 57 52 167 129 129 88 246 54 123 187 255 240 240 240 241 240 240 240 240 240 240 240 240 241 250 255 255 176 50 150 233 208 240 250 250 250 101 37 91 196 122 122 162 238 234 115 62 250 242 249 250 249 250 114 184 249 249 247 247 247 248 247 247 251 251 38 223 207 211 235 249 72 7 159 148 131 133 133 132 131 131 133 132 132 133 133 133 132 132 132 132 132 132 133 133 132 133 132 133 133 132 132 133 132 133 132 132
160 160 159 159 159 159 158 157 156 157 155 155 153 153 151 151 150 152 150 151 151 152 150 151 151 151 151 151 149 150 150 151 151 151 150 151 158 153 146 166 36 36 178 255 255 252 93 75 63 255 38 21 93 5 45 45 144 126 197 59 70 147 241 241 211 244 155 50 215 255 182 16 30 57 142 135 133 133 166 94 181 255 255 141 33 33 38 163 115 42 225 255 77 77 129 223 239 240 241 240 240 240 240 241 241 240 241 246 238 255 251 45 72 251 235 235 237 239 211 17 8 166 252 252 248 130 162 105 205 99 104 49 235 215 236 215 243 108 104 126 250 246 247 247 247 247 249 247 250 215 68 250 225 209 207 223 111 9 150 154 133 133 132 133 132 132 132 132 133 133 132 133 132 132 133 133 132 133 132 132 132 132 132 133 132 133 132 132 133 133 132 132
161 161 160 160 159 158 158 158 157 158 156 156 155 155 153 154 153 154 151 152 152 154 151 151 151 150 152 152 152 152 151 151 151 153 150 150 154 154 151 146 165 41 209 212 255 118 36 131 255 255 177 238 30 112 44 214 119 86 55 55 70 150 232 194 223 165 35 35 226 255 163 32 51 131 139 135 131 131 153 118 59 27 180 16 17 122 173 88 41 41 197 254 255 223 139 254 241 241 240 241 240 240 240 241 240 240 238 255 255 82 75 75 165 251 242 54 52 41 59 59 103 255 255 170 131 134 143 39 229 88 41 224 216 210 208 207 233 147 78 239 212 212 247 249 247 247 247 247 252 252 31 157 215 212 208 216 251 147 35 145 133 133 133 133 132 133 132 133 133 133 132 132 133 132 132 132 132 132 133 133 132 132 132 133 133 133 133 132 132 132 132 132
161 161 161 160 160 158 159 158 160 158 158 156 156 155 156 154 156 154 154 152 154 154 153 152 151 152 152 152 155 151 152 151 153 153 152 150 152 152 153 168 170 41 17 212 22 19 227 255 255 255 255 238 255 255 255 214 238 86 73 82 154 202 179 194 182 165 108 231 254 255 255 32 27 131 140 131 131 130 130 118 76 27 62 75 157 122 164 88 48 213 255 239 248 223 217 254 242 240 240 240 240 240 240 241 241 251 201 182 182 82 90 252 74 59 47 54 16 41 255 255 254 255 149 170 74 134 63 197 99 43 43 224 221 210 211 226 191 58 58 239 203 243 250 247 247 247 247 247 250 125 43 243 243 212 211 216 250 16 26 157 157 133 132 133 133 132 132 133 132 133 133 132 133 132 132 132 133 132 133 132 133 132 132 133 132 133 132 132 132 132 132 132
158 161 161 161 161 159 159 159 159 159 159 158 158 157 157 156 156 155 156 153 157 157 157 155 155 155 154 157 156 154 155 154 153 153 154 153 154 152 153 148 167 41 32 132 132 139 255 255 248 245 255 255 255 255 207 78 78 132 84 95 176 192 184 181 183 203 177 196 195 248 255 10 77 149 149 131 131 131 132 152 146 153 153 153 135 151 73 51 241 232 253 238 240 248 241 240 240 240 240 241 240 240 240 240 240 248 162 32 68 23 27 80 18 26 192 198 215 230 217 255 255 255 44 31 187 179 179 106 138 78 195 221 211 211 211 218 222 60 183 217 212 225 249 247 248 247 247 248 251 251 45 239 217 210 210 212 212 172 19 132 157 132 133 133 133 132 132 132 132 132 133 133 132 133 132 132 132 132 133 132 132 133 132 132 133 132 132 132 133 132 132 132
161 158 158 161 161 161 161 159 159 159 158 159 160 158 158 155 155 155 155 155 157 156 156 156 156 155 155 156 157 157 156 154 154 153 156 155 155 153 154 150 173 185 41 255 255 255 201 255 255 255 255 255 88 46 92 31 208 176 72 211 198 182 182 183 183 184 184 175 180 209 209 83 11 172 137 131 133 132 132 133 133 132 131 129 155 154 62 59 253 248 241 241 240 240 240 240 241 241 240 241 241 240 240 240 240 254 255 255 255 108 34 42 36 46 26 201 144 179 178 234 177 63 241 87 255 210 44 202 121 177 177 223 211 209 210 236 57 136 136 227 205 242 249 247 247 247 247 247 250 156 42 250 250 207 208 210 210 190 24 129 129 135 132 132 133 133 132 132 132 133 132 132 132 133 133 133 133 132 132 132 132 133 133 133 132 133 132 133 133 133 133 132
161 161 161 159 159 161 161 161 161 159 160 158 159 159 159 157 159 154 155 157 157 156 156 156 156 157 156 156 156 157 157 156 156 156 157 154 156 154 154 153 151 159 17 255 255 247 243 69 28 107 76 56 56 51 250 252 153 72 231 229 216 182 179 183 189 183 183 183 183 178 189 86 30 148 148 131 132 132 133 133 130 129 129 138 143 46 73 255 243 244 241 240 241 240 240 241 240 240 241 240 241 240 240 241 241 242 242 243 35 20 42 40 41 32 37 22 22 89 75 175 204 238 255 248 233 118 118 249 100 150 234 214 208 214 214 250 86 102 247 207 214 230 249 247 247 247 247 247 250 251 43 243 249 212 208 210 210 249 198 18 126 132 132 133 133 132 132 133 134 134 132 133 133 133 132 133 133 132 133 132 133 132 133 132 132 133 133 132 133 133 132 132
161 161 161 161 159 158 161 161 159 160 160 160 159 159 158 159 159 158 155 158 157 157 158 158 157 157 156 156 156 154 157 156 156 156 157 157 156 156 154 154 185 185 17 83 255 246 152 85 28 34 76 195 251 181 242 242 153 58 231 217 206 218 184 184 189 182 183 183 182 184 189 212 30 33 158 153 131 137 133 131 130 142 157 101 27 27 73 255 243 240 240 241 240 240 240 240 240 240 240 241 241 240 240 241 240 240 241 193 35 21 42 34 40 40 39 39 22 23 75 69 210 192 249 249 233 245 255 78 131 235 234 213 208 245 240 82 79 245 247 210 214 246 247 248 247 247 247 246 250 134 135 251 249 241 208 210 209 250 24 18 126 158 132 132 133 133 132 132 134 134 132 133 132 132 132 132 133 132 133 133 132 133 133 132 132 132 132 132 133 133 132 133
161 161 161 161 161 161 159 159 161 161 160 160 159 159 159 159 159 159 159 159 158 158 159 160 158 159 157 156 154 154 154 157 156 156 156 156 156 156 156 156 153 185 7 92 255 255 255 255 105 136 72 95 115 55 79 85 55 224 218 218 214 240 169 61 184 181 176 176 183 179 179 199 130 69 62 80 159 147 155 153 169 68 150 25 16 190 255 239 242 242 240 241 240 240 240 240 240 240 240 240 240 240 240 240 240 239 237 255 148 42 46 46 28 27 40 40 39 40 25 25 56 45 225 247 252 255 255 75 115 240 212 247 242 91 160 42 66 238 212 209 225 225 249 246 247 247 248 248 250 250 55 251 249 246 210 210 212 213 196 22 131 160 133 133 133 133 138 119 114 128 132 132 132 133 132 132 133 133 133 133 132 133 132 132 132 133 133 133 132 132 132 132
161 161 161 161 161 161 161 160 161 161 161 161 159 160 160 160 158 158 159 158 159 158 159 158 159 158 158 158 156 158 157 158 157 157 156 156 157 156 156 156 157 157 114 7 255 255 246 248 255 255 222 255 236 255 251 251 57 199 219 210 230 192 20 20 188 243 190 209 180 203 172 196 255 255 54 57 31 23 93 25 63 4 7 185 254 254 255 237 240 241 240 240 240 240 241 240 241 240 241 240 241 240 240 240 239 252 255 65 154 38 115 160 71 77 26 26 39 39 39 40 29 28 63 63 255 255 70 90 245 250 216 248 145 63 79 68 223 219 214 210 208 218 250 250 235 235 250 250 251 96 149 251 249 247 242 228 205 222 189 18 22 138 132 132 132 132 118 118 102 139 134 133 132 133 133 133 132 133 132 132 132 132 132 132 133 132 132 133 132 132 132 132
161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 160 160 160 159 159 158 159 158 159 158 158 159 159 159 159 159 159 159 158 157 157 156 156 157 156 155 156 114 8 65 255 242 246 246 246 247 247 255 249 251 49 166 232 211 211 226 215 32 160 255 240 248 248 228 239 241 241 243 245 250 255 110 210 80 226 120 254 102 255 255 235 239 241 240 240 240 241 240 240 240 241 241 241 240 240 240 240 240 240 239 255 232 40 49 159 139 139 154 157 90 72 39 24 39 39 40 40 24 20 203 153 109 120 250 233 136 25 126 218 172 50 207 223 211 211 209 209 231 225 221 201 224 215 193 193 59 252 245 246 242 242 216 85 252 171 28 145 130 132 133 133 132 132 142 133 132 132 133 133 133 132 133 133 133 133 133 132 133 132 133 132 132 133 133 132 132 132
162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 160 159 159 159 158 159 159 158 159 158 158 159 159 158 159 159 159 158 158 157 157 155 155 157 155 156 193 8 42 255 248 246 246 246 247 247 247 255 71 49 128 232 210 218 236 34 125 160 255 240 239 245 238 242 242 241 238 245 244 255 255 255 255 226 255 254 251 243 239 235 239 241 240 241 241 240 240 240 240 241 240 240 240 240 240 240 240 240 255 185 33 83 83 159 132 135 151 175 52 72 31 24 26 40 40 40 40 20 34 153 195 252 47 21 21 25 252 218 41 199 224 210 210 211 212 208 208 209 212 201 202 215 250 44 200 248 248 246 247 242 107 166 252 13 13 145 146 132 132 133 134 132 133 133 132 133 132 132 133 132 132 133 133 133 132 132 132 132 133 132 132 133 132 133 133 132
162 162 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 159 160 159 160 158 158 159 160 158 158 158 159 159 159 159 159 159 159 158 157 156 156 157 156 156 186 12 12 213 255 247 246 245 245 253 253 255 99 82 248 210 213 213 248 47 76 255 236 240 240 239 238 239 241 240 239 238 238 241 239 238 237 237 237 238 238 237 239 240 241 240 240 240 240 240 240 240 240 240 240 240 240 241 240 240 239 255 255 158 34 118 143 132 130 133 156 108 12 52 255 56 27 36 41 39 39 34 32 85 85 108 26 43 255 255 172 39 39 196 227 210 211 210 210 212 211 212 213 210 210 242 132 69 87 250 249 249 232 250 250 33 222 145 8 152 140 132 132 132 132 132 132 132 133 133 133 132 133 132 132 132 133 133 132 133 133 132 132 133 133 132 133 133 133 133
161 162 162 163 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 159 160 159 159 160 160 160 160 158 158 159 158 158 159 159 159 158 159 157 158 157 157 154 155 140 24 147 255 245 245 246 251 255 184 96 19 42 238 209 213 247 110 45 253 255 239 239 240 240 240 240 240 241 240 239 241 239 238 239 239 240 239 239 241 240 240 240 241 240 240 240 240 240 240 240 240 240 240 240 241 240 240 240 239 255 148 32 132 139 139 132 130 158 54 33 241 146 255 255 166 32 37 39 40 40 40 18 55 250 255 255 255 255 167 39 193 228 211 211 211 211 210 210 211 212 210 210 211 221 216 43 228 249 249 249 234 247 155 72 252 108 108 66 160 131 133 133 132 133 133 132 132 132 132 132 132 133 132 133 133 133 132 132 132 132 132 133 133 132 133 132 132 133
161 162 161 162 162 162 163 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 160 160 160 160 160 159 158 159 159 159 159 158 159 158 158 158 159 157 157 156 155 151 151 8 91 255 255 255 145 106 106 154 77 167 239 213 227 240 160 31 234 244 240 240 240 240 240 240 240 240 240 240 240 239 240 239 240 240 241 240 240 240 241 241 241 240 240 240 240 240 240 240 241 241 240 240 240 240 240 239 255 163 163 32 131 139 133 132 136 153 87 62 255 255 254 255 100 29 75 26 30 40 40 28 28 178 255 234 255 162 37 194 194 228 210 211 211 210 211 211 211 211 210 210 210 250 49 49 228 231 241 212 210 247 155 16 252 250 11 93 134 131 133 132 132 132 133 133 132 132 132 133 132 132 133 133 132 132 132 132 133 133 133 133 133 133 133 133 133 132
162 162 162 162 162 162 163 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 159 160 160 159 160 160 158 159 159 158 159 159 159 159 158 158 158 158 157 157 155 187 39 10 250 176 255 196 145 69 214 213 66 66 239 211 227 215 21 181 253 253 240 240 240 240 240 241 240 240 240 240 240 241 240 240 240 241 241 240 240 240 240 240 241 241 240 240 240 240 240 240 241 241 240 241 241 240 240 238 255 177 28 121 140 133 133 133 136 149 31 217 255 255 254 255 100 67 84 52 36 36 40 42 20 61 255 255 255 152 37 197 226 211 210 210 210 210 210 210 211 210 211 211 211 239 88 71 237 208 212 205 207 246 60 39 250 218 69 12 157 132 132 133 132 132 133 132 133 133 133 132 132 132 133 132 132 132 132 133 132 132 132 132 133 132 132 133 132 133
161 162 161 161 161 162 162 162 163 163 161 161 161 161 160 161 161 161 161 161 161 161 161 161 160 159 159 159 158 158 159 159 159 159 159 159 159 159 159 159 157 158 156 188 154 37 45 127 65 178 204 255 252 255 25 188 210 212 240 240 25 122 255 239 240 240 240 240 240 240 241 240 240 240 240 240 240 241 241 240 240 240 241 240 240 240 240 240 240 240 240 240 240 240 240 241 240 240 241 240 240 249 200 22 25 108 142 133 133 133 145 145 51 24 255 255 255 126 56 56 177 143 37 37 42 42 41 23 156 255 134 36 199 226 225 210 210 211 210 211 210 210 211 210 211 212 218 226 41 41 246 210 211 210 220 244 174 9 239 250 30 32 154 132 132 132 132 132 132 133 133 133 132 132 132 132 132 132 132 132 132 133 133 132 133 132 132 132 133 132 133 132
161 161 162 162 161 162 161 162 162 162 162 162 161 161 161 160 161 161 161 161 161 161 161 161 161 161 159 160 160 160 159 158 159 159 158 159 159 159 159 159 158 158 157 156 142 33 74 255 227 255 255 250 255 220 52 52 236 207 246 137 53 255 237 237 241 240 240 240 240 241 240 240 241 240 241 241 240 240 240 240 240 240 241 240 241 241 240 240 241 240 240 240 240 240 241 240 241 240 240 240 239 239 245 47 85 158 133 133 133 133 132 139 72 40 80 80 164 44 66 152 138 169 61 61 33 23 42 39 67 52 134 37 208 224 210 210 210 210 210 211 211 210 211 210 210 210 210 248 43 129 223 211 211 210 208 246 63 16 250 251 172 12 149 141 133 133 132 132 132 132 133 133 132 133 132 132 132 132 133 133 132 133 132 133 133 133 132 132 133 132 133 132
163 161 161 162 162 162 161 162 162 162 162 162 162 161 161 160 161 161 161 161 161 161 161 161 160 161 161 160 159 160 159 158 160 160 159 159 158 159 158 159 158 158 158 192 192 33 9 255 255 248 248 250 250 220 18 250 215 227 211 137 12 255 255 241 240 240 240 240 240 241 240 240 241 240 240 241 240 240 241 241 240 241 241 240 240 240 240 240 241 240 240 240 240 240 240 240 240 240 240 240 240 255 117 46 46 158 132 133 133 132 133 139 154 40 55 29 101 124 137 152 132 169 74 55 78 30 30 39 25 52 50 230 225 211 211 210 211 210 211 210 211 210 211 210 210 210 236 87 73 129 242 211 211 210 219 168 168 16 185 251 100 71 158 131 131 133 132 132 133 132 132 133 133 133 133 132 133 132 132 133 133 133 133 133 132 133 133 132 132 132 132 133
163 162 163 161 161 162 161 161 161 161 161 161 162 162 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 161 160 158 160 160 159 159 158 159 158 158 158 159 160 195 28 8 247 247 246 248 247 252 138 10 136 250 211 248 38 7 255 255 239 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 241 240 240 241 240 240 240 240 240 240 240 240 241 240 240 240 241 241 240 240 240 240 255 214 14 129 133 133 133 133 133 133 134 134 156 143 122 156 157 130 132 141 90 49 76 255 46 36 38 45 42 42 220 250 211 210 210 210 211 211 210 211 210 210 210 210 210 217 158 52 246 211 210 210 211 209 234 67 34 203 234 234 12 121 132 132 133 132 132 133 133 132 132 132 132 132 133 133 133 133 132 132 132 132 133 133 132 133 132 133 132 132 132
163 163 165 162 163 161 160 162 161 161 161 161 162 162 162 163 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 161 158 159 160 159 160 159 159 159 159 159 162 162 112 24 75 255 248 249 247 247 255 84 192 245 237 179 93 20 88 255 239 240 240 241 240 240 240 240 240 240 240 240 241 240 241 240 240 240 240 240 240 240 240 240 241 240 240 240 240 241 240 241 240 240 240 241 241 240 255 126 50 50 153 131 133 133 133 133 133 132 134 133 132 133 133 133 132 139 116 45 242 255 211 211 28 31 28 10 56 161 207 207 211 211 210 210 211 210 210 210 210 210 210 250 52 137 219 218 210 210 210 222 150 150 6 56 251 163 35 152 130 130 132 132 133 132 133 133 133 133 133 132 132 132 133 132 132 132 133 132 132 132 133 133 133 132 132 133 132
163 163 164 165 164 163 163 161 161 161 161 162 161 161 161 162 162 162 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 161 158 158 160 160 160 159 159 158 157 174 82 16 117 117 255 247 247 245 255 45 25 234 208 250 34 83 53 222 255 239 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 241 240 240 241 240 240 240 240 240 240 240 240 240 240 240 241 240 240 247 255 4 55 143 129 133 133 133 132 132 133 132 132 133 132 133 133 141 117 43 185 199 255 255 242 24 117 139 139 42 179 233 211 210 211 210 210 211 210 211 210 210 210 210 241 72 68 238 210 211 211 210 210 227 56 16 96 251 251 13 89 137 132 133 132 133 132 132 133 133 132 132 133 132 132 133 133 132 132 132 132 132 133 132 132 132 132 132 132 133
163 162 164 163 164 165 163 163 161 161 161 161 161 162 161 162 162 162 163 162 161 161 161 161 161 161 161 161 161 161 161 159 161 161 161 161 159 159 160 160 159 160 159 156 174 174 16 20 255 251 247 247 245 255 45 36 233 237 63 63 83 20 222 255 240 241 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 241 240 240 240 240 241 241 238 251 121 11 55 151 129 133 133 133 132 132 133 133 132 132 133 132 147 147 117 41 185 255 255 161 242 25 117 252 236 232 230 212 211 211 211 211 211 210 211 211 210 211 210 227 133 46 249 249 210 211 211 211 250 107 56 25 96 251 70 27 156 131 132 132 132 132 133 132 133 133 132 132 133 133 133 132 132 132 132 132 132 132 132 132 132 133 132 133 132 132
162 161 162 162 164 164 165 165 163 163 161 161 161 162 161 162 162 162 162 162 162 162 161 161 161 161 161 161 161 161 160 161 158 158 161 161 161 160 160 160 160 160 160 159 187 149 16 29 169 255 247 247 246 255 32 32 250 240 181 14 224 27 163 163 248 239 240 240 240 240 241 240 240 240 240 240 240 240 240 240 240 240 241 240 240 240 240 241 241 240 241 240 240 240 240 240 240 241 240 240 241 239 255 179 23 66 149 142 133 133 133 133 132 132 133 133 134 134 157 71 39 214 255 255 255 129 17 160 246 211 219 209 205 212 211 211 210 210 210 210 211 211 210 210 213 213 195 41 224 220 210 211 211 210 239 177 27 45 162 252 194 22 147 139 132 132 132 132 132 133 133 133 133 133 132 132 133 133 132 133 132 132 132 132 133 132 133 133 133 133 132 132
161 161 162 162 162 162 163 163 165 165 163 163 161 161 162 161 161 161 162 161 162 162 162 163 161 161 162 162 161 161 161 161 161 161 160 161 161 161 160 160 160 160 160 158 160 195 34 13 212 255 247 247 247 245 247 56 212 251 77 77 195 250 3 87 255 240 240 240 240 240 240 241 240 240 240 241 240 240 241 240 241 240 241 240 240 240 240 241 240 240 240 240 240 240 240 240 241 241 241 241 240 240 255 255 97 52 97 127 140 140 133 133 132 132 132 136 152 114 34 34 43 248 255 248 88 33 23 193 238 210 210 211 210 210 210 211 211 210 210 211 210 210 211 210 209 250 66 102 234 234 210 211 210 208 238 70 24 74 48 246 86 23 158 131 132 132 133 132 132 132 133 133 133 133 133 133 132 132 132 132 132 133 132 132 132 132 133 133 132 132 132 133
161 161 161 161 161 162 162 162 162 163 164 164 163 162 161 161 162 161 162 162 161 161 162 162 162 163 162 161 162 161 162 161 161 161 160 160 161 161 161 161 159 159 160 160 167 192 25 11 54 248 248 248 247 246 255 255 25 108 237 21 255 255 2 2 230 255 240 240 240 240 240 240 240 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 240 240 241 240 241 241 240 240 241 240 240 240 240 240 240 240 254 207 24 22 129 127 146 158 137 162 161 161 160 43 17 167 255 255 209 209 39 66 218 221 210 210 211 211 210 211 210 210 210 210 210 211 211 210 210 210 242 242 103 54 246 210 211 210 210 211 246 161 36 77 112 253 203 21 142 138 133 133 133 133 132 132 132 133 133 132 133 133 133 133 132 133 132 132 132 133 132 132 132 132 132 132 132 133
161 161 162 161 161 161 163 162 163 163 162 165 165 163 163 161 161 161 161 161 162 162 162 162 161 163 163 161 162 161 161 161 161 161 160 160 160 161 162 161 161 159 160 158 158 192 65 11 110 255 247 247 247 246 252 161 46 250 211 21 94 255 120 30 140 251 239 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 241 240 240 240 240 240 241 240 240 240 241 240 240 240 241 240 240 240 241 248 248 207 135 22 21 117 91 158 151 162 112 96 9 38 243 167 255 255 154 18 128 242 242 221 210 210 210 207 225 210 210 210 210 210 210 211 210 210 210 210 228 137 43 239 215 210 210 210 210 221 230 14 14 77 23 253 74 88 153 133 133 133 133 132 132 133 133 133 132 132 133 133 132 133 132 133 133 132 133 133 132 133 133 132 132 132 132 133
163 161 161 162 162 161 161 163 163 162 163 162 162 165 164 163 163 161 161 162 161 161 162 161 163 163 163 162 163 161 162 161 161 161 161 161 160 160 159 162 161 160 160 160 161 152 37 24 24 255 251 247 247 247 245 255 255 43 109 22 154 255 190 13 3 255 255 239 240 240 240 241 240 240 240 240 240 241 241 240 240 240 240 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 241 240 240 240 240 241 240 255 255 108 108 16 11 44 7 14 29 11 63 139 255 254 255 90 33 18 178 250 213 211 211 209 209 219 187 225 206 210 211 210 210 211 210 211 210 220 215 183 49 213 222 210 210 210 210 209 250 48 42 49 52 205 205 30 147 132 132 132 133 132 133 133 133 132 132 133 132 132 133 132 133 133 132 133 133 132 132 133 133 133 133 132 132 133
162 162 162 161 161 162 161 161 161 163 164 164 163 162 162 165 165 163 163 161 161 161 161 163 162 163 164 163 163 163 164 161 161 162 162 162 161 160 159 160 159 161 161 161 161 196 102 14 52 255 247 247 247 247 247 254 255 120 144 82 22 255 255 62 6 158 255 248 236 241 240 241 240 240 240 240 240 240 241 240 240 240 240 241 240 240 240 240 240 240 240 240 240 241 240 240 241 240 240 240 240 240 240 240 240 240 240 255 255 148 220 29 93 37 185 218 234 252 255 255 168 40 76 225 223 213 213 210 210 216 222 118 122 220 220 210 211 210 210 210 211 210 210 216 232 45 133 230 210 211 211 210 210 229 213 11 11 131 16 251 60 102 152 133 133 133 133 132 132 133 132 132 132 132 133 133 132 133 133 133 133 132 133 133 133 133 133 132 133 132 132 132
163 162 163 163 161 161 161 162 162 161 164 164 163 164 162 163 165 165 163 163 161 161 161 161 163 162 164 164 163 163 162 162 162 162 162 161 161 161 160 160 159 159 161 161 167 189 24 15 52 255 247 247 247 247 247 247 255 255 144 117 176 255 255 255 6 6 255 255 239 240 240 240 240 240 240 240 241 240 241 240 240 240 240 241 240 240 240 240 240 240 241 240 240 240 240 240 241 240 240 240 240 240 240 240 240 240 240 241 255 255 220 255 196 205 215 215 234 196 255 87 13 170 250 250 223 212 211 209 234 152 222 89 122 237 211 211 210 210 210 210 211 211 211 243 50 50 133 240 210 210 210 211 210 211 213 31 126 81 153 176 60 48 152 133 133 132 133 133 132 133 132 133 132 132 132 132 132 133 133 132 133 132 133 132 133 132 133 133 132 133 132 133
162 163 162 163 163 162 162 162 161 162 161 161 164 164 164 163 163 162 164 165 163 163 161 161 161 162 162 162 164 164 163 163 163 163 161 161 161 161 161 161 161 160 159 159 158 186 64 16 123 255 246 247 247 247 247 247 247 255 255 255 111 193 254 255 54 8 145 145 254 239 241 240 240 241 240 240 241 240 241 240 241 241 240 240 241 240 240 240 240 240 240 240 240 240 240 241 240 240 240 241 240 240 240 240 240 240 240 240 240 240 248 248 206 170 179 183 175 175 155 155 51 225 242 217 214 213 212 215 250 100 74 225 228 211 211 210 210 210 210 210 210 210 210 243 77 79 245 210 210 210 210 211 209 237 91 15 58 159 33 224 25 131 132 133 132 133 133 132 132 132 133 133 132 133 132 133 132 132 133 133 132 132 132 132 132 133 132 132 132 133 133 130
163 163 163 163 163 162 163 163 161 161 161 161 161 161 164 164 163 163 162 162 165 165 163 163 161 161 162 161 162 162 163 164 163 163 162 161 161 161 161 161 162 162 161 160 161 196 34 12 27 215 249 248 247 247 246 246 253 255 187 102 192 255 255 255 255 201 6 41 255 255 239 240 240 240 240 241 240 240 240 241 241 241 240 241 240 240 240 240 241 240 240 240 241 241 240 241 240 240 240 240 240 240 240 240 241 240 241 240 240 240 241 247 175 178 182 182 183 183 191 192 190 180 199 199 218 214 246 145 73 152 92 246 215 210 211 210 210 210 210 211 210 211 236 153 53 53 247 210 210 209 211 212 210 213 181 19 144 98 123 110 47 79 141 133 133 133 132 132 133 133 133 133 133 133 133 133 133 132 133 133 133 132 133 132 133 129 131 128 127 132 129 130
163 163 163 163 163 163 163 163 163 163 162 162 162 162 161 162 164 164 164 164 162 162 165 165 162 162 161 161 161 161 161 161 164 164 163 163 161 161 161 161 161 162 161 161 160 168 101 19 81 255 248 247 247 247 251 255 194 54 144 144 248 103 73 7 99 95 34 34 120 194 247 240 240 240 240 241 240 240 240 241 240 240 240 240 240 240 241 240 240 240 241 240 240 240 240 241 240 240 240 241 241 240 240 240 240 240 240 241 240 240 240 240 225 206 195 185 183 183 184 184 182 182 179 181 232 136 250 63 58 230 235 210 211 210 210 211 210 210 211 210 211 211 231 177 39 193 217 210 222 222 209 238 209 248 62 28 78 171 40 132 41 152 133 132 132 132 132 132 132 132 132 132 132 132 133 133 132 130 130 130 131 131 130 138 136 149 130 146 139 153 153 160
163 163 163 163 163 163 163 163 163 163 162 162 161 162 161 161 161 164 164 164 163 162 163 165 165 163 163 161 161 161 161 162 161 164 163 163 164 161 161 161 161 162 161 161 158 185 60 16 16 255 252 247 245 255 219 255 66 54 240 254 8 6 174 7 70 95 80 13 24 253 253 240 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 240 240 240 241 240 240 240 240 241 240 240 240 240 240 240 240 240 240 240 241 241 241 240 246 255 205 179 170 185 181 183 183 183 183 183 184 181 212 136 42 96 251 218 218 210 210 210 210 210 210 210 210 210 211 225 204 36 167 193 228 210 218 188 96 225 225 248 136 28 169 32 94 41 41 152 134 132 132 133 132 132 132 132 133 132 131 131 130 133 129 130 136 131 143 145 145 138 150 149 152 157 143 154 154 160
163 163 163 163 163 163 163 163 163 163 163 163 163 161 161 162 161 161 161 164 164 163 163 162 162 164 161 161 161 161 161 161 161 162 162 164 163 163 164 161 162 160 161 161 161 184 161 12 39 255 247 246 246 255 171 35 164 255 255 240 3 100 255 230 76 81 95 43 47 57 121 255 254 240 240 241 241 241 241 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 241 240 240 240 240 240 240 240 238 238 240 239 239 255 255 135 255 62 37 161 184 179 183 183 183 183 183 183 182 186 111 111 207 225 210 211 210 211 210 210 211 210 210 210 210 214 218 226 40 141 235 211 209 234 232 52 202 224 221 39 102 102 78 63 64 94 141 132 133 133 132 132 133 132 133 133 131 134 133 144 140 147 149 146 148 146 152 138 141 133 133 133 140 133 130 130 129
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 161 161 162 162 161 161 164 164 164 164 161 161 161 161 162 162 161 161 162 162 161 161 163 163 164 163 162 162 161 160 199 111 10 10 241 255 249 254 255 77 26 233 255 255 62 12 252 84 89 189 77 92 139 183 3 3 190 233 242 239 240 241 240 240 239 239 240 240 241 240 240 240 240 240 241 240 240 241 241 240 241 240 240 240 241 241 240 242 247 215 255 232 225 225 200 39 34 250 240 250 215 209 182 203 184 182 183 183 182 187 200 210 209 211 211 211 210 211 211 210 210 211 211 211 210 213 236 59 117 243 241 210 210 212 186 46 250 250 251 111 42 178 53 59 61 61 150 133 132 132 133 133 132 132 134 135 141 138 143 136 149 136 141 134 133 131 130 130 132 132 130 132 133 135 133 133 133
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 161 161 161 162 161 161 164 164 164 163 161 161 161 161 162 161 161 161 161 161 161 161 163 164 164 164 162 162 167 183 17 22 255 237 152 152 200 91 149 231 255 255 249 15 250 135 255 88 38 13 80 253 98 52 44 79 255 255 240 240 240 238 236 236 240 240 240 240 241 240 241 240 240 240 240 240 240 240 240 241 240 240 240 240 240 240 146 146 119 24 41 14 102 93 209 199 251 145 237 103 150 88 214 192 183 182 183 180 187 187 213 210 211 210 210 210 210 210 210 210 211 210 212 241 239 63 91 244 211 210 210 244 245 61 192 236 176 19 134 134 75 32 58 144 132 132 133 133 133 132 133 133 133 130 134 133 131 132 131 132 131 133 132 134 134 132 133 132 131 131 132 132 133 133 132
163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 161 161 162 162 161 161 164 164 163 163 161 161 161 161 162 162 161 161 161 162 163 163 163 163 164 163 159 189 61 13 22 228 237 28 12 43 21 21 231 164 255 225 29 197 38 38 88 80 13 143 255 250 52 21 79 109 255 255 238 238 238 236 236 240 241 240 240 240 240 240 240 240 240 240 240 240 240 240 241 240 240 241 240 240 240 242 51 118 18 91 14 45 93 20 54 34 51 51 103 12 88 145 176 182 179 179 180 185 211 212 211 210 210 210 210 211 210 211 210 209 210 212 241 72 79 243 209 209 210 210 244 119 102 250 236 233 19 75 135 30 64 132 144 136 132 132 133 133 132 132 133 133 130 132 133 132 135 135 132 132 133 133 132 131 132 133 132 132 132 132 133 132 133 132
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 161 161 162 162 161 161 164 164 163 163 161 161 160 161 162 162 161 161 161 163 162 162 162 161 163 163 141 29 71 50 31 255 120 255 117 230 147 212 255 255 16 57 60 50 77 6 48 48 255 227 218 169 6 7 140 178 255 254 237 238 239 240 241 240 240 240 240 240 240 240 241 240 240 240 240 240 241 241 241 240 240 240 242 243 255 255 220 255 189 255 194 194 62 229 106 36 16 162 187 187 213 205 190 206 200 214 209 213 211 211 211 211 211 211 210 210 210 212 221 249 76 76 73 241 209 210 209 211 200 200 42 226 249 124 32 161 173 56 55 140 137 133 132 133 132 132 132 132 132 132 133 133 132 132 133 132 133 133 133 133 133 133 132 133 132 133 133 133 133 133 133 132
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 161 161 161 161 164 164 164 164 161 161 161 161 161 161 161 161 164 164 162 163 162 176 88 11 14 68 159 255 255 249 254 254 255 254 248 255 207 251 185 185 52 61 51 212 240 145 209 255 116 80 19 34 222 245 248 245 240 241 240 241 240 240 240 240 239 243 242 240 241 241 240 241 241 240 240 239 241 240 240 240 240 238 240 255 255 255 255 127 95 24 55 55 102 250 248 211 216 213 216 216 213 211 211 211 210 210 210 211 211 211 211 210 234 140 205 244 81 66 240 211 210 210 210 208 244 56 141 250 243 180 15 126 94 95 151 133 135 132 132 133 132 132 132 132 132 133 133 132 132 132 132 132 133 133 133 133 132 132 133 133 132 134 133 132 132 132 132 133
163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 162 163 163 163 163 163 163 163 161 161 161 161 161 161 164 164 164 164 161 161 161 161 161 161 160 161 164 164 163 162 170 43 62 255 255 245 248 247 246 247 247 247 249 249 255 248 255 254 255 255 186 186 255 255 131 255 255 219 40 28 43 64 254 255 244 241 240 240 240 240 240 247 207 207 255 255 241 239 238 237 240 240 240 239 241 237 238 255 238 255 255 219 185 11 9 9 11 196 232 234 225 211 214 214 210 210 210 211 210 211 210 211 210 211 211 210 210 210 211 210 241 119 194 111 61 61 238 211 210 210 209 222 137 137 64 250 225 46 78 150 111 102 148 132 133 132 133 132 132 132 133 132 133 132 132 132 133 133 132 132 133 133 133 133 132 132 132 132 131 132 133 132 133 132 133 133
163 163 163 163 163 163 163 162 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 162 162 161 161 161 161 164 164 164 163 161 161 161 161 161 161 161 161 164 163 199 104 12 12 255 254 245 247 247 247 247 247 247 247 248 249 246 246 254 249 255 245 194 255 128 128 255 255 219 49 34 16 76 76 255 255 241 240 241 240 240 240 247 234 96 125 255 255 239 245 237 241 239 247 239 239 237 255 255 252 243 23 19 19 11 116 145 250 245 206 234 207 211 212 210 210 211 210 211 211 211 211 210 211 211 211 210 210 210 211 238 133 134 134 111 58 236 213 209 211 210 211 222 222 29 193 248 248 46 42 150 130 146 132 133 133 132 133 132 133 132 132 132 132 132 133 132 133 133 133 132 133 133 132 132 132 133 133 132 132 132 133 132 132 132 132 133
163 163 163 163 163 163 162 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 161 161 161 161 161 164 164 163 164 161 161 161 161 161 162 159 159 173 179 10 52 255 246 245 245 247 245 248 248 247 253 248 254 250 247 246 245 254 242 162 199 255 100 255 253 153 153 107 139 15 11 104 103 255 255 240 240 241 240 245 255 95 35 136 106 238 152 255 171 255 255 255 192 226 31 36 36 34 54 73 250 251 220 250 211 208 209 211 211 211 211 212 212 211 210 212 210 211 211 210 210 211 210 210 210 210 210 239 131 120 132 57 232 233 215 210 210 210 210 243 62 31 113 250 162 22 129 139 139 135 132 133 133 132 132 132 132 132 132 133 133 133 133 133 132 133 133 132 133 132 133 132 133 133 132 132 132 133 133 133 133 133 132 0
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 161 162 161 161 161 161 164 164 164 162 162 162 161 161 162 164 198 114 9 9 252 255 255 247 255 222 254 255 248 255 222 115 253 247 249 248 245 255 159 207 228 228 130 255 255 96 202 195 106 106 11 10 99 95 255 255 238 241 241 240 244 176 3 29 93 111 78 50 60 46 32 32 25 77 51 243 246 235 230 230 221 212 208 210 210 211 210 211 211 210 211 211 211 211 210 210 210 210 210 210 211 211 210 210 209 250 112 93 139 139 58 230 214 211 210 211 210 210 248 112 61 247 200 200 19 94 145 134 132 133 132 132 132 133 132 132 132 132 132 132 132 133 133 132 133 132 132 132 132 132 133 132 132 132 132 133 132 133 133 133 133 133 0
163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 161 162 161 161 163 163 162 163 162 162 162 162 164 172 114 9 151 255 226 93 247 131 222 109 255 255 124 124 115 225 247 248 247 250 230 230 207 255 56 201 255 255 96 70 195 206 107 132 11 24 95 102 255 255 245 243 248 248 176 156 29 117 155 248 118 118 46 178 118 250 248 228 243 234 235 207 208 210 210 210 210 211 211 210 210 210 210 210 211 211 211 211 210 210 210 210 210 210 210 210 215 237 250 94 93 147 57 229 215 215 211 210 211 210 235 178 30 30 247 237 32 59 155 133 134 133 133 133 132 132 133 132 132 132 132 132 133 132 133 133 132 133 132 132 132 132 132 132 132 132 132 133 133 132 133 132 133 133 0 0
163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 161 161 162 162 161 161 163 163 162 162 164 200 50 10 59 238 113 134 95 211 129 129 185 187 60 181 251 255 248 248 247 251 251 112 167 92 183 93 255 141 82 33 117 64 211 133 147 83 31 30 97 97 248 236 242 241 255 255 54 54 151 131 251 239 237 207 250 215 225 208 206 210 211 210 211 211 210 210 210 210 211 211 210 211 210 210 210 210 211 211 211 210 210 210 210 210 210 210 230 185 51 71 151 64 60 226 216 211 211 210 210 210 218 239 23 140 250 98 63 33 155 134 132 133 132 132 132 132 132 133 132 133 132 132 132 132 133 133 132 132 133 133 133 133 133 133 132 133 133 132 133 133 133 133 133 0 0 0
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 161 163 161 161 161 161 161 161 163 162 164 176 106 9 175 255 255 248 255 255 255 253 60 211 224 224 225 128 246 247 246 252 181 181 80 124 35 69 20 140 18 64 69 177 89 166 97 184 46 59 9 64 226 250 240 240 241 240 255 245 44 41 164 164 230 229 210 211 211 211 210 211 210 210 210 210 210 210 211 211 210 210 211 211 211 211 211 210 210 211 210 210 211 211 211 209 211 244 119 47 38 106 151 66 225 216 211 211 211 211 210 214 251 94 68 68 251 143 18 120 138 132 132 132 131 131 133 131 132 131 132 133 133 133 133 132 133 133 133 132 132 132 133 133 132 132 133 133 132 132 132 133 133 132 132 0 0 0
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 163 163 163 162 162 161 161 162 161 160 199 44 19 64 233 254 254 244 244 253 253 223 244 107 56 141 255 248 248 247 247 255 252 255 84 82 255 223 255 255 91 134 82 196 159 248 205 178 26 118 118 252 244 240 240 241 240 248 248 239 224 42 43 185 181 230 233 210 211 210 211 210 211 211 211 210 211 210 211 211 211 210 209 209 211 209 240 226 226 212 210 210 209 208 251 229 190 76 75 149 140 69 227 226 216 211 211 210 210 213 213 242 153 36 233 177 23 18 101 146 133 135 139 131 131 133 132 131 132 130 134 130 130 130 130 131 131 130 128 130 130 133 132 132 133 132 133 132 133 133 133 132 132 0 0 0 0
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 162 162 161 161 199 104 19 125 247 254 253 253 244 255 255 89 36 200 56 255 255 248 247 247 248 248 252 255 84 127 255 116 92 92 91 95 82 172 48 98 124 124 26 174 255 236 240 240 240 241 240 240 252 254 207 215 43 42 181 164 239 243 209 209 211 210 211 210 211 208 211 209 211 207 208 220 214 251 211 247 240 170 214 208 211 211 209 233 251 88 62 151 157 157 140 75 227 216 211 211 211 210 210 213 232 190 25 180 233 214 23 76 152 134 136 136 139 137 131 137 135 146 140 140 134 142 134 144 131 143 131 136 128 133 129 131 129 128 133 129 133 130 132 131 133 133 132 0 0 0 0
163 162 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 162 163 163 164 161 162 161 163 153 24 103 103 158 80 255 234 255 97 243 22 59 255 255 246 247 247 247 248 247 247 247 255 69 69 221 70 78 255 255 255 255 255 67 121 54 143 249 244 255 235 241 240 241 240 240 240 240 249 255 201 225 221 47 47 142 117 246 242 225 250 229 229 210 239 217 251 240 228 230 248 251 120 143 47 85 203 167 222 208 250 251 74 31 31 86 186 143 163 93 232 213 213 210 210 211 211 213 235 233 187 26 125 248 57 51 51 155 134 131 131 134 134 133 133 138 138 144 135 145 139 147 150 151 150 153 148 151 155 142 151 141 153 138 147 133 133 125 131 126 132 0 0 0 0 0
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 161 161 186 64 50 254 185 195 134 134 169 8 33 255 255 245 248 246 247 247 247 247 247 247 247 246 236 43 204 255 255 255 255 152 118 158 55 132 250 250 255 235 238 240 241 241 240 240 240 241 239 239 115 89 151 91 216 177 72 68 75 75 209 102 225 98 197 66 249 108 184 35 64 51 44 194 42 184 188 236 225 251 221 221 142 26 63 252 161 137 149 149 130 235 211 210 211 210 211 211 213 236 178 22 78 251 251 90 37 146 139 136 133 133 133 131 134 133 132 132 131 131 132 131 131 129 134 131 139 133 142 135 146 136 154 142 158 156 158 166 152 161 155 155 0 0 0 0 0
163 163 163 163 163 163 163 163 163 163 162 163 162 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 162 163 161 173 123 10 203 203 255 255 130 7 30 227 126 255 254 247 247 247 247 247 247 247 247 247 247 246 236 236 120 255 255 120 74 235 252 252 215 50 234 255 236 240 241 240 241 240 240 241 240 240 240 240 254 255 125 46 38 38 104 65 61 53 71 89 63 63 22 61 57 216 120 252 72 243 215 250 249 250 250 142 250 112 59 48 115 251 250 250 149 112 151 188 231 211 210 210 210 210 211 212 238 166 177 26 57 250 118 23 139 139 144 140 136 136 134 133 131 131 133 133 134 134 132 132 131 133 131 132 130 133 130 133 133 131 129 130 130 131 137 137 148 137 150 0 0 0 0 0 0
163 163 163 163 163 163 163 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 160 173 166 10 157 255 56 19 56 7 181 227 255 248 246 247 247 247 247 247 247 247 247 247 247 246 255 44 144 241 97 120 123 235 255 255 238 34 60 255 255 240 240 239 240 240 240 241 240 240 240 242 255 238 238 46 104 45 104 53 59 53 67 89 95 57 80 176 176 216 251 252 250 251 250 251 251 250 151 142 11 20 198 48 249 251 217 133 97 173 232 188 220 211 211 210 207 210 210 212 246 166 40 39 234 135 135 23 130 146 140 139 139 136 135 133 132 132 131 133 133 134 132 132 132 132 133 133 133 133 131 133 132 130 131 132 132 131 130 133 129 129 0 0 0 0 0 0 0
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 162 163 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 162 167 194 88 50 30 162 1 8 155 239 190 255 255 248 246 246 247 247 247 247 247 247 247 247 247 243 255 236 56 188 121 231 253 251 255 255 154 76 109 87 87 255 255 244 247 240 240 240 240 240 240 241 255 114 42 201 234 251 245 170 251 103 192 99 101 104 89 74 15 40 33 58 58 171 61 121 9 17 110 125 125 152 251 236 208 196 172 105 147 208 219 211 211 211 211 211 219 224 228 247 86 56 56 31 185 166 20 119 160 153 140 138 140 137 136 136 135 132 132 132 132 133 132 133 133 132 132 132 133 132 132 132 132 133 132 132 132 132 131 132 133 132 0 0 0 0 0 0 0
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 179 192 113 190 72 17 23 45 250 255 229 159 78 155 115 255 246 247 247 247 247 247 247 247 247 247 247 246 245 229 80 233 255 255 247 253 238 114 174 255 255 87 92 88 79 242 220 255 255 240 240 241 240 255 90 60 60 234 215 212 250 247 48 251 66 132 28 26 74 139 139 113 226 103 71 35 202 55 55 77 251 251 216 212 213 209 211 210 221 225 215 226 149 231 231 211 213 239 96 216 216 224 66 76 50 142 227 23 23 107 166 144 143 140 142 139 139 136 136 135 135 132 132 132 132 132 133 132 132 133 133 133 132 132 132 132 132 133 133 132 132 132 131 0 0 0 0 0 0 0 0
163 163 163 163 163 163 163 163 163 163 162 162 163 163 163 163 163 162 163 162 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 162 163 163 170 192 192 158 40 21 31 40 62 79 104 255 255 194 195 49 49 202 255 246 247 247 247 247 247 247 247 247 247 247 246 255 255 75 137 254 255 196 117 114 230 255 249 255 198 97 97 56 48 189 154 255 255 255 255 255 132 92 251 225 233 247 164 86 42 69 79 45 173 40 231 250 217 248 139 77 77 138 172 103 184 247 210 212 212 208 210 211 210 210 209 216 214 247 75 152 229 213 232 234 77 165 121 48 174 64 64 104 238 32 93 168 146 144 144 143 143 141 141 138 138 136 136 135 135 132 132 131 131 133 133 132 132 132 133 133 133 132 132 132 132 131 131 131 132 0 0 0 0 0 0 0 0
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 170 171 87 15 10 10 31 141 62 48 63 64 255 255 195 207 74 176 250 246 247 247 247 247 247 247 247 247 247 247 246 252 147 65 236 236 255 171 117 255 254 248 255 255 198 153 167 185 52 68 154 132 255 223 255 126 48 171 251 250 233 45 18 174 139 139 79 85 173 251 247 239 217 251 139 77 183 75 78 244 184 224 210 213 211 210 210 210 210 209 209 216 241 74 74 74 229 215 232 88 141 84 121 53 174 88 68 231 37 85 93 169 146 146 144 144 144 144 141 141 138 139 136 136 134 134 132 132 133 132 132 132 132 133 133 132 133 133 132 132 132 132 131 133 0 0 0 0 0 0 0 0 0
163 163 162 163 163 163 163 163 163 163 163 163 162 163 163 163 162 163 163 162 163 162 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 171 163 45 51 9 43 242 255 255 254 254 57 67 94 229 254 255 163 70 255 250 247 247 247 247 248 247 247 247 247 247 247 247 255 255 60 93 185 126 255 255 250 247 255 172 120 255 255 255 222 255 35 89 59 95 111 20 59 105 250 54 30 30 85 170 62 119 239 191 182 182 211 71 157 65 73 63 143 50 134 244 211 209 211 212 210 211 211 210 211 210 223 223 235 60 86 243 220 237 98 98 78 80 96 185 111 43 50 220 40 80 172 149 147 147 146 146 144 144 143 144 141 141 138 138 137 136 135 135 132 133 132 132 133 132 132 133 132 132 132 133 132 132 133 133 0 0 0 0 0 0 0 0 0
163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 168 166 40 17 186 255 255 243 68 236 255 255 225 34 34 255 246 214 100 255 248 246 247 247 247 247 247 247 247 247 247 247 247 250 255 126 126 102 198 255 249 247 255 177 177 125 255 247 246 255 159 147 151 211 255 77 99 255 18 68 66 87 214 81 102 200 200 234 30 39 97 78 194 75 54 24 74 129 249 219 212 211 210 210 210 211 211 211 211 210 210 239 169 46 133 244 244 224 218 96 20 96 181 162 161 136 34 201 57 75 176 174 148 148 148 147 147 144 144 144 144 143 143 139 140 138 138 137 137 135 135 132 133 133 132 133 132 132 132 132 132 132 133 132 0 0 0 0 0 0 0 0 0 0
163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 175 44 34 34 186 255 84 6 13 108 255 254 225 42 255 255 255 255 100 208 248 247 247 247 247 247 247 247 247 247 247 247 247 247 255 255 56 58 255 255 249 248 255 181 134 255 248 248 246 255 159 92 255 247 225 225 99 255 18 104 175 177 214 75 102 100 53 92 107 221 97 225 194 41 26 197 245 245 249 213 212 211 211 211 210 210 211 211 211 213 250 136 169 22 133 242 225 218 73 79 20 138 181 151 159 37 158 158 57 72 176 149 149 148 148 149 147 146 145 145 143 144 143 142 140 139 138 138 136 136 135 135 133 133 132 132 133 133 132 132 132 132 132 0 0 0 0 0 0 0 0 0 0 0
163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 162 162 163 163 163 162 163 163 163 163 189 61 43 245 255 232 101 11 15 19 255 253 240 12 50 255 255 255 85 255 254 254 247 247 247 247 247 247 247 247 247 247 247 248 245 254 255 141 111 169 255 255 175 157 142 255 247 246 255 206 86 86 255 247 255 109 246 103 96 96 197 166 68 21 56 193 60 211 208 151 109 29 39 39 106 250 237 209 214 211 210 210 210 211 211 211 210 209 210 228 243 69 9 71 246 210 219 236 43 88 179 148 152 152 171 50 116 73 71 178 150 150 149 149 149 149 146 147 147 146 144 145 144 144 142 143 140 140 137 137 137 137 136 136 132 132 132 132 133 133 132 132 132 0 0 0 0 0 0 0 0 0 0 0
163 163 163 163 163 163 162 163 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 181 86 40 252 252 255 255 57 40 13 183 222 255 255 126 114 103 105 105 67 67 244 211 255 253 247 247 247 247 247 247 247 247 247 247 247 247 255 255 56 43 211 230 203 206 255 248 248 248 254 236 77 234 252 255 131 131 154 254 53 212 172 49 42 86 147 188 190 42 34 97 25 148 201 239 226 210 210 210 210 210 210 210 210 211 211 211 211 215 251 125 27 94 54 69 243 224 245 113 38 160 184 147 151 179 62 76 75 75 70 178 151 151 149 150 148 149 147 147 146 146 146 146 144 144 144 143 142 143 139 139 138 139 137 137 135 134 133 133 133 132 132 132 0 0 0 0 0 0 0 0 0 0 0 0
163 163 163 163 163 162 163 163 163 163 163 163 162 163 162 163 163 163 163 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 173 173 129 38 244 254 246 255 248 208 123 232 255 251 231 17 13 128 19 102 13 70 31 31 249 255 249 247 247 247 247 247 247 247 247 247 247 247 247 248 251 203 49 53 228 224 255 255 248 255 248 81 196 196 254 255 141 130 255 52 69 69 135 58 54 37 66 116 46 98 72 250 247 214 207 207 207 210 212 207 209 208 209 209 210 210 210 212 240 187 239 53 15 128 188 31 250 231 239 160 23 140 158 152 175 175 79 68 72 74 178 151 152 152 151 151 149 150 149 149 147 147 146 146 145 147 144 145 143 144 143 143 140 139 138 138 137 136 134 134 132 132 133 133 0 0 0 0 0 0 0 0 0 0 0 0
163 163 163 163 163 162 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 162 163 163 163 163 163 163 163 170 156 41 206 255 254 247 255 255 254 255 252 252 251 254 17 147 187 252 102 125 70 90 39 80 255 255 247 247 247 247 247 247 247 247 247 247 247 247 254 255 188 188 53 48 224 193 255 255 255 255 81 228 255 255 176 102 130 255 52 20 131 170 41 41 37 45 116 193 252 236 251 251 214 238 209 240 214 245 207 221 208 238 217 216 208 238 212 247 187 16 39 172 196 196 31 134 231 208 23 122 166 166 152 170 101 65 63 79 74 179 151 152 152 152 150 150 150 150 149 148 147 148 146 146 147 147 145 144 144 144 143 142 139 139 138 137 135 136 134 134 132 134 0 0 0 0 0 0 0 0 0 0 0 0 0
163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 171 163 162 39 172 255 248 246 247 247 253 246 246 246 249 255 201 201 255 255 255 252 251 213 22 14 100 151 255 255 247 247 247 247 247 247 247 247 247 247 247 247 255 255 179 182 38 38 110 51 153 29 140 56 255 98 140 4 56 72 161 213 47 37 196 200 92 110 55 55 96 44 147 72 185 79 251 180 248 163 240 103 180 65 228 194 210 251 195 16 19 19 89 184 153 184 28 165 246 246 33 81 175 153 165 138 121 55 54 86 177 152 151 152 151 152 152 152 150 151 150 150 149 148 147 147 146 146 145 145 144 144 144 144 142 144 139 138 137 138 137 137 134 0 0 0 0 0 0 0 0 0 0 0 0 0 0
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 172 165 38 153 255 248 249 247 247 248 247 247 244 244 248 250 254 246 246 247 254 253 255 255 177 211 22 8 182 248 247 247 247 247 247 247 247 247 247 247 247 247 247 247 255 255 217 255 62 186 30 114 4 72 27 162 106 255 55 251 255 255 110 51 144 144 196 179 162 192 105 155 60 60 28 39 27 57 13 60 39 33 22 97 170 252 186 15 95 12 74 190 169 151 153 153 97 22 252 143 38 178 151 151 159 144 36 49 107 172 175 152 152 151 152 151 151 151 151 151 151 151 149 150 150 150 148 148 146 146 145 146 144 144 144 144 143 142 140 140 138 138 136 0 0 0 0 0 0 0 0 0 0 0 0 0 0
163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 176 156 33 32 140 255 249 251 237 255 255 247 247 247 246 246 246 247 247 245 245 247 247 246 246 255 255 177 83 36 133 254 246 247 247 247 247 247 247 247 247 247 247 247 247 247 255 227 227 86 167 255 255 27 161 255 255 255 254 255 248 245 245 255 255 24 25 180 189 159 159 185 167 189 184 186 191 148 124 49 190 237 250 251 228 251 162 67 17 66 179 178 178 154 153 151 158 81 22 251 251 21 131 154 153 152 100 37 111 153 158 152 152 152 151 152 152 152 151 151 150 150 150 151 150 150 148 148 149 147 147 146 146 146 145 144 143 145 143 142 142 140 138 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
162 163 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 162 163 162 163 163 163 163 163 163 163 163 163 176 138 33 158 255 248 255 255 237 244 245 245 245 250 246 246 246 247 246 245 247 247 247 246 246 248 255 255 22 22 133 255 246 247 247 247 247 247 247 247 247 247 247 247 247 247 255 215 26 151 255 255 255 88 161 255 249 245 246 246 248 247 245 252 173 119 25 44 189 178 163 162 157 169 184 179 191 76 80 251 250 250 250 248 228 27 8 88 153 153 179 156 155 154 154 152 158 186 22 218 36 72 171 152 153 154 100 146 173 150 152 152 152 153 151 151 151 151 151 151 150 151 150 150 151 151 148 148 149 148 148 148 146 146 145 144 143 144 143 143 142 142 138 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
162 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 162 162 163 163 163 184 125 46 200 200 255 248 249 255 95 202 255 247 248 255 255 230 255 229 254 255 247 250 250 254 246 246 246 250 248 134 100 255 245 245 247 247 247 247 247 247 247 247 247 247 247 253 254 34 26 147 255 244 255 100 141 141 251 244 245 247 247 247 246 246 255 255 66 26 137 183 164 162 159 160 146 78 51 51 183 180 246 72 83 11 15 15 39 178 186 153 154 156 157 154 155 153 157 187 28 134 145 31 185 152 153 154 154 154 156 150 152 152 151 152 152 152 151 151 151 151 151 151 151 151 151 151 151 151 149 149 148 148 147 148 146 146 145 145 143 144 143 143 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
163 162 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 188 188 110 52 222 255 248 247 251 251 160 62 255 252 218 68 188 64 112 47 194 210 255 255 240 220 249 255 250 246 255 255 0 147 251 246 247 247 247 247 247 247 247 247 247 247 247 248 255 61 85 255 246 246 255 255 0 107 255 245 248 248 247 247 247 247 246 251 255 227 18 38 194 183 158 160 154 171 103 104 34 63 21 21 10 116 127 186 178 153 156 156 154 156 153 155 153 154 153 156 91 42 50 100 158 152 154 152 152 152 152 152 151 151 151 151 151 151 152 151 151 152 151 152 151 151 151 151 150 151 151 151 148 148 148 148 149 149 146 147 144 144 143 143 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 162 163 163 163 163 163 163 163 163 163 163 163 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 192 88 64 245 254 255 249 247 246 255 197 119 119 252 44 68 153 54 135 46 46 210 165 214 182 248 116 255 255 246 255 87 5 255 249 246 247 247 247 247 247 247 247 247 247 247 247 255 159 32 32 255 249 246 255 136 0 107 254 245 247 247 247 247 247 247 247 251 255 154 76 77 77 183 166 160 161 181 178 104 151 63 161 132 192 192 154 186 153 153 156 157 156 156 156 155 154 154 153 183 155 26 26 100 178 152 152 153 153 152 152 152 152 151 152 151 151 151 151 151 151 151 151 151 151 151 150 151 150 150 151 150 150 148 148 149 148 148 149 147 147 144 144 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 169 185 61 69 98 255 253 248 247 247 247 251 255 35 18 18 144 255 255 234 255 177 204 81 189 184 240 246 162 61 243 255 255 247 11 233 255 247 247 247 247 247 247 247 247 247 247 248 248 253 255 5 189 254 255 250 255 222 18 105 255 247 247 247 247 247 247 247 247 247 247 255 255 33 18 172 187 158 158 159 158 168 159 173 155 186 157 157 155 154 154 155 155 156 156 156 156 155 152 154 154 152 163 97 56 160 161 152 152 153 153 153 153 152 153 152 151 151 151 151 151 151 151 151 151 151 152 151 152 151 151 150 151 151 151 150 150 148 148 149 148 148 149 146 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 177 161 48 142 255 250 247 247 247 247 246 255 223 32 32 111 242 255 252 253 246 255 255 230 254 255 250 255 255 53 50 208 89 167 138 255 244 247 247 247 247 247 247 247 247 247 247 247 247 255 217 15 15 255 252 217 19 28 126 182 255 255 249 247 247 247 247 247 247 247 247 248 255 190 190 29 122 160 159 159 159 159 158 158 158 157 157 158 158 156 155 155 154 156 156 156 156 156 154 153 153 153 154 169 169 130 166 153 152 152 153 152 152 153 153 153 153 151 151 151 152 152 153 152 152 152 152 151 152 151 151 151 150 151 151 151 151 149 150 149 149 148 149 148 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 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 183 118 42 207 178 255 247 247 246 246 247 255 248 255 46 237 255 255 247 247 246 251 246 247 248 247 249 248 246 253 138 149 38 103 100 121 249 249 247 247 247 247 247 247 247 247 247 247 247 247 248 255 8 38 255 254 228 56 14 4 54 23 255 248 245 247 247 247 247 247 247 247 247 245 255 255 7 118 164 164 159 158 159 159 159 159 158 158 157 158 157 158 155 155 155 158 156 156 156 156 155 155 153 154 157 154 151 153 152 152 152 152 152 152 152 153 152 152 152 151 153 152 151 151 152 152 152 151 151 151 151 151 150 151 151 150 151 150 151 151 150 150 149 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 164 163 188 188 118 49 207 255 247 247 246 246 246 255 255 240 98 64 237 255 255 255 255 255 255 255 247 247 247 248 246 246 255 255 149 156 103 200 235 255 247 247 247 247 247 247 247 247 247 247 247 247 246 247 207 22 38 223 254 250 15 107 18 18 23 147 248 246 247 247 247 247 247 247 247 249 248 255 255 94 118 191 162 160 158 158 159 158 159 158 157 158 157 157 158 157 155 156 156 156 156 156 156 156 155 154 154 155 154 153 153 152 152 152 152 152 152 152 153 152 153 152 151 151 152 151 151 151 152 152 151 151 151 151 150 151 151 150 150 151 150 151 150 151 150 150 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 163 163 163 163 163 162 163 162 163 163 163 163 163 163 163 162 162 163 190 73 59 254 255 255 247 247 246 255 255 77 24 24 54 5 133 50 229 76 249 107 195 174 255 255 248 248 247 247 246 255 126 73 255 255 249 249 247 247 246 246 247 247 247 247 247 246 247 247 247 247 255 255 6 99 255 255 214 255 240 255 128 255 249 249 247 247 247 246 246 255 247 255 255 193 255 34 153 181 159 159 159 159 159 159 159 159 159 158 159 159 157 157 154 154 156 156 156 156 156 156 157 157 154 154 154 154 154 154 153 152 152 152 152 152 152 152 152 152 152 152 151 150 151 151 150 150 151 152 151 151 151 151 150 150 151 151 151 151 151 151 151 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 161 161 163 163 163 163 163 163 163 163 163 163 163 162 165 184 55 55 68 255 254 247 247 251 255 255 199 25 4 241 42 84 29 28 21 15 119 255 36 4 157 135 255 255 247 255 255 255 154 52 255 251 246 246 246 246 246 254 246 254 247 250 246 255 251 255 253 252 255 255 89 8 244 255 250 246 254 254 255 247 251 247 247 247 249 249 252 255 235 23 3 75 234 181 56 200 158 160 159 159 158 159 158 158 159 158 159 159 159 158 156 156 154 154 156 156 156 156 157 156 155 155 154 153 154 154 154 152 152 152 152 152 152 152 153 153 152 152 153 151 151 151 152 151 151 152 153 152 152 152 151 151 151 151 151 151 151 151 151 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 161 163 162 163 163 163 163 163 163 163 162 185 173 157 42 103 255 248 247 247 247 255 251 79 88 255 255 255 229 41 255 255 103 13 90 94 246 141 7 7 142 142 255 255 239 29 28 237 254 254 247 249 252 255 255 154 255 255 255 255 251 112 177 70 255 255 255 177 124 27 188 188 248 247 246 247 247 247 246 246 247 255 255 180 119 33 56 75 115 206 255 70 146 177 159 160 160 160 160 160 159 159 158 158 158 158 158 159 158 158 156 155 153 156 156 156 156 156 156 156 154 155 153 154 154 154 152 152 153 152 153 153 152 153 152 153 152 152 151 151 151 152 151 151 152 152 153 151 151 151 151 150 151 151 151 150 150 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 163 163 163 162 163 163 163 163 163 163 185 121 29 149 103 255 248 247 247 255 203 109 79 174 255 249 220 26 134 134 255 255 13 6 207 255 169 169 7 8 224 140 105 24 29 49 237 255 247 255 255 155 255 93 154 54 187 174 169 169 112 12 70 83 233 47 56 56 27 194 255 247 247 245 247 247 247 250 255 255 218 25 180 17 33 250 255 255 255 255 70 54 177 161 160 160 160 160 160 160 159 158 159 158 158 159 159 159 158 157 156 156 156 156 156 156 156 156 156 156 155 153 154 153 154 152 152 152 152 152 152 152 152 153 153 153 152 152 151 150 151 151 151 151 152 151 152 151 152 152 150 150 150 151 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 162 162 163 163 163 163 163 193 95 95 27 199 255 245 247 252 247 255 185 146 255 255 126 4 45 15 10 28 41 166 22 22 12 86 255 255 185 69 13 21 14 64 144 255 255 255 248 255 252 33 1 69 16 16 6 2 71 114 69 151 11 11 39 102 149 255 255 245 253 247 247 244 244 255 255 147 255 77 42 91 148 255 255 255 255 221 250 255 40 162 162 162 161 161 160 160 160 159 159 159 158 159 159 159 158 158 158 157 157 158 156 156 156 156 156 156 156 156 155 154 154 154 154 153 152 152 153 152 153 152 152 152 152 153 152 152 152 153 152 151 152 153 151 151 152 151 152 152 150 151 150 151 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 162 162 163 163 165 186 74 39 231 255 255 254 254 250 255 133 167 255 255 255 56 31 162 140 139 139 39 13 83 65 38 125 250 250 255 255 0 102 179 255 250 255 248 255 255 51 3 149 35 255 217 255 117 136 55 55 255 255 169 136 26 148 255 255 248 247 247 246 248 255 250 255 222 15 16 229 255 254 255 249 248 250 227 165 255 255 93 113 167 161 161 161 161 161 159 160 158 159 158 158 159 159 158 159 158 159 158 158 157 156 156 156 156 156 156 156 156 155 153 153 154 154 152 152 152 152 152 153 152 152 153 153 152 152 152 154 151 151 152 152 153 151 151 152 151 151 151 151 150 152 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 161 170 177 42 50 50 249 255 255 164 177 151 207 157 163 255 255 87 72 255 255 255 22 255 154 24 71 71 237 221 255 249 255 255 128 0 255 251 247 248 255 161 208 10 22 249 255 236 255 255 255 255 49 5 255 246 255 255 57 6 255 251 247 247 246 251 255 254 140 10 47 255 147 255 255 246 246 247 248 248 249 145 255 229 56 189 160 160 161 160 161 160 161 161 160 160 159 159 159 158 158 158 159 158 159 159 158 158 157 157 156 156 156 156 156 156 155 155 154 154 153 154 152 152 153 153 153 152 153 152 153 153 152 152 152 151 151 152 154 154 151 152 152 151 152 152 150 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 170 173 42 60 255 255 155 155 164 102 151 252 187 253 255 255 87 82 255 255 60 60 255 255 24 123 30 235 249 249 249 248 255 118 122 255 244 244 248 255 161 11 88 255 255 255 236 116 245 185 255 38 5 229 246 246 255 90 125 255 251 246 247 255 255 88 15 15 10 220 255 251 246 243 248 248 247 247 255 152 226 255 229 30 189 165 161 160 159 159 160 161 161 161 159 160 160 160 158 158 158 159 159 159 159 159 158 158 157 157 156 155 156 156 156 156 155 154 153 153 154 153 152 153 152 153 153 153 152 152 153 152 153 152 151 151 152 153 151 151 153 151 151 151 152 152 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 74 255 255 251 87 26 142 255 254 254 254 246 253 255 79 130 117 117 149 4 62 38 0 171 90 14 255 251 248 247 255 255 0 101 253 255 240 83 12 12 190 255 124 0 0 21 30 9 252 255 56 254 252 255 255 228 21 231 249 255 255 255 209 5 18 241 255 248 244 244 243 246 245 246 247 255 255 162 202 255 80 46 190 159 161 161 161 161 161 161 161 161 159 159 160 160 159 159 158 158 158 159 158 159 158 157 158 158 157 154 157 157 156 156 156 156 155 153 154 154 152 152 152 152 153 153 153 152 152 152 152 152 154 151 151 151 151 151 151 151 151 151 151 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 225 28 48 48 206 255 248 247 245 246 255 255 95 128 103 117 18 48 40 255 60 4 139 9 255 254 247 248 253 255 11 187 174 174 141 98 10 218 207 7 45 45 113 255 140 106 193 255 87 43 255 213 227 24 151 255 255 248 182 3 22 246 255 255 255 246 247 247 247 247 246 246 247 254 195 126 155 90 135 7 190 163 161 161 161 161 161 161 161 161 161 161 160 160 158 159 158 158 159 158 159 158 158 158 157 157 157 155 155 157 156 156 156 156 153 153 153 153 154 153 152 153 153 153 153 152 153 152 153 153 153 152 151 151 151 151 151 152 151 151 152 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 63 241 255 247 245 247 247 246 246 247 111 255 255 117 15 48 236 255 21 184 184 9 121 254 247 247 254 255 229 187 70 98 206 22 151 218 213 7 150 255 141 255 255 106 6 255 108 50 26 110 110 24 143 255 145 43 20 3 132 246 255 248 247 247 247 247 247 247 247 247 251 246 246 126 50 90 44 127 190 161 161 161 161 161 161 161 161 161 161 161 161 159 159 158 158 158 158 158 159 158 160 157 157 157 157 155 154 156 156 156 156 156 156 153 154 153 154 153 153 153 152 152 152 153 153 152 153 153 152 153 152 151 151 151 151 152 151 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 240 255 246 243 246 247 247 247 255 168 166 255 84 5 56 56 255 44 32 255 10 79 255 255 249 255 255 71 44 209 135 255 6 119 255 63 49 69 112 4 28 11 6 17 255 255 60 98 20 29 35 82 57 57 2 107 237 255 248 247 247 247 247 247 247 247 247 247 247 246 255 62 51 255 164 164 49 188 159 162 161 161 161 161 161 161 161 161 161 161 161 160 160 159 159 158 158 158 158 159 159 159 158 157 156 156 155 156 156 157 156 156 156 156 153 155 153 154 153 152 153 152 152 152 152 152 152 152 152 152 152 152 152 151 151 151 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 244 247 247 246 255 224 100 120 255 190 32 46 17 89 255 255 203 18 255 255 255 191 247 30 43 255 255 198 37 253 255 212 0 255 182 29 161 161 15 11 236 255 255 255 215 215 51 41 17 75 215 255 255 250 246 247 247 247 247 247 247 247 247 248 246 255 140 140 43 255 248 24 129 192 161 161 161 161 162 162 161 161 161 161 159 160 159 159 159 159 160 160 159 158 159 159 158 158 158 158 159 159 159 159 156 156 156 156 157 156 156 155 154 154 153 152 152 152 152 152 152 152 153 152 152 153 152 152 151 151 151 152 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 247 246 245 255 59 32 83 18 4 4 18 139 255 245 244 57 242 242 255 154 15 117 255 253 254 255 29 190 255 149 101 255 255 48 96 255 27 61 255 255 248 246 255 129 19 53 167 167 255 251 247 247 247 247 247 247 247 247 247 247 247 251 247 255 191 136 255 255 104 104 52 195 159 160 161 162 163 161 162 162 160 161 159 161 160 161 159 160 160 158 159 159 158 159 158 158 159 158 159 159 159 159 156 154 156 154 155 156 156 156 154 154 153 153 152 152 153 152 152 152 152 152 152 153 152 152 151 151 153 153 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 246 246 255 255 40 40 18 40 43 255 255 245 245 255 57 22 255 145 8 8 117 255 253 246 241 226 255 255 149 0 255 126 12 227 255 99 61 255 246 247 255 163 129 5 53 254 255 246 247 247 247 247 247 247 248 247 247 247 247 247 251 250 182 37 136 255 255 215 6 130 166 162 160 161 162 162 162 162 162 162 161 161 161 161 161 161 160 160 158 158 159 158 158 158 158 158 158 158 159 159 158 155 154 154 154 156 157 156 156 156 154 154 153 154 153 153 152 152 152 152 153 152 152 153 152 151 151 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 248 248 251 254 255 255 253 142 31 118 255 245 241 252 110 32 195 168 9 181 255 247 244 244 254 252 247 250 128 12 134 134 0 51 81 42 240 255 250 246 252 253 6 70 255 253 255 246 247 247 247 246 247 247 247 246 247 247 247 255 192 192 93 45 214 255 255 90 17 45 193 161 162 163 163 163 162 162 162 162 161 161 161 161 161 161 161 161 159 159 158 159 158 158 158 159 159 158 159 159 159 158 155 158 156 156 158 156 156 156 156 156 154 154 152 152 153 152 152 152 153 152 152 152 153 152 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 251 251 255 255 2 99 255 248 245 245 255 191 38 89 200 200 255 246 243 243 247 246 245 245 255 246 15 26 1 46 15 107 243 255 246 246 255 212 55 32 255 252 247 245 246 246 246 252 249 255 255 255 255 255 254 255 208 46 223 151 103 255 255 194 5 109 169 161 163 163 164 164 163 161 162 162 162 162 161 161 161 161 160 160 161 161 160 160 160 160 158 159 158 159 158 158 160 159 158 158 157 157 156 155 156 156 156 156 156 155 153 154 152 152 152 152 152 152 152 153 153 152 152 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 253 255 129 2 255 255 249 247 255 247 48 48 255 254 246 247 246 246 247 247 245 247 255 255 185 185 62 231 225 253 248 247 247 246 255 172 64 177 255 255 247 255 255 255 255 122 168 168 244 70 151 53 119 88 66 66 224 255 215 254 255 90 16 36 194 159 161 162 165 165 164 162 161 162 166 163 161 161 161 160 161 161 161 161 159 159 160 159 160 160 158 159 158 158 159 158 159 157 158 158 156 155 155 157 156 156 155 155 153 154 154 154 152 153 152 152 152 152 153 153 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 255 165 72 255 247 247 247 255 247 119 168 255 254 247 247 247 247 247 247 246 247 247 255 255 255 255 255 255 253 247 247 246 255 121 42 42 177 164 255 244 255 68 255 87 122 32 40 84 42 160 53 65 88 68 57 255 254 254 254 255 90 6 163 177 161 161 162 162 165 164 161 161 162 162 163 163 161 161 161 161 161 161 161 160 159 160 160 160 160 160 159 159 158 159 157 157 157 158 156 154 154 156 157 157 156 156 155 155 153 153 154 154 153 152 153 153 152 152 153 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 7 37 255 248 255 208 183 183 43 59 255 250 247 247 247 247 247 247 246 247 247 244 254 246 247 247 247 247 247 247 255 175 9 63 9 8 123 123 76 87 68 251 218 255 150 255 249 255 255 255 217 14 14 127 182 116 255 255 18 18 93 202 160 162 161 161 162 165 164 162 161 161 163 163 163 164 161 161 161 161 160 160 159 161 159 160 159 160 160 160 159 159 159 159 159 158 156 156 154 155 156 156 156 156 156 156 155 155 154 153 152 152 153 153 152 153 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 37 26 255 255 255 234 111 255 109 86 164 247 246 247 247 247 247 247 247 247 247 251 255 255 247 247 247 247 246 254 224 26 129 129 154 182 121 255 255 255 255 255 255 247 248 244 244 245 248 243 255 150 47 255 61 61 249 255 95 8 159 183 161 161 162 163 162 162 161 161 161 161 161 160 165 164 162 162 161 161 161 161 161 161 161 161 159 160 160 159 159 158 159 159 160 159 158 159 158 158 156 157 156 156 156 156 156 156 155 155 154 153 152 152 153 153 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 148 244 132 14 239 239 255 255 183 254 247 247 247 247 247 247 247 247 255 181 188 171 249 253 255 255 247 247 255 75 41 240 255 255 252 252 251 246 246 247 247 247 247 247 247 247 246 244 255 159 6 94 227 45 27 17 17 17 75 198 161 163 164 162 162 162 161 161 161 162 161 161 161 164 164 164 161 161 161 161 161 161 161 161 161 161 160 160 158 158 159 159 159 158 160 159 160 160 158 156 156 156 156 156 156 156 154 154 154 154 152 153 153 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 244 204 14 90 255 250 236 236 254 248 247 247 247 247 247 247 247 248 181 7 255 255 253 221 255 255 255 141 7 179 240 255 255 254 246 246 247 247 247 247 247 247 247 247 247 247 244 249 159 41 80 149 45 82 17 49 27 138 165 163 163 163 162 163 162 162 161 161 162 162 161 163 165 163 164 164 161 161 161 161 161 161 161 161 161 161 160 160 158 159 159 158 158 159 159 159 159 159 156 155 156 156 156 156 156 155 154 153 153 152 152 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 65 255 255 251 247 247 247 247 247 247 247 247 247 246 255 131 131 153 241 81 0 176 70 255 162 6 100 255 142 248 253 254 255 246 253 247 247 247 247 247 247 247 247 247 247 255 255 26 117 255 255 187 25 20 54 194 159 163 163 162 162 162 163 161 163 164 162 163 163 165 163 162 163 162 162 161 161 161 161 161 161 161 161 161 160 160 160 159 158 158 158 159 158 159 159 158 158 155 155 156 156 156 156 156 153 154 154 153 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 235 254 248 248 247 247 247 247 247 247 247 247 247 246 255 49 51 6 14 54 9 10 19 29 29 30 111 1 36 26 255 233 255 255 254 254 247 247 247 247 247 247 247 247 254 255 58 129 255 255 255 87 17 97 174 163 163 163 163 163 163 163 162 162 164 163 161 161 163 161 160 160 162 162 161 161 161 161 161 161 159 161 159 160 160 158 159 158 159 158 159 158 159 159 160 160 157 158 155 157 156 156 156 155 154 153 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 254 248 247 247 247 247 247 247 247 247 247 245 255 251 49 0 6 153 152 201 82 82 29 18 30 118 44 86 30 30 233 100 241 255 249 247 247 247 247 247 247 247 245 254 255 148 129 184 255 239 11 11 97 195 163 163 163 162 163 163 163 163 163 163 160 161 161 162 161 161 161 161 161 161 161 161 161 161 161 161 161 161 160 159 158 158 159 159 158 159 158 158 159 159 159 158 158 157 157 156 156 156 154 154 153 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 247 247 247 247 247 247 247 247 245 255 100 174 234 234 255 255 255 145 14 87 255 255 255 255 51 10 100 203 51 42 255 255 247 247 247 247 247 247 247 245 255 164 84 84 223 223 36 16 153 184 162 162 163 163 163 163 163 162 163 162 161 161 161 163 162 162 162 162 161 162 161 164 161 161 161 161 161 161 161 161 159 159 159 159 159 159 159 159 158 158 159 158 158 157 156 156 155 156 156 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 247 247 247 247 247 247 246 249 255 255 255 247 246 255 193 193 13 25 255 130 76 137 233 233 13 198 112 27 206 255 244 247 247 247 247 247 247 249 255 198 231 226 61 52 16 16 82 200 163 163 163 163 163 163 163 163 163 163 163 163 161 163 163 161 161 162 161 161 163 163 161 161 161 161 161 161 161 161 161 161 160 160 160 160 159 158 158 158 159 159 157 156 157 156 155 156 156 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 247 247 247 247 248 247 248 246 246 246 247 250 255 56 13 143 124 124 0 1 255 255 4 206 255 255 29 255 247 247 247 247 247 247 247 246 249 173 255 255 218 229 34 20 139 188 163 163 163 162 163 163 162 163 163 163 162 163 163 163 162 162 162 162 162 162 162 161 162 162 161 161 161 161 161 161 161 161 160 159 159 160 160 160 158 158 159 159 159 158 158 158 155 157 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 247 246 247 247 247 247 246 247 247 247 255 95 56 15 143 233 0 0 154 255 255 18 206 255 21 49 255 255 247 247 247 247 247 247 255 255 173 231 255 255 121 17 20 60 188 160 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 161 162 163 162 161 161 161 162 163 161 161 161 161 161 161 161 161 160 160 160 160 160 160 158 159 158 158 158 159 157 158 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 247 247 247 247 247 246 247 246 255 167 19 17 254 219 21 11 79 255 77 43 254 254 178 0 255 253 247 247 247 247 247 247 249 254 188 255 254 249 255 60 24 107 169 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 161 161 163 162 160 160 161 162 163 163 161 161 161 161 161 161 161 161 159 159 160 160 160 160 159 158 159 159 160 160 156 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 247 247 247 247 248 249 251 255 249 42 24 21 147 255 189 255 255 137 80 19 253 255 113 0 255 255 247 248 247 247 247 247 254 254 194 226 249 250 189 22 11 43 196 161 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 162 162 161 164 164 160 162 162 163 163 164 161 160 161 161 161 161 161 161 159 160 160 159 158 158 159 159 159 159 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 246 251 252 143 255 148 174 40 27 27 255 252 255 248 251 251 32 215 255 255 255 18 193 255 254 255 247 247 248 247 247 255 198 249 254 247 255 119 18 88 178 162 163 163 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 161 163 161 162 161 161 163 164 165 162 161 161 161 161 161 161 161 161 161 159 158 159 159 158 158 158 158 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 251 236 143 95 96 84 33 33 27 195 252 247 247 254 217 217 215 255 255 55 58 136 255 254 255 255 247 247 247 249 255 209 249 250 255 255 12 12 88 195 162 162 163 163 163 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 161 161 161 161 161 163 162 162 165 163 161 161 161 161 161 161 161 161 161 160 158 158 159 159 158 158 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 189 189 255 142 27 33 92 255 244 244 246 246 255 249 249 247 255 172 7 37 39 10 235 255 251 248 247 245 247 181 255 255 249 255 57 9 136 191 162 162 163 163 163 163 163 163 163 163 163 163 162 163 163 163 163 163 163 163 163 163 162 162 164 165 162 163 163 163 161 161 161 162 161 160 159 161 161 161 160 159 158 159 158 158 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

@ -1,80 +0,0 @@
const int MAX_WIDTH = 1024, MAX_HEIGHT = 1024;
int image[MAX_WIDTH * MAX_HEIGHT], width, height;
const float PI = 3.14159265359, TWO_PI = 6.28318530718, EPSILON = 1e-6;
float my_fabs(float x) {
if (x > 0) return x;
return -x;
}
float p(float x) { return 3 * x - 4 * x * x * x; }
float my_sin_impl(float x) {
if (my_fabs(x) <= EPSILON) return x;
return p(my_sin_impl(x / 3.0));
}
float my_sin(float x) {
if (x > TWO_PI || x < -TWO_PI) {
int xx = x / TWO_PI;
x = x - xx * TWO_PI;
}
if (x > PI) x = x - TWO_PI;
if (x < -PI) x = x + TWO_PI;
return my_sin_impl(x);
}
float my_cos(float x) { return my_sin(x + PI / 2); }
int read_image() {
if (getch() != 80 || getch() != 50) return -1;
width = getint();
height = getint();
if (width > MAX_WIDTH || height > MAX_HEIGHT || getint() != 255) return -1;
int y = 0;
while (y < height) {
int x = 0;
while (x < width) {
image[y * width + x] = getint();
x = x + 1;
}
y = y + 1;
}
return 0;
}
int rotate(int x, int y, float rad) {
float sinma = my_sin(rad), cosma = my_cos(rad);
int hwidth = width / 2, hheight = height / 2;
int xt = x - hwidth, yt = y - hheight;
int src_x = xt * cosma - yt * sinma + hwidth,
src_y = xt * sinma + yt * cosma + hheight;
if (src_x < 0 || src_x >= width || src_y < 0 || src_y >= height) return 0;
return image[src_y * width + src_x];
}
void write_pgm(float rad) {
putch(80); putch(50); putch(10); // P2
putint(width); putch(32); putint(height); putch(32); // width height
putint(255); putch(10); // 255
int y = 0;
while (y < height) {
int x = 0;
while (x < width) {
putint(rotate(x, y, rad));
putch(32);
x = x + 1;
}
putch(10);
y = y + 1;
}
}
int main() {
float rad = getfloat();
getch();
if (read_image() < 0) return -1;
write_pgm(rad);
return 0;
}

@ -1,9 +0,0 @@
8 8
0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0
0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7
0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0
0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7
0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0
0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7
0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0
0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7 0x0.0p+0 0x1.fe00000000000p+7

@ -1,18 +0,0 @@
0x1.fep+12 0x0p+0 0x1p-13 0x1.ep-13 -0x1.8p-13 0x1.cp-11 0x1.78p-12 0x1.84p-11
0x1p-14 0x1.0916bap+7 0x1p-14 0x1.38b19ap+7 -0x1p-14 0x1.d3fabp+7 -0x1.8p-12 0x1.4d2c5ap+9
0x1.8p-14 0x1.cp-14 0x0p+0 0x1.cp-14 0x0p+0 0x1.6p-13 -0x1.8p-16 0x1.a8p-12
0x1.6p-12 0x1.38b19cp+7 0x1.cp-14 0x1.70d906p+7 -0x1.6p-13 0x1.140286p+8 -0x1.e8p-12 0x1.89014cp+9
-0x1.4p-13 -0x1.cp-14 0x1p-16 -0x1.2p-13 -0x1p-16 -0x1.2p-13 -0x1p-16 -0x1.56p-11
0x1.cp-11 0x1.d3fab2p+7 0x1.8p-13 0x1.140286p+8 -0x1.4p-13 0x1.9d13f2p+8 -0x1.52p-11 0x1.261634p+10
0x1.9p-12 -0x1.a8p-12 -0x1.8p-16 -0x1.cp-12 0x0p+0 -0x1.8p-11 -0x1p-18 -0x1.dcp-10
0x1.b4p-11 0x1.4d2c5ep+9 0x1.fp-12 0x1.890148p+9 -0x1.32p-11 0x1.261636p+10 -0x1.f88p-10 0x1.a2be92p+11
0x1.fdfff8p+7 0x1.32p-12 0x1.fdfffep+7 0x1.78p-13 0x1.fe001p+7 0x1.3p-14 0x1.fe0038p+7 0x1.adp-13
0x1.2p-12 0x1.fdfff8p+7 0x1.4p-12 0x1.fe000cp+7 0x1.cp-13 0x1.fe0018p+7 -0x1.7p-13 0x1.fe0006p+7
0x1.fep+7 0x1.4p-12 0x1.fdfffep+7 0x1.8p-13 0x1.fe000cp+7 0x1p-14 0x1.fe003cp+7 0x1.c8p-13
0x1.9p-13 0x1.fe000ep+7 0x1p-13 0x1.fe002p+7 0x1p-16 0x1.fe002cp+7 -0x1.68p-12 0x1.fe0018p+7
0x1.fe000cp+7 0x1.ep-13 0x1.fe000ep+7 0x1p-15 0x1.fe001ap+7 -0x1.8p-15 0x1.fe004cp+7 0x1.3p-14
0x1.2p-15 0x1.fe0014p+7 0x1p-14 0x1.fe002cp+7 -0x1p-16 0x1.fe0036p+7 -0x1.9p-12 0x1.fe002p+7
0x1.fe004p+7 -0x1.8p-13 0x1.fe003ep+7 -0x1.6p-12 0x1.fe0048p+7 -0x1.9p-12 0x1.fe008p+7 -0x1.d8p-13
0x1.dbp-13 0x1.fe0008p+7 0x1.ep-13 0x1.fe000ep+7 0x1.1p-13 0x1.fe002p+7 -0x1p-12 0x1.fe0012p+7

@ -1,131 +0,0 @@
// reference:
// https://stackoverflow.com/questions/8310749/discrete-cosine-transform-dct-implementation-c
const int MAX_DIM_X = 8, MAX_DIM_Y = 8;
float test_block[MAX_DIM_X][MAX_DIM_Y];
float test_dct[MAX_DIM_X][MAX_DIM_Y];
float test_idct[MAX_DIM_X][MAX_DIM_Y];
const float PI = 3.14159265359, TWO_PI = 6.28318530718, EPSILON = 1e-6;
float my_fabs(float x) {
if (x > 0) return x;
return -x;
}
float p(float x) { return 3 * x - 4 * x * x * x; }
float my_sin_impl(float x) {
if (my_fabs(x) <= EPSILON) return x;
return p(my_sin_impl(x / 3.0));
}
float my_sin(float x) {
if (x > TWO_PI || x < -TWO_PI) {
int xx = x / TWO_PI;
x = x - xx * TWO_PI;
}
if (x > PI) x = x - TWO_PI;
if (x < -PI) x = x + TWO_PI;
return my_sin_impl(x);
}
float my_cos(float x) { return my_sin(x + PI / 2); }
void write_mat(float mat[][MAX_DIM_Y], int n, int m) {
int i = 0;
while (i < n) {
putfloat(mat[i][0]);
int j = 1;
while (j < m) {
putch(32);
putfloat(mat[i][j]);
j = j + 1;
}
putch(10);
i = i + 1;
}
putch(10);
}
void dct(float dct_mat[][MAX_DIM_Y], float mat[][MAX_DIM_Y], int n, int m) {
int u = 0;
while (u < n) {
int v = 0;
while (v < m) {
dct_mat[u][v] = 0;
int i = 0;
while (i < n) {
int j = 0;
while (j < m) {
dct_mat[u][v] =
dct_mat[u][v] + mat[i][j] * my_cos(PI / n * (i + 1. / 2.) * u) *
my_cos(PI / m * (j + 1. / 2.) * v);
j = j + 1;
}
i = i + 1;
}
v = v + 1;
}
u = u + 1;
}
}
void idct(float mat[][MAX_DIM_Y], float dct_mat[][MAX_DIM_Y], int n, int m) {
int u = 0;
while (u < n) {
int v = 0;
while (v < m) {
mat[u][v] = 1 / 4. * dct_mat[0][0];
int i, j;
i = 1;
while (i < n) {
mat[u][v] = mat[u][v] + 1 / 2. * dct_mat[i][0];
i = i + 1;
}
j = 1;
while (j < m) {
mat[u][v] = mat[u][v] + 1 / 2. * dct_mat[0][j];
j = j + 1;
}
i = 1;
while (i < n) {
j = 1;
while (j < m) {
mat[u][v] = mat[u][v] + dct_mat[i][j] *
my_cos(PI / n * (u + 1. / 2.) * i) *
my_cos(PI / m * (v + 1. / 2.) * j);
j = j + 1;
}
i = i + 1;
}
mat[u][v] = mat[u][v] * 2. / n * 2. / m;
v = v + 1;
}
u = u + 1;
}
}
int main() {
int dim_x = getint(), dim_y = getint();
int i = 0;
while (i < dim_x) {
int j = 0;
while (j < dim_y) {
test_block[i][j] = getfloat();
j = j + 1;
}
i = i + 1;
}
dct(test_dct, test_block, dim_x, dim_y);
write_mat(test_dct, dim_x, dim_y);
idct(test_idct, test_dct, dim_x, dim_y);
write_mat(test_idct, dim_x, dim_y);
return 0;
}

@ -1,2 +0,0 @@
4010
++++++++[->++++++++<]>+++++++++.<+++++[->-----<]>---------.<++++++++[->++++++++<]>++++++.<++++++++[->--------<]>-------------.<+++++++[->+++++++<]>++.<+++++[->+++++<]>+++++++++.+++++.-----.--------.----.<++++[->++++<]>.<++++[->----<]>--------.<++++++++[->--------<]>-.<++++++[->++++++<]>++++.<+++++[->+++++<]>.<++++[->++++<]>+.+++.<+++[->---<]>----.+.<++++++++[->--------<]>---------.<++++++++[->++++++++<]>++++++.<+++[->+++<]>+++.---.--.<++++++++[->--------<]>-------------.<+++++++++[->+++++++++<]>+++.<+++[->---<]>---.---.<++++++++[->--------<]>-----.<++++++[->++++++<]>+.<+++++[->+++++<]>+++.<++++[->++++<]>++.+.<+++++++++[->---------<]>---.<++++++[->++++++<]>++++++.<++++++[->++++++<]>+++++++.-------.-----.++++++.+++.<+++++++++[->---------<]>-.<++++++[->++++++<]>++++.<+++++[->+++++<]>++++++++.--.+.<++++++++[->--------<]>--------.<+++++++[->+++++++<]>++.<++++[->++++<]>.+++++.+++++++..---.<++++++++[->--------<]>.<+++[->---<]>---.<++++++++[->++++++++<]>+.<+++[->+++<]>++++.<+++[->---<]>-.<++++++++[->--------<]>----.<++++++[->++++++<]>+++++.<+++++[->-----<]>---------.<++++++++[->++++++++<]>++++++.<++++++++[->--------<]>-------------.<++++++++[->++++++++<]>++++++++++++++.+.+++++.<+++++++++[->---------<]>---.<++++++++[->++++++++<]>+++++++++.+++++.++++++.<+++[->---<]>------.<+++[->+++<]>++++.<+++[->---<]>----.<+++[->+++<]>+++++.+.<+++[->---<]>------.-.<++++++++[->--------<]>----.<++++++++[->++++++++<]>+++++++++.+++++.<++++++++[->--------<]>--------------.<++++++++[->++++++++<]>+++++++++++++++.+++.<+++[->---<]>-----.+++++.+++++.<+++[->---<]>----.<++++[->++++<]>+.+++++++.<+++++++++[->---------<]>--------.<++++++++[->++++++++<]>++++++++.<+++[->+++<]>++++.--------.<+++[->---<]>---.<+++[->+++<]>++++.+++++.<++++++++[->--------<]>-----.<+++[->---<]>-----.<++++++[->++++++<]>+++++.<+++++[->+++++<]>++++.<++++++++[->--------<]>------.<+++++++++[->+++++++++<]>+++.<+++[->---<]>---.---.<+++[->+++<]>++++.<+++[->---<]>----.<++++++++[->--------<]>-----.<+++++++++[->+++++++++<]>++++++.<++++[->----<]>--.<+++[->+++<]>++++.<+++[->---<]>----.<++++++++[->--------<]>-----.<++++++++[->++++++++<]>+.<+++[->+++<]>++++.<++++++++[->--------<]>--------------.<++++++++[->++++++++<]>+.<+++[->+++<]>++.---.----.+++++++++.<++++++++[->--------<]>--.<+++[->---<]>---.<++++++++[->++++++++<]>+.<++++++++[->--------<]>-.<+++++++++[->+++++++++<]>+++.<+++[->---<]>--.++++.--------.<++++++++[->--------<]>-----.<+++++++++[->+++++++++<]>+++.--.<++++[->----<]>-.<++++[->++++<]>+++++.<++++[->----<]>-.+++++++..-------.<+++[->+++<]>++++.<++++++++[->--------<]>------.<+++[->---<]>---.<++++++++[->++++++++<]>+.<+++[->+++<]>++++.<++++++++[->--------<]>--------------.<++++++++[->++++++++<]>+++++++++++++++.+++++.<+++[->---<]>---.---.<+++[->+++<]>++++.+++++.--------.+++.------.--------.+.<+++[->+++<]>++++.<+++++++++[->---------<]>-.<++++++++[->++++++++<]>+++++++++++++++.+++.<+++++++++[->---------<]>-.<++++++++[->++++++++<]>+.<++++++++[->--------<]>-.<+++++++++[->+++++++++<]>++.++.-----.<+++[->---<]>--.<+++[->+++<]>++++.<+++[->---<]>-.---.<+++[->+++<]>++++.---.<++++++++[->--------<]>---------------.<++++++++[->++++++++<]>+.<+++[->+++<]>+++.++.-.-------.<++++++++[->--------<]>-------.<+++++++++[->+++++++++<]>++++++++.<+++[->---<]>-.++++++.<++++++++[->--------<]>---------.<+++[->---<]>---.<++++++++[->++++++++<]>++++++++++++++++.----.-------.----.<++++[->++++<]>++.<+++[->---<]>-----.<++++++++[->--------<]>-----.<++++++++[->++++++++<]>+++.<+++[->+++<]>+++.--.--------.<++++++++[->--------<]>-----.<+++++++++[->+++++++++<]>+++.-----.<++++++++[->--------<]>---------------.<++++++++[->++++++++<]>+++++++++++++.--------..<+++[->+++<]>++++++.<+++++++++[->---------<]>---.<++++++++[->++++++++<]>+++++++++++++.--------.<++++++++[->--------<]>----.-.<+++++++[->+++++++<]>+++.<++++[->++++<]>++++.-------.<++++[->++++<]>+++.<++++++++[->--------<]>-------------.<++++++++[->++++++++<]>++++++++++++.<+++++++++[->---------<]>--.<++++++++[->++++++++<]>+.<+++[->+++<]>++..<+++++++[->-------<]>-------------.<+++++[->-----<]>--------.---.<

@ -1 +0,0 @@
I'm Suzumiya Haruhi from the East Junior High School, and I'm not interested in ordinary humans. If there were an alien, a time traveller, an otherworlder or a superhero among you, please come to meet me! That's all.

@ -1,73 +0,0 @@
/*
a brainfuck interpreter
reference: https://gist.github.com/maxcountryman/1699708
*/
// tape, input buffer, and read/write pointer
const int TAPE_LEN = 65536, BUFFER_LEN = 32768;
int tape[TAPE_LEN], program[BUFFER_LEN], ptr = 0;
// read the input program
void read_program() {
int i = 0, len = getint();
while (i < len) {
program[i] = getch();
i = i + 1;
}
program[i] = 0;
}
// interpret the input program
void interpret(int input[]) {
int cur_char, loop, i = 0;
while (input[i]) {
cur_char = input[i];
if (cur_char == 62) {
// '>'
ptr = ptr + 1;
}
else if (cur_char == 60) {
// '<'
ptr = ptr - 1;
}
else if (cur_char == 43) {
// '+'
tape[ptr] = tape[ptr] + 1;
}
else if (cur_char == 45) {
// '-'
tape[ptr] = tape[ptr] - 1;
}
else if (cur_char == 46) {
// '.'
putch(tape[ptr]);
}
else if (cur_char == 44) {
// ','
tape[ptr] = getch();
}
else if (cur_char == 93 && tape[ptr]) {
// ']'
loop = 1;
while (loop > 0) {
i = i - 1;
cur_char = input[i];
if (cur_char == 91) {
// '['
loop = loop - 1;
}
else if (cur_char == 93) {
// ']'
loop = loop + 1;
}
}
}
i = i + 1;
}
}
int main() {
read_program();
interpret(program);
return 0;
}
Loading…
Cancel
Save