add validate
optimize