0011111000110011010111101110110111100000110011001000001110101100000010100111001011011010101010000101100110001011010101000100100111110111100101000011110101001110111110100101001110000100001011111000011101000000110011001010011111100000010110010101111001111011101101100000100100010101000110000100010001110110110000011110000000010011110011100110100010111011011100100101101110101100101000010101010011011111 1001011000111010011101010110110100010111101000010011011000010011001011000111010101110101000110110110000110111100110000010111110100000110100001000101000011110110001011011011001010111110000111010111101110110100101011111000000011000101001111000000101011011000100110001000000000001111101000000011011000010010000011111111000011010011110101101110101101110110011010000110110010110001011000011111101111101000 1111100000100001000111000011101010001100011111011001101001000001100111010010001010010001101100111010001101100110000111000110110110000010011001101000101010011110000111111100000100110000001101101101100000100110001010101001001111001011001001001100001110010011100110011100000001101011110100100110000101100100101101001100110101010101011110011001000110001110011101010010000100001111010110010001100111000111 1101011100011010000100111011101010110101000111100001001011110111001010010001001011110000111011100010101101101011111000100001010000000000010110101000110001110010000001011101110111011011011000000001111110000111100110011100100101111010111101101100110100001110101110110110111111000111111010101011101001010001111010101001001100101110010100001110001001100101010010111001100000100101010110011101101100101111 0001111100000010011000001001100100100001101011001110100100101011001001011101110111110110010111000000101011001001010011001110010010111010000100110000011111000011111010010000011011000010001100110010000111111011111010110111010111101010101111110110100001101000111000110000001010001011110101110110110000001000000110001010011111001101111011101111010100100010110011000100000000010000001010001011010001011101 0110110101101001100010110010111010100110101001101110000000111010010111110001101010100001100001010100111110010000010000111000011111111100010010101011011100110111100001000110000011100000000101100101110101001100111000000011000000100001011010100100100000110010111011011011101000011010010000001111001001000011100100001001011001000010100101010111100011101001101011000110001001110110001010000011100011111000 0101100001111011110011011010101010100000011000000110101001011101001000011101101110110100111100111101001111100111110100010011110100001000011010011001110110001100000001111000001111001101001110101101000100010010000000011010110011111011001111000111001000011001110010110010000110010000111111010000101000111110111011111111000110011011111111100010100100111111010001100110101000111100101101010001101000000110 1000000101011001111000100010000001101110100010101001111101110101011010111110011011101110110011000010010101101000100100111101011011010110011010011110111111011000011100011101011100110011101010001100101010000001011111010111001011111001011000011110000011000111000011011110001001011010110011010111001010100010111010100011110101110101000010111111110110000101110100110010111000111001010011100010010101001101 0101100001010010010100011011011111000000010101001110101100011001011000110111000100100000011100110111101010010010100101001011111010001011010111100111111010001000011011111101001001001100101010011110011011110101001001000000000001111010011111010011101010111001111000011001001100110111110100111011001110001100110111000001101001011111011111111110111000100111001110111000010101110111000110110100111010100110 1101001110101101011110100110000001111101111001001111010101011111111011011011001001101000110001110101100010101100001011011010001101110111110100000001111001111001111111100100011011010100011110101101100010010000000000101000111110111100100001101001110010000011000110010001101110101001111010101000111000100000010011001111110010100011110100101101001110100110100011101000010000101011010110101010000000000111 0000000010000100111011011001100111100000011101000001101101001111000100001010011110101011011100110001111100101111011010010101100010101100011001111010010110001011010110100010011010010011010101111101011100101010011011101011101101010000101101011101100101101101110011111101101100100010110110011111101100110101000100110010000100010110001101011011000110101111000010110011001000111101101000010011111110001011 0011001001101001010100000110010010111110110010110100101001001101010010110000101110001111100001111111100110100011011101101000001011110100011110000010111010110101100001100010000111111100010001111010001111010000111100111000110001011110101011111000001001000011000010000011011111011101001000111111010110101001011000001011001001101111100110101011001100101110010000000001101001101000010000111111100000110001 1101110010110100111001111110011111100000111101100101110000010001001010100011111101101010100110011001010010010000011100100111000011100100101000101101111100101010111010111100000010110101100001111010101111011100110101110101010010101000100011011001001111010110000101010001001111000011000011100110010011011000000100001001010100001111010001100111001001101110111110000001000101101001101101010001110100101111 1100001010011100010101000110000011000000110101001010101110100100010000111111001111111110010111110010010101000101011110010010011011000011001010111001111000110110100110000110110101010000011001011110001000011000001011010111010111111110110100101110000101011101110000101001010100110100101101110010010000001101110001000010100011000000001100011111100010101001010100101010100000000001011100010011001011011011 0111110101000010001110010010110111101011100001000001000011101010001111001101011001110110011000011101001100111010100100110001010010011010101011011100000100111011011100000001101010101100100000011001011100010111000010101000010000101110100001001110000001001001011011101000110110000111001111000010111101001010110111111000101100110110011100000001101110100001001001110001000011000110000111101010011010011001 0011001101000111110110111000111101100010011000001100101010101110000011110111000110100110110001111100010101111100100111111010101010110100010110000001101011110111101101110001000100111111000101010010110110000111101000010001111110000101000001101011001100001111000111110001110101010000101000011011011000001011110001000001011001110010011111001001000111111010111111000111011001001011011010100101010001100010 1101110101010000101111110100111000001110111011100000001010001001001001100011111101011110101010001110011111100010110001011010010011100010011100110001110100101110110011110100111000011110110010110001101110111100000101011010010100101011100011010101110110101100001011011111000111111110101001101010110101100100000011001011011000101011001010100101101101110000101110010111010111100000101110001110110000110000 0100100101110100100100101001011010101010111000110110010011101101101110001110101001000001001111001110001000100110000101011011101010010101110111000101011010100101111011100111101111001100001000111101001110010011000000111100001110000111100111110011100001111000010100110011110000111000011110010100001010100110101111010101110100001011101010010111101110010110100010000100101001110010000011001110000110110111 1000000100010000001111010000111110101011100001100110000001111101000001011110000000110101100100101010001011001110010010101010101010100101000000001011110011101111111000101001110100001100110111010110001010001111001101100101010111111111011000011001001000110011100100101001111100111001010011101000101001100101001001100100000001001000110100010010000100101100000100001010101100100110000100100011100101110010 0110010101000011000111110100101101111101100100110110110111110011001001101110000011100000101011000100101000100001101110111001101101010011000100110100110101100110100111010010010110000101111001110000010011011001101011011001000101100101010100010010011000010011001010000110111110101101001001100001011000011001110011011011010010000110111001010001101101111000000001101011111101111000100101001101100011000110 1101011111000001101111101011110110011100001111100101101000100101001101011001000001101101011010000100000101110101010000000000010010000111100010011110010010100001010101111101111010110101111101100010111101111111011100110001111001001000000111100001101111000111111101101111101000011101111001111001000000110111001101110011111001010110101011001100000001111101110110111010001001010110001101100100011010000110 1111001011100011010001100100011000000000101010100101101000000110010001111110100100001010111110100001110000101000111100100001100001001000101001101100000110011000010001001010111110000111011111100101011011011010100001011000010000111111110110100101011010111010110011100010010000000101000001011011111011100101001111110000000111010111000101101011010110111101111000001011110100000111101011010110010101010100 0111010000110011001000000010011111011101011111010000011010100000101101110000011110010011011111011001100011001111101111111100001000011001001110100101010001010110101011100001011101001111010011110001101011011110000011010011100111110111011001101100001111010111110010111110101100101110110101100011100111111100001101111010110000011101111111110100010010110111100110000011011100010010000001011011000011100101 0001000000000111000011010000010100110101010001110101100010110011001010111111000011010011001110010000100001110111010111011101001110010100100111101010010100001011000010110010011111111010101111100111111110000110010100011000101010010110100110101011011000110100001010001010111011111011100110111010011101010010111011111010001001011010011010001110110101010110010100001000010100000110011101001001111011111011 0111000100010000011101110110010100111011000100111000010000000110101111000111000110101100010011111001110111100011101100000001111000101001101000101101000101100111000011000101111000111110001011000100100110011000000011100111101111101110110110101011001100010001010100010001111100010101000001001110010100111101011000010111110111100100111110101110010011010001110001100011101001100111111010111011011000011000 0110000111010010001101001110000101001011110000010001100011001010001010100001100100011010011111010011010010011100000001010111011011000010001110001101000011110000101011001010110101011010101100101010111001111110011001111100100110000000011100001100011000100000100100110100100001011010001100101011110010010101001001001100011011000000011001101001010110000011101010000110010101111110110011010011010010011110 0101111110110101011110000000100100110001101110110010110000110111000101001011101011000110101111011101111100010101001000111011010111010000010111111001010000010110111001100000011100000011110100011011001101100010100101100000111011110110010010010110010110110011010100100111111011111100101001010110010000110011111110000110001001100100011101010000001011000101110000010000010011011001000110000011010011100000 1110111110001011000100110011100111001001010111001000110111111111010101111010010010001000101000000010001110001110101010001000100110011101010001001011001000010110000001001011011111100001101000010011010110010110010110100110010000011110000000011011100011111000001001100101100001101101000101100000111100111100100111000100010001011011000111011001100110110010010010001000000100010101001100001011011001111111 1000110000111100000101101101110110111000000000111101101111101001111000100100000010011100011100000111111111101010000000111100101111100001010100001111110010101100010011011010001001010101000010100111010111111110111000110110100110100100001010000101101110101011010000101100010111000100010010001010011100010011010010111001101111001111010000111000011011010111101001110111000111010111001100111000110010101001 1000010010001011101100010111001100100010011110001000011111001011010100001000001011100110010001101101000100100010101110010011111110100110100010010101010011011010010001000000011110011011000110100010001000000000100011110001110101010000001011101101100001111101110111000010011101111111100101010110100101001000000101000110010111101111111011110000001111001111110010001001010001110101001101111000010010111001 1101110111001011000011110110110011101010100000010001010100000110011001011110100001011101011101101000010100001111001010100100011010111010100110101101001001111010101011100000010101101110101100111110011101111111010100001101110011001101110110001110001011011101010010100010110001000001000100011111011011011110101000101111101111011011000101110110100111010111101100110111101011110111011001000000010010111111 0000101100001101101100101101011010111110001000110110110001011110010100100010101001001001000110000011100010110100001010101000000111011100010001010000011111101011110111010100101011011011001000010111001011001111000010000000100010011100101111011011011010011001000011100111100001000011001110110111111111111001011100101101010101110100000000100101110110010100110000110010000101101101001011001001111000001001 1111010100110011100011100000101110100011101100100011110001011001111001011010110111100011111010111110110100101100111111001011111001110000010111100011000001000001111111101100011101010011111110000001001001000101010111001010001111101110010001101101100100110100110011111111111110110111011000000100110011000111101101010000011010010101100001110011110011101000110110111110101110111111101100101011000000111101 0011011100111101100100010100110100010101000101000110101001111110100011001100101111000101111110100111110000000101101011010100011110001011100101011100010011100110011111101011010110110011111100011011010111011101010101110011000010010011100010010011001110100111001100101111100010100001110001011100111000111011000101001111110101110110101011011001100011100101011011001001011100111011101100001000011001000101 0011001001001010010101011100110001000101101100001100010101000010111110011101100101001101100000011110001010001100010010001101110011001001000000101011110001011100000100010011001001001100001001011110011110000101101110111000100110111111111111100110101101101110011110000110101111110100100000011100010110101110111101010000110000011001100111011010111000000110010110110110001100010101001100000100110101011111 0101111110010111001100001101101110111010101111000000000101010100110011000101010000000010100011011001110001011111001000011010000100000101100010110011101100000011000111111011100000110010101010110011010001100100011110010010010111001010100001000000010010001000111101111011000100101100011111010010101010010001010100110000111000000000101110001011111000111000010111010100110000010000001010010000110000111111 1110000000101011000100101110111010011110111111100010000010110110000100110001110000111011110100011100010110111111110100010101100011101001100101001100011100111111101011010111101001111100110000010000010111011111100110011001001011000001100100011011101110000011111010001000100100000100001010110101110011100111011011010110100001100011101111110001001101110110111111000110110010110101110110101001011011100000 0001110110011101001010000010100010011011001110110011011111011100110110100101000111110011111000000111110110000001001101010011111111000110000011110000010001000100100000011000010111101010101111101010001001111110001011100100111011111011100000110000011000111010101100011100000001001011101111001100010000010000001010000000111010110001110110011101110101001011111110011100111010010110111000001011010000011110 0110111010110011100111101010011111001111000010000111011111000110000100011110110111000001110000011111000001001110010010000000000111111010000100011100110100101101000011010001100001011011001111001001011011101010100011101010101011000010011100011001110010001011111101011111000001001100011001100010110100101110111001011010111110111111000001100011010100001111000011001111100011100101000000011010110101110001 0010010011111001001010101111001110111010001000100111010111111101001101010111000111111111010111001001011000001011110111110100010101011100011000001001100011000110101111010001010010001110001111110111010000100101001100001100001100000010001011110011100111111000010111100100110011011100100001100111001001010111011001110100011011011010101101100111011101100011111101010100100100001111011100000001100011101111 1011100101110000110000000101000101001111100100000110010111110000111011110110000100100110101011000111100100101011110100010111101101000001100001101011100111111111000101001000110110011000111010100111011100000000010101101000110001100110100110000011111100101101110101101111100111101101100110110000100101010110111100000011111111011011111110111101011101110110001111010111100001011001111011011101111000111111 1111001100001000100001001001001111010100010100001111000000001000110010010011100110100011011000100000000110110000001111010000111011001111000001010110101000111110001010111101001111111011011111111001011110100001010011110100000011000001000001110011110110011011010101001010100000110101000100011011111101011100000110011111011011011110100111100101010101100010011001110001101000000110110111010011101000010100 1010001011001100001010010001100010011010011100110111110101111010110101000111000001110100010101101011010101010100001110000110010101110000000110100101001110000010010001111110011111100101110100111001011101101100110101010001000000100011111001101000010010101010011001100000001111011111110000111000011010100111000001001110000010101011000000011110001010111100101001100001101010111110000010111001010111001010 0001011011110010110101110001100000011111101110110001001000101100000111010000101110100111011011110000101011101111011000000100110101110010101110011100100000100110101000001111001101011010111000111000011010110001111001111000001001000011010011011011100100011111100101110001110101101101000110010100011101010110000100111101100001010001000110001101111100001010110101101010111110001110110100101000111110010001 0001100111010011111111011110100001000101101011000110010111100010111101101110011111010100000100010010110100001001101011110000001110001001000100111001001101110101110010001010010111111100001111000110000001010100011011110001100110010010000101010111100110000000111101010101100010011000101101011011010011100011111000000110111111101100011100110011110001000111011000000110110011111111000001010011111011111100 1101011000110111111001010110110011101011000100101101100101001000110010010110001111000101100000010110000011110101000100010001101100110001111101001101010110000101000001100001111011111100100101100001101110010011100001111110011001100100000111111110110100011011000001011010000111110101100001101111000000101111010010110100100100101111000010010001011010010011000100111001010010100010001110110010101111011111 0110100111011110111011110011100001100011111100010010110011100111110010011101001111000000101111000110111011011100011011011110101100000101011111110011011100101010001010000100110110100101111000111101101010010111001010001001010100100001001111010001101011001111011011110111010011010101110100000100001110110100000101010001101101001110111010110011010111111000011110001111110101111000100101011010111111010101 1010110110010010111011000000110000011100101100001001100101010101111011000000111101111100100010111110110110110001100010001110000010110101111110011110001011011110011110011001110001011000111101010111000100010100000101111100100001111101100000100001011101011011100010011101111010101000010000001111001110110000100010111110011101011000110000110101001101010011000100100000100111001000100111010100010000101011 1001000000010111111011110010111000101010100100110101111000010110100101000000001110110110010111001010100000000110010101011011001101100110010001110111111101000110000100111011011001001001101111111000101000111011010000110000101000110011111000110111101110100101011111011101001010101100000110101110000101000010001000001001110001110101001111000011011000101110110011110011011110111000101000010110011010011100 0111101010010000100101011101010001101011010001111010100001101101010001100001111111100011110110101110110001101000100101101001000010110011011000110110001011101101101000111011010011011111011011011111111100000100110101010100010110101101101011111110011010010111110000101101101100010011011110110000001000111111101010001100111111111101110011011010000001110000101101110111000110111100111111011011111011010101 1001100011110110110010011011000111100011010000100101000011111101010001101111100011110010011101001011111101111100110010011010110100011101010000111011100001100010111100101111011011100000111111110010100011101110100011101100000001111101101000101011111000001001111010100001001110000100100010110101010101110100100010101101010110101111001111000100010111101011101111001100110000110100000111100111010000110111 0101101111111011000111110110000010101101001011010110011011110100101010011000011100011110010011010101010001010010100111101111010011011111101111001010110010001000111001100100100001010010001010010010010011011111100000011011010100100100101110100010101101110000100001011101010100101011000111011101000101100010001010111110011001001111010111001011100111000101101110011001001010011101011110010100011101000111 1000100000101100001010111011010000100100100010010000110101101001111111110100010000011110010001001011100001110011101001000000001011101000011010110100001010110010111010011101110100011110110101011111110010110000000001100100101110011111001111001100001110110010000010111001110011110010011000110001100001100001110001011100100101010111010010010111110011011101011110011001111001110010000101011011011111001100 0101100100001111100000100000010001000111101100111001111011011010110100101111111010000000111001100111000010000000001111001100101100111100000101001100110011011101100100110000010011110110111011001110101110111000111011110011010101100000010100000001011011011110110101010010110010100010110000111100000111100100011000011101100001010111101100110001100111101100011010101011000011000000110011011111011000111000 1000100010001011000101101011000010001111101011011101111100010100101001110101100100101010100011111110011001001000111000001100101101111111011011000010101111011010010011110000111000110000011010010010000111010100010101001011111100111010111010110110010100100110010011100011111010011001011110100000011101011110000100001101101101001000100110000110011101011110101011101001000111010001101000101100001011111011 1011010010011001101110000101101011001010010001100001111011010110000111011110100010101000001100101010100001011110000011010001010101100110101011101001101000101000000000011111111110101001111010100001011111111111100110100000000001001010000011100011001100000001101010011111110010001100101011111010111000100101111001001100001111001000110100011010101011000011000100011011110001011010001000111010100000010010 0001000111001111001010100011111000011110110101010000001100111010011010111000001001101010111110010010000001100100010011100101000000110001001010110101111011100001011001001001101011111000110101110100011111111100001110010101001101100111001011001001100111001110011101100111010011001010001100000101111010101101010111011011111011110001010001100100110101110101000111110101110110100100101110111111111000011001 1100011110000110111111100000010011111110011110001110111000001101001011011100001010101001110100000111000111001010111111000100100101001000110111010100110011010110010100001000100001000100101001001000000011010110110110000101100011000001101101111101111111101001111111011110111101100100101001110000010000110001000000100100111100011110011110000110100011011011111110001010001110001011110010010011101000001011 0101011101101010110101011001011010010001100101011010101100001010101001100110101100010110100010010110111101101101110000111101010110011111000001001111101110010101101010111100111000100110010111110011000100010110101011000010011111001101101001010111010111100101100101011011001111100000011000100101110110011111111100101110000110000111101000111110101011011000111011110110001001110010101100011000110101010100 1011000111100101110111111111101111000010110010100101101100011101111011001011101100011101110010111111001010001011110100010001011001101111000101010001101111111011010001100110000010111010000001001001111010111000010100000111001111011000101011110111011000101111000110111010010111101010110001000110111101010000101100001111110100110011010001100010100001100110010010111110011000110000100101011100010001011011 1101011110011111000101001100001000101001110101101011010111000101010010111011000011101001111001111100011010111111100110001110001100101100011010101000011000011100000101100011000100101101101011100010111011010111000000111100001101110101101111000011001010101000101010011000001011101011100110111101001101000010010111000000001100010001010110000111011011111110010010000000100010011111000011111000100000001001 0011011110001110100100110100000011001111101001111111001001110101011110010011111101110110100111010101111111101011100010111010110001101000100010110101110011111111100011100010110110000011110110100000100111000010000101111100000100110011100111101010011011011001011000011100111101111011110110000101100010011101101110101010010101100010001011011110111000011110000111001100100101110101001101110011100101100111 1101111100110000100000110110100101101010111011000111100110100101100010000011011011011010010010100100101001101110010001100110000111011011111001100010110010000011101010101100110000001100100000011110101100001000001100110100101010011110000001110010101010010110101011001000011110010001111010000100110000110101001010000000001100111000010100001010000110000001101100011001010111101000111001010000101001001111 0110000100011000101010100101101111100001110000000001001100111010000101000000110100101111001111100100111110101001000100010001100100011111010011000001100000011110000001111011001101110101000011001001010110100010100101110010011110111111111100110010001101100011110001001111011001101001101100111010011110010010000011011000110000100100110101000101101010010001110010110001010101110010110011110110111011101000 1010011111011101010110110010000011110111011011101000110000001000101010100100010111100001001010010000111110011101010010011011011010000001111110010011010001010100000010001010110100010001101001110100001101110010101111110010111010011101011101001110110101011101000111010010101110101001001111111000001011101000000001111011000011101101001111000011011100101100001000011000101001011100010010011111110110011000 0101111110001101110001111000101100011000111111111100011101011110100110101010111101111000111110001111111110111011101110110011001001001011111101110111010001001100010011100111010000110000110100111101011111001100110001101000000100001011111010011001011101100001010001111111001101110110001011000111111000001110001101101110101111010011111010100001000101011001000000011011010110110111011000101101000000111010 1101100100001111000110100111000011011100011001011111001100110000100110101011010100100101001010111111101000100111100010001101010001101000110110100111111000000110010100010010110000000100100100101110011000100110101010011100110101011001110111111011101011000001100000100001100110111111011101001101111001110010101101101110011100011001110101011111011101011010110111111010000100111110111100110111101011000110 1110011010010011100101111101001110011001010000000110010000100010100010110101101001110001100010001000001010001000000101100101110000101010101100000000101001000111011010011000001011000000100100100101011000101111000110010010101111111110100011011001110001001100100010001010100100001100110011100111101100110101111101011101010110001000001110110100011100111011010110101000100110101000110010100100100000001110 0101011011110000111101010101111110000011000100111001110010001011111011000001110010111011011000100011101111111101110001100101000101101110110010101000010100000100001110010011111110100001100110101101010011101111101001010111101100101000010110100001001001000000101101110101000101111111011011111111000000111000000011010101110011001110001010001101011001011010010111101100001111010000000111101110000111001011 0011111001111101001011011000100101000000101010101100010110111000000000001010000011001010101111111011010101010001011010111001110101110100000001100001110001010000001101010101011001010011100011100111011101111000001000110010010000001110110110100110000100101011111001001111100001011101111010100110111111110111101010001011110010000110001101110111011110011011000101000000010001001110001000101001001011110011 1001011000110101110101111111001000001111111100011010111011111010010111110000011010010000111100010110111111011101100101110000100011000000100100111010000110001101110010000000100110111111100010000110101000110011110100010000101110001000010101110110011000011100000001011000011100111110000001101110101010001011111111111001111110011111000101110110000100000110101111000001111100111001001010000110000111110110 0001010010011110101111000010100101100111001111011101101101111111101101111001101100101001010111101001011011010010110011001101001001100100010110001010101010011101100101001100001000001111000001011011111101110011100010100111001011000101110100101101000111001001110100110110100101100011001000111010011100101010111110011101111100101110010110101011001000101010001001010001110100011000111101000111000000100011 0101100011001101100110010100001110111000011000001000111010110000011010101101001010010001010000111010110011000001110010000011111010101100101011111011100110110100001001111101100100011000110100010010111101111111001001101011010101100101110111011000010111001001110101011000101011001001000100011110010110001010001001010101111000011001000001100101100010111100001010010010110110111101001011001100001011110100 0000011101101110100010110011100000001111010110100000110010011111001110011100001010011110111011101000001001101011110010011110100101101010111110001110010011100000110011001100110111001010011011000010001000010110010011001011000010100101001100110101010010101101111100010110011101010011101101101110010101111011110111011010010100100101110001010011100100001011110000110110010100011100010011101000011111111111 0101111001010110100001010010111011000110111111101101001101001111110001000111000011100111100011001100000011100010110101101101111110110000001001110010100001001011001011000001000101111101010000000001010110010101000101100111000111001010110111010111000011010111011010000100111101111010110100101001010110010011111001011001001101011000000010011100000000001011011101000000101011000011000011000011011100111000 1010000010111010100110001000100111100110011110001110100100000101001011100000111100001001110011001001101000001011110011001010101001110011000101110101000111011000111011000100001011110010001011000011100000100110110000001100111001010110000110011011001100000100111110110001101001100011010101000011110111111101000001010111011001100000011011111001001000101011000000110111010110010101110100111000100100001000 0110100100010100110100110101110011010110011100111011001100111010110001100101000000000011010110000110110010110000011011101100110011001110111001010000010010101101000010011001001100100010001011000111111110101010100000111100101111001011000111110111010001000111010101100010000011011111111000100100010100010010110011100011011100100101011010000110000100111001000001110011111101000111100111110010111001111110 1111111100111100100101110111010010011010001000001011100100100101010110101001111100101001101101001011000011011110001101101001010001000001000001011011001011110011000100011011100110011101001110110111001100011111100110101111101001111110101010011010010000011000011000001101111100101001101010010010000011001000111101100100111001111010011001101001101011110110110110011110000111001110110001100010001110111101 0101000011100111010001011010100011011100111010001111000010011110110100001010000001111101000001110010011000001101100110111000000110100101111101111110011111010110001001011000100110011000010111111101101110111000110101110010110110001111001011011010001000001000111111101000110001100100001111001011101010000101010010011010110000101111000110001010011111111100000110001101101001111110010101110100000100000010 1000000101010100011111100111001111000001111110110000001111111001101010001011100110000110100110100000011011010101010000100000101101011000000011101010001101010011000111000111111101011101011100011111001001000010110011100101101100110101110001101001100100011110111111100011101001001011110000100010010001100001101100010111110001110010101001100000101110000001111111111101011100010001110110110010101001101011 0010001101101001110100010110110101110001010101001010011010011100100001011111100010001011110010000111111011111000111001001110001110110010110011101101111100001000010001010000010110000101000010010100011010001111110000000100111000010001011101010110100011010100111000011110010101110000111110010000110010100011000111010101001011101101000101010101111011110001000000101001111010111101010100011001110101101001 1100101111100011011001100111000010011000011100101111000100101011000100000101101101010010001001110110100001101011100010101001100000110100110100010000110101010101101011100110101010011100011010011100101100000100011001111101111001001011011011110010000010100011010010011101110010011111111111011111010111010000110100001001101001100000001000101011110110100010111011010101001101010001111011100010111110010000 1000101111001101001101101110000011001011001001111110111000001111000100010110000000100100001011101000101010111111100101111011101011110000010011000101011010101100101011001001000100011110111110110110100111100000000100110011000000010110010100001010010100100000101111001101001011001100000100000110011110110100000100110011110111011011001000010101000100011111001101100111000010111111101101001101110000010110 0101001101111100010010010110110110101110001010110011000010001001111101000000101000011011010111111000100001111010110100010011011011100100010111100100100100110101000000100011100000100001110100001101100100101101000010001001111000100000000001001001010000100001010111100011011110100110000111111011010101101100011000010111110000110110001001000010011000110000111010110010011101010101000010000000011100000010 0010000001000101111101000101000110000011111001000001000100011100111100011000100010010011111101110110000001001110111111110010011000110011011110111010100111101010001110011001011011100010011001011110101101111000001101000010010000101001001010010001110000101111111000010101000100110010111110101011001101101011010110011000010111101010010000100001110111000010101101110100110010101000001000110001111101110010 1110001001011010001111111001000100010011010110110000000010000001011010100101111011100100001001010010100110111001001110000101001001011010101111110110111011101010111100100010011100000011101000111101111100010101101101010111010100011111100011011000010011001110101101010110110110110101001011101010000110100010101111101010001100010111100101100111101100011110011101110001101011101001001110100000111000010100 0010100011110000110101010010010100000100110110010110110100100010110110000001111110000111001011001000101010101010010011110110010111001011000111000110111010011100011111011010001100000000001110111001100110101101110011100111011100001010101011001000000101100000011001111101010100001111101111111111110101110011100100011010000100011010101110111000101011100101100110110100101000111101111100000110000000111000 1101101010001110010001001010110111101000111110000110000001111100010011100011110011101011001100000001010001001101111100101011011101111001011100011111101110100100010101001010010010010100011000110001000111001111110001101010000010000001110001100010001101011000100111110011010111100110001000011110000101010110000001100111001100011100011110100100111101011000110111011000110011110100001110010000100110101110 0001110101110110100100010101010110001110110110100000000101100010010010010101110110010110011000001101000000000110101000100110001101100100001111011101001101011000111000011011100010010111111001010100000001011111010111110001101011111110110101001100110000101110111010110101000010011100111010100001000100001010101111000100111110001011000100111010001010100100001001011001111000111111011010011000000000100001 0101110101010001101110110000011110000000101100001000000101101111000010101110101101100000010001010111111001011001011101111100010100110111110110001111111111011010100011100101111000001010001010000100111101100000100101001011001100011100011111001100110111101110101101001000011101010000101111001000101111101111111010110100000111100010001001101110011011111111100000000110111111100111011000101100001111000101 0100011001001110111000010010001001011101110100011011001100000000011100011010001111110000101011011001111011001000000001010111101011010010010111111110000111010110000101111100111110000011101010001000001000010111111101001101000011001110011011010011100110110010111010011001011010011100101101011001011011011111000000001011010001110011111010100001010110001111000100110100001110110001111011111100100000101000 0110000010000001110100100010111011110100011000101011000111001111101100101101011000000110111001011111010010010100100010111111000100110000001000011001110001000000001000111101001110000110001111100011111010000011100011111011000011111100111010111110110010001111001010100010001100100001011110001001000111101010101111111110001010110111110011111010000111001100110001110110000101111111110110101001001001010110 0100100110000101101001100011111011001110010101100001011100011101001011000001100110001011111010001000011101100010101110110000001011000100110100010001101101001101001101111001111010110100110110010010001010110001011111010101100100111011011011100101101101101101101100100001000110010011111100100110000000110111110100000110111000000001011010011111111001101010110011001101000001110011101110010001100110011111 1001100011001100000101011111010101101000000010111010110011111001000010110111011011101000101011000100101111110001111101110010101010110010100000010010011100111101000001110101101000010011000100010100111101001100010000001010111101000011010011011101110001100011011101010010000011010111100001001110111100101011111101111111100011001001110100000011100111100011001110010010000001100000110001000000001000110111 1010110100000001111001110001000010100111010011010110001100110000111111011101100111111110000000110111101101111110100110010100101110100001100101110110100000001001001100111000011110110000010001101100010111110101100100000010010111011101001010011110110000000001001100000001011010100111001101111110110000101010111001000101001101011110000011010001110111010011100100100100110111111110011101011111011001011110 0101101010110100011110011010010111011000000011001110001000100011000101001111100111000110000100110011000110111001010101101110100110010110010011000000101011011111110100011000111110110011000011110101010101001001000101011010111110111111001000000110110101100011101010100111010010000011010101011101100001011001110101101001111100110000010010100100000110100010110010000010001111100111011000010011011100010011 1010001000001010100100101000001110001111011110000101100101100101001100111011001111110111000010100101101011011101100010100101010100000111111110011001000101011011101000000011101111010100000010100110101001101111101001101011111110100010011111011011010001001101000000011010100001001100101101101111001110110110011001110011101100000011101010000011110110111101000000100001001010001111111011111000001100101000 0100000111010010000001000110101101111100101100111010000011110111110100111111010111100010000011000001100011110001010100010101001101111101001000100000111101010100111110100001101101001101000000001000001001011010111000011010000111111101111011010110111011110110101011010100111010110010000000011011011110000110010110110001010000000010110001111010100010010100110110001010101111001101011010101111000111010010 0111111000100000000011011010100100000101101110111010111011011111010110000110111100111111000100110100110100001100001010110000100111010101001110001001000111000000010101001110001001011100111010110101110001000010001101110111000011001100100111010100010001011100010100010000110101110011011111110110010001001011111011110100111000111100111101000000100001111110001110010000111110100010000011000110100111100010 1111011000101111110110111001011000001001101111000000110000100111100000110101111111001111011101010111110111000111001100111110010011011110110110110110011011001010110011111011001101100010010010111000011001010000011101000110100011111011001101101111000101110110011001110011111011000110010001111100001001011110110001010011001010000100111000011000010001110000011100000111111001111111000101011101111101010001
cTrader Algo

KeyDownイベント【cAlgoAPI】

3/3/2021 3/4/2021

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

特定のキー押下で処理をする

cTrader4.0でやっとできるようになりました。キーボードイベントの処理。これにより、自作インジケーターやcBot内でキーボードからいろんな処理を行わせることができます。

 

使い方

他のイベントと同様です。Chartオブジェクトが持つKeyDownイベントに処理を登録してあげてください。

どのキーを押されたかは引数となるChartKeyboardEventArgsオブジェクトを利用して判定します。

なお、単純にホットキーを作りたいだけであれば、後述のChart.AddHotKeyメソッドの方が使い勝手がいいです。

 

サンプルコード

イベントの使い方さえ知ってれば難しいことはないと思います。

protected override void Initialize() {
    Chart.KeyDown += Chart_KeyDown;
}
private void Chart_KeyDown(ChartKeyboardEventArgs args) {
    switch (args.Key) {
        case Key.P:
            // --- P押されたときの処理
            break;
        case Key.Q:
            // --- Q押されたときの処理
            break;
        case Key.R:
            // --- R押されたときの処理
            if (args.ShiftKey) {
                // --- Shift+R押されたときの処理
            }
            break;
        default:
            break;
    }
}

ちなみにこのコードだとShift+PでもCtrl+PでもAlt+Pでも”P押されたときの処理”が走りますのであまり現実的ではないです。

 

cTrader本体のホットキーとかぶらないように注意

cTraderに最初から登録されてるホットキーについてはcTrader本体にとられてしまい機能しません。cBot、Indicatorには流してくれないようです。

cTraderのホットキーはユーザーが独自設定している可能性があるため、配布、販売するプログラムでは気を付ける必要がありそうです。

 

ChartKeyboardEventArgsクラス

押されたキーの情報を保持するクラスです。

public class ChartKeyboardEventArgs : Object

 

プロパティ
(Chart) Chart

イベントが発生したチャートを取得します。

(Key) Key

押されたキーを取得します。

(ModifierKeys) Modifiers

同時に押された修飾キー(Ctrl,Alt,Shift)を取得します。

(bool) AltKey

Altキーが同時に押されたかどうかを取得します。

(bool) CtrlKey

Ctrlキーが同時に押されたかどうかを取得します。

(bool) ShiftKey

Shiftキーが同時に押されたかどうかを取得します。

 

 

メソッドで新しいホットキーを登録する

ChartのメソッドにAddHotKey()メソッドが追加されました。単純に「このキー押されたらこの処理走らす」みたいな使い方をするのであればこっちを使った方がいいです。

また、このメソッドでホットキーを登録しようとするとcTrader本体のホットキーと被るとこんな感じにログに出力してはじいてくれます

Failed to add hotkey “Control+W”.

ホットキー登録するだけなら、KeyDownイベントではなくてできるだけAddHotKeyメソッドを使った方がいいでしょう。

(2021/3/4 返り値が誤っていたため修正)

 

(bool) AddHotkey(Action action, Key key, [ModifierKeys modifiers])

第一引数は引数なしのActionか上記ChartKeyBoardEventArgs型の引数をとるActionを指定します。簡単な処理ならラムダ式で書いてもいいですが、メソッド用意しておいて、それを渡してあげるのがわかりやすいかもしれませんね。

第二引数はKey列挙型を渡してあげます。Key.Pとかそのまんまです。

第三引数は省略可能。修飾キーをModifiedKey型で指定します。Alt押しながら、とかのときに指定します。Key単体でホットキーとして使うなら省略していいです。

返り値はboolで成功したかどうかを返します。すでにcTraderのホットキーとして設定されていると失敗し、falseを返します。

 

(bool) AddHotkey(Action action, string key)

第二引数が文字列になったバージョン。”P”とかそのまんまの文字列を渡します。

修飾キーを指定する場合は“Control+P”みたいに+でつなぎます。Alt,Shiftはそのまま、ControlはCtrlでも大丈夫です。すべて小文字でも構いません。

Key型とModifierKey型で指定したほうが間違いが少なそうですが、文字列にしておくと一目でわかりやすいというメリットはあるかもしれません。

 

サンプルコード

protected override void Initialize() {
    // --- 第一引数Action型のラムダ式、修飾キーなし
    Chart.AddHotkey(() => Print("P-KeyDown"), Key.P);
    // --- 第一引数Action<ChartKeyboardEventArgs>型のメソッド、修飾キーあり
    Chart.AddHotkey(PrintOpenTime, Key.P, ModifierKeys.Control);
    // --- 第二引数を文字列で指定
    Chart.AddHotkey(PrintOpenTime, "Alt+P");
}
private void PrintOpenTime(ChartKeyboardEventArgs args) {
    Print(args.Chart.Bars.LastBar.OpenTime);
}

 

これでPだけ押したときには”P-KeyDown”がログに表示されます。Ctrl+PかAlt+Pを押すと、最後のローソク足のOpenTimeが表示されます。

サンプルコード書いてて思ったのですが、AddHotKeyのActionでEventArgs引数が必要な機会ってほとんどない気がします。外部のメソッド登録して、Chartを渡してあげたいときくらい?

 

 

関連する列挙型

Key列挙型

各キーを表す列挙型です。マルチメディアキーとかもそろってますので、だいたいどのキーでも使えると思っていいでしょう。

個人的に使いそう、かつ、わかりにくそうなとこだけ表にしておきます。

NumPad1~9 テンキーの0~9
Multiply, Divide Add, Subtract テンキーの* / + – (Add,Subtractはデフォルトだと拾えない)
D0~9 数字キー0~9
Up,Down,Left,Right 矢印キー(Left,Rightはデフォルトだと拾えない)

全部確認してませんが、たぶん.NetのKeys列挙型とだいたい同じです。(どうでもいいけど、こっちはなんでKeysじゃなくてKey列挙型なんですかね?修飾キーはModifierKeysなのに。)

「このキーはどんな名前で登録されてるんだろう?」と思ったら、下記コードをcBotのOnStart()内に書いて試してみてください。

Chart.KeyDown += args => Print(args.Key);

このcBotを実行してる状態で何かキーを押せば、キーの名前がログに表示されます。

 

 

ModifierKeys列挙型

修飾キーを表します。

None 修飾キーなし
Alt Altキー
Control Ctrlキー
Shift Shiftキー

なお、Flags属性を持つため、ビット演算子を使った指定が可能です。

Chart.AddHotkey(() => Print("P-KeyDown"), Key.P, ModifierKeys.Control | ModifierKeys.Alt);

これでCtrlとAltを押しながらPを押したときにログにP-KeyDownと表示されるようになります。

この指定方法、馴染みがないと間違いやすいのですが、&じゃなくて|ですのでご注意ください。


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

新しいコメント

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

cTrader's Life

© 2026 ajinori