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