```json
{
  "sym_variables": [
    ("x0", "hours worked by George"),
    ("x1", "hours worked by Mary"),
    ("x2", "hours worked by Dale"),
    ("x3", "hours worked by Paul"),
    ("x4", "hours worked by Hank")
  ],
  "objective_function": "6*x0 + 8*x1 + 2*x2 + 3*x3 + 1*x4",
  "constraints": [
    "1.27*x0 + 2.96*x4 >= 101",
    "1.27*x0 + 2.38*x1 + 3.96*x3 >= 63",
    "2.96*x2 + 3.96*x3 + 2.96*x4 >= 63",
    "1.27*x0 + 2.38*x1 + 3.96*x3 >= 56",
    "2.96*x2 + 3.96*x3 + 2.96*x4 >= 56",
    "1.07*x0 + 2.59*x1 >= 32",
    "2.59*x1 + 3.74*x2 >= 56",
    "2.59*x1 + 1.4*x3 >= 27",
    "1.07*x0 + 3.23*x4 >= 30",
    "2.59*x1 + 3.23*x4 >= 71",
    "3.74*x2 + 1.4*x3 >= 30",
    "1.4*x3 + 3.23*x4 >= 64",
    "1.27*x0 + 2.96*x4 <= 202",
    "1.27*x0 + 2.38*x1 <= 275",
    "1.27*x0 + 2.38*x1 + 2.96*x2 + 3.96*x3 + 2.96*x4 <= 275",
    "1.07*x0 + 2.59*x1 <= 227",
    "1.07*x0 + 3.23*x4 <= 254",
    "2.59*x1 + 1.4*x3 <= 151",
    "3.74*x2 + 1.4*x3 <= 348",
    "1.07*x0 + 2.59*x1 + 3.74*x2 <= 210",
    "1.07*x0 + 1.4*x3 + 3.23*x4 <= 328",
    "1.07*x0 + 2.59*x1 + 3.74*x2 + 1.4*x3 + 3.23*x4 <= 328",
    "x0 >= 0",
    "x1 >= 0",
    "x2 >= 0",
    "x3 >= 0",
    "x4 >= 0"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
george = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="George")
mary = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="Mary")
dale = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="Dale")
paul = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="Paul")
hank = m.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="Hank")


# Set objective function
m.setObjective(6 * george + 8 * mary + 2 * dale + 3 * paul + 1 * hank, gp.GRB.MAXIMIZE)

# Add constraints
m.addConstr(1.27 * george + 2.96 * hank >= 101)
m.addConstr(1.27 * george + 2.38 * mary + 3.96 * paul >= 63)
m.addConstr(2.96 * dale + 3.96 * paul + 2.96 * hank >= 63)
m.addConstr(1.27 * george + 2.38 * mary + 3.96 * paul >= 56)
m.addConstr(2.96 * dale + 3.96 * paul + 2.96 * hank >= 56)
m.addConstr(1.07 * george + 2.59 * mary >= 32)
m.addConstr(2.59 * mary + 3.74 * dale >= 56)
m.addConstr(2.59 * mary + 1.4 * paul >= 27)
m.addConstr(1.07 * george + 3.23 * hank >= 30)
m.addConstr(2.59 * mary + 3.23 * hank >= 71)
m.addConstr(3.74 * dale + 1.4 * paul >= 30)
m.addConstr(1.4 * paul + 3.23 * hank >= 64)
m.addConstr(1.27 * george + 2.96 * hank <= 202)
m.addConstr(1.27 * george + 2.38 * mary <= 275)
m.addConstr(1.27 * george + 2.38 * mary + 2.96 * dale + 3.96 * paul + 2.96 * hank <= 275)
m.addConstr(1.07 * george + 2.59 * mary <= 227)
m.addConstr(1.07 * george + 3.23 * hank <= 254)
m.addConstr(2.59 * mary + 1.4 * paul <= 151)
m.addConstr(3.74 * dale + 1.4 * paul <= 348)
m.addConstr(1.07 * george + 2.59 * mary + 3.74 * dale <= 210)
m.addConstr(1.07 * george + 1.4 * paul + 3.23 * hank <= 328)
m.addConstr(1.07 * george + 2.59 * mary + 3.74 * dale + 1.4 * paul + 3.23 * hank <= 328)


# Optimize model
m.optimize()

# Print results
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 model is infeasible.")
else:
    print("Optimization ended with status %d" % m.status)

```