1111011010001110001110010111111111001110011000111001011111110011000001000111011010110011110110010011110110001101101010000110010111100000000000011001101001110100111001001010110101011110011010000110011100101101111011110111110010001111011100100001101001000001100101000000100101101110100101110100110110001110111000010000101100010001010011100001101010110110000110011111010111100001010101010000101010100000 0011101100010111101100000010010011011010111101111000111010000100000111000100000100001101100001001010000111101010011000110011000011101100110000111101000100100000011101001000100011000100001011000111000000110100111100001111100010110110011101111101111111101100100001011010000011101010011011011001111000001100101001000111111100110101110110001111001001100111011100111010001000110100110110101011111000111101 0010110001110101101110100001110110100111010101101011110011101001000111111110111100110101110010010101011000011101011101011000101000101100100011110010001011110111000010110110010010111101101110011100010000100001111100011110000011100001000111101100101100001001110011101011101110101101011011001010101111011001100011100011000100101001100000100101101000111010010000010010100010011100010100100110101010110001 1000000011111001000001011001101101010000100100110001111000011010111000010100110111010110111011100010111010010111101010001101101000101110110000111000101100100000001011001011010111101000000101100101111010101110011111010000101011011000010000111010010010001011010101111001011011101000101001001011011110100010010100000000101110111001111000111001101110000101011110010001111011101010111110000110011101000000 1111001100100101100010011001100000011010110111111001000110001000110000111111101101000101110011111000100110000111010000100011010000101001111010000010010010000010000010010010011111011011101000111000011010100011100011011101101111100010011110111110011101001111011110111101101100110000101011110100000110111110111110110001001000110111001001000010100111001011010001101110011011000110000111011011110000111001 1000010011001010101011101100010101011111111000011111100011000111100100011101000011010101101110011101101111000100000011001111001110101101011010001100000110101001001110000010011000001000000110001010000110111110110100011110110001110110011010110011101010100110111110111010101111100010100000100001101011101110110010001101001010111110100000001111010000000011001011110100011100011110100010101110011100001011 0101001110110010100011001010011111010101100111001101101011101100101000101111000000001011111001100100011111100111011110100000001100110101101000101101111111110100110010110101100001101111111101100010010100101001101001011101111001110111001000110110010011100010101000100011101010100110010011100110101100010110001111011001100110011101111000111111111101101111100100110001101110010111100001000100000101110000 0110111111011110000110000111111101111011000000000011111010010011010101010101100101101000011001110010000011010101011100000101001000100101000001111100011100100010110010101001001111000101111100110110011100010011110101011010001110111010000100001000001110110110011011010111000111011111001010101111010100111100001010001010111110111111101111001010100001000000100010111001010111111110010100100101000011010101 1011000111110010100000001010001000011010000101100110100000111000010001100101101010111000101010111001000111101110010110101111011100110101011101011100101010001010111101011000011101000110011101001001101000111011011101000000000110100001111000101000000111110100011110001001100000011011100101111010000010001111100101000101010010100111110101101011000110000010101001000010110111011111010010011100111011000100 0001110111001101101110101000011000010111100101110111000100111100010110010001010110110110111001101001001010011100000010111010001101110111100001011011000100001100010000001000011110010110101010101011010001000111100100011000111010111000000100010100011011001110001001110001010111101010011001110101110010111011110101010101001101010011011001111100111001001110100001010000100000110001110010010100010010011011 0010011011000001111110000000001111101000010001100111100000100111010001110011000000111000010111010100111010010110010101100110001001000100010010101110000010001011001101000000110111001101010010010011111111101011010000100110001111110001011101011100010101010110001101010100011011001011110010100001101010010100010100101001100010001011100110101101100110011011100100100110111100101101010111101111011101001000 1110101100010011011000100101010111110001111110000001001111100011110110011101111011001101101010011101110101101101000111110101100001100000000000101110100001000000100001110100001110001000111100100110110101111101101010000100111010001000110011000110110110110100001110011011010011011100010111111010010001101011010000110101001100011011001111110100100110110011001000010011100001100100110011110010001001101001 1001101110101000011001010101111101100000110110001010100111111011001000000111101100100001010111110000000010001101101010001100100000111000000011100000001110100101000001111011000010011011010001110110111110111110101110010010100010111000001101100101100100111110011010111010011111000000000101111100010101100100110010000111110000010011000001000100001101011000010010111001101101101000101111111110111011001001 0010000101011100111100001101111100110000000010100101001000000100101101101110000001100000010100011111111111101000101010011110011011000111110110000001001010100000011000000000001111100101000000000100110110111010000000111010111110100011100000101011010110001110110011001010010001011001011111101101010111111101011101100101110100000001110011011111000011000100010100001010001011111100100000011001101111110100 1011110010001000110101001011110111000010010010101101010011001011111111110001001011110111111100110101000001000010100101010001100001101011001100010110011111101111000001100000101011110011100100001011000101010010010111001001010101001101010101010101000011001100001001000101100111110111101100011100110100011110001001010101000111101111101100101000100011111111100010111011100101001010110010011000001110010011 0110110000110110110011100001111110010000110000000110010001111001110101000110000000010001001001111001000100101000000100111101001111100101101001101000010111101110100111101101001011111010010001011110110001100101101011110011011011011101101111101111010110100001011011010010111111011001101001010001110110001111011001111001111010101111011000100110111010001000001100001111100010101011001110101001100001101000 1000111100111100010011110110011010110101100001100101000010100001101011001010101011100000110000101010011110110101100010010000011011101111101000101100100011110110101011010000010011101101011010111110001010101000101100000111001100010101110000100101000011101100110010010001001110010110010101101110111001001000101011000001001010011101010011011111011111101001010111101100100010110001110111001000000010000100 1010100000000100000111001011011100000101010011111011010011000111110010110111110111010001001010100110101001111110111110000110100011100011110110101100101111010000111101010010101111100110101101011010000000010101001000101000110110101110110001000001110101010010011111000010111000001111110111001000110011001011110010001000010001000100111110011010010110100011101101000110101000100101111000111101011000001111 1011111100001101111101000111011111110010100101111001111110010001100111000111110110101100101001000110011010110011000000010011000110010100011011000101001000011110101001001011100111111110000100011001000011100011101101101100010000100010101101010111110000101000110000101000101100110111001010101000001100101000001010100101110110001101010110001110100010100111000001011010110110011101101010110011111111011011 1001110110011100101010100001011001001011101111101111000100011110110010100100101011001010110101010001110111110110000100010101101110100111000100110100100011110111101010001001000111001100111101110101000000000100101010010000000100001010011001010001110110011110100001011101011110101000001000110000110001011100001010101010001100100001101000001110000011100001101111111101100011110011100011010010101110101101 1000010111100100010101111111011010100011111010011110000100011100111100111001011101001011010001010011101011000100001110100000111111111101010101100000111101000000001011010000001100110000011111111010111100001000011100111110101000101010111000101011101101111011010010001100111000000111101100010101100111111011101111011101100110011111110101001011100001000000000001000101100001100011011000100011011011010001 0101010011011101111011100011110010001000011101110001011111000110010000000111101001100011110001000001110110010001001110101111100000101001111111000100010100101001111101110110111111100011110010010011111111011010111110110110001111010111111011011111010111000111100111000110001011011101000000101110100001110011000100111110110101101010010001111111001110010011110010001010101000010101111011010100100000101111 1111100000111100001101011001100101100001000010111100001111010101111111011001111100011010000001100101101101111000100000110100101011101000011001110001101110001110111000100101000010111110111000100010110111001001011010110011000111010111000011000000100001011010111101101001010011011001110110100010011001100111110110001110000000111010000100101001010011100000110001110100110111100000011110000111111010000010 1010100101110000000001101111001001110001001101100111011001110010000110111100001010110010111110110111101111111110010101001010110001001110111011110001100110010011011100110001000010100011010111100011001101011000011100011010101000100111010011110000100010010110001111101110110010000001101110111100100101101001011101111111111000110100001101110100100110101001000010111010011100100101100110110111001111100101 1011111010011010101010101110001001100010100001001010101111001010101111000011011100101110011101010111010100000111100101001100011101001010010110110010100111111110010001001001000110111011101011100011011111001110111011110001111001111001111000100111001100000010011111011110011010111011110111010001100100111011110010001101010110001011100000110101001011110111000010010001101000010000011001001001001100011001 1001110000110010100011010110001010011110100100001100111011110010001011010111010010100010110010100111001010000100010100010110010110011001010100000000100101001100001101101100110000111011010111100110100110101000110010000111001011100011011110111101100101111101110001010011111100001111000110010101011100000011100111000001101101000100010001000111110110101110010110010110011000010001111110000111111000011000 1101100001010001000011000111101010001110111110010101110111001010001100100011001001011100110000100011111110011000100000100110101111101000011101011001011111011101100001101010000000110110010011011111011100111101100001011001100011110000100011100110101000111010001110000100010000000110100110010001100000011010110010111101000010101000100011111110110101111011100000001001000010110000101100001010010010011101 0001111011111111101101100101011010111100001100100001000001011101000100011100110010001001100001111011101001011101110000100101011000011011011000101011010101000010001010001110101000100000001100000000001110011010111001110010000100110000001110111001000000110101000000010001110011010111001100111001011111101010010101100110000101101101111011010101100010011011011101110111011001001110111010110111101000111101 0101011110011010100011000101110100010110000101111100100110111111110100101001010101100101110111100111111000100101010000001001110000101010000001111110111110001011001011010000011101100001100010100011010101001011010100101110100100111111110111010110100001101100010100000110001111100111010001110000010001111110100000000010111111110111110110101111000010000100001010011001110001110011110101010000100010011101 0010011110010001111101100101011100100111110100100001101010011010101001110110011110100111010001111101110011000001100011010001101100110100101101010000101101011010011111001010111011001111110101111010001000000010011100010011101011110011100111111010011001111101010011110001010001011110111011110011011011001100111000100111100101001001001101011100101000110000100111001111101011100111011101001010100100001000 1000010110101010001110110111001101110110011000010011000011001101110001010010000001110101100110110000100100011010011000110011110000010110001111100110000111100010010011111001110000100100010001100110000100100100011100100111110011101000100111100000111101100001110011000011111000101111110000000010111010100111001101110100001111100011001000010110001110100110000110001111000011001001011101011001010110010001 1101110100100111111000110101001011100111010110110001110110111000101011100010011100100111001111111101111001000111110111010101001111000001001110110001010011101001111101010010100110101111101111100101101111100010111110001110000000000010001100001101000000010010011110001100101100011100111001011100000111001011110110101011100010000100010011011010001001111101100001010000011001110000011100111100000010110010 0101011111111100000001001011101110000110010000011011010101010000111100101111001100100100111101100011011001010110110010011110001010100111000010111110111011000101111001000110010110110010000111100000000010000100000110101000001010011000101100010100001000100000011011010101011110100001000011101100011011010110001110111010111010000000101111011011111011110101011011100100110000000101100100111110010111110011 1010001111110010011100101011100000000101100001101001010010111101000011111101001000000011111000100010000111111010000100000111010000110111011100000010101100110000110110000011111111101010110110101100101001001100110111111011010111111111010110010011101011111100001010011001010001111011111100001001110010101111000110010100010011100101101110010101010110010010111011000000000111110111110000001000010001100110 0001011000101110101011100101011101101100010011111111011010001000010000010101101101101010010010100000011001100110001010111101010111010001110101001110000010001001000010001001100100110011001110111101100110010101110110101000111010000101000010101001100101000101000100000111101010010001101100110111111000001111000010010011110111010010001011000011111000101110000011110010010101110010101110111101001001000100 0001000100100001000100011111010101100100100110100111010010111111000111000001000001101101101000101100000100010011110011000111100001001000001100110011010000100101010100100011010110001010110100101101000111111111010111011100000011101110011101010101100111010110000010101011001010110110111110111011010010101101101101001011011110110100011011110100100010100110100010101000010011111110100101010100001111010101 1000001101100010100101111101111010001100100001110000000101001000001101001010001110011000001111100111111010110110100101111000011001000000101101101000110011001010100010111101000010101000110101001010000011100001111111010000000000001000000101011100011101111011111110000011110111111100011111100001001000111001111110010111110111000001100001101000101001111011011000101101001100110010010001010110111001100000 1101000011011000001101001001001100110100010000001001001011101111010110001001110100100100100000111111010110010110101000100001001000011101111100011101010011011010001010111111011011110011001100010100000011101100100001101110100101010000111001100101000101100100010100011011110001010110111011000110100010000110111000001000000001001010001100010101001101100101100001101111110001001010111101000100000111001000 0010110110110001111010101110110110110010111011110001101010011100100000111110010000111111010010000100100001001100010001100000000100010000000001111101111100001111010111000111111000101001011010111111000100101110001110100100111110100010000101000110100100101111010010001011110000001100110101101100000110101101100110010101010000101111101110010011010001110100100111100011100000010111011001010000100101111001 0010111110000111001101010111111101010010110001010110010001110010110100101111010000000111011011000011100101000011011001000110101101000010000001000000110001100110001011111010100001100101000011100000111011101110111000101100011001000010011100010010010101000001011111111101010000100101011001010000100010000001101010101001111101110101001100111110101010011110011110010101111101000110011001000100111101100000 1011011111111011111011101000100000101111101100110110111001010100000001110100100001110011101111110011000111111110101010100010011100100010111001111101001100001100001100101111101011101011110011001110011101001101010101010101100010110101001000100001000110111011000100000001000101010000100111010101100100001000001101000011101110111111100000110111100011001000110001110101011100110100101111100001000010110010 1101011000011011110010011100010000101110010110100000110111100110000110101011100110111001101110100000011101011110010100110111100000111010001010011011000001010100111110011011001101011100111000010110010111110111010010110010111001001011000000100111101011010010000001111111001011110101110001100000001111100111110010011001111111000011011110011011011101110000010011101110001010111111111000100100100110000110 0111011101111001110100110000111010110010100011100011001101100111100010100001110101100010101101111101110000100010111000001100010100000110111000110100011011110100100101101000000011110001001011100010001010110010001111010110000101000011110000011100011101000111011001100001110100110011001110000010101101100110100101111001110110110011000101001001110010000010010001000001001110111001001000011000010000100011 0111110100110100000011000011011000001011101001000110011111010111101111001001010101010100101001010011011001010011110000111111001010101110000000001010010110101101110101110100010111001010001000001011000110000100010110111001011000000101001000011000101101110110111000101111011001000110110111011101011000011110001111000100101011111111111001100010010110111110001011111101101011001011101010010011001110100111 0010010111010110011101000111000100001001000100110010001001011100110111011111001000111000011001100101001010011111100010110101010010101000011100111000110101000000100101100011000111010011101011011000001100101000011010100000011111001101010111000111111001100011101100110000001010000010010001101000111101000101100010111001011101111110100011101011111100001000100100010110010100001001011110101110001100111100 1000100111101101001001001000110011111101011111001001000000010010001000010110000111010011100010101011010101110000110001001100010110110110111001100011010001111011100100000000100101111110011010010001111110000110100001001110110110101000110001111110011000101111000011110010000101111110111111101111000101111111111100011011111100101101000010111101001100001001111011001110011100110001001000010011110001111110 1000011111011001011111100110111011100101010110000010000101010100011001000001010110011111100011011101101000100001100110111100110101011110110011110101010100100111000000101000100011110110000101001011101100110100101000111110101000001100011001110100010101001000111101110001100111100111010001001100011010011100111101010010001111001011100101011001100010011000010111101011110000010110111011111111001101111010 0000101110100000110111011100100101101000010000011001011011100001100001100100110001101011110111101111110101110001011001101000010110101111101110001001001010010101000110010011010100011100101100110101010101100110101011010100010000011101010111100010000100101011001000101101000010000100110110000000011101101000011100110111110001101100100111110001110001001011001101000111111111000001101011110001010011110011 1111010001110000001111101111100000111011101101110100100000101011100000001000110100000100011100101111111001001110110001110110010011110000011101011100000010001011001110110101010111111111100011000001010000101101111111111010000101100100110000100101000000011011101000110010010110101001000001101101001010111001010001101101001011011000100101100110110001010110111101011010111101011001110111110111111010001001 0001010000011011000010101100000111101001000101011001101101111110111011110100101001100111111000010110101010011100010110001101001110110011101100001000101000001110111010011001110101100100001110011011000001000101001101010000000110011010110100100110111010110111010110010100110011100100010000000110111000010001111101000100110011001100101101100011001100011110001011110111101011101110110101010110100110100100 1011000101010011001000110000011100000111001011010000000101101000100000101110101001111101011101110100110111010101101111010110101110100101010011100100010110101110000010000110110110011010100111101000101110010000011100101101101011110010001111011000100000011110000100010000100101000111010001110010111000101110001001000011101000110101001011111101101000111101110011000000110000110101011101111111010000001010 0100000010010000011110011110110110001010101111111010010001101100001010110010110111101000100111101001101100010011101011100110000010011111000000001111110101101010010100111110001001000001011001000011111110100110110101000011001100001101111000110011100000001111101110010101010110110010101101001101111011001011101010101111011101111011000111111101110001000001000010001011111111100101100001111111100111111101 1111011011110110011011010010001001000101010001101010011101110110101111011000111111101111011000110000111110001100111100001101100000110111001111110111100000010110011010011010011010000000000000110011111010100001010011100001001010011100111111001101100110100111101101010011110010010111100010000100010010001111000111011100000100000011100101011001011110000111101111000111100000010111001110000111010101100110 0101010001001011011100011110001000011010111001111010011110010110001100011110100110011100111001011111100100101010100001010110000000010111010100101111011010010101000100011000100110001001110000000101011100100111000110000001101111101100111100011001000001101001010011100101100110111100101111011111000100100000000011100101001001001010101001010101001110110111000011100011110010001011011000000000010011011010 1101110111110110001101001001010100000100100100101101111001000100010100100110101111000101101001001001111001101000011011010110101000111000010110111010100011110010101100111011011101101010000101111001001111010011000010100010001110101010001010101101100110010110010011101111010010111110111100010001101011111010010010001011000111010110010110101011111101101110000100101001011101100000001100010011111101001110 0110010000110110001110001101100001111000101001111101001101001100110100001100000011011011100011110001010111100100001011001110110100111000001011111000011011100110111111100001100000000100010000001001101101011101001101101011100001101001100100100101010010101000010010011010111110000010011000010000111111001001001000011111001000011101001000010010110001001010111100011010100101010110000011101000011101111010 0001101011110100101100110101100011011111011000110011100000110101001110110011010000111111000110010001100101010101010011101011110010101110110010110100100011101111001010111101111101100101111000011100000000001010001010101101111000101010111010000110101010101001110010010100000110011100110000000010000001101000010001101101010101110000110100001110010010100101000011100011100010011000101110101000100000011011 0001101001000101110100011100010010110101100100101111011011011110111100101011111001100111011010001111110110101101000011101101010001001011110001011000110110100101011111110101101001001100111001110110010000011001100100110100100101110100111111111001011001010001010110110110100110111010100110110001110111000000100110110100100100010011011111100100110111100111101101101010110010001000111001111001110101111011 1111111110111101100101000010000111011010100101011000100000110010110100111100001000101100001010001110101101100100110000000110100101101111101111100101100000010000110010101010000011010111101100010010001000011000010111011011101110001101100001100100000110001010101000101011010001111101101110111100100001000101111110110001001100101001000001010101000100111110011011111010101100011011011001101101010101100000 1100011100001110010111101010111101001111111011000100011011001000001011000111010011111101010110010011101100111111010000010000110000110100001000001100111011111011001110110101000001000001101011111001000001100001000010111101111001010100100010001010101111010010010010111011110111001001111001001100000011111000111100110000001011001111010011101111010000001111010001111000001110001001000101011110010000110111 1101000000110101001110100000111100011001111011011010000001011011011100000111011111111000110011101000001000111101011010001010011110100111010110010011110111101010001011000010011011100100101101001100010001111100001000101110100000010000011100111110111001001101100000010101011100111100011010100101110011001000101001001111011000000010101001010101010001000011000111010101100101101110010111111100110011011100 0110011010101111110100000010011000111111100000100000111010110101001001011101110110010001001011101001100111011000000001100000000101001000011000110111001011101001001011111000100100110101101011001110001110010000111100111010010000011111010111101110110110110100001010010001001100110010010111001110000101100011010000111101010101000000100010100011001101111111100010111101010101110001001101101101001010011001 1101100000011110101001010101001001010001111100010000101111001010100001011001110110110000001000010001100011101111001000110101001110100100110110001111010000001100100001111101000111100110101101101101110111101010110011001101100010001101100100110111011111011111001101100011101111001101011001101001000111001111111101101110100110110100111010101010000001110010101110010000011101001111100000010100011100010101 1010101000010110110001001111100011011101111011011011011111011010011110000001110010001101110000100100101011100101111011110011101100001110100011110011100100010000000011011111001111010101111100101111100100001100101011110011001111010101100000110101100011100101101011100001101111110001000010100010001001111110101111110000111110111001010111101101000101010010000011001000010010000001001111110010001001011001 0111110111010000110000011011010000001010000101111011110100000110111100001100011111111010000011000100001011101010001011011001111101111011011011001100111001101110100001100111100010001101010100011111001011100100100000001011001001100110110110111101111100101011100000101110111111000111000010110011110111000100001100101101100100100011010001110101110010100100010100100010010010011010001110110110100110000000 0001000010011010101010100001011101110111100111111000111000110010101101011011110011011001000011001011110100000111011011000110100110110000011000110000100011011101001111001011011110000100011000101010001110111000100110010100001100100110111101001100011110100011111001010010011110000001110011000010101001101010001111001000010111101100110001000111110001110000110011111101100001001000100100001011000010110010 1110101100011011111100101011101011001000011100001100100100111001111010101000101010011110010010101001100010111101011111010100110011101110101001110010001110011001101011101111011111001101111111100101001011111001111111111000100000111111101000000111111011101011010101111000011001000010101110000011100111001100110010111111111100101110101101001011000101101011101011000110101101011000100000100011000000011101 0101011100010111100110001100110001111100100110010100000111101101001101101001010110010011100110100100101011100101001010010001011001100011111110100100001111011100111000010010111110010111010001001010000111110000100111011100101000001110010011110110101101001101011001010000001110010010001000100111010101100101100111001110110010011011010010001101101001010011010101100101000110110010010011000101101101011100 0001001101001111101111100110011111000100111110011110110100110011000111001011000011100111110011101100110010010010111010011111110010110010011101110011100101100100100101000000100110101110111101001001010111011011000100100010011010100110111011011000110111100100010111001100001110110001111101011010000110000011010111111111011110111010111100101110101111110100111111111010000110011101100001110110110100011110 0111110001000000011011100001111100110000001011001011000000100111000111111011111101110010000101110001000100011010000110100101101111000000110001001010110001011010001011101010001011010101001001011010101110001001110010010110001010001100111110011101101000110011110001100000101100000000011111101110011010000011100011101011010111001011100001011001011001111101011100010101111000000001100101011110111011110010 1001100000100000101001010111110111101011000110101011101110001110000111101101010011100011100101000110100111001101110111010110110001101110011011010010101011010101110011110100011011110111011110100100010110000000010001100001010010101000110001100011100000111110000011101101100000000101000001011000101111010011000010110001011001011110111100110101111011000001010011101111011100101101001111010111110000101000 1110010110100111111101001001101100101100010010010100110111100111000011011100001100001111110111011100100010111111100010110111110001000110100110111000111111001111010001100011011101101000110000000100010010110000000110100000110011010001010110011111110010100111000010101010110111101011111100111101100110110011101000000100101111010011100111000010111000001110111100101001011011101001110101000000100011011001 0001000101101010111000001100000110101100111010101110101110001110011110111111100101110100010101101000001000001000001100001100011001110001001011010101101010011000110001001101111101000001100000000011001100100010100110110110000101010111100100010000111000001101100100001101110101000110001111011110100110101001110010000111011111100001011100001011010110100100101011010100101010011110000010100110100000010001 1110010011001011000100001001100000000100011010111111010110110010100010110011101000101011100111101011110100100101001001001001011101011001011000001010001101110111101000100001011111110100100100010001111001011010100010100010101100111110101101111101111001111000110000111010100111101000110101000111110001110010010111111010011101011100001010011100100010101101000100001110010110110000011101010100100010011111 1111101100110011001101100011110110010001111110110000101100111000100001011010111101011111000001110001011101010011111100011111100100110110111001100100101111100011001010110111011010010011001000001001111110110110110100100010111000001100101000011100011000100010000010111010000111001001111100110010011011011111011110011100110111010101011010000111001111010100100111101101111000110000101110100000010110011110 1000000011110111110011101001101010000100000011001110001100000110110011010110001111100001101011101101110010111001000011001000101011100001101001101101000001110101100111010011001010000011100100011101101100010001010110111010111001001111100000010001110111010110010010110011011001101011001000110000000111010110001011001001000001101100101001110000001111000100110111001101001001001000110001010110001011011010 0110010000000100101100101110101110000110010111000111000010111001111011101011001111100000010010101011011100011101010101000110100111100010000011111111000111101111010001010101100000001111000101000100001111100111111111111100101111110100011100001001001110101011110010100001000001111111010110000001010001110001111011111100101100111100100111000110010001000110111001011100111010110000100100100001000111110101 0011011111010110101010011110011100011001000000110111110010010011110001111010001100100100001111000100110100010101101101110011101100011000010000110000010111010011011100110010010001101111011101001001101110000000011111000110000010110011101100010010111101110101010001000111100110010001111110011001110111110101111001000111010100110111111100111110101010101101000101101110001111101001001100001000010011100001 1000011010010010001111101100010101000010101000100010011110000100101001100010100001001111111010100111100100000100110011101101110101010001011011111100111111010111110110110011001011011011101011010100101111101010111101011001000110101100000001011100001111101001001010000011011110111111100110001001101001111101110001110011010011010000111110100000110000011100101000000010010100100111010100110110011111110111 0110011001000010110010001111010000110100001010110010111110010110111110101101001000101011111010000011011010010011100000001110111100110000010101000111001111000111010011001101100001000001000110111101110000000001001110010111101100000110111101000111001110011101010010110101110111000001011011000101010000010101110100011100011001110111110000110001011110001111111011110001101001101111111101100000111001101100 0100000110101111011001101000111000001100000100101110100101110110000101101100010010110000001011011100001001000011111110101111101011101011011101111100010000011001011100101000010100100111111000110010001011100110110111101001100010110111001110110100001011101010000111110010010011100010010000011000100000010001011100011100011001110100011001101010101100010011010001011000111101110000101011011100111000110111 1010010001111000101110001000010010110110101011110101100110010101011100011011101111110010010000101000001011000111011010111010100010100001111010110000000000101001110010100010101001000111101001101110101000111011111101000100110010110101011101010011011101001011000110110111001101101010001000000110110100011010001011110010011000101100111110001111100111101111101100010110101110000010101011101111010011111000 0010010100001000010000011110101010010110100010100100100011010011000111101001001101110110010000111011001111011111101110110101000000010110100000101000110001011110111001110101010111100100111111110111100010011101101111011111111100011100001011010000111100100011000010101000100011001111001001001100011100101000101000000100100101101110000010101110001101101111000110101100110101011000000011100010000100100111 0000001110111010101101001000100110111100011001111000001011111001101110100010010110100001100011011110001000011110101101001100000001101101011000011001110110001010001011110111010000110001001111010001111101000100001100010011100101011001000110011001100010000000000100000111100110111010110001111100111001100100100011001111111110001100110011110000001011000011111111110101000011000010111110011101111011110100 0100100011111010011111010000110111100000001010100111111110101101010000101011001111010001101100010000010010000110100011110100001110110100100010100101001001110000001010100101010000110000111111110001010110111100111000101000111100111100101101101011110011001011010000100101111100111101110011001001000010111000010001010101001111011110111010110001001101100011011111011101101010110101000001111110100100000001 0000111101011011010101101101111101101000100001101111101000011100011101101101011000000111011100110011000110100101011010110101000011010101111010111000100000001010100000110000001101001001011111111111000011100100111111111001001101000100110001101011101101100001110101110011011011010000001100011110100101001111111001000011000010011001100010001111111111101101110100010110111000110000001101101000100111110101 0101111001011111111010100010011010100011010101100110101010111110101000110101111000111011000110000111100010010010100101110010111100000010110011010010111100100011100011000111101000000100110110110011010011011000000101110000000000001111001000111101110001001000001100001101001110000101111001111000100110000001101000111011010101011010000110010111100101111010111010101001100001101110010100000001000001001101 1010000111110010001010000101011101101101000011110110000010000110011000001011000011100001001001010110011001101111000110100100001101010111011010001001001100111101011011010000100011000110111000111000101001001000011110010010110111110010010001000110101100010001000000100101111011110000001011011000010001110001001001110100000111011101011110111001101101011011011011101100111101100011000010110000101101011111 1100010000101111000110101000010011101110101011110001010000011100111110001111001001110001010100100000011000001000000101101011011000111110010011000100110100100001100110111000110101111111000001111011100010010101101000000000100001011110011101011000010000001001001101011110011010010111011100100000110100111101100101010110100000010011110111010111000000000000001111011101100001100101011100011100000110110100 0010010111100011000110011011001111111000000010101111011000000000101100001010011100010110111100011100001011010111101001111000111101000100100111101001111110010100101110010101001110110100010011011111101010110000010000010001100000010000001100101011000110111110001101010110110011111100100101010000111110100001011000101000011011101110000100110010100010010000010000000100110000010001010101101011011011000001 0011101111001100100111000101010010110111111000011000000101110110110111010100100010100010101111010100111101100001100010011111101110000001110110111101100111101000100110101011010001010110010111011110111100000100111100101110100010100010100111111100100110011111011010000100100010111001110101100011000100001100011100000110101000101101000001110010001100101110010010001000010110011100001010010101101100001000 0001000110111111101001001110011110011011101010111011101010111000100001001010100111101010111101100100010111001000000101111010100001111101101010001000111010101111100110001100010011101010001010110011101100100001110000011000111001111000100111010010100011001000000000000000011111001011011101000110110110111101100011000101001000111101011001111111100101100010100010111100101001011000001101100011000000000101 1000101001110110100110011100001100000110011111000101101101101011000101011111011100100100110010011100001001111001101100101001100101101001001001101000011111110100011011100001001011101011000111001001010010010001111111010000011011100000010100000110010100110001110010001010011110110001111101011100101100101001110111110000101000101011110110011000010000011001000101100101100110100100110000110101001010101011 1011000010110101010001011000000110110010011101111110101000000101101100101011000000111110001011010010010010110010000010100000000110100011010111010111110011100001111110000101100100010001110011000011001011100110001110110010100110011110000101011010111000101100010110001100011111000111110110010110011000111101000001110101100100001100010000111101100000100000100101110110010110100011010110100001010100011111 0101010111110101010110000000011101110110101011001100110001100010010011110001110100000000111110100001111011000101100011000000011100110001110001010100011001100001011111010010010010000001101110101110010011110111110001000010111011001101100111110010011001000000000010011110010101000100010000110000011111001001011100010101010011101010100110001101011100100010111100110101011011111011000111100100101100001011 0001100000101100001001100010111100100111101100111011110000101101111001111100001100010010001000011010011110100011000000010000110110100001010110110011000111011100111111000000101000101011100110100111100001100011010111100011110001001101101101011101111011001001000010000100001100101110100010000110001000111001010100110010100110011111010110010010011100101000110100000111001000110011000101100000111001101110 1000100100110111000110111110010101001000100011010111001010110111100001000001110101100010000001011110000100110110110101000011010010010111010110101101100101010100101100001110001111001000010001111101001010101101011010101010100111101011000001010100100111101000000111100101000011000101111011111101110111101111001011101110011100111001011011101110000011010110111011001010110001100010110001010111111001001000 1010110011010011101101010100110101000100100000001000011001101011001110110101100011101001100111101010001000010110110010010001100011100011010101011100011101100100010101100010111000010110100001001011100111011100010001110110010111010100101101011111100010110111110111101100010101100100111100101110101100100010000000010110011100101100010011101101010101101010001001001000111011111101100100001111001100111001 0001000100100101101101010001001011101110111000000111010010000101101011111101100000001000100111100000001110100001101101110011001110000001100000101101110011110111011001001010000000000000011010100100100000110000101101101001011100110000000001101111110111100101100100100101110100100111011000010110010111111100010000000111000111111110010101010000011011000100100011011101011101111101001001011001011111001111 1110010010101001000010100001011110001101000101100110111011111000010101110011010111100110010110100110111110000100101101110101101100001010110110000101101100000110110111000010111100110010001001111111000000010011011001101011100010011001110101010011110111000000100010110010111010000001111010010011010010000111000111111110111111100010001101100010100111010110101011000110011010110000011001110101101111011101
cTrader Algo

cBot開発のためのオブジェクト指向用語

11/5/2020 6/29/2021

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

とりあえず使えるようになろう

オブジェクト指向プログラミングでは自分でクラスを作ってそれらを組み合わせて目的のプログラムを作っていくのですが、cAlgoでは主要なクラス(オブジェクト)はすでに用意されてるので自分でクラスを作らずとも自動売買システムを作ることは可能です。

まずは「用意されてるオブジェクトを使えるようになる」ことを目的として学びましょう。

 

用語はある程度知ってた方がいい

EAプログラマーの方が、オブジェクト指向が敷居が高く感じる理由の一つとして、聞いたことないような用語が多いというところがあるのではないでしょうか。わからないこと調べようとしても、その先もわからない用語だらけで・・・となってしまってはせっかくのやる気も消え失せます。

ここではオブジェクト指向の話をする際に出くわしそうな用語について簡単に説明します。・・・まあ、こんなページ見るより先にチュートリアルでも実際にやってみた方が早いと思いますが。

なお、言語によって多少呼び名が変わったりすることはありますが、どれも概念は共通です。ここでの呼び名はMQLやC#で使われる呼び名を用います。

 

まずは復習

オブジェクト指向の話に入る前に、今までも触れたことがありそうな用語から復習していきましょう。

データの種類を表します。int は整数、doubleは小数(倍浮動小数点) stringは文字列など。MQLでもC#でも変数は必ず決まった型を持ちます。int型の変数にはint型のデータしか入れられません。例えばdouble型をint型に入れたいならキャストという型変換処理が必要です。

 

構造体

単純な型のデータをひとまとめにした「型」の一種です。MQL定義されてるのMqlDateTime構造体を例にとると

struct MqlDateTime{
    int year;             // 年
    int mon;               // 月
    int day;              // 日
    int hour;              // 時間
    int min;              // 分
    int sec;              // 秒
    int day_of_week;    // 週の何日目か
    int day_of_year;     // 年の何日目か
};

こんな感じでintがひとまとめにされてます。

自分で作ることも可能です。また、型の一種なのでintやdoubleと同じ感覚で宣言して使うことができます。

// 自分で作った構造体
struct HealthData {
   string name;
   int age;
   double height;
   double weight;
};

void OnStart(){
   // int等と同様に普通に宣言する
   HealthData dataA;
   
   //中のデータには.(ドット)でアクセス
   dataA.name = "Takeshi";
   dataA.age = 52;
   dataA.height = 168.3;
   dataA.weight = 60.5;
   // 使い方の例だけなので、このコード実行しても何も起きないよ
}

このコードはMQLもしくはC言語のコードですが、C#でも使い方は同じです。(作り方はこれじゃダメ。)

 

変数

データの入れ物です。MQLやC#では変数はすべてあらかじめ「型」つまりデータの種類を決めておく必要があります。MQLやC#では 「型名 変数名」のように宣言します。たとえばint i ;という記述があったら i はint(整数)型の変数、つまり「整数の入れ物」です。小数や文字列を入れることはできません。

C#のコードをみていると、var Name = “mybot”; のように、一見なんでもかんでもvarで宣言して、varという型不定の変数を作ってるように見えるかもしれませんが、これは中身から変数の型を自動的に決めてもらっているだけです。変数の型は一度決めたら変えられませんし、型不定の変数も作れません

 

関数

なんらかの機能を実現するいくつかの処理をまとめて簡単に呼び出せるようにしておいたものです。手続き型プログラミングは言ってしまえば作業としては「関数と計算処理を組み合わせて関数を作る→その関数と計算処理を組み合わせてさらに大きな関数を作る→…」の繰り返しです。

ただ決まった処理をしておしまい、ということもありますし、決まった型の変数を渡したら、なんか処理して結果として返してくれることもあります。

オブジェクト指向の話になると関数という言葉は聞くことが少なくなりますが、後にでてくるメソッドはつまりはオブジェクトの持つ関数です。

 

 

オブジェクト指向の用語

クラス

オブジェクト指向の肝です。構造体は「単純なデータをまとめたもの」でしたが、クラスは「データと振る舞い =機能(関数) をまとめたもの」です。構造体のすげーやつ。命が吹き込まれた構造体みたいな。(なんか詳しい人に怒られそうなのでそのうち別記事でちゃんと説明します)

using System;

namespace sample {
    class Program {
        // エントリーポイント
        static void Main(string[] args) {
            //手続き型的なやりかた
            HealthDataStruct structObject;
            structObject.name = "Takeshi";
            structObject.age = 52; 
            structObject.height = 168.3;
            structObject.weight = 60.5;
            double bmi = structObject.weight / (structObject.height / 100 * structObject.height / 100);
            Console.WriteLine($"{structObject.name}のBMIは{bmi:f1}です。");

            //オブジェクト指向的なやり方
            HealthDataClass classObject = new HealthDataClass("Takeshi", 52, 168.3, 60.5);
            Console.WriteLine($"{classObject.Name}のBMIは{classObject.GetBMI():f1}です。");

            Console.ReadKey();
        }
    }

    //=====================================
    // 構造体: ただのデータの集まり
    struct HealthDataStruct {
        public string name;
        public int age;
        public double height;
        public double weight;
    }

    //===================================
    // クラス: データと関数の集まり
    // BMI計算機能付き!
    class HealthDataClass {
        public string Name { get; private set; }
        public int Age { get; private set; }
        public double Height { get; private set; }
        public double Weight { get; private set; }
        public HealthDataClass(string name, int age, double height, double weight) {
            Name = name;
            Age = age;
            Height = height;
            Weight = weight;
        }
        public double GetBMI() {
            return Weight / (Height / 100 * Height / 100);
        }
    }
}

(ちょっと偏った思考ですがなんとなく構造体とクラスの違いのイメージを。cAlgoではなくC#コンソールアプリで書いてます。)

 

継承、ベースクラス、サブクラス、親クラス、子クラス

あるクラスをもとにして別のクラスを作成できます。C#だとこんな風に宣言します。

class Cat : Animal{ //書き方はclass 子クラス:親クラス
    // ・・・ここにクラスの中身を書く
}

Animalはすでにどっかに定義があるものとします。ここではAnimalクラスを継承したCatクラスを作成しました。CatはAnimalの子クラスとかサブクラスとか呼ばれます。逆に言うならAnimalはCatのベースクラス親クラスに当たります。

子クラスは親クラスのメンバをすべて持ちます。リファレンスを見ても目的のメソッドが見当たらない!ってときは親クラスまでたどって探してみてください。

 

オブジェクト

すべてのモノ。クラスや構造体が実体がオブジェクトと呼ばれることが多いです。なお、C#では変数の中身はすべてオブジェクトです。int型やdouble型もオブジェクトです。コードのどこかに「”mojiretsu”」があれば、これはstring型のオブジェクトですし、「7」 ならint型のオブジェクトと解釈さます。もちろんすべてのオブジェクトに型があります。

ちなみにインスタンスといったらクラスを実体化させたものを指します。ニュアンスの違いが伝わりにくいと思いますが、まぁとりあえずオブジェクトのことと思ってもらっといていいです。

型について

オブジェクト指向になると、大量のクラスを扱うことになるので「型」の種類が一気に増えます。子クラスは親クラスの性質をすべてもつため、親クラス型の変数には子クラスや孫クラスを入れることができます。子供が親のようにふるまえます。

しかし、そのままでは子クラス特有のメソッドは使えません。特有のメソッドにアクセスするにはやはりキャスト(型変換)が必要です。

 

プロパティ

プロパティは外から見えるオブジェクトの情報です。だいたいはオブジェクトが自分専用の変数として持ってます。とりあえずオブジェクトが持ってる変数のうち、外部に公開されてるものがプロパティと考えていいです。(厳密には違いますが、使うだけならこれでいいです。)

なお、このプロパティ内の情報自体ももちろんオブジェクトです。例えばcAlgoのChart型オブジェクトはBarsプロパティを持っていますが、Barsプロパティ自体がBars型のオブジェクトのため、Bars自身もBars型としてのプロパティを持っている、という形になります。

公開されてるといっても、「外部からは見ることだけが許されてるもの」と「外部から見るだけでなく、値を変えることも許されてるもの」の2種類があります。cAlgoでは圧倒的に「見ることだけが許されてる」方が多いです。当ブログのリファレンス記事では「値を変えることも許されてる」プロパティ名の後ろに {get; set;}と付記してます。

メソッド

メソッドはオブジェクトが持ってる関数 のことです。MQLでは標準関数としてどこからでも呼び出せたのに対し、cAlgo (C#) ではオブジェクト毎に自分専用の関数を持つため、関数(メソッド)の呼び出しは必ず持ち主のオブジェクトを通じて行います

なお、C#ではプロパティもメソッドもオブジェクト名に.(ドット)をつけてアクセスします。自分のメソッド内で自分のプロパティやメソッドを使うときは、直接プロパティ名、メソッド名を書けばアクセスできますが、thisという自分自身を表すキーワードを通じて呼び出すことも可能です。

 

メンバ

オブジェクトは自分専用の変数とプロパティ、メソッド(関数)を持ってます。MQLではどこからでも自由に変数や関数を使えたのに対して、オブジェクト指向ではオブジェクトを通じて、各クラス固有のプロパティや関数を使う、というのが大きな特徴です。

>これらオブジェクトの持つ変数、メソッド(関数)、プロパティなどを全部ひっくるめてオブジェクトのメンバといいます。C#ではオブジェクトの持つメンバ変数のことをフィールドと呼びます。

 

インターフェイス

インターフェイスは中身が空っぽのクラスです。プロパティやメソッドを持ってるのですが、中に変数は持たず、処理もからっぽです。そんなもん何に使うんだと思うかもしれません。

自動販売機の外側の箱だけみたいなのをイメージしてください。ジュースの種類を表示する窓もあるし、お金の投入口も、押しボタンもある、でも中にはジュースも機械もなにもない空っぽ状態なのでお金入れてもボタン押しても何も起きない。

この箱は何に使うか。もちろん中に機械とジュースを入れて使うんです。そしてこの箱を通じて自動販売機を操作してもらうんです。そりゃそーだ。

ここで重要なのは「箱の使い方さえわかってれば、中の機械のことなんてなにも知らなくてもジュースが買える」ということなんです。

ジュースを買うとき、中の機械がどう動いてるかなんて気にしないですよね、「ここにお金入れてボタン押せばジュースが出てくる」それさえ知ってれば十分です。

そして逆に言えば、それくらいのことしかできないので、間違った操作で中の機械を壊してしまったり変な設定にしてしまったりすることもないですよね。

インターフェイスとはそういうオブジェクトの操作パネル的な役割を持ったものです。

cAlgoAPIではほとんどがインターフェイスの型で提供されています。cBotを作りたい人は箱(インターフェイス)の使い方さえ知ってればいいのです。「中に入れる機械部分(オブジェクト)はcTrader側で準備するから気にすんな」ってことですね。

リファレンス記事上ではChartインターフェイスとかTradeResultクラスとかわざわざ種類を書いてますが、一切気にする必要はありません。クラスだろうとインターフェースだろうとcAlgo内で使うだけなら使い方は全く同じです。

インターフェイスもクラス同様、継承ができます。cAlgo APIでも様々な親子関係をもつインターフェイスが出てきます。子供は親のメンバをすべて持ってる、ということは覚えておいてください。

 

列挙型

ラベル代わりに使う型です。(これは別にオブジェクト指向の用語じゃないですが、説明の都合上こっちで。)

例えばPositionというクラスがあり、売りか買いかを表すTradeTypeというプロパティがあったとします。さて、この場合プロパティの型は何が適切でしょうか。int型にしておいて0なら売り、1なら買いとか決めておきましょうか。それでもいいのですが、なにかの間違いで2が入ってしまったらどうしましょう。-1が入ったら?こう考えるとめんどくさいですよね。じゃあどうするか。答えはTradeTypeを表すためだけに専用の型を作ってしまえばいいのです。こういうときに使うのが列挙型です。

実際にcAlgoではTradeType列挙型というのが定義されてます。TradeType型の変数(プロパティ)にはTradeType.BuyかTradeType.Sellのどちらかしか入りません。列挙型の変数(プロパティ)に入れられるのは列挙型名.~といった形だけになります。

MQLの列挙型と基本的に同じですが、cAlgoでは整数を列挙型に強制キャストみたいなことはしないで、列挙型は列挙型として使うことをお勧めします。

 

 

まずはやってみよう

読んでいただきありがとうございます。たぶん実際にチュートリアルも何もやる前に読んだ方はちんぷんかんぷんの内容も多かったのではないでしょうか。それが普通だと思います。

まずはやってみて、よくわからなくて調べてみて、「ああこれがそういうことか」と後からわかってもらえればそれでいいです。

少しでも興味がわきましたら初めてのcBotからぜひ試してみてください。

 


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

新しいコメント

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

cTrader's Life

© 2025 ajinori