Problem: While walking down the street Vanya saw a label "Hide&Seek". Because he is a programmer, he used & as a bitwise AND for these two words represented as a integers in base 64 and got new word. Now Vanya thinks of some string s and wants to know the number of pairs of words of length |s| (length of s), such that their bitwise AND is equal to s. As this number can be large, output it modulo 109 + 7.

To represent the string as a number in numeral system with base 64 Vanya uses the following rules:

  * digits from '0' to '9' correspond to integers from 0 to 9; 
  * letters from 'A' to 'Z' correspond to integers from 10 to 35; 
  * letters from 'a' to 'z' correspond to integers from 36 to 61; 
  * letter '-' correspond to integer 62; 
  * letter '_' correspond to integer 63. 

Input

The only line of the input contains a single word s (1 ≤ |s| ≤ 100 000), consisting of digits, lowercase and uppercase English letters, characters '-' and '_'.

Output

Print a single integer — the number of possible pairs of words, such that their bitwise AND is equal to string s modulo 109 + 7.

Examples

Input

z


Output

3


Input

V_V


Output

9


Input

Codeforces


Output

130653412

Note

For a detailed definition of bitwise AND we recommend to take a look in the corresponding article in Wikipedia.

In the first sample, there are 3 possible solutions: 

  1. z&_ = 61&63 = 61 = z
  2. _&z = 63&61 = 61 = z
  3. z&z = 61&61 = 61 = z

Solution (in JAVA):

Solution:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class E {
    static int mod = 1000000007;


    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer("");
        sb = new StringBuilder();

        int[] pre = new int[64];


        for (int i = 0; i < pre.length; i++) {
            for (int j = 0; j <= 63; j++) {
                for (int k = 0; k <= 63; k++) {
                    if((j& k) == i)
                        pre[i]++;
                }
            }
        }
        // char x = 'z';
//         System.out.println(pre[61]);

        String word = nxtTok();

        int array[] = new int[word.length()];

        for (int i = 0; i < array.length; i++) {
            array[i] = getValue(word.charAt(i));
        }

        long res = 1;
        for (int i = 0; i < array.length; i++) {

            res *= pre[array[i]]% mod;
            res%=mod;
        }
        System.out.println(res );
    }


    public static int getValue(char c) {
        int x = (int)c;

        if (c == '-')
            return 62;
        if (c == '_')
            return 63;
        if (x >= 49 && x <= 57)
            return x -= 48;
        if (x >= 65 && x <= 90)
            return x -= 55;
        if (x >= 97 && x <= 122)
            return x -= 61;

        return 0;
    }

    public static int getZeros(int num) {
        int x = 32;
        int i = 4;
        int zeros = 0;
        while (num > 0) {
            if (num >= x) {
                num -= x;
            }
            else {
                zeros++;
            }
            x = (int)(x - Math.pow(2, i));
            i--;
        }

        return zeros;
    }

    static BufferedReader br;
    static StringTokenizer st;
    static StringBuilder sb;
    static FileReader fr;

    static String nxtTok() throws IOException {
        while (! st.hasMoreTokens()) {
            String s = br.readLine();
            if (s == null)
                return null;
            st = new StringTokenizer(s.trim());
        }
        return st.nextToken();
    }

    static int nxtInt() throws IOException {
        return Integer.parseInt(nxtTok());
    }

    static long nxtLng() throws IOException {
        return Long.parseLong(nxtTok());
    }

    static double nxtDbl() throws IOException {
        return Double.parseDouble(nxtTok());
    }

    static int[] nxtIntArr(int n) throws IOException {
        int[] a = new int[n];
        for (int i = 0; i < n; i++)
            a[i] = nxtInt();
        return a;
    }

    static long[] nxtLngArr(int n) throws IOException {
        long[] a = new long[n];
        for (int i = 0; i < n; i++)
            a[i] = nxtLng();
        return a;
    }

    static char[] nxtCharArr() throws IOException {
        return nxtTok().toCharArray();
    }
}