<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def url_for_s3(endpoint, bucket_name, bucket_domain=None, scheme='', url_style='host', cdn_domain=None, filename=None):
 """ Generates an S3 URL to the given endpoint, using the given bucket config. Example: url_for_s3('static', bucket_name='my-cool-foobar-bucket', scheme='https', filename='pics/logo.png') Will return: https://my-cool-foobar-bucket.s3.amazonaws.com/static/pics/logo.png Note: this function assumes that the given resource exists on S3 and is publicly accessible. Based loosely on Flask-S3's url_for(). """


    if not bucket_name:
        raise ValueError('Bucket name is required when calling url_for_s3().')

    if url_style == 'host':
        url_format = '%(bucket_name)s.%(bucket_domain)s'
    elif url_style == 'path':
        url_format = '%(bucket_domain)s/%(bucket_name)s'
    else:
        raise ValueError('Invalid S3 URL style: "%s"'
                         % url_style)

    if bucket_domain == None:
        bucket_domain = u's3.amazonaws.com'

    bucket_path = url_format % {
        'bucket_name': bucket_name,
        'bucket_domain': bucket_domain,
    }

    if cdn_domain:
        bucket_path = '%s' % cdn_domain

    # The return statement below is equivalent to:
    #
    # urls = app.url_map.bind(bucket_path, url_scheme=scheme)
    # return urls.build(endpoint, values=values, force_external=True)
    #
    # (assuming that this function receives a **values parameter
    # instead of filename).
    #
    # But we do it manually instead, so we can avoid dependency on
    # flask.current_app and werkzeug.routing.MapAdapter.

    return str('%s//%s/%s%s' % (
        scheme + (':' if scheme else ''),
        bucket_path,
        endpoint + ('/' if endpoint else ''),
        filename.lstrip('/')
    ))