docs: private static void traverseAndBuild(int height, int pos, List<Sha256Hash> allLeafHashes, byte[] includeBits,
                                           List<Boolean> matchedChildBits, List<Sha256Hash> resultHashes) {
          boolean parentOfMatch = false;
          // Is this node a parent of at least one matched hash?
          for (int p = pos << height; p < (pos+1) << height && p < allLeafHashes.size(); p++) {
              if (Utils.checkBitLE(includeBits, p)) {
                  parentOfMatch = true;
                  break;
              }
          }
          // Store as a flag bit.
          matchedChildBits.add(parentOfMatch);
          if (height == 0 || !parentOfMatch) {
              // If at height 0, or nothing interesting below, store hash and stop.
              resultHashes.add(calcHash(height, pos, allLeafHashes));
          } else {
              // Otherwise descend into the subtrees.
              int h = height - 1;
              int p = pos * 2;
              traverseAndBuild(h, p, allLeafHashes, includeBits, matchedChildBits, resultHashes);
              if (p + 1 < getTreeWidth(allLeafHashes.size(), h))
                  traverseAndBuild(h, p + 1, allLeafHashes, includeBits, matchedChildBits, resultHashes);
          }
      }