{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:bgi:schema:project:1",
  "title": "bgi project v1, current manual and automatic subset",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema_version",
    "project",
    "box",
    "material",
    "assemblies",
    "layout"
  ],
  "properties": {
    "reference_data": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "inventory",
        "bindings",
        "note"
      ],
      "properties": {
        "inventory": {
          "$ref": "#/$defs/reference_inventory"
        },
        "note": {
          "type": "string",
          "pattern": "\\S"
        },
        "bindings": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "target"
            ],
            "properties": {
              "target": {
                "type": "string",
                "minLength": 1
              },
              "fact": {
                "type": "string",
                "minLength": 1
              },
              "item": {
                "type": "string",
                "minLength": 1
              }
            },
            "oneOf": [
              {
                "required": [
                  "fact"
                ],
                "not": {
                  "required": [
                    "item"
                  ]
                }
              },
              {
                "required": [
                  "item"
                ],
                "not": {
                  "required": [
                    "fact"
                  ]
                }
              }
            ]
          }
        },
        "top_reserve": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "fact",
            "inventory"
          ],
          "properties": {
            "fact": {
              "$ref": "#/$defs/id"
            },
            "rotation_deg": {
              "enum": [
                0,
                90
              ]
            },
            "inventory": {
              "type": "array",
              "minItems": 1,
              "items": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "id",
                  "count"
                ],
                "properties": {
                  "id": {
                    "$ref": "#/$defs/id"
                  },
                  "count": {
                    "$ref": "#/$defs/positiveInteger"
                  }
                }
              }
            }
          }
        }
      }
    },
    "schema_version": {
      "const": 1
    },
    "readme": {
      "type": "string",
      "minLength": 1,
      "maxLength": 4096,
      "pattern": "\\S"
    },
    "preview": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "face_color": {
          "type": "string",
          "pattern": "^#[0-9a-fA-F]{6}$"
        },
        "edge_color": {
          "type": "string",
          "pattern": "^#[0-9a-fA-F]{6}$"
        },
        "face_texture": {
          "type": "string",
          "pattern": "\\.(png|jpg|jpeg)$"
        },
        "edge_texture": {
          "type": "string",
          "pattern": "\\.(png|jpg|jpeg)$"
        }
      }
    },
    "project": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "name"
      ],
      "properties": {
        "id": {
          "$ref": "#/$defs/id"
        },
        "name": {
          "type": "string",
          "minLength": 1
        }
      }
    },
    "box": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "inner_mm"
      ],
      "properties": {
        "inner_mm": {
          "$ref": "#/$defs/size3"
        },
        "side_clearance_mm": {
          "$ref": "#/$defs/size4Nonnegative"
        },
        "top_reserve_mm": {
          "$ref": "#/$defs/nonnegativeLength"
        }
      }
    },
    "material": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "profile"
      ],
      "properties": {
        "profile": {
          "$ref": "#/$defs/id"
        },
        "overrides": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "thickness_mm": {
              "$ref": "#/$defs/nullableLength"
            },
            "kerf_mm": {
              "$ref": "#/$defs/nullableLength"
            },
            "fit_clearance_mm": {
              "$ref": "#/$defs/nullableLength"
            },
            "min_web_mm": {
              "$ref": "#/$defs/nullableLength"
            },
            "min_tab_mm": {
              "$ref": "#/$defs/nullableLength"
            },
            "joint_edge_margin_mm": {
              "$ref": "#/$defs/nullableLength"
            },
            "compensation": {
              "enum": [
                "bgi",
                "external",
                null
              ]
            }
          }
        }
      }
    },
    "components": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/component"
      }
    },
    "groups": {
      "type": "array",
      "maxItems": 64,
      "items": {
        "$ref": "#/$defs/storageGroup"
      }
    },
    "containers": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/container"
      }
    },
    "assemblies": {
      "type": "array",
      "maxItems": 16,
      "items": {
        "$ref": "#/$defs/assembly"
      }
    },
    "layout": {
      "oneOf": [
        {
          "$ref": "#/$defs/manualLayout"
        },
        {
          "$ref": "#/$defs/autoLayout"
        }
      ]
    },
    "manufacturing": {
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": false,
          "maxProperties": 0
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "sheets",
            "sheet_margin_mm",
            "cut_gap_mm",
            "rotations_deg"
          ],
          "properties": {
            "sheets": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/$defs/sheet"
              }
            },
            "sheet_margin_mm": {
              "$ref": "#/$defs/nonnegativeLength"
            },
            "cut_gap_mm": {
              "$ref": "#/$defs/nonnegativeLength"
            },
            "rotations_deg": {
              "$ref": "#/$defs/rotations"
            }
          }
        }
      ]
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "layout": {
            "properties": {
              "mode": {
                "const": "manual"
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "assemblies": {
            "items": {
              "properties": {
                "interior": {
                  "$ref": "#/$defs/manualInterior"
                }
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "layout": {
            "properties": {
              "mode": {
                "const": "auto"
              }
            }
          }
        }
      },
      "then": {
        "required": [
          "components"
        ],
        "properties": {
          "components": {
            "minItems": 1
          },
          "containers": {
            "maxItems": 4
          },
          "assemblies": {
            "minItems": 1,
            "maxItems": 16,
            "prefixItems": [
              {
                "required": [
                  "members"
                ],
                "not": {
                  "required": [
                    "search"
                  ]
                },
                "properties": {
                  "interior": {
                    "properties": {
                      "kind": {
                        "const": "auto"
                      }
                    }
                  }
                }
              }
            ],
            "items": {
              "required": [
                "members"
              ],
              "properties": {
                "interior": {
                  "oneOf": [
                    {
                      "$ref": "#/$defs/manualInterior"
                    },
                    {
                      "$ref": "#/$defs/interior/oneOf/2"
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "layout": {
            "properties": {
              "construction_mode": {
                "const": "full_box"
              }
            }
          }
        }
      },
      "then": {
        "properties": {
          "containers": {
            "maxItems": 0
          },
          "assemblies": {
            "maxItems": 1
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "layout": {
            "not": {
              "required": [
                "construction_mode"
              ]
            }
          }
        }
      },
      "then": {
        "properties": {
          "containers": {
            "maxItems": 0
          }
        }
      }
    }
  ],
  "$defs": {
    "reference_inventory": {
      "title": "Board Game Inserts research inventory v1/v2",
      "type": "object",
      "additionalProperties": false,
      "required": [
        "schema_version",
        "id",
        "title",
        "publisher",
        "language",
        "edition",
        "product_code",
        "printing",
        "rights_note",
        "sources",
        "items",
        "missing_measurements"
      ],
      "properties": {
        "schema_version": {
          "enum": [
            1,
            2
          ]
        },
        "id": {
          "$ref": "#/$defs/reference_inventory/$defs/id"
        },
        "title": {
          "$ref": "#/$defs/reference_inventory/$defs/text"
        },
        "publisher": {
          "$ref": "#/$defs/reference_inventory/$defs/text"
        },
        "language": {
          "$ref": "#/$defs/reference_inventory/$defs/text"
        },
        "edition": {
          "$ref": "#/$defs/reference_inventory/$defs/text"
        },
        "product_code": {
          "$ref": "#/$defs/reference_inventory/$defs/text"
        },
        "printing": {
          "$ref": "#/$defs/reference_inventory/$defs/text"
        },
        "rights_note": {
          "$ref": "#/$defs/reference_inventory/$defs/text"
        },
        "sources": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/reference_inventory/$defs/source"
          }
        },
        "items": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/reference_inventory/$defs/item"
          }
        },
        "missing_measurements": {
          "type": "array",
          "uniqueItems": true,
          "items": {
            "$ref": "#/$defs/reference_inventory/$defs/field"
          }
        },
        "facts": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/reference_inventory/$defs/fact"
          }
        },
        "selections": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/reference_inventory/$defs/selection"
          }
        }
      },
      "if": {
        "properties": {
          "schema_version": {
            "const": 1
          }
        }
      },
      "then": {
        "not": {
          "anyOf": [
            {
              "required": [
                "facts"
              ]
            },
            {
              "required": [
                "selections"
              ]
            }
          ]
        },
        "properties": {
          "sources": {
            "items": {
              "required": [
                "url"
              ],
              "not": {
                "required": [
                  "path"
                ]
              }
            }
          },
          "items": {
            "items": {
              "properties": {
                "basis": {
                  "enum": [
                    "publisher_list",
                    "inferred_from_publisher"
                  ]
                }
              }
            }
          }
        }
      },
      "else": {
        "required": [
          "facts",
          "selections"
        ]
      },
      "$defs": {
        "text": {
          "type": "string",
          "minLength": 1
        },
        "id": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$",
          "maxLength": 80
        },
        "field": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*)+$"
        },
        "date": {
          "type": "string",
          "format": "date",
          "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
        },
        "decimal": {
          "oneOf": [
            {
              "type": "number",
              "exclusiveMinimum": 0,
              "exclusiveMaximum": 1000000000
            },
            {
              "type": "string",
              "pattern": "^(0|[1-9][0-9]{0,8})(\\.[0-9]{1,6})?$",
              "not": {
                "pattern": "^0(\\.0+)?$"
              }
            }
          ]
        },
        "uncertainty": {
          "oneOf": [
            {
              "type": "number",
              "minimum": 0,
              "exclusiveMaximum": 1000000000
            },
            {
              "type": "string",
              "pattern": "^(0|[1-9][0-9]{0,8})(\\.[0-9]{1,6})?$"
            }
          ]
        },
        "source": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "locator",
            "accessed_on"
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/reference_inventory/$defs/id"
            },
            "url": {
              "type": "string",
              "pattern": "^https://[^\\s/?#]+[^\\s]*$"
            },
            "path": {
              "type": "string",
              "minLength": 1,
              "pattern": "^[^/\\\\:\\u0000-\\u001f\\u007f]+(?:/[^/\\\\:\\u0000-\\u001f\\u007f]+)*$",
              "not": {
                "pattern": "(^|/)\\.{1,2}(/|$)"
              }
            },
            "kind": {
              "enum": [
                "publisher_rulebook",
                "publisher_product_page",
                "vendor_product_page",
                "community_catalog",
                "own_measurement"
              ]
            },
            "locator": {
              "$ref": "#/$defs/reference_inventory/$defs/text"
            },
            "accessed_on": {
              "$ref": "#/$defs/reference_inventory/$defs/date"
            }
          },
          "oneOf": [
            {
              "required": [
                "url"
              ],
              "not": {
                "required": [
                  "path"
                ]
              }
            },
            {
              "required": [
                "path"
              ],
              "not": {
                "required": [
                  "url"
                ]
              },
              "properties": {
                "kind": {
                  "const": "own_measurement"
                }
              }
            }
          ]
        },
        "item": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "label",
            "kind",
            "count",
            "source",
            "basis"
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/reference_inventory/$defs/id"
            },
            "label": {
              "$ref": "#/$defs/reference_inventory/$defs/text"
            },
            "kind": {
              "enum": [
                "board",
                "booklet",
                "sheet",
                "card",
                "token",
                "stand",
                "die",
                "tile",
                "marker",
                "mixed",
                "aid"
              ]
            },
            "count": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            },
            "source": {
              "$ref": "#/$defs/reference_inventory/$defs/id"
            },
            "basis": {
              "enum": [
                "publisher_list",
                "inferred_from_publisher",
                "measured_count",
                "community_list",
                "inferred_from_source"
              ]
            },
            "note": {
              "$ref": "#/$defs/reference_inventory/$defs/text"
            }
          },
          "if": {
            "properties": {
              "basis": {
                "enum": [
                  "inferred_from_publisher",
                  "inferred_from_source"
                ]
              }
            }
          },
          "then": {
            "required": [
              "note"
            ]
          }
        },
        "fact": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "field",
            "kind",
            "value",
            "unit",
            "evidence",
            "verification",
            "edition",
            "printing"
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/reference_inventory/$defs/id"
            },
            "field": {
              "$ref": "#/$defs/reference_inventory/$defs/field"
            },
            "kind": {
              "enum": [
                "box_outer",
                "box_inner",
                "component_outer",
                "sleeve_outer",
                "stack_height",
                "container_outer",
                "compartment_inner",
                "bulk_volume"
              ]
            },
            "value": {
              "oneOf": [
                {
                  "type": "null"
                },
                {
                  "$ref": "#/$defs/reference_inventory/$defs/decimal"
                },
                {
                  "type": "array",
                  "minItems": 2,
                  "maxItems": 3,
                  "items": {
                    "$ref": "#/$defs/reference_inventory/$defs/decimal"
                  }
                }
              ]
            },
            "unit": {
              "enum": [
                "mm",
                "cm",
                "inch",
                "mm3",
                "cm3"
              ]
            },
            "source": {
              "$ref": "#/$defs/reference_inventory/$defs/id"
            },
            "evidence": {
              "enum": [
                "research",
                "measured",
                "estimated",
                "unknown"
              ]
            },
            "verification": {
              "enum": [
                "unverified",
                "confirmed"
              ]
            },
            "edition": {
              "$ref": "#/$defs/reference_inventory/$defs/text"
            },
            "printing": {
              "$ref": "#/$defs/reference_inventory/$defs/text"
            },
            "uncertainty": {
              "$ref": "#/$defs/reference_inventory/$defs/uncertainty"
            },
            "measured_on": {
              "$ref": "#/$defs/reference_inventory/$defs/date"
            },
            "specimen": {
              "$ref": "#/$defs/reference_inventory/$defs/text"
            },
            "note": {
              "$ref": "#/$defs/reference_inventory/$defs/text"
            }
          },
          "allOf": [
            {
              "if": {
                "properties": {
                  "kind": {
                    "const": "bulk_volume"
                  }
                }
              },
              "then": {
                "properties": {
                  "unit": {
                    "enum": [
                      "mm3",
                      "cm3"
                    ]
                  }
                }
              },
              "else": {
                "properties": {
                  "unit": {
                    "enum": [
                      "mm",
                      "cm",
                      "inch"
                    ]
                  }
                }
              }
            },
            {
              "if": {
                "properties": {
                  "evidence": {
                    "const": "unknown"
                  }
                }
              },
              "then": {
                "required": [
                  "note"
                ],
                "properties": {
                  "value": {
                    "type": "null"
                  },
                  "verification": {
                    "const": "unverified"
                  }
                }
              },
              "else": {
                "required": [
                  "source"
                ],
                "properties": {
                  "value": {
                    "not": {
                      "type": "null"
                    }
                  }
                }
              }
            },
            {
              "if": {
                "properties": {
                  "evidence": {
                    "const": "estimated"
                  }
                }
              },
              "then": {
                "required": [
                  "note"
                ]
              }
            },
            {
              "if": {
                "properties": {
                  "evidence": {
                    "const": "measured"
                  }
                }
              },
              "then": {
                "required": [
                  "uncertainty",
                  "measured_on",
                  "specimen"
                ]
              },
              "else": {
                "not": {
                  "anyOf": [
                    {
                      "required": [
                        "uncertainty"
                      ]
                    },
                    {
                      "required": [
                        "measured_on"
                      ]
                    },
                    {
                      "required": [
                        "specimen"
                      ]
                    }
                  ]
                }
              }
            },
            {
              "if": {
                "properties": {
                  "evidence": {
                    "not": {
                      "const": "unknown"
                    }
                  }
                }
              },
              "then": {
                "allOf": [
                  {
                    "if": {
                      "properties": {
                        "kind": {
                          "enum": [
                            "stack_height",
                            "bulk_volume"
                          ]
                        }
                      }
                    },
                    "then": {
                      "properties": {
                        "value": {
                          "$ref": "#/$defs/reference_inventory/$defs/decimal"
                        }
                      }
                    },
                    "else": {
                      "properties": {
                        "value": {
                          "type": "array"
                        }
                      }
                    }
                  },
                  {
                    "if": {
                      "properties": {
                        "kind": {
                          "enum": [
                            "box_outer",
                            "box_inner",
                            "container_outer",
                            "compartment_inner"
                          ]
                        }
                      }
                    },
                    "then": {
                      "properties": {
                        "value": {
                          "minItems": 3,
                          "maxItems": 3
                        }
                      }
                    }
                  }
                ]
              }
            }
          ]
        },
        "selection": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "field",
            "fact",
            "reason"
          ],
          "properties": {
            "field": {
              "$ref": "#/$defs/reference_inventory/$defs/field"
            },
            "fact": {
              "$ref": "#/$defs/reference_inventory/$defs/id"
            },
            "reason": {
              "type": "string",
              "pattern": "\\S"
            }
          }
        }
      }
    },
    "id": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$",
      "maxLength": 80
    },
    "length": {
      "type": "number",
      "exclusiveMinimum": 0,
      "maximum": 2000,
      "multipleOf": 0.001
    },
    "nonnegativeLength": {
      "type": "number",
      "minimum": 0,
      "maximum": 2000,
      "multipleOf": 0.001
    },
    "nullableLength": {
      "oneOf": [
        {
          "$ref": "#/$defs/nonnegativeLength"
        },
        {
          "type": "null"
        }
      ]
    },
    "size2": {
      "type": "array",
      "prefixItems": [
        {
          "$ref": "#/$defs/length"
        },
        {
          "$ref": "#/$defs/length"
        }
      ],
      "items": false,
      "minItems": 2
    },
    "size3": {
      "type": "array",
      "prefixItems": [
        {
          "$ref": "#/$defs/length"
        },
        {
          "$ref": "#/$defs/length"
        },
        {
          "$ref": "#/$defs/length"
        }
      ],
      "items": false,
      "minItems": 3
    },
    "derivedClear": {
      "oneOf": [
        {
          "$ref": "#/$defs/length"
        },
        {
          "const": "*"
        }
      ]
    },
    "manualSize3": {
      "type": "array",
      "prefixItems": [
        {
          "$ref": "#/$defs/derivedClear"
        },
        {
          "$ref": "#/$defs/derivedClear"
        },
        {
          "$ref": "#/$defs/derivedClear"
        }
      ],
      "items": false,
      "minItems": 3
    },
    "size4": {
      "type": "array",
      "prefixItems": [
        {
          "$ref": "#/$defs/length"
        },
        {
          "$ref": "#/$defs/length"
        },
        {
          "$ref": "#/$defs/length"
        },
        {
          "$ref": "#/$defs/length"
        }
      ],
      "items": false,
      "minItems": 4
    },
    "size3Nonnegative": {
      "type": "array",
      "prefixItems": [
        {
          "$ref": "#/$defs/nonnegativeLength"
        },
        {
          "$ref": "#/$defs/nonnegativeLength"
        },
        {
          "$ref": "#/$defs/nonnegativeLength"
        }
      ],
      "items": false,
      "minItems": 3
    },
    "size4Nonnegative": {
      "type": "array",
      "prefixItems": [
        {
          "$ref": "#/$defs/nonnegativeLength"
        },
        {
          "$ref": "#/$defs/nonnegativeLength"
        },
        {
          "$ref": "#/$defs/nonnegativeLength"
        },
        {
          "$ref": "#/$defs/nonnegativeLength"
        }
      ],
      "items": false,
      "minItems": 4
    },
    "point": {
      "type": "array",
      "prefixItems": [
        {
          "$ref": "#/$defs/nonnegativeLength"
        },
        {
          "$ref": "#/$defs/nonnegativeLength"
        }
      ],
      "items": false,
      "minItems": 2
    },
    "rotations": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "items": {
        "enum": [
          0,
          90
        ]
      }
    },
    "positiveInteger": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100000
    },
    "instances": {
      "type": "array",
      "minItems": 1,
      "maxItems": 64,
      "uniqueItems": true,
      "items": {
        "$ref": "#/$defs/id"
      }
    },
    "storageGroup": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "members"
      ],
      "properties": {
        "id": {
          "$ref": "#/$defs/id"
        },
        "layout": {
          "enum": [
            "row",
            "positioned",
            "stack",
            "bulk"
          ]
        },
        "axis": {
          "enum": [
            "x",
            "y"
          ]
        },
        "gap_mm": {
          "$ref": "#/$defs/nonnegativeLength"
        },
        "members": {
          "type": "array",
          "minItems": 2,
          "maxItems": 20,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "requirement"
            ],
            "properties": {
              "requirement": {
                "$ref": "#/$defs/id"
              },
              "orientation": {
                "$ref": "#/$defs/id"
              },
              "origin_mm": {
                "$ref": "#/$defs/point"
              }
            }
          }
        },
        "measured_bulk_volume_cm3": {
          "type": "number",
          "exclusiveMinimum": 0
        },
        "footprints_mm": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/size2"
          }
        },
        "allowed_heights_mm": {
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/$defs/length"
          }
        },
        "allowance_total_mm": {
          "$ref": "#/$defs/size3Nonnegative"
        }
      },
      "oneOf": [
        {
          "required": [
            "axis",
            "gap_mm"
          ],
          "properties": {
            "layout": {
              "const": "row"
            },
            "members": {
              "items": {
                "not": {
                  "required": [
                    "origin_mm"
                  ]
                },
                "required": [
                  "orientation"
                ]
              }
            }
          },
          "allOf": [
            {
              "not": {
                "required": [
                  "measured_bulk_volume_cm3"
                ]
              }
            },
            {
              "not": {
                "required": [
                  "footprints_mm"
                ]
              }
            },
            {
              "not": {
                "required": [
                  "allowed_heights_mm"
                ]
              }
            },
            {
              "not": {
                "required": [
                  "allowance_total_mm"
                ]
              }
            }
          ]
        },
        {
          "required": [
            "layout",
            "gap_mm"
          ],
          "not": {
            "required": [
              "axis"
            ]
          },
          "properties": {
            "layout": {
              "const": "positioned"
            },
            "members": {
              "items": {
                "required": [
                  "origin_mm",
                  "orientation"
                ]
              }
            }
          },
          "allOf": [
            {
              "not": {
                "required": [
                  "measured_bulk_volume_cm3"
                ]
              }
            },
            {
              "not": {
                "required": [
                  "footprints_mm"
                ]
              }
            },
            {
              "not": {
                "required": [
                  "allowed_heights_mm"
                ]
              }
            },
            {
              "not": {
                "required": [
                  "allowance_total_mm"
                ]
              }
            }
          ]
        },
        {
          "required": [
            "layout",
            "gap_mm"
          ],
          "not": {
            "required": [
              "axis"
            ]
          },
          "properties": {
            "layout": {
              "const": "stack"
            },
            "gap_mm": {
              "const": 0
            },
            "members": {
              "items": {
                "not": {
                  "required": [
                    "origin_mm"
                  ]
                },
                "required": [
                  "orientation"
                ]
              }
            }
          },
          "allOf": [
            {
              "not": {
                "required": [
                  "measured_bulk_volume_cm3"
                ]
              }
            },
            {
              "not": {
                "required": [
                  "footprints_mm"
                ]
              }
            },
            {
              "not": {
                "required": [
                  "allowed_heights_mm"
                ]
              }
            },
            {
              "not": {
                "required": [
                  "allowance_total_mm"
                ]
              }
            }
          ]
        },
        {
          "required": [
            "layout",
            "measured_bulk_volume_cm3",
            "footprints_mm",
            "allowed_heights_mm",
            "allowance_total_mm"
          ],
          "allOf": [
            {
              "not": {
                "required": [
                  "axis"
                ]
              }
            },
            {
              "not": {
                "required": [
                  "gap_mm"
                ]
              }
            }
          ],
          "properties": {
            "layout": {
              "const": "bulk"
            },
            "members": {
              "items": {
                "allOf": [
                  {
                    "not": {
                      "required": [
                        "orientation"
                      ]
                    }
                  },
                  {
                    "not": {
                      "required": [
                        "origin_mm"
                      ]
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    },
    "interior": {
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "clear_mm"
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/id"
            },
            "kind": {
              "const": "compartment"
            },
            "clear_mm": {
              "$ref": "#/$defs/manualSize3"
            },
            "contents": {
              "type": "array",
              "uniqueItems": true,
              "items": {
                "$ref": "#/$defs/id"
              }
            },
            "access_cutout": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "wall",
                "diameter_mm"
              ],
              "properties": {
                "wall": {
                  "enum": [
                    "front",
                    "back",
                    "left",
                    "right"
                  ]
                },
                "diameter_mm": {
                  "$ref": "#/$defs/length"
                }
              }
            }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "axis",
            "clear_mm",
            "first",
            "second"
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/id"
            },
            "kind": {
              "const": "split"
            },
            "axis": {
              "enum": [
                "x",
                "y"
              ]
            },
            "clear_mm": {
              "$ref": "#/$defs/manualSize3"
            },
            "first": {
              "$ref": "#/$defs/interior"
            },
            "second": {
              "$ref": "#/$defs/interior"
            }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind"
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/id"
            },
            "kind": {
              "const": "auto"
            }
          }
        }
      ]
    },
    "interiorTemplate": {
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "clear_mm"
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/id"
            },
            "kind": {
              "const": "compartment"
            },
            "clear_mm": {
              "$ref": "#/$defs/manualSize3"
            },
            "contents": {
              "type": "array",
              "uniqueItems": true,
              "items": {
                "$ref": "#/$defs/id"
              }
            },
            "access_cutout": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "wall",
                "diameter_mm"
              ],
              "properties": {
                "wall": {
                  "enum": [
                    "front",
                    "back",
                    "left",
                    "right"
                  ]
                },
                "diameter_mm": {
                  "$ref": "#/$defs/length"
                }
              }
            }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "axis",
            "clear_mm",
            "first",
            "second"
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/id"
            },
            "kind": {
              "const": "split"
            },
            "axis": {
              "enum": [
                "x",
                "y"
              ]
            },
            "clear_mm": {
              "$ref": "#/$defs/manualSize3"
            },
            "first": {
              "$ref": "#/$defs/interiorTemplate"
            },
            "second": {
              "$ref": "#/$defs/interiorTemplate"
            }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "clear_mm",
            "requirements"
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/id"
            },
            "kind": {
              "const": "auto"
            },
            "clear_mm": {
              "$ref": "#/$defs/size3"
            },
            "requirements": {
              "type": "array",
              "minItems": 1,
              "maxItems": 20,
              "uniqueItems": true,
              "items": {
                "$ref": "#/$defs/id"
              }
            },
            "search": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "fixed_order": {
                  "$ref": "#/$defs/autoLayout/properties/search/properties/fixed_order"
                },
                "fixed_slots": {
                  "$ref": "#/$defs/autoLayout/properties/search/properties/fixed_slots"
                },
                "allowed_shapes": {
                  "$ref": "#/$defs/autoLayout/properties/search/properties/allowed_shapes"
                }
              }
            }
          }
        }
      ]
    },
    "manualInterior": {
      "allOf": [
        {
          "$ref": "#/$defs/interior"
        },
        {
          "properties": {
            "kind": {
              "enum": [
                "compartment",
                "split"
              ]
            },
            "first": {
              "$ref": "#/$defs/manualInterior"
            },
            "second": {
              "$ref": "#/$defs/manualInterior"
            }
          }
        }
      ]
    },
    "assembly": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "kind",
        "construction",
        "assembly",
        "interior"
      ],
      "properties": {
        "id": {
          "$ref": "#/$defs/id"
        },
        "kind": {
          "enum": [
            "grid",
            "tray"
          ]
        },
        "construction": {
          "const": "open_grid_box"
        },
        "assembly": {
          "const": "glue_allowed"
        },
        "members": {
          "type": "array",
          "uniqueItems": true,
          "items": {
            "$ref": "#/$defs/id"
          }
        },
        "side_clearance_mm": {
          "$ref": "#/$defs/size4"
        },
        "interior": {
          "$ref": "#/$defs/interior"
        },
        "search": {
          "$ref": "#/$defs/gridSearch"
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "interior": {
                "properties": {
                  "kind": {
                    "enum": [
                      "compartment",
                      "split"
                    ]
                  }
                }
              }
            }
          },
          "then": {
            "not": {
              "required": [
                "search"
              ]
            }
          }
        },
        {
          "if": {
            "properties": {
              "kind": {
                "const": "tray"
              }
            }
          },
          "then": {
            "required": [
              "side_clearance_mm"
            ]
          },
          "else": {
            "not": {
              "required": [
                "side_clearance_mm"
              ]
            }
          }
        }
      ]
    },
    "gridSearch": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "optional_groups": {
          "$ref": "#/$defs/autoLayout/properties/search/properties/optional_groups"
        },
        "interior_template": {
          "$ref": "#/$defs/interiorTemplate"
        },
        "fixed_subtrees": {
          "$ref": "#/$defs/autoLayout/properties/search/properties/fixed_subtrees"
        },
        "fixed_order": {
          "$ref": "#/$defs/autoLayout/properties/search/properties/fixed_order"
        },
        "fixed_slots": {
          "$ref": "#/$defs/autoLayout/properties/search/properties/fixed_slots"
        },
        "allowed_shapes": {
          "$ref": "#/$defs/autoLayout/properties/search/properties/allowed_shapes"
        }
      }
    },
    "container": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "outer_mm",
        "side_clearance_mm",
        "top_clearance_mm"
      ],
      "properties": {
        "id": {
          "$ref": "#/$defs/id"
        },
        "outer_mm": {
          "$ref": "#/$defs/size3"
        },
        "side_clearance_mm": {
          "$ref": "#/$defs/size4Nonnegative"
        },
        "top_clearance_mm": {
          "$ref": "#/$defs/nonnegativeLength"
        },
        "rotations_deg": {
          "$ref": "#/$defs/rotations"
        },
        "inventory": {
          "type": "array",
          "maxItems": 256,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "count"
            ],
            "properties": {
              "id": {
                "$ref": "#/$defs/id"
              },
              "count": {
                "$ref": "#/$defs/positiveInteger"
              }
            }
          }
        }
      }
    },
    "manualLayout": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "mode",
        "placements"
      ],
      "properties": {
        "mode": {
          "const": "manual"
        },
        "construction_mode": {
          "enum": [
            "full_box",
            "local_groups"
          ]
        },
        "layers": {
          "type": "array",
          "minItems": 1,
          "maxItems": 8,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "z_mm",
              "height_mm"
            ],
            "properties": {
              "id": {
                "$ref": "#/$defs/id"
              },
              "z_mm": {
                "$ref": "#/$defs/nonnegativeLength"
              },
              "height_mm": {
                "$ref": "#/$defs/length"
              }
            }
          }
        },
        "placements": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "origin_mm",
              "rotation_deg"
            ],
            "properties": {
              "id": {
                "$ref": "#/$defs/id"
              },
              "origin_mm": {
                "$ref": "#/$defs/point"
              },
              "rotation_deg": {
                "enum": [
                  0,
                  90
                ]
              },
              "layer": {
                "$ref": "#/$defs/id"
              },
              "supported_by": {
                "$ref": "#/$defs/id"
              }
            }
          }
        }
      }
    },
    "autoLayout": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "mode",
        "search"
      ],
      "properties": {
        "mode": {
          "const": "auto"
        },
        "construction_mode": {
          "enum": [
            "full_box",
            "local_groups"
          ]
        },
        "search": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "budget",
            "top_k"
          ],
          "properties": {
            "budget": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100000
            },
            "top_k": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10
            },
            "optional_groups": {
              "type": "array",
              "minItems": 1,
              "maxItems": 4,
              "items": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "id",
                  "layout",
                  "axis",
                  "gap_mm",
                  "members"
                ],
                "properties": {
                  "id": {
                    "$ref": "#/$defs/id"
                  },
                  "layout": {
                    "const": "row"
                  },
                  "axis": {
                    "enum": [
                      "x",
                      "y"
                    ]
                  },
                  "gap_mm": {
                    "$ref": "#/$defs/nonnegativeLength"
                  },
                  "members": {
                    "type": "array",
                    "minItems": 2,
                    "maxItems": 4,
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "requirement",
                        "orientation"
                      ],
                      "properties": {
                        "requirement": {
                          "$ref": "#/$defs/id"
                        },
                        "orientation": {
                          "$ref": "#/$defs/id"
                        }
                      }
                    }
                  }
                }
              }
            },
            "interior_template": {
              "$ref": "#/$defs/interiorTemplate"
            },
            "fixed_subtrees": {
              "type": "array",
              "minItems": 1,
              "maxItems": 20,
              "items": {
                "$ref": "#/$defs/manualInterior"
              }
            },
            "fixed_order": {
              "type": "array",
              "minItems": 1,
              "uniqueItems": true,
              "items": {
                "$ref": "#/$defs/id"
              }
            },
            "fixed_slots": {
              "type": "array",
              "minItems": 1,
              "maxItems": 20,
              "items": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "slot",
                  "requirement"
                ],
                "properties": {
                  "slot": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 20
                  },
                  "requirement": {
                    "$ref": "#/$defs/id"
                  }
                }
              }
            },
            "fixed_origin_mm": {
              "$ref": "#/$defs/point"
            },
            "fixed_container_origins": {
              "type": "array",
              "minItems": 1,
              "maxItems": 4,
              "items": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "id",
                  "origin_mm"
                ],
                "properties": {
                  "id": {
                    "$ref": "#/$defs/id"
                  },
                  "origin_mm": {
                    "$ref": "#/$defs/point"
                  }
                }
              }
            },
            "fixed_assembly_origins": {
              "type": "array",
              "minItems": 1,
              "maxItems": 15,
              "items": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "id",
                  "origin_mm"
                ],
                "properties": {
                  "id": {
                    "$ref": "#/$defs/id"
                  },
                  "origin_mm": {
                    "$ref": "#/$defs/point"
                  }
                }
              }
            },
            "allowed_shapes": {
              "type": "array",
              "minItems": 1,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "strip",
                  "t-first",
                  "t-second",
                  "cross",
                  "grid-2x3",
                  "grid-2x4",
                  "grid-2x5",
                  "grid-2x6",
                  "grid-2x7",
                  "grid-2x8",
                  "grid-2x9",
                  "grid-2x10",
                  "grid-3x3",
                  "grid-3x4",
                  "grid-3x5",
                  "grid-3x6",
                  "grid-4x4",
                  "grid-4x5"
                ]
              }
            }
          }
        }
      }
    },
    "sheet": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "id",
        "size_mm",
        "count"
      ],
      "properties": {
        "id": {
          "$ref": "#/$defs/id"
        },
        "size_mm": {
          "$ref": "#/$defs/size2"
        },
        "count": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100
        },
        "material_profile": {
          "$ref": "#/$defs/id"
        }
      }
    },
    "component": {
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "clear_min_mm",
            "orientations"
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/id"
            },
            "kind": {
              "const": "explicit"
            },
            "instances": {
              "$ref": "#/$defs/instances"
            },
            "clear_min_mm": {
              "$ref": "#/$defs/size3"
            },
            "clear_max_mm": {
              "$ref": "#/$defs/size3"
            },
            "orientations": {
              "type": "array",
              "minItems": 1,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "xy",
                  "yx"
                ]
              }
            }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "count",
            "card_outer_mm",
            "split_counts",
            "allowance_total_mm",
            "orientations"
          ],
          "oneOf": [
            {
              "required": [
                "effective_thickness_mm"
              ]
            },
            {
              "required": [
                "stack_measurements_mm"
              ]
            }
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/id"
            },
            "kind": {
              "const": "cards"
            },
            "instances": {
              "$ref": "#/$defs/instances"
            },
            "count": {
              "$ref": "#/$defs/positiveInteger"
            },
            "card_outer_mm": {
              "$ref": "#/$defs/size2"
            },
            "effective_thickness_mm": {
              "$ref": "#/$defs/length"
            },
            "stack_measurements_mm": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/$defs/length"
              }
            },
            "split_counts": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/$defs/positiveInteger"
              }
            },
            "allowance_total_mm": {
              "$ref": "#/$defs/size3Nonnegative"
            },
            "orientations": {
              "type": "array",
              "minItems": 1,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "flat_xy",
                  "flat_yx",
                  "upright_x",
                  "upright_y"
                ]
              }
            }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "count",
            "object_outer_mm",
            "arrangement",
            "object_gap_mm",
            "allowance_total_mm",
            "orientations"
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/id"
            },
            "kind": {
              "const": "objects"
            },
            "instances": {
              "$ref": "#/$defs/instances"
            },
            "count": {
              "$ref": "#/$defs/positiveInteger"
            },
            "object_outer_mm": {
              "$ref": "#/$defs/size3"
            },
            "arrangement": {
              "type": "array",
              "prefixItems": [
                {
                  "$ref": "#/$defs/positiveInteger"
                },
                {
                  "$ref": "#/$defs/positiveInteger"
                },
                {
                  "$ref": "#/$defs/positiveInteger"
                }
              ],
              "items": false,
              "minItems": 3
            },
            "object_gap_mm": {
              "$ref": "#/$defs/size3Nonnegative"
            },
            "allowance_total_mm": {
              "$ref": "#/$defs/size3Nonnegative"
            },
            "orientations": {
              "type": "array",
              "minItems": 1,
              "uniqueItems": true,
              "items": {
                "enum": [
                  "xyz",
                  "xzy",
                  "yxz",
                  "yzx",
                  "zxy",
                  "zyx"
                ]
              }
            }
          }
        },
        {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "id",
            "kind",
            "footprints_mm",
            "allowed_heights_mm",
            "allowance_total_mm"
          ],
          "oneOf": [
            {
              "required": [
                "measured_bulk_volume_cm3"
              ]
            },
            {
              "required": [
                "solid_volume_cm3",
                "fill_fraction"
              ]
            }
          ],
          "properties": {
            "id": {
              "$ref": "#/$defs/id"
            },
            "kind": {
              "const": "loose"
            },
            "instances": {
              "$ref": "#/$defs/instances"
            },
            "measured_bulk_volume_cm3": {
              "type": "number",
              "exclusiveMinimum": 0
            },
            "solid_volume_cm3": {
              "type": "number",
              "exclusiveMinimum": 0
            },
            "fill_fraction": {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 1
            },
            "footprints_mm": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/$defs/size2"
              }
            },
            "allowed_heights_mm": {
              "type": "array",
              "minItems": 1,
              "items": {
                "$ref": "#/$defs/length"
              }
            },
            "allowance_total_mm": {
              "$ref": "#/$defs/size3Nonnegative"
            }
          }
        }
      ]
    }
  }
}
