{
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "$id": "https://usebldg.com/schemas/FloorPlan.schema.json",
 "$defs": {
  "Acoustic": {
   "additionalProperties": false,
   "description": "A sound rating: its metric, value and what it rests on.",
   "properties": {
    "metric": {
     "enum": [
      "stc",
      "iic",
      "rw",
      "rw_c",
      "ln_w",
      "l_nt_w",
      "dn_t_w"
     ],
     "title": "Metric",
     "type": "string"
    },
    "v": {
     "maximum": 200,
     "minimum": -200,
     "title": "V",
     "type": "number"
    },
    "basis": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Basis"
    }
   },
   "required": [
    "metric",
    "v"
   ],
   "title": "Acoustic",
   "type": "object"
  },
  "Assembly": {
   "additionalProperties": false,
   "description": "A listed, prescriptive or tested combination of types with its ratings; it applies to an element only when the element's types are its parts.",
   "properties": {
    "id": {
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "listing": {
     "maxLength": 64,
     "minLength": 1,
     "title": "Listing",
     "type": "string"
    },
    "parts": {
     "$ref": "#/$defs/AssemblyParts",
     "title": "Parts"
    },
    "fire": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/ListedFire"
       },
       "maxItems": 16,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Fire"
    },
    "acoustic": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Acoustic"
       },
       "maxItems": 16,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Acoustic"
    },
    "uplift": {
     "anyOf": [
      {
       "$ref": "#/$defs/Uplift"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Uplift"
    },
    "basis": {
     "enum": [
      "listed",
      "prescriptive",
      "tested"
     ],
     "title": "Basis",
     "type": "string"
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 100,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Name"
    },
    "note": {
     "anyOf": [
      {
       "maxLength": 500,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Note"
    }
   },
   "required": [
    "id",
    "listing",
    "parts",
    "basis"
   ],
   "title": "Assembly",
   "type": "object"
  },
  "AssemblyParts": {
   "additionalProperties": false,
   "description": "The type rows an assembly covers.",
   "properties": {
    "finish": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Finish"
    },
    "slab": {
     "anyOf": [
      {
       "maxLength": 97,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Slab"
    },
    "ceiling": {
     "anyOf": [
      {
       "maxLength": 97,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Ceiling"
    },
    "wall": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Wall"
    }
   },
   "title": "AssemblyParts",
   "type": "object"
  },
  "Building": {
   "additionalProperties": false,
   "description": "A building of the project, or a neighbouring one (role context). Which levels it has is derived from\ntheir building.",
   "properties": {
    "id": {
     "description": "Identifier of this building, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "role": {
     "default": "project",
     "description": "project | context (a neighbouring building).",
     "enum": [
      "project",
      "context"
     ],
     "title": "Role",
     "type": "string"
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 200,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its name (annotation); null = none.",
     "title": "Name"
    },
    "number": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its building number (annotation); null = none.",
     "title": "Number"
    },
    "addresses": {
     "description": "Its street addresses (annotation).",
     "items": {
      "type": "string"
     },
     "maxItems": 16,
     "title": "Addresses",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "zero": {
     "anyOf": [
      {
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The project z of the building's ±0.000, which the drawings' elevations count from; null = the finished floor of its lowest at-grade level.",
     "title": "Zero",
     "x-bldg-scope": "document"
    },
    "class": {
     "anyOf": [
      {
       "$ref": "#/$defs/BuildingClass"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its classification by system (IBC construction type); null = unknown."
    },
    "podium_of": {
     "anyOf": [
      {
       "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The building (tower) this podium supports; null = none.",
     "title": "Podium Of"
    },
    "at_grade": {
     "anyOf": [
      {
       "items": {
        "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
        "type": "string"
       },
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The levels whose gross rings form the footprint; null = the building's lowest storey, [] = a fully buried building.",
     "title": "At Grade"
    },
    "above_ground": {
     "anyOf": [
      {
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How high the datum of its reference level (the lowest at-grade level) sits above the ground; null = the typical height for its foundation (assumed: 6 in on a slab, 2 ft over a crawlspace or a basement in the US set).",
     "title": "Above Ground",
     "x-bldg-scope": "document"
    },
    "foundation": {
     "anyOf": [
      {
       "enum": [
        "slab",
        "crawlspace",
        "basement"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "What its at-grade storey stands on: slab (a slab on grade) | crawlspace (a framed floor over a crawlspace) | basement (a framed floor over a basement); null = derived (basement when a level lies below its at-grade levels, else the typical set's).",
     "title": "Foundation",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id"
   ],
   "title": "Building",
   "type": "object"
  },
  "BuildingClass": {
   "additionalProperties": false,
   "description": "The classification of a building, keyed by classification system; null = unknown.",
   "properties": {
    "ibc_const": {
     "anyOf": [
      {
       "enum": [
        "IA",
        "IB",
        "IIA",
        "IIB",
        "IIIA",
        "IIIB",
        "IV-A",
        "IV-B",
        "IV-C",
        "IV-HT",
        "VA",
        "VB"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "IBC construction type (IA ... VB); null = unknown.",
     "title": "Ibc Const"
    }
   },
   "title": "BuildingClass",
   "type": "object"
  },
  "CeilingPatch": {
   "additionalProperties": false,
   "description": "A ceiling patch of a space: the rest of the space (no placement: its ceiling, z required) or a part of its ceiling placed by one of ring, near, edges, divide, with its own name, finish and height (missing: the ceiling it lies under), slope and form.",
   "properties": {
    "id": {
     "description": "Identifier of this ceiling patch, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 100,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A short label people use (\"tray\", \"kitchen\").",
     "title": "Name"
    },
    "ring": {
     "description": "Placement (d), a free shape: [[x, y], ...] counter-clockwise; [] with no other placement = the rest of the space.",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "title": "Ring",
     "type": "array"
    },
    "holes": {
     "description": "Holes of the free shape, each clockwise.",
     "items": {
      "items": {
       "items": {
        "type": "number"
       },
       "type": "array"
      },
      "type": "array"
     },
     "maxItems": 64,
     "title": "Holes",
     "type": "array"
    },
    "on": {
     "description": "The points of the free shape on wall faces toward the room: they follow those walls.",
     "items": {
      "$ref": "#/$defs/OnWall"
     },
     "maxItems": 256,
     "title": "On",
     "type": "array"
    },
    "near": {
     "anyOf": [
      {
       "$ref": "#/$defs/Near"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Placement (a): around or in front of things (above them)."
    },
    "edges": {
     "anyOf": [
      {
       "$ref": "#/$defs/Edges"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Placement (b): a band in from the walls (a tray)."
    },
    "divide": {
     "anyOf": [
      {
       "$ref": "#/$defs/Divide"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Placement (c): one side of a dividing line."
    },
    "finish": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The part's finish; null = the finish of the ceiling it lies under. Not on the rest patch.",
     "title": "Finish"
    },
    "z": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Ceiling height above the level datum at at; required on the rest patch; null on a part = the ceiling it lies under.",
     "title": "Z"
    },
    "at": {
     "anyOf": [
      {
       "items": {
        "type": "number"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The point [x, y] where z holds; required with slope, absent without.",
     "title": "At"
    },
    "slope": {
     "anyOf": [
      {
       "$ref": "#/$defs/Slope"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The plane's slope; null = horizontal."
    },
    "form": {
     "anyOf": [
      {
       "enum": [
        "main",
        "furred",
        "dropped",
        "sloped"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "main | furred | dropped | sloped: what kind of area the patch is; null = unknown.",
     "title": "Form"
    }
   },
   "required": [
    "id"
   ],
   "title": "CeilingPatch",
   "type": "object"
  },
  "ClassCodes": {
   "additionalProperties": false,
   "description": "A finish's classification codes by system.",
   "properties": {
    "masterformat": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its MasterFormat section (\"09 64 00\").",
     "title": "Masterformat"
    },
    "uniclass": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its Uniclass code.",
     "title": "Uniclass"
    },
    "omniclass": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its OmniClass code.",
     "title": "Omniclass"
    }
   },
   "title": "ClassCodes",
   "type": "object"
  },
  "ClassRow": {
   "additionalProperties": false,
   "description": "The material of every object of a class (a room's, a look's), keyed by its class.",
   "properties": {
    "class": {
     "description": "An object class: cabinets, counters, appliances, faucets, furniture or upholstery.",
     "pattern": "^[a-z][a-z0-9_]{0,63}$",
     "title": "Class",
     "type": "string"
    },
    "finish": {
     "description": "The finish row or library finish.",
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
     "title": "Finish",
     "type": "string"
    }
   },
   "required": [
    "class",
    "finish"
   ],
   "title": "ClassRow",
   "type": "object"
  },
  "Clear": {
   "additionalProperties": false,
   "description": "A stated clear opening (measured, or where parts are missing): its width, height and net area, and what\nit was taken from.",
   "properties": {
    "w": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Clear width.",
     "title": "W"
    },
    "h": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Clear height.",
     "title": "H"
    },
    "area": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Net clear area (an opening that is no rectangle); null = width x height.",
     "title": "Area"
    },
    "basis": {
     "description": "What it was taken from: clear_at_90 (the leaf open at 90 degrees) | frame_clear | rough | measured.",
     "enum": [
      "clear_at_90",
      "frame_clear",
      "rough",
      "measured"
     ],
     "title": "Basis",
     "type": "string"
    }
   },
   "required": [
    "basis"
   ],
   "title": "Clear",
   "type": "object"
  },
  "Component": {
   "additionalProperties": false,
   "description": "Placed object (furniture, sanitary ware, appliances, plants, lifts, columns, stairs ...) of its component\ntype, an oriented body at (x, y).",
   "properties": {
    "id": {
     "description": "Identifier of this element, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "type": {
     "description": "Id of its component type.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Type",
     "type": "string"
    },
    "x": {
     "description": "Centre x.",
     "title": "X",
     "type": "number"
    },
    "y": {
     "description": "Centre y.",
     "title": "Y",
     "type": "number"
    },
    "dir": {
     "default": [
      1,
      0
     ],
     "description": "The image of its local +x axis [dx, dy] (integers in lowest terms, |dx| and |dy| at most 1000), dy up the drawing as it is seen (in an image frame too: against the pixel y): at [1, 0] the front faces visually down, a stair climbs along local +x.",
     "items": {
      "maximum": 1000,
      "minimum": -1000,
      "type": "integer"
     },
     "maxItems": 2,
     "minItems": 2,
     "title": "Dir",
     "type": "array"
    },
    "mirrored": {
     "default": false,
     "description": "Mirror the model along its local x axis (handed models, e.g. a corner sofa with the chaise on the right).",
     "title": "Mirrored",
     "type": "boolean",
     "x-bldg-scope": "document"
    },
    "finishes": {
     "description": "Bands of finish on the wall faces it stands against (a backsplash, a shower surround).",
     "items": {
      "$ref": "#/$defs/ComponentFinish"
     },
     "maxItems": 16,
     "title": "Finishes",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "slots": {
     "description": "This object's own materials, by slot (upholstery, legs, cabinets ...).",
     "items": {
      "$ref": "#/$defs/SlotRow"
     },
     "maxItems": 16,
     "title": "Slots",
     "type": "array",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "type",
    "x",
    "y"
   ],
   "title": "Component",
   "type": "object"
  },
  "ComponentFinish": {
   "additionalProperties": false,
   "description": "A band of finish on the wall faces a fixture stands against (at behind: its back; around: its back and both sides), from from to to above the finished floor at the faces (to null: the ceiling there).",
   "properties": {
    "id": {
     "description": "Identifier of this band, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "at": {
     "description": "behind (the wall faces its back stands against) | around (its back and both sides).",
     "enum": [
      "behind",
      "around"
     ],
     "title": "At",
     "type": "string"
    },
    "from": {
     "default": 0.0,
     "description": "The band's bottom above the finished floor at the faces.",
     "minimum": 0,
     "title": "From",
     "type": "number"
    },
    "to": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its top; null = the ceiling there.",
     "title": "To"
    },
    "to_underside": {
     "default": false,
     "description": "true: where an upper cabinet or a range hood hangs over the band's stretch of face, the band ends at its underside (a backsplash up to the cabinets); elsewhere at to.",
     "title": "To Underside",
     "type": "boolean"
    },
    "finish": {
     "description": "The band's finish: a finish row id or a library finish id.",
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
     "title": "Finish",
     "type": "string"
    }
   },
   "required": [
    "id",
    "at",
    "finish"
   ],
   "title": "ComponentFinish",
   "type": "object"
  },
  "ComponentParam": {
   "additionalProperties": false,
   "description": "One catalog family parameter other than the size, e.g. {\"name\": \"seats\", \"value\": 6}: a length (document\nunits), a count, a switch (true / false) or an option (\"round\"), as the family defines it.",
   "properties": {
    "name": {
     "description": "Family parameter name (a parameter of the component's catalog family).",
     "pattern": "^[A-Za-z][A-Za-z0-9_]{0,23}$",
     "title": "Name",
     "type": "string"
    },
    "value": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "number"
      },
      {
       "type": "string"
      }
     ],
     "description": "Length, count, true / false, or an option string.",
     "title": "Value"
    }
   },
   "required": [
    "name",
    "value"
   ],
   "title": "ComponentParam",
   "type": "object"
  },
  "ComponentType": {
   "additionalProperties": false,
   "description": "A component type, shared by the components that name it: one per distinct catalog model and spec (a BIM\nfamily type).",
   "properties": {
    "id": {
     "description": "Type id, e.g. bed_1800x2000mm.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "model": {
     "description": "Catalog family id (bed, wardrobe, dining_table ...), a plugin item id (acme:piano) or generic.",
     "maxLength": 97,
     "pattern": "^([a-z][a-z0-9_]{0,31}:)?[a-z0-9][a-z0-9_.\\-]{0,63}$",
     "title": "Model",
     "type": "string"
    },
    "width": {
     "description": "Body size along its local x axis (a dining table: the table).",
     "exclusiveMinimum": 0,
     "title": "Width",
     "type": "number"
    },
    "depth": {
     "description": "Body size along its local y axis.",
     "exclusiveMinimum": 0,
     "title": "Depth",
     "type": "number"
    },
    "height": {
     "default": 0.0,
     "description": "Body height; 0 = the family default (stairs, columns: the level height).",
     "minimum": 0,
     "title": "Height",
     "type": "number",
     "x-bldg-scope": "detail"
    },
    "params": {
     "description": "Family parameters other than the size, where they differ from the family default (e.g. seats, shape round, doors).",
     "items": {
      "$ref": "#/$defs/ComponentParam"
     },
     "maxItems": 16,
     "title": "Params",
     "type": "array"
    },
    "category": {
     "default": "",
     "description": "Only for model generic: its semantic category; \"\" for a catalog family (the family's).",
     "enum": [
      "furniture",
      "casework",
      "sanitary",
      "appliance",
      "equipment",
      "planting",
      "transport",
      "structure",
      "circulation",
      "other",
      ""
     ],
     "title": "Category",
     "type": "string"
    },
    "mount": {
     "anyOf": [
      {
       "enum": [
        "floor",
        "wall",
        "ceiling",
        "counter",
        "recessed",
        "pendant",
        "inline"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "floor | wall | ceiling | counter | recessed | pendant | inline: how its components are mounted (a reflected ceiling plan shows the ceiling, pendant and recessed ones); null = the family's (the floor for generic types and plugin items).",
     "title": "Mount"
    },
    "name": {
     "default": "",
     "description": "A readable name (e.g. piano for a generic box).",
     "maxLength": 100,
     "title": "Name",
     "type": "string",
     "x-bldg-scope": "document"
    },
    "key": {
     "default": "",
     "description": "Internal identity (IFC type GlobalIds), written once by the editing engine when the type's first element would change; kept by renames and resizes. \"\" = the first element that uses it.",
     "maxLength": 100,
     "title": "Key",
     "type": "string",
     "x-bldg-scope": "document"
    },
    "slots": {
     "description": "The materials of every object of this type, by slot (part of the type's identity when an object changes type).",
     "items": {
      "$ref": "#/$defs/SlotRow"
     },
     "maxItems": 16,
     "title": "Slots",
     "type": "array",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "model",
    "width",
    "depth"
   ],
   "title": "ComponentType",
   "type": "object"
  },
  "Coverage": {
   "additionalProperties": false,
   "description": "A completeness statement: how complete a collection is (the records where narrows it to, the attributes\nfields names) within scope, at tier. not_extracted means \"not looked at\", which is different from \"there is\nnone\"; a collection no row speaks of is unknown.",
   "properties": {
    "collection": {
     "description": "The collection the row speaks of: a level collection (nodes, walls, spaces, openings, components, rails, slabs, dimensions, grid, texts) or a plan-wide list (buildings, groups, systems, vertical, premises).",
     "enum": [
      "nodes",
      "walls",
      "spaces",
      "openings",
      "components",
      "rails",
      "slabs",
      "dimensions",
      "grid",
      "texts",
      "buildings",
      "groups",
      "systems",
      "vertical",
      "premises"
     ],
     "title": "Collection",
     "type": "string"
    },
    "where": {
     "anyOf": [
      {
       "$ref": "#/$defs/CoverageWhere"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Narrows it to records of some kinds, domains or system kinds; null = every record."
    },
    "fields": {
     "description": "The attributes it speaks of (registry paths: hinge, swing, use ...); empty = the records themselves.",
     "items": {
      "pattern": "^[a-z][a-z0-9_]{0,63}(\\.[a-z][a-z0-9_]{0,63}){0,3}$",
      "type": "string"
     },
     "maxItems": 32,
     "title": "Fields",
     "type": "array"
    },
    "scope": {
     "default": "*",
     "description": "* (the whole plan) or the id of the building, level or group it speaks of.",
     "pattern": "^(\\*|[A-Za-z_][A-Za-z0-9_.\\-]{0,63})$",
     "title": "Scope",
     "type": "string"
    },
    "state": {
     "description": "complete (every record is in the plan) | partial | not_extracted (not looked at).",
     "enum": [
      "complete",
      "partial",
      "not_extracted"
     ],
     "title": "State",
     "type": "string"
    },
    "tier": {
     "anyOf": [
      {
       "enum": [
        "D",
        "R",
        "F"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "D (equipment and devices) | R (routing) | F (fabrication); null = every tier.",
     "title": "Tier"
    }
   },
   "required": [
    "collection",
    "state"
   ],
   "title": "Coverage",
   "type": "object"
  },
  "CoverageWhere": {
   "additionalProperties": false,
   "description": "What part of a collection a coverage row speaks of: its records of these kinds, domains or system kinds (each\nlist empty: no narrowing by it).",
   "properties": {
    "kind": {
     "description": "The kinds of the records it speaks of (a system's or a component's kind); empty = every kind.",
     "items": {
      "pattern": "^[a-z][a-z0-9_]{0,63}$",
      "type": "string"
     },
     "maxItems": 64,
     "title": "Kind",
     "type": "array"
    },
    "domain": {
     "description": "The domains of the records it speaks of (fire, plumbing, hvac, electrical, telecom); empty = every domain.",
     "items": {
      "pattern": "^[a-z][a-z0-9_]{0,63}$",
      "type": "string"
     },
     "maxItems": 16,
     "title": "Domain",
     "type": "array"
    },
    "system_kind": {
     "description": "The kinds of the systems the records belong to; empty = any.",
     "items": {
      "pattern": "^[a-z][a-z0-9_]{0,63}$",
      "type": "string"
     },
     "maxItems": 64,
     "title": "System Kind",
     "type": "array"
    }
   },
   "title": "CoverageWhere",
   "type": "object"
  },
  "Defaults": {
   "additionalProperties": false,
   "description": "Document-only overrides of single convention defaults (the typical set's default keys, in document units); null =\nthe typical set's value. What a plan leaves out resolves through them (``FloorPlan.resolve``).",
   "properties": {
    "level_height": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Floor-to-ceiling wall height of a storey.",
     "title": "Level Height"
    },
    "slab_thickness": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Slab Thickness"
    },
    "door_head_height": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Door Head Height"
    },
    "window_sill_height": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Window Sill Height"
    },
    "window_head_height": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Window Head Height"
    },
    "railing_height": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Railing Height"
    },
    "door_leaf_thickness": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Door Leaf Thickness"
    },
    "sliding_leaf_thickness": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Sliding Leaf Thickness"
    },
    "folding_leaf_thickness": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Folding Leaf Thickness"
    },
    "door_frame_width": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Door Frame Width"
    },
    "window_frame_width": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Window Frame Width"
    },
    "window_frame_depth": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Window Frame Depth"
    },
    "glass_thickness": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Glass Thickness"
    },
    "sash_width": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Sash Width"
    },
    "stair_tread_depth": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Stair tread depth (fixed; a longer flight has more treads).",
     "title": "Stair Tread Depth"
    },
    "stair_max_riser_height": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Highest allowed stair riser height.",
     "title": "Stair Max Riser Height"
    },
    "handrail_height": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Top of a typical handrail above the walking surface (above the nosing line on a stair).",
     "title": "Handrail Height"
    }
   },
   "title": "Defaults",
   "type": "object"
  },
  "Dimension": {
   "additionalProperties": false,
   "description": "A dimension line: the two points its extension lines touch (x0, y0)-(x1, y1); text is exactly as printed on\nthe drawing, \"\" if none is printed.",
   "properties": {
    "id": {
     "description": "Identifier of this element, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "x0": {
     "title": "X0",
     "type": "number"
    },
    "y0": {
     "title": "Y0",
     "type": "number"
    },
    "x1": {
     "title": "X1",
     "type": "number"
    },
    "y1": {
     "title": "Y1",
     "type": "number"
    },
    "text": {
     "default": "",
     "description": "As printed, e.g. \"4600\", \"4.60\", \"12'-6\"\"; \"\" = drawn, not printed (its value is the measured distance).",
     "maxLength": 40,
     "title": "Text",
     "type": "string"
    },
    "basis": {
     "default": "unknown",
     "description": "What the extension lines touch: wall centerlines, wall faces, or overall outer faces.",
     "enum": [
      "centerline",
      "face",
      "overall",
      "unknown"
     ],
     "title": "Basis",
     "type": "string"
    },
    "offset": {
     "default": 0.0,
     "description": "Signed distance of the dimension line from the measured points along the positive normal of (x0, y0) -> (x1, y1) (the visual left, as for walls); 0 = the points lie on the line (a printed dimension as traced). Extension lines run from the points to the line.",
     "title": "Offset",
     "type": "number",
     "x-bldg-scope": "document"
    },
    "host0": {
     "anyOf": [
      {
       "$ref": "#/$defs/DimensionHost"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "What (x0, y0) is attached to (a node, a wall face / centerline); null = a free point.",
     "x-bldg-scope": "document"
    },
    "host1": {
     "anyOf": [
      {
       "$ref": "#/$defs/DimensionHost"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "What (x1, y1) is attached to; null = a free point.",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "x0",
    "y0",
    "x1",
    "y1"
   ],
   "title": "Dimension",
   "type": "object"
  },
  "DimensionHost": {
   "additionalProperties": false,
   "description": "What one end of a drawn dimension is attached to (a BIM dimension reference): a node, a wall's face\n(A / B: the visual left / right of its start -> end) or its centerline (center), or a door /\nwindow: its jamb (start / end: the jamb nearer the wall's start / end) or its centre, on its wall's face or\ncenterline (side), or a structural grid line (BIM convention: grids are dimension references). Edits that move the host (a\nwall, a moved / resized / retyped opening, a grid line moved or re-ended) move the end with it, along the dimension;\na lost host leaves a free point.",
   "properties": {
    "node": {
     "default": "",
     "description": "Node id (\"\" = not a node).",
     "maxLength": 64,
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63})?$",
     "title": "Node",
     "type": "string"
    },
    "wall": {
     "default": "",
     "description": "Wall id (\"\" = not a wall).",
     "maxLength": 64,
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63})?$",
     "title": "Wall",
     "type": "string"
    },
    "opening": {
     "default": "",
     "description": "Opening id (\"\" = not an opening).",
     "maxLength": 64,
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63})?$",
     "title": "Opening",
     "type": "string"
    },
    "grid": {
     "default": "",
     "description": "Grid line id (\"\" = not a grid line): the end lies on that axis.",
     "maxLength": 64,
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63})?$",
     "title": "Grid",
     "type": "string"
    },
    "jamb": {
     "default": "center",
     "description": "An opening host's point: its start / end jamb, or its centre.",
     "enum": [
      "start",
      "end",
      "center"
     ],
     "title": "Jamb",
     "type": "string"
    },
    "side": {
     "default": "center",
     "description": "The wall's (an opening's wall's) face: A | B (as door swings: A = the visual left of its start -> end), or its centerline.",
     "enum": [
      "A",
      "B",
      "center"
     ],
     "title": "Side",
     "type": "string"
    }
   },
   "title": "DimensionHost",
   "type": "object"
  },
  "Divide": {
   "additionalProperties": false,
   "description": "A part on one side of a dividing line across the room: from ends[0] (through a square bend, or straight) to ends[1]; the part lies on side (left or right of the line walked from the first end).",
   "properties": {
    "ends": {
     "description": "The line's two ends, each on a wall.",
     "items": {
      "$ref": "#/$defs/DivideEnd"
     },
     "maxItems": 2,
     "minItems": 2,
     "title": "Ends",
     "type": "array"
    },
    "bend": {
     "anyOf": [
      {
       "enum": [
        "square"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "square = the line turns square between its ends; null = straight.",
     "title": "Bend"
    },
    "side": {
     "description": "The side of the line the part lies on, walking it from its first end: left | right.",
     "enum": [
      "left",
      "right"
     ],
     "title": "Side",
     "type": "string"
    }
   },
   "required": [
    "ends",
    "side"
   ],
   "title": "Divide",
   "type": "object"
  },
  "DivideEnd": {
   "additionalProperties": false,
   "description": "An end of a dividing line: the point on a wall's node line pos from its anchor node.",
   "properties": {
    "wall": {
     "description": "The wall the end lies on.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Wall",
     "type": "string"
    },
    "anchor": {
     "default": "start",
     "description": "The wall node pos is measured from: start | end.",
     "enum": [
      "start",
      "end"
     ],
     "title": "Anchor",
     "type": "string"
    },
    "pos": {
     "description": "Distance along the wall's node line from the anchor node.",
     "minimum": 0,
     "title": "Pos",
     "type": "number"
    }
   },
   "required": [
    "wall",
    "pos"
   ],
   "title": "DivideEnd",
   "type": "object"
  },
  "Draw": {
   "additionalProperties": false,
   "description": "Presentation choices (document-only).",
   "properties": {
    "style": {
     "anyOf": [
      {
       "enum": [
        "bldg:style.international",
        "bldg:style.gb",
        "bldg:style.us"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The drawing style of type marks and grid letters: bldg:style.international (D1, W1, WT1) | bldg:style.gb (M0921, C1515, Q240) | bldg:style.us (D3068, W4040, WT4.5); null = the jurisdiction's.",
     "title": "Style"
    }
   },
   "title": "Draw",
   "type": "object"
  },
  "Edges": {
   "additionalProperties": false,
   "description": "A part placed as a band in from the room's walls, from to to (to null: everything inside from); along the open (virtual) edges too when open_edges.",
   "properties": {
    "from": {
     "description": "The band's outer edge, in from the walls.",
     "minimum": 0,
     "title": "From",
     "type": "number"
    },
    "to": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its inner edge; null = everything inside from.",
     "title": "To"
    },
    "open_edges": {
     "default": false,
     "description": "Run the band along the open (virtual) edges of the room too.",
     "title": "Open Edges",
     "type": "boolean"
    }
   },
   "required": [
    "from"
   ],
   "title": "Edges",
   "type": "object"
  },
  "Evidence": {
   "additionalProperties": false,
   "description": "Provenance of one aspect of one element, type, level or source (document-only, plan-wide ``evidence``).\n\nmethod: measured (on site) | drawing (taken from a CAD / vector drawing's geometry) | traced (measured on a raster\nunderlay) | read (read off printed dimensions or text) | inferred (derived from other elements, or by a model) |\nassumed (a default or a guess: a catalog / typical-set size).",
   "properties": {
    "ref": {
     "description": "Id of an element, type, level or source.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Ref",
     "type": "string"
    },
    "aspect": {
     "default": "all",
     "description": "What the record covers; a specific aspect overrides the ref's 'all' record.",
     "enum": [
      "all",
      "geometry",
      "position",
      "size",
      "type",
      "operation",
      "text"
     ],
     "title": "Aspect",
     "type": "string"
    },
    "method": {
     "enum": [
      "measured",
      "drawing",
      "traced",
      "read",
      "inferred",
      "assumed",
      "default"
     ],
     "title": "Method",
     "type": "string"
    },
    "source": {
     "default": "",
     "description": "The metadata.sources entry it came from; \"\" = none.",
     "maxLength": 64,
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63})?$",
     "title": "Source",
     "type": "string"
    },
    "needs_check": {
     "default": false,
     "description": "Flag for re-measurement / review (待复尺).",
     "title": "Needs Check",
     "type": "boolean"
    },
    "note": {
     "anyOf": [
      {
       "maxLength": 500,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Note"
    }
   },
   "required": [
    "ref",
    "method"
   ],
   "title": "Evidence",
   "type": "object"
  },
  "ExternalId": {
   "additionalProperties": false,
   "description": "The identity a plan object has in a source it was imported from (document-only, plan-wide ``external_ids``):\nan IFC GlobalId, a BIM authoring tool's element id, a RoomPlan UUID. Internal ids stay short and stable. An IFC door has two (the\nvoid and the fill).",
   "properties": {
    "ref": {
     "description": "Id of an element, type or level.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Ref",
     "type": "string"
    },
    "source": {
     "description": "Id of a metadata.sources entry.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Source",
     "type": "string"
    },
    "external_id": {
     "maxLength": 128,
     "minLength": 1,
     "title": "External Id",
     "type": "string"
    },
    "role": {
     "default": "element",
     "description": "element | void (an opening's IfcOpeningElement) | fill (its door / window) | type.",
     "enum": [
      "element",
      "void",
      "fill",
      "type"
     ],
     "title": "Role",
     "type": "string"
    }
   },
   "required": [
    "ref",
    "source",
    "external_id"
   ],
   "title": "ExternalId",
   "type": "object"
  },
  "FamilyRow": {
   "additionalProperties": false,
   "description": "A family exception of the default (typical looks only), keyed by (of, slot).",
   "properties": {
    "of": {
     "description": "A family id, generic:<category>, unswung_door or *.",
     "maxLength": 97,
     "pattern": "^(\\*|([a-z][a-z0-9_]{0,31}:)?[a-z0-9][a-z0-9_.\\-]{0,63})$",
     "title": "Of",
     "type": "string"
    },
    "slot": {
     "description": "The slot.",
     "pattern": "^[a-z][a-z0-9_]{0,63}$",
     "title": "Slot",
     "type": "string"
    },
    "finish": {
     "description": "The finish row or library finish.",
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
     "title": "Finish",
     "type": "string"
    }
   },
   "required": [
    "of",
    "slot",
    "finish"
   ],
   "title": "FamilyRow",
   "type": "object"
  },
  "FinishAppearance": {
   "additionalProperties": false,
   "description": "How a finish looks at real size: its colour, roughness and metalness, and its texture.",
   "properties": {
    "color": {
     "anyOf": [
      {
       "pattern": "^#[0-9a-f]{6}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its colour, #rrggbb.",
     "title": "Color"
    },
    "roughness": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "0 (glossy) .. 1 (matte).",
     "title": "Roughness"
    },
    "metallic": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "0 .. 1.",
     "title": "Metallic"
    },
    "texture": {
     "anyOf": [
      {
       "pattern": "^(bldg:texture\\.[a-z_]{1,32}|asset:[A-Za-z0-9_.\\-]{1,64})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "bldg:texture.<pattern kind> (procedural, the default) or asset:<id> (a product image).",
     "title": "Texture"
    },
    "scale": {
     "anyOf": [
      {
       "items": {
        "exclusiveMinimum": 0,
        "type": "number"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The real size one repeat of an object texture covers [across, along] the grain; null = the texture kind's.",
     "title": "Scale"
    },
    "opacity": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How opaque it is, 0..1 (glass); null = 1.",
     "title": "Opacity"
    },
    "figure": {
     "anyOf": [
      {
       "enum": [
        "plain",
        "veined",
        "handmade",
        "cleft",
        "aggregate",
        "broom",
        "barrel"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The figure of its pieces where the kind and the pattern cannot tell it: plain | veined | handmade | cleft | aggregate | broom | barrel; null = plain.",
     "title": "Figure"
    }
   },
   "title": "FinishAppearance",
   "type": "object"
  },
  "FinishBand": {
   "additionalProperties": false,
   "description": "A band of finish from the bottom of a face up to h: a wainscot (from the finished floor), the outside base band (from the bottom of the outside face). h 0 = none.",
   "properties": {
    "finish": {
     "description": "The band's finish: a finish row id or a library finish id.",
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
     "title": "Finish",
     "type": "string"
    },
    "h": {
     "description": "Its height above the bottom of the face; 0 = none.",
     "minimum": 0,
     "title": "H",
     "type": "number"
    }
   },
   "required": [
    "finish",
    "h"
   ],
   "title": "FinishBand",
   "type": "object"
  },
  "FinishLayout": {
   "additionalProperties": false,
   "description": "How a finish is laid in this plan: its direction and, for a coursed pattern, the origin of its courses.",
   "properties": {
    "dir": {
     "description": "The direction of its courses or grid, a reduced integer direction [dx, dy].",
     "items": {
      "maximum": 1000,
      "minimum": -1000,
      "type": "integer"
     },
     "maxItems": 2,
     "minItems": 2,
     "title": "Dir",
     "type": "array"
    },
    "origin": {
     "anyOf": [
      {
       "items": {
        "type": "number"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The origin of its courses (plank, lap, board, shingle, seam).",
     "title": "Origin"
    }
   },
   "required": [
    "dir"
   ],
   "title": "FinishLayout",
   "type": "object"
  },
  "FinishPattern": {
   "additionalProperties": false,
   "description": "The real-size layout unit of a finish: its kind, one piece's size [across, along], the joint between pieces and its colour, the running-bond offset and the relief a texture draws.",
   "properties": {
    "kind": {
     "description": "none | plank | grid | running | herringbone | hex | lap | board | shingle | seam | bond | ashlar.",
     "enum": [
      "none",
      "plank",
      "grid",
      "running",
      "herringbone",
      "hex",
      "lap",
      "board",
      "shingle",
      "seam",
      "bond",
      "ashlar"
     ],
     "title": "Kind",
     "type": "string"
    },
    "module": {
     "anyOf": [
      {
       "items": {
        "exclusiveMinimum": 0,
        "type": "number"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "One piece [across, along] the run: a board's or tile's width, a course's height or a lap's exposure first, the piece's length second; the pitch, joint included; required unless kind is none.",
     "title": "Module"
    },
    "joint": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The grout or gap width.",
     "title": "Joint"
    },
    "offset": {
     "anyOf": [
      {
       "exclusiveMaximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The running-bond fraction; null = 0.5 for running and bond.",
     "title": "Offset"
    },
    "joint_color": {
     "anyOf": [
      {
       "pattern": "^#[0-9a-f]{6}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The joint's colour (mortar, grout, sand, a gap's shade), #rrggbb; null = the pattern's typical one.",
     "title": "Joint Color"
    },
    "relief": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How far the pattern stands out: a lap's or a shingle's butt, a batten's depth, a seam's rib, a joint's recess, a split stone's face; null = the pattern's typical one.",
     "title": "Relief"
    },
    "batten": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A board and batten's batten width; null = 2 in.",
     "title": "Batten"
    }
   },
   "required": [
    "kind"
   ],
   "title": "FinishPattern",
   "type": "object"
  },
  "FinishProduct": {
   "additionalProperties": false,
   "description": "The product a finish row is: its manufacturer, line, model, product code and a link.",
   "properties": {
    "manufacturer": {
     "anyOf": [
      {
       "maxLength": 100,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The manufacturer.",
     "title": "Manufacturer"
    },
    "line": {
     "anyOf": [
      {
       "maxLength": 100,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The product line.",
     "title": "Line"
    },
    "model": {
     "anyOf": [
      {
       "maxLength": 100,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The model.",
     "title": "Model"
    },
    "code": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The product code.",
     "title": "Code"
    },
    "url": {
     "anyOf": [
      {
       "maxLength": 2048,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A link to the product.",
     "title": "Url"
    }
   },
   "title": "FinishProduct",
   "type": "object"
  },
  "FinishSet": {
   "additionalProperties": false,
   "description": "The values a finish row sets over its base, by field path (a product's or a new colour's overrides).",
   "properties": {
    "appearance.color": {
     "anyOf": [
      {
       "pattern": "^#[0-9a-f]{6}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its colour, #rrggbb.",
     "title": "Appearance.color"
    },
    "appearance.roughness": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "0 (glossy) .. 1 (matte).",
     "title": "Appearance.roughness"
    },
    "appearance.metallic": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "0 .. 1.",
     "title": "Appearance.metallic"
    },
    "appearance.texture": {
     "anyOf": [
      {
       "pattern": "^(bldg:texture\\.[a-z_]{1,32}|asset:[A-Za-z0-9_.\\-]{1,64})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "bldg:texture.<pattern kind> or asset:<id>.",
     "title": "Appearance.texture"
    },
    "pattern.kind": {
     "anyOf": [
      {
       "enum": [
        "none",
        "plank",
        "grid",
        "running",
        "herringbone",
        "hex",
        "lap",
        "board",
        "shingle",
        "seam",
        "bond",
        "ashlar"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The pattern's kind.",
     "title": "Pattern.kind"
    },
    "pattern.module": {
     "anyOf": [
      {
       "items": {
        "exclusiveMinimum": 0,
        "type": "number"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "One piece [across, along].",
     "title": "Pattern.module"
    },
    "pattern.joint": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The joint between pieces.",
     "title": "Pattern.joint"
    },
    "pattern.offset": {
     "anyOf": [
      {
       "exclusiveMaximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The running-bond fraction.",
     "title": "Pattern.offset"
    },
    "h": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A baseboard's or trim's profile height.",
     "title": "H"
    },
    "waste": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The quantity waste.",
     "title": "Waste"
    },
    "appearance.scale": {
     "anyOf": [
      {
       "items": {
        "exclusiveMinimum": 0,
        "type": "number"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its texture's real size [across, along].",
     "title": "Appearance.scale"
    },
    "appearance.opacity": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its opacity.",
     "title": "Appearance.opacity"
    },
    "appearance.figure": {
     "anyOf": [
      {
       "enum": [
        "plain",
        "veined",
        "handmade",
        "cleft",
        "aggregate",
        "broom",
        "barrel"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The figure of its pieces.",
     "title": "Appearance.figure"
    },
    "pattern.joint_color": {
     "anyOf": [
      {
       "pattern": "^#[0-9a-f]{6}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The joint's colour.",
     "title": "Pattern.joint Color"
    },
    "pattern.relief": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How far the pattern stands out.",
     "title": "Pattern.relief"
    },
    "pattern.batten": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A batten's width.",
     "title": "Pattern.batten"
    }
   },
   "title": "FinishSet",
   "type": "object"
  },
  "FinishType": {
   "additionalProperties": false,
   "description": "A finish: what a surface is made of and how it looks at real size (§2.3 of the finishes spec). A plan row usually derives from a library row (base) and adds its schedule code (mark), a product or overrides (set).",
   "properties": {
    "id": {
     "description": "Identifier of this finish row, unique across the whole plan (ft_<name>).",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "base": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The row it derives from: a library finish (bldg:finish_type....) or another row.",
     "title": "Base"
    },
    "set": {
     "anyOf": [
      {
       "$ref": "#/$defs/FinishSet"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Overrides applied after base, by field path ({\"appearance.color\": \"#2f7f7a\"})."
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 100,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Readable name.",
     "title": "Name"
    },
    "note": {
     "anyOf": [
      {
       "maxLength": 500,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Free description.",
     "title": "Note"
    },
    "key": {
     "default": "",
     "description": "Internal identity for IFC type GUIDs.",
     "maxLength": 100,
     "title": "Key",
     "type": "string",
     "x-bldg-scope": "document"
    },
    "mark": {
     "default": "",
     "description": "Its schedule code (WD-1, CT-2), never reused.",
     "maxLength": 32,
     "title": "Mark",
     "type": "string"
    },
    "product": {
     "anyOf": [
      {
       "$ref": "#/$defs/FinishProduct"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The product it is."
    },
    "class_codes": {
     "anyOf": [
      {
       "$ref": "#/$defs/ClassCodes"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its classification codes ({\"masterformat\": \"09 64 00\"})."
    },
    "surfaces": {
     "description": "Where it may go: floor | wall | outside_wall | ceiling | baseboard | trim | door | roof | foundation, and for objects upholstery | bedding | furniture | cabinets | counters | appliances | faucets | sanitary | glass | planter | window | rail | vehicle; required without base; empty: a fixed part of a catalog model.",
     "items": {
      "enum": [
       "floor",
       "wall",
       "outside_wall",
       "ceiling",
       "baseboard",
       "trim",
       "door",
       "roof",
       "foundation",
       "upholstery",
       "bedding",
       "furniture",
       "cabinets",
       "counters",
       "appliances",
       "faucets",
       "sanitary",
       "glass",
       "planter",
       "window",
       "rail",
       "vehicle"
      ],
      "type": "string"
     },
     "maxItems": 8,
     "title": "Surfaces",
     "type": "array"
    },
    "kind": {
     "anyOf": [
      {
       "enum": [
        "wood",
        "resilient",
        "tile",
        "stone",
        "carpet",
        "concrete",
        "coating",
        "paving",
        "decking",
        "paint",
        "panel",
        "baseboard",
        "trim",
        "door",
        "siding",
        "stucco",
        "masonry",
        "roofing",
        "none",
        "fabric",
        "leather",
        "metal",
        "glass",
        "ceramic",
        "appliance",
        "window"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "What it is: wood | resilient | tile | stone | carpet | concrete | coating | paving | decking | paint | panel | baseboard | trim | door | siding | stucco | masonry | roofing | none, and for objects fabric | leather | metal | glass | ceramic | appliance | window.",
     "title": "Kind"
    },
    "appearance": {
     "anyOf": [
      {
       "$ref": "#/$defs/FinishAppearance"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How it looks; null = its base's, else its kind's neutral look."
    },
    "pattern": {
     "anyOf": [
      {
       "$ref": "#/$defs/FinishPattern"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its real-size layout unit; null = a continuous surface."
    },
    "layout": {
     "anyOf": [
      {
       "$ref": "#/$defs/FinishLayout"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How it is laid in this plan; null = derived."
    },
    "h": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A baseboard's or trim's profile height.",
     "title": "H"
    },
    "aliases": {
     "description": "More words a name lookup matches (\"hardwood\").",
     "items": {
      "type": "string"
     },
     "maxItems": 32,
     "title": "Aliases",
     "type": "array"
    },
    "first_for": {
     "description": "Generic words for which it is the first pick on its first surface (\"wood\").",
     "items": {
      "type": "string"
     },
     "maxItems": 16,
     "title": "First For",
     "type": "array"
    },
    "layers": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Layer"
       },
       "maxItems": 16,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its build-up from the exposed face inwards (read for transitions and quantities only, never for heights); null = unknown.",
     "title": "Layers"
    },
    "waste": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The quantity waste for this finish; null = the plan's policy.",
     "title": "Waste"
    },
    "surface": {
     "anyOf": [
      {
       "pattern": "^[a-z][a-z0-9_]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The walking or wet surface (nonabsorbent, pile_low ...); null = unknown.",
     "title": "Surface"
    },
    "reaction": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Reaction"
       },
       "maxItems": 8,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Reaction to fire; overrides the layers' materials.",
     "title": "Reaction"
    }
   },
   "required": [
    "id"
   ],
   "title": "FinishType",
   "type": "object"
  },
  "Fire": {
   "additionalProperties": false,
   "description": "An unlisted fire-resistance rating in minutes: the side it holds from, its EN 13501-2 criteria (none for ASTM E119), standard and method.",
   "properties": {
    "min": {
     "exclusiveMinimum": 0,
     "maximum": 1440,
     "title": "Min",
     "type": "number"
    },
    "side": {
     "anyOf": [
      {
       "enum": [
        "A",
        "B",
        "both"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Side"
    },
    "crit": {
     "items": {
      "enum": [
       "R",
       "E",
       "I",
       "I1",
       "I2",
       "W",
       "M",
       "S",
       "C"
      ],
      "type": "string"
     },
     "maxItems": 9,
     "title": "Crit",
     "type": "array"
    },
    "std": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Std"
    },
    "method": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Method"
    }
   },
   "required": [
    "min"
   ],
   "title": "Fire",
   "type": "object"
  },
  "Flight": {
   "additionalProperties": false,
   "description": "A flight of a stair, on the level it starts from: its bottom nosing line, its direction of travel up, its finished bottom and top, its risers and treads.",
   "properties": {
    "id": {
     "description": "Identifier of this flight, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "level": {
     "description": "The level it starts from; its z are above that level's datum.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Level",
     "type": "string"
    },
    "type": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its stair type; null = the stair's.",
     "title": "Type"
    },
    "base": {
     "description": "The bottom nosing line [[x, y], [x, y]], left to right looking up.",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "maxItems": 2,
     "minItems": 2,
     "title": "Base",
     "type": "array"
    },
    "dir": {
     "anyOf": [
      {
       "items": {
        "maximum": 1000,
        "minimum": -1000,
        "type": "integer"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The plan direction of travel up [dx, dy] (integers in lowest terms); required for a straight flight.",
     "title": "Dir"
    },
    "z": {
     "description": "[bottom, top]: the finished floor it starts from and the one it reaches, above the level datum.",
     "items": {
      "type": "number"
     },
     "maxItems": 2,
     "minItems": 2,
     "title": "Z",
     "type": "array"
    },
    "risers": {
     "description": "The number of risers (one more than the treads); the editor's stair generator writes it.",
     "maximum": 1000,
     "minimum": 1,
     "title": "Risers",
     "type": "integer"
    },
    "goings": {
     "description": "Tread depths: one value = uniform, else one per tread; [] with steps.",
     "items": {
      "exclusiveMinimum": 0,
      "type": "number"
     },
     "title": "Goings",
     "type": "array"
    },
    "steps": {
     "description": "Winders and irregular steps: one per riser, bottom to top; excludes goings.",
     "items": {
      "$ref": "#/$defs/Step"
     },
     "maxItems": 1000,
     "title": "Steps",
     "type": "array"
    },
    "outline": {
     "description": "Its plan outline [[x, y], ...] counter-clockwise; required for a flight that is not straight, [] = derived from base, dir and goings.",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "title": "Outline",
     "type": "array"
    }
   },
   "required": [
    "id",
    "level",
    "base",
    "z",
    "risers"
   ],
   "title": "Flight",
   "type": "object"
  },
  "FloorPatch": {
   "additionalProperties": false,
   "description": "A floor patch of a space: the rest of the space (no placement: the space's own floor height and slope) or a part of its floor placed by one of ring, near, edges, divide, with its own name, finish, the finish of the wall faces along it and its height (missing: the height of what it lies on).",
   "properties": {
    "id": {
     "description": "Identifier of this floor patch, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 100,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A short label people use (\"kitchen\", \"hearth\").",
     "title": "Name"
    },
    "ring": {
     "description": "Placement (d), a free shape: [[x, y], ...] counter-clockwise; [] with no other placement = the rest of the space.",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "title": "Ring",
     "type": "array"
    },
    "holes": {
     "description": "Holes of the free shape, each clockwise.",
     "items": {
      "items": {
       "items": {
        "type": "number"
       },
       "type": "array"
      },
      "type": "array"
     },
     "maxItems": 64,
     "title": "Holes",
     "type": "array"
    },
    "on": {
     "description": "The points of the free shape on wall faces toward the room: they follow those walls.",
     "items": {
      "$ref": "#/$defs/OnWall"
     },
     "maxItems": 256,
     "title": "On",
     "type": "array"
    },
    "near": {
     "anyOf": [
      {
       "$ref": "#/$defs/Near"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Placement (a): in front of or around things."
    },
    "edges": {
     "anyOf": [
      {
       "$ref": "#/$defs/Edges"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Placement (b): a band in from the walls."
    },
    "divide": {
     "anyOf": [
      {
       "$ref": "#/$defs/Divide"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Placement (c): one side of a dividing line."
    },
    "finish": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The part's finish; null = the finish of what it lies on shows. Not on the rest patch.",
     "title": "Finish"
    },
    "walls": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The finish of the room's wall faces along the part; null = the room's. Not on the rest patch.",
     "title": "Walls"
    },
    "z": {
     "anyOf": [
      {
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Finished floor height above the level datum at at (a horizontal patch: everywhere); null = a part keeps the height of what it lies on, the rest patch is at the level's floor.",
     "title": "Z"
    },
    "from": {
     "anyOf": [
      {
       "enum": [
        "datum",
        "ground"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "What z is measured from: datum (the level datum) | ground (the ground outside: 0 = level with it; on an at-grade level only); null = datum.",
     "title": "From",
     "x-bldg-scope": "document"
    },
    "at": {
     "anyOf": [
      {
       "items": {
        "type": "number"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The point [x, y] where z holds; required with slope, absent without.",
     "title": "At"
    },
    "slope": {
     "anyOf": [
      {
       "$ref": "#/$defs/Slope"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The plane's slope; null = horizontal."
    }
   },
   "required": [
    "id"
   ],
   "title": "FloorPatch",
   "type": "object"
  },
  "Frame": {
   "additionalProperties": false,
   "description": "The frame of an opening type: its width at each jamb and at the head (in the wall plane, from the rough edge inwards),\nhow far each stop projects into the frame opening, its depth across the wall and where it sits in the wall.",
   "properties": {
    "jamb": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Frame width at each jamb (shims included); 0 = no frame.",
     "title": "Jamb"
    },
    "head": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Frame width at the head.",
     "title": "Head"
    },
    "sill": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Frame width at the sill (a window's: from the rough opening's bottom up); null = unknown.",
     "title": "Sill"
    },
    "stop": {
     "anyOf": [
      {
       "items": {
        "minimum": 0,
        "type": "number"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How far each stop projects into the frame opening: [hinge side, latch side].",
     "title": "Stop"
    },
    "depth": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Frame depth across the wall; null = the wall's thickness.",
     "title": "Depth"
    },
    "align": {
     "default": "center",
     "description": "The plane offset is measured from: center = the wall's centre plane, A / B = that face (the frame's face flush with it).",
     "enum": [
      "A",
      "B",
      "center"
     ],
     "title": "Align",
     "type": "string"
    },
    "offset": {
     "default": 0.0,
     "description": "From that plane, + towards side A.",
     "title": "Offset",
     "type": "number"
    }
   },
   "title": "Frame",
   "type": "object"
  },
  "Georef": {
   "additionalProperties": false,
   "description": "Places the document frame in a projected CRS (IfcMapConversion): E = eastings + scale*(x cos r - y sin r),\nN = northings + scale*(x sin r + y cos r), r = rotation.",
   "properties": {
    "epsg": {
     "description": "EPSG code of a projected CRS, e.g. 2056.",
     "maximum": 999999,
     "minimum": 1024,
     "title": "Epsg",
     "type": "integer"
    },
    "eastings": {
     "description": "CRS easting of the plan origin (IfcMapConversion.Eastings).",
     "title": "Eastings",
     "type": "number"
    },
    "northings": {
     "description": "CRS northing of the plan origin (IfcMapConversion.Northings).",
     "title": "Northings",
     "type": "number"
    },
    "rotation": {
     "default": 0.0,
     "description": "Counter-clockwise angle from plan +x to CRS east.",
     "maximum": 360,
     "minimum": -360,
     "title": "Rotation",
     "type": "number"
    },
    "scale": {
     "description": "CRS units per document unit (metres: 0.001 in mm documents, 0.0254 in inch documents); required: it depends on the document unit.",
     "exclusiveMinimum": 0,
     "title": "Scale",
     "type": "number"
    }
   },
   "required": [
    "epsg",
    "eastings",
    "northings",
    "scale"
   ],
   "title": "Georef",
   "type": "object"
  },
  "GridLine": {
   "additionalProperties": false,
   "description": "A structural grid line (axis) with its label as drawn, e.g. A or 3.",
   "properties": {
    "id": {
     "description": "Identifier of this element, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "label": {
     "maxLength": 8,
     "minLength": 1,
     "title": "Label",
     "type": "string"
    },
    "x0": {
     "title": "X0",
     "type": "number"
    },
    "y0": {
     "title": "Y0",
     "type": "number"
    },
    "x1": {
     "title": "X1",
     "type": "number"
    },
    "y1": {
     "title": "Y1",
     "type": "number"
    },
    "bubbles": {
     "default": "both",
     "description": "The ends that show the labelled bubble (the BIM per-end bubble toggle): both | start (the (x0, y0) end) | end (the (x1, y1) end) | none.",
     "enum": [
      "both",
      "start",
      "end",
      "none"
     ],
     "title": "Bubbles",
     "type": "string",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "label",
    "x0",
    "y0",
    "x1",
    "y1"
   ],
   "title": "GridLine",
   "type": "object"
  },
  "Group": {
   "additionalProperties": false,
   "description": "A set of records: a dwelling unit, an occupancy, a fire area, a tenancy, an open-plan area ... Its members\nmay lie on any level; a record may belong to several groups.",
   "properties": {
    "id": {
     "description": "Identifier of this group, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "kind": {
     "description": "What the group is: dwelling_unit | sleeping_unit | occupancy (spaces) | fire_area | fire_compartment | smoke_compartment | control_area (spaces, walls) | fire_wall_assembly (walls) | tenancy | common_area | toilet_cluster | core | structural_core | open_plan (spaces) | dormer | corner_window | bay_window (walls, openings) | thermal_zone | hvac_zone | lighting_zone | fire_alarm_zone | sprinkler_zone | smoke_control_zone (spaces) | seating_row | casework_run | typical | requirement | divisible_space | protected_area | other (any record).",
     "enum": [
      "dwelling_unit",
      "sleeping_unit",
      "occupancy",
      "fire_area",
      "fire_compartment",
      "smoke_compartment",
      "control_area",
      "fire_wall_assembly",
      "tenancy",
      "common_area",
      "toilet_cluster",
      "core",
      "structural_core",
      "open_plan",
      "dormer",
      "corner_window",
      "bay_window",
      "thermal_zone",
      "hvac_zone",
      "lighting_zone",
      "fire_alarm_zone",
      "sprinkler_zone",
      "smoke_control_zone",
      "seating_row",
      "casework_run",
      "typical",
      "requirement",
      "divisible_space",
      "protected_area",
      "other"
     ],
     "title": "Kind",
     "type": "string"
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 200,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its name, e.g. Unit 2.01; null = none.",
     "title": "Name"
    },
    "parent": {
     "anyOf": [
      {
       "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The enclosing group or building; null = none.",
     "title": "Parent"
    },
    "members": {
     "description": "Its members, each once.",
     "items": {
      "$ref": "#/$defs/Member"
     },
     "title": "Members",
     "type": "array"
    },
    "class": {
     "anyOf": [
      {
       "$ref": "#/$defs/GroupClass"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its classification by system (the IBC occupancy group of an occupancy); null = unknown."
    },
    "unit": {
     "anyOf": [
      {
       "$ref": "#/$defs/Unit"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A dwelling or sleeping unit's accessibility classes, entrances and type label; null = none (only units have one)."
    },
    "strategy": {
     "anyOf": [
      {
       "enum": [
        "separated",
        "nonseparated",
        "accessory"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "An occupancy's separation from the other occupancies: separated | nonseparated | accessory; null = unknown (only occupancies have one).",
     "title": "Strategy"
    }
   },
   "required": [
    "id",
    "kind"
   ],
   "title": "Group",
   "type": "object"
  },
  "GroupClass": {
   "additionalProperties": false,
   "description": "The classification of a group, keyed by classification system; null = unknown.",
   "properties": {
    "ibc_occ": {
     "anyOf": [
      {
       "enum": [
        "A-1",
        "A-2",
        "A-3",
        "A-4",
        "A-5",
        "B",
        "E",
        "F-1",
        "F-2",
        "H-1",
        "H-2",
        "H-3",
        "H-4",
        "H-5",
        "I-1",
        "I-2",
        "I-3",
        "I-4",
        "M",
        "R-1",
        "R-2",
        "R-3",
        "R-4",
        "S-1",
        "S-2",
        "U"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "IBC occupancy group (an occupancy group: A-1 ... U); null = unknown.",
     "title": "Ibc Occ"
    }
   },
   "title": "GroupClass",
   "type": "object"
  },
  "InsideFinish": {
   "additionalProperties": false,
   "description": "The house's interior door leaves and its interior trim (door and window frames and casings, a flight's risers).",
   "properties": {
    "doors": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Interior door leaves (both faces).",
     "title": "Doors"
    },
    "trim": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Interior door and window frames and casings, and a flight's risers.",
     "title": "Trim"
    },
    "rails": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Every railing in an indoor space or along an indoor flight.",
     "title": "Rails"
    }
   },
   "title": "InsideFinish",
   "type": "object"
  },
  "IssuedMarks": {
   "additionalProperties": false,
   "description": "The last schedule code number issued per prefix (the drawing styles' prefixes); it only ever grows.",
   "properties": {
    "WD": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last WD code number issued.",
     "title": "Wd"
    },
    "LVT": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last LVT code number issued.",
     "title": "Lvt"
    },
    "CT": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last CT code number issued.",
     "title": "Ct"
    },
    "ST": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last ST code number issued.",
     "title": "St"
    },
    "CPT": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last CPT code number issued.",
     "title": "Cpt"
    },
    "CONC": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last CONC code number issued.",
     "title": "Conc"
    },
    "EP": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last EP code number issued.",
     "title": "Ep"
    },
    "PV": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last PV code number issued.",
     "title": "Pv"
    },
    "DK": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last DK code number issued.",
     "title": "Dk"
    },
    "PT": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last PT code number issued.",
     "title": "Pt"
    },
    "PNL": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last PNL code number issued.",
     "title": "Pnl"
    },
    "B": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last B code number issued.",
     "title": "B"
    },
    "TR": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last TR code number issued.",
     "title": "Tr"
    },
    "DR": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last DR code number issued.",
     "title": "Dr"
    },
    "SID": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last SID code number issued.",
     "title": "Sid"
    },
    "STU": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last STU code number issued.",
     "title": "Stu"
    },
    "BRK": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last BRK code number issued.",
     "title": "Brk"
    },
    "RF": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last RF code number issued.",
     "title": "Rf"
    },
    "F": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last F code number issued.",
     "title": "F"
    },
    "W": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last W code number issued.",
     "title": "W"
    },
    "C": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last C code number issued.",
     "title": "C"
    },
    "T": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last T code number issued.",
     "title": "T"
    },
    "R": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last R code number issued.",
     "title": "R"
    },
    "FAB": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last FAB code number issued.",
     "title": "FAB"
    },
    "LTH": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last LTH code number issued.",
     "title": "LTH"
    },
    "MTL": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last MTL code number issued.",
     "title": "MTL"
    },
    "GL": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last GL code number issued.",
     "title": "GL"
    },
    "CER": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last CER code number issued.",
     "title": "CER"
    },
    "APL": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last APL code number issued.",
     "title": "APL"
    },
    "WIN": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last WIN code number issued.",
     "title": "WIN"
    },
    "M": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last M code number issued.",
     "title": "M"
    }
   },
   "title": "IssuedMarks",
   "type": "object"
  },
  "Landing": {
   "additionalProperties": false,
   "description": "An intermediate landing of a stair (a landing at a floor level is a floor and a space): its plan ring and the height of its walking surface.",
   "properties": {
    "id": {
     "description": "Identifier of this landing, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "level": {
     "description": "The level whose datum its z is above.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Level",
     "type": "string"
    },
    "ring": {
     "description": "Its plan outline [[x, y], ...] counter-clockwise.",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "minItems": 3,
     "title": "Ring",
     "type": "array"
    },
    "z": {
     "description": "The height of its walking surface above the level datum.",
     "title": "Z",
     "type": "number"
    }
   },
   "required": [
    "id",
    "level",
    "ring",
    "z"
   ],
   "title": "Landing",
   "type": "object"
  },
  "Layer": {
   "additionalProperties": false,
   "description": "One layer of a construction: its function, thickness and material, the framing as thick as the layer.",
   "properties": {
    "fn": {
     "description": "Its function: structure, core, insulation, sheathing, cladding, render, finish, membrane ...",
     "enum": [
      "structure",
      "core",
      "insulation",
      "air_barrier",
      "vapour_retarder",
      "waterproofing",
      "breather_membrane",
      "sheathing",
      "cavity",
      "cladding",
      "render",
      "substrate",
      "furring",
      "channel",
      "finish",
      "bedding",
      "adhesive",
      "membrane",
      "screed",
      "underlay",
      "backer",
      "void",
      "root_barrier",
      "drainage",
      "filter",
      "growing_medium",
      "vegetation",
      "protection",
      "ballast",
      "gravel",
      "separation",
      "pedestal"
     ],
     "title": "Fn",
     "type": "string"
    },
    "t": {
     "description": "Thickness; 0 for a membrane.",
     "minimum": 0,
     "title": "T",
     "type": "number"
    },
    "mat": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Id of its material (a materials row or bldg:material.*); null = unknown.",
     "title": "Mat",
     "x-bldg-scope": "document"
    },
    "finish": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "What the layer looks like where it is exposed: the outermost layer's finish is the wall type's own look on that side.",
     "title": "Finish",
     "x-bldg-scope": "document"
    },
    "frame": {
     "anyOf": [
      {
       "$ref": "#/$defs/LayerFrame"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Studs or joists as thick as the layer.",
     "title": "Frame",
     "x-bldg-scope": "document"
    },
    "taper": {
     "default": false,
     "description": "The falls-forming layer that absorbs a given surface z.",
     "title": "Taper",
     "type": "boolean",
     "x-bldg-scope": "document"
    },
    "plenum": {
     "anyOf": [
      {
       "$ref": "#/$defs/Plenum"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The layer is a return-air plenum.",
     "title": "Plenum",
     "x-bldg-scope": "document"
    },
    "reaction": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Reaction"
       },
       "maxItems": 8,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its own reaction to fire (a cored panel); null = its material's.",
     "title": "Reaction",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "fn",
    "t"
   ],
   "title": "Layer",
   "type": "object"
  },
  "LayerFrame": {
   "additionalProperties": false,
   "description": "Studs or joists as thick as their layer: section, material, spacing, where the spacing starts, plates, cavity material.",
   "properties": {
    "section": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Section"
    },
    "mat": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Mat"
    },
    "spacing": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Spacing"
    },
    "origin": {
     "default": "start",
     "enum": [
      "start",
      "end",
      "center"
     ],
     "title": "Origin",
     "type": "string"
    },
    "justify": {
     "anyOf": [
      {
       "enum": [
        "start",
        "end",
        "center"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Justify"
    },
    "plates": {
     "anyOf": [
      {
       "items": {
        "maximum": 8,
        "minimum": 0,
        "type": "integer"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Plates"
    },
    "cavity_mat": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Cavity Mat"
    },
    "staggered": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Staggered"
    }
   },
   "title": "LayerFrame",
   "type": "object"
  },
  "Layout": {
   "additionalProperties": false,
   "description": "How an opening type's rough opening is divided.",
   "properties": {
    "split": {
     "description": "v: vertical split lines (mullions), at from the start-side edge; h: horizontal ones (transoms), from the bottom edge.",
     "enum": [
      "v",
      "h"
     ],
     "title": "Split",
     "type": "string"
    },
    "at": {
     "description": "The distances of the split lines from that edge, increasing: lengths in the document unit (v: along the rough width; h: heights, like rough.h).",
     "items": {
      "exclusiveMinimum": 0,
      "type": "number"
     },
     "maxItems": 8,
     "minItems": 1,
     "title": "At",
     "type": "array"
    }
   },
   "required": [
    "split",
    "at"
   ],
   "title": "Layout",
   "type": "object"
  },
  "Leaf": {
   "additionalProperties": false,
   "description": "One leaf of an opening type (a door leaf, a window sash).",
   "properties": {
    "w": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Leaf width.",
     "title": "W"
    },
    "h": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Leaf height.",
     "title": "H"
    },
    "t": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Leaf thickness.",
     "title": "T"
    },
    "op": {
     "anyOf": [
      {
       "enum": [
        "swing",
        "slide",
        "hung",
        "tilt",
        "tilt_turn",
        "awning",
        "hopper",
        "pivot",
        "fold",
        "fixed",
        "coil",
        "lift"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How it operates: swing | slide | hung | tilt | tilt_turn | awning | hopper | pivot | fold | fixed | coil | lift.",
     "title": "Op"
    },
    "active": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "An active leaf (of a pair: the one that opens first); null = unknown.",
     "title": "Active"
    },
    "sash": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Sash face width (windows).",
     "title": "Sash"
    }
   },
   "title": "Leaf",
   "type": "object"
  },
  "Level": {
   "additionalProperties": false,
   "description": "One storey with its own node pool and elements (listed in generation order: what is referenced first).",
   "properties": {
    "id": {
     "description": "Identifier of this element, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "name": {
     "title": "Name",
     "type": "string"
    },
    "building": {
     "anyOf": [
      {
       "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The building it belongs to; null = the only project building (with no building rows: the one implicit building).",
     "title": "Building",
     "x-bldg-scope": "document"
    },
    "elevation": {
     "default": 0.0,
     "description": "Datum of this level: the project elevation of the top of its structural slab.",
     "title": "Elevation",
     "type": "number",
     "x-bldg-scope": "detail"
    },
    "height": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Storey height to the next datum; null = metadata.defaults / the typical set's storey height.",
     "title": "Height",
     "x-bldg-scope": "detail"
    },
    "floor": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Finish build-up above the datum: the finished floor of its spaces, which sills are measured from; null = the typical set's.",
     "title": "Floor",
     "x-bldg-scope": "detail"
    },
    "ceiling": {
     "anyOf": [
      {
       "$ref": "#/$defs/LevelCeiling"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The ceiling its spaces inside inherit (a space's ceiling patches are the exceptions; a space outdoors, exterior, lot or semi-outdoor, inherits none); null = no ceiling.",
     "x-bldg-scope": "detail"
    },
    "slab_thickness": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Floor slab thickness below elevation (0 = no slab); null = the typical set's.",
     "title": "Slab Thickness",
     "x-bldg-scope": "detail"
    },
    "wall_angles": {
     "description": "Snap directions of the walls: degrees counter-clockwise from +x, each in [0, 180); each stands for itself and its perpendicular, any number of them. Empty = each level detects its own.",
     "items": {
      "type": "number"
     },
     "title": "Wall Angles",
     "type": "array"
    },
    "nodes": {
     "description": "Wall end points (empty in a new, blank plan).",
     "items": {
      "$ref": "#/$defs/Node"
     },
     "title": "Nodes",
     "type": "array"
    },
    "walls": {
     "items": {
      "$ref": "#/$defs/Wall"
     },
     "title": "Walls",
     "type": "array"
    },
    "spaces": {
     "items": {
      "$ref": "#/$defs/Space"
     },
     "title": "Spaces",
     "type": "array"
    },
    "openings": {
     "items": {
      "$ref": "#/$defs/Opening"
     },
     "title": "Openings",
     "type": "array"
    },
    "components": {
     "items": {
      "$ref": "#/$defs/Component"
     },
     "title": "Components",
     "type": "array"
    },
    "rails": {
     "description": "Handrails, guards and grab bars.",
     "items": {
      "$ref": "#/$defs/Rail"
     },
     "title": "Rails",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "slabs": {
     "description": "Roofs and canopies.",
     "items": {
      "$ref": "#/$defs/Slab"
     },
     "title": "Slabs",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "dimensions": {
     "items": {
      "$ref": "#/$defs/Dimension"
     },
     "title": "Dimensions",
     "type": "array"
    },
    "grid": {
     "items": {
      "$ref": "#/$defs/GridLine"
     },
     "title": "Grid",
     "type": "array"
    },
    "texts": {
     "items": {
      "$ref": "#/$defs/Text"
     },
     "title": "Texts",
     "type": "array"
    },
    "underlay": {
     "default": "",
     "description": "The raster source drawn under this level; \"\" = the first raster source with a scale.",
     "maxLength": 64,
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63})?$",
     "title": "Underlay",
     "type": "string",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "name",
    "nodes"
   ],
   "title": "Level",
   "type": "object"
  },
  "LevelCeiling": {
   "additionalProperties": false,
   "description": "The ceiling a level's spaces inside inherit (not the ones outdoors): its height above the level datum.",
   "properties": {
    "id": {
     "description": "Identifier of this ceiling, unique across the whole plan (e.g. L1c).",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "z": {
     "description": "Ceiling height above the level datum (the top of the structural slab).",
     "exclusiveMinimum": 0,
     "title": "Z",
     "type": "number"
    }
   },
   "required": [
    "id",
    "z"
   ],
   "title": "LevelCeiling",
   "type": "object"
  },
  "LibraryPin": {
   "additionalProperties": false,
   "description": "The library version the document pins (§9.2): its name and its <major>.<minor> version. Missing: the engine's bundled version.",
   "properties": {
    "name": {
     "description": "The library: \"bldg-std\".",
     "enum": [
      "bldg-std"
     ],
     "title": "Name",
     "type": "string"
    },
    "version": {
     "description": "Its version <major>.<minor> (\"2026.2\").",
     "pattern": "^[0-9]{4}\\.[0-9]{1,3}$",
     "title": "Version",
     "type": "string"
    }
   },
   "required": [
    "name",
    "version"
   ],
   "title": "LibraryPin",
   "type": "object"
  },
  "ListedFire": {
   "additionalProperties": false,
   "description": "A listed fire-resistance rating in minutes: the side it holds from, its criteria, standard and restraint.",
   "properties": {
    "min": {
     "exclusiveMinimum": 0,
     "maximum": 1440,
     "title": "Min",
     "type": "number"
    },
    "side": {
     "anyOf": [
      {
       "enum": [
        "A",
        "B",
        "both"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Side"
    },
    "crit": {
     "items": {
      "enum": [
       "R",
       "E",
       "I",
       "I1",
       "I2",
       "W",
       "M",
       "S",
       "C"
      ],
      "type": "string"
     },
     "maxItems": 9,
     "title": "Crit",
     "type": "array"
    },
    "std": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Std"
    },
    "restraint": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Restraint"
    }
   },
   "required": [
    "min"
   ],
   "title": "ListedFire",
   "type": "object"
  },
  "Location": {
   "additionalProperties": false,
   "description": "The approximate site of the project in WGS84 decimal degrees (document-only), for analyses of sun, daylight\nand climate with true_north; not georef, which places the model precisely.",
   "properties": {
    "lat": {
     "description": "Latitude in WGS84 decimal degrees, north positive; stored to 7 decimals.",
     "maximum": 90,
     "minimum": -90,
     "title": "Lat",
     "type": "number"
    },
    "lon": {
     "description": "Longitude in WGS84 decimal degrees, east positive; stored to 7 decimals.",
     "maximum": 180,
     "minimum": -180,
     "title": "Lon",
     "type": "number"
    }
   },
   "required": [
    "lat",
    "lon"
   ],
   "title": "Location",
   "type": "object"
  },
  "Material": {
   "additionalProperties": false,
   "description": "A material: its class, standard and grade, combustibility, reaction to fire, density, the properties of its class and how drawings show it.",
   "properties": {
    "id": {
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "class": {
     "anyOf": [
      {
       "enum": [
        "concrete",
        "steel",
        "metal",
        "timber",
        "masonry",
        "gypsum",
        "glass",
        "insulation",
        "membrane",
        "stone",
        "ceramic",
        "polymer",
        "textile",
        "soil",
        "plant",
        "other"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Class"
    },
    "std": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Std"
    },
    "grade": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Grade"
    },
    "combustible": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Combustible"
    },
    "reaction": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Reaction"
       },
       "maxItems": 8,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Reaction"
    },
    "density": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Density"
    },
    "structural": {
     "anyOf": [
      {
       "$ref": "#/$defs/MaterialStructural"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Structural"
    },
    "concrete": {
     "anyOf": [
      {
       "$ref": "#/$defs/MaterialConcrete"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Concrete"
    },
    "timber": {
     "anyOf": [
      {
       "$ref": "#/$defs/MaterialTimber"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Timber"
    },
    "masonry": {
     "anyOf": [
      {
       "$ref": "#/$defs/MaterialMasonry"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Masonry"
    },
    "thermal": {
     "anyOf": [
      {
       "$ref": "#/$defs/MaterialThermal"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Thermal"
    },
    "acoustic": {
     "anyOf": [
      {
       "$ref": "#/$defs/MaterialAcoustic"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Acoustic"
    },
    "optical": {
     "anyOf": [
      {
       "$ref": "#/$defs/MaterialOptical"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Optical"
    },
    "glass": {
     "anyOf": [
      {
       "$ref": "#/$defs/MaterialGlass"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Glass"
    },
    "waterproof": {
     "anyOf": [
      {
       "$ref": "#/$defs/MaterialWaterproof"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Waterproof"
    },
    "appearance": {
     "anyOf": [
      {
       "$ref": "#/$defs/MaterialAppearance"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Appearance"
    },
    "draw": {
     "anyOf": [
      {
       "$ref": "#/$defs/MaterialDraw"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Draw"
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 100,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Name"
    },
    "note": {
     "anyOf": [
      {
       "maxLength": 500,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Note"
    }
   },
   "required": [
    "id"
   ],
   "title": "Material",
   "type": "object"
  },
  "MaterialAcoustic": {
   "additionalProperties": false,
   "description": "Sound absorption per octave band (125 to 4000 Hz) and the noise reduction coefficient.",
   "properties": {
    "alpha": {
     "anyOf": [
      {
       "items": {
        "maximum": 1.5,
        "minimum": 0,
        "type": "number"
       },
       "maxItems": 6,
       "minItems": 6,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Alpha"
    },
    "nrc": {
     "anyOf": [
      {
       "maximum": 1.5,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Nrc"
    }
   },
   "title": "MaterialAcoustic",
   "type": "object"
  },
  "MaterialAppearance": {
   "additionalProperties": false,
   "description": "How a rendering shows the material (presentation).",
   "properties": {
    "color": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Color"
    },
    "roughness": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Roughness"
    },
    "metallic": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Metallic"
    },
    "opacity": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Opacity"
    },
    "texture": {
     "anyOf": [
      {
       "maxLength": 256,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Texture"
    }
   },
   "title": "MaterialAppearance",
   "type": "object"
  },
  "MaterialConcrete": {
   "additionalProperties": false,
   "description": "What a concrete is made of.",
   "properties": {
    "aggregate": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Aggregate"
    },
    "lightweight": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Lightweight"
    },
    "impermeability": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Impermeability"
    },
    "cement": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Cement"
    }
   },
   "title": "MaterialConcrete",
   "type": "object"
  },
  "MaterialDraw": {
   "additionalProperties": false,
   "description": "How a drawing shows the material (presentation): the hatch of its cut and its surface pattern.",
   "properties": {
    "cut_hatch": {
     "anyOf": [
      {
       "maxLength": 32,
       "pattern": "^[a-z][a-z0-9_]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Cut Hatch"
    },
    "surface_pattern": {
     "anyOf": [
      {
       "maxLength": 32,
       "pattern": "^[a-z][a-z0-9_]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Surface Pattern"
    }
   },
   "title": "MaterialDraw",
   "type": "object"
  },
  "MaterialGlass": {
   "additionalProperties": false,
   "description": "A glass's kind and coating.",
   "properties": {
    "kind": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Kind"
    },
    "coating": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Coating"
    }
   },
   "title": "MaterialGlass",
   "type": "object"
  },
  "MaterialMasonry": {
   "additionalProperties": false,
   "description": "A masonry's unit, grout and mortar grade.",
   "properties": {
    "unit": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Unit"
    },
    "grout": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Grout"
    },
    "mortar_grade": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Mortar Grade"
    }
   },
   "title": "MaterialMasonry",
   "type": "object"
  },
  "MaterialOptical": {
   "additionalProperties": false,
   "description": "Light reflectance, solar reflectance and emittance.",
   "properties": {
    "lrv": {
     "anyOf": [
      {
       "maximum": 100,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Lrv"
    },
    "solar_reflectance": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Solar Reflectance"
    },
    "emittance": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Emittance"
    }
   },
   "title": "MaterialOptical",
   "type": "object"
  },
  "MaterialStructural": {
   "additionalProperties": false,
   "description": "Strengths and stiffness: fc, fy, fu, e (MPa in mm documents, ksi in inch documents).",
   "properties": {
    "fc": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Fc"
    },
    "fy": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Fy"
    },
    "fu": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Fu"
    },
    "e": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "E"
    }
   },
   "title": "MaterialStructural",
   "type": "object"
  },
  "MaterialThermal": {
   "additionalProperties": false,
   "description": "Thermal conductivity, specific heat and vapour resistance factor.",
   "properties": {
    "lambda": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Lambda"
    },
    "cp": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Cp"
    },
    "mu": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Mu"
    }
   },
   "title": "MaterialThermal",
   "type": "object"
  },
  "MaterialTimber": {
   "additionalProperties": false,
   "description": "A timber's species, grade and product.",
   "properties": {
    "species": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Species"
    },
    "grade": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Grade"
    },
    "product": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Product"
    }
   },
   "title": "MaterialTimber",
   "type": "object"
  },
  "MaterialWaterproof": {
   "additionalProperties": false,
   "description": "A waterproofing's grade and standard.",
   "properties": {
    "grade": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Grade"
    },
    "std": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Std"
    }
   },
   "title": "MaterialWaterproof",
   "type": "object"
  },
  "Member": {
   "additionalProperties": false,
   "description": "One member of a group: the id of a record of the plan (on any level) and its role in the group.",
   "properties": {
    "ref": {
     "description": "Id of the member: a space (a wall of a fire area ...), on any level.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Ref",
     "type": "string"
    },
    "role": {
     "anyOf": [
      {
       "pattern": "^[a-z][a-z0-9_]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its role in the group; null = none.",
     "title": "Role"
    }
   },
   "required": [
    "ref"
   ],
   "title": "Member",
   "type": "object"
  },
  "Metadata": {
   "additionalProperties": false,
   "description": "Global metadata: drawing conventions, north (the units and every provenance field are document-only).",
   "properties": {
    "schema_version": {
     "const": "bldg/0.2",
     "description": "The format version: \"bldg/0.2\" (a \"bldg/0.1\" document is migrated on read).",
     "title": "Schema Version",
     "type": "string",
     "x-bldg-scope": "document"
    },
    "units": {
     "description": "Document unit of every length: mm | in, +y up (canonical mm 2 decimals, in 4 decimals).",
     "enum": [
      "mm",
      "in"
     ],
     "title": "Units",
     "type": "string",
     "x-bldg-scope": "document"
    },
    "stage": {
     "anyOf": [
      {
       "enum": [
        "concept",
        "schematic",
        "design_development",
        "construction_documents",
        "as_built"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The declared design stage: concept | schematic | design_development | construction_documents | as_built; informational (it changes no geometry, validity or verdict); null = not declared.",
     "title": "Stage",
     "x-bldg-scope": "document"
    },
    "jurisdiction": {
     "anyOf": [
      {
       "pattern": "^[A-Z]{2}(-[A-Z0-9]{1,3})?$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "ISO 3166-1 country or 3166-2 subdivision code of where the building is (US, US-CA, CN-SH); null = not known. It implies the typical set and the drawing style (US: us_residential and us, CN: cn_residential and gb, any other: international), the unit of a new plan, in China the GB/T 50353 area estimate, and the rule packs that run.",
     "title": "Jurisdiction"
    },
    "codes": {
     "description": "Optional rule packs to run, lowercase ids with their edition (ibc2027, irc2024, ada2010; irc2024 replaces ibc2027), each once.",
     "items": {
      "pattern": "^[a-z][a-z0-9_]{0,63}$",
      "type": "string"
     },
     "maxItems": 64,
     "title": "Codes",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "work": {
     "anyOf": [
      {
       "enum": [
        "new",
        "addition",
        "alteration",
        "change_of_occupancy",
        "existing"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "What the project does to the building: new | addition | alteration | change_of_occupancy | existing (the existing building as it is); null = unknown.",
     "title": "Work",
     "x-bldg-scope": "document"
    },
    "project": {
     "anyOf": [
      {
       "$ref": "#/$defs/Project"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The project the document describes: its name, number and address (annotation); null = not given.",
     "x-bldg-scope": "document"
    },
    "location": {
     "anyOf": [
      {
       "$ref": "#/$defs/Location"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The approximate site (WGS84 latitude / longitude), for analyses of sun, daylight and climate; not georef and not the jurisdiction; null = unknown.",
     "x-bldg-scope": "document"
    },
    "typicals": {
     "anyOf": [
      {
       "enum": [
        "bldg:typical_set.international",
        "bldg:typical_set.cn_residential",
        "bldg:typical_set.us_residential"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The typical set that fills what the plan does not show (storey and door heights, window sills, the typical door, stairs, size sets, furniture): bldg:typical_set.international | bldg:typical_set.cn_residential | bldg:typical_set.us_residential; null = the jurisdiction's.",
     "title": "Typicals",
     "x-bldg-scope": "document"
    },
    "true_north": {
     "anyOf": [
      {
       "maximum": 360,
       "minimum": -360,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "North arrow: angle in degrees, counter-clockwise from plan up to true north; null if not shown.",
     "title": "True North"
    },
    "coverage": {
     "description": "Completeness statements: how complete each collection is (given by the caller: ingest(coverage=...), importers); a collection no row speaks of is unknown.",
     "items": {
      "$ref": "#/$defs/Coverage"
     },
     "maxItems": 256,
     "title": "Coverage",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "document_id": {
     "anyOf": [
      {
       "pattern": "^[A-Za-z0-9_.:\\-]{1,64}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Stable document id (IFC GlobalIds); canonical_dict() assigns one.",
     "title": "Document Id",
     "x-bldg-scope": "document"
    },
    "defaults": {
     "$ref": "#/$defs/Defaults",
     "description": "Overrides of single typical-set defaults.",
     "x-bldg-scope": "document"
    },
    "draw": {
     "anyOf": [
      {
       "$ref": "#/$defs/Draw"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Presentation choices: the drawing style.",
     "x-bldg-scope": "document"
    },
    "display_units": {
     "default": "",
     "description": "Units lengths are shown and typed in: mm | cm | m | ft_in | in; \"\" = the document unit's (in: ft_in, mm: mm).",
     "enum": [
      "",
      "mm",
      "cm",
      "m",
      "ft_in",
      "in"
     ],
     "title": "Display Units",
     "type": "string",
     "x-bldg-scope": "document"
    },
    "display_precision": {
     "anyOf": [
      {
       "maximum": 256,
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Imperial units: fraction denominator 1 .. 256, a power of two (default 16 = 1/16\"); metric: decimals 0 .. 6. Null = the unit's default.",
     "title": "Display Precision",
     "x-bldg-scope": "document"
    },
    "sources": {
     "description": "Provenance of the plan.",
     "items": {
      "$ref": "#/$defs/Source"
     },
     "title": "Sources",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "georef": {
     "anyOf": [
      {
       "$ref": "#/$defs/Georef"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Position of the plan in a projected CRS.",
     "x-bldg-scope": "document"
    },
    "catalog": {
     "description": "Embedded definitions (bldg_catalog item or family format, mm) of the plugin models the component types use, so the plan opens anywhere; prepare_catalog() registers them (embedded_catalog() builds the list).",
     "items": {
      "anyOf": [
       {
        "additionalProperties": false,
        "properties": {
         "id": {
          "pattern": "^([a-z][a-z0-9_]{0,31}:)?[a-z0-9][a-z0-9_.-]{0,63}$",
          "type": "string"
         },
         "category": {
          "description": "semantic category (IFC class choice, clash exemptions)",
          "enum": [
           "furniture",
           "casework",
           "sanitary",
           "appliance",
           "equipment",
           "planting",
           "transport",
           "structure",
           "circulation",
           "other"
          ]
         },
         "groups": {
          "description": "palette browse groups (not a classification)",
          "items": {
           "enum": [
            "bedroom",
            "living",
            "dining",
            "office",
            "kitchen",
            "bathroom",
            "laundry",
            "utility",
            "structure",
            "other"
           ]
          },
          "maxItems": 10,
          "minItems": 1,
          "type": "array"
         },
         "names": {
          "additionalProperties": {
           "maxLength": 120,
           "minLength": 1,
           "type": "string"
          },
          "maxProperties": 32,
          "properties": {
           "en": {
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
           }
          },
          "propertyNames": {
           "pattern": "^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$"
          },
          "required": [
           "en"
          ],
          "type": "object"
         },
         "width": {
          "exclusiveMinimum": 0,
          "maximum": 50000,
          "type": "number"
         },
         "depth": {
          "exclusiveMinimum": 0,
          "maximum": 50000,
          "type": "number"
         },
         "height": {
          "exclusiveMinimum": 0,
          "maximum": 50000,
          "type": "number"
         },
         "clearances": {
          "items": {
           "additionalProperties": false,
           "properties": {
            "side": {
             "enum": [
              "front",
              "back",
              "left",
              "right"
             ]
            },
            "depth": {
             "exclusiveMinimum": 0,
             "maximum": 50000,
             "type": "number"
            },
            "width": {
             "exclusiveMinimum": 0,
             "maximum": 50000,
             "type": "number"
            },
            "offset": {
             "maximum": 50000,
             "minimum": -50000,
             "type": "number"
            },
            "note": {
             "maxLength": 200,
             "type": "string"
            }
           },
           "required": [
            "side",
            "depth"
           ],
           "type": "object"
          },
          "maxItems": 16,
          "type": "array"
         },
         "symbol": {
          "items": {
           "oneOf": [
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "rect"
              },
              "x0": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "y0": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "x1": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "y1": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "corner_radius": {
               "maximum": 50000,
               "minimum": 0,
               "type": "number"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              }
             },
             "required": [
              "shape",
              "x0",
              "y0",
              "x1",
              "y1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "circle"
              },
              "cx": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "cy": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "r": {
               "exclusiveMinimum": 0,
               "maximum": 50000,
               "type": "number"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              }
             },
             "required": [
              "shape",
              "cx",
              "cy",
              "r"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "line"
              },
              "x0": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "y0": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "x1": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "y1": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              }
             },
             "required": [
              "shape",
              "x0",
              "y0",
              "x1",
              "y1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "polyline"
              },
              "points": {
               "items": {
                "items": {
                 "maximum": 50000,
                 "minimum": -50000,
                 "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
               },
               "maxItems": 512,
               "minItems": 2,
               "type": "array"
              },
              "closed": {
               "type": "boolean"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              }
             },
             "required": [
              "shape",
              "points"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "arc"
              },
              "cx": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "cy": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "r": {
               "exclusiveMinimum": 0,
               "maximum": 50000,
               "type": "number"
              },
              "start_angle": {
               "maximum": 720,
               "minimum": -720,
               "type": "number"
              },
              "end_angle": {
               "maximum": 720,
               "minimum": -720,
               "type": "number"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              }
             },
             "required": [
              "shape",
              "cx",
              "cy",
              "r",
              "start_angle",
              "end_angle"
             ],
             "type": "object"
            }
           ]
          },
          "maxItems": 400,
          "minItems": 1,
          "type": "array"
         },
         "solids": {
          "items": {
           "oneOf": [
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "box"
              },
              "x0": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "y0": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "x1": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "y1": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "z0": {
               "maximum": 50000,
               "minimum": 0,
               "type": "number"
              },
              "z1": {
               "maximum": 50000,
               "minimum": 0,
               "type": "number"
              },
              "part": {
               "pattern": "^[a-z0-9_]{1,40}$",
               "type": "string"
              }
             },
             "required": [
              "shape",
              "x0",
              "y0",
              "x1",
              "y1",
              "z0",
              "z1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "cylinder"
              },
              "cx": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "cy": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "r": {
               "exclusiveMinimum": 0,
               "maximum": 50000,
               "type": "number"
              },
              "z0": {
               "maximum": 50000,
               "minimum": 0,
               "type": "number"
              },
              "z1": {
               "maximum": 50000,
               "minimum": 0,
               "type": "number"
              },
              "part": {
               "pattern": "^[a-z0-9_]{1,40}$",
               "type": "string"
              }
             },
             "required": [
              "shape",
              "cx",
              "cy",
              "r",
              "z0",
              "z1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "prism"
              },
              "points": {
               "items": {
                "items": {
                 "maximum": 50000,
                 "minimum": -50000,
                 "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
               },
               "maxItems": 512,
               "minItems": 3,
               "type": "array"
              },
              "z0": {
               "maximum": 50000,
               "minimum": 0,
               "type": "number"
              },
              "z1": {
               "maximum": 50000,
               "minimum": 0,
               "type": "number"
              },
              "part": {
               "pattern": "^[a-z0-9_]{1,40}$",
               "type": "string"
              }
             },
             "required": [
              "shape",
              "points",
              "z0",
              "z1"
             ],
             "type": "object"
            }
           ]
          },
          "maxItems": 400,
          "minItems": 1,
          "type": "array"
         },
         "swing_symbol": {
          "items": {
           "oneOf": [
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "rect"
              },
              "x0": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "y0": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "x1": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "y1": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "corner_radius": {
               "maximum": 50000,
               "minimum": 0,
               "type": "number"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              }
             },
             "required": [
              "shape",
              "x0",
              "y0",
              "x1",
              "y1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "circle"
              },
              "cx": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "cy": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "r": {
               "exclusiveMinimum": 0,
               "maximum": 50000,
               "type": "number"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              }
             },
             "required": [
              "shape",
              "cx",
              "cy",
              "r"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "line"
              },
              "x0": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "y0": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "x1": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "y1": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              }
             },
             "required": [
              "shape",
              "x0",
              "y0",
              "x1",
              "y1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "polyline"
              },
              "points": {
               "items": {
                "items": {
                 "maximum": 50000,
                 "minimum": -50000,
                 "type": "number"
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
               },
               "maxItems": 512,
               "minItems": 2,
               "type": "array"
              },
              "closed": {
               "type": "boolean"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              }
             },
             "required": [
              "shape",
              "points"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "arc"
              },
              "cx": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "cy": {
               "maximum": 50000,
               "minimum": -50000,
               "type": "number"
              },
              "r": {
               "exclusiveMinimum": 0,
               "maximum": 50000,
               "type": "number"
              },
              "start_angle": {
               "maximum": 720,
               "minimum": -720,
               "type": "number"
              },
              "end_angle": {
               "maximum": 720,
               "minimum": -720,
               "type": "number"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              }
             },
             "required": [
              "shape",
              "cx",
              "cy",
              "r",
              "start_angle",
              "end_angle"
             ],
             "type": "object"
            }
           ]
          },
          "maxItems": 20,
          "type": "array"
         },
         "size_source": {
          "maxLength": 300,
          "type": "string"
         },
         "orientation": {
          "enum": [
           "front",
           "axis_x",
           "none"
          ]
         },
         "mirrorable": {
          "type": "boolean"
         },
         "family": {
          "maxLength": 97,
          "type": "string"
         },
         "params": {
          "additionalProperties": {
           "type": [
            "number",
            "string",
            "boolean"
           ]
          },
          "maxProperties": 16,
          "type": "object"
         },
         "alt_sizes": {
          "items": {
           "items": {
            "exclusiveMinimum": 0,
            "maximum": 50000,
            "type": "number"
           },
           "maxItems": 2,
           "minItems": 2,
           "type": "array"
          },
          "maxItems": 32,
          "type": "array"
         },
         "envelope": {
          "description": "local bounds [x0, y0, x1, y1] when they exceed the body",
          "items": {
           "maximum": 50000,
           "minimum": -50000,
           "type": "number"
          },
          "maxItems": 4,
          "minItems": 4,
          "type": "array"
         }
        },
        "required": [
         "id",
         "category",
         "names",
         "width",
         "depth",
         "height",
         "symbol",
         "solids"
        ],
        "type": "object"
       },
       {
        "additionalProperties": false,
        "properties": {
         "id": {
          "pattern": "^([a-z][a-z0-9_]{0,31}:)?[a-z0-9][a-z0-9_.-]{0,63}$",
          "type": "string"
         },
         "category": {
          "description": "semantic category (IFC class choice, clash exemptions)",
          "enum": [
           "furniture",
           "casework",
           "sanitary",
           "appliance",
           "equipment",
           "planting",
           "transport",
           "structure",
           "circulation",
           "other"
          ]
         },
         "groups": {
          "description": "palette browse groups (not a classification)",
          "items": {
           "enum": [
            "bedroom",
            "living",
            "dining",
            "office",
            "kitchen",
            "bathroom",
            "laundry",
            "utility",
            "structure",
            "other"
           ]
          },
          "maxItems": 10,
          "minItems": 1,
          "type": "array"
         },
         "names": {
          "additionalProperties": {
           "maxLength": 120,
           "minLength": 1,
           "type": "string"
          },
          "maxProperties": 32,
          "properties": {
           "en": {
            "maxLength": 120,
            "minLength": 1,
            "type": "string"
           }
          },
          "propertyNames": {
           "pattern": "^[a-z]{2,3}(-[A-Za-z0-9]{2,8})*$"
          },
          "required": [
           "en"
          ],
          "type": "object"
         },
         "parameters": {
          "items": {
           "additionalProperties": false,
           "properties": {
            "name": {
             "pattern": "^[A-Za-z][A-Za-z0-9_]{0,23}$",
             "type": "string"
            },
            "dim": {
             "enum": [
              "length",
              "count",
              "bool",
              "enum",
              "angle",
              "ratio"
             ]
            },
            "default": {
             "type": [
              "number",
              "string",
              "boolean"
             ],
             "minLength": 1,
             "maxLength": 400,
             "description": "a number or an expression (length, count, angle, ratio), an option (enum), a boolean (bool)"
            },
            "min": {
             "description": "number or expression over the parameters",
             "maxLength": 400,
             "minLength": 1,
             "type": [
              "number",
              "string"
             ]
            },
            "max": {
             "description": "number or expression over the parameters",
             "maxLength": 400,
             "minLength": 1,
             "type": [
              "number",
              "string"
             ]
            },
            "step": {
             "maximum": 10000,
             "minimum": 0,
             "type": "number"
            },
            "standard": {
             "items": {
              "type": "number"
             },
             "maxItems": 32,
             "type": "array"
            },
            "choices": {
             "items": {
              "type": "number"
             },
             "maxItems": 32,
             "minItems": 1,
             "type": "array"
            },
            "options": {
             "items": {
              "pattern": "^[a-z][a-z0-9_]{0,23}$",
              "type": "string"
             },
             "maxItems": 16,
             "minItems": 1,
             "type": "array"
            },
            "tag": {
             "pattern": "^[a-z]{1,8}$",
             "type": "string"
            },
            "abbr": {
             "pattern": "^[a-z]{1,8}$",
             "type": "string"
            },
            "doc": {
             "maxLength": 200,
             "type": "string"
            }
           },
           "required": [
            "name",
            "default"
           ],
           "type": "object"
          },
          "maxItems": 16,
          "minItems": 1,
          "type": "array"
         },
         "size_params": {
          "additionalProperties": false,
          "properties": {
           "width": {
            "pattern": "^[A-Za-z][A-Za-z0-9_]{0,23}$",
            "type": [
             "string",
             "null"
            ]
           },
           "depth": {
            "pattern": "^[A-Za-z][A-Za-z0-9_]{0,23}$",
            "type": [
             "string",
             "null"
            ]
           }
          },
          "required": [],
          "type": "object"
         },
         "width": {
          "description": "number or expression over the parameters",
          "maxLength": 400,
          "minLength": 1,
          "type": [
           "number",
           "string"
          ]
         },
         "depth": {
          "description": "number or expression over the parameters",
          "maxLength": 400,
          "minLength": 1,
          "type": [
           "number",
           "string"
          ]
         },
         "height": {
          "description": "number or expression over the parameters",
          "maxLength": 400,
          "minLength": 1,
          "type": [
           "number",
           "string"
          ]
         },
         "let": {
          "additionalProperties": {
           "description": "number or expression over the parameters",
           "maxLength": 400,
           "minLength": 1,
           "type": [
            "number",
            "string"
           ]
          },
          "maxProperties": 32,
          "type": "object"
         },
         "symbol": {
          "items": {
           "oneOf": [
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "rect"
              },
              "x0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "y0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "x1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "y1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "corner_radius": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "x0",
              "y0",
              "x1",
              "y1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "circle"
              },
              "cx": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "cy": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "r": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "cx",
              "cy",
              "r"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "line"
              },
              "x0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "y0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "x1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "y1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "x0",
              "y0",
              "x1",
              "y1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "polyline"
              },
              "points": {
               "items": {
                "items": {
                 "description": "number or expression over the parameters",
                 "maxLength": 400,
                 "minLength": 1,
                 "type": [
                  "number",
                  "string"
                 ]
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
               },
               "maxItems": 512,
               "minItems": 2,
               "type": "array"
              },
              "closed": {
               "type": "boolean"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "points"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "arc"
              },
              "cx": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "cy": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "r": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "start_angle": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "end_angle": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "cx",
              "cy",
              "r",
              "start_angle",
              "end_angle"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "op": {
               "const": "array"
              },
              "mode": {
               "enum": [
                "linear",
                "polar",
                "repeat"
               ]
              },
              "count": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "var": {
               "pattern": "^[A-Za-z][A-Za-z0-9_]{0,23}$",
               "type": "string"
              },
              "dx": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "dy": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "cx": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "cy": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "step": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "items": {
               "items": {
                "oneOf": [
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "rect"
                   },
                   "x0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "y0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "x1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "y1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "corner_radius": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "style": {
                    "enum": [
                     "outline",
                     "detail",
                     "hidden",
                     "fill"
                    ]
                   },
                   "detail_levels": {
                    "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
                    "items": {
                     "enum": [
                      "coarse",
                      "medium",
                      "fine"
                     ]
                    },
                    "maxItems": 3,
                    "minItems": 1,
                    "type": "array",
                    "uniqueItems": true
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "x0",
                   "y0",
                   "x1",
                   "y1"
                  ],
                  "type": "object"
                 },
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "circle"
                   },
                   "cx": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "cy": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "r": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "style": {
                    "enum": [
                     "outline",
                     "detail",
                     "hidden",
                     "fill"
                    ]
                   },
                   "detail_levels": {
                    "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
                    "items": {
                     "enum": [
                      "coarse",
                      "medium",
                      "fine"
                     ]
                    },
                    "maxItems": 3,
                    "minItems": 1,
                    "type": "array",
                    "uniqueItems": true
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "cx",
                   "cy",
                   "r"
                  ],
                  "type": "object"
                 },
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "line"
                   },
                   "x0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "y0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "x1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "y1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "style": {
                    "enum": [
                     "outline",
                     "detail",
                     "hidden",
                     "fill"
                    ]
                   },
                   "detail_levels": {
                    "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
                    "items": {
                     "enum": [
                      "coarse",
                      "medium",
                      "fine"
                     ]
                    },
                    "maxItems": 3,
                    "minItems": 1,
                    "type": "array",
                    "uniqueItems": true
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "x0",
                   "y0",
                   "x1",
                   "y1"
                  ],
                  "type": "object"
                 },
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "polyline"
                   },
                   "points": {
                    "items": {
                     "items": {
                      "description": "number or expression over the parameters",
                      "maxLength": 400,
                      "minLength": 1,
                      "type": [
                       "number",
                       "string"
                      ]
                     },
                     "maxItems": 2,
                     "minItems": 2,
                     "type": "array"
                    },
                    "maxItems": 512,
                    "minItems": 2,
                    "type": "array"
                   },
                   "closed": {
                    "type": "boolean"
                   },
                   "style": {
                    "enum": [
                     "outline",
                     "detail",
                     "hidden",
                     "fill"
                    ]
                   },
                   "detail_levels": {
                    "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
                    "items": {
                     "enum": [
                      "coarse",
                      "medium",
                      "fine"
                     ]
                    },
                    "maxItems": 3,
                    "minItems": 1,
                    "type": "array",
                    "uniqueItems": true
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "points"
                  ],
                  "type": "object"
                 },
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "arc"
                   },
                   "cx": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "cy": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "r": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "start_angle": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "end_angle": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "style": {
                    "enum": [
                     "outline",
                     "detail",
                     "hidden",
                     "fill"
                    ]
                   },
                   "detail_levels": {
                    "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
                    "items": {
                     "enum": [
                      "coarse",
                      "medium",
                      "fine"
                     ]
                    },
                    "maxItems": 3,
                    "minItems": 1,
                    "type": "array",
                    "uniqueItems": true
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "cx",
                   "cy",
                   "r",
                   "start_angle",
                   "end_angle"
                  ],
                  "type": "object"
                 }
                ]
               },
               "maxItems": 50,
               "minItems": 1,
               "type": "array"
              }
             },
             "required": [
              "op",
              "count",
              "items"
             ],
             "type": "object"
            }
           ]
          },
          "maxItems": 200,
          "minItems": 1,
          "type": "array"
         },
         "solids": {
          "items": {
           "oneOf": [
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "box"
              },
              "x0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "y0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "x1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "y1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "z0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "z1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "part": {
               "pattern": "^[a-z0-9_]{1,40}$",
               "type": "string"
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "x0",
              "y0",
              "x1",
              "y1",
              "z0",
              "z1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "cylinder"
              },
              "cx": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "cy": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "r": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "z0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "z1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "part": {
               "pattern": "^[a-z0-9_]{1,40}$",
               "type": "string"
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "cx",
              "cy",
              "r",
              "z0",
              "z1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "prism"
              },
              "points": {
               "items": {
                "items": {
                 "description": "number or expression over the parameters",
                 "maxLength": 400,
                 "minLength": 1,
                 "type": [
                  "number",
                  "string"
                 ]
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
               },
               "maxItems": 512,
               "minItems": 3,
               "type": "array"
              },
              "z0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "z1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "part": {
               "pattern": "^[a-z0-9_]{1,40}$",
               "type": "string"
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "points",
              "z0",
              "z1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "op": {
               "const": "array"
              },
              "mode": {
               "enum": [
                "linear",
                "polar",
                "repeat"
               ]
              },
              "count": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "var": {
               "pattern": "^[A-Za-z][A-Za-z0-9_]{0,23}$",
               "type": "string"
              },
              "dx": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "dy": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "cx": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "cy": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "step": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "items": {
               "items": {
                "oneOf": [
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "box"
                   },
                   "x0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "y0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "x1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "y1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "z0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "z1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "part": {
                    "pattern": "^[a-z0-9_]{1,40}$",
                    "type": "string"
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "x0",
                   "y0",
                   "x1",
                   "y1",
                   "z0",
                   "z1"
                  ],
                  "type": "object"
                 },
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "cylinder"
                   },
                   "cx": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "cy": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "r": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "z0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "z1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "part": {
                    "pattern": "^[a-z0-9_]{1,40}$",
                    "type": "string"
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "cx",
                   "cy",
                   "r",
                   "z0",
                   "z1"
                  ],
                  "type": "object"
                 },
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "prism"
                   },
                   "points": {
                    "items": {
                     "items": {
                      "description": "number or expression over the parameters",
                      "maxLength": 400,
                      "minLength": 1,
                      "type": [
                       "number",
                       "string"
                      ]
                     },
                     "maxItems": 2,
                     "minItems": 2,
                     "type": "array"
                    },
                    "maxItems": 512,
                    "minItems": 3,
                    "type": "array"
                   },
                   "z0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "z1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "part": {
                    "pattern": "^[a-z0-9_]{1,40}$",
                    "type": "string"
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "points",
                   "z0",
                   "z1"
                  ],
                  "type": "object"
                 }
                ]
               },
               "maxItems": 50,
               "minItems": 1,
               "type": "array"
              }
             },
             "required": [
              "op",
              "count",
              "items"
             ],
             "type": "object"
            }
           ]
          },
          "maxItems": 100,
          "minItems": 1,
          "type": "array"
         },
         "swing_symbol": {
          "items": {
           "oneOf": [
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "rect"
              },
              "x0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "y0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "x1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "y1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "corner_radius": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "x0",
              "y0",
              "x1",
              "y1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "circle"
              },
              "cx": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "cy": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "r": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "cx",
              "cy",
              "r"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "line"
              },
              "x0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "y0": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "x1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "y1": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "x0",
              "y0",
              "x1",
              "y1"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "polyline"
              },
              "points": {
               "items": {
                "items": {
                 "description": "number or expression over the parameters",
                 "maxLength": 400,
                 "minLength": 1,
                 "type": [
                  "number",
                  "string"
                 ]
                },
                "maxItems": 2,
                "minItems": 2,
                "type": "array"
               },
               "maxItems": 512,
               "minItems": 2,
               "type": "array"
              },
              "closed": {
               "type": "boolean"
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "points"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "shape": {
               "const": "arc"
              },
              "cx": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "cy": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "r": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "start_angle": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "end_angle": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "style": {
               "enum": [
                "outline",
                "detail",
                "hidden",
                "fill"
               ]
              },
              "detail_levels": {
               "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
               "items": {
                "enum": [
                 "coarse",
                 "medium",
                 "fine"
                ]
               },
               "maxItems": 3,
               "minItems": 1,
               "type": "array",
               "uniqueItems": true
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              }
             },
             "required": [
              "shape",
              "cx",
              "cy",
              "r",
              "start_angle",
              "end_angle"
             ],
             "type": "object"
            },
            {
             "additionalProperties": false,
             "properties": {
              "op": {
               "const": "array"
              },
              "mode": {
               "enum": [
                "linear",
                "polar",
                "repeat"
               ]
              },
              "count": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "var": {
               "pattern": "^[A-Za-z][A-Za-z0-9_]{0,23}$",
               "type": "string"
              },
              "dx": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "dy": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "cx": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "cy": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "step": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "when": {
               "description": "number or expression over the parameters",
               "maxLength": 400,
               "minLength": 1,
               "type": [
                "number",
                "string"
               ]
              },
              "items": {
               "items": {
                "oneOf": [
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "rect"
                   },
                   "x0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "y0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "x1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "y1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "corner_radius": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "style": {
                    "enum": [
                     "outline",
                     "detail",
                     "hidden",
                     "fill"
                    ]
                   },
                   "detail_levels": {
                    "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
                    "items": {
                     "enum": [
                      "coarse",
                      "medium",
                      "fine"
                     ]
                    },
                    "maxItems": 3,
                    "minItems": 1,
                    "type": "array",
                    "uniqueItems": true
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "x0",
                   "y0",
                   "x1",
                   "y1"
                  ],
                  "type": "object"
                 },
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "circle"
                   },
                   "cx": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "cy": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "r": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "style": {
                    "enum": [
                     "outline",
                     "detail",
                     "hidden",
                     "fill"
                    ]
                   },
                   "detail_levels": {
                    "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
                    "items": {
                     "enum": [
                      "coarse",
                      "medium",
                      "fine"
                     ]
                    },
                    "maxItems": 3,
                    "minItems": 1,
                    "type": "array",
                    "uniqueItems": true
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "cx",
                   "cy",
                   "r"
                  ],
                  "type": "object"
                 },
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "line"
                   },
                   "x0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "y0": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "x1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "y1": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "style": {
                    "enum": [
                     "outline",
                     "detail",
                     "hidden",
                     "fill"
                    ]
                   },
                   "detail_levels": {
                    "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
                    "items": {
                     "enum": [
                      "coarse",
                      "medium",
                      "fine"
                     ]
                    },
                    "maxItems": 3,
                    "minItems": 1,
                    "type": "array",
                    "uniqueItems": true
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "x0",
                   "y0",
                   "x1",
                   "y1"
                  ],
                  "type": "object"
                 },
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "polyline"
                   },
                   "points": {
                    "items": {
                     "items": {
                      "description": "number or expression over the parameters",
                      "maxLength": 400,
                      "minLength": 1,
                      "type": [
                       "number",
                       "string"
                      ]
                     },
                     "maxItems": 2,
                     "minItems": 2,
                     "type": "array"
                    },
                    "maxItems": 512,
                    "minItems": 2,
                    "type": "array"
                   },
                   "closed": {
                    "type": "boolean"
                   },
                   "style": {
                    "enum": [
                     "outline",
                     "detail",
                     "hidden",
                     "fill"
                    ]
                   },
                   "detail_levels": {
                    "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
                    "items": {
                     "enum": [
                      "coarse",
                      "medium",
                      "fine"
                     ]
                    },
                    "maxItems": 3,
                    "minItems": 1,
                    "type": "array",
                    "uniqueItems": true
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "points"
                  ],
                  "type": "object"
                 },
                 {
                  "additionalProperties": false,
                  "properties": {
                   "shape": {
                    "const": "arc"
                   },
                   "cx": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "cy": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "r": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "start_angle": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "end_angle": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   },
                   "style": {
                    "enum": [
                     "outline",
                     "detail",
                     "hidden",
                     "fill"
                    ]
                   },
                   "detail_levels": {
                    "description": "the render details that draw it (default: by style, coarse = outlines and fills)",
                    "items": {
                     "enum": [
                      "coarse",
                      "medium",
                      "fine"
                     ]
                    },
                    "maxItems": 3,
                    "minItems": 1,
                    "type": "array",
                    "uniqueItems": true
                   },
                   "when": {
                    "description": "number or expression over the parameters",
                    "maxLength": 400,
                    "minLength": 1,
                    "type": [
                     "number",
                     "string"
                    ]
                   }
                  },
                  "required": [
                   "shape",
                   "cx",
                   "cy",
                   "r",
                   "start_angle",
                   "end_angle"
                  ],
                  "type": "object"
                 }
                ]
               },
               "maxItems": 50,
               "minItems": 1,
               "type": "array"
              }
             },
             "required": [
              "op",
              "count",
              "items"
             ],
             "type": "object"
            }
           ]
          },
          "maxItems": 20,
          "type": "array"
         },
         "clearances": {
          "items": {
           "additionalProperties": false,
           "properties": {
            "side": {
             "enum": [
              "front",
              "back",
              "left",
              "right"
             ]
            },
            "depth": {
             "description": "number or expression over the parameters",
             "maxLength": 400,
             "minLength": 1,
             "type": [
              "number",
              "string"
             ]
            },
            "width": {
             "description": "number or expression over the parameters",
             "maxLength": 400,
             "minLength": 1,
             "type": [
              "number",
              "string"
             ]
            },
            "offset": {
             "description": "number or expression over the parameters",
             "maxLength": 400,
             "minLength": 1,
             "type": [
              "number",
              "string"
             ]
            },
            "when": {
             "description": "number or expression over the parameters",
             "maxLength": 400,
             "minLength": 1,
             "type": [
              "number",
              "string"
             ]
            },
            "note": {
             "maxLength": 200,
             "type": "string"
            }
           },
           "required": [
            "side",
            "depth"
           ],
           "type": "object"
          },
          "maxItems": 16,
          "type": "array"
         },
         "checks": {
          "items": {
           "additionalProperties": false,
           "properties": {
            "if": {
             "description": "number or expression over the parameters",
             "maxLength": 400,
             "minLength": 1,
             "type": [
              "number",
              "string"
             ]
            },
            "severity": {
             "enum": [
              "error",
              "warning",
              "info"
             ]
            },
            "message": {
             "maxLength": 200,
             "minLength": 1,
             "type": "string"
            }
           },
           "required": [
            "if",
            "message"
           ],
           "type": "object"
          },
          "maxItems": 16,
          "type": "array"
         },
         "presets": {
          "items": {
           "additionalProperties": false,
           "properties": {
            "name": {
             "maxLength": 120,
             "minLength": 1,
             "type": "string"
            },
            "params": {
             "additionalProperties": {
              "type": [
               "number",
               "string",
               "boolean"
              ]
             },
             "maxProperties": 16,
             "type": "object"
            }
           },
           "required": [
            "name",
            "params"
           ],
           "type": "object"
          },
          "maxItems": 64,
          "type": "array"
         },
         "rules": {
          "maxLength": 200,
          "type": "string"
         },
         "size_source": {
          "maxLength": 300,
          "type": "string"
         },
         "orientation": {
          "enum": [
           "front",
           "axis_x",
           "none"
          ]
         },
         "mirrorable": {
          "type": "boolean"
         }
        },
        "required": [
         "id",
         "category",
         "names",
         "parameters",
         "width",
         "depth",
         "height",
         "symbol",
         "solids"
        ],
        "type": "object"
       }
      ]
     },
     "maxItems": 2000,
     "title": "Catalog",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "library": {
     "anyOf": [
      {
       "$ref": "#/$defs/LibraryPin"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The library version the document pins; null = the engine's bundled version.",
     "x-bldg-scope": "document"
    },
    "scheme": {
     "anyOf": [
      {
       "$ref": "#/$defs/Scheme"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The plan's look, copied from a library look; null = no look (a finish nobody chose is the default).",
     "x-bldg-scope": "document"
    },
    "inside": {
     "anyOf": [
      {
       "$ref": "#/$defs/InsideFinish"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The house's own interior door and trim choices; null = none chosen.",
     "x-bldg-scope": "document"
    },
    "outside": {
     "anyOf": [
      {
       "$ref": "#/$defs/OutsideFinish"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The house's own outside choices; null = none chosen.",
     "x-bldg-scope": "document"
    },
    "issued_marks": {
     "anyOf": [
      {
       "$ref": "#/$defs/IssuedMarks"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The last schedule code number issued per prefix ({\"WD\": 2, \"CT\": 3}); it only ever grows, so a code is never issued twice.",
     "x-bldg-scope": "document"
    },
    "quantities": {
     "anyOf": [
      {
       "$ref": "#/$defs/Quantities"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The quantity policy; null = the engine's defaults.",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "schema_version",
    "units"
   ],
   "title": "Metadata",
   "type": "object"
  },
  "Near": {
   "additionalProperties": false,
   "description": "A part placed in front of one opening or component (at front: d out from it, beyond past each side) or around one or several components (at around: their footprints grown by out). It follows them when they move.",
   "properties": {
    "of": {
     "description": "The opening or component it is in front of (front: exactly one), or the components it is around (one or more).",
     "items": {
      "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
      "type": "string"
     },
     "maxItems": 64,
     "minItems": 1,
     "title": "Of",
     "type": "array"
    },
    "at": {
     "description": "front | around.",
     "enum": [
      "front",
      "around"
     ],
     "title": "At",
     "type": "string"
    },
    "d": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "front: how far out from the thing (from the wall face toward the room for an opening).",
     "title": "D"
    },
    "beyond": {
     "default": 0.0,
     "description": "front: how far past each side of the thing.",
     "title": "Beyond",
     "type": "number"
    },
    "out": {
     "default": 0.0,
     "description": "around: how far beyond the things' footprints.",
     "minimum": 0,
     "title": "Out",
     "type": "number"
    }
   },
   "required": [
    "of",
    "at"
   ],
   "title": "Near",
   "type": "object"
  },
  "Node": {
   "additionalProperties": false,
   "description": "Wall junction / corner. Shared by every wall and space that meets here.",
   "properties": {
    "id": {
     "description": "Identifier of this element, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "x": {
     "title": "X",
     "type": "number"
    },
    "y": {
     "title": "Y",
     "type": "number"
    }
   },
   "required": [
    "id",
    "x",
    "y"
   ],
   "title": "Node",
   "type": "object"
  },
  "Nominal": {
   "additionalProperties": false,
   "description": "The nominal size of a timber section (2x4: b 2, d 4).",
   "properties": {
    "b": {
     "exclusiveMinimum": 0,
     "title": "B",
     "type": "number"
    },
    "d": {
     "exclusiveMinimum": 0,
     "title": "D",
     "type": "number"
    }
   },
   "required": [
    "b",
    "d"
   ],
   "title": "Nominal",
   "type": "object"
  },
  "OnWall": {
   "additionalProperties": false,
   "description": "A point of a part's free shape that lies on a wall face toward its room: point i of the ring lies on the wall's face, pos along the wall's node line from its anchor node. The ring's coordinates are a cache every edit refreshes.",
   "properties": {
    "i": {
     "description": "The index of the ring point.",
     "maximum": 1000,
     "minimum": 0,
     "title": "I",
     "type": "integer"
    },
    "wall": {
     "description": "The wall whose face toward the room the point lies on.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Wall",
     "type": "string"
    },
    "anchor": {
     "default": "start",
     "description": "The wall node pos is measured from: start | end.",
     "enum": [
      "start",
      "end"
     ],
     "title": "Anchor",
     "type": "string"
    },
    "pos": {
     "description": "Distance along the wall's node line from the anchor node.",
     "minimum": 0,
     "title": "Pos",
     "type": "number"
    }
   },
   "required": [
    "i",
    "wall",
    "pos"
   ],
   "title": "OnWall",
   "type": "object"
  },
  "Opening": {
   "additionalProperties": false,
   "description": "Door / window / opening of its type (a door without a type: the typical door), placed on its host wall at\npos along the host's node line from its anchor node.",
   "properties": {
    "id": {
     "description": "Identifier of this element, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "type": {
     "anyOf": [
      {
       "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Id of its opening type (category, operation, rough opening, parts); null = the typical single-swing door.",
     "title": "Type"
    },
    "host": {
     "description": "Id of the wall it is in.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Host",
     "type": "string"
    },
    "anchor": {
     "default": "start",
     "description": "The end node of the host its pos is measured from: start (the default) or end.",
     "enum": [
      "start",
      "end"
     ],
     "title": "Anchor",
     "type": "string"
    },
    "pos": {
     "description": "Along the host's node line from the anchor node to the rough opening's edge nearer it (from the node, not from the face of a wall met there).",
     "minimum": 0,
     "title": "Pos",
     "type": "number"
    },
    "sill": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Rough-opening bottom above the finished floor where it differs from the type's; null = the type's (else doors 0, windows the typical set's sill).",
     "title": "Sill",
     "x-bldg-scope": "detail"
    },
    "hinge": {
     "anyOf": [
      {
       "enum": [
        "start",
        "end"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The jamb the hinges are on: start = towards the host's start node, end; null = unknown. A pair's leaves are listed from it.",
     "title": "Hinge"
    },
    "swing": {
     "anyOf": [
      {
       "enum": [
        "A",
        "B",
        "both"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The host side the leaf opens into: A = left of start -> end as drawn, B = right, both = double-acting; null = unknown (drawn without a swing).",
     "title": "Swing"
    },
    "egress": {
     "anyOf": [
      {
       "enum": [
        "A",
        "B"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The host side egress travel through it leads to: A | B; null = unknown.",
     "title": "Egress",
     "x-bldg-scope": "detail"
    },
    "roles": {
     "description": "Its roles in egress, entry and rescue: egress | exit | exit_discharge | entrance.public | entrance.unit_primary | entrance.service | accessible_entrance | fire_rescue_window | eero; empty = none declared.",
     "items": {
      "enum": [
       "egress",
       "exit",
       "exit_discharge",
       "entrance.public",
       "entrance.unit_primary",
       "entrance.service",
       "accessible_entrance",
       "fire_rescue_window",
       "eero"
      ],
      "type": "string"
     },
     "maxItems": 9,
     "title": "Roles",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "clear": {
     "anyOf": [
      {
       "$ref": "#/$defs/Clear"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A stated clear opening (measured, or where parts are missing) with its basis; null = the type's, else derived from the parts.",
     "x-bldg-scope": "document"
    },
    "mark": {
     "default": "",
     "description": "Instance number as on drawings (e.g. D-101), apart from the type mark.",
     "maxLength": 32,
     "title": "Mark",
     "type": "string",
     "x-bldg-scope": "document"
    },
    "finish": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The finish of a door's leaves or a window's frame and sash; null = the house's.",
     "title": "Finish",
     "x-bldg-scope": "document"
    },
    "glass": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The glass of a window, a glazed door or a glazed leaf (every pane); null = clear glass.",
     "title": "Glass",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "host",
    "pos"
   ],
   "title": "Opening",
   "type": "object"
  },
  "OpeningType": {
   "additionalProperties": false,
   "description": "A door / window / opening type, shared by the openings that name it: its rough opening and, as far as they are\nknown, its sill, frame, leaves, layout, the largest opening angle of its leaves, a stated clear opening and its\nthreshold.",
   "properties": {
    "id": {
     "description": "Type mark, e.g. D1 / W1 (international), M0921 / C1515 (China) or D3068 (US).",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "category": {
     "description": "door | window | opening (a void without a fill).",
     "enum": [
      "door",
      "window",
      "opening"
     ],
     "title": "Category",
     "type": "string"
    },
    "operation": {
     "anyOf": [
      {
       "enum": [
        "single_swing",
        "double_leaf_swing",
        "sliding",
        "pocket",
        "bifold",
        "folding",
        "overhead",
        "revolving",
        "pivot",
        "fixed",
        "casement",
        "hung",
        "awning",
        "hopper",
        "tilt_turn",
        "removable",
        "other"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How it opens: door single_swing | double_leaf_swing | sliding | pocket | bifold | folding | overhead | revolving | pivot; window fixed | casement | sliding | hung | awning | hopper | tilt_turn | pivot | removable | folding; other (operation_label names it); null = unknown; an opening (a void) has none.",
     "title": "Operation"
    },
    "operation_label": {
     "default": "",
     "description": "The operation as written when it is other (IFC USERDEFINED ObjectType).",
     "maxLength": 60,
     "title": "Operation Label",
     "type": "string",
     "x-bldg-scope": "document"
    },
    "rough": {
     "$ref": "#/$defs/Rough",
     "description": "The rough opening: the hole in the host.",
     "title": "Rough"
    },
    "sill": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The type's typical rough-opening bottom above the finished floor; null = doors 0, windows the typical set's sill.",
     "title": "Sill",
     "x-bldg-scope": "detail"
    },
    "frame": {
     "anyOf": [
      {
       "$ref": "#/$defs/Frame"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its frame; null = unknown (drawings take the typical set's sizes).",
     "title": "Frame",
     "x-bldg-scope": "document"
    },
    "leaves": {
     "description": "Its leaves (door leaves, window sashes), listed from the jamb the opening's hinge names; [] = unknown.",
     "items": {
      "$ref": "#/$defs/Leaf"
     },
     "maxItems": 8,
     "title": "Leaves",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "layout": {
     "anyOf": [
      {
       "$ref": "#/$defs/Layout"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How the rough opening is divided; null = one cell.",
     "title": "Layout",
     "x-bldg-scope": "document"
    },
    "hinge_gap": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Between the hinge-side frame face and the leaf opened to 90 degrees.",
     "title": "Hinge Gap",
     "x-bldg-scope": "document"
    },
    "max_open": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "maximum": 180,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The largest opening angle of its swing leaves (degrees); null = unknown.",
     "title": "Max Open",
     "x-bldg-scope": "document"
    },
    "clear": {
     "anyOf": [
      {
       "$ref": "#/$defs/Clear"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A stated clear opening, only where parts are missing or it was measured, with its basis.",
     "title": "Clear",
     "x-bldg-scope": "document"
    },
    "threshold": {
     "anyOf": [
      {
       "$ref": "#/$defs/Threshold"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its threshold ({\"h\": 0} = none); null = unknown.",
     "title": "Threshold",
     "x-bldg-scope": "document"
    },
    "glazed": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A door's leaves are glazed: each a frame of stiles and rails round one pane of glass (a patio or French door); null = solid leaves.",
     "title": "Glazed",
     "x-bldg-scope": "document"
    },
    "fall_device": {
     "anyOf": [
      {
       "enum": [
        "none",
        "limiter",
        "guard"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "none | limiter | guard: what keeps a window from being a fall (IBC 1015.8): nothing, a limiter of its opening, a guard device; null = unknown.",
     "title": "Fall Device",
     "x-bldg-scope": "document"
    },
    "fire": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Fire"
       },
       "maxItems": 16,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Unlisted fire ratings; [] = not rated; null = unknown.",
     "title": "Fire",
     "x-bldg-scope": "document"
    },
    "note": {
     "anyOf": [
      {
       "maxLength": 500,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Free description.",
     "title": "Note",
     "x-bldg-scope": "document"
    },
    "key": {
     "default": "",
     "description": "Internal identity (IFC type GlobalIds), written once by the editing engine when the type's first element would change; kept by renames and resizes. \"\" = the first element that uses it.",
     "maxLength": 100,
     "title": "Key",
     "type": "string",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "category",
    "rough"
   ],
   "title": "OpeningType",
   "type": "object"
  },
  "OutsideFinish": {
   "additionalProperties": false,
   "description": "The house's outside: the wall faces toward outside, the base band at their bottom on the at-grade levels, the exterior frames, the leaves of exterior doors and the top of every roof and canopy.",
   "properties": {
    "walls": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Every wall face toward outside.",
     "title": "Walls"
    },
    "base_band": {
     "anyOf": [
      {
       "$ref": "#/$defs/FinishBand"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A band at the bottom of the outside walls on the building's at-grade levels, h above the bottom of the outside face."
    },
    "trim": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The exterior window and door frames.",
     "title": "Trim"
    },
    "doors": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The leaves of exterior doors (both faces).",
     "title": "Doors"
    },
    "roof": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The top of every roof and canopy.",
     "title": "Roof"
    },
    "foundation": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The foundation face between the ground and the cladding.",
     "title": "Foundation"
    },
    "windows": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The frames and sashes of every window, inside and out.",
     "title": "Windows"
    },
    "rails": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Every railing on a semi-outdoor, exterior or lot edge.",
     "title": "Rails"
    }
   },
   "title": "OutsideFinish",
   "type": "object"
  },
  "Plenum": {
   "additionalProperties": false,
   "description": "The return-air plenum a layer is: the system it serves.",
   "properties": {
    "system": {
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "System",
     "type": "string"
    }
   },
   "required": [
    "system"
   ],
   "title": "Plenum",
   "type": "object"
  },
  "Premise": {
   "additionalProperties": false,
   "description": "A premise of the compliance check (plan-wide `premises`): what a verdict may rest on without the engine deriving it.\nAn exception claimed for a row, a design assumption or analysis result that supplies a value (fact, value), an\napproval, an existing condition, or a waiver of a row with its reason.",
   "properties": {
    "id": {
     "description": "Identifier of this premise, unique across the plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "kind": {
     "description": "exception_claim | design_assumption | approval | amendment | alternative_method | analysis_result | existing_condition | waiver.",
     "enum": [
      "exception_claim",
      "design_assumption",
      "approval",
      "amendment",
      "alternative_method",
      "analysis_result",
      "existing_condition",
      "waiver"
     ],
     "title": "Kind",
     "type": "string"
    },
    "pack": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The rule pack it concerns (`ibc2027`); null or \"*\" = every pack. Required for a waiver and an exception claim.",
     "title": "Pack"
    },
    "row": {
     "anyOf": [
      {
       "maxLength": 128,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The pack row it concerns (`ibc2027.1010.1.1.1.clear_width`); null or \"*\" = every row. Required for a waiver and an exception claim.",
     "title": "Row"
    },
    "exception": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "For an exception claim: the id of the row exception it claims.",
     "title": "Exception"
    },
    "clause": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The clause it concerns (annotation).",
     "title": "Clause"
    },
    "refs": {
     "description": "Ids of the elements it concerns; empty = every subject of its row (a waiver, an exception claim), else none.",
     "items": {
      "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
      "type": "string"
     },
     "title": "Refs",
     "type": "array"
    },
    "fact": {
     "anyOf": [
      {
       "maxLength": 128,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "For an assumption or a result: the attribute it supplies (`occupant_load`, `on_accessible_route`).",
     "title": "Fact"
    },
    "value": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "number"
      },
      {
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The value it supplies.",
     "title": "Value"
    },
    "reason": {
     "anyOf": [
      {
       "maxLength": 500,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Why; required for a waiver.",
     "title": "Reason"
    },
    "source": {
     "default": "",
     "description": "The metadata.sources entry it comes from (an approval letter, a report); \"\" = none.",
     "maxLength": 64,
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63})?$",
     "title": "Source",
     "type": "string"
    }
   },
   "required": [
    "id",
    "kind"
   ],
   "title": "Premise",
   "type": "object"
  },
  "Project": {
   "additionalProperties": false,
   "description": "The project the document describes (annotation, document-only).",
   "properties": {
    "name": {
     "anyOf": [
      {
       "maxLength": 200,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The project's name (annotation); null = none.",
     "title": "Name"
    },
    "number": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The project's number (annotation); null = none.",
     "title": "Number"
    },
    "address": {
     "anyOf": [
      {
       "maxLength": 200,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The project's address (annotation); null = none. A building's own addresses are buildings[].addresses.",
     "title": "Address"
    }
   },
   "title": "Project",
   "type": "object"
  },
  "Quantities": {
   "additionalProperties": false,
   "description": "The contractor's quantity policy: waste by pattern, the openings deducted from wall finishes, whether built-ins are floored, how order quantities round. Missing keys: the engine's defaults.",
   "properties": {
    "waste": {
     "anyOf": [
      {
       "$ref": "#/$defs/QuantityWaste"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The waste on area by pattern."
    },
    "deduct_openings": {
     "anyOf": [
      {
       "$ref": "#/$defs/QuantityDeduct"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Which openings are deducted from wall finishes."
    },
    "deduct_built_ins": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Whether the footprints of built-ins that are not finished under are left out of floor quantities.",
     "title": "Deduct Built Ins"
    },
    "round": {
     "anyOf": [
      {
       "enum": [
        "whole"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How order quantities round: whole (up to whole units).",
     "title": "Round"
    }
   },
   "title": "Quantities",
   "type": "object"
  },
  "QuantityDeduct": {
   "additionalProperties": false,
   "description": "Which openings are deducted from wall finishes: those larger than min_area.",
   "properties": {
    "min_area": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Openings larger than this area are deducted from wall finishes; smaller ones are painted over.",
     "title": "Min Area"
    }
   },
   "title": "QuantityDeduct",
   "type": "object"
  },
  "QuantityWaste": {
   "additionalProperties": false,
   "description": "The waste on area by pattern, a fraction (diagonal: a layout 45 degrees off).",
   "properties": {
    "plank": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Waste for plank patterns.",
     "title": "Plank"
    },
    "grid": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Waste for grid patterns.",
     "title": "Grid"
    },
    "running": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Waste for running-bond patterns.",
     "title": "Running"
    },
    "hex": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Waste for hex patterns.",
     "title": "Hex"
    },
    "herringbone": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Waste for herringbone patterns.",
     "title": "Herringbone"
    },
    "diagonal": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Waste for a layout 45 degrees off.",
     "title": "Diagonal"
    },
    "none": {
     "anyOf": [
      {
       "maximum": 1,
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Waste for continuous finishes.",
     "title": "None"
    }
   },
   "title": "QuantityWaste",
   "type": "object"
  },
  "Rail": {
   "additionalProperties": false,
   "description": "A handrail, guard or grab bar of a level: of a rail type (its kind and height), along a plan path or the node lines of a chain of walls.",
   "properties": {
    "id": {
     "description": "Identifier of this rail, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "type": {
     "description": "Its rail type: a rail_types id, or the library's bldg:rail_type.typical.handrail | bldg:rail_type.typical.guard.",
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
     "title": "Type",
     "type": "string"
    },
    "path": {
     "description": "The plan line of the top of its gripping surface or guard, [[x, y], ...]; [] with along.",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "title": "Path",
     "type": "array"
    },
    "along": {
     "description": "A chain of walls of the level, each sharing a node with the next, whose node lines are its path (a guard on the virtual walls of a balcony's open edge); excludes path.",
     "items": {
      "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
      "type": "string"
     },
     "title": "Along",
     "type": "array"
    },
    "z": {
     "description": "Its top above the level datum at each path point; [] = the walking surface + the type's height.",
     "items": {
      "type": "number"
     },
     "title": "Z",
     "type": "array"
    },
    "of": {
     "anyOf": [
      {
       "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The flight, landing, ramp or space it serves; null = none.",
     "title": "Of"
    },
    "side": {
     "anyOf": [
      {
       "enum": [
        "left",
        "right"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "left | right: its side of what it serves, looking up; null = unknown.",
     "title": "Side"
    },
    "host": {
     "anyOf": [
      {
       "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The wall or opening it is fixed to; null = none.",
     "title": "Host"
    },
    "wall_clear": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its clearance to the host wall; null = the type's mount.",
     "title": "Wall Clear"
    },
    "reinforcement_only": {
     "default": false,
     "description": "Blocking for a future grab bar, nothing installed.",
     "title": "Reinforcement Only",
     "type": "boolean"
    },
    "finish": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "This railing's own material; null = the house's inside or outside rails.",
     "title": "Finish",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "type"
   ],
   "title": "Rail",
   "type": "object"
  },
  "RailClear": {
   "additionalProperties": false,
   "description": "The clear openings of a rail type's infill, where its parts do not give them: the largest sphere that passes it, the largest the triangle at a stair's open side passes, and what they are known from.",
   "properties": {
    "sphere": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The diameter of the largest sphere that passes the infill up to the rail's height; null = unknown.",
     "title": "Sphere"
    },
    "triangle": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The diameter of the largest sphere that passes the triangle under its bottom rail at a stair's open side; null = unknown.",
     "title": "Triangle"
    },
    "basis": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "What the openings are known from (a listing, a measurement ...); null = unknown.",
     "title": "Basis"
    }
   },
   "title": "RailClear",
   "type": "object"
  },
  "RailType": {
   "additionalProperties": false,
   "description": "A rail type: its kind, the height of its top above the walking surface, the clear openings of its infill, whether its infill can be climbed, its design load.",
   "properties": {
    "id": {
     "description": "Identifier of this rail type, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "kind": {
     "description": "handrail | guard | grab_bar | wheel_guide | vehicle_barrier: the kind of every rail of the type.",
     "enum": [
      "handrail",
      "guard",
      "grab_bar",
      "wheel_guide",
      "vehicle_barrier"
     ],
     "title": "Kind",
     "type": "string"
    },
    "height": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Top of the gripping surface or guard above the walking surface; null = from the rails' z.",
     "title": "Height"
    },
    "clear": {
     "anyOf": [
      {
       "$ref": "#/$defs/RailClear"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The clear openings of its infill where its parts do not give them; null = unknown.",
     "x-bldg-scope": "document"
    },
    "climbable": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its infill can be climbed; null = unknown.",
     "title": "Climbable"
    },
    "strength": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The design load its listing states (N, lbf in inch documents); null = unknown.",
     "title": "Strength"
    }
   },
   "required": [
    "id",
    "kind"
   ],
   "title": "RailType",
   "type": "object"
  },
  "Reaction": {
   "additionalProperties": false,
   "description": "A reaction-to-fire class: standard, class, flame spread and smoke developed indices.",
   "properties": {
    "std": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Std"
    },
    "class": {
     "anyOf": [
      {
       "maxLength": 16,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Class"
    },
    "fsi": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Fsi"
    },
    "sdi": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Sdi"
    }
   },
   "title": "Reaction",
   "type": "object"
  },
  "RoomFinish": {
   "additionalProperties": false,
   "description": "A room's own finishes, each a finish row id or a library finish id (bldg:finish_type....); a missing one is the next tier's (the look's row for the room's use, then the default).",
   "properties": {
    "floor": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The whole floor (and the treads of a flight standing in the room).",
     "title": "Floor"
    },
    "walls": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Every wall face toward the room.",
     "title": "Walls"
    },
    "wainscot": {
     "anyOf": [
      {
       "$ref": "#/$defs/FinishBand"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A band from the floor to h on every wall face toward the room."
    },
    "baseboard": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Along the walls at the floor (bldg:finish_type.none = no baseboard).",
     "title": "Baseboard"
    },
    "ceiling": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The whole ceiling (or the roof underside the room is open to).",
     "title": "Ceiling"
    },
    "objects": {
     "description": "The materials of every object of a class standing in the room (cabinets, counters, appliances, faucets, furniture, upholstery).",
     "items": {
      "$ref": "#/$defs/ClassRow"
     },
     "maxItems": 16,
     "title": "Objects",
     "type": "array"
    }
   },
   "title": "RoomFinish",
   "type": "object"
  },
  "RoomRow": {
   "additionalProperties": false,
   "description": "A room row of a look: the finishes of the rooms its key use takes (a space use, * any indoor use, a semi-outdoor kind, or outdoor).",
   "properties": {
    "use": {
     "description": "The row's key: a space use, * (any indoor use), a semi-outdoor kind (porch, terrace ...) or outdoor; once per look.",
     "maxLength": 32,
     "title": "Use",
     "type": "string"
    },
    "floor": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The floor of the rooms it takes.",
     "title": "Floor"
    },
    "walls": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Their wall faces.",
     "title": "Walls"
    },
    "wainscot": {
     "anyOf": [
      {
       "$ref": "#/$defs/FinishBand"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A wainscot on their wall faces."
    },
    "baseboard": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Their baseboard.",
     "title": "Baseboard"
    },
    "ceiling": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Their ceiling.",
     "title": "Ceiling"
    }
   },
   "required": [
    "use"
   ],
   "title": "RoomRow",
   "type": "object"
  },
  "Rough": {
   "additionalProperties": false,
   "description": "A rough opening: the hole in the host, w along it and h up.",
   "properties": {
    "w": {
     "description": "Width along the host: the hole in the wall, frame included (not the clear passage width).",
     "exclusiveMinimum": 0,
     "title": "W",
     "type": "number"
    },
    "h": {
     "description": "Height of the hole (head - sill).",
     "exclusiveMinimum": 0,
     "title": "H",
     "type": "number"
    }
   },
   "required": [
    "w",
    "h"
   ],
   "title": "Rough",
   "type": "object"
  },
  "Run": {
   "additionalProperties": false,
   "description": "One run of a ramp: the space whose floor patches are its sloped surface, and the direction of travel up.",
   "properties": {
    "space": {
     "description": "The space whose floor patches are the ramp's surface.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Space",
     "type": "string"
    },
    "dir": {
     "description": "The plan direction of travel up [dx, dy] (integers in lowest terms).",
     "items": {
      "maximum": 1000,
      "minimum": -1000,
      "type": "integer"
     },
     "maxItems": 2,
     "minItems": 2,
     "title": "Dir",
     "type": "array"
    }
   },
   "required": [
    "space",
    "dir"
   ],
   "title": "Run",
   "type": "object"
  },
  "Scheme": {
   "additionalProperties": false,
   "description": "The plan's look: a copy of a library look (never a reference to it), with its room rows by use and its inside and outside.",
   "properties": {
    "name": {
     "description": "The look's name as people see it (\"Warm modern\").",
     "maxLength": 100,
     "minLength": 1,
     "title": "Name",
     "type": "string"
    },
    "from": {
     "anyOf": [
      {
       "maxLength": 97,
       "pattern": "^bldg:scheme\\.[a-z0-9][a-z0-9_.\\-]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The library id it was copied from (an annotation, never read for values).",
     "title": "From"
    },
    "rooms": {
     "description": "Its room rows, keyed by use.",
     "items": {
      "$ref": "#/$defs/RoomRow"
     },
     "maxItems": 64,
     "title": "Rooms",
     "type": "array"
    },
    "inside": {
     "anyOf": [
      {
       "$ref": "#/$defs/InsideFinish"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its inside doors and trim."
    },
    "outside": {
     "anyOf": [
      {
       "$ref": "#/$defs/OutsideFinish"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its outside."
    },
    "objects": {
     "description": "The look's materials by object class, for every object of that class in the house.",
     "items": {
      "$ref": "#/$defs/ClassRow"
     },
     "maxItems": 16,
     "title": "Objects",
     "type": "array"
    },
    "families": {
     "description": "Typical looks only: the family exceptions of the default (a plan's look holds none).",
     "items": {
      "$ref": "#/$defs/FamilyRow"
     },
     "maxItems": 256,
     "title": "Families",
     "type": "array"
    }
   },
   "required": [
    "name"
   ],
   "title": "Scheme",
   "type": "object"
  },
  "Section": {
   "additionalProperties": false,
   "description": "A cross-section of a linear part: its shape and the parameters the shape needs.",
   "properties": {
    "id": {
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "kind": {
     "enum": [
      "rect",
      "round",
      "pipe",
      "hss_rect",
      "hss_round",
      "i",
      "channel",
      "tee",
      "angle",
      "z",
      "timber_rect",
      "sheet",
      "polygon"
     ],
     "title": "Kind",
     "type": "string"
    },
    "b": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "B"
    },
    "d": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "D"
    },
    "od": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Od"
    },
    "t": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "T"
    },
    "bf": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Bf"
    },
    "tf": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Tf"
    },
    "tw": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Tw"
    },
    "nominal": {
     "anyOf": [
      {
       "$ref": "#/$defs/Nominal"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Nominal"
    },
    "path": {
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "maxItems": 256,
     "title": "Path",
     "type": "array"
    },
    "ring": {
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "maxItems": 256,
     "title": "Ring",
     "type": "array"
    },
    "r": {
     "default": 0.0,
     "minimum": 0,
     "title": "R",
     "type": "number"
    },
    "ply": {
     "anyOf": [
      {
       "maximum": 16,
       "minimum": 1,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Ply"
    },
    "end": {
     "anyOf": [
      {
       "$ref": "#/$defs/SectionEnd"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "End"
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 100,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Name"
    },
    "note": {
     "anyOf": [
      {
       "maxLength": 500,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Note"
    }
   },
   "required": [
    "id",
    "kind"
   ],
   "title": "Section",
   "type": "object"
  },
  "SectionEnd": {
   "additionalProperties": false,
   "description": "The parameters at the far end of a tapered section.",
   "properties": {
    "b": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "B"
    },
    "d": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "D"
    },
    "bf": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Bf"
    },
    "tf": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Tf"
    },
    "tw": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Tw"
    }
   },
   "title": "SectionEnd",
   "type": "object"
  },
  "Semi": {
   "additionalProperties": false,
   "description": "What makes a space semi-outdoor; whether it is covered is derived.",
   "properties": {
    "kind": {
     "description": "balcony | loggia (a recessed balcony) | terrace | porch | arcade | carport.",
     "enum": [
      "balcony",
      "loggia",
      "terrace",
      "porch",
      "arcade",
      "carport",
      "deck"
     ],
     "title": "Kind",
     "type": "string"
    }
   },
   "required": [
    "kind"
   ],
   "title": "Semi",
   "type": "object"
  },
  "Slab": {
   "additionalProperties": false,
   "description": "A roof or canopy of a level (§4.4.7): its outline less its holes, its structural top as planes (its top patches), the walls it bears on.",
   "properties": {
    "id": {
     "description": "Identifier of this slab, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "kind": {
     "description": "roof | canopy; floor, ledge, ground and foundation come with declared floor slabs (refused until then: a level's floor slab is derived from its spaces).",
     "enum": [
      "floor",
      "roof",
      "canopy",
      "ledge",
      "ground",
      "foundation"
     ],
     "title": "Kind",
     "type": "string"
    },
    "type": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its slab type: a slab_types id or a library one; null = the typical set's for its kind (typicals.slab_type.<kind>, a premise).",
     "title": "Type"
    },
    "form": {
     "anyOf": [
      {
       "enum": [
        "flat",
        "shed",
        "gable",
        "hip",
        "mansard",
        "gambrel",
        "butterfly",
        "barrel",
        "dome",
        "freeform"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Roofs: flat | shed | gable | hip | mansard | gambrel | butterfly | barrel | dome | freeform; null = unknown.",
     "title": "Form"
    },
    "ring": {
     "description": "Its plan outline [[x, y], ...] counter-clockwise (at the eaves and rakes: overhangs included).",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "minItems": 3,
     "title": "Ring",
     "type": "array"
    },
    "holes": {
     "description": "The holes through it, each its ring.",
     "items": {
      "$ref": "#/$defs/SlabHole"
     },
     "maxItems": 256,
     "title": "Holes",
     "type": "array"
    },
    "top": {
     "description": "Its structural top, one patch per plane; the one patch without a ring covers the rest of the slab. Adjacent planes meet along their shared edges.",
     "items": {
      "$ref": "#/$defs/SlabPatch"
     },
     "maxItems": 256,
     "minItems": 1,
     "title": "Top",
     "type": "array"
    },
    "edge": {
     "default": "plumb",
     "description": "How its edges are cut: plumb (vertical).",
     "enum": [
      "plumb"
     ],
     "title": "Edge",
     "type": "string"
    },
    "on": {
     "description": "The walls of its level it bears on.",
     "items": {
      "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
      "type": "string"
     },
     "title": "On",
     "type": "array"
    },
    "finish": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A roof's or canopy's own top; null = the house's roof.",
     "title": "Finish",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "kind",
    "ring",
    "top"
   ],
   "title": "Slab",
   "type": "object"
  },
  "SlabHole": {
   "additionalProperties": false,
   "description": "A hole through a slab (a chimney, a dormer, a void): its ring.",
   "properties": {
    "ring": {
     "description": "Its plan outline [[x, y], ...] counter-clockwise.",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "minItems": 3,
     "title": "Ring",
     "type": "array"
    }
   },
   "required": [
    "ring"
   ],
   "title": "SlabHole",
   "type": "object"
  },
  "SlabPatch": {
   "additionalProperties": false,
   "description": "A top patch of a slab: one plane of its structural top over its ring (none: the rest of the slab), at z above the level datum at the point at, rising by slope (none: horizontal).",
   "properties": {
    "id": {
     "description": "Identifier of this top patch, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "ring": {
     "description": "The plane's extent: [[x, y], ...] counter-clockwise; [] = the rest of the slab.",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "title": "Ring",
     "type": "array"
    },
    "z": {
     "description": "Its structural top above the level datum at at (a horizontal patch: everywhere).",
     "title": "Z",
     "type": "number"
    },
    "at": {
     "anyOf": [
      {
       "items": {
        "type": "number"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The point [x, y] where z holds; required with slope, absent without.",
     "title": "At"
    },
    "slope": {
     "anyOf": [
      {
       "$ref": "#/$defs/Slope"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The plane's slope (dir: the up-slope direction); null = horizontal."
    }
   },
   "required": [
    "id",
    "z"
   ],
   "title": "SlabPatch",
   "type": "object"
  },
  "SlabType": {
   "additionalProperties": false,
   "description": "A slab type (§4.2.6): its structural system and its layers from the structural top down; their total, measured perpendicular to the slab, is its thickness.",
   "properties": {
    "id": {
     "description": "Identifier of this slab type, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "kind": {
     "description": "The structural system: solid | flat_slab | ribbed | waffle | hollow_core | composite_deck | form_deck | precast_plank | double_tee | timber_joist | steel_joist | timber_deck | clt | nlt | dlt | glulam_deck | post_tensioned.",
     "enum": [
      "solid",
      "flat_slab",
      "ribbed",
      "waffle",
      "hollow_core",
      "composite_deck",
      "form_deck",
      "precast_plank",
      "double_tee",
      "timber_joist",
      "steel_joist",
      "timber_deck",
      "clt",
      "nlt",
      "dlt",
      "glulam_deck",
      "post_tensioned"
     ],
     "title": "Kind",
     "type": "string"
    },
    "layers": {
     "description": "From the structural top down to the structural bottom; their total is the slab's thickness, measured perpendicular to it.",
     "items": {
      "$ref": "#/$defs/Layer"
     },
     "maxItems": 32,
     "minItems": 1,
     "title": "Layers",
     "type": "array"
    },
    "deck_profile": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A library deck profile it is built on; null = none.",
     "title": "Deck Profile",
     "x-bldg-scope": "document"
    },
    "fire": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Fire"
       },
       "maxItems": 16,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Unlisted fire ratings (listed ones are assemblies); [] = not rated; null = unknown.",
     "title": "Fire",
     "x-bldg-scope": "document"
    },
    "reaction": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Reaction"
       },
       "maxItems": 8,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Reaction to fire of its exposed faces; null = from the layers' materials.",
     "title": "Reaction",
     "x-bldg-scope": "document"
    },
    "acoustic": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Acoustic"
       },
       "maxItems": 16,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Sound ratings; null = unknown.",
     "title": "Acoustic",
     "x-bldg-scope": "document"
    },
    "u": {
     "anyOf": [
      {
       "$ref": "#/$defs/UValue"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "U-value; null = derived from the layers.",
     "title": "U",
     "x-bldg-scope": "document"
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 100,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A readable name.",
     "title": "Name",
     "x-bldg-scope": "document"
    },
    "note": {
     "anyOf": [
      {
       "maxLength": 500,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Free description: construction notes not yet expressed as fields.",
     "title": "Note",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "kind",
    "layers"
   ],
   "title": "SlabType",
   "type": "object"
  },
  "Slope": {
   "additionalProperties": false,
   "description": "A plane's steepest rise: its up-slope direction dir and rise over run (a 1:12 ramp rising to +x: {dir: [1, 0], rise: 1, run: 12}).",
   "properties": {
    "dir": {
     "description": "The up-slope direction [dx, dy]: integers, not both 0, in lowest terms.",
     "items": {
      "maximum": 1000,
      "minimum": -1000,
      "type": "integer"
     },
     "maxItems": 2,
     "minItems": 2,
     "title": "Dir",
     "type": "array"
    },
    "rise": {
     "description": "The height the plane gains over run (>= 0).",
     "minimum": 0,
     "title": "Rise",
     "type": "number"
    },
    "run": {
     "description": "The plan distance over which it gains rise (> 0).",
     "exclusiveMinimum": 0,
     "title": "Run",
     "type": "number"
    }
   },
   "required": [
    "dir",
    "rise",
    "run"
   ],
   "title": "Slope",
   "type": "object"
  },
  "SlotRow": {
   "additionalProperties": false,
   "description": "One material of an object or of every object of a component type, keyed by its slot.",
   "properties": {
    "slot": {
     "description": "A slot word of the object's family (upholstery, legs, cabinets ...).",
     "pattern": "^[a-z][a-z0-9_]{0,63}$",
     "title": "Slot",
     "type": "string"
    },
    "finish": {
     "description": "The finish row or library finish it shows.",
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
     "title": "Finish",
     "type": "string"
    }
   },
   "required": [
    "slot",
    "finish"
   ],
   "title": "SlotRow",
   "type": "object"
  },
  "Source": {
   "additionalProperties": false,
   "description": "Where (part of) the plan came from: an image, a PDF page, a CAD or IFC file, a scan, a text brief...\n\nA raster source can be an underlay (``Level.underlay``): its pixels map to the plan by ``scale`` (document units\nper pixel), ``rotation`` and ``tx`` / ``ty`` (``source_matrix``); ``scale_status`` says whether that scale is\ncalibrated or a stand-in. ``dimension_units`` says how its printed dimensions are written.",
   "properties": {
    "id": {
     "description": "Identifier of this element, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "format": {
     "description": "raster | vector | cad | ifc | point_cloud | text | other | unknown.",
     "enum": [
      "raster",
      "vector",
      "cad",
      "ifc",
      "point_cloud",
      "text",
      "other",
      "unknown"
     ],
     "title": "Format",
     "type": "string"
    },
    "origin": {
     "default": "unknown",
     "description": "How it was made: scanned | manual | generated | dataset | imported | other | unknown.",
     "enum": [
      "scanned",
      "manual",
      "generated",
      "dataset",
      "imported",
      "other",
      "unknown"
     ],
     "title": "Origin",
     "type": "string"
    },
    "role": {
     "default": "unknown",
     "description": "What it is for: plan | brief | reference | other | unknown.",
     "enum": [
      "plan",
      "brief",
      "reference",
      "other",
      "unknown"
     ],
     "title": "Role",
     "type": "string"
    },
    "uri": {
     "anyOf": [
      {
       "maxLength": 2048,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "File name or URI.",
     "title": "Uri"
    },
    "page": {
     "anyOf": [
      {
       "minimum": 1,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Page or sheet number inside the source.",
     "title": "Page"
    },
    "sha256": {
     "anyOf": [
      {
       "pattern": "^[0-9a-f]{64}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Sha256"
    },
    "license": {
     "anyOf": [
      {
       "maxLength": 200,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Licence of the source, e.g. CC-BY-4.0.",
     "title": "License"
    },
    "note": {
     "anyOf": [
      {
       "maxLength": 500,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Note"
    },
    "dimension_units": {
     "default": "unknown",
     "description": "Units of its printed dimensions without a suffix (4600 mm, 460 cm, 4.60 m, 12'-6\" ft_in, 24 in); unknown = guess per text.",
     "enum": [
      "mm",
      "cm",
      "m",
      "ft_in",
      "in",
      "unknown"
     ],
     "title": "Dimension Units",
     "type": "string"
    },
    "width_px": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "maximum": 1000000,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Image width in pixels (raster).",
     "title": "Width Px"
    },
    "height_px": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "maximum": 1000000,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Image height in pixels (raster).",
     "title": "Height Px"
    },
    "scale": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Document units per image pixel; null = not registered.",
     "title": "Scale"
    },
    "scale_status": {
     "default": "assumed",
     "description": "calibrated (measured against known lengths) | assumed (a stand-in scale: geometry traced on it is not a physical size yet).",
     "enum": [
      "calibrated",
      "assumed"
     ],
     "title": "Scale Status",
     "type": "string"
    },
    "rotation": {
     "default": 0.0,
     "description": "Counter-clockwise angle (as viewed) the image is turned by to lie in the plan (straighten() sets it; 0 = drawn straight).",
     "maximum": 360,
     "minimum": -360,
     "title": "Rotation",
     "type": "number"
    },
    "tx": {
     "default": 0.0,
     "description": "Plan x of the image's top-left pixel corner.",
     "title": "Tx",
     "type": "number"
    },
    "ty": {
     "default": 0.0,
     "description": "Plan y of the image's top-left pixel corner.",
     "title": "Ty",
     "type": "number"
    }
   },
   "required": [
    "id",
    "format"
   ],
   "title": "Source",
   "type": "object"
  },
  "Space": {
   "additionalProperties": false,
   "description": "A space (IfcSpace): a room or an area. Its bound is a ring of the level's nodes along walls (virtual walls\nfor open edges), so it follows the walls when they move; its holes are inner rings; within names the space it lies in.",
   "properties": {
    "id": {
     "description": "Identifier of this element, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "name": {
     "default": "",
     "description": "Label as printed on the plan, e.g. LAUNDRY (drawn at the space's label spot).",
     "title": "Name",
     "type": "string"
    },
    "use": {
     "anyOf": [
      {
       "enum": [
        "living",
        "bedroom",
        "kitchen",
        "dining",
        "bathroom",
        "half_bath",
        "laundry",
        "closet",
        "corridor",
        "entry",
        "garage",
        "storage",
        "utility",
        "office",
        "stair",
        "other",
        "drive",
        "walk",
        "yard"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its activity; null = unknown (inferred from the name and components, not stored). A semi-outdoor space says so with semi, an open-air one with kind exterior.",
     "title": "Use"
    },
    "habitability": {
     "anyOf": [
      {
       "enum": [
        "habitable",
        "occupiable",
        "unoccupied"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "habitable (lived in) | occupiable (used otherwise) | unoccupied; null = derived from use.",
     "title": "Habitability",
     "x-bldg-scope": "document"
    },
    "sleeping": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Used for sleeping; null = unknown.",
     "title": "Sleeping",
     "x-bldg-scope": "document"
    },
    "class": {
     "anyOf": [
      {
       "$ref": "#/$defs/SpaceClass"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its classification by system (the IBC function of its floor area); null = unknown.",
     "x-bldg-scope": "document"
    },
    "egress": {
     "anyOf": [
      {
       "enum": [
        "exit_access",
        "exit",
        "exit_stair",
        "exit_passageway",
        "exit_discharge",
        "refuge"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "What it is in the means of egress: exit_access | exit | exit_stair | exit_passageway | exit_discharge | refuge; null = unknown.",
     "title": "Egress",
     "x-bldg-scope": "document"
    },
    "load": {
     "anyOf": [
      {
       "$ref": "#/$defs/SpaceLoad"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its declared occupant data (posted load, fixed seats, bench length); null = none declared.",
     "x-bldg-scope": "document"
    },
    "bound": {
     "description": "The space's outer ring: node ids counter-clockwise (+y up), the first not repeated; each node and the next (the last and the first) are joined by a wall, virtual walls (room separation lines) included.",
     "items": {
      "description": "Id of an existing node (reuse it, do not invent a new one).",
      "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
      "type": "string"
     },
     "minItems": 3,
     "title": "Bound",
     "type": "array"
    },
    "holes": {
     "description": "Its inner rings (a courtyard, an island of walls its area leaves out): node ids clockwise (+y up), each node and the next joined by a wall.",
     "items": {
      "items": {
       "description": "Id of an existing node (reuse it, do not invent a new one).",
       "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
       "type": "string"
      },
      "type": "array"
     },
     "title": "Holes",
     "type": "array"
    },
    "within": {
     "default": "",
     "description": "The space it lies in (a stall in a toilet room, an alcove); \"\" = none.",
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63})?$",
     "title": "Within",
     "type": "string",
     "x-bldg-scope": "document"
    },
    "kind": {
     "default": "interior",
     "description": "interior | exterior (outside the building) | plenum | lot (a lot of the site).",
     "enum": [
      "interior",
      "exterior",
      "plenum",
      "lot"
     ],
     "title": "Kind",
     "type": "string",
     "x-bldg-scope": "document"
    },
    "semi": {
     "anyOf": [
      {
       "$ref": "#/$defs/Semi"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "What makes it semi-outdoor (a balcony, a terrace ...); null = not semi-outdoor.",
     "x-bldg-scope": "document"
    },
    "number": {
     "default": "",
     "description": "Space number as on drawings (e.g. 2.01), apart from the stable id and the name.",
     "maxLength": 32,
     "title": "Number",
     "type": "string",
     "x-bldg-scope": "document"
    },
    "finish": {
     "anyOf": [
      {
       "$ref": "#/$defs/RoomFinish"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The room's own finishes (floor, walls, wainscot, baseboard, ceiling); null = none chosen.",
     "x-bldg-scope": "document"
    },
    "floor": {
     "description": "The rest patch (no placement: the space's floor height and slope, at most one) and the parts of its floor (each placed by ring, near, edges or divide), the first listed showing where parts overlap; none = the level's floor. A ramp's surface is its run space's floor.",
     "items": {
      "$ref": "#/$defs/FloorPatch"
     },
     "maxItems": 64,
     "title": "Floor",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "ceiling": {
     "description": "The rest patch (no placement: the space's ceiling, at most one) and the parts of its ceiling (each placed by ring, near, edges or divide), the first listed showing where parts overlap; none = the level's ceiling.",
     "items": {
      "$ref": "#/$defs/CeilingPatch"
     },
     "maxItems": 64,
     "title": "Ceiling",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "label_offset": {
     "description": "[] or [dx, dy]: moves the name from its automatic spot (inside, clear of components and door swings; the compiler's SpaceGeom.label_auto).",
     "items": {
      "type": "number"
     },
     "maxItems": 2,
     "title": "Label Offset",
     "type": "array",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "bound"
   ],
   "title": "Space",
   "type": "object"
  },
  "SpaceClass": {
   "additionalProperties": false,
   "description": "The classification of a space, keyed by classification system; null = unknown.",
   "properties": {
    "ibc_fn": {
     "anyOf": [
      {
       "enum": [
        "accessory_storage_mechanical",
        "agricultural",
        "aircraft_hangar",
        "airport_control_cab",
        "airport_baggage_claim",
        "airport_baggage_handling",
        "airport_concourse",
        "airport_waiting",
        "gaming_floor",
        "exhibit_gallery",
        "assembly_fixed_seats",
        "assembly_concentrated",
        "assembly_standing",
        "assembly_unconcentrated",
        "bowling_center",
        "business",
        "business_concentrated",
        "courtroom",
        "day_care",
        "dormitory",
        "classroom",
        "vocational_shop",
        "exercise",
        "h5_fabrication",
        "industrial",
        "it_equipment",
        "inpatient_treatment",
        "outpatient",
        "institutional_sleeping",
        "kitchen_commercial",
        "library_reading",
        "library_stack",
        "locker_room",
        "mall",
        "mercantile",
        "vehicle_repair_cmv",
        "vehicle_repair",
        "storage_stock",
        "self_storage",
        "parking_garage",
        "residential",
        "skating_rink",
        "skating_rink_deck",
        "stage_platform",
        "pool_deep",
        "spa",
        "catch_pool",
        "pool_other",
        "warehouse"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The function of IBC Table 1004.4 its floor area serves (residential, business, classroom ...); null = the one its use implies (a premise), else unknown.",
     "title": "Ibc Fn"
    }
   },
   "title": "SpaceClass",
   "type": "object"
  },
  "SpaceLoad": {
   "additionalProperties": false,
   "description": "The occupant data a space declares: an approved (posted) occupant load, its fixed seats and the length of its\nbenches.",
   "properties": {
    "posted": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The approved number of occupants posted for it; null = not declared.",
     "title": "Posted"
    },
    "seats": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "integer"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its number of fixed seats; null = not declared.",
     "title": "Seats"
    },
    "bench": {
     "anyOf": [
      {
       "minimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The total length of its benches; null = not declared.",
     "title": "Bench"
    }
   },
   "title": "SpaceLoad",
   "type": "object"
  },
  "StairFinish": {
   "additionalProperties": false,
   "description": "A stair's own treads (and landings) and risers (and stringers).",
   "properties": {
    "treads": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Treads and landings; null = the floor of the space each flight stands in.",
     "title": "Treads"
    },
    "risers": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Risers and stringers; null = the house's inside trim.",
     "title": "Risers"
    }
   },
   "title": "StairFinish",
   "type": "object"
  },
  "StairType": {
   "additionalProperties": false,
   "description": "A stair construction: its structural system, and whether its risers are open.",
   "properties": {
    "id": {
     "description": "Identifier of this stair type, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "structure": {
     "description": "rc_waist_slab | cast_in_place | precast | steel_stringer | steel_pan | sawn_stringer | housed_stringer | mono_stringer | cantilever | spiral | ladder.",
     "enum": [
      "rc_waist_slab",
      "cast_in_place",
      "precast",
      "steel_stringer",
      "steel_pan",
      "sawn_stringer",
      "housed_stringer",
      "mono_stringer",
      "cantilever",
      "spiral",
      "ladder"
     ],
     "title": "Structure",
     "type": "string"
    },
    "open_risers": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "true = open risers (no riser); null = unknown.",
     "title": "Open Risers"
    }
   },
   "required": [
    "id",
    "structure"
   ],
   "title": "StairType",
   "type": "object"
  },
  "Step": {
   "additionalProperties": false,
   "description": "One step of a flight (winders and irregular steps): the nosing line at the top of its riser and the height of its tread; the last step is the top of the flight.",
   "properties": {
    "nose": {
     "description": "The nosing line [[x, y], [x, y]], left to right looking up.",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "maxItems": 2,
     "minItems": 2,
     "title": "Nose",
     "type": "array"
    },
    "z": {
     "description": "The tread's height above the flight level's datum (the last step: the top of the flight).",
     "title": "Z",
     "type": "number"
    },
    "tread_z": {
     "description": "[z at the nosing, z at the back] of a sloping tread; [] = level at z.",
     "items": {
      "type": "number"
     },
     "maxItems": 2,
     "title": "Tread Z",
     "type": "array"
    }
   },
   "required": [
    "nose",
    "z"
   ],
   "title": "Step",
   "type": "object"
  },
  "Stop": {
   "additionalProperties": false,
   "description": "Where a vertical element meets a level: an opening, space, flight or landing on that level.",
   "properties": {
    "level": {
     "description": "The level it stops at.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Level",
     "type": "string"
    },
    "at": {
     "description": "An opening, space, flight or landing on that level.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "At",
     "type": "string"
    }
   },
   "required": [
    "level",
    "at"
   ],
   "title": "Stop",
   "type": "object"
  },
  "System": {
   "additionalProperties": false,
   "description": "A building system (fire protection, plumbing, HVAC, electrical): its kind, design standard and protected\nextent. Membership of elements is written on the elements, never here.",
   "properties": {
    "id": {
     "description": "Identifier of this system, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "kind": {
     "description": "What it is: sprinkler | standpipe | fire_alarm | voice (emergency voice / alarm communication) | ... | telecom.",
     "enum": [
      "sprinkler",
      "standpipe",
      "fire_hydrant",
      "fire_water_supply",
      "fire_alarm",
      "smoke_detection",
      "voice",
      "pressurization",
      "smoke_control",
      "smoke_exhaust",
      "domestic_cold",
      "domestic_hot",
      "sanitary",
      "vent",
      "storm",
      "gas",
      "supply_air",
      "return_air",
      "exhaust",
      "mech_vent",
      "heating",
      "cooling",
      "service",
      "feeder",
      "branch_circuit",
      "emergency_power",
      "lighting",
      "lightning_protection",
      "telecom"
     ],
     "title": "Kind",
     "type": "string"
    },
    "std": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its design standard (nfpa13, nfpa13r, nfpa13d, gb50084 for a sprinkler system); null = unknown.",
     "title": "Std"
    },
    "covers": {
     "description": "The buildings, levels, spaces and groups it protects or serves.",
     "items": {
      "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
      "type": "string"
     },
     "maxItems": 256,
     "title": "Covers",
     "type": "array"
    },
    "excludes": {
     "description": "The buildings, levels, spaces and groups inside what it covers that it leaves out.",
     "items": {
      "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
      "type": "string"
     },
     "maxItems": 256,
     "title": "Excludes",
     "type": "array"
    }
   },
   "required": [
    "id",
    "kind"
   ],
   "title": "System",
   "type": "object"
  },
  "Text": {
   "additionalProperties": false,
   "description": "Text printed on the plan: space numbers, printed areas, door / window marks, notes (a space's name is the space's\nname field, drawn at the space's label spot).",
   "properties": {
    "id": {
     "description": "Identifier of this element, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "role": {
     "default": "other",
     "enum": [
      "room_number",
      "area",
      "mark",
      "level",
      "note",
      "other"
     ],
     "title": "Role",
     "type": "string"
    },
    "ref": {
     "default": "",
     "description": "Id of the element the text labels (a space for room_number / area, a wall, opening or component for mark); \"\" = none.",
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63})?$",
     "title": "Ref",
     "type": "string"
    },
    "text": {
     "description": "Exactly as printed.",
     "maxLength": 200,
     "minLength": 1,
     "title": "Text",
     "type": "string"
    },
    "x": {
     "description": "Anchor x (centre of the text).",
     "title": "X",
     "type": "number"
    },
    "y": {
     "description": "Anchor y.",
     "title": "Y",
     "type": "number"
    }
   },
   "required": [
    "id",
    "text",
    "x",
    "y"
   ],
   "title": "Text",
   "type": "object"
  },
  "Threshold": {
   "additionalProperties": false,
   "description": "A threshold of an opening type.",
   "properties": {
    "h": {
     "description": "Height above the higher adjacent finished floor; 0 = no threshold.",
     "minimum": 0,
     "title": "H",
     "type": "number"
    },
    "depth": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Depth across the wall; null = the wall's thickness.",
     "title": "Depth"
    }
   },
   "required": [
    "h"
   ],
   "title": "Threshold",
   "type": "object"
  },
  "UValue": {
   "additionalProperties": false,
   "description": "A U-value and what it rests on.",
   "properties": {
    "v": {
     "exclusiveMinimum": 0,
     "title": "V",
     "type": "number"
    },
    "basis": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Basis"
    }
   },
   "required": [
    "v"
   ],
   "title": "UValue",
   "type": "object"
  },
  "Unit": {
   "additionalProperties": false,
   "description": "What a dwelling or sleeping unit adds: its accessibility classes, its entrance doors and its unit type label.",
   "properties": {
    "access": {
     "anyOf": [
      {
       "$ref": "#/$defs/UnitAccess"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its accessibility classes; null = unknown."
    },
    "entrance": {
     "description": "Ids of its entrance doors (on any level).",
     "items": {
      "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
      "type": "string"
     },
     "title": "Entrance",
     "type": "array"
    },
    "template": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its unit type label (annotation, e.g. 2B); null = none.",
     "title": "Template"
    }
   },
   "title": "Unit",
   "type": "object"
  },
  "UnitAccess": {
   "additionalProperties": false,
   "description": "A unit's accessibility classes; null = unknown.",
   "properties": {
    "a117": {
     "anyOf": [
      {
       "enum": [
        "type_a",
        "type_b",
        "type_c",
        "accessible",
        "none"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "ICC A117.1 dwelling or sleeping unit class: type_a | type_b | type_c | accessible | none.",
     "title": "A117"
    },
    "ada": {
     "anyOf": [
      {
       "enum": [
        "accessible",
        "none"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "2010 ADA Standards: accessible | none.",
     "title": "Ada"
    }
   },
   "title": "UnitAccess",
   "type": "object"
  },
  "Uplift": {
   "additionalProperties": false,
   "description": "An uplift rating.",
   "properties": {
    "std": {
     "anyOf": [
      {
       "maxLength": 64,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Std"
    },
    "rating": {
     "anyOf": [
      {
       "maxLength": 32,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "title": "Rating"
    }
   },
   "title": "Uplift",
   "type": "object"
  },
  "Vertical": {
   "additionalProperties": false,
   "description": "A vertical element: a stair (its flights and intermediate landings), a ramp (its runs over sloped floors) or a shaft (the spaces it encloses), and the levels it connects (stops). A field of another kind than its own stays at its default.",
   "properties": {
    "id": {
     "description": "Identifier of this vertical element, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "kind": {
     "description": "stair | ramp | shaft.",
     "enum": [
      "stair",
      "ramp",
      "shaft"
     ],
     "title": "Kind",
     "type": "string"
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 200,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A display name; null = none.",
     "title": "Name"
    },
    "type": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A stair's stair type: a stair_types id or bldg:stair_type.typical; null = the typical stair.",
     "title": "Type"
    },
    "form": {
     "anyOf": [
      {
       "enum": [
        "straight",
        "two_flight",
        "switchback",
        "l_landing",
        "l_winder",
        "u_winder",
        "scissor",
        "spiral",
        "curved"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A stair's plan form: straight | two_flight | switchback | l_landing | l_winder | u_winder | scissor | spiral | curved; null = unknown.",
     "title": "Form"
    },
    "enclosure": {
     "anyOf": [
      {
       "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The shaft a stair is enclosed in; null = none.",
     "title": "Enclosure"
    },
    "enclosure_kind": {
     "anyOf": [
      {
       "enum": [
        "open",
        "enclosed",
        "smokeproof",
        "pressurized"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "open | enclosed | smokeproof | pressurized; null = unknown.",
     "title": "Enclosure Kind"
    },
    "use": {
     "anyOf": [
      {
       "enum": [
        "pedestrian",
        "vehicular"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A ramp's use: pedestrian | vehicular; null = unknown.",
     "title": "Use"
    },
    "edge": {
     "anyOf": [
      {
       "enum": [
        "curb",
        "rail",
        "wall",
        "none"
       ],
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "What protects a ramp's open edges: curb | rail | wall | none; null = unknown.",
     "title": "Edge"
    },
    "flights": {
     "description": "A stair's flights.",
     "items": {
      "$ref": "#/$defs/Flight"
     },
     "maxItems": 256,
     "title": "Flights",
     "type": "array"
    },
    "landings": {
     "description": "A stair's intermediate landings.",
     "items": {
      "$ref": "#/$defs/Landing"
     },
     "maxItems": 256,
     "title": "Landings",
     "type": "array"
    },
    "runs": {
     "description": "A ramp's runs.",
     "items": {
      "$ref": "#/$defs/Run"
     },
     "maxItems": 256,
     "title": "Runs",
     "type": "array"
    },
    "members": {
     "description": "A shaft's spaces, one or more per level it passes.",
     "items": {
      "$ref": "#/$defs/Member"
     },
     "maxItems": 1024,
     "title": "Members",
     "type": "array"
    },
    "stops": {
     "description": "The levels it connects and where it meets each.",
     "items": {
      "$ref": "#/$defs/Stop"
     },
     "maxItems": 1024,
     "title": "Stops",
     "type": "array"
    },
    "finish": {
     "anyOf": [
      {
       "$ref": "#/$defs/StairFinish"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A stair's own treads and risers; null = the floor under each flight and the house's trim.",
     "title": "Finish",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "kind"
   ],
   "title": "Vertical",
   "type": "object"
  },
  "View": {
   "additionalProperties": false,
   "description": "A view (presentation, §4.7): a level's floor plan or its reflected ceiling plan, an elevation of the plan seen from the side its dir faces, or a section of the plan cut along its line and seen across it, and the scale it is drawn at. It never changes geometry, validity or a code check.",
   "properties": {
    "id": {
     "description": "Identifier of this view, unique across the plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "kind": {
     "description": "plan (the floor plan) | rcp (the reflected ceiling plan) | elevation (the plan seen from one side; no level) | section (the plan cut along a line and seen across it; no level).",
     "enum": [
      "plan",
      "rcp",
      "elevation",
      "section"
     ],
     "title": "Kind",
     "type": "string"
    },
    "level": {
     "default": "",
     "description": "The level a plan or rcp view draws (one view of each kind per level); \"\" for an elevation or a section.",
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63})?$",
     "title": "Level",
     "type": "string"
    },
    "line": {
     "description": "A section's cut: two plan points [[x0, y0], [x1, y1]], as wide as the drawing; [] for the other kinds.",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "maxItems": 2,
     "title": "Line",
     "type": "array"
    },
    "dir": {
     "anyOf": [
      {
       "items": {
        "maximum": 1000,
        "minimum": -1000,
        "type": "integer"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "An elevation's plan direction [dx, dy] (integers in lowest terms) the side it shows faces, towards the viewer: [0, -1] the south elevation, project north up; a section's: its line's normal on the viewer's side (within 0.06 degrees), [0, -1] looking north.",
     "title": "Dir"
    },
    "depth": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "How far beyond a section's cut it shows, in the plan; null = all of the plan beyond it.",
     "title": "Depth"
    },
    "z": {
     "anyOf": [
      {
       "items": {
        "type": "number"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A section's height range [bottom, top] in project z; null = all of it.",
     "title": "Z"
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 200,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "An elevation's or a section's title; null = the compass words (South elevation), a section's Section <n>.",
     "title": "Name"
    },
    "crop": {
     "description": "An elevation's crop: two corners [[s0, z0], [s1, z1]], s along the drawing's right from the plan origin and z project z; [] = the whole plan.",
     "items": {
      "items": {
       "type": "number"
      },
      "type": "array"
     },
     "maxItems": 2,
     "title": "Crop",
     "type": "array"
    },
    "scale": {
     "anyOf": [
      {
       "items": {
        "maximum": 10000,
        "minimum": 1,
        "type": "integer"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The scale [1, N] (1:N) it is drawn at; null = the drawing style's default (1:48 for bldg:style.us, else 1:100).",
     "title": "Scale"
    }
   },
   "required": [
    "id",
    "kind"
   ],
   "title": "View",
   "type": "object"
  },
  "Wall": {
   "additionalProperties": false,
   "description": "Directed wall node line start -> end (node ids) of its type, or of the types stacked over its height: the type's layers run from face A (the left of start -> end) to face B, the node line through their middle.",
   "properties": {
    "id": {
     "description": "Identifier of this element, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "start": {
     "description": "Id of an existing node (reuse it, do not invent a new one).",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Start",
     "type": "string"
    },
    "end": {
     "description": "Id of an existing node (reuse it, do not invent a new one).",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "End",
     "type": "string"
    },
    "type": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Id of its wall type (a wall_types row or a library entry bldg:wall_type.*); none with a stack.",
     "title": "Type"
    },
    "stack": {
     "description": "Different constructions stacked over its height, from its base up, covering it without gaps; then it names no type.",
     "items": {
      "$ref": "#/$defs/WallStack"
     },
     "maxItems": 16,
     "title": "Stack",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "flip": {
     "default": false,
     "description": "true: its type's layers run from face B to face A.",
     "title": "Flip",
     "type": "boolean",
     "x-bldg-scope": "document"
    },
    "base": {
     "default": 0.0,
     "description": "Its bottom above the level datum.",
     "title": "Base",
     "type": "number",
     "x-bldg-scope": "document"
    },
    "top": {
     "anyOf": [
      {
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Its top above the level datum; null = up to the slab above, or the storey height.",
     "title": "Top",
     "x-bldg-scope": "document"
    },
    "top_to": {
     "description": "Ceiling patch or level ceiling ids it rises to instead (a partition up to the ceiling); not with top.",
     "items": {
      "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
      "type": "string"
     },
     "maxItems": 16,
     "title": "Top To",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "top_over": {
     "default": 0.0,
     "description": "How far above its top_to ceilings it stops.",
     "title": "Top Over",
     "type": "number",
     "x-bldg-scope": "document"
    },
    "assembly": {
     "anyOf": [
      {
       "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The listed assembly it claims (an assemblies row or bldg:assembly.*); it applies only when the assembly covers its type.",
     "title": "Assembly",
     "x-bldg-scope": "document"
    },
    "fn": {
     "description": "Its functional roles: fire_wall, fire_barrier, party, corridor, bearing, parapet, lot lines ...",
     "items": {
      "enum": [
       "fire_wall",
       "fire_barrier",
       "fire_partition",
       "smoke_barrier",
       "smoke_partition",
       "corridor",
       "exit_enclosure",
       "shaft_enclosure",
       "dwelling_separation",
       "garage_separation",
       "atrium_separation",
       "party",
       "parapet",
       "bearing",
       "foundation_wall",
       "retaining",
       "stem_wall",
       "lot_line.front",
       "lot_line.side",
       "lot_line.rear",
       "row_line",
       "street_centerline",
       "imaginary_lot_line",
       "zoning_district_line"
      ],
      "type": "string"
     },
     "maxItems": 24,
     "title": "Fn",
     "type": "array",
     "x-bldg-scope": "document"
    },
    "finishes": {
     "description": "Finish exceptions on its faces.",
     "items": {
      "$ref": "#/$defs/WallFinish"
     },
     "maxItems": 64,
     "title": "Finishes",
     "type": "array",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "start",
    "end"
   ],
   "title": "Wall",
   "type": "object"
  },
  "WallFinish": {
   "additionalProperties": false,
   "description": "A finish exception on a face of a wall: the room whose face it covers (null: the faces toward outside), its range along the node line and in height, and its finish.",
   "properties": {
    "id": {
     "description": "Identifier of this entry, unique across the whole plan.",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "space": {
     "anyOf": [
      {
       "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The room whose face of the wall it covers; null = the wall's face(s) toward outside.",
     "title": "Space"
    },
    "s": {
     "anyOf": [
      {
       "items": {
        "type": "number"
       },
       "maxItems": 2,
       "minItems": 2,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "[s0, s1] along the node line from the start node; null = the whole length.",
     "title": "S"
    },
    "from": {
     "default": 0.0,
     "description": "The bottom above the finished floor of the room at the face (outside: above the bottom of the outside face).",
     "minimum": 0,
     "title": "From",
     "type": "number"
    },
    "to": {
     "anyOf": [
      {
       "exclusiveMinimum": 0,
       "type": "number"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "The top, same reference; null = the ceiling at the face (or the wall top).",
     "title": "To"
    },
    "finish": {
     "description": "The finish: a finish row id or a library finish id.",
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
     "title": "Finish",
     "type": "string"
    }
   },
   "required": [
    "id",
    "finish"
   ],
   "title": "WallFinish",
   "type": "object"
  },
  "WallStack": {
   "additionalProperties": false,
   "description": "One construction of a stacked wall: its type over a z range above the level datum.",
   "properties": {
    "z": {
     "description": "[z0, z1]: the range above the level datum.",
     "items": {
      "type": "number"
     },
     "maxItems": 2,
     "minItems": 2,
     "title": "Z",
     "type": "array"
    },
    "type": {
     "description": "Id of its wall type (a wall_types row or bldg:wall_type.*).",
     "pattern": "^([A-Za-z_][A-Za-z0-9_.\\-]{0,63}|bldg:[a-z0-9][a-z0-9_.\\-]{0,63})$",
     "title": "Type",
     "type": "string"
    }
   },
   "required": [
    "z",
    "type"
   ],
   "title": "WallStack",
   "type": "object"
  },
  "WallType": {
   "additionalProperties": false,
   "description": "A wall type: its kind and its layers from face A to face B (their total is the wall's thickness), whether it bears load, its unlisted fire ratings, reaction to fire, sound ratings and U-value.",
   "properties": {
    "id": {
     "description": "Type mark, e.g. WT1 (international), Q240 (China) or WT4.5 (US).",
     "pattern": "^[A-Za-z_][A-Za-z0-9_.\\-]{0,63}$",
     "title": "Id",
     "type": "string"
    },
    "kind": {
     "description": "solid | partition | curtain | glazed | demountable | operable | toilet_partition | frame | virtual (no body) | line (zero thickness) | marking | curb | fence.",
     "enum": [
      "solid",
      "partition",
      "curtain",
      "glazed",
      "demountable",
      "operable",
      "toilet_partition",
      "frame",
      "virtual",
      "line",
      "marking",
      "curb",
      "fence"
     ],
     "title": "Kind",
     "type": "string"
    },
    "layers": {
     "description": "From face A to face B; their total is the wall's thickness (a single thickness: one core layer). None for virtual, line, marking and frame.",
     "items": {
      "$ref": "#/$defs/Layer"
     },
     "maxItems": 32,
     "title": "Layers",
     "type": "array"
    },
    "load_bearing": {
     "anyOf": [
      {
       "type": "boolean"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "true = it can bear load; null = unknown.",
     "title": "Load Bearing",
     "x-bldg-scope": "document"
    },
    "fire": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Fire"
       },
       "maxItems": 16,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Unlisted fire ratings (listed ones are assemblies); [] = not rated; null = unknown.",
     "title": "Fire",
     "x-bldg-scope": "document"
    },
    "reaction": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Reaction"
       },
       "maxItems": 8,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Reaction to fire of its exposed faces; null = from the layers' materials.",
     "title": "Reaction",
     "x-bldg-scope": "document"
    },
    "acoustic": {
     "anyOf": [
      {
       "items": {
        "$ref": "#/$defs/Acoustic"
       },
       "maxItems": 16,
       "type": "array"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Sound ratings; null = unknown.",
     "title": "Acoustic",
     "x-bldg-scope": "document"
    },
    "u": {
     "anyOf": [
      {
       "$ref": "#/$defs/UValue"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "U-value; null = derived from the layers.",
     "title": "U",
     "x-bldg-scope": "document"
    },
    "name": {
     "anyOf": [
      {
       "maxLength": 100,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "A readable name.",
     "title": "Name",
     "x-bldg-scope": "document"
    },
    "note": {
     "anyOf": [
      {
       "maxLength": 500,
       "type": "string"
      },
      {
       "type": "null"
      }
     ],
     "default": null,
     "description": "Free description: construction notes not yet expressed as fields.",
     "title": "Note",
     "x-bldg-scope": "document"
    },
    "key": {
     "default": "",
     "description": "Internal identity (IFC type GlobalIds), written once by the editing engine when the type's first element would change; kept by renames and resizes. \"\" = the first element that uses it.",
     "maxLength": 100,
     "title": "Key",
     "type": "string",
     "x-bldg-scope": "document"
    }
   },
   "required": [
    "id",
    "kind"
   ],
   "title": "WallType",
   "type": "object"
  }
 },
 "additionalProperties": false,
 "description": "Root document.",
 "properties": {
  "metadata": {
   "$ref": "#/$defs/Metadata"
  },
  "materials": {
   "description": "Materials the construction rows name (library materials need no row).",
   "items": {
    "$ref": "#/$defs/Material"
   },
   "title": "Materials",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "sections": {
   "description": "Cross-sections of linear parts.",
   "items": {
    "$ref": "#/$defs/Section"
   },
   "title": "Sections",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "finish_types": {
   "description": "Finishes: a row for each finish the plan's surfaces use (usually a library finish with its schedule code), or a finish of the plan's own.",
   "items": {
    "$ref": "#/$defs/FinishType"
   },
   "title": "Finish Types",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "wall_types": {
   "items": {
    "$ref": "#/$defs/WallType"
   },
   "title": "Wall Types",
   "type": "array"
  },
  "slab_types": {
   "description": "Slab types: the construction of roofs and canopies.",
   "items": {
    "$ref": "#/$defs/SlabType"
   },
   "title": "Slab Types",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "assemblies": {
   "description": "Listed combinations with fire and acoustic ratings.",
   "items": {
    "$ref": "#/$defs/Assembly"
   },
   "title": "Assemblies",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "opening_types": {
   "items": {
    "$ref": "#/$defs/OpeningType"
   },
   "title": "Opening Types",
   "type": "array"
  },
  "component_types": {
   "items": {
    "$ref": "#/$defs/ComponentType"
   },
   "title": "Component Types",
   "type": "array"
  },
  "rail_types": {
   "description": "Rail types: handrails, guards, grab bars.",
   "items": {
    "$ref": "#/$defs/RailType"
   },
   "title": "Rail Types",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "stair_types": {
   "description": "Stair constructions.",
   "items": {
    "$ref": "#/$defs/StairType"
   },
   "title": "Stair Types",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "buildings": {
   "description": "The buildings of the project and their neighbours (with no rows: one implicit building).",
   "items": {
    "$ref": "#/$defs/Building"
   },
   "title": "Buildings",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "groups": {
   "description": "Dwelling units, occupancies, fire areas, tenancies and other sets of records.",
   "items": {
    "$ref": "#/$defs/Group"
   },
   "title": "Groups",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "systems": {
   "description": "Fire protection, plumbing, HVAC and electrical systems and what they cover.",
   "items": {
    "$ref": "#/$defs/System"
   },
   "title": "Systems",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "vertical": {
   "description": "Stairs, ramps and shafts: the elements that join levels.",
   "items": {
    "$ref": "#/$defs/Vertical"
   },
   "title": "Vertical",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "premises": {
   "description": "Exception claims, design assumptions, approvals, waivers ... the compliance check rests on.",
   "items": {
    "$ref": "#/$defs/Premise"
   },
   "title": "Premises",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "views": {
   "description": "The views of the levels (presentation): the scale each level's floor plan and reflected ceiling plan is drawn at.",
   "items": {
    "$ref": "#/$defs/View"
   },
   "title": "Views",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "levels": {
   "items": {
    "$ref": "#/$defs/Level"
   },
   "minItems": 1,
   "title": "Levels",
   "type": "array"
  },
  "evidence": {
   "description": "Provenance: how each element's / type's data was obtained, and what needs checking.",
   "items": {
    "$ref": "#/$defs/Evidence"
   },
   "title": "Evidence",
   "type": "array",
   "x-bldg-scope": "document"
  },
  "external_ids": {
   "description": "Identities of the plan's objects in the sources they were imported from.",
   "items": {
    "$ref": "#/$defs/ExternalId"
   },
   "title": "External Ids",
   "type": "array",
   "x-bldg-scope": "document"
  }
 },
 "required": [
  "metadata",
  "levels"
 ],
 "title": "FloorPlan",
 "type": "object"
}
