1111010101011110110111001110110111101111100101100110100010000001000010101110110010101101010101101110010101111011100100100100111010111010001000001000110000011110000001000111110100100101001111000001011101000000011100010110100001110100101011111110100011001100100101001000010110110111001011001000111101111010000000111000100011111111111010000100101011101011100001001101100111011011100101010010011110011110 0100010001000110010010010010101000110100010001000100111101011101011110101011111011000011110100010000001001100011101001000111101011100100101100101010010011100101100011001111101010111010100010111110111000011011111011000001110010011111000100001110101100100110000011011110011100000100111011111010010101011100101001011100101100111011010010010100111010000010111010101110110010100101001011100011111000111001 1100001000100111111110000110000101111110001001110101010001100000001011111110101100110111101101101001000111011010000100100010001010001110111101101100111101100111100110001110000111111010001110010100110001111010010110100010101110000111001001000100101100100100110101000000001111110000110101011110111000010000110110111111010110110101001011101011100001000011010000000101111010010111111101101010000100100101 0011110010100101100000011110011010010100011100101000001000011011110011101111001000100011100111011011000011110011110111011010010101111010100000000000011000011000100110010101001011000111010110000111101000001010001001100010000011110011110001100011101001000011010010000100100001111101101010011101100101001010110001100011010101111110000101011011110001000000111011111000010100111111010011011101101011001110 1100100000001100001000111000000010100000001111101010010110111000101000110001100111010100000011011000011001001110010001011000110011100010000110111010100011110110000000010110100100111001010110100001011011011010110110100110001000010110010111011100100001101000011010011101111000100011001000001001101000001111101110100000110000011011000101100110110001010110010001101101100100010011111001111011011111101011 0101111010100111000101001110010011011011111101100001001100101011010000100101011110001110011110100100110000001011000001011101111101010111110000000100011010001010001111011010101000100100001110010011010011001000101000101000100111110001000111100000011110100000100000111011001110110000100011001011000010100000111100011011001010100101101100111111011111001110001001000100110011010100111010000110100011101000 0101010111111111011001101100101011000001110110100101101111111101010100101100100011000100111111110111000101101000101100001110111000110111011100010101100101010011101011000000011110010100101111111111101110011010100111011101000001000111000000100110011111100100110101110110110110100111001111001110000000010011100101001011011000101000000011011101111001111000010000010010000111011111101100110110001100011111 0001010001101100110000100000100001101001011100011010111111100110001010001111001011000000111111000101100100111011110110001010011111101011000011001111000010111110010010010000000001011001000100000010010101111011110010110110101101101100101000001100100111111101001000111011010010011001010010101100000101001011010110111000110110001110011100101000011100000000010111001111010110110011111010001011010100010001 0110110110011001001000001011100001010011101110001000010111111010000000000010010101111011100111000101100110101011101100111001001111111001101000101000011100011110100110001100011100010010011010011010011111110111100010101000010010111001011100111100110000000100011001101101101100101000101011011101000001111010000111001001110010101000001011010101011110010000011000100000110110101010011001011111110110101000 0010101010111000100010101100011101000111001001100000001010011100110100010111010000111111101001010110110000000101010000010100101000101001010111101010110111101111100000100000000011010001001100010101001010001011111111110000001110111110110000101100010101010110011100100110100101010110110110001011000000101000111001111000100101111110011011101110010111000100111101101100011100001011000110100010000101011101 0000010111001111111000001110110011001001000000010101101101011000100000101101101001111010111010011100010110010011000001111101101010011111111110001110110111011001111011001011100110010000000111101100100100110100010011011010001101010111110101000010111100000001000110110100000000001001101011010010101111011011001010110001001100001110001010000011011100110110011000110101110101010001100110001101011100011110 0010011000010011101110100010000010001110111010011111100101111011100110110110010100101011010110111010110100101110101011100011100000011001010111010011010100110001100000010100100001001101010100111010110110001001000000000010000110111111010111011011101010010011101011001101001101001111100001001111001000010111000000111101100000011110111010111111110100111100101101111010101110011100111011000111010111110011 0001111001010011010011111100001011101010010100011110010100010100011011101010111111101001100110000000111010110110000110100100010101001110100011011001110000011100101011011011001110100100110101110101001110101100001111111000001101010101111111001101001011101001110001111010011011001101110010100111010000010010000110011011010100101000110001000010101100010000100000000101000011001100110011111111000001001000 1010000111100000100011101101011110101011010001010000011011101110110110001101010000010001000011110011010010111111111100101001101110011010110011100011111010100001100000000111001011010101001110110001101011011111001010111100101101001100011100100001110111101101101010001011010011011011111000110011010010101001001100100101111100100110000010001101000100100101011000100110010001110000101000011110011011001111 0101110000100111001000011000011110001101110110101010000010001111111001111000010101010001011000101001011010011001001100011100100111111111101111011110101111011101100110011000000111101101101110001001100100100010111110110000101000111111110011011011011001110010111110110010001000111010011010111100011111110100101101100100101100110001000101011000111111110110010101001101001011000100000001100011000000111001 0011010000110101010100101011111010100101001011000101001110111000100010101011111100011001010010011010010100111100101111001111111101111101001010010010010100100110001101110000101001110000100011001000110010011000111011100010011010001111010100111001110101011011001111111110101110011110111000000111011011010001001100101111000100010001111111010011001001101010100011110011101010000100101001101110100010111110 0001000100000011100011100111101011101100000111001011100001011110111001111000001101000011000101000011000111001101000000000001110111000001100001111100111101101111011111010110110101100110111000011011000001001001110010111001000000101010100010010011100101101011001011110001100010101001010011000000001100111010011111010111101100111010000101111010010001000110110000001101001001011011100000001001110001010010 1111011100000001110111011001011110000010111110101010010100010100010110000100110000011111101110011010011110111011011000010111111000001111111001011011000001011011110001100110111101101101100101111100100111111011101110010011100111011100110100100010011101101010010110000001100010001011011000111100100110110000000100000010100001001100110111101011010101100111010010001010001101101001010110100001100000101010 0011010001110000000011010111010011111101001010011100100100000011000110110111011000101000011101110110111100111000010110000010111001001011010000010010100001101001010110011000001111010010111100111101010011110010101101110011100100000010110111110100101111001010000100000101101010100000101010001111100100011001101001110000101011110010001110010110001110111010100000011110011001010011010011011011000101011101 1000000000101110010001100101110010000000110011011111100000010110110001001001100111101001011101100001000010111111101100010001110111000111001101011010011110111100111011001100011011000000101100010001001100001101010000110011011110110110100000001110110101000000000000101110100111110000100110101000000111100111110011111110011101110111010000110111011100101100010111011110000100110011100010100110000111000010 0100101101100011100100010101000000100011011010011101111110001010000011010001000101011110001100100001011011010110110001101110011100110101010100110011010000111010101011110110001111100101111011110000101100101110001010001110110101110011011101110011101011010110110111110011001111101100000101111100111101100110010010101001001101000110101111101011001011001111011011000101000000111101110111001010000011101101 1100000101010101100100010100100110010001011100110110111101010101010000110010011111000110001001010100001110100011111000100010011000100110011100000010111011010000101111010010000111001000100100011100111111101011000010100111101010110100100011000010101010101100010100100111100100000000010010000110101101100111101101101100100011001010111101000010100111010111101111000011110001110010000100101000101101001011 0101100101110110001011101010001101101111101100000110111111011110110101011110011100101010110010100110100001111000101000010011101001110001101101100100101010011010100111000000101101101110000100001001101101100011101011111101001010010101101001011111111001100100001010100111001101110011111110101001011010111101100100010110011110001000110000101010100101100010000110111110010001100101001110011111111010000011 1010111010111110001000101001011100111000011011000001111001010101000111111100100110110000011010001111011110001010001001111110110010111111010110000101110010111011000101111110110010101001110111001010111010101010000101101100101011110011000001111111001010011010111001111101001111000001011100111001101101011010010001011110000001111101101111000000100110110110001101000110000000001110001011010001111001001100 0001001100111010100000011110101001000110110011000000101100111000111000011100010001000011101110000000100110110111101100110010011010101101011111111010100001011001111011000101101101111000110111111110000111101111111001010110111101000111010100110000001110011111110111010100001001000010000111111110100110001100111100001110000101110010001111111011001101011001011000110110101001111101010001010111000000100011 1000001011001111000110011011000111111000011111001101100111101110110110111101010011011111011010001100001010010101010011110010000011111000101000001001000110100111100001001001100000010101011101001100110101101000101100111011110001101101101110000010010111011010100101110110011011000010011000101010110011111100101001000110111101011001001101111100101101000000010101110011111101001000011110001011111110000011 0111111011011011100101010101110100011100111101111000111101101101010001110000100110100010100100001001010000100011101010101101100010001011111000111011110111111111110001111010110110001011001111100101100110000010000000110000001001111000101100010011111010011110101001110111110000011110101010001100011000101100100101000001000001111011001101100111001111100100111111111101110110100001111000101110100011000011 1111110110101110111011001011000000110101100100111101110101001111110110010110100100100000110001110000011100110011100001011111111100010011000110101111011001111101111100011110111110100011110000001010110011000001010100010100111010101110100100001011111100100101100010111101111110110011101101110010001011101010011011001110011001101010011011011010001111100100101110001000000010100100011011011111111001101010 1000110001001101011110011110010000101111100110110001101110111001111101110110101111001011111100111010010110010111011010111111000001101101100100010100110001010010100000010010110000110100011101111100001001011001011101101011010101111010110110110110100000111100010000110101100001110000010101100000101010000100010111110110111101000111011101001010111001010110010100111011101010001000100101111110110001100100 0001110100000101111100100001101101011010111100110111001100000011101100101011001001110010101110111101111010100110110011010011101110110001001110100000100101100000110110111011110100111100111001110110000111000000010010011000101010100101011101111110101101000011111100110000001011111101011010100101111100110010101110010001111110110010111000101101101101011110000111000101001001100110011000101011110000010010 1100110000010001011010111101011110111100011101001011010101011111100010101111110000111001100100010100111000011000101011011100100001010111001000110111010001100101001011100110000011111010011000010110111010010101011110011110001011110010000111001111010000110100010001001010010001101010111011001110001000110111010000001111001000001001010010110100011100001101111001010000010100110110100110110100010100010001 1100011000101000100010001010011111000010010110110100111111101010000100011010110011011100111101011110001101001011100101100101011111001001011010110001011110010001011010110101000101000001000010101000011000000111011001110101100101111011010001011010001010011111110011100001100101001100010001100011111010100000011101111011010100011011111001001010111100011110101011011011101001011111101110100111111001001111 0000110101001010000100011110001100011000001101000010001000110111110110001011100010111010011100000110100000001101000000100110000000010011111111010111111100011101101100010001001100101010001001111100101001110101111110010011111100100010011110110000011111110001110100000010100000111101111011011010011000101110100100100000011110000001001100100000001100000111110110001110100110011000111010011000110011001001 0111101111100111001010100100010101110111001011010111111110111001001110101111010110001011100000000101110011010010111000001001111110011001001000110110100101110011110110110100101000110011110100100000001001010010001010000101100111000000000111001100000000111110110000101110101000001111000011000100101001111001010101010110100111010010101111100010110100000110001001110110111101111001101001101000101101111101 0001111110010101111010000000111100110110111110011101011000101101010011101000000101110011100100111010100110111001000010010100011110011110001010000001110000111011011100101101000110011011111101001001101110100100111110101110111101010010000000100110100000111101000001101111001000010110011001011001110000110011110011011000000101000100110010011001101111001111010000001000100110010110001101111111000011110100 1111011101001011100101110101010100101111111101001100001000101010000110001001101000101101101111110111000100100011001111011010000101010100010000111101010011111100101100010111010101010011001010000011001111111110001000101010101001101000011111100010101101110111001010100101100001011000001101110101001010001110100101010000101111001111000101101010110000110010111010011001111101101111000010111101100101111010 1111000010110000000110111000010100010011011010000000110100010100000101000101001100101110001101110110001110111001111000111010110101001100111011111010010100110010001101101110100001101000110011011100010110000000111110111101000100001101100000000111101101111100000001101100110000101111111011001111110010100011101001011011101010011001011001010011000001010011010111110001101011001110110111100100110110100010 1001100001110011111010001011100101111010100001111101101011001110000010011111101001101100110101010010110001101110011100010001000111000000110011101011101111110000000001110111010010100011111100010000000001101101010010100010111001111100010101010010001110001100100010110111010000111001001001001001001000001001011101111100001110000101111100011101010111000011011110001110001001111010000111110101001001010110 0111111111101101110011010111110101111110101111101000101101001101001101011101110010001100001010010011110101000000010111111000000001101111010110011111100000101100010011101001000010011111110110010001001001001010010010011001101010001110110000101110000000000011000011110101100100001100011001001110000111100101011010000000110000100110011100011101101011101010001001100111111011111010001100000110000000101110 1101111110101111000001010101000000010000111110100001001010000110111111111001110101100001110110011001001000100111000110100011101101010100011000111010001100101000001000011101110010100101110110001110001011010110010110001010101110110100100010101111111011101001010011110001000100110110100011100000011010001111010011111001101111111010111101000101101111010101001111101000101011011101101100010000100110011000 1100111011010101010010010000010100110010100001001010000100001001101110001011100001111000001111110100011000001011001010101001101001110100000111010101000111001010110101100001100100101011100001010001111110010001100001001101011110000010111101110010001100110001101001110111110111000000100111100101001000100110101011011110111111100101111110000101011000000111011000001110010100110000000011010100010001111111 1010000101001000110111000110000110111000000110111010011011100000111111011100110101010111011010100011100111001110100100011100010100110100001110010010011001010000001011001010001101011111011011110001000111111001100000100111111010001100001100100000101011010101100011011111100000100010110011000001110111010100100000100001111111010001000111101011001101110100001001111011000101110010010101001001101010011001 1110000000100010100011101011100100100111011111010000110010101010001011001101111111101000010010011010101001111111111101100101010001000101001111101000010001011100010011010011010110001001100011011001111100011110010111011110100100000110110001001101101011001011000011000110101010011011101111011001001110101110010001001101001001001010100010001001010110101000000011101010000011101110101111111101110101001011 0111111001001101001110100100001111100001011001000000010000000111010010011010110110000101110001000010101000010110111100011010101101001001001011111100100000101110110111110100001110011000001100101110011011001111111110101101110000110011000010000010101000011010010110111101000110011100100010100011101100010100100110110101100111111100001100111011000011001011111101110110111010110001010101100110101110111110 1110101101010011000100010010000001111010000101000011100011101001111010110000010011111111101110100100111110110000111100110101110011001011101011100010101000101001110110101111000000010010110111010111010110000100001000010011100000101111011011110101111100010101110111100000010000100001100000011000100001000100111100100011111110100011010110100001011001000110110100100011000001100001111000101110010111101011 1000010101110000000110000100110000110110101101111000010111111000001000111000101000101000110000111000110001010110110010101001001111000101101011101001110100110101001001010000011000011101011100001111011010000101011010100101110010001101110011100010011001110010000100000100001110100010011000011010010111100100010011110001001011100011111001110011001110010111010101101000001010011101111001110111100111101110 0011001111100111000111110001001100011101110100011111100101111010101111001100101001011111000001011000101001110010111011000111000010011011110000110110011110000111110110101101110010001111011011000111001110011011011110100011011010010011001001010101010000010110000111010000100011101111100000111101001110011110100010111010110010101110101101110000001000111011100011110000001000101110001001100100011011101000 0101001000001001110001110001110111100100101100011010011111011100110010101001111000100110010101101100111110001111011010110110100010111111111100000101011110110110000111011101111011011110110110001101100010101111010100101010001001110001101011000000011000010000000001100001100110110100101101111111101001001100100101110101010111010010010111100100110010011100011010001000110011001100000101001111010100100111 1100110100001000110001101010110011101000100010011001110110110010001001010001111111000111011010111011010111011010010100100100101010010010101000011010100110011001100101011111001011101100100110011110001101001011001100111110001000000000100110111011101101001010011000101101001100101000000010000110011011010001101100111001001110001000011110001110011000110011011111000100011110110010010011001111100110110111 0111111010000000001001000101110010101110001001110010000001000110110001001011011101010011010001000010110010110001111000100110111100101101110110111100111110111010011001000100011100101111000001010010101000100000110101000100111110100010110000101110101111011001110010100110110001101000111101101011110110101001010101110110110000101000111011111000010110000101000100001001010001100010101110100101101010011111 1001000011000010110001011011000101011100111000110000010011111110001011001001100000001111111001001000110111010011111000110101100000100110011011000011111101000111000000011111100001101100010110010111110100101011110110001111011111101001010011010100000111011010001011010010011100010000000110011010100101000111011000111001000010001000101101010000110110111011110001101000011110110110011000000010010010001110 0111010000010111011010101000001111100101000101101011001110111101001010100011010111100101111110110000010100100010100101001100111011100100100010101111111001110001110011000100010100101100110011011010111101110001010011111001010101101100101000111011000010110111010010111101010111011000111110111111100000001110101100000001000111010010100111111011010000100111010100000010010000110011001101000111100011010001 0011111110100000111111110101101110000000001111001111110100010110101011101111010010011100101110001100101011010010101110010011010000111010000100011101110000110111001110001110010101101101100010000111100111110001010010001001100001100110010110110010110011010010000001000110110011001111001000110001110100100001100001111100110010101100110101011101011111110000101110100010011011101000111100000100001101100000 0110101110100001101010000110101110001110101101000010000010101110100011110010001100001111111001001001110110110101001100010101010110001010110010110001010101011000010011101001101100010110000111100010111010100010001010111111010011111010110101001100010000100001011100110111111011101110011010111001001010011010011110000100011111100101110010101011000001101101011001100100001101111011101111011011100011011001 0111000100101000100011001000110101010011011101011011011111011101001011100100100000000110000011110000010010110100000111100011111110110011100011011000110000010100010010000101101100011010001001001011111010010010100001111001100111111011101100111110111010101011100010110111000110011001011011001111111101111101101010100111100010001011001000000101011101010110110010100011111010010000000001110100101111000100 1100011000011000000100101000110100101011110110001000011110110010010100111100100001101001010011000001100001000110001111111101111000011101111000101100010001101101011000101010001000110110101010001110000101000101111101011000100110001111001010111000110000011111010111101010010100111000000100101011000100010010010000011101111001001100101110110100101000000100111010001100110110001101111011101001001111110100 1001000101011110100010000110001001001010001101011110000010101100010010001111010100001011001010100110011000101100000011110000100110100011110011110101011001110010011001011010100101000001001101100010011111110010100111101001000011011100011001010111111000010111011011010100011111111001010100000101001010010101110010100100111101101000000101011101010010011011001010110110110000100001000101001010111001010110 1101000011100000000001111000110010011010011101001011000011000101001011101100011101110111110010111110011110111100001110101100100000111101111010101001101010110011101110010100000111010000001100001101011011111101101100110100010100011011001100101111000001010110001111000000100001010010000111111011100100111011111010011001010101111010010000011000111101000010101101011000100101010001010101101101000001000100 1101010011110110000010011011111100101001001110000000110000011011111000110010100100000101111011111101001100111011101101110111101100101101100011100011011010001010000101000101001111000101110101000111001111101100001001110000111000111101011101000110010010010100111110101111111000000111000110000101100011101110000011111001011110001110111100001011011100010100100100001011001010000001111001110001001000101001 1100010101110011011011100110011000101100001100001001111011101000010111110010001101001100001001110110000001001111001011110101001001100101011100110100101011110101100101101010010110110011010111010010100011001000101010101001001000110111100110111001100111111111001000001110011001000110000010011011010110011000100010000101011000111001011111011101101110110000101001101111100110001001001001010011110111011001 0001101000000111001000010000100000100101100011110001100011011010100010101101110101010111011011100101101000110111011111001001101001110010101011001101010101011010010010010011011101111001101111000010011110100101011010000011101100000100011100010100010111100111001100001111110011101100101000000110000101011111000111010011111100100101111110011101011001110011010010101100110010011111000010010111100010000010 1100001010101100011111000011000001100101111000110101100000011100100000011000111011111101101000011111100110000100011011000011001110100100101100000101100100101101101101001000101001111101101100001000001110011101100110010010100110110110100001000111110100010001111111111110111110111100111101011001011101101101000011010110110001010000010101000010000001111111100110001110010101011100010100011011010011100101 1000100010111100010101100110101010000110100110011100110010000011101101100011001000010001000101101110101000110110110011000110010010101100001000001011010000011100000001100000011011010101011110111000001101001011000110011110110000000011000110011111111011101100100101001100001100011111101001011101010110010010010111000110110011110101011110001110010010110001000001111111101010010110101011111110101001111100 1111001111101101001101110011111110010001110011010101111111111001001101011101001111001010001000001010011000101101101010000000110101111110100000111000111101011010001101001010010000110101011010111101000000011111000101111100100100001100010010010110100100110110011111000111011001100110110110100011101011100110100010011111101111011001101000110100001011001100101101010000011001001100010000110110010001111011 1001111111000100111101000000001100001111011001100011101000010101010000001000001100010101111101110110110100010110011100001000001001001011111101000000000011011101001010001110001111100010001001001100010100011010101010010011111010100101010000111110010101001100100100000010111010001000101111010001111010100000000010111011010011101011000010001110110111100100000011110110100010110100101110000001100001000110 0110000110100111010011011001111100001111010110011010100011100010001100001100110101111011001000111100101010100111001011011101001000111010101011110101110000111100101001011001111001010101011000011101000111001110010111100001000011000100001101010010011100110000001001111110101110111000101100001100100100001010111110111100011000110001000100001001111001100100001110011010100100010010001001011110011011000100 0100110101001000001111100101110010100011111000101111101010100000001111001101100001110011100010010010001001000000000110100000000100110110010000000001001001110100101010011000100100101011010010110101010111110010011111011010100001011010100000001110111001000011111100001000010010111010000000110101110111111011110001001000001000101000000110010011111100101000001001001010001100011000101101010010011110100010 0011010000110111110101001100000000100000111100011000001010110111101100100000001100100001100111110001110001100001000100111010101000010000011010000001110110100000101001000000100001001111010101101101000011001100111101010000011010011110010000110110110101010100111001001101111001101010100000100110110101100100010100100111111100011110100100110110101011101011100111011100110001011010011111010011110011100010 1100100111011011000110100111000010110001001011101000010100010000000110101110011010101001100011011011100011100001101001001101010001011001011111011111110101110110101100101110110000000110111011110111011010010001100101001100010001010000011110010010110011111010101111000101000001101001101001001000011110011000110000010110101001000100100000000011010100010010101001011111100001011010110110010000000001111100 1010110111100011001000111011000010001110110110111100110111000110111001101100111011010110001111000111100111010101101101101101110001001011000010110011010001001000010000110001001111001011011000011101011001111001001001111011011010111011011000000011110010100010101101011010101011000000100101011010100110010000011011000011011001111110111011000001000101110001110100101101101111110100100110010100011110110111 1000000111100010011010010110010110100111000011111010011000110000111010101011001111010111000110111111011001101110000111001101001010100000000010010111111100100101001011101111110101110101000011000000010000000101001001001001000011110100101000110001010111000010110110000000011100101001010000101101100010011000101111001110010111101010010010100001110101010100101001011111000101111000011110101101110001010100 1101110101011011000011101100010101010000101101001110000011101101011100111101011110000111111111010010010110010010100111100101011000010100010100101011001101111111101001100001111001111111010101000110110001100010001010110101101000010101010111011011100101111110001101110000100110100000111111001100000111001111100100011011110101110001011110110000001101000111111101110011100010111011100110010010111100010011 0010110011010110010000011101100101000101000110110100111111010011000101010011010110101001101010111011101010000111000100111111001000110111001100000010001011110110001101000101100101111001101110000111011101000100010000100010110111110101011001011100001101110011110000000111101011000011111001111000100000010110100011010111011011110100101011101011101110101000100010110111111100111110110110101111111110110111 0100010001010101101101110001001010100011101110110001010111111110001001101011111001011011010111011100111011011100110000000000110110011001001101111111010101001100000110110101010101000110110011110110010001010000000000111011101000111111110000111011110011101010011000000011101100000100000100101111000111110110101001100011001011011011101011100001010101101101011010011001011011110111010111010010000110000111 1000011011001101110010000011110000010101101111100011100010011001101001111010000110000001001010101111001101101011101101101100100110001101011011000110100100011101100100010110101111000101100110111011000011001000111111010101010011111100000010111111000110010001111111011110110111111011101110011000101010011101010111000101100101011110010111111001001100101110100111001010100001100101101101010010111100000111 1001110001000010010011011110100011100111000010010001001110011010101111000101011001111010011011110110110011111110110111001001011110010110110000011100000101111101111011011111101011101101001001011001100100000011011110101101011111001011110101010010111100001001101111101100100100000011110111011000100010111011101100010111101010000011000110010101101001000101100010110110011001110001111111011001101111011111 0010111010001100011110001000110101101010100000100001000110111000111011011111011111000110111001101010011101000001011101110100110010000101001010111000100101100011110101100110011100101110101110110001100100001101100010100001111100001011111000100010110111111010011101100110111101100011101101110001100101101001000110110111011000011001010110111101001010100111000010101101001000011001101010111111001000111110 1011100011100100010111001101111010101001101101110100101100001111100101001000111101100011111000000010001101001000101001011000011001001001101001001010001010010010100100000010000100000001110100010011000010010011011100110010001111001100101101010110001011010001111101001000110100001110101001010111001000010000101010000111111001011100111000111100110001101011110111100001100111000010011100010101000000100011 1111010101110110011011100110001001011101001010010001101100111101101011111011000101111111000100010111010111000111110010010110110000011101001111000001101011111011101011001111111101000111011011110010110111000101110011110011101110100101011001100101011010110111000111111000011010110101011100010011110000111011011111110111011010010111111110000111100011110111011100110011110110011110011110100000011001011110 0010001110101110011010010101100101101010000100110010101000010000000001010010001110010111010001111110111111110011110100010100010110000011011000100100000101101100111011101101101001001010001101000010110100001110001010010111110100011010100010111101010101100111001011101110110100010110010011100101100010001011101010000010101101001100101010010001010000000100010001011000010011101100001101101110000111101010 0011000010110101011010110110100111101001101010010101010000110000100101011011100100101011001110001001011101110101011101110011001001010001100101101100101101010101011000100110000110000000001011001111100111110010111101001111011010100000010111001111011101001110111000000111011101010101001010001000000110011111101111001110011100101111111010000001101000011001010001110010100111110100001011100101000101010101 0110000010110000010011111110101101000111110011000001101001001010010101000011111100000001110101111001110110010001100010110001011010010011111101000001000010011101001001001010100010011011100100101011011110110111011101100010100110101101111000101000001100110100110111000010011111101000011010101100010011000010010001010101000111010111111010010001010000001111111010110101100111001101000010111101111010001011 0010011110111000110000111111011000001001000011011100100110011110000001010101111110101001100100100010101000101101010100010101010000000110010101110010000110010001000001101100010000101010001000010011000001011111110110111110001010000111101101111111111010000001111000110001110001100011011010010101011101010111100000110011111100011100011001011010100000010101101111110010100000111101100011001011100000111111 1010010011110100011011010110011101110000111001000011110101111100010100000111111010100001011100110000001110011101000101110001010000000011101011101011000011011111000111010011011100111010011000001010010001100000100111000011001111011000001111000110110100001101001111101001100000111011100010000001000010010011101001100110001101110001110100110010101111011111111001010110111010101010101111110110001001010110 0001111011100100000010011010001000101011111101001100110111110011100010000100011000110100011111001011010000111001010111011100001001101101011111001011001100111011010101011100111011100111000011110001101001101101101001100110000001010100110101101101010000001111110100110101011001000011011111110000101000111111101101101100010010101101000110001110101100111111010110100100000000000011101010111110000001000000 1001110001111111001010101000111101011110001001010110111110100011110111000111000001100110111001011010001101010110011111111010110000011101010011011101100010011010100101100010100111011010101010100110010111001000110010100101111011010001000011010110101011110101011110000011000011111111000011111100011000100111101001111011011000111011000100100011100001001110010010010010010101110000111100010010101000001111 1001111101010010101000100101100100000100001101100100011101100111100010111010100101100110100000110000111000000010000110101000010000010001011011110001000010011010111001011000010100100110110111100000101010100100011101011101011101101011100101010111001111001001111001111001010111101001000110011111011101010000000010111110001000100001010010111100100000010110011000111110001101011100100100001000000100000111 0000100111010010011111100101110110000111011000101001101010111101101111111001011111011100011000000001010101000111000000111100100000010111001000010010011111101000110100001000000010010000111110001001110011100101111110110001110100001101000000100011010001101110001110000111010001011011111110110111001110100111010101000010010001011101100110001001001011010011111110101000001000111101110101110111100110000100 1111011111000100010010111101111010001111111010100101010100011001111100100111011101110011001110110011011100111100100100100100001000101111010000010000010010111100011110100101001001010010001000111101011100101000101101001110110000110011100101000000101101011001001010010011000100101111000101101010011100001001111001101011111110100001100010101111110111001101111010100101100010010100010000000011111110110011 1100110010101001001001011110111111111110001110100100110111110101100111101011111100101011001011111001100011000010001111111000110010001000011111110011111111000010111110110101011101100101001111110110101100010101101111001000001011001101101100010010100011011010010011001000110111010110010100010101111100001101100110100010010000100111011000001100001011001111101001010101111011000010000010110100110111101101 0100011010000110101100100100111011011010001100001110011110111011011011110011111010111100011010111100010010101111110110111110111001001000011110111000011111010110000101001011010011001001001100001000011101010101000101001111001101111110101010110111001010000111110111111101001110011010000001011001101110110010110000101101111000100101110000111100100101000000011000101011011100111101110011000111001011000000 1100100001110001110100001110000000110111111010000011011100101000000000000011100010110111101010011010001011100111100101100101000100101001100001101101000000011100111101000111011111100001110101011101110001111011111110000100010000111100101010101110001110010101001011010100111001101100110110101010011010100011000110001101111101000001011110111000011110000110101011010010101000101100101111011001001111010000 0111111110011011110010001100101101010010011111100010101011010100011101111101011100111011010000000011101110000001100010010001010001110101100001010001101010011010100000101111111100011011111100110001110010010011100111100111100101100011000101000101001100000000110101000001010011111010100110001101000010100100100000011111101111110101001111011100001001000001010010001100100101011011001000101101011101100111 0101100001111011011010000000101100001010110110000110101001010011010000010000101001011010000001011000100110000110001000011101111001011011011010001010011100001011110111101101110111010011001110110110111100110111001001101010011110001010111101001001100100011110111111101100110010110011100110101010110100111110110110101010100100101110111111000000100100111011101111110101010011000001000001111100010100000001 1001111101111101000001110110011101111100001101110001100001000110100101110010111010110010001101111011111100100011011010100001011011000110011100110011100100010000100110101101011010011101110011000100111111010001111011111100100100110100000000100110010101100100010010101011010001110010101111111001000110111001010010111001010011110100000001000110011111101000101111110100000111000010111111010100010101101010 0010010011100111110110101010000110101011000101100011011011110101100111001011110001110001101110110010011000110110011011100110001100111101010110111100010001000010110000001010000111010000000011001000001110100000011100111001010101010111011000000100101000110101011110101101111110101110110011011001101111110001111111011011010010100101001100111011011101001000010101001010111000001110100110100100100010101110 0111111001110000010000110001101101111000000010010010111111110010000111000011001111101100001100000010000001001110100111011011011011011110100111010010110000010101000111111110001101001000010110100100101010010010011001110111010101000011111010110001111000101101100100111001111010011011110010100111110011011110000110010110101010000000000100111110111100111110101101010000010110101000101001010111111001101100 0011011100101000110100111110100110011001110111101111111101100011000100110111111111011001110100000010011001000011110011100111001000100001101011001101010001111011000000010101110011011001010000010111110100101000111011001100011110111010001010100000101110100100101011000001110101111011000100100110001001010111000010110000001011111000010101000000110010111101000011001000001011001111101001100100000110111110 1010010111000111010110110000101101100110101010011010110111110010000001101010110011110101000101011001011110110101010010001111101001010111001100000101111000111011000001101110100110100110000010100001011101101000000101100101011101111111110111110111101001101101000000110011011000101111001101011100111000101110101101000011010110010000100000011101101000011100111100000100110000101000110001011110111011100101 1010000011011101100100001010100010111110110001010111100001000111011111000001101001000111110010000000110110000001110110101011010110011101100000100110101101110001010111111101111110100000010110010101111100100000110011111010111101011000010111010001010001110110010001111000101111001100001000010111101100111001101110010000000100000001111000011001111101010001111010000101111100010000110010101110101100100111
FXプログラミング

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

4/16/2021 6/29/2021

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

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

© 2026 ajinori