def save():
 userId = None
 
 nodes = request.get_json().get("nodes")
 input = request.get_json().get("input")
 output = request.get_json().get("out")
 problemId = request.get_json().get("problemId")
 solutionId = request.get_json().get("solutionId")

 if session.has_key("account.id"):
  userId = session["account.id"]

 solution = None
 problem = None

 if request.get_json().has_key("problemId"):
  problem = Problem.query.filter_by(id = problemId).first()
 else:
  for value in input:
   if not (value["active"] == 0 or value["active"] == 1):
    return jsonify(err = [{'type':'danger', 'out' : "illegal data"}])
  problem = Problem(
  nodes[0][0].get("state"),nodes[0][1].get("state"),nodes[0][2].get("state"),nodes[0][3].get("state"),
  nodes[1][0].get("state"),nodes[1][1].get("state"),nodes[1][2].get("state"),nodes[1][3].get("state"),
  nodes[2][0].get("state"),nodes[2][1].get("state"),nodes[2][2].get("state"),nodes[2][3].get("state"),
  int(input[0]["active"]),int(input[1]["active"]),int(input[2]["active"]),int(input[3]["active"]),
  int(output[0]["active"]),int(output[1]["active"]),int(output[2]["active"]),int(output[3]["active"]),userId)
  
  if not problem.isValid():
   return jsonify(err = [{'type':'danger', 'out' : "illegal data"}])
  db.session.add(problem)
  db.session.flush()

 s = Solution.query.filter(Solution.userId == userId, Solution.id == solutionId ).first()
 if(s == None or userId == None):
  solution = Solution( 
   nodes[0][0].get("text"),nodes[0][1].get("text"),nodes[0][2].get("text"),nodes[0][3].get("text"),
   nodes[1][0].get("text"),nodes[1][1].get("text"),nodes[1][2].get("text"),nodes[1][3].get("text"),
   nodes[2][0].get("text"),nodes[2][1].get("text"),nodes[2][2].get("text"),nodes[2][3].get("text"),problem.id,userId)
  db.session.add(solution)
 else:
  solution = s
  solution.__init__(
   nodes[0][0].get("text"),nodes[0][1].get("text"),nodes[0][2].get("text"),nodes[0][3].get("text"),
   nodes[1][0].get("text"),nodes[1][1].get("text"),nodes[1][2].get("text"),nodes[1][3].get("text"),
   nodes[2][0].get("text"),nodes[2][1].get("text"),nodes[2][2].get("text"),nodes[2][3].get("text"),problem.id,userId)

 if solution.isEmpty():
  return jsonify(err = [{'type':'danger', 'out' : "no solution submitted"}])

 db.session.commit()
 return jsonify(solutionId = solution.id)
def submit():
 if session.has_key("account.id") == False:
  return jsonify(result = False, err = [{'type':'danger', 'out' : "Please Login "}])

 if Problem.query.filter_by(identifier = request.get_json().get("identifier")).first() == None:
  result = Queue()
  t = Process(target=handler, args=(request.get_json().get("code"),result))
  t.start()
  t.join(2)
  if t.is_alive():
   process = psutil.Process(t.pid)
   process.kill()
   process.wait()
   return jsonify(result = False, err =[{'type':'danger', 'out' : "Process terminated"}] )

  if(result.get() == False):
   return jsonify(result = False, err = result.get())
  else:
   output = result.get()
   problem = Problem()
   problem.name = output["name"]
   problem.identifier = request.get_json().get("identifier")
   problem.description = request.get_json().get("description")
   problem.script = request.get_json().get("code")
   problem.descriptor = json.dumps(output["descriptor"])
   problem.userId = session["account.id"]
   for item in output["stream"]:
    if item["type"] == 0:
     problem.setEntry(item["index"],item["name"],item["data"])
    else:
     problem.setOutput(item["index"],item["name"],item["data"])
   
   index = 0
   for item in output["layout"]:
    problem.setRegister(index,item)
    index += 1

   db.session.add(problem)
   db.session.commit()
   return jsonify(result = True)