{
  // this is breaking with proper json but.. gson accepts comments and they are invaluable
  // in the parameters block you can add custom values, which can be used in expressions
  "parameters": {
    "smallRadius": 5.0,
    "repetitionCount": 10,
    "width": 640.0,
    "height": 480.0,
    // you can have expressions inside parameters too, they are evaluated once, on load
    "resolvedOnLoad" : "width * 2.0"
  },
  // in the prototypes you can set up key prototypes
  "prototypes": {
    "red": {
      "r": 1.0,
      "g": 0.0,
      "b": 0.0
    },
    "blue": {
      "r": 0.0,
      "g": 0.0,
      "b": 1.0
    },
    "center": {
      // prototypes can have expressions too, they are evaluated as late as possible
      // thus, they are evaluated more than once
      "x": "width / 2",
      "y": "height / 2"
    },
    "small": {
      "radius": "smallRadius"
    },
    "large": {
      "radius": "smallRadius * 10.0"
    }
  },
  "keys": [
    {
      "time": 0.0,
      "easing": "cubic-in-out",
      "x": 3.0,
      "y": 4.0,
      "z": 9.0,
      "r": 0.0,
      "g": 1.0,
      "b": 0.0,
      "radius": 50,
      "foo" : 0.0
    },
    {
      "time": 2.0,
      "easing": "cubic-in-out",
      // here we apply the prototypes in cascading fashion from left to right
      "prototypes": "red center small"
    },
    {
      "time": 3.0,
      "repeat": {
        "count": "repetitionCount",
        "keys": [
          {
            "time": "(rep * 2.0) + 3.0",
            "prototypes": "blue large",
            "easing": "cubic-in-out"
          },
          {
            "time": "t + 1.0",
            "prototypes": "red small"
          }
        ]
      }
    }
  ]
}