code: private byte[] serialized(Set<String> excluded) {
          Feature[] includedFeatures = featuresSorted(excluded);
          final var featureNr = includedFeatures.length;
          byte[][] featuresSerialized = new byte[featureNr][];
          var i = 0;
          var size = 0;
          for (final var feature : includedFeatures) {
              featuresSerialized[i] = feature.serialized();
              size += featuresSerialized[i].length;
              i++;
          }
  
          final var buffer = ByteBuffer.allocate(size + Integer.BYTES * (featureNr + 1));
          buffer.putInt(MAGIC);
          for (final var featureSerialized : featuresSerialized) {
              buffer.putInt(featureSerialized.length);
              buffer.put(featureSerialized);
          }
          return buffer.array();
      }
docs: Create a byte array representation of the license. Include all the features except those whose name is specified
  in the {@code excluded} set.
  
  @param excluded set of the feature names that are not to be present in the byte array representation of the
  license.
  @return the byte array containing the license information except the excluded features. The byte array
  creation is deterministic in the sense that the same license will always result the same byte array. The features
  converted into binary and concatenated and their order is determined by primitive sorting.