OpenFst - Release 1.3
   * Support for non-fatal exits on errors: (1.3.1)
      * Added FLAGS_fst_error_fatal: FST errors are
        fatal if true (default); o.w. return objects flagged as bad: 
        e.g., FSTs - kError
        prop. true, FST weights - not a Member().
      * Added kError property bit signifying bad FST
      * Added  NoWeight() method to FST weight requirements that returns 
        weight that is not a Member().
   * Various improvements to the FAR extensions (1.3.1)
      * a single FST is now a FAR type
      * FLAGS_initial_symbols: Uses the symbol table from the 
        first FST in the archive for all entries"
      * Input/output to standard input/output for some FAR and arc types
  * --with-icu configuration option no longer needed (1.3.1)
  * Improved flags usage esp. if use SET_FLAGS not SetFlags/InitFst (1.3.2)
  * Added 'fst' as possible far writer type (1.3.2)
  * phi matcher can now accept 0 as the phi label (1.3.2)
  * Added ngram-fst extension (1.3.2)
  * Improved performance of PDT composition (1.3.3)
  * Memory-map support (1.3.3)
  * Fixed cross-FST serialization issues (1.3.3)
  * Fixed NGramFst off-by-one issue (1.3.3)
  * farextract now allows one to specify a list of comma-separated keys,
    including key ranges (1.3.3)

OpenFst - Release 1.2
   * Added lookahead matching and filtering for faster composition
   * Added EditFst for mutation of o.w. immutable FSTs
   * Added script sub-namespace defining type FstClass - a non-templated
     Fst<Arc> to hold the arc template type internally. This and FST
     operations on it allow easier I/O and scripting at the cost of some
     runtime dispatching.
   * Added per-arc-iterator control of Fst caching.
   * Added PowerWeight and Power Arc.
   * Added SparsePowerWeight and SparsePowerArc (1.2.4)
   * Added SignedLogWeight and SignedLogArc (1.2.4)
   * Added ExpectationWeight and ExpectationArc (1.2.4)
   * Added AStarQueue, PruneQueue and NaturalPruneQueue disciplines (1.2.6)
   * Added Log64Weight and Log64Arc to FST library throughout, including 
     support throughout scripts/bins/dsos (1.2.8)
   * Added delayed RandGenFst that outputs tree of paths weighted
     by count (1.2.8)
   * Added fstsymbols shell-level command
   * Added total weight removal option to pushing
   * Changed methods for symbol table mutation:
     use MutableInputSymbols()/MutableOutputSymbols().
   * Numerous efficiency improvements esp in composition, replace, and caching
   * Made "fstmap" handle semiring conversion by adding "to_std", "to_log"
     and "to_log64" as supported 'map_type' arguments (1.2.8).
   * Made the destructive implementation of RmEpsilon skip over states
     admitting no non-epsilon incoming transition (1.2.8). 
   * Fixed numerous bugs (1.2 through 1.2.9) including:
     - improper types of some approximation deltas
     - sub-optimal hashing functions
     - issues in internal reuse of shortest distance
     - hashing bug in FloatWeight       
     - bug in shortest path queue 
     - symbol table checksumming issues
     - various C++ standards issues
     - Visit() behavior when visitation aborted
     - Decode() hash performance bug (1.2.1)
     - EditFst::Copy(bool) method when the boolean parameter is true (1.2.7)
     - SymbolTable memory leak in Invert() (1.2.8)
     - Added escaping of " and \ in labels in fstdraw, needed for dot to
       function properly (1.2.8) 
     - Fixed handling of final weight of start state in fstpush (1.2.8)
     - Added FST_LL_FORMAT to fix 64-bit integer printf issues (1.2.9)
     - Fixed missing <functional> includes (1.2.9)
     - Fixed reused local variable names (1.2.9)
     - Fixed passing string by reference in FstDraw args (1.2.9)
   * Added extensions directories including:
     - finite-state archive (FAR) utilities,
       added stlist format supporting writing/reading to/from standard out/in
       at the library-level (1.2.8)
     - compact fsts
     - lookahead fsts
     - pushdown transducers (improved in 1.2.1 through 1.2.7).
   * Added StateMap/StateMapFst; renamed Map/MapFst to ArcMap/ArcMapFst;
     map/MapFst retained (but deprecated) (1.2.9)
   * Deleted ArcSum() and ArcMerge; use StateMap w/ ArcSumMapper and 
     ArcUniqueMapper (1.2.9).
   * Incremented version of ConstFst/CompactFsts to stop memory alignment
     that fails on pipes. Made old version raises errors when read on 
     pipes (1.2.9).
   * Improved determinize hash (1.2.9)
   * Removed stdio uses (1.2.10)
   * Fixed library ordering issues esp. with newer GNU build tools (1.2.10)

OpenFst - Release 1.1
   * Added compat.h to src/include/fst to fix missing defines
   * Fixed bug in acyclic minimization that led to non-minimal 
     (but equiv) results
   * Fixed missing FST typedef in various matchers in matcher.h
     so that they can be cascaded
   * Opened file streams binary where appropriate

OpenFst - Release 1.0

   Additions to beta version:

   * Matcher class added for matching labels at FST states. Includes
     special matchers for sigma (any), rho ('rest'), and phi ('fail')
     labels. (see matcher.h)
   * Composition generalized with arbitrary filters, matchers, and state tables.
     Sequence and matching composition filters provided. (see compose.h, 
     compose-filter.h, matcher.h, state-table.h)
   * Unique n-best (see shortest-path.h)
   * Pruning in determinization and epsilon removal (see determinize.h, 
     rmepsilon.h)
   * New Fst classes: 
      * Compact Fsts for space-efficient representation (see compact-fst.h)
   * New Weight classes: 
      * MinMax
      * Lexicographic
   * Miscellaneous bug fixes
