Design and implement a per-client rate limiter using the token-bucket algorithm. Each client is identified by a unique string key. The limiter has two configurable parameters: capacity (the maximum number of tokens the bucket can hold) and refill_rate (the number of tokens added to the bucket every second). When a request arrives, the limiter must atomically (1) add tokens equal to (elapsed_seconds * refill_rate) to the client’s bucket, capped at capacity, (2) if at least one token is present, consume one token and allow the request, otherwise deny it. The implementation must be thread-safe and support high-concurrency (many threads calling for many keys simultaneously). You must expose a single public method: boolean allowRequest(String clientId). No I/O or network calls are required; keep all state in memory.