#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <utility>
#include <queue>
#include <set>
#include <map>
#include <deque>
#include <iomanip>
#include <cstdio>
#include <complex>
using namespace std;
typedef  long long ll;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<VI> VVI;
#define  MP make_pair
#define  PB push_back
#define inf  1000000007
#define rep(i,n) for(int i=0;i<(int)(n);++i)
typedef complex<double> C;
#define EPS 1e-10

const double PI = 4*atan(1.0);


struct L : public vector<C>
{
    L(){}
    L(const C a, const C b) {
        push_back(a); push_back(b);
    }
};

double Sqrt(double x)
{
    if(x<0) return 0;
    else    return sqrt(x);
}


//2円の共通内接線を求める
L getintangent(C c1,double r1,C c2,double r2,double flg)
{
    C base=c2-c1;
    double w=r1+r2;
    double h=Sqrt(norm(base)-w*w);
    C k=base*C(w,h*flg)/norm(base);
    return L(c1+k*r1,c2-k*r2);
}
//2円の共通外接線を求める
L getouttangent(C c1,double r1,C c2,double r2,double flg)
{
    C base=c2-c1;
    double h=r2-r1;
    double w=Sqrt(norm(base)-h*h);
    C k=base*C(w,h*flg)/norm(base)*C(0,flg);
    return L(c1+k*r1,c2+k*r2);
}
//2円の共通接線を求める(各直線の２点はそれぞれの円の接点)
vector<L> gettangentCC(C c1,double r1,C c2,double r2)
{
    vector<L> res;
    double d=abs(c1-c2);
    if(d>r1+r2+EPS)  res.push_back(getintangent(c1,r1,c2,r2,1));
    if(d>r1+r2-EPS)  res.push_back(getintangent(c1,r1,c2,r2,-1));
    if(d>abs(r1-r2)+EPS)    res.push_back(getouttangent(c1,r1,c2,r2,1));
    if(d>abs(r1-r2)-EPS)    res.push_back(getouttangent(c1,r1,c2,r2,-1));
    return res;
}
double dot(const C a, const C b)
{
    return real(conj(a)*b);
}
C projection(const L& l, const C p)
{
    double t = dot(p-l[0], l[0]-l[1]) / norm(l[0]-l[1]);
    return l[0] + t*(l[0]-l[1]);
}
double distanceLP(const L &l, const C p)
{
    return abs(p - projection(l, p));
}


int main(){
    int n;
    while(cin >> n&&n!=0){
        vector<C> x(n);
        vector<double>r(n),m(n);
        rep(i,n){
            double a,b;
            cin >> a >> b >> r[i] >> m[i];
            x[i] = C(a,b);
        }
        if(n==1){
            cout << 1 << endl;
            continue;
        }
        int ans = 0;
        rep(i,n){
            rep(j,n){
                if(i==j)continue;
                vector<L> v;
                v = gettangentCC(x[i],r[i],x[j],r[j]);
                
                rep(c,v.size()){
                    int tmp = 0;
                    rep(k,n){
                        if(distanceLP(v[c],x[k])-EPS <= m[k]+r[k]&&distanceLP(v[c],x[k])+EPS >= r[k])tmp++;
                    }
                    ans = max(ans,tmp);
                }
            }
        }
        rep(i,n){
            rep(j,n){
                if(i==j)continue;
                vector<L> v;
                v = gettangentCC(x[i],r[i]+m[i],x[j],r[j]);
                
                rep(c,v.size()){
                    int tmp = 0;
                    rep(k,n){
                        if(distanceLP(v[c],x[k])-EPS <= m[k]+r[k]&&distanceLP(v[c],x[k])+EPS >= r[k])tmp++;
                    }
                    ans = max(ans,tmp);
                }
            }
        }
        rep(i,n){
            rep(j,n){
                if(i==j)continue;
                vector<L> v;
                v = gettangentCC(x[i],r[i],x[j],r[j]+m[j]);
                
                rep(c,v.size()){
                    int tmp = 0;
                    rep(k,n){
                        if(distanceLP(v[c],x[k])-EPS <= m[k]+r[k]&&distanceLP(v[c],x[k])+EPS >= r[k])tmp++;
                    }
                    ans = max(ans,tmp);
                }
            }
        }
        rep(i,n){
            rep(j,n){
                if(i==j)continue;
                vector<L> v;
                v = gettangentCC(x[i],r[i]+m[i],x[j],r[j]+m[j]);
                
                rep(c,v.size()){
                    int tmp = 0;
                    rep(k,n){
                        if(distanceLP(v[c],x[k])-EPS <= m[k]+r[k]&&distanceLP(v[c],x[k])+EPS >= r[k])tmp++;
                    }
                    ans = max(ans,tmp);
                }
            }
        }
        cout <<ans << endl;
    }

    return 0;
}


Measured memory_bytes: 3076