function up(svg, d, subtitle) {
if (!d.parent) return
const transition1 = () => svg.transition().duration(duration)
const transition2 = () => transition1().transition()
svg.select(".backButton").datum(d.parent)
.transition(transition1())
.style("fill-opacity", 0)
const exit = svg.selectAll(".enter")
.attr("class", "exit")
x.domain([0, d3.max(d.parent.children, d => d.value)])
svg.selectAll(".x-axis").transition(transition1())
.call(xAxis)
exit.selectAll("g").transition(transition1())
.attr("transform", stagger())
exit.selectAll("rect").transition(transition1())
.attr("width", d => x(d.value) - x(0))
.style("fill", colorMain)
exit.selectAll("g").transition(transition2())
.attr("transform", stack(d.index))
exit.transition(transition2())
.attr("fill-opacity", 0)
.remove()
const enter = bar(svg, d.parent, down, subtitle)
.attr("fill-opacity", 0)
enter.selectAll("g")
.attr("transform", (d, i) => `translate(0, ${barStep * i})`)
enter.transition(transition2())
.attr("fill-opacity", 1)
enter.selectAll("rect")
.attr("fill-opacity", p => p === d ? 0 : null)
.transition(transition2())
.on("end", function() { d3.select(this).attr("fill-opacity", 1) })
subtitle.style("opacity", 0)
}