package redis

import (
	
	
	
	
	

	
	
	
	
)

type Cmder interface {
	Name() string
	FullName() string
	Args() []interface{}
	String() string
	stringArg(int) string
	firstKeyPos() int8
	SetFirstKeyPos(int8)

	readTimeout() *time.Duration
	readReply(rd *proto.Reader) error

	SetErr(error)
	Err() error
}

func setCmdsErr( []Cmder,  error) {
	for ,  := range  {
		if .Err() == nil {
			.SetErr()
		}
	}
}

func cmdsFirstErr( []Cmder) error {
	for ,  := range  {
		if  := .Err();  != nil {
			return 
		}
	}
	return nil
}

func writeCmds( *proto.Writer,  []Cmder) error {
	for ,  := range  {
		if  := writeCmd(, );  != nil {
			return 
		}
	}
	return nil
}

func writeCmd( *proto.Writer,  Cmder) error {
	return .WriteArgs(.Args())
}

func cmdFirstKeyPos( Cmder,  *CommandInfo) int {
	if  := .firstKeyPos();  != 0 {
		return int()
	}

	switch .Name() {
	case "eval", "evalsha", "eval_ro", "evalsha_ro":
		if .stringArg(2) != "0" {
			return 3
		}

		return 0
	case "publish":
		return 1
	case "memory":
		// https://github.com/redis/redis/issues/7493
		if .stringArg(1) == "usage" {
			return 2
		}
	}

	if  != nil {
		return int(.FirstKeyPos)
	}
	return 1
}

func cmdString( Cmder,  interface{}) string {
	 := make([]byte, 0, 64)

	for ,  := range .Args() {
		if  > 0 {
			 = append(, ' ')
		}
		 = internal.AppendArg(, )
	}

	if  := .Err();  != nil {
		 = append(, ": "...)
		 = append(, .Error()...)
	} else if  != nil {
		 = append(, ": "...)
		 = internal.AppendArg(, )
	}

	return util.BytesToString()
}

//------------------------------------------------------------------------------

type baseCmd struct {
	ctx    context.Context
	args   []interface{}
	err    error
	keyPos int8

	_readTimeout *time.Duration
}

var _ Cmder = (*Cmd)(nil)

func ( *baseCmd) () string {
	if len(.args) == 0 {
		return ""
	}
	// Cmd name must be lower cased.
	return internal.ToLower(.stringArg(0))
}

func ( *baseCmd) () string {
	switch  := .Name();  {
	case "cluster", "command":
		if len(.args) == 1 {
			return 
		}
		if ,  := .args[1].(string);  {
			return  + " " + 
		}
		return 
	default:
		return 
	}
}

func ( *baseCmd) () []interface{} {
	return .args
}

func ( *baseCmd) ( int) string {
	if  < 0 ||  >= len(.args) {
		return ""
	}
	 := .args[]
	switch v := .(type) {
	case string:
		return 
	default:
		// TODO: consider using appendArg
		return fmt.Sprint()
	}
}

func ( *baseCmd) () int8 {
	return .keyPos
}

func ( *baseCmd) ( int8) {
	.keyPos = 
}

func ( *baseCmd) ( error) {
	.err = 
}

func ( *baseCmd) () error {
	return .err
}

func ( *baseCmd) () *time.Duration {
	return ._readTimeout
}

func ( *baseCmd) ( time.Duration) {
	._readTimeout = &
}

//------------------------------------------------------------------------------

type Cmd struct {
	baseCmd

	val interface{}
}

func ( context.Context,  ...interface{}) *Cmd {
	return &Cmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *Cmd) () string {
	return cmdString(, .val)
}

func ( *Cmd) ( interface{}) {
	.val = 
}

func ( *Cmd) () interface{} {
	return .val
}

func ( *Cmd) () (interface{}, error) {
	return .val, .err
}

func ( *Cmd) () (string, error) {
	if .err != nil {
		return "", .err
	}
	return toString(.val)
}

func toString( interface{}) (string, error) {
	switch val := .(type) {
	case string:
		return , nil
	default:
		 := fmt.Errorf("redis: unexpected type=%T for String", )
		return "", 
	}
}

func ( *Cmd) () (int, error) {
	if .err != nil {
		return 0, .err
	}
	switch val := .val.(type) {
	case int64:
		return int(), nil
	case string:
		return strconv.Atoi()
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Int", )
		return 0, 
	}
}

func ( *Cmd) () (int64, error) {
	if .err != nil {
		return 0, .err
	}
	return toInt64(.val)
}

func toInt64( interface{}) (int64, error) {
	switch val := .(type) {
	case int64:
		return , nil
	case string:
		return strconv.ParseInt(, 10, 64)
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Int64", )
		return 0, 
	}
}

func ( *Cmd) () (uint64, error) {
	if .err != nil {
		return 0, .err
	}
	return toUint64(.val)
}

func toUint64( interface{}) (uint64, error) {
	switch val := .(type) {
	case int64:
		return uint64(), nil
	case string:
		return strconv.ParseUint(, 10, 64)
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Uint64", )
		return 0, 
	}
}

func ( *Cmd) () (float32, error) {
	if .err != nil {
		return 0, .err
	}
	return toFloat32(.val)
}

func toFloat32( interface{}) (float32, error) {
	switch val := .(type) {
	case int64:
		return float32(), nil
	case string:
		,  := strconv.ParseFloat(, 32)
		if  != nil {
			return 0, 
		}
		return float32(), nil
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Float32", )
		return 0, 
	}
}

func ( *Cmd) () (float64, error) {
	if .err != nil {
		return 0, .err
	}
	return toFloat64(.val)
}

func toFloat64( interface{}) (float64, error) {
	switch val := .(type) {
	case int64:
		return float64(), nil
	case string:
		return strconv.ParseFloat(, 64)
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Float64", )
		return 0, 
	}
}

func ( *Cmd) () (bool, error) {
	if .err != nil {
		return false, .err
	}
	return toBool(.val)
}

func toBool( interface{}) (bool, error) {
	switch val := .(type) {
	case int64:
		return  != 0, nil
	case string:
		return strconv.ParseBool()
	default:
		 := fmt.Errorf("redis: unexpected type=%T for Bool", )
		return false, 
	}
}

func ( *Cmd) () ([]interface{}, error) {
	if .err != nil {
		return nil, .err
	}
	switch val := .val.(type) {
	case []interface{}:
		return , nil
	default:
		return nil, fmt.Errorf("redis: unexpected type=%T for Slice", )
	}
}

func ( *Cmd) () ([]string, error) {
	,  := .Slice()
	if  != nil {
		return nil, 
	}

	 := make([]string, len())
	for ,  := range  {
		,  := toString()
		if  != nil {
			return nil, 
		}
		[] = 
	}
	return , nil
}

func ( *Cmd) () ([]int64, error) {
	,  := .Slice()
	if  != nil {
		return nil, 
	}

	 := make([]int64, len())
	for ,  := range  {
		,  := toInt64()
		if  != nil {
			return nil, 
		}
		[] = 
	}
	return , nil
}

func ( *Cmd) () ([]uint64, error) {
	,  := .Slice()
	if  != nil {
		return nil, 
	}

	 := make([]uint64, len())
	for ,  := range  {
		,  := toUint64()
		if  != nil {
			return nil, 
		}
		[] = 
	}
	return , nil
}

func ( *Cmd) () ([]float32, error) {
	,  := .Slice()
	if  != nil {
		return nil, 
	}

	 := make([]float32, len())
	for ,  := range  {
		,  := toFloat32()
		if  != nil {
			return nil, 
		}
		[] = 
	}
	return , nil
}

func ( *Cmd) () ([]float64, error) {
	,  := .Slice()
	if  != nil {
		return nil, 
	}

	 := make([]float64, len())
	for ,  := range  {
		,  := toFloat64()
		if  != nil {
			return nil, 
		}
		[] = 
	}
	return , nil
}

func ( *Cmd) () ([]bool, error) {
	,  := .Slice()
	if  != nil {
		return nil, 
	}

	 := make([]bool, len())
	for ,  := range  {
		,  := toBool()
		if  != nil {
			return nil, 
		}
		[] = 
	}
	return , nil
}

func ( *Cmd) ( *proto.Reader) ( error) {
	.val,  = .ReadReply()
	return 
}

//------------------------------------------------------------------------------

type SliceCmd struct {
	baseCmd

	val []interface{}
}

var _ Cmder = (*SliceCmd)(nil)

func ( context.Context,  ...interface{}) *SliceCmd {
	return &SliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *SliceCmd) ( []interface{}) {
	.val = 
}

func ( *SliceCmd) () []interface{} {
	return .val
}

func ( *SliceCmd) () ([]interface{}, error) {
	return .val, .err
}

func ( *SliceCmd) () string {
	return cmdString(, .val)
}

// Scan scans the results from the map into a destination struct. The map keys
// are matched in the Redis struct fields by the `redis:"field"` tag.
func ( *SliceCmd) ( interface{}) error {
	if .err != nil {
		return .err
	}

	// Pass the list of keys and values.
	// Skip the first two args for: HMGET key
	var  []interface{}
	if .args[0] == "hmget" {
		 = .args[2:]
	} else {
		// Otherwise, it's: MGET field field ...
		 = .args[1:]
	}

	return hscan.Scan(, , .val)
}

func ( *SliceCmd) ( *proto.Reader) ( error) {
	.val,  = .ReadSlice()
	return 
}

//------------------------------------------------------------------------------

type StatusCmd struct {
	baseCmd

	val string
}

var _ Cmder = (*StatusCmd)(nil)

func ( context.Context,  ...interface{}) *StatusCmd {
	return &StatusCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *StatusCmd) ( string) {
	.val = 
}

func ( *StatusCmd) () string {
	return .val
}

func ( *StatusCmd) () (string, error) {
	return .val, .err
}

func ( *StatusCmd) () string {
	return cmdString(, .val)
}

func ( *StatusCmd) ( *proto.Reader) ( error) {
	.val,  = .ReadString()
	return 
}

//------------------------------------------------------------------------------

type IntCmd struct {
	baseCmd

	val int64
}

var _ Cmder = (*IntCmd)(nil)

func ( context.Context,  ...interface{}) *IntCmd {
	return &IntCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *IntCmd) ( int64) {
	.val = 
}

func ( *IntCmd) () int64 {
	return .val
}

func ( *IntCmd) () (int64, error) {
	return .val, .err
}

func ( *IntCmd) () (uint64, error) {
	return uint64(.val), .err
}

func ( *IntCmd) () string {
	return cmdString(, .val)
}

func ( *IntCmd) ( *proto.Reader) ( error) {
	.val,  = .ReadInt()
	return 
}

//------------------------------------------------------------------------------

type IntSliceCmd struct {
	baseCmd

	val []int64
}

var _ Cmder = (*IntSliceCmd)(nil)

func ( context.Context,  ...interface{}) *IntSliceCmd {
	return &IntSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *IntSliceCmd) ( []int64) {
	.val = 
}

func ( *IntSliceCmd) () []int64 {
	return .val
}

func ( *IntSliceCmd) () ([]int64, error) {
	return .val, .err
}

func ( *IntSliceCmd) () string {
	return cmdString(, .val)
}

func ( *IntSliceCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]int64, )
	for  := 0;  < len(.val); ++ {
		if .val[],  = .ReadInt();  != nil {
			return 
		}
	}
	return nil
}

//------------------------------------------------------------------------------

type DurationCmd struct {
	baseCmd

	val       time.Duration
	precision time.Duration
}

var _ Cmder = (*DurationCmd)(nil)

func ( context.Context,  time.Duration,  ...interface{}) *DurationCmd {
	return &DurationCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
		precision: ,
	}
}

func ( *DurationCmd) ( time.Duration) {
	.val = 
}

func ( *DurationCmd) () time.Duration {
	return .val
}

func ( *DurationCmd) () (time.Duration, error) {
	return .val, .err
}

func ( *DurationCmd) () string {
	return cmdString(, .val)
}

func ( *DurationCmd) ( *proto.Reader) error {
	,  := .ReadInt()
	if  != nil {
		return 
	}
	switch  {
	// -2 if the key does not exist
	// -1 if the key exists but has no associated expire
	case -2, -1:
		.val = time.Duration()
	default:
		.val = time.Duration() * .precision
	}
	return nil
}

//------------------------------------------------------------------------------

type TimeCmd struct {
	baseCmd

	val time.Time
}

var _ Cmder = (*TimeCmd)(nil)

func ( context.Context,  ...interface{}) *TimeCmd {
	return &TimeCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *TimeCmd) ( time.Time) {
	.val = 
}

func ( *TimeCmd) () time.Time {
	return .val
}

func ( *TimeCmd) () (time.Time, error) {
	return .val, .err
}

func ( *TimeCmd) () string {
	return cmdString(, .val)
}

func ( *TimeCmd) ( *proto.Reader) error {
	if  := .ReadFixedArrayLen(2);  != nil {
		return 
	}
	,  := .ReadInt()
	if  != nil {
		return 
	}
	,  := .ReadInt()
	if  != nil {
		return 
	}
	.val = time.Unix(, *1000)
	return nil
}

//------------------------------------------------------------------------------

type BoolCmd struct {
	baseCmd

	val bool
}

var _ Cmder = (*BoolCmd)(nil)

func ( context.Context,  ...interface{}) *BoolCmd {
	return &BoolCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *BoolCmd) ( bool) {
	.val = 
}

func ( *BoolCmd) () bool {
	return .val
}

func ( *BoolCmd) () (bool, error) {
	return .val, .err
}

func ( *BoolCmd) () string {
	return cmdString(, .val)
}

func ( *BoolCmd) ( *proto.Reader) ( error) {
	.val,  = .ReadBool()

	// `SET key value NX` returns nil when key already exists. But
	// `SETNX key value` returns bool (0/1). So convert nil to bool.
	if  == Nil {
		.val = false
		 = nil
	}
	return 
}

//------------------------------------------------------------------------------

type StringCmd struct {
	baseCmd

	val string
}

var _ Cmder = (*StringCmd)(nil)

func ( context.Context,  ...interface{}) *StringCmd {
	return &StringCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *StringCmd) ( string) {
	.val = 
}

func ( *StringCmd) () string {
	return .val
}

func ( *StringCmd) () (string, error) {
	return .Val(), .err
}

func ( *StringCmd) () ([]byte, error) {
	return util.StringToBytes(.val), .err
}

func ( *StringCmd) () (bool, error) {
	if .err != nil {
		return false, .err
	}
	return strconv.ParseBool(.val)
}

func ( *StringCmd) () (int, error) {
	if .err != nil {
		return 0, .err
	}
	return strconv.Atoi(.Val())
}

func ( *StringCmd) () (int64, error) {
	if .err != nil {
		return 0, .err
	}
	return strconv.ParseInt(.Val(), 10, 64)
}

func ( *StringCmd) () (uint64, error) {
	if .err != nil {
		return 0, .err
	}
	return strconv.ParseUint(.Val(), 10, 64)
}

func ( *StringCmd) () (float32, error) {
	if .err != nil {
		return 0, .err
	}
	,  := strconv.ParseFloat(.Val(), 32)
	if  != nil {
		return 0, 
	}
	return float32(), nil
}

func ( *StringCmd) () (float64, error) {
	if .err != nil {
		return 0, .err
	}
	return strconv.ParseFloat(.Val(), 64)
}

func ( *StringCmd) () (time.Time, error) {
	if .err != nil {
		return time.Time{}, .err
	}
	return time.Parse(time.RFC3339Nano, .Val())
}

func ( *StringCmd) ( interface{}) error {
	if .err != nil {
		return .err
	}
	return proto.Scan([]byte(.val), )
}

func ( *StringCmd) () string {
	return cmdString(, .val)
}

func ( *StringCmd) ( *proto.Reader) ( error) {
	.val,  = .ReadString()
	return 
}

//------------------------------------------------------------------------------

type FloatCmd struct {
	baseCmd

	val float64
}

var _ Cmder = (*FloatCmd)(nil)

func ( context.Context,  ...interface{}) *FloatCmd {
	return &FloatCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *FloatCmd) ( float64) {
	.val = 
}

func ( *FloatCmd) () float64 {
	return .val
}

func ( *FloatCmd) () (float64, error) {
	return .Val(), .Err()
}

func ( *FloatCmd) () string {
	return cmdString(, .val)
}

func ( *FloatCmd) ( *proto.Reader) ( error) {
	.val,  = .ReadFloat()
	return 
}

//------------------------------------------------------------------------------

type FloatSliceCmd struct {
	baseCmd

	val []float64
}

var _ Cmder = (*FloatSliceCmd)(nil)

func ( context.Context,  ...interface{}) *FloatSliceCmd {
	return &FloatSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *FloatSliceCmd) ( []float64) {
	.val = 
}

func ( *FloatSliceCmd) () []float64 {
	return .val
}

func ( *FloatSliceCmd) () ([]float64, error) {
	return .val, .err
}

func ( *FloatSliceCmd) () string {
	return cmdString(, .val)
}

func ( *FloatSliceCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	.val = make([]float64, )
	for  := 0;  < len(.val); ++ {
		switch ,  := .ReadFloat(); {
		case  == Nil:
			.val[] = 0
		case  != nil:
			return 
		default:
			.val[] = 
		}
	}
	return nil
}

//------------------------------------------------------------------------------

type StringSliceCmd struct {
	baseCmd

	val []string
}

var _ Cmder = (*StringSliceCmd)(nil)

func ( context.Context,  ...interface{}) *StringSliceCmd {
	return &StringSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *StringSliceCmd) ( []string) {
	.val = 
}

func ( *StringSliceCmd) () []string {
	return .val
}

func ( *StringSliceCmd) () ([]string, error) {
	return .Val(), .Err()
}

func ( *StringSliceCmd) () string {
	return cmdString(, .val)
}

func ( *StringSliceCmd) ( interface{}) error {
	return proto.ScanSlice(.Val(), )
}

func ( *StringSliceCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]string, )
	for  := 0;  < len(.val); ++ {
		switch ,  := .ReadString(); {
		case  == Nil:
			.val[] = ""
		case  != nil:
			return 
		default:
			.val[] = 
		}
	}
	return nil
}

//------------------------------------------------------------------------------

type KeyValue struct {
	Key   string
	Value string
}

type KeyValueSliceCmd struct {
	baseCmd

	val []KeyValue
}

var _ Cmder = (*KeyValueSliceCmd)(nil)

func ( context.Context,  ...interface{}) *KeyValueSliceCmd {
	return &KeyValueSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *KeyValueSliceCmd) ( []KeyValue) {
	.val = 
}

func ( *KeyValueSliceCmd) () []KeyValue {
	return .val
}

func ( *KeyValueSliceCmd) () ([]KeyValue, error) {
	return .val, .err
}

func ( *KeyValueSliceCmd) () string {
	return cmdString(, .val)
}

// Many commands will respond to two formats:
//  1. 1) "one"
//  2. (double) 1
//  2. 1) "two"
//  2. (double) 2
//
// OR:
//  1. "two"
//  2. (double) 2
//  3. "one"
//  4. (double) 1
func ( *KeyValueSliceCmd) ( *proto.Reader) error { // nolint:dupl
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	// If the n is 0, can't continue reading.
	if  == 0 {
		.val = make([]KeyValue, 0)
		return nil
	}

	,  := .PeekReplyType()
	if  != nil {
		return 
	}
	 :=  == proto.RespArray

	if  {
		.val = make([]KeyValue, )
	} else {
		.val = make([]KeyValue, /2)
	}

	for  := 0;  < len(.val); ++ {
		if  {
			if  = .ReadFixedArrayLen(2);  != nil {
				return 
			}
		}

		if .val[].Key,  = .ReadString();  != nil {
			return 
		}

		if .val[].Value,  = .ReadString();  != nil {
			return 
		}
	}

	return nil
}

//------------------------------------------------------------------------------

type BoolSliceCmd struct {
	baseCmd

	val []bool
}

var _ Cmder = (*BoolSliceCmd)(nil)

func ( context.Context,  ...interface{}) *BoolSliceCmd {
	return &BoolSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *BoolSliceCmd) ( []bool) {
	.val = 
}

func ( *BoolSliceCmd) () []bool {
	return .val
}

func ( *BoolSliceCmd) () ([]bool, error) {
	return .val, .err
}

func ( *BoolSliceCmd) () string {
	return cmdString(, .val)
}

func ( *BoolSliceCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]bool, )
	for  := 0;  < len(.val); ++ {
		if .val[],  = .ReadBool();  != nil {
			return 
		}
	}
	return nil
}

//------------------------------------------------------------------------------

type MapStringStringCmd struct {
	baseCmd

	val map[string]string
}

var _ Cmder = (*MapStringStringCmd)(nil)

func ( context.Context,  ...interface{}) *MapStringStringCmd {
	return &MapStringStringCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *MapStringStringCmd) () map[string]string {
	return .val
}

func ( *MapStringStringCmd) ( map[string]string) {
	.val = 
}

func ( *MapStringStringCmd) () (map[string]string, error) {
	return .val, .err
}

func ( *MapStringStringCmd) () string {
	return cmdString(, .val)
}

// Scan scans the results from the map into a destination struct. The map keys
// are matched in the Redis struct fields by the `redis:"field"` tag.
func ( *MapStringStringCmd) ( interface{}) error {
	if .err != nil {
		return .err
	}

	,  := hscan.Struct()
	if  != nil {
		return 
	}

	for ,  := range .val {
		if  := .Scan(, );  != nil {
			return 
		}
	}

	return nil
}

func ( *MapStringStringCmd) ( *proto.Reader) error {
	,  := .ReadMapLen()
	if  != nil {
		return 
	}

	.val = make(map[string]string, )
	for  := 0;  < ; ++ {
		,  := .ReadString()
		if  != nil {
			return 
		}

		,  := .ReadString()
		if  != nil {
			return 
		}

		.val[] = 
	}
	return nil
}

//------------------------------------------------------------------------------

type MapStringIntCmd struct {
	baseCmd

	val map[string]int64
}

var _ Cmder = (*MapStringIntCmd)(nil)

func ( context.Context,  ...interface{}) *MapStringIntCmd {
	return &MapStringIntCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *MapStringIntCmd) ( map[string]int64) {
	.val = 
}

func ( *MapStringIntCmd) () map[string]int64 {
	return .val
}

func ( *MapStringIntCmd) () (map[string]int64, error) {
	return .val, .err
}

func ( *MapStringIntCmd) () string {
	return cmdString(, .val)
}

func ( *MapStringIntCmd) ( *proto.Reader) error {
	,  := .ReadMapLen()
	if  != nil {
		return 
	}

	.val = make(map[string]int64, )
	for  := 0;  < ; ++ {
		,  := .ReadString()
		if  != nil {
			return 
		}

		,  := .ReadInt()
		if  != nil {
			return 
		}
		.val[] = 
	}
	return nil
}

//------------------------------------------------------------------------------

type StringStructMapCmd struct {
	baseCmd

	val map[string]struct{}
}

var _ Cmder = (*StringStructMapCmd)(nil)

func ( context.Context,  ...interface{}) *StringStructMapCmd {
	return &StringStructMapCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *StringStructMapCmd) ( map[string]struct{}) {
	.val = 
}

func ( *StringStructMapCmd) () map[string]struct{} {
	return .val
}

func ( *StringStructMapCmd) () (map[string]struct{}, error) {
	return .val, .err
}

func ( *StringStructMapCmd) () string {
	return cmdString(, .val)
}

func ( *StringStructMapCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	.val = make(map[string]struct{}, )
	for  := 0;  < ; ++ {
		,  := .ReadString()
		if  != nil {
			return 
		}
		.val[] = struct{}{}
	}
	return nil
}

//------------------------------------------------------------------------------

type XMessage struct {
	ID     string
	Values map[string]interface{}
}

type XMessageSliceCmd struct {
	baseCmd

	val []XMessage
}

var _ Cmder = (*XMessageSliceCmd)(nil)

func ( context.Context,  ...interface{}) *XMessageSliceCmd {
	return &XMessageSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *XMessageSliceCmd) ( []XMessage) {
	.val = 
}

func ( *XMessageSliceCmd) () []XMessage {
	return .val
}

func ( *XMessageSliceCmd) () ([]XMessage, error) {
	return .val, .err
}

func ( *XMessageSliceCmd) () string {
	return cmdString(, .val)
}

func ( *XMessageSliceCmd) ( *proto.Reader) ( error) {
	.val,  = readXMessageSlice()
	return 
}

func readXMessageSlice( *proto.Reader) ([]XMessage, error) {
	,  := .ReadArrayLen()
	if  != nil {
		return nil, 
	}

	 := make([]XMessage, )
	for  := 0;  < len(); ++ {
		if [],  = readXMessage();  != nil {
			return nil, 
		}
	}
	return , nil
}

func readXMessage( *proto.Reader) (XMessage, error) {
	if  := .ReadFixedArrayLen(2);  != nil {
		return XMessage{}, 
	}

	,  := .ReadString()
	if  != nil {
		return XMessage{}, 
	}

	,  := stringInterfaceMapParser()
	if  != nil {
		if  != proto.Nil {
			return XMessage{}, 
		}
	}

	return XMessage{
		ID:     ,
		Values: ,
	}, nil
}

func stringInterfaceMapParser( *proto.Reader) (map[string]interface{}, error) {
	,  := .ReadMapLen()
	if  != nil {
		return nil, 
	}

	 := make(map[string]interface{}, )
	for  := 0;  < ; ++ {
		,  := .ReadString()
		if  != nil {
			return nil, 
		}

		,  := .ReadString()
		if  != nil {
			return nil, 
		}

		[] = 
	}
	return , nil
}

//------------------------------------------------------------------------------

type XStream struct {
	Stream   string
	Messages []XMessage
}

type XStreamSliceCmd struct {
	baseCmd

	val []XStream
}

var _ Cmder = (*XStreamSliceCmd)(nil)

func ( context.Context,  ...interface{}) *XStreamSliceCmd {
	return &XStreamSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *XStreamSliceCmd) ( []XStream) {
	.val = 
}

func ( *XStreamSliceCmd) () []XStream {
	return .val
}

func ( *XStreamSliceCmd) () ([]XStream, error) {
	return .val, .err
}

func ( *XStreamSliceCmd) () string {
	return cmdString(, .val)
}

func ( *XStreamSliceCmd) ( *proto.Reader) error {
	,  := .PeekReplyType()
	if  != nil {
		return 
	}

	var  int
	if  == proto.RespMap {
		,  = .ReadMapLen()
	} else {
		,  = .ReadArrayLen()
	}
	if  != nil {
		return 
	}
	.val = make([]XStream, )
	for  := 0;  < len(.val); ++ {
		if  != proto.RespMap {
			if  = .ReadFixedArrayLen(2);  != nil {
				return 
			}
		}
		if .val[].Stream,  = .ReadString();  != nil {
			return 
		}
		if .val[].Messages,  = readXMessageSlice();  != nil {
			return 
		}
	}
	return nil
}

//------------------------------------------------------------------------------

type XPending struct {
	Count     int64
	Lower     string
	Higher    string
	Consumers map[string]int64
}

type XPendingCmd struct {
	baseCmd
	val *XPending
}

var _ Cmder = (*XPendingCmd)(nil)

func ( context.Context,  ...interface{}) *XPendingCmd {
	return &XPendingCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *XPendingCmd) ( *XPending) {
	.val = 
}

func ( *XPendingCmd) () *XPending {
	return .val
}

func ( *XPendingCmd) () (*XPending, error) {
	return .val, .err
}

func ( *XPendingCmd) () string {
	return cmdString(, .val)
}

func ( *XPendingCmd) ( *proto.Reader) error {
	var  error
	if  = .ReadFixedArrayLen(4);  != nil {
		return 
	}
	.val = &XPending{}

	if .val.Count,  = .ReadInt();  != nil {
		return 
	}

	if .val.Lower,  = .ReadString();  != nil &&  != Nil {
		return 
	}

	if .val.Higher,  = .ReadString();  != nil &&  != Nil {
		return 
	}

	,  := .ReadArrayLen()
	if  != nil &&  != Nil {
		return 
	}
	.val.Consumers = make(map[string]int64, )
	for  := 0;  < ; ++ {
		if  = .ReadFixedArrayLen(2);  != nil {
			return 
		}

		,  := .ReadString()
		if  != nil {
			return 
		}
		,  := .ReadInt()
		if  != nil {
			return 
		}
		.val.Consumers[] = 
	}
	return nil
}

//------------------------------------------------------------------------------

type XPendingExt struct {
	ID         string
	Consumer   string
	Idle       time.Duration
	RetryCount int64
}

type XPendingExtCmd struct {
	baseCmd
	val []XPendingExt
}

var _ Cmder = (*XPendingExtCmd)(nil)

func ( context.Context,  ...interface{}) *XPendingExtCmd {
	return &XPendingExtCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *XPendingExtCmd) ( []XPendingExt) {
	.val = 
}

func ( *XPendingExtCmd) () []XPendingExt {
	return .val
}

func ( *XPendingExtCmd) () ([]XPendingExt, error) {
	return .val, .err
}

func ( *XPendingExtCmd) () string {
	return cmdString(, .val)
}

func ( *XPendingExtCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]XPendingExt, )

	for  := 0;  < len(.val); ++ {
		if  = .ReadFixedArrayLen(4);  != nil {
			return 
		}

		if .val[].ID,  = .ReadString();  != nil {
			return 
		}

		if .val[].Consumer,  = .ReadString();  != nil &&  != Nil {
			return 
		}

		,  := .ReadInt()
		if  != nil &&  != Nil {
			return 
		}
		.val[].Idle = time.Duration() * time.Millisecond

		if .val[].RetryCount,  = .ReadInt();  != nil &&  != Nil {
			return 
		}
	}

	return nil
}

//------------------------------------------------------------------------------

type XAutoClaimCmd struct {
	baseCmd

	start string
	val   []XMessage
}

var _ Cmder = (*XAutoClaimCmd)(nil)

func ( context.Context,  ...interface{}) *XAutoClaimCmd {
	return &XAutoClaimCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *XAutoClaimCmd) ( []XMessage,  string) {
	.val = 
	.start = 
}

func ( *XAutoClaimCmd) () ( []XMessage,  string) {
	return .val, .start
}

func ( *XAutoClaimCmd) () ( []XMessage,  string,  error) {
	return .val, .start, .err
}

func ( *XAutoClaimCmd) () string {
	return cmdString(, .val)
}

func ( *XAutoClaimCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	switch  {
	case 2, // Redis 6
		3: // Redis 7:
		// ok
	default:
		return fmt.Errorf("redis: got %d elements in XAutoClaim reply, wanted 2/3", )
	}

	.start,  = .ReadString()
	if  != nil {
		return 
	}

	.val,  = readXMessageSlice()
	if  != nil {
		return 
	}

	if  >= 3 {
		if  := .DiscardNext();  != nil {
			return 
		}
	}

	return nil
}

//------------------------------------------------------------------------------

type XAutoClaimJustIDCmd struct {
	baseCmd

	start string
	val   []string
}

var _ Cmder = (*XAutoClaimJustIDCmd)(nil)

func ( context.Context,  ...interface{}) *XAutoClaimJustIDCmd {
	return &XAutoClaimJustIDCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *XAutoClaimJustIDCmd) ( []string,  string) {
	.val = 
	.start = 
}

func ( *XAutoClaimJustIDCmd) () ( []string,  string) {
	return .val, .start
}

func ( *XAutoClaimJustIDCmd) () ( []string,  string,  error) {
	return .val, .start, .err
}

func ( *XAutoClaimJustIDCmd) () string {
	return cmdString(, .val)
}

func ( *XAutoClaimJustIDCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	switch  {
	case 2, // Redis 6
		3: // Redis 7:
		// ok
	default:
		return fmt.Errorf("redis: got %d elements in XAutoClaimJustID reply, wanted 2/3", )
	}

	.start,  = .ReadString()
	if  != nil {
		return 
	}

	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	.val = make([]string, )
	for  := 0;  < ; ++ {
		.val[],  = .ReadString()
		if  != nil {
			return 
		}
	}

	if  >= 3 {
		if  := .DiscardNext();  != nil {
			return 
		}
	}

	return nil
}

//------------------------------------------------------------------------------

type XInfoConsumersCmd struct {
	baseCmd
	val []XInfoConsumer
}

type XInfoConsumer struct {
	Name    string
	Pending int64
	Idle    time.Duration
}

var _ Cmder = (*XInfoConsumersCmd)(nil)

func ( context.Context,  string,  string) *XInfoConsumersCmd {
	return &XInfoConsumersCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: []interface{}{"xinfo", "consumers", , },
		},
	}
}

func ( *XInfoConsumersCmd) ( []XInfoConsumer) {
	.val = 
}

func ( *XInfoConsumersCmd) () []XInfoConsumer {
	return .val
}

func ( *XInfoConsumersCmd) () ([]XInfoConsumer, error) {
	return .val, .err
}

func ( *XInfoConsumersCmd) () string {
	return cmdString(, .val)
}

func ( *XInfoConsumersCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]XInfoConsumer, )

	for  := 0;  < len(.val); ++ {
		if  = .ReadFixedMapLen(3);  != nil {
			return 
		}

		var  string
		for  := 0;  < 3; ++ {
			,  = .ReadString()
			if  != nil {
				return 
			}

			switch  {
			case "name":
				.val[].Name,  = .ReadString()
			case "pending":
				.val[].Pending,  = .ReadInt()
			case "idle":
				var  int64
				,  = .ReadInt()
				.val[].Idle = time.Duration() * time.Millisecond
			default:
				return fmt.Errorf("redis: unexpected content %s in XINFO CONSUMERS reply", )
			}
			if  != nil {
				return 
			}
		}
	}

	return nil
}

//------------------------------------------------------------------------------

type XInfoGroupsCmd struct {
	baseCmd
	val []XInfoGroup
}

type XInfoGroup struct {
	Name            string
	Consumers       int64
	Pending         int64
	LastDeliveredID string
	EntriesRead     int64
	Lag             int64
}

var _ Cmder = (*XInfoGroupsCmd)(nil)

func ( context.Context,  string) *XInfoGroupsCmd {
	return &XInfoGroupsCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: []interface{}{"xinfo", "groups", },
		},
	}
}

func ( *XInfoGroupsCmd) ( []XInfoGroup) {
	.val = 
}

func ( *XInfoGroupsCmd) () []XInfoGroup {
	return .val
}

func ( *XInfoGroupsCmd) () ([]XInfoGroup, error) {
	return .val, .err
}

func ( *XInfoGroupsCmd) () string {
	return cmdString(, .val)
}

func ( *XInfoGroupsCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]XInfoGroup, )

	for  := 0;  < len(.val); ++ {
		 := &.val[]

		,  := .ReadMapLen()
		if  != nil {
			return 
		}

		var  string
		for  := 0;  < ; ++ {
			,  = .ReadString()
			if  != nil {
				return 
			}

			switch  {
			case "name":
				.Name,  = .ReadString()
				if  != nil {
					return 
				}
			case "consumers":
				.Consumers,  = .ReadInt()
				if  != nil {
					return 
				}
			case "pending":
				.Pending,  = .ReadInt()
				if  != nil {
					return 
				}
			case "last-delivered-id":
				.LastDeliveredID,  = .ReadString()
				if  != nil {
					return 
				}
			case "entries-read":
				.EntriesRead,  = .ReadInt()
				if  != nil &&  != Nil {
					return 
				}
			case "lag":
				.Lag,  = .ReadInt()

				// lag: the number of entries in the stream that are still waiting to be delivered
				// to the group's consumers, or a NULL(Nil) when that number can't be determined.
				if  != nil &&  != Nil {
					return 
				}
			default:
				return fmt.Errorf("redis: unexpected key %q in XINFO GROUPS reply", )
			}
		}
	}

	return nil
}

//------------------------------------------------------------------------------

type XInfoStreamCmd struct {
	baseCmd
	val *XInfoStream
}

type XInfoStream struct {
	Length               int64
	RadixTreeKeys        int64
	RadixTreeNodes       int64
	Groups               int64
	LastGeneratedID      string
	MaxDeletedEntryID    string
	EntriesAdded         int64
	FirstEntry           XMessage
	LastEntry            XMessage
	RecordedFirstEntryID string
}

var _ Cmder = (*XInfoStreamCmd)(nil)

func ( context.Context,  string) *XInfoStreamCmd {
	return &XInfoStreamCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: []interface{}{"xinfo", "stream", },
		},
	}
}

func ( *XInfoStreamCmd) ( *XInfoStream) {
	.val = 
}

func ( *XInfoStreamCmd) () *XInfoStream {
	return .val
}

func ( *XInfoStreamCmd) () (*XInfoStream, error) {
	return .val, .err
}

func ( *XInfoStreamCmd) () string {
	return cmdString(, .val)
}

func ( *XInfoStreamCmd) ( *proto.Reader) error {
	,  := .ReadMapLen()
	if  != nil {
		return 
	}
	.val = &XInfoStream{}

	for  := 0;  < ; ++ {
		,  := .ReadString()
		if  != nil {
			return 
		}
		switch  {
		case "length":
			.val.Length,  = .ReadInt()
			if  != nil {
				return 
			}
		case "radix-tree-keys":
			.val.RadixTreeKeys,  = .ReadInt()
			if  != nil {
				return 
			}
		case "radix-tree-nodes":
			.val.RadixTreeNodes,  = .ReadInt()
			if  != nil {
				return 
			}
		case "groups":
			.val.Groups,  = .ReadInt()
			if  != nil {
				return 
			}
		case "last-generated-id":
			.val.LastGeneratedID,  = .ReadString()
			if  != nil {
				return 
			}
		case "max-deleted-entry-id":
			.val.MaxDeletedEntryID,  = .ReadString()
			if  != nil {
				return 
			}
		case "entries-added":
			.val.EntriesAdded,  = .ReadInt()
			if  != nil {
				return 
			}
		case "first-entry":
			.val.FirstEntry,  = readXMessage()
			if  != nil &&  != Nil {
				return 
			}
		case "last-entry":
			.val.LastEntry,  = readXMessage()
			if  != nil &&  != Nil {
				return 
			}
		case "recorded-first-entry-id":
			.val.RecordedFirstEntryID,  = .ReadString()
			if  != nil {
				return 
			}
		default:
			return fmt.Errorf("redis: unexpected key %q in XINFO STREAM reply", )
		}
	}
	return nil
}

//------------------------------------------------------------------------------

type XInfoStreamFullCmd struct {
	baseCmd
	val *XInfoStreamFull
}

type XInfoStreamFull struct {
	Length               int64
	RadixTreeKeys        int64
	RadixTreeNodes       int64
	LastGeneratedID      string
	MaxDeletedEntryID    string
	EntriesAdded         int64
	Entries              []XMessage
	Groups               []XInfoStreamGroup
	RecordedFirstEntryID string
}

type XInfoStreamGroup struct {
	Name            string
	LastDeliveredID string
	EntriesRead     int64
	Lag             int64
	PelCount        int64
	Pending         []XInfoStreamGroupPending
	Consumers       []XInfoStreamConsumer
}

type XInfoStreamGroupPending struct {
	ID            string
	Consumer      string
	DeliveryTime  time.Time
	DeliveryCount int64
}

type XInfoStreamConsumer struct {
	Name     string
	SeenTime time.Time
	PelCount int64
	Pending  []XInfoStreamConsumerPending
}

type XInfoStreamConsumerPending struct {
	ID            string
	DeliveryTime  time.Time
	DeliveryCount int64
}

var _ Cmder = (*XInfoStreamFullCmd)(nil)

func ( context.Context,  ...interface{}) *XInfoStreamFullCmd {
	return &XInfoStreamFullCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *XInfoStreamFullCmd) ( *XInfoStreamFull) {
	.val = 
}

func ( *XInfoStreamFullCmd) () *XInfoStreamFull {
	return .val
}

func ( *XInfoStreamFullCmd) () (*XInfoStreamFull, error) {
	return .val, .err
}

func ( *XInfoStreamFullCmd) () string {
	return cmdString(, .val)
}

func ( *XInfoStreamFullCmd) ( *proto.Reader) error {
	,  := .ReadMapLen()
	if  != nil {
		return 
	}

	.val = &XInfoStreamFull{}

	for  := 0;  < ; ++ {
		,  := .ReadString()
		if  != nil {
			return 
		}

		switch  {
		case "length":
			.val.Length,  = .ReadInt()
			if  != nil {
				return 
			}
		case "radix-tree-keys":
			.val.RadixTreeKeys,  = .ReadInt()
			if  != nil {
				return 
			}
		case "radix-tree-nodes":
			.val.RadixTreeNodes,  = .ReadInt()
			if  != nil {
				return 
			}
		case "last-generated-id":
			.val.LastGeneratedID,  = .ReadString()
			if  != nil {
				return 
			}
		case "entries-added":
			.val.EntriesAdded,  = .ReadInt()
			if  != nil {
				return 
			}
		case "entries":
			.val.Entries,  = readXMessageSlice()
			if  != nil {
				return 
			}
		case "groups":
			.val.Groups,  = readStreamGroups()
			if  != nil {
				return 
			}
		case "max-deleted-entry-id":
			.val.MaxDeletedEntryID,  = .ReadString()
			if  != nil {
				return 
			}
		case "recorded-first-entry-id":
			.val.RecordedFirstEntryID,  = .ReadString()
			if  != nil {
				return 
			}
		default:
			return fmt.Errorf("redis: unexpected key %q in XINFO STREAM FULL reply", )
		}
	}
	return nil
}

func readStreamGroups( *proto.Reader) ([]XInfoStreamGroup, error) {
	,  := .ReadArrayLen()
	if  != nil {
		return nil, 
	}
	 := make([]XInfoStreamGroup, 0, )
	for  := 0;  < ; ++ {
		,  := .ReadMapLen()
		if  != nil {
			return nil, 
		}

		 := XInfoStreamGroup{}

		for  := 0;  < ; ++ {
			,  := .ReadString()
			if  != nil {
				return nil, 
			}

			switch  {
			case "name":
				.Name,  = .ReadString()
				if  != nil {
					return nil, 
				}
			case "last-delivered-id":
				.LastDeliveredID,  = .ReadString()
				if  != nil {
					return nil, 
				}
			case "entries-read":
				.EntriesRead,  = .ReadInt()
				if  != nil {
					return nil, 
				}
			case "lag":
				// lag: the number of entries in the stream that are still waiting to be delivered
				// to the group's consumers, or a NULL(Nil) when that number can't be determined.
				.Lag,  = .ReadInt()
				if  != nil &&  != Nil {
					return nil, 
				}
			case "pel-count":
				.PelCount,  = .ReadInt()
				if  != nil {
					return nil, 
				}
			case "pending":
				.Pending,  = readXInfoStreamGroupPending()
				if  != nil {
					return nil, 
				}
			case "consumers":
				.Consumers,  = readXInfoStreamConsumers()
				if  != nil {
					return nil, 
				}
			default:
				return nil, fmt.Errorf("redis: unexpected key %q in XINFO STREAM FULL reply", )
			}
		}

		 = append(, )
	}

	return , nil
}

func readXInfoStreamGroupPending( *proto.Reader) ([]XInfoStreamGroupPending, error) {
	,  := .ReadArrayLen()
	if  != nil {
		return nil, 
	}

	 := make([]XInfoStreamGroupPending, 0, )

	for  := 0;  < ; ++ {
		if  = .ReadFixedArrayLen(4);  != nil {
			return nil, 
		}

		 := XInfoStreamGroupPending{}

		.ID,  = .ReadString()
		if  != nil {
			return nil, 
		}

		.Consumer,  = .ReadString()
		if  != nil {
			return nil, 
		}

		,  := .ReadInt()
		if  != nil {
			return nil, 
		}
		.DeliveryTime = time.Unix(/1000, %1000*int64(time.Millisecond))

		.DeliveryCount,  = .ReadInt()
		if  != nil {
			return nil, 
		}

		 = append(, )
	}

	return , nil
}

func readXInfoStreamConsumers( *proto.Reader) ([]XInfoStreamConsumer, error) {
	,  := .ReadArrayLen()
	if  != nil {
		return nil, 
	}

	 := make([]XInfoStreamConsumer, 0, )

	for  := 0;  < ; ++ {
		if  = .ReadFixedMapLen(4);  != nil {
			return nil, 
		}

		 := XInfoStreamConsumer{}

		for  := 0;  < 4; ++ {
			,  := .ReadString()
			if  != nil {
				return nil, 
			}

			switch  {
			case "name":
				.Name,  = .ReadString()
			case "seen-time":
				,  := .ReadInt()
				if  != nil {
					return nil, 
				}
				.SeenTime = time.Unix(/1000, %1000*int64(time.Millisecond))
			case "pel-count":
				.PelCount,  = .ReadInt()
			case "pending":
				,  := .ReadArrayLen()
				if  != nil {
					return nil, 
				}

				.Pending = make([]XInfoStreamConsumerPending, 0, )

				for  := 0;  < ; ++ {
					if  = .ReadFixedArrayLen(3);  != nil {
						return nil, 
					}

					 := XInfoStreamConsumerPending{}

					.ID,  = .ReadString()
					if  != nil {
						return nil, 
					}

					,  := .ReadInt()
					if  != nil {
						return nil, 
					}
					.DeliveryTime = time.Unix(/1000, %1000*int64(time.Millisecond))

					.DeliveryCount,  = .ReadInt()
					if  != nil {
						return nil, 
					}

					.Pending = append(.Pending, )
				}
			default:
				return nil, fmt.Errorf("redis: unexpected content %s "+
					"in XINFO STREAM FULL reply", )
			}
			if  != nil {
				return nil, 
			}
		}
		 = append(, )
	}

	return , nil
}

//------------------------------------------------------------------------------

type ZSliceCmd struct {
	baseCmd

	val []Z
}

var _ Cmder = (*ZSliceCmd)(nil)

func ( context.Context,  ...interface{}) *ZSliceCmd {
	return &ZSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *ZSliceCmd) ( []Z) {
	.val = 
}

func ( *ZSliceCmd) () []Z {
	return .val
}

func ( *ZSliceCmd) () ([]Z, error) {
	return .val, .err
}

func ( *ZSliceCmd) () string {
	return cmdString(, .val)
}

func ( *ZSliceCmd) ( *proto.Reader) error { // nolint:dupl
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	// If the n is 0, can't continue reading.
	if  == 0 {
		.val = make([]Z, 0)
		return nil
	}

	,  := .PeekReplyType()
	if  != nil {
		return 
	}
	 :=  == proto.RespArray

	if  {
		.val = make([]Z, )
	} else {
		.val = make([]Z, /2)
	}

	for  := 0;  < len(.val); ++ {
		if  {
			if  = .ReadFixedArrayLen(2);  != nil {
				return 
			}
		}

		if .val[].Member,  = .ReadString();  != nil {
			return 
		}

		if .val[].Score,  = .ReadFloat();  != nil {
			return 
		}
	}

	return nil
}

//------------------------------------------------------------------------------

type ZWithKeyCmd struct {
	baseCmd

	val *ZWithKey
}

var _ Cmder = (*ZWithKeyCmd)(nil)

func ( context.Context,  ...interface{}) *ZWithKeyCmd {
	return &ZWithKeyCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *ZWithKeyCmd) ( *ZWithKey) {
	.val = 
}

func ( *ZWithKeyCmd) () *ZWithKey {
	return .val
}

func ( *ZWithKeyCmd) () (*ZWithKey, error) {
	return .Val(), .Err()
}

func ( *ZWithKeyCmd) () string {
	return cmdString(, .val)
}

func ( *ZWithKeyCmd) ( *proto.Reader) ( error) {
	if  = .ReadFixedArrayLen(3);  != nil {
		return 
	}
	.val = &ZWithKey{}

	if .val.Key,  = .ReadString();  != nil {
		return 
	}
	if .val.Member,  = .ReadString();  != nil {
		return 
	}
	if .val.Score,  = .ReadFloat();  != nil {
		return 
	}

	return nil
}

//------------------------------------------------------------------------------

type ScanCmd struct {
	baseCmd

	page   []string
	cursor uint64

	process cmdable
}

var _ Cmder = (*ScanCmd)(nil)

func ( context.Context,  cmdable,  ...interface{}) *ScanCmd {
	return &ScanCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
		process: ,
	}
}

func ( *ScanCmd) ( []string,  uint64) {
	.page = 
	.cursor = 
}

func ( *ScanCmd) () ( []string,  uint64) {
	return .page, .cursor
}

func ( *ScanCmd) () ( []string,  uint64,  error) {
	return .page, .cursor, .err
}

func ( *ScanCmd) () string {
	return cmdString(, .page)
}

func ( *ScanCmd) ( *proto.Reader) error {
	if  := .ReadFixedArrayLen(2);  != nil {
		return 
	}

	,  := .ReadUint()
	if  != nil {
		return 
	}
	.cursor = 

	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.page = make([]string, )

	for  := 0;  < len(.page); ++ {
		if .page[],  = .ReadString();  != nil {
			return 
		}
	}
	return nil
}

// Iterator creates a new ScanIterator.
func ( *ScanCmd) () *ScanIterator {
	return &ScanIterator{
		cmd: ,
	}
}

//------------------------------------------------------------------------------

type ClusterNode struct {
	ID                 string
	Addr               string
	NetworkingMetadata map[string]string
}

type ClusterSlot struct {
	Start int
	End   int
	Nodes []ClusterNode
}

type ClusterSlotsCmd struct {
	baseCmd

	val []ClusterSlot
}

var _ Cmder = (*ClusterSlotsCmd)(nil)

func ( context.Context,  ...interface{}) *ClusterSlotsCmd {
	return &ClusterSlotsCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *ClusterSlotsCmd) ( []ClusterSlot) {
	.val = 
}

func ( *ClusterSlotsCmd) () []ClusterSlot {
	return .val
}

func ( *ClusterSlotsCmd) () ([]ClusterSlot, error) {
	return .Val(), .Err()
}

func ( *ClusterSlotsCmd) () string {
	return cmdString(, .val)
}

func ( *ClusterSlotsCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]ClusterSlot, )

	for  := 0;  < len(.val); ++ {
		,  = .ReadArrayLen()
		if  != nil {
			return 
		}
		if  < 2 {
			return fmt.Errorf("redis: got %d elements in cluster info, expected at least 2", )
		}

		,  := .ReadInt()
		if  != nil {
			return 
		}

		,  := .ReadInt()
		if  != nil {
			return 
		}

		// subtract start and end.
		 := make([]ClusterNode, -2)

		for  := 0;  < len(); ++ {
			,  := .ReadArrayLen()
			if  != nil {
				return 
			}
			if  < 2 ||  > 4 {
				return fmt.Errorf("got %d elements in cluster info address, expected 2, 3, or 4", )
			}

			,  := .ReadString()
			if  != nil {
				return 
			}

			,  := .ReadString()
			if  != nil {
				return 
			}

			[].Addr = net.JoinHostPort(, )

			if  >= 3 {
				,  := .ReadString()
				if  != nil {
					return 
				}
				[].ID = 
			}

			if  >= 4 {
				,  := .ReadMapLen()
				if  != nil {
					return 
				}

				 := make(map[string]string, )

				for  := 0;  < ; ++ {
					,  := .ReadString()
					if  != nil {
						return 
					}
					,  := .ReadString()
					if  != nil {
						return 
					}
					[] = 
				}

				[].NetworkingMetadata = 
			}
		}

		.val[] = ClusterSlot{
			Start: int(),
			End:   int(),
			Nodes: ,
		}
	}

	return nil
}

//------------------------------------------------------------------------------

// GeoLocation is used with GeoAdd to add geospatial location.
type GeoLocation struct {
	Name                      string
	Longitude, Latitude, Dist float64
	GeoHash                   int64
}

// GeoRadiusQuery is used with GeoRadius to query geospatial index.
type GeoRadiusQuery struct {
	Radius float64
	// Can be m, km, ft, or mi. Default is km.
	Unit        string
	WithCoord   bool
	WithDist    bool
	WithGeoHash bool
	Count       int
	// Can be ASC or DESC. Default is no sort order.
	Sort      string
	Store     string
	StoreDist string

	// WithCoord+WithDist+WithGeoHash
	withLen int
}

type GeoLocationCmd struct {
	baseCmd

	q         *GeoRadiusQuery
	locations []GeoLocation
}

var _ Cmder = (*GeoLocationCmd)(nil)

func ( context.Context,  *GeoRadiusQuery,  ...interface{}) *GeoLocationCmd {
	return &GeoLocationCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: geoLocationArgs(, ...),
		},
		q: ,
	}
}

func geoLocationArgs( *GeoRadiusQuery,  ...interface{}) []interface{} {
	 = append(, .Radius)
	if .Unit != "" {
		 = append(, .Unit)
	} else {
		 = append(, "km")
	}
	if .WithCoord {
		 = append(, "withcoord")
		.withLen++
	}
	if .WithDist {
		 = append(, "withdist")
		.withLen++
	}
	if .WithGeoHash {
		 = append(, "withhash")
		.withLen++
	}
	if .Count > 0 {
		 = append(, "count", .Count)
	}
	if .Sort != "" {
		 = append(, .Sort)
	}
	if .Store != "" {
		 = append(, "store")
		 = append(, .Store)
	}
	if .StoreDist != "" {
		 = append(, "storedist")
		 = append(, .StoreDist)
	}
	return 
}

func ( *GeoLocationCmd) ( []GeoLocation) {
	.locations = 
}

func ( *GeoLocationCmd) () []GeoLocation {
	return .locations
}

func ( *GeoLocationCmd) () ([]GeoLocation, error) {
	return .locations, .err
}

func ( *GeoLocationCmd) () string {
	return cmdString(, .locations)
}

func ( *GeoLocationCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.locations = make([]GeoLocation, )

	for  := 0;  < len(.locations); ++ {
		// only name
		if .q.withLen == 0 {
			if .locations[].Name,  = .ReadString();  != nil {
				return 
			}
			continue
		}

		// +name
		if  = .ReadFixedArrayLen(.q.withLen + 1);  != nil {
			return 
		}

		if .locations[].Name,  = .ReadString();  != nil {
			return 
		}
		if .q.WithDist {
			if .locations[].Dist,  = .ReadFloat();  != nil {
				return 
			}
		}
		if .q.WithGeoHash {
			if .locations[].GeoHash,  = .ReadInt();  != nil {
				return 
			}
		}
		if .q.WithCoord {
			if  = .ReadFixedArrayLen(2);  != nil {
				return 
			}
			if .locations[].Longitude,  = .ReadFloat();  != nil {
				return 
			}
			if .locations[].Latitude,  = .ReadFloat();  != nil {
				return 
			}
		}
	}

	return nil
}

//------------------------------------------------------------------------------

// GeoSearchQuery is used for GEOSearch/GEOSearchStore command query.
type GeoSearchQuery struct {
	Member string

	// Latitude and Longitude when using FromLonLat option.
	Longitude float64
	Latitude  float64

	// Distance and unit when using ByRadius option.
	// Can use m, km, ft, or mi. Default is km.
	Radius     float64
	RadiusUnit string

	// Height, width and unit when using ByBox option.
	// Can be m, km, ft, or mi. Default is km.
	BoxWidth  float64
	BoxHeight float64
	BoxUnit   string

	// Can be ASC or DESC. Default is no sort order.
	Sort     string
	Count    int
	CountAny bool
}

type GeoSearchLocationQuery struct {
	GeoSearchQuery

	WithCoord bool
	WithDist  bool
	WithHash  bool
}

type GeoSearchStoreQuery struct {
	GeoSearchQuery

	// When using the StoreDist option, the command stores the items in a
	// sorted set populated with their distance from the center of the circle or box,
	// as a floating-point number, in the same unit specified for that shape.
	StoreDist bool
}

func geoSearchLocationArgs( *GeoSearchLocationQuery,  []interface{}) []interface{} {
	 = geoSearchArgs(&.GeoSearchQuery, )

	if .WithCoord {
		 = append(, "withcoord")
	}
	if .WithDist {
		 = append(, "withdist")
	}
	if .WithHash {
		 = append(, "withhash")
	}

	return 
}

func geoSearchArgs( *GeoSearchQuery,  []interface{}) []interface{} {
	if .Member != "" {
		 = append(, "frommember", .Member)
	} else {
		 = append(, "fromlonlat", .Longitude, .Latitude)
	}

	if .Radius > 0 {
		if .RadiusUnit == "" {
			.RadiusUnit = "km"
		}
		 = append(, "byradius", .Radius, .RadiusUnit)
	} else {
		if .BoxUnit == "" {
			.BoxUnit = "km"
		}
		 = append(, "bybox", .BoxWidth, .BoxHeight, .BoxUnit)
	}

	if .Sort != "" {
		 = append(, .Sort)
	}

	if .Count > 0 {
		 = append(, "count", .Count)
		if .CountAny {
			 = append(, "any")
		}
	}

	return 
}

type GeoSearchLocationCmd struct {
	baseCmd

	opt *GeoSearchLocationQuery
	val []GeoLocation
}

var _ Cmder = (*GeoSearchLocationCmd)(nil)

func (
	 context.Context,  *GeoSearchLocationQuery,  ...interface{},
) *GeoSearchLocationCmd {
	return &GeoSearchLocationCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
		opt: ,
	}
}

func ( *GeoSearchLocationCmd) ( []GeoLocation) {
	.val = 
}

func ( *GeoSearchLocationCmd) () []GeoLocation {
	return .val
}

func ( *GeoSearchLocationCmd) () ([]GeoLocation, error) {
	return .val, .err
}

func ( *GeoSearchLocationCmd) () string {
	return cmdString(, .val)
}

func ( *GeoSearchLocationCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	.val = make([]GeoLocation, )
	for  := 0;  < ; ++ {
		_,  = .ReadArrayLen()
		if  != nil {
			return 
		}

		var  GeoLocation

		.Name,  = .ReadString()
		if  != nil {
			return 
		}
		if .opt.WithDist {
			.Dist,  = .ReadFloat()
			if  != nil {
				return 
			}
		}
		if .opt.WithHash {
			.GeoHash,  = .ReadInt()
			if  != nil {
				return 
			}
		}
		if .opt.WithCoord {
			if  = .ReadFixedArrayLen(2);  != nil {
				return 
			}
			.Longitude,  = .ReadFloat()
			if  != nil {
				return 
			}
			.Latitude,  = .ReadFloat()
			if  != nil {
				return 
			}
		}

		.val[] = 
	}

	return nil
}

//------------------------------------------------------------------------------

type GeoPos struct {
	Longitude, Latitude float64
}

type GeoPosCmd struct {
	baseCmd

	val []*GeoPos
}

var _ Cmder = (*GeoPosCmd)(nil)

func ( context.Context,  ...interface{}) *GeoPosCmd {
	return &GeoPosCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *GeoPosCmd) ( []*GeoPos) {
	.val = 
}

func ( *GeoPosCmd) () []*GeoPos {
	return .val
}

func ( *GeoPosCmd) () ([]*GeoPos, error) {
	return .Val(), .Err()
}

func ( *GeoPosCmd) () string {
	return cmdString(, .val)
}

func ( *GeoPosCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]*GeoPos, )

	for  := 0;  < len(.val); ++ {
		 = .ReadFixedArrayLen(2)
		if  != nil {
			if  == Nil {
				.val[] = nil
				continue
			}
			return 
		}

		,  := .ReadFloat()
		if  != nil {
			return 
		}
		,  := .ReadFloat()
		if  != nil {
			return 
		}

		.val[] = &GeoPos{
			Longitude: ,
			Latitude:  ,
		}
	}

	return nil
}

//------------------------------------------------------------------------------

type CommandInfo struct {
	Name        string
	Arity       int8
	Flags       []string
	ACLFlags    []string
	FirstKeyPos int8
	LastKeyPos  int8
	StepCount   int8
	ReadOnly    bool
}

type CommandsInfoCmd struct {
	baseCmd

	val map[string]*CommandInfo
}

var _ Cmder = (*CommandsInfoCmd)(nil)

func ( context.Context,  ...interface{}) *CommandsInfoCmd {
	return &CommandsInfoCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *CommandsInfoCmd) ( map[string]*CommandInfo) {
	.val = 
}

func ( *CommandsInfoCmd) () map[string]*CommandInfo {
	return .val
}

func ( *CommandsInfoCmd) () (map[string]*CommandInfo, error) {
	return .Val(), .Err()
}

func ( *CommandsInfoCmd) () string {
	return cmdString(, .val)
}

func ( *CommandsInfoCmd) ( *proto.Reader) error {
	const  = 6
	const  = 7
	const  = 10

	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make(map[string]*CommandInfo, )

	for  := 0;  < ; ++ {
		,  := .ReadArrayLen()
		if  != nil {
			return 
		}

		switch  {
		case , , :
			// ok
		default:
			return fmt.Errorf("redis: got %d elements in COMMAND reply, wanted 6/7/10", )
		}

		 := &CommandInfo{}
		if .Name,  = .ReadString();  != nil {
			return 
		}

		,  := .ReadInt()
		if  != nil {
			return 
		}
		.Arity = int8()

		,  := .ReadArrayLen()
		if  != nil {
			return 
		}
		.Flags = make([]string, )
		for  := 0;  < len(.Flags); ++ {
			switch ,  := .ReadString(); {
			case  == Nil:
				.Flags[] = ""
			case  != nil:
				return 
			default:
				if !.ReadOnly &&  == "readonly" {
					.ReadOnly = true
				}
				.Flags[] = 
			}
		}

		,  := .ReadInt()
		if  != nil {
			return 
		}
		.FirstKeyPos = int8()

		,  := .ReadInt()
		if  != nil {
			return 
		}
		.LastKeyPos = int8()

		,  := .ReadInt()
		if  != nil {
			return 
		}
		.StepCount = int8()

		if  >=  {
			,  := .ReadArrayLen()
			if  != nil {
				return 
			}
			.ACLFlags = make([]string, )
			for  := 0;  < len(.ACLFlags); ++ {
				switch ,  := .ReadString(); {
				case  == Nil:
					.ACLFlags[] = ""
				case  != nil:
					return 
				default:
					.ACLFlags[] = 
				}
			}
		}

		if  >=  {
			if  := .DiscardNext();  != nil {
				return 
			}
			if  := .DiscardNext();  != nil {
				return 
			}
			if  := .DiscardNext();  != nil {
				return 
			}
		}

		.val[.Name] = 
	}

	return nil
}

//------------------------------------------------------------------------------

type cmdsInfoCache struct {
	fn func(ctx context.Context) (map[string]*CommandInfo, error)

	once internal.Once
	cmds map[string]*CommandInfo
}

func newCmdsInfoCache( func( context.Context) (map[string]*CommandInfo, error)) *cmdsInfoCache {
	return &cmdsInfoCache{
		fn: ,
	}
}

func ( *cmdsInfoCache) ( context.Context) (map[string]*CommandInfo, error) {
	 := .once.Do(func() error {
		,  := .fn()
		if  != nil {
			return 
		}

		// Extensions have cmd names in upper case. Convert them to lower case.
		for ,  := range  {
			 := internal.ToLower()
			if  !=  {
				[] = 
			}
		}

		.cmds = 
		return nil
	})
	return .cmds, 
}

//------------------------------------------------------------------------------

type SlowLog struct {
	ID       int64
	Time     time.Time
	Duration time.Duration
	Args     []string
	// These are also optional fields emitted only by Redis 4.0 or greater:
	// https://redis.io/commands/slowlog#output-format
	ClientAddr string
	ClientName string
}

type SlowLogCmd struct {
	baseCmd

	val []SlowLog
}

var _ Cmder = (*SlowLogCmd)(nil)

func ( context.Context,  ...interface{}) *SlowLogCmd {
	return &SlowLogCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *SlowLogCmd) ( []SlowLog) {
	.val = 
}

func ( *SlowLogCmd) () []SlowLog {
	return .val
}

func ( *SlowLogCmd) () ([]SlowLog, error) {
	return .Val(), .Err()
}

func ( *SlowLogCmd) () string {
	return cmdString(, .val)
}

func ( *SlowLogCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]SlowLog, )

	for  := 0;  < len(.val); ++ {
		,  := .ReadArrayLen()
		if  != nil {
			return 
		}
		if  < 4 {
			return fmt.Errorf("redis: got %d elements in slowlog get, expected at least 4", )
		}

		if .val[].ID,  = .ReadInt();  != nil {
			return 
		}

		,  := .ReadInt()
		if  != nil {
			return 
		}
		.val[].Time = time.Unix(, 0)

		,  := .ReadInt()
		if  != nil {
			return 
		}
		.val[].Duration = time.Duration() * time.Microsecond

		,  := .ReadArrayLen()
		if  != nil {
			return 
		}
		if  < 1 {
			return fmt.Errorf("redis: got %d elements commands reply in slowlog get, expected at least 1", )
		}

		.val[].Args = make([]string, )
		for  := 0;  < len(.val[].Args); ++ {
			.val[].Args[],  = .ReadString()
			if  != nil {
				return 
			}
		}

		if  >= 5 {
			if .val[].ClientAddr,  = .ReadString();  != nil {
				return 
			}
		}

		if  >= 6 {
			if .val[].ClientName,  = .ReadString();  != nil {
				return 
			}
		}
	}

	return nil
}

//-----------------------------------------------------------------------

type MapStringInterfaceCmd struct {
	baseCmd

	val map[string]interface{}
}

var _ Cmder = (*MapStringInterfaceCmd)(nil)

func ( context.Context,  ...interface{}) *MapStringInterfaceCmd {
	return &MapStringInterfaceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *MapStringInterfaceCmd) ( map[string]interface{}) {
	.val = 
}

func ( *MapStringInterfaceCmd) () map[string]interface{} {
	return .val
}

func ( *MapStringInterfaceCmd) () (map[string]interface{}, error) {
	return .Val(), .Err()
}

func ( *MapStringInterfaceCmd) () string {
	return cmdString(, .val)
}

func ( *MapStringInterfaceCmd) ( *proto.Reader) error {
	,  := .ReadMapLen()
	if  != nil {
		return 
	}

	.val = make(map[string]interface{}, )
	for  := 0;  < ; ++ {
		,  := .ReadString()
		if  != nil {
			return 
		}
		,  := .ReadReply()
		if  != nil {
			if  == Nil {
				.val[] = Nil
				continue
			}
			if ,  := .(proto.RedisError);  {
				.val[] = 
				continue
			}
			return 
		}
		.val[] = 
	}
	return nil
}

//-----------------------------------------------------------------------

type MapStringStringSliceCmd struct {
	baseCmd

	val []map[string]string
}

var _ Cmder = (*MapStringStringSliceCmd)(nil)

func ( context.Context,  ...interface{}) *MapStringStringSliceCmd {
	return &MapStringStringSliceCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *MapStringStringSliceCmd) ( []map[string]string) {
	.val = 
}

func ( *MapStringStringSliceCmd) () []map[string]string {
	return .val
}

func ( *MapStringStringSliceCmd) () ([]map[string]string, error) {
	return .Val(), .Err()
}

func ( *MapStringStringSliceCmd) () string {
	return cmdString(, .val)
}

func ( *MapStringStringSliceCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	.val = make([]map[string]string, )
	for  := 0;  < ; ++ {
		,  := .ReadMapLen()
		if  != nil {
			return 
		}
		.val[] = make(map[string]string, )
		for  := 0;  < ; ++ {
			,  := .ReadString()
			if  != nil {
				return 
			}

			,  := .ReadString()
			if  != nil {
				return 
			}
			.val[][] = 
		}
	}
	return nil
}

//------------------------------------------------------------------------------

type KeyValuesCmd struct {
	baseCmd

	key string
	val []string
}

var _ Cmder = (*KeyValuesCmd)(nil)

func ( context.Context,  ...interface{}) *KeyValuesCmd {
	return &KeyValuesCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *KeyValuesCmd) ( string,  []string) {
	.key = 
	.val = 
}

func ( *KeyValuesCmd) () (string, []string) {
	return .key, .val
}

func ( *KeyValuesCmd) () (string, []string, error) {
	return .key, .val, .err
}

func ( *KeyValuesCmd) () string {
	return cmdString(, .val)
}

func ( *KeyValuesCmd) ( *proto.Reader) ( error) {
	if  = .ReadFixedArrayLen(2);  != nil {
		return 
	}

	.key,  = .ReadString()
	if  != nil {
		return 
	}

	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]string, )
	for  := 0;  < ; ++ {
		.val[],  = .ReadString()
		if  != nil {
			return 
		}
	}

	return nil
}

//------------------------------------------------------------------------------

type ZSliceWithKeyCmd struct {
	baseCmd

	key string
	val []Z
}

var _ Cmder = (*ZSliceWithKeyCmd)(nil)

func ( context.Context,  ...interface{}) *ZSliceWithKeyCmd {
	return &ZSliceWithKeyCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *ZSliceWithKeyCmd) ( string,  []Z) {
	.key = 
	.val = 
}

func ( *ZSliceWithKeyCmd) () (string, []Z) {
	return .key, .val
}

func ( *ZSliceWithKeyCmd) () (string, []Z, error) {
	return .key, .val, .err
}

func ( *ZSliceWithKeyCmd) () string {
	return cmdString(, .val)
}

func ( *ZSliceWithKeyCmd) ( *proto.Reader) ( error) {
	if  = .ReadFixedArrayLen(2);  != nil {
		return 
	}

	.key,  = .ReadString()
	if  != nil {
		return 
	}

	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	,  := .PeekReplyType()
	if  != nil {
		return 
	}
	 :=  == proto.RespArray

	if  {
		.val = make([]Z, )
	} else {
		.val = make([]Z, /2)
	}

	for  := 0;  < len(.val); ++ {
		if  {
			if  = .ReadFixedArrayLen(2);  != nil {
				return 
			}
		}

		if .val[].Member,  = .ReadString();  != nil {
			return 
		}

		if .val[].Score,  = .ReadFloat();  != nil {
			return 
		}
	}

	return nil
}

type Function struct {
	Name        string
	Description string
	Flags       []string
}

type Library struct {
	Name      string
	Engine    string
	Functions []Function
	Code      string
}

type FunctionListCmd struct {
	baseCmd

	val []Library
}

var _ Cmder = (*FunctionListCmd)(nil)

func ( context.Context,  ...interface{}) *FunctionListCmd {
	return &FunctionListCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *FunctionListCmd) ( []Library) {
	.val = 
}

func ( *FunctionListCmd) () string {
	return cmdString(, .val)
}

func ( *FunctionListCmd) () []Library {
	return .val
}

func ( *FunctionListCmd) () ([]Library, error) {
	return .val, .err
}

func ( *FunctionListCmd) () (*Library, error) {
	if .err != nil {
		return nil, .err
	}
	if len(.val) > 0 {
		return &.val[0], nil
	}
	return nil, Nil
}

func ( *FunctionListCmd) ( *proto.Reader) ( error) {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	 := make([]Library, )
	for  := 0;  < ; ++ {
		,  := .ReadMapLen()
		if  != nil {
			return 
		}

		 := Library{}
		for  := 0;  < ; ++ {
			,  := .ReadString()
			if  != nil {
				return 
			}

			switch  {
			case "library_name":
				.Name,  = .ReadString()
			case "engine":
				.Engine,  = .ReadString()
			case "functions":
				.Functions,  = .readFunctions()
			case "library_code":
				.Code,  = .ReadString()
			default:
				return fmt.Errorf("redis: function list unexpected key %s", )
			}

			if  != nil {
				return 
			}
		}

		[] = 
	}
	.val = 
	return nil
}

func ( *FunctionListCmd) ( *proto.Reader) ([]Function, error) {
	,  := .ReadArrayLen()
	if  != nil {
		return nil, 
	}

	 := make([]Function, )
	for  := 0;  < ; ++ {
		,  := .ReadMapLen()
		if  != nil {
			return nil, 
		}

		 := Function{}
		for  := 0;  < ; ++ {
			,  := .ReadString()
			if  != nil {
				return nil, 
			}

			switch  {
			case "name":
				if .Name,  = .ReadString();  != nil {
					return nil, 
				}
			case "description":
				if .Description,  = .ReadString();  != nil &&  != Nil {
					return nil, 
				}
			case "flags":
				// resp set
				,  := .ReadArrayLen()
				if  != nil {
					return nil, 
				}

				.Flags = make([]string, )
				for  := 0;  < ; ++ {
					if .Flags[],  = .ReadString();  != nil {
						return nil, 
					}
				}
			default:
				return nil, fmt.Errorf("redis: function list unexpected key %s", )
			}
		}

		[] = 
	}
	return , nil
}

// FunctionStats contains information about the scripts currently executing on the server, and the available engines
//   - Engines:
//     Statistics about the engine like number of functions and number of libraries
//   - RunningScript:
//     The script currently running on the shard we're connecting to.
//     For Redis Enterprise and Redis Cloud, this represents the
//     function with the longest running time, across all the running functions, on all shards
//   - RunningScripts
//     All scripts currently running in a Redis Enterprise clustered database.
//     Only available on Redis Enterprise
type FunctionStats struct {
	Engines   []Engine
	isRunning bool
	rs        RunningScript
	allrs     []RunningScript
}

func ( *FunctionStats) () bool {
	return .isRunning
}

func ( *FunctionStats) () (RunningScript, bool) {
	return .rs, .isRunning
}

// AllRunningScripts returns all scripts currently running in a Redis Enterprise clustered database.
// Only available on Redis Enterprise
func ( *FunctionStats) () []RunningScript {
	return .allrs
}

type RunningScript struct {
	Name     string
	Command  []string
	Duration time.Duration
}

type Engine struct {
	Language       string
	LibrariesCount int64
	FunctionsCount int64
}

type FunctionStatsCmd struct {
	baseCmd
	val FunctionStats
}

var _ Cmder = (*FunctionStatsCmd)(nil)

func ( context.Context,  ...interface{}) *FunctionStatsCmd {
	return &FunctionStatsCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *FunctionStatsCmd) ( FunctionStats) {
	.val = 
}

func ( *FunctionStatsCmd) () string {
	return cmdString(, .val)
}

func ( *FunctionStatsCmd) () FunctionStats {
	return .val
}

func ( *FunctionStatsCmd) () (FunctionStats, error) {
	return .val, .err
}

func ( *FunctionStatsCmd) ( *proto.Reader) ( error) {
	,  := .ReadMapLen()
	if  != nil {
		return 
	}

	var  string
	var  FunctionStats
	for  := 0;  < ; ++ {
		,  = .ReadString()
		if  != nil {
			return 
		}

		switch  {
		case "running_script":
			.rs, .isRunning,  = .readRunningScript()
		case "engines":
			.Engines,  = .readEngines()
		case "all_running_scripts": // Redis Enterprise only
			.allrs, .isRunning,  = .readRunningScripts()
		default:
			return fmt.Errorf("redis: function stats unexpected key %s", )
		}

		if  != nil {
			return 
		}
	}

	.val = 
	return nil
}

func ( *FunctionStatsCmd) ( *proto.Reader) (RunningScript, bool, error) {
	 := .ReadFixedMapLen(3)
	if  != nil {
		if  == Nil {
			return RunningScript{}, false, nil
		}
		return RunningScript{}, false, 
	}

	var  RunningScript
	for  := 0;  < 3; ++ {
		,  := .ReadString()
		if  != nil {
			return RunningScript{}, false, 
		}

		switch  {
		case "name":
			.Name,  = .ReadString()
		case "duration_ms":
			.Duration,  = .readDuration()
		case "command":
			.Command,  = .readCommand()
		default:
			return RunningScript{}, false, fmt.Errorf("redis: function stats unexpected running_script key %s", )
		}

		if  != nil {
			return RunningScript{}, false, 
		}
	}

	return , true, nil
}

func ( *FunctionStatsCmd) ( *proto.Reader) ([]Engine, error) {
	,  := .ReadMapLen()
	if  != nil {
		return nil, 
	}

	 := make([]Engine, 0, )
	for  := 0;  < ; ++ {
		 := Engine{}
		.Language,  = .ReadString()
		if  != nil {
			return nil, 
		}

		 = .ReadFixedMapLen(2)
		if  != nil {
			return nil, fmt.Errorf("redis: function stats unexpected %s engine map length", .Language)
		}

		for  := 0;  < 2; ++ {
			,  := .ReadString()
			switch  {
			case "libraries_count":
				.LibrariesCount,  = .ReadInt()
			case "functions_count":
				.FunctionsCount,  = .ReadInt()
			}
			if  != nil {
				return nil, 
			}
		}

		 = append(, )
	}
	return , nil
}

func ( *FunctionStatsCmd) ( *proto.Reader) (time.Duration, error) {
	,  := .ReadInt()
	if  != nil {
		return time.Duration(0), 
	}
	return time.Duration() * time.Millisecond, nil
}

func ( *FunctionStatsCmd) ( *proto.Reader) ([]string, error) {

	,  := .ReadArrayLen()
	if  != nil {
		return nil, 
	}

	 := make([]string, 0, )
	for  := 0;  < ; ++ {
		,  := .ReadString()
		if  != nil {
			return nil, 
		}
		 = append(, )
	}

	return , nil
}
func ( *FunctionStatsCmd) ( *proto.Reader) ([]RunningScript, bool, error) {
	,  := .ReadArrayLen()
	if  != nil {
		return nil, false, 
	}

	 := make([]RunningScript, 0, )
	for  := 0;  < ; ++ {
		, ,  := .readRunningScript()
		if  != nil {
			return nil, false, 
		}
		 = append(, )
	}

	return , len() > 0, nil
}

//------------------------------------------------------------------------------

// LCSQuery is a parameter used for the LCS command
type LCSQuery struct {
	Key1         string
	Key2         string
	Len          bool
	Idx          bool
	MinMatchLen  int
	WithMatchLen bool
}

// LCSMatch is the result set of the LCS command.
type LCSMatch struct {
	MatchString string
	Matches     []LCSMatchedPosition
	Len         int64
}

type LCSMatchedPosition struct {
	Key1 LCSPosition
	Key2 LCSPosition

	// only for withMatchLen is true
	MatchLen int64
}

type LCSPosition struct {
	Start int64
	End   int64
}

type LCSCmd struct {
	baseCmd

	// 1: match string
	// 2: match len
	// 3: match idx LCSMatch
	readType uint8
	val      *LCSMatch
}

func ( context.Context,  *LCSQuery) *LCSCmd {
	 := make([]interface{}, 3, 7)
	[0] = "lcs"
	[1] = .Key1
	[2] = .Key2

	 := &LCSCmd{readType: 1}
	if .Len {
		.readType = 2
		 = append(, "len")
	} else if .Idx {
		.readType = 3
		 = append(, "idx")
		if .MinMatchLen != 0 {
			 = append(, "minmatchlen", .MinMatchLen)
		}
		if .WithMatchLen {
			 = append(, "withmatchlen")
		}
	}
	.baseCmd = baseCmd{
		ctx:  ,
		args: ,
	}

	return 
}

func ( *LCSCmd) ( *LCSMatch) {
	.val = 
}

func ( *LCSCmd) () string {
	return cmdString(, .val)
}

func ( *LCSCmd) () *LCSMatch {
	return .val
}

func ( *LCSCmd) () (*LCSMatch, error) {
	return .val, .err
}

func ( *LCSCmd) ( *proto.Reader) ( error) {
	 := &LCSMatch{}
	switch .readType {
	case 1:
		// match string
		if .MatchString,  = .ReadString();  != nil {
			return 
		}
	case 2:
		// match len
		if .Len,  = .ReadInt();  != nil {
			return 
		}
	case 3:
		// read LCSMatch
		if  = .ReadFixedMapLen(2);  != nil {
			return 
		}

		// read matches or len field
		for  := 0;  < 2; ++ {
			,  := .ReadString()
			if  != nil {
				return 
			}

			switch  {
			case "matches":
				// read array of matched positions
				if .Matches,  = .readMatchedPositions();  != nil {
					return 
				}
			case "len":
				// read match length
				if .Len,  = .ReadInt();  != nil {
					return 
				}
			}
		}
	}

	.val = 
	return nil
}

func ( *LCSCmd) ( *proto.Reader) ([]LCSMatchedPosition, error) {
	,  := .ReadArrayLen()
	if  != nil {
		return nil, 
	}

	 := make([]LCSMatchedPosition, )
	for  := 0;  < ; ++ {
		,  := .ReadArrayLen()
		if  != nil {
			return nil, 
		}

		if [].Key1,  = .readPosition();  != nil {
			return nil, 
		}
		if [].Key2,  = .readPosition();  != nil {
			return nil, 
		}

		// read match length if WithMatchLen is true
		if  > 2 {
			if [].MatchLen,  = .ReadInt();  != nil {
				return nil, 
			}
		}
	}

	return , nil
}

func ( *LCSCmd) ( *proto.Reader) ( LCSPosition,  error) {
	if  = .ReadFixedArrayLen(2);  != nil {
		return , 
	}
	if .Start,  = .ReadInt();  != nil {
		return , 
	}
	if .End,  = .ReadInt();  != nil {
		return , 
	}

	return , nil
}

// ------------------------------------------------------------------------

type KeyFlags struct {
	Key   string
	Flags []string
}

type KeyFlagsCmd struct {
	baseCmd

	val []KeyFlags
}

var _ Cmder = (*KeyFlagsCmd)(nil)

func ( context.Context,  ...interface{}) *KeyFlagsCmd {
	return &KeyFlagsCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *KeyFlagsCmd) ( []KeyFlags) {
	.val = 
}

func ( *KeyFlagsCmd) () []KeyFlags {
	return .val
}

func ( *KeyFlagsCmd) () ([]KeyFlags, error) {
	return .val, .err
}

func ( *KeyFlagsCmd) () string {
	return cmdString(, .val)
}

func ( *KeyFlagsCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}

	if  == 0 {
		.val = make([]KeyFlags, 0)
		return nil
	}

	.val = make([]KeyFlags, )

	for  := 0;  < len(.val); ++ {

		if  = .ReadFixedArrayLen(2);  != nil {
			return 
		}

		if .val[].Key,  = .ReadString();  != nil {
			return 
		}
		,  := .ReadArrayLen()
		if  != nil {
			return 
		}
		.val[].Flags = make([]string, )

		for  := 0;  < ; ++ {
			if .val[].Flags[],  = .ReadString();  != nil {
				return 
			}
		}
	}

	return nil
}

// ---------------------------------------------------------------------------------------------------

type ClusterLink struct {
	Direction           string
	Node                string
	CreateTime          int64
	Events              string
	SendBufferAllocated int64
	SendBufferUsed      int64
}

type ClusterLinksCmd struct {
	baseCmd

	val []ClusterLink
}

var _ Cmder = (*ClusterLinksCmd)(nil)

func ( context.Context,  ...interface{}) *ClusterLinksCmd {
	return &ClusterLinksCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *ClusterLinksCmd) ( []ClusterLink) {
	.val = 
}

func ( *ClusterLinksCmd) () []ClusterLink {
	return .val
}

func ( *ClusterLinksCmd) () ([]ClusterLink, error) {
	return .Val(), .Err()
}

func ( *ClusterLinksCmd) () string {
	return cmdString(, .val)
}

func ( *ClusterLinksCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]ClusterLink, )

	for  := 0;  < len(.val); ++ {
		,  := .ReadMapLen()
		if  != nil {
			return 
		}

		for  := 0;  < ; ++ {
			,  := .ReadString()
			if  != nil {
				return 
			}

			switch  {
			case "direction":
				.val[].Direction,  = .ReadString()
			case "node":
				.val[].Node,  = .ReadString()
			case "create-time":
				.val[].CreateTime,  = .ReadInt()
			case "events":
				.val[].Events,  = .ReadString()
			case "send-buffer-allocated":
				.val[].SendBufferAllocated,  = .ReadInt()
			case "send-buffer-used":
				.val[].SendBufferUsed,  = .ReadInt()
			default:
				return fmt.Errorf("redis: unexpected key %q in CLUSTER LINKS reply", )
			}

			if  != nil {
				return 
			}
		}
	}

	return nil
}

// ------------------------------------------------------------------------------------------------------------------

type SlotRange struct {
	Start int64
	End   int64
}

type Node struct {
	ID                string
	Endpoint          string
	IP                string
	Hostname          string
	Port              int64
	TLSPort           int64
	Role              string
	ReplicationOffset int64
	Health            string
}

type ClusterShard struct {
	Slots []SlotRange
	Nodes []Node
}

type ClusterShardsCmd struct {
	baseCmd

	val []ClusterShard
}

var _ Cmder = (*ClusterShardsCmd)(nil)

func ( context.Context,  ...interface{}) *ClusterShardsCmd {
	return &ClusterShardsCmd{
		baseCmd: baseCmd{
			ctx:  ,
			args: ,
		},
	}
}

func ( *ClusterShardsCmd) ( []ClusterShard) {
	.val = 
}

func ( *ClusterShardsCmd) () []ClusterShard {
	return .val
}

func ( *ClusterShardsCmd) () ([]ClusterShard, error) {
	return .Val(), .Err()
}

func ( *ClusterShardsCmd) () string {
	return cmdString(, .val)
}

func ( *ClusterShardsCmd) ( *proto.Reader) error {
	,  := .ReadArrayLen()
	if  != nil {
		return 
	}
	.val = make([]ClusterShard, )

	for  := 0;  < ; ++ {
		,  := .ReadMapLen()
		if  != nil {
			return 
		}

		for  := 0;  < ; ++ {
			,  := .ReadString()
			if  != nil {
				return 
			}

			switch  {
			case "slots":
				,  := .ReadArrayLen()
				if  != nil {
					return 
				}
				for  := 0;  < ;  += 2 {
					,  := .ReadInt()
					if  != nil {
						return 
					}

					,  := .ReadInt()
					if  != nil {
						return 
					}

					.val[].Slots = append(.val[].Slots, SlotRange{Start: , End: })
				}
			case "nodes":
				,  := .ReadArrayLen()
				if  != nil {
					return 
				}
				.val[].Nodes = make([]Node, )
				for  := 0;  < ; ++ {
					,  := .ReadMapLen()
					if  != nil {
						return 
					}

					for  := 0;  < ; ++ {
						,  := .ReadString()
						if  != nil {
							return 
						}

						switch  {
						case "id":
							.val[].Nodes[].ID,  = .ReadString()
						case "endpoint":
							.val[].Nodes[].Endpoint,  = .ReadString()
						case "ip":
							.val[].Nodes[].IP,  = .ReadString()
						case "hostname":
							.val[].Nodes[].Hostname,  = .ReadString()
						case "port":
							.val[].Nodes[].Port,  = .ReadInt()
						case "tls-port":
							.val[].Nodes[].TLSPort,  = .ReadInt()
						case "role":
							.val[].Nodes[].Role,  = .ReadString()
						case "replication-offset":
							.val[].Nodes[].ReplicationOffset,  = .ReadInt()
						case "health":
							.val[].Nodes[].Health,  = .ReadString()
						default:
							return fmt.Errorf("redis: unexpected key %q in CLUSTER SHARDS node reply", )
						}

						if  != nil {
							return 
						}
					}
				}
			default:
				return fmt.Errorf("redis: unexpected key %q in CLUSTER SHARDS reply", )
			}
		}
	}

	return nil
}