{
  "title": "Blockshot Spec v0.1",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "specVersion": {
      "type": "string",
      "const": "0.1"
    },
    "meta": {
      "default": {
        "title": "Untitled"
      },
      "type": "object",
      "properties": {
        "title": {
          "default": "Untitled",
          "type": "string"
        },
        "description": {
          "type": "string"
        }
      }
    },
    "settings": {
      "default": {
        "fps": 24,
        "duration": 6,
        "resolution": [
          1920,
          1080
        ],
        "seed": 1
      },
      "type": "object",
      "properties": {
        "fps": {
          "default": 24,
          "type": "integer",
          "minimum": 1,
          "maximum": 120
        },
        "duration": {
          "default": 6,
          "type": "number",
          "exclusiveMinimum": 0
        },
        "resolution": {
          "default": [
            1920,
            1080
          ],
          "type": "array",
          "prefixItems": [
            {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "integer",
              "exclusiveMinimum": 0,
              "maximum": 9007199254740991
            }
          ],
          "items": false,
          "minItems": 2,
          "maxItems": 2
        },
        "seed": {
          "default": 1,
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        }
      }
    },
    "space": {
      "default": {
        "type": "ground",
        "size": 40
      },
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "ground"
            },
            "size": {
              "default": 40,
              "type": "number",
              "exclusiveMinimum": 0
            }
          },
          "required": [
            "type"
          ]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "room"
            },
            "width": {
              "type": "number",
              "exclusiveMinimum": 0
            },
            "depth": {
              "type": "number",
              "exclusiveMinimum": 0
            },
            "height": {
              "default": 2.8,
              "type": "number",
              "exclusiveMinimum": 0
            },
            "openings": {
              "default": [],
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "kind": {
                    "type": "string",
                    "enum": [
                      "door",
                      "window"
                    ]
                  },
                  "wall": {
                    "type": "string",
                    "enum": [
                      "north",
                      "south",
                      "east",
                      "west"
                    ]
                  },
                  "offset": {
                    "default": 0,
                    "type": "number"
                  },
                  "width": {
                    "default": 0.9,
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "height": {
                    "default": 2.1,
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  "sill": {
                    "default": 0,
                    "type": "number",
                    "minimum": 0
                  }
                },
                "required": [
                  "kind",
                  "wall"
                ]
              }
            }
          },
          "required": [
            "type",
            "width",
            "depth"
          ]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "street"
            },
            "length": {
              "default": 40,
              "type": "number",
              "exclusiveMinimum": 0
            },
            "roadWidth": {
              "default": 7,
              "type": "number",
              "exclusiveMinimum": 0
            },
            "sidewalkWidth": {
              "default": 2.5,
              "type": "number",
              "exclusiveMinimum": 0
            }
          },
          "required": [
            "type"
          ]
        }
      ]
    },
    "actors": {
      "default": [],
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "name": {
            "type": "string"
          },
          "color": {
            "default": "#c8ccd4",
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$"
          },
          "height": {
            "default": 1.72,
            "type": "number",
            "minimum": 0.5,
            "maximum": 2.5
          },
          "build": {
            "default": "average",
            "type": "string",
            "enum": [
              "slim",
              "average",
              "heavy"
            ]
          },
          "position": {
            "default": [
              0,
              0,
              0
            ],
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 3,
            "maxItems": 3
          },
          "rotation": {
            "default": [
              0,
              0,
              0
            ],
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 3,
            "maxItems": 3
          },
          "pose": {
            "default": "stand",
            "type": "string",
            "enum": [
              "stand",
              "idle",
              "walk",
              "run",
              "sit",
              "point",
              "talk",
              "crouch",
              "climb"
            ]
          },
          "aim": {
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 3,
            "maxItems": 3
          }
        },
        "required": [
          "id"
        ]
      }
    },
    "props": {
      "default": [],
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "type": {
            "type": "string",
            "enum": [
              "box",
              "cylinder",
              "sphere",
              "plane",
              "chair",
              "table",
              "sofa",
              "bed",
              "door",
              "window",
              "car",
              "lamp",
              "cup",
              "phone",
              "mirror",
              "platform",
              "ramp",
              "stairs",
              "model"
            ]
          },
          "asset": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "position": {
            "default": [
              0,
              0,
              0
            ],
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 3,
            "maxItems": 3
          },
          "rotation": {
            "default": [
              0,
              0,
              0
            ],
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 3,
            "maxItems": 3
          },
          "scale": {
            "default": [
              1,
              1,
              1
            ],
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 3,
            "maxItems": 3
          },
          "color": {
            "default": "#9aa3b2",
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$"
          },
          "aim": {
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 3,
            "maxItems": 3
          }
        },
        "required": [
          "id",
          "type"
        ]
      }
    },
    "cameras": {
      "default": [],
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "name": {
            "type": "string"
          },
          "position": {
            "default": [
              0,
              1.6,
              5
            ],
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 3,
            "maxItems": 3
          },
          "lookAt": {
            "anyOf": [
              {
                "type": "array",
                "prefixItems": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  }
                ],
                "items": false,
                "minItems": 3,
                "maxItems": 3
              },
              {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-z_]+)?(@[a-zA-Z][a-zA-Z0-9_-]*)?$"
              }
            ]
          },
          "rotation": {
            "default": [
              0,
              0,
              0
            ],
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 3,
            "maxItems": 3
          },
          "focalLength": {
            "default": 35,
            "type": "number",
            "minimum": 4,
            "maximum": 600
          },
          "sensor": {
            "default": "super35",
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "super35",
                  "fullframe"
                ]
              },
              {
                "type": "array",
                "prefixItems": [
                  {
                    "type": "number",
                    "exclusiveMinimum": 0
                  },
                  {
                    "type": "number",
                    "exclusiveMinimum": 0
                  }
                ],
                "items": false,
                "minItems": 2,
                "maxItems": 2
              }
            ]
          }
        },
        "required": [
          "id"
        ]
      }
    },
    "actions": {
      "default": [],
      "type": "array",
      "items": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "walkTo"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "to": {
                "anyOf": [
                  {
                    "type": "array",
                    "prefixItems": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      }
                    ],
                    "items": false,
                    "minItems": 3,
                    "maxItems": 3
                  },
                  {
                    "minItems": 1,
                    "type": "array",
                    "items": {
                      "type": "array",
                      "prefixItems": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "number"
                        },
                        {
                          "type": "number"
                        }
                      ],
                      "items": false,
                      "minItems": 3,
                      "maxItems": 3
                    }
                  }
                ]
              },
              "duration": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "speed": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "direct": {
                "type": "boolean"
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "to",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "runTo"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "to": {
                "anyOf": [
                  {
                    "type": "array",
                    "prefixItems": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      }
                    ],
                    "items": false,
                    "minItems": 3,
                    "maxItems": 3
                  },
                  {
                    "minItems": 1,
                    "type": "array",
                    "items": {
                      "type": "array",
                      "prefixItems": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "number"
                        },
                        {
                          "type": "number"
                        }
                      ],
                      "items": false,
                      "minItems": 3,
                      "maxItems": 3
                    }
                  }
                ]
              },
              "duration": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "speed": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "direct": {
                "type": "boolean"
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "to",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "turnTo"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "target": {
                "anyOf": [
                  {
                    "anyOf": [
                      {
                        "type": "array",
                        "prefixItems": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "number"
                          },
                          {
                            "type": "number"
                          }
                        ],
                        "items": false,
                        "minItems": 3,
                        "maxItems": 3
                      },
                      {
                        "type": "string",
                        "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-z_]+)?(@[a-zA-Z][a-zA-Z0-9_-]*)?$"
                      }
                    ]
                  },
                  {
                    "type": "number"
                  }
                ]
              },
              "duration": {
                "default": 0.6,
                "type": "number",
                "exclusiveMinimum": 0
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "target",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "pose"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "pose": {
                "type": "string",
                "enum": [
                  "stand",
                  "idle",
                  "walk",
                  "run",
                  "sit",
                  "point",
                  "talk",
                  "crouch",
                  "climb"
                ]
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "pose",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "gesture"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "gesture": {
                "type": "string",
                "enum": [
                  "wave",
                  "nod",
                  "shakeHead",
                  "shrug",
                  "clap",
                  "crossArms",
                  "handsOnHips",
                  "think",
                  "bow",
                  "lookAround",
                  "cheer"
                ]
              },
              "side": {
                "type": "string",
                "enum": [
                  "left",
                  "right"
                ]
              },
              "duration": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "intensity": {
                "default": 1,
                "type": "number",
                "minimum": 0,
                "maximum": 1
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "gesture",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "handShape"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "shape": {
                "type": "string",
                "enum": [
                  "open",
                  "relaxed",
                  "fist",
                  "point",
                  "pinch",
                  "grip"
                ]
              },
              "hand": {
                "default": "both",
                "type": "string",
                "enum": [
                  "left",
                  "right",
                  "both"
                ]
              },
              "duration": {
                "default": 2,
                "type": "number",
                "exclusiveMinimum": 0
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "shape",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "drive"
              },
              "prop": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "to": {
                "anyOf": [
                  {
                    "type": "array",
                    "prefixItems": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      }
                    ],
                    "items": false,
                    "minItems": 3,
                    "maxItems": 3
                  },
                  {
                    "minItems": 1,
                    "type": "array",
                    "items": {
                      "type": "array",
                      "prefixItems": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "number"
                        },
                        {
                          "type": "number"
                        }
                      ],
                      "items": false,
                      "minItems": 3,
                      "maxItems": 3
                    }
                  }
                ]
              },
              "follow": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "gap": {
                "default": 10,
                "type": "number",
                "minimum": 0
              },
              "offset": {
                "default": [
                  0,
                  0,
                  0
                ],
                "type": "array",
                "prefixItems": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  }
                ],
                "items": false,
                "minItems": 3,
                "maxItems": 3
              },
              "speed": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "duration": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "ease": {
                "default": "linear",
                "type": "string",
                "enum": [
                  "linear",
                  "easeIn",
                  "easeOut",
                  "easeInOut",
                  "step"
                ]
              },
              "radius": {
                "default": 6,
                "type": "number",
                "exclusiveMinimum": 0
              },
              "drift": {
                "default": 0,
                "type": "number",
                "minimum": 0,
                "maximum": 1
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "prop",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "mount"
              },
              "camera": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "to": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "offset": {
                "default": [
                  0,
                  1.6,
                  -6
                ],
                "type": "array",
                "prefixItems": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  }
                ],
                "items": false,
                "minItems": 3,
                "maxItems": 3
              },
              "look": {
                "default": [
                  0,
                  1,
                  0
                ],
                "type": "array",
                "prefixItems": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  }
                ],
                "items": false,
                "minItems": 3,
                "maxItems": 3
              },
              "end": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "camera",
              "to",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "hold"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "prop": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "hand": {
                "default": "right",
                "type": "string",
                "enum": [
                  "left",
                  "right"
                ]
              },
              "at": {
                "default": "carry",
                "type": "string",
                "enum": [
                  "ear",
                  "mouth",
                  "chest",
                  "carry"
                ]
              },
              "duration": {
                "default": 4,
                "type": "number",
                "exclusiveMinimum": 0
              },
              "then": {
                "default": "keep",
                "type": "string",
                "enum": [
                  "keep",
                  "put"
                ]
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "prop",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "reach"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "target": {
                "anyOf": [
                  {
                    "type": "array",
                    "prefixItems": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      }
                    ],
                    "items": false,
                    "minItems": 3,
                    "maxItems": 3
                  },
                  {
                    "type": "string",
                    "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-z_]+)?(@[a-zA-Z][a-zA-Z0-9_-]*)?$"
                  }
                ]
              },
              "hand": {
                "default": "right",
                "type": "string",
                "enum": [
                  "left",
                  "right"
                ]
              },
              "duration": {
                "default": 1.5,
                "type": "number",
                "exclusiveMinimum": 0
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "target",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "contact"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "part": {
                "type": "string",
                "enum": [
                  "hand_l",
                  "hand_r",
                  "foot_l",
                  "foot_r"
                ]
              },
              "on": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "thigh_l",
                      "thigh_r",
                      "knee_l",
                      "knee_r"
                    ]
                  },
                  {
                    "type": "string",
                    "const": "floor"
                  },
                  {
                    "anyOf": [
                      {
                        "type": "array",
                        "prefixItems": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "number"
                          },
                          {
                            "type": "number"
                          }
                        ],
                        "items": false,
                        "minItems": 3,
                        "maxItems": 3
                      },
                      {
                        "type": "string",
                        "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-z_]+)?(@[a-zA-Z][a-zA-Z0-9_-]*)?$"
                      }
                    ]
                  }
                ]
              },
              "end": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "blend": {
                "default": 0.3,
                "type": "number",
                "minimum": 0,
                "maximum": 2
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "part",
              "on",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "sitDown"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "on": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "duration": {
                "default": 1,
                "type": "number",
                "exclusiveMinimum": 0
              },
              "offset": {
                "default": 0,
                "type": "number"
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "on",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "standUp"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "duration": {
                "default": 0.8,
                "type": "number",
                "exclusiveMinimum": 0
              },
              "to": {
                "type": "array",
                "prefixItems": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  }
                ],
                "items": false,
                "minItems": 3,
                "maxItems": 3
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "lookAt"
              },
              "actor": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "target": {
                "anyOf": [
                  {
                    "type": "array",
                    "prefixItems": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      }
                    ],
                    "items": false,
                    "minItems": 3,
                    "maxItems": 3
                  },
                  {
                    "type": "string",
                    "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-z_]+)?(@[a-zA-Z][a-zA-Z0-9_-]*)?$"
                  }
                ]
              },
              "end": {
                "type": "number"
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "actor",
              "target",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "cameraMove"
              },
              "camera": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "to": {
                "type": "array",
                "prefixItems": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  }
                ],
                "items": false,
                "minItems": 3,
                "maxItems": 3
              },
              "duration": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "ease": {
                "default": "easeInOut",
                "type": "string",
                "enum": [
                  "linear",
                  "easeIn",
                  "easeOut",
                  "easeInOut",
                  "step"
                ]
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "camera",
              "to",
              "duration",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "cameraLookAt"
              },
              "camera": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "target": {
                "anyOf": [
                  {
                    "anyOf": [
                      {
                        "type": "array",
                        "prefixItems": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "number"
                          },
                          {
                            "type": "number"
                          }
                        ],
                        "items": false,
                        "minItems": 3,
                        "maxItems": 3
                      },
                      {
                        "type": "string",
                        "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-z_]+)?(@[a-zA-Z][a-zA-Z0-9_-]*)?$"
                      }
                    ]
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "transition": {
                "type": "string",
                "enum": [
                  "cut",
                  "pan",
                  "whip"
                ]
              },
              "duration": {
                "type": "number",
                "minimum": 0,
                "maximum": 30
              },
              "ease": {
                "type": "string",
                "enum": [
                  "linear",
                  "easeIn",
                  "easeOut",
                  "easeInOut",
                  "step"
                ]
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "camera",
              "target",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "zoom"
              },
              "camera": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "focalLength": {
                "type": "number",
                "minimum": 4,
                "maximum": 600
              },
              "duration": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "ease": {
                "default": "easeInOut",
                "type": "string",
                "enum": [
                  "linear",
                  "easeIn",
                  "easeOut",
                  "easeInOut",
                  "step"
                ]
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "camera",
              "focalLength",
              "duration",
              "start"
            ]
          },
          {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "const": "orbit"
              },
              "camera": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              },
              "around": {
                "anyOf": [
                  {
                    "type": "array",
                    "prefixItems": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      }
                    ],
                    "items": false,
                    "minItems": 3,
                    "maxItems": 3
                  },
                  {
                    "type": "string",
                    "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*(\\.[a-z_]+)?(@[a-zA-Z][a-zA-Z0-9_-]*)?$"
                  }
                ]
              },
              "degrees": {
                "type": "number"
              },
              "duration": {
                "type": "number",
                "exclusiveMinimum": 0
              },
              "ease": {
                "default": "easeInOut",
                "type": "string",
                "enum": [
                  "linear",
                  "easeIn",
                  "easeOut",
                  "easeInOut",
                  "step"
                ]
              },
              "start": {
                "type": "number",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
              }
            },
            "required": [
              "type",
              "camera",
              "around",
              "degrees",
              "duration",
              "start"
            ]
          }
        ]
      }
    },
    "tracks": {
      "default": [],
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "target": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "property": {
            "type": "string",
            "enum": [
              "position",
              "rotation",
              "focalLength",
              "lookAt",
              "pose",
              "hips",
              "bone:hips",
              "bone:spine",
              "bone:chest",
              "bone:neck",
              "bone:head",
              "bone:leftShoulder",
              "bone:leftUpperArm",
              "bone:leftLowerArm",
              "bone:leftHand",
              "bone:rightShoulder",
              "bone:rightUpperArm",
              "bone:rightLowerArm",
              "bone:rightHand",
              "bone:leftUpperLeg",
              "bone:leftLowerLeg",
              "bone:leftFoot",
              "bone:rightUpperLeg",
              "bone:rightLowerLeg",
              "bone:rightFoot",
              "bone:leftToes",
              "bone:rightToes",
              "bone:leftThumbProximal",
              "bone:leftThumbIntermediate",
              "bone:leftThumbDistal",
              "bone:leftIndexProximal",
              "bone:leftIndexIntermediate",
              "bone:leftIndexDistal",
              "bone:leftMiddleProximal",
              "bone:leftMiddleIntermediate",
              "bone:leftMiddleDistal",
              "bone:leftRingProximal",
              "bone:leftRingIntermediate",
              "bone:leftRingDistal",
              "bone:leftLittleProximal",
              "bone:leftLittleIntermediate",
              "bone:leftLittleDistal",
              "bone:rightThumbProximal",
              "bone:rightThumbIntermediate",
              "bone:rightThumbDistal",
              "bone:rightIndexProximal",
              "bone:rightIndexIntermediate",
              "bone:rightIndexDistal",
              "bone:rightMiddleProximal",
              "bone:rightMiddleIntermediate",
              "bone:rightMiddleDistal",
              "bone:rightRingProximal",
              "bone:rightRingIntermediate",
              "bone:rightRingDistal",
              "bone:rightLittleProximal",
              "bone:rightLittleIntermediate",
              "bone:rightLittleDistal"
            ]
          },
          "keys": {
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "t": {
                  "type": "number",
                  "minimum": 0
                },
                "value": {
                  "anyOf": [
                    {
                      "type": "array",
                      "prefixItems": [
                        {
                          "type": "number"
                        },
                        {
                          "type": "number"
                        },
                        {
                          "type": "number"
                        }
                      ],
                      "items": false,
                      "minItems": 3,
                      "maxItems": 3
                    },
                    {
                      "type": "number"
                    },
                    {
                      "type": "string",
                      "enum": [
                        "stand",
                        "idle",
                        "walk",
                        "run",
                        "sit",
                        "point",
                        "talk",
                        "crouch",
                        "climb"
                      ]
                    }
                  ]
                },
                "ease": {
                  "default": "linear",
                  "type": "string",
                  "enum": [
                    "linear",
                    "easeIn",
                    "easeOut",
                    "easeInOut",
                    "step"
                  ]
                }
              },
              "required": [
                "t",
                "value"
              ]
            }
          },
          "baked": {
            "type": "boolean"
          }
        },
        "required": [
          "target",
          "property",
          "keys"
        ]
      }
    },
    "shots": {
      "default": [],
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "name": {
            "type": "string"
          },
          "camera": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "start": {
            "type": "number",
            "minimum": 0
          },
          "end": {
            "type": "number",
            "exclusiveMinimum": 0
          },
          "description": {
            "type": "string"
          },
          "prompt": {
            "type": "string"
          },
          "crossAxis": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "camera",
          "start",
          "end"
        ]
      }
    },
    "bin": {
      "default": [],
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "name": {
            "type": "string"
          },
          "camera": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "start": {
            "type": "number",
            "minimum": 0
          },
          "end": {
            "type": "number",
            "exclusiveMinimum": 0
          },
          "description": {
            "type": "string"
          },
          "prompt": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "camera",
          "start",
          "end"
        ]
      }
    },
    "takes": {
      "default": [],
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "name": {
            "type": "string"
          },
          "target": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "kind": {
            "type": "string",
            "enum": [
              "actor",
              "camera"
            ]
          },
          "start": {
            "default": 0,
            "type": "number",
            "minimum": 0
          },
          "duration": {
            "type": "number",
            "exclusiveMinimum": 0
          },
          "samples": {
            "minItems": 2,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "t": {
                  "type": "number",
                  "minimum": 0
                },
                "p": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "items": false,
                  "minItems": 3,
                  "maxItems": 3
                },
                "r": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "items": false,
                  "minItems": 3,
                  "maxItems": 3
                },
                "g": {
                  "type": "string",
                  "enum": [
                    "stand",
                    "walk",
                    "run"
                  ]
                },
                "f": {
                  "type": "number",
                  "exclusiveMinimum": 0
                }
              },
              "required": [
                "t",
                "p",
                "r"
              ]
            }
          }
        },
        "required": [
          "id",
          "target",
          "kind",
          "duration",
          "samples"
        ]
      }
    },
    "assets": {
      "default": [],
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
          },
          "name": {
            "type": "string"
          },
          "kind": {
            "default": "glb",
            "type": "string",
            "const": "glb"
          },
          "size": {
            "type": "array",
            "prefixItems": [
              {
                "type": "number"
              },
              {
                "type": "number"
              },
              {
                "type": "number"
              }
            ],
            "items": false,
            "minItems": 3,
            "maxItems": 3
          },
          "bytes": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "id",
          "name",
          "size"
        ]
      }
    }
  },
  "required": [
    "specVersion"
  ]
}
