package log

import (
	
	

	
	
	
)

var _ zapcore.Core = (*lockedMultiCore)(nil)

type lockedMultiCore struct {
	mu    sync.RWMutex // guards mutations to cores slice
	cores []zapcore.Core
}

func ( *lockedMultiCore) ( []zapcore.Field) zapcore.Core {
	.mu.RLock()
	defer .mu.RUnlock()
	 := &lockedMultiCore{
		cores: make([]zapcore.Core, len(.cores)),
	}
	for  := range .cores {
		.cores[] = .cores[].With()
	}
	return 
}

func ( *lockedMultiCore) ( zapcore.Level) bool {
	.mu.RLock()
	defer .mu.RUnlock()
	for  := range .cores {
		if .cores[].Enabled() {
			return true
		}
	}
	return false
}

func ( *lockedMultiCore) ( zapcore.Entry,  *zapcore.CheckedEntry) *zapcore.CheckedEntry {
	.mu.RLock()
	defer .mu.RUnlock()
	for  := range .cores {
		 = .cores[].Check(, )
	}
	return 
}

func ( *lockedMultiCore) ( zapcore.Entry,  []zapcore.Field) error {
	.mu.RLock()
	defer .mu.RUnlock()
	var  error
	for  := range .cores {
		 = multierr.Append(, .cores[].Write(, ))
	}
	return 
}

func ( *lockedMultiCore) () error {
	.mu.RLock()
	defer .mu.RUnlock()
	var  error
	for  := range .cores {
		 = multierr.Append(, .cores[].Sync())
	}
	return 
}

func ( *lockedMultiCore) ( zapcore.Core) {
	.mu.Lock()
	defer .mu.Unlock()

	.cores = append(.cores, )
}

func ( *lockedMultiCore) ( zapcore.Core) {
	.mu.Lock()
	defer .mu.Unlock()

	 := 0
	for  := 0;  < len(.cores); ++ {
		if reflect.DeepEqual(.cores[], ) {
			continue
		}
		.cores[] = .cores[]
		++
	}
	.cores = .cores[:]
}

func ( *lockedMultiCore) (,  zapcore.Core) {
	.mu.Lock()
	defer .mu.Unlock()

	for  := 0;  < len(.cores); ++ {
		if reflect.DeepEqual(.cores[], ) {
			.cores[] = 
		}
	}
}

func newCore( LogFormat,  zapcore.WriteSyncer,  LogLevel) zapcore.Core {
	 := zap.NewProductionEncoderConfig()
	.EncodeTime = zapcore.ISO8601TimeEncoder

	var  zapcore.Encoder
	switch  {
	case PlaintextOutput:
		.EncodeLevel = zapcore.CapitalLevelEncoder
		 = zapcore.NewConsoleEncoder()
	case JSONOutput:
		 = zapcore.NewJSONEncoder()
	default:
		.EncodeLevel = zapcore.CapitalColorLevelEncoder
		 = zapcore.NewConsoleEncoder()
	}

	return zapcore.NewCore(, , zap.NewAtomicLevelAt(zapcore.Level()))
}