n linkLabelArc (d) {
        if (d.source.x > d.target.x) { // swap the source/target for flipping the text
          const r = Math.hypot(d.target.x - d.source.x, d.target.y - d.source.y)
          return `M${d.target.x},${d.target.y} A${r},${r} 0 0 0 ${d.source.x},${d.source.y}`
        } else {
          return linkArc(d)
        }
      }

      link.attr('d', linkArc)
      linkLabelPath.attr('d', linkLabelArc)
      node.attr('transform', d => `translate(${d.x},${d.y})`)
      if (popup) { updatePopup