Problem: This is an interactive problem. Remember to flush your output while communicating with the testing program. You may use fflush(stdout) in C++, system.out.flush() in Java, stdout.flush() in Python or flush(output) in Pascal to flush the output. If you use some other programming language, consult its documentation. You may also refer to the guide on interactive problems: <https://codeforces.com/blog/entry/45307>.

The jury guessed some array a consisting of 6 integers. There are 6 special numbers — 4, 8, 15, 16, 23, 42 — and each of these numbers occurs in a exactly once (so, a is some permutation of these numbers).

You don't know anything about their order, but you are allowed to ask up to 4 queries. In each query, you may choose two indices i and j (1 ≤ i, j ≤ 6, i and j are not necessarily distinct), and you will get the value of a_i ⋅ a_j in return.

Can you guess the array a?

The array a is fixed beforehand in each test, the interaction program doesn't try to adapt to your queries.

Interaction

Before submitting the answer, you may ask up to 4 queries. To ask a query, print one line in the following format: ? i j, where i and j should be two integers such that 1 ≤ i, j ≤ 6. The line should be ended with a line break character. After submitting a query, flush the output and read the answer to your query — one line containing one integer a_i ⋅ a_j. If you submit an incorrect query (or ask more than 4 queries), the answer to it will be one string 0. After receiving such an answer, your program should terminate immediately — otherwise you may receive verdict "Runtime error", "Time limit exceeded" or some other verdict instead of "Wrong answer".

To give the answer, your program should print one line ! a_1 a_2 a_3 a_4 a_5 a_6 with a line break in the end. After that, it should flush the output and terminate gracefully.

Example

Input


16
64
345
672

Output


? 1 1
? 2 2
? 3 5
? 4 6
! 4 8 15 16 23 42

Note

If you want to submit a hack for this problem, your test should contain exactly six space-separated integers a_1, a_2, ..., a_6. Each of 6 special numbers should occur exactly once in the test. The test should be ended with a line break character.

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.*;
public class Main {
    InputReader in;
    StringBuilder sb;
    Helper_class h;
    final long mod=1000000007;
    public static void main(String[] args) throws java.lang.Exception {
        new Main().run();
    }
    void run() throws Exception {
        in=new InputReader(System.in);
        sb = new  StringBuilder(); 
        h = new Helper_class();       
        int t=1;
        for(int i=1;i<=t;i++)
            solve();
        System.out.print(sb);
    }
    void solve() {
        int i, j;
        int ar[]={4, 8, 15, 16, 23, 42};
        HashMap<Integer, Pair> map = new HashMap<>();
        for(i=0;i<6;i++) {
            for(j=i+1;j<6;j++)
                map.put(ar[i]*ar[j], new Pair(ar[i], ar[j]));
        }
        /*for(Integer key : map.keySet()) {
            Pair p = map.get(key);
            System.out.println(key+"  "+p.x+"  "+p.y);
        }*/
        int ans[]=new int[7];
        System.out.println("? 1 2");
        int a=h.i();
        System.out.println("? 2 3");
        int b=h.i();
        Pair p1=map.get(a), p2=map.get(b);
        if(p1.x == p2.x || p1.x == p2.y)
            ans[2]=p1.x;
        else
            ans[2]=p1.y;
        ans[1]=a/ans[2];
        ans[3]=b/ans[2];
        System.out.println("? 4 5");
        a=h.i();
        System.out.println("? 5 6");
        b=h.i();
        p1=map.get(a); p2=map.get(b);
        if(p1.x == p2.x || p1.x == p2.y)
            ans[5]=p1.x;
        else
            ans[5]=p1.y;
        ans[4]=a/ans[5];
        ans[6]=b/ans[5];
        System.out.print("! ");
        for(i=1;i<=6;i++)
            System.out.print(ans[i]+" ");
        System.out.println();
    }
    class Helper_class{
        long gcd(long a, long b){return (b==0)?a:gcd(b,a%b);}
        int gcd(int a, int b){return (b==0)?a:gcd(b,a%b);}
        String s(){return in.next();}
        int i(){return Integer.parseInt(in.next());}
        long l(){return Long.parseLong(in.next());}
        double d(){return Double.parseDouble(in.next());}
        long square(int x) {return ((long)x * (long)x);}
        long mul(long x, long y) {long ans = x*y;return (ans>=mod ? ans%mod : ans);}
        long power(long x, long y, long p) {  
            long res = 1;       
            x = x % p;  
            if (x == 0) return 0;   
            while (y > 0) {
                if((y & 1)==1) 
                    res = (res * x) % p;  
                y = y >> 1;  
                x = (x * x) % p;  
            } 
            return res%p; 
        } 
        void sorter(int a[]) {
            ArrayList<Integer> ar=new ArrayList<>();
            for(int i=0;i<a.length;i++)
                ar.add(a[i]);
            Collections.sort(ar);
            for(int i=0;i<ar.size();i++)
                a[i]=ar.get(i);
        }
        void sorter(long a[]) {
            ArrayList<Long> ar=new ArrayList<>();
            for(int i=0;i<a.length;i++)
                ar.add(a[i]);
            Collections.sort(ar);
            for(int i=0;i<ar.size();i++)
                a[i]=ar.get(i);
        }
        int lower(int a[], int k) {
            int l=0, r=a.length-1, ans=-1;
            while(l<=r) {
                int mid = (r+l)/2;
                if(a[mid]>k)
                    r=mid-1;
                else {
                    ans=mid;
                    l=mid+1;
                }
            }
            if(ans!=-1)
                ans=a[ans];
            return ans;
        }
        int upper(int a[], int k) {
            int l=0, r=a.length-1, ans=-1;
            while(l<=r) {
                int mid = (r+l)/2;
                if(a[mid]<k)
                    l=mid+1;
                else {
                    ans=mid;
                    r=mid-1;
                }
            }
            if(ans!=-1)
                ans=a[ans];
            return ans;
        }
        void reverse(int a[]) {
            for(int i=0;i<a.length/2;i++) {
                int x=a[i];
                a[i]=a[a.length-1-i];
                a[a.length-1-i]=x;
            }
        }
        //String.format("%.kf",x)
    }
    class InputReader {
        private InputStream stream;
        private byte[] buf = new byte[1024];
        private int curChar;
        private int numChars;
        public InputReader(InputStream stream) {
            this.stream = stream;
        }
        public int read() {
            if (numChars == -1)
                throw new UnknownError();
            if (curChar >= numChars) {
                curChar = 0;
                try {
                    numChars = stream.read(buf);
                } catch (IOException e) {
                    throw new UnknownError();
                }
                if (numChars <= 0)
                    return -1;
            }
            return buf[curChar++];
        }
        public int peek() {
            if (numChars == -1)
                return -1;
            if (curChar >= numChars) {
                curChar = 0;
                try {
                    numChars = stream.read(buf);
                } catch (IOException e) {
                    return -1;
                }
                if (numChars <= 0)
                    return -1;
            }
            return buf[curChar];
        }
        public void skip(int x) {
            while (x-->0)
                read();
        }
        public int nextInt() {
            return Integer.parseInt(next());
        }
        public long nextLong() {
            return Long.parseLong(next());
        }
        public String nextString() {
            return next();
        }
        public String next() {
            int c = read();
            while (isSpaceChar(c))
                c = read();
            StringBuffer res = new StringBuffer();
            do {
                res.appendCodePoint(c);
                c = read();
            } while (!isSpaceChar(c));
 
            return res.toString();
        }
        public String nextLine() {
            StringBuffer buf = new StringBuffer();
            int c = read();
            while (c != '\n' && c != -1) {
                if (c != '\r')
                    buf.appendCodePoint(c);
                c = read();
            }
            return buf.toString();
        }
        public double nextDouble() {
            int c = read();
            while (isSpaceChar(c))
                c = read();
            int sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }
            double res = 0;
            while (!isSpaceChar(c) && c != '.') {
                if (c == 'e' || c == 'E')
                    return res * Math.pow(10, nextInt());
                if (c < '0' || c > '9')
                    throw new InputMismatchException();
                res *= 10;
                res += c - '0';
                c = read();
            }
            if (c == '.') {
                c = read();
                double m = 1;
                while (!isSpaceChar(c)) {
                    if (c == 'e' || c == 'E')
                        return res * Math.pow(10, nextInt());
                    if (c < '0' || c > '9')
                        throw new InputMismatchException();
                    m /= 10;
                    res += (c - '0') * m;
                    c = read();
                }
            }
            return res * sgn;
        }
        public boolean hasNext() {
            int value;
            while (isSpaceChar(value = peek()) && value != -1)
                read();
            return value != -1;
        }
        private boolean isSpaceChar(int c) {
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }
    }
    class Pair { 
        int x; 
        int y; 
        public Pair(int x, int y) 
        {
            this.x = x; 
            this.y = y; 
        } 
    }
}