```json
{
  "sym_variables": [
    ("x0", "hours worked by Dale"),
    ("x1", "hours worked by Hank"),
    ("x2", "hours worked by George"),
    ("x3", "hours worked by Bobby"),
    ("x4", "hours worked by Laura")
  ],
  "objective_function": "3.39*x0**2 + 4.91*x0*x1 + 6.53*x0*x2 + 7.29*x0*x3 + 8.13*x0*x4 + 7.6*x1**2 + 9.61*x1*x2 + 6.55*x1*x4 + 9.68*x2**2 + 4.11*x2*x3 + 9.08*x2*x4 + 9.4*x4**2 + 2.71*x0 + 7.89*x2 + 9.21*x3 + 5.64*x4",
  "constraints": [
    "x3 + x4 >= 18",
    "x0**2 + x2**2 >= 14",
    "x1 + x4 >= 23",
    "x1 + x3 >= 24",
    "x0 + x3 >= 18",
    "x0 + x1 + x2 + x3 + x4 >= 18",
    "12*x0**2 + 10*x1**2 >= 39",
    "12*x0 + 2*x2 >= 45",
    "12*x0 + 12*x3 >= 30",
    "12*x0**2 + 10*x1**2 + 2*x2**2 >= 37",
    "12*x0 + 10*x1 + 12*x3 >= 37",
    "10*x1 + 12*x3 + 7*x4 >= 37",
    "12*x0**2 + 10*x1**2 + 2*x2**2 >= 33",
    "12*x0 + 10*x1 + 12*x3 >= 33",
    "10*x1 + 12*x3 + 7*x4 >= 33",
    "12*x0 + 10*x1 + 2*x2 >= 41",
    "12*x0 + 10*x1 + 12*x3 >= 41",
    "10*x1 + 12*x3 + 7*x4 >= 41",
    "12*x0 + 10*x1 + 2*x2 + 12*x3 + 7*x4 >= 41",
    "4*x0 - 7*x2 >= 0",
    "-9*x2 + 8*x3 >= 0",
    "x3 + x4 <= 107",
    "x0**2 + x1**2 + x2**2 <= 135",
    "x0**2 + x1**2 + x4**2 <= 83",
    "x2 + x3 + x4 <= 52",
    "x0 + x3 + x4 <= 129",
    "x0 + x2 + x3 <= 120",
    "x1 + x2 + x4 <= 113",
    "x1 + x2 + x3 <= 129",
    "x0 + x2 + x4 <= 78",
    "x1 + x3 + x4 <= 94",
    "12*x0**2 + 10*x1**2 + 7*x4**2 <= 106",
    "12*x0 + 10*x1 + 2*x2 <= 189",
    "12*x0 + 2*x2 + 12*x3 <= 93",
    "10*x1**2 + 2*x2**2 + 12*x3**2 <= 148",
    "10*x1 + 12*x3 + 7*x4 <= 234",
    "12*x0**2 + 2*x2**2 + 7*x4**2 <= 202",
    "2*x2 + 12*x3 + 7*x4 <= 135"
  ]
}
```

```python
import gurobipy as gp
from gurobipy import GRB

# Create a new model
m = gp.Model("optimization_problem")

# Create variables
dale = m.addVar(vtype=GRB.INTEGER, name="dale")
hank = m.addVar(vtype=GRB.CONTINUOUS, name="hank")
george = m.addVar(vtype=GRB.INTEGER, name="george")
bobby = m.addVar(vtype=GRB.INTEGER, name="bobby")
laura = m.addVar(vtype=GRB.INTEGER, name="laura")


# Set objective function
m.setObjective(3.39*dale**2 + 4.91*dale*hank + 6.53*dale*george + 7.29*dale*bobby + 8.13*dale*laura + 7.6*hank**2 + 9.61*hank*george + 6.55*hank*laura + 9.68*george**2 + 4.11*george*bobby + 9.08*george*laura + 9.4*laura**2 + 2.71*dale + 7.89*george + 9.21*bobby + 5.64*laura, GRB.MINIMIZE)

# Add constraints
m.addConstr(bobby + laura >= 18)
m.addConstr(dale**2 + george**2 >= 14)
m.addConstr(hank + laura >= 23)
m.addConstr(hank + bobby >= 24)
m.addConstr(dale + bobby >= 18)
m.addConstr(dale + hank + george + bobby + laura >= 18)
m.addConstr(12*dale**2 + 10*hank**2 >= 39)
m.addConstr(12*dale + 2*george >= 45)
m.addConstr(12*dale + 12*bobby >= 30)
m.addConstr(12*dale**2 + 10*hank**2 + 2*george**2 >= 37)
m.addConstr(12*dale + 10*hank + 12*bobby >= 37)
m.addConstr(10*hank + 12*bobby + 7*laura >= 37)
m.addConstr(12*dale**2 + 10*hank**2 + 2*george**2 >= 33)
m.addConstr(12*dale + 10*hank + 12*bobby >= 33)
m.addConstr(10*hank + 12*bobby + 7*laura >= 33)
m.addConstr(12*dale + 10*hank + 2*george >= 41)
m.addConstr(12*dale + 10*hank + 12*bobby >= 41)
m.addConstr(10*hank + 12*bobby + 7*laura >= 41)
m.addConstr(12*dale + 10*hank + 2*george + 12*bobby + 7*laura >= 41)
m.addConstr(4*dale - 7*george >= 0)
m.addConstr(-9*george + 8*bobby >= 0)
m.addConstr(bobby + laura <= 107)
m.addConstr(dale**2 + hank**2 + george**2 <= 135)
m.addConstr(dale**2 + hank**2 + laura**2 <= 83)
m.addConstr(george + bobby + laura <= 52)
m.addConstr(dale + bobby + laura <= 129)
m.addConstr(dale + george + bobby <= 120)
m.addConstr(hank + george + laura <= 113)
m.addConstr(hank + george + bobby <= 129)
m.addConstr(dale + george + laura <= 78)
m.addConstr(hank + bobby + laura <= 94)
m.addConstr(12*dale**2 + 10*hank**2 + 7*laura**2 <= 106)
m.addConstr(12*dale + 10*hank + 2*george <= 189)
m.addConstr(12*dale + 2*george + 12*bobby <= 93)
m.addConstr(10*hank**2 + 2*george**2 + 12*bobby**2 <= 148)
m.addConstr(10*hank + 12*bobby + 7*laura <= 234)
m.addConstr(12*dale**2 + 2*george**2 + 7*laura**2 <= 202)
m.addConstr(2*george + 12*bobby + 7*laura <= 135)


# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print('Obj: %g' % m.objVal)
    for v in m.getVars():
        print('%s %g' % (v.varName, v.x))
elif m.status == GRB.INFEASIBLE:
    print('Model is infeasible')
else:
    print('Optimization ended with status %d' % m.status)

```