 
   dump: ->
     unless @rangeCacheFresh
+      @rootNode.ids.forEach (id) => @rangeCache[id] ?= templateRange()
       @rootNode.dump(Point.ZERO, @rangeCache)
       @rangeCacheFresh = true
     @rangeCache


  clearRangeCache: ->
    @rangeCache = {}
    @rootNode.ids.forEach (id) => @rangeCache[id] = templateRange()
    @rangeCacheFresh = false

  condenseIfNeeded: ->

      Range(start, @getEnd(id))

  getStart: (id) ->
    return unless @rootNode.ids.has(id)

    entry = @rangeCache[id] ?= templateRange()
    entry.start ?= @rootNode.getStart(id)

  getEnd: (id) ->
    return unless @rootNode.ids.has(id)

    entry = @rangeCache[id] ?= templateRange()
    entry.end ?= @rootNode.getEnd(id)

  findContaining: (start, end) ->
    containing = new Set
