From 5524487f80e2839e317a10f518cac76f311c5864 Mon Sep 17 00:00:00 2001 From: Polprzewodnikowy Date: Mon, 23 Aug 2021 00:35:50 +0200 Subject: [PATCH] almost working --- fw/SummerCart64.qsf | 3 +- fw/cntrllr/main.c | 155 +++- fw/cntrllr/sys.h | 28 +- fw/rtl/cpu/cpu_dma.sv | 154 +++- fw/rtl/cpu/cpu_soc.sv | 8 +- fw/rtl/cpu/cpu_usb.sv | 125 +-- fw/rtl/memory/memory_sdram.sv | 2 +- fw/rtl/n64/n64_sdram.sv | 2 +- fw/rtl/system/sc64.sv | 9 +- fw/rtl/usb/usb_ft1248.sv | 203 ++--- fw/stp.stp | 1605 ++++++++++++++------------------- fw/unused/device_arbiter.v | 91 -- fw/unused/fifo8.qip | 4 - fw/unused/fifo8.v | 179 ---- fw/unused/sdram.vhd | 445 --------- fw/unused/usb_fifo.sv | 46 - 16 files changed, 1131 insertions(+), 1928 deletions(-) delete mode 100644 fw/unused/device_arbiter.v delete mode 100644 fw/unused/fifo8.qip delete mode 100644 fw/unused/fifo8.v delete mode 100644 fw/unused/sdram.vhd delete mode 100644 fw/unused/usb_fifo.sv diff --git a/fw/SummerCart64.qsf b/fw/SummerCart64.qsf index 630c80f..4cf73e6 100644 --- a/fw/SummerCart64.qsf +++ b/fw/SummerCart64.qsf @@ -301,5 +301,6 @@ set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top # end ENTITY(SummerCart64) # ------------------------ set_global_assignment -name QIP_FILE rtl/intel/gpio/intel_gpio_ddro.qip + set_global_assignment -name SLD_FILE db/stp_auto_stripped.stp -set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/fw/cntrllr/main.c b/fw/cntrllr/main.c index 28af389..e66f654 100644 --- a/fw/cntrllr/main.c +++ b/fw/cntrllr/main.c @@ -7,7 +7,7 @@ volatile int counter = 0; void print (const char *text) { while (*text != '\0') { - while (!(UART_SR & UART_SR_TXE)); + while (!(UART_SCR & UART_SCR_TXE)); UART_DR = *text++; } } @@ -50,38 +50,147 @@ void print_nice_date(uint8_t *date) { print_02hex(date[0]); } +const char CMD[3] = {'C', 'M', 'D'}; +const char CMD_R = 'R'; +const char CMD_W = 'W'; + +const char CMP[3] = {'C', 'M', 'P'}; + __NAKED__ int main (void) { - uint8_t rtc_data[7]; - uint8_t rtc_new_data[7]; - int index = 0; + uint8_t data; + uint8_t cmd = '-'; + uint32_t arg1, arg2; + char tmp[2]; + + tmp[1] = 0; GPIO_OE = (1 << 0); GPIO_O = (1 << 0); - rtc_init(); + DMA_SCR = DMA_SCR_STOP; + USB_SCR = USB_SCR_FLUSH_TX | USB_SCR_FLUSH_TX; while (1) { - GPIO_O = (1 << 0); + arg1 = 0; + arg2 = 0; - print("\033[2J\033[H\r\n --- Hello --- \r\n\r\n"); - print(" RTC Data:\r\n\r\n "); + print("\r\nLoop start\r\n"); - rtc_get_time(rtc_data); - - print_nice_date(rtc_data); - - print("\r\n"); - GPIO_O = 0x00; - - while (counter++ < 0x0003FFFF); - counter = 0; - - if (USB_SR & USB_SR_RXNE) { - rtc_new_data[index++] = USB_DR; - if (index == 7) { - index = 0; - rtc_set_time(rtc_new_data); + for (int i = 0; i < 4; i++) { + while (!(USB_SCR & USB_SCR_RXNE)); + data = USB_DR; + if (i < 3 && data != CMD[i]) { + i = 0; + print("Wrong data "); + print_02hex(data); + print("\r\n"); + } else { + cmd = data; } } + + print("Received CMD"); + tmp[0] = cmd; + print(tmp); + print("\r\n"); + + for (int i = 0; i < 4; i++) { + while (!(USB_SCR & USB_SCR_RXNE)); + arg1 = (arg1 << 8) | USB_DR; + } + + print("Received ARG_1 0x"); + for (int i = 0; i < 4; i++) { + print_02hex((uint8_t) (arg1 >> ((3 - i) * 8))); + } + print("\r\n"); + + for (int i = 0; i < 4; i++) { + while (!(USB_SCR & USB_SCR_RXNE)); + arg2 = (arg2 << 8) | USB_DR; + } + + print("Received ARG_2 0x"); + for (int i = 0; i < 4; i++) { + print_02hex((uint8_t) (arg2 >> ((3 - i) * 8))); + } + print("\r\n"); + + DMA_MADDR = arg1; + DMA_ID_LEN = arg2; + DMA_SCR = (cmd == CMD_W ? DMA_SCR_DIR : 0) | DMA_SCR_START; + + print("Started DMA\r\n"); + + while (DMA_SCR & DMA_SCR_BUSY); + + // for (int i = 0; i < arg2; i++) { + // while (!(USB_SCR & USB_SCR_RXNE)); + // data = USB_DR; + // } + + print("Finished DMA\r\n"); + + for (int i = 0; i < 4; i++) { + while (!(USB_SCR & USB_SCR_TXE)); + if (i < 3) { + USB_DR = CMP[i]; + } else { + USB_DR = cmd; + } + } + + print("Sent response "); + tmp[0] = cmd; + print(tmp); + print("\r\n"); } } + +// __NAKED__ int main (void) { + // uint8_t rtc_data[7]; + // uint8_t rtc_new_data[7]; + // int index = 0; + + // GPIO_OE = (1 << 0); + // GPIO_O = (1 << 0); + + // rtc_init(); + + // while (!(USB_SR & USB_SR_TXE)); + // USB_DR = 0x55; + // USB_DR = 0xAA; + // USB_DR = 0x00; + // USB_DR = 'D'; + // USB_DR = 'E'; + // USB_DR = 'A'; + // USB_DR = 'D'; + // USB_DR = 0xFF; + // USB_DR = 0xAA; + // USB_DR = 0x55; + + // while (1) { + // GPIO_O = (1 << 0); + + // print("\033[2J\033[H\r\n --- Hello --- \r\n\r\n"); + // print(" RTC Data:\r\n\r\n "); + + // rtc_get_time(rtc_data); + + // print_nice_date(rtc_data); + + // print("\r\n"); + // GPIO_O = 0x00; + + // while (counter++ < 0x0003FFFF); + // counter = 0; + + // if (USB_SR & USB_SR_RXNE) { + // rtc_new_data[index++] = USB_DR; + // if (index == 7) { + // index = 0; + // rtc_set_time(rtc_new_data); + // } + // } + // } +// } diff --git a/fw/cntrllr/sys.h b/fw/cntrllr/sys.h index 2119737..02f93ff 100644 --- a/fw/cntrllr/sys.h +++ b/fw/cntrllr/sys.h @@ -11,16 +11,22 @@ typedef volatile uint8_t * io8_t; typedef volatile uint32_t * io32_t; +#define RAM (*((io32_t) 0x00000000)) +#define BOOTLOADER (*((io32_t) 0x10000000)) #define GPIO (*((io32_t) 0x20000000)) #define GPIO_O (*((io8_t) 0x20000000)) #define GPIO_I (*((io8_t) 0x20000001)) #define GPIO_OE (*((io8_t) 0x20000002)) #define I2C_SR (*((io8_t) 0x30000000)) #define I2C_DR (*((io8_t) 0x30000004)) -#define USB_SR (*((io8_t) 0x40000000)) +#define USB_SCR (*((io8_t) 0x40000000)) #define USB_DR (*((io8_t) 0x40000004)) -#define UART_SR (*((io8_t) 0x50000000)) +#define UART_SCR (*((io8_t) 0x50000000)) #define UART_DR (*((io8_t) 0x50000004)) +#define DMA_SCR (*((io8_t) 0x60000000)) +#define DMA_MADDR (*((io32_t) 0x60000004)) +#define DMA_ID_LEN (*((io32_t) 0x60000008)) +#define SDRAM (*((io32_t) 0x68000000)) #define I2C_SR_START (1 << 0) #define I2C_SR_STOP (1 << 1) @@ -29,11 +35,21 @@ typedef volatile uint32_t * io32_t; #define I2C_SR_BUSY (1 << 4) #define I2C_ADDR_READ (1 << 0) -#define USB_SR_RXNE (1 << 0) -#define USB_SR_TXE (1 << 1) +#define USB_SCR_RXNE (1 << 0) +#define USB_SCR_TXE (1 << 1) +#define USB_SCR_FLUSH_RX (1 << 2) +#define USB_SCR_FLUSH_TX (1 << 3) -#define UART_SR_RXNE (1 << 0) -#define UART_SR_TXE (1 << 1) +#define UART_SCR_RXNE (1 << 0) +#define UART_SCR_TXE (1 << 1) + +#define DMA_SCR_START (1 << 0) +#define DMA_SCR_STOP (1 << 1) +#define DMA_SCR_DIR (1 << 2) +#define DMA_SCR_BUSY (1 << 3) + +#define DMA_ID_USB (0) +#define DMA_ID_SD (1) #endif diff --git a/fw/rtl/cpu/cpu_dma.sv b/fw/rtl/cpu/cpu_dma.sv index 6d1400a..2454c38 100644 --- a/fw/rtl/cpu/cpu_dma.sv +++ b/fw/rtl/cpu/cpu_dma.sv @@ -1,5 +1,16 @@ interface if_dma (); + localparam [1:0] NUM_DEVICES = sc64::__ID_DMA_END; + + sc64::e_dma_id id; + + logic rx_empty; + logic rx_read; + logic [7:0] rx_rdata; + logic tx_full; + logic tx_write; + logic [7:0] tx_wdata; + logic request; logic ack; logic write; @@ -7,7 +18,16 @@ interface if_dma (); logic [15:0] rdata; logic [15:0] wdata; - modport cpu ( + modport controller ( + output id, + + input rx_empty, + output rx_read, + input rx_rdata, + input tx_full, + output tx_write, + output tx_wdata, + output request, input ack, output write, @@ -25,4 +45,136 @@ interface if_dma (); input wdata ); + logic [7:0] device_rx_rdata [(NUM_DEVICES - 1):0]; + logic device_rx_empty [(NUM_DEVICES - 1):0]; + logic device_tx_full [(NUM_DEVICES - 1):0]; + + always_comb begin + rx_rdata = 8'd0; + + for (integer i = 0; i < NUM_DEVICES; i++) begin + rx_rdata = rx_rdata | device_rx_rdata[i]; + rx_empty = rx_empty | (device_rx_empty[i] && id == i[1:0]); + tx_full = tx_full | (device_tx_full[i] && id == i[1:0]); + end + end + + genvar n; + generate + for (n = 0; n < NUM_DEVICES; n++) begin : at + logic device_selected; + logic device_rx_read; + logic device_tx_write; + + always_comb begin + device_selected = id == n[1:0]; + device_rx_read = device_selected && rx_read; + device_tx_write = device_selected && tx_write; + end + + modport device ( + output .rx_empty(device_rx_empty[n]), + input .rx_read(device_rx_read), + output .rx_rdata(device_rx_rdata[n]), + output .tx_full(device_tx_full[n]), + input .tx_write(device_tx_write), + input .tx_wdata(tx_wdata) + ); + end + endgenerate + endinterface + + +module cpu_dma ( + if_system.sys sys, + if_cpu_bus bus, + if_dma.controller dma +); + + always_ff @(posedge sys.clk) begin + bus.ack <= 1'b0; + if (bus.request) begin + bus.ack <= 1'b1; + end + end + + always_comb begin + bus.rdata = 32'd0; + // if (bus.ack) begin + // case (bus.address[2:2]) + // 0: bus.rdata = {30'd0, ~tx_full, ~rx_empty}; + // 1: bus.rdata = {24'd0, rx_rdata}; + // default: bus.rdata = 32'd0; + // endcase + // end + end + + always_ff @(posedge sys.clk) begin + // rx_flush <= 1'b0; + // cpu_rx_read <= 1'b0; + + // tx_flush <= 1'b0; + // cpu_tx_write <= 1'b0; + + // if (bus.request) begin + // case (bus.address[2:2]) + // 2'd0: begin + // if (bus.wmask[0]) begin + // {tx_flush, rx_flush} <= bus.wdata[3:2]; + // end + // end + + // 2'd1: begin + // if (bus.wmask[0]) begin + // cpu_tx_write <= 1'b1; + // end else begin + // cpu_rx_read <= 1'b1; + // end + // end + // endcase + // end + end + // typedef enum bit [0:0] { + // S_IDLE, + // S_WAIT + // } e_state; + + // e_state state; + + // logic byte_counter; + + // always_ff @(posedge sys.clk) begin + // rx_read <= 1'b0; + + // if (sys.reset) begin + // dma.request <= 1'b0; + // dma.write <= 1'b1; + // dma.address <= 32'd0; + // state <= S_IDLE; + // byte_counter <= 1'b0; + // end else begin + // case (state) + // S_IDLE: begin + // if (!rx_empty && !rx_read) begin + // byte_counter <= ~byte_counter; + // rx_read <= 1'b1; + // dma.wdata <= {dma.wdata[7:0], rx_rdata}; + // if (byte_counter) begin + // dma.request <= 1'b1; + // state <= S_WAIT; + // end + // end + // end + + // S_WAIT: begin + // if (dma.ack) begin + // dma.address <= dma.address + 2'd2; + // dma.request <= 1'b0; + // state <= S_IDLE; + // end + // end + // endcase + // end + // end +endmodule diff --git a/fw/rtl/cpu/cpu_soc.sv b/fw/rtl/cpu/cpu_soc.sv index d25ef59..e65526d 100644 --- a/fw/rtl/cpu/cpu_soc.sv +++ b/fw/rtl/cpu/cpu_soc.sv @@ -61,7 +61,7 @@ module cpu_soc ( cpu_usb cpu_usb_inst ( .sys(sys), .bus(bus.at[sc64::ID_CPU_USB].device), - .dma(dma), + .dma(dma.at[sc64::ID_DMA_USB].device), .usb_clk(usb_clk), .usb_cs(usb_cs), .usb_miso(usb_miso), @@ -78,4 +78,10 @@ module cpu_soc ( .uart_rts(uart_rts) ); + cpu_dma cpu_dma_inst ( + .sys(sys), + .bus(bus.at[sc64::ID_CPU_DMA].device), + .dma(dma) + ); + endmodule diff --git a/fw/rtl/cpu/cpu_usb.sv b/fw/rtl/cpu/cpu_usb.sv index 5500b81..b398fe0 100644 --- a/fw/rtl/cpu/cpu_usb.sv +++ b/fw/rtl/cpu/cpu_usb.sv @@ -1,7 +1,7 @@ module cpu_usb ( if_system sys, if_cpu_bus bus, - if_dma.cpu dma, + if_dma dma, output usb_clk, output usb_cs, @@ -20,86 +20,57 @@ module cpu_usb ( logic tx_write; logic [7:0] tx_wdata; - // always_ff @(posedge sys.clk) begin - // bus.ack <= 1'b0; - // if (bus.request) begin - // bus.ack <= 1'b1; - // end - // end + logic cpu_rx_read; + logic cpu_tx_write; - // always_comb begin - // bus.rdata = 32'd0; - // if (bus.ack) begin - // case (bus.address[2:2]) - // 0: bus.rdata = {30'd0, ~tx_full, ~rx_empty}; - // 1: bus.rdata = {24'd0, rx_rdata}; - // default: bus.rdata = 32'd0; - // endcase - // end - // end + always_comb begin + dma.rx_empty = rx_empty; + rx_read = cpu_rx_read || dma.rx_read; + dma.rx_rdata = rx_rdata; - // always_ff @(posedge sys.clk) begin - // rx_flush <= 1'b0; - // rx_read <= 1'b0; - - // tx_flush <= 1'b0; - // tx_write <= 1'b0; - - // if (bus.request) begin - // case (bus.address[2:2]) - // 2'd0: if (bus.wmask[0]) begin - // {tx_flush, rx_flush} <= bus.wdata[3:2]; - // end - - // 2'd1: if (bus.wmask[0]) begin - // if (!tx_full) begin - // tx_write <= 1'b1; - // tx_wdata <= bus.wdata[7:0]; - // end - // end else begin - // rx_read <= 1'b1; - // end - // endcase - // end - // end - - typedef enum bit [0:0] { - S_IDLE, - S_WAIT - } e_state; - - e_state state; - - logic byte_counter; + dma.tx_full = tx_full; + tx_write = cpu_tx_write || dma.tx_write; + tx_wdata = dma.tx_write ? dma.tx_wdata : bus.wdata[7:0]; + end always_ff @(posedge sys.clk) begin - rx_read <= 1'b0; + bus.ack <= 1'b0; + if (bus.request) begin + bus.ack <= 1'b1; + end + end - if (sys.reset) begin - dma.request <= 1'b0; - dma.write <= 1'b1; - dma.address <= 32'd0; - state <= S_IDLE; - byte_counter <= 1'b0; - end else begin - case (state) - S_IDLE: begin - if (!rx_empty && !rx_read) begin - byte_counter <= ~byte_counter; - rx_read <= 1'b1; - dma.wdata <= {dma.wdata[7:0], rx_rdata}; - if (byte_counter) begin - dma.request <= 1'b1; - state <= S_WAIT; - end + always_comb begin + bus.rdata = 32'd0; + if (bus.ack) begin + case (bus.address[2:2]) + 0: bus.rdata = {30'd0, ~tx_full, ~rx_empty}; + 1: bus.rdata = {24'd0, rx_rdata}; + default: bus.rdata = 32'd0; + endcase + end + end + + always_ff @(posedge sys.clk) begin + rx_flush <= 1'b0; + cpu_rx_read <= 1'b0; + + tx_flush <= 1'b0; + cpu_tx_write <= 1'b0; + + if (bus.request) begin + case (bus.address[2:2]) + 2'd0: begin + if (bus.wmask[0]) begin + {tx_flush, rx_flush} <= bus.wdata[3:2]; end end - S_WAIT: begin - if (dma.ack) begin - dma.address <= dma.address + 2'd2; - dma.request <= 1'b0; - state <= S_IDLE; + 2'd1: begin + if (bus.wmask[0]) begin + cpu_tx_write <= 1'b1; + end else begin + cpu_rx_read <= 1'b1; end end endcase @@ -120,10 +91,10 @@ module cpu_usb ( .rx_read(rx_read), .rx_rdata(rx_rdata), - // .tx_flush(tx_flush), - // .tx_full(tx_full), - // .tx_write(tx_write), - // .tx_wdata(tx_wdata) + .tx_flush(tx_flush), + .tx_full(tx_full), + .tx_write(tx_write), + .tx_wdata(tx_wdata) ); endmodule diff --git a/fw/rtl/memory/memory_sdram.sv b/fw/rtl/memory/memory_sdram.sv index 1a5bee6..6719ef3 100644 --- a/fw/rtl/memory/memory_sdram.sv +++ b/fw/rtl/memory/memory_sdram.sv @@ -4,7 +4,7 @@ module memory_sdram ( input request, output ack, input write, - input [31:0] address, + input [25:0] address, output [15:0] rdata, input [15:0] wdata, diff --git a/fw/rtl/n64/n64_sdram.sv b/fw/rtl/n64/n64_sdram.sv index fa19b7d..f52909a 100644 --- a/fw/rtl/n64/n64_sdram.sv +++ b/fw/rtl/n64/n64_sdram.sv @@ -73,7 +73,7 @@ module n64_sdram ( .request(mem_request), .ack(mem_ack), .write(mem_write), - .address(mem_address), + .address(mem_address[25:0]), .rdata(mem_rdata), .wdata(mem_wdata), diff --git a/fw/rtl/system/sc64.sv b/fw/rtl/system/sc64.sv index 7308c0b..ef3b40b 100644 --- a/fw/rtl/system/sc64.sv +++ b/fw/rtl/system/sc64.sv @@ -16,13 +16,20 @@ package sc64; ID_CPU_I2C, ID_CPU_USB, ID_CPU_UART, + ID_CPU_DMA, __ID_CPU_END } e_cpu_id; + typedef enum bit [1:0] { + ID_DMA_USB, + ID_DMA_SD, + __ID_DMA_END + } e_dma_id; + parameter int CLOCK_FREQUENCY = 32'd100_000_000; parameter int UART_BAUD_RATE = 32'd1_000_000; - parameter bit DEBUG_ENABLED = 1'b0; + parameter bit DEBUG_ENABLED = 1'b1; endpackage diff --git a/fw/rtl/usb/usb_ft1248.sv b/fw/rtl/usb/usb_ft1248.sv index caaf098..7dcb3ea 100644 --- a/fw/rtl/usb/usb_ft1248.sv +++ b/fw/rtl/usb/usb_ft1248.sv @@ -9,39 +9,34 @@ module usb_ft1248 ( input rx_flush, output rx_empty, - // output rx_almost_empty, input rx_read, output [7:0] rx_rdata, input tx_flush, output tx_full, - // output tx_almost_full, input tx_write, input [7:0] tx_wdata ); // FIFOs - wire rx_full; - wire rx_almost_full; - reg rx_write; - reg [7:0] rx_wdata; + logic rx_full; + logic rx_write; + logic [7:0] rx_wdata; - wire tx_empty; - reg tx_read; - wire [7:0] tx_rdata; + logic tx_empty; + logic tx_read; + logic [7:0] tx_rdata; intel_fifo_8 fifo_8_rx_inst ( .clock(sys.clk), .sclr(rx_flush), .empty(rx_empty), - // .almost_empty(rx_almost_empty), .rdreq(rx_read), .q(rx_rdata), .full(rx_full), - // .almost_full(rx_almost_full), .wrreq(rx_write), .data(rx_wdata) ); @@ -55,21 +50,18 @@ module usb_ft1248 ( .q(tx_rdata), .full(tx_full), - // .almost_full(tx_almost_full), .wrreq(tx_write), .data(tx_wdata) ); + // FT1248 interface controller - // Constants definition - - typedef enum bit [2:0] { - S_TRY_RX = 3'b000, - S_TRY_TX = 3'b001, - S_COMMAND = 3'b100, - S_DATA = 3'b101, - S_END = 3'b111 + typedef enum bit [1:0] { + S_TRY_RX, + S_TRY_TX, + S_COMMAND, + S_DATA } e_state; typedef enum bit [7:0] { @@ -77,78 +69,103 @@ module usb_ft1248 ( C_READ = 8'h04 } e_command; - // FSM state + typedef enum bit [1:0] { + P_PRE_RISING, + P_RISING, + P_PRE_FALLING, + P_FALLING + } e_clock_phase; e_state state; - // Clock divider and generator + logic [3:0] clock_phase; - reg [3:0] clock_divider; - wire rising_edge = clock_divider[1]; + logic usb_clk_output; + logic usb_cs_output; + logic [3:0] usb_miosi_input; + logic [3:0] usb_miosi_output; + logic [3:0] usb_miosi_output_data; + logic usb_miosi_output_enable; + logic usb_miosi_output_enable_data; + logic usb_miso_input; + logic usb_pwren_input; + + logic is_cmd_write; + logic [1:0] nibble_counter; + logic [7:0] tx_buffer; always_ff @(posedge sys.clk) begin if (sys.reset || state == S_TRY_RX || state == S_TRY_TX) begin - clock_divider <= 4'b0001; + clock_phase <= 4'b0001; end else begin - clock_divider <= {clock_divider[2:0], clock_divider[3]}; + clock_phase <= {clock_phase[2:0], clock_phase[3]}; end end - // Output chip select and data register behavior + always_ff @(posedge sys.clk) begin + usb_clk <= usb_clk_output; + usb_cs <= usb_cs_output; - reg [1:0] bit_counter; - reg [7:0] tx_buffer; + usb_miosi_input <= usb_miosi; + usb_miosi_output <= usb_miosi_output_data; + usb_miosi_output_enable <= usb_miosi_output_enable_data; + + usb_miso_input <= usb_miso; + usb_pwren_input <= usb_pwren; - wire clk_data; - reg cs_data; - wire [3:0] miosi_data; - reg miosi_output_enable_data; - - reg clk_output; - reg cs_output; - reg [3:0] miosi_input; - reg [3:0] miosi_output; - reg miosi_output_enable; - reg miso_input; + tx_buffer <= tx_rdata; + end always_comb begin - clk_data = 1'b0; - if (state == S_COMMAND || state == S_DATA) clk_data = (clock_divider[2] | clock_divider[3]); - usb_clk = clk_output; - usb_cs = cs_output; - miosi_data = bit_counter[0] ? tx_buffer[3:0] : tx_buffer[7:4]; - usb_miosi = miosi_output_enable ? miosi_output : 4'bZZZZ; + usb_miosi = usb_miosi_output_enable ? usb_miosi_output : 4'bZZZZ; end - always_ff @(posedge sys.clk) begin - clk_output <= clk_data; - cs_output <= cs_data; - miosi_input <= usb_miosi; - miosi_output <= miosi_data; - miosi_output_enable <= miosi_output_enable_data; - miso_input <= usb_miso; + always_comb begin + case (state) + S_COMMAND: begin + usb_clk_output = clock_phase[P_PRE_FALLING] || clock_phase[P_FALLING]; + usb_cs_output = 1'b0; + if (is_cmd_write) begin + usb_miosi_output_data = nibble_counter[0] ? C_WRITE[3:0] : C_WRITE[7:4]; + end else begin + usb_miosi_output_data = nibble_counter[0] ? C_READ[3:0] : C_READ[7:4]; + end + usb_miosi_output_enable_data = nibble_counter < 2'd2; + end + + S_DATA: begin + usb_clk_output = clock_phase[P_PRE_FALLING] || clock_phase[P_FALLING]; + usb_cs_output = 1'b0; + usb_miosi_output_data = nibble_counter[0] ? tx_buffer[7:4] : tx_buffer[3:0]; + usb_miosi_output_enable_data = is_cmd_write; + end + + default: begin + usb_clk_output = 1'b0; + usb_cs_output = 1'b1; + usb_miosi_output_data = 4'hF; + usb_miosi_output_enable_data = 1'b0; + end + endcase end - // FSM - - reg is_write; - always_ff @(posedge sys.clk) begin rx_write <= 1'b0; tx_read <= 1'b0; + if (clock_phase[P_RISING]) begin + nibble_counter <= nibble_counter + 1'd1; + end + if (sys.reset) begin state <= S_TRY_RX; - cs_data <= 1'b1; - miosi_output_enable_data <= 1'b0; end else begin case (state) S_TRY_RX: begin if (!rx_full) begin state <= S_COMMAND; - tx_buffer <= C_READ; - bit_counter <= 2'b11; - is_write <= 1'b0; + is_cmd_write <= 1'b0; + nibble_counter <= 2'b11; end else begin state <= S_TRY_TX; end @@ -157,71 +174,45 @@ module usb_ft1248 ( S_TRY_TX: begin if (!tx_empty) begin state <= S_COMMAND; - tx_buffer <= C_WRITE; - bit_counter <= 2'b11; - is_write <= 1'b1; + is_cmd_write <= 1'b1; + nibble_counter <= 2'b11; end else begin state <= S_TRY_RX; end end S_COMMAND: begin - cs_data <= 1'b0; - if (rising_edge) begin - bit_counter <= bit_counter + 1'd1; - miosi_output_enable_data <= 1'b1; - if (bit_counter == 2'd1) begin - miosi_output_enable_data <= 1'b0; - end - if (bit_counter == 2'd2) begin - if (!miso_input) begin - state <= S_DATA; - bit_counter <= 2'b11; - tx_buffer <= tx_rdata; - miosi_output_enable_data <= is_write; + if (clock_phase[P_RISING]) begin + if (nibble_counter == 2'd2) begin + if (usb_miso_input) begin + state <= is_cmd_write ? S_TRY_RX : S_TRY_TX; end else begin - state <= S_END; - miosi_output_enable_data <= 1'b0; + state <= S_DATA; + nibble_counter <= 2'd0; end end end end S_DATA: begin - if (rising_edge) begin - bit_counter <= {1'b0, ~bit_counter[0]}; - miosi_output_enable_data <= is_write; - rx_wdata <= {miosi_input, rx_wdata[7:4]}; - if (bit_counter == 1'd1) begin - tx_buffer <= tx_rdata; + if (clock_phase[P_FALLING]) begin + if (nibble_counter[0]) begin + tx_read <= is_cmd_write; end - if (!is_write && (bit_counter[0] == 1'd0)) begin - rx_write <= 1'b1; + end + if (clock_phase[P_RISING]) begin + rx_wdata <= {usb_miosi_input, rx_wdata[7:4]}; + if (nibble_counter[0]) begin + rx_write <= !is_cmd_write; end - if (is_write && (bit_counter[0] == 1'd1)) begin - tx_read <= 1'b1; - end - if ( - (bit_counter[0] == 1'd1 && miso_input) || - (bit_counter[0] == 1'd0 && ( - (is_write && tx_empty) || - (!is_write && rx_almost_full) - ))) begin - state <= S_END; - miosi_output_enable_data <= 1'b0; + if (usb_miso_input || (!is_cmd_write && rx_full) || (is_cmd_write && tx_empty)) begin + state <= is_cmd_write ? S_TRY_RX : S_TRY_TX; end end end - S_END: begin - cs_data <= 1'b1; - state <= is_write ? S_TRY_RX : S_TRY_TX; - end - default: begin state <= S_TRY_RX; - cs_data <= 1'b1; - miosi_output_enable_data <= 1'b0; end endcase end diff --git a/fw/stp.stp b/fw/stp.stp index 51d72bc..2dd927f 100644 --- a/fw/stp.stp +++ b/fw/stp.stp @@ -6,1004 +6,719 @@ - + - + - + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - 'n64_soc:n64_soc_inst|n64_sdram:n64_sdram_inst|memory_sdram:memory_sdram_inst|request' == rising edge + 'cpu_soc:cpu_soc_inst|cpu_usb:cpu_usb_inst|usb_ft1248:usb_ft1248_inst|intel_fifo_8:fifo_8_rx_inst|full' == rising edge @@ -1019,8 +734,8 @@ trigger;]]> - - + 1111111111111111111111111111111111 + 1111111111111111111111111111111111 @@ -1039,8 +754,8 @@ trigger;]]> - 1111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000000100001110001010010000000000000000000111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000000010000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100000001000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000000100001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000000010000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100000001000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000000100001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000000010000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100001110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110000111001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000011100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100010110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110001011001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000101100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100010110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110001011001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000101100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100010110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110001011001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100011000101100110000010000001011100011111111111111110000011100010100101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110001100010110011000001000000101110001111111111111111000001110001010010100010001100001110011000001000000101111111111111111111000010000000111000101001000000000000000010111111111111111111000110001011001100000100000010111000111111111111111100000111000101001010001000110000111001100000100000010111111111111111111100001000000011100010100100000000000000001011111111111111111100101010101100110000010000001001100011111111111111111010101000001001101000100011000011100110000010000001011111111111111111110000100000001110001010010000000000000000101111111111111111110010101010110011000001000000100110001111111111111111101010100000100110100010010101010110011000001000000100111111111111111111100010000101010000010011000000000000000010111111111111111111001010101011001100000100000010011000111111111111111110101010000010011010001001010101011001100000100000010011111111111111111111000000010101000001001100110101010110001001111111111111111100101010101100110000010000001001100011111111111111111010101000001001101000100101010101100110000010000001001111111111111111111100000001010100000100110000000000000000101111111111111111110010101010110011000001000000100110001111111111111111101010100000100110100010010101010110011000001000000100111111111111111111110000000101010000010011000000000000000010111111111111111111001010101011001100000100000010011000111111111111111110101010000010011010001001010101011001100000100000010011111111111111111110100000010101000001001100000000000000001011111111111111111100101010101100110000010000001001100011111111111111111010101000001001101000100101010101100110000010000001001111111111111111111001000001010100000100110000000010011100001111111111111111110010101010110011000001000000100110001111111111111111101010100000100110100010010101010110011000001000000100111111111111111111100100000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000111111111111111110101010000010011010001001010101011001100000100000010011111111111111111110010000010101000001001100000000000000001011000101111101000010101010101100110000010000001001100000010111110100001010101000001001101000110101010101100110000010000001001100010111110100001001000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101100110000010000001001100000010111110100000010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010110011000001000000100110000001011111010000001010100000100110100010010101010110011000001000000100110001011111010000001000000101010000010011000000000000000010110001011111010000001010101011001100000100000010011000000101111101000000101010000010011010001001010101011001100000100000010011000101111101000000100000010101000001001100000000000000001011000101111101000000101010101110110000010000001001100000010111110100001010101000001001101000100101010101100110000010000001001100010111110100000010000001010100000100110000000000000000101100010111110100000010101010111011000001000000100110000001011111010000101010100000100110100010010101010111011000001000000100110001011111010000101000000101010000010011000000000000000010110001011111010000001010101011101100000100000010011000000101111101000010101010000010011010001001010101011101100000100000010011000101111101000010010000010101000001001101000000100111000011000101111101000000101010101110110000010000001001100000010111110100001010101000001001101000100101010101110110000010000001001100010111110100001001000001010100000100110000000000000000101111011110000000000010101010111011000001000000100110000001011111010000101010100000100110100010010101010111011000001000000100110001011111010000100100000101010000010011000000000000000010111101111000000000101010101011101100000100000010011000110111100000000010101010000010011010001101010101011101100000100000010011110111100000000010010000010101000001001100000000000000001011110111100000000000101010101110110000010000001001100011011110000000000010101000001001101000100101010101110110000010000001001111011110000000000010000001010100000100110000000000000000101111011110000000000010101010111011000001000000100110001101111000000000001010100000100110100010010101010111011000001000000100111101111000000000001000000101010000010011000000000000000010111101111000000000001010101011101100000100000010011000110111100000000000101010000010011010001001010101011101100000100000010011110111100000000000100000010101000001001100000000000000001011110111100000000000101010101110110000010000001001100011011110000000000010101000001001101000100101010101110110000010000001001111011110000000000010000001010100000100110000000000000000101111011110000000000010101010111011000001000000100110001101111000000000001010100000100110100010010101010111011000001000000100111101111000000000001000000101010000010011000000000000000010111101111000000000001010101011101100000100000010011000110111100000000000101010000010011010001001010101011101100000100000010011110111100000000000100000010101000001001100000000000000001011110111100000000000101010101110110000010000001001100011011110000000000010101000001001101000100101010101110110000010000001001111011110000000000010000001010100000100110000000000000000101111011110000000000010101010111011000001000000100110001101111000000000001010100000100110100010010101010111011000001000000100111101111000000000001000000101010000010011000000000000000010111101111000000000001010101011101100000100000010011000110111100000000000101010000010011010001001010101011101100000100000010011110111100000000000100000010101000001001100000000000000001011110111100000000000101010101110110000010000001001100011011110000000000010101000001001101000100101010101110110000010000001001111011110000000000010000001010100000100110000000000000000101111011110000000000010101010111011000001000000100110001101111000000000001010100000100110100010010101010111011000001000000100111101111000000000001000000101010000010011000000000000000010111101111000000000001010101011101100000100000010011000110111100000000000101010000010011010001001010101011101100000100000010011110111100000000000100000010101000001001100000000000000001011110111100000000000101010101110110000010000001001100011011110000000000010101000001001101000100101010101110110000010000001001111011110000000000010000001010100000100110000000000000000101111011110000000000010101010111011000001000000100110001101111000000000001010100000100110100010010101010111011000001000000100111101111000000000001000000101010000010011000000000000000010111101111000000000001010101011101100000100000010011000110111100000000000101010000010011010001001010101011101100000100000010011110111100000000000100000010101000001001100000000000000001011110111100000000000101010101110110000010000001001100011011110000000000010101000001001101000100101010101110110000010000001001111011110000000000010000001010100000100110000000000000000101111011110000000000010101010111011000001000000100110001101111000000000001010100000100110100010010101010111011000001000000100111101111000000000001000000101010000010011000000000000000010111101111000000000001010101011101100000100000010011000110111100000000000101010000010011010001001010101011101100000100000010011110111100000000000100000010101000001001100000000000000001011110111100000000000101010101110110000010000001001100011011110000000000010101000001001101000100101010101110110000010000001001111011110000000000010000001010100000100110000000000000000101111011110000000000010101010111011000001000000100110001101111000000000001010100000100110100010010101010111011000001000000100111101111000000000001000000101010000010011000000000000000010111101111000000000001010101011101100000100000010011000110111100000000000101010000010011010001001010101011101100000100000010011110111100000000000100000010101000001001100000000000000001011110111100000000000101010101110110000010000001001100011011110000000000010101000001001101000100101010101110110000010000001001111011110000000000010000001010100000100110000000000000000101111011110000000000010101010111011000001000000100110001101111000000000001010100000100110100010010101010111011000001000000100111101111000000000001000000101010000010011000000000000000010111101111000000000001010101011101100000100000010011000110111100000000000101010000010011010001001010101011101100000100000010011110111100000000000100000010101000001001100000000000000001011110111100000000000101010101110110000010000001001100011011110000000000010101000001001101000100101010101110110000010000001001111011110000000000010000001010100000100110000000000000000101111011110000000000010101010111011000001000000100110001101111000000000001010100000100110100010010101010111011000001000000100111101111000000000001000000101010000010011000000000000000010111101111000000000001010101011101100000100000010011000110111100000000000101010000010011010001001010101011101100000100000010011110111100000000000100000010101000001001100000000000000001011110111100000000000101010101110110000010000001001100011011110000000000010101000001001101000100101010101110110000010000001001111011110000000000010000001010100000100110000000000000000101111011110000000000010101010111011000001000000100110001101111000000000001010100000100110100010010101010111011000001000000100111101111000000000001000000101010000010011000000000000000010111101111000000000001010101011101100000100000010011000110111100000000000101010000010011010001001010101011101100000100000010011110111100000000000100000010101000001001100000000000000001011110111100000000000101010101110110000010000001001100011011110000000000010101000001001101000100101010101110110000010000001001111011110000000000010000001010100000100110000000000000000101111011110000000000010101010110011000001010000100110001101111000000000100010111110100000100010010101010111011000001000000100111101111000000000001000000101010000010011000000000000000010111101111000000000001010101011001100000101000010011000110111100000000010001011111010000010001001010101011001100000101000010011110111100000000010100000000101111101000000000000000000001011110111100000000000101010101100110000010100001001100011011110000000001000101111101000001000100101010101100110000010100001001111011110000000001001000000010111110100000000010010011100001111011110000000000010101010110011000001010000100110001101111000000000100010111110100000100010010101010110011000001010000100111101111000000000100100000001011111010000000000000000000010110000100000000010001010101011001100000101000010011000110111100000000010001011111010000010001001010101011001100000101000010011110111100000000010010000000101111101000000000000000000001011000010000000001010101010101100110000010100001001100000001000000000101000101111101000001000110101010101100110000010100001001100001000000000101001000000010111110100000000000000000000101100001000000000100010101010110011000001010000100110000000100000000010000010111110100000100010010101010110011000001010000100110000100000000010001000000001011111010000000000000000000010110000100000000010001010101011001100000101000010011000000010000000001000001011111010000010001001010101011001100000101000010011000010000000001000100000000101111101000000000000000000001011000010000000001000101010101100110000010100001001100000001000000000100000101111101000001000100101010101100110000010100001001100001000000000100010000000010111110100000000000000000000101100001000000000100010101010110011000001010000100110000000100000000010000010111110100000100010010101010110011000001010000100110000100000000010001000000001011111010000000000000000000010110000100000000010001010101011001100000101000010011000000010000000001000001011111010000010001001010101011001100000101000010011000010000000001000100000000101111101000000000000000000001011000010000000001000101010101100110000010100001001100000001000000000100000101111101000001000100101010101100110000010100001001100001000000000100010000000010111110100000000000000000000101100001000000000100010101010110011000001010000100110000000100000000010000010111110100000100010010101010110011000001010000100110000100000000010001000000001011111010000000000000000000010110000100000000010001010101011001100000101000010011000000010000000001000001011111010000010001001010101011001100000101000010011000010000000001000100000000101111101000000000000000000001011000010000000001000101010101100110000010100001001100000001000000000100000101111101000001000100101010101100110000010100001001100001000000000100010000000010111110100000000000000000000101100001000000000100010101010110011000001010000100110000000100000000010000010111110100000100010010101010110011000001010000100110000100000000010001000000001011111010000000000000000000010110000100000000010001010101011001100000101000010011000000010000000001000001011111010000010001001010101011001100000101000010011000010000000001000100000000101111101000000000000000000001011000010000000001000101010101100110000010100001001100000001000000000100000101111101000001000100101010101100110000010100001001100001000000000100010000000010111110100000000000000000000101100001000000000100010101010110011000001010000100110000000100000000010000010111110100000100010010101010110011000001010000100110000100000000010001000000001011111010000000000000000000010110000100000000010001010101011001100000101000010011000000010000000001000001011111010000010001001010101011001100000101000010011000010000000001000100000000101111101000000000000000000001011000010000000001000101010101100110000010100001001100000001000000000100000101111101000001000100101010101100110000010100001001100001000000000100010000000010111110100000000000000000000101100001000000000100010101010110011000001010000100110000000100000000010000010111110100000100010010101010110011000001010000100110000100000000010001000000001011111010000000000000000000010110000100000000010001010101011001100000101000010011000000010000000001000001011111010000010001001010101011001100000101000010011000010000000001000100000000101111101000000000000000000001011000010000000001000101010101100110000010100001001100000001000000000100000101111101000001000100101010101100110000010100001001100001000000000100010000000010111110100000000000000000000101100001000000000100010101010110011000001010000100110000000100000000010000010111110100000100010010101010110011000001010000100110000100000000010001000000001011111010000000000000000000010110000100000000010001010101011001100000101000010011000000010000000001000001011111010000010001001010101011001100000101000010011000010000000001000100000000101111101000000000000000000001011000010000000001000101010101100110000010100001001100000001000000000100000101111101000001000100101010101100110000010100001001100001000000000100010000000010111110100000000000000000000101100001000000000100010101010110011000001010000100110000000100000000010000010111110100000100010010101010110011000001010000100110000100000000010001000000001011111010000000000000000000010110000100000000010001010101011001100000101000010011000000010000000001000001011111010000010001001010101011001100000101000010011000010000000001000100000000101111101000000000000000000001011000010000000001000101010101100110000010100001001100000001000000000100000101111101000001000100101010101100110000010100001001100001000000000100010000000010111110100000000000000000000101100001000000000100010101010110011000001010000100110000000100000000010000010111110100000100010010101010110011000001010000100110000100000000010001000000001011111010000000000000000000010110000100000000010001010101011001100000101000010011000000010000000001000001011111010000010001001010101011001100000101000010011000010000000001000100000000101111101000000000000000000001011000010000000001000101010101100110000010100001001100000001000000000100000101111101000001000100101010101100110000010100001001100001000000000100010000000010111110100000000000000000000101100001000000000100010101010110011000001010000100110000000100000000010000010111110100000100010010101010110011000001010000100110000100000000010001000000001011111010000000000000000000010110000100000000010001010101011001100000101000010011000000010000000001000001011111010000010001001010101011001100000101000010011000010000000001000100000000101111101000000000000000000001011000010000000001000101010101100110000010100001001100000001000000000100000101111101000001000100101010101100110000010100001001100001000000000100010000000010111110100000000000000000000101100001000000000100010101010110011000001010000100110000000100000000010000010111110100000100010010101010110011000001010000100110000100000000010001000000001011111010000000000000000000010110000100000000010001010101011101100000101000010011000000010000000001011101111000000000010001001010101011001100000101000010011000010000000001000100000000101111101000000000000000000001011000010000000001000101010101110110000010100001001100000001000000000101110111100000000001000100101010101110110000010100001001100001000000000101010000011011110000000000000000000000000101100001000000000100010101010111011000001010000100110000000100000000010111011110000000000100010010101010111011000001010000100110000100000000010100100001101111000000000010001001001110000110000100000000010001010101011101100000101000010011000000010000000001011101111000000000010001001010101011101100000101000010011000010000000001010010000110111100000000000000000000000001011100100100011010000101010101110110000010100001001100000001000000000101110111100000000001000100101010101110110000010100001001100001000000000101001000011011110000000000000000000000000101110010010001101001010101010111011000001010000100110001001001000110100111011110000000000100011010101010111011000001010000100111001001000110100100100001101111000000000000000000000000010111001001000110100001010101011101100000101000010011000100100100011010001101111000000000010001001010101011101100000101000010011100100100011010000100000110111100000000000000000000000001011100100100011010000101010101110110000010100001001100010010010001101000110111100000000001000100101010101110110000010100001001110010010001101000010000011011110000000000000000000000000101110010010001101000010101010111011000001010000100110001001001000110100011011110000000000100010010101010111011000001010000100111001001000110100001000001101111000000000000000000000000010111001001000110100001010101011101100000101000010011000100100100011010001101111000000000010001001010101011101100000101000010011100100100011010000100000110111100000000000000000000000001011100100100011010000101010101110110000010100001001100010010010001101000110111100000000001000100101010101110110000010100001001110010010001101000010000011011110000000000000000000000000101110010010001101000010101010111011000001010000100110001001001000110100011011110000000000100010010101010111011000001010000100111001001000110100001000001101111000000000000000000000000010111001001000110100001010101011101100000101000010011000100100100011010001101111000000000010001001010101011101100000101000010011100100100011010000100000110111100000000000000000000000001011100100100011010000101010101110110000010100001001100010010010001101000110111100000000001000100101010101110110000010100001001110010010001101000010000011011110000000000000000000000000101110010010001101000010101010111011000001010000100110001001001000110100011011110000000000100010010101010111011000001010000100111001001000110100001000001101111000000000000000000000000010111001001000110100001010101011101100000101000010011000100100100011010001101111000000000010001001010101011101100000101000010011100100100011010000100000110111100000000000000000000000001011100100100011010000101010101110110000010100001001100010010010001101000110111100000000001000100101010101110110000010100001001110010010001101000010000011011110000000000000000000000000101110010010001101000010101010111011000001010000100110001001001000110100011011110000000000100010010101010111011000001010000100111001001000110100001000001101111000000000000000000000000010111001001000110100001010101011101100000101000010011000100100100011010001101111000000000010001001010101011101100000101000010011100100100011010000100000110111100000000000000000000000001011100100100011010000101010101110110000010100001001100010010010001101000110111100000000001000100101010101110110000010100001001110010010001101000010000011011110000000000000000000000000101110010010001101000010101010111011000001010000100110001001001000110100011011110000000000100010010101010111011000001010000100111001001000110100001000001101111000000000000000000000000010111001001000110100001010101011101100000101000010011000100100100011010001101111000000000010001001010101011101100000101000010011100100100011010000100000110111100000000000000000000000001011100100100011010000101010101110110000010100001001100010010010001101000110111100000000001000100101010101110110000010100001001110010010001101000010000011011110000000000000000000000000101110010010001101000010101010111011000001010000100110001001001000110100011011110000000000100010010101010111011000001010000100111001001000110100001000001101111000000000000000000000000010111001001000110100001010101011101100000101000010011000100100100011010001101111000000000010001001010101011101100000101000010011100100100011010000100000110111100000000000000000000000001011100100100011010000101010101110110000010100001001100010010010001101000110111100000000001000100101010101110110000010100001001110010010001101000010000011011110000000000000000000000000101110010010001101000010101010111011000001010000100110001001001000110100011011110000000000100010010101010111011000001010000100111001001000110100001000001101111000000000000000000000000010111001001000110100001010101011101100000101000010011000100100100011010001101111000000000010001001010101011101100000101000010011100100100011010000100000110111100000000000000000000000001011100100100011010000101010101110110000010100001001100010010010001101000110111100000000001000100101010101110110000010100001001110010010001101000010000011011110000000000000000000000000101110010010001101000010101010111011000001010000100110001001001000110100011011110000000000100010010101010111011000001010000100111001001000110100001000001101111000000000000000000000000010111001001000110100001010101011101100000101000010011000100100100011010001101111000000000010001001010101011101100000101000010011100100100011010000100000110111100000000000000000000000001011100100100011010000101010101110110000010100001001100010010010001101000110111100000000001000100101010101110110000010100001001110010010001101000010000011011110000000000000000000000000101110010010001101000010101010111011000001010000100110001001001000110100011011110000000000100010010101010111011000001010000100111001001000110100001000001101111000000000000000000000000010111001001000110100001010101011101100000101000010011000100100100011010001101111000000000010001001010101011101100000101000010011100100100011010000100000110111100000000000000000000000001011100100100011010000101010101110110000010100001001100010010010001101000110111100000000001000100101010101110110000010100001001110010010001101000010000011011110000000000000000000000000101110010010001101000010101010111011000001010000100110001001001000110100011011110000000000100010010101010111011000001010000100111001001000110100001000001101111000000000000000000000000010111001001000110100001010101011101100000101000010011000100100100011010001101111000000000010001001010101011101100000101000010011100100100011010000100000110111100000000000000000000000001011100100100011010000101010101100110000010000101001100010010010001101001000010000000001001000100101010101110110000010100001001110010010001101000010000011011110000000000000000000000000101110010010001101000010101010110011000001000010100110001001001000110100100001000000000100100010010101010110011000001000010100111001001000110100101000000000100000000010000000000000000010111001001000110100001010101011001100000100001010011000100100100011010010000100000000010010001001010101011001100000100001010011100100100011010010010000000010000000001000000010100111000011100100100011010000101010101100110000010000101001100010010010001101001000010000000001001000100101010101100110000010000101001110010010001101001001000000001000000000100000000000000000101101111101000110010010101010110011000001000010100110001001001000110100100001000000000100100010010101010110011000001000010100111001001000110100100100000000100000000010000000000000000010110111110100011001101010101011001100000100001010011000011111010001100110000100000000010010001101010101011001100000100001010011011111010001100110010000000010000000001000000000000000001011011111010001100100101010101100110000010000101001100001111101000110010000010000000001001000100101010101100110000010000101001101111101000110010010000000001000000000100000000000000000101101111101000110010010101010110011000001000010100110000111110100011001000001000000000100100010010101010110011000001000010100110111110100011001001000000000100000000010000000000000000010110111110100011001001010101011001100000100001010011000011111010001100100000100000000010010001001010101011001100000100001010011011111010001100100100000000010000000001000000000000000001011011111010001100100101010101100110000010000101001100001111101000110010000010000000001001000100101010101100110000010000101001101111101000110010010000000001000000000100000000000000000101101111101000110010010101010110011000001000010100110000111110100011001000001000000000100100010010101010110011000001000010100110111110100011001001000000000100000000010000000000000000010110111110100011001001010101011001100000100001010011000011111010001100100000100000000010010001001010101011001100000100001010011011111010001100100100000000010000000001000000000000000001011011111010001100100101010101100110000010000101001100001111101000110010000010000000001001000100101010101100110000010000101001101111101000110010010000000001000000000100000000000000000101101111101000110010010101010110011000001000010100110000111110100011001000001000000000100100010010101010110011000001000010100110111110100011001001000000000100000000010000000000000000010110111110100011001001010101011001100000100001010011000011111010001100100000100000000010010001001010101011001100000100001010011011111010001100100100000000010000000001000000000000000001011011111010001100100101010101100110000010000101001100001111101000110010000010000000001001000100101010101100110000010000101001101111101000110010010000000001000000000100000000000000000101101111101000110010010101010110011000001000010100110000111110100011001000001000000000100100010010101010110011000001000010100110111110100011001001000000000100000000010000000000000000010110111110100011001001010101011001100000100001010011000011111010001100100000100000000010010001001010101011001100000100001010011011111010001100100100000000010000000001000000000000000001011011111010001100100101010101100110000010000101001100001111101000110010000010000000001001000100101010101100110000010000101001101111101000110010010000000001000000000100000000000000000101101111101000110010010101010110011000001000010100110000111110100011001000001000000000100100010010101010110011000001000010100110111110100011001001000000000100000000010000000000000000010110111110100011001001010101011001100000100001010011000011111010001100100000100000000010010001001010101011001100000100001010011011111010001100100100000000010000000001000000000000000001011011111010001100100101010101100110000010000101001100001111101000110010000010000000001001000100101010101100110000010000101001101111101000110010010000000001000000000100000000000000000101101111101000110010010101010110011000001000010100110000111110100011001000001000000000100100010010101010110011000001000010100110111110100011001001000000000100000000010000000000000000010110111110100011001001010101011001100000100001010011000011111010001100100000100000000010010001001010101011001100000100001010011011111010001100100100000000010000000001000000000000000001011011111010001100100101010101100110000010000101001100001111101000110010000010000000001001000100101010101100110000010000101001101111101000110010010000000001000000000100000000000000000101101111101000110010010101010110011000001000010100110000111110100011001000001000000000100100010010101010110011000001000010100110111110100011001001000000000100000000010000000000000000010110111110100011001001010101011001100000100001010011000011111010001100100000100000000010010001001010101011001100000100001010011011111010001100100100000000010000000001000000000000000001011011111010001100100101010101100110000010000101001100001111101000110010000010000000001001000100101010101100110000010000101001101111101000110010010000000001000000000100000000000000000101101111101000110010010101010110011000001000010100110000111110100011001000001000000000100100010010101010110011000001000010100110111110100011001001000000000100000000010000000000000000010110111110100011001001010101011001100000100001010011000011111010001100100000100000000010010001001010101011001100000100001010011011111010001100100100000000010000000001000000000000000001011011111010001100100101010101100110000010000101001100001111101000110010000010000000001001000100101010101100110000010000101001101111101000110010010000000001000000000100000000000000000101101111101000110010010101010110011000001000010100110000111110100011001000001000000000100100010010101010110011000001000010100110111110100011001001000000000100000000010000000000000000010110111110100011001001010101011001100000100001010011000011111010001100100000100000000010010001001010101011001100000100001010011011111010001100100100000000010000000001000000000000000001011011111010001100100101010101100110000010000101001100001111101000110010000010000000001001000100101010101100110000010000101001101111101000110010010000000001000000000100000000000000000101101111101000110010010101010110011000001000010100110000111110100011001000001000000000100100010010101010110011000001000010100110111110100011001001000000000100000000010000000000000000010110111110100011001001010101011001100000100001010011000011111010001100100000100000000010010001001010101011001100000100001010011011111010001100100100000000010000000001000000000000000001011011111010001100100101010101110110000010000101001100001111101000110011100100100011010001000100101010101100110000010000101001101111101000110010010000000001000000000100000000000000000101101111101000110010010101010111011000001000010100110000111110100011001110010010001101000100010010101010111011000001000010100110111110100011001101000001001001000110100000000000000000010110111110100011001001010101011101100000100001010011000011111010001100111001001000110100010001001010101011101100000100001010011011111010001100110010000100100100011010001000010100111000011011111010001100100101010101110110000010000101001100001111101000110011100100100011010001000100101010101110110000010000101001101111101000110011001000010010010001101000000000000000000101101001011011100100010101010111011000001000010100110000111110100011001110010010001101000100010010101010111011000001000010100110111110100011001100100001001001000110100000000000000000010110100101101110010101010101011101100000100001010011000010010110111001011001001000110100010001101010101011101100000100001010011010010110111001010010000100100100011010000000000000000001011010010110111001000101010101110110000010000101001100001001011011100100100100100011010001000100101010101110110000010000101001101001011011100100010000010010010001101000000000000000000101101001011011100100010101010111011000001000010100110000100101101110010010010010001101000100010010101010111011000001000010100110100101101110010001000001001001000110100000000000000000010110100101101110010001010101011101100000100001010011000010010110111001001001001000110100010001001010101011101100000100001010011010010110111001000100000100100100011010000000000000000001011010010110111001000101010101110110000010000101001100001001011011100100100100100011010001000100101010101110110000010000101001101001011011100100010000010010010001101000000000000000000101101001011011100100010101010111011000001000010100110000100101101110010010010010001101000100010010101010111011000001000010100110100101101110010001000001001001000110100000000000000000010110100101101110010001010101011101100000100001010011000010010110111001001001001000110100010001001010101011101100000100001010011010010110111001000100000100100100011010000000000000000001011010010110111001000101010101110110000010000101001100001001011011100100100100100011010001000100101010101110110000010000101001101001011011100100010000010010010001101000000000000000000101101001011011100100010101010111011000001000010100110000100101101110010010010010001101000100010010101010111011000001000010100110100101101110010001000001001001000110100000000000000000010110100101101110010001010101011101100000100001010011000010010110111001001001001000110100010001001010101011101100000100001010011010010110111001000100000100100100011010000000000000000001011010010110111001000101010101110110000010000101001100001001011011100100100100100011010001000100101010101110110000010000101001101001011011100100010000010010010001101000000000000000000101101001011011100100010101010111011000001000010100110000100101101110010010010010001101000100010010101010111011000001000010100110100101101110010001000001001001000110100000000000000000010110100101101110010001010101011101100000100001010011000010010110111001001001001000110100010001001010101011101100000100001010011010010110111001000100000100100100011010000000000000000001011010010110111001000101010101110110000010000101001100001001011011100100100100100011010001000100101010101110110000010000101001101001011011100100010000010010010001101000000000000000000101101001011011100100010101010111011000001000010100110000100101101110010010010010001101000100010010101010111011000001000010100110100101101110010001000001001001000110100000000000000000010110100101101110010001010101011101100000100001010011000010010110111001001001001000110100010001001010101011101100000100001010011010010110111001000100000100100100011010000000000000000001011010010110111001000101010101110110000010000101001100001001011011100100100100100011010001000100101010101110110000010000101001101001011011100100010000010010010001101000000000000000000101101001011011100100010101010111011000001000010100110000100101101110010010010010001101000100010010101010111011000001000010100110100101101110010001000001001001000110100000000000000000010110100101101110010001010101011101100000100001010011000010010110111001001001001000110100010001001010101011101100000100001010011010010110111001000100000100100100011010000000000000000001011010010110111001000101010101110110000010000101001100001001011011100100100100100011010001000100101010101110110000010000101001101001011011100100010000010010010001101000000000000000000101101001011011100100010101010111011000001000010100110000100101101110010010010010001101000100010010101010111011000001000010100110100101101110010001000001001001000110100000000000000000010110100101101110010001010101011101100000100001010011000010010110111001001001001000110100010001001010101011101100000100001010011010010110111001000100000100100100011010000000000000000001011010010110111001000101010101110110000010000101001100001001011011100100100100100011010001000100101010101110110000010000101001101001011011100100010000010010010001101000000000000000000101101001011011100100010101010111011000001000010100110000100101101110010010010010001101000100010010101010111011000001000010100110100101101110010001000001001001000110100000000000000000010110100101101110010001010101011101100000100001010011000010010110111001001001001000110100010001001010101011101100000100001010011010010110111001000100000100100100011010000000000000000001011010010110111001000101010101110110000010000101001100001001011011100100100100100011010001000100101010101110110000010000101001101001011011100100010000010010010001101000000000000000000101101001011011100100010101010111011000001000010100110000100101101110010010010010001101000100010010101010111011000001000010100110100101101110010001000001001001000110100000000000000000010110100101101110010001010101011101100000100001010011000010010110111001001001001000110100010001001010101011101100000100001010011010010110111001000100000100100100011010000000000000000001011010010110111001000101010101110110000010000101001100001001011011100100100100100011010001000100101010101110110000010000101001101001011011100100010000010010010001101000000000000000000101101001011011100100010101010111011000001000010100110000100101101110010010010010001101000100010010101010111011000001000010100110100101101110010001000001001001000110100000000000000000010110100101101110010001010101011101100000100001010011000010010110111001001001001000110100010001001010101011101100000100001010011010010110111001000100000100100100011010000000000000000001011010010110111001000101010101110110000010000101001100001001011011100100100100100011010001000100101010101110110000010000101001101001011011100100010000010010010001101000000000000000000101101001011011100100010101010110011000001010010100110000100101101110010101111101000110010100010010101010111011000001000010100110100101101110010001000001001001000110100000000000000000010110100101101110010001010101011001100000101001010011000010010110111001010111110100011001010001001010101011001100000101001010011010010110111001010100000011111010001100100000000000000001011010010110111001000101010101100110000010100101001100001001011011100101011111010001100101000100101010101100110000010100101001101001011011100101001000001111101000110010000011010011100001101001011011100100010101010110011000001010010100110000100101101110010101111101000110010100010010101010110011000001010010100110100101101110010100100000111110100011001000000000000000010110001100011010101001010101011001100000101001010011000010010110111001010111110100011001010001001010101011001100000101001010011010010110111001010010000011111010001100100000000000000001011000110001101010110101010101100110000010100101001100000011000110101011011111010001100101000110101010101100110000010100101001100011000110101011001000001111101000110010000000000000000101100011000110101010010101010110011000001010010100110000001100011010101001111101000110010100010010101010110011000001010010100110001100011010101001000000111110100011001000000000000000010110001100011010101001010101011001100000101001010011000000110001101010100111110100011001010001001010101011001100000101001010011000110001101010100100000011111010001100100000000000000001011000110001101010100101010101100110000010100101001100000011000110101010011111010001100101000100101010101100110000010100101001100011000110101010010000001111101000110010000000000000000101100011000110101010010101010110011000001010010100110000001100011010101001111101000110010100010010101010110011000001010010100110001100011010101001000000111110100011001000000000000000010110001100011010101001010101011001100000101001010011000000110001101010100111110100011001010001001010101011001100000101001010011000110001101010100100000011111010001100100000000000000001011000110001101010100101010101100110000010100101001100000011000110101010011111010001100101000100101010101100110000010100101001100011000110101010010000001111101000110010000000000000000101100011000110101010010101010110011000001010010100110000001100011010101001111101000110010100010010101010110011000001010010100110001100011010101001000000111110100011001000000000000000010110001100011010101001010101011001100000101001010011000000110001101010100111110100011001010001001010101011001100000101001010011000110001101010100100000011111010001100100000000000000001011000110001101010100101010101100110000010100101001100000011000110101010011111010001100101000100101010101100110000010100101001100011000110101010010000001111101000110010000000000000000101100011000110101010010101010110011000001010010100110000001100011010101001111101000110010100010010101010110011000001010010100110001100011010101001000000111110100011001000000000000000010110001100011010101001010101011001100000101001010011000000110001101010100111110100011001010001001010101011001100000101001010011000110001101010100100000011111010001100100000000000000001011000110001101010100101010101100110000010100101001100000011000110101010011111010001100101000100101010101100110000010100101001100011000110101010010000001111101000110010000000000000000101100011000110101010010101010110011000001010010100110000001100011010101001111101000110010100010010101010110011000001010010100110001100011010101001000000111110100011001000000000000000010110001100011010101001010101011001100000101001010011000000110001101010100111110100011001010001001010101011001100000101001010011000110001101010100100000011111010001100100000000000000001011000110001101010100101010101100110000010100101001100000011000110101010011111010001100101000100101010101100110000010100101001100011000110101010010000001111101000110010000000000000000101100011000110101010010101010110011000001010010100110000001100011010101001111101000110010100010010101010110011000001010010100110001100011010101001000000111110100011001000000000000000010110001100011010101001010101011001100000101001010011000000110001101010100111110100011001010001001010101011001100000101001010011000110001101010100100000011111010001100100000000000000001011000110001101010100101010101100110000010100101001100000011000110101010011111010001100101000100101010101100110000010100101001100011000110101010010000001111101000110010000000000000000101100011000110101010010101010110011000001010010100110000001100011010101001111101000110010100010010101010110011000001010010100110001100011010101001000000111110100011001000000000000000010110001100011010101001010101011001100000101001010011000000110001101010100111110100011001010001001010101011001100000101001010011000110001101010100100000011111010001100100000000000000001011000110001101010100101010101100110000010100101001100000011000110101010011111010001100101000100101010101100110000010100101001100011000110101010010000001111101000110010000000000000000101100011000110101010010101010110011000001010010100110000001100011010101001111101000110010100010010101010110011000001010010100110001100011010101001000000111110100011001000000000000000010110001100011010101001010101011001100000101001010011000000110001101010100111110100011001010001001010101011001100000101001010011000110001101010100100000011111010001100100000000000000001011000110001101010100101010101100110000010100101001100000011000110101010011111010001100101000100101010101100110000010100101001100011000110101010010000001111101000110010000000000000000101100011000110101010010101010110011000001010010100110000001100011010101001111101000110010100010010101010110011000001010010100110001100011010101001000000111110100011001000000000000000010110001100011010101001010101011001100000101001010011000000110001101010100111110100011001010001001010101011001100000101001010011000110001101010100100000011111010001100100000000000000001011000110001101010100101010101100110000010100101001100000011000110101010011111010001100101000100101010101100110000010100101001100011000110101010010000001111101000110010000000000000000101100011000110101010010101010110011000001010010100110000001100011010101001111101000110010100010010101010110011000001010010100110001100011010101001000000111110100011001000000000000000010110001100011010101001010101011001100000101001010011000000110001101010100111110100011001010001001010101011001100000101001010011000110001101010100100000011111010001100100000000000000001011000110001101010100101010101100110000010100101001100000011000110101010011111010001100101000100101010101100110000010100101001100011000110101010010000001111101000110010000000000000000101100011000110101010010101010110011000001010010100110000001100011010101001111101000110010100010010101010110011000001010010100110001100011010101001000000111110100011001000000000000000010110001100011010101001010101011101100000101001010011000000110001101010110100101101110010010001001010101011001100000101001010011000110001101010100100000011111010001100100000000000000001011000110001101010100101010101110110000010100101001100000011000110101011010010110111001001000100101010101110110000010100101001100011000110101011010000001001011011100100000000000000000101100011000110101010010101010111011000001010010100110000001100011010101101001011011100100100010010101010111011000001010010100110001100011010101100100000100101101110010010001101001110000110001100011010101001010101011101100000101001010011000000110001101010110100101101110010010001001010101011101100000101001010011000110001101010110010000010010110111001000000000000000001011111000000011010000101010101110110000010100101001100000011000110101011010010110111001001000100101010101110110000010100101001100011000110101011001000001001011011100100000000000000000101111100000001101001010101010111011000001010010100110001110000000110100101001011011100100100011010101010111011000001010010100111110000000110100100100000100101101110010000000000000000010111110000000110100001010101011101100000101001010011000111000000011010000100101101110010010001001010101011101100000101001010011111000000011010000100000010010110111001000000000000000001011111000000011010000101010101110110000010100101001100011100000001101000010010110111001001000100101010101110110000010100101001111100000001101000010000001001011011100100000000000000000101111100000001101000010101010111011000001010010100110001110000000110100001001011011100100100010010101010111011000001010010100111110000000110100001000000100101101110010000000000000000010111110000000110100001010101011101100000101001010011000111000000011010000100101101110010010001001010101011101100000101001010011111000000011010000100000010010110111001000000000000000001011111000000011010000101010101110110000010100101001100011100000001101000010010110111001001000100101010101110110000010100101001111100000001101000010000001001011011100100000000000000000101111100000001101000010101010111011000001010010100110001110000000110100001001011011100100100010010101010111011000001010010100111110000000110100001000000100101101110010000000000000000010111110000000110100001010101011101100000101001010011000111000000011010000100101101110010010001001010101011101100000101001010011111000000011010000100000010010110111001000000000000000001011111000000011010000101010101110110000010100101001100011100000001101000010010110111001001000100101010101110110000010100101001111100000001101000010000001001011011100100000000000000000101111100000001101000010101010111011000001010010100110001110000000110100001001011011100100100010010101010111011000001010010100111110000000110100001000000100101101110010000000000000000010111110000000110100001010101011101100000101001010011000111000000011010000100101101110010010001001010101011101100000101001010011111000000011010000100000010010110111001000000000000000001011111000000011010000101010101110110000010100101001100011100000001101000010010110111001001000100101010101110110000010100101001111100000001101000010000001001011011100100000000000000000101111100000001101000010101010111011000001010010100110001110000000110100001001011011100100100010010101010111011000001010010100111110000000110100001000000100101101110010000000000000000010111110000000110100001010101011101100000101001010011000111000000011010000100101101110010010001001010101011101100000101001010011111000000011010000100000010010110111001000000000000000001011111000000011010000101010101110110000010100101001100011100000001101000010010110111001001000100101010101110110000010100101001111100000001101000010000001001011011100100000000000000000101111100000001101000010101010111011000001010010100110001110000000110100001001011011100100100010010101010111011000001010010100111110000000110100001000000100101101110010000000000000000010111110000000110100001010101011101100000101001010011000111000000011010000100101101110010010001001010101011101100000101001010011111000000011010000100000010010110111001000000000000000001011111000000011010000101010101110110000010100101001100011100000001101000010010110111001001000100101010101110110000010100101001111100000001101000010000001001011011100100000000000000000101111100000001101000010101010111011000001010010100110001110000000110100001001011011100100100010010101010111011000001010010100111110000000110100001000000100101101110010000000000000000010111110000000110100001010101011101100000101001010011000111000000011010000100101101110010010001001010101011101100000101001010011111000000011010000100000010010110111001000000000000000001011111000000011010000101010101110110000010100101001100011100000001101000010010110111001001000100101010101110110000010100101001111100000001101000010000001001011011100100000000000000000101111100000001101000010101010111011000001010010100110001110000000110100001001011011100100100010010101010111011000001010010100111110000000110100001000000100101101110010000000000000000010111110000000110100001010101011101100000101001010011000111000000011010000100101101110010010001001010101011101100000101001010011111000000011010000100000010010110111001000000000000000001011111000000011010000101010101110110000010100101001100011100000001101000010010110111001001000100101010101110110000010100101001111100000001101000010000001001011011100100000000000000000101111100000001101000010101010111011000001010010100110001110000000110100001001011011100100100010010101010111011000001010010100111110000000110100001000000100101101110010000000000000000010111110000000110100001010101011101100000101001010011000111000000011010000100101101110010010001001010101011101100000101001010011111000000011010000100000010010110111001000000000000000001011111000000011010000101010101110110000010100101001100011100000001101000010010110111001001000100101010101110110000010100101001111100000001101000010000001001011011100100000000000000000101111100000001101000010101010111011000001010010100110001110000000110100001001011011100100100010010101010111011000001010010100111110000000110100001000000100101101110010000000000000000010111110000000110100001010101011101100000101001010011000111000000011010000100101101110010010001001010101011101100000101001010011111000000011010000100000010010110111001000000000000000001011111000000011010000101010101110110000010100101001100011100000001101000010010110111001001000100101010101110110000010100101001111100000001101000010000001001011011100100000000000000000101111100000001101000010101010111011000001010010100110001110000000110100001001011011100100100010010101010111011000001010010100111110000000110100001000000100101101110010000000000000000010111110000000110100001010101011101100000101001010011000111000000011010000100101101110010010001001010101011101100000101001010011111000000011010000100000010010110111001000000000000000001011111000000011010000101010101100110000010000011001100011100000001101001000110001101010101000100101010101110110000010100101001111100000001101000010000001001011011100100000000000000000101111100000001101000010101010110011000001000001100110001110000000110100100011000110101010100010010101010110011000001000001100111110000000110100101000000001100011010101000000000000000010111110000000110100001010101011001100000100000110011000111000000011010010001100011010101010001001010101011001100000100000110011111000000011010010010000000110001101010100000001100111000011111000000011010000101010101100110000010000011001100011100000001101001000110001101010101000100101010101100110000010000011001111100000001101001001000000011000110101010000000000000000101101100001001111110010101010110011000001000001100110001110000000110100100011000110101010100010010101010110011000001000001100111110000000110100100100000001100011010101000000000000000010110110000100111111101010101011001100000100000110011000011000010011111110001100011010101010001101010101011001100000100000110011011000010011111110010000000110001101010100000000000000001011011000010011111100101010101100110000010000011001100001100001001111110000110001101010101000100101010101100110000010000011001101100001001111110010000000011000110101010000000000000000101101100001001111110010101010110011000001000001100110000110000100111111000011000110101010100010010101010110011000001000001100110110000100111111001000000001100011010101000000000000000010110110000100111111001010101011001100000100000110011000011000010011111100001100011010101010001001010101011001100000100000110011011000010011111100100000000110001101010100000000000000001011011000010011111100101010101100110000010000011001100001100001001111110000110001101010101000100101010101100110000010000011001101100001001111110010000000011000110101010000000000000000101101100001001111110010101010110011000001000001100110000110000100111111000011000110101010100010010101010110011000001000001100110110000100111111001000000001100011010101000000000000000010110110000100111111001010101011001100000100000110011000011000010011111100001100011010101010001001010101011001100000100000110011011000010011111100100000000110001101010100000000000000001011011000010011111100101010101100110000010000011001100001100001001111110000110001101010101000100101010101100110000010000011001101100001001111110010000000011000110101010000000000000000101101100001001111110010101010110011000001000001100110000110000100111111000011000110101010100010010101010110011000001000001100110110000100111111001000000001100011010101000000000000000010110110000100111111001010101011001100000100000110011000011000010011111100001100011010101010001001010101011001100000100000110011011000010011111100100000000110001101010100000000000000001011011000010011111100101010101100110000010000011001100001100001001111110000110001101010101000100101010101100110000010000011001101100001001111110010000000011000110101010000000000000000101101100001001111110010101010110011000001000001100110000110000100111111000011000110101010100010010101010110011000001000001100110110000100111111001000000001100011010101000000000000000010110110000100111111001010101011001100000100000110011000011000010011111100001100011010101010001001010101011001100000100000110011011000010011111100100000000110001101010100000000000000001011011000010011111100101010101100110000010000011001100001100001001111110000110001101010101000100101010101100110000010000011001101100001001111110010000000011000110101010000000000000000101101100001001111110010101010110011000001000001100110000110000100111111000011000110101010100010010101010110011000001000001100110110000100111111001000000001100011010101000000000000000010110110000100111111001010101011001100000100000110011000011000010011111100001100011010101010001001010101011001100000100000110011011000010011111100100000000110001101010100000000000000001011011000010011111100101010101100110000010000011001100001100001001111110000110001101010101000100101010101100110000010000011001101100001001111110010000000011000110101010000000000000000101101100001001111110010101010110011000001000001100110000110000100111111000011000110101010100010010101010110011000001000001100110110000100111111001000000001100011010101000000000000000010110110000100111111001010101011001100000100000110011000011000010011111100001100011010101010001001010101011001100000100000110011011000010011111100100000000110001101010100000000000000001011011000010011111100101010101100110000010000011001100001100001001111110000110001101010101000100101010101100110000010000011001101100001001111110010000000011000110101010000000000000000101101100001001111110010101010110011000001000001100110000110000100111111000011000110101010100010010101010110011000001000001100110110000100111111001000000001100011010101000000000000000010110110000100111111001010101011001100000100000110011000011000010011111100001100011010101010001001010101011001100000100000110011011000010011111100100000000110001101010100000000000000001011011000010011111100101010101100110000010000011001100001100001001111110000110001101010101000100101010101100110000010000011001101100001001111110010000000011000110101010000000000000000101101100001001111110010101010110011000001000001100110000110000100111111000011000110101010100010010101010110011000001000001100110110000100111111001000000001100011010101000000000000000010110110000100111111001010101011001100000100000110011000011000010011111100001100011010101010001001010101011001100000100000110011011000010011111100100000000110001101010100000000000000001011011000010011111100101010101100110000010000011001100001100001001111110000110001101010101000100101010101100110000010000011001101100001001111110010000000011000110101010000000000000000101101100001001111110010101010110011000001000001100110000110000100111111000011000110101010100010010101010110011000001000001100110110000100111111001000000001100011010101000000000000000010110110000100111111001010101011001100000100000110011000011000010011111100001100011010101010001001010101011001100000100000110011011000010011111100100000000110001101010100000000000000001011011000010011111100101010101100110000010000011001100001100001001111110000110001101010101000100101010101100110000010000011001101100001001111110010000000011000110101010000000000000000101101100001001111110010101010110011000001000001100110000110000100111111000011000110101010100010010101010110011000001000001100110110000100111111001000000001100011010101000000000000000010110110000100111111001010101011001100000100000110011000011000010011111100001100011010101010001001010101011001100000100000110011011000010011111100100000000110001101010100000000000000001011011000010011111100101010101100110000010000011001100001100001001111110000110001101010101000100101010101100110000010000011001101100001001111110010000000011000110101010000000000000000101101100001001111110010101010111011000001000001100110000110000100111111111100000001101000100010010101010110011000001000001100110110000100111111001000000001100011010101000000000000000010110110000100111111001010101011101100000100000110011000011000010011111111110000000110100010001001010101011101100000100000110011011000010011111110100000111000000011010000000000000000001011011000010011111100101010101110110000010000011001100001100001001111111111000000011010001000100101010101110110000010000011001101100001001111111001000011100000001101000100000110011100001101100001001111110010101010111011000001000001100110000110000100111111111100000001101000100010010101010111011000001000001100110110000100111111100100001110000000110100000000000000000010110111000000110011001010101011101100000100000110011000011000010011111111110000000110100010001001010101011101100000100000110011011000010011111110010000111000000011010000000000000000001011011100000011001110101010101110110000010000011001100001110000001100111111000000011010001000110101010101110110000010000011001101110000001100111001000011100000001101000000000000000000101101110000001100110010101010111011000001000001100110000111000000110011011100000001101000100010010101010111011000001000001100110111000000110011001000001110000000110100000000000000000010110111000000110011001010101011101100000100000110011000011100000011001101110000000110100010001001010101011101100000100000110011011100000011001100100000111000000011010000000000000000001011011100000011001100101010101110110000010000011001100001110000001100110111000000011010001000100101010101110110000010000011001101110000001100110010000011100000001101000000000000000000101101110000001100110010101010111011000001000001100110000111000000110011011100000001101000100010010101010111011000001000001100110111000000110011001000001110000000110100000000000000000010110111000000110011001010101011101100000100000110011000011100000011001101110000000110100010001001010101011101100000100000110011011100000011001100100000111000000011010000000000000000001011011100000011001100101010101110110000010000011001100001110000001100110111000000011010001000100101010101110110000010000011001101110000001100110010000011100000001101000000000000000000101101110000001100110010101010111011000001000001100110000111000000110011011100000001101000100010010101010111011000001000001100110111000000110011001000001110000000110100000000000000000010110111000000110011001010101011101100000100000110011000011100000011001101110000000110100010001001010101011101100000100000110011011100000011001100100000111000000011010000000000000000001011011100000011001100101010101110110000010000011001100001110000001100110111000000011010001000100101010101110110000010000011001101110000001100110010000011100000001101000000000000000000101101110000001100110010101010111011000001000001100110000111000000110011011100000001101000100010010101010111011000001000001100110111000000110011001000001110000000110100000000000000000010110111000000110011001010101011101100000100000110011000011100000011001101110000000110100010001001010101011101100000100000110011011100000011001100100000111000000011010000000000000000001011011100000011001100101010101110110000010000011001100001110000001100110111000000011010001000100101010101110110000010000011001101110000001100110010000011100000001101000000000000000000101101110000001100110010101010111011000001000001100110000111000000110011011100000001101000100010010101010111011000001000001100110111000000110011001000001110000000110100000000000000000010110111000000110011001010101011101100000100000110011000011100000011001101110000000110100010001001010101011101100000100000110011011100000011001100100000111000000011010000000000000000001011011100000011001100101010101110110000010000011001100001110000001100110111000000011010001000100101010101110110000010000011001101110000001100110010000011100000001101000000000000000000101101110000001100110010101010111011000001000001100110000111000000110011011100000001101000100010010101010111011000001000001100110111000000110011001000001110000000110100000000000000000010110111000000110011001010101011101100000100000110011000011100000011001101110000000110100010001001010101011101100000100000110011011100000011001100100000111000000011010000000000000000001011011100000011001100101010101110110000010000011001100001110000001100110111000000011010001000100101010101110110000010000011001101110000001100110010000011100000001101000000000000000000101101110000001100110010101010111011000001000001100110000111000000110011011100000001101000100010010101010111011000001000001100110111000000110011001000001110000000110100000000000000000010110111000000110011001010101011101100000100000110011000011100000011001101110000000110100010001001010101011101100000100000110011011100000011001100100000111000000011010000000000000000001011011100000011001100101010101110110000010000011001100001110000001100110111000000011010001000100101010101110110000010000011001101110000001100110010000011100000001101000000000000000000101101110000001100110010101010111011000001000001100110000111000000110011011100000001101000100010010101010111011000001000001100110111000000110011001000001110000000110100000000000000000010110111000000110011001010101011101100000100000110011000011100000011001101110000000110100010001001010101011101100000100000110011011100000011001100100000111000000011010000000000000000001011011100000011001100101010101110110000010000011001100001110000001100110111000000011010001000100101010101110110000010000011001101110000001100110010000011100000001101000000000000000000101101110000001100110010101010111011000001000001100110000111000000110011011100000001101000100010010101010111011000001000001100110111000000110011001000001110000000110100000000000000000010110111000000110011001010101011101100000100000110011000011100000011001101110000000110100010001001010101011101100000100000110011011100000011001100100000111000000011010000000000000000001011011100000011001100101010101110110000010000011001100001110000001100110111000000011010001000100101010101110110000010000011001101110000001100110010000011100000001101000000000000000000101101110000001100110010101010111011000001000001100110000111000000110011011100000001101000100010010101010111011000001000001100110111000000110011001000001110000000110100000000000000000010110111000000110011001010101011101100000100000110011000011100000011001101110000000110100010001001010101011101100000100000110011011100000011001100100000111000000011010000000000000000001011011100000011001100101010101110110000010000011001100001110000001100110111000000011010001000100101010101110110000010000011001101110000001100110010000011100000001101000000000000000000101101110000001100110010101010110011000001010001100110000111000000110011101100001001111110100010010101010111011000001000001100110111000000110011001000001110000000110100000000000000000010110111000000110011001010101011001100000101000110011000011100000011001110110000100111111010001001010101011001100000101000110011011100000011001110100000011000010011111100000000000000001011011100000011001100101010101100110000010100011001100001110000001100111011000010011111101000100101010101100110000010100011001101110000001100111001000001100001001111110000010110011100001101110000001100110010101010110011000001010001100110000111000000110011101100001001111110100010010101010110011000001010001100110111000000110011100100000110000100111111000000000000000010111000111111000000001010101011001100000101000110011000011100000011001110110000100111111010001001010101011001100000101000110011011100000011001110010000011000010011111100000000000000001011100011111100000010101010101100110000010100011001100010001111110000001011000010011111101000110101010101100110000010100011001110001111110000001001000001100001001111110000000000000000101110001111110000000010101010110011000001010001100110001000111111000000001100001001111110100010010101010110011000001010001100111000111111000000001000000110000100111111000000000000000010111000111111000000001010101011001100000101000110011000100011111100000000110000100111111010001001010101011001100000101000110011100011111100000000100000011000010011111100000000000000001011100011111100000000101010101100110000010100011001100010001111110000000011000010011111101000100101010101100110000010100011001110001111110000000010000001100001001111110000000000000000101110001111110000000010101010110011000001010001100110001000111111000000001100001001111110100010010101010110011000001010001100111000111111000000001000000110000100111111000000000000000010111000111111000000001010101011001100000101000110011000100011111100000000110000100111111010001001010101011001100000101000110011100011111100000000100000011000010011111100000000000000001011100011111100000000101010101100110000010100011001100010001111110000000011000010011111101000100101010101100110000010100011001110001111110000000010000001100001001111110000000000000000101110001111110000000010101010110011000001010001100110001000111111000000001100001001111110100010010101010110011000001010001100111000111111000000001000000110000100111111000000000000000010111000111111000000001010101011001100000101000110011000100011111100000000110000100111111010001001010101011001100000101000110011100011111100000000100000011000010011111100000000000000001011100011111100000000101010101100110000010100011001100010001111110000000011000010011111101000100101010101100110000010100011001110001111110000000010000001100001001111110000000000000000101110001111110000000010101010110011000001010001100110001000111111000000001100001001111110100010010101010110011000001010001100111000111111000000001000000110000100111111000000000000000010111000111111000000001010101011001100000101000110011000100011111100000000110000100111111010001001010101011001100000101000110011100011111100000000100000011000010011111100000000000000001011100011111100000000101010101100110000010100011001100010001111110000000011000010011111101000100101010101100110000010100011001110001111110000000010000001100001001111110000000000000000101110001111110000000010101010110011000001010001100110001000111111000000001100001001111110100010010101010110011000001010001100111000111111000000001000000110000100111111000000000000000010111000111111000000001010101011001100000101000110011000100011111100000000110000100111111010001001010101011001100000101000110011100011111100000000100000011000010011111100000000000000001011100011111100000000101010101100110000010100011001100010001111110000000011000010011111101000100101010101100110000010100011001110001111110000000010000001100001001111110000000000000000101110001111110000000010101010110011000001010001100110001000111111000000001100001001111110100010010101010110011000001010001100111000111111000000001000000110000100111111000000000000000010111000111111000000001010101011001100000101000110011000100011111100000000110000100111111010001001010101011001100000101000110011100011111100000000100000011000010011111100000000000000001011100011111100000000101010101100110000010100011001100010001111110000000011000010011111101000100101010101100110000010100011001110001111110000000010000001100001001111110000000000000000101110001111110000000010101010110011000001010001100110001000111111000000001100001001111110100010010101010110011000001010001100111000111111000000001000000110000100111111000000000000000010111000111111000000001010101011001100000101000110011000100011111100000000110000100111111010001001010101011001100000101000110011100011111100000000100000011000010011111100000000000000001011100011111100000000101010101100110000010100011001100010001111110000000011000010011111101000100101010101100110000010100011001110001111110000000010000001100001001111110000000000000000101110001111110000000010101010110011000001010001100110001000111111000000001100001001111110100010010101010110011000001010001100111000111111000000001000000110000100111111000000000000000010111000111111000000001010101011001100000101000110011000100011111100000000110000100111111010001001010101011001100000101000110011100011111100000000100000011000010011111100000000000000001011100011111100000000101010101100110000010100011001100010001111110000000011000010011111101000100101010101100110000010100011001110001111110000000010000001100001001111110000000000000000101110001111110000000010101010110011000001010001100110001000111111000000001100001001111110100010010101010110011000001010001100111000111111000000001000000110000100111111000000000000000010111000111111000000001010101011001100000101000110011000100011111100000000110000100111111010001001010101011001100000101000110011100011111100000000100000011000010011111100000000000000001011100011111100000000101010101100110000010100011001100010001111110000000011000010011111101000100101010101100110000010100011001110001111110000000010000001100001001111110000000000000000101110001111110000000010101010110011000001010001100110001000111111000000001100001001111110100010010101010110011000001010001100111000111111000000001000000110000100111111000000000000000010111000111111000000001010101011001100000101000110011000100011111100000000110000100111111010001001010101011001100000101000110011100011111100000000100000011000010011111100000000000000001011100011111100000000101010101100110000010100011001100010001111110000000011000010011111101000100101010101100110000010100011001110001111110000000010000001100001001111110000000000000000101110001111110000000010101010110011000001010001100110001000111111000000001100001001111110100010010101010110011000001010001100111000111111000000001000000110000100111111000000000000000010111000111111000000001010101011101100000101000110011000100011111100000010111000000110011010001001010101011001100000101000110011100011111100000000100000011000010011111100000000000000001011100011111100000000101010101110110000010100011001100010001111110000001011100000011001101000100101010101110110000010100011001110001111110000001010000001110000001100110000000000000000101110001111110000000010101010111011000001010001100110001000111111000000101110000001100110100010010101010111011000001010001100111000111111000000100100000111000000110011010001011001110000111000111111000000001010101011101100000101000110011000100011111100000010111000000110011010001001010101011101100000101000110011100011111100000010010000011100000011001100000000000000001011011011110000101100101010101110110000010100011001100010001111110000001011100000011001101000100101010101110110000010100011001110001111110000001001000001110000001100110000000000000000101101101111000010111010101010111011000001010001100110000110111100001011101110000001100110100011010101010111011000001010001100110110111100001011100100000111000000110011000000000000000010110110111100001011001010101011101100000101000110011000011011110000101100111000000110011010001001010101011101100000101000110011011011110000101100100000011100000011001100000000000000001011011011110000101100101010101110110000010100011001100001101111000010110011100000011001101000100101010101110110000010100011001101101111000010110010000001110000001100110000000000000000101101101111000010110010101010111011000001010001100110000110111100001011001110000001100110100010010101010111011000001010001100110110111100001011001000000111000000110011000000000000000010110110111100001011001010101011101100000101000110011000011011110000101100111000000110011010001001010101011101100000101000110011011011110000101100100000011100000011001100000000000000001011011011110000101100101010101110110000010100011001100001101111000010110011100000011001101000100101010101110110000010100011001101101111000010110010000001110000001100110000000000000000101101101111000010110010101010111011000001010001100110000110111100001011001110000001100110100010010101010111011000001010001100110110111100001011001000000111000000110011000000000000000010110110111100001011001010101011101100000101000110011000011011110000101100111000000110011010001001010101011101100000101000110011011011110000101100100000011100000011001100000000000000001011011011110000101100101010101110110000010100011001100001101111000010110011100000011001101000100101010101110110000010100011001101101111000010110010000001110000001100110000000000000000101101101111000010110010101010111011000001010001100110000110111100001011001110000001100110100010010101010111011000001010001100110110111100001011001000000111000000110011000000000000000010110110111100001011001010101011101100000101000110011000011011110000101100111000000110011010001001010101011101100000101000110011011011110000101100100000011100000011001100000000000000001011011011110000101100101010101110110000010100011001100001101111000010110011100000011001101000100101010101110110000010100011001101101111000010110010000001110000001100110000000000000000101101101111000010110010101010111011000001010001100110000110111100001011001110000001100110100010010101010111011000001010001100110110111100001011001000000111000000110011000000000000000010110110111100001011001010101011101100000101000110011000011011110000101100111000000110011010001001010101011101100000101000110011011011110000101100100000011100000011001100000000000000001011011011110000101100101010101110110000010100011001100001101111000010110011100000011001101000100101010101110110000010100011001101101111000010110010000001110000001100110000000000000000101101101111000010110010101010111011000001010001100110000110111100001011001110000001100110100010010101010111011000001010001100110110111100001011001000000111000000110011000000000000000010110110111100001011001010101011101100000101000110011000011011110000101100111000000110011010001001010101011101100000101000110011011011110000101100100000011100000011001100000000000000001011011011110000101100101010101110110000010100011001100001101111000010110011100000011001101000100101010101110110000010100011001101101111000010110010000001110000001100110000000000000000101101101111000010110010101010111011000001010001100110000110111100001011001110000001100110100010010101010111011000001010001100110110111100001011001000000111000000110011000000000000000010110110111100001011001010101011101100000101000110011000011011110000101100111000000110011010001001010101011101100000101000110011011011110000101100100000011100000011001100000000000000001011011011110000101100101010101110110000010100011001100001101111000010110011100000011001101000100101010101110110000010100011001101101111000010110010000001110000001100110000000000000000101101101111000010110010101010111011000001010001100110000110111100001011001110000001100110100010010101010111011000001010001100110110111100001011001000000111000000110011000000000000000010110110111100001011001010101011101100000101000110011000011011110000101100111000000110011010001001010101011101100000101000110011011011110000101100100000011100000011001100000000000000001011011011110000101100101010101110110000010100011001100001101111000010110011100000011001101000100101010101110110000010100011001101101111000010110010000001110000001100110000000000000000101101101111000010110010101010111011000001010001100110000110111100001011001110000001100110100010010101010111011000001010001100110110111100001011001000000111000000110011000000000000000010110110111100001011001010101011101100000101000110011000011011110000101100111000000110011010001001010101011101100000101000110011011011110000101100100000011100000011001100000000000000001011011011110000101100101010101110110000010100011001100001101111000010110011100000011001101000100101010101110110000010100011001101101111000010110010000001110000001100110000000000000000101101101111000010110010101010111011000001010001100110000110111100001011001110000001100110100010010101010111011000001010001100110110111100001011001000000111000000110011000000000000000010110110111100001011001010101011101100000101000110011000011011110000101100111000000110011010001001010101011101100000101000110011011011110000101100100000011100000011001100000000000000001011011011110000101100101010101110110000010100011001100001101111000010110011100000011001101000100101010101110110000010100011001101101111000010110010000001110000001100110000000000000000101101101111000010110010101010111011000001010001100110000110111100001011001110000001100110100010010101010111011000001010001100110110111100001011001000000111000000110011000000000000000010110110111100001011001010101011101100000101000110011000011011110000101100111000000110011010001001010101011101100000101000110011011011110000101100100000011100000011001100000000000000001011011011110000101100101010101100110000010000111001100001101111000010111100011111100000001000100101010101110110000010100011001101101111000010110010000001110000001100110000000000000000101101101111000010110010101010110011000001000011100110000110111100001011110001111110000000100010010101010110011000001000011100110110111100001011101000001000111111000000000000000000000010110110111100001011001010101011001100000100001110011000011011110000101111000111111000000010001001010101011001100000100001110011011011110000101110010000100011111100000000000011100111000011011011110000101100101010101100110000010000111001100001101111000010111100011111100000001000100101010101100110000010000111001101101111000010111001000010001111110000000000000000000000101100001011110111000010101010110011000001000011100110000110111100001011110001111110000000100010010101010110011000001000011100110110111100001011100100001000111111000000000000000000000010110000101111011100101010101011001100000100001110011000000010111101110011000111111000000010001101010101011001100000100001110011000010111101110010010000100011111100000000000000000000001011000010111101110000101010101100110000010000111001100000001011110111000100011111100000001000100101010101100110000010000111001100001011110111000010000010001111110000000000000000000000101100001011110111000010101010110011000001000011100110000000101111011100010001111110000000100010010101010110011000001000011100110000101111011100001000001000111111000000000000000000000010110000101111011100001010101011001100000100001110011000000010111101110001000111111000000010001001010101011001100000100001110011000010111101110000100000100011111100000000000000000000001011000010111101110000101010101100110000010000111001100000001011110111000100011111100000001000100101010101100110000010000111001100001011110111000010000010001111110000000000000000000000101100001011110111000010101010110011000001000011100110000000101111011100010001111110000000100010010101010110011000001000011100110000101111011100001000001000111111000000000000000000000010110000101111011100001010101011001100000100001110011000000010111101110001000111111000000010001001010101011001100000100001110011000010111101110000100000100011111100000000000000000000001011000010111101110000101010101100110000010000111001100000001011110111000100011111100000001000100101010101100110000010000111001100001011110111000010000010001111110000000000000000000000101100001011110111000010101010110011000001000011100110000000101111011100010001111110000000100010010101010110011000001000011100110000101111011100001000001000111111000000000000000000000010110000101111011100001010101011001100000100001110011000000010111101110001000111111000000010001001010101011001100000100001110011000010111101110000100000100011111100000000000000000000001011000010111101110000101010101100110000010000111001100000001011110111000100011111100000001000100101010101100110000010000111001100001011110111000010000010001111110000000000000000000000101100001011110111000010101010110011000001000011100110000000101111011100010001111110000000100010010101010110011000001000011100110000101111011100001000001000111111000000000000000000000010110000101111011100001010101011001100000100001110011000000010111101110001000111111000000010001001010101011001100000100001110011000010111101110000100000100011111100000000000000000000001011000010111101110000101010101100110000010000111001100000001011110111000100011111100000001000100101010101100110000010000111001100001011110111000010000010001111110000000000000000000000101100001011110111000010101010110011000001000011100110000000101111011100010001111110000000100010010101010110011000001000011100110000101111011100001000001000111111000000000000000000000010110000101111011100001010101011001100000100001110011000000010111101110001000111111000000010001001010101011001100000100001110011000010111101110000100000100011111100000000000000000000001011000010111101110000101010101100110000010000111001100000001011110111000100011111100000001000100101010101100110000010000111001100001011110111000010000010001111110000000000000000000000101100001011110111000010101010110011000001000011100110000000101111011100010001111110000000100010010101010110011000001000011100110000101111011100001000001000111111000000000000000000000010110000101111011100001010101011001100000100001110011000000010111101110001000111111000000010001001010101011001100000100001110011000010111101110000100000100011111100000000000000000000001011000010111101110000101010101100110000010000111001100000001011110111000100011111100000001000100101010101100110000010000111001100001011110111000010000010001111110000000000000000000000101100001011110111000010101010110011000001000011100110000000101111011100010001111110000000100010010101010110011000001000011100110000101111011100001000001000111111000000000000000000000010110000101111011100001010101011001100000100001110011000000010111101110001000111111000000010001001010101011001100000100001110011000010111101110000100000100011111100000000000000000000001011000010111101110000101010101100110000010000111001100000001011110111000100011111100000001000100101010101100110000010000111001100001011110111000010000010001111110000000000000000000000101100001011110111000010101010110011000001000011100110000000101111011100010001111110000000100010010101010110011000001000011100110000101111011100001000001000111111000000000000000000000010110000101111011100001010101011001100000100001110011000000010111101110001000111111000000010001001010101011001100000100001110011000010111101110000100000100011111100000000000000000000001011000010111101110000101010101100110000010000111001100000001011110111000100011111100000001000100101010101100110000010000111001100001011110111000010000010001111110000000000000000000000101100001011110111000010101010110011000001000011100110000000101111011100010001111110000000100010010101010110011000001000011100110000101111011100001000001000111111000000000000000000000010110000101111011100001010101011001100000100001110011000000010111101110001000111111000000010001001010101011001100000100001110011000010111101110000100000100011111100000000000000000000001011000010111101110000101010101100110000010000111001100000001011110111000100011111100000001000100101010101100110000010000111001100001011110111000010000010001111110000000000000000000000101100001011110111000010101010110011000001000011100110000000101111011100010001111110000000100010010101010110011000001000011100110000101111011100001000001000111111000000000000000000000010110000101111011100001010101011001100000100001110011000000010111101110001000111111000000010001001010101011001100000100001110011000010111101110000100000100011111100000000000000000000001011000010111101110000101010101100110000010000111001100000001011110111000100011111100000001000100101010101100110000010000111001100001011110111000010000010001111110000000000000000000000101100001011110111000010101010111011000001000011100110000000101111011100101101111000010110100010010101010110011000001000011100110000101111011100001000001000111111000000000000000000000010110000101111011100001010101011101100000100001110011000000010111101110010110111100001011010001001010101011101100000100001110011000010111101110010100000011011110000101100000000000000001011000010111101110000101010101110110000010000111001100000001011110111001011011110000101101000100101010101110110000010000111001100001011110111001001000001101111000010110100001110011100001100001011110111000010101010111011000001000011100110000000101111011100101101111000010110100010010101010111011000001000011100110000101111011100100100000110111100001011000000000000000010110110011000010000001010101011101100000100001110011000000010111101110010110111100001011010001001010101011101100000100001110011000010111101110010010000011011110000101100000000000000001011011001100001000010101010101110110000010000111001100001100110000100001011011110000101101000110101010101110110000010000111001101100110000100001001000001101111000010110000000000000000101101100110000100000010101010111011000001000011100110000110011000010000001101111000010110100010010101010111011000001000011100110110011000010000001000000110111100001011000000000000000010110110011000010000001010101011101100000100001110011000011001100001000000110111100001011010001001010101011101100000100001110011011001100001000000100000011011110000101100000000000000001011011001100001000000101010101110110000010000111001100001100110000100000011011110000101101000100101010101110110000010000111001101100110000100000010000001101111000010110000000000000000101101100110000100000010101010111011000001000011100110000110011000010000001101111000010110100010010101010111011000001000011100110110011000010000001000000110111100001011000000000000000010110110011000010000001010101011101100000100001110011000011001100001000000110111100001011010001001010101011101100000100001110011011001100001000000100000011011110000101100000000000000001011011001100001000000101010101110110000010000111001100001100110000100000011011110000101101000100101010101110110000010000111001101100110000100000010000001101111000010110000000000000000101101100110000100000010101010111011000001000011100110000110011000010000001101111000010110100010010101010111011000001000011100110110011000010000001000000110111100001011000000000000000010110110011000010000001010101011101100000100001110011000011001100001000000110111100001011010001001010101011101100000100001110011011001100001000000100000011011110000101100000000000000001011011001100001000000101010101110110000010000111001100001100110000100000011011110000101101000100101010101110110000010000111001101100110000100000010000001101111000010110000000000000000101101100110000100000010101010111011000001000011100110000110011000010000001101111000010110100010010101010111011000001000011100110110011000010000001000000110111100001011000000000000000010110110011000010000001010101011101100000100001110011000011001100001000000110111100001011010001001010101011101100000100001110011011001100001000000100000011011110000101100000000000000001011011001100001000000101010101110110000010000111001100001100110000100000011011110000101101000100101010101110110000010000111001101100110000100000010000001101111000010110000000000000000101101100110000100000010101010111011000001000011100110000110011000010000001101111000010110100010010101010111011000001000011100110110011000010000001000000110111100001011000000000000000010110110011000010000001010101011101100000100001110011000011001100001000000110111100001011010001001010101011101100000100001110011011001100001000000100000011011110000101100000000000000001011011001100001000000101010101110110000010000111001100001100110000100000011011110000101101000100101010101110110000010000111001101100110000100000010000001101111000010110000000000000000101101100110000100000010101010111011000001000011100110000110011000010000001101111000010110100010010101010111011000001000011100110110011000010000001000000110111100001011000000000000000010110110011000010000001010101011101100000100001110011000011001100001000000110111100001011010001001010101011101100000100001110011011001100001000000100000011011110000101100000000000000001011011001100001000000101010101110110000010000111001100001100110000100000011011110000101101000100101010101110110000010000111001101100110000100000010000001101111000010110000000000000000101101100110000100000010101010111011000001000011100110000110011000010000001101111000010110100010010101010111011000001000011100110110011000010000001000000110111100001011000000000000000010110110011000010000001010101011101100000100001110011000011001100001000000110111100001011010001001010101011101100000100001110011011001100001000000100000011011110000101100000000000000001011011001100001000000101010101110110000010000111001100001100110000100000011011110000101101000100101010101110110000010000111001101100110000100000010000001101111000010110000000000000000101101100110000100000010101010111011000001000011100110000110011000010000001101111000010110100010010101010111011000001000011100110110011000010000001000000110111100001011000000000000000010110110011000010000001010101011101100000100001110011000011001100001000000110111100001011010001001010101011101100000100001110011011001100001000000100000011011110000101100000000000000001011011001100001000000101010101110110000010000111001100001100110000100000011011110000101101000100101010101110110000010000111001101100110000100000010000001101111000010110000000000000000101101100110000100000010101010111011000001000011100110000110011000010000001101111000010110100010010101010111011000001000011100110110011000010000001000000110111100001011000000000000000010110110011000010000001010101011101100000100001110011000011001100001000000110111100001011010001001010101011101100000100001110011011001100001000000100000011011110000101100000000000000001011011001100001000000101010101110110000010000111001100001100110000100000011011110000101101000100101010101110110000010000111001101100110000100000010000001101111000010110000000000000000101101100110000100000010101010111011000001000011100110000110011000010000001101111000010110100010010101010111011000001000011100110110011000010000001000000110111100001011000000000000000010110110011000010000001010101011101100000100001110011000011001100001000000110111100001011010001001010101011101100000100001110011011001100001000000100000011011110000101100000000000000001011011001100001000000101010101110110000010000111001100001100110000100000011011110000101101000100101010101110110000010000111001101100110000100000010000001101111000010110000000000000000101101100110000100000010101010111011000001000011100110000110011000010000001101111000010110100010010101010111011000001000011100110110011000010000001000000110111100001011000000000000000010110110011000010000001010101011001100000101001110011000011001100001000010000101111011100010001001010101011101100000100001110011011001100001000000100000011011110000101100000000000000001011011001100001000000101010101100110000010100111001100001100110000100001000010111101110001000100101010101100110000010100111001101100110000100001010000000001011110111000000000000000000101101100110000100000010101010110011000001010011100110000110011000010000100001011110111000100010010101010110011000001010011100110110011000010000100100000000101111011100000001111001110000110110011000010000001010101011001100000101001110011000011001100001000010000101111011100010001001010101011001100000101001110011011001100001000010010000000010111101110000000000000000001011010110000010110000101010101100110000010100111001100001100110000100001000010111101110001000100101010101100110000010100111001101100110000100001001000000001011110111000000000000000000101101011000001011001010101010110011000001010011100110000101100000101100100001011110111000100011010101010110011000001010011100110101100000101100100100000000101111011100000000000000000010110101100000101100001010101011001100000101001110011000010110000010110000000101111011100010001001010101011001100000101001110011010110000010110000100000000010111101110000000000000000001011010110000010110000101010101100110000010100111001100001011000001011000000010111101110001000100101010101100110000010100111001101011000001011000010000000001011110111000000000000000000101101011000001011000010101010110011000001010011100110000101100000101100000001011110111000100010010101010110011000001010011100110101100000101100001000000000101111011100000000000000000010110101100000101100001010101011001100000101001110011000010110000010110000000101111011100010001001010101011001100000101001110011010110000010110000100000000010111101110000000000000000001011010110000010110000101010101100110000010100111001100001011000001011000000010111101110001000100101010101100110000010100111001101011000001011000010000000001011110111000000000000000000101101011000001011000010101010110011000001010011100110000101100000101100000001011110111000100010010101010110011000001010011100110101100000101100001000000000101111011100000000000000000010110101100000101100001010101011001100000101001110011000010110000010110000000101111011100010001001010101011001100000101001110011010110000010110000100000000010111101110000000000000000001011010110000010110000101010101100110000010100111001100001011000001011000000010111101110001000100101010101100110000010100111001101011000001011000010000000001011110111000000000000000000101101011000001011000010101010110011000001010011100110000101100000101100000001011110111000100010010101010110011000001010011100110101100000101100001000000000101111011100000000000000000010110101100000101100001010101011001100000101001110011000010110000010110000000101111011100010001001010101011001100000101001110011010110000010110000100000000010111101110000000000000000001011010110000010110000101010101100110000010100111001100001011000001011000000010111101110001000100101010101100110000010100111001101011000001011000010000000001011110111000000000000000000101101011000001011000010101010110011000001010011100110000101100000101100000001011110111000100010010101010110011000001010011100110101100000101100001000000000101111011100000000000000000010110101100000101100001010101011001100000101001110011000010110000010110000000101111011100010001001010101011001100000101001110011010110000010110000100000000010111101110000000000000000001011010110000010110000101010101100110000010100111001100001011000001011000000010111101110001000100101010101100110000010100111001101011000001011000010000000001011110111000000000000000000101101011000001011000010101010110011000001010011100110000101100000101100000001011110111000100010010101010110011000001010011100110101100000101100001000000000101111011100000000000000000010110101100000101100001010101011001100000101001110011000010110000010110000000101111011100010001001010101011001100000101001110011010110000010110000100000000010111101110000000000000000001011010110000010110000101010101100110000010100111001100001011000001011000000010111101110001000100101010101100110000010100111001101011000001011000010000000001011110111000000000000000000101101011000001011000010101010110011000001010011100110000101100000101100000001011110111000100010010101010110011000001010011100110101100000101100001000000000101111011100000000000000000010110101100000101100001010101011001100000101001110011000010110000010110000000101111011100010001001010101011001100000101001110011010110000010110000100000000010111101110000000000000000001011010110000010110000101010101100110000010100111001100001011000001011000000010111101110001000100101010101100110000010100111001101011000001011000010000000001011110111000000000000000000101101011000001011000010101010110011000001010011100110000101100000101100000001011110111000100010010101010110011000001010011100110101100000101100001000000000101111011100000000000000000010110101100000101100001010101011001100000101001110011000010110000010110000000101111011100010001001010101011001100000101001110011010110000010110000100000000010111101110000000000000000001011010110000010110000101010101100110000010100111001100001011000001011000000010111101110001000100101010101100110000010100111001101011000001011000010000000001011110111000000000000000000101101011000001011000010101010110011000001010011100110000101100000101100000001011110111000100010010101010110011000001010011100110101100000101100001000000000101111011100000000000000000010110101100000101100001010101011001100000101001110011000010110000010110000000101111011100010001001010101011001100000101001110011010110000010110000100000000010111101110000000000000000001011010110000010110000101010101100110000010100111001100001011000001011000000010111101110001000100101010101100110000010100111001101011000001011000010000000001011110111000000000000000000101101011000001011000010101010110011000001010011100110000101100000101100000001011110111000100010010101010110011000001010011100110101100000101100001000000000101111011100000000000000000010110101100000101100001010101011001100000101001110011000010110000010110000000101111011100010001001010101011001100000101001110011010110000010110000100000000010111101110000000000000000001011010110000010110000101010101100110000010100111001100001011000001011000000010111101110001000100101010101100110000010100111001101011000001011000010000000001011110111000000000000000000101101011000001011000010101010110011000001010011100110000101100000101100000001011110111000100010010101010110011000001010011100110101100000101100001000000000101111011100000000000000000010110101100000101100001010101011101100000101001110011000010110000010110010110011000010000010001001010101011001100000101001110011010110000010110000100000000010111101110000000000000000001011010110000010110000101010101110110000010100111001100001011000001011001011001100001000001000100101010101110110000010100111001101011000001011001010000001100110000100000000000000000000101101011000001011000010101010111011000001010011100110000101100000101100101100110000100000100010010101010111011000001010011100110101100000101100100100000110011000010000010001111001110000110101100000101100001010101011101100000101001110011000010110000010110010110011000010000010001001010101011101100000101001110011010110000010110010010000011001100001000000000000000000001011101111100011001100101010101110110000010100111001100001011000001011001011001100001000001000100101010101110110000010100111001101011000001011001001000001100110000100000000000000000000101110111110001100111010101010111011000001010011100110001011111000110011101100110000100000100011010101010111011000001010011100111011111000110011100100000110011000010000000000000000000010111011111000110011001010101011101100000101001110011000101111100011001100110011000010000010001001010101011101100000101001110011101111100011001100100000011001100001000000000000000000001011101111100011001100101010101110110000010100111001100010111110001100110011001100001000001000100101010101110110000010100111001110111110001100110010000001100110000100000000000000000000101110111110001100110010101010111011000001010011100110001011111000110011001100110000100000100010010101010111011000001010011100111011111000110011001000000110011000010000000000000000000010111011111000110011001010101011101100000101001110011000101111100011001100110011000010000010001001010101011101100000101001110011101111100011001100100000011001100001000000000000000000001011101111100011001100101010101110110000010100111001100010111110001100110011001100001000001000100101010101110110000010100111001110111110001100110010000001100110000100000000000000000000101110111110001100110010101010111011000001010011100110001011111000110011001100110000100000100010010101010111011000001010011100111011111000110011001000000110011000010000000000000000000010111011111000110011001010101011101100000101001110011000101111100011001100110011000010000010001001010101011101100000101001110011101111100011001100100000011001100001000000000000000000001011101111100011001100101010101110110000010100111001100010111110001100110011001100001000001000100101010101110110000010100111001110111110001100110010000001100110000100000000000000000000101110111110001100110010101010111011000001010011100110001011111000110011001100110000100000100010010101010111011000001010011100111011111000110011001000000110011000010000000000000000000010111011111000110011001010101011101100000101001110011000101111100011001100110011000010000010001001010101011101100000101001110011101111100011001100100000011001100001000000000000000000001011101111100011001100101010101110110000010100111001100010111110001100110011001100001000001000100101010101110110000010100111001110111110001100110010000001100110000100000000000000000000101110111110001100110010101010111011000001010011100110001011111000110011001100110000100000100010010101010111011000001010011100111011111000110011001000000110011000010000000000000000000010111011111000110011001010101011101100000101001110011000101111100011001100110011000010000010001001010101011101100000101001110011101111100011001100100000011001100001000000000000000000001011101111100011001100101010101110110000010100111001100010111110001100110011001100001000001000100101010101110110000010100111001110111110001100110010000001100110000100000000000000000000101110111110001100110010101010111011000001010011100110001011111000110011001100110000100000100010010101010111011000001010011100111011111000110011001000000110011000010000000000000000000010111011111000110011001010101011101100000101001110011000101111100011001100110011000010000010001001010101011101100000101001110011101111100011001100100000011001100001000000000000000000001011101111100011001100101010101110110000010100111001100010111110001100110011001100001000001000100101010101110110000010100111001110111110001100110010000001100110000100000000000000000000101110111110001100110010101010111011000001010011100110001011111000110011001100110000100000100010010101010111011000001010011100111011111000110011001000000110011000010000000000000000000010111011111000110011001010101011101100000101001110011000101111100011001100110011000010000010001001010101011101100000101001110011101111100011001100100000011001100001000000000000000000001011101111100011001100101010101110110000010100111001100010111110001100110011001100001000001000100101010101110110000010100111001110111110001100110010000001100110000100000000000000000000101110111110001100110010101010111011000001010011100110001011111000110011001100110000100000100010010101010111011000001010011100111011111000110011001000000110011000010000000000000000000010111011111000110011001010101011101100000101001110011000101111100011001100110011000010000010001001010101011101100000101001110011101111100011001100100000011001100001000000000000000000001011101111100011001100101010101110110000010100111001100010111110001100110011001100001000001000100101010101110110000010100111001110111110001100110010000001100110000100000000000000000000101110111110001100110010101010111011000001010011100110001011111000110011001100110000100000100010010101010111011000001010011100111011111000110011001000000110011000010000000000000000000010111011111000110011001010101011101100000101001110011000101111100011001100110011000010000010001001010101011101100000101001110011101111100011001100100000011001100001000000000000000000001011101111100011001100101010101110110000010100111001100010111110001100110011001100001000001000100101010101110110000010100111001110111110001100110010000001100110000100000000000000000000101110111110001100110010101010111011000001010011100110001011111000110011001100110000100000100010010101010111011000001010011100111011111000110011001000000110011000010000000000000000000010111011111000110011001010101011101100000101001110011000101111100011001100110011000010000010001001010101011101100000101001110011101111100011001100100000011001100001000000000000000000001011101111100011001100101010101110110000010100111001100010111110001100110011001100001000001000100101010101110110000010100111001110111110001100110010000001100110000100000000000000000000101110111110001100110010101010111011000001010011100110001011111000110011001100110000100000100010010101010111011000001010011100111011111000110011001000000110011000010000000000000000000010111011111000110011001010101011101100000101001110011000101111100011001100110011000010000010001001010101011101100000101001110011101111100011001100100000011001100001000000000000000000001011101111100011001100101010101100110000010000000101100010111110001100111010110000010110001000100101010101110110000010100111001110111110001100110010000001100110000100000000000000000000101110111110001100110010101010110011000001000000010110001011111000110011101011000001011000100010010101010110011000001000000010111011111000110011101000000101100000101100000000000000000010111011111000110011001010101011001100000100000001011000101111100011001110101100000101100010001001010101011001100000100000001011101111100011001110010000010110000010110000000000010111000011101111100011001100101010101100110000010000000101100010111110001100111010110000010110001000100101010101100110000010000000101110111110001100111001000001011000001011000000000000000000101100010110000101100010101010110011000001000000010110001011111000110011101011000001011000100010010101010110011000001000000010111011111000110011100100000101100000101100000000000000000010110001011000010110101010101011001100000100000001011000000101100001011010101100000101100010001101010101011001100000100000001011000101100001011010010000010110000010110000000000000000001011000101100001011000101010101100110000010000000101100000010110000101100010110000010110001000100101010101100110000010000000101100010110000101100010000001011000001011000000000000000000101100010110000101100010101010110011000001000000010110000001011000010110001011000001011000100010010101010110011000001000000010110001011000010110001000000101100000101100000000000000000010110001011000010110001010101011001100000100000001011000000101100001011000101100000101100010001001010101011001100000100000001011000101100001011000100000010110000010110000000000000000001011000101100001011000101010101100110000010000000101100000010110000101100010110000010110001000100101010101100110000010000000101100010110000101100010000001011000001011000000000000000000101100010110000101100010101010110011000001000000010110000001011000010110001011000001011000100010010101010110011000001000000010110001011000010110001000000101100000101100000000000000000010110001011000010110001010101011001100000100000001011000000101100001011000101100000101100010001001010101011001100000100000001011000101100001011000100000010110000010110000000000000000001011000101100001011000101010101100110000010000000101100000010110000101100010110000010110001000100101010101100110000010000000101100010110000101100010000001011000001011000000000000000000101100010110000101100010101010110011000001000000010110000001011000010110001011000001011000100010010101010110011000001000000010110001011000010110001000000101100000101100000000000000000010110001011000010110001010101011001100000100000001011000000101100001011000101100000101100010001001010101011001100000100000001011000101100001011000100000010110000010110000000000000000001011000101100001011000101010101100110000010000000101100000010110000101100010110000010110001000100101010101100110000010000000101100010110000101100010000001011000001011000000000000000000101100010110000101100010101010110011000001000000010110000001011000010110001011000001011000100010010101010110011000001000000010110001011000010110001000000101100000101100000000000000000010110001011000010110001010101011001100000100000001011000000101100001011000101100000101100010001001010101011001100000100000001011000101100001011000100000010110000010110000000000000000001011000101100001011000101010101100110000010000000101100000010110000101100010110000010110001000100101010101100110000010000000101100010110000101100010000001011000001011000000000000000000101100010110000101100010101010110011000001000000010110000001011000010110001011000001011000100010010101010110011000001000000010110001011000010110001000000101100000101100000000000000000010110001011000010110001010101011001100000100000001011000000101100001011000101100000101100010001001010101011001100000100000001011000101100001011000100000010110000010110000000000000000001011000101100001011000101010101100110000010000000101100000010110000101100010110000010110001000100101010101100110000010000000101100010110000101100010000001011000001011000000000000000000101100010110000101100010101010110011000001000000010110000001011000010110001011000001011000100010010101010110011000001000000010110001011000010110001000000101100000101100000000000000000010110001011000010110001010101011001100000100000001011000000101100001011000101100000101100010001001010101011001100000100000001011000101100001011000100000010110000010110000000000000000001011000101100001011000101010101100110000010000000101100000010110000101100010110000010110001000100101010101100110000010000000101100010110000101100010000001011000001011000000000000000000101100010110000101100010101010110011000001000000010110000001011000010110001011000001011000100010010101010110011000001000000010110001011000010110001000000101100000101100000000000000000010110001011000010110001010101011001100000100000001011000000101100001011000101100000101100010001001010101011001100000100000001011000101100001011000100000010110000010110000000000000000001011000101100001011000101010101100110000010000000101100000010110000101100010110000010110001000100101010101100110000010000000101100010110000101100010000001011000001011000000000000000000101100010110000101100010101010110011000001000000010110000001011000010110001011000001011000100010010101010110011000001000000010110001011000010110001000000101100000101100000000000000000010110001011000010110001010101011001100000100000001011000000101100001011000101100000101100010001001010101011001100000100000001011000101100001011000100000010110000010110000000000000000001011000101100001011000101010101100110000010000000101100000010110000101100010110000010110001000100101010101100110000010000000101100010110000101100010000001011000001011000000000000000000101100010110000101100010101010110011000001000000010110000001011000010110001011000001011000100010010101010110011000001000000010110001011000010110001000000101100000101100000000000000000010110001011000010110001010101011001100000100000001011000000101100001011000101100000101100010001001010101011001100000100000001011000101100001011000100000010110000010110000000000000000001011000101100001011000101010101100110000010000000101100000010110000101100010110000010110001000100101010101100110000010000000101100010110000101100010000001011000001011000000000000000000101100010110000101100010101010110011000001000000010110000001011000010110001011000001011000100010010101010110011000001000000010110001011000010110001000000101100000101100000000000000000010110001011000010110001010101011001100000100000001011000000101100001011000101100000101100010001001010101011001100000100000001011000101100001011000100000010110000010110000000000000000001011000101100001011000101010101100110000010000000101100000010110000101100010110000010110001000100101010101100110000010000000101100010110000101100010000001011000001011000000000000000000101100010110000101100010101010111011000001000000010110000001011000010110110111110001100110100010010101010110011000001000000010110001011000010110001000000101100000101100000000000000000010110001011000010110001010101011101100000100000001011000000101100001011011011111000110011010001001010101011101100000100000001011000101100001011010100000101111100011001100000000000000001011000101100001011000101010101110110000010000000101100000010110000101101101111100011001101000100101010101110110000010000000101100010110000101101001000010111110001100110100000001011100001100010110000101100010101010111011000001000000010110000001011000010110110111110001100110100010010101010111011000001000000010110001011000010110100100001011111000110011000000000000000010110001111011111100001010101011101100000100000001011000000101100001011011011111000110011010001001010101011101100000100000001011000101100001011010010000101111100011001100000000000000001011000111101111110010101010101110110000010000000101100000011110111111001101111100011001101000110101010101110110000010000000101100011110111111001001000010111110001100110000000000000000101100011110111111000010101010111011000001000000010110000001111011111100010111110001100110100010010101010111011000001000000010110001111011111100001000001011111000110011000000000000000010110001111011111100001010101011101100000100000001011000000111101111110001011111000110011010001001010101011101100000100000001011000111101111110000100000101111100011001100000000000000001011000111101111110000101010101110110000010000000101100000011110111111000101111100011001101000100101010101110110000010000000101100011110111111000010000010111110001100110000000000000000101100011110111111000010101010111011000001000000010110000001111011111100010111110001100110100010010101010111011000001000000010110001111011111100001000001011111000110011000000000000000010110001111011111100001010101011101100000100000001011000000111101111110001011111000110011010001001010101011101100000100000001011000111101111110000100000101111100011001100000000000000001011000111101111110000101010101110110000010000000101100000011110111111000101111100011001101000100101010101110110000010000000101100011110111111000010000010111110001100110000000000000000101100011110111111000010101010111011000001000000010110000001111011111100010111110001100110100010010101010111011000001000000010110001111011111100001000001011111000110011000000000000000010110001111011111100001010101011101100000100000001011000000111101111110001011111000110011010001001010101011101100000100000001011000111101111110000100000101111100011001100000000000000001011000111101111110000101010101110110000010000000101100000011110111111000101111100011001101000100101010101110110000010000000101100011110111111000010000010111110001100110000000000000000101100011110111111000010101010111011000001000000010110000001111011111100010111110001100110100010010101010111011000001000000010110001111011111100001000001011111000110011000000000000000010110001111011111100001010101011101100000100000001011000000111101111110001011111000110011010001001010101011101100000100000001011000111101111110000100000101111100011001100000000000000001011000111101111110000101010101110110000010000000101100000011110111111000101111100011001101000100101010101110110000010000000101100011110111111000010000010111110001100110000000000000000101100011110111111000010101010111011000001000000010110000001111011111100010111110001100110100010010101010111011000001000000010110001111011111100001000001011111000110011000000000000000010110001111011111100001010101011101100000100000001011000000111101111110001011111000110011010001001010101011101100000100000001011000111101111110000100000101111100011001100000000000000001011000111101111110000101010101110110000010000000101100000011110111111000101111100011001101000100101010101110110000010000000101100011110111111000010000010111110001100110000000000000000101100011110111111000010101010111011000001000000010110000001111011111100010111110001100110100010010101010111011000001000000010110001111011111100001000001011111000110011000000000000000010110001111011111100001010101011101100000100000001011000000111101111110001011111000110011010001001010101011101100000100000001011000111101111110000100000101111100011001100000000000000001011000111101111110000101010101110110000010000000101100000011110111111000101111100011001101000100101010101110110000010000000101100011110111111000010000010111110001100110000000000000000101100011110111111000010101010111011000001000000010110000001111011111100010111110001100110100010010101010111011000001000000010110001111011111100001000001011111000110011000000000000000010110001111011111100001010101011101100000100000001011000000111101111110001011111000110011010001001010101011101100000100000001011000111101111110000100000101111100011001100000000000000001011000111101111110000101010101110110000010000000101100000011110111111000101111100011001101000100101010101110110000010000000101100011110111111000010000010111110001100110000000000000000101100011110111111000010101010111011000001000000010110000001111011111100010111110001100110100010010101010111011000001000000010110001111011111100001000001011111000110011000000000000000010110001111011111100001010101011101100000100000001011000000111101111110001011111000110011010001001010101011101100000100000001011000111101111110000100000101111100011001100000000000000001011000111101111110000101010101110110000010000000101100000011110111111000101111100011001101000100101010101110110000010000000101100011110111111000010000010111110001100110000000000000000101100011110111111000010101010111011000001000000010110000001111011111100010111110001100110100010010101010111011000001000000010110001111011111100001000001011111000110011000000000000000010110001111011111100001010101011101100000100000001011000000111101111110001011111000110011010001001010101011101100000100000001011000111101111110000100000101111100011001100000000000000001011000111101111110000101010101110110000010000000101100000011110111111000101111100011001101000100101010101110110000010000000101100011110111111000010000010111110001100110000000000000000101100011110111111000010101010111011000001000000010110000001111011111100010111110001100110100010010101010111011000001000000010110001111011111100001000001011111000110011000000000000000010110001111011111100001010101011101100000100000001011000000111101111110001011111000110011010001001010101011101100000100000001011000111101111110000100000101111100011001100000000000000001011000111101111110000101010101110110000010000000101100000011110111111000101111100011001101000100101010101110110000010000000101100011110111111000010000010111110001100110000000000000000101100011110111111000010101010111011000001000000010110000001111011111100010111110001100110100010010101010111011000001000000010110001111011111100001000001011111000110011000000000000000010110001111011111100001010101011001100000101000001011000000111101111110010001011000010110010001001010101011101100000100000001011000111101111110000100000101111100011001100000000000000001011000111101111110000101010101100110000010100000101100000011110111111001000101100001011001000100101010101100110000010100000101100011110111111001010000000010110000101100000000000000000101100011110111111000010101010110011000001010000010110000001111011111100100010110000101100100010010101010110011000001010000010110001111011111100100100000001011000010110000001000101110000110001111011111100001010101011001100000101000001011000000111101111110010001011000010110010001001010101011001100000101000001011000111101111110010010000000101100001011000000000000000001011111100000001111100101010101100110000010100000101100000011110111111001000101100001011001000100101010101100110000010100000101100011110111111001001000000010110000101100000000000000000101111110000000111111010101010110011000001010000010110001111000000011111100010110000101100100011010101010110011000001010000010111111000000011111100100000001011000010110000000000000000010111111000000011111001010101011001100000101000001011000111100000001111100001011000010110010001001010101011001100000101000001011111100000001111100100000000101100001011000000000000000001011111100000001111100101010101100110000010100000101100011110000000111110000101100001011001000100101010101100110000010100000101111110000000111110000001000010110000101100010000000000000100011110000000111110010101010110011000001010000010110001111000000011111000010110000101100100010010101010110011000001010000010111111000000011111000000100001011000010110000000000000000010111111000000011111001010101011001100000101000001011000111100000001111100001011000010110010001001010101011001100000101000001011111100000001111100000010000101100001011000000000000000001011111100000001111100101010101100110000010100000101100011110000000111110000101100001011001000100101010101100110000010100000101111110000000111110000000100010110000101100000000000000000000111110000000111110010101010110011000001010000010110001111000000011111000010110000101100100010010101010110011000001010000010111111000000011111000000010001011000010110000000000000000010111111000000011111001010101011001100000101000001011000111100000001111100001011000010110010001001010101011001100000101000001011111100000001111100000001000101100001011000000000000000001011111100000001111100101010101100110000010100000101100011110000000111110000101100001011001000100101010101100110000010100000101111110000000111110000000100010110000101100000000000000000101111110000000111110010101010110011000001010000010110001111000000011111000010110000101100100010010101010110011000001010000010111111000000011111000000010001011000010110000000000000000010111111000000011111001010101011001100000101000001011000111100000001111100001011000010110010001001010101011001100000101000001011111100000001111100000001000101100001011000000000000000001011111100000001111100101010101100110000010100000101100011110000000111110000101100001011001000100101010101100110000010100000101111110000000111110000000100010110000101100000000000000000101111110000000111110010101010110011000001010000010110001111000000011111000010110000101100100010010101010110011000001010000010111111000000011111000000010001011000010110000000000000000010111111000000011111001010101011001100000101000001011000111100000001111100001011000010110010001001010101011001100000101000001011111100000001111100001000000101100001011000000000000000001011111100000001111100101010101100110000010100000101100011110000000111110000101100001011001000100101010101100110000010100000101111110000000111110000100000010110000101100000000000000000101111110000000111110010101010110011000001010000010110001111000000011111000010110000101100100010010101010110011000001010000010111111000000011111000010000001011000010110000000000000000010111111000000011111001010101011001100000101000001011000111100000001111100001011000010110010001001010101011001100000101000001011111100000001111100001000000101100001011000000000000000001011111100000001111100101010101100110000010100000101100011110000000111110000101100001011001000100101010101100110000010100000101111110000000111110000100000010110000101100000000000000000101111110000000111110010101010110011000001010000010110001111000000011111000010110000101100100010010101010110011000001010000010111111000000011111000010000001011000010110000000000000000010111111000000011111001010101011001100000101000001011000111100000001111100001011000010110010001001010101011001100000101000001011111100000001111100001000000101100001011000000000000000001011111100000001111100101010101100110000010100000101100011110000000111110000101100001011001000100101010101100110000010100000101111110000000111110000100000010110000101100000000000000000101111110000000111110010101010110011000001010000010110001111000000011111000010110000101100100010010101010110011000001010000010111111000000011111000010000001011000010110000000000000000010111111000000011111001010101011001100000101000001011000111100000001111100001011000010110010001001010101011001100000101000001011111100000001111100001000000101100001011000000000000000001011111100000001111100101010101100110000010100000101100011110000000111110000101100001011001000100101010101100110000010100000101111110000000111110000100000010110000101100000000000000000101111110000000111110010101010110011000001010000010110001111000000011111000010110000101100100010010101010110011000001010000010111111000000011111000010000001011000010110000000000000000010111111000000011111001010101011001100000101000001011000111100000001111100001011000010110010001001010101011001100000101000001011111100000001111100001000000101100001011000000000000000001011111100000001111100101010101100110000010100000101100011110000000111110000101100001011001000100101010101100110000010100000101111110000000111110000100000010110000101100000000000000000101111110000000111110010101010110011000001010000010110001111000000011111000010110000101100100010010101010110011000001010000010111111000000011111000010000001011000010110000000000000000010111111000000011111001010101011001100000101000001011000111100000001111100001011000010110010001001010101011001100000101000001011111100000001111100001000000101100001011000000000000000001011111100000001111100101010101100110000010100000101100011110000000111110000101100001011001000100101010101100110000010100000101111110000000111110000100000010110000101100000000000000000101111110000000111110010101010110011000001010000010110001111000000011111000010110000101100100010010101010110011000001010000010111111000000011111000010000001011000010110000000000000000010111111000000011111001010101011101100000101000001011000111100000001111110001111011111100010001001010101011001100000101000001011111100000001111100001000000101100001011000000000000000001011111100000001111100101010101110110000010100000101100011110000000111111000111101111110001000100101010101110110000010100000101111110000000111111000100000011110111111000000000000000000101111110000000111110010101010111011000001010000010110001111000000011111100011110111111000100010010101010111011000001010000010111111000000011111110000000001111011111100001101010101100010011111000000011111001010101011101100000101000001011000111100000001111110001111011111100010001001010101011101100000101000001011111100000001111111000000000111101111110000000000000000001011111100000001111100101010101110110000010100000101100011110000000111111000111101111110001000100101010101110110000010100000101111110000000111111100000000011110111111000000000000000000101111110000000111110010101010111011000001010000010110001111000000011111100011110111111000100010010101010111011000001010000010111111000000011111101000000001111011111100000000000000000010111111000000011111001010101011101100000101000001011000111100000001111110001111011111100010001001010101011101100000101000001011111100000001111110010000000111101111110001000100010111000011111100000001111100101010101110110000010100000101100011110000000111111000111101111110001000100101010101110110000010100000101111110000000111111001000000011110111111000000000000000000101110000000001010010010101010111011000001010000010110001111000000011111100011110111111000100010010101010111011000001010000010111111000000011111100100000001111011111100000000000000000010111000000000101001101010101011101100000101000001011000100000000010100110001111011111100010001101010101011101100000101000001011100000000010100110010000000111101111110000000000000000001011100000000010100100101010101110110000010100000101100010000000001010010000111101111110001000100101010101110110000010100000101110000000001010010010000000011110111111000000000000000000101110000000001010010010101010111011000001010000010110001000000000101001000011110111111000100010010101010111011000001010000010111000000000101001001000000001111011111100000000000000000010111000000000101001001010101011101100000101000001011000100000000010100100001111011111100010001001010101011101100000101000001011100000000010100100100000000111101111110000000000000000001011100000000010100100101010101110110000010100000101100010000000001010010000111101111110001000100101010101110110000010100000101110000000001010010010000000011110111111000000000000000000101110000000001010010010101010111011000001010000010110001000000000101001000011110111111000100010010101010111011000001010000010111000000000101001001000000001111011111100000000000000000010111000000000101001001010101011101100000101000001011000100000000010100100001111011111100010001001010101011101100000101000001011100000000010100100100000000111101111110000000000000000001011100000000010100100101010101110110000010100000101100010000000001010010000111101111110001000100101010101110110000010100000101110000000001010010010000000011110111111000000000000000000101110000000001010010010101010111011000001010000010110001000000000101001000011110111111000100010010101010111011000001010000010111000000000101001001000000001111011111100000000000000000010111000000000101001001010101011101100000101000001011000100000000010100100001111011111100010001001010101011101100000101000001011100000000010100100100000000111101111110000000000000000001011100000000010100100101010101110110000010100000101100010000000001010010000111101111110001000100101010101110110000010100000101110000000001010010010000000011110111111000000000000000000101110000000001010010010101010111011000001010000010110001000000000101001000011110111111000100010010101010111011000001010000010111000000000101001001000000001111011111100000000000000000010111000000000101001001010101011101100000101000001011000100000000010100100001111011111100010001001010101011101100000101000001011100000000010100100100000000111101111110000000000000000001011100000000010100100101010101110110000010100000101100010000000001010010000111101111110001000100101010101110110000010100000101110000000001010010010000000011110111111000000000000000000101110000000001010010010101010111011000001010000010110001000000000101001000011110111111000100010010101010111011000001010000010111000000000101001001000000001111011111100000000000000000010111000000000101001001010101011101100000101000001011000100000000010100100001111011111100010001001010101011101100000101000001011100000000010100100100000000111101111110000000000000000001011100000000010100100101010101110110000010100000101100010000000001010010000111101111110001000100101010101110110000010100000101110000000001010010010000000011110111111000000000000000000101110000000001010010010101010111011000001010000010110001000000000101001000011110111111000100010010101010111011000001010000010111000000000101001001000000001111011111100000000000000000010111000000000101001001010101011101100000101000001011000100000000010100100001111011111100010001001010101011101100000101000001011100000000010100100100000000111101111110000000000000000001011100000000010100100101010101110110000010100000101100010000000001010010000111101111110001000100101010101110110000010100000101110000000001010010010000000011110111111000000000000000000101110000000001010010010101010111011000001010000010110001000000000101001000011110111111000100010010101010111011000001010000010111000000000101001001000000001111011111100000000000000000010111000000000101001001010101011101100000101000001011000100000000010100100001111011111100010001001010101011101100000101000001011100000000010100100100000000111101111110000000000000000001011100000000010100100101010101110110000010100000101100010000000001010010000111101111110001000100101010101110110000010100000101110000000001010010010000000011110111111000000000000000000101110000000001010010010101010111011000001010000010110001000000000101001000011110111111000100010010101010111011000001010000010111000000000101001001000000001111011111100000000000000000010111000000000101001001010101011101100000101000001011000100000000010100100001111011111100010001001010101011101100000101000001011100000000010100100100000000111101111110000000000000000001011100000000010100100101010101110110000010100000101100010000000001010010000111101111110001000100101010101110110000010100000101110000000001010010010000000011110111111000000000000000000101110000000001010010010101010111011000001010000010110001000000000101001000011110111111000100010010101010111011000001010000010111000000000101001001000000001111011111100000000000000000010111000000000101001001010101011101100000101000001011000100000000010100100001111011111100010001001010101011101100000101000001011100000000010100100100000000111101111110000000000000000001011100000000010100100101010101100110000010000100101100010000000001010011111100000001111101000100101010101110110000010100000101110000000001010010010000000011110111111000000000000000000101110000000001010010010101010110011000001000010010110001000000000101001111110000000111110100010010101010110011000001000010010111000000000101001101000001111000000011111000000000000000010111000000000101001001010101011001100000100001001011000100000000010100111111000000011111010001001010101011001100000100001001011100000000010100110010000111100000001111100000010010111000011100000000010100100101010101100110000010000100101100010000000001010011111100000001111101000100101010101100110000010000100101110000000001010011001000011110000000111110000000000000000101100001110001111000010101010110011000001000010010110001000000000101001111110000000111110100010010101010110011000001000010010111000000000101001100100001111000000011111000000000000000010110000111000111100101010101011001100000100001001011000000011100011110011111000000011111010001101010101011001100000100001001011000011100011110010010000111100000001111100000000000000001011000011100011110000101010101100110000010000100101100000001110001111000111100000001111101000100101010101100110000010000100101100001110001111000010000011110000000111110000000000000000101100001110001111000010101010110011000001000010010110000000111000111100011110000000111110100010010101010110011000001000010010110000111000111100001000001111000000011111000000000000000010110000111000111100001010101011001100000100001001011000000011100011110001111000000011111010001001010101011001100000100001001011000011100011110000100000111100000001111100000000000000001011000011100011110000101010101100110000010000100101100000001110001111000111100000001111101000100101010101100110000010000100101100001110001111000010000011110000000111110000000000000000101100001110001111000010101010110011000001000010010110000000111000111100011110000000111110100010010101010110011000001000010010110000111000111100001000001111000000011111000000000000000010110000111000111100001010101011001100000100001001011000000011100011110001111000000011111010001001010101011001100000100001001011000011100011110000100000111100000001111100000000000000001011000011100011110000101010101100110000010000100101100000001110001111000111100000001111101000100101010101100110000010000100101100001110001111000010000011110000000111110000000000000000101100001110001111000010101010110011000001000010010110000000111000111100011110000000111110100010010101010110011000001000010010110000111000111100001000001111000000011111000000000000000010110000111000111100001010101011001100000100001001011000000011100011110001111000000011111010001001010101011001100000100001001011000011100011110000100000111100000001111100000000000000001011000011100011110000101010101100110000010000100101100000001110001111000111100000001111101000100101010101100110000010000100101100001110001111000010000011110000000111110000000000000000101100001110001111000010101010110011000001000010010110000000111000111100011110000000111110100010010101010110011000001000010010110000111000111100001000001111000000011111000000000000000010110000111000111100001010101011001100000100001001011000000011100011110001111000000011111010001001010101011001100000100001001011000011100011110000100000111100000001111100000000000000001011000011100011110000101010101100110000010000100101100000001110001111000111100000001111101000100101010101100110000010000100101100001110001111000010000011110000000111110000000000000000101100001110001111000010101010110011000001000010010110000000111000111100011110000000111110100010010101010110011000001000010010110000111000111100001000001111000000011111000000000000000010110000111000111100001010101011001100000100001001011000000011100011110001111000000011111010001001010101011001100000100001001011000011100011110000100000111100000001111100000000000000001011000011100011110000101010101100110000010000100101100000001110001111000111100000001111101000100101010101100110000010000100101100001110001111000010000011110000000111110000000000000000101100001110001111000010101010110011000001000010010110000000111000111100011110000000111110100010010101010110011000001000010010110000111000111100001000001111000000011111000000000000000010110000111000111100001010101011001100000100001001011000000011100011110001111000000011111010001001010101011001100000100001001011000011100011110000100000111100000001111100000000000000001011000011100011110000101010101100110000010000100101100000001110001111000111100000001111101000100101010101100110000010000100101100001110001111000010000011110000000111110000000000000000101100001110001111000010101010110011000001000010010110000000111000111100011110000000111110100010010101010110011000001000010010110000111000111100001000001111000000011111000000000000000010110000111000111100001010101011001100000100001001011000000011100011110001111000000011111010001001010101011001100000100001001011000011100011110000100000111100000001111100000000000000001011000011100011110000101010101100110000010000100101100000001110001111000111100000001111101000100101010101100110000010000100101100001110001111000010000011110000000111110000000000000000101100001110001111000010101010110011000001000010010110000000111000111100011110000000111110100010010101010110011000001000010010110000111000111100001000001111000000011111000000000000000010110000111000111100001010101011001100000100001001011000000011100011110001111000000011111010001001010101011001100000100001001011000011100011110000100000111100000001111100000000000000001011000011100011110000101010101100110000010000100101100000001110001111000111100000001111101000100101010101100110000010000100101100001110001111000010000011110000000111110000000000000000101100001110001111000010101010110011000001000010010110000000111000111100011110000000111110100010010101010110011000001000010010110000111000111100001000001111000000011111000000000000000010110000111000111100001010101011001100000100001001011000000011100011110001111000000011111010001001010101011001100000100001001011000011100011110000100000111100000001111100000000000000001011000011100011110000101010101100110000010000100101100000001110001111000111100000001111101000100101010101100110000010000100101100001110001111000010000011110000000111110000000000000000101100001110001111000010101010110011000001000010010110000000111000111100011110000000111110100010010101010110011000001000010010110000111000111100001000001111000000011111000000000000000010110000111000111100001010101011001100000100001001011000000011100011110001111000000011111010001001010101011001100000100001001011000011100011110000100000111100000001111100000000000000001011000011100011110000101010101100110000010000100101100000001110001111000111100000001111101000100101010101100110000010000100101100001110001111000010000011110000000111110000000000000000101100001110001111000010101010111011000001000010010110000000111000111100110000000001010010100010010101010110011000001000010010110000111000111100001000001111000000011111000000000000000010110000111000111100001010101011101100000100001001011000000011100011110011000000000101001010001001010101011101100000100001001011000011100011110010100000100000000010100100000000000000001011000011100011110000101010101110110000010000100101100000001110001111001100000000010100101000100101010101110110000010000100101100001110001111001001000010000000001010010100001001011100001100001110001111000010101010111011000001000010010110000000111000111100110000000001010010100010010101010111011000001000010010110000111000111100100100001000000000101001000000000000000010110001001011110000001010101011101100000100001001011000000011100011110011000000000101001010001001010101011101100000100001001011000011100011110010010000100000000010100100000000000000001011000100101111000010101010101110110000010000100101100000010010111100001100000000010100101000110101010101110110000010000100101100010010111100001001000010000000001010010000000000000000101100010010111100000010101010111011000001000010010110000001001011110000010000000001010010100010010101010111011000001000010010110001001011110000001000001000000000101001000000000000000010110001001011110000001010101011101100000100001001011000000100101111000001000000000101001010001001010101011101100000100001001011000100101111000000100000100000000010100100000000000000001011000100101111000000101010101110110000010000100101100000010010111100000100000000010100101000100101010101110110000010000100101100010010111100000010000010000000001010010000000000000000101100010010111100000010101010111011000001000010010110000001001011110000010000000001010010100010010101010111011000001000010010110001001011110000001000001000000000101001000000000000000010110001001011110000001010101011101100000100001001011000000100101111000001000000000101001010001001010101011101100000100001001011000100101111000000100000100000000010100100000000000000001011000100101111000000101010101110110000010000100101100000010010111100000100000000010100101000100101010101110110000010000100101100010010111100000010000010000000001010010000000000000000101100010010111100000010101010111011000001000010010110000001001011110000010000000001010010100010010101010111011000001000010010110001001011110000001000001000000000101001000000000000000010110001001011110000001010101011101100000100001001011000000100101111000001000000000101001010001001010101011101100000100001001011000100101111000000100000100000000010100100000000000000001011000100101111000000101010101110110000010000100101100000010010111100000100000000010100101000100101010101110110000010000100101100010010111100000010000010000000001010010000000000000000101100010010111100000010101010111011000001000010010110000001001011110000010000000001010010100010010101010111011000001000010010110001001011110000001000001000000000101001000000000000000010110001001011110000001010101011101100000100001001011000000100101111000001000000000101001010001001010101011101100000100001001011000100101111000000100000100000000010100100000000000000001011000100101111000000101010101110110000010000100101100000010010111100000100000000010100101000100101010101110110000010000100101100010010111100000010000010000000001010010000000000000000101100010010111100000010101010111011000001000010010110000001001011110000010000000001010010100010010101010111011000001000010010110001001011110000001000001000000000101001000000000000000010110001001011110000001010101011101100000100001001011000000100101111000001000000000101001010001001010101011101100000100001001011000100101111000000100000100000000010100100000000000000001011000100101111000000101010101110110000010000100101100000010010111100000100000000010100101000100101010101110110000010000100101100010010111100000010000010000000001010010000000000000000101100010010111100000010101010111011000001000010010110000001001011110000010000000001010010100010010101010111011000001000010010110001001011110000001000001000000000101001000000000000000010110001001011110000001010101011101100000100001001011000000100101111000001000000000101001010001001010101011101100000100001001011000100101111000000100000100000000010100100000000000000001011000100101111000000101010101110110000010000100101100000010010111100000100000000010100101000100101010101110110000010000100101100010010111100000010000010000000001010010000000000000000101100010010111100000010101010111011000001000010010110000001001011110000010000000001010010100010010101010111011000001000010010110001001011110000001000001000000000101001000000000000000010110001001011110000001010101011101100000100001001011000000100101111000001000000000101001010001001010101011101100000100001001011000100101111000000100000100000000010100100000000000000001011000100101111000000101010101110110000010000100101100000010010111100000100000000010100101000100101010101110110000010000100101100010010111100000010000010000000001010010000000000000000101100010010111100000010101010111011000001000010010110000001001011110000010000000001010010100010010101010111011000001000010010110001001011110000001000001000000000101001000000000000000010110001001011110000001010101011101100000100001001011000000100101111000001000000000101001010001001010101011101100000100001001011000100101111000000100000100000000010100100000000000000001011000100101111000000101010101110110000010000100101100000010010111100000100000000010100101000100101010101110110000010000100101100010010111100000010000010000000001010010000000000000000101100010010111100000010101010111011000001000010010110000001001011110000010000000001010010100010010101010111011000001000010010110001001011110000001000001000000000101001000000000000000010110001001011110000001010101011101100000100001001011000000100101111000001000000000101001010001001010101011101100000100001001011000100101111000000100000100000000010100100000000000000001011000100101111000000101010101110110000010000100101100000010010111100000100000000010100101000100101010101110110000010000100101100010010111100000010000010000000001010010000000000000000101100010010111100000010101010111011000001000010010110000001001011110000010000000001010010100010010101010111011000001000010010110001001011110000001000001000000000101001000000000000000010110001001011110000001010101011101100000100001001011000000100101111000001000000000101001010001001010101011101100000100001001011000100101111000000100000100000000010100100000000000000001011000100101111000000101010101110110000010000100101100000010010111100000100000000010100101000100101010101110110000010000100101100010010111100000010000010000000001010010000000000000000101100010010111100000010101010111011000001000010010110000001001011110000010000000001010010100010010101010111011000001000010010110001001011110000001000001000000000101001000000000000000010110001001011110000001010101011001100000101001001011000000100101111000010000111000111100010001001010101011101100000100001001011000100101111000000100000100000000010100100000000000000001011000100101111000000101010101100110000010100100101100000010010111100001000011100011110001000100101010101100110000010100100101100010010111100001010000000001110001111000000000000000000101100010010111100000010101010110011000001010010010110000001001011110000100001110001111000100010010101010110011000001010010010110001001011110000100100000000111000111100000001100101110000110001001011110000001010101011001100000101001001011000000100101111000010000111000111100010001001010101011001100000101001001011000100101111000010010000000011100011110000000000000000001011000110100000101100101010101100110000010100100101100000010010111100001000011100011110001000100101010101100110000010100100101100010010111100001001000000001110001111000000000000000000101100011010000010111010101010110011000001010010010110000001101000001011100001110001111000100011010101010110011000001010010010110001101000001011100100000000111000111100000000000000000010110001101000001011001010101011001100000101001001011000000110100000101100000111000111100010001001010101011001100000101001001011000110100000101100100000000011100011110000000000000000001011000110100000101100101010101100110000010100100101100000011010000010110000011100011110001000100101010101100110000010100100101100011010000010110010000000001110001111000000000000000000101100011010000010110010101010110011000001010010010110000001101000001011000001110001111000100010010101010110011000001010010010110001101000001011001000000000111000111100000000000000000010110001101000001011001010101011001100000101001001011000000110100000101100000111000111100010001001010101011001100000101001001011000110100000101100100000000011100011110000000000000000001011 - 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111T1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 + 00010001100000010000000000010000101000000100000011000000100000000000100001000110000100000110000001000000000001000000001100000101000001100010000000010010000000011000000110000011000100000000100100001000110001000100000110001000000001001000010110000001001000001100010000000010010000001100000001000111100001100000000010100000011000000001001111000001000000000101000010110000010000011110000010000000001010000100001000010000111100000100000000010100000000010000010110000010001000000001101000000000100000011100000100010000000011010000100001000100011000001000100000000110100001000000000100110000010001000000001101000000000000000100001000000110000000000010000000000000000100010000000100000000000100001000000001000000100000001000000000001000010000000001000001000000010000000000010000000000000001000000000000100000000100100000000000000001000000000001000000001001000010000000010000000000000010000000010010000100001000010000000000000100000000100100000000010000010000000010011000000000101000000000100000010000000100010000000001010000100001000100000000001000100000000010100001000000000100000000010001000000000101000000000000000100001000000010000000011010000000000000000100010000000100000000110100001000000001000000100000001000000001101000010000000001000001000000010000000011010000000000000001000000000001100000000000100000000000000001000000000001000000000001000010000000010000000000000010000000000010000101010000010000000000000100000000000100000010100000010000010100001000000001001000000101000000010000101000010000000010010000101010000100000001010000100000000100100001001000000100000010100001000000001001000000010000000101010010000110000000001010000000100000000110100100000100000000010100001001000001000101001000001000000000101000010000100001001010010000010000000001010000000001000001001000001000100000000110100000000010000001010000010001000000001101000010000100010000100000100010000000011010000100000000010001000001000100000000110100000000000000010000100000011000000000001000000000000000010001000000010000000000010000100000000100000010000000100000000000100001000000000100000100000001000000000001000000000000000100000000000010000000010010000000000000000100000000000100000000100100001000000001000000000000001000000001001000010000000001000000000000010000000010010000000000000001000000000001100000000010100000000000000001000000000001000000000101000010000000010000000000000010000000001010000100000000010000000000000100000000010100000000000000010000000000001000000001101000000000000000010000000000010000000011010000100000000100000000000000100000000110100001000000000100000000000001000000001101000000000000000100000000000110000000000010000000000000000100000000000100000000000100001000000001000000000000001000000000001000010101000001000000000000010000000000010000001010000001000001010000100000000100100000010100000001000010100001000000001001000010101000010000000101000010000000010010000100100000010000001010000100000000100100000001000000010101001000011000000000101000000010000000011010010000010000000001010000100100000100010100100000100000000010100001010010000100101001000001000000000101000000100100000100100100100010000000011010000001001000000101001001000100000000110100001010010001000010010010001000000001101000010000000001000100100100010000000011010000000000000001010010000001100000000000100000000000000001100100000001000000000001000010000000010001001000000010000000000010000100000000010010010000000100000000000100000000000000010000000000001000000001001000000000000000010000000000010000000010010000100000000100000000000000100000000100100001000100000100000000000001000000001001000000001000000100000001000110000000001010000000010000000100000010000100000000010100001000100001000000000100001000000000101000010000000001000000001000010000000001010000000000000001000100000000100000000110100000000000000001001000000001000000001101000010000000010000010000000010000000011010000100000000010000100000000100000000110100000000000000010000000000011000000000001000000000000000010000000000010000000000010000100000000100000000000000100000000000100001010100000100000000000001000000000001000000101000000100000101000010000000010010000001010000000100001010000100000000100100001010100001000000010100001000000001001000010010000001000000101000010000000010010000000100000001010100100001100000000010100000001000000001101001000001000000000101000010010000010001010010000010000000001010000101001000010010100100000100000000010100000010010000010010010010001000000001101000000100100000010100100100010000000011010000101001000100001001001000100000000110100001001000000100010010010001000000001101000000010000000101001010000110000000000010000000100000000110010100000100000000000100001001000001000100101000001000000000001000010111100001001001010000010000000000010000001111000001001001111000100000000100100000011110000001010011110001000000001001000010111100010000100111100010000000010010000101111000010001001111000100000000100100000011110000010111111110011000000000101000000111100000011111111100010000000001010000101111000100011111111000100000000010100001000000000100111111110001000000000101000000000000000101111000000010000000011010000000000000000111110000000100000000110100001000000001000111100000001000000001101000010011100001001111000000010000000011010000000111000001000000111001100000000000100000001110000001000001110001000000000001000010011100010000000011100010000000000010000100000000010000000111000100000000000100000000000000010011100000001000000001001000000000000000010111000000010000000010010000100000000100001110000000100000000100100001000100000100011100000001000000001001000000001000000100000001000110000000001010000000010000000100000010000100000000010100001000100001000000000100001000000000101000010000000001000000001000010000000001010000000000000001000100000000100000000110100000000000000001001000000001000000001101000010000000010000010000000010000000011010000100001000010000100000000100000000110100000000010000010000000010011000000000001000000000100000010000000100010000000000010000100001000100000000001000100000000000100001000000000100000000010001000000000001000000000000000100001000000010000000010010000000000000000100010000000100000000100100001000000001000000100000001000000001001000010011100001000001000000010000000010010000000111000001000000111001100000000010100000001110000001000001110001000000000101000010011100010000000011100010000000001010000100000000010000000111000100000000010100000000000000010011100000001000000001101000000000000000010111000000010000000011010000100000000100001110000000100000000110100001000000000100011100000001000000001101000000000000000100000000000110000000000010000000000000000100000000000100000000000100001000000001000000000000001000000000001000010000000001000000000000010000000000010000000000000001000000000000100000000100100000000000000001000000000001000000001001000010000000010000000000000010000000010010000100010000010000000000000100000000100100000000100000010000000100011000000000101000000001000000010000001000010000000001010000100010000100000000010000100000000010100001000000000100000000100001000000000101000000000000000100010000000010000000011010000000000000000100100000000100000000110100001000000001000001000000001000000001101000010000100001000010000000010000000011010000000001000001000000001001100000000000100000000010000001000000010001000000000001000010000100010000000000100010000000000010000100001000010000000001000100000000000100000000010000010000100010001000000001001000000000100000010001000100010000000010010000100001000100000010001000100000000100100001001110000100000100010001000000001001000000011100000100001011100110000000001010000000111000000100010111000100000000010100001001110001000000101110001000000000101000010000000001000001011100010000000001010000000000000001001110000000100000000110100000000000000001011100000001000000001101000010000000010000111000000010000000011010000100000000010001110000000100000000110100000000000000010000000000011000000000001000000000000000010000000000010000000000010000100000000100000000000000100000000000100001010110000100000000000001000000000001000000101100000100000101100010000000010010000001011000000100001011000100000000100100001010110001000000010110001000000001001000010110100001000000101100010000000010010000001101000001010111101001100000000010100000011010000001101111010001000000000101000010110100010001011110100010000000001010000100001000010010111101000100000000010100000000010000010110100010001000000001101000000000100000011101000100010000000011010000100001000100011010001000100000000110100001000000000100110100010001000000001101000000000000000100001000000110000000000010000000000000000100010000000100000000000100001000000001000000100000001000000000001000010000000001000001000000010000000000010000000000000001000000000000100000000100100000000000000001000000000001000000001001000010000000010000000000000010000000010010000100000000010000000000000100000000100100000000000000010000000000011000000000101000000000000000010000000000010000000001010000100000000100000000000000100000000010100001000000000100000000000001000000000101000000000000000100000000000010000000011010000000000000000100000000000100000000110100001000000001000000000000001000000001101000010000000001000000000000010000000011010000000000000001000000000001100000000000100000000000000001000000000001000000000001000010000000010000000000000010000000000010000101000000010000000000000100000000000100000010000000010000010000001000000001001000000100000000010000100000010000000010010000101000000100000001000000100000000100100001000000000100000010000001000000001001000000000000000101000000000110000000001010000000000000000110000000000100000000010100001000000001000100000000001000000000101000010100100001001000000000010000000001010000001001000001000001001000100000000110100000010010000001000010010001000000001101000010100100010000000100100010000000011010000100000000010000001001000100000000110100000000000000010100100000011000000000001000000000000000011001000000010000000000010000100000000100010010000000100000000000100001000010000100100100000001000000000001000000000100000100000000100010000000010010000000001000000100000001000100000000100100001000010001000000000010001000000001001000010000000001000000000100010000000010010000000000000001000010000001100000000010100000000000000001000100000001000000000101000010000000010000001000000010000000001010000101101000010000010000000100000000010100000011010000010000011010001000000001101000000110100000010000110100010000000011010000101101000100000001101000100000000110100001001000000100000011010001000000001101000000010000000101101010000110000000000010000000100000000111010100000100000000000100001001000001000110101000001000000000001000010001000001001101010000010000000000010000000010000001001000010000100000000100100000000100000001010000100001000000001001000010001000010000100001000010000000010010000101000000010001000010000100000000100100000010000000010001010000011000000000101000000100000000010010100000010000000001010000101000000100000101000000100000000010100001000000000100001010000001000000000101000000000000000101000000000010000000011010000000000000000110000000000100000000110100001000000001000100000000001000000001101000010010000001001000000000010000000011010000000100000001000000100001100000000000100000001000000001000001000001000000000001000010010000010000000010000010000000000010000101111000010000000100000100000000000100000011110000010010011110001000000001001000000111100000010100111100010000000010010000101111000100001001111000100000000100100001011110000100010011110001000000001001000000111100000101111111100110000000001010000001111000000111111111000100000000010100001011110001000111111110001000000000101000010101100001001111111100010000000001010000001011000001011111011000100000000110100000010110000001111110110001000000001101000010101100010001111101100010000000011010000101111000010011111011000100000000110100000011110000010101111110011000000000001000000111100000011011111100010000000000010000101111000100010111111000100000000000100001010100000100101111110001000000000001000000101000000101111101000010000000010010000001010000000111111010000100000000100100001010100001000111110100001000000001001000010010000001001111101000010000000010010000000100000001010100100001100000000010100000001000000001101001000001000000000101000010010000010001010010000010000000001010000100001000010010100100000100000000010100000000010000010010000010001000000001101000000000100000010100000100010000000011010000100001000100001000001000100000000110100001000000000100010000010001000000001101000000000000000100001000000110000000000010000000000000000100010000000100000000000100001000000001000000100000001000000000001000010000000001000001000000010000000000010000000000000001000000000000100000000100100000000000000001000000000001000000001001000010000000010000000000000010000000010010000100000000010000000000000100000000100100000000000000010000000000011000000000101000000000000000010000000000010000000001010000100000000100000000000000100000000010100001000000000100000000000001000000000101000000000000000100000000000010000000011010000000000000000100000000000100000000110100001000000001000000000000001000000001101000010010000001000000000000010000000011010000000100000001000000100001100000000000100000001000000001000001000001000000000001000010010000010000000010000010000000000010000100011000010000000100000100000000000100000000110000010010000110001000000001001000000001100000010100001100010000000010010000100011000100001000011000100000000100100001011000000100010000110001000000001001000000110000000100011110000110000000001010000001100000000100111100000100000000010100001011000001000001111000001000000000101000010000100001000011110000010000000001010000000001000001011000001000100000000110100000000010000001110000010001000000001101000010000100010001100000100010000000011010000100000000010011000001000100000000110100000000000000010000100000011000000000001000000000000000010001000000010000000000010000100000000100000010000000100000000000100001000000000100000100000001000000000001000000000000000100000000000010000000010010000000000000000100000000000100000000100100001000000001000000000000001000000001001000010000100001000000000000010000000010010000000001000001000000001001100000000010100000000010000001000000010001000000000101000010000100010000000000100010000000001010000100000000010000000001000100000000010100000000000000010000100000001000000001101000000000000000010001000000010000000011010000100000000100000010000000100000000110100001000000000100000100000001000000001101000000000000000100000000000110000000000010000000000000000100000000000100000000000100001000000001000000000000001000000000001000010101000001000000000000010000000000010000001010000001000001010000100000000100100000010100000001000010100001000000001001000010101000010000000101000010000000010010000100100000010000001010000100000000100100000001000000010101001000011000000000101000000010000000011010010000010000000001010000100100000100010100100000100000000010100001000010000100101001000001000000000101000000000100000100100000100010000000011010000000001000000101000001000100000000110100001000010001000010000010001000000001101000010000000001000100000100010000000011010000000000000001000010000001100000000000100000000000000001000100000001000000000001000010000000010000001000000010000000000010000100000000010000010000000100000000000100000000000000010000000000001000000001001000000000000000010000000000010000000010010000100000000100000000000000100000000100100001000000000100000000000001000000001001000000000000000100000000000110000000001010000000000000000100000000000100000000010100001000000001000000000000001000000000101000010000000001000000000000010000000001010000000000000001000000000000100000000110100000000000000001000000000001000000001101000010000000010000000000000010000000011010000100000000010000000000000100000000110100000000000000010000000000011000000000001000000000000000010000000000010000000000010000100000000100000000000000100000000000100001010100000100000000000001000000000001000000101000000100000101000010000000010010000001010000000100001010000100000000100100001010100001000000010100001000000001001000010010000001000000101000010000000010010000000100000001010100100001100000000010100000001000000001101001000001000000000101000010010000010001010010000010000000001010000101001000010010100100000100000000010100000010010000010010010010001000000001101000000100100000010100100100010000000011010000101001000100001001001000100000000110100001000000000100010010010001000000001101000000000000000101001000000110000000000010000000000000000110010000000100000000000100001000000001000100100000001000000000001000010000000001001001000000010000000000010000000000000001000000000000100000000100100000000000000001000000000001000000001001000010000000010000000000000010000000010010000100100000010000000000000100000000100100000001000000010000001000011000000000101000000010000000010000010000010000000001010000100100000100000000100000100000000010100001000000000100000001000001000000000101000000000000000100100000000010000000011010000000000000000101000000000100000000110100001000000001000010000000001000000001101000010000000001000100000000010000000011010000000000000001000000000001100000000000100000000000000001000000000001000000000001000010000000010000000000000010000000000010000101010000010000000000000100000000000100000010100000010000010100001000000001001000000101000000010000101000010000000010010000101010000100000001010000100000000100100001001000000100000010100001000000001001000000010000000101010010000110000000001010000000100000000110100100000100000000010100001001000001000101001000001000000000101000010100100001001010010000010000000001010000001001000001001001001000100000000110100000010010000001010010010001000000001101000010100100010000100100100010000000011010000100100000010001001001000100000000110100000001000000010100101000011000000000001000000010000000011001010000010000000000010000100100000100010010100000100000000000100001011110000100100101000001000000000001000000111100000100100111100010000000010010000001111000000101001111000100000000100100001011110001000010011110001000000001001000010111100001000100111100010000000010010000001111000001011111111001100000000010100000011110000001111111110001000000000101000010111100010001111111100010000000001010000100000000010011111111000100000000010100000000000000010111100000001000000001101000000000000000011111000000010000000011010000100000000100011110000000100000000110100001011110000100111100000001000000001101000000111100000100000111100110000000000010000001111000000100001111000100000000000100001011110001000000011110001000000000001000010101100001000000111100010000000000010000001011000001011111011000100000000100100000010110000001111110110001000000001001000010101100010001111101100010000000010010000101101000010011111011000100000000100100000011010000010101111010011000000000101000000110100000011011110100010000000001010000101101000100010111101000100000000010100001010010000100101111010001000000000101000000100100000101101100100010000000011010000001001000000111011001000100000000110100001010010001000110110010001000000001101000010000000001001101100100010000000011010000000000000001010010000001100000000000100000000000000001100100000001000000000001000010000000010001001000000010000000000010000100000000010010010000000100000000000100000000000000010000000000001000000001001000000000000000010000000000010000000010010000100000000100000000000000100000000100100001000000000100000000000001000000001001000000000000000100000000000110000000001010000000000000000100000000000100000000010100001000000001000000000000001000000000101000010000000001000000000000010000000001010000000000000001000000000000100000000110100000000000000001000000000001000000001101000010000000010000000000000010000000011010000100000000010000000000000100000000110100000000000000010000000000011000000000001000000000000000010000000000010000000000010000100000000100000000000000100000000000100001010000000100000000000001000000000001000000100000000100000100000010000000010010000001000000000100001000000100000000100100001010000001000000010000001000000001001000010000000001000000100000010000000010010000000000000001010000000001100000000010100000000000000001100000000001000000000101000010000000010001000000000010000000001010000101001000010010000000000100000000010100000010010000010000010010001000000001101000000100100000010000100100010000000011010000101001000100000001001000100000000110100001000000000100000010010001000000001101000000000000000101001000000110000000000010000000000000000110010000000100000000000100001000000001000100100000001000000000001000010000100001001001000000010000000000010000000001000001000000001000100000000100100000000010000001000000010001000000001001000010000100010000000000100010000000010010000100000000010000000001000100000000100100000000000000010000100000011000000000101000000000000000010001000000010000000001010000100000000100000010000000100000000010100001011010000100000100000001000000000101000000110100000100000110100010000000011010000001101000000100001101000100000000110100001011010001000000011010001000000001101000010010000001000000110100010000000011010000000100000001011010100001100000000000100000001000000001110101000101000000000001000010010000010001101010001010000000000010000100010000010011010100010100000000000100000000100000010010000100101000000001000010000001000010000100001001010000000010001000010010000100001000010010100000000100010000100100001000010000100101000000001000100001001000010000100001001010000000010001000010010000100001000010010100000000100010000100100001000010000100101000000001000100001001000010000100001001010000000010001000010010000100001000010010100000000100010000111100001000010000100101000000001000100001111000010000100001001010000000010001000011110000100001000010010100000000100010000111100001000010000100101000000001000100001111000010000100001001010000000010001000011111000100001000010010100000000100010000111110001000010000100101000000001000100001111101010000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011100001000010010100000000100010000111110111000010000100101000000001000100001111101110000100001001010000000010001000011111011 + 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111T1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 @@ -1056,7 +771,7 @@ trigger;]]> - + diff --git a/fw/unused/device_arbiter.v b/fw/unused/device_arbiter.v deleted file mode 100644 index 8ec7690..0000000 --- a/fw/unused/device_arbiter.v +++ /dev/null @@ -1,91 +0,0 @@ -module device_arbiter #( - parameter NUM_CONTROLLERS = 2, - parameter ADDRESS_WIDTH = 26, - parameter [3:0] DEVICE_BANK = 4'd0, - parameter ACK_FIFO_LENGTH = 4 -) ( - input i_clk, - input i_reset, - - input [(NUM_CONTROLLERS - 1):0] i_request, - input [(NUM_CONTROLLERS - 1):0] i_write, - output reg [(NUM_CONTROLLERS - 1):0] o_busy, - output reg [(NUM_CONTROLLERS - 1):0] o_ack, - input [((NUM_CONTROLLERS * 4) - 1):0] i_bank, - input [((NUM_CONTROLLERS * ADDRESS_WIDTH) - 1):0] i_address, - output reg [((NUM_CONTROLLERS * 32) - 1):0] o_data, - input [((NUM_CONTROLLERS * 32) - 1):0] i_data, - - output reg o_device_request, - output reg o_device_write, - input i_device_busy, - input i_device_ack, - output reg [(ADDRESS_WIDTH - 1):0] o_device_address, - input [31:0] i_device_data, - output reg [31:0] o_device_data -); - - localparam FIFO_ADDRESS_WIDTH = $clog2(ACK_FIFO_LENGTH); - - reg [(NUM_CONTROLLERS - 1):0] r_request; - reg [(NUM_CONTROLLERS - 1):0] r_request_successful; - - reg [(NUM_CONTROLLERS - 1):0] r_ack_fifo_mem [0:(ACK_FIFO_LENGTH - 1)]; - - reg [FIFO_ADDRESS_WIDTH:0] r_ack_fifo_wrptr; - reg [FIFO_ADDRESS_WIDTH:0] r_ack_fifo_rdptr; - - wire w_ack_fifo_wrreq = |(r_request_successful & ~i_write); - wire w_ack_fifo_rdreq = i_device_ack; - - wire w_empty = r_ack_fifo_wrptr[FIFO_ADDRESS_WIDTH] == r_ack_fifo_rdptr[FIFO_ADDRESS_WIDTH]; - wire w_full_or_empty = r_ack_fifo_wrptr[(FIFO_ADDRESS_WIDTH - 1):0] == r_ack_fifo_rdptr[(FIFO_ADDRESS_WIDTH - 1):0]; - - wire w_ack_fifo_full = !w_empty && w_full_or_empty; - - always @(posedge i_clk) begin - if (i_reset) begin - r_ack_fifo_wrptr <= {(FIFO_ADDRESS_WIDTH + 1){1'b0}}; - r_ack_fifo_rdptr <= {(FIFO_ADDRESS_WIDTH + 1){1'b0}}; - end else begin - if (w_ack_fifo_wrreq) begin - r_ack_fifo_mem[r_ack_fifo_wrptr[(FIFO_ADDRESS_WIDTH - 1):0]] <= r_request_successful & ~i_write; - r_ack_fifo_wrptr <= r_ack_fifo_wrptr + 1'd1; - end - if (w_ack_fifo_rdreq) begin - r_ack_fifo_rdptr <= r_ack_fifo_rdptr + 1'd1; - end - end - end - - always @(*) begin - for (integer i = 0; i < NUM_CONTROLLERS; i = i + 1) begin - r_request[i] = i_request[i] && i_bank[(i * 4) +: 4] == DEVICE_BANK; - o_busy[i] = r_request[i] && ( - i_device_busy || - |(r_request & (({{(NUM_CONTROLLERS - 1){1'b0}}, 1'b1} << i) - 1)) || - (!i_write[i] && w_ack_fifo_full) - ); - end - - r_request_successful = r_request & ~o_busy; - o_ack = {NUM_CONTROLLERS{i_device_ack}} & r_ack_fifo_mem[r_ack_fifo_rdptr[(FIFO_ADDRESS_WIDTH - 1):0]]; - o_data = {NUM_CONTROLLERS{i_device_data}}; - end - - always @(*) begin - o_device_request = |r_request; - o_device_write = 1'b0; - o_device_address = {ADDRESS_WIDTH{1'b0}}; - o_device_data = 32'h0000_0000; - - for (integer i = (NUM_CONTROLLERS - 1); i >= 0 ; i = i - 1) begin - if (r_request[i]) begin - o_device_write = i_write[i]; - o_device_address = i_address[(i * ADDRESS_WIDTH) +: ADDRESS_WIDTH]; - o_device_data = i_data[(i * 32) +: 32]; - end - end - end - -endmodule diff --git a/fw/unused/fifo8.qip b/fw/unused/fifo8.qip deleted file mode 100644 index c1da614..0000000 --- a/fw/unused/fifo8.qip +++ /dev/null @@ -1,4 +0,0 @@ -set_global_assignment -name IP_TOOL_NAME "FIFO" -set_global_assignment -name IP_TOOL_VERSION "20.1" -set_global_assignment -name IP_GENERATED_DEVICE_FAMILY "{MAX 10}" -set_global_assignment -name VERILOG_FILE [file join $::quartus(qip_path) "fifo8.v"] diff --git a/fw/unused/fifo8.v b/fw/unused/fifo8.v deleted file mode 100644 index 54c6de1..0000000 --- a/fw/unused/fifo8.v +++ /dev/null @@ -1,179 +0,0 @@ -// megafunction wizard: %FIFO% -// GENERATION: STANDARD -// VERSION: WM1.0 -// MODULE: scfifo - -// ============================================================ -// File Name: fifo8.v -// Megafunction Name(s): -// scfifo -// -// Simulation Library Files(s): -// altera_mf -// ============================================================ -// ************************************************************ -// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! -// -// 20.1.1 Build 720 11/11/2020 SJ Lite Edition -// ************************************************************ - - -//Copyright (C) 2020 Intel Corporation. All rights reserved. -//Your use of Intel Corporation's design tools, logic functions -//and other software and tools, and any partner logic -//functions, and any output files from any of the foregoing -//(including device programming or simulation files), and any -//associated documentation or information are expressly subject -//to the terms and conditions of the Intel Program License -//Subscription Agreement, the Intel Quartus Prime License Agreement, -//the Intel FPGA IP License Agreement, or other applicable license -//agreement, including, without limitation, that your use is for -//the sole purpose of programming logic devices manufactured by -//Intel and sold by Intel or its authorized distributors. Please -//refer to the applicable agreement for further details, at -//https://fpgasoftware.intel.com/eula. - - -// synopsys translate_off -`timescale 1 ps / 1 ps -// synopsys translate_on -module fifo8 ( - clock, - data, - rdreq, - sclr, - wrreq, - almost_empty, - almost_full, - empty, - full, - q); - - input clock; - input [7:0] data; - input rdreq; - input sclr; - input wrreq; - output almost_empty; - output almost_full; - output empty; - output full; - output [7:0] q; - - wire sub_wire0; - wire sub_wire1; - wire sub_wire2; - wire sub_wire3; - wire [7:0] sub_wire4; - wire almost_empty = sub_wire0; - wire almost_full = sub_wire1; - wire empty = sub_wire2; - wire full = sub_wire3; - wire [7:0] q = sub_wire4[7:0]; - - scfifo scfifo_component ( - .clock (clock), - .data (data), - .rdreq (rdreq), - .sclr (sclr), - .wrreq (wrreq), - .almost_empty (sub_wire0), - .almost_full (sub_wire1), - .empty (sub_wire2), - .full (sub_wire3), - .q (sub_wire4), - .aclr (), - .eccstatus (), - .usedw ()); - defparam - scfifo_component.add_ram_output_register = "ON", - scfifo_component.almost_empty_value = 2, - scfifo_component.almost_full_value = 1023, - scfifo_component.intended_device_family = "MAX 10", - scfifo_component.lpm_numwords = 1024, - scfifo_component.lpm_showahead = "ON", - scfifo_component.lpm_type = "scfifo", - scfifo_component.lpm_width = 8, - scfifo_component.lpm_widthu = 10, - scfifo_component.overflow_checking = "ON", - scfifo_component.underflow_checking = "ON", - scfifo_component.use_eab = "ON"; - - -endmodule - -// ============================================================ -// CNX file retrieval info -// ============================================================ -// Retrieval info: PRIVATE: AlmostEmpty NUMERIC "1" -// Retrieval info: PRIVATE: AlmostEmptyThr NUMERIC "2" -// Retrieval info: PRIVATE: AlmostFull NUMERIC "1" -// Retrieval info: PRIVATE: AlmostFullThr NUMERIC "1023" -// Retrieval info: PRIVATE: CLOCKS_ARE_SYNCHRONIZED NUMERIC "1" -// Retrieval info: PRIVATE: Clock NUMERIC "0" -// Retrieval info: PRIVATE: Depth NUMERIC "1024" -// Retrieval info: PRIVATE: Empty NUMERIC "1" -// Retrieval info: PRIVATE: Full NUMERIC "1" -// Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "MAX 10" -// Retrieval info: PRIVATE: LE_BasedFIFO NUMERIC "0" -// Retrieval info: PRIVATE: LegacyRREQ NUMERIC "0" -// Retrieval info: PRIVATE: MAX_DEPTH_BY_9 NUMERIC "0" -// Retrieval info: PRIVATE: OVERFLOW_CHECKING NUMERIC "0" -// Retrieval info: PRIVATE: Optimize NUMERIC "1" -// Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" -// Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" -// Retrieval info: PRIVATE: UNDERFLOW_CHECKING NUMERIC "0" -// Retrieval info: PRIVATE: UsedW NUMERIC "0" -// Retrieval info: PRIVATE: Width NUMERIC "8" -// Retrieval info: PRIVATE: dc_aclr NUMERIC "0" -// Retrieval info: PRIVATE: diff_widths NUMERIC "0" -// Retrieval info: PRIVATE: msb_usedw NUMERIC "0" -// Retrieval info: PRIVATE: output_width NUMERIC "8" -// Retrieval info: PRIVATE: rsEmpty NUMERIC "1" -// Retrieval info: PRIVATE: rsFull NUMERIC "0" -// Retrieval info: PRIVATE: rsUsedW NUMERIC "0" -// Retrieval info: PRIVATE: sc_aclr NUMERIC "0" -// Retrieval info: PRIVATE: sc_sclr NUMERIC "1" -// Retrieval info: PRIVATE: wsEmpty NUMERIC "0" -// Retrieval info: PRIVATE: wsFull NUMERIC "1" -// Retrieval info: PRIVATE: wsUsedW NUMERIC "0" -// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all -// Retrieval info: CONSTANT: ADD_RAM_OUTPUT_REGISTER STRING "ON" -// Retrieval info: CONSTANT: ALMOST_EMPTY_VALUE NUMERIC "2" -// Retrieval info: CONSTANT: ALMOST_FULL_VALUE NUMERIC "1023" -// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "MAX 10" -// Retrieval info: CONSTANT: LPM_NUMWORDS NUMERIC "1024" -// Retrieval info: CONSTANT: LPM_SHOWAHEAD STRING "ON" -// Retrieval info: CONSTANT: LPM_TYPE STRING "scfifo" -// Retrieval info: CONSTANT: LPM_WIDTH NUMERIC "8" -// Retrieval info: CONSTANT: LPM_WIDTHU NUMERIC "10" -// Retrieval info: CONSTANT: OVERFLOW_CHECKING STRING "ON" -// Retrieval info: CONSTANT: UNDERFLOW_CHECKING STRING "ON" -// Retrieval info: CONSTANT: USE_EAB STRING "ON" -// Retrieval info: USED_PORT: almost_empty 0 0 0 0 OUTPUT NODEFVAL "almost_empty" -// Retrieval info: USED_PORT: almost_full 0 0 0 0 OUTPUT NODEFVAL "almost_full" -// Retrieval info: USED_PORT: clock 0 0 0 0 INPUT NODEFVAL "clock" -// Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data[7..0]" -// Retrieval info: USED_PORT: empty 0 0 0 0 OUTPUT NODEFVAL "empty" -// Retrieval info: USED_PORT: full 0 0 0 0 OUTPUT NODEFVAL "full" -// Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q[7..0]" -// Retrieval info: USED_PORT: rdreq 0 0 0 0 INPUT NODEFVAL "rdreq" -// Retrieval info: USED_PORT: sclr 0 0 0 0 INPUT NODEFVAL "sclr" -// Retrieval info: USED_PORT: wrreq 0 0 0 0 INPUT NODEFVAL "wrreq" -// Retrieval info: CONNECT: @clock 0 0 0 0 clock 0 0 0 0 -// Retrieval info: CONNECT: @data 0 0 8 0 data 0 0 8 0 -// Retrieval info: CONNECT: @rdreq 0 0 0 0 rdreq 0 0 0 0 -// Retrieval info: CONNECT: @sclr 0 0 0 0 sclr 0 0 0 0 -// Retrieval info: CONNECT: @wrreq 0 0 0 0 wrreq 0 0 0 0 -// Retrieval info: CONNECT: almost_empty 0 0 0 0 @almost_empty 0 0 0 0 -// Retrieval info: CONNECT: almost_full 0 0 0 0 @almost_full 0 0 0 0 -// Retrieval info: CONNECT: empty 0 0 0 0 @empty 0 0 0 0 -// Retrieval info: CONNECT: full 0 0 0 0 @full 0 0 0 0 -// Retrieval info: CONNECT: q 0 0 8 0 @q 0 0 8 0 -// Retrieval info: GEN_FILE: TYPE_NORMAL fifo8.v TRUE -// Retrieval info: GEN_FILE: TYPE_NORMAL fifo8.inc FALSE -// Retrieval info: GEN_FILE: TYPE_NORMAL fifo8.cmp FALSE -// Retrieval info: GEN_FILE: TYPE_NORMAL fifo8.bsf FALSE -// Retrieval info: GEN_FILE: TYPE_NORMAL fifo8_inst.v FALSE -// Retrieval info: GEN_FILE: TYPE_NORMAL fifo8_bb.v FALSE -// Retrieval info: LIB_FILE: altera_mf diff --git a/fw/unused/sdram.vhd b/fw/unused/sdram.vhd deleted file mode 100644 index 921f49d..0000000 --- a/fw/unused/sdram.vhd +++ /dev/null @@ -1,445 +0,0 @@ --- __ __ __ __ __ __ --- /\ "-.\ \ /\ \/\ \ /\ \ /\ \ --- \ \ \-. \ \ \ \_\ \ \ \ \____ \ \ \____ --- \ \_\\"\_\ \ \_____\ \ \_____\ \ \_____\ --- \/_/ \/_/ \/_____/ \/_____/ \/_____/ --- ______ ______ __ ______ ______ ______ --- /\ __ \ /\ == \ /\ \ /\ ___\ /\ ___\ /\__ _\ --- \ \ \/\ \ \ \ __< _\_\ \ \ \ __\ \ \ \____ \/_/\ \/ --- \ \_____\ \ \_____\ /\_____\ \ \_____\ \ \_____\ \ \_\ --- \/_____/ \/_____/ \/_____/ \/_____/ \/_____/ \/_/ --- --- https://joshbassett.info --- https://twitter.com/nullobject --- https://github.com/nullobject --- --- Copyright (c) 2020 Josh Bassett --- --- Permission is hereby granted, free of charge, to any person obtaining a copy --- of this software and associated documentation files (the "Software"), to deal --- in the Software without restriction, including without limitation the rights --- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell --- copies of the Software, and to permit persons to whom the Software is --- furnished to do so, subject to the following conditions: --- --- The above copyright notice and this permission notice shall be included in all --- copies or substantial portions of the Software. --- --- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR --- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, --- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE --- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER --- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, --- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE --- SOFTWARE. - -library ieee; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; -use ieee.math_real.all; - --- This SDRAM controller provides a symmetric 32-bit synchronous read/write --- interface for a 16Mx16-bit SDRAM chip (e.g. AS4C16M16SA-6TCN, IS42S16400F, --- etc.). -entity sdram is - generic ( - -- clock frequency (in MHz) - -- - -- This value must be provided, as it is used to calculate the number of - -- clock cycles required for the other timing values. - CLK_FREQ : real := 100.0; - - -- 32-bit controller interface - ADDR_WIDTH : natural := 25; - DATA_WIDTH : natural := 32; - - -- SDRAM interface - SDRAM_ADDR_WIDTH : natural := 13; - SDRAM_DATA_WIDTH : natural := 16; - SDRAM_COL_WIDTH : natural := 10; - SDRAM_ROW_WIDTH : natural := 13; - SDRAM_BANK_WIDTH : natural := 2; - - -- The delay in clock cycles, between the start of a read command and the - -- availability of the output data. - CAS_LATENCY : natural := 2; -- 2=below 133MHz, 3=above 133MHz - - -- The number of 16-bit words to be bursted during a read/write. - BURST_LENGTH : natural := 2; - - -- timing values (in nanoseconds) - -- - -- These values can be adjusted to match the exact timing of your SDRAM - -- chip (refer to the datasheet). - T_DESL : real := 100000.0; -- startup delay - T_MRD : real := 14.0; -- mode register cycle time - T_RC : real := 60.0; -- row cycle time - T_RCD : real := 15.0; -- RAS to CAS delay - T_RP : real := 15.0; -- precharge to activate delay - T_WR : real := 22.0; -- write recovery time - T_REFI : real := 7800.0 -- average refresh interval - ); - port ( - -- reset - reset : in std_logic := '0'; - - -- clock - clk : in std_logic; - - -- address bus - addr : in unsigned(ADDR_WIDTH-1 downto 0); - - -- input data bus - data : in std_logic_vector(DATA_WIDTH-1 downto 0); - - -- When the write enable signal is asserted, a write operation will be performed. - we : in std_logic; - - -- When the request signal is asserted, an operation will be performed. - req : in std_logic; - - -- The acknowledge signal is asserted by the SDRAM controller when - -- a request has been accepted. - ack : out std_logic; - - -- The valid signal is asserted when there is a valid word on the output - -- data bus. - valid : out std_logic; - - -- output data bus - q : out std_logic_vector(DATA_WIDTH-1 downto 0); - - -- SDRAM interface (e.g. AS4C16M16SA-6TCN, IS42S16400F, etc.) - sdram_a : out unsigned(SDRAM_ADDR_WIDTH-1 downto 0); - sdram_ba : out unsigned(SDRAM_BANK_WIDTH-1 downto 0); - sdram_dq : inout std_logic_vector(SDRAM_DATA_WIDTH-1 downto 0); - sdram_cke : out std_logic; - sdram_cs_n : out std_logic; - sdram_ras_n : out std_logic; - sdram_cas_n : out std_logic; - sdram_we_n : out std_logic; - sdram_dqml : out std_logic; - sdram_dqmh : out std_logic - ); -end sdram; - -architecture arch of sdram is - function ilog2(n : natural) return natural is - begin - return natural(ceil(log2(real(n)))); - end ilog2; - - subtype command_t is std_logic_vector(3 downto 0); - - -- commands - constant CMD_DESELECT : command_t := "1---"; - constant CMD_LOAD_MODE : command_t := "0000"; - constant CMD_AUTO_REFRESH : command_t := "0001"; - constant CMD_PRECHARGE : command_t := "0010"; - constant CMD_ACTIVE : command_t := "0011"; - constant CMD_WRITE : command_t := "0100"; - constant CMD_READ : command_t := "0101"; - constant CMD_STOP : command_t := "0110"; - constant CMD_NOP : command_t := "0111"; - - -- the ordering of the accesses within a burst - constant BURST_TYPE : std_logic := '0'; -- 0=sequential, 1=interleaved - - -- the write burst mode enables bursting for write operations - constant WRITE_BURST_MODE : std_logic := '0'; -- 0=burst, 1=single - - -- the value written to the mode register to configure the memory - constant MODE_REG : unsigned(SDRAM_ADDR_WIDTH-1 downto 0) := ( - "000" & - WRITE_BURST_MODE & - "00" & - to_unsigned(CAS_LATENCY, 3) & - BURST_TYPE & - to_unsigned(ilog2(BURST_LENGTH), 3) - ); - - -- calculate the clock period (in nanoseconds) - constant CLK_PERIOD : real := 1.0/CLK_FREQ*1000.0; - - -- the number of clock cycles to wait before initialising the device - constant INIT_WAIT : natural := natural(ceil(T_DESL/CLK_PERIOD)); - - -- the number of clock cycles to wait while a LOAD MODE command is being - -- executed - constant LOAD_MODE_WAIT : natural := natural(ceil(T_MRD/CLK_PERIOD)); - - -- the number of clock cycles to wait while an ACTIVE command is being - -- executed - constant ACTIVE_WAIT : natural := natural(ceil(T_RCD/CLK_PERIOD)); - - -- the number of clock cycles to wait while a REFRESH command is being - -- executed - constant REFRESH_WAIT : natural := natural(ceil(T_RC/CLK_PERIOD)); - - -- the number of clock cycles to wait while a PRECHARGE command is being - -- executed - constant PRECHARGE_WAIT : natural := natural(ceil(T_RP/CLK_PERIOD)); - - -- the number of clock cycles to wait while a READ command is being executed - constant READ_WAIT : natural := CAS_LATENCY+BURST_LENGTH; - - -- the number of clock cycles to wait while a WRITE command is being executed - constant WRITE_WAIT : natural := BURST_LENGTH+natural(ceil((T_WR+T_RP)/CLK_PERIOD)); - - -- the number of clock cycles before the memory controller needs to refresh - -- the SDRAM - constant REFRESH_INTERVAL : natural := natural(floor(T_REFI/CLK_PERIOD))-10; - - type state_t is (INIT, MODE, IDLE, ACTIVE, READ, WRITE, REFRESH); - - -- state signals - signal state, next_state : state_t; - - -- command signals - signal cmd, next_cmd : command_t := CMD_NOP; - - -- control signals - signal start : std_logic; - signal load_mode_done : std_logic; - signal active_done : std_logic; - signal refresh_done : std_logic; - signal first_word : std_logic; - signal read_done : std_logic; - signal write_done : std_logic; - signal should_refresh : std_logic; - - -- counters - signal wait_counter : natural range 0 to 16383; - signal refresh_counter : natural range 0 to 1023; - - -- registers - signal addr_reg : unsigned(SDRAM_COL_WIDTH+SDRAM_ROW_WIDTH+SDRAM_BANK_WIDTH-1 downto 0); - signal data_reg : std_logic_vector(DATA_WIDTH-1 downto 0); - signal we_reg : std_logic; - signal q_reg : std_logic_vector(DATA_WIDTH-1 downto 0); - - -- aliases to decode the address register - alias col : unsigned(SDRAM_COL_WIDTH-1 downto 0) is addr_reg(SDRAM_COL_WIDTH-1 downto 0); - alias row : unsigned(SDRAM_ROW_WIDTH-1 downto 0) is addr_reg(SDRAM_COL_WIDTH+SDRAM_ROW_WIDTH-1 downto SDRAM_COL_WIDTH); - alias bank : unsigned(SDRAM_BANK_WIDTH-1 downto 0) is addr_reg(SDRAM_COL_WIDTH+SDRAM_ROW_WIDTH+SDRAM_BANK_WIDTH-1 downto SDRAM_COL_WIDTH+SDRAM_ROW_WIDTH); -begin - -- state machine - fsm : process (state, wait_counter, req, we_reg, load_mode_done, active_done, refresh_done, read_done, write_done, should_refresh) - begin - next_state <= state; - - -- default to a NOP command - next_cmd <= CMD_NOP; - - case state is - -- execute the initialisation sequence - when INIT => - if wait_counter = 0 then - next_cmd <= CMD_DESELECT; - elsif wait_counter = INIT_WAIT-1 then - next_cmd <= CMD_PRECHARGE; - elsif wait_counter = INIT_WAIT+PRECHARGE_WAIT-1 then - next_cmd <= CMD_AUTO_REFRESH; - elsif wait_counter = INIT_WAIT+PRECHARGE_WAIT+REFRESH_WAIT-1 then - next_cmd <= CMD_AUTO_REFRESH; - elsif wait_counter = INIT_WAIT+PRECHARGE_WAIT+REFRESH_WAIT+REFRESH_WAIT-1 then - next_state <= MODE; - next_cmd <= CMD_LOAD_MODE; - end if; - - -- load the mode register - when MODE => - if load_mode_done = '1' then - next_state <= IDLE; - end if; - - -- wait for a read/write request - when IDLE => - if should_refresh = '1' then - next_state <= REFRESH; - next_cmd <= CMD_AUTO_REFRESH; - elsif req = '1' then - next_state <= ACTIVE; - next_cmd <= CMD_ACTIVE; - end if; - - -- activate the row - when ACTIVE => - if active_done = '1' then - if we_reg = '1' then - next_state <= WRITE; - next_cmd <= CMD_WRITE; - else - next_state <= READ; - next_cmd <= CMD_READ; - end if; - end if; - - -- execute a read command - when READ => - if read_done = '1' then - if should_refresh = '1' then - next_state <= REFRESH; - next_cmd <= CMD_AUTO_REFRESH; - elsif req = '1' then - next_state <= ACTIVE; - next_cmd <= CMD_ACTIVE; - else - next_state <= IDLE; - end if; - end if; - - -- execute a write command - when WRITE => - if write_done = '1' then - if should_refresh = '1' then - next_state <= REFRESH; - next_cmd <= CMD_AUTO_REFRESH; - elsif req = '1' then - next_state <= ACTIVE; - next_cmd <= CMD_ACTIVE; - else - next_state <= IDLE; - end if; - end if; - - -- execute an auto refresh - when REFRESH => - if refresh_done = '1' then - if req = '1' then - next_state <= ACTIVE; - next_cmd <= CMD_ACTIVE; - else - next_state <= IDLE; - end if; - end if; - end case; - end process; - - -- latch the next state - latch_next_state : process (clk, reset) - begin - if reset = '1' then - state <= INIT; - cmd <= CMD_NOP; - elsif rising_edge(clk) then - state <= next_state; - cmd <= next_cmd; - end if; - end process; - - -- the wait counter is used to hold the current state for a number of clock - -- cycles - update_wait_counter : process (clk, reset) - begin - if reset = '1' then - wait_counter <= 0; - elsif rising_edge(clk) then - if state /= next_state then -- state changing - wait_counter <= 0; - else - wait_counter <= wait_counter + 1; - end if; - end if; - end process; - - -- the refresh counter is used to periodically trigger a refresh operation - update_refresh_counter : process (clk, reset) - begin - if reset = '1' then - refresh_counter <= 0; - elsif rising_edge(clk) then - if state = REFRESH and wait_counter = 0 then - refresh_counter <= 0; - else - refresh_counter <= refresh_counter + 1; - end if; - end if; - end process; - - -- latch the rquest - latch_request : process (clk) - begin - if rising_edge(clk) then - if start = '1' then - -- we need to multiply the address by two, because we are converting - -- from a 32-bit controller address to a 16-bit SDRAM address - addr_reg <= shift_left(resize(addr, addr_reg'length), 1); - data_reg <= data; - we_reg <= we; - end if; - end if; - end process; - - -- latch the output data as it's bursted from the SDRAM - latch_sdram_data : process (clk) - begin - if rising_edge(clk) then - valid <= '0'; - - if state = READ then - if first_word = '1' then - q_reg(31 downto 16) <= sdram_dq; - elsif read_done = '1' then - q_reg(15 downto 0) <= sdram_dq; - valid <= '1'; - end if; - end if; - end if; - end process; - - -- set wait signals - load_mode_done <= '1' when wait_counter = LOAD_MODE_WAIT-1 else '0'; - active_done <= '1' when wait_counter = ACTIVE_WAIT-1 else '0'; - refresh_done <= '1' when wait_counter = REFRESH_WAIT-1 else '0'; - first_word <= '1' when wait_counter = CAS_LATENCY else '0'; - read_done <= '1' when wait_counter = READ_WAIT-1 else '0'; - write_done <= '1' when wait_counter = WRITE_WAIT-1 else '0'; - - -- the SDRAM should be refreshed when the refresh interval has elapsed - should_refresh <= '1' when refresh_counter >= REFRESH_INTERVAL-1 else '0'; - - -- a new request is only allowed at the end of the IDLE, READ, WRITE, and - -- REFRESH states - start <= '1' when (state = IDLE) or - (state = READ and read_done = '1') or - (state = WRITE and write_done = '1') or - (state = REFRESH and refresh_done = '1') else '0'; - - -- assert the acknowledge signal at the beginning of the ACTIVE state - ack <= '1' when state = ACTIVE and wait_counter = 0 else '0'; - - -- set output data - q <= q_reg; - - -- deassert the clock enable at the beginning of the INIT state - sdram_cke <= '0' when state = INIT and wait_counter = 0 else '1'; - - -- set SDRAM control signals - (sdram_cs_n, sdram_ras_n, sdram_cas_n, sdram_we_n) <= cmd; - - -- set SDRAM bank - with state select - sdram_ba <= - bank when ACTIVE, - bank when READ, - bank when WRITE, - (others => '0') when others; - - -- set SDRAM address - with state select - sdram_a <= - "0010000000000" when INIT, - MODE_REG when MODE, - row when ACTIVE, - "0010" & col when READ, -- auto precharge - "0010" & col when WRITE, -- auto precharge - (others => '0') when others; - - -- decode the next 16-bit word from the write buffer - sdram_dq <= data_reg((BURST_LENGTH-wait_counter)*SDRAM_DATA_WIDTH-1 downto (BURST_LENGTH-wait_counter-1)*SDRAM_DATA_WIDTH) when state = WRITE else (others => 'Z'); - - -- set SDRAM data mask - sdram_dqmh <= '0'; - sdram_dqml <= '0'; -end architecture arch; diff --git a/fw/unused/usb_fifo.sv b/fw/unused/usb_fifo.sv deleted file mode 100644 index 110c89c..0000000 --- a/fw/unused/usb_fifo.sv +++ /dev/null @@ -1,46 +0,0 @@ -module usb_fifo #( - parameter FIFO_LENGTH = 1024, - parameter FIFO_WIDTH = 8 -) ( - if_system.sys system_if, - - input flush, - - output full, - input write, - input [(FIFO_WIDTH - 1):0] wdata, - - output empty, - input read, - output reg [(FIFO_WIDTH - 1):0] rdata -); - - localparam FIFO_ADDRESS_WIDTH = $clog2(FIFO_LENGTH); - - reg [(FIFO_WIDTH - 1):0] r_fifo_mem [0:(FIFO_LENGTH - 1)]; - - reg [FIFO_ADDRESS_WIDTH:0] r_fifo_wrptr; - reg [FIFO_ADDRESS_WIDTH:0] r_fifo_rdptr; - - wire w_full_or_empty = r_fifo_wrptr[(FIFO_ADDRESS_WIDTH - 1):0] == r_fifo_rdptr[(FIFO_ADDRESS_WIDTH - 1):0]; - - assign empty = r_fifo_wrptr == r_fifo_rdptr; - assign full = !empty && w_full_or_empty; - - always_ff @(posedge system_if.clk) begin - rdata <= r_fifo_mem[r_fifo_rdptr[(FIFO_ADDRESS_WIDTH - 1):0]]; - if (system_if.reset || flush) begin - r_fifo_wrptr <= {(FIFO_ADDRESS_WIDTH + 1){1'b0}}; - r_fifo_rdptr <= {(FIFO_ADDRESS_WIDTH + 1){1'b0}}; - end else begin - if (write) begin - r_fifo_mem[r_fifo_wrptr[(FIFO_ADDRESS_WIDTH - 1):0]] <= wdata; - r_fifo_wrptr <= r_fifo_wrptr + 1'd1; - end - if (read) begin - r_fifo_rdptr <= r_fifo_rdptr + 1'd1; - end - end - end - -endmodule