#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
#define rep(i,n) for(int i=0;i<((int)(n));i++)
#define reg(i,a,b) for(int i=((int)(a));i<=((int)(b));i++)
#define irep(i,n) for(int i=((int)(n))-1;i>=0;i--)
#define ireg(i,a,b) for(int i=((int)(b));i>=((int)(a));i--)
typedef long long int lli;
typedef pair<int,int> mp;
#define fir first
#define sec second

typedef double D;

const D pi=3.14159265358979;


struct P{
	D x,y,n,n2;
	P(){}
	P(D ix,D iy){
		x=ix; y=iy;
		n2=x*x+y*y;
		n=sqrt(n2);
	}
	P to(P a){
		return (a-(*this));
	}
	P operator+(P a)const{
		return P(x+a.x,y+a.y);
	}
	P operator-(P a)const{
		return P(x-a.x,y-a.y);
	}
	P scalar(D a){
		return P(x*a,y*a);
	}
	D dot(P a){
		return x*a.x + y*a.y;
	}
	D cross(P a){
		return x*a.y - y*a.x;
	}
	D theta(P a){
		D s = (cross(a)/(n*a.n))>0.0?1:-1;
		return acos(max(-1.0,min(1.0,dot(a)/(n*a.n))))*s;
	}
	static P polar(D r,D t){
		return P(r*cos(t),r*sin(t));
	}
	P turn(D t){
		return P(x*cos(t)-y*sin(t),x*sin(t)+y*cos(t));
	}
	P tolen(D a){
		return this->scalar(a/n);
	}
	bool  operator<(P a) const{
		if(y!=a.y)return (y<a.y);
		return (x<a.x);
	}	
	bool operator>(P a)const{ return (a<(*this)); }	
};

struct L{
	P p,q,v;
	L(){}
	L(P ip,P iq){
		p=ip; q=iq;
		v=p.to(q);
	}
	bool iscross(L a){
		D da,db;
		da=v.cross(p.to(a.p));
		db=v.cross(p.to(a.q));
		if(da*db>=0)return false;
		da=a.v.cross(a.p.to(p));
		db=a.v.cross(a.p.to(q));
		return (da*db<0);
	}

	D dist(P a){
		if(p.to(a).dot(p.to(q))<0)return p.to(a).n;
		if(q.to(a).dot(q.to(p))<0)return q.to(a).n;
		return abs(v.cross(p.to(a))/v.n);
	}
	D dist(L a){
		if(iscross(a))return 0;
		return min(min(dist(a.p),dist(a.q)) , min(a.dist(this->p),a.dist(this->q)));
	}
	P crosspos(L a){
		return (p+v.scalar(a.v.cross(a.p-p)/a.v.cross(v)));
	}
	L bisection(){//垂直二等分線
		//半時計回りに90度回った向きの。
		P fr=(p+q).scalar(0.5);
		P to=fr+P(-v.y,v.x);
		return L(fr,to);
	}
};


D lowofcos(D a,D b,D c){
	return ((a*a+b*b-c*c)/(2*a*b));
}
struct C{
	P p;
	D r;
	L koten(C a){
		P cv=p.to(a.p);
		D br=atan2(cv.y,cv.x);
		D dr=acos(lowofcos( r, cv.n, a.r));
		P p1= p+P::polar(r,br+dr);
		P p2= p+P::polar(r,br-dr);
		if(p1>p2)swap(p1,p2);
		return L(p1,p2);
	}
	C(){}
	C(P ip,D ir){
		p=ip; r=ir;
	}
	vector<L> tangs(C a){ //接線たち
		//validate AOJ 2201
		C b(*this);
		if(a.r<b.r)swap(a,b);
		vector<L> res;
		if((a.p-b.p).n-(a.r-b.r)<0.0)return res;
		if((a.p-b.p).n-(a.r-b.r)<1e-6){
			if((b.p-a.p).n<1e-6)return res; //全く同じ円。
			P rv=(b.p-a.p).tolen(a.r);
			res.push_back(L(rv+a.p,rv+a.p+rv.turn(pi/2.0)));
			return res;
		}
		{
			P cv=b.p-a.p;
			D th=acos((a.r-b.r)/cv.n);
			P p1 = cv.turn(th);
			res.push_back(L(a.p+p1.tolen(a.r),b.p+p1.tolen(b.r)));
			P p2 = cv.turn(-th);
			res.push_back(L(a.p+p2.tolen(a.r),b.p+p2.tolen(b.r)));
		}
		if((a.p-b.p).n-(a.r+b.r)<0.0)return res;
		if((a.p-b.p).n-(a.r+b.r)<1e-6){
			P rv=(b.p-a.p).tolen(a.r);
			res.push_back(L(rv+a.p,rv+a.p+rv.turn(pi/2.0)));
			return res;
		}
		{
			P cv=b.p-a.p;
			D th=acos((a.r+b.r)/cv.n);
			P p1 = cv.turn(th);
			res.push_back(L(a.p+p1.tolen(a.r),b.p+p1.tolen(-b.r)));
			P p2 = cv.turn(-th);
			res.push_back(L(a.p+p2.tolen(a.r),b.p+p2.tolen(-b.r)));
		}
		return res;
	}
};


int main(){
	for(;;){
		int n;
		scanf("%d",&n);
		if(n==0)break;
		vector<C> cs;
		vector<double> ms;
		rep(i,n){
			double x,y,r,m;
			scanf("%lf%lf%lf%lf",&x,&y,&r,&m);
			cs.push_back(C(P(x,y),r));
			ms.push_back(m);
		}
		rep(i,n){
			C nc = cs[i];
			cs.push_back(C(nc.p,nc.r+ms[i]));
		}
		int ans = 1;
		rep(i,n*2){
			rep(j,i){
				vector<L> ts = cs[i].tangs(cs[j]);
				//printf("%d %d : %d\n",i,j,ts.size());
				rep(k,ts.size()){
					L nl = ts[k];
					nl = L(nl.p - nl.v.tolen(10000),nl.p + nl.v.tolen(10000));
					int ns=0;
					rep(a,n){
						double td = nl.dist(cs[a].p);
						double r = cs[a].r;
						//printf("%d %d %d : %lf %lf %lf\n",i,j,a,r,td,r+ms[a]);
						if(r<td+1e-6 && td<r+ms[a]+1e-6)ns++;
					}
					ans = max(ans,ns);
				}
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}


Measured memory_bytes: 2984