#include <iostream>
#include <string>

struct lit {
  const char *str;
  lit(const char *str) : str(str) {}
};
std::istream& operator>>(std::istream& in, lit l)
{
  char c; in >> c;
  while (in && *l.str) {
    if (*l.str != c) in.setstate(std::ios_base::failbit);
    if (isspace(*++l.str))
      in >> c, l.str++;
    else
      c = in.get();
  }
  return in;
}

struct HkmHeader { 
    std::string version; 
    int numNodes; 
    int numLeaves; 
}; 
  
struct HkmParams { 
    int branchFactor; 
    int maxTreeDepth; 
    int desiredNumSamplesPerCluster; 
    int numClusteringRuns; 
    int standardization; 
    int meanSubtraction; 
    int noInternalLeafStats; 
    int termCritMaxCount; 
    float termCritEpsilon; 
    int termCritType; 
}; 
  
struct HkmFile { 
    HkmHeader header; 
    HkmParams params; 
};

std::istream& operator>>(std::istream& in, HkmHeader& f)
{
  return in >> lit("class HkmTree Format:") >> f.version
            >> lit("#nodes:") >> f.numNodes
            >> lit("#leaves:") >> f.numLeaves;
}

std::istream& operator>>(std::istream& in, HkmParams& f)
{
  int dummy;
  return in >> lit("<HkmParams")
            >> lit("branchFactor:") >>                f.branchFactor
            >> lit("maxTreeDepth:") >>                f.maxTreeDepth 
            >> lit("desiredNumSamplesPerCluster:") >> f.desiredNumSamplesPerCluster 
            >> lit("minNumSamplesPerCluster:") >>     dummy 
            >> lit("numClusteringRuns:") >>           f.numClusteringRuns
            >> lit("standardization:") >>             f.standardization
            >> lit("meanSubtraction:") >>             f.meanSubtraction
            >> lit("noInternalLeafStats:") >>         f.noInternalLeafStats
            >> lit("termCrit.maxCount:") >>           f.termCritMaxCount
            >> lit("termCrit.epsilon:") >>            f.termCritEpsilon
            >> lit("termCrit.type:") >>               f.termCritType
            >> lit(">");
}

std::istream& operator>>(std::istream& in, HkmFile& f)
{
  return in >> f.header >> f.params;
}


std::ostream& operator<<(std::ostream& os, HkmParams const& f)
{
  return os << "<HkmParams"
            << "\n    branchFactor: " <<                f.branchFactor
            << "\n    maxTreeDepth: " <<                f.maxTreeDepth 
            << "\n    desiredNumSamplesPerCluster: " << f.desiredNumSamplesPerCluster 
            << "\n    minNumSamplesPerCluster: " <<     "-1" // ?
            << "\n    numClusteringRuns: " <<           f.numClusteringRuns
            << "\n    standardization: " <<             f.standardization
            << "\n    meanSubtraction: " <<             f.meanSubtraction
            << "\n    noInternalLeafStats: " <<         f.noInternalLeafStats
            << "\n    termCrit.maxCount: " <<           f.termCritMaxCount
            << "\n    termCrit.epsilon: " <<            f.termCritEpsilon
            << "\n    termCrit.type: " <<               f.termCritType
            << "\n>";
}
std::ostream& operator<<(std::ostream& os, HkmHeader const& p)
{
  return os << "version: "   << p.version
            << "\n#numNodes: "  << p.numNodes
            << "\n#numLeaves: " << p.numLeaves; 
}
std::ostream& operator<<(std::ostream& os, HkmFile const& f)
{
  return os << f.header << "\n\n" << f.params;
}

int main()
{
  HkmFile f;
  if (std::cin >> f)
    std::cout << f;
}
