.

def start_responder(host='127.0.0.1', port=8080, event_log=None, loop=None):
    """."""

    loop = loop or asyncio.get_event_loop()
    event_log = event_log or structlog.get_logger()

    # Prepare a web application.
    app = web.Application(loop=loop, middlewares=[
        inject_request_id,
        access_log_middleware,
    ])
    app.on_response_prepare.append(echo_request_id)
    app.router.add_route('GET', '/', index)
    app.router.add_route('POST', '/create-process',
                         create_process, name='create-process')
    app.router.add_route('GET', '/process-status/{slug}',
                         process_status, name='process-status')
    app.router.add_route('POST', '/delete-process/{slug}',
                         delete_process, name='delete-process')
    app.router.add_route('GET', '/attach-console/{slug}',
                         attach_console, name='attach-console')
    app.router.add_route('GET', '/list-processes',
                         list_processes, name='list-processes')

    # Create storage folders.
    archives_path = os.path.join(
        '.', '.smartmob', 'archives',
    )
    if not os.path.isdir(archives_path):
        os.makedirs(archives_path)
    sources_path = os.path.join(
        '.', '.smartmob', 'sources',
    )
    if not os.path.isdir(sources_path):
        os.makedirs(sources_path)
    envs_path = os.path.join(
        '.', '.smartmob', 'envs',
    )
    if not os.path.isdir(envs_path):
        os.makedirs(envs_path)

    event_log.info('bind', transport='tcp', host=host, port=port)

    # Start accepting connections.
    handler = app.make_handler()
    server = yield from loop.create_server(handler, host, port)
    return app, handler, server