#include<iostream>
#include<cmath>
#include<complex>
#include<vector>
using namespace std;
#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()
#define mp         make_pair
#define pb         push_back

typedef complex<double> P;
typedef pair<P,P>       Line;
const double eps = 1e-10;

double distance_l_p(P a,P b,P c);
double cross(P a,P b);

typedef struct{P p;double r;}C;
//OÚü
//~ÌS_ðÔ_Æ,ÚüÉ½sÈüÅQÂÌ~ÌSðÊéü©çÈéOp`ðl¦éB
//2_ÔÌ£Æ~Ì¼aÌÖW©çcos(theta)=(r0-r1)/(2_ÔÌ£)ÉÈéB
// ÆÍ2_Ôðñ¾üªð±Ìthetaª¾¯ñ]³¹éB
pair<Line,Line> external_common_tangent(C a,C b){
  if (a.r < b.r)swap(a,b);
  double theta=acos((a.r-b.r)/abs(a.p-b.p));
  double costheta=cos(theta),sintheta=sin(theta);

  Line ret[2];
  rep(i,2){
    P v = b.p-a.p;
    P va,vb;//vector for circle a,b
    va.real()=v.real()*costheta-v.imag()*sintheta;
    va.imag()=v.real()*sintheta+v.imag()*costheta;
    va/=abs(va);
    vb=va;
    va*=a.r;
    vb*=b.r;

    va+=a.p;
    vb+=b.p;
    
 
    ret[i]=mp(va,vb);
    sintheta*=-1;
  }

  return mp(ret[0],ret[1]);
}


//¤ÊàÚü
//ñÂÌ~ªð··éÆ«Í¶ÝµÈ¢
pair<Line,Line> internal_common_tangent(C a,C b){
  double theta=acos((a.r+b.r)/abs(a.p-b.p));

  
  if (-eps<theta && theta<eps){
    P v=b.p-a.p;
    Line ret;

    swap(v.real(),v.imag());
    v.real()*=-1;
    ret.first=(a.p+b.p)/2.;
    ret.second=ret.first+v;

    
    return mp(ret,ret);
  }

  double costheta=cos(theta),sintheta=sin(theta);
  Line ret[2];
  rep(i,2){
    P v = b.p-a.p;
    P va,vb;//vector for circle a,b
    va.real()=v.real()*costheta-v.imag()*sintheta;
    va.imag()=v.real()*sintheta+v.imag()*costheta;
    va/=abs(va);
    vb=va;
    va*=a.r;
    vb*=-b.r;

    va+=a.p;
    vb+=b.p;
    

    ret[i]=mp(va,vb);
    sintheta*=-1;
  }
  return mp(ret[0],ret[1]);
}


double cross(P a,P b){
  return a.real()*b.imag()-a.imag()*b.real();
}

double distance_l_p(P a,P b,P c){
  return abs(cross(b-a,c-a))/abs(b-a);
}

bool checkdist(C a,Line b,double m){
  double dist =distance_l_p(b.first,b.second,a.p);
  //if (dist+eps < a.r || dist-eps > a.r+m)return false;
  //return true;
  if (a.r-eps<=dist && dist <= a.r+m+eps)return true;
  return false;
}

void output(P a,P b){
  printf("[[%lf,%lf],[%lf,%lf]],\n",a.real(),a.imag(),b.real(),b.imag());
}

vector<Line> find_all(vector<C> &in){
  vector<Line> ret;
  rep(i,in.size()){
    REP(j,i+1,in.size()){
      if (abs(in[i].p-in[j].p)<eps)continue;
      pair<Line,Line> tmp1=external_common_tangent(in[i],in[j]);
      
      ret.pb(tmp1.first);
      ret.pb(tmp1.second);
      if (abs(in[i].p-in[j].p)-in[i].r-in[j].r>-eps){
	tmp1=internal_common_tangent(in[i],in[j]);
      
	ret.pb(tmp1.first);
	ret.pb(tmp1.second);
      }
    }
  }
  return ret;
}

int solve(vector<C> a,vector<double> m){
  int ans = 1;
  vector<C> check;
  rep(i,a.size()){
    check.pb((C){a[i].p,a[i].r});
    check.pb((C){a[i].p,a[i].r+m[i]});
  }

  vector<Line> all=find_all(check);
  
  
  

  rep(i,all.size()){
    int tmp = 0;
    rep(j,a.size()){
      if (checkdist(a[j],all[i],m[j]))tmp++;
    }
    ans=max(tmp,ans);
  }
  return ans;
}


main(){
  int n;
  while(cin>>n && n){
    vector<C> in;
    vector<double> M;
    rep(i,n){
      double x,y,r,m;cin>>x>>y>>r>>m;
      in.pb((C){P(x,y),r});
      M.pb(m);
    }
    cout << solve(in,M) << endl;
  }
}

Measured memory_bytes: 1744