#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# 本番中には解けなかった。最初の3つの場合分けはできたが、
# その後に混乱して手がつけられなかった
#
# 解説pdf https://img.atcoder.jp/agc026/editorial.pdf を見た
#
# 個数の遷移をmod Bで考える。
#   最初は A mod B個。
#   B個の購入した後も A mod B個で変わらず。
#   D個入荷すると    (A + D) mod B個。
# つまり、入荷するたびに、
# A からスタートして (A + D) mod B, (A + 2D) mod B, ... (A + nD) mod Bと遷移していく。
# 
# その最大値 (A + nD) mod B が、C を超える場合、次 B を引くと 個数が負になってしまうので No。
# 逆に (A + nD) mod B が、C 以下であれば、Yes。
#
# 解説PDFの、「また，(B/g − 1) × inv(D/g, B/g) 回 D を足したときにこの上界が達成できます」
# 以降については理解できていない。
#



import array
from bisect import *
from collections import *
import fractions
import heapq 
from itertools import *
import math
import random
import re
import string
import sys


def gcd(a, b):
    while b:
        a, b = b, a % b
    return a


# def extgcd(a, b):
#     """ ax * by = gcd(a, b)の解(x, y)を求める。
#     x, y, gcd(a, b)を返す。
#     """
#     d = a
#     if b != 0:
#         d, y, x = extgcd(b, a % b)
#         y -= (a // b) * x
#     else:
#         x = 1
#         y = 0
#     return x, y, d


def solve(A, B, C, D):
    if B > A:
        return "No"
    if B > D:
        return "No"
    if B <= C:
        return "Yes"

    g = gcd(B, D)
#    if B - g + (A % g) > C:
    if (B - g + A) % g > C:
        return "No"
    else:
        return "Yes"


T = int(input())
for t in range(T):
    A, B, C, D = map(int, input().split())
    print(solve(A, B, C, D))
    

