public void Seek(Slice target) {
			int left = 0;
			int right = num_restarts_ - 1;
			while (left < right) {
				int mid = (left + right + 1) / 2;
				int region_offset = GetRestartPoint(mid);
				int shared, non_shared;
				threeInt l3ints = new threeInt();
				ByteCollection lbcol = new ByteCollection(data_, 0);
				boolean OK = DecodeEntry(lbcol, region_offset, restarts_,
						l3ints);
				shared = l3ints.shared;
				non_shared = l3ints.non_shared;
				if (!OK || (shared != 0)) {
					CorruptionError();
					return;
				}
				// !!!#shared# is 0 when a new restart Block starts
				Slice mid_key = new Slice(data_, lbcol.curr_pos, non_shared);
				if (Compare(mid_key, target) < 0) {
					// Key at "mid" is smaller than "target". Therefore all
					// blocks before "mid" are uninteresting.
					left = mid;
				} else {
					// Key at "mid" is >= "target". Therefore all blocks at or
					// after "mid" are uninteresting.
					right = mid - 1;
				}
			}

			// Linear search (within restart block) for first key >= target
			SeekToRestartPoint(left);
			while (true) {
				if (!ParseNextKey()) {
					return;
				}
				if (Compare(key_, target) >= 0) {
					return;
				}
			}
		}