class Builder {

        /**
         * Utility constructor.
         */
        private Builder() {
        }

        /**
         * Creates new {@link TrackingArgs} with {@literal CLIENT TRACKING ON}.
         *
         * @return new {@link TrackingArgs}.
         * @see TrackingArgs#enabled(boolean)
         */
        public static TrackingArgs enabled() {
            return enabled(true);
        }

        /**
         * Creates new {@link TrackingArgs} with {@literal CLIENT TRACKING ON} if {@code enabled} is {@code true}.
         *
         * @param enabled whether to enable key tracking for the currently connected client.
         * @return new {@link TrackingArgs}.
         * @see TrackingArgs#enabled(boolean)
         */
        public static TrackingArgs enabled(boolean enabled) {
            return new TrackingArgs().enabled(enabled);
        }

    }

    /**
     * Controls whether to enable key tracking for the currently connected client.
     *
     * @param enabled whether to enable key tracking for the currently connected client.
     * @return {@code this} {@link TrackingArgs}.
     */
    public TrackingArgs enabled(boolean enabled) {
        this.enabled = enabled;
        return this;
    }

    /**
     * Send redirection messages to the connection with the specified ID. The connection must exist, you can get the ID of such
     * connection using {@code CLIENT ID}. If the connection we are redirecting to is terminated, when in RESP3 mode the
     * connection with tracking enabled will receive tracking-redir-broken push messages in order to signal the condition.
     *
     * @param clientId process Id of the client for notification redirection.
     * @return {@code this} {@link TrackingArgs}.
     */
    public TrackingArgs redirect(long clientId) {
        this.redirect = clientId;
        return this;
    }

    /**
     * Enable tracking in broadcasting mode. In this mode invalidation messages are reported for all the prefixes specified,
     * regardless of the keys requested by the connection. Instead when the broadcasting mode is not enabled, Redis will track
     * which keys are fetched using read-only commands, and will report invalidation messages only for such keys.
     *
     * @return {@code this} {@link TrackingArgs}.
     */
    public TrackingArgs bcast() {
        this.bcast = true;
        return this;
    }

    /**
     * For broadcasting, register a given key prefix, so that notifications will be provided only for keys starting with this
     * string. This option can be given multiple times to register multiple prefixes. If broadcasting is enabled without this
     * option, Redis will send notifications for every key.
     *
     * @param prefixes the key prefixes for broadcasting of change notifications. Encoded using
     *        {@link java.nio.charset.StandardCharsets#UTF_8}.
     * @return {@code this} {@link TrackingArgs}.
     */
    public TrackingArgs prefixes(String... prefixes) {
        return prefixes(StandardCharsets.UTF_8, prefixes);
    }

    /**
     * For broadcasting, register a given key prefix, so that notifications will be provided only for keys starting with this
     * string. This option can be given multiple times to register multiple prefixes. If broadcasting is enabled without this
     * option, Redis will send notifications for every key.
     *
     * @param charset the charset to use for {@code prefixes} encoding.
     * @param prefixes the key prefixes for broadcasting of change notifications.
     * @return {@code this} {@link TrackingArgs}.
     */
    public TrackingArgs prefixes(Charset charset, String... prefixes) {<FILL_FUNCTION_BODY>

        LettuceAssert.notNull(charset, "Charset must not be null");
        this.prefixCharset = charset;
        this.prefixes = prefixes;
        return this;
    
<no_super_class>