docs: function squarify(node, options, hideChildren, depth) {
      var width;
      var height;
  
      if (node.isRemoved()) {
          return;
      }
  
      var thisLayout = node.getLayout();
      width = thisLayout.width;
      height = thisLayout.height;
  
      // Considering border and gap
      var nodeModel = node.getModel();
      var borderWidth = nodeModel.get(PATH_BORDER_WIDTH);
      var halfGapWidth = nodeModel.get(PATH_GAP_WIDTH) / 2;
      var upperLabelHeight = getUpperLabelHeight(nodeModel);
      var upperHeight = Math.max(borderWidth, upperLabelHeight);
      var layoutOffset = borderWidth - halfGapWidth;
      var layoutOffsetUpper = upperHeight - halfGapWidth;
      var nodeModel = node.getModel();
  
      node.setLayout({
          borderWidth: borderWidth,
          upperHeight: upperHeight,
          upperLabelHeight: upperLabelHeight
      }, true);
  
      width = mathMax(width - 2 * layoutOffset, 0);
      height = mathMax(height - layoutOffset - layoutOffsetUpper, 0);
  
      var totalArea = width * height;
      var viewChildren = initChildren(
          node, nodeModel, totalArea, options, hideChildren, depth
      );
  
      if (!viewChildren.length) {
          return;
      }
  
      var rect = {x: layoutOffset, y: layoutOffsetUpper, width: width, height: height};
      var rowFixedLength = mathMin(width, height);
      var best = Infinity; // the best row score so far
      var row = [];
      row.area = 0;
  
      for (var i = 0, len = viewChildren.length; i < len;) {
          var child = viewChildren[i];
  
          row.push(child);
          row.area += child.getLayout().area;
          var score = worst(row, rowFixedLength, options.squareRatio);
  
          // continue with this orientation
          if (score <= best) {
              i++;
              best = score;
          }
          // abort, and try a different orientation
          else {
              row.area -= row.pop().getLayout().area;
              position(row, rowFixedLength, rect, halfGapWidth, false);
              rowFixedLength = mathMin(rect.width, rect.height);
              row.length = row.area = 0;
              best = Infinity;
          }
      }
  
      if (row.length) {
          position(row, rowFixedLength, rect, halfGapWidth, true);
      }
  
      if (!hideChildren) {
          var childrenVisibleMin = nodeModel.get('childrenVisibleMin');
          if (childrenVisibleMin != null && totalArea < childrenVisibleMin) {
              hideChildren = true;
          }
      }
  
      for (var i = 0, len = viewChildren.length; i < len; i++) {
          squarify(viewChildren[i], options, hideChildren, depth + 1);
      }
  }