function up(svg, d) {
if (!d.parent || !svg.selectAll(".exit").empty()) return;
svg.select(".background").datum(d.parent);
const transition1 = svg.transition().duration(duration);
const transition2 = transition1.transition();
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("g").transition(transition2)
.attr("transform", stack(d.index));
exit.selectAll("rect").transition(transition1)
.attr("width", d => x(d.value) - x(0))
.attr("fill", color(true));
exit.transition(transition2)
.attr("fill-opacity", 0)
.remove();
const enter = bar(svg, down, d.parent, ".exit")
.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", d => color(!!d.children))
.attr("fill-opacity", p => p === d ? 0 : null)
.transition(transition2)
.attr("width", d => x(d.value) - x(0))
.on("end", function(p) { d3.select(this).attr("fill-opacity", 1); });
}