0100110111011001101001110000000100001111100111100110010110000101111000100111101010001000010001010001101101010001110100110010001101100011000000101100011011100011101111101001100101000010011111011010010000001101011100111110101111001110111111101110111010000000101000011110001000010010001000011001111011110101100101111111100111000101001100011011010100111001101011110100101000000111001110110010011010011001 0011101011011110101000000001111000111100100101100000000101010011000001010001001001110011111101111111010010000100101111011100101001010100001101010111011100111001100111001011000001111001000010010011000111111010010010001011000010100110100110101000001110000001011010110110100011001011110010010110010000101111011101101000101000101111010001001101111110001011011000110001110100111011100101100001010111011001 0101110110001111011100010011010001000110001110011100100011110110001111111010100001010010011100011001010100010100000110100001110110110100000101100111010111011101011011010011101101110011010001100101101110100000100110011101100001001010000001101001110100110011101100110000000110110011000100010110110010010001101111001101001000100011100101001110011100101000001101100110010110000001001011001001010100010010 1111011110010111010111011101010110100000000101111101111011001101000000101101010011011101001011111000010100001111011000001111100111110011000111011010001110011000000101101001011100001011011110101010001110000100000011001011110110000111011100100000011010110000000010101110101000101111011010010010101111110000100111100100000110011001010000001111011111000011000111011001011111010110111101010101100100001100 1001100100100100110101110010110001111000100110111101000000100010001000101110101101111101010110000101110001011111011110000000011111000110000010110011000011111100000011000011110101011100101110010001100100111000011010111010001011101010111110100000001100110110100110111001001001000110011100110110110011010011110001111110100001110110011011101011000111100100111000010111001000010011110010111000101101101010 0000000111001010101110111000110000010000110100011100100101011000111101100010101011011110101101100101001000101100111001000100101111010100000000010100010010101010100100010001001011100011100111101100101001011000010101000000010110100000011000010101011000001110100000010101101110100010101010110010000101001001011000111110000011000111001001111011010000001100110010000000001100111011110011000100000011000101 0110000001001101010111011001011111110100110100111000011110011111111100001010110001001110101001010111011111100000111010000100100110000010110111100101110011101101111101011010111010111000101100110101010011000010011001001100010000010111000001010100101010010100101100110010010001110000001001000010011111000100000100111110101010101101001000011001111110010100001011101100110101000000000101010101000000101110 1110000100011001001100110111110011101010000000100100100110011000101111010110010101000100100000111101110000001001111011100001001111100110100011000000111100001110010101001010000111100000001110111110011011100101110010101011111000000111001011111101001100010001010011011111100111111011010001110011110001100111110100100000010110111011000001101101010000011010011001001000100011110101111100110001000010000011 0100011011011000001001000011100001100101000011101110010101011000110011100110110000001101010111000100000010111101001101010100000111110111000001100100100010110100001100000011010000000011111000111011001010001101101001011100001000100010101101000011010000011011001011110100110100010111010111011111000110100100101101101011100110000011001000000101011110110110110110011111011010101101111000001111011011110110 1001000000010111111000111110000010110001110010110000000111010110011011100011001010100101110010111110001101001010001001001101010111110101110101100111010000011111001111110010011001101001110010000110011011010111110111001100010100010101010111101010111001101011000000010100010110101111111111100011110000000101111110110100001111100110101110110100101101111101000000101111011011111101000110110111111101101100 0101101000110101001100101101001000110011010110010110001001010001001011011110101110111100110000011100001110100011110000001001011101101101011010000001001011001101110011000010000101110000010010010011101100001010011100110010101000010101010111101110001001101111100100000011111100011000011010001101111010011101001010010110011111000001100101011101110000111111011101011000001000110100000010011111001011111001 0100000110101101111111010111000110001010011110010011001000000010110010011001010110000101010101011110101001011010110111111101111010110010100001111110110111010010001101111011111011000000011010100101000101000010010011010110110101101111101111011110011010011010000010001110100011110101011011011000000101010011101101111101001010101100000100110110010000001111010110110100101011011100100010101100110110111111 1100001000100111011100011000101111001001001111001110011001111011010010100001000001011001011010010100110100010010011101001001001111111101010010100110101011111010001001011010011010000011010101100111101010001101110110001001111111101011010001000111011101010111011010101000001100111101100001011010111001101011111110100110011101010111111100110111101100111010110101011100011010011010101010101101001100001000 0011110011001101000001010111111010000000010010100111100011000001101111110001101001011100111010001011111000100110011101111100011001011010111111100110001011111110001100001101001010100000010001010011101101011111010011100011011101010110101011000111111100100101001011110011100011011010110001101100100101100110110110101100000011101000100101111110000111000010000000111000111010001001011100110111000100000110 1111001101110010000001101001110100101111100110000010011001000011000000101010110101010011000011110011011000111000010101000110010011111011000001011100110101110001100010011111010010000001110001011000001111001111011010000110011010100011111110001011000010011100111110110010111010111111011011100000101001010101111010011100111111100111001100000001101100000011100011100110011101111010110110101101111001011100 1011110010011110011010001010111001101101011111111010111010100110100100111011100010101010001010100010010110101001110011110001000100011100110100110100111100000100010101001101100100010000010111010101000111110101101110100100110111010010110000010000000000001111001000010111000110001000000010111111001010011100100001001101101010100001110011110010100110100100110010100010011110111110101111000010100011111011 0011000011011110001110111010000101101010111000011100001011000000011111101100101010100000010111110010000110111011010111101000101100110000101110100001111110111100000001000101101111010000101000001001100000110110000001000001000101110010011011101001101111000110010000100110110110000101001100111010010100000100111101001100111100011110111011010001110111010010001111101000111111101000110101100010001100001011 1010111011010110100011000000111010001111111100011000100001001010110111001110101010100001001100101000100010000010111101100000101011101100000111111011000111101011110010111000100000000011001100110000000010010100100010000110010100110110000101001101001101000111001101000010011000100000000110000101011100111011001000011111000000011111111100010010111111010000111010101000010110111000110100101110000100001111 1100011010110100101110100100100110111111010101000011101000110110011101111000010101011000110111100100100111011010001111100011111111111110000101011111101111111101001100010001000110010100001011100011110010111110100100001000000111001001101010111100000101110110000000010100101010001111110100001000101010101100000110000110110101111110001110010101110110010000010011100100100001101101001111011000010100001000 1100010000000000000110111101111000101010011000011001000101011111100101100110110100000110001010010001111110001011100011100110010000000000100000100110010100010000011101000001110011001100001011000011100011000101100110010001101101100110001001010001011010011010010000000110001000101111001010111000110011100111100110000111011111000101010000101100110111001100000111110111001011011100001101010001010111011110 0000100001100110100100101010010101000011100101001111110110011101110111100000011101101011010111111110010010100000101001101111110001010000001100000001011011001010001111010101010000100011001010100111111010011001011100100100011101010111001100001001100010101110110011111111110001110100011000110101010111111001100111010100011010111110010000101001001001011000000010111001001001111100001100100001100110110000 1010101000010001101010100000100101111010110000111100101101010000010111010000000111100101000011001010011011000111000010101101101011010101010011011000100111110001001101000011100100011111000001100111110110111001001111100001000011111010100111111100110001001011000011001011001000100001100010001010101011000100000110111100101000101010010000011001100111111000011010111111000100101011010110101011110100011010 1101001000000110010001010000000100101100000010010011000010011110111000010100111011111000101010011000000101001100010111110110000110000110011000101000010010101110101001000101100101011100101001111000010100011100001010110011110001111011100010000111000101100010000010011111111101101010111011111001011000001000110101001110100110011010110011101010001111000100101111111110000001100011001000000001001000011111 1000001001100001001000100000110001110011000111010001101111110001110100000100010101111011100011110110010001000011011011110100011101000001010000011011000011111111110111000011111101111001111000001000110110101111000100011111010100111101110110001010100100000011000111101010000000110010010001110100001011101010010110010000011011100101101111001110010000101100010100101111011111001111101000011001110000100110 1000101111111000001010001011110001110110101100101010000110100111011001010101110111111101010100111011010010010001111101100010111100110100011010001000111110010101001011110010000111010101110110000111101011000111100110001100010110010010100011100110000111111110101000000011000101100000010100110110000110001111000011100010001111001100001010010100011000111001100010010010110010010011101011110001100111100100 0101010001000111010000101011000101100011110011011011010010111110000100110110111001011010001001010101001011101100010000100110110001101001000110011001001010110110001001100000011101000111101101000000111011110001100000011100011011111100010011101111011001100110100000100101010000000001010000100100000011000101111000111101000011101001010100100000000011011111101010000001111001111110011100010010110101000111 1000110110101110111111101001011100010101110100011011101110111100000110110010010010001100110011010000110110000010101111111111000001010000110110110110100010010110101100100011010101100000100100100100111110010110100110110101111101010101001101010010101011111111000011000011011001111000111100011101101111111001101101100010111111111111101101001011011111001100100111011110011111101000101010000000111101110000 0001101011101100111000100000011111010001111110110011011010101011000010000000010110010010101100111111101101100101010110100100010000110111011001000001101010110110011111001111001101111101101110000100011001111101011110010011111111110101001110111110000010110110001110110010110100100100011000000010011110010111001001010000001011001100011011010011011001111001000000101101011000000010001001011000011000011101 1011100011111100011101110011000100001010001101111011000110110001010111011010110100111000000001000100100101101001000100011011011001101000001101101011111011010100100001101111111111101011011100001101111001010110101111011110000101000000010101101011100111100001101100111001011000101011111011110100001111100011001001000111011101111101011011011000011100000101011101111001100001100100011100010010111110000001 1001010000110100101110011100011110001101110010000111101001001000011101000000010100001000100011001110001111011101111101001110010100001010101001011101111110110010111000001010100111101001010101011000100011110010110010011010010111001000000100001111100000110101111001101001001110001001011101100100110010110111001010011100000011111101100011011111010111000011001110010010000101010010111111010010111010101011 1100011110001000101101100100101010111100101110010001111111001100001000111111010111010111010100100011011010101010000110110010101011111011110101111010101001001101110010111101000010111011011010110100001000000000100000001110001100010000111100000110010111100101100000000010011000101100001011100011011010101111110000100011110011111010111001010011111001110110010001100101000000100000100100011111101001001110 1101100011111110101100010011110000100110101100000110010001011100010001101000101110110111111011001111100111001000010011100100111111100010010111011011011100011110010111011101101100100001111011010011001110111101011111001001100001000101111110110010111010110000111010101010010110010011011100000011100010011100101010101001000010010010101111111100110100010100001000101100011000101001100011111111111101111100 1011011110100101010011101111101001011110000101111110100111101001010000101001101100000101110110011101100010101000101001001100110101110100111010011110111110000011000110101010011001000000101000100000000001101111100001100010101100000011001000010011011011010111011010000010101111011011101000000100011111000101111110110101100000011110010101101111101001011100000000100101011000101110000110011100110011110110 1001000001000000101011101010001001001011010010001101100101010001101001000111110100010000101011011010011001001011010000000101001010100011111001111100101010011100110010110000111001010111100110001100010000111010101010001001111111111101010111100101001000001011001101011011000011101101101000011001011110001100110000001101101001110111010011100010101110101100101101011011110010111101011101111010101010000100 0101010111101000010110110111011000100000010010010000111101111010110010110011101100000010001010110000010000111111100001011111101111110100100111100000011101111011100000100110110111101010110010111010000111100111100010011011011000000010001000011001110110001010011110010111011001010011010101011111001010010101001110110010011000100100100001110010100010110010011100001001110110011110110101101100001101001101 1001110110010111010010110000011011110101101000001100101111011010111000110100100110100111011100111001010011101110100110011100101101001001111011010001111110110100101110101100010110010010101100000010101100100101010010111000001001100101101110000100111100011111101010001110000110101000011111000010001011011110101010101000011010101000100000111110010011000100100000001110111111101111000011010101100110101110 0101111101110100111011111010001011011000110101101111111110010010011111001111101010111101111100110111101000101110000110100110110001110000001000100110000011001111000110001100111101011011101010101010000011011010000011011011110110111011100101101111111101001000111001110000101000100111010011011000100111101000100110001100101110001001110011010111101101110100010111010101111010100101000000001111010101000110 1111100001101001001000100000010101111101010100100110100110000101100100001100001101011011011111011011001000111011011011110111111001011111101111000001011000011001110110001000111000001111100010010100001000001010001000111111101011010011110000011111000001011100101110111101100110011111101101101100101100100001001100011000110100101001110001011001100101101011001101000110100000100010001111111111100100010011 1100111100010010010111000101011101001000001000110111110000010011010100001101011010100001101001001111110001111101101001110010011100010011111111001111011110000010001000111111001111111101110101010100000110010111111100010100011001101101100100001011000010001100010001101110100101101100101100001111010000000000011000111001011111101010100010000011001001011001110001010111100100111101111010111110001101011101 0000000110100011111111011001110111111111101010100110010001000101000010000001110101001010111001000111011010011010011000010001100111100010110001111011111110000001001111110010011110101100100101101100111111001101100101100100011100110111110101111111001101000010010010100101001000100111001111100110110010011000011110101101100101001110010010010110011101100101101111101011011001000100001001101000011001000000 1111100101011110011000001011110100011110010101111001111100010001100110100110101010101000011010000111111011111010101100001100000010001001100100010111101000010111101001101110010010000011010001011000010110100001000111101100000110111110101011001111101001011111110010111111111101000111100110000010111110010101100110001001100001011100101111111100101010101110101111001101010111001011100111101111011001110000 1110000111111000011000110100110001100100000100000001100011011000011010101101010010000111010110100100001001100101100000100100101100010101011111100000101101100100111111111100111111111101000001111111010101001110000100001011101000001111110100100100100101110001111000110101000000001010100100010001010011000110100110001111001101011111100111001101010001010111010110101100011000110111100000000100111000001110 0000101001101101010110011100110101000110011101000011111101101000101010111001010100011110000001000101110001111110001110000101010100101011001111100101010100100110011111001110011001011010001100000100010011011100010111100101001001110010111111001001110101000110000001011011101110110010011100011011001010010011100001011101001100111011010011001100000111110010101100001010000011110010101010110011001000101010 1010001110111111110010001111100010001101011100010100011110001010110011010100000001011111001010101001100000010100000011101000010001000011011011001000110011110011101110000101110110100110100001000010000011100011000010101001111110111010100111011000101101011010010000111000100111011111111001011111000000111000100011000010011100010110100001111000011011000000100001110000010100111000110101000011010010100010 0111010110010011011011101111000100110010111100100111100010011011011010000011001001001011000111011101000110111001100001111000111011110111110111100010011010110010001100100101001010000011111001010100100110010110111111100011110000110011111101001110010111110000011001110001000001110000111110110011000100011101100100010010100010100101010001010011111100000110000101011010100101101110001101111011101001000000 1011000101100001101011011111110111110011100101000001010100111010001000010010110110111110101000101001011101001010011110101010111111001010101100100101110110110011000100101010100000100000110000111111011010011010101100001111001100010101100011001110111010100111010011100101011011011111011001001101111001010001111000100101100010100111001000100110001000010110000000010100000001000001001001111101000101001001 1100010010010010001110001111111000010011010001011011110010110010101101110000000001001010001000111011100000101001000011111011110000010101110101100010001101011000000100000011110101101101100000111101010100110001100111100000101010101111110011101101111111111100101011111010001010111110010100100000010110010001011111100100011111110010100100000000001100010110100010010000010011001000100100100110110101100001 0100100010100011111001011000100111101010111101000001011111101000011000111101001000001000110001010011101011110111010001101000100000000000001111000100010011111000001001100111111010001001111011100000000111100101010100001001011001001011001010001001000111111101010100011011111101001011001100001010101010111101010100011010111011000100001000011111011000010000111101110110101000001111110101100110101100100101 0010001101100100110111111010110000010001000111001111111001110111100010010011001111101100011011000001001110110011000101110011100111010101001000000110001101000101011111001001110100011111010110010010000101101110111011000000111010111001011111100001100001000111110101101010011100000010001001001010111001100110010011001011110110001011111011011000010101111000000100100010000101110111011111111100111011101001 1011001110101111000101010110101100011011000111101111110011101001111001100011110110110000001101111001010101000010110110111011100101000110010111011110101000000001011101101100011100110111110000100010110101010011010101100000111010001101100001101110100001010101110101100110110100111011101110110011110101110110110111110010111001110100110110101011000010100101101001111111111110010111000101110001010101001000 0000100001011110111111111000001101110100000110011101101111101111000101111110001010011000110011001100101110001010100101011111100111011111111110101010111011110001101001011011111101111000110000100111110110100000111000101001000101000111110101110100101111001111111100111010000011011000011110011110101011111010101011010010011101011101110110101100101111011100111001100100001111010000010110110101000100000111 1101101000001111011100101001000100111000101010010010010001110000001010100001100110010100110100111000000111110111001000010110111011001100001011000010010010100001111000110011110111111110101001111011100101101001011000111111111001100100101100110111000111011100000000001001110010111101101010000010001101011011010000101110010001011100101100000000111101010111100100011010111101100101011111001011110111010011 1101010110100011011101111010010001000001000101101001110011100001101110111001001000000011001101010101110010100011111100011000111001110000001100111100111111011000110110001001010010111011111111000000100010100000111000100100101101100001111110011101110101011100100010010110100110110011100100101100110110110011101101010000010100011001100001111001000101010001111010001010011011000011001110000111010110001011 1100100001011100010000000110100101101101110110110001011010111000001100010010111111011110110011111110101111001000111110010001000011010101000100101011010100001101000010010010101000010001101001000100101000111010101001100000010010100101000010000111110010111011000001010100111001001000010110100001010111101010000011000011011101110011111101101111000011011100000011101101111010001110011001001001010110111001 0100111100010101110111011100101110100100101110011010001000111110100010100111001011000110110110011111100000100110110001010011011000001101001010111100100111101100101000100100101001100111001000011101011011011101001000001001100100010111100010101101101110000000100010111010001101010010010010111111010110100010101100100000010110010010001011110001001110101110000001111011110110000010100111100100100100011011 0111001010011010111101110100110011101101100101111000100110000111111010001000011111001001010101110010010010011110010001010000011111010110100001011111111101110001101101101000101010000011010101101011001011100101101000011101101000011000001111110010111111010000111100000001110011011101001001111100010100110010011011001001100101011100110111111101110000010000000000111001101110110000101100111101101011111111 1000110010011101100111000111101111001100101000110111100010011111001000011000100101001010001001110111101101110010101011010011010100101000010110101010011111001010010010000110011100110010001110111100111110110110001011110010111111000100110010011110100101100010001100101101111000010111111011101110000001011111110001100001110001111111010101001111010110110000100000010011001010101000010101001001101101001001 0001010011100000101111001111000000100110101001101110111110000101111100101011110011011001111010101100001011001010110010111101111011000011010011111111110111101001101011010011011110001111100001100111101100101001110101011000100110100111101110111001001110101001111100110111110110100010100100001100001111110000110011110100010001100001101000100000101001001100111101011000000010001100000111111100101110001010 1100011110000011010001100110000010111010010110110110100001010011100111001011110101010100111001010000110101101000100110100000000110000101011110000000010100000010111010101110001101001111101010000111100000111110101111111110001110010110000011101111110110011100001000100010000000001110100100111111100010001111110100011001101011010001111100101110111110101101001000101110110010110101111101001011001101111100 1000010011110011100110000010101010010000010111101011011011111000111100110011001010100000101010100000110100000011000011101110101001110100101100011000111010010011010000011010110000101011010100010010100000110100000100110011010111110101111110001100101011111100011111100010000000110101000110101011111100110011001011100011110010100011000101100001111000100110101001110000001111000011111001101101010101100111 0110001111101000111010010111110010001001001110110110001011011111011001000111111100100101001000100001010011011111001111000110010111000011110101110110101011101011001100010110001001000011001010011111010010010010011110110111110100010000010100111001000110001101011000000111010111010100100101000100101111100111010010011101011000100100010100010010011010101110011001100110111000000111001001111110100010010001 1100000101101101001001110101101101101010110100011110000111001001110011110001110010100100101001000001100000000110111111000001001011111011001001110011101000001110001000000011101001010010010010000110011011110001001100001110100011001100110100000111101000001011101001001111000010001000111101001000010101101100010010010001000010001111100010011001000010010010111011001011001100101010110011000011010111111001 0110001101101100111101001000111010100110011100110011010001110101111000100010010000110010000100000110010100011101110010111000110100001010000010011110011010010101010100100111011000101111110011000000000011001001111001011101011001110111010011000111110111111011101100110011000000101010011001111000111001001011000001001111000001011111110010000110101111111100111101000101110101111001010010000010001100001011 0110000010011001010101000011011010010000011110010000111011001101100110100001100111010110111001101100000101001111100001100111111010110011000101110110101100101011001001000111111101011100010010101110000100001111100111111011010100000110000101000110111100100100111000011001101010100010010100100111110011101000111011101000111011101100111111011101011110110011100010011001011101110111000011101011111110101111 0000100111000111001110101111111010100111011011111001111000000010100100011000100001000111011111001100011100010100101010001100100001111000101100001110010110100011000100001111111100010011101001101001000111111011000110011100110001000011111100111100111001111101011111010110110110110000110011110010100101001100100001000100000110111100100100100001001010110111110100000001100000000111001100001001001101010000 1110011000100111111111111001110010011000011110011011111110000011001101001101000010101010101001000100010000111101100000100111001110001000010100111011111100010010100110001110100111111001011010000110000100000101100001010010010101001101101000100010100011111111100111101011010000010101111110001000100101000100110101111101010111111011111110111011110010010100110011000111111011010100010011100101110001010010 0111010001100110001100110110000011010100001100100010001100110010001011110011100100100010011010110010011001011001111100010110000001101010111111111111000011010110111011100100011101000011001100111010010000100001011011100111101000110100011111011100010000101110111011101110011100000001110000101101101101000111111110001000110001111111010110010011011110101110101011010101001000011111011001000111000010111010 1100100010110100101001010011001101101001010100010100110100101100001110100101110001011001111110111001100110100001100000010101100001111111111011100001011111110111010001011001001010001010100000010000111101010100111111001001010101111001011100011000111001000011010110100100111011100100100101011001100101010111100010100110111010101000110111011110000100011001001000101010010000101000010111010011011010000111 1100100001100100110011110010000001010110101011111101111000101101111000110100011001111100110100111100100100010101010110111001000110111100111101101001111111110101100000001110111001010001000001101000011101010001100101110000000111111111100011000011001011110001100001110000101010011111001111001110001010010001001100011111101010101100110010011101100011110010000001011111101001001001011010110111000000000010 1000010011100000110111011111000111100100110000000010011010111001100010100000000001110010111010111111101001010100001110110001110100011010101001010111111100000010000000001111100011001101110010001111101000000110001001110111010011001101010100011000110101110101101110101010111101110001111110010010100110001001110011011010100010001000100011010110001010000111111101001011101101110010011110010101010001000110 0100000000110001100111011001000001110101011011110110000011100101011000111111010101001011100101000001000111110000001101111110101100000111011000101011111101100000111110101000110000010101110100000011101101101101100100111011011111110000100101111000110000110110111101011111000111111111111101110001001101000010111100010000001011111001001011111111011101001001000100001111000100110100010001110101011010001110 0000101000011011100101000000001111110100011110111000100010111110110000110110000000101010010110000010111101110010111010110100101011111110010001110011000011100000101000101110101110001001001101111101010001111100101100001111000011101011100101010101000101010110001101111101010111001111001000000100011000001100111101110011101110100100001110011110001011000010010010011010110101100010000000011001001010011000 0100001011001010011001110001011110111010110000111111101111001011010001011010010010100100000110100101000000001101001010110010100111101010110011100001000010111111110101010100001101001100100100100111101001110111001011000011101001111010001010001010001110100010111101010111111001111010111101011001011111101110101100101111001010010010010110010011000110101001010111000110011001001011011100001101010111101101 0111001111111110101100100011000011011110011001101000001011010110100000110011101001000101001001110101010010001010010110010011001010101101001110111001110010001001001100100101010011010000101001100111100001101010001011001000110110001011100000001001010001001101001110000000111100101000110010011000010101101011000010100000111111111010011110001111111001011101011110101000110101001101000111001011001000001110 0100010100010101110110110010011101000001101100101110011000101101001101100100100111100011100011110000101111110111111100110001011110101111100100000011110010000001100101100110100001110111111000111001110000001000110010011010100110011011001000101100010110110001111101011110110010011100010001011000111001001110110011100100000011010100011010111001110111100010010101000110100110011010110010110001111010000101 1011110101010001001101001111101011100000100110000100000100101111101011010111110000011100100011001101011010000001100000010111010000010111100000010011011000110111101101001110000111101011101111010100111111100110111001101011100010011101001110001010010011010010000100010001101001100011100111111100010111111000000110011101010001001111011111111100110100100011001100001110001001100101110011111101001110101111 0111110110010000111100110000111010000001010110000110000100010001011010010111100100110011010000100000111100100110100000110001100010100010011110111101011001001111001011110101110110100010100000000011001011100100011010100101100001010111011110101010101101011101001100111101010101100001000101101010101000111110111110110101011111000010001100110010100111110101111111111100010011110011101011111011101101001111 1010101001010001011101110110100111000000100111111100111000011000110101101001010000101010010110000110001011110010011100100001011100000000001101001010011011110001100111010110100010110011000010100010011011100101001011111101100110000110001101001011100111100100000010110110010101010011110111100011000010000011100111010011011101101010011100111000000101111000010110110100001000011011100010010001110010000011 0111111001110011011100100101101011000110001001110010011111001101100111101110100010011000111111111101010000001101100100111011011110001110010100011010110001010101110111111010001011011101000110010111011100101110110011000001000101100110010001111010111011110011011110000000111011001000111000011100100011111110110000011101101110000110010110000111111001011100011101100010001101100010101001111011110101110010 1001000110001001100000011110100000000010111011001110111010111001010110101011000011101011011010101000001011000111001101101111111010010000110010111010000010010001100000110101011111000101010111111110010011110011100011100000010001101000010001001111100101001110100001111011010111010011100010100011000001100100111001001110110110001011000011110010100100111110000101000110011001110100000111100000100001000001 1011000110101001011011011010001100010110101011001110101011001100111110100010100110000010010001100001000010110000100010111010000001101111010100110010010001111010010110011011100011110010010001100000011111011111100100100100001001000000110111110010100101011101100011101001101110011111000111101100101010011110111011010110111000000100010111101000100110000100100010000010011000100001101001010000000111111011 1011000000101111100010000111000010110010100000010010001000101011010011101010100011000100110110100110010101101010001110111110000011001001111001111011000000101111010111000111110000110101111111001011100111001100111010001100111101100101111100000000100111100100000100101001101000110011111011101111101110111010010111001100001100010010100100010111111001100011110001110111111111110001001110011100111110011011 1011010010010111001111001100101000100011001100101011111010010111110110000010001011111111111110010111001011100010101010001110101110001011000101111110000101010101111000000100101101100100101111100110101110011010110000011011110101101000001011100100111011000101110001100000010110011010001100101010101101110111000011011000101101000001111001111101001110001100010111110111100110000110000101101111001110001001 0101010111010000110101101001100101101000101011111011010001110010100011010001110110100001111110110111110111010110010110011001001011010001101010100110011011110100110000010000010011100001010010000111101100010111110010010010101101010101110010110111101110111111100001010001110110100110011011101111110001010111110100100110111111101010011000111111010001100011000000011110001011100110010101111100000101000101 1101100110001010111001111101011110110000100101000101000001010110011111111100111111111000011000100011111101100111101000111011111110101001011101111000001110111000001001110001101100001100101100101001011000001010011000100000111101000000000001011101101010110001101001010100111100011100001100100010011011100010011010001111100000110101110100000111101011101110110001100011101101110010100110001110100111111100 0111100011000101110011001001010001101100000000011101001000100011000010011000100010100110000010100000010010110001100111001101011101111010111111011100000010010001111110111011011010100101001100111000000101100100110000011011110100111010000110001000101000100101011000000101011000101011100110101000001101101110101100001010101110011011001001111111100000111011010101000010110111101101101110101101010011010010 0110100010010100110000010011111100100101101101111001100011011010011101110110000101010110101010000011100011111100010000101111000000110101100001001111001110111111011100100010011000011110001001111110101101001011010100010010011000111100111001101000001000010110100111101010011111101100111011000110101000000000110011010111110011001100000100101100101011010111110110001000000110001111100000001111011110000010 1001110110100010101110100110011101111110011011100011111101010010111001111100010010100011100010010111111100101110100011001101000010010100001000110100010000000001111100111000000110001111111111001110011111111000010110010100000111000001011101100010110010100110100110111000110110010011110110111011100011001110111111011110111101011111011000011000000111101110010000111011010110111101101100001000001000010011 1100100011010101111010001001111101101010101011000111101110010111011110000111110011110100000110101000101100110011100000111111101011000111010001000101111111010010000100001101101010110111101011100000000000001001101110111111000001100001011111101101110011110111010010101000010011110001101010111011101010011000100111100100111011001001010011000100011001001111101101110011101011001101000000101011100001110011 0001100001111010000011011001111010101111110000110011110010010000110001101000010111011010011010011100100111011010100000110010110101001011100001010111110011001111001011011111111100011101000101101000000010101100000010111000010100111011001010100111000100111111101001101111000100100011010000011000111101000111101000110110000001001110111100101110000100000101111010100010110110101101101101110100101110100100 1101100110000111101010100001010000101101100101010011010111001001111110010110111100101101010110000110001111001010110001001011001101110011011100011110100000000111001010000001100010010000010111101000111001101100001000000100101101101110001000100010001111001101001110110000100111001100101001110110011100111100000101011110011100011110111101100010000111101010100001100001110001010010011001111001010000111000 0000011000100101010011000100111011001001111100011000111001100100110100000010101010001101011001110101011001011001101111010110110001010011110100111101111111000111011110110101111010010111011001001001010111100010000011111100010010110000101010010101111001011100111111001001101100001001101000111110011110001111010101000110110010010000000101001001101000010011101010100111100001001010011011000001100011010101 0010010001000001100010101101100011000010111011100100001111001100111000101101111000011001000011001100010100000001001110100101110110010110011101011011001101111101010101100010010000110011101000000010000111101111000101001110101001110110000111000110011010000100100001101101100111001001110000000000111101001010110111101010010111111010011000010001111111010010001000111001101001001101000110001010101001101100 1111001001111101000001110001001110110010110110001111011011111100000110000110101110011110000010101000000010011110010111110110000111010101100101011110100011000010111111100111111101111011111111010100101111001011000110101001000101100111110000110110101000011011011010111100101110010111001101000001101010011101001111110011000000111001110000111011110100000111111110000000111011000101101010011000000011011111 0011001000100110001101010011110000100010010001101001011001110101100000111111001110110101100000111000100110010011011011111010001011110111000000010110111100000001001101011000001100100110100001011010110001000001111110101100100001111001101110100011010101101011010101111101000100001010010101100010111001000111111101111000001000010010010010101001000010000010001101000100110000100101001111111000011000111000 1011100010100101111010111001001000001110110011011000110000001010101110011100110011000101011101111001101100011011000011100110011100001100101111101010000101110111111110100010000011000011100011101111010111011000110011100000000110010011101111001011110101110111110010111000001001011011011100001101001010111010011100000000100101101110101110001011110100010001111101000101001101100010101000101011110100011111 1010001100100001100110000101010000000010111110111010011110010000101001100111010000111101100001011001011000100111000011000010111000110110100010100011011000100000011011110100111010111100101110000010001101011011010110101111111101000001011111111111000111010101010000101111001000010011010010001010011110010110100001010001101010110101100010110000011101101011000100011101111110000011000001010001111010110001 1100011010010111010101011011011010011100100100001111001100100111110011101010100001100111100111100001110010101101101010010010111100101000001100001100100011110111100001111000110011100110101111010011100010101000010101110110101000110001101111001000010100010011101111101000110011010001100001010110011111111101000011110000010000110111101000000001101101111001001010111001100100101011111010101110110101100111 1110110011111000100000111011100000111001111011010111000001000011000110001011011000110011000101100011011011001010011001111100101110001110000100011000100100010000011101010000011011101101100011100001001011001000011001010001001101001011001001011110001111011100110001100000001100101110111011100001001101000001101100100111110001110100100110001110010111100011010010000110010000001001101011000010000011010110 1010110010011111011001100110000010010101010110110100101100000100000100100000111000000110010110101001100000111111101011011111100010100010111110000010000101111110011001101100010110110011001101011100000001100100001111010100001110000111001010110101011001101010100010011011110011011010010000110110001111111100010100100101010001110010001001110001110110111110011101001000101011111001100000101011000110010111
C#cTrader Algo

【cAlgo】cBot開発でも新しめのC#機能を使いたい!【Tips】

7/30/2021

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

cTraderのcBot開発にはC#4.0の機能までしか使えない?

cTraderフォーラムを見てるとときどきこんな話を目にします。これはある意味正しいのですが、正確ではありません。

確かにAutomate画面から右クリックで「VisualStudioで編集」した場合、そのままではほぼC#4.0までの機能しか使えません

ただ、新しい機能を使う方法がないわけではないのです。少し詳しくみてみましょう。

 

C#の機能とは何を指すのか

「C#の機能」といってもちょっとざっくりしすぎてて何を指すのかわかりにくいので、ここでは2つに大別して考えます。

①言語自体の機能

いわゆるC#の新機能というとこっちを指すのが普通かもしれません。「こんな文法が追加され、こんな書き方がこんなことができるようになったよ!」みたいなのです。

たとえば文字列補完式。変数priceの中身を出力したいときはこんな風に書けます。

    Console.WriteLine($"価格は{price}円です。");

この文字列の中に{}で変数を埋め込むというのはC#6.0から使える機能です。

同じことをC#4.0でやろうとした場合、こんな風に書く必要があります。

    Console.WriteLine("価格は{0}円です。",price);

微妙にわかりにくくて不便。WriteLineで使うならまだいいのですが、普通に文字列生成したいときにはstring.Formatを使わなければならないため余計に面倒です。

実際(普通にやったら)cBotやIndicatorの開発では文字列補完式は使えません。これは実は使ってるC#のバージョンが低いわけではなく、C#4.0以上に相当する機能はcBot開発用拡張機能によってエラーとしてはじかれるようなのです。

逆に言えばこれら新しめの言語機能は拡張機能にさえ邪魔されなければ、コンパイルもできるし動作も問題ないといった機能なのです。

 

②.Netフレームワークの機能

例えばWeb接続なんかをしたい場合、現在だとSystem.Net.Http名前空間のクラスを使うのが一般的だと思いますが、cBot開発においては(そのままでは)使えません。

using System.Net.Httpと冒頭に書いてもエラーになりますし、参照追加しようとしても選択肢に出てこないのです。

「C#4.0までの機能しか使えないから仕方ない」とあきらめるのは早いです。これはC#の機能ではなくて.Net Frameworkの機能でして、.Net Frameworkのバージョンが古いのが問題なのです。

cBot開発時のターゲットフレームワークはデフォルトは.Net Frammework4 Client Profileですが、System.Net.Http名前空間は.Net Framework4.5で追加されたものなので使えないというだけです。

ターゲットフレームワークさえ変えられれば利用できる機能ということです。

 

フレームワーク依存の機能だけでも使えるようにする

先に簡単な②を解決する方法を紹介します。一応簡単にフレームワークの説明しますが、方法だけ知りたい方はこちらへ。

 

そもそもフレームワークってなんだ?

C#やVBといった言語は.Netのフレームワーク上で動きます。要は.NetのフレームワークというのはC#やVBを動かすために必要な基盤です。JAVAのプログラムを動かすためにJAVA仮想マシンが必要なのと同じように、VBやC#のプログラムを動かすには.Netのフレームワークが必要なのです。

例えばcTraderの場合は.Net Framework 4.0上で動くため、.Net Frameworkのバージョン4.0以上がPCにインストールされていないとcTrader自体動きません

「そんなもんインストールした覚えがないぞ!」という方もご心配なく。.Net FrameworkはWindowsのインストール時に一緒にインストールされています。Windowsのバージョンによってインストールされてる.Net Frameworkのバージョンも異なります。

この.Net Frameworkが色々な機能をもったクラスを提供してくれるおかげで、C#のプログラムではネットに接続したりみたいな実際は複雑な処理が必要なことが、たった数行のコードを書くだけで手軽にできるわけです。

(なお、今では.Net Framework自体がすでに古いフレームワークです。.Net Frameworkはバージョン4.8で更新が終了しており、現在はWindowsのみならずMacやLinuxでも利用できる.Net Coreが主流となっています。)

 

C#と.NetFrameworkの関係

C#のバージョンと.Net Frameworkのバージョンというのは確かに密接な関係にはあります。例えばC#4.0であれば対応する.Net Frameworkは4.0です。

(それぞれバージョンの対応はQiitaのこのページが参考になります。必ずしも同じ番号が振られてるわけではありません。)

こういうと、「C#4.0機能しか使えないのだから.Net Frameworkも4.0までしか使えないのは仕方ない」と思ってしまいそうですが、そういうことではありません。

あくまでC#4.0の機能が.Net Framework4.0までの機能をベースに設計されているというだけの話です。C#4.0の機能の中には.Net Frameworkが4.0以上じゃないと動かないのもあるよ、ってことです。

 

ターゲットフレームワークは変更できる

cBot開発で一見.Net Framework4.0までの機能しか使えないのは、ターゲットフレームワークが最初からそう設定されてるからというだけです。

別にcTraderが.Net Framework4.0で開発されていたからといって、新しい.Net Frameworkさえ用意できる環境であれば、cBotやインジケーターまでcTrader本体に合わせる必要はありません。

cTraderのcBotやインジケーターを作る場合、ターゲットフレームワークとしてはデフォルトで「.Net Framework 4 Client Profile」が指定されていますが、そもそも今cTraderが動いてるPCで.Net Framework 4 ClientProfileしか入ってないなんてことはそうそうありません

少なくともWindows10であれば必ず.Net Framework4.6以上が入ってます。ターゲットフレームワークは新しいものに変更してしまいましょう。(自分が使うだけのcBotやインジなら選択肢に出てくる一番新しいものにして大丈夫です。)

VisualStudioの「プロジェクト」メニューの一番下、「 (プロジェクト名) のプロパティ」を開いて、「対象のフレームワーク」を変更します。

これだけで「〇〇というクラスが使えない」「〇〇が参照に追加できない」といった問題は解決することが多いです。

 

 

C#言語機能の新しいものも使う方法

次に①の新しめのC#言語機能を使う方法。要はcBotの拡張機能が邪魔なだけなので、拡張機能が動いてないところでcBotを作ってしまえばいいのです。

 

C#の新しい機能使いたいなら、メイン処理は別ライブラリとして作るべし

結論としてはこれだけなんですけどね。ライブラリを作る際はターゲットフレームワークは自分で指定するため、これもできるだけ新しいの選んでおきましょう。

これによりC#7.0までの機能はすべて使うことができます。以下で手順を詳しく説明します。

 

手順

ライブラリとして作っても、cTraderで使えないと意味がありません。ライブラリの機能をcBotやインジケーター本体のalgoファイルから呼び出す必要があります。

そのため、こんな手順で作っていきます。(cBotで説明しますが、インジケーターでもRobotクラスがIndicatorクラスに変わるだけで、ほぼ同じです。)

①ライブラリ側でRobotクラスをメンバに持つMyTestLogicクラスを作る。

②ライブラリ側でロジックを実装する。

③algoファイルからはライブラリを読み込み、MyTestLogicオブジェクトを作り、メソッドを呼び出すだけ。

では一つずつ見てみましょう

 

①ライブラリ側を作る

VisualStudioで新規プロジェクトを作成します。

新しいプロジェクトの作成で「クラスライブラリ(.Net Framework)」を選んでください。

次の画面で名前やターゲットフレームワークを設定します。

名前はなんでもいいです。フレームワークは自分で使うだけであれば、一番新しいものを選んでおけば、上記②の機能も問題なく使えます。(デフォルトで新しいものが選ばれてると思います。)

あとでcBot本体から参照するときに作成した「場所」が必要になりますので覚えておいてください。そのままであれば自分のフォルダのsource\reposの中だと思います。

続いて、cAlgoのクラスを使えるようにcTrader APIのDLLを読み込みます

ソリューションエクスプローラの参照を右クリックしてして、「参照の追加」。cAlgoAPI.dllファイルを探して、追加します。おそらく PC>ドキュメント>cAlgo>APIにあります。

あとは冒頭にusing文を追記すれば

using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;

これで、cBotを作っている時と同じ感覚でcAlgoのクラスが使えるようになります。

あとはClass1の名前をMyTestLogicとでも変更して、こんな感じの雛形を作ります。パラメータを持つcBotの場合は、コンストラクタの引数にでも追加しておいてください。(インジケーターの場合はOutput属性のIndicatorDataSeriesも)

namespace MyLogic {
    public class MyTestLogic {
        // --- フィールドにrobotを持たせる
        private Robot _robot;

        // --- パラメータがあればこんな感じで
        //public int Period { get; set; }

        // --- コーディングしやすいようにプロパティ化しておく
        public Chart Chart => _robot.Chart;
        public Bars Bars => _robot.Bars;
        public double Bid => _robot.Bid;
        public double Ask => _robot.Ask;
        public Symbol Symbol => _robot.Symbol;
        public string SymbolName => _robot.SymbolName;
        public Positions Positions => _robot.Positions;
        public PendingOrders PendingOrders => _robot.PendingOrders;
        public DateTime Time => _robot.Time;
        public History History => _robot.History;
        public MarketData MarketData => _robot.MarketData;
        public IIndicatorsAccessor Indicators => _robot.Indicators;
        public void Print(string msg, params object[] parameters) => _robot.Print(msg, parameters);
        public void Print(params object[] parameters) => _robot.Print(parameters);
        public void Print(object value) => _robot.Print(value);
        public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume)
            => _robot.ExecuteMarketOrder(tradeType, symbolName, volume);
        public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label)
            => _robot.ExecuteMarketOrder(tradeType, symbolName, volume, label);
        public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label, double? stopLossPips, double? takeProfitPips)
            => _robot.ExecuteMarketOrder(tradeType, symbolName, volume, label, stopLossPips, takeProfitPips);
        public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label, double? stopLossPips, double? takeProfitPips, string comment)
            => _robot.ExecuteMarketOrder(tradeType, symbolName, volume, label, stopLossPips, takeProfitPips, comment);
        public TradeResult ExecuteMarketOrder(TradeType tradeType, string symbolName, double volume, string label, double? stopLossPips, double? takeProfitPips, string comment, bool hasTrailingStop)
            => _robot.ExecuteMarketOrder(tradeType, symbolName, volume, label, stopLossPips, takeProfitPips, comment, hasTrailingStop);

        public MyTestLogic(Robot robot) {
            _robot = robot;
            // --- パラメータがあれば引数で受け取ってセットしておく
            // Period = period;
        }

        //------------------------------------------------
        // 下記をそれぞれ本体の同名メソッド内で呼び出す
        //------------------------------------------------
        public void OnStart() {
        }
        public void OnTick() {
        }
        public void OnBar() {
        }
        public void OnStop() {
        }
    }
}

Robotクラスのプロパティやパラメータはほとんどpublicなので_robot.の形でアクセス可能ですが、いちいち書くのが面倒なので直接呼び出せるようにプロパティ化しておきます。

Robotのpublicメソッドも、PrintやExecuteMarketOrderなど頻繁に使うものは直接呼び出せるようにしておくと便利です。(他にも必要なものあれば加えてください。)

 

②ライブラリ側でロジックを実装する

中身を好きに作ります。ここはいつもと全く同じ。上記のOn~にロジックを書くだけです。必要なら別メソッドや別クラスも自由に作ってください。

一通りプロパティやメソッドを用意しておけば、普段cBotを作ってるときとほぼ同じ感覚でコーディングできると思います。

動作確認がてらこんなコードを書いてみました。毎ティックスプレッドをログに出力するという特に意味のないcBotです。

    public void OnStart() {
        Print($"{SymbolName}のチャートで開始しました。");
    }
    public void OnTick() {
        Print($"スプレッド現在値{(Ask - Bid) / Symbol.PipSize:f1}pips");
    }
    public void OnBar() {
        Print($"{Time}:ローソク足が更新されました");
    }
    public void OnStop() {
        Print("停止しました");
    }

ここまでできたらCtrl+Shift+Bを押してビルドしてライブラリ側は完成です。

 

③本体(algoファイル)を作って呼び出す

algoファイルを新しく作成します。MyLogicMainとでもしておきましょうか。

作成したらVisualStudioで開いて、参照に今作ったライブラリを追加します。

上記ライブラリを作った場所を開いて、MyLogic\bin\debugの中にMyLogic.dllがあると思うのでそれを参照します。

今回はこれだけでも動くのですが、あとあとのことを考えるとターゲットフレームワークも変更してライブラリ側に合わせておく方がいいでしょう。(上記参照

あとは簡単、using MyLogicを冒頭で宣言して、本体側でMyTestLogicオブジェクト作って、各所でメソッド呼び出してあげるだけです。

using cAlgo.API;
using MyLogic;

namespace cAlgo.Robots {
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class MyLogicMain : Robot {
        [Parameter(DefaultValue = 0.0)]
        public double Parameter { get; set; }

        MyTestLogic _logic;

        protected override void OnStart() {
            _logic = new MyTestLogic(this);
            _logic.OnStart();
        }

        protected override void OnTick() {
            _logic.OnTick();
        }

        protected override void OnBar() {
            _logic.OnBar();
        }

        protected override void OnStop() {
            _logic.OnStop();
        }
    }
}

上記の通り進めているのであれば、algoファイルの方はこれをコピペでいけるはずです。

基本こっちのファイルはパラメータを追加するときくらいしかいじることはありません。ここまでできたら閉じてしまっていいです。

注意点としては、ライブラリ側を変更してビルドしたら、本体(algoファイル)もビルドしないと変更が反映されません

面倒に感じるかもしれませんが、本体(algoファイル)側のビルドはcTrader内のボタン一つで済むため、大した手間ではありません。。

 

お試しあれ

最初だけ少し面倒ですが、簡単なcBotやインジケーターならともかく大掛かりなものを作るときはこの方法を使った方が結果的に効率は上がります

もしこの丸投げ型を頻繁に使うのであればライブラリ側のひな形をもう少し作り込んでおいた方がいいかもしれませんね。この辺はまた気が向いたら別で投稿します。

 


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

新しいコメント

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

cTrader's Life

© 2026 ajinori