```json
{
  "sym_variables": [
    ("x0", "hours worked by Ringo"),
    ("x1", "hours worked by Hank"),
    ("x2", "hours worked by Bill"),
    ("x3", "hours worked by Jean"),
    ("x4", "hours worked by George"),
    ("x5", "hours worked by Peggy"),
    ("x6", "hours worked by John"),
    ("x7", "hours worked by Mary")
  ],
  "objective_function": "7*x0 + 4*x1 + 9*x2 + 5*x3 + 4*x4 + 3*x5 + 8*x6 + 6*x7",
  "constraints": [
    "8*x2 + 6*x3 >= 28",
    "14*x0 + 6*x3 >= 24",
    "14*x0 + 2*x7 >= 11",
    "8*x6 + 2*x7 >= 21",
    "18*x1 + 8*x2 >= 17",
    "6*x3 + 17*x4 >= 12",
    "14*x0 + 17*x4 >= 31",
    "17*x4 + 13*x5 >= 17",
    "8*x2 + 8*x6 >= 13",
    "14*x0 + 18*x1 + 8*x2 + 6*x3 + 17*x4 + 13*x5 + 8*x6 + 2*x7 >= 13",
    "-10*x3 + 3*x7 >= 0",
    "-2*x6 + 8*x7 >= 0",
    "-1*x2 + 1*x4 >= 0",
    "6*x3 + 17*x4 <= 122",
    "6*x3 + 8*x6 <= 55",
    "8*x2 + 8*x6 <= 72",
    "14*x0 + 6*x3 <= 191",
    "14*x0 + 2*x7 <= 103",
    "18*x1 + 2*x7 <= 153",
    "8*x2 + 13*x5 <= 84",
    "8*x2 + 13*x5 + 8*x6 <= 187",
    "18*x1 + 6*x3 + 2*x7 <= 95",
    "6*x3 + 8*x6 + 2*x7 <= 131",
    "14*x0 + 6*x3 + 13*x5 <= 201",
    "14*x0 + 6*x3 + 8*x6 <= 87",
    "17*x4 + 13*x5 + 8*x6 <= 88",
    "18*x1 + 8*x6 + 2*x7 <= 124",
    "14*x0 + 18*x1 + 17*x4 <= 108"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
ringo = m.addVar(vtype=gp.GRB.INTEGER, name="ringo")
hank = m.addVar(vtype=gp.GRB.INTEGER, name="hank")
bill = m.addVar(vtype=gp.GRB.INTEGER, name="bill")
jean = m.addVar(vtype=gp.GRB.INTEGER, name="jean")
george = m.addVar(vtype=gp.GRB.INTEGER, name="george")
peggy = m.addVar(vtype=gp.GRB.INTEGER, name="peggy")
john = m.addVar(vtype=gp.GRB.INTEGER, name="john")
mary = m.addVar(vtype=gp.GRB.INTEGER, name="mary")


# Set objective function
m.setObjective(7*ringo + 4*hank + 9*bill + 5*jean + 4*george + 3*peggy + 8*john + 6*mary, gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(8*bill + 6*jean >= 28)
m.addConstr(14*ringo + 6*jean >= 24)
m.addConstr(14*ringo + 2*mary >= 11)
m.addConstr(8*john + 2*mary >= 21)
m.addConstr(18*hank + 8*bill >= 17)
m.addConstr(6*jean + 17*george >= 12)
m.addConstr(14*ringo + 17*george >= 31)
m.addConstr(17*george + 13*peggy >= 17)
m.addConstr(8*bill + 8*john >= 13)
m.addConstr(14*ringo + 18*hank + 8*bill + 6*jean + 17*george + 13*peggy + 8*john + 2*mary >= 13)
m.addConstr(-10*jean + 3*mary >= 0)
m.addConstr(-2*john + 8*mary >= 0)
m.addConstr(-1*bill + 1*george >= 0)
m.addConstr(6*jean + 17*george <= 122)
m.addConstr(6*jean + 8*john <= 55)
m.addConstr(8*bill + 8*john <= 72)
m.addConstr(14*ringo + 6*jean <= 191)
m.addConstr(14*ringo + 2*mary <= 103)
m.addConstr(18*hank + 2*mary <= 153)
m.addConstr(8*bill + 13*peggy <= 84)
m.addConstr(8*bill + 13*peggy + 8*john <= 187)
m.addConstr(18*hank + 6*jean + 2*mary <= 95)
m.addConstr(6*jean + 8*john + 2*mary <= 131)
m.addConstr(14*ringo + 6*jean + 13*peggy <= 201)
m.addConstr(14*ringo + 6*jean + 8*john <= 87)
m.addConstr(17*george + 13*peggy + 8*john <= 88)
m.addConstr(18*hank + 8*john + 2*mary <= 124)
m.addConstr(14*ringo + 18*hank + 17*george <= 108)


# Optimize model
m.optimize()

# Print solution
if m.status == gp.GRB.OPTIMAL:
    print('Obj: %g' % m.objVal)
    for v in m.getVars():
        print('%s %g' % (v.varName, v.x))
elif m.status == gp.GRB.INFEASIBLE:
    print('The problem is infeasible.')
else:
    print('The problem is unbounded or something else happened.')

```