system: You are an expert security code reviewer. You will be shown a source code file along with a multi-select question listing several CWE (Common Weakness Enumeration) categories. Your task is to identify which of the listed CWEs are present in the code.

OUTPUT FORMAT: Respond with the letter(s) of all correct options, sorted alphabetically and comma-separated, wrapped in a single \boxed{...}. Examples: `\boxed{A}` for one correct, `\boxed{A,C}` for two, `\boxed{A,C,E}` for three. Output the boxed answer ONLY -- no explanation, no other text.

user: ```python
import http
import logging
import os

import mpld3
from flask import Flask, request, jsonify, send_file
from indel_prediction.predictor.predict import plot_predictions as main

app = Flask(__name__)

model_path = "indel_prediction/predictor/model_output_10000_0.01000000_0.01000000_-0.607_theta.txt_cf0.txt"


@app.route('/ping', methods=['GET'])
def ping():
    return "The server is alive!", http.HTTPStatus.OK


@app.route('/api/profile', methods=['GET'])
def get_profile():
    """
    This endpoint returns a profile as a text file. It is created and saved automatically if the plot
    has been built before (via the `plot` endpoint) for a sequence and PAM index pair.
    If the plot has not been built, there is no profile file saved, so an error is raised.

    request body: {"seq": "SEQUENCE", "pam_idx": "NUMBER"}
    :return: {"plot": "plot data"}
    :return: {"error": "error message"}
    """
    data = request.args or request.get_json()
    seq = data.get("seq", "")
    pam_idx = data.get("pam_idx", "")
    if not (seq and pam_idx):
        return jsonify({'error': 'Target sequence or pam index not provided'}), http.HTTPStatus.BAD_REQUEST
    filename = '{0}_{1}.txt'.format(seq, pam_idx)
    if os.path.exists(filename):
        return send_file(filename, as_attachment=True)
    else:
        return jsonify({'error': 'Profile with those target sequence and pam index not found'}), http.HTTPStatus.BAD_REQUEST


@app.route('/plot', methods=['POST'])
def plot():
    """
    This endpoint returns a javascript code that is rendered in a browser as a profile plot
    for a particular pair of sequence and PAM index.

    request body: {"seq": "SEQUENCE", "pam_idx": "NUMBER"}
    :return: {"plot": "plot data"}
    :return: {"error": "error message"}
    """
    data = request.form or request.get_json()
    seq = data.get("seq", "")
    pam_idx = int(data.get("pam_idx", ""))
    if not (seq and pam_idx):
        return jsonify({'message': 'Empty request'}), http.HTTPStatus.BAD_REQUEST
    try:
        graph_html = mpld3.fig_to_html(main(model_path, seq, pam_idx),
                                       template_type="simple",
                                       figid="plot",
                                       no_extras=True)
    except Exception as e:
        logging.exception("Model error")
        return jsonify({"error": str(e)}), http.HTTPStatus.INTERNAL_SERVER_ERROR

    return jsonify({"plot": graph_html})


if __name__ == "__main__":
    app.run(port=5001)

```

Which of the following CWE vulnerability categories are present in this code? Multiple options may be correct.

  A) CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
  B) CWE-209: Generation of Error Message Containing Sensitive Information
  C) CWE-1333: Inefficient Regular Expression Complexity
  D) CWE-327: Use of a Broken or Risky Cryptographic Algorithm
  E) CWE-117: Improper Output Neutralization for Logs
  F) CWE-116: Improper Encoding or Escaping of Output
Answer: A,B