There are n games in a football tournament. Three teams are participating in it. Currently k games had already been played. 

You are an avid football fan, but recently you missed the whole k games. Fortunately, you remember a guess of your friend for these k games. Your friend did not tell exact number of wins of each team, instead he thought that absolute difference between number of wins of first and second team will be d1 and that of between second and third team will be d2.

You don't want any of team win the tournament, that is each team should have the same number of wins after n games. That's why you want to know: does there exist a valid tournament satisfying the friend's guess such that no team will win this tournament?

Note that outcome of a match can not be a draw, it has to be either win or loss.

Input

The first line of the input contains a single integer corresponding to number of test cases t (1 ≤ t ≤ 105).

Each of the next t lines will contain four space-separated integers n, k, d1, d2 (1 ≤ n ≤ 1012; 0 ≤ k ≤ n; 0 ≤ d1, d2 ≤ k) — data for the current test case.

Output

For each test case, output a single line containing either "yes" if it is possible to have no winner of tournament, or "no" otherwise (without quotes).

Examples

Input

5
3 0 0 0
3 3 0 0
6 4 1 0
6 3 3 0
3 3 3 2


Output

yes
yes
yes
no
no

Note

Sample 1. There has not been any match up to now (k = 0, d1 = 0, d2 = 0). If there will be three matches (1-2, 2-3, 3-1) and each team wins once, then at the end each team will have 1 win.

Sample 2. You missed all the games (k = 3). As d1 = 0 and d2 = 0, and there is a way to play three games with no winner of tournament (described in the previous sample), the answer is "yes".

Sample 3. You missed 4 matches, and d1 = 1, d2 = 0. These four matches can be: 1-2 (win 2), 1-3 (win 3), 1-2 (win 1), 1-3 (win 1). Currently the first team has 2 wins, the second team has 1 win, the third team has 1 win. Two remaining matches can be: 1-2 (win 2), 1-3 (win 3). In the end all the teams have equal number of wins (2 wins).
import java.io.*;
import java.math.*;
import java.util.*;
import java.lang.*;

public class Main {
    public static InputStream inputStream = System.in;
    public static OutputStream outputStream = System.out;
    public static FastReader in = new FastReader(inputStream);
    public static PrintWriter out = new PrintWriter(outputStream);

    static BigInteger five = BigInteger.valueOf(5);
    static BigInteger two = BigInteger.valueOf(2);
    
    public static void main(String[] args) {
        new Main().run();
    }

    void run(){
       int t = in.nextInt();
       for(int i=0; i<t; i++){
           long games = in.nextLong();
           long k = in.nextLong();
           long d1 = in.nextLong();
           long d2 = in.nextLong();
           
           if(done(games, k, d1, d2)){
               System.out.println("yes");
           }else if(done(games, k, -d1, d2)){
               System.out.println("yes");
           }else if(done(games, k, d1, -d2)){
               System.out.println("yes");
           }else if(done(games, k, -d1, -d2)){
               System.out.println("yes");
           }else{
               System.out.println("no");
           }
           
          
       }
    }
    
    boolean done(long games, long k, long d1, long d2){
         long n1 = (k+d2+2*d1)/3;
       long n2 = (k+d2-d1)/3;
       long n3 = (k-d1-2*d2)/3;
       
       
       if(n1-n2 != d1 || n2-n3!=d2 || n1+n2+n3!=k || 
               n1<0 || n2<0 || n3<0){
           return false;
       }
       
       //System.out.println(n1 + " " + n2 + " " + n3);
       
       long n = games-k;
       
       long wins1 = (2*n+2*n2-4*n1+2*n3)/6;
       long wins3 = (n+n2-2*n3+n1)/3;
       long wins2 = (n3-2*n2+n+n1)/3;
       //System.out.println(wins1 + " " + wins2 + " " + wins3);
       
       if((2*n+2*n2-4*n1+2*n3)%6 != 0 ||
               (n+n2-2*n3+n1)%3 != 0 ||
               (n3-2*n2+n+n1)%3 != 0){
           return false;
       }
       
       if(wins1>=0 && 
               wins2>=0 &&
               wins3>=0 && 
               wins1+wins2+wins3==n &&
               n1+wins1==n2+wins2 && 
               n2+wins2 == n3+wins3){
           return true;
       }else{
           return false;
       }
    }
    
    boolean inc(int[] arr){
        for(int i=1; i<arr.length; i++){
            if(arr[i] <= arr[i-1]){
                return false;
            }
        }
        return true;
    }
    
    void exch(int[] arr, int a, int b){
        for(int i=a, j=b; i<=j; i++, j--){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    
    int[][] arr = new int[101][101];
    
    boolean win(int n, int m){
        if(arr[n][m] != 0){
            if(arr[n][m]==1){
                return true;
            }
            return false;
        }
        if(n==0 || m==0){
            return false;
        }
        if(!win(n-1, m-1)){
            arr[n][m] = 1;
            //System.out.println("arr[" + n + "] [" + m + "] = " + arr[n][m]);
            return true;
        }
        //System.out.println("arr[" + n + "] [" + m + "] = " + arr[n][m]);
        arr[n][m] = 2;
        return false;
    }
}



class Obj{
    char val;
    int ht;
    HashMap<Character, Obj> kids;
    
    public Obj(char c){
        val = c;
        ht = -1;
        kids = new HashMap<Character, Obj>();
    }
}

class FastReader{
    private boolean finished = false;

    private InputStream stream;
    private byte[] buf = new byte[1024];
    private int curChar;
    private int numChars;
    private SpaceCharFilter filter;

    public FastReader(InputStream stream){
        this.stream = stream;
    }

    public int read(){
        if (numChars == -1){
            throw new InputMismatchException ();
        }
        if (curChar >= numChars){
            curChar = 0;
            try{
                numChars = stream.read (buf);
            } catch (IOException e){
                throw new InputMismatchException ();
            }
            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 int nextInt(){
        int c = read ();
        while (isSpaceChar (c))
            c = read ();
        int sgn = 1;
        if (c == '-'){
            sgn = -1;
            c = read ();
        }
        int res = 0;
        do{
            if(c==','){
                c = read();
            }
            if (c < '0' || c > '9'){
                throw new InputMismatchException ();
            }
            res *= 10;
            res += c - '0';
            c = read ();
        } while (!isSpaceChar (c));
        return res * sgn;
    }

    public long nextLong(){
        int c = read ();
        while (isSpaceChar (c))
            c = read ();
        int sgn = 1;
        if (c == '-'){
            sgn = -1;
            c = read ();
        }
        long res = 0;
        do{
            if (c < '0' || c > '9'){
                throw new InputMismatchException ();
            }
            res *= 10;
            res += c - '0';
            c = read ();
        } while (!isSpaceChar (c));
        return res * sgn;
    }

    public String nextString(){
        int c = read ();
        while (isSpaceChar (c))
            c = read ();
        StringBuilder res = new StringBuilder ();
        do{
            res.appendCodePoint (c);
            c = read ();
        } while (!isSpaceChar (c));
        return res.toString ();
    }

    public boolean isSpaceChar(int c){
        if (filter != null){
            return filter.isSpaceChar (c);
        }
        return isWhitespace (c);
    }

    public static boolean isWhitespace(int c){
        return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
    }

    private String readLine0(){
        StringBuilder buf = new StringBuilder ();
        int c = read ();
        while (c != '\n' && c != -1){
            if (c != '\r'){
                buf.appendCodePoint (c);
            }
            c = read ();
        }
        return buf.toString ();
    }

    public String nextLine(){
        String s = readLine0 ();
        while (s.trim ().length () == 0)
            s = readLine0 ();
        return s;
    }

    public String nextLine(boolean ignoreEmptyLines){
        if (ignoreEmptyLines){
            return nextLine ();
        }else{
            return readLine0 ();
        }
    }

    public BigInteger nextBigInteger(){
        try{
            return new BigInteger (nextString ());
        } catch (NumberFormatException e){
            throw new InputMismatchException ();
        }
    }

    public char nextCharacter(){
        int c = read ();
        while (isSpaceChar (c))
            c = read ();
        return (char) c;
    }

    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 isExhausted(){
        int value;
        while (isSpaceChar (value = peek ()) && value != -1)
            read ();
        return value == -1;
    }

    public String next(){
        return nextString ();
    }

    public SpaceCharFilter getFilter(){
        return filter;
    }

    public void setFilter(SpaceCharFilter filter){
        this.filter = filter;
    }

    public interface SpaceCharFilter{
        public boolean isSpaceChar(int ch);
    }
}  