#include <bits/stdc++.h>

#define _overload(_1,_2,_3,name,...) name
#define _rep(i,n) _range(i,0,n)
#define _range(i,a,b) for(int i=int(a);i<int(b);++i)
#define rep(...) _overload(__VA_ARGS__,_range,_rep,)(__VA_ARGS__)

#define _rrep(i,n) _rrange(i,n,0)
#define _rrange(i,a,b) for(int i=int(a)-1;i>=int(b);--i)
#define rrep(...) _overload(__VA_ARGS__,_rrange,_rrep,)(__VA_ARGS__)

#define _all(arg) begin(arg),end(arg)
#define uniq(arg) sort(_all(arg)),(arg).erase(unique(_all(arg)),end(arg))
#define getidx(ary,key) lower_bound(_all(ary),key)-begin(ary)
#define clr(a,b) memset((a),(b),sizeof(a))
#define bit(n) (1LL<<(n))
#define popcount(n) (__builtin_popcountll(n))

template<class T>bool chmax(T &a, const T &b) { return (a<b)?(a=b,1):0;}
template<class T>bool chmin(T &a, const T &b) { return (b<a)?(a=b,1):0;}

using namespace std;

const int dx[8]={1,0,-1,0,1,-1,-1,1};
const int dy[8]={0,1,0,-1,1,1,-1,-1};

int main(void){
	int n;
	while(cin >> n,n){
		int t[55],c[55];
		rep(i,n) cin >> t[i] >> c[i];

		int ans=0;
		struct state{
			int t,res,v;
			bool operator < (const state &arg) const {return v < arg.v;}
		};

		queue<state> que[2];
		rep(i,n) que[0].push({0,c[i],t[i]});

		while(!que[0].empty()||!que[1].empty()){
			int f= que[0].empty() || (!que[1].empty() && que[1].front().t < que[0].front().t);
			ans=que[f].front().t;
			vector<state> ary;
			while(!que[f].empty() && que[f].front().t<=ans){
				ary.push_back(que[f].front());
				que[f].pop();
			}
			sort(_all(ary));
			for(auto &it:ary) if(it.res){
				it.t=ans+it.v;
				it.res-=f;
				que[f^1].push(it);
			}
		}

		cout << ans << endl;
	}	
	return 0;
}