```json
{
  "sym_variables": [
    ("x0", "fruit salads"),
    ("x1", "potatoes")
  ],
  "objective_function": "8.83*x0**2 + 6.48*x0*x1 + 3.67*x0 + 6.4*x1",
  "constraints": [
    "12*x0 + 8*x1 >= 25",
    "8*x0**2 + 15*x1**2 >= 52",
    "1*x0**2 - 10*x1**2 >= 0",
    "12*x0**2 + 8*x1**2 <= 63",
    "12*x0 + 8*x1 <= 63",
    "8*x0 + 15*x1 <= 141"
  ]
}
```

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

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

    # Create variables
    fruit_salads = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="fruit_salads")
    potatoes = m.addVar(lb=0, vtype=GRB.INTEGER, name="potatoes")


    # Set objective function
    m.setObjective(8.83*fruit_salads**2 + 6.48*fruit_salads*potatoes + 3.67*fruit_salads + 6.4*potatoes, GRB.MAXIMIZE)

    # Add constraints
    m.addConstr(12*fruit_salads + 8*potatoes >= 25, "fat_lower_bound")
    m.addConstr(8*fruit_salads**2 + 15*potatoes**2 >= 52, "iron_lower_bound")
    m.addConstr(1*fruit_salads**2 - 10*potatoes**2 >= 0, "fruit_salad_potato_relation")
    m.addConstr(12*fruit_salads**2 + 8*potatoes**2 <= 63, "fat_squared_upper_bound")
    m.addConstr(12*fruit_salads + 8*potatoes <= 63, "fat_upper_bound")
    m.addConstr(8*fruit_salads + 15*potatoes <= 141, "iron_upper_bound")


    # Optimize model
    m.optimize()

    # Print results
    if m.status == GRB.OPTIMAL:
        print('Obj: %g' % m.objVal)
        print('fruit_salads:', fruit_salads.x)
        print('potatoes:', potatoes.x)
    elif m.status == GRB.INFEASIBLE:
        print('Optimization problem is infeasible.')
    else:
        print('Optimization ended with status %d' % m.status)


except gp.GurobiError as e:
    print('Error code ' + str(e.errno) + ': ' + str(e))

except AttributeError:
    print('Encountered an attribute error')
```