Changes in Version 1.2.0
  o NEW: standardized parameters for psychonetrics models, so that
    semPaths(mod, "std") now works. psychonetrics leaves the 'std' column of
    its parameter table empty, so the standardized solution is computed from
    the model-implied matrices:
      Var(eta) = (I - Beta)^-1 Sigma_zeta (I - Beta)^-T
      Sigma    = Lambda Var(eta) Lambda' + Sigma_epsilon
    Loadings and regressions are rescaled by the ratio of the relevant
    standard deviations, (co)variances are divided by them, and intercepts by
    the variable's standard deviation (the lavaan std.all convention). This
    covers the 'cov', 'ggm', 'chol' and 'prec' parameterizations of both the
    lvm and varcov frameworks: for a GGM block psychonetrics forms
    Sigma_* = Delta (I - Omega)^-1 Delta, so the same expressions apply. Omega
    itself is by construction a matrix of partial correlations and is
    therefore reported unchanged as its own standardized value.

  o Fixed psychonetrics models with an empty GGM block (every omega fixed to
    zero, as for a default residual = "ggm") dropping their delta parameters
    with a "Dropped 10 parameter(s) with unsupported operator(s): ~/~"
    warning, and showing no variances for that block. The block's
    parameterization is now read from the full parameter table, before
    structurally-zero rows are removed.

  o Importing a psychonetrics model whose solution is improper (a
    non-positive model-implied variance) now warns and names the offending
    variables, instead of silently producing standardized values computed
    against a variance clamped to zero.

  o Fixed the regsem importer dropping no parameters for models using ':=',
    '==', '<' or '>': the filter tested 'object$op', and since a regsem object
    has no 'op' element R's partial matching silently resolved this to
    'optim_fit', a number, making the whole test a constant. It now tests the
    lavaan parameter table, as the surrounding lines already did. Models
    without those operators are unaffected.

  o Documentation examples fixed: ?regsemplot called semPlotModel.regsem()
    directly, which is registered for S3 dispatch but never exported and so
    could not be called by a user; it now goes through the semPlotModel()
    generic. The multi-group example in ?semPaths downloaded a LISREL output
    file from sachaepskamp.com that is no longer available, and now shows
    equality constraints on a lavaan measurement-invariance model instead.

  o NEW: PLS-SEM support -- seminr (estimate_pls) and cSEM (csem) models
    import with reflective constructs as directed loadings and composite
    (mode B / formative) constructs as weight arrows into the construct

  o blavaan objects are imported natively (via lavaan-method inheritance)
    instead of overwriting their class; posterior means and standardized
    posterior solutions display as est/std
  o NEW: metaSEM stage-2 models (tssem2()/wls()) plot via metaSEM's
    meta2semPlot() bridge; stage-1 pooling objects error informatively

  o Documented and regression-tested umx compatibility (umxRAM models are
    MxRAMModels and import via the OpenMx importer)
  o NEW: lavaan.mi support -- pooled multiple-imputation fits display
    Rubin's-rules pooled estimates and pooled standardized solutions

  o NEW: piecewiseSEM support -- psem() models import their directed paths
    (with piecewiseSEM's standardized estimates) and correlated errors
    (x %~~% y) as bidirectional edges
  o NEW: psych support -- fa() (directed loadings, factor correlations for
    oblique rotations, uniqueness self-loops) and omega() (bifactor /
    Schmid-Leiman structure; pair with semPaths(..., bifactor = 'g',
    layout = 'tree2')); new 'cut' argument to omit small loadings.
    principal() was already supported
  o NEW: registerSemPlotImporter() lets other packages plug importers for
    their model classes into semPlotModel()/semPaths(); the new
    validateSemPlotModel() checks the semPlotModel contract and is run
    automatically by semPaths()
  o Added a regression test suite (tests/regression-tests.R)
  o sem, XML, lisrelToR, rockchalk and OpenMx are now optional (Suggests):
    each serves a single importer and is loaded on demand with an
    informative message when missing; installing semPlot is much lighter

  o semPaths() and semPlotModel() no longer crash on inline calls containing
    a '+' (e.g. semPaths(lm(y ~ x + z, data))); combining models with '+' now
    uses AST inspection of the unevaluated argument
  o Fixed the all-NA 'std' column for non-gaussian GLMs (fallback of the 1.1.8
    standardize() fix)
  o semPaths(DoNotPlot=TRUE) no longer opens a graphics device; par(ask) and
    panelGroups/semCors layout() are restored exception-safely
  o semPlotModel.default now reports every importer's failure message instead
    of 'Object not recognized as SEM model'
  o glm importer classifies intercepts by exact name; semCors errors
    informatively for models without covariance matrices; semSyntax skips
    interaction terms with a warning
  o NEW: psychonetrics support (lvm and varcov frameworks, all cov/ggm/chol/
    prec subtypes; multigroup). GGM blocks are displayed as undirected
    network edges, with delta scalings replaced by implied variances by
    default (delta argument: 'variance', 'ignore', 'show')
  o Undirected ('--') edges are now first-class: symmetric layout roles
    (defExo), curveAdjacent support (new default c('<->','--')), and a
    semSyntax guard
  o NEW: lavaan efa() output (efaList) can be plotted; select solutions with
    the 'which' argument
  o lavaan composites ('<~') import as directed edges into the composite and
    re-emit as '<~' in semSyntax (previously drawn as undirected placeholder
    edges)
  o Multilevel lavaan models (cluster=) now map level 1/2 onto Within/Between
    panels instead of silently conflating both levels in one diagram

  o The lavaan importer aligns parameterEstimates() with parTable() by key
    matching (robust across lavaan versions) and uses the maintained
    parTable()/lavNames() accessors
  o Combining models with '+' uses column-union binding, so models from
    different importers (e.g. lavaan + lm) can be combined

Changes in Version 1.1.8
  o Fixed DoNotPlot = TRUE causing an error in multigroup models (#50)
  o Fixed multigroup models with different variables per group crashing due to dimnames mismatch (#38)
  o Fixed logistic regression and other non-gaussian GLMs crashing due to standardize() (#43)
  o Fixed OpenMx models crashing with "replacement has length zero" for M matrix standardization (#35)
  o Fixed layoutSplit causing "logical subscript too long" error (#15)
  o Covariance matrices from lavaan now use lavTech with add.labels=TRUE for proper per-group naming

Changes in Version 1.1.5
  o Small change to a link used in an example

Changes in Version 1.1.4
  o Fixed issues with new lavaan version
  o Small fix for CRAN

Changes in Version 1.1.3
  o the 'ramModel' function now supports meanstructure with the 'M' argument.
  o Fixed an issue with lavaan

Changes in Version 1.1.1
  o regsem and cv_regsem support added, thanks to Myrthe Veenman and Jason Nak!

Changes in Version 1.1
  o Fixed a bug with lavaan input
  o Fixed a bug with OpenMx 2 input
  o The 'mplusStd' argument of semPlotModel can now be used to specify standardization of mplus models
  o Fixed a bug related to model constraints
  o Several updates to accomidate new CRAN checks

Changes in Version 1.0.1
  o Fixed a dependency related bug causing examples to crash.

Changes in Version 1.0.0

New features:
    o Added the argument 'curveAdjacent' to also curve the covariances between two adjacent nodes as curved edges.
    o A frequently asked question is how to decrease the font size of edge labels. This can be done via the 'edge.label.cex' argument of the qgraph backend. But because this was not clear the argument now has been added to semPaths as well. The default is slightly smaller than the original qgraph default: 0.6 versus 1.
    o Added the argument 'cardinal' that controls which edges will be linked to cardinal sides of a node. With this argument the behavior of many path diagram drawing programs can be mirrored. 
    o Added the 'equalizeManifests' argument to equalize the spacing between manifest variables in the 'tree1' layout.
    o Added the 'covAtResiduals' argument that controls if covariances should be linked to residuals rather than nodes themselves if style="lisrel"
    o Added the 'bifactor' argument to create bifactor layouts. Only supported with layouts 'tree2', 'tree3', 'circle2' and 'circle3'.
   o optimizeLatRes has been improved
   o Added 'optimizePoints' arguments that can be given a vector of radians residuals can optimize to if optimizeLatRes = TRUE.

Changes:
    o The argument curvePivot now defaults to FALSE, causing covariances by default to once again be drawn by circular curved edges.
    o A list of usefull qgraph arguments that can be used in semPaths is now listed in the semPaths help page.
    o 'mixCols' renamed to 'inheritColor'
    o The color argument can now be assined a list for assignng specific colors to all manifests, latents or intercepts
    o Some improvements to 'semCors'


Bug fixes:
    o Fixed a bug where using style='lisrel' did not correctly curve covariances between latents.
    o Fixed a bug where 'layoutSplit' resulted in a crash if there were only two connections in the structural model and "spring" layout was used.


Changes in Version 0.3.3
    o Lavaan model syntax is now supported as input
    o Numeric edge labels without using whatLabels argument are now correctly abbreviated
    o Several small fixes

Changes in Version 0.3.2
  o New features
    o Matrix model functionality:
      o Added 'semMatrixAlgebra' to easily perform matrix algebra on any semPlot input object.
      o Added 'modelMatrices' to obtain model matrices of LISREL, Mplus and RAM modeling frameworks of any input to semPlot.
      o Added 'exoVar' and 'exoCov' arguments that can be used to not display variances or covariances of truly exogenous variables (no incoming directed edges)
  o Added 'tree3' and 'circle3' layouts, based on Boker, S. M., McArdle, J. J., & Neale, M. (2002). An algorithm for the hierarchical organization of path diagrams and calculation of components of expected covariance. Structural Equation Modeling, 9(2), 174-194.

  o Major changes
    o Added edgeLabels and nodeLabels arguments to manually overwrite edge and node labels, in the order they appear in the RAM and Vars elements of the 'semPlotModel' that is created internally. In addition to the qgraph change that these can now be assigned lists including expressions it should now be easier to add Greek letters.
    o  MplusAutomation is no longer imported but moved to suggests list. This makes sure that the Tcl/Tk interface is not loaded on loading semPlot and as a result makes sure that semPlot does not result in crashes on Mac computers where Tcl/Tk is not installed.
    o 'style' now defaults to "lisrel" if the input is a Lisrel model.
    o 'style="lisrel"' will now default exoVar to FALSE.
    o Changed the name of slot RAM to Pars in semPlotModel class.
    o Two-level multilevel structures is now supported
      o Currently this works for Mplus input only.
      o Only random intercepts are supported, not random slopes.
      o Thresholds are shown on the within level rather than the between level.

  o New arguments to semPaths:
    o Added argument thresholdSize to control the size of threshold bars
    o Added 'levels' argument. This argument can be used to control the spacing between levels (e.g., exogenous latents) of tree and circle layouts.
    o Added nDigits argument to control the number of digits used in rounding for labels.
    o Added 'centerLevels' argument for tree2 layout, to center horizontal levels.
    o Added 'panelGroups' argument to automatically create a panel plot of multiple group models.
    o The 'layoutSplit' argument can be used to split computing of layout between structural and measurment models. This is very useful in more complicated models where the structural part is best shown by using a spring layout.
    o Added the 'intAtSide' argument to control if intercepts should be plotted to the side of manifest nodes or at the bottom/top. Defaults only to FALSE if 'residuals=FALSE'.
    o Added 'nDigits' argument to control rounding of numeric values.

  o Minor changes
    o Thresholds are now plotted via qgraph
    o Changed argument threshold.color to thresholdColor
    o 'qgraph' is no longer on the depends list but imported instead.
    o 'as.expression' now defaults to "edges" if the input is a lisrel model. 
    o 'semPlotModel' for lisrel modes can now use dots to send arguments to 'lisrelModel'
    o Added 'reduce' argument to lisrelModel that controls if variables that are named the same should be treated as the same variable.
    o Shape, width and height of manifest, latent and constant variables can now be set.
    o Mplus input now supports the | operator.

  o Bug fixes
    o Fixed a bug where numeric labels where abbreviated, causing erratic behavior on the labels.
    o Fixed a bug where models with single indicator latent variables caused an error.
    o Numerous small bugfixes and improvements
    o Fixed a bug where variable names in mplux models containing BY, WITH or ON caused unexpected behavior.
    o Assigning a matrix to the layout argument of semPaths will no longer cause a bunch or warnings.


Changes in Version 0.3
  o First submit to CRAN.
