1101101000101011110001111111010010111100100100000101001100010000100100010110101111010110111110000100100101101000010111000001011001111011110111001111111001111111111001111111110100001000101111001101111001111001110111100001111110011000010100000100010111111000111010110101110111001110101010111100110110011101110100011111000000110000100101001100010101111010000101110100001101101001101100011000010011001110 1011110111100000011000111101011111010110010110000101011101010011000011101010001011010110100111100110111111100111011001101100111100111110010010000000011101111111101111110100010011111101010000001111101110100000000001100001110111110010110000100110101100101100001001100111011101100001100100000010101011100010000010101000101111000011011101010010001101000011110001101011110011001001010000011101001111100101 0101000101000011101000101110000010101001000101111011011100101001101101001100110111110111010010000101100100001000000101111010000011101000001101100001010100110111000101111101100111010010111111111111101111001111110101110100011110110100011101100110010100010100101110000011010010101001100111000011101010011010101001111111101001111111010001011000110110011000010010000101111010110111100011000000001110100000 1001100101001101111000001111010100011001011011000101111110100010001001001111101001110011010111010000110111011010001100011010111001110110011011101001001110110011010101111110110001100100000010011100000010000111100010010010011001100111000101010110111110110010000110011011101101111100101001011111101000010100110100101000011000111101010001001100000110100101110001100101000110000100111001000010000101000111 1000010101101000111001101100010110011111100110111000001100101000101000011011000000001010111101011111100000011110111000111101001010000101101001111000111010010111100011001010010001110101011110111110100111100100101100100010011101101011000011001011100100111100100000110110010001110100100101000101001000001101000000011101111000001111000110000100001010010001010111100100100110111010100010100000110011011001 0100101011111111101000111101000011101011000000010010111001101001100000011111010011001111011100010010110000111000110110001011110010111101011111011010100111110111101000011000111001101101011001100011000011000001110100110101111111001000001100010101000100001001011011111101000111010010111011100101011110100111101101101011010100000000100110101000000001001010100010100011110101100101011110110110110000101011 0111010001010010111010010110111001111011101111111110110000000001010000000011111000111100010010000001111011100011110101001001110111111010110111001011010010011111001000110100100000100101001001101001111000000011010111111010011010101100110101100000111101001110001001110010101110110001001011101110010111010110110101010100100110010010011100101101000110010001001010000111000100001000011100101011001001011111 1100100001111100000010011101000001000010000000010000001110001110100010010010000110001011001010000010000101000101000011011110100001011001101101100011110001001001101010101000011011111101101100010000110101110101001001000100110011000111111001101101001111010101110110100110111110111011100010100100000010110000100000100100110110010100110110110001100011101101001010010111101110100110010110011001010101010000 1001000111110001001110010010110000100000110001100100110111101110001101011010000010110101001000011000011101000010000100100001101100110010101010101110000011100011111010101110110001000010000101000000101110001001010000100100010001010000101110110000011111110100110111000110110110111001010101011011111010100011001011000100000110000011000010100101010010001100011100010001001111111001010101011011111000100100 0111101001101011101110001001011010000010011101001011011111011001010011000011101111101110111011011100001110001100001110110001000011110010110111101010010100010000011000001011010100011000100011001110011000101111101011001111011111000100100101110010011111010011100001000110001001000010001111101010000010011111000100000101011001101111011110000010000000101010001010100101100010100000101111101010010100001111 0010110111110111101000101000010000000111001000011111110011100001110111110011100100110100000101111010000000010000010101100011011100111111111110010010110010110101110001111101001101010001100100110001110010111111100000010001101010101111100100110111111100101101101000011000100100110010010100100111000001010110111101011010110101100010010101110111010011011111000101101001011101110010111111111101001110011011 0110010010110110110010111101000001111101001011100010001110111011100110100011011111000010111000011011001010111110101000010001100010010110001001001010000111010111101110010100100101011010000100011101011000001101000000000000001110111001111011110010110100101011001101110001111001000011001111011101111001011101111111000001001000000101000101110111011000011110110111100101110001101010110100010001100111110010 0110101000111111111110011011110000111011000001011100000110001101001111010010100011111011010001011111000011110111110010000000011011000111010001101110111101000011110101010110011101001000010001011110001111101111001110100000101100011011010110011010011110001111110001101101111011001101101111000110111011101011100110110011001000011101011001010110101110010100110011100100111010011010111100001101000101100100 1011011010101111011000001111000001000001010000110101101001101001101101001001111110101100010011011111101101001111011010110100001111001001100011000011111100100010001110010110011100001110000001010011111110001010100000011101101100001100111010100101100000000110100000111101000100010001100010010001000101101100111001101010100010111001000100010100100010100111100001101011001001111110000011110010011010000011 0100011001011101100000010100000111111000111001100001011111100011000000101000001000000000101000111110011110110011101110101111011011000001101000101001101110100000110010100100110000011110001011000011010110100110111100101001111000000000011100101001111100011101100010010110111010111101100110110001001101011000101011111100111100001001011010101010011010001011110010000111110001100101010111011110110001011110 1110111001101111001111110100101011110011011111000101000000011000101000111101001101001011111011100100110011111000001111010010001110000000001100000101000110100100011001011011110111000001000100000010110100100101100001101110100001111000001001010111101000100100010111101011000101110000001000000110011011101010001010001100110000011111001010100010010011101110101000001000001100101100010011011011010001111111 1001000101111110011011000110100000111011010000110100001001011011011000001101111001000100000001000101100101100101011101101101001100110000011110010100101101000100011111110110110011101001110100111000100100110001000010111001110001101010011000111100110100101100101000100111111001011110010111101100010111111111101000010001000111000110011000001011111100011000111111010101001001001101100100111011010111110010 1110000010110000000110001001000011001110100011111100110000101011101001010000101111110011001111110111100110111101011001111110110101100001101111000010010001010100100100111011001100100011001111110110110110010111100110110010010010110001110100110011110100111011111100110000111101010101100110101001010001001111111010000110111000001011110010100010111111011001011001010010000110000010100111110101000010000010 1010001111101010110010100011100100100111010101111010010110000101000111010011111111101101001001111110011010101101100101000001011010101001111001001110011111010111011000001000000101111011010010000001110010101110000101110111011111100101011000011101110010010001111000111100111100010110101001010001101011000010100000101111110000000000011010101110100101011011110110011111011000010010100011111100100001011111 1011110111111100100000000100111000001010010000000001010010111001000101110000010110000100111110101101011101001011100100101100110101000001110100101010001000001010101111010100010110100010110010100000101000010010001100000110110001100001100011001001111000011100111100011110111011001011110110010000001000110111011001001111001011011100011101010010010100001000000011100110110000011111010010011000001010010000 0011000000010010100000110011101101111011100000101011010100000101010010011011001110000110000101110011100111100100100010100100101000000011001001101000111001010010111100110001001011100111000011100000101100111001100010111011101001000000101111111001100000111100011010110111001011011101100000001000001110100010101011111000001100010101011011001111111111010010101011011110101100011001010001000011111101010010 0110000101101111001110011000000100010101011100001100100010011101001110110001011100111010000001110000100101011110010001010010101001001001101100011101111011110101101100010001110010011011110110100001010111011010111100110001101100111101001010111101110110010100100110111001011011000000001100001110000110010100100101010011100011011011010000110100001101011110011110011010111001010011111011011111100000001100 1000000110101010011000111011011010101100011011101011100000110000111111100111110110101111000101000101111000101000011100010001110111011110001100000011100100100011111110111010100111101111000000111001010100101101011010100101101000111110110110001100010001111000111100000000111111010100110101110110011111000110100000010100110000101101011110010000011000011100100101011001000110101001000011100000100100000011 0011111110000001110010101010000101011101001001110010000001001000111111011001101100100000110011001110000101111001111100100010110000100110111110000111100011001101100110010011001100101011001010111010000001110110100000000001001000001001101101010100101101100101011000001011111101001011000101111100110010100101000001110101101111111111110111000111000001101110010100111001100110111100101000001111000110110011 0000000111010010110010101011001000000000111110010011110111111011010001100010001010010010000010001011000010000101010011011100110000011010100000100100000010101001000100010000011010011101010100111110000001001011000111101110000111101000011111111000111100010011111101111110101100100011010110110100101010100011100011011000011100000101001011000101111010001101010100000110100010111010001011001101101111010001 1101100011110001001101010011101011100000011010011100101011110010111001100101101100100101111000011011000101010010110010011101001111000101110010000100010011111111110001010001000011001100011101101111101001110001101100010101000001101011111111011110110101110101010111011011101111000100111100101101110101100110011111000100110111000010010101110110011011010000100100000101011010011111010010000010111010101111 0011010100000000101010101000100101001000111101111101101110010000100010100000101000101011000011000111000100001010110110001000010101000001000001000110111100001100100000101010100000100110111001100001001110010011011010011100101100001001001000110101100000011000010100110011100001111110101111010111111001110001111110000000010001001101010011100001110011110100100111001110110010111001010101101001001000000011 0000011000010110101110101100100010110111110110001001011111001111110110100101000100110100011101100010100111010011000011011101100101001111010100011001101100111010001100011000101111000100011100101001000011011111011011100000010110110100100010100110001001111011010111101111010101100110001001001011010000101011111100011001001110000011001101111011011101001111011010111100011110010110000101100001010111001111 1010000001011000001010011001001111001101110111010001110001110001101000010000100100010010110101011110000000110100111100101010111101011101000010000011011111100010101110111110100001010000000001110101101101011100001110110011111001111001011000010001011101101000001000110010110011101001110001111011111010101001100100101100101011100001101011100100101011001010101111111110011110110001010101000110000001111111 0010011101000010010110100010100101101011100001011101011010110001110101001111110010000010000101010010011010001001100010101111011000011011000001001110101010101011010110111000100111110010100011110010100110011111001000001000100111010101001011110011110110011001100011010011100100111000001100110101100100001010111111001100010100110110011010101000001010000001110010100000101110101110101001110100100101101100 0011111101011100011001111110100101110111110001011001101111000001111101100110001101101011010010110011110101110100111100011010000111001010100001010110110100110000001001011110011000100000000001000010110101001010010110000010001011101100000010010101000000101111010000101010010110011100100001111010011100010000001010100110101011100111011100010010010110111001100011110111001111111110101110100011001000011110 1001001010110111101111101011101101001101000100011111100011011101100000000110011101000101100100110010000111100101110010100110110010001000110110111111100000000101111100000110001101100110110100000010100100011100001001001011100001100101110100001100100100100111001010101100110111111110111101100010011100000001101100111100101101101100000010011100000111100000101011100110000011110000101101011110100000011011 0000001000111010110110010000101000000001100011110001000011101001000011101000111101011101001100101011000100010001111100110101110000111000000101001000000001100010000110110000000000110100001100111010100001010010011111101101011001011111000001001101100011100110000000011001001100101110001111000010001011000011111101111001001010010101111001101111000001011011110111110111110011111110101111001001000110001010 1011111110010001101100000010001011011111010111000111010101100110110101011010011110101110110110010001011001000111111101101110011111001110110100110101010000100000111100101101011011000110100011100001101110111011001000010101000101111110010001001011000101101101110100110101000100000110001111110111011001010000100010111110101110001101001110000101110001100011001000001110100100100100001110011101100000001111 1000010000010010011100000011100011110010101011001010110111101011100011011100100100111001010010001000111001011001111000010100111011000111100111001111100001100111011001100101101000101100111110101111000101110100110011100000011111100100101001010010100100111100101001111110101010110100111010111010000000100000001000100001000111110101110011001100111110101001110011101000100101110000010111010100000110111100 0100010000010100011001101000110000100111011001010111110011011010110100001001100100110000110111111110001111001000101100110110100111011100111010011110110001001010001001011010001101100110010111000101110101000110001001110011100110100110100011000010111011010000000101010100011000011000001100000001001011101111010010111110011000011111101111011110010000001010000100110011100001010111111011011111011010010001 1001110100011110000000101101111010010110100110000000000001011100010001000010100011100001001100000110011001000000101011110000111011101011001100001000111100101000101010101100110110100000101001110000110100101011101100010011010001001100000001100101001010000111000100101001101101111100110111011111011111011111000110010000011100001010101001001110000011111111011111010000011100001100010010011010000101101101 0110100000010011000001100001010101110000000010100001010011011011100111101110111111001010111011101110110110010101101001010110101000001111110001001000111101011111111100100111000011001100111111001111101101000000111101000111101001100111101101101100111000011010111011011111101011000110010010111111010101011011010010001110101100100111001100111010010000011001111100000111101000011001100011110011111010101000 1100001000000001001100011100110101100010010101010000010100100011111010100011010011110111101100100110001011001001010101011111011111000111001010011000001110111010001010010101010010001101010010110101000000001110011110011001111100110000010010101111000010011101110100110111010100010110000001110001111100101100011011000001101010111011010000100011100111000100011110110111001010000011111001100110010010101000 1101110011001011011011011001000010110111001101001001101111010010101000101100110110001001010010011100011111000111001100101100011001111001011100001100111100010001100001100111100111000101011100100110010101100100100000010000110100001110011001011010100000101111100011001111000100000011110010100111001110011000111101111010111111000000101001111010000010101001101111110101101111000001000110111000011011001000 1110101001000010101001000000000001001010000110000000100101000111010111100011110101010011010110000000111001011111111001110000110100110000010001000101010110101110110001011101100010101010000010010111101000111000011110111111111101001001001000101100000001111011000011100111101111011101001011011110011000011111010011110000010010100011001000111101100101010101010010100010000111100110011111010101101101101000 1011001110100010001000111010111000100101010010000011010111010101111110110000100111000101000110111110111000001100101100101010001000100110011100111110001001111001010010011111011000111100111100011100110110111000111110100101101001100111101010010001101100010001100100011000111010010111001010111110110010001000000101101111010111101100010100111011101110001111000001111000001111011011011001001001010110010101 0101101101100010101110000111111011010111000010001011110111011101101000110000101000011100001010001111110100010000110011111000010001111001010100011011001110000000001010000101101101011110111111010001010010001101000011100110000011001100000001010001111110001111010111110011010001010000100110101011000010111000001111001100011111100101100100100001100110100000000010100010101000000010101100101100000010101001 0111101111101111111110100101010110111101000101100100110111101110010000111000110110011111000111000001011010010000111111111100011110100111010100110010011000010010100100001000010111100110110111101011010100011001111001000110111100111010100111111101110001110011001001101110100110110101011011010101101011011010000101100011010111101010010100010011011001011010100000110001111100101101000110100010001101000111 1000100101100000010100101011001011010100011100010111000001101100001000100110000100011110100010110111010011111011010100001110001101000000110101100000111110101010001110011111101100111111011000001111000000010001011000110000111111000101000101011110111111001001001111100110011000011001000110001000100001100111010111110111111001110111110101111100100110101000110001010100101010111011101111000101000001000111 1110110011100010111000111111011010000011111110101011111011111110011001101000001111010110011111111000001001011011001010001111001101001010000111110111010101111111101000100001101011001110010111111011000101011111111111000100011111110100110100010000011001111001100000100000111101111011111111110111101100001101110100010001110111100011110111010010010011100111110100000010011111111111111110011001111011010010 1111111110101101001100111001110110110110001101101010010111010001111101110101001111111000110010111000010010011110011001011011110010010110000110111010011000000011101101101011011111110010111001110101000110001100010000101010010110001000101001011111010101011000111010001101000101001000101100000001111010011111000010001011100110000000001101010001110001001001010001011011101011101111110110011111101111000000 0001011101010000100001110111100001011011011001000000000101001110011011111000101001001110001000101001011011000000011011010101100011101110100111000000110100011101000110100100001011110111010010010001111101010010010001101001101101010111001011101101000000101100010111011000011000011010111000111111011110101111100010100100001100010111100101000010100010011111011111000011001001101111000001101000011100111111 0001001101111000111010000000010101001110111010100101001101110010100101110010000101001010110101011110101110101111000101011101100101011000011111011101000101111001001001110110110000001101001000101110001011101000111100111101011110010011100111110111111001101001010101111000111110010010001000110010110010111011111110011011011111011111001101010100010000100000001100011101010101111010011010100001111110101010 0101011011010101110000100010000001111100000111111110011111001101000110100111000000000001011110110110001010000001111000011110001011111000000101101101110010100100101100111010111000100001001101100001011101010101110010100101001110111100110101000011001110111100011110011000010000000100000110100001111010101100100001001101001010010101001111111010011001000010111011111110110100010000110001001010011110111101 0001000011101101011111011010111011010001010100111100000001100101001110010101110010011010111110110111110110001000101011000010010000010111011001111001100100010111010111011011101111101110100011011001011100011010101101110001111001010011011010010000000000000101111100000100100110001110011101010011101001100010111011110010010011101101010001010100100001100100100100000101111101001110100100100000111110011110 0100101111000011010000100001000110010101011110100111100001100011011100011000111000111001101100001111101001001111100010101010001000000010110111010110101100001000111111111011111101001011000000110000010101101000010010110101001110110101000001101111100011110011011010111111010010100001100010001110110001111101100010001101011000010011111010011011110101011101110100100010000110100110010001000100010111101010 1011101110110011001100110101000111110100111100010011110010100101101010000011111001101101101110001001100010111010001110101110110001000101010110001011001011000011001110101001011101000001011101011110111100001100010101111000010000001010101110101111101110000111001001101110110101110011010001110001101111100100111111100100010010011110001110011001111011100011100110011001001010101101000101111001101111001001 0000101111100100110100110001001100101011010111001110001100100010000110010111100001111100110110000110100101011001110101010101010010001111100000101101100001110111011100001101010100011110100001001000100101100011101110011001111111110010011100100010011111101000100110011011011111000011000110100011111110101001010111001101001101110101010010010110110110010100010011010010010010011011110011001100000100001000 0111101011010011100111110000101000101110110010101011000001111110001100100010011111111101011010000011110110110111100111110010001101110010111011011101011100000011011001001100110101000100000111000011010100111110000001011001000101000111111101100100101011001001101011010100110100000111001110111101111010110001100000110000110110001111000001111100101100001000101111000100011101101111011110100100111011100011 1010010101111010100011011110011011110001011010111011000100010000010010110101101011010111010001101011011110101110111100010100000001001111001101101100000111110001000100001000111000001000100000110101101111101011111111100100000110001000101000011101000110010101111001001000101010011000101110011000011011010000101011111101101100001100110000101101001101001111110000111011011110001111011111101011101000100010 0011111001000011001101000011000001011101010111110101011001000001100110011000110011000110111011000011011011000010010000111101110000001111101010110011001010011100111110111001111011011011000110100101100110111011001010101011011000100110001100101011100101010011001110001110000011011110000100100000001100011011100110111101011011110011101000101000100100010101000101011111101101000011001001101001001100100011 1011111100100111101000010100101101010000100110100000101000001100000100001101101101101101000101000010000001100111000100001011000011011010011100001111101101010110000101010011110001101101000000111010011110001111001000010111001010011011000101001100110000100101100100001101001001110000111010110110010011011111000110011101011111011011001101000110001000001110110001100011111100011011111000110111101011101011 1010010111101010100110001101011100011111010100011100111100001110000101101110011010110101010110010110111100011010011101110001011010101111101011000011000101011100000111110000000010010111110101111011001111100010000000101001111111010100100100011010000110010001011100010110000001000101000011100011101111001001101111010011000011001110001010101011100110101100110001010110010011010101011000011100100100101111 1110110000110000111011101011001101010001101011001011110010010010101011101010100101100110011111001110100010000011000111101001011000110101111111001010000111110100111100110100011001010100111011001110100010000001001001111110011100111111111001000001001101110101111011110011100110100110011101011000101011110110101101111100010000111001001110011010001010101010111000101011101110111011010001010101111010010000 0101101010001101000001010111101100100101000001111100101101000101111000000100110110010101100100100011110001000000011100011111010101101011100011111010100011011000111011100000100100011100010011010000101110010110000001010000111101001101111011000011100100110000011010011100110100000110011100001100101100101101000100101010110111011010100000110110001000100001010101010000010111001101010000110111000111011000 1001101010011101001011001001101111111000100111001011101011010110100101010110010101110111100111000010000000000110101010101110011001000101001010000000111000010000100101111011001111100010101001010101011001001000110101001100101010001010101010111010110000100000111000000010110101001101001110110000110000001100100100100100001110110000001011000011101011010000111110101101100010011000100101100001001100100010 0101101011101001111011001011011110001110011101001001000010100100100001100111011110010000001100000001011111000001010110011111010001001011011001010101111011100010100110010101110100100001000001001110001100101000001001000110001101101001000101011111111111110100010100000000010100111001010011110111111010001110000011011100100100110000100010101101100000010110100011010101101011101010100101000000001011101010 0011110100001110010010011000001011001001000111100001110111011011100001111001100001110110110111101111001111101100011100000111010010010101001001110100011000011010011110111001110111111010011011111110010110011010101010101100111010001110011101101111101010010001000010110000110010000110111011111010101100101001111001110000110101100000011100010111001110010000011001110101101101010000100011001011110011000101 1111000101011101101100000110100110011100010101111100010000100101110100000010000011101011100110100000000100001001010000011111111100000000110101011011011110111010100010000101000010111110100001011110000010000000110011101001000100000001100000100010010010110011010111100010110001110100001100101001110010001100011000101011010101101011100010010011000011000110000011100110111111000000111110100100100101011010 0111010110110100111010011000011010000100111101100010100110110011101000010111101010000101011110011110011110001101111001111011011010011101101101001111100110011100000001110111011110110110111011111101101101011010110101110101000100101111111100000111111100000100011001010000100110010110110100000100110011001110011001100101111100111100001101100001010000110101011011101110011010100000010111110110110010110111 0101010001001010101000101000111010011111100001001010100110100011111101010110101010001101011101011010110010010110011000111011000000111011001011101010000100000010111101110000010110000111011010110000101011000110111101011101011000111111010010101001111010011111011111101000101110111100110001101001000011111010111001011100011111111001000001100011110001001100011001011001101011110001100100001000111111111100 0111111000111100111111110101000111111101010001101101000111101111011110011000111011010100100110100100010111100101101011000110000110111000001000100000111011000110110100011111111101110011011001000110010100100001111100010101111010001100011001000101011100100011110110010100010101001001101011001000011010101110110110100010101001101011110011100011100000011001101100101100010000000101000100110101101110011000 1010011111101100110101001010101000110010000101100001111111100100110000001011110010100100001010110000010010011110101111011011111101111100001100010011011110100000010010010101110110011011101101011110100010100010000101001011001111010000100100010000011101111011101101001011011010111000101001011100001100010001101101011101011001011101100011110111110110000010110111001111010100001100111110111011110011101100 1111100011111100100001100110011000101001101011000011100011011001111000100111011111100011101100000110000101001001100111011111111011100010100010001101110000111000100001110110111010010111010101001110011110100011001100011111100110000010011111111111011010100110000110010100000101111100100001000001001010001111001001011010011000110100110110001000011111001100100101011011011111111010000101111101101001100110 1011000001000000000010010000001000000000100000101101101001110111000001110111010110011010101100010111000110111111100001001001000110011001011011100011000111110100111110110101001001010001100101101011111000100110101101101111010100010101000000001111100010001001101010101100100100001101100010111101111111110011010111010101110011000001000010100011100101111011010000110111110000011111000101111001010011001010 1001011110100110110011111101100100111011100000000001111100111010000010011011111100111010111111100111001110101010001100100111111010010000110100110100111111011000001101111111011110001101011101101101000000010101011011010111111110001110101011100011000110010111000011110110100000111111000100111001001100111011001011011101101000000001010101101100101010010100001101010100001011000101100011110010111101100000 1011001111110001001110001011010010001010011111001011000111110101111001000111010111011011111100011011101101110010111100110001100111100001001011010101000101100100000111000111000111001100100010111000001011101101110010110111101111000100110100000010111101010111110001110100110001000001110010000101100010101111011111010011011011010101101101010100011010100111101111110001111100111001001010100010010001110011 1100110100101100100111011011000010001011000111100110111100110001001101111100111011010101001010010111101100100100011101000001110011000011100100000100001111000010011010100101100110100111011011011110000010010100100111111111000010000111011110100001010101111100001110011111101111110101110111111110110001100111101000100111110001010110100011100110001011000111110010000010111111001110010000001110011111111110 0001000111001110100011110010001111111111110101010010110101101001001000000000100001011100100000110100111010111110000000110001111111000011000011100001001010110101001101100000000001101101010100100100110101110101101100110110011110011111100000010011001010111001010010100010011001001000111101111001111111101101111011000001110111010011001000101100110010011101100010000101001011100001100100000000111111000110 0101000000001010000001011101000110000001111001110001100110000100011000110010010101110000111100000000111111100010010001101100101111010000010110111010101101000101100110010001000101110010011110100001100000001101101110001000110001101010110011000110100100010111110001001101001100110000010010100010001101101110011001010110100000011101000011010110110011100111111111011000100101001001110101010101010010111011 0010010010111010101110000000100100001010100101001001100011100111101010001110000001000011011110001011111100001011000110001011011001000100111001100100010100100011011011001111000000111011111110110001000110001110100000011001001001011001010010101111001010000100000100100000101110000011001011001110100011000111111110101010010011000100000111100001000011100010100000010010000010001001001110111010101110110010 1110010000001111011010011110110010010111001001100010100001001001110101001101010101110010101110010101100111101001000110001111110011110100111010111001111010100001110110001111110100101101101000101100010100101011001110011011100010111001010010100110011000010101101100010011000011001001000110110110001010011110000001101000011000110000011001000110010100010101111110011100011111000111110001010111110010010100 1100011010000101110010010110101000001111101101110101110111100011010111100101101110101010101111010111010011111111001011110010001001010101110111011011110110101011100110000110101110010000111101010101110111011010101110000000101110110110010011001001010111100110010010011011001000001101101010111011110110000101001010110001111001011111000001101101010010100011011101111110000111110001110111010111001100100010 0110100110010110011011011011101101010111101111001011100000101100101110011111000001101111011110000110010101010111000010110101001100100011001001010010111100110111111101011101010010000010000101100010011111000101000000101011001111111111100101100101111100011001010000110001110101000001010110000011001001011010010110100100011100000011110011011000100111011110000010100100011010011101110011110101011101100001 0111110000110100001001100101110001010000001001011100110000100011011011001010100100100110011001001101111001100110100000010010001000011010000111111001000011101110010001000110011010001011101011001100100011111111000001101110011000100101000110111101001110010110110000001111101111001101111110011010011001110110010001000001110011011110000111010101000000101011101000110110111010011011111101110111100101001001 0111010111011100000111010011111100011011000001000000001000110111011011000101111111000000001000010101011110101000010011000000010110011010110010100101000000100111111100101011010110101011000110101000011101010011011101001010001000110111011000001110100001111110110101110110110111110010111100101011101100111101101001110100001111111100100000001001111100011111101111111000000111111010010011011011000101011001 0111011000010111010110111001001001011001110100000100000110010010101011100001001100100000111111000111111010000000100101010001110101010001001000110101010001010110110001011111000001110011100000110011001111100100001000110010000100100110100010111111000100001101001101000001101110000111100001010010100000011101001101100110111000110110110100101011111101110110010101001010101010001011010100001011111000110000 1011011110010001111010010110000010100001110111111010110000100011111001011011110010011111111100110010110000000011011100110010000011001101010011101100011001101100111000000110001001110110111101001000111111110100000111100011100011001001101111100110011101100110011010000100110010100111101011001011010101001100110110111001001110101111100011010100100000111011000011000100011010101101001110100011011011010111 1111111011011111100110010011101000111110010110110110101001011010111100010010100111001100101110110010000110111010000000100001101100010111011110011001001110001101001111001010111000101011111100110101000010100000010110011011011000100100110100000011111111010011101111110000101010001111111100111010111001101000011010110100010011111100110100100010011111000101110011010000011101111101001111111110000110100100 1110111010010110001011011011110100100011000001101101110001101010110001100001011111101011101001100001111111001111011001011111110001000000100110110011101111110101110000101100110000101100110100101101000011010100010011110101101111011001010001001010110000111010100110110011011011010100101010111100100100111111110101010101011001101000111111101110111110011011000011110000001011000111011001100010010000011100 0111010011010011010110110001000111111110101001010000011011010000010011100000110101110010111000111100010101000110011011011000110110101110110010000011100111010000111001000001110001001011000001100001110000011111110001110110011101010110111101011101110100101000110111111111110111010000001011010011000111000100001111110000001011111011111011110000101010110101101000011100000001011001000101110010011010010000 1101011000100101010111000011011111000101110100101100101011111101111000000000001110000010000011011101110000110111001110111001110010001000011001100000111111101000101111111000101100100110000111010000011100100011101110011010011010100111111111000101011110001001101100111110010111100111001010111111011111000011100011001000110110010110010110110011000110110110010110100110100100000000101100011111000100001110 0001101110000011111010100110011000010010111110110011111000100111000010110110110111011000000001000111001001000110011110101011100100001110010001110010101000010110001001001110100000100111100101010111011100101000000000101111000000010111110111101010111001010011111110000010010000111111010110000111001110101010110111111001111111010100111000010110100111110111011001100010100111000011101110010111111111001110 1011000100111000001101101001011100010111010111000010001100100100010001110010001000000110010100110111110001000110000001111100010000010000101011011111100110100111011011100010110100100101000001111000111001001110100010001001111011001000110011011111101100000101011010111111000101001000111111001011111100110110010010011100111011000010101100111001110100101010111011101000000011011101010110101101111100001100 0011010010111100101000101110000000001111100010110111011010101100111110010001010011010100011100000110100110100001111101010011000000011011001011001111110111111000100010110100111010101010111011011010010100010101101111000011110010111010110111001000101011000001111001010111011011111011000000011110000000111011101111101001010111011000001110110010100101000010101000111010000011011111011000110001111001110110 1000110011110010111100100101001100000111010110000001101000100011101011011110110011011011011100100011011001010001110110000001000010011001001001011111111000110101011001011110111110000001001101100110110111011011100101001110111010010101001101111100101100111001010110011101011111101111001010111011010110101011000110100101111001101110111101001001111001101111000111111001011100111111011101110100100010100000 0110101101000101100010010000101011111000100010010101011010011101100101110011000111001101110111111110001101011111010011011011011101101000010101010000001111101100010001111110111000111000100000010100100101001001001101100101000000001100010000101010111110111101011001101001101010101011100000010011000010111100001011010101001110100011110101001111111100010000100001000000000101110110110101110010100111011111 1101100101001010000101111001000111101101000011101110100001101001100110101000110100000100011101100110111110011100000111101110101111111111101001101101000101101100111001011100011001110110110100101010000000100000001010001111101101110001000100111111000011110001010100111010101001001111000000100111011011000011011000010100000110111100001000110111001101010001010100011001011010100001000010110000101110111110 0011110100011010001000111001010001011010011110001111001001101110010101000110101111111011001101100111110010101101111101000010001010010101110110110011101100111010010000110001011011001111101001001010101101101000001011110001100110000001010000011101110011110010010110111101000011110000100011100111011000000000011001001100111010010100111010000011010001101100000001111100011100011000111010011001000100111001 1110000110001001100111110000111000010001101000000000111000001100011111000000110110101011101101010101000001100101111101001001100101100110111011100110000000011001100011111010000000000010110001111000100100001011000001001100011110101111000100011101101101100000010010010000000010000001101101111111100001010100001001000011110110000100100001111100011101111100001001001011010001000101010111110101001011000101 0100011111011000101110001011100000101101010101011110101010010010111101101101000111111011100000100011101110101000010110110101111011010110101100111111000100101010111110101010000110111011111010110110110101110110100010000100101010011011101010011000001111111101001011000010010001111111100011101001000000110001101101000000101001011011001100110001000110001001100010110100110110111101011000100101101001011011 1100000111111101001101011110100010111100100011011111100011110001010110110101001101111010000000010011010011111111101011010101101001111000101111011010000010101111101101110010111000011000000000011011111011000001101110000010111101010100111101010010111101010000111110010100101110111101000110011100010111110100010110011001000010010100010100010111011111011010000100000011101110011010010010101101110111010010 1010010010011110001111111100000110110000010101010000101110111110111001001100111111001011110100101000000000010100100010111001011100111011101100001100100101001100000000101100011100101011000111111101111000100001100000011011111101111101100111001010000001100010011100011011110111101001000010000000000100000110000101010100111010011101101100101110100110001011010101100100111001001010010110001100110001101001 0000110100100110010101011110001001100111010001010001101000100010110010110111111101100010101111110000111101110001101110111010101110101110011111111010101000010011100010100011111000101100101101100100100011100000001100100000011110001110100000111110000101110011110111100010100011101001100011111101000100100101011110010110000010111010000011001000101000001110111100111101110000100010110011010101010111111001
FXプログラミング

【FIX API】cTraderでFIX APIを使ってみる【サンプルコード】

4/16/2021 6/29/2021

4年以上前の記事です。内容が古くなっている可能性があります。

FIX APIってなんぞや

FIXプロトコルとFIX API

FIXはFinancial Information eXchangeの略で、電子的な金融取引に使われるプロトコルです。もとは株式取引に使われていたようですが、いまや為替取引でも事実上標準のプロトコルと言われています。

もともと銀行間など大口取引で使われていたプロトコルなので個人トレーダーにとってはあまりなじみがありませんでしたが、最近では個人でもこのFIXプロトコルで取引ができるFIX APIを提供してる証券会社も出てきているのです。

国内でもOANDA、デューカスコピー、サクソバンクなどの大手証券会社でも提供されており、だんだんと身近に・・・とか書きながら調べてたんですが、以前提供してたはずのYJFXはなくなってますし、サクソバンクは使用のハードルが高そうですし、OANDAも一応あるものの現在はREST API推しみたい・・・身近どころか、前より遠ざかってる気すらしてきました。

・・・ま、まぁとにかくあまりメジャーじゃないにしても、個人でもインターバンクで使われてるのと同じプロトコルで気軽に電子取引できる時代になってきたというのはすごいですよね、うん。(グダグダ)

 

いろんなFIX API

FIX APIとか呼んでると、「そうか!『FIX API』っての使ってトレードソフトを作ればFIX対応サーバー相手ならどこでも取引できるソフトができるんだな!」と思ってしまうかもしれませんが、少し違います

というのも一口にFIX APIと言っても各社少しずつ仕様が異なるのです。例えばOANDAであればOANDA FIXなんて名前で、OANDAサーバーとやりとりするためのFIX APIになっており、そのための仕様説明書があったりします。(参考:OANDA FIX 仕様書

FIXプロトコルに準拠している以上、大枠の決まりごとは同じなのですが、そこに定められてても、「うちはこれは対応してない」とか「プロトコルにない機能使えるように拡張する」とかなんやかんやあって少しずつ違ってくるわけです。

もちろん大枠は同じなのでうまく作ればいろんなFIX対応サーバーで取引可能なソフトを作ることは可能でしょうが、基本的にはFIX APIでトレードソフトを作るならどこのFIX API基準で作るかは意識したほうがいいと思います。

 

FIX APIのいいところ

FIX 自体は単なるプロトコルなので、プログラム言語の縛りなくトレードソフトの開発が可能です。

たとえばシステムトレードをやりたい場合、メジャーなやり方ですと、MQLでEA作ってMT4/5で動かすか、C#でcBot作ってcTraderで動かすか・・・などと、プラットフォームと言語の縛りはどうしても避けられません。

しかし、FIX APIであればプログラム言語は自由ですし、プラットフォームにも縛られることはありません。自分の得意な言語で好きにチャレンジできるというのはメリットかもしれません。

まぁ、実際はFIX APIのみでシステムトレードというのは現実的ではないですし、FIX APIの使い方学ぶくらいなら MQLかC#を勉強したほうが早いような気はしますけど・・・

しかし世界標準のプロトコルで市場に注文を出せるというところに魅力を感じる方もいるのではないでしょうか。ここではそんな人のために簡単にFIX APIの使い方を説明したいと思います。

 

なお、ajinoriもわかってない部分も多いため、変なとこあったらツッコミお願いいたします。

 

 

FIX APIの基本的な仕組み

決まった形式のメッセージをやり取りする

仕組み自体は特に複雑なものでもなく、こんなメッセージをバイト配列でサーバーとやり取りするだけです。(下記で | で表してる区切り文字は実際にはSOH文字が使われます。)

8=FIX.4.4 | 9=133 | 35=A | 49=fixserver.10101010 | 56=CSERVER | 57=TRADE | 50=TRADE | 34=1 | 52=20210416-02:21:25 | 98=0 | 108=30 | 553=10101010 | 554=password | 10=008 | 

これだけだともはや暗号にしか見えないと思いますが、ちゃんと決められた形式通りに情報が並んでます。ざっくり説明するとこんな感じ。画像が見づらくてゴメンナサイ。

headerにはメッセージの基本情報が入ってます。メッセージの種類(メッセージタイプ)や送り主送り先、時間など。headerの構造はメッセージタイプによらず基本同じです。

bodyには情報本体が入っており、メッセージタイプ(headerの35タグ)によって構造が変わります。Trailerはチェックサムが入るだけ。なんかIPパケットみたいな感じですよね。

それぞれ一つ一つの情報は |タグ番号=内容|という形で表されており、タグ番号を見ればそれが何を表しているかはわかるようになってます。

例としてheader各タグの意味は次の通り。

BeginString 必須 FIXプロトコルのバージョン
9 BodyLength 必須 メッセージの長さ
35 MsgType 必須 メッセージの種類
49 SenderCompID 必須 送り主。ブローカーIDと口座番号を含みます。
56 TargetCompID 必須 送り先。メッセージを受け取るサーバーです。
57 TargetSubID 必須 送り先追加情報
50 SenderSubID   送り主追加情報
34 MsgSeqNum 必須 メッセージの番号
52 SendingTime 必須 送信時間。日時は上記の形式で記載します。

35タグの示すメッセージの種類は以下のようなものがあります。

Heartbeat セッション維持のための信号
A Logon ログオン
5 Logout ログアウト
2 Resend メッセージ再送要求。
V MarketDataRequest 価格など市場情報要求。
W MarketDataSnapshot/FullReflesh Vの返信。全部入り。
X MarketDataIncrementalRefresh Vの返信。差分のみ。
D New Order Single 注文。

ちなみにこれはほんの一部です。メッセージの種類は全部で100種類近く、タグの種類は1000種類近くあります。詳しく知りたい方はこちらの公式ページをご覧ください。

もちろんちょっと使ってみるだけなら全部覚える必要などありませんし、私もさっぱりわかってません。

 

プログラムでメッセージを作ってサーバーに送り付ける

実際の使い方はというと、上記のメッセージをプログラム内で生成したら、普通にSSL通信でも使ってサーバーに送り付けるだけです。

ここでいうFIXプロトコルはアプリケーションレイヤーのプロトコルなので、メッセージさえアプリケーション内で作ってしまえば、あとは既存の通信方法で普通に送ればいいのです。

利用の流れとしては、

1.最初にログオンメッセージを送る→ログオンの返信を受けてセッション確立

2.定期的にHeartbeatメッセージを送ってセッションを維持しながら、価格取得なり注文なりやりたいことする

3.終わったらログアウトメッセージを送って終了

メッセージ作るときの注意点としては、ヘッダーにいれる34番タグのメッセージ番号は必ず連番でふるようにします。

番号飛ばしてメッセージ送るとサーバーからResendメッセージが返ってきて、間の番号のメッセージ送るよう要求されてしまいます。

 

返信のメッセージタイプも決まってる

メッセージを送ると、サーバーからも上記の形のメッセージが返信でやって来ます。送ったメッセージの種類に応じて、どんな返信が来るかも決まっています。

例えばクライアント(こちら側)からサーバーにログオンメッセージ(“35=A”)を送ったら、サーバーからはログオン成功ならログオンメッセージ(“35=A”)が返ってきますし、失敗ならログアウトメッセージ(“35=5”)が返ってくる、といった形です。

受け取った返信内容を読み取って成否判定をしたり、処理をしたりすればいいのです。

 

 

cTraderでFIX API

やっとここまできました。本題です。cTraderでFIX API使ってみようぜ!的な話です。

 

cTrader FIX API

実はcTraderアカウントをお持ちであればだれでもFIX APIを使うことができます。FIX APIを使って、cTrader口座で取引をすることができるのです。

この場合はcTrader 用のFIX APIを使ってcTraderサーバーとやりとりする形になりますので、ブローカーごとに仕様が異なるということはありません。参考までにcTrader FIX APIの仕様書はこちらです。

 

cTrader FIX APIでできること

現在の価格や板情報などの市場情報をとったり、各種注文出したり、ポジション確認したりということができます。逆に言うとそれくらいしかできません

口座情報を取得したり、過去の価格情報を参照したりといったことは一切できません。もともとFIX API自体がそんなに多機能ではないんですよね。

なのでFIX APIを使ってシステムトレードをする場合は別のAPIを組み合わせて使うことが多いようです。cTraderだとOpenAPI2.0というのが用意されてます。

 

 

cTrader FIX APIを使ってみよう

クライアントソフトを用意する

さて、せっかくですからFIX APIで注文でもしてみましょうか。

FIX APIで特定シンボルの価格を取得して、ボタン押したら最低単位で注文するだけのテスト用cBotを用意しました。ソースコード付きです。

ダウンロード後、ダブルクリックでcTraderにインストールしてください。

ちなみにAccessRight.FullAccessが必要なため、起動時に警告が出ます。不安であれば実行は控えてください。興味があればソースコード読んで理解してから実行すればいいと思います。

なお、cTraderの開発元SpotWare社が公開してるFIX-API-Sampleを参考に作りました。こちらはWindows Form のアプリケーションです。ちゃんと学びたいならこちらのソースコードの方が勉強にはなるかもしれません。

 

接続情報を確認する

まずcTraderの場合、設定メニューの一番下にFIX APIという項目があるので、ここを開いてください。

接続のためのパスワードが必要になるため、ChangePasswordを押して適当なパスワードを設定してください。

 

接続情報を設定する

それぞれの項目をcBotの同名パラメータにコピペしてください。PriceConnectionとTradeConnectionはどっちでもいいです。一番下のSenderSubID以外は同じ値だと思います。(違う方いたらコメントください。cBot修正しないと動きません。)

 

起動してみる

正しくパラメータが設定されていればcBotを起動すると、チャート真ん中下部分にBidとAskの価格情報とSellBuyのボタンが現れます。(価格情報がcTraderと微妙に一致しないのが謎なのですが・・・何かプログラム間違ってるのかも。誰か理由わかる方いたら教えてください。)

ボタンを押すと最低発注単位で注文が入ります。本当にポジション持ってしまうのでライブ口座の接続情報を使う場合はご注意ください。cBot動かしてるのがデモ口座だろうが、バックテスト環境だろうが関係ありません。接続情報がライブ口座ならその口座に本当に注文が入ります。

cTraderからポジション情報を見るとチャネルの部分に”FIX”と表示されているのがわかると思います。

また、(価格取得以外の)FIXメッセージを送信受信ともにログに表示させるようにしてあります。トレードウォッチのcBotタブでどんなメッセージが飛んでるか確認してみてください。

 

ソースコードいじって遊んでみる

たぶんここまで読んでくれてる方は少なからずプログラムにかかわっている方だと思います。是非ソースコードいじってみていろいろ試してみてください。コメント多めに入れてあるので見ればなんとなくわかる部分も多いはずです。

今回はUI作るのが面倒だったのでcBotの形にしましたが、cBotである必要はまったくありません。プログラムのFIX通信部分はcBotを起動させたcTraderからは完全に独立してます。

例えばAxioryのcTraderで起動させていても、パラメータさえTradeView口座の情報で設定すればTradeView口座に注文できます。Indicatorに組み込めばIndicatorから発注させるなんてこともできちゃいます。

FIX通信クラスにcAlgoの機能は一切使ってませんので、コード中のFixApiBaseクラスとサブクラス丸ごと自作アプリに移植すれば自作アプリからでも発注が可能です。

あ、一般的な例外処理とかエラー処理とかもろもろ省いちゃってるので、もし実際使えるレベルまで改造してみたいならその辺も追加してくださいね。

 

あくまで勉強用として

いないと思いますが、本格的にFIX APIで開発を始めたいという方はこれをベースにするのはお勧めしません。

FIX APIでトレードソフトを作るのであれば、おそらくQuickFIXなどのライブラリを使って開発をする方が一般的だと思います。

あくまでFIX APIの勉強用プログラムとしてご利用ください。

 

 

疲れた

「ちょっとやってみようかな」のノリで始めたわりには、思った以上に手間をかけてしまいました。

今回はじめてFIX APIを使ったプログラムを作ってみたのですが、作ってみた感想としては・・・あえてこれ使わなくてもcAlgoでいいかなぁ、と。

「いやいや、お前はFIXが全然わかってない!」とか「FIX APIはこんなにすごいんだぞ!」とかありましたらコメントお待ちしています。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2025 ajinori