#include <bits/stdc++.h>
#include <atcoder/modint>
namespace {
using ModInt [[maybe_unused]] = atcoder::modint998244353;
using Num [[maybe_unused]] = long long int;
using Vec [[maybe_unused]] = std::vector<Num>;
using Set [[maybe_unused]] = std::set<Num>;
using Mset [[maybe_unused]] = std::multiset<Num>;
using Edges [[maybe_unused]] = std::vector<std::vector<Num>>;
template<typename T>
using Q [[maybe_unused]] = std::queue<T>;
template<typename T>
using PQ [[maybe_unused]] = std::priority_queue<T, std::vector<T>, std::greater<T>>;
const std::vector<std::pair<Num, Num>> dyxs {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
std::map<char, std::pair<Num, Num>> directions {{'D', {1, 0}}, {'U', {-1, 0}}, {'R', {0, 1}}, {'L', {0, -1}}};
template<typename T>
void print_oneline(const std::vector<T>& vec, std::ostream& os) {
const auto size = vec.size();
for(size_t i{0}; i<size; ++i) {
os << vec.at(i) << (((i+1) == size) ? '\n' : ' ');
}
}
template<typename T>
void print_each(const std::vector<T>& vec, std::ostream& os) {
const auto size = vec.size();
for(size_t i{0}; i<size; ++i) {
os << vec.at(i) << '\n';
}
}
}
void solve(std::istream& is, std::ostream& os) {
Num t {0};
is >> t;
while(t-- > 0) {
Num a, b, c, d;
is >> a >> b >> c >> d;
if ((a < b) || (d < b)) {
os << "No\n";
continue;
}
if (c >= b) {
os << "Yes\n";
continue;
}
const auto rem = a % b;
if (rem > c) {
os << "No\n";
continue;
}
const auto left = c - rem;
const auto right = b - rem;
const auto s = d % b;
if (s == 0) {
os << "Yes\n";
continue;
}
const auto step = std::gcd(b, s);
const auto l = step * (left / step);
const auto r = l + step;
if ((l <= left) && (r >= right)) {
os << "Yes\n";
} else {
os << "No\n";
}
}
}
int main(void) {
solve(std::cin, std::cout);
return 0;
}